ZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvLmNsYXNzcGF0aCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwMTA1My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS8uY3ZzaWdub3JlIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE2OTFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1kb2MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlLy5vcHRpb25zIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1NWVkYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotb3JnLmVjbGlwc2UucHRwLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFByb3h5IHByb3RvY29sIHRyYWNpbmcKLW9yZy5lY2xpcHNlLnB0cC5jb3JlL2RlYnVnL3Byb3h5L3Byb3RvY29sL3RyYWNpbmc9dHJ1ZQotCi0jIFByb3h5IGNsaWVudCBkZWJ1Z2dpbmcgbWVzc2FnZXMKLW9yZy5lY2xpcHNlLnB0cC5jb3JlL2RlYnVnL3Byb3h5L2NsaWVudC90cmFjaW5nPXRydWUKLQotIyBQcm94eSBzZXJ2ZXIgZGVidWdnaW5nIG1lc3NhZ2VzCi0jIExldmVsIDAgaXMgb2ZmCi0jIExldmVsID4wIGlzIG9uLiBIaWdoZXIgbGV2ZWxzIG1lYW4gbW9yZSBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLnB0cC5jb3JlL2RlYnVnL3Byb3h5L3NlcnZlci9kZWJ1Z19sZXZlbD0xCi0KLSMgUmVzb3VyY2UgbWFuYWdlciBkZWJ1Z2dpbmcgbWVzc2FnZXMKLW9yZy5lY2xpcHNlLnB0cC5jb3JlL2RlYnVnL3JtL3RyYWNpbmc9dHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS8ucHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMWI2ZDQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTExNWYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEFwciAxMiAwOToyMjozMCBNRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxMDRlOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scywKLSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cywKLSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cywKLSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMsCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycywKLSBvcmcuZWNsaXBzZS5wdHAuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0sCi0gb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLAotIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wsCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2Fib3V0Lmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2Fib3V0LmluaSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY3NjJhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmMDgxZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTkxTX01FU1NBR0VGT1JNQVRfTk9ORQotIyBOTFNfRU5DT0RJTkc9VVRGLTgKLQotYmx1cmI9UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLUNvcHlyaWdodCAoYykgMjAwNSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMzYjI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcDQotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXA0KLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcNCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2VjbGlwc2UzMi5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWZlZWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0jIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0jIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0jIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSMgCi0jIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBMQS1DQyAwNC0xMTUKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgQ2xlbWVudCBDaHUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCi0KLWZyYWdtZW50TmFtZS5haXgucHBjPVBUUCBBSVggUFBDIEZyYWdtZW50Ci1mcmFnbWVudE5hbWUubGludXgucHBjPVBUUCBMaW51eCBQUEMgRnJhZ21lbnQKLWZyYWdtZW50TmFtZS5saW51eC54ODY9UFRQIExpbnV4IHg4NiBGcmFnbWVudAotZnJhZ21lbnROYW1lLmxpbnV4Lng4Nl82ND1QVFAgTGludXggeDg2XzY0IEZyYWdtZW50Ci1mcmFnbWVudE5hbWUubWFjb3N4LnBwYz1QVFAgTWFjT1MgWCBQUEMgRnJhZ21lbnQKLWZyYWdtZW50TmFtZS5tYWNvc3gueDg2PVBUUCBNYWNPUyBYIHg4NiBGcmFnbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvcGx1Z2luLnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ODE3NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VNYW5hZ2VycyIgbmFtZT0iUmVzb3VyY2UgTWFuYWdlcnMiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlTWFuYWdlcnMuZXhzZCIvPgotCi0JCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NjaGVtYS9yZXNvdXJjZU1hbmFnZXJzLmV4c2QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NjaGVtYS9yZXNvdXJjZU1hbmFnZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTU3YzYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zY2hlbWEvcmVzb3VyY2VNYW5hZ2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIgaWQ9InJlc291cmNlTWFuYWdlcnMiIG5hbWU9IlBUUCBSZXNvdXJjZSBNYW5hZ2VycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgcGx1Zy1pbnMgdG8gY29udHJpYnV0ZSBhIHJlc291cmNlIG1hbmFnZXIgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBvZiBhIHJlc291cmNlIG1hbmFnZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc291cmNlTWFuYWdlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvSURHZW5lcmF0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL0lER2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Yzg0ZjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvSURHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZTsKLQotcHVibGljIGNsYXNzIElER2VuZXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBpbnQgY3VycmVudF9JRCA9IDE7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TmV3SUQoKSB7Ci0JCXJldHVybiBjdXJyZW50X0lEKys7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvSU1vZGVsTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvSU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2IwOWE3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL0lNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBVbml2ZXJzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTWFuYWdlciBleHRlbmRzIElNb2RlbFByZXNlbnRhdGlvbiB7Ci0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgZm9yIG1vZGVsIG1hbmFnZXIgY2hpbGRyZW4gZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBBZGQgYSByZXNvdXJjZSBtYW5hZ2VyIHRvIHRoZSBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRkZWRNYW5hZ2VyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNYW5hZ2VyKElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGFkZGVkTWFuYWdlcik7Ci0KLQkvKioKLQkgKiBBZGQgcmVzb3VyY2UgbWFuYWdlcnMgdG8gdGhlIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBhZGRlZE1hbmFnZXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNYW5hZ2VycyhJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIGFkZGVkTWFuYWdlcnMpOwotCQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgbWFuYWdlciBmYWN0b3JpZXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB2aWEKLQkgKiBleHRlbnNpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgcmVzb3VyY2UgbWFuYWdlciBmYWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckZhY3RvcnlbXSBnZXRSZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMoKTsKLQkKLQkvKioKLQkgKiBGaW5kIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZhY3RvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcGxpZWQgSUQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIG1hbmFnZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZU1hbmFnZXJGYWN0b3J5KFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHdpdGggdGhlIHN1cHBsaWVkIHVuaXF1ZSBuYW1lCi0JICogCi0JICogQHBhcmFtIHJtVW5pcXVlTmFtZQotCSAqIEByZXR1cm4gcmVzb3VyY2UgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlckZyb21VbmlxdWVOYW1lKFN0cmluZyBybVVuaXF1ZU5hbWUpOwotCi0JLyoqCi0JICogRmluZCByZXNvdXJjZSBtYW5hZ2VycyB0aGF0IGhhdmUgYmVlbiBzdGFydGVkCi0JICogCi0JICogQHBhcmFtIHVuaXZlcnNlCi0JICogQHJldHVybiBhcnJheSBvZiByZXNvdXJjZSBtYW5hZ2VycwotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyW10gZ2V0U3RhcnRlZFJlc291cmNlTWFuYWdlcnMoSVBVbml2ZXJzZSB1bml2ZXJzZSk7Ci0KLQkvKioKLQkgKiBMb2FkcyBzYXZlZCByZXNvdXJjZSBtYW5hZ2Vycy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2VNYW5hZ2VycygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlbW92ZSBsaXN0ZW5lciBmb3IgbW9kZWwgbWFuYWdlciBjaGlsZCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIFJlbW92ZSBhIHJlc291cmNlIG1hbmFnZXIgZnJvbSB0aGUgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIHJlbW92ZWRNYW5hZ2VyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VNYW5hZ2VyKElSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJlbW92ZWRNYW5hZ2VyKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgcmVzb3VyY2UgbWFuYWdlcnMgZnJvbSB0aGUgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIHJlbW92ZWRSTXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1hbmFnZXJzKElSZXNvdXJjZU1hbmFnZXJDb250cm9sW10gcmVtb3ZlZFJNcyk7Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVSZXNvdXJjZU1hbmFnZXJzKCk7Ci0KLQkvKioKLQkgKiBTaHV0cyBkb3duIHRoZSBtb2RlbCBtYW5hZ2VyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYXQgcGx1Z2luIHNodXRkb3duLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdGFydCB0aGUgbW9kZWwgbWFuYWdlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgYXQgcGx1Z2luIHN0YXJ0dXAuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIHN0b3BzIGFsbCBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlcnMuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFJlc291cmNlTWFuYWdlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9JTW9kZWxQcmVzZW50YXRpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL0lNb2RlbFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzJiMjg4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL0lNb2RlbFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBVbml2ZXJzZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJzcXJkCi0gKi8KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcmVzZW50YXRpb24gewotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBVbml2ZXJzZSBnZXRVbml2ZXJzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL0lQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9JUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODBmNDRiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL0lQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCS8qKgotCSAqIFBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBUUF9MQVVOQ0hDT05GSUdVUkVUWVBFX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucGFyYWxsZWxMYXVuY2giOwotCi0JLyoqCi0JICogVW5pcXVlIHN0cmluZyBmb3IgbGF1bmNoIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVFBfTEFVTkNIX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5sYXVuY2giOwotCQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB2YWx1ZS4gVGhlIGtleSBpcwotCSAqIEFUVFJfREVCVUdHRVJfU1RPUF9BVF9NQUlOLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR0dFUl9TVE9QX0FUX01BSU5fREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgdmFsdWUuIFRoZSBrZXkgaXMKLQkgKiBBVFRSX0RFQlVHR0VSX1NUQVJUX01PREUuIFN0YXJ0dXAgZGVidWdnZXIgcnVubmluZyB0aGUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR0dFUl9NT0RFX1JVTiA9ICJydW4iOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIHZhbHVlLiBUaGUga2V5IGlzCi0JICogQVRUUl9ERUJVR0dFUl9TVEFSVF9NT0RFLiBTdGFydHVwIGRlYnVnZ2VyIGFuZCBhdHRhY2ggdG8gcnVubmluZyBwcm9jZXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHR0VSX01PREVfQVRUQUNIID0gImF0dGFjaCI7Ci0KLQkvKioKLQkgKiBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUga2V5LiBUaGUgdmFsdWVzIGlzIHRoZSBzZWxlY3RlZAotCSAqIHJlc291cmNlIG1hbmFnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRVNPVVJDRV9NQU5BR0VSX1VOSVFVRU5BTUUgPSBQVFBfTEFVTkNIX0lEICsgIi5SRVNPVVJDRV9NQU5BR0VSX05BTUUiOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBzZWxlY3RlZCBxdWV1ZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9RVUVVRV9OQU1FID0gUFRQX0xBVU5DSF9JRCArICIuUVVFVUVfTkFNRSI7Ci0JCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBwcm9qZWN0IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9KRUNUX05BTUUgPSBQVFBfTEFVTkNIX0lEICsgIi5QUk9KRUNUX0FUVFIiOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBhcHBsaWNhdGlvbiAoZXhlY3V0YWJsZSkgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVBQTElDQVRJT05fTkFNRSA9IFBUUF9MQVVOQ0hfSUQgKyAiLkFQUExJQ0FUSU9OX05BTUUiOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBwbGF0Zm9ybSBzdHJpbmcgb2YKLQkgKiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BMQVRGT1JNID0gUFRQX0xBVU5DSF9JRCArICIuUExBVEZGT1JNIjsKLQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBrZXkuIFRoZSB2YWx1ZSBpcyB0cnVlIGlmIHRoZSBkZWJ1Z2dlcgotCSAqIHNob3VsZCBzdG9wIGluIG1haW4oKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NUT1BfSU5fTUFJTiA9IFBUUF9MQVVOQ0hfSUQgKyAiLlNUT1BfSU5fTUFJTiI7Ci0KLQkvKioKLQkgKiBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUga2V5LiBUaGUgdmFsdWUgaXMgdGhlIElEIG9mIHRoZSBkZWJ1Z2dlciB1c2VkIGluIGxhdW5jaAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVCVUdHRVJfSUQgPSBQVFBfTEFVTkNIX0lEICsgIi5ERUJVR0dFUl9JRCI7Ci0KLQkvKioKLQkgKiBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUga2V5LiBUaGUgdmFsdWUgaXMgdGhlIHByb2dyYW0gYXJndW1lbnRzIHRoYXQKLQkgKiBoYXZlIGJlZW4gc3VwcGxpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUkdVTUVOVFMgPSBQVFBfTEFVTkNIX0lEICsgIi5BUkdVTUVOVF9BVFRSIjsKLQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBrZXkuIFRoZSB2YWx1ZSBpcyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9XT1JLX0RJUkVDVE9SWSA9IFBUUF9MQVVOQ0hfSUQgKyAiLldPUktfRElSRUNUT1JZX0FUVFIiOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBwbGF0Zm9ybSBzdHJpbmcgb2YKLQkgKiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFQlVHR0VSX1NQRUNJRklDX0FUVFJTX01BUCA9IFBUUF9MQVVOQ0hfSUQgKyAiLkRFQlVHR0VSX1NQRUNJRklDX0FUVFJTX01BUCI7Ci0JCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIGEgZ2xvYmFsIHZhcmlhYmxlcycKLQkgKiBtZW1lbnRvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVCVUdHRVJfR0xPQkFMX1ZBUklBQkxFUyA9IFBUUF9MQVVOQ0hfSUQgKyAiLkdMT0JBTF9WQVJJQUJMRVMiOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBzdGFydHVwIG1vZGUgZm9yIHRoZQotCSAqIGRlYnVnZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVCVUdHRVJfU1RBUlRfTU9ERSA9IFBUUF9MQVVOQ0hfSUQgKyAiLkRFQlVHR0VSX1NUQVJUX01PREUiOwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZQotCSAqIGJlaW5nIGRlYnVnZ2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVCVUdHRVJfRVhFQ1VUQUJMRV9QQVRIID0gUFRQX0xBVU5DSF9JRCArICIuREVCVUdHRVJfRVhFQ1VUQUJMRV9QQVRIIjsKLQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBrZXkuIFRoZSB2YWx1ZSBpcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZnJvbQotCSAqIHdoaWNoIHRvIHJ1biB0aGUgZGVidWdnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUJVR0dFUl9XT1JLSU5HX0RJUiA9IFBUUF9MQVVOQ0hfSUQgKyAiLkRFQlVHR0VSX1dPUktJTkdfRElSIjsKLQotCS8qKgotCSAqIFRPRE86IFBsZWFzZSBkb2N1bWVudCB3aGF0IHRoaXMgaXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFQlVHR0VSX01FTU9SWV9CTE9DS1MgPSBQVFBfTEFVTkNIX0lEICsgIi5NRU1PUllfQkxPQ0tTIjsKLQkKLQkvKioKLQkgKiBUT0RPOiBQbGVhc2UgZG9jdW1lbnQgd2hhdCB0aGlzIGlzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUJVR0dFUl9SRUdJU1RFUl9HUk9VUFMgPSBQVFBfTEFVTkNIX0lEICsgIi5ERUJVR0dFUl9SRUdJU1RFUl9HUk9VUFMiOwotCQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBrZXkuIFRoZSB2YWx1ZSBpcyBhIGJvb2xlYW4gdGhhdCBzdGF0ZXMgaWYgdGhlIGV4ZWN1dGFibGUgd2lsbCBiZSBjb3BpZWQgCi0JICogZnJvbSB0aGUgbG9jYWwgbWFjaGluZSB0byB0aGUgcmVtb3RlIG1hY2hpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT1BZX0VYRUNVVEFCTEUgPSBQVFBfTEFVTkNIX0lEICsgIi5BVFRSX0NPUFlfRVhFQ1VUQUJMRV9GUk9NX0xPQ0FMIjsKLQkKLQkvKioKLQkgKiBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUga2V5LiBUaGUgdmFsdWUgaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgdGhhdCB3aWxsIGJlIGNvcGllZAotCSAqIHRvIHRoZSByZW1vdGUgbWFjaGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xPQ0FMX0VYRUNVVEFCTEVfUEFUSCA9IFBUUF9MQVVOQ0hfSUQgKyAiLkFUVFJfTE9DQUxfRVhFQ1VUQUJMRV9QQVRIIjsKLQkKLQkvKioKLQkgKiAgTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIHRoYXQKLQkgKiAgaXMgdG8gYmUgbGF1bmNoZWQuIElmIHRoZSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQgb24gYSByZW1vdGUgbWFjaGluZSwgaXQgaXMgdGhlIHBhdGggdG8gdGhlCi0JICogIGV4ZWN1dGFibGUgb24gdGhpcyBtYWNoaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRVhFQ1VUQUJMRV9QQVRIID0gUFRQX0xBVU5DSF9JRCArICIuQVRUUl9SRU1PVEVfRVhFQ1VUQUJMRV9QQVRIIjsKLQotCS8qKgotCSAqICBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUga2V5LiBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdGhhdCB3aWxsIGJlIGNvbnRhY3RlZAotCSAqICBieSB0aGUgZGVidWcgc2VydmVyIHdoZW4gaXQgc3RhcnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVCVUdHRVJfSE9TVCA9IFBUUF9MQVVOQ0hfSUQgKyAiLkFUVFJfREVCVUdHRVJfSE9TVCI7Ci0KLQkvKioKLQkgKiAgTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIGEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcKLQkgKiAgaWYgb3V0cHV0IGZyb20gYWxsIHByb2Nlc3NlcyBzaG91bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb25zb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09OU09MRSA9IFBUUF9MQVVOQ0hfSUQgKyAiLkFUVFJfQ09OU09MRSI7Ci0KLQkvKioKLQkgKiBFcnJvciBjb2RlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUl9QUk9HUkFNX05PVF9FWElTVCA9IDEwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJfUFJPR1JBTV9OT1RfQklOQVJZID0gMTA3OwotCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGtleS4gVGhlIHZhbHVlIGlzIGEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcKLQkgKiBpZiBmaWxlIHN5bmNocm9uaXphdGlvbiB3aWxsIG9jY3VyIGFmdGVyIHRoZSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWU5DX0FGVEVSID0gUFRQX0xBVU5DSF9JRCArICIuQVRUUl9TWU5DX0FGVEVSIjsKLQkKLQkvKioKLQkgKiBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUga2V5LiBUaGUgdmFsdWUgaXMgYSBib29sZWFuIGZsYWcgaW5kaWNhdGluZwotCSAqIGlmIGZpbGUgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgYmVmb3JlIHRoZSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWU5DX0JFRk9SRSA9IFBUUF9MQVVOQ0hfSUQgKyAiLkFUVFJfU1lOQ19CRUZPUkUiOwotCQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBrZXkuIFRoZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgcnVsZXMgb2YgCi0JICogc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1lOQ19SVUxFUyA9IFBUUF9MQVVOQ0hfSUQgKyAiLkFUVFJfU1lOQ19SVUxFUyI7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9QVFBDb3JlUGx1Z2luLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9QVFBDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTYyNDguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvUFRQQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLk1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgUFRQQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5jb3JlIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUFRQQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQVFBDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdAotCSAqIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIGEgdW5pcXVlIGlkZW50aWZpZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHVuaXF1ZSBpZGVudGlmaWVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkZW50aWZpZXIoKSB7Ci0JCWlmIChnZXREZWZhdWx0KCkgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IHlldCBpbml0aWFsaXplZCwKLQkJCS8vIHJldHVybiBhIHN0YXRpYyBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgbXVzdAotCQkJLy8gbWF0Y2ggdGhlIHBsdWdpbiBpZCBkZWZpbmVkIGluIHBsdWdpbi54bWwKLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYW4gSVN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCWlmIChEZWJ1Z1V0aWwuUk1fVFJBQ0lORykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCX0KLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBUaHJvd2FibGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCAiSW50ZXJuYWwgRXJyb3IiLCBlKSk7Ci0JfQotCi0JLyoKLQkgKiBSZXNvdXJjZSBidW5kbGUKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCS8qCi0JICogTW9kZWxNYW5hZ2VyIGZvciB0aGlzIEVjbGlwc2Ugc2Vzc2lvbgotCSAqLwotCXByaXZhdGUgTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFBUUENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShQTFVHSU5fSUQKLQkJCQkJKyAiLlBhcmFsbGVsUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtb2RlbCBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kZWwgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwcmVzZW50YXRpb24gbWFuYWdlci4gVGhpcyBpcyBub3cgdGhlIG1vZGVsIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlc2VudGF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSU1vZGVsUHJlc2VudGF0aW9uIGdldE1vZGVsUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgdW5pdmVyc2UKLQkgKiBAcmV0dXJuIHRoZSB1bml2ZXJzZQotCSAqLwotCXB1YmxpYyBJUFVuaXZlcnNlIGdldFVuaXZlcnNlKCkgewotCQlyZXR1cm4gZ2V0TW9kZWxQcmVzZW50YXRpb24oKS5nZXRVbml2ZXJzZSgpOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZSB0aGUgZnJhZ21lbnQgZm9yIG91ciBhcmNoaXRlY3R1cmUuIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBwaGFzZWQgb3V0LCBzaW5jZQotCSAqIHRoZXJlIGlzIG5vdyBubyBndWFyYW50ZWUgdGhhdCB0aGVyZSB3aWxsIGJlIGxvY2FsIGV4ZWN1dGFibGVzIGZvciB0aGUgcHJveHkKLQkgKiBzZXJ2ZXIgb3IgZGVidWdnZXIuCi0JICogCi0JICogQHBhcmFtIGZyYWdtZW50Ci0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIHBhdGggdG8gImJpbiIgZGlyZWN0b3J5IGluIGZyYWdtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBsb2NhdGVGcmFnbWVudEZpbGUoU3RyaW5nIGZyYWdtZW50LCBTdHJpbmcgZmlsZSkgewkJCi0JCUJ1bmRsZVtdIGZyYWdzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKFBsYXRmb3JtLmdldEJ1bmRsZShQVFBDb3JlUGx1Z2luLlBMVUdJTl9JRCkpOwotCQkKLQkJaWYgKGZyYWdzICE9IG51bGwpIHsKLQkJCVN0cmluZyBvcyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCQlTdHJpbmcgYXJjaCA9IFBsYXRmb3JtLmdldE9TQXJjaCgpOwotCQkJU3RyaW5nIGZyYWdfb3NfYXJjaCA9IGZyYWdtZW50KyIuIitvcysiLiIrYXJjaDsKLQkJCQotCQkJZm9yIChpbnQgaT0wOyBpPGZyYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlIGZyYWcgPSBmcmFnc1tpXTsKLQkJCQlVUkwgcGF0aCA9IGZyYWcuZ2V0RW50cnkoIi8iKTsKLQkJCQl0cnkgewotCQkJCQlVUkwgbG9jYWxfcGF0aCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChwYXRoKTsKLQkJCQkJU3RyaW5nIHN0cl9wYXRoID0gbG9jYWxfcGF0aC5nZXRQYXRoKCk7Ci0JCQkJCQotCQkJCQkvKiAKLQkJCQkJICogQ2hlY2sgZWFjaCBmcmFnbWVudCB0aGF0IG1hdGNoZXMgb3VyIG9zIGFuZCBhcmNoIGZvciBhIGJpbiBkaXJlY3RvcnkuCi0JCQkJCSAqLwotCQotCQkJCQlpbnQgaWR4ID0gc3RyX3BhdGguaW5kZXhPZihmcmFnX29zX2FyY2gpOwotCQkJCQlpZiAoaWR4ID4gMCkgewotCQkJCQkJLyogZm91bmQgaXQhICBUaGlzIGlzIHRoZSByaWdodCBmcmFnbWVudCBmb3Igb3VyIE9TICYgYXJjaCAqLwotCQkJCQkJU3RyaW5nIGZpbGVfcGF0aCA9IHN0cl9wYXRoICsgImJpbi8iK2ZpbGU7Ci0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlX3BhdGgpOwotCQkJCQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCQkJCQlyZXR1cm4gZmlsZV9wYXRoOwotCQkJCQkJfQotCQkJCQl9Ci0JCi0JCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIGd1ZXNzIHdlIG5ldmVyIGZvdW5kIGl0Li4uLiAqLwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCURlYnVnVXRpbC5jb25maWd1cmVQbHVnaW5EZWJ1Z09wdGlvbnMoKTsKLQkJbW9kZWxNYW5hZ2VyID0gbmV3IE1vZGVsTWFuYWdlcigpOwotCQltb2RlbE1hbmFnZXIuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQltb2RlbE1hbmFnZXIuc2h1dGRvd24oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjJkNTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9ST09UX0lEID0gIlJvb3QiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9ESVIgPSAiT1VUUFVUX0RJUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfTElORSA9ICJTVE9SRV9MSU5FIjsKLQlwdWJsaWMgaW50IERFRl9TVE9SRV9MSU5FID0gMTAwOwotCXB1YmxpYyBTdHJpbmcgREVGX09VVFBVVF9ESVJfTkFNRSA9ICJvdXRwdXQiOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BYnN0cmFjdEF0dHJpYnV0ZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BYnN0cmFjdEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWE2MGM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQWJzdHJhY3RBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXR0cmlidXRlPFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBleHRlbmRzIEFic3RyYWN0QXR0cmlidXRlPFQsQSxEPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEIGV4dGVuZHMgSUF0dHJpYnV0ZURlZmluaXRpb248VCxBLEQ+PgotaW1wbGVtZW50cyBJQXR0cmlidXRlPFQsQSxEPiB7Ci0KLQlwcml2YXRlIGZpbmFsIEQgZGVmaW5pdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQotCXB1YmxpYyBBYnN0cmFjdEF0dHJpYnV0ZShEIGRlZmluaXRpb24pIHsKLQkJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkJdGhpcy5lbmFibGVkID0gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oQSBvdGhlcikgewotICAgICAgICBpbnQgcmVzdWx0cyA9IGdldERlZmluaXRpb24oKS5jb21wYXJlVG8ob3RoZXIuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgaWYgKHJlc3VsdHMgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb3RoZXIuZ2V0Q2xhc3MoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGhhc2hDb2RlMSA9IGdldENsYXNzKCkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBoYXNoQ29kZTIgPSBvdGhlci5nZXRDbGFzcygpLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaENvZGUxIDwgaGFzaENvZGUyID8gLTEgOiAoaGFzaENvZGUxID4gaGFzaENvZGUyID8gMSA6IDApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBkb0NvbXBhcmVUbyA9IGRvQ29tcGFyZVRvKG90aGVyKTsKLSAgICAgICAgcmV0dXJuIGRvQ29tcGFyZVRvOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZpbmFsIEEgb3RoZXIgPSAoQSkgb2JqOwotICAgICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob3RoZXIuZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghZGVmaW5pdGlvbi5lcXVhbHMob3RoZXIuZGVmaW5pdGlvbikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gZG9FcXVhbHMgPSBkb0VxdWFscyhvdGhlcik7Ci0gICAgICAgIGlmICghZG9FcXVhbHMpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNnZXREZWZpbml0aW9uKCkKLQkgKi8KLQlwdWJsaWMgRCBnZXREZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDE7Ci0gICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0Ci0gICAgICAgICAgICAgICAgKyAoKGRlZmluaXRpb24gPT0gbnVsbCkgPyAwIDogZGVmaW5pdGlvbi5oYXNoQ29kZSgpKTsKLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBkb0hhc2hDb2RlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0gICAgLyoqCi0JICogQHBhcmFtIGVuYWJsZWQgdGhlIGVuYWJsZWQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLSAgICAgKiBAcGFyYW0gb3RoZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBkb0NvbXBhcmVUbyhBIG90aGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdGhlcgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBkb0VxdWFscyhBIG90aGVyKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBkb0hhc2hDb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0Fic3RyYWN0QXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNzRlZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0Fic3RyYWN0QXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBdHRyaWJ1dGVEZWZpbml0aW9uPFQsCi0JCQkJCQkJCQkJCQkgIEEgZXh0ZW5kcyBJQXR0cmlidXRlPFQsQSxEPiwKLQkJCQkJCQkJCQkJCSAgRCBleHRlbmRzIEFic3RyYWN0QXR0cmlidXRlRGVmaW5pdGlvbjxULEEsRD4+Ci1pbXBsZW1lbnRzIElBdHRyaWJ1dGVEZWZpbml0aW9uPFQsQSxEPiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB1bmlxdWVJZDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGlzcGxheTsKLQkKLQlwdWJsaWMgQWJzdHJhY3RBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSkgewotCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhcmcwKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvKGFyZzAuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCWZpbmFsIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBEIG90aGVyID0gKEQpIG9iajsKLQkJaWYgKHVuaXF1ZUlkID09IG51bGwpIHsKLQkJCWlmIChvdGhlci51bmlxdWVJZCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghdW5pcXVlSWQuZXF1YWxzKG90aGVyLnVuaXF1ZUlkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uI2dldERpc3BsYXkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gdW5pcXVlSWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCUBPdmVycmlkZQotCWZpbmFsIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKwotCQkJCSgodW5pcXVlSWQgPT0gbnVsbCkgPyAwIDogdW5pcXVlSWQuaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BcnJheUF0dHJpYnV0ZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BcnJheUF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDVkNmU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQXJyYXlBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlBdHRyaWJ1dGU8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gZXh0ZW5kcwotCQlBYnN0cmFjdEF0dHJpYnV0ZTxMaXN0PD8gZXh0ZW5kcyBUPiwgQXJyYXlBdHRyaWJ1dGU8VD4sIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxUPj4gewotCi0JcHJpdmF0ZSBMaXN0PFQ+IHZhbHVlOwotCi0JcHVibGljIDxVIGV4dGVuZHMgVD4gQXJyYXlBdHRyaWJ1dGUoQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFQ+IGRlZmluaXRpb24sIExpc3Q8VT4gaW5pdGlhbFZhbHVlKSB7Ci0JCXN1cGVyKGRlZmluaXRpb24pOwotCQlzZXRWYWx1ZShpbml0aWFsVmFsdWUpOwotCX0KLQotCXB1YmxpYyBBcnJheUF0dHJpYnV0ZShBcnJheUF0dHJpYnV0ZURlZmluaXRpb248VD4gZGVmaW5pdGlvbiwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmluaXRpb24pOwotCQlzZXRWYWx1ZUFzU3RyaW5nKGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHVibGljIDxVIGV4dGVuZHMgVD4gQXJyYXlBdHRyaWJ1dGUoQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFQ+IGRlZmluaXRpb24sIFVbXSBpbml0aWFsVmFsdWUpIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlKGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIDxVPgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgPFUgZXh0ZW5kcyBUPiB2b2lkIGFkZEFsbChVW10gdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMudmFsdWUuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSA8VT4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIDxVIGV4dGVuZHMgVD4gdm9pZCBhZGRBbGwoTGlzdDxVPiB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy52YWx1ZS5hZGRBbGwodmFsdWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8VD4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjZ2V0VmFsdWVBc1N0cmluZygpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZygpIHsKLQkJcmV0dXJuIEFycmF5cy50b1N0cmluZyh2YWx1ZS50b0FycmF5KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJCVQgb2JqID0gKFQpIHN0cmluZzsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoTGlzdDw/IGV4dGVuZHMgVD4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMudmFsdWUgPSBuZXcgQXJyYXlMaXN0PFQ+KHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmFsdWUgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gPFU+Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCA8VSBleHRlbmRzIFQ+IHZvaWQgc2V0VmFsdWUoVVtdIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnZhbHVlID0gQXJyYXlzLmFzTGlzdCgoVFtdKSB2YWx1ZS5jbG9uZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmFsdWUgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjc2V0VmFsdWVBc1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlQXNTdHJpbmcoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHN0cmluZy5zcGxpdCgiIik7Ci0JCXRyeSB7Ci0JCQlzZXRWYWx1ZSgoVFtdKSB2YWx1ZXMpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BYnN0cmFjdEF0dHJpYnV0ZSNkb0NvbXBhcmVUbyhvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkFic3RyYWN0QXR0cmlidXRlKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGRvQ29tcGFyZVRvKEFycmF5QXR0cmlidXRlPFQ+IG90aGVyKSB7Ci0JCS8vIFRoaXMgaXMgYSBsZXhpY29ncmFwaGljIGNvbXBhcmUuCi0KLQkJaW50IHJlc3VsdHMgPSAwOwotCQlJdGVyYXRvcjxUPiBpdDEgPSB2YWx1ZS5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxUPiBpdDIgPSBvdGhlci52YWx1ZS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQxLmhhc05leHQoKSAmJiBpdDIuaGFzTmV4dCgpKSB7Ci0JCQlUIG8xID0gaXQxLm5leHQoKTsKLQkJCVQgbzIgPSBpdDIubmV4dCgpOwotCQkJcmVzdWx0cyA9IG8xLmNvbXBhcmVUbyhvMik7Ci0JCQlpZiAocmVzdWx0cyAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCQl9Ci0JCX0KLQkJLy8gSWYgdGhleSBjb21wYXJlZCB0aGUgc2FtZSB1cCB0byBoZXJlCi0JCS8vIHRoZW4gdGhlIGxleGljb2dyYXBoaWMgY29tcGFyZSBpcyBiYXNlZAotCQkvLyBvbiB0aGVpciBzaXplcywgdGhlIHNob3J0ZXN0Ci0JCS8vIG9uZSBpcyBsZXNzIHRoYW4gdGhlIGxvbmdlciBvbmUuCi0JCXJldHVybiB2YWx1ZS5zaXplKCkgLSBvdGhlci52YWx1ZS5zaXplKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BYnN0cmFjdEF0dHJpYnV0ZSNkb0VxdWFscyhvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkFic3RyYWN0QXR0cmlidXRlKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkb0VxdWFscyhBcnJheUF0dHJpYnV0ZTxUPiBvdGhlcikgewotCQlyZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkFic3RyYWN0QXR0cmlidXRlI2RvSGFzaENvZGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGRvSGFzaENvZGUoKSB7Ci0JCXJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0FycmF5QXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY2NmFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248TGlzdDw/IGV4dGVuZHMgVD4sQXJyYXlBdHRyaWJ1dGU8VD4sQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFQ+PiB7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3Q8VD4gZGVmYXVsdFZhbHVlOwotCi0JcHVibGljIDxVIGV4dGVuZHMgVD4gQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgVVtdIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXkpOwotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdFZhbHVlID0gQXJyYXlzLmFzTGlzdCgoVFtdKWRlZmF1bHRWYWx1ZS5jbG9uZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdFZhbHVlID0gbmV3IEFycmF5TGlzdDxUPigpOwotCQl9Ci0JfQotCi0JcHVibGljIEFycmF5QXR0cmlidXRlPFQ+IGNyZWF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUF0dHJpYnV0ZTxUPih0aGlzLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXB1YmxpYyBBcnJheUF0dHJpYnV0ZTxUPiBjcmVhdGUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBBcnJheUF0dHJpYnV0ZTxUPih0aGlzLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIDxVIGV4dGVuZHMgVD4gQXJyYXlBdHRyaWJ1dGU8VD4gY3JlYXRlKFVbXSB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IEFycmF5QXR0cmlidXRlPFQ+KHRoaXMsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0F0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0F0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjY2ZTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4+IGF0dHJpYnV0ZURlZnMgPQotCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4+KCkpOwotCi0JcHVibGljIEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlZmluaXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZURlZmluaXRpb24oSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+IGF0dHJEZWYpIHsKLQkJc3luY2hyb25pemVkIChhdHRyaWJ1dGVEZWZzKSB7Ci0JCQlpZiAoIWF0dHJpYnV0ZURlZnMuY29udGFpbnNLZXkoYXR0ckRlZi5nZXRJZCgpKSkgewotCQkJCWF0dHJpYnV0ZURlZnMucHV0KGF0dHJEZWYuZ2V0SWQoKSwgYXR0ckRlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGF0dHJEZWZzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gYXR0ckRlZnMpIHsKLQkJZm9yIChJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4gYXR0ckRlZiA6IGF0dHJEZWZzKSB7Ci0JCQlzZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJEZWYpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvb2t1cCBhbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbgotCSAqIAotCSAqIEBwYXJhbSBhdHRySWQKLQkgKiBAcmV0dXJuIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICovCi0JcHVibGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PiBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uKFN0cmluZyBhdHRySWQpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZURlZnMuZ2V0KGF0dHJJZCk7Ci0JfQotCQotCS8qKgotCSAqIENsZWFyIGF0dHJpYnV0ZSBkZWZpbml0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlhdHRyaWJ1dGVEZWZzLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1bmlxdWVJZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLAotCQkJZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCBmaW5hbCBCaWdJbnRlZ2VyIGRlZmF1bHRWYWx1ZSkgCi0JCQl0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZGVmID0gbmV3IEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKHVuaXF1ZUlkLCBuYW1lLAotCQkJCWRlc2NyaXB0aW9uLCBkaXNwbGF5LCBkZWZhdWx0VmFsdWUpOwotCQlzZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1bmlxdWVJZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqIEBwYXJhbSBtaW4KLQkgKiBAcGFyYW0gbWF4Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGNyZWF0ZUJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwKLQkJCWZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgQmlnSW50ZWdlciBkZWZhdWx0VmFsdWUsCi0JCQlmaW5hbCBCaWdJbnRlZ2VyIG1pbiwgZmluYWwgQmlnSW50ZWdlciBtYXgpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYgPSBuZXcgQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24odW5pcXVlSWQsIG5hbWUsCi0JCQkJZGVzY3JpcHRpb24sIGRpc3BsYXksIGRlZmF1bHRWYWx1ZSwgbWluLCBtYXgpOwotCQlzZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBjcmVhdGVCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbihmaW5hbCBTdHJpbmcgdW5pcXVlSWQsCi0JCQlmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIGZpbmFsIEJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCUJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uIGRlZiA9IG5ldyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbih1bmlxdWVJZCwgbmFtZSwKLQkJCQlkZXNjcmlwdGlvbiwgZGlzcGxheSwgZGVmYXVsdFZhbHVlKTsKLQkJc2V0QXR0cmlidXRlRGVmaW5pdGlvbihkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdW5pcXVlSWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiBAcGFyYW0gb3V0cHV0RGF0ZUZvcm1hdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgRGF0ZSBkZWZhdWx0VmFsdWUsIGZpbmFsIERhdGVGb3JtYXQgb3V0cHV0RGF0ZUZvcm1hdCkgewotCQlEYXRlQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYgPSBuZXcgRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24odW5pcXVlSWQsIG5hbWUsIAotCQkJCWRlc2NyaXB0aW9uLCBkaXNwbGF5LCBkZWZhdWx0VmFsdWUsIG91dHB1dERhdGVGb3JtYXQpOwotCQlzZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1bmlxdWVJZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqIEBwYXJhbSBvdXRwdXREYXRlRm9ybWF0Ci0JICogQHBhcmFtIG1pbgotCSAqIEBwYXJhbSBtYXgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgRGF0ZSBkZWZhdWx0VmFsdWUsIGZpbmFsIERhdGVGb3JtYXQgb3V0cHV0RGF0ZUZvcm1hdCwgZmluYWwgRGF0ZSBtaW4sIGZpbmFsIERhdGUgbWF4KSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24gZGVmID0gbmV3IERhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKHVuaXF1ZUlkLCBuYW1lLCAKLQkJCQlkZXNjcmlwdGlvbiwgZGlzcGxheSwgZGVmYXVsdFZhbHVlLCBvdXRwdXREYXRlRm9ybWF0LCBtaW4sIG1heCk7Ci0JCXNldEF0dHJpYnV0ZURlZmluaXRpb24oZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdW5pcXVlSWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gCi0JICovCi0JcHVibGljIERvdWJsZUF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbihmaW5hbCBTdHJpbmcgdW5pcXVlSWQsIGZpbmFsIFN0cmluZyBuYW1lLCAKLQkJCWZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCBmaW5hbCBEb3VibGUgZGVmYXVsdFZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYgPSBuZXcgRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbih1bmlxdWVJZCwgbmFtZSwgCi0JCQkJZGVzY3JpcHRpb24sIGRpc3BsYXksIGRlZmF1bHRWYWx1ZSk7Ci0JCXNldEF0dHJpYnV0ZURlZmluaXRpb24oZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHBhcmFtIG1pbgotCSAqIEBwYXJhbSBtYXgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbiBjcmVhdGVEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsIAotCQkJZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIGZpbmFsIERvdWJsZSBkZWZhdWx0VmFsdWUsIGZpbmFsIERvdWJsZSBtaW4sIGZpbmFsIERvdWJsZSBtYXgpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uIGRlZiA9IG5ldyBEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uKHVuaXF1ZUlkLCBuYW1lLCAKLQkJCQlkZXNjcmlwdGlvbiwgZGlzcGxheSwgZGVmYXVsdFZhbHVlLCBtaW4sIG1heCk7Ci0JCXNldEF0dHJpYnV0ZURlZmluaXRpb24oZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gPEU+Ci0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPEU+IGNyZWF0ZUVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uKAotCQkJZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJZmluYWwgYm9vbGVhbiBkaXNwbGF5LCBmaW5hbCBFIGRlZmF1bHRWYWx1ZSkgewotCQlFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxFPiBkZWYgPSAKLQkJCW5ldyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxFPih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXksIGRlZmF1bHRWYWx1ZSk7Ci0JCXNldEF0dHJpYnV0ZURlZmluaXRpb24oZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBjcmVhdGVJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihmaW5hbCBTdHJpbmcgdW5pcXVlSWQsCi0JCQlmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIGZpbmFsIEludGVnZXIgZGVmYXVsdFZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZGVmID0gbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKHVuaXF1ZUlkLCBuYW1lLAotCQkJCWRlc2NyaXB0aW9uLCBkaXNwbGF5LCBkZWZhdWx0VmFsdWUpOwotCQlzZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHBhcmFtIG1pbgotCSAqIEBwYXJhbSBtYXgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLAotCQkJZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCAKLQkJCWZpbmFsIEludGVnZXIgZGVmYXVsdFZhbHVlLCBmaW5hbCBJbnRlZ2VyIG1pbiwgZmluYWwgSW50ZWdlciBtYXgpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24odW5pcXVlSWQsIG5hbWUsCi0JCQkJZGVzY3JpcHRpb24sIGRpc3BsYXksIGRlZmF1bHRWYWx1ZSwgbWluLCBtYXgpOwotCQlzZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGNyZWF0ZVN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGRlZiA9IG5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKHVuaXF1ZUlkLCBuYW1lLCAKLQkJCQlkZXNjcmlwdGlvbiwgZGlzcGxheSwgZGVmYXVsdFZhbHVlKTsKLQkJc2V0QXR0cmlidXRlRGVmaW5pdGlvbihkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gPFQ+Ci0JICogQHBhcmFtIHVuaXF1ZUlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+IEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxUPiBjcmVhdGVBcnJheUF0dHJpYnV0ZURlZmluaXRpb24oCi0JCQlmaW5hbCBTdHJpbmcgdW5pcXVlSWQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQlmaW5hbCBib29sZWFuIGRpc3BsYXksIGZpbmFsIFRbXSBkZWZhdWx0VmFsdWUpIHsKLQkJQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFQ+IGRlZiA9IG5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248VD4odW5pcXVlSWQsIG5hbWUsCi0JCQkJZGVzY3JpcHRpb24sIGRpc3BsYXksIGRlZmF1bHRWYWx1ZSk7Ci0JCXNldEF0dHJpYnV0ZURlZmluaXRpb24oZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdW5pcXVlSWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbigKLQkJCVN0cmluZyB1bmlxdWVJZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCWZpbmFsIGJvb2xlYW4gZGlzcGxheSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwgU3RyaW5nW10gdmFsdWVzKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uKHVuaXF1ZUlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgZGlzcGxheSwgZGVmYXVsdFZhbHVlLAotCQkJCXZhbHVlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9BdHRyaWJ1dGVNYW5hZ2VyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0F0dHJpYnV0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjNWI0Ni4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0F0dHJpYnV0ZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBbiBhdHRyaWJ1dGUgbWFuYWdlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgYSBzZXQgb2YgYXR0cmlidXRlIGRlZmluaXRpb24gSUQncyBhbmQKLSAqIGF0dHJpYnV0ZXMuIEl0IGlzIHVzZWQgd2hlcmUgZ3JvdXBzIG9mIGF0dHJpYnV0ZXMgYXJlIG5lZWRlZC4KLSAqIAotICogQGF1dGhvciBncmVnCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlTWFuYWdlciB7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+LCBJQXR0cmlidXRlPD8sPyw/Pj4gbWFwID0gCi0JCUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4sIElBdHRyaWJ1dGU8Pyw/LD8+PigpKTsKLQkKLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlcigpIHsKLQl9Ci0JCi0JcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIoSUF0dHJpYnV0ZTw/LD8sPz5bXSBhdHRycykgewotCQlmb3IgKElBdHRyaWJ1dGU8Pyw/LD8+IGF0dHIgOiBhdHRycykgewotCQkJYWRkQXR0cmlidXRlKGF0dHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGF0dHIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0cikgewotCQltYXAucHV0KGF0dHIuZ2V0RGVmaW5pdGlvbigpLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbmV3IGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHJpYnV0ZXMgYmVpbmcgbWFuYWdlZC4gSGFuZGxlIGFycmF5Ci0JICogYXR0cmlidXRlcyBzcGVjaWFsbHk6IHRoZSBuZXcgYXJyYXkgaXMgYXBwZW5kZWQgdG8gYW4gZXhpc3RpbmcgYXJyYXksIAotCSAqIGlmIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpIHsKLQkJc3luY2hyb25pemVkIChtYXApIHsKLQkJCWZvciAoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0ciA6IGF0dHJzKSB7Ci0JCQkJSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+IGRlZiA9IGF0dHIuZ2V0RGVmaW5pdGlvbigpOwotCQkJCWlmIChtYXAuY29udGFpbnNLZXkoZGVmKSAmJiBhdHRyIGluc3RhbmNlb2YgQXJyYXlBdHRyaWJ1dGUpIHsKLQkJCQkJQXJyYXlBdHRyaWJ1dGU8Pz4gYXJyQXR0ciA9IChBcnJheUF0dHJpYnV0ZTw/PikgYXR0cjsKLQkJCQkJYWRkQXR0cmlidXRlVG9BcnJheUF0dHJpYnV0ZShhcnJBdHRyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRBdHRyaWJ1dGUoYXR0cik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGF0dHIKLQkgKiBAcGFyYW0gZGVmCi0JICovCi0JcHJpdmF0ZSA8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gdm9pZCBhZGRBdHRyaWJ1dGVUb0FycmF5QXR0cmlidXRlKEFycmF5QXR0cmlidXRlPFQ+IGF0dHIpIHsKLQkJQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFQ+IGRlZiA9IGF0dHIuZ2V0RGVmaW5pdGlvbigpOwotCQlBcnJheUF0dHJpYnV0ZTxUPiBleEF0dHIgPSAoQXJyYXlBdHRyaWJ1dGU8VD4pbWFwLmdldChkZWYpOwotCQlmaW5hbCBMaXN0PFQ+IHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQlleEF0dHIuYWRkQWxsKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElBdHRyaWJ1dGU8Pyw/LD8+IGdldEF0dHJpYnV0ZShTdHJpbmcgaWQpIHsKLQkJc3luY2hyb25pemVkIChtYXApIHsKLQkJCWZvciAoTWFwLkVudHJ5PElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PiwgSUF0dHJpYnV0ZTw/LD8sPz4+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlpZiAoZW50cnkuZ2V0S2V5KCkuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIDxUPgotCSAqIEBwYXJhbSA8QT4KLQkgKiBAcGFyYW0gPEQ+Ci0JICogQHBhcmFtIGRlZgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgPFQsIEEgZXh0ZW5kcyBJQXR0cmlidXRlPFQsIEEsIEQ+LCBEIGV4dGVuZHMgSUF0dHJpYnV0ZURlZmluaXRpb248VCwgQSwgRD4+IEEgZ2V0QXR0cmlidXRlKEQgZGVmKSB7Ci0JCXJldHVybiAoQSkgdGhpcy5nZXRBdHRyaWJ1dGUoZGVmLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LD8sPz5bXSBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IElBdHRyaWJ1dGVbbWFwLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElBdHRyaWJ1dGU8Pyw/LD8+W10gZ2V0RGlzcGxheUF0dHJpYnV0ZXMoKSB7Ci0JCUxpc3Q8SUF0dHJpYnV0ZTw/LD8sPz4+IGF0dHJzID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlPD8sPyw/Pj4oKTsKLQkJCi0JCXN5bmNocm9uaXplZCAobWFwKSB7Ci0JCQlmb3IgKElBdHRyaWJ1dGU8Pyw/LD8+IGF0dHIgOiBtYXAudmFsdWVzKCkpIHsKLQkJCQlpZiAoYXR0ci5nZXREZWZpbml0aW9uKCkuZ2V0RGlzcGxheSgpKSB7Ci0JCQkJCWF0dHJzLmFkZChhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBhdHRycy50b0FycmF5KG5ldyBJQXR0cmlidXRlW2F0dHJzLnNpemUoKV0pOwotCX0KLQkJCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXRLZXlzKCkgewotCQlyZXR1cm4gbWFwLmtleVNldCgpLnRvQXJyYXkobmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGF0dHIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0cikgewotCQltYXAucmVtb3ZlKGF0dHIuZ2V0RGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSB0b1N0cmluZ0FycmF5KCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiByZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCXN5bmNocm9uaXplZCAobWFwKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4sIElBdHRyaWJ1dGU8Pyw/LD8+PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJSUF0dHJpYnV0ZTw/LD8sPz4gYXR0ciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKGF0dHIgaW5zdGFuY2VvZiBBcnJheUF0dHJpYnV0ZSkgewotCQkJCQlMaXN0PD8+IGFyck9iaiA9ICgoQXJyYXlBdHRyaWJ1dGU8Pz4pYXR0cikuZ2V0VmFsdWUoKTsKLQkJCQkJZm9yIChPYmplY3Qgb2JqIDogYXJyT2JqKSB7Ci0JCQkJCQlyZXMuYWRkKGVudHJ5LmdldEtleSgpLmdldElkKCkgKyAiPSIgKyBvYmoudG9TdHJpbmcoKSk7CQkJCQkKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlcy5hZGQoZW50cnkuZ2V0S2V5KCkuZ2V0SWQoKSArICI9IiArIGF0dHIuZ2V0VmFsdWVBc1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXMudG9BcnJheShuZXcgU3RyaW5nW3Jlcy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0JpZ0ludGVnZXJBdHRyaWJ1dGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQmlnSW50ZWdlckF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJiYzI3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQmlnSW50ZWdlckF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaWdJbnRlZ2VyQXR0cmlidXRlCi1leHRlbmRzIEFic3RyYWN0QXR0cmlidXRlPEJpZ0ludGVnZXIsQmlnSW50ZWdlckF0dHJpYnV0ZSxCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbj4gewotCi0JcHJpdmF0ZSBCaWdJbnRlZ2VyIHZhbHVlOwotCi0JcHVibGljIEJpZ0ludGVnZXJBdHRyaWJ1dGUoQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZGVmaW5pdGlvbiwKLQkJCUJpZ0ludGVnZXIgaW5pdGlhbFZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlKGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJpZ0ludGVnZXJBdHRyaWJ1dGUoQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZGVmaW5pdGlvbiwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzdXBlcihkZWZpbml0aW9uKTsKLQkJc2V0VmFsdWVBc1N0cmluZyhpbml0aWFsVmFsdWUpOwotCX0KLQotCXB1YmxpYyBCaWdJbnRlZ2VyQXR0cmlidXRlKEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGRlZmluaXRpb24sCi0JCQlJbnRlZ2VyIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJdGhpcyhkZWZpbml0aW9uLCBCaWdJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEJpZ0ludGVnZXIgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZygpIHsKLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlCaWdJbnRlZ2VyIHZhbCA9IG5ldyBCaWdJbnRlZ2VyKHN0cmluZyk7Ci0JCQlpZiAodmFsLmNvbXBhcmVUbyhnZXRNaW5WYWx1ZSgpKSA8IDAgfHwgdmFsLmNvbXBhcmVUbyhnZXRNYXhWYWx1ZSgpKSA+IDApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWx1ZShCaWdJbnRlZ2VyIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJaWYgKHZhbHVlLmNvbXBhcmVUbyhnZXRNaW5WYWx1ZSgpKSA8IDAgfHwgdmFsdWUuY29tcGFyZVRvKGdldE1heFZhbHVlKCkpID4gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiVGhlIHNldCB2YWxpZCByYW5nZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZXcgdmFsdWUiKTsKLQkJfQotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlKEludGVnZXIgaXZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJQmlnSW50ZWdlciB2YWx1ZSA9IEJpZ0ludGVnZXIudmFsdWVPZihpdmFsdWUpOwotCQlpZiAodmFsdWUuY29tcGFyZVRvKGdldE1pblZhbHVlKCkpIDwgMCB8fCB2YWx1ZS5jb21wYXJlVG8oZ2V0TWF4VmFsdWUoKSkgPiAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKCJUaGUgc2V0IHZhbGlkIHJhbmdlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG5ldyB2YWx1ZSIpOwotCQl9Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWVBc1N0cmluZyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUJpZ0ludGVnZXIgdmFsdWUgPSBuZXcgQmlnSW50ZWdlcihzdHJpbmcpOwotCQkJaWYgKHZhbHVlLmNvbXBhcmVUbyhnZXRNaW5WYWx1ZSgpKSA8IDAgfHwgdmFsdWUuY29tcGFyZVRvKGdldE1heFZhbHVlKCkpID4gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24oIlRoZSBzZXQgdmFsaWQgcmFuZ2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgbmV3IHZhbHVlIik7Ci0JCQl9Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQmlnSW50ZWdlciBnZXRNaW5WYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXRNaW5WYWx1ZSgpOwotCX0KLQkKLQlwcml2YXRlIEJpZ0ludGVnZXIgZ2V0TWF4VmFsdWUoKSB7Ci0JCXJldHVybiBnZXREZWZpbml0aW9uKCkuZ2V0TWF4VmFsdWUoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0NvbXBhcmVUbyhCaWdJbnRlZ2VyQXR0cmlidXRlIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5jb21wYXJlVG8ob3RoZXIudmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkb0VxdWFscyhCaWdJbnRlZ2VyQXR0cmlidXRlIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGRvSGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwMTcyNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0JpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248QmlnSW50ZWdlcixCaWdJbnRlZ2VyQXR0cmlidXRlLEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgbWluVmFsdWU7Ci0JcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIG1heFZhbHVlOwotCXByaXZhdGUgZmluYWwgQmlnSW50ZWdlciBkZWZhdWx0VmFsdWU7Ci0KLQlwdWJsaWMgQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwKLQkJCWZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCBmaW5hbCBCaWdJbnRlZ2VyIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXkpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5taW5WYWx1ZSA9IEJpZ0ludGVnZXIuWkVSTzsKLQkJdGhpcy5tYXhWYWx1ZSA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSk7Ci0JfQotCi0JcHVibGljIEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgQmlnSW50ZWdlciBkZWZhdWx0VmFsdWUsCi0JCQlmaW5hbCBCaWdJbnRlZ2VyIG1pblZhbHVlLCBmaW5hbCBCaWdJbnRlZ2VyIG1heFZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIodW5pcXVlSWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBkaXNwbGF5KTsKLQkJaWYgKG1pblZhbHVlLmNvbXBhcmVUbyhtYXhWYWx1ZSkgPiAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW5WYWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXhWYWx1ZSIpOwotCQl9Ci0JCWlmIChkZWZhdWx0VmFsdWUuY29tcGFyZVRvKG1pblZhbHVlKSA8IDAgfHwgZGVmYXVsdFZhbHVlLmNvbXBhcmVUbyhtYXhWYWx1ZSkgPiAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKCJUaGUgc2V0IHZhbGlkIHJhbmdlIGRvZXMgbm90IGluY2x1ZGUgdGhlIGRlZmF1bHQgdmFsdWUiKTsKLQkJfQotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5taW5WYWx1ZSA9IG1pblZhbHVlOwotCQl0aGlzLm1heFZhbHVlID0gbWF4VmFsdWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyQXR0cmlidXRlIGNyZWF0ZSgpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXJBdHRyaWJ1dGUodGhpcywgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQmlnSW50ZWdlckF0dHJpYnV0ZSBjcmVhdGUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyQXR0cmlidXRlKHRoaXMsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQmlnSW50ZWdlckF0dHJpYnV0ZSBjcmVhdGUoQmlnSW50ZWdlciB2YWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQmlnSW50ZWdlckF0dHJpYnV0ZSh0aGlzLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIEJpZ0ludGVnZXJBdHRyaWJ1dGUgY3JlYXRlKEludGVnZXIgdmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXJBdHRyaWJ1dGUodGhpcywgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heFZhbHVlKCkgewotCQlyZXR1cm4gbWF4VmFsdWU7Ci0JfQotCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWluVmFsdWUoKSB7Ci0JCXJldHVybiBtaW5WYWx1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0Jvb2xlYW5BdHRyaWJ1dGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQm9vbGVhbkF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ2NDliLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQm9vbGVhbkF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuQXR0cmlidXRlIAotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZTxCb29sZWFuLEJvb2xlYW5BdHRyaWJ1dGUsQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24+IHsKLQotCXByaXZhdGUgQm9vbGVhbiB2YWx1ZTsKLQotCXB1YmxpYyBCb29sZWFuQXR0cmlidXRlKEJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uIGRlZmluaXRpb24sIEJvb2xlYW4gaW5pdGlhbFZhbHVlKSB7Ci0JCXN1cGVyKGRlZmluaXRpb24pOwotCQl0aGlzLnZhbHVlID0gaW5pdGlhbFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbkF0dHJpYnV0ZShCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN1cGVyKGRlZmluaXRpb24pOwotCQl0aGlzLnZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKGluaXRpYWxWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHN0cmluZykgfHwgImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKHN0cmluZykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlQXNTdHJpbmcoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZChzdHJpbmcpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKHN0cmluZyArICIgaXMgbm90IGEgbGVnYWwgQm9vbGVhbiIpOwotCQl9Ci0JCXZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHN0cmluZyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBpbnQgZG9Db21wYXJlVG8oQm9vbGVhbkF0dHJpYnV0ZSBvdGhlcikgewotICAgICAgICByZXR1cm4gdmFsdWUuY29tcGFyZVRvKG90aGVyLnZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gZG9FcXVhbHMoQm9vbGVhbkF0dHJpYnV0ZSBvdGhlcikgewotICAgICAgICByZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0hhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyMjM3Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0Jvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24KLWV4dGVuZHMgQWJzdHJhY3RBdHRyaWJ1dGVEZWZpbml0aW9uPEJvb2xlYW4sQm9vbGVhbkF0dHJpYnV0ZSxCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbj4gewotCi0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIGRlZmF1bHRWYWx1ZTsKLQkKLQlwdWJsaWMgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgQm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodW5pcXVlSWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBkaXNwbGF5KTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBCb29sZWFuQXR0cmlidXRlIGNyZWF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuQXR0cmlidXRlKHRoaXMsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW5BdHRyaWJ1dGUgY3JlYXRlKEJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuQXR0cmlidXRlKHRoaXMsIHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW5BdHRyaWJ1dGUgY3JlYXRlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5BdHRyaWJ1dGUodGhpcywgdmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9EYXRlQXR0cmlidXRlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0RhdGVBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3YmJmZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0RhdGVBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLXB1YmxpYyBjbGFzcyBEYXRlQXR0cmlidXRlCi1leHRlbmRzIEFic3RyYWN0QXR0cmlidXRlPENhbGVuZGFyLCBEYXRlQXR0cmlidXRlLCBEYXRlQXR0cmlidXRlRGVmaW5pdGlvbj4gewotCi0JcHJpdmF0ZSBzdGF0aWMgRGF0ZUZvcm1hdFtdIGRhdGVGb3JtYXRzID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQlEYXRlQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYgPSBuZXcgRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oInVuaXFJZCIsICJuYW1lIiwgImRlc2MiLCB0cnVlLCBjYWwuZ2V0VGltZSgpLCBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoKSk7Ci0JCURhdGVBdHRyaWJ1dGUgbWRhID0gKERhdGVBdHRyaWJ1dGUpZGVmLmNyZWF0ZSgpOwotCQltZGEuc2V0VmFsdWUoY2FsKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1kYS50b1N0cmluZygpKTsKLQkJU3RyaW5nIHN0ciA9IG1kYS50b1N0cmluZygpOwotCQljYWwuYWRkKENhbGVuZGFyLk1PTlRILCAyKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1kYS50b1N0cmluZygpKTsKLQkJbWRhLnNldFZhbHVlQXNTdHJpbmcoc3RyKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1kYS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRlRm9ybWF0W10gZ2V0RGF0ZUZvcm1hdHMoKSB7Ci0JCWlmIChkYXRlRm9ybWF0cyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGF0ZUZvcm1hdHM7Ci0JCX0KLQkJTG9jYWxlW10gbG9jYWxzID0gRGF0ZUZvcm1hdC5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0JCWZpbmFsIGludCBzdHlsZXNbXSA9IHsgRGF0ZUZvcm1hdC5TSE9SVCwgRGF0ZUZvcm1hdC5NRURJVU0sCi0JCQkJRGF0ZUZvcm1hdC5MT05HLCBEYXRlRm9ybWF0LkZVTEwgfTsKLQkJQXJyYXlMaXN0PERhdGVGb3JtYXQ+IGRmcyA9IG5ldyBBcnJheUxpc3Q8RGF0ZUZvcm1hdD4oc3R5bGVzLmxlbmd0aCAqIHN0eWxlcy5sZW5ndGgKLQkJCQkqIGxvY2Fscy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fscy5sZW5ndGg7ICsraSkgewotCQkJZm9yIChpbnQgZHMgPSAwOyBkcyA8IHN0eWxlcy5sZW5ndGg7ICsrZHMpIHsKLQkJCQlmaW5hbCBpbnQgZGF0ZVN0eWxlID0gc3R5bGVzW2RzXTsKLQkJCQlmb3IgKGludCB0cyA9IDA7IHRzIDwgc3R5bGVzLmxlbmd0aDsgKyt0cykgewotCQkJCQlmaW5hbCBpbnQgdGltZVN0eWxlID0gc3R5bGVzW3RzXTsKLQkJCQkJZGZzLmFkZChEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoZGF0ZVN0eWxlLAotCQkJCQkJCXRpbWVTdHlsZSwgbG9jYWxzW2ldKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBkZnMuc2l6ZSgpICsgIiBkYXRlIGZvcm1hdHMiKTsKLQkJZGF0ZUZvcm1hdHMgPSAoRGF0ZUZvcm1hdFtdKSBkZnMudG9BcnJheShuZXcgRGF0ZUZvcm1hdFtkZnMuc2l6ZSgpXSk7Ci0JCXJldHVybiBkYXRlRm9ybWF0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ2FsZW5kYXIgdmFsdWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQotCXB1YmxpYyBEYXRlQXR0cmlidXRlKERhdGVBdHRyaWJ1dGVEZWZpbml0aW9uIGRlZmluaXRpb24sIERhdGUgaW5pdGlhbFZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlKGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHVibGljIERhdGVBdHRyaWJ1dGUoRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmluaXRpb24pOwotCQlzZXRWYWx1ZUFzU3RyaW5nKGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHVibGljIERhdGVGb3JtYXQgZ2V0RGF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXREYXRlRm9ybWF0KCk7Ci0JfQotCQotCXB1YmxpYyBEYXRlIGdldERhdGVWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlLmdldFRpbWUoKTsKLQl9Ci0KLQotCXB1YmxpYyBDYWxlbmRhciBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIChDYWxlbmRhcikgdmFsdWUuY2xvbmUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RGF0ZUZvcm1hdCgpLmZvcm1hdCh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0cmluZykgewotCQlmaW5hbCBEYXRlIGRhdGUgPSBwYXJzZVN0cmluZyhzdHJpbmcpOwotCQlpZiAoZGF0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGRhdGUuY29tcGFyZVRvKGdldE1pbkRhdGUoKSkgPCAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGRhdGUuY29tcGFyZVRvKGdldE1heERhdGUoKSkgPiAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQ2FsZW5kYXIgY2FsZW5kYXIpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzZXRWYWx1ZShjYWxlbmRhci5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKERhdGUgZGF0ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXZhbHVlLnNldFRpbWUoZGF0ZSk7Ci0JCWlmIChkYXRlLmNvbXBhcmVUbyhnZXRNaW5EYXRlKCkpIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiZGF0ZSBzcGVjaWZpZWQgaXMgYmVmb3JlIG1pbiBkYXRlIik7Ci0JCX0KLQkJaWYgKGRhdGUuY29tcGFyZVRvKGdldE1heERhdGUoKSkgPiAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKCJkYXRlIHNwZWNpZmllZCBpcyBhZnRlciBtYXggZGF0ZSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWVBc1N0cmluZyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJZmluYWwgRGF0ZSBkYXRlID0gcGFyc2VTdHJpbmcoc3RyaW5nKTsKLQkJaWYgKGRhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIFwiIiArIHN0cmluZwotCQkJCQkrICJcIiBpbnRvIGEgZGF0ZSIpOwotCQl9Ci0JCWlmIChkYXRlLmNvbXBhcmVUbyhnZXRNaW5EYXRlKCkpIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiRGF0ZSwgIiArIHN0cmluZyArICIsIGlzIGJlZm9yZSAiICsgdG9TdHJpbmcoZ2V0TWluRGF0ZSgpKSk7Ci0JCX0KLQkJaWYgKGRhdGUuY29tcGFyZVRvKGdldE1heERhdGUoKSkgPiAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKCJEYXRlLCAiICsgc3RyaW5nICsgIiwgaXMgYWZ0ZXIgIiArIHRvU3RyaW5nKGdldE1heERhdGUoKSkpOwotCQl9Ci0JCXZhbHVlLnNldFRpbWUoZGF0ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCQotCX0KLQotCXByaXZhdGUgRGF0ZSBnZXRNYXhEYXRlKCkgewotCQlyZXR1cm4gZ2V0RGVmaW5pdGlvbigpLmdldE1heERhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIERhdGUgZ2V0TWluRGF0ZSgpIHsKLQkJcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXRNaW5EYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBEYXRlIHBhcnNlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJRGF0ZSBkYXRlID0gbnVsbDsKLQkJZmluYWwgUGFyc2VQb3NpdGlvbiBwYXJzZVBvc2l0aW9uID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCWRhdGUgPSBnZXREYXRlRm9ybWF0KCkucGFyc2Uoc3RyaW5nLCBwYXJzZVBvc2l0aW9uKTsKLQkJaWYgKGRhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRhdGU7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXREYXRlRm9ybWF0cygpLmxlbmd0aDsgKytpKSB7Ci0JCQlwYXJzZVBvc2l0aW9uLnNldEluZGV4KDApOwotCQkJZGF0ZSA9IGdldERhdGVGb3JtYXRzKClbaV0ucGFyc2Uoc3RyaW5nLCBwYXJzZVBvc2l0aW9uKTsKLQkJCWlmIChkYXRlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZGF0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGF0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoRGF0ZSBkYXRlKSB7Ci0JCXJldHVybiBnZXREYXRlRm9ybWF0KCkuZm9ybWF0KGRhdGUpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZG9Db21wYXJlVG8oRGF0ZUF0dHJpYnV0ZSBvdGhlcikgewotICAgICAgICByZXR1cm4gdmFsdWUuY29tcGFyZVRvKG90aGVyLnZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0VxdWFscyhEYXRlQXR0cmlidXRlIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZG9IYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODk4ZTAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9EYXRlQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRlQXR0cmlidXRlRGVmaW5pdGlvbgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248Q2FsZW5kYXIsIERhdGVBdHRyaWJ1dGUsIERhdGVBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIERhdGUgbWluRGF0ZSA9IG5ldyBEYXRlKExvbmcuTUlOX1ZBTFVFKTsKLQlwcml2YXRlIERhdGUgbWF4RGF0ZSA9IG5ldyBEYXRlKExvbmcuTUFYX1ZBTFVFKTsKLQkKLQlwcml2YXRlIGZpbmFsIERhdGVGb3JtYXQgb3V0cHV0RGF0ZUZvcm1hdDsKLQlwcml2YXRlIGZpbmFsIERhdGUgZGVmYXVsdFZhbHVlOwotCi0JcHVibGljIERhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsIAotCQkJZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIAotCQkJZmluYWwgRGF0ZSBkZWZhdWx0VmFsdWUsIGZpbmFsIERhdGVGb3JtYXQgb3V0cHV0RGF0ZUZvcm1hdCkgewotCQlzdXBlcih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXkpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5vdXRwdXREYXRlRm9ybWF0ID0gb3V0cHV0RGF0ZUZvcm1hdDsKLQl9Ci0KLQlwdWJsaWMgRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgCi0JCQlmaW5hbCBEYXRlIGRlZmF1bHRWYWx1ZSwgZmluYWwgRGF0ZUZvcm1hdCBvdXRwdXREYXRlRm9ybWF0LCBmaW5hbCBEYXRlIG1pbiwgZmluYWwgRGF0ZSBtYXgpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzdXBlcih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXkpOwotCQlpZiAoZGVmYXVsdFZhbHVlLmNvbXBhcmVUbyhnZXRNaW5EYXRlKCkpIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiZGVmYXVsdCBkYXRlIHNwZWNpZmllZCBpcyBiZWZvcmUgbWluIGRhdGUiKTsKLQkJfQotCQlpZiAoZGVmYXVsdFZhbHVlLmNvbXBhcmVUbyhnZXRNYXhEYXRlKCkpID4gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiZGVmYXVsdCBkYXRlIHNwZWNpZmllZCBpcyBhZnRlciBtYXggZGF0ZSIpOwotCQl9Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLm91dHB1dERhdGVGb3JtYXQgPSBvdXRwdXREYXRlRm9ybWF0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNjcmVhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0ZUF0dHJpYnV0ZSBjcmVhdGUoKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBEYXRlQXR0cmlidXRlKHRoaXMsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBEYXRlQXR0cmlidXRlIGNyZWF0ZShTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IERhdGVBdHRyaWJ1dGUodGhpcywgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0ZSBnZXRNYXhEYXRlKCkgewotCQlyZXR1cm4gbWF4RGF0ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERhdGUgZ2V0TWluRGF0ZSgpIHsKLQkJcmV0dXJuIG1pbkRhdGU7Ci0JfQotCQotCXB1YmxpYyBEYXRlRm9ybWF0IGdldERhdGVGb3JtYXQoKSB7Ci0JCXJldHVybiBvdXRwdXREYXRlRm9ybWF0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWxpZFJhbmdlKERhdGUgbWluRGF0ZSwgRGF0ZSBtYXhEYXRlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJaWYgKG1pbkRhdGUgPT0gbnVsbCkgewotCQkJdGhpcy5taW5EYXRlID0gbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5taW5EYXRlID0gbWluRGF0ZTsKLQkJfQotCQlpZiAobWF4RGF0ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLm1heERhdGUgPSBuZXcgRGF0ZShMb25nLk1BWF9WQUxVRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLm1heERhdGUgPSBtYXhEYXRlOwotCQl9Ci0JCWlmICh0aGlzLm1pbkRhdGUuY29tcGFyZVRvKHRoaXMubWF4RGF0ZSkgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWluRGF0ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXhEYXRlIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0RvdWJsZUF0dHJpYnV0ZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9Eb3VibGVBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzMGZmNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0RvdWJsZUF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEb3VibGVBdHRyaWJ1dGUKLWV4dGVuZHMgQWJzdHJhY3RBdHRyaWJ1dGU8RG91YmxlLERvdWJsZUF0dHJpYnV0ZSxEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIERvdWJsZSB2YWx1ZTsKLQotCXB1YmxpYyBEb3VibGVBdHRyaWJ1dGUoRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbiBkZXNjcmlwdGlvbiwgRG91YmxlIGluaXRpYWxWYWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlc2NyaXB0aW9uKTsKLQkJc2V0VmFsdWUoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRG91YmxlQXR0cmlidXRlKERvdWJsZUF0dHJpYnV0ZURlZmluaXRpb24gZGVzY3JpcHRpb24sIFN0cmluZyBpbml0aWFsVmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzdXBlcihkZXNjcmlwdGlvbik7Ci0JCXNldFZhbHVlQXNTdHJpbmcoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERvdWJsZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlEb3VibGUucGFyc2VEb3VibGUoc3RyaW5nKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlKERvdWJsZSB2YWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICh2YWx1ZS5kb3VibGVWYWx1ZSgpIDwgZ2V0TWluVmFsdWUoKSB8fCB2YWx1ZS5kb3VibGVWYWx1ZSgpID4gZ2V0TWF4VmFsdWUoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiVGhlIHNldCB2YWxpZCByYW5nZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZXcgdmFsdWUiKTsKLQkJfQotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlQXNTdHJpbmcoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlEb3VibGUgdmFsdWUgPSBEb3VibGUudmFsdWVPZihzdHJpbmcpOwotCQkJaWYgKHZhbHVlLmRvdWJsZVZhbHVlKCkgPCBnZXRNaW5WYWx1ZSgpIHx8IHZhbHVlLmRvdWJsZVZhbHVlKCkgPiBnZXRNYXhWYWx1ZSgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiVGhlIHNldCB2YWxpZCByYW5nZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZXcgdmFsdWUiKTsKLQkJCX0KLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBkb3VibGUgZ2V0TWluVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREZWZpbml0aW9uKCkuZ2V0TWluVmFsdWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBkb3VibGUgZ2V0TWF4VmFsdWUoKSB7Ci0JCXJldHVybiBnZXREZWZpbml0aW9uKCkuZ2V0TWF4VmFsdWUoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0NvbXBhcmVUbyhEb3VibGVBdHRyaWJ1dGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGRvRXF1YWxzKERvdWJsZUF0dHJpYnV0ZSBvdGhlcikgewotICAgICAgICByZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0hhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9Eb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTQ3NWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9Eb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248RG91YmxlLERvdWJsZUF0dHJpYnV0ZSxEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIGZpbmFsIERvdWJsZSBtaW5WYWx1ZTsKLQlwcml2YXRlIGZpbmFsIERvdWJsZSBtYXhWYWx1ZTsKLQlwcml2YXRlIGZpbmFsIERvdWJsZSBkZWZhdWx0VmFsdWU7Ci0KLQlwdWJsaWMgRG91YmxlQXR0cmlidXRlRGVmaW5pdGlvbihmaW5hbCBTdHJpbmcgdW5pcXVlSWQsIGZpbmFsIFN0cmluZyBuYW1lLCAKLQkJCWZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCBmaW5hbCBEb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHVuaXF1ZUlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgZGlzcGxheSk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLm1pblZhbHVlID0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwotCQl0aGlzLm1heFZhbHVlID0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotCX0KLQotCXB1YmxpYyBEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsIAotCQkJZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIAotCQkJZmluYWwgRG91YmxlIGRlZmF1bHRWYWx1ZSwgZmluYWwgZG91YmxlIG1pblZhbHVlLCBmaW5hbCBkb3VibGUgbWF4VmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzdXBlcih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXkpOwotCQlpZiAobWluVmFsdWUgPiBtYXhWYWx1ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWluVmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4VmFsdWUiKTsKLQkJfQotCQlpZiAoZGVmYXVsdFZhbHVlIDwgbWluVmFsdWUgfHwgZGVmYXVsdFZhbHVlID4gbWF4VmFsdWUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24oIlRoZSBzZXQgdmFsaWQgcmFuZ2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgZGVmYXVsdCB2YWx1ZSIpOwotCQl9Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7Ci0JCXRoaXMubWF4VmFsdWUgPSBtYXhWYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIERvdWJsZUF0dHJpYnV0ZSBjcmVhdGUoKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBEb3VibGVBdHRyaWJ1dGUodGhpcywgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRG91YmxlQXR0cmlidXRlIGNyZWF0ZShTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IERvdWJsZUF0dHJpYnV0ZSh0aGlzLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIERvdWJsZSBnZXRNYXhWYWx1ZSgpIHsKLQkJcmV0dXJuIG1heFZhbHVlOwotCX0KLQotCXB1YmxpYyBEb3VibGUgZ2V0TWluVmFsdWUoKSB7Ci0JCXJldHVybiBtaW5WYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvRW51bWVyYXRlZEF0dHJpYnV0ZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9FbnVtZXJhdGVkQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmVlZWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9FbnVtZXJhdGVkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIHJzcXJkCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW51bWVyYXRlZEF0dHJpYnV0ZTxFIGV4dGVuZHMgRW51bTxFPj4gZXh0ZW5kcwotCQlBYnN0cmFjdEF0dHJpYnV0ZTxFLCBFbnVtZXJhdGVkQXR0cmlidXRlPEU+LCBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxFPj4gewotCi0JcHJpdmF0ZSBFIHZhbHVlOwotCi0JLyoqCi0JICogQHBhcmFtIGRlZmluaXRpb24KLQkgKiBAcGFyYW0gdmFsdWVJbmRleAotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEVudW1lcmF0ZWRBdHRyaWJ1dGUoRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248RT4gZGVmaW5pdGlvbiwKLQkJCWludCB2YWx1ZUluZGV4KSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlKHZhbHVlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWZpbml0aW9uCi0JICogQHBhcmFtIHZhbHVlU3RyaW5nCi0JICogQHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRlZEF0dHJpYnV0ZShFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxFPiBkZWZpbml0aW9uLAotCQkJU3RyaW5nIHZhbHVlU3RyaW5nKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlQXNTdHJpbmcodmFsdWVTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBlbnVtZXJhdGlvbnMKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRlZEF0dHJpYnV0ZShFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxFPiBkZWZpbml0aW9uLCBFIHZhbHVlKSB7Ci0JCXN1cGVyKGRlZmluaXRpb24pOwotCQlzZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBFPiBnZXRFbnVtZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBnZXREZWZpbml0aW9uKCkuZ2V0RW51bWVyYXRpb25zKCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RW51bWVyYXRpb25TdHJpbmdzKCkgewotCQlyZXR1cm4gZ2V0RGVmaW5pdGlvbigpLmdldEVudW1lcmF0aW9uU3RyaW5ncygpOwotCX0KLSAgICAKLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBFIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjZ2V0VmFsdWVBc1N0cmluZygpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZygpIHsKLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZhbHVlSW5kZXgKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRWYWx1ZUluZGV4KCkgewotCQlyZXR1cm4gdmFsdWUub3JkaW5hbCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWludCB2aSA9IGdldEVudW1lcmF0aW9ucygpLmluZGV4T2Yoc3RyaW5nKTsKLQkJaWYgKHZpID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWx1ZShFIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWVJbmRleAotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlKGludCB2YWx1ZUluZGV4KSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJZmluYWwgTGlzdDw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb25zID0gZ2V0RW51bWVyYXRpb25zKCk7Ci0JCWlmICh2YWx1ZUluZGV4IDwgMCB8fCB2YWx1ZUluZGV4ID49IGVudW1lcmF0aW9ucy5zaXplKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24oInZhbHVlSW5kZXggaXMgb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQkJdGhpcy52YWx1ZSA9IGVudW1lcmF0aW9ucy5nZXQodmFsdWVJbmRleCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWx1ZUFzU3RyaW5nKFN0cmluZyBzdHJpbmcpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlDbGFzczxFPiBlbnVtQ2xhc3MgPSBnZXREZWZpbml0aW9uKCkuZ2V0RW51bUNsYXNzKCk7Ci0gICAgICAgIEUgZXZhbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCWV2YWwgPSBFLnZhbHVlT2YoZW51bUNsYXNzLCBzdHJpbmcpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCQl0aGlzLnZhbHVlID0gZXZhbDsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0NvbXBhcmVUbyhFbnVtZXJhdGVkQXR0cmlidXRlPEU+IG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5jb21wYXJlVG8ob3RoZXIudmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkb0VxdWFscyhFbnVtZXJhdGVkQXR0cmlidXRlPEU+IG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBvdGhlci52YWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0hhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDUyYjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9FbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPEUgZXh0ZW5kcyBFbnVtPEU+PgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248RSxFbnVtZXJhdGVkQXR0cmlidXRlPEU+LEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPEU+PiB7Ci0KLQlwcml2YXRlIGZpbmFsIEUgZGVmYXVsdFZhbHVlOwotCXByaXZhdGUgZmluYWwgQ2xhc3M8RT4gZW51bUNsYXNzOwotCi0gICAgcHVibGljIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwKLQkJCWZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgCi0JCQlmaW5hbCBFIGRlZmF1bHRWYWx1ZUluKSB7Ci0JCXN1cGVyKHVuaXF1ZUlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgZGlzcGxheSk7Ci0JCWZpbmFsIENsYXNzPEU+IGVDbGFzcyA9IChDbGFzczxFPikgZGVmYXVsdFZhbHVlSW4uZ2V0Q2xhc3MoKTsKLSAgICAgICAgdGhpcy5lbnVtQ2xhc3MgPSBlQ2xhc3M7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlSW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGVkQXR0cmlidXRlPEU+IGNyZWF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkQXR0cmlidXRlPEU+KHRoaXMsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0ZWRBdHRyaWJ1dGU8RT4gY3JlYXRlKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkQXR0cmlidXRlPEU+KHRoaXMsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRlZEF0dHJpYnV0ZTxFPiBjcmVhdGUoaW50IHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkQXR0cmlidXRlPEU+KHRoaXMsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRlZEF0dHJpYnV0ZTxFPiBjcmVhdGUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkQXR0cmlidXRlPEU+KHRoaXMsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3M8RT4gZ2V0RW51bUNsYXNzKCkgewotCQlyZXR1cm4gZW51bUNsYXNzOwotCX0KLQotCXB1YmxpYyBMaXN0PEU+IGdldEVudW1lcmF0aW9ucygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZW51bUNsYXNzLmdldEVudW1Db25zdGFudHMoKSk7Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbnVtZXJhdGlvblN0cmluZ3MoKSB7Ci0JCWZpbmFsIExpc3Q8RT4gdmFsdWVzID0gZ2V0RW51bWVyYXRpb25zKCk7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odmFsdWVzLnNpemUoKSk7Ci0JCWZvciAoRSB2YWx1ZSA6IHZhbHVlcykgewotCQkJc3RyaW5ncy5hZGQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9JQXR0cmlidXRlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0lBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzY2IyOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0lBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBdHRyaWJ1dGU8VCwgQSBleHRlbmRzIElBdHRyaWJ1dGU8VCxBLEQ+LCBEIGV4dGVuZHMgSUF0dHJpYnV0ZURlZmluaXRpb248VCxBLEQ+PgotCWV4dGVuZHMgQ29tcGFyYWJsZTxBPiB7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBEIGdldERlZmluaXRpb24oKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFQgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBlbmFibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOwotCi0JLyoqCi0JICogSXMgdGhlIHN0cmluZyBwYXJzYWJsZSB0byBhIHZhbGlkCi0JICogYXR0cmlidXRlIG9mIHRoaXMgdHlwZT8KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0cmluZyk7Ci0JCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHRocm93cyBJQXR0cmlidXRlLklsbGVnYWxWYWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlQXNTdHJpbmcoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSUF0dHJpYnV0ZURlZmluaXRpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSUF0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjODVhMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0lBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotcHVibGljIGludGVyZmFjZSBJQXR0cmlidXRlRGVmaW5pdGlvbjxULAotCQkJCQkJCQkJICBBIGV4dGVuZHMgSUF0dHJpYnV0ZTxULEEsRD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgZXh0ZW5kcyBJQXR0cmlidXRlRGVmaW5pdGlvbjxULEEsRD4+Ci1leHRlbmRzIENvbXBhcmFibGU8SUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+PiB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc3BsYXkoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEEgY3JlYXRlKCkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEEgY3JlYXRlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSWxsZWdhbFZhbHVlRXhjZXB0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0lsbGVnYWxWYWx1ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQ2NzZkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSWxsZWdhbFZhbHVlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlczsKLQotcHVibGljIGNsYXNzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzY2ODc1NTgyNTI0OTc2MjI2TDsKLQotCXB1YmxpYyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0KLQlwdWJsaWMgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL0ludGVnZXJBdHRyaWJ1dGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSW50ZWdlckF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2VmNjc0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSW50ZWdlckF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnRlZ2VyQXR0cmlidXRlCi1leHRlbmRzIEFic3RyYWN0QXR0cmlidXRlPEludGVnZXIsSW50ZWdlckF0dHJpYnV0ZSxJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbj4gewotCi0JcHJpdmF0ZSBJbnRlZ2VyIHZhbHVlOwotCi0JcHVibGljIEludGVnZXJBdHRyaWJ1dGUoSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZGVmaW5pdGlvbiwgSW50ZWdlciBpbml0aWFsVmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzdXBlcihkZWZpbml0aW9uKTsKLQkJc2V0VmFsdWUoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlckF0dHJpYnV0ZShJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlQXNTdHJpbmcoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEludGVnZXIgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZS5pbnRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdHJpbmcpIHsKLQkJdHJ5IHsKLQkJCWludCB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZyk7Ci0JCQlpZiAodmFsIDwgZ2V0TWluVmFsdWUoKSB8fCB2YWwgPiBnZXRNYXhWYWx1ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoSW50ZWdlciB2YWx1ZSkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICh2YWx1ZS5pbnRWYWx1ZSgpIDwgZ2V0TWluVmFsdWUoKSB8fCB2YWx1ZS5pbnRWYWx1ZSgpID4gZ2V0TWF4VmFsdWUoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigiVGhlIHNldCB2YWxpZCByYW5nZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZXcgdmFsdWUiKTsKLQkJfQotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlQXNTdHJpbmcoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIHZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHN0cmluZyk7Ci0JCQlpZiAodmFsdWUuaW50VmFsdWUoKSA8IGdldE1pblZhbHVlKCkgfHwgdmFsdWUuaW50VmFsdWUoKSA+IGdldE1heFZhbHVlKCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKCJUaGUgc2V0IHZhbGlkIHJhbmdlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG5ldyB2YWx1ZSIpOwotCQkJfQotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGludCBnZXRNaW5WYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXRNaW5WYWx1ZSgpOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRNYXhWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXRNYXhWYWx1ZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGRvQ29tcGFyZVRvKEludGVnZXJBdHRyaWJ1dGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGRvRXF1YWxzKEludGVnZXJBdHRyaWJ1dGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBpbnQgZG9IYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDMyODhkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248SW50ZWdlcixJbnRlZ2VyQXR0cmlidXRlLEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIGZpbmFsIEludGVnZXIgbWluVmFsdWU7Ci0JcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIG1heFZhbHVlOwotCXByaXZhdGUgZmluYWwgSW50ZWdlciBkZWZhdWx0VmFsdWU7Ci0KLQlwdWJsaWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgCi0JCQlmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGJvb2xlYW4gZGlzcGxheSwgZmluYWwgSW50ZWdlciBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodW5pcXVlSWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBkaXNwbGF5KTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMubWluVmFsdWUgPSAwOwotCQl0aGlzLm1heFZhbHVlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JfQotCi0JcHVibGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKGZpbmFsIFN0cmluZyB1bmlxdWVJZCwgZmluYWwgU3RyaW5nIG5hbWUsIAotCQkJZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIAotCQkJZmluYWwgSW50ZWdlciBkZWZhdWx0VmFsdWUsIGZpbmFsIEludGVnZXIgbWluVmFsdWUsIGZpbmFsIEludGVnZXIgbWF4VmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzdXBlcih1bmlxdWVJZCwgbmFtZSwgZGVzY3JpcHRpb24sIGRpc3BsYXkpOwotCQlpZiAobWluVmFsdWUgPiBtYXhWYWx1ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWluVmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4VmFsdWUiKTsKLQkJfQotCQlpZiAoZGVmYXVsdFZhbHVlIDwgbWluVmFsdWUgfHwgZGVmYXVsdFZhbHVlID4gbWF4VmFsdWUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24oIlRoZSBzZXQgdmFsaWQgcmFuZ2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgZGVmYXVsdCB2YWx1ZSIpOwotCQl9Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7Ci0JCXRoaXMubWF4VmFsdWUgPSBtYXhWYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEludGVnZXJBdHRyaWJ1dGUgY3JlYXRlKCkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSW50ZWdlckF0dHJpYnV0ZSh0aGlzLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyQXR0cmlidXRlIGNyZWF0ZShTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEludGVnZXJBdHRyaWJ1dGUodGhpcywgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyQXR0cmlidXRlIGNyZWF0ZShJbnRlZ2VyIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyQXR0cmlidXRlKHRoaXMsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRNYXhWYWx1ZSgpIHsKLQkJcmV0dXJuIG1heFZhbHVlOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pblZhbHVlKCkgewotCQlyZXR1cm4gbWluVmFsdWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9TdHJpbmdBdHRyaWJ1dGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvU3RyaW5nQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTlkYWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9TdHJpbmdBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdBdHRyaWJ1dGUKLWV4dGVuZHMgQWJzdHJhY3RBdHRyaWJ1dGU8U3RyaW5nLFN0cmluZ0F0dHJpYnV0ZSxTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCXB1YmxpYyBTdHJpbmdBdHRyaWJ1dGUoU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBkZXNjcmlwdGlvbiwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzdXBlcihkZXNjcmlwdGlvbik7Ci0JCXNldFZhbHVlQXNTdHJpbmcoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzZXRWYWx1ZUFzU3RyaW5nKHZhbHVlKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjc2V0VmFsdWVBc1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWx1ZUFzU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLSAgICAJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0gICAgCQlzdHJpbmcgPSAiIjsKLSAgICAJfQotCQl0aGlzLnZhbHVlLnJlcGxhY2UoMCwgdGhpcy52YWx1ZS5sZW5ndGgoKSwgc3RyaW5nKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBkb0NvbXBhcmVUbyhTdHJpbmdBdHRyaWJ1dGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkuY29tcGFyZVRvKG90aGVyLnZhbHVlLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkb0VxdWFscyhTdHJpbmdBdHRyaWJ1dGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBpbnQgZG9IYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL1N0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MTIwYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL1N0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uCi1leHRlbmRzIEFic3RyYWN0QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmcsU3RyaW5nQXR0cmlidXRlLFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24+IHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQkKLQlwdWJsaWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihmaW5hbCBTdHJpbmcgdW5pcXVlSWQsIGZpbmFsIFN0cmluZyBuYW1lLCAKLQkJCWZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCBmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHVuaXF1ZUlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgZGlzcGxheSk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNjcmVhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQXR0cmlidXRlIGNyZWF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdBdHRyaWJ1dGUodGhpcywgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQXR0cmlidXRlIGNyZWF0ZShTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdBdHRyaWJ1dGUodGhpcywgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvU3RyaW5nU2V0QXR0cmlidXRlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL1N0cmluZ1NldEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjE5YTFhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2F0dHJpYnV0ZXMvU3RyaW5nU2V0QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1NldEF0dHJpYnV0ZQotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZTxTdHJpbmcsU3RyaW5nU2V0QXR0cmlidXRlLFN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24+IHsKLQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQHBhcmFtIGRlZmluaXRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmdTZXRBdHRyaWJ1dGUoU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlQXNTdHJpbmcoZGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZmluaXRpb24KLQkgKiBAcGFyYW0gdmFsdWVJbgotCSAqIEB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZ1NldEF0dHJpYnV0ZShTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB2YWx1ZUluKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmaW5pdGlvbik7Ci0JCXNldFZhbHVlQXNTdHJpbmcodmFsdWVJbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVBc1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSNnZXRWYWx1ZUFzU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VmFsdWVJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXRWYWx1ZXMoKS5pbmRleE9mKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlSW4pIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IGdldERlZmluaXRpb24oKS5nZXRWYWx1ZXMoKTsKLQkJZmluYWwgYm9vbGVhbiBpc1ZhbGlkID0gdmFsdWVzLmNvbnRhaW5zKHZhbHVlSW4pOwotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsVmFsdWVFeGNlcHRpb24gewotCQlzZXRWYWx1ZUFzU3RyaW5nKHZhbHVlKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGUjc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWVBc1N0cmluZyhTdHJpbmcgdmFsdWVJbikgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZCh2YWx1ZUluKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxWYWx1ZUV4Y2VwdGlvbigidmFsdWU6ICIgKyB2YWx1ZUluICsKLQkJCQkJIiBpcyBub3QgaW4gU3RyaW5nU2V0QXR0cmlidXRlOiAiICsJZ2V0RGVmaW5pdGlvbigpLmdldE5hbWUoKSk7Ci0JCX0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlSW47Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBkb0NvbXBhcmVUbyhTdHJpbmdTZXRBdHRyaWJ1dGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlSW5kZXgoKSAtIG90aGVyLmdldFZhbHVlSW5kZXgoKTsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gZG9FcXVhbHMoU3RyaW5nU2V0QXR0cmlidXRlIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpOwotICAgIH0KLQotCUBPdmVycmlkZQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGRvSGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvYXR0cmlidXRlcy9TdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL1N0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwNTBhOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9hdHRyaWJ1dGVzL1N0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbgotZXh0ZW5kcyBBYnN0cmFjdEF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nLFN0cmluZ1NldEF0dHJpYnV0ZSxTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uPiB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gdmFsdWVzOwotCi0JcHVibGljIFN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24oZmluYWwgU3RyaW5nIHVuaXF1ZUlkLCBmaW5hbCBTdHJpbmcgbmFtZSwKLQkJCWZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiBkaXNwbGF5LCAKLQkJCWZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWUsIGZpbmFsIFN0cmluZ1tdIHZhbHVlcykgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHVuaXF1ZUlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgZGlzcGxheSk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLnZhbHVlcyA9IEFycmF5cy5hc0xpc3QodmFsdWVzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbihmaW5hbCBTdHJpbmcgdW5pcXVlSWQsIGZpbmFsIFN0cmluZyBuYW1lLAotCQkJZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIGRpc3BsYXksIAotCQkJZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwgZmluYWwgTGlzdDxTdHJpbmc+IHZhbHVlcykKLQl0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJc3VwZXIodW5pcXVlSWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBkaXNwbGF5KTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMudmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHZhbHVlcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbiNjcmVhdGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdTZXRBdHRyaWJ1dGUgY3JlYXRlKCkgdGhyb3dzIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgU3RyaW5nU2V0QXR0cmlidXRlKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb24jY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZ1NldEF0dHJpYnV0ZSBjcmVhdGUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdTZXRBdHRyaWJ1dGUodGhpcywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHRWYWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZhbHVlcwotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQRWxlbWVudENvbnRyb2wuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUEVsZW1lbnRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjY5YjcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQRWxlbWVudENvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgcGFyYWxsZWwgZWxlbWVudCBjbGFzcyB3aGljaCBhbGwgdGhlIHNwZWNpZmljIGNsYXNzZXMKLSAqIGV4dGVuZCwgbGlrZSBNYWNoaW5lLCBOb2RlLCBKb2IsIGV0Yy4gVGhpcyBiYXNlIGNsYXNzIG1haW50YWlucyBhIG5hbWUgZm9yCi0gKiBlYWNoIGVudGl0eSB0aGF0IGV4dGVuZHMgaXQgYW5kIGhhbmRsZXMgcGFyZW50L2NoaWxkIG9wZXJhdGlvbnMuIEEga2V5IGlzCi0gKiBhbHNvIG1haW50YWluZWQgZm9yIGVhY2ggcGFyYWxsZWwgZWxlbWVudCB3aGljaCBpcyB1c2VkIGluIHN0b3JpbmcgdGhlc2UKLSAqIGVsZW1lbnRzIGluIGhhc2ggdGFibGVzIGFuZCBzdWNoLgotICogCi0gKiBAYXV0aG9yIE5hdGhhbiBEZUJhcmRlbGViZW4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUEVsZW1lbnRDb250cm9sIGV4dGVuZHMgSVBFbGVtZW50IHsKLQkvLyBwdWJsaWMgU3RyaW5nIE5BTUVfVEFHID0gIiI7Ci0KLQkvKioKLQkgKiBFbGVtZW50IHRhZyBmb3IgYW4gZXJyb3IgLyB1bmRlZmluZWQgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfVFlQRV9FUlJPUiA9IC0xOwotCQotCS8qKgotCSAqIEVsZW1lbnQgdGFnIGZvciBVbml2ZXJzZSBFbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfVU5JVkVSU0UgPSAxMDsKLQotCS8qKgotCSAqIEVsZW1lbnQgdGFnIGZvciBNYWNoaW5lIEVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9NQUNISU5FID0gMTE7Ci0KLQkvKioKLQkgKiBFbGVtZW50IHRhZyBmb3IgTm9kZSBFbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfTk9ERSA9IDEyOwotCi0JLyoqCi0JICogRWxlbWVudCB0YWcgZm9yIEpvYiBFbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfSk9CID0gMTM7Ci0KLQkvKioKLQkgKiBFbGVtZW50IHRhZyBmb3IgUHJvY2VzcyBFbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfUFJPQ0VTUyA9IDE0OwotCQotCS8qKgotCSAqIEVsZW1lbnQgdGFnIGZvciBSZXNvdXJjZSBNYW5hZ2VyIEVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9SRVNPVVJDRV9NQU5BR0VSID0gMTU7Ci0JCi0JLyoqCi0JICogRWxlbWVudCB0YWcgZm9yIFF1ZXVlIEVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9RVUVVRSA9IDE2OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCB0eXBlIChzdWNoIGFzIFBfVU5JVkVSU0UsIFBfTUFDSElORSwgZXRjLikgZm9yIHRoaXMKLQkgKiBFbGVtZW50LiBUaGlzIHR5cGUgaXMgdXN1YWxseSBzZXQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3Igb2YgdGhlCi0JICogaW1wbGVtZW50aW5nIGNsYXNzIG9mIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGlzIEVsZW1lbnQgd2hpY2ggY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlCi0JICogICAgICAgICBwdWJsaWMgc3RhdGljcyBvZiB0aGlzIGludGVyZmFjZS4KLQkgKiBAc2VlIFBfVU5JVkVSU0UKLQkgKiBAc2VlIFBfTUFDSElORQotCSAqIEBzZWUgUF9OT0RFCi0JICogQHNlZSBQX0pPQgotCSAqIEBzZWUgUF9QUk9DRVNTCi0JICovCi0JcHVibGljIGludCBnZXRFbGVtZW50VHlwZSgpOwotCi0JLyoqCi0JICogSWYgdGhpcyBFbGVtZW50IGhhcyBhIHBhcmVudCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgaXQsIGVsc2UgaXQgcmV0dXJucwotCSAqIG51bGwuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFyZW50IEVsZW1lbnQgb2YgdGhpcyBFbGVtZW50LCBudWxsIGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8KLQlwdWJsaWMgSVBFbGVtZW50Q29udHJvbCBnZXRQYXJlbnQoKTsKLQotCS8qCi0JICogcHVibGljIElQVW5pdmVyc2UgZ2V0UFVuaXZlcnNlKCk7IHB1YmxpYyBJUE1hY2hpbmUgZ2V0UE1hY2hpbmUoKTsgcHVibGljCi0JICogSVBKb2IgZ2V0UFJvb3QoKTsKLQkgKi8KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEVsZW1lbnQgaGFzIGNoaWxkcmVuIEVsZW1lbnRzLCBlbHNlIHJldHVybnMgZmFsc2UuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIHRoaXMgRWxlbWVudCBoYXMgY2hpbGRyZW4gRWxlbWVudHMsIGVsc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQSm9iQ29udHJvbC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQSm9iQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTMwNzNjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUEpvYkNvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQSm9iQ29udHJvbCBleHRlbmRzIElQRWxlbWVudENvbnRyb2wsIElQSm9iIHsKLQotCS8qKgotCSAqIEFkZCBhdHRyaWJ1dGVzIHRvIGEgY29sbGVjdGlvbiBvZiBwcm9jZXNzZXMuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NlcyBjb2xsZWN0aW9uIG9mIElQUHJvY2Vzc0NvbnRyb2wKLQkgKiBAcGFyYW0gYXR0cnMgYXJyYXkgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gZWFjaCBwcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvY2Vzc0F0dHJpYnV0ZXMoQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMsIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpOwotCi0JLyoqCi0JICogQWRkIHRoZSBjb2xsZWN0aW9uIG9mIHByb2Nlc3NlcyB0byB0aGUgam9iLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzZXMgY29sbGVjdGlvbiBvZiBJUFByb2Nlc3NDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlcyhDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3Nlcyk7Ci0JCi0JLyoqCi0JICogR2V0IGFsbCB0aGUgcHJvY2Vzc2VzIGtub3duIGJ5IHRoaXMgam9iCi0JICogCi0JICogQHJldHVybiBjb2xsZWN0aW9uIG9mIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IGdldFByb2Nlc3NDb250cm9scygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBwYXJlbnQgb2YgdGhpcyBqb2IKLQkgKiAKLQkgKiBAcmV0dXJuIHBhcmVudCBxdWV1ZQotCSAqLwotCXB1YmxpYyBJUFF1ZXVlQ29udHJvbCBnZXRRdWV1ZUNvbnRyb2woKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgcHJvY2Vzc2VzIGZyb20gdGhlIGpvYgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzZXMgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvY2Vzc2VzKENvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gcHJvY2Vzc2VzKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHVzZWQgdG8gbGF1bmNoIHRoaXMgam9iLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUE1hY2hpbmVDb250cm9sLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50Y29udHJvbHMvSVBNYWNoaW5lQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIzMTIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUE1hY2hpbmVDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQTWFjaGluZUNvbnRyb2wgZXh0ZW5kcyBJUEVsZW1lbnRDb250cm9sLCBJUE1hY2hpbmUgewotCi0JLyoqCi0JICogQWRkIGF0dHJpYnV0ZXMgdG8gYSBjb2xsZWN0aW9uIG9mIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBub2RlcyBjb2xsZWN0aW9uIG9mIElQTm9kZUNvbnRyb2xzCi0JICogQHBhcmFtIGF0dHJzIGFycmF5IG9mIGF0dHJpYnV0ZXMgdG8gYWRkIHRvIGVhY2ggbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5vZGVBdHRyaWJ1dGVzKENvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gbm9kZXMsIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpOwotCQotCS8qKgotCSAqIEFkZCBhIGNvbGxlY3Rpb24gb2Ygbm9kZXMgdG8gdGhlIG1hY2hpbmUuCi0JICogCi0JICogQHBhcmFtIG5vZGUgY29sbGVjdGlvbiBvZiBJUE5vZGVDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5vZGVzKENvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gbm9kZXMpOwotCQotCS8qKgotCSAqIEdldCB0aGUgbm9kZXMga25vd24gYnkgdGhpcyBtYWNoaW5lCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBub2RlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IGdldE5vZGVDb250cm9scygpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgY29sbGVjdGlvbiBvZiBub2RlcyBmcm9tIHRoaXMgbWFjaGluZQotCSAqIAotCSAqIEBwYXJhbSBub2RlcyB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlcyhDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVzKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUE5vZGVDb250cm9sLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50Y29udHJvbHMvSVBOb2RlQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI4MmRiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUE5vZGVDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBOb2RlQ29udHJvbCBleHRlbmRzIElQRWxlbWVudENvbnRyb2wsIElQTm9kZSB7Ci0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBvZiBwcm9jZXNzZXMgdG8gdGhlIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc2VzIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlcyhDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3Nlcyk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBhcmVudCBtYWNoaW5lIGZvciB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIHBhcmVudCBtYWNoaW5lCi0JICovCi0JcHVibGljIElQTWFjaGluZUNvbnRyb2wgZ2V0TWFjaGluZUNvbnRyb2woKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgcHJvY2Vzc2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gZ2V0UHJvY2Vzc0NvbnRyb2xzKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHByb2Nlc3NlcyBmcm9tIHRoaXMgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzZSB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9jZXNzZXMoQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQUHJvY2Vzc0NvbnRyb2wuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUFByb2Nlc3NDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjcwMDYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQUHJvY2Vzc0NvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQUHJvY2Vzc0NvbnRyb2wgZXh0ZW5kcyBJUEVsZW1lbnRDb250cm9sLCBJUFByb2Nlc3MgewotCi0JLyoqCi0JICogQWRkIGEgbWFwcGluZyBmcm9tIHRoaXMgcHJvY2VzcyB0byBhIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROb2RlKElQTm9kZSBub2RlKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHBhcmVudCBqb2IgZm9yIHRoaXMgcHJvY2VzcwotCSAqIAotCSAqIEByZXR1cm4gcGFyZW50IGpvYgotCSAqLwotCXB1YmxpYyBJUEpvYkNvbnRyb2wgZ2V0Sm9iQ29udHJvbCgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBtYXBwaW5nIGZyb20gdGhpcyBwcm9jZXNzIHRvIGEgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUFF1ZXVlQ29udHJvbC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQUXVldWVDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWU5ZDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQUXVldWVDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLQotcHVibGljIGludGVyZmFjZSBJUFF1ZXVlQ29udHJvbCBleHRlbmRzIElQRWxlbWVudENvbnRyb2wsIElQUXVldWUgewotCS8qKgotCSAqIEFkZCBhdHRyaWJ1dGVzIHRvIGEgY29sbGVjdGlvbiBvZiBqb2JzLgotCSAqIAotCSAqIEBwYXJhbSBqb2JzIGNvbGxlY3Rpb24gb2YgSUpvYkNvbnRyb2xzCi0JICogQHBhcmFtIGF0dHJzIGFycmF5IG9mIGF0dHJpYnV0ZXMgdG8gYWRkIHRvIGVhY2ggam9iCi0JICovCi0JcHVibGljIHZvaWQgYWRkSm9iQXR0cmlidXRlcyhDb2xsZWN0aW9uPElQSm9iQ29udHJvbD4gam9icywgSUF0dHJpYnV0ZTw/LD8sPz5bXSBhdHRycyk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGNvbGxlY3Rpb24gb2Ygam9icyB0byB0aGUgcXVldWUuCi0JICogCi0JICogQHBhcmFtIGpvYnMgY29sbGVjdGlvbiBvZiBJSm9iQ29udHJvbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRKb2JzKENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JzKTsKLQotCS8qKgotCSAqIExvb2t1cCBhIGpvYiBmcm9tIGEgam9iIElECi0JICogCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEByZXR1cm4gam9iIGFzc29jaWF0ZWQgd2l0aCB0aGUgam9iIElECi0JICovCi0JcHVibGljIElQSm9iQ29udHJvbCBnZXRKb2JDb250cm9sKFN0cmluZyBqb2JfaWQpOwotCQotCS8qKgotCSAqIEdldCBhbGwgdGhlIGpvYnMgaW4gdGhpcyBxdWV1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGpvYnMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGdldEpvYkNvbnRyb2xzKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGpvYiBmcm9tIHRoZSBxdWV1ZQotCSAqIAotCSAqIEBwYXJhbSBqb2JzIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUpvYnMoQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYnMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudGNvbnRyb2xzL0lQVW5pdmVyc2VDb250cm9sLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50Y29udHJvbHMvSVBVbml2ZXJzZUNvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2OWVmNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50Y29udHJvbHMvSVBVbml2ZXJzZUNvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci0KLS8qKgotICogQWRkcyB0aGUgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eSBvZiBhbiBJUEVsZW1lbnQgdG8gYW4gSVBVbml2ZXJzZQotICogCi0gKiBAYXV0aG9yIHJzcXJkCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQVW5pdmVyc2VDb250cm9sIGV4dGVuZHMgSVBVbml2ZXJzZSwgSVBFbGVtZW50Q29udHJvbCB7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1hbmFnZXIoSVJlc291cmNlTWFuYWdlciByZW1vdmVkTWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1hbmFnZXJzKElSZXNvdXJjZU1hbmFnZXJbXSByZW1vdmVkUk1zKTsKLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlTWFuYWdlcihJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBhZGRlZE1hbmFnZXIpOwotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNYW5hZ2VycyhJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIGFkZGVkTWFuYWdlcnMpOwotCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb250cm9sW10gZ2V0UmVzb3VyY2VNYW5hZ2VyQ29udHJvbHMoKTsKLQotCXB1YmxpYyBpbnQgZ2V0TmV4dFJlc291cmNlTWFuYWdlcklkKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50Y29udHJvbHMvSVJlc291cmNlTWFuYWdlckNvbnRyb2wuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmNTg4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRjb250cm9scy9JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9sczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGV4dGVuZHMgSVJlc291cmNlTWFuYWdlciwgSVBFbGVtZW50Q29udHJvbCB7Ci0JLyoqCi0JICogQWRkIGF0dHJpYnV0ZXMgdG8gYSBjb2xsZWN0aW9uIG9mIG1hY2hpbmVzLgotCSAqIAotCSAqIEBwYXJhbSBtYWNoaW5lcyBjb2xsZWN0aW9uIG9mIElQTWFjaGluZUNvbnRyb2wKLQkgKiBAcGFyYW0gYXR0cnMgYXJyYXkgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gZWFjaCBtYWNoaW5lCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWFjaGluZUF0dHJpYnV0ZXMoQ29sbGVjdGlvbjxJUE1hY2hpbmVDb250cm9sPiBtYWNoaW5lcywgSUF0dHJpYnV0ZTw/LD8sPz5bXSBhdHRycyk7Ci0JCi0JLyoqCi0JICogQWRkIGF0dHJpYnV0ZXMgdG8gYSBjb2xsZWN0aW9uIG9mIHF1ZXVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcXVldWVzIGNvbGxlY3Rpb24gb2YgSVBRdWV1ZUNvbnRyb2wKLQkgKiBAcGFyYW0gYXR0cnMgYXJyYXkgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gZWFjaCBxdWV1ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFF1ZXVlQXR0cmlidXRlcyhDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBxdWV1ZXMsIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpOwotCi0JLyoqCi0JICogRGlzYWJsZSBldmVudCBwcm9jZXNzaW5nLiBUaGUgUk0gc3RhdGUgd2lsbCBiZSBzZXQgdG8gU1VTUEVOREVELgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2FibGVFdmVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhZmVseSBkaXNwb3NlIG9mIHRoaXMgUmVzb3VyY2UgTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBFbmFibGUgZXZlbnQgcHJvY2Vzc2luZy4gVGhlIFJNIHN0YXRlIHdpbGwgYmUgc2V0IHRvIFNUQVJURUQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlRXZlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc291cmNlIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiByZXNvdXJjZSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpOwotCQotCS8qKgotCSAqIEdldCB0aGUgSVBNYWNoaW5lQ29udHJvbCBpbnRlcmZhY2VzIGZvciBtYWNoaW5lcyB0aGF0IHRoaXMgcmVzb3VyY2UgbWFuYWdlciBrbm93cyBhYm91dC4KLQkgKiAKLQkgKiBAcmV0dXJuIElQTWFjaGluZUNvbnRyb2wgaW50ZXJmYWNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTWFjaGluZUNvbnRyb2w+IGdldE1hY2hpbmVDb250cm9scygpOwotCQotCS8qKgotCSAqIEdldCB0aGUgSVBRdWV1ZUNvbnRyb2wgaW50ZXJmYWNlcyBmb3IgcXVldWVzIHRoYXQgdGhpcyByZXNvdXJjZSBtYW5hZ2VyIGtub3dzIGFib3V0LgotCSAqIAotCSAqIEByZXR1cm4gSVBRdWV1ZUNvbnRyb2wgaW50ZXJmYWNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBnZXRRdWV1ZUNvbnRyb2xzKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJlc291cmNlIG1hbmFnZXIuIFRoaXMgd2lsbCByZXBsYWNlIHRoZSBleGlzdGluZwotCSAqIGNvbmZpZ3VyYXRpb24gd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBUaGUgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsaW5nIHdpdGgKLQkgKiBhbnkgc2F2ZWQgc3RhdGUgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgdGhlIG5ldyBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUEVsZW1lbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDVlY2YxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQRWxlbWVudCBleHRlbmRzIElBZGFwdGFibGUgewotCQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0clZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKElBdHRyaWJ1dGU8Pyw/LD8+IGF0dHJWYWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyVmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlcyhJQXR0cmlidXRlPD8sPyw/PltdIGF0dHJWYWx1ZXMpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyRGVmCi0JICogQHJldHVybiBUaGUgYXR0cmlidXRlIGZvciB0aGlzIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICovCi0JcHVibGljIDxULCBBIGV4dGVuZHMgSUF0dHJpYnV0ZTxULEEsRD4sIEQgZXh0ZW5kcyBJQXR0cmlidXRlRGVmaW5pdGlvbjxULEEsRD4+Ci0JQSBnZXRBdHRyaWJ1dGUoRCBhdHRyRGVmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ckRlZklkCi0JICogQHJldHVybiBUaGUgYXR0cmlidXRlIGZvciB0aGlzIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICovCi0JcHVibGljIElBdHRyaWJ1dGU8Pyw/LD8+IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0ckRlZklkKTsKLQkKLQkvKioKLQkgKiBHZXQgYWxsIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgdGhhdCB0aGlzIGVsZW1lbnQga25vd3MgYWJvdXQuCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBJQXR0cmlidXRlRGVmaW5pdGlvbiBrZXlzCi0JICovCi0JcHVibGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldEF0dHJpYnV0ZUtleXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LD8sPz5bXSBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIGEgVUkuCi0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LD8sPz5bXSBnZXREaXNwbGF5QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5pcXVlIElEIGZvciB0aGlzIEVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJRCBmb3IgdGhpcyBFbGVtZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5hbWUgZm9yIHRoaXMgRWxlbWVudC4gQW4gRWxlbWVudCBuYW1lIGRvZXMgbm90IG5lZWQgdG8KLQkgKiBiZSB1bmlxdWUuIEl0IGlzIHByaW1hcmlseSB1c2VkIGZvciBVSSBkaXNwbGF5IHB1cnBvc2VzLgotCSAqIAotCSAqIEByZXR1cm4gVGhpcyBFbGVtZW50J3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyVmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0clZhbHVlKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgRWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBFbGVtZW50Ci0JICovCi0JcHVibGljIGludCBzaXplKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUEpvYi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvSVBKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiZTcwZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Kb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkxpc3RlbmVyOwotCi0KLS8qKgotICogQSBKb2IgY2FuIGJlIGEgcGFyYWxsZWwgb3Igc2VxdWVudGlhbCBqb2IsIGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUKLSAqIHByb2Nlc3NlcyB3aGljaCBhcmUgcmVzaWRpbmcgb24gTm9kZXMuIEpvYnMgbWF5IHNwYW4gTWFjaGluZXMsIHRob3VnaCB0aGlzCi0gKiBtYXkgbm90IGJlIHZlcnkgY29tbW9uIGluIHJlYWxpdHksIGJ1dCB0aGUgbW9kZWwgYWxsb3dzIGZvciB0aGlzLiBGaW5hbGx5LCBhCi0gKiBKb2IgbWF5IG9yIG1heSBub3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IHVzZXIsIGl0IGp1c3QgbWVhbnMgdGhhdCBpZiBpdCBpcwotICogdmlzaWJsZSB0aGVuIHRoaXMgdXNlciBjYW4gc2VlIHRoZSBKb2IgaW4gaGlzIG9yIGhlciBVbml2ZXJzZS4gVGhpcyBtYXkgaGF2ZQotICogcmFtaWZpY2F0aW9ucyBvbiB3aGF0IHRoZSB1c2VyIGNhbiBkbyB0byB0aGUgSm9iIGlmIGl0IGlzIG5vdCBvd25lZCBieSB0aGVtLgotICogCi0gKiBAYXV0aG9yIE5hdGhhbiBEZUJhcmRlbGViZW4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUEpvYiBleHRlbmRzIElQRWxlbWVudCB7Ci0JCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoaWxkIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZExpc3RlbmVyKElKb2JDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RuZXIgZm9yIGVsZW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaXN0ZW5lcihJSm9iTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogR2V0IHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0aGF0IHdhcyB1c2VkIHRvIGxhdW5jaCB0aGlzIGpvYgotCSAqIAotCSAqIEByZXR1cm4gbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogRmluZCBhIFByb2Nlc3MgaW4gdGhpcyBKb2IgYnkgaXRzIElELiBSZXR1cm5zIHRoZSBQcm9jZXNzCi0JICogb2JqZWN0IGlmIGZvdW5kLCBlbHNlIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NOdW1iZXIKLQkgKiAgICAgICAgICAgIFRoZSBQcm9jZXNzIG51bWJlciB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiBUaGUgUHJvY2VzcyBvYmplY3QgaWYgZm91bmQsIGVsc2UgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2VlIElQUHJvY2VzcwotCSAqLwotCXB1YmxpYyBJUFByb2Nlc3MgZ2V0UHJvY2Vzc0J5SWQoU3RyaW5nIGlkKTsKLQkKLQkvKioKLQkgKiBGaW5kcyBhIFByb2Nlc3MgaW4gYnkgaXRzIGludGVnZXIgaW5kZXguIEEgcHJvY2VzcyBpbmRleCBpcyBhCi0JICogemVyby1iYXNlZCBpbmRleCBvZiBhbGwgcHJvY2Vzc2VzIGluIHRoZSBqb2IuIFJldHVybnMgdGhlIFByb2Nlc3MKLQkgKiBvYmplY3QgaWYgZm91bmQsIGVsc2UgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbnVtYmVyCi0JICogICAgICAgICAgICBUaGUgUHJvY2VzcyBudW1iZXIgdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gVGhlIFByb2Nlc3Mgb2JqZWN0IGlmIGZvdW5kLCBlbHNlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElQUHJvY2VzcyBnZXRQcm9jZXNzQnlJbmRleChpbnQgbnVtYmVyKTsKLQotCS8qKgotCSAqIEZpbmRzIGEgUHJvY2VzcyBpbiBieSBpdHMgU3RyaW5nIGluZGV4LiBBIHByb2Nlc3MgaW5kZXggaXMgYQotCSAqIHplcm8tYmFzZWQgaW5kZXggb2YgYWxsIHByb2Nlc3NlcyBpbiB0aGUgam9iLiBSZXR1cm5zIHRoZSBQcm9jZXNzCi0JICogb2JqZWN0IGlmIGZvdW5kLCBlbHNlIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG51bWJlcgotCSAqICAgICAgICAgICAgVGhlIFByb2Nlc3MgaW5kZXggdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gVGhlIFByb2Nlc3Mgb2JqZWN0IGlmIGZvdW5kLCBlbHNlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElQUHJvY2VzcyBnZXRQcm9jZXNzQnlJbmRleChTdHJpbmcgbnVtYmVyKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBQcm9jZXNzZXMgY29tcHJpc2VkIGJ5IHRoaXMgSm9iLiBNaWdodCByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBQcm9jZXNzZXMgaGF2ZSB5ZXQgYmVlbiBhc3NpZ25lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBQcm9jZXNzZXMgaW4gdGhpcyBKb2IuCi0JICovCi0JcHVibGljIElQUHJvY2Vzc1tdIGdldFByb2Nlc3NlcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgcGFyZW50IHF1ZXVlIGZvciB0aGlzIGpvYi4KLQkgKiAKLQkgKiBAcmV0dXJuIElQUXVldWUKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGpvYgotCSAqIAotCSAqIEByZXR1cm4gam9iIHN0YXRlCi0JICovCi0JcHVibGljIEpvYkF0dHJpYnV0ZXMuU3RhdGUgZ2V0U3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZS9mYWxzZSByZWdhcmRpbmcgd2hldGhlciB0aGlzIEpvYiBpcyBhIGRlYnVnIGpvYiAKLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBqb2IgaXMgYSBkZWJ1ZyBqb2IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHByb2Nlc3NlcyBpbiB0aGUgam9iIGhhdmUgdGVybWluYXRlZAotCSAqIAotCSAqIEByZXR1cm4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgZm9yIGNoaWxkIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZExpc3RlbmVyKElKb2JDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgZWxlbWVudCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudExpc3RlbmVyKElKb2JMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGlzIGpvYiB0byBiZSBhIGRlYnVnIGpvYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYnVnKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUE1hY2hpbmUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZhZjEzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQTWFjaGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lQ2hpbGRMaXN0ZW5lcjsKLQotCi0vKioKLSAqIEludGVyZmFjZSBjbGFzcyBmb3IgYSBtb2RlbCBvZiBhIG1hY2hpbmUuIE1hY2hpbmVzIGFyZSBjb21wcmlzZWQgb2Ygbm9kZXMKLSAqIHdoaWNoIG1heSBoYXZlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZW0uIFRoZSBNYWNoaW5lIG1vZGVsIGlzIGludGVudGVkIHRvIGJlCi0gKiBhIGhhcmR3YXJlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYWNoaW5lIHdpdGggbWV0aG9kcyB0byBnZXQgaW5mb3JtYXRpb24gbGlrZQotICogdGhlIGFyY2hpdGVjdHVyZSBhbmQgcmVsYXRlZCBpbnRlcmVzdGVkIGJpdHMuIFRoZSBtb2RlbCBhbGxvd3MgZm9yIHRoZQotICogTWFjaGluZSB0byBoYXZlIGFueSBudW1iZXIgb2Ygbm9kZXMgKGV2ZW4gYSBzaW5nbGUgb25lIHRvIHJlcHJlc2VudCBhCi0gKiB1bmlwcm9jZXNzb3IgbWFjaGluZSkuCi0gKiAKLSAqIEBhdXRob3IgTmF0aGFuIERlQmFyZGVsZWJlbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQTWFjaGluZSBleHRlbmRzIElQRWxlbWVudCB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRMaXN0ZW5lcihJTWFjaGluZUNoaWxkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudExpc3RlbmVyKElNYWNoaW5lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoaXMgTWFjaGluZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhpcyBNYWNoaW5lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcmNoKCk7Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSBub2RlIGlkLCBhdHRlbXB0cyB0byBmaW5kIGl0IGFzIGEgTm9kZSBvYmplY3QKLQkgKiBjb250YWluZWQgaW4gdGhpcyBNYWNoaW5lLiBJZiBmb3VuZCwgdGhlIE5vZGUgb2JqZWN0IGlzIHJldHVybmVkLgotCSAqIE90aGVyd2lzZSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgSUQgdG8gZmluZCBpbiB0aGlzIE1hY2hpbmUKLQkgKiBAcmV0dXJuIFRoZSBOb2RlIG9iamVjdCBpZiBmb3VuZCwgZWxzZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJUE5vZGUgZ2V0Tm9kZUJ5SWQoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBOb2RlcyB0aGF0IHRoaXMgTWFjaGluZSBpcyBjb21wcmlzZWQgb2YuIE1heQotCSAqIHJldHVybiBudWxsIGlmIHRoZXJlIGFyZSBub25lLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIE5vZGVzIGluIHRoaXMgTWFjaGluZSAtIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZQotCSAqICAgICAgICAgbm9uZS4KLQkgKi8KLQlwdWJsaWMgSVBOb2RlW10gZ2V0Tm9kZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBtYWNoaW5lJ3MgcGFyZW50IHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBtYWNoaW5lCi0JICogCi0JICogQHJldHVybiBtYWNoaW5lIHN0YXRlCi0JICovCi0JcHVibGljIE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlIGdldFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZExpc3RlbmVyKElNYWNoaW5lQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSU1hY2hpbmVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhpcyBtYWNoaW5lLiBBdCB0aGlzIHRpbWUgdGhlcmUgYXJlIG5vCi0JICogc3RhbmRhcmRzIGZvciBob3cgdGhpcyBTdHJpbmcgc2hvdWxkIGJlIGZvcm1hdHRlZCBhbmQgdGhlIFN0cmluZyBpcwotCSAqIHJlYWxseSBvbmx5IHVzZWQgZm9yIHByaW50aW5nIG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIE1hY2hpbmUuCi0JICogCi0JICogQHBhcmFtIGFyY2gKLQkgKiAgICAgICAgICAgIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhpcyBtYWNoaW5lCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaChTdHJpbmcgYXJjaCk7Ci0JCi0JLyoqCi0JICogQ291bnRzIGFsbCB0aGUgTm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTWFjaGluZSBhbmQgcmV0dXJucyB0aGF0IGFzIGFuCi0JICogPGNvZGU+aW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgTm9kZXMgaW4gdGhpcyBNYWNoaW5lCi0JICovCi0JcHVibGljIGludCB0b3RhbE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUE5vZGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI2YmUxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Ob2RlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU5vZGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU5vZGVDaGlsZExpc3RlbmVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBOb2RlIGV4dGVuZHMgSVBFbGVtZW50IHsKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkTGlzdGVuZXIoSU5vZGVDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaXN0ZW5lcihJTm9kZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBNYWNoaW5lIHRoYXQgdGhpcyBOb2RlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0JICogCi0JICogQHJldHVybiBUaGUgTWFjaGluZSB0aGlzIE5vZGUgaXMgcGFydCBvZgotCSAqLwotCXB1YmxpYyBJUE1hY2hpbmUgZ2V0TWFjaGluZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgbnVtYmVyIG9mIHRoaXMgTm9kZSBhcyBhIFN0cmluZy4gCi0JICogTm9kZSBudW1iZXJzIGFyZSBvcHRpb25hbGx5IHN1cHBsaWVkIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBzbyBtYXkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFByb3ZpZGluZyBhIG5vZGUgbnVtYmVyIHdpbGwgZW5hYmxlIHRoZSBub2RlIG51bWJlcmluZyBydWxlciBpbiB0aGUgVUkuCi0JICogCi0JICogQHJldHVybiBUaGUgbm9kZSBudW1iZXIgb2YgdGhpcyBOb2RlIGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW55IHByb2Nlc3NlcyB0aGF0IGFyZSBsaW5rZWQgdG8gdGhpcyBub2RlCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgSVBQcm9jZXNzW10gZ2V0UHJvY2Vzc2VzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIG5vZGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgTm9kZUF0dHJpYnV0ZXMuU3RhdGUgZ2V0U3RhdGUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkTGlzdGVuZXIoSU5vZGVDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSU5vZGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvSVBQcm9jZXNzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUFByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiYzZiYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUFByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVByb2Nlc3NMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBJUFByb2Nlc3MgZXh0ZW5kcyBJUEVsZW1lbnQgewotCQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lciBmb3IgZWxlbWVudCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudExpc3RlbmVyKElQcm9jZXNzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGxvY2FsIGNhY2hlIG9mIHByb2Nlc3Mgb3V0cHV0Ci0JICovCi0JcHVibGljIHZvaWQgY2xlYXJPdXRwdXQoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV4aXQgY29kZSBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIGV4aXQgY29kZQotCSAqIHRoYXQgdGhlIHByb2Nlc3MgcmV0dXJuZWQgb24gdGVybWluYXRpb24uCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiB0aGUgZXhpdCBjb2RlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhpdENvZGUoKTsKLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBwYXJlbnQgam9iIHRoYXQgdGhpcyBwcm9jZXNzIGlzIGVuY29tcGFzc2VkIGJ5IAotCSAqIAotCSAqIEByZXR1cm4gcGFyZW50IGpvYgotCSAqLwotCXB1YmxpYyBJUEpvYiBnZXRKb2IoKTsKLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBub2RlIHRoYXQgdGhpcyBwcm9jZXNzIGlzIHJ1bm5pbmcgb24KLQkgKiAKLQkgKiBAcmV0dXJuIG5vZGUgdGhhdCB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIG9uCi0JICovCi0JcHVibGljIElQTm9kZSBnZXROb2RlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgUElEIGF0dHJpYnV0ZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIFBJRCBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBpZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBwcm9jZXNzIGluIGEgam9iLgotCSAqIAotCSAqIEByZXR1cm4gcHJvY2VzcyBpbmRleAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0luZGV4KCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGF0dHJEZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTYXZlZE91dHB1dChTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJEZWYpOwotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNpZ25hbCBuYW1lIGF0dHJpYnV0ZS4gSWYgdGhlIHByb2Nlc3Mgd2FzCi0JICogdGVybWluYXRlZCBieSBhIHNpZ25hbCwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgc2lnbmFsIHRoYXQgY2F1c2VkCi0JICogdGhlIHRlcm1pbmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHNpZ25hbCBuYW1lIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmFsTmFtZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3MKLQkgKiAKLQkgKiBAcmV0dXJuIHByb2Nlc3Mgc3RhdGUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUgZ2V0U3RhdGUoKTsKLQkKLQkvKioKLQkgKiBDaGVjayBpZiBwcm9jZXNzIGlzIHRlcm1pbmF0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgcHJvY2VzcyB0ZXJtaW5hdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGxpc3RlbmVyIGZvciBlbGVtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSVByb2Nlc3NMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzdGF0ZSBhdHRyaWJ1dGUgb24gdGhlIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGUgb2YgdGhlIHByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgdGVybWluYXRlZCBhdHRyaWJ1dGUgb24gdGhlIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gYm9vbGVhbiByZXByZXNlbnRpbmcgdGVybWluYXRpb24gc3RhdHVzIG9mIHRoZSBwcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVybWluYXRlZChib29sZWFuIGlzVGVybWluYXRlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQUXVldWUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwODhmZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9JUFF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlF1ZXVlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlTGlzdGVuZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBRdWV1ZSBleHRlbmRzIElQRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZExpc3RlbmVyKElRdWV1ZUNoaWxkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudExpc3RlbmVyKElRdWV1ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqb2JfaWQKLQkgKiBAcmV0dXJuIElQSm9iCi0JICovCi0JcHVibGljIElQSm9iIGdldEpvYkJ5SWQoU3RyaW5nIGpvYl9pZCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElQSm9iW10KLQkgKi8KLQlwdWJsaWMgSVBKb2JbXSBnZXRKb2JzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElSZXNvdXJjZU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBxdWV1ZQotCSAqIAotCSAqIEByZXR1cm4gcXVldWUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgUXVldWVBdHRyaWJ1dGVzLlN0YXRlIGdldFN0YXRlKCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRMaXN0ZW5lcihJUXVldWVDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSVF1ZXVlTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvSVBVbml2ZXJzZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvSVBVbml2ZXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJlY2Y2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lQVW5pdmVyc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzOwotCi0KLQotLyoqCi0gKiBBIFVuaXZlcnNlIHJlcHJlc2VudHMgYSB1c2VyJ3MgdmlldyBvZiB0aGUgd29ybGQuIEl0IGlzIGNvbXByaXNlZCBvZiBhIHNldCBvZgotICogUmVzb3VyY2UgTWFuYWdlcnMuCi0gKiAKLSAqIEBhdXRob3IgTmF0aGFuIERlQmFyZGVsZWJlbgotICogQHNlZSBJUmVzb3VyY2VNYW5hZ2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBVbml2ZXJzZSBleHRlbmRzIElQRWxlbWVudCB7Ci0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiBJUmVzb3VyY2VNYW5hZ2VyCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBpZCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBJUmVzb3VyY2VNYW5hZ2VyW10KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlcltdIGdldFJlc291cmNlTWFuYWdlcnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvSVJlc291cmNlTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvSVJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE1OTg2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL0lSZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlTWFuYWdlciBleHRlbmRzIElQRWxlbWVudCwKLQlJQWRhcHRhYmxlLCBJUmVzb3VyY2VNYW5hZ2VyTWVudUNvbnRyaWJ1dGlvbiB7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hpbGQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byBhZGQgdG8gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRMaXN0ZW5lcihJUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgZm9yIGV2ZW50cyByZWxhdGVkIHRvIHRoaXMgcmVzb3VyY2UgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgbGlzdGVuZXIgdG8gYWRkIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaXN0ZW5lcihJUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhdHRySWQuIFRoaXMgd2lsbAotCSAqIG9ubHkgY2hlY2sgZm9yIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyB0aGF0IHRoZSBSTSBrbm93cyBhYm91dC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cklkIElEIG9mIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbgotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIElECi0JICovCi0JcHVibGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PiBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uKFN0cmluZyBhdHRySWQpOwotCi0JLyoqCi0JICogR2V0IGEgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoaXMgUk0KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBkZXNjcmliaW5nIHRoZSBSTQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkKLQkvKioKLQkgKiBGaW5kIGEgbWFjaGluZSBvYmplY3QgdXNpbmcgaXRzIElECi0JICogCi0JICogQHBhcmFtIGlkIElEIG9mIHRoZSBtYWNoaW5lIG9iamVjdAotCSAqIEByZXR1cm4gbWFjaGluZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgSUQKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lIGdldE1hY2hpbmVCeUlkKFN0cmluZyBpZCk7Ci0JCi0JLyoqCi0JICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBtYWNoaW5lcyBrbm93biBieSB0aGlzIFJNCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBtYWNoaW5lcyBrbm93biBieSB0aGlzIFJNCi0JICovCi0JcHVibGljIElQTWFjaGluZVtdIGdldE1hY2hpbmVzKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBSTQotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG5hbWUgb2YgdGhlIFJNCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBGaW5kIGEgcXVldWUgb2JqZWN0IHVzaW5nIGl0cyBJRAotCSAqIAotCSAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgcXVldWUgb2JqZWN0Ci0JICogQHJldHVybiBxdWV1ZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgSUQKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZUJ5SWQoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIEZpbmEgYSBxdWV1ZSBvYmplY3QgdXNpbmcgaXRzIG5hbWUgYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIG5hbWUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIHF1ZXVlIG9iamVjdAotCSAqIEByZXR1cm4gcXVldWUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZUJ5TmFtZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHF1ZXVlcyBrbm93biBieSB0aGlzIFJNCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBxdWV1ZXMga25vd24gYnkgdGhpcyBSTQotCSAqLwotCXB1YmxpYyBJUFF1ZXVlW10gZ2V0UXVldWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlcgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJlc291cmNlIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTWFuYWdlcklkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoaXMgUk0KLSAgICAgKiAKLQkgKiBAcmV0dXJuIHN0YXRlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIFJNCi0JICovCi0JcHVibGljIFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUgZ2V0U3RhdGUoKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgbGlzdGVuZXIgZm9yIGNoaWxkIGV2ZW50cwotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZExpc3RlbmVyKElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBsaXN0ZW5lciBmb3IgZXZlbnRzIHJlbGF0aW5nIHRvIHRoaXMgcmVzb3VyY2UgbWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSVJlc291cmNlTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGVybWluYXRlZCBqb2JzIGZyb20gdGhlIGdpdmVuIHF1ZXVlLiBBIHRlcm1pbmF0ZWQgam9iIGlzIGRldGVybWluZWQKLQkgKiBieSBpdHMgc3RhdGUgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBxdWV1ZSBxdWV1ZSBmcm9tIHdoaWNoIGFsbCB0ZXJtaW5hdGVkIGpvYnMgd2lsbCBiZSByZW1vdmVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVGVybWluYXRlZEpvYnMoSVBRdWV1ZSBxdWV1ZSk7Ci0JCi0JLyoqCi0JICogU2h1dGRvd24gdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RhcnQgdXAgdGhlIHJlc291cmNlIG1hbmFnZXIuIFRoaXMgY291bGQgcG90ZW50aWFsbHkgdGFrZSBhIGxvbmcgdGltZSAob3IgZm9yZXZlciksCi0JICogcGFydGljdWxhcmx5IGlmIHRoZSBSTSBpcyBsb2NhdGVkIG9uIGEgcmVtb3RlIHN5c3RlbS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIHRvIGluZGljYXRlIHN0YXJ0dXAgcHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdWJtaXQgYSBqb2IuIFRoZSBhdHRyaWJ1dGUgbWFuYWdlciBtdXN0IGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgZm9yCi0JICogYSBzdWNjZXNzZnVsIGpvYiBsYXVuY2ggKGUuZy4gdGhlIHF1ZXVlLCBldGMuKS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIGFmdGVyIGFuIElOZXdKb2JFdmVudCBoYXMgYmVlbiByZWNlaXZlZCBjb25maXJtaW5nIHRoYXQKLQkgKiB0aGUgam9iIGhhcyBiZWVuIHN1Ym1pdHRlZC4gCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBzdWJtaXQgdGhlIGpvYi4gQ2FuIGJlIG51bGwuCi0JICogQHBhcmFtIGF0dHJNZ3IgYXR0cmlidXRlIG1hbmFnZXIgY29udGFpbmluZyB0aGUgam9iIGxhdW5jaCBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYSBqb2Igb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3VibWl0dGVkIGpvYiBvciBudWxsIGlmIHRoZSBzdWJtaXNzaW9uIGZhaWxlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUEpvYiBzdWJtaXRKb2IoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyLCAKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3VibWl0IGEgam9iIHdpdGggdGhlIHN1cHBsaWVkIHN1Ym1pc3Npb24gSUQuIFRoaXMgSUQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlCi0JICogam9iIHdoZW4gYW4gSU5ld0pvYkV2ZW50IGlzIHJlY2VpdmVkLgotCSAqIAotCSAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuIEl0IGlzIHVwIHRvIHRoZSBjYWxsaW5nIHRocmVhZCB0byBjaGVjayBmb3IKLQkgKiBzdWNjZXNzZnVsIHN1Ym1pc3Npb24gYnkgcmVnaXN0ZXJpbmcgYSBsaXN0ZW5lciBmb3IgSU5ld0pvYkV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBzdWJJZCBqb2Igc3VibWlzc2lvbiBJRAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGxhdW5jaCBjb25maWd1cmF0aW9uIHVzZWQgdG8gc3VibWl0IHRoZSBqb2IuIENhbiBiZSBudWxsLgotCSAqIEBwYXJhbSBhdHRyTWdyIGF0dHJpYnV0ZSBtYW5hZ2VyIGNvbnRhaW5pbmcgdGhlIGpvYiBsYXVuY2ggYXR0cmlidXRlcwotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdWJtaXRKb2IoU3RyaW5nIHN1YklkLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgam9iLiBUaGUgYWN0aW9uIHRoaXMgdGFrZXMgZGVwZW5kcyBvbiB0aGUgUk0gaW1wbGVtZW50YXRpb24gYW5kCi0JICogdGhlIHN0YXRlIG9mIHRoZSBqb2IuIEZvciBxdWV1ZWQgYnV0IG5vdCBydW5uaW5nIGpvYnMsIHRoaXMgd291bGQgYmUgZXF1aXZhbGVudAotCSAqIHRvIGNhbmNlbGluZyB0aGUgam9iLiBGb3IgcnVubmluZyBqb2JzLCB0aGlzIHdvdWxkIG1lYW4gaGFsdGluZyBpdHMgZXhlY3V0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBqb2Igam9iIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGpvYiB0byBiZSBjYW5jZWxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVKb2IoSVBKb2Igam9iKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldCBhIHVuaXF1ZSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyByZXNvdXJjZQotCSAqIG1hbmFnZXIgcGVyc2lzdGVudGx5IGJldHdlZW4gUFRQIGludm9jYXRpb25zLiBVc2VkIGJ5IHRoZSAKLQkgKiBSZXNvdXJjZU1hbmFnZXJQZXJzaXN0ZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyByZXByZXNlbnRpbmcgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZWZhMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL0VsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLlJhbmdlU2V0OwotCi0vKioKLSAqIEFuIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIG1haW50YWlucyBhIG1hcHBpbmcgYmV0d2VlbiByYW5nZXMgb2YgZWxlbWVudCBJRCdzIGFuZAotICogYSBzZXQgb2YgYXR0cmlidXRlcyBtYW5hZ2VkIGJ5IGFuIEF0dHJpYnV0ZU1hbmFnZXIuCi0gKiAKLSAqIEBhdXRob3IgZ3JlZwotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIHsKLQlwcml2YXRlIE1hcDxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4JbWFwOwotCQotCXB1YmxpYyBFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpIHsKLQkJdGhpcy5tYXAgPSBuZXcgSGFzaE1hcDxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVNYW5hZ2VyKFJhbmdlU2V0IGlkcywgQXR0cmlidXRlTWFuYWdlciBhdHRyKSB7Ci0JCW1hcC5wdXQoaWRzLCBhdHRyKTsKLQl9Ci0JCi0JcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0cmlidXRlTWFuYWdlcihJbnRlZ2VyIGlkKSB7Ci0JCXJldHVybiBtYXAuZ2V0KGlkKTsKLQl9Ci0JCi0JcHVibGljIFJhbmdlU2V0W10gZ2V0RWxlbWVudElkcygpIHsKLQkJcmV0dXJuIG1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBSYW5nZVNldFttYXAuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBTZXQ8TWFwLkVudHJ5PFJhbmdlU2V0LCBBdHRyaWJ1dGVNYW5hZ2VyPj4gZ2V0RW50cnlTZXQoKSB7Ci0JCXJldHVybiBtYXAuZW50cnlTZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL0VsZW1lbnRBdHRyaWJ1dGVzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL0VsZW1lbnRBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWExYTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9FbGVtZW50QXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotCi0KLS8qKgotICogSm9iIGF0dHJpYnV0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRBdHRyaWJ1dGVzIHsKLQkvKgotCSAqIFByZWRlZmluZSBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0Ci0JICogdGhlIFVJIGtub3dzIGFib3V0LgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0lEID0gImlkIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gaWRBdHRyaWJ1dGVEZWZpbml0aW9uID0gCi0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEFUVFJfSUQsICJJRCIsICJVbmlxdWUgSUQgb2YgZWxlbWVudCIsIGZhbHNlLCAiIik7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIG5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uID0gCi0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEFUVFJfTkFNRSwgIk5hbWUiLCAiTmFtZSBvZiBlbGVtZW50IiwgdHJ1ZSwgIiIpOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldElkQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGlkQXR0cmlidXRlRGVmaW5pdGlvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gbmFtZUF0dHJpYnV0ZURlZmluaXRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXsKLQkJCQlpZEF0dHJpYnV0ZURlZmluaXRpb24sIAotCQkJCW5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uCi0JCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvRXJyb3JBdHRyaWJ1dGVzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL0Vycm9yQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmNiNmRmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvRXJyb3JBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIEVycm9yIGF0dHJpYnV0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVycm9yQXR0cmlidXRlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfQVRUUl9JRCA9ICJlcnJvckNvZGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0FUVFJfSUQgPSAiZXJyb3JNc2ciOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gY29kZUF0dHJEZWYgPSAKLQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKENPREVfQVRUUl9JRCwgIkVycm9yIENvZGUiLCAKLQkJCQkiQ29kZSBhc3NpZ25lZCB0byB0aGlzIGVycm9yIiwgdHJ1ZSwgMCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIG1zZ0F0dHJEZWYgPSAKLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oTUVTU0FHRV9BVFRSX0lELCAiRXJyb3IgTWVzc2FnZSIsCi0JCQkJIlRleHQgb2YgZXJyb3IgbWVzc2FnZSIsIHRydWUsICIiKTsKLQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0Q29kZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBjb2RlQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0TXNnQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG1zZ0F0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXsKLQkJCQljb2RlQXR0ckRlZiwgCi0JCQkJbXNnQXR0ckRlZgotCQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL0pvYkF0dHJpYnV0ZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvSm9iQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGNiMDkyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvSm9iQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIEpvYiBhdHRyaWJ1dGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2JBdHRyaWJ1dGVzIHsKLQlwdWJsaWMgZW51bSBTdGF0ZSB7Ci0JCVBFTkRJTkcsCi0JCVNUQVJURUQsCi0JCVJVTk5JTkcsCi0JCVRFUk1JTkFURUQsCi0JCVNVU1BFTkRFRCwKLQkJRVJST1IsCi0JCVVOS05PV04KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElPX0ZPUldBUkRJTkdfTk9ORSA9IDB4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJT19GT1JXQVJESU5HX1NURElOID0gMHgwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJT19GT1JXQVJESU5HX1NURE9VVCA9IDB4MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU9fRk9SV0FSRElOR19TVERFUlIgPSAweDA0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19BUkdTX0FUVFJfSUQgPSAiZGVidWdBcmdzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfRVhFQ19OQU1FX0FUVFJfSUQgPSAiZGVidWdFeGVjTmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0VYRUNfUEFUSF9BVFRSX0lEID0gImRlYnVnRXhlY1BhdGgiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19GTEFHX0FUVFJfSUQgPSAiZGVidWciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19TVE9QX0lOX01BSU5fQVRUUl9JRCA9ICJkZWJ1Z1N0b3BJbk1haW4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfQVRUUl9JRCA9ICJlbnYiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVDX05BTUVfQVRUUl9JRCA9ICJleGVjTmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNfUEFUSF9BVFRSX0lEID0gImV4ZWNQYXRoIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9fRk9SV0FSRElOR19BVFRSX0lEID0gImlvRm9yd2FyZGluZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVEX0JZX1BUUF9GTEFHX0FUVFJfSUQgPSAibGF1bmNoZWRCeVBUUCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9JRF9BVFRSX0lEID0gImpvYklkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNX1BST0NTX0FUVFJfSUQgPSAiam9iTnVtUHJvY3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HX0FSR1NfQVRUUl9JRCA9ICJwcm9nQXJncyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVVFSURfQVRUUl9JRCA9ICJxdWV1ZUlkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfQVRUUl9JRCA9ICJqb2JTdGF0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQklEX0FUVFJfSUQgPSAiam9iU3ViSWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSSURfQVRUUl9JRCA9ICJ1c2VySWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLSU5HX0RJUl9BVFRSX0lEID0gIndvcmtpbmdEaXIiOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZGVidWdBcmdzQXR0ckRlZiA9IAotCQluZXcgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4oREVCVUdfQVJHU19BVFRSX0lELCBERUJVR19BUkdTX0FUVFJfSUQsCi0JCQkJIkRlYnVnZ2VyIEFyZ3VtZW50cyIsIHRydWUsIG51bGwpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBkZWJ1Z0V4ZWNOYW1lQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihERUJVR19FWEVDX05BTUVfQVRUUl9JRCwgIkRlYnVnZ2VyIEV4ZWN1dGFibGUgTmFtZSIsCi0JCQkJIk5hbWUgb2YgZGVidWdnZXIgZXhlY3V0YWJsZSIsIHRydWUsICIiKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZGVidWdFeGVjUGF0aEF0dHJEZWYgPSAKLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oREVCVUdfRVhFQ19QQVRIX0FUVFJfSUQsICJEZWJ1Z2dlciBFeGVjdXRhYmxlIFBhdGgiLAotCQkJCSJQYXRoIHRvIGRlYnVnZ2VyIGV4ZWN1dGFibGUiLCB0cnVlLCAiIik7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBkZWJ1Z0ZsYWdBdHRyRGVmID0gCi0JCW5ldyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbihERUJVR19GTEFHX0FUVFJfSUQsIERFQlVHX0ZMQUdfQVRUUl9JRCwgCi0JCQkJIkRlYnVnIEZsYWciLCB0cnVlLCBmYWxzZSk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBkZWJ1Z1N0b3BJbk1haW5BdHRyRGVmID0gCi0JCW5ldyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbihERUJVR19TVE9QX0lOX01BSU5fQVRUUl9JRCwgIlN0b3AgSW4gTWFpbiIsIAotCQkJCSJEZWJ1Z2dlciBzaG91bGQgc3RvcCBhcHBsaWNhdGlvbiBpbiBtYWluIiwgdHJ1ZSwgdHJ1ZSk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlbnZBdHRyRGVmID0gCi0JCW5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPihFTlZfQVRUUl9JRCwgIkVudmlyb25tZW50IiwKLQkJCQkiRW52aXJvbm1lbnQgdG8gYmUgc3VwcGxpZWQgdG8gZXhlY3V0YWJsZSBvbiBsYXVuY2giLCB0cnVlLCBudWxsKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZXhlY05hbWVBdHRyRGVmID0gCi0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEVYRUNfTkFNRV9BVFRSX0lELCAiRXhlY3V0YWJsZSBOYW1lIiwKLQkJCQkiTmFtZSBvZiBleGVjdXRhYmxlIHRvIGJlIGxhdW5jaGVkIiwgdHJ1ZSwgIiIpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBleGVjUGF0aEF0dHJEZWYgPSAKLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oRVhFQ19QQVRIX0FUVFJfSUQsICJFeGVjdXRhYmxlIFBhdGgiLAotCQkJCSJQYXRoIG9mIGV4ZWN1dGFibGUgdG8gYmUgbGF1bmNoZWQiLCB0cnVlLCAiIik7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBpb0ZvcndhcmRpbmdBdHRyRGVmID0gCi0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihJT19GT1JXQVJESU5HX0FUVFJfSUQsICJJL08gRm9yd2FyZGluZyIsIAotCQkJCSJTcGVjaWZ5IHdoaWNoIEkvTyBjaGFubmVscyB0byBmb3dhcmQiLCBmYWxzZSwgSU9fRk9SV0FSRElOR19TVERPVVQpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24gbGF1bmNoZWRCeVBUUEZsYWdBdHRyRGVmID0gCi0JCW5ldyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbihMQVVOQ0hFRF9CWV9QVFBfRkxBR19BVFRSX0lELCAiTGF1bmNoZWQgQnkgUFRQIiwgCi0JCQkJIkFwcGxpY2F0aW9uIHdhcyBsYXVuY2hlZCBieSBQVFAiLCB0cnVlLCBmYWxzZSk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYklkQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihKT0JfSURfQVRUUl9JRCwgIkpvYiBJRCIsCi0JCQkJIkpvYiBJRCB0aGF0IGNvbW1hbmQgYXBwbGllcyB0byIsIHRydWUsICIiKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bVByb2NzQXR0ckRlZiA9IAotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTlVNX1BST0NTX0FUVFJfSUQsICJQcm9jcyIsIAotCQkJCSJOdW1iZXIgb2YgcHJvY2Vzc2VzIHRvIGxhdW5jaCIsIHRydWUsIDEpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gcHJvZ0FyZ3NBdHRyRGVmID0gCi0JCW5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPihQUk9HX0FSR1NfQVRUUl9JRCwgIlByb2dyYW0gQXJndW1lbnRzIiwKLQkJCQkiQ29tbWFuZC1saW5lIGFyZ3VtZW50cyBzdXBwbGllZCB0byBleGVjdXRhYmxlIiwgdHJ1ZSwgbnVsbCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIHF1ZXVlSWRBdHRyRGVmID0gCi0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFFVRVVFSURfQVRUUl9JRCwgUVVFVUVJRF9BVFRSX0lELCAKLQkJCQkiSm9iIHN1Ym1pc3Npb24gcXVldWUgSUQiLCB0cnVlLCAiIik7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IHN0YXRlQXR0ckRlZiA9IAotCQluZXcgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+KFNUQVRFX0FUVFJfSUQsICJTdGF0ZSIsICJTdGF0ZSBvZiBhIGpvYiIsIAotCQkJCXRydWUsIFN0YXRlLlNUQVJURUQpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdWJJZEF0dHJEZWYgPSAKLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oU1VCSURfQVRUUl9JRCwgIkpvYiBTdWJtaXNzaW9uIElEIiwKLQkJCQkiVGVtcG9yYXJ5IElEIHVzZWQgZm9yIGpvYiBzdWJtaXNzaW9uIiwgZmFsc2UsICIiKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gdXNlcklkQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihVU0VSSURfQVRUUl9JRCwgIlVzZXIiLAotCQkJCSJVc2VyIElEIiwgdHJ1ZSwgIiIpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiB3b3JraW5nRGlyQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihXT1JLSU5HX0RJUl9BVFRSX0lELCAiV29ya2luZyBEaXJlY3RvcnkiLAotCQkJCSJXb3JraW5nIGRpcmVjdG9yeSB3aGVyZSBleGVjdXRhYmxlIHdpbGwgcnVuIiwgdHJ1ZSwgIiIpOwotCi0KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uIGdldERlYnVnRmxhZ0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBkZWJ1Z0ZsYWdBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZ2V0RGVidWdnZXJBcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZGVidWdBcmdzQXR0ckRlZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldERlYnVnZ2VyRXhlY3V0YWJsZU5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZGVidWdFeGVjTmFtZUF0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldERlYnVnZ2VyRXhlY3V0YWJsZVBhdGhBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZGVidWdFeGVjUGF0aEF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24gZ2V0RGVidWdnZXJTdG9wSW5NYWluRmxhZ0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBkZWJ1Z1N0b3BJbk1haW5BdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltdewotCQkJCWRlYnVnQXJnc0F0dHJEZWYsCi0JCQkJZGVidWdFeGVjTmFtZUF0dHJEZWYsCi0JCQkJZGVidWdFeGVjUGF0aEF0dHJEZWYsCi0JCQkJZGVidWdGbGFnQXR0ckRlZiwKLQkJCQlkZWJ1Z1N0b3BJbk1haW5BdHRyRGVmLAotCQkJCWVudkF0dHJEZWYsCi0JCQkJZXhlY05hbWVBdHRyRGVmLCAKLQkJCQlleGVjUGF0aEF0dHJEZWYsCi0JCQkJaW9Gb3J3YXJkaW5nQXR0ckRlZiwKLQkJCQlqb2JJZEF0dHJEZWYsCi0JCQkJbGF1bmNoZWRCeVBUUEZsYWdBdHRyRGVmLAotCQkJCW51bVByb2NzQXR0ckRlZiwKLQkJCQlwcm9nQXJnc0F0dHJEZWYsCi0JCQkJcXVldWVJZEF0dHJEZWYsCi0JCQkJc3RhdGVBdHRyRGVmLCAKLQkJCQlzdWJJZEF0dHJEZWYsIAotCQkJCXVzZXJJZEF0dHJEZWYsCi0JCQkJd29ya2luZ0RpckF0dHJEZWYsCi0JCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZ2V0RW52aXJvbm1lbnRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZW52QXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RXhlY3V0YWJsZU5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZXhlY05hbWVBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRFeGVjdXRhYmxlUGF0aEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBleGVjUGF0aEF0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRMYXVuY2hlZEJ5UFRQRmxhZ0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBsYXVuY2hlZEJ5UFRQRmxhZ0F0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRJT0ZvcndhcmRpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gaW9Gb3J3YXJkaW5nQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0Sm9iSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gam9iSWRBdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE51bWJlck9mUHJvY2Vzc2VzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG51bVByb2NzQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldFByb2dyYW1Bcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gcHJvZ0FyZ3NBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRRdWV1ZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHF1ZXVlSWRBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IGdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRlQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0U3ViSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gc3ViSWRBdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0VXNlcklkQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHVzZXJJZEF0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldFdvcmtpbmdEaXJlY3RvcnlBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gd29ya2luZ0RpckF0dHJEZWY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9NYWNoaW5lQXR0cmlidXRlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9NYWNoaW5lQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRjNTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvTWFjaGluZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIE1hY2hpbmUgYXR0cmlidXRlcwotICovCi1wdWJsaWMgY2xhc3MgTWFjaGluZUF0dHJpYnV0ZXMgewotCXB1YmxpYyBlbnVtIFN0YXRlIHsKLQkJVVAsCi0JCURPV04sCi0JCUFMRVJULAotCQlFUlJPUiwKLQkJVU5LTk9XTiwKLQl9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0FUVFJfSUQgPSAibWFjaGluZVN0YXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNTk9ERVNfQVRUUl9JRCA9ICJudW1Ob2RlcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxTdGF0ZT4gc3RhdGVBdHRyRGVmID0gCi0gICAgICAgIG5ldyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxTdGF0ZT4oU1RBVEVfQVRUUl9JRCwgInN0YXRlIiwgIk1hY2hpbmUgU3RhdGUiLAotICAgICAgICAgICAgICAgIHRydWUsIFN0YXRlLlVOS05PV04pOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bU5vZGVzQXR0ckRlZiA9IAotICAgICAgICBuZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTlVNTk9ERVNfQVRUUl9JRCwgIm5vZGVzIiwgIk51bWJlciBvZiBOb2RlcyIsCi0gICAgICAgICAgICAgICAgdHJ1ZSwgMCk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxTdGF0ZT4gZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gc3RhdGVBdHRyRGVmOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE51bU5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bU5vZGVzQXR0ckRlZjsKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXtzdGF0ZUF0dHJEZWYsIG51bU5vZGVzQXR0ckRlZn07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9NZXNzYWdlQXR0cmlidXRlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9NZXNzYWdlQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTlmZDdjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvTWVzc2FnZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBFcnJvciBhdHRyaWJ1dGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQXR0cmlidXRlcyB7Ci0JcHVibGljIGVudW0gTGV2ZWwgewotCQlGQVRBTCwKLQkJRVJST1IsCi0JCVdBUk5JTkcsCi0JCUlORk8sCi0JCURFQlVHLAotCQlVTkRFRklORUQKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9BVFRSX0lEID0gIm1lc3NhZ2VMZXZlbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfQVRUUl9JRCA9ICJtZXNzYWdlQ29kZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVRUUl9JRCA9ICJtZXNzYWdlVGV4dCI7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxMZXZlbD4gbGV2ZWxBdHRyRGVmID0gCi0JCW5ldyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxMZXZlbD4oTEVWRUxfQVRUUl9JRCwgIk1lc3NhZ2UgTGV2ZWwiLCAKLQkJCQkiTGV2ZWwgb2YgdGhlIG1lc3NhZ2UiLCB0cnVlLCBMZXZlbC5VTkRFRklORUQpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gY29kZUF0dHJEZWYgPSAKLQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKENPREVfQVRUUl9JRCwgIk1lc3NhZ2UgQ29kZSIsIAotCQkJCSJDb2RlIGFzc2lnbmVkIHRvIHRoaXMgbWVzc2FnZSIsIHRydWUsIDApOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiB0ZXh0QXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihURVhUX0FUVFJfSUQsICJNZXNzYWdlIFRleHQiLAotCQkJCSJUZXh0IG9mIG1lc3NhZ2UiLCB0cnVlLCAiIik7Ci0KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPExldmVsPiBnZXRMZXZlbEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBsZXZlbEF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0Q29kZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBjb2RlQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0VGV4dEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0ZXh0QXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltdewotCQkJCWxldmVsQXR0ckRlZiwgCi0JCQkJY29kZUF0dHJEZWYsIAotCQkJCXRleHRBdHRyRGVmCi0JCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvTm9kZUF0dHJpYnV0ZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvTm9kZUF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1OTkxMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL05vZGVBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBOb2RlIGF0dHJpYnV0ZXMKLSAqLwotcHVibGljIGNsYXNzIE5vZGVBdHRyaWJ1dGVzIHsKLQlwdWJsaWMgZW51bSBTdGF0ZSB7Ci0JCVVQLAotCQlET1dOLAotCQlFUlJPUiwKLQkJVU5LTk9XTiwKLQl9OwotCQotCXB1YmxpYyBlbnVtIEV4dHJhU3RhdGUgewotCQlVU0VSX0FMTE9DX0VYQ0wsCi0JCVVTRVJfQUxMT0NfU0hBUkVELAotCQlPVEhFUl9BTExPQ19FWENMLAotCQlPVEhFUl9BTExPQ19TSEFSRUQsCi0JCVJVTk5JTkdfUFJPQ0VTUywKLQkJRVhJVEVEX1BST0NFU1MsCi0JCU5PTkUsCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9BVFRSX0lEID0gIm5vZGVTdGF0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NUQVRFX0FUVFJfSUQgPSAibm9kZUV4dHJhU3RhdGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVJfQVRUUl9JRCA9ICJub2RlTnVtYmVyIjsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPFN0YXRlPiBzdGF0ZUF0dHJEZWYgPSAKLQkJbmV3IEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPFN0YXRlPihTVEFURV9BVFRSX0lELCAiTm9kZSBTdGF0ZSIsICJTdGF0ZSBvZiB0aGUgbm9kZSIsCi0JCQkJdHJ1ZSwgU3RhdGUuVU5LTk9XTik7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248RXh0cmFTdGF0ZT4gZXh0cmFTdGF0ZUF0dHJEZWYgPSAKLQkJbmV3IEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPEV4dHJhU3RhdGU+KEVYVFJBX1NUQVRFX0FUVFJfSUQsICJFeHRyYSBOb2RlIFN0YXRlIiwKLQkJCQkiRXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBub2RlIChlLmcuIGpvYiBzY2hlZHVsZXIgc3RhdGUpIiwgdHJ1ZSwgRXh0cmFTdGF0ZS5OT05FKTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1BdHRyRGVmID0gCi0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihOVU1CRVJfQVRUUl9JRCwgIk5vZGUgTnVtYmVyIiwgCi0JCQkJIlplcm8tYmFzZWQgaW5kZXggb2Ygbm9kZSIsIHRydWUsIDApOwotCQotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IGdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRlQXR0ckRlZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxFeHRyYVN0YXRlPiBnZXRFeHRyYVN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGV4dHJhU3RhdGVBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0TnVtYmVyQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG51bUF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117c3RhdGVBdHRyRGVmLCBleHRyYVN0YXRlQXR0ckRlZiwgbnVtQXR0ckRlZn07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9Qcm9jZXNzQXR0cmlidXRlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9Qcm9jZXNzQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI5ZjkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvUHJvY2Vzc0F0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotCi0KLS8qKgotICogUHJvY2VzcyBhdHRyaWJ1dGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQXR0cmlidXRlcyB7Ci0JcHVibGljIGVudW0gU3RhdGUgewotCQlTVEFSVElORywKLQkJUlVOTklORywKLQkJRVhJVEVELAotCQlFWElURURfU0lHTkFMTEVELAotCQlTVVNQRU5ERUQsCi0JCUVSUk9SLAotCQlVTktOT1dOCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9BVFRSX0lEID0gInByb2Nlc3NTdGF0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJRF9BVFRSX0lEID0gInByb2Nlc3NQSUQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWElUX0NPREVfQVRUUl9JRCA9ICJwcm9jZXNzRXhpdENvZGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQUxfTkFNRV9BVFRSX0lEID0gInByb2Nlc3NTaWduYWxOYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQVRUUl9JRCA9ICJwcm9jZXNzSW5kZXgiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVERPVVRfQVRUUl9JRCA9ICJwcm9jZXNzU3Rkb3V0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RERVJSX0FUVFJfSUQgPSAicHJvY2Vzc1N0ZGVyciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVJRF9BVFRSX0lEID0gInByb2Nlc3NOb2RlSWQiOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IHN0YXRlQXR0ckRlZiA9IAotCQluZXcgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+KFNUQVRFX0FUVFJfSUQsICJTdGF0ZSIsCi0JCQkJIkV4ZWN1dGlvbiBzdGF0ZSBvZiBhIHByb2Nlc3MiLCB0cnVlLCBTdGF0ZS5TVEFSVElORyk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gcGlkQXR0ckRlZiA9IAotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oUElEX0FUVFJfSUQsICJQSUQiLCAKLQkJCQkiT3BlcmF0aW5nIHN5c3RlbSBwcm9jZXNzIElEIiwgdHJ1ZSwgMCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZXhpdENvZGVBdHRyRGVmID0gCi0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihFWElUX0NPREVfQVRUUl9JRCwgIkV4aXQgQ29kZSIsIAotCQkJCSJPcGVyYXRpbmcgc3lzdGVtIGV4aXQgY29kZSIsIHRydWUsIDApOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGluZGV4QXR0ckRlZiA9IAotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oSU5ERVhfQVRUUl9JRCwgIkluZGV4IiwgCi0JCQkJIlplcm8tYmFzZWQgaW5kZXggb2YgcHJvY2VzcyAoZS5nLiBNUEkgcmFuaykiLCB0cnVlLCAwKTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIHNpZ25hbE5hbWVBdHRyRGVmID0gCi0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNJR05BTF9OQU1FX0FUVFJfSUQsICJFeGl0IFNpZ25hbCIsIAotCQkJCSJOYW1lIG9mIHNpZ25hbCB0aGF0IGNhdXNlZCBwcm9jZXNzIHRlcm1pbmF0aW9uIiwgdHJ1ZSwgIiIpOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gc3Rkb3V0QXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihTVERPVVRfQVRUUl9JRCwgIlByb2Nlc3MgU3Rkb3V0IiwgCi0JCQkJIlN0YW5kYXJkIG91dHB1dCBmcm9tIHByb2Nlc3MiLCBmYWxzZSwgIiIpOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gc3RkZXJyQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihTVERFUlJfQVRUUl9JRCwgIlByb2Nlc3MgU3RkZXJyIiwgCi0JCQkJIlN0YW5kYXJkIGVycm9yIGZyb20gcHJvY2VzcyIsIGZhbHNlLCAiIik7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBub2RlSWRBdHRyRGVmID0gCi0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKE5PREVJRF9BVFRSX0lELCAiUHJvY2VzcyBOb2RlIElEIiwgCi0JCQkJIk5vZGUgdGhhdCB0aGlzIHByb2Nlc3MgaXMgcnVubmluZyBvbiIsIHRydWUsICIiKTsKLQkKLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPFN0YXRlPiBnZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBzdGF0ZUF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0UElEQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHBpZEF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0RXhpdENvZGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZXhpdENvZGVBdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldEluZGV4QXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGluZGV4QXR0ckRlZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldFNpZ25hbE5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gc2lnbmFsTmFtZUF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRTdGRvdXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gc3Rkb3V0QXR0ckRlZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldFN0ZGVyckF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBzdGRlcnJBdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0Tm9kZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG5vZGVJZEF0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117Ci0JCQkJc3RhdGVBdHRyRGVmLCAKLQkJCQlwaWRBdHRyRGVmLCAKLQkJCQlleGl0Q29kZUF0dHJEZWYsIAotCQkJCWluZGV4QXR0ckRlZiwgCi0JCQkJc2lnbmFsTmFtZUF0dHJEZWYsIAotCQkJCXN0ZG91dEF0dHJEZWYsCi0JCQkJc3RkZXJyQXR0ckRlZiwKLQkJCQlub2RlSWRBdHRyRGVmCi0JCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvUXVldWVBdHRyaWJ1dGVzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL1F1ZXVlQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM0MmMzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2F0dHJpYnV0ZXMvUXVldWVBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotCi0KLS8qKgotICogUXVldWUgYXR0cmlidXRlcwotICovCi1wdWJsaWMgY2xhc3MgUXVldWVBdHRyaWJ1dGVzIHsKLQlwdWJsaWMgZW51bSBTdGF0ZSB7Ci0JCU5PUk1BTCwKLQkJQ09MTEVDVElORywKLQkJRFJBSU5JTkcsCi0JCVNUT1BQRUQKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0FUVFJfSUQgPSAicXVldWVTdGF0ZSI7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxTdGF0ZT4gc3RhdGVBdHRyRGVmID0gCi0JCW5ldyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxTdGF0ZT4oU1RBVEVfQVRUUl9JRCwgInN0YXRlIiwgIlF1ZXVlIFN0YXRlIiwKLQkJCQl0cnVlLCBTdGF0ZS5OT1JNQUwpOwotCQotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IGdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRlQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltde3N0YXRlQXR0ckRlZn07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvYXR0cmlidXRlcy9SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL1Jlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZmUyYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9hdHRyaWJ1dGVzL1Jlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotCi0KLS8qKgotICogUmVzb3VyY2UgbWFuYWdlciBhdHRyaWJ1dGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzIHsKLQlwdWJsaWMgZW51bSBTdGF0ZSB7Ci0JCVNUQVJUSU5HLAotCQlTVEFSVEVELAotCQlTVE9QUElORywKLQkJU1RPUFBFRCwKLQkgICAgU1VTUEVOREVELAotCQlFUlJPUgotCX0KLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVEVfQVRUUl9JRCA9ICJybVN0YXRlIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ19BVFRSX0lEID0gInJtRGVzY3JpcHRpb24iOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSTUlEX0FUVFJfSUQgPSAicm1JRCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfQVRUUl9JRCA9ICJybVR5cGUiOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IHN0YXRlQXR0ckRlZiA9IAotCQluZXcgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+KFNUQVRFX0FUVFJfSUQsICJzdGF0ZSIsIAotCQkJCSJSTSBTdGF0ZSIsIHRydWUsIFN0YXRlLlNUT1BQRUQpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZGVzY0F0dHJEZWYgPSAKLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oREVTQ19BVFRSX0lELCAiZGVzY3JpcHRpb24iLCAKLQkJCQkiUk0gZGVzY3JpcHRpb24iLCB0cnVlLCAiIik7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBybUlEQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihSTUlEX0FUVFJfSUQsICJSTSBJRCIsIAotCQkJCSJSTSB1bmlxdWUgaWRlbnRpZmllciIsIGZhbHNlLCAiIik7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiB0eXBlQXR0ckRlZiA9IAotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihUWVBFX0FUVFJfSUQsICJ0eXBlIiwgCi0JCQkJIlJNIHR5cGUiLCBmYWxzZSwgInVuc3BlY2lmaWVkIik7Ci0JCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlRGVmaW5pdGlvbjxTdGF0ZT4gZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gc3RhdGVBdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RGVzY3JpcHRpb25BdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZGVzY0F0dHJEZWY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRSbUlEQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHJtSURBdHRyRGVmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0VHlwZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0eXBlQXR0ckRlZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXtzdGF0ZUF0dHJEZWYsIGRlc2NBdHRyRGVmLCB0eXBlQXR0ckRlZiwgcm1JREF0dHJEZWZ9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWRKb2JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lDaGFuZ2VkSm9iRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhZGM1ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWRKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gb25lIG9yIG1vcmUgam9icyBoYXZlIGNoYW5nZWQuIEl0IGlzCi0gKiBhIGJ1bGsgZXZlbnQgdGhhdCBpcyBzZW50IHRvIGNoaWxkIGxpc3RlbmVycyBvbiB0aGUgc291cmNlIHF1ZXVlLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoYW5nZWRKb2JFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBqb2JzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICogCi0JICogQHJldHVybiB0aGUgY2hhbmdlZCBqb2JzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBKb2I+IGdldEpvYnMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc291cmNlIGV2ZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWRNYWNoaW5lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JQ2hhbmdlZE1hY2hpbmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA2MjYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JQ2hhbmdlZE1hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBhdHRyaWJ1dGVzIG9uIG9uZSBvciBtb3JlIG1hY2hpbmVzIGhhdmUgY2hhbmdlZC4gSXQgaXMKLSAqIGEgYnVsayBldmVudCB0aGF0IGlzIHNlbnQgdG8gY2hpbGQgbGlzdGVuZXJzIG9uIHRoZSBzb3VyY2UgcmVzb3VyY2UgbWFuYWdlci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2hhbmdlZE1hY2hpbmVFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjaGFuZ2VkIG1hY2hpbmVzCi0JICogCi0JICogQHJldHVybiB0aGUgY2hhbmdlZCBtYWNoaW5lcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTWFjaGluZT4gZ2V0TWFjaGluZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZXZlbnQgc291cmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWROb2RlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JQ2hhbmdlZE5vZGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzYxNDRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JQ2hhbmdlZE5vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gb25lIG9yIG1vcmUgbm9kZXMgaGF2ZSBjaGFuZ2VkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIHNvdXJjZSBtYWNoaW5lLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZUNoaWxkTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2hhbmdlZE5vZGVFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBub2RlcyB0aGF0IGhhdmUgY2hhbmdlZAotCSAqIAotCSAqIEByZXR1cm4gbm9kZXMgdGhhdCBoYXZlIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUE5vZGU+IGdldE5vZGVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUE1hY2hpbmUgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWRQcm9jZXNzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JQ2hhbmdlZFByb2Nlc3NFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMyYTY1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JQ2hhbmdlZFByb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gb25lIG9yIG1vcmUgcHJvY2Vzc2VzIGhhdmUgY2hhbmdlZC4gSXQgaXMKLSAqIGEgYnVsayBldmVudCB0aGF0IGlzIHNlbnQgdG8gY2hpbGQgbGlzdGVuZXJzIG9uIHRoZSBzb3VyY2Ugam9iLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDaGFuZ2VkUHJvY2Vzc0V2ZW50IHsKLQkvKioKLQkgKiBHZXQgdGhlIHByb2Nlc3NlcyB0aGF0IGhhdmUgY2hhbmdlZAotCSAqIAotCSAqIEByZXR1cm4gcHJvY2Vzc2VzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQuIFRoaXMgZXZlbnQgY2FuIGNvbWUgZnJvbSBlaXRoZXIgYSBqb2IKLQkgKiBvciBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUEVsZW1lbnQgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWRRdWV1ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSUNoYW5nZWRRdWV1ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjExMzUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lDaGFuZ2VkUXVldWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXR0cmlidXRlcyBvbiBvbmUgb3IgbW9yZSBxdWV1ZXMgaGF2ZSBjaGFuZ2VkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIHNvdXJjZSByZXNvdXJjZSBtYW5hZ2VyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDaGFuZ2VkUXVldWVFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjaGFuZ2VkIHF1ZXVlcwotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoYW5nZWQgcXVldWVzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBRdWV1ZT4gZ2V0UXVldWVzKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGV2ZW50IHNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRTb3VyY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lKb2JDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lKb2JDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIxNWU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JSm9iQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgYXR0cmlidXRlcyBvbiBhIGpvYiBjaGFuZ2UuIEl0IGlzIHNlbnQgdG8KLSAqIGVsZW1lbnQgbGlzdGVuZXJzIG9uIHRoZSBqb2IuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKb2JDaGFuZ2VFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICogCi0JICogQHJldHVybiBjaGFuZ2VkIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUEpvYiBnZXRTb3VyY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lNYWNoaW5lQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JTWFjaGluZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWMyMjYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lNYWNoaW5lQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gYSBtYWNoaW5lIGNoYW5nZS4gSXQgaXMgc2VudCB0bwotICogZWxlbWVudCBsaXN0ZW5lcnMgb24gdGhlIG1hY2hpbmUuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWFjaGluZUNoYW5nZUV2ZW50IHsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIElQTWFjaGluZSBnZXRTb3VyY2UoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0cmlidXRlcygpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld0pvYkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld0pvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdiZmUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOZXdKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgbmV3IGpvYnMgYXJlIGNyZWF0ZWQuIEl0IGlzCi0gKiBhIGJ1bGsgZXZlbnQgdGhhdCBpcyBzZW50IHRvIGNoaWxkIGxpc3RlbmVycyBvbiB0aGUgc291cmNlIHF1ZXVlLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5ld0pvYkV2ZW50IHsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGpvYnMgdGhhdCBoYXZlIGJlZW4gbmV3bHkgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgam9icwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQSm9iPiBnZXRKb2JzKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRTb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JTmV3TWFjaGluZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld01hY2hpbmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQyZjBjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JTmV3TWFjaGluZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgbmV3IG1hY2hpbmVzIGFyZSBjcmVhdGVkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIHNvdXJjZSByZXNvdXJjZSBtYW5hZ2VyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdNYWNoaW5lRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgbWFjaGluZXMgdGhhdCBoYXZlIGJlZW4gbmV3bHkgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgbWFjaGluZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUE1hY2hpbmU+IGdldE1hY2hpbmVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld05vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOZXdOb2RlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmMTYwZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld05vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgbmV3IG5vZGVzIGFyZSBjcmVhdGVkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIHNvdXJjZSBtYWNoaW5lLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZUNoaWxkTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmV3Tm9kZUV2ZW50IHsKLQkJCi0JLyoqCi0JICogR2V0IHRoZSBub2RlcyB0aGF0IGhhdmUgYmVlbiBuZXdseSBjcmVhdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoYW5nZWQgbm9kZQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTm9kZT4gZ2V0Tm9kZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUE1hY2hpbmUgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld1Byb2Nlc3NFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOZXdQcm9jZXNzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNmM5Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSU5ld1Byb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgbmV3IHByb2Nlc3NlcyBhcmUgY3JlYXRlZC4gSXQgaXMKLSAqIGEgYnVsayBldmVudCB0aGF0IGlzIHNlbnQgdG8gY2hpbGQgbGlzdGVuZXJzIG9uIHRoZSBzb3VyY2UgZWxlbWVudC4gU2luY2UKLSAqIHByb2Nlc3NlcyBiZWxvbmcgdG8gYSBqb2IsIGJ1dCBjYW4gYWxzbyBiZSBhc3NvY2lhdGVkIHdpdGggYSBub2RlLCB0aGUKLSAqIHNvdXJjZSBlbGVtZW50IGNhbiBiZSBlaXRoZXIgYSBqb2Igb3Igbm9kZS4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkNoaWxkTGlzdGVuZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdQcm9jZXNzRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgbmV3IHByb2Nlc3NlcwotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUFByb2Nlc3M+IGdldFByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudC4gU2luY2UgYSBwcm9jZXNzIG5vcm1hbGx5IGhhcyB0d28gcGFyZW50cywKLQkgKiBhIGpvYiBhbmQgYSBub2RlLCBoaXMgd2lsbCByZXR1cm4gdGhlIHNvdXJjZSB0aGF0IGdlbmVyYXRlZCB0aGUKLQkgKiBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIElQRWxlbWVudCBnZXRTb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JTmV3UXVldWVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOZXdRdWV1ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTAxNjAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOZXdRdWV1ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIG9uZSBvciBtb3JlIG5ldyBxdWV1ZXMgYXJlIGNyZWF0ZWQuIEl0IGlzCi0gKiBhIGJ1bGsgZXZlbnQgdGhhdCBpcyBzZW50IHRvIGNoaWxkIGxpc3RlbmVycyBvbiB0aGUgc291cmNlIHJlc291cmNlIG1hbmFnZXIuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5ld1F1ZXVlRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgcXVldWVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcXVldWUKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUFF1ZXVlPiBnZXRRdWV1ZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOb2RlQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JTm9kZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWM4YTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lOb2RlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gYSBub2RlIGNoYW5nZS4gSXQgaXMgc2VudCB0bwotICogZWxlbWVudCBsaXN0ZW5lcnMgb24gdGhlIG5vZGUuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTm9kZUNoYW5nZUV2ZW50IHsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGNoYW5nZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGNoYW5nZWQgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIElQTm9kZSBnZXRTb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JUHJvY2Vzc0NoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNTFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JUHJvY2Vzc0NoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBhdHRyaWJ1dGVzIG9uIGEgcHJvY2VzcyBjaGFuZ2UuIEl0IGlzIHNlbnQgdG8KLSAqIGVsZW1lbnQgbGlzdGVuZXJzIG9uIHRoZSBwcm9jZXNzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUHJvY2Vzc0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NDaGFuZ2VFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICogCi0JICogQHJldHVybiBjaGFuZ2VkIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUFByb2Nlc3MgZ2V0U291cmNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JUXVldWVDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lRdWV1ZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmVhMWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lRdWV1ZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgYXR0cmlidXRlcyBvbiBhIHF1ZXVlIGNoYW5nZS4gSXQgaXMgc2VudCB0bwotICogZWxlbWVudCBsaXN0ZW5lcnMgb24gdGhlIHF1ZXVlLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVMaXN0ZW5lcgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVF1ZXVlQ2hhbmdlRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlcyB0aGF0IGhhdmUgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZUpvYkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZUpvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTY3YzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZW1vdmVKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgam9icyBhcmUgcmVtb3ZlZC4gSXQgaXMKLSAqIGEgYnVsayBldmVudCB0aGF0IGlzIHNlbnQgdG8gY2hpbGQgbGlzdGVuZXJzIG9uIHRoZSBzb3VyY2UgcXVldWUuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVtb3ZlSm9iRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgcmVtb3ZlZCBqb2JzCi0JICogCi0JICogQHJldHVybiB0aGUgcmVtb3ZlZCBqb2JzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBKb2I+IGdldEpvYnMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZXZlbnQgc291cmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZU1hY2hpbmVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZW1vdmVNYWNoaW5lRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlMzgwNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZU1hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIG9uZSBvciBtb3JlIG1hY2hpbmVzIGFyZSByZW1vdmVkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIHNvdXJjZSByZXNvdXJjZSBtYW5hZ2VyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdmVNYWNoaW5lRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgbWFjaGluZXMgdGhhdCB3ZXJlIHJlbW92ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG1hY2hpbmVzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBNYWNoaW5lPiBnZXRNYWNoaW5lcygpOwotCQotCS8qKgotCSAqIEdldCB0aGUgZXZlbnQgc291cmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZU5vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZW1vdmVOb2RlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMmUxYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZU5vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgbm9kZXMgYXJlIHJlbW92ZWQuIEl0IGlzCi0gKiBhIGJ1bGsgZXZlbnQgdGhhdCBpcyBzZW50IHRvIGNoaWxkIGxpc3RlbmVycyBvbiB0aGUgc291cmNlIG1hY2hpbmUuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdmVOb2RlRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgbm9kZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoYW5nZWQgbm9kZQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTm9kZT4gZ2V0Tm9kZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lIGdldFNvdXJjZSgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZW1vdmVQcm9jZXNzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOWQ2NDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZW1vdmVQcm9jZXNzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIG9uZSBvciBtb3JlIHByb2Nlc3NlcyBhcmUgcmVtb3ZlZC4gSXQgaXMKLSAqIGEgYnVsayBldmVudCB0aGF0IGlzIHNlbnQgdG8gY2hpbGQgbGlzdGVuZXJzIG9uIHRoZSBzb3VyY2UgZWxlbWVudC4gU2luY2UKLSAqIHByb2Nlc3NlcyBiZWxvbmcgdG8gYSBqb2IsIGJ1dCBjYW4gYWxzbyBiZSBhc3NvY2lhdGVkIHdpdGggYSBub2RlLCB0aGUKLSAqIHNvdXJjZSBlbGVtZW50IGNhbiBiZSBlaXRoZXIgYSBqb2Igb3Igbm9kZS4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkNoaWxkTGlzdGVuZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdmVQcm9jZXNzRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgcmVtb3ZlZCBwcm9jZXNzZXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIHByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUFByb2Nlc3M+IGdldFByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBldmVudCBzb3VyY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIElQRWxlbWVudCBnZXRTb3VyY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZW1vdmVRdWV1ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZVF1ZXVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NGNjZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlbW92ZVF1ZXVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9yIG1vcmUgcXVldWVzIGFyZSByZW1vdmVkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIHNvdXJjZSByZXNvdXJjZSBtYW5hZ2VyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdmVRdWV1ZUV2ZW50IHsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHJlbW92ZWQgcXVldWVzCi0JICogCi0JICogQHJldHVybiB0aGUgcmVtb3ZlZCBxdWV1ZQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUXVldWU+IGdldFF1ZXVlcygpOwotCQotCS8qKgotCSAqIEdldCB0aGUgZXZlbnQgc291cmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBldmVudAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlc291cmNlTWFuYWdlckNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlc291cmNlTWFuYWdlckNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzFkMzQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZXNvdXJjZU1hbmFnZXJDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gYSByZXNvdXJjZSBtYW5hZ2VyIGNoYW5nZS4gSXQgaXMgc2VudCB0bwotICogZWxlbWVudCBsaXN0ZW5lcnMgb24gdGhlIHJlc291cmNlIG1hbmFnZXIuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZU1hbmFnZXJDaGFuZ2VFdmVudCB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjaGFuZ2VkIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcmV0dXJuIGNoYW5nZWQgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGV2ZW50IHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JSVJlc291cmNlTWFuYWdlciBnZXRTb3VyY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmZmY5ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9ldmVudHMvSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50IHsKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JSVJlc291cmNlTWFuYWdlciBnZXRTb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9JUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjMTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvZXZlbnRzL0lSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLQotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIGEgam9iIHN1Ym1pc3Npb24gZmFpbHMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQgewotCQotCS8qKgotCSAqIEdldCB0aGUgam9iIHN1Ym1pc3Npb24gaWQgdGhhdCB3YXMgdXNlZCBpbiB0aGUgb3JpZ2luYWwgc3VibWlzc2lvbgotCSAqIAotCSAqIEByZXR1cm4gaWQgam9iIHN1Ym1pc3Npb24gaWQgb2YgZmFpbGVkIHN1Ym1pc3Npb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpvYlN1Ym1pc3Npb25JZCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvbGlzdGVuZXJzL0lKb2JDaGlsZExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSUpvYkNoaWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyY2I5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSUpvYkNoaWxkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHJzcXJkCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSm9iQ2hpbGRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdQcm9jZXNzRXZlbnQgZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVQcm9jZXNzRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSUpvYkxpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSUpvYkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDFhMDMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvbGlzdGVuZXJzL0lKb2JMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUpvYkNoYW5nZUV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElKb2JMaXN0ZW5lciB7Ci0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJSm9iQ2hhbmdlRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU1hY2hpbmVDaGlsZExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU1hY2hpbmVDaGlsZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTViMzMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvbGlzdGVuZXJzL0lNYWNoaW5lQ2hpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZU5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld05vZGVFdmVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgcnNxcmQKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYWNoaW5lQ2hpbGRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZE5vZGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdOb2RlRXZlbnQgZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVOb2RlRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU1hY2hpbmVMaXN0ZW5lci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvbGlzdGVuZXJzL0lNYWNoaW5lTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2ZDg0Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU1hY2hpbmVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU1hY2hpbmVDaGFuZ2VFdmVudDsKLQotcHVibGljIGludGVyZmFjZSBJTWFjaGluZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElNYWNoaW5lQ2hhbmdlRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU5vZGVDaGlsZExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU5vZGVDaGlsZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YmUwMjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvbGlzdGVuZXJzL0lOb2RlQ2hpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZFByb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1Byb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZVByb2Nlc3NFdmVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgcnNxcmQKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQ2hpbGRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogSGFuZGxlIElDaGFuZ2VkUHJvY2Vzc0V2ZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBIYW5kbGUgSU5ld1Byb2Nlc3NFdmVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1Byb2Nlc3NFdmVudCBlKTsKLQotCS8qKgotCSAqIEhhbmRsZSAKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVQcm9jZXNzRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU5vZGVMaXN0ZW5lci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZWxlbWVudHMvbGlzdGVuZXJzL0lOb2RlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5MjEyNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSU5vZGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5vZGVDaGFuZ2VFdmVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlTGlzdGVuZXIgewotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5vZGVDaGFuZ2VFdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUHJvY2Vzc0xpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSVByb2Nlc3NMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjZiYjgzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUHJvY2Vzc0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUHJvY2Vzc0NoYW5nZUV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzTGlzdGVuZXIgewotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb2Nlc3NDaGFuZ2VFdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUXVldWVDaGlsZExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSVF1ZXVlQ2hpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA0YTdkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUXVldWVDaGlsZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50OwotCi0KLS8qKgotICogQGF1dGhvciByc3FyZAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVF1ZXVlQ2hpbGRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZEpvYkV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld0pvYkV2ZW50IGUpOwotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVtb3ZlSm9iRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSVF1ZXVlTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUXVldWVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTg3MmZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUXVldWVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVF1ZXVlQ2hhbmdlRXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVF1ZXVlTGlzdGVuZXIgewotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVF1ZXVlQ2hhbmdlRXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODUwNmRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZVF1ZXVlRXZlbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHJzcXJkCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3TWFjaGluZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1F1ZXVlRXZlbnQgZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkTWFjaGluZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRRdWV1ZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZU1hY2hpbmVFdmVudCBlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVF1ZXVlRXZlbnQgZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2VsZW1lbnRzL2xpc3RlbmVycy9JUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NDE1My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9lbGVtZW50cy9saXN0ZW5lcnMvSVJlc291cmNlTWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIgewotCS8qKgotCSAqIEhhbmRsZSBhIHJlc291cmNlIG1hbmFnZXIgYXR0cmlidXRlIGNoYW5nZSBldmVudAotCSAqIAotCSAqIEBwYXJhbSBlIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlc291cmNlTWFuYWdlckNoYW5nZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEhhbmRsZSBnZW5lcmFsIHJlc291cmNlIG1hbmFnZXIgZXJyb3IKLQkgKiAKLQkgKiBAcGFyYW0gZSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50IGUpOwotCQotCS8qKgotCSAqIEhhbmRsZSBqb2Igc3VibWlzc2lvbiBlcnJvcgotCSAqIAotCSAqIEBwYXJhbSBlIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQgZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2V2ZW50cy9JQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9ldmVudHMvSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNjZjM0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2V2ZW50cy9JQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF0dHJpYnV0ZXMgb24gb25lIG9yIG1vcmUgcmVzb3VyY2UgbWFuYWdlcnMgaGF2ZSBjaGFuZ2VkLiBJdCBpcwotICogYSBidWxrIGV2ZW50IHRoYXQgaXMgc2VudCB0byBjaGlsZCBsaXN0ZW5lcnMgb24gdGhlIG1vZGVsIG1hbmFnZXIuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudCB7Ci0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBtYW5hZ2VycyB0aGF0IGhhdmUgY2hhbmdlZAotCSAqIAotCSAqIEByZXR1cm4gcmVzb3VyY2UgbWFuYWdlcnMgdGhhdCBoYXZlIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUmVzb3VyY2VNYW5hZ2VyPiBnZXRSZXNvdXJjZU1hbmFnZXJzKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogCi0JICogQHJldHVybiBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICovCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0U291cmNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2V2ZW50cy9JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL2V2ZW50cy9JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1NTI1Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9ldmVudHMvSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLQotcHVibGljIGludGVyZmFjZSBJTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQgewotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSU1vZGVsTWFuYWdlciBnZXRTb3VyY2UoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9ldmVudHMvSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9ldmVudHMvSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzY4NzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvZXZlbnRzL0lSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50IHsKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0U291cmNlKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2NvcmUvbGlzdGVuZXJzL0lNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9saXN0ZW5lcnMvSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3ZGE0Ni4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9saXN0ZW5lcnMvSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCBlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50IGUpOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS9yZXNvdXJjZXMvRmlsZVN0b3JhZ2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3Jlc291cmNlcy9GaWxlU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU2ZTEzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3Jlc291cmNlcy9GaWxlU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVTdG9yYWdlIGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JSVBhdGggcGF0aDsKLQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0KLQlwdWJsaWMgRmlsZVN0b3JhZ2UoSVBhdGggcGF0aCl7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCXB1YmxpYyBGaWxlU3RvcmFnZShJbnB1dFN0cmVhbSBpbiwgSVBhdGggcGF0aCl7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMuaW4gPSBpbjsKLQl9ICAgICAgICAKLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsKSB7CQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLnRvRmlsZSgpKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgZS50b1N0cmluZygpLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVN0b3JhZ2UjZ2V0RnVsbFBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU3RvcmFnZSNnZXROYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU3RvcmFnZSNpc1JlYWRPbmx5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQHNlZSBJU3RvcmFnZSNpc1JlYWRPbmx5KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJU3RvcmFnZSkgewotCQkJSVBhdGggcD0gZ2V0RnVsbFBhdGgoKTsKLQkJCUlQYXRoIG9ialBhdGg9ICgoSVN0b3JhZ2Upb2JqKS5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiBvYmpQYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIHAuZXF1YWxzKG9ialBhdGgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS91dGlsL0JpdExpc3QuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvQml0TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q3ZDg2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvQml0TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBCaXRMaXN0IHsKLQlwcml2YXRlIGJ5dGVbXQliaXRzOwotCXByaXZhdGUgaW50CQluQml0czsKLQlwcml2YXRlIGludAkJbkJ5dGVzOwotCS8qKiBDYWNoZSB0aGUgaGFzaCBjb2RlIGZvciB0aGUgQml0TGlzdCAqLwotCXByaXZhdGUgaW50IGhhc2ggPSAwOwotCi0JcHJpdmF0ZSB2b2lkIGluaXQoaW50IG5iaXRzKSB0aHJvd3MgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gewotCQlpZiAobmJpdHMgPCAwKSAKLQkJCXRocm93IG5ldyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKG5iaXRzID09IDApIHsKLQkJCXRoaXMubkJpdHMgPSAwOwotCQkJdGhpcy5uQnl0ZXMgPSAwOwotCQl9IGVsc2UgewotCQkJdGhpcy5uQml0cyA9IG5iaXRzOwotCQkJdGhpcy5uQnl0ZXMgPSAoKG5iaXRzLTEpID4+IDMpICsgMTsKLQkJCXRoaXMuYml0cyA9IG5ldyBieXRlW3RoaXMubkJ5dGVzXTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQml0TGlzdChpbnQgbmJpdHMsIFN0cmluZyBzdHIpIHsKLQkJdGhpcy5pbml0KG5iaXRzKTsKLQkJdGhpcy5mcm9tU3RyaW5nKHN0cik7Ci0JfQotCQotCXB1YmxpYyBCaXRMaXN0KGludCBuYml0cykgewotCQl0aGlzLmluaXQobmJpdHMpOwotCX0KLQkKLQlwcml2YXRlIEJpdExpc3QoaW50IG5iaXRzLCBieXRlW10gYml0cykgewotCQl0aGlzLmluaXQobmJpdHMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubkJ5dGVzOyBpKyspCi0JCQl0aGlzLmJpdHNbaV0gPSBiaXRzW2ldOwotCX0KLQkKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5CaXRzOwotCX0KLQkKLQlwcml2YXRlIGludCBjb3VudEJpdHMoYnl0ZSBiKSB7Ci0JCWludCBuID0gMDsKLQkJCi0JCXdoaWxlIChiICE9IDApIHsKLQkJCW4rKzsKLQkJCWIgJj0gKGItMSk7Ci0JCX0KLQkJCi0JCXJldHVybiBuOwotCX0KLQkKLQlwdWJsaWMgaW50IGNhcmRpbmFsaXR5KCkgewotCQlpbnQgbiA9IDA7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubkJ5dGVzOyBpKyspIHsKLQkJCW4gKz0gY291bnRCaXRzKHRoaXMuYml0c1tpXSk7Ci0JCX0KLQkJCi0JCXJldHVybiBuOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcihpbnQgaW5kZXgpIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKLQkJaWYgKGluZGV4ID49IHRoaXMubkJpdHMgfHwgaW5kZXggPCAwKQotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJCi0JCWludCBiID0gYnl0ZVBvcyhpbmRleCk7Ci0JCXRoaXMuYml0c1tiXSAmPSB+KGJ5dGUpKDEgPDwgYml0SW5CeXRlKGluZGV4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoaW50W10gaW5kZXhzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhzLmxlbmd0aDsgaSsrKQotCQkJdGhpcy5jbGVhcihpbmRleHNbaV0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4KSB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7Ci0JCWlmIChpbmRleCA+PSB0aGlzLm5CaXRzIHx8IGluZGV4IDwgMCkKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLQkJaW50IGIgPSBieXRlUG9zKGluZGV4KTsKLQkJdGhpcy5iaXRzW2JdIHw9IChieXRlKSgxIDw8IGJpdEluQnl0ZShpbmRleCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChpbnRbXSBpbmRleHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleHMubGVuZ3RoOyBpKyspCi0JCQl0aGlzLnNldChpbmRleHNbaV0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXQoaW50IGZyb20sIGludCB0bykgewotCQlpZiAoZnJvbSA+PSB0aGlzLm5CaXRzIHx8IGZyb20gPCAwIHx8IHRvID4gdGhpcy5uQml0cyB8fCBmcm9tID49IHRvKQotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJCi0JCWludCBsYXN0ID0gdG8gLSAxOyAKLQkJCi0JCS8qCi0JCSAqIERlYWwgd2l0aCBzaW5nbGUgYml0IGNhc2UKLQkJICovCi0JCWlmIChmcm9tID09IGxhc3QpIHsKLQkJCXRoaXMuc2V0KGZyb20pOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgcDEgPSBieXRlUG9zKGZyb20pOwotCQlpbnQgcDIgPSBieXRlUG9zKGxhc3QpOwotCQlpbnQgYjEgPSBiaXRJbkJ5dGUoZnJvbSk7Ci0JCWludCBiMiA9IGJpdEluQnl0ZShsYXN0KTsKLQkJCi0JCS8qCi0JCSAqIE5lZWQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgaWYgJ2Zyb20nIGFuZCAndG8nIHJlZmVyCi0JCSAqIHRvIGEgc2luZ2xlIGJ5dGUKLQkJICovCi0JCWlmIChwMSA9PSBwMikgewotCQkJYnl0ZSBtYXNrID0gKGJ5dGUpICgweGZmID4+ICg3IC0gYjIpKTsKLQkJCXRoaXMuYml0c1twMV0gPSAoYnl0ZSkgKG1hc2sgJiAoMHhmZiA8PCBiMSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlieXRlIGhpTWFzayA9ICAoYnl0ZSkgKDB4ZmYgPj4gKDcgLSBiMikpOwotCQlieXRlIGxvd01hc2sgPSAoYnl0ZSkgKDB4ZmYgPDwgYjEpOwotCQkKLQkJZm9yIChpbnQgcCA9IHAxKzE7IHAgPCBwMjsgcCsrKQotCQkJdGhpcy5iaXRzW3BdID0gKGJ5dGUpIDB4ZmY7Ci0JCQotCQl0aGlzLmJpdHNbcDFdIHw9IGxvd01hc2s7Ci0JCXRoaXMuYml0c1twMl0gfD0gaGlNYXNrOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXQoaW50IGluZGV4KSB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7Ci0JCWlmIChpbmRleCA+PSB0aGlzLm5CaXRzIHx8IGluZGV4IDwgMCkKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0KLQkJaW50IGIgPSBieXRlUG9zKGluZGV4KTsKLQkJYnl0ZSBtYXNrID0gKGJ5dGUpKDEgPDwgYml0SW5CeXRlKGluZGV4KSk7Ci0JCXJldHVybiAodGhpcy5iaXRzW2JdICYgbWFzaykgPT0gbWFzazsKLQl9Ci0JCi0JcHVibGljIGludCBuZXh0U2V0Qml0KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQotCQlpZiAoaW5kZXggPj0gdGhpcy5uQml0cykKLQkJCXJldHVybiAtMTsKLQkJCi0JCWludCBpID0gaW5kZXg7Ci0JCWludCBzdGFydCA9IGJpdEluQnl0ZShpbmRleCk7Ci0JCQotCQlmb3IgKGludCBwID0gYnl0ZVBvcyhpbmRleCk7IHAgPCB0aGlzLm5CeXRlczsgcCsrKSB7Ci0JCQlieXRlIHZhbCA9IHRoaXMuYml0c1twXTsKLQkJCWlmICh2YWwgIT0gMCkgewotCQkJCWZvciAoaW50IGIgPSBzdGFydDsgYiA8IDg7IGIrKywgaSsrKSB7Ci0JCQkJCWJ5dGUgbWFzayA9IChieXRlKSAoMSA8PCBiKTsKLQkJCQkJaWYgKCh2YWwgJiBtYXNrKSA9PSBtYXNrKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJaSArPSA4OwotCQkJCi0JCQlzdGFydCA9IDA7Ci0JCX0KLQkJCi0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIGludFtdIHRvQXJyYXkoKSB7Ci0JCWludFtdIHJldFZhbHVlID0gbmV3IGludFt0aGlzLmNhcmRpbmFsaXR5KCldOwotCQlmb3IoaW50IGkgPSB0aGlzLm5leHRTZXRCaXQoMCksIGogPSAwOyBpID49IDA7IGkgPSB0aGlzLm5leHRTZXRCaXQoaSsxKSwgaisrKSB7Ci0JCQlyZXRWYWx1ZVtqXSA9IGk7Ci0JCX0KLQkJcmV0dXJuIHJldFZhbHVlOwotCX0KLQotCXB1YmxpYyBCaXRMaXN0IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgQml0TGlzdCh0aGlzLm5CaXRzLCB0aGlzLmJpdHMpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlyZXR1cm4gKE9iamVjdCl0aGlzLmNvcHkoKTsKLQl9Ci0JCi0JLyoKLQkgKiBJZiBzZXRzIGFyZSBkaWZmZXJlbnQgbGVuZ3Rocywgd2UgYXNzdW1lIG1pc3NpbmcgYml0cyBhcmUgemVybwotCSAqLwotCXB1YmxpYyB2b2lkIGFuZChCaXRMaXN0IHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm5CeXRlczsgaSsrKSB7Ci0JCQlpZiAoaSA+PSBzLm5CeXRlcykKLQkJCQl0aGlzLmJpdHNbaV0gPSAwOwotCQkJZWxzZQotCQkJCXRoaXMuYml0c1tpXSAmPSBzLmJpdHNbaV07Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYW5kTm90KEJpdExpc3QgcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubkJ5dGVzOyBpKyspIHsKLQkJCWlmIChpIDwgcy5uQnl0ZXMpCi0JCQkJdGhpcy5iaXRzW2ldICY9IH5zLmJpdHNbaV07Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhCaXRMaXN0IHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm5CeXRlczsgaSsrKSB7Ci0JCQlpZiAoaSA+PSBzLm5CeXRlcykKLQkJCQlicmVhazsKLQotCQkJaWYgKCh0aGlzLmJpdHNbaV0gJiBzLmJpdHNbaV0pICE9IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJYm9vbGVhbiByZXMgPSB0cnVlOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm5CeXRlczsgaSsrKSB7Ci0JCQlpZiAodGhpcy5iaXRzW2ldICE9IDApCi0JCQkJcmVzID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiByZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9yKEJpdExpc3QgcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubkJ5dGVzOyBpKyspIHsKLQkJCWlmIChpID49IHMubkJ5dGVzKQotCQkJCWJyZWFrOwotCi0JCQl0aGlzLmJpdHNbaV0gfD0gcy5iaXRzW2ldOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKLQkJaWYgKHRoaXMubkJ5dGVzID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQlieXRlW10gc3RyQml0cyA9IHN0ci5nZXRCeXRlcygpOwotCQkKLQkJaW50IGxhc3QgPSBzdHJCaXRzLmxlbmd0aCAtIHRoaXMubkJ5dGVzICogMjsKLQkJaWYgKGxhc3QgPCAwKQotCQkJbGFzdCA9IDA7Ci0JCQotCQlieXRlIG1hc2sgPSAoYnl0ZSkgKDB4ZmYgPj4gKDcgLSBiaXRJbkJ5dGUodGhpcy5uQml0cyAtIDEpKSk7Ci0JCQotCQlmb3IgKGludCBpID0gc3RyQml0cy5sZW5ndGgtMSwgYiA9IDA7IGkgPj0gbGFzdDsgaSAtPSAyLCBiKyspIHsKLQkJCWJ5dGUgYyA9IGZyb21IZXgoc3RyQml0c1tpXSk7Ci0JCQlpZiAoaS0xID49IDApCi0JCQkJYyB8PSBmcm9tSGV4KHN0ckJpdHNbaS0xXSkgPDwgNDsKLQkJCXRoaXMuYml0c1tiXSA9IGM7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIE1hc2sgb3V0IGhpZ2ggYml0cyBvZiBsYXN0IGJ5dGUKLQkJICovCi0JCXRoaXMuYml0c1t0aGlzLm5CeXRlcy0xXSAmPSBtYXNrOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzID0gIiI7Ci0JCWJvb2xlYW4gbm9uemVybyA9IGZhbHNlOwotCQkKLQkJaWYgKHRoaXMubkJpdHMgPT0gMCkgewotCQkJcmVzID0gIjAiOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IHRoaXMubkJ5dGVzLTEgOyBpID49IDA7IGktLSkgewotCQkJCW5vbnplcm8gfD0gdGhpcy5iaXRzW2ldICE9IDA7Ci0JCQkJaWYgKG5vbnplcm8pIHsKLQkJCQkJcmVzICs9IEludGVnZXIudG9IZXhTdHJpbmcoKHRoaXMuYml0c1tpXSA+PiA0KSAmIDB4Zik7Ci0JCQkJCXJlcyArPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuYml0c1tpXSAmIDB4Zik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFub256ZXJvKQotCQkJCXJlcyA9ICIwIjsKLQkJfQotCQkKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBieXRlIGZyb21IZXgoYnl0ZSBiKSB7Ci0JCWlmIChiID49IDQ4ICYmIGIgPD0gNTcpCi0JCQlyZXR1cm4gKGJ5dGUpIChiIC0gNDgpOwotCQlpZiAoYiA+PSA2NSAmJiBiIDw9IDcwKQotCQkJcmV0dXJuIChieXRlKSAoYiAtIDY1ICsgMTApOwotCQlpZiAoYiA+PSA5NyAmJiBiIDw9IDEwMikKLQkJCXJldHVybiAoYnl0ZSkgKGIgLSA5NyArIDEwKTsKLQkJCi0JCXJldHVybiAoYnl0ZSkwOwotCX0KLQotCXByaXZhdGUgaW50IGJ5dGVQb3MoaW50IGlkeCkgewotCQlyZXR1cm4gaWR4ID4+IDM7Ci0JfQotCQotCXByaXZhdGUgaW50IGJpdEluQnl0ZShpbnQgaWR4KSB7Ci0JCXJldHVybiBpZHggLSAoYnl0ZVBvcyhpZHgpIDw8IDMpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIEJpdExpc3QuIAotICAgICAqIChUaGUgaGFzaCB2YWx1ZSBvZiB0aGUgZW1wdHkgQml0TGlzdCBpcyB6ZXJvLikKLSAgICAgKiBAcmV0dXJuICBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCi0gICAgICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSBoYXNoOwotCQlpZiAoaCA9PSAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5CeXRlczsgaSsrKSB7Ci0JCQkJaCA9IDMxKmggKyBiaXRzW2ldOwotCSAgICAgICAgfQotCSAgICAgICAgaGFzaCA9IGg7Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgQml0TGlzdCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gIG9iaiBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyB7QGNvZGUgQml0TGlzdH0gYWdhaW5zdAotICAgICAqIEByZXR1cm4gIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IHJlcHJlc2VudHMgYSB7QGNvZGUgQml0TGlzdH0gZXF1aXZhbGVudCB0byB0aGlzIEJpdExpc3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKSB7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQml0TGlzdCkgewotCQkJQml0TGlzdCBhbm90aGVyQml0TGlzdCA9IChCaXRMaXN0KW9iajsKLQkJCWlmIChuQml0cyAhPSBhbm90aGVyQml0TGlzdC5uQml0cyB8fCBuQnl0ZXMgIT0gYW5vdGhlckJpdExpc3QubkJ5dGVzKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQnl0ZXM7IGkrKykgewotCQkJCWlmIChiaXRzW2ldICE9IGFub3RoZXJCaXRMaXN0LmJpdHNbaV0pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93Qml0TGlzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIntudWxsfSI7Ci0JCX0KLQkJaW50W10gYXJyYXkgPSB0YXNrcy50b0FycmF5KCk7Ci0JCWlmIChhcnJheS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAie30iOwotCQkKLQkJU3RyaW5nIG1zZyA9ICJ7IjsKLQkJaW50IHByZVRhc2sgPSBhcnJheVswXTsKLQkJbXNnICs9IHByZVRhc2s7Ci0JCWJvb2xlYW4gaXNDb250aW51ZSA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocHJlVGFzayA9PSAoYXJyYXlbaV0gLSAxKSkgewotCQkJCXByZVRhc2sgPSBhcnJheVtpXTsKLQkJCQlpc0NvbnRpbnVlID0gdHJ1ZTsKLQkJCQlpZiAoaSA9PSAoYXJyYXkubGVuZ3RoIC0gMSkpIHsKLQkJCQkJbXNnICs9ICItIiArIGFycmF5W2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoaXNDb250aW51ZSkKLQkJCQltc2cgKz0gIi0iICsgcHJlVGFzazsKLQkJCW1zZyArPSAiLCIgKyBhcnJheVtpXTsKLQkJCWlzQ29udGludWUgPSBmYWxzZTsKLQkJCXByZVRhc2sgPSBhcnJheVtpXTsKLQkJfQotCQlyZXR1cm4gbXNnICsgIn0iOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvRGVidWdVdGlsLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS91dGlsL0RlYnVnVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U4ZTU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvRGVidWdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGVidWdVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfVFJBQ0lOR19PUFRJT04gPSAib3JnLmVjbGlwc2UucHRwLmNvcmUvZGVidWcvcHJveHkvcHJvdG9jb2wvdHJhY2luZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NMSUVOVF9UUkFDSU5HX09QVElPTiA9ICJvcmcuZWNsaXBzZS5wdHAuY29yZS9kZWJ1Zy9wcm94eS9jbGllbnQvdHJhY2luZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NFUlZFUl9ERUJVR19MRVZFTF9PUFRJT04gPSAib3JnLmVjbGlwc2UucHRwLmNvcmUvZGVidWcvcHJveHkvc2VydmVyL2RlYnVnX2xldmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1fVFJBQ0lOR19PUFRJT04gPSAib3JnLmVjbGlwc2UucHRwLmNvcmUvZGVidWcvcm0vdHJhY2luZyI7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUFJPVE9DT0xfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBQUk9YWV9DTElFTlRfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgaW50IFBST1hZX1NFUlZFUl9ERUJVR19MRVZFTCA9IDA7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFJNX1RSQUNJTkcgPSBmYWxzZTs7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlUGx1Z2luRGVidWdPcHRpb25zKCkgewotCQlpZiAoUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSkgewotCQkJU3RyaW5nIG9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBST1RPQ09MX1RSQUNJTkdfT1BUSU9OKTsKLQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJCVBST1RPQ09MX1RSQUNJTkcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUFJPWFlfQ0xJRU5UX1RSQUNJTkdfT1BUSU9OKTsKLQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJCVBST1hZX0NMSUVOVF9UUkFDSU5HID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBST1hZX1NFUlZFUl9ERUJVR19MRVZFTF9PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUFJPWFlfU0VSVkVSX0RFQlVHX0xFVkVMID0gSW50ZWdlci5wYXJzZUludChvcHRpb24pOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBST1hZX1NFUlZFUl9ERUJVR19MRVZFTCA9IDA7Ci0JCQkJfQotCQkJfQotCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUk1fVFJBQ0lOR19PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJUk1fVFJBQ0lORyA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvT3V0cHV0VGV4dEZpbGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvT3V0cHV0VGV4dEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwN2VhMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS91dGlsL091dHB1dFRleHRGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRUZXh0RmlsZSBpbXBsZW1lbnRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCXByaXZhdGUgU3RyaW5nIGZpbGVuYW1lID0gIiI7Ci0KLQlwcml2YXRlIEZpbGUgZmlsZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHN0b3JlTGluZSA9IDA7Ci0KLQlwcml2YXRlIGludCBsaW5lQ291bnRlciA9IDA7Ci0KLQlwdWJsaWMgT3V0cHV0VGV4dEZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgb3V0cHV0UGF0aCwgaW50IHN0b3JlTGluZSkgewotCQl0aGlzLmZpbGVuYW1lID0gbmFtZSArICIuIiArIHR5cGU7Ci0JCXRoaXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7Ci0JCXRoaXMuc3RvcmVMaW5lID0gc3RvcmVMaW5lOwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWZpbGUgPSBnZXRGaWxlUGF0aCgpOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRGaWxlUGF0aCgpIHsKLQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChvdXRwdXRQYXRoKS5hcHBlbmQoZmlsZW5hbWUpOwotCQlGaWxlIHRtcEZpbGUgPSBmaWxlUGF0aC50b0ZpbGUoKTsKLQkJdHJ5IHsKLQkJCXRtcEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dFRleHRGaWxlIC0gZ2V0RmlsZVBhdGggZXJyOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiB0bXBGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChsaW5lQ291bnRlciA9PSBzdG9yZUxpbmUpIHsKLQkJCWxpbmVDb3VudGVyID0gMDsKLQkJCXdyaXRlKHRleHQsIGZhbHNlKTsKLQkJfSBlbHNlCi0JCQl3cml0ZSh0ZXh0LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgdGV4dCwgYm9vbGVhbiBpc0FwcGVuZCkgewotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCBpc0FwcGVuZCk7Ci0JCQlmb3Mud3JpdGUodGV4dC5nZXRCeXRlcygpKTsKLQkJCWxpbmVDb3VudGVyKys7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dFRleHRGaWxlIC0gYXBwZW5kIGZpbGUgZXJyOiAiCi0JCQkJCSsgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0cHV0VGV4dEZpbGUgLSBhcHBlbmQgaW8gZXJyOiAiCi0JCQkJCSsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZm9zICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXRUZXh0RmlsZSAtIGFwcGVuZCBjbG9zZSBlcnI6ICIKLQkJCQkJCQkrIGlvZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJCWZvcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCWlmIChmaWxlLmV4aXN0cygpKQotCQkJZmlsZS5kZWxldGUoKTsKLQotCQlmaWxlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCXJldHVybiByZWFkU3RyaW5nKGlzLCBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dFRleHRGaWxlIC0gcmVhZCBmaWxlIGVycjogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkU3RyaW5nKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWNoYXJbXSBwYXJ0ID0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgcmVhZCA9IDA7Ci0JCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBlbmNvZGluZykpOwotCQkJd2hpbGUgKChyZWFkID0gcmVhZGVyLnJlYWQocGFydCkpICE9IC0xKQotCQkJCWJ1ZmZlci5hcHBlbmQocGFydCwgMCwgcmVhZCk7Ci0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvUXVldWUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9jb3JlL3V0aWwvUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkNjk1Mi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvY29yZS91dGlsL1F1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUXVldWU8VD4gewotCXByb3RlY3RlZCBMaXN0PFQ+IGxpc3Q7Ci0KLQlwdWJsaWMgUXVldWUoKSB7Ci0JCWxpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBMaW5rZWRMaXN0PFQ+KCkpOwotCX0KLQotCXB1YmxpYyBUIHJlbW92ZUl0ZW0oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLQkJCXdoaWxlIChsaXN0LmlzRW1wdHkoKSkgewotCQkJCWxpc3Qud2FpdCgpOwotCQkJfQotCQkJcmV0dXJuIGxpc3QucmVtb3ZlKDApOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSXRlbShUIGl0ZW0pIHsKLQkJc3luY2hyb25pemVkIChsaXN0KSB7Ci0JCQlsaXN0LmFkZChpdGVtKTsKLQkJCWxpc3Qubm90aWZ5QWxsKCk7Ci0JCX0KLQl9Ci0JCi0gICAgcHVibGljIFRbXSBjbGVhckl0ZW1zKCkgewotCQlUW10gYXJyYXk7Ci0JCXN5bmNocm9uaXplZCAobGlzdCkgewotCQkJYXJyYXkgPSAoVFtdKSBsaXN0LnRvQXJyYXkoKTsKLQkJCWxpc3QuY2xlYXIoKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJYm9vbGVhbiBlbXB0eTsKLQkJc3luY2hyb25pemVkIChsaXN0KSB7Ci0JCQllbXB0eSA9IGxpc3QuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlbXB0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9Nb2RlbE1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL01vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEyN2Q0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL01vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQVW5pdmVyc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmV2ZW50cy5OZXdSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5ldmVudHMuUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJtc3lzdGVtLlJlc291cmNlTWFuYWdlclBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTW9kZWxNYW5hZ2VyIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlciB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInJlc291cmNlTWFuYWdlcnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBjbGFzcyBSTVN0YXJ0dXBKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJlc291cmNlTWFuYWdlcjsKLQkJCi0JCXB1YmxpYyBSTVN0YXJ0dXBKb2IoSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0pIHsKLQkJCXN1cGVyKCJTdGFydGluZyBSZXNvdXJjZSBNYW5hZ2VyOiAiICsgcm0uZ2V0TmFtZSgpKTsKLQkJCXJlc291cmNlTWFuYWdlciA9IHJtOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRyeSB7Ci0JICAgICAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgICAJbW9uaXRvci5iZWdpblRhc2soIlN0YXJ0aW5nIHJlc291cmNlIG1hbmFnZXIiLCAxMDApOwotCSAgICAgICAgICAgIAlyZXNvdXJjZU1hbmFnZXIuc3RhcnRVcChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMCkpOwotCSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCSAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotICAgICAgICB9Ci0JCQotCX0KLQkKLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5W10gcmVzb3VyY2VNYW5hZ2VyRmFjdG9yaWVzOwotCQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IHJlc291cmNlTWFuYWdlckxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCS8vIHByb3RlY3RlZCBJUE1hY2hpbmUgbWFjaGluZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElQSm9iIHByb2Nlc3NSb290ID0gbnVsbDsKLQotCXByb3RlY3RlZCBJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSA9IG5ldyBQVW5pdmVyc2UoKTsKLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkKLQlwdWJsaWMgTW9kZWxNYW5hZ2VyKCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2FkZFJlc291cmNlTWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2wpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlc291cmNlTWFuYWdlcihJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSkgewotCQl1bml2ZXJzZS5hZGRSZXNvdXJjZU1hbmFnZXIocm0pOwotCQlmaXJlTmV3UmVzb3VyY2VNYW5hZ2VyKHJtKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2FkZFJlc291cmNlTWFuYWdlcnMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sW10pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlc291cmNlTWFuYWdlcnMoSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSBybXMpIHsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSA6IHJtcykgewotCQkJYWRkUmVzb3VyY2VNYW5hZ2VyKHJtKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2dldFJlc291cmNlTWFuYWdlckZhY3RvcmllcygpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5W10gZ2V0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yaWVzKCkKLQl7Ci0JCWlmIChyZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlTWFuYWdlckZhY3RvcmllczsKLQkJfQotCQkKLQkJZmluYWwgQXJyYXlMaXN0PEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeT4gZmFjdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeT4oKTsKLQkKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUFRQQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWZpbmFsIElFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkKLQkJZm9yIChpbnQgaWV4dCA9IDA7IGlleHQgPCBleHRlbnNpb25zLmxlbmd0aDsgKytpZXh0KSB7Ci0JCQlmaW5hbCBJRXh0ZW5zaW9uIGV4dCA9IGV4dGVuc2lvbnNbaWV4dF07Ci0JCQkKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJCWZvciAoaW50IGk9MDsgaTwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gZWxlbWVudHNbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkgPSAoQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5KSBjZS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCQlmYWN0b3J5LnNldElkKGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc291cmNlTWFuYWdlckZhY3RvcmllcyA9Ci0JCQkoSVJlc291cmNlTWFuYWdlckZhY3RvcnlbXSkgZmFjdG9yeUxpc3QudG9BcnJheSgKLQkJCQkJbmV3IElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5W2ZhY3RvcnlMaXN0LnNpemUoKV0pOwotCQotCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyRmFjdG9yaWVzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2dldFJlc291cmNlTWFuYWdlckZhY3RvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZ2V0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeShTdHJpbmcgaWQpCi0JewotCQlJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeVtdIGZhY3RvcmllcyA9IGdldFJlc291cmNlTWFuYWdlckZhY3RvcmllcygpOwotCQlmb3IgKGludCBpPTA7IGk8ZmFjdG9yaWVzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoZmFjdG9yaWVzW2ldLmdldElkKCkuZXF1YWxzKGlkKSkgcmV0dXJuIGZhY3Rvcmllc1tpXTsKLQkJfQotCQkKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIHJlc291cmNlIG1hbmFnZXIgZmFjdG9yeSIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0UmVzb3VyY2VNYW5hZ2VyRnJvbVVuaXF1ZU5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXJGcm9tVW5pcXVlTmFtZShTdHJpbmcgcm1VbmlxdWVOYW1lKSB7Ci0JCUlQVW5pdmVyc2UgdW5pdmVyc2UgPSBnZXRVbml2ZXJzZSgpOwotCQlpZiAodW5pdmVyc2UgIT0gbnVsbCkgewotCQkJSVJlc291cmNlTWFuYWdlcltdIHJtcyA9IGdldFN0YXJ0ZWRSZXNvdXJjZU1hbmFnZXJzKHVuaXZlcnNlKTsKLQkJCQotCQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogcm1zKSB7Ci0JCQkJaWYgKHJtLmdldFVuaXF1ZU5hbWUoKS5lcXVhbHMocm1VbmlxdWVOYW1lKSkgewotCQkJCQlyZXR1cm4gcm07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2dldFN0YXJ0ZWRSZXNvdXJjZU1hbmFnZXJzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQVW5pdmVyc2UpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJbXSBnZXRTdGFydGVkUmVzb3VyY2VNYW5hZ2VycyhJUFVuaXZlcnNlIHVuaXZlcnNlKSB7Ci0JCUlSZXNvdXJjZU1hbmFnZXJbXSBybXMgPSB1bml2ZXJzZS5nZXRSZXNvdXJjZU1hbmFnZXJzKCk7Ci0JCUFycmF5TGlzdDxJUmVzb3VyY2VNYW5hZ2VyPiBzdGFydGVkUk1zID0gCi0JCQluZXcgQXJyYXlMaXN0PElSZXNvdXJjZU1hbmFnZXI+KHJtcy5sZW5ndGgpOwotCQlmb3IgKElSZXNvdXJjZU1hbmFnZXIgcm0gOiBybXMpIHsKLQkJCWlmIChybS5nZXRTdGF0ZSgpID09IFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1RBUlRFRCkgewotCQkJCXN0YXJ0ZWRSTXMuYWRkKHJtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnRlZFJNcy50b0FycmF5KG5ldyBJUmVzb3VyY2VNYW5hZ2VyW3N0YXJ0ZWRSTXMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbFByZXNlbnRhdGlvbiNnZXRVbml2ZXJzZSgpCi0JICovCi0JcHVibGljIElQVW5pdmVyc2UgZ2V0VW5pdmVyc2UoKSB7Ci0JCXJldHVybiB1bml2ZXJzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQgZSkgewotCQkvLyBJZ25vcmUgLSBoYW5kbGVkIGJ5IGxpc3RlbmVyIG9uIFJNCQkKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI2xvYWRSZXNvdXJjZU1hbmFnZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2VNYW5hZ2VycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VNYW5hZ2VyUGVyc2lzdGVuY2Ugcm1wID0gbmV3IFJlc291cmNlTWFuYWdlclBlcnNpc3RlbmNlKCk7Ci0gICAgICAgIHJtcC5sb2FkUmVzb3VyY2VNYW5hZ2VycyhnZXRSZXNvdXJjZU1hbmFnZXJzRmlsZSgpLCBnZXRSZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMoKSk7Ci0gICAgICAgIElSZXNvdXJjZU1hbmFnZXJDb250cm9sW10gcmVzb3VyY2VNYW5hZ2VycyA9IHJtcC5nZXRSZXNvdXJjZU1hbmFnZXJDb250cm9scygpOwotICAgICAgICBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIHJtc05lZWRTdGFydGluZyA9IHJtcC5nZXRSZXNvdXJjZU1hbmFnZXJDb250cm9sc05lZWRTdGFydGluZygpOwotICAgICAgICBhZGRSZXNvdXJjZU1hbmFnZXJzKHJlc291cmNlTWFuYWdlcnMpOwotICAgICAgICBzdGFydFJlc291cmNlTWFuYWdlcnMocm1zTmVlZFN0YXJ0aW5nKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlciNyZW1vdmVSZXNvdXJjZU1hbmFnZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVSZXNvdXJjZU1hbmFnZXIoSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0pIHsKLQkJdW5pdmVyc2UucmVtb3ZlUmVzb3VyY2VNYW5hZ2VyKHJtKTsKLQkJZmlyZVJlbW92ZVJlc291cmNlTWFuYWdlcihybSk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlciNyZW1vdmVSZXNvdXJjZU1hbmFnZXJzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVSZXNvdXJjZU1hbmFnZXJzKElSZXNvdXJjZU1hbmFnZXJDb250cm9sW10gcm1zKSB7Ci0JCWZvciAoSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gOiBybXMpIHsKLQkJCXJlbW92ZVJlc291cmNlTWFuYWdlcihybSk7Ci0JCX0KLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI3NhdmVSZXNvdXJjZU1hbmFnZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUmVzb3VyY2VNYW5hZ2VycygpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyUGVyc2lzdGVuY2Uuc2F2ZVJlc291cmNlTWFuYWdlcnMoZ2V0UmVzb3VyY2VNYW5hZ2Vyc0ZpbGUoKSwKLQkJCQl1bml2ZXJzZS5nZXRSZXNvdXJjZU1hbmFnZXJDb250cm9scygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI3NodXRkb3duKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZVJlc291cmNlTWFuYWdlcnMoKTsKLQkJc3RvcFJlc291cmNlTWFuYWdlcnMoKTsKLQkJc2h1dGRvd25SZXNvdXJjZU1hbmFnZXJzKCk7Ci0JCXJlc291cmNlTWFuYWdlckxpc3RlbmVycy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI3N0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZFJlc291cmNlTWFuYWdlcnMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyI3N0b3BSZXNvdXJjZU1hbmFnZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUmVzb3VyY2VNYW5hZ2VycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlTWFuYWdlcltdIHJlc291cmNlTWFuYWdlcnMgPSB1bml2ZXJzZS5nZXRSZXNvdXJjZU1hbmFnZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHJlc291cmNlTWFuYWdlcnMubGVuZ3RoOyArK2kpIHsKLQkJCXJlc291cmNlTWFuYWdlcnNbaV0uc2h1dGRvd24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBuZXcgcmVzb3VyY2UgbWFuYWdlciBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcm0KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZU5ld1Jlc291cmNlTWFuYWdlcihmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtKSB7Ci0JCUlOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCBldmVudCA9IAotCQkJbmV3IE5ld1Jlc291cmNlTWFuYWdlckV2ZW50KHRoaXMsIHJtKTsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiByZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGaXJlIGEgcmVtb3ZlIHJlc291cmNlIG1hbmFnZXIgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHJtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZW1vdmVSZXNvdXJjZU1hbmFnZXIoZmluYWwgSVJlc291cmNlTWFuYWdlciBybSkgewotCQlJUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQgZXZlbnQgPSAKLQkJCW5ldyBSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudCh0aGlzLCBybSk7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogcmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGUgdGhlIHJlc291cmNlIG1hbmFnZXJzIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldFJlc291cmNlTWFuYWdlcnNGaWxlKCkgewotCQlmaW5hbCBQVFBDb3JlUGx1Z2luIHBsdWdpbiA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gcGx1Z2luLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoInJlc291cmNlTWFuYWdlcnMueG1sIikudG9GaWxlKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBzaHV0cyBkb3duIGFsbCBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlcnMuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzaHV0ZG93blJlc291cmNlTWFuYWdlcnMoKSB7Ci0JCUlSZXNvdXJjZU1hbmFnZXJDb250cm9sW10gcmVzb3VyY2VNYW5hZ2VycyA9IHVuaXZlcnNlLmdldFJlc291cmNlTWFuYWdlckNvbnRyb2xzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHJlc291cmNlTWFuYWdlcnMubGVuZ3RoOyArK2kpIHsKLQkJCXJlc291cmNlTWFuYWdlcnNbaV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgYWxsIHJlc291cmNlIG1hbmFnZXJzLgotCSAqIAotCSAqIEBwYXJhbSBybXNOZWVkU3RhcnRpbmcKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RhcnRSZXNvdXJjZU1hbmFnZXJzKElSZXNvdXJjZU1hbmFnZXJDb250cm9sW10gcm1zTmVlZFN0YXJ0aW5nKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoZmluYWwgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gOiBybXNOZWVkU3RhcnRpbmcpIHsKLSAgICAgICAgICAgIEpvYiBqb2IgPSBuZXcgUk1TdGFydHVwSm9iKHJtKTsKLSAgICAgICAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUEVsZW1lbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL1BFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTZlMzcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEVsZW1lbnRDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQRWxlbWVudCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSVBFbGVtZW50Q29udHJvbCwgQ29tcGFyYWJsZTxJUEVsZW1lbnRDb250cm9sPiB7Ci0KLQlwcml2YXRlIGZpbmFsIFBFbGVtZW50SW5mbyBlbGVtZW50SW5mbyA9IG5ldyBQRWxlbWVudEluZm8odGhpcyk7Ci0JcHJvdGVjdGVkIGZpbmFsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cmlidXRlVmFsdWVzID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVsZW1lbnRJZDsKLQlwcm90ZWN0ZWQgZmluYWwgSVBFbGVtZW50Q29udHJvbCBlbGVtZW50UGFyZW50OwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZWxlbWVudFR5cGU7Ci0KLQlwcm90ZWN0ZWQgUEVsZW1lbnQoU3RyaW5nIGlkLCBJUEVsZW1lbnRDb250cm9sIHBhcmVudCwgaW50IHR5cGUsIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpIHsKLQkJZWxlbWVudElkID0gaWQ7Ci0JCWVsZW1lbnRUeXBlID0gdHlwZTsKLQkJZWxlbWVudFBhcmVudCA9IHBhcmVudDsKLQkJQXJyYXlMaXN0PElBdHRyaWJ1dGU8PywgPywgPz4+IGF0dHJMaXN0ID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlPD8sPyw/Pj4oQXJyYXlzLmFzTGlzdChhdHRycykpOwotCQlhdHRyTGlzdC5hZGQoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0SWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGlkKSk7Ci0JCWF0dHJpYnV0ZVZhbHVlcy5hZGRBdHRyaWJ1dGVzKGF0dHJMaXN0LnRvQXJyYXkobmV3IElBdHRyaWJ1dGU8PywgPywgPz5bMF0pKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQjYWRkQXR0cmlidXRlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0cmliKSB7Ci0JCWFkZEF0dHJpYnV0ZXMobmV3IElBdHRyaWJ1dGU8Pyw/LD8+W117YXR0cmlifSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudCNhZGRBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZXMoSUF0dHJpYnV0ZTw/LD8sPz5bXSBhdHRyaWJzKSB7Ci0JCWF0dHJpYnV0ZVZhbHVlcy5hZGRBdHRyaWJ1dGVzKGF0dHJpYnMpOwotCQlkb0FkZEF0dHJpYnV0ZUhvb2sobmV3IEF0dHJpYnV0ZU1hbmFnZXIoYXR0cmlicykpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKElQRWxlbWVudENvbnRyb2wgb2JqKSB7Ci0JCXJldHVybiBnZXROYW1lKCkuY29tcGFyZVRvKG9iai5nZXROYW1lKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUEVsZW1lbnQjZ2V0QXR0cmlidXRlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb24pCi0JICovCi0JcHVibGljIDxULCBBIGV4dGVuZHMgSUF0dHJpYnV0ZTxULCBBLCBEPiwgRCBleHRlbmRzIElBdHRyaWJ1dGVEZWZpbml0aW9uPFQsIEEsIEQ+PiBBIGdldEF0dHJpYnV0ZShEIGF0dHJEZWYpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlcy5nZXRBdHRyaWJ1dGUoYXR0ckRlZik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LD8sPz4gZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRySWQpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlcy5nZXRBdHRyaWJ1dGUoYXR0cklkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50I2dldEF0dHJpYnV0ZUtleXMoKQotCSAqLwotCXB1YmxpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXRBdHRyaWJ1dGVLZXlzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlVmFsdWVzLmdldEtleXMoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50I2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBJQXR0cmlidXRlPD8sPyw/PltdIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZXMuZ2V0QXR0cmlidXRlcygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQjZ2V0RGlzcGxheUF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBJQXR0cmlidXRlPD8sPyw/PltdIGdldERpc3BsYXlBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlVmFsdWVzLmdldERpc3BsYXlBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQRWxlbWVudENvbnRyb2wjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBlbGVtZW50SWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nQXR0cmlidXRlIGF0dHIgPSBhdHRyaWJ1dGVWYWx1ZXMuZ2V0QXR0cmlidXRlKEVsZW1lbnRBdHRyaWJ1dGVzLmdldE5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBnZXRJRCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEVsZW1lbnRDb250cm9sI2dldFBhcmVudCgpCi0JICovCi0JcHVibGljIElQRWxlbWVudENvbnRyb2wgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZWxlbWVudFBhcmVudDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQjcmVtb3ZlQXR0cmlidXRlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0cmliKSB7Ci0JCWF0dHJpYnV0ZVZhbHVlcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cmliKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBFbGVtZW50Q29udHJvbCNzaXplKCkKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50SW5mbygpLnNpemUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvQWRkQXR0cmlidXRlSG9vayhBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBlbGVtZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gUEVsZW1lbnRJbmZvCi0JICovCi0JcHJvdGVjdGVkIFBFbGVtZW50SW5mbyBnZXRFbGVtZW50SW5mbygpIHsKLQkJcmV0dXJuIGVsZW1lbnRJbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL1BFbGVtZW50SW5mby5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUEVsZW1lbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTlkNTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUEVsZW1lbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBFbGVtZW50Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQ7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFBFbGVtZW50SW5mbyB7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUEVsZW1lbnRDb250cm9sPiBmQ2hpbGRyZW4gPSAKLQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgSVBFbGVtZW50Q29udHJvbD4oKSk7Ci0JcHJvdGVjdGVkIGZpbmFsIElQRWxlbWVudENvbnRyb2wgZWxlbWVudDsKLQotCXB1YmxpYyBQRWxlbWVudEluZm8oSVBFbGVtZW50Q29udHJvbCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY2hpbGQgdG8gdGhpcyBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG1lbWJlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKElQRWxlbWVudENvbnRyb2wgbWVtYmVyKSB7Ci0JCWZDaGlsZHJlbi5wdXQobWVtYmVyLmdldElEKCksIG1lbWJlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgY2hpbGQgd2l0aCBjb3JyZXNwb25kaW5nIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIGNoaWxkCi0JICovCi0JcHVibGljIElQRWxlbWVudENvbnRyb2wgZmluZENoaWxkKFN0cmluZyBrZXkpIHsKLQkJc3luY2hyb25pemVkIChmQ2hpbGRyZW4pIHsKLQkJCWlmIChmQ2hpbGRyZW4uY29udGFpbnNLZXkoa2V5KSkgewotCQkJCXJldHVybiAoSVBFbGVtZW50Q29udHJvbCkgZkNoaWxkcmVuLmdldChrZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50Ci0JICogCi0JICogQHJldHVybiBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBJUEVsZW1lbnRDb250cm9sW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCSByZXR1cm4gKElQRWxlbWVudENvbnRyb2xbXSkgZkNoaWxkcmVuLnZhbHVlcygpLnRvQXJyYXkobmV3IElQRWxlbWVudENvbnRyb2xbc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBlbGVtZW50Ci0JICogCi0JICogQHJldHVybiBlbGVtZW50Ci0JICovCi0JcHVibGljIElQRWxlbWVudENvbnRyb2wgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhpcyBlbGVtZW50IGhhcyBhbnkgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBjaGlsZCBpcyBvbmUgb2Ygb3VycwotCSAqIAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjaGlsZCBpcyBvbmUgb2Ygb3VycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQ2hpbGQoSVBFbGVtZW50Q29udHJvbCBjaGlsZCkgewotCQlpZiAoZkNoaWxkcmVuLmNvbnRhaW5zS2V5KGNoaWxkLmdldElEKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGNoaWxkCi0JICogCi0JICogQHBhcmFtIG1lbWJlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKElQRWxlbWVudCBtZW1iZXIpIHsKLQkJZkNoaWxkcmVuLnJlbW92ZShtZW1iZXIuZ2V0SUQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKCkgewotCQlmQ2hpbGRyZW4uY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihJUEVsZW1lbnRDb250cm9sW10gY2hpbGRyZW4pIHsKLQkJZm9yIChJUEVsZW1lbnRDb250cm9sIGVsZW1lbnQgOiBjaGlsZHJlbikgewotCQkJZkNoaWxkcmVuLnB1dChlbGVtZW50LmdldElEKCksIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIG51bWJlciBvZiBjaGlsZHJlbgotCSAqIAotCSAqIEByZXR1cm4gbnVtYmVyIG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gZkNoaWxkcmVuLnNpemUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9QSm9iLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9QSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3N2M1YmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQm9vbGVhbkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEVsZW1lbnRDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUHJvY2Vzc0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUXVldWVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXMuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLkNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLkpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5OZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLlJlbW92ZVByb2Nlc3NFdmVudDsKLQotcHVibGljIGNsYXNzIFBKb2IgZXh0ZW5kcyBQYXJlbnQgaW1wbGVtZW50cyBJUEpvYkNvbnRyb2wgewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGVsZW1lbnRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgY2hpbGRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUFByb2Nlc3NDb250cm9sPiBpbmRleE1hcCA9IAotCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBJUFByb2Nlc3NDb250cm9sPigpKTsKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgUEpvYihTdHJpbmcgaWQsIElQUXVldWVDb250cm9sIHF1ZXVlLCBJQXR0cmlidXRlPD8sPyw/PltdIGF0dHJzKSB7Ci0JCXN1cGVyKGlkLCBxdWV1ZSwgUF9KT0IsIGF0dHJzKTsKLQkJLyoKLQkJICogQ3JlYXRlIHJlcXVpcmVkIGF0dHJpYnV0ZXMuCi0JCSAqLwotCQlFbnVtZXJhdGVkQXR0cmlidXRlPFN0YXRlPiBqb2JTdGF0ZSA9IGdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKGpvYlN0YXRlID09IG51bGwpIHsKLQkJCWpvYlN0YXRlID0gSm9iQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKTsKLQkJCWFkZEF0dHJpYnV0ZShqb2JTdGF0ZSk7Ci0JCX0KLQkJQm9vbGVhbkF0dHJpYnV0ZSBkZWJ1Z0ZsYWcgPSBnZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXREZWJ1Z0ZsYWdBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAoZGVidWdGbGFnID09IG51bGwpIHsKLQkJCWRlYnVnRmxhZyA9IEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdGbGFnQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJYWRkQXR0cmlidXRlKGRlYnVnRmxhZyk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IjYWRkQ2hpbGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYlByb2Nlc3NMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZExpc3RlbmVyKElKb2JDaGlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNoaWxkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iI2FkZEVsZW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaXN0ZW5lcihJSm9iTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZWxlbWVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2wjYWRkUHJvY2Vzc0F0dHJpYnV0ZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTw/LD8sPz5bXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9jZXNzQXR0cmlidXRlcyhDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3NDb250cm9scywKLQkJCUlBdHRyaWJ1dGU8PywgPywgPz5bXSBhdHRycykgewotCQlMaXN0PElQUHJvY2Vzcz4gcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxJUFByb2Nlc3M+KHByb2Nlc3NDb250cm9scy5zaXplKCkpOwotCQkKLQkJZm9yIChJUFByb2Nlc3NDb250cm9sIHByb2Nlc3MgOiBwcm9jZXNzQ29udHJvbHMpIHsKLQkJCXByb2Nlc3MuYWRkQXR0cmlidXRlcyhhdHRycyk7Ci0JCQlwcm9jZXNzZXMuYWRkKHByb2Nlc3MpOwotCQl9Ci0JCQotCQlmaXJlQ2hhbmdlZFByb2Nlc3Nlcyhwcm9jZXNzZXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sI2FkZFByb2Nlc3NlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZXMoQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzQ29udHJvbHMpIHsKLQkJTGlzdDxJUFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SVBQcm9jZXNzPihwcm9jZXNzQ29udHJvbHMuc2l6ZSgpKTsKLQotCQlmb3IgKElQUHJvY2Vzc0NvbnRyb2wgcHJvY2VzcyA6IHByb2Nlc3NDb250cm9scykgewotCQkJYWRkQ2hpbGQocHJvY2Vzcyk7Ci0JCQlTdHJpbmcgaWR4ID0gcHJvY2Vzcy5nZXRQcm9jZXNzSW5kZXgoKTsKLQkJCWlmIChpZHggIT0gbnVsbCkgewotCQkJCWluZGV4TWFwLnB1dChpZHgsIHByb2Nlc3MpOwotCQkJfQotCQkJcHJvY2Vzc2VzLmFkZChwcm9jZXNzKTsKLQkJfQotCQkKLQkJZmlyZU5ld1Byb2Nlc3Nlcyhwcm9jZXNzZXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iI2dldFByb2Nlc3NCeUlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQUHJvY2VzcyBnZXRQcm9jZXNzQnlJZChTdHJpbmcgaWQpIHsKLQkJSVBFbGVtZW50Q29udHJvbCBlbGVtZW50ID0gZmluZENoaWxkKGlkKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIChJUFByb2Nlc3NDb250cm9sKSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYiNnZXRQcm9jZXNzQnlJbmRleChpbnQpCi0JICovCi0JcHVibGljIElQUHJvY2VzcyBnZXRQcm9jZXNzQnlJbmRleChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4TWFwLmdldChTdHJpbmcudmFsdWVPZihpbmRleCkpOwotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iI2dldFByb2Nlc3NCeUluZGV4KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQUHJvY2VzcyBnZXRQcm9jZXNzQnlJbmRleChTdHJpbmcgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4TWFwLmdldChpbmRleCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbCNnZXRQcm9jZXNzQ29udHJvbHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IGdldFByb2Nlc3NDb250cm9scygpIHsKLQkJSVBFbGVtZW50Q29udHJvbFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJTGlzdDxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMgPQotCQkJbmV3IEFycmF5TGlzdDxJUFByb2Nlc3NDb250cm9sPihjaGlsZHJlbi5sZW5ndGgpOwotCQlmb3IgKElQRWxlbWVudENvbnRyb2wgZWxlbWVudCA6IGNoaWxkcmVuKSB7Ci0JCQlwcm9jZXNzZXMuYWRkKChJUFByb2Nlc3NDb250cm9sKWVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IjZ2V0UHJvY2Vzc2VzKCkKLQkgKi8KLQlwdWJsaWMgSVBQcm9jZXNzW10gZ2V0UHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gZ2V0UHJvY2Vzc0NvbnRyb2xzKCkudG9BcnJheShuZXcgSVBQcm9jZXNzW2dldFByb2Nlc3NDb250cm9scygpLnNpemUoKV0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iI2dldFF1ZXVlKCkKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZSgpIHsKLQkJcmV0dXJuIGdldFF1ZXVlQ29udHJvbCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2wjZ2V0UXVldWVDb250cm9sKCkKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZUNvbnRyb2wgZ2V0UXVldWVDb250cm9sKCkgewotCQlyZXR1cm4gKElQUXVldWVDb250cm9sKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IjZ2V0U3RhdGUoKQotCSAqLwotCXB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iI2lzRGVidWcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXREZWJ1Z0ZsYWdBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IjaXNUZXJtaW5hdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKSB7Ci0JCVN0YXRlIHN0YXRlID0gZ2V0U3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IFN0YXRlLlRFUk1JTkFURUQgfHwgc3RhdGUgPT0gU3RhdGUuRVJST1IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYiNyZW1vdmVDaGlsZExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iUHJvY2Vzc0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkTGlzdGVuZXIoSUpvYkNoaWxkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY2hpbGRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYiNyZW1vdmVFbGVtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSUpvYkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWVsZW1lbnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sI3JlbW92ZVByb2Nlc3NlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9jZXNzZXMoQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzQ29udHJvbHMpIHsKLQkJTGlzdDxJUFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SVBQcm9jZXNzPihwcm9jZXNzQ29udHJvbHMuc2l6ZSgpKTsKLQkJCi0JCWZvciAoSVBQcm9jZXNzQ29udHJvbCBwcm9jZXNzIDogcHJvY2Vzc0NvbnRyb2xzKSB7Ci0JCQlyZW1vdmVDaGlsZChwcm9jZXNzKTsKLQkJCXByb2Nlc3MuY2xlYXJPdXRwdXQoKTsKLQkJCVN0cmluZyBpZHggPSBwcm9jZXNzLmdldFByb2Nlc3NJbmRleCgpOwotCQkJaWYgKGlkeCAhPSBudWxsKSB7Ci0JCQkJaW5kZXhNYXAucmVtb3ZlKGlkeCk7Ci0JCQl9Ci0JCQlwcm9jZXNzZXMuYWRkKHByb2Nlc3MpOwotCQl9Ci0JCQotCQlmaXJlUmVtb3ZlUHJvY2Vzc2VzKHByb2Nlc3Nlcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2Ijc2V0RGVidWcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYnVnKCkgewotCQlCb29sZWFuQXR0cmlidXRlIGRlYnVnID0gZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdGbGFnQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJZGVidWcuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbCNzZXRMYXVuY2hDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgd2hlbiBhIGpvYiBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGF0dHJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VkSm9iKEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJSUpvYkNoYW5nZUV2ZW50IGUgPSBuZXcgSm9iQ2hhbmdlRXZlbnQodGhpcywgYXR0cnMpOwotCQkKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBlbGVtZW50TGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElKb2JMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZW5kIElDaGFuZ2VkUHJvY2Vzc0V2ZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIG5vZGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VkUHJvY2Vzc2VzKENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJSUNoYW5nZWRQcm9jZXNzRXZlbnQgZSA9IAotCQkJbmV3IENoYW5nZWRQcm9jZXNzRXZlbnQodGhpcywgcHJvY2Vzc2VzKTsKLQkJCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSUpvYkNoaWxkTGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyB3aGVuIGEgbmV3IHByb2Nlc3MgaXMgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlTmV3UHJvY2Vzc2VzKENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJSU5ld1Byb2Nlc3NFdmVudCBlID0gCi0JCQluZXcgTmV3UHJvY2Vzc0V2ZW50KHRoaXMsIHByb2Nlc3Nlcyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElKb2JDaGlsZExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIHdoZW4gdGhlIGNvbGxlY3Rpb24gb2YgcHJvY2Vzc2VzIGFyZSByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzZXMgdG8gcmVtb3ZlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZW1vdmVQcm9jZXNzZXMoQ29sbGVjdGlvbjxJUFByb2Nlc3M+IHByb2Nlc3NlcykgewotCQlJUmVtb3ZlUHJvY2Vzc0V2ZW50IGUgPSAKLQkJCW5ldyBSZW1vdmVQcm9jZXNzRXZlbnQodGhpcywgcHJvY2Vzc2VzKTsKLQkJCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSUpvYkNoaWxkTGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLlBFbGVtZW50I2RvQWRkQXR0cmlidXRlSG9vayhqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvQWRkQXR0cmlidXRlSG9vayhBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJpYnMpIHsKLQkJZmlyZUNoYW5nZWRKb2IoYXR0cmlicyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUE1hY2hpbmUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL1BNYWNoaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDdjOWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUE1hY2hpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQRWxlbWVudENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTWFjaGluZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTm9kZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5NYWNoaW5lQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWROb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU1hY2hpbmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuQ2hhbmdlZE5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuTWFjaGluZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5OZXdOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLlJlbW92ZU5vZGVFdmVudDsKLQotcHVibGljIGNsYXNzIFBNYWNoaW5lIGV4dGVuZHMgUGFyZW50IGltcGxlbWVudHMgSVBNYWNoaW5lQ29udHJvbCB7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgZWxlbWVudExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBjaGlsZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIFN0cmluZyBhcmNoID0gInVuZGVmaW5lZCI7Ci0gICAgCi0gICAgcHVibGljIFBNYWNoaW5lKFN0cmluZyBpZCwgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0sIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpIHsKLQkJc3VwZXIoaWQsIHJtLCBQX01BQ0hJTkUsIGF0dHJzKTsKLQkJLyoKLQkJICogQ3JlYXRlIHJlcXVpcmVkIGF0dHJpYnV0ZXMuCi0JCSAqLwotCQlFbnVtZXJhdGVkQXR0cmlidXRlPFN0YXRlPiBtYWNoaW5lU3RhdGUgPSBnZXRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAobWFjaGluZVN0YXRlID09IG51bGwpIHsKLQkJCW1hY2hpbmVTdGF0ZSA9IE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJYWRkQXR0cmlidXRlKG1hY2hpbmVTdGF0ZSk7Ci0JCX0KLQkJSW50ZWdlckF0dHJpYnV0ZSBudW1Ob2RlcyA9IGdldEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXROdW1Ob2Rlc0F0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0gICAgICAgIGlmIChudW1Ob2RlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG51bU5vZGVzID0gTWFjaGluZUF0dHJpYnV0ZXMuZ2V0TnVtTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL0ZJWE1FCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUobnVtTm9kZXMpOwotICAgICAgICB9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZSNhZGRDaGlsZExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZU5vZGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZExpc3RlbmVyKElNYWNoaW5lQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZSNhZGRFbGVtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudExpc3RlbmVyKElNYWNoaW5lTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZWxlbWVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sI2FkZE5vZGVBdHRyaWJ1dGVzKGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU8Pyw/LD8+W10pCi0JICovCi0JcHVibGljIHZvaWQgYWRkTm9kZUF0dHJpYnV0ZXMoQ29sbGVjdGlvbjxJUE5vZGVDb250cm9sPiBub2RlQ29udHJvbHMsCi0JCQlJQXR0cmlidXRlPD8sID8sID8+W10gYXR0cnMpIHsKLQkJTGlzdDxJUE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxJUE5vZGU+KG5vZGVDb250cm9scy5zaXplKCkpOwotCQlmb3IgKElQTm9kZUNvbnRyb2wgbm9kZSA6IG5vZGVDb250cm9scykgewotCQkJbm9kZS5hZGRBdHRyaWJ1dGVzKGF0dHJzKTsKLQkJfQotCQlmaXJlQ2hhbmdlZE5vZGVzKG5vZGVzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbCNhZGROb2RlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROb2RlcyhDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVDb250cm9scykgewotCQlhc3NlcnQoZ2V0QXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldE51bU5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpLmVxdWFscyhnZXROb2RlcygpLmxlbmd0aCkpOwotCQlMaXN0PElQTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PElQTm9kZT4obm9kZUNvbnRyb2xzLnNpemUoKSk7Ci0JCQotCQlmb3IgKElQTm9kZUNvbnRyb2wgbm9kZSA6IG5vZGVDb250cm9scykgewotCQkJYWRkQ2hpbGQobm9kZSk7Ci0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlnZXRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0TnVtTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLnNldFZhbHVlKGdldE5vZGVzKCkubGVuZ3RoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAKLQkJZmlyZU5ld05vZGVzKG5vZGVzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmUjZ2V0QXJjaCgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0QXJjaCgpIHsKLQkJcmV0dXJuIGFyY2g7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lI2dldE5vZGVCeUlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQTm9kZSBnZXROb2RlQnlJZChTdHJpbmcgaWQpIHsKLQkJSVBFbGVtZW50Q29udHJvbCBlbGVtZW50ID0gZmluZENoaWxkKGlkKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIChJUE5vZGVDb250cm9sKSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sI2dldE5vZGVDb250cm9scygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gZ2V0Tm9kZUNvbnRyb2xzKCkgewotCQlJUEVsZW1lbnRDb250cm9sW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlMaXN0PElQTm9kZUNvbnRyb2w+IG5vZGVzID0KLQkJCW5ldyBBcnJheUxpc3Q8SVBOb2RlQ29udHJvbD4oY2hpbGRyZW4ubGVuZ3RoKTsKLQkJZm9yIChJUEVsZW1lbnRDb250cm9sIGVsZW1lbnQgOiBjaGlsZHJlbikgewotCQkJbm9kZXMuYWRkKChJUE5vZGVDb250cm9sKWVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lI2dldE5vZGVzKCkKLQkgKi8KLQlwdWJsaWMgSVBOb2RlW10gZ2V0Tm9kZXMoKSB7Ci0JCUNvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gbm9kZXMgPSBnZXROb2RlQ29udHJvbHMoKTsKLQkJcmV0dXJuIG5vZGVzLnRvQXJyYXkobmV3IElQTm9kZVtub2Rlcy5zaXplKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUE1hY2hpbmUjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSVJlc291cmNlTWFuYWdlcikgZ2V0UGFyZW50KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZSNnZXRTdGF0ZSgpCi0JICovCi0JcHVibGljIFN0YXRlIGdldFN0YXRlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZSNyZW1vdmVDaGlsZExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZU5vZGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZExpc3RlbmVyKElNYWNoaW5lQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZSNyZW1vdmVFbGVtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudExpc3RlbmVyKElNYWNoaW5lTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZWxlbWVudExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sI3JlbW92ZU5vZGUob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTm9kZUNvbnRyb2wpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTm9kZXMoQ29sbGVjdGlvbjxJUE5vZGVDb250cm9sPiBub2RlQ29udHJvbHMpIHsKLQkJTGlzdDxJUE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxJUE5vZGU+KG5vZGVDb250cm9scy5zaXplKCkpOwotCQkKLQkJZm9yIChJUE5vZGVDb250cm9sIG5vZGUgOiBub2RlQ29udHJvbHMpIHsKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQl9Ci0JCQotCQlmaXJlUmVtb3ZlTm9kZXMobm9kZXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZSNzZXRBcmNoKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsKLQkJdGhpcy5hcmNoID0gYXJjaDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmUjdG90YWxOb2RlcygpCi0JICovCi0JcHVibGljIGludCB0b3RhbE5vZGVzKCkgewotCQlyZXR1cm4gc2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZUNoYW5nZWRNYWNoaW5lKEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJSU1hY2hpbmVDaGFuZ2VFdmVudCBlID0gCi0JCQluZXcgTWFjaGluZUNoYW5nZUV2ZW50KHRoaXMsIGF0dHJzKTsKLQkJCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogZWxlbWVudExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJTWFjaGluZUxpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIElDaGFuZ2VkTm9kZUV2ZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIG5vZGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VkTm9kZXMoQ29sbGVjdGlvbjxJUE5vZGU+IG5vZGVzKSB7Ci0JCUlDaGFuZ2VkTm9kZUV2ZW50IGUgPSAKLQkJCW5ldyBDaGFuZ2VkTm9kZUV2ZW50KHRoaXMsIG5vZGVzKTsKLQkJCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSU1hY2hpbmVDaGlsZExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmQgSU5ld05vZGVFdmVudCB0byByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBub2RlcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlTmV3Tm9kZXMoQ29sbGVjdGlvbjxJUE5vZGU+IG5vZGVzKSB7Ci0JCUlOZXdOb2RlRXZlbnQgZSA9IAotCQkJbmV3IE5ld05vZGVFdmVudCh0aGlzLCBub2Rlcyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElNYWNoaW5lQ2hpbGRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlUmVtb3ZlTm9kZXMoQ29sbGVjdGlvbjxJUE5vZGU+IG5vZGVzKSB7Ci0JCUlSZW1vdmVOb2RlRXZlbnQgZSA9IAotCQkJbmV3IFJlbW92ZU5vZGVFdmVudCh0aGlzLCBub2Rlcyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElNYWNoaW5lQ2hpbGRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5QRWxlbWVudCNkb0FkZEF0dHJpYnV0ZUhvb2soamF2YS51dGlsLk1hcCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZEF0dHJpYnV0ZUhvb2soQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlmaXJlQ2hhbmdlZE1hY2hpbmUoYXR0cnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUE5vZGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL1BOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTEwZTAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBFbGVtZW50Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBQcm9jZXNzQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTm9kZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Ob2RlQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOb2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTm9kZUNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLkNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLk5ld1Byb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5SZW1vdmVQcm9jZXNzRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQTm9kZSBleHRlbmRzIFBhcmVudCBpbXBsZW1lbnRzIElQTm9kZUNvbnRyb2wsIElKb2JDaGlsZExpc3RlbmVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBlbGVtZW50TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGNoaWxkTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JcHVibGljIFBOb2RlKFN0cmluZyBpZCwgSVBNYWNoaW5lQ29udHJvbCBtYWMsIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpIHsKLQkJc3VwZXIoaWQsIG1hYywgUF9OT0RFLCBhdHRycyk7Ci0JCS8qCi0JCSAqIENyZWF0ZSByZXF1aXJlZCBhdHRyaWJ1dGVzLgotCQkgKi8KLQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxTdGF0ZT4gbm9kZVN0YXRlID0gZ2V0QXR0cmlidXRlKE5vZGVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKG5vZGVTdGF0ZSA9PSBudWxsKSB7Ci0JCQlub2RlU3RhdGUgPSBOb2RlQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKTsKLQkJCWFkZEF0dHJpYnV0ZShub2RlU3RhdGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlI2FkZENoaWxkTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlUHJvY2Vzc0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkTGlzdGVuZXIoSU5vZGVDaGlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNoaWxkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZSNhZGRFbGVtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudExpc3RlbmVyKElOb2RlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZWxlbWVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbCNhZGRQcm9jZXNzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlcyhDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3NDb250cm9scykgewotCQlMaXN0PElQUHJvY2Vzcz4gcHJvY3MgPSBuZXcgQXJyYXlMaXN0PElQUHJvY2Vzcz4ocHJvY2Vzc0NvbnRyb2xzLnNpemUoKSk7Ci0JCVNldDxJUEpvYj4gam9icyA9IG5ldyBIYXNoU2V0PElQSm9iPigpOwotCQkKLQkJZm9yIChJUFByb2Nlc3NDb250cm9sIHByb2Nlc3MgOiBwcm9jZXNzQ29udHJvbHMpIHsKLQkJCS8qCi0JCQkgKiBBZGQgdGhlIHByb2Nlc3MgYXMgYSBjaGlsZCBvZiB0aGUgbm9kZQotCQkJICovCi0JCQlhZGRDaGlsZChwcm9jZXNzKTsKLQkJCQotCQkJLyoKLQkJCSAqIEFkZCB0aGlzIG5vZGUgdG8gdGhlIHByb2Nlc3MKLQkJCSAqLwotCQkJcHJvY2Vzcy5hZGROb2RlKHRoaXMpOwotCQkJCi0JCQkvKgotCQkJICogRmluZCB0aGUgc2V0IG9mIGpvYnMgdGhhdCBzdGFydGVkIHRoZXNlIHByb2Nlc3NlcwotCQkJICovCi0JCQlqb2JzLmFkZChwcm9jZXNzLmdldEpvYigpKTsKLQkJCQotCQkJLyoKLQkJCSAqIEFkZCB0aGUgcHJvY2VzcyB0byB0aGUgZXZlbnQgbGlzdAotCQkJICovCi0JCQlwcm9jcy5hZGQocHJvY2Vzcyk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEFkZCB0aGlzIG5vZGUgdG8gdGhlIGxpc3RlbmVycyBmb3Igam9iIGNoaWxkIGV2ZW50cy4gVGhpcyBpcyBzbwotCQkgKiB3ZSBjYW4gZm9yd2FyZCBJQ2hhbmdlZFByb2Nlc3MgZXZlbnRzIHRvIHRoZSBJTm9kZUNoaWxkTGlzdGVycy4KLQkJICovCi0JCWZvciAoSVBKb2Igam9iIDogam9icykgewotCQkJam9iLmFkZENoaWxkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEZpcmUgdGhlIElOZXdQcm9jZXNzIGV2ZW50IGZvciB0aGVzZSBwcm9jZXNzZXMKLQkJICovCi0JCWZpcmVOZXdQcm9jZXNzZXMocHJvY3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE5vZGVDb250cm9sI2dldE1hY2hpbmVDb250cm9sKCkKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lIGdldE1hY2hpbmUoKSB7Ci0JCXJldHVybiBnZXRNYWNoaW5lQ29udHJvbCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbCNnZXRNYWNoaW5lQ29udHJvbCgpCi0JICovCi0JcHVibGljIElQTWFjaGluZUNvbnRyb2wgZ2V0TWFjaGluZUNvbnRyb2woKSB7Ci0JCUlQRWxlbWVudENvbnRyb2wgY3VycmVudCA9IHRoaXM7Ci0JCWRvIHsKLQkJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgSVBNYWNoaW5lQ29udHJvbCkgewotCQkJCXJldHVybiAoSVBNYWNoaW5lQ29udHJvbCkgY3VycmVudDsKLQkJCX0KLQkJfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudCgpKSAhPSBudWxsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZSNnZXROb2RlTnVtYmVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOdW1iZXIoKSB7Ci0JCUludGVnZXJBdHRyaWJ1dGUgbnVtID0gZ2V0QXR0cmlidXRlKE5vZGVBdHRyaWJ1dGVzLmdldE51bWJlckF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCWlmIChudW0gIT0gbnVsbCkgewotCQkJcmV0dXJuIG51bS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbCNnZXRQcm9jZXNzQ29udHJvbHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IGdldFByb2Nlc3NDb250cm9scygpIHsKLQkJSVBFbGVtZW50Q29udHJvbFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJTGlzdDxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMgPQotCQkJbmV3IEFycmF5TGlzdDxJUFByb2Nlc3NDb250cm9sPihjaGlsZHJlbi5sZW5ndGgpOwotCQlmb3IgKElQRWxlbWVudENvbnRyb2wgZWxlbWVudCA6IGNoaWxkcmVuKSB7Ci0JCQlwcm9jZXNzZXMuYWRkKChJUFByb2Nlc3NDb250cm9sKWVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlI2dldFByb2Nlc3NlcygpCi0JICovCi0JcHVibGljIElQUHJvY2Vzc1tdIGdldFByb2Nlc3NlcygpIHsKLQkJcmV0dXJuIGdldFByb2Nlc3NDb250cm9scygpLnRvQXJyYXkobmV3IElQUHJvY2Vzc1tnZXRQcm9jZXNzQ29udHJvbHMoKS5zaXplKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGUjZ2V0U3RhdGUoKQotCSAqLwotCXB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShOb2RlQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUHJvY2Vzc0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUHJvY2Vzc0V2ZW50IGUpIHsKLQkJZmlyZUNoYW5nZWRQcm9jZXNzZXMoZS5nZXRQcm9jZXNzZXMoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUHJvY2Vzc0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVQcm9jZXNzRXZlbnQgZSkgewotCQlmb3IgKElQUHJvY2VzcyBwcm9jZXNzIDogZS5nZXRQcm9jZXNzZXMoKSkgewotCQkJcmVtb3ZlQ2hpbGQoKElQUHJvY2Vzc0NvbnRyb2wpcHJvY2Vzcyk7Ci0JCX0KLQkJCi0JCWZpcmVSZW1vdmVQcm9jZXNzZXMoZS5nZXRQcm9jZXNzZXMoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UHJvY2Vzc0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdQcm9jZXNzRXZlbnQgZSkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlI3JlbW92ZUNoaWxkTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlUHJvY2Vzc0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkTGlzdGVuZXIoSU5vZGVDaGlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNoaWxkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlI3JlbW92ZUVsZW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU5vZGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSU5vZGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQllbGVtZW50TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTm9kZUNvbnRyb2wjcmVtb3ZlUHJvY2VzcyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBQcm9jZXNzQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9jZXNzZXMoQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzQ29udHJvbHMpIHsKLQkJTGlzdDxJUFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SVBQcm9jZXNzPihwcm9jZXNzQ29udHJvbHMuc2l6ZSgpKTsKLQkJCi0JCWZvciAoSVBQcm9jZXNzQ29udHJvbCBwcm9jZXNzIDogcHJvY2Vzc0NvbnRyb2xzKSB7Ci0JCQlyZW1vdmVDaGlsZChwcm9jZXNzKTsKLQkJCXByb2Nlc3MucmVtb3ZlTm9kZSgpOwotCQkJcHJvY2Vzc2VzLmFkZChwcm9jZXNzKTsKLQkJfQotCQkKLQkJZmlyZVJlbW92ZVByb2Nlc3Nlcyhwcm9jZXNzZXMpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgd2hlbiBhIG5vZGUgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBhdHRycwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlQ2hhbmdlZE5vZGUoQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlJTm9kZUNoYW5nZUV2ZW50IGUgPSBuZXcgTm9kZUNoYW5nZUV2ZW50KHRoaXMsIGF0dHJzKTsKLQkJCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogZWxlbWVudExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJTm9kZUxpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIElOZXdQcm9jZXNzRXZlbnQgdG8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlTmV3UHJvY2Vzc2VzKENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJSU5ld1Byb2Nlc3NFdmVudCBlID0gCi0JCQluZXcgTmV3UHJvY2Vzc0V2ZW50KHRoaXMsIHByb2Nlc3Nlcyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElOb2RlQ2hpbGRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlUmVtb3ZlUHJvY2Vzc2VzKENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJSVJlbW92ZVByb2Nlc3NFdmVudCBlID0gCi0JCQluZXcgUmVtb3ZlUHJvY2Vzc0V2ZW50KHRoaXMsIHByb2Nlc3Nlcyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElOb2RlQ2hpbGRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZW5kIElDaGFuZ2VkUHJvY2Vzc0V2ZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIG5vZGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VkUHJvY2Vzc2VzKENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJSUNoYW5nZWRQcm9jZXNzRXZlbnQgZSA9IAotCQkJbmV3IENoYW5nZWRQcm9jZXNzRXZlbnQodGhpcywgcHJvY2Vzc2VzKTsKLQkJCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSU5vZGVDaGlsZExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5QRWxlbWVudCNkb0FkZEF0dHJpYnV0ZUhvb2soamF2YS51dGlsLk1hcCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZEF0dHJpYnV0ZUhvb2soQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlmaXJlQ2hhbmdlZE5vZGUoYXR0cnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUFByb2Nlc3MuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL1BQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YmY1Y2YuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUFByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQRWxlbWVudENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBQcm9jZXNzQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUHJvY2Vzc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUHJvY2Vzc0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuT3V0cHV0VGV4dEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLlByb2Nlc3NDaGFuZ2VFdmVudDsKLQotcHVibGljIGNsYXNzIFBQcm9jZXNzIGV4dGVuZHMgUGFyZW50IGltcGxlbWVudHMgSVBQcm9jZXNzQ29udHJvbCB7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBlbGVtZW50TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgZmluYWwgT3V0cHV0VGV4dEZpbGUgb3V0cHV0RmlsZTsKLQlwcml2YXRlIFN0cmluZyBvdXRwdXREaXJQYXRoID0gbnVsbDsKLQlwcml2YXRlIGludCBzdG9yZUxpbmVzID0gMDsKLQotCS8qCi0JICogdGhlIG5vZGUgdGhhdCB0aGlzIHByb2Nlc3MgaXMgcnVubmluZyBvbiwgb3Igd2FzIHNjaGVkdWxlZCBvbiAvIHdpbGwgYmUsIGV0YwotCSAqLwotCXByaXZhdGUgSVBOb2RlQ29udHJvbCBub2RlOwotCi0JcHVibGljIFBQcm9jZXNzKFN0cmluZyBpZCwgSVBKb2JDb250cm9sIGpvYiwgSUF0dHJpYnV0ZTw/LD8sPz5bXSBhdHRycykgewotCQlzdXBlcihpZCwgam9iLCBQX1BST0NFU1MsIGF0dHJzKTsKLQkJc2V0T3V0cHV0U3RvcmUoKTsKLQkJCi0JCS8qCi0JCSAqIERlcml2ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgb3V0cHV0IGZpbGUKLQkJICovCi0JCVN0cmluZyBuYW1lID0gam9iLmdldFF1ZXVlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0TmFtZSgpCi0JCQkJCQkrICJfIiArIGpvYi5nZXRRdWV1ZSgpLmdldE5hbWUoKQotCQkJCQkJKyAiXyIgKyBqb2IuZ2V0TmFtZSgpCi0JCQkJCQkrICJfIiArIGdldE5hbWUoKTsKLQkKLQkJb3V0cHV0RmlsZSA9IG5ldyBPdXRwdXRUZXh0RmlsZShuYW1lLCAKLQkJCQkJCQlQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRvdXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuZ2V0SWQoKSwgCi0JCQkJCQkJb3V0cHV0RGlyUGF0aCwgc3RvcmVMaW5lcyk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgcmVxdWlyZWQgYXR0cmlidXRlcy4KLQkJICovCi0JCUVudW1lcmF0ZWRBdHRyaWJ1dGU8U3RhdGU+IHByb2NTdGF0ZSA9IGdldEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCWlmIChwcm9jU3RhdGUgPT0gbnVsbCkgewotCQkJcHJvY1N0YXRlID0gUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKCk7Ci0JCQlhZGRBdHRyaWJ1dGUocHJvY1N0YXRlKTsKLQkJfQotCQlJbnRlZ2VyQXR0cmlidXRlIGV4aXRDb2RlID0gZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldEV4aXRDb2RlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKGV4aXRDb2RlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZXhpdENvZGUgPSBQcm9jZXNzQXR0cmlidXRlcy5nZXRFeGl0Q29kZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKTsKLQkJCQlhZGRBdHRyaWJ1dGUoZXhpdENvZGUpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlJbnRlZ2VyQXR0cmlidXRlIHBpZCA9IGdldEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRQSURBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAocGlkID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcGlkID0gUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0UElEQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJCWFkZEF0dHJpYnV0ZShwaWQpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlJbnRlZ2VyQXR0cmlidXRlIGluZGV4ID0gZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldEluZGV4QXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKGluZGV4ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW5kZXggPSBQcm9jZXNzQXR0cmlidXRlcy5nZXRJbmRleEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKTsKLQkJCQlhZGRBdHRyaWJ1dGUoaW5kZXgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQkKLQkJU3RyaW5nQXR0cmlidXRlIHNpZ25hbE5hbWUgPSBnZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U2lnbmFsTmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCWlmIChzaWduYWxOYW1lID09IG51bGwpIHsKLQkJCXNpZ25hbE5hbWUgPSBQcm9jZXNzQXR0cmlidXRlcy5nZXRTaWduYWxOYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJYWRkQXR0cmlidXRlKHNpZ25hbE5hbWUpOwotCQl9CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNhZGRFbGVtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklQcm9jZXNzTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudExpc3RlbmVyKElQcm9jZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZWxlbWVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNhZGROb2RlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTm9kZShJUE5vZGUgbm9kZSkgewotCQl0aGlzLm5vZGUgPSAoSVBOb2RlQ29udHJvbCkgbm9kZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzI2NsZWFyT3V0cHV0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck91dHB1dCgpIHsKLQkJb3V0cHV0RmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3MjZ2V0RXhpdENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhpdENvZGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0RXhpdENvZGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzI2dldEpvYigpCi0JICovCi0JcHVibGljIElQSm9iIGdldEpvYigpIHsKLQkJcmV0dXJuIGdldEpvYkNvbnRyb2woKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUHJvY2Vzc0NvbnRyb2wjZ2V0Sm9iQ29udHJvbCgpCi0JICovCi0JcHVibGljIElQSm9iQ29udHJvbCBnZXRKb2JDb250cm9sKCkgewotCQlJUEVsZW1lbnRDb250cm9sIGN1cnJlbnQgPSB0aGlzOwotCQlkbyB7Ci0JCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIElQSm9iQ29udHJvbCkKLQkJCQlyZXR1cm4gKElQSm9iQ29udHJvbCkgY3VycmVudDsKLQkJfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudCgpKSAhPSBudWxsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNnZXROb2RlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElQTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5ub2RlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3MjZ2V0UGlkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBpZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRQSURBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNnZXRQcm9jZXNzSW5kZXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0luZGV4KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldEluZGV4QXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzI2dldFNhdmVkT3V0cHV0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNhdmVkT3V0cHV0KFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZikgewotCQlpZiAoYXR0ckRlZi5lcXVhbHMoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3Rkb3V0QXR0cmlidXRlRGVmaW5pdGlvbigpKSkgewotCQkJcmV0dXJuIG91dHB1dEZpbGUuZ2V0Q29udGVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNnZXRTaWduYWxOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hbE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U2lnbmFsTmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzI2dldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgU3RhdGUgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNpc1Rlcm1pbmF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLQkJU3RhdGUgc3RhdGUgPSBnZXRTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gU3RhdGUuRVJST1IgfHwgc3RhdGUgPT0gU3RhdGUuRVhJVEVEIHx8IHN0YXRlID09IFN0YXRlLkVYSVRFRF9TSUdOQUxMRUQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzI3JlbW92ZUVsZW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVByb2Nlc3NMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSVByb2Nlc3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQllbGVtZW50TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNyZW1vdmVOb2RlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTm9kZSgpIHsKLQkJbm9kZSA9IG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzcyNzZXRTdGF0ZShvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXRlKFN0YXRlIHN0YXRlKSB7Ci0JCUVudW1lcmF0ZWRBdHRyaWJ1dGU8U3RhdGU+IHByb2NTdGF0ZSA9IGdldEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCXByb2NTdGF0ZS5zZXRWYWx1ZShzdGF0ZSk7Ci0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQlhdHRycy5hZGRBdHRyaWJ1dGUocHJvY1N0YXRlKTsKLQkJZmlyZUNoYW5nZWRQcm9jZXNzKGF0dHJzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzI3NldFRlcm1pbmF0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXJtaW5hdGVkKGJvb2xlYW4gaXNUZXJtaW5hdGVkKSB7Ci0JCXNldFN0YXRlKFN0YXRlLkVYSVRFRCk7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgb3V0cHV0IGZyb20gcHJvY2VzcyB0byBsb2NhbCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKLQkJb3V0cHV0RmlsZS53cml0ZShvdXRwdXQgKyAiXG4iKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGNoYW5nZWQgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZUNoYW5nZWRQcm9jZXNzKEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJSVByb2Nlc3NDaGFuZ2VFdmVudCBlID0gbmV3IFByb2Nlc3NDaGFuZ2VFdmVudCh0aGlzLCBhdHRycyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGVsZW1lbnRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVByb2Nlc3NMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsb2NhbCBjYWNoZSBmb3IgcHJvY2VzcyBvdXRwdXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE91dHB1dFN0b3JlKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCW91dHB1dERpclBhdGggPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5PVVRQVVRfRElSKTsKLQkJc3RvcmVMaW5lcyA9IHByZWZlcmVuY2VzLmdldEludChQcmVmZXJlbmNlQ29uc3RhbnRzLlNUT1JFX0xJTkUpOwotCQlpZiAob3V0cHV0RGlyUGF0aCA9PSBudWxsIHx8IG91dHB1dERpclBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJb3V0cHV0RGlyUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZfT1VUUFVUX0RJUl9OQU1FKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKHN0b3JlTGluZXMgPT0gMCkgewotCQkJc3RvcmVMaW5lcyA9IFByZWZlcmVuY2VDb25zdGFudHMuREVGX1NUT1JFX0xJTkU7Ci0JCX0KLQkJRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBuZXcgRmlsZShvdXRwdXREaXJQYXRoKTsKLQkJaWYgKCFvdXRwdXREaXJlY3RvcnkuZXhpc3RzKCkpIHsKLQkJCW91dHB1dERpcmVjdG9yeS5ta2RpcigpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLlBFbGVtZW50I2RvQWRkQXR0cmlidXRlSG9vayhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZEF0dHJpYnV0ZUhvb2soQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlTdHJpbmdBdHRyaWJ1dGUgYXR0ciA9IGF0dHJzLmdldEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRvdXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhZGRPdXRwdXQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlmaXJlQ2hhbmdlZFByb2Nlc3MoYXR0cnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUFF1ZXVlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9QUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhY2EwMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9QUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBFbGVtZW50Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlF1ZXVlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlF1ZXVlQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUXVldWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuQ2hhbmdlZEpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5OZXdKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuUXVldWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuUmVtb3ZlSm9iRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQUXVldWUgZXh0ZW5kcyBQYXJlbnQgaW1wbGVtZW50cyBJUFF1ZXVlQ29udHJvbCB7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgZWxlbWVudExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBjaGlsZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkKLQlwdWJsaWMgUFF1ZXVlKFN0cmluZyBpZCwgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0sIElBdHRyaWJ1dGU8Pyw/LD8+W10gYXR0cnMpIHsKLQkJc3VwZXIoaWQsIHJtLCBQX1FVRVVFLCBhdHRycyk7Ci0JCS8qCi0JCSAqIENyZWF0ZSByZXF1aXJlZCBhdHRyaWJ1dGVzLgotCQkgKi8KLQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxTdGF0ZT4gcXVldWVTdGF0ZSA9IGdldEF0dHJpYnV0ZShRdWV1ZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAocXVldWVTdGF0ZSA9PSBudWxsKSB7Ci0JCQlxdWV1ZVN0YXRlID0gUXVldWVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJYWRkQXR0cmlidXRlKHF1ZXVlU3RhdGUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWUjYWRkQ2hpbGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlSm9iTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRMaXN0ZW5lcihJUXVldWVDaGlsZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNoaWxkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZSNhZGRFbGVtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaXN0ZW5lcihJUXVldWVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQllbGVtZW50TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUXVldWVDb250cm9sI2FkZEpvYkF0dHJpYnV0ZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTw/LD8sPz5bXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRKb2JBdHRyaWJ1dGVzKENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JDb250cm9scywKLQkJCUlBdHRyaWJ1dGU8PywgPywgPz5bXSBhdHRycykgewotCQlMaXN0PElQSm9iPiBqb2JzID0gbmV3IEFycmF5TGlzdDxJUEpvYj4oam9iQ29udHJvbHMuc2l6ZSgpKTsKLQkJCi0JCWZvciAoSVBKb2JDb250cm9sIGpvYiA6IGpvYkNvbnRyb2xzKSB7Ci0JCQlqb2IuYWRkQXR0cmlidXRlcyhhdHRycyk7Ci0JCQlqb2JzLmFkZChqb2IpOwotCQl9Ci0JCQotCQlmaXJlQ2hhbmdlZEpvYnMoam9icyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbCNhZGRKb2JzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEpvYnMoQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYkNvbnRyb2xzKSB7Ci0JCUxpc3Q8SVBKb2I+IGpvYnMgPSBuZXcgQXJyYXlMaXN0PElQSm9iPihqb2JDb250cm9scy5zaXplKCkpOwotCQkKLQkJZm9yIChJUEpvYkNvbnRyb2wgam9iIDogam9iQ29udHJvbHMpIHsKLQkJCWFkZENoaWxkKGpvYik7Ci0JCQlqb2JzLmFkZChqb2IpOwotCQl9Ci0KLQkJZmlyZU5ld0pvYnMoam9icyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZSNnZXRKb2JCeUlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQSm9iIGdldEpvYkJ5SWQoU3RyaW5nIGpvYl9pZCkgewotCQlyZXR1cm4gZ2V0Sm9iQ29udHJvbChqb2JfaWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbCNnZXRKb2JDb250cm9sKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQSm9iQ29udHJvbCBnZXRKb2JDb250cm9sKFN0cmluZyBqb2JfaWQpIHsKLQkJSVBFbGVtZW50Q29udHJvbCBlbGVtZW50ID0gZmluZENoaWxkKGpvYl9pZCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiAoSVBKb2JDb250cm9sKSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbCNnZXRKb2JDb250cm9scygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBnZXRKb2JDb250cm9scygpIHsKLQkJSVBFbGVtZW50Q29udHJvbFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJTGlzdDxJUEpvYkNvbnRyb2w+IGpvYnMgPQotCQkJbmV3IEFycmF5TGlzdDxJUEpvYkNvbnRyb2w+KGNoaWxkcmVuLmxlbmd0aCk7Ci0JCWZvciAoSVBFbGVtZW50Q29udHJvbCBlbGVtZW50IDogY2hpbGRyZW4pIHsKLQkJCWpvYnMuYWRkKChJUEpvYkNvbnRyb2wpZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGpvYnM7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWUjZ2V0Sm9icygpCi0JICovCi0JcHVibGljIElQSm9iW10gZ2V0Sm9icygpIHsKLQkJQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYnMgPSBnZXRKb2JDb250cm9scygpOwotCQlyZXR1cm4gam9icy50b0FycmF5KG5ldyBJUEpvYkNvbnRyb2xbam9icy5zaXplKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUE1hY2hpbmUjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSVJlc291cmNlTWFuYWdlcikgZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZSNnZXRTdGF0ZSgpCi0JICovCi0JcHVibGljIFN0YXRlIGdldFN0YXRlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFF1ZXVlQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZSNyZW1vdmVDaGlsZExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVKb2JMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZExpc3RlbmVyKElRdWV1ZUNoaWxkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY2hpbGRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlI3JlbW92ZUVsZW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudExpc3RlbmVyKElRdWV1ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWVsZW1lbnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2wjcmVtb3ZlSm9icyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2JzKENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JDb250cm9scykgewotCQlMaXN0PElQSm9iPiBqb2JzID0gbmV3IEFycmF5TGlzdDxJUEpvYj4oam9iQ29udHJvbHMuc2l6ZSgpKTsKLQkJCi0JCWZvciAoSVBKb2JDb250cm9sIGpvYiA6IGpvYkNvbnRyb2xzKSB7Ci0JCQlqb2IucmVtb3ZlUHJvY2Vzc2VzKGpvYi5nZXRQcm9jZXNzQ29udHJvbHMoKSk7Ci0JCQlyZW1vdmVDaGlsZChqb2IpOwotCQkJam9icy5hZGQoam9iKTsKLQkJfQotCQkKLQkJZmlyZVJlbW92ZUpvYnMoam9icyk7Ci0JfQotCi0JLyoqCi0JICogU2VuZCBJQ2hhbmdlZEpvYkV2ZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGpvYnMgam9icyB0aGF0IGhhdmUgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlQ2hhbmdlZEpvYnMoQ29sbGVjdGlvbjxJUEpvYj4gam9icykgewotCQlJQ2hhbmdlZEpvYkV2ZW50IGUgPSAKLQkJCW5ldyBDaGFuZ2VkSm9iRXZlbnQodGhpcywgam9icyk7Ci0JCQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElRdWV1ZUNoaWxkTGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VuZCBJUXVldWVDaGFuZ2VFdmVudCB0byByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBhdHRycyBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VkUXVldWUoQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlJUXVldWVDaGFuZ2VFdmVudCBlID0gbmV3IFF1ZXVlQ2hhbmdlRXZlbnQodGhpcywgYXR0cnMpOwotCQkKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBlbGVtZW50TGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElRdWV1ZUxpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmQgSU5ld0pvYkV2ZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGpvYnMgbmV3IGpvYnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZU5ld0pvYnMoQ29sbGVjdGlvbjxJUEpvYj4gam9icykgewotCQlJTmV3Sm9iRXZlbnQgZSA9IAotCQkJbmV3IE5ld0pvYkV2ZW50KHRoaXMsIGpvYnMpOwotCQkKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBjaGlsZExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUXVldWVDaGlsZExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmQgSVJlbW92ZUpvYkV2ZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGpvYiByZW1vdmVkIGpvYnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZVJlbW92ZUpvYnMoQ29sbGVjdGlvbjxJUEpvYj4gam9icykgewotCQlJUmVtb3ZlSm9iRXZlbnQgZSA9IAotCQkJbmV3IFJlbW92ZUpvYkV2ZW50KHRoaXMsIGpvYnMpOwotCQkKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBjaGlsZExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUXVldWVDaGlsZExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLlBFbGVtZW50I2RvQWRkQXR0cmlidXRlSG9vayhqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvQWRkQXR0cmlidXRlSG9vayhBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCWZpcmVDaGFuZ2VkUXVldWUoYXR0cnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUFVuaXZlcnNlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9QVW5pdmVyc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiYjc4OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9QVW5pdmVyc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVzOwotCi1wdWJsaWMgY2xhc3MgUFVuaXZlcnNlIGV4dGVuZHMgUEVsZW1lbnQgaW1wbGVtZW50cyBJUFVuaXZlcnNlQ29udHJvbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJNSURfU0hJRlQgPSAyNDsKLQlwcml2YXRlIHN0YXRpYyBJQXR0cmlidXRlPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVzKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZ0F0dHJpYnV0ZSBuYW1lQXR0ciA9IEVsZW1lbnRBdHRyaWJ1dGVzLmdldE5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG5hbWUpOwotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVbXXtuYW1lQXR0cn07Ci0JfQotCXByaXZhdGUgaW50IG5leHRSZXNvdXJjZU1hbmFnZXJJZCA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0PElSZXNvdXJjZU1hbmFnZXJDb250cm9sPiByZXNvdXJjZU1hbmFnZXJzID0KLQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgTGlua2VkTGlzdDxJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbD4oKSk7Ci0JcHJvdGVjdGVkIFN0cmluZyBOQU1FX1RBRyA9ICJ1bml2ZXJzZSAiOwotCQotCXB1YmxpYyBQVW5pdmVyc2UoKSB7Ci0JCS8qICcxJyBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgdW5pdmVyc2UgKi8KLQkJc3VwZXIoIjEiLCBudWxsLCBQX1VOSVZFUlNFLCBnZXREZWZhdWx0QXR0cmlidXRlcygiVGhlVW5pdmVyc2UiKSk7Ci0JCS8vIHNldE91dHB1dFN0b3JlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sI2FkZFJlc291cmNlTWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2wpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNYW5hZ2VyKElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGFkZGVkTWFuYWdlcikgewotCQlyZXNvdXJjZU1hbmFnZXJzLmFkZChhZGRlZE1hbmFnZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbCNhZGRSZXNvdXJjZU1hbmFnZXJzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlTWFuYWdlcnMoSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSBhZGRlZE1hbmFnZXJzKSB7Ci0JCWZvciAoSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gOiBhZGRlZE1hbmFnZXJzKSB7Ci0JCQlhZGRSZXNvdXJjZU1hbmFnZXIocm0pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sI2dldE5leHRSZXNvdXJjZU1hbmFnZXJJZCgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TmV4dFJlc291cmNlTWFuYWdlcklkKCkgewotCQlyZXR1cm4gKG5leHRSZXNvdXJjZU1hbmFnZXJJZCsrIDw8IFJNSURfU0hJRlQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVW5pdmVyc2UjZmluZFJlc291cmNlTWFuYWdlckJ5SWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0JCXN5bmNocm9uaXplZCAocmVzb3VyY2VNYW5hZ2VycykgewotCQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciA6IHJlc291cmNlTWFuYWdlcnMpIHsKLQkJCQlpZiAocmVzb3VyY2VNYW5hZ2VyLmdldElEKCkuZXF1YWxzKGlkKSkgewotCQkJCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sI2dldFJlc291cmNlTWFuYWdlckNvbnRyb2xzKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSBnZXRSZXNvdXJjZU1hbmFnZXJDb250cm9scygpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlcnMudG9BcnJheShuZXcgSVJlc291cmNlTWFuYWdlckNvbnRyb2xbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlI2dldFJlc291cmNlTWFuYWdlcnMoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyW10gZ2V0UmVzb3VyY2VNYW5hZ2VycygpIHsKLQkJcmV0dXJuIChJUmVzb3VyY2VNYW5hZ2VyW10pIGdldFJlc291cmNlTWFuYWdlckNvbnRyb2xzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQRWxlbWVudENvbnRyb2wjaGFzQ2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIXJlc291cmNlTWFuYWdlcnMuaXNFbXB0eSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbCNyZW1vdmVSZXNvdXJjZU1hbmFnZXIob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1hbmFnZXIoSVJlc291cmNlTWFuYWdlciByZW1vdmVkTWFuYWdlcikgewotCQlyZXNvdXJjZU1hbmFnZXJzLnJlbW92ZShyZW1vdmVkTWFuYWdlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sI3JlbW92ZVJlc291cmNlTWFuYWdlcnMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcltdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTWFuYWdlcnMoSVJlc291cmNlTWFuYWdlcltdIHJlbW92ZWRSTXMpIHsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogcmVtb3ZlZFJNcykgewotCQkJcmVtb3ZlUmVzb3VyY2VNYW5hZ2VyKHJtKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLlBFbGVtZW50I2RvQWRkQXR0cmlidXRlSG9vayhqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvQWRkQXR0cmlidXRlSG9vayhBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL1BhcmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUGFyZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjhlZWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvUGFyZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEVsZW1lbnRDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudDsKLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXJlbnQgZXh0ZW5kcyBQRWxlbWVudCB7Ci0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoSVBFbGVtZW50Q29udHJvbCBlbGVtZW50c1tdKSB7Ci0JCUFycmF5cy5zb3J0KGVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgUGFyZW50KFN0cmluZyBpZCwgSVBFbGVtZW50Q29udHJvbCBwYXJlbnQsIGludCB0eXBlLCBJQXR0cmlidXRlPD8sPyw/PltdIGF0dHJzKSB7Ci0JCXN1cGVyKGlkLCBwYXJlbnQsIHR5cGUsIGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBFbGVtZW50Q29udHJvbCNoYXNDaGlsZHJlbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50SW5mbygpLmhhc0NoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lbWJlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkKElQRWxlbWVudENvbnRyb2wgbWVtYmVyKSB7Ci0JCWdldEVsZW1lbnRJbmZvKCkuYWRkQ2hpbGQobWVtYmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUEVsZW1lbnRDb250cm9sIGZpbmRDaGlsZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50SW5mbygpLmZpbmRDaGlsZChrZXkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBFbGVtZW50Q29udHJvbFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudEluZm8oKS5nZXRDaGlsZHJlbigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZW1iZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZChJUEVsZW1lbnQgbWVtYmVyKSB7Ci0JCWdldEVsZW1lbnRJbmZvKCkucmVtb3ZlQ2hpbGQobWVtYmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZHJlbigpIHsKLQkJZ2V0RWxlbWVudEluZm8oKS5yZW1vdmVDaGlsZHJlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvQ2hhbmdlZEpvYkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvQ2hhbmdlZEpvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGU4MDYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0NoYW5nZWRKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdydwotICoKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZWRKb2JFdmVudCBpbXBsZW1lbnRzIElDaGFuZ2VkSm9iRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUFF1ZXVlIHF1ZXVlOwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxJUEpvYj4gam9iczsKLQkKLQlwdWJsaWMgQ2hhbmdlZEpvYkV2ZW50KElQUXVldWUgcXVldWUsIENvbGxlY3Rpb248SVBKb2I+IGpvYnMpIHsKLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCQl0aGlzLmpvYnMgPSBqb2JzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZEpvYkV2ZW50I2dldEpvYnMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQSm9iPiBnZXRKb2JzKCkgewotCQlyZXR1cm4gam9iczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHF1ZXVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0NoYW5nZWRNYWNoaW5lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9DaGFuZ2VkTWFjaGluZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2I0NjguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0NoYW5nZWRNYWNoaW5lRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE1hY2hpbmVFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIHJzcXJkCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlZE1hY2hpbmVFdmVudCBpbXBsZW1lbnRzCi0JCUlDaGFuZ2VkTWFjaGluZUV2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlciBybTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBNYWNoaW5lPiBtYWNoaW5lczsKLQkKLQlwdWJsaWMgQ2hhbmdlZE1hY2hpbmVFdmVudChJUmVzb3VyY2VNYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248SVBNYWNoaW5lPiBtYWNoaW5lcykgewotCQl0aGlzLnJtID0gbWFuYWdlcjsKLQkJdGhpcy5tYWNoaW5lcyA9IG1hY2hpbmVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5ldmVudHMuSUNoYW5nZWRNYWNoaW5lRXZlbnQjZ2V0TWFjaGluZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTWFjaGluZT4gZ2V0TWFjaGluZXMoKSB7Ci0JCXJldHVybiBtYWNoaW5lczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uZXZlbnRzLklDaGFuZ2VkTWFjaGluZUV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gcm07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvQ2hhbmdlZE5vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0NoYW5nZWROb2RlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkZWVjZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvQ2hhbmdlZE5vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWROb2RlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBncncKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VkTm9kZUV2ZW50IGltcGxlbWVudHMgSUNoYW5nZWROb2RlRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUE1hY2hpbmUgbWFjaGluZTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBOb2RlPiBub2RlczsKLQotCXB1YmxpYyBDaGFuZ2VkTm9kZUV2ZW50KElQTWFjaGluZSBtYWNoaW5lLCAKLQkJCUNvbGxlY3Rpb248SVBOb2RlPiBub2RlcykgewotCQl0aGlzLm1hY2hpbmUgPSBtYWNoaW5lOwotCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOb2RlQ2hhbmdlZEV2ZW50I2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTm9kZT4gZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWROb2RlRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG1hY2hpbmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0NoYW5nZWRQcm9jZXNzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9DaGFuZ2VkUHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTEzNjUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0NoYW5nZWRQcm9jZXNzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUHJvY2Vzc0V2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ3J3Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlZFByb2Nlc3NFdmVudCBpbXBsZW1lbnRzIElDaGFuZ2VkUHJvY2Vzc0V2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSVBFbGVtZW50IHNvdXJjZTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXM7Ci0JCi0JcHVibGljIENoYW5nZWRQcm9jZXNzRXZlbnQoSVBFbGVtZW50IHNvdXJjZSwgQ29sbGVjdGlvbjxJUFByb2Nlc3M+IHByb2Nlc3NlcykgewotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJdGhpcy5wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUHJvY2Vzc0V2ZW50I2dldFByb2Nlc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKSB7Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklKb2JDaGFuZ2VkUHJvY2Vzc0V2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElQRWxlbWVudCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvQ2hhbmdlZFF1ZXVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9DaGFuZ2VkUXVldWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlNjc1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9DaGFuZ2VkUXVldWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZFF1ZXVlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZWRRdWV1ZUV2ZW50IGltcGxlbWVudHMKLQkJSUNoYW5nZWRRdWV1ZUV2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlciBybTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBRdWV1ZT4gcXVldWVzOwotCi0KLQlwdWJsaWMgQ2hhbmdlZFF1ZXVlRXZlbnQoSVJlc291cmNlTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPElQUXVldWU+IHF1ZXVlcykgewotCQl0aGlzLnJtID0gbWFuYWdlcjsKLQkJdGhpcy5xdWV1ZXMgPSBxdWV1ZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JQ2hhbmdlZFF1ZXVlRXZlbnQjZ2V0UXVldWVzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUFF1ZXVlPiBnZXRRdWV1ZXMoKSB7Ci0JCXJldHVybiBxdWV1ZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JQ2hhbmdlZFF1ZXVlRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBybTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9Kb2JDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0pvYkNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYWJjMzQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL0pvYkNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JSm9iQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBncncKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2JDaGFuZ2VFdmVudCBpbXBsZW1lbnRzIElKb2JDaGFuZ2VFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElQSm9iIGpvYjsKLQlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cmlidXRlczsKLQotCXB1YmxpYyBKb2JDaGFuZ2VFdmVudChJUEpvYiBqb2IsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJdGhpcy5qb2IgPSBqb2I7Ci0JCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JSm9iQ2hhbmdlZEV2ZW50I2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JSm9iQ2hhbmdlZEV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElQSm9iIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9NYWNoaW5lQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9NYWNoaW5lQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmZjIxNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTWFjaGluZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU1hY2hpbmVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdydwotICoKLSAqLwotcHVibGljIGNsYXNzIE1hY2hpbmVDaGFuZ2VFdmVudCBpbXBsZW1lbnRzIElNYWNoaW5lQ2hhbmdlRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUE1hY2hpbmUgbWFjaGluZTsKLQlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cmlidXRlczsKLQotCXB1YmxpYyBNYWNoaW5lQ2hhbmdlRXZlbnQoSVBNYWNoaW5lIG1hY2hpbmUsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJdGhpcy5tYWNoaW5lID0gbWFjaGluZTsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklNYWNoaW5lQ2hhbmdlZEV2ZW50I2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTWFjaGluZUNoYW5nZWRFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUE1hY2hpbmUgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gbWFjaGluZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9OZXdKb2JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld0pvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NTM2NDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld0pvYkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3Sm9iRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBncncKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKb2JFdmVudCBpbXBsZW1lbnRzIElOZXdKb2JFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElQUXVldWUgcXVldWU7Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPElQSm9iPiBqb2JzOwotCi0JcHVibGljIE5ld0pvYkV2ZW50KElQUXVldWUgcXVldWUsIENvbGxlY3Rpb248SVBKb2I+IGpvYnMpIHsKLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCQl0aGlzLmpvYnMgPSBqb2JzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUXVldWVOZXdKb2JFdmVudCNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUEpvYj4gZ2V0Sm9icygpIHsKLQkJcmV0dXJuIGpvYnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklRdWV1ZU5ld0pvYkV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElQUXVldWUgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gcXVldWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTmV3TWFjaGluZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTmV3TWFjaGluZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmEzNGUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld01hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdNYWNoaW5lRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld01hY2hpbmVFdmVudCBpbXBsZW1lbnRzCi0JCUlOZXdNYWNoaW5lRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtOwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxJUE1hY2hpbmU+IG1hY2hpbmVzOwotCi0JcHVibGljIE5ld01hY2hpbmVFdmVudChJUmVzb3VyY2VNYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248SVBNYWNoaW5lPiBtYWNoaW5lcykgewotCQl0aGlzLnJtID0gbWFuYWdlcjsKLQkJdGhpcy5tYWNoaW5lcyA9IG1hY2hpbmVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5ldmVudHMuSVJlc291cmNlTWFuYWdlck5ld01hY2hpbmVFdmVudCNnZXRNYWNoaW5lKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUE1hY2hpbmU+IGdldE1hY2hpbmVzKCkgewotCQlyZXR1cm4gbWFjaGluZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gcm07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTmV3Tm9kZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTmV3Tm9kZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlODU4OTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld05vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld05vZGVFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdydwotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld05vZGVFdmVudCBpbXBsZW1lbnRzIElOZXdOb2RlRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUE1hY2hpbmUgbWFjaGluZTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBOb2RlPiBub2RlczsKLQotCXB1YmxpYyBOZXdOb2RlRXZlbnQoSVBNYWNoaW5lIG1hY2hpbmUsIENvbGxlY3Rpb248SVBOb2RlPiBub2RlcykgewotCQl0aGlzLm1hY2hpbmUgPSBtYWNoaW5lOwotCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklNYWNoaW5lTmV3Tm9kZUV2ZW50I2dldFByb2Nlc3MoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQTm9kZT4gZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU1hY2hpbmVOZXdOb2RlRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG1hY2hpbmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTmV3UHJvY2Vzc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvTmV3UHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGNiNjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld1Byb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1Byb2Nlc3NFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdydwotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld1Byb2Nlc3NFdmVudCBpbXBsZW1lbnRzIElOZXdQcm9jZXNzRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUEVsZW1lbnQgc291cmNlOwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxJUFByb2Nlc3M+IHByb2Nlc3NlczsKLQotCXB1YmxpYyBOZXdQcm9jZXNzRXZlbnQoSVBFbGVtZW50IHNvdXJjZSwgQ29sbGVjdGlvbjxJUFByb2Nlc3M+IHByb2Nlc3NlcykgewotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJdGhpcy5wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQjZ2V0UHJvY2Vzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUFByb2Nlc3M+IGdldFByb2Nlc3NlcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUpvYk5ld1Byb2Nlc3NFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUEVsZW1lbnQgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld1F1ZXVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9OZXdRdWV1ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjFlMjMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05ld1F1ZXVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1F1ZXVlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld1F1ZXVlRXZlbnQgaW1wbGVtZW50cwotCQlJTmV3UXVldWVFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm07Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPElQUXVldWU+ICBxdWV1ZXM7Ci0KLQlwdWJsaWMgTmV3UXVldWVFdmVudChJUmVzb3VyY2VNYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248SVBRdWV1ZT4gcXVldWVzKSB7Ci0JCXRoaXMucm0gPSBtYW5hZ2VyOwotCQl0aGlzLnF1ZXVlcyA9IHF1ZXVlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1F1ZXVlRXZlbnQjZ2V0UXVldWUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUXVldWU+ICBnZXRRdWV1ZXMoKSB7Ci0JCXJldHVybiBxdWV1ZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3UXVldWVFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHJtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05vZGVDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL05vZGVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTEzMTVlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9Ob2RlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTm9kZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ3J3Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNoYW5nZUV2ZW50IGltcGxlbWVudHMgSU5vZGVDaGFuZ2VFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElQTm9kZSBub2RlOwotCXByaXZhdGUgZmluYWwgQXR0cmlidXRlTWFuYWdlciBhdHRyaWJ1dGVzOwotCQotCXB1YmxpYyBOb2RlQ2hhbmdlRXZlbnQoSVBOb2RlIG5vZGUsCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOb2RlQ2hhbmdlRXZlbnQjZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOb2RlQ2hhbmdlRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVBOb2RlIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUHJvY2Vzc0NoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUHJvY2Vzc0NoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMGRmNGMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1Byb2Nlc3NDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklQcm9jZXNzQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBncncKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ2hhbmdlRXZlbnQgaW1wbGVtZW50cyBJUHJvY2Vzc0NoYW5nZUV2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSVBQcm9jZXNzIHByb2Nlc3M7Ci0JcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJpYnV0ZXM7Ci0KLQlwdWJsaWMgUHJvY2Vzc0NoYW5nZUV2ZW50KElQUHJvY2VzcyBwcm9jZXNzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUHJvY2Vzc0NoYW5nZWRFdmVudCNnZXRBdHRyaWJ1dGVzKCkKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVByb2Nlc3NDaGFuZ2VkRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSVBQcm9jZXNzIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUXVldWVDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1F1ZXVlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1NjgyYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUXVldWVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUXVldWVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdydwotICoKLSAqLwotcHVibGljIGNsYXNzIFF1ZXVlQ2hhbmdlRXZlbnQgaW1wbGVtZW50cyBJUXVldWVDaGFuZ2VFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElQUXVldWUgcXVldWU7Ci0JcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJpYnV0ZXM7Ci0KLQlwdWJsaWMgUXVldWVDaGFuZ2VFdmVudChJUFF1ZXVlIHF1ZXVlLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklRdWV1ZUNoYW5nZWRFdmVudCNnZXRBdHRyaWJ1dGVzKCkKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVF1ZXVlQ2hhbmdlZEV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElQUXVldWUgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gcXVldWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUmVtb3ZlSm9iRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZW1vdmVKb2JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWRlNmY4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZW1vdmVKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ3J3Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlSm9iRXZlbnQgaW1wbGVtZW50cyBJUmVtb3ZlSm9iRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUFF1ZXVlIHF1ZXVlOwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxJUEpvYj4gam9iczsKLQotCXB1YmxpYyBSZW1vdmVKb2JFdmVudChJUFF1ZXVlIHF1ZXVlLCBDb2xsZWN0aW9uPElQSm9iPiBqb2JzKSB7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQkJdGhpcy5qb2JzID0gam9iczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVF1ZXVlUmVtb3ZlSm9iRXZlbnQjZ2V0UHJvY2VzcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBKb2I+IGdldEpvYnMoKSB7Ci0JCXJldHVybiBqb2JzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUXVldWVSZW1vdmVKb2JFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHF1ZXVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZU1hY2hpbmVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZU1hY2hpbmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VlNTgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZW1vdmVNYWNoaW5lRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU1hY2hpbmVFdmVudCBpbXBsZW1lbnRzCi0JSVJlbW92ZU1hY2hpbmVFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm07Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPElQTWFjaGluZT4gbWFjaGluZXM7Ci0KLQlwdWJsaWMgUmVtb3ZlTWFjaGluZUV2ZW50KElSZXNvdXJjZU1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjxJUE1hY2hpbmU+IG1hY2hpbmVzKSB7Ci0JCXRoaXMucm0gPSBtYW5hZ2VyOwotCQl0aGlzLm1hY2hpbmVzID0gbWFjaGluZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50I2dldE1hY2hpbmVzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUE1hY2hpbmU+IGdldE1hY2hpbmVzKCkgewotCQlyZXR1cm4gbWFjaGluZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gcm07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUmVtb3ZlTm9kZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUmVtb3ZlTm9kZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDZiYWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZU5vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZU5vZGVFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdydwotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU5vZGVFdmVudCBpbXBsZW1lbnRzIElSZW1vdmVOb2RlRXZlbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJUE1hY2hpbmUgbWFjaGluZTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBOb2RlPiBub2RlczsKLQotCXB1YmxpYyBSZW1vdmVOb2RlRXZlbnQoSVBNYWNoaW5lIG1hY2hpbmUsIENvbGxlY3Rpb248SVBOb2RlPiBub2RlcykgewotCQl0aGlzLm1hY2hpbmUgPSBtYWNoaW5lOwotCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklNYWNoaW5lUmVtb3ZlTm9kZUV2ZW50I2dldE5vZGVzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUE5vZGU+IGdldE5vZGVzKCkgewotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklNYWNoaW5lUmVtb3ZlTm9kZUV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElQTWFjaGluZSBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBtYWNoaW5lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZVByb2Nlc3NFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZVByb2Nlc3NFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2QyZGNmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZW1vdmVQcm9jZXNzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBncncKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVQcm9jZXNzRXZlbnQgaW1wbGVtZW50cyBJUmVtb3ZlUHJvY2Vzc0V2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSVBFbGVtZW50IHNvdXJjZTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXM7Ci0KLQlwdWJsaWMgUmVtb3ZlUHJvY2Vzc0V2ZW50KElQRWxlbWVudCBzb3VyY2UsIENvbGxlY3Rpb248SVBQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMucHJvY2Vzc2VzID0gcHJvY2Vzc2VzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTm9kZVJlbW92ZVByb2Nlc3NFdmVudCNnZXRQcm9jZXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUHJvY2Vzcz4gZ2V0UHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTm9kZVJlbW92ZVByb2Nlc3NFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUEVsZW1lbnQgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZVF1ZXVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZW1vdmVRdWV1ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOThhMWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1JlbW92ZVF1ZXVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZVF1ZXVlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVF1ZXVlRXZlbnQgaW1wbGVtZW50cwotCUlSZW1vdmVRdWV1ZUV2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlciBybTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVBRdWV1ZT4gcXVldWVzOwotCi0JcHVibGljIFJlbW92ZVF1ZXVlRXZlbnQoSVJlc291cmNlTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPElQUXVldWU+IHF1ZXVlcykgewotCQl0aGlzLnJtID0gbWFuYWdlcjsKLQkJdGhpcy5xdWV1ZXMgPSBxdWV1ZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3UXVldWVFdmVudCNnZXRRdWV1ZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUXVldWU+IGdldFF1ZXVlcygpIHsKLQkJcmV0dXJuIHF1ZXVlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJOZXdRdWV1ZUV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gcm07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9lbGVtZW50cy9ldmVudHMvUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZXNvdXJjZU1hbmFnZXJDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzE3MWZiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZXNvdXJjZU1hbmFnZXJDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBncncKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJDaGFuZ2VFdmVudCBpbXBsZW1lbnRzIElSZXNvdXJjZU1hbmFnZXJDaGFuZ2VFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm07Ci0JcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJpYnV0ZXM7Ci0KLQlwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQoSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJdGhpcy5ybSA9IHJtOwotCQl0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckNoYW5nZWRFdmVudCNnZXRBdHRyaWJ1dGVzKCkKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckNoYW5nZWRFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHJtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1Jlc291cmNlTWFuYWdlckVycm9yRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTkyMGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1Jlc291cmNlTWFuYWdlckVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTWFuYWdlckVycm9yRXZlbnQgaW1wbGVtZW50cyBJUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm07Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50KGZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm0sIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMucm0gPSBybTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50I2dldE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHJtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1Jlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2VsZW1lbnRzL2V2ZW50cy9SZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzhkZWYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZWxlbWVudHMvZXZlbnRzL1Jlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ3J3Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudCBleHRlbmRzIFJlc291cmNlTWFuYWdlckVycm9yRXZlbnQgCi0JaW1wbGVtZW50cyBJUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50KElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBpZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocm0sIG1lc3NhZ2UpOwotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50I2dldEpvYlN1Ym1pc3Npb25JZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2JTdWJtaXNzaW9uSWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9ldmVudHMvQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9ldmVudHMvQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTY4ZTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZXZlbnRzL0NoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgcnNxcmQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQgaW1wbGVtZW50cyBJQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSU1vZGVsTWFuYWdlciBtbTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SVJlc291cmNlTWFuYWdlcj4gcm1zOwotCQotCXB1YmxpYyBDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQoSU1vZGVsTWFuYWdlciBtbSwgQ29sbGVjdGlvbjxJUmVzb3VyY2VNYW5hZ2VyPiBybXMpIHsKLQkJdGhpcy5tbSA9IG1tOwotCQl0aGlzLnJtcyA9IHJtczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJOZXdNYWNoaW5lRXZlbnQjZ2V0TWFjaGluZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVJlc291cmNlTWFuYWdlcj4gZ2V0UmVzb3VyY2VNYW5hZ2VycygpIHsKLQkJcmV0dXJuIHJtczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJOZXdNYWNoaW5lRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZGVsTWFuYWdlciBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBtbTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2V2ZW50cy9OZXdSZXNvdXJjZU1hbmFnZXJFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZXZlbnRzL05ld1Jlc291cmNlTWFuYWdlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDQ3MTguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL2NvcmUvZXZlbnRzL05ld1Jlc291cmNlTWFuYWdlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld1Jlc291cmNlTWFuYWdlckV2ZW50IGltcGxlbWVudHMgSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50IHsKLQotCXByaXZhdGUgZmluYWwgSU1vZGVsTWFuYWdlciBtbTsKLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm07Ci0KLQlwdWJsaWMgTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQoSU1vZGVsTWFuYWdlciBtbSwgSVJlc291cmNlTWFuYWdlciBybSkgewotCQl0aGlzLm1tID0gbW07Ci0JCXRoaXMucm0gPSBybTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJOZXdNYWNoaW5lRXZlbnQjZ2V0TWFjaGluZSgpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gcm07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50I2dldFNvdXJjZSgpCi0JICovCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gbW07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvY29yZS9ldmVudHMvUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2V2ZW50cy9SZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ3Mjc2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9jb3JlL2V2ZW50cy9SZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgcnNxcmQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudCBpbXBsZW1lbnRzIElSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudCB7Ci0KLQlwcml2YXRlIGZpbmFsIElNb2RlbE1hbmFnZXIgbW07Ci0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtOwotCi0JcHVibGljIFJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50KElNb2RlbE1hbmFnZXIgbW0sIElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJdGhpcy5tbSA9IG1tOwotCQl0aGlzLnJtID0gcm07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50I2dldE1hY2hpbmUoKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIHJtOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5ldmVudHMuSVJlc291cmNlTWFuYWdlck5ld01hY2hpbmVFdmVudCNnZXRTb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG1tOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Jtc3lzdGVtL1Jlc291cmNlTWFuYWdlclBlcnNpc3RlbmNlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcm1zeXN0ZW0vUmVzb3VyY2VNYW5hZ2VyUGVyc2lzdGVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3ODc4OC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcm1zeXN0ZW0vUmVzb3VyY2VNYW5hZ2VyUGVyc2lzdGVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJtc3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTWFuYWdlclBlcnNpc3RlbmNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVTT1VSQ0VNQU5BR0VSX0lOREVYID0gIlJlc291cmNlTWFuYWdlckluZGV4IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVTT1VSQ0VNQU5BR0VSUyA9ICJSZXNvdXJjZU1hbmFnZXJzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVTT1VSQ0VNQU5HRVIgPSAiUmVzb3VyY2VNYW5hZ2VyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVTT1VSQ0VNQU5HRVJfQ09ORklHVVJBVElPTiA9ICJDb25maWd1cmF0aW9uIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVTT1VSQ0VNQU5HRVJfSUQgPSAiUmVzb3VyY2VNYW5hZ2VySWQiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVNPVVJDRU1BTkdFUl9SVU5OSU5HID0gIklzUnVubmluZyI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVJlc291cmNlTWFuYWdlcnMoRmlsZSBmaWxlLAotCQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSByZXNvdXJjZU1hbmFnZXJzKSB7Ci0JCWlmIChEZWJ1Z1V0aWwuUk1fVFJBQ0lORykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBzYXZlUmVzb3VyY2VNYW5hZ2VycyB0byBmaWxlLCAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoVEFHX1JFU09VUkNFTUFOQUdFUlMpOwotCQlzYXZlUmVzb3VyY2VNYW5hZ2VycyhtZW1lbnRvLCByZXNvdXJjZU1hbmFnZXJzKTsKLQkJRmlsZVdyaXRlciB3cml0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7Ci0JCQltZW1lbnRvLnNhdmUod3JpdGVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKERlYnVnVXRpbC5STV9UUkFDSU5HKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxlYXZpbmcgc2F2ZVJlc291cmNlTWFuYWdlcnMiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2F2ZVJlc291cmNlTWFuYWdlcnMoWE1MTWVtZW50byBtZW1lbnRvLAotCQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSByZXNvdXJjZU1hbmFnZXJzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VNYW5hZ2Vycy5sZW5ndGg7ICsraSkgewotCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19SRVNPVVJDRU1BTkdFUik7Ci0JCQljaGlsZC5wdXRTdHJpbmcoCi0JCQkJCVRBR19SRVNPVVJDRU1BTkdFUl9JRCwKLQkJCQkJcmVzb3VyY2VNYW5hZ2Vyc1tpXS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKSk7Ci0JCQljaGlsZC5wdXRJbnRlZ2VyKFRBR19SRVNPVVJDRU1BTkFHRVJfSU5ERVgsIGkpOwotCQkJYm9vbGVhbiBpc1J1bm5pbmcgPSByZXNvdXJjZU1hbmFnZXJzW2ldLmdldFN0YXRlKCkuZXF1YWxzKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1RBUlRFRCk7Ci0JCQljaGlsZC5wdXRTdHJpbmcoVEFHX1JFU09VUkNFTUFOR0VSX1JVTk5JTkcsIGlzUnVubmluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJSU1lbWVudG8gZ3JhbmRjaGlsZCA9IGNoaWxkLmNyZWF0ZUNoaWxkKFRBR19SRVNPVVJDRU1BTkdFUl9DT05GSUdVUkFUSU9OKTsKLQkJCXJlc291cmNlTWFuYWdlcnNbaV0uZ2V0Q29uZmlndXJhdGlvbigpLnNhdmUoZ3JhbmRjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIExpc3Q8SVJlc291cmNlTWFuYWdlckNvbnRyb2w+IHJlc291cmNlTWFuYWdlcnMgPQotCSAgICBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZU1hbmFnZXJDb250cm9sPigpOwotCi0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBzYXZlZEN1cnJlbnRSZXNvdXJjZU1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SVJlc291cmNlTWFuYWdlckNvbnRyb2w+IHJtc05lZWRTdGFydGluZyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8SVJlc291cmNlTWFuYWdlckNvbnRyb2w+KCk7Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSBnZXRSZXNvdXJjZU1hbmFnZXJDb250cm9scygpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlcnMudG9BcnJheShuZXcgSVJlc291cmNlTWFuYWdlckNvbnRyb2xbMF0pOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIGdldFJlc291cmNlTWFuYWdlckNvbnRyb2xzTmVlZFN0YXJ0aW5nKCkgewotICAgICAgICByZXR1cm4gcm1zTmVlZFN0YXJ0aW5nLnRvQXJyYXkobmV3IElSZXNvdXJjZU1hbmFnZXJDb250cm9sWzBdKTsKLSAgICB9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRTYXZlZEN1cnJlbnRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBzYXZlZEN1cnJlbnRSZXNvdXJjZU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgc2F2ZWQgcmVzb3VyY2UgbWFuYWdlcnMuCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gZmFjdG9yaWVzCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlc291cmNlTWFuYWdlcnMoRmlsZSBmaWxlLAotCQkJSVJlc291cmNlTWFuYWdlckZhY3RvcnlbXSBmYWN0b3JpZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgcm1zTmVlZFN0YXJ0aW5nLmNsZWFyKCk7Ci0gICAgICAgIHJlc291cmNlTWFuYWdlcnMuY2xlYXIoKTsKLQotICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKLSAgICAgICAgICAgIGxvYWRSZXNvdXJjZU1hbmFnZXJzKFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QocmVhZGVyKSwgZmFjdG9yaWVzKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZWQuLi4gbm8gUmVzb3VyY2VNYW5hZ2VyIGl0ZW1zIGV4aXN0IHlldC4KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBQVFBDb3JlUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotCXByaXZhdGUgSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZ2V0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSgKLQkJCUlSZXNvdXJjZU1hbmFnZXJGYWN0b3J5W10gZmFjdG9yaWVzLCBTdHJpbmcgaWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmYWN0b3JpZXNbaV0uZ2V0SWQoKS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBmYWN0b3JpZXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICAvKioKLQkgKiBMb2FkcyBzYXZlZCByZXNvdXJjZSBtYW5hZ2Vycy4KLQkgKiBAcGFyYW0gbWVtZW50bwotCSAqIEBwYXJhbSBmYWN0b3JpZXMKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFJlc291cmNlTWFuYWdlcnMoWE1MTWVtZW50byBtZW1lbnRvLAotCQkJSVJlc291cmNlTWFuYWdlckZhY3RvcnlbXSBmYWN0b3JpZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oVEFHX1JFU09VUkNFTUFOR0VSKTsKLQkJQXJyYXlMaXN0PElTdGF0dXM+IHN0YXR1c2VzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOwotCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIHRtcFJNcyA9IG5ldyBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtjaGlsZHJlbi5sZW5ndGhdOwotCQlBcnJheUxpc3Q8SVJlc291cmNlTWFuYWdlckNvbnRyb2w+IHJtcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlTWFuYWdlckNvbnRyb2w+KHRtcFJNcy5sZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCVN0cmluZyByZXNvdXJjZU1hbmFnZXJJZCA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhUQUdfUkVTT1VSQ0VNQU5HRVJfSUQpOwotCQkJZmluYWwgaW50IGluZGV4ID0gY2hpbGRyZW5baV0uZ2V0SW50ZWdlcihUQUdfUkVTT1VSQ0VNQU5BR0VSX0lOREVYKS5pbnRWYWx1ZSgpOwotCQkJU3RyaW5nIGlzUnVubmluZ1JlcCA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhUQUdfUkVTT1VSQ0VNQU5HRVJfUlVOTklORyk7Ci0JCQlib29sZWFuIGlzUnVubmluZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGlzUnVubmluZ1JlcCk7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSgKLQkJCQkJZmFjdG9yaWVzLCByZXNvdXJjZU1hbmFnZXJJZCk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgSU1lbWVudG8gZ3JhbmRjaGlsZCA9IGNoaWxkcmVuW2ldLmdldENoaWxkKFRBR19SRVNPVVJDRU1BTkdFUl9DT05GSUdVUkFUSU9OKTsKLQkJCQlJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZmFjdG9yeS5sb2FkQ29uZmlndXJhdGlvbihncmFuZGNoaWxkKTsKLQkJCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRtcFJNc1tpbmRleF0gPSBmYWN0b3J5LmNyZWF0ZShjb25maWd1cmF0aW9uKTsKLQkJCQkJaWYgKHRtcFJNc1tpbmRleF0gIT0gbnVsbCkgewotCQkJCQkJLy8gc3RhcnQgdGhlIHJlc291cmNlIG1hbmFnZXIgaWYgaXQgd2FzIHJ1bm5pbmcgd2hlbiBzYXZlZC4KLQkJCQkJCWlmIChpc1J1bm5pbmcpIHsKLQkJCQkJCSAgICBybXNOZWVkU3RhcnRpbmcgLmFkZCh0bXBSTXNbaW5kZXhdKTsKLQkJCQkJCX0KLQkJCQkJCXJtcy5hZGQodG1wUk1zW2luZGV4XSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXNvdXJjZU1hbmFnZXJzLmFkZEFsbChybXMpOwotCQlpZiAoc3RhdHVzZXMuc2l6ZSgpID4gMCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IE11bHRpU3RhdHVzKFBUUENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQlNdWx0aVN0YXR1cy5FUlJPUiwgc3RhdHVzZXMudG9BcnJheShuZXcgSVN0YXR1c1swXSksCi0JCQkJCSJsb2FkaW5nIHJlc291cmNlIG1hbmFnZXJzIiwgbnVsbCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGUzNDVmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQgaW1wbGVtZW50cyBJUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudCB7Ci0KLQlwcml2YXRlIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGF0dHJpYnV0ZURlZnM7Ci0JCi0JcHVibGljIFJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQoSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZGVmcykgewotCQlhdHRyaWJ1dGVEZWZzID0gZGVmczsKLQl9Ci0KLQlwdWJsaWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVEZWZzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3N2UxMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIFJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lRGlzY29ubmVjdGVkRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZURpc2Nvbm5lY3RlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzFhMDcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lRGlzY29ubmVjdGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRGlzY29ubmVjdGVkRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIFJ1bnRpbWVEaXNjb25uZWN0ZWRFdmVudCBpbXBsZW1lbnRzIElSdW50aW1lRGlzY29ubmVjdGVkRXZlbnQgewotCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQkKLQlwdWJsaWMgUnVudGltZURpc2Nvbm5lY3RlZEV2ZW50KFN0cmluZyBtc2cpIHsKLQkJbWVzc2FnZSA9IG1zZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lRXJyb3JTdGF0ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmOGNkNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIFJ1bnRpbWVFcnJvclN0YXRlRXZlbnQgaW1wbGVtZW50cyBJUnVudGltZUVycm9yU3RhdGVFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVKb2JDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM5Zjc2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLkFic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVKb2JDaGFuZ2VFdmVudDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVKb2JDaGFuZ2VFdmVudCBleHRlbmRzIEFic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCB7Ci0KLQlwdWJsaWMgUnVudGltZUpvYkNoYW5nZUV2ZW50KEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXN1cGVyKGF0dHJzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFhNTk1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudCBleHRlbmRzIEFic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQoRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIoYXR0cnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lTWVzc2FnZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVNZXNzYWdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwOTY4YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVNZXNzYWdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLk1lc3NhZ2VBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWVzc2FnZUF0dHJpYnV0ZXMuTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU1lc3NhZ2VFdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgUnVudGltZU1lc3NhZ2VFdmVudCBpbXBsZW1lbnRzIElSdW50aW1lTWVzc2FnZUV2ZW50IHsKLQotCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cmlidXRlczsKLQkKLQlwdWJsaWMgUnVudGltZU1lc3NhZ2VFdmVudChBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCWlmIChhdHRycy5nZXRBdHRyaWJ1dGUoTWVzc2FnZUF0dHJpYnV0ZXMuZ2V0TGV2ZWxBdHRyaWJ1dGVEZWZpbml0aW9uKCkpID09IG51bGwpIHsKLQkJCWF0dHJzLmFkZEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRMZXZlbEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKSk7Ci0JCX0KLQkJaWYgKGF0dHJzLmdldEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRDb2RlQXR0cmlidXRlRGVmaW5pdGlvbigpKSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWF0dHJzLmFkZEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRDb2RlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKGF0dHJzLmdldEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRUZXh0QXR0cmlidXRlRGVmaW5pdGlvbigpKSA9PSBudWxsKSB7Ci0JCQlhdHRycy5hZGRBdHRyaWJ1dGUoTWVzc2FnZUF0dHJpYnV0ZXMuZ2V0VGV4dEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKSk7Ci0JCX0KLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cnM7Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwgbGV2ZWwsIFN0cmluZyB0ZXh0KSB7Ci0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQlhdHRycy5hZGRBdHRyaWJ1dGUoTWVzc2FnZUF0dHJpYnV0ZXMuZ2V0TGV2ZWxBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGxldmVsKSk7Ci0JCWF0dHJzLmFkZEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRUZXh0QXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSh0ZXh0KSk7Ci0JCXRyeSB7Ci0JCQlhdHRycy5hZGRBdHRyaWJ1dGUoTWVzc2FnZUF0dHJpYnV0ZXMuZ2V0Q29kZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cnM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFcnJvckV2ZW50I2dldExldmVsKCkKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUF0dHJpYnV0ZXMuTGV2ZWwgZ2V0TGV2ZWwoKSB7Ci0JCUVudW1lcmF0ZWRBdHRyaWJ1dGU8TGV2ZWw+IGxldmVsID0gCi0JCQlhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRMZXZlbEF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCXJldHVybiBsZXZlbC5nZXRWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFcnJvckV2ZW50I2dldENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29kZSgpIHsKLQkJSW50ZWdlckF0dHJpYnV0ZSBjb2RlID0gCi0JCQlhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRDb2RlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJcmV0dXJuIGNvZGUuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXJyb3JFdmVudCNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZ0F0dHJpYnV0ZSB0ZXh0ID0gCi0JCQlhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShNZXNzYWdlQXR0cmlidXRlcy5nZXRUZXh0QXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJcmV0dXJuIHRleHQuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTWVzc2FnZUV2ZW50I2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lTmV3Sm9iRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld0pvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZWZiNGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lTmV3Sm9iRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lTmV3RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld0pvYkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU5ld0pvYkV2ZW50IGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lTmV3RXZlbnQgaW1wbGVtZW50cyBJUnVudGltZU5ld0pvYkV2ZW50IHsKLQotCXB1YmxpYyBSdW50aW1lTmV3Sm9iRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOZXdNYWNoaW5lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmUzYzE3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVOZXdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3TWFjaGluZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU5ld01hY2hpbmVFdmVudCBleHRlbmRzIEFic3RyYWN0UnVudGltZU5ld0V2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOZXdOb2RlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld05vZGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjVkNmEyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld05vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVOZXdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3Tm9kZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU5ld05vZGVFdmVudCBleHRlbmRzIEFic3RyYWN0UnVudGltZU5ld0V2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVOZXdOb2RlRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVOZXdOb2RlRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOZXdQcm9jZXNzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZmOTExLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVOZXdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3UHJvY2Vzc0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU5ld1Byb2Nlc3NFdmVudCBleHRlbmRzIEFic3RyYWN0UnVudGltZU5ld0V2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOZXdRdWV1ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOZXdRdWV1ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZWRlYzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lTmV3UXVldWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVOZXdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3UXVldWVFdmVudDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVOZXdRdWV1ZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lTmV3RXZlbnQgaW1wbGVtZW50cyBJUnVudGltZU5ld1F1ZXVlRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVOZXdRdWV1ZUV2ZW50KFN0cmluZyBwYXJlbnQsIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lTm9kZUNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOb2RlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2NWZkOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVOb2RlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5vZGVDaGFuZ2VFdmVudDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVDaGFuZ2VFdmVudCBpbXBsZW1lbnRzIElSdW50aW1lTm9kZUNoYW5nZUV2ZW50IHsKLQotCXB1YmxpYyBSdW50aW1lTm9kZUNoYW5nZUV2ZW50KEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXN1cGVyKGF0dHJzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmMxMjI0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCBleHRlbmRzIEFic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQoRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIoYXR0cnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NzNjYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLkFic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVDaGFuZ2VFdmVudCBpbXBsZW1lbnRzIElSdW50aW1lUXVldWVDaGFuZ2VFdmVudCB7Ci0KLQlwdWJsaWMgUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQoRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJc3VwZXIoYXR0cnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZUFsbEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVSZW1vdmVBbGxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjlhNDU5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZUFsbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZUFsbEV2ZW50OwotCi0KLXB1YmxpYyBjbGFzcyBSdW50aW1lUmVtb3ZlQWxsRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZW1vdmVFdmVudCAKLQkJaW1wbGVtZW50cyBJUnVudGltZVJlbW92ZUFsbEV2ZW50IHsKLQotCXB1YmxpYyBSdW50aW1lUmVtb3ZlQWxsRXZlbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVSZW1vdmVKb2JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlSm9iRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzZjA1Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVSZW1vdmVKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLkFic3RyYWN0UnVudGltZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5SYW5nZVNldDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVSZW1vdmVKb2JFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UnVudGltZVJlbW92ZUV2ZW50IAotCQlpbXBsZW1lbnRzIElSdW50aW1lUmVtb3ZlSm9iRXZlbnQgewotCi0JcHVibGljIFJ1bnRpbWVSZW1vdmVKb2JFdmVudChSYW5nZVNldCBpZHMpIHsKLQkJc3VwZXIoaWRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWEwYmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5SYW5nZVNldDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZW1vdmVFdmVudCAKLQkJaW1wbGVtZW50cyBJUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCB7Ci0KLQlwdWJsaWMgUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudChSYW5nZVNldCBpZHMpIHsKLQkJc3VwZXIoaWRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZU5vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlTm9kZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGM2YzcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlTm9kZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZU5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5SYW5nZVNldDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZW1vdmVFdmVudCAKLQkJaW1wbGVtZW50cyBJUnVudGltZVJlbW92ZU5vZGVFdmVudCB7Ci0KLQlwdWJsaWMgUnVudGltZVJlbW92ZU5vZGVFdmVudChSYW5nZVNldCBpZHMpIHsKLQkJc3VwZXIoaWRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDAxNDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5SYW5nZVNldDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZW1vdmVFdmVudCAKLQkJaW1wbGVtZW50cyBJUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCB7Ci0KLQlwdWJsaWMgUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudChSYW5nZVNldCBpZHMpIHsKLQkJc3VwZXIoaWRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjYzE0MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuUmFuZ2VTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lUmVtb3ZlUXVldWVFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UnVudGltZVJlbW92ZUV2ZW50IAotCQlpbXBsZW1lbnRzIElSdW50aW1lUmVtb3ZlUXVldWVFdmVudCB7Ci0KLQlwdWJsaWMgUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQoUmFuZ2VTZXQgaWRzKSB7Ci0JCXN1cGVyKGlkcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVSdW5uaW5nU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lUnVubmluZ1N0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1ZWNmYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVSdW5uaW5nU3RhdGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVNodXRkb3duU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTJjZjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVNodXRkb3duU3RhdGVFdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgUnVudGltZVNodXRkb3duU3RhdGVFdmVudCBpbXBsZW1lbnRzIElSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDc1YzQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIFJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UnVudGltZUVycm9yRXZlbnQKLQkJaW1wbGVtZW50cyBJUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50IHsKLQotCXB1YmxpYyBSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIoMCwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIoY29kZSwgbWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjM4ZDJkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9ydHN5c3RlbS9ldmVudHMvUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuQWJzdHJhY3RSdW50aW1lRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVFcnJvckV2ZW50Ci0JCWltcGxlbWVudHMgSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIGpvYlN1YklEOwotCQotCXB1YmxpYyBSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBqb2JTdWJJRCkgewotCQlzdXBlcihjb2RlLCBtZXNzYWdlKTsKLQkJdGhpcy5qb2JTdWJJRCA9IGpvYlN1YklEOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50I2dldEpvYlN1YklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpvYlN1YklEKCkgewotCQlyZXR1cm4gam9iU3ViSUQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWJkNDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5BYnN0cmFjdFJ1bnRpbWVFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50OwotCi0KLXB1YmxpYyBjbGFzcyBSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UnVudGltZUVycm9yRXZlbnQKLQkJaW1wbGVtZW50cyBJUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQgewotCi0JcHJpdmF0ZSBTdHJpbmcgam9iSUQ7Ci0JCi0JcHVibGljIFJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGpvYklEKSB7Ci0JCXN1cGVyKGNvZGUsIG1lc3NhZ2UpOwotCQl0aGlzLmpvYklEID0gam9iSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQjZ2V0Sm9iSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sm9iSUQoKSB7Ci0JCXJldHVybiBqb2JJRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybXN5c3RlbS9BYnN0cmFjdFJlc291cmNlTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0Fic3RyYWN0UmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDg0ZWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0Fic3RyYWN0UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE5vZGVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRXJyb3JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLk1hY2hpbmVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWVzc2FnZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Ob2RlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUXVldWVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3TWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3Tm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZUNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5QTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5QTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5QUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5QUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLkNoYW5nZWRNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLkNoYW5nZWRRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5OZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLk5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLlJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuUmVtb3ZlUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwuY29yZS5lbGVtZW50cy5ldmVudHMuUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLlJlc291cmNlTWFuYWdlckVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuZXZlbnRzLlJlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciByc3FyZAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlciBleHRlbmRzIFBFbGVtZW50IGltcGxlbWVudHMgSVJlc291cmNlTWFuYWdlciwgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVzKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlBcnJheUxpc3Q8SUF0dHJpYnV0ZTw/LCA/LCA/Pj4gYXR0cnMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGU8PywgPywgPz4+KCk7Ci0JCWF0dHJzLmFkZChFbGVtZW50QXR0cmlidXRlcy5nZXROYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShjb25maWcuZ2V0TmFtZSgpKSk7Ci0JCWF0dHJzLmFkZChFbGVtZW50QXR0cmlidXRlcy5nZXRJZEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoY29uZmlnLmdldFVuaXF1ZU5hbWUoKSkpOwotCQlhdHRycy5hZGQoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5nZXREZXNjcmlwdGlvbkF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoY29uZmlnLmdldERlc2NyaXB0aW9uKCkpKTsKLQkJYXR0cnMuYWRkKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuZ2V0VHlwZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoY29uZmlnLmdldFR5cGUoKSkpOwotCQlhdHRycy5hZGQoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVE9QUEVEKSk7Ci0JCWF0dHJzLmFkZChSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLmdldFJtSURBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGNvbmZpZy5nZXRVbmlxdWVOYW1lKCkpKTsKLQkJcmV0dXJuIGF0dHJzLnRvQXJyYXkobmV3IElBdHRyaWJ1dGU8PywgPywgPz5bMF0pOwotCX0KLQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBjaGlsZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCXByaXZhdGUgZmluYWwgSVF1ZXVlQ2hpbGRMaXN0ZW5lciBxdWV1ZUpvYkxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgSUpvYkNoaWxkTGlzdGVuZXIgam9iUHJvY2Vzc0xpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgSU1hY2hpbmVDaGlsZExpc3RlbmVyIG1hY2hpbmVOb2RlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyIGF0dHJEZWZNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyKCk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElQSm9iQ29udHJvbD4gam9ic0J5SWQgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBJUEpvYkNvbnRyb2w+KCkpOwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZXNCeUlkID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgSVBNYWNoaW5lQ29udHJvbD4oKSk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUE5vZGVDb250cm9sPiBub2Rlc0J5SWQgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBJUE5vZGVDb250cm9sPigpKTsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3Nlc0J5SWQgPSBDb2xsZWN0aW9ucwotCQkJLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIElQUHJvY2Vzc0NvbnRyb2w+KCkpOwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSVBRdWV1ZUNvbnRyb2w+IHF1ZXVlc0J5SWQgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBJUFF1ZXVlQ29udHJvbD4oKSk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUFF1ZXVlQ29udHJvbD4gcXVldWVzQnlOYW1lID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgSVBRdWV1ZUNvbnRyb2w+KCkpOwotCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBpZCwgSVBVbml2ZXJzZUNvbnRyb2wgdW5pdmVyc2UsIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihpZCwgdW5pdmVyc2UsIFBfUkVTT1VSQ0VfTUFOQUdFUiwgZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoY29uZmlnKSk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCXF1ZXVlSm9iTGlzdGVuZXIgPSBuZXcgSVF1ZXVlQ2hpbGRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkSm9iRXZlbnQgZSkgewotCQkJCS8vIE9LIHRvIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3Sm9iRXZlbnQgZSkgewotCQkJCS8vIE9LIHRvIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVtb3ZlSm9iRXZlbnQgZSkgewotCQkJCWZvciAoSVBKb2Igam9iIDogZS5nZXRKb2JzKCkpIHsKLQkJCQkJam9iLnJlbW92ZUNoaWxkTGlzdGVuZXIoam9iUHJvY2Vzc0xpc3RlbmVyKTsKLQkJCQkJam9ic0J5SWQucmVtb3ZlKGpvYi5nZXRJRCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWpvYlByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJSm9iQ2hpbGRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUHJvY2Vzc0V2ZW50IGUpIHsKLQkJCQkvLyBPSyB0byBpZ25vcmUKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1Byb2Nlc3NFdmVudCBlKSB7Ci0JCQkJLy8gT0sgdG8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVQcm9jZXNzRXZlbnQgZSkgewotCQkJCWZvciAoSVBQcm9jZXNzIHByb2Nlc3MgOiBlLmdldFByb2Nlc3NlcygpKSB7Ci0JCQkJCXByb2Nlc3Nlc0J5SWQucmVtb3ZlKHByb2Nlc3MuZ2V0SUQoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQltYWNoaW5lTm9kZUxpc3RlbmVyID0gbmV3IElNYWNoaW5lQ2hpbGRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkTm9kZUV2ZW50IGUpIHsKLQkJCQkvLyBPSyB0byBpZ25vcmUKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld05vZGVFdmVudCBlKSB7Ci0JCQkJLy8gT0sgdG8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVOb2RlRXZlbnQgZSkgewotCQkJCWZvciAoSVBOb2RlIG5vZGUgOiBlLmdldE5vZGVzKCkpIHsKLQkJCQkJbm9kZXNCeUlkLnJlbW92ZShub2RlLmdldElEKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXIjYWRkQ2hpbGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRMaXN0ZW5lcihJUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLklSZXNvdXJjZU1hbmFnZXIjYWRkUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnJtLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50TGlzdGVuZXIoSVJlc291cmNlTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sI2FkZE1hY2hpbmVBdHRyaWJ1dGVzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlPD8sPyw/PltdKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1hY2hpbmVBdHRyaWJ1dGVzKENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZUNvbnRyb2xzLCBJQXR0cmlidXRlPD8sID8sID8+W10gYXR0cnMpIHsKLQkJTGlzdDxJUE1hY2hpbmU+IG1hY2hpbmVzID0gbmV3IEFycmF5TGlzdDxJUE1hY2hpbmU+KG1hY2hpbmVDb250cm9scy5zaXplKCkpOwotCi0JCWZvciAoSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lIDogbWFjaGluZUNvbnRyb2xzKSB7Ci0JCQltYWNoaW5lLmFkZEF0dHJpYnV0ZXMoYXR0cnMpOwotCQkJbWFjaGluZXMuYWRkKG1hY2hpbmUpOwotCQl9Ci0KLQkJZmlyZUNoYW5nZWRNYWNoaW5lcyhtYWNoaW5lcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2wjYWRkUXVldWVBdHRyaWJ1dGVzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlPD8sPyw/PltdKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFF1ZXVlQXR0cmlidXRlcyhDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBxdWV1ZUNvbnRyb2xzLCBJQXR0cmlidXRlPD8sID8sID8+W10gYXR0cnMpIHsKLQkJTGlzdDxJUFF1ZXVlPiBxdWV1ZXMgPSBuZXcgQXJyYXlMaXN0PElQUXVldWU+KHF1ZXVlQ29udHJvbHMuc2l6ZSgpKTsKLQotCQlmb3IgKElQUXVldWVDb250cm9sIHF1ZXVlIDogcXVldWVDb250cm9scykgewotCQkJcXVldWUuYWRkQXR0cmlidXRlcyhhdHRycyk7Ci0JCQlxdWV1ZXMuYWRkKHF1ZXVlKTsKLQkJfQotCi0JCWZpcmVDaGFuZ2VkUXVldWVzKHF1ZXVlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciNkaXNhYmxlRXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlRXZlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0U3RhdGUoKS5lcXVhbHMoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVEFSVEVEKSkgewotCQkJZG9EaXNhYmxlRXZlbnRzKCk7Ci0JCQlzZXRTdGF0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNVU1BFTkRFRCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWxpc3RlbmVycy5jbGVhcigpOwotCQl0cnkgewotCQkJc2h1dGRvd24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZG9EaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciNlbmFibGVFdmVudHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFN0YXRlKCkuZXF1YWxzKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1VTUEVOREVEKSkgewotCQkJZG9FbmFibGVFdmVudHMoKTsKLQkJCXNldFN0YXRlKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1RBUlRFRCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKHRoaXMpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9va3VwIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICogCi0JICogQHBhcmFtIGF0dHJJZAotCSAqIEByZXR1cm4gYXR0cmlidXRlIGRlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihTdHJpbmcgYXR0cklkKSB7Ci0JCXJldHVybiBhdHRyRGVmTWFuYWdlci5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJJZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgbWFuYWdlcnMgYXR0cmlidXRlIGRlZmluaXRpb24gbWFuYWdlcgotCSAqIAotCSAqIEByZXR1cm4gYXR0cmlidXRlIGRlZmluaXRvbiBtYW5hZ2VyIGZvciB0aGlzIHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgZ2V0QXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhdHRyRGVmTWFuYWdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCNnZXRDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlyZXR1cm4gY29uZmlnOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBkZXNjQXR0ckRlZiA9IFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuZ2V0RGVzY3JpcHRpb25BdHRyaWJ1dGVEZWZpbml0aW9uKCk7Ci0JCVN0cmluZ0F0dHJpYnV0ZSBkZXNjQXR0ciA9IGdldEF0dHJpYnV0ZShkZXNjQXR0ckRlZik7Ci0JCWlmIChkZXNjQXR0ciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVzY0F0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuUEVsZW1lbnQjZ2V0SUQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCS8vIG5lZWRlZCB0aGlzIHRvIGdldCBhcm91bmQgZHJhY29uaWFuIHBsdWctaW4KLQkJLy8gbGlicmFyeSByZXN0cmljdGlvbnMKLQkJcmV0dXJuIHN1cGVyLmdldElEKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyI2dldE1hY2hpbmVCeUlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQTWFjaGluZSBnZXRNYWNoaW5lQnlJZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG1hY2hpbmVzQnlJZC5nZXQoaWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sI2dldE1hY2hpbmVDb250cm9scygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gZ2V0TWFjaGluZUNvbnRyb2xzKCkgewotCQlzeW5jaHJvbml6ZWQgKG1hY2hpbmVzQnlJZCkgewotCQkJTGlzdDxJUE1hY2hpbmVDb250cm9sPiBtYWNoaW5lcyA9IG5ldyBBcnJheUxpc3Q8SVBNYWNoaW5lQ29udHJvbD4obWFjaGluZXNCeUlkLnZhbHVlcygpLnNpemUoKSk7Ci0JCQlmb3IgKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSA6IG1hY2hpbmVzQnlJZC52YWx1ZXMoKSkgewotCQkJCW1hY2hpbmVzLmFkZChtYWNoaW5lKTsKLQkJCX0JCQotCQkJcmV0dXJuIG1hY2hpbmVzOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyI2dldE1hY2hpbmVzKCkKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lW10gZ2V0TWFjaGluZXMoKSB7Ci0JCXJldHVybiBnZXRNYWNoaW5lQ29udHJvbHMoKS50b0FycmF5KG5ldyBJUE1hY2hpbmVDb250cm9sWzBdKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXIjZ2V0UXVldWVCeUlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQUXVldWUgZ2V0UXVldWVCeUlkKFN0cmluZyBpZCkgewotCQlyZXR1cm4gcXVldWVzQnlJZC5nZXQoaWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlciNnZXRRdWV1ZUJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFF1ZXVlQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBxdWV1ZXNCeU5hbWUuZ2V0KG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sI2dldFF1ZXVlQ29udHJvbHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBnZXRRdWV1ZUNvbnRyb2xzKCkgewotCQlzeW5jaHJvbml6ZWQgKHF1ZXVlc0J5SWQpIHsKLQkJCUxpc3Q8SVBRdWV1ZUNvbnRyb2w+IHF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8SVBRdWV1ZUNvbnRyb2w+KHF1ZXVlc0J5SWQudmFsdWVzKCkuc2l6ZSgpKTsKLQkJCWZvciAoSVBRdWV1ZUNvbnRyb2wgcXVldWUgOiBxdWV1ZXNCeUlkLnZhbHVlcygpKSB7Ci0JCQkJcXVldWVzLmFkZChxdWV1ZSk7Ci0JCQl9CQkKLQkJCXJldHVybiBxdWV1ZXM7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXIjZ2V0UXVldWVzKCkKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZVtdIGdldFF1ZXVlcygpIHsKLQkJcmV0dXJuIGdldFF1ZXVlQ29udHJvbHMoKS50b0FycmF5KG5ldyBJUFF1ZXVlQ29udHJvbFswXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlTWFuYWdlcklkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTWFuYWdlcklkKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlTWFuYWdlcklkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciNnZXRTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlIGdldFN0YXRlKCkgewotCQlFbnVtZXJhdGVkQXR0cmlidXRlPFN0YXRlPiBzdGF0ZUF0dHIgPSBnZXRTdGF0ZUF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gc3RhdGVBdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyI2dldFVuaXF1ZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRVbmlxdWVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBFbGVtZW50Q29udHJvbCNoYXNDaGlsZHJlbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRNYWNoaW5lcygpLmxlbmd0aCA+IDAgfHwgZ2V0UXVldWVzKCkubGVuZ3RoID4gMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXIjcmVtb3ZlQ2hpbGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRMaXN0ZW5lcihJUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLklSZXNvdXJjZU1hbmFnZXIjcmVtb3ZlUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnJtLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50TGlzdGVuZXIoSVJlc291cmNlTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlciNyZW1vdmVUZXJtaW5hdGVkSm9icyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRlcm1pbmF0ZWRKb2JzKElQUXVldWUgcXVldWUpIHsKLQkJZG9SZW1vdmVUZXJtaW5hdGVkSm9icygoSVBRdWV1ZUNvbnRyb2wpIHF1ZXVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCNzZXRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl9Ci0KLQkJLyoKLQkJICogVXBkYXRlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkJICovCi0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCi0JCVN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gbmFtZUF0dHJEZWYgPSBFbGVtZW50QXR0cmlidXRlcy5nZXROYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpOwotCQlTdHJpbmdBdHRyaWJ1dGUgbmFtZUF0dHIgPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHJEZWYpOwotCQlpZiAobmFtZUF0dHIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lQXR0ci5zZXRWYWx1ZShjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQlhdHRycy5hZGRBdHRyaWJ1dGUobmFtZUF0dHIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGRlc2NBdHRyRGVmID0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5nZXREZXNjcmlwdGlvbkF0dHJpYnV0ZURlZmluaXRpb24oKTsKLQkJU3RyaW5nQXR0cmlidXRlIGRlc2NBdHRyID0gZ2V0QXR0cmlidXRlKGRlc2NBdHRyRGVmKTsKLQkJaWYgKGRlc2NBdHRyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVzY0F0dHIuc2V0VmFsdWUoY29uZmlnLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCWF0dHJzLmFkZEF0dHJpYnV0ZShkZXNjQXR0cik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJZmlyZVJlc291cmNlTWFuYWdlckNoYW5nZWQoYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLklSZXNvdXJjZU1hbmFnZXIjc3RvcCgpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG51bGw7Ci0JCXN3aXRjaCAoZ2V0U3RhdGUoKSkgewotCQljYXNlIEVSUk9SOgotCQkJc2V0U3RhdGUoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVE9QUEVEKTsKLQkJCWNsZWFuVXAoKTsKLQkJCWJyZWFrOwotCQljYXNlIFNUQVJURUQ6Ci0JCQlzZXRTdGF0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUT1BQSU5HKTsKLQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJTdG9wcGluZyBSZXNvdXJjZSBNYW5hZ2VyICIgKyBnZXROYW1lKCksIDEwKTsKLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCk7Ci0JCQl0cnkgewotCQkJCWRvU2h1dGRvd24oc3ViTW9uaXRvcik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCXNldFN0YXRlKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1RPUFBFRCk7Ci0JCQkJY2xlYW5VcCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0uSVJlc291cmNlTWFuYWdlciNzdGFydCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRVcChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFN0YXRlKCkgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVE9QUEVEKSB7Ci0JCQlzZXRTdGF0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUQVJUSU5HKTsKLQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJSZXNvdXJjZSBtYW5hZ2VyIHN0YXJ0aW5nOiAiICsgZ2V0TmFtZSgpLCAxMCk7Ci0JCQl0cnkgewotCQkJCWluaXRpYWxpemUoKTsKLQkJCQlib29sZWFuIHN0YXJ0ZWQgPSBkb1N0YXJ0dXAobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotCQkJCWlmIChzdGFydGVkKSB7Ci0JCQkJCXNldFN0YXRlKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1RBUlRFRCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0U3RhdGUoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVE9QUEVEKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlzZXRTdGF0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKTsKLQkJCQl0aHJvdyBlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlciNzdWJtaXRKb2Iob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJUEpvYiBzdWJtaXRKb2IoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkb1N1Ym1pdEpvYihudWxsLCBjb25maWd1cmF0aW9uLCBhdHRyTWdyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyI3N1Ym1pdEpvYihqYXZhLmxhbmcuU3RyaW5nLCAKLQkgKiAJCW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sIAotCSAqIAkJb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyLCAKLQkgKiAJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN1Ym1pdEpvYihTdHJpbmcgc3ViSWQsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlkb1N1Ym1pdEpvYihzdWJJZCwgY29uZmlndXJhdGlvbiwgYXR0ck1nciwgbW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyI3Rlcm1pbmF0ZUpvYihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVKb2IoSVBKb2Igam9iKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWRvVGVybWluYXRlSm9iKGpvYik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhbiBldmVudCB0byBub3RpZnkgdGhhdCBzb21lIGF0dHJpYnV0ZXMgaGF2ZSBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIGF0dHJzCi0JICogICAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZXNvdXJjZU1hbmFnZXJDaGFuZ2VkKEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJSVJlc291cmNlTWFuYWdlckNoYW5nZUV2ZW50IGUgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQodGhpcywgYXR0cnMpOwotCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIHN0YXRlIGF0dHJpYnV0ZSBmb3IgdGhpcyBSTQotCSAqIAotCSAqIEByZXR1cm4gc3RhdGUgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBFbnVtZXJhdGVkQXR0cmlidXRlPFN0YXRlPiBnZXRTdGF0ZUF0dHJpYnV0ZSgpIHsKLQkJRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248U3RhdGU+IHN0YXRlQXR0ckRlZiA9IFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCk7Ci0JCUVudW1lcmF0ZWRBdHRyaWJ1dGU8U3RhdGU+IHN0YXRlQXR0ciA9IGdldEF0dHJpYnV0ZShzdGF0ZUF0dHJEZWYpOwotCQlyZXR1cm4gc3RhdGVBdHRyOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHJlc291cmNlIG1hbmFnZXIuIFRoaXMgaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgcmVzb3VyY2UKLQkgKiBtYW5hZ2VyIGlzIHN0YXJ0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWF0dHJEZWZNYW5hZ2VyLmNsZWFyKCk7Ci0JCWF0dHJEZWZNYW5hZ2VyLnNldEF0dHJpYnV0ZURlZmluaXRpb25zKEVsZW1lbnRBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpKTsKLQkJYXR0ckRlZk1hbmFnZXIuc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoRXJyb3JBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpKTsKLQkJYXR0ckRlZk1hbmFnZXIuc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoSm9iQXR0cmlidXRlcy5nZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSk7Ci0JCWF0dHJEZWZNYW5hZ2VyLnNldEF0dHJpYnV0ZURlZmluaXRpb25zKE1hY2hpbmVBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpKTsKLQkJYXR0ckRlZk1hbmFnZXIuc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoTWVzc2FnZUF0dHJpYnV0ZXMuZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkpOwotCQlhdHRyRGVmTWFuYWdlci5zZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhOb2RlQXR0cmlidXRlcy5nZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSk7Ci0JCWF0dHJEZWZNYW5hZ2VyLnNldEF0dHJpYnV0ZURlZmluaXRpb25zKFByb2Nlc3NBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpKTsKLQkJYXR0ckRlZk1hbmFnZXIuc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoUXVldWVBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpKTsKLQkJYXR0ckRlZk1hbmFnZXIuc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5nZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBvZiBqb2JzIHRvIHRoZSBtb2RlbC4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhIElOZXdKb2JFdmVudAotCSAqIGJlaW5nIHByb3BhZ2F0ZWQgdG8gbGlzdGVuZXJzIG9uIHRoZSBxdWV1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcGFyYW0gam9icwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEpvYnMoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JzKSB7Ci0KLQkJZm9yIChJUEpvYkNvbnRyb2wgam9iIDogam9icykgewotCQkJam9iLmFkZENoaWxkTGlzdGVuZXIoam9iUHJvY2Vzc0xpc3RlbmVyKTsKLQkJCWpvYnNCeUlkLnB1dChqb2IuZ2V0SUQoKSwgam9iKTsKLQkJfQotCi0JCXF1ZXVlLmFkZEpvYnMoam9icyk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBvZiBtYWNoaW5lcyB0byB0aGUgbW9kZWwuIFRoaXMgd2lsbCByZXN1bHQgaW4gYQotCSAqIElOZXdNYWNoaW5lRXZlbnQgYmVpbmcgcHJvcGFnYXRlZCB0byBsaXN0ZW5lcnMgb24gdGhlIFJNLgotCSAqIAotCSAqIEBwYXJhbSBtYWNoaW5lQ29udHJvbHMKLQkgKiAgICAgICAgICAgIENvbGxlY3Rpb24gb2YgSU1hY2hpbmVDb250cm9scwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hY2hpbmVzKENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZUNvbnRyb2xzKSB7Ci0JCUxpc3Q8SVBNYWNoaW5lPiBtYWNoaW5lcyA9IG5ldyBBcnJheUxpc3Q8SVBNYWNoaW5lPihtYWNoaW5lQ29udHJvbHMuc2l6ZSgpKTsKLQotCQlzeW5jaHJvbml6ZWQgKG1hY2hpbmVzQnlJZCkgewotCQkJZm9yIChJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUgOiBtYWNoaW5lQ29udHJvbHMpIHsKLQkJCQltYWNoaW5lc0J5SWQucHV0KG1hY2hpbmUuZ2V0SUQoKSwgbWFjaGluZSk7Ci0JCQkJbWFjaGluZS5hZGRDaGlsZExpc3RlbmVyKG1hY2hpbmVOb2RlTGlzdGVuZXIpOwotCQkJCW1hY2hpbmVzLmFkZChtYWNoaW5lKTsKLQkJCX0KLQkJfQotCi0JCWZpcmVOZXdNYWNoaW5lcyhtYWNoaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBvZiBtYWNoaW5lcyB0byB0aGUgbW9kZWwuIFRoaXMgd2lsbCByZXN1bHQgaW4gYQotCSAqIElOZXdOb2RlRXZlbnQgYmVpbmcgcHJvcGFnYXRlZCB0byBsaXN0ZW5lcnMgb24gdGhlIG1hY2hpbmUuCi0JICogCi0JICogQHBhcmFtIG1hY2hpbmUKLQkgKiAgICAgICAgICAgIHBhcmVudCBvZiB0aGUgbm9kZXMKLQkgKiBAcGFyYW0gbm9kZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgSVBOb2RlQ29udHJvbHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlcyhJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIENvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gbm9kZXMpIHsKLQotCQlmb3IgKElQTm9kZUNvbnRyb2wgbm9kZSA6IG5vZGVzKSB7Ci0JCQlub2Rlc0J5SWQucHV0KG5vZGUuZ2V0SUQoKSwgbm9kZSk7Ci0JCX0KLQotCQltYWNoaW5lLmFkZE5vZGVzKG5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBjb2xsZWN0aW9uIG9mIHByb2Nlc3NlcyB0byB0aGUgbW9kZWwuIFRoaXMgaW52b2x2ZXMgYWRkaW5nIHRoZQotCSAqIHByb2Nlc3NlcyB0byBhIGpvYiAqYW5kKiB0byBhIG5vZGUuIFRoZSBub2RlIGluZm9ybWF0aW9uIGlzIGFuIGF0dHJpYnV0ZQotCSAqIG9uIHRoZSBwcm9jZXNzLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEgSU5ld1Byb2Nlc3NFdmVudCBiZWluZyBwcm9wYWdhdGVkCi0JICogdG8gbGlzdGVuZXJzIG9uIHRoZSBqb2IgYW5kIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBqb2IKLQkgKiAgICAgICAgICAgIHBhcmVudCBvZiB0aGUgcHJvY2Vzc2VzCi0JICogQHBhcmFtIHByb2Nlc3NlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBJUFByb2Nlc0NvbnRyb2xzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc2VzKElQSm9iQ29udHJvbCBqb2IsIENvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gcHJvY2Vzc2VzKSB7Ci0JCS8qCi0JCSAqIE1hcCBjb250YWluaW5nIGEgbGlzdCBvZiBwcm9jZXNzZXMgdGhhdCBhcmUgbGlua2VkIHRvIG5vZGVzCi0JCSAqLwotCQlNYXA8SVBOb2RlQ29udHJvbCwgTGlzdDxJUFByb2Nlc3NDb250cm9sPj4gbm9kZVByb2NNYXAgPSBuZXcgSGFzaE1hcDxJUE5vZGVDb250cm9sLCBMaXN0PElQUHJvY2Vzc0NvbnRyb2w+PigpOwotCi0JCWZvciAoSVBQcm9jZXNzQ29udHJvbCBwcm9jZXNzIDogcHJvY2Vzc2VzKSB7Ci0JCQkvKgotCQkJICogRmluZCB0aGUgbm9kZSBJRCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGUgcHJvY2VzcyB0byB0aGUgbGlzdCBmb3IKLQkJCSAqIGVhY2ggbm9kZS4gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgYXR0cmlidXRlIG1hbmFnZXIuCi0JCQkgKi8KLQkJCVN0cmluZ0F0dHJpYnV0ZSBhdHRyID0gKFN0cmluZ0F0dHJpYnV0ZSkgcHJvY2Vzcy5nZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0Tm9kZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlJUE5vZGVDb250cm9sIG5vZGUgPSBnZXROb2RlQ29udHJvbChhdHRyLmdldFZhbHVlKCkpOwotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJTGlzdDxJUFByb2Nlc3NDb250cm9sPiBwcm9jcyA9IG5vZGVQcm9jTWFwLmdldChub2RlKTsKLQkJCQkJaWYgKHByb2NzID09IG51bGwpIHsKLQkJCQkJCXByb2NzID0gbmV3IEFycmF5TGlzdDxJUFByb2Nlc3NDb250cm9sPigpOwotCQkJCQkJbm9kZVByb2NNYXAucHV0KG5vZGUsIHByb2NzKTsKLQkJCQkJfQotCQkJCQlwcm9jcy5hZGQocHJvY2Vzcyk7Ci0JCQkJfQotCQkJCXByb2Nlc3MucmVtb3ZlQXR0cmlidXRlKGF0dHIpOwotCQkJfQotCi0JCQlwcm9jZXNzZXNCeUlkLnB1dChwcm9jZXNzLmdldElEKCksIHByb2Nlc3MpOwotCQl9Ci0KLQkJam9iLmFkZFByb2Nlc3Nlcyhwcm9jZXNzZXMpOwotCi0JCS8qCi0JCSAqIEJ1bGsgYWRkIHRoZSBwcm9jZXNzZXMgdG8gdGhlIG5vZGVzCi0JCSAqLwotCQlmb3IgKE1hcC5FbnRyeTxJUE5vZGVDb250cm9sLCBMaXN0PElQUHJvY2Vzc0NvbnRyb2w+PiBlbnRyeSA6IG5vZGVQcm9jTWFwLmVudHJ5U2V0KCkpIHsKLQkJCWVudHJ5LmdldEtleSgpLmFkZFByb2Nlc3NlcyhlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBvZiBwcm9jZXNzZXMgdG8gdGhlIG1vZGVsLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEKLQkgKiBJTmV3UHJvY2Vzc0V2ZW50IGJlaW5nIHByb3BhZ2F0ZWQgdG8gbGlzdGVuZXJzIG9uIHRoZSBqb2IuCi0JICogCi0JICogQHBhcmFtIHF1ZXVlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBJUFF1ZXVlQ29udHJvbHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWV1ZXMoQ29sbGVjdGlvbjxJUFF1ZXVlQ29udHJvbD4gcXVldWVDb250cm9scykgewotCQlMaXN0PElQUXVldWU+IHF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8SVBRdWV1ZT4ocXVldWVDb250cm9scy5zaXplKCkpOwotCi0JCWZvciAoSVBRdWV1ZUNvbnRyb2wgcXVldWUgOiBxdWV1ZUNvbnRyb2xzKSB7Ci0JCQlxdWV1ZXNCeUlkLnB1dChxdWV1ZS5nZXRJRCgpLCBxdWV1ZSk7Ci0JCQkvKgotCQkJICogS2VlcCBhIG1hcCBvZiBxdWV1ZSBuYW1lcywgaWYgdGhlIHF1ZXVlIGhhcyBhIG5hbWUgKGFuZCBpdAotCQkJICogc2hvdWxkKS4KLQkJCSAqLwotCQkJU3RyaW5nQXR0cmlidXRlIGF0dHIgPSBxdWV1ZS5nZXRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0TmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJcXVldWVzQnlOYW1lLnB1dChhdHRyLmdldFZhbHVlKCksIHF1ZXVlKTsKLQkJCX0KLQkJCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIocXVldWVKb2JMaXN0ZW5lcik7Ci0JCQlxdWV1ZXMuYWRkKHF1ZXVlKTsKLQkJfQotCi0JCWZpcmVOZXdRdWV1ZXMocXVldWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBtb2RlbCBlbGVtZW50cyBiZWxvdyB0aGUgUk0uIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIFJNCi0JICogc2h1dHMgZG93biBhbmQgZW5zdXJlcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgY2xlYW5lZCB1cCBwcm9wZXJseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewotCQlkb0NsZWFuVXAoKTsKLQotCQlyZW1vdmVRdWV1ZXModGhpcywgZ2V0UXVldWVDb250cm9scygpKTsKLQkJcmVtb3ZlTWFjaGluZXModGhpcywgZ2V0TWFjaGluZUNvbnRyb2xzKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLmNvcmUuZWxlbWVudHMuUEVsZW1lbnQjZG9BZGRBdHRyaWJ1dGVIb29rKGphdmEudXRpbC5NYXApCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGRBdHRyaWJ1dGVIb29rKEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJZmlyZVJlc291cmNlTWFuYWdlckNoYW5nZWQoYXR0cnMpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYW55IGNsZWFudXAgYWN0aXZpdGllcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvQ2xlYW5VcCgpOwotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgYWN0aXZpdGllcyBwcmlvciB0byBkaXNhYmxpbmcgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9EaXNhYmxlRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFueSBhY3Rpdml0aWVzIHByaW9yIHRvIGRpc3Bvc2luZyBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0Rpc3Bvc2UoKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gYW55IGFjdGl2aXRpZXMgcHJpb3IgdG8gZW5hYmxpbmcgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FbmFibGVFdmVudHMoKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0ZXJtaW5hdGVkIGpvYnMKLQkgKiAKLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgcmVtb3ZlZCBqb2JzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8SVBKb2JDb250cm9sPiBkb1JlbW92ZVRlcm1pbmF0ZWRKb2JzKElQUXVldWVDb250cm9sIHF1ZXVlKTsKLQotCS8qKgotCSAqIFN0b3AgdGhlIHJlc291cmNlIG1hbmFnZXIgc3Vic3lzdGVtLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU2h1dGRvd24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN0YXJ0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHN1YnN5c3RlbS4gUmV0dXJucyB0cnVlIGlmIHRoZSBzeXN0ZW0gd2FzCi0JICogc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3IgZmFsc2UgaWYgc3RhcnR1cCB3YXMgY2FuY2VsZWQgYnkgdGhlIHVzZXIuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGRvU3RhcnR1cChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3VibWl0IGEgam9iIHdpdGggdGhlIHN1cHBsaWVkIHN1Ym1pc3Npb24gSUQuUmV0dXJucyBhIGpvYiB0aGF0IHJlcHJlc2VudHMgdGhlIHN1Ym1pdHRlZCBqb2IsIG9yIG51bGwgaWYKLQkgKiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3YXMgY2FuY2VsZWQuCi0JICogCi0JICogQHBhcmFtIHN1YklkCi0JICogQHBhcmFtIGF0dHJNZ3IKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJUEpvYiBkb1N1Ym1pdEpvYihTdHJpbmcgc3ViSWQsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUZXJtaW5hdGUgYSBqb2IuCi0JICogCi0JICogQHBhcmFtIGpvYgotCSAqICAgICAgICAgICAgam9iIHRvIHRlcm1pbmF0ZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVGVybWluYXRlSm9iKElQSm9iIGpvYikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGUgSUNoYW5nZWRNYWNoaW5lRXZlbnQgdG8gbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gbWFjaGluZQotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNoYW5nZWRNYWNoaW5lcyhDb2xsZWN0aW9uPElQTWFjaGluZT4gbWFjaGluZXMpIHsKLQkJSUNoYW5nZWRNYWNoaW5lRXZlbnQgZSA9IG5ldyBDaGFuZ2VkTWFjaGluZUV2ZW50KHRoaXMsIG1hY2hpbmVzKTsKLQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGUgSUNoYW5nZWRRdWV1ZUV2ZW50IHRvIGxpc3RlbmVyCi0JICogCi0JICogQHBhcmFtIHF1ZXVlCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ2hhbmdlZFF1ZXVlcyhDb2xsZWN0aW9uPElQUXVldWU+IHF1ZXVlcykgewotCQlJQ2hhbmdlZFF1ZXVlRXZlbnQgZSA9IG5ldyBDaGFuZ2VkUXVldWVFdmVudCh0aGlzLCBxdWV1ZXMpOwotCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3BhZ2F0ZSBJUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudCB0byBsaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCUlSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50IGUgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudCh0aGlzLCBtZXNzYWdlKTsKLQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcm9wYWdhdGUgSVJlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGlkIGpvYiBzdWJtaXNzaW9uIGlkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVN1Ym1pdEpvYkVycm9yKFN0cmluZyBpZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJSVJlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQgZSA9IG5ldyBSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50KHRoaXMsIGlkLCBtZXNzYWdlKTsKLQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3BhZ2F0ZSBhIElSZXNvdXJjZU1hbmFnZXJOZXdNYWNoaW5lc0V2ZW50IHRvIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFjaGluZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgbmV3IG1hY2hpbmVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU5ld01hY2hpbmVzKENvbGxlY3Rpb248SVBNYWNoaW5lPiBtYWNoaW5lcykgewotCQlJTmV3TWFjaGluZUV2ZW50IGUgPSBuZXcgTmV3TWFjaGluZUV2ZW50KHRoaXMsIG1hY2hpbmVzKTsKLQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcXVldWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTmV3UXVldWVzKENvbGxlY3Rpb248SVBRdWV1ZT4gcXVldWVzKSB7Ci0JCUlOZXdRdWV1ZUV2ZW50IGUgPSBuZXcgTmV3UXVldWVFdmVudCh0aGlzLCBxdWV1ZXMpOwotCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYWNoaW5lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJlbW92ZU1hY2hpbmVzKENvbGxlY3Rpb248SVBNYWNoaW5lPiBtYWNoaW5lcykgewotCQlJUmVtb3ZlTWFjaGluZUV2ZW50IGUgPSBuZXcgUmVtb3ZlTWFjaGluZUV2ZW50KHRoaXMsIG1hY2hpbmVzKTsKLQotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGNoaWxkTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcXVldWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUmVtb3ZlUXVldWVzKENvbGxlY3Rpb248SVBRdWV1ZT4gcXVldWVzKSB7Ci0JCUlSZW1vdmVRdWV1ZUV2ZW50IGUgPSBuZXcgUmVtb3ZlUXVldWVFdmVudCh0aGlzLCBxdWV1ZXMpOwotCi0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqb2JJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBKb2JDb250cm9sIGdldEpvYkNvbnRyb2woU3RyaW5nIGpvYklkKSB7Ci0JCXJldHVybiBqb2JzQnlJZC5nZXQoam9iSWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYWNoaW5lSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQTWFjaGluZUNvbnRyb2wgZ2V0TWFjaGluZUNvbnRyb2woU3RyaW5nIG1hY2hpbmVJZCkgewotCQlyZXR1cm4gbWFjaGluZXNCeUlkLmdldChtYWNoaW5lSWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQTm9kZUNvbnRyb2wgZ2V0Tm9kZUNvbnRyb2woU3RyaW5nIG5vZGVJZCkgewotCQlyZXR1cm4gbm9kZXNCeUlkLmdldChub2RlSWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jZXNzSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQUHJvY2Vzc0NvbnRyb2wgZ2V0UHJvY2Vzc0NvbnRyb2woU3RyaW5nIHByb2Nlc3NJZCkgewotCQlyZXR1cm4gcHJvY2Vzc2VzQnlJZC5nZXQocHJvY2Vzc0lkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFjaGluZUlkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUFF1ZXVlQ29udHJvbCBnZXRRdWV1ZUNvbnRyb2woU3RyaW5nIG1hY2hpbmVJZCkgewotCQlyZXR1cm4gcXVldWVzQnlJZC5nZXQobWFjaGluZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDb3JlRXhjZXB0aW9uIG1ha2VDb3JlRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgUFRQQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFN0YXR1cy5FUlJPUiwgc3RyaW5nLCBudWxsKTsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgam9iLgotCSAqIAotCSAqIEBwYXJhbSBxdWV1ZQotCSAqICAgICAgICAgICAgcXVldWUgdGhhdCB0aGlzIGpvYiBiZWxvbmdzIHRvCi0JICogQHBhcmFtIGpvYklkCi0JICogICAgICAgICAgICBqb2IgSUQgZm9yIHRoZSBqb2IKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiAgICAgICAgICAgIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIGpvYgotCSAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBqb2IgbW9kZWwgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBJUEpvYkNvbnRyb2wgbmV3Sm9iKElQUXVldWVDb250cm9sIHF1ZXVlLCBTdHJpbmcgam9iSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBQSm9iKGpvYklkLCBxdWV1ZSwgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBtYWNoaW5lLgotCSAqIAotCSAqIEBwYXJhbSBtYWNoaW5lSWQKLQkgKiAgICAgICAgICAgIElEIGZvciB0aGUgbWFjaGluZQotCSAqIEBwYXJhbSBhdHRycwotCSAqICAgICAgICAgICAgaW5pdGlhbCBhdHRyaWJ1dGVzIGZvciB0aGUgbWFjaGluZQotCSAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBtYWNoaW5lIG1vZGVsIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBNYWNoaW5lQ29udHJvbCBuZXdNYWNoaW5lKFN0cmluZyBtYWNoaW5lSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBQTWFjaGluZShtYWNoaW5lSWQsIHRoaXMsIGF0dHJzLmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBtYWNoaW5lCi0JICogICAgICAgICAgICBtYWNoaW5lIHRoYXQgdGhpcyBub2RlIGJlbG9uZ3MgdG8KLQkgKiBAcGFyYW0gbm9kZUlkCi0JICogICAgICAgICAgICBJRCBmb3IgdGhlIG5vZGUKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiAgICAgICAgICAgIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIG5vZGUKLQkgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgbm9kZSBtb2RlbCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIElQTm9kZUNvbnRyb2wgbmV3Tm9kZShJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIFN0cmluZyBub2RlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBQTm9kZShub2RlSWQsIG1hY2hpbmUsIGF0dHJzLmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBqb2IKLQkgKiAgICAgICAgICAgIGpvYiB0aGF0IHRoaXMgcHJvY2VzcyBiZWxvbmdzIHRvCi0JICogQHBhcmFtIHByb2Nlc3NJZAotCSAqICAgICAgICAgICAgSUQgZm9yIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIGF0dHJzCi0JICogICAgICAgICAgICBpbml0aWFsIGF0dHJpYnV0ZXMgZm9yIHRoZSBwcm9jZXNzCi0JICogQHJldHVybiBuZXdseSBjcmVhdGVkIHByb2Nlc3MgbW9kZWwgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBJUFByb2Nlc3NDb250cm9sIG5ld1Byb2Nlc3MoSVBKb2JDb250cm9sIGpvYiwgU3RyaW5nIHByb2Nlc3NJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3IFBQcm9jZXNzKHByb2Nlc3NJZCwgam9iLCBhdHRycy5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IHF1ZXVlCi0JICogCi0JICogQHBhcmFtIHF1ZXVlSWQKLQkgKiAgICAgICAgICAgIElEIGZvciB0aGUgcXVldWUKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiAgICAgICAgICAgIGluaXRpYWwgYXR0cmlidXRlcyBmb3IgdGhlIHF1ZXVlCi0JICogQHJldHVybiBuZXdseSBjcmVhdGVkIHF1ZXVlIG1vZGVsIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBRdWV1ZUNvbnRyb2wgbmV3UXVldWUoU3RyaW5nIHF1ZXVlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBQUXVldWUocXVldWVJZCwgdGhpcywgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSm9icyhJUFF1ZXVlQ29udHJvbCBxdWV1ZSwgQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYnMpIHsKLQkJcXVldWUucmVtb3ZlSm9icyhqb2JzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFjaGluZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hY2hpbmVzKElSZXNvdXJjZU1hbmFnZXIgcm0sIENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZUNvbnRyb2xzKSB7Ci0JCUxpc3Q8SVBNYWNoaW5lPiBtYWNoaW5lcyA9IG5ldyBBcnJheUxpc3Q8SVBNYWNoaW5lPihtYWNoaW5lQ29udHJvbHMuc2l6ZSgpKTsKLQotCQlmb3IgKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSA6IG1hY2hpbmVDb250cm9scykgewotCQkJbWFjaGluZS5yZW1vdmVOb2RlcyhtYWNoaW5lLmdldE5vZGVDb250cm9scygpKTsKLQkJCW1hY2hpbmUucmVtb3ZlQ2hpbGRMaXN0ZW5lcihtYWNoaW5lTm9kZUxpc3RlbmVyKTsKLQkJCW1hY2hpbmVzQnlJZC5yZW1vdmUobWFjaGluZS5nZXRJRCgpKTsKLQkJCW1hY2hpbmVzLmFkZChtYWNoaW5lKTsKLQkJfQotCi0JCWZpcmVSZW1vdmVNYWNoaW5lcyhtYWNoaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGVzIGZyb20gdGhlIG1hY2hpbmUuCi0JICogCi0JICogQHBhcmFtIG1hY2hpbmUKLQkgKiAgICAgICAgICAgIG1hY2hpbmUgY29udGFpbmluZyB0aGUgbm9kZXMgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG5vZGVzCi0JICogICAgICAgICAgICBub2RlcyB0byByZW1vdmUgZnJvbSB0aGUgbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIENvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gbm9kZXMpIHsKLQkJbWFjaGluZS5yZW1vdmVOb2Rlcyhub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHByb2Nlc3NlcyBmcm9tIHRoZSBqb2IuIFRoaXMgd2lsbCBhbHNvIHJlc3VsdCBpbiB0aGUgcHJvY2Vzc2VzCi0JICogYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBhc3NvY2lhdGVkIG5vZGVzLCBhcyB0aGUgbm9kZXMgd2VyZSByZWdpc3RlcmVkIGFzCi0JICogY2hpbGQgbGlzdGVuZXJzIG9uIHRoZSBqb2IuCi0JICogCi0JICogQHBhcmFtIGpvYgotCSAqICAgICAgICAgICAgam9iIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3NlcyB0byByZW1vdmUKLQkgKiBAcGFyYW0gcHJvY2Vzc2VzCi0JICogICAgICAgICAgICBwcm9jZXNzZXMgdG8gcmVtb3ZlIGZyb20gdGhlIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvY2Vzc2VzKElQSm9iQ29udHJvbCBqb2IsIENvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gcHJvY2Vzc2VzKSB7Ci0JCWpvYi5yZW1vdmVQcm9jZXNzZXMocHJvY2Vzc2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcXVldWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVRdWV1ZXMoSVJlc291cmNlTWFuYWdlciBybSwgQ29sbGVjdGlvbjxJUFF1ZXVlQ29udHJvbD4gcXVldWVDb250cm9scykgewotCQlMaXN0PElQUXVldWU+IHF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8SVBRdWV1ZT4ocXVldWVDb250cm9scy5zaXplKCkpOwotCi0JCWZvciAoSVBRdWV1ZUNvbnRyb2wgcXVldWUgOiBxdWV1ZUNvbnRyb2xzKSB7Ci0JCQlxdWV1ZS5yZW1vdmVKb2JzKHF1ZXVlLmdldEpvYkNvbnRyb2xzKCkpOwotCQkJcXVldWUucmVtb3ZlQ2hpbGRMaXN0ZW5lcihxdWV1ZUpvYkxpc3RlbmVyKTsKLQkJCXF1ZXVlc0J5SWQucmVtb3ZlKHF1ZXVlLmdldElEKCkpOwotCQkJU3RyaW5nQXR0cmlidXRlIGF0dHIgPSBxdWV1ZS5nZXRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0TmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJcXVldWVzQnlOYW1lLnJlbW92ZShhdHRyLmdldFZhbHVlKCkpOwotCQkJfQotCQkJcXVldWVzLmFkZChxdWV1ZSk7Ci0JCX0KLQotCQlmaXJlUmVtb3ZlUXVldWVzKHF1ZXVlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhdGUoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSkgewotCQlFbnVtZXJhdGVkQXR0cmlidXRlPFN0YXRlPiBzdGF0ZUF0dHIgPSBnZXRTdGF0ZUF0dHJpYnV0ZSgpOwotCQlpZiAoc3RhdGVBdHRyLmdldFZhbHVlKCkgIT0gc3RhdGUpIHsKLQkJCXN0YXRlQXR0ci5zZXRWYWx1ZShzdGF0ZSk7Ci0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCWF0dHJzLmFkZEF0dHJpYnV0ZShzdGF0ZUF0dHIpOwotCQkJZmlyZVJlc291cmNlTWFuYWdlckNoYW5nZWQoYXR0cnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGF0dHJpYnV0ZXMgb24gYSBjb2xsZWN0aW9uIG9mIGpvYnMuCi0JICogCi0JICogQHBhcmFtIHF1ZXVlCi0JICogICAgICAgICAgICBwYXJlbnQgb2Ygam9icwotCSAqIEBwYXJhbSBqb2JzCi0JICogICAgICAgICAgICBqb2JzIHRvIHVwZGF0ZQotCSAqIEBwYXJhbSBhdHRycwotCSAqICAgICAgICAgICAgYXR0cmlidXRlcyB0byB1cGRhdGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdXBkYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZUpvYnMoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXF1ZXVlLmFkZEpvYkF0dHJpYnV0ZXMoam9icywgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGF0dHJpYnV0ZXMgb24gYSBjb2xsZWN0aW9uIG9mIG1hY2hpbmVzLgotCSAqIAotCSAqIEBwYXJhbSBtYWNoaW5lcwotCSAqICAgICAgICAgICAgbWFjaGluZXMgdG8gdXBkYXRlCi0JICogQHBhcmFtIGF0dHJzCi0JICogICAgICAgICAgICBhdHRyaWJ1dGVzIHRvIHVwZGF0ZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cGRhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlTWFjaGluZXMoQ29sbGVjdGlvbjxJUE1hY2hpbmVDb250cm9sPiBtYWNoaW5lcywgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlhZGRNYWNoaW5lQXR0cmlidXRlcyhtYWNoaW5lcywgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGF0dHJpYnV0ZXMgb24gYSBjb2xsZWN0aW9uIG9mIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBtYWNoaW5lCi0JICogICAgICAgICAgICBwYXJlbnQgb2Ygbm9kZXMKLQkgKiBAcGFyYW0gbm9kZXMKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2Ygbm9kZXMKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZXMgdG8gdXBkYXRlCi0JICogQHJldHVybiB0cnVlIGlmIHVwZGF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOb2RlcyhJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIENvbGxlY3Rpb248SVBOb2RlQ29udHJvbD4gbm9kZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJbWFjaGluZS5hZGROb2RlQXR0cmlidXRlcyhub2RlcywgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGF0dHJpYnV0ZXMgb24gYSBjb2xsZWN0aW9uIG9mIHByb2Nlc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gam9iCi0JICogICAgICAgICAgICBwYXJlbnQgb2YgcHJvY2Vzc2VzCi0JICogQHBhcmFtIHByb2Nlc3NlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBwcm9jZXNzZXMKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZXMgdG8gdXBkYXRlCi0JICogQHJldHVybiB0cnVlIGlmIHVwZGF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9jZXNzZXMoSVBKb2JDb250cm9sIGpvYiwgQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJam9iLmFkZFByb2Nlc3NBdHRyaWJ1dGVzKHByb2Nlc3NlcywgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBhdHRyaWJ1dGVzIG9uIGEgY29sbGVjdGlvbiBvZiBxdWV1ZXMuCi0JICogCi0JICogQHBhcmFtIHF1ZXVlcwotCSAqICAgICAgICAgICAgcXVldWVzIHRvIHVwZGF0ZQotCSAqIEBwYXJhbSBhdHRycwotCSAqICAgICAgICAgICAgYXR0cmlidXRlcyB0byB1cGRhdGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdXBkYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVF1ZXVlcyhDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBxdWV1ZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJYWRkUXVldWVBdHRyaWJ1dGVzKHF1ZXVlcywgYXR0cnMuZ2V0QXR0cmlidXRlcygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybXN5c3RlbS9BYnN0cmFjdFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybXN5c3RlbS9BYnN0cmFjdFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzODk2Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiB7Ci0KLQlzdGF0aWMgcHVibGljIGNsYXNzIENvbW1vbkNvbmZpZyB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyB1bmlxdWVOYW1lOwotCi0JCXB1YmxpYyBDb21tb25Db25maWcoKSB7Ci0JCQl0aGlzKCIiLCAiIiwgZ2VuZXJhdGVVbmlxdWVOYW1lKCkpOwotCQl9Ci0KLQkJcHVibGljIENvbW1vbkNvbmZpZyhTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB1bmlxdWVOYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCQl0aGlzLnVuaXF1ZU5hbWUgPSB1bmlxdWVOYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1VOSVFVRV9OQU1FID0gInVuaXFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRkFDVE9SWV9JRCA9ICJmYWN0b3J5SWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqIEBwYXJhbSBtZW1lbnRvCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uQ29uZmlnIGxvYWRDb21tb24oSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZmFjdG9yeSwKLQkJCUlNZW1lbnRvIG1lbWVudG8pIHsKLQkJU3RyaW5nIGZhY3RvcnlJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19GQUNUT1JZX0lEKTsKLQkJaWYgKCFmYWN0b3J5SWQuZXF1YWxzKGZhY3RvcnkuZ2V0SWQoKSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluY29tcGF0YWJsZSBmYWN0b3J5IHdpdGggZmFjdG9yeUlkIgotCQkJCQkrICIgc3RvcmVkIGlkIiArIGZhY3RvcnlJZCAKLQkJCQkJKyAiLCBmYWN0b3J5IGlkOiIgKyBmYWN0b3J5LmdldElkKCkpOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX05BTUUpOwotCQlTdHJpbmcgZGVzYyA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19ERVNDUklQVElPTik7Ci0JCVN0cmluZyB1bmlxdWVOYW1lID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX1VOSVFVRV9OQU1FKTsKLQkJcmV0dXJuIG5ldyBDb21tb25Db25maWcobmFtZSwgZGVzYywgdW5pcXVlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlTmFtZSgpIHsKLQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXJldHVybiAiUk1JRDoiICsgTG9uZy50b1N0cmluZyh0aW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlc291cmNlTWFuYWdlcklkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlc291cmNlTWFuYWdlclR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdW5pcXVlTmFtZTsKLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3Rvcnk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oQ29tbW9uQ29uZmlnIGNvbW1vbkNvbmZpZywKLQkJCUlSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5uYW1lID0gY29tbW9uQ29uZmlnLmdldE5hbWUoKTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGNvbW1vbkNvbmZpZy5nZXREZXNjcmlwdGlvbigpOwotCQl0aGlzLnJlc291cmNlTWFuYWdlcklkID0gZmFjdG9yeS5nZXRJZCgpOwotCQl0aGlzLnJlc291cmNlTWFuYWdlclR5cGUgPSBmYWN0b3J5LmdldE5hbWUoKTsKLQkJdGhpcy51bmlxdWVOYW1lID0gY29tbW9uQ29uZmlnLmdldFVuaXF1ZU5hbWUoKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBmYWN0b3J5IGZvciB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKSB7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXJJZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlclR5cGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI2dldFVuaXF1ZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgY29tbW9uIHBhcnRzIG9mIHRoaXMgY29uZmlnIHRoZW4gc2F2ZSB0aGUgcmVzdAotCSAqIEBwYXJhbSBtZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKFRBR19GQUNUT1JZX0lELCBnZXRSZXNvdXJjZU1hbmFnZXJJZCgpKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX05BTUUsIGdldE5hbWUoKSk7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKFRBR19ERVNDUklQVElPTiwgZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKFRBR19VTklRVUVfTkFNRSwgZ2V0VW5pcXVlTmFtZSgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGQwYjcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0Fic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLQotCi0KLS8qKgotICogQGF1dGhvciByc3FyZAotICogCi0gKi8KLS8qKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSNjcmVhdGUob3JnLmVjbGlwc2UucHRwLnJtLklSTUNvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIGFic3RyYWN0IElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGNyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3RvcnkjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybXN5c3RlbS9BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybXN5c3RlbS9BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwOWYxMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBQcm9jZXNzQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUVycm9yU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTWVzc2FnZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOZXdKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3TWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOZXdOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld1Byb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3UXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZUFsbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVNodXRkb3duU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuUmFuZ2VTZXQ7Ci0KLS8qKgotICogQGF1dGhvciBncmVnCi0gKgotICovCi0vKioKLSAqIEBhdXRob3IgZ3JlZwotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciBleHRlbmRzCi0JCUFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyIGltcGxlbWVudHMgSVJ1bnRpbWVFdmVudExpc3RlbmVyIHsKLQotCXB1YmxpYyBlbnVtIEpvYlN1YlN0YXRlIHtTVUJNSVRURUQsIENPTVBMRVRFRCwgRVJST1J9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBKb2JTdWJtaXNzaW9uIHsKLQkJcHJpdmF0ZSBJUEpvYgkJCQkJam9iID0gbnVsbDsKLQkJcHJpdmF0ZSBKb2JTdWJTdGF0ZQkJCQlzdGF0ZSA9IEpvYlN1YlN0YXRlLlNVQk1JVFRFRDsKLQkJcHJpdmF0ZSBTdHJpbmcJCQkJCXJlYXNvbjsKLQkJcHJpdmF0ZSBTdHJpbmcJCQkJCWlkOwotCQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uCWNvbmZpZ3VyYXRpb247Ci0JCXByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayAJc3ViTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7OwotCQlwcml2YXRlIGZpbmFsIENvbmRpdGlvbiAJCXN1YkNvbmRpdGlvbiA9IHN1YkxvY2submV3Q29uZGl0aW9uKCk7Ci0JCQotCQlwdWJsaWMgSm9iU3VibWlzc2lvbihpbnQgY291bnQpIHsKLQkJCXRoaXMuaWQgPSAiSk9CXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArIEludGVnZXIudG9TdHJpbmcoY291bnQpOwotCQl9Ci0KLQkJcHVibGljIEpvYlN1Ym1pc3Npb24oU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSByZWFzb24gZm9yIHRoZSBlcnJvcgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKLQkJCXJldHVybiByZWFzb247Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIGpvYiBzdWJtaXNzaW9uIElECi0JCSAqIAotCQkgKiBAcmV0dXJuIGpvYiBzdWJtaXNzaW9uIElECi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIGlkOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgam9iCi0JCSAqLwotCQlwdWJsaWMgSVBKb2IgZ2V0Sm9iKCkgewotCQkJcmV0dXJuIGpvYjsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJICovCi0JCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkgewotCQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBXYWl0IGZvciB0aGUgam9iIHN0YXRlIHRvIGNoYW5nZQotCQkgKiAKLQkJICogQHJldHVybiB0aGUgc3RhdGUKLQkJICovCi0JCXB1YmxpYyBKb2JTdWJTdGF0ZSB3YWl0Rm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJc3ViTG9jay5sb2NrKCk7Ci0JCQl0cnkgewotCQkJCXdoaWxlICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgc3RhdGUgIT0gSm9iU3ViU3RhdGUuU1VCTUlUVEVEKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdWJDb25kaXRpb24uYXdhaXQoMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBFeHBlY3QgdG8gYmUgaW50ZXJydXB0ZWQgaWYgbW9uaXRvciBpcyBjYW5jZWxlZAotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBzdGF0ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3ViTG9jay51bmxvY2soKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSByZWFzb24gdGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFcnJvcihTdHJpbmcgcmVhc29uKSB7Ci0JCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQkJCXNldFN0YXRlKEpvYlN1YlN0YXRlLkVSUk9SKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gam9iIHRoZSBqb2IgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRKb2IoSVBKb2Igam9iKSB7Ci0JCQl0aGlzLmpvYiA9IGpvYjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY29uZmlndWFyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U3RhdGUoSm9iU3ViU3RhdGUgc3RhdGUpIHsKLQkJCXN1YkxvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCQkJc3ViQ29uZGl0aW9uLnNpZ25hbEFsbCgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdWJMb2NrLnVubG9jaygpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgZW51bSBSTVN0YXRlIHtTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQsIEVSUk9SfQotCQotCXByaXZhdGUgSVJ1bnRpbWVTeXN0ZW0gcnVudGltZVN5c3RlbTsKLQlwcml2YXRlIHZvbGF0aWxlIFJNU3RhdGUgc3RhdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgc3RhdGVMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTs7Ci0JcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gc3RhdGVDb25kaXRpb24gPSBzdGF0ZUxvY2submV3Q29uZGl0aW9uKCk7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIEpvYlN1Ym1pc3Npb24+IGpvYlN1Ym1pc3Npb25zID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgSm9iU3VibWlzc2lvbj4oKSk7Ci0JCi0JcHVibGljIEFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlcihTdHJpbmcgaWQsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlLAotCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGlkLCB1bml2ZXJzZSwgY29uZmlnKTsKLQkJc3RhdGUgPSBSTVN0YXRlLlNUT1BQRUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50KQotCSAqCi0JICogTm90ZTogdGhpcyBhbGxvd3MgcmVkZWZpbml0aW9uIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4gVGhpcyBpcyBvayBhcyBsb25nIGFzIHRoZXkKLQkgKiBhcmUgb25seSBhbGxvd2VkIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gcGhhc2UuCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQgZSkgewotCQlmb3IgKElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PiBhdHRyIDogZS5nZXREZWZpbml0aW9ucygpKSB7Ci0JCQlnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpLnNldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0cik7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCBlKSB7Ci0JCS8vIElnbm9yZQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUVycm9yU3RhdGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZUVycm9yU3RhdGVFdmVudCBlKSB7Ci0JCS8qCi0JCSAqIEZhdGFsIGVycm9yIGluIHRoZSBydW50aW1lIHN5c3RlbS4gQ2FuY2VsIGFueSBwZW5kaW5nIGpvYiBzdWJtaXNzaW9ucwotCQkgKiBhbmQgaW5mb3JtIHVwcGVyIGxldmVscyBvZiB0aGUgcHJvYmxlbS4KLQkJICovCi0JCWZvciAoSm9iU3VibWlzc2lvbiBzdWIgOiBqb2JTdWJtaXNzaW9ucy52YWx1ZXMoKSkgewotCQkJc3ViLnNldEVycm9yKCJGYXRhbCBlcnJvciBvY3VycmVkIGluIHJ1bnRpbWUgc3lzdGVtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlqb2JTdWJtaXNzaW9ucy5jbGVhcigpOwotCQkKLQkJc3RhdGVMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCVJNU3RhdGUgb2xkU3RhdGUgPSBzdGF0ZTsKLQkJCXN0YXRlID0gUk1TdGF0ZS5FUlJPUjsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAob2xkU3RhdGUgPT0gUk1TdGF0ZS5TVE9QUElORykgewotCQkJCXN0YXRlQ29uZGl0aW9uLnNpZ25hbEFsbCgpOwotCQkJfQotCQkJc2V0U3RhdGUoUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5FUlJPUik7Ci0JCQljbGVhblVwKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdGF0ZUxvY2sudW5sb2NrKCk7Ci0JCX0JCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUpvYkNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lSm9iQ2hhbmdlRXZlbnQgZSkgewotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlTWdyID0gZS5nZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQlNYXA8SVBRdWV1ZUNvbnRyb2wsIExpc3Q8SVBKb2JDb250cm9sPj4gbWFwID0gCi0JCQluZXcgSGFzaE1hcDxJUFF1ZXVlQ29udHJvbCwgTGlzdDxJUEpvYkNvbnRyb2w+PigpOwotCQkKLQkJZm9yIChNYXAuRW50cnk8UmFuZ2VTZXQsIEF0dHJpYnV0ZU1hbmFnZXI+IG1nckVudHJ5IDogZU1nci5nZXRFbnRyeVNldCgpKSB7Ci0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzID0gbWdyRW50cnkuZ2V0VmFsdWUoKTsKLQkJCVJhbmdlU2V0IGpvYklkcyA9IG1nckVudHJ5LmdldEtleSgpOwotCQkJTGlzdDxJUEpvYkNvbnRyb2w+IGNoYW5nZWRKb2JzOwotCQkJCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50SWQgOiBqb2JJZHMpIHsKLQkJCQlJUEpvYkNvbnRyb2wgam9iID0gZ2V0Sm9iQ29udHJvbChlbGVtZW50SWQpOwotCQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCQlJUFF1ZXVlQ29udHJvbCBxdWV1ZSA9IGpvYi5nZXRRdWV1ZUNvbnRyb2woKTsKLQkJCQkJY2hhbmdlZEpvYnMgPSBtYXAuZ2V0KHF1ZXVlKTsKLQkJCQkJaWYgKGNoYW5nZWRKb2JzID09IG51bGwpIHsKLQkJCQkJCWNoYW5nZWRKb2JzID0gbmV3IEFycmF5TGlzdDxJUEpvYkNvbnRyb2w+KCk7Ci0JCQkJCQltYXAucHV0KHF1ZXVlLCBjaGFuZ2VkSm9icyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlZEpvYnMuYWRkKGpvYik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUFRQQ29yZVBsdWdpbi5sb2coIkpvYkNoYW5nZTogdW5rbm93biBub2RlICIgKyBlbGVtZW50SWQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlmb3IgKE1hcC5FbnRyeTxJUFF1ZXVlQ29udHJvbCwgTGlzdDxJUEpvYkNvbnRyb2w+PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJZG9VcGRhdGVKb2JzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBhdHRycyk7Ci0JCQl9Ci0JCQkKLQkJCW1hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IGUpIHsKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZU1nciA9IGUuZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJTGlzdDxJUE1hY2hpbmVDb250cm9sPiBtYWNoaW5lcyA9IG5ldyBBcnJheUxpc3Q8SVBNYWNoaW5lQ29udHJvbD4oKTsKLQotCQlmb3IgKE1hcC5FbnRyeTxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4gZW50cnkgOiBlTWdyLmdldEVudHJ5U2V0KCkpIHsKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUmFuZ2VTZXQgbWFjaGluZUlkcyA9IGVudHJ5LmdldEtleSgpOwotCQkJCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50SWQgOiBtYWNoaW5lSWRzKSB7Ci0JCQkJSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lID0gZ2V0TWFjaGluZUNvbnRyb2woZWxlbWVudElkKTsKLQkJCQlpZiAobWFjaGluZSAhPSBudWxsKSB7Ci0JCQkJCW1hY2hpbmVzLmFkZChtYWNoaW5lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1hY2hpbmVDaGFuZ2U6IHVua25vd24gbWFjaGluZSAiICsgZWxlbWVudElkKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJZG9VcGRhdGVNYWNoaW5lcyhtYWNoaW5lcywgYXR0cnMpOwotCQkJbWFjaGluZXMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUVycm9yRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVNZXNzYWdlRXZlbnQgZSkgewotCQkvL01lc3NhZ2VBdHRyaWJ1dGVzLkxldmVsIGxldmVsID0gZS5nZXRMZXZlbCgpOwotCQkvLyBGSVhNRTogaW1wbGVtZW50IGxvZ2dpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOZXdKb2JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZU5ld0pvYkV2ZW50IGUpIHsKLQkJSVBRdWV1ZUNvbnRyb2wgcXVldWUgPSBnZXRRdWV1ZUNvbnRyb2woZS5nZXRQYXJlbnRJZCgpKTsKLQkJCi0JCWlmIChxdWV1ZSAhPSBudWxsKSB7Ci0JCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBtZ3IgPSBlLmdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCi0JCQlmb3IgKE1hcC5FbnRyeTxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4gZW50cnkgOiBtZ3IuZ2V0RW50cnlTZXQoKSkgewotCQkJCUF0dHJpYnV0ZU1hbmFnZXIgam9iQXR0cnMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQotCQkJCVJhbmdlU2V0IGpvYklkcyA9IGVudHJ5LmdldEtleSgpOwotCQkJCUxpc3Q8SVBKb2JDb250cm9sPiBuZXdKb2JzID0gbmV3IEFycmF5TGlzdDxJUEpvYkNvbnRyb2w+KGpvYklkcy5zaXplKCkpOwotCQotCQkJCWZvciAoU3RyaW5nIGVsZW1lbnRJZCA6IGpvYklkcykgewotCQkJCQlJUEpvYkNvbnRyb2wgam9iID0gZ2V0Sm9iQ29udHJvbChlbGVtZW50SWQpOwotCQkJCQlpZiAoam9iID09IG51bGwpIHsKLQkJCQkJCWpvYiA9IGRvQ3JlYXRlSm9iKHF1ZXVlLCBlbGVtZW50SWQsIGpvYkF0dHJzKTsKLQkJCQkJCW5ld0pvYnMuYWRkKGpvYik7Ci0JCQkJCQkKLQkJCQkJCVN0cmluZ0F0dHJpYnV0ZSBqb2JTdWJBdHRyID0gCi0JCQkJCQkJKFN0cmluZ0F0dHJpYnV0ZSkgam9iQXR0cnMuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0U3ViSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJCQkJaWYgKGpvYlN1YkF0dHIgIT0gbnVsbCkgewotCQkJCQkJCS8qCi0JCQkJCQkJICogTm90aWZ5IGFueSBzdWJtaXRKb2IoKSBjYWxscyB0aGF0IHRoZSBqb2IgaGFzIGJlZW4gY3JlYXRlZAotCQkJCQkJCSAqLwotCQkJCQkJCUpvYlN1Ym1pc3Npb24gc3ViID0gam9iU3VibWlzc2lvbnMucmVtb3ZlKGpvYlN1YkF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJaWYgKHN1YiAhPSBudWxsKSB7Ci0JCQkJCQkJCXN1Yi5zZXRKb2Ioam9iKTsKLQkJCQkJCQkJam9iLnNldExhdW5jaENvbmZpZ3VyYXRpb24oc3ViLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQkJCXN1Yi5zZXRTdGF0ZShKb2JTdWJTdGF0ZS5DT01QTEVURUQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkgCX0KLQkJCQl9Ci0JCQkJCi0JCQkJYWRkSm9icyhxdWV1ZSwgbmV3Sm9icyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlQVFBDb3JlUGx1Z2luLmxvZygiSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50OiB1bmtub3duIHF1ZXVlIElEICIgKyBlLmdldFBhcmVudElkKCkpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld01hY2hpbmVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IGUuZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQotCQlmb3IgKE1hcC5FbnRyeTxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4gZW50cnkgOiBtZ3IuZ2V0RW50cnlTZXQoKSkgewotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlSYW5nZVNldCBtYWNoaW5lSWRzID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlMaXN0PElQTWFjaGluZUNvbnRyb2w+IG5ld01hY2hpbmVzID0gbmV3IEFycmF5TGlzdDxJUE1hY2hpbmVDb250cm9sPihtYWNoaW5lSWRzLnNpemUoKSk7Ci0KLQkJCWZvciAoU3RyaW5nIGVsZW1lbnRJZCA6IG1hY2hpbmVJZHMpIHsKLQkJCQlJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUgPSBnZXRNYWNoaW5lQ29udHJvbChlbGVtZW50SWQpOwotCQkJCWlmIChtYWNoaW5lID09IG51bGwpIHsKLQkJCQkJbWFjaGluZSA9IGRvQ3JlYXRlTWFjaGluZShlbGVtZW50SWQsIGF0dHJzKTsKLQkJCQkJbmV3TWFjaGluZXMuYWRkKG1hY2hpbmUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJYWRkTWFjaGluZXMobmV3TWFjaGluZXMpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld05vZGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZU5ld05vZGVFdmVudCBlKSB7Ci0JCUlQTWFjaGluZUNvbnRyb2wgbWFjaGluZSA9IGdldE1hY2hpbmVDb250cm9sKGUuZ2V0UGFyZW50SWQoKSk7Ci0JCQotCQlpZiAobWFjaGluZSAhPSBudWxsKSB7Ci0JCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBtZ3IgPSBlLmdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCi0JCQlmb3IgKE1hcC5FbnRyeTxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4gZW50cnkgOiBtZ3IuZ2V0RW50cnlTZXQoKSkgewotCQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCVJhbmdlU2V0IG5vZGVJZHMgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlMaXN0PElQTm9kZUNvbnRyb2w+IG5ld05vZGVzID0gbmV3IEFycmF5TGlzdDxJUE5vZGVDb250cm9sPihub2RlSWRzLnNpemUoKSk7Ci0JCi0JCQkJZm9yIChTdHJpbmcgZWxlbWVudElkIDogbm9kZUlkcykgewotCQkJCQlJUE5vZGVDb250cm9sIG5vZGUgPSBnZXROb2RlQ29udHJvbChlbGVtZW50SWQpOwotCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlub2RlID0gZG9DcmVhdGVOb2RlKG1hY2hpbmUsIGVsZW1lbnRJZCwgYXR0cnMpOwotCQkJCQkJbmV3Tm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWFkZE5vZGVzKG1hY2hpbmUsIG5ld05vZGVzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVBUUENvcmVQbHVnaW4ubG9nKCJJUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQ6IHVua25vd24gbWFjaGluZSBJRCAiICsgZS5nZXRQYXJlbnRJZCgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld1Byb2Nlc3NFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZU5ld1Byb2Nlc3NFdmVudCBlKSB7Ci0JCUlQSm9iQ29udHJvbCBqb2IgPSBnZXRKb2JDb250cm9sKGUuZ2V0UGFyZW50SWQoKSk7Ci0JCQotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IGUuZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkKLQkJCWZvciAoTWFwLkVudHJ5PFJhbmdlU2V0LCBBdHRyaWJ1dGVNYW5hZ2VyPiBlbnRyeSA6IG1nci5nZXRFbnRyeVNldCgpKSB7Ci0JCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJUmFuZ2VTZXQgcHJvY2Vzc0lkcyA9IGVudHJ5LmdldEtleSgpOwotCQkJCUxpc3Q8SVBQcm9jZXNzQ29udHJvbD4gbmV3UHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxJUFByb2Nlc3NDb250cm9sPihwcm9jZXNzSWRzLnNpemUoKSk7Ci0JCi0JCQkJZm9yIChTdHJpbmcgZWxlbWVudElkIDogcHJvY2Vzc0lkcykgewotCQkJCQlJUFByb2Nlc3NDb250cm9sIHByb2Nlc3MgPSBnZXRQcm9jZXNzQ29udHJvbChlbGVtZW50SWQpOwotCQkJCQlpZiAocHJvY2VzcyA9PSBudWxsKSB7Ci0JCQkJCQlwcm9jZXNzID0gZG9DcmVhdGVQcm9jZXNzKGpvYiwgZWxlbWVudElkLCBhdHRycyk7Ci0JCQkJCQluZXdQcm9jZXNzZXMuYWRkKHByb2Nlc3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWFkZFByb2Nlc3Nlcyhqb2IsIG5ld1Byb2Nlc3Nlcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlQVFBDb3JlUGx1Z2luLmxvZygiSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50OiB1bmtub3duIGpvYiBJRCAiICsgZS5nZXRQYXJlbnRJZCgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld1F1ZXVlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVOZXdRdWV1ZUV2ZW50IGUpIHsKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgbWdyID0gZS5nZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQkKLQkJZm9yIChNYXAuRW50cnk8UmFuZ2VTZXQsIEF0dHJpYnV0ZU1hbmFnZXI+IGVudHJ5IDogbWdyLmdldEVudHJ5U2V0KCkpIHsKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUmFuZ2VTZXQgcXVldWVJZHMgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3Q8SVBRdWV1ZUNvbnRyb2w+IG5ld1F1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8SVBRdWV1ZUNvbnRyb2w+KHF1ZXVlSWRzLnNpemUoKSk7Ci0KLQkJCWZvciAoU3RyaW5nIGVsZW1lbnRJZCA6IHF1ZXVlSWRzKSB7Ci0JCQkJSVBRdWV1ZUNvbnRyb2wgcXVldWUgPSBnZXRRdWV1ZUNvbnRyb2woZWxlbWVudElkKTsKLQkJCQlpZiAocXVldWUgPT0gbnVsbCkgewotCQkJCQlxdWV1ZSA9IGRvQ3JlYXRlUXVldWUoZWxlbWVudElkLCBhdHRycyk7Ci0JCQkJCW5ld1F1ZXVlcy5hZGQocXVldWUpOwotCQkJCX0KLQkJCX0KLQotCQkJYWRkUXVldWVzKG5ld1F1ZXVlcyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlTWdyID0gZS5nZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQlNYXA8SVBNYWNoaW5lQ29udHJvbCwgTGlzdDxJUE5vZGVDb250cm9sPj4gbWFwID0gCi0JCQluZXcgSGFzaE1hcDxJUE1hY2hpbmVDb250cm9sLCBMaXN0PElQTm9kZUNvbnRyb2w+PigpOwotCQkKLQkJZm9yIChNYXAuRW50cnk8UmFuZ2VTZXQsIEF0dHJpYnV0ZU1hbmFnZXI+IG1nckVudHJ5IDogZU1nci5nZXRFbnRyeVNldCgpKSB7Ci0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzID0gbWdyRW50cnkuZ2V0VmFsdWUoKTsKLQkJCVJhbmdlU2V0IG5vZGVJZHMgPSBtZ3JFbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3Q8SVBOb2RlQ29udHJvbD4gY2hhbmdlZE5vZGVzOwotCQkJCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50SWQgOiBub2RlSWRzKSB7Ci0JCQkJSVBOb2RlQ29udHJvbCBub2RlID0gZ2V0Tm9kZUNvbnRyb2woZWxlbWVudElkKTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCUlQTWFjaGluZUNvbnRyb2wgbWFjaGluZSA9IG5vZGUuZ2V0TWFjaGluZUNvbnRyb2woKTsKLQkJCQkJY2hhbmdlZE5vZGVzID0gbWFwLmdldChtYWNoaW5lKTsKLQkJCQkJaWYgKGNoYW5nZWROb2RlcyA9PSBudWxsKSB7Ci0JCQkJCQljaGFuZ2VkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PElQTm9kZUNvbnRyb2w+KCk7Ci0JCQkJCQltYXAucHV0KG1hY2hpbmUsIGNoYW5nZWROb2Rlcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlZE5vZGVzLmFkZChub2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlQVFBDb3JlUGx1Z2luLmxvZygiTm9kZUNoYW5nZTogdW5rbm93biBub2RlICIgKyBlbGVtZW50SWQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlmb3IgKE1hcC5FbnRyeTxJUE1hY2hpbmVDb250cm9sLCBMaXN0PElQTm9kZUNvbnRyb2w+PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJZG9VcGRhdGVOb2RlcyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgYXR0cnMpOwotCQkJfQotCQkJCi0JCQltYXAuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgZSkgewotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlTWdyID0gZS5nZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQlNYXA8SVBKb2JDb250cm9sLCBMaXN0PElQUHJvY2Vzc0NvbnRyb2w+PiBtYXAgPSAKLQkJCW5ldyBIYXNoTWFwPElQSm9iQ29udHJvbCwgTGlzdDxJUFByb2Nlc3NDb250cm9sPj4oKTsKLQotCQlmb3IgKE1hcC5FbnRyeTxSYW5nZVNldCwgQXR0cmlidXRlTWFuYWdlcj4gbWdyRW50cnkgOiBlTWdyLmdldEVudHJ5U2V0KCkpIHsKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMgPSBtZ3JFbnRyeS5nZXRWYWx1ZSgpOwotCQkJUmFuZ2VTZXQgcHJvY2Vzc0lkcyA9IG1nckVudHJ5LmdldEtleSgpOwotCQkJTGlzdDxJUFByb2Nlc3NDb250cm9sPiBjaGFuZ2VkUHJvY2Vzc2VzOwotCQkJCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50SWQgOiBwcm9jZXNzSWRzKSB7Ci0JCQkJSVBQcm9jZXNzQ29udHJvbCBwcm9jZXNzID0gZ2V0UHJvY2Vzc0NvbnRyb2woZWxlbWVudElkKTsKLQkJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCUlQSm9iQ29udHJvbCBqb2IgPSBwcm9jZXNzLmdldEpvYkNvbnRyb2woKTsKLQkJCQkJY2hhbmdlZFByb2Nlc3NlcyA9IG1hcC5nZXQoam9iKTsKLQkJCQkJaWYgKGNoYW5nZWRQcm9jZXNzZXMgPT0gbnVsbCkgewotCQkJCQkJY2hhbmdlZFByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SVBQcm9jZXNzQ29udHJvbD4oKTsKLQkJCQkJCW1hcC5wdXQoam9iLCBjaGFuZ2VkUHJvY2Vzc2VzKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VkUHJvY2Vzc2VzLmFkZChwcm9jZXNzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlQVFBDb3JlUGx1Z2luLmxvZygiUHJvY2Vzc0NoYW5nZTogdW5rbm93biBwcm9jZXNzICIgKyBlbGVtZW50SWQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKE1hcC5FbnRyeTxJUEpvYkNvbnRyb2wsIExpc3Q8SVBQcm9jZXNzQ29udHJvbD4+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlkb1VwZGF0ZVByb2Nlc3NlcyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgYXR0cnMpOwotCQkJfQotCQkJCi0JCQltYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50IGUpIHsKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZU1nciA9IGUuZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJTGlzdDxJUFF1ZXVlQ29udHJvbD4gcXVldWVzID0gbmV3IEFycmF5TGlzdDxJUFF1ZXVlQ29udHJvbD4oKTsKLQkJCi0JCWZvciAoTWFwLkVudHJ5PFJhbmdlU2V0LCBBdHRyaWJ1dGVNYW5hZ2VyPiBlbnRyeSA6IGVNZ3IuZ2V0RW50cnlTZXQoKSkgewotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlSYW5nZVNldCBxdWV1ZUlkcyA9IGVudHJ5LmdldEtleSgpOwotCQkJCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50SWQgOiBxdWV1ZUlkcykgewotCQkJCUlQUXVldWVDb250cm9sIHF1ZXVlID0gZ2V0UXVldWVDb250cm9sKGVsZW1lbnRJZCk7Ci0JCQkJaWYgKHF1ZXVlICE9IG51bGwpIHsKLQkJCQkJcXVldWVzLmFkZChxdWV1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUFRQQ29yZVBsdWdpbi5sb2coIlF1ZXVlQ2hhbmdlOiB1bmtub3duIHF1ZXVlICIgKyBlbGVtZW50SWQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZG9VcGRhdGVRdWV1ZXMocXVldWVzLCBhdHRycyk7Ci0JCQlxdWV1ZXMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZUFsbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lUmVtb3ZlQWxsRXZlbnQgZSkgewotCQljbGVhblVwKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlSm9iRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVSZW1vdmVKb2JFdmVudCBlKSB7Ci0JCU1hcDxJUFF1ZXVlQ29udHJvbCwgTGlzdDxJUEpvYkNvbnRyb2w+PiBtYXAgPSAKLQkJCW5ldyBIYXNoTWFwPElQUXVldWVDb250cm9sLCBMaXN0PElQSm9iQ29udHJvbD4+KCk7Ci0KLQkJZm9yIChTdHJpbmcgZWxlbWVudElkIDogZS5nZXRFbGVtZW50SWRzKCkpIHsKLQkJCUlQSm9iQ29udHJvbCBqb2IgPSBnZXRKb2JDb250cm9sKGVsZW1lbnRJZCk7Ci0JCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCQlJUFF1ZXVlQ29udHJvbCBxdWV1ZSA9IGpvYi5nZXRRdWV1ZUNvbnRyb2woKTsKLQkJCQlMaXN0PElQSm9iQ29udHJvbD4gam9icyA9IG1hcC5nZXQocXVldWUpOwotCQkJCWlmIChqb2JzID09IG51bGwpIHsKLQkJCQkJam9icyA9IG5ldyBBcnJheUxpc3Q8SVBKb2JDb250cm9sPigpOwotCQkJCQltYXAucHV0KHF1ZXVlLCBqb2JzKTsKLQkJCQl9Ci0JCQkJam9icy5hZGQoam9iKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChNYXAuRW50cnk8SVBRdWV1ZUNvbnRyb2wsIExpc3Q8SVBKb2JDb250cm9sPj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewotCQkJcmVtb3ZlSm9icyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgZSkgewotCQlNYXA8SVJlc291cmNlTWFuYWdlciwgTGlzdDxJUE1hY2hpbmVDb250cm9sPj4gbWFwID0gCi0JCQluZXcgSGFzaE1hcDxJUmVzb3VyY2VNYW5hZ2VyLCBMaXN0PElQTWFjaGluZUNvbnRyb2w+PigpOwotCi0JCWZvciAoU3RyaW5nIGVsZW1lbnRJZCA6IGUuZ2V0RWxlbWVudElkcygpKSB7Ci0JCQlJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUgPSBnZXRNYWNoaW5lQ29udHJvbChlbGVtZW50SWQpOwotCQkJaWYgKG1hY2hpbmUgIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0gPSBtYWNoaW5lLmdldFJlc291cmNlTWFuYWdlcigpOwotCQkJCUxpc3Q8SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZXMgPSBtYXAuZ2V0KHJtKTsKLQkJCQlpZiAobWFjaGluZXMgPT0gbnVsbCkgewotCQkJCQltYWNoaW5lcyA9IG5ldyBBcnJheUxpc3Q8SVBNYWNoaW5lQ29udHJvbD4oKTsKLQkJCQkJbWFwLnB1dChybSwgbWFjaGluZXMpOwotCQkJCX0KLQkJCQltYWNoaW5lcy5hZGQobWFjaGluZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoTWFwLkVudHJ5PElSZXNvdXJjZU1hbmFnZXIsIExpc3Q8SVBNYWNoaW5lQ29udHJvbD4+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKLQkJCXJlbW92ZU1hY2hpbmVzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZU5vZGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZVJlbW92ZU5vZGVFdmVudCBlKSB7Ci0JCU1hcDxJUE1hY2hpbmVDb250cm9sLCBMaXN0PElQTm9kZUNvbnRyb2w+PiBtYXAgPSAKLQkJCW5ldyBIYXNoTWFwPElQTWFjaGluZUNvbnRyb2wsIExpc3Q8SVBOb2RlQ29udHJvbD4+KCk7Ci0JCQotCQlmb3IgKFN0cmluZyBlbGVtZW50SWQgOiBlLmdldEVsZW1lbnRJZHMoKSkgewotCQkJSVBOb2RlQ29udHJvbCBub2RlID0gZ2V0Tm9kZUNvbnRyb2woZWxlbWVudElkKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUgPSBub2RlLmdldE1hY2hpbmVDb250cm9sKCk7Ci0JCQkJTGlzdDxJUE5vZGVDb250cm9sPiBub2RlcyA9IG1hcC5nZXQobWFjaGluZSk7Ci0JCQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCQkJbm9kZXMgPSBuZXcgQXJyYXlMaXN0PElQTm9kZUNvbnRyb2w+KCk7Ci0JCQkJCW1hcC5wdXQobWFjaGluZSwgbm9kZXMpOwotCQkJCX0KLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoTWFwLkVudHJ5PElQTWFjaGluZUNvbnRyb2wsIExpc3Q8SVBOb2RlQ29udHJvbD4+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKLQkJCXJlbW92ZU5vZGVzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCBlKSB7Ci0JCU1hcDxJUEpvYkNvbnRyb2wsIExpc3Q8SVBQcm9jZXNzQ29udHJvbD4+IG1hcCA9IAotCQkJbmV3IEhhc2hNYXA8SVBKb2JDb250cm9sLCBMaXN0PElQUHJvY2Vzc0NvbnRyb2w+PigpOwotCi0JCWZvciAoU3RyaW5nIGVsZW1lbnRJZCA6IGUuZ2V0RWxlbWVudElkcygpKSB7Ci0JCQlJUFByb2Nlc3NDb250cm9sIHByb2Nlc3MgPSBnZXRQcm9jZXNzQ29udHJvbChlbGVtZW50SWQpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCUlQSm9iQ29udHJvbCBqb2IgPSBwcm9jZXNzLmdldEpvYkNvbnRyb2woKTsKLQkJCQlMaXN0PElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3NlcyA9IG1hcC5nZXQoam9iKTsKLQkJCQlpZiAocHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCQkJcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxJUFByb2Nlc3NDb250cm9sPigpOwotCQkJCQltYXAucHV0KGpvYiwgcHJvY2Vzc2VzKTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VzLmFkZChwcm9jZXNzKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoTWFwLkVudHJ5PElQSm9iQ29udHJvbCwgTGlzdDxJUFByb2Nlc3NDb250cm9sPj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewotCQkJcmVtb3ZlUHJvY2Vzc2VzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50IGUpIHsKLQkJTWFwPElSZXNvdXJjZU1hbmFnZXIsIExpc3Q8SVBRdWV1ZUNvbnRyb2w+PiBtYXAgPSAKLQkJCW5ldyBIYXNoTWFwPElSZXNvdXJjZU1hbmFnZXIsIExpc3Q8SVBRdWV1ZUNvbnRyb2w+PigpOwotCi0JCWZvciAoU3RyaW5nIGVsZW1lbnRJZCA6IGUuZ2V0RWxlbWVudElkcygpKSB7Ci0JCQlJUFF1ZXVlQ29udHJvbCBxdWV1ZSA9IGdldFF1ZXVlQ29udHJvbChlbGVtZW50SWQpOwotCQkJaWYgKHF1ZXVlICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gcXVldWUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJTGlzdDxJUFF1ZXVlQ29udHJvbD4gcXVldWVzID0gbWFwLmdldChybSk7Ci0JCQkJaWYgKHF1ZXVlcyA9PSBudWxsKSB7Ci0JCQkJCXF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8SVBRdWV1ZUNvbnRyb2w+KCk7Ci0JCQkJCW1hcC5wdXQocm0sIHF1ZXVlcyk7Ci0JCQkJfQotCQkJCXF1ZXVlcy5hZGQocXVldWUpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKE1hcC5FbnRyeTxJUmVzb3VyY2VNYW5hZ2VyLCBMaXN0PElQUXVldWVDb250cm9sPj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewotCQkJcmVtb3ZlUXVldWVzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQgZSkgewotCQlzdGF0ZUxvY2subG9jaygpOwotCQl0cnkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFJNU3RhdGUuU1RBUlRJTkcpIHsKLSAgICAgICAgICAgICAJc3RhdGUgPSBSTVN0YXRlLlNUQVJURUQ7Ci0JCQkJc3RhdGVDb25kaXRpb24uc2lnbmFsQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAlzdGF0ZUxvY2sudW5sb2NrKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQgZSkgewotCQlzdGF0ZUxvY2subG9jaygpOwotCQl0cnkgewotCQkJUk1TdGF0ZSBvbGRTdGF0ZSA9IHN0YXRlOwotCQkJc3RhdGUgPSBSTVN0YXRlLlNUT1BQRUQ7Ci0JCQlpZiAob2xkU3RhdGUgPT0gUk1TdGF0ZS5TVE9QUElORykgewotCQkJCXN0YXRlQ29uZGl0aW9uLnNpZ25hbEFsbCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIFRoaXMgZXZlbnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBydW50aW1lIHN5c3RlbS4gTGV0IHVwcGVyIGxldmVscyBrbm93Ci0JCQkJICogdGhhdCB0aGUgUk0gaGFzIHNodXQgZG93bi4KLQkJCQkgKi8KLQkJCQlzZXRTdGF0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUT1BQRUQpOwotCQkJCWNsZWFuVXAoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN0YXRlTG9jay51bmxvY2soKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgZSkgewotCQkvKgotCQkgKiBDaGVjayBmb3IgZXJyb3JzIHdoaWxlIHN0YXJ0aW5nLgotCQkgKi8KLQkJc3RhdGVMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCWlmIChzdGF0ZSA9PSBSTVN0YXRlLlNUQVJUSU5HKSB7Ci0JCQkJc3RhdGUgPSBSTVN0YXRlLkVSUk9SOwotCQkJCWVycm9yTWVzc2FnZSA9IGUuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJc3RhdGVDb25kaXRpb24uc2lnbmFsQWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3RhdGVMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgZSkgewotCQlpZiAoZS5nZXRKb2JTdWJJRCgpICE9IG51bGwpIHsKLQkJCUpvYlN1Ym1pc3Npb24gc3ViID0gam9iU3VibWlzc2lvbnMucmVtb3ZlKGUuZ2V0Sm9iU3ViSUQoKSk7Ci0JCQlpZiAoc3ViICE9IG51bGwpIHsKLQkJCQlzdWIuc2V0RXJyb3IoZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVN1Ym1pdEpvYkVycm9yKGUuZ2V0Sm9iU3ViSUQoKSwgZS5nZXRFcnJvck1lc3NhZ2UoKSk7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IGUpIHsKLQkJSVBKb2Igam9iID0gdGhpcy5nZXRKb2JDb250cm9sKGUuZ2V0Sm9iSUQoKSk7Ci0JCVN0cmluZyBuYW1lID0gZS5nZXRKb2JJRCgpOwotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCW5hbWUgPSBqb2IuZ2V0TmFtZSgpOwotCQl9Ci0JCWZpcmVFcnJvcigiRXJyb3Igd2hpbGUgdGVybWluYXRpbmcgam9iIFwiIiArIG5hbWUgKyAiXCI6ICIgKyBlLmdldEVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgUlRTIGNvbm5lY3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsb3NlQ29ubmVjdGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXJ1bnRpbWVTeXN0ZW0uc2h1dGRvd24obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETzogU2hvdWxkIHByb2JhYmx5IHRocm93IHNvbWV0aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9BZnRlck9wZW5Db25uZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0JlZm9yZUNsb3NlQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyI2RvQ2xlYW5VcCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9DbGVhblVwKCkgewotCQlzdGF0ZSA9IFJNU3RhdGUuU1RPUFBFRDsKLQl9Ci0JCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBqb2IuCi0JICoKLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcGFyYW0gam9iSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElQSm9iQ29udHJvbCBkb0NyZWF0ZUpvYihJUFF1ZXVlQ29udHJvbCBxdWV1ZSwgU3RyaW5nIGpvYklkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIFRlbXBsYXRlIHBhdHRlcm4gbWV0aG9kIHRvIGFjdHVhbGx5IGNyZWF0ZSB0aGUgbWFjaGluZS4KLQkgKgotCSAqIEBwYXJhbSBtYWNoaW5lSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElQTWFjaGluZUNvbnRyb2wgZG9DcmVhdGVNYWNoaW5lKFN0cmluZyBtYWNoaW5lSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBub2RlLgotCSAqCi0JICogQHBhcmFtIG1hY2hpbmUKLQkgKiBAcGFyYW0gbm9kZUlkCi0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBJUE5vZGVDb250cm9sIGRvQ3JlYXRlTm9kZShJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIFN0cmluZyBub2RlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBwcm9jZXNzLgotCSAqCi0JICogQHBhcmFtIGpvYgotCSAqIEBwYXJhbSBwcm9jZXNzSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElQUHJvY2Vzc0NvbnRyb2wgZG9DcmVhdGVQcm9jZXNzKElQSm9iQ29udHJvbCBqb2IsIFN0cmluZyBwcm9jZXNzSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBxdWV1ZS4KLQkgKgotCSAqIEBwYXJhbSBxdWV1ZUlkCi0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBJUFF1ZXVlQ29udHJvbCBkb0NyZWF0ZVF1ZXVlKFN0cmluZyBxdWV1ZUlkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBydW50aW1lIHN5c3RlbQotCSAqIEByZXR1cm4gdGhlIG5ldyBydW50aW1lIHN5c3RlbQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBUT0RPCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElSdW50aW1lU3lzdGVtIGRvQ3JlYXRlUnVudGltZVN5c3RlbSgpCi0JdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIjZG9EaXNhYmxlRXZlbnRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0Rpc2FibGVFdmVudHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyI2RvRGlzcG9zZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIjZG9FbmFibGVFdmVudHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRW5hYmxlRXZlbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXByb3RlY3RlZCBMaXN0PElQSm9iQ29udHJvbD4gZG9SZW1vdmVUZXJtaW5hdGVkSm9icyhJUFF1ZXVlQ29udHJvbCBxdWV1ZSkgewotCQlMaXN0PElQSm9iQ29udHJvbD4gdGVybWluYXRlZEpvYnMgPSBuZXcgQXJyYXlMaXN0PElQSm9iQ29udHJvbD4oKTsKLQkJCi0JCWlmIChxdWV1ZSAhPSBudWxsKSB7Ci0JCQlmb3IgKElQSm9iQ29udHJvbCBqb2IgOiBxdWV1ZS5nZXRKb2JDb250cm9scygpKSB7Ci0JCQkJaWYgKGpvYi5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJCQl0ZXJtaW5hdGVkSm9icy5hZGQoam9iKTsKLQkJCQl9Ci0JCQl9Ci0JCQlxdWV1ZS5yZW1vdmVKb2JzKHRlcm1pbmF0ZWRKb2JzKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRlcm1pbmF0ZWRKb2JzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlciNkb1NodXRkb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NodXRkb3duKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCi0JCXN0YXRlID0gUk1TdGF0ZS5TVE9QUElORzsKLQotCQlkb0JlZm9yZUNsb3NlQ29ubmVjdGlvbigpOwotCQljbG9zZUNvbm5lY3Rpb24obW9uaXRvcik7Ci0KLQkJc3RhdGVMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCXdoaWxlIChzdGF0ZSAhPSBSTVN0YXRlLlNUT1BQRUQgJiYgc3RhdGUgIT0gUk1TdGF0ZS5FUlJPUikgewotCQkJCXRyeSB7Ci0JCQkJCXN0YXRlQ29uZGl0aW9uLmF3YWl0KDUwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3RhdGVMb2NrLnVubG9jaygpOwotCQl9Ci0JCQotCQlkb0FmdGVyQ2xvc2VDb25uZWN0aW9uKCk7Ci0JCXJ1bnRpbWVTeXN0ZW0ucmVtb3ZlUnVudGltZUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIjZG9TdGFydHVwKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRvU3RhcnR1cChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJCi0JCWlmIChzdGF0ZSAhPSBSTVN0YXRlLlNUT1BQRUQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJbW9uaXRvci5iZWdpblRhc2soIlJ1bnRpbWUgcmVzb3VyY2UgbWFuYWdlciBzdGFydHVwIiwgMTApOyAvLyROT04tTkxTLTEkCi0JCWRvQmVmb3JlT3BlbkNvbm5lY3Rpb24oKTsKLQkJbW9uaXRvci5zdWJUYXNrKCJDcmVhdGluZyBydW50aW1lIHN5c3RlbSIpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVTeXN0ZW0gPSBkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKTsKLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCXJ1bnRpbWVTeXN0ZW0uYWRkUnVudGltZUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCW1vbml0b3Iud29ya2VkKDIpOwotCQltb25pdG9yLnN1YlRhc2soIlN0YXJ0aW5nIHJ1bnRpbWUgc3lzdGVtIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXN0YXRlID0gUk1TdGF0ZS5TVEFSVElORzsKLQkJCQkKLQkJdHJ5IHsKLQkJCXJ1bnRpbWVTeXN0ZW0uc3RhcnR1cChtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0ZSA9IFJNU3RhdGUuRVJST1I7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCQotCQltb25pdG9yLndvcmtlZCg3KTsKLQkJCi0JCS8qCi0JCSAqIFdhaXQgdW50aWwgc3RhdGUgY2hhbmdlcyBvciB0aGUgbW9uaXRvciBpcyBjYW5jZWxlZAotCQkgKi8KLQkJc3RhdGVMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCXdoaWxlICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgc3RhdGUgIT0gUk1TdGF0ZS5TVEFSVEVEICYmIHN0YXRlICE9IFJNU3RhdGUuRVJST1IpIHsKLQkJCQl0cnkgewotCQkJCQlzdGF0ZUNvbmRpdGlvbi5hd2FpdCg1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBFeHBlY3QgdG8gYmUgaW50ZXJydXB0ZWQgaWYgbW9uaXRvciBpcyBjYW5jZWxlZAotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN0YXRlTG9jay51bmxvY2soKTsKLQkJfQkJCi0JCQotCQlpZiAoc3RhdGUgPT0gUk1TdGF0ZS5FUlJPUikgewotCQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlPSAiRmF0YWwgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHJ1bnRpbWUgc3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAKLQkJCQkJUFRQQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGVycm9yTWVzc2FnZSkpOwotCQl9Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXN0YXRlID0gUk1TdGF0ZS5TVE9QUEVEOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotICAgICAgIAl0cnkgewotCQkJcnVudGltZVN5c3RlbS5zdGFydEV2ZW50cygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIGZpcmVFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQotCQlkb0FmdGVyT3BlbkNvbm5lY3Rpb24oKTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIjZG9TdWJtaXRKb2IoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVBKb2IgZG9TdWJtaXRKb2IoU3RyaW5nIHN1YklkLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCAKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSAKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJCi0JCUlQSm9iIGpvYiA9IG51bGw7Ci0JCi0JCXRyeSB7Ci0JCQlKb2JTdWJtaXNzaW9uIHN1YiA9IG5ldyBKb2JTdWJtaXNzaW9uKHN1YklkKTsKLQkJCXN1Yi5zZXRMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotCQkJam9iU3VibWlzc2lvbnMucHV0KHN1YklkLCBzdWIpOwotCQkJCi0JCQlydW50aW1lU3lzdGVtLnN1Ym1pdEpvYihzdWJJZCwgYXR0ck1ncik7Ci0JCQkKLQkJCS8qCi0JCQkgKiBJZiBzdWJJZCBpcyBudWxsIHRoZW4gZG9uJ3Qgd2FpdCBmb3IgdGhlIHN1Ym1pc3Npb24gdG8gY29tcGxldGUuCi0JCQkgKi8KLQkJCWlmIChzdWJJZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGpvYjsKLQkJCX0KLQkJCi0JCQlKb2JTdWJTdGF0ZSBzdGF0ZSA9IHN1Yi53YWl0Rm9yKG1vbml0b3IpOwotCQkJCi0JCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIFNVQk1JVFRFRDoKLQkJCQkvKgotCQkJCSAqIFRoZSBqb2Igc3VibWlzc2lvbiBwcm9jZXNzIGl0c2VsZiBjYW4ndCBiZSBjYW5jZWxlZCwgc28KLQkJCQkgKiB0aGlzIHdpbGwganVzdCBjYXVzZSB0aGUgc3VibWl0Sm9iIGNvbW1hbmQgdG8gcmV0dXJuIGEgbnVsbC4KLQkJCQkgKiBUaGUgam9iIHdpbGwgc3RpbGwgZXZlbnR1YWxseSBnZXQgY3JlYXRlZC4KLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgQ09NUExFVEVEOgotCQkJCWpvYiA9IHN1Yi5nZXRKb2IoKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgRVJST1I6Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAKLQkJCQkJCVBUUENvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCAKLQkJCQkJCXN1Yi5nZXRFcnJvclJlYXNvbigpLCBudWxsKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIjZG9UZXJtaW5hdGVKb2Iob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9UZXJtaW5hdGVKb2IoSVBKb2Igam9iKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bnRpbWVTeXN0ZW0udGVybWluYXRlSm9iKGpvYik7Ci0JfQotCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gYWN0dWFsbHkgdXBkYXRlIHRoZSBqb2JzLgotCSAqIAotCSAqIEBwYXJhbSBqb2IKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiBAcmV0dXJuIGNoYW5nZXMgd2VyZSBtYWRlCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVKb2JzKElQUXVldWVDb250cm9sIHF1ZXVlLAotCQkJQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYnMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gYWN0dWFsbHkgdXBkYXRlIHRoZSBtYWNoaW5lcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFjaGluZQotCSAqIEBwYXJhbSBhdHRycwotCSAqIEByZXR1cm4gY2hhbmdlcyB3ZXJlIG1hZGUKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZU1hY2hpbmVzKENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogVGVtcGxhdGUgcGF0dGVybiBtZXRob2QgdG8gdXBkYXRlIGEgY29sbGVjdGlvbiBvZiBub2Rlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFjaGluZSBwYXJlbnQgbWFjaGluZQotCSAqIEBwYXJhbSBub2RlcyBjb2xsZWN0aW9uIG9mIG5vZGVzIHRvIHVwZGF0ZQotCSAqIEBwYXJhbSBhdHRycyBuZXcvY2hhbmdlZCBhdHRpYnV0ZXMgZm9yIGVhY2ggbm9kZSBpbiB0aGUgY29sbGVjdGlvbgotCSAqIEByZXR1cm4gY2hhbmdlcyB3ZXJlIG1hZGUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBkb1VwZGF0ZU5vZGVzKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSwgCi0JCQlDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIFRlbXBsYXRlIHBhdHRlcm4gbWV0aG9kIHRvIGFjdHVhbGx5IHVwZGF0ZSB0aGUgcHJvY2Vzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBqb2IgcGFyZW50IGpvYgotCSAqIEBwYXJhbSBwcm9jZXNzZXMgY29sbGVjdGlvbiBvZiBwcm9jZXNzZXMgdG8gdXBkYXRlCi0JICogQHBhcmFtIGF0dHJzIG5ldy9jaGFuZ2VkIGF0dGlidXRlcyBmb3IgZWFjaCBub2RlIGluIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBjaGFuZ2VzIHdlcmUgbWFkZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGRvVXBkYXRlUHJvY2Vzc2VzKElQSm9iQ29udHJvbCBqb2IsCi0JCQlDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3NlcywgQXR0cmlidXRlTWFuYWdlciBhdHRycyk7Ci0KLQkvKioKLQkgKiBUZW1wbGF0ZSBwYXR0ZXJuIG1ldGhvZCB0byBhY3R1YWxseSB1cGRhdGUgdGhlIHF1ZXVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiBAcmV0dXJuIGNoYW5nZXMgd2VyZSBtYWRlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZG9VcGRhdGVRdWV1ZXMoQ29sbGVjdGlvbjxJUFF1ZXVlQ29udHJvbD4gcXVldWVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWVTeXN0ZW0KLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVTeXN0ZW0gZ2V0UnVudGltZVN5c3RlbSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVTeXN0ZW07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0lSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyOGUxNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIENsb25lYWJsZSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgY29weSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIG1hbmFnZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgKgotCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU1hbmFnZXJJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlci4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBmYWN0b3J5LgotCSAqCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgcmVzb3VyY2UgbWFuYWdlcgotCSAqIAotCSAqIEByZXR1cm4gdW5pcXVlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKTsKLQotCS8qKgotCSAqIFRoZSB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gdG8gZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZUFuZERlc2MoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybXN5c3RlbS9JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0lSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDQ2NWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0lSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0KLS8qKgotICogQGF1dGhvciByc3FyZAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlTWFuYWdlckZhY3RvcnkgewotCS8qKgotCSAqIENvcHkgYSBjb25maWd1cmF0aW9uLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYSB0ZW1wb3Jhcnkgd29ya2luZyBjb3B5IG9mIGEgY29uZmlndXJhdGlvbgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiB0byBjb3B5Ci0JICogQHJldHVybiBjb3B5IG9mIHRoZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvcHlDb25maWd1cmF0aW9uKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogR2V0IHRoZSBJRCBvZiB0aGlzIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIGZhY3RvcnkgSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBmYWN0b3J5Ci0JICogCi0JICogQHJldHVybiBmYWN0b3J5IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBMb2FkIGEgcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9uIGZyb20gc2F2ZWQgc3RhdGUKLQkgKiAKLQkgKiBAcGFyYW0gbWVtZW50byBzYXZlZCBzdGF0ZSBvZiBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiByZXNvdXJjZSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gbG9hZENvbmZpZ3VyYXRpb24oSU1lbWVudG8gbWVtZW50byk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVzb3VyY2UgbWFuYWdlciB1c2luZyB0aGUgc3VwcGxpZWQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gY3JlYXRpbmcgcmVzb3VyY2UgbWFuYWdlcgotCSAqIEByZXR1cm4gcmVzb3VyY2UgbWFuYWdlciBjb250cm9sCi0JICovCi0JSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3Jtc3lzdGVtL0lSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYWI3ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm1zeXN0ZW0vSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiBUYWdnaW5nIGludGVyZmFjZSBmb3IgcmVzb3VyY2UgbWVudSBjb250cmlidXRpb25zCi0gKiBAYXV0aG9yIHJzcXJkCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9BYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0Fic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMWVjNjYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0Fic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVycm9yQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5NZXNzYWdlQXR0cmlidXRlcy5MZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVFcnJvclN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZU1lc3NhZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVOZXdKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lTmV3Tm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZU5ld1Byb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVOZXdRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZU5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lUXVldWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVBbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVNodXRkb3duU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50LklQcm94eVJ1bnRpbWVDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5ld05vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOZXdRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUXVldWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5SYW5nZVNldDsKLQotLyoKLSAqIFByb3h5QXR0cmlidXRlRGVmRXZlbnRzIGFyZSBmb3JtYXR0ZWQgYXMgZm9sbG93czoKLSAqIAotICoJRVZFTlRfSEVBREVSIE5VTV9ERUZTIEFUVFJfREVGIC4uLiBBVFRSX0RFRgotICogCi0gKgl3aGVyZToKLSAqIAotICoJRVZFTlRfSEVBREVSIGlzIHRoZSBldmVudCBtZXNzYWdlIGhlYWRlcgotICoJTlVNX0RFRlMgaXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgdG8gZm9sbG93Ci0gKglBVFRSX0RFRiBpcyBhbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvZiB0aGUgZm9ybToKLSAqIAotICoJTlVNX0FSR1MgSUQgVFlQRSBOQU1FIERFU0NSSVBUSU9OIERJU1BMQVkgREVGQVVMVCBbQURESVRJT05BTF9QQVJBTVNdCi0gKiAKLSAqCXdoZXJlOgotICogCi0gKglOVU1fQVJHUyBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24KLSAqCUlEIGlzIGEgdW5pcXVlIGRlZmluaXRpb24gSUQKLSAqCVRZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4gTGVnYWwgdHlwZXMgYXJlOgotICoJCSdCT09MRUFOJywgJ0RBVEUnLCAnRE9VQkxFJywgJ0VOVU1FUkFURUQnLCAnSU5URUdFUicsICdTVFJJTkcnLCAnQVJSQVknCi0gKglOQU1FIGlzIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAqCURFU0NSSVBUSU9OIGlzIHRoZSBsb25nIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICogIERJU1BMQVkgaXMgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBVSQotICoJREVGQVVMVCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0gKglBRERJVElPTkFMX1BBUkFNUyBhcmUgb3B0aW9uYWwgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gdGhlIGF0dHJpYnV0ZSB0eXBlOgotICoJCUJPT0xFQU4gLSBub25lCi0gKgkJREFURSAtIERBVEVfU1RZTEUgVElNRV9TVFlMRSBMT0NBTEUgW01JTiBNQVhdCi0gKgkJRE9VQkxFIC0gW01JTiBNQVhdCi0gKgkJRU5VTUVSQVRFRCAtIFZBTCAuLi4gVkFMCi0gKgkJSU5URUdFUiAtIFtNSU4gTUFYXQotICoJCVNUUklORyAtIG5vbmUKLSAqCQlBUlJBWSAtIG5vbmUKLSAqCU1JTiBpcyB0aGUgbWluaW11bSBhbGxvd2FibGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKLSAqCU1BWCBpcyB0aGUgbWF4aW11bSBhbGxvd2FibGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKLSAqCURBVEVfU1RZTEUgaXMgdGhlIGRhdGUgZm9ybWF0OiBTSE9SVCwgTUVESVVNLCBMT05HLCBvciBGVUxMCi0gKglUSU1FX1NUWUxFIGlzIHRoZSB0aW1lIGZvcm1hdDogU0hPUlQsIE1FRElVTSwgTE9ORywgb3IgRlVMTAotICoJTE9DQUxFIGlzIHRoZSBjb3VudHJ5IChzZWUgamF2YS5sYW5nLkxvY2FsKQotICoJTlVNX1ZBTFMgaXMgdGhlIG51bWJlciBvZiBlbnVtZXJhdGVkIHZhbHVlcwotICoJVkFMIGlzIHRoZSBlbnVtZXJhdGVkIHZhbHVlCi0gKiAKLSAqIFByb3h5TmV3KkV2ZW50cyBhcmUgZm9ybWF0dGVkIGFzIGZvbGxvd3M6Ci0gKiAKLSAqCUVWRU5UX0hFQURFUiBQQVJFTlRfSUQgTlVNX1JBTkdFUyBJRF9SQU5HRSBOVU1fQVRUUlMgS0VZPVZBTFVFIC4uLiBLRVk9VkFMVUUgLi4uCi0gKiAKLSAqCXdoZXJlOgotICogCi0gKglFVkVOVF9IRUFERVIgaXMgdGhlIGV2ZW50IG1lc3NhZ2UgaGVhZGVyCi0gKglQQVJFTlRfSUQgaXMgdGhlIG1vZGVsIGVsZW1lbnQgSUQgb2YgdGhlIHBhcmVudCBlbGVtZW50Ci0gKglOVU1fUkFOR0VTIGlzIHRoZSBudW1iZXIgb2YgSURfUkFOR0VzIHRvIGZvbGxvdwotICoJSURfUkFOR0UgaXMgYSByYW5nZSBvZiBtb2RlbCBlbGVtZW50IElEJ3MgaW4gUmFuZ2VTZXQgbm90YXRpb24KLSAqCU5VTV9BVFRSUyBpcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgdG8gZm9sbG93Ci0gKglLRVk9VkFMVUUgYXJlIGtleS92YWx1ZSBwYWlycywgd2hlcmUgS0VZIGlzIHRoZSBhdHRyaWJ1dGUgSUQgYW5kIFZBTFVFIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLSAqIAotICogUHJveHkqQ2hhbmdlRXZlbnRzIGFyZSBmb3JtYXR0ZWQgYXMgZm9sbG93czoKLSAqIAotICoJRVZFTlRfSEVBREVSIE5VTV9SQU5HRVMgSURfUkFOR0UgTlVNX0FUVFJTIEtFWT1WQUxVRSAuLi4gS0VZPVZBTFVFCi0gKiAKLSAqCXdoZXJlOgotICogCi0gKglFVkVOVF9IRUFERVIgaXMgdGhlIGV2ZW50IG1lc3NhZ2UgaGVhZGVyCi0gKglOVU1fUkFOR0VTIGlzIHRoZSBudW1iZXIgb2YgSURfUkFOR0VzIHRvIGZvbGxvdwotICoJSURfUkFOR0UgaXMgYSByYW5nZSBvZiBtb2RlbCBlbGVtZW50IElEJ3MgaW4gUmFuZ2VTZXQgbm90YXRpb24KLSAqCU5VTV9BVFRSUyBpcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgdG8gZm9sbG93Ci0gKglLRVk9VkFMVUUgYXJlIGtleS92YWx1ZSBwYWlycywgd2hlcmUgS0VZIGlzIHRoZSBhdHRyaWJ1dGUgSUQgYW5kIFZBTFVFIGlzIHRoZSBuZXcgYXR0cmlidXRlIHZhbHVlCi0gKgotICogUHJveHlSZW1vdmUqRXZlbnRzIChhcGFydCBmcm9tIFByb3h5UmVtb3ZlQWxsRXZlbnQpIGFyZSBmb3JtYXR0ZWQgYXMgZm9sbG93czoKLSAqIAotICoJRVZFTlRfSEVBREVSIElEX1JBTkdFCi0gKiAKLSAqCXdoZXJlOgotICogCi0gKglFVkVOVF9IRUFERVIgaXMgdGhlIGV2ZW50IG1lc3NhZ2UgaGVhZGVyCi0gKglJRF9SQU5HRSBpcyBhIHJhbmdlIG9mIG1vZGVsIGVsZW1lbnQgSUQncyBpbiBSYW5nZVNldCBub3RhdGlvbi4KLSAqCi0gKiBUaGUgUHJveHlSZW1vdmVBbGxFdmVudCBpcyBmb3JtYXR0ZWQgYXMgZm9sbG93czoKLSAqIAotICogIEVWRU5UX0hFQURFUgotICogIAotICogIHdoZXJlOgotICogCi0gKglFVkVOVF9IRUFERVIgaXMgdGhlIGV2ZW50IG1lc3NhZ2UgaGVhZGVyCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtIGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lU3lzdGVtIGltcGxlbWVudHMgSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFUVFJfTUlOX0xFTiA9IDU7Ci0JcHJvdGVjdGVkIElQcm94eVJ1bnRpbWVDbGllbnQgcHJveHkgPSBudWxsOwotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgYXR0ckRlZk1hbmFnZXI7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBBdHRyaWJ1dGVNYW5hZ2VyPiBqb2JTdWJzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgQXR0cmlidXRlTWFuYWdlcj4oKSk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW0oSVByb3h5UnVudGltZUNsaWVudCBwcm94eSwgQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCXRoaXMuYXR0ckRlZk1hbmFnZXIgPSBtYW5hZ2VyOwotCQlwcm94eS5hZGRQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQgZSkgewotCQlTdHJpbmdbXSBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQkKLQkJaWYgKGF0dHJzLmxlbmd0aCA+PSBBVFRSX01JTl9MRU4gKyAyKSB7Ci0JCQl0cnkgewotCQkJCWludCBudW1EZWZzID0gSW50ZWdlci5wYXJzZUludChhdHRyc1swXSk7Ci0JCQkJCi0JCQkJQXJyYXlMaXN0PElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/Pj4gYXR0ckRlZnMgPSAKLQkJCQkJbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4+KG51bURlZnMpOwotCi0JCQkJaW50IHBvcyA9IDE7Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZWZzOyBpKyspIHsKLQkJCQkJaW50IG51bUFyZ3MgPSBJbnRlZ2VyLnBhcnNlSW50KGF0dHJzW3Bvc10pOwotCQkJCQkKLQkJCQkJaWYgKG51bUFyZ3MgPj0gQVRUUl9NSU5fTEVOICYmIHBvcyArIG51bUFyZ3MgPCBhdHRycy5sZW5ndGgpIHsKLQkJCQkJCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PiBhdHRyRGVmID0gCi0JCQkJCQkJcGFyc2VBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJzLCBwb3MgKyAxLCBwb3MgKyBudW1BcmdzKTsJCi0JCQkJCQlpZiAoYXR0ckRlZiAhPSBudWxsKSB7Ci0JCQkJCQkJYXR0ckRlZnMuYWRkKGF0dHJEZWYpOwotCQkJCQkJfQotCQkJCQkJcG9zICs9IG51bUFyZ3MgKyAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJCYWQgcHJveHkgZXZlbnQ6IGJhZCBhcmcgY291bnQiKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJZmlyZVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQobmV3IFJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQoYXR0ckRlZnMudG9BcnJheShuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bYXR0ckRlZnMuc2l6ZSgpXSkpKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQmFkIHByb3h5IGV2ZW50OiBjb3VsZCBub3QgY29udmVydCBhcmcgdG8gaW50ZWdlciIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQmFkIHByb3h5IGV2ZW50OiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCBlKSB7Ci0JCWZpcmVSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KG5ldyBSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVFcnJvckV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXJyb3JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IGUpIHsKLQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChhdHRycy5sZW5ndGggPiAwKSB7Ci0JCQlBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IGdldEF0dHJpYnV0ZU1hbmFnZXIoYXR0cnMsIDAsIGF0dHJzLmxlbmd0aCAtIDEpOwotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQobWdyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBjb3VsZCBub3QgcGFyc2UgbWVzc2FnZSIpKTsJCQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQgZSkgewotCQlTdHJpbmdbXSBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQkKLQkJaWYgKGF0dHJzLmxlbmd0aCA8IDEpIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IG5vdCBlbm91Z2ggYXJndW1lbnRzIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlTWdyID0gZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoYXR0cnMsIDApOwotCQlpZiAoZU1nciAhPSBudWxsKSB7CQkJCi0JCQlmaXJlUnVudGltZUpvYkNoYW5nZUV2ZW50KG5ldyBSdW50aW1lSm9iQ2hhbmdlRXZlbnQoZU1ncikpOwotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogY291bGQgbm90IHBhcnNlIG1lc3NhZ2UiKSk7CQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZVByb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IGUpIHsKLQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChhdHRycy5sZW5ndGggPCAxKSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZU1nciA9IGdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKGF0dHJzLCAwKTsKLQkJaWYgKGVNZ3IgIT0gbnVsbCkgewkJCQotCQkJZmlyZVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQobmV3IFJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQoZU1ncikpOwotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogY291bGQgbm90IHBhcnNlIG1lc3NhZ2UiKSk7CQkJCQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVOZXdKb2JFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZU5ld0pvYkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVOZXdKb2JFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoIDwgMikgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogbm90IGVub3VnaCBhcmd1bWVudHMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGVNZ3IgPSBnZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcihhdHRycywgMSk7Ci0JCQotCQlpZiAoZU1nciAhPSBudWxsKSB7CQkJCi0JCQkvKgotCQkJICogRmluZCBhbnkgam9iIHN1Ym1pc3Npb24gYXR0cmlidXRlcyBhbmQgYWRkIHRvIHRoZSBqb2JzCi0JCQkgKi8KLQkJCWZvciAoTWFwLkVudHJ5PFJhbmdlU2V0LCBBdHRyaWJ1dGVNYW5hZ2VyPiBlbnRyeSA6IGVNZ3IuZ2V0RW50cnlTZXQoKSkgewotCQkJCVN0cmluZ0F0dHJpYnV0ZSBzdWJJZEF0dHIgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFN1YklkQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCQlpZiAoc3ViSWRBdHRyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN1YklkID0gc3ViSWRBdHRyLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJCQkJQXR0cmlidXRlTWFuYWdlciBtZ3IgPSBqb2JTdWJzLmdldChzdWJJZCk7Ci0JCQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5hZGRBdHRyaWJ1dGVzKG1nci5nZXRBdHRyaWJ1dGVzKCkpOwotCQkJCQl9Ci0JCQkJCWpvYlN1YnMucmVtb3ZlKHN1YklkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZpcmVSdW50aW1lTmV3Sm9iRXZlbnQobmV3IFJ1bnRpbWVOZXdKb2JFdmVudChhdHRyc1swXSwgZU1ncikpOwotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogY291bGQgbm90IHBhcnNlIG1lc3NhZ2UiKSk7CQkJCQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoIDwgMikgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogbm90IGVub3VnaCBhcmd1bWVudHMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGVNZ3IgPSBnZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcihhdHRycywgMSk7Ci0JCWlmIChlTWdyICE9IG51bGwpIHsJCQkKLQkJCWZpcmVSdW50aW1lTmV3TWFjaGluZUV2ZW50KG5ldyBSdW50aW1lTmV3TWFjaGluZUV2ZW50KGF0dHJzWzBdLCBlTWdyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBjb3VsZCBub3QgcGFyc2UgbWVzc2FnZSIpKTsJCQkJCi0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZVByb3h5UnVudGltZU5ld05vZGVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZU5ld05vZGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50IGUpIHsKLQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChhdHRycy5sZW5ndGggPCAyKSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZU1nciA9IGdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKGF0dHJzLCAxKTsKLQkJaWYgKGVNZ3IgIT0gbnVsbCkgewkJCQotCQkJZmlyZVJ1bnRpbWVOZXdOb2RlRXZlbnQobmV3IFJ1bnRpbWVOZXdOb2RlRXZlbnQoYXR0cnNbMF0sIGVNZ3IpKTsKLQkJfSBlbHNlIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IGNvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIikpOwkJCQkKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQgZSkgewotCQlTdHJpbmdbXSBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQkKLQkJaWYgKGF0dHJzLmxlbmd0aCA8IDIpIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IG5vdCBlbm91Z2ggYXJndW1lbnRzIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlTWdyID0gZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoYXR0cnMsIDEpOwotCQlpZiAoZU1nciAhPSBudWxsKSB7CQkJCi0JCQlmaXJlUnVudGltZU5ld1Byb2Nlc3NFdmVudChuZXcgUnVudGltZU5ld1Byb2Nlc3NFdmVudChhdHRyc1swXSwgZU1ncikpOwotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogY291bGQgbm90IHBhcnNlIG1lc3NhZ2UiKSk7CQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVOZXdRdWV1ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVOZXdRdWV1ZUV2ZW50IGUpIHsKLQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChhdHRycy5sZW5ndGggPCAyKSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZU1nciA9IGdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKGF0dHJzLCAxKTsKLQkJaWYgKGVNZ3IgIT0gbnVsbCkgewkJCQotCQkJZmlyZVJ1bnRpbWVOZXdRdWV1ZUV2ZW50KG5ldyBSdW50aW1lTmV3UXVldWVFdmVudChhdHRyc1swXSwgZU1ncikpOwotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogY291bGQgbm90IHBhcnNlIG1lc3NhZ2UiKSk7CQkJCQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoIDwgMSkgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogbm90IGVub3VnaCBhcmd1bWVudHMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGVNZ3IgPSBnZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcihhdHRycywgMCk7Ci0JCWlmIChlTWdyICE9IG51bGwpIHsJCQkKLQkJCWZpcmVSdW50aW1lTm9kZUNoYW5nZUV2ZW50KG5ldyBSdW50aW1lTm9kZUNoYW5nZUV2ZW50KGVNZ3IpKTsKLQkJfSBlbHNlIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IGNvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIikpOwkJCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoIDwgMSkgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogbm90IGVub3VnaCBhcmd1bWVudHMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGVNZ3IgPSBnZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcihhdHRycywgMCk7Ci0JCWlmIChlTWdyICE9IG51bGwpIHsJCQkKLQkJCWZpcmVSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KG5ldyBSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KGVNZ3IpKTsKLQkJfSBlbHNlIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IGNvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIikpOwkJCQkKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lUXVldWVDaGFuZ2VFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQgZSkgewotCQlTdHJpbmdbXSBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQkKLQkJaWYgKGF0dHJzLmxlbmd0aCA8IDEpIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IG5vdCBlbm91Z2ggYXJndW1lbnRzIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlTWdyID0gZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoYXR0cnMsIDApOwotCQlpZiAoZU1nciAhPSBudWxsKSB7CQkJCi0JCQlmaXJlUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQobmV3IFJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50KGVNZ3IpKTsKLQkJfSBlbHNlIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiQWJzdHJhY3RQcm94eVJ1bnRpbWVTeXN0ZW06IGNvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIikpOwkJCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCBlKSB7Ci0JCWZpcmVSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudChuZXcgUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZVByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50IGUpIHsKLQkJZmlyZVJ1bnRpbWVSZW1vdmVBbGxFdmVudChuZXcgUnVudGltZVJlbW92ZUFsbEV2ZW50KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoIDwgMSkgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogbm90IGVub3VnaCBhcmd1bWVudHMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZpcmVSdW50aW1lUmVtb3ZlSm9iRXZlbnQobmV3IFJ1bnRpbWVSZW1vdmVKb2JFdmVudChuZXcgUmFuZ2VTZXQoYXR0cnNbMF0pKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50IGUpIHsKLQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChhdHRycy5sZW5ndGggPCAxKSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZmlyZVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQobmV3IFJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQobmV3IFJhbmdlU2V0KGF0dHJzWzBdKSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoIDwgMSkgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJBYnN0cmFjdFByb3h5UnVudGltZVN5c3RlbTogbm90IGVub3VnaCBhcmd1bWVudHMiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZpcmVSdW50aW1lUmVtb3ZlTm9kZUV2ZW50KG5ldyBSdW50aW1lUmVtb3ZlTm9kZUV2ZW50KG5ldyBSYW5nZVNldChhdHRyc1swXSkpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQgZSkgewotCQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQotCQkJaWYgKGF0dHJzLmxlbmd0aCA8IDEpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZpcmVSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KG5ldyBSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KG5ldyBSYW5nZVNldChhdHRyc1swXSkpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQgZSkgewotCQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQotCQkJaWYgKGF0dHJzLmxlbmd0aCA8IDEpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZpcmVSdW50aW1lUmVtb3ZlUXVldWVFdmVudChuZXcgUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQobmV3IFJhbmdlU2V0KGF0dHJzWzBdKSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudChvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCBlKSB7Ci0JCWZpcmVSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQobmV3IFJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQgZSkgewotCQlmaXJlUnVudGltZVNodXRkb3duU3RhdGVFdmVudChuZXcgUnVudGltZVNodXRkb3duU3RhdGVFdmVudCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIjaGFuZGxlUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCBlKSB7Ci0JCVN0cmluZ1tdIGF0dHJzID0gZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAoYXR0cnMubGVuZ3RoID4gMCkgewotCQkJQXR0cmlidXRlTWFuYWdlciBtZ3IgPSBnZXRBdHRyaWJ1dGVNYW5hZ2VyKGF0dHJzLCAwLCBhdHRycy5sZW5ndGggLSAxKTsKLQkJCUludGVnZXJBdHRyaWJ1dGUgY29kZUF0dHIgPSBtZ3IuZ2V0QXR0cmlidXRlKEVycm9yQXR0cmlidXRlcy5nZXRDb2RlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCVN0cmluZ0F0dHJpYnV0ZSBtc2dBdHRyID0gbWdyLmdldEF0dHJpYnV0ZShFcnJvckF0dHJpYnV0ZXMuZ2V0TXNnQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCWlmIChjb2RlQXR0ciA9PSBudWxsIHx8IG1zZ0F0dHIgPT0gbnVsbCkgewotCQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLCAiU3RhcnR1cEVycm9yRXZlbnQ6IG1pc3NpbmcgYXR0aWJ1dGVzIikpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyZVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChuZXcgUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGNvZGVBdHRyLmdldFZhbHVlKCksIG1zZ0F0dHIuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJTdGFydHVwRXJyb3JFdmVudDogY291bGQgbm90IHBhcnNlIG1lc3NhZ2UiKSk7CQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyI2hhbmRsZVByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQob3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLnByb3h5LmV2ZW50LklQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KAotCQkJSVByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgZSkgewotCQlTdHJpbmdbXSBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQkKLQkJaWYgKGF0dHJzLmxlbmd0aCA+IDApIHsKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgbWdyID0gZ2V0QXR0cmlidXRlTWFuYWdlcihhdHRycywgMCwgYXR0cnMubGVuZ3RoIC0gMSk7Ci0JCQlJbnRlZ2VyQXR0cmlidXRlIGNvZGVBdHRyID0gKEludGVnZXJBdHRyaWJ1dGUpIG1nci5nZXRBdHRyaWJ1dGUoRXJyb3JBdHRyaWJ1dGVzLmdldENvZGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJU3RyaW5nQXR0cmlidXRlIG1zZ0F0dHIgPSAoU3RyaW5nQXR0cmlidXRlKSBtZ3IuZ2V0QXR0cmlidXRlKEVycm9yQXR0cmlidXRlcy5nZXRNc2dBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJU3RyaW5nQXR0cmlidXRlIGpvYlN1YklkQXR0ciA9IChTdHJpbmdBdHRyaWJ1dGUpIG1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRTdWJJZEF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCQlpZiAoY29kZUF0dHIgPT0gbnVsbCB8fCBtc2dBdHRyID09IG51bGwgfHwgam9iU3ViSWRBdHRyID09IG51bGwpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIlN1Ym1pdEpvYkVycm9yRXZlbnQ6IG1pc3NpbmcgYXR0aWJ1dGVzIikpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyZVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50KG5ldyBSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChjb2RlQXR0ci5nZXRWYWx1ZSgpLCBtc2dBdHRyLmdldFZhbHVlKCksIGpvYlN1YklkQXR0ci5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwgIlN1Ym1pdEpvYkVycm9yRXZlbnQ6IGNvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIikpOwkJCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciNoYW5kbGVQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IGUpIHsKLQkJU3RyaW5nW10gYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChhdHRycy5sZW5ndGggPiAwKSB7Ci0JCQlBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IGdldEF0dHJpYnV0ZU1hbmFnZXIoYXR0cnMsIDAsIGF0dHJzLmxlbmd0aCAtIDEpOwotCQkJSW50ZWdlckF0dHJpYnV0ZSBjb2RlQXR0ciA9IChJbnRlZ2VyQXR0cmlidXRlKSBtZ3IuZ2V0QXR0cmlidXRlKEVycm9yQXR0cmlidXRlcy5nZXRDb2RlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCVN0cmluZ0F0dHJpYnV0ZSBtc2dBdHRyID0gKFN0cmluZ0F0dHJpYnV0ZSkgbWdyLmdldEF0dHJpYnV0ZShFcnJvckF0dHJpYnV0ZXMuZ2V0TXNnQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCVN0cmluZ0F0dHJpYnV0ZSBqb2JJZEF0dHIgPSAoU3RyaW5nQXR0cmlidXRlKSBtZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0Sm9iSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJaWYgKGNvZGVBdHRyID09IG51bGwgfHwgbXNnQXR0ciA9PSBudWxsIHx8IGpvYklkQXR0ciA9PSBudWxsKSB7Ci0JCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJUZXJtaW5hdGVKb2JFcnJvckV2ZW50OiBtaXNzaW5nIGF0dGlidXRlcyIpKTsJCQkJCi0JCQl9IGVsc2UgewotCQkJCWZpcmVSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudChuZXcgUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQoY29kZUF0dHIuZ2V0VmFsdWUoKSwgbXNnQXR0ci5nZXRWYWx1ZSgpLCBqb2JJZEF0dHIuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsICJUZXJtaW5hdGVKb2JFcnJvckV2ZW50OiBjb3VsZCBub3QgcGFyc2UgbWVzc2FnZSIpKTsJCQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVTeXN0ZW0jc2h1dGRvd24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2h1dGRvd24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSVJ1bnRpbWVTeXN0ZW0jc3RhcnR1cChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydHVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklDb250cm9sU3lzdGVtI3N1Ym1pdEpvYihqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgc3VibWl0Sm9iKFN0cmluZyBzdWJJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdBdHRyaWJ1dGUgam9iU3ViQXR0ciA9IEpvYkF0dHJpYnV0ZXMuZ2V0U3ViSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHN1YklkKTsKLQkJCWF0dHJNZ3IuYWRkQXR0cmlidXRlKGpvYlN1YkF0dHIpOwotCQkJam9iU3Vicy5wdXQoc3ViSWQsIGF0dHJNZ3IpOwotCQkJcHJveHkuc3VibWl0Sm9iKGF0dHJNZ3IudG9TdHJpbmdBcnJheSgpKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUENvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCAKLQkJCQkiQ29udHJvbCBzeXN0ZW0gaXMgc2h1dCBkb3duLCBwcm94eSBleGNlcHRpb24uICBUaGUgcHJveHkgbWF5IGhhdmUgY3Jhc2hlZCBvciBiZWVuIGtpbGxlZC4iLCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSUNvbnRyb2xTeXN0ZW0jdGVybWluYXRlSm9iKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUpvYihJUEpvYiBqb2IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoam9iID09IG51bGwpIHsKLQkJCVBUUENvcmVQbHVnaW4ubG9nKCJUcmllZCB0byB0ZXJtaW5hdGUgYSBudWxsIGpvYi4iKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXByb3h5LnRlcm1pbmF0ZUpvYihqb2IuZ2V0SUQoKSk7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgCi0JCQkJIkNvbnRyb2wgc3lzdGVtIGlzIHNodXQgZG93biwgcHJveHkgZXhjZXB0aW9uLiAgVGhlIHByb3h5IG1heSBoYXZlIGNyYXNoZWQgb3IgYmVlbiBraWxsZWQuIiwgbnVsbCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklNb25pdG9yaW5nU3lzdGVtI3N0YXJ0RXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXByb3h5LnN0YXJ0RXZlbnRzKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIAotCQkJCQllLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JTW9uaXRvcmluZ1N5c3RlbSNzdG9wRXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRXZlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcHJveHkuc3RvcEV2ZW50cygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUENvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCAKLQkJCQkJZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIG1hbmFnZXIgZ2l2ZW4gYW4gYXJyYXkgb2Yga2V5L3ZhbHVlIHN0cmluZ3MuIEVhY2gga2V5L3ZhbHVlIHN0cmluZwotCSAqIG11c3QgYmUgaW4gdGhlIGZvcm0gImtleT12YWx1ZSIsIHdoZXJlICJrZXkiIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwKLQkgKiBhbmQgInZhbHVlIiBpcyBhIHN0cmluZyBjb250YWluaW5nIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLiBUaGUgImtleSIgc3RyaW5nIGNhbm5vdCBjb250YWluIAotCSAqIGFuICc9JyBjaGFyYWN0ZXIuIFRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGFsbG93ZWQgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSAia2V5IiBzdHJpbmcsIHRoZSAnPScsIAotCSAqIGFuZCB0aGUgc3RhcnQgb2YgdGhlICJ2YWx1ZSIgc3RyaW5nLCB1bmxlc3MgdGhhdCB3aGl0ZSBzcGFjZSBpcyBwYXJ0IG9mIHRob3NlIHN0cmluZ3MuCi0JICogCi0JICogQHBhcmFtIGt2cwotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBlbmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZU1hbmFnZXIoU3RyaW5nW10ga3ZzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJQXR0cmlidXRlTWFuYWdlciBtZ3IgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkKLQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7Ci0JCQlTdHJpbmcga3YgPSBrdnNbaV07Ci0JCQlpbnQgc2VwID0ga3YuaW5kZXhPZignPScpOwotCQkJaWYgKHNlcCA+IDApIHsKLQkJCQl0cnkgewotCQkJCQlJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4gYXR0ckRlZiA9IGF0dHJEZWZNYW5hZ2VyLmdldEF0dHJpYnV0ZURlZmluaXRpb24oa3Yuc3Vic3RyaW5nKDAsIHNlcCkpOwotCQkJCQlpZihhdHRyRGVmICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyB2YWx1ZSA9ICIiOwotCQkJCQkJaWYgKHNlcCA8IGt2Lmxlbmd0aCgpIC0gMSkgewotCQkJCQkJCXZhbHVlID0ga3Yuc3Vic3RyaW5nKHNlcCsxKTsKLQkJCQkJCX0KLQkJCQkJCUlBdHRyaWJ1dGU8Pyw/LD8+IGF0dHIgPSBhdHRyRGVmLmNyZWF0ZSh2YWx1ZSk7Ci0JCQkJCQltZ3IuYWRkQXR0cmlidXRlKGF0dHIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJUFRQQ29yZVBsdWdpbi5sb2coIkFic3RyYWN0UHJveHlSdW50aW1TeXN0ZW06IHVua25vd24gYXR0cmlidXRlIGRlZmluaXRpb24iKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgewotCQkJCQlQVFBDb3JlUGx1Z2luLmxvZygiQWJzdHJhY3RQcm94eVJ1bnRpbVN5c3RlbTogaW52YWxpZCBhdHRyaWJ1dGUgZm9yIGRlZmluaXRpb24iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtZ3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGF0dHJzCi0JICogQHBhcmFtIHBvcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKFN0cmluZ1tdIGF0dHJzLCBpbnQgcG9zKSB7Ci0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGVNZ3IgPSBuZXcgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCi0JCXRyeSB7Ci0JCQlpbnQgbnVtUmFuZ2VzID0gSW50ZWdlci5wYXJzZUludChhdHRyc1twb3MrK10pOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVJhbmdlczsgaSsrKSB7Ci0JCQkJaWYgKHBvcyA+PSBhdHRycy5sZW5ndGgpIHsKLQkJCQkJcmV0dXJuIG51bGw7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJUmFuZ2VTZXQgaWRzID0gbmV3IFJhbmdlU2V0KGF0dHJzW3BvcysrXSk7Ci0JCQkJaW50IG51bUF0dHJzID0gSW50ZWdlci5wYXJzZUludChhdHRyc1twb3MrK10pOwotCQkJCQotCQkJCWludCBzdGFydCA9IHBvczsKLQkJCQlpbnQgZW5kID0gcG9zICsgbnVtQXR0cnMgLSAxOwotCQkJCQotCQkJCWlmIChlbmQgPj0gYXR0cnMubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBudWxsOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJCWVNZ3Iuc2V0QXR0cmlidXRlTWFuYWdlcihpZHMsIGdldEF0dHJpYnV0ZU1hbmFnZXIoYXR0cnMsIHN0YXJ0LCBlbmQpKTsKLQkJCQkKLQkJCQlwb3MgPSBlbmQgKyAxOwotCQkJfQotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZU1ncjsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2UgYW5kIGV4dHJhY3QgYW4gYXR0cmlidXRlIGRlZmluaXRpb24uCi0JICogCi0JICogT24gZW50cnksIHdlIGtub3cgdGhhdCBlbmQgPCBhdHRycy5sZW5ndGggYW5kIGVuZCAtIHN0YXJ0ID49IEFUVFJfTUlOX0xFTgotCSAqIAotCSAqLwotCXByaXZhdGUgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+IHBhcnNlQXR0cmlidXRlRGVmaW5pdGlvbihTdHJpbmdbXSBhdHRycywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBwb3MgPSBzdGFydDsKLQkJSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+IGF0dHJEZWYgPSBudWxsOwotCQkKLQkJU3RyaW5nIGF0dHJJZCA9IGF0dHJzW3BvcysrXTsKLQkJU3RyaW5nIGF0dHJUeXBlID0gYXR0cnNbcG9zKytdOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyc1twb3MrK107Ci0JCVN0cmluZyBhdHRyRGVzYyA9IGF0dHJzW3BvcysrXTsKLQkJYm9vbGVhbiBhdHRyRGlzcGxheTsKLQkJCQotCQl0cnkgewotCQkJYXR0ckRpc3BsYXkgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihhdHRyc1twb3MrK10pOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLAotCQkJCQkiQmFkIHByb3h5IGV2ZW50OiBjb3VsZCBub3QgY29udmVydCBhdHRyIHRvIGJvb2xlYW4iKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGF0dHJEZWZhdWx0ID0gYXR0cnNbcG9zKytdOwotCQkKLQkJaWYgKGF0dHJUeXBlLmVxdWFscygiQk9PTEVBTiIpKSB7Ci0JCQl0cnkgewotCQkJCUJvb2xlYW4gZGVmVmFsID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oYXR0ckRlZmF1bHQpOwotCQkJCWF0dHJEZWYgPSBhdHRyRGVmTWFuYWdlci5jcmVhdGVCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbihhdHRySWQsIGF0dHJOYW1lLCBhdHRyRGVzYywgYXR0ckRpc3BsYXksIGRlZlZhbCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwKLQkJCQkJCSJCYWQgcHJveHkgZXZlbnQ6IGNvdWxkIG5vdCBjb252ZXJ0IGF0dHJzIHRvIGJvb2xlYW4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYXR0clR5cGUuZXF1YWxzKCJEQVRFIikpIHsKLQkJCWlmIChlbmQgLSBwb3MgPiAyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGRhdGVTdHlsZSA9IHRvRGF0ZVN0eWxlKGF0dHJzW3BvcysrXSk7Ci0JCQkJCWludCB0aW1lU3R5bGUgPSB0b0RhdGVTdHlsZShhdHRyc1twb3MrK10pOwotCQkJCQlMb2NhbGUgbG9jYWxlID0gdG9Mb2NhbGUoYXR0cnNbcG9zKytdKTsKLQkJCQkJCi0JCQkJCURhdGVGb3JtYXQgZm10ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKGRhdGVTdHlsZSwgdGltZVN0eWxlLCBsb2NhbGUpOwotCQkJCQlEYXRlIGRlZlZhbCA9IGZtdC5wYXJzZShhdHRyRGVmYXVsdCk7Ci0JCQkJCQotCQkJCQlpZiAoZW5kIC0gcG9zID4gMSkgewotCQkJCQkJRGF0ZSBtaW4gPSBmbXQucGFyc2UoYXR0cnNbcG9zKytdKTsKLQkJCQkJCURhdGUgbWF4ID0gZm10LnBhcnNlKGF0dHJzW3BvcysrXSk7Ci0JCQkJCQlhdHRyRGVmID0gYXR0ckRlZk1hbmFnZXIuY3JlYXRlRGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oYXR0cklkLCBhdHRyTmFtZSwgYXR0ckRlc2MsIGF0dHJEaXNwbGF5LCBkZWZWYWwsIGZtdCwgbWluLCBtYXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXR0ckRlZiA9IGF0dHJEZWZNYW5hZ2VyLmNyZWF0ZURhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJJZCwgYXR0ck5hbWUsIGF0dHJEZXNjLCBhdHRyRGlzcGxheSwgZGVmVmFsLCBmbXQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsCi0JCQkJCQkJIkJhZCBwcm94eSBldmVudDogY291bGQgbm90IHBhcnNlIGRhdGUiKSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLAotCQkJCQkJCSJCYWQgcHJveHkgZXZlbnQ6IGNvdWxkIG5vdCBjcmVhdGUgYXR0cmlidXRlIGRlZmluaXRpb24sICIKLQkJCQkJCQkrIGV4LmdldE1lc3NhZ2UoKSkpOwkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwKLQkJCQkJCSJCYWQgcHJveHkgZXZlbnQ6IG1pc3NpbmcgZGF0ZSBmb3JtYXQiKSk7CQkJCQotCQkJfQotCQl9IGVsc2UgaWYgKGF0dHJUeXBlLmVxdWFscygiRE9VQkxFIikpIHsKLQkJCXRyeSB7Ci0JCQkJRG91YmxlIGRlZlZhbCA9IERvdWJsZS5wYXJzZURvdWJsZShhdHRyRGVmYXVsdCk7Ci0JCQkJaWYgKGVuZCAtIHBvcyA+IDApIHsKLQkJCQkJCURvdWJsZSBtaW4gPSBEb3VibGUucGFyc2VEb3VibGUoYXR0cnNbcG9zKytdKTsKLQkJCQkJCURvdWJsZSBtYXggPSBEb3VibGUucGFyc2VEb3VibGUoYXR0cnNbcG9zKytdKTsKLQkJCQkJCWF0dHJEZWYgPSBhdHRyRGVmTWFuYWdlci5jcmVhdGVEb3VibGVBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJJZCwgYXR0ck5hbWUsIGF0dHJEZXNjLCBhdHRyRGlzcGxheSwgZGVmVmFsLCBtaW4sIG1heCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXR0ckRlZiA9IGF0dHJEZWZNYW5hZ2VyLmNyZWF0ZURvdWJsZUF0dHJpYnV0ZURlZmluaXRpb24oYXR0cklkLCBhdHRyTmFtZSwgYXR0ckRlc2MsIGF0dHJEaXNwbGF5LCBkZWZWYWwpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLAotCQkJCQkJIkJhZCBwcm94eSBldmVudDogY291bGQgbm90IGNvbnZlcnQgYXJncyB0byBkb3VibGUiKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZXgpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwKLQkJCQkJCSJCYWQgcHJveHkgZXZlbnQ6IGNvdWxkIG5vdCBjcmVhdGUgYXR0cmlidXRlIGRlZmluaXRpb24sICIgCi0JCQkJCQkrIGV4LmdldE1lc3NhZ2UoKSkpOwkJCQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoYXR0clR5cGUuZXF1YWxzKCJFTlVNRVJBVEVEIikpIHsKLQkJCUFycmF5TGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJd2hpbGUgKHBvcyA8PSBlbmQpIHsKLQkJCQl2YWx1ZXMuYWRkKGF0dHJzW3BvcysrXSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWF0dHJEZWYgPSBhdHRyRGVmTWFuYWdlci5jcmVhdGVTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJJZCwgYXR0ck5hbWUsCi0JCQkJCQlhdHRyRGVzYywgYXR0ckRpc3BsYXksIGF0dHJEZWZhdWx0LCB2YWx1ZXMudG9BcnJheShuZXcgU3RyaW5nW3ZhbHVlcy5zaXplKCldKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZXgpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwKLQkJCQkJCSJCYWQgcHJveHkgZXZlbnQ6IGNvdWxkIG5vdCBjcmVhdGUgYXR0cmlidXRlIGRlZmluaXRpb24sICIgCi0JCQkJCQkrIGV4LmdldE1lc3NhZ2UoKSkpOwkJCQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoYXR0clR5cGUuZXF1YWxzKCJJTlRFR0VSIikpIHsKLQkJCXRyeSB7Ci0JCQkJSW50ZWdlciBkZWZWYWwgPSBJbnRlZ2VyLnBhcnNlSW50KGF0dHJEZWZhdWx0KTsKLQkJCQlpZiAoZW5kIC0gcG9zID4gMCkgewotCQkJCQkJSW50ZWdlciBtaW4gPSBJbnRlZ2VyLnBhcnNlSW50KGF0dHJzW3BvcysrXSk7Ci0JCQkJCQlJbnRlZ2VyIG1heCA9IEludGVnZXIucGFyc2VJbnQoYXR0cnNbcG9zKytdKTsKLQkJCQkJCWF0dHJEZWYgPSBhdHRyRGVmTWFuYWdlci5jcmVhdGVJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihhdHRySWQsIGF0dHJOYW1lLCBhdHRyRGVzYywgYXR0ckRpc3BsYXksIGRlZlZhbCwgbWluLCBtYXgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWF0dHJEZWYgPSBhdHRyRGVmTWFuYWdlci5jcmVhdGVJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihhdHRySWQsIGF0dHJOYW1lLCBhdHRyRGVzYywgYXR0ckRpc3BsYXksIGRlZlZhbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsIAotCQkJCQkJIkJhZCBwcm94eSBldmVudDogY291bGQgbm90IGNvbnZlcnQgYXJncyB0byBpbnRlZ2VyIikpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsCi0JCQkJCQkiQmFkIHByb3h5IGV2ZW50OiBjb3VsZCBub3QgY3JlYXRlIGF0dHJpYnV0ZSBkZWZpbml0aW9uLCAiIAotCQkJCQkJKyBleC5nZXRNZXNzYWdlKCkpKTsJCQkJCQotCQkJfQotCQl9IGVsc2UgaWYgKGF0dHJUeXBlLmVxdWFscygiQklHSU5URUdFUiIpKSB7Ci0JCQl0cnkgewotCQkJCUJpZ0ludGVnZXIgZGVmVmFsID0gbmV3IEJpZ0ludGVnZXIoYXR0ckRlZmF1bHQpOwotCQkJCWlmIChlbmQgLSBwb3MgPiAwKSB7Ci0JCQkJCQlCaWdJbnRlZ2VyIG1pbiA9IG5ldyBCaWdJbnRlZ2VyKGF0dHJzW3BvcysrXSk7Ci0JCQkJCQlCaWdJbnRlZ2VyIG1heCA9IG5ldyBCaWdJbnRlZ2VyKGF0dHJzW3BvcysrXSk7Ci0JCQkJCQlhdHRyRGVmID0gYXR0ckRlZk1hbmFnZXIuY3JlYXRlQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oYXR0cklkLAotCQkJCQkJCQlhdHRyTmFtZSwgYXR0ckRlc2MsIGF0dHJEaXNwbGF5LCBkZWZWYWwsIG1pbiwgbWF4KTsKLQkJCQl9IGVsc2UgewotCQkJCQlhdHRyRGVmID0gYXR0ckRlZk1hbmFnZXIuY3JlYXRlQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oYXR0cklkLCBhdHRyTmFtZSwKLQkJCQkJCQlhdHRyRGVzYywgYXR0ckRpc3BsYXksIGRlZlZhbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQobmV3IFJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwuRVJST1IsCi0JCQkJCQkiQmFkIHByb3h5IGV2ZW50OiBjb3VsZCBub3QgY29udmVydCBhcmdzIHRvIEJpZ0ludGVnZXIiKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZXgpIHsKLQkJCQlmaXJlUnVudGltZU1lc3NhZ2VFdmVudChuZXcgUnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5FUlJPUiwKLQkJCQkJCSJCYWQgcHJveHkgZXZlbnQ6IGNvdWxkIG5vdCBjcmVhdGUgYXR0cmlidXRlIGRlZmluaXRpb24sICIKLQkJCQkJCSsgZXguZ2V0TWVzc2FnZSgpKSk7CQkJCQkKLQkJCX0KLQkJfSBlbHNlIGlmIChhdHRyVHlwZS5lcXVhbHMoIlNUUklORyIpKSB7Ci0JCQlhdHRyRGVmID0gYXR0ckRlZk1hbmFnZXIuY3JlYXRlU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihhdHRySWQsIGF0dHJOYW1lLCBhdHRyRGVzYywgYXR0ckRpc3BsYXksIGF0dHJEZWZhdWx0KTsKLQkJfSBlbHNlIHsKLQkJCWZpcmVSdW50aW1lTWVzc2FnZUV2ZW50KG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KExldmVsLkVSUk9SLAotCQkJCQkiQmFkIHByb3h5IGV2ZW50OiB1bmtub3duIGF0dHJpYnV0ZSB0eXBlIikpOwotCQl9Ci0JCQotCQlyZXR1cm4gYXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IHRvRGF0ZVN0eWxlKFN0cmluZyB2YWwpIHsKLQkJaWYgKHZhbC5lcXVhbHMoIlNIT1JUIikpIHsKLQkJCXJldHVybiBEYXRlRm9ybWF0LlNIT1JUOwotCQl9IGVsc2UgaWYgKHZhbC5lcXVhbHMoIk1FRElVTSIpKSB7Ci0JCQlyZXR1cm4gRGF0ZUZvcm1hdC5NRURJVU07Ci0JCX0gZWxzZSBpZiAodmFsLmVxdWFscygiTE9ORyIpKSB7Ci0JCQlyZXR1cm4gRGF0ZUZvcm1hdC5MT05HOwotCQl9IGVsc2UgaWYgKHZhbC5lcXVhbHMoIkZVTEwiKSkgewotCQkJcmV0dXJuIERhdGVGb3JtYXQuRlVMTDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBEYXRlRm9ybWF0LkRFRkFVTFQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTG9jYWxlIHRvTG9jYWxlKFN0cmluZyB2YWwpIHsKLQkJaWYgKHZhbC5lcXVhbHMoIkNBTkFEQSIpKSB7Ci0JCQlyZXR1cm4gTG9jYWxlLkNBTkFEQTsKLQkJfSBlbHNlIGlmICh2YWwuZXF1YWxzKCJDSElOQSIpKSB7Ci0JCQlyZXR1cm4gTG9jYWxlLkNISU5BOwotCQl9IGVsc2UgaWYgKHZhbC5lcXVhbHMoIkZSQU5DRSIpKSB7Ci0JCQlyZXR1cm4gTG9jYWxlLkZSQU5DRTsKLQkJfSBlbHNlIGlmICh2YWwuZXF1YWxzKCJHRVJNQU5ZIikpIHsKLQkJCXJldHVybiBMb2NhbGUuR0VSTUFOWTsKLQkJfSBlbHNlIGlmICh2YWwuZXF1YWxzKCJJVEFMWSIpKSB7Ci0JCQlyZXR1cm4gTG9jYWxlLklUQUxZOwotCQl9IGVsc2UgaWYgKHZhbC5lcXVhbHMoIkpBUEFOIikpIHsKLQkJCXJldHVybiBMb2NhbGUuSkFQQU47Ci0JCX0gZWxzZSBpZiAodmFsLmVxdWFscygiVEFJV0FOIikpIHsKLQkJCXJldHVybiBMb2NhbGUuVEFJV0FOOwotCQl9IGVsc2UgaWYgKHZhbC5lcXVhbHMoIlVLIikpIHsKLQkJCXJldHVybiBMb2NhbGUuVUs7Ci0JCX0gZWxzZSBpZiAodmFsLmVxdWFscygiVVMiKSkgewotCQkJcmV0dXJuIExvY2FsZS5VUzsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBMb2NhbGUuVVM7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vQWJzdHJhY3RSdW50aW1lU3lzdGVtLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vQWJzdHJhY3RSdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDIzNDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0Fic3RyYWN0UnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU1lc3NhZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3Sm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3Tm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVBbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSdW50aW1lU3lzdGVtIGltcGxlbWVudHMgSVJ1bnRpbWVTeXN0ZW0gewotCWZpbmFsIHByaXZhdGUgTGlzdGVuZXJMaXN0CWxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCXB1YmxpYyB2b2lkIGFkZFJ1bnRpbWVFdmVudExpc3RlbmVyKElSdW50aW1lRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSdW50aW1lRXZlbnRMaXN0ZW5lcihJUnVudGltZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIjZ2V0TGF1bmNoQXR0cmlidXRlcyhqYXZhLmxhbmcuU3RyaW5nLAotCSAqICBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVbXSkKLQkgKi8KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LD8sPz5bXSBnZXRMYXVuY2hBdHRyaWJ1dGVzKFN0cmluZyBtYWNoaW5lTmFtZSwgU3RyaW5nIHF1ZXVlTmFtZSwKLQkJCUlBdHRyaWJ1dGU8Pyw/LD8+W10gY3VycmVudEF0dHJzKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSm9iKElQSm9iIGpvYikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVNZXNzYWdlRXZlbnQoSVJ1bnRpbWVNZXNzYWdlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQoSVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50KElSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZUVycm9yU3RhdGVFdmVudChJUnVudGltZUVycm9yU3RhdGVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZUpvYkNoYW5nZUV2ZW50KElSdW50aW1lSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChJUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSdW50aW1lTm9kZUNoYW5nZUV2ZW50KElSdW50aW1lTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSdW50aW1lRXZlbnRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQoSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50KElSdW50aW1lUXVldWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSdW50aW1lTmV3Sm9iRXZlbnQoSVJ1bnRpbWVOZXdKb2JFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSdW50aW1lTmV3TWFjaGluZUV2ZW50KElSdW50aW1lTmV3TWFjaGluZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSdW50aW1lRXZlbnRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVOZXdOb2RlRXZlbnQoSVJ1bnRpbWVOZXdOb2RlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZU5ld1Byb2Nlc3NFdmVudChJUnVudGltZU5ld1Byb2Nlc3NFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZU5ld1F1ZXVlRXZlbnQoSVJ1bnRpbWVOZXdRdWV1ZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSdW50aW1lRXZlbnRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSdW50aW1lUmVtb3ZlQWxsRXZlbnQoSVJ1bnRpbWVSZW1vdmVBbGxFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZVJlbW92ZUpvYkV2ZW50KElSdW50aW1lUmVtb3ZlSm9iRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQoSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQoSVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQoSVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50KElSdW50aW1lUmVtb3ZlUXVldWVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KElSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZVNodXRkb3duU3RhdGVFdmVudChJUnVudGltZVNodXRkb3duU3RhdGVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoSVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJKChJUnVudGltZUV2ZW50TGlzdGVuZXIpbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChJUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCSgoSVJ1bnRpbWVFdmVudExpc3RlbmVyKWxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQoSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSdW50aW1lRXZlbnRMaXN0ZW5lcilsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0lDb250cm9sU3lzdGVtLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vSUNvbnRyb2xTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4MDhiYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vSUNvbnRyb2xTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLQotLyoqCi0gKiBBIENvbnRyb2wgU3lzdGVtIGlzIGEgcG9ydGlvbiBvZiBhIHJ1bnRpbWUgc3lzdGVtIHRoYXQgaGFuZGxlcyBjb250cm9sbGluZyBqb2JzLiAgVGhpcyBpbmNsdWRlcwotICogc3RhcnRpbmcgbmV3IGpvYnMsIHRlcm1pbmF0aW5nIGpvYnMsIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgcnVubmluZyBqb2JzIGFuZCBwcm9jZXNzZXMsIGV0Yy4KLSAqIAotICogQGF1dGhvciBOYXRoYW4gRGVCYXJkZWxlYmVuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJQ29udHJvbFN5c3RlbSB7CQotCQotCS8qKgotCSAqIFN1Ym1pdHMgYSBqb2IgcnVuIHVzaW5nIHRoZSBzdWJtaXNzaW9uIElEIGFuZCB0aGUgYXR0cmlidXRlcyBwcm92aWRlZCBieSB0aGUgQXR0cmlidXRlTWFuYWdlci4gIAotCSAqIFRoZSBBdHRyaWJ1dGVNYW5hZ2VyIGNvbnRhaW5zIHJlc291cmNlIG1hbmFnZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgCi0JICogaG93IHRoZSB1c2VyIHdhbnRzIHRvIHJ1biB0aGUgam9iLCBzdWNoIGFzIHRoZSBwcm9ncmFtIG5hbWUsIG51bWJlciBvZiBwcm9jZXNzZXMsIGV0Yy4KLQkgKiAKLQkgKiBUaGUgam9iIHN1Ym1pc3Npb24gSUQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG5ldyBqb2IgdGhhdCAKLQkgKiBpcyBjcmVhdGVkLiBUaGUgSUQgd2lsbCBiZSByZXR1cm5lZCBhcyBhbiBhdHRyaWJ1dGUgb24gdGhlIG5ldyBqb2IuCi0JICogCi0JICogVGhpcyB3aWxsIGNhbGwgd2lsbCByZXN1bHQgaW4gZWl0aGVyIGEgbmV3IGpvYiBldmVudCB3aGVuIHRoZSBqb2IgaXMgY3JlYXRlZAotCSAqIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9yIGFuIGVycm9yIGV2ZW50IGlmIHRoZSBqb2Igc3VibWlzc2lvbiBmYWlscy4KLQkgKiAKLQkgKiBAcGFyYW0gc3ViSWQKLQkgKiBAcGFyYW0gYXR0ck1nciAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgc3VibWl0Sm9iKFN0cmluZyBzdWJJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRlcm1pbmF0ZXMgYSBydW5uaW5nIGpvYi4gIFRoZSB7QGxpbmsgSVBKb2J9IGNvbnRhaW5zIHRoZSBqb2IgaWRlbnRpZmllciB1c2VkIHRvIAotCSAqIGxvY2F0ZSB0aGUgam9iIGJ5IHRoZSBjb250cm9sIHN5c3RlbS4KLQkgKiAKLQkgKiBAcGFyYW0gam9iIHRoZSBqb2IgdG8gdGVybWluYXRlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUpvYihJUEpvYiBqb2IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9JTW9uaXRvcmluZ1N5c3RlbS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0lNb25pdG9yaW5nU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDVmNGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0lNb25pdG9yaW5nU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIE1vbml0b3JpbmcgU3lzdGVtIGlzIGEgcG9ydGlvbiBvZiBhIHJ1bnRpbWUgc3lzdGVtIHRoYXQgaGFuZGxlcyBzdGF0dXMgYW5kIGluZm9ybWF0aW9uIGFib3V0Ci0gKiB0aGUgc3lzdGVtIChnZW5lcmFsbHkgdGhpbmdzIG91dHNpZGUgdGhlIGNvbnRyb2wgb2YgdGhlIHJ1bnRpbWUgc3lzdGVtKS4gIFRoaXMgaW5jbHVkZXMKLSAqIHdoYXQgbWFjaGluZXMgYXJlIGF2YWlsYWJsZSwgdGhlIG5vZGVzIGZvciB0aG9zZSBtYWNoaW5lcywgdGhlIHN0YXR1cyBvZiB0aG9zZSBub2RlcywgZXRjLgotICogCi0gKiBAYXV0aG9yIE5hdGhhbiBEZUJhcmRlbGViZW4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3JpbmdTeXN0ZW0gewotCi0JLyoqCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFdmVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRXZlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vSVJ1bnRpbWVFdmVudExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vSVJ1bnRpbWVFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTEwNGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0lSdW50aW1lRXZlbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU1lc3NhZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3Sm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lTmV3Tm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVBbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lRXZlbnRMaXN0ZW5lciB7Ci0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lRXJyb3JTdGF0ZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVNZXNzYWdlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZU5ld0pvYkV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZU5ld05vZGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lTmV3UHJvY2Vzc0V2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVOZXdRdWV1ZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lUXVldWVDaGFuZ2VFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lUmVtb3ZlQWxsRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZVJlbW92ZUpvYkV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUnVudGltZVJlbW92ZU5vZGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9JUnVudGltZVN5c3RlbS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0lSdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDRlMTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0lSdW50aW1lU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZVN5c3RlbSBleHRlbmRzIElDb250cm9sU3lzdGVtLCBJTW9uaXRvcmluZ1N5c3RlbSB7CQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBydW50aW1lIHN5c3RlbS4gIFRoZSBydW50aW1lIHN5c3RlbSBtYXkgZmlyZSBldmVudHMKLQkgKiBhbmQgd2lsbCB1c2UgdGhpcyBsaXN0IG9mIGxpc3RlbmVycyB0byBkZXRlcm1pbmUgd2hvIHRvIHNlbmQgdGhlc2UgZXZlbnRzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBzb21lb25lIHRoYXQgd2FudHMgdG8gbGlzdGVuZXIgdG8gcnVudGltZSBldmVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSdW50aW1lRXZlbnRMaXN0ZW5lcihJUnVudGltZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIHRoaW5ncyBsaXN0ZW5pbmcgdG8gcnVudGltZSBldmVudHMgb24KLQkgKiB0aGlzIHJ1bnRpbWUgc3lzdGVtLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUnVudGltZUV2ZW50TGlzdGVuZXIoSVJ1bnRpbWVFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbCBzeXN0ZW0gaXMgYmVpbmcgc2h1dGRvd24uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gc3RhcnQgdGhlIHJ1bnRpbWUgc3lzdGVtLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vSm9iUnVuQ29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL0pvYlJ1bkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjZWU0My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vSm9iUnVuQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gbmVlZGVkIHRvIHJ1biBvciBkZWJ1ZyBhIHBhcmFsbGVsIGpvYgotICogCi0gKiBleGVjTmFtZQkJCQkJVGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgKGNhbiBiZSBhIHJlbGF0aXZlIHBhdGgpLgotICogcGF0aFRvRXhlYwkJCQlXaGVuIGFwcGVuZGVkIHRvIGV4ZWNOYW1lLCBnaXZlcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZS4gCi0gKiAJCQkJCQkJQ2FuIGJlIG51bGwuCi0gKiBtYWNoaW5lTmFtZQkJCQlUaGUgbmFtZSBvZiB0aGUgbWFjaGluZSAoZnJvbSBtb2RlbCkgb24gd2hpY2ggdG8gcnVuIHRoZSBqb2IuCi0gKiBudW1iZXJPZlByb2Nlc3NlcwkJCU51bWJlciBvZiBwcm9jZXNzZXMgdG8gc3RhcnQuCi0gKiBudW1iZXJPZlByb2Nlc3Nlc1Blck5vZGUJTnVtYmVyIG9mIHByb2Nlc3NlcyB0byBzdGFydCBvbiBlYWNoIG5vZGUuCi0gKiBmaXJzTm9kZU51bWJlcgkJCU5vZGUgbnVtYmVyIChmcm9tIG1vZGVsKSBvZiBmaXJzdCBub2RlIHRvIHVzZSBpbiB0aGUgYWxsb2NhdGlvbi4KLSAqIHdvcmtpbmdEaXIJCQkJVGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgam9iLiBJZiBwYXRoVG9FeGVjIGlzIG51bGwsIHRoaXMgd2lsbCBiZSB1c2VkCi0gKiAJCQkJCQkJbG9jYXRlIHRoZSBleGVjdXRhYmxlLgotICogYXJndW1lbnRzCQkJCQlUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgcHJvZ3JhbS4gQ2FuIGJlIG51bGwuCi0gKiBlbnZpcm9ubWVudAkJCQlUaGUgZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRoZSBwcm9ncmFtLiBDYW4gYmUgbnVsbC4KLSAqIGRlYnVnZ2VyUGF0aAkJCQlOYW1lIChvciBwYXRoKSB0byB0aGUgZGVidWdnZXIgZXhlY3V0YWJsZS4KLSAqIGRlYnVnZ2VyQXJncwkJCQlBcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2dlci4KLSAqIGlzRGVidWdKb2IJCQkJVHJ1ZSBpZiB0aGlzIGlzIGEgZGVidWcgam9iLgotICovCi1wdWJsaWMgY2xhc3MgSm9iUnVuQ29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBleGVjTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhdGhUb0V4ZWM7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZU1hbmFnZXJOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgd29ya2luZ0RpcjsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gYXJndW1lbnRzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBlbnZpcm9ubWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlYnVnZ2VyUGF0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZGVidWdnZXJBcmdzOwotCXByb3RlY3RlZCBib29sZWFuIGlzRGVidWdKb2I7Ci0JcHJvdGVjdGVkIElBdHRyaWJ1dGU8Pyw/LD8+W10gbGF1bmNoQXR0cmlidXRlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXVlTmFtZTsKLQkKLQlwdWJsaWMgSm9iUnVuQ29uZmlndXJhdGlvbihTdHJpbmcgZXhlLCBTdHJpbmcgZXhlUGF0aCwgU3RyaW5nIHJlc291cmNlTWFuYWdlciwKLQkJCVN0cmluZyBxdWV1ZSwgSUF0dHJpYnV0ZTw/LD8sPz5bXSBsYXVuY2hBdHRyaWJ1dGVzLAotCQkJU3RyaW5nW10gYXJncywgU3RyaW5nW10gZW52LAotCQkJU3RyaW5nIGRpcikKLQl7Ci0JCWV4ZWNOYW1lID0gZXhlOwotCQlwYXRoVG9FeGVjID0gZXhlUGF0aDsKLQkJcmVzb3VyY2VNYW5hZ2VyTmFtZSA9IHJlc291cmNlTWFuYWdlcjsKLQkJcXVldWVOYW1lID0gcXVldWU7Ci0JCXRoaXMubGF1bmNoQXR0cmlidXRlcyA9IGxhdW5jaEF0dHJpYnV0ZXM7Ci0JCXdvcmtpbmdEaXIgPSBkaXI7Ci0JCWFyZ3VtZW50cyA9IGFyZ3M7Ci0JCWVudmlyb25tZW50ID0gZW52OwotCQlpc0RlYnVnSm9iID0gZmFsc2U7Ci0JCWRlYnVnZ2VyUGF0aCA9IG51bGw7Ci0JCWRlYnVnZ2VyQXJncyA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RXhlY05hbWUoKQotCXsKLQkJcmV0dXJuIGV4ZWNOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUb0V4ZWMoKQotCXsKLQkJcmV0dXJuIHBhdGhUb0V4ZWM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VNYW5hZ2VyTmFtZSgpCi0JewotCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRRdWV1ZU5hbWUoKQotCXsKLQkJcmV0dXJuIHF1ZXVlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRXb3JraW5nRGlyKCkKLQl7Ci0JCXJldHVybiB3b3JraW5nRGlyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKQotCXsKLQkJcmV0dXJuIGFyZ3VtZW50czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW52aXJvbm1lbnQoKQotCXsKLQkJcmV0dXJuIGVudmlyb25tZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWdnZXJQYXRoKCkKLQl7Ci0JCXJldHVybiBkZWJ1Z2dlclBhdGg7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXREZWJ1Z2dlckFyZ3MoKQotCXsKLQkJcmV0dXJuIGRlYnVnZ2VyQXJnczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCi0JewotCQlyZXR1cm4gaXNEZWJ1Z0pvYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVidWcoKQotCXsKLQkJaXNEZWJ1Z0pvYiA9IHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnZ2VyUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCWRlYnVnZ2VyUGF0aCA9IHBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnZ2VyQXJncyhTdHJpbmcgYXJncykKLQl7Ci0JCWRlYnVnZ2VyQXJncyA9IGFyZ3Muc3BsaXQoIiAiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gIm5hbWU6XHRcdCIrZXhlY05hbWUrIlxuIisKLQkJCQkicGF0aDpcdFx0IitwYXRoVG9FeGVjKyJcbiIrCi0JCQkJImN3ZDpcdFx0Iit3b3JraW5nRGlyKyJcbiIrCi0JCQkJInJlc291cmNlTWFuYWdlck5hbWU6XHQiK3Jlc291cmNlTWFuYWdlck5hbWUrIlxuIisKLQkJCQkicXVldWVOYW1lOlx0IitxdWV1ZU5hbWUrIlxuIisKLQkJCQkiaXNEZWJ1Zz9cdFx0Iitpc0RlYnVnSm9iOwotCX0KLQotCXB1YmxpYyBJQXR0cmlidXRlPD8sPyw/PltdIGdldExhdW5jaEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBsYXVuY2hBdHRyaWJ1dGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvQWJzdHJhY3RSdW50aW1lQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvQWJzdHJhY3RSdW50aW1lQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0ZDlhYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0Fic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UnVudGltZUNoYW5nZUV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVDaGFuZ2VFdmVudCB7Ci0JcHJpdmF0ZSBFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRyTWdyOwotCQotCXB1YmxpYyBBYnN0cmFjdFJ1bnRpbWVDaGFuZ2VFdmVudChFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQl0aGlzLmF0dHJNZ3IgPSBhdHRyczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUNoYW5nZUV2ZW50I2dldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZ2V0RWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBhdHRyTWdyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvQWJzdHJhY3RSdW50aW1lRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9BYnN0cmFjdFJ1bnRpbWVFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTE4Y2YuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9BYnN0cmFjdFJ1bnRpbWVFcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJ1bnRpbWVFcnJvckV2ZW50IGltcGxlbWVudHMgSVJ1bnRpbWVFcnJvckV2ZW50IHsKLQlwcml2YXRlIGludCBlcnJvckNvZGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCQotCXB1YmxpYyBBYnN0cmFjdFJ1bnRpbWVFcnJvckV2ZW50KGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLmVycm9yQ29kZSA9IGNvZGU7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXJyb3JFdmVudCNnZXRFcnJvckNvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb2RlKCkgewotCQlyZXR1cm4gZXJyb3JDb2RlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFcnJvckV2ZW50I2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9BYnN0cmFjdFJ1bnRpbWVOZXdFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9BYnN0cmFjdFJ1bnRpbWVOZXdFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI0YjI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvQWJzdHJhY3RSdW50aW1lTmV3RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSdW50aW1lTmV3RXZlbnQgaW1wbGVtZW50cyBJUnVudGltZU5ld0V2ZW50IHsKLQlwcml2YXRlIFN0cmluZyBwYXJlbnRJZDsKLQlwcml2YXRlIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3I7Ci0JCi0JcHVibGljIEFic3RyYWN0UnVudGltZU5ld0V2ZW50KFN0cmluZyBwYXJlbnRJZCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1ncikgewotCQl0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7Ci0JCXRoaXMuYXR0ck1nciA9IGF0dHJNZ3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5ld0V2ZW50I2dldFBhcmVudElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudElkKCkgewotCQlyZXR1cm4gcGFyZW50SWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVOZXdFdmVudCNnZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpCi0JICovCi0JcHVibGljIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gYXR0ck1ncjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0Fic3RyYWN0UnVudGltZVJlbW92ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0Fic3RyYWN0UnVudGltZVJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjg5MTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9BYnN0cmFjdFJ1bnRpbWVSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuUmFuZ2VTZXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJ1bnRpbWVSZW1vdmVFdmVudCBpbXBsZW1lbnRzIElSdW50aW1lUmVtb3ZlRXZlbnQgewotCXByaXZhdGUgUmFuZ2VTZXQgZWxlbWVudElkczsKLQkKLQlwdWJsaWMgQWJzdHJhY3RSdW50aW1lUmVtb3ZlRXZlbnQoKSB7Ci0JCXRoaXMuZWxlbWVudElkcyA9IG51bGw7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0UnVudGltZVJlbW92ZUV2ZW50KFJhbmdlU2V0IGVsZW1lbnRJZHMpIHsKLQkJdGhpcy5lbGVtZW50SWRzID0gZWxlbWVudElkczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUmVtb3ZlRXZlbnQjZ2V0RWxlbWVudElkcygpCi0JICovCi0JcHVibGljIFJhbmdlU2V0IGdldEVsZW1lbnRJZHMoKSB7Ci0JCXJldHVybiBlbGVtZW50SWRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmN2YwYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudCBleHRlbmRzIElSdW50aW1lRXZlbnQgewotCXB1YmxpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZpbml0aW9ucygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOWJkMWYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUNoYW5nZUV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVFdmVudCB7CQotCXB1YmxpYyBFbGVtZW50QXR0cmlidXRlTWFuYWdlciBnZXRFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg0YTE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCBleHRlbmRzIElSdW50aW1lRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lRGlzY29ubmVjdGVkRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVEaXNjb25uZWN0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGU1NDk1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVEaXNjb25uZWN0ZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZURpc2Nvbm5lY3RlZEV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVFdmVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUVycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkZjk1Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lRXJyb3JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVFcnJvckV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVFdmVudCB7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgZXJyb3IgY29kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb2RlKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUVycm9yU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUVycm9yU3RhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEwYjdjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUVycm9yU3RhdGVFdmVudCBleHRlbmRzIElSdW50aW1lRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U0NDkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUV2ZW50IHsJCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lRXZlbnRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lRXZlbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOTI5MGMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUV2ZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWVzc2FnZUF0dHJpYnV0ZXMuTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuUmFuZ2VTZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVFdmVudEZhY3RvcnkgewotCi0JLyoqCi0JICogQHBhcmFtIGRlZnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50IG5ld1J1bnRpbWVBdHRyaWJ1dGVEZWZpbml0aW9uRXZlbnQoSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz5bXSBkZWZzKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IG5ld1J1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVEaXNjb25uZWN0ZWRFdmVudCBuZXdSdW50aW1lRGlzY29ubmVjdGVkRXZlbnQoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZUVycm9yU3RhdGVFdmVudCBuZXdSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lSm9iQ2hhbmdlRXZlbnQgbmV3UnVudGltZUpvYkNoYW5nZUV2ZW50KEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBhdHRycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQgbmV3UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRycyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lTWVzc2FnZUV2ZW50IG5ld1J1bnRpbWVNZXNzYWdlRXZlbnQoQXR0cmlidXRlTWFuYWdlciBhdHRycyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVNZXNzYWdlRXZlbnQgbmV3UnVudGltZU1lc3NhZ2VFdmVudChMZXZlbCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhdHRycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOZXdKb2JFdmVudCBuZXdSdW50aW1lTmV3Sm9iRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhdHRycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQgbmV3UnVudGltZU5ld01hY2hpbmVFdmVudChTdHJpbmcgcGFyZW50LCBFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRycyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGF0dHJzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZU5ld05vZGVFdmVudCBuZXdSdW50aW1lTmV3Tm9kZUV2ZW50KFN0cmluZyBwYXJlbnQsIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lTmV3UHJvY2Vzc0V2ZW50IG5ld1J1bnRpbWVOZXdQcm9jZXNzRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhdHRycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOZXdRdWV1ZUV2ZW50IG5ld1J1bnRpbWVOZXdRdWV1ZUV2ZW50KFN0cmluZyBwYXJlbnQsIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBhdHRycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgbmV3UnVudGltZU5vZGVDaGFuZ2VFdmVudChFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRycyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXR0cnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50IG5ld1J1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQoRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZVJlbW92ZUFsbEV2ZW50IG5ld1J1bnRpbWVSZW1vdmVBbGxFdmVudHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lUmVtb3ZlSm9iRXZlbnQgbmV3UnVudGltZVJlbW92ZUpvYkV2ZW50KFJhbmdlU2V0IGlkcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCBuZXdSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KFJhbmdlU2V0IGlkcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZVJlbW92ZU5vZGVFdmVudCBuZXdSdW50aW1lUmVtb3ZlTm9kZUV2ZW50KFJhbmdlU2V0IGlkcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCBuZXdSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KFJhbmdlU2V0IGlkcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZVJlbW92ZVF1ZXVlRXZlbnQgbmV3UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQoUmFuZ2VTZXQgaWRzKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCBuZXdSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQgbmV3UnVudGltZVNodXRkb3duU3RhdGVFdmVudCgpOwotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgbmV3UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgbmV3UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29kZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGpvYlN1YklECi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgbmV3UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgam9iU3ViSUQpOwotCi0JLyoqCi0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBqb2JJRAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IG5ld1J1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGpvYklEKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVKb2JDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmJiYjUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lSm9iQ2hhbmdlRXZlbnQgZXh0ZW5kcyBJUnVudGltZUNoYW5nZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlYWY4Ni4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVDaGFuZ2VFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVNZXNzYWdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVNZXNzYWdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyOTlkNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTWVzc2FnZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWVzc2FnZUF0dHJpYnV0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVNZXNzYWdlRXZlbnQgZXh0ZW5kcyBJUnVudGltZUV2ZW50IHsKLQkvKioKLQkgKiBAcmV0dXJuIG1lc3NhZ2UgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUF0dHJpYnV0ZXMuTGV2ZWwgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gbWVzc2FnZSBjb2RlCi0JICovCi0JcHVibGljIGludCBnZXRDb2RlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG1lc3NhZ2UgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gbWVzc2FnZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0cmlidXRlcygpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5ld0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzZGE5YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lTmV3RXZlbnQgZXh0ZW5kcyBJUnVudGltZUV2ZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudElkKCk7Ci0JcHVibGljIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGdldEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5ld0pvYkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3Sm9iRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYzVjNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3Sm9iRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVOZXdKb2JFdmVudCBleHRlbmRzIElSdW50aW1lTmV3RXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3TWFjaGluZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3TWFjaGluZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzkyYzYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZU5ld01hY2hpbmVFdmVudCBleHRlbmRzIElSdW50aW1lTmV3RXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3Tm9kZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3Tm9kZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODNiMDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5ld05vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZU5ld05vZGVFdmVudCBleHRlbmRzIElSdW50aW1lTmV3RXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3UHJvY2Vzc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3UHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTY0NDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZU5ld1Byb2Nlc3NFdmVudCBleHRlbmRzIElSdW50aW1lTmV3RXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3UXVldWVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5ld1F1ZXVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOWQ3MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lTmV3UXVldWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZU5ld1F1ZXVlRXZlbnQgZXh0ZW5kcyBJUnVudGltZU5ld0V2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5vZGVDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZU5vZGVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDE0NjJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBJUnVudGltZUNoYW5nZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQyZTk1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgZXh0ZW5kcyBJUnVudGltZUNoYW5nZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjRiYTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVDaGFuZ2VFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVBbGxFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJlbW92ZUFsbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzRmMjUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJlbW92ZUFsbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVSZW1vdmVBbGxFdmVudCBleHRlbmRzIElSdW50aW1lUmVtb3ZlRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWJhNjBlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuUmFuZ2VTZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVSZW1vdmVFdmVudCBleHRlbmRzIElSdW50aW1lRXZlbnQgewotCXB1YmxpYyBSYW5nZVNldCBnZXRFbGVtZW50SWRzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJlbW92ZUpvYkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlSm9iRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOGIzOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlSm9iRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZVJlbW92ZUpvYkV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVSZW1vdmVFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2MzNkMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgZXh0ZW5kcyBJUnVudGltZVJlbW92ZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJlbW92ZU5vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJlbW92ZU5vZGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFmZTAzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZVJlbW92ZU5vZGVFdmVudCBleHRlbmRzIElSdW50aW1lUmVtb3ZlRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMWNmYjcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50IGV4dGVuZHMgSVJ1bnRpbWVSZW1vdmVFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lUmVtb3ZlUXVldWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM3M2YyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVSZW1vdmVFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZmQ3OGMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQgZXh0ZW5kcyBJUnVudGltZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVNodXRkb3duU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVNodXRkb3duU3RhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzg1YjU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQgZXh0ZW5kcyBJUnVudGltZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2MmJkYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZVN0YXJ0dXBFcnJvckV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVFcnJvckV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL0lSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTA3Y2U5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50IGV4dGVuZHMgSVJ1bnRpbWVFcnJvckV2ZW50IHsKLQkvKioKLQkgKiBAcmV0dXJuIGpvYiBzdWJtaXNzaW9uIElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2JTdWJJRCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ydHN5c3RlbS9ldmVudHMvSVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmFhZjUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9JUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50czsKLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQgZXh0ZW5kcyBJUnVudGltZUVycm9yRXZlbnQgewotCS8qKgotCSAqIEByZXR1cm4gam9iIElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2JJRCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3J0c3lzdGVtL2V2ZW50cy9SdW50aW1lRXZlbnRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVFdmVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZTFlYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcnRzeXN0ZW0vZXZlbnRzL1J1bnRpbWVFdmVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLk1lc3NhZ2VBdHRyaWJ1dGVzLkxldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZURpc2Nvbm5lY3RlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZUVycm9yU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lTWVzc2FnZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVOZXdOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lTmV3UHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVBbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJ0c3lzdGVtLmV2ZW50cy5SdW50aW1lUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVJlbW92ZVByb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVNodXRkb3duU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucnRzeXN0ZW0uZXZlbnRzLlJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5ydHN5c3RlbS5ldmVudHMuUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuUmFuZ2VTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lRXZlbnRGYWN0b3J5IGltcGxlbWVudHMgSVJ1bnRpbWVFdmVudEZhY3RvcnkgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uKQotCSAqLwotCXB1YmxpYyBJUnVudGltZUF0dHJpYnV0ZURlZmluaXRpb25FdmVudCBuZXdSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50KElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGRlZnMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lQXR0cmlidXRlRGVmaW5pdGlvbkV2ZW50KGRlZnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKQotCSAqLwotCXB1YmxpYyBJUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQgbmV3UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVEaXNjb25uZWN0ZWRFdmVudChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUnVudGltZURpc2Nvbm5lY3RlZEV2ZW50IG5ld1J1bnRpbWVEaXNjb25uZWN0ZWRFdmVudChTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVEaXNjb25uZWN0ZWRFdmVudChtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVFcnJvclN0YXRlRXZlbnQoKQotCSAqLwotCXB1YmxpYyBJUnVudGltZUVycm9yU3RhdGVFdmVudCBuZXdSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVFcnJvclN0YXRlRXZlbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVKb2JDaGFuZ2VFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBJUnVudGltZUpvYkNoYW5nZUV2ZW50IG5ld1J1bnRpbWVKb2JDaGFuZ2VFdmVudChFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVKb2JDaGFuZ2VFdmVudChhdHRycyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JcHVibGljIElSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IG5ld1J1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQoRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVNZXNzYWdlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBJUnVudGltZU1lc3NhZ2VFdmVudCBuZXdSdW50aW1lTWVzc2FnZUV2ZW50KEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lTWVzc2FnZUV2ZW50KGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVNZXNzYWdlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5NZXNzYWdlQXR0cmlidXRlcy5MZXZlbCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVNZXNzYWdlRXZlbnQgbmV3UnVudGltZU1lc3NhZ2VFdmVudChMZXZlbCBsZXZlbCwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZU1lc3NhZ2VFdmVudChsZXZlbCwgbWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lTmV3Sm9iRXZlbnQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOZXdKb2JFdmVudCBuZXdSdW50aW1lTmV3Sm9iRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lTmV3Sm9iRXZlbnQocGFyZW50LCBhdHRycyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lTmV3TWFjaGluZUV2ZW50KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JcHVibGljIElSdW50aW1lTmV3TWFjaGluZUV2ZW50IG5ld1J1bnRpbWVOZXdNYWNoaW5lRXZlbnQoU3RyaW5nIHBhcmVudCwgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lTmV3TWFjaGluZUV2ZW50KHBhcmVudCwgYXR0cnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZU5ld05vZGVFdmVudChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBJUnVudGltZU5ld05vZGVFdmVudCBuZXdSdW50aW1lTmV3Tm9kZUV2ZW50KFN0cmluZyBwYXJlbnQsIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZU5ld05vZGVFdmVudChwYXJlbnQsIGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVOZXdQcm9jZXNzRXZlbnQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQgbmV3UnVudGltZU5ld1Byb2Nlc3NFdmVudChTdHJpbmcgcGFyZW50LCBFbGVtZW50QXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQocGFyZW50LCBhdHRycyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZU5ld1F1ZXVlRXZlbnQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVOZXdRdWV1ZUV2ZW50IG5ld1J1bnRpbWVOZXdRdWV1ZUV2ZW50KFN0cmluZyBwYXJlbnQsIEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZU5ld1F1ZXVlRXZlbnQocGFyZW50LCBhdHRycyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZU5vZGVDaGFuZ2VFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBJUnVudGltZU5vZGVDaGFuZ2VFdmVudCBuZXdSdW50aW1lTm9kZUNoYW5nZUV2ZW50KEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZU5vZGVDaGFuZ2VFdmVudChhdHRycyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBJUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCBuZXdSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudChhdHRycyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZVJlbW92ZUFsbEV2ZW50dCgpCi0JICovCi0JcHVibGljIElSdW50aW1lUmVtb3ZlQWxsRXZlbnQgbmV3UnVudGltZVJlbW92ZUFsbEV2ZW50dCgpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lUmVtb3ZlQWxsRXZlbnQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lUmVtb3ZlSm9iRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5SYW5nZVNldCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVSZW1vdmVKb2JFdmVudCBuZXdSdW50aW1lUmVtb3ZlSm9iRXZlbnQoUmFuZ2VTZXQgaWRzKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZVJlbW92ZUpvYkV2ZW50KGlkcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLlJhbmdlU2V0KQotCSAqLwotCXB1YmxpYyBJUnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCBuZXdSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KFJhbmdlU2V0IGlkcykgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQoaWRzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lUmVtb3ZlTm9kZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuUmFuZ2VTZXQpCi0JICovCi0JcHVibGljIElSdW50aW1lUmVtb3ZlTm9kZUV2ZW50IG5ld1J1bnRpbWVSZW1vdmVOb2RlRXZlbnQoUmFuZ2VTZXQgaWRzKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZVJlbW92ZU5vZGVFdmVudChpZHMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5SYW5nZVNldCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQgbmV3UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudChSYW5nZVNldCBpZHMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KGlkcyk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuUmFuZ2VTZXQpCi0JICovCi0JcHVibGljIElSdW50aW1lUmVtb3ZlUXVldWVFdmVudCBuZXdSdW50aW1lUmVtb3ZlUXVldWVFdmVudChSYW5nZVNldCBpZHMpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lUmVtb3ZlUXVldWVFdmVudChpZHMpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQoKQotCSAqLwotCXB1YmxpYyBJUnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50IG5ld1J1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCgpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQoKTsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZVNodXRkb3duU3RhdGVFdmVudCgpCi0JICovCi0JcHVibGljIElSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50IG5ld1J1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQoKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZVNodXRkb3duU3RhdGVFdmVudCgpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUV2ZW50RmFjdG9yeSNuZXdSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCBuZXdSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQobWVzc2FnZSk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lRXZlbnRGYWN0b3J5I25ld1J1bnRpbWVTdGFydHVwRXJyb3JFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgbmV3UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChjb2RlLCBtZXNzYWdlKTsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgbmV3UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgam9iU3ViSUQpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChjb2RlLCBtZXNzYWdlLCBqb2JTdWJJRCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQgbmV3UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgam9iSUQpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudChjb2RlLCBtZXNzYWdlLCBqb2JJRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvLmNsYXNzcGF0aCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4NDgyNDkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci8uY3ZzaWdub3JlIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkyMzU3ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluDQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvLnByb2plY3QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNkY2UyOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmhlbHA8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWZmM2I5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5oZWxwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHB0cEhlbHAuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAuaGVscC5IZWxwUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5oZWxwLAotIG9yZy5lY2xpcHNlLnVpLmludHJvLAotIG9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmZhZWZhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1zb3VyY2UucHRwaGVscC5qYXIgPSBzcmMvDQotb3V0cHV0LnB0cGhlbHAuamFyID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIHB0cGhlbHAuamFyLFwNCi0gICAgICAgICAgICAgICB0b2MueG1sLFwNCi0gICAgICAgICAgICAgICBpbnRyby8sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIGh0bWwvLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQotc3JjLmluY2x1ZGVzID0gaHRtbC8sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIHRvYy54bWwNCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAwbmV3Tm90ZXdvcnRoeS5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wMG5ld05vdGV3b3J0aHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiMWJlMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAwbmV3Tm90ZXdvcnRoeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5OZXcgYW5kIE5vdGV3b3J0aHkgLSBQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAoUFRQKSBSZWxlYXNlIDIuMSA8L3RpdGxlPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaGVscC5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gKFBUUCkgUmVsZWFzZSAyLjEgLSBOZXcgYW5kIE5vdGV3b3J0aHk8L2gxPgotCi08cD5UaGlzIHZlcnNpb24gaGFzIGhhZCBtYW55IGVuaGFuY2VtZW50cyBhbmQgYnVnIGZpeGVzIHNpbmNlIHRoZSAyLjAgIAotcmVsZWFzZS4gRGV0YWlsZWQgUFRQIDIuMSByZWxlYXNlIG5vdGVzLCBpbmNsdWRpbmcgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucywgYXJlIGF2YWlsYWJsZQotICAgIAlhdCA8YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9QVFAvcmVsZWFzZV9ub3Rlcy8yLjEiPgotICAgIAlodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9QVFAvcmVsZWFzZV9ub3Rlcy8yLjE8L2E+PC9wPgotPGRsPgotPGR0PlJlc291cmNlIE1hbmFnZXJzPC9kdD4KLTxkZD4KLU5ldyBtb3JlIGZsZXhpYmxlIHJlc291cmNlIG1hbmFnZXIgZm9yIE9wZW4gTVBJLiBUaGlzIHJlc291cmNlIG1hbmFnZXIgZG9lcyBub3QgcmVxdWlyZSBhIHByb3h5IGFnZW50IHRvIGJlIHJ1bm5pbmcgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGFuZCBjYW4gYmUgdXNlIGFzIGEgCi10ZW1wbGF0ZSB0byB0YXJnZXQgb3RoZXIgTVBJIGltcGxlbWVudGF0aW9ucy4gSXQgYWxzbyB3b3JrcyB3aXRoIE9wZW4gTVBJIDEuMiBhbmQgMS4zLgotSW1wcm92ZW1lbnRzIGhhdmUgYWxzbyBiZWVuIG1hZGUgdG8gdGhlIFBhcmFsbGVsIEVudmlyb25tZW50IHJlc291cmNlIG1hbmFnZXIsIGFzIHdlbGwgYXMgYWRkaW5nCi1zdXBwb3J0IGZvciB0aGUgbmV3IGRlYnVnZ2VyLgotPC9kZD4KLTxicj4KLTxkbD4KLTxkdD5QYXJhbGxlbCBEZWJ1Z2dlcjwvZHQ+Ci08ZGQ+Ci1UaGUgZGVidWdnZXIgZGVwZW5kZW5jeSBvbiBNUEkgaGFzIG5vdyBiZWVuIHJlbW92ZWQuIFRoaXMgYWxsb3dzIHRoZSBkZWJ1Z2dlciB0byB3b3JrIHdpdGggdmlydHVhbGx5IGFueSBNUEkgaW1wbGVtZW50YXRpb24uIAotVGhlIGRlYnVnZ2VyIGFsc28gcHJvdmlkZXMgYSBmbGV4aWJsZSBhcmNoaXRlY3R1cmUgYWxsb3dzIGRpZmZlcmVudCByb3V0aW5nIGFuZCBjb21tdW5pY2F0aW9uIGxheWVycyBhcyB3ZWxsIGFzIAotZnVsbCBhc3luY2hyb25vdXMgY29tbWFuZCBzdXBwb3J0Ci08L2RkPgotPGJyPgotPGRsPgotPGR0PlBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIChQTERUKTwvZHQ+Ci08ZGQ+Ci1TdXBwb3J0IGZvciBVbmlmaWVkIFBhcmFsbGVsIEMgKFVQQykgaGFzIGJlZW4gYWRkZWQsIGFsb25nIHdpdGggbmV3IE1QSSBjb2RlIHRlbXBsYXRlcy4KLTwvZGQ+Ci08YnI+Ci08ZGw+Ci08ZHQ+RXh0ZXJuYWwgVG9vbHMgRnJhbWV3b3JrIChmb3JtZXJseSB0aGUgUGVyZm9ybWFuY2UgVG9vbHMgRnJhbWV3b3JrKTwvZHQ+Ci08ZGQ+Ci1TdXBwb3J0IGZvciBQQVBJIENvbXBvbmVudCBjb3VudGVyIHNlbGVjdGlvbiBoYXMgYmVlbiBhZGRlZCwgYWxvbmcgd2l0aCBwYXJhbWV0cmljIGFuYWx5c2lzIGNhcGFiaWxpdGllcyAKLShzdXBwb3J0ZWQgcHJpbWFyaWx5IGZvciBUQVUgYXQgdGhpcyB0aW1lKS4gU2lnbmlmaWNhbnQgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gbWFkZSB0byBpbmNyZWFzZSB3b3JrLWZsb3cgZmxleGliaWxpdHkKLTwvZGQ+Ci08YnI+Ci08ZGw+Ci08ZHQ+UmVtb3RlIERldmVsb3BtZW50IFRvb2xzIChSRFQpPC9kdD4KLTxkZD4KLUEgbmV3IFJlbW90ZSBEZXZlbG9wbWVudCBUb29scyBlbnZpcm9ubWVudCB0aGF0IGVuYWJsZXMgQyBhbmQgQysrIHByb2plY3RzIHRvIGJlIGxvY2F0ZWQgb24gYSByZW1vdGUgbWFjaGluZS4gCi1SRFQgcHJvdmlkZXMgcmVtb3RlIGluZGV4aW5nIGFuZCBwYXJzaW5nIHNlcnZpY2VzLCBhIG5ldyByZW1vdGUgQy9DKysgcHJvamVjdCB3aXphcmQsIGF1dG9tYXRpYyBzb3VyY2UgY29kZSAKLWRlbHRhIGhhbmRsaW5nICh0aGUgaW5kZXggaXMgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4gZmlsZXMgaW4geW91ciBwcm9qZWN0IGFyZSBhZGRlZC9yZW1vdmVkL2NoYW5nZWQpLCAKLXJlbW90ZSAic2Nhbm5lciBpbmZvIiBzdXBwb3J0IHRvIGFsbG93IHRoZSB1c2VyIHRvIGRlZmluZSBpbmNsdWRlIHBhdGhzIGFuZCBkZWZpbmVkIHByZXByb2Nlc3NvciBtYWNyb3MgYXMgYSAKLWNvbnRleHQgZm9yIHRoZSBwYXJzZXIgdG8gb3BlcmF0ZSwgYW5kIHJlbW90ZSBTZWFyY2gsIENhbGwgSGllcmFyY2h5LCBOYXZpZ2F0aW9uIChlLmcuIEdvIFRvIERlY2xhcmF0aW9uKSwgCi1Db250ZW50IEFzc2lzdCwgYW5kIFR5cGUgSGllcmFyY2h5IHN1cHBvcnQuIFJEVCBhbHNvIHByb3ZpZGVzIHJlbW90ZSBTdGFuZGFyZCBNYWtlIGZ1bmN0aW9uYWxpdHkgCi1mb3IgYnVpbGRpbmcgcmVtb3RlIG1ha2VmaWxlLWJhc2VkIHByb2plY3RzLgotPC9kZD4KLTxicj4KLTxkbD4KLTxkdD5TZXJ2aWNlcyBNb2RlbDwvZHQ+Ci08ZGQ+Ci1UaGUgUFRQIHNlcnZpY2UgbW9kZWwgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBob3cgc2VydmljZXMgb24gdGhlaXIgc3lzdGVtIGFyZSBtYXBwZWQgdG8gc2VydmljZSBwcm92aWRlcnMKLWFuZCBsb2NhdGlvbnMgKGUuZy4gdG8gYSByZW1vdGUgbWFjaGluZSkuIFRoaXMgYWxsb3dzIElTVnMgYW5kIHRvb2wgaW1wbGVtZW50ZXJzIHRvIGRlZmluZSBuZXcgc2VydmljZXMsIGFuZCAKLWNvbnRyaWJ1dGUgcHJvdmlkZXJzIHRvIGFueSBkZWZpbmVkIHNlcnZpY2VzLgotPC9kZD4KLTxicj4KLTxkbD4KLTxkdD5DZWxsL0IuRS4gSURFPC9kdD4KLTxkZD4KLVRoZSBDZWxsL0IuRS4gSURFIHByb3ZpZGVzIGEgZnVsbHktZmVhdHVyZWQgSURFIGZvciBkZXZlbG9waW5nIGFwcGxpY2F0aW9ucyBmb3IgdGhlIENlbGwgQnJvYWRiYW5kIEVuZ2luZS4gSXQgaW5jbHVkZXMKLWZlYXR1cmVzIHN1Y2ggYXMgY3VzdG9tIHNvdXJjZSBjb2RlIHRlbXBsYXRlcyBmb3IgQ2VsbCBkZXZlbG9wbWVudCwgZnVsbCBjb25maWd1cmFibGUgYnVpbGQgcHJvcGVydGllcyBmb3IgUFBVIGFuZCAKLVNQVSB1c2luZyBHTlUgYW5kIFhMIGNvbXBpbGVycywgbWFuYWdlZCBidWlsZCBmb3IgUFBVIGFuZCBTUFUgdXNpbmcgR05VIGFuZCBYTCBjb21waWxlcnMsIHJlbW90ZSBsYXVuY2ggYW5kIGRlYnVnIG9mIAotQ2VsbCBhcHBsaWNhdGlvbnMsIGFuZCBzdXBwb3J0IGZvciBQUFUgJiBTUFUgY29tYmluZWQgcmVtb3RlIGRlYnVnZ2VyLiBUaGUgQ2VsbC9CLkUuIElERSBhbHNvIHByb3ZpZGVzIHN1cHBvcnQgZm9yCi1DZWxsIHBlcmZvcm1hbmNlIHRvb2xzLCB0aGUgQUxGIHByb2dyYW1taW5nIG1vZGVsLCBJQk0gUERUIChQZXJmb3JtYW5jZSBEZWJ1ZyBUb29scykgaW5zdHJ1bWVudGF0aW9uIHBsdWdpbnMsIGFuZAotTWFtYm8gU2ltdWxhdG9yIHBsdWdpbnMuCi08L2RkPgotPC9kbD4KLQotCi08cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIFRvcDwvYT4gfCA8YSBocmVmPSJ0b2MuaHRtbCI+QmFjayB0byBUYWJsZSBvZiBDb250ZW50czwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wMG92ZXJ2aWV3Lmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAwb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2UyNWYzNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAwb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+UFRQIC0gT3ZlcnZpZXcgYW5kIEZlYXR1cmVzPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxIGlkPSJ0b3AiPlBUUCAtIE92ZXJ2aWV3IGFuZCBGZWF0dXJlczwvaDE+Ci08cD48cD5UaGUgUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gKFBUUCkgaXMgYSBmcmFtZXdvcmsgZm9yIGludGVncmF0aW5nIHRvb2xzIHRvIGFpZCB0aGUgZGV2ZWxvcG1lbnQgb2YgcGFyYWxsZWwgYXBwbGljYXRpb25zIGludG8gRWNsaXBzZS4gVGhlIFBUUCBmcmFtZXdvcmsgcHJvdmlkZXMgYSByYW5nZSBvZiBzZXJ2aWNlcyB0byBzdXBwb3J0IHRvb2xzIGluIGZvdXIgbWFpbiBhcmVhczoKLTx1bD4KLTxsaT5SdW50aW1lIHRvb2xzIHRoYXQgYWxsb3cgZGV2ZWxvcGVycyB0byBtb25pdG9yIGFuZCBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgcGFyYWxsZWwgYXBwbGljYXRpb25zCi08bGk+RGVidWdnaW5nIHRvb2xzIGZvciBsb2NhdGluZyBydW50aW1lIGVycm9ycyBpbiBwYXJhbGxlbCBhcHBsaWNhdGlvbnMKLTxsaT5BbmFseXNpcyB0b29scyB0aGF0IHByb3ZpZGUgYWR2YW5jZWQgZWRpdGluZywgZXJyb3IgY2hlY2tpbmcsIGFuZCBwcm9ncmFtbWVyIGFzc2lzdGFuY2UgZm9yIGRldmVsb3BpbmcgcGFyYWxsZWwgYXBwbGljYXRpb25zCi08bGk+UGVyZm9ybWFuY2UgdG9vbHMgZm9yIGFuYWx5emluZyBhbmQgb3B0aW1pemluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgcGFyYWxsZWwgYXBwbGljYXRpb25zCi08L3VsPgotCi08aDI+UnVudGltZSBUb29sczwvaDI+Ci0KLVRoZXNlIHRvb2xzIGFpZCB0aGUgZGV2ZWxvcGVyIGluIGxhdW5jaGluZyBhbmQgbW9uaXRvcmluZyBwYXJhbGxlbCBhcHBsaWNhdGlvbnMgb24gYSByYW5nZSBvZiBsb2NhbCBhbmQgcmVtb3RlIHN5c3RlbXMuIFBUUCBwcm92aWRlcyBhIHBhcmFsbGVsIG1vZGVsIHRoYXQgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgYSAocG9zc2libHkgcmVtb3RlKSBwYXJhbGxlbCBzeXN0ZW0sIGFuZCB0aGUgYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdGhhdCBzeXN0ZW0uIFRoaXMgbW9kZWwgaW5jbHVkZXMgdGhlIG5vdGlvbiBvZiBhIDxpPnJlc291cmNlIG1hbmFnZXI8L2k+IHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbCBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0YXJnZXQgc3lzdGVtLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlIG5vcm1hbCBFY2xpcHNlIGxhdW5jaCBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSB0byBzcGVjaWZ5IHRoZSBzeXN0ZW0tc3BlY2lmYyBhdHRyaWJ1dGVzIG5lY2Vzc2FyeSB0byBsYXVuY2ggYSBwYXJhbGxlbCBqb2IsIGFuZCBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIHN5c3RlbSBhbmQgam9iIHVzaW5nIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB2aWV3cy4KLQotPGgyPkRlYnVnZ2luZyBUb29sczwvaDI+Ci0KLVBUUCBwcm92aWRlcyBhbiBpbnRlZ3JhdGVkIHBhcmFsbGVsIGRlYnVnZ2VyIHRoYXQgcHJvdmlkZXMgYSByYW5nZSBvZiBiYXNpYyBkZWJ1Z2dpbmcgZnVuY3Rpb25zIGZvciBsb2NhdGluZyBlcnJvcnMgaW4gcGFyYWxsZWwgYXBwbGljYXRpb25zLiBUaGlzIGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvIHNldCBicmVha3BvaW50cyBhbmQgY29udHJvbCBwcm9ncmFtIGV4ZWN1dGlvbiAoc2luZ2xlIHN0ZXAsIHJlc3VtZSwgZXRjLikgYWNyb3NzIGFuIGFyYml0cmFyeSBzZXQgb2YgYXBwbGljYXRpb24gcHJvY2Vzc2VzLiBUaGUgZGV2ZWxvcGVyIGNhbiBhbHNvIGRyaWxsIGRvd24gaW50byBpbmRpdmlkdWFsIHByb2Nlc3MgdG8gb2J0YWluIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2Nlc3Mgc3RhdGUsIHZhcmlhYmxlIGluZm9ybWF0aW9uLCBldGMuCi0KLTxoMj5BbmFseXNpcyBUb29sczwvaDI+Ci0KLVRoZXNlIHRvb2xzIGFyZSBidWlsdCBvbiB0aGUgQy9DKysgRGV2ZWxvcG1lbnQgVG9vbHMgKENEVCkgYWJzdHJhY3Qgc3ludGF4IHRyZWUgaW5mcmFzdHJ1Y3R1cmUgYW5kIHVzZSBzdGF0aWMgCi1hbmFseXNpcyB0ZWNobmlxdWVzIHRvIHByb3ZpZGUgYSByYW5nZSBvZiBhZHZhbmNlZCBlZGl0aW5nIGFuZCBlcnJvciBjaGVja2luZyBmZWF0dXJlcy4gRXhhbXBsZXMgaW5jbHVkZSBjb250ZW50IAotYXNzaXN0IGZvciBNUEksIE9wZW5NUCwgTEFQSSwgYW5kIFVQQyBBUElzIGFuZCBkaXJlY3RpdmVzLCBiYXJyaWVyIGFuYWx5c2lzIGZvciBNUEkgcHJvZ3JhbXMsIGFuZCBjb25jdXJyZW5jeSBhbmFseXNpcyBmb3IgT3Blbk1QIAotcHJvZ3JhbXMuICBGdXR1cmUgdmVyc2lvbnMgb2YgUFRQIHdpbGwgY29tYmluZSB0aGlzIHdpdGggdGhlIEV4dGVybmFsIFRvb2xzIEZyYW1ld29yayAgdG8gcHJvdmlkZSBkeW5hbWljIAotYW5hbHlzaXMgZnVuY3Rpb25zLCBzdWNoIGFzIHBhcmFsbGVsaXphdGlvbiBhc3Npc3RhbmNlLgotCi08aDI+RXh0ZXJuYWwgVG9vbHMgRnJhbWV3b3JrIGFuZCBQZXJmb3JtYW5jZSBUb29sczwvaDI+Ci0KLVRoZSBFeHRlcm5hbCBUb29scyBGcmFtZXdvcmsgKGZvcm1lcmx5IHRoZSBQZXJmb3JtYW5jZSBUb29scyBGcmFtZXdvcmspIHByb3ZpZGVzIGEgc2ltcGxlIG1lY2hhbmlzbSAKLWZvciBpbnRlZ3JhdGluZyBleHRlcm5hbCBwZXJmb3JtYW5jZSB0b29scywgYW5kIG90aGVyIGFyYml0cmFyeSBleHRlcm5hbCB0b29scywgd2l0aCBQVFAuIAotQnkgcHJvdmlkaW5nIGFuIFhNTCBkZXNjcmlwdGlvbiBmaWxlLCB0aGUgdG9vbCBpcyBhYmxlIHRvIGJlIGludGVncmF0ZWQgd2l0aCB0aGUgZWRpdG9yLCBidWlsZCwgYW5kIAotbGF1bmNoIHN5c3RlbXMuIEN1cnJlbnRseSwgc3VwcG9ydCBpcyBwcm92aWRlZCBmb3IgdGhlIFR1bmluZyBhbmQgQW5hbHlzaXMgVXRpbGl0aWVzIChUQVUpIHBlcmZvcm1hbmNlIGFuYWx5c2lzIAotc3lzdGVtLgotCi08cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIFRvcDwvYT4gfCA8YSBocmVmPSJ0b2MuaHRtbCI+QmFjayB0byBUYWJsZSBvZiBDb250ZW50czwvYT4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAwcHJlcmVxcy5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wMHByZXJlcXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk1ZjNhOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAwcHJlcmVxcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5QVFAgLSBQcmVyZXF1aXNpdGVzPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxIGlkPSJ0b3AiPlBUUCAtIFByZXJlcXVpc2l0ZXM8L2gxPgotCi08cD5UaGUgZm9sbG93aW5nIHByZXJlcXVpc2l0ZXMgYXJlIHJlcXVpcmVkIGZvciBQVFAgMi4xIGluc3RhbGxhdGlvbi4gRm9yIG1vcmUgCi1kZXRhaWxlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMsIHNlZQotPGEgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvUFRQL3JlbGVhc2Vfbm90ZXMvMi4xIj4KLWh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL1BUUC9yZWxlYXNlX25vdGVzLzIuMTwvYT48L3A+Ci08dWw+Ci08bGk+SmF2YSAxLjUgb3IgbGF0ZXI8L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9kb3dubG9hZHMiPkVjbGlwc2UgU0RLPC9hPiB2ZXJzaW9uIDMuNCBvciBsYXRlcjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2NkdC8iPkVjbGlwc2UgQy9DKysgRGV2ZWxvcG1lbnQgVG9vbHMgKENEVCk8L2E+IHZlcnNpb24gNS4wLjEgb3IgbGF0ZXI8L2xpPgotPGxpPk5vdGU6IHRoZSBSZW1vdGUgRGV2ZWxvcG1lbnQgVG9vbHMgcmVxdWlyZSBDRFQgNS4wLjIgb3IgbGF0ZXI8L2xpPgotPC91bD4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci0gIDx0cj4KLSAgICA8dGggY29sc3Bhbj0iNCIgc2NvcGU9ImNvbCI+UFRQIFN1cHBvcnQgTWF0cml4IDxicj48L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRoIHNjb3BlPSJjb2wiPk9wZXJhdGluZyBTeXN0ZW08L3RoPgotICAgIDx0aCBzY29wZT0iY29sIj5BcmNoaXRlY3R1cmU8L3RoPgotICAgIDx0aCBzY29wZT0iY29sIj5Db21wb25lbnRzPC90aD4KLSAgICA8dGggc2NvcGU9ImNvbCI+RGVidWdnaW5nPC90aD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD5MaW51eDwvdGQ+Ci0gICAgPHRkPng4NiwgeDg2XzY0LCBwcGM8L3RkPgotICAgIDx0ZD5FY2xpcHNlK0FnZW50czwvdGQ+Ci0gICAgPHRkPmdkYiA2LjMgLSA2Ljg8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1hY09TIFg8L3RkPgotICAgIDx0ZD54ODY8L3RkPgotICAgIDx0ZD5FY2xpcHNlK0FnZW50czwvdGQ+Ci0gICAgPHRkPmdkYiA2LjM8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPldpbmRvd3M8L3RkPgotICAgIDx0ZD54ODY8L3RkPgotICAgIDx0ZD5FY2xpcHNlIG9ubHk8L3RkPgotICAgIDx0ZD5OL0E8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPkFJWDwvdGQ+Ci0gICAgPHRkPnBwYzwvdGQ+Ci0gICAgPHRkPkVjbGlwc2UrQWdlbnRzPC90ZD4KLSAgICA8dGQ+Ti9BPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxwPlBUUCBzdXBwb3J0cyBhIG51bWJlciBvZiBwYXJhbGxlbCBydW50aW1lIHN5c3RlbXMgYW5kIGpvYiBzY2hlZHVsZXJzLiBUaGVzZSBuZWVkIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSBwcmlvciB0byB1c2luZyBQVFA6PC9wPgotPHVsPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcGVuLW1waS5vcmciPk9wZW4gTVBJPC9hPiB2ZXJzaW9uIDEuMi54IGFuZCAxLjMueDwvbGk+Ci08bGk+TVBJQ0gyIHZlcnNpb24gMS4wLjZwMSAobGF0ZXIgdmVyc2lvbnMgbWF5IHdvcmsgYnV0IGFyZSB1bnRlc3RlZCk8L2xpPgotPGxpPklCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCAoUEUpPC9saT4KLTxsaT5JQk0gTG9hZExldmVsZXIgKExMKTwvbGk+Ci08L3VsPgotCi08cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIFRvcDwvYT4gfCA8YSBocmVmPSJ0b2MuaHRtbCI+QmFjayB0byBUYWJsZSBvZiBDb250ZW50czwvYT4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAxYnVpbGRNUElwcm9nLmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAxYnVpbGRNUElwcm9nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwYmY3N2QuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wMWJ1aWxkTVBJcHJvZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5DcmVhdGluZyBhbiBNUEkgUHJvamVjdDwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotPC9oZWFkPiAKLTxib2R5PgotPGgxPkNyZWF0aW5nIGFuIE1QSSBQcm9qZWN0PC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byBjcmVhdGluZywgYnVpbGRpbmcgYW5kIGxhdW5jaGluZyBhbiBNUEkgcHJvZ3JhbS4gSXQgd2lsbCBjb3ZlciB0aGUgZm9sbG93aW5nIHN0ZXBzOgotPHVsPgotPGxpPjxhIGhyZWY9IiNjcmVhdGUiPkNyZWF0ZSB0aGUgcHJvamVjdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNjb25maWd1cmUiPkNvbmZpZ3VyZSB0byB1c2UgTVBJPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2J1aWxkIj5CdWlsZCB0aGUgZXhlY3V0YWJsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNsYXVuY2giPkxhdW5jaCB0aGUgcHJvZ3JhbTwvYT48L2xpPgotPC91bD4KLQotPGgyIGlkPSJjcmVhdGUiPlN0ZXAgMTogQ3JlYXRlIHRoZSBwcm9qZWN0PC9oMj4KLTxwPk5vdGU6IHRoaXMgdHV0b3JpYWwgdXNlcyB0aGUKLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwL2h0bWwvdG9jLmh0bWwiPlBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIChQTERUKTwvYT4gd2l6YXJkcyBmb3IgY3JlYXRpbmcgTVBJIHByb2plY3RzLiAKLVBsZWFzZSBtYWtlIHN1cmUgdGhpcyBmZWF0dXJlIGlzIGluc3RhbGxlZCBiZWZvcmUgY29udGludWluZy4KLQotPG9sPgotPGxpPjxwPlN3aXRjaCB0byB0aGUgQy9DKysgUGVyc3BlY3RpdmUgdXNpbmcgPGI+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZSAmZ3Q7IE90aGVyLi4uPC9iPiAgYW5kIHRoZW4gY2hvb3NlIDxiPkMvQysrPC9iPjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+Q3JlYXRlIGEgbmV3IE1QSSBwcm9qZWN0IHVzaW5nIHRoZSBtYW5hZ2VkIGJ1aWxkIGZhY2lsaXR5LiBTZWxlY3QgPGI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEMgUHJvamVjdCAuLi48L2I+IGFuZCB0aGUgPGI+TmV3IFByb2plY3Q8L2I+IGRpYWxvZyBzaG91bGQgb3Blbi48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPkVudGVyIGEgbmFtZSBmb3IgdGhlIHByb2plY3QgZS5nLiBNeU1QSVByb2plY3QuPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5Gcm9tIHRoZSA8Yj5Qcm9qZWN0IHR5cGVzPC9iPiBsaXN0LCBleHBhbmQgPGI+RXhlY3V0YWJsZTwvYj4gYW5kIHNlbGVjdCA8Yj5NUEkgSGVsbG8gV29ybGQgQyBQcm9qZWN0PC9iPjwvcD48cD48YnI+PC9wPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wMW5ld01QSXByb2plY3QucG5nIik8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTwvbGk+Ci08bGk+PHA+SW4gdGhlIDxiPkJhc2ljIFNldHRpbmdzPC9iPiBkaWFsb2csIGZpbGwgaW4gdGhlIGF1dGhvciBuYW1lIGFuZCBjaGFuZ2UgYW55IG90aGVyIHZhbHVlcyB5b3UgbGlrZS48L3A+PHA+PGJyPjwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDFwcm9qQmFzaWNTZXR0aW5ncy5wbmciKTwvc2NyaXB0PjwvcD48cD48YnI+PC9wPgotPHA+Q2xpY2sgPGI+TmV4dDwvYj4uPC9wPjxwPjxicj48L3A+PC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0iY29uZmlndXJlIj5TdGVwIDI6IENvbmZpZ3VyZSB0aGUgcHJvamVjdCB0byB1c2UgTVBJPC9oMj4KLTxwPjwvcD4KLTxvbD4KLTxsaT48cD5JbiB0aGUgPGI+TVBJIFByb2plY3QgU2V0dGluZ3M8L2I+IGRpYWxvZywgbWFrZSBzdXJlIDxiPkFkZCBNUEkgUHJvamVjdCBzZXR0aW5ncyB0byB0aGlzIHByb2plY3Q8L2I+IGlzIGNoZWNrZWQuCi1Zb3UgY2FuIHVuY2hlY2sgPGI+VXNlIGRlZmF1bHQgaW5mb3JtYXRpb248L2I+IGlmIHlvdSBuZWVkIHRvIGNoYW5nZSBhbnkgdmFsdWVzIGZvciBpbmNsdWRlIHBhdGhzLCBsaWJyYXJpZXMgb3Igc2VhcmNoIHBhdGgsCi1vciBNUEkgYnVpbGQgY29tbWFuZHMuPC9wPjxwPjxicj48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAxbXBpUHJvalNldHRpbmdzLnBuZyIpPC9zY3JpcHQ+PC9wPjxwPjxicj48L3A+Ci08cD5DbGljayA8Yj5GaW5pc2g8L2I+LjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+VGhlIG5ldyBwcm9qZWN0IGlzIGNyZWF0ZWQgYW5kIGFwcGVhcnMgaW4gdGhlIDxiPkMvQysrIFByb2plY3RzPC9iPiB2aWV3LiBFeHBhbmQgdGhlIDxiPnNyYzwvYj4gZm9sZGVyIHRvIHNlZSB0aGUgbmV3IHNvdXJjZSBmaWxlLjwvcD48cD48YnI+PC9wPgotPHA+PHNjcmlwdD4gZnVsbCgiaW1hZ2VzLzAxcHJvai5wbmciKSA8L3NjcmlwdD48L3A+Ci08L2xpPgotPC9vbD4KLQotPGgyIGlkPSJidWlsZCI+U3RlcCAzOiBCdWlsZCB0aGUgZXhlY3V0YWJsZTwvaDI+Ci08cD48L3A+Ci08b2w+Ci08bGk+PHA+QXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSBNUEkgaW5zdGFsbGVkIGFuZCB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjb25maWd1cmVkIGNvcnJlY3RseSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3cgYXV0bWF0aWNhbGx5IGJ1aWxkLiBXaGVuIHRoZSBhdXRvbWF0aWMgCi1idWlsZCBzZXR0aW5nIGlzIHNlbGVjdGVkLCBFY2xpcHNlIHdpbGwgYnVpbGQgdGhlIGFwcGxpY2F0aW9uIHdoZW5ldmVyIHlvdSBzYXZlIGNoYW5nZXMgaW4gYW4gZWRpdG9yLiAKLUF1dG9tYXRpYy9tYW51YWwgYnVpbGQgY2FuIGJlIHRvZ2dsZWQgYnkgc2VsZWN0aW5nIDxiPlByb2plY3QgJmd0OyBCdWlsZCBBdXRvbWF0aWNhbGx5Li4uPC9iPi4gV2hlbiAKLW1hbnVhbCBidWlsZCBpcyBzZWxlY3RlZCwgYSBidWlsZCBjYW4gYmUgaW5pdGlhdGVkIHVzaW5nIDxiPlByb2plY3QgJmd0OyBCdWlsZCBBbGw8L2I+LjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+T25jZSB0aGUgYnVpbGQgaXMgY29tcGxldGUsIGFueSBlcnJvcnMgd2lsbCBiZSBkaXNsYXllZCBpbiB0aGUgPGI+UHJvYmxlbXMgdmlldzwvYj4sIHRoZSAKLWNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzIHdpbGwgYmUgZmxhZ2dlZCwgYW5kIG1hcmtlcnMgd2lsbCBiZSBpbnN0ZXJ0ZWQgaW50byB0aGUgZWRpdG9yIHdpbmRvdy48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPkRvdWJsZS1jbGljayBvbiB0aGUgc291cmNlIGZpbGUgbmFtZSB0byBvcGVuIHRoZSBDL0MrKyBlZGl0b3IgaW4gb3JkZXIgdG8gY29ycmVjdCBhbnkgZXJyb3JzLjwvcD48cD48YnI+PC9wPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wMXdiU3JjRWRpdG9yLnBuZyIpIDwvc2NyaXB0PjwvcD48cD48YnI+PC9wPgotPC9saT4KLTxsaT48cD5EZXRhaWxzIG9mIHRoZSBjb21tYW5kcyB0aGF0IHdlcmUgZXhlY3V0ZWQgdG8gY29tcGxldGUgdGhlIGJ1aWxkIGNhbiBiZSBzZWVuIGluIHRoZSA8Yj5Db25zb2xlIAotdmlldzwvYj4gKGNsaWNrIG9uIHRoZSA8Yj5Db25zb2xlPC9iPiB0YWIgbmVhciB0aGUgYm90dG9tIHJpZ2h0IGhhbmQgY29ybmVyIG9mIHRoZSBFY2xpc3BlIAotd29ya2JlbmNoLik8L3A+PC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0ibGF1bmNoIj5TdGVwIDQ6IExhdW5jaCB0aGUgcHJvZ3JhbTwvaDI+Ci08cD48L3A+Ci08b2w+Ci08bGk+PHA+QmVmb3JlIGxhdW5jaGluZyB0aGUgcHJvZ3JhbSwgeW91IHdpbGwgbmVlZCB0byA8aT5jcmVhdGU8L2k+IGFuZCA8aT5zdGFydDwvaT4gYSAKLTxhIGhyZWY9IjAycmVzTWdyU2V0dXAuaHRtbCI+UmVzb3VyY2UgTWFuYWdlcjwvYT48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPk9uY2UgeW91IGhhdmUgdmVyaWZpZWQgdGhhdCB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyBvcGVyYXRpbmcgY29ycmVjdGx5LCB5b3UgY2FuIHRoZW4gCi08YSBocmVmPSIwM3BMYXVuY2hDb25maWcuaHRtbCI+Y3JlYXRlIGEgY29uZmlndXJhdGlvbiBhbmQgbGF1bmNoIHRoZSBwYXJhbGxlbCBwcm9ncmFtLjwvYT48L3A+PC9saT4KLTwvb2w+Ci0KLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzAycmVzTWdyU2V0dXAuaHRtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDJyZXNNZ3JTZXR1cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzU5YWFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDJyZXNNZ3JTZXR1cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+UmVzb3VyY2UgTWFuYWdlcnM8L3RpdGxlPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaGVscC5jc3MiPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotCi08aDEgaWQ9InRvcCI+Q29uZmlndXJpbmcgUmVzb3VyY2UgTWFuYWdlcnM8L2gxPgotCi08cD5Ub3BpY3MgIGluY2x1ZGU6Ci08dWw+Ci08bGk+PGEgaHJlZj0iI2RlZm4iPlJlc291cmNlIG1hbmFnZXJzPC9hPjwvbGk+Ci08bGk+U3RlcHMgZm9yIGRlZmluaW5nIGEgcmVzb3VyY2UgbWFuYWdlcjwvbGk+Ci08b2w+Ci08bGk+PGEgaHJlZj0iI2NyZWF0Ij5DcmVhdGluZyBhIHJlc291cmNlIG1hbmFnZXI8L2E+PC9saT4KLTxsaT5Db25maWd1cmluZyBhIHJlc291cmNlIG1hbmFnZXI8L2xpPgotPG9sIHR5cGU9ImEiPgotPGxpPjxhIGhyZWY9IiNsb2NhbCI+TG9jYWwgcmVzb3VyY2UgbWFuYWdlcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZW1vdGUiPlJlbW90ZSByZXNvdXJjZSBtYW5hZ2VyPC9hPjwvbGk+Ci08L29sPgotPGxpPjxhIGhyZWY9IiNzcGVjIj5SZXNvdXJjZSBtYW5hZ2VyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZmluaXNoIj5GaW5pc2hpbmcgcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3N0YXJ0Ij5TdGFydGluZyB0aGUgcmVzb3VyY2UgbWFuYWdlcjwvYT48L2xpPgotPC9vbD4KLTxsaT48YSBocmVmPSIjZWRpdCI+RWRpdGluZyBhIFJlc291cmNlIE1hbmFnZXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcm0iPlJlbW92aW5nIGEgUmVzb3VyY2UgTWFuYWdlcjwvYT48L2xpPgotPC91bD4KLTxoMiBpZD0iZGVmbiI+UmVzb3VyY2UgTWFuYWdlcnM8L2gyPgotPHA+UFRQIHVzZXMgdGhlIHRlcm0gPGk+cmVzb3VyY2UgbWFuYWdlcjwvaT4gdG8gcmVmZXIgdG8gYW55IHN1YnN5c3RlbSB0aGF0IGNvbnRyb2xzIHRoZSByZXNvdXJjZXMgcmVxdWlyZWQgZm9yIGxhdW5jaGluZyBhIHBhcmFsbGVsIGpvYi4gSWYgdGhlIHRhcmdldCBwYXJhbGxlbCBzeXN0ZW0gZW1wbG95cyBhIGpvYiBzY2hlZHVsZXIgZm9yIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBjb21wdXRlIHJlc291cmNlcywgdGhlbiB0aGUgam9iIHNjaGVkdWxlciB3b3VsZCBiZSBjb25zaWRlcmVkIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgc3lzdGVtLiBGb3IgYSBjbHVzdGVyIHdpdGggT3BlbiBNUEkgaW5zdGFsbGVkLCB0aGUgT3BlbiBNUEkgcnVudGltZSBzeXN0ZW0gd291bGQgYmUgY29uc2lkZXJlZCB0aGUgcmVzb3VyY2UgbWFuYWdlci48L3A+Ci0KLTxwPkluIG9yZGVyIGZvciBQVFAgdG8gbGF1bmNoLCBtb25pdG9yLCBhbmQgY29udHJvbCBhcHBsaWNhdGlvbnMgb24gYSB0YXJnZXQgc3lzdGVtLCBpdCBtdXN0IGtub3cgd2hhdCB0eXBlIG9mIHJlc291cmNlIG1hbmFnZXIgaXMgYmVpbmcgZW1wbG95ZWQuIFBUUCBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSBhbmQgbWFuYWdlIHJlc291cmNlIG1hbmFnZXJzIHRoYXQgY29ycmVzcG9uZCB0byB0YXJnZXQgc3lzdGVtcy4gRWFjaCByZXNvdXJjZSBtYW5hZ2VyIGNvbnRyb2xzIG9uZSB0YXJnZXQgc3lzdGVtLCBhbHRob3VnaCBhIHBhcnRpY3VsYXIgdGFyZ2V0IHN5c3RlbSBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgcmVzb3VyY2UgbWFuYWdlci48L3A+Ci0KLTxwPlJlc291cmNlIG1hbmFnZXJzIGNhbiBiZSA8aT5sb2NhbDwvaT4gb3IgPGk+cmVtb3RlPC9pPi4gQSBsb2NhbCByZXNvdXJjZSBtYW5hZ2VyIGNvbnRyb2xzIHJlc291cmNlcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBydW5uaW5nIEVjbGlwc2UuIEEgcmVtb3RlIHJlc291cmNlIG1hbmFnZXIgY29udHJvbHMgcmVzb3VyY2VzIG9uIGEgcGh5c2ljYWxseSByZW1vdGUgc3lzdGVtLiBUaGUgcHJvY2VzcyBvZiBjb25maWd1cmluZyBhIGxvY2FsIG9yIHJlbW90ZSByZXNvdXJjZSBtYW5hZ2VyIGlzIHRoZSBzYW1lLjwvcD4KLQotPGgyIGlkPSJjcmVhdCI+U3RlcCAxOiBDcmVhdGluZyBhIHJlc291cmNlIG1hbmFnZXI8L2gyPgotPHA+PC9wPgotPG9sPgotPGxpPjxwPk9wZW4gdGhlIDxiPlBUUCBSdW50aW1lIFBlcnNwZWN0aXZlPC9iPiB1c2luZyAKLTxiPldpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBPdGhlci4uLjwvYj4gYW5kIHRoZW4gY2hvb3NlIDxiPlBUUCBSdW50aW1lPC9iPiBmcm9tIHRoZSAKLWxpc3Qgb2YgcGVyc3BlY3RpdmVzLjwvcD48cD48YnI+PC9wPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wMlJ1bnRpbWVQZXJzcEVtcHR5LnBuZyIpPC9zY3JpcHQ+PC9wPjxwPjxicj48L3A+Ci08L2xpPgotPGxpPjxwPlJpZ2h0LWNsaWNrIGluIDxiPlJlc291cmNlIE1hbmFnZXJzPC9iPiB2aWV3IGFuZCBzZWxlY3QgCi08Yj5BZGQgUmVzb3VyY2UgTWFuYWdlci4uLjwvYj48L3A+PHA+PGJyPjwvcD4KLTxwPjxzY3JpcHQ+IGZ1bGwoImltYWdlcy8wMmFkZFJlc01nci5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTwvbGk+Ci08bGk+PHA+Q2hvb3NlIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRhcmdldCBzeXN0ZW0uIEluIHRoaXMgZXhhbXBsZSB3ZSAKLXdpbGwgdXNlIHRoZSA8Yj5PcGVuIE1QSTwvYj4gcmVzb3VyY2UgbWFuYWdlciwgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sIHRoZSBPcGVuIE1QSSBPcGVuIFJ1bnRpbWUgCi1FbnZpcm9ubWVudC48L3A+PHA+PGJyPjwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDJjaG9vc2VSZXNNZ3JUeXBlLU9wZW5NUEkucG5nIiwyMDApIDwvc2NyaXB0PjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+U2VsZWN0IDxiPk5leHQgJmd0OzwvYj48L3A+PC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0ibG9jYWwiPlN0ZXAgMmE6IENvbmZpZ3VyaW5nIGEgbG9jYWwgcmVzb3VyY2UgbWFuYWdlcjwvaDI+Ci08cD4KLUluIHRoaXMgZXhhbXBsZSwgd2Ugd2lsbCBzaG93IGhvdyB0byBjb25maWd1cmUgUFRQIHRvIHVzZSBhIGxvY2FsIHJlc291cmNlIG1hbmFnZXIsIGZvciBleGFtcGxlLCB3aGVyZSBFY2xpcHNlIGlzIGluc3RhbGxlZCBvbiB0aGUgaGVhZCBub2RlIG9mIGEgY2x1c3Rlci4gCi1UaGlzIHdhcyB0aGUgc2NlbmFyaW8gdGhhdCBQVFAgMS54IGhhbmRsZWQuCi08L3A+Ci08cD4KLVRoZSA8Yj5PcGVuIE1QSSBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb248L2I+IGRpYWxvZyBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBob3cgRWNsaXBzZSB3aWxsIGNvbW11bmljYXRlIHdpdGggdGhlIE9wZW4gTVBJIGVudmlyb25tZW50LgotPC9wPgotCi08b2w+Ci0JPGxpPgotCQk8cD5UbyBjb25maWd1cmUgdGhlIHNpbXBsZSBjYXNlIG9mIGEgbG9jYWwgcmVzb3VyY2UgbWFuYWdlciwgc2VsZWN0IDxiPkxvY2FsPC9iPiBhcyB0aGUgPGI+UmVtb3RlIHNlcnZpY2UgcHJvdmlkZXI8L2I+LgotCQk8L3A+Ci0JCTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDItUk0tT3Blbk1QSS1Db25uZWN0aW9uLUxvY2FsLnBuZyIsMjQwKTwvc2NyaXB0PjwvcD4KLQkJPHA+PGJyPjwvcD4KLQk8L2xpPgotCQotCTxsaT4KLQkJPHA+Rm9yIHRoZSBsb2NhbCBjYXNlLCB0aGUgPGI+UHJveHkgc2VydmVyIGxvY2F0aW9uPC9iPiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2V0IHRvIDxiPkxvY2FsPC9iPi4KLQkJPC9wPgotCQk8cD48YnI+PC9wPgotCTwvbGk+Ci0KLQk8bGk+Ci0JCTxwPgotCQlUaGUgPGI+TXVsdGlwbGV4aW5nIE9wdGlvbnM8L2I+IGFsbG93IGNvbW11bmljYXRpb24gdG8gYmUgdHVubmVsZWQgb3ZlciBhIHNpbmdsZSBjb25uZWN0aW9uIGlmIG5lY2Vzc2FyeS4gCi0JCUZvciB0aGUgbG9jYWwgY2FzZSwgaXQgaXMgbm90IHJlcXVpcmVkLCBhbmQgPGI+Tm9uZTwvYj4gc2hvdWxkIGJlIHNlbGVjdGVkLgotCQk8L3A+Ci0JCTxwPjxicj48L3A+Ci0JPC9saT4KLQotCTxsaT4KLQkJPHA+VGhlIDxiPkxvY2FsIGFkZHJlc3MgZm9yIHByb3h5IGNvbm5lY3Rpb248L2I+IHNob3VsZCBiZSBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgeW91ciBsb2NhbCBtYWNoaW5lIChpdHMgaG9zdCBuYW1lLCBJUCBhZGRyZXNzLCBvciA8Y29kZT5sb2NhbGhvc3Q8L2NvZGU+KS4KLQkJPC9wPgotCQk8cD48YnI+PC9wPgotCTwvbGk+Ci0KLTxsaT48cD5TZWxlY3QgPGI+TmV4dCAmZ3Q7PC9iPjwvcD4KLTwvb2w+Ci0KLTxoMiBpZD0icmVtb3RlIj5TdGVwIDJiOiBDb25maWd1cmluZyBhIHJlbW90ZSByZXNvdXJjZSBtYW5hZ2VyPC9oMj4KLTxwPlRoaXMgZXhhbXBsZSB3aWxsIGRlbW9uc3RyYXRlIGNvbmZpZ3VyaW5nIGEgcmVtb3RlIHJlc291cmNlIG1hbmFnZXIsIHdoZXJlCi1FY2xpcHNlIGFuZCBQVFAgYXJlIG9uIHlvdXIgbG9jYWwgbGFwdG9wIG9yIHdvcmtzdGF0aW9uLCBhbmQgUFRQCi1jb250cm9scyBhIHJlbW90ZSB0YXJnZXQgc3lzdGVtLgotCi08cD5BIHJlbW90ZSByZXNvdXJjZSBtYW5hZ2VyIGFsbG93cyBQVFAgdG8gY29udHJvbCBhIHJlbW90ZSB0YXJnZXQgbWFjaGluZS4gVG8gYWNjb21wbGlzaCB0aGlzLCBQVFAgdXNlcyB0aGUgc2VydmljZXMgb2YKLWEgPGk+cmVtb3RlIHNlcnZpY2UgcHJvdmlkZXI8L2k+LiBDdXJyZW50bHkgc3VwcG9ydGVkIHJlbW90ZSBzZXJ2aWNlIHByb3ZpZGVycyBpbmNsdWRlIHRoZSA8Yj5SZW1vdGUgVG9vbHM8L2I+IHBhY2thZ2UgKGEgcGFydAotb2YgUFRQKSBhbmQgdGhlIDxiPkVjbGlwc2UgUmVtb3RlIFN5c3RlbXMgRXhwbG9yZXIgKFJTRSk8L2I+IHdoaWNoIGlzIGFuIG9wdGlvbmFsIHBhY2thZ2UgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIGF0IGFueSB0aW1lLjwvcD4gVGhlCi1vbmx5IHJlYXNvbiB0byB1c2UgUlNFIHJhdGhlciB0aGFuIFJlbW90ZSBUb29scyBpcyBpZiB5b3VyIHJlbW90ZSBzeXN0ZW0gZG9lcyBub3QgdXNlIHRoZSA8Y29kZT5zc2g8L2NvZGU+IHByb3RvY29sIGZvciByZW1vdGUgY29ubmVjdGlvbnMsCi1vciB5b3Ugd2lzaCB0byB1c2UgdGhlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0aGF0IFJTRSBwcm92aWRlcy4gU2VlIHRoZSBSU0UgZG9jdW1lbnRhdGlvbgotZm9yIG1vcmUgaW5mb3JtYXRpb24uIFdlIHdpbGwgb25seSBjb25zaWRlciBSZW1vdGUgVG9vbHMgaGVyZSwgYnV0IHRoZSBzdGVwcyBmb3IgY29uZmlndXJpbmcgUlNFIGFyZSBzaW1pbGFyLgotCi08cD48L3A+Ci0KLTxvbD4KLQk8bGk+Ci0JCTxwPkluIHRoZSA8Yj5PcGVuIE1QSSBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb248L2I+IGRpYWxvZywgIHNlbGVjdCA8Yj5SZW1vdGUgVG9vbHM8L2I+IGFzIHRoZSA8Yj5SZW1vdGUgc2VydmljZSBwcm92aWRlcjwvYj4uCi0JCTwvcD4KLQkJPHA+PGJyPjwvcD4KLQkJPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wMi1STS1PcGVuTVBJLUNvbm5lY3Rpb24tUmVtb3RlMC5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLQk8L2xpPgotCQotCTxsaT4KLQkJPHA+Ci0JCUF0IHRoaXMgcG9pbnQsIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSBhIDxiPlByb3h5IHNlcnZlciBsb2NhdGlvbjwvYj4uCi0JCVRoaXMgd2lsbCBkaWZmZXIgZGVwZW5kaW5nIG9uIHRoZSByZW1vdGUgc2VydmljZSBwcm92aWRlciB0aGF0IHlvdSBzZWxlY3RlZCBpbiB0aGUgcHJldmlvdXMgc3RlcC4gCi0JCVRoZSBmb2xsb3dpbmcgc3RlcHMgZGVzY3JpYmUgY29uZmlndXJpbmcgYSA8Yj5SZW1vdGUgVG9vbHM8L2I+IGxvY2F0aW9uLgotCQk8L3A+Ci0JCTxwPjxicj48L3A+Ci0JPC9saT4KLQkKLQk8b2wgdHlwZT0iYSI+Ci0JCTxsaT4KLQkJCTxwPlNlbGVjdCA8Yj5OZXcuLi48L2I+PC9wPgotCQkJPHA+PGJyPjwvcD4KLQkJPC9saT4JCQotCQk8bGk+Ci0JCQk8cD5JbiB0aGUgPGI+UmVtb3RlIEhvc3Q8L2I+IGRpYWxvZywgZW50ZXIgYSBuYW1lIGZvciB0aGUgY29ubmVjdGlvbiBpbiB0aGUgPGI+VGFyZ2V0IE5hbWU8L2I+IGZpZWxkIChjYW4gYmUgYW55dGhpbmcpLjwvcD4KLQkJCTxwPjxicj48L3A+Ci0JCQk8cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAybmV3UmVtb3RlSG9zdC5wbmciKSA8L3NjcmlwdD48L3A+Ci0JCQk8cD48YnI+PC9wPgotCQk8L2xpPgotCQk8bGk+PHA+U2VsZWN0IHRoZSA8Yj5SZW1vdGUgSG9zdDwvYj4gcmFkaW8gYnV0dG9uLjwvcD48cD48YnI+PC9wPjwvbGk+Ci0JCTxsaT48cD5FbnRlciB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3QgaW4gdGhlIDxiPkhvc3Q8L2I+IGZpZWxkLjwvcD48cD48YnI+PC9wPjwvbGk+Ci0JCTxsaT48cD5UaGUgPGI+UG9ydDwvYj4gZmllbGQgc2hvdWxkIGJlIGxlZnQgYXQgPGNvZGU+MjI8L2NvZGU+IHVubGVzcyB5b3VyIGluc3RhbGxhdGlvbiB1c2VzIGEgZGlmZmVyZW50IHBvcnQgZm9yIDxjb2RlPnNzaDwvY29kZT4gY29ubmVjdGlvbnMuPC9wPjxwPjxicj48L3A+PC9saT4KLQkJPGxpPjxwPkVudGVyIHlvdXIgdXNlciBuYW1lIG9uIHRoZSByZW1vdGUgbWFjaGluZSBpbiB0aGUgPGI+VXNlcjwvYj4gZmllbGQuPC9wPjxwPjxicj48L3A+PC9saT4KLQkJPGxpPjxwPklmIHlvdSB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb24sIHNlbGVjdCB0aGUgPGI+UGFzc3dvcmQgYmFzZWQgYXV0aGVudGljYXRpb248L2I+IHJhZGlvIGJ1dHRvbiBhbmQgZW50ZXIgdGhlIHBhc3N3b3JkIGluIHRoZSA8Yj5QYXNzd29yZDwvYj4gZmllbGQuPC9wPjxwPjxicj48L3A+PC9saT4KLQkJPGxpPjxwPklmIHlvdSB1c2Uga2V5IGJhc2VkIGF1dGhlbnRpY2F0aW9uLCBzZWxlY3QgdGhlIDxiPlB1YmxpYyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb248L2I+IHJhZGlvIGJ1dHRvbiwgc2VsZWN0IHRoZSBmaWxlIGNvbnRhaW5pbmcgeW91ciBwdWJsaWMga2V5LCBhbmQgZW50ZXIgdGhlIHBhc3NwaHJhc2UgZm9yIHlvdXIga2V5IChvciBsZWF2ZSBibGFuayBpZiB5b3UgZG9uJ3QgdXNlIGEgcGFzc3BocmFzZSkuPC9wPjxwPjxicj48L3A+PC9saT4KLQkJPGxpPjxwPkNsaWNrIDxiPkZpbmlzaDwvYj48L3A+PHA+PGJyPjwvcD48L2xpPgotCTwvb2w+Ci0KLQk8bGk+Ci0JCTxwPlRoZSA8Yj5NdWx0aXBsZXhpbmcgT3B0aW9uczwvYj4gYWxsb3cgY29tbXVuaWNhdGlvbiB0byBiZSB0dW5uZWxlZCBvdmVyIGEgc2luZ2xlIGNvbm5lY3Rpb24gaWYgc3VwcG9ydGVkIGJ5IHRoZSByZW1vdGUgc2VydmljZSBwcm92aWRlci4gCi0JCVRvIGVuYWJsZSB0dW5uZWxpbmcsIHNlbGVjdCB0aGUgPGI+VXNlIHBvcnQgZm9yd2FyZGluZzwvYj4gcmFkaW8gYnV0dG9uLjwvcD4KLQkJPHA+PGJyPjwvcD4KLQk8L2xpPgotCi0JPGxpPgotCQk8cD4KLQkJSWYgeW91IGRvbid0IHdpc2ggdG8gdXNlIHBvcnQgZm9yd2FyZGluZywgc2VsZWN0IHRoZSA8Yj5Ob25lPC9iPiByYWRpbyBidXR0b24gYW5kIGVudGVyIHRoZSBhZGRyZXNzIG9mIHlvdXIgbG9jYWwgbWFjaGluZSAoaXRzIGhvc3QgbmFtZSwgb3IgSVAgYWRkcmVzcykgaW4gdGhlIDxiPkxvY2FsIGFkZHJlc3MgZm9yIHByb3h5IGNvbm5lY3Rpb248L2I+IGZpZWxkLiAKLQkJTm90ZSB0aGF0IGlmIHlvdXIgc2l0ZSBkb2VzIG5vdCBhbGxvdyBvdXRib3VuZCBjb25uZWN0aW9ucyBmcm9tIHRoZSByZW1vdGUgbWFjaGluZSB0byB5b3VyIGxvY2FsIG1hY2hpbmUsIHRoZW4geW91IDxpPm11c3Q8L2k+IHVzZSBwb3J0IGZvcndhcmRpbmcuPC9wPgotCQk8cD48YnI+PC9wPgotCTwvbGk+Ci0KLQk8bGk+PHA+U2VsZWN0IDxiPk5leHQgJmd0OzwvYj48L3A+PC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0ic3BlYyI+U3RlcCAzOiBSZXNvdXJjZSBtYW5hZ2VyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb248L2gyPgotPHA+VGhlIG5leHQgcGFnZSB3aWxsIHNob3cgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgbWFuYWdlci4gCi1JbiB0aGlzIGNhc2UsIHRoZSA8Yj5PcGVuIE1QSSB0b29sIGNvbmZpZ3VyYXRpb248L2I+IGRpYWxvZyBpcyBzaG93bi4gCi1Zb3Ugd2lsbCBub3Qgbm9ybWFsbHkgbmVlZCB0byBjaGFuZ2UgdGhpcyBpbmZvcm1hdGlvbi4gSnVzdCBzZWxlY3QgdGhlIDxiPk9wZW4gTVBJIHZlcnNpb248L2I+IGluc3RhbGxlZCBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUsIGFuZCBkZWZhdWx0IHZhbHVlcyB3aWxsIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGludG8gdGhlIGZpZWxkcy48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAyLVJNLU9wZW5NUEktQ29uZmlndXJhdGlvbi5wbmciKSA8L3NjcmlwdD48L3A+Ci08b2w+Ci08bGk+PHA+SWYgeW91IHdpc2ggdG8gc3BlY2lmeSB0aGUgY29tbWFuZHMgZm9yIHRoZSBPcGVuIE1QSSBlbnZpcm9ubWVudCwgb3IgYWRkIGV4dHJhIGFyZ3VtZW50cywgCi11bmNoZWNrIHRoZSA8Yj5Vc2UgZGVmYXVsdCBzZXR0aW5nczwvYj4gY2hlY2tib3guPC9wPgotPHA+PGJyPjwvcD48L2xpPgotPG9sPgotPGxpPjxwPjxiPkxhdW5jaCBjb21tYW5kPC9iPjogQSBjb21tYW5kIGxpbmUgZXhlY3V0ZWQgdG8gbGF1bmNoIHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiB3aXRoIE9wZW4gTVBJLjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+PGI+RGVidWcgY29tbWFuZDwvYj46IEEgY29tbWFuZCBsaW5lIGV4ZWN1dGVkIHRvIHVzZSBPcGVuIE1QSSB0byBsYXVuY2ggYSBkZWJ1ZyBzZXNzaW9uIGZvciB0aGUgcGFyYWxsZWwgYXBwbGljYXRpb24uPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD48Yj5EaXNjb3ZlciBjb21tYW5kPC9iPjogQSBjb21tYW5kIGxpbmUgZXhlY3V0ZWQgd2hlbiB0aGUgUmVzb3VyY2UgTWFuYWdlciBpcyBzdGFydGVkLCB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBPcGVuIE1QSSBlbnZpcm9ubWVudC4uPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD48Yj5QYXRoIHRvIGluc3RhbGxhdGlvbjwvYj46IElmIG5vdCBlbXB0eSwgdGhlbiBhbGwgY29tbWFuZHMgYXJlIHByZWZpeGVkIHdpdGggdGhpcyBwYXRoLjwvcD48cD48YnI+PC9wPjwvbGk+Ci08L29sPgotPHA+T25seSBhIHNpbmdsZSBjb21tYW5kIGlzIGFsbG93ZWQgb24gZWFjaCBjb21tYW5kIGZpZWxkLgotU2V2ZXJhbCBwbGFjZSBob2xkZXJzIChtYWNyb3MpIGFyZSBhbGxvd2VkLCB0aGUgbW9zdCByZWxldmFudCBhcmU6PC9wPgotPHVsPgotPGxpPjxiPk9wZW5fTVBJX2FyZ3M8L2I+OiBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgbXBpcnVuIGNvbW1hbmQsIHNwZWNpZnlpbmcgb3B0aW9ucyBzZWxlY3RlZCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZGlhbG9nLjwvbGk+Ci08bGk+PGI+T3Blbl9NUElfZW52PC9iPjogQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIG1waXJ1biBjb21tYW5kLCBzcGVjaWZ5aW5nIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvbGk+Ci08bGk+PGI+ZXhlY1BhdGg8L2I+IGFuZCA8Yj5leGVjTmFtZTwvYj46IFBhdGggYW5kIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgb2YgdGhlIHBhcmFsbGVsIGFwcGxpY2F0aW9uIHRvIGJlIGxhdW5jaGVkIGJ5IG1waXJ1bi4KLTxsaT48Yj5wcm9nQXJnczwvYj46IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHBhcmFsbGVsIGFwcGxpY2F0aW9uLjwvbGk+Ci08L3VsPgotPGxpPjxwPlNlbGVjdCA8Yj5OZXh0ICZndDs8L2I+PC9wPjwvbGk+Ci08L29sPgotCi08aDIgaWQ9ImZpbmlzaCI+U3RlcCA0OiBGaW5pc2hpbmcgcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9uPC9oMj4KLTxwPlRoZSBmaW5hbCBkaWFsb2cgaXMgPGI+Q2hvb3NlIFJlc291cmNlIE1hbmFnZXIgTmFtZSBhbmQgRGVzY3JpcHRpb248L2I+IHdoaWNoIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5Ci10byBjaGFuZ2UgaG93IHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIGRpc3BsYXllZC48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAyQ2hvb3NlUmVzTWdyTmFtZUFuZERlc2MucG5nIikgPC9zY3JpcHQ+PC9wPgotPG9sPgotPGxpPjxwPklmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgbmFtZSBvciBkZXNjcmlwdGlvbiwgdW5jaGVjayB0aGUgPGI+VXNlIGRlZmF1bHQgbmFtZSBhbmQgCi1kZXNjcmlwdGlvbjwvYj4gY2hlY2tib3guPC9wPjxwPjxicj48L3A+PC9saT4KLTxvbD4KLTxsaT48cD5FbnRlciBhIG5ldyBuYW1lIGluIHRoZSA8Yj5OYW1lPC9iPiBmaWVsZC4gQW55dGhpbmcgY2FuIGJlIGVudGVyZWQuPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT4KLSAgPHA+RW50ZXIgYSBuZXcgZGVzY3JpcHRpb24gaW4gdGhlIDxiPkRlc2NyaXB0aW9uPC9iPiBmaWVsZC4gQW55dGhpbmcgY2FuIGJlIGVudGVyZWQuPC9wPjxwPjxicj48L3A+Ci08L2xpPgotPC9vbD4KLTxsaT48cD5TZWxlY3QgPGI+RmluaXNoPC9iPjwvcD48L2xpPgotPC9vbD4KLTxwPlRoZSBuZXcgUmVzb3VyY2UgTWFuYWdlciBzaG91bGQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIFJlc291cmNlCi1NYW5hZ2Vycy48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1MaXN0LnBuZyIpIDwvc2NyaXB0PjwvcD4KLQotPGgyIGlkPSJzdGFydCI+U3RlcCA1OiBTdGFydGluZyB0aGUgcmVzb3VyY2UgbWFuYWdlcjwvaDI+Ci08cD48L3A+Ci08b2w+Ci08bGk+PHA+VG8gc3RhcnQgdGhlIHJlc291cmNlIG1hbmFnZXIsIHJpZ2h0IG1vdXNlIGNsaWNrIG9uIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGluIHRoZSA8Yj5SZXNvdXJjZSAKLU1hbmFnZXJzIHZpZXc8L2I+LCB0aGVuIHNlbGVjdCA8Yj5TdGFydCBSZXNvdXJjZSBNYW5hZ2VyPC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuPC9wPjxwPjxicj48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1TdGFydC5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTwvbGk+Ci08bGk+PHA+VGhlIHJlc291cmNlIG1hbmFnZXIgaWNvbiBzaG91bGQgY2hhbmdlIGNvbG9yIHRvIGdyZWVuIHRvIGluZGljYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSAKLXN0YXJ0ZWQuPC9wPjxwPjxicj48L3A+Ci0gIDxwPjxzY3JpcHQ+IGZ1bGwoImltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctUnVubmluZy5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTwvbGk+Ci08bGk+Ci0gIDxwPkluIHRoZSA8Yj5NYWNoaW5lcyB2aWV3PC9iPiB5b3Ugc2hvdWxkIHNlZSBhbiBpY29uIHJlcHJlc2VudGluZyB5b3VyIHRhcmdldCBzeXN0ZW0gYW5kIGljb25zIAotICBzaG93aW5nIHN0YXR1cyBvZiB0aGUgbm9kZShzKS48L3A+PHA+PGJyPjwvcD4KLSAgPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctTWFjaGluZXMucG5nIikgPC9zY3JpcHQ+PC9wPjxwPjxicj48L3A+Ci08L2xpPgotPGxpPjxwPklmIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZhaWxzIHRvIHN0YXJ0ICh0aGUgaWNvbiBpcyByZWQpLCByaWdodCBjbGljayBvbiB0aGUgcmVzb3VyY2UgCi1tYW5hZ2VyIGFuZCBzZWxlY3QgPGI+U3RvcCBSZXNvdXJjZSBNYW5hZ2VyPC9iPi4gQ2hlY2sgdGhlIGxvZyBmaWxlcyBmb3IgdGhlIHJlYXNvbiB0aGF0IHRoZSAKLXJlc291cmNlIG1hbmFnZXIgZmFpbGVkIHRvIHN0YXJ0LCBjb3JyZWN0IHRoZSBlcnJvciBhbmQgcmVzdGFydCBhZ2Fpbi48L3A+PC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0iZWRpdCI+RWRpdGluZyBhIHJlc291cmNlIG1hbmFnZXI8L2gyPgotPHA+SXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYW4gZXhpc3RpbmcgcmVzb3VyY2UgbWFuYWdlciwgZm9yIGV4YW1wbGUsIHRvIGNoYW5nZSB0aGUgcmVtb3RlIG1hY2hpbmUgdGhhdCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb250cm9scy4gTm90ZSB0aGF0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNhbm5vdCBiZSBlZGl0ZWQgd2hlbiBpdCBpcyBydW5uaW5nLjwvcD4KLTxvbD4KLTxsaT48cD5JZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyBydW5uaW5nLCBzdG9wIGl0IGZpcnN0LiBSaWdodC1jbGljayBvbiB0aGUgcmVzb3VyY2UgbWFuYWdlciBhbmQgCi1zZWxlY3QgPGI+U3RvcCBSZXNvdXJjZSBNYW5hZ2VyPC9iPjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+UmlnaHQtY2xpY2sgb24gdGhlIHJlc291cmNlIG1hbmFnZXIgYW5kIHNlbGVjdCA8Yj5FZGl0IFJlc291cmNlIE1hbmFnZXI8L2I+PHA+PGJyPjwvcD48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1FZGl0LnBuZyIpIDwvc2NyaXB0PjwvcD48cD48YnI+PC9wPgotPC9saT4KLTxsaT48cD5Nb2RpZnkgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYW5kIGNsaWNrIDxiPkZpbmlzaDwvYj4uPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5SZXN0YXJ0IHRoZSByZXNvdXJjZSBtYW5hZ2VyLjwvcD48L2xpPgotPC9vbD4KLQotPGgyIGlkPSJybSI+UmVtb3ZpbmcgYSBSZXNvdXJjZSBNYW5hZ2VyPC9oMj4KLTxwPklmIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIG5vIGxvbmdlciByZXF1aXJlZCwgaXQgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgPGI+UmVzb3VyY2UgTWFuYWdlcnMgdmlldzwvYj48L3A+Ci08b2w+Ci08bGk+PHA+SWYgdGhlIHJlc291cmNlIG1hbmFnZXIgaXMgcnVubmluZywgc3RvcCBpdCBmaXJzdC4gUmlnaHQtY2xpY2sgb24gdGhlIHJlc291cmNlIG1hbmFnZXIgYW5kIAotc2VsZWN0IDxiPlN0b3AgUmVzb3VyY2UgTWFuYWdlcjwvYj48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPlJpZ2h0LWNsaWNrIG9uIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGFuZCBzZWxlY3QgPGI+UmVtb3ZlIFJlc291cmNlIE1hbmFnZXI8L2I+PC9wPjxwPjxicj48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1SZW1vdmUucG5nIikgPC9zY3JpcHQ+PC9wPjxwPjxicj48L3A+Ci08L2xpPgotPGxpPgotICA8cD5Zb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBjb25maXJtIHJlbW92YWwuIENsaWNrIDxiPk9LPC9iPjwvcD4KLTwvbGk+Ci08L29sPgotCi0KLTxwPlByb2NlZWQgdG8gPGEgaHJlZj0iMDNwTGF1bmNoQ29uZmlnLmh0bWwiPkxhdW5jaGluZyBhIHBhcmFsbGVsIGFwcGxpY2F0aW9uPC9hPi4KLTxwPiZuYnNwOwotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wM3BMYXVuY2hDb25maWcuaHRtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDNwTGF1bmNoQ29uZmlnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4ZmE4YjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wM3BMYXVuY2hDb25maWcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkxhdW5jaGluZyBQYXJhbGxlbCBQcm9ncmFtcyA8L3RpdGxlPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaGVscC5jc3MiPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotCi08aDEgaWQ9InRvcCI+TGF1bmNoaW5nIFBhcmFsbGVsIFByb2dyYW1zPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHRvIGxhdW5jaCBhIHBhcmFsbGVsIHByb2dyYW0uIExhdW5jaGluZyByZXF1aXJlcyB0aGUgc2VydmljZXMgb2YgYSByZXNvdXJjZSBtYW5hZ2VyLCB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHNldCB1cCBhcyBkZXNjcmliZWQgaW4gPGEgaHJlZj0iMDJyZXNNZ3JTZXR1cC5odG1sIj5SZXNvdXJjZSBNYW5hZ2VyczwvYT4uIFBUUCBpcyBhYmxlIHRvIGxhdW5jaCBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgdG8gdXNlIGFuIE1QSSBydW50aW1lIHN5c3RlbSwgdGhvc2UgY29tcGlsZWQgdG8gdXNlIHRoZSBPcGVuTVAgc3lzdGVtLCBhbmQgYSBjb21iaW5hdGlvbiBvZiBNUEkgYW5kIE9wZW5NUC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBsYXVuY2ggbXVsdGlwbGUgY29waWVzIG9mIGEgc2VxdWVudGlhbCBwcm9ncmFtIHNvIHRoYXQgdGhleSBleGVjdXRlIHNpbXVsdGFuZW91c2x5LgotCi08cD5Ub3BpY3MgIGluY2x1ZGU6Ci08b2w+Ci08bGk+PGEgaHJlZj0iI2NyZWF0ZSI+Q3JlYXRpbmcgYSBwYXJhbGxlbCBsYXVuY2ggY29uZmlndXJhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZXNvdXJjZXMiPkNvbXBsZXRpbmcgdGhlIDxiPlJlc291cmNlcyB0YWI8L2I+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2FwcGxpY2F0aW9uIj5Db21wbGV0aW5nIHRoZSA8Yj5BcHBsaWNhdGlvbiB0YWI8L2I+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3N5bmNocm9uaXplIj5Db21wbGV0aW5nIHRoZSA8Yj5TeW5jaHJvbml6ZSB0YWI8L2I+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2RlYnVnZ2VyIj5Db21wbGV0aW5nIHRoZSA8Yj5EZWJ1Z2dlciB0YWI8L2I+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2FyZ3VtZW50cyI+Q29tcGxldGluZyB0aGUgPGI+QXJndW1lbnRzIHRhYjwvYj48L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbGF1bmNoIj5MYXVuY2hpbmcgdGhlIGFwcGxpY2F0aW9uPC9iPjwvYT48L2xpPgotPC9vbD4KLQotPGgyIGlkPSJjcmVhdGUiPlN0ZXAgMTogQ3JlYXRlIGEgcGFyYWxsZWwgbGF1bmNoIGNvbmZpZ3VyYXRpb248L2gyPgotPHA+Tm90ZTogQXQgbGVhc3Qgb25lIHJlc291cmNlIG1hbmFnZXIgbXVzdCBoYXZlIGJlZW4gY29uZmlndXJlZCBhbmQgc3RhcnRlZCBiZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlCi1hIHBhcmFsbGVsIGxhdW5jaCBjb25maWd1cmF0aW9uLgotPG9sPgotPGxpPjxwPk9wZW4gdGhlIHJ1biBjb25maWd1cmF0aW9uIGRpYWxvZyB1c2luZyA8Yj5SdW4gJmd0OyBPcGVuIFJ1biBEaWFsb2cuLi48L2I+Ci1vciBjbGljayB0aGUgcnVuIGljb24gbWVudSBvbiB0aGUgdG9vbCBiYXIgYW5kIHNlbGVjdCA8Yj5PcGVuIFJ1biBEaWFsb2cuLi48L2I+PC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5DcmVhdGUgYSBuZXcgcGFyYWxsZWwgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYnkgY2xpY2tpbmcgPGI+UGFyYWxsZWwgQXBwbGljYXRpb248L2I+IGFuZAotdGhlbiBjbGlja2luZyBvbiB0aGUgPGI+TmV3PC9iPiBidXR0b24gaWNvbi48L3A+PHA+PGJyPjwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDNsYXVuY2gxLnBuZyIpIDwvc2NyaXB0PjwvcD48cD48YnI+PC9wPgotPC9saT4KLTxsaT48cD5FbnRlciBhIG5hbWUgZm9yIHRoZSBjb25maWd1cmF0aW9uIGluIHRoZSA8Yj5OYW1lOjwvYj4gZmllbGQuIEhlcmUgd2UgdXNlIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByb2plY3QuPC9wPjwvbGk+Ci08L29sPgotCi08aDIgaWQ9InJlc291cmNlcyI+U3RlcCAyOiBDb21wbGV0ZSB0aGUgUmVzb3VyY2VzIHRhYjwvaDI+Ci08cD5UaGUgPGI+UmVzb3VyY2VzIHRhYjwvYj4gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByZXNvdXJjZXMgcmVxdWlyZWQgZm9yIHRoZSBqb2IgZXhlY3V0aW9uLiBUaGUgY29udGVudHMgb2YgdGhpcyB0YWIgd2lsbCB2YXJ5IGZvciBkaWZmZXJlbnQgcmVzb3VyY2UgbWFuYWdlcnMuIFRoaXMgZGVzY3JpcHRpb24gb25seSBhcHBseXMgdG8gdGhlIE9wZW4gTVBJIGFuZCBNUElDSDIgcmVzb3VyY2UgbWFuYWdlcnMuPC9wPgotPG9sPgotPGxpPjxwPlNlbGVjdCBhIHJlc291cmNlIG1hbmFnZXIgZnJvbSB0aGUgZHJvcC1kb3duIChOb3RlOiBhIHJlc291cmNlIG1hbmFnZXIKLW11c3QgYmUgcnVubmluZyBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZSBsaXN0LiBJZiB0aGVyZSBpcyBvbmx5IG9uZSByZXNvdXJjZSBtYW5hZ2VyIHJ1bm5pbmcsIHRoZW4gaXQgd2lsbCBiZQotYXV0b21hdGljYWxseSBzZWxlY3RlZC4pPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5Tb21lIHJlc291cmNlIG1hbmFnZXJzIHJlcXVpcmUgYSBqb2IgcXVldWUgdG8gYmUgc2VsZWN0ZWQgdXNpbmcgYSA8Yj5RdWV1ZTo8L2I+IGRyb3AtZG93bi4gSWYgdGhlcmUgaXMKLW5vIGRyb3AtZG93biwgdGhlbiB0aGlzIHJlc291cmNlIG1hbmFnZXIgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBxdWV1ZXMuPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5FbnRlciBhIHZhbHVlIGluIHRoZSA8Yj5OdW1iZXIgb2YgUHJvY2Vzc2VzPC9iPiBmaWVsZC4gVGhpcyBmaWVsZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGluIAotb3JkZXIgdG8gbGF1bmNoIGEgam9iLCBhbmQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRvIHVzZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxhdW5jaC48L3A+PHA+PGJyPjwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDNsYXVuY2hSZXNUYWIucG5nIikgPC9zY3JpcHQ+PC9wPgotPC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0iYXBwbGljYXRpb24iPlN0ZXAgMzogQ29tcGxldGUgdGhlIDxiPkFwcGxpY2F0aW9uPC9iPiB0YWI8L2gyPgotPHA+VGhlIDxiPkFwcGxpY2F0aW9uIHRhYjwvYj4gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBhcHBsaWNhdGlvbiAoZXhlY3V0YWJsZSkgdG8gYmUgbGF1bmNoZWQuPC9wPgotPG9sPgotPGxpPjxwPkVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IHRoZSA8Yj5QYXJhbGxlbCBQcm9qZWN0PC9iPiBpcyBzZWxlY3RlZC4gVGhpcyBpcyB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBzb3VyY2UKLWFuZCBiaW5hcmllcyBmb3IgdGhlIGFwcGxpY2F0aW9uLjwvcD48cD48YnI+PC9wPjwvbGk+Ci0KLTxsaT48cD5TZWxlY3QgdGhlIDxiPkFwcGxpY2F0aW9uIFByb2dyYW08L2I+IChleGVjdXRhYmxlKSB5b3Ugd2lzaCB0byBsYXVuY2guIAotSWYgdGhlIFJlc291cmNlIE1hbmFnZXIgaXMgY29ubmVjdGVkIHRvIGEgcmVtb3RlIHRhcmdldCwgdGhlbiB0aGlzIG1lYW5zIHRoZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIG9uIHRoZSByZW1vdGUgdGFyZ2V0LiAKLU90aGVyd2lzZSwgZm9yIGEgUmVzb3VyY2UgTWFuYWdlciBvbiB0aGUgbG9jYWwgbWFjaGluZSwgaXQgc2hvdWxkIGJlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIHdpdGhpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuIDwvcD48cD48YnI+PC9wPjwvbGk+Ci0KLTxsaT48cD5JZiB5b3UgYXJlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIG9uIGEgcmVtb3RlIG1hY2hpbmUgYW5kIHRoZSBwcm9qZWN0IHdhcyA8aT5idWlsdDwvaT4gbG9jYWxseSwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIGNvcHkgCi10aGUgZXhlY3V0YWJsZSB0byB0aGUgcmVtb3RlIG1hY2hpbmUgZmlyc3QuIEZvciB0aGlzIHB1cnBvc2UsIHlvdSBtYXkgZW5hYmxlIDxiPkNvcHkgZXhlY3V0YWJsZSBmcm9tIGxvY2FsIGZpbGVzeXN0ZW08L2I+IGFuZCBmaWxsCi08Yj5QYXRoIHRvIHRoZSBsb2NhbCBmaWxlPC9iPiB3aXRoIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIHdpdGhpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuIFRoaXMgY29uZmlndXJlcyB0aGUgbGF1bmNoZXIgdG8gY29weSB0aGUgCi1leGVjdXRhYmxlIGF1dG9tYXRpY2FsbHkgdG8gdGhlIHJlbW90ZSB0YXJnZXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBydW4vZGVidWcgc2Vzc2lvbi4gSWYgbm90IGVuYWJsZWQsIHRoZW4geW91IHdpbGwgbmVlZCB0bwotY29weSB0aGUgZXhlY3V0YWJsZSBtYW51YWxseSB0byB0aGUgcmVtb3RlIHRhcmdldC48L3A+Ci08cD48YnI+PC9wPgotPC9saT4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDNsYXVuY2g2LnBuZyIpIDwvc2NyaXB0PjwvcD48cD48YnI+PC9wPgotCi08bGk+PHA+SWYgeW91IHdpc2ggdG8gaGF2ZSB0aGUgb3V0cHV0IGZyb20gYWxsIHByb2Nlc3NlcyBpbiBhIHNpbmdsZSBvdXRwdXQgY29uc29sZSwKLWNoZWNrIHRoZSA8Yj5EaXNwbGF5IGNvbWJpbmVkIG91dHB1dCBpbiBhIGNvbnNvbGUgdmlldzwvYj4gb3B0aW9uLjwvcD48cD48YnI+PC9wPgotPC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0ic3luY2hyb25pemUiPlN0ZXAgNDogQ29tcGxldGUgdGhlIDxiPlN5bmNocm9uaXplPC9iPiB0YWI8L2gyPgotPHA+Ci1UaGUgPGI+U3luY2hyb25pemUgdGFiPC9iPiBpcyB1c2VkIGluIHNjZW5hcmlvcyB3aGVyZSB0aGUgUmVzb3VyY2UgTWFuYWdlciBpcyBjb25uZWN0ZWQgdG8gYSByZW1vdGUgdGFyZ2V0LgotVGhlIHRhYiBzcGVjaWZpZXMgcnVsZXMgdGhhdCBkZXNjcmliZSBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IG5lZWQgdG8gYmUgY29waWVkICg8aT51cGxvYWRlZDwvaT4pIHRvIHRoZSByZW1vdGUgdGFyZ2V0IGJlZm9yZSBzdGFydGluZyB0aGUgcGFyYWxsZWwgYXBwbGljYXRpb24gZXhlY3V0aW9uLiAKLVR5cGljYWxseSwgdGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8gdXBsb2FkIGRlcGVuZGVuY2llcyAobGlrZSBkeW5hbWljIGxpYnJhcmllcykgb3IgaW5wdXQgZGF0YSBmb3IgdGVzdCBjYXNlcy4KLTwvcD4KLTxwPgotVGhpcyB0YWIgYWxzbyBhbGxvd3MgdG8gc3BlY2lmeSBydWxlcyBkZXNjcmliaW5nIGZpbGVzIG9uIHRoZSByZW1vdGUgaG9zdCB0byBiZSByZXRyaWV2ZWQgYmFjayAoPGk+ZG93bmxvYWRlZDwvaT4pIHRvIHRoZSBsb2NhbCBob3N0IGFmdGVyIHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBmaW5pc2hlcyBleGVjdXRpb24sIGFzIG91dHB1dCBkYXRhIHByb2R1Y2VkIGJ5IHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBleGVjdXRpb24uCi08L3A+Ci0KLTxvbD4KLTxsaT48cD5JZiB5b3Ugd2lzaCB0byBlbmFibGUgZmlsZSB0cmFuc2ZlciB0byB0aGUgcmVtb3RlIHRhcmdldCwgZW5hYmxlIHRoZSA8Yj5VcGxvYWQgcnVsZXMgZW5hYmxlZDwvYj4gb3IKLTxiPkRvd25sb2FkIHJ1bGVzIGVuYWJsZWQ8L2I+IGFjY29yZGluZyB3aGljaCBkaXJlY3Rpb24gb2YgZmlsZSB0cmFuc2ZlciBpcyByZXF1aXJlZC48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAzbGF1bmNoNy5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTwvbGk+Ci0KLTxsaT4KLTxwPgotSW4gb3JkZXIgdG8gc3BlY2lmeSBmaWxlcyB0byBiZSBjb3BpZWQgdG8gdGhlIHJlbW90ZSB0YXJnZXQgKDxpPnVwbG9hZGVkPC9pPiksIGNsaWNrIG9uIDxiPk5ldyB1cGxvYWQgcnVsZTwvYj4uCi08L3A+Ci08cD4KLUFuIHVwbG9hZCBydWxlIGxpc3RzIGEgY29sbGVjdGlvbiBvZiBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IHNoYWxsIGJlIGNvcGllZCBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeS4KLTwvcD4KLTxwPgotSWYgPGI+VXNlIGRpcmVjdG9yeSBmcm9tIGxhdW5jaCBjb25maWd1cmF0aW9uPC9iPiBpcyBlbmFibGVkLCB0aGVuIHRoZSBsaXN0ZWQgZmlsZXMgb3IgZGlyZWN0b3JpZXMgYXJlIGNvcGllZCB0byB0aGUgd29ya2luZyBkaXJlY3Rvcnkgc3BlY2lmaWVkIG9uIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbi4gCi1BdCB0aGUgbW9tZW50LCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gc2FtZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZXhlY3V0YWJsZSBmb3IgdGhlIHBhcmFsbGVsIGFwcGxpY2F0aW9uLiAKLUlmIG5vdCBlbmFibGVkLCB0aGV5IHlvdSBtdXN0IHNwZWNpZnkgb24gPGI+UmVtb3RlIGRpcmVjdG9yeTwvYj4gYSBwYXRoIHdoZXJlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aWxsIGJlIHBsYWNlZC4gCi1UaGUgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSkuCi08L3A+Ci08cD4KLUluIHRoZSBsaXN0IHVuZGVybmVhdGgsIDxiPlNlbGVjdGVkIGZpbGUocyk8L2I+LCBhZGQgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgc2hhbGwgYmUgY29waWVkLgotQ2xpY2sgb24gPGI+RmlsZShzKTwvYj4gdG8gIHNlbGVjdCBvbmUgb3IgbW9yZSBpbmRpdmlkdWFsIGZpbGVzIGZyb20gYW55d2hlcmUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiAKLVRoZSA8Yj5EaXJlY3Rvcnk8L2I+IGJ1dHRvbiB3b3JrcyBzaW1pbGFybHkgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiAKLURpcmVjdG9yaWVzIGFyZSBjb3BpZWQgcmVjdXJzaXZlbHkuIAotVGhlIDxiPldvcmtzcGFjZTwvYj4gYnV0dG9uIGFsbG93cyBlYXNpbHkgY2hvb3NpbmcgZmlsZXMgZnJvbSB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLU9uIHRoZSBib3R0b20gb2YgdGhlIGRpYWxvZywgeW91IG1heSB3aXNoIHRvIHNldCBhdHRyaWJ1dGVzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvcGllZCBmaWxlcyBvbiB0aGUgcmVtb3RlIHRhcmdldC4gCi1UaGUgb3B0aW9ucyA8Yj5SZWFkb25seTwvYj4gb3IgPGI+RXhlY3V0YWJsZTwvYj4gc2V0cyBhbGwgY29waWVkIGZpbGVzIHRvIHJlYWQtb25seSBvciBleGVjdXRhYmxlIG9uIHRoZSByZW1vdGUgaG9zdC4KLUlmIDxiPlByZXNlcnZlIHRpbWUgYXR0cmlidXRlczwvYj4gaXMgZW5hYmxlZCwgdGhlbiB0aGUgcmVtb3RlIGNvcHkgd2lsbCBhc3N1bWUgdGhlIHNhbWUgdGltZSBzdGFtcCB0aGVuIHRoZSBsb2NhbCBmaWxlLCBvdGhlcndpc2UsIHRoZSB0aW1lIHN0YW1wIHdpbGwgYmUgdGhlIHRpbWUgdGhlIGZpbGUgd2FzIGNvcGllZC4KLUFsc28sIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIG9uIHRoZSByZW1vdGUgdGFyZ2V0LCB5b3UgbWF5IGNob29zZSBob3cgdG8gcmVhY3QgaW4gPGI+SWYgZmlsZSBhbHJlYWR5IGV4aXN0czwvYj4uCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAzbGF1bmNoOC5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTxwPjxicj48L3A+Ci08L2xpPgotPGxpPgotSW4gb3JkZXIgdG8gc3BlY2lmeSBmaWxlcyB0byBiZSBjb3BpZWQgZnJvbSB0aGUgcmVtb3RlIHRhcmdldCAoPGk+ZG93bmxvYWRlZDwvaT4pIGFmdGVyIHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBmaW5pc2hlcywgY2xpY2sgb24gPGI+TmV3IGRvd25sb2FkIHJ1bGU8L2I+LgotPC9wPgotPHA+Ci1BbiBkb3dubG9hZCBydWxlICBsaXN0cyBhIGNvbGxlY3Rpb24gb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBzaGFsbCBiZSBjb3BpZWQgaW50byBhIHNpbmdsZSBsb2NhbCBkaXJlY3RvcnkuIAotSXRzIG9wdGlucyBhcmUgdmVyeSBzaW1pbGFyIHRvIHRoZSB1cGxvYWQgcnVsZS4KLTwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDNsYXVuY2g5LnBuZyIpIDwvc2NyaXB0PjwvcD48cD48YnI+PC9wPgotPHA+PGJyPjwvcD4KLTwvbGk+Ci08L29sPgotCi08aDIgaWQ9ImRlYnVnZ2VyIj5TdGVwIDU6IENvbXBsZXRlIHRoZSBEZWJ1Z2dlciB0YWI8L2gyPgotPHA+VGhlIDxiPkRlYnVnZ2VyIHRhYjwvYj4gaXMgb25seSByZXF1aXJlZCBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIGRlYnVnIHRoZSBhcHBsaWNhdGlvbi4gSG93ZXZlciAKLWl0IGlzIGEgZ29vZCBpZGVhIHRvIGNvbXBsZXRlIGl0IG5vdywgZXZlbiBpZiB5b3UgYXJlIG9ubHkgcGxhbm5pbmcgdG8gbGF1bmNoIGEgbm9uLWRlYnVnIGpvYi48L3A+Ci08b2w+Ci08bGk+PHA+SWYgbm8gZGVidWdnZXIgaXMgdmlzaWJsZSBpbiB0aGUgPGI+RGVidWdnZXI8L2I+IGRyb3AtZG93biwgc2VsZWN0IG9uZS4gVGhpcyBpcyB0aGUgZGVidWdnZXIgdGhhdCB3aWxsIGNvbnRyb2wgCi10aGUgcGFyYWxsZWwgZGVidWcgc2Vzc2lvbi4gQ3VycmVudGx5IG9ubHkgPGI+U0RNPC9iPiBpcyBzdXBwb3J0ZWQgKFNETSBzdGFuZHMgZm9yIFNjYWxhYmxlIERlYnVnIAotTWFuYWdlciksIHNvIHNlbGVjdCB0aGlzLjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+SWYgeW91IHdpc2ggdGhlIGRlYnVnZ2VyIHRvIGF1dG9tYXRpY2FsbHkgc3VzcGVuZCB0aGUgYXBwbGljYXRpb24gb24gbGF1bmNoLCBtYWtlIHN1cmUgCi08Yj5TdG9wIGluIG1haW4oKSBvbiBzdGFydHVwPC9iPiBpcyBjaGVja2VkPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5VbmRlciBEZWJ1Z2dlciBvcHRpb25zLCBtYWtlIHN1cmUgdGhhdCB0aGUgcGF0aCB0byBkZWJ1Z2dlciBleGVjdXRhYmxlIGlzIGNvcnJlY3QuPC9wPjxwPjxicj48L3A+Ci08cD5JZiB5b3UgYXJlIGRlYnVnZ2luZyBvbiB0aGUgbG9jYWwgbWFjaGluZSwgdGhpcyBwYXRoIHNob3VsZCBwb2ludCB0byB0aGUgPGNvZGU+c2RtPC9jb2RlPiBleGVjdXRhYmxlIAotaW4geW91ciBFY2lscHNlIGluc3RhbGxhdGlvbidzIDxjb2RlPnBsdWdpbnMvb3JnLmVjbGlwc2UucHRwLjxpPm9zLmFyY2hfdmVyc2lvbjwvaT4vYmluPC9jb2RlPiBkaXJlY3RvcnksCi13aGVyZSA8Y29kZT48aT5vcy5hcmNoX3ZlcnNpb248L2k+PC9jb2RlPiBpcyB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gKDxjb2RlPmxpbnV4PC9jb2RlPiwgPGNvZGU+bWFjb3N4PC9jb2RlPiwgb3IgPGNvZGU+YWl4PC9jb2RlPiksIAotYXJjaGl0ZWN0dXJlICg8Y29kZT54ODY8L2NvZGU+LCA8Y29kZT54ODZfNjQ8L2NvZGU+LCBvciA8Y29kZT5wcGM8L2NvZGU+KSwgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwbHVnaW4gKGUuZy4gPGNvZGU+Mi4xLjAuMjAwODEwMzExOTAxPC9jb2RlPikuPC9wPjxwPjxicj48L3A+Ci08cD5JZiB5b3UgYXJlIGRlYnVnZ2luZyByZW1vdGVseSwgdGhlbiB0aGlzIHBhdGggd2lsbCBiZSB0aGUgcGF0aCB0byB3aGVyZSB0aGUgPGNvZGU+c2RtPC9jb2RlPiBleGVjdXRhYmxlIHdhcyBpbnN0YWxsZWQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+U2V0IHRoZSA8Yj5EZWJ1Z2dlciBzZXNzaW9uIGFkZHJlc3M8L2I+LiBUaGlzIGlzIHRoZSBhZGRyZXNzIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgY29ubmVjdCAKLXRvIHdoZW4gaXQgc3RhcnRzLCBhbmQgd2lsbCBkZXBlbmQgb24gd2hlcmUgeW91IGFyZSBsYXVuY2hpbmcgdGhlIGFwcGxpY2F0aW9uOjwvcD48cD48YnI+PC9wPgotPHVsPgotPGxpPjxwPklmIHlvdSBhcmUgbGF1bmNoaW5nIG9udG8gdGhlIGxvY2FsIG1hY2hpbmUsIHVzZSA8Y29kZT5sb2NhbGhvc3Q8L2NvZGU+IChzb21lIHN5c3RlbXMgd2lsbCAKLWFjY2VwdCA8Y29kZT5sb2NhbGhvc3QubG9jYWxkb21haW48L2NvZGU+KS48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPklmIHlvdSBhcmUgbGF1bmNoaW5nIG9udG8gYSByZW1vdGUgbWFjaGluZSB3aXRob3V0IHVzaW5nIHBvcnQgZm9yd2FyZGluZyAoYXMgc3BlY2lmaWVkIGluIHRoZSAKLXJlc291cmNlIG1hbmFnZXIgY29uZmlndXJhdGlvbiksIHRoZW4gdGhpcyBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIG1hY2hpbmUgKHRoZSBvbmUgCi1ydW5uaW5nIEVjbGlwc2UpIDxpPmFzIHZpZXdlZCBmcm9tIG9uZSBvZiB0aGUgbm9kZXMgb2YgdGhlIHBhcmFsbGVsIG1hY2hpbmU8L2k+LiBOb3RlIHRoYXQgaWYgdGhlIAotcGFyYWxsZWwgbWFjaGluZSBjb25maWd1cmF0aW9uIHByZWNsdWRlcyBub2RlcyBhY2Nlc3NpbmcgeW91ciBsb2NhbCBtYWNoaW5lLCB5b3Ugd2lsbCBuZWVkIHRvIAotcmVjb25maWd1cmUgdGhlIHJlc291cmNlIG1hbmFnZXIgdG8gdXNlIHBvcnQgZm9yd2FyZGluZy48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPklmIHlvdSBhcmUgbGF1bmNoaW5nIG9udG8gYSByZW1vdGUgbWFjaGluZSB1c2luZyBwb3J0IGZvcndhcmRpbmcsIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIAotcmVtb3RlIG1hY2hpbmUgPGk+YXMgdmlld2VkIGZyb20gb25lIG9mIGl0cyBub2RlczwvaT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgdGhlIDxjb2RlPkdhdGV3YXlQb3J0czwvY29kZT4gb3B0aW9uIHNldCB0byA8Y29kZT55ZXM8L2NvZGU+Ci1pbiB0aGUgPGNvZGU+c3NoZDwvY29kZT4gY29uZmlndXJhdGlvbiBmaWxlIG9uIHRoZSByZW1vdGUgc3lzdGVtIChzZWUgdGhlIG1hbnVhbCBwYWdlIGZvciA8Y29kZT5zc2hkX2NvbmZpZzwvY29kZT4pIGZvciB0aGlzIHRvIHdvcmsuPC9wPjxwPjxicj48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAzbGF1bmNoNS5wbmciKSA8L3NjcmlwdD48L3A+Ci08L3A+PC9saT4KLTwvdWw+Ci0KLTwvbGk+Ci08L29sPgotCi08aDIgaWQ9ImFyZ3VtZW50cyI+U3RlcCA2OiBDb21wbGV0ZSB0aGUgQXJndW1lbnRzIHRhYjwvaDI+Ci08cD48L3A+Ci08b2w+Ci08bGk+PHA+RW50ZXIgYW55IDxpPnByb2dyYW08L2k+IGFyZ3VtZW50cy48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPlNlbGVjdCBhIGRpZmZlcmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiBkZXNpcmVkLiBOb3RlIHRoYXQgZm9yIGEgcmVtb3RlIGxhdW5jaCwgdGhpcyB3aWxsIGJlIAotdGhlIGxvY2F0aW9uIG9mIHRoZSBleGVjdXRpb24gb24gdGhlIHJlbW90ZSBtYWNoaW5lLjwvcD48L2xpPgotPC9vbD4KLQotPGgyIGlkPSJsYXVuY2giPlN0ZXAgNjogTGF1bmNoaW5nIHRoZSBhcHBsaWNhdGlvbjwvaDI+Ci08cD5UaGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaXMgbm93IGNvbXBsZXRlLiBDbGljayBvbiB0aGUgPGI+UnVuPC9iPiBidXR0b24gdG8gbGF1bmNoIHRoZSBwcm9ncmFtLgotQXQgdGhpcyBwb2ludCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGJlZ2luIGV4ZWN1dGlvbi4gCi1UaGUgPGEgaHJlZj0iMDVtb25pdG9yaW5nLmh0bWwiPk1vbml0b3JpbmcgUGFyYWxsZWwgTWFjaGluZXMgYW5kIEpvYnM8L2E+IHNlY3Rpb24gd2lsbCBzaG93IHlvdSBob3cgdG8KLW1vbml0b3IgdGhlIHByb2dyYW0ncyBleGVjdXRpb24uPC9wPgotCi0KLQotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wNHBMYXVuY2hDb25maWdEZWJ1Zy5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wNHBMYXVuY2hDb25maWdEZWJ1Zy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDAyMTRlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDRwTGF1bmNoQ29uZmlnRGVidWcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkxhdW5jaGluZyBQYXJhbGxlbCBQcm9ncmFtcyBmb3IgRGVidWdnaW5nPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRodW1iLmpzIj4gPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgxIGlkPSJ0b3AiPkxhdW5jaGluZyBQYXJhbGxlbCBQcm9ncmFtcyBmb3IgRGVidWdnaW5nPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHRvIGxhdW5jaCBhIHBhcmFsbGVsIHByb2dyYW0gdGhhdCB5b3Ugd2lzaCB0byBkZWJ1Zy4gQSA8YSBocmVmPSIwNnBhckRlYnVnZ2luZy5odG1sIj5kZXNjcmlwdGlvbiBvZiBob3cgdG8gYWN0dWFsbHkgZGVidWcgdGhlIGFwcGxpY2F0aW9uPC9hPiBpcyBwcm92aWRlZCBpbiBhbm90aGVyIHNlY3Rpb24uIAotCi08cD5JZiB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgPGEgaHJlZj0iMDNwTGF1bmNoQ29uZmlnLmh0bWwiPm5vcm1hbCBwYXJhbGxlbCBsYXVuY2ggY29uZmlndXJhdGlvbjwvYT4gYW5kIGNvbmZpZ3VyZWQgdGhlIDxiPkRlYnVnIHRhYjwvYj4geW91IGFyZSByZWFkeSB0byBsYXVuY2ggYSBkZWJ1ZyBzZXNzaW9uLiBTaW1wbHkgc2VsZWN0IDxiPlJ1biAmZ3Q7IERlYnVnPC9iPiwgdGhlIGRlYnVnIGljb24sIG9yIGNob29zZSBhIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZGVidWcgaWNvbiBtZW51IG9uIHRoZSB0b29sYmFyLjwvcD4KLQotPHA+VG9waWNzICBpbmNsdWRlOjwvcD4KLTxvbD4KLTxsaT48YSBocmVmPSIjY3JlYXRlIj5DcmVhdGluZyBhIHBhcmFsbGVsIGRlYnVnIGxhdW5jaCBjb25maWd1cmF0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+Q29tcGxldGluZyB0aGUgPGI+UmVzb3VyY2VzIHRhYjwvYj48L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYXBwbGljYXRpb24iPkNvbXBsZXRpbmcgdGhlIDxiPkFwcGxpY2F0aW9uIHRhYjwvYj48L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZGVidWdnZXIiPkNvbXBsZXRpbmcgdGhlIDxiPkRlYnVnZ2VyIHRhYjwvYj48L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYXJndW1lbnRzIj5Db21wbGV0aW5nIHRoZSA8Yj5Bcmd1bWVudHMgdGFiPC9iPjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNsYXVuY2giPkxhdW5jaGluZyB0aGUgYXBwbGljYXRpb248L2I+PC9hPjwvbGk+Ci08L29sPgotCi08aDIgaWQ9ImNyZWF0ZSI+U3RlcCAxOiBDcmVhdGUgYSBwYXJhbGxlbCBkZWJ1ZyBsYXVuY2ggY29uZmlndXJhdGlvbjwvaDI+Ci08cD5Ob3RlOiBBdCBsZWFzdCBvbmUgcmVzb3VyY2UgbWFuYWdlciBtdXN0IGhhdmUgYmVlbiBjb25maWd1cmVkIGFuZCBzdGFydGVkIGJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUKLWEgcGFyYWxsZWwgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi08b2w+Ci08bGk+PHA+T3BlbiB0aGUgcnVuIGNvbmZpZ3VyYXRpb24gZGlhbG9nIHVzaW5nIDxiPlJ1biAmZ3Q7IE9wZW4gRGVidWcgRGlhbG9nLi4uPC9iPgotb3IgY2xpY2sgdGhlIGRlYnVnIGljb24gbWVudSBvbiB0aGUgdG9vbCBiYXIgYW5kIHNlbGVjdCA8Yj5PcGVuIERlYnVnIERpYWxvZy4uLjwvYj48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPkNyZWF0ZSBhIG5ldyBwYXJhbGxlbCBsYXVuY2ggY29uZmlndXJhdGlvbiBieSBjbGlja2luZyA8Yj5QYXJhbGxlbCBBcHBsaWNhdGlvbjwvYj4gYW5kCi10aGVuIGNsaWNraW5nIG9uIHRoZSA8Yj5OZXc8L2I+IGJ1dHRvbiBpY29uLjwvcD48cD48YnI+PC9wPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNGxhdW5jaDEucG5nIikgPC9zY3JpcHQ+PC9wPjxwPjxicj48L3A+Ci08L2xpPgotPGxpPjxwPkVudGVyIGEgbmFtZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIDxiPk5hbWU6PC9iPiBmaWVsZC4gSGVyZSB3ZSB1c2UgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJvamVjdC48L3A+PC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0icmVzb3VyY2VzIj5TdGVwIDI6IENvbXBsZXRlIHRoZSBSZXNvdXJjZXMgdGFiPC9oMj4KLTxwPlRoZSA8Yj5SZXNvdXJjZXMgdGFiPC9iPiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlc291cmNlcyByZXF1aXJlZCBmb3IgdGhlIGpvYiBleGVjdXRpb24uIFRoZSBjb250ZW50cyBvZiB0aGlzIHRhYiB3aWxsIHZhcnkgZm9yIGRpZmZlcmVudCByZXNvdXJjZSBtYW5hZ2Vycy4gVGhpcyBkZXNjcmlwdGlvbiBvbmx5IGFwcGx5cyB0byB0aGUgT3BlbiBNUEkgYW5kIE1QSUNIMiByZXNvdXJjZSBtYW5hZ2Vycy48L3A+Ci08b2w+Ci08bGk+PHA+U2VsZWN0IGEgcmVzb3VyY2UgbWFuYWdlciBmcm9tIHRoZSBkcm9wLWRvd24gKE5vdGU6IGEgcmVzb3VyY2UgbWFuYWdlcgotbXVzdCBiZSBydW5uaW5nIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlIGxpc3QuIElmIHRoZXJlIGlzIG9ubHkgb25lIHJlc291cmNlIG1hbmFnZXIgcnVubmluZywgdGhlbiBpdCB3aWxsIGJlCi1hdXRvbWF0aWNhbGx5IHNlbGVjdGVkLik8L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPlNvbWUgcmVzb3VyY2UgbWFuYWdlcnMgcmVxdWlyZSBhIGpvYiBxdWV1ZSB0byBiZSBzZWxlY3RlZCB1c2luZyBhIDxiPlF1ZXVlOjwvYj4gZHJvcC1kb3duLiBJZiB0aGVyZSBpcwotbm8gZHJvcC1kb3duLCB0aGVuIHRoaXMgcmVzb3VyY2UgbWFuYWdlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHF1ZXVlcy48L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPkVudGVyIGEgdmFsdWUgaW4gdGhlIDxiPk51bWJlciBvZiBQcm9jZXNzZXM8L2I+IGZpZWxkLiBUaGlzIGZpZWxkIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgaW4gCi1vcmRlciB0byBsYXVuY2ggYSBqb2IsIGFuZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgdG8gdXNlIGZvciB0aGUgYXBwbGljYXRpb24gbGF1bmNoLjwvcD48cD48YnI+PC9wPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wM2xhdW5jaFJlc1RhYi5wbmciKSA8L3NjcmlwdD48L3A+Ci08L2xpPgotPC9vbD4KLQotPGgyIGlkPSJhcHBsaWNhdGlvbiI+U3RlcCAzOiBDb21wbGV0ZSB0aGUgPGI+QXBwbGljYXRpb248L2I+IHRhYjwvaDI+Ci08cD5UaGUgPGI+QXBwbGljYXRpb24gdGFiPC9iPiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIChleGVjdXRhYmxlKSB0byBiZSBsYXVuY2hlZC48L3A+Ci08b2w+Ci08bGk+PHA+RW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgdGhlIDxiPlBhcmFsbGVsIFByb2plY3Q8L2I+IGlzIHNlbGVjdGVkLiBUaGlzIGlzIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHNvdXJjZQotYW5kIGJpbmFyaWVzIGZvciB0aGUgYXBwbGljYXRpb24uPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5TZWxlY3QgdGhlIDxiPkFwcGxpY2F0aW9uIFByb2dyYW08L2I+IChleGVjdXRhYmxlKSB0aGF0IHlvdSB3aXNoIHRvIGxhdW5jaCBieSBjbGlja2luZyBvbiAKLXRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gSWYgeW91IGFyZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgbG9jYWwgbWFjaGluZSwgeW91IHdpbGwgbmVlZCAKLXRvIG5hdmlnYXRlIHRvIHRoZSB3b3Jrc3BhY2UgYW5kIHByb2plY3QgZGlyZWN0b3J5LiBJbiB0aGlzIGNhc2UsIGFuZCBpZiB5b3UgYXJlIHVzaW5nIGEgZGVidWcgCi1jb25maWd1cmF0aW9uLCB0aGUgZXhlY3V0YWJsZSB3aWxsIGJlIGxvY2F0ZWQgaW4gdGhlIERlYnVnIGZvbGRlciBvZiB5b3VyIHByb2plY3QuPC9wPjxwPjxicj48L3A+Ci08cD5JZiB5b3UgYXJlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIG9uIGEgcmVtb3RlIG1hY2hpbmUgeW91IHdpbGwgbmVlZCB0byBuYXZpZ2F0ZSB0byB0aGUgbG9jYXRpb24gCi1vZiB0aGUgZXhlY3V0YWJsZSBvbiB0aGF0IG1hY2hpbmUuIElmIHRoZSBwcm9qZWN0IHdhcyA8aT5idWlsdDwvaT4gbG9jYWxseSwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIAotbWFudWFsbHkgY29weSB0aGUgZXhlY3V0YWJsZSB0byB0aGUgcmVtb3RlIG1hY2hpbmUgZmlyc3QuPC9wPjxwPjxicj48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzAzbGF1bmNoMi5wbmciKSA8L3NjcmlwdD48L3A+PHA+PGJyPjwvcD4KLTwvbGk+Ci08bGk+PHA+SWYgeW91IHdpc2ggdG8gaGF2ZSB0aGUgb3V0cHV0IGZyb20gYWxsIHByb2Nlc3NlcyBpbiBhIHNpbmdsZSBvdXRwdXQgY29uc29sZSwKLWNoZWNrIHRoZSA8Yj5EaXNwbGF5IGNvbWJpbmVkIG91dHB1dCBpbiBhIGNvbnNvbGUgdmlldzwvYj4gb3B0aW9uLjwvcD48cD48YnI+PC9wPgotPC9saT4KLTwvb2w+Ci0KLQotPGgyIGlkPSJkZWJ1Z2dlciI+U3RlcCA0OiBDb21wbGV0ZSB0aGUgRGVidWdnZXIgdGFiPC9oMj4KLTxwPjwvcD4KLTxvbD4KLTxsaT48cD5TZWxlY3QgYSBkZWJ1Z2dlciBmcm9tIHRoZSA8Yj5EZWJ1Z2dlcjwvYj4gZHJvcC1kb3duLiBUaGlzIGlzIHRoZSBkZWJ1Z2dlciB0aGF0IHdpbGwgY29udHJvbCAKLXRoZSBwYXJhbGxlbCBkZWJ1ZyBzZXNzaW9uLiBDdXJyZW50bHkgb25seSA8Yj5TRE08L2I+IGlzIHN1cHBvcnRlZCAoU0RNIHN0YW5kcyBmb3IgU2NhbGFibGUgRGVidWcgCi1NYW5hZ2VyKSwgc28gc2VsZWN0IHRoaXMuPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5JZiB5b3Ugd2lzaCB0aGUgZGVidWdnZXIgdG8gYXV0b21hdGljYWxseSBzdXNwZW5kIHRoZSBhcHBsaWNhdGlvbiBvbiBsYXVuY2gsIG1ha2Ugc3VyZSAKLTxiPlN0b3AgaW4gbWFpbigpIG9uIHN0YXJ0dXA8L2I+IGlzIGNoZWNrZWQ8L3A+PHA+PGJyPjwvcD48L2xpPgotPGxpPjxwPlVuZGVyIERlYnVnZ2VyIG9wdGlvbnMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXRoIHRvIGRlYnVnZ2VyIGV4ZWN1dGFibGUgaXMgY29ycmVjdC48L3A+PHA+PGJyPjwvcD4KLTxwPklmIHlvdSBhcmUgZGVidWdnaW5nIG9uIHRoZSBsb2NhbCBtYWNoaW5lLCB0aGlzIHBhdGggc2hvdWxkIHBvaW50IHRvIHRoZSA8Y29kZT5zZG08L2NvZGU+IGV4ZWN1dGFibGUgaW4geW91ciBFY2lscHNlIGluc3RhbGxhdGlvbidzIDxjb2RlPnBsdWdpbnMvb3JnLmVjbGlwc2UucHRwLjxpPm9zLmFyY2hfdmVyc2lvbjwvaT4vYmluPC9jb2RlPiBkaXJlY3RvcnksCi13aGVyZSA8Y29kZT48aT5vcy5hcmNoX3ZlcnNpb248L2k+PC9jb2RlPiBpcyB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gKDxjb2RlPmxpbnV4PC9jb2RlPiwgPGNvZGU+bWFjb3N4PC9jb2RlPiwgb3IgPGNvZGU+YWl4PC9jb2RlPiksIAotYXJjaGl0ZWN0dXJlICg8Y29kZT54ODY8L2NvZGU+LCA8Y29kZT54ODZfNjQ8L2NvZGU+LCBvciA8Y29kZT5wcGM8L2NvZGU+KSwgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwbHVnaW4gKGUuZy4gPGNvZGU+Mi4xLjAuMjAwODEwMzExOTAxPC9jb2RlPikuPC9wPjxwPjxicj48L3A+Ci08cD5JZiB5b3UgYXJlIGRlYnVnZ2luZyByZW1vdGVseSwgdGhlbiB0aGlzIHBhdGggd2lsbCBiZSB0aGUgcGF0aCB0byB3aGVyZSB0aGUgPGNvZGU+c2RtPC9jb2RlPiBleGVjdXRhYmxlIAotd2FzIGluc3RhbGxlZCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5TZXQgdGhlIDxiPkRlYnVnZ2VyIHNlc3Npb24gYWRkcmVzczwvYj4uIFRoaXMgaXMgdGhlIGFkZHJlc3MgdGhhdCB0aGUgZGVidWdnZXIgd2lsbCBjb25uZWN0IAotdG8gd2hlbiBpdCBzdGFydHMsIGFuZCB3aWxsIGRlcGVuZCBvbiB3aGVyZSB5b3UgYXJlIGxhdW5jaGluZyB0aGUgYXBwbGljYXRpb246PC9wPjxwPjxicj48L3A+Ci08dWw+Ci08bGk+PHA+SWYgeW91IGFyZSBsYXVuY2hpbmcgb250byB0aGUgbG9jYWwgbWFjaGluZSwgdXNlIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4gKHNvbWUgc3lzdGVtcyB3aWxsIAotYWNjZXB0IDxjb2RlPmxvY2FsaG9zdC5sb2NhbGRvbWFpbjwvY29kZT4pLjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+SWYgeW91IGFyZSBsYXVuY2hpbmcgb250byBhIHJlbW90ZSBtYWNoaW5lIHdpdGhvdXQgdXNpbmcgcG9ydCBmb3J3YXJkaW5nIChhcyBzcGVjaWZpZWQgaW4gdGhlIAotcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9uKSwgdGhlbiB0aGlzIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYWwgbWFjaGluZSAodGhlIG9uZSAKLXJ1bm5pbmcgRWNsaXBzZSkgPGk+YXMgdmlld2VkIGZyb20gb25lIG9mIHRoZSBub2RlcyBvZiB0aGUgcGFyYWxsZWwgbWFjaGluZTwvaT4uIE5vdGUgdGhhdCBpZiB0aGUgCi1wYXJhbGxlbCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gcHJlY2x1ZGVzIG5vZGVzIGFjY2Vzc2luZyB5b3VyIGxvY2FsIG1hY2hpbmUsIHlvdSB3aWxsIG5lZWQgdG8gCi1yZWNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byB1c2UgcG9ydCBmb3J3YXJkaW5nLjwvcD48cD48YnI+PC9wPjwvbGk+Ci08bGk+PHA+SWYgeW91IGFyZSBsYXVuY2hpbmcgb250byBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIHBvcnQgZm9yd2FyZGluZywgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgCi1yZW1vdGUgbWFjaGluZSA8aT5hcyB2aWV3ZWQgZnJvbSBvbmUgb2YgaXRzIG5vZGVzPC9pPi4gTm90ZSB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgPGNvZGU+R2F0ZXdheVBvcnRzPC9jb2RlPiBvcHRpb24gc2V0IHRvIDxjb2RlPnllczwvY29kZT4KLWluIHRoZSA8Y29kZT5zc2hkPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUgb24gdGhlIHJlbW90ZSBzeXN0ZW0gKHNlZSB0aGUgbWFudWFsIHBhZ2UgZm9yIDxjb2RlPnNzaGRfY29uZmlnPC9jb2RlPikgZm9yIHRoaXMgdG8gd29yay48L3A+PHA+PGJyPjwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDRsYXVuY2g1LnBuZyIpIDwvc2NyaXB0PjwvcD4KLTwvbGk+Ci08L3VsPgotCi08L2xpPgotPC9vbD4KLQotPGgyIGlkPSJhcmd1bWVudHMiPlN0ZXAgNTogQ29tcGxldGUgdGhlIEFyZ3VtZW50cyB0YWI8L2gyPgotPHA+PC9wPgotPG9sPgotPGxpPjxwPkVudGVyIGFueSA8aT5wcm9ncmFtPC9pPiBhcmd1bWVudHMuPC9wPjxwPjxicj48L3A+PC9saT4KLTxsaT48cD5TZWxlY3QgYSBkaWZmZXJlbnQgd29ya2luZyBkaXJlY3RvcnkgaWYgZGVzaXJlZC4gTm90ZSB0aGF0IGZvciBhIHJlbW90ZSBsYXVuY2gsIHRoaXMgd2lsbCBiZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4ZXVjdGlvbiBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuPC9wPjwvbGk+Ci08L29sPgotCi08aDIgaWQ9ImxhdW5jaCI+U3RlcCA2OiBMYXVuY2hpbmcgdGhlIGFwcGxpY2F0aW9uPC9oMj4KLTxwPlRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBpcyBub3cgY29tcGxldGUuIENsaWNrIG9uIHRoZSA8Yj5EZWJ1ZzwvYj4gYnV0dG9uIHRvIHN0YXJ0IGRlYnVnZ2luZyB0aGUgcHJvZ3JhbS4gRWNsaXBzZSB3aWxsLCBieSBkZWZhdWx0LCBzd2l0Y2ggdG8gdGhlIDxiPlBUUCBEZWJ1ZyBwZXJzcGVjdGl2ZTwvYj4sIGFuZCB5b3UgY2FuIGJlZ2luIGRlYnVnZ2luZyB0aGUgYXBwbGljYXRpb24uCi1UaGUgPGEgaHJlZj0iMDZwYXJEZWJ1Z2dpbmcuaHRtbCI+UGFyYWxsZWwgRGVidWdnaW5nPC9hPiBzZWN0aW9uIHdpbGwgc2hvdyB5b3UgaG93IHRvCi11c2UgdGhlIGRlYnVnZ2VyLjwvcD4KLQotCi0KLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDVtb25pdG9yaW5nLmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzA1bW9uaXRvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmU2NzQ0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDVtb25pdG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5Nb25pdG9yaW5nIFBhcmFsbGVsIE1hY2hpbmVzIGFuZCBKb2JzPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRodW1iLmpzIj4gPC9zY3JpcHQ+Ci08aGVhZD4KLTxib2R5PgotPGgxIGlkPSJ0b3AiPk1vbml0b3JpbmcgUGFyYWxsZWwgTWFjaGluZXMgYW5kIEpvYnM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZmVhdHVyZXMgb2YgUFRQIHRoZSBlbmFibGUgdGhlIGRldmVsb3BlciB0byBtb25pdG9yIGFjdGl2aXR5IG9uIHRhcmdldCBwYXJhbGxlbCBtYWNoaW5lcywgdG8gbW9uaXRvciBqb2Igc3RhdHVzLCBhbmQgdG8gdGVybWluYXRlIGpvYnMuIEl0IHdpbGwgY292ZXIgdGhlIGZvbGxvd2luZyB0b3BpY3M6PC9wPgotPHVsPgotCi08bGk+PGEgaHJlZj0iI3BlcnNwIj5QVFAgUnVudGltZSBwZXJzcGVjdGl2ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZXNNZ3IiPlJlc291cmNlIE1hbmFnZXJzIHZpZXc8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWFjaGluZXMiPk1hY2hpbmVzIHZpZXc8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjam9icyI+Sm9icyB2aWV3PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI291dHB1dCI+UHJvY2VzcyBPdXRwdXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbGVnZW5kIj5JY29uIExlZ2VuZDwvYT48L2xpPgotPC91bD4KLQotCi08aDIgaWQ9InBlcnNwIj5QVFAgUnVudGltZSBQZXJzcGVjdGl2ZTwvaDI+Ci08cD5UaGUgPGI+UFRQIFJ1bnRpbWUgcGVyc3BlY3RpdmU8L2I+IGlzIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RhdHVzIG9mIHRhcmdldCBwYXJhbGxlbCBzeXN0ZW1zIGFuZCB0aGUgcGFyYWxsZWwgam9icyB0aGF0IGFyZSBydW5uaW5nIG9uIHRoZXNlIHN5c3RlbXMuIEF0IGxlYXN0IG9uZSByZXNvdXJjZSBtYW5hZ2VyIG11c3QgYmUgYWN0aXZlIHRvIHNlZSBhbnl0aGluZyBpbiB0aGUgdmlld3MuIFNlZSA8YSBocmVmPSIwMnJlc01nclNldHVwLmh0bWwiPmNvbmZpZ3VyaW5nIHJlc291cmNlIG1hbmFnZXJzPC9hPiBmb3IgaW5mb3JtYXRpb24gb24gc2V0dGluZyB1cCByZXNvdXJjZSBtYW5hZ2VycyBhbmQgPGEgaHJlZj0iMDNwTGF1bmNoQ29uZmlnLmh0bWwiPmxhdW5jaGluZyBwYXJhbGxlbCBwcm9ncmFtczwvYT4gZm9yIGhvdyB0byBsYXVuY2ggYSBwYXJhbGxlbCBwcm9ncmFtLjwvcD4KLQotPHA+VGhlIHBlcnNwZWN0aXZlIHByb3ZpZGVzIGZvdXIgbWFpbiB2aWV3cyBmb3IgbW9uaXRvcmluZyBzeXN0ZW1zIGFuZCBqb2JzOiA8Yj5SZXNvdXJjZSBNYW5hZ2VycyB2aWV3PC9iPjsgPGI+TWFjaGluZXMgdmlldzwvYj47IDxiPkpvYnMgdmlldzwvYj47IGFuZCA8Yj5Qcm9jZXNzIERldGFpbHMgdmlldzwvYj4uIEVhY2ggb2YgdGhlc2Ugdmlld3Mgd2lsbCBiZSBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuPC9wPgotCi08cD5UbyBvcGVuIHRoZSA8Yj5QVFAgUnVudGltZSBwZXJzcGVjdGl2ZTwvYj4sCi1zZWxlY3QgPGI+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZSAmZ3Q7IE90aGVyIC4uLjwvYj4gYW5kIGNob29zZSA8Yj5QVFAgUnVudGltZTwvYj4gZnJvbSB0aGUgbGlzdC48L3A+Ci08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA1cnVudGltZVBlcnNwQW5uLnBuZyIpIDwvc2NyaXB0PjwvcD4KLQotPGgyIGlkPSJyZXNNZ3IiPlJlc291cmNlIE1hbmFnZXJzIFZpZXc8L2gyPgotPHA+VGhlIDxiPlJlc291cmNlIE1hbmFnZXJzIHZpZXc8L2I+IHNob3dzIGFsbCByZXNvdXJjZSBtYW5hZ2VycyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkLCBhbmQgaXMgdXNlZCB0byBtYW5hZ2UgYW5kIGNvbnRyb2wgdGhlc2UgcmVzb3VyY2UgbWFuYWdlcnMuIEVhY2ggcmVzb3VyY2UgbWFuYWdlciBoYXMgYW4gaWNvbiBhbmQgYSBuYW1lLiBUaGUgaWNvbiBjb2xvciBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlc291cmNlIG1hbmFnZXIuIFRoZSBmb2xsb3dpbmcgaW1hZ2Ugc2hvd3MgdHdvIHJlc291cmNlIG1hbmFnZXJzLCBvbmUgdGhhdCBpcyA8aT5zdG9wcGVkPC9pPiBhbmQgb25lIHRoYXQgaXMgPGk+cnVubmluZzwvaT4uIEEgc3RvcHBlZCByZXNvdXJjZSBtYW5hZ2VyIGlzIGtub3cgdG8gdGhlIHN5c3RlbSwgYnV0IGlzIG5vdCBwcm92aWRpbmcgYW55IGluZm9ybWF0aW9uIHRvIFBUUC4gQSBydW5uaW5nIHJlc291cmNlIG1hbmFnZXIgaXMgdGhlIG5vcm1hbCBzdGF0ZSwgYW5kIGluZGljYXRlcyB0aGF0IFBUUCBpcyByZWNlaXZpbmcgaW5mb3JtYXRpb24gYW5kIGNhbiBsYXVuY2ggam9icyB1c2luZyB0aGUgcmVzb3VyY2UgbWFuYWdlci48L3A+Ci0KLTx0YWJsZT48dHI+Ci08dGQ+PGltZyBzcmM9ImltYWdlcy8wNXJ1bnRpbWVSZXNNZ3JWaWV3LnBuZyI+PC90ZD4KLTx0ZD48aW1nIHNyYz0iaW1hZ2VzLzA1cHRwTGVnZW5kUmVzTWdyLnBuZyI+PC90ZD4KLTwvdHI+PC90YWJsZT4KLQotPHA+VGhlIHZpZXcgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHJlc291cmNlIG1hbmFnZXJzLCBlZGl0IG9yIHJlbW92ZSByZXNvdXJjZSBtYW5hZ2VycywgYW5kIGNvbnRyb2wgcmVzb3VyY2UgbWFuYWdlciBvcGVydGFpb24uIFJpZ2h0LWNsaWNrIGluIHRoZSB2aWV3IHRvIGFjY2VzcyB0aGVzZSBmdW5jdGlvbnMuPC9wPgotPHA+Tm90ZSB0aGF0IGlmIGEgcmVzb3VyY2UgbWFuYWdlciBpcyByZW1vdmVkIGFuZCByZS1hZGRlZCwgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9ucyB1c2luZyB0aGUgb3JpZ2luYWwgcmVzb3VyY2UKLW1hbmFnZXIgbXVzdCBiZSBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IG9uZSwgZXZlbiBpZiBpdCBoYXMgdGhlIHNhbWUgbmFtZS48L3A+ICAKLQotPGgyIGlkPSJtYWNoaW5lcyI+PGltZyBzcmM9ImltYWdlcy8wNXBhcmFsbGVsX3BlcnNwZWN0aXZlLnBuZyI+TWFjaGluZXMgVmlldzwvaDI+Ci08cD5UaGUgPGI+TWFjaGluZXMgdmlldzwvYj4gc2hvd3MgdGhlIHN0YXR1cyBvZiBhbGwgbWFjaGluZXMgYmVpbmcgY29udHJvbGxlZCBieSBydW5uaW5nIHJlc291cmNlIG1hbmFnZXJzLiBUaGUgdXBwZXIgbGVmdC1oYW5kIHBhbmVsIG9mIHRoaXMgdmlldyBzaG93cyBhIGNvbGxlY3RpdmUgbGlzdCBvZiBhbGwgbWFjaGluZXMga25vd24gYnkgYWxsIHRoZSByZXNvdXJjZSBtYW5hZ2Vycy4gQSBtYWNoaW5lIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGljb24gYW5kIGFuIGFkZHJlc3MuIFRoZSBpY29uIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBtYWNoaW5lLCBhbmQgdGhlIGFkZHJlc3MgaXMgdHlwaWNhbGx5IHRoZSBob3N0bmFtZSBvZiB0aGUgbWFjaGluZS48L3A+Ci0KLTxwPlNlbGVjdGluZyBvbmUgb2YgdGhlIG1hY2hpbmVzIGluIHRoZSB1cHBlciBsZWZ0LWhhbmRsZSBwYW5lbCB3aWxsIHNob3cgdGhlIG5vZGVzIG9mIHRoYXQgbWFjaGluZSBpbiB0aGUgdXBwZXIgcmlnaHQtaGFuZCBwYW5lbCBvZiB0aGlzIHZpZXcuIE5vZGVzIGFyZSByZXByZXNlbnRlZCBieSBhbiBpY29uIG9ubHkuIFRoZSBpY29uIHNob3dzIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZS4gVGhlIGZvbGxvd2luZyBpbWFnZSBzaG93cyBhIHR5cGljYWwgdmlldzo8L3A+Ci08cD48aW1nIHNyYz0iaW1hZ2VzLzA1cnVudGltZU1hY2hpbmVzVmlldy5wbmciPjwvcD4KLQotPHA+VGhlIGxlZnQgZWRnZSBvZiB0aGUgbm9kZSBwYW5lbCBkaXNwbGF5cyB0aGUgbm9kZSBudW1iZXIgb2YgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHJvdy4gVGhpcyBpcyB1c2VmdWwgZm9yIHF1aWNrbHkgbG9jYXRpbmcgYSBwYXJ0aWN1bGFyIG5vZGUuIEFsc28sIGlmIHRoZXJlIGFyZSB0b28gbWFueSBub2RlcyB0byBmaXQgaW4gdGhlIGRpc3BsYXkgdGhlIHpvb20gYnV0dG9ucyBpbiB0aGUgdmlldyB0b29sYmFyIGNhbiBiZSB1c2VkIHRvIHpvb20gdGhlIGRpc3BsYXkuPC9wPgotCi08cD5UaGUgbWFjaGluZSBhbmQgbm9kZSBpY29ucyBpbmRpY2F0ZSB0aGUgc3RhdGUgb2YgZWFjaCBtYWNoaW5lIGFuZCBub2RlLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGltYWdlLiBUaGVyZSBhcmUgaWNvbnMgcmVwcmVzZW50aW5nIG1vc3QgdHlwaWNhbCBzdGF0ZXMuIFRoZXJlIGFyZSBhbHNvIG5vZGUgc3RhdGVzIHRoYXQgaW5kaWNhdGUgYWNjZXNzIHRvIHRoZSBub2RlcyB0aGF0IGNvdWxkIGJlIGNvbnRyb2xsZWQgYnkgYSBqb2Igc2NoZWR1bGVyICh1c2VyIGV4Y3VzaXZlLCB1c2VyIHNoYXJlZCwgZXRjLikgVGhlc2Ugc3RhdGVzIGFyZSBvbmx5IHVzZWQgYnkgY2VydGFpbiB0eXBlcyBvZiByZXNvdXJjZSBtYW5hZ2Vycy48L3A+Ci08cD48aW1nIHNyYz0iaW1hZ2VzLzA1cHRwTGVnZW5kTWFjaGluZXMucG5nIj48L3A+Ci0KLTxoMz5Ob2RlIGRldGFpbHM8L2gzPgotPHA+UGxhY2luZyB0aGUgbW91c2Ugb3ZlciBhIG5vZGUgaW4gdGhlIHdpbGwgc2hvdyBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IG5vZGUsIGluY2x1ZGluZyB0aGUgbm9kZSBudW1iZXIsIGluIGEgdG9vbHRpcCBwb3B1cC48L3A+Ci08cD5Eb3VibGUtY2xpY2sgb24gYSBub2RlIGljb24gdG8gZGlzcGxheSB0aGUgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSBpbiB0aGUgbG93ZXIgdHdvIHBhbmVzIG9mIHRoZSB2aWV3LiBUaGUgbG93ZXIgbGVmdC1oYW5kIHBhbmUgd2lsbCBzaG93IHRoZSBkZXRhaWxlZCBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlLCBhbmQgdGhlIGxvd2VyIHJpZ2h0LWhhbmQgcGFuZSB3aWxsIHNob3cgdGhlIHByb2Nlc3NlcyB0aGF0IGFyZSBydW5uaW5nLCBvciBoYXZlIHJlY2VudGx5IHJ1biwgb24gdGhlIG5vZGUuIChTZWUgdGhlIGZ1bGwgcGljdHVyZSBvZiB0aGUgcnVudGltZSBwZXJzcGVjdGl2ZSBhdCB0aGUgdG9wIG9mIHRoaXMgcGFnZS4pPC9wPgotCi08aDIgaWQ9ImpvYnMiPjxpbWcgc3JjPSJpbWFnZXMvMDVwYXJhbGxlbF9wZXJzcGVjdGl2ZS5wbmciPkpvYnMgVmlldzwvaDI+Ci08cD5UaGlzIHZpZXcgc2hvd3MgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGpvYnMgaW4gdGhlIHN5c3RlbS4gUGVuZGluZywgcnVubmluZywgYW5kIGNvbXBsZXRlZCBqb2JzIGFyZSBzaG93bi4gVGhlIGFjdHVhbCBqb2JzIGRpc3BsYXllZCBpbiB0aGlzIHZpZXcgYXJlIHJlc291cmNlIG1hbmFnZXIgZGVwZW5kZW50LCBidXQgd2lsbCB0eXBpY2FsbHkgYmUgdGhlIHVzZXIncyBqb2JzIHRoYXQgaGF2ZSBiZWVuIGxhdW5jaGVkIGJ5IFBUUC4gU29tZSByZXNvdXJjZSBtYW5hZ2VycyBtYXkgc2hvdyBqb2JzIHRoYXQgaGF2ZSBiZWVuIGxhdW5jaGVkIHVzaW5nIG90aGVyIG1lYW5zLCBvciBqb2JzIGZvciBhbGwgdXNlcnMgb24gdGhlIHN5c3RlbS48L3A+Ci0KLTxwPkpvYnMgYXJlIHJlcHJlc2VudGVkIGJ5IGFuIGljb24gYW5kIGEgbmFtZSwgYW5kIGFyZSBzaG93biBpbiB0aGUgbGVmdC1oYW5kIHBhbmUuIFRoZSBpY29uIGlzIHVzZWQgdG8gc2hvdyB0aGUgc3RhdGUgb2YgdGhlIGpvYi4gVG8gc2VlIHRoZSAgaW5kaXZpZHVhbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCB3aXRoIGEgam9iLCBkb3VibGUtY2xpY2sgb24gdGhlIGpvYi4gVGhlIHByb2Nlc3NlcyB3aWxsIGJlIHNob3duIGluIHRoZSByaWdodC1oYW5kIHBhbmUuPC9wPgotPHA+PGltZyBzcmM9ImltYWdlcy8wNXB0cFJ1bnRpbWVKb2JzVmlld0hvdmVyLnBuZyI+PC9wPgotCi08cD5UaGVyZSBhcmUgaWNvbnMgcmVwcmVzZW50aW5nIG1vc3Qgam9iIGFuZCBwcm9jZXNzIHN0YXRlcy4gVGhlIGZvbGxvd2luZyBpbWFnZSBzaG93cyB0aGUgc3RhdGVzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkOjwvcD4KLTxwPjxpbWcgc3JjPSJpbWFnZXMvMDVwdHBMZWdlbmRKb2JQcm9jZXNzLnBuZyI+PC9wPgotCi08aDM+UHJvY2VzcyBEZXRhaWxzPC9oMz4KLTxwPk1vcmUgZGV0YWlscyBhYm91dCB0aGUgcHJvY2Vzc2VzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSA8Yj5Kb2JzIHZpZXc8L2I+IGJ5IHBsYWNpbmcgdGhlIG1vdXNlIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgb2YgaW50ZXJlc3QuIEEgdG9vbHRpcCBwb3B1cCB3aXRoIGJlIGRpc3BsYXllZCBzaG93aW5nIHRoZSBNUEkgdGFzayBJRCBhbmQgcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcywgYXMgY2FuIGJlIHNlZW4gYmVsb3cuPC9wPgotCi08cD5MaWtlIHRoZSA8Yj5NYWNoaW5lcyB2aWV3PC9iPiwgdGhlIHRoZXJlIGFyZSB6b29tIGJ1dHRvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzY2FsZSB0aGUgZGlzcGxheSBzbyB0aGF0IG1vcmUgcHJvY2Vzc2VzIGNhbiBiZSBzZWVuIGluIHRoZSBjdXJyZW50IHZpZXcuPC9wPgotCi08aDM+Sm9iIFRlcm1pbmF0aW9uPC9oMz4KLTxwPlVzdWFsbHkgYSBqb2Igd2lsbCB0ZXJtaW5hdGUgd2hlbiBpdCBmaW5pc2hlcyBleGVjdXRpbmcuIEhvd2V2ZXIgdGhlIHVzZXIgY2FuIGFsc28gdGVybWluYXRlIGEgam9iIHVzaW5nIHRoZSA8Yj50ZXJtaW5hdGUgYnV0dG9uPC9iPiBvbiB0aGUgdG9vbGJhci4gVGhpcyBidXR0b24gd2lsbCBiZWNvbWUgZW5hYmxlZCB3aGVuIGEgcnVubmluZyBqb2IgaXMgc2VsZWN0ZWQuIENsaWNraW4gb24gdGhlIGJ1dHRvbiB3aWxsIGluc3RydWN0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRvIHRlcm1pbmF0ZSB0aGUgam9iLiBJZiB0aGUgam9iIGlzIHBlbmRpbmcgaW4gYSBxdWV1ZSwgdGhlbiBpdCB3aWxsIG5vcm1hbGx5IGJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuPC9wPgotCi08aDIgaWQ9Im91dHB1dCI+UHJvY2VzcyBPdXRwdXQgVmlldzwvaDI+Ci08cD5EZXBlbmRpbmcgb24gdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlc291cmNlIG1hbmFnZXIsIFBUUCBjYW4gYWxzbyBkaXNwbGF5IHN0YW5kYXJkIG91dHB1dCBmcm9tIGluZGl2aWR1YWwgcHJvY2Vzc2VzLCBjb2xsZWN0aXZlbHkgZnJvbSBhbGwgcHJvY2Vzc2VzLCBvciBib3RoLiBTdGFuZGFyZCBvdXRwdXQgZnJvbSBpbmRpdmlkdWFsIHByb2Nlc3NlcyBpcyB2aWV3ZWQgYnkgZG91YmxlLWNsaWNraW5nIG9uIGEgcHJvY2VzcyBpY29uIGluIHRoZSA8Yj5NYWNoaW5lcyB2aWV3PC9iPiBvciA8Yj5Kb2JzIHZpZXc8L2I+LiBUaGlzIHdpbGwgb3BlbiBhbm90aGVyIHZpZXcgc2hvd2luZyB0aGUgcHJvY2VzcyBvdXRwdXQuIEFuIGV4YW1wbGUgaXMgc2hvd24gYmVsb3cuPC9wPgotPHA+PGltZyBzcmM9ImltYWdlcy8wNXB0cFJ1bnRpbWVQcm9jZXNzRGV0YWlscy5wbmciPjwvcD4KLQotPHA+SWYgdGhlIDxiPkRpc3BsYXkgY29tYmluZWQgb3V0cHV0IGluIGEgY29uc29sZSB2aWV3PC9iPiB3YXMgc2VsZWN0ZWQgaW4gdGhlIGpvYiBsYXVuY2ggY29uZmlndXJhdGlvbiAoc2VlIDxhIGhyZWY9IjAzcExhdW5jaENvbmZpZy5odG1sIj5MYXVuY2hpbmcgUGFyYWxsZWwgUHJvZ3JhbXM8L2E+KSwgdGhlbiBvdXRwdXQgZnJvbSBhbGwgcHJvY2Vzc2VzIHdpbGwgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb25zb2xlLiBUaGlzIG91dHB1dCBjYW4gYmUgc2VlbiBieSBvcGVuaW5nIHRoZSA8Yj5Db25zb2xlIHZpZXc8L2I+IGluIHRoZSBFY2xpcHNlIHdvcmtiZW5jaC48L3A+Ci0KLTxoMiBpZD0ibGVnZW5kIj5JY29uIExlZ2VuZDwvaDI+Ci0KLTxwPlRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBpY29ucyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIHBhcmFsbGVsIHN5c3RlbS4gSWYgeW91IG5lZWQgdG8gaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIGljb24sIGNsaWNrIG9uIHRoZSBsZWdlbmQgaWNvbiA8aW1nIHNyYz0iaW1hZ2VzLzA1bGVnZW5kSWNvbi5wbmciPiBpbiB0aGUgdG9vbGJhci4gIFRoaXMgd2lsbCBvcGVuIGEgZGlhbG9nIHRoYXQgc2hvd3MgYWxsIHRoZSBpY29ucyBhbmQgdGhlaXIgbWVhbmluZ3MuIEFuIGV4YW1wbGUgaXMgc2hvd24gYmVsb3cuPC9wPgotCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA1cHRwTGVnZW5kLnBuZyIpIDwvc2NyaXB0PjwvcD4KLQotCi0KLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wNnBhckRlYnVnZ2luZy5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wNnBhckRlYnVnZ2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZWY2ZTdmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvMDZwYXJEZWJ1Z2dpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlBhcmFsbGVsIERlYnVnZ2luZzwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08IS0tIHRlc3QgLS0+Ci08aDE+UGFyYWxsZWwgRGVidWdnaW5nPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZlYXR1cmVzIG9mIFBUUCB0aGF0IGVuYWJsZSBhIGRldmVsb3BlciB0byBkZWJ1ZyBhIHBhcmFsbGVsIGFwcGxpY2F0aW9uLiBUaGUgdG9waWNzIHRoYXQgd2lsbCBiZSBjb3ZlcmVkLCBpbmNsdWRlOjwvcD4KLTx1bD4KLTxsaT48YSBocmVmPSIjZmVhdCI+VGhlIFBUUCBEZWJ1ZyBQZXJzcGVjdGl2ZSA8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcFNldHMiPlByb2Nlc3MgU2V0czwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNwU2V0c09wZXIiPk9wZXJhdGlvbnMgb24gUHJvY2VzcyBTZXRzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3BTZXRzQ3JlYXRlIj5NYW5hZ2luZyBQcm9jZXNzIFNldHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYmtwdCI+QnJlYWtwb2ludHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjY2lwIj5DdXJyZW50IEluc3RydWN0aW9uIFBvaW50ZXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcmVnIj5Qcm9jZXNzIFJlZ2lzdHJhdGlvbiA8L2E+IGFuZCB0aGUgRGVidWcgdmlldyAoaW5jbHVkaW5nIHN0YWNrIHRyYWNlcyk8L2xpPgotPGxpPjxhIGhyZWY9IiNmaW5pc2giPlRlcm1pbmF0aW5nIEV4ZWN1dGlvbjwvYT48L2xpPgotCi08L3VsPgotCi08aDIgaWQ9ImZlYXQiPlRoZSBQVFAgRGVidWcgcGVyc3BlY3RpdmU8L2gyPgotPHA+VGhlIDxiPlBUUCBEZWJ1ZyBwZXJzcGVjdGl2ZTwvYj4gaXMgdXNlZCB3aGVuIGRlYnVnZ2luZyBhIHBhcmFsbGVsIGFwcGxpY2F0aW9uLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBzd2l0Y2ggdG8gdGhlIHBlcnNwZWN0aXZlIHdoZW4gYSA8YSBocmVmPSIwNHBMYXVuY2hDb25maWdEZWJ1Zy5odG1sIj5kZWJ1ZyBzZXNzaW9uIGlzIGxhdW5jaGVkPC9hPi4gRXhwZXJpZW5jZWQgRWNsaXBzZSB1c2VycyB3aWxsIG5vdGljZSB0aGF0IG1hbnkgb2YgdGhlIHZpZXdzIGFyZSBzaW1pbGFyIHRvIHRob3NlIGF2YWlsYWJsZSBpbiB0aGUgQ0RUIDxiPkRlYnVnIHBlcnNwZWN0aXZlczwvYj4uIFBsZWFzZSByZWZlciB0byB0aGUgPGI+Qy9DKysgRGV2ZWxvcG1lbnQgVXNlciBHdWlkZTwvYj4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlc2Ugdmlld3MuPC9wPgotCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA2cHRwRGVidWdQZXJzcC5wbmciLDI0MCkgPC9zY3JpcHQ+PC9wPgotPHA+VGhpcyBpbWFnZSBzaG93cyBhIHR5cGljYWwgZGVidWcgc2Vzc2lvbi4gSW4gdGhlIHVwcGVyIGxlZnQgb2YgdGhlIHBlcnNwZWNpdHZlIGlzIHRoZSA8Yj5QYXJhbGxlbCBEZWJ1ZyB2aWV3PC9iPiB3aGljaCBzaG93cyB0aGUgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgam9iLCBhbmQgYWxsb3dzIGJ1bGsgY29udHJvbCBvZiB0aGUgcHJvY2Vzc2VzLiBVbmRlcm5lYXRoIHRoaXMgaXMgdGhlIDxiPkRlYnVnIHZpZXc8L2I+IHdoaWNoIGlzIHRoZSBzdGFuZGFyZCB2aWV3IHNob3dpbmcgcHJvY2VzcyB0aHJlYWRzIGFuZCBzdGFjayBmcmFtZXMuIFRoZSBzb3VyY2Ugd2luZG93IHNob3dzIGEgY3VycmVudCBsaW5lIG1hcmtlciwgd2hpY2ggcmVwcmVzZW50cyB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiBhbGwgNjQgcHJvY2Vzc2VzLiBJbiB0aGUgdXBwZXIgcmlnaHQsIHRoZSA8Yj5WYXJpYWJsZXMgdmlldzwvYj4gaXMgc2hvd2luZyB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHByb2Nlc3NlcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIDxiPkRlYnVnIHZpZXc8L2I+LiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBvdGhlciB2aWV3cyBhdmFpbGFibGUgZm9yIHNldHRpbmcgYnJlYWtwb2ludHMsIG1hbmlwdWxhdGluZyBzaWduYWxzLCBldGMuIEJlbG93IHRoaXMgaXMgdGhlIHN0YW5kYXJkIDxiPk91dGxpbmUgdmlldzwvYj4uIEF0IHRoZSB2ZXJ5IGJvdHRvbSBhcmUgdGhlIHN0YW5kYXJkIDxiPlByb2JsZW1zPC9iPiwgPGI+Q29uc29sZTwvYj4sIGFuZCA8Yj5NZW1vcnk8L2I+IHZpZXdzLjwvcD4KLQotPGgyIGlkPSJwU2V0cyI+UHJvY2VzcyBTZXRzPC9oMj4KLTxwPkEga2V5IGNvbmNlcHQgZm9yIGRlYnVnZ2luZyBwYXJhbGxlbCBwcm9ncmFtcyB3aXRoIFBUUCBpcyB0aGUgbm90aW9uIG9mIGEgPGk+cHJvY2VzcyBzZXQ8L2k+LiBUcmFkaXRpb25hbCBkZWJ1Z2dlcnMgYXBwbHkgb3BlcmF0aW9ucyB0byBhIHNpbmdsZQotcHJvY2Vzcy4gIFBhcmFsbGVsIGRlYnVnZ2luZyBvcGVyYXRpb25zIGFwcGx5IHRvIGFyYml0cmFyeSBjb2xsZWN0aW9ucyBvZiBwcm9jZXNzZXMgKGluY2x1ZGluZyBhIHNpbmdsZSBwcm9jZXNzKS4gVGhlIFBUUCBkZWJ1Z2dlciBjYWxscyB0aGVzZSBhcmJpdHJhcnkgY29sbGVjdGlvbnMgcHJvY2VzcyBzZXRzLCBhbmQgdXNlcyB0aGVtIGFzIGEgbWVhbnMgb2Ygc2ltdWx0YW5lb3VzbHkgcmVmZXJyaW5nIHRvIG9uZSBvciBtb3JlIHByb2Nlc3Nlcy48L3A+Ci0KLTxwPldoZW4gYSBwYXJhbGxlbCBkZWJ1ZyBzZXNzaW9uIGlzIGZpcnN0IHN0YXJ0ZWQsIGFsbCBwcm9jZXNzZXMgYXJlIGNvbnRhaW5lZAotaW4gYSBzZXQsIGNhbGxlZCB0aGUgPGI+Um9vdDwvYj4gc2V0LiAgU2V0cyBhcmUgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBKb2IuCi1BIGpvYiBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIHByb2Nlc3Mgc2V0cywgYW5kIGEgc2V0IGNhbiBjb250YWluIGZyb20gMSB0byB0aGUKLW51bWJlciBvZiBwcm9jZXNzZXMgaW4gYSBqb2IuIFByb2Nlc3Mgc2V0cyBmcm9tIHRoZSBzYW1lIGpvYiBjYW4gY29udGFpbiBvdmVybGFwcGluZyBzZXRzIG9mIHByb2Nlc3Nlcy4gVGhpcyBpcwotc2hvd24gaW4gdGhlIGZvbGxvd2luZyBkaWFncmFtLjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNnBTZXRzLnBuZyIsMTAwKTwvc2NyaXB0PjwvcD4KLQotPHA+RGVidWcgY29tbWFuZHMgb24gdGhlIDxiPlBhcmFsbGVsIERlYnVnIHZpZXc8L2I+IHRvb2xiYXIgYWx3YXlzIGFwcGx5IHRvIHRoZSA8aT5jdXJyZW50IHByb2Nlc3Mgc2V0PC9pPiwgd2hpY2ggaXMgdGhlIHNldCBvZiBwcm9jZXNzZXMgdGhhdCBpcyB2aXNpYmxlIGluIHRoZSB2aWV3LjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNnBhcmFsbGVsRGVidWdWaWV3Q21kcy5wbmciLDEwMCk8L3NjcmlwdD48L3A+Ci0KLTxoMiBpZD0icFNldHNPcGVyIj5PcGVyYXRpb25zIG9uIFByb2Nlc3Mgc2V0czwvaDI+Ci0KLTxwPlBUUCBwcm92aWRlcyBidXR0b25zIG9uIHRoZSB0b29sYmFyIG9mIHRoZSA8Yj5QYXJhbGxlbCBEZWJ1ZyB2aWV3PC9iPgotdG8gY3JlYXRlLCBtb2RpZnksIGFuZCBkZWxldGUgcHJvY2VzcyBzZXRzLCBhbmQgdG8gY2hhbmdlCi10aGUgY3VycmVudCBwcm9jZXNzIHNldC48L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZwYXJhbGxlbERlYnVnVmlld1NldHMucG5nIiwxMDApPC9zY3JpcHQ+PC9wPgotCi0KLTxoMiBpZD0icFNldHNDcmVhdGUiPk1hbmFnaW5nIFByb2Nlc3MgU2V0czwvaDI+Ci0KLTxwPlNlbGVjdCB0aGUgcHJvY2Vzc2VzIHRvIGJlIHBsYWNlZCBpbiB0aGUgc2V0Ci1ieSBzZWxlY3RpbmcgYSByZWN0YW5ndWxhciByZWdpb24gd2l0aCB0aGUgbW91c2UsCi1vciBjbGljayB0aGUgbW91c2UgYW5kIHNoaWZ0LWNsaWNrIG9yIGN0cmwtY2xpY2sgdG8gCi1zZWxlY3QgYSBjb250aWd1b3VzIHJlZ2lvbiwgb3Igc2VwYXJhdGUgcHJvY2Vzc2VzLCByZXNwZWN0aXZlbHkuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgdG8gc2VsZWN0IGEgcmVjdGFuZ3VsYXIgc2V0IG9mIHByb2Nlc3Nlczo8L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZwU2V0U2VsZWN0LnBuZyIpPC9zY3JpcHQ+PC9wPgotCi08cD5PbmNlIHRoZSBwcm9jZXNzZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLCBjcmVhdGUgYSBwcm9jZXNzIHNldCBjbGlja2luZyBvbiB0aGUgPGI+Q3JlYXRlIFNldCBidXR0b248L2I+IDxpbWcgc3JjPSJpbWFnZXMvMDZjcmVhdGVQcm9jZXNzU2V0SWNvbi5wbmciPi48L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZzZWxlY3RQcm9jZXNzU2V0Q3JlYXRlLnBuZyIpPC9zY3JpcHQ+PC9wPgotCi08cD5UbyBhZGQgcHJvY2Vzc2VzIHRvIGFuIGV4aXN0aW5nIHByb2Nlc3Mgc2V0LCBzZWxlY3QgdGhlIHByb2Nlc3NlcyB5b3Ugd2lzaCB0byBhZGQgYW5kIGNsaWNrIG9uCi10aGUgZG93bi1hcnJvdyA8aW1nIHNyYz0iaW1hZ2VzLzA2ZG93bkFycm93U2VsZWN0LnBuZyI+IHRvIHRoZSByaWdodCBvZiB0aGUgaWNvbjo8L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZzZWxlY3RQcm9jZXNzU2V0Q3JlYXRlQWRkLnBuZyIsIDgwKTwvc2NyaXB0PjwvcD4KLQotCi08cD5UbyBjaGFuZ2UgdGhlIGN1cnJlbnQgcHJvY2VzcyBzZXQsIHNlbGVjdCB0aGUgPGI+Q2hhbmdlIFNldCBidXR0b248L2I+Ci08aW1nIHNyYz0iaW1hZ2VzLzA2cFNldENob29zZUljb24ucG5nIj4KLWFuZCBjaG9vc2UgZnJvbSB0aGUgbGlzdCB2aWEgdGhlIGRvd24tYXJyb3cgPGltZyBzcmM9ImltYWdlcy8wNmRvd25BcnJvd1NlbGVjdC5wbmciPiwgb3IgCi1jbGljayBvbiB0aGUgYnV0dG9uIGl0c2VsZiB0byBjeWNsZSB0aHJvdWdoIHRoZSBzZXRzLjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNnBTZXRDaGFuZ2UucG5nIik8L3NjcmlwdD48L3A+Ci0KLTxwPlRvIHJlbW92ZSBwcm9jZXNzZXMgZnJvbSB0aGUgPGk+Y3VycmVudCBzZXQ8L2k+LCBzZWxlY3QgdGhlIHByb2Nlc3NlcyAKLWFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIGNsaWNrIHRoZQotPGI+UmVtb3ZlIEVsZW1lbnRzIGJ1dHRvbjwvYj4uPC9wPgotCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA2cFNldFJlbW92ZS5wbmciLCAxMDApPC9zY3JpcHQ+PC9wPgotCi08cD5TZWxlY3QgdGhlIDxiPkRlbGV0ZSBTZXQgYnV0dG9uPC9iPiB0byBkZWxldGUgdGhlIGN1cnJlbnQgcHJvY2VzcyBzZXQ6PC9wPgotCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA2cFNldERlbGV0ZS5wbmciLCAxMDApPC9zY3JpcHQ+PC9wPgotCi08aDIgaWQ9ImJrcHQiPkJyZWFrcG9pbnRzPC9oMj4KLTxwPlBUUCBoYXMgYSBzcGVjaWFsIHR5cGUgb2YgYnJlYWtwb2ludCBrbm93biBhcyBhIDxpPnBhcmFsbGVsIGJyZWFrcG9pbnQ8L2k+LiBUaGVzZSBicmVha3BvaW50cyBkaWZmZXIgZnJvbSBub3JtYWwgYnJlYWtwb2ludHMgYmVjYXVzZSB0aGV5IGFwcGx5IHRvIGEgc2V0IG9mIHByb2Nlc3NlcyBpbnN0ZWFkIG9mIGEgc2luZ2xlIHByb2Nlc3MgKG9yIHRocmVhZCkuIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcGFyYWxsZWwgYnJlYWtwb2ludHM6PC9wPgotCi08dWw+Ci08bGk+PHA+PGk+R2xvYmFsIGJyZWFrcG9pbnRzPC9pPiBhcHBseSB0byA8aT5hbGw8L2k+IHByb2Nlc3NlcyBpbiA8aT5hbnk8L2k+IGpvYi4gQSBnbG9iYWwgYnJlYWtwb2ludCByZW1haW5zIGluIGVmZmVjdCBiZXR3ZWVuIGpvYiBsYXVuY2hlcy4gVHlwaWNhbGx5LCBhIGdsb2JhbCBicmVha3BvaW50IGlzIHVzZWQgZm9yIGdhaW5pbmcgY29udHJvbCBvZiBhbiBhcHBsaWNhdGlvbiBhdCBhIHByZWRldGVybWluZWQgcG9pbnQuIEdsb2JhbCBicmVha3BvaW50cyBhcmUgaWRlbnRpZmllZCBieSBhIHBhcmFsbGVsIGJyZWFrcG9pbnQgaWNvbiB3aXRoIGEgc21hbGwgPGNvZGU+RzwvY29kZT4gaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyOjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNmdsb2JhbEJyZWFrcG9pbnQucG5nIiw2MCk8L3NjcmlwdD48L3A+IAotPC9saT4KLQotPGxpPjxwPjxpPlNldCBCcmVha3BvaW50cyA8L2k+IGFwcGx5IG9ubHkgdG8gYSA8aT5zcGVjaWZpYyBzZXQ8L2k+IG9mIHByb2Nlc3NlcwotKHdoaWNoIGNhbiBpbmNsdWRlIHRoZSByb290IHNldCkgZm9yIGEgPGk+c2luZ2xlPC9pPiBqb2IuIFdoZW4gdGhlIGpvYiBjb21wbGV0ZXMsCi10aGVzZSBicmVha3BvaW50cyBhcmUgcmVtb3ZlZC48L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZzZXRCcmVha3BvaW50LnBuZyIsNjApPC9zY3JpcHQ+PC9wPiAKLTwvbGk+Ci08cD5TZXQgYnJlYWtwb2ludHMgY2FuIGJlIG9uZSBvZiB0aHJlZSBjb2xvcnM6PHA+Ci08dWw+Ci08bGk+PHA+R3JlZW4gaW5kaWNhdGVzIHRoZSBicmVha3BvaW50IGFwcGxpZXMgdG8gdGhlIGN1cnJlbnQgc2V0LjwvcD48L2xpPgotPGxpPjxwPkJsdWUgaW5kaWNhdGVzIHRoZSBicmVha3BvaW50IGFwcGxpZXMgdG8gc29tZSBvdGhlciBzZXQgdGhhbiB0aGUgY3VycmVudCBzZXQsIGJ1dCB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgcHJvY2Vzc2VzIGluIHRoZSBzZXRzLjwvcD48L2xpPgotPGxpPjxwPlllbGxvdyBpbmRpY2F0ZXMgdGhlIGJyZWFrcG9pbnQgYXBwbGllcyB0byBzb21lIG90aGVyIHNldCB0aGFuIHRoZSBjdXJyZW50IHNldCwgYW5kIHRoZXJlIGFyZSBubyBvdmVybGFwcGluZyBwcm9jZXNzZXMgaW4gdGhlIHNldHMuPC9wPjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPlNldHRpbmcgYSBicmVha3BvaW50PC9oMz48cD4KLVRvIGNyZWF0ZSBhIGJyZWFrcG9pbnQsIGRvdWJsZS1jbGljayBvbiB0aGUgbGVmdCBlZGdlIG9mIAotYW4gZWRpdG9yIHdpbmRvdywgYXQgdGhlIGxpbmUgb24gd2hpY2ggeW91IHdhbnQgdG8gc2V0IHRoZSBicmVha3BvaW50LgotWW91IGNhbiBhbHNvIHJpZ2h0LWNsaWNrIGFuZCB1c2UgdGhlIDxiPlBhcmFsbGVsIEJyZWFrcG9pbnQgJmd0OyBUb2dnbGUgYnJlYWtwb2ludDwvYj4gY29udGV4dCBtZW51LjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNmJrcHRTZXRDb250ZXh0LnBuZyIpPC9zY3JpcHQ+PC9wPiAKLQotPHA+QSBnbG9iYWwgYnJlYWtwb2ludCBpcyBjcmVhdGVkIGlmIG5vIGpvYnMgYXJlIHNlbGVjdGVkIGluIHRoZSA8Yj5QYXJhbGxlbCBEZWJ1ZyB2aWV3PC9iPi4KLUlmIGEgam9iIGlzIHNlbGVjdGVkLCB0aGUgYnJlYWtwb2ludCB3aWxsIGFwcGx5IHRvIHRoZSBjdXJyZW50IHNldC48L3A+Ci0KLTxoMz5CcmVha3BvaW50IGluZm9ybWF0aW9uPC9oMz4KLQotPHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdG8gZmluZCBvdXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIGJyZWFrcG9pbnQsIHN1Y2ggYXMgdGhlIHNvdXJjZSBmaWxlLCBsaW5lIGFuZCBwcm9jZXNzIHNldCBpdCBhcHBsaWVzIHRvLiBQbGFjaW5nIHRoZSBtb3VzZSBvdmVyIGEgYnJlYWtwb2ludCB3aWxsIGRpc3BsYXkgYSB0b29sdGlwIHBvcHVwOjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNmJrcHRIb3Zlci5wbmciLCA4MCk8L3NjcmlwdD48L3A+IAotCi08cD5UaGUgPGI+QnJlYWtwb2ludHMgdmlldzwvYj4gY2FuIGJlIHVzZWQgdG8gc2VlIGFsbCBicmVha3BvaW50cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkOiA8L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZia3B0c1ZpZXcucG5nIik8L3NjcmlwdD48L3A+IAotCi08cD5Vc2UgPGI+U2hvdyAmZ3Q7IFBhcmFsbGVsIEJyZWFrcG9pbnQgU2V0PC9iPiBpbiB0aGUgbWVudSBvbiB0aGUgPGI+QnJlYWtwb2ludHMgdmlldzwvYj4gdG9vbGJhciB0byBncm91cCBicmVha3BvaW50cwotYnkgdGhlIHByb2Nlc3Mgc2V0IHRoZXkgYXBwbHkgdG86PC9wPgotCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA2YmtwdHNWaWV3TWVudS5wbmciKTwvc2NyaXB0PjwvcD4gCi0KLTxwPkZvciBleGFtcGxlIHRoZSBhYm92ZSBzZWxlY3Rpb24gd2lsbCBsaXN0IHRoZSBicmVha3BvaW50cwotYnkgcHJvY2VzcyBzZXQ6PC9wPgotCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA2YmtwdHNWaWV3QnlQcm9jZXNzU2V0LnBuZyIpPC9zY3JpcHQ+PC9wPiAKLQotPGgyIGlkPSJjaXAiPkN1cnJlbnQgSW5zdHJ1Y3Rpb24gUG9pbnRlcjwvaDI+Ci08cD5UaGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyIGlzIHVzZWQgdG8gc2hvdyB0aGUgY3VycmVudAotbG9jYXRpb24gb2YgPGk+c3VzcGVuZGVkPC9pPiBwcm9jZXNzZXMuCi1JbiB0cmFkaXRpb25hbCBwcm9ncmFtcywgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBpbnN0cnVjdGlvbiBwb2ludGVyIGRpc3BsYXllZCBhdCBhbnkgb25lIHRpbWUuCi1JbiBwYXJhbGxlbCBwcm9ncmFtcywgdGhlcmUgaXMgYW4gaW5zdHJ1Y3Rpb24gcG9pbnRlciBmb3IgZXZlcnkgcHJvY2Vzcy48L3A+Ci0KLTxwPlRoZSBQVFAgZGVidWdnZXIgc2hvd3Mgb25lIGluc3RydWN0aW9uIHBvaW50ZXIgZm9yCi08aT5ldmVyeSBncm91cCBvZiBwcm9jZXNzZXMgYXQgdGhlIHNhbWUgbG9jYXRpb248L2k+LiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZXJlIGFyZSBwcm9jZXNzZXMgc3VzcGVuZGVkCi1hdCB0aHJlZSBkaWZmZXJlbnQgbG9jYXRpb25zIGluIHRoZSBwcm9ncmFtLjwvcD4KLQotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wNm1pcC5wbmciKTwvc2NyaXB0PjwvcD4gCi0KLTxwPjxpPlRoZSBncm91cCBvZiBwcm9jZXNzZXMgcmVwcmVzZW50ZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gcG9pbnRlcgotaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIGEgcHJvY2VzcyBzZXQuPC9pPjwvcD4KLQotPHA+RGlmZmVyZW50IG1hcmtlcnMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGVzIG9mIHByb2Nlc3NlcyBzdG9wcGVkIGF0IHRoYXQgbG9jYXRpb24gKHRoZSBkaWZmZXJlbnQgdHlwZXMgd2lsbCBiZSBkaXNjdXNzZWQgYmVsb3cpOjwvcD4KLTx1bD4KLTxsaT48cD48aW1nIHNyYz0iaW1hZ2VzLzA2aXBSZWcucG5nIj5SZWdpc3RlcmVkIHByb2Nlc3NlcyBtYXJrZXI8L3A+PC9saT4KLTxsaT48cD48aW1nIHNyYz0iaW1hZ2VzLzA2aXBVbnJlZy5wbmciPlVuLXJlZ2lzdGVyZWQgcHJvY2Vzc2VzIG1hcmtlcjwvcD48L2xpPgotPGxpPjxwPjxpbWcgc3JjPSJpbWFnZXMvMDZpcE11bHQucG5nIj5NYXJrZXIgaW5kaWNhdGluZyBhIGNvbWJpbmF0aW9uIG9mIHJlZ2lzdGVyZWQgYW5kIHVuLXJlZ2lzdGVyZWQgcHJvY2Vzc2VzPC9wPjwvbGk+Ci08L3VsPgotCi08cD5QbGFjaW5nIHRoZSBtb3VzZSBvdmVyIGFuIGluc3RydWN0aW9uIHBvaW50ZXIgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2Vzc2VzIHN1c3BlbmRlZCBhdCB0aGF0IGxvY2F0aW9uOjwvcD4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZjaXBIb3Zlci5wbmciLCA4MCk8L3NjcmlwdD48L3A+IAotCi08aDIgaWQ9InJlZyI+UHJvY2VzcyBSZWdpc3RyYXRpb24gYW5kIHRoZSBEZWJ1ZyBWaWV3PC9oMj4gCi0KLTxwPk9uY2UgcHJvY2Vzc2VzIG9mIGEgcGFyYWxsZWwgam9iIGhhdmUgYmVlbiBzdXNwZW5kZWQsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBvYnRhaW4gbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbmRpdmlkdWFsIHByb2Nlc3MuIEluIG9yZGVyIHRvIGRvIHRoaXMsIGEgcGFydGljdWxhciBwcm9jZXNzIG11c3QgZmlyc3QgYmUgPGk+cmVnaXN0ZXJlZDwvaT4uIE9uY2UgYSBwcm9jZXNzIGlzIHJlZ2lzdGVyZWQgaXQncyB0aHJlYWRzIGFuZCBzdGFjayBmcmFtZXMgYXBwZWFyIGluIHRoZSA8Yj5EZWJ1ZyB2aWV3PC9iPi4gQnkgc2VsZWN0aW5nIHRoZSBzdGFjayBmcmFtZSBpbiB0aGlzIHZpZXcsIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIG9idGFpbmVkIGluIHRoZSA8Yj5WYXJpYWJsZXMgdmlldzwvYj4uPC9wPgotCi08cD5BbnkgbnVtYmVyIG9mIHByb2Nlc3NlcyBjYW4gYmUgcmVnaXN0ZXJlZCwgYW5kIHByb2Nlc3NlcyBjYW4gYmUgcmVnaXN0ZXJlZCBvciB1bi1yZWdpc3RlcmVkIGF0IGFueSB0aW1lLiBUbyByZWdpc3RlciBhIHByb2Nlc3MsIGRvdWJsZS1jbGljayBpdHMgcHJvY2VzcyBpY29uIGluIHRoZSA8Yj5QYXJhbGxlbCBEZWJ1ZyB2aWV3PC9iPi4gQSBibGFjayBib3ggd2lsbCBiZSBzaG93biBhcm91bmQgdGhlIHByb2Nlc3MgaWNvbiB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQuIEF0IHRoZSBzaW1lIHRpbWUsIHRoZSBwcm9jZXNzIHdpbGwgYXBwZWFyIGluIHRoZSA8Yj5EZWJ1ZyB2aWV3PC9iPi48L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDZyZWcxLnBuZyIsMjQwKSA8L3NjcmlwdD48L3A+Ci0KLTxwPlRvIHVuLXJlZ2lzdGVyIGEgcHJvY2VzcywgZG91YmxlLWNsaWNrIG9uIHRoZSBzYW1lIHByb2Nlc3MgaWNvbi4gVGhlIGJveCBkaXNhcHBlYXJzLCBhbmQgdGhlIHByb2Nlc3MgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkZWJ1ZyB2aWV3LjwvcD4KLQotPHA+VGhlIDxiPkRlYnVnIHZpZXc8L2I+IGFsc28gcHJvdmlkZXMgYSBzZXQgb2YgZGVidWcgY29tbWFuZHMgKHJlc3VtZSwgcGF1c2UsIHN0ZXAgb3ZlciwgZXRjLikgdGhhdCBhcHBseSB0byB0aGUgPGk+Y3VycmVudGx5IHNlbGVjdGVkIHByb2Nlc3M8L2k+IGluIHRoZSB2aWV3LiBUaGlzIHByb3ZpZGVzIGEgY29udmVuaWVudCBtZWFucyBvZiBjb250cm9sbGluZyBpbmRpdmlkdWFsIHByb2Nlc3Nlcy48L3A+Ci0KLTxoMiBpZD0iZmluaXNoIj5UZXJtaW5hdGluZyBFeGVjdXRpb248L2gyPgotPHA+QXQgdGhlIGVuZCBvZiBhIGRlYnVnIHNlc3Npb24sIGl0IGlzIG5lY2Vzc2FyeSB0byB0ZXJtaW5hdGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgam9iLiBUbyBkbyB0aGlzLCBjbGljayBvbiB0aGUgdGVybWluYXRlIGljb24gPGltZyBzcmM9ImltYWdlcy8wNnRlcm1pbmF0ZUFsbC5wbmciPiBpbiB0aGUgPGI+UGFyYWxsZWwgRGVidWcgdmlldzwvYj4uICBOb3RlIHRoYXQgdGhlIHRlcm1pbmF0ZSBpY29uIGluIHRoZSA8Yj5EZWJ1ZyB2aWV3PC9iPiA8aW1nIHNyYz0iaW1hZ2VzLzA2dGVybWluYXRlLnBuZyI+IHdpbGwgb25seSB0ZXJtaW5hdGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9jZXNzIGluIHRoYXQgdmlldy48L3A+Ci0KLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC8wN3B0cFByZWZzLmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzA3cHRwUHJlZnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNkOWY5OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sLzA3cHRwUHJlZnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlBUUCBQcmVmZXJlbmNlczwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMT5QVFAgUHJlZmVyZW5jZXM8L2gxPgotPHA+VG8gb3BlbiB0aGUgPGI+UHJlZmVyZW5jZXMgZGlhbG9nPC9iPiwgc2VsZWN0OjwvcD4KLTx1bD4KLTxsaT48cD48Yj5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcy4uLjwvYj4gZm9yIFdpbmRvd3MgYW5kIExpbnV4PC9wPjwvbGk+Ci08bGk+PHA+PGI+RWNsaXBzZSAmZ3Q7IFByZWZlcmVuY2VzLi4uPC9iPiBmb3IgTWFjT1MgWDwvcD48L2xpPgotPC91bD4KLQotPHA+TmV4dCwgZXhwYW5kIDxiPlBUUDwvYj4gaW4gdGhlIGxpc3Qgb2YgcHJlZmVyZW5jZXMgcGFnZXMgb24gdGhlIGxlZnQgc2lkZSBhbmQgY2hvb3NlIHRoZSBjb21wb25lbnQgd2hvJ3MgcHJlZmVyZW5jZXMgeW91IHdpc2ggdG8gY2hhbmdlLiBUaGUgZm9sbG93aW5nIGltYWdlIHNob3dzIGFsbCBhdmFpbGFibGUgY29tcG9uZW50czo8L3A+Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvMDdwcmVmc0FsbC5wbmciKSA8L3NjcmlwdD48L3A+Ci0KLTxoMiBpZD0ibWFpbiI+PGEgbmFtZT0icnVuIj48L2E+UFRQIFByZWZlcmVuY2UgUGFnZSA8L2gyPgotPHA+VGhpcyBpcyB0aGUgbWFpbiBwcmVmZXJlbmNlcyBwYWdlIGZvciBQVFAuIEF2YWlsYWJsZSBwcmVmZXJlbmNlcyBhcmU6PC9wPgotPGRsPgotPGR0PjxiPk91dHB1dCBkaXJlY3Rvcnk8L2I+PC9kdD48ZGQ+VGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgdG8gc2F2ZSBwcm9jZXNzIG91dHB1dDwvZGQ+Ci08ZHQ+PGI+U3RvcmUgbGluZSBudW1iZXI8L2I+PC9kdD48ZGQ+TnVtYmVyIG9mIGxpbmVzIG9mIG91dHB1dCBmcm9tIGVhY2ggcHJvY2VzcyB0byBzYXZlICgwIG1lYW5zIGluZmluaXRlKTwvZGQ+Ci08L2RsPgotCi08aDIgaWQ9ImRlYnVnIj5EZWJ1ZyBQcmVmZXJlbmNlcyBQYWdlIChQVFAgJmd0OyBEZWJ1Zyk8L2gyPgotPHA+VGhpcyBpcyB0aGUgbWFpbiBwYXJhbGxlbCBkZWJ1Z2dlciBwcmVmZXJlbmNlcyBwYWdlLiBUaGVzZSBhcmUgIHByZWZlcmVuY2VzIHRoYXQgYXBwbHkgdG8gYW55IHBhcmFsbGVsIGRlYnVnZ2VyLgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wN3ByZWZzRGVidWcucG5nIikgPC9zY3JpcHQ+PC9wPgotCi08aDM+RGVmYXVsdCBzZXR0aW5nPC9oMz4KLTxwPlRoZXNlIHByZWZlcmVuY2VzIGNvbnRyb2wgc29tZSBkZWJ1Z2dlciBkZWZhdWx0IGJlaGF2aW9yPC9wPgotPGRsPgotPGR0PjxiPlNob3cgZnVsbCBwYXRocyBvbiBicmVha3BvaW50PC9iPiAoZGVmYXVsdCBkaXNhYmxlZCk8L2R0PjxkZD5Vc2UgdGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIGZpbGUgd2hlbiBkaXNwbGF5ZWQgaW4gdGhlIGRlYnVnZ2VyIDxiPkJyZWFrcG9pbnQgdmlldzwvYj48L2RkPgotPGR0PjxiPlJlZ2lzdGVyIHByb2Nlc3MgMCBieSBkZWZhdWx0PC9iPiAoZGVmYXVsdCBlbmFibGVkKTwvZHQ+PGRkPldpbGwgcmVnaXN0ZXIgcHJvY2VzcyAwIHdpdGggdGhlIDxiPkRlYnVnIHZpZXc8L2I+IHdoZW4gdGhlIHBhcmFsbGVsIGRlYnVnZ2VyIHN0YXJ0cy4gVGhpcyBpcyByZXF1aXJlZCB0byBlbmFibGUgRWNsaXBzZSB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byB0aGUgPGI+UFRQIERlYnVnIHBlcnNwZWN0aXZlPC9iPiB3aGVuIGEgZGVidWdnZXIgYnJlYWtwb2ludCBpcyBoaXQuPC9kZD4KLTwvZGw+Ci0KLTxoMz5Db21tdW5pY2F0aW9uPC9oMz4KLTxwPlRoZXNlIGFyZSBwcmVmZXJlbmNlcyByZWxhdGluZyB0byB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEVjbGlwc2UgYW5kIHRoZSBleHRlcm5hbCBwYXJhbGxlbCBkZWJ1Z2dlci4gVGhleSBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byBiZSBjaGFuZ2VkLjwvcD4KLTxkbD4KLTxkdD48Yj5Db21tYW5kIHRpbWVvdXQgKG1zKTwvYj4gKGRlZmF1bHQgNjAwMDApPC9kdD48ZGQ+VGhpcyBzcGVjaWZpY2VzIHRoZSBwZXJpb2QgRWNsaXBzZSB3YWl0cyBhZnRlciBzZW5kaW5nIGEgY29tbWFuZCB0byB0aGUgZXh0ZXJuYWwgZGVidWdnZXIuIElmIG5vIHJlc3BvbnNlIGlzIHJlY2VpdmVkIHRoZSBkZWJ1ZyBzZXNzaW9uIHdpbGwgYmUgdGVybWluYXRlZC48L2RkPgotPC9kbD4KLQotPGgzPlZhcmlhYmxlPC9oMz4KLTxwPlRoZXNlIHZhcmlhYmxlcyBjb250cm9sIHRoZSBhY3Rpb24gb2YgdGhlIGRlYnVnZ2VyIHRvIHVwZGF0ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbi48L3A+Ci08ZGw+Ci08ZHQ+PGI+VGhlIGRlYnVnZ2VyIGlzIHN1c3BlbmRlZDwvYj4gKGRlZmF1bHQgZW5hYmxlZCk8L2R0PjxkZD5UaGUgZGVidWdnZXIgYWxsb3dzIHZhcmlhYmxlIHZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgaW4gdG9vbHRpcCBwb3B1cHMgd2hlbiB0aGUgbW91c2UgaG92ZXJzIG92ZXIgYSBwcm9jZXNzIGluIHRoZSA8Yj5QYXJhbGxlbCBEZWJ1ZyB2aWV3PC9iPi4gRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCB1cGRhdGUgYWxsIHRoZSB2YWx1ZXMgZWFjaCB0aW1lIHRoZSBwcm9jZXNzIGlzIHN1c3BlbmRlZC4gV2hlbiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZCwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSB0b29sdGlwIHBvcHVwIGlzIGRpc3BsYXllZC48L2RkPgotPGR0PjxiPkpvYiBvciBTZXQgaXMgY2hhbmdlZDwvYj4gKGRlZmF1bHQgZGlzYWJsZWQpPC9kdD48ZGQ+VmFyaWFibGUgdmFsdWVzIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSBjdXJyZW50IGpvYiBvciBzZXQgaXMgY2hhbmdlZC48L2RkPgotPC9kbD4KLQotPGgyPiAgU0RNIChTY2FsYWJsZSBEZWJ1ZyBNYW5hZ2VyKSBQcmVmZXJlbmNlcyAoUFRQICZndDsgRGVidWcgPiBTRE0pPC9oMj4KLTxwPlRoZXNlIGFyZQotICBwcmVmZXJlbmNlcyBmb3IgY29udHJvbGxpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBzY2FsYWJsZSBkZWJ1ZyBtYW5hZ2VyLCB3aGljaCBpcyBzZXJ2ZXIgY29tcG9uZW50IG9mIHRoZSBwYXJhbGxlbCBkZWJ1Z2dlci4gVGhleQotICBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byBiZSBjaGFuZ2VkLjwvcD4KLSAgCi08cD48c2NyaXB0PiB0aHVtYigiaW1hZ2VzLzA3cHJlZnNEZWJ1Z1NETS5wbmciKSA8L3NjcmlwdD48L3A+Ci0KLTxoMz5EZWJ1Z2dlciBsYXVuY2ggcHJlZmVyZW5jZXM8L2gzPgotPHA+VGhlc2UgcHJlZmVyZW5jZSBjb250cm9sIGhvdyB0aGUgZGVidWdnZXIgYmVoYXZlcyB3aGVuIGl0IGlzIGxhdW5jaGVkLiAgCi0gICAgVGhleSBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byBiZSBhbHRlcmVkLjwvcD4KLSAgICAKLTxkbD4KLTxkdD48Yj5TRE0gY2xpZW50IGhvc3Q8L2I+IChkZWZhdWx0IGxvY2FsaG9zdCk8L2R0PjxkZD5UaGlzIHNwZWNpZmllcyB0aGUgaG9zdCBvbiB3aGljaCBFY2xpcHNlIGlzIHJ1bm5pbmcuIEl0IGlzIHVzZWQgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgU0RNIGFuZCBFY2xpcHNlLiBJbiBzaXR1YXRpb25zIHdoZXJlIGEgcGFyYWxsZWwgam9iIGlzIGJlaW5nIGRlYnVnZ2VkIHJlbW90ZWx5LCB0aGlzIHNob3VsZCBiZSB0aGUgaG9zdCBuYW1lIG9mIHRoZSAmcXVvdDtmcm9udCBlbmQmcXVvdDsgb24gd2hpY2ggRWNsaXBzZSBpcyBydW5uaW5nLjwvZGQ+Ci08ZHQ+PGI+QmFja2VuZCBkZWJ1Z2dlcjwvYj4gKGRlZmF1bHQgZ2RiLW1pKTwvZHQ+PGRkPlRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kIGRlYnVnZ2VyIHRvIHVzZSB3aGVuIGRlYnVnZ2luZyB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgYW4gaW50ZXJuYWwgbmFtZSBrbm93biBieSB0aGUgU0RNLCBub3QgdGhlIG5hbWUgb2YgdGhlIGRlYnVnZ2VyIGl0c2VsZi4gQ3VycmVudGx5IG9ubHkgZ2RiIHVzaW5nIHRoZSBNSSBtb2RlIGlzIHN1cHBvcnRlZC48L2RkPgotPGR0PjxiPkV4dHJhIFNETSBhcmd1bWVudHM8L2I+IChkZWZhdWx0IGVtcHR5KTwvZHQ+PGRkPkFueSBleHRyYSBhcmd1bWVudHMgdGhhdCBuZWVkIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzZG0gKGUuZy4gZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcyk8L2RkPgotPC9kbD4KLQotPGgyIGlkPSJwbGR0Ij5QYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29sIChQTERUKSBQcmVmZXJlbmNlczwvaDI+Ci08cD5TZWUgdGhlIGhlbHAgZm9yIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwL2h0bWwvdG9jLmh0bWwiPlBMRFQ8L2E+PC9wPgotCi08aDIgaWQ9InJtIj48L2E+UmVzb3VyY2UgTWFuYWdlciBQcmVmZXJlbmNlcyAoUFRQID4gUmVzb3VyY2UgTWFuYWdlcnMgKTwvaDI+Ci08cD5TZWUgdGhlIGhlbHAgZm9yIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5wdHAuaWJtbGwuaGVscC9odG1sL0lCTUxMTWFpbkhlbHAuaHRtbCI+TG9hZGxldmVsZXI8L2E+IAotYW5kIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5wdHAuaWJtcGUuaGVscC9odG1sL1BFTWFpbkhlbHAuaHRtbCI+UGFyYWxsZWwgRW52aXJvbm1lbnQ8L2E+Ci1mb3IgZGV0YWlscyBvbiB0aGVpciBwcmVmZXJlbmNlIHBhZ2VzLjwvcD4KLQotCi08aDIgaWQ9Im9ydGUiPjwvYT5PcGVuIE1QSSBQcmVmZXJlbmNlcyAoUFRQICZndDsgUmVzb3VyY2UgTWFuYWdlcnMgJmd0OyBPcGVuIE1QSSk8L2gyPgotCi08cD4gVGhlc2UgYXJlIHByZWZlcmVuY2VzIHNwZWNpZmljIHRvIE9wZW4gTVBJLjwvcD4KLQotPGgzPk9wZW4gTVBJIDEuMjwvaDM+Ci08cD5TcGVjaWZpZXMgdGhlIGRlZmF1bHRzIGZvciBPcGVuIE1QSSB2ZXJzaW9uIDEuMi48cD4KLTxkbD4KLTxkdD48Yj5MYXVuY2ggY29tbWFuZDwvYj48L2R0PjxkZD5UaGUgZGVmYXVsdCBjb21tYW5kIHVzZWQgdG8gbGF1bmNoIGFwcGxpY2F0aW9ucy48L2RkPgotPGR0PjxiPkRlYnVnIGNvbW1hbmQ8L2I+PC9kdD48ZGQ+VGhlIGRlZmF1bHQgY29tbWFuZCB1c2VkIHRvIGxhdW5jaCB0aGUgZGVidWdnZXIuPC9kZD4KLTxkdD48Yj5EaXNjb3ZlciBjb21tYW5kPC9iPjwvZHQ+PGRkPlRoZSBkZWZhdWx0IGNvbW1hbmQgdXNlZCB0byBkaXNjb3ZlciB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uPC9kZD4KLTxkdD48Yj5QYXRoIHRvIGluc3RhbGxhdGlvbjwvYj48L2R0PjxkZD5UaGUgZGVmYXVsdCBwYXRoIHRvIHRoZSBPcGVuIE1QSSBpbnN0YWxsYXRpb24uPC9kZD4KLTwvZGw+Ci0KLTxoMz5PcGVuIE1QSSAxLjM8L2gzPgotPHA+U3BlY2lmaWVzIHRoZSBkZWZhdWx0cyBmb3IgT3BlbiBNUEkgdmVyc2lvbiAxLjMuPHA+Ci08ZGw+Ci08ZHQ+PGI+TGF1bmNoIGNvbW1hbmQ8L2I+PC9kdD48ZGQ+VGhlIGRlZmF1bHQgY29tbWFuZCB1c2VkIHRvIGxhdW5jaCBhcHBsaWNhdGlvbnMuPC9kZD4KLTxkdD48Yj5EZWJ1ZyBjb21tYW5kPC9iPjwvZHQ+PGRkPlRoZSBkZWZhdWx0IGNvbW1hbmQgdXNlZCB0byBsYXVuY2ggdGhlIGRlYnVnZ2VyLjwvZGQ+Ci08ZHQ+PGI+RGlzY292ZXIgY29tbWFuZDwvYj48L2R0PjxkZD5UaGUgZGVmYXVsdCBjb21tYW5kIHVzZWQgdG8gZGlzY292ZXIgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLjwvZGQ+Ci08ZHQ+PGI+UGF0aCB0byBpbnN0YWxsYXRpb248L2I+PC9kdD48ZGQ+VGhlIGRlZmF1bHQgcGF0aCB0byB0aGUgT3BlbiBNUEkgaW5zdGFsbGF0aW9uLjwvZGQ+Ci08L2RsPgotCi08aDIgaWQ9InZpZXdlciI+Vmlld2VyIChQVFAgJmd0OyBWaWV3ZXIpPC9oMj4KLTxwPlRoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2Ygc29tZSBvZiB0aGUgUFRQIHZpZXdzLiBUaGV5IGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIGJlIGFsdGVyZWQuPC9wPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy8wN3ByZWZzVmlld2VyLnBuZyIpPC9zY3JpcHQ+PC9wPgotCi08aDM+VG9vbHRpcDwvaDM+Ci08cD5Db250cm9scyB0aGUgd2F5IHRvb2x0aXBzIGZvciBQVFAgdmFyaWFibGVzIGFyZSBkaXNwbGF5ZWQuPC9wPgotPGRsPgotPGR0PjxiPlNob3cgYWxsIHRoZSB0aW1lPC9iPjwvZHQ+PGRkPkFsd2F5cyBzaG93IHRvb2x0aXBzPC9kZD4KLTxkdD48Yj5UaW1lb3V0IChtcyk8L2I+IChkZWZhdWx0IDUwMDApPC9kdD48ZGQ+Q2hhbmdlcyB0aGUgdGltZSB0aGUgdG9vbHRpcCByZW1haW5zIGRpc3BsYXllZCB3aGVuIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBhIG5vZGUgb3IgcHJvY2VzcyBpY29uLjwvZGQ+Ci08ZHQ+PGI+V3JhcCB0ZXh0PC9iPiAoZGVmYXVsdCBlbmFibGVkKTwvZHQ+PGRkPldyYXAgdGhlIHRleHQgdG8gZml0IGludG8gdGhlIHRvb2x0aXA8L2RkPgotPC9kbD4KLQotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2hlbHAuY3NzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9oZWxwLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwOWY5MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2hlbHAuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovDQotDQotDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgY29sb3I6ICMwMDAwMDB9DQotcHJlCQkJCXsgZm9udC1mYW1pbHk6IENvdXJpZXIsIG1vbm9zcGFjZX0NCi0NCi0vKiBlbmQgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyAqLw0KLQ0KLS8qIGZvbGxvd2luZyBmb250IHNpemUgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBPSyBmb3IgREJDUyAqLw0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBwLCB0YWJsZSwgdGQsIGNhcHRpb24sIHRoLCB1bCwgb2wsIGRsLCBsaSwgZGQsIGR0IHtmb250LXNpemU6IDEwcHQ7IH0NCi1wcmUJCQkJeyBmb250LXNpemU6IDEwcHR9DQotDQotLyogZW5kIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi1ib2R5CSAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGfQ0KLWgxICAgICAgICAgICB7IGZvbnQtc2l6ZTogMThwdDsgbWFyZ2luLXRvcDogNTsgbWFyZ2luLWJvdHRvbTogMSB9CQ0KLWgyICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTRwdDsgbWFyZ2luLXRvcDogMjU7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWgzICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTFwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWg0ICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTBwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDM7IGZvbnQtc3R5bGU6IGl0YWxpYyB9DQotcCAJICAgICB7IGZvbnQtc2l6ZTogMTBwdDsgfQ0KLXByZQkgICAgIHsgbWFyZ2luLWxlZnQ6IDY7IGZvbnQtc2l6ZTogOXB0IH0NCi0NCi1hOmxpbmsgeyBjb2xvcjogIzAwNjY5OSB9DQotYTp2aXNpdGVkIHsgY29sb3I6ICM5OTY2OTkgfQ0KLWE6aG92ZXIgIHsgY29sb3I6ICMwMDY2OTkgfQ0KLQ0KLXVsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotbGkJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1saSBwCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gDQotb2wJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1kbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWR0CSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwOyBmb250LXdlaWdodDogYm9sZCB9DQotZGQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfQ0KLXN0cm9uZwkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGR9DQotZW0JICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi12YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi1kaXYucmV2aXNpb24geyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOyANCi0JCQkJICAgYm9yZGVyLWxlZnQtY29sb3I6ICM3QjY4RUU7IHBhZGRpbmctbGVmdDo1IH0NCi10aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KLQ0KLS8qIE1pa2UgQmVobSdzIGFkZGl0aW9uIHRvIHRoZSBzdHlsZSBzaGVldCAqLw0KLS51c2VyaW5wdXQgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyB9DQotLmd1aXRhYiwgLmltcG9ydGFudCwgLmd1aWJ1dHRvbiwgLnNlbGVjdGJsdWUsIC5ndWltZW51LCAuZ3VpbGFiZWwsIA0KLS5ub3RldGl0bGUgIHsNCi0gICAgIGNvbG9yOiAjMDAwMDAwOw0KLSAgICAgZm9udC1mYW1pbHk6IGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7DQotICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgIH0NCi1kaXYubGludXggIHtkaXNwbGF5Om5vbmU7fQ0KLS5maXJzdGVybSB7Zm9udC1zdHlsZTppdGFsaWM7fQ0KLQ0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLy5jdnNpZ25vcmUgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODBiNWQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBzcGJyd3NlLmpiZgotb2xkCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMW1waVByb2pTZXR0aW5ncy5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMW1waVByb2pTZXR0aW5ncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmFiOGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDFtcGlQcm9qU2V0dGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDFuZXdNUElwcm9qZWN0LnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAxbmV3TVBJcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Y2NmN2MuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDFuZXdNUElwcm9qZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAxcHJvai5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMXByb2oucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RiNTRkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAxcHJvai5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMXByb2pCYXNpY1NldHRpbmdzLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAxcHJvakJhc2ljU2V0dGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk0ZTZjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAxcHJvakJhc2ljU2V0dGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDF3YlNyY0VkaXRvci5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMXdiU3JjRWRpdG9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhOTM2OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMXdiU3JjRWRpdG9yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktQ29uZmlndXJhdGlvbi5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLUNvbmZpZ3VyYXRpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRjOGVmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktQ29uZmlndXJhdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLUNvbm5lY3Rpb24tTG9jYWwucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1Db25uZWN0aW9uLUxvY2FsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZDdkMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLUNvbm5lY3Rpb24tTG9jYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1Db25uZWN0aW9uLVJlbW90ZS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLUNvbm5lY3Rpb24tUmVtb3RlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1YTBlOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLUNvbm5lY3Rpb24tUmVtb3RlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktQ29ubmVjdGlvbi1SZW1vdGUwLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktQ29ubmVjdGlvbi1SZW1vdGUwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlMDBkZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLUNvbm5lY3Rpb24tUmVtb3RlMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctRWRpdC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctRWRpdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTAzYjUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1WaWV3LUVkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1WaWV3LUxpc3QucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1WaWV3LUxpc3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc3ZDM3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1MaXN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1NYWNoaW5lcy5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctTWFjaGluZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWNjYmMzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1NYWNoaW5lcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctUmVtb3ZlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1SZW1vdmUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZmYWYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1SZW1vdmUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1WaWV3LVJ1bm5pbmcucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDItUk0tT3Blbk1QSS1WaWV3LVJ1bm5pbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTc3ODk2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1SdW5uaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1TdGFydC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMi1STS1PcGVuTVBJLVZpZXctU3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNiMTBjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyLVJNLU9wZW5NUEktVmlldy1TdGFydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMkNob29zZVJlc01nck5hbWVBbmREZXNjLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyQ2hvb3NlUmVzTWdyTmFtZUFuZERlc2MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDRjZTBhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyQ2hvb3NlUmVzTWdyTmFtZUFuZERlc2MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJPUlRFQ29uZmlndXJhdGlvbi5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMk9SVEVDb25maWd1cmF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1ZDU5Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMk9SVEVDb25maWd1cmF0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyT1JURVByb3h5Q29ubjJsb2NhbC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMk9SVEVQcm94eUNvbm4ybG9jYWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmM5MDA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyT1JURVByb3h5Q29ubjJsb2NhbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMk9SVEVyZXNNZ3JMb2NhbFN0YXJ0ZWQucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJPUlRFcmVzTWdyTG9jYWxTdGFydGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyNjZkOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMk9SVEVyZXNNZ3JMb2NhbFN0YXJ0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJSdW50aW1lUGVyc3BFbXB0eS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMlJ1bnRpbWVQZXJzcEVtcHR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlYzhjZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMlJ1bnRpbWVQZXJzcEVtcHR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyYWRkUmVzTWdyLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyYWRkUmVzTWdyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1NDQwMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMmFkZFJlc01nci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMmNob29zZVJlc01nclR5cGUtT3Blbk1QSS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMmNob29zZVJlc01nclR5cGUtT3Blbk1QSS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzJiZjYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJjaG9vc2VSZXNNZ3JUeXBlLU9wZW5NUEkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJjaG9vc2VSZXNNZ3JUeXBlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAyY2hvb3NlUmVzTWdyVHlwZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjIzMDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJjaG9vc2VSZXNNZ3JUeXBlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAybmV3T1JURXByb3h5UmVtb3RlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAybmV3T1JURXByb3h5UmVtb3RlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiNWVhNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMm5ld09SVEVwcm94eVJlbW90ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMm5ld1JlbW90ZUhvc3QucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJuZXdSZW1vdGVIb3N0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhNTRlMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMm5ld1JlbW90ZUhvc3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJvcnRlUHJveHlDb25maWdSZW1vdGVBZGRyMS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMm9ydGVQcm94eUNvbmZpZ1JlbW90ZUFkZHIxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkMmFlYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMm9ydGVQcm94eUNvbmZpZ1JlbW90ZUFkZHIxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAycmVtb3RlQnJvd3NlUHJveHkucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZW1vdGVCcm93c2VQcm94eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMGNjZTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZW1vdGVCcm93c2VQcm94eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nckVkaXQucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZXNNZ3JFZGl0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhNjljMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nckVkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZXNNZ3JMaXN0T3J0ZUxvY2FsLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAycmVzTWdyTGlzdE9ydGVMb2NhbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0N2JhMTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZXNNZ3JMaXN0T3J0ZUxvY2FsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAycmVzTWdyUmVtb3ZlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAycmVzTWdyUmVtb3ZlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1YTM4ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nclJlbW92ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nclJ1bm5pbmcucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZXNNZ3JSdW5uaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2M2E4NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nclJ1bm5pbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDJyZXNNZ3JTdGFydC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nclN0YXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxZWQ0YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wMnJlc01nclN0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzY29tYmluZWRDb25zb2xlMS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2NvbWJpbmVkQ29uc29sZTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMwNTE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzY29tYmluZWRDb25zb2xlMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDEucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2gxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2ZGM4NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2gyLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDRlNzkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2gyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoNS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDYyMDgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDYucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2g2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3ZDA0Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2g3LnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYmNlYWYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2g3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoOC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU3MGZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDkucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2g5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMTI3Ni4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wM2xhdW5jaDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2hSZXNUYWIucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDNsYXVuY2hSZXNUYWIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNmODdkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzAzbGF1bmNoUmVzVGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA0Y29tYmluZWRDb25zb2xlMS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNGNvbWJpbmVkQ29uc29sZTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMwNTE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA0Y29tYmluZWRDb25zb2xlMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNGxhdW5jaDEucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDRsYXVuY2gxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2ZGM4NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNGxhdW5jaDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDRsYXVuY2gyLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA0bGF1bmNoMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDRlNzkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDRsYXVuY2gyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA0bGF1bmNoNS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNGxhdW5jaDUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDYyMDgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA0bGF1bmNoNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNGxhdW5jaFJlc1RhYi5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNGxhdW5jaFJlc1RhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxM2Y4N2QuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDRsYXVuY2hSZXNUYWIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVsZWdlbmRJY29uLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1bGVnZW5kSWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTY2MGUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVsZWdlbmRJY29uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cGFyYWxsZWxfcGVyc3BlY3RpdmUucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwYXJhbGxlbF9wZXJzcGVjdGl2ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTIyNTAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwYXJhbGxlbF9wZXJzcGVjdGl2ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cExlZ2VuZC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cExlZ2VuZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzNkYmQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBMZWdlbmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBMZWdlbmRKb2JQcm9jZXNzLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cHRwTGVnZW5kSm9iUHJvY2Vzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2JiMDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBMZWdlbmRKb2JQcm9jZXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cHRwTGVnZW5kTWFjaGluZXMucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBMZWdlbmRNYWNoaW5lcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWU3N2MuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBMZWdlbmRNYWNoaW5lcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cExlZ2VuZFJlc01nci5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cExlZ2VuZFJlc01nci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGRiMWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBMZWdlbmRSZXNNZ3IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVwdHBSdW50aW1lSm9ic1ZpZXdIb3Zlci5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cFJ1bnRpbWVKb2JzVmlld0hvdmVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlOWI3NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cFJ1bnRpbWVKb2JzVmlld0hvdmVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cHRwUnVudGltZVByb2Nlc3NEZXRhaWxzLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cHRwUnVudGltZVByb2Nlc3NEZXRhaWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2ZTc5Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXB0cFJ1bnRpbWVQcm9jZXNzRGV0YWlscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXJ1bnRpbWVNYWNoaW5lc1ZpZXcucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVydW50aW1lTWFjaGluZXNWaWV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlOTg1Mi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNXJ1bnRpbWVNYWNoaW5lc1ZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVydW50aW1lUGVyc3BBbm4ucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVydW50aW1lUGVyc3BBbm4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRiZDNjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cnVudGltZVBlcnNwQW5uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA1cnVudGltZVJlc01nclZpZXcucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVydW50aW1lUmVzTWdyVmlldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWEyNjYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDVydW50aW1lUmVzTWdyVmlldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRIb3Zlci5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRIb3Zlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ODY5ZjEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZia3B0SG92ZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZia3B0U2V0Q29udGV4dC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRTZXRDb250ZXh0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3OTU2MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRTZXRDb250ZXh0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2YmtwdHNWaWV3LnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2YmtwdHNWaWV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5NWQ0YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRzVmlldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRzVmlld0J5UHJvY2Vzc1NldC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmJrcHRzVmlld0J5UHJvY2Vzc1NldC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTg3NzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZia3B0c1ZpZXdCeVByb2Nlc3NTZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZia3B0c1ZpZXdNZW51LnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2YmtwdHNWaWV3TWVudS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTQ2MDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZia3B0c1ZpZXdNZW51LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2Y2lwSG92ZXIucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZjaXBIb3Zlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjY1MjEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZjaXBIb3Zlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmNyZWF0ZVByb2Nlc3NTZXRJY29uLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2Y3JlYXRlUHJvY2Vzc1NldEljb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWM4YWZjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2Y3JlYXRlUHJvY2Vzc1NldEljb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZkb3duQXJyb3dTZWxlY3QucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZkb3duQXJyb3dTZWxlY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg4YjBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2ZG93bkFycm93U2VsZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2Z2xvYmFsQnJlYWtwb2ludC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmdsb2JhbEJyZWFrcG9pbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdlNTk0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2Z2xvYmFsQnJlYWtwb2ludC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmlwTXVsdC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmlwTXVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjNkZDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZpcE11bHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZpcFJlZy5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmlwUmVnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkZTcyMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmlwUmVnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2aXBVbnJlZy5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNmlwVW5yZWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTU5ZWNhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2aXBVbnJlZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNm1pcC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNm1pcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTVkMzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZtaXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0Q2hhbmdlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldENoYW5nZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOThjNmEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0Q2hhbmdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldENob29zZUljb24ucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0Q2hvb3NlSWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmE1MzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0Q2hvb3NlSWNvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnBTZXREZWxldGUucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0RGVsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmN2JmMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnBTZXREZWxldGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0UmVtb3ZlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldFJlbW92ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGM1OGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwU2V0UmVtb3ZlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldFNlbGVjdC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnBTZXRTZWxlY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFkZjAxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldFNlbGVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnBTZXRzLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQwYjJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cFNldHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwYXJhbGxlbERlYnVnVmlld0NtZHMucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwYXJhbGxlbERlYnVnVmlld0NtZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjcwZGNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cGFyYWxsZWxEZWJ1Z1ZpZXdDbWRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cGFyYWxsZWxEZWJ1Z1ZpZXdTZXRzLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cGFyYWxsZWxEZWJ1Z1ZpZXdTZXRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4NDZjNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnBhcmFsbGVsRGVidWdWaWV3U2V0cy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnB0cERlYnVnUGVyc3AucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZwdHBEZWJ1Z1BlcnNwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkNjAzYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnB0cERlYnVnUGVyc3AucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZyZWcxLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2cmVnMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTQ3MmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZyZWcxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2c2VsZWN0UHJvY2Vzc1NldENyZWF0ZS5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnNlbGVjdFByb2Nlc3NTZXRDcmVhdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2ZkZTgxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2c2VsZWN0UHJvY2Vzc1NldENyZWF0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnNlbGVjdFByb2Nlc3NTZXRDcmVhdGVBZGQucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZzZWxlY3RQcm9jZXNzU2V0Q3JlYXRlQWRkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlYmYyYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnNlbGVjdFByb2Nlc3NTZXRDcmVhdGVBZGQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZzZXRCcmVha3BvaW50LnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2c2V0QnJlYWtwb2ludC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MjY1MDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZzZXRCcmVha3BvaW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2dGVybWluYXRlLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA2dGVybWluYXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmY2ZjOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnRlcm1pbmF0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnRlcm1pbmF0ZUFsbC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wNnRlcm1pbmF0ZUFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjhiMDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDZ0ZXJtaW5hdGVBbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDdwcmVmc0FsbC5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wN3ByZWZzQWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzMTA3ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wN3ByZWZzQWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA3cHJlZnNEZWJ1Zy5wbmcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wN3ByZWZzRGVidWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTFmY2YwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA3cHJlZnNEZWJ1Zy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wN3ByZWZzRGVidWdTRE0ucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDdwcmVmc0RlYnVnU0RNLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzYjRlZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy8wN3ByZWZzRGVidWdTRE0ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDdwcmVmc09SVEUucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDdwcmVmc09SVEUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdhYzdhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA3cHJlZnNPUlRFLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvaW1hZ2VzLzA3cHJlZnNWaWV3ZXIucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDdwcmVmc1ZpZXdlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWE5YjAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvMDdwcmVmc1ZpZXdlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy90b2NfcGFyYWxsZWxfcGVyc3BlY3RpdmVfbGcucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC9pbWFnZXMvdG9jX3BhcmFsbGVsX3BlcnNwZWN0aXZlX2xnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNjJhNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL2ltYWdlcy90b2NfcGFyYWxsZWxfcGVyc3BlY3RpdmVfbGcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC90aHVtYi5qcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvdGh1bWIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YzI3ZWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC90aHVtYi5qcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQotLy8gSmF2YXNjcmlwdCB0byBwcm92aWRlIGEgY29udmVuaWVudCB3YXkgdG8gc2hvdyBhIHRodW1ibmFpbCBvZiBhbiBpbWFnZSwgd2l0aCBhIGxpbmsgdG8gdGhlIGZ1bGwtc2l6ZSBpbWFnZQotLy8gRGVmYXVsdCBoZWlnaHQgaXMgMTIwIGlmIHRoZSBzZWNvbmQgYXJnIGlzIG9taXR0ZWQKLS8vTm90ZSB0aGF0IElFIHVzZXMgdGhlIGFsdCB0YWcgZm9yIGhvdmVyIGJ1dCBGaXJlZm94IG1vcmUgY29ycmVjdGx5IHVzZXMgdGhlIHRpdGxlIHRhZyBmb3IgaG92ZXIgdGV4dC4KLS8vVXNhZ2U6IDxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvZm9vLmdpZiIpPC9zY3JpcHQ+Ci1mdW5jdGlvbiB0aHVtYih1cmwsaGVpZ2h0KXsKLSAgIGlmICghaGVpZ2h0KSB7aGVpZ2h0PTEyMDt9Ci0gICBkb2N1bWVudC53cml0ZSAoIjxhIGhyZWY9JyIrdXJsKyInPjxpbWcgc3JjPSciK3VybCsiJyBoZWlnaHQ9IitoZWlnaHQrIiB0aXRsZT0nQ2xpY2sgZm9yIGEgZnVsbC1zaXplIGltYWdlJyBhbHQ9J0NsaWNrIGZvciBhIGZ1bGwtc2l6ZSBpbWFnZSc+PC9hPiIpOwotfQotLy8gc2ltcGxlIGltYmVkZGluZyBvZiBpbWFnZSwgaW4gZGVmYXVsdCBmdWxsIHNpemUsIHdpdGggYnJlYWsgcHJlY2VlZGluZwotLy8gKGVhc3kgdG8gcmVwbGFjZSB0aGUgYWJvdmUgd2l0aCB0aGlzIG9uZSkKLS8vVXNhZ2U6IDxzY3JpcHQ+IGZ1bGwoImltYWdlcy9mb28uZ2lmIik8L3NjcmlwdD4KLWZ1bmN0aW9uIGZ1bGwodXJsKXsKLSAgIGRvY3VtZW50LndyaXRlICgiPGltZyBzcmM9JyIrdXJsKyInPiIpOwotfQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL3RodW1iMi5qcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvdGh1bWIyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFkYzkwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2h0bWwvdGh1bWIyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotCi1mdW5jdGlvbiBuZXdXaW4odXJsKSB7Ci0Jd2luZG93Lm9wZW4odXJsLCAnaW5zdGFsbF9wdHAnLCAnbWVudWJhcj1ubywgdG9vbGJhcj1ubywgc3RhdHVzPW5vLCByZXNpemFibGU9eWVzLCBsb2NhdGlvbj1ubywgc2Nyb2xsYmFycz15ZXMnKTsKLX0KLS8vIEphdmFzY3JpcHQgdG8gcHJvdmlkZSBhIGNvbnZlbmllbnQgd2F5IHRvIHNob3cgYSB0aHVtYm5haWwgb2YgYW4gaW1hZ2UsIHdpdGggYSBsaW5rIHRvIHRoZSBmdWxsLXNpemUgaW1hZ2UKLS8vIERlZmF1bHQgaGVpZ2h0IGlzIDEyMCBpZiB0aGUgc2Vjb25kIGFyZyBpcyBvbWl0dGVkCi0vL05vdGUgdGhhdCBJRSB1c2VzIHRoZSBhbHQgdGFnIGZvciBob3ZlciBidXQgRmlyZWZveCBtb3JlIGNvcnJlY3RseSB1c2VzIHRoZSB0aXRsZSB0YWcgZm9yIGhvdmVyIHRleHQuCi1mdW5jdGlvbiB0aHVtYih1cmwsaGVpZ2h0KXsKLSAgIGlmICghaGVpZ2h0KSB7aGVpZ2h0PTEyMDt9Ci0gICBkb2N1bWVudC53cml0ZSAoIjxicj48YSBocmVmPSciK3VybCsiJz48aW1nIHNyYz0nIit1cmwrIicgaGVpZ2h0PSIraGVpZ2h0KyIgdGl0bGU9J0NsaWNrIGZvciBhIGZ1bGwtc2l6ZSBpbWFnZScgYWx0PSdDbGljayBmb3IgYSBmdWxsLXNpemUgaW1hZ2UnPjwvYT4iKTsKLX0KLS8vIHNpbXBsZSBpbWJlZGRpbmcgb2YgaW1hZ2UsIGluIGRlZmF1bHQgZnVsbCBzaXplLCB3aXRoIGJyZWFrIHByZWNlZWRpbmcKLS8vIChlYXN5IHRvIHJlcGxhY2UgdGhlIGFib3ZlIHdpdGggdGhpcyBvbmUpCi1mdW5jdGlvbiBmdWxsKHVybCl7Ci0gICBkb2N1bWVudC53cml0ZSAoIjxicj48aW1nIHNyYz0nIit1cmwrIic+Iik7Ci19Ci0vL3RyeWluZyB0byBhYmJyZXZpYXRlIHRoaXM6IDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25DbGljaz0ibmV3V2luKCdpbWFnZXMvZm9vLmdpZicpIj5DbGljayBoZXJlPC9hPgotLy8gd2l0aCB1c2FnZSBsaWtlIHRoaXM6ICA8c2NyaXB0PiB0aHVtYk5ld1dpbigiZm9vLmdpZiIpIDwvc2NyaXB0PgotLy8gdGhpcyBkb2Vzbid0IHdvcmsuICAgSG1tbW1tLi4uLgotLy8gSSB0aGluayBpdCBoYXMgdG8gZG8gd2l0aCB0aGUgcXVvdGVzLiBpIG5lZWQgMyBuZXN0aW5nIGxldmVscyBzbyBqdXN0ICIgYW5kICcgZG9lc24ndCBjdXQgaXQuCi0vLyBJIHRyaWVkIGVzY2FwaW5nIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGVpdGhlci4gIFwiCi1mdW5jdGlvbiB0aHVtYk5ld1dpbih1cmwsaGVpZ2h0KXsKLSAgIGlmICghaGVpZ2h0KSB7aGVpZ2h0PTEyMDt9Ci0gICBtc2c9IkNsaWNrIGhlcmUgdG8gc2VlIGEgZnVsbC1zaXplIGltYWdlIGluIGEgbmV3IHdpbmRvdyI7Ci0gICAvL2RvY3VtZW50LndyaXRlICgiPGJyPjxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgb25DbGljaz0nbmV3V2luKFwiIit1cmwrIlwiKT48aW1nIHNyYz0nIit1cmwrIicgaGVpZ2h0PSIraGVpZ2h0KyIgdGl0bGU9J0NsaWNrJyBhbHQ9J0NsaWNrJz48L2E+Iik7Ci0gICBhbmNob3I9IjxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgb25DbGljaz0nbmV3V2luKFwiIit1cmwrIlwiKT4iOwotICAgaW1nPSI8aW1nIHNyYz0nIit1cmwrIicgaGVpZ2h0PSIraGVpZ2h0KyIgdGl0bGU9JyIrbXNnKyInIGFsdD0nIittc2crIic+IjsKLSAgIC8vYWxlcnQoImFuY2hvcj0iYW5jaG9yKTsKLSAgIC8vYWxlcnQoImltZz0iK2ltZyk7Ci0gICBkb2N1bWVudC53cml0ZSAoIjxicj4iK2FuY2hvcitpbWcrIjwvYT4iKTsKLSAgIAotIH0gIAotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL3RvYy5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaHRtbC90b2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZjNzk4My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9odG1sL3RvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIDxodG1sPgotPGhlYWQ+Ci08dGl0bGU+UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gVXNlciBHdWlkZTwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT4gPGltZyBzcmM9ImltYWdlcy90b2NfcGFyYWxsZWxfcGVyc3BlY3RpdmVfbGcucG5nIj4gUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm08L2gxPgotPHA+UmVsZWFzZSAyLjEKLTxwPgotVGhlIFBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBFY2xpcHNlICAKLWZyYW1ld29yayB0byBiZSB1c2VkIGZvciBkZXZlbG9waW5nIGFwcGxpY2F0aW9ucyBmb3IgcGFyYWxsZWwgIAotY29tcHV0ZXIgc3lzdGVtcy4gUFRQIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0eToKLTx1bD48bGk+Ci10b29scyBmb3IgZGV2ZWxvcGluZyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIE1lc3NhZ2UgUGFzc2luZyAgCi1JbnRlcmZhY2UgKE1QSSkgc3RhbmRhcmQgKG90aGVyIGVudmlyb25tZW50cyBhbmQgQVBJcyB3aWxsIGZvbGxvdy4pCi08bGk+IHRoZSBhYmlsaXR5IHRvIGxhdW5jaCwgIGNvbnRyb2wgYW5kIG1vbml0b3IgdGhlIGV4ZWN1dGlvbiBvZiAgCi1wYXJhbGxlbCBwcm9ncmFtcwotPGxpPiB0aGUgYWJpbGl0eSB0byBtb25pdG9yIHBhcmFsbGVsIHN5c3RlbSBzdGF0dXMgaW5mb3JtYXRpb24KLTxsaT4gYW4gaW50ZWdyYXRlZCBwYXJhbGxlbCBkZWJ1Z2dlcgotPGxpPiBhIGZyYW1ld29yayBmb3IgaW50ZWdyYXRpbmcgZXhlcm5hbCBkeW5hbWljIHRvb2xzCi08L3VsPgotSW4gYWRkaXRpb24sIFBUUCBwcm92aWRlcyBhIHBsYXRmb3JtIGZvciBwYXJhbGxlbCB0b29sIGRldmVsb3BlcnMgdG8gIAotaW50ZWdyYXRlIHRoZWlyIHRvb2xzIHdpdGhpbiB0aGUgRWNsaXBzZSBmcmFtZXdvcmsuIE5ldyB0b29scyBjYW4gIAotdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgYW5kIHBhcmFsbGVsICAKLXNlcnZpY2VzICB0aGF0IGFyZSBwcm92aWRlZCBieSBQVFAsIHdpdGhvdXQgdGhlIG5lZWQgdG8gZGV2ZWxvcCBhbmQgIAotc3VwcG9ydCB0aGlzIGluZnJhc3RydWN0dXJlIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMuCi08cD5Nb3JlIGluZm9ybWF0aW9uIGFuZCBkb3dubG9hZHMgYXJlIGF2YWlsYWJsZSBhdAotPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+aHR0cDovL2VjbGlwc2Uub3JnL3B0cDwvYT4uCi08aDI+T3ZlcnZpZXcsIEJhY2tncm91bmQsIGFuZCBTZXR1cCBpbmZvcm1hdGlvbjwvaDI+Ci08cD4KLTxvbD4KLTxsaT4gPGEgaHJlZj0iMDBvdmVydmlldy5odG1sIj5QVFAgT3ZlcnZpZXc8L2E+ICBhbmQgYXJjaGl0ZWN0dXJlCi08bGk+IDxhIGhyZWY9IjAwcHJlcmVxcy5odG1sIj5QVFAgUHJlcmVxdWlzaXRlczwvYT4gIAotPGxpPjxhIGhyZWY9IjAwbmV3Tm90ZXdvcnRoeS5odG1sIj5OZXcgYW5kIE5vdGV3b3J0aHk8L2E+IAotPC9vbD4KLTxoMj5IZWxwIFRvcGljczwvaDI+Ci08b2w+Ci0KLTxsaT4gPGEgaHJlZj0iMDFidWlsZE1QSXByb2cuaHRtbCI+Q3JlYXRpbmcgTVBJIFByb2plY3RzPC9hPgotPGxpPiA8YSBocmVmPSIwMnJlc01nclNldHVwLmh0bWwiPkNvbmZpZ3VyaW5nIFJlc291cmNlIE1hbmFnZXJzPC9hPgotPGxpPiA8YSBocmVmPSIwM3BMYXVuY2hDb25maWcuaHRtbCI+TGF1bmNoaW5nIFBhcmFsbGVsIFByb2dyYW1zPC9hPiAKLTxsaT4gPGEgaHJlZj0iMDRwTGF1bmNoQ29uZmlnRGVidWcuaHRtbCI+TGF1bmNoaW5nIFBhcmFsbGVsIFByb2dyYW1zIGZvciBEZWJ1Z2dpbmc8L2E+IAotPGxpPiA8YSBocmVmPSIwNW1vbml0b3JpbmcuaHRtbCI+TW9uaXRvcmluZyBQYXJhbGxlbCBNYWNoaW5lcyBhbmQgSm9iczwvYT4KLTxsaT4gPGEgaHJlZj0iMDZwYXJEZWJ1Z2dpbmcuaHRtbCI+UGFyYWxsZWwgRGVidWdnaW5nPC9hPgotPGxpPiA8YSBocmVmPSIwN3B0cFByZWZzLmh0bWwiPlBUUCBQcmVmZXJlbmNlczwvYT4gCi0KLTwvb2w+Ci08cD5PdGhlciByZWxhdGVkIEhlbHAgdG9waWNzCi08dWw+Ci08bGk+PGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAvaHRtbC90b2MuaHRtbCI+UGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgKFBMRFQpPC9hPgotPGxpPjxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5wdHAuaWJtbGwuaGVscC9odG1sL0lCTUxMTWFpbkhlbHAuaHRtbCI+SUJNIExvYWRsZXZlbGVyPC9hPiBQVFAgcmVzb3VyY2UgbWFuYWdlcgotPGxpPjxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5wdHAuaWJtcGUuaGVscC9odG1sL1BFTWFpbkhlbHAuaHRtbCI+SUJNIFBhcmFsbGVsIEVudmlyb25tZW50PC9hPiAoUEUpIFBUUCByZXNvdXJjZSBtYW5hZ2VyCi08bGk+PGEgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvUFRQL1BURncvUFRGdy1PdmVydmlldyI+RXh0ZXJuYWwgVG9vbHMgRnJhbWV3b3JrIChFVEZ3KSAtIGZvcm1lcmx5IHRoZSBQZXJmb3JtYW5jZSBUb29scyBGcmFtZXdvcmsKLTwvdWw+Ci08cD4mbmJzcDsKLTxwPiZuYnNwOwotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaW50cm8vY3NzL2dyYXBoaWNzL3NhbXBsZS5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9jc3MvZ3JhcGhpY3Mvc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmMWZmYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9jc3MvZ3JhcGhpY3Mvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9zYW1wbGVfaG92LmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9zYW1wbGVfaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3NDE2NC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9jc3MvZ3JhcGhpY3Mvc2FtcGxlX2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9jc3Mvc2FtcGxlLmNzcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL2Nzcy9zYW1wbGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZhYzRlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL2Nzcy9zYW1wbGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWEjb3JnZWNsaXBzZXB0cGhlbHAtaW50cm9MaW5rIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3Mvc2FtcGxlLmdpZik7IH0KLWEjb3JnZWNsaXBzZXB0cGhlbHAtaW50cm9MaW5rOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3Mvc2FtcGxlX2hvdi5naWYpOyB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaW50cm8vcHRwT3ZlcnZpZXcueG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaW50cm8vcHRwT3ZlcnZpZXcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTY2YTk4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL3B0cE92ZXJ2aWV3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPGludHJvQ29udGVudD4KLSAgCTxleHRlbnNpb25Db250ZW50IGlkPSJvcmdlY2xpcHNlcHRwaGVscC1pbnRyb0V4dGVuc2lvbiIgc3R5bGU9ImNzcy9zYW1wbGUuY3NzIiAKLSAgCW5hbWU9IlBUUCBvdmVydmlldyBpbnRybyBFeHRlbnNpb24iIHBhdGg9Im92ZXJ2aWV3L0AiPgotCQk8Z3JvdXAgc3R5bGUtaWQ9ImNvbnRlbnQtZ3JvdXAiIGlkPSJvcmdlY2xpcHNlcHRwaGVscC1pbnRyb0xpbmstZ3JvdXAiPgotICAgICAgIAkJPGxpbmsgbGFiZWw9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIiAgaWQ9Im9yZ2VjbGlwc2VwdHBoZWxwLWludHJvTGluayIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayIKLSAgICAgICAJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnB0cC5oZWxwL2h0bWwvdG9jLmh0bWwiPgotICAgICAgICAgIAkJPHRleHQ+TGVhcm4gbW9yZSBhYm91dCBQVFAsIHRoZSBQYXJhbGxlbCBUb29scyBQbGF0Zm9ybS48L3RleHQ+Ci0gICAgICAgCQk8L2xpbms+Ci0gICAgICAgCTwvZ3JvdXA+Ci0gIAk8L2V4dGVuc2lvbkNvbnRlbnQ+Ci08L2ludHJvQ29udGVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9wdHBUdXRvcmlhbC54bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9wdHBUdXRvcmlhbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzU1YjcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvaW50cm8vcHRwVHV0b3JpYWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Ci08aW50cm9Db250ZW50PgotICAJPGV4dGVuc2lvbkNvbnRlbnQgaWQ9Im9yZ2VjbGlwc2VwdHBoZWxwLWludHJvRXh0ZW5zaW9uIiBzdHlsZT0iY3NzL3NhbXBsZS5jc3MiIG5hbWU9IlBUUCB0dXRvcmlhbCBpbnRybyBFeHRlbnNpb24iIHBhdGg9InR1dG9yaWFscy9AIj4KLQkJPGdyb3VwIHN0eWxlLWlkPSJjb250ZW50LWdyb3VwIiBpZD0ib3JnZWNsaXBzZXB0cGhlbHAtaW50cm9MaW5rLWdyb3VwIj4KLSAgICAgICAJCTxsaW5rIGxhYmVsPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSIgIAotICAgICAgIAkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucHRwLmhlbHAvaHRtbC8wMWJ1aWxkTVBJcHJvZy5odG1sIgotICAgICAgIAkJaWQ9Im9yZ2VjbGlwc2VwdHBoZWxwLWludHJvTGluayIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayI+Ci0gICAgICAgICAgCQk8dGV4dD5MZWFybiBob3cgdG8gY3JlYXRlLCBydW4sIGFuZCBkZWJ1ZyBhIFBhcmFsbGVsIFByb2plY3Qgd2l0aCBNUEkuCi0gICAgICAgICAgCQk8L3RleHQ+Ci0JCTwvbGluaz4KLSAgICAgICAJPC9ncm91cD4KLSAgCTwvZXh0ZW5zaW9uQ29udGVudD4KLTwvaW50cm9Db250ZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL3B0cFdoYXRzbmV3LnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL2ludHJvL3B0cFdoYXRzbmV3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2MjZhMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9pbnRyby9wdHBXaGF0c25ldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTxpbnRyb0NvbnRlbnQ+Ci0gIAk8ZXh0ZW5zaW9uQ29udGVudCBpZD0ib3JnZWNsaXBzZXB0cGhlbHAtaW50cm9FeHRlbnNpb24iIHN0eWxlPSJjc3Mvc2FtcGxlLmNzcyIgbmFtZT0iUFRQIHdoYXRzbmV3IGludHJvIEV4dGVuc2lvbiIgcGF0aD0id2hhdHNuZXcvQCI+Ci0JCTxncm91cCBzdHlsZS1pZD0iY29udGVudC1ncm91cCIgaWQ9Im9yZ2VjbGlwc2VwdHBoZWxwLWludHJvTGluay1ncm91cCI+Ci0gICAgICAgCQk8bGluayBsYWJlbD0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0iIAotICAgICAgIAkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucHRwLmhlbHAvaHRtbC9uZXdOb3Rld29ydGh5Lmh0bWwiIGlkPSJvcmdlY2xpcHNlcHRwaGVscC1pbnRyb0xpbmsiIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiPgotICAgICAgICAgIAkJPHRleHQ+RmluZCBvdXQgdGhlIG5ldyBmZWF0dXJlcyBpbiBQVFAgMi4xLjwvdGV4dD4KLSAgICAgICAJCTwvbGluaz4KLSAgICAgICAJPC9ncm91cD4KLSAgCTwvZXh0ZW5zaW9uQ29udGVudD4KLTwvaW50cm9Db250ZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YzZlNDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFVzZXIgR3VpZGUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9wbHVnaW4ueG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk4OTZlZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotCi0KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9InRvYy54bWwiCi0gICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIi8+Ci0gICAgICA8aW5kZXggcGF0aD0ib3JnLmVjbGlwc2UucHRwLmhlbHAuaW5kZXgxIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWdFeHRlbnNpb24iPgotICAgICAgPGNvbmZpZ0V4dGVuc2lvbgotICAgICAgICAgICAgY29uZmlnSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbENvbmZpZyIKLSAgICAgICAgICAgIGNvbnRlbnQ9ImludHJvL3B0cE92ZXJ2aWV3LnhtbCI+Ci0gICAgICA8L2NvbmZpZ0V4dGVuc2lvbj4KLSAgICAgIDxjb25maWdFeHRlbnNpb24KLSAgICAgICAgICAgIGNvbmZpZ0lkPSJvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWxDb25maWciCi0gICAgICAgICAgICBjb250ZW50PSJpbnRyby9wdHBXaGF0c25ldy54bWwiPgotICAgICAgPC9jb25maWdFeHRlbnNpb24+Ci0gICAgICA8Y29uZmlnRXh0ZW5zaW9uCi0gICAgICAgICAgICBjb25maWdJZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsQ29uZmlnIgotICAgICAgICAgICAgY29udGVudD0iaW50cm8vcHRwVHV0b3JpYWwueG1sIj4KLSAgICAgIDwvY29uZmlnRXh0ZW5zaW9uPgotCi0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9zcmMvb3JnL2VjbGlwc2UvcHRwL2hlbHAvSGVscFBsdWdpbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9oZWxwL0hlbHBQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjA3YTM5OC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5kb2MudXNlci9zcmMvb3JnL2VjbGlwc2UvcHRwL2hlbHAvSGVscFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBCZXRoIFRpYmJpdHRzIChJQk0gQ29ycC4pIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaGVscDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLS8qKg0KLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIZWxwUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbg0KLXsNCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4NCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGVscFBsdWdpbiBwbHVnaW47DQotICAgIC8vIFJlc291cmNlIGJ1bmRsZS4NCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSAgICByZXNvdXJjZUJ1bmRsZTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4NCi0gICAgICovDQotICAgIHB1YmxpYyBIZWxwUGx1Z2luKCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHBsdWdpbiA9IHRoaXM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOw0KLSAgICAgICAgcGx1Z2luID0gbnVsbDsNCi0gICAgICAgIHJlc291cmNlQnVuZGxlID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBIZWxwUGx1Z2luIGdldERlZmF1bHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGx1Z2luOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBIZWxwUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICByZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsNCi0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLA0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnB0cC5oZWxwLkhlbHBQbHVnaW5SZXNvdXJjZXMiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLnB0cC5oZWxwIiwgcGF0aCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvdG9jLnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmOTE1NGEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4NCi0NCi08dG9jIGxhYmVsPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSBVc2VyIEd1aWRlIiB0b3BpYz0iaHRtbC90b2MuaHRtbCI+DQotICAgICA8dG9waWMgbGFiZWw9Ik92ZXJ2aWV3IiAgaHJlZj0iaHRtbC8wMG92ZXJ2aWV3Lmh0bWwiLz4gDQotICAgICAgPHRvcGljIGxhYmVsPSJQVFAgUHJlcmVxdWlzaXRlcyIgIGhyZWY9Imh0bWwvMDBwcmVyZXFzLmh0bWwiLz4gDQotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBNUEkgUHJvamVjdCIgIGhyZWY9Imh0bWwvMDFidWlsZE1QSXByb2cuaHRtbCIvPiANCi0gICAgICA8dG9waWMgbGFiZWw9IkNvbmZpZ3VyaW5nIFJlc291cmNlIE1hbmFnZXJzIiAgaHJlZj0iaHRtbC8wMnJlc01nclNldHVwLmh0bWwiLz4gCi0gICAgICA8dG9waWMgbGFiZWw9IkxhdW5jaGluZyBQYXJhbGxlbCBQcm9ncmFtcyIgIGhyZWY9Imh0bWwvMDNwTGF1bmNoQ29uZmlnLmh0bWwiLz4gCi0gICAgICA8dG9waWMgbGFiZWw9IkxhdW5jaGluZyBQYXJhbGxlbCBQcm9ncmFtcyBmb3IgRGVidWdnaW5nIiAgaHJlZj0iaHRtbC8wNHBMYXVuY2hDb25maWdEZWJ1Zy5odG1sIi8+IA0KLSAgICAgIDx0b3BpYyBsYWJlbD0iTW9uaXRvcmluZyBQYXJhbGxlbCBNYWNoaW5lcyBhbmQgSm9icyIgaHJlZj0iaHRtbC8wNW1vbml0b3JpbmcuaHRtbCIvPg0KLSAgICAgIDx0b3BpYyBsYWJlbD0iUGFyYWxsZWwgRGVidWdnaW5nIiAgaHJlZj0iaHRtbC8wNnBhckRlYnVnZ2luZy5odG1sIi8+DQotICAgICAgPHRvcGljIGxhYmVsPSJQVFAgUHJlZmVyZW5jZXMiIGhyZWY9Imh0bWwvMDdwdHBQcmVmcy5odG1sIiAvPgotICAgICAgPHRvcGljIGxhYmVsPSJOZXcgYW5kIE5vdGV3b3J0aHkiICBocmVmPSJodG1sLzAwbmV3Tm90ZXdvcnRoeS5odG1sIi8+IA0KLSAgIA0KLTwvdG9jPg0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC8uY2xhc3NwYXRoIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvLmN2c2lnbm9yZSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE2OTFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWRvYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC8ucHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5NTY0Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAubGF1bmNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4OWJhNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLmxhdW5jaDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLlBUUExhdW5jaFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWksCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLmxhdW5jaCwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gubWVzc2FnZXMsCi0gb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aSwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9hYm91dC5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmZjY2YuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvYXJndW1lbnRzX3RhYi5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvYXJndW1lbnRzX3RhYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzBhMzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL2FyZ3VtZW50c190YWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL2RlYnVnZ2VyX3RhYi5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvZGVidWdnZXJfdGFiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwYTI5Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvZGVidWdnZXJfdGFiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9pY29ucy9lbnZpcm9ubWVudF90YWIuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL2Vudmlyb25tZW50X3RhYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzlkZDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL2Vudmlyb25tZW50X3RhYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvbWFpbl90YWIuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL21haW5fdGFiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NmQwNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvbWFpbl90YWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL3BhcmFsbGVsX3J1bi5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvcGFyYWxsZWxfcnVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhY2ZiOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvaWNvbnMvcGFyYWxsZWxfcnVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9pY29ucy9wYXJhbGxlbF90YWIuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL3BhcmFsbGVsX3RhYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWNmYjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL2ljb25zL3BhcmFsbGVsX3RhYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvcGx1Z2luLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzVlMTQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBDbGVtZW50IENodQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIExhdW5jaGluZyBTdXBwb3J0Ci1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwotCi1QYXJhbGxlbExhdW5jaC5uYW1lPVBhcmFsbGVsIEFwcGxpY2F0aW9uCi1QVFBTaG9ydGN1dC5sYWJlbD1QVFAgUnVuCi1QYXJhbGxlbExhdW5jaC5kZWJ1Zz1DcmVhdGUgYSBjb25maWd1cmF0aW9uIHRvIGxhdW5jaCBhIHBhcmFsbGVsIGFwcGxpY2F0aW9uIGluIFBhcmFsbGVsIERlYnVnIFBlcnNwZWN0aXZlCi1QYXJhbGxlbExhdW5jaC5ydW49Q3JlYXRlIGEgY29uZmlndXJhdGlvbiB0byBsYXVuY2ggYSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBpbiBQYXJhbGxlbCBQZXJzcGVjdGl2ZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3BsdWdpbi54bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlZjk4Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icm1MYXVuY2hDb25maWd1cmF0aW9ucyIgbmFtZT0iUmVzb3VyY2UgTWFuYWdlciBMYXVuY2ggQ29uZmlndXJhdGlvbnMiIHNjaGVtYT0ic2NoZW1hL3JtTGF1bmNoQ29uZmlndXJhdGlvbnMuZXhzZCIvPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLQkJPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0JCQluYW1lPSIlUGFyYWxsZWxMYXVuY2gubmFtZSIKLQkJCWRlbGVnYXRlPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLlBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIgotCQkJc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2VMb2NhdG9yIgotCQkJc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlciIKLQkJCW1vZGVzPSJydW4sZGVidWciCi0JCQlwdWJsaWM9InRydWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaC5wYXJhbGxlbExhdW5jaCI+Ci0JCTwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlcyI+Ci0JCTxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0JCQlpY29uPSJpY29ucy9wYXJhbGxlbF9ydW4uZ2lmIgotCQkJY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnBhcmFsbGVsTGF1bmNoIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucGFyYWxsZWxMYXVuY2hJbWFnZSI+Ci0JCTwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZT4KLQk8L2V4dGVuc2lvbj4gICAKLSAgIAotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotCQk8bGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnBhcmFsbGVsTGF1bmNoIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWkuUGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaC5wYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCI+Ci0JCQk8bGF1bmNoTW9kZQotICAgICAgICAgICAgICAgcGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IiVQYXJhbGxlbExhdW5jaC5kZWJ1ZyIKLSAgICAgICAgICAgICAgIG1vZGU9ImRlYnVnIj4KLQkgICAgICAgIDwvbGF1bmNoTW9kZT4KLSAgICAJICAgIDxsYXVuY2hNb2RlCi0gICAgICAgICAgICAgICBwZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UucHRwLnVpLlBUUFJ1blBlcnNwZWN0aXZlIgotICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IiVQYXJhbGxlbExhdW5jaC5ydW4iCi0gICAgICAgICAgICAgICBtb2RlPSJydW4iPgotICAgICAgICAgCTwvbGF1bmNoTW9kZT4KLQkJPC9sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXA+Ci0JPC9leHRlbnNpb24+Ci0KLTwhLS0gUERUIFNob3J0Y3V0IC8vLS0+CQotICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoU2hvcnRjdXRzIj4KLQkJPHNob3J0Y3V0Ci0gICAgICAgICAgICBsYWJlbD0iJVBUUFNob3J0Y3V0LmxhYmVsIgotCQkJaWNvbj0iaWNvbnMvcGFyYWxsZWxfcnVuLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLlBUUExhdW5jaFNob3J0Y3V0IgotICAgICAgICAgICAgbW9kZXM9InJ1biwgZGVidWciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnB0cFNob3J0Y3V0Ij4KLQkJCTxwZXJzcGVjdGl2ZSBpZD0ib3JnLmVjbGlwc2UucHRwLnVpLlBUUFJ1blBlcnNwZWN0aXZlIi8+Ci0JCQk8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1BlcnNwZWN0aXZlIi8+Ci0JCTwvc2hvcnRjdXQ+Ci0gICA8L2V4dGVuc2lvbj4JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zY2hlbWEvcm1MYXVuY2hDb25maWd1cmF0aW9ucy5leHNkIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NjaGVtYS9ybUxhdW5jaENvbmZpZ3VyYXRpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWVkNzkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NjaGVtYS9ybUxhdW5jaENvbmZpZ3VyYXRpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIgaWQ9InJtTGF1bmNoQ29uZmlndXJhdGlvbnMiIG5hbWU9IlJlc291cmNlIE1hbmFnZXIgTGF1bmNoIENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHBsdWctaW5zIHRvIGNvbnRyaWJ1dGUgcmVzb3VyY2UgbWFuYWdlciBzcGVjaWZpYyBsYXVuY2ggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgUmVzb3VyY2VzIGxhdW5jaCB0YWIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhdW5jaENvbmZpZ3VyYXRpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9QVFBMYXVuY2hQbHVnaW4uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9QVFBMYXVuY2hQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlNjFmYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvUFRQTGF1bmNoUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQVW5pdmVyc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUFRQTGF1bmNoUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5sYXVuY2giOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInJtTGF1bmNoQ29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUFRQTGF1bmNoUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGFuIGVycm9yIGRpYWxvZyBnaXZlbiBhbiBJU3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvckRpYWxvZyhTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJbG9nKHN0YXR1cyk7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKTsKLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuTGF1bmNoX2NvbW1vbl9FcnJvciwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjcmVhdGUgYW4gZXJyb3IgZGlhbG9nIGdpdmVuIGEgbWVzc2FnZSBhbmQgVGhyb3dhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3JEaWFsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCWxvZyh0KTsKLQkJU2hlbGwgc2hlbGwgPSBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgMSwgdC5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCQotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5MYXVuY2hfY29tbW9uX0Vycm9yLCBtZXNzYWdlLCBzdGF0dXMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZQotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudGx5IGFjdGl2ZSBwYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHcgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHcuZ2V0QWN0aXZlUGFnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpbmRvdy5nZXRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudGx5IGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93Ci0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQVFBMYXVuY2hQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfSAgICAKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUFRQTGF1bmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkZW50aWZpZXIoKSB7Ci0JCWlmIChnZXREZWZhdWx0KCkgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IHlldCBpbml0aWFsaXplZCwKLQkJCS8vIHJldHVybiBhIHN0YXRpYyBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgbXVzdAotCQkJLy8gbWF0Y2ggdGhlIHBsdWdpbiBpZCBkZWZpbmVkIGluIHBsdWdpbi54bWwKLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBzcGVjaWZpZWQgc3RhdHVzIHdpdGggdGhpcyBwbHVnLWluJ3MgbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHN0YXR1cyB0byBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9ncyBhbiBpbnRlcm5hbCBlcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgdGhyb3dhYmxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gdG8gYmUgbG9nZ2VkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCS8qKgotCSAqIExvZ3MgYW4gaW50ZXJuYWwgZXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIHRvIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQkKLQkKLQkvLyBSZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkvLyBNYXAgb2YgcmVzb3VyY2UgbWFuYWdlcnMgdG8gbGF1bmNoIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzCi0JcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXI+LCBBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcnk+IHJtTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcmllcyA9Ci0JCW5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJUmVzb3VyY2VNYW5hZ2VyPiwgQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5PigpOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQVFBMYXVuY2hQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5wdHAubGF1bmNoLkxhdW5jaFBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZhY3RvcnkgZm9yIGEgcmVzb3VyY2UgbWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBybSByZXNvdXJjZSBtYW5hZ2VyCi0JICogQHJldHVybiBsYXVuY2ggY29uZmlndXJhdGlvbiBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSBnZXRSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5KElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJaWYgKHJtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBybUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3JpZXMuZ2V0KHJtLmdldENsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlyZXRyaWV2ZVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcmllcygpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlybUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3JpZXMuY2xlYXIoKTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHVuaXF1ZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiByZXNvdXJjZSBtYW5hZ2VyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBVbml2ZXJzZSB1bml2ZXJzZSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCk7Ci0JCUlSZXNvdXJjZU1hbmFnZXJbXSBybXMgPSB1bml2ZXJzZS5nZXRSZXNvdXJjZU1hbmFnZXJzKCk7Ci0JCVN0cmluZyBybVVuaXF1ZU5hbWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1JFU09VUkNFX01BTkFHRVJfVU5JUVVFTkFNRSwgKFN0cmluZyludWxsKTsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogcm1zKSB7Ci0JCQlpZiAocm0uZ2V0U3RhdGUoKSA9PSBSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUQVJURUQgJiYKLQkJCQkJcm0uZ2V0VW5pcXVlTmFtZSgpLmVxdWFscyhybVVuaXF1ZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJtOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFZlcmlmeSB0aGF0IHRoZSByZXNvdXJjZSAicGF0aCIgYWN0dWFsbHkgZXhpc3RzLiBUaGlzIGp1c3QgY2hlY2tzCi0JICogdGhhdCB0aGUgcGF0aCByZWZlcmVuY2VzIHNvbWV0aGluZyByZWFsLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIElQYXRoCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQYXRoIHZlcmlmeVJlc291cmNlKFN0cmluZyBwYXRoLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJtID0gKElSZXNvdXJjZU1hbmFnZXJDb250cm9sKWdldFJlc291cmNlTWFuYWdlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHJtICE9IG51bGwpIHsKLQkJCUlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmYgPSBybS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZiBpbnN0YW5jZW9mIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgewotCQkJCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiByZW1Db25mID0gKEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiljb25mOwotCQkJCUlSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKHJlbUNvbmYuZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJCQlpZiAocmVtb3RlU2VydmljZXMgIT0gbnVsbCkgewotCQkJCQlJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgY29ubk1nciA9IHJlbW90ZVNlcnZpY2VzLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0JCQkJCUlSZW1vdGVDb25uZWN0aW9uIGNvbm4gPSBjb25uTWdyLmdldENvbm5lY3Rpb24ocmVtQ29uZi5nZXRDb25uZWN0aW9uTmFtZSgpKTsKLQkJCQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gcmVtb3RlU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoY29ubik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGF0aCByZXNQYXRoID0gbmV3IFBhdGgocGF0aCk7Ci0JCQkJCQlJRmlsZVN0b3JlIHJlcyA9IGZpbGVNYW5hZ2VyLmdldFJlc291cmNlKHJlc1BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJaWYgKHJlcy5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotCQkJCQkJCXJldHVybiByZXNQYXRoOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlQYXRoIHJlc1BhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJCQlpZiAocmVzUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQlyZXR1cm4gcmVzUGF0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSBleHRlbnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmV0cmlldmVSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3JpZXMoKSB7Ci0gICAgCXJtTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcmllcy5jbGVhcigpOwotICAgIAkKLSAgICAJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlmaW5hbCBJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCi0JCWZvciAoaW50IGlleHQgPSAwOyBpZXh0IDwgZXh0ZW5zaW9ucy5sZW5ndGg7ICsraWV4dCkgewotCQkJZmluYWwgSUV4dGVuc2lvbiBleHQgPSBleHRlbnNpb25zW2lleHRdOwotCQkJCi0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCQlmb3IgKGludCBpPTA7IGk8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGVsZW1lbnRzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCUFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSkgY2UuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQkJQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXI+IHJlc291cmNlTWFuYWdlckNsYXNzID0gZmFjdG9yeS5nZXRSZXNvdXJjZU1hbmFnZXJDbGFzcygpOwotCQkJCQlybUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3JpZXMucHV0KHJlc291cmNlTWFuYWdlckNsYXNzLCBmYWN0b3J5KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL0Rvd25sb2FkQmFja1J1bGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL0Rvd25sb2FkQmFja1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY3MDZjMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9Eb3dubG9hZEJhY2tSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBEb3dubG9hZEJhY2tSdWxlIGltcGxlbWVudHMgSVN5bmNocm9uaXphdGlvblJ1bGUgewotCUxpc3Q8SVBhdGg+IHJlbW90ZUZpbGVzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKLQlMaXN0PEZpbGU+IGxvY2FsRmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCi0JcHVibGljIERvd25sb2FkQmFja1J1bGUoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChGaWxlIGxvY2FsLCBJUGF0aCByZW1vdGUpIHsKLQkJcmVtb3RlRmlsZXMuYWRkKHJlbW90ZSk7Ci0JCWxvY2FsRmlsZXMuYWRkKGxvY2FsKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0TG9jYWxGaWxlKGludCBpbmRleCkgewotCQlyZXR1cm4gKEZpbGUpIGxvY2FsRmlsZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCQotCXB1YmxpYyBJUGF0aCBnZXRSZW1vdGVGaWxlKGludCBpbmRleCkgewotCQlyZXR1cm4gKElQYXRoKSByZW1vdGVGaWxlcy5nZXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvdW50KCkgewotCQlyZXR1cm4gcmVtb3RlRmlsZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gcmVtb3RlRmlsZXMuc2l6ZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkUnVsZSgpIHsKLQkJcmV0dXJuIHRydWU7IC8vIGJ5IGRlZmluaXRpb24KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwbG9hZFJ1bGUoKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gYnkgZGVmaW5pdGlvbgotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9MYWJlbCgpIHsKLQkJcmV0dXJuICJJbnRlcm5hbCBkb3dubG9hZCBiYWNrIHJ1bGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL0Rvd25sb2FkUnVsZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2RhdGEvRG93bmxvYWRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhY2M5MzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2RhdGEvRG93bmxvYWRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qCi0gKiBSZXByZXNlbnRzIGFuIHVwbG9hZCBydWxlLgotICogSXQgZGVzY3JpYmVzIGhvdyB0byBjb3B5IGEgbGlzdCBvZiBsb2NhbCBmaWxlcyBvciBsb2NhbCBkaXJlY3RvcmllcyBpbnRvIGEgc2luZ2xlIHJlbW90ZSBkaXJlY3RvcnkuCi0gKiBBIGxvY2FsIGZpbGUgaXMgY29waWVkIGludG8gdGhlIHJlbW90ZSBkaXJlY3RvcnkuCi0gKiBBIGxvY2FsIGRpcmVjdG9yeSBoYXMgaXRzIGNvbnRlbnQgY29waWVkIHJlY3Vyc2l2ZWx5IGludG8gdGhlIHJlbW90ZSBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb3dubG9hZFJ1bGUgaW1wbGVtZW50cyBJU3luY2hyb25pemF0aW9uUnVsZSB7Ci0JcHJpdmF0ZSBpbnQgb3ZlcndyaXRlUG9saWN5ID0gT3ZlcndyaXRlUG9saWNpZXMuVU5LTk9XTjsKLQotCXByaXZhdGUgYm9vbGVhbiBhc1JlYWRPbmx5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGFzRXhlY3V0YWJsZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZVRpbWVTdGFtcCA9IGZhbHNlOwotCQotCS8qKiBMb2NhbCBkZXN0aW55IGRpcmVjdG9yeSB3aGVyZSB0aGUgZmlsZXMgYXJlIGRvd25sb2FkZWQgaW50by4gKi8KLQlwcml2YXRlIFN0cmluZyBsb2NhbERpcmVjdG9yeSA9IG51bGw7Ci0JCi0JLyoqCi0JICogTGlzdCBvZiByZW1vdGUgc291cmNlIHBhdGhzLCByZXByZXNlbnRlZCBhcyBzdHJpbmdzLgotCSAqIFRoZXkgbWF5IGJlIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgotCSAqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHJlbW90ZUZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQkvKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERvd25sb2FkUnVsZSgpIHsKLQotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBkZSBydWxlIGZyb20gYSBzZXJpYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgRG93bmxvYWRSdWxlKFN0cmluZyBkYXRhKSB7Ci0JCS8qCi0JCSAqIFNwbGl0IHRoZSBzdHJpbmcgaW50byBsaW5lcy4KLQkJICovCi0JCVN0cmluZyBsaXN0W10gPSBkYXRhLnNwbGl0KCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBmaXJzdCB0b2tlbiBpcyB0aGUgcHJvcGVyIGlkZW50aWZpZXIuIElmIG5vdCwgdGhlIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSBydWxlIHRoYXQKLQkJICogY2FuIGJlIHBhcnNlZCBieSB0aGlzIGNsYXNzLgotCQkgKi8KLQkJewotCQkJaWYgKGxpc3QubGVuZ3RoIDwgMSkgewotCQkJCXRocm93RXJyb3IoIlRoZSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcnVsZSBmb3IgIit0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHMgPSBsaXN0WzBdOwotCQkJaWYgKCEgcy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLlRZUEVfRE9XTkxPQUQpKSB7Ci0JCQkJdGhyb3dFcnJvcigiVGhlIHN0cmluZyBpcyBub3QgYSB2YWxpZCBydWxlIGZvciAiK3RoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcyA9IGxpc3RbaV07Ci0JCQkvKgotCQkJICogU3BsaXQga2V5IGZyb20gZGF0YS4KLQkJCSAqLwotCQkJaW50IHAgPSBzLmluZGV4T2YoJyAnKTsKLQkJCWlmIChwID09IC0xKSB7Ci0JCQkJbG9nRXJyb3IoIkludmFsaWQgcnVsZSBlbnRyeTogIitzKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIGtleSA9IHMuc3Vic3RyaW5nKDAsIHApOwotCQkJU3RyaW5nIHZhbHVlID0gcy5zdWJzdHJpbmcocCArIDEpOwotCQkJcGFyc2VFbnRyeShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgRG93bmxvYWRSdWxlKERvd25sb2FkUnVsZSBydWxlKSB7Ci0JCXRoaXMub3ZlcndyaXRlUG9saWN5ID0gcnVsZS5vdmVyd3JpdGVQb2xpY3k7Ci0JCXRoaXMuYXNSZWFkT25seSA9IHJ1bGUuYXNSZWFkT25seTsKLQkJdGhpcy5hc0V4ZWN1dGFibGUgPSBydWxlLmFzRXhlY3V0YWJsZTsKLQkJdGhpcy5wcmVzZXJ2ZVRpbWVTdGFtcCA9IHJ1bGUucHJlc2VydmVUaW1lU3RhbXA7Ci0JCWlmIChydWxlLmxvY2FsRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCXRoaXMubG9jYWxEaXJlY3RvcnkgPSBuZXcgU3RyaW5nKHJ1bGUubG9jYWxEaXJlY3RvcnkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5sb2NhbERpcmVjdG9yeSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5yZW1vdGVGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihydWxlLnJlbW90ZUZpbGVMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dFcnJvcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHN0cmluZyk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VFbnRyeShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9MT0NBTF9QQVRIKSkgewotCQkJbG9jYWxEaXJlY3RvcnkgPSB2YWx1ZTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSkpIHsKLQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX0FMV0FZUykpIHsKLQkJCQlvdmVyd3JpdGVQb2xpY3kgPSBPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVM7Ci0JCQl9IGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQVNLKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLkFTSzsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9ORVdFUikpIHsKLQkJCQlvdmVyd3JpdGVQb2xpY3kgPSBPdmVyd3JpdGVQb2xpY2llcy5ORVdFUjsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9TS0lQKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLlNLSVA7Ci0JCQl9IGVsc2UgewotCQkJCWxvZ0Vycm9yKCJVbmtub3duIG92ZXJ3cml0ZSBwb2xpY3k6ICIrdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTKSkgewotCQkJU3RyaW5nIGZsYWdzW10gPSB2YWx1ZS5zcGxpdCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZsYWcgPSBmbGFnc1tpXTsKLQkJCQlpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHU19USU1FU1RBTVApKSB7Ci0JCQkJCXByZXNlcnZlVGltZVN0YW1wID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2dFcnJvcigiVW5rbm93biBmbGFnOiAiK2ZsYWcpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9SRU1PVEVfUEFUSCkpIHsKLQkJCXJlbW90ZUZpbGVMaXN0LmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TKSkgewotCQkJU3RyaW5nIGZsYWdzW10gPSB2YWx1ZS5zcGxpdCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZsYWcgPSBmbGFnc1tpXTsKLQkJCQlpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OU19FWEVDVVRBQkxFKSkgewotCQkJCQlhc0V4ZWN1dGFibGUgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OU19SRUFET05MWSkpIHsKLQkJCQkJYXNSZWFkT25seSA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nRXJyb3IoIlVua25vd24gcGVybWlzc2lvbjogIitmbGFnKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCWxvZ0Vycm9yKCJVbmtub3duIGtleTogIitrZXkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nRXJyb3IoU3RyaW5nIHN0cmluZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JLyoKLQkgKiBUaGUgcnVsZSBhcyBhIHNlcmlhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChsb2NhbERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfTE9DQUxfUEFUSCsiICIrbG9jYWxEaXJlY3RvcnkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChvdmVyd3JpdGVQb2xpY3kgPT0gT3ZlcndyaXRlUG9saWNpZXMuQUxXQVlTKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSsiICIrU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQUxXQVlTKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5BU0spIHsKLQkJCWwuYWRkKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZKyIgIitTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9BU0spOwkJCSAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob3ZlcndyaXRlUG9saWN5ID09IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSsiICIrU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfTkVXRVIpOwkJCSAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob3ZlcndyaXRlUG9saWN5ID09IE92ZXJ3cml0ZVBvbGljaWVzLlNLSVApIHsKLQkJCWwuYWRkKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZKyIgIitTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9TS0lQKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChhc0V4ZWN1dGFibGUgfHwgYXNSZWFkT25seSkgewotCQkJU3RyaW5nIHMgPSBTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlM7Ci0JCQlpZiAoYXNFeGVjdXRhYmxlKSB7Ci0JCQkJcyArPSAiICIgKyBTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlNfRVhFQ1VUQUJMRTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGFzUmVhZE9ubHkpIHsKLQkJCQlzICs9ICIgIiArIFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OU19SRUFET05MWTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbC5hZGQocyk7Ci0JCX0KLQkJaWYgKHByZXNlcnZlVGltZVN0YW1wKSB7Ci0JCQlTdHJpbmcgcyA9IFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHUzsKLQkJCWlmIChwcmVzZXJ2ZVRpbWVTdGFtcCkgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX1RJTUVTVEFNUDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbC5hZGQocyk7CQkJCi0JCX0KLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSByZW1vdGVGaWxlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZW1vdGVQYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVtb3RlUGF0aCA9PSBudWxsKSBjb250aW51ZTsKLQkJCWlmIChyZW1vdGVQYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSBjb250aW51ZTsKLQkJCQotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX1JFTU9URV9QQVRIKyIgIityZW1vdGVQYXRoLnRyaW0oKSk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoU2VyaWFsaXphdGlvbktleXMuVFlQRV9ET1dOTE9BRCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQgKz0gIlxuIiArIGVsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXNFeGVjdXRhYmxlKCkgewotCQlyZXR1cm4gYXNFeGVjdXRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzRXhlY3V0YWJsZShib29sZWFuIGFzRXhlY3V0YWJsZSkgewotCQl0aGlzLmFzRXhlY3V0YWJsZSA9IGFzRXhlY3V0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBhc1JlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzUmVhZE9ubHkoYm9vbGVhbiBhc1JlYWRPbmx5KSB7Ci0JCXRoaXMuYXNSZWFkT25seSA9IGFzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPdmVyd3JpdGVQb2xpY3koKSB7Ci0JCXJldHVybiBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlUG9saWN5KGludCBvdmVyd3JpdGVQb2xpY3kpIHsKLQkJdGhpcy5vdmVyd3JpdGVQb2xpY3kgPSBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZVN0YW1wKGJvb2xlYW4gcHJlc2VydmVUaW1lU3RhbXApIHsKLQkJdGhpcy5wcmVzZXJ2ZVRpbWVTdGFtcCA9IHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxEaXJlY3RvcnkoKSB7Ci0JCWlmIChsb2NhbERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbG9jYWxEaXJlY3RvcnkudHJpbSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYWxEaXJlY3RvcnkoU3RyaW5nIGxvY2FsRGlyZWN0b3J5KSB7Ci0JCWlmIChsb2NhbERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvY2FsRGlyZWN0b3J5ID0gbG9jYWxEaXJlY3RvcnkudHJpbSgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5sb2NhbERpcmVjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRSZW1vdGVGaWxlQ291bnQoKSB7Ci0JCXJldHVybiByZW1vdGVGaWxlTGlzdC5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgW10gZ2V0UmVtb3RlRmlsZXNBc1N0cmluZ0FycmF5KCkgewotCQlTdHJpbmcgcmVzdWx0IFtdID0gbmV3IFN0cmluZyBbcmVtb3RlRmlsZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IChTdHJpbmcpIHJlbW90ZUZpbGVMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUGF0aCBbXSBnZXRSZW1vdGVGaWxlc0FzUGF0aEFycmF5KCkgewotCQlJUGF0aCByZXN1bHQgW10gPSBuZXcgSVBhdGggW3JlbW90ZUZpbGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgUGF0aCgoU3RyaW5nKSByZW1vdGVGaWxlTGlzdC5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEZpbGUgW10gZ2V0UmVtb3RlRmlsZXNBc0ZpbGVBcnJheSgpIHsKLQkJRmlsZSByZXN1bHQgW10gPSBuZXcgRmlsZSBbcmVtb3RlRmlsZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBGaWxlKChTdHJpbmcpIHJlbW90ZUZpbGVMaXN0LmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIFJlbW90ZUZpbGVJdGVyYXRvckFzU3RyaW5nIGltcGxlbWVudHMgSXRlcmF0b3I8T2JqZWN0PiB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JyZWYgPSByZW1vdGVGaWxlTGlzdC5pdGVyYXRvcigpOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpdGVyYXRvcnJlZi5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlyZXR1cm4gaXRlcmF0b3JyZWYubmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaXRlcmF0b3JyZWYucmVtb3ZlKCk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBjbGFzcyBSZW1vdGVGaWxlSXRlcmF0b3JBc1BhdGggZXh0ZW5kcyBSZW1vdGVGaWxlSXRlcmF0b3JBc1N0cmluZyB7Ci0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aCgoU3RyaW5nKWl0ZXJhdG9ycmVmLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8Pz4gcmVtb3RlSXRlcmF0b3JBc1N0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdGVGaWxlSXRlcmF0b3JBc1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjw/PiByZW1vdGVJdGVyYXRvckFzUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdGVGaWxlSXRlcmF0b3JBc1BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZW1vdGVGaWxlKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQlyZW1vdGVGaWxlTGlzdC5hZGQoc3RyaW5nKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlbW90ZUZpbGUoSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlyZW1vdGVGaWxlTGlzdC5hZGQocGF0aC50b09TU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEb3dubG9hZFJ1bGUgciA9IG5ldyBEb3dubG9hZFJ1bGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQlyLnNldEFzRXhlY3V0YWJsZSh0cnVlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQlyLnNldEFzUmVhZE9ubHkodHJ1ZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihyKTsKLQkJci5zZXRMb2NhbERpcmVjdG9yeSgiL3RtcC9hIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQlyLnNldE92ZXJ3cml0ZVBvbGljeShPdmVyd3JpdGVQb2xpY2llcy5BU0spOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVGaWxlKFN0cmluZyBlbnRyeSkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHJlbW90ZUZpbGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmVxdWFscyhlbnRyeSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUZpbGUoSVBhdGggZW50cnkpIHsKLQkJcmVtb3ZlUmVtb3RlRmlsZShlbnRyeS50b09TU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVGaWxlcyhTdHJpbmdbXSBpdGVtcykgewotCQljbGVhclJlbW90ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBpdGVtc1tpXTsKLQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCWFkZFJlbW90ZUZpbGUoc3RyaW5nLnRyaW0oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlRmlsZXMoSVBhdGhbXSBpdGVtcykgewotCQljbGVhclJlbW90ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSBpdGVtc1tpXTsKLQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQlhZGRSZW1vdGVGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyUmVtb3RlRmlsZXMoKSB7Ci0JCXJlbW90ZUZpbGVMaXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG93bmxvYWRSdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwbG9hZFJ1bGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBGSVhNRTogVGhyb3cgY29yZSBleGNlcHRpb24KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5VTktOT1dOKSB7Ci0JCQkvL1JlbW90ZUxhdW5jaGVyUGx1Z2luLnRocm93Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5Eb3dubG9hZFJ1bGVfVmFsaWRhdGlvbl9NaXNzaW5nT3ZlcndyaXRlUG9saWN5LCBJUmVtb3RlTGF1bmNoRXJyb3JzLklOVkFMSURfUlVMRSk7Ci0JCX0KLQkJaWYgKGxvY2FsRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCS8vUmVtb3RlTGF1bmNoZXJQbHVnaW4udGhyb3dDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLkRvd25sb2FkUnVsZV9WYWxpZGF0aW9uX01pc3NpbmdSZW1vdGVEaXJlY3RvcnksIElSZW1vdGVMYXVuY2hFcnJvcnMuSU5WQUxJRF9SVUxFKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvTGFiZWwoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiRE9XTkxPQUQgIitJbnRlZ2VyLnRvU3RyaW5nKHJlbW90ZUZpbGVMaXN0LnNpemUoKSkrIiBpdGVtKHMpIGJhY2sgdG8gIitsb2NhbERpcmVjdG9yeTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9JU3luY2hyb25pemF0aW9uUnVsZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2RhdGEvSVN5bmNocm9uaXphdGlvblJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGJjYjM1My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9JU3luY2hyb25pemF0aW9uUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJZGVudGlmaWVzIGEgc3luY2hyb25pemF0dWlvbiBydWxlIGZvciB0aGUgbGF1bmNoIGpvYi4KLSAqIEBhdXRob3IgRGFuaWVsIEZlcmJlcgotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTeW5jaHJvbml6YXRpb25SdWxlIHsKLQkvKioKLQkgKiBBIGxhYmVsIHRvIHNob3cgdGhlIHJ1bGUgZm9yIGRlYnVnLgotCSAqIEByZXR1cm4gVGhlIGxhYmVsCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvTGFiZWwoKTsKLQkKLQkvKioKLQkgKiBRdWVyeSBpZiB0aGUgcnVsZSBpcyBhY3RpdmUgYW5kIGhhcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gdG8gYmUgYXBwbGllZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKTsKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgcnVsZSBhbmQgcmFpc2UgYSB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0gaWYgc29tZSBhdHRyaWJ1dGUgaXMgbWlzc2luZwotCSAqIG9yIG5vdCB2YWxpZC4gVGhlIHZhbGlkYXRpb24gZG9lcyBub3QgaW5jbHVkZSBjaGVjayBmb3IgZXhpc3RpbmcgZmlsZXMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBRdWVyaWVzIGlmIHRoZSB0dWxlIGNhbiBiZSB1c2VkIGJ5IGxhdW5jaCBqb2IgYWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIGZpbmlzaGVzIGV4ZWN1dGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICogQGF1dGhvciBEYW5pZWwgRmVyYmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkUnVsZSgpOwotCi0JLyoqCi0JICogUXVlcmllcyBpZiB0aGUgcnVsZSBjYW4gYmUgdXNlZCBieSBsYXVuY2ggam9iIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzIGV4ZWN1dGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICogQGF1dGhvciBEYW5pZWwgRmVyYmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwbG9hZFJ1bGUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL092ZXJ3cml0ZVBvbGljaWVzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9PdmVyd3JpdGVQb2xpY2llcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGI5YWExLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL092ZXJ3cml0ZVBvbGljaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YTsKLQotcHVibGljIGludGVyZmFjZSBPdmVyd3JpdGVQb2xpY2llcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0tJUCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxXQVlTID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdFUiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNLID0gNDsKLQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL1J1bGVGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9SdWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTBiNmU3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL1J1bGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YTsKLQotCi1wdWJsaWMgY2xhc3MgUnVsZUZhY3RvcnkgewotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgc3luY2hyb25pemF0aW9uIHJ1bGUgb2JqZWN0IGZvciB0aGUgc2VyaWFsaXplZCBzdHJpbmcuCi0JICogQHBhcmFtIHN0cmluZyBUaGUgc2VyaWFsaXplZCBzdHJpbmcKLQkgKiBAcmV0dXJuIFRoZSBydWxlIG9yIG51bGwgaWYgbm8gcnVsZSBpcyBrbm93biBmb3IgdGhlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTeW5jaHJvbml6YXRpb25SdWxlIGNyZWF0ZVJ1bGVGcm9tU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIGxpc3RbXSA9IHN0cmluZy5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZmlyc3QgPSBsaXN0WzBdOwotCQlpZiAoZmlyc3QuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5UWVBFX1VQTE9BRCkpIHsKLQkJCXJldHVybiBuZXcgVXBsb2FkUnVsZShzdHJpbmcpOwotCQl9IGVsc2UgaWYgKGZpcnN0LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuVFlQRV9ET1dOTE9BRCkpIHsKLQkJCXJldHVybiBuZXcgRG93bmxvYWRSdWxlKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTeW5jaHJvbml6YXRpb25SdWxlIGR1cGxpY2F0ZVJ1bGUoSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSkgewotCQlpZiAocnVsZSBpbnN0YW5jZW9mIERvd25sb2FkUnVsZSkgewotCQkJRG93bmxvYWRSdWxlIGRvd25sb2FkUnVsZSA9IChEb3dubG9hZFJ1bGUpIHJ1bGU7Ci0JCQlyZXR1cm4gbmV3IERvd25sb2FkUnVsZShkb3dubG9hZFJ1bGUpOwotCQl9IGlmIChydWxlIGluc3RhbmNlb2YgVXBsb2FkUnVsZSkgewotCQkJVXBsb2FkUnVsZSB1cGxvYWRSdWxlID0gKFVwbG9hZFJ1bGUpIHJ1bGU7Ci0JCQlyZXR1cm4gbmV3IFVwbG9hZFJ1bGUodXBsb2FkUnVsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL1NlcmlhbGl6YXRpb25LZXlzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9TZXJpYWxpemF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZDVhZGJlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL1NlcmlhbGl6YXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YTsKLQotCi1pbnRlcmZhY2UgU2VyaWFsaXphdGlvbktleXMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfVVBMT0FEID0gInVwbG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX0RPV05MT0FEID0gImRvd25sb2FkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9SRU1PVEVfUEFUSCA9ICJyZW1vdGUtcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9PVkVSV1JJVEVfUE9MSUNZID0gIm92ZXJ3cml0ZS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfT1ZFUldSSVRFX1BPTElDWV9TS0lQID0gInNraXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfT1ZFUldSSVRFX1BPTElDWV9BTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX09WRVJXUklURV9QT0xJQ1lfTkVXRVIgPSAibmV3ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfT1ZFUldSSVRFX1BPTElDWV9BU0sgPSAiYXNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BFUk1JU1NJT05TX1JFQURPTkxZID0gInJlYWRvbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BFUk1JU1NJT05TX0VYRUNVVEFCTEUgPSAiZXhlY3V0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9GTEFHUyA9ICJmbGFncyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9GTEFHU19USU1FU1RBTVAgPSAidGltZXN0YW1wIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX0ZMQUdTX0RPV05MT0FEX0JBQ0sgPSAiZG93bmxvYWQtYmFjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9GTEFHU19ERUZBVUxUX1JFTU9URV9ESVJFQ1RPUlkgPSAiZGVmYXVsdC1yZW1vdGUtZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX0xPQ0FMX1BBVEggPSAibG9jYWwtcGF0aCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL1VwbG9hZFJ1bGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9kYXRhL1VwbG9hZFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTEwODY2MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvZGF0YS9VcGxvYWRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qCi0gKiBSZXByZXNlbnRzIGFuIHVwbG9hZCBydWxlLgotICogSXQgZGVzY3JpYmVzIGhvdyB0byBjb3B5IGEgbGlzdCBvZiBsb2NhbCBmaWxlcyBvciBsb2NhbCBkaXJlY3RvcmllcyBpbnRvIGEgc2luZ2xlIHJlbW90ZSBkaXJlY3RvcnkuCi0gKiBBIGxvY2FsIGZpbGUgaXMgY29waWVkIGludG8gdGhlIHJlbW90ZSBkaXJlY3RvcnkuCi0gKiBBIGxvY2FsIGRpcmVjdG9yeSBoYXMgaXRzIGNvbnRlbnQgY29waWVkIHJlY3Vyc2l2ZWx5IGludG8gdGhlIHJlbW90ZSBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSdWxlIGltcGxlbWVudHMgSVN5bmNocm9uaXphdGlvblJ1bGUgewotCXByaXZhdGUgaW50IG92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLlVOS05PV047Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNSZWFkT25seSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFzRXhlY3V0YWJsZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlVGltZVN0YW1wID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvd25sb2FkQmFjayA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRSZW1vdGVEaXJlY3RvcnkgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHJlbW90ZURpcmVjdG9yeSA9IG51bGw7Ci0KLQkvKgotCSAqIExpc3Qgb2YgbG9jYWwgcGF0aHMsIHJlcHJlc2VudGVkIGFzIHN0cmluZ3MuCi0JICogVGhleSBtYXkgYmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbG9jYWxGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JLyoKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGxvYWRSdWxlKCkgewotCi0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGRlIHJ1bGUgZnJvbSBhIHNlcmlhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBVcGxvYWRSdWxlKFN0cmluZyBkYXRhKSB7Ci0JCS8qCi0JCSAqIFNwbGl0IHRoZSBzdHJpbmcgaW50byBsaW5lcy4KLQkJICovCi0JCVN0cmluZyBsaXN0W10gPSBkYXRhLnNwbGl0KCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBmaXJzdCB0b2tlbiBpcyB0aGUgcHJvcGVyIGlkZW50aWZpZXIuIElmIG5vdCwgdGhlIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSBydWxlIHRoYXQKLQkJICogY2FuIGJlIHBhcnNlZCBieSB0aGlzIGNsYXNzLgotCQkgKi8KLQkJewotCQkJaWYgKGxpc3QubGVuZ3RoIDwgMSkgewotCQkJCXRocm93RXJyb3IoIlRoZSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcnVsZSBmb3IgIit0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHMgPSBsaXN0WzBdOwotCQkJaWYgKCEgcy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLlRZUEVfVVBMT0FEKSkgewotCQkJCXRocm93RXJyb3IoIlRoZSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcnVsZSBmb3IgIit0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHMgPSBsaXN0W2ldOwotCQkJLyoKLQkJCSAqIFNwbGl0IGtleSBmcm9tIGRhdGEuCi0JCQkgKi8KLQkJCWludCBwID0gcy5pbmRleE9mKCcgJyk7Ci0JCQlpZiAocCA9PSAtMSkgewotCQkJCWxvZ0Vycm9yKCJJbnZhbGlkIHJ1bGUgZW50cnk6ICIrcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBrZXkgPSBzLnN1YnN0cmluZygwLCBwKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHMuc3Vic3RyaW5nKHAgKyAxKTsKLQkJCXBhcnNlRW50cnkoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFVwbG9hZFJ1bGUoVXBsb2FkUnVsZSBydWxlKSB7Ci0JCXRoaXMub3ZlcndyaXRlUG9saWN5ID0gcnVsZS5vdmVyd3JpdGVQb2xpY3k7Ci0JCXRoaXMuYXNSZWFkT25seSA9IHJ1bGUuYXNSZWFkT25seTsKLQkJdGhpcy5hc0V4ZWN1dGFibGUgPSBydWxlLmFzRXhlY3V0YWJsZTsKLQkJdGhpcy5wcmVzZXJ2ZVRpbWVTdGFtcCA9IHJ1bGUucHJlc2VydmVUaW1lU3RhbXA7Ci0JCXRoaXMuZG93bmxvYWRCYWNrID0gcnVsZS5kb3dubG9hZEJhY2s7Ci0JCXRoaXMuZGVmYXVsdFJlbW90ZURpcmVjdG9yeSA9IHJ1bGUuZGVmYXVsdFJlbW90ZURpcmVjdG9yeTsKLQkJaWYgKHJ1bGUucmVtb3RlRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3RlRGlyZWN0b3J5ID0gbmV3IFN0cmluZyhydWxlLnJlbW90ZURpcmVjdG9yeSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnJlbW90ZURpcmVjdG9yeSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5sb2NhbEZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHJ1bGUubG9jYWxGaWxlTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocm93RXJyb3IoU3RyaW5nIHN0cmluZykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzdHJpbmcpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlRW50cnkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfUkVNT1RFX1BBVEgpKSB7Ci0JCQlyZW1vdGVEaXJlY3RvcnkgPSB2YWx1ZTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSkpIHsKLQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX0FMV0FZUykpIHsKLQkJCQlvdmVyd3JpdGVQb2xpY3kgPSBPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVM7Ci0JCQl9IGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQVNLKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLkFTSzsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9ORVdFUikpIHsKLQkJCQlvdmVyd3JpdGVQb2xpY3kgPSBPdmVyd3JpdGVQb2xpY2llcy5ORVdFUjsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9TS0lQKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLlNLSVA7Ci0JCQl9IGVsc2UgewotCQkJCWxvZ0Vycm9yKCJVbmtub3duIG92ZXJ3cml0ZSBwb2xpY3k6ICIrdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTKSkgewotCQkJU3RyaW5nIGZsYWdzW10gPSB2YWx1ZS5zcGxpdCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZsYWcgPSBmbGFnc1tpXTsKLQkJCQlpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHU19ERUZBVUxUX1JFTU9URV9ESVJFQ1RPUlkpKSB7Ci0JCQkJCWRlZmF1bHRSZW1vdGVEaXJlY3RvcnkgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHU19USU1FU1RBTVApKSB7Ci0JCQkJCXByZXNlcnZlVGltZVN0YW1wID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGZsYWcuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1NfRE9XTkxPQURfQkFDSykpIHsKLQkJCQkJZG93bmxvYWRCYWNrID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2dFcnJvcigiVW5rbm93biBmbGFnOiAiK2ZsYWcpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9MT0NBTF9QQVRIKSkgewotCQkJbG9jYWxGaWxlTGlzdC5hZGQodmFsdWUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OUykpIHsKLQkJCVN0cmluZyBmbGFnc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBmbGFnID0gZmxhZ3NbaV07Ci0JCQkJaWYgKGZsYWcuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlNfRVhFQ1VUQUJMRSkpIHsKLQkJCQkJYXNFeGVjdXRhYmxlID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGZsYWcuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlNfUkVBRE9OTFkpKSB7Ci0JCQkJCWFzUmVhZE9ubHkgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ0Vycm9yKCJVbmtub3duIHBlcm1pc3Npb246ICIrZmxhZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9CQkJCi0JCX0gZWxzZSB7Ci0JCQlsb2dFcnJvcigiVW5rbm93biBrZXk6ICIra2V5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCS8qCi0JICogVGhlIHJ1bGUgYXMgYSBzZXJpYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAocmVtb3RlRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCWwuYWRkKFNlcmlhbGl6YXRpb25LZXlzLktFWV9SRU1PVEVfUEFUSCsiICIrcmVtb3RlRGlyZWN0b3J5LnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAob3ZlcndyaXRlUG9saWN5ID09IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUykgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1krIiAiK1NlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX0FMV0FZUyk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvdmVyd3JpdGVQb2xpY3kgPT0gT3ZlcndyaXRlUG9saWNpZXMuQVNLKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSsiICIrU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQVNLKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5ORVdFUikgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1krIiAiK1NlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX05FV0VSKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5TS0lQKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSsiICIrU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfU0tJUCk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoYXNFeGVjdXRhYmxlIHx8IGFzUmVhZE9ubHkpIHsKLQkJCVN0cmluZyBzID0gU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TOwotCQkJaWYgKGFzRXhlY3V0YWJsZSkgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TX0VYRUNVVEFCTEU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChhc1JlYWRPbmx5KSB7Ci0JCQkJcyArPSAiICIgKyBTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlNfUkVBRE9OTFk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWwuYWRkKHMpOwotCQl9Ci0JCWlmIChwcmVzZXJ2ZVRpbWVTdGFtcCB8fCBkZWZhdWx0UmVtb3RlRGlyZWN0b3J5IHx8IGRvd25sb2FkQmFjaykgewotCQkJU3RyaW5nIHMgPSBTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1M7Ci0JCQlpZiAoZGVmYXVsdFJlbW90ZURpcmVjdG9yeSkgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX0RFRkFVTFRfUkVNT1RFX0RJUkVDVE9SWTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHByZXNlcnZlVGltZVN0YW1wKSB7Ci0JCQkJcyArPSAiICIgKyBTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1NfVElNRVNUQU1QOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZG93bmxvYWRCYWNrKSB7Ci0JCQkJcyArPSAiICIgKyBTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1NfRE9XTkxPQURfQkFDSzsJCQkJIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWwuYWRkKHMpOwkJCQotCQl9Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbG9jYWxGaWxlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBsb2NhbHBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsb2NhbHBhdGggPT0gbnVsbCkgY29udGludWU7Ci0JCQlpZiAobG9jYWxwYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSBjb250aW51ZTsKLQkJCQotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX0xPQ0FMX1BBVEgrIiAiK2xvY2FscGF0aC50cmltKCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKFNlcmlhbGl6YXRpb25LZXlzLlRZUEVfVVBMT0FEKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdCArPSAiXG4iICsgZWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBc0V4ZWN1dGFibGUoKSB7Ci0JCXJldHVybiBhc0V4ZWN1dGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXNFeGVjdXRhYmxlKGJvb2xlYW4gYXNFeGVjdXRhYmxlKSB7Ci0JCXRoaXMuYXNFeGVjdXRhYmxlID0gYXNFeGVjdXRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGFzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXNSZWFkT25seShib29sZWFuIGFzUmVhZE9ubHkpIHsKLQkJdGhpcy5hc1JlYWRPbmx5ID0gYXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZW1vdGVEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBkZWZhdWx0UmVtb3RlRGlyZWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRSZW1vdGVEaXJlY3RvcnkoYm9vbGVhbiBkZWZhdWx0UmVtb3RlRGlyZWN0b3J5KSB7Ci0JCXRoaXMuZGVmYXVsdFJlbW90ZURpcmVjdG9yeSA9IGRlZmF1bHRSZW1vdGVEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPdmVyd3JpdGVQb2xpY3koKSB7Ci0JCXJldHVybiBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlUG9saWN5KGludCBvdmVyd3JpdGVQb2xpY3kpIHsKLQkJdGhpcy5vdmVyd3JpdGVQb2xpY3kgPSBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZVN0YW1wKGJvb2xlYW4gcHJlc2VydmVUaW1lU3RhbXApIHsKLQkJdGhpcy5wcmVzZXJ2ZVRpbWVTdGFtcCA9IHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlRGlyZWN0b3J5KCkgewotCQlpZiAocmVtb3RlRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVtb3RlRGlyZWN0b3J5LnRyaW0oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlbW90ZURpcmVjdG9yeShTdHJpbmcgcmVtb3RlRGlyZWN0b3J5KSB7Ci0JCWlmIChyZW1vdGVEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdGVEaXJlY3RvcnkgPSByZW1vdGVEaXJlY3RvcnkudHJpbSgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yZW1vdGVEaXJlY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERvd25sb2FkQmFjayhib29sZWFuIGRvd25sb2FkQmFjaykgewotCQl0aGlzLmRvd25sb2FkQmFjayA9IGRvd25sb2FkQmFjazsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEb3dubG9hZEJhY2soKSB7Ci0JCXJldHVybiBkb3dubG9hZEJhY2s7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UmVtb3RlRmlsZUNvdW50KCkgewotCQlyZXR1cm4gbG9jYWxGaWxlTGlzdC5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgW10gZ2V0TG9jYWxGaWxlc0FzU3RyaW5nQXJyYXkoKSB7Ci0JCVN0cmluZyByZXN1bHQgW10gPSBuZXcgU3RyaW5nIFtsb2NhbEZpbGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSAoU3RyaW5nKSBsb2NhbEZpbGVMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUGF0aCBbXSBnZXRMb2NhbEZpbGVzQXNQYXRoQXJyYXkoKSB7Ci0JCUlQYXRoIHJlc3VsdCBbXSA9IG5ldyBJUGF0aCBbbG9jYWxGaWxlTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbmV3IFBhdGgoKFN0cmluZykgbG9jYWxGaWxlTGlzdC5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEZpbGUgW10gZ2V0TG9jYWxGaWxlc0FzRmlsZUFycmF5KCkgewotCQlGaWxlIHJlc3VsdCBbXSA9IG5ldyBGaWxlIFtsb2NhbEZpbGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRmlsZSgoU3RyaW5nKSBsb2NhbEZpbGVMaXN0LmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIExvY2FsRmlsZUl0ZXJhdG9yQXNTdHJpbmcgaW1wbGVtZW50cyBJdGVyYXRvcjxPYmplY3Q+IHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcnJlZiA9IGxvY2FsRmlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaXRlcmF0b3JyZWYuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJcmV0dXJuIGl0ZXJhdG9ycmVmLm5leHQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWl0ZXJhdG9ycmVmLnJlbW92ZSgpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgTG9jYWxGaWxlSXRlcmF0b3JBc1BhdGggZXh0ZW5kcyBMb2NhbEZpbGVJdGVyYXRvckFzU3RyaW5nIHsKLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKChTdHJpbmcpaXRlcmF0b3JyZWYubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBMb2NhbEZpbGVJdGVyYXRvckFzRmlsZSBleHRlbmRzIExvY2FsRmlsZUl0ZXJhdG9yQXNTdHJpbmcgewotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoKFN0cmluZylpdGVyYXRvcnJlZi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPD8+IGxvY2FsSXRlcmF0b3JBc1N0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEZpbGVJdGVyYXRvckFzU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPD8+IGxvY2FsSXRlcmF0b3JBc1BhdGgoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxGaWxlSXRlcmF0b3JBc1BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8Pz4gbG9jYWxJdGVyYXRvckFzRmlsZSgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEZpbGVJdGVyYXRvckFzRmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvY2FsRmlsZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJbG9jYWxGaWxlTGlzdC5hZGQoc3RyaW5nKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvY2FsRmlsZShJUGF0aCBwYXRoKSB7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWxvY2FsRmlsZUxpc3QuYWRkKHBhdGgudG9PU1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvY2FsRmlsZShGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJbG9jYWxGaWxlTGlzdC5hZGQoZmlsZS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlVcGxvYWRSdWxlIHIgPSBuZXcgVXBsb2FkUnVsZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0QXNFeGVjdXRhYmxlKHRydWUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0QXNSZWFkT25seSh0cnVlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQlyLnNldFJlbW90ZURpcmVjdG9yeSgiL3RtcC9hIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQlyLnNldE92ZXJ3cml0ZVBvbGljeShPdmVyd3JpdGVQb2xpY2llcy5BU0spOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCQotCQlTdHJpbmcgcyA9ICJ1cGxvYWRcbnJlbW90ZS1kaXJlY3RvcnkgL3RtcC9hXG5wZXJtaXNzaW9ucyBleGVjdXRhYmxlIHJlYWRvbmx5XG5mbGFncyBkZWZhdWx0LXJlbW90ZS1kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCXIgPSBuZXcgVXBsb2FkUnVsZShzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEZpbGUoU3RyaW5nIGVudHJ5KSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbG9jYWxGaWxlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lcXVhbHMoZW50cnkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEZpbGUoSVBhdGggZW50cnkpIHsKLQkJcmVtb3ZlTG9jYWxGaWxlKGVudHJ5LnRvT1NTdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsRmlsZShGaWxlIGVudHJ5KSB7Ci0JCXJlbW92ZUxvY2FsRmlsZShlbnRyeS5nZXRQYXRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsRmlsZXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJY2xlYXJMb2NhbEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBpdGVtc1tpXTsKLQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCWFkZExvY2FsRmlsZShzdHJpbmcpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2FsRmlsZXMoSVBhdGhbXSBpdGVtcykgewotCQljbGVhckxvY2FsRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggcGF0aCA9IGl0ZW1zW2ldOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWFkZExvY2FsRmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEZpbGVzKEZpbGVbXSBpdGVtcykgewotCQljbGVhckxvY2FsRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmaWxlID0gaXRlbXNbaV07Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJYWRkTG9jYWxGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJMb2NhbEZpbGVzKCkgewotCQlsb2NhbEZpbGVMaXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG93bmxvYWRSdWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVcGxvYWRSdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvTGFiZWwoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiVVBMT0FEICIrSW50ZWdlci50b1N0cmluZyhsb2NhbEZpbGVMaXN0LnNpemUoKSkrIiBpdGVtKHMpIFxudG8gIityZW1vdGVEaXJlY3Rvcnk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvLyBGSVhNRTogRXhjZXB0aW9ucyBub3QgdGhyb3duCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChvdmVyd3JpdGVQb2xpY3kgPT0gT3ZlcndyaXRlUG9saWNpZXMuVU5LTk9XTikgewotCQkJLy9SZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuVXBsb2FkUnVsZV9WYWxpZGF0ZV9NaXNzaW5nT3ZlcndyaXRlUG9saWN5LCBJUmVtb3RlTGF1bmNoRXJyb3JzLklOVkFMSURfUlVMRSk7Ci0JCX0KLQkJaWYgKGRlZmF1bHRSZW1vdGVEaXJlY3RvcnkgPT0gZmFsc2UpIHsKLQkJCWlmIChyZW1vdGVEaXJlY3RvcnkgPT0gbnVsbCkgewotCQkJCS8vUmVtb3RlTGF1bmNoZXJQbHVnaW4udGhyb3dDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLlVwbG9hZFJ1bGVfVmFsaWRhdGVfTWlzc2luZ1JlbW90ZWRpcmVjdG9yeSwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX1JVTEUpOwotCQkJfQotLy8JCQlJUGF0aCByZW1vdGVQYXRoID0gTGludXhQYXRoLmZyb21TdHJpbmcocmVtb3RlRGlyZWN0b3J5KTsKLS8vCQkJaWYgKCEgcmVtb3RlUGF0aC5pc0Fic29sdXRlKCkpIHsKLS8vCQkJCVJlbW90ZUxhdW5jaGVyUGx1Z2luLnRocm93Q29yZUV4Y2VwdGlvbigiUmVtb3RlIGRpcmVjdG9yeSBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGguIiwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX1JVTEUpOwkJCQkKLS8vCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL0Fic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC9BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjcxY2MuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL0Fic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuQ0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuSUJpbmFyeVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5JQ0V4dGVuc2lvblJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5JQmluYXJ5UGFyc2VyLklCaW5hcnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5MYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQm9vbGVhbkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQVW5pdmVyc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZEpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3Sm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmxhdW5jaC5JUExhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5sYXVuY2guUExhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLlBUUExhdW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuSVN5bmNocm9uaXphdGlvblJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLlJ1bGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5ydWxlc2VuZ2luZS5JTGF1bmNoUHJvY2Vzc0NhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucnVsZXNlbmdpbmUuSVJ1bGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5ydWxlc2VuZ2luZS5SdWxlQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLlBUUFJlbW90ZUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS5jb3JlLkFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUubGludXguQXJndW1lbnRQYXJzZXI7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcwotCQlMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJTGF1bmNoUHJvY2Vzc0NhbGxiYWNrIHsKLQlwcml2YXRlIExpc3Q8SVN5bmNocm9uaXphdGlvblJ1bGU+IGV4dHJhU3luY2hyb25pemF0aW9uUnVsZXM7Ci0JcHVibGljIGVudW0gSm9iU3RhdHVzIHtTVUJNSVRURUQsIENPTVBMRVRFRCwgRVJST1J9Ci0KLQkvKioKLQkgKiBUaGUgSm9iU3VibWlzc2lvbiBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBpbmZvcm1hdGlvbiB1c2VkIGluCi0JICogYSBqb2Igc3VibWlzc2lvbi4gT25jZSB0aGUgam9iIGlzIGNyZWF0ZWQgKmFuZCBzdGFydHMgcnVubmluZyosCi0JICogdGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGNvbXBsZXRlIHRoZSBsYXVuY2guCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKb2JTdWJtaXNzaW9uIHsKLQkJcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCQlwcml2YXRlIFN0cmluZyBtb2RlOwotCQlwcml2YXRlIFN0cmluZyBpZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZXJyb3IgPSBudWxsOwotCQlwcml2YXRlIElQTGF1bmNoIGxhdW5jaDsKLQkJcHJpdmF0ZSBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3I7Ci0JCXByaXZhdGUgSVBEZWJ1Z2dlciBkZWJ1Z2dlcjsKLQkJcHJpdmF0ZSBKb2JTdGF0dXMgc3RhdHVzID0gSm9iU3RhdHVzLlNVQk1JVFRFRDsKLQkJcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIHN1YkxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOzsKLQkJcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gc3ViQ29uZGl0aW9uID0gc3ViTG9jay5uZXdDb25kaXRpb24oKTsKLQotCQlwdWJsaWMgSm9iU3VibWlzc2lvbihpbnQgY291bnQsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJUExhdW5jaCBsYXVuY2gsCi0JCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyLCBJUERlYnVnZ2VyIGRlYnVnZ2VyKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCQkJdGhpcy5tb2RlID0gbW9kZTsKLQkJCXRoaXMubGF1bmNoID0gbGF1bmNoOwotCQkJdGhpcy5hdHRyTWdyID0gYXR0ck1ncjsKLQkJCXRoaXMuZGVidWdnZXIgPSBkZWJ1Z2dlcjsKLQkJCXRoaXMuaWQgPSAiSk9CXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArIEludGVnZXIudG9TdHJpbmcoY291bnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogV2FpdCBmb3IgdGhlIGpvYiBzdGF0ZSB0byBjaGFuZ2UKLQkJICoKLQkJICogQHJldHVybiB0aGUgc3RhdGUKLQkJICovCi0JCXB1YmxpYyBKb2JTdGF0dXMgd2FpdEZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXN1YkxvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIHN0YXR1cyAhPSBKb2JTdGF0dXMuU1VCTUlUVEVEKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdWJDb25kaXRpb24uYXdhaXQoMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBFeHBlY3QgdG8gYmUgaW50ZXJydXB0ZWQgaWYgbW9uaXRvciBpcyBjYW5jZWxlZAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3ViTG9jay51bmxvY2soKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBhdHRyTWdyCi0JCSAqLwotCQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyTWdyKCkgewotCQkJcmV0dXJuIGF0dHJNZ3I7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbgotCQkgKi8KLQkJcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBkZWJ1Z2dlcgotCQkgKi8KLQkJcHVibGljIElQRGVidWdnZXIgZ2V0RGVidWdnZXIoKSB7Ci0JCQlyZXR1cm4gZGVidWdnZXI7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgZXJyb3IKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgam9iIHN1Ym1pc3Npb24gaWQKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgbGF1bmNoCi0JCSAqLwotCQlwdWJsaWMgSVBMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQkJcmV0dXJuIGxhdW5jaDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBtb2RlCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7Ci0JCQlyZXR1cm4gbW9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBzZXQgdGhlIGVycm9yCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJCXRoaXMuZXJyb3IgPSBlcnJvcjsKLQkJCXNldFN0YXR1cyhKb2JTdGF0dXMuRVJST1IpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHNldCB0aGUgY3VycmVudCBzdGF0dXMKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhKb2JTdGF0dXMgc3RhdHVzKSB7Ci0JCQlzdWJMb2NrLmxvY2soKTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJc3ViQ29uZGl0aW9uLnNpZ25hbEFsbCgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdWJMb2NrLnVubG9jaygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBNTUNoaWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCBlKSB7Ci0JCQkvKgotCQkJICogQWRkIHJlc291cmNlIG1hbmFnZXIgY2hpbGQgbGlzdGVuZXIgc28gd2UgZ2V0IG5vdGlmaWVkIHdoZW4gbmV3Ci0JCQkgKiBtYWNoaW5lcyBhcmUgYWRkZWQgdG8gdGhlIG1vZGVsLgotCQkJICovCi0JCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtID0gZS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkgICAgICAgIHJtLmFkZENoaWxkTGlzdGVuZXIocmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lcik7Ci0JICAgICAgICBybS5hZGRFbGVtZW50TGlzdGVuZXIocmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJCS8qCi0JCQkgKiBSZW1vdmVkIHJlc291cmNlIG1hbmFnZXIgY2hpbGQgbGlzdGVuZXIgd2hlbiByZXNvdXJjZSBtYW5hZ2VyIGlzIHJlbW92ZWQuCi0JCQkgKi8KLQkJCWZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm0gPSBlLmdldFJlc291cmNlTWFuYWdlcigpOwotCSAgICAgICAgcm0ucmVtb3ZlQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyKTsKLQkgICAgICAgIHJtLnJlbW92ZUVsZW1lbnRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFF1ZXVlQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElRdWV1ZUNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkSm9iRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZEpvYkV2ZW50IGUpIHsKLQkJCWZvciAoSVBKb2Igam9iIDogZS5nZXRKb2JzKCkpIHsKLQkJCQkvKgotCQkJCSAqIElmIHRoZSBqb2Igc3RhdGUgaGFzIGNoYW5nZWQgdG8gcnVubmluZywgZmluZCB0aGUgSm9iU3VibWlzc2lvbiB0aGF0Ci0JCQkJICogY29ycmVzcG9uZHMgdG8gdGhpcyBqb2IgYW5kIHBlcmZvcm0gcmVtYWluZGVyIG9mIGpvYiBsYXVuY2ggYWN0aW9ucwotCQkJCSAqLwotCQkJCVN0cmluZ0F0dHJpYnV0ZSBzdWJJZEF0dHIgPSBqb2IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0U3ViSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJCWlmIChzdWJJZEF0dHIgIT0gbnVsbCkgewotCQkJCQlJQXR0cmlidXRlPD8sPyw/PiBzdGF0ZUF0dHIgPSBqb2IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJCQlpZiAoc3RhdGVBdHRyICE9IG51bGwpIHsKLQkJCQkJCUpvYkF0dHJpYnV0ZXMuU3RhdGUgc3RhdGUgPSAoSm9iQXR0cmlidXRlcy5TdGF0ZSkoKEVudW1lcmF0ZWRBdHRyaWJ1dGU8Pz4pc3RhdGVBdHRyKS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYgKHN0YXRlID09IEpvYkF0dHJpYnV0ZXMuU3RhdGUuUlVOTklORykgewotCQkJCQkJCUpvYlN1Ym1pc3Npb24gam9iU3ViID0gam9iU3VibWlzc2lvbnMucmVtb3ZlKHN1YklkQXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQkJCQlpZiAoam9iU3ViICE9IG51bGwpIHsKLQkJCQkJCQkJam9iU3ViLnNldFN0YXR1cyhKb2JTdGF0dXMuQ09NUExFVEVEKTsKLQkJCQkJCQkJZG9Db21wbGV0ZUpvYkxhdW5jaChqb2JTdWIuZ2V0Q29uZmlndXJhdGlvbigpLCBqb2JTdWIuZ2V0TW9kZSgpLCBqb2JTdWIuZ2V0TGF1bmNoKCksIGpvYlN1Yi5nZXRBdHRyTWdyKCksIGpvYlN1Yi5nZXREZWJ1Z2dlcigpLCBqb2IpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZihzdGF0ZSA9PSBKb2JBdHRyaWJ1dGVzLlN0YXRlLlRFUk1JTkFURUQgfHwgc3RhdGUgPT0gSm9iQXR0cmlidXRlcy5TdGF0ZS5FUlJPUikgewotCQkJCQkJCUpvYlN1Ym1pc3Npb24gam9iU3ViID0gam9iSW5mb3MucmVtb3ZlKHN1YklkQXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQkJCQlpZihqb2JTdWIgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoc3RhdGUgPT0gSm9iQXR0cmlidXRlcy5TdGF0ZS5URVJNSU5BVEVEKSB7Ci0JCQkJCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsY29uZiA9IGpvYlN1Yi5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJCQkJCQkvLyBJZiBuZWVkZWQsIGNvcHkgZGF0YSBiYWNrLgotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkvLyBHZXQgdGhlIGxpc3Qgb2YgcGF0aHMgdG8gYmUgY29waWVkIGJhY2suCi0JCQkJCQkJCQkJZG9Qb3NMYXVuY2hTeW5jaHJvbml6YXRpb24obGNvbmYpOwotCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCVBUUExhdW5jaFBsdWdpbi5sb2coZTEpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWRvQ2xlYW51b0xhdW5jaChqb2JTdWIuZ2V0Q29uZmlndXJhdGlvbigpLCBqb2JTdWIuZ2V0TW9kZSgpLCBqb2JTdWIuZ2V0TGF1bmNoKCksIGpvYlN1Yi5nZXRBdHRyTWdyKCksIGpvYlN1Yi5nZXREZWJ1Z2dlcigpLCBqb2IpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3Sm9iRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3Sm9iRXZlbnQgZSkgewotCQkJZm9yIChJUEpvYiBqb2IgOiBlLmdldEpvYnMoKSkgewotCQkJCS8qCi0JCQkJICogSWYgdGhlIG5ldyBqb2IgaXMgb25lIHRoYXQgd2UgbGF1bmNoZWQsIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGluIG91ciBsaXN0Ci0JCQkJICogb2Ygam9iIHN1Ym1pc3Npb25zLiBJZiBub3QsIGFzc3VtZSB0aGF0IHdlIGhhdmUgcmVjb25uZWN0ZWQgdG8gYSBzZXNzaW9uCi0JCQkJICogc28gd2UgbmVlZCB0byByZS1jcmVhdGUgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHVzZWQgbGF1bmNoIGl0LgotCQkJCSAqIElmIGl0J3MgYSBkZWJ1ZyBqb2IsIGFuZCBpdCBoYXMgbm90IHlldCBzdGFydGVkIHJ1bm5pbmcsIHRoZW4KLQkJCQkgKiBzdGFydCBhIGRlYnVnIHNlc3Npb24uIEl0J3MgcG9zc2libGUgdGhlIGpvYiB3aWxsIG5ldmVyIHJ1biwgc28gd2UKLQkJCQkgKiBuZWVkIHRvIGNsZWFuIHVwIGFueSBkZWJ1ZyBzZXNzaW9ucyBiZWZvcmUgZXhpdGluZyBFY2xpcHNlLgotCQkJCSAqLwotCQkJCVN0cmluZ0F0dHJpYnV0ZSBzdWJBdHRyID0gam9iLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFN1YklkQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCQlpZiAoc3ViQXR0ciAhPSBudWxsKSB7Ci0JCQkJCUlBdHRyaWJ1dGU8Pyw/LD8+IGxhdW5jaEF0dHIgPSBqb2IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0TGF1bmNoZWRCeVBUUEZsYWdBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJCQlpZiAobGF1bmNoQXR0ciAhPSBudWxsICYmICgoQm9vbGVhbkF0dHJpYnV0ZSlsYXVuY2hBdHRyKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCQlKb2JTdWJtaXNzaW9uIGpvYlN1YiA9IGpvYlN1Ym1pc3Npb25zLmdldChzdWJBdHRyLmdldFZhbHVlKCkpOwotCQkJCQkJaWYgKGpvYlN1YiA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gcmVjcmVhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyBqb2JTdWIgPSAuLi4uOwotCQkJCQkJCS8vIGpvYlN1Ym1pc3Npb25zLnB1dChqb2IsIGpvYlN1Yik7Ci0JCQkJCQl9Ci0JCQkJCQlJQXR0cmlidXRlPD8sPyw/PiBkZWJ1Z0F0dHIgPSBqb2IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdGbGFnQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCQkJCWlmIChkZWJ1Z0F0dHIgIT0gbnVsbCAmJiAoKEJvb2xlYW5BdHRyaWJ1dGUpZGVidWdBdHRyKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVKb2JFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVKb2JFdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFJNQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTWFjaGluZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlZE1hY2hpbmVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkTWFjaGluZUV2ZW50IGUpIHsKLQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJDaGFuZ2VkUXVldWVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUXVldWVFdmVudCBlKSB7Ci0JCQkvLyBDYW4gc2FmZWx5IGlnbm9yZQotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTWFjaGluZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdRdWV1ZUV2ZW50IGUpIHsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IGUuZ2V0UXVldWVzKCkpIHsKLQkJCQlxdWV1ZS5hZGRDaGlsZExpc3RlbmVyKHF1ZXVlQ2hpbGRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJNYWNoaW5lTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJSZW1vdmVNYWNoaW5lRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVtb3ZlTWFjaGluZUV2ZW50IGUpIHsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJSZW1vdmVRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVF1ZXVlRXZlbnQgZSkgewotCQkJZm9yIChJUFF1ZXVlIHF1ZXVlIDogZS5nZXRRdWV1ZXMoKSkgewotCQkJCXF1ZXVlLnJlbW92ZUNoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUk1MaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQgZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudCBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlclN1Ym1pdEpvYkVycm9yRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudCBlKSB7Ci0JCQlKb2JTdWJtaXNzaW9uIGpvYlN1YiA9IGpvYlN1Ym1pc3Npb25zLnJlbW92ZShlLmdldEpvYlN1Ym1pc3Npb25JZCgpKTsKLQkJCWpvYlN1Yi5zZXRFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLSAgICAvKioKLQkgKiBHZXQgdGhlIHByb2dyYW0gYXJndW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgQXJndW1lbnRzIHRhYgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QXJndW1lbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQVJHVU1FTlRTLCAoU3RyaW5nKW51bGwpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZGVidWdnZXIgZXhlY3V0YWJsZSBwYXRoCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXREZWJ1Z2dlckV4ZVBhdGgoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCSAgICByZXR1cm4gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9FWEVDVVRBQkxFX1BBVEgsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBJRCBvZiB0aGUgZGVidWdnZXIgZm9yIHRoaXMgbGF1bmNoCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXREZWJ1Z2dlcklEKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyoqCi0gICAgICogR2V0IHRoZSBkZWJ1Z2dlciAic3RvcCBpbiBtYWluIiBmbGFnCi0gICAgICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gInN0b3AgaW4gbWFpbiIgZmxhZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBnZXREZWJ1Z2dlclN0b3BJbk1haW5GbGFnKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1RPUF9JTl9NQUlOLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhpcyBkZWJ1ZyBzZXNzaW9uCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RGVidWdnZXJXb3JrRGlyZWN0b3J5KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfV09SS0lOR19ESVIsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyoqCi0gICAgICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIHRvIGxhdW5jaC4gSWYgdGhlIGV4ZWN1dGFibGUgaXMgb24gYSByZW1vdGUgbWFjaGluZSwKLSAgICAgKiB0aGlzIGlzIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIG9uIHRoYXQgbWFjaGluZS4KLSAgICAgKgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEV4ZWN1dGFibGVQYXRoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfRVhFQ1VUQUJMRV9QQVRILCAoU3RyaW5nKW51bGwpOwotCX0KLQotICAgIC8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdG8gbGF1bmNoCi0JICoKLQkgKiBAZGVwcmVjYXRlZAotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQcm9ncmFtTmFtZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIHJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FQUExJQ0FUSU9OX05BTUUsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0Ci0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIHJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIGZvciB0aGUgbGF1bmNoCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRRdWV1ZU5hbWUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9RVUVVRV9OQU1FLCAoU3RyaW5nKW51bGwpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byB1c2UgZm9yIHRoZSBsYXVuY2gKLQkgKgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlTWFuYWdlclVuaXF1ZU5hbWUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9SRVNPVVJDRV9NQU5BR0VSX1VOSVFVRU5BTUUsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyoqCi0gICAgICogR2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxhdW5jaAotICAgICAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0V29ya0RpcmVjdG9yeShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIHJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktfRElSRUNUT1JZLCAoU3RyaW5nKW51bGwpOwotCX0KLQotCS8qKgotCSAqIEdldCBpZiB0aGUgZXhlY3V0YWJsZSBzaGFsbCBiZSBjb3BpZWQgdG8gcmVtb3RlIHRhcmdldCBiZWZvcmUgbGF1bmNoLgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENvcHlFeGVjdXRhYmxlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NPUFlfRVhFQ1VUQUJMRSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgaW50IGpvYkNvdW50ID0gMDsKLQotCS8qCi0JICogTW9kZWwgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBtb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyID0gbmV3IE1NQ2hpbGRMaXN0ZW5lcigpOwotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIgcmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciA9IG5ldyBSTUNoaWxkTGlzdGVuZXIoKTsKLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciByZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciA9IG5ldyBSTUxpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBJUXVldWVDaGlsZExpc3RlbmVyIHF1ZXVlQ2hpbGRMaXN0ZW5lciA9IG5ldyBRdWV1ZUNoaWxkTGlzdGVuZXIoKTsKLQkvKgotCSAqIEhhc2hNYXAgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGpvYiBzdWJtaXNzaW9ucwotCSAqLwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBKb2JTdWJtaXNzaW9uPiBqb2JTdWJtaXNzaW9ucyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIEpvYlN1Ym1pc3Npb24+KCkpOwotCS8qCi0JICogVGVtcG9yYXJ5IHdvcmthcm91bmQuIExlYXZlIGEgY29weSBvZiBqb2JTdWJtaXNzaW9ucyB0byBnZXQgam9iIGluZm9ybWF0aW9uIGV2ZW4gYWZ0ZXIgdGhlIHN1Ym1pc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEpvYlN1Ym1pc3Npb24+IGpvYkluZm9zID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgSm9iU3VibWlzc2lvbj4oKSk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSgpIHsKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQlzeW5jaHJvbml6ZWQgKG1tKSB7Ci0JCSAgICBmb3IgKElSZXNvdXJjZU1hbmFnZXIgcm0gOiBtbS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcnMoKSkgewotCQkgICAgCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IHJtLmdldFF1ZXVlcygpKSB7Ci0JCSAgICAJCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJICAgIAl9Ci0JCSAgICAgICAgcm0uYWRkQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyKTsKLQkJICAgICAgICBybS5hZGRFbGVtZW50TGlzdGVuZXIocmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIpOwotCQkgICAgfQotCQkgICAgbW0uYWRkTGlzdGVuZXIobW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLkxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNnZXRMYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBQTGF1bmNoKGNvbmZpZ3VyYXRpb24sIG1vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHNwZWNpZmljIGxhdW5jaCBwYWdlLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbW9kZQotCSAqIEByZXR1cm4gSUF0dHJpYnV0ZVtdCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJQXR0cmlidXRlPD8sPyw/PltdIGdldFJlc291cmNlQXR0cmlidXRlcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlSZXNvdXJjZU1hbmFnZXIgcm0gPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29uZmlndXJhdGlvbik7Ci0KLQkJZmluYWwgQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHJtRmFjdG9yeSA9Ci0JCQlQVFBMYXVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcnkocm0pOwotCQlpZiAocm1GYWN0b3J5ID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVswXTsKLQkJfQotCQlJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBybUR5bmFtaWNUYWIgPSBybUZhY3RvcnkuY3JlYXRlKHJtKTsKLQkJcmV0dXJuIHJtRHluYW1pY1RhYi5nZXRBdHRyaWJ1dGVzKHJtLCBudWxsLCBjb25maWd1cmF0aW9uLCBtb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBBYm9ydCB0aGUgam9iIGxhdW5jaCBpZiBhbnl0aGluZyBnb2VzIHdyb25nLgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHBhcmFtIGNvZGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhYm9ydChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbiwgaW50IGNvZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgam9iIHN0YXRlIGNoYW5nZXMgdG8gUlVOTklORy4gVGhpcyBhbGxvd3MgdGhlIGxhdW5jaGVyIHRvCi0JICogY29tcGxldGUgdGhlIGpvYiBsYXVuY2guCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtb2RlCi0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSBtZ3IKLQkgKiBAcGFyYW0gZGVidWdnZXIKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9Db21wbGV0ZUpvYkxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSVBMYXVuY2ggbGF1bmNoLAotCQkJQXR0cmlidXRlTWFuYWdlciBtZ3IsIElQRGVidWdnZXIgZGVidWdnZXIsIElQSm9iIGpvYik7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0NsZWFudW9MYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLQkJCVN0cmluZyBtb2RlLCBJUExhdW5jaCBsYXVuY2gsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciwKLQkJCUlQRGVidWdnZXIgZGVidWdnZXIsIElQSm9iIGpvYik7Ci0KLS8vCXByb3RlY3RlZCB2b2lkIGRvQ2xlYW51cEpvYkxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwKLS8vCQkJSVBMYXVuY2ggbGF1bmNoLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IsIElQRGVidWdnZXIgZGVidWdnZXIsCi0vLwkJCUlQSm9iIGpvYikgewotLy8JCWlmIChkZWJ1Z2dlciAhPSBudWxsKSB7Ci0vLwkJCWRlYnVnZ2VyLmNsZWFudXAoY29uZmlndXJhdGlvbiwgYXR0ck1nciwgbGF1bmNoKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtb2RlCi0JICogQHJldHVybiBBdHRyaWJ1dGVNYW5hZ2VyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0cmlidXRlTWFuYWdlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAocm0gPT0gbnVsbCkgewotCQkJYWJvcnQoTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Ob19SZXNvdXJjZU1hbmFnZXIsIG51bGwsIDApOwotCQl9Ci0KLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQotCQkvKgotCQkgKiBDb2xsZWN0IGF0dHJpYnV0ZXMgZnJvbSBSZXNvdXJjZXMgdGFiCi0JCSAqLwotCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZXMoZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKGNvbmZpZ3VyYXRpb24sIG1vZGUpKTsKLQotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBxdWV1ZSwgZXZlbiBpZiB0aGUgcmVzb3VyY2VzIHRhYiBkb2Vzbid0IHJlcXVpcmUKLQkJICogb25lIHRvIGJlIHNwZWNpZmllZC4KLQkJICovCi0JCWlmIChhdHRyTWdyLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFF1ZXVlSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpID09IG51bGwpIHsKLQkJCUlQUXVldWUgcXVldWUgPSBnZXRRdWV1ZURlZmF1bHQocm0pOwotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRRdWV1ZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShxdWV1ZS5nZXRJRCgpKSk7Ci0JCX0KLQotCQkvKgotCQkgKiBDb2xsZWN0IGF0dHJpYnV0ZXMgZnJvbSBBcHBsaWNhdGlvbiB0YWIKLQkJICovCi0JCUlQYXRoIHByb2dyYW1QYXRoID0gdmVyaWZ5RXhlY3V0YWJsZVBhdGgoY29uZmlndXJhdGlvbik7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RXhlY3V0YWJsZU5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHByb2dyYW1QYXRoLmxhc3RTZWdtZW50KCkpKTsKLQotCQlTdHJpbmcgcGF0aCA9IHByb2dyYW1QYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldEV4ZWN1dGFibGVQYXRoQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShwYXRoKSk7Ci0JCX0KLQotCQkvKgotCQkgKiBDb2xsZWN0IGF0dHJpYnV0ZXMgZnJvbSBEZWJ1Z2dlciB0YWIKLQkJICovCi0JCXZlcmlmeURlYnVnZ2VyUGF0aChjb25maWd1cmF0aW9uKTsKLQkJQm9vbGVhbiBzdG9wSW5NYWluRmxhZyA9IGdldERlYnVnZ2VyU3RvcEluTWFpbkZsYWcoY29uZmlndXJhdGlvbik7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdnZXJTdG9wSW5NYWluRmxhZ0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoc3RvcEluTWFpbkZsYWcpKTsKLQotCQkvKgotCQkgKiBDb2xsZWN0IGF0dHJpYnV0ZXMgZnJvbSBBcmd1bWVudHMgdGFiCi0JCSAqLwotCQlTdHJpbmcgd2QgPSB2ZXJpZnlXb3JrRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCQlpZiAod2QgIT0gbnVsbCkgewotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRXb3JraW5nRGlyZWN0b3J5QXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSh3ZCkpOwotCQl9Ci0KLQkJU3RyaW5nW10gYXJnQXJyID0gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJaWYgKGFyZ0FyciAhPSBudWxsKSB7Ci0JCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFByb2dyYW1Bcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGFyZ0FycikpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29sbGVjdCBhdHRyaWJ1dGVzIGZyb20gRW52aXJvbm1lbnQgdGFiCi0JCSAqLwotCQlTdHJpbmdbXSBlbnZBcnIgPSBnZXRFbnZpcm9ubWVudFRvQXBwZW5kKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoZW52QXJyICE9IG51bGwpIHsKLQkJCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RW52aXJvbm1lbnRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGVudkFycikpOwotCQl9Ci0KLQkJLyoKLQkJICogUFRQIGxhdW5jaGVkIHRoaXMgam9iCi0JCSAqLwotCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldExhdW5jaGVkQnlQVFBGbGFnQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSh0cnVlKSk7Ci0KLQkJcmV0dXJuIGF0dHJNZ3I7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBkZWJ1Z2dlciBjb25maWd1cmF0aW9uCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gZGVidWdnZXIgY29uZmlndXJhdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJUERlYnVnQ29uZmlndXJhdGlvbiBnZXREZWJ1Z0NvbmZpZyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBEZWJ1Z0NvbmZpZ3VyYXRpb24gZGJnQ2ZnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRiZ0NmZyA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVidWdDb25maWd1cmF0aW9uKGdldERlYnVnZ2VySUQoY29uZmlnKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5nZXREZWJ1Z0NvbmZpZygpIEVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIGRiZ0NmZzsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGFwcGxpY2F0aW9uIGFyZ3VtZW50cyB0byBhbiBhcnJheSBvZiBzdHJpbmdzLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgcHJvZ3JhbSBhcmd1bWVudHMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZW1wID0gZ2V0QXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBSZXBsYWNlZCBQVFBzIEFyZ3VtZW50UGFyc2VyIHdpdGggYmV0dGVyIEFyZ3VtZW50UGFyc2VyIGNvbnRyaWJ1dGVkIHdpdGggUmVtb3RlVG9vbHMuCi0vLwkJCUFyZ3VtZW50UGFyc2VyIGFwID0gbmV3IEFyZ3VtZW50UGFyc2VyKHRlbXApOwotLy8JCQlMaXN0PFN0cmluZz4gYXJncyA9IGFwLmdldEFyZ3VtZW50cygpOwotCQkJQXJndW1lbnRQYXJzZXIgYXAgPSBuZXcgQXJndW1lbnRQYXJzZXIodGVtcCk7Ci0JCQlMaXN0PFN0cmluZz4gYXJncyA9IGFwLmdldFRva2VuTGlzdCgpOwotCQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJCXJldHVybiBhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcmdzLnNpemUoKV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGF0aCBvZiB0aGUgcHJvZ3JhbSB0byBsYXVuY2guIE5vIGxvbmdlciB1c2VkIHNpbmNlIHRoZSBwcm9ncmFtIG1heSBub3QgYmUKLQkgKiBvbiB0aGUgbG9jYWwgbWFjaGluZS4KLQkgKgotCSAqIEBkZXByZWNhdGVkCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gSVBhdGggY29ycmVzcG9uZGluZyB0byBwcm9ncmFtIGV4ZWN1dGFibGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBJUGF0aCBnZXRQcm9ncmFtRmlsZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2ZXJpZnlQcm9qZWN0KGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRQcm9ncmFtTmFtZShjb25maWd1cmF0aW9uKTsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwpCi0JCQlhYm9ydChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0FwcGxpY2F0aW9uX2ZpbGVfbm90X3NwZWNpZmllZCwgbnVsbCwgSVN0YXR1cy5JTkZPKTsKLQotCQlJUGF0aCBwcm9ncmFtUGF0aCA9IG5ldyBQYXRoKGZpbGVOYW1lKTsKLQkJaWYgKCFwcm9ncmFtUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCXByb2dyYW1QYXRoID0gcHJvamVjdC5nZXRGaWxlKHByb2dyYW1QYXRoKS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmICghcHJvZ3JhbVBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCWFib3J0KE1lc3NhZ2VzLkFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfQXBwbGljYXRpb25fZmlsZV9kb2VzX25vdF9leGlzdCwKLQkJCQkJbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1BhdGhfbm90X2ZvdW5kLCBuZXcgT2JqZWN0W10ge3Byb2dyYW1QYXRoLnRvU3RyaW5nKCl9KSksCi0JCQkJCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuRVJSX1BST0dSQU1fTk9UX0VYSVNUKTsKLQkJfQotCQkvKiAtLW9sZAotCQlJRmlsZSBwcm9ncmFtUGF0aCA9IHByb2plY3QuZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCWlmIChwcm9ncmFtUGF0aCA9PSBudWxsIHx8ICFwcm9ncmFtUGF0aC5leGlzdHMoKSB8fCAhcHJvZ3JhbVBhdGguZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5leGlzdHMoKSkKLQkJCWFib3J0KExhdW5jaE1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFwcGxpY2F0aW9uX2ZpbGVfZG9lc19ub3RfZXhpc3QiKSwgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihMYXVuY2hNZXNzYWdlcy5nZXRGb3JtYXR0ZWRSZXNvdXJjZVN0cmluZygiQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BcHBsaWNhdGlvbl9wYXRoX25vdF9mb3VuZCIsIHByb2dyYW1QYXRoLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSkpLCBJU3RhdHVzLklORk8pOwotCQkgKi8KLQkJcmV0dXJuIHByb2dyYW1QYXRoOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSVByb2plY3Qgb2JqZWN0IGZyb20gdGhlIHByb2plY3QgbmFtZS4KLQkgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IG5hbWUgb2YgdGhlIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIElQcm9qZWN0IHJlc291cmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpOwotICAgIH0KLQotCS8qKgotCSAqIEdldCB0aGUgZGVmYXVsdCBxdWV1ZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIKLQkgKgotCSAqIEBwYXJhbSBybSByZXNvdXJjZSBtYW5hZ2VyCi0JICogQHJldHVybiBkZWZhdWx0IHF1ZXVlCi0JICovCi0JcHJvdGVjdGVkIElQUXVldWUgZ2V0UXVldWVEZWZhdWx0KElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJZmluYWwgSVBRdWV1ZVtdIHF1ZXVlcyA9IHJtLmdldFF1ZXVlcygpOwotCQlpZiAocXVldWVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcXVldWVzWzBdOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdW5pcXVlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gcmVzb3VyY2UgbWFuYWdlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQVW5pdmVyc2UgdW5pdmVyc2UgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpOwotCQlJUmVzb3VyY2VNYW5hZ2VyW10gcm1zID0gdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpOwotCQlTdHJpbmcgcm1VbmlxdWVOYW1lID0gZ2V0UmVzb3VyY2VNYW5hZ2VyVW5pcXVlTmFtZShjb25maWd1cmF0aW9uKTsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogcm1zKSB7Ci0JCQlpZiAocm0uZ2V0U3RhdGUoKSA9PSBSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUQVJURUQgJiYKLQkJCQkJcm0uZ2V0VW5pcXVlTmFtZSgpLmVxdWFscyhybVVuaXF1ZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJtOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd29ya3NwYWNlIHJvb3QuCi0JICoKLSAgICAgKiBAcmV0dXJuIHdvcmtzcGFjZSByb290Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0gICAgCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIH0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHNvdXJjZSBsb2NhdG9yIGZyb20gdGhlIElEIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiwgb3IgY3JlYXRlCi0JICogYSBkZWZhdWx0IG9uZSBpZiBpdCBoYXNuJ3QgYmVlbiBzcGVjaWZpZWQuCi0JICoKLQkgKiBAcGFyYW0gbGF1bmNoCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U291cmNlTG9jYXRvcihJTGF1bmNoIGxhdW5jaCwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyAgc2V0IGRlZmF1bHQgc291cmNlIGxvY2F0b3IgaWYgbm9uZSBzcGVjaWZpZWQKLQkJaWYgKGxhdW5jaC5nZXRTb3VyY2VMb2NhdG9yKCkgPT0gbnVsbCkgewotCQkJSVBlcnNpc3RhYmxlU291cmNlTG9jYXRvciBzb3VyY2VMb2NhdG9yOwotCQkJU3RyaW5nIGlkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9TT1VSQ0VfTE9DQVRPUl9JRCwgKFN0cmluZyludWxsKTsKLQkJCWlmIChpZCA9PSBudWxsKSB7Ci0JCQkJc291cmNlTG9jYXRvciA9IFBUUERlYnVnVUlQbHVnaW4uY3JlYXRlRGVmYXVsdFNvdXJjZUxvY2F0b3IoKTsKLQkJCQlzb3VyY2VMb2NhdG9yLmluaXRpYWxpemVEZWZhdWx0cyhjb25maWd1cmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc291cmNlTG9jYXRvciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkubmV3U291cmNlTG9jYXRvcihpZCk7Ci0JCQkJU3RyaW5nIG1lbWVudG8gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1NPVVJDRV9MT0NBVE9SX01FTUVOVE8sIChTdHJpbmcpbnVsbCk7Ci0JCQkJaWYgKG1lbWVudG8gPT0gbnVsbCkgewotCQkJCQlzb3VyY2VMb2NhdG9yLmluaXRpYWxpemVEZWZhdWx0cyhjb25maWd1cmF0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzb3VyY2VMb2NhdG9yLmluaXRpYWxpemVGcm9tTWVtZW50byhtZW1lbnRvKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsYXVuY2guc2V0U291cmNlTG9jYXRvcihzb3VyY2VMb2NhdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgYXBwbGljYXRpb24KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2gKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlTG9jYXRvcihJTGF1bmNoIGxhdW5jaCwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJtaXQgYSBqb2IgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIuIEtlZXBzIHRyYWNrIG9mIHRoZSBzdWJtaXNzaW9uIHNvIHdlIGtub3cgd2hlbiB0aGUKLQkgKiBqb2IgYWN0dWFsbHkgc3RhcnRzIHJ1bm5pbmcuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgYWJzdHJhY3QgbWV0aG9kIGRvQ29tcGxldGVKb2JMYXVuY2goKQotCSAqIGlzIGludm9rZWQuCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtb2RlCi0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSBhdHRyTWdyCi0JICogQHBhcmFtIGRlYnVnZ2VyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdWJtaXRKb2IoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElQTGF1bmNoIGxhdW5jaCwKLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyLCBJUERlYnVnZ2VyIGRlYnVnZ2VyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAocm0gPT0gbnVsbCkgewotCQkJYWJvcnQoTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Ob19SZXNvdXJjZU1hbmFnZXIsIG51bGwsIDApOwotCQl9Ci0KLQkJSm9iU3VibWlzc2lvbiBqb2JTdWIgPSBuZXcgSm9iU3VibWlzc2lvbihqb2JDb3VudCsrLCBjb25maWd1cmF0aW9uLCBtb2RlLCBsYXVuY2gsIGF0dHJNZ3IsIGRlYnVnZ2VyKTsKLQkJam9iU3VibWlzc2lvbnMucHV0KGpvYlN1Yi5nZXRJZCgpLCBqb2JTdWIpOwotCQlqb2JJbmZvcy5wdXQoam9iU3ViLmdldElkKCksIGpvYlN1Yik7Ci0KLQkJcm0uc3VibWl0Sm9iKGpvYlN1Yi5nZXRJZCgpLCBjb25maWd1cmF0aW9uLCBhdHRyTWdyLCBtb25pdG9yKTsKLQotCQlKb2JTdGF0dXMgc3RhdHVzID0gam9iU3ViLndhaXRGb3IobW9uaXRvcik7Ci0KLQkJaWYgKHN0YXR1cyA9PSBKb2JTdGF0dXMuRVJST1IpIHsKLQkJCWFib3J0KGpvYlN1Yi5nZXRFcnJvcigpLCBudWxsLCBJU3RhdHVzLkVSUk9SKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGV4ZVBhdGgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBJQmluYXJ5T2JqZWN0IHZlcmlmeUJpbmFyeShJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBleGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDRXh0ZW5zaW9uUmVmZXJlbmNlW10gcGFyc2VyUmVmID0gQ0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJpbmFyeVBhcnNlckV4dGVuc2lvbnMocHJvamVjdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlCaW5hcnlQYXJzZXIgcGFyc2VyID0gKElCaW5hcnlQYXJzZXIpIHBhcnNlclJlZltpXS5jcmVhdGVFeHRlbnNpb24oKTsKLQkJCQlJQmluYXJ5T2JqZWN0IGV4ZSA9IChJQmluYXJ5T2JqZWN0KSBwYXJzZXIuZ2V0QmluYXJ5KGV4ZVBhdGgpOwotCQkJCWlmIChleGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZXhlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJSUJpbmFyeVBhcnNlciBwYXJzZXIgPSBDQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdEJpbmFyeVBhcnNlcigpOwotCQl0cnkgewotCQkJcmV0dXJuIChJQmluYXJ5T2JqZWN0KSBwYXJzZXIuZ2V0QmluYXJ5KGV4ZVBhdGgpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9ncmFtX2lzX25vdF9hX3JlY29uZ25pemVkX2V4ZWN1dGFibGUpOwotCQlpbnQgY29kZSA9IElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9QUk9HUkFNX05PVF9CSU5BUlk7Ci0JCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQVFBDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgY29kZSwgTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9ncmFtX2lzX25vdF9hX3JlY29uZ25pemVkX2V4ZWN1dGFibGUsIGV4Y2VwdGlvbik7Ci0JCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgY29kZSwgZXhjZXB0aW9uID09IG51bGwgPyAiIiA6IGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOyAvLyROT04tTkxTLTEkCi0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlEZWJ1Z2dlclBhdGgoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZGJnUGF0aCA9IGdldERlYnVnZ2VyRXhlUGF0aChjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCXZlcmlmeVJlc291cmNlKGRiZ1BhdGgsIGNvbmZpZ3VyYXRpb24pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWFib3J0KE1lc3NhZ2VzLkFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfRGVidWdnZXJfcGF0aF9ub3RfZm91bmQsCi0JCQkJCW5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBJU3RhdHVzLklORk8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBleGVjdXRhYmxlIHBhdGguCi0JICogSWYgdGhlIGV4ZWN1dGFibGUgaXMgdG8gYmUgY29waWVkLCB0aGVuIG5vIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIGlzIHJlcXVpcmVkLgotCSAqIE90aGVyd2lzZSwgdGhlIHBhdGggbXVzdCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlLgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUGF0aCB2ZXJpZnlFeGVjdXRhYmxlUGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0Q29weUV4ZWN1dGFibGUoY29uZmlndXJhdGlvbikpIHsKLQkJCXJldHVybiBuZXcgUGF0aChnZXRFeGVjdXRhYmxlUGF0aChjb25maWd1cmF0aW9uKSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgZXhlUGF0aCA9IGdldEV4ZWN1dGFibGVQYXRoKGNvbmZpZ3VyYXRpb24pOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdmVyaWZ5UmVzb3VyY2UoZXhlUGF0aCwgY29uZmlndXJhdGlvbik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0FwcGxpY2F0aW9uX2ZpbGVfZG9lc19ub3RfZXhpc3QsCi0JCQkJCQluZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwJSVN0YXR1cy5JTkZPKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUlQYXRoIHByb2dyYW1QYXRoID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmIChwcm9ncmFtUGF0aCA9PSBudWxsIHx8IHByb2dyYW1QYXRoLmlzRW1wdHkoKSB8fCAhcHJvZ3JhbVBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZnkgdGhhdCB0aGUgcHJvamVjdCBleGlzdHMgcHJpb3IgdG8gdGhlIGxhdW5jaC4KLQkgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJvamVjdCB2ZXJpZnlQcm9qZWN0KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb05hbWUgPSBnZXRQcm9qZWN0TmFtZShjb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKHByb05hbWUgPT0gbnVsbCkgewotICAgCQkJYWJvcnQoTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9qZWN0X25vdF9zcGVjaWZpZWQsIG51bGwsIElTdGF0dXMuSU5GTyk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9OYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5leGlzdHMoKSB8fCAhcHJvamVjdC5pc09wZW4oKSkgewotCQkJYWJvcnQoTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9qZWN0X2RvZXNfbm90X2V4aXN0X29yX2lzX25vdF9hX3Byb2plY3QsIG51bGwsIElTdGF0dXMuSU5GTyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJUGF0aCB2ZXJpZnlSZXNvdXJjZShTdHJpbmcgcGF0aCwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbClnZXRSZXNvdXJjZU1hbmFnZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChybSA9PSBudWxsKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX05vX1Jlc291cmNlTWFuYWdlciwgbnVsbCwgSVN0YXR1cy5FUlJPUik7Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmYgPSBybS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCWlmICghKGNvbmYgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1Vuc3VwcG9ydGVkX3Jlc291cmNlX21hbmFnZXJfdHlwZSwgbnVsbCwgSVN0YXR1cy5FUlJPUik7Ci0JCX0KLQkJCi0JCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiByZW1Db25mID0gKEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiljb25mOwotCQlJUmVtb3RlU2VydmljZXMgcmVtb3RlU2VydmljZXMgPSBQVFBSZW1vdGVDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVTZXJ2aWNlcyhyZW1Db25mLmdldFJlbW90ZVNlcnZpY2VzSWQoKSk7Ci0JCWlmIChyZW1vdGVTZXJ2aWNlcyA9PSBudWxsKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1Vua25vd25fcmVtb3RlX3NlcnZpY2VzLCBudWxsLCBJU3RhdHVzLkVSUk9SKTsKLQkJfQotCQlJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgY29ubk1nciA9IHJlbW90ZVNlcnZpY2VzLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0JCUlSZW1vdGVDb25uZWN0aW9uIGNvbm4gPSBjb25uTWdyLmdldENvbm5lY3Rpb24ocmVtQ29uZi5nZXRDb25uZWN0aW9uTmFtZSgpKTsKLQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gcmVtb3RlU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoY29ubik7Ci0JCUlQYXRoIHJlc1BhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJdHJ5IHsKLQkJCUlGaWxlU3RvcmUgcmVzID0gZmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UocmVzUGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlpZiAoIXJlcy5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotCQkJCWFib3J0KE5MUy5iaW5kKE1lc3NhZ2VzLkFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfUGF0aF9ub3RfZm91bmQsIG5ldyBPYmplY3RbXSB7cGF0aH0pLCBudWxsLCBJU3RhdHVzLklORk8pOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0Vycm9yX2ZldGNoaW5nX3Jlc291cmNlLCBlLmdldENhdXNlKCksIElTdGF0dXMuRVJST1IpOwotCQl9Ci0JCXJldHVybiByZXNQYXRoOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBjb3B5IGxvY2FsIGZpbGUgaXMgZW5hYmxlZC4gSWYgaXQgaXMsIGNvcHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBmcm9tCi0JICogdGhlIGxvY2FsIGhvc3QgdG8gdGhlIHJlbW90ZSBob3N0LgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RXhlY3V0YWJsZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBjb3B5RXhlY3V0YWJsZSA9Ci0JCQlnZXRDb3B5RXhlY3V0YWJsZShjb25maWd1cmF0aW9uKTsKLQotCQlpZihjb3B5RXhlY3V0YWJsZSkgewotCQkJLy8gR2V0IHJlbW90ZSBhbmQgbG9jYWwgcGF0aHMKLQkJCVN0cmluZyByZW1vdGVQYXRoID0gZ2V0RXhlY3V0YWJsZVBhdGgoY29uZmlndXJhdGlvbik7Ci0JCQlTdHJpbmcgbG9jYWxQYXRoID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9MT0NBTF9FWEVDVVRBQkxFX1BBVEgsCi0JCQkJCShTdHJpbmcpbnVsbCk7Ci0KLQkJCS8vIENoZWNrIGlmIGxvY2FsIHBhdGggaXMgdmFsaWQKLQkJCWlmKGxvY2FsUGF0aCA9PSBudWxsKSB7Ci0JCQkJLy8gVGhyb3dzIGV4Y2VwdGlvbgotCQkJfQotCi0JCQkvLyBDb3B5IGRhdGEKLQkJCWNvcHlGaWxlVG9SZW1vdGVIb3N0KGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgY29uZmlndXJhdGlvbiwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZGF0YSBmcm9tIGEgcGF0aCAoY2FuIGJlIGEgZmlsZSBvciBkaXJlY3RvcnkpIGZyb20gdGhlIHJlbW90ZSBob3N0IHRvCi0JICogdGhlIGxvY2FsIGhvc3QuCi0JICoKLQkgKiBAcGFyYW0gcmVtb3RlUGF0aAotCSAqIEBwYXJhbSBsb2NhbFBhdGgKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlGaWxlRnJvbVJlbW90ZUhvc3QoU3RyaW5nIHJlbW90ZVBhdGgsIFN0cmluZyBsb2NhbFBhdGgsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8qSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gPSAoSVJlc291cmNlTWFuYWdlckNvbnRyb2wpZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAocm0gIT0gbnVsbCkgewotCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZiA9IHJtLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25mIGluc3RhbmNlb2YgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSB7Ci0JCQkJQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIHJlbUNvbmYgPSAoQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKWNvbmY7Ci0KLQkJCQlJUmVtb3RlU2VydmljZXMgbG9jYWxTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKCJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuTG9jYWxTZXJ2aWNlcyIpOwotCQkJCUlSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKHJlbUNvbmYuZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJCQlpZiAocmVtb3RlU2VydmljZXMgIT0gbnVsbCAmJiBsb2NhbFNlcnZpY2VzICE9IG51bGwpIHsKLQkJCQkJSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIGxjb25uTWdyID0gbG9jYWxTZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQkJCQlJUmVtb3RlQ29ubmVjdGlvbiBsY29ubiA9IGxjb25uTWdyLmdldENvbm5lY3Rpb24obnVsbCk7IC8vIFNpbmNlIGl0J3MgYSBsb2NhbCBzZXJ2aWNlLCBkb2Vzbid0IG1hdHRlciB3aGljaCBwYXJhbWV0ZXIgaXMgcGFzc2VkKi8KLQkJCQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGxvY2FsRmlsZU1hbmFnZXIgPSBnZXRMb2NhbEZpbGVNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOy8vbG9jYWxTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcihsY29ubik7Ci0KLQkJCQkJLypJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgcmNvbm5NZ3IgPSByZW1vdGVTZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQkJCQlJUmVtb3RlQ29ubmVjdGlvbiByY29ubiA9IHJjb25uTWdyLmdldENvbm5lY3Rpb24ocmVtQ29uZi5nZXRDb25uZWN0aW9uTmFtZSgpKTsqLwotCQkJCQlJUmVtb3RlRmlsZU1hbmFnZXIgcmVtb3RlRmlsZU1hbmFnZXIgPSBnZXRSZW1vdGVGaWxlTWFuYWdlcihjb25maWd1cmF0aW9uKTsvL3JlbW90ZVNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKHJjb25uKTsKLQotCQkJCQl0cnkgewotCQkJCQkJSUZpbGVTdG9yZSBycmVzID0gcmVtb3RlRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UobmV3IFBhdGgocmVtb3RlUGF0aCksIG1vbml0b3IpOwotCi0JCQkJCQlpZighcnJlcy5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotCQkJCQkJCS8vIExvY2FsIGZpbGUgbm90IGZvdW5kIQotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1JlbW90ZV9yZXNvdXJjZV9kb2VzX25vdF9leGlzdCkpOwotCQkJCQkJfQotCQkJCQkJSUZpbGVTdG9yZSBscmVzID0gbG9jYWxGaWxlTWFuYWdlci5nZXRSZXNvdXJjZShuZXcgUGF0aChsb2NhbFBhdGgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkJCQkJLy8gQ29weSBmaWxlCi0JCQkJCQlycmVzLmNvcHkobHJlcywgRUZTLk9WRVJXUklURSwgbW9uaXRvcik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfQ291bGRfbm90X3JldHJpZXZlX3JlbW90ZV9yZXNvdXJjZV9pbmZvKSk7Ci0JCQkJCX0KLQkvKgkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRklYTUU6IHdvcmsgb3V0IHdoYXQgdG8gZG8gZm9yIFJNJ3MgdGhhdCBkb24ndCBleHRlbmQgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uCi0JCQl9Ci0JCX0qLwotCX0KLQotCS8qKgotCSAqIENvcHkgYSBkYXRhIGZyb20gYSBwYXRoIChjYW4gYmUgYSBmaWxlIG9yIGRpcmVjdG9yeSkgZnJvbSB0aGUgbG9jYWwgaG9zdCB0bwotCSAqIHRoZSByZW1vdGUgaG9zdC4KLQkgKgotCSAqIEBwYXJhbSBsb2NhbFBhdGgKLQkgKiBAcGFyYW0gcmVtb3RlUGF0aAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weUZpbGVUb1JlbW90ZUhvc3QoU3RyaW5nIGxvY2FsUGF0aCwgU3RyaW5nIHJlbW90ZVBhdGgsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGxvY2FsRmlsZU1hbmFnZXIgPSBnZXRMb2NhbEZpbGVNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCi0JCQkJCUlSZW1vdGVGaWxlTWFuYWdlciByZW1vdGVGaWxlTWFuYWdlciA9IGdldFJlbW90ZUZpbGVNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlJRmlsZVN0b3JlIGxyZXMgPSBsb2NhbEZpbGVNYW5hZ2VyLmdldFJlc291cmNlKG5ldyBQYXRoKGxvY2FsUGF0aCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJaWYoIWxyZXMuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLQkJCQkJCQkvLyBMb2NhbCBmaWxlIG5vdCBmb3VuZCEKLQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUExhdW5jaFBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQkJCQkJTWVzc2FnZXMuQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Mb2NhbF9yZXNvdXJjZV9kb2VzX25vdF9leGlzdCkpOwotCQkJCQkJfQotCQkJCQkJSUZpbGVTdG9yZSBycmVzID0gcmVtb3RlRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UobmV3IFBhdGgocmVtb3RlUGF0aCksIG1vbml0b3IpOwotCi0JCQkJCQkvLyBDb3B5IGZpbGUKLQkJCQkJCWxyZXMuY29weShycmVzLCBFRlMuT1ZFUldSSVRFLCBtb25pdG9yKTsKLQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUExhdW5jaFBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0NvdWxkX25vdF9yZXRyaWV2ZV9sb2NhbF9yZXNvdXJjZV9pbmZvKSk7Ci0JCQkJCX0KLQl9Ci0KLQkvKioKLQkgKiBWZXJpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBJZiBubyB3b3JraW5nIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzCi0JICogdGhlIGxvY2F0aW9uIG9mIHRoZSBleGVjdXRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJpZnlXb3JrRGlyZWN0b3J5KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aDsKLSAgICAgICAgU3RyaW5nIHdvcmtQYXRoID0gZ2V0V29ya0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKHdvcmtQYXRoID09IG51bGwpIHsKLSAgICAgICAgCXBhdGggPSB2ZXJpZnlFeGVjdXRhYmxlUGF0aChjb25maWd1cmF0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gdmVyaWZ5UmVzb3VyY2Uod29ya1BhdGgsIGNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZG9lcyB0aGUgc3luY2hyb25pemF0aW9uIHN0ZXAgYmVmb3JlIHRoZSBqb2Igc3VibWlzc2lvbgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUHJlTGF1bmNoU3luY2hyb25pemF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBzeW5jQmVmb3JlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TWU5DX0JFRk9SRSwgZmFsc2UpOwotCQlpZighc3luY0JlZm9yZSkKLQkJCXJldHVybjsKLQotCQkvLyBUaGlzIGZhY3Rpb24gZ2VuZXJhdGUgYWN0aW9uIG9iamVjdHMgd2hpY2ggZXhlY3V0ZSBhY2NvcmRpbmcgdG8gcnVsZXMKLQkJUnVsZUFjdGlvbkZhY3RvcnkgcnVsZUFjdEZhY3RvcnkgPSBuZXcgUnVsZUFjdGlvbkZhY3RvcnkoY29uZmlndXJhdGlvbiwgdGhpcywgbW9uaXRvcik7Ci0KLQkJTGlzdDw/PiBydWxlc0xpc3QgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NZTkNfUlVMRVMsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQotCQkvLyBJdGVyYXRlIG92ZXIgcnVsZXMgZXhlY3V0aW5nIHRoZW0KLQkJZm9yIChPYmplY3QgcnVsZU9iaiA6IHJ1bGVzTGlzdCkgewotCQkJSVN5bmNocm9uaXphdGlvblJ1bGUgc3luY1J1bGUgPQotCQkJCVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGVGcm9tU3RyaW5nKChTdHJpbmcpcnVsZU9iaik7Ci0JCQlpZihzeW5jUnVsZS5pc1VwbG9hZFJ1bGUoKSkgewotCQkJCS8vIEV4ZWN1dGUgdGhlIGFjdGlvbgotCQkJCUlSdWxlQWN0aW9uIGFjdGlvbiA9IHJ1bGVBY3RGYWN0b3J5LmdldEFjdGlvbihzeW5jUnVsZSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1Bvc0xhdW5jaFN5bmNocm9uaXphdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHN5bmNBZnRlcjsKLQkJc3luY0FmdGVyID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TWU5DX0FGVEVSLCBmYWxzZSk7Ci0JCWlmKCFzeW5jQWZ0ZXIpCi0JCQlyZXR1cm47Ci0JCUxpc3Q8Pz4gcnVsZXNMaXN0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TWU5DX1JVTEVTLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0KLQkJLy8gVGhpcyBmYWN0aW9uIGdlbmVyYXRlIGFjdGlvbiBvYmplY3RzIHdoaWNoIGV4ZWN1dGUgYWNjb3JkaW5nIHRvIHJ1bGVzCi0JCVJ1bGVBY3Rpb25GYWN0b3J5IHJ1bGVBY3RGYWN0b3J5ID0gbmV3IFJ1bGVBY3Rpb25GYWN0b3J5KGNvbmZpZ3VyYXRpb24sIHRoaXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWZvciAoT2JqZWN0IHJ1bGVPYmogOiBydWxlc0xpc3QpIHsKLQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIHN5bmNSdWxlID0KLQkJCQlSdWxlRmFjdG9yeS5jcmVhdGVSdWxlRnJvbVN0cmluZygoU3RyaW5nKXJ1bGVPYmopOwotCQkJaWYoc3luY1J1bGUuaXNEb3dubG9hZFJ1bGUoKSkgewotCQkJCS8vIEV4ZWN1dGUgdGhlIGFjdGlvbgotCQkJCUlSdWxlQWN0aW9uIGFjdGlvbiA9IHJ1bGVBY3RGYWN0b3J5LmdldEFjdGlvbihzeW5jUnVsZSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgKHBvc3NpYmxlIGVtcHR5KSBsaXN0IG9mIHN5bmNocm9uaXphdGlvbiBydWxlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZXNjcmliZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIElTeW5jaHJvbml6YXRpb25SdWxlW10gZ2V0U3luY2hyb25pemVSdWxlcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8Pz4gcnVsZVN0cmluZ3MgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NZTkNfUlVMRVMsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJTGlzdDxJU3luY2hyb25pemF0aW9uUnVsZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJU3luY2hyb25pemF0aW9uUnVsZT4oKTsKLQotCQlmb3IgKE9iamVjdCBydWxlT2JqIDogcnVsZVN0cmluZ3MpIHsKLQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgcnVsZU9iajsKLQkJCXRyeSB7Ci0JCQkJSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSA9IFJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGVGcm9tU3RyaW5nKGVsZW1lbnQpOwotCQkJCXJlc3VsdC5hZGQocnVsZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwKLQkJCQkJCVBUUExhdW5jaFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0Vycm9yX2NvbnZlcnRpbmdfcnVsZXMpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSVN5bmNocm9uaXphdGlvblJ1bGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElTeW5jaHJvbml6YXRpb25SdWxlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvLyBNZXRob2RzIGJlbG93IGltcGxlbWVudCB0aGUgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBpbnRlcmZhY2UKLQotCXB1YmxpYyB2b2lkIGFkZFN5bmNocm9uaXphdGlvblJ1bGUoSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSkgewotCQlleHRyYVN5bmNocm9uaXphdGlvblJ1bGVzLmFkZChydWxlKTsKLQl9Ci0KLQlwdWJsaWMgSVJlbW90ZUZpbGVNYW5hZ2VyIGdldExvY2FsRmlsZU1hbmFnZXIoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbClnZXRSZXNvdXJjZU1hbmFnZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChybSAhPSBudWxsKSB7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25mID0gcm0uZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJaWYgKGNvbmYgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIHsKLQkJCQlJUmVtb3RlU2VydmljZXMgbG9jYWxTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKCJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLkxvY2FsU2VydmljZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsb2NhbFNlcnZpY2VzICE9IG51bGwpIHsKLQkJCQkJSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIGxjb25uTWdyID0gbG9jYWxTZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQkJCQlJUmVtb3RlQ29ubmVjdGlvbiBsY29ubiA9IGxjb25uTWdyLmdldENvbm5lY3Rpb24obnVsbCk7IC8vIFNpbmNlIGl0J3MgYSBsb2NhbCBzZXJ2aWNlLCBkb2Vzbid0IG1hdHRlciB3aGljaCBwYXJhbWV0ZXIgaXMgcGFzc2VkCi0JCQkJCUlSZW1vdGVGaWxlTWFuYWdlciBsb2NhbEZpbGVNYW5hZ2VyID0gbG9jYWxTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcihsY29ubik7Ci0KLQkJCQkJcmV0dXJuIGxvY2FsRmlsZU1hbmFnZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZW1vdGVGaWxlTWFuYWdlciBnZXRSZW1vdGVGaWxlTWFuYWdlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJtID0gKElSZXNvdXJjZU1hbmFnZXJDb250cm9sKWdldFJlc291cmNlTWFuYWdlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHJtICE9IG51bGwpIHsKLQkJCUlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmYgPSBybS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZiBpbnN0YW5jZW9mIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgewotCQkJCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiByZW1Db25mID0gKEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiljb25mOwotCi0JCQkJSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMocmVtQ29uZi5nZXRSZW1vdGVTZXJ2aWNlc0lkKCkpOwotCQkJCWlmIChyZW1vdGVTZXJ2aWNlcyAhPSBudWxsKSB7Ci0KLQkJCQkJSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIHJjb25uTWdyID0gcmVtb3RlU2VydmljZXMuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKTsKLQkJCQkJSVJlbW90ZUNvbm5lY3Rpb24gcmNvbm4gPSByY29ubk1nci5nZXRDb25uZWN0aW9uKHJlbUNvbmYuZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCQkJCUlSZW1vdGVGaWxlTWFuYWdlciByZW1vdGVGaWxlTWFuYWdlciA9IHJlbW90ZVNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKHJjb25uKTsKLQotCQkJCQlyZXR1cm4gcmVtb3RlRmlsZU1hbmFnZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFtdIGdldEVudmlyb25tZW50VG9BcHBlbmQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXA8Pyw/PiBkZWZhdWx0RW52ID0gbnVsbDsKLQkJTWFwPD8sPz4gY29uZmlnRW52ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSUxhdW5jaE1hbmFnZXIuQVRUUl9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsIGRlZmF1bHRFbnYpOwotCQlpZiAoY29uZmlnRW52ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElMYXVuY2hNYW5hZ2VyLkFUVFJfQVBQRU5EX0VOVklST05NRU5UX1ZBUklBQkxFUywgdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgCi0JCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfUGFyYWxsZWxfbGF1bmNoZXJfZG9lc19ub3Rfc3VwcG9ydCkpOwotCQl9Ci0KLQkJTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oY29uZmlnRW52LnNpemUoKSk7Ci0JCUl0ZXJhdG9yPD8+IGl0ZXI9IGNvbmZpZ0Vudi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRW50cnk8Pyw/PiBlbnRyeSA9IChFbnRyeTw/LCA/PikgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgc3RyaW5ncy5hZGQoa2V5KyI9Iit2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCXJldHVybiBzdHJpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1tzdHJpbmdzLnNpemUoKV0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL0xpbnV4UGF0aC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL0xpbnV4UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTNhOTIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC9MaW51eFBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotcHVibGljIGNsYXNzIExpbnV4UGF0aCB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZnJvbVN0cmluZyhTdHJpbmcgbG9jYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBQYXRoKGxvY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvUFRQTGF1bmNoU2hvcnRjdXQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC9QVFBMYXVuY2hTaG9ydGN1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYzZmViLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC9QVFBMYXVuY2hTaG9ydGN1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaFNob3J0Y3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5QVFBMYXVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFBMYXVuY2hTaG9ydGN1dCBpbXBsZW1lbnRzIElMYXVuY2hTaG9ydGN1dCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTGF1bmNoZXJHcm91cElEID0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwLnJ1biI7Ci0gICAgCi0JLyoqCi0JICogQHNlZSBJTGF1bmNoU2hvcnRjdXQjbGF1bmNoKElFZGl0b3JQYXJ0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElFZGl0b3JQYXJ0IGVkaXRvciwgU3RyaW5nIG1vZGUpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCUlQcm9qZWN0IGVsZW1lbnQgPSAoSVByb2plY3QpIGlucHV0LmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQlsYXVuY2goZWxlbWVudCwgbW9kZSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSUxhdW5jaFNob3J0Y3V0I2xhdW5jaChJU2VsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgbW9kZSkgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJICAgIGxhdW5jaCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCksIG1vZGUpOwotCQl9IAkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGxhdW5jaChPYmplY3QgZWxlbWVudCwgU3RyaW5nIG1vZGUpIHsKLQkgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSkgewotCSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oUFRQTGF1bmNoUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksICJJbmNvcnJlY3QgZmlsZSIsICJQbGVhc2Ugc2VsZWN0IHBhcmFsbGVsIHByb2dyYW0gZmlsZSIpOwotCSAgICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAgICAgICAKLQkgICAgSUZpbGUgZmlsZSA9IChJRmlsZSllbGVtZW50OwotCSAgICAgICAgCi0JICAgIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldElMYXVuY2hDb25maWd1cmUoZmlsZSk7Ci0JICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JICAgIGlmIChjb25maWcgPT0gbnVsbCkKLQkgICAgICAgIHNlbGVjdGlvbiAgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCSAgICBlbHNlIAotCSAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29uZmlnKTsKLQkgICAgICAgIAotCSAgICBJTGF1bmNoR3JvdXAgZ3JvdXAgPSBEZWJ1Z1VJVG9vbHMuZ2V0TGF1bmNoR3JvdXAoY29uZmlnLCBtb2RlKTsKLQkJRGVidWdVSVRvb2xzLm9wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nT25Hcm91cChQVFBEZWJ1Z1VJUGx1Z2luLmdldFNoZWxsKCksIHNlbGVjdGlvbiwgZ3JvdXAuZ2V0SWRlbnRpZmllcigpKTsKLQl9Ci0JCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldElMYXVuY2hDb25maWd1cmUoSUZpbGUgZmlsZSkgewotCSAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBmaWxlLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JICAgIElMYXVuY2hNYW5hZ2VyIGxtID0gZ2V0TGF1bmNoTWFuYWdlcigpOwotCSAgICBJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IGxtLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBUUF9MQVVOQ0hDT05GSUdVUkVUWVBFX0lEKTsKLQkJdHJ5IHsKLQkJICAgIElMYXVuY2hDb25maWd1cmF0aW9uW10gY29uZmlncyA9IGxtLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGNvbmZpZ1R5cGUpOwotCQkgICAgZm9yIChpbnQgaT0wOyBpPGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJICAgICAgICBpZiAoY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsICIiKS5lcXVhbHMocHJvamVjdE5hbWUpKQotCQkgICAgICAgICAgICByZXR1cm4gY29uZmlnc1tpXTsKLQkJICAgIH0KLQkJICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBjb25maWdUeXBlLm5ld0luc3RhbmNlKGZpbGUuZ2V0UHJvamVjdCgpLCBwcm9qZWN0TmFtZSk7CQkgICAgCi0JCSAgICB3Yy5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJICAgIHdjLnNldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FQUExJQ0FUSU9OX05BTUUsIGZpbGUuZ2V0TmFtZSgpKTsKLQkgICAgICAgIC8vd2Muc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLk5FVFdPUktfVFlQRSwgSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVGX05FVFdPUktfVFlQRSk7Ci0KLQkJICAgIHJldHVybiB3Yy5kb1NhdmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXByaXZhdGUgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLQkgICAgcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL1BhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvUGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4OWQyOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvUGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdVSVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmxhdW5jaC5JUExhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuSVBUUERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5QVFBMYXVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUKLWV4dGVuZHMgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLkFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUjZG9Db21wbGV0ZUpvYkxhdW5jaChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0NvbXBsZXRlSm9iTGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBmaW5hbCBJUExhdW5jaCBsYXVuY2gsCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIG1nciwgZmluYWwgSVBEZWJ1Z2dlciBkZWJ1Z2dlciwgZmluYWwgSVBKb2Igam9iKSB7Ci0JCWxhdW5jaC5zZXRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0SWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuZ2V0SWQoKSwgam9iLmdldElEKCkpOwotCQlpZiAobW9kZS5lcXVhbHMoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSkpIHsKLQkJCWxhdW5jaC5zZXRQSm9iKGpvYik7Ci0JCQl0cnkgewotCQkJCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHZlcmlmeVByb2plY3QoY29uZmlndXJhdGlvbik7Ci0JCQkJZmluYWwgSVBhdGggZXhlY1BhdGggPSB2ZXJpZnlFeGVjdXRhYmxlUGF0aChjb25maWd1cmF0aW9uKTsKLQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCJUaGUgam9iIGlzIGNhbmNlbGxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQltb25pdG9yLmJlZ2luVGFzaygiRGVidWdnZXIgaGFzIHN0YXJ0ZWQsIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24uLi4iLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJSVBTZXNzaW9uIHNlc3Npb24gPSBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVidWdNb2RlbCgpLmNyZWF0ZURlYnVnU2Vzc2lvbihkZWJ1Z2dlciwgbGF1bmNoLCBwcm9qZWN0LCBleGVjUGF0aCk7Ci0KLQkJCQkJCQkJCVN0cmluZyBhcHAgPSBqb2IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RXhlY3V0YWJsZU5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJCQkJCQkJCVN0cmluZyBwYXRoID0gam9iLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldEV4ZWN1dGFibGVQYXRoQXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCQkJCQkJCQlTdHJpbmcgY3dkID0gam9iLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFdvcmtpbmdEaXJlY3RvcnlBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJCQkJCQkJCUxpc3Q8U3RyaW5nPiBhcmdzID0gam9iLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFByb2dyYW1Bcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0KLQkJCQkJCQkJCXNlc3Npb24uY29ubmVjdFRvRGVidWdnZXIobW9uaXRvciwgYXBwLCBwYXRoLCBjd2QsIGFyZ3MudG9BcnJheShuZXcgU3RyaW5nW2FyZ3Muc2l6ZSgpXSkpOwotCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKFBUUExhdW5jaFBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVidWcgam9iIGxhdW5jaCBpbnRlcnJ1cHRlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXRlcm1pbmF0ZUpvYihqb2IpOwotCQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCVRocm93YWJsZSB0ID0gZS5nZXRDYXVzZSgpOwotCQkJCQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQkJCQkJbXNnID0gdC5nZXRNZXNzYWdlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgY29tcGxldGluZyBkZWJ1ZyBqb2IgbGF1bmNoOiAiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVBUUExhdW5jaFBsdWdpbi5lcnJvckRpYWxvZygiRXJyb3IgY29tcGxldGluZyBkZWJ1ZyBqb2IgbGF1bmNoIiwgdCk7Ci0JCQkJCQkJUFRQTGF1bmNoUGx1Z2luLmxvZyh0KTsKLQkJCQkJCQl0ZXJtaW5hdGVKb2Ioam9iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyoKLQkJCQkgKiBDb21wbGV0aW9uIG9mIGxhdW5jaCBmYWlscywgdGhlbiB0ZXJtaW5hdGUgdGhlIGpvYiBhbmQgZGlzcGxheSBlcnJvciBtZXNzYWdlLgotCQkJCSAqLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVBUUExhdW5jaFBsdWdpbi5lcnJvckRpYWxvZygiRXJyb3IgY29tcGxldGluZyBsYXVuY2giLCBlLmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCVBUUExhdW5jaFBsdWdpbi5sb2coZSk7Ci0JCQkJdGVybWluYXRlSm9iKGpvYik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQluZXcgUnVudGltZVByb2Nlc3MobGF1bmNoLCBqb2IsIG51bGwpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9DbGVhbnVvTGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0JCQlTdHJpbmcgbW9kZSwgSVBMYXVuY2ggbGF1bmNoLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IsCi0JCQlJUERlYnVnZ2VyIGRlYnVnZ2VyLCBJUEpvYiBqb2IpIHsKLQkJaWYgKGRlYnVnZ2VyICE9IG51bGwpIHsKLQkJCWRlYnVnZ2VyLmNsZWFudXAoY29uZmlndXJhdGlvbiwgYXR0ck1nciwgbGF1bmNoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXJtaW5hdGVKb2IoZmluYWwgSVBKb2Igam9iKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gam9iLmdldFF1ZXVlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQlybS50ZXJtaW5hdGVKb2Ioam9iKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJLy8gSWdub3JlLCBidXQgbG9nCi0JCQlQVFBMYXVuY2hQbHVnaW4ubG9nKGUxKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNsYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCEobGF1bmNoIGluc3RhbmNlb2YgSVBMYXVuY2gpKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5QYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9JbnZhbGlkX2xhdW5jaF9vYmplY3QsIG51bGwsIDApOwotCQl9Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyNTApOwotCQltb25pdG9yLnNldFRhc2tOYW1lKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH0gLiAuIC4iLCBuZXcgT2JqZWN0W10geyAiTGF1bmNoaW5nICIgKyBjb25maWd1cmF0aW9uLmdldE5hbWUoKSB9KSk7IC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlJUERlYnVnZ2VyIGRlYnVnZ2VyID0gbnVsbDsKLQkJSVBKb2Igam9iID0gbnVsbDsKLQotCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCW1vbml0b3Iuc3ViVGFzaygiQ29weWluZyBkYXRhIC4gLiAuIik7Ci0KLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IGdldEF0dHJpYnV0ZU1hbmFnZXIoY29uZmlndXJhdGlvbiwgbW9kZSk7Ci0KLQkJLy8gQWxsIGNvcHkgcHJlLSJqb2Igc3VibWlzc2lvbiIgb2NjdXJzIGhlcmUKLQkJY29weUV4ZWN1dGFibGUoY29uZmlndXJhdGlvbiwgbW9uaXRvcik7Ci0JCWRvUHJlTGF1bmNoU3luY2hyb25pemF0aW9uKGNvbmZpZ3VyYXRpb24sIG1vbml0b3IpOwotCi0JCS8vc3dpdGNoIHBlcnNwZWN0aXZlCi0JCXN3aXRjaFBlcnNwZWN0aXZlKERlYnVnVUlUb29scy5nZXRMYXVuY2hQZXJzcGVjdGl2ZShjb25maWd1cmF0aW9uLmdldFR5cGUoKSwgbW9kZSkpOwotCQl0cnkgewotCQkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpKSB7Ci0JCQkJLy8gc2hvdyBwdHAgZGVidWcgdmlldwotCQkJCXNob3dQVFBEZWJ1Z1ZpZXcoSVBUUERlYnVnVUlDb25zdGFudHMuSURfVklFV19QQVJBTExFTERFQlVHKTsKLQkJCQltb25pdG9yLnN1YlRhc2soIkNvbmZpZ3VyaW5nIGRlYnVnIHNldHRpbmcgLiAuIC4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJLyoKLQkJCQkgKiBDcmVhdGUgdGhlIGRlYnVnZ2VyIGV4dGVuc2lvbiwgdGhlbiB0aGUgY29ubmVjdGlvbiBwb2ludCBmb3IgdGhlIGRlYnVnIHNlcnZlci4KLQkJCQkgKiBUaGUgZGVidWcgc2VydmVyIGlzIGxhdW5jaGVkIHZpYSB0aGUgc3VibWl0Sm9iKCkgY29tbWFuZC4KLQkJCQkgKi8KLQotCQkJCUlQRGVidWdDb25maWd1cmF0aW9uIGRlYnVnQ29uZmlnID0gZ2V0RGVidWdDb25maWcoY29uZmlndXJhdGlvbik7Ci0JCQkJZGVidWdnZXIgPSBkZWJ1Z0NvbmZpZy5nZXREZWJ1Z2dlcigpOwotCQkJCWRlYnVnZ2VyLmluaXRpYWxpemUoY29uZmlndXJhdGlvbiwgYXR0ck1hbmFnZXIsIG1vbml0b3IpOwotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCWRlYnVnZ2VyLmdldExhdW5jaEF0dHJpYnV0ZXMoY29uZmlndXJhdGlvbiwgYXR0ck1hbmFnZXIpOwotCQkJfQotCi0JCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQltb25pdG9yLnN1YlRhc2soIlN1Ym1pdHRpbmcgdGhlIGpvYiAuIC4gLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN1Ym1pdEpvYihjb25maWd1cmF0aW9uLCBtb2RlLCAoSVBMYXVuY2gpbGF1bmNoLCBhdHRyTWFuYWdlciwgZGVidWdnZXIsIG1vbml0b3IpOwotCi0JCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpKSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlYnVnTW9kZWwoKS5zaHV0ZG93blNlc3Npb24oam9iKTsKLQkJCX0KLQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBJU3RhdHVzLkNBTkNFTCkKLQkJCQl0aHJvdyBlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG93IHRoZSBQVFAgRGVidWcgdmlldwotCSAqCi0JICogQHBhcmFtIHZpZXdJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQVFBEZWJ1Z1ZpZXcoZmluYWwgU3RyaW5nIHZpZXdJRCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQl9Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUFRQTGF1bmNoUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBhZ2Uuc2hvd1ZpZXcodmlld0lELCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX0NSRUFURSk7Ci0JCQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkge30KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBVc2VkIHRvIGZvcmNlIHN3aXRjaGluZyB0byB0aGUgUFRQIERlYnVnIHBlcnNwZWN0aXZlCi0JICoKLQkgKiBAcGFyYW0gcGVyc3BlY3RpdmVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN3aXRjaFBlcnNwZWN0aXZlKGZpbmFsIFN0cmluZyBwZXJzcGVjdGl2ZUlEKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQVFBMYXVuY2hQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKS5nZXRJZCgpLmVxdWFscyhwZXJzcGVjdGl2ZUlEKSkKLQkJCQkJCQkJcmV0dXJuOwotCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJd2luZG93LmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZUlELCB3aW5kb3cpOwotCQkJCQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7IH0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL1J1bnRpbWVQcm9jZXNzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvUnVudGltZVByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyYTRmMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvUnVudGltZVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Kb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubGF1bmNoLklQTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZVByb2Nlc3MgaW1wbGVtZW50cyBJUHJvY2VzcywgSUpvYkxpc3RlbmVyIHsKLQlwcml2YXRlIElQTGF1bmNoIGxhdW5jaCA9IG51bGw7Ci0JcHJpdmF0ZSBJUEpvYiBqb2IgPSBudWxsOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBmQXR0cmlidXRlczsKLQlwcml2YXRlIGludCBmRXhpdFZhbHVlID0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZUZXJtaW5hdGVkID0gZmFsc2U7Ci0JCi0JcHVibGljIFJ1bnRpbWVQcm9jZXNzKElQTGF1bmNoIGxhdW5jaCwgSVBKb2Igam9iLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMpIHsKLQkJdGhpcy5sYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMuam9iID0gam9iOwkKLQkJam9iLmFkZEVsZW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJaW5pdGlhbGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCWZUZXJtaW5hdGVkID0gam9iLmlzVGVybWluYXRlZCgpOwotCQlsYXVuY2guYWRkUHJvY2Vzcyh0aGlzKTsKLQkJZmlyZUNyZWF0aW9uRXZlbnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlcykgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGtleXMgPSBhdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHQoKTsKLQkJCQlzZXRBdHRyaWJ1dGUoa2V5LCAoU3RyaW5nKWF0dHJpYnV0ZXMuZ2V0KGtleSkpOwotCQkJfQkKLQkJfQotCX0JCi0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElQcm9jZXNzIGludGVyZmFjZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gam9iLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQlyZXR1cm4gbGF1bmNoOwotCX0KLQkKLQlwdWJsaWMgSVN0cmVhbXNQcm94eSBnZXRTdHJlYW1zUHJveHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPig1KTsKLQkJfQotCQlPYmplY3Qgb3JpZ1ZhbCA9IGZBdHRyaWJ1dGVzLmdldChrZXkpOwotCQlpZiAob3JpZ1ZhbCAhPSBudWxsICYmIG9yaWdWYWwuZXF1YWxzKHZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZBdHRyaWJ1dGVzLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGtleSkgewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIGZBdHRyaWJ1dGVzLmdldChrZXkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1Rlcm1pbmF0ZWQoKSkgewotCQkJcmV0dXJuIGZFeGl0VmFsdWU7Ci0JCX0KLQkJdGhyb3cgbmV3IERlYnVnRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIkV4aXQgdmFsdWUgbm90IGF2YWlsYWJsZSIsIG51bGwpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVybWluYXRlZCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlmVGVybWluYXRlZCA9IHRydWU7Ci0JCX0KLQkJZkV4aXRWYWx1ZSA9IDA7Ci0JCWpvYi5yZW1vdmVFbGVtZW50TGlzdGVuZXIodGhpcyk7Ci0JCWZpcmVUZXJtaW5hdGVFdmVudCgpOwotCX0JCi0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElUZXJtaW5hdGUgaW50ZXJmYWNlCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjYW5UZXJtaW5hdGUoKSB7Ci0JCXJldHVybiAhZlRlcm1pbmF0ZWQ7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKSB7Ci0JCXJldHVybiBmVGVybWluYXRlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVybWluYXRlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1Rlcm1pbmF0ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gam9iLmdldFF1ZXVlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJcm0udGVybWluYXRlSm9iKGpvYik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24oZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIEFkYXB0ZXIgaW50ZXJmYWNlCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUHJvY2Vzcy5jbGFzcykpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJTGF1bmNoLmNsYXNzKSkgewotCQkJcmV0dXJuIGdldExhdW5jaCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSUpvYkxpc3RlbmVyIGludGVyZmFjZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElKb2JDaGFuZ2VFdmVudCBlKSB7Ci0JCUVudW1lcmF0ZWRBdHRyaWJ1dGU8Sm9iQXR0cmlidXRlcy5TdGF0ZT4gYXR0ciA9IGUuZ2V0QXR0cmlidXRlcygpLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJSm9iQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmIChzdGF0ZSA9PSBTdGF0ZS5URVJNSU5BVEVEIHx8IHN0YXRlID09IFN0YXRlLkVSUk9SKSB7Ci0JCQkJdGVybWluYXRlZCgpOwotCQkJfQotCQl9IAotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogRGVidWcgRXZlbnQKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNyZWF0aW9uRXZlbnQoKSB7Ci0JCWZpcmVFdmVudChuZXcgRGVidWdFdmVudCh0aGlzLCBEZWJ1Z0V2ZW50LkNSRUFURSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoRGVidWdFdmVudCBldmVudCkgewotCQlEZWJ1Z1BsdWdpbiBtYW5hZ2VyPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuZmlyZURlYnVnRXZlbnRTZXQobmV3IERlYnVnRXZlbnRbXXtldmVudH0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpcmVUZXJtaW5hdGVFdmVudCgpIHsKLQkJZmlyZUV2ZW50KG5ldyBEZWJ1Z0V2ZW50KHRoaXMsIERlYnVnRXZlbnQuVEVSTUlOQVRFKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL3VpL0Fic3RyYWN0RGVidWdnZXJUYWIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9BYnN0cmFjdERlYnVnZ2VyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZGE2MWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL2ludGVybmFsL3VpL0Fic3RyYWN0RGVidWdnZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBRTlggU29mdHdhcmUgU3lzdGVtcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5QVFBMYXVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLkxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWJ1Z2dlclRhYiBleHRlbmRzIExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGZXb3JraW5nQ29weTsKLQlwcm90ZWN0ZWQgSVBEZWJ1Z0NvbmZpZ3VyYXRpb24gZkN1cnJlbnREZWJ1Z0NvbmZpZzsKLQotCS8vIER5bmFtaWMgRGVidWdnZXIgVUkgd2lkZ2V0cwotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBmRHluYW1pY1RhYjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZEeW5hbWljVGFiSG9sZGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSW5pdERlZmF1bHRzOwotCXByaXZhdGUgQ29tYm8gZkRDb21ibzsKLQlwcml2YXRlIGJvb2xlYW4gZklzSW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZQYWdlVXBkYXRlZDsKLQotCXByb3RlY3RlZCB2b2lkIHNldERlYnVnQ29uZmlnKElQRGVidWdDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlmQ3VycmVudERlYnVnQ29uZmlnID0gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCBJUERlYnVnQ29uZmlndXJhdGlvbiBnZXREZWJ1Z0NvbmZpZygpIHsKLQkJcmV0dXJuIGZDdXJyZW50RGVidWdDb25maWc7Ci0JfQotCi0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uVGFiIGdldER5bmFtaWNUYWIoKSB7Ci0JCXJldHVybiBmRHluYW1pY1RhYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREeW5hbWljVGFiKElMYXVuY2hDb25maWd1cmF0aW9uVGFiIHRhYikgewotCQlmRHluYW1pY1RhYiA9IHRhYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdldER5bmFtaWNUYWJIb2xkZXIoKSB7Ci0JCXJldHVybiBmRHluYW1pY1RhYkhvbGRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREeW5hbWljVGFiSG9sZGVyKENvbXBvc2l0ZSB0YWJIb2xkZXIpIHsKLQkJZkR5bmFtaWNUYWJIb2xkZXIgPSB0YWJIb2xkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gZldvcmtpbmdDb3B5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlndXJhdGlvbikgewotCQlzdXBlci5zZXRMYXVuY2hDb25maWd1cmF0aW9uKGxhdW5jaENvbmZpZ3VyYXRpb24pOwotCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHkpIHsKLQkJZldvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBoZXJlIHNvIHRoYXQgYW55IGVycm9yIG1lc3NhZ2UgaW4gdGhlIGR5bmFtaWMgVUkgZ2V0cwotCSAqIHJldHVybmVkLgotCSAqIAotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgdGFiID0gZ2V0RHluYW1pY1RhYigpOwotCQlpZiAoIChzdXBlci5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB8fCAodGFiID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYi5nZXRFcnJvck1lc3NhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBzZWxlY3Rpb24gb2YgdGhlIERlYnVnZ2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlYnVnZ2VyQ2hhbmdlZCgpIHsKLQkJbG9hZER5bmFtaWNEZWJ1Z0FyZWEoKTsKLQotCQkvLyBhbHdheXMgc2V0IHRoZSBuZXdseSBjcmVhdGVkIGFyZWEgd2l0aCBkZWZhdWx0cwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCk7Ci0JCWlmIChnZXREeW5hbWljVGFiKCkgPT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGFueSBkZWJ1ZyBzcGVjZmljIGFyZ3MgZnJvbSB0aGUgY29uZmlnCi0JCQlpZiAod2MgPT0gbnVsbCkgewotCQkJCWlmIChnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkuaXNXb3JraW5nQ29weSgpKSB7Ci0JCQkJCXdjID0gKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh3YyAhPSBudWxsKSB7Ci0JCQkJd2Muc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfU1BFQ0lGSUNfQVRUUlNfTUFQLCAoTWFwKW51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHdjID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLmlzV29ya2luZ0NvcHkoKSkgewotCQkJCQkJc2V0TGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KWdldExhdW5jaENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLmdldFdvcmtpbmdDb3B5KCkpOwotCQkJCQl9Ci0JCQkJCXdjID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaW5pdERlZmF1bHRzKCkpIHsKLQkJCQlnZXREeW5hbWljVGFiKCkuc2V0RGVmYXVsdHMod2MpOwotCQkJfQotCQkJc2V0SW5pdGlhbGl6ZURlZmF1bHQoZmFsc2UpOwotCQkJZ2V0RHluYW1pY1RhYigpLmluaXRpYWxpemVGcm9tKHdjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNob3cgdGhlIGNvbnRyaWJ1dGVkIHBpZWNlIG9mIFVJIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoZSBkZWJ1Z2dlciBpZAotCSAqIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGVidWdnZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZER5bmFtaWNEZWJ1Z0FyZWEoKSB7Ci0JCS8vIERpc3Bvc2Ugb2YgYW55IGN1cnJlbnQgY2hpbGQgd2lkZ2V0cyBpbiB0aGUgdGFiIGhvbGRlciBhcmVhCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGdldER5bmFtaWNUYWJIb2xkZXIoKS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBSZXRyaWV2ZSB0aGUgZHluYW1pYyBVSSBmb3IgdGhlIGN1cnJlbnQgRGVidWdnZXIKLQkJSVBEZWJ1Z0NvbmZpZ3VyYXRpb24gZGVidWdDb25maWcgPSBnZXRDb25maWdGb3JDdXJyZW50RGVidWdnZXIoKTsKLQkJaWYgKGRlYnVnQ29uZmlnID09IG51bGwpIHsKLQkJCXNldER5bmFtaWNUYWIobnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYiB0YWIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl0YWIgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWJ1Z2dlclBhZ2UoZGVidWdDb25maWcuZ2V0SUQoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBMYXVuY2hQbHVnaW4uZXJyb3JEaWFsb2coTWVzc2FnZXMuQWJzdHJhY3REZWJ1Z2dlclRhYl9FcnJvckxvYWRpbmdEZWJ1Z2dlclBhZ2UsIGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQkJc2V0RHluYW1pY1RhYih0YWIpOwotCQl9Ci0JCXNldERlYnVnQ29uZmlnKGRlYnVnQ29uZmlnKTsKLQkJaWYgKGdldER5bmFtaWNUYWIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gQXNrIHRoZSBkeW5hbWljIFVJIHRvIGNyZWF0ZSBpdHMgQ29udHJvbAotCQlnZXREeW5hbWljVGFiKCkuc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhnZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCkpOwotCQlnZXREeW5hbWljVGFiKCkuY3JlYXRlQ29udHJvbChnZXREeW5hbWljVGFiSG9sZGVyKCkpOwotCQlnZXREeW5hbWljVGFiKCkuZ2V0Q29udHJvbCgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCWdldER5bmFtaWNUYWJIb2xkZXIoKS5sYXlvdXQodHJ1ZSk7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlZChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KSB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiIGR5bmFtaWNUYWIgPSBnZXREeW5hbWljVGFiKCk7Ci0JCWlmIChkeW5hbWljVGFiICE9IG51bGwpIHsKLQkJCWR5bmFtaWNUYWIuYWN0aXZhdGVkKHdvcmtpbmdDb3B5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiIGR5bmFtaWNUYWIgPSBnZXREeW5hbWljVGFiKCk7Ci0JCWlmIChkeW5hbWljVGFiICE9IG51bGwpIHsKLQkJCWR5bmFtaWNUYWIuaW5pdGlhbGl6ZUZyb20oY29uZmlnKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotCQlpZiAoZ2V0RGVidWdDb25maWcoKSAhPSBudWxsKSB7Ci0JCQljb25maWcuc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfSUQsIGdldERlYnVnQ29uZmlnKCkuZ2V0SUQoKSk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYiBkeW5hbWljVGFiID0gZ2V0RHluYW1pY1RhYigpOwotCQkJaWYgKGR5bmFtaWNUYWIgPT0gbnVsbCkgewotCQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9TUEVDSUZJQ19BVFRSU19NQVAsIChNYXApbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCWR5bmFtaWNUYWIucGVyZm9ybUFwcGx5KGNvbmZpZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoY29uZmlnKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZHluYW1pY1RhYiA9IGdldER5bmFtaWNUYWIoKTsKLQkJaWYgKGR5bmFtaWNUYWIgIT0gbnVsbCkgewotCQkJZHluYW1pY1RhYi5zZXREZWZhdWx0cyhjb25maWcpOwotCQkJc2V0SW5pdGlhbGl6ZURlZmF1bHQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlpZiAoZ2V0RGVidWdDb25maWcoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuQWJzdHJhY3REZWJ1Z2dlclRhYl9Ob19kZWJ1Z2dlcl9hdmFpbGFibGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZHluYW1pY1RhYiA9IGdldER5bmFtaWNUYWIoKTsKLQkJaWYgKGR5bmFtaWNUYWIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGR5bmFtaWNUYWIuaXNWYWxpZChjb25maWcpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblNhdmUoKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJaWYgKGdldERlYnVnQ29uZmlnKCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkFic3RyYWN0RGVidWdnZXJUYWJfTm9fZGVidWdnZXJfYXZhaWxhYmxlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiIGR5bmFtaWNUYWIgPSBnZXREeW5hbWljVGFiKCk7Ci0JCWlmIChkeW5hbWljVGFiICE9IG51bGwpIHsKLQkJCXJldHVybiBkeW5hbWljVGFiLmNhblNhdmUoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5pdGlhbGl6ZURlZmF1bHQoYm9vbGVhbiBpbml0KSB7Ci0JCWZJbml0RGVmYXVsdHMgPSBpbml0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGluaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIGZJbml0RGVmYXVsdHM7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gTGF1bmNoSW1hZ2VzLmdldEltYWdlKExhdW5jaEltYWdlcy5JTUdfREVCVUdHRVJfVEFCKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5BYnN0cmFjdERlYnVnZ2VyVGFiX0RlYnVnZ2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlYnVnZ2VyQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHNwYW4pIHsKLQkJQ29tcG9zaXRlIGNvbWJvQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQljb21ib0NvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sc3BhbjsKLQkJY29tYm9Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlMYWJlbCBkbGFiZWwgPSBuZXcgTGFiZWwoY29tYm9Db21wLCBTV1QuTk9ORSk7Ci0JCWRsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkxhdW5jaF9jb21tb25fRGVidWdnZXJDb2xvbik7Ci0JCWZEQ29tYm8gPSBuZXcgQ29tYm8oY29tYm9Db21wLCBTV1QuUkVBRF9PTkxZIHwgU1dULkRST1BfRE9XTik7Ci0JCWZEQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZEQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc0luaXRpYWxpemluZygpKSB7Ci0JCQkJCXNldEluaXRpYWxpemVEZWZhdWx0KHRydWUpOwotCQkJCQl1cGRhdGVDb21ib0Zyb21TZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREZWJ1Z2dlckNvbWJvKElQRGVidWdDb25maWd1cmF0aW9uW10gZGVidWdDb25maWdzLCBTdHJpbmcgY3VycmVudCkgewotCQlmRENvbWJvLnJlbW92ZUFsbCgpOwotCQlpbnQgc2VsZWN0ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVidWdDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmRENvbWJvLmFkZChkZWJ1Z0NvbmZpZ3NbaV0uZ2V0TmFtZSgpKTsKLQkJCWZEQ29tYm8uc2V0RGF0YShJbnRlZ2VyLnRvU3RyaW5nKGkpLCBkZWJ1Z0NvbmZpZ3NbaV0pOwotCQkJaWYgKGRlYnVnQ29uZmlnc1tpXS5nZXRJRCgpLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudCkpIHsKLQkJCQlzZWxlY3QgPSBpOwotCQkJfQotCQl9Ci0KLQkJZlBhZ2VVcGRhdGVkID0gZmFsc2U7Ci0JCWlmIChzZWxlY3QgIT0gLTEpIHsKLQkJCWZEQ29tYm8uc2VsZWN0KHNlbGVjdCk7Ci0JCX0KLQkJLy9UaGUgYmVoYXZpb3VyIGlzIHVuZGVmaW5lZCBmb3IgaWYgdGhlIGNhbGxiYWNrcyBzaG91bGQgYmUgdHJpZ2dlcmVkIGZvciB0aGlzLCBzbyBmb3JjZSBwYWdlIHVwZGF0ZSBpZiBuZWVkZWQuCi0JCWlmICghZlBhZ2VVcGRhdGVkKSB7Ci0JCQl1cGRhdGVDb21ib0Zyb21TZWxlY3Rpb24oKTsKLQkJfQotCQlmUGFnZVVwZGF0ZWQgPSBmYWxzZTsKLQkJZ2V0Q29udHJvbCgpLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWJ1Z2dlckdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2xzcGFuKSB7Ci0JCUdyb3VwIGRlYnVnZ2VyR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JCWRlYnVnZ2VyR3JvdXAuc2V0VGV4dChNZXNzYWdlcy5EZWJ1Z2dlclRhYl9EZWJ1Z2dlcl9PcHRpb25zKTsKLQkJc2V0RHluYW1pY1RhYkhvbGRlcihkZWJ1Z2dlckdyb3VwKTsKLQkJR3JpZExheW91dCB0YWJIb2xkZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0YWJIb2xkZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJdGFiSG9sZGVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdGFiSG9sZGVyTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlnZXREeW5hbWljVGFiSG9sZGVyKCkuc2V0TGF5b3V0KHRhYkhvbGRlckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sc3BhbjsKLQkJZ2V0RHluYW1pY1RhYkhvbGRlcigpLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbWJvRnJvbVNlbGVjdGlvbigpIHsKLQkJZlBhZ2VVcGRhdGVkID0gdHJ1ZTsKLQkJaGFuZGxlRGVidWdnZXJDaGFuZ2VkKCk7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaXRpYWxpemluZygpIHsKLQkJcmV0dXJuIGZJc0luaXRpYWxpemluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsaXppbmcoYm9vbGVhbiBpc0luaXRpYWxpemluZykgewotCQlmSXNJbml0aWFsaXppbmcgPSBpc0luaXRpYWxpemluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjwvY29kZT4KLQkgKiB0aGF0IGlzIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZGVidWdnZXIgaWQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotCSAqIGRlYnVnZ2VyLgotCSAqLwotCXByb3RlY3RlZCBJUERlYnVnQ29uZmlndXJhdGlvbiBnZXRDb25maWdGb3JDdXJyZW50RGVidWdnZXIoKSB7Ci0JCWludCBzZWxlY3RlZEluZGV4ID0gZkRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlyZXR1cm4gKElQRGVidWdDb25maWd1cmF0aW9uKWZEQ29tYm8uZ2V0RGF0YShJbnRlZ2VyLnRvU3RyaW5nKHNlbGVjdGVkSW5kZXgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9MYXVuY2hJbWFnZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9MYXVuY2hJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxYWU5YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvdWkvTGF1bmNoSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5QVFBMYXVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoSW1hZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUkVGSVggPSAib3JnLmVjbGlwc2UucHRwLmxhdW5jaC4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTUVfUFJFRklYX0xFTkdUSCA9IE5BTUVfUFJFRklYLmxlbmd0aCgpOwotICAgIAotCXByaXZhdGUgc3RhdGljIFVSTCBpY29uQmFzZVVSTCA9IG51bGw7Ci0JCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJaWNvbkJhc2VVUkwgPSBQVFBMYXVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGhTdWZmaXgpOwotCX0KLQkKLQkvLyBUaGUgcGx1Z2luIHJlZ2lzdHJ5Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZyxJbWFnZURlc2NyaXB0b3I+IGF2b2lkU1dURXJyb3JNYXAgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBUkFMTEVMX1RBQiA9IE5BTUVfUFJFRklYICsgInBhcmFsbGVsX3RhYi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FSR1VNRU5UU19UQUIgPSBOQU1FX1BSRUZJWCArICJhcmd1bWVudHNfdGFiLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTUFJTl9UQUIgPSBOQU1FX1BSRUZJWCArICJtYWluX3RhYi5naWYiOyAvLyROT04tTkxTLTEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdHRVJfVEFCID0gTkFNRV9QUkVGSVggKyAiZGVidWdnZXJfdGFiLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1BBUkFMTEVMX1RBQiA9IGNyZWF0ZU1hbmFnZWQoSU1HX1BBUkFMTEVMX1RBQik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BUkdVTUVOVFNfVEFCID0gY3JlYXRlTWFuYWdlZChJTUdfQVJHVU1FTlRTX1RBQik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19NQUlOX1RBQiA9IGNyZWF0ZU1hbmFnZWQoSU1HX01BSU5fVEFCKTsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ERUJVR0dFUl9UQUIgPSBjcmVhdGVNYW5hZ2VkKElNR19ERUJVR0dFUl9UQUIpOwkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBtYW5hZ2VkIHVuZGVyIHRoZSBnaXZlbiBrZXkgaW4gdGhpcyByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBpbWFnZSdzIGtleQotCSAqIEByZXR1cm4gdGhlIGltYWdlIG1hbmFnZWQgdW5kZXIgdGhlIGdpdmVuIGtleQotCSAqLyAKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQl9Ci0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQkJZm9yIChTdHJpbmcga2V5IDogYXZvaWRTV1RFcnJvck1hcC5rZXlTZXQoKSkgewotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgKEltYWdlRGVzY3JpcHRvcikgYXZvaWRTV1RFcnJvck1hcC5nZXQoa2V5KSk7Ci0JCQl9Ci0JCQlhdm9pZFNXVEVycm9yTWFwID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZU1hbmFnZWQoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciByZXN1bHQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwobmFtZS5zdWJzdHJpbmcoTkFNRV9QUkVGSVhfTEVOR1RIKSkpOwotCQkJaWYgKGF2b2lkU1dURXJyb3JNYXAgPT0gbnVsbCkgewotCQkJCWF2b2lkU1dURXJyb3JNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW1hZ2VEZXNjcmlwdG9yPigpOyAKLQkJCX0KLQkJCWF2b2lkU1dURXJyb3JNYXAucHV0KG5hbWUsIHJlc3VsdCk7Ci0JCQlpZiAoaW1hZ2VSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbCBFcnJvcjogSW1hZ2UgcmVnaXN0cnkgYWxyZWFkeSBkZWZpbmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBVUkwgbWFrZUljb25GaWxlVVJMKFN0cmluZyBuYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJaWYgKGljb25CYXNlVVJMID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCk7Ci0JCQkKLQkJcmV0dXJuIG5ldyBVUkwoaWNvbkJhc2VVUkwsIG5hbWUpOwotCX0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvdWkvTGF1bmNoVXRpbHMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9MYXVuY2hVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTgzNTY2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9MYXVuY2hVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5QVFBMYXVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhcmFsbGVsUHJvY2Vzc2VzVmlld19JRCA9ICJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MucGFyYWxsZWxQcm9jZXNzZXNWaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUGVyc3BlY3RpdmVGYWN0b3J5X0lEID0gIm9yZy5lY2xpcHNlLnB0cC51aS5QUnVuUGVyc3BlY3RpdmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhcmFsbGVsUHJvY2Vzc1ZpZXdlcl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MucGFyYWxsZWxQcm9jZXNzVmlld2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYXJhbGxlbE5vZGVTdGF0dXNWaWV3X0lEID0gIm9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5wYXJhbGxlbE5vZGVTdGF0dXNWaWV3IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYXJhbGxlbEpvYnNWaWV3X0lEID0gIm9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5wYXJhbGxlbEpvYnNWaWV3IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYXJhbGxlbFByb2Nlc3NTdGF0dXNWaWV3X0lEID0gIm9yZy5lY2xpaXBzZS5wdGQudWkudmlld3MucGFyYWxsZWxQcm9jZXNzU3RhdHVzVmlldyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFRQX0FDVElPTl9TRVQgPSAib3JnLmVjbGlwc2UucHRwLmFjdGlvblNldHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBUUF9TRUFSQ0hQQUdFX0lEID0gIm9yZy5lY2xpcHNlLnB0cC51aS5QU2VhcmNoUGFnZSI7ICAgICAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTWU5DID0gMTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzaG93RGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBpbnQgc3R5bGUpIHsKLSAgICAgICAgTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgc3R5bGUpOwotICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgZGlhbG9nLnNldFRleHQodGl0bGUpOwotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzaG93RGlhbG9nQXN5bmMoZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGludCBzdHlsZSkgewotICAgICAgICBzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBzaG93RGlhbG9nKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1dhcm5pbmdEaWFsb2coZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGludCBmbGFnKSB7Ci0gICAgICAgIGlmIChmbGFnID09IE5PUk1BTCkKLSAgICAgICAgICAgIHNob3dEaWFsb2coc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hvd0RpYWxvZ0FzeW5jKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3dJbmZvcm1hdGlvbkRpYWxvZyhmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgaW50IGZsYWcpIHsKLSAgICAgICAgaWYgKGZsYWcgPT0gTk9STUFMKQotICAgICAgICAgICAgc2hvd0RpYWxvZyhzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hvd0RpYWxvZ0FzeW5jKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuT0spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RXJyb3JEaWFsb2coZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGludCBmbGFnKSB7Ci0gICAgICAgIGlmIChmbGFnID09IE5PUk1BTCkKLSAgICAgICAgICAgIHNob3dEaWFsb2coc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5PSyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNob3dEaWFsb2dBc3luYyhzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIFNXVC5JQ09OX0VSUk9SIHwgU1dULk9LKTsKLSAgICB9Ci0KLSAgICAvLyBJU3RhdHVzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBDb3JlRXhjZXB0aW9uIGUuZ2V0U3RhdHVzKCkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd0RldGFpbEVycm9yRGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd0Vycm9yRGlhbG9nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93UXVlc3Rpb25EaWFsb2coZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VmlldyhmaW5hbCBTdHJpbmcgdmlld0lEKSB7Ci0gICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZpZXcodmlld0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNob3cgVmlldyBlcnI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN3aXRjaFBlcnNwZWN0aXZlVG8oZmluYWwgU3RyaW5nIHBlcnNwZWN0aXZlSUQpIHsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2UuZ2V0UGVyc3BlY3RpdmUoKS5nZXRJZCgpLmVxdWFscyhwZXJzcGVjdGl2ZUlEKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2ggYmVuY2ggPSBQVFBMYXVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlbmNoLnNob3dQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZUlELCBQVFBMYXVuY2hQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dFcnJvckRpYWxvZygiRGlzcGxheSBFcnJvciIsICJDYW5ub3Qgc3dpdGNoIFBlcnNwZWN0aXZlIHRvOiAiICsgcGVyc3BlY3RpdmVJRCwgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBQVFBMYXVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheVZpZXcoU3RyaW5nIHZpZXdJRCkgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhZ2Uuc2hvd1ZpZXcodmlld0lEKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc2hvd0Vycm9yRGlhbG9nKCJEaXNwbGF5IEVycm9yIiwgIkNhbm5vdCBzaG93IFZpZXcgSUQ6ICIgKyB2aWV3SUQsIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZmluZFZpZXcoU3RyaW5nIHZpZXdJRCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICByZXR1cm4gcGFnZS5maW5kVmlldyh2aWV3SUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZVZpZXcoU3RyaW5nIHZpZXdJRCkgewotICAgICAgICBJVmlld1BhcnQgdmlld1BhcnQgPSBmaW5kVmlldyh2aWV3SUQpOwotICAgICAgICBpZiAodmlld1BhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdmlld1BhcnQuZGlzcG9zZSgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvaW50ZXJuYWwvdWkvUGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9QYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZlOWFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9pbnRlcm5hbC91aS9QYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5Db21tb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLlNvdXJjZUxvb2t1cFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLkFwcGxpY2F0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuQXJndW1lbnRzVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuRGVidWdnZXJUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5FbmhhbmNlZFN5bmNocm9uaXplVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuRW52aXJvbm1lbnRUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5SZXNvdXJjZXNUYWI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIHsKLQlwdWJsaWMgdm9pZCBjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZywgU3RyaW5nIG1vZGUpIHsKLSAgICAJCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiIHRhYnNbXSA9IHsKLSAgICAgICAgCQluZXcgUmVzb3VyY2VzVGFiKCksCi0gICAgICAgIAkJbmV3IEFwcGxpY2F0aW9uVGFiKCksIAotICAgICAgICAJCW5ldyBFbmhhbmNlZFN5bmNocm9uaXplVGFiKCksCi0gICAgICAgIAkJbmV3IERlYnVnZ2VyVGFiKGZhbHNlKSwKLSAgICAgICAgCQluZXcgQXJndW1lbnRzVGFiKCksCi0gICAgICAgIAkJbmV3IFNvdXJjZUxvb2t1cFRhYigpLAotICAgICAgICAJCW5ldyBFbnZpcm9ubWVudFRhYigpLCAKLSAgICAgICAgCQluZXcgQ29tbW9uVGFiKCkgfTsKLSAgICAJCXNldFRhYnModGFicyk7Ci0JfSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvbWVzc2FnZXMvTWVzc2FnZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzdmYThkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vblRhYl9jb21tb25fRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbl9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFiX2NvbW1vbl9Ccm93c2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJfY29tbW9uX0Jyb3dzZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaF9jb21tb25fRGVidWdnZXJDb2xvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hfY29tbW9uX0Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25UYWJfTWFpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9STV9TZWxlY3Rpb25fTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25UYWJfUHJvamVjdF9MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9BcHBsaWNhdGlvbl9MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9Ob19SZXNvdXJjZV9NYW5hZ2VyX0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9Qcm9qZWN0X1NlbGVjdGlvbl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9Qcm9qZWN0X1NlbGVjdGlvbl9NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGxpY2F0aW9uVGFiX1Byb2plY3RfcmVxdWlyZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25UYWJfRW50ZXJfcHJvamVjdF9iZWZvcmVfYnJvd3NpbmdfZm9yX3Byb2dyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25UYWJfUHJvZ3JhbV9zZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25UYWJfQ2hvb3NlX3Byb2dyYW1fdG9fcnVuX2Zyb21fTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9TZWxlY3Rpb25fbXVzdF9iZV9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGxpY2F0aW9uVGFiX0lsbGVnYWxfcHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9Qcm9qZWN0X25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9Qcm9qZWN0X2lzX2Nsb3NlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvblRhYl9BcHBsaWNhdGlvbl9wcm9ncmFtX25vdF9zcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25UYWJfQ29uc29sZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlc1RhYl9SZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VzVGFiX0xhdW5jaF9BdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlc1RhYl9Ob19SZXNvdXJjZV9NYW5hZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlc1RhYl9Ob19MYXVuY2hfQ29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyZ3VtZW50c1RhYl9Bcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJndW1lbnRzVGFiX1BhcmFsbGVsX1Byb2dyYW1fQXJndW1lbnRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REZWJ1Z2dlclRhYl9Ob19kZWJ1Z2dlcl9hdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REZWJ1Z2dlclRhYl9EZWJ1Z2dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERlYnVnZ2VyVGFiX0Vycm9yTG9hZGluZ0RlYnVnZ2VyUGFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlYnVnZ2VyVGFiX1N0b3BfYXRfbWFpbl9vbl9zdGFydHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlYnVnZ2VyVGFiX0RlYnVnZ2VyX09wdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVidWdnZXJUYWJfTW9kZV9ub3Rfc3VwcG9ydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlYnVnZ2VyVGFiX05vX2RlYnVnZ2VyX2F2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19Xb3JraW5nX2RpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfV29ya2luZ19kaXJlY3RvcnlfY29sb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ0RpcmVjdG9yeUJsb2NrX1VzZV9kZWZhdWx0X3dvcmtpbmdfZGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19Mb2NhbF9kaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dvcmtzcGFjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfU2VsZWN0X3dvcmtzcGFjZV9yZWxhdGl2ZV93b3JraW5nX2RpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfU2VsZWN0X3dvcmtpbmdfZGlyZWN0b3J5X2Zvcl9sYXVuY2hfY29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfV29ya2luZ19kaXJlY3RvcnlfZG9lc19ub3RfZXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dvcmtpbmdfZGlyZWN0b3J5X2lzX25vdF9hX2RpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfUHJvamVjdF9vcl9mb2xkZXJfZG9lc19ub3RfZXhpc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9JbnZhbGlkX2xhdW5jaF9vYmplY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1Byb2plY3Rfbm90X3NwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1Byb2plY3RfZG9lc19ub3RfZXhpc3Rfb3JfaXNfbm90X2FfcHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0FwcGxpY2F0aW9uX2ZpbGVfbm90X3NwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0FwcGxpY2F0aW9uX2ZpbGVfZG9lc19ub3RfZXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Xb3JraW5nX2RpcmVjdG9yeV9kb2VzX25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1BhdGhfbm90X2ZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfTm9fUmVzb3VyY2VNYW5hZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfRGVidWdnZXJfcGF0aF9ub3RfZm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9ncmFtX2lzX25vdF9hX3JlY29uZ25pemVkX2V4ZWN1dGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Mb2NhbF9yZXNvdXJjZV9kb2VzX25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0NvdWxkX25vdF9yZXRyaWV2ZV9sb2NhbF9yZXNvdXJjZV9pbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfUmVtb3RlX3Jlc291cmNlX2RvZXNfbm90X2V4aXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfQ291bGRfbm90X3JldHJpZXZlX3JlbW90ZV9yZXNvdXJjZV9pbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfRXJyb3JfY29udmVydGluZ19ydWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1BhcmFsbGVsX2xhdW5jaGVyX2RvZXNfbm90X3N1cHBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9VbnN1cHBvcnRlZF9yZXNvdXJjZV9tYW5hZ2VyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Vbmtub3duX3JlbW90ZV9zZXJ2aWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0Vycm9yX2ZldGNoaW5nX3Jlc291cmNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaGVyRXhlY3V0aW9uVGFiX0FyZ3VtZW50c0ZyYW1lX0NvbW1hbmRMaW5lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfQXJndW1lbnRzRnJhbWVfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9CYXNoQ29tbWFuZHNBZnRlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfQmFzaENvbW1hbmRzQmVmb3JlTEFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9PYnNlcnZlckNvbWJvX0RlZmF1bHROb25lT3B0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfUGFyc2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlckV4ZWN1dGlvblRhYl9UYWJfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfVmFsaWRhdGlvbl9PYnNlcnZlckFuZE5vQ29uc29sZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0FkZEZpbGVEaWFsb2dfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfRmlsZVN5c3RlbUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9Xb3Jrc3BhY2VCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0RpcmVjdG9yeURpYWxvZ19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19EaXJlY3RvcnlEaWFsb2dfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX0FkZEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9FZGl0QnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX1JlbW92ZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUFsd2F5c09wdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUlmTmV3ZXJPcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9QcmVzZXJ2ZVRpbWVTdGFtcENoZWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfUmVhZG9ubHlDaGVjazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfV29ya3NwYWNlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTWlzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRmlsZUxpc3RTZXBhcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Zyb21MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfTXVsdGlwbGVGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfTm9GaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT25lRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc19FeGVjdXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX1ByZXNlcnZlVGltZVN0YW1wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX1JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNTZXBhcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9FcnJvck1lc3NhZ2VfTmV3UnVsZV9Eb250S25vd1J1bGVUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRXJyb3JNZXNzYWdlX05ld1J1bGVfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfRG93bmxvYWRSdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX0VkaXRTZWxlY3RlZFJ1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfTmV3VXBsb2FkUnVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19SZW1vdmVTZWxlY3RlZFJ1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfT3B0aW9uc19Eb3dubG9hZEVuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfVXBsb2FkRW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9UYWJfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1RhYl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0Rlc3RpbmF0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvblNlcGFyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0ZpbGVMaXN0U2VwYXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRnJvbUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfTXVsdGlwbGVGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX05vRmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PbmVGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc19Eb3dubG9hZEJhY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX1ByZXNlcnZlVGltZVN0YW1wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc19SZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX1R5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkRGlyZWN0b3J5QnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9BZGRGaWxlc0J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkV29ya3NwYWNlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfUmVtb3ZlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9SZW1vdmVGaWxlc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRGlyZWN0b3J5RGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZEZpbGVEaWFsb2dfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRmlsZURpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9BZGRXb3Jrc3BhY2VEaWFsb2dfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0Rvd25sb2FkQmFja0NoZWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVJZk5ld2VyT3B0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZU9wdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfUmVhZG9ubHlDaGVjazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX1JlbW90ZURpcmVjdG9yeUZyYW1lX0xhYmVsRGVmYXVsdEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX1JlbW90ZURpcmVjdG9yeUZyYW1lX0xhYmVsRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfUmVtb3RlRGlyZWN0b3J5RnJhbWVfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19UaXRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzBlMGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ29tbW9uVGFiX2NvbW1vbl9FeGNlcHRpb25fb2NjdXJyZWRfcmVhZGluZ19jb25maWd1cmF0aW9uX0VYQ0VQVElPTj1DYW5ub3QgcmVhZCBjb25maWd1cmF0aW9uCi1UYWJfY29tbW9uX0Jyb3dzZV8xPSZCcm93c2UKLVRhYl9jb21tb25fQnJvd3NlXzI9QiZyb3dzZQotTGF1bmNoX2NvbW1vbl9EZWJ1Z2dlckNvbG9uPURlYnVnZ2VyOgotTGF1bmNoX2NvbW1vbl9FcnJvcj1MYXVuY2ggRXJyb3IKLQotI0FwcGxpY2F0aW9uVGFiCi1BcHBsaWNhdGlvblRhYl9NYWluPUFwcGxpY2F0aW9uCi1BcHBsaWNhdGlvblRhYl9STV9TZWxlY3Rpb25fTGFiZWw9UmVzb3VyY2UgTWFuYWdlcjoKLUFwcGxpY2F0aW9uVGFiX1Byb2plY3RfTGFiZWw9UGFyYWxsZWwgJlByb2plY3Q6Ci1BcHBsaWNhdGlvblRhYl9BcHBsaWNhdGlvbl9MYWJlbD0mQXBwbGljYXRpb24gcHJvZ3JhbToKLUFwcGxpY2F0aW9uVGFiX05vX1Jlc291cmNlX01hbmFnZXJfQXZhaWxhYmxlPU5vIHJlc291cmNlIG1hbmFnZXJzIGF2YWlsYWJsZQotQXBwbGljYXRpb25UYWJfUHJvamVjdF9TZWxlY3Rpb25fVGl0bGU9UHJvamVjdCBTZWxlY3Rpb24KLUFwcGxpY2F0aW9uVGFiX1Byb2plY3RfU2VsZWN0aW9uX01lc3NhZ2U9Q2hvb3NlIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHByb2dyYW0geW91IHdpc2ggdG8gbGF1bmNoCi1BcHBsaWNhdGlvblRhYl9Qcm9qZWN0X3JlcXVpcmVkPVBsZWFzZSBzZWxlY3QgdGhlIHByb2plY3QgZmlyc3QKLUFwcGxpY2F0aW9uVGFiX0VudGVyX3Byb2plY3RfYmVmb3JlX2Jyb3dzaW5nX2Zvcl9wcm9ncmFtPUVudGVyIHByb2plY3QgYmVmb3JlIGJyb3dzaW5nIGZvciBwcm9ncmFtCi1BcHBsaWNhdGlvblRhYl9Qcm9ncmFtX3NlbGVjdGlvbj1Qcm9ncmFtIFNlbGVjdGlvbgotQXBwbGljYXRpb25UYWJfQ2hvb3NlX3Byb2dyYW1fdG9fcnVuX2Zyb21fTkFNRT1DaG9vc2UgcHJvZ3JhbSB0byBydW4KLUFwcGxpY2F0aW9uVGFiX1NlbGVjdGlvbl9tdXN0X2JlX2ZpbGU9U2VsZWN0aW9uIG11c3QgYmUgZmlsZQotQXBwbGljYXRpb25UYWJfSWxsZWdhbF9wcm9qZWN0PUlsbGVnYWwgcHJvamVjdCBuYW1lOiB7MH0KLUFwcGxpY2F0aW9uVGFiX1Byb2plY3Rfbm90X2V4aXN0PVByb2plY3QgezB9IGRvZXMgbm90IGV4aXN0Ci1BcHBsaWNhdGlvblRhYl9Qcm9qZWN0X2lzX2Nsb3NlZD1Qcm9qZWN0IHswfSBpcyBjbG9zZWQKLUFwcGxpY2F0aW9uVGFiX0FwcGxpY2F0aW9uX3Byb2dyYW1fbm90X3NwZWNpZmllZD1BcHBsaWNhdGlvbiBwcm9ncmFtIGlzIG5vdCBzcGVjaWZpZWQKLUFwcGxpY2F0aW9uVGFiX0NvbnNvbGU9RGlzcGxheSBjb21iaW5lZCBvdXRwdXQgaW4gYSBjb25zb2xlIHZpZXcKLQotI1Jlc291cmNlc1RhYgotUmVzb3VyY2VzVGFiX1Jlc291cmNlcz1SZXNvdXJjZXMKLVJlc291cmNlc1RhYl9MYXVuY2hfQXR0cmlidXRlcz1MYXVuY2ggQXR0cmlidXRlcwotUmVzb3VyY2VzVGFiX05vX1Jlc291cmNlX01hbmFnZXI9Tm8gUmVzb3VyY2UgTWFuYWdlciBoYXMgYmVlbiBzZWxlY3RlZAotUmVzb3VyY2VzVGFiX05vX0xhdW5jaF9Db25maWd1cmF0aW9uPU5vIExhdW5jaCBDb25maWd1cmF0aW9uIEF2YWlsYWJsZSBmb3IgUmVzb3VyY2UgTWFuYWdlcjogezB9Ci0KLSNBcmd1bWVudHNUYWIKLUFyZ3VtZW50c1RhYl9Bcmd1bWVudHM9QXJndW1lbnRzCi1Bcmd1bWVudHNUYWJfUGFyYWxsZWxfUHJvZ3JhbV9Bcmd1bWVudHM9UGFyYWxsZWwgcHJvZ3JhbSAmYXJndW1lbnRzOgotCi0jUERlYnVnZ2VyVGFiCi1BYnN0cmFjdERlYnVnZ2VyVGFiX05vX2RlYnVnZ2VyX2F2YWlsYWJsZT1ObyBkZWJ1Z2dlciBhdmFpbGFibGUKLUFic3RyYWN0RGVidWdnZXJUYWJfRGVidWdnZXI9RGVidWdnZXIKLUFic3RyYWN0RGVidWdnZXJUYWJfRXJyb3JMb2FkaW5nRGVidWdnZXJQYWdlPUVycm9yIExvYWRpbmcgRGVidWdnZXIgVUkgQ29tcG9uZW50Ci0KLURlYnVnZ2VyVGFiX1N0b3BfYXRfbWFpbl9vbl9zdGFydHVwPVN0b3AgYXQgbWFpbigpIG9uIHN0YXJ0dXAKLURlYnVnZ2VyVGFiX0RlYnVnZ2VyX09wdGlvbnM9RGVidWdnZXIgT3B0aW9ucwotRGVidWdnZXJUYWJfTW9kZV9ub3Rfc3VwcG9ydGVkPU1vZGUgJyd7MH0nJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNlbGVjdGVkIGRlYnVnZ2VyCi1EZWJ1Z2dlclRhYl9Ob19kZWJ1Z2dlcl9hdmFpbGFibGU9Tm8gZGVidWdnZXIgYXZhaWxhYmxlCi0KLSNXb3JraW5nRGlyZWN0b3J5QmxvY2sKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19Xb3JraW5nX2RpcmVjdG9yeT1Xb3JraW5nIERpcmVjdG9yeQotV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dvcmtpbmdfZGlyZWN0b3J5X2NvbG9uPVdvcmtpbmcgZGlyZWN0b3J5OgotV29ya2luZ0RpcmVjdG9yeUJsb2NrX1VzZV9kZWZhdWx0X3dvcmtpbmdfZGlyZWN0b3J5PVVzZSBkZSZmYXVsdCB3b3JraW5nIGRpcmVjdG9yeQotV29ya2luZ0RpcmVjdG9yeUJsb2NrX0xvY2FsX2RpcmVjdG9yeT0mTG9jYWwgZGlyZWN0b3J5Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV29ya3NwYWNlPVdvcmtzJnBhY2UKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19TZWxlY3Rfd29ya3NwYWNlX3JlbGF0aXZlX3dvcmtpbmdfZGlyZWN0b3J5PVNlbGVjdCAmd29ya3NwYWNlIHJlbGF0aXZlIHdvcmtpbmcgZGlyZWN0b3J5Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfU2VsZWN0X3dvcmtpbmdfZGlyZWN0b3J5X2Zvcl9sYXVuY2hfY29uZmlndXJhdGlvbj1TZWxlY3QgJndvcmtpbmcgZGlyZWN0b3J5IGZvciBsYXVuY2ggY29uZmlndXJhdGlvbgotV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dvcmtpbmdfZGlyZWN0b3J5X2RvZXNfbm90X2V4aXN0PVdvcmtpbmcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV29ya2luZ19kaXJlY3RvcnlfaXNfbm90X2FfZGlyZWN0b3J5PVdvcmtpbmcgZGlyZWN0b3J5IGlzIG5vdCBhIGRpcmVjdG9yeQotV29ya2luZ0RpcmVjdG9yeUJsb2NrX1Byb2plY3Rfb3JfZm9sZGVyX2RvZXNfbm90X2V4aXN0PVByb2plY3Qgb3IgZm9sZGVyIGRvZXMgbm90IGV4aXN0Ci0KLQotI1BhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlCi1QYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9JbnZhbGlkX2xhdW5jaF9vYmplY3Q9SW50ZXJuYWwgZXJyb3I6IEludmFsaWQgbGF1bmNoIG9iamVjdAotCi0jQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZQotQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9qZWN0X25vdF9zcGVjaWZpZWQ9UHJvamVjdCBpcyBub3Qgc3BlY2lmaWVkCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1Byb2plY3RfZG9lc19ub3RfZXhpc3Rfb3JfaXNfbm90X2FfcHJvamVjdD1Qcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHByb2plY3QgdHlwZQotQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9BcHBsaWNhdGlvbl9maWxlX25vdF9zcGVjaWZpZWQ9QXBwbGljYXRpb24gZmlsZSBpcyBub3Qgc3BlY2lmaWVkCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX0FwcGxpY2F0aW9uX2ZpbGVfZG9lc19ub3RfZXhpc3Q9QXBwbGljYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdAotQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Xb3JraW5nX2RpcmVjdG9yeV9kb2VzX25vdF9leGlzdD1Xb3JraW5nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAotQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9QYXRoX25vdF9mb3VuZD1QYXRoICcnezB9Jycgbm90IGZvdW5kCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX05vX1Jlc291cmNlTWFuYWdlcj1TcGVjaWZpZWQgcmVzb3VyY2UgbWFuYWdlciBub3QgZm91bmQgb3IgaXMgbm90IGF2YWlsYWJsZQotQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9EZWJ1Z2dlcl9wYXRoX25vdF9mb3VuZD1EZWJ1Z2dlciBwYXRoIG5vdCBmb3VuZAotQWJzdHJhY3RQYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV9Qcm9ncmFtX2lzX25vdF9hX3JlY29uZ25pemVkX2V4ZWN1dGFibGU9UHJvZ3JhbSBpcyBub3QgYSByZWNvZ25pemVkIGV4ZWN1dGFibGUKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfTG9jYWxfcmVzb3VyY2VfZG9lc19ub3RfZXhpc3Q9TG9jYWwgcmVzb3VyY2UgZG9lc24ndCBleGlzdCEKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfQ291bGRfbm90X3JldHJpZXZlX2xvY2FsX3Jlc291cmNlX2luZm89Q291bGQgbm90IHJldHJpZXZlIGxvY2FsIHJlc291cmNlIGluZm8hCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1JlbW90ZV9yZXNvdXJjZV9kb2VzX25vdF9leGlzdD1SZW1vdGUgcmVzb3VyY2UgZG9lc24ndCBleGlzdCEKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfQ291bGRfbm90X3JldHJpZXZlX3JlbW90ZV9yZXNvdXJjZV9pbmZvPUNvdWxkIG5vdCByZXRyaWV2ZSByZW1vdGUgcmVzb3VyY2UgaW5mbyEKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfRXJyb3JfY29udmVydGluZ19ydWxlcz1FcnJvciBjb252ZXJ0aW5nIHJ1bGVzCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1BhcmFsbGVsX2xhdW5jaGVyX2RvZXNfbm90X3N1cHBvcnQ9UGFyYWxsZWwgbGF1bmNoZXIgZG9lcyBub3Qgc3VwcG9ydCByZXBsYWNpbmcgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiByZW1vdGUgZW52aXJvbm1lbnQuCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlX1Vuc3VwcG9ydGVkX3Jlc291cmNlX21hbmFnZXJfdHlwZT1VbnN1cHBvcnRlZCByZXNvdXJjZSBtYW5hZ2VyIHR5cGUKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfVW5rbm93bl9yZW1vdGVfc2VydmljZXM9VW5rbm93biByZW1vdGUgc2VydmljZXMKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfRXJyb3JfZmV0Y2hpbmdfcmVzb3VyY2U9RXJyb3IgZmV0Y2hpbmcgcmVzb3VyY2UKLQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9UYWJfTWVzc2FnZT1BZGQgc3luY2hyb25pemF0aW9uIHJ1bGVzIHRvIHVwbG9hZCBmaWxlcyBiZWZvcmUgdGhlIGxhdW5jaCBvciB0byBkb3dubG9hZCBmaWxlcyBhZnRlciB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcy4KLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9UaXRsZT1TeW5jaHJvbml6ZSBydWxlczoKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9EZXNjcmlwdGlvbj1VcGxvYWQgcnVsZXMgYXJlIGV4ZWN1dGVkIGJlZm9yZSBhcHBsaWNhdGlvbiBzdGFydHMuIERvd25sb2FkIHJ1bGVzIGFyZSBleGVjdXRlZCBhZnRlciBhcHBsaWNhdGlvbiBmaW5pc2hlcy4KLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9UeXBlPURPV05MT0FEIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX05vRmlsZXM9KG5vIGZpbGVzL2RpcmVjdG9yaWVzKQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09uZUZpbGU9MSBpdGVtIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX011bHRpcGxlRmlsZXM9ezB9IGl0ZW1zIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Zyb21MYWJlbD1Gcm9tOiAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9GaWxlTGlzdFNlcGFyYXRvcj07IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTWlzc2luZz1UbzogPG1pc3NpbmcgbG9jYWwgZGVzdGluYXRpb24+Ci1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRGVzdGluYXRpb25MYWJlbD1UbzogCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc0xhYmVsPU9wdGlvbnM6IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNTZXBhcmF0b3I9OyAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU9ZXhlY3V0YWJsZQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNfUmVhZG9ubHk9cmVhZG9ubHkKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX1ByZXNlcnZlVGltZVN0YW1wPXByZXNlcnZlIHRpbWUvZGF0ZQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9UeXBlPVVQTE9BRCAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfTm9GaWxlcz0obm8gZmlsZXMvZGlyZWN0b3JpZXMpCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09uZUZpbGU9MSBpdGVtIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9NdWx0aXBsZUZpbGVzPXswfSBpdGVtcyAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRnJvbUxhYmVsPUZyb206IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9GaWxlTGlzdFNlcGFyYXRvcj07IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvbkxhYmVsPVRvOiAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc0xhYmVsPU9wdGlvbnM6IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvblNlcGFyYXRvcj07IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU9ZXhlY3V0YWJsZQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX1JlYWRvbmx5PXJlYWRvbmx5Ci1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfUHJlc2VydmVUaW1lU3RhbXA9cHJlc2VydmUgdGltZS9kYXRlCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfRG93bmxvYWRCYWNrPWRvd25sb2FkIGJhY2sgY2hhbmdlcwotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfVXBsb2FkRW5hYmxlZD1VcGxvYWQgcnVsZXMgZW5hYmxlZAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfRG93bmxvYWRFbmFibGVkPURvd25sb2FkIHJ1bGVzIGVuYWJsZWQKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX05ld1VwbG9hZFJ1bGU9TmV3IHVwbG9hZCBydWxlCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19Eb3dubG9hZFJ1bGU9TmV3IGRvd25sb2FkIHJ1bGUKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX0VkaXRTZWxlY3RlZFJ1bGU9RWRpdCBzZWxlY3RlZAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfUmVtb3ZlU2VsZWN0ZWRSdWxlcz1SZW1vdmUgc2VsZWN0ZWQKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVGFiX1RpdGxlPVN5bmNocm9uaXplCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX1RpdGxlPU5ldyBydWxlCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX0RvbnRLbm93UnVsZVR5cGU9TGF1bmNoZXIgZG9lcyBub3Qga25vdyBob3cgdG8gZWRpdCB0aGlzIHR5cGUgb2YgcnVsZS4KLQotVXBsb2FkUnVsZURpYWxvZ19UaXRsZT1VcGxvYWQgUnVsZQotVXBsb2FkUnVsZURpYWxvZ19NZXNzYWdlPVBsZWFzZSBzcGVjaWZ5IHRoZSByZW1vdGUgZGlyZWN0b3J5IGFuZCBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBzaGFsbCBiZSB1cGxvYWRlZC4KLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1RpdGxlPU9wdGlvbnMgZm9yIGFsbCBzZWxlY3RlZCBmaWxlKHMpOgotVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9MYWJlbERlZmF1bHRCdXR0b249VXNlIGRpcmVjdG9yeSBmcm9tIGxhdW5jaCBjb25maWd1cmF0aW9uCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uPVNraXAKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZU9wdGlvbj1PdmVyd3JpdGUKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUlmTmV3ZXJPcHRpb249T3ZlcndyaXRlIGlmIG5ld2VyCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9BZGRGaWxlRGlhbG9nX0Rlc2NyaXB0aW9uPVNlbGVjdCBkaXJlY3RvcnkgdG8gYWRkCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9BZGRXb3Jrc3BhY2VEaWFsb2dfRGVzY3JpcHRpb249U2VsZWN0IHRoZSByZXNzb3VyY2VzIGZyb20gd29ya3NwYWNlIHRvIGFkZAotVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9MYWJlbERpcmVjdG9yeT1SZW1vdGUgZGlyZWN0b3J5OgotVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9UaXRsZT1SZW1vdGUgZGlyZWN0b3J5OgotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1RpdGxlPVNlbGVjdGVkIGZpbGUocyk6Ci1VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfRGVzY3JpcHRpb249QWRkIGZpbGVzOgotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX0FkZEZpbGVzQnV0dG9uPUZpbGUocykKLVVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9BZGREaXJlY3RvcnlCdXR0b249RGlyZWN0b3J5Ci1VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkV29ya3NwYWNlQnV0dG9uPVdvcmtzcGFjZQotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUZpbGVzTGFiZWw9UmVtb3ZlIGZpbGVzOgotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUJ1dHRvbj1SZW1vdmUgc2VsZWN0ZWQKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1JlYWRvbmx5Q2hlY2s9UmVhZG9ubHkKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjaz1FeGVjdXRhYmxlCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9Eb3dubG9hZEJhY2tDaGVjaz1Eb3dubG9hZCBiYWNrIGlmIGNoYW5nZWQKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2s9UHJlc2VydmUgdGltZSBhdHRyaWJ1dGVzCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVMYWJlbD1JZiBmaWxlIGFscmVhZHkgZXhpc3RzOgotVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRmlsZURpYWxvZ19UaXRsZT1TZWxlY3QgZmlsZShzKSB0byBhZGQKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZERpcmVjdG9yeURpYWxvZ19UaXRsZT1TZWxlY3QgZGlyZWN0b3J5IHRvIGFkZAotVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX1RpdGxlPVdvcmtzcGFjZSByZXNvdXJjZXMKLUxhdW5jaGVyRXhlY3V0aW9uVGFiX0FyZ3VtZW50c0ZyYW1lX1RpdGxlPUFyZ3VtZW50czoKLUxhdW5jaGVyRXhlY3V0aW9uVGFiX0FyZ3VtZW50c0ZyYW1lX0NvbW1hbmRMaW5lTGFiZWw9Q29tbWFuZCBsaW5lIGFyZ3VtZW50cwotTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9UaXRsZT1DdXN0b21pemUgYXBwbGljYXRpb24gbGF1bmNoOgotTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9QYXJzZXJMYWJlbD1PdXRwdXQgcGFyc2VyOgotTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9CYXNoQ29tbWFuZHNCZWZvcmVMQWJlbD1CYXNoIGNvbW1hbmRzLCBleGVjdXRlZCBiZWZvcmUgYXBwbGljYXRpb24KLUxhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfQmFzaENvbW1hbmRzQWZ0ZXJMYWJlbD1CYXNoIGNvbW1hbmRzLCBleGVjdXRlZCBhZnRlciBhcHBsaWNhdGlvbgotTGF1bmNoZXJFeGVjdXRpb25UYWJfVmFsaWRhdGlvbl9PYnNlcnZlckFuZE5vQ29uc29sZT1DYW5ub3Qgc2V0IG9ic2VydmVyIGlmIG5vIGNvbnNvbGUgaXMgYWxsb2NhdGVkIChzZWUgQ29tbW9uIFRhYikKLUxhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfT2JzZXJ2ZXJDb21ib19EZWZhdWx0Tm9uZU9wdGlvbj1ub25lCi1MYXVuY2hlckV4ZWN1dGlvblRhYl9UYWJfVGl0bGU9TGF1bmNoCi0KLURvd25sb2FkUnVsZURpYWxvZ19UaXRsZT1Eb3dubG9hZCBSdWxlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfTWVzc2FnZT1QbGVhc2Ugc3BlY2lmeSB0aGUgcmVtb3RlIGZpbGVzIHRoYXQgc2hhbGwgYmUgZG93bmxvYWRlZCBhbmQgYSBsb2NhbCBkaXJlY3RvcnkuCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9UaXRsZT1Mb2NhbCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6Ci1Eb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9GaWxlU3lzdGVtQnV0dG9uPUZpbGUgc3lzdGVtCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9Xb3Jrc3BhY2VCdXR0b249V29ya3NwYWNlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1RpdGxlPU9wdGlvbnMgZm9yIGFsbCBzZWxlY3RlZCBmaWxlKHMpOgotRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9SZWFkb25seUNoZWNrPVJlYWRvbmx5Ci1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjaz1FeGVjdXRhYmxlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2s9UHJlc2VydmUgdGltZSBhdHRyaWJ1dGVzCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUxhYmVsPUlmIGZpbGUgYWxyZWFkeSBleGlzdHM6Ci1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX1NraXBPcHRpb249U2tpcAotRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVBbHdheXNPcHRpb249T3ZlcndyaXRlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUlmTmV3ZXJPcHRpb249T3ZlcndyaXRlIGlmIG5ld2VyCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9UaXRsZT1TZWxlY3RlZCBmaWxlKHMpOgotRG93bmxvYWRSdWxlRGlhbG9nX0ZpbGVMaXN0RnJhbWVfQWRkQnV0dG9uPUFkZCBuZXcKLURvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX0VkaXRCdXR0b249Q2hhbmdlIHNlbGVjdGVkCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9SZW1vdmVCdXR0b249UmVtb3ZlIHNlbGVjdGVkCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRGlyZWN0b3J5RGlhbG9nX1RpdGxlPVNlbGVjdCBsb2NhbCBkZXN0aW5hdGlvbgotRG93bmxvYWRSdWxlRGlhbG9nX0RpcmVjdG9yeURpYWxvZ19NZXNzYWdlPVNlbGVjdCBsb2NhbCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLURvd25sb2FkUnVsZURpYWxvZ19Xb3Jrc3BhY2VEaWFsb2dfVGl0bGU9U2VsZWN0IGZvbGRlcjoKLURvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX1RpdGxlPUFkZCByZW1vdGUgZmlsZS9kaXJlY3RvdHkKLURvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX01lc3NhZ2U9UmVtb3RlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlIGFkZGVkOgotRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX1RpdGxlPUFkZCByZW1vdGUgZmlsZS9kaXJlY3RvdHkKLURvd25sb2FkUnVsZURpYWxvZ19FZGl0RmlsZURpYWxvZ19NZXNzYWdlPVJlbW90ZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBiZSBhZGRlZDoKLQotUmVtb3RlTGF1bmNoUHJvY2Vzc19SZXF1ZXN0VG9DYW5jZWxMYXVuY2g9UmVxdWVzdGVkIHRvIGNhbmNlbCB0aGlzIGxhdW5jaC4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfTm90UmVxdWlyZWQ9KiBMYXVuY2ggY29uZmlndXJhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGNyZWF0aW5nIHJlbW90ZSBkaXJlY3RvcnkuCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfVGl0bGU9KiBTeW5jaHJvbml6ZSBiZWZvcmUgbGF1bmNoOgotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRBcHBsaWNhdGlvbl9UaXRsZT0qIFVwbG9hZCBhcHBsaWNhdGlvbiBleGVjdXRhYmxlIGZpbGUuCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX1RpdGxlPSogQ3JlYXRpbmcgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5OiB7MH0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkQ3JlYXRlPVwgXCBcIEZhaWxlZCB0byBjcmVhdGUgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5OiB7MH0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9Ob1J1bGVzPVwgXCBcIE5vIHJ1bGVzIHdlcmUgc3BlY2lmaWVkIGZvciB0aGlzIGxhdW5jaC4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkQXBwbGljYXRpb25fVGl0bGVOb1VwbG9hZD0qIExhdW5jaCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHJlcXVpcmUgdXBsb2FkaW5nIHRoZSBleGVjdXRhYmxlIGZpbGUuCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX1VwbG9hZE1lc3NhZ2U9XCBcIFwgVXBsb2FkIGV4ZWN1dGFibGUgezB9XG4gICB0byB7MX0gKHJlbW90ZSkKLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkQXBwbGljYXRpb25fRmFpbGVkVXBsb2FkPVwgXCBcIFVwbG9hZCBmYWlsZWQ6IHswfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9GYWlsZWRDcmVhdGVIaW50PVwgXCBcIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgb3IgaXMgb3duZWQgYnkgYW5vdGhlciB1c2VyLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X0ZhaWxlZFJ1bGU9XCBcIFwgUnVsZSB7MH0gZmFpbGVkOiB7MX0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkQXBwbGljYXRpb25fQ29tcGxldGVkVXBsb2FkPVwgXCBcIFVwbG9hZCBjb21wbGV0ZWQuCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX0ZhaWxlZD1Db3VsZCBub3QgcHJlcGFyZSB3b3JraW5nIGRpcmVjdG9yeS4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfQWxsX0ZhaWxlZENvbm5lY3Rpb249Q29ubmVjdGlvbiB0byBob3N0IGZhaWxlZC4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfRmFpbGVkPUNvdWxkIG5vdCB1cGxvYWQgZXhlY3V0YWJsZSBmaWxlLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19GYWlsZWRQZXJtaXNzaW9ucz1cIFwgXCBGYWlsZWQgdG8gc2V0IHBlcm1pc3Npb25zIG9uIGV4ZWN1dGFibGUgZmlsZTogezB9Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX0ZhaWxlZFBlcm1pc3Npb25zPVwgXCBcIEZhaWxlZCB0byBzZXQgcGVybWlzc2lvbnMgb24gcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5OiB7MH0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9UaXRsZVVwbG9hZERpc2FibGVkPSogTGF1bmNoIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgcmVxdWlyZSBzeW5jaHJvbml6ZSBiZWZvcmUgbGF1bmNoLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X0lnbm9yZUluYWN0aXZlPVwgXCBcIElnbm9yaW5nIGluYWN0aXZlIHJ1bGUgezB9Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW52YWxpZD1cIFwgXCBJZ25vcmluZyBydWxlIHswfTogezF9Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9UaXRsZURvd25sb2FkRGlzYWJsZWQ9KiBMYXVuY2ggY29uZmlndXJhdGlvbiBkb2VzIG5vdCByZXF1aXJlIHN5bmNocm9uaXplIGFmdGVyIGxhdW5jaC4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfRG93bmxvYWRXb3JraW5nRGlyZWN0b3J5X1RpdGxlPSogU3luY2hyb25pemUgYWZ0ZXIgbGF1bmNoOgotUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW5hY3RpdmU9XCBcIFwgSWdub3JpbmcgaW5hY3RpdmUgcnVsZSB7MH0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfRG93bmxvYWRXb3JraW5nRGlyZWN0b3J5X0lnbm9yZUludmFsaWQ9XCBcIFwgSWdub3JpbmcgcnVsZSB7MH06IHsxfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfRmFpbGVkUnVsZT1cIFwgXCBSdWxlIHswfSBmYWlsZWQ6IHsxfQotCi1Eb3dubG9hZEJhY2tBY3Rpb25fRmFpbGVkRmV0Y2hSZW1vdGVQcm9wZXJ0aWVzPVwgXCBcIENvdWxkIG5vdCBmZXRjaCBwcm9wZXJ0aWVzIGZvciByZW1vdGUgZmlsZTogezB9Ci1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ2FsY3VsYXRlQ2xvY2tEaWZmZXJlbmNlPVwgXCBcIENvdWxkIG5vdCBjYWxjdWxhdGUgY2xvY2sgZGlmZmVyZW5jZSB3aXRoIHJlbW90ZSBob3N0OiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRDYWxjdWxhdGVDbG9ja0RpZmZlcmVuY2UyPVwgXCBcIEFzc3VtaW5nIHNhbWUgYSByZW1vdGUgY2xvY2sgc3luY2hyb25pemVkIHdpdGggbG9jYWwgY2xvY2suCi1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ3JlYXRlTG9jYWxEaXJlY3Rvcnk9XCBcIFwgQ2Fubm90IGNyZWF0ZSBsb2NhbCBkaXJlY3RvcnkgezB9Ci1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkTG9jYWxEaXJldG9yeUlzTm90RGlyZWN0b3J5PVwgXCBcIFBhdGggezB9IGV4aXN0cywgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeQotRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFJlbW90ZVBhdGhEb2VzTm90RXhpdD1cIFwgXCBJZ25vcmluZyB7MH06IFBhdGggZG9lcyBub3QgZXhpc3QgcmVtb3RlbHkKLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZUF0dHJpYnV0ZXM9XCBcIFwgQ291bGQgbm90IGZldGNoIGF0dHJpYnV0ZXMgb2YgcmVtb3RlIGZpbGUvZGlyZWN0b3J5OiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnROZXdlckZpbGVFeGlzdHNMb2NhbGx5PVwgXCBcIEEgbmV3ZXIgZmlsZSBhbHJlZHkgZXhpc3RzIGxvY2FsbHksIGlnbm9yaW5nIGl0OiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRTZXRMb2NhbEZpbGVBdHRyaWJ1dGVzPVwgXCBcIEZhaWxlZCB0byBzZXQgYXR0cmlidXRlcyBvZiBsb2NhbCBmaWxlOiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRTZXRMb2NhbERpcmVjdG9yeUF0dHJpYnV0ZXM9XCBcIFwgRmFpbGVkIHRvIHNldCBhdHRyaWJ1dGVzIG9mIGxvY2FsIGRpcmVjdG9yeTogezB9Ci1Eb3dubG9hZEJhY2tBY3Rpb25fRmFpbGVkRmlsZWREb2VzTm90RXhpc3Q9XCBcIFwgUmVtb3RlIGZpbGUgZG9lcyBub3QgZXhpc3QgYW55bW9yZTogezB9Ci1Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ5RGlyZWN0b3J5RG93bmxvYWQxPVwgXCBcIENvcHlpbmcgY29udGVudHMgb2YgZGlyZWN0b3J5IHswfSAocmVtb3RlKQotRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmeURpcmVjdG9yeURvd25sb2FkMj1cIFwgXCBpbnRvIGRpcmVjdG9yeSB7MH0gKGxvY2FsKQotRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmdEZpbGVFeGlzdHNMb2NhbGx5PVwgXCBcIEZpbGUgYWxyZWR5IGV4aXN0cyBsb2NhbGx5LCBpZ25vcmluZyBpdDogezB9Ci1Eb3dubG9hZEJhY2tBY3Rpb25fTm90aWZ5RmlsZU5vdENoYW5nZWQ9XCBcIFwgRmlsZSB7MH0gd2FzIG5vdCBjaGFuZ2VkIG9uIHJlbW90ZSB0YXJnZXQuCi1Eb3dubG9hZFJ1bGVBY3Rpb25fV2FybmluZ0Nsb2NrQmFja3dhcmQ9XCBcIFwgV2FybmluZ1whIENsb2NrIGF0IHJlbW90ZSB0YXJnZXQgaXMgb2xkZXIgdGhhbiBsb2NhbCBjbG9jay4gRmlsZSBzeW5jaHJvbml6YXRpb24gbWF5IG5vdCBiZSBjb3JyZWN0LgotRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZEZldGNoQXR0cmlidXRlcz1cIFwgXCBJZ25vcmluZyB7MH06IENhbm5vdCBmZXRjaCBhdHRyaWJ1dGVzCi1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkU2V0RG93bmxvYWRGaWxlPVwgXCBcIENvdWxkIG5vdCBkb3dubG9hZCBmaWxlOiB7MH0KLURvd25sb2FkQmFja0FjdGlvbl9Ob3RpZnlEb253bG9hZEJhY2s9XCBcIFwgRG93bmxvYWQgYmFjayBmaWxlIHswfS4KLURvd25sb2FkQmFja0FjdGlvbl9GYWlsZWREb3dubG9hZEJhY2s9XCBcIFwgQ291bGQgbm90IGRvd25sb2FkIGZpbGU6IHswfQotRG93bmxvYWRSdWxlQWN0aW9uX1dhcm5pbmdDbG9ja0ZvcndhcmQ9XCBcIFwgV2FybmluZ1whIENsb2NrIGF0IHJlbW90ZSB0YXJnZXQgaXMgbW9yZSByZWNlbnQgdGhhbiBsb2NhbCBjbG9jay4gRmlsZSBzeW5jaHJvbml6YXRpb24gbWF5IG5vdCBiZSBjb3JyZWN0LgotRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFJlbW90ZVBhdGhOb0RpcmVjdG9yeU5vckZpbGU9XCBcIFwgSWdub3JpbmcgezB9OiBQYXRoIGlzIG5vdCBhIHJlbW90ZSBmaWxlIG5vciBkaXJlY3RvcnkKLURvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlGaWxlRG93bmxvYWQxPVwgXCBcIENvcHlpbmcgZmlsZSB7MH0gKHJlbW90ZSkKLURvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlGaWxlRG93bmxvYWQyPVwgXCBcIHRvIGZpbGUgezB9IChsb2NhbCkKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9Eb3dubG9hZEJhY2tBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9Eb3dubG9hZEJhY2tBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzcxZDY1YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvcnVsZXNlbmdpbmUvRG93bmxvYWRCYWNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnJ1bGVzZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLlBUUExhdW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuRG93bmxvYWRCYWNrUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLkxpbnV4UGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRCYWNrQWN0aW9uIGltcGxlbWVudHMgSVJ1bGVBY3Rpb24gewotCQotCXByaXZhdGUgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBwcm9jZXNzOwotCXByaXZhdGUgRG93bmxvYWRCYWNrUnVsZSBydWxlOwotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXB1YmxpYyBEb3dubG9hZEJhY2tBY3Rpb24oSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBwcm9jZXNzLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCAKLQkJCURvd25sb2FkQmFja1J1bGUgZG93bmxvYWRCYWNrUnVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucnVsZSA9IGRvd25sb2FkQmFja1J1bGU7Ci0JCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwcm9jZXNzKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChydWxlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIEdldCBtYW5hZ2VycwotCQlJUmVtb3RlRmlsZU1hbmFnZXIgcmVtb3RlRmlsZU1hbmFnZXIgPSBwcm9jZXNzLmdldFJlbW90ZUZpbGVNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQlJUmVtb3RlRmlsZU1hbmFnZXIgbG9jYWxGaWxlTWFuYWdlciA9IHByb2Nlc3MuZ2V0TG9jYWxGaWxlTWFuYWdlcihjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8qCi0JCSAqIFByb2Nlc3MgZmlsZXMgaW4gbGlzdC4KLQkJICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVsZS5jb3VudCgpOyBpKyspIHsKLQkJCUlGaWxlU3RvcmUgcmVtb3RlRmlsZVN0b3JlID0gbnVsbDsKLQkJCUlGaWxlU3RvcmUgbG9jYWxGaWxlU3RvcmUgPSBudWxsOwotCQkJCi0JCQl0cnkgewotCQkJcmVtb3RlRmlsZVN0b3JlID0gcmVtb3RlRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UocnVsZS5nZXRSZW1vdGVGaWxlKGkpLCAKLQkJCQkJbW9uaXRvcik7Ci0JCQlJUGF0aCBsb2NhbFBhdGggPSBuZXcgUGF0aChydWxlLmdldExvY2FsRmlsZShpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlsb2NhbEZpbGVTdG9yZSA9IGxvY2FsRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UobG9jYWxQYXRoLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQkiRXJyb3IgcmV0cmlldmluZyByZXNvdXJjZSIsIGUpKTsKLQkJCX0KLQkJCQotCQkJZG9Eb3dubG9hZChyZW1vdGVGaWxlU3RvcmUsIGxvY2FsRmlsZVN0b3JlKTsKLQkJCS8vZG93bmxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9Eb3dubG9hZChJRmlsZVN0b3JlIHJlbW90ZUZpbGVTdG9yZSwKLQkJCUlGaWxlU3RvcmUgbG9jYWxGaWxlU3RvcmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCS8vIEdldCByZW1vdGUgYW5kIGxvY2FsIGZpbGUgaW5mb3MKLQkJSUZpbGVJbmZvIHJlbW90ZUZpbGVJbmZvID0gcmVtb3RlRmlsZVN0b3JlLmZldGNoSW5mbyhFRlMuTk9ORSwgbW9uaXRvcik7Ci0JCS8vSUZpbGVJbmZvIGxvY2FsRmlsZUluZm8gPSBsb2NhbEZpbGVTdG9yZS5mZXRjaEluZm8oKTsKLQkJCi0JCWlmKCFyZW1vdGVGaWxlSW5mby5leGlzdHMoKSkgewotCQkJLy8gV2FybiB1c2VyIHRoYXQgZmlsZSBkb2VzbmB0IGV4aXN0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJlbW90ZUZpbGVTdG9yZS5jb3B5KGxvY2FsRmlsZVN0b3JlLCBFRlMuT1ZFUldSSVRFLCBtb25pdG9yKTsKLQl9Ci0KLQkvKnByaXZhdGUgdm9pZCBkb3dubG9hZEZpbGUoRmlsZSBsb2NhbEZpbGUsIElQYXRoIHJlbW90ZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcmVtb3RlUGF0aEFzU3RyaW5nID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCQkKLQkJCQkKLQkJSVJlbW90ZUZpbGUgcmVtb3RlRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVGaWxlID0gZmlsZVRvb2xzLmdldEZpbGUocmVtb3RlUGF0aEFzU3RyaW5nKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRCYWNrQWN0aW9uX0ZhaWxlZEZldGNoUmVtb3RlUHJvcGVydGllcywgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgcmVtb3RlRmlsZS5leGlzdHMoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZEJhY2tBY3Rpb25fRmFpbGVkRmlsZWREb2VzTm90RXhpc3QsIHJlbW90ZVBhdGhBc1N0cmluZykpOwotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCQotCQkKLQkJICogVGVzdCBpZiBmaWxlIGhhcyBiZWVuIGNoYW5nZWQuCi0JCSAKLQkJbG9uZyBkaWZmZXJlbmNlID0gcmVtb3RlRmlsZS5nZXRNb2RpZmljYXRpb25UaW1lKCkgLSBsb2NhbEZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCWlmIChkaWZmZXJlbmNlIDwgMTAwMCAmJiByZW1vdGVGaWxlLmdldFNpemUoKSA9PSBsb2NhbEZpbGUubGVuZ3RoKCkpIHsKLQkJCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkQmFja0FjdGlvbl9Ob3RpZnlGaWxlTm90Q2hhbmdlZCwgcmVtb3RlUGF0aCkpOwotCQkJcmV0dXJuOwkJCQkJCi0JCX0KLQkJCi0JCQotCQkgKiBEb3dubG9hZCBmaWxlCi0JCSAKLQkJdHJ5IHsKLQkJCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkQmFja0FjdGlvbl9Ob3RpZnlEb253bG9hZEJhY2ssIHJlbW90ZVBhdGhBc1N0cmluZykpOwotCQkJY29weVRvb2xzLmRvd25sb2FkRmlsZVRvRmlsZShyZW1vdGVQYXRoQXNTdHJpbmcsIGxvY2FsRmlsZSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkQmFja0FjdGlvbl9GYWlsZWREb3dubG9hZEJhY2ssIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ki8KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9Eb3dubG9hZFJ1bGVBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9Eb3dubG9hZFJ1bGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRiM2RiZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvcnVsZXNlbmdpbmUvRG93bmxvYWRSdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnJ1bGVzZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5Eb3dubG9hZEJhY2tSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5Eb3dubG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLk92ZXJ3cml0ZVBvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIERvd25sb2FkUnVsZUFjdGlvbiBpbXBsZW1lbnRzIElSdWxlQWN0aW9uIHsKLQotCXByaXZhdGUgZmluYWwgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBwcm9jZXNzOwotCXByaXZhdGUgZmluYWwgRG93bmxvYWRSdWxlIHJ1bGU7Ci0JcHJpdmF0ZSBmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCXByaXZhdGUgRG93bmxvYWRCYWNrUnVsZSBkb3dubG9hZEJhY2tSdWxlOwotCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHVibGljIERvd25sb2FkUnVsZUFjdGlvbihJTGF1bmNoUHJvY2Vzc0NhbGxiYWNrIHByb2Nlc3MsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIAotCQkJRG93bmxvYWRSdWxlIHJ1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCQl0aGlzLnJ1bGUgPSBydWxlOwotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwcm9jZXNzKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChydWxlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8qCi0JCSAqIElmIG92ZXJ3cml0ZSBwb2xpY3kgZGVwZW5kcyBvbiB0aW1lLCB0aGVuIGdldCByZW1vdGUgY2xvY2sgc2tldy4KLQkJICovCi0JCS8qbG9uZyBjbG9ja1NrZXcgPSAwOwotCQlpZiAocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSA9PSBPdmVyd3JpdGVQb2xpY2llcy5ORVdFUikgewotCQkJSVJlbW90ZVN0YXR1c1Rvb2xzIHN0YXR1c1Rvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVTdGF0dXNUb29scygpOwotCQkJbG9uZyBsb2NhbFRpbWU7Ci0JCQlsb25nIHJlbW90ZVRpbWU7Ci0JCQl0cnkgewotCQkJCWxvY2FsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXJlbW90ZVRpbWUgPSBzdGF0dXNUb29scy5nZXRUaW1lKCk7Ci0JCQkJY2xvY2tTa2V3ID0gbG9jYWxUaW1lIC1yZW1vdGVUaW1lOwotCQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRDYWxjdWxhdGVDbG9ja0RpZmZlcmVuY2UsIGUuZ2V0TWVzc2FnZSgpKSk7CQkJCi0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ2FsY3VsYXRlQ2xvY2tEaWZmZXJlbmNlMik7Ci0JCQkJY2xvY2tTa2V3ID0gMDsKLQkJCX0KLQkJCWlmIChjbG9ja1NrZXcgPCAtMTUwMDApIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9XYXJuaW5nQ2xvY2tGb3J3YXJkKTsKLQkJCX0gZWxzZSBpZiAoY2xvY2tTa2V3ID4gMTUwMDApIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9XYXJuaW5nQ2xvY2tCYWNrd2FyZCk7CQkJCQotCQkJfQotCQl9Ki8KLQkJCi0JCS8qCi0JCSAqIERldGVybWluZSBsb2NhbCBwYXRoLiBNYWtlIGl0IGFic29sdXRlLiAKLQkJICovCi0JCUlQYXRoIGxvY2FsUGFyZW50UGF0aCA9IG5ldyBQYXRoKHJ1bGUuZ2V0TG9jYWxEaXJlY3RvcnkoKSk7Ci0JCWlmICghIGxvY2FsUGFyZW50UGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCUlQYXRoIGRlZmF1bHRQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJbG9jYWxQYXJlbnRQYXRoID0gZGVmYXVsdFBhdGguYXBwZW5kKGxvY2FsUGFyZW50UGF0aCk7Ci0JCQkvKklQYXRoIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCWxvY2FsUGF0aCA9IHdvcmtzcGFjZS5hcHBlbmQobG9jYWxQYXRoKTsqLwotCQl9Ci0JCWxvY2FsUGFyZW50UGF0aC5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlBc3NlcnQuaXNUcnVlKGxvY2FsUGFyZW50UGF0aC5pc0Fic29sdXRlKCksICJsb2NhbFBhdGguaXNBYnNvbHV0ZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIEdldCB0aGUgZmlsZSBzdG9yZSBvZiB0aGUgcGFyZW50IGRpci4KLQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGxvY2FsRmlsZU1hbmFnZXIgPSBwcm9jZXNzLmdldExvY2FsRmlsZU1hbmFnZXIoY29uZmlndXJhdGlvbik7Ci0JCUlGaWxlU3RvcmUgbG9jYWxGaWxlUGFyZW50UmVzb3VyY2UgPSBudWxsOwotCQl0cnkgewotCQkJbG9jYWxGaWxlUGFyZW50UmVzb3VyY2UgPSBsb2NhbEZpbGVNYW5hZ2VyLmdldFJlc291cmNlKGxvY2FsUGFyZW50UGF0aCwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uUExVR0lOX0lELCAiRXJyb3IgcmV0cmlldmluZyBsb2NhbCByZXNvdXJjZSIsIGUpKTsKLQkJfQotCQlJRmlsZUluZm8gbG9jYWxGaWxlUGFyZW50SW5mbyA9IGxvY2FsRmlsZVBhcmVudFJlc291cmNlLmZldGNoSW5mbygpOwotCQkKLQkJLy8gQ3JlYXRlIHRoZSBsb2NhbHBhdGggaWYgbmVjZXNzYXJ5Ci0JCWlmKCFsb2NhbEZpbGVQYXJlbnRJbmZvLmV4aXN0cygpKSB7Ci0JCQlsb2NhbEZpbGVQYXJlbnRSZXNvdXJjZS5ta2RpcihFRlMuTk9ORSwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCS8vIERvd25sb2FkIGFsbCByZW1vdGUgcGF0aHMKLQkJSVBhdGggcmVtb3RlUGF0aHMgW10gPSBydWxlLmdldFJlbW90ZUZpbGVzQXNQYXRoQXJyYXkoKTsKLQkJSVBhdGggcmVtb3RlV29ya2luZ1BhdGggPSBuZXcgUGF0aChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLQkJCQlJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0VYRUNVVEFCTEVfUEFUSCwgIiIpKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCByZW1vdGVQYXRocy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGhzW2ldOwotCQkJCi0JCQkvLyBNYWtlIHBhdGhzIGFic29sdXRlCi0JCQlpZighcmVtb3RlUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlyZW1vdGVQYXRoID0gcmVtb3RlV29ya2luZ1BhdGguYXBwZW5kKHJlbW90ZVBhdGgpOwotCQkJfQotCQkJCi0JCQlJRmlsZVN0b3JlIHJlbW90ZUZpbGVTdG9yZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUlSZW1vdGVGaWxlTWFuYWdlciByZW1vdGVGaWxlTWFuYWdlciA9IHByb2Nlc3MuZ2V0UmVtb3RlRmlsZU1hbmFnZXIoY29uZmlndXJhdGlvbik7Ci0JCQkJcmVtb3RlRmlsZVN0b3JlID0gcmVtb3RlRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UocmVtb3RlUGF0aCwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIFBUUExhdW5jaFBsdWdpbi5QTFVHSU5fSUQsICJFcnJvciByZXRyaWV2aW5nIHJlbW90ZSByZXNvdXJjZSIsIGUpKTsKLQkJCX0KLQkJCQotCQkJLy8gQ2hlY2sgaWYgdGhlIHJlbW90ZSByZXNvdXJjZSBleGlzdHMKLQkJCUlGaWxlSW5mbyByZW1vdGVGaWxlSW5mbyA9IHJlbW90ZUZpbGVTdG9yZS5mZXRjaEluZm8oRUZTLk5PTkUsIG1vbml0b3IpOwotCQkJCi0JCQlpZighcmVtb3RlRmlsZUluZm8uZXhpc3RzKCkpIHsKLQkJCQkvLyBXYXJuIHRoZSB1c2VyIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGZpbGUKLQkJCQkvLyBGSVhNRSBXYXJuIHRoZSB1c2VyIHRoYXQgdGhlIHJlc291cmNlIGRvZXNuJ3QgZXhpc3QKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJLy8gR2VuZXJhdGUgdGhlIGVudGlyZSBwYXRoIGZyb20gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBsb2NhbFBhdGhQYXJlbnQKLQkJCS8vIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBiZSBjb3BpZWQuCi0JCQlJUGF0aCBsb2NhbFBhdGggPSBsb2NhbFBhcmVudFBhdGguYXBwZW5kKHJlbW90ZVBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQkKLQkJCS8vIEdlbmVyYXRlIHRoZSBmaWxlIHN0b3JlIGZvciB0aGUgbG9jYWwgcGF0aAotCQkJSUZpbGVTdG9yZSBsb2NhbEZpbGVTdG9yZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWxvY2FsRmlsZVN0b3JlID0gbG9jYWxGaWxlTWFuYWdlci5nZXRSZXNvdXJjZShsb2NhbFBhdGgsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uUExVR0lOX0lELCAiRXJyb3IgcmV0cmlldmluZyBsb2NhbCByZXNvdXJjZSIsIGUpKTsKLQkJCX0KLQotCQkJZG9Eb3dubG9hZChyZW1vdGVGaWxlU3RvcmUsIHJlbW90ZVBhdGgsIGxvY2FsRmlsZVN0b3JlLCBsb2NhbFBhdGgpOwotCQl9Ci0JCS8qRmlsZSBsb2NhbERpciA9IGxvY2FsUGF0aFBhcmVudC50b0ZpbGUoKTsKLQkJaWYgKCEgbG9jYWxEaXIuZXhpc3RzKCkpIHsKLQkJCWlmICghIGxvY2FsRGlyLm1rZGlycygpKSB7Ci0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ3JlYXRlTG9jYWxEaXJlY3RvcnksIGxvY2FsUGF0aFBhcmVudC50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuOwkJCQkJCQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoISBsb2NhbERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRMb2NhbERpcmV0b3J5SXNOb3REaXJlY3RvcnksIGxvY2FsUGF0aFBhcmVudC50b1N0cmluZygpKSk7Ci0JCQlyZXR1cm47CQkJCQkJCQkJCQkKLQkJfSovCi0JCQotCQkvKgotCQkgKiBEZXRlcm1pbmUgbGlzdCBvZiByZW1vdGUgcGF0aHMuIE1ha2UgdGhlbSBhYnNvbHV0ZS4KLQkJICovCi0JCS8qSVBhdGggcmVtb3RlUGF0aHMgW10gPSBydWxlLmdldFJlbW90ZUZpbGVzQXNQYXRoQXJyYXkoKTsKLQkJSVBhdGggcmVtb3RlV29ya2luZ1BhdGggPSBjb25maWd1cmF0aW9uLmdldFJlbW90ZURpcmVjdG9yeVBhdGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdGVQYXRocy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGhzW2ldOwotCQkJaWYgKCEgcmVtb3RlUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlyZW1vdGVQYXRoID0gcmVtb3RlV29ya2luZ1BhdGguYXBwZW5kKHJlbW90ZVBhdGgpOwotCQkJfQotCQkJcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGgucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCUFzc2VydC5pc1RydWUocmVtb3RlUGF0aC5pc0Fic29sdXRlKCksICJyZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZW1vdGVQYXRoc1tpXSA9IHJlbW90ZVBhdGg7Ci0JCX0KLQotCQkKLQkJICogUHJvY2VzcyBwYXRocy4KLQkJIAotCQlJUmVtb3RlRmlsZVRvb2xzIGZpbGVUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlRmlsZVRvb2xzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3RlUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHJlbW90ZVBhdGggPSByZW1vdGVQYXRoc1tpXTsKLQkJCVN0cmluZyByZW1vdGVQYXRoQXNTdHJpbmcgPSBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlUGF0aCk7Ci0JCQlJUmVtb3RlSXRlbSBpdGVtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXRlbSA9IGZpbGVUb29scy5nZXRJdGVtKHJlbW90ZVBhdGhBc1N0cmluZyk7Ci0JCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZEZldGNoQXR0cmlidXRlcywgcmVtb3RlUGF0aEFzU3RyaW5nKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICghIGl0ZW0uZXhpc3RzKCkpIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRSZW1vdGVQYXRoRG9lc05vdEV4aXQsIHJlbW90ZVBhdGhBc1N0cmluZykpOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSVJlbW90ZURpcmVjdG9yeSkgewotCQkJCUlSZW1vdGVEaXJlY3RvcnkgcmVtb3RlRGlyZWN0b3J5ID0gKElSZW1vdGVEaXJlY3RvcnkpIGl0ZW07Ci0JCQkJZG93bmxvYWREaXJlY3RvcnkocmVtb3RlRGlyZWN0b3J5LCBsb2NhbERpcik7Ci0JCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJUmVtb3RlRmlsZSkgewotCQkJCUlSZW1vdGVGaWxlIHJlbW90ZUZpbGUgPSAoSVJlbW90ZUZpbGUpIGl0ZW07Ci0JCQkJZG93bmxvYWRGaWxlKHJlbW90ZUZpbGUsIGxvY2FsRGlyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkUmVtb3RlUGF0aE5vRGlyZWN0b3J5Tm9yRmlsZSwgcmVtb3RlUGF0aEFzU3RyaW5nKSk7Ci0JCQkJY29udGludWU7CQkJCQotCQkJfQotCQl9Ki8KLQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0Rvd25sb2FkKElGaWxlU3RvcmUgcmVtb3RlRmlsZVN0b3JlLCBJUGF0aCByZW1vdGVQYXRoLAotCQkJSUZpbGVTdG9yZSBsb2NhbEZpbGVTdG9yZSwgSVBhdGggbG9jYWxQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEZldGNoIGZpbGUgaW5mb3MKLQkJSUZpbGVJbmZvIGxvY2FsRmlsZUluZm8gPSBsb2NhbEZpbGVTdG9yZS5mZXRjaEluZm8oKTsKLQkJSUZpbGVJbmZvIHJlbW90ZUZpbGVJbmZvID0gcmVtb3RlRmlsZVN0b3JlLmZldGNoSW5mbyhFRlMuTk9ORSwgbW9uaXRvcik7Ci0JCQotCQkvLyBGaW5kIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgb24gdGhlIGxvY2FsIG1hY2hpbmUKLQkJaWYobG9jYWxGaWxlSW5mby5leGlzdHMoKSkgewotCQkJLy8gRm9sbG93cyB0aGUgc2VsZWN0ZWQgcG9saWN5Ci0JCQlzd2l0Y2gocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSkgewotCQkJY2FzZSBPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVM6Ci0JCQkJLy8gQWx3YXlzIGNvcHkgYW55d2F5Li4uCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSOgotCQkJCWxvbmcgZHVwRmlsZU1vZFRpbWUsIGxvY2FsRmlsZU1vZFRpbWU7Ci0JCQkJZHVwRmlsZU1vZFRpbWUgPSBsb2NhbEZpbGVJbmZvLmdldExhc3RNb2RpZmllZCgpOwotCQkJCWxvY2FsRmlsZU1vZFRpbWUgPSByZW1vdGVGaWxlSW5mby5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQkKLQkJCQlpZihkdXBGaWxlTW9kVGltZSA+PSBsb2NhbEZpbGVNb2RUaW1lKSB7Ci0JCQkJCS8vIFJlbW90ZSBmaWxlIGlzIG5ld2VyLiBTa2lwCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybjsJCi0JCQl9Ci0JCX0KLQkJCi0JCS8vIERvd25sb2FkIHJlc291cmNlCi0JCXJlbW90ZUZpbGVTdG9yZS5jb3B5KGxvY2FsRmlsZVN0b3JlLCBFRlMuT1ZFUldSSVRFLCBtb25pdG9yKTsKLQkJCi0JCS8qIFNldCBsb2NhbCBmaWxlIHBlcm1pc3Npb25zIGZyb20gdGhlIHJlbW90ZSByZXNvdXJjZSAqLwotCQlib29sZWFuIGNoYW5nZWRBdHRyID0gZmFsc2U7Ci0JCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQlsb2NhbEZpbGVJbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX1JFQURfT05MWSwgdHJ1ZSk7Ci0JCQljaGFuZ2VkQXR0ciA9IHRydWU7Ci0JCX0KLQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSkgewotCQkJbG9jYWxGaWxlSW5mby5zZXRBdHRyaWJ1dGUoRUZTLkFUVFJJQlVURV9FWEVDVVRBQkxFLCB0cnVlKTsKLQkJCWNoYW5nZWRBdHRyID0gdHJ1ZTsKLQkJfQotCQlpZihjaGFuZ2VkQXR0cikgewotCQkJbG9jYWxGaWxlU3RvcmUucHV0SW5mbyhsb2NhbEZpbGVJbmZvLCBFRlMuU0VUX0FUVFJJQlVURVMsIG1vbml0b3IpOwotCQl9Ci0JCQotCQkgLy8gU2V0IGRhdGUvdGltZSwgaWYgcmVxdWlyZWQKLQkJaWYgKHJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpKSB7Ci0JCQlsb2NhbEZpbGVJbmZvLnNldExhc3RNb2RpZmllZChyZW1vdGVGaWxlSW5mby5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQlsb2NhbEZpbGVTdG9yZS5wdXRJbmZvKGxvY2FsRmlsZUluZm8sIEVGUy5TRVRfTEFTVF9NT0RJRklFRCwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JfQotCi0JLypwcml2YXRlIHZvaWQgZG93bmxvYWRGaWxlKElSZW1vdGVGaWxlIHJlbW90ZUZpbGUsIEZpbGUgbG9jYWxEaXIpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlBc3NlcnQuaXNUcnVlKGxvY2FsRGlyLmlzQWJzb2x1dGUoKSwgImxvY2FsRGlyLmlzQWJzb2x1dGUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCByZW1vdGVGaWxlUGF0aCA9IExpbnV4UGF0aC5mcm9tU3RyaW5nKHJlbW90ZUZpbGUuZ2V0UGF0aCgpKTsKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbERpciwgcmVtb3RlRmlsZVBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlGaWxlRG93bmxvYWQxLCByZW1vdGVGaWxlLmdldFBhdGgoKSkpOwotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ5RmlsZURvd25sb2FkMiwgbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0KLQkJZG9GaWxlRG93bmxvYWQocmVtb3RlRmlsZSwgbG9jYWxGaWxlKTsJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyZWN0b3J5KElSZW1vdGVEaXJlY3RvcnkgcmVtb3RlRGlyZWN0b3J5LCBGaWxlIGxvY2FsRGlyKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbERpci5pc0Fic29sdXRlKCksICJsb2NhbERpci5pc0Fic29sdXRlKCkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlEaXJlY3RvcnlEb3dubG9hZDEsIHJlbW90ZURpcmVjdG9yeS5nZXRQYXRoKCkpKTsKLQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmeURpcmVjdG9yeURvd25sb2FkMiwgbG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotCQlJUmVtb3RlRmlsZVRvb2xzIGZpbGVUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlRmlsZVRvb2xzKCk7Ci0JCQotCQlJUmVtb3RlRmlsZUVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudW1lcmF0aW9uID0gZmlsZVRvb2xzLmNyZWF0ZVJlY3Vyc2l2ZUZpbGVFbnVtZXJhdGlvbihyZW1vdGVEaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZEZldGNoUmVtb3RlQXR0cmlidXRlcywgZS5nZXRNZXNzYWdlKCkpKTsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlQYXRoIHJlbW90ZVJvb3RQYXRoID0gTGludXhQYXRoLmZyb21TdHJpbmcocmVtb3RlRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0JCUlQYXRoIGxvY2FsUm9vdFBhdGggPSBuZXcgUGF0aChsb2NhbERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWludCByZW1vdGVSb290UGF0aExlbmd0aCA9IHJlbW90ZVJvb3RQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkKLQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUV4Y2VwdGlvbnMoKSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZEZldGNoUmVtb3RlQXR0cmlidXRlcywgZW51bWVyYXRpb24ubmV4dEV4Y2VwdGlvbigpKSk7Ci0JCQl9Ci0JCQkKLQkJCSAqIENhbGN1bGF0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByZW1vdGUgcm9vdC4KLQkJCSAqIEdlbmVyYXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJvb3QuCi0JCQkgIAotCQkJSVJlbW90ZUl0ZW0gcmVtb3RlSXRlbSA9IGVudW1lcmF0aW9uLm5leHRFbGVtZW50QXNJdGVtKCk7Ci0JCQlJUGF0aCByZW1vdGVQYXRoID0gTGludXhQYXRoLmZyb21TdHJpbmcocmVtb3RlSXRlbS5nZXRQYXRoKCkpOwotCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gcmVtb3RlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHJlbW90ZVJvb3RQYXRoTGVuZ3RoKTsKLQkJCUlQYXRoIGxvY2FsRmlsZVBhdGggPSBsb2NhbFJvb3RQYXRoLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotCQkJRmlsZSBsb2NhbEZpbGUgPSBsb2NhbEZpbGVQYXRoLnRvRmlsZSgpOwotCQkJaWYgKHJlbW90ZUl0ZW0gaW5zdGFuY2VvZiBJUmVtb3RlRGlyZWN0b3J5KSB7Ci0JCQkJSVJlbW90ZURpcmVjdG9yeSBkaXJlY3RvcnlJdGVtID0gKElSZW1vdGVEaXJlY3RvcnkpIHJlbW90ZUl0ZW07Ci0JCQkJZG9EaXJlY3RvcnlEb3dubG9hZChkaXJlY3RvcnlJdGVtLCBsb2NhbEZpbGUpOwotCQkJfSBlbHNlIGlmIChyZW1vdGVJdGVtIGluc3RhbmNlb2YgSVJlbW90ZUZpbGUpIHsKLQkJCQlJUmVtb3RlRmlsZSBmaWxlSXRlbSA9IChJUmVtb3RlRmlsZSkgcmVtb3RlSXRlbTsKLQkJCQlkb0ZpbGVEb3dubG9hZChmaWxlSXRlbSwgbG9jYWxGaWxlKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUV4Y2VwdGlvbnMoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkRmV0Y2hSZW1vdGVBdHRyaWJ1dGVzLCBlbnVtZXJhdGlvbi5uZXh0RXhjZXB0aW9uKCkpKTsJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvRmlsZURvd25sb2FkKElSZW1vdGVGaWxlIHJlbW90ZUZpbGUsIEZpbGUgbG9jYWxGaWxlKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbEZpbGUuaXNBYnNvbHV0ZSgpLCAibG9jYWxGaWxlLmlzQWJzb2x1dGUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgcmVtb3RlRmlsZUFzU3RyaW5nID0gcmVtb3RlRmlsZS5nZXRQYXRoKCk7Ci0KLQkJSVJlbW90ZUNvcHlUb29scyBjb3B5VG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZUNvcHlUb29scygpOwotCQkJCQotCQkKLQkJICogQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIGlmIGZpbGUgaXMgbmV3ZXIsIGRlcGVuZGluZyBvbiBvdmVyd3JpdGUgcG9saWN5LgotCQkgCi0JCWlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUykgewotCQkJCi0JCQkgKiBGaWxlIGlzIGFsd2F5cyBjb3BpZWQsIG5vIHBvbGljeS4KLQkJCSAKLQkJfSBlbHNlIHsKLQkJCQotCQkJICogUG9saWN5IG5lZWRzIHRvIGNoZWNrIHJlbW90ZSBmaWxlLgotCQkJIAotCQkJaWYgKHJ1bGUuZ2V0T3ZlcndyaXRlUG9saWN5KCkgPT0gT3ZlcndyaXRlUG9saWNpZXMuU0tJUCkgewotCQkJCWlmIChsb2NhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmdEZpbGVFeGlzdHNMb2NhbGx5LCBsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSA9PSBPdmVyd3JpdGVQb2xpY2llcy5ORVdFUikgewotCQkJCWxvbmcgZGlmZmVyZW5jZSA9IHJlbW90ZUZpbGUuZ2V0TW9kaWZpY2F0aW9uVGltZSgpIC0gbG9jYWxGaWxlLmxhc3RNb2RpZmllZCgpOwotCQkJCWlmIChkaWZmZXJlbmNlIDwgMTAwMCkgewotCQkJCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ0TmV3ZXJGaWxlRXhpc3RzTG9jYWxseSwgbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJCXJldHVybjsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSAgCi0JCQotCQkKLQkJICogVXBsb2FkIHRoZSBmaWxlLgotCQkgCi0JCXRyeSB7Ci0JCQljb3B5VG9vbHMuZG93bmxvYWRGaWxlVG9GaWxlKHJlbW90ZUZpbGVBc1N0cmluZywgbG9jYWxGaWxlKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFNldERvd25sb2FkRmlsZSwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQkKLQkJICogU2V0IGZpbGUgcGVybWlzc2lvbnMuIFdlIG5lZWQgaGVscCBvZiBFRlMsIHNpbmNlIHRoZSBGaWxlIGNsYXNzIGZyb20KLQkJICogSmF2YSBkb2VzIG5vdCBwcm92aWRlbCBhbGwgaW5mb3JtYXRpb24uCi0JCSAKLS8vCQlib29sZWFuIHJlYWQgPSByZW1vdGVGaWxlLmlzUmVhZGFibGUoKTsKLQkJYm9vbGVhbiB3cml0ZSA9IHJlbW90ZUZpbGUuaXNXcml0YWJsZSgpOwotCQlib29sZWFuIGV4ZWN1dGUgPSByZW1vdGVGaWxlLmlzRXhlY3V0YWJsZSgpOwotCQkKLQkJaWYgKHJ1bGUuaXNBc1JlYWRPbmx5KCkpIHsKLQkJCXdyaXRlID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSkgewotCQkJZXhlY3V0ZSA9IHRydWU7Ci0JCX0KLQkJCi0JCUlGaWxlU3lzdGVtIGxvY2FsRmlsZVN5c3RlbSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKTsKLQkJSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBsb2NhbEZpbGVTeXN0ZW0uZ2V0U3RvcmUobmV3IFBhdGgobG9jYWxGaWxlLmdldFBhdGgoKSkpOwotCQlJRmlsZUluZm8gZmlsZUluZm8gPSBmaWxlU3RvcmUuZmV0Y2hJbmZvKCk7Ci0KLQkJZmlsZUluZm8uc2V0QXR0cmlidXRlKEVGUy5BVFRSSUJVVEVfRVhFQ1VUQUJMRSwgZXhlY3V0ZSk7Ci0JCWZpbGVJbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX1JFQURfT05MWSwgISB3cml0ZSk7Ci0JCQotCQkKLQkJICogU2V0IGRhdGUvdGltZSwgaWYgcmVxdWlyZWQKLQkJIAotCQlpZiAocnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpIHsKLQkJCWxvbmcgdGltZXN0YW1wID0gcmVtb3RlRmlsZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JCQlmaWxlSW5mby5zZXRMYXN0TW9kaWZpZWQodGltZXN0YW1wKTsKLQkJfQotCQkKLQkJCi0JCSAqIENvbW1pdCBjaGFuZ2VzCi0JCSAKLQkJdHJ5IHsKLQkJCWZpbGVTdG9yZS5wdXRJbmZvKGZpbGVJbmZvLCBFRlMuU0VUX0xBU1RfTU9ESUZJRUQgfCBFRlMuU0VUX0FUVFJJQlVURVMsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFNldExvY2FsRmlsZUF0dHJpYnV0ZXMsIGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGlyZWN0b3J5RG93bmxvYWQoSVJlbW90ZURpcmVjdG9yeSByZW1vdGVEaXIsIEZpbGUgbG9jYWxEaXIpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlBc3NlcnQuaXNUcnVlKGxvY2FsRGlyLmlzQWJzb2x1dGUoKSwgImxvY2FsRmlsZS5pc0Fic29sdXRlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJCi0JCSAqIENyZWF0ZSBsb2NhbCBkaXJlY3RvcnksIGlmIG5vdCBhbHJlYWR5IGV4aXN0cy4KLQkJIAotCQlpZiAoISBsb2NhbERpci5leGlzdHMoKSkgewotCQkJaWYgKCEgbG9jYWxEaXIubWtkaXJzKCkpIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRDcmVhdGVMb2NhbERpcmVjdG9yeSwgbG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkKLQkJCi0JCSAqIFNldCBmaWxlIHBlcm1pc3Npb25zLiBXZSBuZWVkIGhlbHAgb2YgRUZTLCBzaW5jZSB0aGUgRmlsZSBjbGFzcyBmcm9tCi0JCSAqIEphdmEgZG9lcyBub3QgcHJvdmlkZWwgYWxsIGluZm9ybWF0aW9uLgotCQkgCi0vLwkJYm9vbGVhbiByZWFkID0gcmVtb3RlRGlyLmlzUmVhZGFibGUoKTsKLQkJYm9vbGVhbiB3cml0ZSA9IHJlbW90ZURpci5pc1dyaXRhYmxlKCk7Ci0JCWJvb2xlYW4gZXhlY3V0ZSA9IHRydWU7Ci0JCQotCQlpZiAocnVsZS5pc0FzUmVhZE9ubHkoKSkgewotCQkJd3JpdGUgPSBmYWxzZTsKLQkJfQotCQkKLQkJSUZpbGVTeXN0ZW0gbG9jYWxGaWxlU3lzdGVtID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpOwotCQlJRmlsZVN0b3JlIGZpbGVTdG9yZSA9IGxvY2FsRmlsZVN5c3RlbS5nZXRTdG9yZShuZXcgUGF0aChsb2NhbERpci5nZXRQYXRoKCkpKTsKLQkJSUZpbGVJbmZvIGZpbGVJbmZvID0gZmlsZVN0b3JlLmZldGNoSW5mbygpOwotCi0JCWZpbGVJbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX0VYRUNVVEFCTEUsIGV4ZWN1dGUpOwotCQlmaWxlSW5mby5zZXRBdHRyaWJ1dGUoRUZTLkFUVFJJQlVURV9SRUFEX09OTFksICEgd3JpdGUpOwotCQkKLQkJCi0JCSAqIFNldCBkYXRlL3RpbWUsIGlmIHJlcXVpcmVkCi0JCSAKLQkJaWYgKHJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpKSB7Ci0JCQlsb25nIHRpbWVzdGFtcCA9IHJlbW90ZURpci5nZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JCQlmaWxlSW5mby5zZXRMYXN0TW9kaWZpZWQodGltZXN0YW1wKTsKLQkJfQotCQkKLQkJCi0JCSAqIENvbW1pdCBjaGFuZ2VzCi0JCSAKLQkJdHJ5IHsKLQkJCWZpbGVTdG9yZS5wdXRJbmZvKGZpbGVJbmZvLCBFRlMuU0VUX0xBU1RfTU9ESUZJRUQgfCBFRlMuU0VUX0FUVFJJQlVURVMsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFNldExvY2FsRGlyZWN0b3J5QXR0cmlidXRlcywgbG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCX0qLwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvcnVsZXNlbmdpbmUvSUxhdW5jaFByb2Nlc3NDYWxsYmFjay5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3J1bGVzZW5naW5lL0lMYXVuY2hQcm9jZXNzQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ZlYThlOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvcnVsZXNlbmdpbmUvSUxhdW5jaFByb2Nlc3NDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnJ1bGVzZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuSVN5bmNocm9uaXphdGlvblJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVGaWxlTWFuYWdlcjsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayB7Ci0JLy9wdWJsaWMgUHJpbnRXcml0ZXIgZ2V0T3V0cHV0V3JpdGVyKCk7Ci0JLy9wdWJsaWMgUHJpbnRXcml0ZXIgZ2V0RXJyb3JXcml0ZXIoKTsKLQkvL3B1YmxpYyBFeGVjdXRpb25Db25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKLQlwdWJsaWMgSVJlbW90ZUZpbGVNYW5hZ2VyIGdldExvY2FsRmlsZU1hbmFnZXIoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JcHVibGljIElSZW1vdGVGaWxlTWFuYWdlciBnZXRSZW1vdGVGaWxlTWFuYWdlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkvL3B1YmxpYyBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBnZXRFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JcHVibGljIHZvaWQgYWRkU3luY2hyb25pemF0aW9uUnVsZShJU3luY2hyb25pemF0aW9uUnVsZSBkb3dubG9hZEJhY2tSdWxlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9JUnVsZUFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3J1bGVzZW5naW5lL0lSdWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxYzlmZjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3J1bGVzZW5naW5lL0lSdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucnVsZXNlbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElSdWxlQWN0aW9uIHsKLQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9SdWxlQWN0aW9uRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3J1bGVzZW5naW5lL1J1bGVBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwY2U3N2QuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3J1bGVzZW5naW5lL1J1bGVBY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucnVsZXNlbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLkRvd25sb2FkQmFja1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLkRvd25sb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuSVN5bmNocm9uaXphdGlvblJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLlVwbG9hZFJ1bGU7Ci0KLQotcHVibGljIGNsYXNzIFJ1bGVBY3Rpb25GYWN0b3J5IHsKLQkKLQlwcml2YXRlIElMYXVuY2hQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzczsKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwdWJsaWMgUnVsZUFjdGlvbkZhY3RvcnkoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBwcm9jZXNzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgSVJ1bGVBY3Rpb24gZ2V0QWN0aW9uKElTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBEb3dubG9hZFJ1bGUpIHsKLQkJCURvd25sb2FkUnVsZSBkb3dubG9hZFJ1bGUgPSAoRG93bmxvYWRSdWxlKSBydWxlOwotCQkJRG93bmxvYWRSdWxlQWN0aW9uIGFjdGlvbiA9IG5ldyBEb3dubG9hZFJ1bGVBY3Rpb24ocHJvY2VzcywgY29uZmlndXJhdGlvbiwgZG93bmxvYWRSdWxlLCBtb25pdG9yKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0gZWxzZSBpZiAocnVsZSBpbnN0YW5jZW9mIFVwbG9hZFJ1bGUpIHsKLQkJCVVwbG9hZFJ1bGUgdXBsb2FkUnVsZSA9IChVcGxvYWRSdWxlKSBydWxlOwotCQkJVXBsb2FkUnVsZUFjdGlvbiBhY3Rpb24gPSBuZXcgVXBsb2FkUnVsZUFjdGlvbihwcm9jZXNzLCBjb25maWd1cmF0aW9uLCB1cGxvYWRSdWxlLCBtb25pdG9yKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0gZWxzZSBpZiAocnVsZSBpbnN0YW5jZW9mIERvd25sb2FkQmFja1J1bGUpIHsKLQkJCURvd25sb2FkQmFja1J1bGUgdXBsb2FkUnVsZSA9IChEb3dubG9hZEJhY2tSdWxlKSBydWxlOwotCQkJRG93bmxvYWRCYWNrQWN0aW9uIGFjdGlvbiA9IG5ldyBEb3dubG9hZEJhY2tBY3Rpb24ocHJvY2VzcywgY29uZmlndXJhdGlvbiwgdXBsb2FkUnVsZSwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gYWN0aW9uOwotCQl9IGVsc2UgewotCQkJQXNzZXJ0LmlzTGVnYWwoZmFsc2UpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9VcGxvYWRSdWxlQWN0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvcnVsZXNlbmdpbmUvVXBsb2FkUnVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDhhZjUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC9ydWxlc2VuZ2luZS9VcGxvYWRSdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucnVsZXNlbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5QVFBMYXVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLkRvd25sb2FkQmFja1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLk92ZXJ3cml0ZVBvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5VcGxvYWRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwuTGludXhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIFVwbG9hZFJ1bGVBY3Rpb24gaW1wbGVtZW50cyBJUnVsZUFjdGlvbiB7Ci0KLQlwcml2YXRlIGZpbmFsIElMYXVuY2hQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzczsKLQlwcml2YXRlIGZpbmFsIFVwbG9hZFJ1bGUgcnVsZTsKLQkvL3ByaXZhdGUgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCS8vcHJpdmF0ZSBQcmludFdyaXRlciBvdXRwdXRXcml0ZXI7Ci0JLy9wcml2YXRlIFByaW50V3JpdGVyIGVycm9yV3JpdGVyOwotCS8vcHJpdmF0ZSBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyOwotCXByaXZhdGUgZmluYWwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQkvL3ByaXZhdGUgSVJlbW90ZUZpbGVNYW5hZ2VyIHJlbW90ZUZpbGVNYW5hZ2VyOwotCS8vcHJpdmF0ZSBJUmVtb3RlRmlsZU1hbmFnZXIgbG9jYWxGaWxlTWFuYWdlcjsKLQlwcml2YXRlIERvd25sb2FkQmFja1J1bGUgZG93bmxvYWRCYWNrUnVsZTsKLQlwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXB1YmxpYyBVcGxvYWRSdWxlQWN0aW9uKElMYXVuY2hQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzcywgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLQkJCVVwbG9hZFJ1bGUgdXBsb2FkUnVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucnVsZSA9IHVwbG9hZFJ1bGU7Ci0JCS8qY29uZmlndXJhdGlvbiA9IHByb2Nlc3MuZ2V0Q29uZmlndXJhdGlvbigpOwotCQlvdXRwdXRXcml0ZXIgPSBwcm9jZXNzLmdldE91dHB1dFdyaXRlcigpOwotCQllcnJvcldyaXRlciA9IHByb2Nlc3MuZ2V0RXJyb3JXcml0ZXIoKTsqLwotCQkvL21hbmFnZXIgPSBwcm9jZXNzLmdldEV4ZWN1dGlvbk1hbmFnZXIoKTsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQotCQkvL3JlbW90ZUZpbGVNYW5hZ2VyID0gcHJvY2Vzcy5nZXRSZW1vdGVGaWxlTWFuYWdlcihjb25maWd1cmF0aW9uKTsKLQkJLy9sb2NhbEZpbGVNYW5hZ2VyID0gcHJvY2Vzcy5nZXRMb2NhbEZpbGVNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwcm9jZXNzKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChydWxlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb25maWd1cmF0aW9uKTsKLQotCQkvLyBUaGUgYWN0dWFsIGludGVyZmFjZSBkb2Vzbid0IHByb3ZpZGUgYSB3YXkgdG8gY2hlY2sgdGhlIHJlbW90ZSB0aW1lLAotCQkvLyBzZSB3ZSBhc3N1bWUgdGhlIGNsb2NrcyBhcmUgc3luY2hyb25pemVkLgotCQkvKgotCQkgKiBJZiBvdmVyd3JpdGUgcG9saWN5IGRlcGVuZHMgb24gdGltZSwgdGhlbiBnZXQgcmVtb3RlIGNsb2NrIHNrZXcuCi0JCSAqLwotCQkvKmlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSKSB7Ci0JCQlJUmVtb3RlU3RhdHVzVG9vbHMgc3RhdHVzVG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZVN0YXR1c1Rvb2xzKCk7Ci0JCQlsb25nIGxvY2FsVGltZTsKLQkJCWxvbmcgcmVtb3RlVGltZTsKLQkJCXRyeSB7Ci0JCQkJbG9jYWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJcmVtb3RlVGltZSA9IHN0YXR1c1Rvb2xzLmdldFRpbWUoKTsKLQkJCQljbG9ja1NrZXcgPSBsb2NhbFRpbWUgLXJlbW90ZVRpbWU7Ci0JCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCBjYWxjdWxhdGUgY2xvY2sgZGlmZmVyZW5jZSB3aXRoIHJlbW90ZSBob3N0OiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oIiAgIEFzc3VtaW5nIHNhbWUgYSByZW1vdGUgY2xvY2sgc3luY2hyb25pemVkIHdpdGggbG9jYWwgY2xvY2suIik7Ci0JCQkJY2xvY2tTa2V3ID0gMDsKLQkJCX0KLQkJCWlmIChjbG9ja1NrZXcgPCAtMTUwMDApIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKCIgICBXYXJuaW5nISBDbG9jayBhdCByZW1vdGUgdGFyZ2V0IGlzIG1vcmUgcmVjZW50IHRoYW4gbG9jYWwgY2xvY2suIEZpbGUgc3luY2hyb25pemF0aW9uIG1heSBub3QgYmUgY29ycmVjdC4iKTsKLQkJCX0gZWxzZSBpZiAoY2xvY2tTa2V3ID4gMTUwMDApIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKCIgICBXYXJuaW5nISBDbG9jayBhdCByZW1vdGUgdGFyZ2V0IGlzIG9sZGVyIHRoYW4gbG9jYWwgY2xvY2suIEZpbGUgc3luY2hyb25pemF0aW9uIG1heSBub3QgYmUgY29ycmVjdC4iKTsKLQkJCX0KLQkJfSovCi0KLQkJLyoKLQkJICogRGV0ZXJtaW5lIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSByZW1vdGUgcGF0aC4gTWFrZSBpdCBhYnNvbHV0ZS4KLQkJICovCi0JCVN0cmluZyBleGVjUGF0aCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfRVhFQ1VUQUJMRV9QQVRILCAoU3RyaW5nKW51bGwpOwotCi0KLQkJSVBhdGggZGVmYXVsdFJlbW90ZVBhdGggPSBMaW51eFBhdGguZnJvbVN0cmluZyhleGVjUGF0aCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOy8vY29uZmlndXJhdGlvbi5nZXRSZW1vdGVEaXJlY3RvcnlQYXRoKCk7Ci0JCUlQYXRoIHJlbW90ZVBhdGhQYXJlbnQgPSBudWxsOwotCQlpZiAocnVsZS5pc0RlZmF1bHRSZW1vdGVEaXJlY3RvcnkoKSkgewotCQkJcmVtb3RlUGF0aFBhcmVudCA9IGRlZmF1bHRSZW1vdGVQYXRoOwotCQl9IGVsc2UgewotCQkJcmVtb3RlUGF0aFBhcmVudCA9IExpbnV4UGF0aC5mcm9tU3RyaW5nKHJ1bGUuZ2V0UmVtb3RlRGlyZWN0b3J5KCkpOwotCQkJaWYgKCEgcmVtb3RlUGF0aFBhcmVudC5pc0Fic29sdXRlKCkpIHsKLQkJCQlyZW1vdGVQYXRoUGFyZW50ID0gZGVmYXVsdFJlbW90ZVBhdGguYXBwZW5kKHJlbW90ZVBhdGhQYXJlbnQpOwotCQkJfQotCQl9Ci0JCXJlbW90ZVBhdGhQYXJlbnQgPSByZW1vdGVQYXRoUGFyZW50LnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCUFzc2VydC5pc1RydWUocmVtb3RlUGF0aFBhcmVudC5pc0Fic29sdXRlKCksICJyZW1vdGVQYXRoV29MYXN0U2VnbWVudC5pc0Fic29sdXRlKCkiKTsKLQotCQkvKi8vIEdlbmVyYXRlIHRoZSBGaWxlU3RvcmUgZm9yIHRoZSByZW1vdGUgcGF0aAotCQlJRmlsZVN0b3JlIHJlbW90ZUZpbGVTdG9yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVGaWxlU3RvcmUgPSByZW1vdGVGaWxlTWFuYWdlci5nZXRSZXNvdXJjZShyZW1vdGVQYXRoLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uUExVR0lOX0lELCAiRXJyb3IgcmV0cmlldmluZyByZW1vdGUgcmVzb3VyY2UiLCBlMSkpOwotCQl9Ki8KLQotCQkvLyBSZXRyaWV2ZSB0aGUgbG9jYWwgd29ya2luZyBkaXIgKHdvcmtzcGFjZSBwYXRoKQotCQlJUGF0aCB3b3JraW5nRGlyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkvL0lQYXRoIHdvcmtpbmdEaXIgPSBuZXcgUGF0aChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktfRElSRUNUT1JZLCAiIikpOwotCi0JCS8qCi0JCSAqIERldGVybWluZSBsaXN0IG9mIGxvY2FsIHBhdGhzLiBNYWtlIHRoZW0gYWJzb2x1dGUuCi0JCSAqLwotCQlJUGF0aCBsb2NhbFBhdGhzIFtdID0gcnVsZS5nZXRMb2NhbEZpbGVzQXNQYXRoQXJyYXkoKTsKLQkJLy9JUGF0aCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBsb2NhbFBhdGggPSBsb2NhbFBhdGhzW2ldOwotCQkJaWYgKCFsb2NhbFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJbG9jYWxQYXRoID0gd29ya2luZ0Rpci5hcHBlbmQobG9jYWxQYXRoKTsKLQkJCX0KLQkJCWxvY2FsUGF0aCA9IGxvY2FsUGF0aC5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbFBhdGguaXNBYnNvbHV0ZSgpLCAibG9jYWxQYXRoLmlzQWJzb2x1dGUoKSIpOwotCQkJbG9jYWxQYXRoc1tpXSA9IGxvY2FsUGF0aDsKLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgcGF0aHMuCi0JCSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIGxvY2FsUGF0aCA9IGxvY2FsUGF0aHNbaV07Ci0KLQkJCUlGaWxlU3RvcmUgbG9jYWxGaWxlU3RvcmUgPSBudWxsOwotCi0JCQl0cnkgewotCQkJCUlSZW1vdGVGaWxlTWFuYWdlciBsb2NhbEZpbGVNYW5hZ2VyID0gcHJvY2Vzcy5nZXRMb2NhbEZpbGVNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQkJCWxvY2FsRmlsZVN0b3JlID0gbG9jYWxGaWxlTWFuYWdlci5nZXRSZXNvdXJjZShsb2NhbFBhdGgsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uUExVR0lOX0lELCAiRXJyb3IgcmV0cmlldmluZyBsb2NhbCByZXNvdXJjZSIsIGUpKTsKLQkJCX0KLQkJCUlGaWxlSW5mbyBsb2NhbEZpbGVJbmZvID0gbG9jYWxGaWxlU3RvcmUuZmV0Y2hJbmZvKCk7Ci0KLQkJCWlmKCFsb2NhbEZpbGVJbmZvLmV4aXN0cygpKSB7Ci0JCQkJLy8gV2FybiB1c2VyIGFuZCBnbyB0byB0aGUgbmV4dCBmaWxlCi0JCQkJLy8gVE9ETyBXYXJuIHVzZXJzIHRoYXQgZmlsZSBkb2Vzbid0IGV4aXN0Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBlbnRpcmUgcGF0aCBmcm9tIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgcmVtb3RlUGF0aFBhcmVudAotCQkJLy8gYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIGNvcGllZC4KLQkJCUlQYXRoIHJlbW90ZVBhdGggPSByZW1vdGVQYXRoUGFyZW50LmFwcGVuZChsb2NhbFBhdGgubGFzdFNlZ21lbnQoKSk7Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBGaWxlU3RvcmUgZm9yIHRoZSByZW1vdGUgcGF0aAotCQkJSUZpbGVTdG9yZSByZW1vdGVGaWxlU3RvcmUgPSBudWxsOwotCQkJSVJlbW90ZUZpbGVNYW5hZ2VyIHJlbW90ZUZpbGVNYW5hZ2VyID0gcHJvY2Vzcy5nZXRSZW1vdGVGaWxlTWFuYWdlcihjb25maWd1cmF0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJcmVtb3RlRmlsZVN0b3JlID0gcmVtb3RlRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UocmVtb3RlUGF0aCwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uUExVR0lOX0lELCAiRXJyb3IgcmV0cmlldmluZyByZW1vdGUgcmVzb3VyY2UiLCBlMSkpOwotCQkJfQotCi0JCQkvKgotCQkJICogQXNzdXJlIHRoZSByZW1vdGUgcGF0aCBleGlzdHMuCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJSUZpbGVTdG9yZSBwYXJlbnRGaWxlU3RvcmUgPSByZW1vdGVGaWxlTWFuYWdlci5nZXRSZXNvdXJjZShyZW1vdGVQYXRoUGFyZW50LCBtb25pdG9yKTsKLQkJCQlwYXJlbnRGaWxlU3RvcmUubWtkaXIoRUZTLk5PTkUsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLlBMVUdJTl9JRCwgIkVycm9yIHJldHJpZXZpbmcgcmVtb3RlIHJlc291cmNlIiwgZTEpKTsKLQkJCX0KLQotCi0JCQlkb1VwbG9hZChsb2NhbEZpbGVTdG9yZSwgbG9jYWxQYXRoLCByZW1vdGVGaWxlU3RvcmUsIHJlbW90ZVBhdGgpOwotCi0JCQkvL2lmKGxvY2FsRmlsZVN0b3JlLmZldGNoSW5mbygpLmlzRGlyZWN0b3J5KCkpCi0KLQkJCS8vRmlsZSBsb2NhbEZpbGUgPSBsb2NhbFBhdGgudG9GaWxlKCk7Ci0JCQkvKmlmICghIGxvY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCS8vIFRPRE8gV2FybiB0aGF0IGZpbGUgZG9lc24ndCBleGlzdHMKLQkJCQkvL2Vycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIElnbm9yaW5nIHswfTogUGF0aCBkb2VzIG5vdCBleGlzdCBsb2NhbGx5IiwgbG9jYWxGaWxlLnRvU3RyaW5nKCkpKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobG9jYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl1cGxvYWREaXJlY3RvcnkobG9jYWxGaWxlLCByZW1vdGVQYXRoKTsKLQkJCX0gZWxzZSBpZiAobG9jYWxGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJdXBsb2FkRmlsZShsb2NhbEZpbGUsIHJlbW90ZVBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQkvL2Vycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIElnbm9yaW5nIHswfTogUGF0aCBpcyBub3QgYSBmaWxlIG5vciBkaXJlY3RvcnkiLCBsb2NhbEZpbGUudG9TdHJpbmcoKSkpOwotCQkJCWNvbnRpbnVlOwotCQkJfSovCi0JCX0KLQotCQkvKgotCQkgKiBJZiBhIGRvd25sb2FkIGJhY2sgcnVsZSB3YXMgY3JlYXRlZCBkdXJpbmcgdGhlIHVwbG9hZCwKLQkJICogdGhlIGFkZCB0aGlzIHJ1bGUgdGhlIHRoZSBsaXN0IG9mIHN5bmNocm9uaXplIHJ1bGVzLgotCQkgKi8KLQkJaWYgKGRvd25sb2FkQmFja1J1bGUgIT0gbnVsbCkgewotCQkJcHJvY2Vzcy5hZGRTeW5jaHJvbml6YXRpb25SdWxlKGRvd25sb2FkQmFja1J1bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvVXBsb2FkKElGaWxlU3RvcmUgbG9jYWxGaWxlU3RvcmUsIElQYXRoIGxvY2FsUGF0aCwKLQkJCUlGaWxlU3RvcmUgcmVtb3RlRmlsZVN0b3JlLCBJUGF0aCByZW1vdGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEZldGNoIHJlbW90ZUZpbGVTdG9yZSBpbmZvCi0JCUlGaWxlSW5mbyByZW1vdGVGaWxlSW5mbyA9IHJlbW90ZUZpbGVTdG9yZS5mZXRjaEluZm8oRUZTLk5PTkUsIG1vbml0b3IpOwotCi0JCS8vIEZldGNoIGxvY2FsRmlsZVN0b3JlIGluZm8KLQkJSUZpbGVJbmZvIGxvY2FsRmlsZUluZm8gPSBsb2NhbEZpbGVTdG9yZS5mZXRjaEluZm8oKTsKLQotCQkvLyBGaW5kIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgb24gdGhlIHJlbW90ZSBtYWNoaW5lCi0JCWlmKHJlbW90ZUZpbGVJbmZvLmV4aXN0cygpKSB7Ci0JCQlzd2l0Y2gocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSkgewotCQkJY2FzZSBPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVM6Ci0JCQkJLy8gQWx3YXlzIGNvcHkgYW55d2F5Li4uCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSOgotCQkJCWxvbmcgZHVwRmlsZU1vZFRpbWUsIGxvY2FsRmlsZU1vZFRpbWU7Ci0JCQkJZHVwRmlsZU1vZFRpbWUgPSByZW1vdGVGaWxlSW5mby5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlsb2NhbEZpbGVNb2RUaW1lID0gbG9jYWxGaWxlSW5mby5nZXRMYXN0TW9kaWZpZWQoKTsKLQotCQkJCWlmKGR1cEZpbGVNb2RUaW1lID49IGxvY2FsRmlsZU1vZFRpbWUpIHsKLQkJCQkJLy8gUmVtb3RlIGZpbGUgaXMgbmV3ZXIuIFNraXAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gU0tJUAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIFVwbG9hZCBmaWxlIG9yIGRpcmVjdG9yeQotCQlsb2NhbEZpbGVTdG9yZS5jb3B5KHJlbW90ZUZpbGVTdG9yZSwgRUZTLk9WRVJXUklURSwgbW9uaXRvcik7Ci0KLQkJLy8gQWRkIHJlbW90ZSBwYXRoIHRvIGxpc3Qgb2YgZmlsZXMgdG8gZG93bmxvYWQgYmFjaywKLQkJLy8gaWYgdGhpcyBmZWF0dXJlIHdhcyBlbmFibGVkLgotCQlpZiAocnVsZS5pc0Rvd25sb2FkQmFjaygpKSB7Ci0JCQlpZiAoZG93bmxvYWRCYWNrUnVsZSA9PSBudWxsKSB7Ci0JCQkJZG93bmxvYWRCYWNrUnVsZSA9IG5ldyBEb3dubG9hZEJhY2tSdWxlKCk7Ci0JCQl9Ci0JCQlkb3dubG9hZEJhY2tSdWxlLmFkZChsb2NhbFBhdGgudG9GaWxlKCksIHJlbW90ZVBhdGgpOwotCQl9Ci0KLQkJLyogU2V0IHJlbW90ZSBmaWxlIHBlcm1pc3Npb25zIGZyb20gdGhlIGxvY2FsICovCi0JCWJvb2xlYW4gY2hhbmdlZEF0dHIgPSBmYWxzZTsKLQkJaWYgKHJ1bGUuaXNBc1JlYWRPbmx5KCkpIHsKLQkJCXJlbW90ZUZpbGVJbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX1JFQURfT05MWSwgdHJ1ZSk7Ci0JCQljaGFuZ2VkQXR0ciA9IHRydWU7Ci0JCX0KLQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSkgewotCQkJcmVtb3RlRmlsZUluZm8uc2V0QXR0cmlidXRlKEVGUy5BVFRSSUJVVEVfRVhFQ1VUQUJMRSwgdHJ1ZSk7Ci0JCQljaGFuZ2VkQXR0ciA9IHRydWU7Ci0JCX0KLQkJaWYoY2hhbmdlZEF0dHIpIHsKLQkJCXJlbW90ZUZpbGVTdG9yZS5wdXRJbmZvKHJlbW90ZUZpbGVJbmZvLCBFRlMuU0VUX0FUVFJJQlVURVMsIG1vbml0b3IpOwotCQl9Ci0KLQkJIC8vIFNldCBkYXRlL3RpbWUsIGlmIHJlcXVpcmVkCi0JCWlmIChydWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSkgewotCQkJcmVtb3RlRmlsZUluZm8uc2V0TGFzdE1vZGlmaWVkKGxvY2FsRmlsZUluZm8uZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJcmVtb3RlRmlsZVN0b3JlLnB1dEluZm8ocmVtb3RlRmlsZUluZm8sIEVGUy5TRVRfTEFTVF9NT0RJRklFRCwgbW9uaXRvcik7Ci0JCX0KLQotCX0KLQkvKnByaXZhdGUgdm9pZCB1cGxvYWRGaWxlKEZpbGUgbG9jYWxGaWxlLCBJUGF0aCByZW1vdGVEaXJlY3RvcnlQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbEZpbGUuaXNBYnNvbHV0ZSgpLCAibG9jYWxGaWxlLmlzQWJzb2x1dGUoKSIpOwotCQlBc3NlcnQuaXNUcnVlKHJlbW90ZURpcmVjdG9yeVBhdGguaXNBYnNvbHV0ZSgpLCAicmVtb3RlRGlyZWN0b3J5UGF0aC5pc0Fic29sdXRlKCkiKTsKLQotCQlJUGF0aCByZW1vdGVGaWxlID0gcmVtb3RlRGlyZWN0b3J5UGF0aC5hcHBlbmQobG9jYWxGaWxlLmdldE5hbWUoKSk7Ci0JCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDb3B5aW5nIGZpbGUgezB9IChsb2NhbCkiLCBsb2NhbEZpbGUudG9TdHJpbmcoKSkpOwotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgdG8gZmlsZSB7MH0gKHJlbW90ZSkiLCBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlRmlsZSkpKTsKLQotCQlkb0ZpbGVVcGxvYWQobG9jYWxGaWxlLCByZW1vdGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9GaWxlVXBsb2FkKEZpbGUgbG9jYWxGaWxlLCBJUGF0aCByZW1vdGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghIGxvY2FsRmlsZS5leGlzdHMoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgSWdub3JpbmcgezB9OiBGaWxlIGRvZXMgbm90IGV4aXN0IGxvY2FsbHkiLCBsb2NhbEZpbGUudG9TdHJpbmcoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbEZpbGUuaXNBYnNvbHV0ZSgpLCAibG9jYWxGaWxlLmlzQWJzb2x1dGUoKSIpOwotCQlBc3NlcnQuaXNUcnVlKGxvY2FsRmlsZS5pc0ZpbGUoKSwgImxvY2FsRmlsZS5pc0ZpbGUoKSIpOwotCQlBc3NlcnQuaXNUcnVlKHJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpLCAicmVtb3RlUGF0aC5pc0Fic29sdXRlKCkiKTsKLQotCQlTdHJpbmcgcmVtb3RlUGF0aEFzU3RyaW5nID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCi0JCUlSZW1vdGVDb3B5VG9vbHMgY29weVRvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVDb3B5VG9vbHMoKTsKLQkJSVJlbW90ZUZpbGVUb29scyBmaWxlVG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZUZpbGVUb29scygpOwotCi0KLQkJICogQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIGlmIGZpbGUgaXMgbmV3ZXIsIGRlcGVuZGluZyBvbiBvdmVyd3JpdGUgcG9saWN5LgotCi0JCWlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUykgewotCi0JCQkgKiBGaWxlIGlzIGFsd2F5cyBjb3BpZWQsIG5vIHBvbGljeS4KLQotCQl9IGVsc2UgewotCi0JCQkgKiBQb2xpY3kgbmVlZHMgdG8gY2hlY2sgcmVtb3RlIGZpbGUuCi0KLQkJCUlSZW1vdGVGaWxlIHJlbW90ZUZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZW1vdGVGaWxlID0gZmlsZVRvb2xzLmdldEZpbGUocmVtb3RlUGF0aEFzU3RyaW5nKTsKLQkJCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ291bGQgbm90IGZldGNoIHByb3BlcnRpZXMgZm9yIHJlbW90ZSBmaWxlLCBpZ25vcmluZyBpdDogezB9IiwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSA9PSBPdmVyd3JpdGVQb2xpY2llcy5TS0lQKSB7Ci0JCQkJaWYgKHJlbW90ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIEZpbGUgYWxyZWR5IGV4aXN0cyBvbiByZW1vdGUgdGFyZ2V0LCBpZ25vcmluZyBpdDogezB9IiwgcmVtb3RlUGF0aCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSKSB7Ci0JCQkJbG9uZyBkaWZmZXJlbmNlID0gbG9jYWxGaWxlLmxhc3RNb2RpZmllZCgpIC0gcmVtb3RlRmlsZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JCQkJaWYgKGRpZmZlcmVuY2UgPCAxMDAwKSB7Ci0JCQkJCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBBIG5ld2VyIGZpbGUgYWxyZWR5IGV4aXN0cyBvbiByZW1vdGUgdGFyZ2V0LCBpZ25vcmluZyBpdDogezB9IiwgcmVtb3RlUGF0aCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQkgKiBVcGxvYWQgdGhlIGZpbGUuCi0KLQkJdHJ5IHsKLQkJCWNvcHlUb29scy51cGxvYWRGaWxlVG9GaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aEFzU3RyaW5nKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCB1cGxvYWQgZmlsZTogezB9IiwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJICogQWRkIGZpbGUgdG8gbGlzdCBvZiBmaWxlcyB0byBkb3dubG9hZCBiYWNrLCBpZiB0aGlzIGZlYXR1cmUgd2FzIGVuYWJsZWQuCi0KLQkJaWYgKHJ1bGUuaXNEb3dubG9hZEJhY2soKSkgewotCQkJaWYgKGRvd25sb2FkQmFja1J1bGUgPT0gbnVsbCkgewotCQkJCWRvd25sb2FkQmFja1J1bGUgPSBuZXcgRG93bmxvYWRCYWNrUnVsZSgpOwotCQkJfQotCQkJZG93bmxvYWRCYWNrUnVsZS5hZGQobG9jYWxGaWxlLCByZW1vdGVQYXRoKTsKLQkJfQotCi0KLQkJICogRmV0Y2ggcHJvcGVydGllcyBvZiBmaWxlIHRoYXQgd2FzIGp1c3QgdXBsb2FkZWQuCi0KLQkJSVJlbW90ZUZpbGUgcmVtb3RlRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVGaWxlID0gZmlsZVRvb2xzLmdldEZpbGUocmVtb3RlUGF0aEFzU3RyaW5nKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCBmZXRjaCBwcm9wZXJ0aWVzIGZvciB1cGxvYWRlZCBmaWxlOiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQkgKiBTZXQgZmlsZSBwZXJtaXNzaW9ucy4gV2UgbmVlZCBoZWxwIG9mIEVGUywgc2luY2UgdGhlIEZpbGUgY2xhc3MgZnJvbQotCQkgKiBKYXZhIGRvZXMgbm90IHByb3ZpZGVsIGFsbCBpbmZvcm1hdGlvbi4KLQotCQlJRmlsZVN5c3RlbSBsb2NhbEZpbGVTeXN0ZW0gPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCk7Ci0JCUlGaWxlU3RvcmUgZmlsZVN0b3JlID0gbG9jYWxGaWxlU3lzdGVtLmdldFN0b3JlKG5ldyBQYXRoKGxvY2FsRmlsZS5nZXRQYXRoKCkpKTsKLQkJSUZpbGVJbmZvIGZpbGVJbmZvID0gZmlsZVN0b3JlLmZldGNoSW5mbygpOwotCi0JCWJvb2xlYW4gcmVhZCA9IGxvY2FsRmlsZS5jYW5SZWFkKCk7Ci0JCWJvb2xlYW4gd3JpdGUgPSBsb2NhbEZpbGUuY2FuV3JpdGUoKTsKLQkJYm9vbGVhbiBleGVjdXRlID0gZmlsZUluZm8uZ2V0QXR0cmlidXRlKEVGUy5BVFRSSUJVVEVfRVhFQ1VUQUJMRSk7Ci0KLQkJaWYgKHJ1bGUuaXNBc1JlYWRPbmx5KCkpIHsKLQkJCXdyaXRlID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSkgewotCQkJZXhlY3V0ZSA9IHRydWU7Ci0JCX0KLQotCQlyZW1vdGVGaWxlLnNldEV4ZWN1dGFibGUoZXhlY3V0ZSk7Ci0JCXJlbW90ZUZpbGUuc2V0V3JpdGVhYmxlKHdyaXRlKTsKLQkJcmVtb3RlRmlsZS5zZXRSZWFkYWJsZShyZWFkKTsKLQotCi0JCSAqIFNldCBkYXRlL3RpbWUsIGlmIHJlcXVpcmVkCi0KLQkJaWYgKHJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpKSB7Ci0JCQlsb25nIHRpbWVzdGFtcCA9IGxvY2FsRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCXJlbW90ZUZpbGUuc2V0TW9kaWZpY2F0aW9uVGltZSh0aW1lc3RhbXApOwotCQl9Ci0KLQotCQkgKiBDb21taXQgY2hhbmdlcwotCi0JCXRyeSB7Ci0JCQlyZW1vdGVGaWxlLmNvbW1pdEF0dHJpYnV0ZXMoKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCB3cml0ZSBwcm9wZXJ0aWVzIGZvciB1cGxvYWRlZCBmaWxlOiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGlyZWN0b3J5VXBsb2FkKEZpbGUgbG9jYWxEaXIsIElQYXRoIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlpZiAoISBsb2NhbERpci5leGlzdHMoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgSWdub3JpbmcgezB9OiBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgbG9jYWxseSIsIGxvY2FsRGlyLnRvU3RyaW5nKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFzc2VydC5pc1RydWUobG9jYWxEaXIuaXNEaXJlY3RvcnkoKSwgImxvY2FsRmlsZS5pc0RpcmVjdG9yeSgpIik7Ci0JCUFzc2VydC5pc1RydWUobG9jYWxEaXIuaXNBYnNvbHV0ZSgpLCAibG9jYWxGaWxlLmlzQWJzb2x1dGUoKSIpOwotCQlBc3NlcnQuaXNUcnVlKHJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpLCAicmVtb3RlUGF0aC5pc0Fic29sdXRlKCkiKTsKLQotCQlJUmVtb3RlRmlsZVRvb2xzIGZpbGVUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlRmlsZVRvb2xzKCk7Ci0KLQotCQkgKiBDcmVhdGUgcmVtb3RlIGRpcmVjdG9yeSBpZiBub3QgYWxyZWFkeSBleGlzdHMuCi0KLQkJdHJ5IHsKLQkJCWZpbGVUb29scy5hc3N1cmVEaXJlY3RvcnkoTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCBjcmVhdGUgcmVtb3RlIGRpcmVjdG9yeTogezB9IiwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJICogRmV0Y2ggcHJvcGVydGllcyBvZiBkaXJlY3RvcnkgdGhhdCB3YXMganVzdCB1cGxvYWRlZC4KLQotCQlJUmVtb3RlRGlyZWN0b3J5IHJlbW90ZURpcmVjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVEaXJlY3RvcnkgPSBmaWxlVG9vbHMuZ2V0RGlyZWN0b3J5KExpbnV4UGF0aC50b1N0cmluZyhyZW1vdGVQYXRoKSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDb3VsZCBub3QgZmV0Y2ggcHJvcGVydGllcyBmb3IgY3JlYXRlZCByZW1vdGUgZGlyZWN0b3J5OiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQkgKiBTZXQgZmlsZSBwZXJtaXNzaW9ucy4KLQotCQlib29sZWFuIHJlYWQgPSBsb2NhbERpci5jYW5SZWFkKCk7Ci0JCWJvb2xlYW4gd3JpdGUgPSBsb2NhbERpci5jYW5Xcml0ZSgpOwotCQlib29sZWFuIGV4ZWN1dGUgPSB0cnVlOwotCi0JCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQl3cml0ZSA9IGZhbHNlOwotCQl9Ci0KLQkJcmVtb3RlRGlyZWN0b3J5LnNldEFjY2Vzc2libGUoZXhlY3V0ZSk7Ci0JCXJlbW90ZURpcmVjdG9yeS5zZXRXcml0ZWFibGUod3JpdGUpOwotCQlyZW1vdGVEaXJlY3Rvcnkuc2V0UmVhZGFibGUocmVhZCk7Ci0KLQotCQkgKiBTZXQgZGF0ZS90aW1lLCBpZiByZXF1aXJlZAotCi0JCWlmIChydWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSkgewotCQkJbG9uZyB0aW1lc3RhbXAgPSBsb2NhbERpci5sYXN0TW9kaWZpZWQoKTsKLQkJCXJlbW90ZURpcmVjdG9yeS5zZXRNb2RpZmljYXRpb25UaW1lKHRpbWVzdGFtcCk7Ci0JCX0KLQotCi0JCSAqIENvbW1pdCBjaGFuZ2VzCi0KLQkJdHJ5IHsKLQkJCXJlbW90ZURpcmVjdG9yeS5jb21taXRBdHRyaWJ1dGVzKCk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDb3VsZCBub3Qgd3JpdGUgcHJvcGVydGllcyBmb3IgdXBsb2FkZWQgZGlyZWN0b3J5OiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdXBsb2FkRGlyZWN0b3J5KEZpbGUgbG9jYWxEaXIsIElQYXRoIHJlbW90ZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlBc3NlcnQuaXNUcnVlKGxvY2FsRGlyLmlzQWJzb2x1dGUoKSwgImxvY2FsRGlyLmlzQWJzb2x1dGUoKSIpOwotCQlBc3NlcnQuaXNUcnVlKHJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpLCAicmVtb3RlUGF0aC5pc0Fic29sdXRlKCkiKTsKLQotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ29weWluZyBjb250ZW50cyBvZiBkaXJlY3RvcnkgezB9IChsb2NhbCkiLCBsb2NhbERpci50b1N0cmluZygpKSk7Ci0JCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBpbnRvIGRpcmVjdG9yeSB7MH0gKHJlbW90ZSkiLCBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlUGF0aCkpKTsKLQotCQlGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBudWxsOwotCQllbnVtZXJhdGlvbiA9IG5ldyBGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24obG9jYWxEaXIpOwotCi0JCUlQYXRoIHJvb3RQYXRoID0gbmV3IFBhdGgobG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlpbnQgcm9vdFBhdGhMZW5ndGggPSByb290UGF0aC5zZWdtZW50Q291bnQoKTsKLQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUV4Y2VwdGlvbnMoKSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCByZWFkIGZpbGUvZGlyZWN0b3J5OiB7MH0iLCBlbnVtZXJhdGlvbi5uZXh0RXhjZXB0aW9uKCkpKTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCUlQYXRoIHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdFBhdGhMZW5ndGgpOwotCQkJSVBhdGggcmVtb3RlRmlsZVBhdGggPSByZW1vdGVQYXRoLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDcmVhdGUgcmVtb3RlIGRpcmVjdG9yeSB7MH0iLCBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlRmlsZVBhdGgpKSk7Ci0JCQkJZG9EaXJlY3RvcnlVcGxvYWQoZmlsZSwgcmVtb3RlRmlsZVBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgVXBsb2FkIHswfSIsIExpbnV4UGF0aC50b1N0cmluZyhyZWxhdGl2ZVBhdGgpKSk7Ci0JCQkJZG9GaWxlVXBsb2FkKGZpbGUsIHJlbW90ZUZpbGVQYXRoKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUV4Y2VwdGlvbnMoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ291bGQgbm90IHJlYWQgZmlsZS9kaXJlY3Rvcnk6IHswfSIsIGVudW1lcmF0aW9uLm5leHRFeGNlcHRpb24oKSkpOwotCQl9Ci0JfSovCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvQXBwbGljYXRpb25UYWIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9BcHBsaWNhdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2U1ZmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9BcHBsaWNhdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLlBUUExhdW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLnVpLkxhdW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLlBUUFJlbW90ZUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuUFRQUmVtb3RlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS5jb3JlLkFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkJhc2VXb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgTWFpbiB0YWIgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbGF1bmNoLAotICogc2VsZWN0IHRoZSBwcm9qZWN0IGFuZCBleGVjdXRhYmxlIHRvIGxhdW5jaCwgYW5kIHNwZWNpZnkgdGhlIGxvY2F0aW9uCi0gKiBvZiB0aGUgZXhlY3V0YWJsZSBpZiBpdCBpcyBhIHJlbW90ZSBsYXVuY2guCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblRhYiBleHRlbmRzIExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCXByb3RlY3RlZCBjbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gcHJvakJ1dHRvbikgewotCQkJCWhhbmRsZVByb2plY3RCdXR0b25TZWxlY3RlZCgpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gYXBwQnV0dG9uKSB7Ci0JCQkJaGFuZGxlQXBwbGljYXRpb25CdXR0b25TZWxlY3RlZCgpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gY29uc29sZUJ1dHRvbikgewotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0gZWxzZSBpZiAoc291cmNlID09IGxvY2FsQXBwQnV0dG9uKSB7Ci0JCQkJaGFuZGxlTG9jYWxBcHBsaWNhdGlvbkJ1dHRvblNlbGVjdGVkKCk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gYnJvd3NlQXBwQnV0dG9uKSB7Ci0JCQkJaGFuZGxlQnJvd3NlTG9jYWxBcHBsaWNhdGlvbkJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBwcm9qVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgYXBwVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYWxBcHBUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHByb2pCdXR0b24gPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYXBwQnV0dG9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUFwcEJ1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBsb2NhbEFwcEJ1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjb25zb2xlQnV0dG9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgV2lkZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldENvbnRyb2woY29tcCk7Ci0KLQkJY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIG1haW5Db21wID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCW1haW5Db21wLnNldExheW91dChjcmVhdGVHcmlkTGF5b3V0KDIsIGZhbHNlLCAwLCAwKSk7Ci0JCW1haW5Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIHByb2pMYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULk5PTkUpOwotCQlwcm9qTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9Qcm9qZWN0X0xhYmVsKTsKLQkJcHJvakxhYmVsLnNldExheW91dERhdGEoc3BhbkdyaWREYXRhKC0xLCAyKSk7Ci0KLQkJcHJvalRleHQgPSBuZXcgVGV4dChtYWluQ29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlwcm9qVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvalRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXByb2pCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKG1haW5Db21wLCBNZXNzYWdlcy5UYWJfY29tbW9uX0Jyb3dzZV8xLCBudWxsKTsKLQkJcHJvakJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJY3JlYXRlVmVydGljYWxTcGFjZXIoY29tcCwgMSk7Ci0KLQkJTGFiZWwgYXBwTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5OT05FKTsKLQkJYXBwTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9BcHBsaWNhdGlvbl9MYWJlbCk7Ci0JCWFwcExhYmVsLnNldExheW91dERhdGEoc3BhbkdyaWREYXRhKC0xLCAyKSk7Ci0KLQkJYXBwVGV4dCA9IG5ldyBUZXh0KG1haW5Db21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWFwcFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWFwcFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCWFwcEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24obWFpbkNvbXAsIE1lc3NhZ2VzLlRhYl9jb21tb25fQnJvd3NlXzIsIG51bGwpOwotCQlhcHBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCWNyZWF0ZVZlcnRpY2FsU3BhY2VyKG1haW5Db21wLCAyKTsKLQotCQlsb2NhbEFwcEJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKG1haW5Db21wLCAiQ29weSBleGVjdXRhYmxlIGZyb20gbG9jYWwgZmlsZXN5c3RlbSIpOwotCQlsb2NhbEFwcEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbG9jYWxBcHBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCUxhYmVsIGxvY2FsQXBwTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5OT05FKTsKLQkJbG9jYWxBcHBMYWJlbC5zZXRUZXh0KCJQYXRoIHRvIHRoZSBsb2NhbCBmaWxlOiIpOwotCQlsb2NhbEFwcExhYmVsLnNldExheW91dERhdGEoc3BhbkdyaWREYXRhKC0xLCAyKSk7Ci0KLQkJbG9jYWxBcHBUZXh0ID0gbmV3IFRleHQobWFpbkNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbG9jYWxBcHBUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlsb2NhbEFwcFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCWJyb3dzZUFwcEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24obWFpbkNvbXAsICJCcm93c2UiLCBudWxsKTsKLQkJYnJvd3NlQXBwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQljcmVhdGVWZXJ0aWNhbFNwYWNlcihtYWluQ29tcCwgMik7Ci0KLQkJY29uc29sZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKG1haW5Db21wLCBNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9Db25zb2xlKTsKLQkJY29uc29sZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQljb25zb2xlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0SW1hZ2UoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIExhdW5jaEltYWdlcy5nZXRJbWFnZShMYXVuY2hJbWFnZXMuSU1HX01BSU5fVEFCKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9NYWluOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKGNvbmZpZ3VyYXRpb24pOwotCi0JCXRyeSB7Ci0JCQlwcm9qVGV4dC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCBFTVBUWV9TVFJJTkcpKTsKLQkJCWFwcFRleHQuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0VYRUNVVEFCTEVfUEFUSCwgRU1QVFlfU1RSSU5HKSk7Ci0JCQlsb2NhbEFwcFRleHQuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0xPQ0FMX0VYRUNVVEFCTEVfUEFUSCwgRU1QVFlfU1RSSU5HKSk7Ci0JCQlsb2NhbEFwcEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DT1BZX0VYRUNVVEFCTEUsIGZhbHNlKSk7Ci0JCQljb25zb2xlQnV0dG9uLnNldFNlbGVjdGlvbihjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NPTlNPTEUsIGZhbHNlKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkNvbW1vblRhYl9jb21tb25fRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbl9FWENFUFRJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaGFuZGxlTG9jYWxBcHBsaWNhdGlvbkJ1dHRvblNlbGVjdGVkKCk7IC8vIFJlZnJlc2hlcyB0aGUgbG9jYWwgcGF0aCB0ZXh0Ym94IGVuYWJsZSBzdGF0ZS4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQotCQlTdHJpbmcgbmFtZSA9IGdldEZpZWxkQ29udGVudChwcm9qVGV4dC5nZXRUZXh0KCkpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0JCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9Qcm9qZWN0X25vdF9leGlzdCwgbmV3IE9iamVjdFtdIHtuYW1lfSkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuQXBwbGljYXRpb25UYWJfUHJvamVjdF9pc19jbG9zZWQsIG5ldyBPYmplY3RbXSB7bmFtZX0pKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX0lsbGVnYWxfcHJvamVjdCwgbmV3IE9iamVjdFtde3N0YXR1cy5nZXRNZXNzYWdlKCl9KSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJbmFtZSA9IGdldEZpZWxkQ29udGVudChhcHBUZXh0LmdldFRleHQoKSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9BcHBsaWNhdGlvbl9wcm9ncmFtX25vdF9zcGVjaWZpZWQpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYobG9jYWxBcHBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCW5hbWUgPSBnZXRGaWVsZENvbnRlbnQobG9jYWxBcHBUZXh0LmdldFRleHQoKSk7Ci0JCQlpZihuYW1lID09IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoIkxvY2FsIGZpbGUgbm90IHNwZWNpZmllZCIpOwotCQkJfQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JCQlpZighZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoIkxvY2FsIGZpbGUgcGF0aCBtdXN0IGJlIGFic29sdXRlIik7Ci0JCQl9Ci0JCQlpZighZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5pc0ZpbGUoKSkgewotCQkJCXNldEVycm9yTWVzc2FnZSgiTG9jYWwgZmlsZSBtdXN0IGV4aXN0IGFuZCBiZSB2YWxpZCIpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotCQkJCUlQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLAotCQkJCWdldEZpZWxkQ29udGVudChwcm9qVGV4dC5nZXRUZXh0KCkpKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9FWEVDVVRBQkxFX1BBVEgsCi0JCQkJZ2V0RmllbGRDb250ZW50KGFwcFRleHQuZ2V0VGV4dCgpKSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotCQkJCUlQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ09QWV9FWEVDVVRBQkxFLAotCQkJCWxvY2FsQXBwQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9MT0NBTF9FWEVDVVRBQkxFX1BBVEgsCi0JCQkJZ2V0RmllbGRDb250ZW50KGxvY2FsQXBwVGV4dC5nZXRUZXh0KCkpKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DT05TT0xFLAotCQkJCWNvbnNvbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldERlZmF1bHRQcm9qZWN0KGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCkuZ2VuZXJhdGVOYW1lKHByb2plY3ROYW1lKTsKLQkJCWNvbmZpZ3VyYXRpb24ucmVuYW1lKG5hbWUpOwotCQl9Ci0KLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsCi0JCQkJcHJvamVjdE5hbWUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZSgKLQkJCQlJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0VYRUNVVEFCTEVfUEFUSCwKLQkJCQkoU3RyaW5nKSBudWxsKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DT1BZX0VYRUNVVEFCTEUsCi0JCQkJKFN0cmluZykgbnVsbCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotCQkJCUlQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTE9DQUxfRVhFQ1VUQUJMRV9QQVRILAotCQkJCWZhbHNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZykgewotCQlzdXBlci5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhbG9nIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHNlbGVjdGVkIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGNob29zZUZpbGUoKSB7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksIE1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1Byb2plY3RfcmVxdWlyZWQsCi0JCQkJCU1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX0VudGVyX3Byb2plY3RfYmVmb3JlX2Jyb3dzaW5nX2Zvcl9wcm9ncmFtKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJV29ya2JlbmNoTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpOwotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKE1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1Byb2dyYW1fc2VsZWN0aW9uKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuQXBwbGljYXRpb25UYWJfQ2hvb3NlX3Byb2dyYW1fdG9fcnVuX2Zyb21fTkFNRSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IobmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwIHx8ICEgKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5JTkZPLAotCQkJCQkJCU1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1NlbGVjdGlvbl9tdXN0X2JlX2ZpbGUsIG51bGwpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIoICgoSUZpbGUpc2VsZWN0aW9uWzBdKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUENvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLklORk8sCi0JCQkJCQkJCU1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1NlbGVjdGlvbl9tdXN0X2JlX2ZpbGUsIG51bGwpOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUFRQQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuT0ssIHJlc291cmNlLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUENvcmVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLklORk8sCi0JCQkJCQkJTWVzc2FnZXMuQXBwbGljYXRpb25UYWJfU2VsZWN0aW9uX211c3RfYmVfZmlsZSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElSZXNvdXJjZSkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhbG9nIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBzZWxlY3RlZCBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IGNob29zZVByb2plY3QoKSB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQotCQlXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9Qcm9qZWN0X1NlbGVjdGlvbl9UaXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1Byb2plY3RfU2VsZWN0aW9uX01lc3NhZ2UpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMocHJvamVjdHMpOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0W10geyBwcm9qZWN0IH0pOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJUHJvamVjdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZGVmYXVsdCBwcm9qZWN0LiBUaGlzIGlzIGVpdGhlciB0aGUgcHJvamVjdCBuYW1lIHRoYXQKLQkgKiBoYXMgYmVlbiBwcmV2aW91c2x5IHNlbGVjdGVkLCBvciB0aGUgcHJvamVjdCB0aGF0IGlzIGN1cnJlbnRseQotCSAqIHNlbGVjdGVkIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGRlZmF1bHQgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBnZXREZWZhdWx0UHJvamVjdChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0TmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAoU3RyaW5nKSBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUFRQTGF1bmNoUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYgIXByb2plY3ROYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQkJaWYgKCFzcy5pc0VtcHR5KCkpIHsKLQkJCQkJCU9iamVjdCBvYmogPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCQkJT2JqZWN0IG8gPSAoKElBZGFwdGFibGUpb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQkJCQkJCXJldHVybiAoKElSZXNvdXJjZSlvKS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJRWRpdG9yUGFydCBwYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gcGFydC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIElQcm9qZWN0IHRoZSBjb3JyZXNwb25kcyB0byB0aGUgcHJvamVjdCBuYW1lIHRoYXQgaXMKLQkgKiBkaXNwbGF5ZWQgaW4gdGhlIHByb2pUZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcmV0dXJuIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gcHJvalRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKHByb2plY3ROYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgdXNlciB0byBjaG9vc2UgdGhlIGFwcGxpY2F0aW9uIHRvIGV4ZWN1dGUKLQkgKiAKLQkgKiBJbml0aWFsIHBhdGggZG9lcyBub3Qgd29yayBvbiBNYWNPUyBYOiBzZWUgYnVnICMxNTMzNjUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBcHBsaWNhdGlvbkJ1dHRvblNlbGVjdGVkKCkgewotCQlTdHJpbmcgaW5pdFBhdGggPSBhcHBUZXh0LmdldFRleHQoKTsKLQkJaWYgKGluaXRQYXRoLmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksIE1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1Byb2plY3RfcmVxdWlyZWQsCi0JCQkJCQlNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9FbnRlcl9wcm9qZWN0X2JlZm9yZV9icm93c2luZ19mb3JfcHJvZ3JhbSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW5pdFBhdGggPSBnZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb25VUkkoKS5nZXRQYXRoKCk7Ci0JCX0KLQkJSVJlc291cmNlTWFuYWdlciBybSA9IGdldFJlc291cmNlTWFuYWdlcihnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkpOwotCQlBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gcm1Db25mID0gKEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgKChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbClybSkuZ2V0Q29uZmlndXJhdGlvbigpOwotCQlJUmVtb3RlU2VydmljZXMgcmVtU2VydmljZXMgPSBQVFBSZW1vdGVDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVTZXJ2aWNlcyhybUNvbmYuZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJSVJlbW90ZVVJU2VydmljZXMgcmVtVUlTZXJ2aWNlcyA9IFBUUFJlbW90ZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVVSVNlcnZpY2VzKHJlbVNlcnZpY2VzKTsKLQkJaWYgKHJlbVNlcnZpY2VzICE9IG51bGwgJiYgcmVtVUlTZXJ2aWNlcyAhPSBudWxsKSB7Ci0JCQlJUmVtb3RlQ29ubmVjdGlvbiByZW1Db24gPSByZW1TZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24ocm1Db25mLmdldENvbm5lY3Rpb25OYW1lKCkpOwotCQkJaWYgKHJlbUNvbiAhPSBudWxsKSB7Ci0JCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZmlsZU1nciA9IHJlbVVJU2VydmljZXMuZ2V0VUlGaWxlTWFuYWdlcigpOwotCQkJCWlmIChmaWxlTWdyICE9IG51bGwpIHsKLQkJCQkJZmlsZU1nci5zZXRDb25uZWN0aW9uKHJlbUNvbik7Ci0JCQkJCWZpbGVNZ3Iuc2hvd0Nvbm5lY3Rpb25zKGZhbHNlKTsKLQkJCQkJSVBhdGggcGF0aCA9IGZpbGVNZ3IuYnJvd3NlRmlsZShnZXRTaGVsbCgpLCAiU2VsZWN0IGFwcGxpY2F0aW9uIHRvIGV4ZWN1dGUiLCBpbml0UGF0aCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCWFwcFRleHQuc2V0VGV4dChwYXRoLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlIGEgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb2plY3RCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGNob29zZVByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJcHJvalRleHQuc2V0VGV4dChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI3VwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKSB7Ci0JCXN1cGVyLnVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlcyBjb3B5IG9mIGV4ZWN1dGFibGUgZnJvbSBsb2NhbCBtYWNoaW5lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2FsQXBwbGljYXRpb25CdXR0b25TZWxlY3RlZCgpIHsKLQkJbG9jYWxBcHBUZXh0LnNldEVuYWJsZWQobG9jYWxBcHBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlicm93c2VBcHBCdXR0b24uc2V0RW5hYmxlZChsb2NhbEFwcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQnJvd3NlTG9jYWxBcHBsaWNhdGlvbkJ1dHRvblNlbGVjdGVkKCkgewotCQlTdHJpbmcgaW5pdFBhdGggPSBsb2NhbEFwcFRleHQuZ2V0VGV4dCgpOwotCQlpZiAoaW5pdFBhdGguZXF1YWxzKEVNUFRZX1NUUklORykpIHsKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgTWVzc2FnZXMuQXBwbGljYXRpb25UYWJfUHJvamVjdF9yZXF1aXJlZCwKLQkJCQkJCU1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX0VudGVyX3Byb2plY3RfYmVmb3JlX2Jyb3dzaW5nX2Zvcl9wcm9ncmFtKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbml0UGF0aCA9IGdldFByb2plY3QoKS5nZXRMb2NhdGlvblVSSSgpLmdldFBhdGgoKTsKLQkJfQotCQlJUmVtb3RlU2VydmljZXMgbG9jYWxTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKCJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLkxvY2FsU2VydmljZXMiKTsKLQkJSVJlbW90ZVVJU2VydmljZXMgbG9jYWxVSVNlcnZpY2VzID0gUFRQUmVtb3RlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVVJU2VydmljZXMobG9jYWxTZXJ2aWNlcyk7Ci0JCWlmKGxvY2FsU2VydmljZXMgIT0gbnVsbCAmJiBsb2NhbFVJU2VydmljZXMgIT0gbnVsbCkgewotCQkJSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIGxjb25uTWdyID0gbG9jYWxTZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQkJSVJlbW90ZUNvbm5lY3Rpb24gbGNvbm4gPSBsY29ubk1nci5nZXRDb25uZWN0aW9uKG51bGwpOyAvLyBTaW5jZSBpdCdzIGEgbG9jYWwgc2VydmljZSwgZG9lc24ndCBtYXR0ZXIgd2hpY2ggcGFyYW1ldGVyIGlzIHBhc3NlZAotCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgbG9jYWxVSUZpbGVNZ3IgPSBsb2NhbFVJU2VydmljZXMuZ2V0VUlGaWxlTWFuYWdlcigpOwotCQkJbG9jYWxVSUZpbGVNZ3Iuc2V0Q29ubmVjdGlvbihsY29ubik7Ci0JCQlJUGF0aCBwYXRoID0gbG9jYWxVSUZpbGVNZ3IuYnJvd3NlRmlsZShnZXRTaGVsbCgpLCAiU2VsZWN0IHRoZSBleGVjdXRhYmxlIGZpbGUgdG8gYmUgY29waWVkIiwgaW5pdFBhdGgpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWxvY2FsQXBwVGV4dC5zZXRUZXh0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKklSZXNvdXJjZU1hbmFnZXIgcm0gPSBnZXRSZXNvdXJjZU1hbmFnZXIoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpKTsKLSAgICAJQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIHJtQ29uZiA9IChBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pICgoSVJlc291cmNlTWFuYWdlckNvbnRyb2wpcm0pLmdldENvbmZpZ3VyYXRpb24oKTsKLSAgICAJSVJlbW90ZVNlcnZpY2VzIHJlbVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMocm1Db25mLmdldFJlbW90ZVNlcnZpY2VzSWQoKSk7Ci0gICAgCWlmIChyZW1TZXJ2aWNlcyAhPSBudWxsKSB7Ci0gICAgCQlJUmVtb3RlQ29ubmVjdGlvbiByZW1Db24gPSByZW1TZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24ocm1Db25mLmdldENvbm5lY3Rpb25OYW1lKCkpOwotICAgIAkJaWYgKHJlbUNvbiAhPSBudWxsKSB7Ci0gICAgCQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSByZW1TZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcihyZW1Db24pOwotICAgIAkJCWlmIChmaWxlTWdyICE9IG51bGwpIHsKLSAgICAJCQkJSVBhdGggcGF0aCA9IGZpbGVNZ3IuYnJvd3NlRmlsZShnZXRTaGVsbCgpLCAiU2VsZWN0IGFwcGxpY2F0aW9uIHRvIGV4ZWN1dGUiLCBpbml0UGF0aCk7Ci0gICAgCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLSAgICAJCQkJCWFwcFRleHQuc2V0VGV4dChwYXRoLnRvU3RyaW5nKCkpOwotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9OyovCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0FyZ3VtZW50c1RhYi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0FyZ3VtZW50c1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmUzMmNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9Bcmd1bWVudHNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWkuTGF1bmNoSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmd1bWVudHNUYWIgZXh0ZW5kcyBMYXVuY2hDb25maWd1cmF0aW9uVGFiIHsKLSAgICBwcm90ZWN0ZWQgVGV4dCBhcmd1bWVudFRleHQgPSBudWxsOwotICAgIAotICAgIHByb3RlY3RlZCBXb3JraW5nRGlyZWN0b3J5QmxvY2sgd29ya2luZ0RpcmVjdG9yeUJsb2NrID0gbmV3IFdvcmtpbmdEaXJlY3RvcnlCbG9jaygpOyAKLSAgICAKLSAgICBwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSB7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgV2lkZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wKTsKLSAgICAgICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJQ0RUTGF1bmNoSGVscENvbnRleHRJZHMuTEFVTkNIX0NPTkZJR1VSQVRJT05fRElBTE9HX0FSR1VNTkVUU19UQUIpOwotICAgICAgICAKLQkJR3JpZExheW91dCB0b3BMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dCh0b3BMYXlvdXQpOwotCi0JCUNvbXBvc2l0ZSBwYXJhbGxlbENvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FKTsJCQotCQlwYXJhbGxlbENvbXAuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMiwgZmFsc2UsIDAsIDApKTsKLQkJcGFyYWxsZWxDb21wLnNldExheW91dERhdGEoc3BhbkdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgNSkpOyAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0JCUxhYmVsIHByb2dyYW1Bcmd1bWVudExhYmVsID0gbmV3IExhYmVsKHBhcmFsbGVsQ29tcCwgU1dULk5PTkUpOwotCQlwcm9ncmFtQXJndW1lbnRMYWJlbC5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YSgtMSwgMikpOwotCQlwcm9ncmFtQXJndW1lbnRMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFyZ3VtZW50c1RhYl9QYXJhbGxlbF9Qcm9ncmFtX0FyZ3VtZW50cyk7Ci0JCWFyZ3VtZW50VGV4dCA9IG5ldyBUZXh0KHBhcmFsbGVsQ29tcCwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ2QgPSBzcGFuR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCAyKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDQwOwotCQlhcmd1bWVudFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFyZ3VtZW50VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotICAgICAgICBjcmVhdGVWZXJ0aWNhbFNwYWNlcihwYXJhbGxlbENvbXAsIDIpOwotCQkKLSAgICAgICAgd29ya2luZ0RpcmVjdG9yeUJsb2NrLmNyZWF0ZUNvbnRyb2wocGFyYWxsZWxDb21wKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmYXVsdHMgYXJlIGVtcHR5LgotICAgICAqIAotICAgICAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BUkdVTUVOVFMsIChTdHJpbmcpIG51bGwpOwotICAgICAgICB3b3JraW5nRGlyZWN0b3J5QmxvY2suc2V0RGVmYXVsdHMoY29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhcmd1bWVudFRleHQuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FSR1VNRU5UUywgRU1QVFlfU1RSSU5HKSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5QmxvY2suaW5pdGlhbGl6ZUZyb20oY29uZmlndXJhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkNvbW1vblRhYl9jb21tb25fRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbl9FWENFUFRJT04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQVJHVU1FTlRTLCBhcmd1bWVudFRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgd29ya2luZ0RpcmVjdG9yeUJsb2NrLnBlcmZvcm1BcHBseShjb25maWd1cmF0aW9uKTsKLSAgICB9ICAgIAotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRNZXNzYWdlKG51bGwpOwotCQkKLQkJcmV0dXJuIHdvcmtpbmdEaXJlY3RvcnlCbG9jay5pc1ZhbGlkKGNvbmZpZ3VyYXRpb24pOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLkFyZ3VtZW50c1RhYl9Bcmd1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNzZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHN1cGVyLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJd29ya2luZ0RpcmVjdG9yeUJsb2NrLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJbWFnZSgpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gTGF1bmNoSW1hZ2VzLmdldEltYWdlKExhdW5jaEltYWdlcy5JTUdfQVJHVU1FTlRTX1RBQik7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBtc2cgPSBzdXBlci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIHdvcmtpbmdEaXJlY3RvcnlCbG9jay5nZXRFcnJvck1lc3NhZ2UoKTsKLQotCQlyZXR1cm4gbXNnOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJU3RyaW5nIG1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIHdvcmtpbmdEaXJlY3RvcnlCbG9jay5nZXRNZXNzYWdlKCk7Ci0KLQkJcmV0dXJuIG1zZzsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9EZWJ1Z2dlclRhYi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0RlYnVnZ2VyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzI0YTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0RlYnVnZ2VyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmludGVybmFsLnVpLkFic3RyYWN0RGVidWdnZXJUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWJ1Z2dlclRhYiBleHRlbmRzIEFic3RyYWN0RGVidWdnZXJUYWIgewotCWZpbmFsIHByb3RlY3RlZCBib29sZWFuIGZBdHRhY2hNb2RlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBmU3RvcEluTWFpbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdHRhY2hCdXR0b247Ci0KLQlwdWJsaWMgRGVidWdnZXJUYWIoYm9vbGVhbiBhdHRhY2hNb2RlKSB7Ci0JCWZBdHRhY2hNb2RlID0gYXR0YWNoTW9kZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbC51aS5BYnN0cmFjdERlYnVnZ2VyVGFiI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldENvbnRyb2woY29tcCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY3JlYXRlRGVidWdnZXJDb21ibyhjb21wLCAoZkF0dGFjaE1vZGUpID8gMSA6IDIpOwotCQljcmVhdGVPcHRpb25zQ29tcG9zaXRlKGNvbXApOwotCQljcmVhdGVEZWJ1Z2dlckdyb3VwKGNvbXAsIDIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWkuQWJzdHJhY3REZWJ1Z2dlclRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRJbml0aWFsaXppbmcodHJ1ZSk7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKGNvbmZpZyk7Ci0JCXRyeSB7Ci0JCQkvKgotCQkJICogT25seSBzZXQgZGVmYXVsdCBkZWJ1Z2dlciBpZiB0aGVyZSBpcyBhIHJlc291cmNlIG1hbmFnZXIgc2VsZWN0ZWQuCi0JCQkgKi8KLQkJCVN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9JRCwgRU1QVFlfU1RSSU5HKTsKLQkJCWxvYWREZWJ1Z2dlckNvbWJvQm94KGNvbmZpZywgaWQsIGdldFJlc291cmNlTWFuYWdlcihjb25maWcpID09IG51bGwpOwotCQkJaW5pdGlhbGl6ZUNvbW1vbkNvbnRyb2xzKGNvbmZpZyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXNldEluaXRpYWxpemluZyhmYWxzZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbC51aS5BYnN0cmFjdERlYnVnZ2VyVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoIXZhbGlkYXRlRGVidWdnZXJDb25maWcoY29uZmlnKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlQRGVidWdDb25maWd1cmF0aW9uIGRlYnVnQ29uZmlnID0gZ2V0RGVidWdDb25maWcoKTsKLQkJU3RyaW5nIG1vZGUgPSBmQXR0YWNoTW9kZSA/IElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFQlVHR0VSX01PREVfQVRUQUNIIDogSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVCVUdHRVJfTU9ERV9SVU47Ci0JCWlmICghZGVidWdDb25maWcuc3VwcG9ydHNNb2RlKG1vZGUpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuRGVidWdnZXJUYWJfTW9kZV9ub3Rfc3VwcG9ydGVkLCBuZXcgT2JqZWN0W117bW9kZX0pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc3VwZXIuaXNWYWxpZChjb25maWcpID09IGZhbHNlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbC51aS5BYnN0cmFjdERlYnVnZ2VyVGFiI3BlcmZvcm1BcHBseShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseShjb25maWcpOwotCQlpZiAoZkF0dGFjaE1vZGUpIHsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9TVEFSVF9NT0RFLCBJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUJVR0dFUl9NT0RFX0FUVEFDSCk7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWcuc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1RPUF9JTl9NQUlOLCBmU3RvcEluTWFpbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQljb25maWcuc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfU1RBUlRfTU9ERSwgSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVCVUdHRVJfTU9ERV9SVU4pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbC51aS5BYnN0cmFjdERlYnVnZ2VyVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotCQlzdXBlci5zZXREZWZhdWx0cyhjb25maWcpOwotCQlpZiAoZkF0dGFjaE1vZGUpIHsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9TVEFSVF9NT0RFLCBJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUJVR0dFUl9NT0RFX0FUVEFDSCk7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWcuc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfU1RBUlRfTU9ERSwgSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVCVUdHRVJfTU9ERV9SVU4pOwotCQkJY29uZmlnLnNldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NUT1BfSU5fTUFJTiwgSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVCVUdHRVJfU1RPUF9BVF9NQUlOX0RFRkFVTFQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY29tcG9zaXRlIHRvIGRpc3BsYXkgZGVidWdnZXIgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBvcHRpb25zQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJaWYgKGZBdHRhY2hNb2RlID09IHRydWUpIHsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJb3B0aW9uc0NvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlvcHRpb25zQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQkJfSBlbHNlIHsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJb3B0aW9uc0NvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlvcHRpb25zQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJCWZTdG9wSW5NYWluID0gY3JlYXRlQ2hlY2tCdXR0b24ob3B0aW9uc0NvbXAsIE1lc3NhZ2VzLkRlYnVnZ2VyVGFiX1N0b3BfYXRfbWFpbl9vbl9zdGFydHVwKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCWZTdG9wSW5NYWluLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlmU3RvcEluTWFpbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmICghaXNJbml0aWFsaXppbmcoKSkgewotCQkJCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjb250cm9scy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbW1vbkNvbnRyb2xzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0cnkgewotCQkJaWYgKCFmQXR0YWNoTW9kZSkgewotCQkJCWZTdG9wSW5NYWluLnNldFNlbGVjdGlvbihjb25maWcuZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1RPUF9JTl9NQUlOLCBJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUJVR0dFUl9TVE9QX0FUX01BSU5fREVGQVVMVCkpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGRlYnVnZ2VyIGNvbWJvIHdpdGggaW5zdGFsbGVkIGRlYnVnZ2Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREZWJ1Z2dlckNvbWJvQm94KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHNlbGVjdGlvbiwgYm9vbGVhbiBub0RlZmF1bHQpIHsKLQkJSVBEZWJ1Z0NvbmZpZ3VyYXRpb25bXSBkZWJ1Z0NvbmZpZ3M7Ci0JCWRlYnVnQ29uZmlncyA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVidWdDb25maWd1cmF0aW9ucygpOwotCQlBcnJheXMuc29ydChkZWJ1Z0NvbmZpZ3MsIG5ldyBDb21wYXJhdG9yPElQRGVidWdDb25maWd1cmF0aW9uPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShJUERlYnVnQ29uZmlndXJhdGlvbiBpYzEsIElQRGVidWdDb25maWd1cmF0aW9uIGljMikgewotCQkJCXJldHVybiBpYzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhpYzIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCUxpc3Q8SVBEZWJ1Z0NvbmZpZ3VyYXRpb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElQRGVidWdDb25maWd1cmF0aW9uPigpOwotCQlTdHJpbmcgbW9kZTsKLQkJaWYgKGZBdHRhY2hNb2RlKSB7Ci0JCQltb2RlID0gSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVCVUdHRVJfTU9ERV9BVFRBQ0g7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlID0gSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVCVUdHRVJfTU9ERV9SVU47Ci0JCX0KLQkJU3RyaW5nIGRlZmF1bHRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVidWdDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGVidWdDb25maWdzW2ldLnN1cHBvcnRzTW9kZShtb2RlKSkgewotCQkJCWxpc3QuYWRkKGRlYnVnQ29uZmlnc1tpXSk7Ci0JCQkJLy8gc2VsZWN0IGZpcnN0IGV4YWN0IG1hdGNoaW5nIGRlYnVnZ2VyIGZvciByZXF1ZXN0ZWQgc2VsZWN0aW9uCi0JCQkJaWYgKCFub0RlZmF1bHQgJiYgZGVmYXVsdFNlbGVjdGlvbi5lcXVhbHMoIiIpKSB7Ci0JCQkJCWRlZmF1bHRTZWxlY3Rpb24gPSBkZWJ1Z0NvbmZpZ3NbaV0uZ2V0SUQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgbm8gc2VsZWN0aW9uIG1lYW5pbmcgbm90aGluZyBpbiBjb25maWcgdGhlIGZvcmNlIGluaXRkZWZhdWx0IG9uIHRhYgotCQlzZXRJbml0aWFsaXplRGVmYXVsdChzZWxlY3Rpb24uZXF1YWxzKCIiKSA/IHRydWUgOiBmYWxzZSk7Ci0JCWxvYWREZWJ1Z2dlckNvbWJvKChJUERlYnVnQ29uZmlndXJhdGlvbltdKWxpc3QudG9BcnJheShuZXcgSVBEZWJ1Z0NvbmZpZ3VyYXRpb25bbGlzdC5zaXplKCldKSwgZGVmYXVsdFNlbGVjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5pbnRlcm5hbC51aS5BYnN0cmFjdERlYnVnZ2VyVGFiI3VwZGF0ZUNvbWJvRnJvbVNlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29tYm9Gcm9tU2VsZWN0aW9uKCkgewotCQlzdXBlci51cGRhdGVDb21ib0Zyb21TZWxlY3Rpb24oKTsKLQkJaW5pdGlhbGl6ZUNvbW1vbkNvbnRyb2xzKGdldExhdW5jaENvbmZpZ3VyYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGRlYnVnZ2VyIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZURlYnVnZ2VyQ29uZmlnKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJUERlYnVnQ29uZmlndXJhdGlvbiBkZWJ1Z0NvbmZpZyA9IGdldERlYnVnQ29uZmlnKCk7Ci0JCWlmIChkZWJ1Z0NvbmZpZyA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuRGVidWdnZXJUYWJfTm9fZGVidWdnZXJfYXZhaWxhYmxlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSBzZWxlY3RlZCBkZWJ1Z2dlciBjYW4gYmUgdXNlZCBmb3IgdGhpcyBsYXVuY2gKLQkgKiAKLQkgKiBGSVhNRTogVGhpcyBuZWVkcyB0byBjaGVjayB0aGUgZGVidWdnZXIgc3VwcG9ydHMgdGhlIHBsYXRmb3JtIGJlaW5nIG1hbmFnZWQgYnkgdGhlCi0JICogcmVzb3VyY2UgbWFuYWdlci4gVGhlIFJNIHdpbGwgbmVlZCB0byBwcm92aWRlIGFuIGludGVyZmFjZSB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIGRlYnVnQ29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGxhdGZvcm0oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLCBJUERlYnVnQ29uZmlndXJhdGlvbiBkZWJ1Z0NvbmZpZykgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvRG93bmxvYWRSdWxlRGlhbG9nLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvRG93bmxvYWRSdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDE1MWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0Rvd25sb2FkUnVsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLkRvd25sb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuSVN5bmNocm9uaXphdGlvblJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLk92ZXJ3cml0ZVBvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5Db21ib0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQ29tYm9Nb2xkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5GcmFtZU1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci0KLQotcHVibGljIGNsYXNzIERvd25sb2FkUnVsZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyBpbXBsZW1lbnRzIElSdWxlRGlhbG9nIHsKLQotCUNvbXBvc2l0ZSBjb250ZW50OwotCi0JVGV4dCBsb2NhbERpcmVjdG9yeVRleHQ7Ci0JQnV0dG9uIGxvY2FsRGlyZWN0b3J5QnV0dG9uOwotCUJ1dHRvbiBsb2NhbFdvcmtzcGFjZUJ1dHRvbjsKLQotCUxpc3QgZmlsZUxpc3Q7Ci0JQnV0dG9uIGFkZEZpbGVzQnV0dG9uOwotCUJ1dHRvbiBlZGl0RmlsZUJ1dHRvbjsKLQlCdXR0b24gcmVtb3ZlRmlsZXNCdXR0b247Ci0JCi0JQnV0dG9uIGFzUmVhZE9ubHlCdXR0b24sIGFzRXhlY3V0YWJsZUJ1dHRvbjsKLQlCdXR0b24gcHJlc2VydmVUaW1lU3RhbXBCdXR0b247Ci0JQ29tYm9Hcm91cCBvdmVyd3JpdGVQb2xpY3lDb21ibzsKLQkKLQlEb3dubG9hZFJ1bGUgZG93bmxvYWRSdWxlOwotCUlQYXRoIGxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkKLQlwcml2YXRlIGludCBsaXN0ZW5lcnNFbmFibGVkID0gMDsKLQkKLQlwdWJsaWMgRG93bmxvYWRSdWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBEb3dubG9hZFJ1bGUgcnVsZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCQotCQlkb3dubG9hZFJ1bGUgPSBydWxlOwotCX0KLQkKLQlwdWJsaWMgRG93bmxvYWRSdWxlRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJZG93bmxvYWRSdWxlID0gbmV3IERvd25sb2FkUnVsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJTGF5b3V0IGwgPSBjb250ZW50LmdldFBhcmVudCgpLmdldExheW91dCgpOwotCQljb250ZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19UaXRsZSk7Ci0JCXNldE1lc3NhZ2UoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX01lc3NhZ2UpOwotCQkKLQkJY3JlYXRlUmVtb3RlRmlsZXNDb21wb3NpdGUoY29udGVudCk7Ci0JCWNyZWF0ZUxvY2FsRGlyZWN0b3J5Q29tcG9zaXRlKGNvbnRlbnQpOwotCQljcmVhdGVPcHRpb25zQ29tcG9zaXRlKGNvbnRlbnQpOwotCQkKLQkJcHV0RmllbGRDb250ZW50cygpOwotCQkKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUxpc3RlbmVycygpIHsKLQkJbGlzdGVuZXJzRW5hYmxlZCArKzsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzYWJsZUxpc3RlbmVycygpIHsKLQkJbGlzdGVuZXJzRW5hYmxlZC0tOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHV0RmllbGRDb250ZW50cygpIHsKLQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQkKLQkJaWYgKGRvd25sb2FkUnVsZS5nZXRMb2NhbERpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCWxvY2FsRGlyZWN0b3J5VGV4dC5zZXRUZXh0KGRvd25sb2FkUnVsZS5nZXRMb2NhbERpcmVjdG9yeSgpKTsKLQkJfSBlbHNlIHsKLQkJCWxvY2FsRGlyZWN0b3J5VGV4dC5zZXRUZXh0KCIiKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW92ZXJ3cml0ZVBvbGljeUNvbWJvLnNlbGVjdEluZGV4VXNpbmdJRChJbnRlZ2VyLnRvU3RyaW5nKGRvd25sb2FkUnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSkpOwotCQlhc0V4ZWN1dGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGRvd25sb2FkUnVsZS5pc0FzRXhlY3V0YWJsZSgpKTsKLQkJYXNSZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24oZG93bmxvYWRSdWxlLmlzQXNSZWFkT25seSgpKTsKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0U2VsZWN0aW9uKGRvd25sb2FkUnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpOwotCQlTdHJpbmcgaXRlbXNbXSA9IGRvd25sb2FkUnVsZS5nZXRSZW1vdGVGaWxlc0FzU3RyaW5nQXJyYXkoKTsKLQkJQXJyYXlzLnNvcnQoaXRlbXMpOwotCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCQotCQllbmFibGVMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZldGNoRmllbGRDb250ZW50cygpIHsKLQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQkKLQkJU3RyaW5nIHBhdGggPSBsb2NhbERpcmVjdG9yeVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkb3dubG9hZFJ1bGUuc2V0TG9jYWxEaXJlY3RvcnkocGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlkb3dubG9hZFJ1bGUuc2V0TG9jYWxEaXJlY3RvcnkobnVsbCk7Ci0JCX0KLQkJZG93bmxvYWRSdWxlLnNldE92ZXJ3cml0ZVBvbGljeShJbnRlZ2VyLnBhcnNlSW50KG92ZXJ3cml0ZVBvbGljeUNvbWJvLmdldFNlbGVjdGlvbklkKCkpKTsKLQkJZG93bmxvYWRSdWxlLnNldEFzRXhlY3V0YWJsZShhc0V4ZWN1dGFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlkb3dubG9hZFJ1bGUuc2V0QXNSZWFkT25seShhc1JlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRSdWxlLnNldFByZXNlcnZlVGltZVN0YW1wKHByZXNlcnZlVGltZVN0YW1wQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRSdWxlLnNldFJlbW90ZUZpbGVzKGZpbGVMaXN0LmdldEl0ZW1zKCkpOwotCQkKLQkJZW5hYmxlTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlmZXRjaEZpZWxkQ29udGVudHMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlTG9jYWxEaXJlY3RvcnlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZU1vbGQgZnJhbWVNb2xkID0gbmV3IEZyYW1lTW9sZCgpOwotCQlmcmFtZU1vbGQuc2V0Q29sdW1ucygzKTsKLQkJZnJhbWVNb2xkLnNldFRpdGxlKE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19EZXN0aW5hdGlvbkZyYW1lX1RpdGxlKTsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBmcmFtZU1vbGQpOwotCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0JCQotCQlHcmlkRGF0YSBsb2NhbERpcmVjdG9yeUdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxvY2FsRGlyZWN0b3J5R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxvY2FsRGlyZWN0b3J5R3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlsb2NhbERpcmVjdG9yeUdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbG9jYWxEaXJlY3RvcnlUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbG9jYWxEaXJlY3RvcnlUZXh0LnNldExheW91dERhdGEobG9jYWxEaXJlY3RvcnlHcmlkRGF0YSk7Ci0JCQotCQlHcmlkRGF0YSBza2lwcGVyR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJc2tpcHBlckdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlza2lwcGVyR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlza2lwcGVyR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlMYWJlbCBza2lwcGVyID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7IC8vIEp1c3QgdG8gc2tpcCBvbmUgY29sdW1uCi0JCXNraXBwZXIuc2V0TGF5b3V0RGF0YShza2lwcGVyR3JpZERhdGEpOwotCQkKLQkJbG9jYWxEaXJlY3RvcnlCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuUFVTSCk7Ci0JCWxvY2FsRGlyZWN0b3J5QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfRmlsZVN5c3RlbUJ1dHRvbik7Ci0JCWxvY2FsRGlyZWN0b3J5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJaGFuZGxlTG9jYWxEaXJlY3RvcnlCdXR0b25FdmVudCgpOwotCQkJfQkJCQotCQl9KTsKLQkJbG9jYWxXb3Jrc3BhY2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuUFVTSCk7Ci0JCWxvY2FsV29ya3NwYWNlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfV29ya3NwYWNlQnV0dG9uKTsKLQkJbG9jYWxXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQloYW5kbGVMb2NhbFdvcmtzcGFjZUJ1dHRvbkV2ZW50KCk7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVPcHRpb25zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWVNb2xkIGZyYW1lTW9sZCA9IG5ldyBGcmFtZU1vbGQoKTsKLQkJZnJhbWVNb2xkLnNldENvbHVtbnMoMyk7Ci0JCWZyYW1lTW9sZC5hZGRPcHRpb24oRnJhbWVNb2xkLkNPTFVNTlNfRVFVQUxfV0lEVEgpOwotCQlmcmFtZU1vbGQuc2V0VGl0bGUoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9UaXRsZSk7Ci0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHBhcmVudCwgZnJhbWVNb2xkKTsKLQkJZnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlDb21wb3NpdGUgY29udGVudHMgPSBmcmFtZS5nZXRDb21wb3NpdGUoKTsKLQkJYXNSZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGVudHMsIFNXVC5DSEVDSyk7Ci0JCWFzUmVhZE9ubHlCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1JlYWRvbmx5Q2hlY2spOwotCQlhc0V4ZWN1dGFibGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuQ0hFQ0spOwotCQlhc0V4ZWN1dGFibGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjayk7Ci0JCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uID0gbmV3IEJ1dHRvbihjb250ZW50cywgU1dULkNIRUNLKTsKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2spOwotCQkKLQkJQ29tYm9Nb2xkIG1vbGQgPSBuZXcgQ29tYm9Nb2xkKENvbWJvTW9sZC5HUklEX0RBVEFfU1BBTik7Ci0JCW1vbGQuc2V0TGFiZWwoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVMYWJlbCk7Ci0JCW1vbGQuc2V0VGV4dEZpZWxkV2lkdGgoNDApOwotCQltb2xkLmFkZEl0ZW0oSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5TS0lQKSwgTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uKTsKLQkJbW9sZC5hZGRJdGVtKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuQUxXQVlTKSwgTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVBbHdheXNPcHRpb24pOwotCQltb2xkLmFkZEl0ZW0oSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5ORVdFUiksIE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlQ29tYm9fT3ZlcndyaXRlSWZOZXdlck9wdGlvbik7Ci0JCW92ZXJ3cml0ZVBvbGljeUNvbWJvID0gbmV3IENvbWJvR3JvdXAoY29udGVudHMsIG1vbGQpOwotCQlvdmVyd3JpdGVQb2xpY3lDb21iby5nZXRDb21ibygpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlkaXNhYmxlTGlzdGVuZXJzKCk7Ci0JCQkJaWYgKG92ZXJ3cml0ZVBvbGljeUNvbWJvLmdldFNlbGVjdGlvbklkKCkuZXF1YWxzKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuTkVXRVIpKSkgewotCQkJCQlwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CQkJCQkKLQkJCQl9Ci0JCQkJZW5hYmxlTGlzdGVuZXJzKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiBmcmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlUmVtb3RlRmlsZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZU1vbGQgZnJhbWVNb2xkID0gbmV3IEZyYW1lTW9sZCgpOwotCQlmcmFtZU1vbGQuc2V0Q29sdW1ucygyKTsKLQkJZnJhbWVNb2xkLnNldFRpdGxlKE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX1RpdGxlKTsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBmcmFtZU1vbGQpOwotCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJCi0JCUZyYW1lIGZpbGVzRnJhbWUgPSBuZXcgRnJhbWUoZnJhbWUuZ2V0Q29tcG9zaXRlKCkpOwotCQlmaWxlTGlzdCA9IG5ldyBMaXN0KGZpbGVzRnJhbWUsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludD0yMDA7Ci0JCWZpbGVMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlmaWxlTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkgcmV0dXJuOwotCQkJCXJlbW92ZUZpbGVzQnV0dG9uLnNldEVuYWJsZWQoZmlsZUxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAwKTsKLQkJCQllZGl0RmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZpbGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMSk7Ci0JCQl9Ci0JCX0pOwotCQlmaWxlTGlzdC5kZXNlbGVjdEFsbCgpOwotCQkKLQkJRnJhbWUgYnV0dG9uRnJhbWUgPSBuZXcgRnJhbWUoZnJhbWUuZ2V0Q29tcG9zaXRlKCkpOwotCQlhZGRGaWxlc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJYWRkRmlsZXNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9BZGRCdXR0b24pOwotCQlhZGRGaWxlc0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRmlsZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQloYW5kbGVhZGRGaWxlc0J1dHRvbkV2ZW50KCk7Ci0JCQl9CQkJCi0JCX0pOwotCQllZGl0RmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJZWRpdEZpbGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9FZGl0QnV0dG9uKTsKLQkJZWRpdEZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCWVkaXRGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJaGFuZGxlRWRpdEZpbGVCdXR0b25FdmVudCgpOwotCQkJfQkJCQotCQl9KTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkZyYW1lLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0ZpbGVMaXN0RnJhbWVfUmVtb3ZlQnV0dG9uKTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVGaWxlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkgcmV0dXJuOwotCQkJCWhhbmRsZVJlbW92ZUZpbGVzQnV0dG9uRXZlbnQoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWJ1dHRvbkZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJCi0JCXJldHVybiBmcmFtZTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlTG9jYWxEaXJlY3RvcnlCdXR0b25FdmVudCgpIHsKLQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0KLQkJSVBhdGggc2VsZWN0ZWRQYXRoID0gbnVsbDsKLQkJLyoKLQkJICogRmlyc3QsIHRyeSB0aGUgY3VycmVudCBwYXRoLgotCQkgKi8KLQkJSVBhdGggd29ya3NwYWNlUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJSVBhdGggY3VycmVudFBhdGggPSBuZXcgUGF0aChsb2NhbERpcmVjdG9yeVRleHQuZ2V0VGV4dCgpKTsKLQkJaWYgKCEgY3VycmVudFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQljdXJyZW50UGF0aCA9IHdvcmtzcGFjZVBhdGguYXBwZW5kKGN1cnJlbnRQYXRoKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlzZWxlY3RlZFBhdGggPSAgY3VycmVudFBhdGg7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIElmIG5vdCwgdHJ5IGxhc3QgZGlyZWN0b3J5LgotCQkgKi8KLQkJaWYgKHNlbGVjdGVkUGF0aCA9PSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUobGFzdFNlbGVjdGVkRGlyZWN0b3J5LnRvT1NTdHJpbmcoKSk7Ci0JCQlpZiAoZmlsZTIuaXNEaXJlY3RvcnkoKSAmJiBmaWxlMi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJc2VsZWN0ZWRQYXRoID0gIGxhc3RTZWxlY3RlZERpcmVjdG9yeTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogT3RoZXJ3aXNlLCB1c2Ugd29ya3NwYWNlIHJvb3QuCi0JCSAqLwotCQlpZiAoc2VsZWN0ZWRQYXRoID09IG51bGwpIHsKLQkJCXNlbGVjdGVkUGF0aCA9IHdvcmtzcGFjZVBhdGg7Ci0JCX0KLQkJCi0JCURpcmVjdG9yeURpYWxvZyBkaXJlY3RvcnlEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJZGlyZWN0b3J5RGlhbG9nLnNldEZpbHRlclBhdGgoc2VsZWN0ZWRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCWRpcmVjdG9yeURpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19EaXJlY3RvcnlEaWFsb2dfVGl0bGUpOwotCQlkaXJlY3RvcnlEaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfRGlyZWN0b3J5RGlhbG9nX01lc3NhZ2UpOwotCi0JCVN0cmluZyBuZXdQYXRoID0gZGlyZWN0b3J5RGlhbG9nLm9wZW4oKTsKLQotCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7CQkJCi0JCQkvKgotCQkJICogSWYgcGF0aCBpcyBpbnNpZGUgdGhlIHdvcmtzcGFjZSwgdGhlbiBtYWtlIGl0IHJlbGF0aXZlLgotCQkJICovCi0JCQlJUGF0aCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAod29ya3NwYWNlLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHdvcmtzcGFjZS5zZWdtZW50Q291bnQoKSk7Ci0JCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQl9Ci0JCQlsb2NhbERpcmVjdG9yeVRleHQuc2V0VGV4dChwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkKLQkJCS8qCi0JCQkgKiBTYXZlIGxhc3RTZWxlY3RlZERpcmVjdG9yeS4gVGhlcmUgaXMgYSBidWcgaW4gRGlyZWN0b3J5RGlhbG9nLgotCQkJICogVGhlIG1ldGhvZCBnZXRGaWx0ZXJQYXRoIGRvZXMgbm90IHJldHVybiB0aGUgZXhwZWN0ZWQgcGF0aC4KLQkJCSAqIFRoZSBidWcgd2lsbCBiZSBmaXhlZCBpbiBFY2xpcHNlIDMuNC4KLQkJCSAqIFRoZSB3b3JrYXJvdW50IHRha2VzIHRoZSBwYXJlbnQgb2YgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeSBhcyBsYXN0U2VsZWN0ZWREaXJlY3RvcnkuCi0JCQkgKi8KLQkJCWxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IG5ldyBQYXRoKG5ld1BhdGgpOwotCQkJbGFzdFNlbGVjdGVkRGlyZWN0b3J5ID0gbGFzdFNlbGVjdGVkRGlyZWN0b3J5LnJlbW92ZUxhc3RTZWdtZW50cygxKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVMb2NhbFdvcmtzcGFjZUJ1dHRvbkV2ZW50KCkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIHNlbGVjdGVkQ29udGFpbmVyID0gbnVsbDsKLQkKLQkJLyoKLQkJICogRmlyc3QsIHRyeSB0aGUgY3VycmVudCBjb250ZW50IGFzIGluaXRpYWwgc2VsZWN0aW9uLgotCQkgKi8KLQkJSVBhdGggY3VycmVudFBhdGggPSBuZXcgUGF0aChsb2NhbERpcmVjdG9yeVRleHQuZ2V0VGV4dCgpKTsKLQkJaWYgKGN1cnJlbnRQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gQWJzb2x1dGUgcGF0aCBpZiBmaWxlIHN5c3RlbQotCQkJSUNvbnRhaW5lciBjdXJyZW50Q29udGFpbmVyW10gPSB3b3Jrc3BhY2UuZmluZENvbnRhaW5lcnNGb3JMb2NhdGlvbihjdXJyZW50UGF0aCk7Ci0JCQlpZiAoY3VycmVudENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnRDb250YWluZXIubGVuZ3RoID09IDEpIHsKLQkJCQkJc2VsZWN0ZWRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyWzBdOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFBhdGggcmVsYXRpdmUgdG8gd29ya3NwYWNlCi0JCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IHdvcmtzcGFjZS5maW5kTWVtYmVyKGxhc3RTZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXNlbGVjdGVkQ29udGFpbmVyID0gKElDb250YWluZXIpIHNlbGVjdGVkUmVzb3VyY2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKgotCQkgKiBPdGhlcndpc2UsIHRyeSB0aGUgbGFzdCBzZWxlY3RlZCBwYXRoIGFzIGluaXRpYWwgc2VsZWN0aW9uLgotCQkgKi8KLQkJaWYgKHNlbGVjdGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCUlDb250YWluZXIgbGFzdENvbnRhaW5lcltdID0gd29ya3NwYWNlLmZpbmRDb250YWluZXJzRm9yTG9jYXRpb24obGFzdFNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCWlmIChsYXN0Q29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlpZiAobGFzdENvbnRhaW5lci5sZW5ndGggPT0gMSkgewotCQkJCQlzZWxlY3RlZENvbnRhaW5lciA9IGxhc3RDb250YWluZXJbMF07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCS8qCi0JCSAqIElmIG5vdGhpbmcgbWF0Y2hlcywgdXNlIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkJICovCi0JCWlmIChzZWxlY3RlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlzZWxlY3RlZENvbnRhaW5lciA9IHdvcmtzcGFjZTsKLQkJfQotCQkKLQkJQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgd29ya3NwYWNlLCB0cnVlLCBNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfV29ya3NwYWNlRGlhbG9nX1RpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgc2VsZWN0ZWRDb250YWluZXIgfSk7Ci0JCQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCS8qCi0JCQkgKiBBbHRob3VnaCBub3QgZG9jdW1lbnRlZCwgZ2V0UmVzdWx0IHJldHVybnMgYW4gYXJyYXkgd2l0aCBleGFjdGx5Ci0JCQkgKiBvbmUgZWxlbWVudCwgdGhhdCBoYXMgdHlwZSBvZiBJUGF0aC4KLQkJCSAqIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHdvcmtzcGFjZS4KLQkJCSAqLwotCQkJT2JqZWN0IHJbXSA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCUlQYXRoIHNlbGVjdGVkUGF0aCA9IChJUGF0aClyWzBdOwotCQkJLy8gVGhlIHBhdGggaXMgcmV0dXJuZWQgYXMgYWJzb2x1dGUhIE1ha2UgaXQgcmVsYXRpdmUhCi0JCQlsb2NhbERpcmVjdG9yeVRleHQuc2V0VGV4dChzZWxlY3RlZFBhdGgubWFrZVJlbGF0aXZlKCkudG9PU1N0cmluZygpKTsKLQkJCQotCQkJbGFzdFNlbGVjdGVkRGlyZWN0b3J5ID0gc2VsZWN0ZWRQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZWFkZEZpbGVzQnV0dG9uRXZlbnQoKSB7Ci0JCUlucHV0RGlhbG9nIGlucHV0RGlhbG9nID0gbmV3IElucHV0RGlhbG9nKGdldFNoZWxsKCksIE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX1RpdGxlLCBNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfQWRkRmlsZURpYWxvZ19NZXNzYWdlLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAotCQlpbnB1dERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJaWYgKGlucHV0RGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZpbGVMaXN0LmdldEl0ZW1zKCkpKTsKLQkJCWxpc3QuYWRkKGlucHV0RGlhbG9nLmdldFZhbHVlKCkpOwotCQkJU3RyaW5nIHNbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJcyA9IChTdHJpbmdbXSkgbGlzdC50b0FycmF5KHMpOwotCQkJQXJyYXlzLnNvcnQocyk7Ci0JCQlmaWxlTGlzdC5zZXRJdGVtcyhzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRWRpdEZpbGVCdXR0b25FdmVudCgpIHsKLQkJaWYgKGZpbGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IGZpbGVMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyBzZWxlY3RlZEl0ZW0gPSBmaWxlTGlzdC5nZXRJdGVtKGluZGV4KTsKLQkJCi0JCUlucHV0RGlhbG9nIGlucHV0RGlhbG9nID0gbmV3IElucHV0RGlhbG9nKGdldFNoZWxsKCksIE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19FZGl0RmlsZURpYWxvZ19UaXRsZSwgTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX01lc3NhZ2UsIHNlbGVjdGVkSXRlbSwgbnVsbCk7Ci0JCWlucHV0RGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlpZiAoaW5wdXREaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgewotCQkJU3RyaW5nIHNbXSA9IGZpbGVMaXN0LmdldEl0ZW1zKCk7Ci0JCQlzW2luZGV4XSA9IGlucHV0RGlhbG9nLmdldFZhbHVlKCk7Ci0JCQlBcnJheXMuc29ydChzKTsKLQkJCWZpbGVMaXN0LnNldEl0ZW1zKHMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVGaWxlc0J1dHRvbkV2ZW50KCkgewotCQlTdHJpbmcgc2VsZWN0aW9uIFtdID0gZmlsZUxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSGFzaFNldCBmaWxlU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChmaWxlTGlzdC5nZXRJdGVtcygpKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc2VsZWN0aW9uW2ldOwotCQkJZmlsZVNldC5yZW1vdmUoc3RyaW5nKTsKLQkJfQotCQkKLQkJU3RyaW5nIGl0ZW1zW10gPSBuZXcgU3RyaW5nW2ZpbGVTZXQuc2l6ZSgpXTsKLQkJaXRlbXMgPSAoU3RyaW5nW10pIGZpbGVTZXQudG9BcnJheShpdGVtcyk7Ci0JCUFycmF5cy5zb3J0KGl0ZW1zKTsKLQkJZmlsZUxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCX0KLQotCXB1YmxpYyBJU3luY2hyb25pemF0aW9uUnVsZSBnZXRSdWxlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBkb3dubG9hZFJ1bGU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvRW5oYW5jZWRTeW5jaHJvbml6ZVRhYi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0VuaGFuY2VkU3luY2hyb25pemVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1M2ViNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvRW5oYW5jZWRTeW5jaHJvbml6ZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5Eb3dubG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5PdmVyd3JpdGVQb2xpY2llczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLlVwbG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuRnJhbWVNb2xkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIEVuaGFuY2VkU3luY2hyb25pemVUYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRVcGxvYWRSdWxlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gYWRkRG93bmxvYWRSdWxlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdFJ1bGVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmVSdWxlQnV0dG9uOwotCXByb3RlY3RlZCBMaXN0IHJ1bGVMaXN0OwotCXByb3RlY3RlZCBMaXN0Vmlld2VyIHJ1bGVWaWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBzeW5jQmVmb3JlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gc3luY0FmdGVyQnV0dG9uOwotCQotCXByb3RlY3RlZCBBcnJheUxpc3QgcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIFN5bmNocm9uaXphdGlvblJ1bGVMYWJlbFByb3ZpZGVyIHJ1bGVMYWJlbFByb3ZpZGVyOwotCi0JYm9vbGVhbiBkYXRhQ2hhbmdlZCA9IGZhbHNlOwotCWludCBldmVudEhhbmRsZXJFbmFibGVkID0gMDsKLQkKLQlJbWFnZSB0YWJJbWFnZTsKLQkKLQlwdWJsaWMgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYigpIHsKLQkJc3VwZXIoKTsKLQkJZGF0YUNoYW5nZWQgPSBmYWxzZTsKLQkJVVJMIHVybCA9IFBUUExhdW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi9pY29ucy9zeW5jLnBuZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCSAgICB0YWJJbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlRXZlbnRIYW5kbGVycygpIHsKLQkJZXZlbnRIYW5kbGVyRW5hYmxlZCsrOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlRXZlbnRIYW5kbGVycygpIHsKLQkJZXZlbnRIYW5kbGVyRW5hYmxlZC0tOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSB7Ci0JCXJldHVybiBldmVudEhhbmRsZXJFbmFibGVkID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVGFiTW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmICghIGlzRXZlbnRIYW5kbGVyRW5hYmxlZCgpKSByZXR1cm47Ci0JCQlkYXRhQ2hhbmdlZCA9IHRydWU7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKCEgaXNFdmVudEhhbmRsZXJFbmFibGVkKCkpIHJldHVybjsKLQkJCWRhdGFDaGFuZ2VkID0gdHJ1ZTsKLQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmICghIGlzRXZlbnRIYW5kbGVyRW5hYmxlZCgpKSByZXR1cm47Ci0JCQlkYXRhQ2hhbmdlZCA9IHRydWU7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGFiTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXI7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQl0aGlzLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJdGhpcy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVGFiX01lc3NhZ2UpOwotCi0JCUNvbXBvc2l0ZSB0b3BDb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCB0b3BMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0b3BDb250cm9sLnNldExheW91dCh0b3BMYXlvdXQpOwotCi0JCXNldENvbnRyb2wodG9wQ29udHJvbCk7Ci0JCQotCQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZSh0b3BDb250cm9sLCBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfVGl0bGUpOwotCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQlDb21wb3NpdGUgZnJhbWVDb21wb3NpdGUgPSBmcmFtZS5nZXRDb21wb3NpdGUoKTsKLQotCQltb2RpZnlMaXN0ZW5lciA9IG5ldyBUYWJNb2RpZnlMaXN0ZW5lcigpOwotCi0JCWNyZWF0ZVJ1bGVMaXN0Q29udHJvbChmcmFtZUNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZU9wdGlvbnNDb250cm9sKGZyYW1lQ29tcG9zaXRlKTsKLQkJY3JlYXRlQnV0dG9uQ29udHJvbChmcmFtZUNvbXBvc2l0ZSk7Ci0JCQotCQllbmFibGVFdmVudEhhbmRsZXJzKCk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlUnVsZUxpc3RDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCAxKTsKLQkJZnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJQ29tcG9zaXRlIGZyYW1lQ29tcG9zaXRlID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChmcmFtZUNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9EZXNjcmlwdGlvbik7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlydWxlTGlzdCA9IG5ldyBMaXN0KGZyYW1lQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQ9MTAwOwotCQlydWxlTGlzdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcnVsZUxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoISBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSkgcmV0dXJuOwotCQkJCXJlbW92ZVJ1bGVCdXR0b24uc2V0RW5hYmxlZChydWxlTGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDApOwotCQkJCWVkaXRSdWxlQnV0dG9uLnNldEVuYWJsZWQocnVsZUxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAxKTsKLQkJCX0KLQkJfSk7Ci0JCXJ1bGVMaXN0LmRlc2VsZWN0QWxsKCk7Ci0JCXJ1bGVWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihydWxlTGlzdCk7Ci0JCXJ1bGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHJ1bGVzLnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKG9sZElucHV0LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJ1bGVMYWJlbFByb3ZpZGVyID0gbmV3IFN5bmNocm9uaXphdGlvblJ1bGVMYWJlbFByb3ZpZGVyKCk7Ci0JCXJ1bGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihydWxlTGFiZWxQcm92aWRlcik7Ci0JCXJ1bGVWaWV3ZXIuc2V0SW5wdXQocnVsZXMpOwotCQlyZXR1cm4gZnJhbWU7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZU9wdGlvbnNDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBGcmFtZU1vbGQuQ09MVU1OU19FUVVBTF9XSURUSCwgMik7Ci0JCUNvbXBvc2l0ZSBmcmFtZUNvbXBvc2l0ZSA9IGZyYW1lLmdldENvbXBvc2l0ZSgpOwotCQkKLQkJc3luY0JlZm9yZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGZyYW1lQ29tcG9zaXRlLCBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfT3B0aW9uc19VcGxvYWRFbmFibGVkKTsKLQkJc3luY0JlZm9yZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJc3luY0JlZm9yZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCXN5bmNBZnRlckJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGZyYW1lQ29tcG9zaXRlLCBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfT3B0aW9uc19Eb3dubG9hZEVuYWJsZWQpOwotCQlzeW5jQWZ0ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlzeW5jQWZ0ZXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQnV0dG9uQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHBhcmVudCwgRnJhbWVNb2xkLkNPTFVNTlNfRVFVQUxfV0lEVEgsIDQpOwotCQlDb21wb3NpdGUgZnJhbWVDb21wb3NpdGUgPSBmcmFtZS5nZXRDb21wb3NpdGUoKTsKLQkJCi0JCWFkZFVwbG9hZFJ1bGVCdXR0b24gPSBuZXcgQnV0dG9uKGZyYW1lQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWFkZFVwbG9hZFJ1bGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19OZXdVcGxvYWRSdWxlKTsKLQkJYWRkVXBsb2FkUnVsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkVXBsb2FkUnVsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghIGlzRXZlbnRIYW5kbGVyRW5hYmxlZCgpKSByZXR1cm47Ci0JCQkJaGFuZGxlQWRkVXBsb2FkUnVsZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhZGREb3dubG9hZFJ1bGVCdXR0b24gPSBuZXcgQnV0dG9uKGZyYW1lQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWFkZERvd25sb2FkUnVsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX0Rvd25sb2FkUnVsZSk7Ci0JCWFkZERvd25sb2FkUnVsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRG93bmxvYWRSdWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCEgaXNFdmVudEhhbmRsZXJFbmFibGVkKCkpIHJldHVybjsKLQkJCQloYW5kbGVBZGREb3dubG9hZFJ1bGVCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWVkaXRSdWxlQnV0dG9uID0gbmV3IEJ1dHRvbihmcmFtZUNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQllZGl0UnVsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX0VkaXRTZWxlY3RlZFJ1bGUpOwotCQllZGl0UnVsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJZWRpdFJ1bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoISBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSkgcmV0dXJuOwotCQkJCWhhbmRsZUVkaXRSdWxlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJZWRpdFJ1bGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlyZW1vdmVSdWxlQnV0dG9uID0gbmV3IEJ1dHRvbihmcmFtZUNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlyZW1vdmVSdWxlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfUmVtb3ZlU2VsZWN0ZWRSdWxlcyk7Ci0JCXJlbW92ZVJ1bGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZVJ1bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoISBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSkgcmV0dXJuOwotCQkJCWhhbmRsZVJlbW92ZVJ1bGVCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmVSdWxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXJldHVybiBmcmFtZTsKLQl9Ci0JCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChjb25maWcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI2NhblNhdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblNhdmUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5TYXZlKCkgfHwgZGF0YUNoYW5nZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNzZXREZWZhdWx0cyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1lOQ19BRlRFUiwKLQkJCQlmYWxzZSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1lOQ19CRUZPUkUsCi0JCQkJZmFsc2UpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NZTkNfUlVMRVMsIAotCQkJCW5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCS8vIEZJWE1FIFNldCBkYXRhIGluaXRpYWxpemF0aW9uCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlkYXRhQ2hhbmdlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3luY0FmdGVyQnV0dG9uLnNldFNlbGVjdGlvbihjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLQkJCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TWU5DX0FGVEVSLAotCQkJCQlmYWxzZSkpOwotCQkJc3luY0JlZm9yZUJ1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0JCQkJCUlQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1lOQ19CRUZPUkUsCi0JCQkJCWZhbHNlKSk7Ci0JCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0JCQkJCUlQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1lOQ19SVUxFUywKLQkJCQkJbmV3IEFycmF5TGlzdCgpKTsKLQkJCXJ1bGVzLmNsZWFyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlJU3luY2hyb25pemF0aW9uUnVsZSBydWxlID0gUnVsZUZhY3RvcnkuY3JlYXRlUnVsZUZyb21TdHJpbmcoc3RyaW5nKTsKLQkJCQlydWxlcy5hZGQocnVsZSk7Ci0JCQl9Ci0KLS8vCQkJUmVtb3RlTGF1bmNoRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgUmVtb3RlTGF1bmNoRGVsZWdhdGUoKTsKLS8vCQkJcnVsZUxhYmVsUHJvdmlkZXIuc2V0UmVtb3RlV29ya2luZ0RpcihMaW51eFBhdGgudG9TdHJpbmcoZGVsZWdhdGUuZ2V0VmFsaWRhdGVkUmVtb3RlRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pKSk7Ci0vLwkJCXJ1bGVMYWJlbFByb3ZpZGVyLnNldFJlbW90ZVdvcmtpbmdEaXIoTGludXhQYXRoLnRvU3RyaW5nKGRlbGVnYXRlLmdldFJlbW90ZURpcmVjdG9yeShjb25maWd1cmF0aW9uKSkpOwotCQkJCi0JCQkvLyBGb3Igbm93IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aWxsIGJlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGV4ZWN1dGFibGUKLQkJCS8vIGlzCi0JCQkvLyBUT0RPOiBBZGQgYW5vdGhlciBmaWVsZCB0byB0aGUgaW50ZXJmYWNlIHRvIHJlcHJlc2VudCB0aGUgd29ya2luZyBkaXI/Ci0JCQlTdHJpbmcgZXhlY0ZpbGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0VYRUNVVEFCTEVfUEFUSCwgKFN0cmluZyludWxsKTsKLQkJCWlmKGV4ZWNGaWxlID09IG51bGwpIHsKLQkJCQlTdHJpbmcgcGx1Z2lkID0gUFRQTGF1bmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiTm8gd29ya2luZyBkaXJlY3RvcnkgYXZhaWxhYmxlIjsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgcGx1Z2lkLCBtZXNzYWdlKSk7Ci0JCQl9Ci0JCQkvKlN0cmluZyBkZWZhdWx0UmVtb3RlV29ya2luZ0RpcmVjdG9yeSA9ICIiO0xhdW5jaFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJTGF1bmNoUHJlZmVyZW5jZXMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSk7Ki8KLQotCQkJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGV4ZWNGaWxlKTsKLQkJCXJ1bGVMYWJlbFByb3ZpZGVyLnNldFJlbW90ZVdvcmtpbmdEaXIoZmlsZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKSk7Ci0JCQkKLQkJCS8qaWYoIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfQVVUT01BVElDX1dPUktJTkdfRElSRUNUT1JZLCBJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5ERUZBVUxUX0FVVE9NQVRJQ19XT1JLSU5HX0RJUkVDVE9SWSkpewotCQkJCXJ1bGVMYWJlbFByb3ZpZGVyLnNldFJlbW90ZVdvcmtpbmdEaXIoIGRlZmF1bHRSZW1vdGVXb3JraW5nRGlyZWN0b3J5ICk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bGVMYWJlbFByb3ZpZGVyLnNldFJlbW90ZVdvcmtpbmdEaXIoIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfUkVNT1RFX0RJUkVDVE9SWSwgZGVmYXVsdFJlbW90ZVdvcmtpbmdEaXJlY3RvcnkpICk7Ci0JCQl9Ki8KLQkJCQotCQkJcmVmcmVzaFJ1bGVMaXN0KCk7Ci0JCQkvLyBGSVhNRTogU2V0IGVycm9yIG1lc3NhZ2VzCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLypzZXRFcnJvck1lc3NhZ2UoTGF1bmNoTWVzc2FnZXMKLQkJCQkJLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkJCQkiTGF1bmNoLmNvbW1vbi5FeGNlcHRpb25fb2NjdXJyZWRfcmVhZGluZ19jb25maWd1cmF0aW9uX0VYQ0VQVElPTiIsIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxhdW5jaFVJUGx1Z2luLmxvZyhlKTsqLwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hSdWxlTGlzdCgpIHsKLS8vCQlydWxlTGlzdC5yZW1vdmVBbGwoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBydWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSA9IChJU3luY2hyb25pemF0aW9uUnVsZSkgaXRlci5uZXh0KCk7Ci0vLwkJCXJ1bGVMaXN0LmFkZChydWxlLnRvTGFiZWwoKSk7Ci0vLwkJfQotLy8JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgcnVsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLS8vCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlydWxlVmlld2VyLnJlZnJlc2goKTsKLS8vCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpIHsKLS8vCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHtmaXJzdEVsZW1lbnR9KTsKLS8vCQkJcnVsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLS8vCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TWU5DX0FGVEVSLCBzeW5jQWZ0ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NZTkNfQkVGT1JFLCBzeW5jQmVmb3JlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJ1bGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSA9IChJU3luY2hyb25pemF0aW9uUnVsZSkgaXRlci5uZXh0KCk7Ci0JCQlsaXN0LmFkZChydWxlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1lOQ19SVUxFUywgbGlzdCk7Ci0JCWRhdGFDaGFuZ2VkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9UYWJfVGl0bGU7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gdGFiSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkVXBsb2FkUnVsZUJ1dHRvblByZXNzZWQoKSB7Ci0JCVVwbG9hZFJ1bGUgdXBsb2FkUnVsZSA9IG5ldyBVcGxvYWRSdWxlKCk7Ci0JCXVwbG9hZFJ1bGUuc2V0RGVmYXVsdFJlbW90ZURpcmVjdG9yeSh0cnVlKTsKLQkJdXBsb2FkUnVsZS5zZXRSZW1vdGVEaXJlY3RvcnkobnVsbCk7Ci0JCXVwbG9hZFJ1bGUuc2V0T3ZlcndyaXRlUG9saWN5KE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUyk7Ci0JCW5ld1J1bGVEaWFsb2codXBsb2FkUnVsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZERvd25sb2FkUnVsZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURvd25sb2FkUnVsZSBkb3dubG9hZFJ1bGUgPSBuZXcgRG93bmxvYWRSdWxlKCk7Ci0JCWRvd25sb2FkUnVsZS5zZXRPdmVyd3JpdGVQb2xpY3koT3ZlcndyaXRlUG9saWNpZXMuQUxXQVlTKTsKLQkJbmV3UnVsZURpYWxvZyhkb3dubG9hZFJ1bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBuZXdSdWxlRGlhbG9nKElTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUpIHsKLQkJRGlhbG9nIGRpYWxvZyA9IFJ1bGVEaWFsb2dGYWN0b3J5LmNyZWF0ZURpYWxvZ0ZvclJ1bGUoZ2V0U2hlbGwoKSwgcnVsZSk7Ci0JCWlmIChkaWFsb2cgIT0gbnVsbCkgewotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0JCQkJSVJ1bGVEaWFsb2cgcnVsZURpYWxvZyA9IChJUnVsZURpYWxvZykgZGlhbG9nOwotCQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIG5ld1J1bGUgPSBSdWxlRmFjdG9yeS5kdXBsaWNhdGVSdWxlKHJ1bGVEaWFsb2cuZ2V0UnVsZVdvcmtpbmdDb3B5KCkpOwotCQkJCXJ1bGVzLmFkZChuZXdSdWxlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRXJyb3JNZXNzYWdlX05ld1J1bGVfVGl0bGUsCU1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRXJyb3JNZXNzYWdlX05ld1J1bGVfRG9udEtub3dSdWxlVHlwZSk7Ci0JCX0KLQkJcmVmcmVzaFJ1bGVMaXN0KCk7Ci0JCWRhdGFDaGFuZ2VkID0gdHJ1ZTsKLQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVkaXRSdWxlQnV0dG9uUHJlc3NlZCgpIHsKLQkJaWYgKHJ1bGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMSkgcmV0dXJuOwotCQkKLQkJaW50IGluZGV4ID0gcnVsZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSA9IChJU3luY2hyb25pemF0aW9uUnVsZSkgcnVsZXMuZ2V0KGluZGV4KTsKLQkJRGlhbG9nIGRpYWxvZyA9IFJ1bGVEaWFsb2dGYWN0b3J5LmNyZWF0ZURpYWxvZ0ZvclJ1bGUoZ2V0U2hlbGwoKSwgcnVsZSk7Ci0JCWlmIChkaWFsb2cgIT0gbnVsbCkgewotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0JCQkJSVJ1bGVEaWFsb2cgcnVsZURpYWxvZyA9IChJUnVsZURpYWxvZykgZGlhbG9nOwotCQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIG5ld1J1bGUgPSBSdWxlRmFjdG9yeS5kdXBsaWNhdGVSdWxlKHJ1bGVEaWFsb2cuZ2V0UnVsZVdvcmtpbmdDb3B5KCkpOwotCQkJCXJ1bGVzLnNldChpbmRleCwgbmV3UnVsZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX1RpdGxlLAlNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX0RvbnRLbm93UnVsZVR5cGUpOwotCQl9Ci0JCXJlZnJlc2hSdWxlTGlzdCgpOwotCQlkYXRhQ2hhbmdlZCA9IHRydWU7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlUnVsZUJ1dHRvblByZXNzZWQoKSB7CQkKLQkJaWYgKHJ1bGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkgcmV0dXJuOwotCi0JCWludCBpbmRleGVzW10gPSBydWxlTGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSBpbmRleGVzW2ldOwotCQkJc2V0LmFkZChydWxlcy5nZXQoaW5kZXgpKTsKLQkJfQotCQlydWxlcy5yZW1vdmVBbGwoc2V0KTsKLQkJcmVmcmVzaFJ1bGVMaXN0KCk7Ci0JCWRhdGFDaGFuZ2VkID0gdHJ1ZTsKLQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKHRhYkltYWdlICE9IG51bGwpIHRhYkltYWdlLmRpc3Bvc2UoKTsKLQkJdGFiSW1hZ2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9FbnZpcm9ubWVudFRhYi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0Vudmlyb25tZW50VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDQ3MmQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0Vudmlyb25tZW50VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotCi0vKioKLSAqIEEgbW9kaWZpZWQgdmVyc2lvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcudWkuRW52aXJvbm1lbnRUYWJ9LCB3aGVyZSB0aGUKLSAqICJhcHBlbmQiIGFuZCAicmVwbGFjZSIgb3B0aW9ucyBhcmUgYWx3YXlzIGRpc2FibGVkLCBhbmQgc2V0IHRvICJhcHBlbmQiLiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRUYWIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5FbnZpcm9ubWVudFRhYiB7Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQXBwZW5kUmVwbGFjZSgpIHsKLQkJYXBwZW5kRW52aXJvbm1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlcGxhY2VFbnZpcm9ubWVudC5zZXRFbmFibGVkKGZhbHNlKTsJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgImFwcGVuZCIvInJlcGxhY2UiIGF0dHJpYnV0ZSBpcyBhbHdheXMgc2V0IHRvICJhcHBlbmQiLCAKLQkJICogaWdub3Jpbmcgd2hhdGV2ZXIgd2FzIHNldCBhcyBkZWZhdWx0IGJ5IHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi4KLQkJICovCi0JCXN1cGVyLnNldERlZmF1bHRzKGNvbmZpZ3VyYXRpb24pOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJTGF1bmNoTWFuYWdlci5BVFRSX0FQUEVORF9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsIHRydWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKGNvbmZpZ3VyYXRpb24pOwotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgImFwcGVuZCIvInJlcGxhY2UiIGNvbnRyb2xzIGFyZSBhbHdheXMgc2hvd24gYXMgImFwcGVuZCIsIAotCQkgKiBpZ25vcmluZyB3aGF0ZXZlciB3YXMgc2hvd24gYnkgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgotCQkgKi8KLQkJYXBwZW5kRW52aXJvbm1lbnQuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICByZXBsYWNlRW52aXJvbm1lbnQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgImFwcGVuZCIvInJlcGxhY2UiIGF0dHJpYnV0ZSBpcyBhbHdheXMgc2V0IHRvICJhcHBlbmQiLCAKLQkJICogaWdub3Jpbmcgd2hhdGV2ZXIgd2FzIHNldCBieSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24uCi0JCSAqLwotCQlzdXBlci5wZXJmb3JtQXBwbHkoY29uZmlndXJhdGlvbik7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElMYXVuY2hNYW5hZ2VyLkFUVFJfQVBQRU5EX0VOVklST05NRU5UX1ZBUklBQkxFUywgdHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0lSdWxlRGlhbG9nLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvSVJ1bGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5NjhjOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvSVJ1bGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5JU3luY2hyb25pemF0aW9uUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJUnVsZURpYWxvZyB7Ci0JcHVibGljIElTeW5jaHJvbml6YXRpb25SdWxlIGdldFJ1bGVXb3JraW5nQ29weSgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0xhdW5jaENvbmZpZ3VyYXRpb25UYWIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9MYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTlmMTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL0xhdW5jaENvbmZpZ3VyYXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXVuY2hDb25maWd1cmF0aW9uVGFiIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTFVFID0gIjAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgcm91dGluZSB0byBjcmVhdGUgYSBncmlkIGxheW91dAotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2x1bW5zCi0gICAgICogQHBhcmFtIGlzRXF1YWwKLSAgICAgKiBAcGFyYW0gbWgKLSAgICAgKiBAcGFyYW0gbXcKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dChpbnQgY29sdW1ucywgYm9vbGVhbiBpc0VxdWFsLCBpbnQgbWgsIGludCBtdykgewotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSBjb2x1bW5zOwotICAgICAgICBncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGlzRXF1YWw7Ci0gICAgICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWg7Ci0gICAgICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSBtdzsKLSAgICAgICAgcmV0dXJuIGdyaWRMYXlvdXQ7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHdvcmtzcGFjZSBjb250YWluZXIsb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKgotCSAqIEBwYXJhbSB3b3Jrc3BhY2VEaXIKLQkgKiBAcmV0dXJuIHdvcmtzcGFjZSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXRDb250YWluZXIoU3RyaW5nIHdvcmtzcGFjZURpcikgewotCQlJUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2Uod29ya3NwYWNlRGlyKTsKLQkJaWYgKHJlcyBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCXJldHVybiAoSUNvbnRhaW5lcilyZXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotICAgICAqIFV0aWxpdHkgcm91dGluZSB0byBnZXQgdGhlIGNvbnRlbnRzIG9mIGEgdGV4dCBmaWVsZAotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICogQHJldHVybiBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkQ29udGVudChTdHJpbmcgdGV4dCkgewotICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCB0ZXh0LmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBsYXRmb3JtIGZyb20gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZwotICAgICAqIEByZXR1cm4gcGxhdGZvcm0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgcGxhdGZvcm0gPSBQbGF0Zm9ybS5nZXRPUygpOwotCQl0cnkgewotCQkJcmV0dXJuIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QTEFURk9STSwgcGxhdGZvcm0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBwbGF0Zm9ybTsKLQkJfQotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm9qZWN0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgICAqIEByZXR1cm4gcHJvamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHByb05hbWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvTmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAoU3RyaW5nKW51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgaWYgKHByb05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9OYW1lKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB3b3Jrc3BhY2UgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICoKLQkgKiBAcGFyYW0gd29ya3NwYWNlRGlyCi0JICogQHJldHVybiB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyB3b3Jrc3BhY2VEaXIpIHsKLQkJcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKG5ldyBQYXRoKHdvcmtzcGFjZURpcikpOwotCX0KLQotICAgIHByb3RlY3RlZCBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotICAgIAlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB9ICAgIAotCQotICAgIC8qKgotCSAqIEdpdmVuIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIGZpbmQgdGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCB3YXMgYmVlbiBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gcmVzb3VyY2UgbWFuYWdlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWZpbmFsIFN0cmluZyBybVVuaXF1ZU5hbWU7Ci0JCXRyeSB7Ci0JCQlybVVuaXF1ZU5hbWUgPSBjb25maWd1cmF0aW9uCi0JCQkJCS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQkJSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9SRVNPVVJDRV9NQU5BR0VSX1VOSVFVRU5BTUUsCi0JCQkJCQkJRU1QVFlfU1RSSU5HKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCkKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyRnJvbVVuaXF1ZU5hbWUocm1VbmlxdWVOYW1lKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSByb3V0aW5nIHRvIGNyZWF0ZSBhIEdyaWREYXRhCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICogQHBhcmFtIHNwYWNlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBHcmlkRGF0YSBzcGFuR3JpZERhdGEoaW50IHN0eWxlLCBpbnQgc3BhY2UpIHsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBudWxsOwotICAgICAgICBpZiAoc3R5bGUgPT0gLTEpCi0gICAgICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShzdHlsZSk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gc3BhY2U7Ci0gICAgICAgIHJldHVybiBnZDsKLSAgICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJLy8gY2FjaGUgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciB1cGRhdGVzCi0JCXNldExhdW5jaENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JfQotCQotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJbGF1bmNoQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotCQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGF1bmNoQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbGF1bmNoQ29uZmlndXJhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvUmVzb3VyY2VzVGFiLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvUmVzb3VyY2VzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODZmYWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL1Jlc291cmNlc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBVbml2ZXJzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwudWkuTGF1bmNoSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLkFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBUaGUgUmVzb3VyY2VzIHRhYiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlc291cmNlcyByZXF1aXJlZCBmb3IKLSAqIGEgc3VjY2Vzc2Z1bCBqb2IgbGF1bmNoLiBJdCBpcyBwb3B1bGF0ZWQgYnkgdGhlIHNlbGVjdGVkCi0gKiByZXNvdXJjZSBtYW5hZ2VyIChzcGVjaWZpZWQgaW4gdGhlIE1haW4gdGFiKQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzVGFiIGV4dGVuZHMgTGF1bmNoQ29uZmlndXJhdGlvblRhYiB7Ci0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZW50c0NoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudHNDaGFuZ2VkKElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHJtRHluYW1pY1RhYikgewotCQkJLy8gVGhlIGJ1dHRvbnMgYW5kIG1lc3NhZ2VzIGhhdmUgdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBhbnl0aGluZwotCQkJLy8gdGhhdCBoYXMgY2hhbmdlZCBpbiB0aGUgZHluYW1pYyBwb3J0aW9uIG9mIHRoZSBsYXVuY2ggdGFiLgotCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyByZXNvdXJjZU1hbmFnZXJDb21ibyA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgSVJlc291cmNlTWFuYWdlcj4gcmVzb3VyY2VNYW5hZ2VycyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIElSZXNvdXJjZU1hbmFnZXI+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPElSZXNvdXJjZU1hbmFnZXIsIEludGVnZXI+IHJlc291cmNlTWFuYWdlckluZGljZXMgPSBuZXcgSGFzaE1hcDxJUmVzb3VyY2VNYW5hZ2VyLCBJbnRlZ2VyPigpOwotCi0JLy8gVGhlIGNvbXBvc2l0ZSB0aGF0IGhvbGRzIHRoZSBSTSdzIGF0dHJpYnV0ZXMgZm9yIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiAKLQlwcml2YXRlIFNjcm9sbGVkQ29tcG9zaXRlIGxhdW5jaEF0dHJzU2Nyb2xsQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SVJlc291cmNlTWFuYWdlciwgSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI+IHJtRHluYW1pY1RhYnMgPSAKLQkJbmV3IEhhc2hNYXA8SVJlc291cmNlTWFuYWdlciwgSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI+KCk7Ci0KLQlwcml2YXRlIGZpbmFsIENvbnRlbnRzQ2hhbmdlZExpc3RlbmVyIGxhdW5jaENvbnRlbnRzQ2hhbmdlZExpc3RlbmVyID0gCi0JCW5ldyBDb250ZW50c0NoYW5nZWRMaXN0ZW5lcigpOyAKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjY2FuU2F2ZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuU2F2ZSgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlpZiAocmVzb3VyY2VNYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5SZXNvdXJjZXNUYWJfTm9fUmVzb3VyY2VfTWFuYWdlcik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcm1EeW5hbWljVGFiID0gZ2V0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihyZXNvdXJjZU1hbmFnZXIpOwotCQlmaW5hbCBDb21wb3NpdGUgbGF1bmNoQ29tcCA9IGdldExhdW5jaEF0dHJzU2Nyb2xsQ29tcG9zaXRlKCk7Ci0JCWlmIChybUR5bmFtaWNUYWIgPT0gbnVsbCB8fCBsYXVuY2hDb21wID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5SZXNvdXJjZXNUYWJfTm9fTGF1bmNoX0NvbmZpZ3VyYXRpb24sIG5ldyBPYmplY3RbXSB7cmVzb3VyY2VNYW5hZ2VyLmdldE5hbWUoKX0pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlSTUxhdW5jaFZhbGlkYXRpb24gdmFsaWRhdGlvbiA9IHJtRHluYW1pY1RhYi5jYW5TYXZlKGxhdW5jaENvbXAsIHJlc291cmNlTWFuYWdlciwgbnVsbCk7Ci0JCWlmICghdmFsaWRhdGlvbi5pc1N1Y2Nlc3MoKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHZhbGlkYXRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgaW50IG51bUNvbHVtbnMgPSAyOwotCQlmaW5hbCBDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldENvbnRyb2woY29tcCk7Ci0JCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21wLnNldExheW91dERhdGEoZ2QpOwotCSAKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVBVbml2ZXJzZSB1bml2ZXJzZSA9IG1vZGVsTWFuYWdlci5nZXRVbml2ZXJzZSgpOwotCQlJUmVzb3VyY2VNYW5hZ2VyW10gcm1zID0gbW9kZWxNYW5hZ2VyLmdldFN0YXJ0ZWRSZXNvdXJjZU1hbmFnZXJzKHVuaXZlcnNlKTsKLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLkFwcGxpY2F0aW9uVGFiX1JNX1NlbGVjdGlvbl9MYWJlbCk7Ci0JCQkKLQkJcmVzb3VyY2VNYW5hZ2VyQ29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXJlc291cmNlTWFuYWdlckNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJtcy5sZW5ndGg7IGkrKykgewotCQkJcmVzb3VyY2VNYW5hZ2VyQ29tYm8uYWRkKHJtc1tpXS5nZXROYW1lKCkpOwotCQkJcmVzb3VyY2VNYW5hZ2Vycy5wdXQoaSwgcm1zW2ldKTsKLQkJCXJlc291cmNlTWFuYWdlckluZGljZXMucHV0KHJtc1tpXSwgaSk7Ci0JCX0KLQkJcmVzb3VyY2VNYW5hZ2VyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXNvdXJjZU1hbmFnZXJDb21ibykgewotCQkJCQlybVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCSAgICAgICAgdXBkYXRlTGF1bmNoQXR0cmlidXRlQ29udHJvbHMocmVzb3VyY2VNYW5hZ2VyLCBudWxsLCBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkpOwotCQkgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmVzb3VyY2VNYW5hZ2VyQ29tYm8uZGVzZWxlY3RBbGwoKTsKLQkJCi0JCWNyZWF0ZVZlcnRpY2FsU3BhY2VyKGNvbXAsIDIpOwotCi0JCS8vIFRoZSBjb21wb3NpdGUgdGhhdCBob2xkcyB0aGUgUk0ncyBhdHRyaWJ1dGVzIGZvciB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkJR3JvdXAgYXR0ckdyb3VwID0gbmV3IEdyb3VwKGNvbXAsIFNXVC5OT05FKTsKLQkJYXR0ckdyb3VwLnNldFRleHQoTWVzc2FnZXMuUmVzb3VyY2VzVGFiX0xhdW5jaF9BdHRyaWJ1dGVzKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zOwotCQlhdHRyR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWF0dHJHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcCA9IGNyZWF0ZUxhdW5jaEF0dHJpYnV0ZUNvbnRyb2xDb21wb3NpdGUoYXR0ckdyb3VwLAotCQkJCW51bUNvbHVtbnMpOwotCQlzZXRMYXVuY2hBdHRyc1Njcm9sbENvbXBvc2l0ZShzY3JvbGxDb21wKTsKLSAJfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBMYXVuY2hJbWFnZXMuZ2V0SW1hZ2UoTGF1bmNoSW1hZ2VzLklNR19QQVJBTExFTF9UQUIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLlJlc291cmNlc1RhYl9SZXNvdXJjZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKGNvbmZpZ3VyYXRpb24pOwotCQkKLSAgICAgICAgcmVzb3VyY2VNYW5hZ2VyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAocmVzb3VyY2VNYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5BcHBsaWNhdGlvblRhYl9Ob19SZXNvdXJjZV9NYW5hZ2VyX0F2YWlsYWJsZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRSZXNvdXJjZU1hbmFnZXJDb21ib1NlbGVjdGlvbihyZXNvdXJjZU1hbmFnZXIpOwotCi0JCUlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHJtRHluYW1pY1RhYiA9IGdldFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIocmVzb3VyY2VNYW5hZ2VyKTsKLQkJZmluYWwgQ29tcG9zaXRlIGxhdW5jaENvbXAgPSBnZXRMYXVuY2hBdHRyc1Njcm9sbENvbXBvc2l0ZSgpOwotCQlpZiAocm1EeW5hbWljVGFiID09IG51bGwgfHwgbGF1bmNoQ29tcCA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuUmVzb3VyY2VzVGFiX05vX0xhdW5jaF9Db25maWd1cmF0aW9uLCBuZXcgT2JqZWN0W10ge3Jlc291cmNlTWFuYWdlci5nZXROYW1lKCl9KSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIFVwZGF0ZSB0aGUgZHluYW1pYyBwb3J0aW9ucyBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkJLy8gdGFiLgotCQl1cGRhdGVMYXVuY2hBdHRyaWJ1dGVDb250cm9scyhyZXNvdXJjZU1hbmFnZXIsIG51bGwsIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlpZiAocmVzb3VyY2VNYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5SZXNvdXJjZXNUYWJfTm9fUmVzb3VyY2VfTWFuYWdlcik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBybUR5bmFtaWNUYWIgPSBnZXRSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKHJlc291cmNlTWFuYWdlcik7Ci0JCWlmIChybUR5bmFtaWNUYWIgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLlJlc291cmNlc1RhYl9Ob19MYXVuY2hfQ29uZmlndXJhdGlvbiwgbmV3IE9iamVjdFtdIHtyZXNvdXJjZU1hbmFnZXIuZ2V0TmFtZSgpfSkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJNTGF1bmNoVmFsaWRhdGlvbiB2YWxpZGF0aW9uID0gcm1EeW5hbWljVGFiLmlzVmFsaWQoY29uZmlndXJhdGlvbiwgcmVzb3VyY2VNYW5hZ2VyLCBudWxsKTsKLQkJaWYgKCF2YWxpZGF0aW9uLmlzU3VjY2VzcygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UodmFsaWRhdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNwZXJmb3JtQXBwbHkob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLSAgICAJaWYgKHJlc291cmNlTWFuYWdlciAhPSBudWxsKSB7Ci0gCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJCQlJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1JFU09VUkNFX01BTkFHRVJfVU5JUVVFTkFNRSwKLQkJCQkJCXJlc291cmNlTWFuYWdlci5nZXRVbmlxdWVOYW1lKCkpOwotCQkJSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcm1EeW5hbWljVGFiID0gZ2V0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihyZXNvdXJjZU1hbmFnZXIpOwotCQkJaWYgKHJtRHluYW1pY1RhYiA9PSBudWxsKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLlJlc291cmNlc1RhYl9Ob19MYXVuY2hfQ29uZmlndXJhdGlvbiwgbmV3IE9iamVjdFtdIHtyZXNvdXJjZU1hbmFnZXIuZ2V0TmFtZSgpfSkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVJNTGF1bmNoVmFsaWRhdGlvbiB2YWxpZGF0aW9uID0gcm1EeW5hbWljVGFiLnBlcmZvcm1BcHBseShjb25maWd1cmF0aW9uLCByZXNvdXJjZU1hbmFnZXIsIG51bGwpOwotCQkJaWYgKCF2YWxpZGF0aW9uLmlzU3VjY2VzcygpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKHZhbGlkYXRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotICAgICAgICBJUmVzb3VyY2VNYW5hZ2VyIHJtID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRGVmYXVsdCgpOwotCQlpZiAocm0gPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLlJlc291cmNlc1RhYl9Ob19SZXNvdXJjZV9NYW5hZ2VyKTsKLQkJCXJldHVybjsKLQkJfQotICAgICAgICBTdHJpbmcgcm1OYW1lID0gcm0uZ2V0VW5pcXVlTmFtZSgpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZSgKLQkJCQlJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1JFU09VUkNFX01BTkFHRVJfVU5JUVVFTkFNRSwKLQkJCQlybU5hbWUpOwotCi0JCUlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHJtRHluYW1pY1RhYiA9IGdldFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIocm0pOwotCQlpZiAocm1EeW5hbWljVGFiID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5SZXNvdXJjZXNUYWJfTm9fTGF1bmNoX0NvbmZpZ3VyYXRpb24sIG5ldyBPYmplY3RbXSB7cmVzb3VyY2VNYW5hZ2VyLmdldE5hbWUoKX0pKTsKLQkJfSBlbHNlIHsKLQkJCXJtRHluYW1pY1RhYi5zZXREZWZhdWx0cyhjb25maWd1cmF0aW9uLCBybSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZykgewotCQlzdXBlci5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjb2xzcGFuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU2Nyb2xsZWRDb21wb3NpdGUgY3JlYXRlTGF1bmNoQXR0cmlidXRlQ29udHJvbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sc3BhbikgewotCQlTY3JvbGxlZENvbXBvc2l0ZSBhdHRyQ29tcCA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gY29sc3BhbjsKLQkJYXR0ckNvbXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWF0dHJDb21wLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCWF0dHJDb21wLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQlyZXR1cm4gYXR0ckNvbXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGR5bmFtaWMgdGFiLCBnaXZlbiB0aGUgcmVzb3VyY2UgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcm0KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBjcmVhdGVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKAotCQkJZmluYWwgSVJlc291cmNlTWFuYWdlciBybSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJZmluYWwgQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHJtRmFjdG9yeSA9IAotCQkJUFRQTGF1bmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5KHJtKTsKLQkJaWYgKHJtRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBybUR5bmFtaWNUYWIgPQlybUZhY3RvcnkuY3JlYXRlKHJtKTsKLQkJaWYgKHJtRHluYW1pY1RhYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlybUR5bmFtaWNUYWIuYWRkQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIobGF1bmNoQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIpOwotCQlyZXR1cm4gcm1EeW5hbWljVGFiOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFNjcm9sbGVkQ29tcG9zaXRlIGdldExhdW5jaEF0dHJzU2Nyb2xsQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gbGF1bmNoQXR0cnNTY3JvbGxDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhIGRlZmF1bHQgcmVzb3VyY2UgbWFuYWdlci4gSWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gaXQgaXMKLQkgKiB0aGUgZGVmYXVsdC4gSWYgdGhlcmUgYXJlIG1vcmUgb3IgbGVzcyB0aGFuIG9uZSwgdGhlcmUgaXMgbm8gZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyRGVmYXVsdCgpIHsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVBVbml2ZXJzZSB1bml2ZXJzZSA9IG1vZGVsTWFuYWdlci5nZXRVbml2ZXJzZSgpOwotCQlpZiAodW5pdmVyc2UgIT0gbnVsbCkgewotCQkJSVJlc291cmNlTWFuYWdlcltdIHJtcyA9IG1vZGVsTWFuYWdlci5nZXRTdGFydGVkUmVzb3VyY2VNYW5hZ2Vycyh1bml2ZXJzZSk7Ci0JCQlpZiAocm1zLmxlbmd0aCAhPSAxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gcm1zWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyRnJvbUNvbWJvKCkgewotCQlpZiAocmVzb3VyY2VNYW5hZ2VyQ29tYm8gIT0gbnVsbCkgewotCQkJaW50IGkgPSByZXNvdXJjZU1hbmFnZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJcmV0dXJuIHJlc291cmNlTWFuYWdlcnMuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjYWNoZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZHluYW1pYyB0YWIuICBJZiBpdCBpc24ndCBpbiB0aGUgY2FjaGUKLQkgKiB0aGVuIGl0IGNyZWF0ZXMgYSBuZXcgb25lLCBhbmQgcHV0cyBpdCBpbiB0aGUgY2FjaGUuCi0JICogCi0JICogQHBhcmFtIHJtCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZ2V0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYigKLQkJCWZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJaWYgKCFybUR5bmFtaWNUYWJzLmNvbnRhaW5zS2V5KHJtKSkgeyAKLQkJCXRyeSB7Ci0JCQkJSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcm1EeW5hbWljVGFiID0KLQkJCQkJY3JlYXRlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSk7Ci0JCQkJcm1EeW5hbWljVGFicy5wdXQocm0sIHJtRHluYW1pY1RhYik7Ci0JCQkJcmV0dXJuIHJtRHluYW1pY1RhYjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXNldEVycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJUFRQTGF1bmNoUGx1Z2luLmVycm9yRGlhbG9nKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm1EeW5hbWljVGFicy5nZXQocm0pOwotCX0KLQotCS8qKgotICAgICAqIEhhbmRsZSBzZWxlY3Rpb24gb2YgYSByZXNvdXJjZSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJtU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLSAgICAJcmVzb3VyY2VNYW5hZ2VyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRnJvbUNvbWJvKCk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHBhcmFtIGNvbXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGF1bmNoQXR0cnNTY3JvbGxDb21wb3NpdGUoU2Nyb2xsZWRDb21wb3NpdGUgY29tcCkgewotCQl0aGlzLmxhdW5jaEF0dHJzU2Nyb2xsQ29tcG9zaXRlID0gY29tcDsKLQl9Ci0gICAgCi0JLyoqCi0JICogR2l2ZW4gYSByZXNvdXJjZSBtYW5hZ2VyLCBzZWxlY3QgaXQgaW4gdGhlIGNvbWJvCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UmVzb3VyY2VNYW5hZ2VyQ29tYm9TZWxlY3Rpb24oSVJlc291cmNlTWFuYWdlciBybSkgewotCQlmaW5hbCBJbnRlZ2VyIHJlc3VsdHMgPSByZXNvdXJjZU1hbmFnZXJJbmRpY2VzLmdldChybSk7Ci0JCWludCBpID0gMDsKLQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotCQkJaSA9IHJlc3VsdHMuaW50VmFsdWUoKTsKLQkJfQotCQlyZXNvdXJjZU1hbmFnZXJDb21iby5zZWxlY3QoaSk7Ci0JCXJtU2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLSAgICAKLSAgICAvKioKLQkgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gZWl0aGVyIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9yIHRoZQotCSAqIHF1ZXVlIGhhcyBiZWVuIGNoYW5nZWQgdmlhIHRoZSBjb21ibyBib3hlcy4gIEl0J3Mgam9iIGlzIHRvCi0JICogcmVnZW5lcmF0ZSB0aGUgZHluYW1pYyB1aSBjb21wb25lbnRzLCBkZXBlbmRlbnQgb24gdGhlIHJlc291cmNlCi0JICogbWFuYWdlciBhbmQgcXVldWUgY2hvaWNlLgotCSAqIAotCSAqIEBwYXJhbSBybQotCSAqIEBwYXJhbSBxdWV1ZQotCSAqIEBwYXJhbSBsYXVuY2hDb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxhdW5jaEF0dHJpYnV0ZUNvbnRyb2xzKElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUsCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uKSB7Ci0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIGxhdW5jaEF0dHJzU2Nyb2xsQ29tcCA9IGdldExhdW5jaEF0dHJzU2Nyb2xsQ29tcG9zaXRlKCk7Ci0JCWxhdW5jaEF0dHJzU2Nyb2xsQ29tcC5zZXRDb250ZW50KG51bGwpOwotCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBsYXVuY2hBdHRyc1Njcm9sbENvbXAuZ2V0Q2hpbGRyZW4oKSkgewotCQkJY2hpbGQuZGlzcG9zZSgpOwotCQl9Ci0JCUlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHJtRHluYW1pY1RhYiA9IGdldFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIocm0pOwotCQlpZiAocm1EeW5hbWljVGFiICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcm1EeW5hbWljVGFiLmNyZWF0ZUNvbnRyb2wobGF1bmNoQXR0cnNTY3JvbGxDb21wLCBybSwgcXVldWUpOwotCQkJCWZpbmFsIENvbnRyb2wgZHluQ29udHJvbCA9IHJtRHluYW1pY1RhYi5nZXRDb250cm9sKCk7Ci0JCQkJbGF1bmNoQXR0cnNTY3JvbGxDb21wLnNldENvbnRlbnQoZHluQ29udHJvbCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGR5bkNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlsYXVuY2hBdHRyc1Njcm9sbENvbXAuc2V0TWluU2l6ZShzaXplKTsKLQkJCQlybUR5bmFtaWNUYWIuaW5pdGlhbGl6ZUZyb20obGF1bmNoQXR0cnNTY3JvbGxDb21wLCBybSwgcXVldWUsIGxhdW5jaENvbmZpZ3VyYXRpb24pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlQVFBMYXVuY2hQbHVnaW4uZXJyb3JEaWFsb2coZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9CQkKLQkJbGF1bmNoQXR0cnNTY3JvbGxDb21wLmxheW91dCh0cnVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL1J1bGVEaWFsb2dGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvUnVsZURpYWxvZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2OWY4ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvUnVsZURpYWxvZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5Eb3dubG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5VcGxvYWRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBjbGFzcyBSdWxlRGlhbG9nRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBkaWFsb2cgdGhhdCBpcyBhYmxlIHRvIGVkaXQgYSBydWxlLgotCSAqIEBwYXJhbSBzaGVsbCBUaGUgU1dUIHNoZWxsIGZvciB0aGUgZGlhbG9nCi0JICogQHBhcmFtIHJ1bGUgVGhlIHJ1bGUgdG8gZWRpdAotCSAqIEByZXR1cm4gVGhlIGRpYWxvZyBvciBudWxsIGlmIG5vIGRpYWxvZyBpcyBrbm93biBmb3IgdGhlIHJ1bGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFsb2cgY3JlYXRlRGlhbG9nRm9yUnVsZShTaGVsbCBzaGVsbCwgSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSkgewotCQlpZiAocnVsZSBpbnN0YW5jZW9mIERvd25sb2FkUnVsZSkgewotCQkJRG93bmxvYWRSdWxlIGRvd25sb2FkUnVsZSA9IChEb3dubG9hZFJ1bGUpIHJ1bGU7Ci0JCQlyZXR1cm4gbmV3IERvd25sb2FkUnVsZURpYWxvZyhzaGVsbCwgZG93bmxvYWRSdWxlKTsKLQkJfSBlbHNlIGlmIChydWxlIGluc3RhbmNlb2YgVXBsb2FkUnVsZSkgewotCQkJVXBsb2FkUnVsZSB1cGxvYWRSdWxlID0gKFVwbG9hZFJ1bGUpIHJ1bGU7Ci0JCQlyZXR1cm4gbmV3IFVwbG9hZFJ1bGVEaWFsb2coc2hlbGwsIHVwbG9hZFJ1bGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvU3luY2hyb25pemF0aW9uUnVsZUxhYmVsUHJvdmlkZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9TeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM2MTUxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9TeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guaW50ZXJuYWwuTGludXhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLkRvd25sb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuVXBsb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotY2xhc3MgU3luY2hyb25pemF0aW9uUnVsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0JSW1hZ2UgdXBsb2FkUnVsZUltYWdlID0gbnVsbDsKLQlJbWFnZSBkb3dubG9hZFJ1bGVJbWFnZSA9IG51bGw7Ci0JCi0JU3RyaW5nIHJlbW90ZVdvcmtpbmdEaXI7Ci0KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uUnVsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVXb3JraW5nRGlyKCkgewotCQlyZXR1cm4gcmVtb3RlV29ya2luZ0RpcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVXb3JraW5nRGlyKFN0cmluZyByZW1vdGVXb3JraW5nRGlyKSB7Ci0JCXRoaXMucmVtb3RlV29ya2luZ0RpciA9IHJlbW90ZVdvcmtpbmdEaXI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRG93bmxvYWRSdWxlKSB7Ci0JCQlyZXR1cm4gZG93bmxvYWRSdWxlSW1hZ2U7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERvd25sb2FkUnVsZSkgewotCQkJcmV0dXJuIHVwbG9hZFJ1bGVJbWFnZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRG93bmxvYWRSdWxlKSB7Ci0JCQlEb3dubG9hZFJ1bGUgcnVsZSA9IChEb3dubG9hZFJ1bGUpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX1R5cGU7Ci0JCQlpZiAocnVsZS5nZXRSZW1vdGVGaWxlQ291bnQoKSA9PSAwKSB7Ci0JCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9Ob0ZpbGVzOwotCQkJfSBlbHNlIGlmIChydWxlLmdldFJlbW90ZUZpbGVDb3VudCgpID09IDEpIHsKLQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09uZUZpbGU7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCArPSBOTFMuYmluZChNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfTXVsdGlwbGVGaWxlcywgbmV3IEludGVnZXIocnVsZS5nZXRSZW1vdGVGaWxlQ291bnQoKSkpOwotCQkJfQotCQkJaWYgKHJ1bGUuZ2V0UmVtb3RlRmlsZUNvdW50KCkgPj0gMSkgewotCQkJCXJlc3VsdCArPSAnXG4nICsgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Zyb21MYWJlbDsKLQkJCQlTdHJpbmcgZmlsZXNbXSA9IHJ1bGUuZ2V0UmVtb3RlRmlsZXNBc1N0cmluZ0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOwotCQkJCQlpZiAoaSAhPSAwKSBmaWxlICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9GaWxlTGlzdFNlcGFyYXRvcjsKLQkJCQkJcmVzdWx0ICs9IGZpbGU7Ci0JCQkJfQotCQkJCXJlc3VsdCArPSAnXG4nOwotCQkJCWlmIChydWxlLmdldExvY2FsRGlyZWN0b3J5KCkgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTWlzc2luZzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTGFiZWwgKyBydWxlLmdldExvY2FsRGlyZWN0b3J5KCk7CQkJCQkJCQotCQkJCX0KLQkJCQlpZiAocnVsZS5pc0FzRXhlY3V0YWJsZSgpIHx8IHJ1bGUuaXNBc1JlYWRPbmx5KCkgfHwgcnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpIHsJCQkJCQkJcmVzdWx0ICs9ICdcbicgKyBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc0xhYmVsOwkJCQotCQkJCQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JCQkJCWlmIChydWxlLmlzQXNFeGVjdXRhYmxlKCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zU2VwYXJhdG9yOyBlbHNlIGNvbW1hID0gdHJ1ZTsKLQkJCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc19FeGVjdXRhYmxlOwotCQkJCQl9Ci0JCQkJCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQkJCQlpZiAoY29tbWEpIHJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc1NlcGFyYXRvcjsgZWxzZSBjb21tYSA9IHRydWU7Ci0JCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNfUmVhZG9ubHk7CQkJCQkJCQkKLQkJCQkJfQotCQkJCQlpZiAocnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zU2VwYXJhdG9yOyBlbHNlIGNvbW1hID0gdHJ1ZTsKLQkJCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc19QcmVzZXJ2ZVRpbWVTdGFtcDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVwbG9hZFJ1bGUpIHsKLQkJCVVwbG9hZFJ1bGUgcnVsZSA9IChVcGxvYWRSdWxlKSBlbGVtZW50OwotCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfVHlwZTsKLQkJCWlmIChydWxlLmdldFJlbW90ZUZpbGVDb3VudCgpID09IDApIHsKLQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9Ob0ZpbGVzOwotCQkJfSBlbHNlIGlmIChydWxlLmdldFJlbW90ZUZpbGVDb3VudCgpID09IDEpIHsKLQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PbmVGaWxlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgKz0gTkxTLmJpbmQoTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9NdWx0aXBsZUZpbGVzLCBuZXcgSW50ZWdlcihydWxlLmdldFJlbW90ZUZpbGVDb3VudCgpKSApOwotCQkJfQotCQkJaWYgKHJ1bGUuZ2V0UmVtb3RlRmlsZUNvdW50KCkgPj0gMSkgewotCQkJCXJlc3VsdCArPSAnXG4nICsgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9Gcm9tTGFiZWw7Ci0JCQkJU3RyaW5nIGZpbGVzW10gPSBydWxlLmdldExvY2FsRmlsZXNBc1N0cmluZ0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOwotCQkJCQlpZiAoaSAhPSAwKSBmaWxlICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRmlsZUxpc3RTZXBhcmF0b3I7Ci0JCQkJCXJlc3VsdCArPSBmaWxlOwotCQkJCX0KLQkJCQlyZXN1bHQgKz0gJ1xuJzsKLQkJCQlpZiAoKHJ1bGUuZ2V0UmVtb3RlRGlyZWN0b3J5KCkgPT0gbnVsbCkgfHwgcnVsZS5pc0RlZmF1bHRSZW1vdGVEaXJlY3RvcnkoKSkgewotCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvbkxhYmVsK3JlbW90ZVdvcmtpbmdEaXI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVBhdGggcmVtb3RlV29ya2luZ1BhdGggPSBuZXcgUGF0aChyZW1vdGVXb3JraW5nRGlyKTsKLQkJCQkJSVBhdGggcmVtb3RlUGF0aCA9IG5ldyBQYXRoKHJ1bGUuZ2V0UmVtb3RlRGlyZWN0b3J5KCkpOwotCQkJCQlpZiAoISByZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJcmVtb3RlUGF0aCA9IHJlbW90ZVdvcmtpbmdQYXRoLmFwcGVuZChyZW1vdGVQYXRoKTsKLQkJCQkJfQotCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvbkxhYmVsK0xpbnV4UGF0aC50b1N0cmluZyhyZW1vdGVQYXRoKTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSB8fCBydWxlLmlzQXNSZWFkT25seSgpIHx8IHJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpIHx8IHJ1bGUuaXNEb3dubG9hZEJhY2soKSkgewotCQkJCQlyZXN1bHQgKz0gJ1xuJyArIE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc0xhYmVsOwkJCQotCQkJCQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JCQkJCWlmIChydWxlLmlzQXNFeGVjdXRhYmxlKCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRGVzdGluYXRpb25TZXBhcmF0b3I7IGVsc2UgY29tbWEgPSB0cnVlOwotCQkJCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc19FeGVjdXRhYmxlOwotCQkJCQl9Ci0JCQkJCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQkJCQlpZiAoY29tbWEpIHJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0Rlc3RpbmF0aW9uU2VwYXJhdG9yOyBlbHNlIGNvbW1hID0gdHJ1ZTsKLQkJCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfUmVhZG9ubHk7CQkJCQkJCQkKLQkJCQkJfQotCQkJCQlpZiAocnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRGVzdGluYXRpb25TZXBhcmF0b3I7IGVsc2UgY29tbWEgPSB0cnVlOwotCQkJCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc19QcmVzZXJ2ZVRpbWVTdGFtcDsKLQkJCQkJfQotCQkJCQlpZiAocnVsZS5pc0Rvd25sb2FkQmFjaygpKSB7Ci0JCQkJCQlpZiAoY29tbWEpIHJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0Rlc3RpbmF0aW9uU2VwYXJhdG9yOyBlbHNlIGNvbW1hID0gdHJ1ZTsKLQkJCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfRG93bmxvYWRCYWNrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsJCQkJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodXBsb2FkUnVsZUltYWdlICE9IG51bGwpIHVwbG9hZFJ1bGVJbWFnZS5kaXNwb3NlKCk7Ci0JCWlmIChkb3dubG9hZFJ1bGVJbWFnZSAhPSBudWxsKSBkb3dubG9hZFJ1bGVJbWFnZS5kaXNwb3NlKCk7Ci0JCXVwbG9hZFJ1bGVJbWFnZSA9IG51bGw7Ci0JCWRvd25sb2FkUnVsZUltYWdlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9VcGxvYWRSdWxlRGlhbG9nLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvVXBsb2FkUnVsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTk5MjgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9VcGxvYWRSdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guZGF0YS5PdmVyd3JpdGVQb2xpY2llczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLmRhdGEuVXBsb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQ29tYm9Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkNvbWJvTW9sZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkNvbnRyb2xzUmVsYXRpb25zaGlwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuRnJhbWVNb2xkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuVGV4dEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuVGV4dE1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzsKLQotCi1wdWJsaWMgY2xhc3MgVXBsb2FkUnVsZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyBpbXBsZW1lbnRzIElSdWxlRGlhbG9nIHsKLQotCUNvbXBvc2l0ZSBjb250ZW50OwotCUJ1dHRvbiBkZWZhdWx0UmVtb3RlRGlyZWN0b3J5QnV0dG9uOwotCUNvbnRyb2xzUmVsYXRpb25zaGlwSGFuZGxlciByZW1vdGVEaXJlY3RvcnlSZWxhdGlvbnNoaXBIYW5kbGVyOwotCVRleHRHcm91cCByZW1vdGVEaXJlY3RvcnlUZXh0OwotCUJ1dHRvbiBhc1JlYWRPbmx5QnV0dG9uLCBhc0V4ZWN1dGFibGVCdXR0b247Ci0JQnV0dG9uIGRvd25sb2FkQmFja0J1dHRvbiwgcHJlc2VydmVUaW1lU3RhbXBCdXR0b247Ci0JQ29tYm9Hcm91cCBvdmVyd3JpdGVQb2xpY3lDb21ibzsKLQlCdXR0b24gcmVtb3ZlRmlsZXNCdXR0b247Ci0JQnV0dG9uIGFkZEZpbGVzRnJvbUZpbGVzeXN0ZW1CdXR0b247Ci0JQnV0dG9uIGFkZERpcmVjdG9yaWVzRnJvbUZpbGVzeXN0ZW1CdXR0b247Ci0JQnV0dG9uIGFkZEZpbGVzRnJvbVdvcmtzcGFjZUJ1dHRvbjsKLQlMaXN0IGZpbGVMaXN0OwotCQotCVVwbG9hZFJ1bGUgdXBsb2FkUnVsZTsKLQkKLQlJUGF0aCBsYXN0U2VsZWN0ZWREaXJlY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JcHJpdmF0ZSBpbnQgbGlzdGVuZXJzRW5hYmxlZCA9IDA7Ci0JCi0JcHVibGljIFVwbG9hZFJ1bGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFVwbG9hZFJ1bGUgcnVsZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCQotCQl1cGxvYWRSdWxlID0gcnVsZTsKLQl9Ci0JCi0vLwlwdWJsaWMgVXBsb2FkUnVsZURpYWxvZyhTaGVsbCBzaGVsbCkgewotLy8JCXN1cGVyKHNoZWxsKTsKLS8vCQl1cGxvYWRSdWxlID0gbmV3IFVwbG9hZFJ1bGUoKTsKLS8vCQkvLyBzZXQgZGVmYXVsdHMKLS8vCQl1cGxvYWRSdWxlLnNldERlZmF1bHRSZW1vdGVEaXJlY3RvcnkodHJ1ZSk7Ci0vLwkJdXBsb2FkUnVsZS5zZXRSZW1vdGVEaXJlY3RvcnkobnVsbCk7Ci0vLwkJdXBsb2FkUnVsZS5zZXRPdmVyd3JpdGVQb2xpY3koT3ZlcndyaXRlUG9saWNpZXMuQUxXQVlTKTsKLS8vCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJTGF5b3V0IGwgPSBjb250ZW50LmdldFBhcmVudCgpLmdldExheW91dCgpOwotCQljb250ZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfVGl0bGUpOwotCQlzZXRNZXNzYWdlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfTWVzc2FnZSk7Ci0JCQotCQljcmVhdGVSZW1vdGVEaXJlY3RvcnlDb21wb3NpdGUoY29udGVudCk7Ci0JCWNyZWF0ZUZpbGVzQ29tcG9zaXRlKGNvbnRlbnQpOwotCQljcmVhdGVPcHRpb25zQ29tcG9zaXRlKGNvbnRlbnQpOwotCQkKLQkJcHV0RmllbGRDb250ZW50cygpOwotCQkKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1dEZpZWxkQ29udGVudHMoKSB7Ci0JCWRpc2FibGVMaXN0ZW5lcnMoKTsKLQkJZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbi5zZXRTZWxlY3Rpb24odXBsb2FkUnVsZS5pc0RlZmF1bHRSZW1vdGVEaXJlY3RvcnkoKSk7Ci0JCXJlbW90ZURpcmVjdG9yeVJlbGF0aW9uc2hpcEhhbmRsZXIubWFuYWdlRGVwZW5kZW50Q29udHJvbHMoZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbik7Ci0JCWlmICh1cGxvYWRSdWxlLmdldFJlbW90ZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCXJlbW90ZURpcmVjdG9yeVRleHQuc2V0U3RyaW5nKHVwbG9hZFJ1bGUuZ2V0UmVtb3RlRGlyZWN0b3J5KCkpOwotCQl9IGVsc2UgewotCQkJcmVtb3RlRGlyZWN0b3J5VGV4dC5zZXRTdHJpbmcoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNSZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24odXBsb2FkUnVsZS5pc0FzUmVhZE9ubHkoKSk7IAotCQlhc0V4ZWN1dGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKHVwbG9hZFJ1bGUuaXNBc0V4ZWN1dGFibGUoKSk7Ci0JCWRvd25sb2FkQmFja0J1dHRvbi5zZXRTZWxlY3Rpb24odXBsb2FkUnVsZS5pc0Rvd25sb2FkQmFjaygpKTsgCi0JCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uLnNldFNlbGVjdGlvbih1cGxvYWRSdWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSk7Ci0JCW92ZXJ3cml0ZVBvbGljeUNvbWJvLnNlbGVjdEluZGV4VXNpbmdJRChJbnRlZ2VyLnRvU3RyaW5nKHVwbG9hZFJ1bGUuZ2V0T3ZlcndyaXRlUG9saWN5KCkpKTsKLQkJU3RyaW5nIGl0ZW1zW10gPSB1cGxvYWRSdWxlLmdldExvY2FsRmlsZXNBc1N0cmluZ0FycmF5KCk7Ci0JCUFycmF5cy5zb3J0KGl0ZW1zKTsKLQkJZmlsZUxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCQllbmFibGVMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUxpc3RlbmVycygpIHsKLQkJbGlzdGVuZXJzRW5hYmxlZCArKzsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNhYmxlTGlzdGVuZXJzKCkgewotCQlsaXN0ZW5lcnNFbmFibGVkLS07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZldGNoRmllbGRDb250ZW50cygpIHsKLQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQl1cGxvYWRSdWxlLnNldERlZmF1bHRSZW1vdGVEaXJlY3RvcnkoZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVwbG9hZFJ1bGUuc2V0UmVtb3RlRGlyZWN0b3J5KHJlbW90ZURpcmVjdG9yeVRleHQuZ2V0U3RyaW5nKCkpOwotCQl1cGxvYWRSdWxlLnNldEFzRXhlY3V0YWJsZShhc0V4ZWN1dGFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl1cGxvYWRSdWxlLnNldEFzUmVhZE9ubHkoYXNSZWFkT25seUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVwbG9hZFJ1bGUuc2V0RG93bmxvYWRCYWNrKGRvd25sb2FkQmFja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVwbG9hZFJ1bGUuc2V0UHJlc2VydmVUaW1lU3RhbXAocHJlc2VydmVUaW1lU3RhbXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl1cGxvYWRSdWxlLnNldE92ZXJ3cml0ZVBvbGljeShJbnRlZ2VyLnBhcnNlSW50KG92ZXJ3cml0ZVBvbGljeUNvbWJvLmdldFNlbGVjdGlvbklkKCkpKTsKLQkJdXBsb2FkUnVsZS5zZXRMb2NhbEZpbGVzKGZpbGVMaXN0LmdldEl0ZW1zKCkpOwotCQlTdHJpbmcgcGF0aCA9cmVtb3RlRGlyZWN0b3J5VGV4dC5nZXRTdHJpbmcoKS50cmltKCk7Ci0JCWlmIChwYXRoLmxlbmd0aCgpID4gMCkgewotCQkJdXBsb2FkUnVsZS5zZXRSZW1vdGVEaXJlY3RvcnkocGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQl1cGxvYWRSdWxlLnNldFJlbW90ZURpcmVjdG9yeShudWxsKTsKLQkJfQotCQllbmFibGVMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlmZXRjaEZpZWxkQ29udGVudHMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlUmVtb3RlRGlyZWN0b3J5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX1JlbW90ZURpcmVjdG9yeUZyYW1lX1RpdGxlKTsKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0KLQkJZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGVudHMsIFNXVC5DSEVDSyk7Ci0JCWRlZmF1bHRSZW1vdGVEaXJlY3RvcnlCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX1JlbW90ZURpcmVjdG9yeUZyYW1lX0xhYmVsRGVmYXVsdEJ1dHRvbik7Ci0JCWRlZmF1bHRSZW1vdGVEaXJlY3RvcnlCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCVRleHRNb2xkIG1vbGQgPSBuZXcgVGV4dE1vbGQoVGV4dE1vbGQuR1JJRF9EQVRBX0dSQUJfRVhDRVNTX1NQQUNFIHwgVGV4dE1vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMLCBNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX1JlbW90ZURpcmVjdG9yeUZyYW1lX0xhYmVsRGlyZWN0b3J5KTsKLQkJcmVtb3RlRGlyZWN0b3J5VGV4dCA9IG5ldyBUZXh0R3JvdXAoY29udGVudHMsIG1vbGQpOwotCi0JCXJlbW90ZURpcmVjdG9yeVJlbGF0aW9uc2hpcEhhbmRsZXIgPSBuZXcgQ29udHJvbHNSZWxhdGlvbnNoaXBIYW5kbGVyKGRlZmF1bHRSZW1vdGVEaXJlY3RvcnlCdXR0b24sIG5ldyBDb250cm9sW10ge3JlbW90ZURpcmVjdG9yeVRleHR9LCBmYWxzZSk7Ci0JCXJldHVybiByZW1vdGVEaXJlY3RvcnlUZXh0OwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUZpbGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWVNb2xkIGZyYW1lTW9sZCA9IG5ldyBGcmFtZU1vbGQoKTsKLQkJZnJhbWVNb2xkLnNldENvbHVtbnMoMik7Ci0JCWZyYW1lTW9sZC5zZXRUaXRsZShNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfVGl0bGUpOwotCQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZShwYXJlbnQsIGZyYW1lTW9sZCk7Ci0JCWZyYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkKLQkJRnJhbWUgZmlsZXNGcmFtZSA9IG5ldyBGcmFtZShmcmFtZS5nZXRDb21wb3NpdGUoKSk7Ci0JCWZpbGVMaXN0ID0gbmV3IExpc3QoZmlsZXNGcmFtZSwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50PTIwMDsKLQkJZmlsZUxpc3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWZpbGVMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJcmVtb3ZlRmlsZXNCdXR0b24uc2V0RW5hYmxlZChmaWxlTGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDApOwotCQkJfQotCQl9KTsKLQkJZmlsZUxpc3QuZGVzZWxlY3RBbGwoKTsKLQkJCi0JCUZyYW1lIGJ1dHRvbkZyYW1lID0gbmV3IEZyYW1lKGZyYW1lLmdldENvbXBvc2l0ZSgpKTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uRnJhbWUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfRGVzY3JpcHRpb24pOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRmlsZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJYWRkRmlsZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9BZGRGaWxlc0J1dHRvbik7Ci0JCWFkZEZpbGVzRnJvbUZpbGVzeXN0ZW1CdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCWFkZEZpbGVzRnJvbUZpbGVzeXN0ZW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQloYW5kbGVGaWxlc0Zyb21GaWxlc3lzdGVtQnV0dG9uRXZlbnQoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCWFkZERpcmVjdG9yaWVzRnJvbUZpbGVzeXN0ZW1CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkZyYW1lLCBTV1QuUFVTSCk7Ci0JCWFkZERpcmVjdG9yaWVzRnJvbUZpbGVzeXN0ZW1CdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkRGlyZWN0b3J5QnV0dG9uKTsKLQkJYWRkRGlyZWN0b3JpZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRGlyZWN0b3JpZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkgcmV0dXJuOwotCQkJCWhhbmRsZURpcmVjdG9yeUZyb21GaWxlc3lzdGVtQnV0dG9uRXZlbnQoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCWFkZEZpbGVzRnJvbVdvcmtzcGFjZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJYWRkRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX0FkZFdvcmtzcGFjZUJ1dHRvbik7Ci0JCWFkZEZpbGVzRnJvbVdvcmtzcGFjZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJaGFuZGxlRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uRXZlbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCWxhYmVsID0gbmV3IExhYmVsKGJ1dHRvbkZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUZpbGVzTGFiZWwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkZyYW1lLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUJ1dHRvbik7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmVGaWxlc0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApCi0JCQkJCXJldHVybjsKLQkJCQloYW5kbGVSZW1vdmVGaWxlc0J1dHRvbkV2ZW50KCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YTIuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTIudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlidXR0b25GcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCQotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlT3B0aW9uc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZyYW1lTW9sZCBmcmFtZU1vbGQgPSBuZXcgRnJhbWVNb2xkKCk7Ci0JCWZyYW1lTW9sZC5zZXRDb2x1bW5zKDIpOwotCQlmcmFtZU1vbGQuYWRkT3B0aW9uKEZyYW1lTW9sZC5DT0xVTU5TX0VRVUFMX1dJRFRIKTsKLQkJZnJhbWVNb2xkLnNldFRpdGxlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1RpdGxlKTsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBmcmFtZU1vbGQpOwotCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IGZyYW1lLmdldENvbXBvc2l0ZSgpOwotCQlhc1JlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbihjb250ZW50cywgU1dULkNIRUNLKTsKLQkJYXNSZWFkT25seUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1JlYWRvbmx5Q2hlY2spOwotCQlhc0V4ZWN1dGFibGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuQ0hFQ0spOwotCQlhc0V4ZWN1dGFibGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9FeGVjdXRhYmxlQ2hlY2spOwotCQlkb3dubG9hZEJhY2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuQ0hFQ0spOwotCQlkb3dubG9hZEJhY2tCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9Eb3dubG9hZEJhY2tDaGVjayk7Ci0JCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uID0gbmV3IEJ1dHRvbihjb250ZW50cywgU1dULkNIRUNLKTsKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9QcmVzZXJ2ZVRpbWVTdGFtcENoZWNrKTsKLQkJCi0JCUNvbWJvTW9sZCBtb2xkID0gbmV3IENvbWJvTW9sZChDb21ib01vbGQuR1JJRF9EQVRBX1NQQU4pOwotCQltb2xkLnNldExhYmVsKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUxhYmVsKTsKLQkJbW9sZC5zZXRUZXh0RmllbGRXaWR0aCg0MCk7Ci0JCW1vbGQuYWRkSXRlbShJbnRlZ2VyLnRvU3RyaW5nKE92ZXJ3cml0ZVBvbGljaWVzLlNLSVApLCBNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uKTsKLQkJbW9sZC5hZGRJdGVtKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuQUxXQVlTKSwgTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlQ29tYm9fT3ZlcndyaXRlT3B0aW9uKTsKLQkJbW9sZC5hZGRJdGVtKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuTkVXRVIpLCBNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVJZk5ld2VyT3B0aW9uKTsKLQkJb3ZlcndyaXRlUG9saWN5Q29tYm8gPSBuZXcgQ29tYm9Hcm91cChjb250ZW50cywgbW9sZCk7Ci0JCW92ZXJ3cml0ZVBvbGljeUNvbWJvLmdldENvbWJvKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkKLQkJCQkJcmV0dXJuOwotCQkJCWRpc2FibGVMaXN0ZW5lcnMoKTsKLQkJCQlpZiAob3ZlcndyaXRlUG9saWN5Q29tYm8uZ2V0U2VsZWN0aW9uSWQoKS5lcXVhbHMoSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5ORVdFUikpKSB7Ci0JCQkJCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsJCQkJCQotCQkJCX0KLQkJCQllbmFibGVMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQkKLQljbGFzcyBQYXRoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCUl0ZXJhdG9yIGludGVybmFsSXRlcmF0b3I7Ci0JCQotCQlwdWJsaWMgUGF0aEl0ZXJhdG9yKEl0ZXJhdG9yIGludGVybmFsSXRlcmF0b3IpIHsKLQkJCXRoaXMuaW50ZXJuYWxJdGVyYXRvciA9IGludGVybmFsSXRlcmF0b3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBQYXRoSXRlcmF0b3IoU3RyaW5nIFtdIGFycmF5KSB7Ci0JCQl0aGlzLmludGVybmFsSXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KGFycmF5KS5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIFBhdGhJdGVyYXRvcihqYXZhLnV0aWwuTGlzdCBsaXN0KSB7Ci0JCQl0aGlzLmludGVybmFsSXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGludGVybmFsSXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoKFN0cmluZylpbnRlcm5hbEl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWludGVybmFsSXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbGVzRnJvbUZpbGVzeXN0ZW1CdXR0b25FdmVudCgpIHsKLQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk9QRU4gfCBTV1QuTVVMVEkpOwotCi0JCS8qCi0JCSAqIEZpbHRlciBwYXRoIG11c3QgYmUgc2V0IHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZmlsZS4KLQkJICovCi0JCWZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0U2VsZWN0ZWREaXJlY3RvcnkudG9PU1N0cmluZygpKTsKLQkJZmlsZURpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZEZpbGVEaWFsb2dfVGl0bGUpOwotCQkJCQotCQlTdHJpbmcgcmVzdWx0ID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlsYXN0U2VsZWN0ZWREaXJlY3RvcnkgPSBuZXcgUGF0aChmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKSk7Ci0JCQkvKgotCQkJICogT25seSBhZGQgZmlsZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuCi0JCQkgKiBJZiBmaWxlIGlzIGluc2lkZSB0aGUgd29ya3NwYWNlLCBhZGQgcmVsYXRpdmUgcGF0aC4KLQkJCSAqLwotCQkJSVBhdGggd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJSVBhdGggZmlsZVJvb3QgPSBuZXcgUGF0aChmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKSk7Ci0JCQlIYXNoU2V0IGZpbGVTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGZpbGVMaXN0LmdldEl0ZW1zKCkpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBQYXRoSXRlcmF0b3IoZmlsZURpYWxvZy5nZXRGaWxlTmFtZXMoKSk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCS8qCi0JCQkJICogSWYgbm90IGFic29sdXRlLCB0aGUgbWFrZSBpdCBhYnNvbHV0ZSBhY2NvcmRpbmcgdG8gcGF0aCBpbiBkaWFsb2cuCi0JCQkJICogVGhpcyBpcyBkdWUgYmVoYXZpb3VyIGhvdyBGaWxlRGlhbG9nIHJldHVybnMgc2VsZWN0ZWQgZmlsZXMuCi0JCQkJICovCi0JCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCEgcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQkJcGF0aCA9IGZpbGVSb290LmFwcGVuZChwYXRoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyoKLQkJCQkgKiBJZiBwYXRoIGlzIGluc2lkZSB0aGUgd29ya3NwYWNlLCB0aGVuIG1ha2UgaXQgcmVsYXRpdmUuCi0JCQkJICovCi0JCQkJaWYgKHdvcmtzcGFjZS5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMod29ya3NwYWNlLnNlZ21lbnRDb3VudCgpKTsKLQkJCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8qCi0JCQkJICogSWYgYWxyZWFkeSBpbiB0aGUgbGlzdCwgdGhlIGlnbm9yZS4KLQkJCQkgKi8KLQkJCQlTdHJpbmcgZnVsbFBhdGggPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCQlpZiAoISBmaWxlU2V0LmNvbnRhaW5zKGZ1bGxQYXRoKSkgewotCQkJCQlmaWxlU2V0LmFkZChmdWxsUGF0aCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlTdHJpbmcgaXRlbXNbXSA9IG5ldyBTdHJpbmdbZmlsZVNldC5zaXplKCldOwotCQkJaXRlbXMgPSAoU3RyaW5nW10pIGZpbGVTZXQudG9BcnJheShpdGVtcyk7Ci0JCQlBcnJheXMuc29ydChpdGVtcyk7Ci0JCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGlyZWN0b3J5RnJvbUZpbGVzeXN0ZW1CdXR0b25FdmVudCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpcmVjdG9yeURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCQkKLQkJZGlyZWN0b3J5RGlhbG9nLnNldEZpbHRlclBhdGgobGFzdFNlbGVjdGVkRGlyZWN0b3J5LnRvT1NTdHJpbmcoKSk7Ci0JCWRpcmVjdG9yeURpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZERpcmVjdG9yeURpYWxvZ19UaXRsZSk7Ci0JCWRpcmVjdG9yeURpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZEZpbGVEaWFsb2dfRGVzY3JpcHRpb24pOwotCi0JCVN0cmluZyBuZXdQYXRoID0gZGlyZWN0b3J5RGlhbG9nLm9wZW4oKTsKLQotCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7Ci0JCQlIYXNoU2V0IGZpbGVTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGZpbGVMaXN0LmdldEl0ZW1zKCkpKTsKLQkJCUlQYXRoIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdQYXRoKTsKLQkJCQotCQkJLyoKLQkJCSAqIElmIHBhdGggaXMgaW5zaWRlIHRoZSB3b3Jrc3BhY2UsIHRoZW4gbWFrZSBpdCByZWxhdGl2ZS4KLQkJCSAqLwotCQkJaWYgKHdvcmtzcGFjZS5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh3b3Jrc3BhY2Uuc2VnbWVudENvdW50KCkpOwotCQkJCXBhdGggPSBwYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogSWYgYWxyZWFkeSBpbiB0aGUgbGlzdCwgdGhlIGlnbm9yZS4KLQkJCSAqLwotCQkJU3RyaW5nIGZ1bGxQYXRoID0gcGF0aC50b09TU3RyaW5nKCk7Ci0JCQlpZiAoISBmaWxlU2V0LmNvbnRhaW5zKGZ1bGxQYXRoKSkgewotCQkJCWZpbGVTZXQuYWRkKGZ1bGxQYXRoKTsKLQkJCQkKLQkJCQlTdHJpbmcgaXRlbXNbXSA9IG5ldyBTdHJpbmdbZmlsZVNldC5zaXplKCldOwotCQkJCWl0ZW1zID0gKFN0cmluZ1tdKSBmaWxlU2V0LnRvQXJyYXkoaXRlbXMpOwotCQkJCUFycmF5cy5zb3J0KGl0ZW1zKTsKLQkJCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiBTYXZlIGxhc3RTZWxlY3RlZERpcmVjdG9yeS4gVGhlcmUgaXMgYSBidWcgaW4gRGlyZWN0b3J5RGlhbG9nLgotCQkJICogVGhlIG1ldGhvZCBnZXRGaWx0ZXJQYXRoIGRvZXMgbm90IHJldHVybiB0aGUgZXhwZWN0ZWQgcGF0aC4KLQkJCSAqIFRoZSBidWcgd2lsbCBiZSBmaXhlZCBpbiBFY2xpcHNlIDMuNC4KLQkJCSAqIFRoZSB3b3JrYXJvdW50IHRha2VzIHRoZSBwYXJlbnQgb2YgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeSBhcyBsYXN0U2VsZWN0ZWREaXJlY3RvcnkuCi0JCQkgKi8KLQkJCWxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IG5ldyBQYXRoKG5ld1BhdGgpOwotCQkJbGFzdFNlbGVjdGVkRGlyZWN0b3J5ID0gbGFzdFNlbGVjdGVkRGlyZWN0b3J5LnJlbW92ZUxhc3RTZWdtZW50cygxKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JfQotCi0KLQlSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyByZXNvdXJjZURpYWxvZyA9IG51bGw7Ci0JcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbGVzRnJvbVdvcmtzcGFjZUJ1dHRvbkV2ZW50KCkgewotCQkvKgotCQkgKiBDcmVhdGUgYSBsaXN0IGEgcmVzb3VyY2UgZm9yIGFsbCByZWxhdGl2ZSBwYXRocy4gVGhlIG11c3QgYmUgdmFsaWQgcmVzb3VyY2VzIGluIHRoZSB3b3Jrc3BhY2UuCi0JCSAqIE90aGVyd2lzZSwgdGhleSBhcmUgaWdub3JlZCBhbmQgcmVtb3ZlZC4KLQkJICovCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlBcnJheUxpc3QgcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgUGF0aEl0ZXJhdG9yKGZpbGVMaXN0LmdldEl0ZW1zKCkpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlTGlzdC5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCU9iamVjdCBpbml0aWFsU2VsZWN0aW9uW10gPSByZXNvdXJjZUxpc3QudG9BcnJheSgpOwotCQkKLQkJLyoKLQkJICogU2hvdyB0aGUgZGlhbG9nLgotCQkgKi8KLQkJaWYgKHJlc291cmNlRGlhbG9nID09IG51bGwpIHsKLQkJCXJlc291cmNlRGlhbG9nID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIG51bGwpOwotCQl9Ci0JCXJlc291cmNlRGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKCBpbml0aWFsU2VsZWN0aW9uICk7Ci0JCXJlc291cmNlRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlyZXNvdXJjZURpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZFdvcmtzcGFjZURpYWxvZ19EZXNjcmlwdGlvbik7Ci0JCXJlc291cmNlRGlhbG9nLnNldFRpdGxlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZFdvcmtzcGFjZURpYWxvZ19UaXRsZSk7Ci0JCXJlc291cmNlRGlhbG9nLm9wZW4oKTsKLQotCQkvKgotCQkgKiBHZXQgcmVzdWx0cyBhbmQgdXBkYXRlZCBsb2NhbCBmaWxlcy4KLQkJICovCi0JCU9iamVjdFtdIHJlc3VsdHMgPSByZXNvdXJjZURpYWxvZy5nZXRSZXN1bHQoKTsKLQotCQlpZiAocmVzdWx0cyAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogRmlsdGVyIG9ubHkgYWJzb2x1dGUgcGF0aC4gUmVsYXRpdmUgcGF0aHMgYXJlIHJlbW92ZWQuCi0JCQkgKi8KLQkJCUhhc2hTZXQgbmV3RmlsZUxpc3QgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IFBhdGhJdGVyYXRvcihmaWxlTGlzdC5nZXRJdGVtcygpKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCEgcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCW5ld0ZpbGVMaXN0LmFkZChwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBZGQgaXRlbXMgdGhhdCBhIHNlbGVjdGVkIGluIHRoZSBkaWFsb2cgYnV0IG5vdCBpbiB0aGUgZmlsZSBsaXN0LgotCQkJICovCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXN1bHRzW2ldOwotCQkJCVN0cmluZyBlbnRyeSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9PU1N0cmluZygpOwotCQkJCW5ld0ZpbGVMaXN0LmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBpdGVtc1tdID0gbmV3IFN0cmluZ1tuZXdGaWxlTGlzdC5zaXplKCldOwotCQkJaXRlbXMgPSAoU3RyaW5nW10pIG5ld0ZpbGVMaXN0LnRvQXJyYXkoaXRlbXMpOwotCQkJQXJyYXlzLnNvcnQoaXRlbXMpOwotCQkJZmlsZUxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVGaWxlc0J1dHRvbkV2ZW50KCkgewkJCi0JCVN0cmluZyBzZWxlY3Rpb24gW10gPSBmaWxlTGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlIYXNoU2V0IGZpbGVTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGZpbGVMaXN0LmdldEl0ZW1zKCkpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBzZWxlY3Rpb25baV07Ci0JCQlmaWxlU2V0LnJlbW92ZShzdHJpbmcpOwotCQl9Ci0JCQotCQlTdHJpbmcgaXRlbXNbXSA9IG5ldyBTdHJpbmdbZmlsZVNldC5zaXplKCldOwotCQlpdGVtcyA9IChTdHJpbmdbXSkgZmlsZVNldC50b0FycmF5KGl0ZW1zKTsKLQkJQXJyYXlzLnNvcnQoaXRlbXMpOwotCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCi0JcHVibGljIElTeW5jaHJvbml6YXRpb25SdWxlIGdldFJ1bGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHVwbG9hZFJ1bGU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvV29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvV29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYmNmOWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL1dvcmtpbmdEaXJlY3RvcnlCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdEaXJlY3RvcnlCbG9jayBleHRlbmRzIExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotICAgIHByb3RlY3RlZCBCdXR0b24gdXNlRGVmYXVsdFdvcmtpbmdEaXJCdXR0b24gPSBudWxsOwotICAgIHByb3RlY3RlZCBCdXR0b24gbG9jYWxEaXJCdXR0b24gPSBudWxsOwotICAgIHByb3RlY3RlZCBUZXh0IHdvcmtpbmdEaXJUZXh0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQnV0dG9uIHdvcmtpbmdEaXJCcm93c2VCdXR0b24gPSBudWxsOwotICAgIHByb3RlY3RlZCBCdXR0b24gd29ya3NwYWNlRGlyQnV0dG9uID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgVGV4dCB3b3Jrc3BhY2VEaXJUZXh0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQnV0dG9uIHdvcmtzcGFjZURpckJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZ3VyYXRpb247Ci0KLSAgICBwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JICAgICAgICBPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkgICAgICAgIGlmIChzb3VyY2UgPT0gdXNlRGVmYXVsdFdvcmtpbmdEaXJCdXR0b24pCi0JICAgICAgICAgICAgaGFuZGxlVXNlRGVmYXVsdFdvcmtpbmdEaXJCdXR0b25TZWxlY3RlZCgpOwotCSAgICAgICAgZWxzZSBpZiAoc291cmNlID09IGxvY2FsRGlyQnV0dG9uIHx8IHNvdXJjZSA9PSB3b3Jrc3BhY2VEaXJCdXR0b24pIHsKLQkgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbkJ1dHRvblNlbGVjdGVkKCk7Ci0JICAgIAkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT0gd29ya2luZ0RpckJyb3dzZUJ1dHRvbikKLQkgICAgICAgICAgICBoYW5kbGVXb3JraW5nRGlyQnJvd3NlQnV0dG9uU2VsZWN0ZWQoKTsKLQkgICAgICAgIGVsc2UgaWYgKHNvdXJjZSA9PSB3b3Jrc3BhY2VEaXJCcm93c2VCdXR0b24pCi0JICAgICAgICAgICAgaGFuZGxlV29ya3NwYWNlRGlyQnJvd3NlQnV0dG9uU2VsZWN0ZWQoKTsKLQkgICAgICAgIGVsc2UKLQkgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JICAgIH0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBXaWRnZXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBXaWRnZXRMaXN0ZW5lcigpOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHdvcmtpbmdEaXJDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJd29ya2luZ0RpckNvbXAuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMywgZmFsc2UsIDAsIDApKTsKLQkJd29ya2luZ0RpckNvbXAuc2V0TGF5b3V0RGF0YShzcGFuR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCA1KSk7Ci0JCXNldENvbnRyb2wod29ya2luZ0RpckNvbXApOwotCQkKLQkJTGFiZWwgd29ya2luZ0RpckxhYmVsID0gbmV3IExhYmVsKHdvcmtpbmdEaXJDb21wLCBTV1QuTk9ORSk7Ci0JCXdvcmtpbmdEaXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19Xb3JraW5nX2RpcmVjdG9yeV9jb2xvbik7Ci0JCXdvcmtpbmdEaXJMYWJlbC5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YSgtMSwgMykpOwotCi0JCXVzZURlZmF1bHRXb3JraW5nRGlyQnV0dG9uID0gbmV3IEJ1dHRvbih3b3JraW5nRGlyQ29tcCwgU1dULkNIRUNLKTsKLQkJdXNlRGVmYXVsdFdvcmtpbmdEaXJCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfVXNlX2RlZmF1bHRfd29ya2luZ19kaXJlY3RvcnkpOwotCQl1c2VEZWZhdWx0V29ya2luZ0RpckJ1dHRvbi5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YSgtMSwgMykpOwotCQl1c2VEZWZhdWx0V29ya2luZ0RpckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlsb2NhbERpckJ1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHdvcmtpbmdEaXJDb21wLCBNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfTG9jYWxfZGlyZWN0b3J5KTsKLQkJbG9jYWxEaXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCQotCQl3b3JraW5nRGlyVGV4dCA9IG5ldyBUZXh0KHdvcmtpbmdEaXJDb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXdvcmtpbmdEaXJUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl3b3JraW5nRGlyVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQl3b3JraW5nRGlyQnJvd3NlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbih3b3JraW5nRGlyQ29tcCwgTWVzc2FnZXMuVGFiX2NvbW1vbl9Ccm93c2VfMSwgbnVsbCk7Ci0JCXdvcmtpbmdEaXJCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJd29ya3NwYWNlRGlyQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24od29ya2luZ0RpckNvbXAsIE1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19Xb3Jrc3BhY2UpOwotCQl3b3Jrc3BhY2VEaXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJd29ya3NwYWNlRGlyVGV4dCA9IG5ldyBUZXh0KHdvcmtpbmdEaXJDb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXdvcmtzcGFjZURpclRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXdvcmtzcGFjZURpclRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJd29ya3NwYWNlRGlyQnJvd3NlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbih3b3JraW5nRGlyQ29tcCwgTWVzc2FnZXMuVGFiX2NvbW1vbl9Ccm93c2VfMiwgbnVsbCk7Ci0JCXdvcmtzcGFjZURpckJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0cyBhcmUgZW1wdHkuCi0gICAgICogCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktfRElSRUNUT1JZLCAoU3RyaW5nKSBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBJTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHNldExhdW5jaENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0gICAgICAgIHRyeSB7ICAgICAgICAgICAgCi0JCQlTdHJpbmcgd2QgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktfRElSRUNUT1JZLCAoU3RyaW5nKSBudWxsKTsKLQkJCXdvcmtzcGFjZURpclRleHQuc2V0VGV4dChFTVBUWV9TVFJJTkcpOwotCQkJd29ya2luZ0RpclRleHQuc2V0VGV4dChFTVBUWV9TVFJJTkcpOwotCQkJaWYgKHdkID09IG51bGwpIHsKLQkJCQl1c2VEZWZhdWx0V29ya2luZ0RpckJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh3ZCk7Ci0JCQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCXdvcmtpbmdEaXJUZXh0LnNldFRleHQod2QpOwotCQkJCQlsb2NhbERpckJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCXdvcmtzcGFjZURpckJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdvcmtzcGFjZURpclRleHQuc2V0VGV4dCh3ZCk7Ci0JCQkJCXdvcmtzcGFjZURpckJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWxvY2FsRGlyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJCXVzZURlZmF1bHRXb3JraW5nRGlyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl9Ci0JCQloYW5kbGVVc2VEZWZhdWx0V29ya2luZ0RpckJ1dHRvblNlbGVjdGVkKCk7ICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkNvbW1vblRhYl9jb21tb25fRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbl9FWENFUFRJT04pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQlTdHJpbmcgd2QgPSBudWxsOwotCQlpZiAoIWlzRGVmYXVsdFdvcmtpbmdEaXJlY3RvcnkoKSkgewotCQkJaWYgKGlzTG9jYWxXb3JraW5nRGlyZWN0b3J5KCkpIHsKLQkJCQl3ZCA9IGdldEZpZWxkQ29udGVudCh3b3JraW5nRGlyVGV4dC5nZXRUZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgod29ya3NwYWNlRGlyVGV4dC5nZXRUZXh0KCkpOwotCQkJCXdkID0gcGF0aC5tYWtlUmVsYXRpdmUoKS50b09TU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gCi0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS19ESVJFQ1RPUlksIHdkKTsKLSAgICB9ICAgIAotCi0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIAotCQlpZiAoaXNMb2NhbFdvcmtpbmdEaXJlY3RvcnkoKSkgewkJICAgIAotCQkJU3RyaW5nIHdvcmtpbmdEaXJQYXRoID0gZ2V0RmllbGRDb250ZW50KHdvcmtpbmdEaXJUZXh0LmdldFRleHQoKSk7Ci0JCQlpZiAod29ya2luZ0RpclBhdGggIT0gbnVsbCkgewotCQkJCUZpbGUgZGlyID0gbmV3IEZpbGUod29ya2luZ0RpclBhdGgpOwotCQkJCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV29ya2luZ19kaXJlY3RvcnlfZG9lc19ub3RfZXhpc3QpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19Xb3JraW5nX2RpcmVjdG9yeV9pc19ub3RfYV9kaXJlY3RvcnkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGdldENvbnRhaW5lcih3b3JraW5nRGlyVGV4dC5nZXRUZXh0KCkpID09IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuV29ya2luZ0RpcmVjdG9yeUJsb2NrX1Byb2plY3Rfb3JfZm9sZGVyX2RvZXNfbm90X2V4aXN0KTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTWVzc2FnZXMuV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dvcmtpbmdfZGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZykgewotICAgICAgICBzdXBlci5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpIHsKLSAgICAgICAgc3VwZXIudXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRlZmF1bHQgd29ya2luZyBkaXJlY3RvcnkgaXMgdG8gYmUgdXNlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB1c2VEZWZhdWx0V29ya2luZ0RpckJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGxvY2FsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2NhbFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBsb2NhbERpckJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB3b3JraW5nIGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRXb3JraW5nRGlyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJd29ya2luZ0RpclRleHQuc2V0VGV4dChTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCQkJbG9jYWxEaXJCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJd29ya3NwYWNlRGlyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChjb25maWd1cmF0aW9uKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJICAgIHJldHVybjsKLQkJCi0JCXdvcmtzcGFjZURpclRleHQuc2V0VGV4dChwcm9qZWN0LmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0JCWxvY2FsRGlyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXdvcmtzcGFjZURpckJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSAibG9jYWwgZGlyZWN0b3J5IiBvciAid29ya3NwYWNlIGRpcmVjdG9yeSIgYnV0dG9uIGhhcyBiZWVuIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWlmICghaXNEZWZhdWx0V29ya2luZ0RpcmVjdG9yeSgpKSB7Ci0JCQlib29sZWFuIGxvY2FsID0gaXNMb2NhbFdvcmtpbmdEaXJlY3RvcnkoKTsKLQkJCXdvcmtpbmdEaXJUZXh0LnNldEVuYWJsZWQobG9jYWwpOwotCQkJd29ya2luZ0RpckJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGxvY2FsKTsKLQkJCXdvcmtzcGFjZURpclRleHQuc2V0RW5hYmxlZCghbG9jYWwpOwotCQkJd29ya3NwYWNlRGlyQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoIWxvY2FsKTsKLQkJfQotCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgd29ya2luZyBkaXIgY2hlY2sgYm94IGhhcyBiZWVuIHRvZ2dsZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVXNlRGVmYXVsdFdvcmtpbmdEaXJCdXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKGlzRGVmYXVsdFdvcmtpbmdEaXJlY3RvcnkoKSkgewotCQkJc2V0RGVmYXVsdFdvcmtpbmdEaXIoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpKTsKLQkJCWxvY2FsRGlyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd29ya2luZ0RpclRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl3b3JraW5nRGlyQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd29ya3NwYWNlRGlyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd29ya3NwYWNlRGlyVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXdvcmtzcGFjZURpckJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWxvY2FsRGlyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl3b3Jrc3BhY2VEaXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWhhbmRsZUxvY2F0aW9uQnV0dG9uU2VsZWN0ZWQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTaG93IGEgZGlhbG9nIHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3QgYSB3b3JraW5nIGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVdvcmtpbmdEaXJCcm93c2VCdXR0b25TZWxlY3RlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19TZWxlY3Rfd29ya2luZ19kaXJlY3RvcnlfZm9yX2xhdW5jaF9jb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIGN1cnJlbnRXb3JraW5nRGlyID0gd29ya2luZ0RpclRleHQuZ2V0VGV4dCgpOwotCQlpZiAoY3VycmVudFdvcmtpbmdEaXIgIT0gbnVsbCAmJiAhY3VycmVudFdvcmtpbmdEaXIudHJpbSgpLmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShjdXJyZW50V29ya2luZ0Rpcik7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChjdXJyZW50V29ya2luZ0Rpcik7Ci0JCX0KLQkJCi0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKQotCQkJd29ya2luZ0RpclRleHQuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JfQotCQotCS8qKgotCSAqIFNob3cgYSBkaWFsb2cgdGhhdCBsZXRzIHRoZSB1c2VyIHNlbGVjdCBhIHdvcmtpbmcgZGlyZWN0b3J5IGZyb20gCi0JICogdGhlIHdvcmtzcGFjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVdvcmtzcGFjZURpckJyb3dzZUJ1dHRvblNlbGVjdGVkKCkgewotCQlDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBnZXRXb3Jrc3BhY2VSb290KCksIGZhbHNlLCAKLQkJCQlNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfU2VsZWN0X3dvcmtzcGFjZV9yZWxhdGl2ZV93b3JraW5nX2RpcmVjdG9yeSk7CQkKLQkJSUNvbnRhaW5lciBjdXJyZW50Q29udGFpbmVyID0gZ2V0Q29udGFpbmVyKHdvcmtzcGFjZURpclRleHQuZ2V0VGV4dCgpKTsKLQkJaWYgKGN1cnJlbnRDb250YWluZXIgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IGN1cnJlbnRDb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0W10ge3BhdGh9KTsKLQkJfQotCQkKLQkJZGlhbG9nLnNob3dDbG9zZWRQcm9qZWN0cyhmYWxzZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CQkKLQkJaWYgKChyZXN1bHRzICE9IG51bGwpICYmIChyZXN1bHRzLmxlbmd0aCA+IDApICYmIChyZXN1bHRzWzBdIGluc3RhbmNlb2YgSVBhdGgpKSB7Ci0JCQlJUGF0aCBwYXRoID0gKElQYXRoKXJlc3VsdHNbMF07Ci0JCQlTdHJpbmcgY29udGFpbmVyTmFtZSA9IHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCXdvcmtzcGFjZURpclRleHQuc2V0VGV4dChjb250YWluZXJOYW1lKTsKLQkJfQkJCQotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhdW5jaENvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsYXVuY2hDb25maWd1cmF0aW9uOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbGF1bmNoQ29uZmlndXJhdGlvbiBUaGUgbGF1bmNoQ29uZmlndXJhdGlvbiB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHRoaXMubGF1bmNoQ29uZmlndXJhdGlvbiA9IGxhdW5jaENvbmZpZ3VyYXRpb247Ci0gICAgfQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9leHRlbnNpb25zL0Fic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NGFjYzQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotCi0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBjb250cmlidXRpbmcKLSAqIENvbmZpZ3VyYXRpb25XaXphcmRQYWdlcyB0byB0aGlzIHBsdWctaW4uCi0gKgotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBpbXBsZW1lbnRzIElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLQotCXByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIElQUXVldWU+IHF1ZXVlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIElQUXVldWU+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SVBRdWV1ZSwgSW50ZWdlcj4gcXVldWVJbmRpY2VzID0gbmV3IEhhc2hNYXA8SVBRdWV1ZSwgSW50ZWdlcj4oKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb3JlRXhjZXB0aW9uIG1ha2VDb3JlRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgUFRQTGF1bmNoUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQlTdGF0dXMuRVJST1IsIHN0cmluZywgbnVsbCk7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCX0KLQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNhZGRDb250ZW50c0NoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnRlbnRzQ2hhbmdlZExpc3RlbmVyKElSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjcmVtb3ZlQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZW50c0NoYW5nZWRMaXN0ZW5lcihJUk1MYXVuY2hDb25maWd1cmF0aW9uQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gR1VJIGVsZW1lbnRzIGFyZSBtb2RpZmllZCBieSB0aGUgdXNlciwKLQkgKiBlLmcuIGEgVGV4dCB3aWRnZXQgc2hvdWxkIGhhdmUgaXRzIE1vZGlmeUxpc3RlbmVyJ3MKLQkgKiBtb2RpZnlUZXh0IG1ldGhvZCBzZXQgdXAgdG8gbm90aWZ5IGFsbCBvZiB0aGUgY29udGVudHMKLQkgKiBjaGFuZ2VkIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ29udGVudHNDaGFuZ2VkKCkgewotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUNvbnRlbnRzQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcXVldWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lCi0JICoKLQkgKiBAcGFyYW0gcm0gcmVzb3VyY2UgbWFuYWdlcgotCSAqIEBwYXJhbSBxdWV1ZU5hbWUgcXVldWUgbmFtZQotCSAqIEByZXR1cm4gcXVldWUKLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZUZyb21OYW1lKElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBxdWV1ZU5hbWUpIHsKLQkJaWYgKHJtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVBRdWV1ZVtdIHF1ZXVlcyA9IHJtLmdldFF1ZXVlcygpOwotCi0JCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IHF1ZXVlcykgewotCQkJaWYgKHF1ZXVlLmdldE5hbWUoKS5lcXVhbHMocXVldWVOYW1lKSkKLQkJCQlyZXR1cm4gcXVldWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclF1ZXVlcygpIHsKLQkJcXVldWVzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHF1ZXVlCi0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUXVldWUoSVBRdWV1ZSBxdWV1ZSwgaW50IGluZGV4KSB7Ci0JCXF1ZXVlcy5wdXQoaW5kZXgsIHF1ZXVlKTsKLQkJcXVldWVJbmRpY2VzLnB1dChxdWV1ZSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHF1ZXVlcy5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBxdWV1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRRdWV1ZUluZGV4KElQUXVldWUgcXVldWUpIHsKLQkJcmV0dXJuIHF1ZXVlSW5kaWNlcy5nZXQocXVldWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9leHRlbnNpb25zL0Fic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MzM5ZDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotCi0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBjb250cmlidXRpbmcKLSAqIER5bmFtaWMgY29uZmlndXJhdGlvbiB0YWJzIHRvIHRoaXMgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvcmVFeGNlcHRpb24gbWFrZUNvcmVFeGNlcHRpb24oU3RyaW5nIHN0cmluZykgewotCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQVFBMYXVuY2hQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCVN0YXR1cy5FUlJPUiwgc3RyaW5nLCBudWxsKTsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBybQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXIgcm0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXRSZXNvdXJjZU1hbmFnZXJDbGFzcygpLmlzSW5zdGFuY2Uocm0pKSB7Ci0JCQl0aHJvdyBtYWtlQ29yZUV4Y2VwdGlvbigiUmVzb3VyY2UgbWFuYWdlcjogIiArIHJtLmdldE5hbWUoKSArIAotCQkJIiBpcyBub3Qgb2YgZXhwZWN0ZWQgdHlwZSIpOwotCQl9Ci0JCXJldHVybiBkb0NyZWF0ZShybSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI2dldFJlc291cmNlTWFuYWdlckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXI+IGdldFJlc291cmNlTWFuYWdlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm0KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGRvQ3JlYXRlKElSZXNvdXJjZU1hbmFnZXIgcm0pCi0JdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvZXh0ZW5zaW9ucy9JUk1MYXVuY2hDb25maWd1cmF0aW9uQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9leHRlbnNpb25zL0lSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTBkYzE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9leHRlbnNpb25zL0lSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIHJzcXJkCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuCi0JICogd2hlbiBHVUkgZWxlbWVudHMgYXJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLCBlLmcuCi0JICogYSBUZXh0IHdpZGdldCBzaG91bGQgaGF2ZSBpdHMgTW9kaWZ5TGlzdGVuZXIncwotCSAqIG1vZGlmeVRleHQgbWV0aG9kIHNldCB1cCB0byBub3RpZnkgYWxsIG9mIHRoZSBjb250ZW50cwotCSAqIGNoYW5nZWQgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlQ29udGVudHNDaGFuZ2VkKElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaC9zcmMvb3JnL2VjbGlwc2UvcHRwL2xhdW5jaC91aS9leHRlbnNpb25zL0lSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTA2YmUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7Ci0KLQkvKioKLQkgKiBUaGUgZXZlbnRzIGZvciB0aGlzIGxpc3RlbmVyIHNob3VsZCBiZSBmaXJlZAotCSAqIHdoZW4gR1VJIGVsZW1lbnRzIGFyZSBtb2RpZmllZCBieSB0aGUgdXNlciwgZS5nLgotCSAqIGEgVGV4dCB3aWRnZXQgc2hvdWxkIGhhdmUgaXRzIE1vZGlmeUxpc3RlbmVyJ3MKLQkgKiBtb2RpZnlUZXh0IG1ldGhvZCBzZXQgdXAgdG8gbm90aWZ5IGFsbCBvZiB0aGUgY29udGVudHMKLQkgKiBjaGFuZ2VkIGxpc3RlbmVycy4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hDb250ZW50c0NoYW5nZWRMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZENvbnRlbnRzQ2hhbmdlZExpc3RlbmVyKAotCQkJSVJNTGF1bmNoQ29uZmlndXJhdGlvbkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyIGxhdW5jaENvbnRlbnRzQ2hhbmdlZExpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhYiBpcyBpbiBhIHN0YXRlIHRoYXQgYWxsb3dzIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB3aG9zZSB2YWx1ZXMKLQkgKiB0aGlzIHRhYiBpcyBzaG93aW5nIHRvIGJlIHNhdmVkLiAgVGhpcyBkaWZmZXJzIGZyb20gPGNvZGU+aXNWYWxpZCgpPC9jb2RlPiBpbiB0aGF0IDxjb2RlPmNhblNhdmUoKTwvY29kZT4KLQkgKiBkZXRlcm1pbmVzIGlmIHRoaXMgdGFiIHByZXZlbnRzIHRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uIGZyb20gYmVpbmcgc2F2ZWQsIHdoZXJlYXMKLQkgKiA8Y29kZT5pc1ZhbGlkKCk8L2NvZGU+IGRldGVybWluZXMgaWYgdGhpcyB0YWIgcHJldmVudHMgdGhlIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZnJvbQotCSAqIGJlaW5nIGxhdW5jaGVkLgotCSAqCi0JICogPHA+Ci0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBieSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBkaWFsb2cgdG8gZGVjaWRlIHdoZW4gaXQgaXMgb2theSB0byBzYXZlIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gcm0KLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0YWIgaXMgaW4gYSBzdGF0ZSB0aGF0IGFsbG93cyB0aGUgY3VycmVudCBsYXVuY2ggY29uZmlndXJhdGlvbiB0byBiZSBzYXZlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSTUxhdW5jaFZhbGlkYXRpb24gY2FuU2F2ZShDb250cm9sIGNvbnRyb2wsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGUgZHluYW1pYyBwYXJ0IG9mIHRoZSBwYXJhbGxlbAotCSAqIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogdGFiIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUKLQkgKiBhIG5ldyByZXNvdXJjZSBtYW5hZ2VyIG9yIHF1ZXVlIGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQKLQkgKiB0aGUgY3JlYXRlZCBjb250cm9sIGNhbiBiZSBhY2Nlc3NlZCB2aWEgPGNvZGU+Z2V0Q29udHJvbDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHJtCi0JICogQHBhcmFtIHF1ZXVlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LAotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNldCBvZiByZXNvdXJjZSBtYW5hZ2VyIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBhcyBsYXVuY2gKLQkgKiBhdHRyaWJ1dGVzCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBsYXVuY2gKLQkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcXVldWUKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHF1ZXVlCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG1vZGUKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGxhdW5jaCBtb2RlCi0JICogQHJldHVybiBhcnJheSBvZiBhdHRyaWJ1dGVzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IElBdHRyaWJ1dGU8Pyw/LD8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoZSBkeW5hbWljIHBvcnRpb24gb2YgdGhlIHBhcmFsbGVsIHRhYi4KLQkgKiA8cD4KLQkgKiBNYXkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb250cm9sCi0JICogaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRvcCBsZXZlbCBjb250cm9sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBkeW5hbWljIHRhYidzIGNvbnRyb2xzIHdpdGggdmFsdWVzIGZyb20gdGhlIGdpdmVuCi0JICogbGF1bmNoIGNvbmZpZ3VyYXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuCi0JICogYSBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkIHRvIHZpZXcgb3IgZWRpdCwgYWZ0ZXIgdGhpcwotCSAqIHRhYidzIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiBJdCBpcyBhbHNvIGNhbGxlZCBldmVyeSB0aW1lIHRoZSB1c2VyIHNlbGVjdHMgYSBuZXcgcmVzb3VyY2UgbWFuYWdlcgotCSAqIG9yIHF1ZXVlLiAgSW4gdGhpcyBjYXNlIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgaXMgcGFzc2VkIGluIGhhcwotCSAqIGJlZW4gY2FjaGVkIGJ5IHRoZSBwYXJhbGxlbCB0YWIuCi0JICoKLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcGFyYW0gcm0KLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSTUxhdW5jaFZhbGlkYXRpb24gaW5pdGlhbGl6ZUZyb20oQ29udHJvbCBjb250cm9sLAotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSwKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGFiIGlzIGluIGEgdmFsaWQgc3RhdGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHNwZWNpZmllZAotCSAqIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdHlwaWNhbGx5IHVzZWQgYnkgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogZGlhbG9nIHRvIGRlY2lkZSB3aGVuIGl0IGlzIG9rYXkgdG8gbGF1bmNoLgotCSAqIDwvcD4KLQkgKgotCSAqCi0JICogQHBhcmFtIGxhdW5jaENvbmZpZyBsYXVuY2ggY29uZmlndXJhdGlvbiB3aGljaCBwcm92aWRlcyBjb250ZXh0IGZvciB2YWxpZGF0aW5nIHRoaXMgdGFiLgotCSAqICAgICAgICAgVGhpcyB2YWx1ZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcm0KLQkgKiBAcGFyYW0gcXVldWUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0YWIgaXMgaW4gYSB2YWxpZCBzdGF0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSTUxhdW5jaFZhbGlkYXRpb24gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSk7Ci0KLQkvKioKLQkgKiBDb3BpZXMgdmFsdWVzIGZyb20gdGhpcyB0YWIgaW50byB0aGUgZ2l2ZW4KLQkgKiBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHJtCi0JICogQHBhcmFtIHF1ZXVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSTUxhdW5jaFZhbGlkYXRpb24gcGVyZm9ybUFwcGx5KAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGF1bmNoQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVDb250ZW50c0NoYW5nZWRMaXN0ZW5lcigKLQkJCUlSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lciBsYXVuY2hDb250ZW50c0NoYW5nZWRMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gd2l0aAotCSAqIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIHRhYi4gVGhpcyBtZXRob2QKLQkgKiBpcyBjYWxsZWQgd2hlbiBhIG5ldyBsYXVuY2ggY29uZmlndXJhdGlvbiBpcyBjcmVhdGVkCi0JICogc3VjaCB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoCi0JICogbWVhbmluZ2Z1bCB2YWx1ZXMuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYmVmb3JlIHRoaXMKLQkgKiB0YWIncyBjb250cm9sIGlzIGNyZWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBybQotCSAqIEBwYXJhbSBxdWV1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgUk1MYXVuY2hWYWxpZGF0aW9uIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAubGF1bmNoL3NyYy9vcmcvZWNsaXBzZS9wdHAvbGF1bmNoL3VpL2V4dGVuc2lvbnMvUk1MYXVuY2hWYWxpZGF0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvZXh0ZW5zaW9ucy9STUxhdW5jaFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiYmY1ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gvc3JjL29yZy9lY2xpcHNlL3B0cC9sYXVuY2gvdWkvZXh0ZW5zaW9ucy9STUxhdW5jaFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnM7Ci0KLXB1YmxpYyBjbGFzcyBSTUxhdW5jaFZhbGlkYXRpb24gewotCWZpbmFsIGJvb2xlYW4gc3VjY2VzczsKLQlmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uKGZpbmFsIGJvb2xlYW4gc3VjY2VzcywgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN1Y2Nlc3MKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3MoKSB7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sLy5jbGFzc3BhdGggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIxMTk0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InV0aWwiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvLnByb2plY3QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwM2IzNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWM0MTU3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbAotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnByb3h5LmNsaWVudDt1c2VzOj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LG9yZy5lY2xpcHNlLnB0cC5wcm94eS51dGlsIiwKLSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudCwKLSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQ7dXNlczo9Im9yZy5lY2xpcHNlLnB0cC5wcm94eS51dGlsLG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kIiwKLSBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNsaWVudDt1c2VzOj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQsb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQiLAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7dXNlczo9Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudCxvcmcuZWNsaXBzZS5wdHAucHJveHkudXRpbCIsCi0gb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuc2VydmVyLAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5zZXJ2ZXIsCi0gb3JnLmVjbGlwc2UucHRwLnByb3h5LnV0aWwKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL2Fib3V0Lmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL2J1aWxkLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzUyOTVjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHV0aWwvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9wbHVnaW4ucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmEyOGM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBQcm94eSBQcm90b2NvbAotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvY29tbWFuZC9Qcm94eVF1aXRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2NvbW1hbmQvUHJveHlRdWl0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDliZGZhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvY29tbWFuZC9Qcm94eVF1aXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuQWJzdHJhY3RQcm94eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5UXVpdENvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVF1aXRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eUNvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlRdWl0Q29tbWFuZCB7Ci0JcHVibGljIFByb3h5UXVpdENvbW1hbmQoKSB7Ci0JCXN1cGVyKFFVSVQpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlRdWl0Q29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihRVUlULCB0cmFuc0lELCBhcmdzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcm94eVF1aXRDb21tYW5kIHRpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnQXJnc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdBcmdzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmZjFiZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdBcmdzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdBcmdzRXZlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0FyZ3NFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdBcmdzRXZlbnQgewotCXByaXZhdGUgU3RyaW5nW10gYXJnczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0FyZ3NFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoRVZFTlRfREJHX0FSR1MsIHRyYW5zSUQsIGJpdHMpOwotCQl0aGlzLmFyZ3MgPSBhcmdzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFyaWFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5hcmdzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzID0gIkVWRU5UX0RCR19BUkdTIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKSArICIgeyI7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApCi0JCQkJcmVzICs9ICIsICI7Ci0JCQlyZXMgKz0gYXJnc1tpXTsKLQkJfQotCQkKLQkJcmVzICs9ICJ9IjsKLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzliZmI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LkFic3RyYWN0UHJveHlEZWJ1Z1N1c3BlbmRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnQnJlYWtwb2ludEhpdEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnU3VzcGVuZEV2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQgewotCXByaXZhdGUgaW50CWJwSWQ7Ci0KLQlwdWJsaWMgUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIHNldCwgaW50IGlkLCBpbnQgdGhyZWFkX2lkLCBpbnQgZGVwdGgsIFN0cmluZ1tdIHZhcnMpIHsKLQkJc3VwZXIodHJhbnNJRCwgc2V0LCBudWxsLCB0aHJlYWRfaWQsIGRlcHRoLCB2YXJzKTsKLQkJdGhpcy5icElkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0QnJlYWtwb2ludElkKCkgewotCQlyZXR1cm4gdGhpcy5icElkOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkVWRU5UX0RCR19CUEhJVCB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2NmExZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuUHJveHlEZWJ1Z0JyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LkFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdFdmVudCBpbXBsZW1lbnRzIElQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50IHsKLQlwcml2YXRlIGludAkJCQkJCWJwSWQ7Ci0JcHJpdmF0ZSBQcm94eURlYnVnQnJlYWtwb2ludAlicHQ7Ci0JCi0JcHVibGljIFByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZyBiaXRzLCBpbnQgaWQsIFByb3h5RGVidWdCcmVha3BvaW50IGJwdCkgewotCQlzdXBlcih0cmFuc0lELCBFVkVOVF9EQkdfQlBTRVQsIGJpdHMpOwotCQl0aGlzLmJwSWQgPSBpZDsKLQkJdGhpcy5icHQgPSBicHQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0QnJlYWtwb2ludElkKCkgewotCQlyZXR1cm4gdGhpcy5icElkOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0JyZWFrcG9pbnQgZ2V0QnJlYWtwb2ludCgpIHsKLQkJcmV0dXJuIHRoaXMuYnB0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX0JQU0VUIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdEYXRhRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0RhdGFFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcxOGVlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0RhdGFFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdEYXRhRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnRGF0YUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0RhdGFFdmVudCB7Ci0JcHJpdmF0ZSBQcm94eURlYnVnQUlGIGRhdGE7Ci0JCi0JcHVibGljIFByb3h5RGVidWdEYXRhRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZyBiaXRzLCBQcm94eURlYnVnQUlGIGRhdGEpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX0RBVEEsIGJpdHMpOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0FJRiBnZXREYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzID0gIkVWRU5UX0RCR19EQVRBIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKTsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmVzICs9ICIgIiArIHRoaXMuZGF0YS50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXMgKz0gIiBBSUZOVUxMIjsKLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdEYXRhRXhwVmFsdWVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4YzBjMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdEYXRhRXhwVmFsdWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LkFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0RhdGFFeHBWYWx1ZUV2ZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdFdmVudCBpbXBsZW1lbnRzIElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQgewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCXB1YmxpYyBQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZyBiaXRzLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX0RBVEFfRVZBX0VYLCBiaXRzKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX0RBVEFfRVZBX0VYIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKSArICIgLSB2YWx1ZTogIiArIHRoaXMudmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRXJyb3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM4MjFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0Vycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFcnJvckV2ZW50OwotCi0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdFcnJvckV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0Vycm9yRXZlbnQgewotCXByaXZhdGUgaW50CQllcnJvckNvZGU7Ci0JcHJpdmF0ZSBTdHJpbmcJZXJyb3JNc2c7Ci0JCi0JcHVibGljIFByb3h5RGVidWdFcnJvckV2ZW50KGludCB0cmFuc0lELCBTdHJpbmcgYml0cywgaW50IGNvZGUsIFN0cmluZyBtc2cpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX0VSUk9SLCBiaXRzKTsKLQkJdGhpcy5lcnJvckNvZGUgPSBjb2RlOwotCQl0aGlzLmVycm9yTXNnID0gbXNnOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEVycm9yQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZXJyb3JDb2RlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMuZXJyb3JNc2c7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJFVkVOVF9EQkdfRVJST1IgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpICsgIiAiICsgdGhpcy5lcnJvckNvZGUgKyAiICIgKyB0aGlzLmVycm9yTXNnOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0V2ZW50RmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRXZlbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGQ3YTQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRXZlbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdBSUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdMaW5lTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdNZW1vcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnTWVtb3J5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5Qcm94eUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0V2ZW50RmFjdG9yeSBleHRlbmRzIFByb3h5RXZlbnRGYWN0b3J5IGltcGxlbWVudHMgSVByb3h5RGVidWdFdmVudEZhY3RvcnkgewotCQotCXB1YmxpYyBJUHJveHlFdmVudCB0b0V2ZW50KFByb3h5UGFja2V0IHBhY2tldCkgewotCQlJUHJveHlEZWJ1Z0V2ZW50CWV2dCA9IG51bGw7Ci0JCWludCBudW1WYXJzOwotCQlTdHJpbmcgdmFyc1tdOwotCi0JCUlQcm94eUV2ZW50IGUgPSBzdXBlci50b0V2ZW50KHBhY2tldCk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJU3RyaW5nW10gYXJncyA9IHBhY2tldC5nZXRBcmdzKCk7Ci0JCQotCQkvKgotCQkgKiBbMF06IGJpdCBsaXN0Ci0JCSAqLwotCQlTdHJpbmcgYml0cyA9IGFyZ3NbMF07Ci0JCQotCQlzd2l0Y2ggKHBhY2tldC5nZXRJRCgpKSB7Ci0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfT0s6Ci0JCQlldnQgPSBuZXcgUHJveHlEZWJ1Z09LRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cyk7Ci0JCQlicmVhazsKLQkJCQotCQkvKioKLQkJICogWzFdOiBlcnJvciBjb2RlCi0JCSAqIFsyXTogZXJyb3IgbWVzc2FnZQotCQkgKi8KLQkJY2FzZSBJUHJveHlEZWJ1Z0V2ZW50LkVWRU5UX0RCR19FUlJPUjoKLQkJCWludCBlcnJDb2RlID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKLQkJCWV2dCA9IG5ldyBQcm94eURlYnVnRXJyb3JFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBiaXRzLCBlcnJDb2RlLCBhcmdzWzJdKTsKLQkJCWJyZWFrOwotCi0JCS8qKgotCQkgKiBbMV06IG51bWJlciBvZiBzZXJ2ZXJzCi0JCSAqLwkJCQotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX0lOSVQ6Ci0JCQlpbnQgbnVtX3NlcnZlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMV0pOwotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdJbml0RXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgbnVtX3NlcnZlcnMpOwotCQkJYnJlYWs7Ci0JCQkKLQkJLyoqCi0JCSAqIFsxXTogZXZlbnQgcmVhc29uCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX1NVU1BFTkQ6Ci0JCQlzd2l0Y2ggKEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSkpIHsKLQkJCS8qKgotCQkJICogWzJdOiBicHQgaWQKLQkJCSAqIFszXTogdGhyZWFkIGlkCi0JCQkgKiBbNF06IGRlcHRoCi0JCQkgKiBbNV06IHZhciBjaGFuZ2VkIGxpc3QgLT4gbGVuZ3RoCi0JCQkgKiBbNl06IHZhciBjaGFuZ2VkIGxpc3QgLT4gbmFtZQotCQkJICogCi0JCQkgKi8KLQkJCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfU1VTUEVORF9CUEhJVDoKLQkJCQlpbnQgaGl0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMl0pOwotCQkJCWludCBicFRpZCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1szXSk7Ci0JCQkJaW50IGJwRGVwID0gSW50ZWdlci5wYXJzZUludChhcmdzWzRdKTsKLQkJCQludW1WYXJzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzVdKTsKLQkJCQl2YXJzID0gbmV3IFN0cmluZ1tudW1WYXJzXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaTxudW1WYXJzOyBpKyspIHsKLQkJCQkJdmFyc1tpXSA9IGFyZ3NbaSs2XTsKLQkJCQl9Ci0JCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgaGl0SWQsIGJwVGlkLCBicERlcCwgdmFycyk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQkJCi0JCQkvKioKLQkJCSAqIFsyXTogc2lnbmFsIGluZm8gLT4gbmFtZQotCQkJICogWzNdOiBzaWduYWwgaW5mbyAtPiBzaWdfc3RvcAotCQkJICogWzRdOiBzaWduYWwgaW5mbyAtPiBzaWdfcHJpbnQKLQkJCSAqIFs1XTogc2lnbmFsIGluZm8gLT4gc2lnX3Bhc3MKLQkJCSAqIFs2XTogc2lnbmFsIGluZm8gLT4gZGVzY3JpcHRpb24KLQkJCSAqIFs3XTogZnJhbWUgLT4gbGV2ZWwKLQkJCSAqIFs4XTogZnJhbWUgLT4gbG9jYXRpb24gLT4gZmlsZQotCQkJICogWzldOiBmcmFtZSAtPiBsb2NhdGlvbiAtPiBmdW5jdGlvbgotCQkJICogWzEwXTogZnJhbWUgLT4gbG9jYXRpb24gLT4gYWRkcmVzcwotCQkJICogWzExXTogZnJhbWUgLT4gbG9jYXRpb24gLT4gbGluZSBudW1iZXIKLQkJCSAqIFsxMl06IHRocmVhZCBpZAotCQkJICogWzEzXTogZGVwdGgKLQkJCSAqIFsxNF06IHZhciBjaGFuZ2VkIGxpc3QgLT4gbGVuZ3RoCi0JCQkgKiBbMTVdOiB2YXIgY2hhbmdlZCBsaXN0IC0+IG5hbWUKLQkJCSAqLwotCQkJY2FzZSBJUHJveHlEZWJ1Z0V2ZW50LkVWRU5UX0RCR19TVVNQRU5EX1NJR05BTDoKLQkJCQlpbnQgc2lnVGlkID0gSW50ZWdlci5wYXJzZUludChhcmdzWzEyXSk7Ci0JCQkJaW50IHNpZ0RlcCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxM10pOwotCQkJCVByb3h5RGVidWdTdGFja0ZyYW1lIHNpZ0ZyYW1lID0gbnVsbDsKLQkJCQkKLQkJCQlpZiAoIShhcmdzWzddLmNvbXBhcmVUbygiKiIpID09IDApKSB7Ci0JCQkJCXNpZ0ZyYW1lID0gdG9GcmFtZShhcmdzWzddLCBhcmdzWzhdLCBhcmdzWzldLCBhcmdzWzExXSwgYXJnc1sxMF0pOwotCQkJCX0KLQkKLQkJCQludW1WYXJzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzE0XSk7Ci0JCQkJdmFycyA9IG5ldyBTdHJpbmdbbnVtVmFyc107Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGk8bnVtVmFyczsgaSsrKSB7Ci0JCQkJCXZhcnNbaV0gPSBhcmdzW2krMTVdOwotCQkJCX0KLQotCQkJCWV2dCA9IG5ldyBQcm94eURlYnVnU2lnbmFsRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgYXJnc1syXSwgYXJnc1s2XSwgc2lnRnJhbWUsIHNpZ1RpZCwgc2lnRGVwLCB2YXJzKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCS8qKgotCQkJICogWzJdOiBmcmFtZSAtPiBsZXZlbAotCQkJICogWzNdOiBmcmFtZSAtPiBsb2NhdGlvbiAtPiBmaWxlCi0JCQkgKiBbNF06IGZyYW1lIC0+IGxvY2F0aW9uIC0+IGZ1bmN0aW9uCi0JCQkgKiBbNV06IGZyYW1lIC0+IGxvY2F0aW9uIC0+IGFkZHJlc3MKLQkJCSAqIFs2XTogZnJhbWUgLT4gbG9jYXRpb24gLT4gbGluZSBudW1iZXIKLQkJCSAqIFs3XTogdGhyZWFkIGlkCi0JCQkgKiBbOF06IGRlcHRoCi0JCQkgKiBbOV06IHZhciBjaGFuZ2VkIGxpc3QgLT4gbGVuZ3RoCi0JCQkgKiBbMTBdOiB2YXIgY2hhbmdlZCBsaXN0IC0+IG5hbWUKLQkJCSAqLwotCQkJY2FzZSBJUHJveHlEZWJ1Z0V2ZW50LkVWRU5UX0RCR19TVVNQRU5EX1NURVA6Ci0JCQkJUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZnJhbWUgPSB0b0ZyYW1lKGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNl0sIGFyZ3NbNV0pOwotCQkJCWludCBzdFRpZCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s3XSk7Ci0JCQkJaW50IHN0RGVwID0gSW50ZWdlci5wYXJzZUludChhcmdzWzhdKTsKLQkJCQludW1WYXJzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzldKTsKLQkJCQl2YXJzID0gbmV3IFN0cmluZ1tudW1WYXJzXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaTxudW1WYXJzOyBpKyspIHsKLQkJCQkJdmFyc1tpXSA9IGFyZ3NbaSsxMF07Ci0JCQkJfQotCQkJCWV2dCA9IG5ldyBQcm94eURlYnVnU3RlcEV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIGJpdHMsIGZyYW1lLCBzdFRpZCwgc3REZXAsIHZhcnMpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJLyoqCi0JCQkgKiBbMl06IGZyYW1lIC0+IGxldmVsCi0JCQkgKiBbM106IGZyYW1lIC0+IGxvY2F0aW9uIC0+IGZpbGUKLQkJCSAqIFs0XTogZnJhbWUgLT4gbG9jYXRpb24gLT4gZnVuY3Rpb24KLQkJCSAqIFs1XTogZnJhbWUgLT4gbG9jYXRpb24gLT4gYWRkcmVzcwotCQkJICogWzZdOiBmcmFtZSAtPiBsb2NhdGlvbiAtPiBsaW5lIG51bWJlcgotCQkJICogWzddOiB0aHJlYWQgaWQKLQkJCSAqIFs4XTogZGVwdGgKLQkJCSAqIFs5XTogdmFyIGNoYW5nZWQgbGlzdCAtPiBsZW5ndGgKLQkJCSAqIFsxMF06IHZhciBjaGFuZ2VkIGxpc3QgLT4gbmFtZQotCQkJICovCi0JCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX1NVU1BFTkRfSU5UOgotCQkJCVByb3h5RGVidWdTdGFja0ZyYW1lIHN1c3BlbmRGcmFtZSA9IHRvRnJhbWUoYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s2XSwgYXJnc1s1XSk7Ci0JCQkJaW50IHN1c1RpZCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s3XSk7Ci0JCQkJaW50IHN1c0RlcCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s4XSk7Ci0JCQkJbnVtVmFycyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s5XSk7Ci0JCQkJdmFycyA9IG5ldyBTdHJpbmdbbnVtVmFyc107Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGk8bnVtVmFyczsgaSsrKSB7Ci0JCQkJCXZhcnNbaV0gPSBhcmdzW2krMTBdOwotCQkJCX0KLQkJCQlldnQgPSBuZXcgUHJveHlEZWJ1Z1N1c3BlbmRFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBiaXRzLCBzdXNwZW5kRnJhbWUsIHN1c1RpZCwgc3VzRGVwLCB2YXJzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQkJCi0JCS8qKgotCQkgKiBbMV06IGJwdCBpZAotCQkgKiBbMl06IGJyZWFrcG9pbnQgLT4gYnB0IGlkCi0JCSAqIFszXTogYnJlYWtwb2ludCAtPiBpZ25vcmUKLQkJICogWzRdOiBicmVha3BvaW50IC0+IHNwZWNpYWwKLQkJICogWzVdOiBicmVha3BvaW50IC0+IGRlbGV0ZWQKLQkJICogWzZdOiBicmVha3BvaW50IC0+IHR5cGUKLQkJICogWzddOiBicmVha3BvaW50IC0+IGxvY2F0aW9uIC0+IGZpbGUKLQkJICogWzhdOiBicmVha3BvaW50IC0+IGxvY2F0aW9uIC0+IGZ1bmN0aW9uCi0JCSAqIFs5XTogYnJlYWtwb2ludCAtPiBsb2NhdGlvbiAtPiBhZGRyZXNzCi0JCSAqIFsxMF06IGJyZWFrcG9pbnQgLT4gbG9jYXRpb24gLT4gbGluZSBudW1iZXIKLQkJICogWzExXTogYnJlYWtwb2ludCAtPiBoaXQgY291bnQKLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfQlBTRVQ6Ci0JCQlpbnQgYnBJZCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7Ci0JCQlQcm94eURlYnVnTGluZUxvY2F0aW9uIGxvYyA9IHRvTGluZUxvY2F0aW9uKGFyZ3NbN10sIGFyZ3NbMTBdKTsKLQkJCVByb3h5RGVidWdCcmVha3BvaW50IGJwdCA9IHRvQnJlYWtwb2ludChhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdLCBsb2MpOwotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgYnBJZCwgYnB0KTsKLQkJCWJyZWFrOwotCi0JCS8qKgotCQkgKiBbMV06IHNpZ25hbCBpbmZvIGxpc3QgLT4gbGVuZ3RoCi0JCSAqIFsyXTogc2lnbmFsIGluZm8gbGlzdCAtPiBuYW1lCi0JCSAqIFszXTogc2lnbmFsIGluZm8gbGlzdCAtPiBzaWdfc3RvcAotCQkgKiBbNF06IHNpZ25hbCBpbmZvIGxpc3QgLT4gc2lnX3ByaW50Ci0JCSAqIFs1XTogc2lnbmFsIGluZm8gbGlzdCAtPiBzaWdfcGFzcwotCQkgKiBbNl06IHNpZ25hbCBpbmZvIGxpc3QgLT4gZGVzY3JpcHRpb24KLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfU0lHTkFMUzoKLQkJCWludCBudW1TaWduYWxzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKLQkJCVByb3h5RGVidWdTaWduYWxbXSBzaWduYWxzID0gbmV3IFByb3h5RGVidWdTaWduYWxbbnVtU2lnbmFsc107Ci0JCQlmb3IgKGludCBpID0gMDsgaTxudW1TaWduYWxzOyBpKyspIHsKLQkJCQlzaWduYWxzW2ldID0gbmV3IFByb3h5RGVidWdTaWduYWwoYXJnc1s1KmkrMl0sIHRvQm9vbGVhbihJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbNSppKzNdKSksIHRvQm9vbGVhbihJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbNSppKzRdKSksIHRvQm9vbGVhbihJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbNSppKzVdKSksIGFyZ3NbNSppKzZdKTsKLQkJCX0KLQkJCWV2dCA9IG5ldyBQcm94eURlYnVnU2lnbmFsc0V2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIGJpdHMsIHNpZ25hbHMpOwotCQkJYnJlYWs7Ci0JCQkKLQkJLyoqCi0JCSAqIFsxXTogZXZlbnQgcmVhc29uCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX0VYSVQ6Ci0JCQlzd2l0Y2ggKEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSkpIHsKLQkJCS8qKgotCQkJICogWzJdOiBleGl0IHN0YXR1cwotCQkJICovCi0JCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX0VYSVRfTk9STUFMOgotCQkJCWludCBzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMl0pOwotCQkJCWV2dCA9IG5ldyBQcm94eURlYnVnRXhpdEV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIGJpdHMsIHN0YXR1cyk7Ci0JCQkJYnJlYWs7Ci0JCQkvKioKLQkJCSAqIFsyXTogc2lnbmFsIGluZm8gLT4gbmFtZQotCQkJICogWzNdOiBzaWduYWwgaW5mbyAtPiBzaWdfc3RvcAotCQkJICogWzRdOiBzaWduYWwgaW5mbyAtPiBzaWdfcHJpbnQKLQkJCSAqIFs1XTogc2lnbmFsIGluZm8gLT4gc2lnX3Bhc3MKLQkJCSAqIFs2XTogc2lnbmFsIGluZm8gLT4gZGVzY3JpcHRpb24KLQkJCSAqLwotCQkJY2FzZSBJUHJveHlEZWJ1Z0V2ZW50LkVWRU5UX0RCR19FWElUX1NJR05BTDoKLQkJCQlldnQgPSBuZXcgUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBiaXRzLCBhcmdzWzJdLCBhcmdzWzZdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQkJCi0JCS8qKgotCQkgKiBbMV06IGZyYW1lIGxpc3QgLT4gbGVuZ3RoCi0JCSAqIFsyXTogZnJhbWUgbGlzdCAtPiBsZXZlbAotCQkgKiBbM106IGZyYW1lIGxpc3QgLT4gbG9jYXRpb24gLT4gZmlsZQotCQkgKiBbNF06IGZyYW1lIGxpc3QgLT4gbG9jYXRpb24gLT4gZnVuY3Rpb24KLQkJICogWzVdOiBmcmFtZSBsaXN0IC0+IGxvY2F0aW9uIC0+IGFkZHJlc3MKLQkJICogWzZdOiBmcmFtZSBsaXN0IC0+IGxvY2F0aW9uIC0+IGxpbmUgbnVtYmVyCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX0ZSQU1FUzoKLQkJCWludCBudW1GcmFtZXMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMV0pOwotCQkJUHJveHlEZWJ1Z1N0YWNrRnJhbWVbXSBmcmFtZXMgPSBuZXcgUHJveHlEZWJ1Z1N0YWNrRnJhbWVbbnVtRnJhbWVzXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLQkJCQlmcmFtZXNbaV0gPSB0b0ZyYW1lKGFyZ3NbNSppKzJdLCBhcmdzWzUqaSszXSwgYXJnc1s1KmkrNF0sIGFyZ3NbNSppKzZdLCBhcmdzWzUqaSs1XSk7Ci0JCQl9Ci0JCQlldnQgPSBuZXcgUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBiaXRzLCBmcmFtZXMpOwotCQkJYnJlYWs7Ci0KLQkJLyoqCi0JCSAqIFsxXTogdGhyZWFkIGlkCi0JCSAqIFsyXTogZnJhbWUgLT4gbGV2ZWwKLQkJICogWzNdOiBmcmFtZSAtPiBsb2NhdGlvbiAtPiBmaWxlCi0JCSAqIFs0XTogZnJhbWUgLT4gbG9jYXRpb24gLT4gZnVuY3Rpb24KLQkJICogWzVdOiBmcmFtZSAtPiBsb2NhdGlvbiAtPiBhZGRyZXNzCi0JCSAqIFs2XTogZnJhbWUgLT4gbG9jYXRpb24gLT4gbGluZSBudW1iZXIKLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfVEhSRUFEX1NFTEVDVDoKLQkJCWludCBjdXJyZW50X3RocmVhZF9pZCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7Ci0JCQlQcm94eURlYnVnU3RhY2tGcmFtZSB0aF9mcmFtZSA9IHRvRnJhbWUoYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s2XSwgYXJnc1s1XSk7Ci0JCQlldnQgPSBuZXcgUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIGJpdHMsIGN1cnJlbnRfdGhyZWFkX2lkLCB0aF9mcmFtZSk7Ci0JCQlicmVhazsKLQkJCi0JCS8qKgotCQkgKiBbMV06IGN1cnJlbnQgdGhyZWFkIGlkCi0JCSAqIFsyXTogdGhyZWFkIGlkcyBsaXN0IC0+IGxlbmd0aAotCQkgKiBbM106IHRocmVhZCBpZHMgbGlzdCAtPiB0aHJlYWQgaWQKLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfVEhSRUFEUzoKLQkJCWludCBudW1UaHJlYWRzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzJdKTsKLQkJCVN0cmluZ1tdIHRocmVhZF9pZHMgPSBuZXcgU3RyaW5nW251bVRocmVhZHMgKyAxXTsKLQkJCXRocmVhZF9pZHNbMF0gPSBhcmdzWzFdOwotCQkJZm9yIChpbnQgaT0xOyBpPHRocmVhZF9pZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl0aHJlYWRfaWRzW2ldID0gYXJnc1tpKzJdOwotCQkJfQotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIGJpdHMsIHRocmVhZF9pZHMpOwotCQkJYnJlYWs7Ci0KLQkJLyoqCi0JCSAqIFsxXTogc3RhY2sgZGVwdGgKLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfU1RBQ0tfSU5GT19ERVBUSDoKLQkJCWludCBkZXB0aCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7Ci0JCQlldnQgPSBuZXcgUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgZGVwdGgpOwotCQkJYnJlYWs7Ci0KLQkJLyoqCi0JCSAqIFsxXTogYWRkcmVzcwotCQkgKiBbMl06IG5leHQgcm93Ci0JCSAqIFszXTogcHJldiByb3cKLQkJICogWzRdOiBuZXh0IHBhZ2UKLQkJICogWzVdOiBwcmV2IHBhZ2UKLQkJICogWzZdOiBudW1iZXIgb2YgYnl0ZXMKLQkJICogWzddOiB0b3RhbCBieXRlcwotCQkgKiBbOF06IG1lbW9yeSBsaXN0IC0+IGxlbmd0aAotCQkgKiBbOV06IG1lbW9yeSBsaXN0IC0+IGFkZHJlc3MKLQkJICogWzEwXTogbWVtb3J5IGxpc3QgLT4gYXNjaWkKLQkJICogWzExXTogbWVtb3J5IGxpc3QgLT4gZGF0YSBsaXN0IC0+IGxlbmd0aAotCQkgKiBbMTJdOiBtZW1vcnkgbGlzdCAtPiBkYXRhIGxpc3QgLT4gdmFsdWUKLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfREFUQV9SRUFEX01FTU9SWToKLQkJCWludCBudW1NZW1vcmllcyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s4XSk7Ci0JCQlQcm94eURlYnVnTWVtb3J5W10gbWVtb3JpZXMgPSBuZXcgUHJveHlEZWJ1Z01lbW9yeVtudW1NZW1vcmllc107Ci0JCQlpbnQgZGF0YV9sZW4gPSAwOwotCQkJZm9yIChpbnQgaT0wOyBpPG51bU1lbW9yaWVzOyBpKyspIHsKLQkJCQlpbnQgbmV3X2RhdGFfbGVuID0gSW50ZWdlci5wYXJzZUludChhcmdzW2RhdGFfbGVuKmkrMTFdKTsKLQkJCQlTdHJpbmcgYWRkciA9IGFyZ3NbZGF0YV9sZW4qaSs5XTsKLQkJCQlTdHJpbmcgYXNjaWkgPSBhcmdzW2RhdGFfbGVuKmkrMTBdOwotCQkJCVN0cmluZ1tdIGRhdGFfc3RyID0gbmV3IFN0cmluZ1tuZXdfZGF0YV9sZW5dOwotCQkJCWZvciAoaW50IGo9MDsgajxuZXdfZGF0YV9sZW47IGorKykgewotCQkJCQlkYXRhX3N0cltqXSA9IGFyZ3NbZGF0YV9sZW4qaSsxMitqXTsKLQkJCQl9Ci0JCQkJZGF0YV9sZW4gPSBuZXdfZGF0YV9sZW47Ci0JCQkJbWVtb3JpZXNbaV0gPSBuZXcgUHJveHlEZWJ1Z01lbW9yeShhZGRyLCBhc2NpaSwgZGF0YV9zdHIpOwotCQkJfQotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgdG9NZW1vcnlJbmZvKGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0sIGFyZ3NbN10sIG1lbW9yaWVzKSk7Ci0JCQlicmVhazsKLQkJCQotCQkvKioKLQkJICogWzFdOiB2YXIgbGlzdCAtPiBsZW5ndGgKLQkJICogWzJdOiB2YXIgbGlzdCAtPiBuYW1lCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX1ZBUlM6Ci0JCQludW1WYXJzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKLQkJCXZhcnMgPSBuZXcgU3RyaW5nW251bVZhcnNdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYXJzOyBpKyspIHsKLQkJCQl2YXJzW2ldID0gYXJnc1tpKzJdOwotCQkJfQotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdWYXJzRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgdmFycyk7Ci0JCQlicmVhazsKLQotCQkvKioKLQkJICogWzFdOiBhcmcgbGlzdCAtPiBsZW5ndGgKLQkJICogWzJdOiBhcmcgbGlzdCAtPiBuYW1lCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX0FSR1M6Ci0JCQlpbnQgbnVtQXJncyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7Ci0JCQlTdHJpbmdbXSBhcmdfc3RycyA9IG5ldyBTdHJpbmdbbnVtQXJnc107Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotCQkJCWFyZ19zdHJzW2ldID0gYXJnc1tpKzJdOwotCQkJfQotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdBcmdzRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgYXJnX3N0cnMpOwotCQkJYnJlYWs7Ci0JCQkKLQkJLyoqCi0JCSAqIFsxXTogdHlwZSBuYW1lCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX1RZUEU6Ci0JCQlldnQgPSBuZXcgUHJveHlEZWJ1Z1R5cGVFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBiaXRzLCBhcmdzWzFdKTsKLQkJCWJyZWFrOwotCQkJCi0JCS8qKgotCQkgKiBbMV06IGFpZiBmb3JtYXQKLQkJICogWzJdOiBhaWYgZGF0YQotCQkgKiBbM106IHR5cGUgZGVzY3JpcHRpb24KLQkJICovCi0JCWNhc2UgSVByb3h5RGVidWdFdmVudC5FVkVOVF9EQkdfREFUQToKLQkJCVByb3h5RGVidWdBSUYgZGF0YSA9IG5ldyBQcm94eURlYnVnQUlGKGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOwotCQkJZXZ0ID0gbmV3IFByb3h5RGVidWdEYXRhRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgZGF0YSk7Ci0JCQlicmVhazsKLQotCQkvKioKLQkJICogWzFdOiBkYXRhIHZhbHVlIAotCQkgKi8KLQkJY2FzZSBJUHJveHlEZWJ1Z0V2ZW50LkVWRU5UX0RCR19EQVRBX0VWQV9FWDoKLQkJCWV2dCA9IG5ldyBQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgYml0cywgYXJnc1sxXSk7Ci0JCQlicmVhazsKLQotCQkvKioKLQkJICogWzFdOiBhaWYgZm9ybWF0Ci0JCSAqIFsyXTogYWlmIGRhdGEKLQkJICogWzNdOiB0eXBlIGRlc2NyaXB0aW9uCi0JCSAqLwotCQljYXNlIElQcm94eURlYnVnRXZlbnQuRVZFTlRfREJHX1BBUlRJQUxfQUlGOgotCQkJUHJveHlEZWJ1Z0FJRiBwYXJ0aWFsX2RhdGEgPSBuZXcgUHJveHlEZWJ1Z0FJRihhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTsKLQkJCWV2dCA9IG5ldyBQcm94eURlYnVnUGFydGlhbEFJRkV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIGJpdHMsIHBhcnRpYWxfZGF0YSwgYXJnc1s0XSk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZXZ0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgZGVjb2RlQWRkcihTdHJpbmcgc3RyKSB7Ci0JCVN0cmluZ1tdIHBhcnRzID0gc3RyLnNwbGl0KCI6Iik7Ci0JCWludCBsZW4gPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdLCAxNikgLSAxOyAvLyBTa2lwIHRyYWlsaW5nIE5VTEwKLQkJYnl0ZVtdIHN0ckJ5dGVzID0gbmV3IGJ5dGVbbGVuXTsKLQkJCi0JCWZvciAoaW50IGkgPSAwLCBwID0gMDsgaSA8IGxlbjsgaSsrLCBwICs9IDIpIHsKLQkJCWJ5dGUgYyA9IChieXRlKSAoKENoYXJhY3Rlci5kaWdpdChwYXJ0c1sxXS5jaGFyQXQocCksIDE2KSAmIDB4ZikgPDwgNCk7Ci0JCQljIHw9IChieXRlKSAoKENoYXJhY3Rlci5kaWdpdChwYXJ0c1sxXS5jaGFyQXQocCsxKSwgMTYpICYgMHhmKSk7Ci0JCQlzdHJCeXRlc1tpXSA9IGM7Ci0JCX0KLQkJCi0JCUJpZ0ludGVnZXIgYSA9IG5ldyBCaWdJbnRlZ2VyKHN0ckJ5dGVzKTsKLQkJcmV0dXJuIGE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJveHlEZWJ1Z0JyZWFrcG9pbnQgdG9CcmVha3BvaW50KFN0cmluZyBpZ25vcmUsIFN0cmluZyBzcGVjLCBTdHJpbmcgZGVsLCBTdHJpbmcgdHlwZSwgUHJveHlEZWJ1Z0xpbmVMb2NhdGlvbiBsb2MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eURlYnVnQnJlYWtwb2ludChpZ25vcmUsIHNwZWMsIGRlbCwgdHlwZSwgbG9jKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQcm94eURlYnVnTGluZUxvY2F0aW9uIHRvTGluZUxvY2F0aW9uKFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSkgewotCQlyZXR1cm4gbmV3IFByb3h5RGVidWdMaW5lTG9jYXRpb24oZmlsZSwgbGluZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJveHlEZWJ1Z0xvY2F0b3IgdG9Mb2NhdG9yKFN0cmluZyBmaWxlLCBTdHJpbmcgZnVuYywgU3RyaW5nIGFkZHIsIFN0cmluZyBsaW5lKSB7Ci0JCXJldHVybiBuZXcgUHJveHlEZWJ1Z0xvY2F0b3IoZmlsZSwgZnVuYywgbGluZSwgYWRkcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm94eURlYnVnU3RhY2tGcmFtZSB0b0ZyYW1lKFN0cmluZyBsZXZlbCwgU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jLCBTdHJpbmcgbGluZSwgU3RyaW5nIGFkZHIpICB7Ci0JCWludCBzdGVwTGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KGxldmVsKTsKLQkJcmV0dXJuIG5ldyBQcm94eURlYnVnU3RhY2tGcmFtZShzdGVwTGV2ZWwsIHRvTG9jYXRvcihmaWxlLCBmdW5jLCBhZGRyLCBsaW5lKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJveHlEZWJ1Z01lbW9yeUluZm8gdG9NZW1vcnlJbmZvKFN0cmluZyBhZGRyLCBTdHJpbmcgbmV4dFJvdywgU3RyaW5nIHByZXZSb3csIFN0cmluZyBuZXh0UGFnZSwgU3RyaW5nIHByZXZQYWdlLCAKLQkJCVN0cmluZyBudW1CeXRlcywgU3RyaW5nIHRvdGFsQnl0ZXMsIFByb3h5RGVidWdNZW1vcnlbXSBtZW1vcmllcykgewotCQlyZXR1cm4gbmV3IFByb3h5RGVidWdNZW1vcnlJbmZvKGFkZHIsIG5leHRSb3csIHByZXZSb3csIG5leHRQYWdlLCBwcmV2UGFnZSwgbnVtQnl0ZXMsIHRvdGFsQnl0ZXMsIG1lbW9yaWVzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihpbnQgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSE9MCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0V4aXRFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRXhpdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODhjY2EuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnRXhpdEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuQWJzdHJhY3RQcm94eURlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXhpdEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0V4aXRFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdFeGl0RXZlbnQgewotCXByaXZhdGUgaW50CQlleGl0U3RhdHVzOwotCQotCXB1YmxpYyBQcm94eURlYnVnRXhpdEV2ZW50KGludCB0cmFuc0lELCBTdHJpbmcgYml0cywgaW50IGNvZGUpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX0VYSVQsIGJpdHMpOwotCQl0aGlzLmV4aXRTdGF0dXMgPSBjb2RlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEV4aXRTdGF0dXMoKSB7Ci0JCXJldHVybiB0aGlzLmV4aXRTdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX0VYSVQgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpICsgIiAiICsgdGhpcy5leGl0U3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzOWFkZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuQWJzdHJhY3RQcm94eURlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnSW5mb1RocmVhZHNFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQgewotCXByaXZhdGUgU3RyaW5nW10gdGhyZWFkX2lkczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZyBiaXRzLCBTdHJpbmdbXSB0aHJlYWRfaWRzKSB7Ci0JCXN1cGVyKHRyYW5zSUQsIEVWRU5UX0RCR19USFJFQURTLCBiaXRzKTsKLQkJdGhpcy50aHJlYWRfaWRzID0gdGhyZWFkX2lkczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFRocmVhZElkcygpIHsKLQkJcmV0dXJuIHRoaXMudGhyZWFkX2lkczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzID0gIkVWRU5UX0RCR19USFJFQURTOiB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCkgKyAiIHsiOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkX2lkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCXJlcyArPSAiLCAiOwotCQkJcmVzICs9IHRocmVhZF9pZHNbaV07Ci0JCX0KLQkJCi0JCXJlcyArPSAifSI7Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnSW5pdEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdJbml0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExYWRmOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdJbml0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdJbml0RXZlbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnSW5pdEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0luaXRFdmVudCB7Ci0JcHJpdmF0ZSBpbnQJCW51bV9zZXJ2ZXJzOwotCQotCXB1YmxpYyBQcm94eURlYnVnSW5pdEV2ZW50KGludCB0cmFuc0lELCBTdHJpbmcgYml0cywgaW50IG51bSkgewotCQlzdXBlcih0cmFuc0lELCBFVkVOVF9EQkdfSU5JVCwgYml0cyk7Ci0JCXRoaXMubnVtX3NlcnZlcnMgPSBudW07Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TnVtU2VydmVycygpIHsKLQkJcmV0dXJuIHRoaXMubnVtX3NlcnZlcnM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX0lOSVQgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpICsgIiAiICsgdGhpcy5udW1fc2VydmVyczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDM1NzRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuUHJveHlEZWJ1Z01lbW9yeUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LkFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQgewotCXByaXZhdGUgUHJveHlEZWJ1Z01lbW9yeUluZm8gbWVtb3J5SW5mbzsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIFByb3h5RGVidWdNZW1vcnlJbmZvIG1lbW9yeUluZm8pIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX0RBVEFfUkVBRF9NRU1PUlksIGJpdHMpOwotCQl0aGlzLm1lbW9yeUluZm8gPSBtZW1vcnlJbmZvOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z01lbW9yeUluZm8gZ2V0TWVtb3J5SW5mbygpIHsKLQkJcmV0dXJuIHRoaXMubWVtb3J5SW5mbzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJFVkVOVF9EQkdfREFUQV9SRUFEX01FTU9SWSB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnT0tFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnT0tFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgyOWU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z09LRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdPS0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z09LRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdFdmVudCBpbXBsZW1lbnRzIElQcm94eURlYnVnT0tFdmVudCB7Ci0JcHVibGljIFByb3h5RGVidWdPS0V2ZW50KGludCB0cmFuc0lELCBTdHJpbmcgYml0cykgewotCQlzdXBlcih0cmFuc0lELCBFVkVOVF9EQkdfT0ssIGJpdHMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX09LIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGMzM2FkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnUGFydGlhbEFJRkV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudCB7Ci0JcHJpdmF0ZSBQcm94eURlYnVnQUlGIGRhdGE7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIFByb3h5RGVidWdBSUYgZGF0YSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX1BBUlRJQUxfQUlGLCBiaXRzKTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JcHVibGljIFByb3h5RGVidWdBSUYgZ2V0RGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlcyA9ICJFVkVOVF9EQkdfUEFSVElBTF9BSUYgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpOwotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXMgKz0gIiAiICsgdGhpcy5kYXRhLnRvU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCXJlcyArPSAiIEFJRk5VTEwiOwotCQkKLQkJcmVzICs9ICIsIG5hbWU6ICIgKyBuYW1lOwotCQlyZXR1cm4gcmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlkMWJhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCB7Ci0JcHJpdmF0ZSBpbnQgdGhyZWFkX2lkID0gLTE7Ci0JcHJpdmF0ZSBQcm94eURlYnVnU3RhY2tGcmFtZSBmcmFtZTsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50KGludCB0cmFuc0lELCBTdHJpbmcgYml0cywgaW50IHRocmVhZF9pZCwgUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZnJhbWUpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX1RIUkVBRF9TRUxFQ1QsIGJpdHMpOwotCQl0aGlzLnRocmVhZF9pZCA9IHRocmVhZF9pZDsKLQkJdGhpcy5mcmFtZSA9IGZyYW1lOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZ2V0RnJhbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZyYW1lOwotCX0KLQlwdWJsaWMgaW50IGdldFRocmVhZElkKCkgewotCQlyZXR1cm4gdGhpcy50aHJlYWRfaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXMgPSAiRVZFTlRfREJHX1RIUkVBRF9TRUxFQ1QgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpOwotCQlyZXMgKz0gIlxuIGlkOiAiICsgZnJhbWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTaWduYWxFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnU2lnbmFsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxNDkwOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTaWduYWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuQWJzdHJhY3RQcm94eURlYnVnU3VzcGVuZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1NpZ25hbEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1NpZ25hbEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnU3VzcGVuZEV2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdTaWduYWxFdmVudCB7Ci0JcHJpdmF0ZSBTdHJpbmcJCXNpZ25hbE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcJCXNpZ25hbE1lYW5pbmc7Ci0JCi0JcHVibGljIFByb3h5RGVidWdTaWduYWxFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIHNldCwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZWFuaW5nLCBQcm94eURlYnVnU3RhY2tGcmFtZSBmcmFtZSwgaW50IHRpZCwgaW50IGRlcHRoLCBTdHJpbmdbXSB2YXJzKSB7Ci0JCXN1cGVyKHRyYW5zSUQsIHNldCwgZnJhbWUsIHRpZCwgZGVwdGgsIHZhcnMpOwotCQl0aGlzLnNpZ25hbE5hbWUgPSBuYW1lOwotCQl0aGlzLnNpZ25hbE1lYW5pbmcgPSBtZWFuaW5nOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hbE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNpZ25hbE5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmFsTWVhbmluZygpIHsKLQkJcmV0dXJuIHRoaXMuc2lnbmFsTWVhbmluZzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlcyA9ICJFVkVOVF9EQkdfU0lHTkFMIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKSArICIgIiArIHRoaXMuc2lnbmFsTmFtZTsKLQkJaWYgKHRoaXMuZ2V0RnJhbWUoKSAhPSBudWxsKQotCQkJcmVzICs9ICIgIiArIGdldEZyYW1lKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTaWduYWxFeGl0RXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjVkNjAzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LkFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdFdmVudCBpbXBsZW1lbnRzIElQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50IHsKLQlwcml2YXRlIFN0cmluZyBzaWduYWxOYW1lOwotCXByaXZhdGUgU3RyaW5nIHNpZ25hbE1lYW5pbmc7Ci0KLQlwdWJsaWMgUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIFN0cmluZyBzaWduYWxOYW1lLCBTdHJpbmcgc2lnbmFsTWVhbmluZykgewotCQlzdXBlcih0cmFuc0lELCBFVkVOVF9EQkdfRVhJVF9TSUdOQUwsIGJpdHMpOwotCQl0aGlzLnNpZ25hbE5hbWUgPSBzaWduYWxOYW1lOwotCQl0aGlzLnNpZ25hbE1lYW5pbmcgPSBzaWduYWxNZWFuaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmFsTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2lnbmFsTmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRTaWduYWxNZWFuaW5nKCkgewotCQlyZXR1cm4gdGhpcy5zaWduYWxNZWFuaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX0VYSVRfU0lHTkFMIHRyYW5zaWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKSArICIgIiArIHRoaXMuZ2V0Qml0U2V0KCkudG9TdHJpbmcoKSArICIgIiArIHRoaXMuc2lnbmFsTmFtZSArICIgIiArIHRoaXMuc2lnbmFsTWVhbmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTaWduYWxzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1NpZ25hbHNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQ0YTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1NpZ25hbHNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTaWduYWxzRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnU2lnbmFsc0V2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z1NpZ25hbHNFdmVudCB7Ci0JcHJpdmF0ZSBQcm94eURlYnVnU2lnbmFsW10gc2lnbmFsczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1NpZ25hbHNFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIFByb3h5RGVidWdTaWduYWxbXSBzaWduYWxzKSB7Ci0JCXN1cGVyKHRyYW5zSUQsIEVWRU5UX0RCR19TSUdOQUxTLCBiaXRzKTsKLQkJdGhpcy5zaWduYWxzID0gc2lnbmFsczsKLQl9Ci0JcHVibGljIFByb3h5RGVidWdTaWduYWxbXSBnZXRTaWduYWxzKCkgewotCQlyZXR1cm4gc2lnbmFsczsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlcyA9ICJFVkVOVF9EQkdfU0lHTkFMUyB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCk7Ci0JCS8qCi0JCWZvciAoaW50IGkgPSAwOyBpPHNpZ25hbHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlcyArPSAiXG4gIiArIHNpZ25hbHNbaV0udG9TdHJpbmcoKTsKLQkJfQotCQkqLwotCQlyZXR1cm4gcmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5NzJmOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTdGFja0luZm9EZXB0aEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuQWJzdHJhY3RQcm94eURlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTdGFja0luZm9EZXB0aEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQgewotCXByaXZhdGUgaW50CWRlcHRoOwotCQotCXB1YmxpYyBQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIGludCBkZXB0aCkgewotCQlzdXBlcih0cmFuc0lELCBFVkVOVF9EQkdfU1RBQ0tfSU5GT19ERVBUSCwgYml0cyk7Ci0JCXRoaXMuZGVwdGggPSBkZXB0aDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREZXB0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVwdGg7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX1NUQUNLX0lORk9fREVQVEggdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzk4ZjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudCB7Ci0JcHJpdmF0ZSBQcm94eURlYnVnU3RhY2tGcmFtZVtdIGZyYW1lczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIGJpdHMsIFByb3h5RGVidWdTdGFja0ZyYW1lW10gZnJhbWVzKSB7Ci0JCXN1cGVyKHRyYW5zSUQsIEVWRU5UX0RCR19GUkFNRVMsIGJpdHMpOwotCQl0aGlzLmZyYW1lcyA9IGZyYW1lczsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTdGFja0ZyYW1lW10gZ2V0RnJhbWVzKCkgewotCQlyZXR1cm4gdGhpcy5mcmFtZXM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXMgPSAiRVZFTlRfREJHX0ZSQU1FUyB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXMgKz0gIlxuICIgKyBmcmFtZXNbaV0udG9TdHJpbmcoKTsJCi0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTdGVwRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1N0ZXBFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZjYTkwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1N0ZXBFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuQWJzdHJhY3RQcm94eURlYnVnU3VzcGVuZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1N0ZXBFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTdGVwRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdTdXNwZW5kRXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z1N0ZXBFdmVudCB7Ci0JcHVibGljIFByb3h5RGVidWdTdGVwRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZyBzZXQsIFByb3h5RGVidWdTdGFja0ZyYW1lIGZyYW1lLCBpbnQgdGhyZWFkX2lkLCBpbnQgZGVwdGgsIFN0cmluZ1tdIHZhcnMpIHsKLQkJc3VwZXIodHJhbnNJRCwgc2V0LCBmcmFtZSwgdGhyZWFkX2lkLCBkZXB0aCwgdmFycyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX1NURVAgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpICsgIiAiICsgdGhpcy5nZXRGcmFtZSgpLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnU3VzcGVuZEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTdXNwZW5kRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViNmFiZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdTdXNwZW5kRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5BYnN0cmFjdFByb3h5RGVidWdTdXNwZW5kRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU3VzcGVuZEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1N1c3BlbmRFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z1N1c3BlbmRFdmVudCBpbXBsZW1lbnRzIElQcm94eURlYnVnU3VzcGVuZEV2ZW50IHsKLQlwdWJsaWMgUHJveHlEZWJ1Z1N1c3BlbmRFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIHNldCwgUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZnJhbWUsIGludCB0aHJlYWRfaWQsIGludCBkZXB0aCwgU3RyaW5nW10gdmFycykgewotCQlzdXBlcih0cmFuc0lELCBzZXQsIGZyYW1lLCB0aHJlYWRfaWQsIGRlcHRoLCB2YXJzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJFVkVOVF9EQkdfU1VTUEVORCB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCkgKyAiICIgKyB0aGlzLmdldEZyYW1lKCkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2RlYnVnL2V2ZW50L1Byb3h5RGVidWdUeXBlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1R5cGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRkZTliLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1R5cGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LkFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1R5cGVFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdUeXBlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdFdmVudCBpbXBsZW1lbnRzIElQcm94eURlYnVnVHlwZUV2ZW50IHsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCQotCXB1YmxpYyBQcm94eURlYnVnVHlwZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmcgYml0cywgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHJhbnNJRCwgRVZFTlRfREJHX1RZUEUsIGJpdHMpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRVZFTlRfREJHX1RZUEUgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpICsgIiAiICsgdGhpcy5nZXRCaXRTZXQoKS50b1N0cmluZygpICsgIiAiICsgdGhpcy50eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZGVidWcvZXZlbnQvUHJveHlEZWJ1Z1ZhcnNFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnVmFyc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDFkNzMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9kZWJ1Zy9ldmVudC9Qcm94eURlYnVnVmFyc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuQWJzdHJhY3RQcm94eURlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnVmFyc0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1ZhcnNFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdWYXJzRXZlbnQgewotCXByaXZhdGUgU3RyaW5nW10gdmFyczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1ZhcnNFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nIHNldCwgU3RyaW5nW10gdmFycykgewotCQlzdXBlcih0cmFuc0lELCBFVkVOVF9EQkdfVkFSUywgc2V0KTsKLQkJdGhpcy52YXJzID0gdmFyczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFZhcmlhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMudmFyczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlcyA9ICJFVkVOVF9EQkdfVkFSUyB0cmFuc2lkPSIgKyBnZXRUcmFuc2FjdGlvbklEKCkgKyAiICIgKyB0aGlzLmdldEJpdFNldCgpLnRvU3RyaW5nKCkgKyAiIHsiOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCXJlcyArPSAiLCAiOwotCQkJcmVzICs9IHZhcnNbaV07Ci0JCX0KLQkJCi0JCXJlcyArPSAifSI7Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ldmVudC9Qcm94eUNvbm5lY3RlZEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5Q29ubmVjdGVkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwMzI4OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5Q29ubmVjdGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5BYnN0cmFjdFByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUNvbm5lY3RlZEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlDb25uZWN0ZWRFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlFdmVudCBpbXBsZW1lbnRzIElQcm94eUNvbm5lY3RlZEV2ZW50IHsKLQkKLQlwdWJsaWMgUHJveHlDb25uZWN0ZWRFdmVudCgpIHsKLQkJc3VwZXIoQ09OTkVDVEVELCAwLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5RGlzY29ubmVjdGVkRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlEaXNjb25uZWN0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjUxNWIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlEaXNjb25uZWN0ZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LkFic3RyYWN0UHJveHlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RGlzY29ubmVjdGVkRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURpc2Nvbm5lY3RlZEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eUV2ZW50IGltcGxlbWVudHMgSVByb3h5RGlzY29ubmVjdGVkRXZlbnQgewotCQotCXByaXZhdGUgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQotCXB1YmxpYyBQcm94eURpc2Nvbm5lY3RlZEV2ZW50KGJvb2xlYW4gZXJyb3IpIHsKLQkJc3VwZXIoRElTQ09OTkVDVEVELCAwLCBudWxsKTsKLQkJdGhpcy5lcnJvciA9IGVycm9yOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB3YXNFcnJvcigpIHsgcmV0dXJuIGVycm9yOyB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5RXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ldmVudC9Qcm94eUVycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYzU1NC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5RXJyb3JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LkFic3RyYWN0UHJveHlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXJyb3JFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5RXJyb3JFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlFdmVudCBpbXBsZW1lbnRzIElQcm94eUVycm9yRXZlbnQgewotCXB1YmxpYyBQcm94eUVycm9yRXZlbnQoaW50IHRyYW5zYWN0aW9uSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoRVJST1IsIHRyYW5zYWN0aW9uSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlNZXNzYWdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlNZXNzYWdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhM2FmZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5TWVzc2FnZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuQWJzdHJhY3RQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eU1lc3NhZ2VFdmVudC5MZXZlbDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlNZXNzYWdlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RXZlbnQgaW1wbGVtZW50cyBJUHJveHlNZXNzYWdlRXZlbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0VSUl9FVkVOVCA9IDExOwotCQotCXB1YmxpYyBQcm94eU1lc3NhZ2VFdmVudChpbnQgdHJhbnNhY3Rpb25JRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihNRVNTQUdFLCB0cmFuc2FjdGlvbklELCBhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgUHJveHlNZXNzYWdlRXZlbnQoTGV2ZWwgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKE1FU1NBR0UsIDAsIG5ldyBTdHJpbmdbXSB7Ci0JCQlMRVZFTF9BVFRSICsgIj0iICsgbGV2ZWwubmFtZSgpLAotCQkJVEVYVF9BVFRSICsgIj0iICsgbWVzc2FnZQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5T0tFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ldmVudC9Qcm94eU9LRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhMTZiOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5T0tFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LkFic3RyYWN0UHJveHlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5T0tFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5T0tFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlFdmVudCBpbXBsZW1lbnRzIElQcm94eU9LRXZlbnQgewotCXB1YmxpYyBQcm94eU9LRXZlbnQoaW50IHRyYW5zYWN0aW9uSUQpIHsKLQkJc3VwZXIoT0ssIHRyYW5zYWN0aW9uSUQsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlTaHV0ZG93bkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L2V2ZW50L1Byb3h5U2h1dGRvd25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmM5ZjM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlTaHV0ZG93bkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuQWJzdHJhY3RQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlTaHV0ZG93bkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlTaHV0ZG93bkV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eUV2ZW50IGltcGxlbWVudHMgSVByb3h5U2h1dGRvd25FdmVudCB7Ci0JcHVibGljIFByb3h5U2h1dGRvd25FdmVudChpbnQgdHJhbnNhY3Rpb25JRCkgewotCQlzdXBlcihTSFVURE9XTiwgdHJhbnNhY3Rpb25JRCwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ldmVudC9Qcm94eVRpbWVvdXRFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ldmVudC9Qcm94eVRpbWVvdXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzlkODk2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvZXZlbnQvUHJveHlUaW1lb3V0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5BYnN0cmFjdFByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eVRpbWVvdXRFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5VGltZW91dEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eUV2ZW50IGltcGxlbWVudHMgSVByb3h5VGltZW91dEV2ZW50IHsKLQkKLQlwdWJsaWMgUHJveHlUaW1lb3V0RXZlbnQoKSB7Ci0JCXN1cGVyKFRJTUVPVVQsIDAsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZUluaXRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9Qcm94eVJ1bnRpbWVJbml0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzYxZGIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZUluaXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNsaWVudC5JUHJveHlDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuQWJzdHJhY3RQcm94eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lSW5pdENvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVJbml0Q29tbWFuZCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlDb21tYW5kIGltcGxlbWVudHMgSVByb3h5UnVudGltZUluaXRDb21tYW5kIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9UT0NPTF9WRVJTSU9OX0FUVFIgPSAidmVyc2lvbiI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQkFTRV9JRF9BVFRSID0gImJhc2VJZCI7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lSW5pdENvbW1hbmQoaW50IGJhc2VJZCkgewotCQlzdXBlcihJTklUKTsKLQkJYWRkQXJndW1lbnQoUFJPVE9DT0xfVkVSU0lPTl9BVFRSICsgIj0iICsgSVByb3h5Q2xpZW50LldJUkVfUFJPVE9DT0xfVkVSU0lPTik7Ci0JCWFkZEFyZ3VtZW50KEJBU0VfSURfQVRUUiArICI9IiArIGJhc2VJZCk7Ci0JfQotCQotCXB1YmxpYyBQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihJTklULCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9Qcm94eVJ1bnRpbWVNb2RlbERlZkNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzJlNjM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLkFic3RyYWN0UHJveHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlDb21tYW5kIGltcGxlbWVudHMgSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpIHsKLQkJc3VwZXIoTU9ERUxfREVGKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihNT0RFTF9ERUYsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9Qcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JmMDYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLkFic3RyYWN0UHJveHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlDb21tYW5kIGltcGxlbWVudHMgSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCkgewotCQlzdXBlcihTVEFSVF9FVkVOVFMpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFNUQVJUX0VWRU5UUywgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2NvbW1hbmQvUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTMzODMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2NvbW1hbmQvUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5BYnN0cmFjdFByb3h5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eUNvbW1hbmQKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQgewotCi0JcHVibGljIFByb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kKCkgewotCQlzdXBlcihTVE9QX0VWRU5UUyk7Ci0JfQotCi0JcHVibGljIFByb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFNUT1BfRVZFTlRTLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9Qcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9Qcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWY4YWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2NvbW1hbmQvUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLkFic3RyYWN0UHJveHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eUNvbW1hbmQKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFNVQk1JVF9KT0IpOwotCQlhZGRBcmd1bWVudHMoYXJncyk7Ci0JfQotCi0JcHVibGljIFByb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoU1VCTUlUX0pPQiwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2NvbW1hbmQvUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2NvbW1hbmQvUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Y4NjI3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5BYnN0cmFjdFByb3h5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlDb21tYW5kCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSk9CX0lEX0FUVFIgPSAiam9iSWQiOwotCi0JcHVibGljIFByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQoU3RyaW5nIGpvYklkKSB7Ci0JCXN1cGVyKFRFUk1JTkFURV9KT0IpOwotCQlhZGRBcmd1bWVudChKT0JfSURfQVRUUiArICI9IiArIGpvYklkKTsKLQl9Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihURVJNSU5BVEVfSk9CLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNhOTQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuQWJzdHJhY3RQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RXZlbnQgCi0JaW1wbGVtZW50cyBJUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKEFUVFJfREVGLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA1ZWM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IAotCWV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCAKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCgpIHsKLQkJc3VwZXIoQ09OTkVDVEVEX1NUQVRFLCAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzNzQ3OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkgewotCQlzdXBlcihFUlJPUl9TVEFURSwgMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNmM5Mi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgaW1wbGVtZW50cyBJUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQgewotCXB1YmxpYyBQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihKT0JfQ0hBTkdFLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTFjZWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5UnVudGltZUV2ZW50IGltcGxlbWVudHMgSVByb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKE5PREVfQ0hBTkdFLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDFlMmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU1lc3NhZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuQWJzdHJhY3RQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU1lc3NhZ2VFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZU1lc3NhZ2VFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlFdmVudCAKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IHsKLQotCXB1YmxpYyBQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoTUVTU0FHRSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotCQotCXB1YmxpYyBQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMobGV2ZWwsIDAsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwgbGV2ZWwsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihNRVNTQUdFLCAwLCBuZXcgU3RyaW5nW10gewotCQkJSVByb3h5TWVzc2FnZUV2ZW50LkxFVkVMX0FUVFIgKyAiPSIgKyBsZXZlbC5uYW1lKCksCi0JCQlJUHJveHlNZXNzYWdlRXZlbnQuQ09ERV9BVFRSICsgIj0iICsgY29kZSwKLQkJCUlQcm94eU1lc3NhZ2VFdmVudC5URVhUX0FUVFIgKyAiPSIgKyBtZXNzYWdlCi0JCX0pOwotCX0KLQkKLQlwdWJsaWMgUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50KElQcm94eU1lc3NhZ2VFdmVudCBldmVudCkgewotCQl0aGlzKGV2ZW50LmdldFRyYW5zYWN0aW9uSUQoKSwgZXZlbnQuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVOZXdKb2JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTA0NTE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVOZXdKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOZXdKb2JFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZU5ld0pvYkV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCBpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVOZXdKb2JFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQoaW50IHRyYW5zaWQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoTkVXX0pPQiwgdHJhbnNpZCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmMyYTAzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3TWFjaGluZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lTmV3TWFjaGluZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCBpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihORVdfTUFDSElORSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld05vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld05vZGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFhNDQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVOZXdOb2RlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCBpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVOZXdOb2RlRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZU5ld05vZGVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihORVdfTk9ERSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNkNTQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCBpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihORVdfUFJPQ0VTUywgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVOZXdRdWV1ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmYzZGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3UXVldWVFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5UnVudGltZUV2ZW50IGltcGxlbWVudHMgSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoTkVXX1FVRVVFLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzVmNGMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5UnVudGltZUV2ZW50IGltcGxlbWVudHMgSVByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudCB7Ci0JCi0JcHVibGljIFByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihOT0RFX0NIQU5HRSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYxZWU3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCBpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgewotCQotCXB1YmxpYyBQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoUFJPQ0VTU19DSEFOR0UsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUXVldWVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdjMjYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCBpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50IHsKLQotCXB1YmxpYyBQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFFVRVVFX0NIQU5HRSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1MjUyMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVBbGxFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50IAotCWV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCAKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFJFTU9WRV9BTEwsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjQ5YzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50IHsKLQotCXB1YmxpYyBQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihSRU1PVkVfSk9CLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTdiMzAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFJFTU9WRV9NQUNISU5FLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTc2OGUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFJFTU9WRV9OT0RFLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNmRhYzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFJFTU9WRV9QUk9DRVNTLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZTA2NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50IAotCWV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCAKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihSRU1PVkVfUVVFVUUsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MWE0MzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFByb3h5UnVudGltZUV2ZW50IAotCQlpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQoKSB7Ci0JCXN1cGVyKFJVTk5JTkdfU1RBVEUsIDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhODliYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LkFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudCB7Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50KCkgewotCQlzdXBlcihTSFVURE9XTl9TVEFURSwgMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiOTQwNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50IAotCWV4dGVuZHMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudCAKLQkJaW1wbGVtZW50cyBJUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKFNUQVJUVVBfRVJST1IsIDAsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJSVByb3h5RXJyb3JFdmVudC5FUlJPUl9DT0RFX0FUVFIgKyAiPSIgKyAwLAotCQkJCUlQcm94eUVycm9yRXZlbnQuRVJST1JfTUVTU0FHRV9BVFRSICsgIj0iICsgbWVzc2FnZQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoU3RyaW5nW10gYXR0cnMpIHsKLQkJc3VwZXIoU1RBUlRVUF9FUlJPUiwgMCwgYXR0cnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg4OTRlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudDsKLQotcHVibGljIGNsYXNzIFByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFByb3h5UnVudGltZUV2ZW50IAotCQlpbXBsZW1lbnRzIElQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50IHsKLQotCXB1YmxpYyBQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFNVQk1JVEpPQl9FUlJPUiwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWRmMDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC9wcm94eS9ydW50aW1lL2V2ZW50L1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCAKLQlleHRlbmRzIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQgCi0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQgewotCi0JcHVibGljIFByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoVEVSTUlOQVRFSk9CX0VSUk9SLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NsaWVudC9BYnN0cmFjdFByb3h5Q2xpZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NsaWVudC9BYnN0cmFjdFByb3h5Q2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzg1NmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jbGllbnQvQWJzdHJhY3RQcm94eUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsczsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmNvbW1hbmQuUHJveHlRdWl0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZXZlbnQuUHJveHlDb25uZWN0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZXZlbnQuUHJveHlEaXNjb25uZWN0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZXZlbnQuUHJveHlNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmV2ZW50LlByb3h5VGltZW91dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUNvbm5lY3RlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlEaXNjb25uZWN0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXh0ZW5kZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5TWVzc2FnZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlPS0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlTaHV0ZG93bkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlUaW1lb3V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eU1lc3NhZ2VFdmVudC5MZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS51dGlsLkRlYnVnT3B0aW9uczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlDbGllbnQgaW1wbGVtZW50cyBJUHJveHlDbGllbnQgewotCi0JcHJpdmF0ZSBlbnVtIFNlc3Npb25TdGF0ZSB7V0FJVElORywgQ09OTkVDVEVELCBSVU5OSU5HLCBTSFVUVElOR19ET1dOLCBTSFVURE9XTn0KLQkKLQlwcml2YXRlIGludAkJCQkJdHJhbnNhY3Rpb25JRCA9IDE7Ci0JcHJpdmF0ZSBpbnQJCQkJCXNlc3NQb3J0ID0gMDsKLQlwcml2YXRlIFNlcnZlclNvY2tldENoYW5uZWwJc2Vzc1N2clNvY2sgPSBudWxsOwotCXByaXZhdGUgU29ja2V0Q2hhbm5lbAkJc2Vzc1NvY2sgPSBudWxsOwotCXByaXZhdGUgSVByb3h5RXZlbnRGYWN0b3J5CXByb3h5RXZlbnRGYWN0b3J5OwotCi0JcHJpdmF0ZSBSZWFkYWJsZUJ5dGVDaGFubmVsCXNlc3NJbnB1dDsKLQlwcml2YXRlIFdyaXRhYmxlQnl0ZUNoYW5uZWwJc2Vzc091dHB1dDsKLQotCXByaXZhdGUgVGhyZWFkCQkJCWV2ZW50VGhyZWFkOwotCXByaXZhdGUgVGhyZWFkCQkJCWFjY2VwdFRocmVhZDsKLQkKLQlwcml2YXRlIERlYnVnT3B0aW9ucwkJZGVidWdPcHRpb25zOwotCXByaXZhdGUgU2Vzc2lvblN0YXRlIAkJc3RhdGU7Ci0KLQlwcml2YXRlIExpc3Q8SVByb3h5RXZlbnRMaXN0ZW5lcj4JbGlzdGVuZXJzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PElQcm94eUV2ZW50TGlzdGVuZXI+KCkpOwotCi0JcHVibGljIEFic3RyYWN0UHJveHlDbGllbnQoKSB7Ci0JCXRoaXMuZGVidWdPcHRpb25zID0gbmV3IERlYnVnT3B0aW9ucygpOwotCQl0aGlzLnN0YXRlID0gU2Vzc2lvblN0YXRlLlNIVVRET1dOOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I2FkZFByb3h5RXZlbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAucHJveHkuY2xpZW50LmV2ZW50LklQcm94eUV2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJveHlFdmVudExpc3RlbmVyKElQcm94eUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I2dldFNlc3Npb25Qb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlc3Npb25Qb3J0KCkgewotCQlyZXR1cm4gc2Vzc1BvcnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I2lzUmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZHkoKSB7Ci0JCXN5bmNocm9uaXplZCAoc3RhdGUpIHsKLQkJCXJldHVybiBzdGF0ZSA9PSBTZXNzaW9uU3RhdGUuUlVOTklORzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgcHJveHkgaGFzIHNodXQgZG93bgotCSAqIAotCSAqIEByZXR1cm4gc2h1dCBkb3duIHN0YXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaHV0ZG93bigpIHsKLQkJc3luY2hyb25pemVkIChzdGF0ZSkgewotCQkJcmV0dXJuIHN0YXRlID09IFNlc3Npb25TdGF0ZS5TSFVURE9XTjsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY2xpZW50LklQcm94eUNsaWVudCNuZXdUcmFuc2FjdGlvbklEKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBuZXdUcmFuc2FjdGlvbklEKCkgewotCQlyZXR1cm4gKyt0cmFuc2FjdGlvbklEOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY2xpZW50LklQcm94eUNsaWVudCNyZW1vdmVQcm94eUV2ZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnByb3h5LmNsaWVudC5ldmVudC5JUHJveHlFdmVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3h5RXZlbnRMaXN0ZW5lcihJUHJveHlFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I3NlbmRDb21tYW5kKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2VuZENvbW1hbmQoSVByb3h5Q29tbWFuZCBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghaXNSZWFkeSgpKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNoYW5uZWwgaXMgbm90IHJlYWR5IHRvIHNlbmQiKTsKLQkJfQotCQlQcm94eVBhY2tldCBwYWNrZXQgPSBuZXcgUHJveHlQYWNrZXQoY21kKTsKLQkJcGFja2V0LnNlbmQoc2Vzc091dHB1dCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I3Nlc3Npb25Db25uZWN0KCkKLQkgKi8KLQlwdWJsaWMgaW50IHNlc3Npb25Db25uZWN0KCkgewotCQlyZXR1cm4gMDsgLy8gTm90IGltcGxlbWVudGVkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I3Nlc3Npb25DcmVhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzZXNzaW9uQ3JlYXRlKDApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuSVByb3h5Q2xpZW50I3Nlc3Npb25DcmVhdGUoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGUoaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNlc3Npb25DcmVhdGUoMCwgdGltZW91dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNsaWVudC5JUHJveHlDbGllbnQjc2Vzc2lvbkNyZWF0ZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlKGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZXNzaW9uQ3JlYXRlKCIrcG9ydCsiLCIrdGltZW91dCsiKSIpOwotCQl9Ci0JCXNlc3NTdnJTb2NrID0gU2VydmVyU29ja2V0Q2hhbm5lbC5vcGVuKCk7Ci0JCUluZXRTb2NrZXRBZGRyZXNzIGlzYSA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwb3J0KTsKLQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiaW5kKCIraXNhLnRvU3RyaW5nKCkrIikiKTsKLQkJfQotCQlzZXNzU3ZyU29jay5zb2NrZXQoKS5iaW5kKGlzYSk7Ci0JCWlmICh0aW1lb3V0ID4gMCkKLQkJCXNlc3NTdnJTb2NrLnNvY2tldCgpLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJc2Vzc1BvcnQgPSBzZXNzU3ZyU29jay5zb2NrZXQoKS5nZXRMb2NhbFBvcnQoKTsKLQkJCi0JCXN5bmNocm9uaXplZCAoc3RhdGUpIHsKLQkJCXN0YXRlID0gU2Vzc2lvblN0YXRlLldBSVRJTkc7Ci0JCX0KLQkJCi0JCWlmIChEZWJ1Z09wdGlvbnMuQ0xJRU5UX1RSQUNJTkcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicG9ydD0iICsgc2Vzc1BvcnQpOwotCQl9Ci0JCQotCQlhY2NlcHRUaHJlYWQgPSBuZXcgVGhyZWFkKCJQcm94eSBDbGllbnQgQWNjZXB0IFRocmVhZCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQgdGhyZWFkIHN0YXJ0aW5nLi4uIik7Ci0JCQkJCX0KLQkJCQkJc2Vzc1NvY2sgPSBzZXNzU3ZyU29jay5hY2NlcHQoKTsKLQkJCQkJc2Vzc0lucHV0ID0gc2Vzc1NvY2s7Ci0JCQkJCXNlc3NPdXRwdXQgPSBzZXNzU29jazsKLQkJCQl9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZXJyb3IgPSB0cnVlOwotCQkJCQlmaXJlUHJveHlUaW1lb3V0RXZlbnQobmV3IFByb3h5VGltZW91dEV2ZW50KCkpOwotCQkJCX0gY2F0Y2ggKENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZXJyb3IgPSB0cnVlOwotCQkJCQlmaXJlUHJveHlNZXNzYWdlRXZlbnQobmV3IFByb3h5TWVzc2FnZUV2ZW50KExldmVsLldBUk5JTkcsICJBY2NlcHQgY2FuY2VsbGVkIGJ5IHVzZXIiKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllcnJvciA9IHRydWU7Ci0JCQkJCWZpcmVQcm94eU1lc3NhZ2VFdmVudChuZXcgUHJveHlNZXNzYWdlRXZlbnQoTGV2ZWwuRkFUQUwsICJJT0V4Y2VwdGlvbiBpbiBhY2NlcHQiKSk7Ci0JCQkJfSBmaW5hbGx5IHsJCQotCQkJCQl0cnkgewotCQkJCQkJc2Vzc1N2clNvY2suY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSU8gRXhjZXB0aW9uIHRyeWluZyB0byBjbG9zZSBzZXJ2ZXIgc29ja2V0IChub24gZmF0YWwpIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3luY2hyb25pemVkIChzdGF0ZSkgewotCQkJCQkJaWYgKGlzSW50ZXJydXB0ZWQoKSkgewotCQkJCQkJCWVycm9yID0gdHJ1ZTsKLQkJCQkJCQlmaXJlUHJveHlNZXNzYWdlRXZlbnQobmV3IFByb3h5TWVzc2FnZUV2ZW50KExldmVsLldBUk5JTkcsICJDb25uZWN0aW9uIGNhbmNlbGxlZCBieSB1c2VyIikpOwotCQkJCQkJfQotCQkJCQkJaWYgKCFlcnJvciAmJiBzdGF0ZSA9PSBTZXNzaW9uU3RhdGUuV0FJVElORykgewotCQkJCQkJCXN0YXRlID0gU2Vzc2lvblN0YXRlLkNPTk5FQ1RFRDsKLQkJCQkJCQlmaXJlUHJveHlDb25uZWN0ZWRFdmVudChuZXcgUHJveHlDb25uZWN0ZWRFdmVudCgpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3RhdGUgPSBTZXNzaW9uU3RhdGUuU0hVVERPV047Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQgdGhyZWFkIGV4aXRpbmcuLi4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWNjZXB0VGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIHByb3h5IHNlc3Npb24gdGhhdCB3aWxsIHJlYWQgZnJvbSBJbnB1dFN0cmVhbSBhbmQgd3JpdGUgdG8gT3V0cHV0U3RyZWFtCi0JICogCi0JICogR2VuZXJhdGVzIGEgUHJveHlDb25uZWN0ZWRFdmVudAotCSAqIAotCSAqIEBwYXJhbQlvdXRwdXQJCXN0cmVhbSB0byB3cml0ZSB0bwotCSAqIEBwYXJhbQlpbnB1dAkJc3RyZWFtIHRvIHJlYWQgZnJvbQotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGUoT3V0cHV0U3RyZWFtIG91dHB1dCwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZXNzaW9uQ3JlYXRlKHN0ZGluLCBzdGRvdXQpIik7Ci0JCX0KLQkJc2Vzc0lucHV0ID0gQ2hhbm5lbHMubmV3Q2hhbm5lbChpbnB1dCk7Ci0JCXNlc3NPdXRwdXQgPSBDaGFubmVscy5uZXdDaGFubmVsKG91dHB1dCk7Ci0JCXN5bmNocm9uaXplZCAoc3RhdGUpIHsKLQkJCXN0YXRlID0gU2Vzc2lvblN0YXRlLkNPTk5FQ1RFRDsKLQkJfQotCQlmaXJlUHJveHlDb25uZWN0ZWRFdmVudChuZXcgUHJveHlDb25uZWN0ZWRFdmVudCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY2xpZW50LklQcm94eUNsaWVudCNzZXNzaW9uRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChzdGF0ZSkgewotCQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBXQUlUSU5HOgotCQkJCWlmIChhY2NlcHRUaHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEZvcmNlIGludGVycnVwdCBvZiBhY2NlcHQuIE5vdGUgdGhhdCB0aGlzIHdpbGwgY2F1c2UKLQkJCQkJICogYSBQcm94eUVycm9yRXZlbnQgdG8gYmUgZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlhY2NlcHRUaHJlYWQuaW50ZXJydXB0KCk7Ci0JCQkJfQotCQkJCXN0YXRlID0gU2Vzc2lvblN0YXRlLlNIVVRUSU5HX0RPV047Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTk5FQ1RFRDoKLQkJCQl0cnkgewotCQkJCQlzZXNzU29jay5jbG9zZSgpOwotCQkJCQlzdGF0ZSA9IFNlc3Npb25TdGF0ZS5TSFVUVElOR19ET1dOOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJc3RhdGUgPSBTZXNzaW9uU3RhdGUuU0hVVERPV047Ci0JCQkJfSAKLQkJCQlicmVhazsKLQkJCWNhc2UgUlVOTklORzoKLQkJCQkvKgotCQkJCSAqIFNlbmQgcXVpdCBjb21tYW5kLiBQcm94eSB3aWxsIHNodXQgZG93biB3aGVuIE9LIGlzCi0JCQkJICogcmVjZWl2ZWQgb3IgYWZ0ZXIgc2h1dGRvd25UaW1lb3V0LgotCQkJCSAqLwotCQkJCUlQcm94eUNvbW1hbmQgY21kID0gbmV3IFByb3h5UXVpdENvbW1hbmQoKTsKLQkJCQkvLyBUT0RPOiBzdGFydCBzaHV0ZG93biB0aW1lb3V0Ci0JCQkJdHJ5IHsKLQkJCQkJc2VuZENvbW1hbmQoY21kKTsKLQkJCQkJc3RhdGUgPSBTZXNzaW9uU3RhdGUuU0hVVFRJTkdfRE9XTjsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRlbGwgZXZlbnQgdGhyZWFkIHRvIGV4aXQKLQkJCQkJc3RhdGUgPSBTZXNzaW9uU3RhdGUuU0hVVERPV047Ci0JCQkJCS8vIFRPRE86IHN0b3Agc2h1dGRvd24gdGltZW91dAotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTdGFydCBhIHRocmVhZCB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIHRoZSBwcm94eSBieSByZXBlYXRlZGx5IGNhbGxpbmcgc2Vzc2lvblByb2dyZXNzKCkuIAotCSAqIFRoZSB0aHJlYWQgaXMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgUHJveHlEaXNjb25uZWN0ZWRFdmVudCB3aGVuIGl0IGV4aXRzLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24JaWYgdGhlIHNlc3Npb24gaXMgbm90IGNvbm5lY3RlZCBvciB0aGUgZXZlbnQgdGhyZWFkIGZhaWxzIHRvIHN0YXJ0Ci0JICovCi0JcHVibGljIHZvaWQgc2Vzc2lvbkhhbmRsZUV2ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWV2ZW50VGhyZWFkID0gbmV3IFRocmVhZCgiUHJveHkgQ2xpZW50IEV2ZW50IFRocmVhZCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCQkJaW50IGVycm9yQ291bnQgPSAwOwkJCQotCQkJCQotCQkJCWlmIChEZWJ1Z09wdGlvbnMuQ0xJRU5UX1RSQUNJTkcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJldmVudCB0aHJlYWQgc3RhcnRpbmcuLi4iKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKGVycm9yQ291bnQgPCBNQVhfRVJST1JTICYmICFpc0ludGVycnVwdGVkKCkpIHsKLQkJCQkJCXN5bmNocm9uaXplZCAoc3RhdGUpIHsKLQkJCQkJCQlpZiAoc3RhdGUgPT0gU2Vzc2lvblN0YXRlLlNIVVRET1dOKSB7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghc2Vzc2lvblByb2dyZXNzKCkpIHsKLQkJCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXN5bmNocm9uaXplZCAoc3RhdGUpIHsKLQkJCQkJCWlmICghaXNJbnRlcnJ1cHRlZCgpICYmIHN0YXRlICE9IFNlc3Npb25TdGF0ZS5TSFVUVElOR19ET1dOKSB7Ci0JCQkJCQkJZXJyb3IgPSB0cnVlOwotCQkJCQkJCWlmIChEZWJ1Z09wdGlvbnMuQ0xJRU5UX1RSQUNJTkcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJldmVudCB0aHJlYWQgSU9FeGNlcHRpb24gLiAuIC4gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IAotCQkJCQotCQkJCWlmIChlcnJvckNvdW50ID49IE1BWF9FUlJPUlMpIHsKLQkJCQkJZXJyb3IgPSB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlzZXNzU29jay5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9IAotCQkJCQotCQkJCXN5bmNocm9uaXplZCAoc3RhdGUpIHsKLQkJCQkJc3RhdGUgPSBTZXNzaW9uU3RhdGUuU0hVVERPV047Ci0JCQkJfQotCi0JCQkJZmlyZVByb3h5RGlzY29ubmVjdGVkRXZlbnQobmV3IFByb3h5RGlzY29ubmVjdGVkRXZlbnQoZXJyb3IpKTsKLQkJCQkKLQkJCQlpZiAoRGVidWdPcHRpb25zLkNMSUVOVF9UUkFDSU5HKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQgdGhyZWFkIGV4aXRlZCIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlzeW5jaHJvbml6ZWQgKHN0YXRlKSB7Ci0JCQlpZiAoc3RhdGUgIT0gU2Vzc2lvblN0YXRlLkNPTk5FQ1RFRCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm90IHJlYWR5IHRvIHJlY2VpdmUgZXZlbnRzIik7Ci0JCQl9Ci0JCQlzdGF0ZSA9IFNlc3Npb25TdGF0ZS5SVU5OSU5HOwotCQl9Ci0JCWV2ZW50VGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZmFjdG9yeSB1c2VkIHRvIGRlY29kZSBldmVudHMKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV2ZW50RmFjdG9yeShJUHJveHlFdmVudEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLnByb3h5RXZlbnRGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGluY29taW5nIGV2ZW50cwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNlc3Npb25Qcm9ncmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3h5UGFja2V0IHBhY2tldCA9IG5ldyBQcm94eVBhY2tldCgpOwotCQlpZiAoRGVidWdPcHRpb25zLlBST1RPQ09MX1RSQUNJTkcpIHsKLQkJCXBhY2tldC5zZXREZWJ1Zyh0cnVlKTsKLQkJfQotCQlpZiAoIXBhY2tldC5yZWFkKHNlc3NJbnB1dCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLyoKLQkJICogTm93IGNvbnZlcnQgdGhlIGV2ZW50IGludG8gYW4gSVByb3h5RXZlbnQKLQkJICovCi0JCUlQcm94eUV2ZW50IGUgPSBwcm94eUV2ZW50RmFjdG9yeS50b0V2ZW50KHBhY2tldCk7Ci0JCQkJCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgSVByb3h5TWVzc2FnZUV2ZW50KSB7Ci0JCQkJZmlyZVByb3h5TWVzc2FnZUV2ZW50KChJUHJveHlNZXNzYWdlRXZlbnQpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5T0tFdmVudCkgewotCQkJCWZpcmVQcm94eU9LRXZlbnQoKElQcm94eU9LRXZlbnQpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RXJyb3JFdmVudCkgewotCQkJCWZpcmVQcm94eUVycm9yRXZlbnQoKElQcm94eUVycm9yRXZlbnQpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5U2h1dGRvd25FdmVudCkgewotCQkJCWlmIChzdGF0ZSA9PSBTZXNzaW9uU3RhdGUuU0hVVFRJTkdfRE9XTikgeyAKLQkJCQkJc3RhdGUgPSBTZXNzaW9uU3RhdGUuU0hVVERPV047Ci0JCQkJCS8vIFRPRE86IHN0b3Agc2h1dGRvd24gdGltZW91dAotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eUV4dGVuZGVkRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlFeHRlbmRlZEV2ZW50KChJUHJveHlFeHRlbmRlZEV2ZW50KSBlKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBldmVudCB0byBldmVudCBoYW5kbGVycwotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm94eUNvbm5lY3RlZEV2ZW50KElQcm94eUNvbm5lY3RlZEV2ZW50IGV2ZW50KSB7Ci0JCUlQcm94eUV2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGV2ZW50IHRvIGV2ZW50IGhhbmRsZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGlzY29ubmVjdGVkRXZlbnQoSVByb3h5RGlzY29ubmVjdGVkRXZlbnQgZXZlbnQpIHsKLQkJSVByb3h5RXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eUV2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgZXZlbnQgdG8gZXZlbnQgaGFuZGxlcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlFcnJvckV2ZW50KElQcm94eUVycm9yRXZlbnQgZXZlbnQpIHsKLQkJSVByb3h5RXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eUV2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgZXZlbnQgdG8gZXZlbnQgaGFuZGxlcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlFeHRlbmRlZEV2ZW50KElQcm94eUV4dGVuZGVkRXZlbnQgZXZlbnQpIHsKLQkJSVByb3h5RXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eUV2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgZXZlbnQgdG8gZXZlbnQgaGFuZGxlcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlNZXNzYWdlRXZlbnQoSVByb3h5TWVzc2FnZUV2ZW50IGV2ZW50KSB7Ci0JCUlQcm94eUV2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGV2ZW50IHRvIGV2ZW50IGhhbmRsZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5T0tFdmVudChJUHJveHlPS0V2ZW50IGV2ZW50KSB7Ci0JCUlQcm94eUV2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmQgZXZlbnQgdG8gZXZlbnQgaGFuZGxlcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlUaW1lb3V0RXZlbnQoSVByb3h5VGltZW91dEV2ZW50IGV2ZW50KSB7Ci0JCUlQcm94eUV2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvY2xpZW50L0lQcm94eUNsaWVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jbGllbnQvSVByb3h5Q2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZmU0MWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jbGllbnQvSVByb3h5Q2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFdmVudExpc3RlbmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUNsaWVudCB7Ci0JLyogd2lyZSBwcm90b2NvbCB2ZXJzaW9uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lSRV9QUk9UT0NPTF9WRVJTSU9OID0gIjIuMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0VSUk9SUyA9IDU7Ci0JCi0JLyoqCi0JICogQWRkIGxpc3RlbmVyIHRvIHJlY2VpdmUgcHJveHkgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3h5RXZlbnRMaXN0ZW5lcihJUHJveHlFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHBvcnQgdGhhdCBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLgotCSAqIAotCSAqIEByZXR1cm4gcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlc3Npb25Qb3J0KCk7Ci0JCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGNsaWVudCBpcyByZWFkeSB0byBzZW5kIGNvbW1hbmRzCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNsaWVudCBpcyByZWFkeSB0byBzZW5kIGNvbW1hbmRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkeSgpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgYSBuZXcgdHJhbnNhY3Rpb24gSUQuCi0JICogCi0JICogQHJldHVybiBuZXcgdHJhbnNhY3Rpb24gSUQKLQkgKi8KLQlwdWJsaWMgaW50IG5ld1RyYW5zYWN0aW9uSUQoKTsJCi0JCi0JLyoqCi0JICogUmVtb3ZlIGxpc3RlbmVyIGZyb20gcmVjZWl2aW5nIHByb3h5IGV2ZW50cwotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm94eUV2ZW50TGlzdGVuZXIoSVByb3h5RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIHByb3h5IHNlcnZlci4gCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQgY29tbWFuZCB0byBzZW5kCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRDb21tYW5kKElQcm94eUNvbW1hbmQgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENvbm5lY3QgdG8gYSByZW1vdGUgcHJveHkgc2VydmVyLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgc2Vzc2lvbkNvbm5lY3QoKTsKLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFNhbWUgYXMgc2Vzc2lvbkNyZWF0ZSgwLCAwKQotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwkKLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFNhbWUgYXMgc2Vzc2lvbkNyZWF0ZSgwLCB0aW1lb3V0KQotCSAqIAotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGUoaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBwcm94eSBzZXNzaW9uLiBUaGlzIHN0YXJ0cyBhIHRocmVhZCB0aGF0IHdhaXRzIGZvciBhbiBpbmNvbWluZyBwcm94eSBjb25uZWN0aW9uLgotCSAqIElmIHRoZSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZW4gYW4gZXZlbnQgdGhyZWFkIGlzIHN0YXJ0ZWQuCi0JICogCi0JICogT24gYSBzdWNjZXNzZnVsIHJldHVybiBvbmUgb2YgdGhyZWUgZXZlbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGdlbmVyYXRlZDoKLQkgKiAKLQkgKiBQcm94eUNvbm5lY3RlZEV2ZW50CWlmIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIHN1Y2NlZWRlZAotCSAqIFByb3h5VGltZW91dEV2ZW50CWlmIG5vIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXMKLQkgKiBQcm94eUVycm9yRXZlbnQJCWlmIHRoZSBhY2NlcHQgZmFpbHMgb3IgaXMgY2FuY2VsZWQKLQkgKiAKLQkgKiBAcGFyYW0JcG9ydAkJcG9ydCBudW1iZXIgdG8gdXNlIGZvciBpbmNvbWluZyBjb25uZWN0aW9uICgwID0gYXV0b2dlbmVyYXRlKQotCSAqIEBwYXJhbQl0aW1lb3V0CQlkZWxheSAoaW4gbXMpIHRvIHdhaXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gKDAgPSB3YWl0IGZvcmV2ZXIpCi0JICogQHRocm93cwlJT0V4Y2VwdGlvbglpZiBhY2NlcHQgdGhyZWFkIGZhaWxzIHRvIHN0YXJ0IAotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGUoaW50IHBvcnQsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzaHV0IGRvd24gdGhlIHByb3h5IHNlc3Npb24gcmVnYXJkbGVzcyBvZiBzdGF0ZS4KLQkgKiAKLQkgKiBFdmVudHMgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGFzIGEgcmVzdWx0IG9mIHNlc3Npb25GaW5pc2goKSBhcmU6Ci0JICogCi0JICogUHJveHlFcnJvckV2ZW50CQkJaWYgc2Vzc2lvbkNyZWF0ZSgpIHdhcyB3YWl0aW5nIGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uCi0JICogUHJveHlEaXNjb25uZWN0ZWRFdmVudAlpZiB0aGUgcHJveHkgc2h1dCBkb3duIHN1Y2Nlc3NmdWxseQotCSAqIAotCSAqIEB0aHJvd3MJSU9FeGNlcHRpb24JaWYgdGhlIHNlc3Npb24gaXMgYWxyZWFkeSBzaHV0IGRvd24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvQWJzdHJhY3RQcm94eUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvY29tbWFuZC9BYnN0cmFjdFByb3h5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODliNTU5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvY29tbWFuZC9BYnN0cmFjdFByb3h5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm94eUNvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlDb21tYW5kIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0PElQcm94eUNvbW1hbmQ+IHBlbmRpbmdDb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8SVByb3h5Q29tbWFuZD4oKTsKLQotCXByaXZhdGUgaW50CQkJCQljb21tYW5kSUQ7Ci0JcHJpdmF0ZSBpbnQJCQkJCXRyYW5zYWN0aW9uSUQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPglhcmdzOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdFByb3h5Q29tbWFuZChpbnQgY29tbWFuZElEKSB7Ci0JCXRoaXMuY29tbWFuZElEID0gY29tbWFuZElEOwotCQl0aGlzLnRyYW5zYWN0aW9uSUQgPSBuZXdUcmFuc2FjdGlvbklEKHRoaXMpOwotCQl0aGlzLmFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm94eUNvbW1hbmQoaW50IGNvbW1hbmRJRCwgaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJdGhpcy5jb21tYW5kSUQgPSBjb21tYW5kSUQ7Ci0JCXRoaXMudHJhbnNhY3Rpb25JRCA9IHRyYW5zSUQ7Ci0JCWZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKLQkJCXRoaXMuYXJncy5hZGQoYXJnKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmQjYWRkQXJndW1lbnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJnKSB7Ci0JCWlmIChhcmcgPT0gbnVsbCkgewotCQkJYXJncy5hZGQoIiIpOwotCQl9IGVsc2UgewotCQkJYXJncy5hZGQoYXJnKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNYXJrIHRoZSBjb21tYW5kIHRoYXQgaXQgaGFzIGJlZW4gY29tcGxldGVkIHNvIHRoZSB0cmFuc2FjdGlvbgotCSAqIElEIGNhbiBiZSB1c2VkIGJ5IGZ1dHVyZSBjb21tYW5kcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoKSB7Ci0JCXBlbmRpbmdDb21tYW5kcy5hZGQodHJhbnNhY3Rpb25JRCwgbnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmQjZ2V0QXJndW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotCQlyZXR1cm4gYXJncy50b0FycmF5KG5ldyBTdHJpbmdbYXJncy5zaXplKCldKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5Q29tbWFuZCNnZXRDb21tYW5kSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29tbWFuZElEKCkgewotCQlyZXR1cm4gY29tbWFuZElEOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJhbnNhY3Rpb24gaWQgdXNlZCBieSB0aGlzIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRyYW5zYWN0aW9uSUQoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvbklEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzdHIgPSB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiB0aWQ9IiArIGdldFRyYW5zYWN0aW9uSUQoKTsKLQkJCi0JCWZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKLQkJCWlmIChhcmcgPT0gbnVsbCkgewotCQkJCXN0ciArPSAiIDxudWxsPiI7Ci0JCQl9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIiIpKSB7Ci0JCQkJc3RyICs9ICIgXCJcIiI7Ci0JCQl9IGVsc2UgewotCQkJCXN0ciArPSAiICIgKyBhcmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKgotCSAqIEZpbmQgZmlyc3QgYXZhaWxhYmxlIHNsb3QuIFVzZSBzbG90IElEIGFzIHRyYW5zYWN0aW9uIElELgotCSAqIAotCSAqIEByZXR1cm4gbmV3IHRyYW5zYWN0aW9uIElECi0JICovCi0JcHJpdmF0ZSBpbnQgbmV3VHJhbnNhY3Rpb25JRChJUHJveHlDb21tYW5kIGNtZCkgewotCQlpbnQgdHJhbnNJRCA9IDA7Ci0JCQotCQlmb3IgKDsgdHJhbnNJRCA8IHBlbmRpbmdDb21tYW5kcy5zaXplKCk7IHRyYW5zSUQrKykgewotCQkJaWYgKHBlbmRpbmdDb21tYW5kcy5nZXQodHJhbnNJRCkgPT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlwZW5kaW5nQ29tbWFuZHMuYWRkKHRyYW5zSUQsIGNtZCk7Ci0JCQotCQlyZXR1cm4gdHJhbnNJRDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJnCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXJndW1lbnQoYm9vbGVhbiBhcmcpIHsKLQkJYWRkQXJndW1lbnQoYXJnPyIxIjoiMCIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBcmd1bWVudChDaGFyYWN0ZXIgYXJnKSB7Ci0JCWFyZ3MuYWRkKGFyZz09bnVsbCA/ICIiIDogYXJnLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBcmd1bWVudChpbnQgYXJnKSB7Ci0JCWFyZ3MuYWRkKEludGVnZXIudG9TdHJpbmcoYXJnKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFyZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFyZ3VtZW50KGxvbmcgYXJnKSB7Ci0JCWFyZ3MuYWRkKExvbmcudG9TdHJpbmcoYXJnKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBcmd1bWVudHMoU3RyaW5nW10gYXJncykgewotCQlmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7Ci0JCQlhZGRBcmd1bWVudChhcmcpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvQWJzdHJhY3RQcm94eUNvbW1hbmRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvQWJzdHJhY3RQcm94eUNvbW1hbmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGFkYWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0Fic3RyYWN0UHJveHlDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3h5Q29tbWFuZEZhY3RvcnkgaW1wbGVtZW50cyBJUHJveHlDb21tYW5kRmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5Q29tbWFuZEZhY3RvcnkjdG9Db21tYW5kKG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQpCi0JICovCi0JcHVibGljIGFic3RyYWN0IElQcm94eUNvbW1hbmQgdG9Db21tYW5kKFByb3h5UGFja2V0IHBhY2tldCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5Q29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0lQcm94eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxMGRhNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUNvbW1hbmQgewotCS8qCi0JICogQmFzZSBjb21tYW5kIGlkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVSVQgPSAwOwotCi0JLyoqCi0JICogTWFyayBjb21tYW5kIGFzIGNvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlZCgpOwotCQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0cmFuc2FjdGlvbiBpZCB1c2VkIGJ5IHRoaXMgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29tbWFuZElEKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZW5jb2RlZCBtZXNzYWdlIGJ1ZmZlciB0byBiZSBzZW50IHRvIHRoZSBwcm94eQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0cmFuc2FjdGlvbiBpZCB1c2VkIGJ5IHRoaXMgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25JRCgpOwotCQotCS8qKgotCSAqIEFkZCBhbiBhcmd1bWVudCB0byB0aGUgY29tbWFuZAotCSAqIAotCSAqIEBwYXJhbSBhcmcgYXJndW1lbnQgdG8gYWRkIHRvIHRoZSBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0lQcm94eUNvbW1hbmRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5Q29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NjliNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5Q29tbWFuZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnBhY2tldC5Qcm94eVBhY2tldDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlDb21tYW5kRmFjdG9yeSB7Ci0JcHVibGljIElQcm94eUNvbW1hbmQgdG9Db21tYW5kKFByb3h5UGFja2V0IHBhY2tldCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5Q29tbWFuZExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5Q29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTQ5M2QuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0lQcm94eUNvbW1hbmRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5Q29tbWFuZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIEhhbmRsZXIgZm9yIHF1aXQgY29tbWFuZHMKLQkgKiAKLQkgKiBAcGFyYW0gYyBjb21tYW5kIHRvIGhhbmRsZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbW1hbmQoSVByb3h5UXVpdENvbW1hbmQgYyk7Ci0KLQkvKioKLQkgKiBIYW5kbGVyIGZvciBleHRlbmRlZCBjb21tYW5kcwotCSAqIAotCSAqIEBwYXJhbSBjIGNvbW1hbmQgdG8gaGFuZGxlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlQ29tbWFuZChJUHJveHlFeHRlbmRlZENvbW1hbmQgYyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5RXh0ZW5kZWRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvSVByb3h5RXh0ZW5kZWRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDYwMTAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0lQcm94eUV4dGVuZGVkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUV4dGVuZGVkQ29tbWFuZCBleHRlbmRzIElQcm94eUNvbW1hbmQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvY29tbWFuZC9JUHJveHlRdWl0Q29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0lQcm94eVF1aXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDkzMzYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL0lQcm94eVF1aXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UXVpdENvbW1hbmQgZXh0ZW5kcyBJUHJveHlDb21tYW5kIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvUHJveHlDb21tYW5kRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9jb21tYW5kL1Byb3h5Q29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViZmI1OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2NvbW1hbmQvUHJveHlDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuY29tbWFuZC5Qcm94eVF1aXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eUNvbW1hbmRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQcm94eUNvbW1hbmRGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5BYnN0cmFjdFByb3h5Q29tbWFuZEZhY3RvcnkjdG9Db21tYW5kKG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQpCi0JICovCi0JcHVibGljIElQcm94eUNvbW1hbmQgdG9Db21tYW5kKFByb3h5UGFja2V0IHBhY2tldCkgewotCQlJUHJveHlDb21tYW5kIGV2dCA9IG51bGw7Ci0KLQkJc3dpdGNoIChwYWNrZXQuZ2V0SUQoKSkgewotCQljYXNlIElQcm94eUNvbW1hbmQuUVVJVDoKLQkJCWV2dCA9IG5ldyBQcm94eVF1aXRDb21tYW5kKHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGV2dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9BYnN0cmFjdFByb3h5RGVidWdDbGllbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L0Fic3RyYWN0UHJveHlEZWJ1Z0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA2ZWNjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L0Fic3RyYWN0UHJveHlEZWJ1Z0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmRlYnVnLmV2ZW50LlByb3h5RGVidWdFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNsaWVudC5BYnN0cmFjdFByb3h5Q2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0FyZ3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0RhdGFFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdEYXRhRXhwVmFsdWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V4aXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0luaXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnT0tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU2lnbmFsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1NpZ25hbHNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTdGFja0luZm9EZXB0aEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTdGVwRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU3VzcGVuZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1R5cGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdWYXJzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUNvbm5lY3RlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlEaXNjb25uZWN0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXh0ZW5kZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5TWVzc2FnZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlPS0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlUaW1lb3V0RXZlbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3h5RGVidWdDbGllbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5Q2xpZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdDbGllbnQsSVByb3h5RXZlbnRMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBMaXN0PElQcm94eURlYnVnRXZlbnRMaXN0ZW5lcj4JbGlzdGVuZXJzID0gCi0JCUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXI+KCkpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4JCQkJCXdhaXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbgkJCQkJdGltZW91dCA9IGZhbHNlOwotCXByb3RlY3RlZCBmaW5hbCBSZWVudHJhbnRMb2NrCQl3YWl0TG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbmRpdGlvbgkJCXdhaXRDb25kaXRpb24gPSB3YWl0TG9jay5uZXdDb25kaXRpb24oKTsKLQlwcm90ZWN0ZWQgdm9sYXRpbGUgRGVidWdQcm94eVN0YXRlCXN0YXRlOwotCXByb3RlY3RlZCBJUHJveHlEZWJ1Z0V2ZW50RmFjdG9yeQlmYWN0b3J5OwotCQotCXByb3RlY3RlZCBlbnVtIERlYnVnUHJveHlTdGF0ZSB7Ci0JCURJU0NPTk5FQ1RFRCwKLQkJRElTQ09OTkVDVElORywKLQkJQ09OTkVDVEVELAotCQlDT05ORUNUSU5HCi0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFByb3h5RGVidWdDbGllbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmFjdG9yeSA9IG5ldyBQcm94eURlYnVnRXZlbnRGYWN0b3J5KCk7Ci0JCXN1cGVyLnNldEV2ZW50RmFjdG9yeShmYWN0b3J5KTsKLQkJc3VwZXIuYWRkUHJveHlFdmVudExpc3RlbmVyKHRoaXMpOwotCQlzdGF0ZSA9IERlYnVnUHJveHlTdGF0ZS5ESVNDT05ORUNURUQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZpbmFsaXplKCkgewotCQlzdXBlci5yZW1vdmVQcm94eUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGRlYnVnZ2VyIGNvbm5lY3Rpb24uCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRvSW5pdGlhbGl6ZShpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc2Vzc2lvbkNyZWF0ZShwb3J0LCAwKTsKLQkJc3RhdGUgPSBEZWJ1Z1Byb3h5U3RhdGUuQ09OTkVDVElORzsKLQl9Ci0JCi0KLQkvKioKLQkgKiBTaHV0ZG93biB0aGUgZGVidWdnZXIgY29ubmVjdGlvbi4gVGhpcyBjYW4gYmUgY2FsbGVkIGlmIHdlIGFyZSBlaXRoZXIgaW4gdGhlIENPTk5FQ1RFRAotCSAqIHN0YXRlLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgcmVjZWl2ZSBhIGRpc2Nvbm5lY3RlZCBldmVudCwgb3IgaW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUsIAotCSAqIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGV2ZW50LgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd2FpdExvY2subG9jaygpOwotCQl0cnkgewotCQkJaWYgKHN0YXRlID09IERlYnVnUHJveHlTdGF0ZS5DT05ORUNUSU5HIHx8IHN0YXRlID09IERlYnVnUHJveHlTdGF0ZS5DT05ORUNURUQpIHsKLQkJCQlzdGF0ZSA9IERlYnVnUHJveHlTdGF0ZS5ESVNDT05ORUNUSU5HOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2FsbGluZyBzZXNzaW9uIGZpbmlzaCIpOwotCQkJCXNlc3Npb25GaW5pc2goKTsKLQkJCQl3aGlsZSAoc3RhdGUgPT0gRGVidWdQcm94eVN0YXRlLkRJU0NPTk5FQ1RJTkcpIHsKLQkJCQkJd2FpdGluZyA9IHRydWU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3YWl0Q29uZGl0aW9uLmF3YWl0KDMwMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl3YWl0TG9jay51bmxvY2soKTsKLQkJCXN0YXRlID0gRGVidWdQcm94eVN0YXRlLkRJU0NPTk5FQ1RFRDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuSVByb3h5RGVidWdDbGllbnQjYWRkUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LklQcm94eURlYnVnQ2xpZW50I3JlbW92ZVByb3h5RGVidWdFdmVudExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuZXZlbnQuSVByb3h5RGVidWdFdmVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3h5RGVidWdFdmVudExpc3RlbmVyKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnByb3h5LmV2ZW50LklQcm94eUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUucHJveHkuZXZlbnQuSVByb3h5Q29ubmVjdGVkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5Q29ubmVjdGVkRXZlbnQgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlYnVnOiByZWNlaXZlZCBjb25uZWN0ZWQgZXZlbnQiKTsKLQkJd2FpdExvY2subG9jaygpOwotCQl0cnkgewotCQkJc3RhdGUgPSBEZWJ1Z1Byb3h5U3RhdGUuQ09OTkVDVEVEOwotCQkJaWYgKHdhaXRpbmcpIHsKLQkJCQl3YWl0Q29uZGl0aW9uLnNpZ25hbCgpOwotCQkJCXdhaXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXdhaXRMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5wcm94eS5ldmVudC5JUHJveHlEaXNjb25uZWN0ZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlEaXNjb25uZWN0ZWRFdmVudCBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZGVidWc6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBldmVudCIpOwotCQl3YWl0TG9jay5sb2NrKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoc3RhdGUgPT0gRGVidWdQcm94eVN0YXRlLkRJU0NPTk5FQ1RJTkcpIHsKLQkJCQlzdGF0ZSA9IERlYnVnUHJveHlTdGF0ZS5ESVNDT05ORUNURUQ7Ci0JCQkJaWYgKHdhaXRpbmcpIHsKLQkJCQkJd2FpdENvbmRpdGlvbi5zaWduYWwoKTsKLQkJCQkJd2FpdGluZyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXdhaXRMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnByb3h5LmV2ZW50LklQcm94eUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUucHJveHkuZXZlbnQuSVByb3h5RXJyb3JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlFcnJvckV2ZW50IGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWJ1ZzogcmVjZWl2ZWQgZXJyb3IgZXZlbnQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5TWVzc2FnZUV2ZW50IGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWJ1ZzogcmVjZWl2ZWQgbWVzc2FnZSBldmVudCIpOwotCQl3YWl0TG9jay5sb2NrKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoc3RhdGUgPT0gRGVidWdQcm94eVN0YXRlLkRJU0NPTk5FQ1RJTkcpIHsKLQkJCQlzdGF0ZSA9IERlYnVnUHJveHlTdGF0ZS5ESVNDT05ORUNURUQ7Ci0JCQkJaWYgKHdhaXRpbmcpIHsKLQkJCQkJd2FpdENvbmRpdGlvbi5zaWduYWwoKTsKLQkJCQkJd2FpdGluZyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXdhaXRMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5wcm94eS5ldmVudC5JUHJveHlPS0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eU9LRXZlbnQgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlYnVnOiByZWNlaXZlZCBvayBldmVudCIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnByb3h5LmV2ZW50LklQcm94eUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUucHJveHkuZXZlbnQuSVByb3h5VGltZW91dEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVRpbWVvdXRFdmVudCBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZGVidWc6IHJlY2VpdmVkIHRpbWVvdXQgZXZlbnQiKTsKLQkJd2FpdExvY2subG9jaygpOwotCQl0cnkgewotCQkJdGltZW91dCA9IHRydWU7Ci0JCQlpZiAod2FpdGluZykgewotCQkJCXdhaXRDb25kaXRpb24uc2lnbmFsKCk7Ci0JCQkJd2FpdGluZyA9IGZhbHNlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5RXh0ZW5kZWRFdmVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdBcmdzRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnQXJnc0V2ZW50KChJUHJveHlEZWJ1Z0FyZ3NFdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnQnJlYWtwb2ludEhpdEV2ZW50KSB7Ci0JCQlmaXJlUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudCgoSVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQoKElQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdEYXRhRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnRGF0YUV2ZW50KChJUHJveHlEZWJ1Z0RhdGFFdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQoKElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z0V4aXRFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdFeGl0RXZlbnQoKElQcm94eURlYnVnRXhpdEV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdFcnJvckV2ZW50KSB7Ci0JCQlmaXJlUHJveHlEZWJ1Z0Vycm9yRXZlbnQoKElQcm94eURlYnVnRXJyb3JFdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnSW5mb1RocmVhZHNFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50KChJUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z0luaXRFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdJbml0RXZlbnQoKElQcm94eURlYnVnSW5pdEV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnTWVtb3J5SW5mb0V2ZW50KChJUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnT0tFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdPS0V2ZW50KChJUHJveHlEZWJ1Z09LRXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQoKElQcm94eURlYnVnUGFydGlhbEFJRkV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCgoSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnU2lnbmFsRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnU2lnbmFsRXZlbnQoKElQcm94eURlYnVnU2lnbmFsRXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQoKElQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdTaWduYWxzRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnU2lnbmFsc0V2ZW50KChJUHJveHlEZWJ1Z1NpZ25hbHNFdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50KSB7Ci0JCQlmaXJlUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudCgoSVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudCgoSVByb3h5RGVidWdTdGFja0luZm9EZXB0aEV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdTdGVwRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnU3RlcEV2ZW50KChJUHJveHlEZWJ1Z1N0ZXBFdmVudCkgZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElQcm94eURlYnVnU3VzcGVuZEV2ZW50KSB7Ci0JCQlmaXJlUHJveHlEZWJ1Z1N1c3BlbmRFdmVudCgoSVByb3h5RGVidWdTdXNwZW5kRXZlbnQpIGUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1R5cGVFdmVudCkgewotCQkJZmlyZVByb3h5RGVidWdUeXBlRXZlbnQoKElQcm94eURlYnVnVHlwZUV2ZW50KSBlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdWYXJzRXZlbnQpIHsKLQkJCWZpcmVQcm94eURlYnVnVmFyc0V2ZW50KChJUHJveHlEZWJ1Z1ZhcnNFdmVudCkgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0FyZ3NFdmVudChJUHJveHlEZWJ1Z0FyZ3NFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdBcmdzRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudChJUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudChJUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0RhdGFFdmVudChJUHJveHlEZWJ1Z0RhdGFFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdEYXRhRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0RhdGFFeHBWYWx1ZUV2ZW50KElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0V4aXRFdmVudChJUHJveHlEZWJ1Z0V4aXRFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdFeGl0RXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0Vycm9yRXZlbnQoSVByb3h5RGVidWdFcnJvckV2ZW50IGUpIHsKLQkJSVByb3h5RGVidWdFdmVudExpc3RlbmVyW10gbGEgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVByb3h5RGVidWdFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlUHJveHlEZWJ1Z0Vycm9yRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQoSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50IGUpIHsKLQkJSVByb3h5RGVidWdFdmVudExpc3RlbmVyW10gbGEgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVByb3h5RGVidWdFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z0luaXRFdmVudChJUHJveHlEZWJ1Z0luaXRFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdJbml0RXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudChJUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlEZWJ1Z09LRXZlbnQoSVByb3h5RGVidWdPS0V2ZW50IGUpIHsKLQkJSVByb3h5RGVidWdFdmVudExpc3RlbmVyW10gbGEgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVByb3h5RGVidWdFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlUHJveHlEZWJ1Z09LRXZlbnQoZSk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQoSVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnUGFydGlhbEFJRkV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudChJUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50IGUpIHsKLQkJSVByb3h5RGVidWdFdmVudExpc3RlbmVyW10gbGEgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVByb3h5RGVidWdFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTaWduYWxFdmVudChJUHJveHlEZWJ1Z1NpZ25hbEV2ZW50IGUpIHsKLQkJSVByb3h5RGVidWdFdmVudExpc3RlbmVyW10gbGEgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVByb3h5RGVidWdFdmVudExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlUHJveHlEZWJ1Z1NpZ25hbEV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQoSVByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTaWduYWxzRXZlbnQoSVByb3h5RGVidWdTaWduYWxzRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnU2lnbmFsc0V2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQoSVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTdGFja0luZm9EZXB0aEV2ZW50KElQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudCBlKSB7Ci0JCUlQcm94eURlYnVnRXZlbnRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eURlYnVnRXZlbnRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZVByb3h5RGVidWdTdGFja0luZm9EZXB0aEV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTdGVwRXZlbnQoSVByb3h5RGVidWdTdGVwRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnU3RlcEV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdTdXNwZW5kRXZlbnQoSVByb3h5RGVidWdTdXNwZW5kRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnU3VzcGVuZEV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdUeXBlRXZlbnQoSVByb3h5RGVidWdUeXBlRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnVHlwZUV2ZW50KGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5RGVidWdWYXJzRXZlbnQoSVByb3h5RGVidWdWYXJzRXZlbnQgZSkgewotCQlJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbXSBsYSA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXJbMF0pOwotCQlmb3IgKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxhKSB7Ci0JCQlsaXN0ZW5lci5oYW5kbGVQcm94eURlYnVnVmFyc0V2ZW50KGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9JUHJveHlEZWJ1Z0NsaWVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvSVByb3h5RGVidWdDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4M2NhYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9JUHJveHlEZWJ1Z0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdDbGllbnQgewotCXB1YmxpYyB2b2lkIGFkZFByb3h5RGVidWdFdmVudExpc3RlbmVyKElQcm94eURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JcHVibGljIHZvaWQgcmVtb3ZlUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIoSVByb3h5RGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdBSUYuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdBSUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzN2FjYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnQUlGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnV0aWwuUHJvdG9jb2xVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnQUlGIHsKLQlwcml2YXRlIFN0cmluZwlmZHM7Ci0JcHJpdmF0ZSBTdHJpbmcJZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBieXRlW10JZGF0YTsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0FJRihTdHJpbmcgZmRzLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGRlc2MpIHsKLQkJdGhpcy5mZHMgPSBmZHM7Ci0JCXRoaXMuZGF0YSA9IFByb3RvY29sVXRpbC5kZWNvZGVCeXRlcyhkYXRhKTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2M7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RkRTKCkgewotCQlyZXR1cm4gZmRzOwotCX0KLQkKLQlwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnQnJlYWtwb2ludC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z0JyZWFrcG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4OWQzZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnQnJlYWtwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnQnJlYWtwb2ludCB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWdub3JlOyAKLQlwcml2YXRlIFN0cmluZyBzcGVjOwotCXByaXZhdGUgU3RyaW5nIGRlbDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCXByaXZhdGUgUHJveHlEZWJ1Z0xpbmVMb2NhdGlvbiBsb2M7Ci0JCi0JcHVibGljIFByb3h5RGVidWdCcmVha3BvaW50KFN0cmluZyBpZ25vcmUsIFN0cmluZyBzcGVjLCBTdHJpbmcgZGVsLCAKLQkJCVN0cmluZyB0eXBlLCBQcm94eURlYnVnTGluZUxvY2F0aW9uIGxvYykgewotCQl0aGlzLmlnbm9yZSA9IGlnbm9yZTsKLQkJdGhpcy5zcGVjID0gc3BlYzsKLQkJdGhpcy5kZWwgPSBkZWw7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMubG9jID0gbG9jOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWdub3JlKCkgewotCQlyZXR1cm4gaWdub3JlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWMoKSB7Ci0JCXJldHVybiBzcGVjOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlbCgpIHsKLQkJcmV0dXJuIGRlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdMaW5lTG9jYXRpb24gZ2V0TG9jYXRpb24oKXsKLQkJcmV0dXJuIGxvYzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldElnbm9yZSgpICsgIiAiICsgZ2V0U3BlYygpICsgIiAiICsgCi0JCQlnZXREZWwoKSArICIgIiArIGdldFR5cGUoKSArICIgIiArIGdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z0xpbmVMb2NhdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z0xpbmVMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2MDk2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdMaW5lTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTGluZUxvY2F0aW9uIHsKLQlwcml2YXRlIFN0cmluZwlmaWxlOwotCXByaXZhdGUgaW50CQlsaW5lOwotCQotCXB1YmxpYyBQcm94eURlYnVnTGluZUxvY2F0aW9uKFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSkgewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLmxpbmUgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBsaW5lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBmaWxlICsgIjoiICsgIjoiICsgbGluZTsJIAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdMb2NhdG9yLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWNjNDNkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkudXRpbC5Qcm90b2NvbFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTG9jYXRvciB7Ci0JcHJpdmF0ZSBTdHJpbmcJCWZpbGU7Ci0JcHJpdmF0ZSBTdHJpbmcJCWZ1bmN0aW9uOwotCXByaXZhdGUgaW50CQkJbGluZTsKLQlwcml2YXRlIEJpZ0ludGVnZXIJYWRkcmVzczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xvY2F0b3IoU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jdGlvbiwgU3RyaW5nIGxpbmUsIFN0cmluZyBhZGRyZXNzKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMuZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQkJdGhpcy5saW5lID0gSW50ZWdlci5wYXJzZUludChsaW5lKTsKLQkJdGhpcy5hZGRyZXNzID0gUHJvdG9jb2xVdGlsLmRlY29kZUFkZHJlc3MoYWRkcmVzcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb24oKSB7Ci0JCXJldHVybiBmdW5jdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBsaW5lOwotCX0KLQotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEFkZHJlc3MoKSB7Ci0JCXJldHVybiBhZGRyZXNzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZmlsZSArICI6IiArIGZ1bmN0aW9uICsgIjoiICsgbGluZSArICI6IiArIGFkZHJlc3MudG9TdHJpbmcoKTsJIAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdNZW1vcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdNZW1vcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2YTIzZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnTWVtb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50OwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTWVtb3J5IHsKLQlwcml2YXRlIFN0cmluZyBhZGRyOwotCXByaXZhdGUgU3RyaW5nIGFzY2lpOwotCXByaXZhdGUgU3RyaW5nW10gZGF0YTsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z01lbW9yeShTdHJpbmcgYWRkciwgU3RyaW5nIGFzY2lpLCBTdHJpbmdbXSBkYXRhKSB7Ci0JCXRoaXMuYWRkciA9IGFkZHI7Ci0JCXRoaXMuYXNjaWkgPSBhc2NpaTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gYWRkcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBc2NpaSgpIHsKLQkJcmV0dXJuIGFzY2lpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RGF0YSgpIHsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z01lbW9yeUluZm8uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdNZW1vcnlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZmI1ODguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z01lbW9yeUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTWVtb3J5SW5mbyB7Ci0JcHJpdmF0ZSBTdHJpbmcgYWRkcjsKLQlwcml2YXRlIGxvbmcgbmV4dFJvdzsKLQlwcml2YXRlIGxvbmcgcHJldlJvdzsKLQlwcml2YXRlIGxvbmcgbmV4dFBhZ2U7Ci0JcHJpdmF0ZSBsb25nIHByZXZQYWdlOwotCXByaXZhdGUgbG9uZyBudW1CeXRlczsKLQlwcml2YXRlIGxvbmcgdG90YWxCeXRlczsKLQlwcml2YXRlIFByb3h5RGVidWdNZW1vcnlbXSBtZW1vcmllczsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z01lbW9yeUluZm8oU3RyaW5nIGFkZHIsIFN0cmluZyBuZXh0Um93LCBTdHJpbmcgcHJldlJvdywgCi0JCQlTdHJpbmcgbmV4dFBhZ2UsIFN0cmluZyBwcmV2UGFnZSwgU3RyaW5nIG51bUJ5dGVzLCBTdHJpbmcgdG90YWxCeXRlcywgCi0JCQlQcm94eURlYnVnTWVtb3J5W10gbWVtb3JpZXMpIHsKLQkJdGhpcy5hZGRyID0gYWRkcjsKLQkJdGhpcy5uZXh0Um93ID0gTG9uZy5wYXJzZUxvbmcobmV4dFJvdyk7Ci0JCXRoaXMucHJldlJvdyA9IExvbmcucGFyc2VMb25nKHByZXZSb3cpOwotCQl0aGlzLm5leHRQYWdlID0gTG9uZy5wYXJzZUxvbmcobmV4dFBhZ2UpOwotCQl0aGlzLnByZXZQYWdlID0gTG9uZy5wYXJzZUxvbmcocHJldlBhZ2UpOwotCQl0aGlzLm51bUJ5dGVzID0gTG9uZy5wYXJzZUxvbmcobnVtQnl0ZXMpOwotCQl0aGlzLnRvdGFsQnl0ZXMgPSBMb25nLnBhcnNlTG9uZyh0b3RhbEJ5dGVzKTsKLQkJdGhpcy5tZW1vcmllcyA9IG1lbW9yaWVzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB7Ci0JCXJldHVybiBhZGRyOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXROZXh0Um93KCkgewotCQlyZXR1cm4gbmV4dFJvdzsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0UHJldlJvdygpIHsKLQkJcmV0dXJuIHByZXZSb3c7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldFByZXZQYWdlKCkgewotCQlyZXR1cm4gcHJldlBhZ2U7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldE51bUJ5dGVzKCkgewotCQlyZXR1cm4gbnVtQnl0ZXM7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldFRvdGFsQnl0ZXMoKSB7Ci0JCXJldHVybiB0b3RhbEJ5dGVzOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z01lbW9yeVtdIGdldE1lbW9yaWVzKCkgewotCQlyZXR1cm4gbWVtb3JpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z1NpZ25hbC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z1NpZ25hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTlkNzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY2xpZW50L1Byb3h5RGVidWdTaWduYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFByb3h5RGVidWdTaWduYWwgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIHN0b3A7Ci0JcHJpdmF0ZSBib29sZWFuIHBhc3M7Ci0JcHJpdmF0ZSBib29sZWFuIHByaW50OwotCXByaXZhdGUgU3RyaW5nIGRlc2M7Ci0JCi0JcHVibGljIFByb3h5RGVidWdTaWduYWwoU3RyaW5nIG5hbWUsIGJvb2xlYW4gc3RvcCwgYm9vbGVhbiBwcmludCwgCi0JCQlib29sZWFuIHBhc3MsIFN0cmluZyBkZXNjKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuc3RvcCA9IHN0b3A7Ci0JCXRoaXMucHJpbnQgPSBwcmludDsKLQkJdGhpcy5wYXNzID0gcGFzczsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW50KCkgewotCQlyZXR1cm4gcHJpbnQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzUGFzcygpIHsKLQkJcmV0dXJuIHBhc3M7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKXsKLQkJcmV0dXJuIGRlc2M7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkgKyAiICIgKyBpc1N0b3AoKSArICIgIiArIAotCQkJaXNQcmludCgpICsgIiAiICsgaXNQYXNzKCkgKyAiICIgKyBnZXREZXNjcmlwdGlvbigpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnU3RhY2tGcmFtZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jbGllbnQvUHJveHlEZWJ1Z1N0YWNrRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmYTlkMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NsaWVudC9Qcm94eURlYnVnU3RhY2tGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1N0YWNrRnJhbWUgewotCXByaXZhdGUgaW50CQkJCQlsZXZlbDsKLQlwcml2YXRlIFByb3h5RGVidWdMb2NhdG9yCWxvYzsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1N0YWNrRnJhbWUoaW50IGxldmVsLCBQcm94eURlYnVnTG9jYXRvciBsb2MpIHsKLQkJdGhpcy5sZXZlbCA9IGxldmVsOwotCQl0aGlzLmxvYyA9IGxvYzsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGV2ZWw7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnTG9jYXRvciBnZXRMb2NhdG9yKCkgewotCQlyZXR1cm4gbG9jOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TGV2ZWwoKSArICIgIiArIGxvYy50b1N0cmluZygpOwkgCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL0Fic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9BYnN0cmFjdFByb3h5RGVidWdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2U1ZDcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL0Fic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5BYnN0cmFjdFByb3h5Q29tbWFuZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5Q29tbWFuZCB7Ci0JCi0JcHVibGljIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQoaW50IGV2ZW50SUQpIHsKLQkJc3VwZXIoZXZlbnRJRCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQoaW50IGV2ZW50SUQsIFN0cmluZyBiaXRzKSB7Ci0JCXN1cGVyKGV2ZW50SUQpOwotCQlhZGRBcmd1bWVudChiaXRzKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZChpbnQgZXZlbnRJRCwgaW50IHRyYW5zYWN0aW9uSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoZXZlbnRJRCwgdHJhbnNhY3Rpb25JRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL0lQcm94eURlYnVnQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL0lQcm94eURlYnVnQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE4YzZhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9JUHJveHlEZWJ1Z0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdDb21tYW5kIGV4dGVuZHMgSVByb3h5Q29tbWFuZCB7Ci0KLQkvKgotCSAqIENvbW1hbmQgSURzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRTRVNTSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVRMSU5FQlJFQUtQT0lOVCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VURlVOQ0JSRUFLUE9JTlQgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURUJSRUFLUE9JTlQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRUJSRUFLUE9JTlQgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVCUkVBS1BPSU5UID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05CUkVBS1BPSU5UID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUkVBS1BPSU5UQUZURVIgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVFdBVENIUE9JTlQgPSA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdPID0gMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUCA9IDExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFUk1JTkFURSA9IDEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSUlVQVCA9IDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RTVEFDS0ZSQU1FUyA9IDE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVENVUlJFTlRTVEFDS0ZSQU1FID0gMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZBTFVBVEVFWFBSRVNTSU9OID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUVFlQRSA9IDE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RMT0NBTFZBUklBQkxFUyA9IDE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RBUkdVTUVOVFMgPSAxOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUR0xPQkFMVkFSSUFCTEVTID0gMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVElORk9USFJFQURTID0gMjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUVEhSRUFEU0VMRUNUID0gMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBQ0tJTkZPREVQVEggPSAyMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBUkVBRE1FTU9SWSA9IDI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFXUklURU1FTU9SWSA9IDI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RTSUdOQUxTID0gMjY7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdOQUxJTkZPID0gMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJSEFORExFID0gMjg7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBRVZBTFVBVEVFWFBSRVNTSU9OID0gMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUUEFSVElBTEFJRiA9IDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFREVMRVRFID0gMzE7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdCcmVha3BvaW50QWZ0ZXJDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0JyZWFrcG9pbnRBZnRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwZDQ5MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0JyZWFrcG9pbnRBZnRlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdCcmVha3BvaW50QWZ0ZXJDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdCcmVha3BvaW50QWZ0ZXJDb21tYW5kKFN0cmluZyBiaXRzLCAKLQkJCWludCBicGlkLCBpbnQgaWNvdW50KSB7Ci0JCXN1cGVyKEJSRUFLUE9JTlRBRlRFUiwgYml0cyk7Ci0JCWFkZEFyZ3VtZW50KGJwaWQpOwotCQlhZGRBcmd1bWVudChpY291bnQpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0JyZWFrcG9pbnRBZnRlckNvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoQlJFQUtQT0lOVEFGVEVSLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0NMSUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnQ0xJQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU4MGM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnQ0xJQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0NMSUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0NMSUNvbW1hbmQoU3RyaW5nIGJpdHMsIFN0cmluZyBhcmcpIHsKLQkJc3VwZXIoQ0xJSEFORExFLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoYXJnKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdDTElDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKENMSUhBTkRMRSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdDb25kaXRpb25CcmVha3BvaW50Q29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdDb25kaXRpb25CcmVha3BvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JjZmI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnQ29uZGl0aW9uQnJlYWtwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdDb25kaXRpb25CcmVha3BvaW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnQ29uZGl0aW9uQnJlYWtwb2ludENvbW1hbmQoU3RyaW5nIGJpdHMsIAotCQkJaW50IGJwaWQsIFN0cmluZyBleHByKSB7Ci0JCXN1cGVyKENPTkRJVElPTkJSRUFLUE9JTlQsIGJpdHMpOwotCQlhZGRBcmd1bWVudChicGlkKTsKLQkJYWRkQXJndW1lbnQoZXhwcik7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnQ29uZGl0aW9uQnJlYWtwb2ludENvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoQ09ORElUSU9OQlJFQUtQT0lOVCwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdEYXRhUmVhZE1lbW9yeUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnRGF0YVJlYWRNZW1vcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDM4ZDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdEYXRhUmVhZE1lbW9yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdEYXRhUmVhZE1lbW9yeUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0RhdGFSZWFkTWVtb3J5Q29tbWFuZChTdHJpbmcgYml0cywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCAKLQkJCVN0cmluZyBmb3JtYXQsIGludCB3b3JkU2l6ZSwgaW50IHJvd3MsIGludCBjb2xzLCBDaGFyYWN0ZXIgYXNDaGFyKSB7Ci0JCXN1cGVyKERBVEFSRUFETUVNT1JZLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQob2Zmc2V0KTsKLQkJYWRkQXJndW1lbnQoYWRkcmVzcyk7Ci0JCWFkZEFyZ3VtZW50KGZvcm1hdCk7Ci0JCWFkZEFyZ3VtZW50KHdvcmRTaXplKTsKLQkJYWRkQXJndW1lbnQocm93cyk7Ci0JCWFkZEFyZ3VtZW50KGNvbHMpOwotCQlhZGRBcmd1bWVudChhc0NoYXIpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0RhdGFSZWFkTWVtb3J5Q29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihEQVRBUkVBRE1FTU9SWSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdEYXRhV3JpdGVNZW1vcnlDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0RhdGFXcml0ZU1lbW9yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1MmM0Yi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0RhdGFXcml0ZU1lbW9yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdEYXRhV3JpdGVNZW1vcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdEYXRhV3JpdGVNZW1vcnlDb21tYW5kKFN0cmluZyBiaXRzLCAKLQkJCWxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgU3RyaW5nIGZvcm1hdCwgaW50IHdvcmRTaXplLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3VwZXIoREFUQVdSSVRFTUVNT1JZLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQob2Zmc2V0KTsKLQkJYWRkQXJndW1lbnQoYWRkcmVzcyk7Ci0JCWFkZEFyZ3VtZW50KGZvcm1hdCk7Ci0JCWFkZEFyZ3VtZW50KHdvcmRTaXplKTsKLQkJYWRkQXJndW1lbnQodmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0RhdGFXcml0ZU1lbW9yeUNvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoREFUQVdSSVRFTUVNT1JZLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0RlbGV0ZUJyZWFrcG9pbnRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0RlbGV0ZUJyZWFrcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDg3YWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdEZWxldGVCcmVha3BvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0RlbGV0ZUJyZWFrcG9pbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdEZWxldGVCcmVha3BvaW50Q29tbWFuZChTdHJpbmcgYml0cywgaW50IGJwaWQpIHsKLQkJc3VwZXIoREVMRVRFQlJFQUtQT0lOVCwgYml0cyk7Ci0JCWFkZEFyZ3VtZW50KGJwaWQpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0RlbGV0ZUJyZWFrcG9pbnRDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKERFTEVURUJSRUFLUE9JTlQsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnRGlzYWJsZUJyZWFrcG9pbnRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0Rpc2FibGVCcmVha3BvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZjNzk2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnRGlzYWJsZUJyZWFrcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnRGlzYWJsZUJyZWFrcG9pbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdEaXNhYmxlQnJlYWtwb2ludENvbW1hbmQoU3RyaW5nIGJpdHMsIGludCBicGlkKSB7Ci0JCXN1cGVyKERJU0FCTEVCUkVBS1BPSU5ULCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoYnBpZCk7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnRGlzYWJsZUJyZWFrcG9pbnRDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKERJU0FCTEVCUkVBS1BPSU5ULCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0VuYWJsZUJyZWFrcG9pbnRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0VuYWJsZUJyZWFrcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZTcxOTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdFbmFibGVCcmVha3BvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0VuYWJsZUJyZWFrcG9pbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdFbmFibGVCcmVha3BvaW50Q29tbWFuZChTdHJpbmcgYml0cywgaW50IGJwaWQpIHsKLQkJc3VwZXIoRU5BQkxFQlJFQUtQT0lOVCwgYml0cyk7Ci0JCWFkZEFyZ3VtZW50KGJwaWQpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0VuYWJsZUJyZWFrcG9pbnRDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKEVOQUJMRUJSRUFLUE9JTlQsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnRXZhbHVhdGVFeHByZXNzaW9uQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdFdmFsdWF0ZUV4cHJlc3Npb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTFkOTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdFdmFsdWF0ZUV4cHJlc3Npb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnRXZhbHVhdGVFeHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnRXZhbHVhdGVFeHByZXNzaW9uQ29tbWFuZChTdHJpbmcgYml0cywgU3RyaW5nIGV4cHIpIHsKLQkJc3VwZXIoRVZBTFVBVEVFWFBSRVNTSU9OLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoZXhwcik7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnRXZhbHVhdGVFeHByZXNzaW9uQ29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihFVkFMVUFURUVYUFJFU1NJT04sIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnR2V0UGFydGlhbEFJRkNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnR2V0UGFydGlhbEFJRkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkZGFjZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0dldFBhcnRpYWxBSUZDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnR2V0UGFydGlhbEFJRkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0dldFBhcnRpYWxBSUZDb21tYW5kKFN0cmluZyBiaXRzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGtleSwgYm9vbGVhbiBsaXN0Q2hpbGRyZW4sIGJvb2xlYW4gZXhwcmVzcykgewotCQlzdXBlcihHRVRQQVJUSUFMQUlGLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQobmFtZSk7Ci0JCWFkZEFyZ3VtZW50KGtleSk7Ci0JCWFkZEFyZ3VtZW50KGxpc3RDaGlsZHJlbik7Ci0JCWFkZEFyZ3VtZW50KGV4cHJlc3MpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0dldFBhcnRpYWxBSUZDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKEdFVFBBUlRJQUxBSUYsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnR2V0VHlwZUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnR2V0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyNTI3OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0dldFR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnR2V0VHlwZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0dldFR5cGVDb21tYW5kKFN0cmluZyBiaXRzLCBTdHJpbmcgZXhwcikgewotCQlzdXBlcihHRVRUWVBFLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoZXhwcik7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnR2V0VHlwZUNvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoR0VUVFlQRSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdHb0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnR29Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWM3MzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdHb0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdHb0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0dvQ29tbWFuZChTdHJpbmcgYml0cykgewotCQlzdXBlcihHTywgYml0cyk7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnR29Db21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKEdPLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0ludGVycnVwdENvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnSW50ZXJydXB0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDY3ZTY0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnSW50ZXJydXB0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0ludGVycnVwdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0ludGVycnVwdENvbW1hbmQoU3RyaW5nIGJpdHMpIHsKLQkJc3VwZXIoSU5URVJSVVBULCBiaXRzKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdJbnRlcnJ1cHRDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKElOVEVSUlVQVCwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0QXJndW1lbnRzQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0QXJndW1lbnRzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQwY2E4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdEFyZ3VtZW50c0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdMaXN0QXJndW1lbnRzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnTGlzdEFyZ3VtZW50c0NvbW1hbmQoU3RyaW5nIGJpdHMsIAotCQkJaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJc3VwZXIoTElTVEFSR1VNRU5UUywgYml0cyk7Ci0JCWFkZEFyZ3VtZW50KGxvdyk7Ci0JCWFkZEFyZ3VtZW50KGhpZ2gpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xpc3RBcmd1bWVudHNDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKExJU1RBUkdVTUVOVFMsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdEdsb2JhbFZhcmlhYmxlc0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdEdsb2JhbFZhcmlhYmxlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0MjkxMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0xpc3RHbG9iYWxWYXJpYWJsZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTGlzdEdsb2JhbFZhcmlhYmxlc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xpc3RHbG9iYWxWYXJpYWJsZXNDb21tYW5kKFN0cmluZyBiaXRzKSB7Ci0JCXN1cGVyKExJU1RHTE9CQUxWQVJJQUJMRVMsIGJpdHMpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xpc3RHbG9iYWxWYXJpYWJsZXNDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKExJU1RHTE9CQUxWQVJJQUJMRVMsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdEluZm9UaHJlYWRzQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0SW5mb1RocmVhZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODIzYWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0SW5mb1RocmVhZHNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTGlzdEluZm9UaHJlYWRzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnTGlzdEluZm9UaHJlYWRzQ29tbWFuZChTdHJpbmcgYml0cykgewotCQlzdXBlcihMSVNUSU5GT1RIUkVBRFMsIGJpdHMpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xpc3RJbmZvVGhyZWFkc0NvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoTElTVElORk9USFJFQURTLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z0xpc3RMb2NhbFZhcmlhYmxlc0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdExvY2FsVmFyaWFibGVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ4MWFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdExvY2FsVmFyaWFibGVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0xpc3RMb2NhbFZhcmlhYmxlc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xpc3RMb2NhbFZhcmlhYmxlc0NvbW1hbmQoU3RyaW5nIGJpdHMpIHsKLQkJc3VwZXIoTElTVExPQ0FMVkFSSUFCTEVTLCBiaXRzKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdMaXN0TG9jYWxWYXJpYWJsZXNDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKExJU1RMT0NBTFZBUklBQkxFUywgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0U2lnbmFsc0NvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdFNpZ25hbHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmY3YjcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0U2lnbmFsc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdMaXN0U2lnbmFsc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z0xpc3RTaWduYWxzQ29tbWFuZChTdHJpbmcgYml0cywgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoTElTVFNJR05BTFMsIGJpdHMpOwotCQlhZGRBcmd1bWVudChuYW1lKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdMaXN0U2lnbmFsc0NvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoTElTVFNJR05BTFMsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnTGlzdFN0YWNrZnJhbWVzQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0U3RhY2tmcmFtZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MDcxZmQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdMaXN0U3RhY2tmcmFtZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnTGlzdFN0YWNrZnJhbWVzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnTGlzdFN0YWNrZnJhbWVzQ29tbWFuZChTdHJpbmcgYml0cywgCi0JCQlpbnQgbG93LCBpbnQgaGlnaCkgewotCQlzdXBlcihMSVNUU1RBQ0tGUkFNRVMsIGJpdHMpOwotCQlhZGRBcmd1bWVudChsb3cpOwotCQlhZGRBcmd1bWVudChoaWdoKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdMaXN0U3RhY2tmcmFtZXNDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKExJU1RTVEFDS0ZSQU1FUywgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRDdXJyZW50U3RhY2tmcmFtZUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnU2V0Q3VycmVudFN0YWNrZnJhbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYWE5YWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRDdXJyZW50U3RhY2tmcmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTZXRDdXJyZW50U3RhY2tmcmFtZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1NldEN1cnJlbnRTdGFja2ZyYW1lQ29tbWFuZChTdHJpbmcgYml0cywgaW50IGxldmVsKSB7Ci0JCXN1cGVyKFNFVENVUlJFTlRTVEFDS0ZSQU1FLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQobGV2ZWwpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1NldEN1cnJlbnRTdGFja2ZyYW1lQ29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihTRVRDVVJSRU5UU1RBQ0tGUkFNRSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRGdW5jdGlvbkJyZWFrcG9pbnRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NldEZ1bmN0aW9uQnJlYWtwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmZTA1ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NldEZ1bmN0aW9uQnJlYWtwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTZXRGdW5jdGlvbkJyZWFrcG9pbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdTZXRGdW5jdGlvbkJyZWFrcG9pbnRDb21tYW5kKFN0cmluZyBiaXRzLCAKLQkJCWludCBicGlkLCBib29sZWFuIGlzVGVtcG9yYXJ5LCBib29sZWFuIGlzSGFyZHdhcmUsIFN0cmluZyBmaWxlLCBTdHJpbmcgZnVuYywgCi0JCQlTdHJpbmcgZXhwcmVzc2lvbiwgaW50IGlnbm9yZUNvdW50LCBpbnQgdGlkKSB7Ci0JCXN1cGVyKFNFVEZVTkNCUkVBS1BPSU5ULCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoYnBpZCk7Ci0JCWFkZEFyZ3VtZW50KGlzVGVtcG9yYXJ5KTsKLQkJYWRkQXJndW1lbnQoaXNIYXJkd2FyZSk7Ci0JCWFkZEFyZ3VtZW50KGZpbGUpOwotCQlhZGRBcmd1bWVudChmdW5jKTsKLQkJYWRkQXJndW1lbnQoZXhwcmVzc2lvbik7Ci0JCWFkZEFyZ3VtZW50KGlnbm9yZUNvdW50KTsKLQkJYWRkQXJndW1lbnQodGlkKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTZXRGdW5jdGlvbkJyZWFrcG9pbnRDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFNFVEZVTkNCUkVBS1BPSU5ULCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NldExpbmVCcmVha3BvaW50Q29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRMaW5lQnJlYWtwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExMTBiMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NldExpbmVCcmVha3BvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1NldExpbmVCcmVha3BvaW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnU2V0TGluZUJyZWFrcG9pbnRDb21tYW5kKFN0cmluZyBiaXRzLCAKLQkJCWludCBicGlkLCBib29sZWFuIGlzVGVtcG9yYXJ5LCBib29sZWFuIGlzSGFyZHdhcmUsIFN0cmluZyBmaWxlLCBpbnQgbGluZSwgCi0JCQlTdHJpbmcgZXhwcmVzc2lvbiwgaW50IGlnbm9yZUNvdW50LCBpbnQgdGlkKSB7Ci0JCXN1cGVyKFNFVExJTkVCUkVBS1BPSU5ULCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoYnBpZCk7Ci0JCWFkZEFyZ3VtZW50KGlzVGVtcG9yYXJ5KTsKLQkJYWRkQXJndW1lbnQoaXNIYXJkd2FyZSk7Ci0JCWFkZEFyZ3VtZW50KGZpbGUpOwotCQlhZGRBcmd1bWVudChsaW5lKTsKLQkJYWRkQXJndW1lbnQoZXhwcmVzc2lvbik7Ci0JCWFkZEFyZ3VtZW50KGlnbm9yZUNvdW50KTsKLQkJYWRkQXJndW1lbnQodGlkKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTZXRMaW5lQnJlYWtwb2ludENvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoU0VUTElORUJSRUFLUE9JTlQsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0Q29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTA5MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0Q29tbWFuZChTdHJpbmcgYml0cywgaW50IHRocmVhZCkgewotCQlzdXBlcihTRVRUSFJFQURTRUxFQ1QsIGJpdHMpOwotCQlhZGRBcmd1bWVudCh0aHJlYWQpOwotCX0KLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdENvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoU0VUVEhSRUFEU0VMRUNULCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NldFdhdGNocG9pbnRDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NldFdhdGNocG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODAyZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTZXRXYXRjaHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1NldFdhdGNocG9pbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdTZXRXYXRjaHBvaW50Q29tbWFuZChTdHJpbmcgYml0cywgCi0JCQlpbnQgYnBpZCwgU3RyaW5nIGV4cHJlc3Npb24sIGJvb2xlYW4gaXNBY2Nlc3MsIGJvb2xlYW4gaXNSZWFkLCBTdHJpbmcgY29uZGl0aW9uLCAKLQkJCWludCBpZ25vcmVDb3VudCkgewotCQlzdXBlcihTRVRXQVRDSFBPSU5ULCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoYnBpZCk7Ci0JCWFkZEFyZ3VtZW50KGV4cHJlc3Npb24pOwotCQlhZGRBcmd1bWVudChpc0FjY2Vzcyk7Ci0JCWFkZEFyZ3VtZW50KGlzUmVhZCk7Ci0JCWFkZEFyZ3VtZW50KGNvbmRpdGlvbik7Ci0JCWFkZEFyZ3VtZW50KGlnbm9yZUNvdW50KTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTZXRXYXRjaHBvaW50Q29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihTRVRXQVRDSFBPSU5ULCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NpZ25hbEluZm9Db21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1NpZ25hbEluZm9Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNGViMmUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTaWduYWxJbmZvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1NpZ25hbEluZm9Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RQcm94eURlYnVnQ29tbWFuZCBpbXBsZW1lbnRzIElQcm94eURlYnVnQ29tbWFuZCB7Ci0JCi0JcHVibGljIFByb3h5RGVidWdTaWduYWxJbmZvQ29tbWFuZChTdHJpbmcgYml0cywgU3RyaW5nIGFyZykgewotCQlzdXBlcihTSUdOQUxJTkZPLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoYXJnKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTaWduYWxJbmZvQ29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihTSUdOQUxJTkZPLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTdGFja0luZm9EZXB0aENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmOTlkOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhDb21tYW5kKFN0cmluZyBiaXRzKSB7Ci0JCXN1cGVyKFNUQUNLSU5GT0RFUFRILCBiaXRzKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTdGFja0luZm9EZXB0aENvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoU1RBQ0tJTkZPREVQVEgsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnU3RhcnRTZXNzaW9uQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTdGFydFNlc3Npb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzgyNzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTdGFydFNlc3Npb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eURlYnVnU3RhcnRTZXNzaW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnU3RhcnRTZXNzaW9uQ29tbWFuZChTdHJpbmcgcHJvZywgU3RyaW5nIHBhdGgsIAotCQkJU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihTVEFSVFNFU1NJT04pOwotCQlhZGRBcmd1bWVudChwcm9nKTsKLQkJYWRkQXJndW1lbnQocGF0aCk7Ci0JCWFkZEFyZ3VtZW50KGRpcik7Ci0JCWFkZEFyZ3VtZW50cyhhcmdzKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTdGFydFNlc3Npb25Db21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFNUQVJUU0VTU0lPTiwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTdGVwQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdTdGVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQyZGM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnU3RlcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdTdGVwQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NvbW1hbmQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0NvbW1hbmQgewotCQotCXB1YmxpYyBQcm94eURlYnVnU3RlcENvbW1hbmQoU3RyaW5nIGJpdHMsIAotCQkJaW50IGNvdW50LCBpbnQgdHlwZSkgewotCQlzdXBlcihTVEVQLCBiaXRzKTsKLQkJYWRkQXJndW1lbnQoY291bnQpOwotCQlhZGRBcmd1bWVudCh0eXBlKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdTdGVwQ29tbWFuZChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihTVEVQLCB0cmFuc0lELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2NvbW1hbmQvUHJveHlEZWJ1Z1Rlcm1pbmF0ZUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnVGVybWluYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2I3YzI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnVGVybWluYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z1Rlcm1pbmF0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1Rlcm1pbmF0ZUNvbW1hbmQoU3RyaW5nIGJpdHMpIHsKLQkJc3VwZXIoVEVSTUlOQVRFLCBiaXRzKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdUZXJtaW5hdGVDb21tYW5kKGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKFRFUk1JTkFURSwgdHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdWYXJpYWJsZURlbGV0ZUNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvY29tbWFuZC9Qcm94eURlYnVnVmFyaWFibGVEZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjcxM2UuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9jb21tYW5kL1Byb3h5RGVidWdWYXJpYWJsZURlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5RGVidWdWYXJpYWJsZURlbGV0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RGVidWdDb21tYW5kIGltcGxlbWVudHMgSVByb3h5RGVidWdDb21tYW5kIHsKLQkKLQlwdWJsaWMgUHJveHlEZWJ1Z1ZhcmlhYmxlRGVsZXRlQ29tbWFuZChTdHJpbmcgYml0cywgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoVkFSSUFCTEVERUxFVEUsIGJpdHMpOwotCQlhZGRBcmd1bWVudChuYW1lKTsKLQl9Ci0JCi0JcHVibGljIFByb3h5RGVidWdWYXJpYWJsZURlbGV0ZUNvbW1hbmQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIoVkFSSUFCTEVERUxFVEUsIHRyYW5zSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvQWJzdHJhY3RQcm94eURlYnVnRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvQWJzdHJhY3RQcm94eURlYnVnRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0NGRkZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0Fic3RyYWN0UHJveHlEZWJ1Z0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuQWJzdHJhY3RQcm94eUV2ZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm94eURlYnVnRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RXZlbnQgaW1wbGVtZW50cyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwcml2YXRlIFN0cmluZwliaXRzOwotCQotCXB1YmxpYyBBYnN0cmFjdFByb3h5RGVidWdFdmVudChpbnQgdHJhbnNJRCwgaW50IGlkLCBTdHJpbmcgYml0cykgewotCQlzdXBlcihpZCwgdHJhbnNJRCk7Ci0JCXRoaXMuYml0cyA9IGJpdHM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Qml0U2V0KCkgewotCQlyZXR1cm4gYml0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0Fic3RyYWN0UHJveHlEZWJ1Z1N1c3BlbmRFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9BYnN0cmFjdFByb3h5RGVidWdTdXNwZW5kRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlYjE3ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0Fic3RyYWN0UHJveHlEZWJ1Z1N1c3BlbmRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU3RhY2tGcmFtZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlEZWJ1Z1N1c3BlbmRFdmVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0V2ZW50IGltcGxlbWVudHMgSVByb3h5RGVidWdFdmVudCB7Ci0JcHJpdmF0ZSBpbnQJdGhyZWFkX2lkID0gMDsKLQlwcml2YXRlIFByb3h5RGVidWdTdGFja0ZyYW1lIGZyYW1lOwotCXByaXZhdGUgU3RyaW5nW10gY2hhbmdlZF92YXJzOwotCXByaXZhdGUgaW50IGRlcHRoID0gMDsKLQotCXB1YmxpYyBBYnN0cmFjdFByb3h5RGVidWdTdXNwZW5kRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZyBzZXQsIFByb3h5RGVidWdTdGFja0ZyYW1lIGZyYW1lLCBpbnQgdGlkLCBpbnQgZGVwdGgsIFN0cmluZ1tdIHZhcnMpIHsKLQkJc3VwZXIoRVZFTlRfREJHX1NVU1BFTkQsIHRyYW5zSUQsIHNldCk7Ci0JCXRoaXMuZnJhbWUgPSBmcmFtZTsKLQkJdGhpcy50aHJlYWRfaWQgPSB0aWQ7Ci0JCXRoaXMuZGVwdGggPSBkZXB0aDsKLQkJdGhpcy5jaGFuZ2VkX3ZhcnMgPSB2YXJzOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFRocmVhZElkKCkgewotCQlyZXR1cm4gdGhpcy50aHJlYWRfaWQ7Ci0JfQotCQotCXB1YmxpYyBQcm94eURlYnVnU3RhY2tGcmFtZSBnZXRGcmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnJhbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDaGFuZ2VkVmFycygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlZF92YXJzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVwdGgoKSB7Ci0JCXJldHVybiB0aGlzLmRlcHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdBcmdzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdBcmdzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5ZTA5OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnQXJnc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdBcmdzRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFyaWFibGVzKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnQnJlYWtwb2ludEhpdEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnQnJlYWtwb2ludEhpdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWIzMDYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnQnJlYWtwb2ludEhpdEV2ZW50IGV4dGVuZHMgSVByb3h5RGVidWdTdXNwZW5kRXZlbnQgewotCXB1YmxpYyBpbnQgZ2V0QnJlYWtwb2ludElkKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjBmOGUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnQnJlYWtwb2ludDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotCXB1YmxpYyBpbnQgZ2V0QnJlYWtwb2ludElkKCk7Ci0JcHVibGljIFByb3h5RGVidWdCcmVha3BvaW50IGdldEJyZWFrcG9pbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdEYXRhRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdEYXRhRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlMDk3OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnRGF0YUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdBSUY7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdEYXRhRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgUHJveHlEZWJ1Z0FJRiBnZXREYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdEYXRhRXhwVmFsdWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzM3NWY3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdEYXRhRXhwVmFsdWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0Vycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxNWU2YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnRXJyb3JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnRXJyb3JFdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb2RlKCk7Ci0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGIyZGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXh0ZW5kZWRFdmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlEZWJ1Z0V2ZW50IGV4dGVuZHMgSVByb3h5RXh0ZW5kZWRFdmVudCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHX0VWRU5UX09GRlNFVCA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfRVhJVCA9IERCR19FVkVOVF9PRkZTRVQgKyAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAlFVkVOVF9EQkdfRVhJVF9OT1JNQUwgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAlFVkVOVF9EQkdfRVhJVF9TSUdOQUwgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCR19CUFNFVCA9IERCR19FVkVOVF9PRkZTRVQgKyA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCR19GUkFNRVMgPSBEQkdfRVZFTlRfT0ZGU0VUICsgNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfREFUQSA9IERCR19FVkVOVF9PRkZTRVQgKyA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCR19UWVBFID0gREJHX0VWRU5UX09GRlNFVCArIDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJHX1ZBUlMgPSBEQkdfRVZFTlRfT0ZGU0VUICsgODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfQVJHUyA9IERCR19FVkVOVF9PRkZTRVQgKyA5OwotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJHX0lOSVQgPSBEQkdfRVZFTlRfT0ZGU0VUICsgMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJHX09LID0gREJHX0VWRU5UX09GRlNFVCArIDExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCR19FUlJPUiA9IERCR19FVkVOVF9PRkZTRVQgKyAxMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfU1VTUEVORCA9IERCR19FVkVOVF9PRkZTRVQgKyAxMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCAJRVZFTlRfREJHX1NVU1BFTkRfQlBISVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAlFVkVOVF9EQkdfU1VTUEVORF9TSUdOQUwgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAlFVkVOVF9EQkdfU1VTUEVORF9TVEVQID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCAJRVZFTlRfREJHX1NVU1BFTkRfSU5UID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfVEhSRUFEUwk9IERCR19FVkVOVF9PRkZTRVQgKyAxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfVEhSRUFEX1NFTEVDVCA9IERCR19FVkVOVF9PRkZTRVQgKyAxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfU1RBQ0tfSU5GT19ERVBUSCA9IERCR19FVkVOVF9PRkZTRVQgKyAxNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfREFUQV9SRUFEX01FTU9SWSA9IERCR19FVkVOVF9PRkZTRVQgKyAxNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfREFUQV9XUklURV9NRU1PUlkgPSBEQkdfRVZFTlRfT0ZGU0VUICsgMTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJHX1NJR05BTFMgPSBEQkdfRVZFTlRfT0ZGU0VUICsgMTk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQkdfREFUQV9FVkFfRVggPSBEQkdfRVZFTlRfT0ZGU0VUICsgMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJHX1BBUlRJQUxfQUlGID0gREJHX0VWRU5UX09GRlNFVCArIDIxOwotCi0JcHVibGljIFN0cmluZyBnZXRCaXRTZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdFdmVudEZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdFdmVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczODY2NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnRXZlbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFdmVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdFdmVudEZhY3RvcnkgZXh0ZW5kcyBJUHJveHlFdmVudEZhY3RvcnkgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODRlNmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlEZWJ1Z0V2ZW50TGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIGhhbmRsZVByb3h5RGVidWdBcmdzRXZlbnQoSVByb3h5RGVidWdBcmdzRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudChJUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50KElQcm94eURlYnVnQnJlYWtwb2ludFNldEV2ZW50IGUpOwotCXB1YmxpYyB2b2lkIGhhbmRsZVByb3h5RGVidWdEYXRhRXZlbnQoSVByb3h5RGVidWdEYXRhRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z0RhdGFFeHBWYWx1ZUV2ZW50KElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z0V4aXRFdmVudChJUHJveHlEZWJ1Z0V4aXRFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnRXJyb3JFdmVudChJUHJveHlEZWJ1Z0Vycm9yRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQoSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50IGUpOwotCXB1YmxpYyB2b2lkIGhhbmRsZVByb3h5RGVidWdJbml0RXZlbnQoSVByb3h5RGVidWdJbml0RXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudChJUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnT0tFdmVudChJUHJveHlEZWJ1Z09LRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudChJUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0RXZlbnQoSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnU2lnbmFsRXZlbnQoSVByb3h5RGVidWdTaWduYWxFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50KElQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50IGUpOwotCXB1YmxpYyB2b2lkIGhhbmRsZVByb3h5RGVidWdTaWduYWxzRXZlbnQoSVByb3h5RGVidWdTaWduYWxzRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudChJUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudChJUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z1N0ZXBFdmVudChJUHJveHlEZWJ1Z1N0ZXBFdmVudCBlKTsKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm94eURlYnVnU3VzcGVuZEV2ZW50KElQcm94eURlYnVnU3VzcGVuZEV2ZW50IGUpOwotCXB1YmxpYyB2b2lkIGhhbmRsZVByb3h5RGVidWdUeXBlRXZlbnQoSVByb3h5RGVidWdUeXBlRXZlbnQgZSk7Ci0JcHVibGljIHZvaWQgaGFuZGxlUHJveHlEZWJ1Z1ZhcnNFdmVudChJUHJveHlEZWJ1Z1ZhcnNFdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdFeGl0RXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdFeGl0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwZTg0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnRXhpdEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdFeGl0RXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgaW50IGdldEV4aXRTdGF0dXMoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnSW5mb1RocmVhZHNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2RmODYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50IGV4dGVuZHMgSVByb3h5RGVidWdFdmVudCB7Ci0JcHVibGljIFN0cmluZ1tdIGdldFRocmVhZElkcygpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0luaXRFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z0luaXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMzYTYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdJbml0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlEZWJ1Z0luaXRFdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotCXB1YmxpYyBpbnQgZ2V0TnVtU2VydmVycygpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNkOWM5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdNZW1vcnlJbmZvOwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotCXB1YmxpYyBQcm94eURlYnVnTWVtb3J5SW5mbyBnZXRNZW1vcnlJbmZvKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnT0tFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z09LRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMDBkMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnT0tFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnT0tFdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RiNjBhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuUHJveHlEZWJ1Z0FJRjsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotCXB1YmxpYyBQcm94eURlYnVnQUlGIGdldERhdGEoKTsKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTRmNjguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0RXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZ2V0RnJhbWUoKTsKLQlwdWJsaWMgaW50IGdldFRocmVhZElkKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU2lnbmFsRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdTaWduYWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY0NDQ5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdTaWduYWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnU2lnbmFsRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z1N1c3BlbmRFdmVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRTaWduYWxOYW1lKCk7Ci0JcHVibGljIFN0cmluZyBnZXRTaWduYWxNZWFuaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOGVmZWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1NpZ25hbEV4aXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50IGV4dGVuZHMgSVByb3h5RGVidWdFdmVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRTaWduYWxOYW1lKCk7Ci0JcHVibGljIFN0cmluZyBnZXRTaWduYWxNZWFuaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU2lnbmFsc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU2lnbmFsc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjIxMDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1NpZ25hbHNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU2lnbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnU2lnbmFsc0V2ZW50IGV4dGVuZHMgSVByb3h5RGVidWdFdmVudCB7Ci0JcHVibGljIFByb3h5RGVidWdTaWduYWxbXSBnZXRTaWduYWxzKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0YTBiMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudCBleHRlbmRzIElQcm94eURlYnVnRXZlbnQgewotCXB1YmxpYyBpbnQgZ2V0RGVwdGgoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyNDI5YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50IGV4dGVuZHMgSVByb3h5RGVidWdFdmVudCB7Ci0JcHVibGljIFByb3h5RGVidWdTdGFja0ZyYW1lW10gZ2V0RnJhbWVzKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3RlcEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3RlcEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGY2MTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1N0ZXBFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdTdGVwRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z1N1c3BlbmRFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3VzcGVuZEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnU3VzcGVuZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzQ1ZjYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9kZWJ1Zy9ldmVudC9JUHJveHlEZWJ1Z1N1c3BlbmRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuUHJveHlEZWJ1Z1N0YWNrRnJhbWU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdTdXNwZW5kRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgaW50IGdldFRocmVhZElkKCk7Ci0JcHVibGljIFN0cmluZ1tdIGdldENoYW5nZWRWYXJzKCk7Ci0JaW50IGdldERlcHRoKCk7Ci0JUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZ2V0RnJhbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdUeXBlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdUeXBlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlODQ4NC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnVHlwZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdUeXBlRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdWYXJzRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZGVidWcvZXZlbnQvSVByb3h5RGVidWdWYXJzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3NjdiZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2RlYnVnL2V2ZW50L0lQcm94eURlYnVnVmFyc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RGVidWdWYXJzRXZlbnQgZXh0ZW5kcyBJUHJveHlEZWJ1Z0V2ZW50IHsKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFyaWFibGVzKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0Fic3RyYWN0UHJveHlFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9BYnN0cmFjdFByb3h5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0NGMyYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0Fic3RyYWN0UHJveHlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm94eUV2ZW50IGltcGxlbWVudHMgSVByb3h5RXZlbnQgewotCXByaXZhdGUgaW50CQkJZXZlbnRJRDsKLQlwcml2YXRlIGludAkJCXRyYW5zYWN0aW9uSUQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXQlhdHRyaWJ1dGVzOwotCQotCXB1YmxpYyBBYnN0cmFjdFByb3h5RXZlbnQoaW50IGV2ZW50SUQsIGludCB0cmFuc2FjdGlvbklELCBTdHJpbmdbXSBhdHRycykgewotCQl0aGlzLmV2ZW50SUQJCT0gZXZlbnRJRDsKLQkJdGhpcy50cmFuc2FjdGlvbklECT0gdHJhbnNhY3Rpb25JRDsKLQkJdGhpcy5hdHRyaWJ1dGVzCQk9IGF0dHJzOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RQcm94eUV2ZW50KGludCBldmVudElELCBpbnQgdHJhbnNhY3Rpb25JRCkgewotCQl0aGlzKGV2ZW50SUQsIHRyYW5zYWN0aW9uSUQsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEV2ZW50SUQoKSB7Ci0JCXJldHVybiBldmVudElEOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25JRCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uSUQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgc3RyID0gZXZlbnRJRCArICIgdHJhbnNpZD0iICsgZ2V0VHJhbnNhY3Rpb25JRCgpOwotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlzdHIgKz0gIiAoIjsKLQkJCWZvciAoaW50IGkgPSAwIDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXN0ciArPSAiLCI7Ci0JCQkJc3RyICs9IGF0dHJpYnV0ZXNbaV07Ci0JCQl9Ci0JCQlzdHIgKz0gIikiOwotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0Fic3RyYWN0UHJveHlFdmVudEZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvQWJzdHJhY3RQcm94eUV2ZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDM2Mjk5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvQWJzdHJhY3RQcm94eUV2ZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnBhY2tldC5Qcm94eVBhY2tldDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm94eUV2ZW50RmFjdG9yeSBpbXBsZW1lbnRzIElQcm94eUV2ZW50RmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50RmFjdG9yeSN0b0V2ZW50KG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQpCi0JICovCi0JcHVibGljIGFic3RyYWN0IElQcm94eUV2ZW50IHRvRXZlbnQoUHJveHlQYWNrZXQgcGFja2V0KTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5Q29ubmVjdGVkRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5Q29ubmVjdGVkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNDZiZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUNvbm5lY3RlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5Q29ubmVjdGVkRXZlbnQgZXh0ZW5kcyBJUHJveHlFdmVudCB7Ci0vLyBFTVBUWQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9JUHJveHlEaXNjb25uZWN0ZWRFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9JUHJveHlEaXNjb25uZWN0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTkxM2UyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RGlzY29ubmVjdGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlEaXNjb25uZWN0ZWRFdmVudCBleHRlbmRzIElQcm94eUV2ZW50IHsKLQotCWJvb2xlYW4gd2FzRXJyb3IoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9JUHJveHlFcnJvckV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUVycm9yRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxZjY5Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlFcnJvckV2ZW50IGV4dGVuZHMgSVByb3h5RXZlbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0NPREVfQVRUUiA9ICJlcnJvckNvZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01FU1NBR0VfQVRUUiA9ICJlcnJvck1zZyI7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjcwMzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9JUHJveHlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUV2ZW50IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVEVEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNURUQgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSFVURE9XTiA9IDY7Ci0JCQotCS8qKgotCSAqIEdldCB0aGUgZXZlbnQgSUQgKHR5cGUpCi0JICogCi0JICogQHJldHVybiBldmVudCBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXZlbnRJRCgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgdHJhbnNhY3Rpb24gSUQKLQkgKiAKLQkgKiBAcmV0dXJuIHRyYW5zYWN0aW9uIElECi0JICovCi0JcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklEKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBldmVudCBhdHRyaWJ1dGVzCi0JICogQHJldHVybiBldmVudCBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RXZlbnRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV2ZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhiZDRhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RXZlbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUV2ZW50RmFjdG9yeSB7Ci0JcHVibGljIElQcm94eUV2ZW50IHRvRXZlbnQoUHJveHlQYWNrZXQgcGFja2V0KTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RXZlbnRIYW5kbGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV2ZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU1ZDlhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RXZlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5RXZlbnRIYW5kbGVyIHsKLQotCS8qKgotCSAqIEhhbmRsZSAocHJvY2VzcykgdGhlIGdpdmVuIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCAtIHRoZSBldmVudCB0byBwcm9jZXNzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5Q29tbWFuZCBjb21tYW5kLCBJUHJveHlFdmVudCBldmVudCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9JUHJveHlFdmVudExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzMDRkMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIEhhbmRsZXIgZm9yIGNvbm5lY3RlZCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGUgZXZlbnQgdG8gaGFuZGxlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5Q29ubmVjdGVkRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogSGFuZGxlciBmb3IgZGlzY29ubmVjdGVkIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZSBldmVudCB0byBoYW5kbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlEaXNjb25uZWN0ZWRFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBIYW5kbGVyIGZvciBlcnJvciBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGUgZXZlbnQgdG8gaGFuZGxlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5RXJyb3JFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBIYW5kbGVyIGZvciBleHRlbmRlZCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGUgZXZlbnQgdG8gaGFuZGxlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5RXh0ZW5kZWRFdmVudCBlKTsKLQotCS8qKgotCSAqIEhhbmRsZXIgZm9yIG1lc3NhZ2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlIGV2ZW50IHRvIGhhbmRsZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eU1lc3NhZ2VFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBIYW5kbGVyIGZvciBPSyBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGUgZXZlbnQgdG8gaGFuZGxlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5T0tFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBIYW5kbGVyIGZvciB0aW1lb3V0IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZSBldmVudCB0byBoYW5kbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlUaW1lb3V0RXZlbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eUV4dGVuZGVkRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RXh0ZW5kZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWNmZTU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5RXh0ZW5kZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUV4dGVuZGVkRXZlbnQgZXh0ZW5kcyBJUHJveHlFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5TWVzc2FnZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eU1lc3NhZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ3MDEzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5TWVzc2FnZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5TWVzc2FnZUV2ZW50IGV4dGVuZHMgSVByb3h5RXZlbnQgewotCXB1YmxpYyBlbnVtIExldmVsIHsKLQkJRkFUQUwsCi0JCUVSUk9SLAotCQlXQVJOSU5HLAotCQlJTkZPLAotCQlERUJVRywKLQkJVU5ERUZJTkVECi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9BVFRSID0gIm1lc3NhZ2VMZXZlbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERV9BVFRSID0gIm1lc3NhZ2VDb2RlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FUVFIgPSAibWVzc2FnZVRleHQiOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9JUHJveHlPS0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eU9LRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkMGE5Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eU9LRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlPS0V2ZW50IGV4dGVuZHMgSVByb3h5RXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eVNodXRkb3duRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5U2h1dGRvd25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIzYTlkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5U2h1dGRvd25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVNodXRkb3duRXZlbnQgZXh0ZW5kcyBJUHJveHlFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5VGltZW91dEV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L0lQcm94eVRpbWVvdXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI1MjkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvZXZlbnQvSVByb3h5VGltZW91dEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5VGltZW91dEV2ZW50IGV4dGVuZHMgSVByb3h5RXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L1Byb3h5RXZlbnRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L2V2ZW50L1Byb3h5RXZlbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNGRjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ldmVudC9Qcm94eUV2ZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmV2ZW50LlByb3h5RXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkuZXZlbnQuUHJveHlNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LmV2ZW50LlByb3h5T0tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotCi1wdWJsaWMgY2xhc3MgUHJveHlFdmVudEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFByb3h5RXZlbnRGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuQWJzdHJhY3RQcm94eUV2ZW50RmFjdG9yeSN0b0V2ZW50KG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQpCi0JICovCi0JcHVibGljIElQcm94eUV2ZW50IHRvRXZlbnQoUHJveHlQYWNrZXQgcGFja2V0KSB7Ci0JCUlQcm94eUV2ZW50IGV2dCA9IG51bGw7Ci0KLQkJc3dpdGNoIChwYWNrZXQuZ2V0SUQoKSkgewotCQljYXNlIElQcm94eUV2ZW50Lk9LOgotCQkJZXZ0ID0gbmV3IFByb3h5T0tFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpKTsKLQkJCWJyZWFrOwotCQkJCi0JCWNhc2UgSVByb3h5RXZlbnQuTUVTU0FHRToKLQkJCWV2dCA9IG5ldyBQcm94eU1lc3NhZ2VFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5RXZlbnQuRVJST1I6Ci0JCQlldnQgPSBuZXcgUHJveHlFcnJvckV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZXZ0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm94eU9LRXZlbnQgbmV3T0tFdmVudChpbnQgdHJhbnNJRCkgewotCQlyZXR1cm4gbmV3IFByb3h5T0tFdmVudCh0cmFuc0lEKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJveHlFcnJvckV2ZW50IG5ld0Vycm9yRXZlbnQoaW50IHRyYW5zSUQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tdIHsKLQkJCQlJUHJveHlFcnJvckV2ZW50LkVSUk9SX0NPREVfQVRUUiArICI9IiArIGNvZGUsIAotCQkJCUlQcm94eUVycm9yRXZlbnQuRVJST1JfTUVTU0FHRV9BVFRSICsgIj0iICsgbWVzc2FnZQotCQl9OwotCQkKLQkJcmV0dXJuIG5ldyBQcm94eUVycm9yRXZlbnQodHJhbnNJRCwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9wYWNrZXQvUHJveHlQYWNrZXQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcGFja2V0L1Byb3h5UGFja2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNmUxYTQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9wYWNrZXQvUHJveHlQYWNrZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS51dGlsLlByb3RvY29sVXRpbDsKLQotcHVibGljIGNsYXNzIFByb3h5UGFja2V0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLRVRfTEVOR1RIX1NJWkUgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tFVF9DSEFOTkVMX1NJWkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tFVF9JRF9TSVpFID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLRVRfVFJBTlNfSURfU0laRSA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0VUX05BUkdTX1NJWkUgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tFVF9BUkdfTEVOX1NJWkUgPSA4OwotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgcGFja2V0SUQ7Ci0JcHJpdmF0ZSBpbnQgcGFja2V0VHJhbnNJRDsKLQlwcml2YXRlIFN0cmluZ1tdIHBhY2tldEFyZ3M7Ci0KLQlwcml2YXRlIENoYXJzZXQJCQljaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKCJVUy1BU0NJSSIpOwotCXByaXZhdGUgQ2hhcnNldEVuY29kZXIJZW5jb2RlciA9IGNoYXJzZXQubmV3RW5jb2RlcigpOwotCXByaXZhdGUgQ2hhcnNldERlY29kZXIJZGVjb2RlciA9IGNoYXJzZXQubmV3RGVjb2RlcigpOwotCi0JcHVibGljIFByb3h5UGFja2V0KCkgewotCX0KLQkKLQlwdWJsaWMgUHJveHlQYWNrZXQoSVByb3h5Q29tbWFuZCBjbWQpIHsKLQkJdGhpcy5wYWNrZXRJRCA9IGNtZC5nZXRDb21tYW5kSUQoKTsKLQkJdGhpcy5wYWNrZXRUcmFuc0lEID0gY21kLmdldFRyYW5zYWN0aW9uSUQoKTsKLQkJdGhpcy5wYWNrZXRBcmdzID0gY21kLmdldEFyZ3VtZW50cygpOwotCX0KLQotCXB1YmxpYyBQcm94eVBhY2tldChJUHJveHlFdmVudCBldmVudCkgewotCQl0aGlzLnBhY2tldElEID0gZXZlbnQuZ2V0RXZlbnRJRCgpOwotCQl0aGlzLnBhY2tldFRyYW5zSUQgPSBldmVudC5nZXRUcmFuc2FjdGlvbklEKCk7Ci0JCXRoaXMucGFja2V0QXJncyA9IGV2ZW50LmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXIgc2V0IGRlY29kZXIKLQkgKiAKLQkgKiBAcmV0dXJuIGRlY29kZXIKLQkgKi8KLQlwdWJsaWMgQ2hhcnNldERlY29kZXIgZGVjb2RlcigpIHsKLQkJcmV0dXJuIGRlY29kZXI7Ci0JfQotCQotCS8qKgotCSAqIENoYXJhY3RlciBzZXQgZW5jb2RlcgotCSAqIAotCSAqIEByZXR1cm4gZW5jb2RlcgotCSAqLwotCXB1YmxpYyBDaGFyc2V0RW5jb2RlciBlbmNvZGVyKCkgewotCQlyZXR1cm4gZW5jb2RlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhcmd1bWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmdzKCkgewotCQlyZXR1cm4gcGFja2V0QXJnczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBhY2tldCB0eXBlCi0JICogCi0JICogQHJldHVybiBwYWNrZXQgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0JCXJldHVybiBwYWNrZXRJRDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0cmFuc2FjdGlvbiBJRCBmb3IgdGhpcyBwYWNrZXQKLQkgKiAKLQkgKiBAcmV0dXJuIHRyYW5zYWN0aW9uIElECi0JICovCi0JcHVibGljIGludCBnZXRUcmFuc0lEKCkgewotCQlyZXR1cm4gcGFja2V0VHJhbnNJRDsKLQl9Ci0JCi0JLyoqCi0JICogUHJvY2VzcyBwYWNrZXRzIGZyb20gdGhlIHdpcmUuIEVhY2ggcGFja2V0IGNvbXByaXNlcyBhIGxlbmd0aCwgaGVhZGVyIGFuZCBhIGJvZHkgCi0JICogZm9ybWF0dGVkIGFzIGZvbGxvd3M6Ci0JICogCi0JICogTEVOR1RIIEhFQURFUiBCT0RZCi0JICogCi0JICogd2hlcmU6Ci0JICogCi0JICogTEVOR1RICWlzIGFuIFBBQ0tFVF9MRU5HVEhfU0laRSBoZXhhZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nCi0JICogCQkJdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgSEVBREVSIGFuZCBCT0RZIHNlY3Rpb25zLgotCSAqIAotCSAqIEhFQURFUiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkczoKLQkgKiAKLQkgKiAnICcgQ01EX0lEICc6JyBUUkFOU19JRCAnOicgTlVNX0FSR1MKLQkgKiAKLQkgKiB3aGVyZToKLQkgKiAKLQkgKiBDTURfSUQJaXMgYW4gUEFDS0VUX0lEX1NJWkUgaGV4YWRlY2ltYWwgbnVtYmVyIHJlcHJlc2VudGluZwotCSAqIAkJCXRoZSB0eXBlIG9mIHRoaXMgY29tbWFuZC4KLQkgKiBUUkFOU19JRAlpcyBhbiBQQUNLRVRfVFJBTlNfSURfU0laRSBoZXhhZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nCi0JICogCQkJdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBjb21tYW5kLgotCSAqIE5VTV9BUkdTCWlzIGFuIFBBQ0tFVF9BUkdTX0xFTl9TSVpFIGhleGFkZWNpbWFsIG51bWJlciByZXByZXNlbnRpbmcKLQkgKiAJCQl0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gCi0JICogCi0JICogVGhlIGNvbW1hbmQgYm9keSBpcyBmb3JtYXR0ZWQgYXMgYSBsaXN0IG9mIE5VTV9BUkdTIHN0cmluZyBhcmd1bWVudHMsIGVhY2ggCi0JICogcHJlY2VkZWQgYnkgYSBzcGFjZSAoMHgyMCkgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgotCSAqIAkKLQkgKiAnICcgTEVOR1RIICc6JyBCWVRFUyAuLi4gJyAnIExFTkdUSCAnOicgQllURVMKLQkgKiAKLQkgKiB3aGVyZToKLQkgKiAKLQkgKiBMRU5HVEgJaXMgYW4gUEFDS0VUX0FSR1NfTEVOX1NJWkUgaGV4YWRlY2ltYWwgbnVtYmVyIHJlcHJlc2VudGluZwotCSAqIAkJCXRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KLQkgKiBCWVRFUwlhcmUgTEVOR1RIIGJ5dGVzIG9mIHRoZSBzdHJpbmcuIEFueSBjaGFyYWN0ZXJzIGFyZSBwZXJtaXR0ZWQsIAotCSAqIAkJCWluY2x1ZGluZyBzcGFjZXMKLQkgKiAJCi0JICogQHJldHVybglmYWxzZSBpZiBhIHByb3RvY29sIGVycm9yIG9jY3VycwotCSAqIEB0aHJvd3MJSU9FeGNlcHRpb24gaWYgdGhlIGNvbm5lY3Rpb24gaXMgdGVybWluYXRlZCAocmVhZCByZXR1cm5zIDwgMCkKLQkgKiAJCQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWQoUmVhZGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvKgotCQkgKiBGaXJzdCBFVkVOVF9MRU5HVEhfU0laRSBieXRlcyBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgZXZlbnQKLQkJICovCi0JCUJ5dGVCdWZmZXIgbGVuZ3RoQnl0ZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKFBBQ0tFVF9MRU5HVEhfU0laRSk7Ci0JCWZ1bGxSZWFkKGNoYW5uZWwsIGxlbmd0aEJ5dGVzKTsKLQkJQ2hhckJ1ZmZlciBsZW5fc3RyID0gZGVjb2Rlci5kZWNvZGUobGVuZ3RoQnl0ZXMpOwotCQkKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJSRUNFSVZFOlsiICsgbGVuX3N0cik7Ci0JCX0KLQkKLQkJaW50IGxlbjsKLQkJdHJ5IHsKLQkJCWxlbiA9IEludGVnZXIucGFyc2VJbnQobGVuX3N0ci5zdWJTZXF1ZW5jZSgwLCBQQUNLRVRfTEVOR1RIX1NJWkUpLnRvU3RyaW5nKCksIDE2KTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXSBCQUQgUEFDS0VUIExFTkdUSCIpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJBRCBQQUNLRVQgTEVOR1RIOiBcIiIgKyBsZW5fc3RyICsgIlwiIik7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkJhZCBwYWNrZXQgbGVuZ3RoIGZvcm1hdCIpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBSZWFkIGxlbiBieXRlcyBvZiByZXN0IG9mIHBhY2tldAotCQkgKi8KLQkJQnl0ZUJ1ZmZlciBwYWNrZXRCeXRlcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobGVuKTsKLQkJZnVsbFJlYWQoY2hhbm5lbCwgcGFja2V0Qnl0ZXMpOwotCQlDaGFyQnVmZmVyIHBhY2tldEJ1ZiA9IGRlY29kZXIuZGVjb2RlKHBhY2tldEJ5dGVzKTsKLQkJCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHBhY2tldEJ1ZiArICJdIik7Ci0JCX0KLQotCQkvKgotCQkgKiBFeHRyYWN0IHRyYW5zYWN0aW9uIElEIGFuZCBldmVudCB0eXBlCi0JCSAqLwotCQkKLQkJaW50IGlkU3RhcnQgPSAxOyAvLyBTa2lwICcgJwotCQlpbnQgaWRFbmQgPSBpZFN0YXJ0ICsgUEFDS0VUX0lEX1NJWkU7Ci0JCWludCB0cmFuc1N0YXJ0ID0gaWRFbmQgKyAxOyAvLyBTa2lwICc6JwotCQlpbnQgdHJhbnNFbmQgPSB0cmFuc1N0YXJ0ICsgUEFDS0VUX1RSQU5TX0lEX1NJWkU7Ci0JCWludCBudW1BcmdzU3RhcnQgPSB0cmFuc0VuZCArIDE7IC8vIFNraXAgJzonCi0JCWludCBudW1BcmdzRW5kID0gbnVtQXJnc1N0YXJ0ICsgUEFDS0VUX05BUkdTX1NJWkU7Ci0JCQotCQl0cnkgewotCQkJcGFja2V0SUQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhY2tldEJ1Zi5zdWJTZXF1ZW5jZShpZFN0YXJ0LCBpZEVuZCkudG9TdHJpbmcoKSwgMTYpOwotCQkJcGFja2V0VHJhbnNJRCA9IEludGVnZXIucGFyc2VJbnQocGFja2V0QnVmLnN1YlNlcXVlbmNlKHRyYW5zU3RhcnQsIHRyYW5zRW5kKS50b1N0cmluZygpLCAxNik7Ci0JCQlpbnQgcGFja2V0TnVtQXJncyA9IEludGVnZXIucGFyc2VJbnQocGFja2V0QnVmLnN1YlNlcXVlbmNlKG51bUFyZ3NTdGFydCwgbnVtQXJnc0VuZCkudG9TdHJpbmcoKSwgMTYpOwotCQkJCi0JCQkvKgotCQkJICogRXh0cmFjdCByZXN0IG9mIHRoZSBhcmd1bWVudHMuIEVhY2ggYXJndW1lbnQgaXMgYW4gOCBieXRlIGhleCBsZW5ndGgsICc6JyBhbmQKLQkJCSAqIHRoZW4gdGhlIGNoYXJhY3RlcnMgb2YgdGhlIGFyZ3VtZW50LgotCQkJICovCi0JCQkKLQkJCXBhY2tldEFyZ3MgPSBuZXcgU3RyaW5nW3BhY2tldE51bUFyZ3NdOwotCQkJaW50IGFyZ1BvcyA9IG51bUFyZ3NFbmQgKyAxOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2tldE51bUFyZ3M7IGkrKykgewotCQkJCXBhY2tldEFyZ3NbaV0gPSBQcm90b2NvbFV0aWwuZGVjb2RlU3RyaW5nKHBhY2tldEJ1ZiwgYXJnUG9zKTsKLQkJCQlhcmdQb3MgKz0gcGFja2V0QXJnc1tpXS5sZW5ndGgoKSArIFBBQ0tFVF9BUkdfTEVOX1NJWkUgKyAyOwotCQkJfQotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCQUQgUEFDS0VUIEZPUk1BVDogXCIiICsgcGFja2V0QnVmICsgIlwiIik7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkJhZCBwYWNrZXQgZm9ybWF0Iik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbmQoV3JpdGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgYm9keSA9IFByb3RvY29sVXRpbC5lbmNvZGVJbnRWYWwocGFja2V0SUQsIFBBQ0tFVF9JRF9TSVpFKSAKLQkJCSsgIjoiICsgUHJvdG9jb2xVdGlsLmVuY29kZUludFZhbChwYWNrZXRUcmFuc0lELCBQQUNLRVRfVFJBTlNfSURfU0laRSkKLQkJCSsgIjoiICsgUHJvdG9jb2xVdGlsLmVuY29kZUludFZhbChwYWNrZXRBcmdzLmxlbmd0aCwgUEFDS0VUX0FSR19MRU5fU0laRSk7Ci0KLQkJZm9yIChTdHJpbmcgYXJnIDogcGFja2V0QXJncykgewotCQkJYm9keSArPSAiICIgKyBQcm90b2NvbFV0aWwuZW5jb2RlU3RyaW5nKGFyZyk7Ci0JCX0KLQotCQkvKgotCQkgKiBOb3RlOiBjb21tYW5kIGxlbmd0aCBpbmNsdWRlcyB0aGUgZmlyc3Qgc3BhY2UhCi0JCSAqLwotCQlTdHJpbmcgcGFja2V0ID0gUHJvdG9jb2xVdGlsLmVuY29kZUludFZhbChib2R5Lmxlbmd0aCgpICsgMSwgCi0JCQkJUEFDS0VUX0xFTkdUSF9TSVpFKSArICIgIiArIGJvZHk7Ci0JCQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU0VORDpbIiArIHBhY2tldCArICJdIik7Ci0JCX0KLQkJCi0JCWZ1bGxXcml0ZShjaGFubmVsLCBlbmNvZGVyLmVuY29kZShDaGFyQnVmZmVyLndyYXAocGFja2V0KSkpOwotCX0KLQkKLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBwcm90b2NvbCBkZWJ1Z2dpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2luZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKLQkJdGhpcy5kZWJ1ZyA9IGRlYnVnOwotCX0KLQkKLQkvKioKLQkgKiBSZWFkIGEgZnVsbCBidWZmZXIgZnJvbSB0aGUgc29ja2V0LiBHdWFyYW50ZWVkIHRvIHJlYWQgYnVmLnJlbWFpbmluZygpIGJ5dGVzCi0JICogZnJvbSB0aGUgY2hhbm5lbC4KLQkgKiAKLQkgKiBGSVhNRTogQ2FuIHRoaXMgYmxvY2sgaWYgdGhlcmUgaXMgbm90aGluZyBhdmFpbGFibGUgb24gdGhlIGNoYW5uZWw/IElmIHNvLCB0aGVuCi0JICogdGhlcmUgc2hvdWxkIGJlIHNvbWUga2luZCBvZiB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIFVJIGZyb20gaGFuZ2luZy4KLQkgKiAKLQkgKiBAdGhyb3dzCUlPRXhjZXB0aW9uIGlmIEVPRgotCSAqLwotCXByaXZhdGUgdm9pZCBmdWxsUmVhZChSZWFkYWJsZUJ5dGVDaGFubmVsIGNoYW5uZWwsIEJ5dGVCdWZmZXIgYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlidWYuY2xlYXIoKTsKLQkJd2hpbGUgKGJ1Zi5oYXNSZW1haW5pbmcoKSkgewotCQkJaW50IG4gPSBjaGFubmVsLnJlYWQoYnVmKTsKLQkJCWlmIChuIDwgMCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRU9GIGZyb20gcHJveHkiKTsKLQkJCX0KLQkJfQotCQlidWYuZmxpcCgpOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBhIGZ1bGwgYnVmZmVyIHRvIHRoZSBzb2NrZXQuIEd1YXJhbnRlZWQgdG8gd3JpdGUgYnVmLnJlbWFpbmdpbigpIGJ5dGVzIHRvCi0JICogdGhlIGNoYW5uZWwuCi0JICogCi0JICogRklYTUU6IENhbiB0aGlzIGJsb2NrPyBJZiBzbywgdGhlbiB0aGVyZSBzaG91bGQgYmUgc29tZSBraW5kIG9mIHRpbWVvdXQgdG8gcHJldmVudCB0aGUgVUkgZnJvbSBoYW5naW5nLgotCSAqIAotCSAqIEBwYXJhbSBidWYKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZ1bGxXcml0ZShXcml0YWJsZUJ5dGVDaGFubmVsIGNoYW5uZWwsIEJ5dGVCdWZmZXIgYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3aGlsZSAoYnVmLmhhc1JlbWFpbmluZygpKSB7Ci0JCQlpbnQgbiA9IGNoYW5uZWwud3JpdGUoYnVmKTsKLQkJCWlmIChuIDwgMCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRU9GIGZyb20gcHJveHkiKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jbGllbnQvQWJzdHJhY3RQcm94eVJ1bnRpbWVDbGllbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jbGllbnQvQWJzdHJhY3RQcm94eVJ1bnRpbWVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkNzA2Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY2xpZW50L0Fic3RyYWN0UHJveHlSdW50aW1lQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jbGllbnQuQWJzdHJhY3RQcm94eUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlDb25uZWN0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RGlzY29ubmVjdGVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFeHRlbmRlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eU9LRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eVRpbWVvdXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5TWVzc2FnZUV2ZW50LkxldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5ld05vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOZXdRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUXVldWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnV0aWwuRGVidWdPcHRpb25zOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm94eVJ1bnRpbWVDbGllbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3h5Q2xpZW50Ci0JCWltcGxlbWVudHMgSVByb3h5UnVudGltZUNsaWVudCwgSVByb3h5RXZlbnRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIGNsYXNzIFN0YXRlTWFjaGluZVRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3RhdGUgTWFjaGluZSBUaHJlYWQiOwotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJcnVuU3RhdGVNYWNoaW5lKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSWxsZWdhbCBzdGF0ZSBkZXRlY3RlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmIChsb2dFdmVudHMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInN0YXRlIG1hY2hpbmUgdGhyZWFkIGV4aXRlZCIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcm94eSBzdGF0ZQotCSAqLwotCWVudW0gUHJveHlTdGF0ZSB7Ci0JCUlETEUsIFNUQVJUVVAsIElOSVQsIE1PREVMX0RFRiwgUlVOTklORywgU0hVVERPV04sIEVORCwgRVJST1IKLQl9Ci0KLQkvKgotCSAqIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgbG9nZ2luZyBtZXNzYWdlcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2dFdmVudHMgPSBmYWxzZTsKLQkvKgotCSAqIEFjdHVhbCBuYW1lIG9mIHRoZSBwcm94eSAtIHVzZWQgZm9yIGRlYnVnZ2luZyBtZXNzYWdlcwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByb3h5TmFtZSA9ICIiOwotCS8qCi0JICogTWFpbiBzdGF0ZSBtYWNoaW5lIHZhcmlhYmxlCi0JICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBQcm94eVN0YXRlIHN0YXRlOwotCS8qCi0JICogTWFzdGVyIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBoYXZlIGJlZW4gc2VudCB0byB0aGUgc2VydmVyCi0JICovCi0JcHJpdmF0ZSBMaXN0PElQcm94eUNvbW1hbmQ+IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxJUHJveHlDb21tYW5kPigpOwotCS8qCi0JICogRXZlbnQgcXVldWUgZm9yIGluY29taW5nIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIExpbmtlZEJsb2NraW5nUXVldWU8SVByb3h5RXZlbnQ+IGV2ZW50cyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPElQcm94eUV2ZW50PigpOwotCS8qCi0JICogTGlzdGVuZXIgbGlzdCBmb3IgZXZlbnRzIGdlbmVyYXRlZCBieSB1cwotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gQ29sbGVjdGlvbnMKLQkJCS5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8SVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXI+KCkpOwotCS8qCi0JICogQmFzZWQgSUQgZm9yIG1vZGVsIElEJ3MgZ2VuZXJhdGVkIGJ5IHRoZSBwcm94eS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZQotCSAqIG1vZGVsIElEJ3MgYXJlIHVuaXF1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGJhc2VNb2RlbElkOwotCS8qCi0JICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5IGV2ZW50RmFjdG9yeTsKLQkvKgotCSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBjb21tYW5kcwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkgY21kRmFjdG9yeTsKLQotCXB1YmxpYyBBYnN0cmFjdFByb3h5UnVudGltZUNsaWVudChTdHJpbmcgbmFtZSwgaW50IGJhc2VNb2RlbElkLAotCQkJSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5IGNtZEZhY3RvcnksCi0JCQlJUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5IGV2ZW50RmFjdG9yeSkgewotCQl0aGlzLmNtZEZhY3RvcnkgPSBjbWRGYWN0b3J5OwotCQl0aGlzLmV2ZW50RmFjdG9yeSA9IGV2ZW50RmFjdG9yeTsKLQkJdGhpcy5wcm94eU5hbWUgPSBuYW1lOwotCQl0aGlzLmJhc2VNb2RlbElkID0gYmFzZU1vZGVsSWQ7Ci0JCXRoaXMuc3RhdGUgPSBQcm94eVN0YXRlLklETEU7Ci0JCXN1cGVyLnNldEV2ZW50RmFjdG9yeShldmVudEZhY3RvcnkpOwotCQlzdXBlci5hZGRQcm94eUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJaWYgKERlYnVnT3B0aW9ucy5DTElFTlRfVFJBQ0lORykgewotCQkJdGhpcy5sb2dFdmVudHMgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIEFic3RyYWN0UHJveHlSdW50aW1lQ2xpZW50KFN0cmluZyBuYW1lLCBpbnQgYmFzZU1vZGVsSWQpIHsKLQkJdGhpcyhuYW1lLCBiYXNlTW9kZWxJZCwgbmV3IFByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5KCksIG5ldyBQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29tbWFuZCB0byB0aGUgbGlzdCBvZiBjb21tYW5kcyB0aGF0IGhhdmUgYmVlbiBzZW50IHRvIHRoZSBwcm94eQotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmQoSVByb3h5Q29tbWFuZCBjb21tYW5kKSB7Ci0JCXN5bmNocm9uaXplZCAoY29tbWFuZHMpIHsKLQkJCWNvbW1hbmRzLmFkZChjb21tYW5kKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50LklQcm94eVJ1bnRpbWVDbGllbnQjYWRkUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jbGllbnQuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcihJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlDb25uZWN0ZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlDb25uZWN0ZWRFdmVudCBldmVudCkgewotCQl0cnkgewotCQkJLy8gdGhpcyB3aWxsIHdha2UgdXAgdGhlIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyB0aGUgZXZlbnQKLQkJCWV2ZW50cy5hZGQoZXZlbnQpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhjZXB0KSB7Ci0JCQkvLyBldmVudHMgbGlzdCBzaG91bGQgbmV2ZXIgYmUgZnVsbAotCQkJZXhjZXB0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RGlzY29ubmVjdGVkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5RGlzY29ubmVjdGVkRXZlbnQgZXZlbnQpIHsKLQkJdHJ5IHsKLQkJCS8vIHRoaXMgd2lsbCB3YWtlIHVwIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgdGhlIGV2ZW50Ci0JCQlldmVudHMuYWRkKGV2ZW50KTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4Y2VwdCkgewotCQkJLy8gZXZlbnRzIGxpc3Qgc2hvdWxkIG5ldmVyIGJlIGZ1bGwKLQkJCWV4Y2VwdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUVycm9yRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5RXJyb3JFdmVudCBldmVudCkgewotCQl0cnkgewotCQkJLy8gdGhpcyB3aWxsIHdha2UgdXAgdGhlIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyB0aGUgZXZlbnQKLQkJCWV2ZW50cy5hZGQoZXZlbnQpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhjZXB0KSB7Ci0JCQkvLyBldmVudHMgbGlzdCBzaG91bGQgbmV2ZXIgYmUgZnVsbAotCQkJZXhjZXB0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXh0ZW5kZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlFeHRlbmRlZEV2ZW50IGV2ZW50KSB7Ci0JCXRyeSB7Ci0JCQkvLyB0aGlzIHdpbGwgd2FrZSB1cCB0aGUgc3RhdGUgbWFjaGluZSB0byBwcm9jZXNzIHRoZSBldmVudAotCQkJZXZlbnRzLmFkZChldmVudCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleGNlcHQpIHsKLQkJCS8vIGV2ZW50cyBsaXN0IHNob3VsZCBuZXZlciBiZSBmdWxsCi0JCQlleGNlcHQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5TWVzc2FnZUV2ZW50IGV2ZW50KSB7Ci0JCXRyeSB7Ci0JCQkvLyB0aGlzIHdpbGwgd2FrZSB1cCB0aGUgc3RhdGUgbWFjaGluZSB0byBwcm9jZXNzIHRoZSBldmVudAotCQkJZXZlbnRzLmFkZChldmVudCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleGNlcHQpIHsKLQkJCS8vIGV2ZW50cyBsaXN0IHNob3VsZCBuZXZlciBiZSBmdWxsCi0JCQlleGNlcHQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlFdmVudExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlPS0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eU9LRXZlbnQgZXZlbnQpIHsKLQkJdHJ5IHsKLQkJCS8vIHRoaXMgd2lsbCB3YWtlIHVwIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgdGhlIGV2ZW50Ci0JCQlldmVudHMuYWRkKGV2ZW50KTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4Y2VwdCkgewotCQkJLy8gZXZlbnRzIGxpc3Qgc2hvdWxkIG5ldmVyIGJlIGZ1bGwKLQkJCWV4Y2VwdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50TGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eVRpbWVvdXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlUaW1lb3V0RXZlbnQgZXZlbnQpIHsKLQkJdHJ5IHsKLQkJCS8vIHRoaXMgd2lsbCB3YWtlIHVwIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgdGhlIGV2ZW50Ci0JCQlldmVudHMuYWRkKGV2ZW50KTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4Y2VwdCkgewotCQkJLy8gZXZlbnRzIGxpc3Qgc2hvdWxkIG5ldmVyIGJlIGZ1bGwKLQkJCWV4Y2VwdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50LklQcm94eVJ1bnRpbWVDbGllbnQjcmVtb3ZlUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jbGllbnQuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcigKLQkJCUlQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50LklQcm94eVJ1bnRpbWVDbGllbnQjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHN0YXRlICE9IFByb3h5U3RhdGUuU0hVVERPV04pIHsKLQkJCWlmIChsb2dFdmVudHMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcoKSArICI6IHNodXR0aW5nIGRvd24gc2VydmVyLi4uIik7Ci0JCQl9Ci0JCQlzdGF0ZSA9IFByb3h5U3RhdGUuU0hVVERPV047Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNsaWVudC5JUHJveHlSdW50aW1lQ2xpZW50I3N0YXJ0RXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEV2ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzdGF0ZSAhPSBQcm94eVN0YXRlLlJVTk5JTkcpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm90IGFjY2VwdGluZyBjb21tYW5kcyIpOwotCQl9Ci0JCUlQcm94eUNvbW1hbmQgY29tbWFuZCA9IGNtZEZhY3RvcnkubmV3UHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCk7Ci0JCWFkZENvbW1hbmQoY29tbWFuZCk7Ci0JCXNlbmRDb21tYW5kKGNvbW1hbmQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50LklQcm94eVJ1bnRpbWVDbGllbnQjc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzdGF0ZSA9PSBQcm94eVN0YXRlLklETEUpIHsKLQkJCXN0YXRlID0gUHJveHlTdGF0ZS5TVEFSVFVQOwotCi0JCQlUaHJlYWQgc210ID0gbmV3IFRocmVhZChuZXcgU3RhdGVNYWNoaW5lVGhyZWFkKCksIHByb3h5TmFtZQotCQkJCQkrIFN0YXRlTWFjaGluZVRocmVhZC5uYW1lKTsKLQkJCXNtdC5zdGFydCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jbGllbnQuSVByb3h5UnVudGltZUNsaWVudCNzdG9wRXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRXZlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHN0YXRlICE9IFByb3h5U3RhdGUuUlVOTklORykgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJOb3QgYWNjZXB0aW5nIGNvbW1hbmRzIik7Ci0JCX0KLQkJSVByb3h5Q29tbWFuZCBjb21tYW5kID0gY21kRmFjdG9yeS5uZXdQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCgpOwotCQlhZGRDb21tYW5kKGNvbW1hbmQpOwotCQlzZW5kQ29tbWFuZChjb21tYW5kKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNsaWVudC5JUHJveHlSdW50aW1lQ2xpZW50I3N1Ym1pdEpvYihqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIHZvaWQgc3VibWl0Sm9iKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzdGF0ZSAhPSBQcm94eVN0YXRlLlJVTk5JTkcpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm90IGFjY2VwdGluZyBjb21tYW5kcyIpOwotCQl9Ci0JCUlQcm94eUNvbW1hbmQgY29tbWFuZCA9IGNtZEZhY3RvcnkKLQkJCQkubmV3UHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZChhcmdzKTsKLQkJYWRkQ29tbWFuZChjb21tYW5kKTsKLQkJc2VuZENvbW1hbmQoY29tbWFuZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jbGllbnQuSVByb3h5UnVudGltZUNsaWVudCN0ZXJtaW5hdGVKb2IoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVKb2IoU3RyaW5nIGpvYklkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc3RhdGUgIT0gUHJveHlTdGF0ZS5SVU5OSU5HKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vdCBhY2NlcHRpbmcgY29tbWFuZHMiKTsKLQkJfQotCQlJUHJveHlDb21tYW5kIGNvbW1hbmQgPSBjbWRGYWN0b3J5Ci0JCQkJLm5ld1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQoam9iSWQpOwotCQlhZGRDb21tYW5kKGNvbW1hbmQpOwotCQlzZW5kQ29tbWFuZChjb21tYW5kKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBwcm94eU5hbWUgKyAiUHJveHlSdW50aW1lQ2xpZW50IjsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGUgdGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBldmVudC4gVXNlcyB0aGUKLQkgKiB0cmFuc2FjdGlvbiBJRCBvIG1hdGNoIGNvbW1hbmRzL2V2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJveHlDb21tYW5kIGdldENvbW1hbmRGb3JFdmVudChJUHJveHlFdmVudCBldmVudCkgewotCQlJUHJveHlDb21tYW5kW10gY2E7Ci0JCUlQcm94eUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoY29tbWFuZHMpIHsKLQkJCWNhID0gY29tbWFuZHMudG9BcnJheShuZXcgSVByb3h5Q29tbWFuZFswXSk7Ci0JCX0KLQkJZm9yIChJUHJveHlDb21tYW5kIGNtZCA6IGNhKSB7Ci0JCQlpZiAoY21kLmdldFRyYW5zYWN0aW9uSUQoKSA9PSBldmVudC5nZXRUcmFuc2FjdGlvbklEKCkpIHsKLQkJCQljb21tYW5kID0gY21kOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgZXZlbnRzIHdoaWxlIGluIHRoZSBSVU5OSU5HIHN0YXRlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUnVubmluZ0V2ZW50KElQcm94eUNvbW1hbmQgY29tbWFuZCwgSVByb3h5RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGxvZ0V2ZW50cykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRvU3RyaW5nKCkgKyAiIHJlY2VpdmVkIGV2ZW50ICIgKyBldmVudCk7Ci0JCX0KLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5TWVzc2FnZUV2ZW50KSB7Ci0JCQlmaXJlUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkubmV3UHJveHlSdW50aW1lTWVzc2FnZUV2ZW50KChJUHJveHlNZXNzYWdlRXZlbnQpIGV2ZW50KSk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQpIHsKLQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVOZXdKb2JFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVOZXdKb2JFdmVudCgoSVByb3h5UnVudGltZU5ld0pvYkV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQoKElQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50KSB7Ci0JCQkJZmlyZVByb3h5UnVudGltZU5ld05vZGVFdmVudCgoSVByb3h5UnVudGltZU5ld05vZGVFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50KChJUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lTmV3UXVldWVFdmVudCgoSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQoKElQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KChJUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQoKElQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KSB7Ci0JCQkJZmlyZVByb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCgoSVByb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50KSB7Ci0JCQkJZmlyZVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQoKElQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50KSB7Ci0JCQkJZmlyZVByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50KChJUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQoKElQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KChJUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQoKElQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KSB7Ci0JCQkJZmlyZVByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCgoSVByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50KSB7Ci0JCQkJZmlyZVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQoKElQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RXJyb3JFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkubmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eU9LRXZlbnQpIHsKLQkJCQlyZW1vdmVDb21tYW5kKGNvbW1hbmQpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQpIHsKLQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eU9LRXZlbnQpIHsKLQkJCQlyZW1vdmVDb21tYW5kKGNvbW1hbmQpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZCkgewotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCS5uZXdQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50KGV2ZW50Ci0JCQkJCQkJCS5nZXRUcmFuc2FjdGlvbklEKCksIGV2ZW50LmdldEF0dHJpYnV0ZXMoKSkpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eUVycm9yRXZlbnQpIHsKLQkJCQlmaXJlUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJLm5ld1Byb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCgpKTsKLQkJCX0KLQkJCXJlbW92ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kKSB7Ci0JCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJLm5ld1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQoZXZlbnQKLQkJCQkJCQkJLmdldFRyYW5zYWN0aW9uSUQoKSwgZXZlbnQuZ2V0QXR0cmlidXRlcygpKSk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RXJyb3JFdmVudCkgewotCQkJCWZpcmVQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkubmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkpOwotCQkJfQotCQkJcmVtb3ZlQ29tbWFuZChjb21tYW5kKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGNvbW1hbmQgZnJvbSBsaXN0IG9mIHNlbnQgY29tbWFuZHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29tbWFuZChJUHJveHlDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3luY2hyb25pemVkIChjb21tYW5kcykgewotCQkJY29tbWFuZC5jb21wbGV0ZWQoKTsKLQkJCWNvbW1hbmRzLnJlbW92ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50KAotCQkJSVByb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KAotCQkJSVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50KAotCQkJSVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KAotCQkJSVByb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZU1lc3NhZ2VFdmVudChJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQoSVByb3h5UnVudGltZU5ld0pvYkV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lTmV3TWFjaGluZUV2ZW50KAotCQkJSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZU5ld05vZGVFdmVudChJUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50KAotCQkJSVByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQoCi0JCQlJUHJveHlSdW50aW1lTmV3UXVldWVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCSgoSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQoCi0JCQlJUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lUXVldWVDaGFuZ2VFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQoCi0JCQlJUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCSgoSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCSgoSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIpIGxpc3RlbmVyKS5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQoCi0JCQlJUHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KAotCQkJSVByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQoCi0JCQlJUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KAotCQkJSVByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50KAotCQkJSVByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudCBldmVudCkgewotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJKChJUHJveHlSdW50aW1lRXZlbnRMaXN0ZW5lcikgbGlzdGVuZXIpLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KAotCQkJSVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCgKLQkJCUlQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkoKElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFpbiBwcm94eSBzdGF0ZSBtYWNoaW5lLiBVc2UgdG8gbWFuYWdlIGNvbW11bmljYXRpb24gd2l0aCBhIHByb3h5Ci0JICogY2xpZW50LgotCSAqIAotCSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHN0YXRlIG1hY2hpbmUgdGhyZWFkIChzbyBzeW5jaHJvbml6ZWQKLQkgKiBub3QgbmVlZGVkKQotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5TdGF0ZU1hY2hpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLAotCQkJSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHN0YXRlICE9IFByb3h5U3RhdGUuSURMRSAmJiBzdGF0ZSAhPSBQcm94eVN0YXRlLkVSUk9SKSB7Ci0JCQlJUHJveHlDb21tYW5kIGNvbW1hbmQ7Ci0JCQlJUHJveHlFdmVudCBldmVudDsKLQotCQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFSVFVQOgotCQkJCS8qCi0JCQkJICogVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGVkIGV2ZW50IGZyb20gdGhlCi0JCQkJICogcHJveHkgYWZ0ZXIgaXQgd2FzIHN0YXJ0ZWQuIEEgY29ubmVjdGVkIGV2ZW50IGluZGljYXRlcyB0aGF0Ci0JCQkJICogdGhlIHByb3h5IGhhcyBiZWVuIGxhdW5jaGVkIHN1Y2Nlc3NmdWxseS4gU2VuZCBhbiBJTklUCi0JCQkJICogY29tbWFuZCB0byB0aGUgcHJveHkgYW5kIGVudGVyIHRoZSBJTklUIHN0YXRlLgotCQkJCSAqLwotCQkJCWV2ZW50ID0gZXZlbnRzLnRha2UoKTsKLQotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eUNvbm5lY3RlZEV2ZW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzZXNzaW9uSGFuZGxlRXZlbnRzKCk7Ci0JCQkJCQljb21tYW5kID0gY21kRmFjdG9yeQotCQkJCQkJCQkubmV3UHJveHlSdW50aW1lSW5pdENvbW1hbmQoYmFzZU1vZGVsSWQpOwotCQkJCQkJYWRkQ29tbWFuZChjb21tYW5kKTsKLQkJCQkJCXNlbmRDb21tYW5kKGNvbW1hbmQpOwotCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLklOSVQ7Ci0JCQkJCQlmaXJlUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkJLm5ld1Byb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXN0YXRlID0gUHJveHlTdGF0ZS5JRExFOwotCQkJCQkJZmlyZVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJCQkubmV3UHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoZQotCQkJCQkJCQkJCS5nZXRNZXNzYWdlKCkpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlUaW1lb3V0RXZlbnQpIHsKLQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLklETEU7Ci0JCQkJCWZpcmVQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkubmV3UHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoIlByb3h5IGNvbm5lY3Rpb24gdGltZW91dCBvdXQiKSk7Ci0JCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURpc2Nvbm5lY3RlZEV2ZW50KSB7Ci0JCQkJCXN0YXRlID0gUHJveHlTdGF0ZS5JRExFOwotCQkJCQlmaXJlUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkJLm5ld1Byb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KCJQcm94eSBkaXNjb25uZWN0ZWQiKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLkVSUk9SOwotCQkJCQlmaXJlUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJCS5uZXdQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQoKSk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlY2VpdmVkICIKLQkJCQkJCQkrIGV2ZW50LnRvU3RyaW5nKCkgKyAiIGluIFNUQVJUVVAiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSU5JVDoKLQkJCQkvKgotCQkJCSAqIFRoaXMgc3RhdGUgaXMgc2V0IHRvIHdhaXQgZnJvbSBhIHJlc3BvbnNlIGZyb20gdGhlIElOSVQKLQkJCQkgKiBjb21tYW5kLiBJZiB3ZSByZWNlaXZlIGFuIE9LIGV2ZW50LCB3ZSBuZXh0IHNlbmQgYSBNT0RFTF9ERUYKLQkJCQkgKiBjb21tYW5kIGFuZCBlbnRlciB0aGUgTU9ERUxfREVGIHN0YXRlLgotCQkJCSAqLwotCQkJCWV2ZW50ID0gZXZlbnRzLnRha2UoKTsKLQotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURpc2Nvbm5lY3RlZEV2ZW50KSB7Ci0JCQkJCXN0YXRlID0gUHJveHlTdGF0ZS5JRExFOwotCQkJCQlmaXJlUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkJLm5ld1Byb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KCJQcm94eSBkaXNjb25uZWN0ZWQiKSk7Ci0JCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eU1lc3NhZ2VFdmVudCkgewotCQkJCQlmaXJlUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJCS5uZXdQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQoKElQcm94eU1lc3NhZ2VFdmVudCkgZXZlbnQpKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb21tYW5kID0gZ2V0Q29tbWFuZEZvckV2ZW50KGV2ZW50KTsKLQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJcmVtb3ZlQ29tbWFuZChjb21tYW5kKTsKLQkJCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eU9LRXZlbnQpIHsKLQkJCQkJCQljb21tYW5kID0gY21kRmFjdG9yeQotCQkJCQkJCQkJLm5ld1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpOwotCQkJCQkJCWFkZENvbW1hbmQoY29tbWFuZCk7Ci0JCQkJCQkJc2VuZENvbW1hbmQoY29tbWFuZCk7Ci0JCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLk1PREVMX0RFRjsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlFcnJvckV2ZW50KSB7Ci0JCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLklETEU7Ci0JCQkJCQkJZmlyZVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJCQkJLm5ld1Byb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGV2ZW50Ci0JCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGVzKCkpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLkVSUk9SOwotCQkJCQkJCWZpcmVQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkJCQkubmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkpOwotCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQkJCQkiQ291bGQgbm90IGZpbmQgY29tbWFuZCBmb3IgZXZlbnQgWyIgCi0JCQkJCQkJCQkJKyBldmVudC50b1N0cmluZygpICsgIl0gaW4gSU5JVCIpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLkVSUk9SOwotCQkJCQkJZmlyZVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkJLm5ld1Byb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCgpKTsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlY2VpdmVkICIKLQkJCQkJCQkJKyBldmVudC50b1N0cmluZygpICsgIiBpbiBJTklUIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTU9ERUxfREVGOgotCQkJCS8qCi0JCQkJICogVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIHByb2Nlc3MgYXR0cmlidXRlIGRlZmluaXRpb24gZXZlbnRzCi0JCQkJICogdGhhdCBhcmUgdXNlZCBieSB0aGUgcHJveHkgdG8gZGVmaW5lIGFueSBhdHRyaWJ1dGVzIHRoYXQgaXQKLQkJCQkgKiB3aWxsIHVzZS4gVGhpcyBzdGF0ZSBpcyB0ZXJtaW5hdGVkIHdoZW4gYW4gT0sgZXZlbnQgaXMKLQkJCQkgKiByZWNlaXZlZC4gQXQgdGhpcyBwb2ludCBlbnRlciB0aGUgUlVOTklORyBzdGF0ZS4KLQkJCQkgKiAKLQkJCQkgKi8KLQkJCQlldmVudCA9IGV2ZW50cy50YWtlKCk7Ci0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlEaXNjb25uZWN0ZWRFdmVudCkgewotCQkJCQlzdGF0ZSA9IFByb3h5U3RhdGUuSURMRTsKLQkJCQkJZmlyZVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJCS5uZXdQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCgiUHJveHkgZGlzY29ubmVjdGVkIikpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlNZXNzYWdlRXZlbnQpIHsKLQkJCQkJZmlyZVByb3h5UnVudGltZU1lc3NhZ2VFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkubmV3UHJveHlSdW50aW1lTWVzc2FnZUV2ZW50KChJUHJveHlNZXNzYWdlRXZlbnQpIGV2ZW50KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZCA9IGdldENvbW1hbmRGb3JFdmVudChldmVudCk7Ci0JCQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eU9LRXZlbnQpIHsKLQkJCQkJCQlyZW1vdmVDb21tYW5kKGNvbW1hbmQpOwotCQkJCQkJCXN0YXRlID0gUHJveHlTdGF0ZS5SVU5OSU5HOwotCQkJCQkJCWZpcmVQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkJCS5uZXdQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQpIHsKLQkJCQkJCQlmaXJlUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQoKElQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudCkgZXZlbnQpOwotCQkJCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eUVycm9yRXZlbnQpIHsKLQkJCQkJCQlyZW1vdmVDb21tYW5kKGNvbW1hbmQpOwotCQkJCQkJCXN0YXRlID0gUHJveHlTdGF0ZS5JRExFOwotCQkJCQkJCWZpcmVQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkJCS5uZXdQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChldmVudAotCQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlcygpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlbW92ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLkVSUk9SOwotCQkJCQkJCWZpcmVQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkJCQkubmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkpOwotCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQkJCQkiQ291bGQgbm90IGZpbmQgY29tbWFuZCBmb3IgZXZlbnQgWyIgCi0JCQkJCQkJCQkJKyBldmVudC50b1N0cmluZygpICsgIl0gaW4gTU9ERUxfREVGIik7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdGF0ZSA9IFByb3h5U3RhdGUuRVJST1I7Ci0JCQkJCQlmaXJlUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KGV2ZW50RmFjdG9yeQotCQkJCQkJCQkubmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkpOwotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVjZWl2ZWQgIgotCQkJCQkJCQkrIGV2ZW50LnRvU3RyaW5nKCkgKyAiIGluIE1PREVMX0RFRiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJVTk5JTkc6Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIGlzIHRoZSBtYWluIGV2ZW50IHByb2Nlc3Npbmcgc3RhdGUuIEFueSBldmVudHMgd2UKLQkJCQkgKiByZWNlaXZlIGluIHRoaXMgc3RhdGUgYXJlIGZvcndhcmRlZCB0byBldmVudCBsaXN0ZW5lcnMuIFRoaXMKLQkJCQkgKiBzdGF0ZSBjb250aW51ZXMgdW50aWwgdGhlIHNodXRkb3duKCkgbWV0aG9kIGlzIGNhbGxlZCwgYXQKLQkJCQkgKiB3aGljaCB0aW1lIHdlIGVudGVyIHRoZSBzaHV0ZG93biBzdGF0ZS4KLQkJCQkgKi8KLQkJCQlldmVudCA9IGV2ZW50cy50YWtlKCk7Ci0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlEaXNjb25uZWN0ZWRFdmVudCkgewotCQkJCQlzdGF0ZSA9IFByb3h5U3RhdGUuU0hVVERPV047Ci0JCQkJCWZpcmVQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQoZXZlbnRGYWN0b3J5Ci0JCQkJCQkJLm5ld1Byb3h5UnVudGltZU1lc3NhZ2VFdmVudChMZXZlbC5GQVRBTCwKLQkJCQkJCQkJCSJQcm94eSBkaXNjb25uZWN0ZWQiKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZCA9IGdldENvbW1hbmRGb3JFdmVudChldmVudCk7Ci0JCQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCXByb2Nlc3NSdW5uaW5nRXZlbnQoY29tbWFuZCwgZXZlbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3RhdGUgPSBQcm94eVN0YXRlLkVSUk9SOwotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLQkJCQkJCQkJIkNvdWxkIG5vdCBmaW5kIGNvbW1hbmQgZm9yIGV2ZW50IFsiIAotCQkJCQkJCQkJKyBldmVudC50b1N0cmluZygpICsgIl0gaW4gUlVOTklORyIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNIVVRET1dOOgotCQkJCS8qCi0JCQkJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIHdoZW4gdGhlIHByb3h5IGhhcyBiZWVuIHNodXQgZG93bi4gV2UKLQkJCQkgKiBzdGF5IGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHNlc3Npb24gaXMgc2h1dCBkb3duLiBUaGlzCi0JCQkJICogaGFwcGVucyB3aGVuIGFuIE9LIGV2ZW50IGlzIHJlY2VpdmVkIGluIHJlc3BvbnNlIHRvIGEgUVVJVAotCQkJCSAqIGNvbW1hbmQsIG9yIGlmIHRoZSBzaHV0ZG93biB0aW1lb3V0IGhhcyBleHBpcmVkLgotCQkJCSAqLwotCQkJCWlmIChpc1NodXRkb3duKCkpIHsKLQkJCQkJZmlyZVByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudChldmVudEZhY3RvcnkKLQkJCQkJCQkubmV3UHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50KCkpOwotCQkJCQlzdGF0ZSA9IFByb3h5U3RhdGUuSURMRTsKLQkJCQkJY29tbWFuZHMuY2xlYXIoKTsKLQkJCQkJZXZlbnRzLmNsZWFyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogV2FpdCBmb3IgYW55IGV2ZW50LiBXZSB3aWxsIGV2ZW50dWFsbHkgZ2V0IGFuCi0JCQkJCSAqIElQcm94eURpc2Nvbm5lY3RlZEV2ZW50LgotCQkJCQkgKi8KLQkJCQkJZXZlbnRzLnRha2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBzdGF0ZTogIgotCQkJCQkJKyBzdGF0ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jbGllbnQvSVByb3h5UnVudGltZUNsaWVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NsaWVudC9JUHJveHlSdW50aW1lQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZjAwMzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NsaWVudC9JUHJveHlSdW50aW1lQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZUNsaWVudCB7Ci0JLyoqCi0JICogUmVnaXN0ZXIgZm9yIGV2ZW50cwotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIoSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIFVucmVnaXN0ZXIgZm9yIGV2ZW50cwotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIoSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIFNodXQgZG93biB0aGUgcHJveHkKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHByb3h5IGZhaWxzIHRvIHN0b3AKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUZWxsIHByb3h5IHRvIHN0YXJ0IHNlbmRpbmcgZXZlbnRzCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEV2ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTdGFydCB1cCB0aGUgcHJveHkKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHByb3h5IGZhaWxzIHRvIHN0YXJ0Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUZWxsIHByb3h5IHRvIHN0b3Agc2VuZGluZyBldmVudHMKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcEV2ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTdWJtaXQgYSBqb2IgZm9yIGV4ZWN1dGlvbgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN1Ym1pdEpvYihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVGVybWluYXRlIGEgam9iCi0JICogCi0JICogQHBhcmFtIGpvYklkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUpvYihTdHJpbmcgam9iSWQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jbGllbnQvSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jbGllbnQvSVByb3h5UnVudGltZUV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkNDcwNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY2xpZW50L0lQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU1lc3NhZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVBbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVFdmVudExpc3RlbmVyIHsKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZU5ld0pvYkV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVOZXdOb2RlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50IGUpOwkKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgZSk7CQotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50IGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudCBlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IGUpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvQWJzdHJhY3RQcm94eVJ1bnRpbWVDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9BYnN0cmFjdFByb3h5UnVudGltZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YjA0MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9BYnN0cmFjdFByb3h5UnVudGltZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5BYnN0cmFjdFByb3h5Q29tbWFuZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlSdW50aW1lQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0UHJveHlDb21tYW5kCi0JaW1wbGVtZW50cyBJUHJveHlSdW50aW1lQ29tbWFuZCB7Ci0JcHVibGljIEFic3RyYWN0UHJveHlSdW50aW1lQ29tbWFuZChpbnQgZXZlbnRJRCkgewotCQlzdXBlcihldmVudElEKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcm94eVJ1bnRpbWVDb21tYW5kKGludCBldmVudElELCBpbnQgdHJhbnNhY3Rpb25JRCwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihldmVudElELCB0cmFuc2FjdGlvbklELCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9JUHJveHlSdW50aW1lQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1YTRjNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9JUHJveHlSdW50aW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5Q29tbWFuZDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVDb21tYW5kIGV4dGVuZHMgSVByb3h5Q29tbWFuZCB7Ci0JLyoKLQkgKiBDb21tYW5kIElEcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0RFRiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRVZFTlRTID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9QX0VWRU5UUyA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCTUlUX0pPQiA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVSTUlOQVRFX0pPQiA9IDY7Ci0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL0lQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTNiZjguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkgZXh0ZW5kcyBJUHJveHlDb21tYW5kRmFjdG9yeSB7Ci0JLyoqCi0JICogQHBhcmFtIGJhc2VJRAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZUluaXRDb21tYW5kIG5ld1Byb3h5UnVudGltZUluaXRDb21tYW5kKGludCBiYXNlSWQpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVNb2RlbERlZkNvbW1hbmQoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQgbmV3UHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQgbmV3UHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQgbmV3UHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZChTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gam9iSUQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kIG5ld1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQoU3RyaW5nIGpvYklkKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL0lQcm94eVJ1bnRpbWVJbml0Q29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZUluaXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOWI4ZWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZUluaXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZUluaXRDb21tYW5kIGV4dGVuZHMgSVByb3h5UnVudGltZUNvbW1hbmQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQwY2VhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL0lQcm94eVJ1bnRpbWVNb2RlbERlZkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kIGV4dGVuZHMgSVByb3h5UnVudGltZUNvbW1hbmQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzllMDg4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL0lQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kIGV4dGVuZHMgSVByb3h5UnVudGltZUNvbW1hbmQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9JUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NTMyNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9JUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQgZXh0ZW5kcyBJUHJveHlSdW50aW1lQ29tbWFuZCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9JUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwYjYxYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9JUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kIGV4dGVuZHMgSVByb3h5UnVudGltZUNvbW1hbmQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL0lQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGNmNDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2NvbW1hbmQvSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZCBleHRlbmRzIElQcm94eVJ1bnRpbWVDb21tYW5kIHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvY29tbWFuZC9Qcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg2YTI4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9jb21tYW5kL1Byb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmNvbW1hbmQuUHJveHlSdW50aW1lSW5pdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVNb2RlbERlZkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5jb21tYW5kLlByb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuUHJveHlDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkgZXh0ZW5kcyBQcm94eUNvbW1hbmRGYWN0b3J5IGltcGxlbWVudHMgSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChpbnQpCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVJbml0Q29tbWFuZCBuZXdQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChpbnQgYmFzZUlkKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lSW5pdENvbW1hbmQoYmFzZUlkKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVNb2RlbERlZkNvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kIG5ld1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVNb2RlbERlZkNvbW1hbmQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kIG5ld1Byb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCgpCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5I25ld1Byb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kKAotCQkJU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQoYXJncyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkjbmV3UHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kKAotCQkJU3RyaW5nIGpvYklkKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZChqb2JJZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuUHJveHlDb21tYW5kRmFjdG9yeSN0b0NvbW1hbmQob3JnLmVjbGlwc2UucHRwLnByb3h5LnBhY2tldC5Qcm94eVBhY2tldCkKLQkgKi8KLQlwdWJsaWMgSVByb3h5Q29tbWFuZCB0b0NvbW1hbmQoUHJveHlQYWNrZXQgcGFja2V0KSB7Ci0JCUlQcm94eVJ1bnRpbWVDb21tYW5kCWNtZCA9IG51bGw7Ci0KLQkJSVByb3h5Q29tbWFuZCBjID0gc3VwZXIudG9Db21tYW5kKHBhY2tldCk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCXJldHVybiBjOwotCQl9Ci0JCQotCQlzd2l0Y2ggKHBhY2tldC5nZXRJRCgpKSB7Ci0JCWNhc2UgSVByb3h5UnVudGltZUNvbW1hbmQuSU5JVDoKLQkJCWNtZCA9IG5ldyBQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUNvbW1hbmQuTU9ERUxfREVGOgotCQkJY21kID0gbmV3IFByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUNvbW1hbmQuU1RBUlRfRVZFTlRTOgotCQkJY21kID0gbmV3IFByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUNvbW1hbmQuU1RPUF9FVkVOVFM6Ci0JCQljbWQgPSBuZXcgUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQocGFja2V0LmdldFRyYW5zSUQoKSwgcGFja2V0LmdldEFyZ3MoKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIElQcm94eVJ1bnRpbWVDb21tYW5kLlNVQk1JVF9KT0I6Ci0JCQljbWQgPSBuZXcgUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUNvbW1hbmQuVEVSTUlOQVRFX0pPQjoKLQkJCWNtZCA9IG5ldyBQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kKHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gY21kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzE1N2M4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9BYnN0cmFjdFByb3h5UnVudGltZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5BYnN0cmFjdFByb3h5RXZlbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3h5UnVudGltZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RQcm94eUV2ZW50IGltcGxlbWVudHMgSVByb3h5UnVudGltZUV2ZW50IHsKLQlwdWJsaWMgQWJzdHJhY3RQcm94eVJ1bnRpbWVFdmVudChpbnQgZXZlbnRJRCwgaW50IHRyYW5zYWN0aW9uSUQpIHsKLQkJc3VwZXIoZXZlbnRJRCwgdHJhbnNhY3Rpb25JRCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0UHJveHlSdW50aW1lRXZlbnQoaW50IGV2ZW50SUQsIGludCB0cmFuc2FjdGlvbklELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKGV2ZW50SUQsIHRyYW5zYWN0aW9uSUQsIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNjI0Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkNTMyMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODNjYTEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjU5NTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXh0ZW5kZWRFdmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lRXZlbnQgZXh0ZW5kcyBJUHJveHlFeHRlbmRlZEV2ZW50IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9PRkZTRVQgPSAyMDA7Ci0JCi0JLyoKLQkgKiBJbnRlcm5hbCBzdGF0ZSBldmVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVFVQX1NUQVRFID0gRVZFTlRfT0ZGU0VUICsgMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNURURfU1RBVEUgPSBFVkVOVF9PRkZTRVQgKyAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkdfU1RBVEUgPSBFVkVOVF9PRkZTRVQgKyAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIVVRET1dOX1NUQVRFID0gRVZFTlRfT0ZGU0VUICsgNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9TVEFURSA9IEVWRU5UX09GRlNFVCArIDU7Ci0JCi0JLyoKLQkgKiBJbnRlcm5hbCBlcnJvciBldmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUVVBfRVJST1IgPSBFVkVOVF9PRkZTRVQgKyAxMDsKLQkKLQkvKgotCSAqIENvbW1hbmQgZXJyb3IgZXZlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCTUlUSk9CX0VSUk9SID0gRVZFTlRfT0ZGU0VUICsgMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVSTUlOQVRFSk9CX0VSUk9SID0gRVZFTlRfT0ZGU0VUICsgMTI7Ci0KLQkvKgotCSAqIE5ldyBtb2RlbCBlbGVtZW50IGV2ZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FV19KT0IgPSBFVkVOVF9PRkZTRVQgKyAyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdfTUFDSElORSA9IEVWRU5UX09GRlNFVCArIDIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FV19OT0RFID0gRVZFTlRfT0ZGU0VUICsgMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVXX1BST0NFU1MgPSBFVkVOVF9PRkZTRVQgKyAyMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdfUVVFVUUgPSBFVkVOVF9PRkZTRVQgKyAyNDsKLQotCS8qCi0JICogQ2hhbmdlIG1vZGVsIGVsZW1lbnQgZXZlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9CX0NIQU5HRSA9IEVWRU5UX09GRlNFVCArIDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BQ0hJTkVfQ0hBTkdFID0gRVZFTlRfT0ZGU0VUICsgMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9DSEFOR0UgPSBFVkVOVF9PRkZTRVQgKyAzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTX0NIQU5HRSA9IEVWRU5UX09GRlNFVCArIDMzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVVFX0NIQU5HRSA9IEVWRU5UX09GRlNFVCArIDM0OwotCi0JLyoKLQkgKiBSZW1vdmUgbW9kZWwgZWxlbWVudCBldmVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfQUxMID0gRVZFTlRfT0ZGU0VUICsgNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0pPQiA9IEVWRU5UX09GRlNFVCArIDQxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9NQUNISU5FID0gRVZFTlRfT0ZGU0VUICsgNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX05PREUgPSBFVkVOVF9PRkZTRVQgKyA0MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfUFJPQ0VTUyA9IEVWRU5UX09GRlNFVCArIDQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9RVUVVRSA9IEVWRU5UX09GRlNFVCArIDQ1OwotCi0JLyoKLQkgKiBNaXNjZWxsYW5lb3VzIGV2ZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0UgPSBFVkVOVF9PRkZTRVQgKyA1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSX0RFRiA9IEVWRU5UX09GRlNFVCArIDUxOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOThmYTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5TWVzc2FnZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQuTGV2ZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSBleHRlbmRzIElQcm94eUV2ZW50RmFjdG9yeSB7Ci0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50IG5ld1Byb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50IG5ld1Byb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQgbmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50IG5ld1Byb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNJRAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IG5ld1Byb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IG5ld1Byb3h5UnVudGltZU1lc3NhZ2VFdmVudChJUHJveHlNZXNzYWdlRXZlbnQgZXZlbnQpOwotCQotCS8qKgotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IG5ld1Byb3h5UnVudGltZU1lc3NhZ2VFdmVudChMZXZlbCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc0lECi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVOZXdKb2JFdmVudCBuZXdQcm94eVJ1bnRpbWVOZXdKb2JFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudCBuZXdQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc0lECi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVOZXdOb2RlRXZlbnQgbmV3UHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNJRAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50IG5ld1Byb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQgbmV3UHJveHlSdW50aW1lTmV3UXVldWVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudCBuZXdQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc0lECi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgbmV3UHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNJRAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnR0KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNJRAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCBuZXdQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc0lECi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNJRAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50IG5ld1Byb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCBuZXdQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudCBuZXdQcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgbmV3UHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoU3RyaW5nIG1lc3NhZ2UpOwotCQotCS8qKgotCSAqIEBwYXJhbSBhcmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgbmV3UHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoU3RyaW5nIGFyZ3NbXSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgbmV3UHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zSUQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkVycm9yRXZlbnQgbmV3UHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTVmYzcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk0MzRkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU1lc3NhZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWU4MGU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ldmVudC5JUHJveHlNZXNzYWdlRXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZU1lc3NhZ2VFdmVudCBleHRlbmRzIElQcm94eU1lc3NhZ2VFdmVudCB7Ci0JcHVibGljIGVudW0gRXJyb3JUeXBlIHsKLQkJQ09OTkVDVF9USU1FT1VULAotCQlDT01NQU5EX1RJTUVPVVQsCi0JCURJU0NPTk5FQ1RFRCwKLQkJUFJPWFksCi0JCUlOVEVSTkFMCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOZXdKb2JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOZXdKb2JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGVmNzI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVOZXdKb2JFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiMjg2ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld05vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOZXdOb2RlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzOTlhOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld05vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZU5ld05vZGVFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxNTlmMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTmV3UXVldWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzVkZWQ2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTmV3UXVldWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjIzNTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzA3OWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZWEzNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUmVtb3ZlQWxsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNTQyMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVSZW1vdmVBbGxFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTA5MzMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWY1M2YuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkMTJlMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lUmVtb3ZlTm9kZUV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTA1OGNlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVSZW1vdmVQcm9jZXNzRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiY2M5ZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQgZXh0ZW5kcyBJUHJveHlSdW50aW1lRXZlbnQgewotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAyZDNhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudCBleHRlbmRzIElQcm94eVJ1bnRpbWVFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvSVByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzRmYmJhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudDsKLQotcHVibGljIGludGVyZmFjZSBJUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MyODhlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTMyMmUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVTdWJtaXRKb2JFcnJvckV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9JUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDU5YjEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9ydW50aW1lL2V2ZW50L0lQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50IGV4dGVuZHMgSVByb3h5UnVudGltZUV2ZW50IHsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9ldmVudC9Qcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1YTkxMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvZXZlbnQvUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVOZXdOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lTmV3UHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVRdWV1ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucHJveHkucnVudGltZS5ldmVudC5Qcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lUnVubmluZ1N0YXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnByb3h5LnJ1bnRpbWUuZXZlbnQuUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eU1lc3NhZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuUHJveHlFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eU1lc3NhZ2VFdmVudC5MZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0OwotCi1wdWJsaWMgY2xhc3MgUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5IGV4dGVuZHMgUHJveHlFdmVudEZhY3RvcnkgaW1wbGVtZW50cyBJUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZUF0dHJpYnV0ZURlZkV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQgbmV3UHJveHlSdW50aW1lQXR0cmlidXRlRGVmRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lQ29ubmVjdGVkU3RhdGVFdmVudCBuZXdQcm94eVJ1bnRpbWVDb25uZWN0ZWRTdGF0ZUV2ZW50KCkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZUNvbm5lY3RlZFN0YXRlRXZlbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCgpCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVFcnJvclN0YXRlRXZlbnQgbmV3UHJveHlSdW50aW1lRXJyb3JTdGF0ZUV2ZW50KCkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZUVycm9yU3RhdGVFdmVudCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lSm9iQ2hhbmdlRXZlbnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudCBuZXdQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZUpvYkNoYW5nZUV2ZW50KHRyYW5zSUQsIGFyZ3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50IG5ld1Byb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZU1lc3NhZ2VFdmVudChvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5TWVzc2FnZUV2ZW50KQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTWVzc2FnZUV2ZW50IG5ld1Byb3h5UnVudGltZU1lc3NhZ2VFdmVudCgKLQkJCUlQcm94eU1lc3NhZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZU1lc3NhZ2VFdmVudChldmVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQob3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eU1lc3NhZ2VFdmVudC5MZXZlbCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU1lc3NhZ2VFdmVudCBuZXdQcm94eVJ1bnRpbWVNZXNzYWdlRXZlbnQoTGV2ZWwgbGV2ZWwsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZU1lc3NhZ2VFdmVudChsZXZlbCwgbWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVOZXdKb2JFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU5ld0pvYkV2ZW50IG5ld1Byb3h5UnVudGltZU5ld0pvYkV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQodHJhbnNJRCwgYXJncyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVOZXdNYWNoaW5lRXZlbnQgbmV3UHJveHlSdW50aW1lTmV3TWFjaGluZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lTmV3TWFjaGluZUV2ZW50KHRyYW5zSUQsIGFyZ3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTmV3Tm9kZUV2ZW50IG5ld1Byb3h5UnVudGltZU5ld05vZGVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZU5ld05vZGVFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudCBuZXdQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVOZXdQcm9jZXNzRXZlbnQodHJhbnNJRCwgYXJncyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lTmV3UXVldWVFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQgbmV3UHJveHlSdW50aW1lTmV3UXVldWVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZU5ld1F1ZXVlRXZlbnQodHJhbnNJRCwgYXJncyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50IG5ld1Byb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZU5vZGVDaGFuZ2VFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVQcm9jZXNzQ2hhbmdlRXZlbnQgbmV3UHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KHRyYW5zSUQsIGFyZ3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50dChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50IG5ld1Byb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50dChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50KHRyYW5zSUQsIGFyZ3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZVJlbW92ZUpvYkV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlSm9iRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVSZW1vdmVNYWNoaW5lRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KGludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lUmVtb3ZlTWFjaGluZUV2ZW50KHRyYW5zSUQsIGFyZ3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudCBuZXdQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQoaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVSZW1vdmVOb2RlRXZlbnQodHJhbnNJRCwgYXJncyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lUmVtb3ZlUHJvY2Vzc0V2ZW50IG5ld1Byb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQgbmV3UHJveHlSdW50aW1lUmVtb3ZlUXVldWVFdmVudChpbnQgdHJhbnNJRCwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVJlbW92ZVF1ZXVlRXZlbnQodHJhbnNJRCwgYXJncyk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KCkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50IG5ld1Byb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KCkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KCk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnRGYWN0b3J5I25ld1Byb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudCgpCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQgbmV3UHJveHlSdW50aW1lU2h1dGRvd25TdGF0ZUV2ZW50KCkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVNodXRkb3duU3RhdGVFdmVudCgpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQgbmV3UHJveHlSdW50aW1lU3RhcnR1cEVycm9yRXZlbnQoCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFByb3h5UnVudGltZVN0YXJ0dXBFcnJvckV2ZW50KG1lc3NhZ2UpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCBuZXdQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudCgKLQkJCVN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVTdGFydHVwRXJyb3JFdmVudChhcmdzKTsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LklQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkjbmV3UHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQgbmV3UHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudCgKLQkJCWludCB0cmFuc0lELCBTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXcgUHJveHlSdW50aW1lU3VibWl0Sm9iRXJyb3JFdmVudCh0cmFuc0lELCBhcmdzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50RmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudCBuZXdQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KAotCQkJaW50IHRyYW5zSUQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIG5ldyBQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JFcnJvckV2ZW50KHRyYW5zSUQsIGFyZ3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuUHJveHlFdmVudEZhY3RvcnkjdG9FdmVudChvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0KQotCSAqLwotCXB1YmxpYyBJUHJveHlFdmVudCB0b0V2ZW50KFByb3h5UGFja2V0IHBhY2tldCkgewotCQlJUHJveHlSdW50aW1lRXZlbnQJZXZ0ID0gbnVsbDsKLQotCQlJUHJveHlFdmVudCBlID0gc3VwZXIudG9FdmVudChwYWNrZXQpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCQkKLQkJc3dpdGNoIChwYWNrZXQuZ2V0SUQoKSkgewotCQljYXNlIElQcm94eVJ1bnRpbWVFdmVudC5BVFRSX0RFRjoKLQkJCWV2dCA9IG5ldyBQcm94eVJ1bnRpbWVBdHRyaWJ1dGVEZWZFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50Lk5FV19KT0I6Ci0JCQlldnQgPSBuZXcgUHJveHlSdW50aW1lTmV3Sm9iRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgcGFja2V0LmdldEFyZ3MoKSk7Ci0JCQlicmVhazsKLQkJCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50Lk5FV19NQUNISU5FOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZU5ld01hY2hpbmVFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50Lk5FV19OT0RFOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZU5ld05vZGVFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50Lk5FV19QUk9DRVNTOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZU5ld1Byb2Nlc3NFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50Lk5FV19RVUVVRToKLQkJCWV2dCA9IG5ldyBQcm94eVJ1bnRpbWVOZXdRdWV1ZUV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0JCQkKLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuSk9CX0NIQU5HRToKLQkJCWV2dCA9IG5ldyBQcm94eVJ1bnRpbWVKb2JDaGFuZ2VFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCQkKLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuTUFDSElORV9DSEFOR0U6Ci0JCQlldnQgPSBuZXcgUHJveHlSdW50aW1lTWFjaGluZUNoYW5nZUV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuTk9ERV9DSEFOR0U6Ci0JCQlldnQgPSBuZXcgUHJveHlSdW50aW1lTm9kZUNoYW5nZUV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuUFJPQ0VTU19DSEFOR0U6Ci0JCQlldnQgPSBuZXcgUHJveHlSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuUVVFVUVfQ0hBTkdFOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZVF1ZXVlQ2hhbmdlRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgcGFja2V0LmdldEFyZ3MoKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIElQcm94eVJ1bnRpbWVFdmVudC5SRU1PVkVfQUxMOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZVJlbW92ZUFsbEV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuUkVNT1ZFX0pPQjoKLQkJCWV2dCA9IG5ldyBQcm94eVJ1bnRpbWVSZW1vdmVKb2JFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50LlJFTU9WRV9NQUNISU5FOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZVJlbW92ZU1hY2hpbmVFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50LlJFTU9WRV9OT0RFOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZVJlbW92ZU5vZGVFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50LlJFTU9WRV9QUk9DRVNTOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZVJlbW92ZVByb2Nlc3NFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVByb3h5UnVudGltZUV2ZW50LlJFTU9WRV9RVUVVRToKLQkJCWV2dCA9IG5ldyBQcm94eVJ1bnRpbWVSZW1vdmVRdWV1ZUV2ZW50KHBhY2tldC5nZXRUcmFuc0lEKCksIHBhY2tldC5nZXRBcmdzKCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUHJveHlSdW50aW1lRXZlbnQuU1VCTUlUSk9CX0VSUk9SOgotCQkJZXZ0ID0gbmV3IFByb3h5UnVudGltZVN1Ym1pdEpvYkVycm9yRXZlbnQocGFja2V0LmdldFRyYW5zSUQoKSwgcGFja2V0LmdldEFyZ3MoKSk7Ci0JCQlicmVhazsKLQkJCQotCQljYXNlIElQcm94eVJ1bnRpbWVFdmVudC5URVJNSU5BVEVKT0JfRVJST1I6Ci0JCQlldnQgPSBuZXcgUHJveHlSdW50aW1lVGVybWluYXRlSm9iRXJyb3JFdmVudChwYWNrZXQuZ2V0VHJhbnNJRCgpLCBwYWNrZXQuZ2V0QXJncygpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCQkKLQkJcmV0dXJuIGV2dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9zZXJ2ZXIvQWJzdHJhY3RQcm94eVJ1bnRpbWVTZXJ2ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9zZXJ2ZXIvQWJzdHJhY3RQcm94eVJ1bnRpbWVTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzMzZhNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvc2VydmVyL0Fic3RyYWN0UHJveHlSdW50aW1lU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuc2VydmVyLkFic3RyYWN0UHJveHlTZXJ2ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3h5UnVudGltZVNlcnZlciBleHRlbmRzIEFic3RyYWN0UHJveHlTZXJ2ZXIgewotCi0JLyoKLQkgKiBFdmVudCBxdWV1ZSBmb3IgaW5jb21pbmcgZXZlbnRzLgotCSAqLwotCXByaXZhdGUgTGlua2VkQmxvY2tpbmdRdWV1ZTxJUHJveHlFdmVudD4JZXZlbnRzID0gCi0JCW5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPElQcm94eUV2ZW50PigpOwotCi0JcHVibGljIEFic3RyYWN0UHJveHlSdW50aW1lU2VydmVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotCQlzdXBlcihob3N0LCBwb3J0LCBuZXcgUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbmRFdmVudChJUHJveHlFdmVudCBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKGV2ZW50cykgewotCQkJZXZlbnRzLmFkZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3J1bnRpbWUvc2VydmVyL0lQcm94eVJ1bnRpbWVDb21tYW5kTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9zZXJ2ZXIvSVByb3h5UnVudGltZUNvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzdhOGZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvcnVudGltZS9zZXJ2ZXIvSVByb3h5UnVudGltZUNvbW1hbmRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuc2VydmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lSW5pdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UnVudGltZUNvbW1hbmRMaXN0ZW5lciB7Ci0JLyoqCi0JICogQHBhcmFtIGMKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVDb21tYW5kKElQcm94eVJ1bnRpbWVJbml0Q29tbWFuZCBjKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYwotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbW1hbmQoSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCBjKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYwotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbW1hbmQoSVByb3h5UnVudGltZVN0YXJ0RXZlbnRzQ29tbWFuZCBjKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYwotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbW1hbmQoSVByb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kIGMpOwotCQotCS8qKgotCSAqIEBwYXJhbSBjCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlQ29tbWFuZChJUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZCBjKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYwotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbW1hbmQoSVByb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQgYyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3NlcnZlci9BYnN0cmFjdFByb3h5U2VydmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3NlcnZlci9BYnN0cmFjdFByb3h5U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTA4NDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvc3JjL29yZy9lY2xpcHNlL3B0cC9wcm94eS9zZXJ2ZXIvQWJzdHJhY3RQcm94eVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnNlcnZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlFeHRlbmRlZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5UXVpdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnBhY2tldC5Qcm94eVBhY2tldDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlTZXJ2ZXIgaW1wbGVtZW50cyBJUHJveHlTZXJ2ZXIgewotCXByaXZhdGUgZW51bSBTZXJ2ZXJTdGF0ZSB7V0FJVElORywgQ09OTkVDVEVELCBSVU5OSU5HLCBTSFVUVElOR19ET1dOLCBTSFVURE9XTn0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9FUlJPUlMgPSA1OwotCQotCXByaXZhdGUgU2VydmVyU3RhdGUgCQkJCXN0YXRlID0gU2VydmVyU3RhdGUuU0hVVERPV047Ci0KLQlwcml2YXRlIFN0cmluZwkJCQkJCXNlc3NIb3N0OwotCXByaXZhdGUgaW50CQkJCQkJCXNlc3NQb3J0OwotCXByaXZhdGUgU29ja2V0IAkJCQkJCXNlc3NTb2NrZXQ7Ci0JcHJpdmF0ZSBSZWFkYWJsZUJ5dGVDaGFubmVsIAkJc2Vzc0lucHV0OwotCXByaXZhdGUgSVByb3h5Q29tbWFuZEZhY3RvcnkJCXByb3h5Q29tbWFuZEZhY3Rvcnk7Ci0JcHJpdmF0ZSBUaHJlYWQJCQkJCQljb21tYW5kVGhyZWFkOwotCXByaXZhdGUgTGlzdDxJUHJveHlDb21tYW5kTGlzdGVuZXI+CWxpc3RlbmVycyA9IAotCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8SVByb3h5Q29tbWFuZExpc3RlbmVyPigpKTsKLQotCXB1YmxpYyBBYnN0cmFjdFByb3h5U2VydmVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgSVByb3h5Q29tbWFuZEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLnNlc3NIb3N0ID0gaG9zdDsKLQkJdGhpcy5zZXNzUG9ydCA9IHBvcnQ7Ci0JCXRoaXMucHJveHlDb21tYW5kRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5zZXJ2ZXIuSVByb3h5U2VydmVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLklQcm94eUNvbW1hbmRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJUHJveHlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnNlcnZlci5JUHJveHlTZXJ2ZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5Q29tbWFuZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElQcm94eUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc2Vzc1NvY2tldCA9IG5ldyBTb2NrZXQoc2Vzc0hvc3QsIHNlc3NQb3J0KTsKLQkJc2Vzc0lucHV0ID0gc2Vzc1NvY2tldC5nZXRDaGFubmVsKCk7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IGEgdGhyZWFkIHRvIHByb2Nlc3MgY29tbWFuZHMgZnJvbSB0aGUgcHJveHkgYnkgcmVwZWF0ZWRseSAKLQkgKiBjYWxsaW5nIHNlc3Npb25Qcm9ncmVzcygpLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJY29tbWFuZFRocmVhZCA9IG5ldyBUaHJlYWQoIlByb3h5IFNlcnZlciBDb21tYW5kIFRocmVhZCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCQkJaW50IGVycm9yQ291bnQgPSAwOwkJCQotCQkJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VydmVyIGNvbW1hbmQgdGhyZWFkIHN0YXJ0aW5nLi4uIik7Ci0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKGVycm9yQ291bnQgPCBNQVhfRVJST1JTICYmICFpc0ludGVycnVwdGVkKCkpIHsKLQkJCQkJCXN5bmNocm9uaXplZChzdGF0ZSkgewotCQkJCQkJCWlmIChzdGF0ZSA9PSBTZXJ2ZXJTdGF0ZS5TSFVURE9XTikgewotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIXNlc3Npb25Qcm9ncmVzcygpKSB7Ci0JCQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlzeW5jaHJvbml6ZWQoc3RhdGUpIHsKLQkJCQkJCWlmICghaXNJbnRlcnJ1cHRlZCgpICYmIHN0YXRlICE9IFNlcnZlclN0YXRlLlNIVVRUSU5HX0RPV04pIHsKLQkJCQkJCQllcnJvciA9IHRydWU7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJldmVudCB0aHJlYWQgSU9FeGNlcHRpb24gLiAuIC4gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gCi0JCQkJCi0JCQkJaWYgKGVycm9yQ291bnQgPj0gTUFYX0VSUk9SUykgewotCQkJCQllcnJvciA9IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCXNlc3NTb2NrZXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfSAKLQkJCQkKLQkJCQlzeW5jaHJvbml6ZWQoc3RhdGUpIHsKLQkJCQkJc3RhdGUgPSBTZXJ2ZXJTdGF0ZS5TSFVURE9XTjsKLQkJCQl9Ci0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlcnZlciB0aHJlYWQgZXhpdGVkIik7Ci0JCQkJaWYgKGVycm9yKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIGR1ZSB0byBlcnJvcnMiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBub3JtYWxseSIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJY29tbWFuZFRocmVhZC5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgY29tbWFuZHMgZnJvbSB0aGUgd2lyZQotCSAqIAotCSAqIEByZXR1cm4gCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXNzaW9uUHJvZ3Jlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm94eVBhY2tldCBwYWNrZXQgPSBuZXcgUHJveHlQYWNrZXQoKTsKLQkJaWYgKCFwYWNrZXQucmVhZChzZXNzSW5wdXQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIE5vdyBjb252ZXJ0IHRoZSBldmVudCBpbnRvIGFuIElQcm94eUV2ZW50Ci0JCSAqLwotCQlJUHJveHlDb21tYW5kIGNtZCA9IHByb3h5Q29tbWFuZEZhY3RvcnkudG9Db21tYW5kKHBhY2tldCk7Ci0JCQkJCi0JCWlmIChjbWQgIT0gbnVsbCkgewotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElQcm94eVF1aXRDb21tYW5kKSB7Ci0JCQkJZmlyZVByb3h5UXVpdENvbW1hbmQoKElQcm94eVF1aXRDb21tYW5kKWNtZCk7Ci0JCQl9IGVsc2UgaWYgKGNtZCBpbnN0YW5jZW9mIElQcm94eUV4dGVuZGVkQ29tbWFuZCkgewotCQkJCWZpcmVQcm94eUV4dGVuZGVkQ29tbWFuZCgoSVByb3h5RXh0ZW5kZWRDb21tYW5kKWNtZCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgY29tbWFuZCB0byBjb21tYW5kIGhhbmRsZXJzCi0JICogCi0JICogQHBhcmFtIGNtZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm94eUV4dGVuZGVkQ29tbWFuZChJUHJveHlFeHRlbmRlZENvbW1hbmQgY21kKSB7Ci0JCUlQcm94eUNvbW1hbmRMaXN0ZW5lcltdIGxhID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElQcm94eUNvbW1hbmRMaXN0ZW5lclswXSk7Ci0JCWZvciAoSVByb3h5Q29tbWFuZExpc3RlbmVyIGxpc3RlbmVyIDogbGEpIHsKLQkJCWxpc3RlbmVyLmhhbmRsZUNvbW1hbmQoY21kKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGNvbW1hbmQgdG8gY29tbWFuZCBoYW5kbGVycwotCSAqIAotCSAqIEBwYXJhbSBjbWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlRdWl0Q29tbWFuZChJUHJveHlRdWl0Q29tbWFuZCBjbWQpIHsKLQkJSVByb3h5Q29tbWFuZExpc3RlbmVyW10gbGEgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVByb3h5Q29tbWFuZExpc3RlbmVyWzBdKTsKLQkJZm9yIChJUHJveHlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgOiBsYSkgewotCQkJbGlzdGVuZXIuaGFuZGxlQ29tbWFuZChjbWQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC9zcmMvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3NlcnZlci9JUHJveHlTZXJ2ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvc2VydmVyL0lQcm94eVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDk3ZTRhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3NyYy9vcmcvZWNsaXBzZS9wdHAvcHJveHkvc2VydmVyL0lQcm94eVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucHJveHkuc2VydmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmNvbW1hbmQuSVByb3h5Q29tbWFuZExpc3RlbmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVNlcnZlciB7Ci0JLyoqCi0JICogQWRkIGxpc3RlbmVyIHRvIHJlY2VpdmUgcHJveHkgY29tbWFuZHMKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgbGlzdGVuZXIgdG8gcmVjZWl2ZSBjb21tYW5kcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElQcm94eUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGxpc3RlbmVyIGZyb20gcmVjZWl2aW5nIHByb3h5IGNvbW1hbmRzCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIGxpc3RlbmVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElQcm94eUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC91dGlsL29yZy9lY2xpcHNlL3B0cC9wcm94eS91dGlsL0RlYnVnT3B0aW9ucy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wvdXRpbC9vcmcvZWNsaXBzZS9wdHAvcHJveHkvdXRpbC9EZWJ1Z09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5ZWNkMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC91dGlsL29yZy9lY2xpcHNlL3B0cC9wcm94eS91dGlsL0RlYnVnT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZWJ1Z09wdGlvbnMgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBDTElFTlRfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgaW50IFNFUlZFUl9ERUJVR19MRVZFTCA9IDA7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFBST1RPQ09MX1RSQUNJTkcgPSBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3V0aWwvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3V0aWwvUHJvdG9jb2xVdGlsLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbC91dGlsL29yZy9lY2xpcHNlL3B0cC9wcm94eS91dGlsL1Byb3RvY29sVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ5Mzg5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sL3V0aWwvb3JnL2VjbGlwc2UvcHRwL3Byb3h5L3V0aWwvUHJvdG9jb2xVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnByb3h5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnBhY2tldC5Qcm94eVBhY2tldDsKLQotcHVibGljIGNsYXNzIFByb3RvY29sVXRpbCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSEVYQURFQ0lNQUwgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE9DVEFMID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCSU5BUlkgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFQ0lNQUwgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVyA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTkFUVVJBTCA9IDU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGTE9BVCA9IDEwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFERFJFU1MgPSAxMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTlNUUlVDVElPTiA9IDEyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQVIgPSAxMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFJJTkcgPSAxNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlNJR05FRCA9IDE1OwotCi0JLyoqCi0JICogRGVjb2RlIGEgc3RyaW5nIGludG8gYSBCaWdJbnRlZ2VyCi0JICogCi0JICogQHBhcmFtIGFkZHJlc3MKLQkgKiBAcmV0dXJuIEJpZ0ludGVnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgZGVjb2RlQWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgewotCQlpbnQgaW5kZXggPSAwOwotCQlpbnQgcmFkaXggPSAxMDsKLQkJYm9vbGVhbiBuZWdhdGl2ZSA9IGZhbHNlOwotCi0JCS8vIEhhbmRsZSB6ZXJvIGxlbmd0aAotCQlhZGRyZXNzID0gYWRkcmVzcy50cmltKCk7Ci0JCWlmIChhZGRyZXNzLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBCaWdJbnRlZ2VyLlpFUk87Ci0JCX0KLQotCQkvLyBIYW5kbGUgbWludXMgc2lnbiwgaWYgcHJlc2VudAotCQlpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCItIikpIHsKLQkJCW5lZ2F0aXZlID0gdHJ1ZTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgiMHgiLCBpbmRleCkgfHwgYWRkcmVzcy5zdGFydHNXaXRoKCIwWCIsIGluZGV4KSkgewotCQkJaW5kZXggKz0gMjsKLQkJCXJhZGl4ID0gMTY7Ci0JCX0gZWxzZSBpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCIjIiwgaW5kZXgpKSB7Ci0JCQlpbmRleCArKzsKLQkJCXJhZGl4ID0gMTY7Ci0JCX0gZWxzZSBpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCIwIiwgaW5kZXgpICYmIGFkZHJlc3MubGVuZ3RoKCkgPiAxICsgaW5kZXgpIHsKLQkJCWluZGV4ICsrOwotCQkJcmFkaXggPSA4OwotCQl9Ci0KLQkJaWYgKGluZGV4ID4gMCkgewotCQkJYWRkcmVzcyA9IGFkZHJlc3Muc3Vic3RyaW5nKGluZGV4KTsKLQkJfQotCQlpZiAobmVnYXRpdmUpIHsKLQkJCWFkZHJlc3MgPSAiLSIgKyBhZGRyZXNzOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoYWRkcmVzcywgcmFkaXgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJLy8gLi4uCi0JCQkvLyBXaGF0IGNhbiB3ZSBkbyA/Pz8KLQkJfQotCQlyZXR1cm4gQmlnSW50ZWdlci5aRVJPOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGFzIHNlcXVlbmNlIG9mIGhleGFkZWNpbWFsIHZhbHVlcyB0byBhIEphdmEgYnl0ZSBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybiBieXRlIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlQnl0ZXMoU3RyaW5nIHN0cikgewotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpLzI7Ci0JCWJ5dGVbXSBzdHJCeXRlcyA9IG5ldyBieXRlW2xlbl07Ci0JCQotCQlmb3IgKGludCBpID0gMCwgcCA9IDA7IGkgPCBsZW47IGkrKywgcCArPSAyKSB7Ci0JCQlieXRlIGMgPSAoYnl0ZSkgKChDaGFyYWN0ZXIuZGlnaXQoc3RyLmNoYXJBdChwKSwgMTYpICYgMHhmKSA8PCA0KTsKLQkJCWMgfD0gKGJ5dGUpICgoQ2hhcmFjdGVyLmRpZ2l0KHN0ci5jaGFyQXQocCsxKSwgMTYpICYgMHhmKSk7Ci0JCQlzdHJCeXRlc1tpXSA9IGM7Ci0JCX0KLQkJCi0JCXJldHVybiBzdHJCeXRlczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcHJveHkgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgaW50byBhIEphdmEgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGJ1ZgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEByZXR1cm4gcHJveHkgc3RyaW5nIGNvbnZlcnRlZCB0byBKYXZhIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZyhDaGFyQnVmZmVyIGJ1ZiwgaW50IHN0YXJ0KSB7Ci0JCWludCBlbmQgPSBzdGFydCArIFByb3h5UGFja2V0LlBBQ0tFVF9BUkdfTEVOX1NJWkU7Ci0JCWludCBsZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGJ1Zi5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKS50b1N0cmluZygpLCAxNik7Ci0JCXN0YXJ0ID0gZW5kICsgMTsgLy8gU2tpcCAnOicKLQkJZW5kID0gc3RhcnQgKyBsZW47Ci0JCXJldHVybiBidWYuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhbiBpbnRlZ2VyIHRvIGl0J3MgcHJveHkgcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gdmFsCi0JICogQHBhcmFtIGxlbgotCSAqIEByZXR1cm4gcHJveHkgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVJbnRWYWwoaW50IHZhbCwgaW50IGxlbikgewotCQljaGFyW10gcmVzID0gbmV3IGNoYXJbbGVuXTsKLQkJU3RyaW5nIHN0ciA9IEludGVnZXIudG9IZXhTdHJpbmcodmFsKTsKLQkJaW50IHJlbSA9IGxlbiAtIHN0ci5sZW5ndGgoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbiA7IGkrKykgewotCQkJaWYgKGkgPCByZW0pCi0JCQkJcmVzW2ldID0gJzAnOwotCQkJZWxzZQotCQkJCXJlc1tpXSA9IHN0ci5jaGFyQXQoaSAtIHJlbSk7Ci0JCX0KLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHJlcyk7Ci0JfQotCi0JLyoqCi0JICogRW5jb2RlIGEgc3RyaW5nIGludG8gaXQncyBwcm94eSByZXByZXNlbnRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuIHByb3h5IHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlU3RyaW5nKFN0cmluZyBzdHIpIHsKLQkJaW50IGxlbjsKLQkJCi0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJbGVuID0gMDsKLQkJCXN0ciA9ICIiOwotCQl9IGVsc2UgewotCQkJbGVuID0gc3RyLmxlbmd0aCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZW5jb2RlSW50VmFsKGxlbiwgUHJveHlQYWNrZXQuUEFDS0VUX0FSR19MRU5fU0laRSkgKyAiOiIgKyBzdHI7CQkKLQl9CQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS8uY2R0cHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5jZHRwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJkMDZjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZS1jZHQgdmVyc2lvbj0iMi4wIj8+Ci0KLTxjZHRwcm9qZWN0IGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2UiPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5NYWNoTyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciI+Ci08YXR0cmlidXRlIGtleT0iYysrZmlsdCIgdmFsdWU9ImMrK2ZpbHQiLz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNJbmRleGVyIi8+Ci08ZGF0YT4KLTxpdGVtIGlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9pdGVtPgotPGl0ZW0gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9pdGVtPgotCi0KLTwvZGF0YT4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5jcHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5jcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjZmQ4Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS8uY3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9maWxlVmVyc2lvbiA0LjAuMD8+Ci0KLTxjcHJvamVjdD4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyI+Ci08Y2NvbmZpZ3VyYXRpb24gaWQ9ImNvbnZlcnRlZC5jb25maWcuODg3NzYzODMzIj4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgYnVpbGRTeXN0ZW1JZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZGVmYXVsdENvbmZpZ0RhdGFQcm92aWRlciIgaWQ9ImNvbnZlcnRlZC5jb25maWcuODg3NzYzODMzIiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9ImNvbnZlcnRlZENvbmZpZyI+Ci08ZXh0ZXJuYWxTZXR0aW5ncy8+Ci08ZXh0ZW5zaW9ucz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbXNvdXJjZWluZGV4ZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5DSW5kZXhlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5NYWNoTyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciI+Ci08YXR0cmlidXRlIGtleT0iYysrZmlsdCIgdmFsdWU9ImMrK2ZpbHQiLz4KLTwvZXh0ZW5zaW9uPgotPC9leHRlbnNpb25zPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5sYW5ndWFnZS5tYXBwaW5nIi8+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZHRhcmdldHMiPgotPGJ1aWxkVGFyZ2V0cz4KLTx0YXJnZXQgbmFtZT0iYWxsIiBwYXRoPSIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+YWxsPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+dHJ1ZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08cnVuQWxsQnVpbGRlcnM+dHJ1ZTwvcnVuQWxsQnVpbGRlcnM+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iY2xlYW4iIHBhdGg9IiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzLz4KLTxidWlsZFRhcmdldD5jbGVhbjwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPHJ1bkFsbEJ1aWxkZXJzPnRydWU8L3J1bkFsbEJ1aWxkZXJzPgotPC90YXJnZXQ+Ci08L2J1aWxkVGFyZ2V0cz4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY2NvbmZpZ3VyYXRpb24+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08L2Nwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvLmN2c2lnbm9yZSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjA5ODcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLmRlcHMKLXN0YW1wLWgxCi1saWJ0b29sCi1jb25maWcuc3RhdHVzCi1NYWtlZmlsZQotY29uZmlnLmgKLWF1dG9tNHRlLmNhY2hlCi0qLmEKLWEub3V0LmRTWU0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTdmOGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucHJveHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2VCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmFyZ3VtZW50czwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0LmNvcmUuZXJyb3JPdXRwdXRQYXJzZXI8L2tleT4KLQkJCQkJPHZhbHVlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLk1ha2VFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5WQ0Vycm9yUGFyc2VyOzwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW52aXJvbm1lbnQ8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQXV0b0J1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuaW5jPC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUZ1bGxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlZEluY3JlbWVudGFsQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmxvY2F0aW9uPC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmNvbW1hbmQ8L2tleT4KLQkJCQkJPHZhbHVlPm1ha2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLnRhcmdldC5jbGVhbjwva2V5PgotCQkJCQk8dmFsdWU+Y2xlYW48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUNsZWFuQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFwcGVuZF9lbnZpcm9ubWVudDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmZ1bGw8L2tleT4KLQkJCQkJPHZhbHVlPmNsZWFuIGFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUudXNlRGVmYXVsdEJ1aWxkQ21kPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuYXV0bzwva2V5PgotCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5zdG9wT25FcnJvcjwva2V5PgotCQkJCQk8dmFsdWU+ZmFsc2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuU2Nhbm5lckNvbmZpZ0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZU5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuU2Nhbm5lckNvbmZpZ05hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlN2U5MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY2R0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgTWF5IDAxIDEyOjU5OjEyIE1EVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5kZXhlci9pbmRleGVySWQ9b3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlcgotaW5kZXhlcklkPW9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbXNvdXJjZWluZGV4ZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L0FVVEhPUlMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWNiZmJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L0FVVEhPUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HcmVnIFdhdHNvbiA8Zy53YXRzb25AY29tcHV0ZXIub3JnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L0NPUFlJTkcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdlMTA1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLUFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLW1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIAotTEEtQ0MgMDQtMTE1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvQ2hhbmdlTG9nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L0NoYW5nZUxvZworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9JTlNUQUxMIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhMDZiMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9JTlNUQUxMCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotUFRQIFNjYWxhYmxlIERlYnVnIE1hbmFnZXIKLQotQmFzaWMgSW5zdGFsbGF0aW9uCi09PT09PT09PT09PT09PT09PT0KLQotVGhlIHNpbXBsZXN0IHdheSB0byBjb21waWxlIHRoaXMgcGFja2FnZSBpczoKLQotICAxLiBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiAnYXV0b21ha2UnIGFuZCAKLSAgICAgJ2xpYnRvb2wnIChhdCB0aGlzIHRpbWUgaXQgaXMgMS45LjYgYW5kIDEuNS4yMCByZXNwZWN0aXZlbHkpLiAKLSAgICAgVGhleSBjYW4gYmUgb2J0YWluZWQgZnJvbSBmdHAuZ251Lm9yZyBpZiBuZWNlc3NhcnkuCi0gICAgIAotICAyLiBSdW4gJ2F1dG9yZWNvbmYnIHdoaWNoIHdpbGwgYnVpbGQgdGhlIHZhcmlvdXMgY29uZmlndXJlIHNjcmlwdHMuCi0KLSAgMy4gQXQgdGhlIHRvcCBsZXZlbCwgcnVuICcuL2NvbmZpZ3VyZScgdG8gY3JlYXRlIHRoZSBNYWtlZmlsZXMuCi0KLSAgNC4gVHlwZSBgbWFrZScgdG8gYnVpbGQgdGhlIHBhY2thZ2UuCi0KLSAgNS4gWW91IGNhbiByZW1vdmUgdGhlIHByb2dyYW0gYmluYXJpZXMgYW5kIG9iamVjdCBmaWxlcyBmcm9tIHRoZQotICAgICBzb3VyY2UgY29kZSBkaXJlY3RvcnkgYnkgdHlwaW5nIGBtYWtlIGNsZWFuJy4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZWE4NjAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucHJveHkKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvTWFrZWZpbGUuYW0gYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmMzRkNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLW5vaW5zdF9MSUJSQVJJRVMgPQkJCWxpYnByb3h5Y2xudC5hIGxpYnByb3h5c3ZyLmEKLQotbGlicHJveHljbG50X2FfU09VUkNFUyA9CXNyYy9wcm94eS5jIFwKLQkJCQkJCQlzcmMvcHJveHlfYXR0ci5jIFwKLQkJCQkJCQlzcmMvcHJveHlfY2xudC5jIFwKLQkJCQkJCQlzcmMvcHJveHlfdGNwLmMgXAotCQkJCQkJCXNyYy9wcm94eV90Y3BfY2xudC5jIFwKLQkJCQkJCQlzcmMvcHJveHlfbXNnLmMKLWxpYnByb3h5Y2xudF9hX0NGTEFHUyA9CQktSS4vaW5jbHVkZSAkKEFNX0NGTEFHUykgLWcKLQotbGlicHJveHlzdnJfYV9TT1VSQ0VTID0JCXNyYy9wcm94eS5jIFwKLQkJCQkJCQlzcmMvcHJveHlfYXR0ci5jIFwKLQkJCQkJCQlzcmMvcHJveHlfc3ZyLmMgXAotCQkJCQkJCXNyYy9wcm94eV9zdGRpby5jIFwKLQkJCQkJCQlzcmMvcHJveHlfc3RkaW9fc3ZyLmMgXAotCQkJCQkJCXNyYy9wcm94eV90Y3AuYyBcCi0JCQkJCQkJc3JjL3Byb3h5X3RjcF9zdnIuYyBcCi0JCQkJCQkJc3JjL3Byb3h5X21zZy5jIFwKLQkJCQkJCQlzcmMvcHJveHlfZXZlbnQuYwotbGlicHJveHlzdnJfYV9DRkxBR1MgPQkJLUkuL2luY2x1ZGUgJChBTV9DRkxBR1MpIC1nCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9NYWtlZmlsZS5pbiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJkOTQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzk0ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotCi1WUEFUSCA9IEBzcmNkaXJACi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLXN1YmRpciA9IC4KLURJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAotCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlIEFVVEhPUlMgQ09QWUlORyBDaGFuZ2VMb2cgSU5TVEFMTCBORVdTIFwKLQljb21waWxlIGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggXAotCW1pc3NpbmcKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1hbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAotIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1MSUJSQVJJRVMgPSAkKG5vaW5zdF9MSUJSQVJJRVMpCi1BUiA9IGFyCi1BUkZMQUdTID0gY3J1Ci1saWJwcm94eWNsbnRfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKLWxpYnByb3h5Y2xudF9hX0xJQkFERCA9Ci1hbV9saWJwcm94eWNsbnRfYV9PQkpFQ1RTID0gbGlicHJveHljbG50X2EtcHJveHkuJChPQkpFWFQpIFwKLQlsaWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLiQoT0JKRVhUKSBcCi0JbGlicHJveHljbG50X2EtcHJveHlfY2xudC4kKE9CSkVYVCkgXAotCWxpYnByb3h5Y2xudF9hLXByb3h5X3RjcC4kKE9CSkVYVCkgXAotCWxpYnByb3h5Y2xudF9hLXByb3h5X3RjcF9jbG50LiQoT0JKRVhUKSBcCi0JbGlicHJveHljbG50X2EtcHJveHlfbXNnLiQoT0JKRVhUKQotbGlicHJveHljbG50X2FfT0JKRUNUUyA9ICQoYW1fbGlicHJveHljbG50X2FfT0JKRUNUUykKLWxpYnByb3h5c3ZyX2FfQVIgPSAkKEFSKSAkKEFSRkxBR1MpCi1saWJwcm94eXN2cl9hX0xJQkFERCA9Ci1hbV9saWJwcm94eXN2cl9hX09CSkVDVFMgPSBsaWJwcm94eXN2cl9hLXByb3h5LiQoT0JKRVhUKSBcCi0JbGlicHJveHlzdnJfYS1wcm94eV9hdHRyLiQoT0JKRVhUKSBcCi0JbGlicHJveHlzdnJfYS1wcm94eV9zdnIuJChPQkpFWFQpIFwKLQlsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLiQoT0JKRVhUKSBcCi0JbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIuJChPQkpFWFQpIFwKLQlsaWJwcm94eXN2cl9hLXByb3h5X3RjcC4kKE9CSkVYVCkgXAotCWxpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci4kKE9CSkVYVCkgXAotCWxpYnByb3h5c3ZyX2EtcHJveHlfbXNnLiQoT0JKRVhUKSBcCi0JbGlicHJveHlzdnJfYS1wcm94eV9ldmVudC4kKE9CSkVYVCkKLWxpYnByb3h5c3ZyX2FfT0JKRUNUUyA9ICQoYW1fbGlicHJveHlzdnJfYV9PQkpFQ1RTKQotREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1TT1VSQ0VTID0gJChsaWJwcm94eWNsbnRfYV9TT1VSQ0VTKSAkKGxpYnByb3h5c3ZyX2FfU09VUkNFUykKLURJU1RfU09VUkNFUyA9ICQobGlicHJveHljbG50X2FfU09VUkNFUykgJChsaWJwcm94eXN2cl9hX1NPVVJDRVMpCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi1hbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCi0gIHsgdGVzdCAhIC1kICQoZGlzdGRpcikgXAotICAgIHx8IHsgZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAotICAgICAgICAgJiYgcm0gLWZyICQoZGlzdGRpcik7IH07IH0KLURJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5negotR1pJUF9FTlYgPSAtLWJlc3QKLWRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLWRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQU1UQVIgPSBAQU1UQVJACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNZR1BBVEhfVyA9IEBDWUdQQVRIX1dACi1ERUZTID0gQERFRlNACi1ERVBESVIgPSBAREVQRElSQAotRUNIT19DID0gQEVDSE9fQ0AKLUVDSE9fTiA9IEBFQ0hPX05ACi1FQ0hPX1QgPSBARUNIT19UQAotRVhFRVhUID0gQEVYRUVYVEAKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1ub2luc3RfTElCUkFSSUVTID0gbGlicHJveHljbG50LmEgbGlicHJveHlzdnIuYQotbGlicHJveHljbG50X2FfU09VUkNFUyA9IHNyYy9wcm94eS5jIFwKLQkJCQkJCQlzcmMvcHJveHlfYXR0ci5jIFwKLQkJCQkJCQlzcmMvcHJveHlfY2xudC5jIFwKLQkJCQkJCQlzcmMvcHJveHlfdGNwLmMgXAotCQkJCQkJCXNyYy9wcm94eV90Y3BfY2xudC5jIFwKLQkJCQkJCQlzcmMvcHJveHlfbXNnLmMKLQotbGlicHJveHljbG50X2FfQ0ZMQUdTID0gLUkuL2luY2x1ZGUgJChBTV9DRkxBR1MpIC1nCi1saWJwcm94eXN2cl9hX1NPVVJDRVMgPSBzcmMvcHJveHkuYyBcCi0JCQkJCQkJc3JjL3Byb3h5X2F0dHIuYyBcCi0JCQkJCQkJc3JjL3Byb3h5X3N2ci5jIFwKLQkJCQkJCQlzcmMvcHJveHlfc3RkaW8uYyBcCi0JCQkJCQkJc3JjL3Byb3h5X3N0ZGlvX3N2ci5jIFwKLQkJCQkJCQlzcmMvcHJveHlfdGNwLmMgXAotCQkJCQkJCXNyYy9wcm94eV90Y3Bfc3ZyLmMgXAotCQkJCQkJCXNyYy9wcm94eV9tc2cuYyBcCi0JCQkJCQkJc3JjL3Byb3h5X2V2ZW50LmMKLQotbGlicHJveHlzdnJfYV9DRkxBR1MgPSAtSS4vaW5jbHVkZSAkKEFNX0NGTEFHUykgLWcKLWFsbDogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAub2JqCi1hbS0tcmVmcmVzaDoKLQlAOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICBlY2hvICcgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICc7IFwKLQkgICAgICBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIFwKLQkJJiYgZXhpdCAwOyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgTWFrZWZpbGUnOyBcCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSAgTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAotCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKLQotY29uZmlnLmg6IHN0YW1wLWgxCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JICBybSAtZiBzdGFtcC1oMTsgXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IFwKLQllbHNlIDo7IGZpCi0KLXN0YW1wLWgxOiAkKHNyY2RpcikvY29uZmlnLmguaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAcm0gLWYgc3RhbXAtaDEKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi0kKHNyY2RpcikvY29uZmlnLmguaW46ICAkKGFtX19jb25maWd1cmVfZGVwcykgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0Jcm0gLWYgc3RhbXAtaDEKLQl0b3VjaCAkQAotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaCBzdGFtcC1oMQotCi1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKLWxpYnByb3h5Y2xudC5hOiAkKGxpYnByb3h5Y2xudF9hX09CSkVDVFMpICQobGlicHJveHljbG50X2FfREVQRU5ERU5DSUVTKSAKLQktcm0gLWYgbGlicHJveHljbG50LmEKLQkkKGxpYnByb3h5Y2xudF9hX0FSKSBsaWJwcm94eWNsbnQuYSAkKGxpYnByb3h5Y2xudF9hX09CSkVDVFMpICQobGlicHJveHljbG50X2FfTElCQUREKQotCSQoUkFOTElCKSBsaWJwcm94eWNsbnQuYQotbGlicHJveHlzdnIuYTogJChsaWJwcm94eXN2cl9hX09CSkVDVFMpICQobGlicHJveHlzdnJfYV9ERVBFTkRFTkNJRVMpIAotCS1ybSAtZiBsaWJwcm94eXN2ci5hCi0JJChsaWJwcm94eXN2cl9hX0FSKSBsaWJwcm94eXN2ci5hICQobGlicHJveHlzdnJfYV9PQkpFQ1RTKSAkKGxpYnByb3h5c3ZyX2FfTElCQUREKQotCSQoUkFOTElCKSBsaWJwcm94eXN2ci5hCi0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICouJChPQkpFWFQpCi0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfYXR0ci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfY2xudC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfbXNnLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV90Y3AuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcF9jbG50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X2F0dHIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfbXNnLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvX3N2ci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdnIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3RjcF9zdnIuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLm9iajoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotbGlicHJveHljbG50X2EtcHJveHkubzogc3JjL3Byb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eWNsbnRfYS1wcm94eS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eS5UcG8gLWMgLW8gbGlicHJveHljbG50X2EtcHJveHkubyBgdGVzdCAtZiAnc3JjL3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHkuVHBvICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5LmMnIG9iamVjdD0nbGlicHJveHljbG50X2EtcHJveHkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHljbG50X2EtcHJveHkubyBgdGVzdCAtZiAnc3JjL3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eS5jCi0KLWxpYnByb3h5Y2xudF9hLXByb3h5Lm9iajogc3JjL3Byb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eWNsbnRfYS1wcm94eS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5LlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHkuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5LlRwbyAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eS5jJyBvYmplY3Q9J2xpYnByb3h5Y2xudF9hLXByb3h5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHljbG50X2EtcHJveHkub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5LmMnOyBmaWAKLQotbGlicHJveHljbG50X2EtcHJveHlfYXR0ci5vOiBzcmMvcHJveHlfYXR0ci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHljbG50X2EtcHJveHlfYXR0ci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9hdHRyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV9hdHRyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLlRwbyAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfYXR0ci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X2F0dHIuYycgb2JqZWN0PSdsaWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5Y2xudF9hLXByb3h5X2F0dHIubyBgdGVzdCAtZiAnc3JjL3Byb3h5X2F0dHIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X2F0dHIuYwotCi1saWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLm9iajogc3JjL3Byb3h5X2F0dHIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5Y2xudF9hLXByb3h5X2F0dHIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9hdHRyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X2F0dHIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfYXR0ci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfYXR0ci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfYXR0ci5UcG8gJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X2F0dHIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9hdHRyLmMnIG9iamVjdD0nbGlicHJveHljbG50X2EtcHJveHlfYXR0ci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5Y2xudF9hLXByb3h5X2F0dHIub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfYXR0ci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eV9hdHRyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9hdHRyLmMnOyBmaWAKLQotbGlicHJveHljbG50X2EtcHJveHlfY2xudC5vOiBzcmMvcHJveHlfY2xudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHljbG50X2EtcHJveHlfY2xudC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9jbG50LlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9jbG50Lm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9jbG50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV9jbG50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9jbG50LlRwbyAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfY2xudC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X2NsbnQuYycgb2JqZWN0PSdsaWJwcm94eWNsbnRfYS1wcm94eV9jbG50Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5Y2xudF9hLXByb3h5X2NsbnQubyBgdGVzdCAtZiAnc3JjL3Byb3h5X2NsbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X2NsbnQuYwotCi1saWJwcm94eWNsbnRfYS1wcm94eV9jbG50Lm9iajogc3JjL3Byb3h5X2NsbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5Y2xudF9hLXByb3h5X2NsbnQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9jbG50LlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9jbG50Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X2NsbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfY2xudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfY2xudC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfY2xudC5UcG8gJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X2NsbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9jbG50LmMnIG9iamVjdD0nbGlicHJveHljbG50X2EtcHJveHlfY2xudC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5Y2xudF9hLXByb3h5X2NsbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfY2xudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eV9jbG50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9jbG50LmMnOyBmaWAKLQotbGlicHJveHljbG50X2EtcHJveHlfdGNwLm86IHNyYy9wcm94eV90Y3AuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5Y2xudF9hLXByb3h5X3RjcC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV90Y3AuVHBvIC1jIC1vIGxpYnByb3h5Y2xudF9hLXByb3h5X3RjcC5vIGB0ZXN0IC1mICdzcmMvcHJveHlfdGNwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV90Y3AuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcC5UcG8gJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X3RjcC5jJyBvYmplY3Q9J2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV90Y3AubyBgdGVzdCAtZiAnc3JjL3Byb3h5X3RjcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfdGNwLmMKLQotbGlicHJveHljbG50X2EtcHJveHlfdGNwLm9iajogc3JjL3Byb3h5X3RjcC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHljbG50X2EtcHJveHlfdGNwLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfdGNwLlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV90Y3Aub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfdGNwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X3RjcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfdGNwLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV90Y3AuVHBvICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV90Y3AuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV90Y3AuYycgb2JqZWN0PSdsaWJwcm94eWNsbnRfYS1wcm94eV90Y3Aub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV90Y3Aub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfdGNwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X3RjcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfdGNwLmMnOyBmaWAKLQotbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQubzogc3JjL3Byb3h5X3RjcF9jbG50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eWNsbnRfYS1wcm94eV90Y3BfY2xudC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV90Y3BfY2xudC5UcG8gLWMgLW8gbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQubyBgdGVzdCAtZiAnc3JjL3Byb3h5X3RjcF9jbG50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV90Y3BfY2xudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQuVHBvICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV90Y3BfY2xudC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X3RjcF9jbG50LmMnIG9iamVjdD0nbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQubyBgdGVzdCAtZiAnc3JjL3Byb3h5X3RjcF9jbG50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV90Y3BfY2xudC5jCi0KLWxpYnByb3h5Y2xudF9hLXByb3h5X3RjcF9jbG50Lm9iajogc3JjL3Byb3h5X3RjcF9jbG50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5Y2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eWNsbnRfYS1wcm94eV90Y3BfY2xudC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcF9jbG50LlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV90Y3BfY2xudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV90Y3BfY2xudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eV90Y3BfY2xudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfdGNwX2NsbnQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcF9jbG50LlRwbyAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV90Y3BfY2xudC5jJyBvYmplY3Q9J2xpYnByb3h5Y2xudF9hLXByb3h5X3RjcF9jbG50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHljbG50X2EtcHJveHlfdGNwX2NsbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfdGNwX2NsbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfdGNwX2NsbnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5X3RjcF9jbG50LmMnOyBmaWAKLQotbGlicHJveHljbG50X2EtcHJveHlfbXNnLm86IHNyYy9wcm94eV9tc2cuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHljbG50X2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5Y2xudF9hLXByb3h5X21zZy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9tc2cuVHBvIC1jIC1vIGxpYnByb3h5Y2xudF9hLXByb3h5X21zZy5vIGB0ZXN0IC1mICdzcmMvcHJveHlfbXNnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV9tc2cuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X21zZy5UcG8gJChERVBESVIpL2xpYnByb3h5Y2xudF9hLXByb3h5X21zZy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X21zZy5jJyBvYmplY3Q9J2xpYnByb3h5Y2xudF9hLXByb3h5X21zZy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9tc2cubyBgdGVzdCAtZiAnc3JjL3Byb3h5X21zZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfbXNnLmMKLQotbGlicHJveHljbG50X2EtcHJveHlfbXNnLm9iajogc3JjL3Byb3h5X21zZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHljbG50X2EtcHJveHlfbXNnLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHljbG50X2EtcHJveHlfbXNnLlRwbyAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9tc2cub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfbXNnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X21zZy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfbXNnLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9tc2cuVHBvICQoREVQRElSKS9saWJwcm94eWNsbnRfYS1wcm94eV9tc2cuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9tc2cuYycgb2JqZWN0PSdsaWJwcm94eWNsbnRfYS1wcm94eV9tc2cub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eWNsbnRfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eWNsbnRfYS1wcm94eV9tc2cub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfbXNnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X21zZy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfbXNnLmMnOyBmaWAKLQotbGlicHJveHlzdnJfYS1wcm94eS5vOiBzcmMvcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHlzdnJfYS1wcm94eS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5LlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5Lm8gYHRlc3QgLWYgJ3NyYy9wcm94eS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHkuVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHJveHkuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eS5vIGB0ZXN0IC1mICdzcmMvcHJveHkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5LmMKLQotbGlicHJveHlzdnJfYS1wcm94eS5vYmo6IHNyYy9wcm94eS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eS5UcG8gLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHkuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHkuVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHJveHkuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eS5jJzsgZmlgCi0KLWxpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5vOiBzcmMvcHJveHlfYXR0ci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5X2F0dHIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9hdHRyLlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X2F0dHIubyBgdGVzdCAtZiAnc3JjL3Byb3h5X2F0dHIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X2F0dHIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5UcG8gJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X2F0dHIuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X2F0dHIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X2F0dHIubyBgdGVzdCAtZiAnc3JjL3Byb3h5X2F0dHIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X2F0dHIuYwotCi1saWJwcm94eXN2cl9hLXByb3h5X2F0dHIub2JqOiBzcmMvcHJveHlfYXR0ci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5X2F0dHIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X2F0dHIuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV9hdHRyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X2F0dHIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5X2F0dHIuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5UcG8gJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X2F0dHIuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X2F0dHIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfYXR0ci5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV9hdHRyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X2F0dHIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5X2F0dHIuYyc7IGZpYAotCi1saWJwcm94eXN2cl9hLXByb3h5X3N2ci5vOiBzcmMvcHJveHlfc3ZyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3N2ci5vIGB0ZXN0IC1mICdzcmMvcHJveHlfc3ZyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV9zdnIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLlRwbyAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdnIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9zdnIuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X3N2ci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9zdnIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X3N2ci5jCi0KLWxpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLm9iajogc3JjL3Byb3h5X3N2ci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5X3N2ci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3N2ci5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV9zdnIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfc3ZyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9zdnIuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfc3ZyLlRwbyAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdnIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9zdnIuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X3N2ci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV9zdnIub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfc3ZyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X3N2ci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfc3ZyLmMnOyBmaWAKLQotbGlicHJveHlzdnJfYS1wcm94eV9zdGRpby5vOiBzcmMvcHJveHlfc3RkaW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHlzdnJfYS1wcm94eV9zdGRpby5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9zdGRpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfc3RkaW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW8uVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHJveHlfc3RkaW8uYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV9zdGRpby5vIGB0ZXN0IC1mICdzcmMvcHJveHlfc3RkaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X3N0ZGlvLmMKLQotbGlicHJveHlzdnJfYS1wcm94eV9zdGRpby5vYmo6IHNyYy9wcm94eV9zdGRpby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdGRpby5UcG8gLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV9zdGRpby5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV9zdGRpby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eV9zdGRpby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfc3RkaW8uYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW8uVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHJveHlfc3RkaW8uYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X3N0ZGlvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X3N0ZGlvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9zdGRpby5jJzsgZmlgCi0KLWxpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW9fc3ZyLm86IHNyYy9wcm94eV9zdGRpb19zdnIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW9fc3ZyLm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9zdGRpb19zdnIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X3N0ZGlvX3N2ci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIuVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvX3N2ci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X3N0ZGlvX3N2ci5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW9fc3ZyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIubyBgdGVzdCAtZiAnc3JjL3Byb3h5X3N0ZGlvX3N2ci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfc3RkaW9fc3ZyLmMKLQotbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIub2JqOiBzcmMvcHJveHlfc3RkaW9fc3ZyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW9fc3ZyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW9fc3ZyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X3N0ZGlvX3N2ci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eV9zdGRpb19zdnIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5X3N0ZGlvX3N2ci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9zdGRpb19zdnIuVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvX3N2ci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X3N0ZGlvX3N2ci5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfc3RkaW9fc3ZyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3N0ZGlvX3N2ci5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV9zdGRpb19zdnIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfc3RkaW9fc3ZyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9zdGRpb19zdnIuYyc7IGZpYAotCi1saWJwcm94eXN2cl9hLXByb3h5X3RjcC5vOiBzcmMvcHJveHlfdGNwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfdGNwLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwLlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3RjcC5vIGB0ZXN0IC1mICdzcmMvcHJveHlfdGNwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV90Y3AuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwLlRwbyAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV90Y3AuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV90Y3AuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X3RjcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfdGNwLm8gYHRlc3QgLWYgJ3NyYy9wcm94eV90Y3AuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X3RjcC5jCi0KLWxpYnByb3h5c3ZyX2EtcHJveHlfdGNwLm9iajogc3JjL3Byb3h5X3RjcC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5X3RjcC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwLlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X3RjcC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV90Y3AuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfdGNwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV90Y3AuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwLlRwbyAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV90Y3AuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV90Y3AuYycgb2JqZWN0PSdsaWJwcm94eXN2cl9hLXByb3h5X3RjcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV90Y3Aub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfdGNwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X3RjcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfdGNwLmMnOyBmaWAKLQotbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLm86IHNyYy9wcm94eV90Y3Bfc3ZyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X3RjcF9zdnIuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vIGB0ZXN0IC1mICdzcmMvcHJveHlfdGNwX3N2ci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfdGNwX3N2ci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLlRwbyAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHJveHlfdGNwX3N2ci5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vIGB0ZXN0IC1mICdzcmMvcHJveHlfdGNwX3N2ci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfdGNwX3N2ci5jCi0KLWxpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vYmo6IHNyYy9wcm94eV90Y3Bfc3ZyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5UcG8gLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X3RjcF9zdnIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfdGNwX3N2ci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfdGNwX3N2ci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLlRwbyAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHJveHlfdGNwX3N2ci5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfdGNwX3N2ci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV90Y3Bfc3ZyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X3RjcF9zdnIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfdGNwX3N2ci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHJveHlfdGNwX3N2ci5jJzsgZmlgCi0KLWxpYnByb3h5c3ZyX2EtcHJveHlfbXNnLm86IHNyYy9wcm94eV9tc2cuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicHJveHlzdnJfYS1wcm94eV9tc2cubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9tc2cuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfbXNnLm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9tc2cuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Byb3h5X21zZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9tc2cuVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X21zZy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X21zZy5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfbXNnLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicHJveHlzdnJfYS1wcm94eV9tc2cubyBgdGVzdCAtZiAnc3JjL3Byb3h5X21zZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfbXNnLmMKLQotbGlicHJveHlzdnJfYS1wcm94eV9tc2cub2JqOiBzcmMvcHJveHlfbXNnLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfbXNnLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9tc2cuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfbXNnLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X21zZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wcm94eV9tc2cuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5X21zZy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9tc2cuVHBvICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X21zZy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Byb3h5X21zZy5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfbXNnLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X21zZy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wcm94eV9tc2cuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfbXNnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9tc2cuYyc7IGZpYAotCi1saWJwcm94eXN2cl9hLXByb3h5X2V2ZW50Lm86IHNyYy9wcm94eV9ldmVudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwcm94eXN2cl9hLXByb3h5X2V2ZW50Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQuVHBvIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQubyBgdGVzdCAtZiAnc3JjL3Byb3h5X2V2ZW50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wcm94eV9ldmVudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9ldmVudC5UcG8gJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9ldmVudC5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlicHJveHlzdnJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X2V2ZW50Lm8gYHRlc3QgLWYgJ3NyYy9wcm94eV9ldmVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHJveHlfZXZlbnQuYwotCi1saWJwcm94eXN2cl9hLXByb3h5X2V2ZW50Lm9iajogc3JjL3Byb3h5X2V2ZW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnByb3h5c3ZyX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwcm94eXN2cl9hLXByb3h5X2V2ZW50LlRwbyAtYyAtbyBsaWJwcm94eXN2cl9hLXByb3h5X2V2ZW50Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Byb3h5X2V2ZW50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Byb3h5X2V2ZW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wcm94eV9ldmVudC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicHJveHlzdnJfYS1wcm94eV9ldmVudC5UcG8gJChERVBESVIpL2xpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wcm94eV9ldmVudC5jJyBvYmplY3Q9J2xpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJwcm94eXN2cl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnByb3h5c3ZyX2EtcHJveHlfZXZlbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHJveHlfZXZlbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHJveHlfZXZlbnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Byb3h5X2V2ZW50LmMnOyBmaWAKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHRhZ3MgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmIGNkICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JdGVzdCAtZCAkKGRpc3RkaXIpIHx8IG1rZGlyICQoZGlzdGRpcikKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCi0JfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKLWRpc3QtZ3ppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtYnppcDI6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXRhclo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1zaGFyOiBkaXN0ZGlyCi0Jc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC16aXA6IGRpc3RkaXIKLQktcm0gLWYgJChkaXN0ZGlyKS56aXAKLQl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKLQkqLnRhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmJ6MiopIFwKLQkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAotCSouemlwKikgXAotCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCi0JZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS9faW5zdAotCWNobW9kIGEtdyAkKGRpc3RkaXIpCi0JZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCi0JICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKLQkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAotCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgJiYgKHsgXAotCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCi0JICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKLQkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKLQkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKLQkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKLQkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKLQkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JwotZGlzdHVuaW5zdGFsbGNoZWNrOgotCUBjZCAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpIFwKLQkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKLQkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAotCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAotCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAotCSAgICAgICAgZmkgOyBcCi0JICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICAgZXhpdCAxOyB9ID4mMgotZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgotCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAotCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKLQkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICBleGl0IDE7IH0gPiYyCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpIGNvbmZpZy5oCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCi0JICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06Ci0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWV4ZWMtYW06Ci0KLWluc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCi0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06Ci0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGFtLS1yZWZyZXNoIGNoZWNrIGNoZWNrLWFtIGNsZWFuIFwKLQljbGVhbi1nZW5lcmljIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjdGFncyBkaXN0IGRpc3QtYWxsIFwKLQlkaXN0LWJ6aXAyIGRpc3QtZ3ppcCBkaXN0LXNoYXIgZGlzdC10YXJaIGRpc3QtemlwIGRpc3RjaGVjayBcCi0JZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBcCi0JZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKLQlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKLQlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAotCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAotCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKLQlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAotCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKLQltb3N0bHljbGVhbi1nZW5lcmljIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgXAotCXVuaW5zdGFsbC1hbQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9ORVdTIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9ORVdTCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L1JFQURNRSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwNTk5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1UaGlzIGlzIHRoZSBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFBUUCBTY2FsYWJsZSBEZWJ1ZyBNYW5hZ2VyIChTRE0pLiBUaGUgU0RNIGlzIGEgZnJhbWV3b3JrIGZvciBkZWJ1Z2dpbmcgcGFyYWxsZWwgcHJvZ3JhbXMuCi1JdCBjb21wcmlzZXMgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOgotCi0xLiBBbiBNUEktYmFzZWQgY2xpZW50L3NlcnZlciBmcmFtZXdvcmsgZm9yIGNvbnRyb2xsaW5nIG11bHRpcGxlIGRpc3RyaWJ1dGVkIHByb2Nlc3Nlcy4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzCi0gICBmcmFtZXdvcmsgaXMgdG8gYXR0YWNoIGJhY2tlbmQgZGVidWdnZXJzIHRvIHRoZSBwcm9jZXNzZXMgYmVpbmcgZGVidWdnZWQsIGFuZCB0byBwcm92aWRlIGEgbGlicmFyeSBpbnRlcmZhY2UKLSAgIHRvIGNvbnRyb2wgdGhlIGRlYnVnZ2luZyBvZiB0aGVzZSBwcm9jZXNzZXMuCi0gICAKLTIuIEEgcHJveHkgbGlicmFyeSB0aGF0IGFsbG93cyB0aGUgY2xpZW50L3NlcnZlciBmcmFtZXdvcmsgdG8gYmUgY29udHJvbGxlZCBmcm9tIGEgcmVtb3RlIGxvY2F0aW9uLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKLSAgIGltcG9ydGFudCwgc2luY2UgaXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBrbm93IHRoZSBsb2NhdGlvbiBvZiB0aGUgU0RNIGNsaWVudCAoaXQgbWF5IGJlIHBsYWNlZCBvbiBhIHJhbmRvbQotICAgbm9kZSBpbiB0aGUgcGFyYWxsZWwgbWFjaGluZSkuCi0KLTMuIEEgSk5JIGxpYnJhcnkgZm9yIGludGVyZmFjaW5nIEphdmEgYXBwbGljYXRpb25zIHRvIHRoZSBwcm94eSBjbGllbnQuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyBsaWtlIEVjbGlwc2UgdG8gY29udHJvbAotICAgdGhlIGRlYnVnIGZyYW1ld29yaywgcmVzcG9uZCB0byBldmVudHMsIGV0Yy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9hYm91dC5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9hY2xvY2FsLm00IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkMWYxNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsODk2ICswLDAgQEAKLSMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjEwIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1tNF9pZihtNF9QQUNLQUdFX1ZFUlNJT04sIFsyLjYxXSwsCi1bbTRfZmF0YWwoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjYxLgotWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoYXQsCi15b3Ugc2hvdWxkIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS5dLCBbNjNdKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KLSMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCi0jIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQotQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAotW2FtX19hcGlfdmVyc2lvbj0nMS4xMCcKLWRubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KLWRubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCi1tNF9pZihbJDFdLCBbMS4xMF0sIFtdLAotICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAotXSkKLQotIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCi0jIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCi0jIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCi1tNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCi0KLSMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCi0jIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQUNfSU5JVF9BVVRPTUFLRS4KLUFDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKLVtBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjEwXSlkbmwKLV9BTV9BVVRPQ09ORl9WRVJTSU9OKG00X1BBQ0tBR0VfVkVSU0lPTildKQotCi0jIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKLSMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KLSMgYCRzcmNkaXInLCBgJHNyY2Rpci8uLicsIG9yIGAkc3JjZGlyLy4uLy4uJy4KLSMKLSMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQotIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAotIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKLSMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCi0jIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCi0jIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQotIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgotIwotIyAkYWNfYXV4X2Rpci9taXNzaW5nCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKLSMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKLSMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKLSMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgotIwotIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgotIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQotIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgYC4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKLSMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KLSMKLSMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCi0jIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgotIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAotIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKLSMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKLSMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KLSMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgotIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCi0jCi0jIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgotIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCi0jIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KLQotQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKLVtkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgotQUNfUFJFUkVRKFsyLjUwXSlkbmwKLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLV0pCi0KLSMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOAotCi0jIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLUFDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCi1bQUNfUFJFUkVRKDIuNTIpZG5sCi0gaWZlbHNlKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKLQlbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCi1BQ19TVUJTVChbJDFfVFJVRV0pZG5sCi1BQ19TVUJTVChbJDFfRkFMU0VdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX1RSVUVdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX0ZBTFNFXSlkbmwKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKAotW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgotICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCi1maV0pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOQotCi0jIFRoZXJlIGFyZSBhIGZldyBkaXJ0eSBoYWNrcyBiZWxvdyB0byBhdm9pZCBsZXR0aW5nIGBBQ19QUk9HX0NDJyBiZQotIyB3cml0dGVuIGluIGNsZWFyLCBpbiB3aGljaCBjYXNlIGF1dG9tYWtlLCB3aGVuIHJlYWRpbmcgYWNsb2NhbC5tNCwKLSMgd2lsbCB0aGluayBpdCBzZWVzIGEgKnVzZSosIGFuZCB0aGVyZWZvcmUgd2lsbCB0cmlnZ2VyIGFsbCBpdCdzCi0jIEMgc3VwcG9ydCBtYWNoaW5lcnkuICBBbHNvIG5vdGUgdGhhdCBpdCBtZWFucyB0aGF0IGF1dG9zY2FuLCBzZWVpbmcKLSMgQ0MgZXRjLiBpbiB0aGUgTWFrZWZpbGUsIHdpbGwgYXNrIGZvciBhbiBBQ19QUk9HX0NDIHVzZS4uLgotCi0KLSMgX0FNX0RFUEVOREVOQ0lFUyhOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KLSMgTkFNRSBpcyAiQ0MiLCAiQ1hYIiwgIkdDSiIsIG9yICJPQkpDIi4KLSMgV2UgdHJ5IGEgZmV3IHRlY2huaXF1ZXMgYW5kIHVzZSB0aGF0IHRvIHNldCBhIHNpbmdsZSBjYWNoZSB2YXJpYWJsZS4KLSMKLSMgV2UgZG9uJ3QgQUNfUkVRVUlSRSB0aGUgY29ycmVzcG9uZGluZyBBQ19QUk9HX0NDIHNpbmNlIHRoZSBsYXR0ZXIgd2FzCi0jIG1vZGlmaWVkIHRvIGludm9rZSBfQU1fREVQRU5ERU5DSUVTKENDKTsgd2Ugd291bGQgaGF2ZSBhIGNpcmN1bGFyCi0jIGRlcGVuZGVuY3ksIGFuZCBnaXZlbiB0aGF0IHRoZSB1c2VyIGlzIG5vdCBleHBlY3RlZCB0byBydW4gdGhpcyBtYWNybywKLSMganVzdCByZWx5IG9uIEFDX1BST0dfQ0MuCi1BQ19ERUZVTihbX0FNX0RFUEVOREVOQ0lFU10sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0RFUERJUl0pZG5sCi1BQ19SRVFVSVJFKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10pZG5sCi1BQ19SRVFVSVJFKFtBTV9NQUtFX0lOQ0xVREVdKWRubAotQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKLQotaWZlbHNlKFskMV0sIENDLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgT0JKQywgW2RlcGNjPSIkT0JKQyIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICBbJDFdLCBVUEMsICBbZGVwY2M9IiRVUEMiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCi0KLUFDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCi0gICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLAotW2lmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAotICBmaQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotXSkKLUFDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQotQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKLV0pCi0KLQotIyBBTV9TRVRfREVQRElSCi0jIC0tLS0tLS0tLS0tLS0KLSMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCi0jIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUwotQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1BQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCi1dKQotCi0KLSMgQU1fREVQX1RSQUNLCi0jIC0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCi1bQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAotWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCi1BQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV0pCi0KLSMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4gICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotI3NlcmlhbCAzCi0KLSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgotICBpZiBzZWQgMTBxICIkbWYiIHwgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGRpcnBhcnQ9YEFTX0RJUk5BTUUoIiRtZiIpYAotICBlbHNlCi0gICAgY29udGludWUKLSAgZmkKLSAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgotICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCi0gIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0Ci0gIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKLSAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKLSAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKLSAgIyBleHBhbnNpb24uCi0gIGZvciBmaWxlIGluIGBzZWQgLW4gIgotICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAotICAgICAgIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbwotICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgotICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKLSAgICBBU19NS0RJUl9QKFskZGlycGFydC8kZmRpcl0pCi0gICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKLSAgZG9uZQotZG9uZQotXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotCi0KLSMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgotIwotIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCi0jIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKLSMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KLUFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCi0gICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCi1dKQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEyCi0KLSMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCi0jIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKLSMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQotIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCi0jIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQotIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgotIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKLSMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKLSMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgotIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgotQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAotW0FDX1BSRVJFUShbMi42MF0pZG5sCi1kbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdwotZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCi1tNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KLSAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKLSAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgotICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi1BQ19TVUJTVChbQ1lHUEFUSF9XXSkKLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCi1tNF9pZnZhbChbJDJdLAotW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKLVtfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKLWRubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgotbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCi0gIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAotCi1fQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKLVtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQotQU1fUFJPR19JTlNUQUxMX1NICi1BTV9QUk9HX0lOU1RBTExfU1RSSVAKLUFDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLUFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLV9BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAotICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKLQkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKLV9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKLV0pCi1dKQotCi0KLSMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLSMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi0jIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KLQotIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQotIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCi0jIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KLUFDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKLVsjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkMSB8ICQxOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkMSIgPmBBU19ESVJOQU1FKFskMV0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NICi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgJGluc3RhbGxfc2guCi1BQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iXCQoU0hFTEwpICRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQotQUNfU1VCU1QoaW5zdGFsbF9zaCldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCi0jIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KLUFDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAotW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi1BQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQotCi0jIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIEFNX01BS0VfSU5DTFVERSgpCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCi1BQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKLVthbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCi0jIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCi0jIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0Ci0jIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAotIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCi1pZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KLSAgIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgIGFtX19xdW90ZT0KLSAgIF9hbV9yZXN1bHQ9R05VCi1maQotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCi0gICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQotICAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgIF9hbV9yZXN1bHQ9QlNECi0gICBmaQotZmkKLUFDX1NVQlNUKFthbV9faW5jbHVkZV0pCi1BQ19TVUJTVChbYW1fX3F1b3RlXSkKLUFDX01TR19SRVNVTFQoWyRfYW1fcmVzdWx0XSkKLXJtIC1mIGNvbmZpbmMgY29uZm1mCi1dKQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1Ci0KLSMgQU1fUFJPR19DQ19DX08KLSMgLS0tLS0tLS0tLS0tLS0KLSMgTGlrZSBBQ19QUk9HX0NDX0NfTywgYnV0IGNoYW5nZWQgZm9yIGF1dG9tYWtlLgotQUNfREVGVU4oW0FNX1BST0dfQ0NfQ19PXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDX0NfT10pZG5sCi1BQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFtjb21waWxlXSlkbmwKLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkWzJdIHwgc2VkIFsncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLyddYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19jY18nJHthY19jY31fY19vYFwiICE9IHllcyI7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLWRubCBNYWtlIHN1cmUgQUNfUFJPR19DQyBpcyBuZXZlciBjYWxsZWQgYWdhaW4sIG9yIGl0IHdpbGwgb3ZlcnJpZGUgb3VyCi1kbmwgc2V0dGluZyBvZiBDQy4KLW00X2RlZmluZShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgW200X2ZhdGFsKFtBQ19QUk9HX0NDIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgQU1fUFJPR19DQ19DX09dKV0pCi1dKQotCi0jIEZha2UgdGhlIGV4aXN0ZW5jZSBvZiBwcm9ncmFtcyB0aGF0IEdOVSBtYWludGFpbmVycyB1c2UuICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKLVtBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQotJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9Ci1BQ19TVUJTVCgkMSldKQotCi0KLSMgQU1fTUlTU0lOR19IQVNfUlVOCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCi0jIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQotZmkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfTUtESVJfUAotIyAtLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCi1BQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKLVtBQ19QUkVSRVEoWzIuNjBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKLWRubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKLWRubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgotZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCi1kbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCi1kbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCi1kbmwgTUtESVJfUCkuCi1BQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCi1bbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi0KLSMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKLVtBQ19GT1JFQUNIKFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQotCi0jIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLUFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKLVttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9TQU5JVFlfQ0hFQ0sKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAotIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKLSMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKLSMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCi0jIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKLSMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQotIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCi1bQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWRubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLUFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dGluZyBWQVJJQUJMRSA9IEBWQVJJQUJMRUAgaW4gTWFrZWZpbGUuaW4uCi0jIFRoaXMgbWFjcm8gaXMgdHJhY2VkIGJ5IEF1dG9tYWtlLgotQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIF9BTV9QUk9HX1RBUihGT1JNQVQpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCi0jIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mIGB2NycsIGB1c3RhcicsIG9yIGBwYXgnLgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAotIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQotIyAkdGFyZGlyLgotIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCi0jIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCi0jICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCi1BQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKLVsjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1BTV9NSVNTSU5HX1BST0coW0FNVEFSXSwgW3Rhcl0pCi1tNF9pZihbJDFdLCBbdjddLAotICAgICBbYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nXSwKLSAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKLSAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCi0jIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCi1fYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJwotX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KLSMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAotIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgotZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKLWRvCi0gIGNhc2UgJF9hbV90b29sIGluCi0gIGdudXRhcikKLSAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7Ci0gICAgZG8KLSAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCi0gICAgZG9uZQotICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCi0gICAgOzsKLSAgcGxhaW50YXIpCi0gICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKLSAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgotICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKLSAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3RhciB4ZiAtJwotICAgIDs7Ci0gIHBheCkKLSAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3BheCAtcicKLSAgICA7OwotICBjcGlvKQotICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKLSAgICA7OwotICBub25lKQotICAgIGFtX190YXI9ZmFsc2UKLSAgICBhbV9fdGFyXz1mYWxzZQotICAgIGFtX191bnRhcj1mYWxzZQotICAgIDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgotICAjIGFuZCBhbV9fdW50YXIgc2V0LgotICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKLQotICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQotICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCi0gICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKLSAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKLSAgZmkKLWRvbmUKLXJtIC1yZiBjb25mdGVzdC5kaXIKLQotQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQotQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQotQUNfU1VCU1QoW2FtX190YXJdKQotQUNfU1VCU1QoW2FtX191bnRhcl0pCi1dKSAjIF9BTV9QUk9HX1RBUgotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMjJjNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gQVVUSE9SUyxcCi0gICAgICAgICAgICAgICBDT1BZSU5HLFwKLSAgICAgICAgICAgICAgIENoYW5nZUxvZyxcCi0gICAgICAgICAgICAgICBJTlNUQUxMLFwKLSAgICAgICAgICAgICAgIE1ha2VmaWxlLmFtLFwKLSAgICAgICAgICAgICAgIE1ha2VmaWxlLmluLFwKLSAgICAgICAgICAgICAgIE5FV1MsXAotICAgICAgICAgICAgICAgUkVBRE1FLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWNsb2NhbC5tNCxcCi0gICAgICAgICAgICAgICBjb21waWxlLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5ndWVzcyxcCi0gICAgICAgICAgICAgICBjb25maWcuaC5pbixcCi0gICAgICAgICAgICAgICBjb25maWcuc3RhdHVzLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdWIsXAotICAgICAgICAgICAgICAgY29uZmlndXJlLFwKLSAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5pbixcCi0gICAgICAgICAgICAgICBkZXBjb21wLFwKLSAgICAgICAgICAgICAgIGluY2x1ZGUvLFwKLSAgICAgICAgICAgICAgIGluc3RhbGwtc2gsXAotICAgICAgICAgICAgICAgbGlidG9vbCxcCi0gICAgICAgICAgICAgICBsdG1haW4uc2gsXAotICAgICAgICAgICAgICAgbWlzc2luZyxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29tcGlsZSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbXBpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MWUwMDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29tcGlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIFdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDMtMTEtMDkuMDAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAotIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCi0jIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBjb21waWxlIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotUmVtb3ZlIGAtbyBkZXN0Lm8nIGZyb20gQVJHUywgcnVuIFBST0dSQU0gd2l0aCB0aGUgcmVtYWluaW5nCi1hcmd1bWVudHMsIGFuZCByZW5hbWUgdGhlIG91dHB1dCBhcyBleHBlY3RlZC4KLQotSWYgeW91IGFyZSB0cnlpbmcgdG8gYnVpbGQgYSB3aG9sZSBwYWNrYWdlIHRoaXMgaXMgbm90IHRoZQotcmlnaHQgc2NyaXB0IHRvIHJ1bjogcGxlYXNlIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGZpbGUgYElOU1RBTEwnLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAwCi0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAwCi0gICAgOzsKLWVzYWMKLQotCi1wcm9nPSQxCi1zaGlmdAotCi1vZmlsZT0KLWNmaWxlPQotYXJncz0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gIGNhc2UgIiQxIiBpbgotICAgIC1vKQotICAgICAgIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCi0gICAgICAjIFNvIHdlIGRvIHNvbWV0aGluZyB1Z2x5IGhlcmUuCi0gICAgICBvZmlsZT0kMgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgIiRvZmlsZSIgaW4KLQkqLm8gfCAqLm9iaikKLQkgIDs7Ci0JKikKLQkgIGFyZ3M9IiRhcmdzIC1vICRvZmlsZSIKLQkgIG9maWxlPQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICAgICA7OwotICAgICouYykKLSAgICAgIGNmaWxlPSQxCi0gICAgICBhcmdzPSIkYXJncyAkMSIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFyZ3M9IiRhcmdzICQxIgotICAgICAgOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KLSAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQotICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCi0gICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KLSAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbwotICAjIG9rLgotICBleGVjICIkcHJvZyIgJGFyZ3MKLWZpCi0KLSMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCi1jb2ZpbGU9YGVjaG8gJGNmaWxlIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5jJC8uby8nYAotCi0jIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCi0jIE5vdGU6IHVzZSBgWy8uLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKLSMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKLSMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgotbG9ja2Rpcj1gZWNobyAkY29maWxlIHwgc2VkIC1lICdzfFsvLi1dfF98ZydgLmQKLXdoaWxlIHRydWU7IGRvCi0gIGlmIG1rZGlyICRsb2NrZGlyID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBicmVhawotICBmaQotICBzbGVlcCAxCi1kb25lCi0jIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KLXRyYXAgInJtZGlyICRsb2NrZGlyOyBleGl0IDEiIDEgMiAxNQotCi0jIFJ1biB0aGUgY29tcGlsZS4KLSIkcHJvZyIgJGFyZ3MKLXN0YXR1cz0kPwotCi1pZiB0ZXN0IC1mICIkY29maWxlIjsgdGhlbgotICBtdiAiJGNvZmlsZSIgIiRvZmlsZSIKLWZpCi0KLXJtZGlyICRsb2NrZGlyCi1leGl0ICRzdGF0dXMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29uZmlnLmd1ZXNzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGY3NzcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDEzMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDItMDMtMDQnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi0KLWR1bW15PWR1bW15LSQkCi10cmFwICdybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4KLSMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKLSMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KLQotc2V0X2NjX2Zvcl9idWlsZD0nY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgZHVtbXkoKXt9IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IDsgZG8KLQkgICgkYyAkZHVtbXkuYyAtYyAtbyAkZHVtbXkubykgPi9kZXYvbnVsbCAyPiYxIDsKLQkgIGlmIHRlc3QgJD8gPSAwIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjJwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKLQkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgMCA7OwotICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBocDMwMDpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hY3BwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZXBwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlYi11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMzpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFscGhhOk9TRjE6KjoqKQotCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQlmaQotCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgotCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCi0JIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCi0JIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCi0JY2F0IDw8RU9GID4kZHVtbXkucwotCS5kYXRhCi1cJExmb3JtYXQ6Ci0JLmJ5dGUgMzcsMTAwLDQ1LDM3LDEyMCwxMCwwCSMgIiVkLSV4XG4iCi0KLQkudGV4dAotCS5nbG9ibCBtYWluCi0JLmFsaWduIDQKLQkuZW50IG1haW4KLW1haW46Ci0JLmZyYW1lIFwkMzAsMTYsXCQyNiwwCi0JbGRncCBcJDI5LDAoXCQyNykKLQkucHJvbG9ndWUgMQotCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyIFwkMAotCWxkYSBcJDIsLTEKLQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQotCWxkYSBcJDE2LFwkTGZvcm1hdAotCW1vdiBcJDAsXCQxNwotCW5vdCBcJDEsXCQxOAotCWpzciBcJDI2LHByaW50ZgotCWxkZ3AgXCQyOSwwKFwkMjYpCi0JbW92IDAsXCQxNgotCWpzciBcJDI2LGV4aXQKLQkuZW5kIG1haW4KLUVPRgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCWNhc2UgYC4vJGR1bW15YCBpbgotCQkJMC0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTEtMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEtMTAxKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTItMzAzKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQkyLTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciCi0JCQkJOzsKLQkJCTItMTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgMDs7Ci0gICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCAwIDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgTklMRSo6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKLSAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKLSAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCi0gICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgotICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5Ci0gICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKLSAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKLSAgICAjIGJlIG5vIHByb2JsZW0uCi0gICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLQllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IFwKLQkgICYmIC4vJGR1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKLQkgICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgMCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYTY0OkFJWDoqOiopCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAuLyRkdW1teWAKLQkJICAgIGlmIHRlc3QgLXogIiRIUF9BUkNIIjsgdGhlbiBIUF9BUkNIPWhwcGE7IGZpCi0JCSAgICBybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQkJZmkgOzsKLQllc2FjCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0Q6KjoqOiopCi0JZWNobyBhbHBoYS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNwYXJjKjpCU0QvT1M6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpDWUdXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6UFcqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKLQlleGl0IDAgOzsKLSAgICB4ODY6SW50ZXJpeCo6MyopCi0JZWNobyBpMzg2LXBjLWludGVyaXgzCi0JZXhpdCAwIDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpNaW5peDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4Ci0JZXhpdCAwIDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgKLQlleGl0IDAgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBtaXBzOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHMKLQkjdW5kZWYgbWlwc2VsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkgCi0JQ1BVPW1pcHNlbCAKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpIAotCUNQVT1taXBzCi0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmIAotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCi0Jcm0gLWYgJGR1bW15LmMKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS1wYy1saW51eC1nbnUiICYmIGV4aXQgMAotCTs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotICAgICAgICBlc2FjCi0Jb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQlleGl0IDAgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAotCWV4aXQgMCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAotCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KLQkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgotCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCi0JICBlbGYzMi1pMzg2KQotCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgotCQk7OwotCSAgYS5vdXQtaTM4Ni1saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDAgOzsJCQotCSAgY29mZi1pMzg2KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCi0JCWV4aXQgMCA7OwotCSAgIiIpCi0JCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgotCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCAwIDs7Ci0JZXNhYwotCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0JI2lmZGVmIF9fRUxGX18KLQkjIGlmZGVmIF9fR0xJQkNfXwotCSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0JTElCQz1nbnUKLQkjICBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgIGVuZGlmCi0JIyBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgZW5kaWYKLQkjZWxzZQotCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCi0JTElCQz1nbnUKLQkjZWxzZQotCUxJQkM9Z251YW91dAotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAotCXJtIC1mICRkdW1teS5jCi0JdGVzdCB4IiR7TElCQ30iICE9IHggJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IiAmJiBleGl0IDAKLQl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIGVjaG8gIiR7VEVOVEFUSVZFfSIgJiYgZXhpdCAwCi0JOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQotCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NTpbNzhdKikKLQljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgotCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKLQkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7Ci0JICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgP0lJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCWVjaG8gYHVuYW1lIC1wYC1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAieDg2cGMiOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9cGMKLQkJZWNobyBpMzg2LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWVsc2UKLQkJZWNobyBgdW5hbWUgLXBgLSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpRTlg6Kjo0KikKLQllY2hvIGkzODYtcGMtcW54Ci0JZXhpdCAwIDs7Ci0gICAgTlNSLVtHS0xOUFRWV106Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgMCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgMCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgMCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgMCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgMCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgMCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgMCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgMCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotY2F0ID4mMiA8PEVPRgotJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQotCi1UaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQotdGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQotZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCi0KLSAgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L2NvbmZpZy8KLQotSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCi1zZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQotcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKLWluZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KLQotY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9jb25maWcuaC5pbiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbmZpZy5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNmZWYwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbmZpZy5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBERUJVR19QUklOVChmb3JtYXQsIC4uLikJcHJpbnRmKGZvcm1hdCwgX19WQV9BUkdTX18pOyBmZmx1c2goc3Rkb3V0KQotI2Vsc2UgLyogREVCVUcgKi8KLSNkZWZpbmUgREVCVUdfUFJJTlQoZm9ybWF0LCAuLi4pCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1dGlscycgbGlicmFyeSAoLWx1dGlscykuICovCi0jdW5kZWYgSEFWRV9MSUJVVElMUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQgLWMgYW5kIC1vIHRvZ2V0aGVyLiAqLwotI3VuZGVmIE5PX01JTlVTX0NfTUlOVVNfTwotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbmZpZy5zdWIgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzY1Nzk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDItMDMtMDcnCi0KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAotIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCi0gICAgICAgJDAgW09QVElPTl0gQUxJQVMKLQotQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCi0gICAgICAgZXhpdCAxIDs7Ci0KLSAgICAqbG9jYWwqKQotICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDA7OwotCi0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1jYXNlICQjIGluCi0gMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci0gMSkgOzsKLSAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHdpbmRvd3MzMi0qIHwgcnRtay1ub3ZhKikKLSAgICBvcz0tJG1heWJlX29zCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKLSAgICA7OwotICAqKQotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKLSAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KLSAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCi0gICAgZWxzZSBvcz07IGZpCi0gICAgOzsKLWVzYWMKLQotIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCi0jIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbwotIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQotIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCi1jYXNlICRvcyBpbgotCS1zdW4qb3MqKQotCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KLQkJOzsKLQktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAotCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAotCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCi0JLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKLQktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAotCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSB8IC1heGlzKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWNob3J1c29zKikKLQkJb3M9LWNob3J1c29zCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLSAJLWNob3J1c3JkYikKLSAJCW9zPS1jaG9ydXNyZGIKLQkJYmFzaWNfbWFjaGluZT0kMQotIAkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci0JLW1pbnQgfCAtbWludFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQkxNzUwYSB8IDU4MCBcCi0JfCBhMjlrIFwKLQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCi0JfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKLQl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCi0JfCBjNHggfCBjbGlwcGVyIFwKLQl8IGQxMHYgfCBkMzB2IHwgZHNwMTZ4eCBcCi0JfCBmcjMwIFwKLQl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCi0JfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKLQl8IG0zMnIgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayB8IG1jb3JlIFwKLQl8IG1pcHMgfCBtaXBzMTYgfCBtaXBzNjQgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCi0JfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCB8IG1pcHM2NHZyNDMwMCBcCi0JfCBtaXBzNjR2cjQzMDBlbCB8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKLQl8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSB8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JfCBtaXBzaXNhMzIgfCBtaXBzaXNhNjQgXAotCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAotCXwgbnMxNmsgfCBuczMyayBcCi0JfCBvcGVucmlzYyB8IG9yMzIgXAotCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKLQl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKLQl8IHB5cmFtaWQgXAotCXwgc2ggfCBzaFszNF0gfCBzaFszNF1lYiB8IHNoYmUgfCBzaGxlIHwgc2g2NCBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmN2OSB8IHNwYXJjdjliIFwKLQl8IHN0cm9uZ2FybSBcCi0JfCB0YWhvZSB8IHRodW1iIHwgdGljODAgfCB0cm9uIFwKLQl8IHY4NTAgfCB2ODUwZSBcCi0JfCB3ZTMyayBcCi0JfCB4ODYgfCB4c2NhbGUgfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAotCXwgejhrKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCi0JCSMgTW90b3JvbGEgNjhIQzExLzEyLgotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJb3M9LW5vbmUKLQkJOzsKLQltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKLQkJOzsKLQotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWkqODYgfCB4ODZfNjQpCi0JICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCi0JICA7OwotCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCi0JKi0qLSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgotCTU4MC0qIFwKLQl8IGEyOWstKiBcCi0JfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKLQl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCi0JfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKLQl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtdiotKiBcCi0JfCBhdnItKiBcCi0JfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNTR4LSogXAotCXwgY2xpcHBlci0qIHwgY3lkcmEtKiBcCi0JfCBkMTB2LSogfCBkMzB2LSogXAotCXwgZWx4c2ktKiBcCi0JfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmeDgwLSogXAotCXwgaDgzMDAtKiB8IGg4NTAwLSogXAotCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKLQl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCi0JfCBtMzJyLSogXAotCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKLQl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWNvcmUtKiBcCi0JfCBtaXBzLSogfCBtaXBzMTYtKiB8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogXAotCXwgbWlwczY0b3Jpb25lbC0qIHwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKLQl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogXAotCXwgbWlwc2xlLSogfCBtaXBzZWwtKiB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCi0JfCBvcmlvbi0qIFwKLQl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAotCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKLQl8IHB5cmFtaWQtKiBcCi0JfCByb21wLSogfCByczYwMDAtKiBcCi0JfCBzaC0qIHwgc2hbMzRdLSogfCBzaFszNF1lYi0qIHwgc2hiZS0qIHwgc2hsZS0qIHwgc2g2NC0qIFwKLQl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiB8IHNwYXJjbGl0ZS0qIFwKLQl8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAotCXwgdGFob2UtKiB8IHRodW1iLSogfCB0aWMzMC0qIHwgdGljNTR4LSogfCB0aWM4MC0qIHwgdHJvbi0qIFwKLQl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCi0JfCB3ZTMyay0qIFwKLQl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHN0b3JteTE2LSogXAotCXwgeHRlbnNhLSogXAotCXwgeW1wLSogXAotCXwgejhrLSopCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAotCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCi0JMzg2YnNkKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tYnNkCi0JCTs7Ci0JM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAotCQk7OwotCTNiKikKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlhMjlraGlmKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlhZG9iZTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKLQkJb3M9LXNjb3V0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kYWhsKQotCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKLQkJb3M9LXN5c3YKLQkJOzsKLQlhbWlnYSB8IGFtaWdhLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1zeXN2NAotCQk7OwotCWFwb2xsbzY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYXBvbGxvNjhic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LWJzZAotCQk7OwotCWF1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCW9zPS1hdXgKLQkJOzsKLQliYWxhbmNlKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JYzkwKQotCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgajkwKQotCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmRzIHwgdW5vcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKLQkJOzsKLQljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQotCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcwotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczEwCi0JCTs7Ci0JZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczIwCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQlnbzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LWdvMzIKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaDgzMDB4cmF5KQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LXhyYXkKLQkJOzsKLQloODUwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWhwcGFvc2YpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tb3NmCi0JCTs7Ci0JaHBwcm8pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQk7OwotIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/Ci0JaSo4NnYzMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2MzIKLQkJOzsKLQlpKjg2djQqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JaSo4NnYpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdgotCQk7OwotCWkqODZzb2wyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JaTM4Nm1hY2gpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCi0JCW9zPS1tYWNoCi0JCTs7Ci0JaTM4Ni12c3RhIHwgdnN0YSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LXZzdGEKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1taXgqKQotCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKLQkJb3M9LW1taXh3YXJlCi0JCTs7Ci0JbW9uaXRvcikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCW1vcnBob3MpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCW9zPS1tb3JwaG9zCi0JCTs7Ci0JbXNkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbXNkb3MKLQkJOzsKLQltdnMpCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJb3M9LW12cwotCQk7OwotCW5jcjMwMDApCi0JCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JbmV0YnNkMzg2KQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tbmV0YnNkCi0JCTs7Ci0JbmV0d2luZGVyKQotCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAotCQlvcz0tbGludXgKLQkJOzsKLQluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQotCQliYXNpY19tYWNoaW5lPW02OGstc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3czEwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5lY3Y3MCkKLQkJYmFzaWNfbWFjaGluZT12NzAtbmVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbmV4dCB8IG0qLW5leHQgKQotCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAotCQljYXNlICRvcyBpbgotCQkgICAgLW5leHRzdGVwKiApCi0JCQk7OwotCQkgICAgLW5zMiopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDIKLQkJCTs7Ci0JCSAgICAqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAzCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JbmgzMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCi0JCW9zPS1jeHV4Ci0JCTs7Ci0JbmhbNDVdMDAwKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1jeHV4Ci0JCTs7Ci0JbmluZHk5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAotCQlvcz0tbmluZHkKLQkJOzsKLQltb245NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAotCQlvcz0tbW9uOTYwCi0JCTs7Ci0Jbm9uc3RvcHV4KQotCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCi0JCW9zPS1ub25zdG9wdXgKLQkJOzsKLQlucDEpCi0JCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCi0JCTs7Ci0JbnNyLXRhbmRlbSkKLQkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCi0JCTs7Ci0Jb3A1MG4tKiB8IG9wNjBjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJb3M9LXByb2VsZgotCQk7OwotCW9yMzIgfCBvcjMyLSopCi0JCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotICAgICAgICBwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24pCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW1paSB8IHBlbnRpdW0yKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQotCQk7OwotCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlwdzMyKQotCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgotCQlvcz0tcHczMgotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzMzkwIHwgczM5MC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCi0JCTs7Ci0JczM5MHggfCBzMzkweC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLSAgICAgICAgc3YxKQotCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlzeW1tZXRyeSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JdDNkKQotCQliYXNpY19tYWNoaW5lPWFscGhhLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXQzZSkKLQkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0OTApCi0JCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXRpYzU0eCB8IGM1NHgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvYWQxKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAotCQlvcz0tdG9wczIwCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdjgxMCB8IG5lY3Y4MTApCi0JCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKLQkJb3M9LW5vbmUKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLSAgICAgICAgICAgICAgIDs7Ci0Jdnh3b3Jrczk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3M2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3MyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl3NjUqKQotCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKLQkJb3M9LW5vbmUKLQkJOzsKLQl3ODlrLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQl3aW5kb3dzMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0td2luZG93czMyLW1zdmNydAotCQk7OwotICAgICAgICB4cHMgfCB4cHMxMDApCi0JCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAotCQk7OwotCXltcCkKLQkJYmFzaWNfbWFjaGluZT15bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JejhrLSotY29mZikKLQkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgotCQlvcz0tc2ltCi0JCTs7Ci0Jbm9uZSkKLQkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKLQkJb3M9LW5vbmUKLQkJOzsKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgotIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgotCXc4OWspCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCTs7Ci0Jb3A1MG4pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlvcDYwYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCXJvbXApCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlyczYwMDApCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXZheCkKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCTs7Ci0JcGRwMTApCi0JCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCi0JCTs7Ci0JcGRwMTEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCi0JCTs7Ci0Jd2UzMmspCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0Jc2gzIHwgc2g0IHwgc2gzZWIgfCBzaDRlYikKLQkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCi0JCTs7Ci0Jc2g2NCkKLQkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KLQkJOzsKLQlzcGFyYyB8IHNwYXJjdjkgfCBzcGFyY3Y5YikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLSAgICAgICAgY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQljNHgqKQotCQliYXNpY19tYWNoaW5lPWM0eC1ub25lCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi11bmtub3duKQotCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKLQkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKLQkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKLQkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKLQkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCi0JICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKikKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLXFueCopCi0JCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkJICAgIHg4Ni0qIHwgaSo4Ni0qKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0tbnRvJG9zCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JLW50byopCi0JCW9zPS1udG8tcW54Ci0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogXAotCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vcGVuZWQqKQotCQlvcz0tb3BlbmVkaXRpb24KLQkJOzsKLQktd2luY2UqKQotCQlvcz0td2luY2UKLQkJOzsKLQktb3Nmcm9zZSopCi0JCW9zPS1vc2Zyb3NlCi0JCTs7Ci0JLW9zZiopCi0JCW9zPS1vc2YKLQkJOzsKLQktdXRlayopCi0JCW9zPS1ic2QKLQkJOzsKLQktZHluaXgqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWFjaXMqKQotCQlvcz0tYW9zCi0JCTs7Ci0JLWF0aGVvcyopCi0JCW9zPS1hdGhlb3MKLQkJOzsKLQktMzg2YnNkKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5vdmEqKQotCQlvcz0tcnRtay1ub3ZhCi0JCTs7Ci0JLW5zMiApCi0JICAgICAgICBvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JLW5zayopCi0JCW9zPS1uc2sKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotICAgICAgICAtKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCSAgICAgICAgb3M9LW1pbnQKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLXJlYmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgotCXBkcDEwLSopCi0JCW9zPS10b3BzMjAKLQkJOzsKLSAgICAgICAgcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCW02OCotY2lzY28pCi0JCW9zPS1hb3V0Ci0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0Jb3IzMi0qKQotCQlvcz0tY29mZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotICAgICAgICAqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotICAgICAgICAqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0gICAgICAgICotc2dpKQotCQlvcz0taXJpeAotCQk7OwotICAgICAgICAqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKiB8IC1vcGVuZWQqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktaG1zKikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktbXB3KiB8IC1tYWNvcyopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJCS12b3MqKQotCQkJCXZlbmRvcj1zdHJhdHVzCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCi1leGl0IDAKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29uZmlndXJlIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzY0YWI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDUwNzAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEgZm9yIG9yZy5lY2xpcHNlLnB0cC5wcm94eSAyLjEuNC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi0KLQotIyBQQVRIIG5lZWRzIENSCi0jIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCi1hc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLWFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwotYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCi1hc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi1hc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCi0gIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKLSAgY2htb2QgK3ggY29uZiQkLnNoCi0gIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIGVsc2UKLSAgICBQQVRIX1NFUEFSQVRPUj06Ci0gIGZpCi0gIHJtIC1mIGNvbmYkJC5zaAotZmkKLQotIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCi1pZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdW5zZXQ9dW5zZXQKLWVsc2UKLSAgYXNfdW5zZXQ9ZmFsc2UKLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotYXNfbmw9JwotJwotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotY2FzZSAkMCBpbgotICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0gICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICAgICA7OwotZXNhYwotIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJwotIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCi1pZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCi0gIGFzX215c2VsZj0kMAotZmkKLWlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSAgZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLSMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgotZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAotZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotZm9yIGFzX3ZhciBpbiBcCi0gIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCi0gIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCi0gIExDX1RFTEVQSE9ORSBMQ19USU1FCi1kbwotICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgotICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgotICBlbHNlCi0gICAgKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLSAgZmkKLWRvbmUKLQotIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLWlmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KLSAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKLWVsc2UKLSAgYXNfYmFzZW5hbWU9ZmFsc2UKLWZpCi0KLQotIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgotYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwvXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0KLSMgQ0RQQVRILgotJGFzX3Vuc2V0IENEUEFUSAotCi0KLWlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KLSAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19oYXZlX3JlcXVpcmVkPXllcwotZWxzZQotICBhc19oYXZlX3JlcXVpcmVkPW5vCi1maQotCi0gIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYgCSAoZXZhbCAiOgotKGFzX2Z1bmNfcmV0dXJuICgpIHsKLSAgKGV4aXQgXCQxKQotfQotYXNfZnVuY19zdWNjZXNzICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMAotfQotYXNfZnVuY19mYWlsdXJlICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMQotfQotYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Ci0gIHJldHVybiAwCi19Ci1hc19mdW5jX3JldF9mYWlsdXJlICgpIHsKLSAgcmV0dXJuIDEKLX0KLQotZXhpdGNvZGU9MAotaWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi0KLXRlc3QgXCRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotCi0oCi0gIGFzX2xpbmVub18xPVwkTElORU5PCi0gIGFzX2xpbmVub18yPVwkTElORU5PCi0gIHRlc3QgXCJ4XCRhc19saW5lbm9fMVwiICE9IFwieFwkYXNfbGluZW5vXzJcIiAmJgotICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yXCIpIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotIikgMj4gL2Rldi9udWxsOyB0aGVuCi0gIDoKLWVsc2UKLSAgYXNfY2FuZGlkYXRlX3NoZWxscz0KLSAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGNhc2UgJGFzX2RpciBpbgotCSAvKikKLQkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCi0JICAgICBhc19jYW5kaWRhdGVfc2hlbGxzPSIkYXNfY2FuZGlkYXRlX3NoZWxscyAkYXNfZGlyLyRhc19iYXNlIgotCSAgIGRvbmU7OwotICAgICAgIGVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi0gICAgICBmb3IgYXNfc2hlbGwgaW4gJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJFNIRUxMOyBkbwotCSAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCi0JIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgotCQl7ICgiJGFzX3NoZWxsIikgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi06Ci1fQVNFT0YKLX07IHRoZW4KLSAgQ09ORklHX1NIRUxMPSRhc19zaGVsbAotCSAgICAgICBhc19oYXZlX3JlcXVpcmVkPXllcwotCSAgICAgICBpZiB7ICIkYXNfc2hlbGwiIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotOgotKGFzX2Z1bmNfcmV0dXJuICgpIHsKLSAgKGV4aXQgJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSAiJDEiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCAkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotKAotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIpIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotCi1fQVNFT0YKLX07IHRoZW4KLSAgYnJlYWsKLWZpCi0KLWZpCi0KLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4KLSAgZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYKLSAgICAgICAgZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLSAgICAgICAgZG9uZQotICAgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkYXNfbXlzZWxmIiAkezErIiRAIn0KLWZpCi0KLQotICAgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSBubzsgdGhlbgotICBlY2hvIFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwgdGhlCi0gICAgICBlY2hvIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uICBQbGVhc2UgaW5zdGFsbCBhCi0gICAgICBlY2hvIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuIHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhCi0gICAgICBlY2hvIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4KLSAgICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotCi1maQotCi1maQotCi0KLQotKGV2YWwgImFzX2Z1bmNfcmV0dXJuICgpIHsKLSAgKGV4aXQgXCQxKQotfQotYXNfZnVuY19zdWNjZXNzICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMAotfQotYXNfZnVuY19mYWlsdXJlICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMQotfQotYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Ci0gIHJldHVybiAwCi19Ci1hc19mdW5jX3JldF9mYWlsdXJlICgpIHsKLSAgcmV0dXJuIDEKLX0KLQotZXhpdGNvZGU9MAotaWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi0KLXRlc3QgXCRleGl0Y29kZSA9IDAiKSB8fCB7Ci0gIGVjaG8gTm8gc2hlbGwgZm91bmQgdGhhdCBzdXBwb3J0cyBzaGVsbCBmdW5jdGlvbnMuCi0gIGVjaG8gUGxlYXNlIHRlbGwgYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKLSAgZWNobyBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcwotICBlY2hvIG1lc3NhZ2UKLX0KLQotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKLQotICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0gICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCi0gICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0gICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKLSAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAotICAjIGNhc2UgYXQgbGluZSBlbmQuCi0gICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKLSAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgotLW4qKQotICBjYXNlIGBlY2hvICd4XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKLWZpCi1lY2hvID5jb25mJCQuZmlsZQotaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9J2xuIC1zJwotICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgIGFzX2xuX3M9J2NwIC1wJwotZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz1sbgotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD06Ci1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotICAgICAgICB0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluCi0gICAgICAgIC0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4KLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLQotZXhlYyA3PCYwIDwvZGV2L251bGwgNj4mMQotCi0jIE5hbWUgb2YgdGhlIGhvc3QuCi0jIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAotIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCi1hY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLQotIwotIyBJbml0aWFsaXphdGlvbnMuCi0jCi1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi1hY19jbGVhbl9maWxlcz0KLWFjX2NvbmZpZ19saWJvYmpfZGlyPS4KLUxJQk9CSlM9Ci1jcm9zc19jb21waWxpbmc9bm8KLXN1YmRpcnM9Ci1NRkxBR1M9Ci1NQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi0jIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KLVBBQ0tBR0VfTkFNRT0nb3JnLmVjbGlwc2UucHRwLnByb3h5JwotUEFDS0FHRV9UQVJOQU1FPSdvcmctZWNsaXBzZS1wdHAtcHJveHknCi1QQUNLQUdFX1ZFUlNJT049JzIuMS40JwotUEFDS0FHRV9TVFJJTkc9J29yZy5lY2xpcHNlLnB0cC5wcm94eSAyLjEuNCcKLVBBQ0tBR0VfQlVHUkVQT1JUPScnCi0KLWFjX3VuaXF1ZV9maWxlPSJzcmMvcHJveHkuYyIKLWFjX3N1YnN0X3ZhcnM9J1NIRUxMCi1QQVRIX1NFUEFSQVRPUgotUEFDS0FHRV9OQU1FCi1QQUNLQUdFX1RBUk5BTUUKLVBBQ0tBR0VfVkVSU0lPTgotUEFDS0FHRV9TVFJJTkcKLVBBQ0tBR0VfQlVHUkVQT1JUCi1leGVjX3ByZWZpeAotcHJlZml4Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1iaW5kaXIKLXNiaW5kaXIKLWxpYmV4ZWNkaXIKLWRhdGFyb290ZGlyCi1kYXRhZGlyCi1zeXNjb25mZGlyCi1zaGFyZWRzdGF0ZWRpcgotbG9jYWxzdGF0ZWRpcgotaW5jbHVkZWRpcgotb2xkaW5jbHVkZWRpcgotZG9jZGlyCi1pbmZvZGlyCi1odG1sZGlyCi1kdmlkaXIKLXBkZmRpcgotcHNkaXIKLWxpYmRpcgotbG9jYWxlZGlyCi1tYW5kaXIKLURFRlMKLUVDSE9fQwotRUNIT19OCi1FQ0hPX1QKLUxJQlMKLWJ1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUlOU1RBTExfUFJPR1JBTQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfREFUQQotYW1fX2lzcmMKLUNZR1BBVEhfVwotUEFDS0FHRQotVkVSU0lPTgotQUNMT0NBTAotQVVUT0NPTkYKLUFVVE9NQUtFCi1BVVRPSEVBREVSCi1NQUtFSU5GTwotaW5zdGFsbF9zaAotU1RSSVAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotbWtkaXJfcAotQVdLCi1TRVRfTUFLRQotYW1fX2xlYWRpbmdfZG90Ci1BTVRBUgotYW1fX3RhcgotYW1fX3VudGFyCi1idWlsZAotYnVpbGRfY3B1Ci1idWlsZF92ZW5kb3IKLWJ1aWxkX29zCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1DUFBGTEFHUwotYWNfY3RfQ0MKLUVYRUVYVAotT0JKRVhUCi1ERVBESVIKLWFtX19pbmNsdWRlCi1hbV9fcXVvdGUKLUFNREVQX1RSVUUKLUFNREVQX0ZBTFNFCi1BTURFUEJBQ0tTTEFTSAotQ0NERVBNT0RFCi1hbV9fZmFzdGRlcENDX1RSVUUKLWFtX19mYXN0ZGVwQ0NfRkFMU0UKLVJBTkxJQgotTElCT0JKUwotTFRMSUJPQkpTJwotYWNfc3Vic3RfZmlsZXM9JycKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTJwotCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLWFjX2luaXRfaGVscD0KLWFjX2luaXRfdmVyc2lvbj1mYWxzZQotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWNhY2hlX2ZpbGU9L2Rldi9udWxsCi1leGVjX3ByZWZpeD1OT05FCi1ub19jcmVhdGU9Ci1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi0KLSMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgotIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCi0jIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAotIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgotIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KLSMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJwotZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1kb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCi1pbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJwotaHRtbGRpcj0nJHtkb2NkaXJ9JwotZHZpZGlyPScke2RvY2Rpcn0nCi1wZGZkaXI9JyR7ZG9jZGlyfScKLXBzZGlyPScke2RvY2Rpcn0nCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWxvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJwotbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCi0KLWFjX3ByZXY9Ci1hY19kYXNoZGFzaD0KLWZvciBhY19vcHRpb24KLWRvCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAqPSopCWFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICopCWFjX29wdGFyZz15ZXMgOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCi0gIC0tKQotICAgIGFjX2Rhc2hkYXNoPXllcyA7OwotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLS1jb25maWctY2FjaGUgfCAtQykKLSAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQotICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAotICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKLSAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7Ci0gIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKLSAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCi0gICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1ubyA7OwotCi0gIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCi0gICAgYWNfcHJldj1kb2NkaXIgOzsKLSAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCi0gICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQotICAgIGFjX3ByZXY9ZHZpZGlyIDs7Ci0gIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCi0gICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9XCRhY19vcHRhcmcgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKLSAgICBhY19pbml0X2hlbHA9bG9uZyA7OwotICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCi0gICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OwotICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCi0gICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCi0gICAgYWNfcHJldj1odG1sZGlyIDs7Ci0gIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAotICB8IC0taHQ9KikKLSAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQotICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7Ci0gIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCi0gICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKLSAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKLQotICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQotICAgIGFjX3ByZXY9cGRmZGlyIDs7Ci0gIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCi0gICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQotICAgIGFjX3ByZXY9cHNkaXIgOzsKLSAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCi0gICAgcHNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSRhY19vcHRhcmcgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKLSAgICBhY19pbml0X3ZlcnNpb249OiA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9XCRhY19vcHRhcmcgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPW5vIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKLQotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZwotICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7Ci0KLSAgKikKLSAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCi0gICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgotICAgIDogJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0KLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCi1mb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKLQkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCi0JCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKLQkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKLWRvCi0gIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICBjYXNlICRhY192YWwgaW4KLSAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OwotICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKLSAgZXNhYwotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgotICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogV29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci10ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgotICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkMCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KLSAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLWFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKLWFjX2Fic19jb25mZGlyPWAoCi0JY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCB7IGVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19tc2ciID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBvcmcuZWNsaXBzZS5wdHAucHJveHkgMi4xLjQgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQotICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJwotICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KLQotSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLQkJCSAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLQkJCSAgW1BSRUZJWF0KLQotQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCi1cYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQotYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKLWZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCi0KLUZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgotCi1GaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotICAtLWJpbmRpcj1ESVIgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQotICAtLWRhdGFyb290ZGlyPURJUiAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KLSAgLS1sb2NhbGVkaXI9RElSICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL29yZy1lY2xpcHNlLXB0cC1wcm94eV0KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotX0FDRU9GCi0KLSAgY2F0IDw8XF9BQ0VPRgotCi1Qcm9ncmFtIG5hbWVzOgotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi1fQUNFT0YKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCi0gIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2Ygb3JnLmVjbGlwc2UucHRwLnByb3h5IDIuMS40OiI7OwotICAgZXNhYwotICBjYXQgPDxcX0FDRU9GCi0KLU9wdGlvbmFsIEZlYXR1cmVzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycwotCi1Tb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCi0gIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKLSAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCi0gICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KLSAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0gICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1fQUNFT0YKLWFjX3N0YXR1cz0kPwotZmkKLQotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgotICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQotICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8IGNvbnRpbnVlCi0gICAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKLSAgICBmaSB8fCBhY19zdGF0dXM9JD8KLSAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Ci0gIGRvbmUKLWZpCi0KLXRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwotaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgotICBjYXQgPDxcX0FDRU9GCi1vcmcuZWNsaXBzZS5wdHAucHJveHkgY29uZmlndXJlIDIuMS40Ci1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLWNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0KLUl0IHdhcyBjcmVhdGVkIGJ5IG9yZy5lY2xpcHNlLnB0cC5wcm94eSAkYXNfbWUgMi4xLjQsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgJCAkMCAkQAotCi1fQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotY2F0IDw8X0FTVU5BTUUKLSMjIC0tLS0tLS0tLSAjIwotIyMgUGxhdGZvcm0uICMjCi0jIyAtLS0tLS0tLS0gIyMKLQotaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0KLV9BU1VOQU1FCi0KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19wYXNzIGluCi0gICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKLSAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgotCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KLSAgICAgIGVsc2UKLQljYXNlICRhY19hcmcgaW4KLQkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAotCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAotCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCi0JICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQotCi0jIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0jIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KLXRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotICB7Ci0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE91dHB1dCB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICAgIGRvbmUgfCBzb3J0Ci0gICAgICBlY2hvCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBjYXQgY29uZmRlZnMuaAotICAgICAgZWNobwotICAgIGZpCi0gICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLQotIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBzZXQgeCAiJENPTkZJR19TSVRFIgotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZmkKLXNoaWZ0Ci1mb3IgYWNfc2l0ZV9maWxlCi1kbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKLSAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gID4kY2FjaGVfZmlsZQotZmkKLQotIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQotIyB2YWx1ZS4KLWFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQotICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KLSAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICwpOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0JYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCi0gICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KLSAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTAnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKLSMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KLSMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgotYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCi1zL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCi1fQUNFT0YKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotcm0gLWYgY29uZnRlc3Quc2VkCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9Ci1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfSB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi0KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCi0gICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BV0s9JGFjX2N2X3Byb2dfQVdLCi1pZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCi1kb25lCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi0KLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotIFBBQ0tBR0U9J29yZy1lY2xpcHNlLXB0cC1wcm94eScKLSBWRVJTSU9OPScyLjEuNCcKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLV9BQ0VPRgotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi0KLUFDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KLQotCi1BVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9Ci0KLQotTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9Ci0KLWluc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci0KLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi0KLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi1BTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9Ci0KLWFtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJwotCi0KLQotCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1hY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjY7IH0KLWNhc2UgJGFjX2N2X2J1aWxkIGluCi0qLSotKikgOzsKLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLWVzYWMKLWJ1aWxkPSRhY19jdl9idWlsZAotYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotc2V0IHggJGFjX2N2X2J1aWxkCi1zaGlmdAotYnVpbGRfY3B1PSQxCi1idWlsZF92ZW5kb3I9JDIKLXNoaWZ0OyBzaGlmdAotIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0jIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Ci1idWlsZF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi0KLQotVVRJTFM9Ii4uL29yZy5lY2xpcHNlLnB0cC51dGlscyIKLWlmIHRlc3QgISAtZCAkVVRJTFM7IHRoZW4KLQlVVElMUz0iYGVjaG8gJHtVVElMU31fJHtQQUNLQUdFX1ZFUlNJT059LipgIgotCWlmIHRlc3QgISAtZCAkVVRJTFM7IHRoZW4KLQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiB1dGlscyBkaXJlY3Rvcnkgbm90IGZvdW5kIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JZmkKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRpbnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1hY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCi17IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0jCi0jIExpc3Qgb2YgcG9zc2libGUgb3V0cHV0IGZpbGVzLCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4KLSMgVGhlIGFsZ29yaXRobSBpcyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikKLSMgb25seSBhcyBhIGxhc3QgcmVzb3J0LiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KLWFjX2ZpbGVzPSdhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0JwotIwotIyBUaGUgSVJJWCA2IGxpbmtlciB3cml0ZXMgaW50byBleGlzdGluZyBmaWxlcyB3aGljaCBtYXkgbm90IGJlCi0jIGV4ZWN1dGFibGUsIHJldGFpbmluZyB0aGVpciBwZXJtaXNzaW9ucy4gIFJlbW92ZSB0aGVtIGZpcnN0IHNvIGEKLSMgc3Vic2VxdWVudCBleGVjdXRpb24gdGVzdCB3b3Jrcy4KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVzCi0KLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZvciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLSAgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Ci0JdGhlbiA6OyBlbHNlCi0JICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JZmkKLQkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKLQkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKLQkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLQkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKLQkjIGFjdHVhbGx5IHdvcmtpbmcuCi0JYnJlYWs7OwotICAgICogKQotCWJyZWFrOzsKLSAgZXNhYwotZG9uZQotdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Ci0KLWVsc2UKLSAgYWNfZmlsZT0nJwotZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLWZpCi0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KLSMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKLSMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBmaQotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0KLXJtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKLSMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAotIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSMgYHJtJy4KLWZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGJyZWFrOzsKLSAgICAqICkgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1ybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY29tcGlsZXJfZ251PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1HQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKLWFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLWFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JQ0ZMQUdTPSIiCi0gICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLQkgQ0ZMQUdTPSItZyIKLQkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0vKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCi1zdHJ1Y3QgYnVmIHsgaW50IHg7IH07Ci1GSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKmUgKHAsIGkpCi0gICAgIGNoYXIgKipwOwotICAgICBpbnQgaTsKLXsKLSAgcmV0dXJuIHBbaV07Ci19Ci1zdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCi17Ci0gIGNoYXIgKnM7Ci0gIHZhX2xpc3QgdjsKLSAgdmFfc3RhcnQgKHYscCk7Ci0gIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7Ci0gIHZhX2VuZCAodik7Ci0gIHJldHVybiBzOwotfQotCi0vKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcwotICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCi0gICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0Ci0gICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCi0gICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07Ci0KLS8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycwotICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLwotI2RlZmluZSBGT08oeCkgJ3gnCi1pbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKLQotaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Ci1zdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKLXN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OwotaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci1pbnQgYXJnYzsKLWNoYXIgKiphcmd2OwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKLQktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgotZG8KLSAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUNDPSRhY19zYXZlX0NDCi0KLWZpCi0jIEFDX0NBQ0hFX1ZBTAotY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KLSAgeCkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKLSAgeG5vKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9dW5zdXBwb3J0ZWQiID4mNjsgfSA7OwotICAqKQotICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Ci1lc2FjCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIGRvbmUKLS5QSE9OWTogYW1fX2RvaXQKLUVORAotIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKLSMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KLSMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKLSMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCi0jIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KLWlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgotICAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICAgYW1fX3F1b3RlPQotICAgX2FtX3Jlc3VsdD1HTlUKLWZpCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KLSAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgICBhbV9fcXVvdGU9IlwiIgotICAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgIGZpCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOwotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLSBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi0KLWRlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0gaWYKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1maQotc2V0IGR1bW15ICRDQzsgYWNfY2M9YGVjaG8gJDIgfAotCQkgICAgICBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX287IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLSMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgotIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KLSMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCi1hY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLXJtIC1mIGNvbmZ0ZXN0Mi4qCi1pZiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsKLXRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz15ZXMKLSAgaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gICAgIyBUZXN0IGZpcnN0IHRoYXQgY2MgZXhpc3RzIGF0IGFsbC4KLSAgICBpZiB7IGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JwotICAgICAgcm0gLWYgY29uZnRlc3QyLioKLSAgICAgIGlmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07Ci0gICAgICB0aGVuCi0JIyBjYyB3b3JrcyB0b28uCi0JOgotICAgICAgZWxzZQotCSMgY2MgZXhpc3RzIGJ1dCBkb2Vzbid0IGxpa2UgLW8uCi0JZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotICAgICAgZmkKLSAgICBmaQotICBmaQotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBOT19NSU5VU19DX01JTlVTX08gMQotX0FDRU9GCi0KLWZpCi0KLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkMiB8IHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX2NjXycke2FjX2NjfV9jX29gXCIgIT0geWVzIjsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbgotICAuLyB8IC4vLyB8IC9jQy8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICBicmVhayAzCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgZG9uZQotICAgIDs7Ci1lc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQotZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNjsgfQotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAkRUNIT19DIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCi1TSEVMTCA9IC9iaW4vc2gKLWFsbDoKLQlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwotX0FDRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLSAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKLWlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KLSAgICBSQU5MSUI9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgotICBmaQotZWxzZQotICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWZpCi0KLQotb3M9YHVuYW1lIC1zYAotaWYgdGVzdCAieCRvcyIgPSAieEFJWCIgOyB0aGVuCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1xaW5mbz1nZW4gLXFjcGx1c2NtdCAtSSRVVElMUy9pbmNsdWRlIgotZWxzZQotCUNGTEFHUz0iJENGTEFHUyAtV2FsbCAtSSRVVElMUy9pbmNsdWRlIgotZmkKLUxJQlM9IiRMSUJTIC1MJFVUSUxTIgotCi0KLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYml0c2V0X25ldyBpbiAtbHV0aWxzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGJpdHNldF9uZXcgaW4gLWx1dGlscy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWx1dGlscyAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBiaXRzZXRfbmV3ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gYml0c2V0X25ldyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXc9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldyA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCVVRJTFMgMQotX0FDRU9GCi0KLSAgTElCUz0iLWx1dGlscyAkTElCUyIKLQotZmkKLQotCi0KLQotCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUiCi0KLWNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCi0jIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0Ci0jIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Ci0jIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgotIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzLgotCi1fQUNFT0YKLQotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLWZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCi0gICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgotICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCi1kb25lCi1MSUJPQkpTPSRhY19saWJvYmpzCi0KLUxUTElCT0JKUz0kYWNfbHRsaWJvYmpzCi0KLQotaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Ci1jYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jISAkU0hFTEwKLSMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1kZWJ1Zz1mYWxzZQotYWNfY3NfcmVjaGVjaz1mYWxzZQotYWNfY3Nfc2lsZW50PWZhbHNlCi1TSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKLQotICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0gICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCi0gICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0gICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKLSAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAotICAjIGNhc2UgYXQgbGluZSBlbmQuCi0gICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKLSAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgotLW4qKQotICBjYXNlIGBlY2hvICd4XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKLWZpCi1lY2hvID5jb25mJCQuZmlsZQotaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9J2xuIC1zJwotICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgIGFzX2xuX3M9J2NwIC1wJwotZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz1sbgotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD06Ci1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotICAgICAgICB0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluCi0gICAgICAgIC0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4KLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCi0jIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgotYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgb3JnLmVjbGlwc2UucHRwLnByb3h5ICRhc19tZSAyLjEuNCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLW9yZy5lY2xpcHNlLnB0cC5wcm94eSBjb25maWcuc3RhdHVzIDIuMS40Ci1jb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEsCi0gIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCi0KLUNvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotYWNfcHdkPSckYWNfcHdkJwotc3JjZGlyPSckc3JjZGlyJwotSU5TVEFMTD0nJElOU1RBTEwnCi1NS0RJUl9QPSckTUtESVJfUCcKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0Ci0jIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotYWNfbmVlZF9kZWZhdWx0cz06Ci13aGlsZSB0ZXN0ICQjICE9IDAKLWRvCi0gIGNhc2UgJDEgaW4KLSAgLS0qPSopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Ci0gIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCi0gICAgZGVidWc9OiA7OwotICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCi0gICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKLQotICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1pZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KLSAgZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMICRTSEVMTCAkMCAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2Ci0gIENPTkZJR19TSEVMTD0kU0hFTEwKLSAgZXhwb3J0IENPTkZJR19TSEVMTAotICBleGVjICRTSEVMTCAiJDAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLSAgZWNobyAiJGFjX2xvZyIKLX0gPiY1Ci0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0KLSMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCi1kbwotICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0gICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKLSAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotCi0gICopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi0gIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0KLSAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgeyB0ZXN0IC16ICIkdG1wIiB8fCB0ZXN0ICEgLWQgIiR0bXAiIHx8IHJtIC1mciAiJHRtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKLScgMAotICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQotfQotIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCi0KLXsKLSAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCi0gIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCi19ICB8fAotewotICB0bXA9Li9jb25mJCQtJFJBTkRPTQotICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKLX0gfHwKLXsKLSAgIGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH0KLX0KLQotIwotIyBTZXQgdXAgdGhlIHNlZCBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KLSMKLQotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCi0jIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0KLV9BQ0VPRgotCi0KLQotYWNfZGVsaW09JyUhXyEjICcKLWZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbwotICBjYXQgPmNvbmYkJHN1YnMuc2VkIDw8X0FDRU9GCi1TSEVMTCEkU0hFTEwkYWNfZGVsaW0KLVBBVEhfU0VQQVJBVE9SISRQQVRIX1NFUEFSQVRPUiRhY19kZWxpbQotUEFDS0FHRV9OQU1FISRQQUNLQUdFX05BTUUkYWNfZGVsaW0KLVBBQ0tBR0VfVEFSTkFNRSEkUEFDS0FHRV9UQVJOQU1FJGFjX2RlbGltCi1QQUNLQUdFX1ZFUlNJT04hJFBBQ0tBR0VfVkVSU0lPTiRhY19kZWxpbQotUEFDS0FHRV9TVFJJTkchJFBBQ0tBR0VfU1RSSU5HJGFjX2RlbGltCi1QQUNLQUdFX0JVR1JFUE9SVCEkUEFDS0FHRV9CVUdSRVBPUlQkYWNfZGVsaW0KLWV4ZWNfcHJlZml4ISRleGVjX3ByZWZpeCRhY19kZWxpbQotcHJlZml4ISRwcmVmaXgkYWNfZGVsaW0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWUhJHByb2dyYW1fdHJhbnNmb3JtX25hbWUkYWNfZGVsaW0KLWJpbmRpciEkYmluZGlyJGFjX2RlbGltCi1zYmluZGlyISRzYmluZGlyJGFjX2RlbGltCi1saWJleGVjZGlyISRsaWJleGVjZGlyJGFjX2RlbGltCi1kYXRhcm9vdGRpciEkZGF0YXJvb3RkaXIkYWNfZGVsaW0KLWRhdGFkaXIhJGRhdGFkaXIkYWNfZGVsaW0KLXN5c2NvbmZkaXIhJHN5c2NvbmZkaXIkYWNfZGVsaW0KLXNoYXJlZHN0YXRlZGlyISRzaGFyZWRzdGF0ZWRpciRhY19kZWxpbQotbG9jYWxzdGF0ZWRpciEkbG9jYWxzdGF0ZWRpciRhY19kZWxpbQotaW5jbHVkZWRpciEkaW5jbHVkZWRpciRhY19kZWxpbQotb2xkaW5jbHVkZWRpciEkb2xkaW5jbHVkZWRpciRhY19kZWxpbQotZG9jZGlyISRkb2NkaXIkYWNfZGVsaW0KLWluZm9kaXIhJGluZm9kaXIkYWNfZGVsaW0KLWh0bWxkaXIhJGh0bWxkaXIkYWNfZGVsaW0KLWR2aWRpciEkZHZpZGlyJGFjX2RlbGltCi1wZGZkaXIhJHBkZmRpciRhY19kZWxpbQotcHNkaXIhJHBzZGlyJGFjX2RlbGltCi1saWJkaXIhJGxpYmRpciRhY19kZWxpbQotbG9jYWxlZGlyISRsb2NhbGVkaXIkYWNfZGVsaW0KLW1hbmRpciEkbWFuZGlyJGFjX2RlbGltCi1ERUZTISRERUZTJGFjX2RlbGltCi1FQ0hPX0MhJEVDSE9fQyRhY19kZWxpbQotRUNIT19OISRFQ0hPX04kYWNfZGVsaW0KLUVDSE9fVCEkRUNIT19UJGFjX2RlbGltCi1MSUJTISRMSUJTJGFjX2RlbGltCi1idWlsZF9hbGlhcyEkYnVpbGRfYWxpYXMkYWNfZGVsaW0KLWhvc3RfYWxpYXMhJGhvc3RfYWxpYXMkYWNfZGVsaW0KLXRhcmdldF9hbGlhcyEkdGFyZ2V0X2FsaWFzJGFjX2RlbGltCi1JTlNUQUxMX1BST0dSQU0hJElOU1RBTExfUFJPR1JBTSRhY19kZWxpbQotSU5TVEFMTF9TQ1JJUFQhJElOU1RBTExfU0NSSVBUJGFjX2RlbGltCi1JTlNUQUxMX0RBVEEhJElOU1RBTExfREFUQSRhY19kZWxpbQotYW1fX2lzcmMhJGFtX19pc3JjJGFjX2RlbGltCi1DWUdQQVRIX1chJENZR1BBVEhfVyRhY19kZWxpbQotUEFDS0FHRSEkUEFDS0FHRSRhY19kZWxpbQotVkVSU0lPTiEkVkVSU0lPTiRhY19kZWxpbQotQUNMT0NBTCEkQUNMT0NBTCRhY19kZWxpbQotQVVUT0NPTkYhJEFVVE9DT05GJGFjX2RlbGltCi1BVVRPTUFLRSEkQVVUT01BS0UkYWNfZGVsaW0KLUFVVE9IRUFERVIhJEFVVE9IRUFERVIkYWNfZGVsaW0KLU1BS0VJTkZPISRNQUtFSU5GTyRhY19kZWxpbQotaW5zdGFsbF9zaCEkaW5zdGFsbF9zaCRhY19kZWxpbQotU1RSSVAhJFNUUklQJGFjX2RlbGltCi1JTlNUQUxMX1NUUklQX1BST0dSQU0hJElOU1RBTExfU1RSSVBfUFJPR1JBTSRhY19kZWxpbQotbWtkaXJfcCEkbWtkaXJfcCRhY19kZWxpbQotQVdLISRBV0skYWNfZGVsaW0KLVNFVF9NQUtFISRTRVRfTUFLRSRhY19kZWxpbQotYW1fX2xlYWRpbmdfZG90ISRhbV9fbGVhZGluZ19kb3QkYWNfZGVsaW0KLUFNVEFSISRBTVRBUiRhY19kZWxpbQotYW1fX3RhciEkYW1fX3RhciRhY19kZWxpbQotYW1fX3VudGFyISRhbV9fdW50YXIkYWNfZGVsaW0KLWJ1aWxkISRidWlsZCRhY19kZWxpbQotYnVpbGRfY3B1ISRidWlsZF9jcHUkYWNfZGVsaW0KLWJ1aWxkX3ZlbmRvciEkYnVpbGRfdmVuZG9yJGFjX2RlbGltCi1idWlsZF9vcyEkYnVpbGRfb3MkYWNfZGVsaW0KLUNDISRDQyRhY19kZWxpbQotQ0ZMQUdTISRDRkxBR1MkYWNfZGVsaW0KLUxERkxBR1MhJExERkxBR1MkYWNfZGVsaW0KLUNQUEZMQUdTISRDUFBGTEFHUyRhY19kZWxpbQotYWNfY3RfQ0MhJGFjX2N0X0NDJGFjX2RlbGltCi1FWEVFWFQhJEVYRUVYVCRhY19kZWxpbQotT0JKRVhUISRPQkpFWFQkYWNfZGVsaW0KLURFUERJUiEkREVQRElSJGFjX2RlbGltCi1hbV9faW5jbHVkZSEkYW1fX2luY2x1ZGUkYWNfZGVsaW0KLWFtX19xdW90ZSEkYW1fX3F1b3RlJGFjX2RlbGltCi1BTURFUF9UUlVFISRBTURFUF9UUlVFJGFjX2RlbGltCi1BTURFUF9GQUxTRSEkQU1ERVBfRkFMU0UkYWNfZGVsaW0KLUFNREVQQkFDS1NMQVNIISRBTURFUEJBQ0tTTEFTSCRhY19kZWxpbQotQ0NERVBNT0RFISRDQ0RFUE1PREUkYWNfZGVsaW0KLWFtX19mYXN0ZGVwQ0NfVFJVRSEkYW1fX2Zhc3RkZXBDQ19UUlVFJGFjX2RlbGltCi1hbV9fZmFzdGRlcENDX0ZBTFNFISRhbV9fZmFzdGRlcENDX0ZBTFNFJGFjX2RlbGltCi1SQU5MSUIhJFJBTkxJQiRhY19kZWxpbQotTElCT0JKUyEkTElCT0JKUyRhY19kZWxpbQotTFRMSUJPQkpTISRMVExJQk9CSlMkYWNfZGVsaW0KLV9BQ0VPRgotCi0gIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gODI7IHRoZW4KLSAgICBicmVhawotICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotCi1hY19lb2Y9YHNlZCAtbiAnL15DRU9GWzAtOV0qJC9zL0NFT0YvMC9wJyBjb25mJCRzdWJzLnNlZGAKLWlmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCi0gIGFjX2VvZj1gZWNobyAiJGFjX2VvZiIgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCi0gIGFjX2VvZj1gZXhwciAkYWNfZW9mICsgMWAKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1jYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYiBlbmQKLV9BQ0VPRgotc2VkICcKLXMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKLXMvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KLTpuCi10IG4KLXMvJyIkYWNfZGVsaW0iJyQvLGcvOyB0Ci1zLyQvXFwvOyBwCi1OOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgotJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAotcm0gLWYgY29uZiQkc3Vicy5zZWQKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi06ZW5kCi1zL3wjXyEhXyN8Ly9nCi1DRU9GJGFjX2VvZgotX0FDRU9GCi0KLQotIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAotIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKLSMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0vewotcy86KlwkKHNyY2Rpcik6Ki86Lwotcy86Klwke3NyY2Rpcn06Ki86Lwotcy86KkBzcmNkaXJAOiovOi8KLXMvXlwoW149XSo9WwkgXSpcKToqL1wxLwotcy86KiQvLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLWZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKLQotCi1mb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICA6W0ZIXS0pIGFjX3RhZz0tOi07OwotICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OwotICBlc2FjCi0gIGFjX3NhdmVfSUZTPSRJRlMKLSAgSUZTPToKLSAgc2V0IHggJGFjX3RhZwotICBJRlM9JGFjX3NhdmVfSUZTCi0gIHNoaWZ0Ci0gIGFjX2ZpbGU9JDEKLSAgc2hpZnQKLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpMKSBhY19zb3VyY2U9JDE7OwotICA6W0ZIXSkKLSAgICBhY19maWxlX2lucHV0cz0KLSAgICBmb3IgYWNfZgotICAgIGRvCi0gICAgICBjYXNlICRhY19mIGluCi0gICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7Ci0gICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQotCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKLQkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KLQkgdGVzdCAtZiAiJGFjX2YiIHx8Ci0JICAgY2FzZSAkYWNfZiBpbgotCSAgIFtcXC8kXSopIGZhbHNlOzsKLQkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7Ci0JICAgZXNhYyB8fAotCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgICAgIGVzYWMKLSAgICAgIGFjX2ZpbGVfaW5wdXRzPSIkYWNfZmlsZV9pbnB1dHMgJGFjX2YiCi0gICAgZG9uZQotCi0gICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKLSAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Ci0gICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KLSAgICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBmcm9tICJgSUZTPToKLQkgIGVjaG8gJCogfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJ2AiIGJ5IGNvbmZpZ3VyZS4iCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0KLSAgICBjYXNlICRhY190YWcgaW4KLSAgICAqOi06KiB8ICo6LSkgY2F0ID4iJHRtcC9zdGRpbiI7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0KLSAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Ci0kYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYWNfZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIHsgYXNfZGlyPSIkYWNfZGlyIgotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Ci0gIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLSAgYWNfTUtESVJfUD0kTUtESVJfUAotICBjYXNlICRNS0RJUl9QIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIDs7Ci0gICovKikgYWNfTUtESVJfUD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRNS0RJUl9QIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KLSMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgotYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci0KLWNhc2UgYHNlZCAtbiAnL2RhdGFyb290ZGlyLyB7Ci0gIHAKLSAgcQotfQotL0BkYXRhZGlyQC9wCi0vQGRvY2RpckAvcAotL0BpbmZvZGlyQC9wCi0vQGxvY2FsZWRpckAvcAotL0BtYW5kaXJAL3AKLScgJGFjX2ZpbGVfaW5wdXRzYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCi0gIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKLSAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKLSAgcyZAaW5mb2RpckAmJGluZm9kaXImZwotICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZwotICBzJkBtYW5kaXJAJiRtYW5kaXImZwotICAgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Ci1lc2FjCi1fQUNFT0YKLQotIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgotIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCi0jIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/Ci1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICBzZWQgIiRhY192cHN1YgotJGV4dHJhc3ViCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotOnQKLS9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKLXMmQGNvbmZpZ3VyZV9pbnB1dEAmJGNvbmZpZ3VyZV9pbnB1dCY7dCB0Ci1zJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLXMmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0Ci1zJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Ci1zJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci1zJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKLXMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAotcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLXMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKLXMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKLXMmQE1LRElSX1BAJiRhY19NS0RJUl9QJjt0IHQKLSRhY19kYXRhcm9vdGRpcl9oYWNrCi0iICRhY19maWxlX2lucHV0cyB8IHNlZCAtZiAiJHRtcC9zdWJzLTEuc2VkIiA+JHRtcC9vdXQKLQotdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KLQotICBybSAtZiAiJHRtcC9zdGRpbiIKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAtKSBjYXQgIiR0bXAvb3V0Ijsgcm0gLWYgIiR0bXAvb3V0Ijs7Ci0gICopIHJtIC1mICIkYWNfZmlsZSI7IG12ICIkdG1wL291dCIgJGFjX2ZpbGU7OwotICBlc2FjCi0gOzsKLSAgOkgpCi0gICMKLSAgIyBDT05GSUdfSEVBREVSCi0gICMKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGBjb25mdGVzdC5kZWZpbmVzJywgdGhhdAotIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLSMgRmlyc3QsIGFwcGVuZCBhIHNwYWNlIHRvIGV2ZXJ5IHVuZGVmL2RlZmluZSBsaW5lLCB0byBlYXNlIG1hdGNoaW5nLgotZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcwotIyBUaGVuLCBwcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QsIG9yIGluCi0jIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQsIGluIGNvbmZpZy5zdGF0dXMuICBJZiBzb21lIG1hY3JvcyB3ZXJlCi0jIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCi0jIHN5bWJvbCwgd2hpY2ggaXMgdXNlbGVzcy4gIEJ1dCBkbyBub3Qgc29ydCB0aGVtLCBzaW5jZSB0aGUgbGFzdAotIyBBQ19ERUZJTkUgbXVzdCBiZSBob25vcmVkLgotYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBQQVJBTVMgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQsIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMgUEFSQU1TIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi0taW4gbW9zdCBjYXNlcywgaXQncwotIyBqdXN0IGFuIGVtcHR5IHN0cmluZy4KLWFjX2RBPSdzLF5cXChbCSAjXSpcXClbXgkgXSpcXChbCSBdKicKLWFjX2RCPSdcXClbCSAoXS4qLFxcMWRlZmluZVxcMicKLWFjX2RDPScgJwotYWNfZEQ9JyAsJwotCi11bmlxIGNvbmZkZWZzLmggfAotICBzZWQgLW4gJwotCXQgcnNldAotCTpyc2V0Ci0Jcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovLwotCXQgb2sKLQlkCi0JOm9rCi0Jcy9bXFwmLF0vXFwmL2cKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvICciJGFjX2RBIidcMSciJGFjX2RCIidcMiciJHthY19kQ30iJ1wzJyIkYWNfZEQiJy9wCi0Jcy9eXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpLyciJGFjX2RBIidcMSciJGFjX2RCJGFjX2RDIidcMiciJGFjX2REIicvcAotICAnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIFJlbW92ZSB0aGUgc3BhY2UgdGhhdCB3YXMgYXBwZW5kZWQgdG8gZWFzZSBtYXRjaGluZy4KLSMgVGhlbiByZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi0jIChUaGUgcmVnZXhwIGNhbiBiZSBzaG9ydCwgc2luY2UgdGhlIGxpbmUgY29udGFpbnMgZWl0aGVyICNkZWZpbmUgb3IgI3VuZGVmLikKLWVjaG8gJ3MvICQvLwotcyxeWwkgI10qdS4qLC8qICYgKi8sJyA+PmNvbmZ0ZXN0LmRlZmluZXMKLQotIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzOgotYWNfbWF4X3NlZF9saW5lcz01MAotCi0jIEZpcnN0IHNlZCBjb21tYW5kIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICRhY19maWxlX2lucHV0cyA+IiR0bXAvb3V0MSIKLSMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKLSMgVGhpcmQgb25lIHdpbGwgYmU6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MiIgPiIkdG1wL291dDEiCi0jIGV0IGNldGVyYS4KLWFjX2luPSckYWNfZmlsZV9pbnB1dHMnCi1hY19vdXQ9JyIkdG1wL291dDEiJwotYWNfbnh0PSciJHRtcC9vdXQyIicKLQotd2hpbGUgOgotZG8KLSAgIyBXcml0ZSBhIGhlcmUgZG9jdW1lbnQ6Ci0gICAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgICAjIEZpcnN0LCBjaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBsaW5lOgotICAgIGNhdCA+IlwkdG1wL2RlZmluZXMuc2VkIiA8PFxcQ0VPRgotL15bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qJGFjX3dvcmRfcmVbCSBdKlwkL2IgZGVmCi0vXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qJGFjX3dvcmRfcmVbKAkgXS9iIGRlZgotYgotOmRlZgotX0FDRU9GCi0gIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICAgIHNlZCAtZiAiJHRtcC9kZWZpbmVzLnNlZCInICIkYWNfaW4gPiRhY19vdXQiID4+JENPTkZJR19TVEFUVVMKLSAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KLSAgc2VkIDEsJHthY19tYXhfc2VkX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAotICBncmVwIC4gY29uZnRlc3QudGFpbCA+L2Rldi9udWxsIHx8IGJyZWFrCi0gIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCi1kb25lCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLQotZWNobyAiYWNfcmVzdWx0PSRhY19pbiIgPj4kQ09ORklHX1NUQVRVUwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgPiIkdG1wL2NvbmZpZy5oIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIgPj4iJHRtcC9jb25maWcuaCIKLSAgICBpZiBkaWZmICRhY19maWxlICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1Ci1lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAkYWNfZmlsZQotICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICRhY19maWxlCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIKLSAgZmkKLSAgcm0gLWYgIiR0bXAvb3V0MTIiCi0jIENvbXB1dGUgJGFjX2ZpbGUncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkYWNfZmlsZSB8ICRhY19maWxlOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkYWNfZmlsZSIgPmAkYXNfZGlybmFtZSAtLSAkYWNfZmlsZSB8fAotJGFzX2V4cHIgWCRhY19maWxlIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgkYWNfZmlsZSA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYJGFjX2ZpbGUgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCRhY19maWxlIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYJGFjX2ZpbGUgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgL3N0YW1wLWgkX2FtX3N0YW1wX2NvdW50Ci0gOzsKLQotICA6QykgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci1lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KLSA7OwotICBlc2FjCi0KLQotICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KLSAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IGZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbwotICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAotICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgotICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQotICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgaWYgc2VkIDEwcSAiJG1mIiB8IGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAotJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRtZiIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIGVsc2UKLSAgICBjb250aW51ZQotICBmaQotICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCi0gIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKLSAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCi0gICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAjIGV4cGFuc2lvbi4KLSAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0gICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCi0gICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAotJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgIHsgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLSAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgotICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICBkb25lCi1kb25lCi0gOzsKLQotICBlc2FjCi1kb25lICMgZm9yIGFjX3RhZwotCi0KLXsgKGV4aXQgMCk7IGV4aXQgMDsgfQotX0FDRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLQotCi0jIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCi0jIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KLSMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCi0jIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKLSMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCi0jIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCi0jIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKLSMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCi1pZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KLSAgYWNfY3Nfc3VjY2Vzcz06Ci0gIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KLSAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKLSAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKLSAgZXhlYyA1Pi9kZXYvbnVsbAotICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCi0gIGV4ZWMgNT4+Y29uZmlnLmxvZwotICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAotICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KLSAgJGFjX2NzX3N1Y2Nlc3MgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9jb25maWd1cmUuaW4gYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTcyZWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotZG5sCi1kbmwKLQotQUNfUFJFUkVRKDIuNTApCi0KLUFDX0lOSVQob3JnLmVjbGlwc2UucHRwLnByb3h5LCAyLjEuNCkKLUFDX0NPTkZJR19TUkNESVIoc3JjL3Byb3h5LmMpCi1BQ19DT05GSUdfSEVBREVSUyhjb25maWcuaCkKLQotQU1fSU5JVF9BVVRPTUFLRQotCi1BQ19DQU5PTklDQUxfQlVJTEQKLQotZG5sCi1kbmwgRWNsaXBzZSBhZGRzIHZlcnNpb24gbnVtYmVyIHRvIGVuZCBvZiBwYWNrYWdlIHdoZW4gZGVwbG95aW5nIHZpYSB1cGRhdGUgc2l0ZQotZG5sCi0KLVVUSUxTPSIuLi9vcmcuZWNsaXBzZS5wdHAudXRpbHMiCi1pZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JVVRJTFM9ImBlY2hvICR7VVRJTFN9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JCUFDX01TR19FUlJPUihbdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLWRubAotZG5sIENoZWNrIGZvciBwcm9ncmFtcy4KLWRubAotCi1BQ19QUk9HX0NDCi1BTV9QUk9HX0NDX0NfTwotQUNfUFJPR19JTlNUQUxMCi1BQ19QUk9HX01BS0VfU0VUCi1BQ19QUk9HX1JBTkxJQgotCi1vcz1gdW5hbWUgLXNgCi1pZiB0ZXN0ICJ4JG9zIiA9ICJ4QUlYIiA7IHRoZW4KLQlDRkxBR1M9IiRDRkxBR1MgLXFpbmZvPWdlbiAtcWNwbHVzY210IC1JJFVUSUxTL2luY2x1ZGUiCi1lbHNlCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIC1JJFVUSUxTL2luY2x1ZGUiCi1maQotTElCUz0iJExJQlMgLUwkVVRJTFMiCi0KLWRubAotZG5sIENoZWNrIGZvciBsaWJyYXJpZXMuCi1kbmwKLQotQUNfQ0hFQ0tfTElCKHV0aWxzLCBiaXRzZXRfbmV3KQotCi1BSF9WRVJCQVRJTShbREVCVUddLAotWyNpZmRlZiBERUJVRwotI2RlZmluZSBERUJVR19QUklOVChmb3JtYXQsIC4uLikJcHJpbnRmKGZvcm1hdCwgX19WQV9BUkdTX18pOyBmZmx1c2goc3Rkb3V0KQotI2Vsc2UgLyogREVCVUcgKi8KLSNkZWZpbmUgREVCVUdfUFJJTlQoZm9ybWF0LCAuLi4pCi0jZW5kaWYgLyogREVCVUcgKi9dKQotCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvZGVwY29tcCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2RlcGNvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZTJkM2IuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA0LTA1LTMxLjIzCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCi1hcyBzaWRlLWVmZmVjdHMuCi0KLUVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgotICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KLSAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KLSAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0IDAKLSAgICA7OwotICAtdiB8IC0tdiopCi0gICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKLSAgICBleGl0IDAKLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAkZGVwZmlsZQotICAgIGVjaG8gPj4gJGRlcGZpbGUKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAotICAgPj4gJGRlcGZpbGUKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKLSAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIERlcGVuZGVuY2llcyBhcmUgb3V0cHV0IGluIC5sby5kIHdpdGggbGlidG9vbCAxLjQuCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhleSBhcmUgb3V0cHV0IGJvdGggaW4gJGRpci5saWJzLyRiYXNlLm8uZAotICAgICAgIyBhbmQgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQgJGRpciRiYXNlLm8uZC4gIFdlIHByb2Nlc3MgdGhlCi0gICAgICAjIGxhdHRlciwgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgYmUgY2xlYW5lZCB3aGVuICRkaXIubGlicyBpcwotICAgICAgIyBlcmFzZWQuCi0gICAgICB0bXBkZXBmaWxlMT0iJGRpci5saWJzLyRiYXNlLmxvLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLm8uZCIKLSAgICAgIHRtcGRlcGZpbGUzPSIkZGlyLmxpYnMvJGJhc2UuZCIKLSAgICAgICIkQCIgLVdjLC1NRAotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZTE9IiRkaXIkYmFzZS5vLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLmQiCi0gICAgICB0bXBkZXBmaWxlMz0iJGRpciRiYXNlLmQiCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUxIjsgdGhlbgotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUxIgotICAgZWxpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTIiOyB0aGVuCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTMiCi0gICBmaQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAotICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCi0gICIkQCIgfHwgZXhpdCAkPwotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgotICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ub25lKQotICBleGVjICIkQCIKLSAgOzsKLQotKikKLSAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eS5oIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q1MjJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2luY2x1ZGUvcHJveHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaWZuZGVmIF9QUk9YWV9IXwotI2RlZmluZSBfUFJPWFlfSF8KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPGxpc3QuaD4KLQotI2luY2x1ZGUgInByb3h5X21zZy5oIgotI2luY2x1ZGUgInByb3h5X2NtZC5oIgotI2luY2x1ZGUgInByb3h5X2V2ZW50LmgiCi0jaW5jbHVkZSAicHJveHlfYXR0ci5oIgotCi0jZGVmaW5lIFBST1hZX1JFU19PSwkJMAotI2RlZmluZSBQUk9YWV9SRVNfRVJSCQktMQotCi0jZGVmaW5lIFBST1hZX0VSUl9DTElFTlQJMAotI2RlZmluZSBQUk9YWV9FUlJfU0VSVkVSCTEKLSNkZWZpbmUgUFJPWFlfRVJSX1BST1RPCQkyCi0jZGVmaW5lIFBST1hZX0VSUl9TWVNURU0JMwotCi0jZGVmaW5lIFBST1hZX0VWRU5UX0hBTkRMRVIJCTEKLSNkZWZpbmUgUFJPWFlfQ01EX0hBTkRMRVIJCTIKLQotc3RydWN0IHByb3h5Owotc3RydWN0IHByb3h5X2NsbnQ7Ci1zdHJ1Y3QgcHJveHlfc3ZyOwotCi1zdHJ1Y3QgcHJveHlfY2xudF9oZWxwZXJfZnVuY3MgewotCXZvaWQgKCpldmVudGhhbmRsZXIpKHZvaWQgKiwgdm9pZCAqKTsKLQl2b2lkICpldmVudGRhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHJveHlfY2xudF9oZWxwZXJfZnVuY3MJcHJveHlfY2xudF9oZWxwZXJfZnVuY3M7Ci0KLXN0cnVjdCBwcm94eV9jbG50X2Z1bmNzIHsKLQkvKgotCSAqIFNlcnZpY2UgZnVuY3Rpb25zCi0JICovCi0JaW50ICgqaW5pdCkoc3RydWN0IHByb3h5X2NsbnQgKiwgdm9pZCAqKiwgY2hhciAqLCB2YV9saXN0KTsKLQlpbnQgKCpjb25uZWN0KShzdHJ1Y3QgcHJveHlfY2xudCAqKTsKLQlpbnQgKCpjcmVhdGUpKHN0cnVjdCBwcm94eV9jbG50ICopOwotCWludCAoKnByb2dyZXNzKShzdHJ1Y3QgcHJveHlfY2xudCAqKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBwcm94eV9jbG50X2Z1bmNzCXByb3h5X2NsbnRfZnVuY3M7Ci0KLXN0cnVjdCBwcm94eV9zdnJfaGVscGVyX2Z1bmNzIHsKLQkvKgotCSAqIFNlcnZpY2UgZnVuY3Rpb25zCi0JICovCi0JaW50ICgqbmV3Y29ubikodm9pZCk7Ci0JaW50ICgqbnVtc2VydmVycykodm9pZCk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcwlwcm94eV9zdnJfaGVscGVyX2Z1bmNzOwotCi0vKgotICogRnVuY3Rpb25zIGZvciBtYW5hZ2luZyBwcm94eSBzZXJ2ZXIuCi0gKi8KLXN0cnVjdCBwcm94eV9zdnJfZnVuY3MgewotCWludCAoKmluaXQpKHN0cnVjdCBwcm94eV9zdnIgKiwgdm9pZCAqKik7Ci0JaW50ICgqY3JlYXRlKShzdHJ1Y3QgcHJveHlfc3ZyICosIGludCk7Ci0JaW50ICgqY29ubmVjdCkoc3RydWN0IHByb3h5X3N2ciAqLCBjaGFyICosIGludCk7Ci0JaW50ICgqcHJvZ3Jlc3MpKHN0cnVjdCBwcm94eV9zdnIgKik7Ci0Jdm9pZCAoKmZpbmlzaCkoc3RydWN0IHByb3h5X3N2ciAqKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBwcm94eV9zdnJfZnVuY3MJcHJveHlfc3ZyX2Z1bmNzOwotCi0vKgotICogQSBwcm94eSBjbGllbnQgc2VuZCBjb21tYW5kcyB0byBhbmQgcmVjZWl2ZXMgZXZlbnRzIGZyb20gYSBzZXJ2ZXIuCi0gKi8KLXN0cnVjdCBwcm94eV9jbG50IHsKLQlzdHJ1Y3QgcHJveHkgKgkJCQkJCXByb3h5OwotCXN0cnVjdCBwcm94eV9jbG50X2hlbHBlcl9mdW5jcyAqCWNsbnRfaGVscGVyX2Z1bmNzOwotCXZvaWQgKgkJCQkJCQkJY2xudF9kYXRhOwotCXN0cnVjdCB0aW1ldmFsICoJCQkJCWNsbnRfdGltZW91dDsKLQlMaXN0ICoJCQkJCQkJCWNsbnRfZXZlbnRzOwotfTsKLXR5cGVkZWYgc3RydWN0IHByb3h5X2NsbnQJcHJveHlfY2xudDsKLQotLyoKLSAqIEEgcHJveHkgc2VydmVyIHJlY2VpdmVzIGNvbW1hbmRzIGZyb20gYW5kIHNlbmRzIGV2ZW50cyB0byBhIGNsaWVudC4KLSAqLwotc3RydWN0IHByb3h5X3N2ciB7Ci0Jc3RydWN0IHByb3h5ICoJCQkJCXByb3h5OwotCXN0cnVjdCBwcm94eV9zdnJfaGVscGVyX2Z1bmNzICoJc3ZyX2hlbHBlcl9mdW5jczsKLQlzdHJ1Y3QgcHJveHlfY29tbWFuZHMgKgkJCXN2cl9jb21tYW5kczsKLQl2b2lkICoJCQkJCQkJc3ZyX2RhdGE7Ci0Jc3RydWN0IHRpbWV2YWwgKgkJCQlzdnJfdGltZW91dDsKLQlMaXN0ICoJCQkJCQkJc3ZyX2V2ZW50czsKLX07Ci10eXBlZGVmIHN0cnVjdCBwcm94eV9zdnIJcHJveHlfc3ZyOwotCi0vKgotICogVGhlIHByb3h5IHN0cnVjdHVyZSBlbmNhcHN1bGF0ZXMgYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKLSAqIG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sLgotICovCi1zdHJ1Y3QgcHJveHkgewotCWNoYXIgKgkJCQkJCQluYW1lOwotCXN0cnVjdCBwcm94eV9oYW5kbGVyX2Z1bmNzICoJaGFuZGxlcl9mdW5jczsKLQlzdHJ1Y3QgcHJveHlfY2xudF9mdW5jcyAqCQljbG50X2Z1bmNzOwotCXN0cnVjdCBwcm94eV9zdnJfZnVuY3MgKgkJc3ZyX2Z1bmNzOwotfTsKLXR5cGVkZWYgc3RydWN0IHByb3h5CXByb3h5OwotCi1leHRlcm4gcHJveHkgCXByb3hpZXNbXTsKLQotZXh0ZXJuIGludAkJZmluZF9wcm94eShjaGFyICosIHByb3h5ICoqKTsKLWV4dGVybiB2b2lkCQlwcm94eV9zZXRfZXJyb3IoaW50LCBjaGFyICopOwotZXh0ZXJuIGludAkJcHJveHlfZ2V0X2Vycm9yKHZvaWQpOwotZXh0ZXJuIGNoYXIgKglwcm94eV9nZXRfZXJyb3Jfc3RyKHZvaWQpOwotZXh0ZXJuIHZvaWQJCXByb3h5X2V2ZW50X2NhbGxiYWNrKHByb3h5ICosIGNoYXIgKik7Ci0KLWV4dGVybiBpbnQJCXByb3h5X3N2cl9pbml0KGNoYXIgKiwgc3RydWN0IHRpbWV2YWwgKiwgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcyAqLCBwcm94eV9jb21tYW5kcyAqY21kcywgcHJveHlfc3ZyICoqKTsKLWV4dGVybiBpbnQJCXByb3h5X3N2cl9jcmVhdGUocHJveHlfc3ZyICosIGludCk7Ci1leHRlcm4gaW50CQlwcm94eV9zdnJfY29ubmVjdChwcm94eV9zdnIgKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAkJcHJveHlfc3ZyX3Byb2dyZXNzKHByb3h5X3N2ciAqKTsKLWV4dGVybiB2b2lkCQlwcm94eV9zdnJfZmluaXNoKHByb3h5X3N2ciAqKTsKLWV4dGVybiB2b2lkCQlwcm94eV9zdnJfcXVldWVfbXNnKHByb3h5X3N2ciAqLCBwcm94eV9tc2cgKik7Ci0KLWV4dGVybiBpbnQJCXByb3h5X2NsbnRfaW5pdChjaGFyICosIHN0cnVjdCB0aW1ldmFsICosIHByb3h5X2NsbnRfaGVscGVyX2Z1bmNzICosIHByb3h5X2NsbnQgKiosIGNoYXIgKiwgdmFfbGlzdCk7Ci1leHRlcm4gaW50IAkJcHJveHlfY2xudF9jb25uZWN0KHByb3h5X2NsbnQgKik7Ci1leHRlcm4gaW50IAkJcHJveHlfY2xudF9jcmVhdGUocHJveHlfY2xudCAqKTsKLWV4dGVybiBpbnQgCQlwcm94eV9jbG50X3Byb2dyZXNzKHByb3h5X2NsbnQgKik7Ci1leHRlcm4gdm9pZAkJcHJveHlfY2xudF9xdWV1ZV9tc2cocHJveHlfY2xudCAqLCBwcm94eV9tc2cgKik7Ci0KLSNlbmRpZiAvKiBfUFJPWFlfSF8qLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9hdHRyLmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X2F0dHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmNmUyOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X2F0dHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFBST1hZX0FUVFJfSF8KLSNkZWZpbmUgUFJPWFlfQVRUUl9IXwotCi0vKgotICogUHJlZGVmaW5lZCBhdHRyaWJ1dGUgSUQncyBhbmQgdmFsdWVzLiBUaGVzZSBtdXN0IEVYQUNUTFkgbWF0Y2ggb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcwotICovCi0KLS8qCi0gKiBFbGVtZW50IGF0dHJpYnV0ZXMKLSAqLwotI2RlZmluZSBFTEVNRU5UX0lEX0FUVFIJCQkJImlkIgotI2RlZmluZSBFTEVNRU5UX05BTUVfQVRUUgkJCSJuYW1lIgotCi0vKgotICogTWFjaGluZSBhdHRyaWJ1dGVzCi0gKi8KLSNkZWZpbmUgTUFDSElORV9TVEFURV9BVFRSCQkJIm1hY2hpbmVTdGF0ZSIKLSNkZWZpbmUgCU1BQ0hJTkVfU1RBVEVfVU5LTk9XTgkJIlVOS05PV04iCi0jZGVmaW5lIAlNQUNISU5FX1NUQVRFX1VQCQkJIlVQIgotI2RlZmluZSAJTUFDSElORV9TVEFURV9ET1dOCQkJIkRPV04iCi0jZGVmaW5lIAlNQUNISU5FX1NUQVRFX0FMRVJUCQkJIkFMRVJUIgotCi0vKgotICogSm9iIGF0dHJpYnV0ZXMKLSAqLwotI2RlZmluZSBKT0JfU1RBVEVfQVRUUgkJCQkiam9iU3RhdGUiCi0jZGVmaW5lIAlKT0JfU1RBVEVfSU5JVAkJCQkiU1RBUlRFRCIKLSNkZWZpbmUgCUpPQl9TVEFURV9SVU5OSU5HCQkJIlJVTk5JTkciCi0jZGVmaW5lIAlKT0JfU1RBVEVfVEVSTUlOQVRFRAkJIlRFUk1JTkFURUQiCi0jZGVmaW5lIAlKT0JfU1RBVEVfRVJST1IJCQkJIkVSUk9SIgotI2RlZmluZSBKT0JfU1VCX0lEX0FUVFIJCQkJImpvYlN1YklkIgotI2RlZmluZSBKT0JfSURfQVRUUgkJCQkJImpvYklkIgotI2RlZmluZSBKT0JfTlVNX1BST0NTX0FUVFIJCQkiam9iTnVtUHJvY3MiCi0jZGVmaW5lIEpPQl9FWEVDX05BTUVfQVRUUgkJCSJleGVjTmFtZSIKLSNkZWZpbmUgSk9CX0VYRUNfUEFUSF9BVFRSCQkJImV4ZWNQYXRoIgotI2RlZmluZSBKT0JfV09SS0lOR19ESVJfQVRUUgkJIndvcmtpbmdEaXIiCi0jZGVmaW5lIEpPQl9QUk9HX0FSR1NfQVRUUgkJCSJwcm9nQXJncyIKLSNkZWZpbmUgSk9CX0VOVl9BVFRSCQkJCSJlbnYiCi0jZGVmaW5lIEpPQl9ERUJVR19FWEVDX05BTUVfQVRUUgkiZGVidWdFeGVjTmFtZSIKLSNkZWZpbmUgSk9CX0RFQlVHX0VYRUNfUEFUSF9BVFRSCSJkZWJ1Z0V4ZWNQYXRoIgotI2RlZmluZSBKT0JfREVCVUdfQVJHU19BVFRSCQkJImRlYnVnQXJncyIKLSNkZWZpbmUgSk9CX0RFQlVHX0ZMQUdfQVRUUgkJCSJkZWJ1ZyIKLQotLyoKLSAqIE5vZGUgYXR0cmlidXRlcwotICovCi0jZGVmaW5lIE5PREVfU1RBVEVfQVRUUgkJCQkibm9kZVN0YXRlIgotI2RlZmluZSAJTk9ERV9TVEFURV9VUAkJCQkiVVAiCi0jZGVmaW5lIAlOT0RFX1NUQVRFX0RPV04JCQkJIkRPV04iCi0jZGVmaW5lIAlOT0RFX1NUQVRFX0VSUk9SCQkJIkVSUk9SIgotI2RlZmluZSAJTk9ERV9TVEFURV9VTktOT1dOCQkJIlVOS05PV04iCi0jZGVmaW5lIE5PREVfTlVNQkVSX0FUVFIJCQkibm9kZU51bWJlciIKLSNpZmRlZiBIQVZFX1NZU19CUFJPQ19ICi0jZGVmaW5lIE5PREVfR1JPVVBfQVRUUgkJCQkibm9kZUdyb3VwIgotI2RlZmluZSBOT0RFX1VTRVJfQVRUUgkJCQkibm9kZVVzZXIiCi0jZGVmaW5lIE5PREVfTU9ERV9BVFRSCQkJCSJub2RlTW9kZSIKLSNkZWZpbmUgCURFRkFVTFRfTk9ERV9NT0RFCQkwMTExCi0jZW5kaWYgLyogSEFWRV9TWVNfQlBST0NfSCAqLwotCi0vKgotICogUXVldWUgYXR0cmlidXRlcwotICovCi0jZGVmaW5lIFFVRVVFX1NUQVRFX0FUVFIJCQkicXVldWVTdGF0ZSIKLSNkZWZpbmUJCVFVRVVFX1NUQVRFX05PUk1BTAkJCSJOT1JNQUwiCi0jZGVmaW5lCQlRVUVVRV9TVEFURV9DT0xMRUNUSU5HCQkiQ09MTEVDVElORyIKLSNkZWZpbmUJCVFVRVVFX1NUQVRFX0RSQUlOSU5HCQkiRFJBSU5JTkciCi0jZGVmaW5lCQlRVUVVRV9TVEFURV9TVE9QUEVECQkJIlNUT1BQRUQiCi0jZGVmaW5lIFFVRVVFX0lEX0FUVFIJCQkJInF1ZXVlSWQiCi0KLS8qCi0gKiBQcm9jZXNzIGF0dHJpYnV0ZXMKLSAqLwotI2RlZmluZSBQUk9DX1NUQVRFX0FUVFIJCQkJInByb2Nlc3NTdGF0ZSIKLSNkZWZpbmUJCVBST0NfU1RBVEVfU1RBUlRJTkcJCQkiU1RBUlRJTkciCi0jZGVmaW5lIAlQUk9DX1NUQVRFX1JVTk5JTkcJCQkiUlVOTklORyIKLSNkZWZpbmUJCVBST0NfU1RBVEVfRVhJVEVECQkJIkVYSVRFRCIKLSNkZWZpbmUJCVBST0NfU1RBVEVfRVhJVEVEX1NJR05BTExFRAkiRVhJVEVEX1NJR05BTExFRCIKLSNkZWZpbmUJCVBST0NfU1RBVEVfU1RPUFBFRAkJCSJTVE9QUEVEIgotI2RlZmluZQkJUFJPQ19TVEFURV9FUlJPUgkJCSJFUlJPUiIKLSNkZWZpbmUgUFJPQ19OT0RFSURfQVRUUgkJCSJwcm9jZXNzTm9kZUlkIgotI2RlZmluZSBQUk9DX1BJRF9BVFRSCQkJCSJwcm9jZXNzUElEIgotI2RlZmluZSBQUk9DX0lOREVYX0FUVFIJCQkJInByb2Nlc3NJbmRleCIKLSNkZWZpbmUgUFJPQ19TVERPVVRfQVRUUgkJCSJwcm9jZXNzU3Rkb3V0IgotI2RlZmluZSBQUk9DX0VYSVRDT0RFX0FUVFIJCQkicHJvY2Vzc0V4aXRDb2RlIgotI2RlZmluZSBQUk9DX1NJR05BTE5BTUVfQVRUUgkJInByb2Nlc3NTaWduYWxOYW1lIgotCi0vKgotICogTWVzc2FnZSBhdHRyaWJ1dGVzCi0gKi8KLSNkZWZpbmUgTVNHX0xFVkVMX0FUVFIJCQkJIm1lc3NhZ2VMZXZlbCIKLSNkZWZpbmUJCU1TR19MRVZFTF9GQVRBTAkJCQkiRkFUQUwiCi0jZGVmaW5lCQlNU0dfTEVWRUxfRVJST1IJCQkJIkVSUk9SIgotI2RlZmluZQkJTVNHX0xFVkVMX1dBUk5JTkcJCQkiV0FSTklORyIKLSNkZWZpbmUJCU1TR19MRVZFTF9JTkZPCQkJCSJJTkZPIgotI2RlZmluZSBNU0dfQ09ERV9BVFRSCQkJCSJtZXNzYWdlQ29kZSIKLSNkZWZpbmUgTVNHX1RFWFRfQVRUUgkJCQkibWVzc2FnZVRleHQiCi0KLS8qCi0gKiBFUlJPUiBhdHRyaWJ1dGVzCi0gKi8KLSNkZWZpbmUgRVJST1JfQ09ERV9BVFRSCQkJCSJlcnJvckNvZGUiCi0jZGVmaW5lIEVSUk9SX01TR19BVFRSCQkJCSJlcnJvck1zZyIKLQotLyoKLSAqIE1pc2NlbGxhbmVvdXMgYXR0cmlidXRlcwotICovCi0jZGVmaW5lIFBST1RPQ09MX1ZFUlNJT05fQVRUUgkJInZlcnNpb24iCi0jZGVmaW5lIEJBU0VfSURfQVRUUgkJCQkiYmFzZUlkIgotCi1leHRlcm4gaW50CQlwcm94eV90ZXN0X2F0dHJpYnV0ZShjaGFyICprZXksIGNoYXIgKmF0dHJfc3RyKTsKLWV4dGVybiBjaGFyICoJcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoY2hhciAqYXR0cl9zdHIpOwotZXh0ZXJuIGludAkJcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9pbnQoY2hhciAqYXR0cl9zdHIpOwotZXh0ZXJuIGludAkJcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9ib29sKGNoYXIgKmF0dHJfc3RyKTsKLSNlbmRpZiAvKlBST1hZX0FUVFJfSF8qLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9jbWQuaCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2luY2x1ZGUvcHJveHlfY21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjliMzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9jbWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpZm5kZWYgUFJPWFlfQ01EX0hfCi0jZGVmaW5lIFBST1hZX0NNRF9IXwotCi0jZGVmaW5lIENNRF9RVUlUCQkJMAotCi0vKgotICogQ29tbWFuZCBkaXNwYXRjaCBzdHJ1Y3R1cmUKLSAqLwotCi10eXBlZGVmIGludCAoKnByb3h5X2NtZCkoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKLQotc3RydWN0IHByb3h5X2NvbW1hbmRzIHsKLQlpbnQJCQljbWRfYmFzZTsKLQlpbnQJCQljbWRfc2l6ZTsKLQlwcm94eV9jbWQgKgljbWRfZnVuY3M7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHJveHlfY29tbWFuZHMJcHJveHlfY29tbWFuZHM7Ci0KLSNlbmRpZiAvKlBST1hZX0NNRF9IXyovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X2V2ZW50LmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X2V2ZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMDg0MGEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9ldmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1BST1hZX0VWRU5UX0hfCi0jZGVmaW5lIF9QUk9YWV9FVkVOVF9IXwotCi0vKgotICogRXZlbnQgY29kZSBkZWZpbml0aW9ucy4KLSAqCi0gKiBUaGVzZSBhcmUgdGhlIGV2ZW50cyB1c2VkIGJ5IHRoZSBwcm94eSBydW50aW1lIHN5c3RlbS4KLSAqCi0gKiBFdmVudCBjb2RlcyB0aGF0IGFyZSBtYXJrZWQgJ0xPQ0FMIEVWRU5UJyBhcmUgKm5vdCogc2VudCBhY3Jvc3MgdGhlIHdpcmUuIFRoZXkKLSAqIGFyZSB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIG9ubHkgKG1haW5seSBvbiB0aGUgSmF2YSBzaWRlLCBidXQgY2FuCi0gKiBiZSB1c2VkIGJ5IGEgQyBjbGllbnQgaWYgZGVzaXJlZCkuIEFsbCBvdGhlciBldmVudHMgYXJlIHNlbnQgYWNyb3NzCi0gKiB0aGUgd2lyZS4KLSAqLwotCi0jZGVmaW5lIFBST1hZX0VWX09LCQkJCTAKLSNkZWZpbmUgUFJPWFlfRVZfTUVTU0FHRQkJMQotI2RlZmluZSBQUk9YWV9FVl9DT05ORUNURUQJCTIJLyogTE9DQUwgRVZFTlQgKi8KLSNkZWZpbmUgUFJPWFlfRVZfRElTQ09OTkVDVEVECTMJLyogTE9DQUwgRVZFTlQgKi8KLSNkZWZpbmUgUFJPWFlfRVZfVElNRU9VVAkJNAkvKiBMT0NBTCBFVkVOVCAqLwotI2RlZmluZSBQUk9YWV9FVl9FUlJPUgkJCTUKLSNkZWZpbmUgUFJPWFlfRVZfU0hVVERPV04JCTYKLQotLyoKLSAqIENvZGVzIG11c3QgRVhBQ1RMWSBtYXRjaCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0ucHJveHkuZXZlbnQuSVByb3h5UnVudGltZUV2ZW50Ci0gKi8KLSNkZWZpbmUgUFJPWFlfRVZfUlRfT0ZGU0VUCQkJCTIwMAotLyoKLSAqIEludGVybmFsIHN0YXRlIGV2ZW50cwotICovCi0jZGVmaW5lIFBST1hZX0VWX1JUX1NUQVJUVVBfU1RBVEUJCVBST1hZX0VWX1JUX09GRlNFVCArIDEJLypMT0NBTCBFVkVOVCAqLwotI2RlZmluZSBQUk9YWV9FVl9SVF9DT05ORUNURURfU1RBVEUJCVBST1hZX0VWX1JUX09GRlNFVCArIDIJLypMT0NBTCBFVkVOVCAqLwotI2RlZmluZSBQUk9YWV9FVl9SVF9SVU5OSU5HX1NUQVRFCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyAzCS8qTE9DQUwgRVZFTlQgKi8KLSNkZWZpbmUgUFJPWFlfRVZfUlRfU0hVVERPV05fU1RBVEUJCVBST1hZX0VWX1JUX09GRlNFVCArIDQJLypMT0NBTCBFVkVOVCAqLwotI2RlZmluZSBQUk9YWV9FVl9SVF9FUlJPUl9TVEFURQkJCVBST1hZX0VWX1JUX09GRlNFVCArIDUJLypMT0NBTCBFVkVOVCAqLwotLyoKLSAqIEludGVybmFsIGVycm9yIGV2ZW50cwotICovCi0jZGVmaW5lIFBST1hZX0VWX1JUX1NUQVJUVVBfRVJST1IJCVBST1hZX0VWX1JUX09GRlNFVCArIDEwCS8qTE9DQUwgRVZFTlQgKi8KLQotLyoKLSAqIENvbW1hbmQgZXJyb3IgZXZlbnRzCi0gKi8KLSNkZWZpbmUgUFJPWFlfRVZfUlRfU1VCTUlUSk9CX0VSUk9SCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyAxMQotI2RlZmluZSBQUk9YWV9FVl9SVF9URVJNSU5BVEVKT0JfRVJST1IJUFJPWFlfRVZfUlRfT0ZGU0VUICsgMTIKLS8qCi0gKiBOZXcgbW9kZWwgZWxlbWVudCBldmVudHMKLSAqLwotI2RlZmluZSBQUk9YWV9FVl9SVF9ORVdfSk9CCQkJCVBST1hZX0VWX1JUX09GRlNFVCArIDIwCi0jZGVmaW5lIFBST1hZX0VWX1JUX05FV19NQUNISU5FCQkJUFJPWFlfRVZfUlRfT0ZGU0VUICsgMjEKLSNkZWZpbmUgUFJPWFlfRVZfUlRfTkVXX05PREUJCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyAyMgotI2RlZmluZSBQUk9YWV9FVl9SVF9ORVdfUFJPQ0VTUwkJCVBST1hZX0VWX1JUX09GRlNFVCArIDIzCi0jZGVmaW5lIFBST1hZX0VWX1JUX05FV19RVUVVRQkJCVBST1hZX0VWX1JUX09GRlNFVCArIDI0Ci0vKgotICogQ2hhbmdlIG1vZGVsIGVsZW1lbnQgZXZlbnRzCi0gKi8KLSNkZWZpbmUgUFJPWFlfRVZfUlRfSk9CX0NIQU5HRQkJCVBST1hZX0VWX1JUX09GRlNFVCArIDMwCi0jZGVmaW5lIFBST1hZX0VWX1JUX01BQ0hJTkVfQ0hBTkdFCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyAzMQotI2RlZmluZSBQUk9YWV9FVl9SVF9OT0RFX0NIQU5HRQkJCVBST1hZX0VWX1JUX09GRlNFVCArIDMyCi0jZGVmaW5lIFBST1hZX0VWX1JUX1BST0NFU1NfQ0hBTkdFCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyAzMwotI2RlZmluZSBQUk9YWV9FVl9SVF9RVUVVRV9DSEFOR0UJCVBST1hZX0VWX1JUX09GRlNFVCArIDM0Ci0vKgotICogUmVtb3ZlIG1vZGVsIGVsZW1lbnQgZXZlbnRzCi0gKi8KLSNkZWZpbmUgUFJPWFlfRVZfUlRfUkVNT1ZFX0FMTAkJCVBST1hZX0VWX1JUX09GRlNFVCArIDQwCi0jZGVmaW5lIFBST1hZX0VWX1JUX1JFTU9WRV9KT0IJCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyA0MQotI2RlZmluZSBQUk9YWV9FVl9SVF9SRU1PVkVfTUFDSElORQkJUFJPWFlfRVZfUlRfT0ZGU0VUICsgNDIKLSNkZWZpbmUgUFJPWFlfRVZfUlRfUkVNT1ZFX05PREUJCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyA0MwotI2RlZmluZSBQUk9YWV9FVl9SVF9SRU1PVkVfUFJPQ0VTUwkJUFJPWFlfRVZfUlRfT0ZGU0VUICsgNDQKLSNkZWZpbmUgUFJPWFlfRVZfUlRfUkVNT1ZFX1FVRVVFCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyA0NQotLyoKLSAqIE1pc2NlbGxhbmVvdXMgZXZlbnRzCi0gKi8KLSNkZWZpbmUgUFJPWFlfRVZfUlRfTUVTU0FHRQkJCQlQUk9YWV9FVl9SVF9PRkZTRVQgKyA1MAkvKiBMT0NBTCBFVkVOVCAqLwotI2RlZmluZSBQUk9YWV9FVl9SVF9BVFRSX0RFRgkJCVBST1hZX0VWX1JUX09GRlNFVCArIDUxCi0KLXZvaWQJCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKHByb3h5X21zZyAqbSwgY2hhciAqYXR0ciwgY2hhciAqdmFsdWUpOwotdm9pZAkJcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUocHJveHlfbXNnICptLCBjaGFyICphdHRyLCBpbnQgdmFsdWUpOwotcHJveHlfbXNnICoJcHJveHlfb2tfZXZlbnQoaW50IHRyYW5zX2lkKTsKLXByb3h5X21zZyAqCXByb3h5X3NodXRkb3duX2V2ZW50KGludCB0cmFuc19pZCk7Ci1wcm94eV9tc2cgKglwcm94eV9tZXNzYWdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqbGV2ZWwsIGludCBjb2RlLCBjaGFyICpmbXQsIC4uLik7Ci1wcm94eV9tc2cgKglwcm94eV9lcnJvcl9ldmVudChpbnQgdHJhbnNfaWQsIGludCBjb2RlLCBjaGFyICpmbXQsIC4uLik7Ci1wcm94eV9tc2cgKglwcm94eV9zdWJtaXRqb2JfZXJyb3JfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpqb2JTdWJJZCwgaW50IGNvZGUsIGNoYXIgKm1zZyk7Ci1wcm94eV9tc2cgKglwcm94eV90ZXJtaW5hdGVqb2JfZXJyb3JfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpqb2JfaWQsIGludCBjb2RlLCBjaGFyICptc2cpOwotcHJveHlfbXNnICoJcHJveHlfYXR0cl9kZWZfaW50X2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWQsIGNoYXIgKm5hbWUsIGNoYXIgKmRlc2MsIGludCBkaXNwLCBpbnQgZGVmKTsKLXByb3h5X21zZyAqCXByb3h5X2F0dHJfZGVmX3N0cmluZ19ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkLCBjaGFyICpuYW1lLCBjaGFyICpkZXNjLCBpbnQgZGlzcCwgY2hhciAqZGVmKTsKLXByb3h5X21zZyAqCXByb3h5X25ld19tYWNoaW5lX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqcm1faWQsIGNoYXIgKm1hY2hpbmVfaWRfcmFuZ2UsIGNoYXIgKm5hbWUsIGNoYXIgKnN0YXRlKTsKLXByb3h5X21zZyAqCXByb3h5X25ld19qb2JfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpxdWV1ZV9pZCwgY2hhciAqam9iX2lkX3JhbmdlLCBjaGFyICpuYW1lLCBjaGFyICpzdGF0ZSwgY2hhciAqam9iU3ViSWQpOwotcHJveHlfbXNnICoJcHJveHlfbmV3X25vZGVfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICptYWNoX2lkLCBpbnQgbnVtX25vZGVzKTsKLXZvaWQJCXByb3h5X2FkZF9ub2RlKHByb3h5X21zZyAqbSwgY2hhciAqbm9kZV9pZCwgY2hhciAqbmFtZSwgY2hhciAqc3RhdGUsIGludCBleHRyYV9hdHRycyk7Ci1wcm94eV9tc2cgKglwcm94eV9uZXdfcHJvY2Vzc19ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmpvYl9pZCwgaW50IG51bV9wcm9jcyk7Ci12b2lkCQlwcm94eV9hZGRfcHJvY2Vzcyhwcm94eV9tc2cgKm0sIGNoYXIgKnByb2NfaWQsIGNoYXIgKm5hbWUsIGNoYXIgKnN0YXRlLCBpbnQgZXh0cmFfYXR0cnMpOwotcHJveHlfbXNnICoJcHJveHlfbmV3X3F1ZXVlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqcm1faWQsIGNoYXIgKnF1ZXVlX2lkLCBjaGFyICpuYW1lLCBjaGFyICpzdGF0ZSk7Ci1wcm94eV9tc2cgKglwcm94eV9qb2JfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UsIGludCBudW1fYXR0cnMpOwotcHJveHlfbXNnICoJcHJveHlfbWFjaGluZV9jaGFuZ2VfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICppZF9yYW5nZSwgaW50IG51bV9hdHRycyk7Ci1wcm94eV9tc2cgKglwcm94eV9ub2RlX2NoYW5nZV9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkX3JhbmdlLCBpbnQgbnVtX2F0dHJzKTsKLXByb3h5X21zZyAqCXByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UsIGludCBudW1fYXR0cnMpOwotcHJveHlfbXNnICoJcHJveHlfcXVldWVfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UsIGludCBudW1fYXR0cnMpOwotcHJveHlfbXNnICoJcHJveHlfcmVtb3ZlX2FsbF9ldmVudChpbnQgdHJhbnNfaWQpOwotcHJveHlfbXNnICoJcHJveHlfcmVtb3ZlX2pvYl9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkX3JhbmdlKTsKLXByb3h5X21zZyAqCXByb3h5X3JlbW92ZV9tYWNoaW5lX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UpOwotcHJveHlfbXNnICoJcHJveHlfcmVtb3ZlX25vZGVfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICppZF9yYW5nZSk7Ci1wcm94eV9tc2cgKglwcm94eV9yZW1vdmVfcHJvY2Vzc19ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkX3JhbmdlKTsKLXByb3h5X21zZyAqCXByb3h5X3JlbW92ZV9xdWV1ZV9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkX3JhbmdlKTsKLSNlbmRpZiAvKiAhX1BST1hZX0VWRU5UX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X21zZy5oIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9tc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2MTZiMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseQotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfUFJPWFlfTVNHX0hfCi0jZGVmaW5lIF9QUk9YWV9NU0dfSF8KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJiaXRzZXQuaCIKLQotI2RlZmluZSBNU0dfSURfU0laRQkJCTQKLSNkZWZpbmUgTVNHX0lEX01BU0sJCQkweGZmZmYKLSNkZWZpbmUgTVNHX1RSQU5TX0lEX1NJWkUJOAotI2RlZmluZSBNU0dfVFJBTlNfSURfTUFTSwkweGZmZmZmZmZmCi0jZGVmaW5lIE1TR19OQVJHU19TSVpFCQk4Ci0jZGVmaW5lIE1TR19OQVJHU19NQVNLCQkweGZmZmZmZmZmCi0jZGVmaW5lIE1TR19BUkdfTEVOX1NJWkUJOAotI2RlZmluZSBNU0dfQVJHX0xFTl9NQVNLCTB4ZmZmZmZmZmYKLQotLyoKLSAqIFByb3h5IGVycm9ycwotICovCi0jZGVmaW5lIEVSUk9SX01BTEZPUk1FRF9DT01NQU5ECTAKLQotc3RydWN0IHByb3h5X21zZyB7Ci0JaW50CQltc2dfaWQ7Ci0JaW50CQl0cmFuc19pZDsKLQlpbnQJCW51bV9hcmdzOwotCWludCAJYXJnX3NpemU7Ci0JaW50ICoJZnJlZV9hcmdzOwotCWNoYXIgKioJYXJnczsKLX07Ci10eXBlZGVmIHN0cnVjdCBwcm94eV9tc2cgcHJveHlfbXNnOwotCi1leHRlcm4gaW50IAkJCXByb3h5X2xpc3RfdG9fc3RyKExpc3QgKiwgaW50ICgqKSh2b2lkICosIGNoYXIgKiopLCBjaGFyICoqKTsKLWV4dGVybiB2b2lkCQkJcHJveHlfZ2V0X2RhdGEoY2hhciAqLCBjaGFyICoqLCBpbnQgKik7Ci1leHRlcm4gdm9pZAkJCXByb3h5X2dldF9pbnQoY2hhciAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZAkJCXByb3h5X2dldF9iaXRzZXQoY2hhciAqLCBiaXRzZXQgKiopOwotZXh0ZXJuIGludCAJCQlwcm94eV9kZXNlcmlhbGl6ZV9tc2coY2hhciAqLCBpbnQgbGVuLCBwcm94eV9tc2cgKiopOwotZXh0ZXJuIGludCAJCQlwcm94eV9zZXJpYWxpemVfbXNnKHByb3h5X21zZyAqLCBjaGFyICoqLCBpbnQgKik7Ci1leHRlcm4gaW50CQkJcHJveHlfbXNnX2RlY29kZV9zdHJpbmcoY2hhciAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIHZvaWQJCQlwcm94eV9tc2dfYWRkX2ludChwcm94eV9tc2cgKiwgaW50KTsKLWV4dGVybiB2b2lkCQkJcHJveHlfbXNnX2FkZF9zdHJpbmcocHJveHlfbXNnICosIGNoYXIgKik7Ci1leHRlcm4gdm9pZAkJCXByb3h5X21zZ19hZGRfc3RyaW5nX25vY29weShwcm94eV9tc2cgKiwgY2hhciAqKTsKLWV4dGVybiB2b2lkCQkJcHJveHlfbXNnX2FkZF9kYXRhKHByb3h5X21zZyAqLCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZAkJCXByb3h5X21zZ19hZGRfYXJncyhwcm94eV9tc2cgKiwgaW50LCBjaGFyICoqKTsKLWV4dGVybiB2b2lkCQkJcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShwcm94eV9tc2cgKiwgaW50LCBjaGFyICoqKTsKLWV4dGVybiB2b2lkCQkJcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KHByb3h5X21zZyAqLCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZAkJCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhwcm94eV9tc2cgKiwgY2hhciAqLCBjaGFyICopOwotZXh0ZXJuIHZvaWQJCQlwcm94eV9tc2dfYWRkX2JpdHNldChwcm94eV9tc2cgKiwgYml0c2V0ICopOwotZXh0ZXJuIHZvaWQJCQlwcm94eV9tc2dfaW5zZXJ0X2JpdHNldChwcm94eV9tc2cgKiwgYml0c2V0ICosIGludCk7Ci1leHRlcm4gdm9pZAkJCXByb3h5X21zZ19hZGRfbGlzdChwcm94eV9tc2cgKiwgTGlzdCAqLCB2b2lkICgqKShwcm94eV9tc2cgKiwgdm9pZCAqKSk7Ci1leHRlcm4gcHJveHlfbXNnICoJbmV3X3Byb3h5X21zZyhpbnQsIGludCk7Ci1leHRlcm4gdm9pZAkJCWZyZWVfcHJveHlfbXNnKHByb3h5X21zZyAqKTsKLWV4dGVybiB2b2lkCQkJcHJveHlfcXVldWVfbXNnKExpc3QgKiwgcHJveHlfbXNnICopOwotZXh0ZXJuIHZvaWQgCQlwcm94eV9wcm9jZXNzX21zZ3MoTGlzdCAqLCB2b2lkICgqKShwcm94eV9tc2cqLCB2b2lkICopLCB2b2lkICopOwotI2VuZGlmIC8qICFfUFJPWFlfTVNHX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X3N0ZGlvLmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X3N0ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDNlYjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9zdGRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfUFJPWFlfU1RESU9fSF8KLSNkZWZpbmUgX1BST1hZX1NURElPX0hfCi0KLSNpbmNsdWRlICJjb21wYXQuaCIKLQotI2RlZmluZSBNU0dfTEVOX1NJWkUJCTgKLSNkZWZpbmUgTVNHX0xFTkdUSF9NQVNLCQkweGZmZmZmZmZmCi0KLXN0cnVjdCBwcm94eV9zdGRpb19jb25uIHsKLQlwcm94eV9jbG50ICoJY2xudDsKLQlwcm94eV9zdnIgKgkJc3ZyOwotCWludAkJCQljb25uZWN0ZWQ7Ci0JaW50CQkJCXNlc3NfaW47IC8vIEZpbGUgZGVzY3JpcHRvciB0byByZWFkIGZyb20KLQlpbnQJCQkJc2Vzc19vdXQ7IC8vIEZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0bwotCWNoYXIgKgkJCWJ1ZjsKLQljaGFyCQkJbXNnX2xlbl9idWZbMTFdOwotCWludAkJCQlidWZfc2l6ZTsKLQlpbnQJCQkJYnVmX3BvczsKLQlpbnQJCQkJdG90YWxfcmVhZDsKLQljaGFyICoJCQltc2c7Ci0JaW50CQkJCW1zZ19sZW47Ci0Jdm9pZAkJCSgqZXZlbnRfaGFuZGxlcikodm9pZCAqLCB2b2lkICopOwotCXZvaWQgKgkJCWV2ZW50X2RhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHJveHlfc3RkaW9fY29ubglwcm94eV9zdGRpb19jb25uOwotCi1leHRlcm4gcHJveHlfY2xudF9mdW5jcyBwcm94eV9zdGRpb19jbG50X2Z1bmNzOwotZXh0ZXJuIHByb3h5X3N2cl9mdW5jcyBwcm94eV9zdGRpb19zdnJfZnVuY3M7Ci0KLWV4dGVybiB2b2lkCQlwcm94eV9zdGRpb19jcmVhdGVfY29ubihwcm94eV9zdGRpb19jb25uICoqKTsKLWV4dGVybiB2b2lkCQlwcm94eV9zdGRpb19kZXN0cm95X2Nvbm4ocHJveHlfc3RkaW9fY29ubiAqKTsKLWV4dGVybiBpbnQJCXByb3h5X3N0ZGlvX3JlY3ZfbXNncyhwcm94eV9zdGRpb19jb25uICopOwotZXh0ZXJuIGludAkJcHJveHlfc3RkaW9fZ2V0X21zZyhwcm94eV9zdGRpb19jb25uICosIGNoYXIgKiosIGludCAqbGVuKTsKLWV4dGVybiBpbnQJCXByb3h5X3N0ZGlvX3NlbmRfbXNnKHByb3h5X3N0ZGlvX2Nvbm4gKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAkJcHJveHlfc3RkaW9fZGVjb2RlX3N0cmluZyhjaGFyICosIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIHZvaWQJCXNraXBzcGFjZShjaGFyICopOwotZXh0ZXJuIGNoYXIgKglnZXR3b3JkKGNoYXIgKiopOwotCi0jZW5kaWYgLyogX1BST1hZX1NURElPX0hfKi8KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2luY2x1ZGUvcHJveHlfdGNwLmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9pbmNsdWRlL3Byb3h5X3RjcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRiMWFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2luY2x1ZGUvcHJveHlfdGNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaWZuZGVmIF9QUk9YWV9UQ1BfSF8KLSNkZWZpbmUgX1BST1hZX1RDUF9IXwotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0KLSNkZWZpbmUgUFJPWFlfVENQX1BPUlQJCTEyMzQ1Ci0jZGVmaW5lIE1TR19MRU5fU0laRQkJOAotI2RlZmluZSBNU0dfTEVOR1RIX01BU0sJCTB4ZmZmZmZmZmYKLQotc3RydWN0IHByb3h5X3RjcF9jb25uIHsKLQlwcm94eV9jbG50ICoJY2xudDsKLQlwcm94eV9zdnIgKgkJc3ZyOwotCWNoYXIgKgkJCWhvc3Q7Ci0JaW50CQkJCXBvcnQ7Ci0JaW50CQkJCWNvbm5lY3RlZDsKLQlTT0NLRVQJCQlzZXNzX3NvY2s7Ci0JU09DS0VUCQkJc3ZyX3NvY2s7Ci0JY2hhciAqCQkJYnVmOwotCWNoYXIJCQltc2dfbGVuX2J1ZlsxMV07Ci0JaW50CQkJCWJ1Zl9zaXplOwotCWludAkJCQlidWZfcG9zOwotCWludAkJCQl0b3RhbF9yZWFkOwotCWNoYXIgKgkJCW1zZzsKLQlpbnQJCQkJbXNnX2xlbjsKLQl2b2lkCQkJKCpldmVudF9oYW5kbGVyKSh2b2lkICosIHZvaWQgKik7Ci0Jdm9pZCAqCQkJZXZlbnRfZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBwcm94eV90Y3BfY29ubglwcm94eV90Y3BfY29ubjsKLQotZXh0ZXJuIHN0cnVjdCB0aW1ldmFsIFRDUFRJTUVPVVQ7Ci1leHRlcm4gcHJveHlfY2xudF9mdW5jcyBwcm94eV90Y3BfY2xudF9mdW5jczsKLWV4dGVybiBwcm94eV9zdnJfZnVuY3MgcHJveHlfdGNwX3N2cl9mdW5jczsKLQotZXh0ZXJuIHZvaWQJCXByb3h5X3RjcF9jcmVhdGVfY29ubihwcm94eV90Y3BfY29ubiAqKik7Ci1leHRlcm4gdm9pZAkJcHJveHlfdGNwX2Rlc3Ryb3lfY29ubihwcm94eV90Y3BfY29ubiAqKTsKLWV4dGVybiBpbnQJCXByb3h5X3RjcF9yZWN2X21zZ3MocHJveHlfdGNwX2Nvbm4gKik7Ci1leHRlcm4gaW50CQlwcm94eV90Y3BfZ2V0X21zZyhwcm94eV90Y3BfY29ubiAqLCBjaGFyICoqLCBpbnQgKmxlbik7Ci1leHRlcm4gaW50CQlwcm94eV90Y3Bfc2VuZF9tc2cocHJveHlfdGNwX2Nvbm4gKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAkJcHJveHlfdGNwX2RlY29kZV9zdHJpbmcoY2hhciAqLCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiB2b2lkCQlza2lwc3BhY2UoY2hhciAqKTsKLWV4dGVybiBjaGFyICoJZ2V0d29yZChjaGFyICoqKTsKLQotI2VuZGlmIC8qIF9QUk9YWV9UQ1BfSF8qLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5zdGFsbC1zaCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViYzY2OTEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9sdG1haW4uc2ggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzFkMjcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvbHRtYWluLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjUzMCArMCwwIEBACi0jIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBjb25maWd1cmUuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotYmFzZW5hbWU9InMsXi4qLywsZyIKLQotIyBXb3JrIGFyb3VuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIG9uIElSSVggNi41LiBPbiBJUklYIDYuNCssIHNoCi0jIGlzIGtzaCBidXQgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCBhcyAic2giIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZgotIyB0aGUgX1hQRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gMSAob25lKSwgdGhlIHNwZWNpYWwKLSMgcG9zaXRpb25hbCBwYXJhbWV0ZXIgJDAsIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIGlzIHRoZSBuYW1lIG9mIHRoZQotIyBmdW5jdGlvbi4KLXByb2dwYXRoPSIkMCIKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW06Ci1wcm9nbmFtZT1gZWNobyAiJHByb2dwYXRoIiB8ICRTRUQgJGJhc2VuYW1lYAotbW9kZW5hbWU9IiRwcm9nbmFtZSIKLQotIyBHbG9iYWwgdmFyaWFibGVzOgotRVhJVF9TVUNDRVNTPTAKLUVYSVRfRkFJTFVSRT0xCi0KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS41LjIwCi1USU1FU1RBTVA9IiAoMS4xMjIwLjIuMjg3IDIwMDUvMDgvMzEgMTg6NTQ6MTUpIgotCi0jIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCi0jIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1maQotCi0jIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgJGVjaG8uCi1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRlY2hvIHdpbGwgd29yay4KLSAgZXhlYyAkU0hFTEwgIiRwcm9ncGF0aCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAkRVhJVF9TVUNDRVNTCi1maQotCi1kZWZhdWx0X21vZGU9Ci1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi1tYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCi1ta2Rpcj0ibWtkaXIiCi1tdj0ibXYgLWYiCi1ybT0icm0gLWYiCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcYFxcIiRcXFxcXVwpL1xcXDEvZycKLSMgdGVzdCBFQkNESUMgb3IgQVNDSUkKLWNhc2UgYGVjaG8gWHx0ciBYICdcMTAxJ2AgaW4KLSBBKSAjIEFTQ0lJIGJhc2VkIHN5c3RlbQotICAgICMgXG4gaXMgbm90IGludGVycHJldGVkIGNvcnJlY3RseSBieSBTb2xhcmlzIDggL3Vzci91Y2IvdHIKLSAgU1AyTkw9J3RyIFwwNDAgXDAxMicKLSAgTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJwotICA7OwotICopICMgRUJDRElDIGJhc2VkIHN5c3RlbQotICBTUDJOTD0ndHIgXDEwMCBcbicKLSAgTkwyU1A9J3RyIFxyXG4gXDEwMFwxMDAnCi0gIDs7Ci1lc2FjCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0gIHNhdmVfTENfQUxMPSIkTENfQUxMIjsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwKLWZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQU5HPSIkTEFORyI7IExBTkc9QzsgZXhwb3J0IExBTkcKLWZpCi0KLSMgTWFrZSBzdXJlIElGUyBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0Ci1sdF9ubD0nCi0nCi1JRlM9IiAJJGx0X25sIgotCi1pZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgotICAkZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi1maQotCi0jIEdsb2JhbCB2YXJpYWJsZXMuCi1tb2RlPSRkZWZhdWx0X21vZGUKLW5vbm9wdD0KLXByZXY9Ci1wcmV2b3B0PQotcnVuPQotc2hvdz0iJGVjaG8iCi1zaG93X2hlbHA9Ci1leGVjdXRlX2RsZmlsZXM9Ci1sbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCi1vMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2hlbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnM6Ci0jIFRoaXMgc2VlbXMgdG8gYmUgdGhlIGJlc3QgcGxhY2UgZm9yIHRoZW0KLQotIyBmdW5jX3dpbjMyX2xpYmlkIGFyZwotIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCi0jCi0jIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKLSMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50Ci0jIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KLWZ1bmNfd2luMzJfbGliaWQgKCkKLXsKLSAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKLSAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKLSAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgotICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKLSAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCi0gICAgOzsKLSAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYwotICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwgXAotICAgICAgJEVHUkVQIC1lICdmaWxlIGZvcm1hdCBwZS1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nID4vZGV2L251bGwgOyB0aGVuCi0gICAgICB3aW4zMl9ubXJlcz1gZXZhbCAkTk0gLWYgcG9zaXggLUEgJDEgfCBcCi0Jc2VkIC1uIC1lICcxLDEwMHsvIEkgL3t4Oy9pbXBvcnQvIXtzL14vaW1wb3J0LztoO3A7fTt4O307fSdgCi0gICAgICBpZiB0ZXN0ICJYJHdpbjMyX25tcmVzIiA9ICJYaW1wb3J0IiA7IHRoZW4KLSAgICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgotICAgICAgZWxzZQotICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiCi0gICAgICBmaQotICAgIGZpCi0gICAgOzsKLSAgKkRMTCopCi0gICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKLSAgICA7OwotICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KLSAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCi0gICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQotICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgJGVjaG8gJHdpbjMyX2xpYmlkX3R5cGUKLX0KLQotCi0jIGZ1bmNfaW5mZXJfdGFnIGFyZwotIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCi0jIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgotIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQotIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCi0jIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJwotZnVuY19pbmZlcl90YWcgKCkKLXsKLSAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgotICAgICAgQ0NfcXVvdGVkPQotICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCi0JY2FzZSAkYXJnIGluCi0JICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQlDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGFyZyIKLSAgICAgIGRvbmUKLSAgICAgIGNhc2UgJEAgaW4KLSAgICAgICMgQmxhbmtzIGluIHRoZSBjb21tYW5kIG1heSBoYXZlIGJlZW4gc3RyaXBwZWQgYnkgdGhlIGNhbGxpbmcgc2hlbGwsCi0gICAgICAjIGJ1dCBub3QgZnJvbSB0aGUgQ0MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBjb25maWd1cmUgd2FzIHJ1bi4KLSAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRlY2hvICRDQ2AgIiogfCAiYCRlY2hvICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJGVjaG8gJENDX3F1b3RlZGAgIiogfCAiYCRlY2hvICRDQ19xdW90ZWRgICIqKSA7OwotICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKLSAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KLSAgICAgICopCi0JZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbwotCSAgaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCi0JICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCi0JICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCi0JICAgIENDX3F1b3RlZD0KLQkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCi0JICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLQkgICAgY2FzZSAkYXJnIGluCi0JICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgICAgYXJnPSJcIiRhcmdcIiIKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIENDX3F1b3RlZD0iJENDX3F1b3RlZCAkYXJnIgotCSAgZG9uZQotCSAgICBjYXNlICIkQCAiIGluCi0JICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJGVjaG8gJENDYCAiKiB8ICJgJGVjaG8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkZWNobyAkQ0NfcXVvdGVkYCAiKiB8ICJgJGVjaG8gJENDX3F1b3RlZGAgIiopCi0JICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKLQkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgotCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCi0JICAgICAgdGFnbmFtZT0kegotCSAgICAgIGJyZWFrCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQlkb25lCi0JIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KLQkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCi0JIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCi0JaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmFibGUgdG8gaW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCi0JICAkZWNobyAiJG1vZGVuYW1lOiBzcGVjaWZ5IGEgdGFnIHdpdGggXGAtLXRhZyciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotIyAgICAgICAgZWxzZQotIyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLX0KLQotCi0jIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKLWZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCi17Ci0gICAgZl9leF9hbl9hcl9kaXI9IiQxIjsgc2hpZnQKLSAgICBmX2V4X2FuX2FyX29sZGxpYj0iJDEiCi0KLSAgICAkc2hvdyAiKGNkICRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCAkZl9leF9hbl9hcl9vbGRsaWIpIgotICAgICRydW4gZXZhbCAiKGNkIFwkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggXCRmX2V4X2FuX2FyX29sZGxpYikiIHx8IGV4aXQgJD8KLSAgICBpZiAoJEFSIHQgIiRmX2V4X2FuX2FyX29sZGxpYiIgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICA6Ci0gICAgZWxzZQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogRVJST1I6IG9iamVjdCBuYW1lIGNvbmZsaWN0czogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLX0KLQotIyBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgZ2VudG9wIG9sZGxpYiAuLi4KLWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAoKQotewotICAgIG15X2dlbnRvcD0iJDEiOyBzaGlmdAotICAgIG15X29sZGxpYnM9JHsxKyIkQCJ9Ci0gICAgbXlfb2xkb2Jqcz0iIgotICAgIG15X3hsaWI9IiIKLSAgICBteV94YWJzPSIiCi0gICAgbXlfeGRpcj0iIgotICAgIG15X3N0YXR1cz0iIgotCi0gICAgJHNob3cgIiR7cm19ciAkbXlfZ2VudG9wIgotICAgICRydW4gJHtybX1yICIkbXlfZ2VudG9wIgotICAgICRzaG93ICIkbWtkaXIgJG15X2dlbnRvcCIKLSAgICAkcnVuICRta2RpciAiJG15X2dlbnRvcCIKLSAgICBteV9zdGF0dXM9JD8KLSAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRteV9nZW50b3AiOyB0aGVuCi0gICAgICBleGl0ICRteV9zdGF0dXMKLSAgICBmaQotCi0gICAgZm9yIG15X3hsaWIgaW4gJG15X29sZGxpYnM7IGRvCi0gICAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0gICAgICBjYXNlICRteV94bGliIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBteV94YWJzPSIkbXlfeGxpYiIgOzsKLQkqKSBteV94YWJzPWBwd2RgIi8kbXlfeGxpYiIgOzsKLSAgICAgIGVzYWMKLSAgICAgIG15X3hsaWI9YCRlY2hvICJYJG15X3hsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIG15X3hkaXI9IiRteV9nZW50b3AvJG15X3hsaWIiCi0KLSAgICAgICRzaG93ICIke3JtfXIgJG15X3hkaXIiCi0gICAgICAkcnVuICR7cm19ciAiJG15X3hkaXIiCi0gICAgICAkc2hvdyAiJG1rZGlyICRteV94ZGlyIgotICAgICAgJHJ1biAkbWtkaXIgIiRteV94ZGlyIgotICAgICAgc3RhdHVzPSQ/Ci0gICAgICBpZiB0ZXN0ICIkc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRteV94ZGlyIjsgdGhlbgotCWV4aXQgJHN0YXR1cwotICAgICAgZmkKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICotZGFyd2luKikKLQkkc2hvdyAiRXh0cmFjdGluZyAkbXlfeGFicyIKLQkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KLQlpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCi0JICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/Ci0JICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicwotCSAgZGFyd2luX2N1cmRpcj1gcHdkYAotCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gJGVjaG8gIlgkZGFyd2luX2FyY2hpdmUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRhcndpbl9hcmNoZXM9YGxpcG8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkRUdSRVAgQXJjaGl0ZWN0dXJlcyAyPi9kZXYvbnVsbGAKLQkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbiAKLQkgICAgZGFyd2luX2FyY2hlcz1gZWNobyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCi0JICAgIGRhcndpbl9hcmNoPQotCSAgICAkc2hvdyAiJGRhcndpbl9iYXNlX2FyY2hpdmUgaGFzIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgJGRhcndpbl9hcmNoZXMiCi0JICAgIGZvciBkYXJ3aW5fYXJjaCBpbiAgJGRhcndpbl9hcmNoZXMgOyBkbwotCSAgICAgIG1rZGlyIC1wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgotCSAgICAgIGxpcG8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgotCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgotCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCi0JICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgotCSAgICAgICRybSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgotCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKLSAgICAgICMjIE9rYXkgbm93IHdlIGhhdmUgYSBidW5jaCBvZiB0aGluIG9iamVjdHMsIGdvdHRhIGZhdHRlbiB0aGVtIHVwIDopCi0JICAgIGRhcndpbl9maWxlbGlzdD1gZmluZCB1bmZhdC0kJCAtdHlwZSBmIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludHwgeGFyZ3MgYmFzZW5hbWUgfCBzb3J0IC11IHwgJE5MMlNQYAotCSAgICBkYXJ3aW5fZmlsZT0KLQkgICAgZGFyd2luX2ZpbGVzPQotCSAgICBmb3IgZGFyd2luX2ZpbGUgaW4gJGRhcndpbl9maWxlbGlzdDsgZG8KLQkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8ICROTDJTUGAKLQkgICAgICBsaXBvIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCi0JICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0Ci0JICAgICR7cm19ciB1bmZhdC0kJAotCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKLQkgIGVsc2UKLQkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCi0gCSAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKLQkgIGZpICMgJGRhcndpbl9hcmNoZXMKLQlmaSAjICRydW4KLQk7OwotICAgICAgKikKLSAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotICAgIGRvbmUKLSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKLX0KLSMgRW5kIG9mIFNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGFyd2luIHN1Y2tzCi1ldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAiJCMiIC1ndCAwCi1kbwotICBhcmc9IiQxIgotICBzaGlmdAotCi0gIGNhc2UgJGFyZyBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICRwcmV2IGluCi0gICAgZXhlY3V0ZV9kbGZpbGVzKQotICAgICAgZXhlY3V0ZV9kbGZpbGVzPSIkZXhlY3V0ZV9kbGZpbGVzICRhcmciCi0gICAgICA7OwotICAgIHRhZykKLSAgICAgIHRhZ25hbWU9IiRhcmciCi0gICAgICBwcmVzZXJ2ZV9hcmdzPSIke3ByZXNlcnZlX2FyZ3N9PSRhcmciCi0KLSAgICAgICMgQ2hlY2sgd2hldGhlciB0YWduYW1lIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycwotICAgICAgY2FzZSAkdGFnbmFtZSBpbgotICAgICAgKlshLV9BLVphLXowLTksL10qKQotCSRlY2hvICIkcHJvZ25hbWU6IGludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIiAxPiYyCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAkdGFnbmFtZSBpbgotICAgICAgQ0MpCi0JIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93LCBpdCdzIHRoZXJlLCBidXQKLQkjIG5vdCBzcGVjaWFsbHkgbWFya2VkLgotCTs7Ci0gICAgICAqKQotCWlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgotCSAgdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCi0JICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgotCSAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckdGFnbmFtZSckLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckdGFnbmFtZSckL3AnIDwgJHByb2dwYXRoYCIKLQllbHNlCi0JICAkZWNobyAiJHByb2duYW1lOiBpZ25vcmluZyB1bmtub3duIHRhZyAkdGFnbmFtZSIgMT4mMgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgJGFyZyBpbgotICAtLWhlbHApCi0gICAgc2hvd19oZWxwPXllcwotICAgIDs7Ci0KLSAgLS12ZXJzaW9uKQotICAgICRlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAiCi0gICAgJGVjaG8KLSAgICAkZWNobyAiQ29weXJpZ2h0IChDKSAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4iCi0gICAgJGVjaG8gIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PIgotICAgICRlY2hvICJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLS1jb25maWcpCi0gICAgJHtTRUR9IC1lICcxLC9eIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcvZCcgLWUgJy9eIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJHByb2dwYXRoCi0gICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KLSAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KLSAgICAgICR7U0VEfSAtbiAtZSAiL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQvcCIgPCAiJHByb2dwYXRoIgotICAgIGRvbmUKLSAgICBleGl0ICQ/Ci0gICAgOzsKLQotICAtLWRlYnVnKQotICAgICRlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJGFyZyIKLSAgICA7OwotCi0gIC0tZHJ5LXJ1biB8IC1uKQotICAgIHJ1bj06Ci0gICAgOzsKLQotICAtLWZlYXR1cmVzKQotICAgICRlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgJGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgICRlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgJGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7Ci0KLSAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OwotICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKLQotICAtLXByZXNlcnZlLWR1cC1kZXBzKSBkdXBsaWNhdGVfZGVwcz0ieWVzIiA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkKLSAgICBzaG93PToKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgotICAgIDs7Ci0KLSAgLS10YWcpIHByZXZvcHQ9Ii0tdGFnIiBwcmV2PXRhZyA7OwotICAtLXRhZz0qKQotICAgIHNldCB0YWcgIiRvcHRhcmciICR7MSsiJEAifQotICAgIHNoaWZ0Ci0gICAgcHJldj10YWcKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKLSAgICA7OwotCi0gIC1kbG9wZW4pCi0gICAgcHJldm9wdD0iLWRsb3BlbiIKLSAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcwotICAgIDs7Ci0KLSAgLSopCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgOzsKLQotICAqKQotICAgIG5vbm9wdD0iJGFyZyIKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi1maQotCi0jIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKLSMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZwotIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgotZXhlY19jbWQ9Ci0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgICRlY2hvICIqKiogV2FybmluZzogaW5mZXJyaW5nIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBpcyBkZXByZWNhdGVkLiIgMT4mMgotICAgICRlY2hvICIqKiogRnV0dXJlIHZlcnNpb25zIG9mIExpYnRvb2wgd2lsbCByZXF1aXJlIC0tbW9kZT1NT0RFIGJlIHNwZWNpZmllZC4iIDE+JjIKLSAgICBjYXNlICRub25vcHQgaW4KLSAgICAqY2MgfCBjYyogfCAqKysgfCBnY2MqIHwgKi1nY2MqIHwgZysrKiB8IHhsYyopCi0gICAgICBtb2RlPWxpbmsKLSAgICAgIGZvciBhcmcKLSAgICAgIGRvCi0JY2FzZSAkYXJnIGluCi0JLWMpCi0JICAgbW9kZT1jb21waWxlCi0JICAgYnJlYWsKLQkgICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgKmRiIHwgKmRieCB8ICpzdHJhY2UgfCAqdHJ1c3MpCi0gICAgICBtb2RlPWV4ZWN1dGUKLSAgICAgIDs7Ci0gICAgKmluc3RhbGwqfGNwfG12KQotICAgICAgbW9kZT1pbnN0YWxsCi0gICAgICA7OwotICAgICpybSkKLSAgICAgIG1vZGU9dW5pbnN0YWxsCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgotICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCi0KLSAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkbm9ub3B0IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSB3aXRob3V0IE1PREUtQVJHUyIgMT4mMgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLSAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KLSAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLQotICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCi0gIGdlbmVyaWNfaGVscD0iJGhlbHAiCi0gIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCi0gIGNhc2UgJG1vZGUgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgotICAgIHN1cHByZXNzX29wdD15ZXMKLSAgICBzdXBwcmVzc19vdXRwdXQ9Ci0gICAgYXJnX21vZGU9bm9ybWFsCi0gICAgbGlib2JqPQotICAgIGxhdGVyPQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmdfbW9kZSBpbgotICAgICAgYXJnICApCi0JIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQotCWxhc3Rhcmc9IiRhcmciCi0JYXJnX21vZGU9bm9ybWFsCi0JOzsKLQotICAgICAgdGFyZ2V0ICkKLQlsaWJvYmo9IiRhcmciCi0JYXJnX21vZGU9bm9ybWFsCi0JY29udGludWUKLQk7OwotCi0gICAgICBub3JtYWwgKQotCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLQljYXNlICRhcmcgaW4KLQktbykKLQkgIGlmIHRlc3QgLW4gIiRsaWJvYmoiIDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgYXJnX21vZGU9dGFyZ2V0Ci0JICBjb250aW51ZQotCSAgOzsKLQotCS1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKLQkgIGxhdGVyPSIkbGF0ZXIgJGFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLW5vLXN1cHByZXNzKQotCSAgc3VwcHJlc3Nfb3B0PW5vCi0JICBjb250aW51ZQotCSAgOzsKLQotCS1YY29tcGlsZXIpCi0JICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0Ci0JICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgotCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KLQotCS1XYywqKQotCSAgYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14tV2MsLy8iYAotCSAgbGFzdGFyZz0KLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotIAkgIGZvciBhcmcgaW4gJGFyZ3M7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCi0JICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLQkgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKLQkgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KLQkgICAgY2FzZSAkYXJnIGluCi0JICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgICAgYXJnPSJcIiRhcmdcIiIKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGxhc3Rhcmc9IiRsYXN0YXJnICRhcmciCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCi0KLQkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgotCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQkqICkKLQkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KLQkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgotCSAgIwotCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0JICBzcmNmaWxlPSIkYXJnIgotCSAgOzsKLQllc2FjICAjICBjYXNlICRhcmcKLQk7OwotICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgIGNhc2UgJGxhc3RhcmcgaW4KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0gICAgICAjIGluIHNjYW4gc2V0cywgYW5kIHNvbWUgU3VuT1Mga3NoIG1pc3RyZWF0IGJhY2tzbGFzaC1lc2NhcGluZwotICAgICAgIyBpbiBzY2FuIHNldHMgKHdvcmtlZCBhcm91bmQgd2l0aCB2YXJpYWJsZSBleHBhbnNpb24pLAotICAgICAgIyBhbmQgZnVydGhlcm1vcmUgY2Fubm90IGhhbmRsZSAnfCcgJyYnICcoJyAnKScgaW4gc2NhbiBzZXRzIAotICAgICAgIyBhdCBhbGwsIHNvIHdlIHNwZWNpZnkgdGhlbSBzZXBhcmF0ZWx5LgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICBkb25lICMgZm9yIGFyZwotCi0gICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICBhcmcpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGFyZ3VtZW50IGZvciAtWGNvbXBpbGUiCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgdGFyZ2V0KQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KLSAgICAgIFsgLXogIiRsaWJvYmoiIF0gJiYgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KLSAgICB4Zm9ybT0nW2NDRlNpZm1zb10nCi0gICAgY2FzZSAkbGlib2JqIGluCi0gICAgKi5hZGEpIHhmb3JtPWFkYSA7OwotICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKLSAgICAqLmFkcykgeGZvcm09YWRzIDs7Ci0gICAgKi5hc20pIHhmb3JtPWFzbSA7OwotICAgICouYysrKSB4Zm9ybT1jKysgOzsKLSAgICAqLmNjKSB4Zm9ybT1jYyA7OwotICAgICouaWkpIHhmb3JtPWlpIDs7Ci0gICAgKi5jbGFzcykgeGZvcm09Y2xhc3MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgKi5qYXZhKSB4Zm9ybT1qYXZhIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAkbGlib2JqIGluCi0gICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAgOzsKLSAgICAqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKLQotICAgIGZvciBhcmcgaW4gJGxhdGVyOyBkbwotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1waWMpCi0JcGljX21vZGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcHJlZmVyLW5vbi1waWMpCi0JcGljX21vZGU9bm8KLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgcWxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICBjYXNlICRxbGlib2JqIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlxbGlib2JqPSJcIiRxbGlib2JqXCIiIDs7Ci0gICAgZXNhYwotICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRxbGlib2JqIiBcCi0JJiYgJGVjaG8gIlgkbGlib2JqIiB8IGdyZXAgJ1tdfiNeKnt9Ozw+PyInIiciJyAJJigpfGAkW10nIFwKLQkmJiAkZWNobyAiJG1vZGVuYW1lOiBsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgotICAgIG9iam5hbWU9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRvYmoiOyB0aGVuCi0gICAgICB4ZGlyPQotICAgIGVsc2UKLSAgICAgIHhkaXI9JHhkaXIvCi0gICAgZmkKLSAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCi0KLSAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCi0gICAgZWxzZQotICAgICAgcmVtb3ZlbGlzdD0iJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0gICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLSAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgIGZpCi0KLSAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcwotICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYwotICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KLSAgICAgIG91dHB1dF9vYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9Ci0gICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqICRsb2NrZmlsZSIKLSAgICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotICAgIGVsc2UKLSAgICAgIG91dHB1dF9vYmo9Ci0gICAgICBuZWVkX2xvY2tzPW5vCi0gICAgICBsb2NrZmlsZT0KLSAgICBmaQotCi0gICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKLSAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCi0gICAgICB1bnRpbCAkcnVuIGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCi0JJGVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0gICAgcXNyY2ZpbGU9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgJHFzcmNmaWxlIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLSAgICAgIHFzcmNmaWxlPSJcIiRxc3JjZmlsZVwiIiA7OwotICAgIGVzYWMKLQotICAgICRydW4gJHJtICIkbGlib2JqIiAiJHtsaWJvYmp9VCIKLQotICAgICMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCi0gICAgIyBidXQgZG9uJ3QgY3JlYXRlIGl0IGlmIHdlJ3JlIGRvaW5nIGEgZHJ5IHJ1bi4KLSAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPiAke2xpYm9ian1UIDw8RU9GCi0jICRsaWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCi0jIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KLQotIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgotRU9GCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZWxzZQotCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgISAtZCAiJHt4ZGlyfSRvYmpkaXIiOyB0aGVuCi0JJHNob3cgIiRta2RpciAke3hkaXJ9JG9iamRpciIKLQkkcnVuICRta2RpciAke3hkaXJ9JG9iamRpcgotCXN0YXR1cz0kPwotCWlmIHRlc3QgIiRzdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJHt4ZGlyfSRvYmpkaXIiOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJG91dHB1dF9vYmoiOyB0aGVuCi0JIyBQbGFjZSBQSUMgb2JqZWN0cyBpbiAkb2JqZGlyCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJGxvYmoiCi0gICAgICBmaQotCi0gICAgICAkcnVuICRybSAiJGxvYmoiICIkb3V0cHV0X29iaiIKLQotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgotCSRlY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCi0gICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIFBJQyBvYmplY3QgdG8gdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotcGljX29iamVjdD0nJG9iamRpci8kb2JqbmFtZScKLQotRU9GCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIGlmIHRlc3QgIiRzdXBwcmVzc19vcHQiID0geWVzOyB0aGVuCi0gICAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgIyBObyBQSUMgb2JqZWN0IHNvIGluZGljYXRlIGl0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGxpYnRvb2wKLSAgICAgICMgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotcGljX29iamVjdD1ub25lCi0KLUVPRgotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KLQkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCi0gICAgICBlbHNlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgJHJ1biAkcm0gIiRvYmoiICIkb3V0cHV0X29iaiIKLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgotCSRlY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCi0gICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0IHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgotICAgICAgIyBPbmx5IGFwcGVuZCBpZiB0aGUgbGlidG9vbCBvYmplY3QgZmlsZSBleGlzdHMuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdC4KLW5vbl9waWNfb2JqZWN0PSckb2JqbmFtZScKLQotRU9GCi0gICAgZWxzZQotICAgICAgIyBBcHBlbmQgdGhlIG5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0IHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgotICAgICAgIyBPbmx5IGFwcGVuZCBpZiB0aGUgbGlidG9vbCBvYmplY3QgZmlsZSBleGlzdHMuCi0gICAgICB0ZXN0IC16ICIkcnVuIiAmJiBjYXQgPj4gJHtsaWJvYmp9VCA8PEVPRgotIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdC4KLW5vbl9waWNfb2JqZWN0PW5vbmUKLQotRU9GCi0gICAgZmkKLQotICAgICRydW4gJG12ICIke2xpYm9ian1UIiAiJHtsaWJvYmp9IgotCi0gICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAgICAgJHJ1biAkcm0gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgOzsKLQotICAjIGxpYnRvb2wgbGluayBtb2RlCi0gIGxpbmsgfCByZWxpbmspCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKLSAgICBjYXNlICRob3N0IGluCi0gICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0gICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCi0gICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0Ci0gICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCi0gICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KLSAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCi0KLSAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZwotICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKLSAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5Ci0gICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KLSAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0gICAgICA7OwotICAgICopCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBsaWJ0b29sX2FyZ3M9IiRub25vcHQiCi0gICAgYmFzZV9jb21waWxlPSIkbm9ub3B0ICRAIgotICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgb2xkX2RlcGxpYnM9Ci0gICAgY29tcGlsZXJfZmxhZ3M9Ci0gICAgbGlua2VyX2ZsYWdzPQotICAgIGRsbHNlYXJjaHBhdGg9Ci0gICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCi0gICAgaW5zdF9wcmVmaXhfZGlyPQotCi0gICAgYXZvaWRfdmVyc2lvbj1ubwotICAgIGRsZmlsZXM9Ci0gICAgZGxwcmVmaWxlcz0KLSAgICBkbHNlbGY9bm8KLSAgICBleHBvcnRfZHluYW1pYz1ubwotICAgIGV4cG9ydF9zeW1ib2xzPQotICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQotICAgIGdlbmVyYXRlZD0KLSAgICBsaWJvYmpzPQotICAgIGx0bGlicz0KLSAgICBtb2R1bGU9bm8KLSAgICBub19pbnN0YWxsPW5vCi0gICAgb2Jqcz0KLSAgICBub25fcGljX29iamVjdHM9Ci0gICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9Ci0gICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCi0gICAgcHJlbG9hZD1ubwotICAgIHByZXY9Ci0gICAgcHJldmFyZz0KLSAgICByZWxlYXNlPQotICAgIHJwYXRoPQotICAgIHhycGF0aD0KLSAgICBwZXJtX3JwYXRoPQotICAgIHRlbXBfcnBhdGg9Ci0gICAgdGhyZWFkX3NhZmU9bm8KLSAgICB2aW5mbz0KLSAgICB2aW5mb19udW1iZXI9bm8KLQotICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljKQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWFsbC1zdGF0aWMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQllbHNlCi0JICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JICBmaQotCWZpCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JcHJlZmVyX3N0YXRpY19saWJzPXllcwotCWJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbwotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCXFhcmc9XCJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImBcIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQk7OwotICAgICAgKikgcWFyZz0kYXJnIDs7Ci0gICAgICBlc2FjCi0gICAgICBsaWJ0b29sX2FyZ3M9IiRsaWJ0b29sX2FyZ3MgJHFhcmciCi0KLSAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JY2FzZSAkcHJldiBpbgotCW91dHB1dCkKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgOzsKLQllc2FjCi0KLQljYXNlICRwcmV2IGluCi0JZGxmaWxlc3xkbHByZWZpbGVzKQotCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBwcmVsb2FkPXllcwotCSAgZmkKLQkgIGNhc2UgJGFyZyBpbgotCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KLQkgIGZvcmNlKQotCSAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IG5vOyB0aGVuCi0JICAgICAgZGxzZWxmPW5lZWRsZXNzCi0JICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBzZWxmKQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsc2UKLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICopCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgICBlbHNlCi0JICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXhwc3ltcykKLQkgIGV4cG9ydF9zeW1ib2xzPSIkYXJnIgotCSAgaWYgdGVzdCAhIC1mICIkYXJnIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBzeW1ib2wgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXhwc3ltc19yZWdleCkKLQkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWluc3RfcHJlZml4KQotCSAgaW5zdF9wcmVmaXhfZGlyPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXByZWNpb3VzX3JlZ2V4KQotCSAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcmVsZWFzZSkKLQkgIHJlbGVhc2U9Ii0kYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCW9iamVjdGxpc3QpCi0JICBpZiB0ZXN0IC1mICIkYXJnIjsgdGhlbgotCSAgICBzYXZlX2FyZz0kYXJnCi0JICAgIG1vcmVhcmdzPQotCSAgICBmb3IgZmlsIGluIGBjYXQgJHNhdmVfYXJnYAotCSAgICBkbwotIwkgICAgICBtb3JlYXJncz0iJG1vcmVhcmdzICRmaWwiCi0JICAgICAgYXJnPSRmaWwKLQkgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KLQotCSAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KLQkgICAgICBpZiAoJHtTRUR9IC1lICcycScgJGFyZyB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXBpY19vYmplY3Q9Ci0JCW5vbl9waWNfb2JqZWN0PQotCi0JCSMgUmVhZCB0aGUgLmxvIGZpbGUKLQkJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JCWNhc2UgJGFyZyBpbgotCQkqLyogfCAqXFwqKSAuICRhcmcgOzsKLQkJKikgLiAuLyRhcmcgOzsKLQkJZXNhYwotCi0JCWlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCBcCi0JCSAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKLQkJICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJiBcCi0JCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCi0JCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciIDE+JjIKLQkJICBleGl0ICRFWElUX0ZBSUxVUkUKLQkJZmkKLQotCQkjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCQl4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkJaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkJICB4ZGlyPQotCQllbHNlCi0JCSAgeGRpcj0iJHhkaXIvIgotCQlmaQotCi0JCWlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JCSAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCQkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgotCQkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKLQkJICAgICAgcHJldj0KLQkJICAgICAgY29udGludWUKLQkJICAgIGVsc2UKLQkJICAgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJICAgICAgcHJldj1kbHByZWZpbGVzCi0JCSAgICBmaQotCQkgIGZpCi0KLQkJICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkJICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkJICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCQkgICAgcHJldj0KLQkJICBmaQotCi0JCSAgIyBBIFBJQyBvYmplY3QuCi0JCSAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCi0JCSAgYXJnPSIkcGljX29iamVjdCIKLQkJZmkKLQotCQkjIE5vbi1QSUMgb2JqZWN0LgotCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKLQotCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAotCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCi0JCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKLQkJICBmaQotCQlmaQotCSAgICAgIGVsc2UKLQkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCi0JCWlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIgMT4mMgotCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQllbHNlCi0JCSAgIyBEcnktcnVuIGNhc2UuCi0KLQkJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCQkgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQkgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JCSAgICB4ZGlyPQotCQkgIGVsc2UKLQkJICAgIHhkaXI9IiR4ZGlyLyIKLQkJICBmaQotCi0JCSAgcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHtvYmpkaXJ9LyR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCQkgIG5vbl9waWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkJICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCQlmaQotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGluayBpbnB1dCBmaWxlIFxgJHNhdmVfYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgYXJnPSRzYXZlX2FyZwotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoIHwgeHJwYXRoKQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICRhcmcgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICA7OwotCSAgZXNhYwotCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KLQkgICAgY2FzZSAiJHJwYXRoICIgaW4KLQkgICAgKiIgJGFyZyAiKikgOzsKLQkgICAgKikgcnBhdGg9IiRycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBlbHNlCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGFyZyIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQl4Y29tcGlsZXIpCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGxpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR3bCRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHdsJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQl4Y2NsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0Jc2hyZXh0KQotICAJICBzaHJleHRfY21kcz0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLSAgICAgICAgZGFyd2luX2ZyYW1ld29yaykKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQkqKQotCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMKLSAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCi0KLSAgICAgIHByZXZhcmc9IiRhcmciCi0KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWFsbC1zdGF0aWMpCi0JaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWFsbG93LXVuZGVmaW5lZCkKLQkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hdm9pZC12ZXJzaW9uKQotCWF2b2lkX3ZlcnNpb249eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotCXByZXY9ZGxmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRscHJlb3BlbikKLQlwcmV2PWRscHJlZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLQlleHBvcnRfZHluYW1pYz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgotCSAgcHJldj1leHBzeW1zCi0JZWxzZQotCSAgcHJldj1leHBzeW1zX3JlZ2V4Ci0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1mcmFtZXdvcmt8LWFyY2gpCi0gICAgICAgIHByZXY9ZGFyd2luX2ZyYW1ld29yawotICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLQotICAgICAgLWluc3QtcHJlZml4LWRpcikKLQlwcmV2PWluc3RfcHJlZml4Ci0JY29udGludWUKLQk7OwotCi0gICAgICAjIFRoZSBuYXRpdmUgSVJJWCBsaW5rZXIgdW5kZXJzdGFuZHMgLUxBTkc6KiwgLUxJU1Q6KiBhbmQgLUxOTzoqCi0gICAgICAjIHNvLCBpZiB3ZSBzZWUgdGhlc2UgZmxhZ3MgYmUgY2FyZWZ1bCBub3QgdG8gdHJlYXQgdGhlbSBsaWtlIC1MCi0gICAgICAtTFtBLVpdW0EtWl0qOiopCi0JY2FzZSAkd2l0aF9nY2MvJGhvc3QgaW4KLQluby8qLSotaXJpeCogfCAvKi0qLWlyaXgqKQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotCSAgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtTCopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgJGRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkqKQotCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGRpcj0iJGFic2RpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiRkZXBsaWJzICIgaW4KLQkqIiAtTCRkaXIgIiopIDs7Ci0JKikKLQkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKLQkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCi0JICAqIjokZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotcHczMiogfCAqLSotYmVvcyopCi0JICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgotCSAgICBjb250aW51ZQotCSAgZXNhYwotCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KLQkgY2FzZSAkaG9zdCBpbgotCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCi0JICAgY29udGludWUKLQkgICA7OwotCSBlc2FjCi0JZmkKLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKwotICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgotICAgICAgLW1vZGVsKQotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCi0JY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCW1vZHVsZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCi0gICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgotICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgotICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKLSAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCi0gICAgICAjIC1tKiBwYXNzIHRocm91Z2ggYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvbXBpbGVyIGFyZ3MgZm9yIEdDQwotICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qKQotCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAkYXJnIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0gInllcyIgOyB0aGVuCi0gICAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotICAgICAgICBmaQotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAtc2hyZXh0KQotCXByZXY9c2hyZXh0Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8tZmFzdC1pbnN0YWxsKQotCWZhc3RfaW5zdGFsbD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLWluc3RhbGwpCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCi0JICAjIGluIG9yZGVyIGZvciB0aGUgbG9hZGVyIHRvIGZpbmQgYW55IGRsbHMgaXQgbmVlZHMuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIiAxPiYyCi0JICBmYXN0X2luc3RhbGw9bm8KLQkgIDs7Ci0JKikgbm9faW5zdGFsbD15ZXMgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8tdW5kZWZpbmVkKQotCWFsbG93X3VuZGVmaW5lZD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW9iamVjdGxpc3QpCi0JcHJldj1vYmplY3RsaXN0Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4KQotCXByZXY9cHJlY2lvdXNfcmVnZXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1yZWxlYXNlKQotCXByZXY9cmVsZWFzZQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJwYXRoKQotCXByZXY9cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKQotCXByZXY9eHJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUiopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgJGRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0JY2FzZSAiJHhycGF0aCAiIGluCi0JKiIgJGRpciAiKikgOzsKLQkqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljKQotCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCi0JIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0Ci0JIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cwotCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAotCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdGhyZWFkLXNhZmUpCi0JdGhyZWFkX3NhZmU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdmVyc2lvbi1pbmZvKQotCXByZXY9dmluZm8KLQljb250aW51ZQotCTs7Ci0gICAgICAtdmVyc2lvbi1udW1iZXIpCi0JcHJldj12aW5mbwotCXZpbmZvX251bWJlcj15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1XYywqKQotCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XYywvLydgCi0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBjYXNlICRmbGFnIGluCi0JICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICBmbGFnPSJcIiRmbGFnXCIiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBhcmc9IiRhcmcgJHdsJGZsYWciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRmbGFnIgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQk7OwotCi0gICAgICAtV2wsKikKLQlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2wsLy8nYAotCWFyZz0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQlmb3IgZmxhZyBpbiAkYXJnczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgY2FzZSAkZmxhZyBpbgotCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgICAgZmxhZz0iXCIkZmxhZ1wiIgotCSAgICA7OwotCSAgZXNhYwotCSAgYXJnPSIkYXJnICR3bCRmbGFnIgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZmxhZyIKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCi0JOzsKLQotICAgICAgLVhjb21waWxlcikKLQlwcmV2PXhjb21waWxlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVhsaW5rZXIpCi0JcHJldj14bGlua2VyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWENDbGlua2VyKQotCXByZXY9eGNjbGlua2VyCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAkYXJnIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgKi4kb2JqZXh0KQotCSMgQSBzdGFuZGFyZCBvYmplY3QuCi0Jb2Jqcz0iJG9ianMgJGFyZyIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCWlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIHBpY19vYmplY3Q9Ci0JICBub25fcGljX29iamVjdD0KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICRhcmcgaW4KLQkgICovKiB8ICpcXCopIC4gJGFyZyA7OwotCSAgKikgLiAuLyRhcmcgOzsKLQkgIGVzYWMKLQotCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKLQkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKLQkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAotCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCi0JICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCSAgICB4ZGlyPQotIAkgIGVsc2UKLQkgICAgeGRpcj0iJHhkaXIvIgotCSAgZmkKLQotCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKLQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgotCQlkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKLQkJcHJldj0KLQkJY29udGludWUKLQkgICAgICBlbHNlCi0JCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JCXByZXY9ZGxwcmVmaWxlcwotCSAgICAgIGZpCi0JICAgIGZpCi0KLQkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKLQkgICAgICBwcmV2PQotCSAgICBmaQotCi0JICAgICMgQSBQSUMgb2JqZWN0LgotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkgICAgYXJnPSIkcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgTm9uLVBJQyBvYmplY3QuCi0JICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgotCi0JICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAotCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCSAgICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KLQkgICAgICBhcmc9IiRub25fcGljX29iamVjdCIKLQkgICAgZmkKLQkgIGZpCi0JZWxzZQotCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCi0JICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZWxzZQotCSAgICAjIERyeS1ydW4gY2FzZS4KLQotCSAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkgICAgICB4ZGlyPQotCSAgICBlbHNlCi0JICAgICAgeGRpcj0iJHhkaXIvIgotCSAgICBmaQotCi0JICAgIHBpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7b2JqZGlyfS8ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgICAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqLiRsaWJleHQpCi0JIyBBbiBhcmNoaXZlLgotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0Jb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAkYXJnIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGVzYWMgIyBhcmcKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICBmaQotICAgIGRvbmUgIyBhcmd1bWVudCBwYXJzaW5nIGxvb3AKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICBmaQotCi0gICAgb2xkbGlicz0KLSAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5Ci0gICAgb3V0cHV0bmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKLQotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgotICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIHNobGliX3NlYXJjaF9wYXRoPQotICAgIGZpCi0gICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCi0gICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgotCi0gICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLSAgICAgIG91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgZWxzZQotICAgICAgb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICBmaQotICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgotICAgIGlmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCi0gICAgICAkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotICAgICAgJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLSAgICAgIHN0YXR1cz0kPwotICAgICAgaWYgdGVzdCAiJHN0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkb3V0cHV0X29iamRpciI7IHRoZW4KLQlleGl0ICRzdGF0dXMKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAotICAgIGNhc2UgJG91dHB1dCBpbgotICAgICIiKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgKi4kbGliZXh0KSBsaW5rbW9kZT1vbGRsaWIgOzsKLSAgICAqLmxvIHwgKi4kb2JqZXh0KSBsaW5rbW9kZT1vYmogOzsKLSAgICAqLmxhKSBsaW5rbW9kZT1saWIgOzsKLSAgICAqKSBsaW5rbW9kZT1wcm9nIDs7ICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgotICAgIGVzYWMKLQotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiopCi0gICAgICAjIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGlvbnMgaW4gJHBvc3RkZXBzIGFuZCAkcHJlZGVwcwotICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPSRkdXBsaWNhdGVfZGVwcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgc3BlY2lhbGRlcGxpYnM9Ci0KLSAgICBsaWJzPQotICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcwotICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQotICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0gICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQljYXNlICIkbGlicyAiIGluCi0JKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLSAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgotCi0gICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcwotICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQotICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbwotCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgotCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKLQkgIGVzYWMKLQkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCi0JZG9uZQotICAgICAgZmkKLSAgICAgIHByZV9wb3N0X2RlcHM9Ci0gICAgZmkKLQotICAgIGRlcGxpYnM9Ci0gICAgbmV3ZGVwZW5kZW5jeV9saWJzPQotICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KLSAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgbGliKQotCXBhc3Nlcz0iY29udiBsaW5rIgotCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbwotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi5sYSkgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JOzsKLSAgICBwcm9nKQotCWNvbXBpbGVfZGVwbGlicz0KLQlmaW5hbGl6ZV9kZXBsaWJzPQotCWFsbGRlcGxpYnM9bm8KLQluZXdkbGZpbGVzPQotCW5ld2RscHJlZmlsZXM9Ci0JcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgotCTs7Ci0gICAgKikgIHBhc3Nlcz0iY29udiIKLQk7OwotICAgIGVzYWMKLSAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbwotICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKLQkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCi0JbGlicz0iJGRlcGxpYnMiCi0JZGVwbGlicz0KLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCWNhc2UgJHBhc3MgaW4KLQlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OwotCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7Ci0JbGluaykgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlICRkZXBlbmRlbmN5X2xpYnMiIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgotCSMgQ29sbGVjdCBkbHByZW9wZW5lZCBsaWJyYXJpZXMKLQlzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIgotCWRlcGxpYnM9Ci0gICAgICBmaQotICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KLQlsaWI9Ci0JZm91bmQ9bm8KLQljYXNlICRkZXBsaWIgaW4KLQktbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlKQotCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWIiCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JLWwqKQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWIgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiIDE+JjIKLQkgICAgY29udGludWUKLQkgIGZpCi0JICBuYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1sLy8nYAotCSAgZm9yIHNlYXJjaGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCSAgICBmb3Igc2VhcmNoX2V4dCBpbiAubGEgJHN0ZF9zaHJleHQgLnNvIC5hOyBkbwotCSAgICAgICMgU2VhcmNoIHRoZSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgICBsaWI9IiRzZWFyY2hkaXIvbGliJHtuYW1lfSR7c2VhcmNoX2V4dH0iCi0JICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KLQkJaWYgdGVzdCAiJHNlYXJjaF9leHQiID0gIi5sYSI7IHRoZW4KLQkJICBmb3VuZD15ZXMKLQkJZWxzZQotCQkgIGZvdW5kPW5vCi0JCWZpCi0JCWJyZWFrIDIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBkb25lCi0JICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgotCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgIGVsc2UgIyBkZXBsaWIgaXMgYSBsaWJ0b29sIGxpYnJhcnkKLQkgICAgIyBJZiAkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzICYmICRkZXBsaWIgaXMgYSBzdGRsaWIsCi0JICAgICMgV2UgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgdGhpbmdzIGhlcmUsIGFuZCBub3QgbGF0ZXIuCi0JICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKQotCQlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8Ci0gICAgICAgICAgICAgICAgICAgIGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCSAgbGlicmFyeV9uYW1lcz0KLQkJICBvbGRfbGlicmFyeT0KLQkJICBjYXNlICRsaWIgaW4KLQkJICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkJICAqKSAuIC4vJGxpYiA7OwotCQkgIGVzYWMKLQkJICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JCSAgICBsbD0iJGwiCi0JCSAgZG9uZQotCQkgIGlmIHRlc3QgIlgkbGwiID0gIlgkb2xkX2xpYnJhcnkiIDsgdGhlbiAjIG9ubHkgc3RhdGljIHZlcnNpb24gYXZhaWxhYmxlCi0JCSAgICBmb3VuZD1ubwotCQkgICAgbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQkgICAgdGVzdCAiWCRsYWRpciIgPSAiWCRsaWIiICYmIGxhZGlyPSIuIgotCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKLQkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkJICAgIGVsc2UKLQkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkJICAgIGZpCi0JCSAgICBjb250aW51ZQotCQkgIGZpCi0JCWZpCi0JICAgICAgICA7OwotCSAgICAgICopIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZmkKLQkgIDs7ICMgLWwKLQktTCopCi0JICBjYXNlICRsaW5rbW9kZSBpbgotCSAgbGliKQotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICB0ZXN0ICIkcGFzcyIgPSBjb252ICYmIGNvbnRpbnVlCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgY29udGludWUKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSAgICA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICBjb250aW51ZQotCSAgOzsgIyAtTAotCS1SKikKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQkgICAgZGlyPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCSAgICAjIE1ha2Ugc3VyZSB0aGUgeHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICBjYXNlICIkeHJwYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgY29udGludWUKLQkgIDs7Ci0JKi5sYSkgbGliPSIkZGVwbGliIiA7OwotCSouJGxpYmV4dCkKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgY29udGludWUKLQkgIGZpCi0JICBjYXNlICRsaW5rbW9kZSBpbgotCSAgbGliKQotCSAgICB2YWxpZF9hX2xpYj1ubwotCSAgICBjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSAgICAgIG1hdGNoX3BhdHRlcm4qKQotCQlzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICAgICAgICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCi0JCWlmIGV2YWwgJGVjaG8gXCIkZGVwbGliXCIgMj4vZGV2L251bGwgXAotCQkgICAgfCAkU0VEIDEwcSBcCi0JCSAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgdmFsaWRfYV9saWI9eWVzCi0JCWZpCi0JCTs7Ci0JICAgICAgcGFzc19hbGwpCi0JCXZhbGlkX2FfbGliPXllcwotCQk7OwotICAgICAgICAgICAgZXNhYwotCSAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBUcnlpbmcgdG8gbGluayB3aXRoIHN0YXRpYyBsaWIgYXJjaGl2ZSAkZGVwbGliLiIKLQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkgICAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKLQkgICAgICAkZWNobyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZWQgaGVyZS4iCi0JICAgIGVsc2UKLQkgICAgICAkZWNobwotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKLQkgICAgICAkZWNobyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIGVzYWMgIyBsaW5rbW9kZQotCSAgOzsgIyAqLiRsaWJleHQKLQkqLmxvIHwgKi4kb2JqZXh0KQotCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCi0JICAgIGZpCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JJURFUExJQlMlKQotCSAgYWxsZGVwbGlicz15ZXMKLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMgIyBjYXNlICRkZXBsaWIKLQlpZiB0ZXN0ICIkZm91bmQiID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCWxhZGlyPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCi0KLQlkbG5hbWU9Ci0JZGxvcGVuPQotCWRscHJlb3Blbj0KLQlsaWJkaXI9Ci0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluawotCWluc3RhbGxlZD15ZXMKLQlzaG91bGRub3RsaW5rPW5vCi0JYXZvaWR0ZW1wcnBhdGg9Ci0KLQotCSMgUmVhZCB0aGUgLmxhIGZpbGUKLQljYXNlICRsaWIgaW4KLQkqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkqKSAuIC4vJGxpYiA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8Ci0JICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8Ci0JICAgeyB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IH07IHRoZW4KLQkgIHRlc3QgLW4gIiRkbG9wZW4iICYmIGRsZmlsZXM9IiRkbGZpbGVzICRkbG9wZW4iCi0JICB0ZXN0IC1uICIkZGxwcmVvcGVuIiAmJiBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGxwcmVvcGVuIgotCWZpCi0KLQlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcwotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgotCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICBmaQotCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgICB0bXBfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0gICAgICAgICAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICAgIGVzYWMKLSAgICAgICAgICAgICAgZmkKLQkgICAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICAgIGRvbmUKLQkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgY29udmVuaWVuY2UgbGlicmFyeSIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBjb250aW51ZQotCWZpICMgJHBhc3MgPSBjb252Ci0KLQotCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLQlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKLQlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwKLQkgICAgIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8Ci0JICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCi0JICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55Ci0JICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0Ci0JICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGRsb3BlbgotCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkbGFkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OwotCSopCi0JICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGFkaXInIiAxPiYyCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHBhc3NpbmcgaXQgbGl0ZXJhbGx5IHRvIHRoZSBsaW5rZXIsIGFsdGhvdWdoIGl0IG1pZ2h0IGZhaWwiIDE+JjIKLQkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCi0JICBmaQotCSAgOzsKLQllc2FjCi0JbGFuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogbGlicmFyeSBcYCRsaWInIHdhcyBtb3ZlZC4iIDE+JjIKLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRsaWJkaXIiCi0JICAgIGFic2Rpcj0iJGxpYmRpciIKLQkgIGZpCi0JICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcwotCWVsc2UKLQkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCi0JICAgIGRpcj0iJGxhZGlyIgotCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgotCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgotCSAgZmkKLQlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKLQluYW1lPWAkZWNobyAiWCRsYW5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KLQkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgotCSAgZWxzZQotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgotCSAgZmkKLQlmaSAjICRwYXNzID0gZGxwcmVvcGVuCi0KLQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcwotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkKLQotCi0JaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCi0JICBsaW5rYWxsZGVwbGlicz1ubwotCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAotCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKLQkgIGZpCi0KLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYDs7ICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCSAgICBlc2FjCi0JICAgICMgTmVlZCB0byBsaW5rIGFnYWluc3QgYWxsIGRlcGVuZGVuY3lfbGlicz8KLQkgICAgaWYgdGVzdCAiJGxpbmthbGxkZXBsaWJzIiA9IHllczsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICAjIE5lZWQgdG8gaGFyZGNvZGUgc2hhcmVkIGxpYnJhcnkgcGF0aHMKLQkgICAgICAjIG9yL2FuZCBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcwotCSAgICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgIGRvbmUgIyBmb3IgZGVwbGliCi0JICBjb250aW51ZQotCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICAgIHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCi0JICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgotCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCi0JICAgICAgKiIgJGRpciAiKikgOzsKLQkgICAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRhYnNkaXIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KLQotCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCi0JICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAotCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCi0JCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KLQkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCWZpCi0KLQlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5Ci0JaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCi0JICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm87IHRoZW4KLQkgICAgbm90aW5zdF9kZXBsaWJzPSIkbm90aW5zdF9kZXBsaWJzICRsaWIiCi0JICAgIG5lZWRfcmVsaW5rPXllcwotCSAgZmkKLQkgICMgVGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5Ci0KLQkgICMgV2FybiBhYm91dCBwb3J0YWJpbGl0eSwgY2FuJ3QgbGluayBhZ2FpbnN0IC1tb2R1bGUncyBvbgotCSAgIyBzb21lIHN5c3RlbXMgKGRhcndpbikKLQkgIGlmIHRlc3QgIiRzaG91bGRub3RsaW5rIiA9IHllcyAmJiB0ZXN0ICIkcGFzcyIgPSBsaW5rIDsgdGhlbgotCSAgICAkZWNobwotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgZXhlY3V0YWJsZSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCi0JICAgIGZpCi0JICAgICRlY2hvICIqKiogJGxpbmtsaWIgaXMgbm90IHBvcnRhYmxlISIKLQkgIGZpCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmCi0JICAgICB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgotCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCi0JICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKLQkgICAgIyBzZWFyY2ggcGF0aC4KLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KLQkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKLQkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JICAgIHJlYWxuYW1lPSIkMiIKLQkgICAgc2hpZnQ7IHNoaWZ0Ci0JICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/Ci0JICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgICAgc29uYW1lPSIkZGxuYW1lIgotCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgICAgICAjIGJsZWggd2luZG93cwotCSAgICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgICAqY3lnd2luKiB8IG1pbmd3KikKLQkJbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCQl2ZXJzdWZmaXg9Ii0kbWFqb3IiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQkgICAgZWxzZQotCSAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgotCSAgICBmaQotCi0JICAgICMgTWFrZSBhIG5ldyBuYW1lIGZvciB0aGUgZXh0cmFjdF9leHBzeW1zX2NtZHMgdG8gdXNlCi0JICAgIHNvcm9vdD0iJHNvbmFtZSIKLQkgICAgc29uYW1lPWAkZWNobyAkc29yb290IHwgJHtTRUR9IC1lICdzL14uKlwvLy8nYAotCSAgICBuZXdsaWI9ImxpYmltcC1gJGVjaG8gJHNvbmFtZSB8ICR7U0VEfSAncy9ebGliLy87cy9cLmRsbCQvLydgLmEiCi0KLQkgICAgIyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gZXhwb3J0IGxpc3QsIHRoZW4gY3JlYXRlIG9uZSBub3cKLQkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYiOyB0aGVuIDoKLQkgICAgZWxzZQotCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gXGAkc29uYW1lJyIKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBjbWRzPSRleHRyYWN0X2V4cHN5bXNfY21kcwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQlldmFsIGNtZD1cIiRjbWRcIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCi0JICAgICMgQ3JlYXRlICRuZXdsaWIKLQkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG5ld2xpYiI7IHRoZW4gOjsgZWxzZQotCSAgICAgICRzaG93ICJnZW5lcmF0aW5nIGltcG9ydCBsaWJyYXJ5IGZvciBcYCRzb25hbWUnIgotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCi0JICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkJSUZTPSIkc2F2ZV9pZnMiCi0JCWV2YWwgY21kPVwiJGNtZFwiCi0JCSRzaG93ICIkY21kIgotCQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0JICAgICMgbWFrZSBzdXJlIHRoZSBsaWJyYXJ5IHZhcmlhYmxlcyBhcmUgcG9pbnRpbmcgdG8gdGhlIG5ldyBsaWJyYXJ5Ci0JICAgIGRpcj0kb3V0cHV0X29iamRpcgotCSAgICBsaW5rbGliPSRuZXdsaWIKLQkgIGZpICMgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIgotCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCi0JICAgIGFkZF9zaGxpYnBhdGg9Ci0JICAgIGFkZF9kaXI9Ci0JICAgIGFkZD0KLQkgICAgbGliX2xpbmtlZD15ZXMKLQkgICAgY2FzZSAkaGFyZGNvZGVfYWN0aW9uIGluCi0JICAgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLQkJYWRkPSIkZGlyLyRsaW5rbGliIgotCQljYXNlICRob3N0IGluCi0JCSAgKi0qLXNjbzMuMnY1KiApIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotZGFyd2luKiApCi0JCSAgICAjIGlmIHRoZSBsaWIgaXMgYSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90IGxpbmsgYWdhaW5zdAotCQkgICAgIyBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgbmV3IHdhcm5pbmdzIEkgYWRkZWQKLQkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfCAkRUdSRVAgImJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KLQkJICAgICAgJGVjaG8gIioqIFdhcm5pbmcsIGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCi0JCSAgICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCi0JCSAgICAgICAgJGVjaG8KLQkJICAgICAgICAkZWNobyAiKiogQW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHN0YXRpYyBhcmNoaXZlIGF2YWlsYWJsZSIKLQkJICAgICAgICAkZWNobyAiKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKLQkJICAgICAgZWxzZQotCQkgICAgICAgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCi0JCSAgICAgIGZpCi0JCSAgICBmaQotCQllc2FjCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCQljYXNlICRob3N0IGluCi0JCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7Ci0JCWVzYWMKLQkJYWRkX2Rpcj0iLUwkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICByZWxpbmspCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkJYWRkPSIkZGlyLyRsaW5rbGliIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JCWFkZF9kaXI9Ii1MJGRpciIKLQkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgotCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCQkgIGNhc2UgJGxpYmRpciBpbgotCQkgICAgW1xcL10qKQotCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgotCQkgICAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JCWFkZF9zaGxpYnBhdGg9IiRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbHNlCi0JCWxpYl9saW5rZWQ9bm8KLQkgICAgICBmaQotCSAgICAgIDs7Ci0JICAgICopIGxpYl9saW5rZWQ9bm8gOzsKLQkgICAgZXNhYwotCi0JICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjb25maWd1cmF0aW9uIGVycm9yOiB1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgotCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgotCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFkZF9zaGxpYnBhdGg6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKLQkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYgXAotCQkgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JCWNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCi0JCSoiOiRsaWJkaXI6IiopIDs7Ci0JCSopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgICBhZGRfc2hsaWJwYXRoPQotCSAgICBhZGRfZGlyPQotCSAgICBhZGQ9Ci0JICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgotCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgotCSAgICAgICAgYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBlbHNlCi0JICAgICAgICBhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCi0JICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgotCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KLQkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCQljYXNlICRsaWJkaXIgaW4KLQkJICBbXFwvXSopCi0JCSAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgotCQkgICAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKLQkgICAgZmkKLQkgIGZpCi0JZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAotCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCi0JICAjIHNoYXJlZCBwbGF0Zm9ybXMuCi0JICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBmaQotCWVsaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgTm90IGEgc2hhcmVkIGxpYnJhcnkKLQkgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLQkgICAgIyBXZSdyZSB0cnlpbmcgbGluayBhIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgYSBzdGF0aWMgb25lCi0JICAgICMgYnV0IHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0LgotCi0JICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KLQkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCi0JICAgICRlY2hvCi0JICAgICRlY2hvICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKLQkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgICAkZWNobyAiKioqIEJ1dCBhcyB5b3UgdHJ5IHRvIGJ1aWxkIGEgbW9kdWxlIGxpYnJhcnksIGxpYnRvb2wgd2lsbCBzdGlsbCBjcmVhdGUgIgotCSAgICAgICRlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyBhcHBsaWNhdGlvbiIKLQkgICAgICAkZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgotCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JCSRlY2hvCi0JCSRlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkJJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JCSRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JCSRlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JCWJ1aWxkX29sZF9saWJzPXllcwotCSAgICAgIGVsc2UKLQkJYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCi0JICAgIGxpbmtfc3RhdGljPXllcwotCSAgZmkKLQlmaSAjIGxpbmsgc2hhcmVkL3N0YXRpYyBsaWJyYXJ5PwotCi0JaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKLQkgICAgIHsgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8Ci0JICAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgfHwKLQkgICAgICAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IHllczsgfTsgdGhlbgotCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLQkgICAgdGVtcF9kZXBsaWJzPQotCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkbGliZGlyIGluCi0JICAgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQkJICAgY2FzZSAiICR4cnBhdGggIiBpbgotCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7Ci0JCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKLQkJICAgZXNhYzs7Ci0JICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgotCSAgZmkKLQotCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCi0JICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKLQkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcwotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkZGVwbGliIGluCi0JICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OwotCSAgICAgICoubGEpCi0JCWRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCXRlc3QgIlgkZGlyIiA9ICJYJGRlcGxpYiIgJiYgZGlyPSIuIgotCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkJY2FzZSAkZGlyIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OwotCQkqKQotCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCi0JCSAgICBhYnNkaXI9IiRkaXIiCi0JCSAgZmkKLQkJICA7OwotCQllc2FjCi0JCWlmIGdyZXAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KLQkJICBwYXRoPSIkYWJzZGlyLyRvYmpkaXIiCi0JCWVsc2UKLQkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCSAgZmkKLQkJICBpZiB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiIDE+JjIKLQkJICBmaQotCQkgIHBhdGg9IiRhYnNkaXIiCi0JCWZpCi0JCWRlcGRlcGw9Ci0JCWNhc2UgJGhvc3QgaW4KLQkJKi0qLWRhcndpbiopCi0JCSAgIyB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnMsCi0JCSAgIyBidXQgbmVlZCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkCi0JCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KLQkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbwotCQkgICAgICBkZXBkZXBsPSR0bXAKLQkJICAgIGRvbmUKLQkJICAgIGlmIHRlc3QgLWYgIiRwYXRoLyRkZXBkZXBsIiA7IHRoZW4KLQkJICAgICAgZGVwZGVwbD0iJHBhdGgvJGRlcGRlcGwiCi0JCSAgICBmaQotCQkgICAgIyBkbyBub3QgYWRkIHBhdGhzIHdoaWNoIGFyZSBhbHJlYWR5IHRoZXJlCi0JCSAgICBjYXNlICIgJG5ld2xpYl9zZWFyY2hfcGF0aCAiIGluCi0JCSAgICAqIiAkcGF0aCAiKikgOzsKLQkJICAgICopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkcGF0aCI7OwotCQkgICAgZXNhYwotCQkgIGZpCi0JCSAgcGF0aD0iIgotCQkgIDs7Ci0JCSopCi0JCSAgcGF0aD0iLUwkcGF0aCIKLQkJICA7OwotCQllc2FjCi0JCTs7Ci0JICAgICAgLWwqKQotCQljYXNlICRob3N0IGluCi0JCSotKi1kYXJ3aW4qKQotCQkgICMgQWdhaW4sIHdlIG9ubHkgd2FudCB0byBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcwotCQkgIGV2YWwgdG1wX2xpYnM9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAicyxeXC1sLCwiYAotCQkgIGZvciB0bXAgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aCA7IGRvCi0JCSAgICBpZiB0ZXN0IC1mICIkdG1wL2xpYiR0bXBfbGlicy5keWxpYiIgOyB0aGVuCi0JCSAgICAgIGV2YWwgZGVwZGVwbD0iJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiCi0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgIGRvbmUKLQkJICBwYXRoPSIiCi0JCSAgOzsKLQkJKikgY29udGludWUgOzsKLQkJZXNhYwotCQk7OwotCSAgICAgICopIGNvbnRpbnVlIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCi0JICAgICAgKiIgJHBhdGggIiopIDs7Ci0JICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGRlcGwgIiopIDs7Ci0JICAgICAgKikgZGVwbGlicz0iJGRlcGRlcGwgJGRlcGxpYnMiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KLQlmaSAjIGxpbmttb2RlID0gbGliCi0gICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicwotICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCi0JIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcwotCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KLQkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JZG9uZQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KLQlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgotCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgbGliX3NlYXJjaF9wYXRoPQotCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbwotCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KLQlmaQotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgdmFycz0iZGVwbGlicyIKLQllbHNlCi0JICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKLQlmaQotCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgotCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCi0JICBuZXdfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbwotCSAgICAjIEZJWE1FOiBQZWRhbnRpY2FsbHksIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCBzbwotCSAgICAjICAgICAgICB0aGF0IHNvbWUgbmFzdHkgZGVwZW5kZW5jeSBsb29wIGlzbid0IGFjY2lkZW50YWxseQotCSAgICAjICAgICAgICBicm9rZW46Ci0JICAgICNuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCi0JICAgICMgUHJhZ21hdGljYWxseSwgdGhpcyBzZWVtcyB0byBjYXVzZSB2ZXJ5IGZldyBwcm9ibGVtcyBpbgotCSAgICAjIHByYWN0aWNlOgotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JICAgIC1SKikgOzsKLQkgICAgKikKLQkgICAgICAjIEFuZCBoZXJlIGlzIHRoZSByZWFzb246IHdoZW4gYSBsaWJyYXJ5IGFwcGVhcnMgbW9yZQotCSAgICAgICMgdGhhbiBvbmNlIGFzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY2Ugb2YgYSBsaWJyYXJ5LCBvcgotCSAgICAgICMgaXMgaW1wbGljaXRseSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UgYnkgdGhlCi0JICAgICAgIyBjb21waWxlciwgaXQgaXMgY29uc2lkZXJlZCBzcGVjaWFsLCBhbmQgbXVsdGlwbGUKLQkgICAgICAjIG9jY3VycmVuY2VzIHRoZXJlb2YgYXJlIG5vdCByZW1vdmVkLiAgQ29tcGFyZSB0aGlzCi0JICAgICAgIyB3aXRoIGhhdmluZyB0aGUgc2FtZSBsaWJyYXJ5IGJlaW5nIGxpc3RlZCBhcyBhCi0JICAgICAgIyBkZXBlbmRlbmN5IG9mIG11bHRpcGxlIG90aGVyIGxpYnJhcmllczogaW4gdGhpcyBjYXNlLAotCSAgICAgICMgd2Uga25vdyAocGVkYW50aWNhbGx5LCB3ZSBhc3N1bWUpIHRoZSBsaWJyYXJ5IGRvZXMgbm90Ci0JICAgICAgIyBuZWVkIHRvIGJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSwgc28gd2Uga2VlcCBvbmx5IHRoZQotCSAgICAgICMgbGFzdCBjb3B5LiAgVGhpcyBpcyBub3QgYWx3YXlzIHJpZ2h0LCBidXQgaXQgaXMgcmFyZQotCSAgICAgICMgZW5vdWdoIHRoYXQgd2UgcmVxdWlyZSB1c2VycyB0aGF0IHJlYWxseSBtZWFuIHRvIHBsYXkKLQkgICAgICAjIHN1Y2ggdW5wb3J0YWJsZSBsaW5raW5nIHRyaWNrcyB0byBsaW5rIHRoZSBsaWJyYXJ5Ci0JICAgICAgIyB1c2luZyAtV2wsLWxuYW1lLCBzbyB0aGF0IGxpYnRvb2wgZG9lcyBub3QgY29uc2lkZXIgaXQKLQkgICAgICAjIGZvciBkdXBsaWNhdGUgcmVtb3ZhbC4KLQkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JICAgICAgKikKLQkJY2FzZSAiICRuZXdfbGlicyAiIGluCi0JCSoiICRkZXBsaWIgIiopIDs7Ci0JCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKLQkJZXNhYwotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKQotCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIDs7Ci0JICAgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCi0JZG9uZSAjIGZvciB2YXIKLSAgICAgIGZpCi0gICAgICAjIExhc3Qgc3RlcDogcmVtb3ZlIHJ1bnRpbWUgbGlicyBmcm9tIGRlcGVuZGVuY3lfbGlicwotICAgICAgIyAodGhleSBzdGF5IGluIGRlcGxpYnMpCi0gICAgICB0bXBfbGlicz0KLSAgICAgIGZvciBpIGluICRkZXBlbmRlbmN5X2xpYnMgOyBkbwotCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAiIGluCi0JKiIgJGkgIiopCi0JICBpPSIiCi0JICA7OwotCWVzYWMKLQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JICB0bXBfbGlicz0iJHRtcF9saWJzICRpIgotCWZpCi0gICAgICBkb25lCi0gICAgICBkZXBlbmRlbmN5X2xpYnM9JHRtcF9saWJzCi0gICAgZG9uZSAjIGZvciBwYXNzCi0gICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLSAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0gICAgZmkKLQotICAgIGNhc2UgJGxpbmttb2RlIGluCi0gICAgb2xkbGliKQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBvbGRsaWJzPSIkb3V0cHV0IgotICAgICAgb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMiCi0gICAgICA7OwotCi0gICAgbGliKQotICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgotICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgotICAgICAgbGliKikKLQluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0JZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KLQkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKLQkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIiAyPiYxCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQllbHNlCi0JICAkZWNobwotCSAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgotCSAgJGVjaG8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCi0JICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCi0gICAgICBmaQotICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgotCi0gICAgICBvbGRsaWJzPQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCSAgIyBTb21lIGNvbXBpbGVycyBoYXZlIHByb2JsZW1zIHdpdGggYSBgLmFsJyBleHRlbnNpb24gc28KLQkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGV4dGVuc2lvbiBhbgotCSAgIyBhcmNoaXZlIG5vcm1hbGx5IHdvdWxkLgotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQotCWlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0KLQlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0gICAgICBlbHNlCi0KLQkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlJRlM9IiRzYXZlX2lmcyIKLQotCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcwotCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCi0JIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKLQotCWNhc2UgJHZpbmZvX251bWJlciBpbgotCXllcykKLQkgIG51bWJlcl9tYWpvcj0iJDIiCi0JICBudW1iZXJfbWlub3I9IiQzIgotCSAgbnVtYmVyX3JldmlzaW9uPSIkNCIKLQkgICMKLQkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0Ci0JICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgotCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKLQkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKLQkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCi0JICAjCi0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93cykKLQkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcmAKLQkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKLQkgICAgOzsKLQkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxzdW5vcykKLQkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCi0JICAgIGFnZT0iMCIKLQkgICAgOzsKLQkgIGlyaXh8bm9uc3RvcHV4KQotCSAgICBjdXJyZW50PWBleHByICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yIC0gMWAKLQkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0Jbm8pCi0JICBjdXJyZW50PSIkMiIKLQkgIHJldmlzaW9uPSIkMyIKLQkgIGFnZT0iJDQiCi0JICA7OwotCWVzYWMKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAkY3VycmVudCBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkcmV2aXNpb24gaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkYWdlIGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0JbWFqb3I9Ci0JdmVyc3VmZml4PQotCXZlcnN0cmluZz0KLQljYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQlub25lKSA7OwotCi0JZGFyd2luKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgotCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KLQkgIG1pbm9yX2N1cnJlbnQ9YGV4cHIgJGN1cnJlbnQgKyAxYAotCSAgdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0JZnJlZWJzZC1hb3V0KQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7Ci0JICA7OwotCi0JZnJlZWJzZC1lbGYpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiOwotCSAgOzsKLQotCWlyaXggfCBub25zdG9wdXgpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAotCi0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgICAgbm9uc3RvcHV4KSB2ZXJzdHJpbmdfcHJlZml4PW5vbnN0b3B1eCA7OwotCSAgICAqKSAgICAgICAgIHZlcnN0cmluZ19wcmVmaXg9c2dpIDs7Ci0JICBlc2FjCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JHJldmlzaW9uCi0JICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRyZXZpc2lvbiAtICRsb29wYAotCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQotCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgotCSAgbWFqb3I9LiRtYWpvcgotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgOzsKLQotCWxpbnV4KQotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgOzsKLQotCW9zZikKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXN1bm9zKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQl3aW5kb3dzKQotCSAgIyBVc2UgJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seSB3YW50IG9uZQotCSAgIyBleHRlbnNpb24gb24gRE9TIDguMyBmaWxlc3lzdGVtcy4KLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLSRtYWpvciIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0JICAkZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0KLQkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgotCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICBtYWpvcj0KLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgZGFyd2luKQotCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKLQkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQotCSAgICB2ZXJzdHJpbmc9Ci0JICAgIDs7Ci0JICAqKQotCSAgICB2ZXJzdHJpbmc9IjAuMCIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgICAgdmVyc3VmZml4PQotCSAgZWxzZQotCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCi0JICBmaQotCWZpCi0KLQkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKLQlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdWZmaXg9Ci0JICB2ZXJzdHJpbmc9IiIKLQlmaQotCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgotCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICBmaQotCWVsc2UKLQkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCi0JIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKLQkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KLQlyZW1vdmVsaXN0PQotCXRlbXByZW1vdmVsaXN0PWAkZWNobyAiJG91dHB1dF9vYmpkaXIvKiJgCi0JZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbwotCSAgY2FzZSAkcCBpbgotCSAgICAqLiRvYmpleHQpCi0JICAgICAgIDs7Ci0JICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCi0JICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgotCSAgICAgICAgIGlmIGVjaG8gJHAgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCi0JICAgICAgICAgdGhlbgotCQkgICBjb250aW51ZQotCQkgZmkKLQkgICAgICAgZmkKLQkgICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJHAiCi0JICAgICAgIDs7Ci0JICAgICopIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgLW4gIiRyZW1vdmVsaXN0IjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkcmVtb3ZlbGlzdCIKLQkgICRydW4gJHtybX1yICRyZW1vdmVsaXN0Ci0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KLQlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCi0JIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICAjIEVsaW1pbmF0ZSBhbGwgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzLgotICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLQlsaWJfc2VhcmNoX3BhdGg9YCRlY2hvICIkbGliX3NlYXJjaF9wYXRoICIgfCAke1NFRH0gLWUgJ3MlICRwYXRoICUgJWcnYAotCWRlcGxpYnM9YCRlY2hvICIkZGVwbGlicyAiIHwgJHtTRUR9IC1lICdzJSAtTCRwYXRoICUgJWcnYAotCWRlcGVuZGVuY3lfbGlicz1gJGVjaG8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8ICR7U0VEfSAtZSAncyUgLUwkcGF0aCAlICVnJ2AKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JdGVtcF94cnBhdGg9Ci0JZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbwotCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0JaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAotICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgotICAgICAgZGxmaWxlcz0KLSAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbwotCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcwotICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgotICAgICAgZGxwcmVmaWxlcz0KLSAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbwotCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KLQkqIiAkbGliICIqKSA7OwotCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqKQotCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgotCSAgICA7OwotCSAgKi0qLW5ldGJzZCopCi0JICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgotCSAgICA7OwotCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCi0JICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLSAJICAqKQotCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgotCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCWZpCi0KLQkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCi0JbmFtZV9zYXZlPSRuYW1lCi0JbGlibmFtZV9zYXZlPSRsaWJuYW1lCi0JcmVsZWFzZV9zYXZlPSRyZWxlYXNlCi0JdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAotCW1ham9yX3NhdmU9JG1ham9yCi0JIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKLQkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KLQkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KLQlyZWxlYXNlPSIiCi0JdmVyc3VmZml4PSIiCi0JbWFqb3I9IiIKLQluZXdkZXBsaWJzPQotCWRyb3BwZWRkZXBzPW5vCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQlwYXNzX2FsbCkKLQkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgotCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjawotCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgotCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0Ci0JICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KLQkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKLQkgIDs7Ci0JdGVzdF9jb21waWxlKQotCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKLQkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0Ci0JICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjawotCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCi0JICAkcm0gY29uZnRlc3QuYwotCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLQkgICRybSBjb25mdGVzdAotCSAgJExUQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAiJD8iIC1lcSAwIDsgdGhlbgotCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9YGV4cHIgJGkgOiAnLWxcKC4qXCknYAotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotICAgICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAiJG5hbWUiIC1uZSAiMCI7IHRoZW4KLQkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkgICoiICRpICIqKQotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBpPSIiCi0JCSAgICA7OwotCQkgIGVzYWMKLQkgICAgICAgIGZpCi0JCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgZGVwbGliX21hdGNoPSQyCi0JCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgZWxzZQotCQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAkZWNobwotCQkgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCi0JCSAgICAkZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgotCQkgICAgJGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJICBmaQotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKLQkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKLQkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLSAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KLQkJJHJtIGNvbmZ0ZXN0Ci0JCSRMVENDIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGkKLQkJIyBEaWQgaXQgd29yaz8KLQkJaWYgdGVzdCAiJD8iIC1lcSAwIDsgdGhlbgotCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCSAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJICAgICoiICRpICIqKQotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgICAgaT0iIgotCQkgICAgICA7OwotCQkgICAgZXNhYwotCQkgIGZpCi0JCSAgaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCQkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKLQkJICAgIGRlcGxpYl9tYXRjaD0kMgotCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgIGVsc2UKLQkJICAgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAgICRlY2hvCi0JCSAgICAgICRlY2hvICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkgICAgICAkZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgdGhpcyBvbmUiCi0JCSAgICAgICRlY2hvICIqKiogYXMgYSBkeW5hbWljIGRlcGVuZGVuY3kgdGhhdCBwcm9ncmFtcyBjYW4gZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCi0JCSAgICBmaQotCQkgIGZpCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICAkZWNobwotCQkgICRlY2hvICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgJGVjaG8gIioqKiAgbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCi0JCSAgJGVjaG8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCi0JCSAgJGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCSAgOzsKLQlmaWxlX21hZ2ljKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgbmFtZT1gZXhwciAkYV9kZXBsaWIgOiAnLWxcKC4qXCknYAotCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLSAgICAgICAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiAmJiB0ZXN0ICAiJG5hbWUiICE9ICIwIjsgdGhlbgotCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSoiICRhX2RlcGxpYiAiKikKLQkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCSAgYV9kZXBsaWI9IiIKLQkJICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIFwKLQkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KLQkJCWNvbnRpbnVlCi0JCSAgICAgIGZpCi0JCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgotCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCi0JCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKLQkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAotCQkgICAgICAjIGJ1dCBzbyB3aGF0PwotCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgotCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KLQkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgJHtTRUR9ICdzLy4qIC0+IC8vJ2AKLQkJCWNhc2UgJHBvdGxpYmxpbmsgaW4KLQkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OwotCQkJKikgcG90bGliPWAkZWNobyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OwotCQkJZXNhYwotCQkgICAgICBkb25lCi0JCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCAke1NFRH0gMTBxIFwKLQkJCSB8ICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCQlhX2RlcGxpYj0iIgotCQkJYnJlYWsgMgotCQkgICAgICBmaQotCQkgIGRvbmUKLQkJZG9uZQotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCSRlY2hvCi0JCSRlY2hvICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkkZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKLQkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCi0JCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgZmlsZSBtYWdpYyB0ZXN0KSIKLQkJZWxzZQotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgotCQkgICRlY2hvICIqKiogdXNpbmcgYSBmaWxlIG1hZ2ljLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKLQkJZmkKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KLQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JICAgIGZpCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQltYXRjaF9wYXR0ZXJuKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgbmFtZT1gZXhwciAkYV9kZXBsaWIgOiAnLWxcKC4qXCknYAotCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgaWYgdGVzdCAtbiAiJG5hbWUiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkqIiAkYV9kZXBsaWIgIiopCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgIGFfZGVwbGliPSIiCi0JCSAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAotCQkgICAgaWYgZXZhbCAkZWNobyBcIiRwb3RlbnRfbGliXCIgMj4vZGV2L251bGwgXAotCQkgICAgICAgIHwgJHtTRUR9IDEwcSBcCi0JCSAgICAgICAgfCAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCSAgICAgIGFfZGVwbGliPSIiCi0JCSAgICAgIGJyZWFrIDIKLQkJICAgIGZpCi0JCSAgZG9uZQotCQlkb25lCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJJGVjaG8KLQkJJGVjaG8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQkkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSRlY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciByZWdleCBwYXR0ZXJuIHRlc3QpIgotCQllbHNlCi0JCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgJGVjaG8gIioqKiB1c2luZyBhIHJlZ2V4IHBhdHRlcm4uIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgZmkKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW5vbmUgfCB1bmtub3duIHwgKikKLQkgIG5ld2RlcGxpYnM9IiIKLQkgIHRtcF9kZXBsaWJzPWAkZWNobyAiWCAkZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjJC8vJyBcCi0JICAgIC1lICdzLyAtW0xSXVteIF0qLy9nJ2AKLQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgZm9yIGkgaW4gJHByZWRlcHMgJHBvc3RkZXBzIDsgZG8KLQkgICAgICAjIGNhbid0IHVzZSBYc2VkIGJlbG93LCBiZWNhdXNlICRpIG1pZ2h0IGNvbnRhaW4gJy8nCi0JICAgICAgdG1wX2RlcGxpYnM9YCRlY2hvICJYICR0bXBfZGVwbGlicyIgfCAke1NFRH0gLWUgIjFzLF5YLCwiIC1lICJzLCRpLCwiYAotCSAgICBkb25lCi0JICBmaQotCSAgaWYgJGVjaG8gIlggJHRtcF9kZXBsaWJzIiB8ICRYc2VkIC1lICdzL1sgCV0vL2cnIFwKLQkgICAgfCBncmVwIC4gPi9kZXYvbnVsbDsgdGhlbgotCSAgICAkZWNobwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IGtub3duIHRvIGJlIHN1cHBvcnRlZC4iCi0JICAgIGZpCi0JICAgICRlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQljYXNlICRob3N0IGluCi0JKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgIG5ld2RlcGxpYnM9YCRlY2hvICJYICRuZXdkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8KLQkgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgotCSAgICAkZWNobyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCi0JICAgICRlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyIKLQkgICAgJGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICAkZWNobwotCSAgICAgICRlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkgICAgICAkZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICAkZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCSAgICAgICRlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgIGVsc2UKLQkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgJGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgICRlY2hvICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgotCSAgICAkZWNobyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgotCi0JICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0gbm87IHRoZW4KLQkgICAgICAkZWNobwotCSAgICAgICRlY2hvICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgotCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKLQkgICAgICAkZWNobyAiKioqIGl0IHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1uby11bmRlZmluZWQsIgotCSAgICAgICRlY2hvICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgotCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCQlvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JCWJ1aWxkX29sZF9saWJzPXllcwotCSAgICAgIGVsc2UKLQkJYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgICAgZmkKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKLQlkZXBsaWJzPSRuZXdkZXBsaWJzCi0gICAgICBmaQotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0KLSAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLQkgIGhhcmRjb2RlX2xpYmRpcnM9Ci0JICBkZXBfcnBhdGg9Ci0JICBycGF0aD0iJGZpbmFsaXplX3JwYXRoIgotCSAgdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBycGF0aD0iJGNvbXBpbGVfcnBhdGgkcnBhdGgiCi0JICBmb3IgbGliZGlyIGluICRycGF0aDsgZG8KLQkgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JCWlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JCWVsc2UKLQkJICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JCSAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkJICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCSAgICA7OwotCQkgICopCi0JCSAgICBoYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJICAgIDs7Ci0JCSAgZXNhYwotCQlmaQotCSAgICAgIGVsc2UKLQkJZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCQlkZXBfcnBhdGg9IiRkZXBfcnBhdGggJGZsYWciCi0JICAgICAgZmkKLQkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBkb25lCi0JICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JICAgICB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQkgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQiOyB0aGVuCi0JICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZFwiCi0JICAgIGVsc2UKLQkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgZmkKLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgICBycGF0aD0KLQkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIGRvbmUKLQkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCi0JICBmaQotCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKLQlmaQotCi0Jc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgotCXRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkc2hsaWJwYXRoIgotCWlmIHRlc3QgLW4gIiRzaGxpYnBhdGgiOyB0aGVuCi0JICBldmFsICIkc2hsaWJwYXRoX3Zhcj0nJHNobGlicGF0aFwkJHNobGlicGF0aF92YXInOyBleHBvcnQgJHNobGlicGF0aF92YXIiCi0JZmkKLQotCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgotCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JcmVhbG5hbWU9IiQyIgotCXNoaWZ0OyBzaGlmdAotCi0JaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCWVsc2UKLQkgIHNvbmFtZT0iJHJlYWxuYW1lIgotCWZpCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgIGRsbmFtZT0kc29uYW1lCi0JZmkKLQotCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgotCWZvciBsaW5rCi0JZG8KLQkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgICBpZiBsZW49YGV4cHIgIlgkY21kIiA6ICIuKiJgICYmCi0JICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgICAgIHNraXBwZWRfZXhwb3J0PWZhbHNlCi0JICAgICAgZWxzZQotCSAgICAgICAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGV4ZWN1dGUgaW4gb25lIHN0ZXAuCi0JICAgICAgICAkc2hvdyAidXNpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBmb3IgZXhwb3J0IGxpc3QuLi4iCi0JICAgICAgICBza2lwcGVkX2V4cG9ydD06Ci0JCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCi0JCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgotCQlicmVhawotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkc2hvdyAiJEVHUkVQIC1lIFwiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4XCIgXCIkZXhwb3J0X3N5bWJvbHNcIiA+IFwiJHtleHBvcnRfc3ltYm9sc31UXCIiCi0JICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKLQlmaQotCi0JdG1wX2RlcGxpYnM9Ci0JZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCQljYXNlICIgJGNvbnZlbmllbmNlICIgaW4KLQkJKiIgJHRlc3RfZGVwbGliICIqKSA7OwotCQkqKQotCQkJdG1wX2RlcGxpYnM9IiR0bXBfZGVwbGlicyAkdGVzdF9kZXBsaWIiCi0JCQk7OwotCQllc2FjCi0JZG9uZQotCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKLQotCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCi0JICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0JICBmaQotCWZpCi0JCi0JaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCi0JZmkKLQotCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZwotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VSAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCi0JICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcwotCSAgZWxzZQotCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCi0JICAgIGNtZHM9JG1vZHVsZV9jbWRzCi0JICBmaQotCWVsc2UKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCi0JICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi0JZWxzZQotCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLQkgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgotCSAgIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkgIDoKLQllbHNlCi0JICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UuCi0JICAkZWNobyAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCi0KLQkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCi0JICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKLQkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKLQkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0Ci0JICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgotCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQotCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZwotCSAgIyB0aGUgc3BlYy4KLQkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKLQkgIGZpCi0JICBzYXZlX291dHB1dD0kb3V0cHV0Ci0JICBvdXRwdXRfbGE9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKLQotCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKLQkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KLQkgIHRlc3RfY21kcz0KLQkgIGNvbmNhdF9jbWRzPQotCSAgb2JqbGlzdD0KLQkgIGRlbGZpbGVzPQotCSAgbGFzdF9yb2JqPQotCSAgaz0xCi0JICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKLQkgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgotCSAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCi0JICBkbwotCSAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKLQkgICAgICAgeyBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCi0JCSB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiI7IH07IHRoZW4KLQkgICAgICBvYmpsaXN0PSIkb2JqbGlzdCAkb2JqIgotCSAgICBlbHNlCi0JICAgICAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKLQkgICAgICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgotCSAgICAgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KLQkJIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KLQkJZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgICBlbHNlCi0JCSMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCi0JCSMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCi0JCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkgICAgICBmaQotCSAgICAgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgICAgIGs9YGV4cHIgJGsgKyAxYAotCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgICAgIG9iamxpc3Q9JG9iagotCSAgICAgIGxlbj0xCi0JICAgIGZpCi0JICBkb25lCi0JICAjIEhhbmRsZSB0aGUgcmVtYWluaW5nIG9iamVjdHMgYnkgY3JlYXRpbmcgb25lIGxhc3QKLQkgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0Ci0JICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQotCSAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgbGlib2Jqcz0kb3V0cHV0Ci0JICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCi0JICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLSAgICAgICAgICBmaQotCi0JICAjIFNldCB1cCBhIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcwotCSAgIyBhZnRlciB0aGV5IGFyZSB1c2VkLgotCSAgaT0wCi0JICB3aGlsZSB0ZXN0ICIkaSIgLWx0ICIkayIKLQkgIGRvCi0JICAgIGk9YGV4cHIgJGkgKyAxYAotCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtpfS4kb2JqZXh0IgotCSAgZG9uZQotCi0JICAkZWNobyAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKLQotCSAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCi0JICBsaWJvYmpzPSRvdXRwdXQKLQkgICMgUmVzdG9yZSB0aGUgdmFsdWUgb2Ygb3V0cHV0LgotCSAgb3V0cHV0PSRzYXZlX291dHB1dAotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiICYmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICBmaQotCSAgIyBFeHBhbmQgdGhlIGxpYnJhcnkgbGlua2luZyBjb21tYW5kcyBhZ2FpbiB0byByZXNldCB0aGUKLQkgICMgdmFsdWUgb2YgJGxpYm9ianMgZm9yIHBpZWNld2lzZSBsaW5raW5nLgotCi0JICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICAgIGVsc2UKLQkgICAgICBjbWRzPSRtb2R1bGVfY21kcwotCSAgICBmaQotCSAgZWxzZQotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcwotCSAgZWxzZQotCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKLQkgICAgZmkKLQkgIGZpCi0KLQkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0aGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMKLQkgICMgdG8gdGhlIGp1c3QtcmVzZXQgJGNtZHMuCi0JICBldmFsIGNtZHM9XCJcJGNtZHN+XCRybSAkZGVsZmlsZXNcIgotCWZpCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCB7Ci0JICAgIGx0X2V4aXQ9JD8KLQotCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknCi0JICAgIGZpCi0KLQkgICAgZXhpdCAkbHRfZXhpdAotCSAgfQotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkbXYgIiRyZWFsbmFtZSJVICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KLQotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgICAgICRydW4gJHtybX1yICIkZ2VudG9wIgotCSAgICBmaQotCSAgZmkKLQotCSAgZXhpdCAkRVhJVF9TVUNDRVNTCi0JZmkKLQotCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0JZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCi0JICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAgICoubG8pCi0JaWYgdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JbGlib2JqPSIkb3V0cHV0IgotCW9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JOzsKLSAgICAgICopCi0JbGlib2JqPQotCW9iaj0iJG91dHB1dCIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCi0gICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKLQotICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCi0gICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQotICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKLSAgICAgICMgdGhlIGV4dHJhY3Rpb24uCi0gICAgICByZWxvYWRfY29udl9vYmpzPQotICAgICAgZ2VudG9wPQotICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKLSAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKLSAgICAgIHdsPQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCByZWxvYWRfY29udl9vYmpzPVwiXCRyZWxvYWRfb2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCWVsc2UKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0gICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQotICAgICAgb3V0cHV0PSIkb2JqIgotICAgICAgY21kcz0kcmVsb2FkX2NtZHMKLSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQlldmFsIGNtZD1cIiRjbWRcIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgotICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgJGdlbnRvcAotCWZpCi0KLQlleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAkcnVuICR7cm19ciAkZ2VudG9wCi0JZmkKLQotCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0JIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLQkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JIyAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KLQkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKLQlvdXRwdXQ9IiRsaWJvYmoiCi0JY21kcz0kcmVsb2FkX2NtZHMKLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBldmFsIGNtZD1cIiRjbWRcIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkkcnVuICR7cm19ciAkZ2VudG9wCi0gICAgICBmaQotCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0KLSAgICBwcm9nKQotICAgICAgY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXQgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OwotICAgICAgZXNhYwotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgotCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKLQlmaQotICAgICAgZmkKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKmRhcndpbiopCi0gICAgICAgICMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLSAgICAgICAgaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgotICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRsaWJkaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgZGxzeW1zPQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JY2FzZSAkZGxzeW1zIGluCi0JIiIpIDs7Ci0JKi5jKQotCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KLQkgIG5saXN0PSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Lm5tIgotCi0JICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQotCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQkgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCi0JICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyA+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCi0vKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLwotI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAotIgotCi0JICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKLQotCSAgICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCi0KLQkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgICBkb25lCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGVsc2UKLQkgICAgICAkcnVuIGV2YWwgIiR7U0VEfSAtZSAncy9cKFsgXVsuKl4kXVwpL1xcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCInCi0JICAgICAgJHJ1biBldmFsICdncmVwIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICdtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0JICBmaQotCi0JICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgbmFtZT1gJGVjaG8gIiRhcmciIHwgJHtTRUR9IC1lICdzJV4uKi8lJSdgCi0JICAgICRydW4gZXZhbCAnJGVjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCi0JICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgotCSAgICBmaQotCi0JICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0JICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8Ci0JCWlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkgIHNvcnQgLWsgMwotCQllbHNlCi0JCSAgc29ydCArMgotCQlmaSB8Ci0JCXVuaXEgPiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJwotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCSAgICBmaQotCi0JICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotCi0jdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyIHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0ciBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi0iCi0KLQkgICAgY2FzZSAkaG9zdCBpbgotCSAgICAqY3lnd2luKiB8ICptaW5ndyogKQotCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0vKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNhbid0IGJlIGNvbnN0LCBiZWNhdXNlCi0gICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgotICAgb24gcHNldWRvLXJlbG9jcyAqLwotc3RydWN0IHsKLSIKLQkgICAgICA7OwotCSAgICAqICkKLQkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotY29uc3Qgc3RydWN0IHsKLSIKLQkgICAgICA7OwotCSAgICBlc2FjCi0KLQotCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0ciBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCi0JICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotICB7MCwgKGx0X3B0cikgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmXAotIgotCSAgZmkKLQotCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQotCSAgY2FzZSAkaG9zdCBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1zdGF0aWMgIiopIDs7Ci0JICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCI7OwotCSAgICBlc2FjOzsKLQkgICotKi1ocHV4KikKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1zdGF0aWMgIiopIDs7Ci0JICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyI7OwotCSAgICBlc2FjCi0JICBlc2FjCi0KLQkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCi0JICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgXCIkZGxzeW1zXCIpIgotCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJExUQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/Ci0KLQkgICMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJGRsc3ltcyAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCi0JICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKLQkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0KLQkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQotCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKLQlzdGF0dXM9JD8KLQotCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi0JaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgotCSAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKLQlmaQotCi0JZXhpdCAkc3RhdHVzCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkjIFdlIHNob3VsZCBzZXQgdGhlIHNobGlicGF0aF92YXIKLQlycGF0aD0KLQlmb3IgZGlyIGluICR0ZW1wX3JwYXRoOyBkbwotCSAgY2FzZSAkZGlyIGluCi0JICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0JICAgICMgQWJzb2x1dGUgcGF0aC4KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICA7OwotCSAgKikKLQkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5vX2luc3RhbGwiID0geWVzOyB0aGVuCi0JIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc2NyaXB0LgotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQlsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgotCSRydW4gJHJtICRvdXRwdXQKLQkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKLQkkc2hvdyAiJGxpbmtfY29tbWFuZCIKLQkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQlleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0JIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgotCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAotCSAgZWxzZQotCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICBmaQotCWVsc2UKLQkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KLSAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgotCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKLQkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JICBlbHNlCi0JICAgIHZhcl92YWx1ZT1gJGVjaG8gIlgkdmFyX3ZhbHVlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JICBmaQotCWRvbmUKLQlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgotCXJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgIlgkZWNobyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotCWNhc2UgJHByb2dwYXRoIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQllc2FjCi0JcWVjaG89YCRlY2hvICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGVsc2UKLQlxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JIyB3aW4zMiB3aWxsIHRoaW5rIHRoZSBzY3JpcHQgaXMgYSBiaW5hcnkgaWYgaXQgaGFzCi0JIyBhIC5leGUgc3VmZml4LCBzbyB3ZSBzdHJpcCBpdCBvZmYgaGVyZS4KLQljYXNlICRvdXRwdXQgaW4KLQkgICouZXhlKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXR8JHtTRUR9ICdzLC5leGUkLCwnYCA7OwotCWVzYWMKLQkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKLQljYXNlICRob3N0IGluCi0JICAqY3lnd2luKikKLQkgICAgZXhlZXh0PS5leGUKLQkgICAgb3V0cHV0bmFtZT1gJGVjaG8gJG91dHB1dG5hbWV8JHtTRUR9ICdzLC5leGUkLCwnYCA7OwotCSAgKikgZXhlZXh0PSA7OwotCWVzYWMKLQljYXNlICRob3N0IGluCi0JICAqY3lnd2luKiB8ICptaW5ndyogKQotCSAgICBjd3JhcHBlcnNvdXJjZT1gJGVjaG8gJHtvYmpkaXJ9L2x0LSR7b3V0cHV0bmFtZX0uY2AKLQkgICAgY3dyYXBwZXI9YCRlY2hvICR7b3V0cHV0fS5leGVgCi0JICAgICRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCi0JICAgIHRyYXAgIiRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyOyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0JICAgIGNhdCA+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgotCi0vKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0gICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0KLSAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotCi0gICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0gICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSAgIEN1cnJlbnRseSwgaXQgc2ltcGx5IGV4ZWNzIHRoZSB3cmFwcGVyICpzY3JpcHQqICIvYmluL3NoICRvdXRwdXQiLAotICAgYnV0IGNvdWxkIGV2ZW50dWFsbHkgYWJzb3JiIGFsbCBvZiB0aGUgc2NyaXB0cyBmdW5jdGlvbmFsaXR5IGFuZAotICAgZXhlYyAkb2JqZGlyLyRvdXRwdXRuYW1lIGRpcmVjdGx5LgotKi8KLUVPRgotCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlPDwiRU9GIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpZiBkZWZpbmVkKFBBVEhfTUFYKQotIyBkZWZpbmUgTFRfUEFUSE1BWCBQQVRIX01BWAotI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQotIyBkZWZpbmUgTFRfUEFUSE1BWCBNQVhQQVRITEVOCi0jZWxzZQotIyBkZWZpbmUgTFRfUEFUSE1BWCAxMDI0Ci0jZW5kaWYKLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKLSAgZGVmaW5lZCAoX19PUzJfXykKLSNkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCi0jZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKLSNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAotICAgICAgICAoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKLSNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KLQotI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQotI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCi0gIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCi19IHdoaWxlICgwKQotCi1jb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBOVUxMOwotCi12b2lkICogeG1hbGxvYyAoc2l6ZV90IG51bSk7Ci1jaGFyICogeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKLWNoYXIgKiBiYXNlbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7Ci1jaGFyICogZm5xdWFsaWZ5KGNvbnN0IGNoYXIgKnBhdGgpOwotY2hhciAqIHN0cmVuZHphcChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Ci12b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGNoYXIgKipuZXdhcmd6OwotICBpbnQgaTsKLQotICBwcm9ncmFtX25hbWUgPSAoY2hhciAqKSB4c3RyZHVwICgoY2hhciAqKSBiYXNlbmFtZSAoYXJndlswXSkpOwotICBuZXdhcmd6ID0gWE1BTExPQyhjaGFyICosIGFyZ2MrMik7Ci1FT0YKLQotCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCi0gIG5ld2FyZ3pbMF0gPSAiJFNIRUxMIjsKLUVPRgotCi0JICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDwiRU9GIgotICBuZXdhcmd6WzFdID0gZm5xdWFsaWZ5KGFyZ3ZbMF0pOwotICAvKiB3ZSBrbm93IHRoZSBzY3JpcHQgaGFzIHRoZSBzYW1lIG5hbWUsIHdpdGhvdXQgdGhlIC5leGUgKi8KLSAgLyogc28gbWFrZSBzdXJlIG5ld2FyZ3pbMV0gZG9lc24ndCBlbmQgaW4gLmV4ZSAqLwotICBzdHJlbmR6YXAobmV3YXJnelsxXSwiLmV4ZSIpOwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIG5ld2FyZ3pbaSsxXSA9IHhzdHJkdXAoYXJndltpXSk7Ci0gIG5ld2FyZ3pbYXJnYysxXSA9IE5VTEw7Ci1FT0YKLQotCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCi0gIGV4ZWN2KCIkU0hFTEwiLG5ld2FyZ3opOwotRU9GCi0KLQkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PCJFT0YiCi0gIHJldHVybiAxMjc7Ci19Ci0KLXZvaWQgKgoteG1hbGxvYyAoc2l6ZV90IG51bSkKLXsKLSAgdm9pZCAqIHAgPSAodm9pZCAqKSBtYWxsb2MgKG51bSk7Ci0gIGlmICghcCkKLSAgICBsdF9mYXRhbCAoIk1lbW9yeSBleGhhdXN0ZWQiKTsKLQotICByZXR1cm4gcDsKLX0KLQotY2hhciAqCi14c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLCBzdHJpbmcpIDogTlVMTAotOwotfQotCi1jaGFyICoKLWJhc2VuYW1lIChjb25zdCBjaGFyICpuYW1lKQotewotICBjb25zdCBjaGFyICpiYXNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCi0gIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KLSAgaWYgKGlzYWxwaGEgKG5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKQotICAgIG5hbWUgKz0gMjsKLSNlbmRpZgotCi0gIGZvciAoYmFzZSA9IG5hbWU7ICpuYW1lOyBuYW1lKyspCi0gICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKCpuYW1lKSkKLSAgICAgIGJhc2UgPSBuYW1lICsgMTsKLSAgcmV0dXJuIChjaGFyICopIGJhc2U7Ci19Ci0KLWNoYXIgKgotZm5xdWFsaWZ5KGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpwOwotICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07Ci0KLSAgYXNzZXJ0KHBhdGggIT0gTlVMTCk7Ci0KLSAgLyogSXMgaXQgcXVhbGlmaWVkIGFscmVhZHk/ICovCi0jaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCi0gIGlmIChpc2FscGhhIChwYXRoWzBdKSAmJiBwYXRoWzFdID09ICc6JykKLSAgICByZXR1cm4geHN0cmR1cCAocGF0aCk7Ci0jZW5kaWYKLSAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKHBhdGhbMF0pKQotICAgIHJldHVybiB4c3RyZHVwIChwYXRoKTsKLQotICAvKiBwcmVwZW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwotICAvKiBkb2Vzbid0IGhhbmRsZSAnficgKi8KLSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOwotICBzaXplID0gc3RybGVuKHRtcCkgKyAxICsgc3RybGVuKHBhdGgpICsgMTsgLyogKzIgZm9yICcvJyBhbmQgJ1wwJyAqLwotICBwID0gWE1BTExPQyhjaGFyLCBzaXplKTsKLSAgc3ByaW50ZihwLCAiJXMlYyVzIiwgdG1wLCBESVJfU0VQQVJBVE9SLCBwYXRoKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLWNoYXIgKgotc3RyZW5kemFwKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KQotewotICBzaXplX3QgbGVuLCBwYXRsZW47Ci0KLSAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKLSAgYXNzZXJ0KHBhdCAhPSBOVUxMKTsKLQotICBsZW4gPSBzdHJsZW4oc3RyKTsKLSAgcGF0bGVuID0gc3RybGVuKHBhdCk7Ci0KLSAgaWYgKHBhdGxlbiA8PSBsZW4pCi0gIHsKLSAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOwotICAgIGlmIChzdHJjbXAoc3RyLCBwYXQpID09IDApCi0gICAgICAqc3RyID0gJ1wwJzsKLSAgfQotICByZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgdm9pZAotbHRfZXJyb3JfY29yZSAoaW50IGV4aXRfc3RhdHVzLCBjb25zdCBjaGFyICogbW9kZSwKLSAgICAgICAgICBjb25zdCBjaGFyICogbWVzc2FnZSwgdmFfbGlzdCBhcCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAiLCBwcm9ncmFtX25hbWUsIG1vZGUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIi5cbiIpOwotCi0gIGlmIChleGl0X3N0YXR1cyA+PSAwKQotICAgIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotdm9pZAotbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKLXsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKLSAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQotRU9GCi0JICAjIHdlIHNob3VsZCByZWFsbHkgdXNlIGEgYnVpbGQtcGxhdGZvcm0gc3BlY2lmaWMgY29tcGlsZXIKLQkgICMgaGVyZSwgYnV0IE9UT0gsIHRoZSB3cmFwcGVycyAoc2hlbGwgc2NyaXB0IGFuZCB0aGlzIEMgb25lKQotCSAgIyBhcmUgb25seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZXhlY3V0ZSB0aGUgInJlYWwiIGJpbmFyeS4KLQkgICMgU2luY2UgdGhlICJyZWFsIiBiaW5hcnkgaXMgYnVpbHQgZm9yICRob3N0LCB0aGVuIHRoaXMKLQkgICMgd3JhcHBlciBtaWdodCBhcyB3ZWxsIGJlIGJ1aWx0IGZvciAkaG9zdCwgdG9vLgotCSAgJHJ1biAkTFRDQyAtcyAtbyAkY3dyYXBwZXIgJGN3cmFwcGVyc291cmNlCi0JICA7OwotCWVzYWMKLQkkcm0gJG91dHB1dAotCXRyYXAgIiRybSAkb3V0cHV0OyBleGl0ICRFWElUX0ZBSUxVUkUiIDEgMiAxNQotCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jISAkU0hFTEwKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0jIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLSMKLSMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9JyR7U0VEfSAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAotCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KLWlmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgotICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgotICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCi0gICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gICAgICBzaGlmdAotICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KLSAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgotICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZmlcCi0iCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OwotICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OwotICAgICAgZXNhYwotICAgIGZpCi0KLSAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAotICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKLSAgZG9uZQotCi0gICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCi0gIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKLSAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKLSIKLQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLQotICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKLSAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAotICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCi0KLSAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgotCi0gICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KLSAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCi0gICAgZWxzZQotICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gICAgZmkiCi0KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJGVjaG8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgotCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSIKLQlmaQotCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCi0KLQkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KLQlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKLSAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCi0KLSAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKLSAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCi0KLSAgICBleHBvcnQgJHNobGlicGF0aF92YXIKLSIKLQlmaQotCi0JIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KLQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAotICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICi0iCi0JZmkKLQotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgotIgotCWNhc2UgJGhvc3QgaW4KLQkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKLQkqLSotbWluZ3cgfCAqLSotb3MyKikKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQotCSopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JZXNhYwotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgJGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICBmaQotZmlcCi0iCi0JY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbwotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCi0Jb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQlhZGRsaWJzPSIkY29udmVuaWVuY2UiCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KLQkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQllbHNlCi0JICBvbGRvYmpzPSIkb2xkX2RlcGxpYnMgJG5vbl9waWNfb2JqZWN0cyIKLQlmaQotCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KLQlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKLQlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotICAgICAgZWxzZQotCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQotCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCi0JIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKLQkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZwotCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5Ci0JIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgotCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCi0JICAgIGRvCi0JICAgICAgJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJScKLQkgICAgZG9uZSB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCi0JICA6Ci0JZWxzZQotCSAgJGVjaG8gImNvcHlpbmcgc2VsZWN0ZWQgb2JqZWN0IGZpbGVzIHRvIGF2b2lkIGJhc2VuYW1lIGNvbmZsaWN0cy4uLiIKLQotCSAgaWYgdGVzdCAteiAiJGdlbnRvcCI7IHRoZW4KLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKLQkgICAgJHNob3cgIiRta2RpciAkZ2VudG9wIgotCSAgICAkcnVuICRta2RpciAiJGdlbnRvcCIKLQkgICAgc3RhdHVzPSQ/Ci0JICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KLQkgICAgICBleGl0ICRzdGF0dXMKLQkgICAgZmkKLQkgIGZpCi0KLQkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcwotCSAgb2xkb2Jqcz0KLQkgIGNvdW50ZXI9MQotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBvYmpiYXNlPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgY2FzZSAiICRvbGRvYmpzICIgaW4KLQkgICAgIiAiKSBvbGRvYmpzPSRvYmogOzsKLQkgICAgKltcIC9dIiRvYmpiYXNlICIqKQotCSAgICAgIHdoaWxlIDo7IGRvCi0JCSMgTWFrZSBzdXJlIHdlIGRvbid0IHBpY2sgYW4gYWx0ZXJuYXRlIG5hbWUgdGhhdCBhbHNvCi0JCSMgb3ZlcmxhcHMuCi0JCW5ld29iaj1sdCRjb3VudGVyLSRvYmpiYXNlCi0JCWNvdW50ZXI9YGV4cHIgJGNvdW50ZXIgKyAxYAotCQljYXNlICIgJG9sZG9ianMgIiBpbgotCQkqW1wgL10iJG5ld29iaiAiKikgOzsKLQkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OwotCQllc2FjCi0JICAgICAgZG9uZQotCSAgICAgICRzaG93ICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKLQkgICAgICAkcnVuIGxuICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIiB8fAotCSAgICAgICRydW4gY3AgIiRvYmoiICIkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIDs7Ci0JICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotCi0JaWYgbGVuPWBleHByICJYJGNtZHMiIDogIi4qImAgJiYKLQkgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgY21kcz0kb2xkX2FyY2hpdmVfY21kcwotCWVsc2UKLQkgICMgdGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIGluIHBhcnRzCi0JICAkZWNobyAidXNpbmcgcGllY2V3aXNlIGFyY2hpdmUgbGlua2luZy4uLiIKLQkgIHNhdmVfUkFOTElCPSRSQU5MSUIKLQkgIFJBTkxJQj06Ci0JICBvYmpsaXN0PQotCSAgY29uY2F0X2NtZHM9Ci0JICBzYXZlX29sZG9ianM9JG9sZG9ianMKLQotCSAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZmluZGluZyB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3Q/Ci0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIGxhc3Rfb2xkb2JqPSRvYmoKLQkgIGRvbmUKLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgb2xkb2Jqcz0iJG9iamxpc3QgJG9iaiIKLQkgICAgb2JqbGlzdD0iJG9iamxpc3QgJG9iaiIKLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0JICAgIGlmIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKLQkgICAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iOyB0aGVuCi0JICAgICAgOgotCSAgICBlbHNlCi0JICAgICAgIyB0aGUgYWJvdmUgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBiZWZvcmUgaXQgZ2V0cyB0b28gbG9uZwotCSAgICAgIG9sZG9ianM9JG9iamxpc3QKLQkgICAgICBpZiB0ZXN0ICIkb2JqIiA9ICIkbGFzdF9vbGRvYmoiIDsgdGhlbgotCSAgICAgICAgUkFOTElCPSRzYXZlX1JBTkxJQgotCSAgICAgIGZpCi0JICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+Ci0JICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgICAgICBvYmpsaXN0PQotCSAgICBmaQotCSAgZG9uZQotCSAgUkFOTElCPSRzYXZlX1JBTkxJQgotCSAgb2xkb2Jqcz0kb2JqbGlzdAotCSAgaWYgdGVzdCAiWCRvbGRvYmpzIiA9ICJYIiA7IHRoZW4KLQkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc1wiCi0JICBlbHNlCi0JICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHN+XCRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0gICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgotICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCi0gICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAkb3V0cHV0IGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCi0gICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KLQlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKLQllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KLQkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQllbHNlCi0JICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIHJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1tb2RlPXJlbGluayAkbGlidG9vbF9hcmdzIEBpbnN0X3ByZWZpeF9kaXJAKSIKLSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllcyA7IHRoZW4KLQlyZWxpbmtfY29tbWFuZD0KLSAgICAgIGZpCi0KLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbwotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgICoubGEpCi0JCW5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAotCQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCWZpCi0JCW5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkbGliZGlyLyRuYW1lIgotCQk7OwotCSAgICAgICopIG5ld2RlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIG5ld2RsZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCi0JICAgICAgbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQlleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgICBmaQotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWJkaXIvJG5hbWUiCi0JICAgIGRvbmUKLQkgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCi0JICAgIG5ld2RscHJlZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICAgbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQlleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgICBmaQotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCi0JICAgIGRvbmUKLQkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0JICBlbHNlCi0JICAgIG5ld2RsZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCi0JICAgICAgY2FzZSAkbGliIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OwotCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRhYnMiCi0JICAgIGRvbmUKLQkgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCi0JICAgIG5ld2RscHJlZmlsZXM9Ci0JICAgIGZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICAgY2FzZSAkbGliIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzPSIkbGliIiA7OwotCQkqKSBhYnM9YHB3ZGAiLyRsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRhYnMiCi0JICAgIGRvbmUKLQkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCi0JICBmaQotCSAgJHJtICRvdXRwdXQKLQkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgotCSAgdGRsbmFtZT0kZGxuYW1lCi0JICBjYXNlICRob3N0LCRvdXRwdXQsJGluc3RhbGxlZCwkbW9kdWxlLCRkbG5hbWUgaW4KLQkgICAgKmN5Z3dpbiosKmxhaSx5ZXMsbm8sKi5kbGwgfCAqbWluZ3cqLCpsYWkseWVzLG5vLCouZGxsKSB0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lIDs7Ci0JICBlc2FjCi0JICAkZWNobyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgotZGxuYW1lPSckdGRsbmFtZScKLQotIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCi1saWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKLQotIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCi1vbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JwotCi0jIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLWRlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/Ci1pbnN0YWxsZWQ9JGluc3RhbGxlZAotCi0jIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPwotc2hvdWxkbm90bGluaz0kbW9kdWxlCi0KLSMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgotZGxvcGVuPSckZGxmaWxlcycKLWRscHJlb3Blbj0nJGRscHJlZmlsZXMnCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJyIKLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm8gJiYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IHllczsgdGhlbgotCSAgICAkZWNobyA+PiAkb3V0cHV0ICJcCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgotCSAgZmkKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCi0gICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgotICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgotICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKScgfHwgZXhpdCAkPwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgOzsKLQotICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCi0gIGluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKLQotICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAotICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgotICAgICAgICRlY2hvICJYJG5vbm9wdCIgfCBncmVwIHNodG9vbCA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlhcmc9IlwiJGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0gICAgICBpbnN0YWxsX3Byb2c9IiRhcmcgIgotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgaW5zdGFsbF9wcm9nPQotICAgICAgYXJnPSRub25vcHQKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAkYXJnIGluCi0gICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0gICAgICBhcmc9IlwiJGFyZ1wiIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9bm8KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKLQlkZXN0PSRhcmcKLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikgCi0gICAgICAJY2FzZSAiICRpbnN0YWxsX3Byb2cgIiBpbgotCSpbXFxcIC9dY3BcICopIDs7Ci0JKikgcHJldj0kYXJnIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAtZyB8IC1tIHwgLW8pIHByZXY9JGFyZyA7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKQotCTs7Ci0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVzdD0kYXJnCi0JICBjb250aW51ZQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KLSAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCi0gICAgICBlbHNlCi0JJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KLSAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXMKLSAgICAgIGlmIHRlc3QgIiQjIiAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICBmaQotICAgIGNhc2UgJGRlc3RkaXIgaW4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0gICAgKikKLSAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQljYXNlICRmaWxlIGluCi0JKi5sbykgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIHN0YXRpY2xpYnM9Ci0gICAgZnV0dXJlX2xpYmRpcnM9Ci0gICAgY3VycmVudF9saWJkaXJzPQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQotICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouJGxpYmV4dCkKLQkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCXJlbGlua19jb21tYW5kPQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgJGZpbGUgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLwotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9Ci0JZGlyPSIkZGlyJG9iamRpciIKLQotCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCi0JICBpbnN0X3ByZWZpeF9kaXI9YCRlY2hvICIkZGVzdGRpciIgfCAkU0VEICJzJSRsaWJkaXJcJCUlImAKLQotCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAotCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KLQkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0Ci0JICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCi0JICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KLQkgIGlmIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGluc3RhbGwgXGAkZmlsZScgdG8gYSBkaXJlY3Rvcnkgbm90IGVuZGluZyBpbiAkbGliZGlyIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAotCSAgZWxzZQotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAotCSAgZmkKLQotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIiAxPiYyCi0JICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgotCSAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgIGVsc2UKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQlmaQotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMiIKLQkgIHNoaWZ0Ci0JICBzaGlmdAotCi0JICBzcmNuYW1lPSIkcmVhbG5hbWUiCi0JICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCi0KLQkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgotCSAgICAkc2hvdyAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICAgJHJ1biBldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICBmaQotCi0JICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KLQkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KLQkgICAgIyBUcnkgYGxuIC1zZicgZmlyc3QsIGJlY2F1c2UgdGhlIGBsbicgYmluYXJ5IG1pZ2h0IGRlcGVuZCBvbgotCSAgICAjIHRoZSBzeW1saW5rIHdlIHJlcGxhY2UhICBTb2xhcmlzIC9iaW4vbG4gZG9lcyBub3QgdW5kZXJzdGFuZCAtZiwKLQkgICAgIyBzbyB3ZSBhbHNvIG5lZWQgdG8gdHJ5IHJtICYmIGxuIC1zLgotCSAgICBmb3IgbGlua25hbWUKLQkgICAgZG8KLQkgICAgICBpZiB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiOyB0aGVuCi0gICAgICAgICAgICAgICAgJHNob3cgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgotICAgICAgICAgICAgICAgICRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCi0JICBjbWRzPSRwb3N0aW5zdGFsbF9jbWRzCi0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBldmFsIGNtZD1cIiRjbWRcIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCB7Ci0JICAgICAgbHRfZXhpdD0kPwotCi0JICAgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0Ci0JICAgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JCSRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJwotCSAgICAgIGZpCi0KLQkgICAgICBleGl0ICRsdF9leGl0Ci0JICAgIH0KLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0KLQkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KLQluYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQotCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/Ci0KLQkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCi0JdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgotCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAkZGVzdGZpbGUgaW4KLQkqLmxvKQotCSAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIDs7Ci0JKi4kb2JqZXh0KQotCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgotCSAgZGVzdGZpbGU9Ci0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCWZpCi0KLQkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KLQlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCSAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/Ci0JZmkKLQlleGl0ICRFWElUX1NVQ0NFU1MKLQk7OwotCi0gICAgICAqKQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIGFuZCB0aGVyZSBpcyBhIC5leGUgb24gdGhlIGVuZCwgc3RyaXAgaXQKLQkjIGJlY2F1c2UgaXQgaXMgbW9zdCBsaWtlbHkgYSBsaWJ0b29sIHNjcmlwdCB3ZSBhY3R1YWxseSB3YW50IHRvCi0JIyBpbnN0YWxsCi0Jc3RyaXBwZWRfZXh0PSIiCi0JY2FzZSAkZmlsZSBpbgotCSAgKi5leGUpCi0JICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JICAgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAotCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKLQkgICAgZmkKLQkgICAgOzsKLQllc2FjCi0KLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qfCptaW5ndyopCi0JICAgIHdyYXBwZXI9YCRlY2hvICRmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAotCSAgICA7OwotCSopCi0JICAgIHdyYXBwZXI9JGZpbGUKLQkgICAgOzsKLQllc2FjCi0JaWYgKCR7U0VEfSAtZSAnNHEnICR3cmFwcGVyIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKT4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgbm90aW5zdF9kZXBsaWJzPQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0KLQkgICMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bwotCSAgIyBmb28gZXZlbiBpZiBib3RoIGZvbyBhbmQgRklMRS5leGUgZXhpc3Q6IGF1dG9tYXRpYy1hcHBlbmQtLmV4ZQotCSAgIyBiZWhhdmlvciBoYXBwZW5zIG9ubHkgZm9yIGV4ZWMoMyksIG5vdCBmb3Igb3BlbigyKSEgIEFsc28sIHNvdXJjaW5nCi0JICAjIGBGSUxFLicgZG9lcyBub3Qgd29yayBvbiBjeWd3aW4gbWFuYWdlZCBtb3VudHMuCi0JICAjCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJHdyYXBwZXIgaW4KLQkgICovKiB8ICpcXCopIC4gJHt3cmFwcGVyfSA7OwotCSAgKikgLiAuLyR7d3JhcHBlcn0gOzsKLQkgIGVzYWMKLQotCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCi0JICBpZiB0ZXN0IC16ICIkbm90aW5zdF9kZXBsaWJzIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCi0JICBmaW5hbGl6ZT15ZXMKLQkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICAgICAgY2FzZSAkbGliIGluCi0JICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JICAgICAgKikgLiAuLyRsaWIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZmluYWxpemU9bm8KLQkgICAgZmkKLQkgIGRvbmUKLQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KLQkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKLQkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZwotCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgotCSAgIwotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICR3cmFwcGVyIGluCi0JICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKLQkgICopIC4gLi8ke3dyYXBwZXJ9IDs7Ci0JICBlc2FjCi0KLQkgIG91dHB1dG5hbWU9Ci0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllcyAmJiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAgIHRtcGRpcj0iL3RtcCIKLQkgICAgICB0ZXN0IC1uICIkVE1QRElSIiAmJiB0bXBkaXI9IiRUTVBESVIiCi0JICAgICAgdG1wZGlyPSIkdG1wZGlyL2xpYnRvb2wtJCQiCi0JICAgICAgc2F2ZV91bWFzaz1gdW1hc2tgCi0JICAgICAgdW1hc2sgMDA3NwotCSAgICAgIGlmICRta2RpciAiJHRtcGRpciI7IHRoZW4KLQkgICAgICAgIHVtYXNrICRzYXZlX3VtYXNrCi0JICAgICAgZWxzZQotCSAgICAgICAgdW1hc2sgJHNhdmVfdW1hc2sKLQkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCR0bXBkaXInIiAxPiYyCi0JCWNvbnRpbnVlCi0JICAgICAgZmkKLQkgICAgICBmaWxlPWAkZWNobyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCi0JICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCi0KLQkgICAgICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgotCSAgICAgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICAgICAgZWxzZQotCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKLQkJJHtybX1yICIkdG1wZGlyIgotCQljb250aW51ZQotCSAgICAgIGZpCi0JICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIiAxPiYyCi0JICAgIGZpCi0JICBlbHNlCi0JICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KLQkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCi0JICBmaQotCWZpCi0KLQkjIHJlbW92ZSAuZXhlIHNpbmNlIGN5Z3dpbiAvdXNyL2Jpbi9pbnN0YWxsIHdpbGwgYXBwZW5kIGFub3RoZXIKLQkjIG9uZSBhbnl3YXkgCi0JY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCi0JKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQotCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KLQkgICouZXhlOiouZXhlKQotCSAgICAjIHRoaXMgaXMgb2sKLQkgICAgOzsKLQkgICouZXhlOiopCi0JICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKLQkgICAgOzsKLQkgICo6Ki5leGUpCi0JICAgIGRlc3RmaWxlPWAkZWNobyAkZGVzdGZpbGUgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLCdgCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQkkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0ZmlsZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQl0ZXN0IC1uICIkb3V0cHV0bmFtZSIgJiYgJHtybX1yICIkdG1wZGlyIgotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KLSAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCi0KLSAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCi0gICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgotCSRzaG93ICIkb2xkX3N0cmlwbGliICRvbGRsaWIiCi0JJHJ1biBldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiIHx8IGV4aXQgJD8KLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLSAgICAgIGNtZHM9JG9sZF9wb3N0aW5zdGFsbF9jbWRzCi0gICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JZXZhbCBjbWQ9XCIkY21kXCIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KLSAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCi0gICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCi0gICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCi0gICAgZWxzZQotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCBmaW5pc2ggbW9kZQotICBmaW5pc2gpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgotICAgIGxpYmRpcnM9IiRub25vcHQiCi0gICAgYWRtaW5jbWRzPQotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0JbGliZGlycz0iJGxpYmRpcnMgJGRpciIKLSAgICAgIGRvbmUKLQotICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLQlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgotCSAgY21kcz0kZmluaXNoX2NtZHMKLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWQiCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KLQkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCi0JICAkcnVuIGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kcyIKLQlmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KLSAgICB0ZXN0ICIkc2hvdyIgPSA6ICYmIGV4aXQgJEVYSVRfU1VDQ0VTUwotCi0gICAgJGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgJGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgJGVjaG8gIiAgICRsaWJkaXIiCi0gICAgZG9uZQotICAgICRlY2hvCi0gICAgJGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgotICAgICRlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKLSAgICAkZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKLSAgICAkZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgJGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICAkZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgJGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgJGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGxpYmRpcj1MSUJESVIKLSAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgJGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgJGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgotICAgIGZpCi0gICAgJGVjaG8KLSAgICAkZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCi0gICAgJGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgotICAgICRlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQotICBleGVjdXRlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCi0KLSAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgotICAgIGNtZD0iJG5vbm9wdCIKLSAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgotICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCi0gICAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgIGRpcj0KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgotCWRsbmFtZT0KLQlsaWJyYXJ5X25hbWVzPQotCi0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAkZmlsZSBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkqKSAuIC4vJGZpbGUgOzsKLQllc2FjCi0KLQkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KLQlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgotCSAgY29udGludWUKLQlmaQotCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQotCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCTs7Ci0KLSAgICAgICopCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZyBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgotICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgotCi0gICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgotICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCi0gICAgICBlbHNlCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgotICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKLQotICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KLSAgICBhcmdzPQotICAgIGZvciBmaWxlCi0gICAgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgIC0qKSA7OwotICAgICAgKikKLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JaWYgKCR7U0VEfSAtZSAnNHEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgotCWV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgIGZpCi0KLSAgICAgICMgUmVzdG9yZSBzYXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQ19BTEw9IiRzYXZlX0xDX0FMTCI7IGV4cG9ydCBMQ19BTEwKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTEFORytzZXR9IiA9IHNldDsgdGhlbgotCUxBTkc9IiRzYXZlX0xBTkciOyBleHBvcnQgTEFORwotICAgICAgZmkKLQotICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgotICAgICAgZXhlY19jbWQ9IlwkY21kJGFyZ3MiCi0gICAgZWxzZQotICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCWV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCi0JJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCBjbGVhbiBhbmQgdW5pbnN0YWxsIG1vZGUKLSAgY2xlYW4gfCB1bmluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogJG1vZGUiCi0gICAgcm09IiRub25vcHQiCi0gICAgZmlsZXM9Ci0gICAgcm1mb3JjZT0KLSAgICBleGl0X3N0YXR1cz0wCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtZikgcm09IiRybSAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKLSAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7Ci0gICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJtIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBybWRpcnM9Ci0KLSAgICBvcmlnb2JqZGlyPSIkb2JqZGlyIgotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSI7IHRoZW4KLQlkaXI9LgotCW9iamRpcj0iJG9yaWdvYmpkaXIiCi0gICAgICBlbHNlCi0Jb2JqZGlyPSIkZGlyLyRvcmlnb2JqZGlyIgotICAgICAgZmkKLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbCAmJiBvYmpkaXI9IiRkaXIiCi0KLSAgICAgICMgUmVtZW1iZXIgb2JqZGlyIGZvciByZW1vdmFsIGxhdGVyLCBiZWluZyBjYXJlZnVsIHRvIGF2b2lkIGR1cGxpY2F0ZXMKLSAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB0aGVuCi0JY2FzZSAiICRybWRpcnMgIiBpbgotCSAgKiIgJG9iamRpciAiKikgOzsKLQkgICopIHJtZGlycz0iJHJtZGlycyAkb2JqZGlyIiA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCi0gICAgICBpZiAodGVzdCAtTCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAotCXx8ICh0ZXN0IC1oICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCi0JfHwgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JOgotICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KLQlleGl0X3N0YXR1cz0xCi0JY29udGludWUKLSAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIHJtZmlsZXM9IiRmaWxlIgotCi0gICAgICBjYXNlICRuYW1lIGluCi0gICAgICAqLmxhKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgLiAkZGlyLyRuYW1lCi0KLQkgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCi0JICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbiIKLQkgIGRvbmUKLQkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICB0ZXN0ICIkbW9kZSIgPSBjbGVhbiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfWkiCi0KLQkgIGlmIHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbDsgdGhlbgotCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgICBjbWRzPSRwb3N0dW5pbnN0YWxsX2NtZHMKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIKLQkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KLQkJICBleGl0X3N0YXR1cz0xCi0JCWZpCi0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgICAgY21kcz0kb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQlldmFsIGNtZD1cIiRjbWRcIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIgotCQlpZiB0ZXN0ICIkPyIgLW5lIDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgotCQkgIGV4aXRfc3RhdHVzPTEKLQkJZmkKLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0JICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgLiAkZGlyLyRuYW1lCi0KLQkgICMgQWRkIFBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgotCSAgaWYgdGVzdCAtbiAiJHBpY19vYmplY3QiIFwKLQkgICAgICYmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCi0JICBmaQotCi0JICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiIFwKLQkgICAgICYmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRub25fcGljX29iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqKQotCWlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuIDsgdGhlbgotCSAgbm9leGVuYW1lPSRuYW1lCi0JICBjYXNlICRmaWxlIGluCi0JICAqLmV4ZSkKLQkgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAotCSAgICBub2V4ZW5hbWU9YCRlY2hvICRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AKLQkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAotCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCi0JICAgIDs7Ci0JICBlc2FjCi0JICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KLQkgIGlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPQotCSAgICAuICRkaXIvJG5vZXhlbmFtZQotCi0JICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5Ci0JICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCi0JICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCi0JICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgJHNob3cgIiRybSAkcm1maWxlcyIKLSAgICAgICRydW4gJHJtICRybWZpbGVzIHx8IGV4aXRfc3RhdHVzPTEKLSAgICBkb25lCi0gICAgb2JqZGlyPSIkb3JpZ29iamRpciIKLQotICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcwotICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KLSAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JJHNob3cgInJtZGlyICRkaXIiCi0JJHJ1biBybWRpciAkZGlyID4vZGV2L251bGwgMj4mMQotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBleGl0ICRleGl0X3N0YXR1cwotICAgIDs7Ci0KLSAgIiIpCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC16ICIkZXhlY19jbWQiOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIGZpCi1maSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCi0KLWlmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KLSAgZXZhbCBleGVjICRleGVjX2NtZAotICBleGl0ICRFWElUX0ZBSUxVUkUKLWZpCi0KLSMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgotY2FzZSAkbW9kZSBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLQotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0KLSAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLS1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcwotICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJwotICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KLSAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tdGFnPVRBRyAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKLSAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0KLU1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgY2xlYW4gICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQotCi1NT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKLWEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgotICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgOzsKLQotY2xlYW4pCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKLXdpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotY29tcGlsZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKLQotQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKLSAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKLSAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5Ci0gIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCi0KLUNPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCi1mcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgotCi1UaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KLVNPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQotbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgotICA7OwotCi1leGVjdXRlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgotCi1BdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKLQotVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJwotZmxhZ3MuCi0KLUlmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKLWludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQotZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCi0KLVRoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgotICA7OwotCi1maW5pc2gpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KLQotQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KLQotRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KLQotVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCi10aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKLSAgOzsKLQotaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCi0KLUluc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgotCi1JTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKLWVpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgotCi1UaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQotQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCi0gIDs7Ci0KLWxpbmspCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgotCi1MaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCi1jcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgotCi1MSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKLWEgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKLQotICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKLSAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCi0gIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQotICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scwotICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQotICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCi0gIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCi0gIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCi0gIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQotICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKLSAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCi0gIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCi0gIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAotICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCi0gIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCi0gIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKLSAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKLSAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KLQkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAotb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcwotcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCi11c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKLWlzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCi0gIDs7Ci0KLXVuaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KLU90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotKikKLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIDs7Ci1lc2FjCi0KLSRlY2hvCi0kZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgotCi1leGl0ICQ/Ci0KLSMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCi0jIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZwotIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKLSMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCi0jIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAotIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAotIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCi0jIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCi0jIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5Ci0jIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KLQotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotYnVpbGRfbGlidG9vbF9saWJzPW5vCi1idWlsZF9vbGRfbGlicz15ZXMKLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKLWJ1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSAkZWNobyBubzs7ICopICRlY2hvIHllczs7IGVzYWNgCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYwotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9taXNzaW5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlZjgzYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0KLXNjcmlwdHZlcnNpb249MjAwMy0wOS0wMi4yMwotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMyAKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotIyAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1ydW49OgotCi0jIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCi0jIHNyY2RpciBhbHJlYWR5LgotaWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYwotZWxzZQotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCi1maQotCi1tc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCi0KLWNhc2UgIiQxIiBpbgotLS1ydW4pCi0gICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KLSAgcnVuPQotICBzaGlmdAotICAiJEAiICYmIGV4aXQgMAotICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCi0gICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KLSAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQotICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCi0gICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgotICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KLSAgICBydW49OgotICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKLSMgdHJ5IHRvIGVtdWxhdGUgaXQuCi1jYXNlICIkMSIgaW4KLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKLQotU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgotICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCi0gIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwotICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJwotICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCi0gIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLSAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLQotU2VuZCBidWcgcmVwb3J0cyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgYWNsb2NhbCopCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KLSAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBhY2xvY2FsLm00Ci0gICAgOzsKLQotICBhdXRvY29uZikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCi0gICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBjb25maWd1cmUKLSAgICA7OwotCi0gIGF1dG9oZWFkZXIpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCi0gICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAotICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgotICAgIHRvdWNoX2ZpbGVzPQotICAgIGZvciBmIGluICRmaWxlczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBhdXRvbTR0ZSkKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCi0gICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiIyEgL2Jpbi9zaCIKLQllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKLQllY2hvICIjICAkICRAIgotCWVjaG8gImV4aXQgMCIKLQljaG1vZCAreCAkZmlsZQotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBiaXNvbnx5YWNjKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYwotCSAgICBmaQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYwotICAgIGZpCi0gICAgOzsKLQotICBsZXh8ZmxleCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIGxleC55eS5jCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBoZWxwMm1hbikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCi0JIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQotCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAotICAgIGZpCi0gICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAobWFrZWluZm8gLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIG1ha2VpbmZvLCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLSAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKLSAgICBmaQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICB0YXIpCi0gICAgc2hpZnQKLSAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgotICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgotICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgotICAgICMgbWVzc2FnZXMuCi0gICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGZpcnN0YXJnPSIkMSIKLSAgICBpZiBzaGlmdDsgdGhlbgotCWNhc2UgIiRmaXJzdGFyZyIgaW4KLQkqbyopCi0JICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAotCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKLQkgICAgOzsKLQllc2FjCi0JY2FzZSAiJGZpcnN0YXJnIiBpbgotCSpoKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCi0gICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9wbHVnaW4ucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFlMDhlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBQcm94eSBQcm90b2NvbCBMaWJyYXJ5Ci1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5LmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMWIyYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHkuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYgLyogX19nbnVfbGludXhfXyAqLwotCi0vKgotICogTWlzY2VsbGFuZW91cyBwcm94eSBmdW5jdGlvbnMuCi0gKi8KLSAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAicHJveHkuaCIKLQotc3RhdGljIGludCAJCQlwcm94eV9lcnJubyA9IFBST1hZX1JFU19PSzsKLXN0YXRpYyBjaGFyICoJCXByb3h5X2VycnN0ciA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICogcHJveHlfZXJyb3JfdGFiW10gPSB7Ci0JIlByb3h5IGNsaWVudCBlcnJvcjogJXMiLAotCSJQcm94eSBzZXJ2ZXIgZXJyb3I6ICVzIiwKLQkiRXJyb3Igd2l0aCBwcm94eSBwcm90b2NvbDogJXMiLAotCSJTeXN0ZW0gZXJyb3I6ICVzIiwKLQkiJXMiCi19OwotCi1pbnQKLWZpbmRfcHJveHkoY2hhciAqbmFtZSwgcHJveHkgKipwcCkKLXsKLQlwcm94eSAqcDsKLQkKLQlmb3IgKHAgPSBwcm94aWVzOyBwLT5uYW1lICE9IE5VTEw7IHArKykgewotCQlpZiAoc3RyY21wKHAtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCSpwcCA9IHA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLQotLyoKLSAqIEVycm9yIGhhbmRsaW5nCi0gKi8KLXZvaWQKLXByb3h5X3NldF9lcnJvcihpbnQgZXJybnVtLCBjaGFyICptc2cpCi17Ci0JcHJveHlfZXJybm8gPSBlcnJudW07Ci0JCi0JaWYgKHByb3h5X2VycnN0ciAhPSBOVUxMKSB7Ci0JCWZyZWUocHJveHlfZXJyc3RyKTsKLQkJcHJveHlfZXJyc3RyID0gTlVMTDsKLQl9Ci0JCi0JaWYgKHByb3h5X2Vycm5vID49IHNpemVvZihwcm94eV9lcnJvcl90YWIpL3NpemVvZihjaGFyICopKSB7Ci0JCWlmIChtc2cgIT0gTlVMTCkgewotCQkJcHJveHlfZXJyc3RyID0gc3RyZHVwKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3ByaW50ZigmcHJveHlfZXJyc3RyLCAiRXJyb3IgJWQgb2NjdXJyZWQuIiwgcHJveHlfZXJybm8pOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKG1zZyA9PSBOVUxMKQotCQkJbXNnID0gIjxudWxsPiI7Ci0JCQkKLQkJYXNwcmludGYoJnByb3h5X2VycnN0ciwgcHJveHlfZXJyb3JfdGFiW3Byb3h5X2Vycm5vXSwgbXNnKTsKLQl9Ci19Ci0KLWludAotcHJveHlfZ2V0X2Vycm9yKHZvaWQpCi17Ci0JcmV0dXJuIHByb3h5X2Vycm5vOwotfQotCi1jaGFyICoKLXByb3h5X2dldF9lcnJvcl9zdHIodm9pZCkKLXsKLQlpZiAocHJveHlfZXJyc3RyID09IE5VTEwpCi0JCXJldHVybiAiIjsKLQkJCi0JcmV0dXJuIHByb3h5X2VycnN0cjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9hdHRyLmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfYXR0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTdhZGVhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9hdHRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgInByb3h5X2F0dHIuaCIKLQotLyoKLSAqIFRlc3QgaWYgdGhpcyBhdHRyaWJ1dGUgc3RyaW5nIGhhcyBtYXRjaGluZyBrZXkuIEFsc28gdGVzdHMKLSAqIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIHN0cmluZyBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5LgotICovCi1pbnQKLXByb3h5X3Rlc3RfYXR0cmlidXRlKGNoYXIgKmtleSwgY2hhciAqYXR0cl9zdHIpCi17Ci0JaW50IGxlbiA9IHN0cmxlbihrZXkpOwotCQotCS8qCi0JICogQXR0cmlidXRlIHN0cmluZyBtdXN0IGJlIGF0IGxlYXN0IHRoZSBsZW5ndGggb2Yga2V5ICsgMSBjaGFyYWN0ZXJzIGxvbmcuCi0JICovCi0JaWYgKHN0cmxlbihhdHRyX3N0cikgPD0gbGVuKSAKLQkJcmV0dXJuIDA7Ci0JCi0JLyoKLQkgKiBBdHRyaWJ1dGUgc3RyaW5nIG11c3QgaGF2ZSAnPScgc2VwYXJhdGluZyBrZXkgYW5kIHZhbHVlLgotCSAqLwotCWlmIChhdHRyX3N0cltsZW5dICE9ICc9JykgCi0JCXJldHVybiAwOwotCQotCS8qCi0JICogS2V5IG11c3QgbWF0Y2guCi0JICovCi0JcmV0dXJuIHN0cm5jbXAoYXR0cl9zdHIsIGtleSwgbGVuKSA9PSAwOwotfQotCi0vKgotICogUmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhIHN0cmluZy4gSWYgd2UgaGF2ZSB0ZXN0ZWQgZm9yIHRoZSBhdHRyaWJ1dGUga2V5Ci0gKiBiZWZvcmUgY2FsbGluZyB0aGlzLCB0aGVuIGl0IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLU5VTEwgc3RyaW5nLgotICovCi1jaGFyICoKLXByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGNoYXIgKmF0dHJfc3RyKQotewotCWNoYXIgKglzID0gc3RyY2hyKGF0dHJfc3RyLCAnPScpOwotCQotCWlmIChzICE9IE5VTEwpIHsKLQkJcmV0dXJuIHMgKyAxOwotCX0KLQkKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIFJldHVybiBhdHRyaWJ1dGUgdmFsdWUgYXMgYW4gaW50LiBNYXkgcmV0dXJuIGEgbWlzbGVhZGluZyB2YWx1ZSBpZiBhdHRyaWJ1dGUKLSAqIHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyLgotICovCi1pbnQKLXByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfaW50KGNoYXIgKmF0dHJfc3RyKQotewotCWNoYXIgKglzID0gc3RyY2hyKGF0dHJfc3RyLCAnPScpOwotCQotCWlmIChzICE9IE5VTEwpIHsKLQkJcmV0dXJuIHN0cnRvbChzICsgMSwgTlVMTCwgMTApOwotCX0KLQkKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJldHVybiBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBib29sZWFuLiBSZXR1cm5zIGZhbHNlIGlmIHRoZQotICogYXR0cmlidXRlIHZhbHVlIGlzIG5vdCB0aGUgKGNhc2UgaW5zZW5zaXRpdmUpIHN0cmluZyAidHJ1ZSIuCi0gKi8KLWludAotcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9ib29sKGNoYXIgKmF0dHJfc3RyKQotewotCWNoYXIgKglzID0gc3RyY2hyKGF0dHJfc3RyLCAnPScpOwotCQotCWlmIChzICE9IE5VTEwpIHsKLQkJcmV0dXJuIHN0cmNhc2VjbXAocyArIDEsICJ0cnVlIikgPT0gMDsKLQl9Ci0JCi0JcmV0dXJuIDA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X2NsbnQuYyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9jbG50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzU5MGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X2NsbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBNaXNjZWxsYW5lb3VzIHByb3h5IGZ1bmN0aW9ucy4KLSAqLwotIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X3RjcC5oIgotIAotcHJveHkgcHJveGllc1tdID0gewotCXsidGNwIiwgTlVMTCwgJnByb3h5X3RjcF9jbG50X2Z1bmNzLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0KLX07Ci0KLWludCAKLXByb3h5X2NsbnRfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCwgcHJveHlfY2xudF9oZWxwZXJfZnVuY3MgKmNmLCBwcm94eV9jbG50ICoqY2xudCwgY2hhciAqYXR0ciwgdmFfbGlzdCBhcCkKLXsKLQlwcm94eSAqCQlwOwotCXByb3h5X2NsbnQgKglwYzsKLQl2b2lkICoJCWRhdGE7Ci0JCi0JaWYgKGZpbmRfcHJveHkobmFtZSwgJnApIDwgMCkKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JCQotCXBjID0gKHByb3h5X2NsbnQgKiltYWxsb2Moc2l6ZW9mKHByb3h5X2NsbnQpKTsKLQlwYy0+cHJveHkgPSBwOwotCXBjLT5jbG50X2hlbHBlcl9mdW5jcyA9IGNmOwotCXBjLT5jbG50X3RpbWVvdXQgPSBOVUxMOwotCi0JaWYgKHRpbWVvdXQgIT0gTlVMTCkgewotCQlwYy0+Y2xudF90aW1lb3V0ID0gKHN0cnVjdCB0aW1ldmFsICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCQltZW1jcHkocGMtPmNsbnRfdGltZW91dCwgdGltZW91dCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7Ci0JfQotCQotCWlmIChwLT5jbG50X2Z1bmNzLT5pbml0KHBjLCAmZGF0YSwgYXR0ciwgYXApIDwgMCkgewotCQlmcmVlKHBjKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0JcGMtPmNsbnRfZGF0YSA9IGRhdGE7Ci0JcGMtPmNsbnRfZXZlbnRzID0gTmV3TGlzdCgpOwotCQotCSpjbG50ID0gcGM7Ci0JCi0JcmV0dXJuIFBST1hZX1JFU19PSzsJCi19Ci0KLWludCAKLXByb3h5X2NsbnRfY29ubmVjdChwcm94eV9jbG50ICpwYykKLXsKLQlpZiAocGMgIT0gTlVMTCkKLQkJcmV0dXJuIHBjLT5wcm94eS0+Y2xudF9mdW5jcy0+Y29ubmVjdChwYyk7Ci0JCQotCXJldHVybiBQUk9YWV9SRVNfRVJSOwotfQotCi1pbnQgCi1wcm94eV9jbG50X2NyZWF0ZShwcm94eV9jbG50ICpwYykKLXsKLQlpZiAocGMgIT0gTlVMTCkKLQkJcmV0dXJuIHBjLT5wcm94eS0+Y2xudF9mdW5jcy0+Y3JlYXRlKHBjKTsKLQkJCi0JcmV0dXJuIFBST1hZX1JFU19FUlI7Ci19Ci0KLWludAotcHJveHlfY2xudF9wcm9ncmVzcyhwcm94eV9jbG50ICpwYykKLXsKLQlpZiAocGMgIT0gTlVMTCkKLQkJcmV0dXJuIHBjLT5wcm94eS0+Y2xudF9mdW5jcy0+cHJvZ3Jlc3MocGMpOwotCQkKLQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLX0KLQotdm9pZAotcHJveHlfY2xudF9xdWV1ZV9tc2cocHJveHlfY2xudCAqcGMsIHByb3h5X21zZyAqbSkKLXsKLQlwcm94eV9xdWV1ZV9tc2cocGMtPmNsbnRfZXZlbnRzLCBtKTsKLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X2V2ZW50LmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlMTE0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVXRpbGl0eSByb3V0aW5lcyBmb3IgY29uc3RydWN0aW5nIGFuZCBzZW5kaW5nIHByb3h5IHJ1bnRpbWUgZXZlbnRzLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIGRlZmluZSB0aGUgZm9ybWF0IG9mIHJ1bnRpbWUgZXZlbnRzIGZvciBjb21tdW5pY2F0aW9uIHdpdGgKLSAqIHJ1bnRpbWUgcHJveHkgY2xpZW50cy4KLSAqCi0gKiBTZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLkFic3RyYWN0UHJveHlSdW50aW1lU3lzdGVtIGZvciBhIGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgcHJvdG9jb2wgZm9ybWF0LgotICovCi0KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYgLyogX19nbnVfbGludXhfXyAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicHJveHkuaCIKLSNpbmNsdWRlICJwcm94eV9tc2cuaCIKLSNpbmNsdWRlICJhcmdzLmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotCi0vKgotICogQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBhbiBleGlzdGluZyBldmVudC4KLSAqLwotdm9pZAotcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUocHJveHlfbXNnICptLCBjaGFyICphdHRyLCBjaGFyICp2YWx1ZSkKLXsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgYXR0ciwgdmFsdWUpOwotfQotCi0vKgotICogQWRkIGFuIGludGVnZXIgYXR0cmlidXRlIHRvIGFuIGV4aXN0aW5nIGV2ZW50LgotICovCi12b2lkCi1wcm94eV9hZGRfaW50X2F0dHJpYnV0ZShwcm94eV9tc2cgKm0sIGNoYXIgKmF0dHIsIGludCB2YWx1ZSkKLXsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9pbnQobSwgYXR0ciwgdmFsdWUpOwotfQotCi0vKgotICogT0sgRVZFTlQuIFNlbnQgaW4gcmVzcG9uc2UgdG8gYSBzdWNlc3NmdWxseQotICogY29tcGxldGVkIGNvbW1hbmQuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV9va19ldmVudChpbnQgdHJhbnNfaWQpCi17Ci0gCXJldHVybiBuZXdfcHJveHlfbXNnKFBST1hZX0VWX09LLCB0cmFuc19pZCk7Ci19Ci0KLS8qCi0gKiBTSFVURE9XTiBFVkVOVC4gU2VudCBpbiByZXNwb25zZSB0byBhIHF1aXQgY29tbWFuZC4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X3NodXRkb3duX2V2ZW50KGludCB0cmFuc19pZCkKLXsKLSAJcmV0dXJuIG5ld19wcm94eV9tc2coUFJPWFlfRVZfU0hVVERPV04sIHRyYW5zX2lkKTsKLX0KLQotLyoKLSAqIE1FU1NBR0UgRVZFTlQuIFVzZWQgZm9yIHNlbmRpbmcgbWVzc2FnZXMgdGhhdAotICogc2hvdWxkIGJlIGxvZ2dlZCBieSB0aGUgY2xpZW50LgotICovCi1wcm94eV9tc2cgKgotcHJveHlfbWVzc2FnZV9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmxldmVsLCBpbnQgY29kZSwgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdAkJYXA7Ci0JY2hhciAqCQltc2c7Ci0JcHJveHlfbXNnICoJbSA9IG5ld19wcm94eV9tc2coUFJPWFlfRVZfTUVTU0FHRSwgdHJhbnNfaWQpOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JdmFzcHJpbnRmKCZtc2csIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlwcm94eV9tc2dfYWRkX2ludChtLCAzKTsgLyogMyBhdHRyaWJ1dGVzICovCi0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIE1TR19MRVZFTF9BVFRSLCBsZXZlbCk7Ci0JcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KG0sIE1TR19DT0RFX0FUVFIsIGNvZGUpOwotCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBNU0dfVEVYVF9BVFRSLCBtc2cpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBFUlJPUiBFVkVOVC4gR2VuZXJhbCBlcnJvciBldmVudCB0aGF0IHNob3VsZCBiZSBzZW50IHRvCi0gKiBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uIE5PVEU6IGNvbW1hbmQgZXJyb3JzIHNob3VsZAotICogdXNlIHRoZSBzcGVjaWZpYyBlcnJvciBldmVudHMgYmVsb3cuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV9lcnJvcl9ldmVudChpbnQgdHJhbnNfaWQsIGludCBjb2RlLCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0CQlhcDsKLQljaGFyICoJCW1zZzsKLQlwcm94eV9tc2cgKgltID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9FUlJPUiwgdHJhbnNfaWQpOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JdmFzcHJpbnRmKCZtc2csIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlwcm94eV9tc2dfYWRkX2ludChtLCAyKTsgLyogMiBhdHRyaWJ1dGVzICovCi0JcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KG0sIEVSUk9SX0NPREVfQVRUUiwgY29kZSk7Ci0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIEVSUk9SX01TR19BVFRSLCBtc2cpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBTVUJNSVRKT0IgRVJST1IgRVZFTlQuIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3Igd2hlbiBhdHRlbXB0aW5nCi0gKiB0byBzdWJtaXQgYSBqb2IuIFRoZSBqb2JTdWJJZCBhcmd1bWVudCBpcyB0aGUgam9iIHN1Ym1pc3Npb24gSUQKLSAqIHRoYXQgd2FzIHNwZWNpZmllZCB0byB0aGUgc3VibWl0Sm9iIGNvbW1hbmQuIFRoaXMgZXZlbnQgc2hvdWxkCi0gKiBiZSB1c2VkIHRvIGluZGljYXRlIHN1Ym1pc3Npb24gZXJyb3JzIGFzIHNvb24gYXMgdGhlIGpvYiBzdWJtaXNzaW9uCi0gKiBpZCBoYXMgYmVlbiBvYnRhaW5lZC4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X3N1Ym1pdGpvYl9lcnJvcl9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmpvYlN1YklkLCBpbnQgY29kZSwgY2hhciAqbXNnKQotewotCXByb3h5X21zZyAqCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX1NVQk1JVEpPQl9FUlJPUiwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9pbnQobSwgMyk7IC8qIDMgYXR0cmlidXRlcyAqLwotCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBKT0JfU1VCX0lEX0FUVFIsIGpvYlN1YklkKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9pbnQobSwgRVJST1JfQ09ERV9BVFRSLCBjb2RlKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgRVJST1JfTVNHX0FUVFIsIG1zZyk7Ci0KLQlyZXR1cm4gbTsKLX0KLQotLyoKLSAqIFRFUk1JTkFURUpPQiBFUlJPUiBFVkVOVC4gVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciB3aGVuIGF0dGVtcHRpbmcKLSAqIHRvIHRlcm1pbmF0ZSBhIGpvYi4gVGhlIGpvYklkIGFyZ3VtZW50IGlzIHRoZSBqb2IgSUQKLSAqIHRoYXQgd2FzIHNwZWNpZmllZCB0byB0aGUgdGVybWluYXRlSm9iIGNvbW1hbmQuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV90ZXJtaW5hdGVqb2JfZXJyb3JfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpqb2JJZCwgaW50IGNvZGUsIGNoYXIgKm1zZykKLXsKLQlwcm94eV9tc2cgKgltID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9URVJNSU5BVEVKT0JfRVJST1IsIHRyYW5zX2lkKTsKLQotCXByb3h5X21zZ19hZGRfaW50KG0sIDMpOyAvKiAzIGF0dHJpYnV0ZXMgKi8KLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgSk9CX0lEX0FUVFIsIGpvYklkKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9pbnQobSwgRVJST1JfQ09ERV9BVFRSLCBjb2RlKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgRVJST1JfTVNHX0FUVFIsIG1zZyk7Ci0KLQlyZXR1cm4gbTsKLX0KLQotLyoKLSAqIEFUVFIgREVGIElOVCBFVkVOVC4gVXVzZWQgdG8gZGVmaW5lIGEgbmV3IElOVEVHRVIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQKLSAqIGluIHN1YnNlcXVlbnQgZXZlbnRzLgotICovCi1wcm94eV9tc2cgKgotcHJveHlfYXR0cl9kZWZfaW50X2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWQsIGNoYXIgKm5hbWUsIGNoYXIgKmRlc2MsIGludCBkaXNwLCBpbnQgZGVmKQotewotCXByb3h5X21zZyAqCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX0FUVFJfREVGLCB0cmFuc19pZCk7Ci0KLQlwcm94eV9tc2dfYWRkX2ludChtLCAxKTsgLyogMSBhdHRyaWJ1dGUgZGVmICovCi0JcHJveHlfbXNnX2FkZF9pbnQobSwgNSk7IC8qIDUgYXR0cmlidXRlcyAqLwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGlkKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCAiSU5URUdFUiIpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIG5hbWUpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGRlc2MpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGRpc3AgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCBkZWYpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBBVFRSIERFRiBTVFJJTkcgRVZFTlQuIFVzZWQgdG8gZGVmaW5lIGEgbmV3IFNUUklORyBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZAotICogaW4gc3Vic2VxdWVudCBldmVudHMuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV9hdHRyX2RlZl9zdHJpbmdfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICppZCwgY2hhciAqbmFtZSwgY2hhciAqZGVzYywgaW50IGRpc3AsIGNoYXIgKmRlZikKLXsKLQlwcm94eV9tc2cgKgltID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9BVFRSX0RFRiwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9pbnQobSwgMSk7IC8qIDEgYXR0cmlidXRlIGRlZiAqLwotCXByb3h5X21zZ19hZGRfaW50KG0sIDUpOyAvKiA1IGF0dHJpYnV0ZXMgKi8KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBpZCk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgIlNUUklORyIpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIG5hbWUpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGRlc2MpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGRpc3AgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBkZWYpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBORVcgTUFDSElORS4gVXNlZCB0byBkZWZpbmUgbmV3IG1hY2hpbmUgbW9kZWwgZWxlbWVudHMuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV9uZXdfbWFjaGluZV9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKnJtX2lkLCBjaGFyICptYWNoaW5lX2lkX3JhbmdlLCBjaGFyICpuYW1lLCBjaGFyICpzdGF0ZSkKLXsKLQlwcm94eV9tc2cgKgltID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9ORVdfTUFDSElORSwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgcm1faWQpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIDEpOyAvKiAxIG5ldyBtYWNoaW5lIHJhbmdlICovCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgbWFjaGluZV9pZF9yYW5nZSk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobSwgMik7IC8qIDIgYXR0cmlidXRlcyAqLwotCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBFTEVNRU5UX05BTUVfQVRUUiwgbmFtZSk7Ci0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIE1BQ0hJTkVfU1RBVEVfQVRUUiwgc3RhdGUpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBORVcgSk9CIEVWRU5ULiBVc2VkIHRvIGNyZWF0ZSBhIGpvYiBtb2RlbCBlbGVtZW50LiBKb2JzIGNhbiBlaXRoZXIgYmUgY3JlYXRlZCBpbgotICogcmVzcG9uc2UgdG8gYSBzdWJtaXRKb2IgY29tbWFuZCwgb3IgdG8gcmVwcmVzZW50IGV4aXN0aW5nIGpvYnMgaW4gYSBxdWV1ZSAoZm9yIGV4YW1wbGUpLgotICoKLSAqIE5ldyBqb2JzIGNyZWF0ZWQgaW4gcmVzcG9uc2UgdG8gYSBzdWJtaXRKb2IgZXZlbnQgKk1VU1QqIHByb3ZpZGUgdGhlIGpvYiBzdWJtaXNzaW9uIElELgotICovCi1wcm94eV9tc2cgKgotcHJveHlfbmV3X2pvYl9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKnF1ZXVlX2lkLCBjaGFyICpqb2JfaWRfcmFuZ2UsIGNoYXIgKm5hbWUsIGNoYXIgKnN0YXRlLCBjaGFyICpqb2JTdWJJZCkKLXsKLQlwcm94eV9tc2cgKgltID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9ORVdfSk9CLCB0cmFuc19pZCk7Ci0KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBxdWV1ZV9pZCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobSwgMSk7IC8qIDEgbmV3IGpvYiByYW5nZSAqLwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGpvYl9pZF9yYW5nZSk7Ci0KLQlpZiAoam9iU3ViSWQgIT0gTlVMTCkgewotCQlwcm94eV9tc2dfYWRkX2ludChtLCAzKTsgLyogMyBhdHRyaWJ1dGVzICovCi0JCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBKT0JfU1VCX0lEX0FUVFIsIGpvYlN1YklkKTsKLQl9IGVsc2UgewotCQlwcm94eV9tc2dfYWRkX2ludChtLCAyKTsgLyogMiBhdHRyaWJ1dGVzICovCi0JfQotCi0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIEVMRU1FTlRfTkFNRV9BVFRSLCBuYW1lKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgSk9CX1NUQVRFX0FUVFIsIHN0YXRlKTsKLQotCXJldHVybiBtOwotfQotCi0vKgotICogTkVXIE5PREUgRVZFTlQuIFVzZWQgdG8gY3JlYXRlIG5ldyBub2RlIG1vZGVsIGVsZW1lbnRzLgotICovCi1wcm94eV9tc2cgKgotcHJveHlfbmV3X25vZGVfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICptYWNoX2lkLCBpbnQgbnVtX25vZGVzKQotewotCXByb3h5X21zZyAqCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX05FV19OT0RFLCB0cmFuc19pZCk7Ci0KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBtYWNoX2lkKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCBudW1fbm9kZXMpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBBZGQgYSBub2RlIHRvIGEgbmV3IG5vZGUgZXZlbnQuCi0gKi8KLXZvaWQKLXByb3h5X2FkZF9ub2RlKHByb3h5X21zZyAqbSwgY2hhciAqbm9kZV9pZCwgY2hhciAqbmFtZSwgY2hhciAqc3RhdGUsIGludCBleHRyYV9hdHRycykKLXsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBub2RlX2lkKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCAyICsgZXh0cmFfYXR0cnMpOwotCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBFTEVNRU5UX05BTUVfQVRUUiwgbmFtZSk7Ci0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIE5PREVfU1RBVEVfQVRUUiwgc3RhdGUpOwotfQotCi0vKgotICogTkVXIFBST0NFU1MgRVZFTlQuIFVzZWQgdG8gY3JlYXRlIGEgbmV3IHByb2Nlc3MgbW9kZWwgZWxlbWVudC4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X25ld19wcm9jZXNzX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqam9iX2lkLCBpbnQgbnVtX3Byb2NzKQotewotCXByb3h5X21zZyAqCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX05FV19QUk9DRVNTLCB0cmFuc19pZCk7Ci0KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBqb2JfaWQpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG51bV9wcm9jcyk7Ci0KLQlyZXR1cm4gbTsKLX0KLQotdm9pZAotcHJveHlfYWRkX3Byb2Nlc3MocHJveHlfbXNnICptLCBjaGFyICpwcm9jX2lkLCBjaGFyICpuYW1lLCBjaGFyICpzdGF0ZSwgaW50IGV4dHJhX2F0dHJzKQotewotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIHByb2NfaWQpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIDIgKyBleHRyYV9hdHRycyk7Ci0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIEVMRU1FTlRfTkFNRV9BVFRSLCBuYW1lKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgUFJPQ19TVEFURV9BVFRSLCBzdGF0ZSk7Ci19Ci0KLS8qCi0gKiBORVcgUVVFVUUgRVZFTlQuIFVzZWQgdG8gY3JlYXRlIGEgbmV3IHF1ZXVlIG1vZGVsIGVsZW1lbnQuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV9uZXdfcXVldWVfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpybV9pZCwgY2hhciAqcXVldWVfaWQsIGNoYXIgKm5hbWUsIGNoYXIgKnN0YXRlKQotewotCXByb3h5X21zZyAqCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX05FV19RVUVVRSwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgcm1faWQpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIDEpOyAvKiAxIG5ldyBxdWV1ZSAqLwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIHF1ZXVlX2lkKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCAyKTsgLyogMiBhdHRyaWJ1dGVzICovCi0JcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKG0sIEVMRU1FTlRfTkFNRV9BVFRSLCBuYW1lKTsKLQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcobSwgUVVFVUVfU1RBVEVfQVRUUiwgc3RhdGUpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBKT0IgQ0hBTkdFIEVWRU5ULiBVc2VkIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIG9uIGEgam9iLgotICovCi1wcm94eV9tc2cgKgotcHJveHlfam9iX2NoYW5nZV9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkX3JhbmdlLCBpbnQgbnVtX2F0dHJzKQotewotCXByb3h5X21zZyAqCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX0pPQl9DSEFOR0UsIHRyYW5zX2lkKTsKLQotCXByb3h5X21zZ19hZGRfaW50KG0sIDEpOyAvKiAxIGlkIHJhbmdlICovCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG51bV9hdHRycyk7Ci0KLQlyZXR1cm4gbTsKLX0KLQotLyoKLSAqIE1BQ0hJTkUgQ0hBTkdFIEVWRU5ULiBVc2VkIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIG9uIGEgbWFjaGluZS4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X21hY2hpbmVfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UsIGludCBudW1fYXR0cnMpCi17Ci0JcHJveHlfbXNnICoJbSA9IG5ld19wcm94eV9tc2coUFJPWFlfRVZfUlRfTUFDSElORV9DSEFOR0UsIHRyYW5zX2lkKTsKLQotCXByb3h5X21zZ19hZGRfaW50KG0sIDEpOyAvKiAxIGlkIHJhbmdlICovCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG51bV9hdHRycyk7Ci0KLQlyZXR1cm4gbTsKLX0KLQotLyoKLSAqIE5PREUgQ0hBTkdFIEVWRU5ULiBVc2VkIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIG9uIGEgbm9kZS4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X25vZGVfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UsIGludCBudW1fYXR0cnMpCi17Ci0JcHJveHlfbXNnICoJbSA9IG5ld19wcm94eV9tc2coUFJPWFlfRVZfUlRfTk9ERV9DSEFOR0UsIHRyYW5zX2lkKTsKLQotCXByb3h5X21zZ19hZGRfaW50KG0sIDEpOyAvKiAxIGlkIHJhbmdlICovCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG51bV9hdHRycyk7Ci0KLQlyZXR1cm4gbTsKLX0KLQotLyoKLSAqIFBST0NFU1MgQ0hBTkdFIEVWRU5ULiBVc2VkIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIG9uIGEgcHJvY2Vzcy4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UsIGludCBudW1fYXR0cnMpCi17Ci0JcHJveHlfbXNnICptID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9QUk9DRVNTX0NIQU5HRSwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9pbnQobSwgMSk7IC8qIDEgaWQgcmFuZ2UgKi8KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBpZF9yYW5nZSk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobSwgbnVtX2F0dHJzKTsKLQotCXJldHVybiBtOwotfQotCi0vKgotICogUVVFVUUgQ0hBTkdFIEVWRU5ULiBVc2VkIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIG9uIGEgcXVldWUuCi0gKi8KLXByb3h5X21zZyAqCi1wcm94eV9xdWV1ZV9jaGFuZ2VfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICppZF9yYW5nZSwgaW50IG51bV9hdHRycykKLXsKLQlwcm94eV9tc2cgKm0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX1FVRVVFX0NIQU5HRSwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9pbnQobSwgMSk7IC8qIDEgaWQgcmFuZ2UgKi8KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBpZF9yYW5nZSk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobSwgbnVtX2F0dHJzKTsKLQotCXJldHVybiBtOwotfQotCi0vKgotICogUkVNT1ZFIEFMTCBFVkVOVC4gVXNlZCB0byByZW1vdmUgYWxsIG1vZGVsIGVsZW1lbnRzLgotICovCi1wcm94eV9tc2cgKgotcHJveHlfcmVtb3ZlX2FsbF9ldmVudChpbnQgdHJhbnNfaWQpCi17Ci0JcmV0dXJuIG5ld19wcm94eV9tc2coUFJPWFlfRVZfUlRfUkVNT1ZFX0FMTCwgdHJhbnNfaWQpOwotfQotCi0vKgotICogUkVNT1ZFIEpPQiBFVkVOVC4gVXNlZCB0byByZW1vdmUgam9iIG1vZGVsIGVsZW1lbnRzLgotICovCi1wcm94eV9tc2cgKgotcHJveHlfcmVtb3ZlX2pvYl9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkX3JhbmdlKQotewotCXByb3h5X21zZyAqbSA9IG5ld19wcm94eV9tc2coUFJPWFlfRVZfUlRfUkVNT1ZFX0pPQiwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBSRU1PVkUgTUFDSElORSBFVkVOVC4gVXNlZCB0byByZW1vdmUgbWFjaGluZSBtb2RlbCBlbGVtZW50cy4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X3JlbW92ZV9tYWNoaW5lX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UpCi17Ci0JcHJveHlfbXNnICptID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9SRU1PVkVfTUFDSElORSwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBSRU1PVkUgTk9ERSBFVkVOVC4gVXNlZCB0byByZW1vdmUgbm9kZSBtb2RlbCBlbGVtZW50cy4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X3JlbW92ZV9ub2RlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UpCi17Ci0JcHJveHlfbXNnICptID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9SRU1PVkVfTk9ERSwgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBSRU1PVkUgUFJPQ0VTUyBFVkVOVC4gVXNlZCB0byByZW1vdmUgcHJvY2VzcyBtb2RlbCBlbGVtZW50cy4KLSAqLwotcHJveHlfbXNnICoKLXByb3h5X3JlbW92ZV9wcm9jZXNzX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UpCi17Ci0JcHJveHlfbXNnICptID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9SRU1PVkVfUFJPQ0VTUywgdHJhbnNfaWQpOwotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgaWRfcmFuZ2UpOwotCi0JcmV0dXJuIG07Ci19Ci0KLS8qCi0gKiBSRU1PVkUgUVVFVUUgRVZFTlQuIFVzZWQgdG8gcmVtb3ZlIHF1ZXVlIG1vZGVsIGVsZW1lbnRzLgotICovCi1wcm94eV9tc2cgKgotcHJveHlfcmVtb3ZlX3F1ZXVlX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWRfcmFuZ2UpCi17Ci0JcHJveHlfbXNnICptID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9SRU1PVkVfUVVFVUUsIHRyYW5zX2lkKTsKLQotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGlkX3JhbmdlKTsKLQotCXJldHVybiBtOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X21zZy5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X21zZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkxYWFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9tc2cuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIF9fZ251X2xpbnV4X18KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZiAvKiBfX2dudV9saW51eF9fICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X21zZy5oIgotI2luY2x1ZGUgImFyZ3MuaCIKLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAic2VyZGVzLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0KLSNpZmRlZiBfX2xpbnV4X18KLWV4dGVybiBpbnQgZGlnaXR0b2ludChpbnQgYyk7Ci0jZW5kaWYgLyogX19saW51eF9fICovCi0KLSNkZWZpbmUgQVJHX1NJWkUJMTAwCi0KLXN0YXRpYyBjaGFyIHRvaGV4W10gPSB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnfTsKLQotLyoKLSAqIENvbnZlcnQgYSBtZXNzYWdlIHRvIGEgcGFja2V0IHJlYWR5IHRvIHNlbmQgb3ZlciB0aGUgd2lyZS4KLSAqCi0gKiBOb3RlOiBwYWNrZXQgbGVuZ3RoIGlzIGFkZGVkIHdoZW4gdGhlIHBhY2tldCBpcyB0cmFuc21pdHRlZC4KLSAqLwotaW50Ci1wcm94eV9zZXJpYWxpemVfbXNnKHByb3h5X21zZyAqbSwgY2hhciAqKnJlc3VsdCwgaW50ICpyZXN1bHRfbGVuKQotewotCWludAkJaTsKLQlpbnQJCWhkcl9sZW47Ci0JaW50CQlhcmdfbGVuOwotCWludAkJbGVuID0gMDsKLQljaGFyICoJcGFja2V0OwotCWNoYXIgKglwOwotCi0JaWYgKG0gPT0gTlVMTCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIHBhY2tldCBsZW5ndGguCi0JICoKLQkgKiBIZWFkZXIgbGVuZ3RoIGluY2x1ZGVzIGxlYWRpbmcgc3BhY2UgYW5kIHNlcGFyYXRvcnMuCi0JICogQm9keSBsZW5ndGggaW5jbHVkZSBlbmNvZGVkIHN0cmluZ3MgYW5kIHNlcGFyYXRvcnMuCi0JICovCi0JaGRyX2xlbiA9IE1TR19JRF9TSVpFICsgTVNHX1RSQU5TX0lEX1NJWkUgKyBNU0dfTkFSR1NfU0laRSArIDM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbS0+bnVtX2FyZ3M7IGkrKykgewotCQlsZW4gKz0gc3RybGVuKG0tPmFyZ3NbaV0pICsgTVNHX0FSR19MRU5fU0laRSArIDI7Ci0JfQotCi0JLyoKLQkgKiBBbGxvY2F0ZSBwYWNrZXQKLQkgKi8KLQlwYWNrZXQgPSBwID0gKGNoYXIgKiltYWxsb2MoaGRyX2xlbiArIGxlbik7Ci0KLQkqcCsrID0gJyAnOwotCWludF90b19oZXhfc3RyKG0tPm1zZ19pZCwgcCwgTVNHX0lEX1NJWkUsICZwKTsKLQkqcCsrID0gJzonOwotCWludF90b19oZXhfc3RyKG0tPnRyYW5zX2lkLCBwLCBNU0dfVFJBTlNfSURfU0laRSwgJnApOwotCSpwKysgPSAnOic7Ci0JaW50X3RvX2hleF9zdHIobS0+bnVtX2FyZ3MsIHAsIE1TR19OQVJHU19TSVpFLCAmcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbS0+bnVtX2FyZ3M7IGkrKykgewotCQlhcmdfbGVuID0gc3RybGVuKG0tPmFyZ3NbaV0pOwotCQkqcCsrID0gJyAnOwotCQlpbnRfdG9faGV4X3N0cihhcmdfbGVuLCBwLCBNU0dfQVJHX0xFTl9TSVpFLCAmcCk7Ci0JCSpwKysgPSAnOic7Ci0JCW1lbWNweShwLCBtLT5hcmdzW2ldLCBhcmdfbGVuKTsKLQkJcCArPSBhcmdfbGVuOwotCX0KLQotCSpyZXN1bHQgPSBwYWNrZXQ7Ci0JKnJlc3VsdF9sZW4gPSBoZHJfbGVuICsgbGVuOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXByb3h5X2dldF9kYXRhKGNoYXIgKnN0ciwgY2hhciAqKmRhdGEsIGludCAqbGVuKQotewotCWludAkJZGF0YV9sZW47Ci0JY2hhcgljaDsKLQljaGFyICoJcDsKLQotCWRhdGFfbGVuID0gc3RybGVuKHN0cikgLyAyOwotCi0JKmxlbiA9IGRhdGFfbGVuOwotCSpkYXRhID0gcCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSAqIGRhdGFfbGVuKTsKLQotCWZvciAoOyBkYXRhX2xlbiA+IDA7IGRhdGFfbGVuLS0pIHsKLQkJY2ggPSBkaWdpdHRvaW50KCpzdHIrKyk7Ci0JCWNoIDw8PSA0OwotCQljaCB8PSBkaWdpdHRvaW50KCpzdHIrKyk7Ci0KLQkJKnArKyA9IGNoOwotCX0KLX0KLQotdm9pZAotcHJveHlfZ2V0X2ludChjaGFyICpzdHIsIGludCAqdmFsKQotewotCSp2YWwgPSAoaW50KXN0cnRvbChzdHIsIE5VTEwsIDEwKTsKLX0KLQotdm9pZAotcHJveHlfZ2V0X2JpdHNldChjaGFyICpzdHIsIGJpdHNldCAqKmIpCi17Ci0JKmIgPSBzdHJfdG9fYml0c2V0KHN0ciwgTlVMTCk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IHdpcmUgcHJvdG9jb2wgdG8gbWVzc2FnZS4KLSAqCi0gKiBQYWNrZXQgbGVuZ3RoIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4KLSAqLwotaW50Ci1wcm94eV9kZXNlcmlhbGl6ZV9tc2coY2hhciAqcGFja2V0LCBpbnQgcGFja2V0X2xlbiwgcHJveHlfbXNnICoqbXNnKQotewotCWludAkJCWk7Ci0JaW50CQkJbXNnX2lkOwotCWludAkJCXRyYW5zX2lkOwotCWludAkJCW51bV9hcmdzOwotCXByb3h5X21zZyAqCW0gPSBOVUxMOwotCWNoYXIgKgkJYXJnOwotCWNoYXIgKgkJZW5kOwotCi0JaWYgKHBhY2tldCA9PSBOVUxMIHx8Ci0JCQkqcGFja2V0ICE9ICcgJyB8fAotCQkJcGFja2V0X2xlbiA8IE1TR19JRF9TSVpFICsgTVNHX1RSQU5TX0lEX1NJWkUgKyBNU0dfTkFSR1NfU0laRSArIDMpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogbWVzc2FnZSBJRAotCSAqLwotCXBhY2tldCsrOyAvKiBTa2lwIHNwYWNlICovCi0JbXNnX2lkID0gaGV4X3N0cl90b19pbnQocGFja2V0LCBNU0dfSURfU0laRSwgJmVuZCk7Ci0JZW5kKys7IC8qIFNraXAgc2VwYXJhdG9yICovCi0KLQkvKgotCSAqIHRyYW5zYWN0aW9uIElECi0JICovCi0JcGFja2V0ID0gZW5kOwotCXRyYW5zX2lkID0gaGV4X3N0cl90b19pbnQocGFja2V0LCBNU0dfVFJBTlNfSURfU0laRSwgJmVuZCk7Ci0JZW5kKys7Ci0KLQkvKgotCSAqIG51bWJlciBvZiBhcmdzCi0JICovCi0JcGFja2V0ID0gZW5kOwotCW51bV9hcmdzID0gaGV4X3N0cl90b19pbnQocGFja2V0LCBNU0dfTkFSR1NfU0laRSwgJmVuZCk7Ci0JZW5kKys7Ci0KLQltID0gbmV3X3Byb3h5X21zZyhtc2dfaWQsIHRyYW5zX2lkKTsKLQotCXBhY2tldCA9IGVuZDsKLQlwYWNrZXRfbGVuIC09IChNU0dfSURfU0laRSArIE1TR19UUkFOU19JRF9TSVpFICsgTVNHX05BUkdTX1NJWkUgKyAzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fYXJnczsgaSsrKSB7Ci0JCWlmIChwcm94eV9tc2dfZGVjb2RlX3N0cmluZyhwYWNrZXQsIHBhY2tldF9sZW4sICZhcmcsICZlbmQpIDwgMCkgewotCQkJZnJlZV9wcm94eV9tc2cobSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcHJveHlfbXNnX2FkZF9zdHJpbmdfbm9jb3B5KG0sIGFyZyk7Ci0JCWVuZCsrOyAvKiBza2lwIHNwYWNlICovCi0JCXBhY2tldF9sZW4gLT0gKGVuZCAtIHBhY2tldCk7Ci0JCXBhY2tldCA9IGVuZDsKLQl9Ci0KLQkqbXNnID0gbTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRGVjb2RlIHN0cmluZyBhcmd1bWVudC4gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIKLSAqIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBpbiAnZW5kJwotICovCi1pbnQKLXByb3h5X21zZ19kZWNvZGVfc3RyaW5nKGNoYXIgKnN0ciwgaW50IGxlbiwgY2hhciAqKmFyZywgY2hhciAqKmVuZCkKLXsKLQlpbnQJCWFyZ19sZW47Ci0JY2hhciAqCWVwOwotCWNoYXIgKglwOwotCi0JaWYgKGxlbiA8IE1TR19BUkdfTEVOX1NJWkUgKyAxKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlhcmdfbGVuID0gaGV4X3N0cl90b19pbnQoc3RyLCBNU0dfQVJHX0xFTl9TSVpFLCAmZXApOwotCWVwKys7Ci0KLQlpZiAobGVuIDwgTVNHX0FSR19MRU5fU0laRSArIGFyZ19sZW4gKyAxKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwID0gKGNoYXIgKiltYWxsb2MoYXJnX2xlbiArIDEpOwotCW1lbWNweShwLCBlcCwgYXJnX2xlbik7Ci0JcFthcmdfbGVuXSA9ICdcMCc7Ci0KLQkqYXJnID0gcDsKLQkqZW5kID0gZXAgKyBhcmdfbGVuOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfYXJnKHByb3h5X21zZyAqbSwgY2hhciAqYXJnLCBpbnQgZnJlZV9hcmcpCi17Ci0JaW50IAlzaXplID0gbS0+YXJnX3NpemU7Ci0KLQlpZiAobS0+YXJnX3NpemUgPCBtLT5udW1fYXJncyArIDIpIHsKLQkJbS0+YXJnX3NpemUgKz0gQVJHX1NJWkU7Ci0JfQotCi0JaWYgKHNpemUgPT0gMCkgewotCQltLT5hcmdfc2l6ZSsrOyAvLyBleHRyYSBzcGFjZSB0byBudWxsIHRlcm1pbmF0ZSBhcmd1bWVudHMKLQkJbS0+YXJncyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIG0tPmFyZ19zaXplKTsKLQkJbS0+ZnJlZV9hcmdzID0gKGludCAqKW1hbGxvYyhzaXplb2YoaW50ICopICogbS0+YXJnX3NpemUpOwotCX0gZWxzZSBpZiAoc2l6ZSA8IG0tPmFyZ19zaXplKSB7Ci0JCW0tPmFyZ3MgPSAoY2hhciAqKilyZWFsbG9jKG0tPmFyZ3MsIHNpemVvZihjaGFyICopICogbS0+YXJnX3NpemUpOwotCQltLT5mcmVlX2FyZ3MgPSAoaW50ICopcmVhbGxvYyhtLT5mcmVlX2FyZ3MsIHNpemVvZihpbnQgKikgKiBtLT5hcmdfc2l6ZSk7Ci0JfQotCi0JbS0+YXJnc1ttLT5udW1fYXJnc10gPSBhcmc7Ci0JbS0+ZnJlZV9hcmdzW20tPm51bV9hcmdzXSA9IGZyZWVfYXJnOwotCW0tPm51bV9hcmdzKys7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IGFyZ3MgYXJlIGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQKLQkgKi8KLQltLT5hcmdzW20tPm51bV9hcmdzXSA9IE5VTEw7Ci19Ci0KLXZvaWQKLXByb3h5X21zZ19hZGRfZGF0YShwcm94eV9tc2cgKm0sIGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0JaW50CQlpOwotCWNoYXIJY2g7Ci0JY2hhciAqCWFyZzsKLQljaGFyICoJcDsKLQotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgIjAwIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwID0gYXJnID0gKGNoYXIgKiltYWxsb2MoKGxlbiAqIDIpICsgOCArIDIpOwotCi0JLyoKLQkgKiBFbmNvZGUgZGF0YQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQljaCA9ICpkYXRhKys7Ci0JCSpwKysgPSB0b2hleFsoY2ggPj4gNCkgJiAweGZdOwotCQkqcCsrID0gdG9oZXhbY2ggJiAweGZdOwotCX0KLQotCSpwID0gJ1wwJzsKLQotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGFyZyk7Ci19Ci0KLXZvaWQKLXByb3h5X21zZ19hZGRfaW50KHByb3h5X21zZyAqbSwgaW50IHZhbCkKLXsKLQljaGFyICoJc3RyX3ZhbDsKLQotCWFzcHJpbnRmKCZzdHJfdmFsLCAiJWQiLCB2YWwpOwotCWFkZF9hcmcobSwgc3RyX3ZhbCwgMSk7Ci19Ci0KLXZvaWQKLXByb3h5X21zZ19hZGRfc3RyaW5nKHByb3h5X21zZyAqbSwgY2hhciAqdmFsKQotewotCWlmICh2YWwgPT0gTlVMTCkgewotCQl2YWwgPSAiIjsKLQl9Ci0JYWRkX2FyZyhtLCBzdHJkdXAodmFsKSwgMSk7Ci19Ci0KLXZvaWQKLXByb3h5X21zZ19hZGRfc3RyaW5nX25vY29weShwcm94eV9tc2cgKm0sIGNoYXIgKnZhbCkKLXsKLQlpZiAodmFsID09IE5VTEwpIHsKLQkJdmFsID0gIiI7Ci0JfQotCWFkZF9hcmcobSwgdmFsLCAwKTsKLX0KLQotdm9pZAotcHJveHlfbXNnX2FkZF9hcmdzKHByb3h5X21zZyAqbSwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQgaTsKLQotCWlmIChuYXJncyA9PSAwKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQlhZGRfYXJnKG0sIHN0cmR1cChhcmdzW2ldKSwgMSk7Ci0JfQotfQotCi12b2lkCi1wcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KHByb3h5X21zZyAqbSwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQgaTsKLQotCWlmIChuYXJncyA9PSAwKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQlhZGRfYXJnKG0sIGFyZ3NbaV0sIDApOwotCX0KLX0KLQotdm9pZAotcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KHByb3h5X21zZyAqbSwgY2hhciAqa2V5LCBpbnQgdmFsKQotewotCWNoYXIgKglrdjsKLQotCWFzcHJpbnRmKCZrdiwgIiVzPSVkIiwga2V5LCB2YWwpOwotCWFkZF9hcmcobSwga3YsIDEpOwotfQotCi12b2lkCi1wcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcocHJveHlfbXNnICptLCBjaGFyICprZXksIGNoYXIgKnZhbCkKLXsKLQljaGFyICoJa3Y7Ci0KLQlhc3ByaW50Zigma3YsICIlcz0lcyIsIGtleSwgdmFsKTsKLQlhZGRfYXJnKG0sIGt2LCAxKTsKLX0KLQotdm9pZAotcHJveHlfbXNnX2FkZF9iaXRzZXQocHJveHlfbXNnICptLCBiaXRzZXQgKmIpCi17Ci0JYWRkX2FyZyhtLCBiaXRzZXRfdG9fc3RyKGIpLCAxKTsKLX0KLQotdm9pZAotcHJveHlfbXNnX2luc2VydF9iaXRzZXQocHJveHlfbXNnICptLCBiaXRzZXQgKmIsIGludCBpZHgpCi17Ci0JaW50IAlpOwotCWludAkJdG1wX2ZyZWU7Ci0JY2hhciAqCXRtcF9hcmc7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJaWR4ID0gMDsKLQotCS8qCi0JICogRmlyc3QgYWRkIGJpdHNldCB0byBlbmQKLQkgKi8KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtLCBiKTsKLQotCS8qCi0JICogSnVzdCByZXR1cm4gaWYgdGhlIGluc2VydCBsb2NhdGlvbiBpcyBhdCBvciBwYXN0IGVuZAotCSAqLwotCWlmIChpZHggPj0gbS0+bnVtX2FyZ3MpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogT3RoZXJ3aXNlIHJvdGF0ZSBsYXN0IGFyZ3VtZW50IGludG8gcmVxdWlyZWQgcG9zaXRpb24KLQkgKi8KLQotCXRtcF9hcmcgPSBtLT5hcmdzW20tPm51bV9hcmdzLTFdOwotCXRtcF9mcmVlID0gbS0+ZnJlZV9hcmdzW20tPm51bV9hcmdzLTFdOwotCi0JZm9yIChpID0gbS0+bnVtX2FyZ3MtMTsgaSA+IGlkeDsgaS0tKSB7Ci0JCW0tPmFyZ3NbaV0gPSBtLT5hcmdzW2ktMV07Ci0JCW0tPmZyZWVfYXJnc1tpXSA9IG0tPmZyZWVfYXJnc1tpLTFdOwotCX0KLQotCW0tPmFyZ3NbaWR4XSA9IHRtcF9hcmc7Ci0JbS0+ZnJlZV9hcmdzW2lkeF0gPSB0bXBfZnJlZTsKLX0KLQotcHJveHlfbXNnICoKLW5ld19wcm94eV9tc2coaW50IG1zZ19pZCwgaW50IHRyYW5zX2lkKQotewotCXByb3h5X21zZyAqCW0gPSAocHJveHlfbXNnICopbWFsbG9jKHNpemVvZihwcm94eV9tc2cpKTsKLQotCW0tPm1zZ19pZCA9IG1zZ19pZDsKLQltLT50cmFuc19pZCA9IHRyYW5zX2lkOwotCW0tPmFyZ19zaXplID0gMDsKLQltLT5udW1fYXJncyA9IDA7Ci0JbS0+YXJncyA9IE5VTEw7Ci0JbS0+ZnJlZV9hcmdzID0gTlVMTDsKLQotCXJldHVybiBtOwotfQotCi12b2lkCi1mcmVlX3Byb3h5X21zZyhwcm94eV9tc2cgKm0pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbS0+bnVtX2FyZ3M7IGkrKykgewotCQlpZiAobS0+ZnJlZV9hcmdzW2ldKSB7Ci0JCQlmcmVlKG0tPmFyZ3NbaV0pOwotCQl9Ci0JfQotCi0JZnJlZShtLT5hcmdzKTsKLQlmcmVlKG0tPmZyZWVfYXJncyk7Ci0JZnJlZShtKTsKLX0KLQotLyoKLSAqIEFkZCBtZXNzYWdlIHRvIGxpc3Qgb2YgbWVzc2FnZXMgd2FpdGluZyB0byBiZSBzZW50LgotICovCi12b2lkCi1wcm94eV9xdWV1ZV9tc2coTGlzdCAqZXZfbGlzdCwgcHJveHlfbXNnICptKQotewotCUFkZFRvTGlzdChldl9saXN0LCAodm9pZCAqKW0pOwotfQotCi0vKgotICogUHJvY2VzcyBhbnkgcXVldWVkIG1lc3NhZ2VzLgotICovCi12b2lkCi1wcm94eV9wcm9jZXNzX21zZ3MoTGlzdCAqbXNnX2xpc3QsIHZvaWQgKCpjYWxsYmFjaykocHJveHlfbXNnICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCi17Ci0JcHJveHlfbXNnICoJbTsKLQotCWlmIChtc2dfbGlzdCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoKG0gPSAocHJveHlfbXNnICopUmVtb3ZlRmlyc3QobXNnX2xpc3QpKSAhPSBOVUxMKSB7Ci0JCWNhbGxiYWNrKG0sIGRhdGEpOwotCQlmcmVlX3Byb3h5X21zZyhtKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9zdGRpby5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3N0ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTM3ODkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3N0ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseQotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIF9fZ251X2xpbnV4X18KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X3N0ZGlvLmgiCi0jaW5jbHVkZSAicHJveHlfY21kLmgiCi0KLS8qKgotICogQ3JlYXRlIGEgY29ubiBzdHJ1Y3R1cmUuCi0gKi8KLXZvaWQKLXByb3h5X3N0ZGlvX2NyZWF0ZV9jb25uKHByb3h5X3N0ZGlvX2Nvbm4gKipjb25uKQotewotCXByb3h5X3N0ZGlvX2Nvbm4gKmM7Ci0KLQljID0gKHByb3h5X3N0ZGlvX2Nvbm4gKikgbWFsbG9jKHNpemVvZihwcm94eV9zdGRpb19jb25uKSk7Ci0KLQljLT5zZXNzX2luID0gLTE7Ci0JYy0+c2Vzc19vdXQgPSAtMTsKLQljLT5jb25uZWN0ZWQgPSAwOwotCWMtPmJ1Zl9zaXplID0gQlVGU0laOwotCWMtPmJ1ZiA9IChjaGFyICopbWFsbG9jKGMtPmJ1Zl9zaXplKTsKLQljLT5idWZfcG9zID0gMDsKLQljLT50b3RhbF9yZWFkID0gMDsKLQljLT5tc2dfbGVuID0gMDsKLQotCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLQotCSpjb25uID0gYzsKLX0KLQotdm9pZAotcHJveHlfc3RkaW9fZGVzdHJveV9jb25uKHByb3h5X3N0ZGlvX2Nvbm4gKmNvbm4pCi17Ci0JZnJlZShjb25uLT5idWYpOwotCWZyZWUoY29ubik7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0ZGlvX3JlYWQocHJveHlfc3RkaW9fY29ubiAqY29ubikKLXsKLQlpbnQJbjsKLQotCWlmIChjb25uLT50b3RhbF9yZWFkID09IGNvbm4tPmJ1Zl9zaXplKSB7Ci0JCWNvbm4tPmJ1Zl9zaXplICs9IEJVRlNJWjsKLQkJY29ubi0+YnVmID0gKGNoYXIgKilyZWFsbG9jKGNvbm4tPmJ1ZiwgY29ubi0+YnVmX3NpemUpOwotCX0KLQotCW4gPSByZWFkKGNvbm4tPnNlc3NfaW4sICZjb25uLT5idWZbY29ubi0+YnVmX3Bvc10sIGNvbm4tPmJ1Zl9zaXplIC0gY29ubi0+dG90YWxfcmVhZCk7Ci1mcHJpbnRmKHN0ZGVyciwgIiByZWFkICVkIFwiJXNcIlxuIiwgbiwgJmNvbm4tPmJ1Zltjb25uLT5idWZfcG9zXSk7Ci0JaWYgKG4gPD0gMCkgewotCQlpZiAobiA8IDApCi0JCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZWxzZQotCQkJcHJveHlfc2V0X2Vycm9yKFBST1hZX0VSUl9QUk9UTywgImNvbm5lY3Rpb24gdGVybWluYXRlZCIpOwotCi0JCWNvbm4tPmNvbm5lY3RlZCA9IDA7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljb25uLT5idWZfcG9zICs9IG47Ci0JY29ubi0+dG90YWxfcmVhZCArPSBuOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQKLXN0ZGlvX3dyaXRlKHByb3h5X3N0ZGlvX2Nvbm4gKmNvbm4sIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQJCW47Ci0KLQl3aGlsZSAoIGxlbiA+IDAgKSB7Ci0JCW4gPSB3cml0ZShjb25uLT5zZXNzX291dCwgYnVmLCBsZW4pOwotCQlpZiAobiA8PSAwKSB7Ci0JCQlpZiAobiA8IDApCi0JCQkJcGVycm9yKCJzZW5kIik7Ci0JCQljb25uLT5jb25uZWN0ZWQgPSAwOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJbGVuIC09IG47Ci0JCWJ1ZiArPSBuOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VuZCBhIG1lc3NhZ2UgdG8gYSByZW1vdGUgcGVlci4gcHJveHlfc3RkaW9fc2VuZCgpIHdpbGwgYWx3YXlzIHNlbmQgYSBjb21wbGV0ZSBtZXNzYWdlLgotICogSWYgdGhlIHNlbmQgZmFpbHMgZm9yIGFueSByZWFzb24sIGFuIGVycm9yIGlzIHJldHVybmVkLgotICoKLSAqIFNpbGVudGx5IHRydW5jYXRlcyBsZW5ndGggdG8gYSBtYXhpbXVtIG9mIDMyIGJpdHMuCi0gKi8KLWludAotcHJveHlfc3RkaW9fc2VuZF9tc2cocHJveHlfc3RkaW9fY29ubiAqY29ubiwgY2hhciAqbWVzc2FnZSwgaW50IGxlbikKLXsKLQljaGFyIAlidWZbTVNHX0xFTl9TSVpFKzFdOwotCi0JLyoKLQkgKiBTZW5kIG1lc3NhZ2UgbGVuZ3RoIGZpcnN0Ci0JICovCi0Jc3ByaW50ZihidWYsICIlMCp4IiwgTVNHX0xFTl9TSVpFLCBsZW4gJiBNU0dfTEVOR1RIX01BU0spOwotCi0JaWYgKHN0ZGlvX3dyaXRlKGNvbm4sIGJ1Ziwgc3RybGVuKGJ1ZikpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBOb3cgc2VuZCBtZXNzYWdlCi0JICovCi0KLQlyZXR1cm4gc3RkaW9fd3JpdGUoY29ubiwgbWVzc2FnZSwgbGVuKTsKLX0KLQotc3RhdGljIGludAotcHJveHlfc3RkaW9fZ2V0X21zZ19sZW4ocHJveHlfc3RkaW9fY29ubiAqY29ubikKLXsKLQljaGFyICoJZW5kOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlbid0IHJlYWQgZW5vdWdoIHRoZW4gcmV0dXJuIGZvciBtb3JlLi4uCi0JICovCi0JaWYgKGNvbm4tPnRvdGFsX3JlYWQgPCBNU0dfTEVOX1NJWkUpCi0JCXJldHVybiAwOwotCi0JY29ubi0+bXNnX2xlbiA9IHN0cnRvbChjb25uLT5idWYsICZlbmQsIDE2KTsKLQotCS8qCi0JICogY2hlY2sgaWYgd2UndmUgcmVjZWl2ZWQgdGhlIGxlbmd0aAotCSAqLwotCWlmIChjb25uLT5tc2dfbGVuID09IDAgfHwgKGNvbm4tPm1zZ19sZW4gPiAwICYmICplbmQgIT0gJyAnKSkgewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1BST1RPLCAiY291bGQgbm90IHVuZGVyc3RhbmQgbWVzc2FnZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIGNvbm4tPm1zZ19sZW47Ci19Ci0KLXN0YXRpYyBpbnQKLXByb3h5X3N0ZGlvX2NvcHlfbXNnKHByb3h5X3N0ZGlvX2Nvbm4gKmNvbm4sIGNoYXIgKipyZXN1bHQpCi17Ci0JaW50CW4gPSBjb25uLT5tc2dfbGVuOwotCi0JKnJlc3VsdCA9IChjaGFyICopbWFsbG9jKGNvbm4tPm1zZ19sZW4gKyAxKTsKLQltZW1jcHkoKnJlc3VsdCwgJmNvbm4tPmJ1ZltNU0dfTEVOX1NJWkVdLCBjb25uLT5tc2dfbGVuKTsKLQkoKnJlc3VsdClbY29ubi0+bXNnX2xlbl0gPSAnXDAnOwotCi0JLyoKLQkgKiBNb3ZlIHJlc3Qgb2YgYnVmZmVyIGRvd24gaWYgbmVjZXNzYXJ5Ci0JICovCi0JaWYgKGNvbm4tPnRvdGFsX3JlYWQgPiBjb25uLT5tc2dfbGVuICsgTVNHX0xFTl9TSVpFKSB7Ci0JCWNvbm4tPnRvdGFsX3JlYWQgLT0gY29ubi0+bXNnX2xlbiArIE1TR19MRU5fU0laRTsKLQkJbWVtbW92ZShjb25uLT5idWYsICZjb25uLT5idWZbY29ubi0+bXNnX2xlbiArIE1TR19MRU5fU0laRV0sIGNvbm4tPnRvdGFsX3JlYWQpOwotCX0gZWxzZSB7Ci0JCWNvbm4tPmJ1Zl9wb3MgPSAwOwotCQljb25uLT50b3RhbF9yZWFkID0gMDsKLQl9Ci0KLQljb25uLT5tc2dfbGVuID0gMDsKLQotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW50Ci1wcm94eV9zdGRpb19nZXRfbXNnX2JvZHkocHJveHlfc3RkaW9fY29ubiAqY29ubiwgY2hhciAqKnJlc3VsdCkKLXsKLQkvKgotCSAqIElmIHdlIGhhdmVuJ3QgcmVhZCBlbm91Z2ggdGhlbiByZXR1cm4gZm9yIG1vcmUuLi4KLQkgKi8KLQlpZiAoY29ubi0+dG90YWxfcmVhZCAtIE1TR19MRU5fU0laRSA8IGNvbm4tPm1zZ19sZW4pCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHByb3h5X3N0ZGlvX2NvcHlfbXNnKGNvbm4sIHJlc3VsdCk7Ci19Ci0KLS8qCi0gKiBSZWNlaXZlIGEgYnVmZmVyIGZyb20gYSByZW1vdGUgcGVlci4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIGJ1ZmZlciBtYXkgY29udGFpbiBhIHBhcnRpYWwKLSAqIG1lc3NhZ2Ugb3IgYSBudW1iZXIgb2YgY29tcGxldGVkIG1lc3NhZ2VzLgotICoKLSAqLwotaW50Ci1wcm94eV9zdGRpb19yZWN2X21zZ3MocHJveHlfc3RkaW9fY29ubiAqY29ubikKLXsKLQkvKgotCSAqIEdldCB3aGF0ZXZlciBpcyBhdmFpbGFibGUKLQkgKi8KLQlpZiAoc3RkaW9fcmVhZChjb25uKSA8IDApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogR2V0IHRoZSBmaXJzdCBhdmFpbGFibGUgbWVzc2FnZSBmcm9tIHRoZSBidWZmZXIuIFJlcGVhdGVkIGNhbGxzIHdpbGwgZ2V0IHN1YnNlcXVlbnQKLSAqIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlci4KLSAqCi0gKiBAcmV0dXJuCTAJbm8gbWVzc2FnZXMgYXZhaWxhYmxlCi0gKiAJCQk+MAltZXNzYWdlIGF2YWlsYWJsZSwgbGVuZ3RoIHJldHVybmVkCi0gKiAJCQktMQllcnJvcgotICovCi1pbnQKLXByb3h5X3N0ZGlvX2dldF9tc2cocHJveHlfc3RkaW9fY29ubiAqY29ubiwgY2hhciAqKnJlc3VsdCwgaW50ICpsZW4pCi17Ci0JaW50CW47Ci0KLQlpZiAoY29ubi0+bXNnX2xlbiA9PSAwICYmIChuID0gcHJveHlfc3RkaW9fZ2V0X21zZ19sZW4oY29ubikpIDw9IDApCi0JCXJldHVybiBuOwotCi0JKmxlbiA9IGNvbm4tPm1zZ19sZW47Ci0JcmV0dXJuIHByb3h5X3N0ZGlvX2dldF9tc2dfYm9keShjb25uLCByZXN1bHQpOwotfQotCi0vKgotICogRGVjb2RlIHN0cmluZyBhcmd1bWVudAotICovCi1pbnQKLXByb3h5X3N0ZGlvX2RlY29kZV9zdHJpbmcoY2hhciAqc3RyLCBjaGFyICoqYXJnLCBjaGFyICoqZW5kKQotewotCWludAkJYXJnX2xlbjsKLQlpbnQgCXN0cl9sZW4gPSBzdHJsZW4oc3RyKTsKLQljaGFyICoJZXA7Ci0JY2hhciAqCXA7Ci0KLQlpZiAoc3RyX2xlbiA8IE1TR19BUkdfTEVOX1NJWkUgKyAxKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQllcCA9IHN0ciArIE1TR19BUkdfTEVOX1NJWkU7Ci0JKmVwKysgPSAnXDAnOwotCWFyZ19sZW4gPSBzdHJ0b2woc3RyLCBOVUxMLCAxNik7Ci0KLQlpZiAoc3RyX2xlbiA8IE1TR19BUkdfTEVOX1NJWkUgKyBhcmdfbGVuICsgMSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcCA9IChjaGFyICopbWFsbG9jKGFyZ19sZW4gKyAxKTsKLQltZW1jcHkocCwgZXAsIGFyZ19sZW4pOwotCXBbYXJnX2xlbl0gPSAnXDAnOwotCi0JKmFyZyA9IHA7Ci0JKmVuZCA9IHN0ciArIE1TR19BUkdfTEVOX1NJWkUgKyBhcmdfbGVuICsgMTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3N0ZGlvX3N2ci5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3N0ZGlvX3N2ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQyOThiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9zdGRpb19zdnIuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhlIHByb3h5IGhhbmRsZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgZGVidWcgbGlicmFyeSBBUEkgYW5kIHRoZQotICogY2xpZW50IGRlYnVnZ2VyLCBzaW5jZSB0aGV5IG1heSBiZSBydW5uaW5nIG9uIGRpZmZlcmVudCBob3N0cywgYW5kIHdpbGwKLSAqIGNlcnRhaW5seSBiZSBydW5uaW5nIGluIGRpZmZlcmVudCBwcm9jZXNzZXMuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJhcmdzLmgiCi0jaW5jbHVkZSAicHJveHkuaCIKLSNpbmNsdWRlICJwcm94eV9ldmVudC5oIgotI2luY2x1ZGUgInByb3h5X2NtZC5oIgotI2luY2x1ZGUgInByb3h5X3N0ZGlvLmgiCi0jaW5jbHVkZSAiaGFuZGxlci5oIgotCi1zdGF0aWMgaW50CXByb3h5X3N0ZGlvX3N2cl9pbml0KHByb3h5X3N2ciAqLCB2b2lkICoqKTsKLXN0YXRpYyBpbnQJcHJveHlfc3RkaW9fc3ZyX2NyZWF0ZShwcm94eV9zdnIgKiwgaW50KTsKLXN0YXRpYyBpbnQJcHJveHlfc3RkaW9fc3ZyX2Nvbm5lY3QocHJveHlfc3ZyICosIGNoYXIgKiwgaW50KTsKLXN0YXRpYyBpbnQgIHByb3h5X3N0ZGlvX3N2cl9wcm9ncmVzcyhwcm94eV9zdnIgKik7Ci1zdGF0aWMgdm9pZAlwcm94eV9zdGRpb19zdnJfcHJvY2Vzc19jbWRzKHZvaWQpOwotc3RhdGljIHZvaWQJcHJveHlfc3RkaW9fc3ZyX2ZpbmlzaChwcm94eV9zdnIgKik7Ci0KLXN0YXRpYyBpbnQJcHJveHlfc3RkaW9fc3ZyX3JlY3ZfbXNncyhpbnQsIHZvaWQgKik7Ci1zdGF0aWMgaW50CXByb3h5X3N0ZGlvX3N2cl9kaXNwYXRjaChwcm94eV9zdnIgKiwgY2hhciAqLCBpbnQpOwotCi1wcm94eV9zdnJfZnVuY3MgcHJveHlfc3RkaW9fc3ZyX2Z1bmNzID0KLXsKLQlwcm94eV9zdGRpb19zdnJfaW5pdCwKLQlwcm94eV9zdGRpb19zdnJfY3JlYXRlLAotCXByb3h5X3N0ZGlvX3N2cl9jb25uZWN0LAotCXByb3h5X3N0ZGlvX3N2cl9wcm9ncmVzcywKLQlwcm94eV9zdGRpb19zdnJfZmluaXNoLAotfTsKLQotLyoKLSAqIENhbGxlZCBmb3IgZWFjaCBldmVudCB0aGF0IGlzIHBsYWNlZCBvbiB0aGUgZXZlbnQgcXVldWUuCi0gKiBTZW5kcyB0aGUgZXZlbnQgdG8gdGhlIHByb3h5IHBlZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1wcm94eV9zdGRpb19zdnJfZXZlbnRfY2FsbGJhY2sodm9pZCAqZXZfZGF0YSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQJCQkJCWxlbjsKLQlwcm94eV9zdnIgKgkJCXN2ciA9IChwcm94eV9zdnIgKilldl9kYXRhOwotCXByb3h5X3N0ZGlvX2Nvbm4gKgljb25uID0gKHByb3h5X3N0ZGlvX2Nvbm4gKilzdnItPnN2cl9kYXRhOwotCXByb3h5X21zZyAqCQkJbXNnID0gKHByb3h5X21zZyAqKWRhdGE7Ci0JY2hhciAqCQkJCXN0cjsKLQotCWlmIChwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJnN0ciwgJmxlbikgPCAwKSB7Ci0JCS8qCi0JCSAqIFRPRE8gc2hvdWxkIHNlbmQgYW4gZXJyb3IgYmFjayB0byBwcm94eSBwZWVyCi0JCSAqLwotCQlmcHJpbnRmKHN0ZGVyciwgInByb3h5X3N0ZGlvX3N2cl9ldmVudF9jYWxsYmFjazogZXZlbnQgY29udmVyc2lvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JKHZvaWQpcHJveHlfc3RkaW9fc2VuZF9tc2coY29ubiwgc3RyLCBsZW4pOwotCWZyZWUoc3RyKTsKLX0KLQotLyoKLSAqIENhbGxlZCB0byBwcm9jZXNzIGFueSBjb21tYW5kcyBpbiB0aGUgcmVhZCBidWZmZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1wcm94eV9zdGRpb19zdnJfY21kX2NhbGxiYWNrKHZvaWQgKmNtZF9kYXRhLCB2b2lkICpkYXRhKQotewotCWludAkJCQkJCWxlbjsKLQljaGFyICoJCQkJCW1zZyA9IE5VTEw7Ci0JcHJveHlfc3ZyICoJCQkJc3ZyID0gKHByb3h5X3N2ciAqKWNtZF9kYXRhOwotCXByb3h5X3N0ZGlvX2Nvbm4gKgkJY29ubiA9IChwcm94eV9zdGRpb19jb25uICopc3ZyLT5zdnJfZGF0YTsKLQotCWlmIChwcm94eV9zdGRpb19nZXRfbXNnKGNvbm4sICZtc2csICZsZW4pID4gMCkgewotCQlwcm94eV9zdGRpb19zdnJfZGlzcGF0Y2goc3ZyLCBtc2csIGxlbik7Ci0JCWlmIChtc2cgIT0gTlVMTCkgZnJlZShtc2cpOwotCX0KLX0KLQotc3RhdGljIGludAotcHJveHlfc3RkaW9fc3ZyX2luaXQocHJveHlfc3ZyICpzdnIsIHZvaWQgKipkYXRhKQotewotCXByb3h5X3N0ZGlvX2Nvbm4JCSpjb25uOwotCi0JcHJveHlfc3RkaW9fY3JlYXRlX2Nvbm4oJmNvbm4pOwotCWNvbm4tPnN2ciA9IHN2cjsKLQkqZGF0YSA9ICh2b2lkICopY29ubjsKLQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKgotICogQ3JlYXRlIHNlcnZlciBzb2NrZXQgYW5kIGJpbmQgYWRkcmVzcyB0byBpdC4KLSAqCi0gKiBAcmV0dXJuIGNvbm4gc3RydWN0dXJlIGNvbnRhaW5pbmcgc2VydmVyIHNvY2tldCBhbmQgcG9ydAotICovCi1zdGF0aWMgaW50Ci1wcm94eV9zdGRpb19zdnJfY3JlYXRlKHByb3h5X3N2ciAqc3ZyLCBpbnQgcG9ydCkKLXsKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioKLSAqIENvbm5lY3QgdG8gYSByZW1vdGUgcHJveHkuCi0gKi8KLXN0YXRpYyBpbnQKLXByb3h5X3N0ZGlvX3N2cl9jb25uZWN0KHByb3h5X3N2ciAqc3ZyLCBjaGFyICpob3N0LCBpbnQgcG9ydCkKLXsKLQlwcm94eV9zdGRpb19jb25uICoJCWNvbm4gPSAocHJveHlfc3RkaW9fY29ubiAqKXN2ci0+c3ZyX2RhdGE7Ci0KLQljb25uLT5zZXNzX2luID0gMDsKLQljb25uLT5zZXNzX291dCA9IDE7Ci0KLQlSZWdpc3RlckZpbGVIYW5kbGVyKGNvbm4tPnNlc3NfaW4sIFJFQURfRklMRV9IQU5ETEVSLCBwcm94eV9zdGRpb19zdnJfcmVjdl9tc2dzLCAodm9pZCAqKXN2cik7Ci0JUmVnaXN0ZXJFdmVudEhhbmRsZXIoUFJPWFlfRVZFTlRfSEFORExFUiwgcHJveHlfc3RkaW9fc3ZyX2V2ZW50X2NhbGxiYWNrLCAodm9pZCAqKXN2cik7Ci0JUmVnaXN0ZXJFdmVudEhhbmRsZXIoUFJPWFlfQ01EX0hBTkRMRVIsIHByb3h5X3N0ZGlvX3N2cl9jbWRfY2FsbGJhY2ssICh2b2lkICopc3ZyKTsKLQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKgotICogQ2xlYW51cCBwcmlvciB0byBzZXJ2ZXIgZXhpdC4KLSAqLwotc3RhdGljIHZvaWQKLXByb3h5X3N0ZGlvX3N2cl9maW5pc2gocHJveHlfc3ZyICpzdnIpCi17Ci0JcHJveHlfc3RkaW9fY29ubiAqCWNvbm4gPSAocHJveHlfc3RkaW9fY29ubiAqKXN2ci0+c3ZyX2RhdGE7Ci0KLQlpZiAoY29ubi0+c2Vzc19pbiAhPSBJTlZBTElEX1NPQ0tFVCkgewotCQlVbnJlZ2lzdGVyRmlsZUhhbmRsZXIoY29ubi0+c2Vzc19pbik7Ci0JfQotCi0JaWYgKGNvbm4tPnNlc3Nfb3V0ICE9IElOVkFMSURfU09DS0VUKSB7Ci0JCVVucmVnaXN0ZXJGaWxlSGFuZGxlcihjb25uLT5zZXNzX291dCk7Ci0JfQotCi0JcHJveHlfc3RkaW9fZGVzdHJveV9jb25uKGNvbm4pOwotfQotCi0vKioKLSAqIENoZWNrIGZvciBpbmNvbWluZyBtZXNzYWdlcy4KLSAqLwotc3RhdGljIHZvaWQKLXByb3h5X3N0ZGlvX3N2cl9wcm9jZXNzX2NtZHMoKQotewotCUNhbGxFdmVudEhhbmRsZXJzKFBST1hZX0NNRF9IQU5ETEVSLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb3h5X3N0ZGlvX3N2cl9wcm9jZXNzX2V2ZW50cyhwcm94eV9tc2cgKm1zZywgdm9pZCAqZGF0YSkKLXsKLQlDYWxsRXZlbnRIYW5kbGVycyhQUk9YWV9FVkVOVF9IQU5ETEVSLCAodm9pZCAqKW1zZyk7Ci19Ci0KLS8qKgotICogUHJvY2Vzc2VzIGFueSBxdWV1ZWQgZXZlbnRzIEFsc28gY2hlY2tzIGZvciByZWFkeSBmaWxlIGRlc2NyaXB0b3JzCi0gKiBhbmQgY2FsbHMgYXBwcm9wcmlhdGUgaGFuZGxlcnMuCi0gKi8KLXN0YXRpYyBpbnQKLXByb3h5X3N0ZGlvX3N2cl9wcm9ncmVzcyhwcm94eV9zdnIgKnN2cikKLXsKLQlmZF9zZXQJCQkJCXJmZHM7Ci0JZmRfc2V0CQkJCQl3ZmRzOwotCWZkX3NldAkJCQkJZWZkczsKLQlpbnQJCQkJCQlyZXM7Ci0JaW50CQkJCQkJbmZkcyA9IDA7Ci0Jc3RydWN0IHRpbWV2YWwJCQl0djsKLQlzdHJ1Y3QgdGltZXZhbCAqCQl0aW1lb3V0ID0gJnR2OwotCi0JcHJveHlfcHJvY2Vzc19tc2dzKHN2ci0+c3ZyX2V2ZW50cywgcHJveHlfc3RkaW9fc3ZyX3Byb2Nlc3NfZXZlbnRzLCBOVUxMKTsKLQotCS8qIFNldCB1cCBmZCBzZXRzICovCi0JR2VuZXJhdGVGRFNldHMoJm5mZHMsICZyZmRzLCAmd2ZkcywgJmVmZHMpOwotCi0JaWYgKHN2ci0+c3ZyX3RpbWVvdXQgPT0gTlVMTCkgewotCQl0aW1lb3V0ID0gTlVMTDsKLQl9IGVsc2UgewotCQltZW1jcHkoKGNoYXIgKil0aW1lb3V0LCAoY2hhciAqKXN2ci0+c3ZyX3RpbWVvdXQsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCX0KLQotCWZvciAoIDs7ICkgewotCQlyZXMgPSBzZWxlY3QobmZkcysxLCAmcmZkcywgJndmZHMsICZlZmRzLCAmdHYpOwotCi0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgSU5WQUxJRF9TT0NLRVQ6Ci0JCQlpZiAoIGVycm5vID09IEVJTlRSICkKLQkJCQljb250aW51ZTsKLQotCQkJcGVycm9yKCJzb2NrZXQiKTsKLQkJCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCi0JCWNhc2UgMDoKLQkJCS8qIFRpbWVvdXQuICovCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJaWYgKENhbGxGaWxlSGFuZGxlcnMoJnJmZHMsICZ3ZmRzLCAmZWZkcykgPCAwKQotCQkJCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCQl9Ci0KLQkJYnJlYWs7Ci0JfQotCi0JcHJveHlfc3RkaW9fc3ZyX3Byb2Nlc3NfY21kcygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEaXNwYXRjaCBhIGNvbW1hbmQgdG8gdGhlIHNlcnZlcgotICoKLSAqIHByb3h5X3N0ZGlvX3N2cl9kaXNwYXRjaCgpIHNob3VsZCBuZXZlciBmYWlsLiBJZiB3ZSBnZXQgYSByZWFkIGVycm9yIGZyb20gdGhlIGNsaWVudCB0aGVuIHdlIGp1c3QKLSAqIGFzc3VtZSB0aGUgY2xpZW50IGhhcyBnb25lIGF3YXkuIEVycm9ycyBmcm9tIHNlcnZlciBjb21tYW5kcyBhcmUganVzdCByZXBvcnRlZCBiYWNrIHRvIHRoZQotICogY2xpZW50LgotICovCi1zdGF0aWMgaW50Ci1wcm94eV9zdGRpb19zdnJfZGlzcGF0Y2gocHJveHlfc3ZyICpzdnIsIGNoYXIgKm1zZywgaW50IGxlbikKLXsKLQlpbnQJCQkJCWlkeDsKLQljaGFyICoJCQkJZXJyX3N0cjsKLQlwcm94eV9jb21tYW5kcyAqIAljbWRfdGFiID0gc3ZyLT5zdnJfY29tbWFuZHM7Ci0JcHJveHlfbXNnICoJCQltOwotCXByb3h5X2NtZAkJCWNtZDsKLQotCURFQlVHX1BSSU5UKCJTVlIgcmVjZWl2ZWQgPCVzPlxuIiwgbXNnKTsKLQotCWlmIChwcm94eV9kZXNlcmlhbGl6ZV9tc2cobXNnLCBsZW4sICZtKSA8IDApIHsKLQkJcHJveHlfbXNnICplcnIgPSBuZXdfcHJveHlfbXNnKDAsIFBST1hZX0VWX01FU1NBR0UpOwotCQlwcm94eV9tc2dfYWRkX2ludChlcnIsIDMpOyAvKiAzIGF0dHJpYnV0ZXMgKi8KLQkJcHJveHlfbXNnX2FkZF9rZXl2YWxfc3RyaW5nKGVyciwgTVNHX0xFVkVMX0FUVFIsIE1TR19MRVZFTF9GQVRBTCk7Ci0JCXByb3h5X21zZ19hZGRfa2V5dmFsX2ludChlcnIsIE1TR19DT0RFX0FUVFIsIFBST1hZX0VSUl9QUk9UTyk7Ci0JCXByb3h5X21zZ19hZGRfaW50KGVyciwgRVJST1JfTUFMRk9STUVEX0NPTU1BTkQpOwotCQlhc3ByaW50ZigmZXJyX3N0ciwgIm1hbGZvcm1lZCBjb21tYW5kLCBsZW4gaXMgJWQiLCBsZW4pOwotCQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcoZXJyLCBNU0dfVEVYVF9BVFRSLCBlcnJfc3RyKTsKLQkJZnJlZShlcnJfc3RyKTsKLQkJcHJveHlfcXVldWVfbXNnKHN2ci0+c3ZyX2V2ZW50cywgZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0gICAgaWR4ID0gbS0+bXNnX2lkIC0gY21kX3RhYi0+Y21kX2Jhc2U7Ci0KLQlpZiAoaWR4ID49IDAgJiYgaWR4IDwgY21kX3RhYi0+Y21kX3NpemUpIHsKLQkJY21kID0gY21kX3RhYi0+Y21kX2Z1bmNzW2lkeF07Ci0JCWlmIChjbWQgIT0gTlVMTCkgewotCQkJKHZvaWQpY21kKG0tPnRyYW5zX2lkLCBtLT5udW1fYXJncywgbS0+YXJncyk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcm94eV9tc2cgKmVyciA9IG5ld19wcm94eV9tc2coMCwgUFJPWFlfRVZfTUVTU0FHRSk7Ci0JCXByb3h5X21zZ19hZGRfaW50KGVyciwgMyk7IC8qIDMgYXR0cmlidXRlcyAqLwotCQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcoZXJyLCBNU0dfTEVWRUxfQVRUUiwgTVNHX0xFVkVMX0ZBVEFMKTsKLQkJcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KGVyciwgTVNHX0NPREVfQVRUUiwgUFJPWFlfRVJSX1BST1RPKTsKLQkJcHJveHlfbXNnX2FkZF9pbnQoZXJyLCBFUlJPUl9NQUxGT1JNRURfQ09NTUFORCk7Ci0JCWFzcHJpbnRmKCZlcnJfc3RyLCAibWFsZm9ybWVkIGNvbW1hbmQsIGxlbiBpcyAlZCIsIGxlbik7Ci0JCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhlcnIsIE1TR19URVhUX0FUVFIsIGVycl9zdHIpOwotCQlmcmVlKGVycl9zdHIpOwotCQlwcm94eV9xdWV1ZV9tc2coc3ZyLT5zdnJfZXZlbnRzLCBlcnIpOwotCX0KLQotCWZyZWVfcHJveHlfbXNnKG0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb3h5X3N0ZGlvX3N2cl9yZWN2X21zZ3MoaW50IGZkLCB2b2lkICpkYXRhKQotewotCXByb3h5X3N2ciAqCQkJc3ZyID0gKHByb3h5X3N2ciAqKWRhdGE7Ci0JcHJveHlfc3RkaW9fY29ubiAqCWNvbm4gPSAocHJveHlfc3RkaW9fY29ubiAqKXN2ci0+c3ZyX2RhdGE7Ci0KLQlyZXR1cm4gcHJveHlfc3RkaW9fcmVjdl9tc2dzKGNvbm4pOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3N2ci5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3N2ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTI4MDk4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV9zdnIuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBNaXNjZWxsYW5lb3VzIHByb3h5IGZ1bmN0aW9ucy4KLSAqLwotIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotIAotI2luY2x1ZGUgInByb3h5LmgiCi0jaW5jbHVkZSAicHJveHlfY21kLmgiCi0jaW5jbHVkZSAicHJveHlfZXZlbnQuaCIKLQotI2luY2x1ZGUgPGxpc3QuaD4KLQotZXh0ZXJuIHByb3h5X3N2cl9mdW5jcyAJcHJveHlfdGNwX3N2cl9mdW5jczsKLWV4dGVybiBwcm94eV9zdnJfZnVuY3MgCXByb3h5X3N0ZGlvX3N2cl9mdW5jczsKLQotcHJveHkgcHJveGllc1tdID0gewotCXsidGNwIiwgTlVMTCwgTlVMTCwgICZwcm94eV90Y3Bfc3ZyX2Z1bmNzfSwKLQl7InN0ZGlvIiwgTlVMTCwgTlVMTCwgJnByb3h5X3N0ZGlvX3N2cl9mdW5jc30sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Ci19OwotCi1pbnQKLXByb3h5X3N2cl9pbml0KGNoYXIgKm5hbWUsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0LCBwcm94eV9zdnJfaGVscGVyX2Z1bmNzICpzZiwgcHJveHlfY29tbWFuZHMgKmNtZHMsIHByb3h5X3N2ciAqKnN2cikKLXsKLQlwcm94eSAqCQlwOwotCXByb3h5X3N2ciAqCXBzOwotCXZvaWQgKgkJZGF0YTsKLQkKLQlpZiAoZmluZF9wcm94eShuYW1lLCAmcCkgPCAwKQotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQkJCi0JcHMgPSAocHJveHlfc3ZyICopbWFsbG9jKHNpemVvZihwcm94eV9zdnIpKTsKLQlwcy0+cHJveHkgPSBwOwotCXBzLT5zdnJfaGVscGVyX2Z1bmNzID0gc2Y7Ci0JcHMtPnN2cl9jb21tYW5kcyA9IGNtZHM7Ci0JcHMtPnN2cl90aW1lb3V0ID0gTlVMTDsKLQkKLQlpZiAodGltZW91dCAhPSBOVUxMKSB7Ci0JCXBzLT5zdnJfdGltZW91dCA9IChzdHJ1Y3QgdGltZXZhbCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLQkJbWVtY3B5KHBzLT5zdnJfdGltZW91dCwgdGltZW91dCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7Ci0JfQotCQotCWlmIChwLT5zdnJfZnVuY3MtPmluaXQocHMsICZkYXRhKSA8IDApIHsKLQkJZnJlZShwcyk7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCXBzLT5zdnJfZGF0YSA9IGRhdGE7Ci0JcHMtPnN2cl9ldmVudHMgPSBOZXdMaXN0KCk7Ci0JCi0JKnN2ciA9IHBzOwotCQotCXJldHVybiBQUk9YWV9SRVNfT0s7CQotfQotCi1pbnQKLXByb3h5X3N2cl9jcmVhdGUocHJveHlfc3ZyICpwcywgaW50IHBvcnQpCi17Ci0JaWYgKHBzICE9IE5VTEwpCi0JCXJldHVybiBwcy0+cHJveHktPnN2cl9mdW5jcy0+Y3JlYXRlKHBzLCBwb3J0KTsKLQkJCi0JcmV0dXJuIFBST1hZX1JFU19FUlI7Ci19Ci0KLWludAotcHJveHlfc3ZyX2Nvbm5lY3QocHJveHlfc3ZyICpwcywgY2hhciAqaG9zdCwgaW50IHBvcnQpCi17Ci0JaWYgKHBzICE9IE5VTEwpCi0JCXJldHVybiBwcy0+cHJveHktPnN2cl9mdW5jcy0+Y29ubmVjdChwcywgaG9zdCwgcG9ydCk7Ci0JCQotCXJldHVybiBQUk9YWV9SRVNfRVJSOwotfQotCi1pbnQKLXByb3h5X3N2cl9wcm9ncmVzcyhwcm94eV9zdnIgKnBzKQotewotCWlmIChwcyAhPSBOVUxMKQotCQlyZXR1cm4gcHMtPnByb3h5LT5zdnJfZnVuY3MtPnByb2dyZXNzKHBzKTsKLQkKLQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLX0KLQotdm9pZAotcHJveHlfc3ZyX2ZpbmlzaChwcm94eV9zdnIgKnBzKQotewotCWlmIChwcyAhPSBOVUxMKQotCQlwcy0+cHJveHktPnN2cl9mdW5jcy0+ZmluaXNoKHBzKTsKLX0KLQotdm9pZAotcHJveHlfc3ZyX3F1ZXVlX21zZyhwcm94eV9zdnIgKnBzLCBwcm94eV9tc2cgKm1zZykKLXsKLQlwcm94eV9xdWV1ZV9tc2cocHMtPnN2cl9ldmVudHMsIG1zZyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfdGNwLmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfdGNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTQ2MWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3RjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAicHJveHkuaCIKLSNpbmNsdWRlICJwcm94eV90Y3AuaCIKLSNpbmNsdWRlICJwcm94eV9jbWQuaCIKLQotc3RydWN0IHRpbWV2YWwgVENQVElNRU9VVCA9IHsgMjUsIDAgfTsKLQotLyoqCi0gKiBDcmVhdGUgYSBjb25uIHN0cnVjdHVyZS4KLSAqLwotdm9pZAotcHJveHlfdGNwX2NyZWF0ZV9jb25uKHByb3h5X3RjcF9jb25uICoqY29ubikKLXsKLQlwcm94eV90Y3BfY29ubiAqYzsKLQotCWMgPSAocHJveHlfdGNwX2Nvbm4gKikgbWFsbG9jKHNpemVvZihwcm94eV90Y3BfY29ubikpOwotCi0JYy0+c2Vzc19zb2NrID0gSU5WQUxJRF9TT0NLRVQ7Ci0JYy0+c3ZyX3NvY2sgPSBJTlZBTElEX1NPQ0tFVDsKLQljLT5ob3N0ID0gTlVMTDsKLQljLT5wb3J0ID0gMDsKLQljLT5jb25uZWN0ZWQgPSAwOwotCWMtPmJ1Zl9zaXplID0gQlVGU0laOwotCWMtPmJ1ZiA9IChjaGFyICopbWFsbG9jKGMtPmJ1Zl9zaXplKTsKLQljLT5idWZfcG9zID0gMDsKLQljLT50b3RhbF9yZWFkID0gMDsKLQljLT5tc2dfbGVuID0gMDsKLQotCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLQotCSpjb25uID0gYzsKLX0KLQotdm9pZAotcHJveHlfdGNwX2Rlc3Ryb3lfY29ubihwcm94eV90Y3BfY29ubiAqY29ubikKLXsKLQlpZiAoY29ubi0+aG9zdCAhPSBOVUxMKQotCQlmcmVlKGNvbm4tPmhvc3QpOwotCWZyZWUoY29ubi0+YnVmKTsKLQlmcmVlKGNvbm4pOwotfQotCi1zdGF0aWMgaW50Ci10Y3BfcmVjdihwcm94eV90Y3BfY29ubiAqY29ubikKLXsKLQlpbnQJbjsKLQotCWlmIChjb25uLT50b3RhbF9yZWFkID09IGNvbm4tPmJ1Zl9zaXplKSB7Ci0JCWNvbm4tPmJ1Zl9zaXplICs9IEJVRlNJWjsKLQkJY29ubi0+YnVmID0gKGNoYXIgKilyZWFsbG9jKGNvbm4tPmJ1ZiwgY29ubi0+YnVmX3NpemUpOwotCX0KLQotCW4gPSByZWN2KGNvbm4tPnNlc3Nfc29jaywgJmNvbm4tPmJ1Zltjb25uLT5idWZfcG9zXSwgY29ubi0+YnVmX3NpemUgLSBjb25uLT50b3RhbF9yZWFkLCAwKTsKLQlpZiAobiA8PSAwKSB7Ci0JCWlmIChuIDwgMCkKLQkJCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQllbHNlCi0JCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1BST1RPLCAiY29ubmVjdGlvbiB0ZXJtaW5hdGVkIik7Ci0KLQkJQ0xPU0VfU09DS0VUKGNvbm4tPnNlc3Nfc29jayk7Ci0JCWNvbm4tPmNvbm5lY3RlZCA9IDA7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljb25uLT5idWZfcG9zICs9IG47Ci0JY29ubi0+dG90YWxfcmVhZCArPSBuOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcF9zZW5kKHByb3h5X3RjcF9jb25uICpjb25uLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50CQluOwotCi0Jd2hpbGUgKCBsZW4gPiAwICkgewotCQluID0gc2VuZChjb25uLT5zZXNzX3NvY2ssIGJ1ZiwgbGVuLCAwKTsKLQkJaWYgKG4gPD0gMCkgewotCQkJaWYgKG4gPCAwKQotCQkJCXBlcnJvcigic2VuZCIpOwotCQkJQ0xPU0VfU09DS0VUKGNvbm4tPnNlc3Nfc29jayk7Ci0JCQljb25uLT5jb25uZWN0ZWQgPSAwOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJbGVuIC09IG47Ci0JCWJ1ZiArPSBuOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VuZCBhIG1lc3NhZ2UgdG8gYSByZW1vdGUgcGVlci4gcHJveHlfdGNwX3NlbmQoKSB3aWxsIGFsd2F5cyBzZW5kIGEgY29tcGxldGUgbWVzc2FnZS4KLSAqIElmIHRoZSBzZW5kIGZhaWxzIGZvciBhbnkgcmVhc29uLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAqCi0gKiBTaWxlbnRseSB0cnVuY2F0ZXMgbGVuZ3RoIHRvIGEgbWF4aW11bSBvZiAzMiBiaXRzLgotICovCi1pbnQKLXByb3h5X3RjcF9zZW5kX21zZyhwcm94eV90Y3BfY29ubiAqY29ubiwgY2hhciAqbWVzc2FnZSwgaW50IGxlbikKLXsKLQljaGFyIAlidWZbTVNHX0xFTl9TSVpFKzFdOwotCi0JLyoKLQkgKiBTZW5kIG1lc3NhZ2UgbGVuZ3RoIGZpcnN0Ci0JICovCi0Jc3ByaW50ZihidWYsICIlMCp4IiwgTVNHX0xFTl9TSVpFLCBsZW4gJiBNU0dfTEVOR1RIX01BU0spOwotCi0JaWYgKHRjcF9zZW5kKGNvbm4sIGJ1Ziwgc3RybGVuKGJ1ZikpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBOb3cgc2VuZCBtZXNzYWdlCi0JICovCi0KLQlyZXR1cm4gdGNwX3NlbmQoY29ubiwgbWVzc2FnZSwgbGVuKTsKLX0KLQotc3RhdGljIGludAotcHJveHlfdGNwX2dldF9tc2dfbGVuKHByb3h5X3RjcF9jb25uICpjb25uKQotewotCWNoYXIgKgllbmQ7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmVuJ3QgcmVhZCBlbm91Z2ggdGhlbiByZXR1cm4gZm9yIG1vcmUuLi4KLQkgKi8KLQlpZiAoY29ubi0+dG90YWxfcmVhZCA8IE1TR19MRU5fU0laRSkKLQkJcmV0dXJuIDA7Ci0KLQljb25uLT5tc2dfbGVuID0gc3RydG9sKGNvbm4tPmJ1ZiwgJmVuZCwgMTYpOwotCi0JLyoKLQkgKiBjaGVjayBpZiB3ZSd2ZSByZWNlaXZlZCB0aGUgbGVuZ3RoCi0JICovCi0JaWYgKGNvbm4tPm1zZ19sZW4gPT0gMCB8fCAoY29ubi0+bXNnX2xlbiA+IDAgJiYgKmVuZCAhPSAnICcpKSB7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfUFJPVE8sICJjb3VsZCBub3QgdW5kZXJzdGFuZCBtZXNzYWdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gY29ubi0+bXNnX2xlbjsKLX0KLQotc3RhdGljIGludAotcHJveHlfdGNwX2NvcHlfbXNnKHByb3h5X3RjcF9jb25uICpjb25uLCBjaGFyICoqcmVzdWx0KQotewotCWludAluID0gY29ubi0+bXNnX2xlbjsKLQotCSpyZXN1bHQgPSAoY2hhciAqKW1hbGxvYyhjb25uLT5tc2dfbGVuICsgMSk7Ci0JbWVtY3B5KCpyZXN1bHQsICZjb25uLT5idWZbTVNHX0xFTl9TSVpFXSwgY29ubi0+bXNnX2xlbik7Ci0JKCpyZXN1bHQpW2Nvbm4tPm1zZ19sZW5dID0gJ1wwJzsKLQotCS8qCi0JICogTW92ZSByZXN0IG9mIGJ1ZmZlciBkb3duIGlmIG5lY2Vzc2FyeQotCSAqLwotCWlmIChjb25uLT50b3RhbF9yZWFkID4gY29ubi0+bXNnX2xlbiArIE1TR19MRU5fU0laRSkgewotCQljb25uLT50b3RhbF9yZWFkIC09IGNvbm4tPm1zZ19sZW4gKyBNU0dfTEVOX1NJWkU7Ci0JCW1lbW1vdmUoY29ubi0+YnVmLCAmY29ubi0+YnVmW2Nvbm4tPm1zZ19sZW4gKyBNU0dfTEVOX1NJWkVdLCBjb25uLT50b3RhbF9yZWFkKTsKLQl9IGVsc2UgewotCQljb25uLT5idWZfcG9zID0gMDsKLQkJY29ubi0+dG90YWxfcmVhZCA9IDA7Ci0JfQotCi0JY29ubi0+bXNnX2xlbiA9IDA7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGludAotcHJveHlfdGNwX2dldF9tc2dfYm9keShwcm94eV90Y3BfY29ubiAqY29ubiwgY2hhciAqKnJlc3VsdCkKLXsKLQkvKgotCSAqIElmIHdlIGhhdmVuJ3QgcmVhZCBlbm91Z2ggdGhlbiByZXR1cm4gZm9yIG1vcmUuLi4KLQkgKi8KLQlpZiAoY29ubi0+dG90YWxfcmVhZCAtIE1TR19MRU5fU0laRSA8IGNvbm4tPm1zZ19sZW4pCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHByb3h5X3RjcF9jb3B5X21zZyhjb25uLCByZXN1bHQpOwotfQotCi0vKgotICogUmVjZWl2ZSBhIGJ1ZmZlciBmcm9tIGEgcmVtb3RlIHBlZXIuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBidWZmZXIgbWF5IGNvbnRhaW4gYSBwYXJ0aWFsCi0gKiBtZXNzYWdlIG9yIGEgbnVtYmVyIG9mIGNvbXBsZXRlZCBtZXNzYWdlcy4KLSAqCi0gKi8KLWludAotcHJveHlfdGNwX3JlY3ZfbXNncyhwcm94eV90Y3BfY29ubiAqY29ubikKLXsKLQkvKgotCSAqIEdldCB3aGF0ZXZlciBpcyBhdmFpbGFibGUKLQkgKi8KLQlpZiAodGNwX3JlY3YoY29ubikgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCB0aGUgZmlyc3QgYXZhaWxhYmxlIG1lc3NhZ2UgZnJvbSB0aGUgYnVmZmVyLiBSZXBlYXRlZCBjYWxscyB3aWxsIGdldCBzdWJzZXF1ZW50Ci0gKiBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXIuCi0gKgotICogQHJldHVybgkwCW5vIG1lc3NhZ2VzIGF2YWlsYWJsZQotICogCQkJPjAJbWVzc2FnZSBhdmFpbGFibGUsIGxlbmd0aCByZXR1cm5lZAotICogCQkJLTEJZXJyb3IKLSAqLwotaW50Ci1wcm94eV90Y3BfZ2V0X21zZyhwcm94eV90Y3BfY29ubiAqY29ubiwgY2hhciAqKnJlc3VsdCwgaW50ICpsZW4pCi17Ci0JaW50CW47Ci0KLQlpZiAoY29ubi0+bXNnX2xlbiA9PSAwICYmIChuID0gcHJveHlfdGNwX2dldF9tc2dfbGVuKGNvbm4pKSA8PSAwKQotCQlyZXR1cm4gbjsKLQotCSpsZW4gPSBjb25uLT5tc2dfbGVuOwotCXJldHVybiBwcm94eV90Y3BfZ2V0X21zZ19ib2R5KGNvbm4sIHJlc3VsdCk7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgc3RyaW5nIGFyZ3VtZW50Ci0gKi8KLWludAotcHJveHlfdGNwX2RlY29kZV9zdHJpbmcoY2hhciAqc3RyLCBjaGFyICoqYXJnLCBjaGFyICoqZW5kKQotewotCWludAkJYXJnX2xlbjsKLQlpbnQgCXN0cl9sZW4gPSBzdHJsZW4oc3RyKTsKLQljaGFyICoJZXA7Ci0JY2hhciAqCXA7Ci0KLQlpZiAoc3RyX2xlbiA8IE1TR19BUkdfTEVOX1NJWkUgKyAxKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQllcCA9IHN0ciArIE1TR19BUkdfTEVOX1NJWkU7Ci0JKmVwKysgPSAnXDAnOwotCWFyZ19sZW4gPSBzdHJ0b2woc3RyLCBOVUxMLCAxNik7Ci0KLQlpZiAoc3RyX2xlbiA8IE1TR19BUkdfTEVOX1NJWkUgKyBhcmdfbGVuICsgMSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcCA9IChjaGFyICopbWFsbG9jKGFyZ19sZW4gKyAxKTsKLQltZW1jcHkocCwgZXAsIGFyZ19sZW4pOwotCXBbYXJnX2xlbl0gPSAnXDAnOwotCi0JKmFyZyA9IHA7Ci0JKmVuZCA9IHN0ciArIE1TR19BUkdfTEVOX1NJWkUgKyBhcmdfbGVuICsgMTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3RjcF9jbG50LmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfdGNwX2NsbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5MTkxYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS9zcmMvcHJveHlfdGNwX2NsbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhlIHByb3h5IGhhbmRsZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgZGVidWcgbGlicmFyeSBBUEkgYW5kIHRoZQotICogY2xpZW50IGRlYnVnZ2VyLCBzaW5jZSB0aGV5IG1heSBiZSBydW5uaW5nIG9uIGRpZmZlcmVudCBob3N0cywgYW5kIHdpbGwKLSAqIGNlcnRhaW5seSBiZSBydW5uaW5nIGluIGRpZmZlcmVudCBwcm9jZXNzZXMuCi0gKi8KLQotI2lmZGVmIF9fZ251X2xpbnV4X18KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZiAvKiBfX2dudV9saW51eF9fICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X2V2ZW50LmgiCi0jaW5jbHVkZSAicHJveHlfdGNwLmgiCi0jaW5jbHVkZSAiaGFuZGxlci5oIgotCi1zdHJ1Y3QgdGltZXZhbAlTRUxFQ1RfVElNRU9VVCA9IHswLCAxMDAwfTsKLQotc3RhdGljIGludCBwcm94eV90Y3BfY2xudF9pbml0KHByb3h5X2NsbnQgKiwgdm9pZCAqKiwgY2hhciAqLCB2YV9saXN0KTsKLXN0YXRpYyBpbnQgcHJveHlfdGNwX2NsbnRfY29ubmVjdChwcm94eV9jbG50ICopOwotc3RhdGljIGludCBwcm94eV90Y3BfY2xudF9jcmVhdGUocHJveHlfY2xudCAqKTsKLXN0YXRpYyBpbnQgcHJveHlfdGNwX2NsbnRfYWNjZXB0KGludCwgdm9pZCAqKTsKLXN0YXRpYyBpbnQgcHJveHlfdGNwX2NsbnRfcHJvZ3Jlc3MocHJveHlfY2xudCAqKTsKLXN0YXRpYyB2b2lkCXByb3h5X3RjcF9jbG50X2V2ZW50X2NhbGxiYWNrKHZvaWQgKiwgdm9pZCAqKTsKLXN0YXRpYyB2b2lkCXByb3h5X3RjcF9jbG50X2NtZF9jYWxsYmFjayh2b2lkICosIHZvaWQgKik7Ci0KLQotcHJveHlfY2xudF9mdW5jcyBwcm94eV90Y3BfY2xudF9mdW5jcyA9Ci17Ci0JcHJveHlfdGNwX2NsbnRfaW5pdCwKLQlwcm94eV90Y3BfY2xudF9jb25uZWN0LAotCXByb3h5X3RjcF9jbG50X2NyZWF0ZSwKLQlwcm94eV90Y3BfY2xudF9wcm9ncmVzcywKLX07Ci0KLXN0YXRpYyBpbnQKLXByb3h5X3RjcF9jbG50X3JlY3ZfbXNncyhpbnQgZmQsIHZvaWQgKmRhdGEpCi17Ci0JcHJveHlfY2xudCAqCQkJCWNsbnQgPSAocHJveHlfY2xudCAqKWRhdGE7Ci0JcHJveHlfdGNwX2Nvbm4gKgkJCWNvbm4gPSAocHJveHlfdGNwX2Nvbm4gKiljbG50LT5jbG50X2RhdGE7Ci0KLQlyZXR1cm4gcHJveHlfdGNwX3JlY3ZfbXNncyhjb25uKTsKLX0KLQotLyoKLSAqIENMSUVOVCBGVU5DVElPTlMKLSAqLwotc3RhdGljIGludAotcHJveHlfdGNwX2NsbnRfaW5pdChwcm94eV9jbG50ICpwYywgdm9pZCAqKmRhdGEsIGNoYXIgKmF0dHIsIHZhX2xpc3QgYXApCi17Ci0JaW50CQkJCQlwb3J0OwotCWNoYXIgKgkJCQlob3N0ID0gTlVMTDsKLQlwcm94eV90Y3BfY29ubiAqCQljb25uOwotCi0Jd2hpbGUgKGF0dHIgIT0gTlVMTCkgewotCQlpZiAoc3RyY21wKGF0dHIsICJob3N0IikgPT0gMCkKLQkJCWhvc3QgPSBzdHJkdXAodmFfYXJnKGFwLCBjaGFyICopKTsKLQkJZWxzZSBpZiAoc3RyY21wKGF0dHIsICJwb3J0IikgPT0gMCkKLQkJCXBvcnQgPSB2YV9hcmcoYXAsIGludCk7Ci0KLQkJYXR0ciA9IHZhX2FyZyhhcCwgY2hhciAqKTsKLQl9Ci0KLQlwcm94eV90Y3BfY3JlYXRlX2Nvbm4oJmNvbm4pOwotCi0JY29ubi0+Y2xudCA9IHBjOwotCWlmIChob3N0ICE9IE5VTEwpCi0JCWNvbm4tPmhvc3QgPSBzdHJkdXAoaG9zdCk7Ci0JY29ubi0+cG9ydCA9IHBvcnQ7Ci0KLQkqZGF0YSA9ICh2b2lkICopY29ubjsKLQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKgotICogQ29ubmVjdCB0byBhIHJlbW90ZSBwcm94eS4KLSAqLwotc3RhdGljIGludAotcHJveHlfdGNwX2NsbnRfY29ubmVjdChwcm94eV9jbG50ICpwYykKLXsKLQlTT0NLRVQJCQkJCXNkOwotCXN0cnVjdCBob3N0ZW50ICoJCQlocDsKLQlsb25nIGludAkJCQkJaGFkZHI7Ci0Jc3RydWN0IHNvY2thZGRyX2luCQlzY2tldDsKLQlwcm94eV90Y3BfY29ubiAqCQkJY29ubiA9IChwcm94eV90Y3BfY29ubiAqKXBjLT5jbG50X2RhdGE7Ci0KLQlpZiAoY29ubi0+aG9zdCA9PSBOVUxMKSB7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfQ0xJRU5ULCAibm8gaG9zdCBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0JaHAgPSBnZXRob3N0YnluYW1lKGNvbm4tPmhvc3QpOwotCi0JaWYgKGhwID09IChzdHJ1Y3QgaG9zdGVudCAqKU5VTEwpIHsKLQkJcHJveHlfc2V0X2Vycm9yKFBST1hZX0VSUl9DTElFTlQsICJjb3VsZCBub3QgZmluZCBob3N0Iik7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCWhhZGRyID0gKChocC0+aF9hZGRyWzBdICYgMHhmZikgPDwgMjQpIHwKLQkJCSgoaHAtPmhfYWRkclsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0JCQkoKGhwLT5oX2FkZHJbMl0gJiAweGZmKSA8PCAgOCkgfAotCQkJKChocC0+aF9hZGRyWzNdICYgMHhmZikgPDwgIDApOwotCi0JaWYgKCAoc2QgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSBJTlZBTElEX1NPQ0tFVCApCi0JewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0JbWVtc2V0ICgmc2NrZXQsMCxzaXplb2Yoc2NrZXQpKTsKLQlzY2tldC5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKLQlzY2tldC5zaW5fcG9ydCA9IGh0b25zKCh1X3Nob3J0KSBjb25uLT5wb3J0KTsKLQlzY2tldC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChoYWRkcik7Ci0KLQlpZiAoIGNvbm5lY3Qoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNja2V0LCBzaXplb2Yoc2NrZXQpKSA9PSBTT0NLRVRfRVJST1IgKQotCXsKLQkJcHJveHlfc2V0X2Vycm9yKFBST1hZX0VSUl9TWVNURU0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCUNMT1NFX1NPQ0tFVChzZCk7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCWNvbm4tPnNlc3Nfc29jayA9IHNkOwotCWNvbm4tPmNvbm5lY3RlZCsrOwotCi0JUmVnaXN0ZXJFdmVudEhhbmRsZXIoUFJPWFlfRVZFTlRfSEFORExFUiwgcHJveHlfdGNwX2NsbnRfZXZlbnRfY2FsbGJhY2ssICh2b2lkICopcGMpOwotCVJlZ2lzdGVyRXZlbnRIYW5kbGVyKFBST1hZX0NNRF9IQU5ETEVSLCBwcm94eV90Y3BfY2xudF9jbWRfY2FsbGJhY2ssICh2b2lkICopcGMpOwotCVJlZ2lzdGVyRmlsZUhhbmRsZXIoc2QsIFJFQURfRklMRV9IQU5ETEVSLCBwcm94eV90Y3BfY2xudF9yZWN2X21zZ3MsICh2b2lkICopcGMpOwotCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotc3RhdGljIGludAotcHJveHlfdGNwX2NsbnRfY3JlYXRlKHByb3h5X2NsbnQgKnBjKQotewotCXNvY2tsZW5fdAkJCQlzbGVuOwotCVNPQ0tFVAkJCQkJc2Q7Ci0Jc3RydWN0IHNvY2thZGRyX2luCQlzbmFtZTsKLQlwcm94eV90Y3BfY29ubiAqCQljb25uID0gKHByb3h5X3RjcF9jb25uICopcGMtPmNsbnRfZGF0YTsKLQotCWlmICggKHNkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gSU5WQUxJRF9TT0NLRVQgKQotCXsKLQkJcHJveHlfc2V0X2Vycm9yKFBST1hZX0VSUl9TWVNURU0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCW1lbXNldCAoJnNuYW1lLCAwLCBzaXplb2Yoc25hbWUpKTsKLQlzbmFtZS5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKLQlzbmFtZS5zaW5fcG9ydCA9IGh0b25zKGNvbm4tPnBvcnQpOwotCXNuYW1lLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotCi0JaWYgKGJpbmQoc2QsKHN0cnVjdCBzb2NrYWRkciAqKSAmc25hbWUsIHNpemVvZihzbmFtZSkpID09IFNPQ0tFVF9FUlJPUiApCi0JewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJQ0xPU0VfU09DS0VUKHNkKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0Jc2xlbiA9IHNpemVvZihzbmFtZSk7Ci0KLQlpZiAoIGdldHNvY2tuYW1lKHNkLCAoc3RydWN0IHNvY2thZGRyICopJnNuYW1lLCAmc2xlbikgPT0gU09DS0VUX0VSUk9SICkKLQl7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQlDTE9TRV9TT0NLRVQoc2QpOwotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQl9Ci0KLQlpZiAoIGxpc3RlbihzZCwgNSkgPT0gU09DS0VUX0VSUk9SICkKLQl7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQlDTE9TRV9TT0NLRVQoc2QpOwotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQl9Ci0KLQljb25uLT5zdnJfc29jayA9IHNkOwotCWNvbm4tPnBvcnQgPSAoaW50KSBudG9ocyhzbmFtZS5zaW5fcG9ydCk7Ci0KLQlSZWdpc3RlckZpbGVIYW5kbGVyKHNkLCBSRUFEX0ZJTEVfSEFORExFUiwgcHJveHlfdGNwX2NsbnRfYWNjZXB0LCAodm9pZCAqKXBjKTsKLQlSZWdpc3RlckV2ZW50SGFuZGxlcihQUk9YWV9FVkVOVF9IQU5ETEVSLCBwcm94eV90Y3BfY2xudF9ldmVudF9jYWxsYmFjaywgKHZvaWQgKilwYyk7Ci0JUmVnaXN0ZXJFdmVudEhhbmRsZXIoUFJPWFlfQ01EX0hBTkRMRVIsIHByb3h5X3RjcF9jbG50X2NtZF9jYWxsYmFjaywgKHZvaWQgKilwYyk7Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi1zdGF0aWMgaW50Ci1wcm94eV90Y3BfY2xudF9hY2NlcHQoaW50IGZkLCB2b2lkICpkYXRhKQotewotCVNPQ0tFVAkJCQkJbnM7Ci0Jc29ja2xlbl90CQkJCWZyb21sZW47Ci0Jc3RydWN0IHNvY2thZGRyCQkJYWRkcjsKLQlwcm94eV9jbG50ICoJCQlwYyA9IChwcm94eV9jbG50ICopZGF0YTsKLQlwcm94eV90Y3BfY29ubiAqCQljb25uID0gKHByb3h5X3RjcF9jb25uICopcGMtPmNsbnRfZGF0YTsKLQotCWZyb21sZW4gPSBzaXplb2YoYWRkcik7Ci0JbnMgPSBhY2NlcHQoZmQsICZhZGRyLCAmZnJvbWxlbik7Ci0JaWYgKG5zIDwgMCkgewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0JLyoKLQkgKiBPbmx5IGFsbG93IG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZS4KLQkgKi8KLQlpZiAoY29ubi0+c2Vzc19zb2NrICE9IElOVkFMSURfU09DS0VUKSB7Ci0JCUNMT1NFX1NPQ0tFVChucyk7IC8vIHJlamVjdAotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCWNvbm4tPnNlc3Nfc29jayA9IG5zOwotCWNvbm4tPmNvbm5lY3RlZCsrOwotCi0JUmVnaXN0ZXJGaWxlSGFuZGxlcihucywgUkVBRF9GSUxFX0hBTkRMRVIsIHByb3h5X3RjcF9jbG50X3JlY3ZfbXNncywgKHZvaWQgKilwYyk7Ci0KLQlpZiAocGMtPmNsbnRfaGVscGVyX2Z1bmNzLT5ldmVudGhhbmRsZXIgIT0gTlVMTCkgewotCQlwcm94eV9tc2cgKm0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX0NPTk5FQ1RFRCwgMCk7IC8vIFRPRE8gdHJhbnMgaWQgc2hvdWxkIE5PVCBiZSAwCi0JCXByb3h5X3F1ZXVlX21zZyhwYy0+Y2xudF9ldmVudHMsIG0pOwotCQlwYy0+Y2xudF9oZWxwZXJfZnVuY3MtPmV2ZW50aGFuZGxlcihtLCBwYy0+Y2xudF9oZWxwZXJfZnVuY3MtPmV2ZW50ZGF0YSk7Ci0JCWZyZWVfcHJveHlfbXNnKG0pOwotCX0KLQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXByb3h5X3RjcF9jbG50X3Byb2Nlc3NfY21kcygpCi17Ci0JQ2FsbEV2ZW50SGFuZGxlcnMoUFJPWFlfQ01EX0hBTkRMRVIsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZAotcHJveHlfdGNwX2NsbnRfcHJvY2Vzc19ldmVudHMocHJveHlfbXNnICptc2csIHZvaWQgKmRhdGEpCi17Ci0JQ2FsbEV2ZW50SGFuZGxlcnMoUFJPWFlfRVZFTlRfSEFORExFUiwgKHZvaWQgKiltc2cpOwotfQotCi1zdGF0aWMgaW50Ci1wcm94eV90Y3BfY2xudF9wcm9ncmVzcyhwcm94eV9jbG50ICpjbG50KQotewotCWZkX3NldAkJCQkJcmZkczsKLQlmZF9zZXQJCQkJCXdmZHM7Ci0JZmRfc2V0CQkJCQllZmRzOwotCWludAkJCQkJCXJlczsKLQlpbnQJCQkJCQluZmRzID0gMDsKLQlzdHJ1Y3QgdGltZXZhbAkJCXR2OwotCXN0cnVjdCB0aW1ldmFsICoJCXRpbWVvdXQgPSAmdHY7Ci0KLQlwcm94eV9wcm9jZXNzX21zZ3MoY2xudC0+Y2xudF9ldmVudHMsIHByb3h5X3RjcF9jbG50X3Byb2Nlc3NfZXZlbnRzLCBOVUxMKTsKLQotCS8qIFNldCB1cCBmZCBzZXRzICovCi0JR2VuZXJhdGVGRFNldHMoJm5mZHMsICZyZmRzLCAmd2ZkcywgJmVmZHMpOwotCi0JaWYgKGNsbnQtPmNsbnRfdGltZW91dCA9PSBOVUxMKSB7Ci0JCXRpbWVvdXQgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCW1lbWNweSgoY2hhciAqKXRpbWVvdXQsIChjaGFyICopY2xudC0+Y2xudF90aW1lb3V0LCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLQl9Ci0KLQlmb3IgKCA7OyApIHsKLQkJcmVzID0gc2VsZWN0KG5mZHMrMSwgJnJmZHMsICZ3ZmRzLCAmZWZkcywgJnR2KTsKLQotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIElOVkFMSURfU09DS0VUOgotCQkJaWYgKCBlcnJubyA9PSBFSU5UUiApCi0JCQkJY29udGludWU7Ci0KLQkJCXBlcnJvcigic29ja2V0Iik7Ci0JCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQotCQljYXNlIDA6Ci0JCQkvKiBUaW1lb3V0LiAqLwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWlmIChDYWxsRmlsZUhhbmRsZXJzKCZyZmRzLCAmd2ZkcywgJmVmZHMpIDwgMCkKLQkJCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQkJfQotCi0JCWJyZWFrOwotCX0KLQotCXByb3h5X3RjcF9jbG50X3Byb2Nlc3NfY21kcygpOwotCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotLyoKLSAqIFJlYWRzIGV2ZW50cyBmcm9tIHByb3h5IHBlZXIgYW5kIGRpc3BhdGNoZXMgdGhlbS4KLSAqLwotc3RhdGljIHZvaWQKLXByb3h5X3RjcF9jbG50X2V2ZW50X2NhbGxiYWNrKHZvaWQgKmV2X2RhdGEsIHZvaWQgKmRhdGEpCi17Ci0JaW50CQkJCQkJbGVuOwotCWNoYXIgKgkJCQkJcmVzdWx0OwotCXByb3h5X21zZyAqCQkJCW07Ci0JcHJveHlfY2xudCAqCQkJY2xudCA9IChwcm94eV9jbG50ICopZXZfZGF0YTsKLQlwcm94eV90Y3BfY29ubiAqCQljb25uID0gKHByb3h5X3RjcF9jb25uICopY2xudC0+Y2xudF9kYXRhOwotCi0JaWYgKHByb3h5X3RjcF9nZXRfbXNnKGNvbm4sICZyZXN1bHQsICZsZW4pIDw9IDAgfHwKLQkJY2xudC0+Y2xudF9oZWxwZXJfZnVuY3MtPmV2ZW50aGFuZGxlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocHJveHlfZGVzZXJpYWxpemVfbXNnKHJlc3VsdCwgbGVuLCAmbSkgPCAwKSB7Ci0JCW0gPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX01FU1NBR0UsIDApOyAvLyBUT0RPIHRyYW5zIGlkIHNob3VsZCBOT1QgYmUgMAotCQlwcm94eV9tc2dfYWRkX2ludChtLCAzKTsgLyogMyBhdHRyaWJ1dGVzICovCi0JCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBNU0dfTEVWRUxfQVRUUiwgTVNHX0xFVkVMX0ZBVEFMKTsKLQkJcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KG0sIE1TR19DT0RFX0FUVFIsIFBST1hZX0VSUl9QUk9UTyk7Ci0JCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtLCBNU0dfVEVYVF9BVFRSLCAiQ291bGQgbm90IGNvdmVydCB0byBldmVudCIpOwotCX0KLQotCWZyZWUocmVzdWx0KTsKLQotCWNsbnQtPmNsbnRfaGVscGVyX2Z1bmNzLT5ldmVudGhhbmRsZXIobSwgY2xudC0+Y2xudF9oZWxwZXJfZnVuY3MtPmV2ZW50ZGF0YSk7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgdG8gcHJvY2VzcyBhbnkgY29tbWFuZHMgd2FpdGluZyB0byBiZSBzZW50LiBUaGUgY29tbWFuZAotICogaXMgc2VudCB0byB0aGUgcHJveHkgcGVlci4KLSAqLwotc3RhdGljIHZvaWQKLXByb3h5X3RjcF9jbG50X2NtZF9jYWxsYmFjayh2b2lkICpjbWRfZGF0YSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQJCQkJCQlsZW47Ci0JY2hhciAqCQkJCQlzdHI7Ci0JcHJveHlfY2xudCAqCQkJY2xudCA9IChwcm94eV9jbG50ICopY21kX2RhdGE7Ci0JcHJveHlfdGNwX2Nvbm4gKgkJY29ubiA9IChwcm94eV90Y3BfY29ubiAqKWNsbnQtPmNsbnRfZGF0YTsKLQlwcm94eV9tc2cgKgkJCQltc2cgPSAocHJveHlfbXNnICopZGF0YTsKLQotCWlmIChwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJnN0ciwgJmxlbikgPCAwKSB7Ci0JCS8qCi0JCSAqIFRPRE8gc2hvdWxkIHNlbmQgYW4gZXJyb3IgYmFjayB0byBwcm94eSBwZWVyCi0JCSAqLwotCQlmcHJpbnRmKHN0ZGVyciwgInByb3h5X3RjcF9zdnJfZXZlbnRfY2FsbGJhY2s6IGV2ZW50IGNvbnZlcnNpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCSh2b2lkKXByb3h5X3RjcF9zZW5kX21zZyhjb25uLCBzdHIsIGxlbik7Ci0JZnJlZShzdHIpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3RjcF9zdnIuYyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5L3NyYy9wcm94eV90Y3Bfc3ZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTliOTUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkvc3JjL3Byb3h5X3RjcF9zdnIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhlIHByb3h5IGhhbmRsZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgZGVidWcgbGlicmFyeSBBUEkgYW5kIHRoZQotICogY2xpZW50IGRlYnVnZ2VyLCBzaW5jZSB0aGV5IG1heSBiZSBydW5uaW5nIG9uIGRpZmZlcmVudCBob3N0cywgYW5kIHdpbGwKLSAqIGNlcnRhaW5seSBiZSBydW5uaW5nIGluIGRpZmZlcmVudCBwcm9jZXNzZXMuCi0gKi8KLSNpbmNsdWRlIDxjb25maWcuaD4KLQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiYXJncy5oIgotI2luY2x1ZGUgInByb3h5LmgiCi0jaW5jbHVkZSAicHJveHlfZXZlbnQuaCIKLSNpbmNsdWRlICJwcm94eV9jbWQuaCIKLSNpbmNsdWRlICJwcm94eV90Y3AuaCIKLSNpbmNsdWRlICJoYW5kbGVyLmgiCi0KLXN0YXRpYyBpbnQJcHJveHlfdGNwX3N2cl9pbml0KHByb3h5X3N2ciAqLCB2b2lkICoqKTsKLXN0YXRpYyBpbnQJcHJveHlfdGNwX3N2cl9jcmVhdGUocHJveHlfc3ZyICosIGludCk7Ci1zdGF0aWMgaW50CXByb3h5X3RjcF9zdnJfY29ubmVjdChwcm94eV9zdnIgKiwgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCAgcHJveHlfdGNwX3N2cl9wcm9ncmVzcyhwcm94eV9zdnIgKik7Ci1zdGF0aWMgdm9pZAlwcm94eV90Y3Bfc3ZyX3Byb2Nlc3NfY21kcyh2b2lkKTsKLXN0YXRpYyB2b2lkCXByb3h5X3RjcF9zdnJfZmluaXNoKHByb3h5X3N2ciAqKTsKLQotc3RhdGljIGludAlwcm94eV90Y3Bfc3ZyX3JlY3ZfbXNncyhpbnQsIHZvaWQgKik7Ci1zdGF0aWMgaW50CXByb3h5X3RjcF9zdnJfYWNjZXB0KGludCwgdm9pZCAqKTsKLXN0YXRpYyBpbnQJcHJveHlfdGNwX3N2cl9kaXNwYXRjaChwcm94eV9zdnIgKiwgY2hhciAqLCBpbnQpOwotCi1wcm94eV9zdnJfZnVuY3MgcHJveHlfdGNwX3N2cl9mdW5jcyA9Ci17Ci0JcHJveHlfdGNwX3N2cl9pbml0LAotCXByb3h5X3RjcF9zdnJfY3JlYXRlLAotCXByb3h5X3RjcF9zdnJfY29ubmVjdCwKLQlwcm94eV90Y3Bfc3ZyX3Byb2dyZXNzLAotCXByb3h5X3RjcF9zdnJfZmluaXNoLAotfTsKLQotLyoKLSAqIENhbGxlZCBmb3IgZWFjaCBldmVudCB0aGF0IGlzIHBsYWNlZCBvbiB0aGUgZXZlbnQgcXVldWUuCi0gKiBTZW5kcyB0aGUgZXZlbnQgdG8gdGhlIHByb3h5IHBlZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1wcm94eV90Y3Bfc3ZyX2V2ZW50X2NhbGxiYWNrKHZvaWQgKmV2X2RhdGEsIHZvaWQgKmRhdGEpCi17Ci0JaW50CQkJCQlsZW47Ci0JcHJveHlfc3ZyICoJCQlzdnIgPSAocHJveHlfc3ZyICopZXZfZGF0YTsKLQlwcm94eV90Y3BfY29ubiAqCWNvbm4gPSAocHJveHlfdGNwX2Nvbm4gKilzdnItPnN2cl9kYXRhOwotCXByb3h5X21zZyAqCQkJbXNnID0gKHByb3h5X21zZyAqKWRhdGE7Ci0JY2hhciAqCQkJCXN0cjsKLQotCWlmIChwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJnN0ciwgJmxlbikgPCAwKSB7Ci0JCS8qCi0JCSAqIFRPRE8gc2hvdWxkIHNlbmQgYW4gZXJyb3IgYmFjayB0byBwcm94eSBwZWVyCi0JCSAqLwotCQlmcHJpbnRmKHN0ZGVyciwgInByb3h5X3RjcF9zdnJfZXZlbnRfY2FsbGJhY2s6IGV2ZW50IGNvbnZlcnNpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCSh2b2lkKXByb3h5X3RjcF9zZW5kX21zZyhjb25uLCBzdHIsIGxlbik7Ci0JZnJlZShzdHIpOwotfQotCi0vKgotICogQ2FsbGVkIHRvIHByb2Nlc3MgYW55IGNvbW1hbmRzIGluIHRoZSByZWFkIGJ1ZmZlci4KLSAqLwotc3RhdGljIHZvaWQKLXByb3h5X3RjcF9zdnJfY21kX2NhbGxiYWNrKHZvaWQgKmNtZF9kYXRhLCB2b2lkICpkYXRhKQotewotCWludAkJCQkJCWxlbjsKLQljaGFyICoJCQkJCW1zZyA9IE5VTEw7Ci0JcHJveHlfc3ZyICoJCQkJc3ZyID0gKHByb3h5X3N2ciAqKWNtZF9kYXRhOwotCXByb3h5X3RjcF9jb25uICoJCWNvbm4gPSAocHJveHlfdGNwX2Nvbm4gKilzdnItPnN2cl9kYXRhOwotCi0JaWYgKHByb3h5X3RjcF9nZXRfbXNnKGNvbm4sICZtc2csICZsZW4pID4gMCkgewotCQlwcm94eV90Y3Bfc3ZyX2Rpc3BhdGNoKHN2ciwgbXNnLCBsZW4pOwotCQlpZiAobXNnICE9IE5VTEwpIGZyZWUobXNnKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXByb3h5X3RjcF9zdnJfaW5pdChwcm94eV9zdnIgKnN2ciwgdm9pZCAqKmRhdGEpCi17Ci0JcHJveHlfdGNwX2Nvbm4JCSpjb25uOwotCi0JcHJveHlfdGNwX2NyZWF0ZV9jb25uKCZjb25uKTsKLQljb25uLT5zdnIgPSBzdnI7Ci0JKmRhdGEgPSAodm9pZCAqKWNvbm47Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioKLSAqIENyZWF0ZSBzZXJ2ZXIgc29ja2V0IGFuZCBiaW5kIGFkZHJlc3MgdG8gaXQuCi0gKgotICogQHJldHVybiBjb25uIHN0cnVjdHVyZSBjb250YWluaW5nIHNlcnZlciBzb2NrZXQgYW5kIHBvcnQKLSAqLwotc3RhdGljIGludAotcHJveHlfdGNwX3N2cl9jcmVhdGUocHJveHlfc3ZyICpzdnIsIGludCBwb3J0KQotewotCXNvY2tsZW5fdAkJCQlzbGVuOwotCVNPQ0tFVAkJCQkJc2Q7Ci0Jc3RydWN0IHNvY2thZGRyX2luCQlzbmFtZTsKLQlwcm94eV90Y3BfY29ubiAqCQljb25uID0gKHByb3h5X3RjcF9jb25uICopc3ZyLT5zdnJfZGF0YTsKLQotCWlmICggKHNkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gSU5WQUxJRF9TT0NLRVQgKQotCXsKLQkJcHJveHlfc2V0X2Vycm9yKFBST1hZX0VSUl9TWVNURU0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCW1lbXNldCAoJnNuYW1lLCAwLCBzaXplb2Yoc25hbWUpKTsKLQlzbmFtZS5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKLQlzbmFtZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCXNuYW1lLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotCi0JaWYgKGJpbmQoc2QsKHN0cnVjdCBzb2NrYWRkciAqKSAmc25hbWUsIHNpemVvZihzbmFtZSkpID09IFNPQ0tFVF9FUlJPUiApCi0JewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJQ0xPU0VfU09DS0VUKHNkKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0Jc2xlbiA9IHNpemVvZihzbmFtZSk7Ci0KLQlpZiAoIGdldHNvY2tuYW1lKHNkLCAoc3RydWN0IHNvY2thZGRyICopJnNuYW1lLCAmc2xlbikgPT0gU09DS0VUX0VSUk9SICkKLQl7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQlDTE9TRV9TT0NLRVQoc2QpOwotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQl9Ci0KLQlpZiAoIGxpc3RlbihzZCwgNSkgPT0gU09DS0VUX0VSUk9SICkKLQl7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQlDTE9TRV9TT0NLRVQoc2QpOwotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQl9Ci0KLQljb25uLT5zdnJfc29jayA9IHNkOwotCWNvbm4tPnBvcnQgPSAoaW50KSBudG9ocyhzbmFtZS5zaW5fcG9ydCk7Ci0KLQlSZWdpc3RlckZpbGVIYW5kbGVyKHNkLCBSRUFEX0ZJTEVfSEFORExFUiwgcHJveHlfdGNwX3N2cl9hY2NlcHQsICh2b2lkICopc3ZyKTsKLQlSZWdpc3RlckV2ZW50SGFuZGxlcihQUk9YWV9FVkVOVF9IQU5ETEVSLCBwcm94eV90Y3Bfc3ZyX2V2ZW50X2NhbGxiYWNrLCAodm9pZCAqKXN2cik7Ci0JUmVnaXN0ZXJFdmVudEhhbmRsZXIoUFJPWFlfQ01EX0hBTkRMRVIsIHByb3h5X3RjcF9zdnJfY21kX2NhbGxiYWNrLCAodm9pZCAqKXN2cik7Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioKLSAqIENvbm5lY3QgdG8gYSByZW1vdGUgcHJveHkuCi0gKi8KLXN0YXRpYyBpbnQKLXByb3h5X3RjcF9zdnJfY29ubmVjdChwcm94eV9zdnIgKnN2ciwgY2hhciAqaG9zdCwgaW50IHBvcnQpCi17Ci0JU09DS0VUCQkJCQlzZDsKLQlzdHJ1Y3QgaG9zdGVudCAqCQlocDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4JCXNja2V0OwotCXByb3h5X3RjcF9jb25uICoJCWNvbm4gPSAocHJveHlfdGNwX2Nvbm4gKilzdnItPnN2cl9kYXRhOwotCi0JaWYgKGhvc3QgPT0gTlVMTCkgewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NFUlZFUiwgIm5vIGhvc3Qgc3BlY2lmaWVkIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKLQotCWlmIChocCA9PSAoc3RydWN0IGhvc3RlbnQgKilOVUxMKSB7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU0VSVkVSLCAiY291bGQgbm90IGZpbmQgaG9zdCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQl9Ci0KLQlpZiAoIChzZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IElOVkFMSURfU09DS0VUICkKLQl7Ci0JCXByb3h5X3NldF9lcnJvcihQUk9YWV9FUlJfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLQl9Ci0KLQltZW1zZXQgKCZzY2tldCwwLHNpemVvZihzY2tldCkpOwotCXNja2V0LnNpbl9mYW1pbHkgPSBQRl9JTkVUOwotCXNja2V0LnNpbl9wb3J0ID0gaHRvbnMoKHVfc2hvcnQpIHBvcnQpOwotCW1lbWNweSgmKHNja2V0LnNpbl9hZGRyKSwgKihocC0+aF9hZGRyX2xpc3QpLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQotCWlmICggY29ubmVjdChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2NrZXQsIHNpemVvZihzY2tldCkpID09IFNPQ0tFVF9FUlJPUiApCi0JewotCQlwcm94eV9zZXRfZXJyb3IoUFJPWFlfRVJSX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJQ0xPU0VfU09DS0VUKHNkKTsKLQkJcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0JfQotCi0JY29ubi0+c2Vzc19zb2NrID0gc2Q7Ci0JY29ubi0+aG9zdCA9IHN0cmR1cChob3N0KTsKLQljb25uLT5wb3J0ID0gcG9ydDsKLQotCVJlZ2lzdGVyRXZlbnRIYW5kbGVyKFBST1hZX0VWRU5UX0hBTkRMRVIsIHByb3h5X3RjcF9zdnJfZXZlbnRfY2FsbGJhY2ssICh2b2lkICopc3ZyKTsKLQlSZWdpc3RlckV2ZW50SGFuZGxlcihQUk9YWV9DTURfSEFORExFUiwgcHJveHlfdGNwX3N2cl9jbWRfY2FsbGJhY2ssICh2b2lkICopc3ZyKTsKLQlSZWdpc3RlckZpbGVIYW5kbGVyKHNkLCBSRUFEX0ZJTEVfSEFORExFUiwgcHJveHlfdGNwX3N2cl9yZWN2X21zZ3MsICh2b2lkICopc3ZyKTsKLQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKgotICogQWNjZXB0IGEgbmV3IHByb3h5IGNvbm5lY3Rpb24uIFJlZ2lzdGVyIGRpc3BhdGNoIHJvdXRpbmUuCi0gKi8KLXN0YXRpYyBpbnQKLXByb3h5X3RjcF9zdnJfYWNjZXB0KGludCBmZCwgdm9pZCAqZGF0YSkKLXsKLQlzb2NrbGVuX3QJCQkJZnJvbWxlbjsKLQlTT0NLRVQJCQkJCW5zOwotCXN0cnVjdCBzb2NrYWRkcgkJCWFkZHI7Ci0JcHJveHlfc3ZyICoJCQkJc3ZyID0gKHByb3h5X3N2ciAqKWRhdGE7Ci0JcHJveHlfdGNwX2Nvbm4gKgkJY29ubiA9IChwcm94eV90Y3BfY29ubiAqKXN2ci0+c3ZyX2RhdGE7Ci0KLQlmcm9tbGVuID0gc2l6ZW9mKGFkZHIpOwotCW5zID0gYWNjZXB0KGZkLCAmYWRkciwgJmZyb21sZW4pOwotCWlmIChucyA8IDApIHsKLQkJcHJveHlfc2V0X2Vycm9yKFBST1hZX0VSUl9TWVNURU0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCX0KLQotCS8qCi0JICogT25seSBhbGxvdyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUuCi0JICovCi0JaWYgKGNvbm4tPmNvbm5lY3RlZCkgewotCQlDTE9TRV9TT0NLRVQobnMpOyAvLyByZWplY3QKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQlpZiAoY29ubi0+c3ZyLT5zdnJfaGVscGVyX2Z1bmNzLT5uZXdjb25uICE9IE5VTEwgJiYgY29ubi0+c3ZyLT5zdnJfaGVscGVyX2Z1bmNzLT5uZXdjb25uKCkgPCAwKSB7Ci0JCUNMT1NFX1NPQ0tFVChucyk7IC8vIHJlamVjdAotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQotCWNvbm4tPnNlc3Nfc29jayA9IG5zOwotCWNvbm4tPmNvbm5lY3RlZCsrOwotCi0JUmVnaXN0ZXJGaWxlSGFuZGxlcihucywgUkVBRF9GSUxFX0hBTkRMRVIsIHByb3h5X3RjcF9zdnJfcmVjdl9tc2dzLCAodm9pZCAqKXN2cik7Ci0KLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioKLSAqIENsZWFudXAgcHJpb3IgdG8gc2VydmVyIGV4aXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1wcm94eV90Y3Bfc3ZyX2ZpbmlzaChwcm94eV9zdnIgKnN2cikKLXsKLQlwcm94eV90Y3BfY29ubiAqCWNvbm4gPSAocHJveHlfdGNwX2Nvbm4gKilzdnItPnN2cl9kYXRhOwotCi0JaWYgKGNvbm4tPnNlc3Nfc29jayAhPSBJTlZBTElEX1NPQ0tFVCkgewotCQlVbnJlZ2lzdGVyRmlsZUhhbmRsZXIoY29ubi0+c2Vzc19zb2NrKTsKLQkJQ0xPU0VfU09DS0VUKGNvbm4tPnNlc3Nfc29jayk7Ci0JCWNvbm4tPnNlc3Nfc29jayA9IElOVkFMSURfU09DS0VUOwotCX0KLQotCWlmIChjb25uLT5zdnJfc29jayAhPSBJTlZBTElEX1NPQ0tFVCkgewotCQlVbnJlZ2lzdGVyRmlsZUhhbmRsZXIoY29ubi0+c3ZyX3NvY2spOwotCQlDTE9TRV9TT0NLRVQoY29ubi0+c3ZyX3NvY2spOwotCQljb25uLT5zdnJfc29jayA9IElOVkFMSURfU09DS0VUOwotCX0KLQotCXByb3h5X3RjcF9kZXN0cm95X2Nvbm4oY29ubik7Ci19Ci0KLS8qKgotICogQ2hlY2sgZm9yIGluY29taW5nIG1lc3NhZ2VzLgotICovCi1zdGF0aWMgdm9pZAotcHJveHlfdGNwX3N2cl9wcm9jZXNzX2NtZHMoKQotewotCUNhbGxFdmVudEhhbmRsZXJzKFBST1hZX0NNRF9IQU5ETEVSLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb3h5X3RjcF9zdnJfcHJvY2Vzc19ldmVudHMocHJveHlfbXNnICptc2csIHZvaWQgKmRhdGEpCi17Ci0JQ2FsbEV2ZW50SGFuZGxlcnMoUFJPWFlfRVZFTlRfSEFORExFUiwgKHZvaWQgKiltc2cpOwotfQotCi0vKioKLSAqIFByb2Nlc3NlcyBhbnkgcXVldWVkIGV2ZW50cyBBbHNvIGNoZWNrcyBmb3IgcmVhZHkgZmlsZSBkZXNjcmlwdG9ycwotICogYW5kIGNhbGxzIGFwcHJvcHJpYXRlIGhhbmRsZXJzLgotICovCi1zdGF0aWMgaW50Ci1wcm94eV90Y3Bfc3ZyX3Byb2dyZXNzKHByb3h5X3N2ciAqc3ZyKQotewotCWZkX3NldAkJCQkJcmZkczsKLQlmZF9zZXQJCQkJCXdmZHM7Ci0JZmRfc2V0CQkJCQllZmRzOwotCWludAkJCQkJCXJlczsKLQlpbnQJCQkJCQluZmRzID0gMDsKLQlzdHJ1Y3QgdGltZXZhbAkJCXR2OwotCXN0cnVjdCB0aW1ldmFsICoJCXRpbWVvdXQgPSAmdHY7Ci0KLQlwcm94eV9wcm9jZXNzX21zZ3Moc3ZyLT5zdnJfZXZlbnRzLCBwcm94eV90Y3Bfc3ZyX3Byb2Nlc3NfZXZlbnRzLCBOVUxMKTsKLQotCS8qIFNldCB1cCBmZCBzZXRzICovCi0JR2VuZXJhdGVGRFNldHMoJm5mZHMsICZyZmRzLCAmd2ZkcywgJmVmZHMpOwotCi0JaWYgKHN2ci0+c3ZyX3RpbWVvdXQgPT0gTlVMTCkgewotCQl0aW1lb3V0ID0gTlVMTDsKLQl9IGVsc2UgewotCQltZW1jcHkoKGNoYXIgKil0aW1lb3V0LCAoY2hhciAqKXN2ci0+c3ZyX3RpbWVvdXQsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCX0KLQotCWZvciAoIDs7ICkgewotCQlyZXMgPSBzZWxlY3QobmZkcysxLCAmcmZkcywgJndmZHMsICZlZmRzLCAmdHYpOwotCi0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgSU5WQUxJRF9TT0NLRVQ6Ci0JCQlpZiAoIGVycm5vID09IEVJTlRSICkKLQkJCQljb250aW51ZTsKLQotCQkJcGVycm9yKCJzb2NrZXQiKTsKLQkJCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCi0JCWNhc2UgMDoKLQkJCS8qIFRpbWVvdXQuICovCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJaWYgKENhbGxGaWxlSGFuZGxlcnMoJnJmZHMsICZ3ZmRzLCAmZWZkcykgPCAwKQotCQkJCXJldHVybiBQUk9YWV9SRVNfRVJSOwotCQl9Ci0KLQkJYnJlYWs7Ci0JfQotCi0JcHJveHlfdGNwX3N2cl9wcm9jZXNzX2NtZHMoKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRGlzcGF0Y2ggYSBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIKLSAqCi0gKiBwcm94eV90Y3Bfc3ZyX2Rpc3BhdGNoKCkgc2hvdWxkIG5ldmVyIGZhaWwuIElmIHdlIGdldCBhIHJlYWQgZXJyb3IgZnJvbSB0aGUgY2xpZW50IHRoZW4gd2UganVzdAotICogYXNzdW1lIHRoZSBjbGllbnQgaGFzIGdvbmUgYXdheS4gRXJyb3JzIGZyb20gc2VydmVyIGNvbW1hbmRzIGFyZSBqdXN0IHJlcG9ydGVkIGJhY2sgdG8gdGhlCi0gKiBjbGllbnQuCi0gKi8KLXN0YXRpYyBpbnQKLXByb3h5X3RjcF9zdnJfZGlzcGF0Y2gocHJveHlfc3ZyICpzdnIsIGNoYXIgKm1zZywgaW50IGxlbikKLXsKLQlpbnQJCQkJCWlkeDsKLQljaGFyICoJCQkJZXJyX3N0cjsKLQlwcm94eV9jb21tYW5kcyAqIAljbWRfdGFiID0gc3ZyLT5zdnJfY29tbWFuZHM7Ci0JcHJveHlfbXNnICoJCQltOwotCXByb3h5X2NtZAkJCWNtZDsKLQotCURFQlVHX1BSSU5UKCJwcm94eV90Y3Bfc3ZyX2Rpc3BhdGNoOiByZWNlaXZlZCA8JXM+XG4iLCBtc2cpOwotCi0JaWYgKHByb3h5X2Rlc2VyaWFsaXplX21zZyhtc2csIGxlbiwgJm0pIDwgMCkgewotCQlwcm94eV9tc2cgKmVyciA9IG5ld19wcm94eV9tc2coMCwgUFJPWFlfRVZfTUVTU0FHRSk7Ci0JCXByb3h5X21zZ19hZGRfaW50KGVyciwgMyk7IC8qIDMgYXR0cmlidXRlcyAqLwotCQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcoZXJyLCBNU0dfTEVWRUxfQVRUUiwgTVNHX0xFVkVMX0ZBVEFMKTsKLQkJcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KGVyciwgTVNHX0NPREVfQVRUUiwgUFJPWFlfRVJSX1BST1RPKTsKLQkJcHJveHlfbXNnX2FkZF9pbnQoZXJyLCBFUlJPUl9NQUxGT1JNRURfQ09NTUFORCk7Ci0JCWFzcHJpbnRmKCZlcnJfc3RyLCAibWFsZm9ybWVkIGNvbW1hbmQsIGxlbiBpcyAlZCIsIGxlbik7Ci0JCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhlcnIsIE1TR19URVhUX0FUVFIsIGVycl9zdHIpOwotCQlmcmVlKGVycl9zdHIpOwotCQlwcm94eV9xdWV1ZV9tc2coc3ZyLT5zdnJfZXZlbnRzLCBlcnIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSAgICBpZHggPSBtLT5tc2dfaWQgLSBjbWRfdGFiLT5jbWRfYmFzZTsKLQotCURFQlVHX1BSSU5UKCJwcm94eV90Y3Bfc3ZyX2Rpc3BhdGNoOiBhYm91dCB0byBkaXNwYXRjaCBpZHg9JWRcbiIsIGlkeCk7Ci0KLQlpZiAoaWR4ID49IDAgJiYgaWR4IDwgY21kX3RhYi0+Y21kX3NpemUpIHsKLQkJY21kID0gY21kX3RhYi0+Y21kX2Z1bmNzW2lkeF07Ci0JCWlmIChjbWQgIT0gTlVMTCkgewotCQkJKHZvaWQpY21kKG0tPnRyYW5zX2lkLCBtLT5udW1fYXJncywgbS0+YXJncyk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcm94eV9tc2cgKmVyciA9IG5ld19wcm94eV9tc2coMCwgUFJPWFlfRVZfTUVTU0FHRSk7Ci0JCXByb3h5X21zZ19hZGRfaW50KGVyciwgMyk7IC8qIDMgYXR0cmlidXRlcyAqLwotCQlwcm94eV9tc2dfYWRkX2tleXZhbF9zdHJpbmcoZXJyLCBNU0dfTEVWRUxfQVRUUiwgTVNHX0xFVkVMX0ZBVEFMKTsKLQkJcHJveHlfbXNnX2FkZF9rZXl2YWxfaW50KGVyciwgTVNHX0NPREVfQVRUUiwgUFJPWFlfRVJSX1BST1RPKTsKLQkJcHJveHlfbXNnX2FkZF9pbnQoZXJyLCBFUlJPUl9NQUxGT1JNRURfQ09NTUFORCk7Ci0JCWFzcHJpbnRmKCZlcnJfc3RyLCAibWFsZm9ybWVkIGNvbW1hbmQsIGxlbiBpcyAlZCIsIGxlbik7Ci0JCXByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhlcnIsIE1TR19URVhUX0FUVFIsIGVycl9zdHIpOwotCQlmcmVlKGVycl9zdHIpOwotCQlwcm94eV9xdWV1ZV9tc2coc3ZyLT5zdnJfZXZlbnRzLCBlcnIpOwotCX0KLQotCWZyZWVfcHJveHlfbXNnKG0pOwotCi0JREVCVUdfUFJJTlQoIiVzXG4iLCAiTGVhdmluZyBwcm94eV90Y3Bfc3ZyX2Rpc3BhdGNoIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcHJveHlfdGNwX3N2cl9yZWN2X21zZ3MoaW50IGZkLCB2b2lkICpkYXRhKQotewotCXByb3h5X3N2ciAqCQkJc3ZyID0gKHByb3h5X3N2ciAqKWRhdGE7Ci0JcHJveHlfdGNwX2Nvbm4gKgljb25uID0gKHByb3h5X3RjcF9jb25uICopc3ZyLT5zdnJfZGF0YTsKLQotCXJldHVybiBwcm94eV90Y3BfcmVjdl9tc2dzKGNvbm4pOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvLmNsYXNzcGF0aCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLy5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzJiZmQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4MjIyNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5lbnZpcm9ubWVudC5jb25mCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2Fib3V0Lmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2Fib3V0LmluaSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzIxNDcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QVFAgUmVtb3RlIFRvb2xzIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzJiNjMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvZWNsaXBzZTMyLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmJkMGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFJlbW90ZSBUb29scyBTdXBwb3J0Ci1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvcGx1Z2luLnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTcxMWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5yZW1vdGVTZXJ2aWNlcyI+Ci0gICAgICA8cmVtb3RlU2VydmljZXMKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlVG9vbHNTZXJ2aWNlc0ZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5SZW1vdGVUb29scyIKLSAgICAgICAgICAgIG5hbWU9IlJlbW90ZSBUb29scyIKLSAgICAgICAgICAgIHNjaGVtZT0icmVtb3RldG9vbHMiPgotICAgICAgPC9yZW1vdGVTZXJ2aWNlcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5maWxlc3lzdGVtIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5maWxlc3lzdGVtcyI+Ci0gICAgICA8ZmlsZXN5c3RlbQotICAgICAgICAgICAgc2NoZW1lPSJyZW1vdGV0b29scyI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLlJlbW90ZVRvb2xzRmlsZVN5c3RlbSI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvZmlsZXN5c3RlbT4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzQWRhcHRlckNvcmVQbHVnaW4uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk1ODJhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUucmVtb3RldG9vbHMiOwotCi0JLy8gVGhlIHJlbW90ZSBzZXJ2aWNlcyBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuUmVtb3RlVG9vbHMiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFJlbW90ZVRvb2xzQWRhcHRlckNvcmVQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc0Nvbm5lY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMWFjZmYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLmV4Y2VwdGlvbi5BZGRyZXNzSW5Vc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uVW5hYmxlVG9Gb3J3YXJkUG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuZW52aXJvbm1lbnQuUFRQVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkxvY2FsUG9ydEJvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUG9ydEZvcndhcmRpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc0Nvbm5lY3Rpb24gaW1wbGVtZW50cyBJUmVtb3RlQ29ubmVjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgY29ubk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsKLQlwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKLQlwcml2YXRlIFBUUFRhcmdldENvbnRyb2wgY29udHJvbDsKLQotCXB1YmxpYyBSZW1vdGVUb29sc0Nvbm5lY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgdXNlck5hbWUsIFBUUFRhcmdldENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOwotCQl0aGlzLmNvbm5OYW1lID0gbmFtZTsKLQkJdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLQkJdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbiNjbG9zZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJfQotCQkJCi0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5SZW1vdGVUb29sc0Nvbm5lY3Rpb25fY2xvc2UsIDEpOwotCQkJCi0JCQlpZiAoaXNPcGVuKCkpIHsKLQkJCQl0cnkgewotCQkJCQljb250cm9sLmtpbGwobW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQkJCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZXhlY3V0aW9uIG1hbmFnZXIuIFJlcXVpcmVkIGJlY2F1c2Ugc2NyaXB0IGV4ZWN1dGlvbiAKLQkgKiBjbG9zZXMgY2hhbm5lbCBhZnRlciBleGVjdXRpb24uCi0JICogCi0JICogQHJldHVybiBleGVjdXRpb24gbWFuYWdlcgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBjcmVhdGVFeGVjdXRpb25NYW5hZ2VyKCkgdGhyb3dzIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb250cm9sLmNyZWF0ZUV4ZWN1dGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24jZm9yd2FyZExvY2FsUG9ydChpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3J3YXJkTG9jYWxQb3J0KGludCBsb2NhbFBvcnQsIFN0cmluZyBmd2RBZGRyZXNzLCBpbnQgZndkUG9ydCkKLQkJCXRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFpc09wZW4oKSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuUmVtb3RlVG9vbHNDb25uZWN0aW9uX2Nvbm5lY3Rpb25Ob3RPcGVuKTsKLQkJfQotCQl0cnkgewotCQkJY29udHJvbC5nZXRFeGVjdXRpb25NYW5hZ2VyKCkuY3JlYXRlVHVubmVsKGxvY2FsUG9ydCwgZndkQWRkcmVzcywgZndkUG9ydCk7Ci0JCX0gY2F0Y2ggKExvY2FsUG9ydEJvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBZGRyZXNzSW5Vc2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDYW5jZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbiNmb3J3YXJkTG9jYWxQb3J0KGphdmEubGFuZy5TdHJpbmcsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGludCBmb3J3YXJkTG9jYWxQb3J0KFN0cmluZyBmd2RBZGRyZXNzLCBpbnQgZndkUG9ydCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlpZiAoIWlzT3BlbigpKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5SZW1vdGVUb29sc0Nvbm5lY3Rpb25fY29ubmVjdGlvbk5vdE9wZW4pOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24jZm9yd2FyZFJlbW90ZVBvcnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZm9yd2FyZFJlbW90ZVBvcnQoaW50IHJlbW90ZVBvcnQsIFN0cmluZyBmd2RBZGRyZXNzLCBpbnQgZndkUG9ydCkKLQkJCXRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFpc09wZW4oKSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuUmVtb3RlVG9vbHNDb25uZWN0aW9uX2Nvbm5lY3Rpb25Ob3RPcGVuKTsKLQkJfQotCQl0cnkgewotCQkJY29udHJvbC5nZXRFeGVjdXRpb25NYW5hZ2VyKCkuZ2V0UG9ydEZvcndhcmRpbmdUb29scygpLmZvcndhcmRSZW1vdGVQb3J0KHJlbW90ZVBvcnQsIGZ3ZEFkZHJlc3MsIGZ3ZFBvcnQpOwotCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChDYW5jZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQWRkcmVzc0luVXNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24jZm9yd2FyZFJlbW90ZVBvcnQoamF2YS5sYW5nLlN0cmluZywgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgaW50IGZvcndhcmRSZW1vdGVQb3J0KFN0cmluZyBmd2RBZGRyZXNzLCBpbnQgZndkUG9ydCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5SZW1vdGVUb29sc0Nvbm5lY3Rpb25fZm9yd2FyZGluZywgMTApOwotCQkvKgotCQkgKiBTdGFydCB3aXRoIGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyLCBpbiBjYXNlIHdlJ3JlIGRvaW5nIHRoaXMgYWxsIG9uIGxvY2FsaG9zdC4KLQkJICovCi0JCWludCByZW1vdGVQb3J0ID0gZndkUG9ydCArIDE7Ci0JCS8qCi0JCSAqIFRyeSB0byBmaW5kIGEgZnJlZSBwb3J0IG9uIHRoZSByZW1vdGUgbWFjaGluZS4gVGhpcyB0YWtlIGEgd2hpbGUsIHNvCi0JCSAqIGFsbG93IGl0IHRvIGJlIGNhbmNlbGVkLiBJZiB3ZSd2ZSB0cmllZCBhbGwgcG9ydHMgKHdoaWNoIGNvdWxkIHRha2UgYQotCQkgKiB2ZXJ5IGxvbmcgd2hpbGUpIHRoZW4gYmFpbCBvdXQuCi0JCSAqLwotCQl3aGlsZSAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWZvcndhcmRSZW1vdGVQb3J0KHJlbW90ZVBvcnQsIGZ3ZEFkZHJlc3MsIGZ3ZFBvcnQpOwotCQkJfSBjYXRjaCAoQWRkcmVzc0luVXNlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoKytyZW1vdGVQb3J0ID09IGZ3ZFBvcnQpIHsKLQkJCQkJdGhyb3cgbmV3IFVuYWJsZVRvRm9yd2FyZFBvcnRFeGNlcHRpb24oTWVzc2FnZXMuUmVtb3RlVG9vbHNDb25uZWN0aW9uX3JlbW90ZVBvcnQpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJcmV0dXJuIHJlbW90ZVBvcnQ7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uI2dldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIGFkZHJlc3M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGNvbm5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0JCXJldHVybiB1c2VyTmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24jaXNPcGVuKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gY29udHJvbC5xdWVyeSgpID09IElUYXJnZXRTdGF0dXMuUkVTVU1FRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24jb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuUmVtb3RlVG9vbHNDb25uZWN0aW9uX29wZW4sIDIpOwotCQlpZiAoY29udHJvbC5xdWVyeSgpID09IElUYXJnZXRTdGF0dXMuU1RPUFBFRCkgewotCQkJSm9iIGpvYiA9IG5ldyBKb2IoIlN0YXJ0IHRoZSBFbnZpcm9ubWVudCIpIHsKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJaWYgKGNvbnRyb2wuY3JlYXRlKG1vbml0b3IpKSB7Ci0JCQkJCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlzdGF0dXMgPSBlLmdldFN0YXR1cygpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX07Ci0JCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkvKgotCQkJICogV2FpdCBmb3IgdGhlIGpvYiB0byBmaW5pc2gKLQkJCSAqLwotCQkJd2hpbGUgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSAmJiBjb250cm9sLnF1ZXJ5KCkgIT0gSVRhcmdldFN0YXR1cy5SRVNVTUVEKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJam9iLmNhbmNlbCgpOwotCQkJfQotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbiNzZXRBZGRyZXNzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgewotCQl0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbiNzZXRVc2VybmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VyTmFtZSkgewotCQl0aGlzLnVzZXJOYW1lID0gdXNlck5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uI3N1cHBvcnRzVENQUG9ydEZvcndhcmRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVENQUG9ydEZvcndhcmRpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MjY4YzYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50LlBUUFRhcmdldENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LkVudmlyb25tZW50UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLklUYXJnZXRDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLklUYXJnZXRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLlRhcmdldEVudmlyb25tZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRUeXBlRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUmVtb3RlVG9vbHNDb25uZWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElSZW1vdGVDb25uZWN0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgVGFyZ2V0VHlwZUVsZW1lbnQgcmVtb3RlSG9zdCA9IG51bGw7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJUmVtb3RlQ29ubmVjdGlvbj4gY29ubmVjdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElSZW1vdGVDb25uZWN0aW9uPigpOwotCQotCXB1YmxpYyBSZW1vdGVUb29sc0Nvbm5lY3Rpb25NYW5hZ2VyKCkgewotCQlUYXJnZXRFbnZpcm9ubWVudE1hbmFnZXIgdGFyZ2V0TWdyID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRhcmdldHNNYW5hZ2VyKCk7Ci0JCWZvciAoT2JqZWN0IG9iaiA6IHRhcmdldE1nci5nZXRUeXBlRWxlbWVudHMoKSkgewotCQkJVGFyZ2V0VHlwZUVsZW1lbnQgZWxlbWVudCA9IChUYXJnZXRUeXBlRWxlbWVudClvYmo7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJSZW1vdGUgSG9zdCIpKSB7Ci0JCQkJcmVtb3RlSG9zdCA9IGVsZW1lbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmVmcmVzaENvbm5lY3Rpb25zKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIjYWRkQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb25DaGFuZ2VMaXN0ZW5lcihJUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyI2ZpcmVDb25uZWN0aW9uQ2hhbmdlRXZlbnQob3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbm5lY3Rpb25DaGFuZ2VFdmVudChJUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkoKElSZW1vdGVDb25uZWN0aW9uQ2hhbmdlTGlzdGVuZXIpbGlzdGVuZXIpLmNvbm5lY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIjZ2V0Q29ubmVjdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJlZnJlc2hDb25uZWN0aW9ucygpOwotCQlyZXR1cm4gY29ubmVjdGlvbnMuZ2V0KG5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIjZ2V0Q29ubmVjdGlvbnMoKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlQ29ubmVjdGlvbltdIGdldENvbm5lY3Rpb25zKCkgewotCQlyZWZyZXNoQ29ubmVjdGlvbnMoKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25zLnZhbHVlcygpLnRvQXJyYXkobmV3IElSZW1vdGVDb25uZWN0aW9uW2Nvbm5lY3Rpb25zLnNpemUoKV0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyI3JlbW92ZUNvbm5lY3Rpb24ob3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb24oSVJlbW90ZUNvbm5lY3Rpb24gY29ubikgewotCQljb25uZWN0aW9ucy5yZW1vdmUoY29ubik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIjcmVtb3ZlQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25DaGFuZ2VMaXN0ZW5lcihJUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGxpc3Qgb2YgY29ubmVjdGlvbnMgdGhhdCB3ZSBrbm93IGFib3V0LiBEZWFscyB3aXRoIGNvbm5lY3Rpb24gdGhhdCBhcmUgYWRkZWQgb3IgZGVsZXRlZAotCSAqIGJ5IGFub3RoZXIgZW50aXR5LgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoKSB7Ci0JCU1hcDxTdHJpbmcsIElSZW1vdGVDb25uZWN0aW9uPiBuZXdDb25ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVJlbW90ZUNvbm5lY3Rpb24+KCk7Ci0JCWZvciAoT2JqZWN0IG9iaiA6IHJlbW90ZUhvc3QuZ2V0RWxlbWVudHMoKSkgewotCQkJSVRhcmdldEVsZW1lbnQgZWxlbWVudCA9IChJVGFyZ2V0RWxlbWVudClvYmo7Ci0JCQlJUmVtb3RlQ29ubmVjdGlvbiBjb25uID0gY29ubmVjdGlvbnMuZ2V0KGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCWlmIChjb25uID09IG51bGwpIHsKLQkJCQlJVGFyZ2V0Q29udHJvbCBjb250cm9sOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRyb2wgPSBlbGVtZW50LmdldENvbnRyb2woKTsKLQkJCQkJLyoKLQkJCQkJICogRklYTUU6IG5lZWQgdG8gd29yayBvdXQgaG93IHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIGNvcnJlY3RseSEhISEKLQkJCQkJICovCi0JCQkJCVN0cmluZyBhZGRyZXNzID0gKFN0cmluZykgZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0KCJwdHAuY29ubmVjdGlvbi1hZGRyZXNzIik7Ci0JCQkJCVN0cmluZyB1c2VyID0gKFN0cmluZykgZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0KCJwdHAubG9naW4tdXNlcm5hbWUiKTsKLQkJCQkJY29ubiA9IG5ldyBSZW1vdGVUb29sc0Nvbm5lY3Rpb24oZWxlbWVudC5nZXROYW1lKCksIGFkZHJlc3MsIHVzZXIsIChQVFBUYXJnZXRDb250cm9sKWNvbnRyb2wpOwotCQkJCQkoKFBUUFRhcmdldENvbnRyb2wpY29udHJvbCkuc2V0Q29ubmVjdGlvbih0aGlzLCBjb25uKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdDb25ucy5wdXQoZWxlbWVudC5nZXROYW1lKCksIGNvbm4pOwotCQl9Ci0JCWNvbm5lY3Rpb25zID0gbmV3Q29ubnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc0ZpbGVNYW5hZ2VyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzRmlsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5NTA3Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzRmlsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVtb3RlVG9vbHNGaWxlTWFuYWdlciBpbXBsZW1lbnRzIElSZW1vdGVGaWxlTWFuYWdlciB7Ci0JcHJpdmF0ZSBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBleGVNZ3I7Ci0JcHJpdmF0ZSBSZW1vdGVUb29sc0Nvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQlwcml2YXRlIE1hcDxJUGF0aCwgSUZpbGVTdG9yZT4gcGF0aENhY2hlID0gbmV3IEhhc2hNYXA8SVBhdGgsIElGaWxlU3RvcmU+KCk7Ci0JCi0JcHVibGljIFJlbW90ZVRvb2xzRmlsZU1hbmFnZXIoUmVtb3RlVG9vbHNDb25uZWN0aW9uIGNvbm4sIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGV4ZU1ncikgewotCQl0aGlzLmNvbm5lY3Rpb24gPSBjb25uOwotCQl0aGlzLmV4ZU1nciA9IGV4ZU1ncjsKLQl9Ci0JCi0JLyoqCi0JICogU3RvcmUgYW4gSVJlbW90ZVJlc291cmNlIGluIHRoZSBjYWNoZQotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHBhdGggdG8gdGhlIHJlbW90ZSByZXNvdXJjZQotCSAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSB0byBhZGQgdG8gdGhlIGNhY2hlCi0JICovCi0JcHVibGljIHZvaWQgY2FjaGUoSVBhdGggcGF0aCwgSUZpbGVTdG9yZSByZXNvdXJjZSkgewotCQlzeW5jaHJvbml6ZWQgKHBhdGhDYWNoZSkgewotCQkJcGF0aENhY2hlLnB1dChwYXRoLCByZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGV4ZWN1dGlvbiBtYW5hZ2VyIGZvciB0aGlzIGZpbGUgbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgZ2V0RXhlY3V0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGV4ZU1ncjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVGaWxlTWFuYWdlciNnZXRSZXNvdXJjZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElGaWxlU3RvcmUgZ2V0UmVzb3VyY2UoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRmlsZVN0b3JlIHJlcyA9IGxvb2t1cChwYXRoKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCQotCQlJUmVtb3RlSXRlbSBpdGVtOwotCQlib29sZWFuIGlzRGlyZWN0b3J5ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aFN0ciA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCUlSZW1vdGVGaWxlVG9vbHMgdG9vbHMgPSBleGVNZ3IuZ2V0UmVtb3RlRmlsZVRvb2xzKCk7Ci0JCQlpdGVtID0gdG9vbHMuZ2V0SXRlbShwYXRoU3RyKTsKLQkJCWlmICh0b29scy5oYXNEaXJlY3RvcnkocGF0aFN0cikpIHsKLQkJCQlpc0RpcmVjdG9yeSA9IHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKENhbmNlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCQlyZXMgPSBuZXcgUmVtb3RlVG9vbHNGaWxlU3RvcmUodGhpcywgaXRlbSwgaXNEaXJlY3RvcnkpOwotCQljYWNoZShwYXRoLCByZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJU3RyaW5nIGN3ZCA9ICIvLyI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWN3ZCA9IGV4ZU1nci5nZXRFeGVjdXRpb25Ub29scygpLmV4ZWN1dGVXaXRoT3V0cHV0KCJwd2QiKS50cmltKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKENhbmNlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKGN3ZCk7Ci0JfQotCQkKLQkvKioKLQkgKiBMb29rIHVwIGEgY2FjaGVkIElSZW1vdGVSZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHBhdGggdG8gdGhlIHJlbW90ZSByZXNvdXJjZQotCSAqIEByZXR1cm4gY2FjaGVkIElSZW1vdGVSZXNvdXJjZSBvciBudWxsCi0JICovCi0JcHVibGljIElGaWxlU3RvcmUgbG9va3VwKElQYXRoIHBhdGgpIHsKLQkJc3luY2hyb25pemVkIChwYXRoQ2FjaGUpIHsKLQkJCXJldHVybiBwYXRoQ2FjaGUuZ2V0KHBhdGgpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXIjdG9QYXRoKGphdmEubmV0LlVSSSkKLQkgKi8KLQlwdWJsaWMgSVBhdGggdG9QYXRoKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKHVyaS5nZXRQYXRoKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXIjdG9VUkkob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBVUkkgdG9VUkkoSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkkoInJlbW90ZXRvb2xzIiwgY29ubmVjdGlvbi5nZXROYW1lKCksIHBhdGgudG9Qb3J0YWJsZVN0cmluZygpLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzRmlsZVN0b3JlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzRmlsZVN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliY2NlNWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc0ZpbGVTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5wcm92aWRlci5GaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVVcGxvYWRFeGVjdXRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc0ZpbGVTdG9yZSBleHRlbmRzIEZpbGVTdG9yZSB7Ci0KLQkvKioKLQkgKiBQdWJsaWMgZmFjdG9yeSBtZXRob2QgZm9yIG9idGFpbmluZyBSZW1vdGVUb29sc0ZpbGVTdG9yZSBpbnN0YW5jZXMuCi0JICogQHBhcmFtIHVyaSBVUkkgdG8gZ2V0IGEgZmlsZVN0b3JlIGZvcgotCSAqIEByZXR1cm4gYW4gUmVtb3RlVG9vbHNGaWxlU3RvcmUgaW5zdGFuY2UgZm9yIHRoZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW1vdGVUb29sc0ZpbGVTdG9yZSBnZXRJbnN0YW5jZShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgbmFtZSA9IHVyaS5nZXRBdXRob3JpdHkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwotCQlJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgY29ubk1nciA9IFJlbW90ZVRvb2xzU2VydmljZXMuZ2V0SW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQlSZW1vdGVUb29sc0Nvbm5lY3Rpb24gY29ubiA9IChSZW1vdGVUb29sc0Nvbm5lY3Rpb24pY29ubk1nci5nZXRDb25uZWN0aW9uKG5hbWUpOwotCQlJUmVtb3RlRmlsZU1hbmFnZXIgZmlsZU1nciA9IFJlbW90ZVRvb2xzU2VydmljZXMuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlTWFuYWdlcihjb25uKTsKLQkJcmV0dXJuIChSZW1vdGVUb29sc0ZpbGVTdG9yZSlmaWxlTWdyLmdldFJlc291cmNlKG5ldyBQYXRoKHBhdGgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIElSZW1vdGVJdGVtIHJlbW90ZUl0ZW07Ci0JcHJpdmF0ZSBVUkkgcmVtb3RlVVJJOwotCXByaXZhdGUgUmVtb3RlVG9vbHNGaWxlTWFuYWdlciBmaWxlTWdyOwotCXByaXZhdGUgSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgZXhlTWdyOwotCXByaXZhdGUgYm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlwcml2YXRlIElSZW1vdGVVcGxvYWRFeGVjdXRpb24gdXBsb2FkRXhlY3V0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBSZW1vdGVUb29sc0ZpbGVTdG9yZShSZW1vdGVUb29sc0ZpbGVNYW5hZ2VyIG1nciwgSVJlbW90ZUl0ZW0gcmVtb3RlSXRlbSwKLQkJCWJvb2xlYW4gaXNEaXJlY3RvcnkpIHsKLQkJdGhpcy5maWxlTWdyID0gbWdyOwotCQl0aGlzLmV4ZU1nciA9IG1nci5nZXRFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JCXRoaXMucmVtb3RlSXRlbSA9IHJlbW90ZUl0ZW07Ci0JCXRoaXMuaXNEaXJlY3RvcnkgPSBpc0RpcmVjdG9yeTsKLQkJdGhpcy5yZW1vdGVVUkkgPSBtZ3IudG9VUkkobmV3IFBhdGgocmVtb3RlSXRlbS5nZXRQYXRoKCkpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ucHJvdmlkZXIuRmlsZVN0b3JlI2NoaWxkTmFtZXMoaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gY2hpbGROYW1lcyhpbnQgb3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZW1vdGVJdGVtW10gaXRlbXM7Ci0JCXRyeSB7Ci0JCQlpdGVtcyA9IGV4ZU1nci5nZXRSZW1vdGVGaWxlVG9vbHMoKS5saXN0SXRlbXMocmVtb3RlSXRlbS5nZXRQYXRoKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJZS5nZXRNZXNzYWdlKCkpKTsKLQkJfQotCi0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChpdGVtc1tpXS5nZXRQYXRoKCkpOwotCQkJbmFtZXNbaV0gPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyLkZpbGVTdG9yZSNkZWxldGUoaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWxldGUoaW50IG9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZXhlTWdyLmdldFJlbW90ZUZpbGVUb29scygpLnJlbW92ZUZpbGUocmVtb3RlSXRlbS5nZXRQYXRoKCkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJIkNvdWxkIG5vdCBkZWxldGUgZmlsZSIsIGUpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5wcm92aWRlci5GaWxlU3RvcmUjZmV0Y2hJbmZvKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElGaWxlSW5mbyBmZXRjaEluZm8oaW50IG9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlGaWxlSW5mbyBpbmZvID0gbmV3IEZpbGVJbmZvKG5ldyBQYXRoKHJlbW90ZUl0ZW0uZ2V0UGF0aCgpKS5sYXN0U2VnbWVudCgpKTsKLQotCQl0cnkgewotCQkJcmVtb3RlSXRlbS5yZWZyZXNoQXR0cmlidXRlcygpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCVJlbW90ZVRvb2xzQWRhcHRlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQllLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCQotCQlpZiAoIXJlbW90ZUl0ZW0uZXhpc3RzKCkpIHsKLQkJCWluZm8uc2V0RXhpc3RzKGZhbHNlKTsKLQkJCXJldHVybiBpbmZvOwotCQl9CQotCQkKLQkJaW5mby5zZXRFeGlzdHModHJ1ZSk7Ci0JCWluZm8uc2V0TGFzdE1vZGlmaWVkKHJlbW90ZUl0ZW0uZ2V0TW9kaWZpY2F0aW9uVGltZSgpKTsKLQkJaW5mby5zZXREaXJlY3RvcnkoaXNEaXJlY3RvcnkpOwotCQlpbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX1JFQURfT05MWSwgIXJlbW90ZUl0ZW0uaXNXcml0YWJsZSgpKTsKLQotCQlpZiAoIWlzRGlyZWN0b3J5KSB7Ci0JCQlJUmVtb3RlRmlsZSBmaWxlID0gKElSZW1vdGVGaWxlKXJlbW90ZUl0ZW07Ci0JCQlpbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX0VYRUNVVEFCTEUsIGZpbGUuaXNFeGVjdXRhYmxlKCkpOwotCQkJaW5mby5zZXRMZW5ndGgoZmlsZS5nZXRTaXplKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyLkZpbGVTdG9yZSNnZXRDaGlsZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJRmlsZVN0b3JlIGdldENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCUlQYXRoIGNoaWxkUGF0aCA9IG5ldyBQYXRoKHJlbW90ZUl0ZW0uZ2V0UGF0aCgpKS5hcHBlbmQobmFtZSk7Ci0KLQkJSUZpbGVTdG9yZSByZXNvdXJjZSA9IGZpbGVNZ3IubG9va3VwKGNoaWxkUGF0aCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIGZpbGVNZ3IuZ2V0UmVzb3VyY2UoY2hpbGRQYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZSNnZXROYW1lKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZW1vdGVJdGVtLmdldFBhdGgoKSk7Ci0JCWlmIChwYXRoLmlzUm9vdCgpKSB7Ci0JCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aChyZW1vdGVJdGVtLmdldFBhdGgoKSkubGFzdFNlZ21lbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZSNnZXRQYXJlbnQoKQotCSAqIAotCSAqIEZJWE1FOiBzaG91bGQgdGFrZSBhIHByb2dyZXNzIG1vbml0b3IgYXMgYXJndW1lbnQKLQkgKiBGSVhNRTogc2hvdWxkIHRocm93IGEgY29yZSBleGNlcHRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUZpbGVTdG9yZSBnZXRQYXJlbnQoKSB7Ci0JCUlQYXRoIHBhcmVudCA9IG5ldyBQYXRoKGV4ZU1nci5nZXRSZW1vdGVQYXRoVG9vbHMoKS5wYXJlbnQocmVtb3RlSXRlbS5nZXRQYXRoKCkpKTsKLQotCQlJRmlsZVN0b3JlIHJlc291cmNlID0gZmlsZU1nci5sb29rdXAocGFyZW50KTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIGZpbGVNZ3IuZ2V0UmVzb3VyY2UocGFyZW50LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZSNta2RpcihpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJRmlsZVN0b3JlIG1rZGlyKGludCBvcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWV4ZU1nci5nZXRSZW1vdGVGaWxlVG9vbHMoKS5jcmVhdGVEaXJlY3RvcnkocmVtb3RlSXRlbS5nZXRQYXRoKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJIlRoZSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQiLCBlKSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZSNvcGVuSW5wdXRTdHJlYW0oaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtKGludCBvcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzRGlyZWN0b3J5KSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCVJlbW90ZVRvb2xzQWRhcHRlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotCQkJIklzIGEgZGlyZWN0b3J5IikpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZXhlTWdyLmdldFJlbW90ZUNvcHlUb29scygpLmV4ZWN1dGVEb3dubG9hZChyZW1vdGVJdGVtLmdldFBhdGgoKSkuZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc1JlbW90ZUZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCSJDb3VsZCBub3QgZ2V0IGlucHV0IHN0cmVhbSIsIGUpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlI29wZW5PdXRwdXRTdHJlYW0oaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3V0cHV0U3RyZWFtIG9wZW5PdXRwdXRTdHJlYW0oaW50IG9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaXNEaXJlY3RvcnkpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkiSXMgYSBkaXJlY3RvcnkiKSk7Ci0JCX0KLQkJCi0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJdXBsb2FkRXhlY3V0aW9uID0gZXhlTWdyLmdldFJlbW90ZUNvcHlUb29scygpLmV4ZWN1dGVVcGxvYWQocmVtb3RlSXRlbS5nZXRQYXRoKCkpOwotCi0JCQlzeW5jaHJvbml6ZWQgKHJlbW90ZUl0ZW0pIHsKLQkJCQl3aGlsZSAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmICFyZW1vdGVJdGVtLmV4aXN0cygpKSB7Ci0JCQkJCXJlbW90ZUl0ZW0ud2FpdCg1MDApOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlbW90ZUl0ZW0ucmVmcmVzaEF0dHJpYnV0ZXMoKTsKLQkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdXBsb2FkRXhlY3V0aW9uLmNhbmNlbCgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gdXBsb2FkRXhlY3V0aW9uLmdldE91dHB1dFN0cmVhbVRvUHJvY2Vzc1JlbW90ZUZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCSJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIiwgZSkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLkFic3RyYWN0UmVtb3RlUmVzb3VyY2UjcHV0SW5mbyhvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVJlc291cmNlSW5mbywgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRJbmZvKElGaWxlSW5mbyBpbmZvLCBpbnQgb3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAodXBsb2FkRXhlY3V0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoIXVwbG9hZEV4ZWN1dGlvbi53YXNGaW5pc2hlZCgpKSB7Ci0JCQkJCXVwbG9hZEV4ZWN1dGlvbi53YWl0Rm9yRW5kT2ZFeGVjdXRpb24oKTsKLQkJCQl9Ci0JCQkJdXBsb2FkRXhlY3V0aW9uID0gbnVsbDsKLQkJCX0KLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCXJlbW90ZUl0ZW0ucmVmcmVzaEF0dHJpYnV0ZXMoKTsKLQkJCWlmICgob3B0aW9ucyAmIEVGUy5TRVRfQVRUUklCVVRFUykgIT0gMCkgewotCQkJCS8vV2UgY2Fubm90IGN1cnJlbnRseSB3cml0ZSBpc0V4ZWN1dGFibGUoKSwgaXNIaWRkZW4oKQotCQkJCWJvb2xlYW4gd3JpdGVhYmxlID0gIWluZm8uZ2V0QXR0cmlidXRlKEVGUy5BVFRSSUJVVEVfUkVBRF9PTkxZKTsKLQkJCQlyZW1vdGVJdGVtLnNldFdyaXRlYWJsZSh3cml0ZWFibGUpOwotCQkJCWlmKCF0aGlzLmlzRGlyZWN0b3J5KSB7Ci0JCQkJCWJvb2xlYW4gZXhlY3V0YWJsZSA9IGluZm8uZ2V0QXR0cmlidXRlKEVGUy5BVFRSSUJVVEVfRVhFQ1VUQUJMRSk7Ci0JCQkJCUlSZW1vdGVGaWxlIGZpbGUgPSAoSVJlbW90ZUZpbGUpcmVtb3RlSXRlbTsKLQkJCQkJZmlsZS5zZXRFeGVjdXRhYmxlKGV4ZWN1dGFibGUpOwotCQkJCX0KLQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoKG9wdGlvbnMgJiBFRlMuU0VUX0xBU1RfTU9ESUZJRUQpICE9IDApIHsKLQkJCQlsb25nIG1vZHRpbWUgPSBpbmZvLmdldExhc3RNb2RpZmllZCgpOwotCQkJCXJlbW90ZUl0ZW0uc2V0TW9kaWZpY2F0aW9uVGltZShtb2R0aW1lKTsKLQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQlyZW1vdGVJdGVtLmNvbW1pdEF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlI3RvVVJJKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVVJJIHRvVVJJKCkgewotCQlyZXR1cm4gcmVtb3RlVVJJOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNGaWxlU3lzdGVtLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzRmlsZVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzA0ZmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNGaWxlU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIAotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIEluaXRpYWwgQ29udHJpYnV0b3JzOgotICogVGhlIGZvbGxvd2luZyBJQk0gZW1wbG95ZWVzIGNvbnRyaWJ1dGVkIHRvIHRoZSBSZW1vdGUgU3lzdGVtIEV4cGxvcmVyCi0gKiBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGlzIGZpbGU6IERhdmlkIE1jS25pZ2h0LCBLdXNoYWwgTXVuaXIsIAotICogTWljaGFlbCBCZXJnZXIsIERhdmlkIER5a3N0YWwsIFBoaWwgQ291bHRoYXJkLCBEb24gWWFudHppLCBFcmljIFNpbXBzb24sIAotICogRW1pbHkgQnJ1bmVyLCBNYXplbiBGYXJhaiwgQWRyaWFuIFN0b3Jpc3RlYW51LCBMaSBEaW5nLCBhbmQgS2VudCBIYXdsZXkuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIERhdmlkIER5a3N0YWwgKElCTSkgLSAxNjg5Nzc6IHJlZmFjdG9yaW5nIElDb25uZWN0b3JTZXJ2aWNlIGFuZCBTZXJ2ZXJMYXVuY2hlciBoaWVyYXJjaGllcwotICogS3VzaGFsIE11bmlyIChJQk0pIC0gbW92ZWQgdG8gaW50ZXJuYWwgcGFja2FnZQotICogTWFydGluIE9iZXJodWJlciAoV2luZCBSaXZlcikgLSBbMTgxOTE3XSBFRlMgSW1wcm92ZW1lbnRzOiBBdm9pZCB1bmNsb3NlZCBTdHJlYW1zLAotICogICAgLSBGaXggZWFybHkgc3RhcnR1cCBpc3N1ZXMgYnkgZGVmZXJyaW5nIEZpbGVTdG9yZSBldmFsdWF0aW9uIGFuZCBjbGFzc2xvYWRpbmcsCi0gKiAgICAtIEltcHJvdmUgcGVyZm9ybWFuY2UgYnkgUlNFRmlsZVN0b3JlIGluc3RhbmNlIGZhY3RvcnkgYW5kIGNhY2hpbmcgSVJlbW90ZUZpbGUuCi0gKiAgICAtIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5IGNsYXNzIFJTRUZpbGVDYWNoZSBhbmQgb2Jzb2xldGUgYnJhbmRpbmcgZmlsZXMuCi0gKiBNYXJ0aW4gT2Jlcmh1YmVyIChXaW5kIFJpdmVyKSAtIFsxODgzNjBdIHJlbmFtZWQgZnJvbSBwbHVnaW4gb3JnLmVjbGlwc2UucnNlLmVjbGlwc2UuZmlsZXN5c3RlbQotICogTWFydGluIE9iZXJodWJlciAoV2luZCBSaXZlcikgLSBbMTk5NTg3XSByZXR1cm4gYXR0cmlidXRlcyBvZiBSZW1vdGVUb29sc0ZpbGVTeXN0ZW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5wcm92aWRlci5GaWxlU3lzdGVtOwotCi1wdWJsaWMgY2xhc3MgUmVtb3RlVG9vbHNGaWxlU3lzdGVtIGV4dGVuZHMgRmlsZVN5c3RlbSAKLXsKLQlwcml2YXRlIHN0YXRpYyBSZW1vdGVUb29sc0ZpbGVTeXN0ZW0gaW5zdGFuY2UgPSBuZXcgUmVtb3RlVG9vbHNGaWxlU3lzdGVtKCk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBSZW1vdGVUb29sc0ZpbGVTeXN0ZW0oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgZmlsZSBzeXN0ZW0uCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgZmlsZSBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW1vdGVUb29sc0ZpbGVTeXN0ZW0gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTeXN0ZW0jYXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIGludCBhdHRyaWJ1dGVzKCkgewotCQkvL0F0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IFJTRSBJRmlsZVNlcnZpY2UKLQkJcmV0dXJuIEVGUy5BVFRSSUJVVEVfUkVBRF9PTkxZIHwgRUZTLkFUVFJJQlVURV9FWEVDVVRBQkxFCi0JCSAgICAgfCBFRlMuQVRUUklCVVRFX1NZTUxJTksgfCBFRlMuQVRUUklCVVRFX0xJTktfVEFSR0VUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyLkZpbGVTeXN0ZW0jY2FuRGVsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5EZWxldGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyLkZpbGVTeXN0ZW0jY2FuV3JpdGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbldyaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5wcm92aWRlci5GaWxlU3lzdGVtI2dldFN0b3JlKGphdmEubmV0LlVSSSkKLQkgKi8KLQlwdWJsaWMgSUZpbGVTdG9yZSBnZXRTdG9yZShVUkkgdXJpKSB7Ci0JCXRyeSAgewotCQkJcmV0dXJuIFJlbW90ZVRvb2xzRmlsZVN0b3JlLmdldEluc3RhbmNlKHVyaSk7Ci0JCX0gCi0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9Db3VsZCBiZSBhbiBVUkkgZm9ybWF0IGV4Y2VwdGlvbgotCQkJcmV0dXJuIEVGUy5nZXROdWxsRmlsZVN5c3RlbSgpLmdldFN0b3JlKHVyaSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc1Byb2Nlc3MuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTczNTEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc1Byb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5OdWxsSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc1Byb2Nlc3MgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVByb2Nlc3MgewotCXByaXZhdGUgUHJvY2VzcyByZW1vdGVQcm9jZXNzOwotCXByaXZhdGUgSW5wdXRTdHJlYW0gcHJvY1N0ZG91dDsKLQlwcml2YXRlIElucHV0U3RyZWFtIHByb2NTdGRlcnI7Ci0JcHJpdmF0ZSBUaHJlYWQgc3Rkb3V0UmVhZGVyOwotCXByaXZhdGUgVGhyZWFkIHN0ZGVyclJlYWRlcjsKLQkKLQlwcml2YXRlIGNsYXNzIFByb2NSZWFkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBCVUZfU0laRSA9IDgxOTI7Ci0JCQotCQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0OwotCQlwcml2YXRlIE91dHB1dFN0cmVhbSBvdXRwdXQ7Ci0JCQotCQlwdWJsaWMgUHJvY1JlYWRlcihJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkgewotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQkJdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWludCBsZW47Ci0JCQlieXRlIGJbXSA9IG5ldyBieXRlW0JVRl9TSVpFXTsKLQkJCQotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoKGxlbiA9IGlucHV0LnJlYWQoYikpID4gMCkgewotCQkJCQlvdXRwdXQud3JpdGUoYiwgMCwgbGVuKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFJlbW90ZVRvb2xzUHJvY2VzcyhQcm9jZXNzIHByb2MsIGJvb2xlYW4gbWVyZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJlbW90ZVByb2Nlc3MgPSBwcm9jOwotCQkKLQkJaWYgKG1lcmdlKSB7Ci0JCQlQaXBlZE91dHB1dFN0cmVhbSBwaXBlZE91dHB1dCA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotCQkJCi0JCQlwcm9jU3Rkb3V0ID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0ocGlwZWRPdXRwdXQpOwotCQkJcHJvY1N0ZGVyciA9IG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKLQotCQkJc3RkZXJyUmVhZGVyID0gbmV3IFRocmVhZChuZXcgUHJvY1JlYWRlcihwcm9jLmdldEVycm9yU3RyZWFtKCksIHBpcGVkT3V0cHV0KSk7Ci0JCQlzdGRvdXRSZWFkZXIgPSBuZXcgVGhyZWFkKG5ldyBQcm9jUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgcGlwZWRPdXRwdXQpKTsKLQkJCQotCQkJc3RkZXJyUmVhZGVyLnN0YXJ0KCk7Ci0JCQlzdGRvdXRSZWFkZXIuc3RhcnQoKTsKLQkJfSBlbHNlIHsKLQkJCXByb2NTdGRvdXQgPSBwcm9jLmdldElucHV0U3RyZWFtKCk7Ci0JCQlwcm9jU3RkZXJyID0gcHJvYy5nZXRFcnJvclN0cmVhbSgpOwotCQl9Ci0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3MjZGVzdHJveSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLQkJcmVtb3RlUHJvY2Vzcy5kZXN0cm95KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3MjZXhpdFZhbHVlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGV4aXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHJlbW90ZVByb2Nlc3MuZXhpdFZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3MjZ2V0RXJyb3JTdHJlYW0oKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpIHsKLQkJcmV0dXJuIHByb2NTdGRlcnI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3MjZ2V0SW5wdXRTdHJlYW0oKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIHByb2NTdGRvdXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3MjZ2V0T3V0cHV0U3RyZWFtKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIHJlbW90ZVByb2Nlc3MuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3Mjd2FpdEZvcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCB3YWl0Rm9yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlbW90ZVByb2Nlc3Mud2FpdEZvcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVQcm9jZXNzI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlZCgpIHsKLQkJdHJ5IHsKLQkJCXJlbW90ZVByb2Nlc3MuZXhpdFZhbHVlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNQcm9jZXNzQnVpbGRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc1Byb2Nlc3NCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OWM3NWUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc1Byb2Nlc3NCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLkFic3RyYWN0UmVtb3RlUHJvY2Vzc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU2NyaXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLlJlbW90ZVByb2Nlc3M7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc1Byb2Nlc3NCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVQcm9jZXNzQnVpbGRlciB7Ci0JcHJpdmF0ZSBSZW1vdGVUb29sc0Nvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVtb3RlRW52ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlwdWJsaWMgUmVtb3RlVG9vbHNQcm9jZXNzQnVpbGRlcihSZW1vdGVUb29sc0Nvbm5lY3Rpb24gY29ubiwgTGlzdDxTdHJpbmc+IGNvbW1hbmQpIHsKLQkJc3VwZXIoY29ubiwgY29tbWFuZCk7Ci0vLwkJcmVtb3RlRW52LnB1dEFsbChTeXN0ZW0uZ2V0ZW52KCkpOwotCQl0aGlzLmNvbm5lY3Rpb24gPSBjb25uOwotCX0KLQkKLQlwdWJsaWMgUmVtb3RlVG9vbHNQcm9jZXNzQnVpbGRlcihSZW1vdGVUb29sc0Nvbm5lY3Rpb24gY29ubiwgU3RyaW5nLi4uIGNvbW1hbmQpIHsKLQkJdGhpcyhjb25uLCBBcnJheXMuYXNMaXN0KGNvbW1hbmQpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVQcm9jZXNzQnVpbGRlciNlbnZpcm9ubWVudCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiByZW1vdGVFbnY7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzQnVpbGRlciNzdGFydCgpCi0JICovCi0JcHVibGljIElSZW1vdGVQcm9jZXNzIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGhlIGV4aXQgY29tbWFuZCBpcyBjYWxsZWQgdG8gZm9yY2UgdGhlIHJlbW90ZSBzaGVsbCB0byBjbG9zZSBhZnRlciBvdXIgY29tbWFuZCAKLQkJLy8gaXMgZXhlY3V0ZWQuIFRoaXMgaXMgdG8gcHJldmVudCBhIHJ1bm5pbmcgcHJvY2VzcyBhdCB0aGUgZW5kIG9mIHRoZSBkZWJ1ZyBzZXNzaW9uLgotCQkvLyBTZWUgQnVnIDE1ODc4Ni4KLQkJTGlzdDxTdHJpbmc+IGNtZEFyZ3MgPSBjb21tYW5kKCk7Ci0JCWlmIChjbWRBcmdzLnNpemUoKSA8IDEpIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyByZW1vdGVDbWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbWRBcmdzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlyZW1vdGVDbWQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZW1vdGVDbWQgKz0gc3BhY2VFc2NhcGlmeShjbWRBcmdzLmdldChpKSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBleGVNZ3IgPSBjb25uZWN0aW9uLmNyZWF0ZUV4ZWN1dGlvbk1hbmFnZXIoKTsKLQkJCUlSZW1vdGVFeGVjdXRpb25Ub29scyBleGVUb29scyA9IGV4ZU1nci5nZXRFeGVjdXRpb25Ub29scygpOwotCQkJSVJlbW90ZVNjcmlwdCBzY3JpcHQgPSBleGVUb29scy5jcmVhdGVTY3JpcHQoKTsKLQkJCWlmKGRpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc2V0V29ya2luZ0RpclN0ciA9ICJjZCAiICsgZGlyZWN0b3J5KCkudG9VUkkoKS5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzY3JpcHQuc2V0U2NyaXB0KG5ldyBTdHJpbmcgW117c2V0V29ya2luZ0RpclN0ciwgcmVtb3RlQ21kfSk7Ci0JCQl9IGVsc2UgewotCQkJCXNjcmlwdC5zZXRTY3JpcHQocmVtb3RlQ21kKTsKLQkJCX0KLQkJCQotCQkJZm9yIChFbnRyeTxTdHJpbmcsU3RyaW5nPiAgZW50cnkgOiBlbnZpcm9ubWVudCgpLmVudHJ5U2V0KCkpIHsKLQkJCQlzY3JpcHQuYWRkRW52aXJvbm1lbnQoZW50cnkuZ2V0S2V5KCkrIj0iK2VudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVJlbW90ZVByb2Nlc3MgcHJvY2VzcyA9IGV4ZVRvb2xzLmV4ZWN1dGVQcm9jZXNzKHNjcmlwdCk7Ci0JCQlyZXR1cm4gbmV3IFJlbW90ZVRvb2xzUHJvY2Vzcyhwcm9jZXNzLCByZWRpcmVjdEVycm9yU3RyZWFtKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBzcGFjZUVzY2FwaWZ5KFN0cmluZyBpbnB1dFN0cmluZykgewotCQlpZihpbnB1dFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpbnB1dFN0cmluZy5yZXBsYWNlQWxsKCIgIiwgIlxcXFwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVRvb2xzU2VydmljZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNTZXJ2aWNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkzYTRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNTZXJ2aWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJvY2Vzc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlc0RlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVtb3RlVG9vbHNTZXJ2aWNlcyBpbXBsZW1lbnRzIElSZW1vdGVTZXJ2aWNlc0RlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBSZW1vdGVUb29sc1NlcnZpY2VzIGluc3RhbmNlID0gbmV3IFJlbW90ZVRvb2xzU2VydmljZXMoKTsKLQlwcml2YXRlIHN0YXRpYyBSZW1vdGVUb29sc0Nvbm5lY3Rpb25NYW5hZ2VyIGNvbm5NZ3IgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHNoYXJlZCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICogCi0JICogQHJldHVybiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVtb3RlVG9vbHNTZXJ2aWNlcyBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzRGVsZWdhdGUjZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBjb25uTWdyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzRGVsZWdhdGUjZ2V0RmlsZU1hbmFnZXIob3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlRmlsZU1hbmFnZXIgZ2V0RmlsZU1hbmFnZXIoSVJlbW90ZUNvbm5lY3Rpb24gY29ubikgewotCQlpZiAoIShjb25uIGluc3RhbmNlb2YgUmVtb3RlVG9vbHNDb25uZWN0aW9uKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVtb3RlVG9vbHNDb25uZWN0aW9uIHJlbUNvbm4gPSAoUmVtb3RlVG9vbHNDb25uZWN0aW9uKWNvbm47Ci0JCUlSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIG1ncjsKLQkJdHJ5IHsKLQkJCW1nciA9IHJlbUNvbm4uY3JlYXRlRXhlY3V0aW9uTWFuYWdlcigpOwotCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgUmVtb3RlVG9vbHNGaWxlTWFuYWdlcihyZW1Db25uLCBtZ3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzRGVsZWdhdGUjZ2V0UHJvY2Vzc0J1aWxkZXIob3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZVByb2Nlc3NCdWlsZGVyIGdldFByb2Nlc3NCdWlsZGVyKElSZW1vdGVDb25uZWN0aW9uIGNvbm4sIExpc3Q8U3RyaW5nPmNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdGVUb29sc1Byb2Nlc3NCdWlsZGVyKChSZW1vdGVUb29sc0Nvbm5lY3Rpb24pY29ubiwgY29tbWFuZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlU2VydmljZXNEZWxlZ2F0ZSNnZXRQcm9jZXNzQnVpbGRlcihvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24sIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZVByb2Nlc3NCdWlsZGVyIGdldFByb2Nlc3NCdWlsZGVyKElSZW1vdGVDb25uZWN0aW9uIGNvbm4sIFN0cmluZy4uLiBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgUmVtb3RlVG9vbHNQcm9jZXNzQnVpbGRlcigoUmVtb3RlVG9vbHNDb25uZWN0aW9uKWNvbm4sIGNvbW1hbmQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzRGVsZWdhdGUjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKGNvbm5NZ3IgPT0gbnVsbCkgewotCQkJY29ubk1nciA9IG5ldyBSZW1vdGVUb29sc0Nvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc1NlcnZpY2VzRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVUb29sc1NlcnZpY2VzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y4NjNlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvUmVtb3RlVG9vbHNTZXJ2aWNlc0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlU2VydmljZXNEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFJlbW90ZVRvb2xzU2VydmljZXNGYWN0b3J5IGltcGxlbWVudHMgSVJlbW90ZVNlcnZpY2VzRmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlc0ZhY3RvcnkjZ2V0U2VydmljZXMoKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlU2VydmljZXNEZWxlZ2F0ZSBnZXRTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIFJlbW90ZVRvb2xzU2VydmljZXMuZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L0NvbmZpZ0ZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvZW52aXJvbm1lbnQvQ29uZmlnRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTg3ZjNlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvZW52aXJvbm1lbnQvQ29uZmlnRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5lbnZpcm9ubWVudDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5SZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5lbnZpcm9ubWVudC5jb25mLkF0dHJpYnV0ZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5lbnZpcm9ubWVudC5jb25mLkRlZmF1bHRWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnZlcmlmaWNhdGlvbi5Db250cm9sQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMudmVyaWZpY2F0aW9uLklsbGVnYWxBdHRyaWJ1dGVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHJ1bGVzIHRvIGJ1aWxkIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBmcm9tIGFuIGF0dHJpYnV0ZSBoYXNoIG1hcC4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdGYWN0b3J5IHsKLQlNYXA8U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRNYXAgPSBudWxsOwotCU1hcDxTdHJpbmcsIFN0cmluZz4gZGVmYXVsdE1hcCA9IG51bGw7Ci0JCi0JQ29udHJvbEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJwdHAuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTiA9IFBSRUZJWCArICJsb2NhbGhvc3Qtc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTE9HSU5fVVNFUk5BTUUgPSBQUkVGSVggKyAibG9naW4tdXNlcm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MT0dJTl9QQVNTV09SRCA9IFBSRUZJWCArICJsb2dpbi1wYXNzd29yZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTk5FQ1RJT05fQUREUkVTUyA9IFBSRUZJWCArICJjb25uZWN0aW9uLWFkZHJlc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05ORUNUSU9OX1BPUlQgPSBQUkVGSVggKyAiY29ubmVjdGlvbi1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfS0VZX1BBVEggPSBQUkVGSVggKyAia2V5LXBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9LRVlfUEFTU1BIUkFTRSA9IFBSRUZJWCArICJrZXktcGFzc3BocmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lTX1BBU1NXT1JEX0FVVEggPSBQUkVGSVggKyAiaXMtcGFzc3dkLWF1dGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05ORUNUSU9OX1RJTUVPVVQgPSBQUkVGSVggKyAiY29ubmVjdGlvbi10aW1lb3V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0lQSEVSX1RZUEUgPSBQUkVGSVggKyAiY2lwaGVyLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBLRVlfQVJSQVkgPSB7IEFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTiwKLQkJCUFUVFJfTE9HSU5fVVNFUk5BTUUsIEFUVFJfQ09OTkVDVElPTl9QT1JULCBBVFRSX0NPTk5FQ1RJT05fQUREUkVTUywKLQkJCUFUVFJfS0VZX1BBVEgsIEFUVFJfSVNfUEFTU1dPUkRfQVVUSCwgQVRUUl9DT05ORUNUSU9OX1RJTUVPVVR9OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gS0VZX0NJUEhFUkVEX0FSUkFZID0geyBBVFRSX0tFWV9QQVNTUEhSQVNFLAotCQkJQVRUUl9MT0dJTl9QQVNTV09SRCB9OwotCQotCXB1YmxpYyBDb25maWdGYWN0b3J5KCkgewotCQljcmVhdGVEZWZhdWx0TWFwKCk7Ci0JCWNyZWF0ZUN1cnJlbnRNYXBGcm9tUHJlZmVyZW5jZXMoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBDb250cm9sQXR0cmlidXRlcyhjdXJyZW50TWFwLCBkZWZhdWx0TWFwKTsKLQl9Ci0JCi0JcHVibGljIENvbmZpZ0ZhY3RvcnkoTWFwPFN0cmluZywgU3RyaW5nPiBuZXdNYXApIHsKLQkJY3JlYXRlRGVmYXVsdE1hcCgpOwotCQlpZiAobmV3TWFwID09IG51bGwpIHsKLQkJCWNyZWF0ZUN1cnJlbnRNYXBGcm9tUHJlZmVyZW5jZXMoKTsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4obmV3TWFwKTsKLQkJfQotCQlhdHRyaWJ1dGVzID0gbmV3IENvbnRyb2xBdHRyaWJ1dGVzKGN1cnJlbnRNYXAsIGRlZmF1bHRNYXApOwotCX0KLQkKLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRNYXAoKSB7Ci0JCXJldHVybiBjdXJyZW50TWFwOwotCX0KLQkKLQlwdWJsaWMgQ29udHJvbEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0TWFwKCkgewotCQlkZWZhdWx0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTiwgRGVmYXVsdFZhbHVlcy5MT0NBTEhPU1RfU0VMRUNUSU9OKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9MT0dJTl9VU0VSTkFNRSwgRGVmYXVsdFZhbHVlcy5MT0dJTl9VU0VSTkFNRSk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfTE9HSU5fUEFTU1dPUkQsIERlZmF1bHRWYWx1ZXMuTE9HSU5fUEFTU1dPUkQpOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX0NPTk5FQ1RJT05fUE9SVCwgRGVmYXVsdFZhbHVlcy5DT05ORUNUSU9OX1BPUlQpOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX0NPTk5FQ1RJT05fQUREUkVTUywgRGVmYXVsdFZhbHVlcy5DT05ORUNUSU9OX0FERFJFU1MpOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX0tFWV9QQVRILCBEZWZhdWx0VmFsdWVzLktFWV9QQVRIKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9LRVlfUEFTU1BIUkFTRSwgRGVmYXVsdFZhbHVlcy5LRVlfUEFTU1BIUkFTRSk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfSVNfUEFTU1dPUkRfQVVUSCwgRGVmYXVsdFZhbHVlcy5JU19QQVNTV09SRF9BVVRIKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9DT05ORUNUSU9OX1RJTUVPVVQsIERlZmF1bHRWYWx1ZXMuQ09OTkVDVElPTl9USU1FT1VUKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9DSVBIRVJfVFlQRSwgUFRQVGFyZ2V0Q29udHJvbC5ERUZBVUxUX0NJUEhFUik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDdXJyZW50TWFwRnJvbVByZWZlcmVuY2VzKCkgewotCQljdXJyZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCVByZWZlcmVuY2VzIHN0b3JlID0gUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJY3VycmVudE1hcC5wdXQoQVRUUl9MT0dJTl9VU0VSTkFNRSwgc3RvcmUuZ2V0U3RyaW5nKEFUVFJfTE9HSU5fVVNFUk5BTUUpKTsKLQkJY3VycmVudE1hcC5wdXQoQVRUUl9DT05ORUNUSU9OX0FERFJFU1MsIHN0b3JlLmdldFN0cmluZyhBVFRSX0NPTk5FQ1RJT05fQUREUkVTUykpOwotCQljdXJyZW50TWFwLnB1dChBVFRSX0NPTk5FQ1RJT05fUE9SVCwgc3RvcmUuZ2V0U3RyaW5nKEFUVFJfQ09OTkVDVElPTl9QT1JUKSk7Ci0JfQotCQotCXB1YmxpYyBUYXJnZXRDb25maWcgY3JlYXRlVGFyZ2V0Q29uZmlnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJVGFyZ2V0Q29uZmlnIGNvbmZpZyA9IG5ldyBUYXJnZXRDb25maWcoKTsKLQkJCWNvbmZpZy5zZXRMb2dpblVzZXJOYW1lKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfTE9HSU5fVVNFUk5BTUUpKTsKLQkJCWNvbmZpZy5zZXRMb2dpblBhc3N3b3JkKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfTE9HSU5fUEFTU1dPUkQpKTsKLQkJCWNvbmZpZy5zZXRDb25uZWN0aW9uUG9ydChhdHRyaWJ1dGVzLnZlcmlmeUludChBdHRyaWJ1dGVOYW1lcy5DT05ORUNUSU9OX1BPUlQsIEFUVFJfQ09OTkVDVElPTl9QT1JUKSk7Ci0JCQlpZiAoYXR0cmlidXRlcy5nZXRCb29sZWFuKEFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTikpIHsKLQkJCQljb25maWcuc2V0Q29ubmVjdGlvbkFkZHJlc3MoImxvY2FsaG9zdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWNvbmZpZy5zZXRDb25uZWN0aW9uQWRkcmVzcyhhdHRyaWJ1dGVzLmdldFN0cmluZyhBVFRSX0NPTk5FQ1RJT05fQUREUkVTUykpOwotCQkJfQotCQkJY29uZmlnLnNldENvbm5lY3Rpb25UaW1lb3V0KGF0dHJpYnV0ZXMudmVyaWZ5SW50KEF0dHJpYnV0ZU5hbWVzLkNPTk5FQ1RJT05fVElNRU9VVCwgQVRUUl9DT05ORUNUSU9OX1RJTUVPVVQpKTsKLQkJCWNvbmZpZy5zZXRLZXlQYXNzcGhyYXNlKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfS0VZX1BBU1NQSFJBU0UpKTsKLQkJCWNvbmZpZy5zZXRLZXlQYXRoKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfS0VZX1BBVEgpKTsKLQkJCWNvbmZpZy5zZXRJc1Bhc3N3b3JkQXV0aChhdHRyaWJ1dGVzLmdldEJvb2xlYW4oQVRUUl9JU19QQVNTV09SRF9BVVRIKSk7Ci0JCQljb25maWcuc2V0Q2lwaGVyVHlwZShhdHRyaWJ1dGVzLmdldFN0cmluZyhBVFRSX0NJUEhFUl9UWVBFKSk7Ci0JCQlyZXR1cm4gY29uZmlnOwotCQl9IGNhdGNoIChJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvZW52aXJvbm1lbnQvUFRQVGFyZ2V0Q29udHJvbC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9QVFBUYXJnZXRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNzQ4ZDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9QVFBUYXJnZXRDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLlJlbW90ZVRvb2xzQWRhcHRlckNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5SZW1vdGV0b29sc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLlNTSFRhcmdldENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuSVRhcmdldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmV4dGVuc2lvbi5JVGFyZ2V0VmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb250cm9scyBhbiBpbnN0YW5jZSBvZiBhIHRhcmdldCBjcmVhdGVkIGZyb20gdGhlIEVudmlyb25tZW50LgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFBUYXJnZXRDb250cm9sIGV4dGVuZHMgU1NIVGFyZ2V0Q29udHJvbCBpbXBsZW1lbnRzIElUYXJnZXRDb250cm9sLCBJVGFyZ2V0VmFyaWFibGVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfT1BFUkFUSU9OQUwgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU5HID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVEVEID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVElORyA9IDQ7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjaXBoZXIgaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NJUEhFUiA9IFJlbW90ZXRvb2xzUGx1Z2luLkNJUEhFUl9ERUZBVUxUOwotCS8qKgotCSAqIENvbmZpZ3VyYXRpb24gcHJvdmlkZWQgdG8gdGhlIHRhcmdldCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgQ29uZmlnRmFjdG9yeSBjb25maWdGYWN0b3J5OwotCXByaXZhdGUgVGFyZ2V0Q29uZmlnIGN1cnJlbnRUYXJnZXRDb25maWc7Ci0JLyoqCi0JICogQmFja1JlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIElUYXJnZXRFbGVtZW50IHRhcmdldEVsZW1lbnQ7Ci0JcHJpdmF0ZSBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBleGVjdXRpb25NYW5hZ2VyOwotCQotCS8qKgotCSAqIEN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIGludCBzdGF0ZTsKLQkKLQlwcml2YXRlIElSZW1vdGVDb25uZWN0aW9uTWFuYWdlciBjb25NZ3IgPSBudWxsOwotCXByaXZhdGUgSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFyZ2V0IGNvbnRyb2wuIElmIHNvbWUgYXR0cmlidXRlIHJlbGF0ZWQgdG8gdGhlIGVudmlyb25tZW50IGhhcyBhbiBpbnZhbGlkCi0JICogZm9ybWF0LCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiBTaW11bGF0b3IgYXR0cmlidXRlcyBhcmUgbm90IGNoZWNrZWQgeWV0LCBidXQgd2lsbCBiZSBjaGVja2VkIHdoZW4gdGhlIHRhcmdldCBpcwotCSAqIGNyZWF0ZWQgKGxhdW5jaGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE5hbWUgZm9yIHRoZSB0YXJnZXQgKGRpc3BsYXllZCBpbiBHVUkpCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgU29tZSBhdHRyaWJ1dGUgaXMgbm90IHZhbGlkCi0JICovCi0JcHVibGljIFBUUFRhcmdldENvbnRyb2woSVRhcmdldEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQlzdGF0ZSA9IE5PVF9PUEVSQVRJT05BTDsKLQkJdGFyZ2V0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWNvbmZpZ0ZhY3RvcnkgPSBuZXcgQ29uZmlnRmFjdG9yeSh0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0JCWN1cnJlbnRUYXJnZXRDb25maWcgPSBjb25maWdGYWN0b3J5LmNyZWF0ZVRhcmdldENvbmZpZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24oSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIGNvbk1nciwgSVJlbW90ZUNvbm5lY3Rpb24gY29ubikgewotCQl0aGlzLmNvbk1nciA9IGNvbk1ncjsKLQkJdGhpcy5jb25uZWN0aW9uID0gY29ubjsKLQl9Ci0JCi0JLyoqCi0JICogQ29ubmVjdCB0byB0aGUgcmVtb3RlIGhvc3QuIE9uIGV2ZXJ5IGVycm9yIG9yIHBvc3NpYmxlIGZhaWx1cmUsIGFuIGV4Y2VwdGlvbgotCSAqIChDb3JlRXhjZXB0aW9uKSBpcyB0aHJvd24sIHdob3NlIChtdWx0aSlzdGF0dXMgZGVzY3JpYmUgdGhlIGVycm9yKHMpIHRoYXQgcHJldmVudGVkIGNyZWF0aW5nIHRoZSB0YXJnZXQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgUHJvZ3Jlc3MgaW5kaWNhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBBbHdheXMgdHJ1ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBTb21lIGF0dHJpYnV0ZSBpcyBub3QgdmFsaWQsIHRoZSBzaW11bGF0b3IgY2Fubm90IGJlIGxhdW5jaGVkLCB0aGUgc3NoIGZhaWxlZCB0byBjb25uZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNyZWF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuVGFyZ2V0Q29udHJvbF9jcmVhdGVfTW9uaXRvckNvbm5lY3RpbmcsIDEpOwotCQkvKgotCQkgKiAgQ29ubmVjdCB0byB0aGUgcmVtb3RlIGhvc3QKLQkJICovCi0JCWlmKGN1cnJlbnRUYXJnZXRDb25maWcuaXNQYXNzd29yZEF1dGgoKSkgewotCQkJc2V0Q29ubmVjdGlvblBhcmFtZXRlcnMoCi0JCQkJCW5ldyBTU0hQYXJhbWV0ZXJzKAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0Q29ubmVjdGlvbkFkZHJlc3MoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldENvbm5lY3Rpb25Qb3J0KCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRMb2dpblVzZXJOYW1lKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRMb2dpblBhc3N3b3JkKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRDaXBoZXJUeXBlKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRDb25uZWN0aW9uVGltZW91dCgpKjEwMDAKLQkJCQkJKQotCQkJCSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRDb25uZWN0aW9uUGFyYW1ldGVycygKLQkJCQkJbmV3IFNTSFBhcmFtZXRlcnMoCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRDb25uZWN0aW9uQWRkcmVzcygpLAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0Q29ubmVjdGlvblBvcnQoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldExvZ2luVXNlck5hbWUoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldEtleVBhdGgoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldEtleVBhc3NwaHJhc2UoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldENpcGhlclR5cGUoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldENvbm5lY3Rpb25UaW1lb3V0KCkqMTAwMAotCQkJCQkpCi0JCQkJKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXNldFN0YXRlKENPTk5FQ1RJTkcpOwotCQkJc3VwZXIuY3JlYXRlKG1vbml0b3IpOwotCQkJc2V0U3RhdGUoQ09OTkVDVEVEKTsKLQkJCQotCQkJaWYgKGNvbk1nciAhPSBudWxsKSB7Ci0JCQkJY29uTWdyLmZpcmVDb25uZWN0aW9uQ2hhbmdlRXZlbnQobmV3IElSZW1vdGVDb25uZWN0aW9uQ2hhbmdlRXZlbnQoKXsKLQkJCQkJcHVibGljIElSZW1vdGVDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0JCQkJCQlyZXR1cm4gY29ubmVjdGlvbjsKLQkJCQkJfQotCQkKLQkJCQkJcHVibGljIGludCBnZXRUeXBlKCkgewotCQkJCQkJcmV0dXJuIElSZW1vdGVDb25uZWN0aW9uQ2hhbmdlRXZlbnQuQ09OTkVDVElPTl9PUEVORUQ7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQl9Ci0JCQkKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWRpc2Nvbm5lY3QoKTsKLQkJCXNldFN0YXRlKE5PVF9PUEVSQVRJT05BTCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlleGVjdXRpb25NYW5hZ2VyID0gc3VwZXIuY3JlYXRlUmVtb3RlRXhlY3V0aW9uTWFuYWdlcigpOwotCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWRpc2Nvbm5lY3QoKTsKLQkJCXNldFN0YXRlKE5PVF9PUEVSQVRJT05BTCk7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5TU0hUYXJnZXRDb250cm9sI2NyZWF0ZVRhcmdldFNvY2tldChpbnQpCi0JICovCi0JcHVibGljIFRhcmdldFNvY2tldCBjcmVhdGVUYXJnZXRTb2NrZXQoaW50IHBvcnQpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShpc0Nvbm5lY3RlZCgpKTsKLQkJVGFyZ2V0U29ja2V0IHNvY2tldCA9IG5ldyBUYXJnZXRTb2NrZXQoKTsKLQkJc29ja2V0Lmhvc3QgPSBjdXJyZW50VGFyZ2V0Q29uZmlnLmdldENvbm5lY3Rpb25BZGRyZXNzKCk7Ci0JCXNvY2tldC5wb3J0ID0gcG9ydDsKLQkJcmV0dXJuIHNvY2tldDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbCNkZXN0cm95KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBFbmQgYWxsIGpvYnMsIGlmIHBvc3NpYmxlLCB0aGVuIGRpc2Nvbm5lY3QKLQkJdHJ5IHsKLQkJCXRlcm1pbmF0ZUpvYnMobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlkaXNjb25uZWN0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1haW4gZXhlY3V0aW9uIG1hbmFnZXIgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGV4ZWN1dGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGdldEV4ZWN1dGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBleGVjdXRpb25NYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZXhlY3V0aW9uIG1hbmFnZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHNjcmlwdCBleGVjdXRpb24KLQkgKiBiZWNhdXNlIEtpbGxhYmxlRXhlY3V0aW9uIGNsb3NlcyB0aGUgY2hhbm5lbCBhZnRlciBleGVjdXRpb24uCi0JICogCi0JICogQHJldHVybiBuZXcgZXhlY3V0aW9uIG1hbmFnZXI7Ci0JICovCi0JcHVibGljIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGNyZWF0ZUV4ZWN1dGlvbk1hbmFnZXIoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVSZW1vdGVFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRhcmdldEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLlNTSFRhcmdldENvbnRyb2wjZ2V0UGx1Z2luSWQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklUYXJnZXRWYXJpYWJsZXMjZ2V0U3lzdGVtV29ya3NwYWNlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbVdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRUYXJnZXRDb25maWcuZ2V0U3lzdGVtV29ya3NwYWNlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuU1NIVGFyZ2V0Q29udHJvbCNraWxsKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGtpbGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzZXRTdGF0ZShESVNDT05ORUNUSU5HKTsKLQkJCXN1cGVyLmtpbGwobW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXRTdGF0ZShOT1RfT1BFUkFUSU9OQUwpOwotCQkJCi0JCQlpZiAoY29uTWdyICE9IG51bGwpIHsKLQkJCQljb25NZ3IuZmlyZUNvbm5lY3Rpb25DaGFuZ2VFdmVudChuZXcgSVJlbW90ZUNvbm5lY3Rpb25DaGFuZ2VFdmVudCgpewotCQkJCQlwdWJsaWMgSVJlbW90ZUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJCQkJCXJldHVybiBjb25uZWN0aW9uOwotCQkJCQl9Ci0JCQotCQkJCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCQkJCQlyZXR1cm4gSVJlbW90ZUNvbm5lY3Rpb25DaGFuZ2VFdmVudC5DT05ORUNUSU9OX0NMT1NFRDsKLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldENvbnRyb2wjcXVlcnkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHF1ZXJ5KCkgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgTk9UX09QRVJBVElPTkFMOgotCQkJcmV0dXJuIElUYXJnZXRTdGF0dXMuU1RPUFBFRDsKLQkJY2FzZSBDT05ORUNUSU5HOgotCQljYXNlIERJU0NPTk5FQ1RJTkc6Ci0JCQlyZXR1cm4gSVRhcmdldFN0YXR1cy5TVEFSVEVEOwotCQljYXNlIENPTk5FQ1RFRDoKLQkJCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkJcmV0dXJuIElUYXJnZXRTdGF0dXMuUkVTVU1FRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIElUYXJnZXRTdGF0dXMuU1RBUlRFRDsKLQkJCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBJVGFyZ2V0U3RhdHVzLlNUT1BQRUQ7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbCNyZXN1bWUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzdW1lKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIDAsCi0JCQkJTWVzc2FnZXMuVGFyZ2V0Q29udHJvbF9yZXN1bWVfQ2Fubm90UmVzdW1lLCBudWxsKSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdGF0ZQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbCNzdG9wKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN0b3AoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgMCwKLQkJCQlNZXNzYWdlcy5UYXJnZXRDb250cm9sX3N0b3BfQ2Fubm90UGF1c2UsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIG5ldyBhdHRyaWJ1dGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vdGFyZ2V0RWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQljb25maWdGYWN0b3J5ID0gbmV3IENvbmZpZ0ZhY3RvcnkodGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkpOwotCQljdXJyZW50VGFyZ2V0Q29uZmlnID0gY29uZmlnRmFjdG9yeS5jcmVhdGVUYXJnZXRDb25maWcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L1RhcmdldENvbmZpZy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9UYXJnZXRDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc1MTE1OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L1RhcmdldENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50OwotCi0vKioKLSAqIERlc2NyaWJlcyBhIHRhcmdldCBjcmVhdGVkIGZyb20gdGhlIGVudmlyb25tZW50LiBUaGlzIGNsYXNzIGNvbnRhaW5zIG9ubHkgYXR0cmlidXRlcyB0aGF0IGFwcGx5IGhvdyB0aGUgZW52aXJvbm1lbnQKLSAqIGludGVyYWN0cyB3aXRoIEVjbGlwc2UuIAotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldENvbmZpZyB7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9naW5Vc2VyTmFtZTsKLQlwcml2YXRlIFN0cmluZyBsb2dpblBhc3N3b3JkOwotCXByaXZhdGUgaW50IGNvbm5lY3Rpb25Qb3J0OwotCXByaXZhdGUgU3RyaW5nIGNvbm5lY3Rpb25BZGRyZXNzOwotCXByaXZhdGUgaW50IGNvbm5lY3Rpb25UaW1lb3V0OwotCXByaXZhdGUgU3RyaW5nIGtleVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcga2V5UGFzc3BocmFzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNQYXNzd29yZEF1dGg7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtV29ya3NwYWNlOwotCXByaXZhdGUgU3RyaW5nIGNpcGhlclR5cGU7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uQWRkcmVzcygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25BZGRyZXNzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uQWRkcmVzcyhTdHJpbmcgY29ubmVjdGlvbkFkZHJlc3MpIHsKLQkJdGhpcy5jb25uZWN0aW9uQWRkcmVzcyA9IGNvbm5lY3Rpb25BZGRyZXNzOwotCX0KLQlwdWJsaWMgaW50IGdldENvbm5lY3Rpb25Qb3J0KCkgewotCQlyZXR1cm4gY29ubmVjdGlvblBvcnQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Qb3J0KGludCBjb25uZWN0aW9uUG9ydCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qb3J0ID0gY29ubmVjdGlvblBvcnQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naW5QYXNzd29yZCgpIHsKLQkJcmV0dXJuIGxvZ2luUGFzc3dvcmQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldExvZ2luUGFzc3dvcmQoU3RyaW5nIGxvZ2luUGFzc3dvcmQpIHsKLQkJdGhpcy5sb2dpblBhc3N3b3JkID0gbG9naW5QYXNzd29yZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMb2dpblVzZXJOYW1lKCkgewotCQlyZXR1cm4gbG9naW5Vc2VyTmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TG9naW5Vc2VyTmFtZShTdHJpbmcgbG9naW5Vc2VyTmFtZSkgewotCQl0aGlzLmxvZ2luVXNlck5hbWUgPSBsb2dpblVzZXJOYW1lOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRLZXlQYXRoKFN0cmluZyBrZXlQYXRoKSB7Ci0JCXRoaXMua2V5UGF0aCA9IGtleVBhdGg7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEtleVBhc3NwaHJhc2UoU3RyaW5nIGtleVBhc3NwaHJhc2UpIHsKLQkJdGhpcy5rZXlQYXNzcGhyYXNlID0ga2V5UGFzc3BocmFzZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXNQYXNzd29yZEF1dGgoYm9vbGVhbiBpc1Bhc3N3b3JkQXV0aCkgewotCQl0aGlzLmlzUGFzc3dvcmRBdXRoID0gaXNQYXNzd29yZEF1dGg7IAotCQkKLQl9Ci0JcHVibGljIGludCBnZXRDb25uZWN0aW9uVGltZW91dCgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25UaW1lb3V0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVGltZW91dChpbnQgY29ubmVjdGlvblRpbWVvdXQpIHsKLQkJdGhpcy5jb25uZWN0aW9uVGltZW91dCA9IGNvbm5lY3Rpb25UaW1lb3V0OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkQXV0aCgpIHsKLQkJcmV0dXJuIGlzUGFzc3dvcmRBdXRoOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZEF1dGgoYm9vbGVhbiBpc1Bhc3N3b3JkQXV0aCkgewotCQl0aGlzLmlzUGFzc3dvcmRBdXRoID0gaXNQYXNzd29yZEF1dGg7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5UGFzc3BocmFzZSgpIHsKLQkJcmV0dXJuIGtleVBhc3NwaHJhc2U7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5UGF0aCgpIHsKLQkJcmV0dXJuIGtleVBhdGg7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFN5c3RlbVdvcmtzcGFjZShTdHJpbmcgc3lzdGVtV29ya3NwYWNlKSB7Ci0JCXRoaXMuc3lzdGVtV29ya3NwYWNlID0gc3lzdGVtV29ya3NwYWNlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbVdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIHN5c3RlbVdvcmtzcGFjZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2lwaGVyVHlwZShTdHJpbmcgY2lwaGVyVHlwZSkgewotCQl0aGlzLmNpcGhlclR5cGUgPSBjaXBoZXJUeXBlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldENpcGhlclR5cGUoKSB7Ci0JCXJldHVybiBjaXBoZXJUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvZW52aXJvbm1lbnQvY29uZi9BdHRyaWJ1dGVOYW1lcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9jb25mL0F0dHJpYnV0ZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0YmNmMjAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9jb25mL0F0dHJpYnV0ZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5lbnZpcm9ubWVudC5jb25mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBEZWZpbmVzIG5hbWVzIG9mIGF0dHJpYnV0ZXMuIEludGVuZGVkIGZvciBhbiB1bmlmb3JtIGFuZCBjb25zaXN0ZW50IHVzZSBvZiBuYW1lcyBmb3IKLSAqIGF0dHJpYnV0ZXMgaW4gR1VJLCBlcnJvciBtZXNzYWdlcyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcyBhY3Jvc3MgcGx1Z2lucy4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU5hbWVzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50LmNvbmYuYXR0cmlidXRlX25hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OTkVDVElPTl9BRERSRVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTk5FQ1RJT05fUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05ORUNUSU9OX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BBU1NQSFJBU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BBVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9HSU5fUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9HSU5fVVNFUk5BTUU7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXR0cmlidXRlTmFtZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlTmFtZXMoKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L2NvbmYvRGVmYXVsdFZhbHVlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9jb25mL0RlZmF1bHRWYWx1ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGNmMDMxOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L2NvbmYvRGVmYXVsdFZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50LmNvbmY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKiBAc2luY2UgMS4yLjEKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZXMgZXh0ZW5kcyBOTFMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS5lbnZpcm9ubWVudC5jb25mLmRlZmF1bHRzIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTEhPU1RfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR0lOX1VTRVJOQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR0lOX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTk5FQ1RJT05fQUREUkVTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05ORUNUSU9OX1BPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OTkVDVElPTl9USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9QQVRIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9QQVNTUEhSQVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElTX1BBU1NXT1JEX0FVVEg7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX0lELCBEZWZhdWx0VmFsdWVzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIERlZmF1bHRWYWx1ZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQotCi0JCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L2NvbmYvYXR0cmlidXRlX25hbWVzLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L2NvbmYvYXR0cmlidXRlX25hbWVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmY2RkYWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9lbnZpcm9ubWVudC9jb25mL2F0dHJpYnV0ZV9uYW1lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTE9HSU5fVVNFUk5BTUU9VXNlciBuYW1lIHJlbW90ZSBjb25uZWN0aW9uCi1MT0dJTl9QQVNTV09SRD1QYXNzd29yZCByZW1vdGUgY29ubmVjdGlvbgotQ09OTkVDVElPTl9BRERSRVNTPUFkZHJlc3MgZm9yIHJlbW90ZSBjb25uZWN0aW9uCi1DT05ORUNUSU9OX1BPUlQ9UG9ydCBmb3IgcmVtb3RlIGNvbm5lY3Rpb24KLUtFWV9QQVRIPVBhdGggdG8gZmlsZSB3aXRoIHByaXZhdGUga2V5IGZvciByZW1vdGUgY29ubmVjdGlvbgotS0VZX1BBU1NQSFJBU0U9UGFzc3BocmFzZSB0byBvcGVuIHByaXZhdGUga2V5IGZvciByZW1vdGUgY29ubmVjdGlvbgotQ09OTkVDVElPTl9USU1FT1VUPVRpbWVvdXQgZm9yIHJlbW90ZSBjb25uZWN0aW9uCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL2Vudmlyb25tZW50L2NvbmYvZGVmYXVsdHMucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvZW52aXJvbm1lbnQvY29uZi9kZWZhdWx0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDIwNzVkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL2NvcmUvZW52aXJvbm1lbnQvY29uZi9kZWZhdWx0cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTE9DQUxIT1NUX1NFTEVDVElPTj10cnVlCi1MT0dJTl9VU0VSTkFNRT0KLUxPR0lOX1BBU1NXT1JEPQotQ09OTkVDVElPTl9BRERSRVNTPQotQ09OTkVDVElPTl9QT1JUPTIyCi1DT05ORUNUSU9OX1RJTUVPVVQ9NQotS0VZX1BBVEg9Ci1LRVlfUEFTU1BIUkFTRT0KLUlTX1BBU1NXT1JEX0FVVEg9dHJ1ZQotQ0lQSEVSX1RZUEU9CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlYWE3YWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSUQgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0Q29udHJvbF9jcmVhdGVfTW9uaXRvckNvbm5lY3Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0Q29udHJvbF9yZXN1bWVfQ2Fubm90UmVzdW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldENvbnRyb2xfc3RvcF9DYW5ub3RQYXVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVUb29sc0Nvbm5lY3Rpb25fY29ubmVjdGlvbk5vdE9wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlVG9vbHNDb25uZWN0aW9uX3JlbW90ZVBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlVG9vbHNDb25uZWN0aW9uX29wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlVG9vbHNDb25uZWN0aW9uX2ZvcndhcmRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlVG9vbHNDb25uZWN0aW9uX2Nsb3NlOwotCQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9JRCwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQotCi0JCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3ZThmYjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGFyZ2V0Q29udHJvbF9jcmVhdGVfTW9uaXRvckNvbm5lY3Rpbmc9Q29ubmVjdGluZyB0byByZW1vdGUgaG9zdAotVGFyZ2V0Q29udHJvbF9yZXN1bWVfQ2Fubm90UmVzdW1lPVJlbW90ZSBob3N0IGNhbm5vdCBiZSByZXN1bWVkIGZyb20gcGF1c2UKLVRhcmdldENvbnRyb2xfc3RvcF9DYW5ub3RQYXVzZT1SZW1vdGUgaG9zdCBjYW5ub3QgYmUgcGF1c2VkCi1SZW1vdGVUb29sc0Nvbm5lY3Rpb25fY29ubmVjdGlvbk5vdE9wZW49Q29ubmVjdGlvbiBpcyBub3Qgb3BlbgotUmVtb3RlVG9vbHNDb25uZWN0aW9uX3JlbW90ZVBvcnQ9Q291bGQgbm90IGFsbG9jYXRlIHJlbW90ZSBwb3J0Ci1SZW1vdGVUb29sc0Nvbm5lY3Rpb25fb3Blbj1PcGVuaW5nIGNvbm5lY3Rpb24uLi4KLVJlbW90ZVRvb2xzQ29ubmVjdGlvbl9mb3J3YXJkaW5nPVNldHRpbmcgdXAgcmVtb3RlIGZvcndhcmRpbmcKLVJlbW90ZVRvb2xzQ29ubmVjdGlvbl9jbG9zZT1DbG9zaW5nIGNvbm5lY3Rpb24uLi4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS8uY2xhc3NwYXRoIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLy5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFjYWI3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJlM2JlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUdWUgSnVsIDIyIDE0OjQxOjMxIFBEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1MDI0NC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkuQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMSIsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7YnVuZGxlLXZlcnNpb249IjIuMS44IiwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4zLjMiLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcztidW5kbGUtdmVyc2lvbj0iMS4zLjEiLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscztidW5kbGUtdmVyc2lvbj0iMy4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZTtidW5kbGUtdmVyc2lvbj0iMi4wLjEiLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWk7YnVuZGxlLXZlcnNpb249IjIuMC4wIiwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL2Fib3V0Lmh0bWwgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5OGU0ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNhYmY0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgUmVtb3RlIFRvb2xzIFVJIFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvcGx1Z2luLnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTFhODIzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUucmVtb3RlRW52aXJvbm1lbnRDb250cm9sRGVsZWdhdGUiPgotICAgICAgPGNvbnRyb2wKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLmVudmlyb25tZW50LkVudmlyb25tZW50IgotICAgICAgICAgICAgbmFtZT0iUmVtb3RlIEhvc3QiPgotICAgICAgPC9jb250cm9sPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlJlbW90ZVRvb2xzUHJlZmVyZW5jZVBhZ2UuRW52aXJvbm1lbnRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLmVudmlyb25tZW50LnByZWZlcmVuY2VzLlByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy51aS5SZW1vdGVUb29sc1ByZWZlcmVuY2VQYWdlLkVudmlyb25tZW50UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJSZW1vdGUgSG9zdCIvPiAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS5lbnZpcm9ubWVudC5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkucmVtb3RlVUlTZXJ2aWNlcyI+Ci0gICAgICA8cmVtb3RlVUlTZXJ2aWNlcwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkuUmVtb3RlVG9vbHNVSVNlcnZpY2VzRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLlJlbW90ZVRvb2xzIgotICAgICAgICAgICAgbmFtZT0iUmVtb3RlIFRvb2xzIj4KLSAgICAgIDwvcmVtb3RlVUlTZXJ2aWNlcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5maWxlc3lzdGVtU3VwcG9ydCI+Ci0gICAgICA8ZmlsZXN5c3RlbUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS5SZW1vdGVUb29sc0ZpbGVTeXN0ZW1Db250cmlidXRvciIKLSAgICAgICAgICAgIGxhYmVsPSJSZW1vdGUgVG9vbHMiCi0gICAgICAgICAgICBzY2hlbWU9InJlbW90ZXRvb2xzIj4KLSAgICAgIDwvZmlsZXN5c3RlbUNvbnRyaWJ1dG9yPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9BY3RpdmF0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1ZDlhZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvUmVtb3RlVG9vbHNGaWxlU3lzdGVtQ29udHJpYnV0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc0ZpbGVTeXN0ZW1Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU1NWIyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc0ZpbGVTeXN0ZW1Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyAKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBJbml0aWFsIENvbnRyaWJ1dG9yczoKLSAqIFRoZSBmb2xsb3dpbmcgSUJNIGVtcGxveWVlcyBjb250cmlidXRlZCB0byB0aGUgUmVtb3RlIFN5c3RlbSBFeHBsb3JlcgotICogY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhpcyBmaWxlOiBEYXZpZCBNY0tuaWdodCwgS3VzaGFsIE11bmlyLCAKLSAqIE1pY2hhZWwgQmVyZ2VyLCBEYXZpZCBEeWtzdGFsLCBQaGlsIENvdWx0aGFyZCwgRG9uIFlhbnR6aSwgRXJpYyBTaW1wc29uLCAKLSAqIEVtaWx5IEJydW5lciwgTWF6ZW4gRmFyYWosIEFkcmlhbiBTdG9yaXN0ZWFudSwgTGkgRGluZywgYW5kIEtlbnQgSGF3bGV5LgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLdXNoYWwgTXVuaXIgKElCTSkgLSBtb3ZlZCB0byBpbnRlcm5hbCBwYWNrYWdlLgotICogTWFydGluIE9iZXJodWJlciAoV2luZCBSaXZlcikgLSBbMTgxOTE3XSBFRlMgSW1wcm92ZW1lbnRzOiBBdm9pZCB1bmNsb3NlZCBTdHJlYW1zLAotICogICAgLSBGaXggZWFybHkgc3RhcnR1cCBpc3N1ZXMgYnkgZGVmZXJyaW5nIEZpbGVTdG9yZSBldmFsdWF0aW9uIGFuZCBjbGFzc2xvYWRpbmcsCi0gKiAgICAtIEltcHJvdmUgcGVyZm9ybWFuY2UgYnkgUlNFRmlsZVN0b3JlIGluc3RhbmNlIGZhY3RvcnkgYW5kIGNhY2hpbmcgSVJlbW90ZUZpbGUuCi0gKiAgICAtIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5IGNsYXNzIFJTRUZpbGVDYWNoZSBhbmQgb2Jzb2xldGUgYnJhbmRpbmcgZmlsZXMuCi0gKiBNYXJ0aW4gT2Jlcmh1YmVyIChXaW5kIFJpdmVyKSAtIFsxODgzNjBdIHJlbmFtZWQgZnJvbSBwbHVnaW4gb3JnLmVjbGlwc2UucnNlLmVjbGlwc2UuZmlsZXN5c3RlbQotICogTWFydGluIE9iZXJodWJlciAoV2luZCBSaXZlcikgLSBbMTg5NDQxXSBmaXggRUZTIG9wZXJhdGlvbnMgb24gV2luZG93cyAoTG9jYWwpIHN5c3RlbXMKLSAqIERhdmlkIER5a3N0YWwgKElCTSkgLSBbMjM1ODQwXSBleHRlcm5hbGl6aW5nIGRpYWxvZyB0aXRsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlVG9vbHNGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5QVFBSZW1vdGVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuZmlsZVN5c3RlbS5GaWxlU3lzdGVtQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc0ZpbGVTeXN0ZW1Db250cmlidXRvciBleHRlbmRzIEZpbGVTeXN0ZW1Db250cmlidXRvciB7Ci0KLQlwdWJsaWMgVVJJIGJyb3dzZUZpbGVTeXN0ZW0oU3RyaW5nIGluaXRpYWxQYXRoLCBTaGVsbCBzaGVsbCkgewotCQlJUmVtb3RlU2VydmljZXMgc2VydmljZXMgPSBQVFBSZW1vdGVDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVTZXJ2aWNlcyhSZW1vdGVUb29sc0FkYXB0ZXJDb3JlUGx1Z2luLlNFUlZJQ0VTX0lEKTsKLQkJSVJlbW90ZVVJU2VydmljZXMgdWlTZXJ2aWNlcyA9IFBUUFJlbW90ZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVVSVNlcnZpY2VzKHNlcnZpY2VzKTsKLQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgdWlGaWxlTWdyID0gdWlTZXJ2aWNlcy5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCXVpRmlsZU1nci5zaG93Q29ubmVjdGlvbnModHJ1ZSk7Ci0JCUlQYXRoIHBhdGggPSB1aUZpbGVNZ3IuYnJvd3NlRGlyZWN0b3J5KHNoZWxsLCAiQnJvd3NlIEZpbGUgU3lzdGVtIiwgaW5pdGlhbFBhdGgpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlJUmVtb3RlQ29ubmVjdGlvbiBjb25uID0gdWlGaWxlTWdyLmdldENvbm5lY3Rpb24oKTsKLQkJCUlSZW1vdGVGaWxlTWFuYWdlciBmaWxlTWdyID0gc2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoY29ubik7Ci0JCQlyZXR1cm4gKChSZW1vdGVUb29sc0ZpbGVNYW5hZ2VyKWZpbGVNZ3IpLnRvVVJJKHBhdGgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuZmlsZVN5c3RlbS5GaWxlU3lzdGVtQ29udHJpYnV0b3IjZ2V0VVJJKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFVSSSBnZXRVUkkoU3RyaW5nIHN0cmluZykgewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkkoc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL1JlbW90ZVRvb2xzVUlDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL1JlbW90ZVRvb2xzVUlDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjFiNzgzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LkVudmlyb25tZW50UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLlRhcmdldEVudmlyb25tZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRUeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQud2l6YXJkLkVudmlyb25tZW50V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc1VJQ29ubmVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJUmVtb3RlVUlDb25uZWN0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBUYXJnZXRUeXBlRWxlbWVudCByZW1vdGVIb3N0ID0gbnVsbDsKLQlwcml2YXRlIElSZW1vdGVDb25uZWN0aW9uTWFuYWdlciBjb25uTWdyID0gbnVsbDsKLQkKLQlwdWJsaWMgUmVtb3RlVG9vbHNVSUNvbm5lY3Rpb25NYW5hZ2VyKElSZW1vdGVTZXJ2aWNlcyBzZXJ2aWNlcykgewotCQl0aGlzLmNvbm5NZ3IgPSBzZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQlUYXJnZXRFbnZpcm9ubWVudE1hbmFnZXIgdGFyZ2V0TWdyID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRhcmdldHNNYW5hZ2VyKCk7Ci0JCWZvciAoT2JqZWN0IG9iaiA6IHRhcmdldE1nci5nZXRUeXBlRWxlbWVudHMoKSkgewotCQkJVGFyZ2V0VHlwZUVsZW1lbnQgZWxlbWVudCA9IChUYXJnZXRUeXBlRWxlbWVudClvYmo7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJSZW1vdGUgSG9zdCIpKSB7Ci0JCQkJcmVtb3RlSG9zdCA9IGVsZW1lbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVVJQ29ubmVjdGlvbk1hbmFnZXIjbmV3Q29ubmVjdGlvbigpCi0JICovCi0JcHVibGljIElSZW1vdGVDb25uZWN0aW9uIG5ld0Nvbm5lY3Rpb24oU2hlbGwgc2hlbGwpIHsKLQkJaWYgKHJlbW90ZUhvc3QgIT0gbnVsbCkgewotCQkJSVJlbW90ZUNvbm5lY3Rpb25bXSBvbGRDb25ucyA9IGNvbm5NZ3IuZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQotCQkJRW52aXJvbm1lbnRXaXphcmQgd2l6YXJkID0gbmV3IEVudmlyb25tZW50V2l6YXJkKHJlbW90ZUhvc3QpOwotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkKLQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpemFyZERpYWxvZy5PSykgewotCQkJCS8qCi0JCQkJICogTG9jYXRlIHRoZSBuZXcgY29ubmVjdGlvbiBhbmQgcmV0dXJuIGl0LiBBc3N1bWVzIGNvbm5lY3Rpb25zIGNhbgotCQkJCSAqIG9ubHkgYmUgY3JlYXRlZCBieSB0aGUgd2l6YXJkLCBOT1QgcmVtb3ZlZC4KLQkJCQkgKi8KLQkJCQlJUmVtb3RlQ29ubmVjdGlvbltdIG5ld0Nvbm5zID0gY29ubk1nci5nZXRDb25uZWN0aW9ucygpOwotCQkJCQotCQkJCWlmIChuZXdDb25ucy5sZW5ndGggPD0gb2xkQ29ubnMubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlBcnJheXMuc29ydChvbGRDb25ucywgbmV3IENvbXBhcmF0b3I8SVJlbW90ZUNvbm5lY3Rpb24+KCkgewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoSVJlbW90ZUNvbm5lY3Rpb24gYzEsIElSZW1vdGVDb25uZWN0aW9uIGMyKSB7Ci0JCQkJCQlyZXR1cm4gYzEuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoYzIuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCUFycmF5cy5zb3J0KG5ld0Nvbm5zLCBuZXcgQ29tcGFyYXRvcjxJUmVtb3RlQ29ubmVjdGlvbj4oKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShJUmVtb3RlQ29ubmVjdGlvbiBjMSwgSVJlbW90ZUNvbm5lY3Rpb24gYzIpIHsKLQkJCQkJCXJldHVybiBjMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShjMi5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDb25ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIW9sZENvbm5zW2ldLmVxdWFscyhuZXdDb25uc1tpXSkpIHsKLQkJCQkJCXJldHVybiBuZXdDb25uc1tpXTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbmV3Q29ubnNbbmV3Q29ubnMubGVuZ3RoLTFdOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJRmlsZU1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJRmlsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiN2RlZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvUmVtb3RlVG9vbHNVSUZpbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLmRpYWxvZ3MuUmVtb3RlUmVzb3VyY2VCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgUmVtb3RlVG9vbHNVSUZpbGVNYW5hZ2VyIGltcGxlbWVudHMgSVJlbW90ZVVJRmlsZU1hbmFnZXIgewotCXByaXZhdGUgSVJlbW90ZVNlcnZpY2VzIHNlcnZpY2VzID0gbnVsbDsKLQlwcml2YXRlIElSZW1vdGVDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBzaG93Q29ubmVjdGlvbnMgPSBmYWxzZTsKLQkKLQlwdWJsaWMgUmVtb3RlVG9vbHNVSUZpbGVNYW5hZ2VyKElSZW1vdGVTZXJ2aWNlcyBzZXJ2aWNlcykgewotCQl0aGlzLnNlcnZpY2VzID0gc2VydmljZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVGaWxlTWFuYWdlciNicm93c2VEaXJlY3Rvcnkob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQYXRoIGJyb3dzZURpcmVjdG9yeShTaGVsbCBzaGVsbCwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBmaWx0ZXJQYXRoKSB7Ci0JCVJlbW90ZVJlc291cmNlQnJvd3NlciBicm93c2VyID0gbmV3IFJlbW90ZVJlc291cmNlQnJvd3NlcihzZXJ2aWNlcywgY29ubmVjdGlvbiwgc2hlbGwpOwotCQlicm93c2VyLnNldFR5cGUoUmVtb3RlUmVzb3VyY2VCcm93c2VyLkRJUkVDVE9SWV9CUk9XU0VSKTsKLQkJYnJvd3Nlci5zZXRJbml0aWFsUGF0aChmaWx0ZXJQYXRoKTsKLQkJYnJvd3Nlci5zaG93Q29ubmVjdGlvbnMoc2hvd0Nvbm5lY3Rpb25zKTsKLQkJaWYgKGJyb3dzZXIub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNvbm5lY3Rpb24gPSBicm93c2VyLmdldENvbm5lY3Rpb24oKTsKLQkJU3RyaW5nIHBhdGggPSBicm93c2VyLmdldFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHBhdGgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyI2Jyb3dzZUZpbGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQYXRoIGJyb3dzZUZpbGUoU2hlbGwgc2hlbGwsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZmlsdGVyUGF0aCkgewotCQlSZW1vdGVSZXNvdXJjZUJyb3dzZXIgYnJvd3NlciA9IG5ldyBSZW1vdGVSZXNvdXJjZUJyb3dzZXIoc2VydmljZXMsIGNvbm5lY3Rpb24sIHNoZWxsKTsKLQkJYnJvd3Nlci5zZXRUeXBlKFJlbW90ZVJlc291cmNlQnJvd3Nlci5GSUxFX0JST1dTRVIpOwotCQlicm93c2VyLnNldEluaXRpYWxQYXRoKGZpbHRlclBhdGgpOwotCQlicm93c2VyLnNob3dDb25uZWN0aW9ucyhzaG93Q29ubmVjdGlvbnMpOwotCQlpZiAoYnJvd3Nlci5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY29ubmVjdGlvbiA9IGJyb3dzZXIuZ2V0Q29ubmVjdGlvbigpOwotCQlTdHJpbmcgcGF0aCA9IGJyb3dzZXIuZ2V0UGF0aCgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgocGF0aCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJRmlsZU1hbmFnZXIjZ2V0Q29ubmVjdGlvbigpCi0JICovCi0JcHVibGljIElSZW1vdGVDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJRmlsZU1hbmFnZXIjc2V0Q29ubmVjdGlvbihvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbihJUmVtb3RlQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlciNzaG93Q29ubmVjdGlvbnMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93Q29ubmVjdGlvbnMoYm9vbGVhbiBlbmFibGUpIHsKLQkJc2hvd0Nvbm5lY3Rpb25zID0gZW5hYmxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJU2VydmljZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJU2VydmljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjOGM4MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvUmVtb3RlVG9vbHNVSVNlcnZpY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSUNvbm5lY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlc0RlbGVnYXRlOwotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc1VJU2VydmljZXMgaW1wbGVtZW50cyBJUmVtb3RlVUlTZXJ2aWNlc0RlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBSZW1vdGVUb29sc1VJU2VydmljZXMgaW5zdGFuY2UgPSBuZXcgUmVtb3RlVG9vbHNVSVNlcnZpY2VzKCk7Ci0JcHJpdmF0ZSBJUmVtb3RlU2VydmljZXMgc2VydmljZXM7Ci0KLQkvKioKLQkgKiBHZXQgc2hhcmVkIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQkgKiAKLQkgKiBAcmV0dXJuIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW1vdGVUb29sc1VJU2VydmljZXMgZ2V0SW5zdGFuY2UoSVJlbW90ZVNlcnZpY2VzIHNlcnZpY2VzKSB7Ci0JCWluc3RhbmNlLnNldFNlcnZpY2VzKHNlcnZpY2VzKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzRGVsZWdhdGUjZ2V0VUlDb25uZWN0aW9uTWFuYWdlcigpCi0JICovCi0JcHVibGljIElSZW1vdGVVSUNvbm5lY3Rpb25NYW5hZ2VyIGdldFVJQ29ubmVjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgUmVtb3RlVG9vbHNVSUNvbm5lY3Rpb25NYW5hZ2VyKHNlcnZpY2VzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlc0RlbGVnYXRlI2dldFVJRmlsZU1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlVUlGaWxlTWFuYWdlciBnZXRVSUZpbGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gbmV3IFJlbW90ZVRvb2xzVUlGaWxlTWFuYWdlcihzZXJ2aWNlcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJlbW90ZSBzZXJ2aWNlcyBmb3IgdGhpcyBwcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZXJ2aWNlcyhJUmVtb3RlU2VydmljZXMgc2VydmljZXMpIHsKLQkJdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJU2VydmljZXNGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvUmVtb3RlVG9vbHNVSVNlcnZpY2VzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzI5NDc1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9SZW1vdGVUb29sc1VJU2VydmljZXNGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlc0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc1VJU2VydmljZXNGYWN0b3J5IGltcGxlbWVudHMgSVJlbW90ZVVJU2VydmljZXNGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzRmFjdG9yeSNnZXRTZXJ2aWNlcyhvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlVUlTZXJ2aWNlc0RlbGVnYXRlIGdldFNlcnZpY2VzKElSZW1vdGVTZXJ2aWNlcyBzZXJ2aWNlcykgewotCQlyZXR1cm4gUmVtb3RlVG9vbHNVSVNlcnZpY2VzLmdldEluc3RhbmNlKHNlcnZpY2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvZW52aXJvbm1lbnQvQ29uZmlndXJhdGlvblBhZ2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9Db25maWd1cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDZkYzM5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9Db25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkuZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50LkNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlLmVudmlyb25tZW50LlBUUFRhcmdldENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LndpemFyZC5BYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMudmVyaWZpY2F0aW9uLkNvbnRyb2xBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQXV0aGVudGljYXRpb25GcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQ29tYm9Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkNvbWJvR3JvdXBJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuVGV4dEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuVGV4dE1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2UgewotCUNvbmZpZ0ZhY3RvcnkgY29uZmlnRmFjdG9yeSA9IG51bGw7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25QYWdlKFN0cmluZyB0YXJnZXROYW1lLCBNYXAgYXR0cmlidXRlc01hcCkgewotCQlzdXBlcih0YXJnZXROYW1lKTsKLQkJCi0JCS8qaWYgKHRhcmdldE5hbWUgPT0gbnVsbCkgewotCQkJdGhpcy50YXJnZXROYW1lID0gTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVmYXVsdFRhcmdldE5hbWU7Ci0JCX0gZWxzZSB7Ki8KLQkJdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKLQkJLy99Ci0KLQkJY29uZmlnRmFjdG9yeSA9IG5ldyBDb25maWdGYWN0b3J5KGF0dHJpYnV0ZXNNYXApOwotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvblBhZ2UoKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0RlZmF1bHRUYXJnZXROYW1lKTsKLQkJdGhpcy50YXJnZXROYW1lID0gTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVmYXVsdFRhcmdldE5hbWU7Ci0JCQotCQljb25maWdGYWN0b3J5ID0gbmV3IENvbmZpZ0ZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lOwotCXByaXZhdGUgVGV4dEdyb3VwIHRhcmdldE5hbWVHcm91cDsKLQlwcml2YXRlIEF1dGhlbnRpY2F0aW9uRnJhbWUgcmVtb3RlQXV0aEZyYW1lOwotCQotCWNsYXNzIERhdGFNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJaW50IGNvdW50ZXIgPSAwOwotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlKCkgewotCQkJY291bnRlcisrOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNhYmxlKCkgewotCQkJY291bnRlci0tOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChjb3VudGVyIDwgMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJlYWRDb250cm9scygpOwotCQkJCi0JCQkvLyB1cGRhdGVCdXR0b25zKCkgd2lsbCBjYWxsIGlzIFZhbGlkKCksIHRoYXQgd2lsbCBjYWxsIHZhbGlkYXRlRmllbGRzKCkKLQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIERhdGFNb2RpZnlMaXN0ZW5lciBkYXRhTW9kaWZ5TGlzdGVuZXI7Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0RpYWxvZ0Rlc2NyaXB0aW9uKTsKLQkJdGhpcy5zZXRUaXRsZShNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9EaWFsb2dUaXRsZSk7Ci0JCXRoaXMuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZmluYWwgQ29tcG9zaXRlIHRvcENvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZXRDb250cm9sKHRvcENvbnRyb2wpOwotCQl0b3BDb250cm9sLnNldExheW91dCh0b3BMYXlvdXQpOwotCi0JCS8qCi0JCSAqIEVudmlyb25tZW50IG5hbWUgTGFiZWwgYW5kIHRleHQgY29udHJvbHMuCi0JCSAqLwotLy8JCVRleHRHcm91cE1vbGQgdG1vbGQgPSBuZXcgVGV4dEdyb3VwTW9sZChUZXh0R3JvdXBNb2xkLkdSSURfREFUQV9BTElHTk1FTlRfRklMTAotLy8JCQkJfCBUZXh0R3JvdXBNb2xkLkdSSURfREFUQV9HUkFCX0VYQ0VTU19TUEFDRSwgTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lLCBUZXh0R3JvdXAuTUFYX1NJWkUpOwotCQlUZXh0TW9sZCBtb2xkID0gbmV3IFRleHRNb2xkKFRleHRNb2xkLkdSSURfREFUQV9BTElHTk1FTlRfRklMTCB8IFRleHRNb2xkLkdSSURfREFUQV9HUkFCX0VYQ0VTU19TUEFDRSwgTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lKTsKLQkJdGFyZ2V0TmFtZUdyb3VwID0gbmV3IFRleHRHcm91cCh0b3BDb250cm9sLCBtb2xkKTsKLQkJCi0JCWNyZWF0ZUF1dGhDb250cm9sKHRvcENvbnRyb2wpOwotCi0JCWZpbGxDb250cm9scygpOwotCQlyZWdpc3Rlckxpc3RlbmVycygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7Ci0JCWRhdGFNb2RpZnlMaXN0ZW5lciA9IG5ldyBEYXRhTW9kaWZ5TGlzdGVuZXIoKTsKLQkJdGFyZ2V0TmFtZUdyb3VwLmFkZE1vZGlmeUxpc3RlbmVyKGRhdGFNb2RpZnlMaXN0ZW5lcik7Ci0JCXJlbW90ZUF1dGhGcmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihkYXRhTW9kaWZ5TGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbENvbnRyb2xzKCkgewotCQlDb250cm9sQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gY29uZmlnRmFjdG9yeS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCXRhcmdldE5hbWVHcm91cC5zZXRTdHJpbmcodGFyZ2V0TmFtZSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRMb2NhbGhvc3RTZWxlY3RlZChhdHRyaWJ1dGVzLmdldEJvb2xlYW4oQ29uZmlnRmFjdG9yeS5BVFRSX0xPQ0FMSE9TVF9TRUxFQ1RJT04pKTsKLQkJcmVtb3RlQXV0aEZyYW1lLnNldEhvc3RQb3J0KGF0dHJpYnV0ZXMuZ2V0SW50ZWdlcihDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9QT1JUKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRIb3N0QWRkcmVzcyhhdHRyaWJ1dGVzLmdldFN0cmluZyhDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9BRERSRVNTKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRVc2VyTmFtZShhdHRyaWJ1dGVzLmdldFN0cmluZyhDb25maWdGYWN0b3J5LkFUVFJfTE9HSU5fVVNFUk5BTUUpKTsKLQkJcmVtb3RlQXV0aEZyYW1lLnNldFBhc3N3b3JkKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKENvbmZpZ0ZhY3RvcnkuQVRUUl9MT0dJTl9QQVNTV09SRCkpOwotCQlyZW1vdGVBdXRoRnJhbWUuc2V0UHVibGljS2V5UGF0aChhdHRyaWJ1dGVzLmdldFN0cmluZyhDb25maWdGYWN0b3J5LkFUVFJfS0VZX1BBVEgpKTsKLQkJcmVtb3RlQXV0aEZyYW1lLnNldFBhc3NwaHJhc2UoYXR0cmlidXRlcy5nZXRTdHJpbmcoQ29uZmlnRmFjdG9yeS5BVFRSX0tFWV9QQVNTUEhSQVNFKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRUaW1lb3V0KGF0dHJpYnV0ZXMuZ2V0SW50ZWdlcihDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9USU1FT1VUKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRQYXNzd29yZEJhc2VkKGF0dHJpYnV0ZXMuZ2V0Qm9vbGVhbihDb25maWdGYWN0b3J5LkFUVFJfSVNfUEFTU1dPUkRfQVVUSCkpOwotCQkKLQkJLy8gRmlsbCB0aGUgY29tYm9ib3ggd2l0aCBhdmFpbGFibGUgY2lwaGVyIHR5cGVzCi0JCU1hcCBjaXBoZXJNYXAgPSBQVFBUYXJnZXRDb250cm9sLmdldENpcGhlclR5cGVzTWFwKCk7Ci0JCVNldCBjS2V5U2V0ID0gY2lwaGVyTWFwLmtleVNldCgpOwotCQlDb21ib0dyb3VwIGNpcGhlckdyb3VwID0gcmVtb3RlQXV0aEZyYW1lLmdldENpcGhlclR5cGVHcm91cCgpOwotCQlmb3IoSXRlcmF0b3IgaXQgPSBjS2V5U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpY2lwaGVyTWFwLmdldChrZXkpOwotCQkJCi0JCQljaXBoZXJHcm91cC5hZGQobmV3IENvbWJvR3JvdXBJdGVtKGtleSwgdmFsdWUpKTsKLQkJfQotCQkvLyBTZWxlY3QgdGhlIGNpcGhlciB0eXBlIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG1hcC4KLQkJY2lwaGVyR3JvdXAuc2VsZWN0SW5kZXhVc2luZ0lEKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKENvbmZpZ0ZhY3RvcnkuQVRUUl9DSVBIRVJfVFlQRSkpOwotCQkKLQkJCi0JCS8vb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaC5zeXN0ZW1Xb3Jrc3BhY2VHcm91cC5zZXRTdHJpbmcoYXR0cmlidXRlcy5nZXRTdHJpbmcoQ29uZmlnRmFjdG9yeS5BVFRSX1NZU1RFTV9XT1JLU1BBQ0UpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb250cm9scygpIHsKLQkJQ29udHJvbEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGNvbmZpZ0ZhY3RvcnkuZ2V0QXR0cmlidXRlcygpOwotCQl0YXJnZXROYW1lID0gdGFyZ2V0TmFtZUdyb3VwLmdldFN0cmluZygpOwotCQlhdHRyaWJ1dGVzLnNldEJvb2xlYW5BdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0xPQ0FMSE9TVF9TRUxFQ1RJT04sIHJlbW90ZUF1dGhGcmFtZS5pc0xvY2FsaG9zdFNlbGVjdGVkKCkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfTE9HSU5fVVNFUk5BTUUsIHJlbW90ZUF1dGhGcmFtZS5nZXRVc2VyTmFtZSgpKTsKLQkJYXR0cmlidXRlcy5zZXRTdHJpbmdBdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0xPR0lOX1BBU1NXT1JELCByZW1vdGVBdXRoRnJhbWUuZ2V0UGFzc3dvcmQoKSk7Ci0JCWF0dHJpYnV0ZXMuc2V0U3RyaW5nQXR0cmlidXRlKENvbmZpZ0ZhY3RvcnkuQVRUUl9DT05ORUNUSU9OX0FERFJFU1MsIHJlbW90ZUF1dGhGcmFtZS5nZXRIb3N0QWRkcmVzcygpKTsKLQkJYXR0cmlidXRlcy5zZXRTdHJpbmdBdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fUE9SVCwgSW50ZWdlci50b1N0cmluZyhyZW1vdGVBdXRoRnJhbWUuZ2V0SG9zdFBvcnQoKSkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfS0VZX1BBVEgsIHJlbW90ZUF1dGhGcmFtZS5nZXRQdWJsaWNLZXlQYXRoKCkpOwkKLQkJYXR0cmlidXRlcy5zZXRTdHJpbmdBdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0tFWV9QQVNTUEhSQVNFLCByZW1vdGVBdXRoRnJhbWUuZ2V0UGFzc3BocmFzZSgpKTsKLQkJYXR0cmlidXRlcy5zZXRTdHJpbmdBdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fVElNRU9VVCwgSW50ZWdlci50b1N0cmluZyhyZW1vdGVBdXRoRnJhbWUuZ2V0VGltZW91dCgpKSk7Ci0JCWF0dHJpYnV0ZXMuc2V0Qm9vbGVhbkF0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfSVNfUEFTU1dPUkRfQVVUSCwgcmVtb3RlQXV0aEZyYW1lLmlzUGFzc3dvcmRCYXNlZCgpKTsKLQkJYXR0cmlidXRlcy5zZXRTdHJpbmdBdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0NJUEhFUl9UWVBFLCByZW1vdGVBdXRoRnJhbWUuZ2V0U2VsZWN0ZWRDaXBoZXJUeXBlKCkuZ2V0SWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1dGhDb250cm9sKENvbXBvc2l0ZSB0b3BDb250cm9sKSB7Ci0JCUF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkIGFtb2xkID0gbmV3IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Nvbm5lY3Rpb25GcmFtZVRpdGxlKTsKLQkJYW1vbGQuc2V0Qml0bWFzayhBdXRoZW50aWNhdGlvbkZyYW1lTW9sZC5TSE9XX0hPU1RfVFlQRV9SQURJT19CVVRUT04pOwotCQlhbW9sZC5zZXRMYWJlbExvY2FsaG9zdChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbExvY2FsaG9zdCk7Ci0JCWFtb2xkLnNldExhYmVsUmVtb3RlSG9zdChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFJlbW90ZUhvc3QpOwotCQlhbW9sZC5zZXRMYWJlbEhpZGVBZHZhbmNlZE9wdGlvbnMoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxIaWRlQWR2YW5jZWRPcHRpb25zKTsKLQkJYW1vbGQuc2V0TGFiZWxIb3N0QWRkcmVzcyhNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RBZGRyZXNzKTsKLQkJYW1vbGQuc2V0TGFiZWxIb3N0UG9ydChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RQb3J0KTsKLQkJYW1vbGQuc2V0TGFiZWxJc1Bhc3N3b3JkQmFzZWQoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxJc1Bhc3N3b3JkQmFzZWQpOwotCQlhbW9sZC5zZXRMYWJlbElzUHVibGljS2V5QmFzZWQoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxJc1B1YmxpY0tleUJhc2VkKTsKLQkJYW1vbGQuc2V0TGFiZWxQYXNzcGhyYXNlKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUGFzc3BocmFzZSk7Ci0JCWFtb2xkLnNldExhYmVsUGFzc3dvcmQoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQYXNzd29yZCk7Ci0JCWFtb2xkLnNldExhYmVsUHVibGljS2V5UGF0aChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGgpOwotCQlhbW9sZC5zZXRMYWJlbFB1YmxpY0tleVBhdGhCdXR0b24oTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQdWJsaWNLZXlQYXRoQnV0dG9uKTsKLQkJYW1vbGQuc2V0TGFiZWxQdWJsaWNLZXlQYXRoVGl0bGUoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQdWJsaWNLZXlQYXRoVGl0bGUpOwotCQlhbW9sZC5zZXRMYWJlbFNob3dBZHZhbmNlZE9wdGlvbnMoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxTaG93QWR2YW5jZWRPcHRpb25zKTsKLQkJYW1vbGQuc2V0TGFiZWxUaW1lb3V0KE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsVGltZW91dCk7Ci0JCWFtb2xkLnNldExhYmVsQ2lwaGVyVHlwZShNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9DaXBoZXJUeXBlKTsKLQkJYW1vbGQuc2V0TGFiZWxVc2VyTmFtZShNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFVzZXJOYW1lKTsKLQotCQl0aGlzLnJlbW90ZUF1dGhGcmFtZSA9IG5ldyBBdXRoZW50aWNhdGlvbkZyYW1lKHRvcENvbnRyb2wsIGFtb2xkKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBjb25maWdGYWN0b3J5LmdldE1hcCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVBdXRoRnJhbWUudmFsaWRhdGVGaWVsZHMoKTsKLQkJCWNvbmZpZ0ZhY3RvcnkuY3JlYXRlVGFyZ2V0Q29uZmlnKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JICAgIHJldHVybiB0YXJnZXROYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L0Vudmlyb25tZW50LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvZW52aXJvbm1lbnQvRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJmNzEwNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvZW52aXJvbm1lbnQvRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkuZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuZW52aXJvbm1lbnQuQ29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuZW52aXJvbm1lbnQuUFRQVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklUYXJnZXRUeXBlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQuQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2U7Ci0KLQotLyoqCi0gKiBGYWN0b3J5IGZvciB0aGUgZW52aXJvbm1lbnQuCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJVGFyZ2V0VHlwZUV4dGVuc2lvbiB7Ci0JCi0JcHVibGljIEVudmlyb25tZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGFyZ2V0Q29udHJvbCBjb250cm9sRmFjdG9yeShJVGFyZ2V0RWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUFRQVGFyZ2V0Q29udHJvbChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udHJvbEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gQ29uZmlnRmFjdG9yeS5LRVlfQVJSQVk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlIGRpYWxvZ1BhZ2VGYWN0b3J5KElUYXJnZXRFbGVtZW50IHRhcmdldEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uUGFnZSh0YXJnZXRFbGVtZW50LmdldE5hbWUoKSwgdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2UgZGlhbG9nUGFnZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblBhZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRyb2xBdHRyaWJ1dGVOYW1lc0ZvckNpcGhlcmVkS2V5cygpIHsKLQkJcmV0dXJuIENvbmZpZ0ZhY3RvcnkuS0VZX0NJUEhFUkVEX0FSUkFZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9NZXNzYWdlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNWFiNDMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkuZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLmVudmlyb25tZW50Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxMb2NhbGhvc3Q7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxSZW1vdGVIb3N0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSGlkZUFkdmFuY2VkT3B0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSG9zdEFkZHJlc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RQb3J0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxJc1Bhc3N3b3JkQmFzZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbElzUHVibGljS2V5QmFzZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbFBhc3NwaHJhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbFBhc3N3b3JkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQdWJsaWNLZXlQYXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQdWJsaWNLZXlQYXRoQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxVc2VyTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsVGltZW91dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsU2hvd0FkdmFuY2VkT3B0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUHVibGljS2V5UGF0aFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfQ29ubmVjdGlvbkZyYW1lVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZWZhdWx0VGFyZ2V0TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0RpYWxvZ0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfRGlhbG9nVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbFRhcmdldE5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9DaXBoZXJUeXBlOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZjRhNDguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Db25maWd1cmF0aW9uUGFnZV9EZWZhdWx0VGFyZ2V0TmFtZT1SZW1vdGUgSG9zdAotQ29uZmlndXJhdGlvblBhZ2VfRGlhbG9nRGVzY3JpcHRpb249UHJvcGVydGllcyBmb3IgY29ubmVjdGluZyB0byBhIHJlbW90ZSBob3N0Ci1Db25maWd1cmF0aW9uUGFnZV9EaWFsb2dUaXRsZT1SZW1vdGUgSG9zdAotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lPVRhcmdldCBuYW1lOgotQ29uZmlndXJhdGlvblBhZ2VfQ29ubmVjdGlvbkZyYW1lVGl0bGU9SG9zdCBJbmZvcm1hdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxMb2NhbGhvc3Q9TG9jYWxob3N0Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFJlbW90ZUhvc3Q9UmVtb3RlIGhvc3QKLUNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSGlkZUFkdmFuY2VkT3B0aW9ucz1TaW1wbGlmaWVkCi1Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RBZGRyZXNzPUhvc3Q6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RQb3J0PVBvcnQ6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbElzUGFzc3dvcmRCYXNlZD1QYXNzd29yZCBiYXNlZCBhdXRoZW50aWNhdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxJc1B1YmxpY0tleUJhc2VkPVB1YmxpYyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb24KLUNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUGFzc3BocmFzZT1QYXNzcGhyYXNlOgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQYXNzd29yZD1QYXNzd29yZDoKLUNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUHVibGljS2V5UGF0aD1GaWxlIHdpdGggcHJpdmF0ZSBrZXk6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhUaXRsZT1TZWxlY3QgZmlsZSB3aXRoIHByaXZhdGUga2V5Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhCdXR0b249U2VsZWN0Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFVzZXJOYW1lPVVzZXI6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFRpbWVvdXQ9VGltZW91dChzZWMpOgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxTaG93QWR2YW5jZWRPcHRpb25zPUFkdmFuY2VkCi1Db25maWd1cmF0aW9uUGFnZV9DaXBoZXJUeXBlPUNpcGhlciBUeXBlOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNTNlZWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkuZW52aXJvbm1lbnQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcmVuY2VQYWdlX0hlYWRlckNvbm5lY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZVBhZ2VfTGFiZWxDb25uZWN0aW9uUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlUGFnZV9MYWJlbENvbm5lY3Rpb25BZGRyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcmVuY2VQYWdlX0xhYmVsTG9naW5Vc2VyTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlUGFnZV9IZWFkZXJMYXVuY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZVBhZ2VfTGFiZWxTeXN0ZW1Xb3Jrc3BhY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZVBhZ2VfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZVBhZ2VfVGl0bGU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLmVudmlyb25tZW50LnByZWZlcmVuY2VzLm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzlmYWRlNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvZW52aXJvbm1lbnQvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLmVudmlyb25tZW50LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuZW52aXJvbm1lbnQuQ29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuZW52aXJvbm1lbnQuY29uZi5EZWZhdWx0VmFsdWVzOwotCi0KLS8qKgotICogSW5pdGlhbGl6ZXMgcHJlZmVyZW5jZSB2YWx1ZXMKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFJlbW90ZVRvb2xzQWRhcHRlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ29uZmlnRmFjdG9yeS5BVFRSX0xPR0lOX1VTRVJOQU1FLCBEZWZhdWx0VmFsdWVzLkxPR0lOX1VTRVJOQU1FKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9BRERSRVNTLCBEZWZhdWx0VmFsdWVzLkNPTk5FQ1RJT05fQUREUkVTUyk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fUE9SVCwgRGVmYXVsdFZhbHVlcy5DT05ORUNUSU9OX1BPUlQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlUGFnZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4NzQxNWYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RlL3JlbW90ZXRvb2xzL3VpL2Vudmlyb25tZW50L3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpLmVudmlyb25tZW50LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUuZW52aXJvbm1lbnQuQ29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RCYXNlRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkuTGFiZWxGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkuU3BhY2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5TY29wZWRQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIHRoZSBSZW1vdGUgSG9zdCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IHRhcmdldHMuCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsLCBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4yLjEKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCi0JCVNjb3BlZFByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IG5ldyBTY29wZWRQcmVmZXJlbmNlU3RvcmUobmV3IEluc3RhbmNlU2NvcGUoKSwgUmVtb3RlVG9vbHNBZGFwdGVyQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotCQkKLQkJLy8gc2V0RGVzY3JpcHRpb24gbXVzdCBiZSBjYWxsZWQgaGVyZSBvciBpdCB3b250IHdvcmsKLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfRGVzY3JpcHRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJLy8gc2V0VGl0bGUgbXVzdCBiZSBjYWxsZWQgaGVyZSBvciBpdCB3b250IHdvcmsKLQkJc2V0VGl0bGUoTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfVGl0bGUpOwotCQkKLQkJYWRkRmllbGQobmV3IExhYmVsRmllbGRFZGl0b3IoTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfSGVhZGVyQ29ubmVjdGlvbiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotCi0JCVN0cmluZ0ZpZWxkRWRpdG9yIGFkZHJmaWVsZCA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcihDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9BRERSRVNTLAotCQkJCU1lc3NhZ2VzLlByZWZlcmVuY2VQYWdlX0xhYmVsQ29ubmVjdGlvbkFkZHJlc3MsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotCQlhZGRyZmllbGQuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKHRydWUpOwotCQlhZGRGaWVsZChhZGRyZmllbGQpOwotCi0JCUludGVnZXJGaWVsZEVkaXRvciBwb3J0ZmllbGQgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKENvbmZpZ0ZhY3RvcnkuQVRUUl9DT05ORUNUSU9OX1BPUlQsCi0JCQkJTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfTGFiZWxDb25uZWN0aW9uUG9ydCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCXBvcnRmaWVsZC5zZXRFbXB0eVN0cmluZ0FsbG93ZWQoZmFsc2UpOwotCQlhZGRGaWVsZChwb3J0ZmllbGQpOwotCi0JCVN0cmluZ0ZpZWxkRWRpdG9yIHVzZXJmaWVsZCA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcihDb25maWdGYWN0b3J5LkFUVFJfTE9HSU5fVVNFUk5BTUUsCi0JCQkJTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfTGFiZWxMb2dpblVzZXJOYW1lLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJdXNlcmZpZWxkLnNldEVtcHR5U3RyaW5nQWxsb3dlZCh0cnVlKTsKLQkJYWRkRmllbGQodXNlcmZpZWxkKTsKLQotCQlhZGRGaWVsZChuZXcgTGFiZWxGaWVsZEVkaXRvcihNZXNzYWdlcy5QcmVmZXJlbmNlUGFnZV9IZWFkZXJMYXVuY2gsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0Jdm9pZCBhZGRTcGFjZSgpIHsKLQkJU3BhY2VyRmllbGRFZGl0b3Igc3BhY2VyMSA9IG5ldyBTcGFjZXJGaWVsZEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJYWRkRmllbGQoc3BhY2VyMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGUvcmVtb3RldG9vbHMvdWkvZW52aXJvbm1lbnQvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTM0NWI0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZS9yZW1vdGV0b29scy91aS9lbnZpcm9ubWVudC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1QcmVmZXJlbmNlUGFnZV9IZWFkZXJDb25uZWN0aW9uPUNvbm5lY3Rpb24gdG8gcmVtb3RlIGhvc3Q6Ci1QcmVmZXJlbmNlUGFnZV9MYWJlbENvbm5lY3Rpb25Qb3J0PVBvcnQgbnVtYmVyOgotUHJlZmVyZW5jZVBhZ2VfTGFiZWxDb25uZWN0aW9uQWRkcmVzcz1BZGRyZXNzOgotUHJlZmVyZW5jZVBhZ2VfTGFiZWxMb2dpblVzZXJOYW1lPVVzZXIgbmFtZToKLVByZWZlcmVuY2VQYWdlX0hlYWRlckxhdW5jaD1DL0MrKyByZW1vdGUgaG9zdCB0YXJnZXQgbGF1bmNoIHByb3BlcnRpZXM6Ci1QcmVmZXJlbmNlUGFnZV9EZXNjcmlwdGlvbj1EZWZhdWx0IHByb3BlcnRpZXMgZm9yIG5ldyByZW1vdGUgaG9zdCBUYXJnZXRzCi1QcmVmZXJlbmNlUGFnZV9UaXRsZT1SZW1vdGUgSG9zdApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvLmNsYXNzcGF0aCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDEwNTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS8uY3ZzaWdub3JlIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNjkxZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWRvYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpLy5vcHRpb25zIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2VjODYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLW9yZy5lY2xpcHNlLnB0cC51aS9kZWJ1Zz10cnVlCi0KLSMgVmlldyB0cmFjaW5nCi1vcmcuZWNsaXBzZS5wdHAudWkvdmlld3Mvam9icy90cmFjaW5nPWZhbHNlCi1vcmcuZWNsaXBzZS5wdHAudWkvdmlld3MvbWFjaGluZXMvdHJhY2luZz1mYWxzZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvLnByb2plY3QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1YzM2NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTc5MTU5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS5jb25zb2xlLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5wdHAudWkubGlzdGVuZXJzLAotIG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2VycywKLSBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwsCi0gb3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLnB0cC51aS51dGlscywKLSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MsCi0gb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMKLUJ1bmRsZS1DbGFzc1BhdGg6IHB0cHVpLmphcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvYWJvdXQuaHRtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvYnVpbGQucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDY3MjMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwdHB1aS5qYXIKLXNvdXJjZS5wdHB1aS5qYXIgPSBzcmMvCi1vdXRwdXQucHRwdWkuamFyID0gYmluLwotamFycy5jb21waWxlLm9yZGVyID0gcHRwdWkuamFyCi1zb3VyY2UucHRwdWkuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvYWJvcnRfZGlzYWJsZS5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9hYm9ydF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjNDkxZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9hYm9ydF9kaXNhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2Fib3J0X2hvdmVyLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2Fib3J0X2hvdmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3MGEzOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9hYm9ydF9ob3Zlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9hYm9ydF9ub3JtYWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvYWJvcnRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNzk4Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9hYm9ydF9ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvY19hcHAuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvY19hcHAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2M0OTFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2NfYXBwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2Vudmlyb25tZW50X3RhYi5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9lbnZpcm9ubWVudF90YWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQ2M2VjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2Vudmlyb25tZW50X3RhYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9leGl0X2Rpc2FibGUuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvZXhpdF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjNDkxZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9leGl0X2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvZXhpdF9ob3Zlci5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9leGl0X2hvdmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3MGEzOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9leGl0X2hvdmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2V4aXRfbm9ybWFsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2V4aXRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNzk4Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9leGl0X25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9pY29uX3Rlcm1pbmF0ZV9hbGwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvaWNvbl90ZXJtaW5hdGVfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1NmEyNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9pY29uX3Rlcm1pbmF0ZV9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl9lcnJvci5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkMDUwYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9kZWJ1Z19qb2JfcGVuZGluZy5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX3BlbmRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ4NTM2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9kZWJ1Z19qb2JfcGVuZGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX3J1bm5pbmcuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl9ydW5uaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNzRkYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX3J1bm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl9zdGFydGVkLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9kZWJ1Z19qb2Jfc3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjkyMGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl9zdGFydGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9kZWJ1Z19qb2Jfc3VzcGVuZGVkLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9kZWJ1Z19qb2Jfc3VzcGVuZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlN2Q4YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX3N1c3BlbmRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX3Rlcm1pbmF0ZWQuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl90ZXJtaW5hdGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMDViYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2IvZGVidWdfam9iX3Rlcm1pbmF0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl91bmtub3duLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9kZWJ1Z19qb2JfdW5rbm93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjc0NGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2RlYnVnX2pvYl91bmtub3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2JfZXJyb3IuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl9lcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNDU1MWYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2Ivam9iX3BlbmRpbmcuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl9wZW5kaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1YjM2ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2Ivam9iX3BlbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl9ydW5uaW5nLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2JfcnVubmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjQxMDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl9ydW5uaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2Jfc3RhcnRlZC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2Ivam9iX3N0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY0NGFhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2Jfc3RhcnRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2Ivam9iX3N1c3BlbmRlZC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2Ivam9iX3N1c3BlbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Y2I5NjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl9zdXNwZW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl90ZXJtaW5hdGVkLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2JfdGVybWluYXRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZmM1NDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvam9iL2pvYl90ZXJtaW5hdGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2JfdW5rbm93bi5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9qb2Ivam9iX3Vua25vd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVlZTM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL2pvYi9qb2JfdW5rbm93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9sZWdlbmQuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbGVnZW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiYzRkMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9sZWdlbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbWFjaGluZS9tYWNoaW5lX2FsZXJ0LmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL21hY2hpbmUvbWFjaGluZV9hbGVydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWZhNDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbWFjaGluZS9tYWNoaW5lX2FsZXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL21hY2hpbmUvbWFjaGluZV9kb3duLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL21hY2hpbmUvbWFjaGluZV9kb3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3ZTIxMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9tYWNoaW5lL21hY2hpbmVfZG93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9tYWNoaW5lL21hY2hpbmVfZXJyb3IuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbWFjaGluZS9tYWNoaW5lX2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2ZWJiMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9tYWNoaW5lL21hY2hpbmVfZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbWFjaGluZS9tYWNoaW5lX3Vua25vd24uZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbWFjaGluZS9tYWNoaW5lX3Vua25vd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UzOGI2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL21hY2hpbmUvbWFjaGluZV91bmtub3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL21hY2hpbmUvbWFjaGluZV91cC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9tYWNoaW5lL21hY2hpbmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg1OGQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL21hY2hpbmUvbWFjaGluZV91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2Nfb3RoZXIuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2FsbG9jX290aGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZDM0MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2Nfb3RoZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2FsbG9jX290aGVyX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2Nfb3RoZXJfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjYTkwZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2Nfb3RoZXJfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9hbGxvY191c2VyLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9hbGxvY191c2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MjRjZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2NfdXNlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2NfdXNlcl9zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2FsbG9jX3VzZXJfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyNzg0Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfYWxsb2NfdXNlcl9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2Rvd24uZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2Rvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg1NDFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9kb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9kb3duX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZG93bl9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTc5ZGVjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9kb3duX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZXJyb3IuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4YWIwZC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2Vycm9yX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZXJyb3Jfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzY2NlMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZXJyb3Jfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9leGl0ZWQuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2V4aXRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzRhMjEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2V4aXRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZXhpdGVkX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfZXhpdGVkX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWMyZjUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX2V4aXRlZF9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX290aGVyX2V4Y2wuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX290aGVyX2V4Y2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2ZkMzQxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9vdGhlcl9leGNsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9vdGhlcl9leGNsX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfb3RoZXJfZXhjbF9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNhOTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9vdGhlcl9leGNsX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfb3RoZXJfc2hhcmVkLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9vdGhlcl9zaGFyZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmM4NWFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9vdGhlcl9zaGFyZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX290aGVyX3NoYXJlZF9zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX290aGVyX3NoYXJlZF9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTRkMzJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9vdGhlcl9zaGFyZWRfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9ydW5uaW5nLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9ydW5uaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0MDAwOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfcnVubmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfcnVubmluZ19zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3J1bm5pbmdfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmNTc5ZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfcnVubmluZ19zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3Vua25vd24uZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3Vua25vd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjc3MTRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV91bmtub3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV91bmtub3duX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdW5rbm93bl9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJjOTc3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV91bmtub3duX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdXAuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzYjkzMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VwX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdXBfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExZGQ0OC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdXBfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV91c2VyX2V4Y2wuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfZXhjbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGM5MmEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfZXhjbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdXNlcl9leGNsX3NlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfdXNlcl9leGNsX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzFkNGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfZXhjbF9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfc2hhcmVkLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV91c2VyX3NoYXJlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTY3YTUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfc2hhcmVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV91c2VyX3NoYXJlZF9zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfc2hhcmVkX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzNiNTMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3VzZXJfc2hhcmVkX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wYXJhbGxlbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wYXJhbGxlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWNmYjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcGFyYWxsZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcGFyYWxsZWxfcGVyc3BlY3RpdmUuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcGFyYWxsZWxfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhhNTM5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3BhcmFsbGVsX3BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19lcnJvci5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXJyb3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBjYzA0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXJyb3Jfc2VsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19lcnJvcl9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjMzZGJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19lcnJvcl9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX2V4aXRlZC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXhpdGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1YzhjOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXhpdGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19leGl0ZWRfc2VsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19leGl0ZWRfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZjUwNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXhpdGVkX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXhpdGVkX3NpZ25hbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfZXhpdGVkX3NpZ25hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2JmMGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX2V4aXRlZF9zaWduYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX2V4aXRlZF9zaWduYWxfc2VsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19leGl0ZWRfc2lnbmFsX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjVmZDQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX2V4aXRlZF9zaWduYWxfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19ydW5uaW5nLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19ydW5uaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NDliMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfcnVubmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfcnVubmluZ19zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3J1bm5pbmdfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2MWZiZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfcnVubmluZ19zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3N0YXJ0aW5nLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19zdGFydGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzYxZjEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3N0YXJ0aW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19zdGFydGluZ19zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3N0YXJ0aW5nX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzgyYTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3N0YXJ0aW5nX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2Nfc3VzcGVuZGVkLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19zdXNwZW5kZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFmNmI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19zdXNwZW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3N1c3BlbmRlZF9zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3N1c3BlbmRlZF9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzRmMGZhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY19zdXNwZW5kZWRfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY191bmtub3duLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Byb2Nlc3MvcHJvY191bmtub3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5ODZiOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfdW5rbm93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfdW5rbm93bl9zZWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcHJvY2Vzcy9wcm9jX3Vua25vd25fc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxNTYwMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9wcm9jZXNzL3Byb2NfdW5rbm93bl9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fZXJyb3IuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fZXJyb3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWZhNDAxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3JtX2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3JtX3N0YXJ0ZWQuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fc3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmY4NjMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fc3RhcnRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdGFydGluZy5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdGFydGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzBjMDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fc3RhcnRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fc3RvcHBlZC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdG9wcGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkODExNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdG9wcGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3JtX3N0b3BwaW5nLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3JtX3N0b3BwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3MGMwMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdG9wcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdXNwZW5kZWQuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fc3VzcGVuZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmZDRjNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV9zdXNwZW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvcm0vcm1fdmlldy5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkM2QxYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9ybV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3N0YXJ0LmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3N0YXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNGE0My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9zdGFydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ybS9zdG9wLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIwZWE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3JtL3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvc2VhcmNoLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3NlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDBhMDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvc2VhcmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3NlYXJjaF9kaW0uZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvc2VhcmNoX2RpbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDZhNjMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvc2VhcmNoX2RpbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2NoYW5nZXNldF9ub3JtYWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9jaGFuZ2VzZXRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkZjgwYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2NoYW5nZXNldF9ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9jaGFuZ2VzZXRfbm9ybWFsLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvY2hhbmdlc2V0X25vcm1hbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjkwMzYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9jaGFuZ2VzZXRfbm9ybWFsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvY3JlYXRlc2V0X25vcm1hbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2NyZWF0ZXNldF9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTZiMDI2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvY3JlYXRlc2V0X25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2NyZWF0ZXNldF9ub3JtYWwucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9jcmVhdGVzZXRfbm9ybWFsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0Y2YzMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2NyZWF0ZXNldF9ub3JtYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9kZWxldGVlbGVtZW50X25vcm1hbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2RlbGV0ZWVsZW1lbnRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ZWM1NC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2RlbGV0ZWVsZW1lbnRfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvZGVsZXRlZWxlbWVudF9ub3JtYWwucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9kZWxldGVlbGVtZW50X25vcm1hbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2NiYzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9kZWxldGVlbGVtZW50X25vcm1hbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2RlbGV0ZXNldF9ub3JtYWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9kZWxldGVzZXRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNWY3Yi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2RlbGV0ZXNldF9ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9kZWxldGVzZXRfbm9ybWFsLnBuZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvZGVsZXRlc2V0X25vcm1hbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MzgyZmEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9kZWxldGVzZXRfbm9ybWFsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvam9iX2ZvY3VzX2Rpc2FibGUuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9qb2JfZm9jdXNfZGlzYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNjE1ZDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9qb2JfZm9jdXNfZGlzYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2pvYl9mb2N1c19lbmFibGUuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9qb2JfZm9jdXNfZW5hYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWM1MGI3MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL2pvYl9mb2N1c19lbmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9yZW1vdmVfYWxsX3Rlcm1pbmF0ZWRfZGlzYWJsZS5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3JlbW92ZV9hbGxfdGVybWluYXRlZF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkMWJlNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3JlbW92ZV9hbGxfdGVybWluYXRlZF9kaXNhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvcmVtb3ZlX2FsbF90ZXJtaW5hdGVkX25vcm1hbC5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3JlbW92ZV9hbGxfdGVybWluYXRlZF9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGEzNzg1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvcmVtb3ZlX2FsbF90ZXJtaW5hdGVkX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3JlbW92ZV90ZXJtaW5hdGVkX2Rpc2FibGUuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9yZW1vdmVfdGVybWluYXRlZF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU5ZTQ2Mi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3JlbW92ZV90ZXJtaW5hdGVkX2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9yZW1vdmVfdGVybWluYXRlZF9ub3JtYWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC9yZW1vdmVfdGVybWluYXRlZF9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2Q5YzU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvcmVtb3ZlX3Rlcm1pbmF0ZWRfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2pvYl9kaXNhYmxlLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2pvYl9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzM2FjOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3Rlcm1pbmF0ZV9qb2JfZGlzYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy90b29sL3Rlcm1pbmF0ZV9qb2Jfbm9ybWFsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2pvYl9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQ3Mjc2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2pvYl9ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC96b29taW5fbm9ybWFsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvem9vbWluX25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Mjg3ZGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC96b29taW5fbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3Rvb2wvem9vbW91dF9ub3JtYWwuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC96b29tb3V0X25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTdjNmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdG9vbC96b29tb3V0X25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy92aWV3c3RhdHVzX2Rpc2FibGUuZ2lmIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdmlld3N0YXR1c19kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjNDkxZi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy92aWV3c3RhdHVzX2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvdmlld3N0YXR1c19ob3Zlci5naWYgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy92aWV3c3RhdHVzX2hvdmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3MGEzOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy92aWV3c3RhdHVzX2hvdmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3ZpZXdzdGF0dXNfbm9ybWFsLmdpZiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL3ZpZXdzdGF0dXNfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNzk4Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy92aWV3c3RhdHVzX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDI4ZDA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBDbGVtZW50IENodQotIyAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBVc2VyIEludGVyZmFjZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKLQotUGFyYWxsZWxNYWNoaW5lc1ZpZXcubmFtZT1NYWNoaW5lcwotUGFyYWxsZWxNYWNoaW5lVmlldy5uYW1lPU1hY2hpbmVzIChvbGQpCi1QYXJhbGxlbEpvYnNWaWV3Lm5hbWU9Sm9icwotUGFyYWxsZWxKb2JWaWV3Lm5hbWU9Sm9icyAob2xkKQotSm9ic0xpc3RWaWV3Lm5hbWU9Sm9icyBMaXN0Ci1SZXNvdXJjZU1hbmFnZXJzVmlldy5uYW1lPVJlc291cmNlIE1hbmFnZXJzCi1NYWNoaW5lc05vZGVzVmlldy5uYW1lPU1hY2hpbmVzLCBOb2RlcyBhbmQgSm9icwotCi1UZXJtaW5hdGVBbGxBY3Rpb24ubGFiZWw9VGVybWluYXRlICZBbGwKLVRlcm1pbmF0ZUFsbEFjdGlvbi50b29sdGlwPVRlcm1pbmF0ZSBBbGwKLQotUGFyYWxsZWxWaWV3Q2F0ZWdvcnkubmFtZT1QVFAgUnVudGltZQotUGFyYWxsZWxDb250cm9sVmlldy5uYW1lPVBhcmFsbGVsIFByb2Nlc3NlcyBQYW5lbAotUGFyYWxsZWxQcm9jZXNzVmlldy5uYW1lPVBhcmFsbGVsIFByb2Nlc3MgVmlld2VyCi1wZXJzcGVjdGl2ZS5uYW1lPVBUUCBSdW50aW1lCi0KLXByZWZlcmVuY2VQYWdlcy5uYW1lPVBUUAotU2ltdWxhdGlvbnByZWZlcmVuY2VQYWdlLm5hbWU9U2ltdWxhdGlvbgotT01QSXByZWZlcmVuY2VQYWdlLm5hbWU9T3BlbiBSVEUKLU1QSUNIMnByZWZlcmVuY2VQYWdlLm5hbWU9TVBJQ0gyCi1WaWV3ZXJwcmVmZXJlbmNlUGFnZS5uYW1lPVZpZXdlcgotUk1wcmVmZXJlbmNlUGFnZS5uYW1lPVJlc291cmNlIE1hbmFnZXIKLQotYWN0aW9uU2V0cy5uYW1lPVBUUAotYWN0aW9uU2V0c01lbnUubmFtZT1NZW51IG5hbWUKLQotc2VhcmNoQWN0aW9uLm5hbWU9U2VhcmNoCi1zZWFyY2hBY3Rpb24udG9vbHRpcD1TZWFyY2ggTm9kZSBvciBQcm9jZXNzCi0KLWxlZ2VuZEFjdGlvbi5uYW1lPUxlZ2VuZCBkaWFsb2cKLWxlZ2VuZEFjdGlvbi50b29sdGlwPVNob3cgc3RhdHVzIGljb25zIG9mIG5vZGUgYW5kIHByb2Nlc3MKLQotUFNlYXJjaFBhZ2UubGFiZWw9UFRQIFNlYXJjaAotCi1SZXNvdXJjZU1hbmFnZXJzTWVudS5sYWJlbD1SZXNvdXJjZSBNYW5hZ2VycwotU3RvcFJlc291cmNlTWFuYWdlcnNBY3Rpb24ubGFiZWw9U3RvcCBSZXNvdXJjZSBNYW5hZ2VyCi1TdGFydFJlc291cmNlTWFuYWdlcnNBY3Rpb24ubGFiZWw9U3RhcnQgUmVzb3VyY2UgTWFuYWdlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvcGx1Z2luLnhtbCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMmM1YzguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJybUNvbmZpZ3VyYXRpb25zIiBuYW1lPSJSZXNvdXJjZSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gV2l6YXJkIFBhZ2VzIiBzY2hlbWE9InNjaGVtYS9ybUNvbmZpZ3VyYXRpb25zLmV4c2QiLz4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0JCTxjYXRlZ29yeQotCQkJbmFtZT0iJVBhcmFsbGVsVmlld0NhdGVnb3J5Lm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzIj4KLQkJPC9jYXRlZ29yeT4KLSAgPHZpZXcKLSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS52aWV3cyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5QYXJhbGxlbE1hY2hpbmVzVmlldyIKLSAgICAgICAgaWNvbj0iaWNvbnMvcGFyYWxsZWxfcGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLnBhcmFsbGVsTWFjaGluZXNWaWV3IgotICAgICAgICBuYW1lPSIlUGFyYWxsZWxNYWNoaW5lc1ZpZXcubmFtZSI+Ci0gIDwvdmlldz4KLSAgPHZpZXcKLSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS52aWV3cyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5NYWNoaW5lc05vZGVzVmlldyIKLSAgICAgICAgaWNvbj0iaWNvbnMvcGFyYWxsZWxfcGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLk1hY2hpbmVzTm9kZXNWaWV3IgotICAgICAgICBuYW1lPSIlTWFjaGluZXNOb2Rlc1ZpZXcubmFtZSI+Ci0gIDwvdmlldz4KLQkJPHZpZXcKLQkJCW5hbWU9IiVQYXJhbGxlbEpvYnNWaWV3Lm5hbWUiCi0JCQlpY29uPSJpY29ucy9wYXJhbGxlbF9wZXJzcGVjdGl2ZS5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5QYXJhbGxlbEpvYnNWaWV3IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5wYXJhbGxlbEpvYnNWaWV3Ij4KLQkJPC92aWV3PgotCQk8dmlldwotCQkJbmFtZT0iJVJlc291cmNlTWFuYWdlcnNWaWV3Lm5hbWUiCi0JCQlpY29uPSJpY29ucy9ybS9ybV92aWV3LmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLlJlc291cmNlTWFuYWdlclZpZXciCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLnJlc291cmNlTWFuYWdlclZpZXciPgotCQk8L3ZpZXc+Ci0gIDx2aWV3Ci0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuSm9ic0xpc3RWaWV3IgotICAgICAgICBpY29uPSJpY29ucy9wYXJhbGxlbF9wZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuSm9ic0xpc3RWaWV3IgotICAgICAgICBuYW1lPSIlSm9ic0xpc3RWaWV3Lm5hbWUiPgotICA8L3ZpZXc+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVQYXJhbGxlbFByb2Nlc3NWaWV3Lm5hbWUiCi0JCQlpY29uPSJpY29ucy9wYXJhbGxlbF9wZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5CYXNpY1RleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciIgICAgICAgICAgICAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuUGFyYWxsZWxQcm9jZXNzVmlldyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkudmlld3MucGFyYWxsZWxQcm9jZXNzVmlldyI+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0JCTxwZXJzcGVjdGl2ZQotCQkJaWNvbj0iaWNvbnMvcGFyYWxsZWxfcGVyc3BlY3RpdmUuZ2lmIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QUnVuUGVyc3BlY3RpdmVGYWN0b3J5IgotCQkJbmFtZT0iJXBlcnNwZWN0aXZlLm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLnVpLlBUUFJ1blBlcnNwZWN0aXZlIi8+Ci0JPC9leHRlbnNpb24+ICAgCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLQkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSI+Ci0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dAotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkuUFRQUnVuUGVyc3BlY3RpdmUiPgotCQkJPC9wZXJzcGVjdGl2ZVNob3J0Y3V0PgotCQk8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotCQk8cGVyc3BlY3RpdmVFeHRlbnNpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIj4KLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC51aS5QVFBSdW5QZXJzcGVjdGl2ZSI+Ci0JCQk8L3BlcnNwZWN0aXZlU2hvcnRjdXQ+Ci0JCTwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0JCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnB0cC51aS5QVFBSdW5QZXJzcGVjdGl2ZSI+Ci0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dAotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdQZXJzcGVjdGl2ZSI+Ci0JCQk8L3BlcnNwZWN0aXZlU2hvcnRjdXQ+Ci0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dAotCQkJCWlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIj4KLQkJCTwvcGVyc3BlY3RpdmVTaG9ydGN1dD4KLQkJCTxhY3Rpb25TZXQKLQkJCQlpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQWN0aW9uU2V0Ij4KLQkJCTwvYWN0aW9uU2V0PgotCQkJPGFjdGlvblNldAotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9uU2V0cyI+Ci0JCQk8L2FjdGlvblNldD4KLQkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gY3JlYXRlIHByZWZlcmVuY2UgcGFnZSAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlcHJlZmVyZW5jZVBhZ2VzLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLlBUUFByZWZlcmVuY2VzUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucHRwUHJlZmVyZW5jZXNQYWdlIj4KLQkJPC9wYWdlPgotCQk8IS0tICAgICAgCi0JCTxwYWdlCi0JCQluYW1lPSIlU2ltdWxhdGlvbnByZWZlcmVuY2VQYWdlLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLlNpbXVsYXRpb25QcmVmZXJlbmNlc1BhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnNpbXVsYXRpb25QcmVmZXJlbmNlc1BhZ2UiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnB0cFByZWZlcmVuY2VzUGFnZSI+Ci0JCTwvcGFnZT4KLQkJLS0+Ci0gIDxwYWdlCi0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucHRwUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLlJNUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnJtUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICBuYW1lPSJSZXNvdXJjZSBNYW5hZ2VycyI+Ci0gIDwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVWaWV3ZXJwcmVmZXJlbmNlUGFnZS5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5WaWV3ZXJQcmVmZXJlbmNlc1BhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnZpZXdlclByZWZlcmVuY2VzUGFnZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucHRwUHJlZmVyZW5jZXNQYWdlIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotCQk8L2luaXRpYWxpemVyPgotCTwvZXh0ZW5zaW9uPgotICAgCi0JPCEtLSBhZGQgYnV0dG9ucyB0byBlZGl0b3IgYWN0aW9uIHRvb2xiYXIgLy8tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLQkJPGFjdGlvblNldAotCQkJbGFiZWw9IiVhY3Rpb25TZXRzLm5hbWUiCi0JCQl2aXNpYmxlPSJmYWxzZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9uU2V0cyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVsZWdlbmRBY3Rpb24ubmFtZSIKLQkJCQlpY29uPSJpY29ucy9sZWdlbmQuZ2lmIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9ucy5TaG93TGVnZW5kQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVsZWdlbmRBY3Rpb24udG9vbHRpcCIKLQkJCQl0b29sYmFyUGF0aD0ib3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvblNldHMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLnNob3dMZWdlbmRBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8IS0tCi0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVzZWFyY2hBY3Rpb24ubmFtZSIKLQkJCQlpY29uPSJpY29ucy9zZWFyY2guZ2lmIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wZHQudWkuYWN0aW9ucy5TZWFyY2hBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJXNlYXJjaEFjdGlvbi50b29sdGlwIgotCQkJCXRvb2xiYXJQYXRoPSJvcmcuZWNsaXBzZS5wZHQuYWN0aW9uU2V0cyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucGR0LnVpLmFjdGlvbnMuc2VhcmNoQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJLy8tLT4KLQkJPC9hY3Rpb25TZXQ+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkucmVzb3VyY2VNYW5hZ2VyLnBvcHVwdU1lbnUiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uIj4KLQkJCTxhY3Rpb24KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuU3RvcFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZSIKLQkJCQllbmFibGVzRm9yPSIrIgotCQkJCWljb249Imljb25zL3JtL3N0b3AuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5zdG9wUmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbiIKLQkJCQlsYWJlbD0iJVN0b3BSZXNvdXJjZU1hbmFnZXJzQWN0aW9uLmxhYmVsIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiLz4KLQkJCTxhY3Rpb24KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuU3RhcnRSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUiCi0JCQkJZW5hYmxlc0Zvcj0iKyIKLQkJCQlpY29uPSJpY29ucy9ybS9zdGFydC5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLnN0YXJ0UmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbiIKLQkJCQlsYWJlbD0iJVN0YXJ0UmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbi5sYWJlbCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIi8+Ci0JCQk8bWVudQotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAudWkucmVzb3VyY2VNYW5hZ2VyLnBvcHVwU3ViTWVudSIKLQkJCQlsYWJlbD0iJVJlc291cmNlTWFuYWdlcnNNZW51LmxhYmVsIgotCQkJCXBhdGg9ImFkZGl0aW9ucyI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9ImNvbnRlbnQiLz4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9ImFkZGl0aW9ucyIvPgotCQkJPC9tZW51PgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zY2hlbWEvcm1Db25maWd1cmF0aW9ucy5leHNkIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc2NoZW1hL3JtQ29uZmlndXJhdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YjQyYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zY2hlbWEvcm1Db25maWd1cmF0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIiBpZD0icm1Db25maWd1cmF0aW9ucyIgbmFtZT0iUmVzb3VyY2UgTWFuYWdlciBDb25maWd1cmF0aW9uIFdpemFyZCBQYWdlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgcGx1Zy1pbnMgdG8gY29udHJpYnV0ZSBhIHJlc291cmNlIG1hbmFnZXIgd2l6YXJkIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUgYSBuZXcgcmVzb3VyY2UgbWFuYWdlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29uZmlndXJhdGlvbldpemFyZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb25maWd1cmF0aW9uV2l6YXJkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvUFJ1blBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9QUnVuUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWQ3NDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9QUnVuUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBQUnVuUGVyc3BlY3RpdmVGYWN0b3J5IGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAJCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJCi0JCUlGb2xkZXJMYXlvdXQgcm1Gb2xkZXI9IGxheW91dC5jcmVhdGVGb2xkZXIoInJtRm9sZGVyIiwgSVBhZ2VMYXlvdXQuTEVGVCwgKGZsb2F0KTAuNTAsIGVkaXRvckFyZWEpOwotCQlybUZvbGRlci5hZGRWaWV3KElQVFBVSUNvbnN0YW50cy5WSUVXX1JFU09VUkNFTUFOQUdFUik7Ci0KLQkJSUZvbGRlckxheW91dCBqb2JzRm9sZGVyPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJqb2JzRm9sZGVyIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpMC43NSwgInJtRm9sZGVyIik7Ci0JCWpvYnNGb2xkZXIuYWRkVmlldyhJUFRQVUlDb25zdGFudHMuVklFV19QQVJBTExFTEpPQlMpOwotCQlqb2JzRm9sZGVyLmFkZFZpZXcoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSk9CU0xJU1QpOwotCi0JCUlGb2xkZXJMYXlvdXQgbWFjaGluZXNGb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJtYWNoaW5lc0ZvbGRlciIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KTAuMjUsICJybUZvbGRlciIpOwotCQltYWNoaW5lc0ZvbGRlci5hZGRWaWV3KElQVFBVSUNvbnN0YW50cy5WSUVXX1BBUkFMTEVMTUFDSElORVMpOwotCQltYWNoaW5lc0ZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQkKLQkJSUZvbGRlckxheW91dCBjb25zb2xlRm9sZGVyPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJjb25zb2xlRm9sZGVyIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpMC43NSwgZWRpdG9yQXJlYSk7Ci0JCWNvbnNvbGVGb2xkZXIuYWRkVmlldyhJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQljb25zb2xlRm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJY29uc29sZUZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQljb25zb2xlRm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKLQkJY29uc29sZUZvbGRlci5hZGRWaWV3KCJvcmcuZWNsaXBzZS5wZGUucnVudGltZS5Mb2dWaWV3Iik7Ci0JCQotCQkvLyBzZXQgdG9vbGJhciBvciBtZW51IGljb24KLQkJLy9sYXlvdXQuYWRkQWN0aW9uU2V0KElEZWJ1Z1VJQ29uc3RhbnRzLkxBVU5DSF9BQ1RJT05fU0VUKTsKLQkJLy9sYXlvdXQuYWRkQWN0aW9uU2V0KElQVFBVSUNvbnN0YW50cy5BQ1RJT05fU0VUKTsKLQotCQkvLyB2aWV3cyAtIGJ1aWxkIGNvbnNvbGUKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKLQkJCi0JCS8vIHZpZXdzIC0gc2VhcmNoaW5nCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KE5ld1NlYXJjaFVJLlNFQVJDSF9WSUVXX0lEKTsKLQkJCi0JCS8vIHZpZXdzIC0gc3RhbmRhcmQgd29ya2JlbmNoCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQVFBVSUNvbnN0YW50cy5WSUVXX1BBUkFMTEVMTUFDSElORVMpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUFRQVUlDb25zdGFudHMuVklFV19QQVJBTExFTEpPQlMpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS5wZGUucnVudGltZS5Mb2dWaWV3Iik7Ci0JCQotCQkvLyBsaW5rIC0gdGhpbmdzIHdlIHNob3VsZCBkbwotCQlsYXlvdXQuYWRkU2hvd0luUGFydChJUFRQVUlDb25zdGFudHMuVklFV19QQVJBTExFTE1BQ0hJTkVTKTsKLQkJbGF5b3V0LmFkZFNob3dJblBhcnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfUEFSQUxMRUxKT0JTKTsKLQkJLy9sYXlvdXQuYWRkU2hvd0luUGFydChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJLy9sYXlvdXQuYWRkU2hvd0luUGFydCgib3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUuTG9nVmlldyIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvUGFyYWxsZWxJbWFnZXMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvUGFyYWxsZWxJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5MzliNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL1BhcmFsbGVsSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgUGFyYWxsZWxJbWFnZXMgewotCi0JLy8gPT09PSBVUkxzIGZvciBJY29uIEZvbGRlcnMgPT09PSAKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFVSTCBJQ09OVVJMID0gUFRQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJpY29ucy8iKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFVSTCBUT09MSUNPTlVSTCA9IFBUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiaWNvbnMvdG9vbC8iKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFVSTCBKT0JJQ09OVVJMID0gUFRQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJpY29ucy9qb2IvIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBVUkwgUFJPQ0VTU0lDT05VUkwgPSBQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImljb25zL3Byb2Nlc3MvIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBVUkwgTk9ERUlDT05VUkwgPSBQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImljb25zL25vZGUvIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBVUkwgTUFDSElORUlDT05VUkwgPSBQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImljb25zL21hY2hpbmUvIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBVUkwgUk1JQ09OVVJMID0gUFRQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJpY29ucy9ybS8iKTsKLQkKLQkvLyA9PT09PSBJY29uIEZpbGVzID09PT09Ci0KLQkvLyBDSEFOR0UvREVMRVRFIFNFVAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fQ0hBTkdFU0VUX05PUk1BTCA9ICJjaGFuZ2VzZXRfbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DUkVBVEVTRVRfTk9STUFMID0gImNyZWF0ZXNldF9ub3JtYWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RFTEVURVNFVF9OT1JNQUwgPSAiZGVsZXRlc2V0X25vcm1hbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fREVMRVRFRUxFTUVOVF9OT1JNQUwgPSAiZGVsZXRlZWxlbWVudF9ub3JtYWwuZ2lmIjsKLQotCS8vWk9PTQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fWk9PTUlOX05PUk1BTCA9ICJ6b29taW5fbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9aT09NT1VUX05PUk1BTCA9ICJ6b29tb3V0X25vcm1hbC5naWYiOwotCQotCS8vIFRPT0xCQVIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1RFUk1JTkFURV9KT0JfRElTQUJMRSA9ICJ0ZXJtaW5hdGVfam9iX2Rpc2FibGUuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1RFUk1JTkFURV9KT0JfTk9STUFMID0gInRlcm1pbmF0ZV9qb2Jfbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SRU1PVkVBTExURVJNSU5BVEVEX05PUk1BTCA9ICJyZW1vdmVfYWxsX3Rlcm1pbmF0ZWRfbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SRU1PVkVURVJNSU5BVEVEX05PUk1BTCA9ICJyZW1vdmVfdGVybWluYXRlZF9ub3JtYWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0pPQl9GT0NVU19ESVNBQkxFID0gImpvYl9mb2N1c19kaXNhYmxlLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9KT0JfRk9DVVNfRU5BQkxFID0gImpvYl9mb2N1c19lbmFibGUuZ2lmIjsKLQkKLQkvLyBTSE9XIExFR0VORAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU0hPV0xFR0VORF9BQ1RJT05fTk9STUFMID0gICJsZWdlbmQuZ2lmIjsKLQotCS8vIEpPQgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KT0JfUEVORElORyA9ICJqb2JfcGVuZGluZy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KT0JfU1RBUlRFRCA9ICJqb2Jfc3RhcnRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KT0JfUlVOTklORyA9ICJqb2JfcnVubmluZy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KT0JfVEVSTUlOQVRFRCA9ICJqb2JfdGVybWluYXRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KT0JfU1VTUEVOREVEID0gImpvYl9zdXNwZW5kZWQuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSk9CX0VSUk9SID0gImpvYl9lcnJvci5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KT0JfVU5LTk9XTiA9ICJqb2JfdW5rbm93bi5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19KT0JfUEVORElORyA9ICJkZWJ1Z19qb2JfcGVuZGluZy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19KT0JfU1RBUlRFRCA9ICJkZWJ1Z19qb2Jfc3RhcnRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19KT0JfUlVOTklORyA9ICJkZWJ1Z19qb2JfcnVubmluZy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19KT0JfVEVSTUlOQVRFRCA9ICJkZWJ1Z19qb2JfdGVybWluYXRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19KT0JfU1VTUEVOREVEID0gImRlYnVnX2pvYl9zdXNwZW5kZWQuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfSk9CX0VSUk9SID0gImRlYnVnX2pvYl9lcnJvci5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19KT0JfVU5LTk9XTiA9ICJkZWJ1Z19qb2JfdW5rbm93bi5naWYiOwotCQotCS8vIE5PREUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9VU0VSX0FMTE9DX0VYQ0wgPSAibm9kZV91c2VyX2V4Y2wuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9VU0VSX0FMTE9DX0VYQ0xfU0VMID0gIm5vZGVfdXNlcl9leGNsX3NlbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OT0RFX1VTRVJfQUxMT0NfU0hBUkVEID0gIm5vZGVfdXNlcl9zaGFyZWQuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9VU0VSX0FMTE9DX1NIQVJFRF9TRUwgPSAibm9kZV91c2VyX3NoYXJlZF9zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9PVEhFUl9BTExPQ19FWENMID0gIm5vZGVfb3RoZXJfZXhjbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OT0RFX09USEVSX0FMTE9DX0VYQ0xfU0VMID0gIm5vZGVfb3RoZXJfZXhjbF9zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9PVEhFUl9BTExPQ19TSEFSRUQgPSAibm9kZV9vdGhlcl9zaGFyZWQuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9PVEhFUl9BTExPQ19TSEFSRURfU0VMID0gIm5vZGVfb3RoZXJfc2hhcmVkX3NlbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OT0RFX0RPV04gPSAibm9kZV9kb3duLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05PREVfRE9XTl9TRUwgPSAibm9kZV9kb3duX3NlbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OT0RFX0VSUk9SID0gIm5vZGVfZXJyb3IuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9FUlJPUl9TRUwgPSAibm9kZV9lcnJvcl9zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9FWElURURfUFJPQ0VTUyA9ICJub2RlX2V4aXRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OT0RFX0VYSVRFRF9QUk9DRVNTX1NFTCA9ICJub2RlX2V4aXRlZF9zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9SVU5OSU5HX1BST0NFU1MgPSAibm9kZV9ydW5uaW5nLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05PREVfUlVOTklOR19QUk9DRVNTX1NFTCA9ICJub2RlX3J1bm5pbmdfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05PREVfVU5LTk9XTiA9ICJub2RlX3Vua25vd24uZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTk9ERV9VTktOT1dOX1NFTCA9ICJub2RlX3Vua25vd25fc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05PREVfVVAgPSAibm9kZV91cC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OT0RFX1VQX1NFTCA9ICJub2RlX3VwX3NlbC5naWYiOwotCQotCS8vIFBST0NFU1MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPQ19FUlJPUiA9ICJwcm9jX2Vycm9yLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST0NfRVJST1JfU0VMID0gInByb2NfZXJyb3Jfc2VsLmdpZiI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9DX0VYSVRFRCA9ICJwcm9jX2V4aXRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9DX0VYSVRFRF9TRUwgPSAicHJvY19leGl0ZWRfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST0NfRVhJVEVEX1NJR05BTCA9ICJwcm9jX2V4aXRlZF9zaWduYWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPQ19FWElURURfU0lHTkFMX1NFTCA9ICJwcm9jX2V4aXRlZF9zaWduYWxfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST0NfUlVOTklORyA9ICJwcm9jX3J1bm5pbmcuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPQ19SVU5OSU5HX1NFTCA9ICJwcm9jX3J1bm5pbmdfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST0NfU1RBUlRJTkcgPSAicHJvY19zdGFydGluZy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9DX1NUQVJUSU5HX1NFTCA9ICJwcm9jX3N0YXJ0aW5nX3NlbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9DX1NVU1BFTkRFRCA9ICJwcm9jX3N1c3BlbmRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9DX1NVU1BFTkRFRF9TRUwgPSAicHJvY19zdXNwZW5kZWRfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST0NfVU5LTk9XTiA9ICJwcm9jX3Vua25vd24uZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPQ19VTktOT1dOX1NFTCA9ICJwcm9jX3Vua25vd25fc2VsLmdpZiI7Ci0JCi0JLy8gTUFDSElORQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NQUNISU5FX1VOS05PV04gPSAibWFjaGluZV91bmtub3duLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01BQ0hJTkVfVVAgPSAibWFjaGluZV91cC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NQUNISU5FX0RPV04gPSAibWFjaGluZV9kb3duLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01BQ0hJTkVfQUxFUlQgPSAibWFjaGluZV9hbGVydC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NQUNISU5FX0VSUk9SID0gIm1hY2hpbmVfZXJyb3IuZ2lmIjsKLQotCS8vIFJFU09VUkNFIE1BTkFHRVJTCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JNX1NUT1BQRUQgPSAicm1fc3RvcHBlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19STV9TVEFSVEVEID0gInJtX3N0YXJ0ZWQuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUk1fU1RBUlRJTkcgPSAicm1fc3RhcnRpbmcuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUk1fU1RPUFBJTkcgPSAicm1fc3RvcHBpbmcuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUk1fU1VTUEVOREVEID0gInJtX3N1c3BlbmRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19STV9FUlJPUiA9ICJybV9lcnJvci5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19STV9TVEFSVCA9ICJzdGFydC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19STV9TVE9QID0gInN0b3AuZ2lmIjsKLQkKLQkvLyA9PT09IEltYWdlIERlc2NyaXB0b3JzID09PT0KLQkKLQkvLyBDSEFOR0UvREVMRVRFIFNFVAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lDT05fQ0hBTkdFU0VUX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9DSEFOR0VTRVRfTk9STUFMLCBJQ09OX0NIQU5HRVNFVF9OT1JNQUwpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lDT05fQ1JFQVRFU0VUX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9DUkVBVEVTRVRfTk9STUFMLCBJQ09OX0NSRUFURVNFVF9OT1JNQUwpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lDT05fREVMRVRFU0VUX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9ERUxFVEVTRVRfTk9STUFMLCBJQ09OX0RFTEVURVNFVF9OT1JNQUwpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lDT05fREVMRVRFRUxFTUVOVF9OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fREVMRVRFRUxFTUVOVF9OT1JNQUwsIElDT05fREVMRVRFRUxFTUVOVF9OT1JNQUwpOwotCi0JLy9aT09NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9aT09NSU5fTk9STUFMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX1pPT01JTl9OT1JNQUwsIElDT05fWk9PTUlOX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9aT09NT1VUX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9aT09NT1VUX05PUk1BTCwgSUNPTl9aT09NT1VUX05PUk1BTCk7Ci0KLQkvLyBUT09MQkFSCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9URVJNSU5BVEVfSk9CX0RJU0FCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fVEVSTUlOQVRFX0pPQl9ESVNBQkxFLCBJQ09OX1RFUk1JTkFURV9KT0JfRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9URVJNSU5BVEVfSk9CX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9URVJNSU5BVEVfSk9CX05PUk1BTCwgSUNPTl9URVJNSU5BVEVfSk9CX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9SRU1PVkVBTExURVJNSU5BVEVEX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9SRU1PVkVBTExURVJNSU5BVEVEX05PUk1BTCwgSUNPTl9SRU1PVkVBTExURVJNSU5BVEVEX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9SRU1PVkVURVJNSU5BVEVEX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9SRU1PVkVURVJNSU5BVEVEX05PUk1BTCwgSUNPTl9SRU1PVkVURVJNSU5BVEVEX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9KT0JfRk9DVVNfRElTQUJMRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9KT0JfRk9DVVNfRElTQUJMRSwgSUNPTl9KT0JfRk9DVVNfRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9KT0JfRk9DVVNfRU5BQkxFID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX0pPQl9GT0NVU19FTkFCTEUsIElDT05fSk9CX0ZPQ1VTX0VOQUJMRSk7Ci0JCi0JLy8gU0hPVyBMRUdFTkQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JQ09OX1NIT1dMRUdFTkRfQUNUSU9OX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9TSE9XTEVHRU5EX0FDVElPTl9OT1JNQUwsIElDT05fU0hPV0xFR0VORF9BQ1RJT05fTk9STUFMKTsKLQotCS8vIEpPQgotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19KT0JfUEVORElORyA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihKT0JJQ09OVVJMLCBJTUdfSk9CX1BFTkRJTkcsIElNR19KT0JfUEVORElORyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0pPQl9TVEFSVEVEID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKEpPQklDT05VUkwsIElNR19KT0JfU1RBUlRFRCwgSU1HX0pPQl9TVEFSVEVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfSk9CX1JVTk5JTkcgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoSk9CSUNPTlVSTCwgSU1HX0pPQl9SVU5OSU5HLCBJTUdfSk9CX1JVTk5JTkcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19KT0JfVEVSTUlOQVRFRCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihKT0JJQ09OVVJMLCBJTUdfSk9CX1RFUk1JTkFURUQsIElNR19KT0JfVEVSTUlOQVRFRCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0pPQl9TVVNQRU5ERUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoSk9CSUNPTlVSTCwgSU1HX0pPQl9TVVNQRU5ERUQsIElNR19KT0JfU1VTUEVOREVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfSk9CX0VSUk9SID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKEpPQklDT05VUkwsIElNR19KT0JfRVJST1IsIElNR19KT0JfRVJST1IpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19KT0JfVU5LTk9XTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihKT0JJQ09OVVJMLCBJTUdfSk9CX1VOS05PV04sIElNR19KT0JfVU5LTk9XTik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX0pPQl9QRU5ESU5HID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKEpPQklDT05VUkwsIElNR19ERUJVR19KT0JfUEVORElORywgSU1HX0RFQlVHX0pPQl9QRU5ESU5HKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfSk9CX1NUQVJURUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoSk9CSUNPTlVSTCwgSU1HX0RFQlVHX0pPQl9TVEFSVEVELCBJTUdfREVCVUdfSk9CX1NUQVJURUQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19KT0JfUlVOTklORyA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihKT0JJQ09OVVJMLCBJTUdfREVCVUdfSk9CX1JVTk5JTkcsIElNR19ERUJVR19KT0JfUlVOTklORyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX0pPQl9URVJNSU5BVEVEID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKEpPQklDT05VUkwsIElNR19ERUJVR19KT0JfVEVSTUlOQVRFRCwgSU1HX0RFQlVHX0pPQl9URVJNSU5BVEVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfSk9CX1NVU1BFTkRFRCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihKT0JJQ09OVVJMLCBJTUdfREVCVUdfSk9CX1NVU1BFTkRFRCwgSU1HX0RFQlVHX0pPQl9TVVNQRU5ERUQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19KT0JfRVJST1IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoSk9CSUNPTlVSTCwgSU1HX0RFQlVHX0pPQl9FUlJPUiwgSU1HX0RFQlVHX0pPQl9FUlJPUik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX0pPQl9VTktOT1dOID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKEpPQklDT05VUkwsIElNR19ERUJVR19KT0JfVU5LTk9XTiwgSU1HX0RFQlVHX0pPQl9VTktOT1dOKTsKLQotCS8vIE5PREUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VU0VSX0FMTE9DX0VYQ0wgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX1VTRVJfQUxMT0NfRVhDTCwgSU1HX05PREVfVVNFUl9BTExPQ19FWENMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VU0VSX0FMTE9DX0VYQ0xfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKE5PREVJQ09OVVJMLCBJTUdfTk9ERV9VU0VSX0FMTE9DX0VYQ0xfU0VMLCBJTUdfTk9ERV9VU0VSX0FMTE9DX0VYQ0xfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VU0VSX0FMTE9DX1NIQVJFRCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfVVNFUl9BTExPQ19TSEFSRUQsIElNR19OT0RFX1VTRVJfQUxMT0NfU0hBUkVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VU0VSX0FMTE9DX1NIQVJFRF9TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX1VTRVJfQUxMT0NfU0hBUkVEX1NFTCwgSU1HX05PREVfVVNFUl9BTExPQ19TSEFSRURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9PVEhFUl9BTExPQ19FWENMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKE5PREVJQ09OVVJMLCBJTUdfTk9ERV9PVEhFUl9BTExPQ19FWENMLCBJTUdfTk9ERV9PVEhFUl9BTExPQ19FWENMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9PVEhFUl9BTExPQ19FWENMX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfT1RIRVJfQUxMT0NfRVhDTF9TRUwsIElNR19OT0RFX09USEVSX0FMTE9DX0VYQ0xfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9PVEhFUl9BTExPQ19TSEFSRUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX09USEVSX0FMTE9DX1NIQVJFRCwgSU1HX05PREVfT1RIRVJfQUxMT0NfU0hBUkVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9PVEhFUl9BTExPQ19TSEFSRURfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKE5PREVJQ09OVVJMLCBJTUdfTk9ERV9PVEhFUl9BTExPQ19TSEFSRURfU0VMLCBJTUdfTk9ERV9PVEhFUl9BTExPQ19TSEFSRURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9ET1dOID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKE5PREVJQ09OVVJMLCBJTUdfTk9ERV9ET1dOLCBJTUdfTk9ERV9ET1dOKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9ET1dOX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfRE9XTl9TRUwsIElNR19OT0RFX0RPV05fU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9FUlJPUiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfRVJST1IsIElNR19OT0RFX0VSUk9SKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9FUlJPUl9TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX0VSUk9SX1NFTCwgSU1HX05PREVfRVJST1JfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9FWElURURfUFJPQ0VTUyA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfRVhJVEVEX1BST0NFU1MsIElNR19OT0RFX0VYSVRFRF9QUk9DRVNTKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9FWElURURfUFJPQ0VTU19TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX0VYSVRFRF9QUk9DRVNTX1NFTCwgSU1HX05PREVfRVhJVEVEX1BST0NFU1NfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9SVU5OSU5HX1BST0NFU1MgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX1JVTk5JTkdfUFJPQ0VTUywgSU1HX05PREVfUlVOTklOR19QUk9DRVNTKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9SVU5OSU5HX1BST0NFU1NfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKE5PREVJQ09OVVJMLCBJTUdfTk9ERV9SVU5OSU5HX1BST0NFU1NfU0VMLCBJTUdfTk9ERV9SVU5OSU5HX1BST0NFU1NfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VTktOT1dOID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKE5PREVJQ09OVVJMLCBJTUdfTk9ERV9VTktOT1dOLCBJTUdfTk9ERV9VTktOT1dOKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VTktOT1dOX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfVU5LTk9XTl9TRUwsIElNR19OT0RFX1VOS05PV05fU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VUCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihOT0RFSUNPTlVSTCwgSU1HX05PREVfVVAsIElNR19OT0RFX1VQKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfTk9ERV9VUF9TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTk9ERUlDT05VUkwsIElNR19OT0RFX1VQX1NFTCwgSU1HX05PREVfVVBfU0VMKTsKLQotCS8vIFBST0NFU1MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19FUlJPUiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST0NfRVJST1IsIElNR19QUk9DX0VSUk9SKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19FUlJPUl9TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9DX0VSUk9SX1NFTCwgSU1HX1BST0NfRVJST1JfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19FWElURUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9DX0VYSVRFRCwgSU1HX1BST0NfRVhJVEVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19FWElURURfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPQ19FWElURURfU0VMLCBJTUdfUFJPQ19FWElURURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19FWElURURfU0lHTkFMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPQ19FWElURURfU0lHTkFMLCBJTUdfUFJPQ19FWElURURfU0lHTkFMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19FWElURURfU0lHTkFMX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST0NfRVhJVEVEX1NJR05BTF9TRUwsIElNR19QUk9DX0VYSVRFRF9TSUdOQUxfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19SVU5OSU5HID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPQ19SVU5OSU5HLCBJTUdfUFJPQ19SVU5OSU5HKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19SVU5OSU5HX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST0NfUlVOTklOR19TRUwsIElNR19QUk9DX1JVTk5JTkdfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19TVEFSVElORyA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST0NfU1RBUlRJTkcsIElNR19QUk9DX1NUQVJUSU5HKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19TVEFSVElOR19TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9DX1NUQVJUSU5HX1NFTCwgSU1HX1BST0NfU1RBUlRJTkdfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19TVVNQRU5ERUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9DX1NVU1BFTkRFRCwgSU1HX1BST0NfU1VTUEVOREVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19TVVNQRU5ERURfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPQ19TVVNQRU5ERURfU0VMLCBJTUdfUFJPQ19TVVNQRU5ERURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19VTktOT1dOID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPQ19VTktOT1dOLCBJTUdfUFJPQ19VTktOT1dOKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPQ19VTktOT1dOX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST0NfVU5LTk9XTl9TRUwsIElNR19QUk9DX1VOS05PV05fU0VMKTsKLQkKLQkvLyBNQUNISU5FCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX01BQ0hJTkVfVU5LTk9XTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihNQUNISU5FSUNPTlVSTCwgSU1HX01BQ0hJTkVfVU5LTk9XTiwgSU1HX01BQ0hJTkVfVU5LTk9XTik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX01BQ0hJTkVfVVAgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTUFDSElORUlDT05VUkwsIElNR19NQUNISU5FX1VQLCBJTUdfTUFDSElORV9VUCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX01BQ0hJTkVfRE9XTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihNQUNISU5FSUNPTlVSTCwgSU1HX01BQ0hJTkVfRE9XTiwgSU1HX01BQ0hJTkVfRE9XTik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX01BQ0hJTkVfQUxFUlQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTUFDSElORUlDT05VUkwsIElNR19NQUNISU5FX0FMRVJULCBJTUdfTUFDSElORV9BTEVSVCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX01BQ0hJTkVfRVJST1IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoTUFDSElORUlDT05VUkwsIElNR19NQUNISU5FX0VSUk9SLCBJTUdfTUFDSElORV9FUlJPUik7Ci0KLQkvLyBSRVNPVVJDRSBNQU5BR0VSUwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19STV9TVE9QUEVEID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFJNSUNPTlVSTCwgSU1HX1JNX1NUT1BQRUQsIElNR19STV9TVE9QUEVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUk1fU1RBUlRFRCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihSTUlDT05VUkwsIElNR19STV9TVEFSVEVELCBJTUdfUk1fU1RBUlRFRCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX1JNX1NUQVJUSU5HID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFJNSUNPTlVSTCwgSU1HX1JNX1NUQVJUSU5HLCBJTUdfUk1fU1RBUlRJTkcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19STV9TVE9QUElORyA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihSTUlDT05VUkwsIElNR19STV9TVE9QUElORywgSU1HX1JNX1NUT1BQSU5HKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUk1fU1VTUEVOREVEID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFJNSUNPTlVSTCwgSU1HX1JNX1NVU1BFTkRFRCwgSU1HX1JNX1NVU1BFTkRFRCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX1JNX0VSUk9SID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFJNSUNPTlVSTCwgSU1HX1JNX0VSUk9SLCBJTUdfUk1fRVJST1IpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19STV9TVEFSVD0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFJNSUNPTlVSTCwgSU1HX1JNX1NUQVJULCBJTUdfUk1fU1RBUlQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19STV9TVE9QID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFJNSUNPTlVSTCwgSU1HX1JNX1NUT1AsIElNR19STV9TVE9QKTsKLQkKLQkvLyA9PT09IEltYWdlIEFycmF5cyA9PT09Ci0JCi0JLy8gTk9URTogVGhlIG9yZGVyIG9mIGltYWdlcyBpbiB0aGVzZSBhcnJheXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBvcmRpbmFsCi0JLy8gdmFsdWVzIG9mIHRoZSBlbGVtZW50IHN0YXRlIGF0dHJpYnV0ZXMuCi0JCi0JLy8gTk9ERQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VbXVtdIG5vZGVJbWFnZXMgPSB7Ci0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVVApLAkJCQkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVVBfU0VMKQkJCQkJfSwgICAgICAgICAgICAgCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfRE9XTiksCQkJCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19OT0RFX0RPV05fU0VMKQkJCQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9FUlJPUiksCQkJCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19OT0RFX0VSUk9SX1NFTCkJCQkJCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVU5LTk9XTiksCQkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVU5LTk9XTl9TRUwpCQkJCX0sCi0JCS8vIEV4dHJhIFN0YXRlCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVVNFUl9BTExPQ19FWENMKSwJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVVNFUl9BTExPQ19FWENMX1NFTCkJCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfVVNFUl9BTExPQ19TSEFSRUQpLAlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9VU0VSX0FMTE9DX1NIQVJFRF9TRUwpCQl9LAotCQl7IGdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19OT0RFX09USEVSX0FMTE9DX0VYQ0wpLAlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9PVEhFUl9BTExPQ19FWENMX1NFTCkJCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfT1RIRVJfQUxMT0NfU0hBUkVEKSwJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX05PREVfT1RIRVJfQUxMT0NfU0hBUkVEX1NFTCkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9SVU5OSU5HX1BST0NFU1MpLAlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9SVU5OSU5HX1BST0NFU1NfU0VMKQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9FWElURURfUFJPQ0VTUyksCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTk9ERV9FWElURURfUFJPQ0VTU19TRUwpCQl9Ci0JfTsKLQotCS8vIEpPQgotCXB1YmxpYyBzdGF0aWMgSW1hZ2VbXVtdIGpvYkltYWdlcyA9IHsKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfSk9CX1BFTkRJTkcpLAkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX0RFQlVHX0pPQl9QRU5ESU5HKQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfSk9CX1NUQVJURUQpLAkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX0RFQlVHX0pPQl9TVEFSVEVEKQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfSk9CX1JVTk5JTkcpLAkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX0RFQlVHX0pPQl9SVU5OSU5HKQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfSk9CX1RFUk1JTkFURUQpLAlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfREVCVUdfSk9CX1RFUk1JTkFURUQpCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX0pPQl9TVVNQRU5ERUQpLAlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfREVCVUdfSk9CX1NVU1BFTkRFRCkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfSk9CX0VSUk9SKSwJCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19ERUJVR19KT0JfRVJST1IpCQl9LAotCQl7IGdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19KT0JfVU5LTk9XTiksCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfREVCVUdfSk9CX1VOS05PV04pCQl9Ci0JfTsKLQkKLQkvLyBQUk9DRVNTCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZVtdW10gcHJvY0ltYWdlcyA9IHsKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19TVEFSVElORyksCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19TVEFSVElOR19TRUwpCQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19SVU5OSU5HKSwJCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19QUk9DX1JVTk5JTkdfU0VMKQkJCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX1BST0NfRVhJVEVEKSwJCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19FWElURURfU0VMKQkJCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX1BST0NfRVhJVEVEX1NJR05BTCksCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19QUk9DX0VYSVRFRF9TSUdOQUxfU0VMKQkJfSwKLQkJeyBnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19TVVNQRU5ERUQpLAkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX1BST0NfU1VTUEVOREVEX1NFTCkJCQl9LAotCQl7IGdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19QUk9DX0VSUk9SKSwJCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19FUlJPUl9TRUwpCQkJCX0sCi0JCXsgZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX1BST0NfVU5LTk9XTiksCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUFJPQ19VTktOT1dOX1NFTCkJCQl9Ci0JfTsKLQotCS8vIE1BQ0hJTkUKLQlwdWJsaWMgc3RhdGljIEltYWdlW10gbWFjaGluZUltYWdlcyA9IHsKLQkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX01BQ0hJTkVfVVApLAotCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTUFDSElORV9ET1dOKSwKLQkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX01BQ0hJTkVfQUxFUlQpLAotCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfTUFDSElORV9FUlJPUiksCi0JCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19NQUNISU5FX1VOS05PV04pCi0JfTsKLQotCS8vIFJFU09VUkNFIE1BTkFHRVJTCi0JcHVibGljIHN0YXRpYyBJbWFnZVtdIHJtSW1hZ2VzID0gewotCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUk1fU1RBUlRJTkcpLAotCQlnZXRJbWFnZShQYXJhbGxlbEltYWdlcy5JTUdfUk1fU1RBUlRFRCksCi0JCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19STV9TVE9QUElORyksCi0JCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19STV9TVE9QUEVEKSwKLQkJZ2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMuSU1HX1JNX1NVU1BFTkRFRCksCi0JCWdldEltYWdlKFBhcmFsbGVsSW1hZ2VzLklNR19STV9FUlJPUiksCi0JfTsKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqIEdldCBpbWFnZQotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCS8qKiBHZXQgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCX0KLQkKLQkvKiogR2V0IGltYWdlIHJlZ2lzdHJ5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCQotCS8qKiBhZGQgaW1hZ2UgCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbWFnZShTdHJpbmcga2V5LCBJbWFnZSBpbWFnZSkgewotCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2UpOwotCX0KLQkvKiogYWRkIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIGltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcikgewotCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQl9Ci0JCQotCS8qKiBDcmVhdGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBpY29uVVJMCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihVUkwgaWNvblVSTCwgU3RyaW5nIGtleSwgU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChnZXRJY29uVVJMKGljb25VUkwsIG5hbWUpKTsKLQkJCWFkZEltYWdlRGVzY3JpcHRvcihrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqIEdldCBpY29uIHVybAotCSAqIEBwYXJhbSBpY29uVVJMCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0SWNvblVSTChVUkwgaWNvblVSTCwgU3RyaW5nIG5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlpZiAoaWNvblVSTCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigpOwotCQkJCi0JCXJldHVybiBuZXcgVVJMKGljb25VUkwsIG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9DaGFuZ2VTZXRBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9DaGFuZ2VTZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlYzdhMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvQ2hhbmdlU2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLlBhcmFsbGVsSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLkdvdG9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuR290b0Ryb3BEb3duQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VTZXRBY3Rpb24gZXh0ZW5kcyBHb3RvRHJvcERvd25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiQ2hhbmdlIFNldCI7Ci0gICAgCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlU2V0QWN0aW9uKEFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyB2aWV3KSB7Ci0JCXN1cGVyKG5hbWUsIHZpZXcpOwotCSAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSURfSUNPTl9DSEFOR0VTRVRfTk9STUFMKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuR290b0Ryb3BEb3duQWN0aW9uI2NyZWF0ZURyb3BEb3duTWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25NZW51KE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1ncikgewotCSAgICBTdHJpbmcgY3VySUQgPSB2aWV3LmdldEN1cnJlbnRTZXRJRCgpOyAgICAJCi0JICAgIGlmIChjdXJJRCA9PSBudWxsIHx8IGN1cklELmxlbmd0aCgpID09IDApCi0JICAgIAkJcmV0dXJuOwotCSAgICAKLQkgICAgYWRkQWN0aW9uKGRyb3BEb3duTWVudU1nciwgSUVsZW1lbnRIYW5kbGVyLlNFVF9ST09UX0lELCBJRWxlbWVudEhhbmRsZXIuU0VUX1JPT1RfSUQsIGN1cklELCBudWxsKTsKLQkJSUVsZW1lbnRIYW5kbGVyIHNldE1hbmFnZXIgPSB2aWV3LmdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQlpZiAoc2V0TWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlFbGVtZW50W10gc2V0cyA9IHNldE1hbmFnZXIuZ2V0RWxlbWVudHMoKTsKLSAgICAJaWYgKHNldHMubGVuZ3RoID4gMSkKLSAgICAJCWRyb3BEb3duTWVudU1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAJZm9yIChJRWxlbWVudCBzZXQgOiBzZXRzKSB7Ci0gICAgCQlpZiAoc2V0IGluc3RhbmNlb2YgSUVsZW1lbnRTZXQpIHsKLQkgICAgCQlpZiAoc2V0LmdldElEKCkuZXF1YWxzKElFbGVtZW50SGFuZGxlci5TRVRfUk9PVF9JRCkpCi0JICAgIAkJCWNvbnRpbnVlOwotCSAgICAJCQotCSAgICAJCWFkZEFjdGlvbihkcm9wRG93bk1lbnVNZ3IsIHNldC5nZXRJRCgpLCBzZXQuZ2V0SUQoKSwgY3VySUQsIG51bGwpOwotICAgIAkJfQotICAgIAl9CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuR290b0Ryb3BEb3duQWN0aW9uI2FkZEFjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXIsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uKE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1nciwgU3RyaW5nIGVfbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgY3VySUQsIE9iamVjdCBkYXRhKSB7Ci0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEludGVybmFsU2V0QWN0aW9uKGVfbmFtZSwgaWQsIHZpZXcsIHRoaXMpOwotCQlhY3Rpb24uc2V0Q2hlY2tlZChjdXJJRC5lcXVhbHMoaWQpKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWRyb3BEb3duTWVudU1nci5hZGQoYWN0aW9uKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJRWxlbWVudEhhbmRsZXIgc2V0TWFuYWdlciA9IHZpZXcuZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCk7Ci0JCWlmIChzZXRNYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJRWxlbWVudFtdIHNldHMgPSBzZXRNYW5hZ2VyLmdldEVsZW1lbnRzKCk7CQkKLSAgICAJZm9yIChpbnQgaT0wOyBpPHNldHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCWlmICh2aWV3LmdldEN1cnJlbnRTZXRJRCgpLmVxdWFscyhzZXRzW2ldLmdldElEKCkpKSB7Ci0gICAgCQkJaWYgKGkgKyAxIDwgc2V0cy5sZW5ndGgpCi0gICAgCQkJCXJ1bihudWxsLCAoSUVsZW1lbnRTZXQpc2V0c1tpKzFdKTsKLSAgICAJCQllbHNlCi0gICAgCQkJCXJ1bihudWxsLCAoSUVsZW1lbnRTZXQpc2V0c1swXSk7Ci0gICAgCQkJYnJlYWs7Ci0gICAgCQl9Ci0gICAgCX0KLQl9Ci0JCi0JLyoqIHJ1biBhY3Rpb24KLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMsIElFbGVtZW50U2V0IHNldCkgewotCQl2aWV3LnNlbGVjdFNldChzZXQpOwotCQkvL3ZpZXcudXBkYXRlKCk7Ci0JCXZpZXcucmVmcmVzaChmYWxzZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLkdvdG9Ecm9wRG93bkFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMsIFN0cmluZyBpZCwgT2JqZWN0IGRhdGEpIHsKLQkJSUVsZW1lbnRIYW5kbGVyIHNldE1hbmFnZXIgPSB2aWV3LmdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQlpZiAoc2V0TWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcnVuKGVsZW1lbnRzLCAoSUVsZW1lbnRTZXQpc2V0TWFuYWdlci5nZXRFbGVtZW50QnlJRChpZCkpOwotCX0KLQotCS8qKiBJbm5lciBpbnRlcm5hbCBzZXQgYWN0aW9uCi0JICogQGF1dGhvciBjbGVtZW50Ci0JICoKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEludGVybmFsU2V0QWN0aW9uIGV4dGVuZHMgR290b0FjdGlvbiB7Ci0JCXB1YmxpYyBJbnRlcm5hbFNldEFjdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgdmlldywgR290b0Ryb3BEb3duQWN0aW9uIGFjdGlvbikgewotCQkJc3VwZXIobmFtZSwgaWQsIHZpZXcsIGFjdGlvbiwgbnVsbCk7Ci0JCX0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL0NyZWF0ZVNldEFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL0NyZWF0ZVNldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjgyNmI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9DcmVhdGVTZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuUGFyYWxsZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuR290b0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5Hb3RvRHJvcERvd25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXc7Ci0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVTZXRBY3Rpb24gZXh0ZW5kcyBHb3RvRHJvcERvd25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiQ3JlYXRlIFNldCI7Ci0gICAgCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlU2V0QWN0aW9uKEFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyB2aWV3KSB7Ci0JCXN1cGVyKG5hbWUsIHZpZXcpOwotCSAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSURfSUNPTl9DUkVBVEVTRVRfTk9STUFMKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuR290b0Ryb3BEb3duQWN0aW9uI2NyZWF0ZURyb3BEb3duTWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25NZW51KE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1ncikgewotICAgIAlTdHJpbmcgY3VySUQgPSB2aWV3LmdldEN1cnJlbnRTZXRJRCgpOwotCQlJRWxlbWVudEhhbmRsZXIgc2V0TWFuYWdlciA9IHZpZXcuZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCk7Ci0JCWlmIChzZXRNYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLSAgICAJZm9yIChJRWxlbWVudCBzZXQgOiBzZXRNYW5hZ2VyLmdldEVsZW1lbnRzKCkpIHsKLSAgICAJCWFkZEFjdGlvbihkcm9wRG93bk1lbnVNZ3IsIHNldC5nZXRJRCgpLCBzZXQuZ2V0SUQoKSwgY3VySUQsIG51bGwpOwotICAgIAl9CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuR290b0Ryb3BEb3duQWN0aW9uI2FkZEFjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXIsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uKE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1nciwgU3RyaW5nIGVfbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgY3VySUQsIE9iamVjdCBkYXRhKSB7Ci0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEludGVybmFsU2V0QWN0aW9uKCJBZGQgdG8gc2V0OiAiICsgZV9uYW1lLCBpZCwgdmlldywgdGhpcyk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKCFjdXJJRC5lcXVhbHMoaWQpKTsKLQkJZHJvcERvd25NZW51TWdyLmFkZChhY3Rpb24pOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCXJ1bihlbGVtZW50cywgbnVsbCwgbnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLkdvdG9Ecm9wRG93bkFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMsIFN0cmluZyBzZXRJRCwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHZhbGlkYXRpb24oZWxlbWVudHMpKSB7Ci0JCQlmaW5hbCBJRWxlbWVudEhhbmRsZXIgc2V0TWFuYWdlciA9IHZpZXcuZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCk7Ci0JCQlpZiAoc2V0TWFuYWdlciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKHNldElEID09IG51bGwpIHsKLQkJCQlJSW5wdXRWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCWlmIChuZXdUZXh0ID09IG51bGwgfHwgbmV3VGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCXJldHVybiAiVGhpcyBmaWVsZCBjYW5ub3QgYmUgZW1wdHkuIjsKLQkJCQkJCQotCQkJCQkJaWYgKHNldE1hbmFnZXIuY29udGFpbnMobmV3VGV4dCkpCi0JCQkJCQkJcmV0dXJuICJFbnRlcmVkIHNldCBuYW1lICgiICsgbmV3VGV4dCArICIpIGlzIGFscmVhZHkgdXNlZC4iOwkJCQkJCQotCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX07Ci0JCQkJSW5wdXREaWFsb2cgaW5wdXREaWFsb2cgPSBuZXcgSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgIkNyZWF0ZSBhIG5ldyBzZXQgbmFtZSIsICJQbGVhc2UgZW50ZXIgdGhlIG5ldyBzZXQgbmFtZS4iLCAiIiwgaW5wdXRWYWxpZGF0b3IpOwotCQkJCWlmIChpbnB1dERpYWxvZy5vcGVuKCkgPT0gSW5wdXREaWFsb2cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IGlucHV0RGlhbG9nLmdldFZhbHVlKCk7Ci0JCQkJc2V0SUQgPSB2aWV3LmdldFVJTWFuYWdlcigpLmNyZWF0ZVNldChlbGVtZW50cywgbmFtZSwgbmFtZSwgc2V0TWFuYWdlcik7CQkJCQotCQkJfSBlbHNlCi0JCQkJdmlldy5nZXRVSU1hbmFnZXIoKS5hZGRUb1NldChlbGVtZW50cywgc2V0SUQsIHNldE1hbmFnZXIpOwotCQkJCi0JCQl2aWV3LnNlbGVjdFNldCgoSUVsZW1lbnRTZXQpc2V0TWFuYWdlci5nZXRFbGVtZW50QnlJRChzZXRJRCkpOwotCQkJLy9OZWVkIHRvIGRlc2VsZWN0IGFsbCBlbGVtZW50cyBtYW51YWxseQotCQkJLy92aWV3LnVwZGF0ZSgpOwotCQkJdmlldy5yZWZyZXNoKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKiogSW5uZXIgaW50ZXJuYWwgc2V0IGFjdGlvbgotCSAqIEBhdXRob3IgY2xlbWVudAotCSAqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbFNldEFjdGlvbiBleHRlbmRzIEdvdG9BY3Rpb24gewotCQlwdWJsaWMgSW50ZXJuYWxTZXRBY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcsIEdvdG9Ecm9wRG93bkFjdGlvbiBhY3Rpb24pIHsKLQkJCXN1cGVyKG5hbWUsIGlkLCB2aWV3LCBhY3Rpb24sIG51bGwpOwotCQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklEX0lDT05fQ1JFQVRFU0VUX05PUk1BTCk7Ci0JCX0JCi0JfQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9EZWxldGVTZXRBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9EZWxldGVTZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2MDkxOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvRGVsZXRlU2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuUGFyYWxsZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVTZXRBY3Rpb24gZXh0ZW5kcyBQYXJhbGxlbEFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJEZWxldGUgU2V0IjsKLQkKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBEZWxldGVTZXRBY3Rpb24oQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgdmlldyk7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQYXJhbGxlbEltYWdlcy5JRF9JQ09OX0RFTEVURVNFVF9OT1JNQUwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSUVsZW1lbnRTZXQgc2V0ID0gdmlldy5nZXRDdXJyZW50U2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCAmJiBzZXQuc2l6ZSgpID4gMCkgewotCQkJSUVsZW1lbnRIYW5kbGVyIHNldE1hbmFnZXIgPSB2aWV3LmdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQkJaWYgKHNldE1hbmFnZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChVSVV0aWxzLnNob3dRdWVzdGlvbkRpYWxvZyhuYW1lICsgIiAiICsgc2V0LmdldElEKCkgKyAiIENvbmZpcm1hdGlvbiIsICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgc2V0PyIpKSB7Ci0JCQkJSU1hbmFnZXIgdWlNYW5hZ2VyID0gdmlldy5nZXRVSU1hbmFnZXIoKTsKLQkJCQl1aU1hbmFnZXIucmVtb3ZlU2V0KHNldC5nZXRJRCgpLCBzZXRNYW5hZ2VyKTsKLQkJCQkJCQotCQkJCUlFbGVtZW50W10gc2V0cyA9IHNldE1hbmFnZXIuZ2V0RWxlbWVudHMoKTsKLQkJCQlpZiAoc2V0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCUlFbGVtZW50IGxhc3RTZXQgPSBzZXRzW3NldHMubGVuZ3RoLTFdOwotCQkJCQl2aWV3LnNlbGVjdFNldCgoSUVsZW1lbnRTZXQpc2V0TWFuYWdlci5nZXRFbGVtZW50QnlJRChsYXN0U2V0LmdldElEKCkpKTsKLQkJCQkJLy92aWV3LnVwZGF0ZSgpOwotCQkJCQl2aWV3LnJlZnJlc2goZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL0Rpc3BsYXlSdWxlckFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL0Rpc3BsYXlSdWxlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRkZDZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9EaXNwbGF5UnVsZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheVJ1bGVyQWN0aW9uIGV4dGVuZHMgUGFyYWxsZWxBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiU2hvdyBydWxlciI7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLQkKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBEaXNwbGF5UnVsZXJBY3Rpb24oQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19DSEVDS19CT1gsIHZpZXcpOwotCQlzZXRFbmFibGVkKHZpZXcuZ2V0Q3VycmVudElEKCkubGVuZ3RoKCk+MCk7Ci0JCWNoZWNrZWQgPSB2aWV3LmlzRGlzcGxheVJ1bGVyKCk7Ci0JCXNldENoZWNrZWQoY2hlY2tlZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZ2V0Vmlld1BhcnQoKS5zZXREaXNwbGF5UnVsZXIoIWNoZWNrZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9Kb2JGb2N1c0FjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL0pvYkZvY3VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmQ2ZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL0pvYkZvY3VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuUGFyYWxsZWxKb2JzVmlldzsKLQotcHVibGljIGNsYXNzIEpvYkZvY3VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIFBhcmFsbGVsSm9ic1ZpZXcgdmlldyA9IG51bGw7Ci0JCi0JcHVibGljIEpvYkZvY3VzQWN0aW9uKFBhcmFsbGVsSm9ic1ZpZXcgdmlldykgewotCQlzdXBlcigiSm9iIEZvY3VzIiwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQlzZXRUb29sVGlwVGV4dCgiRm9jdXMgT24gTmV3IEpvYiIpOwotCSAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSURfSUNPTl9KT0JfRk9DVVNfRU5BQkxFKTsKLQkgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSURfSUNPTl9KT0JfRk9DVVNfRElTQUJMRSk7Ci0JICAgIHRoaXMuc2V0Q2hlY2tlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXZpZXcuc2V0Sm9iRm9jdXMoaXNDaGVja2VkKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZW1vdmVBbGxUZXJtaW5hdGVkQWN0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvUmVtb3ZlQWxsVGVybWluYXRlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM5ZDU3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZW1vdmVBbGxUZXJtaW5hdGVkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuUGFyYWxsZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1hbmFnZXJzLkpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUFsbFRlcm1pbmF0ZWRBY3Rpb24gZXh0ZW5kcyBQYXJhbGxlbEFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJSZW1vdmUgQWxsIFRlcm1pbmF0ZWQiOwotCQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIFJlbW92ZUFsbFRlcm1pbmF0ZWRBY3Rpb24oQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgdmlldyk7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQYXJhbGxlbEltYWdlcy5JRF9JQ09OX1JFTU9WRUFMTFRFUk1JTkFURURfTk9STUFMKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkoKEpvYk1hbmFnZXIpIHZpZXcuZ2V0VUlNYW5hZ2VyKCkpLnJlbW92ZUFsbFN0b3BwZWRKb2JzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1JlbW92ZUVsZW1lbnRBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZW1vdmVFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmU0NjAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1JlbW92ZUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRWxlbWVudEFjdGlvbiBleHRlbmRzIFBhcmFsbGVsQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIlJlbW92ZSBFbGVtZW50cyI7Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlRWxlbWVudEFjdGlvbihBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklEX0lDT05fREVMRVRFRUxFTUVOVF9OT1JNQUwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykgewotCQlpZiAodmFsaWRhdGlvbihlbGVtZW50cykpIHsKLQkJCUlFbGVtZW50U2V0IHNldCA9IHZpZXcuZ2V0Q3VycmVudFNldCgpOwotCQkJaWYgKHNldC5zaXplKCkgPT0gZWxlbWVudHMubGVuZ3RoKSB7Ci0JCQkJY2FsbERlbGV0ZUdyb3VwQWN0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCUlFbGVtZW50SGFuZGxlciBzZXRNYW5hZ2VyID0gdmlldy5nZXRDdXJyZW50RWxlbWVudEhhbmRsZXIoKTsKLQkJCQlpZiAoc2V0TWFuYWdlciA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoVUlVdGlscy5zaG93UXVlc3Rpb25EaWFsb2coIlJlbW92ZSBDb25maXJtYXRpb24iLCAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSAoIiArIGVsZW1lbnRzLmxlbmd0aCArICIpIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQ/IikpCXsJCQkKLQkJCQkJdmlldy5nZXRVSU1hbmFnZXIoKS5yZW1vdmVGcm9tU2V0KGVsZW1lbnRzLCBzZXQuZ2V0SUQoKSwgc2V0TWFuYWdlcik7Ci0JCQkJCXZpZXcuc2VsZWN0U2V0KChJRWxlbWVudFNldClzZXRNYW5hZ2VyLmdldEVsZW1lbnRCeUlEKHNldC5nZXRJRCgpKSk7Ci0JCQkJCXZpZXcudXBkYXRlVGl0bGUoKTsKLQkJCQkJdmlldy5yZWZyZXNoKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKiogQ2FsbCBkZWxldGUgZ3JvdXAgYWN0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGxEZWxldGVHcm91cEFjdGlvbigpIHsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSB2aWV3LmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBtYW5hZ2VyLmZpbmQoRGVsZXRlU2V0QWN0aW9uLm5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0paXRlbSkuZ2V0QWN0aW9uKCkucnVuKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvUmVtb3ZlU2VsZWN0ZWRKb2JBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZW1vdmVTZWxlY3RlZEpvYkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzEwOGRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZW1vdmVTZWxlY3RlZEpvYkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubWFuYWdlcnMuSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuUGFyYWxsZWxKb2JzVmlldzsKLQotcHVibGljIGNsYXNzIFJlbW92ZVNlbGVjdGVkSm9iQWN0aW9uIGV4dGVuZHMgUGFyYWxsZWxBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiUmVtb3ZlIFNlbGVjdGVkIEpvYiI7Ci0JQWJzdHJhY3RUYWJsZVZpZXdlciBqb2JWaWV3ZXI7Ci0KLQlwdWJsaWMgUmVtb3ZlU2VsZWN0ZWRKb2JBY3Rpb24oQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcsCi0JCQlBYnN0cmFjdFRhYmxlVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkJam9iVmlld2VyID0gdmlld2VyOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSURfSUNPTl9SRU1PVkVURVJNSU5BVEVEX05PUk1BTCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9iIGZyb20gdGhlIGpvYnMgdmlldy4KLQkgKiBAcGFyYW0gZWxlbWVudHMgLSBzaG91bGQgY29udGFpbiB0aGUgc2V0IG9mIHNlbGVjdGVkIGVsZW1lbnRzIGF0IHRoZSB0aW1lIHRoZSBhY3Rpb24gd2FzIGludm9rZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkJSVBKb2Igc2VsZWN0ZWRKb2I7Ci0KLQkJc2VsZWN0aW9uID0gam9iVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXNlbGVjdGVkSm9iID0gKElQSm9iKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCSgoSm9iTWFuYWdlcikgdmlldy5nZXRVSU1hbmFnZXIoKSkucmVtb3ZlSm9iKHNlbGVjdGVkSm9iKTsKLQkJCSgoUGFyYWxsZWxKb2JzVmlldykgdmlldykuY2hhbmdlSm9iUmVmcmVzaChudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1Nob3dMZWdlbmRBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9TaG93TGVnZW5kQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjFiZDMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1Nob3dMZWdlbmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5MZWdlbmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBTaG93TGVnZW5kQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCW5ldyBMZWdlbmREaWFsb2cod2luZG93LmdldFNoZWxsKCkpLm9wZW4oKTsKLQl9Ci0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9CQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0JCi19Ci0KLS8qCi1wdWJsaWMgY2xhc3MgU2hvd0xlZ2VuZEFjdGlvbiBleHRlbmRzIFBhcmFsbGVsQWN0aW9uIHsKLQlwdWJsaWMgU2hvd0xlZ2VuZEFjdGlvbihWaWV3UGFydCB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoYm9vbGVhbiBpc0VuYWJsZSkgewotCSAgICB0aGlzLnNldFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJTaG93TGVnZW5kQWN0aW9uLnRleHQiKSk7Ci0JICAgIHRoaXMuc2V0VG9vbFRpcFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJTaG93TGVnZW5kQWN0aW9uLnRvb2x0aXAiKSk7Ci0JICAgIHRoaXMuc2V0SW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLmdldERlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSU1HX1NIT1dMRUdFTkRfQUNUSU9OX05PUk1BTCkpOwotCSAgICB0aGlzLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLmdldERlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSU1HX1NIT1dMRUdFTkRfQUNUSU9OX0RJU0FCTEUpKTsKLQkgICAgdGhpcy5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihQYXJhbGxlbEltYWdlcy5nZXREZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklNR19TSE9XTEVHRU5EX0FDVElPTl9IT1ZFUikpOwotCSAgICB0aGlzLnNldEVuYWJsZWQoZ2V0TGF1bmNoTWFuYWdlcigpLmlzTVBJUnVuaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGVnZW5kRGlhbG9nIGxkID0gbmV3IExlZ2VuZERpYWxvZyhnZXRTaGVsbCgpKTsKLQkJbGQub3BlbigpOwotCX0KLX0KLSovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvVGVybWluYXRlSm9iQWN0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvVGVybWluYXRlSm9iQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmJmZmEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1Rlcm1pbmF0ZUpvYkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLlBhcmFsbGVsSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuVUlNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2Vycy5BYnN0cmFjdFVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubWFuYWdlcnMuSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVybWluYXRlSm9iQWN0aW9uIGV4dGVuZHMgUGFyYWxsZWxBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiVGVybWluYXRlIEpvYiI7Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgVGVybWluYXRlSm9iQWN0aW9uKEFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyB2aWV3KSB7Ci0JCXN1cGVyKG5hbWUsIHZpZXcpOwotCSAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGFyYWxsZWxJbWFnZXMuSURfSUNPTl9URVJNSU5BVEVfSk9CX05PUk1BTCk7Ci0JICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklEX0lDT05fVEVSTUlOQVRFX0pPQl9ESVNBQkxFKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJTWFuYWdlciBtYW5hZ2VyID0gdmlldy5nZXRVSU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFVJTWFuYWdlcikgewotCQkJYm9vbGVhbiB0ZXJtaW5hdGUgPSBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKGdldFNoZWxsKCksCi0JCQkJCVVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiVGVybWluYXRlSm9iQWN0aW9uLlRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJUZXJtaW5hdGVKb2JBY3Rpb24uUXVlc3Rpb24iKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgKChKb2JNYW5hZ2VyKW1hbmFnZXIpLmdldEpvYigpLmdldE5hbWUoKQotCQkJCQkrIFVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiVGVybWluYXRlSm9iQWN0aW9uLkNvbmZpcm0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh0ZXJtaW5hdGUpIHsKLQkJCQl0cnkgewotCQkJCQkoKEpvYk1hbmFnZXIpbWFuYWdlcikudGVybWluYXRlSm9iKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiVGVybWluYXRlIEpvYiBFcnJvciIsICJDYW5ub3QgdGVybWluYXRlIHRoZSBqb2IuIiwgZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1Rlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNTdkYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FjdGlvbnMvVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBVbml2ZXJzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlVJTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubWFuYWdlcnMuQWJzdHJhY3RVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1hbmFnZXJzLkpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkpvYnNMaXN0VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JSm9ic0xpc3RWaWV3IHZpZXc7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24oSm9ic0xpc3RWaWV3IHZpZXcpIHsKLQkJc3VwZXIoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJUZXJtaW5hdGVKb2JGcm9tTGlzdEFjdGlvbi5idXR0b24udGV4dCIpLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0VG9vbFRpcFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJUZXJtaW5hdGVKb2JGcm9tTGlzdEFjdGlvbi5idXR0b24udG9vbHRpcCIpKTsgLy8iVGVybWluYXRlIGFsbCBzZWxlY3RlZCBqb2JzIik7Ci0JCXNldEVuYWJsZWQoZmFsc2UpOwotCQlzZXRJZChVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlRlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uLmJ1dHRvbi50ZXh0IikpOwotCi0JCXRoaXMudmlldyA9IHZpZXc7Ci0KLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklEX0lDT05fVEVSTUlOQVRFX0pPQl9OT1JNQUwpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihQYXJhbGxlbEltYWdlcy5JRF9JQ09OX1RFUk1JTkFURV9KT0JfRElTQUJMRSk7Ci0JCQotCQl2aWV3LmdldFZpZXdlcigpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCS8vIFNhbml0eSBjaGVjayBvdmVyIHZpZXdlciBkYXRhCi0JCQkJaWYoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQotCQkJCQlpZihzZWwuaXNFbXB0eSgpKQotCQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJT2JqZWN0IFtdIHNlbEpvYnMgPSBzZWwudG9BcnJheSgpOwotCi0JCQkJCQkvLyBPbmx5IGVuYWJsZXMgaWYgYXQgbGVhc3Qgb25lIGlzIHJ1bm5pbmcKLQkJCQkJCWJvb2xlYW4gcnVubmluZyA9IGZhbHNlOwotCQkJCQkJZm9yKGludCBpPTA7IGkgPCBzZWxKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUlQSm9iIGpvYiA9IChJUEpvYilzZWxKb2JzW2ldOwotCQkJCQkJCQkKLQkJCQkJCQkJaWYoIWpvYi5pc1Rlcm1pbmF0ZWQoKSkKLQkJCQkJCQkJCXJ1bm5pbmcgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZihydW5uaW5nKQotCQkJCQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0vKgkJdmlldy5nZXRWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCS8vIFNhbml0eSBjaGVjayBvdmVyIHZpZXdlciBkYXRhCi0JCQkJaWYoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQotCQkJCQlpZihzZWwuaXNFbXB0eSgpKQotCQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJT2JqZWN0IFtdIHNlbEpvYnMgPSBzZWwudG9BcnJheSgpOwotCi0JCQkJCQkvLyBPbmx5IGVuYWJsZXMgaWYgYXQgbGVhc3Qgb25lIGlzIHJ1bm5pbmcKLQkJCQkJCWJvb2xlYW4gcnVubmluZyA9IGZhbHNlOwotCQkJCQkJZm9yKGludCBpPTA7IGkgPCBzZWxKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUlQSm9iIGpvYiA9IChJUEpvYilzZWxKb2JzW2ldOwotCQkJCQkJCQkKLQkJCQkJCQkJaWYoIWpvYi5pc1Rlcm1pbmF0ZWQoKSkKLQkJCQkJCQkJCXJ1bm5pbmcgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZihydW5uaW5nKQotCQkJCQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsKLSovCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRlcm1pbmF0ZUpvYlN0YXRlKCkgewotCQkvLyBTYW5pdHkgY2hlY2sgb3ZlciB2aWV3ZXIgZGF0YQotCQlpZih2aWV3LmdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil2aWV3LmdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCi0JCQlpZihzZWwuaXNFbXB0eSgpKQotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWxzZSB7Ci0JCQkJT2JqZWN0IFtdIHNlbEpvYnMgPSBzZWwudG9BcnJheSgpOwotCi0JCQkJLy8gT25seSBlbmFibGVzIGlmIGF0IGxlYXN0IG9uZSBpcyBydW5uaW5nCi0JCQkJYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7Ci0JCQkJZm9yKGludCBpPTA7IGkgPCBzZWxKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJUEpvYiBqb2IgPSAoSVBKb2Ipc2VsSm9ic1tpXTsKLQkJCQkJCQotCQkJCQkJaWYoIWpvYi5pc1Rlcm1pbmF0ZWQoKSkKLQkJCQkJCQlydW5uaW5nID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYocnVubmluZykKLQkJCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCX0JCQotCQotCS8qKiBHZXQgU2hlbGwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdmlldy5nZXRWaWV3U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlUYWJsZVZpZXdlciB2aWV3ZXIgPSB2aWV3LmdldFZpZXdlcigpOwotCi0JCS8vIFNhbml0eSBjaGVjayBvdmVyIHZpZXdlciBkYXRhCi0JCWlmKHZpZXdlci5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCQlJTW9kZWxNYW5hZ2VyIG1tID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJCS8vIE11c3Qgc2VsZWN0IGF0IGxlYXN0IG9uZSBpdGVtCi0JCQlpZihzZWwuc2l6ZSgpID09IDApCi0JCQkJcmV0dXJuOwotCi0JCQlPYmplY3QgW10gc2VsSm9icyA9IHNlbC50b0FycmF5KCk7Ci0KLQkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgc2VsZWN0ZWQgaXRlbXMsIGtpbGxpbmcgdGhlIHJlc3BlY3RpdmUgam9icwotCQkJZm9yKGludCBpPTA7IGkgPCBzZWxKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVBKb2Igam9iID0gKElQSm9iKXNlbEpvYnNbaV07Ci0JCQkJCQotCQkJCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gam9iLmdldFF1ZXVlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJCWlmKCFqb2IuaXNUZXJtaW5hdGVkKCkpCi0JCQkJCQlybS50ZXJtaW5hdGVKb2Ioam9iKTsKLQkJCQkJLy8gVE9ETzogTG9vayBmb3Igam9iIGNoYW5nZSBldmVudCB0byB3YWl0IGZvciBqb2JzIHRvIGJlIGZpbmlzaGVkLgotCQkJCQl2aWV3ZXIudXBkYXRlKHNlbEpvYnNbaV0sIG51bGwpOwotCQkJCQkKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9FcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlRlcm1pbmF0ZSBKb2IgRXJyb3IiLCAiQ2Fubm90IHRlcm1pbmF0ZSB0aGUgam9iLiIsIGUuZ2V0U3RhdHVzKCkpOwotCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJUZXJtaW5hdGVKb2JGcm9tTGlzdEFjdGlvbi5tc2dib3gudGl0bGUiKSwKLQkJCQkJCQlVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlRlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uLm1zZ2JveC5tZXNzYWdlIiksCi0JCQkJCQkJZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQotCi0JCX0KLQl9Ci0KLQotCS8qLy9JTWFuYWdlciBtYW5hZ2VyID0gdmlldy5nZXRVSU1hbmFnZXIoKTsKLQkJLy9pZiAobWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0VUlNYW5hZ2VyKSB7Ci0JCQlib29sZWFuIHRlcm1pbmF0ZSA9IE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oZ2V0U2hlbGwoKSwKLQkJCQkJVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJUZXJtaW5hdGVKb2JBY3Rpb24uVGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlRlcm1pbmF0ZUpvYkFjdGlvbi5RdWVzdGlvbiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8rICgoSm9iTWFuYWdlciltYW5hZ2VyKS5nZXRKb2IoKS5nZXROYW1lKCkKLQkJCQkJKyBVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlRlcm1pbmF0ZUpvYkFjdGlvbi5Db25maXJtIikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodGVybWluYXRlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChKb2JNYW5hZ2VyKW1hbmFnZXIpLnRlcm1pbmF0ZUpvYigpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlRlcm1pbmF0ZSBKb2IgRXJyb3IiLCAiQ2Fubm90IHRlcm1pbmF0ZSB0aGUgam9iLiIsIGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0qLwotCS8vfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1pvb21JbkFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1pvb21JbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI4YzkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9ab29tSW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbFNldFZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFpvb21JbkFjdGlvbiBleHRlbmRzIFBhcmFsbGVsQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIlpvb20gaW4iOwotCQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIFpvb21JbkFjdGlvbihBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklEX0lDT05fWk9PTUlOX05PUk1BTCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7fQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIEFic3RyYWN0UGFyYWxsZWxTZXRWaWV3KSB7Ci0JCQkoKEFic3RyYWN0UGFyYWxsZWxTZXRWaWV3KXZpZXcpLnpvb21JbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1pvb21PdXRBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWN0aW9ucy9ab29tT3V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjZhMTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hY3Rpb25zL1pvb21PdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbFNldFZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFpvb21PdXRBY3Rpb24gZXh0ZW5kcyBQYXJhbGxlbEFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJab29tIG91dCI7Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgWm9vbU91dEFjdGlvbihBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLklEX0lDT05fWk9PTU9VVF9OT1JNQUwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBBYnN0cmFjdFBhcmFsbGVsU2V0VmlldykgewotCQkJKChBYnN0cmFjdFBhcmFsbGVsU2V0Vmlldyl2aWV3KS56b29tT3V0KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1BFbGVtZW50UHJvcGVydHlTb3VyY2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUEVsZW1lbnRQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk2NDcwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUEVsZW1lbnRQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgUEVsZW1lbnRQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSB7Ci0KLQlwcml2YXRlIGZpbmFsIElQRWxlbWVudCBwZWxlbWVudDsKLQlwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHlEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEZXNjcmlwdG9yPigpOwotCi0JcHVibGljIFBFbGVtZW50UHJvcGVydHlTb3VyY2UoSVBFbGVtZW50IHBlbGVtZW50KSB7Ci0JCXRoaXMucGVsZW1lbnQgPSBwZWxlbWVudDsKLQkJSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gYXR0ckRlZnMgPSBwZWxlbWVudC5nZXRBdHRyaWJ1dGVLZXlzKCk7Ci0gICAgICAgIFN0cmluZ1tdIGtleXMgPSBuZXcgU3RyaW5nW2F0dHJEZWZzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckRlZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCWlmIChhdHRyRGVmc1tpXS5nZXREaXNwbGF5KCkpIHsKLSAgICAgICAgCQlrZXlzW2ldID0gYXR0ckRlZnNbaV0uZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBhZGREZXNjcmlwdG9yKG5ldyBQcm9wZXJ0eURlc2NyaXB0b3Ioa2V5c1tpXSwgYXR0ckRlZnNbaV0uZ2V0TmFtZSgpKSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvcnMudG9BcnJheShuZXcgSVByb3BlcnR5RGVzY3JpcHRvclswXSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotICAgICAgICBmaW5hbCBJQXR0cmlidXRlPD8sID8sID8+IGF0dHJpYnV0ZSA9IHBlbGVtZW50LmdldEF0dHJpYnV0ZShpZC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgIAlyZXR1cm4gYXR0cmlidXRlLmdldFZhbHVlQXNTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdG9yKFByb3BlcnR5RGVzY3JpcHRvciBkZXNjKSB7Ci0JCWRlc2NyaXB0b3JzLmFkZChkZXNjKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUEpvYldvcmtiZW5jaEFkYXB0ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUEpvYldvcmtiZW5jaEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2YTU0Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1BKb2JXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFBKb2JXb3JrYmVuY2hBZGFwdGVyIGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQSm9iIGpvYiA9IChJUEpvYikgb2JqZWN0OwotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGdldEltYWdlKGpvYik7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEltYWdlSW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gam9iCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoSVBKb2Igam9iKSB7Ci0JCXJldHVybiBQYXJhbGxlbEltYWdlcy5qb2JJbWFnZXNbam9iLmdldFN0YXRlKCkub3JkaW5hbCgpXVtqb2IuaXNEZWJ1ZygpID8gMSA6IDBdOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9QTWFjaGluZVdvcmtiZW5jaEFkYXB0ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUE1hY2hpbmVXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjdkM2QuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9QTWFjaGluZVdvcmtiZW5jaEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFBNYWNoaW5lV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQTWFjaGluZSBtYWNoaW5lID0gKElQTWFjaGluZSkgb2JqZWN0OwotCQlyZXR1cm4gbmV3IEltYWdlSW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLm1hY2hpbmVJbWFnZXNbbWFjaGluZS5nZXRTdGF0ZSgpLm9yZGluYWwoKV0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJUE1hY2hpbmUgbWFjaGluZSA9IChJUE1hY2hpbmUpIG9iamVjdDsKLQkJcmV0dXJuIG1hY2hpbmUuZ2V0Tm9kZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUE5vZGVXb3JrYmVuY2hBZGFwdGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1BOb2RlV29ya2JlbmNoQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWUyMWJmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUE5vZGVXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuUGFyYWxsZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLkltYWdlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFBOb2RlV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlJUE5vZGUgbm9kZSA9IChJUE5vZGUpIG9iamVjdDsKLQkJcmV0dXJuIG5ldyBJbWFnZUltYWdlRGVzY3JpcHRvcihQYXJhbGxlbEltYWdlcy5ub2RlSW1hZ2VzW25vZGUuZ2V0U3RhdGUoKS5vcmRpbmFsKCldWzBdKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUFF1ZXVlV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9QUXVldWVXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmQ1ZGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9QUXVldWVXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgUFF1ZXVlV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJUFF1ZXVlIHF1ZXVlID0gKElQUXVldWUpIG9iamVjdDsKLQkJcmV0dXJuIHF1ZXVlLmdldEpvYnMoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9Qcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1Byb3BlcnR5QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0M2M4NC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1Byb3BlcnR5QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBJUHJvcGVydHlTb3VyY2UuY2xhc3MpIHsKLQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1hbmFnZXJQcm9wZXJ0eVNvdXJjZSgoSVJlc291cmNlTWFuYWdlcilhZGFwdGFibGVPYmplY3QpOwotCQkJfQotCQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElQRWxlbWVudCkgewotCQkJCXJldHVybiBuZXcgUEVsZW1lbnRQcm9wZXJ0eVNvdXJjZSgoSVBFbGVtZW50KWFkYXB0YWJsZU9iamVjdCk7Ci0JCQl9Ci0JCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbmV3IFBFbGVtZW50UHJvcGVydHlTb3VyY2UoKChJRWxlbWVudClhZGFwdGFibGVPYmplY3QpLmdldFBFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10ge0lQcm9wZXJ0eVNvdXJjZS5jbGFzc307Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1Jlc291cmNlTWFuYWdlclByb3BlcnR5U291cmNlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2FkYXB0ZXJzL1Jlc291cmNlTWFuYWdlclByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDgzNDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9SZXNvdXJjZU1hbmFnZXJQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJQcm9wZXJ0eVNvdXJjZSBleHRlbmRzIFBFbGVtZW50UHJvcGVydHlTb3VyY2UgewotCi0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXJQcm9wZXJ0eVNvdXJjZShJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlzdXBlcihyZXNvdXJjZU1hbmFnZXIpOwotCQkKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7Ci0JCWFkZERlc2NyaXB0b3IobmV3IFByb3BlcnR5RGVzY3JpcHRvcigicm0ubWFjaGluZXMiLCAibnVtIG1hY2hpbmVzIikpOwotCQlhZGREZXNjcmlwdG9yKG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoInJtLnF1ZXVlcyIsICJudW0gcXVldWVzIikpOwotCQkKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHN1cGVyLmdldFByb3BlcnR5VmFsdWUoaWQpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCWlmICgicm0ubWFjaGluZXMiLmVxdWFscyhpZCkpIHsKLQkJCWZpbmFsIElQTWFjaGluZVtdIG1hY2hpbmVzID0gcmVzb3VyY2VNYW5hZ2VyLmdldE1hY2hpbmVzKCk7Ci0JCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyhtYWNoaW5lcy5sZW5ndGgpOwotCQl9Ci0JCWlmICgicm0ucXVldWVzIi5lcXVhbHMoaWQpKSB7Ci0JCQlmaW5hbCBJUFF1ZXVlW10gcXVldWVzID0gcmVzb3VyY2VNYW5hZ2VyLmdldFF1ZXVlcygpOwotCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcocXVldWVzLmxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvUmVzb3VyY2VNYW5hZ2VyV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9SZXNvdXJjZU1hbmFnZXJXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTZhNDEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9SZXNvdXJjZU1hbmFnZXJXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5QYXJhbGxlbEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlVJTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJXb3JrYmVuY2hBZGFwdGVyIGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciB7Ci0KLQlwcml2YXRlIGNsYXNzIENoaWxkQ29udGFpbmVyIGV4dGVuZHMgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCi0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHBhcmVudDsKLQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgZmluYWwgT2JqZWN0W10gY2hpbGRyZW47Ci0KLQkJcHVibGljIENoaWxkQ29udGFpbmVyKE9iamVjdCBwYXJlbnQsIFN0cmluZyBuYW1lLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBDbGFzcyBhZGFwdGVyKSB7Ci0JCQlpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcyB8fCBhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyMi5jbGFzcykgewotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uY2xvbmUoKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCUlSZXNvdXJjZU1hbmFnZXIgcm0gPSBnZXRSZXNvdXJjZU1hbmFnZXIocGFyZW50RWxlbWVudCk7Ci0JCWlmIChybSAhPSBudWxsKSB7Ci0JCQlpZiAocm0uZ2V0U3RhdGUoKSAhPSBSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUQVJURUQpIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQkJCUlQTWFjaGluZVtdIG1hY2hpbmVzID0gcm0uZ2V0TWFjaGluZXMoKTsKLQkJCUlQUXVldWVbXSBxdWV1ZXMgPSBybS5nZXRRdWV1ZXMoKTsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10gewotCQkJCQltYWtlQ2hpbGRDb250YWluZXIocGFyZW50RWxlbWVudCwKLQkJCQkJCQlVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc291cmNlTWFuYWdlclZpZXcuTWFjaGluZXMiKSwgbWFjaGluZXMpLCAvLyROT04tTkxTLTEkCi0JCQkJCW1ha2VDaGlsZENvbnRhaW5lcihwYXJlbnRFbGVtZW50LAotCQkJCQkJCVVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzb3VyY2VNYW5hZ2VyVmlldy5RdWV1ZXMiKSwgcXVldWVzKSB9OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gbnVsbDsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlybSA9IChJUmVzb3VyY2VNYW5hZ2VyKSAoKElBZGFwdGFibGUpIHBhcmVudEVsZW1lbnQpLmdldEFkYXB0ZXIoSVJlc291cmNlTWFuYWdlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHJtOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlIHN0YXR1cyA9ICgoSVJlc291cmNlTWFuYWdlcikgb2JqZWN0KS5nZXRTdGF0ZSgpOwotCQlyZXR1cm4gbmV3IEltYWdlSW1hZ2VEZXNjcmlwdG9yKFBhcmFsbGVsSW1hZ2VzLnJtSW1hZ2VzW3N0YXR1cy5vcmRpbmFsKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWZpbmFsIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJlc291cmNlTWFuYWdlciA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCkgb2JqZWN0OwotCQlmaW5hbCBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQlmaW5hbCBTdHJpbmcgcmVzb3VyY2VNYW5hZ2VySWQgPSByZXNvdXJjZU1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlTWFuYWdlcklkKCk7Ci0JCWlmIChyZXNvdXJjZU1hbmFnZXJJZCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc291cmNlTWFuYWdlci5nZXROYW1lKCk7Ci0JCUlSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkgPSBtb2RlbE1hbmFnZXIuZ2V0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSgKLQkJCQlyZXNvdXJjZU1hbmFnZXJJZCk7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXIuZ2V0TmFtZSgpICsgIiAoIiArIGZhY3RvcnkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJtID0gKElSZXNvdXJjZU1hbmFnZXJDb250cm9sKSBnZXRSZXNvdXJjZU1hbmFnZXIob2JqZWN0KTsKLQkJaWYgKHJtICE9IG51bGwpIHsKLQkJCXJldHVybiBybS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENoaWxkQ29udGFpbmVyIG1ha2VDaGlsZENvbnRhaW5lcihPYmplY3QgcGFyZW50LCBTdHJpbmcgbmFtZSwKLQkJCWZpbmFsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCWZpbmFsIENoaWxkQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBDaGlsZENvbnRhaW5lcihwYXJlbnQsIG5hbWUsCi0JCQkJY2hpbGRyZW4pOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9Vbml2ZXJzZVdvcmtiZW5jaEFkYXB0ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvVW5pdmVyc2VXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTgxOGQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9Vbml2ZXJzZVdvcmtiZW5jaEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFVuaXZlcnNlV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIFdvcmtiZW5jaEFkYXB0ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQVW5pdmVyc2UgdW5pdmVyc2UgPSAoSVBVbml2ZXJzZSkgb2JqZWN0OwotCQlyZXR1cm4gdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9Xb3JrYmVuY2hBZGFwdGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvYWRhcHRlcnMvV29ya2JlbmNoQWRhcHRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTk3ODAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9hZGFwdGVycy9Xb3JrYmVuY2hBZGFwdGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIyOwotCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQWRhcHRlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFVuaXZlcnNlV29ya2JlbmNoQWRhcHRlciBVTklWRVJTRV9XT1JLQkVOQ0hfQURBUFRFUiA9Ci0JCW5ldyBVbml2ZXJzZVdvcmtiZW5jaEFkYXB0ZXIoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZU1hbmFnZXJXb3JrYmVuY2hBZGFwdGVyIFJFU09VUkNFX01BTkFHRVJfV09SS0JFTkNIX0FEQVBURVIgPQotCQluZXcgUmVzb3VyY2VNYW5hZ2VyV29ya2JlbmNoQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBNYWNoaW5lV29ya2JlbmNoQWRhcHRlciBNQUNISU5FX1dPUktCRU5DSF9BREFQVEVSID0KLQkJbmV3IFBNYWNoaW5lV29ya2JlbmNoQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBRdWV1ZVdvcmtiZW5jaEFkYXB0ZXIgUVVFVUVfV09SS0JFTkNIX0FEQVBURVIgPQotCQluZXcgUFF1ZXVlV29ya2JlbmNoQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBOb2RlV29ya2JlbmNoQWRhcHRlciBOT0RFX1dPUktCRU5DSF9BREFQVEVSID0KLQkJbmV3IFBOb2RlV29ya2JlbmNoQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBKb2JXb3JrYmVuY2hBZGFwdGVyIEpPQl9XT1JLQkVOQ0hfQURBUFRFUiA9Ci0JCW5ldyBQSm9iV29ya2JlbmNoQWRhcHRlcigpOwotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIAotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcyB8fCBhZGFwdGVyVHlwZSA9PSBJV29ya2JlbmNoQWRhcHRlcjIuY2xhc3MpIHsKLQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUFVuaXZlcnNlKSB7Ci0JCQkJcmV0dXJuIFVOSVZFUlNFX1dPUktCRU5DSF9BREFQVEVSOwotCQkJfQotCQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQlyZXR1cm4gUkVTT1VSQ0VfTUFOQUdFUl9XT1JLQkVOQ0hfQURBUFRFUjsKLQkJCX0KLQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUE1hY2hpbmUpIHsKLQkJCQlyZXR1cm4gTUFDSElORV9XT1JLQkVOQ0hfQURBUFRFUjsKLQkJCX0KLQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUE5vZGUpIHsKLQkJCQlyZXR1cm4gTk9ERV9XT1JLQkVOQ0hfQURBUFRFUjsKLQkJCX0KLQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUFF1ZXVlKSB7Ci0JCQkJcmV0dXJuIFFVRVVFX1dPUktCRU5DSF9BREFQVEVSOwotCQkJfQotCQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElQSm9iKSB7Ci0JCQkJcmV0dXJuIEpPQl9XT1JLQkVOQ0hfQURBUFRFUjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHtJV29ya2JlbmNoQWRhcHRlci5jbGFzcywgSVdvcmtiZW5jaEFkYXB0ZXIyLmNsYXNzfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvaG92ZXIvRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTY3YjkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5ob3ZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuaG92ZXIuSUljb25JbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wgaW1wbGVtZW50cyBJSWNvbkluZm9ybWF0aW9uQ29udHJvbCwgRGlzcG9zZUxpc3RlbmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEVMTF9ERUZBVUxUX1dJRFRIID0gNDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIRUxMX0RFRkFVTFRfSEVJR0hUID0gMjAwOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgSUluZm9ybWF0aW9uUHJlc2VudGVyIHsKLQkJLyoqIFVwZGF0ZSBwcmVzZW50YXRpb24KLQkJICogQHBhcmFtIGRpc3BsYXkKLQkJICogQHBhcmFtIGhvdmVySW5mbwotCQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JCSAqIEBwYXJhbSBtYXhXaWR0aAotCQkgKiBAcGFyYW0gbWF4SGVpZ2h0Ci0JCSAqIEByZXR1cm4gZm9ybWF0dGVkIHRleHQKLQkJICovCi0JCVN0cmluZyB1cGRhdGVQcmVzZW50YXRpb24oRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgaG92ZXJJbmZvLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiwgaW50IG1heFdpZHRoLCBpbnQgbWF4SGVpZ2h0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9VVEVSX0JPUkRFUj0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ORVJfQk9SREVSPSAxOwotCXByaXZhdGUgU2hlbGwgZlNoZWxsOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIElJbmZvcm1hdGlvblByZXNlbnRlciBmUHJlc2VudGVyOwotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBmUHJlc2VudGF0aW9uPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwotCXByaXZhdGUgaW50IGZNYXhXaWR0aD0gLTE7Ci0JcHJpdmF0ZSBpbnQgZk1heEhlaWdodD0gLTE7Ci0JcHJpdmF0ZSBGb250IGZIZWFkZXJUZXh0Rm9udDsKLQlwcml2YXRlIExhYmVsIGhlYWRlckZpZWxkID0gbnVsbDsKLQlwcml2YXRlIFNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0RldGFpbHMgPSBmYWxzZTsKLQkKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHNob3dEZXRhaWxzCi0JICovCi0JcHVibGljIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBib29sZWFuIHNob3dEZXRhaWxzKSB7Ci0JCXRoaXMocGFyZW50LCBzaG93RGV0YWlscywgU1dULk5PTkUgfCBTV1QuV1JBUCk7Ci0JfQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc2hvd0RldGFpbHMKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIGJvb2xlYW4gc2hvd0RldGFpbHMsIGludCBzdHlsZSkgewotCQl0aGlzKHBhcmVudCwgU1dULlRPT0wgfCBTV1QuTk9fVFJJTSwgc2hvd0RldGFpbHMsIHN0eWxlLCBuZXcgSWNvbkhvdmVyUHJlc2VudGVyKGZhbHNlKSwgZmFsc2UpOwotCX0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBmYWxzZSk7Ci0JfQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiBAcGFyYW0gcHJlc2VudGVyCi0JICovCi0JcHVibGljIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIsIGJvb2xlYW4gZW5hYmxlS2V5KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuVE9PTCB8IFNXVC5OT19UUklNLCB0cnVlLCBzdHlsZSwgcHJlc2VudGVyLCBlbmFibGVLZXkpOwotCX0KLQkKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHNoZWxsU3R5bGUKLQkgKiBAcGFyYW0gc2hvd0RldGFpbHMKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiBAcGFyYW0gcHJlc2VudGVyCi0JICovCi0JcHVibGljIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBpbnQgc2hlbGxTdHlsZSwgYm9vbGVhbiBzaG93RGV0YWlscywgaW50IHN0eWxlLCBJSW5mb3JtYXRpb25QcmVzZW50ZXIgcHJlc2VudGVyLCBib29sZWFuIGVuYWJsZUtleSkgewotCQl0aGlzLnNob3dEZXRhaWxzID0gc2hvd0RldGFpbHM7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0OwotCQlHcmlkRGF0YSBnZDsKLQotCQlmU2hlbGw9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5OT19GT0NVUyB8IFNXVC5PTl9UT1AgfCBzaGVsbFN0eWxlKTsKLQkJRGlzcGxheSBkaXNwbGF5PSBmU2hlbGwuZ2V0RGlzcGxheSgpOwotCQlmU2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQkKLQkJbGF5b3V0PSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWludCBib3JkZXI9ICgoc2hlbGxTdHlsZSAmIFNXVC5OT19UUklNKSA9PSAwKSA/IDAgOiBPVVRFUl9CT1JERVI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IGJvcmRlcjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSBib3JkZXI7Ci0JCWZTaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZlNoZWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKGZTaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJc2Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7Ci0JCWxheW91dD0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSBzaG93RGV0YWlscz8xMDowOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCWNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCSAgICAKLQkJc2Muc2V0Q29udGVudChjb21wb3NpdGUpOwotCQlzYy5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkgICAgc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkgICAgc2Muc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnModHJ1ZSk7Ci0KLSAgICAJQ29tcG9zaXRlIGhkQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0PSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nPSAxOwotCQloZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJaGRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWhkQ29tcG9zaXRlLnNldEZvcmVncm91bmQoY29tcG9zaXRlLmdldEZvcmVncm91bmQoKSk7Ci0JCWhkQ29tcG9zaXRlLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JICAgICAKLQkJaGVhZGVyRmllbGQ9IG5ldyBMYWJlbChoZENvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQljcmVhdGVIZWFkTGFiZWwoaGVhZGVyRmllbGQpOwotCQkKLQkJaWYgKHNob3dEZXRhaWxzKSB7Ci0JCQlpZiAoZW5hYmxlS2V5KSB7Ci0JCQkJTGFiZWwgbGFiZWxGaWVsZCA9IG5ldyBMYWJlbChoZENvbXBvc2l0ZSwgU1dULlJJR0hUKTsKLQkJCQlsYWJlbEZpZWxkLnNldFRleHQoIlByZXNzIEVTQyB0byBjbG9zZSIpOwotCQkJCWNyZWF0ZUhlYWRMYWJlbChsYWJlbEZpZWxkKTsKLQkJCX0KLQkJCQotCQkJLy8gSG9yaXpvbnRhbCBzZXBhcmF0b3IgbGluZQotCQkJTGFiZWwgc2VwYXJhdG9yPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwgfCBTV1QuTElORV9ET1QpOwotCQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gVGV4dCBmaWVsZAotCQkJZlRleHQ9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IHN0eWxlKTsKLQkJCWlmICgoc3R5bGUgJiBTV1QuV1JBUCkgIT0gMCkgey8vaXMgd2FycAotCQkJCWZNYXhXaWR0aCA9IFNIRUxMX0RFRkFVTFRfV0lEVEggLyAyOwotCQkJfQotCQkJCi0JCQlmVGV4dC5zZXRDYXJldChudWxsKTsKLQkJCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdkLmhvcml6b250YWxJbmRlbnQ9IElOTkVSX0JPUkRFUjsKLQkJCWdkLnZlcnRpY2FsSW5kZW50PSBJTk5FUl9CT1JERVI7Ci0JCQlmVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWZUZXh0LnNldEZvcmVncm91bmQoY29tcG9zaXRlLmdldEZvcmVncm91bmQoKSk7Ci0JCQlmVGV4dC5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJZlRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHt9Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQljbG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGVuYWJsZUtleSkgewotCQkJCWZUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gMHgxQikgey8vIEVTQwotCQkJCQkJCWNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkge30KLQkJCQl9KTsKLQkJCX0KLQkJCWZQcmVzZW50ZXI9IHByZXNlbnRlcjsKLQkJfQotCQlhZGREaXNwb3NlTGlzdGVuZXIodGhpcyk7Ci0JfQotCS8qKiBDbG9zZSBzaGVsbAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZSgpIHsKLQkJaWYgKGZTaGVsbCAhPSBudWxsICYmICFmU2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJZlNoZWxsLmRpc3Bvc2UoKTsJCQotCX0KLQkvKiogQ3JlYXRlIGhlYWQgbGFiZWwgZmllbGQKLQkgKiBAcGFyYW0gbGFiZWxGaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVIZWFkTGFiZWwoTGFiZWwgbGFiZWxGaWVsZCkgewotCQlGb250IGZvbnQ9IGxhYmVsRmllbGQuZ2V0Rm9udCgpOwotCQlpZiAoZkhlYWRlclRleHRGb250ID09IG51bGwpIHsKLQkJCUZvbnREYXRhW10gZm9udERhdGFzPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZm9udERhdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZm9udERhdGFzW2ldLnNldEhlaWdodCgoZm9udERhdGFzW2ldLmdldEhlaWdodCgpICogOSAvIDEwKSk7Ci0JCQl9Ci0JCQlmSGVhZGVyVGV4dEZvbnQgPSBuZXcgRm9udChsYWJlbEZpZWxkLmdldERpc3BsYXkoKSwgZm9udERhdGFzKTsKLQkJfQotCQlsYWJlbEZpZWxkLnNldEZvbnQoZkhlYWRlclRleHRGb250KTsKLQkJbGFiZWxGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlsYWJlbEZpZWxkLnNldEZvcmVncm91bmQobGFiZWxGaWVsZC5nZXRQYXJlbnQoKS5nZXRGb3JlZ3JvdW5kKCkpOwotCQlsYWJlbEZpZWxkLnNldEJhY2tncm91bmQobGFiZWxGaWVsZC5nZXRQYXJlbnQoKS5nZXRCYWNrZ3JvdW5kKCkpOwkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5ob3Zlci5JSWNvbkluZm9ybWF0aW9uQ29udHJvbCNzZXRIZWFkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIGhlYWRlcikgewotCQlpZiAoaGVhZGVyRmllbGQgIT0gbnVsbCkgewotCQkJaGVhZGVyRmllbGQuc2V0VGV4dChoZWFkZXIgKyAiICIpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRJbmZvcm1hdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBjb250ZW50KSB7Ci0JCWlmIChmUHJlc2VudGVyID09IG51bGwpIHsKLQkJCWZUZXh0LnNldFRleHQoY29udGVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlmUHJlc2VudGF0aW9uLmNsZWFyKCk7Ci0JCQljb250ZW50PSBmUHJlc2VudGVyLnVwZGF0ZVByZXNlbnRhdGlvbihmU2hlbGwuZ2V0RGlzcGxheSgpLCBjb250ZW50LCBmUHJlc2VudGF0aW9uLCBmTWF4V2lkdGgsIGZNYXhIZWlnaHQpOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCWZUZXh0LnNldFRleHQoY29udGVudCk7Ci0JCQkJVGV4dFByZXNlbnRhdGlvbi5hcHBseVRleHRQcmVzZW50YXRpb24oZlByZXNlbnRhdGlvbiwgZlRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQlmVGV4dC5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWZTaGVsbC5zZXRWaXNpYmxlKHZpc2libGUpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZTaGVsbCAhPSBudWxsICYmICFmU2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJZlNoZWxsLmRpc3Bvc2UoKTsKLQkJZWxzZQotCQkJd2lkZ2V0RGlzcG9zZWQobnVsbCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQlpZiAoZkhlYWRlclRleHRGb250ICE9IG51bGwgJiYgIWZIZWFkZXJUZXh0Rm9udC5pc0Rpc3Bvc2VkKCkpCi0JCQlmSGVhZGVyVGV4dEZvbnQuZGlzcG9zZSgpOwotCi0JCWZTaGVsbD0gbnVsbDsKLQkJZlRleHQ9IG51bGw7Ci0JCWZIZWFkZXJUZXh0Rm9udD0gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaW50IG5ld193aWR0aCA9IHNob3dEZXRhaWxzPyh3aWR0aCArIDc1KTp3aWR0aDsKLQkJaWYgKHdpZHRoID4gU0hFTExfREVGQVVMVF9XSURUSCB8fCBoZWlnaHQgPiBTSEVMTF9ERUZBVUxUX0hFSUdIVCkgewotCQkJc2Muc2V0TWluU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQkJCXNjLmdldEhvcml6b250YWxCYXIoKS5zZXRWaXNpYmxlKHdpZHRoID4gU0hFTExfREVGQVVMVF9XSURUSCk7Ci0JCQlzYy5nZXRWZXJ0aWNhbEJhcigpLnNldFZpc2libGUoaGVpZ2h0ID4gU0hFTExfREVGQVVMVF9IRUlHSFQpOwotCQkJbmV3X3dpZHRoID0gKHdpZHRoPlNIRUxMX0RFRkFVTFRfV0lEVEg/U0hFTExfREVGQVVMVF9XSURUSDpuZXdfd2lkdGgpOwotCQkJaW50IG5ld19oZWlnaHQgPSAoaGVpZ2h0PlNIRUxMX0RFRkFVTFRfSEVJR0hUP1NIRUxMX0RFRkFVTFRfSEVJR0hUOih3aWR0aD5TSEVMTF9ERUZBVUxUX1dJRFRIPyhzYy5nZXRIb3Jpem9udGFsQmFyKCkuZ2V0U2l6ZSgpLnkraGVpZ2h0KTpoZWlnaHQpKTsKLQkJCWZTaGVsbC5zZXRTaXplKG5ld193aWR0aCs1LCBuZXdfaGVpZ2h0KzIpOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IG1pbl9oID0gc2MuZ2V0SG9yaXpvbnRhbEJhcigpLmdldFNpemUoKS55OwotCQkJaWYgKGhlaWdodCA8PSBtaW5faCkgewotCQkJCWhlaWdodCA9IG1pbl9oICsgMTsKLQkJCX0KLQkJCXNjLnNldEFsd2F5c1Nob3dTY3JvbGxCYXJzKGZhbHNlKTsKLQkJCWZTaGVsbC5zZXRTaXplKG5ld193aWR0aCs1LCBoZWlnaHQrMik7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldExvY2F0aW9uKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBsb2NhdGlvbikgewotCQlmU2hlbGwuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0U2l6ZUNvbnN0cmFpbnRzKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemVDb25zdHJhaW50cyhpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLQkJZk1heFdpZHRoPSBtYXhXaWR0aDsKLQkJZk1heEhlaWdodD0gbWF4SGVpZ2h0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjY29tcHV0ZVNpemVIaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemVIaW50KCkgewotCQkvL3JldHVybiBmU2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJcmV0dXJuIHNjLmdldENvbnRlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjYWRkRGlzcG9zZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNyZW1vdmVEaXNwb3NlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU2hlbGwucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGZvcmVncm91bmQpIHsKLQkJZlRleHQuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldEJhY2tncm91bmRDb2xvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGJhY2tncm91bmQpIHsKLQkJZlRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI2lzRm9jdXNDb250cm9sKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCgpIHsKLQkJcmV0dXJuIGZUZXh0LmlzRm9jdXNDb250cm9sKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChzaG93RGV0YWlscykgewotCQkJLy9mU2hlbGwuZm9yY2VGb2N1cygpOwotCQkJaWYgKGZUZXh0ICE9IG51bGwpIHsKLQkJCQlmVGV4dC5zZXRGb2N1cygpOwotCQkJfQotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNhZGRGb2N1c0xpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlRleHQuYWRkRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNyZW1vdmVGb2N1c0xpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlRleHQucmVtb3ZlRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5ob3Zlci5JSWNvbkluZm9ybWF0aW9uQ29udHJvbCNnZXRTaGVsbFNpemUoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTaGVsbFNpemUoKSB7Ci0JCVBvaW50IHNpemUgPSBjb21wdXRlU2l6ZUhpbnQoKTsKLQkJLy9zZXQgU2hlbGwgc2l6ZQotCQlzZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCi0JCWlmIChzaXplLnggPiBTSEVMTF9ERUZBVUxUX1dJRFRIKSB7Ci0JCQlzaXplLnggPSBTSEVMTF9ERUZBVUxUX1dJRFRIOwotCQl9Ci0JCWlmIChzaXplLnkgPiBTSEVMTF9ERUZBVUxUX0hFSUdIVCkgewotCQkJc2l6ZS55ID0gU0hFTExfREVGQVVMVF9IRUlHSFQ7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5ob3Zlci5JSWNvbkluZm9ybWF0aW9uQ29udHJvbCNpc1dyYXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV3JhcCgpIHsKLQkJcmV0dXJuIChmTWF4V2lkdGg+LTEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvaG92ZXIvSWNvbkhvdmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL0ljb25Ib3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWM1ZmVjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvaG92ZXIvSWNvbkhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmhvdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmhvdmVyLklJY29uSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uSG92ZXIgewotCS8qKiBDcmVhdGUgaG92ZXIgY29udHJvbAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc2hvd0RldGFpbHMKLQkgKiBAcGFyYW0gaXNXcmFwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSWNvbkluZm9ybWF0aW9uQ29udHJvbCBnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKFNoZWxsIHBhcmVudCwgYm9vbGVhbiBzaG93RGV0YWlscywgYm9vbGVhbiBpc1dyYXApIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgc2hvd0RldGFpbHMsIGlzV3JhcD8oU1dULk5PTkUgfCBTV1QuV1JBUCk6U1dULk5PTkUpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9JY29uSG92ZXJQcmVzZW50ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvaG92ZXIvSWNvbkhvdmVyUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDIxNTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9JY29uSG92ZXJQcmVzZW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmhvdmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgSWNvbkhvdmVyUHJlc2VudGVyIGltcGxlbWVudHMgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbC5JSW5mb3JtYXRpb25QcmVzZW50ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0RFTElNID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfSU5ERU5UQVRJT04gPSAiICAiOwotCXByaXZhdGUgaW50IGZDb3VudGVyOwotCXByaXZhdGUgYm9vbGVhbiBmRW5mb3JjZVVwcGVyTGluZUxpbWl0OwotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGVuZm9yY2VVcHBlckxpbmVMaW1pdAotCSAqLwotCXB1YmxpYyBJY29uSG92ZXJQcmVzZW50ZXIoYm9vbGVhbiBlbmZvcmNlVXBwZXJMaW5lTGltaXQpIHsKLQkJc3VwZXIoKTsKLQkJZkVuZm9yY2VVcHBlckxpbmVMaW1pdCA9IGVuZm9yY2VVcHBlckxpbmVMaW1pdDsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSWNvbkhvdmVyUHJlc2VudGVyKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgUmVhZGVyCi0JICogCi0JICogQHBhcmFtIGhvdmVySW5mbwotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlYWRlciBjcmVhdGVSZWFkZXIoU3RyaW5nIGhvdmVySW5mbywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBJY29uVGV4dFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGhvdmVySW5mbyksIHByZXNlbnRhdGlvbik7Ci0JfQotCS8qKgotCSAqIEFkcGF0IHRleHQgcHJlc2VudGF0aW9uCi0JICogCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gaW5zZXJ0TGVuZ3RoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRhcHRUZXh0UHJlc2VudGF0aW9uKFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgaW5zZXJ0TGVuZ3RoKSB7Ci0JCWludCB5b3Vyc1N0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgeW91cnNFbmQgPSBvZmZzZXQgKyBpbnNlcnRMZW5ndGggLSAxOwotCQl5b3Vyc0VuZCA9IE1hdGgubWF4KHlvdXJzU3RhcnQsIHlvdXJzRW5kKTsKLQkJSXRlcmF0b3IgZSA9IHByZXNlbnRhdGlvbi5nZXRBbGxTdHlsZVJhbmdlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gKFN0eWxlUmFuZ2UpIGUubmV4dCgpOwotCQkJaW50IG15U3RhcnQgPSByYW5nZS5zdGFydDsKLQkJCWludCBteUVuZCA9IHJhbmdlLnN0YXJ0ICsgcmFuZ2UubGVuZ3RoIC0gMTsKLQkJCW15RW5kID0gTWF0aC5tYXgobXlTdGFydCwgbXlFbmQpOwotCQkJaWYgKG15RW5kIDwgeW91cnNTdGFydCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChteVN0YXJ0IDwgeW91cnNTdGFydCkKLQkJCQlyYW5nZS5sZW5ndGggKz0gaW5zZXJ0TGVuZ3RoOwotCQkJZWxzZQotCQkJCXJhbmdlLnN0YXJ0ICs9IGluc2VydExlbmd0aDsKLQkJfQotCX0KLQkvKioKLQkgKiBBcHBlbmQgdGV4dAotCSAqIAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0cmluZywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpIHsKLQkJCWFkYXB0VGV4dFByZXNlbnRhdGlvbihwcmVzZW50YXRpb24sIGZDb3VudGVyLCBsZW5ndGgpOwotCQl9Ci0JCWZDb3VudGVyICs9IGxlbmd0aDsKLQl9Ci0JLyoqCi0JICogR2V0IGluZGVudGF0aW9uCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiBAcmV0dXJuCi0JICovCi0JLyoKLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnQoU3RyaW5nIGxpbmUpIHsKLQkJaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBsZW5ndGggJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsaW5lLmNoYXJBdChpKSkpCi0JCQkrK2k7Ci0JCXJldHVybiAoaSA9PSBsZW5ndGggPyBsaW5lIDogbGluZS5zdWJzdHJpbmcoMCwgaSkpICsgTElORV9JTkRFTlRBVElPTjsKLQl9Ci0JKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5ob3Zlci5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLklJbmZvcm1hdGlvblByZXNlbnRlciN1cGRhdGVQcmVzZW50YXRpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHVwZGF0ZVByZXNlbnRhdGlvbihEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBob3ZlckluZm8sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uLCBpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLQkJaWYgKGhvdmVySW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBtYXhOdW1iZXJPZkxpbmVzID0gTWF0aC5yb3VuZChtYXhIZWlnaHQgLyBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpKTsKLQkJCWZDb3VudGVyID0gMDsKLQkJCUxpbmVCcmVha2luZ1JlYWRlciByZWFkZXIgPSBuZXcgTGluZUJyZWFraW5nUmVhZGVyKGNyZWF0ZVJlYWRlcihob3ZlckluZm8sIHByZXNlbnRhdGlvbiksIGdjLCBtYXhXaWR0aCk7Ci0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCQkJCWlmIChmRW5mb3JjZVVwcGVyTGluZUxpbWl0ICYmIG1heE51bWJlck9mTGluZXMgPD0gMCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlhcHBlbmQoYnVmZmVyLCBsaW5lLCBudWxsKTsKLQkJCQlhcHBlbmQoYnVmZmVyLCBMSU5FX0RFTElNLCByZWFkZXIuaXNGb3JtYXR0ZWRMaW5lKCk/cHJlc2VudGF0aW9uOm51bGwpOwotCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQltYXhOdW1iZXJPZkxpbmVzLS07Ci0JCQl9Ci0JCQkvLyBkaXNwbGF5ICIuLi4iIGlmIHRoZSBjb250ZW50IGlzIG92ZXIgdGhlIHNoZWxsIHNpemUKLQkJCWlmIChsaW5lICE9IG51bGwgJiYgYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIG51bGwpOwotCQkJCWFwcGVuZChidWZmZXIsICIuLi4iLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiB0cmltKGJ1ZmZlciwgcHJlc2VudGF0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJUFRQVUlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogaW1wbGVtZW50ZWQgYW5vdGhlciBtZXRob2QgdG8gcmVwbGFjZSBvcmdpbmlhbCAKLQlwdWJsaWMgU3RyaW5nIHVwZGF0ZVByZXNlbnRhdGlvbihEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBob3ZlckluZm8sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uLCBpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLQkJaWYgKGhvdmVySW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBtYXhOdW1iZXJPZkxpbmVzID0gTWF0aC5yb3VuZChtYXhIZWlnaHQgLyBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpKTsKLQkJCWZDb3VudGVyID0gMDsKLQkJCUxpbmVCcmVha2luZ1JlYWRlciByZWFkZXIgPSBuZXcgTGluZUJyZWFraW5nUmVhZGVyKGNyZWF0ZVJlYWRlcihob3ZlckluZm8sIHByZXNlbnRhdGlvbiksIGdjLCBtYXhXaWR0aCk7Ci0JCQlib29sZWFuIGxhc3RMaW5lRm9ybWF0dGVkID0gZmFsc2U7Ci0JCQlTdHJpbmcgbGFzdExpbmVJbmRlbnQgPSBudWxsOwotCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUobGFzdExpbmVJbmRlbnQpOwotCQkJYm9vbGVhbiBsaW5lRm9ybWF0dGVkID0gcmVhZGVyLmlzRm9ybWF0dGVkTGluZSgpOwotCQkJYm9vbGVhbiBmaXJzdExpbmVQcm9jZXNzZWQgPSBmYWxzZTsKLQkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKLQkJCQlpZiAoZkVuZm9yY2VVcHBlckxpbmVMaW1pdCAmJiBtYXhOdW1iZXJPZkxpbmVzIDw9IDApCi0JCQkJCWJyZWFrOwotCQkJCWlmIChmaXJzdExpbmVQcm9jZXNzZWQpIHsKLQkJCQkJaWYgKCFsYXN0TGluZUZvcm1hdHRlZCkKLQkJCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIG51bGwpOwotCQkJCQllbHNlIHsKLQkJCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIHByZXNlbnRhdGlvbik7Ci0JCQkJCQlpZiAobGFzdExpbmVJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlhcHBlbmQoYnVmZmVyLCBsYXN0TGluZUluZGVudCwgcHJlc2VudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhcHBlbmQoYnVmZmVyLCBsaW5lLCBudWxsKTsKLQkJCQlmaXJzdExpbmVQcm9jZXNzZWQgPSB0cnVlOwotCQkJCWxhc3RMaW5lRm9ybWF0dGVkID0gbGluZUZvcm1hdHRlZDsKLQkJCQlpZiAoIWxpbmVGb3JtYXR0ZWQpCi0JCQkJCWxhc3RMaW5lSW5kZW50ID0gbnVsbDsKLQkJCQllbHNlIGlmIChsYXN0TGluZUluZGVudCA9PSBudWxsKQotCQkJCQlsYXN0TGluZUluZGVudCA9IGdldEluZGVudChsaW5lKTsKLQkJCQlsaW5lID0gcmVhZGVyLnJlYWRMaW5lKGxhc3RMaW5lSW5kZW50KTsKLQkJCQlsaW5lRm9ybWF0dGVkID0gcmVhZGVyLmlzRm9ybWF0dGVkTGluZSgpOwotCQkJCW1heE51bWJlck9mTGluZXMtLTsKLQkJCX0KLQkJCS8vIGRpc3BsYXkgIi4uLiIgaWYgdGhlIGNvbnRlbnQgaXMgb3ZlciB0aGUgc2hlbGwgc2l6ZQotCQkJaWYgKGxpbmUgIT0gbnVsbCAmJiBidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgbGluZUZvcm1hdHRlZCA/IHByZXNlbnRhdGlvbiA6IG51bGwpOwotCQkJCWFwcGVuZChidWZmZXIsICIuLi4iLCBwcmVzZW50YXRpb24pOwotCQkJfQotCQkJcmV0dXJuIHRyaW0oYnVmZmVyLCBwcmVzZW50YXRpb24pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBVSVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkgKiAKLQkgKi8KLQkKLQkvKioKLQkgKiBUcmltIGdpdmVuIGJ1ZmZlcgotCSAqIAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRyaW0oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IGxlbmd0aCAtIDE7Ci0JCXdoaWxlIChlbmQgPj0gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGJ1ZmZlci5jaGFyQXQoZW5kKSkpCi0JCQktLWVuZDsKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCXJldHVybiAiIjsKLQkJaWYgKGVuZCA8IGxlbmd0aCAtIDEpCi0JCQlidWZmZXIuZGVsZXRlKGVuZCArIDEsIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCWVuZCA9IGxlbmd0aDsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJd2hpbGUgKHN0YXJ0IDwgZW5kICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYnVmZmVyLmNoYXJBdChzdGFydCkpKQotCQkJKytzdGFydDsKLQkJYnVmZmVyLmRlbGV0ZSgwLCBzdGFydCk7Ci0JCXByZXNlbnRhdGlvbi5zZXRSZXN1bHRXaW5kb3cobmV3IFJlZ2lvbihzdGFydCwgYnVmZmVyLmxlbmd0aCgpKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL0ljb25UZXh0UmVhZGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL0ljb25UZXh0UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODE2ZmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9JY29uVGV4dFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuaG92ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuaG92ZXIuSUljb25Ib3ZlclRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEljb25UZXh0UmVhZGVyIGV4dGVuZHMgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORz0gIiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBmZ0VudGl0eUxvb2t1cDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBmZ1RhZ3M7Ci0JCi0JcHJpdmF0ZSBDb2xvciByZWRfY29sb3IgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlwcml2YXRlIENvbG9yIGdyZWVuX2NvbG9yID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQotCXN0YXRpYyB7Ci0JCWZnVGFncz0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmZ1RhZ3MuYWRkKElJY29uSG92ZXJUYWcuVU5ERVJMSU5FX1RBRyk7Ci0JCWZnVGFncy5hZGQoSUljb25Ib3ZlclRhZy5TVFJJS0VfVEFHKTsKLQkJZmdUYWdzLmFkZChJSWNvbkhvdmVyVGFnLkJPTERfVEFHKTsKLQkJZmdUYWdzLmFkZChJSWNvbkhvdmVyVGFnLklUQUxJQ19UQUcpOwotCQlmZ1RhZ3MuYWRkKElJY29uSG92ZXJUYWcuUF9UQUcpOwotCQlmZ1RhZ3MuYWRkKElJY29uSG92ZXJUYWcuS0VZX1RBRyk7Ci0JCWZnVGFncy5hZGQoSUljb25Ib3ZlclRhZy5ISUdITElHSFRfVEFHKTsKLQkJZmdUYWdzLmFkZChJSWNvbkhvdmVyVGFnLk5FWFRfTElORV9UQUcpOwotCQlmZ1RhZ3MuYWRkKElJY29uSG92ZXJUYWcuSU5ERU5UX1RBRyk7Ci0KLQkJZmdFbnRpdHlMb29rdXA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPig3KTsKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJsdCIsICI8Iik7Ci0JCWZnRW50aXR5TG9va3VwLnB1dCgiZ3QiLCAiPiIpOwotCQlmZ0VudGl0eUxvb2t1cC5wdXQoIm5ic3AiLCAiICIpOwotCQlmZ0VudGl0eUxvb2t1cC5wdXQoImFtcCIsICImIik7Ci0JCWZnRW50aXR5TG9va3VwLnB1dCgiY2lyYyIsICJeIik7Ci0JCWZnRW50aXR5TG9va3VwLnB1dCgidGlsZGUiLCAifiIpOwotCQlmZ0VudGl0eUxvb2t1cC5wdXQoInF1b3QiLCAiXCIiKTsJCQotCX0KLQotCXByaXZhdGUgaW50IGZDb3VudGVyPSAwOwotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBmVGV4dFByZXNlbnRhdGlvbjsKLQlwcml2YXRlIGludCBmU3RyaWtlPSAwOwotCXByaXZhdGUgaW50IGZVbmRlcmxpbmU9IDA7Ci0JcHJpdmF0ZSBpbnQgZkJvbGQ9IDA7Ci0JcHJpdmF0ZSBpbnQgZkl0YWxpYz0gMDsKLQlwcml2YXRlIGludCBmS2V5PSAwOwotCXByaXZhdGUgaW50IGZIaWdobGlnaHQgPSAwOwotCXByaXZhdGUgaW50IGZTdGFydE9mZnNldD0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZJblBhcmFncmFwaD0gZmFsc2U7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbgotCSAqLwotCXB1YmxpYyBJY29uVGV4dFJlYWRlcihSZWFkZXIgcmVhZGVyLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlzdXBlcihuZXcgUHVzaGJhY2tSZWFkZXIocmVhZGVyKSk7Ci0JCWZUZXh0UHJlc2VudGF0aW9uPSBwcmVzZW50YXRpb247Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjPSBzdXBlci5yZWFkKCk7Ci0JCWlmIChjICE9IC0xKQotCQkJKysgZkNvdW50ZXI7Ci0JCXJldHVybiBjOwotCX0KLQkvKiogU3RhcnQgYm9sZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0Qm9sZCgpIHsKLQkJaWYgKGZCb2xkID09IDApCi0JCQlmU3RhcnRPZmZzZXQ9IGZDb3VudGVyOwotCQkrKyBmQm9sZDsKLQl9Ci0JLyoqIFN0b3AgYm9sZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3BCb2xkKCkgewotCQktLSBmQm9sZDsKLQkJaWYgKGZCb2xkID09IDApIHsKLQkJCWZUZXh0UHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoZlN0YXJ0T2Zmc2V0LCBmQ291bnRlciAtIGZTdGFydE9mZnNldCwgbnVsbCwgbnVsbCwgU1dULkJPTEQpKTsKLQkJCWZTdGFydE9mZnNldD0gLTE7Ci0JCX0KLQl9Ci0KLQkvKiogc3RhcnQgdW5kZXJsaW5lCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRVbmRlckxpbmUoKSB7Ci0JCWlmIChmVW5kZXJsaW5lID09IDApCi0JCQlmU3RhcnRPZmZzZXQ9IGZDb3VudGVyOwotCQkrKyBmVW5kZXJsaW5lOwotCX0KLQkvKiogc3RvcCB1bmRlcmxpbmUKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wVW5kZXJMaW5lKCkgewotCQktLSBmVW5kZXJsaW5lOwotCQlpZiAoZlVuZGVybGluZSA9PSAwKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZShmU3RhcnRPZmZzZXQsIGZDb3VudGVyIC0gZlN0YXJ0T2Zmc2V0LCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lID0gdHJ1ZTsKLQkJCWZUZXh0UHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0JCQlmU3RhcnRPZmZzZXQ9IC0xOwotCQl9Ci0JfQotCi0JLyoqIHN0YXJ0IHN0cmlrZQotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0U3RyaWtlKCkgewotCQlpZiAoZlN0cmlrZSA9PSAwKQotCQkJZlN0YXJ0T2Zmc2V0PSBmQ291bnRlcjsKLQkJKysgZlN0cmlrZTsKLQl9Ci0JLyoqIHN0b3Agc3RyaWtlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcFN0cmlrZSgpIHsKLQkJLS0gZlN0cmlrZTsKLQkJaWYgKGZTdHJpa2UgPT0gMCkgewotCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoZlN0YXJ0T2Zmc2V0LCBmQ291bnRlciAtIGZTdGFydE9mZnNldCwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCQlzdHlsZVJhbmdlLnN0cmlrZW91dCA9IHRydWU7Ci0JCQlmVGV4dFByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKHN0eWxlUmFuZ2UpOwotCQkJZlN0YXJ0T2Zmc2V0PSAtMTsKLQkJfQotCX0KLQkKLQkvKiogc3RhcnQgaXRhbGljCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRJdGFsaWMoKSB7Ci0JCWlmIChmSXRhbGljID09IDApCi0JCQlmU3RhcnRPZmZzZXQ9IGZDb3VudGVyOwotCQkrKyBmSXRhbGljOwotCX0KLQkvKiogc3RvcCBpdGFsaWMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wSXRhbGljKCkgewotCQktLSBmSXRhbGljOwotCQlpZiAoZkl0YWxpYyA9PSAwKSB7Ci0JCQlmVGV4dFByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKGZTdGFydE9mZnNldCwgZkNvdW50ZXIgLSBmU3RhcnRPZmZzZXQsIG51bGwsIG51bGwsIFNXVC5JVEFMSUMpKTsKLQkJCWZTdGFydE9mZnNldD0gLTE7Ci0JCX0KLQl9Ci0JCi0JLyoqIHN0YXJ0IGtleQotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0S2V5KCkgewotCQlpZiAoZktleSA9PSAwKQotCQkJZlN0YXJ0T2Zmc2V0PSBmQ291bnRlcjsKLQkJKysgZktleTsKLQl9Ci0JLyoqIHN0b3Aga2V5Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcEtleSgpIHsKLQkJLS0gZktleTsKLQkJaWYgKGZLZXkgPT0gMCkgewotCQkJZlRleHRQcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShmU3RhcnRPZmZzZXQsIGZDb3VudGVyIC0gZlN0YXJ0T2Zmc2V0LCByZWRfY29sb3IsIG51bGwsIFNXVC5OT1JNQUwpKTsKLQkJCWZTdGFydE9mZnNldD0gLTE7Ci0JCX0KLQl9Ci0KLQkvKiogc3RhcnQgaGlnaGxpZ2h0Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRIaWdobGlnaHQoKSB7Ci0JCWlmIChmSGlnaGxpZ2h0ID09IDApCi0JCQlmU3RhcnRPZmZzZXQ9IGZDb3VudGVyOwotCQkrKyBmSGlnaGxpZ2h0OwotCX0KLQkvKiogc3RvcCBoaWdobGlnaHQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wSGlnaGxpZ2h0KCkgewotCQktLSBmSGlnaGxpZ2h0OwotCQlpZiAoZkhpZ2hsaWdodCA9PSAwKSB7Ci0JCQlmVGV4dFByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKGZTdGFydE9mZnNldCwgZkNvdW50ZXIgLSBmU3RhcnRPZmZzZXQsIG51bGwsIGdyZWVuX2NvbG9yLCBTV1QuTk9STUFMKSk7Ci0JCQlmU3RhcnRPZmZzZXQ9IC0xOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5ob3Zlci5TdWJzdGl0dXRpb25UZXh0UmVhZGVyI2NvbXB1dGVTdWJzdGl0dXRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGMgPT0gJzwnKQotCQkJcmV0dXJuICBwcm9jZXNzVGFnKCk7Ci0JCWVsc2UgaWYgKGMgPT0gJyYnKQotCQkJcmV0dXJuIHByb2Nlc3NFbnRpdHkoKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogVG8gZm9ybWF0dGVkIHRleHQKLQkgKiBAcGFyYW0gaHRtbCBvcmlnaW5hbCB0ZXh0Ci0JICogQHJldHVybiBmb3JtYXR0ZWQgdGV4dAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRvVGV4dChTdHJpbmcgaHRtbCkgewotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0KLQkJU3RyaW5nIHRhZz0gaHRtbDsKLQkJYm9vbGVhbiBpc0Nsb3NpbmcgPSBmYWxzZTsKLQkJaWYgKHRhZy5jaGFyQXQoMCkgPT0gSUljb25Ib3ZlclRhZy5DTE9TRURfVEFHKSB7Ci0JCQl0YWc9IHRhZy5zdWJzdHJpbmcoMSk7Ci0JCQlpc0Nsb3NpbmcgPSB0cnVlOwotCQl9Ci0JCWlmICghZmdUYWdzLmNvbnRhaW5zKHRhZykpIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAodGFnLmVxdWFscyhJSWNvbkhvdmVyVGFnLklOREVOVF9UQUcpKSB7Ci0JCQlyZXR1cm4gIlx0IiArIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICh0YWcuZXF1YWxzKElJY29uSG92ZXJUYWcuTkVYVF9MSU5FX1RBRykpIHsKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCQl9Ci0KLQkJaWYgKHRhZy5lcXVhbHMoSUljb25Ib3ZlclRhZy5CT0xEX1RBRykpIHsKLQkJCWlmIChpc0Nsb3NpbmcpCi0JCQkJc3RvcEJvbGQoKTsKLQkJCWVsc2UKLQkJCQlzdGFydEJvbGQoKTsKLQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICh0YWcuZXF1YWxzKElJY29uSG92ZXJUYWcuVU5ERVJMSU5FX1RBRykpIHsKLQkJCWlmIChpc0Nsb3NpbmcpCi0JCQkJc3RvcFVuZGVyTGluZSgpOwotCQkJZWxzZQotCQkJCXN0YXJ0VW5kZXJMaW5lKCk7Ci0KLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAodGFnLmVxdWFscyhJSWNvbkhvdmVyVGFnLlNUUklLRV9UQUcpKSB7Ci0JCQlpZiAoaXNDbG9zaW5nKQotCQkJCXN0b3BTdHJpa2UoKTsKLQkJCWVsc2UKLQkJCQlzdGFydFN0cmlrZSgpOwotCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJaWYgKHRhZy5lcXVhbHMoSUljb25Ib3ZlclRhZy5JVEFMSUNfVEFHKSkgewotCQkJaWYgKGlzQ2xvc2luZykKLQkJCQlzdG9wSXRhbGljKCk7Ci0JCQllbHNlCi0JCQkJc3RhcnRJdGFsaWMoKTsKLQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICh0YWcuZXF1YWxzKElJY29uSG92ZXJUYWcuS0VZX1RBRykpIHsKLQkJCWlmIChpc0Nsb3NpbmcpCi0JCQkJc3RvcEtleSgpOwotCQkJZWxzZQotCQkJCXN0YXJ0S2V5KCk7Ci0KLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAodGFnLmVxdWFscyhJSWNvbkhvdmVyVGFnLkhJR0hMSUdIVF9UQUcpKSB7Ci0JCQlpZiAoaXNDbG9zaW5nKQotCQkJCXN0b3BIaWdobGlnaHQoKTsKLQkJCWVsc2UKLQkJCQlzdGFydEhpZ2hsaWdodCgpOwotCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0JCQotCQlpZiAodGFnLmVxdWFscyhJSWNvbkhvdmVyVGFnLlBfVEFHKSkgewotCQkJaWYgKGlzQ2xvc2luZykgewotCQkJCWJvb2xlYW4gaW5QYXJhZ3JhcGg9IGZJblBhcmFncmFwaDsKLQkJCQlmSW5QYXJhZ3JhcGg9IGZhbHNlOwotCQkJCXJldHVybiBpblBhcmFncmFwaCA/IEVNUFRZX1NUUklORyA6IExJTkVfREVMSU07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmSW5QYXJhZ3JhcGg9IHRydWU7Ci0JCQkJcmV0dXJuIExJTkVfREVMSU07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKiogR2V0IHByb2Nlc3MgdGFnCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g9IG5leHRDaGFyKCk7Ci0JCXdoaWxlIChjaCAhPSAtMSAmJiBjaCAhPSBJSWNvbkhvdmVyVGFnLkVORF9UQUcpIHsKLQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChjaGFyKSBjaCkpOwotCQkJY2g9IG5leHRDaGFyKCk7Ci0JCQlpZiAoY2ggPT0gJyInKXsKLQkJCQlidWYuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpKTsKLQkJCQljaD0gbmV4dENoYXIoKTsKLQkJCQl3aGlsZSAoY2ggIT0gLTEgJiYgY2ggIT0gJyInKXsKLQkJCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGNoKSk7Ci0JCQkJCWNoPSBuZXh0Q2hhcigpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaCA9PSBJSWNvbkhvdmVyVGFnLlNUQVJUX1RBRyl7Ci0JCQkJdW5yZWFkKGNoKTsKLQkJCQlyZXR1cm4gSUljb25Ib3ZlclRhZy5TVEFSVF9UQUcgKyBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAoY2ggPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gdG9UZXh0KGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKiogdW5yZWFkCi0JICogQHBhcmFtIGNoCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB1bnJlYWQoaW50IGNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkoKFB1c2hiYWNrUmVhZGVyKSBnZXRSZWFkZXIoKSkudW5yZWFkKGNoKTsKLQl9Ci0KLQkvKiogZW50aXR5IHRvIHRleHQKLQkgKiBAcGFyYW0gc3ltYm9sCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZW50aXR5MlRleHQoU3RyaW5nIHN5bWJvbCkgewotCQlpZiAoc3ltYm9sLmxlbmd0aCgpID4gMSAmJiBzeW1ib2wuY2hhckF0KDApID09ICcjJykgewotCQkJaW50IGNoOwotCQkJdHJ5IHsKLQkJCQlpZiAoc3ltYm9sLmNoYXJBdCgxKSA9PSAneCcpIHsKLQkJCQkJY2g9IEludGVnZXIucGFyc2VJbnQoc3ltYm9sLnN1YnN0cmluZygyKSwgMTYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoPSBJbnRlZ2VyLnBhcnNlSW50KHN5bWJvbC5zdWJzdHJpbmcoMSksIDEwKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVNUFRZX1NUUklORyArIChjaGFyKWNoOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzdHI9IChTdHJpbmcpIGZnRW50aXR5TG9va3VwLmdldChzeW1ib2wpOwotCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiYiICsgc3ltYm9sOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKiogR2V0IHByb2Nlc3MgZW50aXR5Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzRW50aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g9IG5leHRDaGFyKCk7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KChjaGFyKWNoKSB8fCBjaCA9PSAnIycpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJCWNoPSBuZXh0Q2hhcigpOwotCQl9Ci0KLQkJaWYgKGNoID09ICc7JykKLQkJCXJldHVybiBlbnRpdHkyVGV4dChidWYudG9TdHJpbmcoKSk7Ci0KLQkJYnVmLmluc2VydCgwLCAnJicpOwotCQlpZiAoY2ggIT0gLTEpCi0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL0xpbmVCcmVha2luZ1JlYWRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9MaW5lQnJlYWtpbmdSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkZjg2Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL0xpbmVCcmVha2luZ1JlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuaG92ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lQnJlYWtpbmdSZWFkZXIgewotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZlJlYWRlcjsKLQlwcml2YXRlIEdDIGZHQzsKLQlwcml2YXRlIGludCBmTWF4V2lkdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxpbmU7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQlwcml2YXRlIGludCBmTGluZUxlbjsKLQlwcml2YXRlIEJyZWFrSXRlcmF0b3IgZkxpbmVCcmVha0l0ZXJhdG9yOwotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkZXIgdGhhdCBicmVha3MgYW4gaW5wdXQgdGV4dCB0byBmaXQgaW4gYSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICBSZWFkZXIgb2YgdGhlIGlucHV0IHRleHQKLQkgKiBAcGFyYW0gZ2MKLQkgKiAgICAgICAgICAgIFRoZSBncmFwaGljIGNvbnRleHQgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50bHkgdXNlZCBmb250IHNpemVzCi0JICogQHBhcmFtIG1heExpbmVXaWR0aAotCSAqICAgICAgICAgICAgVGhlIG1heCB3aWR0aCAocGl4ZXMpIHdoZXJlIHRoZSB0ZXh0IGhhcyB0byBmaXQgaW4KLQkgKi8KLQlwdWJsaWMgTGluZUJyZWFraW5nUmVhZGVyKFJlYWRlciByZWFkZXIsIEdDIGdjLCBpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLQkJZkdDID0gZ2M7Ci0JCWZNYXhXaWR0aCA9IG1heExpbmVXaWR0aDsKLQkJZk9mZnNldCA9IDA7Ci0JCWZMaW5lID0gbnVsbDsKLQkJZkxpbmVCcmVha0l0ZXJhdG9yID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQl9Ci0JLyoqCi0JICogSXMgZm9ybWF0dGVkIGxpbmUKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgYSBmb3JtYXR0ZWQgbGluZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9ybWF0dGVkTGluZSgpIHsKLQkJcmV0dXJuIGZMaW5lICE9IG51bGw7Ci0JfQotCS8qKgotCSAqIFJlYWRzIHRoZSBuZXh0IGxpbmUuIFRoZSBsZW5ndGhzIG9mIHRoZSBsaW5lIHdpbGwgbm90IGV4Y2VlZCB0aGUgZ2l2ZWQgbWF4aW11bSB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVhZExpbmUoU3RyaW5nIGluZGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZMaW5lID09IG51bGwpIHsKLQkJCVN0cmluZyBsaW5lID0gZlJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCBsaW5lTGVuID0gZkdDLnRleHRFeHRlbnQobGluZSkueDsKLQkJCWlmIChmTWF4V2lkdGggPiAtMSAmJiBsaW5lTGVuIDwgZk1heFdpZHRoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0JCQlmTGluZSA9IGxpbmU7Ci0JCQlmTGluZUJyZWFrSXRlcmF0b3Iuc2V0VGV4dChsaW5lKTsKLQkJCWZPZmZzZXQgPSAwOwotCQl9Ci0JCWludCBicmVha09mZnNldCA9IGZpbmROZXh0QnJlYWtPZmZzZXQoZk9mZnNldCwgaW5kZW50KTsKLQkJU3RyaW5nIHJlczsKLQkJaWYgKGJyZWFrT2Zmc2V0ICE9IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZPZmZzZXQsIGJyZWFrT2Zmc2V0KTsKLQkJCWZPZmZzZXQgPSBmaW5kV29yZEJlZ2luKGJyZWFrT2Zmc2V0KTsKLQkJCWlmIChmT2Zmc2V0ID09IGZMaW5lLmxlbmd0aCgpKSB7Ci0JCQkJZkxpbmUgPSBudWxsOwotCQkJfQotCQkJaWYgKGJyZWFrT2Zmc2V0ID09IDEgJiYgcmVzLmNoYXJBdCgwKSA9PSAnXHQnKSB7Ly8gYWRkZWQgdG8gcHJldmVudCBlbXB0eSBsaW5lCi0JCQkJcmV0dXJuICJcdCIgKyByZWFkTGluZShpbmRlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZPZmZzZXQpOwotCQkJZkxpbmUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCXB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkxpbmUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGxpbmUgPSBmUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlpZiAobGluZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJZkxpbmVMZW4gPSBsaW5lLmxlbmd0aCgpOwotCQkJaWYgKGZNYXhXaWR0aCA9PSAtMSB8fCBmTGluZUxlbiA8IGZNYXhXaWR0aCkgewotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCQkJZkxpbmUgPSBsaW5lOwotCQkJZk9mZnNldCA9IDA7Ci0JCX0KLQkJaW50IGVuZExlbiA9IGZPZmZzZXQgKyBmTWF4V2lkdGg7Ci0JCWlmIChlbmRMZW4gPiBmTGluZUxlbikKLQkJCWVuZExlbiA9IGZMaW5lTGVuOwotCQlTdHJpbmcgcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZPZmZzZXQsIGVuZExlbik7Ci0JCWZPZmZzZXQgPSBlbmRMZW47Ci0JCWlmIChmT2Zmc2V0ID49IGZMaW5lTGVuKSB7Ci0JCQlmTGluZSA9IG51bGw7Ci0JCQlmTGluZUxlbiA9IDA7Ci0JCX0KLQkJaWYgKHJlcy5jaGFyQXQoMCkgPT0gJ1x0Jykgey8vIGFkZGVkIHRvIHByZXZlbnQgZW1wdHkgbGluZQotCQkJcmV0dXJuICJcdCIgKyByZXM7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JLyoqCi0JICogRmluZCBuZXh0IGJyZWFqIG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBjdXJyT2Zmc2V0Ci0JICogQHBhcmFtIGluZGVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBmaW5kTmV4dEJyZWFrT2Zmc2V0KGludCBjdXJyT2Zmc2V0LCBTdHJpbmcgaW5kZW50KSB7Ci0JCWludCBjdXJyV2lkdGggPSBpbmRlbnQgIT0gbnVsbCA/IGZHQy50ZXh0RXh0ZW50KGluZGVudCkueCA6IDA7Ci0JCWludCBuZXh0T2Zmc2V0ID0gZkxpbmVCcmVha0l0ZXJhdG9yLmZvbGxvd2luZyhjdXJyT2Zmc2V0KTsKLQkJd2hpbGUgKG5leHRPZmZzZXQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQlTdHJpbmcgd29yZCA9IGZMaW5lLnN1YnN0cmluZyhjdXJyT2Zmc2V0LCBuZXh0T2Zmc2V0KTsKLQkJCWludCB3b3JkV2lkdGggPSBmR0MudGV4dEV4dGVudCh3b3JkKS54OwotCQkJaW50IG5leHRXaWR0aCA9IHdvcmRXaWR0aCArIGN1cnJXaWR0aDsKLQkJCWlmIChmTWF4V2lkdGggPiAtMSAmJiBuZXh0V2lkdGggPiBmTWF4V2lkdGgpIHsKLQkJCQlpZiAoY3VycldpZHRoID4gMCkgewotCQkJCQlyZXR1cm4gY3Vyck9mZnNldDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbmV4dE9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCQljdXJyV2lkdGggPSBuZXh0V2lkdGg7Ci0JCQljdXJyT2Zmc2V0ID0gbmV4dE9mZnNldDsKLQkJCW5leHRPZmZzZXQgPSBmTGluZUJyZWFrSXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXJldHVybiBuZXh0T2Zmc2V0OwotCX0KLQkvKioKLQkgKiBGaW5kIHdvcmQgYmVnaW4gaW5kZXgKLQkgKiAKLQkgKiBAcGFyYW0gaWR4Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGZpbmRXb3JkQmVnaW4oaW50IGlkeCkgewotCQl3aGlsZSAoaWR4IDwgZkxpbmUubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQoaWR4KSkpIHsKLQkJCWlkeCsrOwotCQl9Ci0JCXJldHVybiBpZHg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9pbnRlcm5hbC91aS9ob3Zlci9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4MTMyZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuaG92ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgZW5kPSBvZmYgKyBsZW47Ci0JCWZvciAoaW50IGk9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2g9IHJlYWQoKTsKLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCWlmIChpID09IG9mZikgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGkgLSBvZmY7Ci0JCQkJfQotCQkJfQotCQkJY2J1ZltpXT0gKGNoYXIpY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9CQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZWFkeSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqIEdldCBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2g9IHJlYWQoKSkgIT0gLTEpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2ludGVybmFsL3VpL2hvdmVyL1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvaG92ZXIvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmUwZjM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvaW50ZXJuYWwvdWkvaG92ZXIvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuaG92ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfREVMSU09IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZldhc1doaXRlU3BhY2U7Ci0JcHJpdmF0ZSBpbnQgZkNoYXJBZnRlcldoaXRlU3BhY2U7Ci0KLQkvKioKLQkgKiBUZWxscyB3aGV0aGVyIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHNraXBwZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZTa2lwV2hpdGVTcGFjZT0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBmUmVhZEZyb21CdWZmZXI7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcjsKLQlwcml2YXRlIGludCBmSW5kZXg7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICovCi0JcHJvdGVjdGVkIFN1YnN0aXR1dGlvblRleHRSZWFkZXIoUmVhZGVyIHJlYWRlcikgewotCQlmUmVhZGVyPSByZWFkZXI7Ci0JCWZCdWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZkluZGV4PSAwOwotCQlmUmVhZEZyb21CdWZmZXI9IGZhbHNlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZT0gLTE7Ci0JCWZXYXNXaGl0ZVNwYWNlPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0byBjb21wdXRlIHRoZSBzdWJzdGl0dXRpb24gZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYW5kCi0JICogaWYgbmVjZXNzYXJ5IHN1YnNlcXVlbnQgY2hhcmFjdGVycy4gVXNlIDxjb2RlPm5leHRDaGFyPC9jb2RlPgotCSAqIHRvIHJlYWQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uOwotCS8qKgotCSAqIEByZXR1cm4gdGhlIGludGVybmFsIHJlYWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVhZGVyIGdldFJlYWRlcigpIHsKLQkJcmV0dXJuIGZSZWFkZXI7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5leHRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRGcm9tQnVmZmVyPSAoZkJ1ZmZlci5sZW5ndGgoKSA+IDApOwotCQlpZiAoZlJlYWRGcm9tQnVmZmVyKSB7Ci0JCQljaGFyIGNoPSBmQnVmZmVyLmNoYXJBdChmSW5kZXgrKyk7Ci0JCQlpZiAoZkluZGV4ID49IGZCdWZmZXIubGVuZ3RoKCkpIHsKLQkJCQlmQnVmZmVyLnNldExlbmd0aCgwKTsKLQkJCQlmSW5kZXg9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gY2g7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgY2g9IGZDaGFyQWZ0ZXJXaGl0ZVNwYWNlOwotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJY2g9IGZSZWFkZXIucmVhZCgpOwotCQkJfQotCQkJaWYgKGZTa2lwV2hpdGVTcGFjZSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSkgewotCQkJCWRvIHsKLQkJCQkJY2g9IGZSZWFkZXIucmVhZCgpOwotCQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpY2gpKTsKLQkJCQlpZiAoY2ggIT0gLTEpIHsKLQkJCQkJZkNoYXJBZnRlcldoaXRlU3BhY2U9IGNoOwotCQkJCQlyZXR1cm4gJyAnOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZkNoYXJBZnRlcldoaXRlU3BhY2U9IC0xOwotCQkJfQotCQkJcmV0dXJuIGNoOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjOwotCQlkbyB7Ci0JCQljPSBuZXh0Q2hhcigpOwotCQkJd2hpbGUgKCFmUmVhZEZyb21CdWZmZXIpIHsKLQkJCQlTdHJpbmcgcz0gY29tcHV0ZVN1YnN0aXR1dGlvbihjKTsKLQkJCQlpZiAocyA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQlpZiAocy5sZW5ndGgoKSA+IDApCi0JCQkJCWZCdWZmZXIuaW5zZXJ0KDAsIHMpOwotCQkJCWM9IG5leHRDaGFyKCk7Ci0JCQl9Ci0KLQkJfSB3aGlsZSAoZlNraXBXaGl0ZVNwYWNlICYmIGZXYXNXaGl0ZVNwYWNlICYmIChjID09ICcgJykpOwotCQlmV2FzV2hpdGVTcGFjZT0gKGMgPT0gJyAnIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcbicpOwotCQlyZXR1cm4gYzsKLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5pby5SZWFkZXIjcmVhZHkoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZSZWFkZXIucmVhZHkoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5pby5DbG9zZWFibGUjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jbG9zZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCWZXYXNXaGl0ZVNwYWNlPSB0cnVlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZT0gLTE7Ci0JCWZCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQlmSW5kZXg9IDA7Ci0JfQotCS8qKiBTZXQgc2tpcCB3aGl0ZSBzcGFjZQotCSAqIEBwYXJhbSBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNraXBXaGl0ZXNwYWNlKGJvb2xlYW4gc3RhdGUpIHsKLQkJZlNraXBXaGl0ZVNwYWNlPSBzdGF0ZTsKLQl9Ci0JLyoqIElzIHNraXAgd2hpdGUgc3BhY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNTa2lwcGluZ1doaXRlc3BhY2UoKSB7Ci0JCXJldHVybiBmU2tpcFdoaXRlU3BhY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9JTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9JTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk0YTQxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvSU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQVW5pdmVyc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVycy5JSm9iQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5saXN0ZW5lcnMuSVNldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYW5hZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9JRCA9ICIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFURV9TRVRfVFlQRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX1NFVF9UWVBFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfU0VUX1RZUEUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9FTEVNRU5UX1RZUEUgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9FTEVNRU5UX1RZUEUgPSA0OwkKLQkKLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpOwotCS8qKiBHZXQgZWxlbWVudCBzaXplCi0JICogQHJldHVybiBzaXplIG9mIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKTsKLQkvKioKLQkgKiBjbGVhbiBhbGwgc2V0dGluZwotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0JLyoqIGluaXRpYWwgZWxlbWVudHMKLQkgKiBAcmV0dXJuIGZpcnN0IGVsZW1lbnQgbmFtZQotCSAqLwotCXB1YmxpYyBJUEVsZW1lbnQgaW5pdGlhbChJUFVuaXZlcnNlIHVuaXZlcnNlKTsKLQkvKiogR2V0IElFbGVtZW50SGFuZGxlcgotCSAqIEBwYXJhbSBpZCBlbGVtZW50IElECi0JICogQHJldHVybiBJRWxlbWVudEhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnRIYW5kbGVyIGdldEVsZW1lbnRIYW5kbGVyKFN0cmluZyBpZCk7Ci0JLyoqIEdldCBuYW1lIG9mIGVsZW1lbnQKLQkgKiBAcGFyYW0gaWQgZWxlbWVudCBJRAotCSAqIEByZXR1cm4gbmFtZSBvZiBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKFN0cmluZyBpZCk7Ci0JCi0JLyoqIEdldCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBlbGVtZW50Ci0JICogQHBhcmFtIGlkIGVsZW1lbnQgSUQKLQkgKiBAcmV0dXJuIGZ1bGx5IHF1YWxsaWZpZWQgbmFtZSBvZiBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoU3RyaW5nIGlkKTsKLQotCS8qKiBHZXQgY3VycmVudCBzZXQgSUQKLQkgKiBAcmV0dXJuIGN1cnJlbnQgc2V0IElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50U2V0SWQoKTsKLQkvKiogc2V0IGN1cnJlbnQgc2V0IElECi0JICogQHBhcmFtIHNldF9pZCBzZXQgSUQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50U2V0SWQoU3RyaW5nIHNldF9pZCk7Ci0JCi0JLy9zZXQgbGlzdGVuZXIKLQkvKiogQWRkIFNldCBMaXN0ZW5lcgotCSAqIEBwYXJhbSBzZXRMaXN0ZW5lciBJU2V0TGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXRMaXN0ZW5lcihJU2V0TGlzdGVuZXIgc2V0TGlzdGVuZXIpOwotCS8qKiBSZW1vdmUgU2V0IExpc3RlbmVyCi0JICogQHBhcmFtIHNldExpc3RlbmVyIElTZXRMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNldExpc3RlbmVyKElTZXRMaXN0ZW5lciBzZXRMaXN0ZW5lcik7Ci0JLyoqIEZpcmUgRXZlbnQgZm9yIHNldCBjaGFuZ2UKLQkgKiBAcGFyYW0gZXZlbnRUeXBlIHRoZSB0eXBlIG9mIGV2ZW50Ci0JICogQHBhcmFtIGVsZW1lbnRzIHRoZSBzZWxlY3RlZCBlbGVtZW50cwotCSAqIEBwYXJhbSBjdXJfc2V0IHRoZSBjdXJyZW50IHNldAotCSAqIEBwYXJhbSBwcmVfc2V0IHRoZSBwcmV2aW91cyBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU2V0RXZlbnQoaW50IGV2ZW50VHlwZSwgSUVsZW1lbnRbXSBlbGVtZW50cywgSUVsZW1lbnRTZXQgY3VyX3NldCwgSUVsZW1lbnRTZXQgcHJlX3NldCk7Ci0JLyoqIEFkZCBlbGVtZW50cyB0byBzZXQKLQkgKiBAcGFyYW0gZWxlbWVudHMgc2VsZWN0ZWQgZWxlbWVudHMKLQkgKiBAcGFyYW0gc2V0IFNldAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvU2V0KElFbGVtZW50W10gZWxlbWVudHMsIElFbGVtZW50U2V0IHNldCk7Ci0JLyoqIEFkZCBlbGVtZW50cyB0byBzZXQKLQkgKiBAcGFyYW0gZWxlbWVudHMgc2VsZWN0ZWQgZWxlbWVudHMKLQkgKiBAcGFyYW0gc2V0SUQgc2V0IElECi0JICogQHBhcmFtIGVsZW1lbnRIYW5kbGVyIElFbGVtZW50SGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvU2V0KElFbGVtZW50W10gZWxlbWVudHMsIFN0cmluZyBzZXRJRCwgSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyKTsKLQkvKiogQ3JlYXRlIGEgU2V0Ci0JICogQHBhcmFtIGVsZW1lbnRzIHNlbGVjdGVkIGVsZW1lbnRzCi0JICogQHBhcmFtIHNldElEIHNldCBJRAotCSAqIEBwYXJhbSBzZXROYW1lIHNldCBOYW1lCi0JICogQHBhcmFtIGVsZW1lbnRIYW5kbGVyIElFbGVtZW50SGFuZGxlcgotCSAqIEByZXR1cm4gc2V0IElECi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXQoSUVsZW1lbnRbXSBlbGVtZW50cywgU3RyaW5nIHNldElELCBTdHJpbmcgc2V0TmFtZSwgSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyKTsKLQkvKiogUmVtb3ZlIFNldAotCSAqIEBwYXJhbSBzZXRJRCBzZXQgSUQKLQkgKiBAcGFyYW0gZWxlbWVudEhhbmRsZXIgSUVsZW1lbnRIYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2V0KFN0cmluZyBzZXRJRCwgSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyKTsKLQkvKiogUmVtb3ZlIGVsZW1lbnRzIGluIHNwZWNpZmljIFNldAotCSAqIEBwYXJhbSBlbGVtZW50cyBzZWxlY3RlZCBlbGVtZW50cwotCSAqIEBwYXJhbSBzZXRJRCBzZXQgSUQKLQkgKiBAcGFyYW0gZWxlbWVudEhhbmRsZXIgSUVsZW1lbnRIYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVNldChJRWxlbWVudFtdIGVsZW1lbnRzLCBTdHJpbmcgc2V0SUQsIElFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlcik7Ci0JCi0JLyoqIEFkZCBqb2IgbGlzdGVuZXIKLQkgKiBAcGFyYW0gam9iTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRKb2JDaGFuZ2VkTGlzdGVuZXIoSUpvYkNoYW5nZWRMaXN0ZW5lciBqb2JMaXN0ZW5lcik7Ci0JLyoqIFJlbW92ZSBqb2IgbGlzdGVuZXIKLQkgKiBAcGFyYW0gam9iTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2JDaGFuZ2VkTGlzdGVuZXIoSUpvYkNoYW5nZWRMaXN0ZW5lciBqb2JMaXN0ZW5lcik7Ci0JLyoqIEZpcmUgam9iIGV2ZW50IHdoZW4gam9iIGlzIGNoYW5nZWQKLQkgKiBAcGFyYW0gdHlwZSBqb2IgY2hhbmdlIHR5cGUgb3IgcmVtb3ZlIHR5cGUKLQkgKiBAcGFyYW0gY3VyX2ppZAotCSAqIEBwYXJhbSBwcmVfamlkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUpvYkNoYW5nZWRFdmVudChpbnQgdHlwZSwgU3RyaW5nIGN1cl9qaWQsIFN0cmluZyBwcmVfamlkKTsKLQkvL2pvYgotCQotCS8vaW1hZ2UKLQkvKiogR2V0IGVsZW1lbnQgc3RhdHVzCi0JICogQHBhcmFtIGVsZW1lbnQgSUVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXggSUVsZW1lbnQgaW5kZXggcG9zaXRpb24KLQkgKiBAcmV0dXJuIGVsZW1lbnQgc3RhdHVzCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoSUVsZW1lbnQgZWxlbWVudCwgaW50IGluZGV4KTsKLQkvKiogR2V0IGVsZW1lbnQgc3RhdHVzCi0JICogQHBhcmFtIGlkIEVsZW1lbnQgSUQKLQkgKiBAcmV0dXJuIGVsZW1lbnQgc3RhdHVzCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoU3RyaW5nIGlkKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvSVBUUFVJQ29uc3RhbnRzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL0lQVFBVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2EwOGJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvSVBUUFVJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBUUFVJQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBQVFBVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUExVR0lOX0lEICsgIi4iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUEFSQUxMRUxNQUNISU5FUyA9IFBSRUZJWCArICJ2aWV3cy5wYXJhbGxlbE1hY2hpbmVzVmlldyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19QQVJBTExFTEpPQlMgPSBQUkVGSVggKyAidmlld3MucGFyYWxsZWxKb2JzVmlldyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19KT0JTTElTVCA9IFBSRUZJWCArICJ2aWV3cy5Kb2JzTGlzdFZpZXciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUEFSQUxMRUxQcm9jZXNzID0gUFJFRklYICsgInZpZXdzLnBhcmFsbGVsUHJvY2Vzc1ZpZXciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVTT1VSQ0VNQU5BR0VSID0gUFJFRklYICsgInZpZXdzLnJlc291cmNlTWFuYWdlclZpZXciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1fUkVNT1RFX1NFUlZJQ0VTID0gUFJFRklYICsgInJlbW90ZVNlcnZpY2VzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRV9SVU4gPSBQUkVGSVggKyAiUFRQUnVuUGVyc3BlY3RpdmUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX1BBR0UgPSBQUkVGSVggKyAiUFNlYXJjaFBhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9SRVNVTFRfUEFHRSA9IFBSRUZJWCArICJQU2VhcmNoUmVzdWx0UGFnZSI7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFVCA9IFBSRUZJWCArICJhY3Rpb25TZXRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0hPV19MRUdFTkQgPSBQUkVGSVggKyAiYWN0aW9ucy5zaG93TGVnZW5kQWN0aW9uIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVUlOQVZJR0FUT1JHUk9VUCA9ICJuYXZpZ2F0b3Jncm91cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVJQUNUSU9OR1JPVVAgPSAiYWN0aW9uZ3JvdXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVSVNFVEdST1VQID0gInNldGdyb3VwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVUlDSEFOR0VTRVRHUk9VUCA9ICJjaGFuZ2VzZXRncm91cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVJVklFV0dST1VQID0gInZpZXdncm91cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVJWk9PTUdST1VQID0gInpvb21ncm91cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVJRU1QVFlHUk9VUCA9ICJlbXB0eWdyb3VwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVUlKT0JHUk9VUCA9ICJqb2Jncm91cCI7Ci0gCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX0VSUk9SID0gMTUwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1FVRVNUSU9OID0gMTAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfSU5GTyA9IDEwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX0VSUk9SID0gMTAwMDI7Ci0JCi0JLy9wcmVmZXJlbmNlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUNPTl9TUEFDSU5HX1ggPSAiaWNvbl9zcGFjaW5nX3giOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUNPTl9TUEFDSU5HX1kgPSAiaWNvbl9zcGFjaW5nX3kiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUNPTl9XSURUSCA9ICJpY29uX3dpZHRoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lDT05fSEVJR0hUID0gImljb25faGVpZ2h0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1RPT0xUSVBfU0hPV0FMTFRJTUUgPSAidHRfc2hvd19hbGxfdGltZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19UT09MVElQX1RJTUVPVVQgPSAidHRfdGltZW91dCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19UT09MVElQX0lTV1JBUCA9ICJ0dF9pc3dhcCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXX0lDT05fU1BBQ0lOR19YID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJRVdfSUNPTl9TUEFDSU5HX1kgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklFV19JQ09OX1dJRFRIID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXX0lDT05fSEVJR0hUID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfVklFV19UT09MVElQID0gNTAwMDsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvTGVnZW5kRGlhbG9nLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL0xlZ2VuZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWNkZDRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvTGVnZW5kRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLlBhcmFsbGVsSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBMZWdlbmREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgCi17Ci0JcHJpdmF0ZSBTdHJpbmcgcm1TdGF0ZVRleHRbXSA9IHsKLQkJIlNUQVJUSU5HIiwKLQkJIlNUQVJURUQiLAotCQkiU1RPUFBJTkciLAotCQkiU1RPUFBFRCIsCi0JCSJTVVNQRU5ERUQiLAotCQkiRVJST1IiCi0JfTsKLQkKLQlwcml2YXRlIFN0cmluZyBtYWNoaW5lU3RhdGVUZXh0W10gPSB7Ci0JCSJVUCIsCi0JCSJET1dOIiwKLQkJIkFMRVJUIiwKLQkJIkVSUk9SIiwKLQkJIlVOS05PV04iCi0JfTsKLQotCXByaXZhdGUgU3RyaW5nIGpvYlN0YXRlVGV4dFtdID0gewotCQkiUEVORElORyIsCi0JCSJTVEFSVEVEIiwKLQkJIlJVTk5JTkciLAotCQkiVEVSTUlOQVRFRCIsCi0JCSJTVVNQRU5ERUQiLAotCQkiRVJST1IiLAotCQkiVU5LTk9XTiIJCQotCX07Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbm9kZVN0YXRlVGV4dFtdID0gewotCQkiVVAiLAotCQkiRE9XTiIsCi0JCSJFUlJPUiIsCi0JCSJVTktOT1dOIiwKLQkJIlVTRVIgRVhDTFVTSVZFIiwKLQkJIlVTRVIgU0hBUkVEIiwKLQkJIk9USEVSIEVYQ0xVU0lWRSIsCi0JCSJPVEhFUiBTSEFSRUQiLAotCQkiUFJPQ0VTUyBSVU5OSU5HIiwKLQkJIlBST0NFU1MgVEVSTUlOQVRFRCIsCi0JfTsKLQkKLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzU3RhdGVUZXh0W10gPSB7Ci0JCSJTVEFSVElORyIsCi0JCSJSVU5OSU5HIiwKLQkJIkVYSVRFRCBOT1JNQUxMWSIsCi0JCSJFWElURUQgV0lUSCBTSUdOQUwiLAotCQkiU1VTUEVOREVEIiwKLQkJIkVSUk9SIiwKLQkJIlVOS05PV04iCi0JfTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIExlZ2VuZERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJLyogd2UgRE9OJ1Qgd2FudCB0aGlzIHRvIGJlIG1vZGFsICovCi0JCXRoaXMocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuTk9ORSk7Ci0JfQotCQotCXB1YmxpYyBMZWdlbmREaWFsb2coU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXNldFRleHQoIkxlZ2VuZCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIG9wZW4oKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGdldFBhcmVudCgpLCBnZXRTdHlsZSgpKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRUZXh0KCkpOwotCQljcmVhdGVDb250ZW50cyhzaGVsbCk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCk7Ci0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoZmluYWwgU2hlbGwgc2hlbGwpIHsKLQkJR3JpZExheW91dCBncmlkID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZC5udW1Db2x1bW5zID0gMjsKLQkJc2hlbGwuc2V0TGF5b3V0KGdyaWQpOwotCQkKLQkJLyogdGhlIFJNIGJveCAqLwotCQlHcm91cCBib3ggPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlib3guc2V0VGV4dCgiUmVzb3VyY2UgTWFuYWdlciBJY29ucyIpOwotCQlGaWxsTGF5b3V0IGZpbGwgPSBuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpOwotCQlmaWxsLm1hcmdpbkhlaWdodCA9IDU7Ci0JCWZpbGwubWFyZ2luV2lkdGggPSA1OwotCQlib3guc2V0TGF5b3V0KGZpbGwpOwotCQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJYm94LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBybVN0YXRlVGV4dC5sZW5ndGg7IGkrKykgewotCQkJLyogb25lIGhvcml6b250YWwgYm94ICovCi0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoYm94LCBTV1QuTk9ORSk7Ci0JCQlSb3dMYXlvdXQgciA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJCXIud3JhcCA9IHRydWU7Ci0JCQlyLnBhY2sgPSB0cnVlOwotCQkJci5qdXN0aWZ5ID0gZmFsc2U7Ci0JCQlyLm1hcmdpbkJvdHRvbSA9IDA7Ci0JCQlyLm1hcmdpbkxlZnQgPSA1OwotCQkJci5tYXJnaW5SaWdodCA9IDU7Ci0JCQlyLm1hcmdpblRvcCA9IDA7Ci0JCQlyLnNwYWNpbmcgPSAxMDsKLQkJCWMuc2V0TGF5b3V0KHIpOwotCQkJQ0xhYmVsIGIgPSBuZXcgQ0xhYmVsKGMsIFNXVC5GTEFUKTsKLQkJCWIuc2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMucm1JbWFnZXNbaV0pOwotCQkJQ0xhYmVsIGwgPSBuZXcgQ0xhYmVsKGMsIFNXVC5MRUZUKTsKLQkJCWwuc2V0VGV4dChybVN0YXRlVGV4dFtpXSk7Ci0JCX0KLQkJCi0JCS8qIHRoZSBtYWNoaW5lcyBib3ggKi8KLQkJYm94ID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJYm94LnNldFRleHQoIk1hY2hpbmUgSWNvbnMiKTsKLQkJZmlsbCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCk7Ci0JCWZpbGwubWFyZ2luSGVpZ2h0ID0gNTsKLQkJZmlsbC5tYXJnaW5XaWR0aCA9IDU7Ci0JCWJveC5zZXRMYXlvdXQoZmlsbCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJYm94LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYWNoaW5lU3RhdGVUZXh0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkvKiBvbmUgaG9yaXpvbnRhbCBib3ggKi8KLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShib3gsIFNXVC5OT05FKTsKLQkJCVJvd0xheW91dCByID0gbmV3IFJvd0xheW91dCgpOwotCQkJci53cmFwID0gdHJ1ZTsKLQkJCXIucGFjayA9IHRydWU7Ci0JCQlyLmp1c3RpZnkgPSBmYWxzZTsKLQkJCXIubWFyZ2luQm90dG9tID0gMDsKLQkJCXIubWFyZ2luTGVmdCA9IDU7Ci0JCQlyLm1hcmdpblJpZ2h0ID0gNTsKLQkJCXIubWFyZ2luVG9wID0gMDsKLQkJCXIuc3BhY2luZyA9IDEwOwotCQkJYy5zZXRMYXlvdXQocik7Ci0JCQlDTGFiZWwgYiA9IG5ldyBDTGFiZWwoYywgU1dULkZMQVQpOwotCQkJYi5zZXRJbWFnZShQYXJhbGxlbEltYWdlcy5tYWNoaW5lSW1hZ2VzW2ldKTsKLQkJCUNMYWJlbCBsID0gbmV3IENMYWJlbChjLCBTV1QuTEVGVCk7Ci0JCQlsLnNldFRleHQobWFjaGluZVN0YXRlVGV4dFtpXSk7Ci0JCX0KLQkJCi0JCS8qIHRoZSBub2RlIGJveCAqLwotCQlib3ggPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlib3guc2V0VGV4dCgiTm9kZSBJY29ucyIpOwotCQlHcmlkTGF5b3V0IGcgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQkJYm94LnNldExheW91dChnKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlib3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvKiBsYXlvdXQgY29sdW1uIGZpcnN0IGluc3RlYWQgb2Ygcm93IGZpcnN0ICovCi0JCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZVN0YXRlVGV4dC5sZW5ndGgvMjsgaisrKSB7Ci0JCQlmb3IgKGludCBpID0gMCA7IGkgPCAyOyBpKyspIHsKLQkJCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoYm94LCBTV1QuTk9ORSk7Ci0JCQkJUm93TGF5b3V0IHIgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCQkJci53cmFwID0gdHJ1ZTsKLQkJCQlyLnBhY2sgPSB0cnVlOwotCQkJCXIuanVzdGlmeSA9IGZhbHNlOwotCQkJCXIubWFyZ2luQm90dG9tID0gMDsKLQkJCQlyLm1hcmdpbkxlZnQgPSA1OwotCQkJCXIubWFyZ2luUmlnaHQgPSA1OwotCQkJCXIubWFyZ2luVG9wID0gMDsKLQkJCQlyLnNwYWNpbmcgPSAxMDsKLQkJCQljLnNldExheW91dChyKTsKLQkJCQlDTGFiZWwgYiA9IG5ldyBDTGFiZWwoYywgU1dULkZMQVQpOwotCQkJCWIuc2V0SW1hZ2UoUGFyYWxsZWxJbWFnZXMubm9kZUltYWdlc1tpKm5vZGVTdGF0ZVRleHQubGVuZ3RoLzIgKyBqXVswXSk7Ci0JCQkJQ0xhYmVsIGwgPSBuZXcgQ0xhYmVsKGMsIFNXVC5MRUZUKTsKLQkJCQlsLnNldFRleHQobm9kZVN0YXRlVGV4dFtpKm5vZGVTdGF0ZVRleHQubGVuZ3RoLzIgKyBqXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIHRoZSBqb2IgYm94ICovCi0JCWJveCA9IG5ldyBHcm91cChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWJveC5zZXRUZXh0KCJKb2IgSWNvbnMiKTsKLQkJZmlsbCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCk7Ci0JCWZpbGwubWFyZ2luSGVpZ2h0ID0gNTsKLQkJZmlsbC5tYXJnaW5XaWR0aCA9IDU7Ci0JCWJveC5zZXRMYXlvdXQoZmlsbCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJYm94LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JTdGF0ZVRleHQubGVuZ3RoOyBpKyspIHsKLQkJCS8qIG9uZSBob3Jpem9udGFsIGJveCAqLwotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKGJveCwgU1dULk5PTkUpOwotCQkJUm93TGF5b3V0IHIgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCQlyLndyYXAgPSB0cnVlOwotCQkJci5wYWNrID0gdHJ1ZTsKLQkJCXIuanVzdGlmeSA9IGZhbHNlOwotCQkJci5tYXJnaW5Cb3R0b20gPSAwOwotCQkJci5tYXJnaW5MZWZ0ID0gNTsKLQkJCXIubWFyZ2luUmlnaHQgPSA1OwotCQkJci5tYXJnaW5Ub3AgPSAwOwotCQkJci5zcGFjaW5nID0gMTA7Ci0JCQljLnNldExheW91dChyKTsKLQkJCUNMYWJlbCBiID0gbmV3IENMYWJlbChjLCBTV1QuRkxBVCk7Ci0JCQliLnNldEltYWdlKFBhcmFsbGVsSW1hZ2VzLmpvYkltYWdlc1tpXVswXSk7Ci0JCQlDTGFiZWwgbCA9IG5ldyBDTGFiZWwoYywgU1dULkxFRlQpOwotCQkJbC5zZXRUZXh0KGpvYlN0YXRlVGV4dFtpXSk7Ci0JCX0KLQkJCQkKLQkJLyogdGhlIHByb2Nlc3MgYm94ICovCi0JCWJveCA9IG5ldyBHcm91cChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWJveC5zZXRUZXh0KCJQcm9jZXNzIEljb25zIik7Ci0JCWZpbGwgPSBuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpOwotCQlmaWxsLm1hcmdpbkhlaWdodCA9IDU7Ci0JCWZpbGwubWFyZ2luV2lkdGggPSA1OwotCQlib3guc2V0TGF5b3V0KGZpbGwpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWJveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzU3RhdGVUZXh0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkvKiBvbmUgaG9yaXpvbnRhbCBib3ggKi8KLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShib3gsIFNXVC5OT05FKTsKLQkJCVJvd0xheW91dCByID0gbmV3IFJvd0xheW91dCgpOwotCQkJci53cmFwID0gdHJ1ZTsKLQkJCXIucGFjayA9IHRydWU7Ci0JCQlyLmp1c3RpZnkgPSBmYWxzZTsKLQkJCXIubWFyZ2luQm90dG9tID0gMDsKLQkJCXIubWFyZ2luTGVmdCA9IDU7Ci0JCQlyLm1hcmdpblJpZ2h0ID0gNTsKLQkJCXIubWFyZ2luVG9wID0gMDsKLQkJCXIuc3BhY2luZyA9IDEwOwotCQkJYy5zZXRMYXlvdXQocik7Ci0JICAgICAgICBDTGFiZWwgYiA9IG5ldyBDTGFiZWwoYywgU1dULkZMQVQpOwotCQkJYi5zZXRJbWFnZShQYXJhbGxlbEltYWdlcy5wcm9jSW1hZ2VzW2ldWzBdKTsKLQkJCUNMYWJlbCBsID0gbmV3IENMYWJlbChjLCBTV1QuTEVGVCk7Ci0JCQlsLnNldFRleHQocHJvY2Vzc1N0YXRlVGV4dFtpXSk7Ci0JCX0KLQkJCi0gICAgICAgIEJ1dHRvbiBjbG9zZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICAgICAgY2xvc2Uuc2V0VGV4dCgiQ2xvc2UiKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljbG9zZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIGNsb3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgCQlzaGVsbC5jbG9zZSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHNoZWxsLnNldERlZmF1bHRCdXR0b24oY2xvc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvT3V0cHV0Q29uc29sZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9PdXRwdXRDb25zb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTUwMWEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9PdXRwdXRDb25zb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5Db25zb2xlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5NZXNzYWdlQ29uc29sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLk1lc3NhZ2VDb25zb2xlU3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIE91dHB1dENvbnNvbGUgZXh0ZW5kcyBNZXNzYWdlQ29uc29sZSB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlQ29uc29sZVN0cmVhbSBtZXNzYWdlT3V0cHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIFRocmVhZCB0aHJlYWQgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDgxOTI7Ci0JcHJpdmF0ZSBib29sZWFuIGlzS2lsbGVkID0gZmFsc2U7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGNvbnNvbGUgd2luZG93Ci0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICovCi0JcHVibGljIE91dHB1dENvbnNvbGUoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMobmFtZSwgbnVsbCwgaW5wdXRTdHJlYW0pOwotCX0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGNvbnNvbGUgd2luZG93Ci0JICogQHBhcmFtIGltYWdlRGVzY3JpcHRvciBpbWFnZSBvZiBjb25zb2xlIHdpbmRvdwotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBPdXRwdXRDb25zb2xlKFN0cmluZyBuYW1lLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlzdXBlcihuYW1lLCBpbWFnZURlc2NyaXB0b3IpOwotCQl0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCW1lc3NhZ2VPdXRwdXRTdHJlYW0gPSBuZXdNZXNzYWdlU3RyZWFtKCk7Ci0JCXN0YXJ0TW9uaXRvck91dHB1dCgpOwotCX0KLQkvKiogU3RhcnQgbW9uaXRvcmluZyBvdXRwdXQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydE1vbml0b3JPdXRwdXQoKSB7Ci0JCWlmICh0aHJlYWQgPT0gbnVsbCkgewotCQkJQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29uc29sZU1hbmFnZXIoKS5hZGRDb25zb2xlcyhuZXcgSUNvbnNvbGVbXSB7IHRoaXMgfSk7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZWFkKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWtpbGwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQl0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlLCAiT3V0cHV0IENvbnNvbGUgTW9uaXRvciIpOwotCQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0JLyoqIENsb3NlIGNvbnNvbGUgd2luZG93Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0aHJlYWQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljbG9zZVN0cmVhbSgpOwotCQkJCW1lc3NhZ2VPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl0aHJlYWQuaW50ZXJydXB0KCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRocmVhZCA9IG51bGw7Ci0JCQkJaXNLaWxsZWQgPSB0cnVlOwotCQkJCUNvbnNvbGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnNvbGVNYW5hZ2VyKCkucmVtb3ZlQ29uc29sZXMobmV3IElDb25zb2xlW10geyB0aGlzIH0pOwotCQkJfQotCQl9Ci0JfQotCS8qKiBBcHBlbmQgdGV4dCBpbnRvIGNvbnNvbGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCW1lc3NhZ2VPdXRwdXRTdHJlYW0ucHJpbnQodGV4dCk7Ci0JfQotCS8qKiBLaWxsIGNvbnNvbGUgd2luZG93Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQga2lsbCgpIHsKLQkJdHJ5IHsKLQkJCWNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLyoqIENsb3NlIGNvbnNvbGUgaW5wdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJaXNLaWxsZWQgPSB0cnVlOwotCQl9Ci0JfQotCS8qKiBSZWFkIGZyb20gaW5wdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotCQlpbnQgcmVhZCA9IDA7Ci0JCXdoaWxlIChyZWFkID49IDApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzS2lsbGVkKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZWFkID0gaW5wdXRTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJaWYgKHJlYWQgPiAwKSB7Ci0JCQkJCWFwcGVuZFRleHQobmV3IFN0cmluZyhieXRlcywgMCwgcmVhZCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQljbG9zZVN0cmVhbSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvUFRQVUlQbHVnaW4uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvUFRQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0ODg4MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL1BUUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hZGFwdGVycy5Qcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hZGFwdGVycy5Xb3JrYmVuY2hBZGFwdGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5jb25zb2xlcy5Db25zb2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubWFuYWdlcnMuQWJzdHJhY3RVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1hbmFnZXJzLkpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1hbmFnZXJzLk1hY2hpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBQVFAgdXNlciBpbnRlcmZhY2UgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgUFRQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnVpIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJybUNvbmZpZ3VyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotICAgIAotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQVFBVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIHdvcmtiZW5jaCBwYWdlIGZyb20gdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93LgotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudGx5IGFjdGl2ZSB3b3JrYmVuY2ggcGFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3ID0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3ICE9IG51bGwpIHsKLQkJCXJldHVybiB3LmdldEFjdGl2ZVBhZ2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBUUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheT0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXk7CQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcGx1Z2luICh1c2VkIGZvciBsb2dnaW5nKQotCSAqIAotCSAqIEByZXR1cm4gdW5pcXVlIGlkZW50aWZpZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQlyZXR1cm4gUExVR0lOX0lEOwotCi0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlIGEgbG9nIG1lc3NhZ2UgZ2l2ZW4gYW4gSVN0YXR1cyBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIElTdGF0dXMgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSBsb2cgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtc2cgbWVzc2FnZSB0byBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIGxvZyBtZXNzYWdlIGZvciBhbiBleGNlcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZSBleGNlcHRpb24gdXNlZCB0byBnZW5lcmF0ZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElQVFBVSUNvbnN0YW50cy5JTlRFUk5BTF9FUlJPUiwgIkludGVybmFsIEVycm9yIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3Rvcnk+IGNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeT4oKTsKLQkKLQlwcml2YXRlIEFic3RyYWN0VUlNYW5hZ2VyIG1hY2hpbmVNYW5hZ2VyID0gbnVsbDsJCi0JCi0JcHJpdmF0ZSBBYnN0cmFjdFVJTWFuYWdlciBqb2JNYW5hZ2VyID0gbnVsbDsKLQkKLQlwcml2YXRlIENvbnNvbGVNYW5hZ2VyIGNvbnNvbGVNYW5hZ2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgUFRQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGpvYiBtYW5hZ2VyIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiBqb2IgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFVJTWFuYWdlciBnZXRKb2JNYW5hZ2VyKCkgewotCQlyZXR1cm4gam9iTWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYWNoaW5lIG1hbmFnZXIgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIG1hY2hpbmUgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFVJTWFuYWdlciBnZXRNYWNoaW5lTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1hY2hpbmVNYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHdpemFyZCBwYWdlIGZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgbWFuYWdlciBmYWN0b3J5Ci0JICogCi0JICogQHBhcmFtIGZhY3RvcnkgcmVzb3VyY2UgbWFuYWdlciBmYWN0b3J5Ci0JICogQHJldHVybiBmYWN0b3J5IGZvciBjcmVhdGluZyB3aXphcmQgcGFnZXMgZm9yIHRoaXMgcmVzb3VyY2UgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSBnZXRSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeShJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkpIGNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yaWVzLmdldChmYWN0b3J5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCURlYnVnVXRpbC5jb25maWd1cmVQbHVnaW5EZWJ1Z09wdGlvbnMoKTsKLQkJcmVnaXN0ZXJBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCXJldHJpZXZlQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3JpZXMoKTsKLQkJbWFjaGluZU1hbmFnZXIgPSBuZXcgTWFjaGluZU1hbmFnZXIoKTsKLQkJam9iTWFuYWdlciA9IG5ldyBKb2JNYW5hZ2VyKCk7Ci0JCWNvbnNvbGVNYW5hZ2VyID0gbmV3IENvbnNvbGVNYW5hZ2VyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQltYWNoaW5lTWFuYWdlci5zaHV0ZG93bigpOwotCQlqb2JNYW5hZ2VyLnNodXRkb3duKCk7Ci0JCWNvbnNvbGVNYW5hZ2VyLnNodXRkb3duKCk7Ci0JCW1hY2hpbmVNYW5hZ2VyID0gbnVsbDsKLQkJam9iTWFuYWdlciA9IG51bGw7Ci0JCWNvbnNvbGVNYW5hZ2VyID0gbnVsbDsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgYWRhcHRlciBmYWN0b3JpZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlJQWRhcHRlck1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0JCUlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFByb3BlcnR5QWRhcHRlckZhY3RvcnkoKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKGZhY3RvcnksIElQRWxlbWVudC5jbGFzcyk7Ci0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhmYWN0b3J5LCBJRWxlbWVudC5jbGFzcyk7Ci0JCWZhY3RvcnkgPSBuZXcgV29ya2JlbmNoQWRhcHRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhmYWN0b3J5LCBJUEVsZW1lbnQuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZSBhbmQgbG9hZCB3aXphcmQgcGFnZSBmYWN0b3J5IGV4dGVuc2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmV0cmlldmVDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcmllcygpIHsKLSAgICAJY29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3JpZXMuY2xlYXIoKTsKLSAgICAJCi0gICAgCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJZmluYWwgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQotCQlmb3IgKGludCBpZXh0ID0gMDsgaWV4dCA8IGV4dGVuc2lvbnMubGVuZ3RoOyArK2lleHQpIHsKLQkJCWZpbmFsIElFeHRlbnNpb24gZXh0ID0gZXh0ZW5zaW9uc1tpZXh0XTsKLQkJCQotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQotCQkJZm9yIChpbnQgaT0wOyBpPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBlbGVtZW50c1tpXTsKLQkJCQl0cnkgewotCQkJCQlSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSBmYWN0b3J5ID0gKFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5KSBjZS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCQlDbGFzcyBybUZhY3RvcnlDbGFzcyA9IGZhY3RvcnkuZ2V0Uk1GYWN0b3J5Q2xhc3MoKTsKLQkJCQkJY29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3JpZXMucHV0KHJtRmFjdG9yeUNsYXNzLmdldE5hbWUoKSwgZmFjdG9yeSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL1VJTWVzc2FnZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9VSU1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYWZhMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL1VJTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gDQotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgDQotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgDQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIA0KLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgDQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIA0KLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCANCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCANCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuDQotICogDQotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBMQS1DQyAwNC0xMTUNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aTsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi1wdWJsaWMgY2xhc3MgVUlNZXNzYWdlIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9TWVNURU1fSk9CX05BTUUgPSAiUmVmcmVzaCBydW50aW1lIHN5c3RlbSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IFBUUFVJUGx1Z2luLlBMVUdJTl9JRCArICIuVUlNZXNzYWdlcyI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7DQotDQotICAgIC8qKiBHZXQgc3RyaW5nDQotICAgICAqIEBwYXJhbSBrZXkNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgew0KLQkJLy8gTm8gcG9pbnQgdHJ5aW5nIGlmIGJ1bmRsZSBpcyBudWxsIGFzIGV4Y2VwdGlvbnMgYXJlIGNvc3RseQ0KLQkJaWYgKFJFU09VUkNFX0JVTkRMRSAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsNCi0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7DQotCQkJCXJldHVybiAiIyIgKyBrZXkgKyAiIyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIElmIHdlIGdldCBoZXJlLCB0aGVuIGJ1bmRsZSBpcyBudWxsLg0KLQkJcmV0dXJuICIjIiArIGtleSArICIjIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkUmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgew0KLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIG5ldyBTdHJpbmdbXXthcmd9KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKSB7DQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9VSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL1VJTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkNzU5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL1VJTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0jIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0jIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0jIAotIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgTEEtQ0MgMDQtMTE1Ci0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIENsZW1lbnQgQ2h1Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ29tbW9uVGFiLmNvbW1vbi5FeGNlcHRpb25fb2NjdXJyZWRfcmVhZGluZ19jb25maWd1cmF0aW9uX0VYQ0VQVElPTj1DYW5ub3QgcmVhZCBjb25maWd1cmF0aW9uCi1UYWIuY29tbW9uLiZCcm93c2VfMT0mQnJvd3NlCi1UYWIuY29tbW9uLkImcm93c2VfMj1CJnJvd3NlCi0KLQotI1BNYWluVGFiCi1QTWFpblRhYi5NYWluPU1haW4KLVBNYWluVGFiLiZQcm9qZWN0X0xhYmVsPVBhcmFsbGVsICZQcm9qZWN0OgotUE1haW5UYWIuJkFwcGxpY2F0aW9uX0xhYmVsPSZBcHBsaWNhdGlvbiBwcm9ncmFtOgotUE1haW5UYWIuU3Qmb3BfaW5fbWFpbj1TdCZvcCBpbiBtYWluCi1QTWFpblRhYi5Qcm9qZWN0X1NlbGVjdGlvbl9UaXRsZT1Qcm9qZWN0IFNlbGVjdGlvbgotUE1haW5UYWIuUHJvamVjdF9TZWxlY3Rpb25fTWVzc2FnZT1DaG9vc2Ugb25lIG9mIHByb2plY3RzCi1QTWFpblRhYi5Qcm9qZWN0X3JlcXVpcmVkPVBsZWFzZSBzZWxlY3QgdGhlIHByb2plY3QgZmlyc3QKLVBNYWluVGFiLkVudGVyX3Byb2plY3RfYmVmb3JlX2Jyb3dzaW5nX2Zvcl9wcm9ncmFtPUVudGVyIHByb2plY3QgYmVmb3JlIGJyb3dpbmcgZm9yIHByb2dyYW0KLVBNYWluVGFiLlByb2dyYW1fc2VsZWN0aW9uPVByb2dyYW0gU2VsZWN0aW9uCi1QTWFpblRhYi5DaG9vc2VfcHJvZ3JhbV90b19ydW5fZnJvbV9OQU1FPUNob29zZSBwcm9ncmFtIHRvIHJ1bgotUE1haW5UYWIuU2VsZWN0aW9uX211c3RfYmVfZmlsZT1TZWxlY3Rpb24gbXVzdCBiZSBmaWxlCi1QTWFpblRhYi5JbGxlZ2FsX3Byb2plY3Q9SWxsZWdhbCBwcm9qZWN0IG5hbWU6IHswfQotUE1haW5UYWIuUHJvamVjdF9ub3RfZXhpdHM9UHJvamVjdCB7MH0gZG9lcyBub3QgZXhpc3QKLVBNYWluVGFiLlByb2plY3RfaXNfY2xvc2VkPVByb2plY3QgezB9IGlzIGNsb3NlZAotUE1haW5UYWIuQXBwbGljYXRpb25fcHJvZ3JhbV9ub3Rfc3BlY2lmaWVkPUFwcGxpY2F0aW9uIHByb2dyYW0gaXMgbm90IHNwZWNpZmllZAotCi0KLSNQYXJhbGxlbFRhYgotUGFyYWxsZWxUYWIuUGFyYWxsZWw9UGFyYWxsZWwKLVBhcmFsbGVsVGFiLlN0YXJ0dXBMYWJlbD1TdGFydHVwOgotUGFyYWxsZWxUYWIuUGFyYWxsZWxfT3B0aW9ucz1QYXJhbGxlbCBPcHRpb25zCi1QYXJhbGxlbFRhYi5OdW1iZXJfT2ZfUHJvY2Vzc2VzPU51bWJlciBvZiAmcHJvY2Vzc2VzOgotUGFyYWxsZWxUYWIuTmV0d29ya1R5cGVMYWJlbD1OZXR3b3JrICZ0eXBlOgotUGFyYWxsZWxUYWIuUHJvY2Vzc2VzX1Blcl9Ob2RlPVByb2Nlc3NlcyBwZXIgbiZvZGU6Ci1QYXJhbGxlbFRhYi5GaXJzdF9Ob2RlX051bWJlcj1GaXJzdCAmbm9kZSBudW1iZXI6Ci0KLSNBcmd1bWVudFRhYgotQXJndW1lbnRUYWIuQXJndW1lbnQ9QXJndW1lbnQKLUFyZ3VtZW50VGFiLlBhcmFsbGVsX1Byb2dyYW1fQXJndW1lbnRzPVBhcmFsbGVsIHByb2dyYW0gJmFyZ3VtZW50czoKLQotCi0jV29ya2luZ0RpcmVjdG9yeUJsb2NrCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2suV29ya2luZ19kaXJlY3Rvcnk9V29ya2luZyBEaXJlY3RvcnkKLVdvcmtpbmdEaXJlY3RvcnlCbG9jay5Xb3JraW5nX2RpcmVjdG9yeV9jb2xvbj1Xb3JraW5nIGRpcmVjdG9yeToKLVdvcmtpbmdEaXJlY3RvcnlCbG9jay5Vc2VfZGUmZmF1bHRfd29ya2luZ19kaXJlY3Rvcnk9VXNlIGRlJmZhdWx0IHdvcmtpbmcgZGlyZWN0b3J5Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2suJkxvY2FsX2RpcmVjdG9yeT0mTG9jYWwgZGlyZWN0b3J5Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2suV29ya3MmcGFjZT1Xb3JrcyZwYWNlCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2suU2VsZWN0XyZ3b3Jrc3BhY2VfcmVsYXRpdmVfd29ya2luZ19kaXJlY3Rvcnk9U2VsZWN0ICZ3b3Jrc3BhY2UgcmVsYXRpdmUgd29ya2luZyBkaXJlY3RvcnkKLVdvcmtpbmdEaXJlY3RvcnlCbG9jay5TZWxlY3RfJndvcmtpbmdfZGlyZWN0b3J5X2Zvcl9sYXVuY2hfY29uZmlndXJhdGlvbj1TZWxlY3QgJndvcmtpbmcgZGlyZWN0b3J5IGZvciBsYXVuY2ggY29uZmlndXJhdGlvbgotV29ya2luZ0RpcmVjdG9yeUJsb2NrLldvcmtpbmdfZGlyZWN0b3J5X2RvZXNfbm90X2V4aXN0PVdvcmtpbmcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2suV29ya2luZ19kaXJlY3RvcnlfaXNfbm90X2FfZGlyZWN0b3J5PVdvcmtpbmcgZGlyZWN0b3J1IGlzIG5vdCBhIGRpcmVjdG9yeQotV29ya2luZ0RpcmVjdG9yeUJsb2NrLlByb2plY3Rfb3JfZm9sZGVyX2RvZXNfbm90X2V4aXN0PVByb2plY3Qgb3IgZm9sZGVyIGRvZXMgbm90IGV4aXN0Ci0KLQotI1BhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlCi1QYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5WZXJpZnlpbmdfbGF1bmNoX2F0dHJpYnV0ZXM9VmVyaWZ5aW5nIGxhdW5jaCBhdHRyaWJ1dGVzCi1QYXJhbGxlbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5DcmVhdGluZ19zb3VyY2VfbG9jYXRvcj1DcmVhdGluZyBzb3VyY2UgbG9jYXRvcgotCi0KLSNBYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLlByb2plY3Rfbm90X3NwZWNpZmllZD1Qcm9qZWN0IGlzIG5vdCBzcGVjaWZpZWQKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuUHJvamVjdF9kb2VzX25vdF9leGlzdF9vcl9pc19ub3RfYV9wcm9qZWN0PVByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgcHJvamVjdCB0eXBlCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFwcGxpY2F0aW9uX2ZpbGVfbm90X3NwZWNpZmllZD1BcHBsaWNhdGlvbiBmaWxlIGlzIG5vdCBzcGVjaWZpZWQKLUFic3RyYWN0UGFyYWxsZWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQXBwbGljYXRpb25fZmlsZV9kb2VzX25vdF9leGlzdD1BcHBsaWNhdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0Ci1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLk51bWJlcl9vZl9wcm9jZXNzX25vdF9zcGVjaWZpZWQ9TnVtYmVyIG9mIHByb2Nlc3NlcyBpcyBub3Qgc3BlY2lmaWVkCi1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLldvcmtpbmdfZGlyZWN0b3J5X2RvZXNfbm90X2V4aXN0PVdvcmtpbmcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1BYnN0cmFjdFBhcmFsbGVsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFwcGxpY2F0aW9uX3BhdGhfbm90X2ZvdW5kPVByb2dyYW0gcGF0aCBpcyBub3QgZm91bmQKLQotCi0jTGF1bmNoTWFuYWdlcgotTGF1bmNoTWFuYWdlci5FeGNlcHRpb25fb2NjdXJyZWRfZXhlY3V0aW5nX2NvbW1hbmRfbGluZT1FeGNlcHRpb24gb2NjdXJyZWQgZXhlY3V0aW5nIGNvbW1hbmQgbGluZQotTGF1bmNoTWFuYWdlci5FY2xpcHNlX3J1bnRpbWVfZG9lc19ub3Rfc3VwcG9ydF93b3JraW5nX2RpcmVjdG9yeT1FY2xpcHNlIHJ1bnRpbWUgZG9lcyBub3Qgc3VwcG9ydCB3b3JraW5nIGRpcmVjdG9yeQotTGF1bmNoTWFuYWdlci57MH1fKHsxfSk9ezB9ICh7MX0pCi0KLQotI0V4aXRBY3Rpb24KLUV4aXRBY3Rpb24udGV4dD1FeGl0Ci1FeGl0QWN0aW9uLnRvb2x0aXA9RXhpdCBwYXJhbGxlbCBwcm9ncmFtCi0KLSNBYm9ydEFjdGlvbgotQWJvcnRBY3Rpb24udGV4dD1BYm9ydAotQWJvcnRBY3Rpb24udG9vbHRpcD1BYm9ydCBwYXJhbGxlbCBwcm9ncmFtCi0KLSNUZXJtaW5hdGlvbkFsbEFjdGlvbgotVGVybWluYXRpb25BbGxBY3Rpb24udGV4dD1UZXJtaW5hdGUgcGFyYWxsZWwgcHJvZ3JhbQotVGVybWluYXRpb25BbGxBY3Rpb24udG9vbHRpcD1UZXJtaW5hdGUgcGFyYWxsZWwgcHJvZ3JhbQotCi0jVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24KLVRlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uLmJ1dHRvbi50ZXh0PVRlcm1pbmF0ZSBqb2IKLVRlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uLmJ1dHRvbi50b29sdGlwPVRlcm1pbmF0ZSBhbGwgc2VsZWN0ZWQgam9icwotVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24ubXNnYm94LnRpdGxlPVRlcm1pbmF0ZSBKb2IgRXJyb3IKLVRlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uLm1zZ2JveC5tZXNzYWdlPUNhbm5vdCB0ZXJtaW5hdGUgdGhlIGpvYi4KLQotI1ZpZXdTdGF0dXNBY3Rpb24KLVZpZXdTdGF0dXNBY3Rpb24udGV4dD1WaWV3IFN0YXR1cwotVmlld1N0YXR1c0FjdGlvbi50b29sdGlwPVZpZXcgcGFyYWxsZWwgcHJvZ3JhbSBzdGF0dXMKLQotCi0jU2hvd0FsbE5vZGVzQWN0aW9uCi1TaG93QWxsTm9kZXNBY3Rpb24udGV4dD1TaG93IGFsbCBub2RlcwotU2hvd0FsbE5vZGVzQWN0aW9uLnRvb2x0aXA9U2hvdyBhbGwgbm9kZXMKLQotI1Nob3dQcm9jZXNzZXNBY3Rpb24KLVNob3dQcm9jZXNzZXNBY3Rpb24udGV4dD1TaG93IHByb2Nlc3NlcwotU2hvd1Byb2Nlc3Nlc0FjdGlvbi50b29sdGlwPVNob3cgcHJvY2Vzc2VzCi0KLSNTZWFyY2hBY3Rpb24KLVNlYXJjaEFjdGlvbi50ZXh0PVNlYXJjaAotU2VhcmNoQWN0aW9uLnRvb2x0aXA9U2VhcmNoCi0KLSNMZWdlbmRBY3Rpb24KLVNob3dMZWdlbmRBY3Rpb24udGV4dD1MZWdlbmQKLVNob3dMZWdlbmRBY3Rpb24udG9vbHRpcD1MZWdlbmQKLQotI1Nob3dNeUFsbG9jYXRlZE5vZGVzQWN0aW9uCi1TaG93TXlBbGxvY2F0ZWROb2Rlc0FjdGlvbi50ZXh0PVNob3cgbXkgYWxsb2NhdGVkIG5vZGVzCi1TaG93TXlBbGxvY2F0ZWROb2Rlc0FjdGlvbi50b29sdGlwPVNob3cgbXkgYWxsb2NhdGVkIG5vZGVzCi0KLSNTaG93TXlVc2VkTm9kZXNBY3Rpb24KLVNob3dNeVVzZWROb2Rlc0FjdGlvbi50ZXh0PVNob3cgbXkgdXNlZCBub2RlcwotU2hvd015VXNlZE5vZGVzQWN0aW9uLnRvb2x0aXA9U2hvdyBteSB1c2VkIG5vZGVzCi0KLSNQVFBQcmVmZXJlbmNlc1BhZ2UKLVBUUFByZWZlcmVuY2VzUGFnZS5wcmVmZXJlbmNlc0Rlc2NyaXB0aW9uPVBUUCBTZXR0aW5nCi1QVFBQcmVmZXJlbmNlc1BhZ2UuTVBJX1BBVEg9TVBJIHBhdGg6Ci1QVFBQcmVmZXJlbmNlc1BhZ2UuYnJvd3NlQnV0dG9uPUJyb3dzZQotUFRQUHJlZmVyZW5jZXNQYWdlLkluY29ycmVjdF9NUElfZmlsZT1JbnZhbGlkIG1waSBmaWxlCi1QVFBQcmVmZXJlbmNlc1BhZ2UuU2VsZWN0X01QSV9GSUxFPVNlbGVjdCBNUEkgZmlsZQotUFRQUHJlZmVyZW5jZXNQYWdlLlJlcXVlc3RfdGltZW91dF90ZXh0PVJlcXVlc3QgdGltZW91dDoKLVBUUFByZWZlcmVuY2VzUGFnZS5MYXVuY2hfdGltZW91dF90ZXh0PUxhdW5jaCB0aW1lb3V0OgotUFRQUHJlZmVyZW5jZXNQYWdlLm1waUZpbGVfdGV4dD1NUEkgZmlsZToKLVBUUFByZWZlcmVuY2VzUGFnZS5ncm91cF9tcGljdHJsPU1QSSBzZXR0aW5nCi0KLVBUUFByZWZlcmVuY2VzUGFnZS5ncm91cF9vdXRwdXQ9UHJvZ3JhbSBvdXRwdXQgc2V0dGluZwotUFRQUHJlZmVyZW5jZXNQYWdlLm91dHB1dF90ZXh0PU91dHB1dCBkaXJlY3Rvcnk6Ci1QVFBQcmVmZXJlbmNlc1BhZ2UuU2VsZWN0X091dHB1dF9EaXJlY3Rvcnk9U2VsZWN0IG91dHB1dCBkaXJlY3RvcnkKLVBUUFByZWZlcmVuY2VzUGFnZS5vdXRwdXRfdGV4dD1PdXRwdXQgZGlyZWN0b3J5OgotUFRQUHJlZmVyZW5jZXNQYWdlLnN0b3JlX2xpbmVfdGV4dD1TdG9yZSBsaW5lIG51bWJlcjoKLVBUUFByZWZlcmVuY2VzUGFnZS5JbmNvcnJlY3RfT3V0cHV0X2RpcmVjdG9yeT1pbnZhbGlkIGRpcmVjdG9yeQotCi0KLSNQU2VhcmNoUXVlcnkKLVBTZWFyY2hRdWVyeS5zaW5ndWxhck51bWJlclBvc3RmaXg9ezB9IC0gMSBOdW1iZXIgaW4gezF9Ci1QU2VhcmNoUXVlcnkuc2luZ3VsYXJQSURQb3N0Zml4PXswfSAtIDEgUElEIGluIHsxfQotUFNlYXJjaFF1ZXJ5LnNpbmd1bGFyRXhpdENvZGVQb3N0Zml4PXswfSAtIDEgRXhpdCBDb2RlIGluIHsxfQotUFNlYXJjaFF1ZXJ5LnBsdXJhbE51bWJlclBvc3RmaXg9ezB9IC0gezF9IE51bWJlciBpbiB7Mn0KLVBTZWFyY2hRdWVyeS5wbHVyYWxQSURQb3N0Zml4PXswfSAtIHsxfSBQSUQgaW4gezJ9Ci1QU2VhcmNoUXVlcnkucGx1cmFsRXhpdENvZGVQb3N0Zml4PXswfSAtIHsxfSBFeGl0IENvZGUgaW4gezJ9Ci0KLSNDb25maWd1cmF0aW9uV2l6YXJkCi1Db25maWd1cmF0aW9uV2l6YXJkLlNlbGVjdEZhY3RvcnlEZXNjPVNlbGVjdCB0aGUgdHlwZSBvZiByZXNvdXJjZSBtYW5hZ2VyIHRvIHVzZQotQ29uZmlndXJhdGlvbldpemFyZC5OYW1lRGVzYz1FbnRlciBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgcmVzb3VyY2UgbWFuYWdlcgotQ29uZmlndXJhdGlvbldpemFyZC5OYW1lTGFiZWw9TmFtZTogICAgICAgCi1Db25maWd1cmF0aW9uV2l6YXJkLkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uV2l6YXJkLlVzZURlZmF1bHRCdXR0b25MYWJlbD1Vc2UgZGVmYXVsdCBuYW1lIGFuZCBkZXNjcmlwdGlvbjoKLUNvbmZpZ3VyYXRpb25XaXphcmQuUmVzb3VyY2VNYW5hZ2VyVHlwZXNMYWJlbD1SZXNvdXJjZSBNYW5hZ2VyIFR5cGVzOgotQ29uZmlndXJhdGlvbldpemFyZC5GaXJzdFdpemFyZFBhZ2VOYW1lPUNob29zZSBSZXNvdXJjZSBNYW5hZ2VyIFR5cGUKLUNvbmZpZ3VyYXRpb25XaXphcmQuU2Vjb25kV2l6YXJkUGFnZU5hbWU9Q2hvb3NlIFJlc291cmNlIE1hbmFnZXIgTmFtZSBhbmQgRGVzY3JpcHRpb24KLUNvbmZpZ3VyYXRpb25XaXphcmQuVGhpcmRXaXphcmRQYWdlTmFtZT1Db25maWd1cmUgUmVtb3RlIEFjY2VzcwotCi0jUmVzb3VyY2VNYW5hZ2VyVmlldwotUmVzb3VyY2VNYW5hZ2VyVmlldy5NYWNoaW5lcz1NYWNoaW5lcwotUmVzb3VyY2VNYW5hZ2VyVmlldy5RdWV1ZXM9UXVldWVzCi1SZXNvdXJjZU1hbmFnZXJWaWV3LlJlc291cmNlTWFuYWdlcnM9UmVzb3VyY2UgTWFuYWdlcnMKLVN0b3BSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUuVGl0bGU9U2h1dGRvd24gUmVzb3VyY2UgTWFuYWdlcgotU3RvcFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5SZXNvdXJjZU1hbmFnZXI9IiBSZXNvdXJjZSBNYW5hZ2VyPwotU3RvcFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5Db25maXJtPSBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2h1dGRvd24gIgotU3RvcFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5VbmFibGVTdG9wUmVzb3VyY2VNYW5hZ2VyPVVuYWJsZSB0byBzdG9wIFJlc291cmNlTWFuYWdlciAiCi1TdG9wUmVzb3VyY2VNYW5hZ2Vyc09iamVjdEFjdGlvbkRlbGVnYXRlLkVycm9yU3RvcGluZ1Jlc291cmNlTWFuYWdlcj1FcnJvciBTdG9wcGluZyBSZXNvdXJjZSBNYW5hZ2VyCi1SZW1vdmVSZXNvdXJjZU1hbmFnZXJzQWN0aW9uLlRpdGxlPVJlbW92ZSBSZXNvdXJjZSBNYW5hZ2VyCi1SZW1vdmVSZXNvdXJjZU1hbmFnZXJzQWN0aW9uLlF1ZXN0aW9uPSBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgbWFuYWdlcihzKToKLVRlcm1pbmF0ZUpvYkFjdGlvbi5UaXRsZT1UZXJtaW5hdGUgSm9iCi1UZXJtaW5hdGVKb2JBY3Rpb24uUXVlc3Rpb249IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB0ZXJtaW5hdGUgam9iICIKLVRlcm1pbmF0ZUpvYkFjdGlvbi5Db25maXJtPSI/CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL1VJVXRpbHMuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvVUlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQ5YzAwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvVUlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFVJVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNZTkMgPSAxOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGludCBzdHlsZSkgewotICAgICAgICBNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBzdHlsZSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICBkaWFsb2cuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNob3dEaWFsb2dBc3luYyhmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHNob3dEaWFsb2coc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93V2FybmluZ0RpYWxvZyhmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgaW50IGZsYWcpIHsKLSAgICAgICAgaWYgKGZsYWcgPT0gTk9STUFMKQotICAgICAgICAgICAgc2hvd0RpYWxvZyhzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuT0spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaG93RGlhbG9nQXN5bmMoc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd0luZm9ybWF0aW9uRGlhbG9nKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBpbnQgZmxhZykgewotICAgICAgICBpZiAoZmxhZyA9PSBOT1JNQUwpCi0gICAgICAgICAgICBzaG93RGlhbG9nKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuT0spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaG93RGlhbG9nQXN5bmMoc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5PSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3dFcnJvckRpYWxvZyhmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgaW50IGZsYWcpIHsKLSAgICAgICAgaWYgKGZsYWcgPT0gTk9STUFMKQotICAgICAgICAgICAgc2hvd0RpYWxvZyhzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIFNXVC5JQ09OX0VSUk9SIHwgU1dULk9LKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hvd0RpYWxvZ0FzeW5jKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgU1dULklDT05fRVJST1IgfCBTV1QuT0spOwotICAgIH0KLQotICAgIC8vIElTdGF0dXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIENvcmVFeGNlcHRpb24gZS5nZXRTdGF0dXMoKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RGV0YWlsRXJyb3JEaWFsb2coZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIHNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RXJyb3JEaWFsb2coZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dRdWVzdGlvbkRpYWxvZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3dWaWV3KGZpbmFsIFN0cmluZyB2aWV3SUQpIHsKLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Vmlldyh2aWV3SUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2hvdyBWaWV3IGVycjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3dpdGNoUGVyc3BlY3RpdmVUbyhmaW5hbCBTdHJpbmcgcGVyc3BlY3RpdmVJRCkgewotICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkuZXF1YWxzKHBlcnNwZWN0aXZlSUQpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaCBiZW5jaCA9IFBUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBiZW5jaC5zaG93UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVJRCwgUFRQVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dFcnJvckRpYWxvZygiRGlzcGxheSBFcnJvciIsICJDYW5ub3Qgc3dpdGNoIFBlcnNwZWN0aXZlIHRvOiAiICsgcGVyc3BlY3RpdmVJRCwgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwbGF5VmlldyhTdHJpbmcgdmlld0lEKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFnZS5zaG93Vmlldyh2aWV3SUQpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzaG93RXJyb3JEaWFsb2coIkRpc3BsYXkgRXJyb3IiLCAiQ2Fubm90IHNob3cgVmlldyBJRDogIiArIHZpZXdJRCwgZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElWaWV3UGFydCBmaW5kVmlldyhTdHJpbmcgdmlld0lEKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIHJldHVybiBwYWdlLmZpbmRWaWV3KHZpZXdJRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlVmlldyhTdHJpbmcgdmlld0lEKSB7Ci0gICAgICAgIElWaWV3UGFydCB2aWV3UGFydCA9IGZpbmRWaWV3KHZpZXdJRCk7Ci0gICAgICAgIGlmICh2aWV3UGFydCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB2aWV3UGFydC5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNhZmVSdW5Bc3luY0luVUlUaHJlYWQoZmluYWwgSVNhZmVSdW5uYWJsZSBzYWZlUnVubmFibGUpIHsKLQkJaWYgKFBUUFVJUGx1Z2luLmdldERpc3BsYXkoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJc2FmZVJ1bm5hYmxlLnJ1bigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVBUUFVJUGx1Z2luLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU2FmZVJ1bm5hYmxlLnJ1bihzYWZlUnVubmFibGUpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9BYnN0cmFjdFJlc291cmNlTWFuYWdlclNlbGVjdGlvbkFjdGlvbkRlbGVnYXRlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2FjdGlvbnMvQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZWxlY3Rpb25BY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjNhYTE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9BYnN0cmFjdFJlc291cmNlTWFuYWdlclNlbGVjdGlvbkFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZWxlY3Rpb25BY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzCi0JCUlPYmplY3RBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiB7Ci0KLQlwcml2YXRlIFNoZWxsIHRhcmdldFNoZWxsOwotCi0JcHJpdmF0ZSBMaXN0PElSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uPiBtZW51Q29udHJpYnMgPQotCQluZXcgQXJyYXlMaXN0PElSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uPigpOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbWVudUNvbnRyaWJzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJbWVudUNvbnRyaWJzLmNsZWFyKCk7Ci0JCW1lbnVDb250cmlicy5hZGRBbGwoc3MudG9MaXN0KCkpOwotCi0JCWJvb2xlYW4gaXNFbmFibGVkID0gaXNFbmFibGVkKCk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0YXJnZXRTaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24+IGdldE1lbnVDb250cmlicygpIHsKLQkJcmV0dXJuIG1lbnVDb250cmliczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0VGFyZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiB0YXJnZXRTaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlpZiAobWVudUNvbnRyaWJzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSB0cnVlOwotCQlmb3IgKElSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uIG1lbnVDb250cmliIDogbWVudUNvbnRyaWJzKSB7Ci0JCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtTWFuYWdlciA9IAotCQkJCShJUmVzb3VyY2VNYW5hZ2VyKSBtZW51Q29udHJpYi5nZXRBZGFwdGVyKElSZXNvdXJjZU1hbmFnZXIuY2xhc3MpOwotCQkJaWYgKHJtTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFpc0VuYWJsZWRGb3Iocm1NYW5hZ2VyKSkgewotCQkJCWlzRW5hYmxlZCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0VuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJtTWFuYWdlcgotCSAqIEByZXR1cm4gLSBpcyB0aGlzIHJtTWFuYWdlciBhbGxvd2VkIHdpdGggdGhpcyBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSVJlc291cmNlTWFuYWdlciBybU1hbmFnZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL0FkZFJlc291cmNlTWFuYWdlckFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL0FkZFJlc291cmNlTWFuYWdlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk3ZDBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9BZGRSZXNvdXJjZU1hbmFnZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIEFkZFJlc291cmNlTWFuYWdlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBBZGRSZXNvdXJjZU1hbmFnZXJBY3Rpb24oU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoIkFkZCBSZXNvdXJjZSBNYW5hZ2VyLi4uIik7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZmluYWwgSVJlc291cmNlTWFuYWdlckZhY3RvcnlbXSByZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKS5nZXRSZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMoKTsKLQkJaWYgKHJlc291cmNlTWFuYWdlckZhY3Rvcmllcy5sZW5ndGggPT0gMCkgewotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULk9LIHwgU1dULklDT05fSU5GT1JNQVRJT04pOwotCQkJZGlhbG9nLnNldFRleHQoIk5vIFJlc291cmNlIE1hbmFnZXJzIEZhY3RvcmllcyIpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UoIk5vIFJlc291cmNlIE1hbmFnZXJzIEZhY3RvcmllcyBhcmUgcGx1Z2dlZCBpbnRvIHRoaXMgYXBwbGljYXRpb24iKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmaW5hbCBSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFJNQ29uZmlndXJhdGlvbldpemFyZChyZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMpOwotCQkKLQkJZmluYWwgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWludCBzdGF0dXMgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc3RhdHVzICE9IERpYWxvZy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9FZGl0UmVzb3VyY2VNYW5hZ2VyQWN0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2FjdGlvbnMvRWRpdFJlc291cmNlTWFuYWdlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Q0YmRiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9FZGl0UmVzb3VyY2VNYW5hZ2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIEVkaXRSZXNvdXJjZU1hbmFnZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQotCXByaXZhdGUgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgc2VsZWN0ZWRSTU1hbmFnZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBFZGl0UmVzb3VyY2VNYW5hZ2VyQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKCJFZGl0IFJlc291cmNlIE1hbmFnZXIiKTsKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlmaW5hbCBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQlmaW5hbCBTdHJpbmcgcmVzb3VyY2VNYW5hZ2VySWQgPSBzZWxlY3RlZFJNTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKTsKLQkJCi0JCWlmIChyZXNvdXJjZU1hbmFnZXJJZCAhPSBudWxsKSB7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5ID0gbW9kZWxNYW5hZ2VyLmdldFJlc291cmNlTWFuYWdlckZhY3RvcnkoCi0JCQkJCXJlc291cmNlTWFuYWdlcklkKTsKLQotCQkJZmluYWwgUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmQoZmFjdG9yeSwgc2VsZWN0ZWRSTU1hbmFnZXIpOwotCQkJCi0JCQlmaW5hbCBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCWludCBzdGF0dXMgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHN0YXR1cyAhPSBEaWFsb2cuT0spIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXIoSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm1NYW5hZ2VyKSB7Ci0JCXRoaXMuc2VsZWN0ZWRSTU1hbmFnZXIgPSBybU1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL0dvdG9BY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9Hb3RvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTRjNTcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL0dvdG9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHb3RvQWN0aW9uIGV4dGVuZHMgUGFyYWxsZWxBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSAiIjsKLQlwcm90ZWN0ZWQgR290b0Ryb3BEb3duQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIE9iamVjdCBkYXRhOwotCQotCQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgYWN0aW9uCi0JICogQHBhcmFtIGlkIGFjdGlvbiBJRAotCSAqIEBwYXJhbSB2aWV3IHZpZXcKLQkgKiBAcGFyYW0gYWN0aW9uIGRyb3AgZG93biBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgR290b0FjdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgdmlldywgR290b0Ryb3BEb3duQWN0aW9uIGFjdGlvbiwgT2JqZWN0IGRhdGEpIHsKLQkJdGhpcyhuYW1lLCBpZCwgdmlldywgSUFjdGlvbi5BU19DSEVDS19CT1gsIGFjdGlvbiwgZGF0YSk7Ci0JfQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgYWN0aW9uCi0JICogQHBhcmFtIGlkIGFjdGlvbiBJRAotCSAqIEBwYXJhbSB2aWV3IHZpZXcKLQkgKiBAcGFyYW0gc3R5bGUgc3R5bGUgb2YgYWN0aW9uCi0JICogQHBhcmFtIGFjdGlvbiBkcm9wIGRvd24gYWN0aW9uCi0JICovCi0JcHVibGljIEdvdG9BY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcsIGludCBzdHlsZSwgR290b0Ryb3BEb3duQWN0aW9uIGFjdGlvbiwgT2JqZWN0IGRhdGEpIHsKLQkJc3VwZXIobmFtZSwgc3R5bGUsIHZpZXcpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwkKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWFjdGlvbi5ydW4oZWxlbWVudHMsIGlkLCBkYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2FjdGlvbnMvR290b0Ryb3BEb3duQWN0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2FjdGlvbnMvR290b0Ryb3BEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNzkwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL0dvdG9Ecm9wRG93bkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR290b0Ryb3BEb3duQWN0aW9uIGV4dGVuZHMgUGFyYWxsZWxBY3Rpb24gewotICAgIHByb3RlY3RlZCBJTWVudUNyZWF0b3IgbWVudUNyZWF0b3IgPSBuZXcgSU1lbnVDcmVhdG9yKCkgewotICAgICAgICBwcml2YXRlIE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1nciA9IG51bGw7Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BEb3duTWVudU1ncigpIHsKLSAgICAgICAgCWlmIChkcm9wRG93bk1lbnVNZ3IgIT0gbnVsbCkKLSAgICAgICAgCQlkaXNwb3NlKCk7Ci0gICAgICAgIAkKLSAgICAgICAgCWRyb3BEb3duTWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICAJY3JlYXRlRHJvcERvd25NZW51KGRyb3BEb3duTWVudU1ncik7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotICAgICAgICAgICAgY3JlYXRlRHJvcERvd25NZW51TWdyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZHJvcERvd25NZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotICAgICAgICAgICAgY3JlYXRlRHJvcERvd25NZW51TWdyKCk7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGRyb3BEb3duTWVudU1nci5nZXRJdGVtcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBuZXdJdGVtID0gaXRlbTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKCgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdJdGVtLmZpbGwobWVudSwgLTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIGlmIChkcm9wRG93bk1lbnVNZ3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRyb3BEb3duTWVudU1nci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgLyoqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiBhY3Rpb24KLSAgICAgKiBAcGFyYW0gdmlldyB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIEdvdG9Ecm9wRG93bkFjdGlvbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19EUk9QX0RPV05fTUVOVSwgdmlldyk7Ci0JICAgIHNldE1lbnVDcmVhdG9yKG1lbnVDcmVhdG9yKTsKLSAgICB9Ci0gICAgIAotCS8qKiBDcmVhdGUgZHJvcCBkb3duIG1lbnUKLQkgKiBAcGFyYW0gZHJvcERvd25NZW51TWdyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlRHJvcERvd25NZW51KE1lbnVNYW5hZ2VyIGRyb3BEb3duTWVudU1ncik7CQotCS8qKiBydW4gYWN0aW9uCi0JICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIHRha2UgdGhpcyBhY3Rpb24KLQkgKiBAcGFyYW0gc2V0SUQgc2V0IElECi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMsIFN0cmluZyBzZXRJRCwgT2JqZWN0IGRhdGEpOwotCS8qKiBBZGQgYWN0aW9uIGludG8gZHJvcCBkb3duIG1lbnUKLQkgKiBAcGFyYW0gZHJvcERvd25NZW51TWdyCi0JICogQHBhcmFtIG5hbWUgbmFtZSBvZiBhY3Rpb24KLQkgKiBAcGFyYW0gaWQgYWN0aW9uIElECi0JICogQHBhcmFtIGN1cklEIGN1cnJlbnQgSUQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBY3Rpb24oTWVudU1hbmFnZXIgZHJvcERvd25NZW51TWdyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGlkLCBTdHJpbmcgY3VySUQsIE9iamVjdCBkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9QYXJhbGxlbEFjdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL1BhcmFsbGVsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2FkZWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL1BhcmFsbGVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFyYWxsZWxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgdmlldyA9IG51bGw7Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHRleHQgbmFtZSBvZiBhY3Rpb24KLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBQYXJhbGxlbEFjdGlvbihTdHJpbmcgdGV4dCwgQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcpIHsKLQkJdGhpcyh0ZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OLCB2aWV3KTsKLQl9Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHRleHQgbmFtZSBvZiBhY3Rpb24KLQkgKiBAcGFyYW0gc3R5bGUgc3R5bGUgb2YgYWN0aW9uCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgUGFyYWxsZWxBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSwgQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIodGV4dCwgc3R5bGUpOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCSAgICBzZXRUb29sVGlwVGV4dCh0ZXh0KTsKLQkgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgIHNldElkKHRleHQpOwotCX0KLQkKLQkvKiogR2V0IHZpZXcgcGFydAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3IGdldFZpZXdQYXJ0KCkgewotICAgICAgICByZXR1cm4gdmlldzsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEdldCBTaGVsbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiB2aWV3LmdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIHJ1biBhY3Rpb24KLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgYWN0aW9uIGFjdHMgd2l0aCB0aGVzZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRWaWV3UGFydCgpLmdldFNlbGVjdGlvbigpOwotICAgIAlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgCU9iamVjdFtdIG9ianMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9BcnJheSgpOwotICAgICAgICAJSUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJRWxlbWVudFtvYmpzLmxlbmd0aF07Ci0gICAgICAgIAlTeXN0ZW0uYXJyYXljb3B5KG9ianMsIDAsIGVsZW1lbnRzLCAwLCBvYmpzLmxlbmd0aCk7Ci0gICAgICAgIAlydW4oZWxlbWVudHMpOwotICAgIAl9Ci0gICAgCWVsc2UKLSAgICAJCXJ1bihuZXcgSUVsZW1lbnRbMF0pOwotICAgIH0KLSAgICAKLQkvKiogVmFsaWRhdGlvbiBvZiBnaXZlbiBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBiZSBkb2luZyB2YWxpZGF0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHZhbGlkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGlvbihJRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlVSVV0aWxzLnNob3dFcnJvckRpYWxvZygiTm8gc2VsZWN0ZWQgZWxlbWVudHMiLCAiUGxlYXNlIHNlbGVjdCBzb21lIGVsZW1lbnRzIGZpcnN0IiwgbnVsbCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL1JlbW92ZVJlc291cmNlTWFuYWdlcnNBY3Rpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9SZW1vdmVSZXNvdXJjZU1hbmFnZXJzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2JiYjYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9hY3Rpb25zL1JlbW92ZVJlc291cmNlTWFuYWdlcnNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuVUlNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIHNlbGVjdGVkUk1NYW5hZ2VyczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIGZpbmFsIFNoZWxsIHNoZWxsOwotCi0JcHVibGljIFJlbW92ZVJlc291cmNlTWFuYWdlcnNBY3Rpb24oU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoIlJlbW92ZSBSZXNvdXJjZSBNYW5hZ2VyIik7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVN0cmluZyBybU5hbWVzID0gIiI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRSTU1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlybU5hbWVzICs9ICIsIjsKLQkJCX0KLQkJCXJtTmFtZXMgKz0gIlxuXHQiICsgc2VsZWN0ZWRSTU1hbmFnZXJzW2ldLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJYm9vbGVhbiByZW1vdmUgPSBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLAotCQkJCVVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiUmVtb3ZlUmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbi5UaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVSZXNvdXJjZU1hbmFnZXJzQWN0aW9uLlF1ZXN0aW9uIikgLy8kTk9OLU5MUy0xJAotCQkJCSsgcm1OYW1lcyk7Ci0JCQotCQlpZiAocmVtb3ZlKSB7Ci0JCQlQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKS5yZW1vdmVSZXNvdXJjZU1hbmFnZXJzKHNlbGVjdGVkUk1NYW5hZ2Vycyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTWFuYWdlcihJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbFtdIHJtTWFuYWdlcnMpIHsKLQkJdGhpcy5zZWxlY3RlZFJNTWFuYWdlcnMgPSBybU1hbmFnZXJzLmNsb25lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2FjdGlvbnMvU3RhcnRSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9TdGFydFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjliOTdjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9TdGFydFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzCi0JCUFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VsZWN0aW9uQWN0aW9uRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQotCQlmb3IgKElSZXNvdXJjZU1hbmFnZXJNZW51Q29udHJpYnV0aW9uIG1lbnVDb250cmliIDogZ2V0TWVudUNvbnRyaWJzKCkpIHsKLQkJCWZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm1NYW5hZ2VyID0gCi0JCQkJKElSZXNvdXJjZU1hbmFnZXIpIG1lbnVDb250cmliLmdldEFkYXB0ZXIoSVJlc291cmNlTWFuYWdlci5jbGFzcyk7Ci0KLQkJCWlmICghaXNFbmFibGVkRm9yKHJtTWFuYWdlcikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlybU1hbmFnZXIuc3RhcnRVcChtb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWlmICh0ICE9IG51bGwgJiYgdCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKXQpLmdldFN0YXR1cygpOwotCQkJCX0KLQkJCQlVSVV0aWxzLnNob3dFcnJvckRpYWxvZygiU3RhcnQgUmVzb3VyY2UgTWFuYWdlciIsICJGYWlsZWQgdG8gc3RhcnQgcmVzb3VyY2UgbWFuYWdlciIsIHN0YXR1cyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZy4gT3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGVkLgotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkRm9yKElSZXNvdXJjZU1hbmFnZXIgcm1NYW5hZ2VyKSB7Ci0JCWlmIChybU1hbmFnZXIuZ2V0U3RhdGUoKSA9PSBSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLlNUT1BQRUQpIHsKLQkJCXJldHVybiB0cnVlOwkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9TdG9wUmVzb3VyY2VNYW5hZ2Vyc09iamVjdEFjdGlvbkRlbGVnYXRlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2FjdGlvbnMvU3RvcFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFkNzYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvYWN0aW9ucy9TdG9wUmVzb3VyY2VNYW5hZ2Vyc09iamVjdEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyTWVudUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlVJTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIFN0b3BSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUKLWV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZWxlY3Rpb25BY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCi0JCWZvciAoSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWIgOiBnZXRNZW51Q29udHJpYnMoKSkgewotCQkJSVJlc291cmNlTWFuYWdlciBybU1hbmFnZXIgPSAoSVJlc291cmNlTWFuYWdlcikgbWVudUNvbnRyaWIuZ2V0QWRhcHRlcihJUmVzb3VyY2VNYW5hZ2VyLmNsYXNzKTsKLQotCQkJaWYgKCFpc0VuYWJsZWRGb3Iocm1NYW5hZ2VyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogT25seSBhc2sgaWYgd2UgYXJlIHJlYWxseSBzaHV0dGluZyBkb3duIHRoZSBSTQotCQkJICovCi0JCQlSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlIHN0YXRlID0gcm1NYW5hZ2VyLmdldFN0YXRlKCk7Ci0JCQlpZiAoc3RhdGUgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVEFSVEVEKSB7Ci0JCQkJYm9vbGVhbiBzaHV0ZG93biA9IE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oZ2V0VGFyZ2V0U2hlbGwoKSwKLQkJCQkJCVVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiU3RvcFJlc291cmNlTWFuYWdlcnNPYmplY3RBY3Rpb25EZWxlZ2F0ZS5UaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0b3BSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUuQ29uZmlybSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgcm1NYW5hZ2VyLmdldE5hbWUoKQotCQkJCQkJKyBVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0b3BSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUuUmVzb3VyY2VNYW5hZ2VyIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFzaHV0ZG93bikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQl0cnkgewotCQkJCXJtTWFuYWdlci5zaHV0ZG93bigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0b3BSZXNvdXJjZU1hbmFnZXJzT2JqZWN0QWN0aW9uRGVsZWdhdGUuVW5hYmxlU3RvcFJlc291cmNlTWFuYWdlciIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgcm1NYW5hZ2VyLmdldE5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIFBUUFVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCTEsIG1lc3NhZ2UsIGUpOwotCQkJCUVycm9yRGlhbG9nIGRsZyA9IG5ldyBFcnJvckRpYWxvZyhnZXRUYXJnZXRTaGVsbCgpLAotCQkJCQkJVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJTdG9wUmVzb3VyY2VNYW5hZ2Vyc09iamVjdEFjdGlvbkRlbGVnYXRlLkVycm9yU3RvcGluZ1Jlc291cmNlTWFuYWdlciIpLCBtZXNzYWdlLCBzdGF0dXMsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUlTdGF0dXMuRVJST1IpOwotCQkJCWRsZy5vcGVuKCk7Ci0JCQkJUFRQVUlQbHVnaW4ubG9nKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSVJlc291cmNlTWFuYWdlciBybU1hbmFnZXIpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSA9IHJtTWFuYWdlci5nZXRTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVEFSVEVEIHx8Ci0JCQkJc3RhdGUgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5FUlJPUikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9jb25zb2xlcy9Db25zb2xlTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9jb25zb2xlcy9Db25zb2xlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU4YWQzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvY29uc29sZXMvQ29uc29sZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPUk5MIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm0gb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAotICogQGF1dGhvciAtIEZlaXlpIFdhbmcKLSAqIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLmNvbnNvbGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3TWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklOZXdSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIENvbnNvbGVNYW5hZ2VyIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIsCi0JCUlSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyLCBJUXVldWVDaGlsZExpc3RlbmVyIHsKLQkKLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgaW1tID0gbnVsbDsKLQlwcml2YXRlIE1hcDxJUEpvYiwgSm9iQ29uc29sZT4gY29uc29sZXMgPSBuZXcgSGFzaE1hcDxJUEpvYiwgSm9iQ29uc29sZT4oKTsKLQkKLQlwdWJsaWMgQ29uc29sZU1hbmFnZXIoKSB7Ci0JCWltbSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQlpbW0uYWRkTGlzdGVuZXIodGhpcyk7Ci0JCWZvciAoSVJlc291cmNlTWFuYWdlciBybTogaW1tLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCQlybS5hZGRDaGlsZExpc3RlbmVyKHRoaXMpOwotCQkJZm9yIChJUFF1ZXVlIHF1ZXVlOiBybS5nZXRRdWV1ZXMoKSkgewotCQkJCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZEpvYkV2ZW50IGUpIHsKLQkJLy8gT0sgdG8gaWdub3JlCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRNYWNoaW5lRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRNYWNoaW5lRXZlbnQgZSkgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRRdWV1ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUXVldWVFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdKb2JFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3Sm9iRXZlbnQgZSkgewotCQlmb3IgKElQSm9iIGpvYjogZS5nZXRKb2JzKCkpIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBqb2IuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsICYmCi0JCQkJCQljb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLQkJCQkJCQlJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NPTlNPTEUsIAotCQkJCQkJCWZhbHNlKSkgewotCQkJCQlKb2JDb25zb2xlIGpjID0gbmV3IEpvYkNvbnNvbGUoam9iKTsKLQkJCQkJam9iLmFkZENoaWxkTGlzdGVuZXIoamMpOwotCQkJCQlzeW5jaHJvbml6ZWQgKGNvbnNvbGVzKSB7Ci0JCQkJCQljb25zb2xlcy5wdXQoam9iLCBqYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdNYWNoaW5lRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdRdWV1ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdRdWV1ZUV2ZW50IGUpIHsKLQkJZm9yIChJUFF1ZXVlIHF1ZXVlOiBlLmdldFF1ZXVlcygpKSB7Ci0JCQlxdWV1ZS5hZGRDaGlsZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS5hZGRDaGlsZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlSm9iRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZUpvYkV2ZW50IGUpIHsKLQkJZm9yIChJUEpvYiBqb2I6IGUuZ2V0Sm9icygpKSB7Ci0JCQlyZW1vdmVDb25zb2xlKGpvYik7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZU1hY2hpbmVFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVRdWV1ZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVRdWV1ZUV2ZW50IGUpIHsKLQkJZm9yIChJUFF1ZXVlIHF1ZXVlOiBlLmdldFF1ZXVlcygpKSB7Ci0JCQlxdWV1ZS5yZW1vdmVDaGlsZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVDaGlsZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNodXQgZG93biB0aGUgY29uc29sZSBtYW5hZ2VyLiBUaGlzIHJlbW92ZXMgYW55IGpvYiBjb25zb2xlcyB0aGF0Ci0JICogaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIGFsbCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWltbS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtOiBpbW0uZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXJzKCkpIHsKLQkJCXJtLnJlbW92ZUNoaWxkTGlzdGVuZXIodGhpcyk7Ci0JCQlmb3IgKElQUXVldWUgcXVldWU6IHJtLmdldFF1ZXVlcygpKSB7Ci0JCQkJcXVldWUucmVtb3ZlQ2hpbGRMaXN0ZW5lcih0aGlzKTsKLQkJCQlmb3IgKElQSm9iIGpvYiA6IHF1ZXVlLmdldEpvYnMoKSkgewotCQkJCQlyZW1vdmVDb25zb2xlKGpvYik7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIHRoZSBjb25zb2xlIGFzc29jaWF0ZWQgd2l0aCBhIGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gam9iIGpvYiB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIGNvbnNvbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29uc29sZShJUEpvYiBqb2IpIHsKLQkJc3luY2hyb25pemVkIChjb25zb2xlcykgewotCQkJSm9iQ29uc29sZSBqYyA9IGNvbnNvbGVzLmdldChqb2IpOwotCQkJaWYgKGpjICE9IG51bGwpIHsKLQkJCQlqYy5yZW1vdmVDb25zb2xlKCk7Ci0JCQkJam9iLnJlbW92ZUNoaWxkTGlzdGVuZXIoamMpOwotCQkJCWNvbnNvbGVzLnJlbW92ZShqYyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2NvbnNvbGVzL0pvYkNvbnNvbGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvY29uc29sZXMvSm9iQ29uc29sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNmOWJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvY29uc29sZXMvSm9iQ29uc29sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9STkwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybSBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogCi0gKiBAYXV0aG9yIC0gRmVpeWkgV2FuZwotICogaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5jb25zb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuTWVzc2FnZUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5NZXNzYWdlQ29uc29sZVN0cmVhbTsKLQotcHVibGljIGNsYXNzIEpvYkNvbnNvbGUgaW1wbGVtZW50cyBJSm9iQ2hpbGRMaXN0ZW5lciB7Ci0KLQkvKiogCi0JICogc2VhcmNoIGZvciBjb25zb2xlIG5hbWUgZmlyc3QsIGlmIG5vbi1leGlzdGVkLCAKLQkgKiBjcmVhdGUgYSBuZXcgb25lCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlQ29uc29sZSBmaW5kQW5kQ3JlYXRlQ29uc29sZShTdHJpbmcgbmFtZSkgewotCQlNZXNzYWdlQ29uc29sZSBteUNvbnNvbGUgPSBmaW5kQ29uc29sZShuYW1lKTsKLQkJaWYgKG15Q29uc29sZSA9PSBudWxsKSB7Ci0JCQkvLyBubyBjb25zb2xlIGZvdW5kLCBzbyBjcmVhdGUgYSBuZXcgb25lCi0JCQlDb25zb2xlUGx1Z2luIHBsdWdpbiA9IENvbnNvbGVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJbXlDb25zb2xlID0gbmV3IE1lc3NhZ2VDb25zb2xlKG5hbWUsIG51bGwpOwotCQkJSUNvbnNvbGVNYW5hZ2VyIGNvbk1hbiA9IHBsdWdpbi5nZXRDb25zb2xlTWFuYWdlcigpOwotCQkJY29uTWFuLmFkZENvbnNvbGVzKG5ldyBJQ29uc29sZVtdIHtteUNvbnNvbGV9KTsKLQkJfQotCQlyZXR1cm4gbXlDb25zb2xlOwotCX0KLQotCS8qKgotCSAqIHNlYXJjaCBhbmQgcmV0dXJuIGEgbWVzc2FnZSBjb25zb2xlIHdpdGggZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnNvbGUgZmluZENvbnNvbGUoU3RyaW5nIG5hbWUpIHsKLQkJQ29uc29sZVBsdWdpbiBwbHVnaW4gPSBDb25zb2xlUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJSUNvbnNvbGVNYW5hZ2VyIGNvbk1hbiA9IHBsdWdpbi5nZXRDb25zb2xlTWFuYWdlcigpOwotCQlJQ29uc29sZVtdIGV4aXN0aW5nID0gY29uTWFuLmdldENvbnNvbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuYW1lLmVxdWFscyhleGlzdGluZ1tpXS5nZXROYW1lKCkpKQotCQkJCXJldHVybiAoTWVzc2FnZUNvbnNvbGUpIGV4aXN0aW5nW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHV0aWxpdHkgbWV0aG9kIHRoYXQgYWxsb3cgZGlyZWN0IG91dHB1dCB0byBhIHBhcnRpY3VsYXIgY29uc29sZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lIC0gY29uc29sZSBuYW1lCi0JICogQHBhcmFtIG1zZyAgLSBtZXRob2QgZm9yIHRoZSBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgam91dChTdHJpbmcgbmFtZSwgU3RyaW5nIG1zZykgewotCQlNZXNzYWdlQ29uc29sZSBteUNvbnNvbGUgPSBmaW5kQW5kQ3JlYXRlQ29uc29sZShuYW1lKTsKLQkJTWVzc2FnZUNvbnNvbGVTdHJlYW0gb3V0ID0gbXlDb25zb2xlLm5ld01lc3NhZ2VTdHJlYW0oKTsKLQkJb3V0LnByaW50bG4obXNnKTsJCQotCX0KLQkKLQlwcml2YXRlIE1lc3NhZ2VDb25zb2xlIG15Q29uc29sZTsJLy8gTWVzc2FnZUNvbnNvbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgam9iCi0JcHJpdmF0ZSBNZXNzYWdlQ29uc29sZVN0cmVhbSBteUNvbnNvbGVTdHJlYW07CS8vIE91dHB1dCBzdHJlYW0gZm9yIHRoZSBjb25zb2xlCi0JLy8gVE9ETyBnZXQgdGhpcyBmbGFnIGZyb20gcHJlZmVyZW5jZXMKLQlwcml2YXRlIGJvb2xlYW4gcHJlZml4ID0gdHJ1ZTsJLy8gRmxhZyBpbmRpY2F0aW5nIGlmIG91dHB1dCBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBwcm9jZXNzIGluZGV4Ci0JCi0JcHVibGljIEpvYkNvbnNvbGUoSVBKb2Igam9iKSB7Ci0JCUNvbnNvbGVQbHVnaW4gcGx1Z2luID0gQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCUlDb25zb2xlTWFuYWdlciBjb25NYW4gPSBwbHVnaW4uZ2V0Q29uc29sZU1hbmFnZXIoKTsKLQkJYm9vbGVhbiBoYXZlQ29uc29sZSA9IGZhbHNlOwotCQkvLyBjaGVjayBpZiB0aGlzIGlkIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGEgY29uc29sZQotCQkvLyBpZiBpdCBpcywgbm8gbmV3IGNvbnNvbGUgd2lsbCBiZSBjcmVhdGVkCi0JCUlDb25zb2xlW10gZXhpc3RpbmcgPSBjb25NYW4uZ2V0Q29uc29sZXMoKTsKLQkJU3RyaW5nIGlkID0gZ2V0VW5pcXVlTmFtZShqb2IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaWQuZXF1YWxzKGV4aXN0aW5nW2ldLmdldE5hbWUoKSkpIHsKLQkJCQlteUNvbnNvbGUgPSAgKE1lc3NhZ2VDb25zb2xlKSBleGlzdGluZ1tpXTsKLQkJCQloYXZlQ29uc29sZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFoYXZlQ29uc29sZSkgewotCQkJbXlDb25zb2xlID0gbmV3IE1lc3NhZ2VDb25zb2xlKGlkLCBudWxsKTsKLQkJCW15Q29uc29sZVN0cmVhbSA9IG15Q29uc29sZS5uZXdNZXNzYWdlU3RyZWFtKCk7Ci0JCQljb25NYW4uYWRkQ29uc29sZXMobmV3IElDb25zb2xlW10ge215Q29uc29sZX0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRvIHRoZSBjb25zb2xlLiBJZiB0aGUgcHJlZml4IGZsYWcgaXMgdHJ1ZSwKLQkgKiBlYWNoIGxpbmUgb2YgdGhlIG91dHB1dCB3aWxsIGJlIHByZWZpeGVkIGJ5IHRoZSBwcm9jZXNzIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBwcmVmaXggYWRkZWQgdG8gZWFjaCBsaW5lIG9mIG91dHB1dAotCSAqIEBwYXJhbSBtc2cgb3V0cHV0IGZyb20gcHJvY2VzcwotCSAqLwotCXB1YmxpYyB2b2lkIGNvdXQoU3RyaW5nIGluZGV4LCBTdHJpbmcgbXNnKSB7Ci0JCVN0cmluZyBvdXRwdXQgPSAiIjsKLQkJCi0JCWlmIChwcmVmaXgpIHsKLQkJCVN0cmluZ1tdIGxpbmVzID0gbXNnLnNwbGl0KCJcbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID4gMCkgewotCQkJCQlvdXRwdXQgKz0gIlxuIjsKLQkJCQl9Ci0JCQkJb3V0cHV0ICs9ICJbIiArIGluZGV4ICsgIl0gIiArIGxpbmVzW2ldOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3V0cHV0ID0gbXNnOwotCQl9Ci0JCQotCQlteUNvbnNvbGVTdHJlYW0ucHJpbnRsbihvdXRwdXQpOwkJCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZFByb2Nlc3NFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKSB7Ci0JCWZvciAoSVBQcm9jZXNzIHByb2Nlc3MgOiBlLmdldFByb2Nlc3NlcygpKSB7Ci0JCQlTdHJpbmdBdHRyaWJ1dGUgc3Rkb3V0ID0gcHJvY2Vzcy5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRvdXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxTdGF0ZT4gc3RhdGUgPSBwcm9jZXNzLmdldEF0dHJpYnV0ZSgKLQkJCQkJCVByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCUludGVnZXJBdHRyaWJ1dGUgaW5kZXggPSBwcm9jZXNzLmdldEF0dHJpYnV0ZSgKLQkJCQkJCVByb2Nlc3NBdHRyaWJ1dGVzLmdldEluZGV4QXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCWlmIChzdGF0ZS5nZXRWYWx1ZSgpID09IFN0YXRlLlJVTk5JTkcgJiYgc3Rkb3V0ICE9IG51bGwpIHsKLQkJCQljb3V0KGluZGV4LmdldFZhbHVlQXNTdHJpbmcoKSwgc3Rkb3V0LmdldFZhbHVlQXNTdHJpbmcoKSk7CQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1Byb2Nlc3NFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSUpvYkNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVByb2Nlc3NFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25zb2xlKCkgewotCQlpZiAobXlDb25zb2xlICE9IG51bGwpIHsKLQkJCUNvbnNvbGVQbHVnaW4gcGx1Z2luID0gQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlJQ29uc29sZU1hbmFnZXIgY29uTWFuID0gcGx1Z2luLmdldENvbnNvbGVNYW5hZ2VyKCk7Ci0JCQljb25NYW4ucmVtb3ZlQ29uc29sZXMobmV3IElDb25zb2xlW10ge215Q29uc29sZX0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgam9iCi0JICogCi0JICogQHBhcmFtIGpvYgotCSAqIEByZXR1cm4gdW5pcXVlIG5hbWUgZm9yIHRoZSBqb2IKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVOYW1lKElQSm9iIGpvYikgewotCQlTdHJpbmcgcm1OYW1lICAgID0gam9iLmdldFF1ZXVlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcXVldWVOYW1lID0gam9iLmdldFF1ZXVlKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgam9iTmFtZSAgID0gam9iLmdldE5hbWUoKTsKLQkJcmV0dXJuIHJtTmFtZSArICI6IiArIHF1ZXVlTmFtZSArICI6IiArIGpvYk5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9ob3Zlci9JSWNvbkhvdmVyVGFnLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2hvdmVyL0lJY29uSG92ZXJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NzgwNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2hvdmVyL0lJY29uSG92ZXJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkuaG92ZXI7Ci0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJY29uSG92ZXJUYWcgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVSTElORV9UQUcgPSAidSI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSUtFX1RBRyA9ICJzIjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCT0xEX1RBRyA9ICJiIjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJVEFMSUNfVEFHID0gImkiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFHID0gInAiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWV9UQUcgPSAia2V5IjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBISUdITElHSFRfVEFHID0gImhsIjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFTlRfVEFHID0gImluZCI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVYVF9MSU5FX1RBRyA9ICJiciI7Ci0JCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBDTE9TRURfVEFHID0gJy8nOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBTVEFSVF9UQUcgPSAnPCc7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIEVORF9UQUcgPSAnPic7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2hvdmVyL0lJY29uSW5mb3JtYXRpb25Db250cm9sLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2hvdmVyL0lJY29uSW5mb3JtYXRpb25Db250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjkyNWIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9ob3Zlci9JSWNvbkluZm9ybWF0aW9uQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5ob3ZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUljb25JbmZvcm1hdGlvbkNvbnRyb2wgZXh0ZW5kcyBJSW5mb3JtYXRpb25Db250cm9sIHsKLQkvKiogU2V0IGhlYWRlcgotCSAqIEBwYXJhbSBoZWFkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIGhlYWRlcik7Ci0JLyoqIEdldCBzaGVsbCBzaXplCi0JICogQHJldHVybiB4IGlzIHdpZHRoLCB5IGlzIGhlaWdodAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTaGVsbFNpemUoKTsKLQkvKiogSXMgd3JhcCB0ZXh0Ci0JICogQHJldHVybiB0cnVlIGlmIHdyYXAgdGV4dAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV3JhcCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9saXN0ZW5lcnMvSUpvYkNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9saXN0ZW5lcnMvSUpvYkNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjg4ODQ2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbGlzdGVuZXJzL0lKb2JDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkubGlzdGVuZXJzOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpvYkNoYW5nZWRMaXN0ZW5lciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRCA9IDE7Ci0JLyoqIENoYW5nZSBqb2IgZXZlbnQKLQkgKiBAcGFyYW0gY3VyX2pvYl9pZCBjdXJyZW50IGpvYiBJRAotCSAqIEBwYXJhbSBwcmVfam9iX2lkIHByZXZpb3VzIGpvYiBJRAotCSAqLwotCXB1YmxpYyB2b2lkIGpvYkNoYW5nZWRFdmVudChpbnQgdHlwZSwgU3RyaW5nIGN1cl9qb2JfaWQsIFN0cmluZyBwcmVfam9iX2lkKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbGlzdGVuZXJzL0lQYWludExpc3RlbmVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL2xpc3RlbmVycy9JUGFpbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg2M2FkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbGlzdGVuZXJzL0lQYWludExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVyczsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYWludExpc3RlbmVyIHsKLQkvKiogUmVwYWludCB0aGUgdmlldwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGFpbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbGlzdGVuZXJzL0lTZXRMaXN0ZW5lci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9saXN0ZW5lcnMvSVNldExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzNhNmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9saXN0ZW5lcnMvSVNldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2V0TGlzdGVuZXIgewotCS8qKiBDaGFuZ2Ugc2V0IGV2ZW50Ci0JICogQHBhcmFtIGN1cnJlbnRTZXQgY3VycmVudCBTZXQKLQkgKiBAcGFyYW0gcHJlU2V0IHByZXZpb3VzIFNldAotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZVNldEV2ZW50KElFbGVtZW50U2V0IGN1cnJlbnRTZXQsIElFbGVtZW50U2V0IHByZVNldCk7Ci0JLyoqIENyZWF0ZSBzZXQgZXZlbnQKLQkgKiBAcGFyYW0gc2V0IG5ldyBTZXQKLQkgKiBAcGFyYW0gZWxlbWVudHMgYWRkIGVsZW1lbnRzIGludG8gYSBnaXZlbiBTZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZXRFdmVudChJRWxlbWVudFNldCBzZXQsIElFbGVtZW50W10gZWxlbWVudHMpOwotCS8qKiBEZWxldGUgc2V0IGV2ZW50Ci0JICogQHBhcmFtIHNldCBTZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVTZXRFdmVudChJRWxlbWVudFNldCBzZXQpOwotCS8qKiBBZGQgZWxlbWVudCB0byBzZXQgZXZlbnQKLQkgKiBAcGFyYW0gc2V0IFNldAotCSAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBhZGQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudHNFdmVudChJRWxlbWVudFNldCBzZXQsIElFbGVtZW50W10gZWxlbWVudHMpOwotCS8qKiBSZW1vdmUgZWxlbWVudHMgZXZlbnQKLQkgKiBAcGFyYW0gc2V0IFNldCAgCi0JICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIHJlbW92ZSBmcm9tIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRzRXZlbnQoSUVsZW1lbnRTZXQgc2V0LCBJRWxlbWVudFtdIGVsZW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbWFuYWdlcnMvQWJzdHJhY3RVSU1hbmFnZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbWFuYWdlcnMvQWJzdHJhY3RVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzOThmMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL21hbmFnZXJzL0Fic3RyYWN0VUlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBVbml2ZXJzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubGlzdGVuZXJzLklKb2JDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVycy5JU2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLkVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVSU1hbmFnZXIgaW1wbGVtZW50cyBJTWFuYWdlciB7Ci0JcHJvdGVjdGVkIElNb2RlbFByZXNlbnRhdGlvbiBtb2RlbFByZXNlbnRhdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBjdXJfc2V0X2lkID0gRU1QVFlfSUQ7Ci0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBzZXRMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBqTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JLyoqIAotCSAqIENvbnN0cnVjdG9yIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFVJTWFuYWdlcigpIHsKLQkJbW9kZWxQcmVzZW50YXRpb24gPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbFByZXNlbnRhdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNhZGRKb2JMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAudWkubGlzdGVuZXJzLklKb2JMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRKb2JDaGFuZ2VkTGlzdGVuZXIoSUpvYkNoYW5nZWRMaXN0ZW5lciBqb2JMaXN0ZW5lcikgewotCQlqTGlzdGVuZXJzLmFkZChqb2JMaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2FkZFNldExpc3RlbmVyKG9yZy5lY2xpcHNlLnB0cC51aS5saXN0ZW5lcnMuSVNldExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNldExpc3RlbmVyKElTZXRMaXN0ZW5lciBzZXRMaXN0ZW5lcikgewotCQlzZXRMaXN0ZW5lcnMuYWRkKHNldExpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjYWRkVG9TZXQob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10sIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb1NldChJRWxlbWVudFtdIGVsZW1lbnRzLCBJRWxlbWVudFNldCBzZXQpIHsKLQkJc2V0LmFkZEVsZW1lbnRzKGVsZW1lbnRzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjYWRkVG9TZXQob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9TZXQoSUVsZW1lbnRbXSBlbGVtZW50cywgU3RyaW5nIHNldElELAotCQkJSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyKSB7Ci0JCUlFbGVtZW50U2V0IHNldCA9IChJRWxlbWVudFNldCkgZWxlbWVudEhhbmRsZXIuZ2V0RWxlbWVudEJ5SUQoc2V0SUQpOwotCQlhZGRUb1NldChlbGVtZW50cywgc2V0KTsKLQkJZmlyZVNldEV2ZW50KEFERF9FTEVNRU5UX1RZUEUsIGVsZW1lbnRzLCBzZXQsIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNjcmVhdGVTZXQob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXIpCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXQoSUVsZW1lbnRbXSBlbGVtZW50cywgU3RyaW5nIHNldElELCBTdHJpbmcgc2V0TmFtZSwKLQkJCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlcikgewotCQlJRWxlbWVudFNldCBzZXQgPSBuZXcgRWxlbWVudFNldChlbGVtZW50SGFuZGxlciwgc2V0SUQsIHNldE5hbWUpOwotCQlhZGRUb1NldChlbGVtZW50cywgc2V0KTsKLQkJZWxlbWVudEhhbmRsZXIuYWRkRWxlbWVudHMobmV3IElFbGVtZW50W10geyBzZXQgfSk7Ci0JCWZpcmVTZXRFdmVudChDUkVBVEVfU0VUX1RZUEUsIGVsZW1lbnRzLCBzZXQsIG51bGwpOwotCQlyZXR1cm4gc2V0LmdldElEKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2ZpcmVKb2JMaXN0ZW5lcihpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUpvYkNoYW5nZWRFdmVudChmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGN1cl9qb2JfaWQsCi0JCQlmaW5hbCBTdHJpbmcgcHJlX2pvYl9pZCkgewotCQlPYmplY3RbXSBhcnJheSA9IGpMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElKb2JDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUpvYkNoYW5nZWRMaXN0ZW5lcikgYXJyYXlbaV07Ci0JCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbGlzdGVuZXIuam9iQ2hhbmdlZEV2ZW50KHR5cGUsIGN1cl9qb2JfaWQsIHByZV9qb2JfaWQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2ZpcmVFdmVudChpbnQsIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdLCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQsIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU2V0RXZlbnQoZmluYWwgaW50IGV2ZW50VHlwZSwgZmluYWwgSUVsZW1lbnRbXSBlbGVtZW50cywKLQkJCWZpbmFsIElFbGVtZW50U2V0IGN1cl9zZXQsIGZpbmFsIElFbGVtZW50U2V0IHByZV9zZXQpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBzZXRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElTZXRMaXN0ZW5lciBzZXRMaXN0ZW5lciA9IChJU2V0TGlzdGVuZXIpIGFycmF5W2ldOwotCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ1JFQVRFX1NFVF9UWVBFOgotCQkJCQkJc2V0TGlzdGVuZXIuY3JlYXRlU2V0RXZlbnQoY3VyX3NldCwgZWxlbWVudHMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgREVMRVRFX1NFVF9UWVBFOgotCQkJCQkJc2V0TGlzdGVuZXIuZGVsZXRlU2V0RXZlbnQoY3VyX3NldCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBDSEFOR0VfU0VUX1RZUEU6Ci0JCQkJCQlzZXRMaXN0ZW5lci5jaGFuZ2VTZXRFdmVudChjdXJfc2V0LCBwcmVfc2V0KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFERF9FTEVNRU5UX1RZUEU6Ci0JCQkJCQlzZXRMaXN0ZW5lci5hZGRFbGVtZW50c0V2ZW50KGN1cl9zZXQsIGVsZW1lbnRzKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFJFTU9WRV9FTEVNRU5UX1RZUEU6Ci0JCQkJCQlzZXRMaXN0ZW5lci5yZW1vdmVFbGVtZW50c0V2ZW50KGN1cl9zZXQsIGVsZW1lbnRzKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKiogCi0JICogR2V0IFJlc291cmNlIE1hbmFnZXJzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyW10gZ2V0UmVzb3VyY2VNYW5hZ2VycygpIHsKLQkJSVBVbml2ZXJzZSB1bml2ZXJzZSA9IG1vZGVsUHJlc2VudGF0aW9uLmdldFVuaXZlcnNlKCk7Ci0JCWlmICh1bml2ZXJzZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElSZXNvdXJjZU1hbmFnZXJbMF07Ci0JCX0KLQkJcmV0dXJuIHVuaXZlcnNlLmdldFJlc291cmNlTWFuYWdlcnMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0U3RhdHVzKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXR1cyhJRWxlbWVudCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldFN0YXR1cyhlbGVtZW50LmdldElEKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNyZW1vdmVGcm9tU2V0KG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21TZXQoSUVsZW1lbnRbXSBlbGVtZW50cywgU3RyaW5nIHNldElELAotCQkJSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyKSB7Ci0JCUlFbGVtZW50U2V0IHNldCA9IChJRWxlbWVudFNldCkgZWxlbWVudEhhbmRsZXIuZ2V0RWxlbWVudEJ5SUQoc2V0SUQpOwotCQlzZXQucmVtb3ZlRWxlbWVudHMoZWxlbWVudHMpOwotCQlmaXJlU2V0RXZlbnQoUkVNT1ZFX0VMRU1FTlRfVFlQRSwgZWxlbWVudHMsIHNldCwgbnVsbCk7Ci0JCWlmIChzZXQuc2l6ZSgpID09IDApCi0JCQlyZW1vdmVTZXQoc2V0SUQsIGVsZW1lbnRIYW5kbGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjcmVtb3ZlSm9iTGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVycy5JSm9iTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSm9iQ2hhbmdlZExpc3RlbmVyKElKb2JDaGFuZ2VkTGlzdGVuZXIgam9iTGlzdGVuZXIpIHsKLQkJakxpc3RlbmVycy5yZW1vdmUoam9iTGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNyZW1vdmVTZXQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50SGFuZGxlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXQoU3RyaW5nIHNldElELCBJRWxlbWVudEhhbmRsZXIgZWxlbWVudEhhbmRsZXIpIHsKLQkJSUVsZW1lbnRTZXQgc2V0ID0gKElFbGVtZW50U2V0KSBlbGVtZW50SGFuZGxlci5nZXRFbGVtZW50QnlJRChzZXRJRCk7Ci0JCWVsZW1lbnRIYW5kbGVyLnJlbW92ZUVsZW1lbnRzKG5ldyBJRWxlbWVudFtdIHsgc2V0IH0pOwotCQlmaXJlU2V0RXZlbnQoREVMRVRFX1NFVF9UWVBFLCBudWxsLCBzZXQsIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNyZW1vdmVTZXRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAudWkubGlzdGVuZXJzLklTZXRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXRMaXN0ZW5lcihJU2V0TGlzdGVuZXIgc2V0TGlzdGVuZXIpIHsKLQkJc2V0TGlzdGVuZXJzLnJlbW92ZShzZXRMaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI3NodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJc2V0TGlzdGVuZXJzLmNsZWFyKCk7Ci0JCWpMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJLy9zZXRMaXN0ZW5lcnMgPSBudWxsOwotCQkvL2pMaXN0ZW5lcnMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbWFuYWdlcnMvSm9iTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tYW5hZ2Vycy9Kb2JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMjRlZDguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tYW5hZ2Vycy9Kb2JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQVW5pdmVyc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVycy5JSm9iQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5FbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLQotcHVibGljIGNsYXNzIEpvYk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFVJTWFuYWdlciB7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElFbGVtZW50SGFuZGxlcj4gam9iRWxlbWVudEhhbmRsZXJMaXN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJRWxlbWVudEhhbmRsZXI+KCk7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElQSm9iPiBqb2JMaXN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUEpvYj4oKTsKLQlwcm90ZWN0ZWQgSVBKb2IgY3VyX2pvYiA9IG51bGw7Ci0JcHJvdGVjdGVkIElQUXVldWUgY3VyX3F1ZXVlID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFRkFVTFRfVElUTEUgPSAiUGxlYXNlIHNlbGVjdCBhIGpvYiI7Ci0KLQkvKiogCi0JICogQWRkIGEgbmV3IGpvYiB0byBqb2JMaXN0LiBDaGVjayBmb3IgYW55IG5ldyBwcm9jZXNzZXMgYW5kIGFkZCB0aGVzZSB0bwotCSAqIHRoZSBlbGVtZW50IGhhbmRsZXIgZm9yIHRoZSBqb2IuCi0JICogCi0JICogQHBhcmFtIGpvYgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEpvYihJUEpvYiBqb2IpIHsKLQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQlJRWxlbWVudFNldCBzZXQgPSBjcmVhdGVFbGVtZW50SGFuZGxlcihqb2IpLmdldFNldFJvb3QoKTsKLQkJCUxpc3Q8SUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudD4oKTsKLQkJCWZvciAoSVBQcm9jZXNzIHByb2MgOiBqb2IuZ2V0UHJvY2Vzc2VzKCkpIHsKLQkJCQlpZiAocHJvYyA9PSBudWxsIHx8IHNldC5jb250YWlucyhwcm9jLmdldElEKCkpKQotCQkJCQljb250aW51ZTsKLQkJCQllbGVtZW50cy5hZGQoY3JlYXRlUHJvY2Vzc0VsZW1lbnQoc2V0LCBwcm9jLmdldElEKCksIHByb2MuZ2V0UHJvY2Vzc0luZGV4KCksIHByb2MpKTsKLQkJCX0KLQkJCXNldC5hZGRFbGVtZW50cyhlbGVtZW50cy50b0FycmF5KG5ldyBJRWxlbWVudFswXSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9jCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvY2VzcyhJUFByb2Nlc3MgcHJvYykgewotCQlJUEpvYiBqb2IgPSBwcm9jLmdldEpvYigpOwotCQlJRWxlbWVudFNldCBzZXQgPSBjcmVhdGVFbGVtZW50SGFuZGxlcihqb2IpLmdldFNldFJvb3QoKTsKLQkJaWYgKCFzZXQuY29udGFpbnMocHJvYy5nZXRJRCgpKSkgewotCQkJc2V0LmFkZEVsZW1lbnRzKG5ldyBJRWxlbWVudFtdIHsgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoc2V0LCBwcm9jLmdldElEKCksIHByb2MuZ2V0UHJvY2Vzc0luZGV4KCksIHByb2MpIH0pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJam9iTGlzdC5jbGVhcigpOwotCQlqb2JFbGVtZW50SGFuZGxlckxpc3QuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpvYgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnRIYW5kbGVyIGNyZWF0ZUVsZW1lbnRIYW5kbGVyKElQSm9iIGpvYikgewotCQlJRWxlbWVudEhhbmRsZXIgaGFuZGxlciA9IGdldEVsZW1lbnRIYW5kbGVyKGpvYi5nZXRJRCgpKTsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlciA9IG5ldyBFbGVtZW50SGFuZGxlcigpOwotCQkJam9iTGlzdC5wdXQoam9iLmdldElEKCksIGpvYik7Ci0JCQlqb2JFbGVtZW50SGFuZGxlckxpc3QucHV0KGpvYi5nZXRJRCgpLCBoYW5kbGVyKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2ZpbmRKb2JCeUlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQSm9iIGZpbmRKb2JCeUlkKFN0cmluZyBqb2JfaWQpIHsKLQkJcmV0dXJuIGpvYkxpc3QuZ2V0KGpvYl9pZCk7Ci0JfQotCQotCS8qKiAKLQkgKiBGaW5kIHByb2Nlc3MKLQkgKiBAcGFyYW0gam9iIGpvYgotCSAqIEBwYXJhbSBpZCBwcm9jZXNzIElECi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUFByb2Nlc3MgZmluZFByb2Nlc3MoSVBKb2Igam9iLCBTdHJpbmcgdGFza19pZCkgewotCQlpZiAoam9iID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGpvYi5nZXRQcm9jZXNzQnlJbmRleCh0YXNrX2lkKTsKLQkJLy9yZXR1cm4gam9iLmZpbmRQcm9jZXNzKGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2NfaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQUHJvY2VzcyBmaW5kUHJvY2VzcyhTdHJpbmcgcHJvY19pZCkgewotCQlJUEpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9iLmdldFByb2Nlc3NCeUlkKHByb2NfaWQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0Q3VycmVudFNldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRTZXRJZCgpIHsKLQkJcmV0dXJuIGN1cl9zZXRfaWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNnZXRFbGVtZW50SGFuZGxlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRWxlbWVudEhhbmRsZXIgZ2V0RWxlbWVudEhhbmRsZXIoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiAoSUVsZW1lbnRIYW5kbGVyKSBqb2JFbGVtZW50SGFuZGxlckxpc3QuZ2V0KGlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKFN0cmluZyBpZCkgewotCQlpZiAoaWQuZXF1YWxzKEVNUFRZX0lEKSkgewotCQkJcmV0dXJuIERFRkFVTFRfVElUTEU7Ci0JCX0KLQkJSVBKb2Igam9iID0gZ2V0Sm9iKCk7Ci0JCWlmIChqb2IgIT0gbnVsbCkgewotCQkJSVBRdWV1ZSBxdWV1ZSA9IGpvYi5nZXRRdWV1ZSgpOwotCQkJaWYgKHF1ZXVlICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gcXVldWUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJaWYgKHJtICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJtLmdldE5hbWUoKSArICI6ICIgKyBxdWV1ZS5nZXROYW1lKCkgKyAiOiIgKyBqb2IuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKiAKLQkgKiBHZXQgY3VycmVudCBqb2IgSUQuIFRoaXMgaXMgdGhlIGpvYiB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnQgam9iIElECi0JICovCi0JcHVibGljIElQSm9iIGdldEpvYigpIHsKLQkJcmV0dXJuIGN1cl9qb2I7Ci0JfQotCQotCS8qKiAKLQkgKiBHZXQgSm9icyB0aGF0IHdlIGtub3cgYWJvdXQuIFRoaXMgaXMgdHlwaWNhbGx5IGFsbCBqb2JzIGluIHRoZSBzeXN0ZW0uCi0JICogCi0JICogQHJldHVybiBqb2JzCi0JICovCi0JcHVibGljIElQSm9iW10gZ2V0Sm9icygpIHsKLQkJcmV0dXJuIGpvYkxpc3QudmFsdWVzKCkudG9BcnJheShuZXcgSVBKb2JbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShTdHJpbmcgaWQpIHsKLQkJSVBKb2Igam9iID0gZmluZEpvYkJ5SWQoaWQpOwotCQlpZiAoam9iID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCXJldHVybiBqb2IuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKiogCi0JICogR2V0IHByb2Nlc3Mgc3RhdHVzIHRleHQKLQkgKiBAcGFyYW0gcHJvYyBwcm9jZXNzCi0JICogQHJldHVybiBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NTdGF0dXNUZXh0KElQUHJvY2VzcyBwcm9jKSB7Ci0JCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9jLmdldFN0YXRlKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIkVycm9yIjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFF1ZXVlKCkgewotCQlyZXR1cm4gY3VyX3F1ZXVlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQUXVldWVbXSBnZXRRdWV1ZXMoKSB7Ci0JCWlmIChjdXJfcXVldWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGN1cl9xdWV1ZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS5nZXRRdWV1ZXMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IElQUXVldWVbXSB7fTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJldHVybiBzZXQgaWQKLQkgKiBAcGFyYW0gamlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRTZXRzKFN0cmluZyBqaWQpIHsKLQkJSUVsZW1lbnRIYW5kbGVyIGVIYW5kbGVyID0gZ2V0RWxlbWVudEhhbmRsZXIoamlkKTsKLQkJaWYgKGVIYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCi0JCUlFbGVtZW50W10gZWxlbWVudHMgPSBlSGFuZGxlci5nZXRFbGVtZW50cygpOwotCQlTdHJpbmdbXSBzZXRzID0gbmV3IFN0cmluZ1tlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTE7IGk8c2V0cy5sZW5ndGgrMTsgaSsrKSB7Ci0JCQlTdHJpbmcgdG1wID0gZWxlbWVudHNbaS0xXS5nZXRJRCgpOwotCQkJaWYgKHRtcC5lcXVhbHMoSUVsZW1lbnRIYW5kbGVyLlNFVF9ST09UX0lEKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGkgPT0gc2V0cy5sZW5ndGgpIHsKLQkJCQlzZXRzW2ktMV0gPSB0bXA7CQkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0c1tpXSA9IHRtcDsJCQkJCi0JCQl9Ci0JCX0KLQkJaWYgKHNldHMubGVuZ3RoID4gMCkgewotCQkJc2V0c1swXSA9IElFbGVtZW50SGFuZGxlci5TRVRfUk9PVF9JRDsKLQkJfQotCQlyZXR1cm4gc2V0czsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2dldFN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzKFN0cmluZyBpZCkgewotCQlJUEpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQlJUFByb2Nlc3MgcHJvYyA9IGpvYi5nZXRQcm9jZXNzQnlJZChpZCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb2MuZ2V0U3RhdGUoKS5vcmRpbmFsKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLlVOS05PV04ub3JkaW5hbCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjaGFzU3RvcHBlZEpvYigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3RvcHBlZEpvYigpIHsKLQkJZm9yIChJUEpvYiBqb2IgOiBnZXRKb2JzKCkpIHsKLQkJCWlmIChqb2IuaXNUZXJtaW5hdGVkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjaW5pdGlhbCgpCi0JICovCi0JcHVibGljIElQRWxlbWVudCBpbml0aWFsKElQVW5pdmVyc2UgdW5pdmVyc2UpIHsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCQlmb3IgKElQUXVldWUgcXVldWUgOiBybS5nZXRRdWV1ZXMoKSkgewotCQkJCWZvciAoSVBKb2Igam9iIDogcXVldWUuZ2V0Sm9icygpKSB7Ci0JCQkJCWFkZEpvYihqb2IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXNldEN1cnJlbnRTZXRJZChJRWxlbWVudEhhbmRsZXIuU0VUX1JPT1RfSUQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqIAotCSAqIElzIGN1cnJlbnQgc2V0IGNvbnRhaW4gcHJvY2VzcwotCSAqIEBwYXJhbSBqaWQgam9iIElECi0JICogQHBhcmFtIHByb2Nlc3NJRCBwcm9jZXNzIElECi0JICogQHJldHVybiB0cnVlIGlmIGpvYiBjb250YWlucyBwcm9jZXNzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDdXJyZW50U2V0Q29udGFpblByb2Nlc3MoU3RyaW5nIGppZCwgU3RyaW5nIHByb2Nlc3NJRCkgewotCQlJUEpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQlpZiAoIWpvYi5nZXRJRCgpLmVxdWFscyhqaWQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlciA9IGdldEVsZW1lbnRIYW5kbGVyKGppZCk7Ci0JCQlpZiAoZWxlbWVudEhhbmRsZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlJRWxlbWVudFNldCBzZXQgPSAoSUVsZW1lbnRTZXQpZWxlbWVudEhhbmRsZXIuZ2V0RWxlbWVudEJ5SUQoZ2V0Q3VycmVudFNldElkKCkpOwotCQkJaWYgKHNldCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBzZXQuY29udGFpbnMocHJvY2Vzc0lEKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNpc0pvYlN0b3AoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pvYlN0b3AoU3RyaW5nIGpvYl9pZCkgewotCQlpZiAoaXNOb0pvYihqb2JfaWQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlQSm9iIGpvYiA9IGZpbmRKb2JCeUlkKGpvYl9pZCk7Ci0JCXJldHVybiAoam9iID09IG51bGwgfHwgam9iLmlzVGVybWluYXRlZCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2lzTm9Kb2IoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vSm9iKFN0cmluZyBqaWQpIHsKLQkJcmV0dXJuIChqaWQgPT0gbnVsbCB8fCBqaWQubGVuZ3RoKCkgPT0gMCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNyZW1vdmVBbGxTdG9wcGVkSm9icygpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsU3RvcHBlZEpvYnMoKSB7Ci0JCU1hcDxTdHJpbmcsIElQUXVldWU+IHF1ZXVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVBRdWV1ZT4oKTsKLQkJZm9yIChJUEpvYiBqb2IgOiBnZXRKb2JzKCkpIHsKLQkJCUlQUXVldWUgcXVldWUgPSBqb2IuZ2V0UXVldWUoKTsKLQkJCWlmICghcXVldWVzLmNvbnRhaW5zS2V5KHF1ZXVlLmdldElEKCkpKSB7Ci0JCQkJcXVldWUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVtb3ZlVGVybWluYXRlZEpvYnMocXVldWUpOwotCQkJCXF1ZXVlcy5wdXQocXVldWUuZ2V0SUQoKSwgcXVldWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNyZW1vdmVKb2Iob3JnLmVjbGlwc2UucHRwLmNvcmUuSVBKb2IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSm9iKElQSm9iIGpvYikgewotCQkvL3JlbW92ZSBsYXVuY2ggZnJvbSBkZWJ1ZyB2aWV3Ci0JCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlTdHJpbmcgamlkID0gam9iLmdldElEKCk7Ci0JCWZvciAoSUxhdW5jaCBsYXVuY2ggOiBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaGVzKCkpIHsKLQkJCVN0cmluZyBsYXVuY2hlZEpvYklEID0gbGF1bmNoLmdldEF0dHJpYnV0ZShFbGVtZW50QXR0cmlidXRlcy5nZXRJZEF0dHJpYnV0ZURlZmluaXRpb24oKS5nZXRJZCgpKTsKLQkJCWlmIChsYXVuY2hlZEpvYklEICE9IG51bGwgJiYgbGF1bmNoZWRKb2JJRC5lcXVhbHMoamlkKSkgewotCQkJCWxhdW5jaE1hbmFnZXIucmVtb3ZlTGF1bmNoKGxhdW5jaCk7Ci0JCQl9Ci0JCX0KLQkJam9iTGlzdC5yZW1vdmUoamlkKTsKLQkJcmVtb3ZlRWxlbWVudEhhbmRsZXIoam9iKTsKLQkJZmlyZUpvYkNoYW5nZWRFdmVudChJSm9iQ2hhbmdlZExpc3RlbmVyLlJFTU9WRUQsIG51bGwsIGppZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9jZXNzKElQUHJvY2VzcyBwcm9jKSB7Ci0JCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlciA9IGpvYkVsZW1lbnRIYW5kbGVyTGlzdC5nZXQocHJvYy5nZXRKb2IoKS5nZXRJRCgpKTsKLQkJaWYgKGVsZW1lbnRIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlFbGVtZW50U2V0IHNldCA9IGVsZW1lbnRIYW5kbGVyLmdldFNldFJvb3QoKTsKLQkJCUlFbGVtZW50IGVsZW1lbnQgPSBzZXQuZ2V0RWxlbWVudEJ5SUQocHJvYy5nZXRJRCgpKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlzZXQucmVtb3ZlRWxlbWVudChwcm9jLmdldElEKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNzZXRDdXJyZW50U2V0SWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50U2V0SWQoU3RyaW5nIHNldF9pZCkgewotCQljdXJfc2V0X2lkID0gc2V0X2lkOwotCX0KLQkKLQkvKiogCi0JICogU2V0IGN1cnJlbnQgam9iIElECi0JICogQHBhcmFtIGpvYl9pZCBKb2IgSUQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2IoSVBKb2Igam9iKSB7Ci0JCVN0cmluZyBvbGRfaWQgPSAoY3VyX2pvYj09bnVsbCk/RU1QVFlfSUQ6Y3VyX2pvYi5nZXRJRCgpOwotCQlTdHJpbmcgbmV3X2lkID0gKGpvYj09bnVsbCk/RU1QVFlfSUQ6am9iLmdldElEKCk7Ci0JCWlmIChqb2IgIT0gbnVsbCkgewotCQkJYWRkSm9iKGpvYik7Ci0JCX0KLQkJY3VyX2pvYiA9IGpvYjsKLQkJZmlyZUpvYkNoYW5nZWRFdmVudChJSm9iQ2hhbmdlZExpc3RlbmVyLkNIQU5HRUQsIG5ld19pZCwgb2xkX2lkKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHF1ZXVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVldWUoSVBRdWV1ZSBxdWV1ZSkgewotCQlpZiAocXVldWUgIT0gY3VyX3F1ZXVlKSB7Ci0JCQljdXJfcXVldWUgPSBxdWV1ZTsKLQkJCXNldEpvYihudWxsKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQljbGVhcigpOwotCQltb2RlbFByZXNlbnRhdGlvbiA9IG51bGw7Ci0JCXN1cGVyLnNodXRkb3duKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNzaXplKCkKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBqb2JMaXN0LnNpemUoKTsKLQl9Ci0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiB0ZXJtaW5hdGUgYWN0aW9uCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiogdGVybWluYXRlIGFsbCBwcm9jZXNzZXMgaW4gY3VycmVudCBqb2IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVKb2IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQSm9iIGpvYiA9IGdldEpvYigpOwotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCWpvYi5nZXRRdWV1ZSgpLmdldFJlc291cmNlTWFuYWdlcigpLnRlcm1pbmF0ZUpvYihqb2IpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqb2IKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRWxlbWVudEhhbmRsZXIoSVBKb2Igam9iKSB7Ci0JCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlciA9IGdldEVsZW1lbnRIYW5kbGVyKGpvYi5nZXRJRCgpKTsKLQkJaWYgKGVsZW1lbnRIYW5kbGVyICE9IG51bGwpIHsKLQkJCWVsZW1lbnRIYW5kbGVyLnJlbW92ZUFsbFJlZ2lzdGVyZWQoKTsKLQkJCWVsZW1lbnRIYW5kbGVyLmNsZWFuKCk7Ci0JCX0KLQkJam9iRWxlbWVudEhhbmRsZXJMaXN0LnJlbW92ZShqb2IuZ2V0SUQoKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNldAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gdGFza0lECi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudCBjcmVhdGVQcm9jZXNzRWxlbWVudChJRWxlbWVudFNldCBzZXQsIFN0cmluZyBrZXksIFN0cmluZyB0YXNrSUQsIElQUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudChzZXQsIGtleSwgdGFza0lELCBwcm9jZXNzKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJRWxlbWVudCBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldE5hbWUoKSkuY29tcGFyZVRvKG5ldyBJbnRlZ2VyKGUuZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tYW5hZ2Vycy9NYWNoaW5lTWFuYWdlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tYW5hZ2Vycy9NYWNoaW5lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBjMTM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbWFuYWdlcnMvTWFjaGluZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLm1hbmFnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Ob2RlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWFjaGluZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFVJTWFuYWdlciB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJRWxlbWVudEhhbmRsZXI+IG1hY2hpbmVFbGVtZW50SGFuZGxlckxpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElFbGVtZW50SGFuZGxlcj4oKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElQTWFjaGluZT4gbWFjaGluZUxpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQTWFjaGluZT4oKTsKLQlwcm90ZWN0ZWQgSVBNYWNoaW5lIGN1cl9tYWNoaW5lID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFRkFVTFRfVElUTEUgPSAiUGxlYXNlIHNlbGVjdCBhIG1hY2hpbmUiOwotCQotCS8qKiAKLQkgKiBBZGQgYSBuZXcgbWFjaGluZSB0byBtYWNoaW5lTGlzdC4gQWRkIGFueSBuZXcgbm9kZXMgdG8gdGhlIGVsZW1lbnQKLQkgKiBoYW5kbGVyIGZvciB0aGUgbWFjaGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFjIG1hY2hpbmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hY2hpbmUgd2FzIGFkZGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWFjaGluZShJUE1hY2hpbmUgbWFjKSB7Ci0JCWlmIChtYWMgIT0gbnVsbCkgewotCQkJSUVsZW1lbnRIYW5kbGVyIGhhbmRsZXI7Ci0JCQlpZiAoIW1hY2hpbmVMaXN0LmNvbnRhaW5zS2V5KG1hYy5nZXRJRCgpKSkgewotCQkJCWhhbmRsZXIgPSBuZXcgRWxlbWVudEhhbmRsZXIoKTsKLQkJCQltYWNoaW5lTGlzdC5wdXQobWFjLmdldElEKCksIG1hYyk7Ci0JCQkJbWFjaGluZUVsZW1lbnRIYW5kbGVyTGlzdC5wdXQobWFjLmdldElEKCksIGhhbmRsZXIpOwotCQkJfSBlbHNlIHsKLQkJCQloYW5kbGVyID0gbWFjaGluZUVsZW1lbnRIYW5kbGVyTGlzdC5nZXQobWFjLmdldElEKCkpOwkJCQkKLQkJCX0KLQkJCUxpc3Q8SUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudD4oKTsKLQkJCUlFbGVtZW50U2V0IHNldCA9IGhhbmRsZXIuZ2V0U2V0Um9vdCgpOwotCQkJZm9yIChJUE5vZGUgbm9kZSA6IG1hYy5nZXROb2RlcygpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGNyZWF0ZU5vZGVFbGVtZW50KHNldCwgbm9kZS5nZXRJRCgpLCBub2RlLmdldE5hbWUoKSwgbm9kZSkpOwotCQkJfQotCQkJc2V0LmFkZEVsZW1lbnRzKGVsZW1lbnRzLnRvQXJyYXkobmV3IElFbGVtZW50WzBdKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIEFkZCBtYWNoaW5lCi0JICogQHBhcmFtIG1hYyBtYWNoaW5lCi0JICovCi0JcHVibGljIHZvaWQgYWRkTm9kZShJUE5vZGUgbm9kZSkgewotCQlhZGRNYWNoaW5lKG5vZGUuZ2V0TWFjaGluZSgpKTsKLQkJSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyID0gbWFjaGluZUVsZW1lbnRIYW5kbGVyTGlzdC5nZXQobm9kZS5nZXRNYWNoaW5lKCkuZ2V0SUQoKSk7Ci0JCUlFbGVtZW50U2V0IHNldCA9IGVsZW1lbnRIYW5kbGVyLmdldFNldFJvb3QoKTsKLQkJc2V0LmFkZEVsZW1lbnRzKG5ldyBJRWxlbWVudFtdIHsgY3JlYXRlTm9kZUVsZW1lbnQoc2V0LCBub2RlLmdldElEKCksIG5vZGUuZ2V0TmFtZSgpLCBub2RlKSB9KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1hY2hpbmVMaXN0ICE9IG51bGwpIHsKLQkJCW1hY2hpbmVMaXN0LmNsZWFyKCk7Ci0JCQltYWNoaW5lRWxlbWVudEhhbmRsZXJMaXN0LmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUE1hY2hpbmUgZmluZE1hY2hpbmVCeUlkKFN0cmluZyBpZCkgewotCQlyZXR1cm4gKElQTWFjaGluZSkgbWFjaGluZUxpc3QuZ2V0KGlkKTsKLQl9Ci0JCi0JLyoqIEZpbmQgbm9kZSAKLQkgKiBAcGFyYW0gbm9kZV9pZCBub2RlIElECi0JICogQHJldHVybiBudWxsIGlzIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBJUE5vZGUgZmluZE5vZGUoU3RyaW5nIG5vZGVfaWQpIHsKLQkJSVBNYWNoaW5lIG1hY2hpbmUgPSBnZXRDdXJyZW50TWFjaGluZSgpOwotCQlpZiAobWFjaGluZSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0KioqIFBPU1NJQkxFIEVSUk9SOiBVbmFibGUgdG8gZmluZCBtYWNoaW5lIik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbWFjaGluZS5nZXROb2RlQnlJZChub2RlX2lkKTsKLQl9Ci0JCi0JLyoqIEdldCBjdXJyZW50IG1hY2hpbmUgSUQKLQkgKiBAcmV0dXJuIGN1cnJlbnQgbWFjaGluZSBJRAotCSAqLwotCXB1YmxpYyBJUE1hY2hpbmUgZ2V0Q3VycmVudE1hY2hpbmUoKSB7Ci0JCXJldHVybiBjdXJfbWFjaGluZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyI2dldEN1cnJlbnRTZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50U2V0SWQoKSB7Ci0JCXJldHVybiBjdXJfc2V0X2lkOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0RWxlbWVudEhhbmRsZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnRIYW5kbGVyIGdldEVsZW1lbnRIYW5kbGVyKFN0cmluZyBpZCkgewotCQlyZXR1cm4gKElFbGVtZW50SGFuZGxlcikgbWFjaGluZUVsZW1lbnRIYW5kbGVyTGlzdC5nZXQoaWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZC5lcXVhbHMoRU1QVFlfSUQpKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9USVRMRTsKLQkJfQotCQkvL1RPRE8gY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgc2hvdWxkIGhhcHBlbi4gQ2FuIHdlIGp1c3QgdXNlIGN1cl9tYWNoaW5lPwotCQlJUE1hY2hpbmUgbWFjaGluZSA9IGdldEN1cnJlbnRNYWNoaW5lKCk7Ci0JCWlmIChtYWNoaW5lICE9IG51bGwpIHsKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0gPSBtYWNoaW5lLmdldFJlc291cmNlTWFuYWdlcigpOwotCQkJaWYgKHJtICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcm0uZ2V0TmFtZSgpICsgIjogIiArIG1hY2hpbmUuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqIEdldCBtYWNoaW5lcwotCSAqIEByZXR1cm4gbWFjaGluZXMKLQkgKi8KLQlwdWJsaWMgSVBNYWNoaW5lW10gZ2V0TWFjaGluZXMoKSB7Ci0JCXJldHVybiBtYWNoaW5lTGlzdC52YWx1ZXMoKS50b0FycmF5KG5ldyBJUE1hY2hpbmVbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShTdHJpbmcgaWQpIHsKLQkJaWYgKGN1cl9tYWNoaW5lID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCXJldHVybiBjdXJfbWFjaGluZS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKiAKLQkgKiBHZXQgbm9kZSBzdGF0dXMuCi0JICogCi0JICogQ3VycmVudGx5IHRoZSBub2RlIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6Ci0JICogCS0gaWYgdGhlIG5vZGUgaXMgdXA6Ci0JICogCQktIGlmIHRoZXJlIGFyZSAqYW55KiBydW5uaW5nIHByb2Nlc3NlcyBvbiB0aGUgbm9kZTogTk9ERV9SVU5OSU5HCi0JICogCQktIGlmIHRoZXJlIGFyZSBubyBydW5uaW5nIHByb2Nlc3NlcywgYnV0IG9uZSBvciBtb3JlIGV4aXRlZCBwcm9jZXNzZXMgb24gdGhlIG5vZGU6IE5PREVfRVhJVEVECi0JICogIAktIGlmIHRoZXJlIGlzIGV4dHJhU3RhdGU6IGV4dHJhU3RhdGUKLQkgKiAgCS0gaWYgdGhlcmUgaXMgbm8gZXh0cmFTdGF0ZTogTk9ERV9VUAotCSAqICAtIGlmIHRoZSBub2RlIGlzIGRvd246IE5PREVfRE9XTgotCSAqICAtIGlmIHRoZSBub2RlIGlzIGVycm9yOiBOT0RFX0VSUk9SCi0JICogIAotCSAqICBUT0RPOiBpbiB0aGUgZnV0dXJlLCB0aGUgbWFjaGluZSB2aWV3IHNob3VsZCBiZSBsaW5rZWQgdG8gdGhlIGpvYnMgdmlldy4gVGhlIG5vZGUgc3RhdGUgc2hvdWxkIG9ubHkKLQkgKiAgYmUgc2hvd24gYXMgTk9ERV9SVU5OSU5HIGlmIGFueSBwcm9jZXNzZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGpvYiBhcmUgcnVubmluZy4KLQkgKiAgCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXROb2RlU3RhdHVzKElQTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGVBdHRyaWJ1dGVzLlN0YXRlIG5vZGVTdGF0ZSA9IG5vZGUuZ2V0U3RhdGUoKTsKLQkJCQotCQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxOb2RlQXR0cmlidXRlcy5FeHRyYVN0YXRlPiBleHRyYVN0YXRlQXR0ciA9IAotCQkJCW5vZGUuZ2V0QXR0cmlidXRlKE5vZGVBdHRyaWJ1dGVzLmdldEV4dHJhU3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJCi0JCQlpZiAoZXh0cmFTdGF0ZUF0dHIgIT0gbnVsbCkgewotCQkJCXJldHVybiBOb2RlQXR0cmlidXRlcy5TdGF0ZS52YWx1ZXMoKS5sZW5ndGggKyBleHRyYVN0YXRlQXR0ci5nZXRWYWx1ZUluZGV4KCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUgcHJveHkKLQkJCQotCQkJaWYgKG5vZGVTdGF0ZSA9PSBOb2RlQXR0cmlidXRlcy5TdGF0ZS5VUCkgewotCQkJCUlQUHJvY2Vzc1tdIHByb2NzID0gbm9kZS5nZXRQcm9jZXNzZXMoKTsKLQkJCQlpZiAocHJvY3MubGVuZ3RoID4gMCkgewotCQkJCQlmb3IgKElQUHJvY2VzcyBwcm9jIDogcHJvY3MpIHsKLQkJCQkJCWlmICghcHJvYy5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJCQkJCXJldHVybiBOb2RlQXR0cmlidXRlcy5TdGF0ZS52YWx1ZXMoKS5sZW5ndGggKyBOb2RlQXR0cmlidXRlcy5FeHRyYVN0YXRlLlJVTk5JTkdfUFJPQ0VTUy5vcmRpbmFsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIE5vZGVBdHRyaWJ1dGVzLlN0YXRlLnZhbHVlcygpLmxlbmd0aCArIE5vZGVBdHRyaWJ1dGVzLkV4dHJhU3RhdGUuRVhJVEVEX1BST0NFU1Mub3JkaW5hbCgpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCQkJcmV0dXJuIG5vZGVTdGF0ZS5vcmRpbmFsKCk7Ci0JCX0KLQkJcmV0dXJuIE5vZGVBdHRyaWJ1dGVzLlN0YXRlLlVOS05PV04ub3JkaW5hbCgpOwotCX0KLQkKLQkvKiogR2V0IG5vZGUgc3RhdHVzIHRleHQKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gc3RhdHVzIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVTdGF0dXNUZXh0KElQTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiAiVW5rbm93biI7Ci0JCX0KLQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxOb2RlQXR0cmlidXRlcy5TdGF0ZT4gbm9kZVN0YXRlQXR0ciA9Ci0JCQlub2RlLmdldEF0dHJpYnV0ZShOb2RlQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCWlmKG5vZGVTdGF0ZUF0dHIgPT0gbnVsbCkgewotCQkJcmV0dXJuICJVbmtub3duIjsKLQkJfQotCQlOb2RlQXR0cmlidXRlcy5TdGF0ZSBub2RlU3RhdGUgPSBub2RlU3RhdGVBdHRyLmdldFZhbHVlKCk7Ci0JCQotCQlpZiAobm9kZVN0YXRlID09IE5vZGVBdHRyaWJ1dGVzLlN0YXRlLlVQKSB7Ci0JCQlpZiAobm9kZS5nZXRQcm9jZXNzZXMoKS5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UHJvY2Vzc2VzKClbMF0uZ2V0Sm9iKCkuaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQkJcmV0dXJuICJFeGl0ZWQiOwotCQkJCX0KLQkJCQlyZXR1cm4gIlJ1bm5pbmciOwotCQkJfQotCi0JCQlFbnVtZXJhdGVkQXR0cmlidXRlPE5vZGVBdHRyaWJ1dGVzLkV4dHJhU3RhdGU+IGV4dHJhU3RhdGVBdHRyID0KLQkJCQlub2RlLmdldEF0dHJpYnV0ZShOb2RlQXR0cmlidXRlcy5nZXRFeHRyYVN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCU5vZGVBdHRyaWJ1dGVzLkV4dHJhU3RhdGUgZXh0cmFTdGF0ZSA9IE5vZGVBdHRyaWJ1dGVzLkV4dHJhU3RhdGUuTk9ORTsKLQkJCWlmIChleHRyYVN0YXRlQXR0ciAhPSBudWxsKSB7Ci0JCQkJZXh0cmFTdGF0ZSA9IGV4dHJhU3RhdGVBdHRyLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChleHRyYVN0YXRlICE9IE5vZGVBdHRyaWJ1dGVzLkV4dHJhU3RhdGUuTk9ORSkgewotCQkJCXJldHVybiBleHRyYVN0YXRlLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGVTdGF0ZS50b1N0cmluZygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjZ2V0U3RhdHVzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoU3RyaW5nIGlkKSB7Ci0JCUlQTWFjaGluZSBtYWNoaW5lID0gZ2V0Q3VycmVudE1hY2hpbmUoKTsKLQkJaWYgKG1hY2hpbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE5vZGVTdGF0dXMobWFjaGluZS5nZXROb2RlQnlJZChpZCkpOwotCQl9Ci0JCXJldHVybiBnZXROb2RlU3RhdHVzKG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjaW5pdGlhbCgpCi0JICovCi0JcHVibGljIElQRWxlbWVudCBpbml0aWFsKElQVW5pdmVyc2UgdW5pdmVyc2UpIHsKLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogcm0uZ2V0TWFjaGluZXMoKSkgewotCQkJCWFkZE1hY2hpbmUobWFjaGluZSk7Ci0JCQl9Ci0JCX0KLQotCQlzZXRDdXJyZW50U2V0SWQoSUVsZW1lbnRIYW5kbGVyLlNFVF9ST09UX0lEKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKiBJcyBjdXJyZW50IHNldCBjb250YWluIG5vZGUKLQkgKiBAcGFyYW0gbWlkIG1hY2hpbmUgSUQKLQkgKiBAcGFyYW0gbm9kZUlEIG5vZGUgaUQKLQkgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudCBzZXQgY29udGFpbnMgbm9kZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudFNldENvbnRhaW5Ob2RlKFN0cmluZyBtaWQsIFN0cmluZyBub2RlSUQpIHsKLQkJSVBNYWNoaW5lIG1hY2hpbmUgPSBnZXRDdXJyZW50TWFjaGluZSgpOwotCQlpZiAobWFjaGluZSAhPSBudWxsKSB7Ci0JCQlpZiAoIW1hY2hpbmUuZ2V0SUQoKS5lcXVhbHMobWlkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlJRWxlbWVudEhhbmRsZXIgZWxlbWVudEhhbmRsZXIgPSBnZXRFbGVtZW50SGFuZGxlcihtYWNoaW5lLmdldElEKCkpOwotCQkJaWYgKGVsZW1lbnRIYW5kbGVyID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSUVsZW1lbnRTZXQgc2V0ID0gKElFbGVtZW50U2V0KWVsZW1lbnRIYW5kbGVyLmdldEVsZW1lbnRCeUlEKGdldEN1cnJlbnRTZXRJZCgpKTsKLQkJCWlmIChzZXQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gc2V0LmNvbnRhaW5zKG5vZGVJRCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiogSXMgbm8gbWFjaGluZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBubyBtYWNoaW5lCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb01hY2hpbmUoKSB7Ci0JCXJldHVybiBjdXJfbWFjaGluZSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYWNoaW5lCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWFjaGluZShJUE1hY2hpbmUgbWFjaGluZSkgewotCQltYWNoaW5lTGlzdC5yZW1vdmUobWFjaGluZS5nZXRJRCgpKTsKLQkJbWFjaGluZUVsZW1lbnRIYW5kbGVyTGlzdC5yZW1vdmUobWFjaGluZS5nZXRJRCgpKTsKLQkJSUVsZW1lbnRIYW5kbGVyIGhhbmRsZXIgPSBtYWNoaW5lRWxlbWVudEhhbmRsZXJMaXN0LmdldChtYWNoaW5lLmdldElEKCkpOwotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJRWxlbWVudFNldCBzZXQgPSBoYW5kbGVyLmdldFNldFJvb3QoKTsKLQkJCWZvciAoSVBOb2RlIG5vZGUgOiBtYWNoaW5lLmdldE5vZGVzKCkpIHsKLQkJCQlJRWxlbWVudCBlbGVtZW50ID0gc2V0LmdldEVsZW1lbnRCeUlEKG5vZGUuZ2V0SUQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlzZXQucmVtb3ZlRWxlbWVudChub2RlLmdldElEKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY3VyX21hY2hpbmUgPT0gbWFjaGluZSkgewotCQkJY3VyX21hY2hpbmUgPSBudWxsOwotCQl9Ci0JfQkKLQkKLQkvKiogQWRkIG1hY2hpbmUKLQkgKiBAcGFyYW0gbWFjIG1hY2hpbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlKElQTm9kZSBub2RlKSB7Ci0JCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlciA9IG1hY2hpbmVFbGVtZW50SGFuZGxlckxpc3QuZ2V0KG5vZGUuZ2V0TWFjaGluZSgpLmdldElEKCkpOwotCQlJRWxlbWVudFNldCBzZXQgPSBlbGVtZW50SGFuZGxlci5nZXRTZXRSb290KCk7Ci0JCUlFbGVtZW50IGVsZW1lbnQgPSBzZXQuZ2V0RWxlbWVudEJ5SUQobm9kZS5nZXRJRCgpKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJc2V0LnJlbW92ZUVsZW1lbnQobm9kZS5nZXRJRCgpKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjc2V0Q3VycmVudFNldElkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudFNldElkKFN0cmluZyBzZXRfaWQpIHsKLQkJY3VyX3NldF9pZCA9IHNldF9pZDsKLQl9Ci0JCi0JLyoqIAotCSAqIFNldCBjdXJyZW50IG1hY2hpbmUgSUQuIElmIHRoZSBtYWNoaW5lIGhhcyBuZXZlciBiZWVuIHNldCBiZWZvcmUsIGFkZCBhbiBlbnRyeSB0bwotCSAqIHRoZSBtYWNoaW5lTGlzdCwgYW5kIGFkZCB0aGUgbm9kZXMgdG8gdGhlIGVsZW1lbnQgaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWFjaGluZV9pZCBtYWNoaW5lIElECi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFjaGluZShJUE1hY2hpbmUgbWFjaGluZSkgewotCQlpZiAobWFjaGluZSAhPSBjdXJfbWFjaGluZSkgewotCQkJY3VyX21hY2hpbmUgPSBtYWNoaW5lOwotCQkJYWRkTWFjaGluZShtYWNoaW5lKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQljbGVhcigpOwotCQltb2RlbFByZXNlbnRhdGlvbiA9IG51bGw7Ci0JCXN1cGVyLnNodXRkb3duKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlciNzaXplKCkKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBtYWNoaW5lTGlzdC5zaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXQKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50IGNyZWF0ZU5vZGVFbGVtZW50KElFbGVtZW50U2V0IHNldCwgU3RyaW5nIGtleSwgU3RyaW5nIG5hbWUsIElQTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudChzZXQsIGtleSwgbmFtZSwgbm9kZSkgewotCQkJcHVibGljIGludCBjb21wYXJlVG8oSUVsZW1lbnQgZSkgewotCQkJCXJldHVybiBnZXRJRCgpLmNvbXBhcmVUbyhlLmdldElEKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL21vZGVsL0VsZW1lbnQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRmMjM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZCA9ICIwIjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSAiIjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWdpc3RlcmVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElFbGVtZW50IHBhcmVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIElQRWxlbWVudCBwRWxlbWVudCA9IG51bGw7Ci0JCi0JLyoqIAotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgZWxlbWVudAotCSAqIEBwYXJhbSBpZCBlbGVtZW50IElECi0JICogQHBhcmFtIG5hbWUgZWxlbWVudCBuYW1lCi0JICovCi0JcHVibGljIEVsZW1lbnQoSUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBJUEVsZW1lbnQgcEVsZW1lbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wRWxlbWVudCA9IHBFbGVtZW50OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQjY2xvbmVFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnQgY2xvbmVFbGVtZW50KCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJRWxlbWVudCljbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXROYW1lKCkuY29tcGFyZVRvKGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50I2dldElEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQjZ2V0UGFyZW50KCkKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnQgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQlwdWJsaWMgSVBFbGVtZW50IGdldFBFbGVtZW50KCkgewotCQlyZXR1cm4gcEVsZW1lbnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudCNpc1JlZ2lzdGVyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZCgpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyZWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50I3NldFJlZ2lzdGVyZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWdpc3RlcmVkKGJvb2xlYW4gcmVnaXN0ZXJlZCkgewotCQl0aGlzLnJlZ2lzdGVyZWQgPSByZWdpc3RlcmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvRWxlbWVudEhhbmRsZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvRWxlbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0MzcyNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL21vZGVsL0VsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEhhbmRsZXIgZXh0ZW5kcyBFbGVtZW50U2V0IGltcGxlbWVudHMgSUVsZW1lbnRIYW5kbGVyIHsKLQlwcml2YXRlIExpc3Q8SUVsZW1lbnQ+IHJlZ2lzdGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnQ+KCk7Ci0JCi0JcHVibGljIEVsZW1lbnRIYW5kbGVyKCkgewotCQlzdXBlcihudWxsLCBTRVRfUk9PVF9JRCwgU0VUX1JPT1RfSUQpOwotCQkvL2NyZWF0ZSByb290IAotCQlhZGRFbGVtZW50cyhuZXcgSUVsZW1lbnRbXSB7IG5ldyBFbGVtZW50U2V0KHRoaXMsIFNFVF9ST09UX0lELCBTRVRfUk9PVF9JRCkgfSk7Ci0JfQotCXB1YmxpYyBJRWxlbWVudFNldCBnZXRTZXRSb290KCkgewotCQlyZXR1cm4gKElFbGVtZW50U2V0KWdldEVsZW1lbnRCeUlEKFNFVF9ST09UX0lEKTsKLQl9Ci0JcHVibGljIElFbGVtZW50U2V0W10gZ2V0U2V0c1dpdGhFbGVtZW50KFN0cmluZyBpZCkgewotCQlMaXN0PElFbGVtZW50U2V0PiBhTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRTZXQ+KCk7Ci0JCWZvciAoSUVsZW1lbnQgZWxlbWVudCA6IGdldEVsZW1lbnRzKCkpIHsKLQkJCWlmICgoKElFbGVtZW50U2V0KWVsZW1lbnQpLmdldEVsZW1lbnRCeUlEKGlkKSAhPSBudWxsKSB7Ci0JCQkJYUxpc3QuYWRkKChJRWxlbWVudFNldCllbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElFbGVtZW50U2V0W10pYUxpc3QudG9BcnJheShuZXcgSUVsZW1lbnRTZXRbMF0pOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlZ2lzdGVyKElFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyTGlzdC5jb250YWlucyhlbGVtZW50KTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkVG9SZWdpc3RlcihJRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoSUVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQlpZiAoIWNvbnRhaW5zUmVnaXN0ZXIoZWxlbWVudCkpIHsKLQkJCQllbGVtZW50LnNldFJlZ2lzdGVyZWQodHJ1ZSk7Ci0JCQkJcmVnaXN0ZXJMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVnaXN0ZXIoSUVsZW1lbnRbXSBlbGVtZW50cykgewotCQlmb3IgKElFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJaWYgKHJlZ2lzdGVyTGlzdC5yZW1vdmUoZWxlbWVudCkpCi0JCQkJZWxlbWVudC5zZXRSZWdpc3RlcmVkKGZhbHNlKTsKLQkJfQotCX0KLQlwdWJsaWMgSUVsZW1lbnRbXSBnZXRSZWdpc3RlcmVkKCkgewotCQlyZXR1cm4gcmVnaXN0ZXJMaXN0LnRvQXJyYXkobmV3IElFbGVtZW50WzBdKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQWxsUmVnaXN0ZXJlZCgpIHsKLQkJcmVnaXN0ZXJMaXN0LmNsZWFyKCk7Ci0JfQotCXB1YmxpYyBpbnQgdG90YWxSZWdpc3RlcmVkKCkgewotCQlyZXR1cm4gcmVnaXN0ZXJMaXN0LnNpemUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL21vZGVsL0VsZW1lbnRTZXQuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvRWxlbWVudFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY4YzRmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvRWxlbWVudFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFNldCBleHRlbmRzIEVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudFNldCB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLElFbGVtZW50PiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLElFbGVtZW50PigpOwotCXByaXZhdGUgTGlzdDxJRWxlbWVudD4gZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50PigpOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1hdGNoU2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXByaXZhdGUgaW50IG51bWJlcl9vZl9lbGVtZW50cyA9IDA7Ci0JCi0JcHVibGljIEVsZW1lbnRTZXQoSUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgaWQsIG5hbWUsIG51bGwpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RTZXQoKSB7Ci0JCXJldHVybiAoaWQuZXF1YWxzKElFbGVtZW50SGFuZGxlci5TRVRfUk9PVF9JRCkpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50cyhJRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoSUVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQlpZiAoY29udGFpbnMoZWxlbWVudC5nZXRJRCgpKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFpc1Jvb3RTZXQoKSkgewotCQkJCUlFbGVtZW50U2V0W10gc2V0cyA9ICgoSUVsZW1lbnRIYW5kbGVyKWdldFBhcmVudCgpKS5nZXRTZXRzV2l0aEVsZW1lbnQoZWxlbWVudC5nZXRJRCgpKTsKLQkJCQlmb3IgKElFbGVtZW50U2V0IHNldCA6IHNldHMpIHsKLQkJCQkJc2V0LmFkZE1hdGNoU2V0KGdldElEKCkpOwotCQkJCQlhZGRNYXRjaFNldChzZXQuZ2V0SUQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxlbWVudE1hcC5wdXQoZWxlbWVudC5nZXRJRCgpLCBlbGVtZW50KTsKLQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCW51bWJlcl9vZl9lbGVtZW50cysrOwotCQl9Ci0JCXNvcnRpbmcoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNvcnRpbmcoKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudExpc3QpOwotCX0KLQlwdWJsaWMgSUVsZW1lbnQgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVsZW1lbnRMaXN0LmdldChpbmRleCk7Ci0JfQotCXByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChTdHJpbmcgbmFtZSkgewotCQlpbnQgbG8gPSAwOwotCQlpbnQgaGkgPSBudW1iZXJfb2ZfZWxlbWVudHMgLSAxOwotCQlpbnQgbWlkID0gMDsKLQkJd2hpbGUgKGxvIDw9IGhpKSB7Ci0JCQltaWQgPSAobG8gKyBoaSkgLyAyOwotCQkJaW50IGNvbXBfcmVzID0gY29tcGFyZShnZXRFbGVtZW50KG1pZCksIG5hbWUpOwotCQkJaWYgKGNvbXBfcmVzID09IDApCi0JCQkJcmV0dXJuIG1pZDsKLQkJCWVsc2UgaWYgKGNvbXBfcmVzID4gMCkKLQkJCQloaSA9IG1pZCAtIDE7Ci0JCQllbHNlCi0JCQkJbG8gPSArK21pZDsKLQkJfQotCQlyZXR1cm4gLW1pZCAtIDE7Ci0JfQotCXB1YmxpYyBJRWxlbWVudCBnZXRFbGVtZW50QnlJRChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGlkKTsKLQl9Ci0JcHVibGljIElFbGVtZW50IGdldEVsZW1lbnRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoKG5hbWUpOwotCQlpZiAoaW5kZXggPCBudW1iZXJfb2ZfZWxlbWVudHMpCi0JCQlyZXR1cm4gZWxlbWVudExpc3QuZ2V0KGluZGV4KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBpbnQgZmluZEluZGV4QnlJRChTdHJpbmcgaWQpIHsKLQkJSUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnRCeUlEKGlkKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmRJbmRleEJ5TmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQlwdWJsaWMgaW50IGZpbmRJbmRleEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2gobmFtZSk7Ci0JCWlmIChpbmRleCA8IG51bWJlcl9vZl9lbGVtZW50cykKLQkJCXJldHVybiBpbmRleDsKLQkJcmV0dXJuIC0xOwotCX0KLQlwdWJsaWMgSUVsZW1lbnRbXSBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRMaXN0LnRvQXJyYXkobmV3IElFbGVtZW50WzBdKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudHMoSUVsZW1lbnRbXSBlbGVtZW50cykgewotCQlmb3IgKElFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJcmVtb3ZlRWxlbWVudChlbGVtZW50LmdldElEKCkpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnQoU3RyaW5nIGlkKSB7Ci0JCUlFbGVtZW50IGVsbWVuZXQgPSBlbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCWVsZW1lbnRMaXN0LnJlbW92ZShlbG1lbmV0KTsKLQkJbnVtYmVyX29mX2VsZW1lbnRzLS07Ci0KLQkJaWYgKCFpc1Jvb3RTZXQoKSkgewotCQkJSUVsZW1lbnRTZXRbXSBzZXRzID0gKChJRWxlbWVudEhhbmRsZXIpZ2V0UGFyZW50KCkpLmdldFNldHNXaXRoRWxlbWVudChpZCk7Ci0JCQlmb3IgKElFbGVtZW50U2V0IHNldCA6IHNldHMpIHsKLQkJCQlzZXQucmVtb3ZlTWF0Y2hTZXQoZ2V0SUQoKSk7Ci0JCQkJcmVtb3ZlTWF0Y2hTZXQoc2V0LmdldElEKCkpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgaW50IGNvbXBhcmUoSUVsZW1lbnQgZTEsIFN0cmluZyB2YWwpIHsKLQkJcmV0dXJuIGNvbXBhcmVUbyhlMS5nZXROYW1lKCksIHZhbCk7Ci0JfQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXJldHVybiBzMS5jb21wYXJlVG8oczIpOwotCX0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBudW1iZXJfb2ZfZWxlbWVudHM7Ci0JfQotCXB1YmxpYyB2b2lkIGNsZWFuKCkgewotCQllbGVtZW50TWFwLmNsZWFyKCk7Ci0JCWVsZW1lbnRMaXN0LmNsZWFyKCk7Ci0JCW1hdGNoU2V0TGlzdC5jbGVhcigpOwotCQludW1iZXJfb2ZfZWxlbWVudHMgPSAwOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBjb250YWlucyhlbGVtZW50LmdldElEKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGVsZW1lbnRNYXAuY29udGFpbnNLZXkoaWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYXRjaFNldChTdHJpbmcgc2V0SUQpIHsKLQkJaWYgKCFjb250YWluc01hdGNoU2V0KHNldElEKSkgewotCQkJbWF0Y2hTZXRMaXN0LmFkZChzZXRJRCk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlTWF0Y2hTZXQoU3RyaW5nIHNldElEKSB7Ci0JCW1hdGNoU2V0TGlzdC5yZW1vdmUoc2V0SUQpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc01hdGNoU2V0KFN0cmluZyBzZXRJRCkgewotCQlyZXR1cm4gbWF0Y2hTZXRMaXN0LmNvbnRhaW5zKHNldElEKTsKLQl9Ci0JcHVibGljIFN0cmluZ1tdIGdldE1hdGNoU2V0SURzKCkgewotCQlyZXR1cm4gbWF0Y2hTZXRMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tb2RlbC9JRWxlbWVudC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tb2RlbC9JRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWYxMDE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvSUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudCBleHRlbmRzIENsb25lYWJsZSwgQ29tcGFyYWJsZTxJRWxlbWVudD4sIElBZGFwdGFibGUgewotCS8qKiAKLQkgKiBDbG9uZSBhIG5ldyBlbGVtZW50Ci0JICogQHJldHVybiBjbG9uZWQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBJRWxlbWVudCBjbG9uZUVsZW1lbnQoKTsKLQotCS8qKiAKLQkgKiBHZXQgZWxlbWVudCBJRAotCSAqIEByZXR1cm4gZWxlbWVudCBJRCBpbiBzdHJpbmcgZm9ybWF0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpOwotCQotCS8qKiAKLQkgKiBHZXQgZWxlbWVudCBuYW1lCi0JICogQHJldHVybiBuYW1lIG9mIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCBwYXJlbnQKLQkgKiBAcmV0dXJuIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnQgZ2V0UGFyZW50KCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjb3JlIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4KLQkgKiBAcmV0dXJuIElQRWxlbWVudAotCSAqLwotCXB1YmxpYyBJUEVsZW1lbnQgZ2V0UEVsZW1lbnQoKTsKLQkKLQkvKiogCi0JICogSXMgZWxlbWVudCByZWdpc3RlcmVkCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgaXMgcmVnaXN0ZXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZCgpOwotCQotCS8qKiAKLQkgKiBTZXQgZWxlbWVudCB0byByZWdpc3RlciBvciBub3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJlZCBpcyByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyZWQoYm9vbGVhbiByZWdpc3RlcmVkKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvSUVsZW1lbnRIYW5kbGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL21vZGVsL0lFbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZiNjBlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvSUVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUHJlZmVyZW5jZUNvbnN0YW50czsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50SGFuZGxlciBleHRlbmRzIElFbGVtZW50U2V0IHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVRfUk9PVF9JRCA9IFByZWZlcmVuY2VDb25zdGFudHMuU0VUX1JPT1RfSUQ7Ci0JLyoqIEdldCBTZXQgcm9vdAotCSAqIEByZXR1cm4gcm9vdCBzZXQKLQkgKi8KLQlJRWxlbWVudFNldCBnZXRTZXRSb290KCk7Ci0JCi0JLyoqIEdldCBzZXRzIGluY2x1ZGVkCi0JICogQHBhcmFtIGlkIFRhcmdldCBlbGVtZW50IElECi0JICogQHJldHVybiBpbmNsdWRlZCBzZXRzCi0JICovCi0JSUVsZW1lbnRTZXRbXSBnZXRTZXRzV2l0aEVsZW1lbnQoU3RyaW5nIGlkKTsKLQkKLQkvKiogSXMgZWxlbWVudCByZWdpc3RlcmVkCi0JICogQHBhcmFtIGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyByZWdpc3RlcmVkCi0JICovCi0JYm9vbGVhbiBjb250YWluc1JlZ2lzdGVyKElFbGVtZW50IGVsZW1lbnQpOwotCS8qKiBBZGQgZWxlbWVudCB0byByZWdpc3RlcmVkIGxpc3QKLQkgKiBAcGFyYW0gZWxlbWVudCBUYXJnZXQgZWxlbWVudAotCSAqLwotCXZvaWQgYWRkVG9SZWdpc3RlcihJRWxlbWVudFtdIGVsZW1lbnRzKTsKLQkvKiogUmVtb3ZlIGVsZW1lbnQgZnJvbSByZWdpc3RlcmVkIGxpc3QKLQkgKiBAcGFyYW0gZWxlbWVudCBUYXJnZXQgZWxlbWVudAotCSAqLwotCXZvaWQgcmVtb3ZlRnJvbVJlZ2lzdGVyKElFbGVtZW50W10gZWxlbWVudHMpOwotCS8qKiBHZXQgcmVnaXN0ZXJlZCBlbGVtZW50cwotCSAqIEByZXR1cm4gcmVnaXN0ZXJlZCBlbGVtZW50cwotCSAqLwotCUlFbGVtZW50W10gZ2V0UmVnaXN0ZXJlZCgpOwotCS8qKiAKLQkgKiBSZW1vdmUgYWxsIHJlZ2lzdGVyZWQgZWxlbWVudHMKLQkgKi8KLQl2b2lkIHJlbW92ZUFsbFJlZ2lzdGVyZWQoKTsKLQkvKiogR2V0IHRvdGFsIG9mIHJlZ2lzdGVyZWQgZWxlbWVudHMKLQkgKiBAcmV0dXJuIG51bWJlciBvZiByZWdpc3RlcmVkIGVsZW1lbnRzCi0JICovCi0JaW50IHRvdGFsUmVnaXN0ZXJlZCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tb2RlbC9JRWxlbWVudFNldC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9tb2RlbC9JRWxlbWVudFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY1MWEzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvbW9kZWwvSUVsZW1lbnRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRTZXQgZXh0ZW5kcyBJRWxlbWVudCB7Ci0JLyoqCi0JICogUmVtb3ZlcyBFbGVtZW50IGZyb20gdGhpcyBzZXQKLQkgKiBAcGFyYW0gZWxlbWVudCBpZCAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50KFN0cmluZyBpZCk7Ci0JCi0JLyoqCi0JICogQWRkcyBnaXZlbiBlbGVtZW50cyB0byB0aGlzIHNldAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRzKElFbGVtZW50W10gZWxlbWVudHMpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBnaXZlbiBlbGVtZW50cyBmcm9tIHRoaXMgc2V0Ci0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudHMoSUVsZW1lbnRbXSBlbGVtZW50cyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHRoaXMgc2V0Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBJRWxlbWVudFtdIGdldEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXQgaXMgcm9vdCBvciBub3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzZXQgaXMgcm9vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9vdFNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBlbGVtZW50IGJ5IGdpdmVuIGVsZW1lbnQgaWQKLQkgKiBAcGFyYW0gaWQgZWxlbWVudCBpZAotCSAqIEByZXR1cm4gZWxlbWVudCAKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnQgZ2V0RWxlbWVudEJ5SUQoU3RyaW5nIGlkKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGVsZW1lbnQgYnkgZ2l2ZW4gZWxlbWVudCBuYW1lCi0JICogQHBhcmFtIG5hbWUgZWxlbWVudCBuYW1lCi0JICogQHJldHVybiBlbGVtZW50Ci0JICovCi0JcHVibGljIElFbGVtZW50IGdldEVsZW1lbnRCeU5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBlbGVtZW50IGJ5IGdpdmVuIGluZGV4Ci0JICogQHBhcmFtIGluZGV4IAotCSAqIEByZXR1cm4gZWxlbWVudAotCSAqLwotCXB1YmxpYyBJRWxlbWVudCBnZXRFbGVtZW50KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0b3RhbCBlbGVtZW50cyBvZiB0aGlzIHNldAotCSAqIEByZXR1cm4gdG90YWwgZWxlbWVudHMgb2YgdGhpcyBzZXQKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIHNldCBjb250YWlucyBnaXZlbiBlbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSUVsZW1lbnQgZWxlbWVudCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGdpdmVuIGVsZW1lbnQgaWQKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBzZXQgY29udGFpbnMgZ2l2ZW4gZWxlbWVudCBpZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBpZCk7Ci0JCi0JLyoqCi0JICogU3RvcmUgYSBsaXN0IHdoaWNoIHNldCBhbHNvIGNvbnRhaW5zIHRoZSBzYW1lIGVsZW1lbnQgCi0JICogQWRkcyB0byBtYXRjaCBzZXQgb2YgZ2l2ZW4gc2V0IGlkCi0JICogQHBhcmFtIHNldElEIHNldCBpZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1hdGNoU2V0KFN0cmluZyBzZXRJRCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyBtYXRjaCBzZXRzIG9mIGdpdmVuIHNldCBpZAotCSAqIEBwYXJhbSBzZXRJRCBzZXQgaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNYXRjaFNldChTdHJpbmcgc2V0SUQpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBnaXZlbiBzZXQgaWQgY29udGFpbnMgaW4gbWF0Y2ggbGlzdAotCSAqIEBwYXJhbSBzZXRJRAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBzZXQgaWQgY29udGFpbnMgaW4gbWF0Y2ggbGlzdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWF0Y2hTZXQoU3RyaW5nIHNldElEKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1hdGNoIHNldCBpZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWF0Y2ggc2V0IGlkCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE1hdGNoU2V0SURzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBwb3NpdGlvbiBvZiBnaXZlbiBlbGVtZW50IGlkCi0JICogQHBhcmFtIGlkIGVsZW1lbnQgaWQKLQkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIGdpdmVuIGVsZW1lbnQgaWQKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRJbmRleEJ5SUQoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIFJldHVybnMgcG9zaXRpb24gb2YgZ2l2ZW4gZWxlbWVudCBuYW1lCi0JICogQHBhcmFtIG5hbWUgZWxlbWVudCBuYW1lCi0JICogQHJldHVybiBwb3NpdGlvbiBvZiBnaXZlbiBlbGVtZW50IG5hbWUKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRJbmRleEJ5TmFtZShTdHJpbmcgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDIxMjYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2ggZldvcmtiZW5jaDsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBXb3JrYmVuY2gKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gZldvcmtiZW5jaDsKLQl9Ci0JCi0JLyoqIAotCSAqIENyZWF0ZSBncm91cCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG51bUNvbHVtbnMKLQkgKiBAcGFyYW0gbWFrZUJhbGFuY2UKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlR3JvdXBDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gbWFrZUJhbGFuY2UsIFN0cmluZyBsYWJlbFRleHQpIHsKLSAgICAgICAgR3JvdXAgY29tcCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChudW1Db2x1bW5zLCBtYWtlQmFsYW5jZSk7Ci0gICAgICAgIGNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpblRvcCA9IDI7Ci0gICAgICAgIGxheW91dC5tYXJnaW5SaWdodCA9IDI7Ci0gICAgICAgIGxheW91dC5tYXJnaW5Cb3R0b20gPSAyOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVIgOwotICAgICAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0gICAgICAgIGNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGNvbXAuc2V0VGV4dChsYWJlbFRleHQpOwotICAgICAgICBjb21wLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIHJldHVybiBjb21wOwotICAgIH0KLQkKLQkvKiogCi0JICogQ3JlYXRlIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbnVtQ29sdW1ucwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dChudW1Db2x1bW5zLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9CQotCQotCS8qKiAKLQkgKiBDcmVhdGUgY2hlY2sgdHlwZSBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQ2hlY2tCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCBsYWJlbCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCX0KLQkKLQkvKiogCi0JICogQ3JlYXRlIG5vcm1hbCBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgdHlwZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHR5cGUpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqIAotCSAqIENyZWF0ZSBjb21ibyBib3gKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcGFyYW0gc2VsZWN0ZWREYXRhCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZ1tdIGRhdGEsIFN0cmluZyBzZWxlY3RlZERhdGEpIHsKLQkJY3JlYXRlTGFiZWwocGFyZW50LCBsYWJlbCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBTV1QuTEVGVCk7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbWJvLnNldEl0ZW1zKGRhdGEpOwotCQlpbnQgc2VsZWN0ZWRJbmRleCA9IGNvbWJvLmluZGV4T2Yoc2VsZWN0ZWREYXRhKTsKLQkJY29tYm8uc2VsZWN0KChzZWxlY3RlZEluZGV4PDApPzA6c2VsZWN0ZWRJbmRleCk7CQkKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQkvKiogCi0JICogQ3JlYXRlIGxhYmVsCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHdpZHRoSGludAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBzdHlsZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsJCQotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQkKLQkKLQkvKiogCi0JICogQ3JlYXRlIHNwYWNlcgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uU3BhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JCQotCS8qKiAKLQkgKiBHZXQgcGFnZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYWdlW10gZ2V0UGFnZXMoKSB7Ci0JCWZpbmFsIExpc3Q8SVdvcmtiZW5jaFBhZ2U+IHBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV29ya2JlbmNoUGFnZT4oKTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZldvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gZldvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaTx3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlwYWdlcy5hZGQod2luZG93c1tpXS5nZXRBY3RpdmVQYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9ICk7Ci0JCXJldHVybiAoSVdvcmtiZW5jaFBhZ2VbXSlwYWdlcy50b0FycmF5KG5ldyBJV29ya2JlbmNoUGFnZVswXSk7Ci0JfSAgIAotCi0JLyoqIAotCSAqIFN0b3JlIHByZWZlcmVuY2UgdmFsdWVzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3RvcmVWYWx1ZXMoKTsKLQkKLQkvKiogCi0JICogU2V0IHByZWZlcmVuY2UgdmFsdWVzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWVzKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1BUUFByZWZlcmVuY2VzUGFnZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9QVFBQcmVmZXJlbmNlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwNGU0My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1BUUFByZWZlcmVuY2VzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkludGVnZXJGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlVJTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIFBUUFByZWZlcmVuY2VzUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLQlwcm90ZWN0ZWQgVGV4dCBvdXRwdXREaXJUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEludGVnZXJGaWVsZEVkaXRvciBzdG9yZUxpbmVGaWVsZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RElSID0gRU1QVFlfU1RSSU5HOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRPdXRwdXRESVIgPSAiL3RtcCI7Ci0JcHJpdmF0ZSBpbnQgc3RvcmVMaW5lID0gUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZfU1RPUkVfTElORTsKLQotCXB1YmxpYyBQVFBQcmVmZXJlbmNlc1BhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQkvLyBzZXREZXNjcmlwdGlvbihVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIlBUUFByZWZlcmVuY2VzUGFnZS5wcmVmZXJlbmNlc0Rlc2NyaXB0aW9uIikpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gYnJvd3NlQnV0dG9uKQotCQkJCWhhbmRsZU91dHB1dERpcmVjdG9yeUJyb3dzZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQllbHNlCi0JCQkJdXBkYXRlUHJlZmVyZW5jZVBhZ2UoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgewotCQkJdXBkYXRlUHJlZmVyZW5jZVBhZ2UoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKQotCQkJCXVwZGF0ZVByZWZlcmVuY2VQYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgV2lkZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgxLCB0cnVlLCAwLCAwKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDIpKTsKLQkJY3JlYXRlT3V0cHV0Q29udGVudHMoY29tcG9zaXRlKTsKLQkJbG9hZFNhdmVkKCk7Ci0JCWRlZmF1bHRTZXR0aW5nKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQ2hlY2tCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCBsYWJlbCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCB0eXBlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgdHlwZSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dENvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgYUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotCQlhR3JvdXAuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMSwgdHJ1ZSwgMTAsIDEwKSk7Ci0JCWFHcm91cC5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDIpKTsKLQkJYUdyb3VwLnNldFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJQVFBQcmVmZXJlbmNlc1BhZ2UuZ3JvdXBfb3V0cHV0IikpOwotCQlDb21wb3NpdGUgb3V0cHV0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShhR3JvdXAsIFNXVC5OT05FKTsKLQkJb3V0cHV0Q29tcG9zaXRlLnNldExheW91dChjcmVhdGVHcmlkTGF5b3V0KDMsIGZhbHNlLCAwLCAwKSk7Ci0JCW91dHB1dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDUpKTsKLQkJbmV3IExhYmVsKG91dHB1dENvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJQVFBQcmVmZXJlbmNlc1BhZ2Uub3V0cHV0X3RleHQiKSk7Ci0JCW91dHB1dERpclRleHQgPSBuZXcgVGV4dChvdXRwdXRDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJb3V0cHV0RGlyVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJb3V0cHV0RGlyVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlUHVzaEJ1dHRvbihvdXRwdXRDb21wb3NpdGUsIFVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiUFRQUHJlZmVyZW5jZXNQYWdlLmJyb3dzZUJ1dHRvbiIpLCBudWxsKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJQ29tcG9zaXRlIGxpbmVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGFHcm91cCwgU1dULk5PTkUpOwotCQlsaW5lQ29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJbGluZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDUpKTsKLQkJc3RvcmVMaW5lRmllbGQgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKFByZWZlcmVuY2VDb25zdGFudHMuU1RPUkVfTElORSwgVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJQVFBQcmVmZXJlbmNlc1BhZ2Uuc3RvcmVfbGluZV90ZXh0IiksIGxpbmVDb21wb3NpdGUpOwotCQlzdG9yZUxpbmVGaWVsZC5zZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJc3RvcmVMaW5lRmllbGQuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZGVmYXVsdFNldHRpbmcoKSB7Ci0JCW91dHB1dERpclRleHQuc2V0VGV4dChvdXRwdXRESVIpOwotCQlzdG9yZUxpbmVGaWVsZC5zZXRTdHJpbmdWYWx1ZShTdHJpbmcudmFsdWVPZihzdG9yZUxpbmUpKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGxvYWRTYXZlZCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBSRUZTOiIpOwotCQkvLyBTdHJpbmdbXSBmb28gPSBwcmVmZXJlbmNlcy5kZWZhdWx0UHJvcGVydHlOYW1lcygpOwotCQkvLyBmb3IoaW50IGk9MDsgaTxmb28ubGVuZ3RoOyBpKyspIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJERUZBVUxUWyIraSsiXSA9ICIrZm9vW2ldKTsKLQkJLy8gfQotCQkvLyBmb28gPSBwcmVmZXJlbmNlcy5wcm9wZXJ0eU5hbWVzKCk7Ci0JCS8vIGZvcihpbnQgaT0wOyBpPGZvby5sZW5ndGg7IGkrKykgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vbi1kZWZhdWx0IHByb3BbIitpKyJdID0gIitmb29baV0pOwotCQkvLyB9Ci0JCW91dHB1dERJUiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLk9VVFBVVF9ESVIpOwotCQlpZiAob3V0cHV0RElSLmVxdWFscygiIikpCi0JCQlvdXRwdXRESVIgPSBkZWZhdWx0T3V0cHV0RElSOwotCQlpZiAob3V0cHV0RElSICE9IG51bGwpCi0JCQlvdXRwdXREaXJUZXh0LnNldFRleHQob3V0cHV0RElSKTsKLQkJc3RvcmVMaW5lID0gcHJlZmVyZW5jZXMuZ2V0SW50KFByZWZlcmVuY2VDb25zdGFudHMuU1RPUkVfTElORSk7Ci0JCXN0b3JlTGluZUZpZWxkLnNldFN0cmluZ1ZhbHVlKFN0cmluZy52YWx1ZU9mKHN0b3JlTGluZSkpOwotCX0KLQkvKiBkbyBzdHVmZiBvbiBpbml0KCkgb2YgcHJlZmVyZW5jZXMsIGlmIGFueXRoaW5nICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkge30KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZGVmYXVsdFNldHRpbmcoKTsKLQkJdXBkYXRlQXBwbHlCdXR0b24oKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHN0b3JlKCkgewotCQlvdXRwdXRESVIgPSBvdXRwdXREaXJUZXh0LmdldFRleHQoKTsKLQkJc3RvcmVMaW5lID0gc3RvcmVMaW5lRmllbGQuZ2V0SW50VmFsdWUoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZSgpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuT1VUUFVUX0RJUiwgb3V0cHV0RElSKTsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5TVE9SRV9MSU5FLCBzdG9yZUxpbmUpOwotCQlQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLyoKLQkJICogSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCk7IAotCQkgKiBpZiAobWFuYWdlci5pc1BhcmFsbGVsUGVyc3BlY3RpdmVPcGVuKCkgJiYgKGxhc3RNU0Nob2ljZUlEICE9IE1TQ2hvaWNlSUQgfHwgbGFzdENTQ2hvaWNlSUQgIT0gQ1NDaG9pY2VJRCkpIHsKLQkJICogbWFuYWdlci5yZWZyZXNoUnVudGltZVN5c3RlbXMoQ1NDaG9pY2VJRCwgTVNDaG9pY2VJRCk7IH0KLQkJICovCi0JCUZpbGUgb3V0cHV0RGlyUGF0aCA9IG5ldyBGaWxlKG91dHB1dERJUik7Ci0JCWlmICghb3V0cHV0RGlyUGF0aC5leGlzdHMoKSkKLQkJCW91dHB1dERpclBhdGgubWtkaXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dERpcmVjdG9yeUJyb3dzZUJ1dHRvblNlbGVjdGVkKCkgewotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJQVFBQcmVmZXJlbmNlc1BhZ2UuU2VsZWN0X091dHB1dF9EaXJlY3RvcnkiKSk7Ci0JCVN0cmluZyBjdXJyZWN0RGlyUGF0aCA9IGdldEZpZWxkQ29udGVudChvdXRwdXREaXJUZXh0LmdldFRleHQoKSk7Ci0JCWlmIChjdXJyZWN0RGlyUGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShjdXJyZWN0RGlyUGF0aCk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChjdXJyZWN0RGlyUGF0aCk7Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyUGF0aCA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpclBhdGggIT0gbnVsbCkKLQkJCW91dHB1dERpclRleHQuc2V0VGV4dChzZWxlY3RlZERpclBhdGgpOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkT3V0cHV0U2V0dGluZygpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRGaWVsZENvbnRlbnQob3V0cHV0RGlyVGV4dC5nZXRUZXh0KCkpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJQVFBQcmVmZXJlbmNlc1BhZ2UuSW5jb3JyZWN0X091dHB1dF9kaXJlY3RvcnkiKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRmlsZSBwYXRoID0gbmV3IEZpbGUobmFtZSk7Ci0JCWlmICghcGF0aC5leGlzdHMoKSkgewotCQkJRmlsZSBwYXJlbnQgPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCAhcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiUFRQUHJlZmVyZW5jZXNQYWdlLkluY29ycmVjdF9PdXRwdXRfZGlyZWN0b3J5IikpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFzdG9yZUxpbmVGaWVsZC5pc1ZhbGlkKCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShzdG9yZUxpbmVGaWVsZC5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCWlmICghaXNWYWxpZE91dHB1dFNldHRpbmcoKSkKLQkJCXJldHVybjsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRDb250ZW50KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHRleHQuZXF1YWxzKEVNUFRZX1NUUklORykpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCXByb3RlY3RlZCBHcmlkTGF5b3V0IGNyZWF0ZUdyaWRMYXlvdXQoaW50IGNvbHVtbnMsIGJvb2xlYW4gaXNFcXVhbCwgaW50IG1oLCBpbnQgbXcpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gY29sdW1uczsKLQkJZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBpc0VxdWFsOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG1oOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gbXc7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQlwcm90ZWN0ZWQgR3JpZERhdGEgc3BhbkdyaWREYXRhKGludCBzdHlsZSwgaW50IHNwYWNlKSB7Ci0JCUdyaWREYXRhIGdkID0gbnVsbDsKLQkJaWYgKHN0eWxlID09IC0xKQotCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZWxzZQotCQkJZ2QgPSBuZXcgR3JpZERhdGEoc3R5bGUpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYWNlOwotCQlyZXR1cm4gZ2Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDRkMDYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JUFRQVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1gsIElQVFBVSUNvbnN0YW50cy5ERUZBVUxUX1ZJRVdfSUNPTl9TUEFDSU5HX1gpOwotCQlzdG9yZS5zZXREZWZhdWx0KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fU1BBQ0lOR19ZLCBJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fU1BBQ0lOR19ZKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJUFRQVUlDb25zdGFudHMuVklFV19JQ09OX1dJRFRILCBJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fV0lEVEgpOwotCQlzdG9yZS5zZXREZWZhdWx0KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fSEVJR0hULCBJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fSEVJR0hUKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX1NIT1dBTExUSU1FLCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfVE9PTFRJUF9USU1FT1VULCBJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX1RPT0xUSVApOwotCQlzdG9yZS5zZXREZWZhdWx0KElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfSVNXUkFQLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VNZXNzYWdlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmEyYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZU1lc3NhZ2VzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JLyoqIEdldCBTdHJpbmcgdGV4dAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2YzYyMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAjIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAjIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAjIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAjIAotICMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAjIAotICMgTEEtQ0MgMDQtMTE1Ci0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSAjIEBhdXRob3IgQ2xlbWVudAotICMKLSAjIwotCi1STVByZWZlcmVuY2VzUGFnZS5kZXNjPUdlbmVyYWwgc2V0dGluZ3MgZm9yIHJlc291cmNlIG1hbmFnZXJzCi1STVByZWZlcmVuY2VzUGFnZS5sYWJlbD1EZWZhdWx0IHJlbW90ZSBzZXJ2aWNlcyBwcm92aWRlcjoKLQotVmlld2VyUHJlZmVyZW5jZVBhZ2UuZGVzYz1QVFAgVmlld2VyIFNldHRpbmdzCi1WaWV3ZXJQcmVmZXJlbmNlc1BhZ2UuaWNvbk5hbWU9SWNvbnMKLVZpZXdlclByZWZlcmVuY2VzUGFnZS5pY29uX3NwYWNpbmdfeD1TcGFjaW5nIHg6Ci1WaWV3ZXJQcmVmZXJlbmNlc1BhZ2UuaWNvbl9zcGFjaW5nX3k9U3BhY2luZyB5OgotVmlld2VyUHJlZmVyZW5jZXNQYWdlLmljb25fd2lkdGg9U3BhY2luZyB3aWR0aDoKLVZpZXdlclByZWZlcmVuY2VzUGFnZS5pY29uX2hlaWdodD1TcGFjaW5nIGhlaWdodDoKLVZpZXdlclByZWZlcmVuY2VzUGFnZS50b29sdGlwTmFtZT1Ub29sdGlwCi1WaWV3ZXJQcmVmZXJlbmNlc1BhZ2UudG9vbHRpcF90aW1lb3V0PVRpbWVvdXQgKG1zKToKLVZpZXdlclByZWZlcmVuY2VzUGFnZS50b29sdGlwX2lzd3JhcD1XcmFwIHRleHQKLVZpZXdlclByZWZlcmVuY2VzUGFnZS50b29sdGlwX3Nob3dBbGxUaW1lPVNob3cgYWxsIHRoZSB0aW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9STVByZWZlcmVuY2VzUGFnZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9STVByZWZlcmVuY2VzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTI1MThkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvcHJlZmVyZW5jZXMvUk1QcmVmZXJlbmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJNUHJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIENvbWJvIHJlbW90ZVNlcnZpY2VzQ29tYm87Ci0JCQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXB1YmxpYyBSTVByZWZlcmVuY2VzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFBUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldERlc2NyaXB0aW9uKFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlJNUHJlZmVyZW5jZXNQYWdlLmRlc2MiKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7IAotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzZXRWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlcygpIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2Ujc3RvcmVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNpc1ZhbGlkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1ZpZXdlclByZWZlcmVuY2VzUGFnZS5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS9wcmVmZXJlbmNlcy9WaWV3ZXJQcmVmZXJlbmNlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliYWZhYi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ByZWZlcmVuY2VzL1ZpZXdlclByZWZlcmVuY2VzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3ZXJQcmVmZXJlbmNlc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIFZpZXdJbnRGaWVsZEVkaXRvciB0b29sVGlwRmllbGQgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHRvb2x0aXBJc1dyYXBCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHRvb2x0aXBTaG93QWxsVGltZUJ1dHRvbiA9IG51bGw7Ci0JCi0JLyoqIElubmVyIGNsYXNzIFZpZXdJbnRGaWVsZEVkaXRvcgotCSAqCXVzZWQgZm9yIHZhbGlkYXRpb24gb2YgdGV4dCBmaWVsZAotCSAqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBWaWV3SW50RmllbGRFZGl0b3IgewotCQlwcml2YXRlIGludCB0ZXh0TGltaXQgPSA1OwotCQlwcml2YXRlIFN0cmluZyBsYWJlbFRleHQgPSBudWxsOwotCQlwcml2YXRlIGludCBtaW4gPSAwOwotCQlwcml2YXRlIGludCBtYXggPSAxMDsKLQkJcHJpdmF0ZSBUZXh0IHRleHRGaWVsZCA9IG51bGw7CQkKLQkJcHJpdmF0ZSBTdHJpbmcgbXNnID0gIiI7Ci0JCQotCQkvKiogQ29uc3RydWN0b3IKLQkJICogQHBhcmFtIGxhYmVsVGV4dAotCQkgKiBAcGFyYW0gbWluCi0JCSAqIEBwYXJhbSBtYXgKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJVmlld0ludEZpZWxkRWRpdG9yKFN0cmluZyBsYWJlbFRleHQsIGludCBtaW4sIGludCBtYXgsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRoaXMubGFiZWxUZXh0ID0gbGFiZWxUZXh0OwotCQkJdGhpcy5taW4gPSBtaW47Ci0JCQl0aGlzLm1heCA9IG1heDsKLQkJCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJfQotCQkKLQkJLyoqIENyZWF0ZSBjb250cm9sCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJZG9GaWxsSW50b0dyaWQocGFyZW50KTsKLQkJfQotCQkKLQkJLyoqIENyZWF0ZSB0ZXh0IGZpZWxkIGludG8gZ2l2ZW4gY29tcG9zaXRlCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRvRmlsbEludG9HcmlkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKS5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0gICAgICAgICAgICAKLQkJCXRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICAgICAgdGV4dEZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgICAgICB0ZXh0RmllbGQuc2V0VGV4dExpbWl0KHRleHRMaW1pdCk7Ci0gICAgICAgICAgICB0ZXh0RmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIAl0ZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAJCQlWaWV3ZXJQcmVmZXJlbmNlc1BhZ2UudGhpcy5pc1ZhbGlkKCk7Ci0gICAgICAgIAkJfQkgICAgICAgIAkJCi0gICAgICAgIAl9KTsKLQkJCQotCQkJbmV3IExhYmVsKHBhcmVudCwgU1dULlJJR0hUKS5zZXRUZXh0KCIoIiArIG1pbiArICItIiArIG1heCArICIpIik7Ci0JCX0KLQkJCi0JCS8qKiBTZXQgdGV4dCBmaWVsZCBlbmFibGVkCi0JCSAqIEBwYXJhbSBpc0VuYWJsZQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlKSB7Ci0JCQlpZiAodGV4dEZpZWxkICE9IG51bGwpIHsKLQkJCQl0ZXh0RmllbGQuc2V0RW5hYmxlZChpc0VuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JICAgIC8qKiBTZXQgdmFsdWUgaW50byB0ZXh0IGZpZWxkCi0JICAgICAqIEBwYXJhbSB2YWx1ZQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JICAgICAgICBpZiAodGV4dEZpZWxkICE9IG51bGwpIHsKLQkgICAgICAgIAl0ZXh0RmllbGQuc2V0VGV4dChTdHJpbmcudmFsdWVPZih2YWx1ZSkpOwotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICAvKiogR2V0IHZhbHVlIGZyb20gdGV4dCBmaWVsZAotCSAgICAgKiBAcmV0dXJuCi0JICAgICAqLwotCSAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCSAgICAJdHJ5IHsKLQkgICAgCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLQkgICAgCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JICAgIAkJcmV0dXJuIDA7Ci0JICAgIAl9Ci0JICAgIH0KLQkgICAgCi0JICAgIC8qKiBTZXQgZXJyb3IgbWVzc2FnZSAKLQkgICAgICogQHBhcmFtIG1zZwotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkgICAgCXRoaXMubXNnID0gbXNnOwotCSAgICB9Ci0JICAgIAotCSAgICAvKiogR2V0IGVycm9yIG1lc3NhZ2UKLQkgICAgICogQHJldHVybgotCSAgICAgKi8KLQkgICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JICAgIAlyZXR1cm4gbXNnOwotCSAgICB9Ci0JICAgIAotCSAgICAvKiogSXMgdGV4dCBmaWVsZCB2YWxpZAotCSAgICAgKiBAcmV0dXJuCi0JICAgICAqLwotCSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCSAgICAJc2V0RXJyb3JNZXNzYWdlKCIiKTsKLQkgICAgCXRyeSB7Ci0JICAgIAkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludCh0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLQkgICAgCQlpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHsKLQkgICAgCQkJc2V0RXJyb3JNZXNzYWdlKCJWYWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAoIiArIG1pbiArICItIiArIG1heCArICIpIik7Ci0JICAgIAkJCXJldHVybiBmYWxzZTsKLQkgICAgCQl9Ci0JICAgIAl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCSAgICAJCXNldEVycm9yTWVzc2FnZSgiVmFsdWUgbXVzdCBiZSBpbnRlZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCSAgICAJCXJldHVybiBmYWxzZTsKLQkgICAgCX0KLQkgICAgCXJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotCQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXB1YmxpYyBWaWV3ZXJQcmVmZXJlbmNlc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXREZXNjcmlwdGlvbihQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJWaWV3ZXJQcmVmZXJlbmNlUGFnZS5kZXNjIikpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJUERlYnVnSGVscENvbnRleHRJZHMuUF9ERUJVR19QUkVGRVJFTkNFX1BBR0UpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNyZWF0ZVNwYWNlcihjb21wb3NpdGUsIDEpOwotCQljcmVhdGVWaWV3U2V0dGluZ1ByZWZlcmVuY2VzKGNvbXBvc2l0ZSk7Ci0JCXNldFZhbHVlcygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKiogQ3JlYXRlIHRvb2x0aXAgZ3JvdXAgY29tcG9zaXRlCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRvb2x0aXBHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBncm91cCA9IGNyZWF0ZUdyb3VwQ29tcG9zaXRlKHBhcmVudCwgMSwgZmFsc2UsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlZpZXdlclByZWZlcmVuY2VzUGFnZS50b29sdGlwTmFtZSIpKTsKLQkJQ29tcG9zaXRlIGNvbXBUb29sdGlwID0gY3JlYXRlQ29tcG9zaXRlKGdyb3VwLCAxKTsKLQotCQl0b29sdGlwU2hvd0FsbFRpbWVCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihjb21wVG9vbHRpcCwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiVmlld2VyUHJlZmVyZW5jZXNQYWdlLnRvb2x0aXBfc2hvd0FsbFRpbWUiKSk7Ci0JCXRvb2x0aXBTaG93QWxsVGltZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b29sVGlwRmllbGQuc2V0RW5hYmxlZCghdG9vbHRpcFNob3dBbGxUaW1lQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAodG9vbHRpcFNob3dBbGxUaW1lQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJCQl0b29sVGlwRmllbGQuc2V0VmFsdWUoKGludClnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0TG9uZyhJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX1RJTUVPVVQpKTsKLQkJCX0KLQkJfSk7Ci0JCXRvb2xUaXBGaWVsZCA9IG5ldyBWaWV3SW50RmllbGRFZGl0b3IoUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiVmlld2VyUHJlZmVyZW5jZXNQYWdlLnRvb2x0aXBfdGltZW91dCIpLCAxMDAwLCAxMDAwMCwgY3JlYXRlQ29tcG9zaXRlKGNvbXBUb29sdGlwLCAzKSk7Ci0JCXRvb2x0aXBJc1dyYXBCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihjb21wVG9vbHRpcCwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiVmlld2VyUHJlZmVyZW5jZXNQYWdlLnRvb2x0aXBfaXN3cmFwIikpOwotCX0KLQkKLQkvKiogQ3JlYXRlIGljb24gZ3JvdXAgY29tcG9zaXRlCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUljb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8qCi0JCUNvbXBvc2l0ZSBncm91cCA9IGNyZWF0ZUdyb3VwQ29tcG9zaXRlKHBhcmVudCwgMSwgZmFsc2UsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlZpZXdlclByZWZlcmVuY2VzUGFnZS5pY29uTmFtZSIpKTsKLQkJQ29tcG9zaXRlIGNvbXBJY29uID0gY3JlYXRlQ29tcG9zaXRlKGdyb3VwLCAzKTsKLQotCQlpY29uU3BhY2luZ1hGaWVsZCA9IG5ldyBWaWV3SW50RmllbGRFZGl0b3IoUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiVmlld2VyUHJlZmVyZW5jZXNQYWdlLmljb25fc3BhY2luZ194IiksIDEsIDEwLCBjb21wSWNvbik7Ci0JCWljb25TcGFjaW5nWUZpZWxkID0gbmV3IFZpZXdJbnRGaWVsZEVkaXRvcihQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJWaWV3ZXJQcmVmZXJlbmNlc1BhZ2UuaWNvbl9zcGFjaW5nX3kiKSwgMSwgMTAsIGNvbXBJY29uKTsKLQotCQlpY29uV2lkdGhGaWVsZCA9IG5ldyBWaWV3SW50RmllbGRFZGl0b3IoUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiVmlld2VyUHJlZmVyZW5jZXNQYWdlLmljb25fd2lkdGgiKSwgMTIsIDEwMCwgY29tcEljb24pOwotCQlpY29uSGVpZ2h0RmllbGQgPSBuZXcgVmlld0ludEZpZWxkRWRpdG9yKFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlZpZXdlclByZWZlcmVuY2VzUGFnZS5pY29uX2hlaWdodCIpLCAxMiwgMTAwLCBjb21wSWNvbik7Ci0JCSovCQkKLQl9Ci0JCi0JLyoqIENyZWF0ZSB2aWV3IHNldHRpbmcgcHJlZmVyZW5jZXMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmlld1NldHRpbmdQcmVmZXJlbmNlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vY3JlYXRlSWNvbkdyb3VwKHBhcmVudCk7Ci0JCWNyZWF0ZVRvb2x0aXBHcm91cChwYXJlbnQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeyAKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvKgotCQlpY29uU3BhY2luZ1hGaWVsZC5zZXRWYWx1ZShzdG9yZS5nZXREZWZhdWx0SW50KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fU1BBQ0lOR19YKSk7Ci0JCWljb25TcGFjaW5nWUZpZWxkLnNldFZhbHVlKHN0b3JlLmdldERlZmF1bHRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1kpKTsKLQkJaWNvbldpZHRoRmllbGQuc2V0VmFsdWUoc3RvcmUuZ2V0RGVmYXVsdEludChJUFRQVUlDb25zdGFudHMuVklFV19JQ09OX1dJRFRIKSk7Ci0JCWljb25IZWlnaHRGaWVsZC5zZXRWYWx1ZShzdG9yZS5nZXREZWZhdWx0SW50KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fSEVJR0hUKSk7Ci0JCSovCi0JCXRvb2xUaXBGaWVsZC5zZXRWYWx1ZSgoaW50KXN0b3JlLmdldERlZmF1bHRMb25nKElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfVElNRU9VVCkpOwotCQl0b29sdGlwSXNXcmFwQnV0dG9uLnNldFNlbGVjdGlvbihzdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX0lTV1JBUCkpOwotCQl0b29sdGlwU2hvd0FsbFRpbWVCdXR0b24uc2V0U2VsZWN0aW9uKHN0b3JlLmdldERlZmF1bHRCb29sZWFuKElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfU0hPV0FMTFRJTUUpKTsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzZXRWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvKgotCQlpY29uU3BhY2luZ1hGaWVsZC5zZXRWYWx1ZShzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1gpKTsKLQkJaWNvblNwYWNpbmdZRmllbGQuc2V0VmFsdWUoc3RvcmUuZ2V0SW50KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fU1BBQ0lOR19ZKSk7Ci0JCWljb25XaWR0aEZpZWxkLnNldFZhbHVlKHN0b3JlLmdldEludChJUFRQVUlDb25zdGFudHMuVklFV19JQ09OX1dJRFRIKSk7Ci0JCWljb25IZWlnaHRGaWVsZC5zZXRWYWx1ZShzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9IRUlHSFQpKTsKLQkJKi8KLQkJdG9vbFRpcEZpZWxkLnNldFZhbHVlKChpbnQpc3RvcmUuZ2V0TG9uZyhJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX1RJTUVPVVQpKTsKLQkJdG9vbHRpcElzV3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX0lTV1JBUCkpOwotCQl0b29sdGlwU2hvd0FsbFRpbWVCdXR0b24uc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oSVBUUFVJQ29uc3RhbnRzLlZJRVdfVE9PTFRJUF9TSE9XQUxMVElNRSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJLyoKLQkJc3RvcmUuc2V0VmFsdWUoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1gsIGljb25TcGFjaW5nWEZpZWxkLmdldFZhbHVlKCkpOwotCQlzdG9yZS5zZXRWYWx1ZShJUFRQVUlDb25zdGFudHMuVklFV19JQ09OX1NQQUNJTkdfWSwgaWNvblNwYWNpbmdZRmllbGQuZ2V0VmFsdWUoKSk7Ci0JCXN0b3JlLnNldFZhbHVlKElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fV0lEVEgsIGljb25XaWR0aEZpZWxkLmdldFZhbHVlKCkpOwotCQlzdG9yZS5zZXRWYWx1ZShJUFRQVUlDb25zdGFudHMuVklFV19JQ09OX0hFSUdIVCwgaWNvbkhlaWdodEZpZWxkLmdldFZhbHVlKCkpOwotCQkqLwotCQlzdG9yZS5zZXRWYWx1ZShJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX1RJTUVPVVQsIChsb25nKXRvb2xUaXBGaWVsZC5nZXRWYWx1ZSgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoSVBUUFVJQ29uc3RhbnRzLlZJRVdfVE9PTFRJUF9JU1dSQVAsIHRvb2x0aXBJc1dyYXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlzdG9yZS5zZXRWYWx1ZShJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX1NIT1dBTExUSU1FLCB0b29sdGlwU2hvd0FsbFRpbWVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNpc1ZhbGlkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCS8qCi0JCWlmICghaWNvblNwYWNpbmdYRmllbGQuaXNWYWxpZCgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoaWNvblNwYWNpbmdYRmllbGQuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaWNvblNwYWNpbmdZRmllbGQuaXNWYWxpZCgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoaWNvblNwYWNpbmdZRmllbGQuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaWNvbldpZHRoRmllbGQuaXNWYWxpZCgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoaWNvbldpZHRoRmllbGQuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaWNvbkhlaWdodEZpZWxkLmlzVmFsaWQoKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKGljb25IZWlnaHRGaWVsZC5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJKi8KLQkJaWYgKCF0b29sVGlwRmllbGQuaXNWYWxpZCgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UodG9vbFRpcEZpZWxkLmdldEVycm9yTWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS91dGlscy9EZWJ1Z1V0aWwuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdXRpbHMvRGVidWdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Mzg2MWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS91dGlscy9EZWJ1Z1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGVidWdVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CU19WSUVXX1RSQUNJTkdfT1BUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC51aS92aWV3cy9qb2JzL3RyYWNpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUNISU5FU19WSUVXX1RSQUNJTkdfT1BUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC51aS92aWV3cy9tYWNoaW5lcy90cmFjaW5nIjsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBKT0JTX1ZJRVdfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBNQUNISU5FU19WSUVXX1RSQUNJTkcgPSBmYWxzZTsgCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlUGx1Z2luRGVidWdPcHRpb25zKCkgewotCQlpZiAoUFRQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCVN0cmluZyBvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKT0JTX1ZJRVdfVFJBQ0lOR19PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJSk9CU19WSUVXX1RSQUNJTkcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oTUFDSElORVNfVklFV19UUkFDSU5HX09QVElPTik7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlNQUNISU5FU19WSUVXX1RSQUNJTkcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0Fic3RyYWN0UGFyYWxsZWxFbGVtZW50Vmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyN2Q5Yy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0Fic3RyYWN0UGFyYWxsZWxFbGVtZW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLQotLyoqCi0gKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgZXh0ZW5kcyBBYnN0cmFjdFBhcmFsbGVsVmlldyBpbXBsZW1lbnRzIElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIsCi0JCUlUb29sVGlwUHJvdmlkZXIsIElJbWFnZVByb3ZpZGVyLCBJQ29udGVudFByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgREVGQVVMVF9USVRMRSA9ICJQYXJhbGxlbCI7Ci0JcHJvdGVjdGVkIElNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotCS8vIFNldAotCXByb3RlY3RlZCBJRWxlbWVudFNldCBjdXJfZWxlbWVudF9zZXQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgY3VyX3NldF9zaXplID0gMDsKLQlwcm90ZWN0ZWQgRWxlbWVudEljb25DYW52YXMgY2FudmFzID0gbnVsbDsKLQkvLyB0aXRsZQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRU1QVFlfVElUTEUgPSAiICI7Ci0JcHJvdGVjdGVkIENvbG9yIHJlZ2lzdGVyQ29sb3IgPSBudWxsOwotCQotCXByb3RlY3RlZCBJY29uUmVmcmVzaFdvcmtiZW5jaEpvYiBpY29ucmVGcmVzaEpvYiA9IG5ldyBJY29uUmVmcmVzaFdvcmtiZW5jaEpvYigpOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCi0JLyoqCi0JICogdXBkYXRlIHByZWZlcmVuY2Ugc2V0dGluZyAKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmluYWwgU3RyaW5nIHByZWZlcmVuY2VUeXBlID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCWZpbmFsIE9iamVjdCB2YWx1ZSA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXNob3dXaGlsZShuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWlmIChwcmVmZXJlbmNlVHlwZS5zdGFydHNXaXRoKCJpY29uIikpIHsKLQkJCQkJCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFBUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJCQkJY2FudmFzLnNldEljb25TcGFjZShzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1gpLCBzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1kpKTsKLQkJCQkJCQkJY2FudmFzLnNldEljb25TaXplKHN0b3JlLmdldEludChJUFRQVUlDb25zdGFudHMuVklFV19JQ09OX1dJRFRIKSwgc3RvcmUuZ2V0SW50KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fSEVJR0hUKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHByZWZlcmVuY2VUeXBlLmVxdWFscyhJUFRQVUlDb25zdGFudHMuVklFV19UT09MVElQX1NIT1dBTExUSU1FKSkgewotCQkJCQkJCQljYW52YXMuc2hvd1Rvb2x0aXBBbGx0aGV0aW1lKG5ldyBCb29sZWFuKChTdHJpbmcpdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAocHJlZmVyZW5jZVR5cGUuZXF1YWxzKElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfVElNRU9VVCkpIHsKLQkJCQkJCQkJY2FudmFzLnNldFRvb2x0aXBUaW1lb3V0KG5ldyBMb25nKChTdHJpbmcpdmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAocHJlZmVyZW5jZVR5cGUuZXF1YWxzKElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfSVNXUkFQKSkgewotCQkJCQkJCQljYW52YXMuc2V0VG9vbHRpcFdyYXAobmV3IEJvb2xlYW4oKFN0cmluZyl2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJCX0KLQkJCQkJCQljYW52YXMucmVzZXRDYW52YXMoKTsKLQkJCQkJCX0KLQkJCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcoSU1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJlZ2lzdGVyUGFydExpc3RlbmVyKCk7Ci0JCVBUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCWNyZWF0ZVZpZXcocGFyZW50KTsKLQkJc2V0Q29udGVudERlc2NyaXB0aW9uKEVNUFRZX1RJVExFKTsKLQkJcmVnaXN0ZXJDb2xvciA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JPUkRFUik7Ci0JfQotCS8qKiBTZXQgdGhlIGNvbG9yIG9mIHJlZ2lzdGVyZWQgZWxlbWVudAotCSAqIEBwYXJhbSBjb2xvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJdGhpcy5yZWdpc3RlckNvbG9yID0gY29sb3I7Ci0JfQotCS8qKiBDcmVhdGUgRWxlbWVudCBWaWV3Ci0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVFbGVtZW50VmlldyhwYXJlbnQpOwotCX0KLQkvKiogR2V0IElNYW5hZ2VyCi0JICogQHJldHVybiBJTWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTWFuYWdlciBnZXRVSU1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQlwdWJsaWMgSUVsZW1lbnRIYW5kbGVyIGdldEVsZW1lbnRIYW5kbGVyKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbWFuYWdlci5nZXRFbGVtZW50SGFuZGxlcihpZCk7Ci0JfQotCS8qKiBHZXQgY3VycmVudCBlbGVtZW50IGhhbmRsZXIKLQkgKiBAcmV0dXJuIElFbGVtZW50SGFuZGxlcgotCSAqLwotCXB1YmxpYyBJRWxlbWVudEhhbmRsZXIgZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudEhhbmRsZXIoZ2V0Q3VycmVudElEKCkpOwotCX0KLQkvKiogQ2hhbmdlIHZpZXcgdGl0bGUKLQkgKiBAcGFyYW0gdGl0bGUgdGl0bGUKLQkgKiBAcGFyYW0gc2V0TmFtZSBzZXQgbmFtZQotCSAqIEBwYXJhbSBzaXplIGVsZW1lbnQgc2l6ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoYW5nZVRpdGxlKFN0cmluZyB0aXRsZSwgU3RyaW5nIHNldE5hbWUsIGludCBzaXplKSB7Ci0JCWNoYW5nZVRpdGxlKCIgIiArIHRpdGxlICsgIiAtICIgKyBzZXROYW1lICsgIiBbIiArIHNpemUgKyAiXSIpOwotCX0KLQkvKiogQ2hhbmdlIHZpZXcgdGl0bGUKLQkgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIG9mIHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hhbmdlVGl0bGUoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzZXRDb250ZW50RGVzY3JpcHRpb24obWVzc2FnZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKiogQ3JlYXRlIGVsZW1lbnQgdmlkZXcKLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlRWxlbWVudFZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0QmFja2dyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWNhbnZhcyA9IG5ldyBFbGVtZW50SWNvbkNhbnZhcyh0aGlzLCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2FudmFzLnNldENvbnRlbnRQcm92aWRlcih0aGlzKTsKLQkJY2FudmFzLnNldEltYWdlUHJvdmlkZXIodGhpcyk7Ci0JCWNhbnZhcy5zZXRUb29sVGlwUHJvdmlkZXIodGhpcyk7Ci0JCWNhbnZhcy5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJY2FudmFzLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJLy9nZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoY2FudmFzKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2FudmFzLnJlbW92ZUFjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQljYW52YXMucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljYW52YXMuZGlzcG9zZSgpOwotCQlQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQlkZXJlZ2lzdGVyUGFydExpc3RlbmVyKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljYW52YXMuc2V0Rm9jdXMoKTsKLQl9Ci0JLyoqIEdldCBjdXJyZW50IHNldCBJRAotCSAqIEByZXR1cm4gY3VycmVudCBzZXQgSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRTZXRJRCgpIHsKLQkJcmV0dXJuIG1hbmFnZXIuZ2V0Q3VycmVudFNldElkKCk7Ci0JfQotCS8qKiBGaXJlIHNldCBjaGFuZ2UgZXZlbnQKLQkgKiBAcGFyYW0gY3VyX3NldCBjdXJyZW50IHNldCAKLQkgKiBAcGFyYW0gcHJlX3NldCBwcmV2aW91cyBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU2V0Q2hhbmdlRXZlbnQoSUVsZW1lbnRTZXQgY3VyX3NldCwgSUVsZW1lbnRTZXQgcHJlX3NldCkgewotCQltYW5hZ2VyLmZpcmVTZXRFdmVudChJTWFuYWdlci5DSEFOR0VfU0VUX1RZUEUsIG51bGwsIGN1cl9zZXQsIHByZV9zZXQpOwotCX0KLQkvKiogU2VsZWN0IHNldAotCSAqIEBwYXJhbSBzZXQgVGFyZ2V0IHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdFNldChJRWxlbWVudFNldCBzZXQpIHsKLQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdXJfc2V0X3NpemUgPSAwOwotCQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQkJY3VyX3NldF9zaXplID0gc2V0LnNpemUoKTsKLQkJCQltYW5hZ2VyLnNldEN1cnJlbnRTZXRJZChzZXQuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQljYW52YXMuc2V0RWxlbWVudFNldChzZXQpOwotCQkJLy8gc2VuZCBldmVudCBpZiBjdXJyZW50IHZpZXdlciBpcyB2aXNpYmxlCi0JCQlpZiAoaXNWaXNpYmxlKCkpCi0JCQkJZmlyZVNldENoYW5nZUV2ZW50KHNldCwgY3VyX2VsZW1lbnRfc2V0KTsKLQkJCWN1cl9lbGVtZW50X3NldCA9IHNldDsKLQkJfQotCQkvL3VwZGF0ZUFjdGlvbigpOwotCX0KLQkvKiogR2V0IGN1cnJlbnQgc2V0Ci0JICogQHJldHVybiBjdXJyZW50IHNldAotCSAqLwotCXB1YmxpYyBJRWxlbWVudFNldCBnZXRDdXJyZW50U2V0KCkgewotCQlyZXR1cm4gY3VyX2VsZW1lbnRfc2V0OwotCX0KLQlwdWJsaWMgdm9pZCBidWlsZCgpIHsKLQkJaW5pdGlhbFZpZXcoKTsKLQl9Ci0JLyoqCi0JICogUmVmcmVzaCB2aWV3Ci0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIGFsbCwgYm9vbGVhbiBmb3JjZSkgewotCQlpZiAoaXNWaXNpYmxlKCkpCi0JCQlpY29ucmVGcmVzaEpvYi5zY2hlZHVsZShhbGwsIGZvcmNlKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIGFsbCkgewotCQlyZWZyZXNoKGFsbCwgZmFsc2UpOwotCQkvKgotCQlXb3JrYmVuY2hKb2IgdWlKb2IgPSBuZXcgV29ya2JlbmNoSm9iKCJSZWZyZXNoaW5nIGljb25zLi4uIikgewotCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlyZXBhaW50KGFsbCk7Ci0JCQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXVpSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQkJKi8KLQkJLyoKLQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGFsbCkKLQkJCQkJdXBkYXRlQWN0aW9uKCk7Ci0JCQkJcmVwYWludChhbGwpOwotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJICovCi0JfQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUFjdGlvbigpOwotCS8vIFNldCBlbGVtZW50IGluZm8KLQkvKiogSW5pdGlhbCB2aWV3IHNldHRpbmcKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsVmlldygpOwotCS8vIFNldCBlbGVtZW50IHRvIGRpc3BsYXkKLQkvKiogSW5pdGlhbCBlbGVtZW50cyBzZXR0aW5nCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbEVsZW1lbnQoKTsKLQkvLyBzZXQgdXBkYXRlIHZpZXcgZGV0YWlscwotCS8qKiBVcGRhdGUgdmlldyBkZXRhaWxzCi0JICogCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlKCk7Ci0JLyoqIFVwZGF0ZSB2aWV3IHRpdGxlCi0JICogCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVGl0bGUoKTsKLQkvKiogR2V0IGN1cnJlbnQgSUQKLQkgKiBAcmV0dXJuIGVsZW1lbnQgSUQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEN1cnJlbnRJRCgpOwotCS8qKiBEb3VibGUgY2xpY2sgYWN0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb3VibGVDbGljayhJRWxlbWVudCBlbGVtZW50KTsKLQkvKiogR2V0IGVsZW1lbnQgaW1hZ2UKLQkgKiBAcGFyYW0gaW5kZXgxIGZpcnN0IGFycmF5IGluZGV4Ci0JICogQHBhcmFtIGluZGV4MiBzZWNvbmQgYXJyYXkgaW5kZXgKLQkgKiBAcmV0dXJuIGltYWdlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlIGdldEltYWdlKGludCBpbmRleDEsIGludCBpbmRleDIpOwotCS8qKiBHZXQgdG9vbHRpcCB0ZXh0Ci0JICogQHBhcmFtIG9iaiBTZWxlY3RlZCBlbGVtZW50Ci0JICogQHJldHVybiB0ZXh0IG9mIHRvb2x0aXAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VG9vbFRpcFRleHQoT2JqZWN0IG9iaik7Ci0JLyoqIEZpbmQgYWN0dWFsIG9iamVjdAotCSAqIEBwYXJhbSBlbGVtZW50IFRhcmdldCBlbGVtZW50Ci0JICogQHJldHVybiBvYmplY3QgcmVwcmVzZW50IG9mIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGNvbnZlcnRFbGVtZW50T2JqZWN0KElFbGVtZW50IGVsZW1lbnQpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSUNvbnRlbnRQcm92aWRlcgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLklDb250ZW50UHJvdmlkZXIjZ2V0T2JqZWN0KGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgaW5kZXgpIHsKLQkJaWYgKGNhbnZhcyAhPSBudWxsICYmIG1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNhbnZhcy5nZXRFbGVtZW50KGluZGV4KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSdWxlckluZGV4KE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoaW5kZXgpOwotCX0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElUb29sVGlwUHJvdmlkZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5JVG9vbFRpcFByb3ZpZGVyI3Rvb2xUaXBUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIHRvb2xUaXBUZXh0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElFbGVtZW50KSB7CQkJCi0JCQlyZXR1cm4gZ2V0VG9vbFRpcFRleHQoY29udmVydEVsZW1lbnRPYmplY3QoKElFbGVtZW50KW9iaikpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiIiB9OwotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoT2JqZWN0IG9iaiwgU3RyaW5nIGNvbnRlbnQpIHsKLQkJY2FudmFzLnVwZGF0ZVRvb2xUaXBUZXh0KG9iaiwgY29udGVudCk7Ci0JfQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSW1hZ2UgUHJvdmlkZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5JSW1hZ2VQcm92aWRlciNnZXRTdGF0dXNJY29uKGphdmEubGFuZy5PYmplY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEltYWdlIGdldFN0YXR1c0ljb24oT2JqZWN0IG9iaiwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQpIHsKLQkJaWYgKGN1cl9lbGVtZW50X3NldCAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIElFbGVtZW50KSB7Ci0JCQlpbnQgc3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKElFbGVtZW50KW9iaiwgaW5kZXgpOwotCQkJcmV0dXJuIGdldEltYWdlKHN0YXR1cywgaXNTZWxlY3RlZCA/IDEgOiAwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLklJbWFnZVByb3ZpZGVyI2RyYXdTcGVjaWFsKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRyYXdTcGVjaWFsKE9iamVjdCBvYmosIGludCBpbmRleCwgR0MgZ2MsIGludCB4X2xvYywgaW50IHlfbG9jLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKGN1cl9lbGVtZW50X3NldCAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIElFbGVtZW50KSB7Ci0JCQlpZiAoKChJRWxlbWVudClvYmopLmlzUmVnaXN0ZXJlZCgpKSB7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChyZWdpc3RlckNvbG9yKTsKLQkJCQlnYy5kcmF3UmVjdGFuZ2xlKHhfbG9jLCB5X2xvYywgd2lkdGgsIGhlaWdodCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChjYW52YXMuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJCX0KLQkJfQotCX0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5JSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyI2hhbmRsZUFjdGlvbihpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVBY3Rpb24oaW50IHR5cGUsIGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPiAtMSkgewotCQkJSUVsZW1lbnQgZWxlbWVudCA9IGNhbnZhcy5nZXRFbGVtZW50KGluZGV4KTsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5ET1VCTEVfQ0xJQ0tfQUNUSU9OOgotCQkJCQlkb3VibGVDbGljayhlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqIFNob3cgcnVsZXIKLQkgKiBAcGFyYW0gc2hvd1J1bGVyIHRydWUgaWYgc2hvdyBydWxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlSdWxlcihmaW5hbCBib29sZWFuIHNob3dSdWxlcikgewotCQlhc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0RGlzcGxheVJ1bGVyKHNob3dSdWxlcik7Ci0JCQkJfQotCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyoqIElzIHJ1bGVyIGRpc3BsYXllZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBydWxlciBpcyBkaXNwbGF5ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3BsYXlSdWxlcigpIHsKLQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gY2FudmFzLmlzRGlzcGxheVJ1bGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjYW52YXMuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotICAgIAotCWNsYXNzIEljb25SZWZyZXNoV29ya2JlbmNoSm9iIGV4dGVuZHMgV29ya2JlbmNoSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrCXdhaXRMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLQkJcHJpdmF0ZSBMaXN0PEJvb2xlYW4+IHJlZnJlc2hMaXN0ID0gbmV3IEFycmF5TGlzdDxCb29sZWFuPigpOwotCQlwdWJsaWMgSWNvblJlZnJlc2hXb3JrYmVuY2hKb2IoKSB7Ci0JCQlzdXBlcigiUmVmcmVzaGluZyBpY29ucy4uLiIpOwotCQl9Ci0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlib29sZWFuIHJlZnJlc2hBbGwgPSBpc1JlZnJlc2hBbGwoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiLS0tLS0tLS0tLSBJY29uUmVmcmVzaFdvcmtiZW5jaEpvYiByZWZyZXNoOiAiICsgcmVmcmVzaEFsbCk7Ci0JCQl9Ci0JCQlyZXBhaW50KHJlZnJlc2hBbGwpOwotCQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY2FudmFzLnJlZHJhdygpOwotCQkJfQotCQkJCi0JCQkvL2lmIGxhc3QgcmVmcmVzaCBvYmplY3QgaXMgdHJ1ZSBhbmQgcHJldmlvdXMgcmVmcmVzaCBpcyBmYWxzZSwgdGhlbiByZWZyZXNoIGFnYWluIAotCQkJYm9vbGVhbiBsYXN0VmFsdWUgPSBpc1JlZnJlc2hBbGwoKTsKLQkJCXdhaXRMb2NrLmxvY2soKTsKLQkJCXRyeSB7Ci0JCQkJcmVmcmVzaExpc3QuY2xlYXIoKTsKLQkJCQlpZiAocmVmcmVzaEFsbCAhPSBsYXN0VmFsdWUgJiYgIXJlZnJlc2hBbGwpIHsKLQkJCQkJcmVmcmVzaExpc3QuYWRkKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQkJc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl3YWl0TG9jay51bmxvY2soKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHNob3VsZFNjaGVkdWxlKCkgewotCQkJaW50IHNpemUgPSBzaXplKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIi0tLS0tLS0tLS0gSWNvblJlZnJlc2hXb3JrYmVuY2hKb2I6ICIgKyByZWZyZXNoTGlzdC5zaXplKCkpOwotCQkJfQotCQkJcmV0dXJuIChzaXplID09IDEpOwotCQl9Ci0JCXByaXZhdGUgaW50IHNpemUoKSB7Ci0JCQl3YWl0TG9jay5sb2NrKCk7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZWZyZXNoTGlzdC5zaXplKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl3YWl0TG9jay51bmxvY2soKTsKLQkJCX0KLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaXNSZWZyZXNoQWxsKCkgewotCQkJd2FpdExvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVmcmVzaExpc3QuZ2V0KHJlZnJlc2hMaXN0LnNpemUoKS0xKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXdhaXRMb2NrLnVubG9jaygpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHNjaGVkdWxlKGJvb2xlYW4gcmVmcmVzaF9hbGwsIGJvb2xlYW4gZm9yY2UpIHsKLQkJCXdhaXRMb2NrLmxvY2soKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZvcmNlKQotCQkJCQlyZWZyZXNoTGlzdC5jbGVhcigpOwotCQkJCXJlZnJlc2hMaXN0LmFkZChuZXcgQm9vbGVhbihyZWZyZXNoX2FsbCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9BYnN0cmFjdFBhcmFsbGVsU2V0Vmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9BYnN0cmFjdFBhcmFsbGVsU2V0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjlkNzcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvQWJzdHJhY3RQYXJhbGxlbFNldFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9ucy5DaGFuZ2VTZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnMuQ3JlYXRlU2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zLkRlbGV0ZVNldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9ucy5EaXNwbGF5UnVsZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnMuUmVtb3ZlRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9ucy5ab29tSW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnMuWm9vbU91dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJhbGxlbFNldFZpZXcgZXh0ZW5kcyBBYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcgewotCXByb3RlY3RlZCBMaXN0PElFbGVtZW50W10+IGNsaXBib2FyZCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRbXT4oKTsKLQkKLQkvLyBzZWxlY3RlZCBlbGVtZW50Ci0JcHJvdGVjdGVkIFN0cmluZyBjdXJfc2VsZWN0ZWRfZWxlbWVudF9pZCA9IElNYW5hZ2VyLkVNUFRZX0lEOwotCS8vIGRlZmF1bHQgYWN0aW9ucwotCXByb3RlY3RlZCBQYXJhbGxlbEFjdGlvbiBjcmVhdGVTZXRBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBQYXJhbGxlbEFjdGlvbiBkZWxldGVTZXRBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBQYXJhbGxlbEFjdGlvbiBkZWxldGVQcm9jZXNzQWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUGFyYWxsZWxBY3Rpb24gY2hhbmdlU2V0QWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUGFyYWxsZWxBY3Rpb24gem9vbUluQWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUGFyYWxsZWxBY3Rpb24gem9vbU91dEFjdGlvbiA9IG51bGw7Ci0KLQkvL3pvb20KLQlwcm90ZWN0ZWQgaW50IHpvb21fZGVwdGggPSAwOwotCXByb3RlY3RlZCBab29tIHpvb20gPSBuZXcgWm9vbSgpOwotCi0JLy9sYXN0IGFjdGlvbgotCXByb3RlY3RlZCBpbnQgbGFzdF9hY3Rpb24gPSAtMTsKLQlwcm90ZWN0ZWQgSUVsZW1lbnRTZXQgbGFzdF9lbGVtZW50X3NldCA9IG51bGw7Ci0JCi0JcHVibGljIEFic3RyYWN0UGFyYWxsZWxTZXRWaWV3KElNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIobWFuYWdlcik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNsaXBib2FyZC5jbGVhcigpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0JCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJY3JlYXRlVG9vbEJhckFjdGlvbkdyb3VwKHRvb2xCYXJNZ3IpOwotCQljcmVhdGVUb29sQmFyQWN0aW9ucyh0b29sQmFyTWdyKTsKLQkJSU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQljcmVhdGVNZW51QWN0aW9ucyhtZW51TWdyKTsKLQkJY3JlYXRlQ29udGV4dE1lbnUoKTsKLQkJaW5pdGlhbFZpZXcoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVG9vbEJhckFjdGlvbkdyb3VwKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyKSB7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUFVJQ29uc3RhbnRzLklVSVpPT01HUk9VUCkpOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlOQVZJR0FUT1JHUk9VUCkpOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlBQ1RJT05HUk9VUCkpOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlFTVBUWUdST1VQKSk7Ci0KLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQVUlDb25zdGFudHMuSVVJU0VUR1JPVVApKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQVUlDb25zdGFudHMuSVVJQ0hBTkdFU0VUR1JPVVApKTsKLQl9Ci0JLyoqIEJ1aWxkLWluIFRvb2xiYXIgYWN0aW9ucwotCSAqIEBwYXJhbSB0b29sQmFyTWdyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRJblRvb2xCYXJBY3Rpb25zKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyKSB7Ci0JCXpvb21PdXRBY3Rpb24gPSBuZXcgWm9vbU91dEFjdGlvbih0aGlzKTsKLQkJem9vbUluQWN0aW9uID0gbmV3IFpvb21JbkFjdGlvbih0aGlzKTsKLQkJY3JlYXRlU2V0QWN0aW9uID0gbmV3IENyZWF0ZVNldEFjdGlvbih0aGlzKTsKLQkJZGVsZXRlU2V0QWN0aW9uID0gbmV3IERlbGV0ZVNldEFjdGlvbih0aGlzKTsKLQkJZGVsZXRlUHJvY2Vzc0FjdGlvbiA9IG5ldyBSZW1vdmVFbGVtZW50QWN0aW9uKHRoaXMpOwotCQljaGFuZ2VTZXRBY3Rpb24gPSBuZXcgQ2hhbmdlU2V0QWN0aW9uKHRoaXMpOwotCQkKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBVSUNvbnN0YW50cy5JVUlaT09NR1JPVVAsIHpvb21PdXRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUFVJQ29uc3RhbnRzLklVSVpPT01HUk9VUCwgem9vbUluQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBVSUNvbnN0YW50cy5JVUlTRVRHUk9VUCwgY3JlYXRlU2V0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBVSUNvbnN0YW50cy5JVUlTRVRHUk9VUCwgZGVsZXRlU2V0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBVSUNvbnN0YW50cy5JVUlTRVRHUk9VUCwgZGVsZXRlUHJvY2Vzc0FjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYXBwZW5kVG9Hcm91cChJUFRQVUlDb25zdGFudHMuSVVJQ0hBTkdFU0VUR1JPVVAsIGNoYW5nZVNldEFjdGlvbik7Ci0JfQotCS8qKiBDcmVhdGUgdG9vbGJhciBhY3Rpb25zCi0JICogQHBhcmFtIHRvb2xCYXJNZ3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sQmFyQWN0aW9ucyhJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1ncikgewotCQlidWlsZEluVG9vbEJhckFjdGlvbnModG9vbEJhck1ncik7Ci0JfQotCS8qKiBDcmVhdGUgbWVudSBhY3Rpb25zCi0JICogQHBhcmFtIG1lbnVNZ3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1ncikge30KLQkvKiogQ3JlYXRlIGNvbnRleHQgbWVudQotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KCkgewotCQlNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjcG9wdXBtZW51Iik7Ci0JCW1lbnVNZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCWZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUoY2FudmFzKTsKLQkJY2FudmFzLnNldE1lbnUobWVudSk7Ci0JCS8vIEJlIHN1cmUgdG8gcmVnaXN0ZXIgaXQgc28gdGhhdCBvdGhlciBwbHVnLWlucyBjYW4gYWRkIGFjdGlvbnMuCi0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIGNhbnZhcyk7Ci0JfQotCS8qKiBDcmVhdGUgY29udGV4dCBtZW51Ci0JICogQHBhcmFtIG1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJUFRQVUlDb25zdGFudHMuSVVJQUNUSU9OR1JPVVApKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJUFRQVUlDb25zdGFudHMuSVVJRU1QVFlHUk9VUCkpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlaT09NR1JPVVApKTsKLQkJbWFuYWdlci5hZGQoem9vbU91dEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHpvb21JbkFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUFVJQ29uc3RhbnRzLklVSUNIQU5HRVNFVEdST1VQKSk7Ci0JCW1hbmFnZXIuYWRkKGNoYW5nZVNldEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUFVJQ29uc3RhbnRzLklVSVZJRVdHUk9VUCkpOwotCQltYW5hZ2VyLmFkZChuZXcgRGlzcGxheVJ1bGVyQWN0aW9uKHRoaXMpKTsKLQkJLy8gT3RoZXIgcGx1Zy1pbnMgY2FuIGNvbnRyaWJ1dGUgdGhlcmUgYWN0aW9ucyBoZXJlCi0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdXBkYXRlQWN0aW9uKCk7Ci0JCXVwZGF0ZVRpdGxlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjdXBkYXRlVGl0bGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKCkgewotCQlpZiAoY3VyX2VsZW1lbnRfc2V0ICE9IG51bGwpCi0JCQljaGFuZ2VUaXRsZShtYW5hZ2VyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRDdXJyZW50SUQoKSksCi0JCQkJCWN1cl9lbGVtZW50X3NldC5nZXRJRCgpLCBjdXJfc2V0X3NpemUpOwotCQllbHNlCi0JCQljaGFuZ2VUaXRsZShtYW5hZ2VyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRDdXJyZW50SUQoKSkpOwotCX0KLQkvKiogVXBkYXRlIGFjdGlvbgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbigpIHsKLQkJYm9vbGVhbiBkZWxldGVBY3Rpb25FbmFibGUgPSAobWFuYWdlci5nZXRDdXJyZW50U2V0SWQoKS5sZW5ndGgoKSA9PSAwIHx8IG1hbmFnZXIuZ2V0Q3VycmVudFNldElkKCkuZXF1YWxzKElFbGVtZW50SGFuZGxlci5TRVRfUk9PVF9JRCkpOwotCQlkZWxldGVTZXRBY3Rpb24uc2V0RW5hYmxlZCghZGVsZXRlQWN0aW9uRW5hYmxlKTsKLQkJZGVsZXRlUHJvY2Vzc0FjdGlvbi5zZXRFbmFibGVkKCFkZWxldGVBY3Rpb25FbmFibGUpOwotCQljcmVhdGVTZXRBY3Rpb24uc2V0RW5hYmxlZChjdXJfc2V0X3NpemUgPiAwKTsKLQkJSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyID0gZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCk7Ci0JCWNoYW5nZVNldEFjdGlvbi5zZXRFbmFibGVkKCEoZWxlbWVudEhhbmRsZXIgPT0gbnVsbCB8fCBlbGVtZW50SGFuZGxlci5zaXplKCkgPT0gMCkpOwotCQkKLQkJem9vbUluQWN0aW9uLnNldEVuYWJsZWQoY3VyX3NldF9zaXplID4gMCAmJiB6b29tX2RlcHRoID4gMCk7Ci0JCXpvb21PdXRBY3Rpb24uc2V0RW5hYmxlZChjdXJfc2V0X3NpemUgPiAwICYmIHpvb21fZGVwdGggPCBab29tLm1heF9kZXB0aCk7Ci0JfQotCS8qKiBPcGVuIHByb2Nlc3Mgdmlld2VyCi0JICogQHBhcmFtIGVsZW1lbnQgVGFyZ2V0IElQUHJvY2VzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5Qcm9jZXNzVmlld2VyKGZpbmFsIElQUHJvY2VzcyBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNob3dXaGlsZShuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUFRQVUlQbHVnaW4uZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IobmV3IFByb2Nlc3NFZGl0b3JJbnB1dChlbGVtZW50KSwgSVBUUFVJQ29uc3RhbnRzLlZJRVdfUEFSQUxMRUxQcm9jZXNzKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBUUFVJUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lciNoYW5kbGVBY3Rpb24oaW50LCBpbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVBY3Rpb24oaW50IHR5cGUsIGludFtdIGluZGV4ZXMpIHsKLQkJaWYgKGN1cl9lbGVtZW50X3NldCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSUVsZW1lbnRbXSBlbGVtZW50cyA9IGNhbnZhcy5nZXRFbGVtZW50cyhpbmRleGVzKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5DT1BZX0FDVElPTjoKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJY2xpcGJvYXJkLmNsZWFyKCk7Ci0JCQkJY2xpcGJvYXJkLmFkZChlbGVtZW50cyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyLkNVVF9BQ1RJT046Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCWlmICghY3VyX2VsZW1lbnRfc2V0LmlzUm9vdFNldCgpKSB7Ci0JCQkJCWNsaXBib2FyZC5jbGVhcigpOwotCQkJCQljbGlwYm9hcmQuYWRkKGVsZW1lbnRzKTsKLQkJCQkJbGFzdF9hY3Rpb24gPSB0eXBlOwotCQkJCQlsYXN0X2VsZW1lbnRfc2V0ID0gY3VyX2VsZW1lbnRfc2V0OwotCQkJCQkvL21hbmFnZXIucmVtb3ZlRnJvbVNldChlbGVtZW50cywgY3VyX2VsZW1lbnRfc2V0LmdldElEKCksIGN1cl9lbGVtZW50X3NldC5nZXRFbGVtZW50SGFuZGxlcigpKTsKLQkJCQkJLy9zZWxlY3RTZXQoY3VyX2VsZW1lbnRfc2V0LmdldEVsZW1lbnRIYW5kbGVyKCkuZ2V0U2V0KGN1cl9lbGVtZW50X3NldC5nZXRJRCgpKSk7Ci0JCQkJCS8vdXBkYXRlVGl0bGUoKTsKLQkJCQkJLy9yZWZyZXNoKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyLlBBU1RFX0FDVElPTjoKLQkJCWlmIChjbGlwYm9hcmQuc2l6ZSgpID4gMCkgewotCQkJCUlFbGVtZW50W10gY2xpcEVsZW1lbnRzID0gKElFbGVtZW50W10pY2xpcGJvYXJkLmdldCgwKTsKLQkJCQlpZiAobGFzdF9hY3Rpb24gPT0gSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5DVVRfQUNUSU9OKSB7Ci0JCQkJCWlmIChsYXN0X2VsZW1lbnRfc2V0ICE9IG51bGwgJiYgIWxhc3RfZWxlbWVudF9zZXQuZ2V0SUQoKS5lcXVhbHMoY3VyX2VsZW1lbnRfc2V0LmdldElEKCkpKSB7Ci0JCQkJCQlpZiAobGFzdF9lbGVtZW50X3NldC5zaXplKCkgPT0gY2xpcEVsZW1lbnRzLmxlbmd0aCkgewotCQkJCQkJCW1hbmFnZXIucmVtb3ZlU2V0KGxhc3RfZWxlbWVudF9zZXQuZ2V0SUQoKSwgKElFbGVtZW50SGFuZGxlcilsYXN0X2VsZW1lbnRfc2V0LmdldFBhcmVudCgpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW1hbmFnZXIucmVtb3ZlRnJvbVNldChjbGlwRWxlbWVudHMsIGxhc3RfZWxlbWVudF9zZXQuZ2V0SUQoKSwgKElFbGVtZW50SGFuZGxlcilsYXN0X2VsZW1lbnRfc2V0LmdldFBhcmVudCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoY3VyX2VsZW1lbnRfc2V0LmlzUm9vdFNldCgpKQotCQkJCQljcmVhdGVTZXRBY3Rpb24ucnVuKGNsaXBFbGVtZW50cyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW1hbmFnZXIuYWRkVG9TZXQoY2xpcEVsZW1lbnRzLCBjdXJfZWxlbWVudF9zZXQuZ2V0SUQoKSwgKElFbGVtZW50SGFuZGxlciljdXJfZWxlbWVudF9zZXQuZ2V0UGFyZW50KCkpOwotCQkJCQlzZWxlY3RTZXQoKElFbGVtZW50U2V0KSgoSUVsZW1lbnRIYW5kbGVyKWN1cl9lbGVtZW50X3NldC5nZXRQYXJlbnQoKSkuZ2V0RWxlbWVudEJ5SUQoY3VyX2VsZW1lbnRfc2V0LmdldElEKCkpKTsJCQkJCQotCQkJCQkvL3VwZGF0ZSgpOwotCQkJCQlyZWZyZXNoKGZhbHNlKTsKLQkJCQl9Ci0JCQkJdHlwZSA9IC0xOwotCQkJCWxhc3RfZWxlbWVudF9zZXQgPSBudWxsOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5ERUxFVEVfQUNUSU9OOgotCQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoIWN1cl9lbGVtZW50X3NldC5pc1Jvb3RTZXQoKSkgewotCQkJCQlkZWxldGVQcm9jZXNzQWN0aW9uLnJ1bihlbGVtZW50cyk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogWm9vbQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgdm9pZCB6b29tT3V0KCkgewotCQlpZiAoem9vbV9kZXB0aCA8IFpvb20ubWF4X2RlcHRoKSB7Ci0JCQl6b29tX2RlcHRoKys7Ci0JCQl1cGRhdGUoKTsKLQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCWNhbnZhcy5zZXRJY29uU2l6ZSh6b29tLnNjYWxlZChJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fV0lEVEgsIHpvb21fZGVwdGgpLCB6b29tLnNjYWxlZChJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fSEVJR0hULCB6b29tX2RlcHRoKSk7Ci0JCQkJY2FudmFzLnNldEljb25TcGFjZShJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fU1BBQ0lOR19YIC0gem9vbV9kZXB0aCwgSVBUUFVJQ29uc3RhbnRzLkRFRkFVTFRfVklFV19JQ09OX1NQQUNJTkdfWSk7Ci0JCQkJY2FudmFzLnNldEZvbnRTaXplU21hbGxlcigpOwotCQkJCWNhbnZhcy5yZXNldENhbnZhcygpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHpvb21JbigpIHsKLQkJaWYgKHpvb21fZGVwdGggPiAwKSB7Ci0JCQl6b29tX2RlcHRoLS07Ci0JCQl1cGRhdGUoKTsKLQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCWNhbnZhcy5zZXRJY29uU2l6ZSh6b29tLnNjYWxlZChJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fV0lEVEgsIHpvb21fZGVwdGgpLCB6b29tLnNjYWxlZChJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fSEVJR0hULCB6b29tX2RlcHRoKSk7Ci0JCQkJY2FudmFzLnNldEljb25TcGFjZShJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fU1BBQ0lOR19YIC0gem9vbV9kZXB0aCwgSVBUUFVJQ29uc3RhbnRzLkRFRkFVTFRfVklFV19JQ09OX1NQQUNJTkdfWSk7Ci0JCQkJY2FudmFzLnNldEZvbnRTaXplQmlnZ2VyKCk7Ci0JCQkJY2FudmFzLnJlc2V0Q2FudmFzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIEltYWdlIGdldFN0YXR1c0ljb24oT2JqZWN0IG9iaiwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQpIHsKLQkJSW1hZ2UgaW1nID0gc3VwZXIuZ2V0U3RhdHVzSWNvbihvYmosIGluZGV4LCBpc1NlbGVjdGVkKTsKLQkJaWYgKGltZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gem9vbS5nZXRJbWFnZShpbWcsIHpvb21fZGVwdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLSAgICAKLQljbGFzcyBab29tIHsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgbWF4X2RlcHRoID0gMzsKLQkJcHJvdGVjdGVkIE1hcDxJbWFnZSwgSW1hZ2VbXT4gem9vbUltYWdlTWFwID0gbmV3IEhhc2hNYXA8SW1hZ2UsIEltYWdlW10+KCk7Ci0JCQotCQlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotCQkJem9vbUltYWdlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKEltYWdlIGltYWdlLCBpbnQgZGVwdGgpIHsKLQkJCWlmIChkZXB0aCA9PSAwKQotCQkJCXJldHVybiBpbWFnZTsKLQkJCQotCQkJSW1hZ2VbXSBpbWFnZXMgPSAoSW1hZ2VbXSl6b29tSW1hZ2VNYXAuZ2V0KGltYWdlKTsKLQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCWltYWdlcyA9IG5ldyBJbWFnZVttYXhfZGVwdGhdOwotCQkJCXpvb21JbWFnZU1hcC5wdXQoaW1hZ2UsIGltYWdlcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0Wm9vbUltYWdlKGltYWdlcywgaW1hZ2UsIGRlcHRoKTsKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0Wm9vbUltYWdlKEltYWdlW10gaW1hZ2VzLCBJbWFnZSBvcmdJbWcsIGludCBkZXB0aCkgewotCQkJaWYgKGltYWdlc1tkZXB0aC0xXSA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VzW2RlcHRoLTFdID0gc2NhbGVkSW1hZ2Uob3JnSW1nLCBkZXB0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW1hZ2VzW2RlcHRoLTFdOwotCQl9Ci0JCXB1YmxpYyBkb3VibGUgZ2V0U2NhbGUoaW50IGRlcHRoKSB7Ci0JCQlkb3VibGUgZml4X2ZhY3RvciA9IDAuMjsKLQkJCXJldHVybiAoMSAtIChmaXhfZmFjdG9yICogZGVwdGgpKTsKLQkJfQotCQlwdWJsaWMgaW50IHNjYWxlZChpbnQgbWVhc3VyZSwgaW50IGRlcHRoKSB7Ci0JCQlyZXR1cm4gKGludCkobWVhc3VyZSAqIGdldFNjYWxlKGRlcHRoKSk7Ci0JCX0KLQkJcHVibGljIEltYWdlIHNjYWxlZEltYWdlKEltYWdlIGltYWdlLCBpbnQgZGVwdGgpIHsKLQkJCXJldHVybiBuZXcgSW1hZ2UoaW1hZ2UuZ2V0RGV2aWNlKCksIGltYWdlLmdldEltYWdlRGF0YSgpLnNjYWxlZFRvKHNjYWxlZChJUFRQVUlDb25zdGFudHMuREVGQVVMVF9WSUVXX0lDT05fV0lEVEgsIGRlcHRoKSwgc2NhbGVkKElQVFBVSUNvbnN0YW50cy5ERUZBVUxUX1ZJRVdfSUNPTl9IRUlHSFQsIGRlcHRoKSkpOwotCQl9Ci0JfSAgICAKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvQWJzdHJhY3RQYXJhbGxlbFZpZXcuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvQWJzdHJhY3RQYXJhbGxlbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkZjM3Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0Fic3RyYWN0UGFyYWxsZWxWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcmFsbGVsVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZSA9IGZhbHNlOwotCXByaXZhdGUgUGFyYWxsZWxWaWV3UGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBhcnRMaXN0ZW5lcigpIHsKLQkJaWYgKHBhcnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlwYXJ0TGlzdGVuZXIgPSBuZXcgUGFyYWxsZWxWaWV3UGFydExpc3RlbmVyKCk7Ci0JCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRlcmVnaXN0ZXJQYXJ0TGlzdGVuZXIoKSB7Ci0JCWlmIChwYXJ0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCXBhcnRMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiogR2V0IERpc3BsYXkKLQkgKiBAcmV0dXJuIGRpc3BsYXkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQl9Ci0JcHVibGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHIpIHsKLQkJaWYgKGlzVmlzaWJsZSgpKQotCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhyKTsKLQl9Ci0JcHVibGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcikgewotCQlpZiAoaXNWaXNpYmxlKCkpCi0JCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMocik7Ci0JfQotCXB1YmxpYyB2b2lkIHNob3dXaGlsZShSdW5uYWJsZSByKSB7Ci0JCWlmIChpc1Zpc2libGUoKSkKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldERpc3BsYXkoKSwgcik7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcGFpbnQoYm9vbGVhbiBhbGwpOwotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGlzIHZpZXcgaXMgbm93IHZpc2libGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVjb21lc1Zpc2libGUoKSB7fQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGlzIHZpZXcgaXMgbm93IGhpZGRlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWNvbWVzSGlkZGVuKCkge30KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiBmSXNWaXNpYmxlOwotCX0KLQlwcml2YXRlIGNsYXNzIFBhcmFsbGVsVmlld1BhcnRMaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIyIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tIHBhcnRBY3RpdmF0ZWQiKTsKLQkJCX0KLQkJCXJlcGFpbnQodHJ1ZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7fQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHt9Ci0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7fQotCQlwdWJsaWMgdm9pZCBwYXJ0SW5wdXRDaGFuZ2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHt9Ci0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikge30KLQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ID09IEFic3RyYWN0UGFyYWxsZWxWaWV3LnRoaXMpIHsKLQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJYmVjb21lc0hpZGRlbigpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgPT0gQWJzdHJhY3RQYXJhbGxlbFZpZXcudGhpcykgewotCQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJCWJlY29tZXNWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0VsZW1lbnRJY29uQ2FudmFzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0VsZW1lbnRJY29uQ2FudmFzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2U0MzYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9FbGVtZW50SWNvbkNhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SWNvbkNhbnZhcyBleHRlbmRzIEljb25DYW52YXMgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewotCXByaXZhdGUgSUVsZW1lbnRTZXQgY3VyX2VsZW1lbnRfc2V0ID0gbnVsbDsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7IAotCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcgCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZSB2aWV3IHN0eWxlCi0JICovCi0JcHVibGljIEVsZW1lbnRJY29uQ2FudmFzKEFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyB2aWV3LCBDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXNldEljb25TcGFjZShzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1gpLCBzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9TUEFDSU5HX1kpKTsKLQkJc2V0SWNvblNpemUoc3RvcmUuZ2V0SW50KElQVFBVSUNvbnN0YW50cy5WSUVXX0lDT05fV0lEVEgpLCBzdG9yZS5nZXRJbnQoSVBUUFVJQ29uc3RhbnRzLlZJRVdfSUNPTl9IRUlHSFQpKTsKLQkJc2V0VG9vbHRpcChzdG9yZS5nZXRCb29sZWFuKElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfU0hPV0FMTFRJTUUpLCBzdG9yZS5nZXRMb25nKElQVFBVSUNvbnN0YW50cy5WSUVXX1RPT0xUSVBfVElNRU9VVCksIHN0b3JlLmdldEJvb2xlYW4oSVBUUFVJQ29uc3RhbnRzLlZJRVdfVE9PTFRJUF9JU1dSQVApKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWxpc3RlbmVycy5jbGVhcigpOwotCQlzZWxlY3Rpb24gPSBudWxsOwotCQljdXJfZWxlbWVudF9zZXQgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgIAkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0JCi0JLyoqIENoYW5nZSBzZXQKLQkgKiBAcGFyYW0gZV9zZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50U2V0KElFbGVtZW50U2V0IGVfc2V0KSB7Ci0JCXRoaXMuY3VyX2VsZW1lbnRfc2V0ID0gZV9zZXQ7Ci0JCXRoaXMuc2VsZWN0aW9uID0gbnVsbDsKLQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0VG90YWwoY3VyX2VsZW1lbnRfc2V0ID09IG51bGwgPyAwIDogY3VyX2VsZW1lbnRfc2V0LnNpemUoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKiogR2V0IGN1cnJlbnQgc2V0Ci0JICogQHJldHVybiBjdXJyZW50IHNldAotCSAqLwotCXB1YmxpYyBJRWxlbWVudFNldCBnZXRDdXJyZW50RWxlbWVudFNldCgpIHsKLQkJcmV0dXJuIGN1cl9lbGVtZW50X3NldDsKLQl9Ci0JLyoqIEdldCBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4IEVsZW1lbnQgaW5kZXgKLQkgKiBAcmV0dXJuIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnQgZ2V0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJaWYgKGN1cl9lbGVtZW50X3NldCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjdXJfZWxlbWVudF9zZXQuZ2V0RWxlbWVudChpbmRleCk7Ci0JfQotCS8qKiBHZXQgZWxlbWVudHMKLQkgKiBAcGFyYW0gaW5kZXhlcyBFbGVtZW50IGluZGV4ZXMKLQkgKiBAcmV0dXJuIGVsZW1lbnRzCi0JICovCi0JcHVibGljIElFbGVtZW50W10gZ2V0RWxlbWVudHMoaW50W10gaW5kZXhlcykgewotCQlpZiAoY3VyX2VsZW1lbnRfc2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElFbGVtZW50WzBdOwotCQlMaXN0PElFbGVtZW50PiBzZWxlY3RlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudD4oKTsKLQkJZm9yIChpbnQgaW5kZXggOiBpbmRleGVzKSB7Ci0JCQlzZWxlY3RlZEVsZW1lbnRzLmFkZChjdXJfZWxlbWVudF9zZXQuZ2V0RWxlbWVudChpbmRleCkpOwotCQl9Ci0JCXJldHVybiAoSUVsZW1lbnRbXSkgc2VsZWN0ZWRFbGVtZW50cy50b0FycmF5KG5ldyBJRWxlbWVudFswXSk7Ci0JfQotCS8qKiBHZXQgc2VsZWN0ZWQgZWxlbWVudHMKLQkgKiBAcmV0dXJuIHNlbGVjdGVkIGVsZW1lbnRzCi0JICovCi0JcHVibGljIElFbGVtZW50W10gZ2V0U2VsZWN0ZWRFbGVtZW50cygpIHsKLQkJaWYgKGN1cl9lbGVtZW50X3NldCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRWxlbWVudFswXTsKLQkJSUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJRWxlbWVudFtzZWxlY3RlZEVsZW1lbnRzLmNhcmRpbmFsaXR5KCldOwotCQlmb3IgKGludCBpID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0U2V0Qml0KDApLCBqID0gMDsgaSA+PSAwOyBpID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0U2V0Qml0KGkgKyAxKSwgaisrKSB7Ci0JCQllbGVtZW50c1tqXSA9IGN1cl9lbGVtZW50X3NldC5nZXRFbGVtZW50KGkpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQkJLy9yZXR1cm4gZ2V0RWxlbWVudHMoZ2V0U2VsZWN0ZWRJbmRleGVzKCkpOwotCX0KLQkKLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHNlbGVjdGlvbjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgICAgICBmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoRWxlbWVudEljb25DYW52YXMudGhpcywgc2VsZWN0aW9uKTsKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhcnJheVtpXTsKLSAgICAgICAgICAgIFNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwuc2VsZWN0aW9uQ2hhbmdlZChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50U2VsZWN0aW9uKGJvb2xlYW4gc2VuZEV2ZW50LCBJRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0gICAgCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnRzKTsKLSAgICAJaWYgKHNlbmRFdmVudCkgewotICAgIAkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgCX0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFNlbGVjdGlvbihib29sZWFuIHNlbmRFdmVudCkgewotICAgIAlzZXRDdXJyZW50U2VsZWN0aW9uKHNlbmRFdmVudCwgZ2V0U2VsZWN0ZWRFbGVtZW50cygpKTsKLSAgICB9Ci0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW91c2VVcChFdmVudCBldmVudCkgewotCQlzdXBlci5oYW5kbGVNb3VzZVVwKGV2ZW50KTsKLQkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFNlbGVjdGVkRWxlbWVudHMoKSkpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NlbGVjdGlvbkFsbCgpIHsKLQkJc3VwZXIuZG9TZWxlY3Rpb25BbGwoKTsKLQkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFNlbGVjdGVkRWxlbWVudHMoKSkpOwotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sVGlwVGV4dChPYmplY3Qgb2JqLCBmaW5hbCBTdHJpbmcgY29udGVudCkgewotCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZkluZm9ybWF0aW9uQ29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCWZJbmZvcm1hdGlvbkNvbnRyb2wuc2V0SW5mb3JtYXRpb24oY29udGVudCk7Ci0JCQkJCWZJbmZvcm1hdGlvbkNvbnRyb2wuZ2V0U2hlbGxTaXplKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0lDb250ZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvSUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk4YjRlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvSUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3czsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqIEdldCB0YXJnZXQgZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4Ci0JICogQHJldHVybiBlbGVtZW50Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoaW50IGluZGV4KTsKLQkvKiogR2V0IGluZGV4IG9mIGxlZnQgaGFuZCBlbGVtZW50Ci0JICogQHBhcmFtIG9iaiBUYXJnZXQgZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4Ci0JICogQHJldHVybiBlbGVtZW50IElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdWxlckluZGV4KE9iamVjdCBvYmosIGludCBpbmRleCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9JSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODQ1YjguLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9JSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzOwotCi0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1BZX0FDVElPTiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VUX0FDVElPTiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTVEVfQUNUSU9OID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEVfQUNUSU9OID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEVfQ0xJQ0tfQUNUSU9OID0gNTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9BQ1RJT04gPSA2OwotCQotCS8qKiBIYW5kbGUgYWN0aW9uCi0JICogQHBhcmFtIHR5cGUgYWN0aW9uIHR5cGUKLQkgKiBAcGFyYW0gaW5kZXhlcyBlbGVtZW50IGluZGV4ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVBY3Rpb24oaW50IHR5cGUsIGludFtdIGluZGV4ZXMpOwotCS8qKkhhbmRsZSBhY3Rpb24KLQkgKiBAcGFyYW0gdHlwZSBhY3Rpb24gdHlwZQotCSAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlQWN0aW9uKGludCB0eXBlLCBpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9JSW1hZ2VQcm92aWRlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9JSW1hZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWYwZjgzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvSUltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUltYWdlUHJvdmlkZXIgewotCS8qKiBHZXQgaWNvbiBzdGF0dXMKLQkgKiBAcGFyYW0gb2JqIFRhcmdldCBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4IFRhZ3JldCBpbmRleCBwb3NpdGlvbgotCSAqIEBwYXJhbSBpc1NlbGVjdGVkIHdoZXRoZXIgaXQgaXMgc2VsZWN0ZWQgb3Igbm90Ci0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTdGF0dXNJY29uKE9iamVjdCBvYmosIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkKTsKLQkvKiogRHJhdyBzcGVjaWFsIG9uIHRoZSBpbWFnZQotCSAqIEBwYXJhbSBvYmogVGFyZ2V0IGVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXggVGFncmV0IGluZGV4IHBvc2l0aW9uCi0JICogQHBhcmFtIGdjIEdDCi0JICogQHBhcmFtIHhfbG9jIHggY29vcmRpbmF0ZQotCSAqIEBwYXJhbSB5X2xvYyB5IGNvcnJkaW5hdGUKLQkgKiBAcGFyYW0gd2lkdGggaW1hZ2Ugc2l6ZQotCSAqIEBwYXJhbSBoZWlnaHQgaW1hZ2UgaGVpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgZHJhd1NwZWNpYWwoT2JqZWN0IG9iaiwgaW50IGluZGV4LCBHQyBnYywgaW50IHhfbG9jLCBpbnQgeV9sb2MsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0lUb29sVGlwUHJvdmlkZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvSVRvb2xUaXBQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ2MTRhLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvSVRvb2xUaXBQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3czsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9vbFRpcFByb3ZpZGVyIHsKLQlwdWJsaWMgZmluYWwgU3RyaW5nW10gTk9fVE9PTFRJUCA9IG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0JLyoqIEdldCB0b29sdGlwIGNvbnRlbnQKLQkgKiBAcGFyYW0gb2JqIFNlbGVjdGVkIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGNvbnRlbnQgb2YgdG9vbHRpcAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSB0b29sVGlwVGV4dChPYmplY3Qgb2JqKTsKLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoT2JqZWN0IG9iaiwgU3RyaW5nIGNvbnRlbnQpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9JY29uQ2FudmFzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0ljb25DYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0NzhmMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0ljb25DYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmhvdmVyLkljb25Ib3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuaG92ZXIuSUljb25JbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSWNvbkNhbnZhcyBleHRlbmRzIENhbnZhcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0UgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNXID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOVyA9IDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTkUgPSA0OwotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgYWN0aW9uTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByb3RlY3RlZCBJVG9vbFRpcFByb3ZpZGVyIHRvb2xUaXBQcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIElJbWFnZVByb3ZpZGVyIGltYWdlUHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JLy8gZGVmYXVsdCBlbGVtZW50IGluZm8KLQlwcm90ZWN0ZWQgaW50IGVfb2Zmc2V0X3ggPSA1OwotCXByb3RlY3RlZCBpbnQgZV9vZmZzZXRfeSA9IDU7Ci0JcHJvdGVjdGVkIGludCBlX3NwYWNpbmdfeCA9IDQ7Ci0JcHJvdGVjdGVkIGludCBlX3NwYWNpbmdfeSA9IDQ7Ci0JcHJvdGVjdGVkIGludCBlX3dpZHRoID0gMTY7Ci0JcHJvdGVjdGVkIGludCBlX2hlaWdodCA9IDE2OwotCXByb3RlY3RlZCBpbnQgbWF4X2Vfcm93ID0gLTE7Ci0JcHJvdGVjdGVkIGludCBtYXhfZV9jb2wgPSAtMTsKLQkvLyBrZXkgYW5kIGxpc3RlbmVyCi0JcHJvdGVjdGVkIEhhc2h0YWJsZTxJbnRlZ2VyLCBJbnRlZ2VyPiBrZXlBY3Rpb25NYXAgPSBuZXcgSGFzaHRhYmxlPEludGVnZXIsIEludGVnZXI+KCk7Ci0JcHJvdGVjdGVkIExpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3VzZURvd24gPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3VzZURvdWJsZUNsaWNrID0gZmFsc2U7Ci0JLy8gc2Nyb2xsaW5nIGFuZCBzZWxlY3Rpb24KLQlwcm90ZWN0ZWQgaW50IGZpcnN0U2VsZWN0ZWRJbmRleCA9IC0xOwotCXByb3RlY3RlZCBpbnQgc2Vjb25kU2VsZWN0ZWRJbmRleCA9IC0xOyAvL2ZvciBtYWMJCi0JcHJvdGVjdGVkIEJpdFNldCBzZWxlY3RlZEVsZW1lbnRzID0gbmV3IEJpdFNldCgpOwotCXByb3RlY3RlZCBCaXRTZXQgdGVtcFNlbGVjdGVkRWxlbWVudHMgPSBuZXcgQml0U2V0KCk7Ci0JcHJvdGVjdGVkIGludCBzZWxfc2l6ZSA9IDE7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBzZWxfbGVuZ3RoID0gMjsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHNlbF9nYXAgPSAyOwotCXByb3RlY3RlZCBDb2xvciBzZWxfY29sb3IgPSBudWxsOwotCXByb3RlY3RlZCBQb2ludCBzZWxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBQb2ludCBtb3ZpbmdTZWxlY3Rpb25TdGFydCA9IG51bGw7Ci0JcHJvdGVjdGVkIFBvaW50IG1vdmluZ1NlbGVjdGlvbkVuZCA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjdXJyZW50X3RvcF9yb3cgPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGFjdHVhbFNjcm9sbFN0YXJ0X3kgPSAwOwotCXByb3RlY3RlZCBpbnQgYXV0b1Njcm9sbERpcmVjdGlvbiA9IFNXVC5OVUxMOwotCXByb3RlY3RlZCBpbnQgdmVydGljYWxTY3JvbGxPZmZzZXQgPSAwOwotCS8vIG1vdXNlIGFuZCBjb2xvcgotCXByb3RlY3RlZCBDdXJzb3IgZGVmYXVsdEN1cnNvciA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmQgPSBudWxsOwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kID0gbnVsbDsKLQkvL2ZvbnQKLQlwcm90ZWN0ZWQgZmluYWwgaW50IERFRkFVTFRfRk9OVF9TSVpFID0gOTsKLQlwcm90ZWN0ZWQgaW50IGZvbnRfc2l6ZSA9IERFRkFVTFRfRk9OVF9TSVpFOwotCS8vbWFyZ2luCi0JcHJvdGVjdGVkIGZpbmFsIGludCBtYXJnaW5fdGV4dCA9IDI7Ci0JcHJvdGVjdGVkIENvbG9yIG1hcmdpbl9jb2xvciA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheVJ1bGVyID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX09GRlNFVCA9IDU7Ci0JLy8gdG9vbHRpcAotCXByaXZhdGUgSWNvbkhvdmVyIGljb25Ib3ZlciA9IG5ldyBJY29uSG92ZXIoKTsKLQlwcm90ZWN0ZWQgSUljb25JbmZvcm1hdGlvbkNvbnRyb2wgZkluZm9ybWF0aW9uQ29udHJvbCA9IG51bGw7IAotCXByb3RlY3RlZCBsb25nIHRvb2x0aXBfdGltZW91dCA9IDEwMDAwOwotCXByb3RlY3RlZCBib29sZWFuIHNob3dfdG9vbHRpcF9hbGx0aGV0aW1lID0gZmFsc2U7Ci0JcHJpdmF0ZSBUaW1lciBob3ZlclRpbWVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0b29sdGlwX3dyYXAgPSB0cnVlOyAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93X3Rvb2x0aXAgPSB0cnVlOwotCQotCS8vIGlucHV0Ci0JcHJvdGVjdGVkIGludCB0b3RhbF9lbGVtZW50cyA9IDA7Ci0JZmluYWwgc3RhdGljIGJvb2xlYW4gSVNfQ0FSQk9OLCBJU19HVEssIElTX01PVElGOwotCWZpbmFsIHN0YXRpYyBib29sZWFuIERPVUJMRV9CVUZGRVI7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCUlTX0NBUkJPTiA9ICJjYXJib24iLmVxdWFscyhwbGF0Zm9ybSk7Ci0JCUlTX0dUSyA9ICJndGsiLmVxdWFscyhwbGF0Zm9ybSk7Ci0JCUlTX01PVElGID0gIm1vdGlmIi5lcXVhbHMocGxhdGZvcm0pOwotCQlET1VCTEVfQlVGRkVSID0gIUlTX0NBUkJPTjsKLQl9Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlIGNvbXBvc2l0ZSBzdHlsZQotCSAqLwotCXB1YmxpYyBJY29uQ2FudmFzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgc3R5bGUpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCWNhbGN1bGF0ZVZlcnRpY2FsU2Nyb2xsQmFyKCk7Ci0JCWNyZWF0ZUtleUJpbmRpbmdzKCk7Ci0JCWRlZmF1bHRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQVJST1cpOwotCQlzZXRDdXJzb3IoZGVmYXVsdEN1cnNvcik7Ci0JCWluc3RhbGxMaXN0ZW5lcnMoKTsKLQkJaW5pdGlhbGl6ZUFjY2Vzc2libGUoKTsKLQkJc2VsX2NvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJbWFyZ2luX2NvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotCi0JCWNoYW5nZUZvbnRTaXplKGRpc3BsYXkpOwotCQlzdXBlci5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JCXN1cGVyLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmSW5mb3JtYXRpb25Db250cm9sICE9IG51bGwpIHsKLQkJCWZJbmZvcm1hdGlvbkNvbnRyb2wuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JLyoqIENoYW5nZSBmb250IHNpemUKLQkgKiBAcGFyYW0gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VGb250U2l6ZShEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgRm9udERhdGFbXSBkYXRhID0gZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZGF0YVtpXS5zZXRIZWlnaHQoZm9udF9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBzZXRGb250KG5ldyBGb250KGRpc3BsYXksIGRhdGEpKTsKLQl9Ci0JCi0JLyoqIEFkZCBhY3Rpb24gbGlzdGVuZXIKLQkgKiBAcGFyYW0gYWN0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25MaXN0ZW5lcihJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyIGFjdGlvbkxpc3RlbmVyKSB7Ci0JCWFjdGlvbkxpc3RlbmVycy5hZGQoYWN0aW9uTGlzdGVuZXIpOwotCX0KLQkvKiogUmVtb3ZlIGFjdGlvbiBsaXN0ZW5lcgotCSAqIEBwYXJhbSBhY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFjdGlvbkxpc3RlbmVyKElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIgYWN0aW9uTGlzdGVuZXIpIHsKLQkJYWN0aW9uTGlzdGVuZXJzLnJlbW92ZShhY3Rpb25MaXN0ZW5lcik7Ci0JfQotCS8qKiBGaXJlIGFjdGlvbgotCSAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFjdGlvbihmaW5hbCBpbnQgdHlwZSkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IGFjdGlvbkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lciBsID0gKElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIpIGFycmF5W2ldOwotICAgICAgICAgICAgU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5oYW5kbGVBY3Rpb24odHlwZSwgZ2V0U2VsZWN0ZWRJbmRleGVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0JfQotCS8qKiBGaXJlIGFjdGlvbgotCSAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgYWN0aW9uCi0JICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQWN0aW9uKGZpbmFsIGludCB0eXBlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkgICAgICAgIE9iamVjdFtdIGFycmF5ID0gYWN0aW9uTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCSAgICAgICAgICAgIGZpbmFsIElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIgbCA9IChJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyKSBhcnJheVtpXTsKLQkgICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAgICAgICAgICAgICAgICAgIGwuaGFuZGxlQWN0aW9uKHR5cGUsIGluZGV4KTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0pOwotCSAgICAgICAgfQotCQl9Ci0JfQotCS8qKiBSZXNldCBjYW52YXMgc2V0dGluZwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0Q2FudmFzKCkgewotCQljaGVja1dpZGdldCgpOwotCQljdXJyZW50X3RvcF9yb3cgPSAtMTsKLQkJYWN0dWFsU2Nyb2xsU3RhcnRfeSA9IDA7Ci0JCWF1dG9TY3JvbGxEaXJlY3Rpb24gPSBTV1QuTlVMTDsKLQkJdmVydGljYWxTY3JvbGxPZmZzZXQgPSAwOwotCQl1bnNlbGVjdEFsbEVsZW1lbnRzKCk7Ci0JCWZpcnN0U2VsZWN0ZWRJbmRleCA9IC0xOwotCQlzZWNvbmRTZWxlY3RlZEluZGV4ID0gLTE7Ci0JCXNlbGVjdGlvbiA9IG51bGw7Ci0JCXJlc2V0TWFyZ2luKCk7Ci0JCXJlc2V0SW5mbygpOwotCQlnZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJY2FsY3VsYXRlVmVydGljYWxTY3JvbGxCYXIoKTsKLQkJcmVkcmF3KCk7Ci0JfQotCS8qKiBHZXQgdG9vbHRpcCBwcm92aWRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVRvb2xUaXBQcm92aWRlciBnZXRUb29sVGlwUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0b29sVGlwUHJvdmlkZXI7Ci0JfQotCS8qKiBTZXQgdG9vbHRpcCBwcm92aWRlcgotCSAqIEBwYXJhbSB0b29sVGlwUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwUHJvdmlkZXIoSVRvb2xUaXBQcm92aWRlciB0b29sVGlwUHJvdmlkZXIpIHsKLQkJdGhpcy50b29sVGlwUHJvdmlkZXIgPSB0b29sVGlwUHJvdmlkZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNob3dUb29sdGlwKGJvb2xlYW4gc2hvdykgewotCQl0aGlzLnNob3dfdG9vbHRpcCA9IHNob3c7Ci0JfQotCS8qKiBHZXQgaW1hZ2UgcHJvdmlkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElJbWFnZVByb3ZpZGVyIGdldEltYWdlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBpbWFnZVByb3ZpZGVyOwotCX0KLQkvKiogU2V0IGltYWdlIHByb3ZpZGVyCi0JICogQHBhcmFtIGltYWdlUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZVByb3ZpZGVyKElJbWFnZVByb3ZpZGVyIGltYWdlUHJvdmlkZXIpIHsKLQkJdGhpcy5pbWFnZVByb3ZpZGVyID0gaW1hZ2VQcm92aWRlcjsKLQl9Ci0JLyoqIEdldCBjb250ZW50IHByb3ZpZGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci0JLyoqIFNldCBjb250ZW50IHByb3ZpZGVyCi0JICogQHBhcmFtIGNvbnRlbnRQcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQl9Ci0JLyoqIEdldCB0b3RsYSBlbGVtZW50cwotCSAqIEBwYXJhbSB0b3RhbCB0b3RhbCBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvdGFsKGludCB0b3RhbCkgewotCQlpZiAodG90YWwgPCAwKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCQl9Ci0JCXRoaXMudG90YWxfZWxlbWVudHMgPSB0b3RhbDsKLQkJcmVzZXRDYW52YXMoKTsKLQl9Ci0JLyoqIFJlc2V0IG1hcmdpbiBvZiB2aWV3Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0TWFyZ2luKCkgewotCQllX29mZnNldF94ID0gREVGQVVMVF9PRkZTRVQ7Ci0JCWlmIChpc0Rpc3BsYXlSdWxlcigpKSB7Ci0JCQlHQyBuZXdHQyA9IGdldEdDKCk7Ci0JCQluZXdHQy5zZXRGb250KGdldEZvbnQoKSk7Ci0JCQlpZiAodG90YWxfZWxlbWVudHMgPiAwKSB7Ci0JCQkJLy9HZXQgdGhlIGxhc3QgaW5kZXggbnVtYmVyIHRvIGRldGVybWluZSB0aGUgd2lkdGggb2YgcnVsZXIgYmFyCi0JCQkJT2JqZWN0IG9iaiA9IGNvbnRlbnRQcm92aWRlci5nZXRPYmplY3QodG90YWxfZWxlbWVudHMtMSk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gY29udGVudFByb3ZpZGVyLmdldFJ1bGVySW5kZXgob2JqLCB0b3RhbF9lbGVtZW50cy0xKTsKLQkJCQkJZV9vZmZzZXRfeCA9IG5ld0dDLnN0cmluZ0V4dGVudCh0ZXh0KS54ICsgZV9zcGFjaW5nX3ggKyBtYXJnaW5fdGV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdHQy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0Rm9udFNpemVTbWFsbGVyKCkgewotCQlzZXRGb250U2l6ZShmb250X3NpemUtMSk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplQmlnZ2VyKCkgewotCQlzZXRGb250U2l6ZShmb250X3NpemUrMSk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplKGludCBmb250U2l6ZSkgewotCQlpZiAoZm9udFNpemUgPCA1KSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCQl9Ci0JCXRoaXMuZm9udF9zaXplID0gZm9udFNpemU7Ci0JCWNoYW5nZUZvbnRTaXplKGdldERpc3BsYXkoKSk7Ci0JfQotCS8qKiBTZXQgaWNvbiBzcGFjaW5nCi0JICogQHBhcmFtIGVfc3BhY2luZ194Ci0JICogQHBhcmFtIGVfc3BhY2luZ195Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvblNwYWNlKGludCBlX3NwYWNpbmdfeCwgaW50IGVfc3BhY2luZ195KSB7Ci0JCWlmIChlX3NwYWNpbmdfeCA8IDAgfHwgZV9zcGFjaW5nX3kgPCAwKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCQl9Ci0JCXRoaXMuZV9zcGFjaW5nX3ggPSBlX3NwYWNpbmdfeDsKLQkJdGhpcy5lX3NwYWNpbmdfeSA9IGVfc3BhY2luZ195OwotCX0KLQkvKiogU2V0IGljb24gc2l6ZQotCSAqIEBwYXJhbSBlX3dpZHRoCi0JICogQHBhcmFtIGVfaGVpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvblNpemUoaW50IGVfd2lkdGgsIGludCBlX2hlaWdodCkgewotCQlpZiAoZV93aWR0aCA8PSAwIHx8IGVfaGVpZ2h0IDw9IDApIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JCX0KLQkJdGhpcy5lX2hlaWdodCA9IGVfaGVpZ2h0OwotCQl0aGlzLmVfd2lkdGggPSBlX3dpZHRoOwotCX0KLQkvKiogU2V0IHRvb2x0aXAgc2V0dGluZwotCSAqIEBwYXJhbSBzaG93QWxsVGltZQotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHBhcmFtIGlzV3JhcAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2x0aXAoYm9vbGVhbiBzaG93QWxsVGltZSwgbG9uZyB0aW1lb3V0LCBib29sZWFuIGlzV3JhcCkgewotCQlzaG93VG9vbHRpcEFsbHRoZXRpbWUoc2hvd0FsbFRpbWUpOwotCQlzZXRUb29sdGlwVGltZW91dCh0aW1lb3V0KTsKLQkJc2V0VG9vbHRpcFdyYXAoaXNXcmFwKTsKLQl9Ci0JLyoqIFNldCB0b29sdGlwIHRpbWVvdXQKLQkgKiBAcGFyYW0gdGltZW91dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2x0aXBUaW1lb3V0KGxvbmcgdGltZW91dCkgewotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCQl9Ci0JCXRvb2x0aXBfdGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCS8qKiBTZXQgdG9vbHRpcCB0byBzaG93IGFsbCB0aGUgdGltZQotCSAqIEBwYXJhbSBpc0FsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dUb29sdGlwQWxsdGhldGltZShib29sZWFuIGlzQWxsKSB7Ci0JCXNob3dfdG9vbHRpcF9hbGx0aGV0aW1lID0gaXNBbGw7Ci0JfQotCS8qKiBTZXQgdG9vbHRpcCBjb250ZW50IGRpc3BsYXlpbmcKLQkgKiBAcGFyYW0gaXNXcmFwCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbHRpcFdyYXAoYm9vbGVhbiBpc1dyYXApIHsKLQkJdG9vbHRpcF93cmFwID0gaXNXcmFwOwotCX0KLQkvKiogR2V0IHRvdGFsIGVsZW1lbnRzCi0JICogQHJldHVybiB0b3RhbCBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VG90YWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRvdGFsX2VsZW1lbnRzOwotCX0KLQkvKiogU2V0IHNlbGVjdGlvbiBzaXplCi0JICogQHBhcmFtIHNpemUgCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uU2l6ZShpbnQgc2l6ZSkgewotCQl0aGlzLnNlbF9zaXplID0gc2l6ZTsKLQl9Ci0JLyoqIFNldCBzZWxlY3Rpb24gY29sb3IKLQkgKiBAcGFyYW0gY29sb3JJbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkNvbG9yKGludCBjb2xvckluZGV4KSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCXRoaXMuc2VsX2NvbG9yID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKGNvbG9ySW5kZXgpOwotCX0KLQkvKipTaG93IHJ1bGVyCi0JICogQHBhcmFtIGRpc3BsYXlSdWxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlSdWxlcihib29sZWFuIGRpc3BsYXlSdWxlcikgewotCQl0aGlzLmRpc3BsYXlSdWxlciA9IGRpc3BsYXlSdWxlcjsKLQkJcmVzZXRDYW52YXMoKTsKLQl9Ci0JLyoqIElzIHJ1bGVyIGRpc3BsYXllZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3BsYXlSdWxlcigpIHsKLQkJcmV0dXJuIGRpc3BsYXlSdWxlcjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCNnZXRCYWNrZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZCgpIHsKLQkJY2hlY2tXaWRnZXQoKTsKLQkJaWYgKGJhY2tncm91bmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJfQotCQlyZXR1cm4gYmFja2dyb3VuZDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCNzZXRCYWNrZ3JvdW5kKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCWJhY2tncm91bmQgPSBjb2xvcjsKLQkJc3VwZXIuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQlyZWRyYXcoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCNnZXRGb3JlZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKLQkJY2hlY2tXaWRnZXQoKTsKLQkJaWYgKGZvcmVncm91bmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkJfQotCQlyZXR1cm4gZm9yZWdyb3VuZDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCNzZXRGb3JlZ3JvdW5kKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCWZvcmVncm91bmQgPSBjb2xvcjsKLQkJc3VwZXIuc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOwotCQlyZWRyYXcoKTsKLQl9Ci0JLyoqIEdldCBlbGVtZW50IGhlaWdodAotCSAqIEByZXR1cm4gZWxlbWVudCBoZWlnaHQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEVsZW1lbnRIZWlnaHQoKSB7Ci0JCXJldHVybiAoZV9zcGFjaW5nX3kgKyBlX2hlaWdodCk7Ci0JfQotCS8qKiBHZXQgZWxlbWVudCB3aWR0aAotCSAqIEByZXR1cm4gZWxlbWVudCB3aWR0aAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RWxlbWVudFdpZHRoKCkgewotCQlyZXR1cm4gKGVfc3BhY2luZ194ICsgZV93aWR0aCk7Ci0JfQotCS8qKiBHZXQgbWF4aW11bSBjb2x1bW4gdG8gZGlzcGxheQotCSAqIEByZXR1cm4gbWF4aW11bSBjb2x1bW4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1heENvbCgpIHsKLQkJaWYgKG1heF9lX2NvbCA9PSAtMSkgewotCQkJaW50IHdpZHRoID0gZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCkueDsKLQkJCW1heF9lX2NvbCA9IE1hdGgubWF4KDAsICh3aWR0aCAtIGVfb2Zmc2V0X3gpIC8gZ2V0RWxlbWVudFdpZHRoKCkgKyAxKTsKLQkJfQotCQlyZXR1cm4gbWF4X2VfY29sOwotCX0KLQkvKiogR2V0IG1heGltdW0gY2xpZW50IHJvdyAKLQkgKiBAcmV0dXJuIG1heGltdW0gcm93IG51bWJlcgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWF4Q2xpZW50Um93KCkgewotCQlyZXR1cm4gKGdldENsaWVudEFyZWEoKS5oZWlnaHQgLSBlX29mZnNldF95KSAvIGdldEVsZW1lbnRIZWlnaHQoKTsKLQl9Ci0JLyoqIEdldCBtYXhpbXVtIHJvdwotCSAqIEByZXR1cm4gbWF4aW11bSByb3cKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1heFJvdygpIHsKLQkJaWYgKG1heF9lX3JvdyA9PSAtMSkgewotCQkJaW50IHRvdGFsID0gZ2V0VG90YWxFbGVtZW50cygpOwotCQkJaWYgKHRvdGFsID09IDApCi0JCQkJcmV0dXJuIDA7Ci0JCQlpbnQgbWF4X2NvbCA9IGdldE1heENvbCgpOwotCQkJaWYgKG1heF9jb2wgPT0gMCkKLQkJCQlyZXR1cm4gMDsKLQkJCWludCBtYXhfcm93ID0gdG90YWwgLyBtYXhfY29sOwotCQkJbWF4X2Vfcm93ID0gdG90YWwgJSBtYXhfY29sID09IDAgPyBtYXhfcm93IDogbWF4X3JvdyArIDE7Ci0JCX0KLQkJcmV0dXJuIG1heF9lX3JvdzsKLQl9Ci0JLyoqIEdldCBtYXhpbXVtIGhlaWdodCBvZiB2aWV3Ci0JICogQHJldHVybiBtYXhpbXVtIGhlaWdodAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWF4SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0TWF4Um93KCkgKiBnZXRFbGVtZW50SGVpZ2h0KCk7Ci0JfQotCS8qKiBHZXQgdmVydGljYWwgaW5jcmVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmVydGljYWxJbmNyZW1lbnQoKSB7Ci0JCXJldHVybiBlX3NwYWNpbmdfeSArIGVfaGVpZ2h0OwotCX0KLQkvKiogQ2FsY3VsYXRlIHZlcnRpY2FsIHNjcm9sbGJhciAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYWxjdWxhdGVWZXJ0aWNhbFNjcm9sbEJhcigpIHsKLQkJc2V0VmVydGljYWxTY3JvbGxCYXIoZ2V0VmVydGljYWxCYXIoKSk7Ci0JfQotCS8qKiBTZXQgdmVydGljYWwgc2Nyb2xsYmFyCi0JICogQHBhcmFtIHZlcnRpY2FsQmFyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmVydGljYWxTY3JvbGxCYXIoU2Nyb2xsQmFyIHZlcnRpY2FsQmFyKSB7Ci0JCWlmICh2ZXJ0aWNhbEJhciAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJCWZpbmFsIGludCBJTkFDVElWRSA9IDE7Ci0JCQlpbnQgbWF4X2hlaWdodCA9IGdldE1heEhlaWdodCgpICsgZV9vZmZzZXRfeSArIHNlbF9zaXplOwotCQkJaWYgKGNsaWVudEFyZWEuaGVpZ2h0IDwgbWF4X2hlaWdodCkgewotCQkJCXZlcnRpY2FsQmFyLnNldFZhbHVlcyh2ZXJ0aWNhbEJhci5nZXRTZWxlY3Rpb24oKSwgdmVydGljYWxCYXIuZ2V0TWluaW11bSgpLCBtYXhfaGVpZ2h0LCBjbGllbnRBcmVhLmhlaWdodCwgZ2V0VmVydGljYWxJbmNyZW1lbnQoKSwgY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJfSBlbHNlIGlmICh2ZXJ0aWNhbEJhci5nZXRUaHVtYigpICE9IElOQUNUSVZFIHx8IHZlcnRpY2FsQmFyLmdldE1heGltdW0oKSAhPSBJTkFDVElWRSkgewotCQkJCXZlcnRpY2FsQmFyLnNldFZhbHVlcyh2ZXJ0aWNhbEJhci5nZXRTZWxlY3Rpb24oKSwgdmVydGljYWxCYXIuZ2V0TWluaW11bSgpLCBJTkFDVElWRSwgSU5BQ1RJVkUsIGdldFZlcnRpY2FsSW5jcmVtZW50KCksIElOQUNUSVZFKTsKLQkJCX0KLQkJfQotCX0KLQkvKiogQ2xhaW0gYm90dG9tIGZyZWUgc3BhY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xhaW1Cb3R0b21GcmVlU3BhY2UoKSB7Ci0JCWludCBuZXdWZXJ0aWNhbE9mZnNldCA9IE1hdGgubWF4KDAsIGdldE1heEhlaWdodCgpIC0gZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCWlmIChuZXdWZXJ0aWNhbE9mZnNldCA8IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSB7Ci0JCQlyZXR1cm4gc2V0VmVydGljYWxTY3JvbGxPZmZzZXQobmV3VmVydGljYWxPZmZzZXQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqIEdldCBjdXJyZW50IHRvcCByb3cKLQkgKiBAcmV0dXJuIHRvcCByb3cgbnVtYmVyCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRDdXJyZW50VG9wUm93KCkgewotCQlyZXR1cm4gY3VycmVudF90b3Bfcm93OwotCX0KLQkvKiogR2V0IGtleSAKLQkgKiBAcGFyYW0ga2V5IHVuaXF1ZSBrZXkKLQkgKiBAcmV0dXJuIGtleWJvYXJkIGtleSBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5QmluZGluZyhpbnQga2V5KSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCUludGVnZXIgYWN0aW9uID0ga2V5QWN0aW9uTWFwLmdldChuZXcgSW50ZWdlcihrZXkpKTsKLQkJaW50IGludEFjdGlvbjsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0JCQlpbnRBY3Rpb24gPSBTV1QuTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWludEFjdGlvbiA9IGFjdGlvbi5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBpbnRBY3Rpb247Ci0JfQotCS8qKiBTZXQga2V5Ci0JICogQHBhcmFtIGtleSB1bmlxdWUga2V5Ci0JICogQHBhcmFtIGFjdGlvbiBrZXlib2FyZCBrZXkgSUQgCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5QmluZGluZyhpbnQga2V5LCBpbnQgYWN0aW9uKSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCWludCBrZXlWYWx1ZSA9IGtleSAmIFNXVC5LRVlfTUFTSzsKLQkJaW50IG1vZGlmaWVyVmFsdWUgPSBrZXkgJiBTV1QuTU9ESUZJRVJfTUFTSzsKLQkJY2hhciBrZXlDaGFyID0gKGNoYXIpIGtleVZhbHVlOwotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGtleUNoYXIpKSB7Ci0JCQljaGFyIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGtleUNoYXIpOwotCQkJaW50IG5ld0tleSA9IGNoIHwgbW9kaWZpZXJWYWx1ZTsKLQkJCWlmIChhY3Rpb24gPT0gU1dULk5VTEwpIHsKLQkJCQlrZXlBY3Rpb25NYXAucmVtb3ZlKG5ldyBJbnRlZ2VyKG5ld0tleSkpOwotCQkJfSBlbHNlIHsKLQkJCQlrZXlBY3Rpb25NYXAucHV0KG5ldyBJbnRlZ2VyKG5ld0tleSksIG5ldyBJbnRlZ2VyKGFjdGlvbikpOwotCQkJfQotCQkJY2ggPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoa2V5Q2hhcik7Ci0JCQluZXdLZXkgPSBjaCB8IG1vZGlmaWVyVmFsdWU7Ci0JCQlpZiAoYWN0aW9uID09IFNXVC5OVUxMKSB7Ci0JCQkJa2V5QWN0aW9uTWFwLnJlbW92ZShuZXcgSW50ZWdlcihuZXdLZXkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJa2V5QWN0aW9uTWFwLnB1dChuZXcgSW50ZWdlcihuZXdLZXkpLCBuZXcgSW50ZWdlcihhY3Rpb24pKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChhY3Rpb24gPT0gU1dULk5VTEwpIHsKLQkJCQlrZXlBY3Rpb25NYXAucmVtb3ZlKG5ldyBJbnRlZ2VyKGtleSkpOwotCQkJfSBlbHNlIHsKLQkJCQlrZXlBY3Rpb25NYXAucHV0KG5ldyBJbnRlZ2VyKGtleSksIG5ldyBJbnRlZ2VyKGFjdGlvbikpOwotCQkJfQotCQl9Ci0JfQotCS8qKiBDcmVhdGUga2V5Ym9hcmQgYmluZGluZwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUtleUJpbmRpbmdzKCkgewotCQkvLyBOYXZpZ2F0aW9uCi0JCXNldEtleUJpbmRpbmcoU1dULkFSUk9XX1VQLCBTVC5MSU5FX1VQKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuQVJST1dfRE9XTiwgU1QuTElORV9ET1dOKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuQVJST1dfTEVGVCwgU1QuQ09MVU1OX1BSRVZJT1VTKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuQVJST1dfUklHSFQsIFNULkNPTFVNTl9ORVhUKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuSE9NRSwgU1QuTElORV9TVEFSVCk7Ci0JCXNldEtleUJpbmRpbmcoU1dULkVORCwgU1QuTElORV9FTkQpOwotCQlzZXRLZXlCaW5kaW5nKFNXVC5QQUdFX1VQLCBTVC5QQUdFX1VQKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuUEFHRV9ET1dOLCBTVC5QQUdFX0RPV04pOwotCQkvLyBTZWxlY3Rpb24KLQkJc2V0S2V5QmluZGluZygnQScgfCBTV1QuTU9EMSwgU1QuU0VMRUNUX0FMTCk7Ci0JCXNldEtleUJpbmRpbmcoU1dULkFSUk9XX1VQIHwgU1dULk1PRDIsIFNULlNFTEVDVF9MSU5FX1VQKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuQVJST1dfRE9XTiB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfTElORV9ET1dOKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuQVJST1dfTEVGVCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfQ09MVU1OX1BSRVZJT1VTKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuQVJST1dfUklHSFQgfCBTV1QuTU9EMiwgU1QuU0VMRUNUX0NPTFVNTl9ORVhUKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuSE9NRSB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfTElORV9TVEFSVCk7Ci0JCXNldEtleUJpbmRpbmcoU1dULkVORCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfTElORV9FTkQpOwotCQlzZXRLZXlCaW5kaW5nKFNXVC5QQUdFX1VQIHwgU1dULk1PRDIsIFNULlNFTEVDVF9QQUdFX1VQKTsKLQkJc2V0S2V5QmluZGluZyhTV1QuUEFHRV9ET1dOIHwgU1dULk1PRDIsIFNULlNFTEVDVF9QQUdFX0RPV04pOwotCQkvLyBNb2RpZmljYXRpb24KLQkJLy8gQ3V0LCBDb3B5LCBQYXN0ZSwgZGVsZXRlCi0JCXNldEtleUJpbmRpbmcoJ1gnIHwgU1dULk1PRDEsIFNULkNVVCk7Ci0JCXNldEtleUJpbmRpbmcoJ0MnIHwgU1dULk1PRDEsIFNULkNPUFkpOwotCQlzZXRLZXlCaW5kaW5nKCdWJyB8IFNXVC5NT0QxLCBTVC5QQVNURSk7Ci0JCXNldEtleUJpbmRpbmcoU1dULkJTLCBTVC5ERUxFVEVfUFJFVklPVVMpOwotCQlzZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNULkRFTEVURV9ORVhUKTsKLQl9Ci0JLyoqIEludm9rZSBhY3Rpb24KLQkgKiBAcGFyYW0gYWN0aW9uIGFjdGlvbiBJRAotCSAqLwotCXB1YmxpYyB2b2lkIGludm9rZUFjdGlvbihpbnQgYWN0aW9uKSB7Ci0JCWNoZWNrV2lkZ2V0KCk7Ci0JCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCS8vIE5hdmlnYXRpb24KLQkJY2FzZSBTVC5MSU5FX1VQOgotCQkJZG9VcChmYWxzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5MSU5FX0RPV046Ci0JCQlkb0Rvd24oZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuQ09MVU1OX1BSRVZJT1VTOgotCQkJZG9QcmV2aW91cyhmYWxzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5DT0xVTU5fTkVYVDoKLQkJCWRvTmV4dChmYWxzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5MSU5FX1NUQVJUOgotCQkJZG9MaW5lU3RhcnQoZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuTElORV9FTkQ6Ci0JCQlkb0xpbmVFbmQoZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuUEFHRV9VUDoKLQkJCWRvUGFnZVVwKGdldE1heENsaWVudFJvdygpKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlBBR0VfRE9XTjoKLQkJCWRvUGFnZURvd24oZ2V0TWF4Q2xpZW50Um93KCkpOwotCQkJYnJlYWs7Ci0JCS8vIFNlbGVjdGlvbgotCQljYXNlIFNULlNFTEVDVF9BTEw6Ci0JCQlkb1NlbGVjdGlvbkFsbCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX0xJTkVfVVA6Ci0JCQlkb1VwKHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX0xJTkVfRE9XTjoKLQkJCWRvRG93bih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9DT0xVTU5fUFJFVklPVVM6Ci0JCQlkb1ByZXZpb3VzKHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX0NPTFVNTl9ORVhUOgotCQkJZG9OZXh0KHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX0xJTkVfU1RBUlQ6Ci0JCQlkb0xpbmVTdGFydCh0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9MSU5FX0VORDoKLQkJCWRvTGluZUVuZCh0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9QQUdFX1VQOgotCQkJZG9TZWxlY3Rpb25QYWdlVXAoZ2V0TWF4Q2xpZW50Um93KCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX1BBR0VfRE9XTjoKLQkJCWRvU2VsZWN0aW9uUGFnZURvd24oZ2V0TWF4Q2xpZW50Um93KCkpOwotCQkJYnJlYWs7Ci0JCS8vIE1vZGlmaWNhdGlvbgotCQljYXNlIFNULkNVVDoKLQkJCWRvQ3V0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5DT1BZOgotCQkJZG9Db3B5KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5QQVNURToKLQkJCWRvUGFzdGUoKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULkRFTEVURV9QUkVWSU9VUzoKLQkJCWRvRGVsZXRlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5ERUxFVEVfTkVYVDoKLQkJCWRvRGVsZXRlKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qKiBpbml0aWFsIGFjY2Vzc2lhYmxlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFjY2Vzc2libGUoKSB7Ci0JCWZpbmFsIEFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsKLQkJYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsKLQkJCX0KLQkJfSk7Ci0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQllLmRldGFpbCA9IEFDQy5ST0xFX1RFWFQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpbnQgc3RhdGUgPSAwOwotCQkJCWlmIChpc0VuYWJsZWQoKSkKLQkJCQkJc3RhdGUgfD0gQUNDLlNUQVRFX0ZPQ1VTQUJMRTsKLQkJCQlpZiAoaXNGb2N1c0NvbnRyb2woKSkKLQkJCQkJc3RhdGUgfD0gQUNDLlNUQVRFX0ZPQ1VTRUQ7Ci0JCQkJaWYgKGlzVmlzaWJsZSgpID09IGZhbHNlKQotCQkJCQlzdGF0ZSB8PSBBQ0MuU1RBVEVfSU5WSVNJQkxFOwotCQkJCWUuZGV0YWlsID0gc3RhdGU7Ci0JCQl9Ci0JCX0pOwotCQlhZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlhY2Nlc3NpYmxlLnNldEZvY3VzKEFDQy5DSElMRElEX1NFTEYpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyoqIGluc3RhbGwgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbExpc3RlbmVycygpIHsKLQkJU2Nyb2xsQmFyIHZlcnRpY2FsQmFyID0gZ2V0VmVydGljYWxCYXIoKTsKLQkJbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJCWhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCQloYW5kbGVLZXlEb3duKGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuS2V5VXA6Ci0JCQkJCWhhbmRsZUtleVVwKGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQloYW5kbGVNb3VzZURvd24oZXZlbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQloYW5kbGVNb3VzZVVwKGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3VibGVDbGljazoKLQkJCQkJaGFuZGxlTW91c2VEb3VibGVDbGljayhldmVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjoKLQkJCQkJaGFuZGxlTW91c2VIb3ZlcihldmVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlBhaW50OgotCQkJCQloYW5kbGVQYWludChldmVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCQkJaGFuZGxlUmVzaXplKGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRm9jdXNPdXQ6Ci0JCQkJCWhhbmRsZUZvY3VzT3V0KGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuS2V5VXAsIGxpc3RlbmVyKTsKLQkJYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0JCWFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgbGlzdGVuZXIpOwotCQlpZiAodmVydGljYWxCYXIgIT0gbnVsbCkgewotCQkJdmVydGljYWxCYXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KGdldFZlcnRpY2FsQmFyKCkuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCS8qKiBIYW5kbGUga2V5Ci0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5KEV2ZW50IGV2ZW50KSB7Ci0JCWludCBhY3Rpb247Ci0JCWlmIChldmVudC5rZXlDb2RlICE9IDApIHsKLQkJCWFjdGlvbiA9IGdldEtleUJpbmRpbmcoZXZlbnQua2V5Q29kZSB8IGV2ZW50LnN0YXRlTWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQlhY3Rpb24gPSBnZXRLZXlCaW5kaW5nKGV2ZW50LmNoYXJhY3RlciB8IGV2ZW50LnN0YXRlTWFzayk7Ci0JCQlpZiAoYWN0aW9uID09IFNXVC5OVUxMKSB7Ci0JCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMCAmJiAoZXZlbnQuY2hhcmFjdGVyID49IDApICYmIGV2ZW50LmNoYXJhY3RlciA8PSAzMSkgewotCQkJCQlpbnQgYyA9IGV2ZW50LmNoYXJhY3RlciArIDY0OwotCQkJCQlhY3Rpb24gPSBnZXRLZXlCaW5kaW5nKGMgfCBldmVudC5zdGF0ZU1hc2spOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYWN0aW9uICE9IFNXVC5OVUxMKSB7Ci0JCQlpbnZva2VBY3Rpb24oYWN0aW9uKTsKLQkJfQotCX0KLQkvKiogSXMgcmVhY2hlZCB0b3Agb2YgdmlldwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGlzIDAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWNoVG9wKCkgewotCQlyZXR1cm4gKHZlcnRpY2FsU2Nyb2xsT2Zmc2V0IDw9IDApOwotCX0KLQkvKiogSXMgcmVhY2ggYm90dG9tIG9mIHZpZXcKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmVydGljYWwgc2Nyb2xsIHRvIGJvdHRvbSBvZiB2aWV3Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFjaEJvdHRvbSgpIHsKLQkJcmV0dXJuIChnZXRNYXhSb3coKSAtIGN1cnJlbnRfdG9wX3JvdyA8PSBnZXRNYXhDbGllbnRSb3coKSk7Ci0JfQotCS8qKiBEbyBhdXRvIHNjcm9sbGluZwotCSAqIEBwYXJhbSB4X2xvYwotCSAqIEBwYXJhbSB5X2xvYwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQXV0b1Njcm9sbChpbnQgeF9sb2MsIGludCB5X2xvYykgewotCQlpZiAoeV9sb2MgPiBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0ICYmICFpc1JlYWNoQm90dG9tKCkpIHsKLQkJCWhpZGVUb29sVGlwKCk7Ci0JCQlkb0F1dG9TY3JvbGwoU1dULkRPV04sIGdldFZlcnRpY2FsSW5jcmVtZW50KCksIHhfbG9jLCB5X2xvYyk7Ci0JCX0gZWxzZSBpZiAoeV9sb2MgPCAwICYmICFpc1JlYWNoVG9wKCkpIHsKLQkJCWhpZGVUb29sVGlwKCk7Ci0JCQlkb0F1dG9TY3JvbGwoU1dULlVQLCAtZ2V0VmVydGljYWxJbmNyZW1lbnQoKSwgeF9sb2MsIHlfbG9jKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtb3ZpbmdTZWxlY3Rpb25TdGFydCA9PSBudWxsKSB7Ci0JCQkJbW92aW5nU2VsZWN0aW9uU3RhcnQgPSBuZXcgUG9pbnQoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9Nb3VzZVNlbGVjdGlvbihtb3ZpbmdTZWxlY3Rpb25TdGFydC54LCBtb3ZpbmdTZWxlY3Rpb25TdGFydC55LCB4X2xvYywgeV9sb2MsIGZhbHNlKTsKLQkJCX0KLQkJCWVuZEF1dG9TY3JvbGwoKTsKLQkJfQotCX0KLQkvKiogRG8gYXV0byBzY3JvbGxpbmcKLQkgKiBAcGFyYW0gZGlyZWN0aW9uIAotCSAqIEBwYXJhbSBkaXN0YW5jZQotCSAqIEBwYXJhbSB4X2xvYwotCSAqIEBwYXJhbSB5X2xvYwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQXV0b1Njcm9sbChpbnQgZGlyZWN0aW9uLCBmaW5hbCBpbnQgZGlzdGFuY2UsIGZpbmFsIGludCB4X2xvYywgZmluYWwgaW50IHlfbG9jKSB7Ci0JCS8vIElmIHdlJ3JlIGFscmVhZHkgYXV0b3Njcm9sbGluZyBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uIGRvIG5vdGhpbmcKLQkJaWYgKGF1dG9TY3JvbGxEaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUnVubmFibGUgdGltZXIgPSBudWxsOwotCQlmaW5hbCBpbnQgVElNRVJfSU5URVJWQUwgPSA1MDsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQlpZiAoZGlyZWN0aW9uID09IFNXVC5VUCkgewotCQkJdGltZXIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoYXV0b1Njcm9sbERpcmVjdGlvbiA9PSBTV1QuVVAgJiYgIWlzUmVhY2hUb3AoKSkgewotCQkJCQkJZG9TZWxlY3Rpb25QYWdlVXAoZGlzdGFuY2UsIHhfbG9jLCB5X2xvYywgdHJ1ZSk7Ci0JCQkJCQlkaXNwbGF5LnRpbWVyRXhlYyhUSU1FUl9JTlRFUlZBTCwgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTV1QuRE9XTikgewotCQkJdGltZXIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoYXV0b1Njcm9sbERpcmVjdGlvbiA9PSBTV1QuRE9XTiAmJiAhaXNSZWFjaEJvdHRvbSgpKSB7Ci0JCQkJCQlkb1NlbGVjdGlvblBhZ2VEb3duKGRpc3RhbmNlLCB4X2xvYywgeV9sb2MsIHRydWUpOwotCQkJCQkJZGlzcGxheS50aW1lckV4ZWMoVElNRVJfSU5URVJWQUwsIHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlpZiAodGltZXIgIT0gbnVsbCkgewotCQkJYXV0b1Njcm9sbERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQkJCWRpc3BsYXkudGltZXJFeGVjKFRJTUVSX0lOVEVSVkFMLCB0aW1lcik7Ci0JCX0KLQl9Ci0JLyoqIERvIHNlbGVjdGlvbiBwYWdlIHVwCi0JICogQHBhcmFtIGRpc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZWxlY3Rpb25QYWdlVXAoaW50IGRpc3RhbmNlKSB7Ci0JCWludCBpbmRleCA9IHNlbGVjdGlvbiA9PSBudWxsID8gLTEgOiBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oc2VsZWN0aW9uLngsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCWludCBtYXhfY29sID0gZ2V0TWF4Q29sKCk7Ci0JCQlpbnQgbWF4X3JvdyA9IGdldE1heENsaWVudFJvdygpIC0gMTsKLQkJCWludCB0b3RhbF9pbl9wYWdlID0gbWF4X2NvbCAqIG1heF9yb3c7Ci0JCQlpbnQgc3RhcnRfaW5kZXggPSBNYXRoLm1heCgwLCAoaW5kZXggLSB0b3RhbF9pbl9wYWdlKSk7Ci0JCQlhY3R1YWxTY3JvbGxTdGFydF95IC09IG1heF9yb3cgKiBnZXRFbGVtZW50SGVpZ2h0KCk7Ci0JCQlpZiAoYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0IDwgMCkgewotCQkJCWRvUGFnZVVwKG1heF9yb3cpOwotCQkJfQotCQkJc2VsZWN0aW9uLnkgPSBNYXRoLm1heCgwLCBhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpOwotCQkJc2VsZWN0RWxlbWVudHMoc3RhcnRfaW5kZXgsIGluZGV4KTsKLQkJCXJlZHJhdyhzdGFydF9pbmRleCwgaW5kZXgpOwotCQl9Ci0JfQotCS8qKiBEbyBzZWxlY3Rpb24gcGFnZSBkb3duCi0JICogQHBhcmFtIGRpc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZWxlY3Rpb25QYWdlRG93bihpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGluZGV4ID0gc2VsZWN0aW9uID09IG51bGwgPyAtMSA6IGZpbmRTZWxlY3RlZEluZGV4QnlMb2NhdGlvbihzZWxlY3Rpb24ueCwgKGFjdHVhbFNjcm9sbFN0YXJ0X3kgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCksIGZhbHNlKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCWludCBtYXhfY29sID0gZ2V0TWF4Q29sKCk7Ci0JCQlpbnQgbWF4X3JvdyA9IGdldE1heENsaWVudFJvdygpIC0gMTsKLQkJCWludCB0b3RhbF9pbl9wYWdlID0gbWF4X2NvbCAqIG1heF9yb3c7Ci0JCQlpbnQgZW5kX2luZGV4ID0gTWF0aC5taW4oZ2V0VG90YWxFbGVtZW50cygpLCAoaW5kZXggKyB0b3RhbF9pbl9wYWdlKSk7Ci0JCQlhY3R1YWxTY3JvbGxTdGFydF95ICs9IG1heF9yb3cgKiBnZXRFbGVtZW50SGVpZ2h0KCk7Ci0JCQlpZiAoYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0ID4gKG1heF9yb3cgKyAxKSAqIGdldEVsZW1lbnRIZWlnaHQoKSkgewotCQkJCWRvUGFnZURvd24obWF4X3Jvdyk7Ci0JCQl9Ci0JCQlzZWxlY3Rpb24ueSA9IE1hdGgubWF4KDAsIGFjdHVhbFNjcm9sbFN0YXJ0X3kgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCk7Ci0JCQlzZWxlY3RFbGVtZW50cyhpbmRleCwgZW5kX2luZGV4KTsKLQkJCXJlZHJhdyhpbmRleCwgZW5kX2luZGV4KTsKLQkJfQotCX0KLQkvKiogRG8gc2VsZWN0aW9uIHBhZ2UgdXAKLQkgKiBAcGFyYW0gZGlzdGFuY2UKLQkgKiBAcGFyYW0geF9sb2MKLQkgKiBAcGFyYW0geV9sb2MKLQkgKiBAcGFyYW0gaXNTZWxlY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NlbGVjdGlvblBhZ2VVcChpbnQgZGlzdGFuY2UsIGludCB4X2xvYywgaW50IHlfbG9jLCBib29sZWFuIGlzU2VsZWN0KSB7Ci0JCWRvUGFnZVVwKGRpc3RhbmNlIC8gZ2V0RWxlbWVudEhlaWdodCgpKTsKLQkJaWYgKG1vdmluZ1NlbGVjdGlvblN0YXJ0ICE9IG51bGwgJiYgaXNTZWxlY3QpIHsKLQkJCW1vdmluZ1NlbGVjdGlvblN0YXJ0LnkgKz0gZ2V0VmVydGljYWxJbmNyZW1lbnQoKTsKLQkJCWRvTW91c2VTZWxlY3Rpb24obW92aW5nU2VsZWN0aW9uU3RhcnQueCwgbW92aW5nU2VsZWN0aW9uU3RhcnQueSwgeF9sb2MsIHlfbG9jLCB0cnVlKTsKLQkJfQotCX0KLQkvKiogRG8gc2VsZWN0aW9uIHBhZ2UgZG93bgotCSAqIEBwYXJhbSBkaXN0YW5jZQotCSAqIEBwYXJhbSB4X2xvYwotCSAqIEBwYXJhbSB5X2xvYwotCSAqIEBwYXJhbSBpc1NlbGVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2VsZWN0aW9uUGFnZURvd24oaW50IGRpc3RhbmNlLCBpbnQgeF9sb2MsIGludCB5X2xvYywgYm9vbGVhbiBpc1NlbGVjdCkgewotCQlkb1BhZ2VEb3duKGRpc3RhbmNlIC8gZ2V0RWxlbWVudEhlaWdodCgpKTsKLQkJaWYgKG1vdmluZ1NlbGVjdGlvblN0YXJ0ICE9IG51bGwgJiYgaXNTZWxlY3QpIHsKLQkJCW1vdmluZ1NlbGVjdGlvblN0YXJ0LnkgLT0gZ2V0VmVydGljYWxJbmNyZW1lbnQoKTsKLQkJCWRvTW91c2VTZWxlY3Rpb24obW92aW5nU2VsZWN0aW9uU3RhcnQueCwgbW92aW5nU2VsZWN0aW9uU3RhcnQueSwgeF9sb2MsIHlfbG9jLCB0cnVlKTsKLQkJfQotCX0KLQkvKiogRG8gZGVsZXRlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGUoKSB7Ci0JCWZpcmVBY3Rpb24oSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5ERUxFVEVfQUNUSU9OKTsKLQl9Ci0JLyoqIERvIGNvcHkKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0NvcHkoKSB7Ci0JCWZpcmVBY3Rpb24oSUljb25DYW52YXNBY3Rpb25MaXN0ZW5lci5DT1BZX0FDVElPTik7Ci0JfQotCS8qKiBEbyBjdXQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0N1dCgpIHsKLQkJZmlyZUFjdGlvbihJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyLkNVVF9BQ1RJT04pOwotCX0KLQkvKiogRG8gcGFzdGUKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1Bhc3RlKCkgewotCQlmaXJlQWN0aW9uKElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIuUEFTVEVfQUNUSU9OKTsKLQl9Ci0JLyoqIERvIHBhZ2UgdXAKLQkgKiBAcGFyYW0gcm93cyBudW1iZXIgb2Ygcm93IHRvIHBhZ2UgdXAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1BhZ2VVcChpbnQgcm93cykgewotCQlpZiAoY3VycmVudF90b3Bfcm93ID49IDAgJiYgdmVydGljYWxTY3JvbGxPZmZzZXQgPiAwKSB7Ci0JCQlpbnQgc2Nyb2xsUm93cyA9IE1hdGgubWF4KDEsIE1hdGgubWluKGN1cnJlbnRfdG9wX3Jvdywgcm93cykpOwotCQkJY3VycmVudF90b3Bfcm93IC09IHNjcm9sbFJvd3M7Ci0JCQlpZiAoY3VycmVudF90b3Bfcm93IDwgMCkKLQkJCQljdXJyZW50X3RvcF9yb3cgPSAwOwotCQkJLy8gc2Nyb2xsIG9uZSBwYWdlIHVwIG9yIHRvIHRoZSB0b3AKLQkJCWludCBzY3JvbGxPZmZzZXQgPSBNYXRoLm1heCgwLCB2ZXJ0aWNhbFNjcm9sbE9mZnNldCAtIHNjcm9sbFJvd3MgKiBnZXRWZXJ0aWNhbEluY3JlbWVudCgpKTsKLQkJCWlmIChzY3JvbGxPZmZzZXQgPCB2ZXJ0aWNhbFNjcm9sbE9mZnNldCkgewotCQkJCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KHNjcm9sbE9mZnNldCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqIERvIHBhZ2UgZG93bgotCSAqIEBwYXJhbSByb3dzIG51bWJlciBvZiByb3cgdG8gcGFnZSBkb3duCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9QYWdlRG93bihpbnQgcm93cykgewotCQlpbnQgbWF4X3JvdyA9IGdldE1heFJvdygpOwotCQlpbnQgbWF4X2NsaWVudF9yb3cgPSBnZXRNYXhDbGllbnRSb3coKTsKLQkJaWYgKGN1cnJlbnRfdG9wX3JvdyA8IG1heF9yb3cgLSBtYXhfY2xpZW50X3JvdykgewotCQkJaW50IHNjcm9sbFJvd3MgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihtYXhfcm93IC0gY3VycmVudF90b3Bfcm93IC0gbWF4X2NsaWVudF9yb3csIHJvd3MpKTsKLQkJCWN1cnJlbnRfdG9wX3JvdyArPSBzY3JvbGxSb3dzOwotCQkJLy8gc2Nyb2xsIG9uZSBwYWdlIGRvd24gb3IgdG8gdGhlIGJvdHRvbQotCQkJaW50IHNjcm9sbE9mZnNldCA9IE1hdGgubWluKHZlcnRpY2FsU2Nyb2xsT2Zmc2V0ICsgKHNjcm9sbFJvd3MgKiBnZXRWZXJ0aWNhbEluY3JlbWVudCgpKSwgKG1heF9yb3cgLSBtYXhfY2xpZW50X3JvdykgKiBnZXRFbGVtZW50SGVpZ2h0KCkpOwotCQkJaWYgKHNjcm9sbE9mZnNldCA+IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSB7Ci0JCQkJc2V0VmVydGljYWxTY3JvbGxPZmZzZXQoc2Nyb2xsT2Zmc2V0LCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQkvKiogRG8gdXAKLQkgKiBAcGFyYW0gaXNTZWxlY3QgdHJ1ZSBpZiBlbGVtZW50IGlzIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcChib29sZWFuIGlzU2VsZWN0KSB7Ci0JCWludCBpbmRleCA9IHNlbGVjdGlvbiA9PSBudWxsID8gLTEgOiBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oc2VsZWN0aW9uLngsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCWludCBtYXhfY29sID0gZ2V0TWF4Q29sKCk7Ci0JCQlpZiAoKGluZGV4IC0gbWF4X2NvbCkgPiAtMSkgewotCQkJCWFjdHVhbFNjcm9sbFN0YXJ0X3kgLT0gZ2V0RWxlbWVudEhlaWdodCgpOwotCQkJCWlmIChzZWxlY3Rpb24ueSA8IGdldFZlcnRpY2FsSW5jcmVtZW50KCkpIHsKLQkJCQkJZG9QYWdlVXAoMSk7Ci0JCQkJfQotCQkJCXNlbGVjdGlvbi55ID0gYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotCQkJCWJvb2xlYW4gcmVkcmF3QWxsID0gIXNlbGVjdGVkRWxlbWVudHMuaXNFbXB0eSgpOwotCQkJCWlmICghaXNTZWxlY3QpIHsKLQkJCQkJdW5zZWxlY3RBbGxFbGVtZW50cygpOwotCQkJCQlzZWxlY3RlZEVsZW1lbnRzLnNldChpbmRleCAtIG1heF9jb2wpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFpc1NlbGVjdGVkKGluZGV4IC0gbWF4X2NvbCkpCi0JCQkJCQlzZWxlY3RFbGVtZW50cyhpbmRleC1tYXhfY29sLCBpbmRleCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXVuc2VsZWN0RWxlbWVudHMoaW5kZXgtbWF4X2NvbCsxLCBpbmRleCk7CQkJCQkJCi0JCQkJfQotCQkJCQotCQkJCWlmIChyZWRyYXdBbGwpCi0JCQkJCXJlZHJhdygpOwotCQkJCWVsc2UKLQkJCQkJcmVkcmF3KGluZGV4IC0gbWF4X2NvbCwgaW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCS8qKiBEbyBkb3duCi0JICogQHBhcmFtIGlzU2VsZWN0IHRydWUgaWYgZWxlbWVudCBpcyBzZWxlY3RlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRG93bihib29sZWFuIGlzU2VsZWN0KSB7Ci0JCWludCBpbmRleCA9IHNlbGVjdGlvbiA9PSBudWxsID8gLTEgOiBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oc2VsZWN0aW9uLngsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlpbnQgbWF4X2NvbCA9IGdldE1heENvbCgpOwotCQkJaWYgKChpbmRleCArIG1heF9jb2wpIDwgZ2V0VG90YWxFbGVtZW50cygpKSB7Ci0JCQkJYWN0dWFsU2Nyb2xsU3RhcnRfeSArPSBnZXRFbGVtZW50SGVpZ2h0KCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi55ICsgZ2V0VmVydGljYWxJbmNyZW1lbnQoKSA+IGdldE1heENsaWVudFJvdygpICogZ2V0RWxlbWVudEhlaWdodCgpKSB7Ci0JCQkJCWRvUGFnZURvd24oMSk7Ci0JCQkJfQotCQkJCXNlbGVjdGlvbi55ID0gYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotCQkJCWJvb2xlYW4gcmVkcmF3QWxsID0gIXNlbGVjdGVkRWxlbWVudHMuaXNFbXB0eSgpOwotCQkJCWlmICghaXNTZWxlY3QpIHsKLQkJCQkJdW5zZWxlY3RBbGxFbGVtZW50cygpOwotCQkJCQlzZWxlY3RlZEVsZW1lbnRzLnNldChpbmRleCArIG1heF9jb2wpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFpc1NlbGVjdGVkKGluZGV4ICsgbWF4X2NvbCkpCi0JCQkJCQlzZWxlY3RFbGVtZW50cyhpbmRleCwgaW5kZXgrbWF4X2NvbCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXVuc2VsZWN0RWxlbWVudHMoaW5kZXgsIGluZGV4K21heF9jb2wtMSk7CQkJCQkJCi0JCQkJfQotCQkJCi0JCQkJaWYgKHJlZHJhd0FsbCkKLQkJCQkJcmVkcmF3KCk7Ci0JCQkJZWxzZQotCQkJCQlyZWRyYXcoaW5kZXgsIGluZGV4ICsgbWF4X2NvbCk7Ci0KLQkJCX0KLQkJfQotCX0KLQkvKiogR28gcHJldmlvdXMKLQkgKiBAcGFyYW0gaXNTZWxlY3QgdHJ1ZSBpZiBlbGVtZW50IGlzIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9QcmV2aW91cyhib29sZWFuIGlzU2VsZWN0KSB7Ci0JCWludCBpbmRleCA9IHNlbGVjdGlvbiA9PSBudWxsID8gLTEgOiBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oc2VsZWN0aW9uLngsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCXNlbGVjdGlvbi54IC09IGdldEVsZW1lbnRXaWR0aCgpOwotCQkJaWYgKHNlbGVjdGlvbi54IDwgZV9vZmZzZXRfeCkgewotCQkJCWFjdHVhbFNjcm9sbFN0YXJ0X3kgLT0gZ2V0RWxlbWVudEhlaWdodCgpOwotCQkJCWlmIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQgPCBnZXRWZXJ0aWNhbEluY3JlbWVudCgpKSB7Ci0JCQkJCWRvUGFnZVVwKDEpOwotCQkJCX0KLQkJCQlzZWxlY3Rpb24ueCA9IGVfb2Zmc2V0X3ggKyAoZ2V0TWF4Q29sKCkgKiBnZXRFbGVtZW50V2lkdGgoKSkgLSBlX3dpZHRoOwotCQkJCXNlbGVjdGlvbi55ID0gYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotCQkJfQotCQkJYm9vbGVhbiByZWRyYXdBbGwgPSAhc2VsZWN0ZWRFbGVtZW50cy5pc0VtcHR5KCk7Ci0JCQlpZiAoIWlzU2VsZWN0KSB7Ci0JCQkJdW5zZWxlY3RBbGxFbGVtZW50cygpOwotCQkJfQotCQkJaWYgKCFpc1NlbGVjdGVkKGluZGV4IC0gMSkpCi0JCQkJYXV0b1NlbGVjdFVuc2VsZWN0RWxlbWVudChpbmRleCAtIDEpOwotCQkJZWxzZQotCQkJCXNlbGVjdGVkRWxlbWVudHMuY2xlYXIoaW5kZXgpOwotCQkJCi0JCQlpZiAocmVkcmF3QWxsKQotCQkJCXJlZHJhdygpOwotCQkJZWxzZQotCQkJCXJlZHJhdyhpbmRleC0xLCBpbmRleCk7Ci0JCX0KLQl9Ci0JLyoqIEdvIG5leHQKLQkgKiBAcGFyYW0gaXNTZWxlY3QgdHJ1ZSBpZiBlbGVtZW50IGlzIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9OZXh0KGJvb2xlYW4gaXNTZWxlY3QpIHsKLQkJaW50IGluZGV4ID0gc2VsZWN0aW9uID09IG51bGwgPyAtMSA6IGZpbmRTZWxlY3RlZEluZGV4QnlMb2NhdGlvbihzZWxlY3Rpb24ueCwgKGFjdHVhbFNjcm9sbFN0YXJ0X3kgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCksIGZhbHNlKTsKLQkJaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCBnZXRUb3RhbEVsZW1lbnRzKCkgLSAxKSB7Ci0JCQlzZWxlY3Rpb24ueCArPSBnZXRFbGVtZW50V2lkdGgoKTsKLQkJCWlmIChzZWxlY3Rpb24ueCA+IChnZXRNYXhDb2woKSAqIGdldEVsZW1lbnRXaWR0aCgpICsgZV9vZmZzZXRfeCkpIHsKLQkJCQlhY3R1YWxTY3JvbGxTdGFydF95ICs9IGdldEVsZW1lbnRIZWlnaHQoKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnkgKyBnZXRWZXJ0aWNhbEluY3JlbWVudCgpID4gZ2V0TWF4Q2xpZW50Um93KCkgKiBnZXRFbGVtZW50SGVpZ2h0KCkpIHsKLQkJCQkJZG9QYWdlRG93bigxKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uLnggPSBlX29mZnNldF94ICsgZV9zcGFjaW5nX3g7Ci0JCQkJc2VsZWN0aW9uLnkgPSBhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCQl9Ci0JCQlib29sZWFuIHJlZHJhd0FsbCA9ICFzZWxlY3RlZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJCWlmICghaXNTZWxlY3QpIHsKLQkJCQl1bnNlbGVjdEFsbEVsZW1lbnRzKCk7Ci0JCQl9Ci0JCQlpZiAoIWlzU2VsZWN0ZWQoaW5kZXggKyAxKSkKLQkJCQlhdXRvU2VsZWN0VW5zZWxlY3RFbGVtZW50KGluZGV4ICsgMSk7Ci0JCQllbHNlCi0JCQkJc2VsZWN0ZWRFbGVtZW50cy5jbGVhcihpbmRleCk7Ci0JCQlpZiAocmVkcmF3QWxsKQotCQkJCXJlZHJhdygpOwotCQkJZWxzZQotCQkJCXJlZHJhdyhpbmRleCwgaW5kZXgrMSk7Ci0JCX0KLQl9Ci0JLyoqIEdvIHRvIGxpbmUgc3RhcnQKLQkgKiBAcGFyYW0gaXNTZWxlY3QgdHJ1ZSBpZiBlbGVtZW50IGlzIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9MaW5lU3RhcnQoYm9vbGVhbiBpc1NlbGVjdCkgewotCQlpbnQgaW5kZXggPSBzZWxlY3Rpb24gPT0gbnVsbCA/IC0xIDogZmluZFNlbGVjdGVkSW5kZXhCeUxvY2F0aW9uKHNlbGVjdGlvbi54LCAoYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSwgZmFsc2UpOwotCQlpZiAoaW5kZXggPiAtMSkgewotCQkJaW50IHN0YXJ0X3Bvc194ID0gZV9vZmZzZXRfeCArIGVfc3BhY2luZ194OwotCQkJaW50IHN0YXJ0X2luZGV4ID0gZmluZFNlbGVjdGVkSW5kZXhCeUxvY2F0aW9uKHN0YXJ0X3Bvc194LCAoYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSwgZmFsc2UpOwotCQkJaWYgKHN0YXJ0X2luZGV4ID4gLTEpIHsKLQkJCQlzZWxlY3Rpb24ueCA9IHN0YXJ0X3Bvc194OwotCQkJCWlmICghaXNTZWxlY3QpIHsKLQkJCQkJc2VsZWN0ZWRFbGVtZW50cy5jbGVhcihpbmRleCk7Ci0JCQkJCWF1dG9TZWxlY3RVbnNlbGVjdEVsZW1lbnQoc3RhcnRfaW5kZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VsZWN0RWxlbWVudHMoc3RhcnRfaW5kZXgsIGluZGV4KTsKLQkJCQl9Ci0JCQkJcmVkcmF3KHN0YXJ0X2luZGV4LCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqIEdvIHRvIGxpbmUgZW5kCi0JICogQHBhcmFtIGlzU2VsZWN0IHRydWUgaWYgZWxlbWVudCBpcyBzZWxlY3RlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvTGluZUVuZChib29sZWFuIGlzU2VsZWN0KSB7Ci0JCWludCBpbmRleCA9IHNlbGVjdGlvbiA9PSBudWxsID8gLTEgOiBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oc2VsZWN0aW9uLngsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlpZiAoIWlzU2VsZWN0KQotCQkJCXNlbGVjdGVkRWxlbWVudHMuY2xlYXIoaW5kZXgpOwotCQkJaW50IHRvdGFsID0gZ2V0VG90YWxFbGVtZW50cygpIC0gMTsKLQkJCWlmIChpbmRleCA+IHRvdGFsIC0gZ2V0TWF4Q29sKCkpIHsKLQkJCQlpbnQgZW5kX2NvdW50ZXIgPSB0b3RhbCAtIGluZGV4OwotCQkJCXNlbGVjdGlvbi54ID0gKGVuZF9jb3VudGVyICsgMSkgKiBnZXRFbGVtZW50V2lkdGgoKSArIGVfb2Zmc2V0X3g7Ci0JCQkJaWYgKCFpc1NlbGVjdCkKLQkJCQkJYXV0b1NlbGVjdFVuc2VsZWN0RWxlbWVudChpbmRleCArIGVuZF9jb3VudGVyKTsKLQkJCQllbHNlCi0JCQkJCXNlbGVjdEVsZW1lbnRzKGluZGV4LCBpbmRleCArIGVuZF9jb3VudGVyKTsKLQkJCQlyZWRyYXcoaW5kZXgsIGluZGV4ICsgZW5kX2NvdW50ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgZW5kX3Bvc194ID0gZV9vZmZzZXRfeCArIChnZXRNYXhDb2woKSAqIGdldEVsZW1lbnRXaWR0aCgpKSAtIGVfd2lkdGg7Ci0JCQkJaW50IGVuZF9pbmRleCA9IGZpbmRTZWxlY3RlZEluZGV4QnlMb2NhdGlvbihlbmRfcG9zX3gsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCQkJaWYgKGVuZF9pbmRleCA+IC0xKSB7Ci0JCQkJCXNlbGVjdGlvbi54ID0gZW5kX3Bvc194OwotCQkJCQlpZiAoIWlzU2VsZWN0KQotCQkJCQkJYXV0b1NlbGVjdFVuc2VsZWN0RWxlbWVudChlbmRfaW5kZXgpOwotCQkJCQllbHNlCi0JCQkJCQlzZWxlY3RFbGVtZW50cyhpbmRleCwgZW5kX2luZGV4KTsKLQkJCQkJcmVkcmF3KGluZGV4LCBlbmRfaW5kZXgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZHJhdyhpbmRleCwgaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKiogU2VsZWN0IGFsbCBlbGVtZW50cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2VsZWN0aW9uQWxsKCkgewotCQlzZWxlY3RlZEVsZW1lbnRzLnNldCgwLCBnZXRUb3RhbEVsZW1lbnRzKCkpOwotCQlyZWRyYXcoKTsKLQl9Ci0JLyoqIFNldCB2ZXJ0aWNhbCBzY3JvbGxiYXIgb2Zmc2V0Ci0JICogQHBhcmFtIHBpeGVsT2Zmc2V0Ci0JICogQHBhcmFtIGFkanVzdFNjcm9sbEJhcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRWZXJ0aWNhbFNjcm9sbE9mZnNldChpbnQgcGl4ZWxPZmZzZXQsIGJvb2xlYW4gYWRqdXN0U2Nyb2xsQmFyKSB7Ci0JCWlmIChwaXhlbE9mZnNldCA9PSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVNjcm9sbEJhciB2ZXJ0aWNhbEJhciA9IGdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmICh2ZXJ0aWNhbEJhciAhPSBudWxsICYmIGFkanVzdFNjcm9sbEJhcikgewotCQkJdmVydGljYWxCYXIuc2V0U2VsZWN0aW9uKHBpeGVsT2Zmc2V0KTsKLQkJfQotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJc2Nyb2xsKDAsIDAsIDAsIHBpeGVsT2Zmc2V0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0LCBhZGp1c3RTY3JvbGxCYXIpOwotCQl2ZXJ0aWNhbFNjcm9sbE9mZnNldCA9IHBpeGVsT2Zmc2V0OwotCQljYWxjdWxhdGVUb3BJbmRleCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqIEZpbmlzaGVkIGF1dG8gc2Nyb2xsaW5nCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kQXV0b1Njcm9sbCgpIHsKLQkJYXV0b1Njcm9sbERpcmVjdGlvbiA9IFNXVC5OVUxMOwotCX0KLQkvKiogQ2FsY3VsYXRlIHRvcCBpbmRleAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbGN1bGF0ZVRvcEluZGV4KCkgewotCQlpbnQgdmVydGljYWxJbmNyZW1lbnQgPSBnZXRWZXJ0aWNhbEluY3JlbWVudCgpOwotCQlpZiAodmVydGljYWxJbmNyZW1lbnQgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWN1cnJlbnRfdG9wX3JvdyA9IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0IC8gdmVydGljYWxJbmNyZW1lbnQ7Ci0JCWlmIChjdXJyZW50X3RvcF9yb3cgPiAwKSB7Ci0JCQlpbnQgbWF4X3JvdyA9IGdldE1heFJvdygpOwotCQkJaW50IGNsaWVudEFyZWFIZWlnaHQgPSBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotCQkJaWYgKGNsaWVudEFyZWFIZWlnaHQgPiAwKSB7Ci0JCQkJaW50IGZ1bGxSb3dUb3BQaXhlbCA9IGN1cnJlbnRfdG9wX3JvdyAqIHZlcnRpY2FsSW5jcmVtZW50OwotCQkJCWlmICh2ZXJ0aWNhbFNjcm9sbE9mZnNldCA8IGZ1bGxSb3dUb3BQaXhlbCkgewotCQkJCQljdXJyZW50X3RvcF9yb3ctLTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRfdG9wX3JvdyA+PSBtYXhfcm93KSB7Ci0JCQkJY3VycmVudF90b3Bfcm93ID0gbWF4X3JvdyAtIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqIEdldCBzZWxlY3RlZCBjb2x1bW4KLQkgKiBAcGFyYW0geF9sb2MKLQkgKiBAcGFyYW0gaXNBcHByb3hpbWF0ZQotCSAqIEByZXR1cm4gY29sdW1uIG51bWJlcgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U2VsZWN0ZWRDb2woaW50IHhfbG9jLCBib29sZWFuIGlzQXBwcm94aW1hdGUpIHsKLQkJaW50IGNvbCA9IE1hdGgubWluKHhfbG9jIC8gZ2V0RWxlbWVudFdpZHRoKCksIGdldE1heENvbCgpIC0gMSk7Ci0JCWlmIChpc0FwcHJveGltYXRlKQotCQkJcmV0dXJuIGNvbDsKLQkJaW50IHRlc3RfbG9jX3ggPSBnZXRFbGVtZW50V2lkdGgoKSAqIGNvbDsKLQkJaWYgKHhfbG9jID4gdGVzdF9sb2NfeCAmJiB4X2xvYyA8ICh0ZXN0X2xvY194ICsgZV93aWR0aCkpIHsKLQkJCXJldHVybiBjb2w7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkvKiogR2V0IHNlbGVjdGVkIHJvdwotCSAqIEBwYXJhbSB5X2xvYwotCSAqIEBwYXJhbSBpc0FwcHJveGltYXRlCi0JICogQHJldHVybiByb3cgbnVtYmVyCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTZWxlY3RlZFJvdyhpbnQgeV9sb2MsIGJvb2xlYW4gaXNBcHByb3hpbWF0ZSkgewotCQlpbnQgcm93ID0gTWF0aC5tYXgoMCwgKHZlcnRpY2FsU2Nyb2xsT2Zmc2V0ICsgeV9sb2MpIC8gZ2V0RWxlbWVudEhlaWdodCgpKTsKLQkJaWYgKGlzQXBwcm94aW1hdGUpCi0JCQlyZXR1cm4gcm93OwotCQlpbnQgdGVzdF9sb2NfeSA9IChnZXRFbGVtZW50SGVpZ2h0KCkgKiByb3cpIC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCWlmICh5X2xvYyA+IHRlc3RfbG9jX3kgJiYgeV9sb2MgPCAodGVzdF9sb2NfeSArIGVfaGVpZ2h0KSkgewotCQkJcmV0dXJuIHJvdzsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCS8qKiBGaW5kIHNlbGVjdGVkIGluZGV4Ci0JICogQHBhcmFtIHJvdwotCSAqIEBwYXJhbSBjb2wKLQkgKiBAcmV0dXJuIHNlbGVjdGVkIGluZGV4Ci0JICovCi0JcHJvdGVjdGVkIGludCBmaW5kU2VsZWN0ZWRJbmRleChpbnQgcm93LCBpbnQgY29sKSB7Ci0JCXJldHVybiByb3cgKiBnZXRNYXhDb2woKSArIGNvbDsKLQl9Ci0JLyoqIEZpbmQgc2VsZWN0ZWQgaW5kZXgKLQkgKiBAcGFyYW0gbG9jX3gKLQkgKiBAcGFyYW0gbG9jX3kKLQkgKiBAcGFyYW0gaXNBcHByb3hpbWF0ZSB0cnVlIGlmIHNlYXJjaGluZyBpcyBhcHByb3hpbWF0ZQotCSAqIEByZXR1cm4gLTEgaWYgbm90IGZvdW5kCi0JICovCi0JcHJvdGVjdGVkIGludCBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oaW50IGxvY194LCBpbnQgbG9jX3ksIGJvb2xlYW4gaXNBcHByb3hpbWF0ZSkgewotCQlpbnQgY29sID0gZ2V0U2VsZWN0ZWRDb2wobG9jX3ggLSBlX29mZnNldF94LCBpc0FwcHJveGltYXRlKTsKLQkJaWYgKGNvbCA+IC0xKSB7Ci0JCQlpbnQgcm93ID0gZ2V0U2VsZWN0ZWRSb3cobG9jX3kgLSBlX29mZnNldF95LCBpc0FwcHJveGltYXRlKTsKLQkJCWlmIChyb3cgPiAtMSkgewotCQkJCWludCBpbmRleCA9IGZpbmRTZWxlY3RlZEluZGV4KHJvdywgY29sKTsKLQkJCQlpZiAoaW5kZXggPCBnZXRUb3RhbEVsZW1lbnRzKCkpCi0JCQkJCXJldHVybiBpbmRleDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCS8qKiBGaW5kIGNvbHVtbiBhbmQgcm93Ci0JICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXgKLQkgKiBAcmV0dXJuIHggaXMgY29sdW1uIGFuZCB5IGlzIHJvdwotCSAqLwotCXByb3RlY3RlZCBQb2ludCBmaW5kU2VjdGlvbihpbnQgaW5kZXgpIHsKLQkJaW50IG1heF9jb2wgPSBnZXRNYXhDb2woKTsKLQkJaW50IGNvbCA9IChpbnQpIE1hdGguZmxvb3IoaW5kZXggJSBtYXhfY29sKTsKLQkJaW50IHJvdyA9IChpbnQpIE1hdGguZmxvb3IoaW5kZXggLyBtYXhfY29sKTsKLQkJcmV0dXJuIG5ldyBQb2ludChjb2wsIHJvdyk7Ci0JfQotCS8qKiBGaW5kIGxvY2F0aW9uIAotCSAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4Ci0JICogQHJldHVybiBsb2NhdGlvbiBvZiB0YXJnZXQgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBmaW5kTG9jYXRpb24oaW50IGluZGV4KSB7Ci0JCVBvaW50IHNlY3Rpb24gPSBmaW5kU2VjdGlvbihpbmRleCk7Ci0JCWludCB4X2xvYyA9IChzZWN0aW9uLnggKiBnZXRFbGVtZW50V2lkdGgoKSArIGVfb2Zmc2V0X3ggKyAxKTsgLy9wbHVzIDEgZm9yIG1hcmdpbgotCQlpbnQgeV9sb2MgPSAoc2VjdGlvbi55ICogZ2V0RWxlbWVudEhlaWdodCgpICsgZV9vZmZzZXRfeSArIDEpIC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCXJldHVybiBuZXcgUG9pbnQoeF9sb2MsIHlfbG9jKTsKLQl9Ci0JLyoqIEdldCBkaXJlY3Rpb24gCi0JICogQHBhcmFtIHNfeAotCSAqIEBwYXJhbSBzX3kKLQkgKiBAcGFyYW0gZV94Ci0JICogQHBhcmFtIGVfeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERpcmVjdGlvbihpbnQgc194LCBpbnQgc195LCBpbnQgZV94LCBpbnQgZV95KSB7Ci0JCWludCBkaXJlY3Rpb24gPSBTRTsKLQkJaWYgKHNfeCA+IGVfeCkgewotCQkJZGlyZWN0aW9uID0gU1c7Ci0JCX0KLQkJaWYgKHNfeSA+IGVfeSkgewotCQkJaWYgKGRpcmVjdGlvbiA9PSBTVykKLQkJCQlkaXJlY3Rpb24gPSBOVzsKLQkJCWVsc2UKLQkJCQlkaXJlY3Rpb24gPSBORTsKLQkJfQotCQlyZXR1cm4gZGlyZWN0aW9uOwotCX0KLQkvKiogR2V0IHNlbGVjdCBlbGVtZW50cwotCSAqIEBwYXJhbSBjb2xfc3RhcnQKLQkgKiBAcGFyYW0gY29sX2VuZAotCSAqIEBwYXJhbSByb3dfc3RhcnQKLQkgKiBAcGFyYW0gcm93X2VuZAotCSAqIEByZXR1cm4gc2VsZWN0ZWQgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgQml0U2V0IHNlbGVjdEVsZW1lbnRzKGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBpbnQgcm93X3N0YXJ0LCBpbnQgcm93X2VuZCkgewotCQlCaXRTZXQgbmV3RWxlbWVudHMgPSBuZXcgQml0U2V0KCk7Ci0JCWludCB0b3RhbCA9IGdldFRvdGFsRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgcm93X2NvdW50ID0gcm93X3N0YXJ0OyByb3dfY291bnQgPCByb3dfZW5kOyByb3dfY291bnQrKykgewotCQkJZm9yIChpbnQgY29sX2NvdW50ID0gY29sX3N0YXJ0OyBjb2xfY291bnQgPCBjb2xfZW5kOyBjb2xfY291bnQrKykgewotCQkJCWludCBpbmRleCA9IGZpbmRTZWxlY3RlZEluZGV4KHJvd19jb3VudCwgY29sX2NvdW50KTsKLQkJCQlpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IHRvdGFsKSB7Ci0JCQkJCW5ld0VsZW1lbnRzLnNldChpbmRleCk7Ci0JCQkJfQotCQkJCS8vaW5kaWNhdGUgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQgd2hlbiBkcmFnZ2luZwotCQkJCWlmIChmaXJzdFNlbGVjdGVkSW5kZXggPT0gLTEgfHwgZmlyc3RTZWxlY3RlZEluZGV4ID4gaW5kZXgpIHsKLQkJCQkJZmlyc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50czsKLQl9Ci0JLyoqIEdldCBzdGFydGVkIHBvaW50Ci0JICogQHBhcmFtIHgKLQkgKiBAcGFyYW0geQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFBvaW50IGdldFN0YXJ0ZWRQb2ludChpbnQgeCwgaW50IHkpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChNYXRoLm1heChlX29mZnNldF94LWVfc3BhY2luZ194LCB4KSwgTWF0aC5tYXgoMCwgTWF0aC5taW4oKGdldE1heFJvdygpIC0gY3VycmVudF90b3Bfcm93KSAqIGdldEVsZW1lbnRIZWlnaHQoKSArIHNlbF9zaXplLCB5KSkpOwotCX0KLQkvKiogR2V0IGZpbmlzaGVkIHBvaW50Ci0JICogQHBhcmFtIHgKLQkgKiBAcGFyYW0geQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFBvaW50IGdldEZpbmlzaGVkUG9pbnQoaW50IHgsIGludCB5KSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoTWF0aC5taW4oZ2V0TWF4Q29sKCkqZ2V0RWxlbWVudFdpZHRoKCkgKyBlX29mZnNldF94IC0gZV9zcGFjaW5nX3gsIE1hdGgubWF4KGVfb2Zmc2V0X3gtZV9zcGFjaW5nX3gsIHgpKSwgTWF0aC5taW4oKGdldE1heFJvdygpIC0gY3VycmVudF90b3Bfcm93KSAqIGdldEVsZW1lbnRIZWlnaHQoKSArIHNlbF9zaXplLCBNYXRoLm1heCgwICsgc2VsX3NpemUsIHkpKSk7Ci0JfQotCS8qKiBEbyBtb3VzZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gbW91c2Vfc3RhcnRfeAotCSAqIEBwYXJhbSBtb3VzZV9zdGFydF95Ci0JICogQHBhcmFtIG1vdXNlX2VuZF94Ci0JICogQHBhcmFtIG1vdXNlX2VuZF95Ci0JICogQHBhcmFtIGlzU2Nyb2xsaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Nb3VzZVNlbGVjdGlvbihpbnQgbW91c2Vfc3RhcnRfeCwgaW50IG1vdXNlX3N0YXJ0X3ksIGludCBtb3VzZV9lbmRfeCwgaW50IG1vdXNlX2VuZF95LCBib29sZWFuIGlzU2Nyb2xsaW5nKSB7Ci0JCWlmIChtb3VzZV9zdGFydF94IDwgKGVfb2Zmc2V0X3ggLSBnZXRFbGVtZW50V2lkdGgoKSkgfHwgbW91c2Vfc3RhcnRfeSA+IChnZXRNYXhSb3coKSAtIGN1cnJlbnRfdG9wX3JvdyArIDEpICogZ2V0RWxlbWVudEhlaWdodCgpKQotCQkJcmV0dXJuOwotCQkKLQkJYm9vbGVhbiBpc0luaXRpYWxQYWdlID0gKG1vdXNlX3N0YXJ0X3kgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCA9PSBhY3R1YWxTY3JvbGxTdGFydF95KTsKLQkJUG9pbnQgc3RhcnRfcHQgPSBnZXRTdGFydGVkUG9pbnQobW91c2Vfc3RhcnRfeCwgbW91c2Vfc3RhcnRfeSk7Ci0JCVBvaW50IGVuZF9wdCA9IGdldEZpbmlzaGVkUG9pbnQobW91c2VfZW5kX3gsIG1vdXNlX2VuZF95KTsKLQkJaW50IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbihtb3ZpbmdTZWxlY3Rpb25TdGFydC54LCBtb3ZpbmdTZWxlY3Rpb25TdGFydC55LCBlbmRfcHQueCwgZW5kX3B0LnkpOwotCQlpbnQgc194ID0gc3RhcnRfcHQueDsKLQkJaW50IGVfeCA9IGVuZF9wdC54OwotCQlpbnQgc195ID0gaXNJbml0aWFsUGFnZSA/IHN0YXJ0X3B0LnkgOiAoYWN0dWFsU2Nyb2xsU3RhcnRfeSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KTsKLQkJaW50IGVfeSA9IGVuZF9wdC55OwotCi0JCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCWNhc2UgU1c6Ci0JCQlzX3ggPSBlbmRfcHQueDsKLQkJCWVfeCA9IHN0YXJ0X3B0Lng7Ci0JCQlicmVhazsKLQkJY2FzZSBOVzoKLQkJCXNfeCA9IGVuZF9wdC54OwotCQkJZV94ID0gc3RhcnRfcHQueDsKLQkJCXNfeSA9IGVuZF9wdC55OwotCQkJZV95ID0gc3RhcnRfcHQueTsKLQkJCWJyZWFrOwotCQljYXNlIE5FOgotCQkJc195ID0gZW5kX3B0Lnk7Ci0JCQllX3kgPSBzdGFydF9wdC55OwotCQkJYnJlYWs7Ci0JCX0KLQkJaW50IGRfc3ggPSBzX3ggLSBlX29mZnNldF94ICsgZV9zcGFjaW5nX3g7Ci0JCWludCBkX2V4ID0gZV94IC0gZV9vZmZzZXRfeDsKLQkJaW50IGRfc3kgPSBzX3kgLSBlX29mZnNldF95ICsgZV9zcGFjaW5nX3k7Ci0JCWludCBkX2V5ID0gZV95IC0gZV9vZmZzZXRfeTsKLQotCQlpbnQgY29sX3N0YXJ0ID0gTWF0aC5tYXgoMCwgZ2V0U2VsZWN0ZWRDb2woZF9zeCwgdHJ1ZSkpOwotCQlpbnQgY29sX2VuZCA9IE1hdGgubWluKGdldFNlbGVjdGVkQ29sKGRfZXgsIHRydWUpICsgMSwgZ2V0TWF4Q29sKCkpOwotCQlpbnQgcm93X3N0YXJ0ID0gTWF0aC5tYXgoMCwgZ2V0U2VsZWN0ZWRSb3coZF9zeSwgdHJ1ZSkpOwotCQlpbnQgcm93X2VuZCA9IE1hdGgubWluKGdldFNlbGVjdGVkUm93KGRfZXksIHRydWUpICsgMSwgZ2V0TWF4Um93KCkpOwotCi0JCXRlbXBTZWxlY3RlZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCXRlbXBTZWxlY3RlZEVsZW1lbnRzLm9yKHNlbGVjdEVsZW1lbnRzKGNvbF9zdGFydCwgY29sX2VuZCwgcm93X3N0YXJ0LCByb3dfZW5kKSk7Ci0JCWlmIChtb3ZpbmdTZWxlY3Rpb25FbmQgIT0gbnVsbCkgewotCQkJaW50IGxhc3RfZW5kX3ggPSBtb3ZpbmdTZWxlY3Rpb25FbmQueDsKLQkJCWludCBsYXN0X2VuZF95ID0gbW92aW5nU2VsZWN0aW9uRW5kLnk7Ci0JCQkvLyByZWRyYXcgd2hvbGUgdmlldyBpZiBjaGFuZ2VkIHRoZSBkaXJlY3Rpb24KLQkJCWlmIChnZXREaXJlY3Rpb24obW92aW5nU2VsZWN0aW9uU3RhcnQueCwgbW92aW5nU2VsZWN0aW9uU3RhcnQueSwgbGFzdF9lbmRfeCwgbGFzdF9lbmRfeSkgIT0gZGlyZWN0aW9uIHx8IChpc1Njcm9sbGluZyAmJiAoaXNSZWFjaFRvcCgpIHx8IGlzUmVhY2hCb3R0b20oKSkpKSB7Ci0JCQkJbW92aW5nU2VsZWN0aW9uRW5kLnggPSBlbmRfcHQueDsKLQkJCQltb3ZpbmdTZWxlY3Rpb25FbmQueSA9IGVuZF9wdC55OwotCQkJCXJlZHJhdygpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQljYXNlIFNFOgotCQkJCWlmIChlX3ggPCBsYXN0X2VuZF94KSB7Ci0JCQkJCWRfZXggPSBsYXN0X2VuZF94IC0gZV9vZmZzZXRfeCAtIGVfc3BhY2luZ194OwotCQkJCQljb2xfZW5kID0gTWF0aC5taW4oZ2V0U2VsZWN0ZWRDb2woZF9leCwgdHJ1ZSkgKyAxLCBnZXRNYXhDb2woKSk7Ci0JCQkJfQotCQkJCWlmIChlX3kgPCBsYXN0X2VuZF95KSB7Ci0JCQkJCWRfZXkgPSBsYXN0X2VuZF95IC0gZV9vZmZzZXRfeSAtIGVfc3BhY2luZ195OwotCQkJCQlyb3dfZW5kID0gTWF0aC5taW4oZ2V0U2VsZWN0ZWRSb3coZF9leSwgdHJ1ZSkgKyAxLCBnZXRNYXhSb3coKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTVzoKLQkJCQlpZiAoZV94ID4gbGFzdF9lbmRfeCkgewotCQkJCQlkX3N4ID0gbGFzdF9lbmRfeCAtIGVfb2Zmc2V0X3ggKyBlX3NwYWNpbmdfeDsKLQkJCQkJY29sX3N0YXJ0ID0gTWF0aC5tYXgoMCwgZ2V0U2VsZWN0ZWRDb2woZF9zeCwgdHJ1ZSkpOwotCQkJCX0KLQkJCQlpZiAoZV95IDwgbGFzdF9lbmRfeSkgewotCQkJCQlkX2V5ID0gbGFzdF9lbmRfeSAtIGVfb2Zmc2V0X3kgLSBlX3NwYWNpbmdfeTsKLQkJCQkJcm93X2VuZCA9IE1hdGgubWluKGdldFNlbGVjdGVkUm93KGRfZXksIHRydWUpICsgMSwgZ2V0TWF4Um93KCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTlc6Ci0JCQkJaWYgKGVfeCA+IGxhc3RfZW5kX3gpIHsKLQkJCQkJZF9zeCA9IGxhc3RfZW5kX3ggLSBlX29mZnNldF94ICsgZV9zcGFjaW5nX3g7Ci0JCQkJCWNvbF9zdGFydCA9IE1hdGgubWF4KDAsIGdldFNlbGVjdGVkQ29sKGRfc3gsIHRydWUpKTsKLQkJCQl9Ci0JCQkJaWYgKGVfeSA+IGxhc3RfZW5kX3kpIHsKLQkJCQkJZF9zeSA9IGxhc3RfZW5kX3kgLSBlX29mZnNldF95ICsgZV9zcGFjaW5nX3k7Ci0JCQkJCXJvd19zdGFydCA9IE1hdGgubWF4KDAsIGdldFNlbGVjdGVkUm93KGRfc3ksIHRydWUpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5FOgotCQkJCWlmIChlX3ggPCBsYXN0X2VuZF94KSB7Ci0JCQkJCWRfZXggPSBsYXN0X2VuZF94IC0gZV9vZmZzZXRfeCAtIGVfc3BhY2luZ194OwotCQkJCQljb2xfZW5kID0gTWF0aC5taW4oZ2V0U2VsZWN0ZWRDb2woZF9leCwgdHJ1ZSkgKyAxLCBnZXRNYXhDb2woKSk7Ci0JCQkJfQotCQkJCWlmIChlX3kgPiBsYXN0X2VuZF95KSB7Ci0JCQkJCWRfc3kgPSBsYXN0X2VuZF95IC0gZV9vZmZzZXRfeSArIGVfc3BhY2luZ195OwotCQkJCQlyb3dfc3RhcnQgPSBNYXRoLm1heCgwLCBnZXRTZWxlY3RlZFJvdyhkX3N5LCB0cnVlKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCW1vdmluZ1NlbGVjdGlvbkVuZCA9IG5ldyBQb2ludChlbmRfcHQueCwgZW5kX3B0LnkpOwotCQlyZWRyYXdCeUluZGV4KGNvbF9zdGFydCwgY29sX2VuZCwgcm93X3N0YXJ0LCByb3dfZW5kLCBkaXJlY3Rpb24sIGlzU2Nyb2xsaW5nKTsKLQkJLy9yZWRyYXdCeUxvY2F0aW9uKGRfc3gsIGRfZXgsIGRfc3ksIGRfZXksIGRpcmVjdGlvbiwgaXNTY3JvbGxpbmcpOwotCX0KLQkvKiogUmVkcmF3IGJ5IGxvY2F0aW9uCi0JICogQHBhcmFtIGRfc3gKLQkgKiBAcGFyYW0gZF9leAotCSAqIEBwYXJhbSBkX3N5Ci0JICogQHBhcmFtIGRfZXkKLQkgKiBAcGFyYW0gZGlyZWN0aW9uCi0JICogQHBhcmFtIGlzU2Nyb2xsaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3QnlMb2NhdGlvbihpbnQgZF9zeCwgaW50IGRfZXgsIGludCBkX3N5LCBpbnQgZF9leSwgaW50IGRpcmVjdGlvbiwgYm9vbGVhbiBpc1Njcm9sbGluZykgewotCQlpbnQgZF94ID0gZF9zeDsKLQkJaW50IGRfeSA9IGRfc3kgKyAoKGRpcmVjdGlvbj09Tld8fGRpcmVjdGlvbj09TkUpPyhpc1Njcm9sbGluZyA/IGdldFZlcnRpY2FsSW5jcmVtZW50KCk6MCk6MCk7Ci0JCWludCBkX3cgPSBlX29mZnNldF94ICsgTWF0aC5hYnMoZF9leCAtIGRfc3gpOwotCQlpbnQgZF9oID0gZV9vZmZzZXRfeSArIE1hdGguYWJzKGRfZXkgLSBkX3N5KSArICgoZGlyZWN0aW9uPT1TRXx8ZGlyZWN0aW9uPT1TVyk/KGlzU2Nyb2xsaW5nID8gZ2V0VmVydGljYWxJbmNyZW1lbnQoKTowKTowKTsgCi0JCXJlZHJhdyhkX3gsIGRfeSwgZF93LCBkX2gsIGZhbHNlKTsKLQl9Ci0JLyoqIFJlZHJhdyBieSBpbmRleAotCSAqIEBwYXJhbSBjb2xfc3RhcnQKLQkgKiBAcGFyYW0gY29sX2VuZAotCSAqIEBwYXJhbSByb3dfc3RhcnQKLQkgKiBAcGFyYW0gcm93X2VuZAotCSAqIEBwYXJhbSBkaXJlY3Rpb24KLQkgKiBAcGFyYW0gaXNTY3JvbGxpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdCeUluZGV4KGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBpbnQgcm93X3N0YXJ0LCBpbnQgcm93X2VuZCwgaW50IGRpcmVjdGlvbiwgYm9vbGVhbiBpc1Njcm9sbGluZykgewotCQlpbnQgcmVkcmF3U3RhcnRfeCA9IGVfb2Zmc2V0X3ggKyAoY29sX3N0YXJ0ICogZ2V0RWxlbWVudFdpZHRoKCkpIC0gZV9zcGFjaW5nX3g7Ci0JCWludCByZWRyYXdFbmRfeCA9IGVfb2Zmc2V0X3ggKyAoY29sX2VuZCAqIGdldEVsZW1lbnRXaWR0aCgpKSArIGVfc3BhY2luZ194OwotCQlpbnQgcmVkcmF3U3RhcnRfeSA9IGVfb2Zmc2V0X3kgKyAocm93X3N0YXJ0ICogZ2V0RWxlbWVudEhlaWdodCgpKSAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotCQlpbnQgcmVkcmF3RW5kX3kgPSBlX29mZnNldF95ICsgKHJvd19lbmQgKiBnZXRFbGVtZW50SGVpZ2h0KCkpICsgdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCWludCBtYXJnaW5feCA9IGdldEVsZW1lbnRXaWR0aCgpICsgc2VsX3NpemU7Ci0JCWludCBtYXJnaW5feSA9IGdldEVsZW1lbnRIZWlnaHQoKSArIHNlbF9zaXplOwotCQlpbnQgZF94ID0gTWF0aC5tYXgoMCwgKHJlZHJhd1N0YXJ0X3ggLSBtYXJnaW5feCkpOwotCQlpbnQgZF95ID0gTWF0aC5tYXgoMCwgKHJlZHJhd1N0YXJ0X3kgLSBtYXJnaW5feSkpICsgKChkaXJlY3Rpb249PU5XfHxkaXJlY3Rpb249PU5FKT8oaXNTY3JvbGxpbmcgPyBnZXRWZXJ0aWNhbEluY3JlbWVudCgpOjApOjApOwotCQlpbnQgZF93ID0gTWF0aC5hYnMocmVkcmF3RW5kX3ggLSByZWRyYXdTdGFydF94KSArIChtYXJnaW5feCoyKTsKLQkJaW50IGRfaCA9IE1hdGguYWJzKHJlZHJhd0VuZF95IC0gcmVkcmF3U3RhcnRfeSkgKyAobWFyZ2luX3kqMikgKyAoKGRpcmVjdGlvbj09U0V8fGRpcmVjdGlvbj09U1cpPyhpc1Njcm9sbGluZyA/IGdldFZlcnRpY2FsSW5jcmVtZW50KCk6MCk6MCk7Ci0JCWlmIChkX3ggPCBlX29mZnNldF94KSB7Ci0JCQlkX3ggPSAwOwotCQkJZF93ICs9IGVfb2Zmc2V0X3g7Ci0JCX0KLQkJcmVkcmF3KGRfeCwgZF95LCBkX3csIGRfaCwgZmFsc2UpOwotCX0KLQkvKiogUmVkcmF3Ci0JICogQHBhcmFtIHN0YXJ0X2luZGV4Ci0JICogQHBhcmFtIGVuZF9pbmRleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZHJhdyhpbnQgc3RhcnRfaW5kZXgsIGludCBlbmRfaW5kZXgpIHsKLQkJaW50IG1heF9jb2wgPSBnZXRNYXhDb2woKTsKLQkJaW50IHN0YXJ0X3JvdyA9IChpbnQpIE1hdGguZmxvb3Ioc3RhcnRfaW5kZXggLyBtYXhfY29sKTsKLQkJaW50IHN0YXJ0X3lfbG9jID0gKHN0YXJ0X3JvdyAqIGdldEVsZW1lbnRIZWlnaHQoKSArIGVfb2Zmc2V0X3kpIC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCWludCBlbmRfcm93ID0gKGludCkgTWF0aC5mbG9vcihlbmRfaW5kZXggLyBtYXhfY29sKTsKLQkJaW50IGVuZF95X2xvYyA9IChlbmRfcm93ICogZ2V0RWxlbWVudEhlaWdodCgpICsgZV9vZmZzZXRfeSkgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldDsKLQkJaW50IGRpZmYgPSBNYXRoLmFicyhlbmRfcm93IC0gc3RhcnRfcm93KSArIDE7Ci0JCXJlZHJhdygwLCBNYXRoLm1pbihzdGFydF95X2xvYywgZW5kX3lfbG9jKSwgKG1heF9jb2wgKiBnZXRFbGVtZW50V2lkdGgoKSArIGVfb2Zmc2V0X3gpLCBkaWZmICogZ2V0RWxlbWVudEhlaWdodCgpLCBmYWxzZSk7Ci0JfQotCS8qKiBzZWxlY3QgZWxlbWVudHMKLQkgKiBAcGFyYW0gc3RhcnRfaW5kZXgKLQkgKiBAcGFyYW0gZW5kX2luZGV4Ci0JICogQHBhcmFtIGNoZWNrU3RhdHVzCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgY2FuIGJlIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuU2VsZWN0RWxlbWVudHMoaW50IHN0YXJ0X2luZGV4LCBpbnQgZW5kX2luZGV4LCBib29sZWFuIGNoZWNrU3RhdHVzKSB7Ci0JCWlmIChzdGFydF9pbmRleCA9PSAtMSB8fCBlbmRfaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJc2VsZWN0RWxlbWVudHMoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCwgY2hlY2tTdGF0dXMpOwkJCQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqIHVuc2VsZWN0IGFsbCBlbGVtZW50cwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0QWxsRWxlbWVudHMoKSB7Ci0JCXNlbGVjdGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJdGVtcFNlbGVjdGVkRWxlbWVudHMuY2xlYXIoKTsKLQl9Ci0JLyoqIFNlbGVjdCBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4IEVsZW1lbnQgaW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdXRvU2VsZWN0VW5zZWxlY3RFbGVtZW50KGludCBpbmRleCkgewotCQlpZiAoaXNTZWxlY3RlZChpbmRleCkpIHsKLQkJCXNlbGVjdGVkRWxlbWVudHMuY2xlYXIoaW5kZXgpOwotCQl9IGVsc2UgewotCQkJc2VsZWN0ZWRFbGVtZW50cy5zZXQoaW5kZXgpOwotCQl9Ci0JfQotCS8qKiBJcyBlbGVtZW50IHNlbGVjdGVkCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKGludCBpbmRleCkgewotCQlyZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5nZXQoaW5kZXgpOwotCX0KLQkvKiogdW5zZWxlY3QgZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleCBUYXJnZXQgZWxlbWVudCBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJc2VsZWN0ZWRFbGVtZW50cy5jbGVhcihpbmRleCk7Ci0JfQotCS8qKiBzZWxlY3QgZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCXNlbGVjdGVkRWxlbWVudHMuc2V0KGluZGV4KTsKLQkJZmlyc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7Ci0JCS8vc2VsZWN0aW9uID0gZmluZExvY2F0aW9uKGluZGV4KTsKLQkJLy9hY3R1YWxTY3JvbGxTdGFydF95ID0gc2VsZWN0aW9uLnkgKyB2ZXJ0aWNhbFNjcm9sbE9mZnNldDsKLQl9Ci0JLyoqIFNlbGVjdCBlbGVtZW50cyAKLQkgKiBAcGFyYW0gZnJvbV9pbmRleAotCSAqIEBwYXJhbSB0b19pbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdEVsZW1lbnRzKGludCBmcm9tX2luZGV4LCBpbnQgdG9faW5kZXgpIHsKLQkJc2VsZWN0RWxlbWVudHMoZnJvbV9pbmRleCwgdG9faW5kZXgsIGZhbHNlKTsKLQl9Ci0JLyoqIFNlbGVjdCBlbGVtZW50cwotCSAqIEBwYXJhbSBmcm9tX2luZGV4Ci0JICogQHBhcmFtIHRvX2luZGV4Ci0JICogQHBhcmFtIGNoZWNrU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0RWxlbWVudHMoaW50IGZyb21faW5kZXgsIGludCB0b19pbmRleCwgYm9vbGVhbiBjaGVja1N0YXR1cykgewotCQlmb3IgKGludCBpbmRleCA9IGZyb21faW5kZXg7IGluZGV4IDwgdG9faW5kZXggKyAxOyBpbmRleCsrKSB7Ci0JCQlpZiAoY2hlY2tTdGF0dXMpCi0JCQkJYXV0b1NlbGVjdFVuc2VsZWN0RWxlbWVudChpbmRleCk7Ci0JCQllbHNlCi0JCQkJc2VsZWN0ZWRFbGVtZW50cy5zZXQoaW5kZXgpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHVuc2VsZWN0RWxlbWVudHMoaW50IGZyb21faW5kZXgsIGludCB0b19pbmRleCkgewotCQlmb3IgKGludCBpbmRleCA9IGZyb21faW5kZXg7IGluZGV4IDwgdG9faW5kZXggKyAxOyBpbmRleCsrKSB7Ci0JCQlzZWxlY3RlZEVsZW1lbnRzLmNsZWFyKGluZGV4KTsKLQkJfQotCX0KLQkvKiogUGFpbnQgdGhlIHZpZXcKLQkgKiBAcGFyYW0gZ2MKLQkgKiBAcGFyYW0gY29sX3N0YXJ0Ci0JICogQHBhcmFtIGNvbF9lbmQKLQkgKiBAcGFyYW0gcm93X3N0YXJ0Ci0JICogQHBhcmFtIHJvd19lbmQKLQkgKiBAcGFyYW0gcmVuZGVyX3gKLQkgKiBAcGFyYW0gcmVuZGVyX3kKLQkgKiBAcGFyYW0gcmVuZGVyV2lkdGgKLQkgKiBAcGFyYW0gcmVuZGVySGVpZ2h0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVBhaW50KEdDIGdjLCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCwgaW50IHJvd19zdGFydCwgaW50IHJvd19lbmQsIGludCByZW5kZXJfeCwgaW50IHJlbmRlcl95LCBpbnQgcmVuZGVyV2lkdGgsIGludCByZW5kZXJIZWlnaHQpIHsKLQkJSW1hZ2UgaW1hZ2VCdWZmZXIgPSBudWxsOwotCQlHQyBuZXdHQyA9IG51bGw7Ci0JCWlmIChET1VCTEVfQlVGRkVSKSB7Ci0JCQlpbWFnZUJ1ZmZlciA9IG5ldyBJbWFnZShnZXREaXNwbGF5KCksIHJlbmRlcldpZHRoLCByZW5kZXJIZWlnaHQpOwotCQkJbmV3R0MgPSBuZXcgR0MoaW1hZ2VCdWZmZXIsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJfSBlbHNlIHsKLQkJCW5ld0dDID0gZ2M7Ci0JCX0KLQkJbmV3R0Muc2V0Rm9udChnZXRGb250KCkpOwotCQkvL2RyYXcgbWFyZ2luIGJhY2tncm91bmQKLQkJaWYgKGlzRGlzcGxheVJ1bGVyKCkpIHsKLQkJCW5ld0dDLnNldEJhY2tncm91bmQobWFyZ2luX2NvbG9yKTsKLQkJCW5ld0dDLmZpbGxSZWN0YW5nbGUoMCwgMCwgZV9vZmZzZXRfeCAtIGVfc3BhY2luZ194LCBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJfQotCi0JCWludCB0b3RhbCA9IGdldFRvdGFsRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgcm93X2NvdW50ID0gcm93X3N0YXJ0OyByb3dfY291bnQgPCByb3dfZW5kOyByb3dfY291bnQrKykgewotCQkJZm9yIChpbnQgY29sX2NvdW50ID0gY29sX3N0YXJ0OyBjb2xfY291bnQgPCBjb2xfZW5kOyBjb2xfY291bnQrKykgewotCQkJCWludCBpbmRleCA9IGZpbmRTZWxlY3RlZEluZGV4KHJvd19jb3VudCwgY29sX2NvdW50KTsKLQkJCQlpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IHRvdGFsKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBnZXRPYmplY3QoaW5kZXgpOwotCQkJCQkKLQkJCQkJaW50IHhfbG9jID0gZV9vZmZzZXRfeCArICgoY29sX2NvdW50KSAqIGdldEVsZW1lbnRXaWR0aCgpKTsKLQkJCQkJaW50IHlfbG9jID0gZV9vZmZzZXRfeSArICgocm93X2NvdW50KSAqIGdldEVsZW1lbnRIZWlnaHQoKSkgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldDsKLQkJCQkJaWYgKGNvbF9jb3VudCA9PSAwICYmIGlzRGlzcGxheVJ1bGVyKCkpIHsKLQkJCQkJCWRyYXdJbmRleChuZXdHQywgb2JqLCBpbmRleCwgeV9sb2MpOwotCQkJCQl9Ci0JCQkJCWRyYXdJbWFnZShuZXdHQywgb2JqLCBpbmRleCwgeF9sb2MsIHlfbG9jLCAoc2VsZWN0ZWRFbGVtZW50cy5nZXQoaW5kZXgpIHx8IHRlbXBTZWxlY3RlZEVsZW1lbnRzLmdldChpbmRleCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1vdmluZ1NlbGVjdGlvblN0YXJ0ICE9IG51bGwgJiYgbW92aW5nU2VsZWN0aW9uRW5kICE9IG51bGwpIHsKLQkJCWRyYXdTZWxlY3Rpb24obmV3R0MpOwotCQl9Ci0JCWlmIChET1VCTEVfQlVGRkVSKSB7Ci0JCQlnYy5kcmF3SW1hZ2UoaW1hZ2VCdWZmZXIsIHJlbmRlcl94LCByZW5kZXJfeSk7Ci0JCQluZXdHQy5kaXNwb3NlKCk7Ci0JCQlpbWFnZUJ1ZmZlci5kaXNwb3NlKCk7Ci0JCX0KLQkJY2xlYXJNYXJnaW4oZ2MsIGdldEJhY2tncm91bmQoKSk7Ci0JfQotCS8qKiBEcmF3IGluZGV4Ci0JICogQHBhcmFtIGdjCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSB5X2xvYwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdJbmRleChHQyBnYywgT2JqZWN0IG9iaiwgaW50IGluZGV4LCBpbnQgeV9sb2MpIHsKLQkJU3RyaW5nIHRleHQgPSBjb250ZW50UHJvdmlkZXIuZ2V0UnVsZXJJbmRleChvYmosIGluZGV4KTsKLQkJUG9pbnQgdGV4dF9zaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCQlpbnQgYWxpZ24gPSAgZV9vZmZzZXRfeCAtIGVfc3BhY2luZ194IC0gdGV4dF9zaXplLng7Ci0JCWludCB2YWxpZ24gPSB5X2xvYyArIGVfaGVpZ2h0LzIgLSB0ZXh0X3NpemUueS8yIDsKLQkJZ2MuZHJhd1RleHQodGV4dCwgYWxpZ24sIHZhbGlnbik7Ci0JfQotCS8qKiBEcmF3IGltYWdlCi0JICogQHBhcmFtIGdjCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSB4X2xvYwotCSAqIEBwYXJhbSB5X2xvYwotCSAqIEBwYXJhbSBpc1NlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0ltYWdlKEdDIGdjLCBPYmplY3Qgb2JqLCBpbnQgaW5kZXgsIGludCB4X2xvYywgaW50IHlfbG9jLCBib29sZWFuIGlzU2VsZWN0ZWQpIHsKLQkJSW1hZ2Ugc3RhdHVzSW1hZ2UgPSBnZXRTdGF0dXNJY29uKG9iaiwgaW5kZXgsIGlzU2VsZWN0ZWQpOwotCQlpZiAoc3RhdHVzSW1hZ2UgIT0gbnVsbCkgewotCQkJZ2MuZHJhd0ltYWdlKHN0YXR1c0ltYWdlLCB4X2xvYywgeV9sb2MpOwotCQkJZHJhd1NwZWNpYWwob2JqLCBpbmRleCwgZ2MsIHhfbG9jLCB5X2xvYywgZV93aWR0aCwgZV9oZWlnaHQpOwotCQl9Ci0JfQotCS8qKiBEcmF3IHNlbGVjdGlvbgotCSAqIEBwYXJhbSBnYwotCSAqLwotCXByaXZhdGUgdm9pZCBkcmF3U2VsZWN0aW9uKEdDIGdjKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoc2VsX2NvbG9yKTsKLQkJZ2Muc2V0TGluZVdpZHRoKHNlbF9zaXplKTsKLQkJUG9pbnQgc3RhdGlvbmFyeV9wdCA9IGdldFN0YXJ0ZWRQb2ludChtb3ZpbmdTZWxlY3Rpb25TdGFydC54LCBtb3ZpbmdTZWxlY3Rpb25TdGFydC55KTsKLQkJaW50IHN0YXJ0X3ggPSBzdGF0aW9uYXJ5X3B0Lng7Ci0JCWludCBzdGFydF95ID0gc3RhdGlvbmFyeV9wdC55OwotCQlpbnQgZW5kX3ggPSAwOwotCQlpbnQgZW5kX3kgPSAwOwotCQlzd2l0Y2ggKGdldERpcmVjdGlvbihtb3ZpbmdTZWxlY3Rpb25TdGFydC54LCBtb3ZpbmdTZWxlY3Rpb25TdGFydC55LCBtb3ZpbmdTZWxlY3Rpb25FbmQueCwgbW92aW5nU2VsZWN0aW9uRW5kLnkpKSB7Ci0JCWNhc2UgU0U6Ci0JCQl3aGlsZSAoc3RhcnRfeCA8IG1vdmluZ1NlbGVjdGlvbkVuZC54KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhcnRfeCwgc3RhdGlvbmFyeV9wdC55LCBzdGFydF94ICsgc2VsX2xlbmd0aCwgc3RhdGlvbmFyeV9wdC55KTsKLQkJCQlzdGFydF94ICs9IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQl3aGlsZSAoc3RhcnRfeSA8IG1vdmluZ1NlbGVjdGlvbkVuZC55KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhdGlvbmFyeV9wdC54LCBzdGFydF95LCBzdGF0aW9uYXJ5X3B0LngsIHN0YXJ0X3kgKyBzZWxfbGVuZ3RoKTsKLQkJCQlzdGFydF95ICs9IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQlzdGFydF94IC09IHNlbF9nYXA7Ci0JCQlzdGFydF95IC09IHNlbF9nYXA7Ci0JCQllbmRfeCA9IHN0YXJ0X3g7Ci0JCQllbmRfeSA9IHN0YXJ0X3k7Ci0JCQlpZiAoaXNSZWFjaEJvdHRvbSgpIHx8IG1vdmluZ1NlbGVjdGlvbkVuZC55IDwgZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCkgewotCQkJCXdoaWxlIChlbmRfeCA+IHN0YXRpb25hcnlfcHQueCkgewotCQkJCQlnYy5kcmF3TGluZShlbmRfeCAtIHNlbF9sZW5ndGgsIHN0YXJ0X3ksIGVuZF94LCBzdGFydF95KTsKLQkJCQkJZW5kX3ggLT0gKHNlbF9sZW5ndGggKiBzZWxfZ2FwKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoZW5kX3kgPiBzdGF0aW9uYXJ5X3B0LnkpIHsKLQkJCQlnYy5kcmF3TGluZShzdGFydF94LCBlbmRfeSAtIHNlbF9sZW5ndGgsIHN0YXJ0X3gsIGVuZF95KTsKLQkJCQllbmRfeSAtPSAoc2VsX2xlbmd0aCAqIHNlbF9nYXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1c6Ci0JCQl3aGlsZSAoc3RhcnRfeCA+IG1vdmluZ1NlbGVjdGlvbkVuZC54KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhcnRfeCAtIHNlbF9sZW5ndGgsIHN0YXRpb25hcnlfcHQueSwgc3RhcnRfeCwgc3RhdGlvbmFyeV9wdC55KTsKLQkJCQlzdGFydF94IC09IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQl3aGlsZSAoc3RhcnRfeSA8IG1vdmluZ1NlbGVjdGlvbkVuZC55KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhdGlvbmFyeV9wdC54LCBzdGFydF95LCBzdGF0aW9uYXJ5X3B0LngsIHN0YXJ0X3kgKyBzZWxfbGVuZ3RoKTsKLQkJCQlzdGFydF95ICs9IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQlzdGFydF94ICs9IHNlbF9nYXA7Ci0JCQlzdGFydF95IC09IHNlbF9nYXA7Ci0JCQllbmRfeCA9IHN0YXJ0X3g7Ci0JCQllbmRfeSA9IHN0YXJ0X3k7Ci0JCQlpZiAoaXNSZWFjaEJvdHRvbSgpIHx8IG1vdmluZ1NlbGVjdGlvbkVuZC55IDwgZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCkgewotCQkJCXdoaWxlIChlbmRfeCA8IHN0YXRpb25hcnlfcHQueCkgewotCQkJCQlnYy5kcmF3TGluZShlbmRfeCwgc3RhcnRfeSwgZW5kX3ggKyBzZWxfbGVuZ3RoLCBzdGFydF95KTsKLQkJCQkJZW5kX3ggKz0gKHNlbF9sZW5ndGggKiBzZWxfZ2FwKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoZW5kX3kgPiBzdGF0aW9uYXJ5X3B0LnkpIHsKLQkJCQlnYy5kcmF3TGluZShzdGFydF94LCBlbmRfeSAtIHNlbF9sZW5ndGgsIHN0YXJ0X3gsIGVuZF95KTsKLQkJCQllbmRfeSAtPSAoc2VsX2xlbmd0aCAqIHNlbF9nYXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTlc6Ci0JCQl3aGlsZSAoc3RhcnRfeCA+IG1vdmluZ1NlbGVjdGlvbkVuZC54KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhcnRfeCAtIHNlbF9sZW5ndGgsIHN0YXRpb25hcnlfcHQueSwgc3RhcnRfeCwgc3RhdGlvbmFyeV9wdC55KTsKLQkJCQlzdGFydF94IC09IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQl3aGlsZSAoc3RhcnRfeSA+IG1vdmluZ1NlbGVjdGlvbkVuZC55KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhdGlvbmFyeV9wdC54LCBzdGFydF95IC0gc2VsX2xlbmd0aCwgc3RhdGlvbmFyeV9wdC54LCBzdGFydF95KTsKLQkJCQlzdGFydF95IC09IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQlzdGFydF94ICs9IHNlbF9nYXA7Ci0JCQlzdGFydF95ICs9IHNlbF9nYXA7Ci0JCQllbmRfeCA9IHN0YXJ0X3g7Ci0JCQllbmRfeSA9IHN0YXJ0X3k7Ci0JCQlpZiAoaXNSZWFjaFRvcCgpIHx8IG1vdmluZ1NlbGVjdGlvbkVuZC55ID4gMSkgewotCQkJCXdoaWxlIChlbmRfeCA8IHN0YXRpb25hcnlfcHQueCkgewotCQkJCQlnYy5kcmF3TGluZShlbmRfeCwgc3RhcnRfeSwgZW5kX3ggKyBzZWxfbGVuZ3RoLCBzdGFydF95KTsKLQkJCQkJZW5kX3ggKz0gKHNlbF9sZW5ndGggKiBzZWxfZ2FwKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoZW5kX3kgPCBzdGF0aW9uYXJ5X3B0LnkpIHsKLQkJCQlnYy5kcmF3TGluZShzdGFydF94LCBlbmRfeSwgc3RhcnRfeCwgZW5kX3kgKyBzZWxfbGVuZ3RoKTsKLQkJCQllbmRfeSArPSAoc2VsX2xlbmd0aCAqIHNlbF9nYXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTkU6Ci0JCQl3aGlsZSAoc3RhcnRfeCA8IG1vdmluZ1NlbGVjdGlvbkVuZC54KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhcnRfeCwgc3RhdGlvbmFyeV9wdC55LCBzdGFydF94ICsgc2VsX2xlbmd0aCwgc3RhdGlvbmFyeV9wdC55KTsKLQkJCQlzdGFydF94ICs9IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQl3aGlsZSAoc3RhcnRfeSA+IG1vdmluZ1NlbGVjdGlvbkVuZC55KSB7Ci0JCQkJZ2MuZHJhd0xpbmUoc3RhdGlvbmFyeV9wdC54LCBzdGFydF95IC0gc2VsX2xlbmd0aCwgc3RhdGlvbmFyeV9wdC54LCBzdGFydF95KTsKLQkJCQlzdGFydF95IC09IChzZWxfbGVuZ3RoICogc2VsX2dhcCk7Ci0JCQl9Ci0JCQlzdGFydF94IC09IHNlbF9nYXA7Ci0JCQlzdGFydF95ICs9IHNlbF9nYXA7Ci0JCQllbmRfeCA9IHN0YXJ0X3g7Ci0JCQllbmRfeSA9IHN0YXJ0X3k7Ci0JCQlpZiAoaXNSZWFjaFRvcCgpIHx8IG1vdmluZ1NlbGVjdGlvbkVuZC55ID4gMSkgewotCQkJCXdoaWxlIChlbmRfeCA+IHN0YXRpb25hcnlfcHQueCkgewotCQkJCQlnYy5kcmF3TGluZShlbmRfeCAtIHNlbF9sZW5ndGgsIHN0YXJ0X3ksIGVuZF94LCBzdGFydF95KTsKLQkJCQkJZW5kX3ggLT0gKHNlbF9sZW5ndGggKiBzZWxfZ2FwKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoZW5kX3kgPCBzdGF0aW9uYXJ5X3B0LnkpIHsKLQkJCQlnYy5kcmF3TGluZShzdGFydF94LCBlbmRfeSwgc3RhcnRfeCwgZW5kX3kgKyBzZWxfbGVuZ3RoKTsKLQkJCQllbmRfeSArPSAoc2VsX2xlbmd0aCAqIHNlbF9nYXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyoqIENsZWFyIG1hcmdpbiBiYWNrZ3JvdW5kCi0JICogQHBhcmFtIGdjCi0JICogQHBhcmFtIGJhY2tncm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhck1hcmdpbihHQyBnYywgQ29sb3IgYmFja2dyb3VuZCkgewotCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCX0KLQkvKiogR2V0IEdDCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBHQyBnZXRHQygpIHsKLQkJcmV0dXJuIGdldEdDKFNXVC5OT05FKTsKLQl9Ci0JLyoqIEdldCBHQyBieSBjcmVhdGluZyBhIG5ldwotCSAqIEBwYXJhbSBzdHlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgR0MgZ2V0R0MoaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgR0ModGhpcywgc3R5bGUpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sI3NldEN1cnNvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7Ci0JCWlmIChjdXJzb3IgPT0gbnVsbCkgewotCQkJc3VwZXIuc2V0Q3Vyc29yKGRlZmF1bHRDdXJzb3IpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCX0KLQl9Ci0JCi0JLyoqIERvIG1vdXNlIG1vdmluZwotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvTW91c2VNb3ZpbmcoRXZlbnQgZXZlbnQpIHsKLQkJaW50IGluZGV4ID0gZmluZFNlbGVjdGVkSW5kZXhCeUxvY2F0aW9uKGV2ZW50LngsIGV2ZW50LnksIGZhbHNlKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCXNldEN1cnNvcihuZXcgQ3Vyc29yKGdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9IQU5EKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRDdXJzb3IobnVsbCk7Ci0JCX0KLQkJaGlkZVRvb2xUaXAoKTsKLQl9Ci0JLyoqIEhpZGUgdG9vbHRpcAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVUb29sVGlwKCkgewotCQlpZiAoZkluZm9ybWF0aW9uQ29udHJvbCAhPSBudWxsKSB7Ci0JCQlmSW5mb3JtYXRpb25Db250cm9sLnNldFZpc2libGUoZmFsc2UpOwotCQkJaWYgKGZJbmZvcm1hdGlvbkNvbnRyb2wgIT0gbnVsbCkKLQkJCQlmSW5mb3JtYXRpb25Db250cm9sLmRpc3Bvc2UoKTsKLQkJfQotCQlkaXNhYmxlVG9vbHRpcFRpbWVyKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRpc2FibGVUb29sdGlwVGltZXIoKSB7Ci0JCWlmIChob3ZlclRpbWVyICE9IG51bGwpIHsKLQkJCWhvdmVyVGltZXIuY2FuY2VsKCk7Ci0JCQkvL2hvdmVyVGltZXIucHVyZ2UoKTsKLQkJCWhvdmVyVGltZXIgPSBudWxsOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVRvb2x0aXBUaW1lcigpIHsKLQkJaWYgKCFzaG93X3Rvb2x0aXBfYWxsdGhldGltZSAmJiBmSW5mb3JtYXRpb25Db250cm9sICE9IG51bGwpIHsKLQkJCWdldEhvdmVyVGltZXIoKS5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGlkZVRvb2xUaXAoKTsJCQkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9LCB0b29sdGlwX3RpbWVvdXQpOwotCQl9Ci0JfQotCS8qKiBHZXQgaG92ZXIgdGltZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUaW1lciBnZXRIb3ZlclRpbWVyKCkgewotCQlpZiAoaG92ZXJUaW1lciA9PSBudWxsKSB7Ci0JCQlob3ZlclRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCX0KLQkJcmV0dXJuIGhvdmVyVGltZXI7Ci0JfQotCS8qKiBSZXNldCBpbmZvCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRJbmZvKCkgewotCQloaWRlVG9vbFRpcCgpOwotCQltb3VzZURvd24gPSBmYWxzZTsKLQkJbW91c2VEb3VibGVDbGljayA9IGZhbHNlOwotCQltb3ZpbmdTZWxlY3Rpb25TdGFydCA9IG51bGw7Ci0JCW1vdmluZ1NlbGVjdGlvbkVuZCA9IG51bGw7Ci0JCW1heF9lX3JvdyA9IC0xOwotCQltYXhfZV9jb2wgPSAtMTsKLQkJc2V0Q3Vyc29yKG51bGwpOwotCX0KLQkvKiogSGFuZGxlIGRpc3Bvc2UgZXZlbnQKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKEV2ZW50IGV2ZW50KSB7Ci0JCXJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTm9uZTsKLQkJcmVzZXRJbmZvKCk7Ci0JCWtleUFjdGlvbk1hcCA9IG51bGw7Ci0JCWRlZmF1bHRDdXJzb3IuZGlzcG9zZSgpOwotCQlkZWZhdWx0Q3Vyc29yID0gbnVsbDsKLQkJYWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCXRvdGFsX2VsZW1lbnRzID0gMDsKLQl9Ci0JLyoqIEhhbmRsZSBrZXkgZG93biBldmVudAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUtleURvd24oRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmRvaXQgPT0gdHJ1ZSkgewotCQkJaGFuZGxlS2V5KGV2ZW50KTsKLQkJfQotCX0KLQkvKiogSGFuZGxlIGtleSB1cCBldmVudAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUtleVVwKEV2ZW50IGV2ZW50KSB7Ci0JCXJlc2V0SW5mbygpOwotCX0KLQkvKiogSGFuZGxlIG1vdXNlIGRvd24gZXZlbnQKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNb3VzZURvd24oRXZlbnQgZXZlbnQpIHsKLQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJbW91c2VEb3VibGVDbGljayA9IGZhbHNlOwotCQlpZiAoZ2V0VG90YWxFbGVtZW50cygpID09IDAgfHwgKGV2ZW50LmJ1dHRvbiAhPSAxKSB8fCAoSVNfQ0FSQk9OICYmIChldmVudC5zdGF0ZU1hc2sgJiBTV1QuTU9ENCkgIT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIGlzQ3RybCA9IChldmVudC5zdGF0ZU1hc2sgJiBTV1QuTU9EMSkgIT0gMDsKLQkJYm9vbGVhbiBpc1NoaWZ0ID0gKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5NT0QyKSAhPSAwOwotCQkKLQkJaW50IGVuZCA9IGZpbmRTZWxlY3RlZEluZGV4QnlMb2NhdGlvbihldmVudC54LCBldmVudC55LCBmYWxzZSk7Ci0JCWludCBzdGFydCA9IGlzU2hpZnQ/Zmlyc3RTZWxlY3RlZEluZGV4OmVuZDsKLQotCQlpZiAoc3RhcnQgPT0gLTEpCi0JCQlzdGFydCA9IGVuZDsKLQkJCi0JCWlmIChzdGFydCA+IGVuZCkgey8vIHN3YXJwCi0JCQlpbnQgdG1wID0gc3RhcnQ7Ci0JCQlzdGFydCA9IGVuZDsKLQkJCWVuZCA9IHRtcDsKLQkJfQotCi0JCWlmIChJU19DQVJCT04pIHsvLyBtYWMKLQkJCWlmIChzdGFydCA+IC0xICYmIGVuZCA+IC0xICYmICFpc0N0cmwpIHsKLQkJCQlmaXJzdFNlbGVjdGVkSW5kZXggPSBzdGFydDsKLQkJCQlzZWNvbmRTZWxlY3RlZEluZGV4ID0gZW5kOwotCQkJfQotCQkJaWYgKGlzU2hpZnQpIHsKLQkJCQlpZiAoZmlyc3RTZWxlY3RlZEluZGV4ID4gLTEgJiYgc2Vjb25kU2VsZWN0ZWRJbmRleCA+IC0xICYmIGZpcnN0U2VsZWN0ZWRJbmRleCA8IHNlY29uZFNlbGVjdGVkSW5kZXgpIHsKLQkJCQkJZW5kID0gc2Vjb25kU2VsZWN0ZWRJbmRleDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoSVNfR1RLIHx8IElTX01PVElGKSB7Ly8gbGludXgKLQkJCWlmIChpc1NoaWZ0ICYmIGlzQ3RybCkgey8vb25seSBhcHBseSBjdHJsIGlmIGJvdGgga2V5cyBwcmVzc2VkCi0JCQkJaXNTaGlmdCA9IGZhbHNlOwotCQkJCWlmIChzdGFydCA8IHNlY29uZFNlbGVjdGVkSW5kZXgpCi0JCQkJCWVuZCA9IHN0YXJ0OwotCQkJCWVsc2UKLQkJCQkJc3RhcnQgPSBlbmQ7Ci0JCQl9Ci0JCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiAtMSAmJiAoIWlzU2hpZnQgfHwgc3RhcnQgPT0gZW5kKSkgey8vZ2V0IGxhc3Qgc2VsZWN0aW9uIGlmIG5vIHNoaWZ0IG9yIHN0YXJ0PT1lbmQKLQkJCQlmaXJzdFNlbGVjdGVkSW5kZXggPSBzdGFydDsKLQkJCQlzZWNvbmRTZWxlY3RlZEluZGV4ID0gZW5kOwotCQkJfQotCQl9Ci0JCWVsc2Ugey8vIG90aGVycyBlZy4gd2luZG93cwotCQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gLTEgJiYgKCFpc1NoaWZ0IHx8IHN0YXJ0ID09IGVuZCkpIHsvL2dldCBsYXN0IHNlbGVjdGlvbiBpZiBubyBzaGlmdCBvciBzdGFydD09ZW5kCi0JCQkJZmlyc3RTZWxlY3RlZEluZGV4ID0gc3RhcnQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFpc1NoaWZ0ICYmICFpc0N0cmwpIHsgLy9ubyBzaGlmdCwgbm8gY3RybAotCQkJdW5zZWxlY3RBbGxFbGVtZW50cygpOwotCQl9Ci0JCWlmIChzdGFydCA+IC0xICYmIGVuZCA+IC0xICYmIGlzU2hpZnQgJiYgIWlzQ3RybCkgeyAvL3NoaWZ0Ci0JCQl1bnNlbGVjdEFsbEVsZW1lbnRzKCk7Ci0JCX0KLQkJaWYgKChzdGFydCA9PSAtMSB8fCBlbmQgPT0gLTEpICYmICFpc1NoaWZ0ICYmICFpc0N0cmwpIHsvL2NsZWFyIGFsbCBlbGVtZW50ZCBpZiBubyBzZWxlY3RlZAotCQkJdW5zZWxlY3RBbGxFbGVtZW50cygpOwotCQkJZmlyc3RTZWxlY3RlZEluZGV4ID0gLTE7Ci0JCQlzZWNvbmRTZWxlY3RlZEluZGV4ID0gLTE7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCWFjdHVhbFNjcm9sbFN0YXJ0X3kgPSBzZWxlY3Rpb24ueSArIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotCQljYW5TZWxlY3RFbGVtZW50cyhzdGFydCwgZW5kLCAoaXNDdHJsICYmICFpc1NoaWZ0KSk7Ci0JCXJlZHJhdygpOwotCX0KLQkvKiogSGFuZGxlIG1vdXNlIHVwIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW91c2VVcChFdmVudCBldmVudCkgewotCQlzZWxlY3RlZEVsZW1lbnRzLm9yKHRlbXBTZWxlY3RlZEVsZW1lbnRzKTsKLQkJaWYgKG1vdmluZ1NlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHsKLQkJCXJlZHJhdygpOwotCQl9Ci0JCXJlc2V0SW5mbygpOwotCQllbmRBdXRvU2Nyb2xsKCk7Ci0JfQotCS8qKiBIYW5kbGUgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW91c2VEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZXNldEluZm8oKTsKLQkJbW91c2VEb3VibGVDbGljayA9IHRydWU7Ci0JCWludCBpbmRleCA9IGZpbmRTZWxlY3RlZEluZGV4QnlMb2NhdGlvbihldmVudC54LCBldmVudC55LCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlmaXJlQWN0aW9uKElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIuRE9VQkxFX0NMSUNLX0FDVElPTiwgaW5kZXgpOwotCQkJcmVkcmF3KGluZGV4LCBpbmRleCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW91c2VIb3ZlcihFdmVudCBldmVudCkgewotCQlpbnQgaW5kZXggPSBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oZXZlbnQueCwgZXZlbnQueSwgZmFsc2UpOwotCQlpZiAoaW5kZXggPiAtMSkgewotCQkJaWYgKGZJbmZvcm1hdGlvbkNvbnRyb2wgPT0gbnVsbCkKLQkJCQlzaG93VG9vbFRpcChpbmRleCwgZXZlbnQpOwotCQkJCi0JCQllbmFibGVUb29sdGlwVGltZXIoKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVUb29sVGlwKCk7Ci0JCX0KLQl9Ci0JLyoqIEhhbmRsZSBtb3VzZSBtb3ZlIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW91c2VNb3ZlKEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChhdXRvU2Nyb2xsRGlyZWN0aW9uID09IFNXVC5OVUxMKQotCQkJZG9Nb3VzZU1vdmluZyhldmVudCk7Ci0JCWlmICghbW91c2VEb3duIHx8IG1vdXNlRG91YmxlQ2xpY2sgfHwgZ2V0VG90YWxFbGVtZW50cygpID09IDApCi0JCQlyZXR1cm47Ci0JCWlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5NT0QyKSAhPSAwKSB7IC8vc2hpZnQga2V5Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdXBkYXRlKCk7Ci0JCWRvQXV0b1Njcm9sbChldmVudC54LCBldmVudC55KTsKLQl9Ci0JLyoqIEhhbmRsZSBwYWludCBldmVudAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhaW50KEV2ZW50IGV2ZW50KSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlpZiAoZ2V0VG90YWxFbGVtZW50cygpID09IDAgfHwgZXZlbnQuaGVpZ2h0ID09IDAgfHwgKGNsaWVudEFyZWEud2lkdGggPT0gMCAmJiBjbGllbnRBcmVhLmhlaWdodCA9PSAwKSkgewotCQkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgd29yayB0byBkbwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGRlZmF1bHQKLQkJaW50IHJlbmRlcldpZHRoID0gY2xpZW50QXJlYS53aWR0aDsKLQkJaW50IHJlbmRlckhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0OwotCQlpbnQgY29sX3N0YXJ0ID0gMDsKLQkJaW50IGNvbF9lbmQgPSBnZXRNYXhDb2woKTsKLQkJaW50IHJvd19zdGFydCA9IDA7Ci0JCWludCByb3dfZW5kID0gZ2V0TWF4Q2xpZW50Um93KCk7Ci0JCWlmIChldmVudC55ID4gMCkgewotCQkJUG9pbnQgc3RhcnRfcHQgPSBudWxsOwotCQkJaWYgKG1vdmluZ1NlbGVjdGlvblN0YXJ0ICE9IG51bGwpCi0JCQkJc3RhcnRfcHQgPSBnZXRTdGFydGVkUG9pbnQobW92aW5nU2VsZWN0aW9uU3RhcnQueCwgbW92aW5nU2VsZWN0aW9uU3RhcnQueSk7Ci0JCQllbHNlCi0JCQkJc3RhcnRfcHQgPSBnZXRTdGFydGVkUG9pbnQoZXZlbnQueCArIGV2ZW50LndpZHRoLCBldmVudC55ICsgZXZlbnQuaGVpZ2h0KTsKLQkJCVBvaW50IGVuZF9wdCA9IGdldEZpbmlzaGVkUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlpbnQgc194ID0gc3RhcnRfcHQueDsKLQkJCWludCBlX3ggPSBlbmRfcHQueDsKLQkJCWludCBzX3kgPSBzdGFydF9wdC55OwotCQkJaW50IGVfeSA9IGVuZF9wdC55OwotCQkJc3dpdGNoIChnZXREaXJlY3Rpb24oc3RhcnRfcHQueCwgc3RhcnRfcHQueSwgZW5kX3B0LngsIGVuZF9wdC55KSkgewotCQkJY2FzZSBTVzoKLQkJCQlzX3ggPSBlbmRfcHQueDsKLQkJCQllX3ggPSBzdGFydF9wdC54OwotCQkJCWJyZWFrOwotCQkJY2FzZSBOVzoKLQkJCQlzX3ggPSBlbmRfcHQueDsKLQkJCQllX3ggPSBzdGFydF9wdC54OwotCQkJCXNfeSA9IGVuZF9wdC55OwotCQkJCWVfeSA9IHN0YXJ0X3B0Lnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5FOgotCQkJCXNfeSA9IGVuZF9wdC55OwotCQkJCWVfeSA9IHN0YXJ0X3B0Lnk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb2xfc3RhcnQgPSBNYXRoLm1heCgwLCBnZXRTZWxlY3RlZENvbChzX3ggLSBlX29mZnNldF94LCB0cnVlKSk7Ci0JCQljb2xfZW5kID0gTWF0aC5taW4oZ2V0U2VsZWN0ZWRDb2woZV94ICsgZXZlbnQud2lkdGggLSBlX29mZnNldF94LCB0cnVlKSArIDEsIGdldE1heENvbCgpKTsKLQkJCXJvd19zdGFydCA9IE1hdGgubWF4KDAsIGdldFNlbGVjdGVkUm93KHNfeSAtIGVfb2Zmc2V0X3ksIHRydWUpKTsKLQkJCXJvd19lbmQgPSBNYXRoLm1pbihnZXRTZWxlY3RlZFJvdyhlX3kgKyBldmVudC5oZWlnaHQgLSBlX29mZnNldF95LCB0cnVlKSArIDEsIGdldE1heFJvdygpKTsKLQkJCXJlbmRlcldpZHRoID0gc194ICsgZV94ICsgZXZlbnQud2lkdGg7Ci0JCQlyZW5kZXJIZWlnaHQgPSBzX3kgKyBlX3kgKyBldmVudC5oZWlnaHQ7Ci0JCX0gZWxzZSB7Ci0JCQlyb3dfc3RhcnQgPSBNYXRoLm1heCgwLCBjdXJyZW50X3RvcF9yb3cpOwotCQkJcm93X2VuZCA9IE1hdGgubWluKHJvd19lbmQgKyByb3dfc3RhcnQgKyAxLCBnZXRNYXhSb3coKSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwZXJmb3JtUGFpbnQ6ICIgKyBjb2xfc3RhcnQgKyAiLCIgKyBjb2xfZW5kICsgIiAtICIgKyByb3dfc3RhcnQgKyAiLCIgKyByb3dfZW5kKTsKLQkJcGVyZm9ybVBhaW50KGV2ZW50LmdjLCBjb2xfc3RhcnQsIGNvbF9lbmQsIHJvd19zdGFydCwgcm93X2VuZCwgMCwgMCwgcmVuZGVyV2lkdGgsIHJlbmRlckhlaWdodCk7Ci0JfQotCS8qKiBIYW5kbGUgcmVzaXplIGV2ZW50Ci0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzaXplKEV2ZW50IGV2ZW50KSB7Ci0JCS8qCi0JCWludCBpbmRleCA9IHNlbGVjdGlvbiA9PSBudWxsID8gLTEgOiBmaW5kU2VsZWN0ZWRJbmRleEJ5TG9jYXRpb24oc2VsZWN0aW9uLngsIChhY3R1YWxTY3JvbGxTdGFydF95IC0gdmVydGljYWxTY3JvbGxPZmZzZXQpLCBmYWxzZSk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlzZWxlY3RlZEVsZW1lbnRzLmNsZWFyKGluZGV4KTsKLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCX0KLQkJKi8KLQkJcmVzZXRJbmZvKCk7Ci0JCXNldFZlcnRpY2FsU2Nyb2xsQmFyKGdldFZlcnRpY2FsQmFyKCkpOwotCQlpZiAoIWNsYWltQm90dG9tRnJlZVNwYWNlKCkpCi0JCQljYWxjdWxhdGVUb3BJbmRleCgpOwotCX0KLQkvKiogSGFuZGxlIGZvY3VzIG91dCBldmVudAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZvY3VzT3V0KEV2ZW50IGV2ZW50KSB7Ci0JCS8vaGlkZVRvb2xUaXAoKTsKLQl9Ci0JLyoqIFNob3cgdG9vbHRpcAotCSAqIEBwYXJhbSBpbmRleCBUYXJnZXQgZWxlbWVudCBpbmRleAotCSAqIEBwYXJhbSBldmVudCBtb3VzZSBtb3ZlIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1Rvb2xUaXAoaW50IGluZGV4LCBFdmVudCBldmVudCkgewotCQlpZiAoIXNob3dfdG9vbHRpcCB8fCBpbmRleCA9PSAtMSkgewotCQkJaGlkZVRvb2xUaXAoKTsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIGlzU2hpZnQgPSAoZXZlbnQuc3RhdGVNYXNrICYgU1dULk1PRDIpICE9IDA7Ci0JCWJvb2xlYW4gaXNDdHJsID0gKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwOwotCQlzaG93VG9vbFRpcChpbmRleCwgKCFpc1NoaWZ0ICYmICFpc0N0cmwpKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2hvd1Rvb2xUaXAoaW50IGluZGV4LCBib29sZWFuIHNob3dFeHRyYSkgewotCQlTdHJpbmdbXSB0b29sdGlwVGV4dHMgPSBnZXRUb29sVGlwVGV4dChnZXRPYmplY3QoaW5kZXgpKTsKLQkJLy8gY29uZmlybSB0byBzaG93IGV4dHJhIGlmIGFycmF5IGlzIGxhcmdlciB0aGFuIDEKLQkJaWYgKHNob3dFeHRyYSkKLQkJCXNob3dFeHRyYSA9ICh0b29sdGlwVGV4dHMubGVuZ3RoPjEpOwotCQlJSWNvbkluZm9ybWF0aW9uQ29udHJvbCBpbmZvcm1hdGlvbkNvbnRyb2wgPSBnZXRJbmZvcm1hdGlvbkNvbnRyb2woc2hvd0V4dHJhKTsKLQkJaWYgKGluZm9ybWF0aW9uQ29udHJvbCAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJCS8vaW5mb3JtYXRpb25Db250cm9sLnNldFNpemVDb25zdHJhaW50cyhjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCk7Ci0JCQlpbmZvcm1hdGlvbkNvbnRyb2wuc2V0SGVhZGVyKHRvb2x0aXBUZXh0c1swXSk7Ci0JCQlpZiAoc2hvd0V4dHJhKSB7Ci0JCQkJaW5mb3JtYXRpb25Db250cm9sLnNldEluZm9ybWF0aW9uKHRvb2x0aXBUZXh0c1sxXSk7Ci0JCQl9Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGZpbmRMb2NhdGlvbihpbmRleCk7Ci0JCQlQb2ludCB0X3NpemUgPSBpbmZvcm1hdGlvbkNvbnRyb2wuZ2V0U2hlbGxTaXplKCk7Ci0JCQkKLQkJCWZpbmFsIGludCB4X2dhcCA9IGdldEVsZW1lbnRXaWR0aCgpLzI7Ci0JCQlmaW5hbCBpbnQgeV9nYXAgPSBzaG93RXh0cmE/KGdldEVsZW1lbnRIZWlnaHQoKSogMS8yKTpnZXRFbGVtZW50SGVpZ2h0KCk7Ci0JCQkKLQkJCWludCBkaXNwbGF5X3ggPSBsb2NhdGlvbi54ICsgeF9nYXA7Ci0JCQlpbnQgZGlzcGxheV95ID0gbG9jYXRpb24ueSArIHlfZ2FwOwotCQkJaWYgKGRpc3BsYXlfeCArIHRfc2l6ZS54ID4gY2xpZW50QXJlYS53aWR0aCkgewotCQkJCWludCBseCA9IGxvY2F0aW9uLnggLSB0X3NpemUueCArIHhfZ2FwOwotCQkJCWlmIChseCA+IDApCi0JCQkJCWRpc3BsYXlfeCA9IGx4OyAKLQkJCX0KLQkJCWlmIChkaXNwbGF5X3kgKyB0X3NpemUueSA+IGNsaWVudEFyZWEuaGVpZ2h0KSB7Ci0JCQkJaW50IGx5ID0gbG9jYXRpb24ueSAtIHRfc2l6ZS55ICsgeV9nYXA7Ci0JCQkJaWYgKGx5ID4gMCkKLQkJCQkJZGlzcGxheV95ID0gbHk7Ci0JCQl9Ci0JCQlQb2ludCByZWFsX2xvY2F0aW9uID0gZ2V0Vmlld0FjdHVhbExvY2F0aW9uKHRoaXMsIG51bGwsIGRpc3BsYXlfeC0yLCBkaXNwbGF5X3ktMik7Ci0JCQlpbmZvcm1hdGlvbkNvbnRyb2wuc2V0TG9jYXRpb24ocmVhbF9sb2NhdGlvbik7Ci0JCQlpbmZvcm1hdGlvbkNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCS8vaW5mb3JtYXRpb25Db250cm9sLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0JLyoqIEdldCBhY3R1YWwgdmlldyBsb2NhdGlvbiAKLQkgKiBAcGFyYW0gZnJvbQotCSAqIEBwYXJhbSB0bwotCSAqIEBwYXJhbSBteAotCSAqIEBwYXJhbSBteQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0Vmlld0FjdHVhbExvY2F0aW9uKENvbnRyb2wgZnJvbSwgQ29udHJvbCB0bywgaW50IG14LCBpbnQgbXkpIHsKLQkJUG9pbnQgbWFwcGVkcHQgPSBnZXREaXNwbGF5KCkubWFwKGZyb20sIHRvLCAwLCAwKTsKLQkJUG9pbnQgbmV3cHQgPSBuZXcgUG9pbnQobXgsIG15KTsKLQkJbmV3cHQueCArPSBtYXBwZWRwdC54OwotCQluZXdwdC55ICs9IG1hcHBlZHB0Lnk7Ci0JCXJldHVybiBuZXdwdDsKLQl9Ci0JLyoqIEdldCBzZWxlY3RlZCBpbmRleGVzCi0JICogQHJldHVybiBzZWxlY3RlZCBpbmRleGVzCi0JICovCi0JcHVibGljIGludFtdIGdldFNlbGVjdGVkSW5kZXhlcygpIHsKLQkJaW50W10gcmV0VmFsdWUgPSBuZXcgaW50W3NlbGVjdGVkRWxlbWVudHMuY2FyZGluYWxpdHkoKV07Ci0JCWZvciAoaW50IGkgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHRTZXRCaXQoMCksIGogPSAwOyBpID49IDA7IGkgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHRTZXRCaXQoaSArIDEpLCBqKyspIHsKLQkJCXJldFZhbHVlW2pdID0gaTsKLQkJfQotCQlyZXR1cm4gcmV0VmFsdWU7Ci0JfQotCS8qKiBHZXQgdG9vbHRpcCB0ZXh0Ci0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGV4dCBvZiB0b29sdGlwCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFRvb2xUaXBUZXh0KE9iamVjdCBvYmopIHsKLQkJaWYgKHRvb2xUaXBQcm92aWRlciA9PSBudWxsKQotCQkJcmV0dXJuIElUb29sVGlwUHJvdmlkZXIuTk9fVE9PTFRJUDsKLQkJcmV0dXJuIHRvb2xUaXBQcm92aWRlci50b29sVGlwVGV4dChvYmopOwotCX0KLQkvKiogR2V0IG9iamVjdCBmcm9tIHNlbGVjdGVkIGVsZW1lbnRpbmRleCAKLQkgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChpbnQgaW5kZXgpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyLmdldE9iamVjdChpbmRleCk7Ci0JfQotCi0JLyoqIEdldCBzdGF0dXMgaW1hZ2UKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGluZGV4IHRhcmdldCBpbmRleCBwb3NpdGlvbgotCSAqIEBwYXJhbSBpc1NlbGVjdGVkIHRydWUgaWYgZWxlbWVudCBpcyBzZWxlY3RlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0U3RhdHVzSWNvbihPYmplY3Qgb2JqLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCkgewotCQlpZiAoaW1hZ2VQcm92aWRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpbWFnZVByb3ZpZGVyLmdldFN0YXR1c0ljb24ob2JqLCBpbmRleCwgaXNTZWxlY3RlZCk7Ci0JfQotCS8qKiBEcmF3IHNwZWNpYWwgb24gc2VsZWN0ZWQgZWxlbWVudAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZ2MKLQkgKiBAcGFyYW0geF9sb2MKLQkgKiBAcGFyYW0geV9sb2MKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1NwZWNpYWwoT2JqZWN0IG9iaiwgaW50IGluZGV4LCBHQyBnYywgaW50IHhfbG9jLCBpbnQgeV9sb2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoaW1hZ2VQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpbWFnZVByb3ZpZGVyLmRyYXdTcGVjaWFsKG9iaiwgaW5kZXgsIGdjLCB4X2xvYywgeV9sb2MsIHdpZHRoLCBoZWlnaHQpOwotCQl9Ci0JfQotCS8qKiBHZXQgaW5mb3JtYXRpb24gY29udHJvbAotCSAqIEBwYXJhbSBzaG93RGV0YWlscwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUljb25JbmZvcm1hdGlvbkNvbnRyb2wgZ2V0SW5mb3JtYXRpb25Db250cm9sKGJvb2xlYW4gc2hvd0RldGFpbHMpIHsKLQkJaWYgKGZJbmZvcm1hdGlvbkNvbnRyb2wgPT0gbnVsbCkgewotCQkJZkluZm9ybWF0aW9uQ29udHJvbD0gaWNvbkhvdmVyLmdldEhvdmVyQ29udHJvbENyZWF0b3IoZ2V0U2hlbGwoKSwgc2hvd0RldGFpbHMsIHRvb2x0aXBfd3JhcCk7Ci0JCQlmSW5mb3JtYXRpb25Db250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJCWhhbmRsZUluZm9ybWF0aW9uQ29udHJvbERpc3Bvc2VkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIGZJbmZvcm1hdGlvbkNvbnRyb2w7Ci0JfQotCS8qKiBIYW5kbGUgaW5mb3JtYXRpb24gY29udHJvbCBkaXNwb3NlZCBldmVudAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUluZm9ybWF0aW9uQ29udHJvbERpc3Bvc2VkKCkgewotCQlmSW5mb3JtYXRpb25Db250cm9sPSBudWxsOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogU2VsZiB0ZXN0aW5nCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIGludCB0b3RhbEltYWdlID0gMjAwOwotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgICAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICAgICAgc2hlbGwuc2V0TG9jYXRpb24oMTAwLCAyMDApOwotICAgICAgICBzaGVsbC5zZXRTaXplKDYwMCwgMzAwKTsKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCS8vRmlsZSBub3JtYWxGaWxlID0gbmV3IEZpbGUoIkQ6L2VjbGlwc2UzLjEvd29ya3NwYWNlL29yZy5lY2xpcHNlLnB0cC51aS9pY29ucy9ub2RlL25vZGVfcnVubmluZy5naWYiKTsKLQkJLy9GaWxlIHNlbGVjdGVkRmlsZSA9IG5ldyBGaWxlKCJEOi9lY2xpcHNlMy4xL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3J1bm5pbmdfc2VsLmdpZiIpOwotCQlGaWxlIG5vcm1hbEZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvY2xlbWVudC9EZXNrdG9wL3dvcmtzcGFjZV8xLjEvb3JnLmVjbGlwc2UucHRwLnVpL2ljb25zL25vZGUvbm9kZV9ydW5uaW5nLmdpZiIpOwotCQlGaWxlIHNlbGVjdGVkRmlsZSA9IG5ldyBGaWxlKCIvaG9tZS9jbGVtZW50L0Rlc2t0b3Avd29ya3NwYWNlXzEuMS9vcmcuZWNsaXBzZS5wdHAudWkvaWNvbnMvbm9kZS9ub2RlX3J1bm5pbmdfc2VsLmdpZiIpOwotCQkKLQkJVVJMIG5vcm1hbFVSTCA9IG51bGw7Ci0JCVVSTCBzZWxlY3RlZGxVUkwgPSBudWxsOwotCQl0cnkgewotCQkJbm9ybWFsVVJMID0gbm9ybWFsRmlsZS50b1VSSSgpLnRvVVJMKCk7Ci0JCQlzZWxlY3RlZGxVUkwgPSBzZWxlY3RlZEZpbGUudG9VUkkoKS50b1VSTCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgY3JlYXRlIHRoZSBVUkw6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSW1hZ2Ugbm9ybWFsSW1hZ2UxID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobm9ybWFsVVJMKS5jcmVhdGVJbWFnZSgpOwotCQlmaW5hbCBJbWFnZSBzZWxlY3RlZEltYWdlMSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHNlbGVjdGVkbFVSTCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgCi0JCWludCB3ID0gMTY7Ci0JCWludCBoID0gMTY7Ci0JCWZpbmFsIEltYWdlIG5vcm1hbEltYWdlID0gbmV3IEltYWdlKG5vcm1hbEltYWdlMS5nZXREZXZpY2UoKSwgbm9ybWFsSW1hZ2UxLmdldEltYWdlRGF0YSgpLnNjYWxlZFRvKHcsIGgpKTsJCQotCQlmaW5hbCBJbWFnZSBzZWxlY3RlZEltYWdlID0gbmV3IEltYWdlKHNlbGVjdGVkSW1hZ2UxLmdldERldmljZSgpLCBzZWxlY3RlZEltYWdlMS5nZXRJbWFnZURhdGEoKS5zY2FsZWRUbyh3LCBoKSk7CQkKLQotICAgICAgICBJY29uQ2FudmFzIGljb25DYW52YXMgPSBuZXcgSWNvbkNhbnZhcyhzaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBpY29uQ2FudmFzLnNldFNob3dUb29sdGlwKGZhbHNlKTsKLSAgICAgICAgaWNvbkNhbnZhcy5zZXRJY29uU2l6ZSh3LCBoKTsKLSAgICAgICAgaWNvbkNhbnZhcy5zZXRGb250U2l6ZSgxMCk7Ci0gICAgICAgIGljb25DYW52YXMuc2V0SWNvblNwYWNlKDEsIDQpOwotICAgICAgICBpY29uQ2FudmFzLnNldFRvb2x0aXBXcmFwKHRydWUpOwotICAgICAgICBpY29uQ2FudmFzLnNldENvbnRlbnRQcm92aWRlcihuZXcgSUNvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBpbmRleCkgewotICAgICAgICAJCXJldHVybiBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlwdWJsaWMgU3RyaW5nIGdldFJ1bGVySW5kZXgoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgIAkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGluZGV4KTsKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIGljb25DYW52YXMuc2V0SW1hZ2VQcm92aWRlcihuZXcgSUltYWdlUHJvdmlkZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgSW1hZ2UgZ2V0U3RhdHVzSWNvbihPYmplY3Qgb2JqLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCkgewotICAgICAgICAJCXJldHVybiBpc1NlbGVjdGVkP3NlbGVjdGVkSW1hZ2U6bm9ybWFsSW1hZ2U7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBkcmF3U3BlY2lhbChPYmplY3Qgb2JqLCBpbnQgaW5kZXgsIEdDIGdjLCBpbnQgeF9sb2MsIGludCB5X2xvYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotICAgICAgICBpY29uQ2FudmFzLnNldFRvb2xUaXBQcm92aWRlcihuZXcgSVRvb2xUaXBQcm92aWRlcigpIHsKLSAgICAgICAgCXB1YmxpYyBTdHJpbmdbXSB0b29sVGlwVGV4dChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIAkJLy9pZiAob2JqLnRvU3RyaW5nKCkuaW5kZXhPZigiMSIpID4gLTEpIHsKLSAgICAgICAgCQlTdHJpbmcgdCA9ICI8aT4xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OWE8YnI+IjsKLQkgICAgCQl0ICs9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDwvaT4xPGI+MjM0NTY3ODk8L2I+YSI7Ci0JICAgIAkJdCArPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlhIjsKLQkgICAgICAgCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIk9iamVjdDogIiArIG9iaiwgdCB9OwotICAgICAgICAJCS8vcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0gICAgICAgIAkJLy99Ci0gICAgICAgIAkJLyoKLSAgICAgICAgCQlTdHJpbmdbXSB0ZXh0cyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICAgIAkJU3RyaW5nIGNvbnRlbnRUZXh0ID0gIjx1PlZhcmlhYmxlczwvdT48YnI+IjsKLSAgICAgICAgCQljb250ZW50VGV4dCArPSAiPGluZD5hYmM6IDxrZXk+UHJpbnRTdHJlYW08L2tleT48YnI+IjsKLSAgICAgICAgCQljb250ZW50VGV4dCArPSAiPGluZD48aGw+YWFhYWFhYWFhYWEgaGhoaGhoaGhoaCBnZ2dnZ2dnZ2dnZ2dnZ2dnIGJiYmJiYmJiYmJiYmJiYiBjY2NjY2NjY2NjY2NjY2M6PC9obD4gUHJpbnRTdHJlYW08YnI+IjsKLSAgICAgICAgCQljb250ZW50VGV4dCArPSAiPGluZD48aGw+YWFhYWFhYSBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGggY2NjY2NjY2NjY2NjY2NjIGRkZGRkZGRkZGRkZGRkZGQgZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOjwvaGw+IFByaW50U3RyZWFtPGJyPiI7Ci0gICAgICAgIAkJY29udGVudFRleHQgKz0gIjxpbmQ+PGhsPjFhYXNkYmM6PC9obD4gUHJpbnRTdHJlYW08YnI+IjsKLSAgICAgICAgCQljb250ZW50VGV4dCArPSAiPGluZD48aGw+MmFhc2RiYzo8L2hsPiBQcmludFN0cmVhbTxicj4iOwotICAgICAgICAJCQotICAgICAgICAJCWNvbnRlbnRUZXh0ICs9ICI8aW5kPjxobD4zYWFzZGJjOjwvaGw+IFByaW50U3RyZWFtPGJyPiI7Ci0gICAgICAgIAkJY29udGVudFRleHQgKz0gIjxpbmQ+PGhsPjRhYXNkYmM6PC9obD4gUHJpbnRTdHJlYW08YnI+IjsKLSAgICAgICAgCQljb250ZW50VGV4dCArPSAiPGluZD48aGw+NWFhc2RiYzo8L2hsPiBQcmludFN0cmVhbTxicj4iOwotICAgICAgICAJCWNvbnRlbnRUZXh0ICs9ICI8aW5kPjxobD42YWFzZGJjOjwvaGw+IFByaW50U3RyZWFtPGJyPiI7Ci0gICAgICAgIAkJY29udGVudFRleHQgKz0gIjxpbmQ+PGhsPjdhYXNkYmM6PC9obD4gUHJpbnRTdHJlYW08YnI+IjsKLSAgICAgICAgCQljb250ZW50VGV4dCArPSAiPGluZD48aT44YWI5OTIxMyAzMmM6PC9pPiBQcmludFN0cmVhbTxicj4iOwotICAgICAgICAJCQotICAgICAgICAJCXRleHRzWzBdID0gImFiY1xuT2JqZWN0OiAiICsgb2JqOwotICAgICAgICAJCXRleHRzWzFdID0gY29udGVudFRleHQ7Ci0gICAgICAgIAkJcmV0dXJuIHRleHRzOwotICAgICAgICAJCSovCi0gICAgICAgIAl9Ci0gICAgICAgIAlwdWJsaWMgdm9pZCB1cGRhdGUoT2JqZWN0IG9iaiwgU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgCQkKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIGljb25DYW52YXMuc2V0VG90YWwodG90YWxJbWFnZSk7Ci0KLSAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotICAgICAgICAJCWRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0pvYnNMaXN0Vmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9Kb2JzTGlzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwMTI2OC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL0pvYnNMaXN0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZFF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZU1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZVF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLlBhcmFsbGVsSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC51aS5hY3Rpb25zLlRlcm1pbmF0ZUpvYkZyb21MaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JUFRQVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi1wdWJsaWMgY2xhc3MgSm9ic0xpc3RWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByaXZhdGUgZmluYWwgY2xhc3MgTU1DaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudCBlKSB7Ci0JCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCBlKSB7Ci0JCQkvKgotCQkJICogQWRkIHJlc291cmNlIG1hbmFnZXIgY2hpbGQgbGlzdGVuZXIgc28gd2UgZ2V0IG5vdGlmaWVkIHdoZW4gbmV3Ci0JCQkgKiBtYWNoaW5lcyBhcmUgYWRkZWQgdG8gdGhlIG1vZGVsLgotCQkJICovCi0JCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtID0gZS5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkgICAgICAgIHJtLmFkZENoaWxkTGlzdGVuZXIocmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JCSAqLwotCQkvLyBVcGRhdGUgdGhlIGJ1dHRvbiBoZXJlLgotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJLyoKLQkJCSAqIFJlbW92ZWQgcmVzb3VyY2UgbWFuYWdlciBjaGlsZCBsaXN0ZW5lciB3aGVuIHJlc291cmNlIG1hbmFnZXIgaXMgcmVtb3ZlZC4KLQkJCSAqLwotCQkJZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVDaGlsZExpc3RlbmVyKHJlc291cmNlTWFuYWdlckxpc3RlbmVyKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUXVldWVDaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSVF1ZXVlQ2hpbGRMaXN0ZW5lciB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkSm9iRXZlbnQgZSkgewotCQkJZm9yIChJUEpvYiBqb2IgOiBlLmdldEpvYnMoKSkgewotCQkJCXJlZnJlc2goam9iKTsKLQkJCX0KLQkJCQotCQkJLy8gUmVmcmVzaCB0aGUgdGVybWluYXRlIGpvYiBidXR0b24KLQkJCVBUUFVJUGx1Z2luLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0ZXJtaW5hdGVBbGxBY3Rpb24udXBkYXRlVGVybWluYXRlSm9iU3RhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdKb2JFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElOZXdKb2JFdmVudCBlKSB7Ci0JCQlQVFBVSVBsdWdpbi5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdXBkYXRlQ29sdW1ucyhlLmdldEpvYnMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZWZyZXNoKG51bGwpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVKb2JFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVKb2JFdmVudCBlKSB7Ci0JCQlyZWZyZXNoKG51bGwpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUk1DaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJNYWNoaW5lTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJDaGFuZ2VkTWFjaGluZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRNYWNoaW5lRXZlbnQgZSkgewotCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlZFF1ZXVlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFF1ZXVlRXZlbnQgZSkgewotCQkJLy8gQ2FuIHNhZmVseSBpZ25vcmUKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTWFjaGluZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyTmV3TWFjaGluZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1F1ZXVlRXZlbnQgZSkgewotCQkJZm9yIChJUFF1ZXVlIHF1ZXVlIDogZS5nZXRRdWV1ZXMoKSkgewotCQkJCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTWFjaGluZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyUmVtb3ZlTWFjaGluZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZU1hY2hpbmVFdmVudCBlKSB7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJSZW1vdmVRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVF1ZXVlRXZlbnQgZSkgewotCQkJZm9yIChJUFF1ZXVlIHF1ZXVlIDogZS5nZXRRdWV1ZXMoKSkgewotCQkJCXF1ZXVlLnJlbW92ZUNoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09MVU1OX1dJRFRIUyA9ICJjb2x1bW5XaWR0aHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBJTWVtZW50byBtZW1lbnRvOwotCXByaXZhdGUgVGVybWluYXRlSm9iRnJvbUxpc3RBY3Rpb24gdGVybWluYXRlQWxsQWN0aW9uOwotCi0JLyoKLQkgKiBNb2RlbCBsaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIElNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyIG1vZGVsTWFuYWdlckxpc3RlbmVyID0gbmV3IE1NQ2hpbGRMaXN0ZW5lcigpOwotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIgcmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgUk1DaGlsZExpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBJUXVldWVDaGlsZExpc3RlbmVyIHF1ZXVlQ2hpbGRMaXN0ZW5lciA9IG5ldyBRdWV1ZUNoaWxkTGlzdGVuZXIoKTsKLQotCXByaXZhdGUgZmluYWwgU2V0PElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/Pj4gY29sRGVmcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldDxJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4+KCkpOwotCQotCXB1YmxpYyBUYWJsZVZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCXZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJY3JlYXRlQ29sdW1ucyh2aWV3ZXIpOwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElQVW5pdmVyc2UpIHsKLQkJCQkJSVBVbml2ZXJzZSB1bml2ZXJzZSA9ICgoSVBVbml2ZXJzZSlpbnB1dEVsZW1lbnQpOwotCQkJCQlMaXN0PElQSm9iPiBqb2JMaXN0ID0gbmV3IEFycmF5TGlzdDxJUEpvYj4oKTsKLQkJCQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCQkJCQlmb3IgKElQUXVldWUgcXVldWUgOiBybS5nZXRRdWV1ZXMoKSkgewotCQkJCQkJCWZvciAoSVBKb2Igam9iIDogcXVldWUuZ2V0Sm9icygpKSB7Ci0JCQkJCQkJCWpvYkxpc3QuYWRkKGpvYik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBqb2JMaXN0LnRvQXJyYXkobmV3IElQSm9iW2pvYkxpc3Quc2l6ZSgpXSk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGoxLCBPYmplY3QgajIpIHsKLQkJCQlyZXR1cm4gKChJUEpvYilqMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKElQSm9iKWoyKS5nZXROYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHZpZXdlcik7Ci0JCQotCQkvLyBVc2UgdmlldyB0b29sYmFyCi0JCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCi0JCXRlcm1pbmF0ZUFsbEFjdGlvbiA9IG5ldyBUZXJtaW5hdGVKb2JGcm9tTGlzdEFjdGlvbih0aGlzKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQVUlDb25zdGFudHMuSVVJQUNUSU9OR1JPVVApKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBVSUNvbnN0YW50cy5JVUlBQ1RJT05HUk9VUCwgdGVybWluYXRlQWxsQWN0aW9uKTsKLQkJCi0JCQotCQkvKnRlcm1pbmF0ZUFsbEFjdGlvbiA9IG5ldyBUZXJtaW5hdGVKb2JBY3Rpb24odmlld2VyKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBVSUNvbnN0YW50cy5JVUlBQ1RJT05HUk9VUCwgdGVybWluYXRlQWxsQWN0aW9uKTsqLwotCQkKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQl2aWV3ZXIuc2V0SW5wdXQobW0uZ2V0VW5pdmVyc2UoKSk7Ci0KLQkJLyoKLQkgICAgICogQWRkIHVzIHRvIGFueSBleGlzdGluZyBSTSdzLiBJIGd1ZXNzIGl0J3MgcG9zc2libGUgd2UgY291bGQKLQkgICAgICogbWlzcyBhIFJNIGlmIGEgbmV3IGV2ZW50IGFycml2ZXMgd2hpbGUgd2UncmUgZG9pbmcgdGhpcywgYnV0IGlzIAotCSAgICAgKiBpdCBhIHByb2JsZW0/Ci0JICAgICAqLwotCSAgICBmb3IgKElSZXNvdXJjZU1hbmFnZXIgcm0gOiBtbS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcnMoKSkgewotCSAgICAgICAgcm0uYWRkQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JICAgICAgICBmb3IgKElQUXVldWUgcXVldWUgOiBybS5nZXRRdWV1ZXMoKSkgewotCSAgICAgICAgCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkgICAgICAgIH0KLQkgICAgfQotCSAgICBtbS5hZGRMaXN0ZW5lcihtb2RlbE1hbmFnZXJMaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZSwgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSwgSU1lbWVudG8gbWVtZW50bykgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBtZW1lbnRvKTsKLQkJdGhpcy5tZW1lbnRvID0gbWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goZmluYWwgSVBKb2Igam9iKSB7Ci0JCVBUUFVJUGx1Z2luLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghdmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCQkJdXBkYXRlQ29sdW1ucyhqb2IpOwotCQkJCQkJdmlld2VyLnJlZnJlc2goam9iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFibGVWaWV3ZXIKLQkgKiBAcGFyYW0gZm9udE1ldHJpY3MKLQkgKiBAcGFyYW0gYXR0ckRlZgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDb2x1bW4oZmluYWwgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gYXR0ckRlZikgewotCQlUYWJsZVZpZXdlckNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odmlld2VyLCBTV1QuTk9ORSk7Ci0JCQotCQljb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBKb2IpIHsKLQkJCQkJaWYgKGF0dHJEZWYuZXF1YWxzKEpvYkF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpKSB7Ci0JCQkJCQlJUEpvYiBqb2IgPSAoSVBKb2IpZWxlbWVudDsKLQkJCQkJCXJldHVybiBQYXJhbGxlbEltYWdlcy5qb2JJbWFnZXNbam9iLmdldFN0YXRlKCkub3JkaW5hbCgpXVtqb2IuaXNEZWJ1ZygpID8gMSA6IDBdOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUEpvYikgewotCQkJCQlJUEpvYiBqb2IgPSAoSVBKb2IpIGVsZW1lbnQ7Ci0JCQkJCWlmICghYXR0ckRlZi5lcXVhbHMoSm9iQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSkpIHsKLQkJCQkJCUlBdHRyaWJ1dGU8Pyw/LD8+IGF0dHIgPSBqb2IuZ2V0QXR0cmlidXRlKGF0dHJEZWYuZ2V0SWQoKSk7Ci0JCQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWVBc1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCX0pOwotCQljb2x1bW4uZ2V0Q29sdW1uKCkuc2V0RGF0YShhdHRyRGVmKTsKLQkJY29sdW1uLmdldENvbHVtbigpLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sdW1uLmdldENvbHVtbigpLnNldE1vdmVhYmxlKHRydWUpOwotCQkvLyB0aGlzIHdpbGwgbmVlZCB0byBzb3J0IGJ5IHRoZSBjb2wKLQkJLy9jb2x1bW4uZ2V0Q29sdW1uKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0SGVhZGVyTGlzdGVuZXIoKSk7Ci0JCVN0cmluZyBuYW1lID0gYXR0ckRlZi5nZXROYW1lKCk7Ci0JCWNvbHVtbi5nZXRDb2x1bW4oKS5zZXRUZXh0KG5hbWUpOwotCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KGNvbnZlcnRlci5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMobmFtZS5sZW5ndGgoKSsyKSwKLQkJCQkJCQkJY29udmVydGVyLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1KSk7Ci0JCWNvbHVtbi5nZXRDb2x1bW4oKS5zZXRXaWR0aCh3aWR0aCk7Ci0JCWNvbERlZnMuYWRkKGF0dHJEZWYpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFibGVWaWV3ZXIKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbHVtbnMoVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIsIElQSm9iIGpvYikgewotCQlhZGRDb2x1bW4oSm9iQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCWFkZENvbHVtbihFbGVtZW50QXR0cmlidXRlcy5nZXROYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCWZvciAoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0ciA6IGpvYi5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCQlJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz4gYXR0ckRlZiA9IGF0dHIuZ2V0RGVmaW5pdGlvbigpOwotCQkJCWlmICghY29sRGVmcy5jb250YWlucyhhdHRyRGVmKSAmJiBhdHRyRGVmLmdldERpc3BsYXkoKSkgewotCQkJCQlhZGRDb2x1bW4oYXR0ckRlZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0YWJsZVZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5zKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0JCWFkZENvbHVtbnModGFibGVWaWV3ZXIsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbHVtbnMoSVBKb2Igam9iKSB7Ci0JCWZvciAoSUF0dHJpYnV0ZTw/LD8sPz4gYXR0ciA6IGpvYi5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PiBhdHRyRGVmID0gYXR0ci5nZXREZWZpbml0aW9uKCk7Ci0JCQlpZiAoIWNvbERlZnMuY29udGFpbnMoYXR0ckRlZikgJiYgYXR0ckRlZi5nZXREaXNwbGF5KCkpIHsKLQkJCQlhZGRDb2x1bW4oYXR0ckRlZik7Ci0JCQl9Ci0JCX0KLQkJdmlld2VyLmdldFRhYmxlKCkubGF5b3V0KHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9NYWNoaW5lc05vZGVzVmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9NYWNoaW5lc05vZGVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE5MTdjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvTWFjaGluZXNOb2Rlc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0qIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0qIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0qIAotKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKiAKLSogTEEtQ0MgMDQtMTE1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZEpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE1hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWROb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld0pvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3TWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3Tm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU1hY2hpbmVDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuV29ya2JlbmNoSm9iOwotCi0vKioKLSogQGF1dGhvciBEYW5pZWwgKEpEKSBCYXJib3phCi0qIAotKiBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEdyZWcgV2F0c29uIGFuZCBDbGVtZW50IENodQotKiAKLSovCi1wdWJsaWMgY2xhc3MgTWFjaGluZXNOb2Rlc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciBtb2RlbE1hbmFnZXJMaXN0ZW5lciA9IG5ldyBNTUNoaWxkTGlzdGVuZXIoKTsKLQotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIgcmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgUk1DaGlsZExpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIGZpbmFsIElNYWNoaW5lQ2hpbGRMaXN0ZW5lciBtYWNoaW5lTGlzdGVuZXIgPSBuZXcgTWFjaGluZUNoaWxkTGlzdGVuZXIoKTsKLQkKLQlwcml2YXRlIGZpbmFsIElRdWV1ZUNoaWxkTGlzdGVuZXIgcXVldWVDaGlsZExpc3RlbmVyID0gbmV3IFF1ZXVlQ2hpbGRMaXN0ZW5lcigpOwotCQotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0IDxNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24+IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zID0gCi0JCW5ldyBBcnJheUxpc3QgPE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbj4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIEhhc2h0YWJsZSA8U3RyaW5nLCBOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24+IG5vZGVzSGFzaE1hcCA9IAotCQluZXcgSGFzaHRhYmxlIDxTdHJpbmcsIE5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbj4gKCk7Ci0KLQlwcm90ZWN0ZWQgUmVmcmVzaFdvcmtiZW5jaEpvYiByZWZyZXNoV29ya2JlbmNoID0gbmV3IFJlZnJlc2hXb3JrYmVuY2hKb2IoKTsKLQotCXByaXZhdGUgTWFjaGluZU5vZGVzQ2FudmFzIGNhbnZhcyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBGb250IGRlZmF1bHRGb250ID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBlbGVtZW50U2VsZWN0ZWQgPSBudWxsOwotCQotCXB1YmxpYyBNYWNoaW5lc05vZGVzVmlldygpIHsKLSAgICAgICAgc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQljYW52YXMgPSBuZXcgTWFjaGluZU5vZGVzQ2FudmFzKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8ICBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlGb250RGF0YVtdIGZkID0gY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZC5sZW5ndGg7IGkrKykgewotCQkgIGZkW2ldLnNldEhlaWdodCg4KTsKLQkJfQotCQlkZWZhdWx0Rm9udCA9IG5ldyBGb250KCBjb21wb3NpdGUuZ2V0RGlzcGxheSgpLGZkKTsKLQkJCi0JCS8qCi0JCSAqIFdhaXQgdW50aWwgdGhlIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCBiZWZvcmUgcmVnaXN0ZXJpbmcgZm9yIGV2ZW50cwotCQkgKi8KLQkJSU1vZGVsTWFuYWdlciBtbSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQkKLQkJc3luY2hyb25pemVkIChtbSkgewotCQkgICAgLyoKLQkJICAgICAqIEFkZCB1cyB0byBhbnkgZXhpc3RpbmcgUk0ncy4gSSBndWVzcyBpdCdzIHBvc3NpYmxlIHdlIGNvdWxkCi0JCSAgICAgKiBtaXNzIGEgUk0gaWYgYSBuZXcgZXZlbnQgYXJyaXZlcyB3aGlsZSB3ZSdyZSBkb2luZyB0aGlzLCBidXQgaXMgCi0JCSAgICAgKiBpdCBhIHByb2JsZW0/Ci0JCSAgICAgKi8KLQkJICAgIGZvciAoSVJlc291cmNlTWFuYWdlciBybSA6IG1tLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCSAgICAgICAgcm0uYWRkQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCSAgICAgICAgLyoKLQkJICAgICAgICAgKiBXZSBuZWVkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbm9kZXMgb24gdGhpcwotCQkgICAgICAgICAqIHJlc291cmNlIG1hbmFnZXIsIGJyb3dzaW5nIHRocm91Z2ggdGhlIG1hY2hpbmVzIGFuZCBhZGRpbmcKLQkJICAgICAgICAgKiB0aGVtIHRvIG91ciB2aWV3Ci0JCSAgICAgICAgICovCi0JCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBybS5nZXRNYWNoaW5lcygpLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgCUlQTWFjaGluZSBtYWNoaW5lID0gcm0uZ2V0TWFjaGluZXMoKVtpXTsKLQkJCQkJbWFjaGluZS5hZGRDaGlsZExpc3RlbmVyKG1hY2hpbmVMaXN0ZW5lcik7Ci0JCSAgICAgICAgCU1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBtYWNoaW5lZ3IgPSAKLQkJCQkJCW5ldyBNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24obWFjaGluZS5nZXROYW1lKCksIG1hY2hpbmUuZ2V0SUQoKSk7Ci0JCSAgICAgICAgCWZvciAoSVBOb2RlIG5vZGUgOiBtYWNoaW5lLmdldE5vZGVzKCkpIHsKLQkJCQkJCS8vIGNyZWF0ZSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5vZGUKLQkJCQkJCU5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBub2RlZ3IgPSAKLQkJCQkJCQluZXcgTm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKG5vZGUuZ2V0TmFtZSgpLCBub2RlLmdldElEKCkpOwotCQkJCQkJbWFjaGluZWdyLmFkZE5vZGUobm9kZWdyKTsKLQkJCQkJCW1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zLmFkZChtYWNoaW5lZ3IpOwotCQkJCQl9CQotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJICAgIG1tLmFkZExpc3RlbmVyKG1vZGVsTWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQkKLQkJcmVmcmVzaFZpZXcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3KCkgewotCQlyZWZyZXNoV29ya2JlbmNoLnNjaGVkdWxlKHRydWUsIHRydWUpOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHJlcXVpcmVkIHNvIHRoZSBjbGFzcyBjYW4gZXh0ZW5kcyBWaWV3UGFydAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gewotCQlwcml2YXRlIEFycmF5TGlzdCA8Tm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uPiBub2RlcyA9IG51bGw7Ci0JCXByaXZhdGUgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIG1hY2hpbmVOYW1lID0gIiI7Ci0JCXByaXZhdGUgU3RyaW5nIG1hY2hpbmVJRCA9ICIiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEggPSA1MDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDUwOwotCQlwcml2YXRlIENvbG9yIGNvbG9yID0gbnVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhbHRlZDsKLQkJcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKFN0cmluZyBtYWNoaW5lTmFtZSwgU3RyaW5nIG1hY2hpbmVJRCkgewotCQkJdGhpcy5tYWNoaW5lTmFtZSA9IG1hY2hpbmVOYW1lOwotCQkJdGhpcy5zZXRNYWNoaW5lSUQobWFjaGluZUlEKTsKLQkJCW5vZGVzID0gbmV3IEFycmF5TGlzdCA8Tm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uPiAoKTsKLQkJCXJlY3RhbmdsZSA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgV0lEVEgsIEhFSUdIVCk7Ci0JCQloYWx0ZWQgPSBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbihTdHJpbmcgbWFjaGluZU5hbWUsIFN0cmluZyBtYWNoaW5lSUQsIENvbG9yIGNvbG9yKSB7Ci0JCQl0aGlzLm1hY2hpbmVOYW1lID0gbWFjaGluZU5hbWU7Ci0JCQl0aGlzLnNldE1hY2hpbmVJRChtYWNoaW5lSUQpOwotCQkJbm9kZXMgPSBuZXcgQXJyYXlMaXN0IDxOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24+ICgpOwotCQkJcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCAwLCBXSURUSCwgSEVJR0hUKTsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJCWhhbHRlZCA9IGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKFN0cmluZyBtYWNoaW5lTmFtZSwgQ29sb3IgY29sb3IsIGludCBPeCwgaW50IE95LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJCXRoaXMubWFjaGluZU5hbWUgPSBtYWNoaW5lTmFtZTsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJCW5vZGVzID0gbmV3IEFycmF5TGlzdCA8Tm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uPiAoKTsKLQkJCXJlY3RhbmdsZSA9IG5ldyBSZWN0YW5nbGUoT3gsIE95LCB3aWR0aCwgaGVpZ2h0KTsKLQkJfQotCQkKLQkJcHVibGljIE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbihTdHJpbmcgbWFjaGluZU5hbWUsIENvbG9yIGNvbG9yLCBpbnQgT3gsIGludCBPeSkgewotCQkJdGhpcy5tYWNoaW5lTmFtZSA9IG1hY2hpbmVOYW1lOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQkJbm9kZXMgPSBuZXcgQXJyYXlMaXN0IDxOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24+ICgpOwotCQkJcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShPeCwgT3ksIFdJRFRILCBIRUlHSFQpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BvaW50KGludCB4LCBpbnQgeSkgewotCQkJcmV0dXJuIHJlY3RhbmdsZS5jb250YWlucyh4LCB5KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRNYWNoaW5lTmFtZSgpIHsKLQkJCXJldHVybiBtYWNoaW5lTmFtZTsKLQkJfQotCQkKLQkJcHVibGljIFJlY3RhbmdsZSBnZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpIHsKLQkJCXJldHVybiByZWN0YW5nbGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb2xvciBnZXRDb2xvcigpIHsKLQkJCXJldHVybiBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gYWRkTm9kZShOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gbm9kZSkgewotCQkJcmV0dXJuIG5vZGVzLmFkZChub2RlKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlTm9kZShOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gbm9kZSkgewotCQkJcmV0dXJuIG5vZGVzLnJlbW92ZShub2RlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlTm9kZShTdHJpbmcgbm9kZUlEKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSArKykgewotCQkJCWlmIChub2Rlcy5nZXQoaSkuZ2V0Tm9kZUlEKCkuZXF1YWxzKG5vZGVJRCkpIHsKLQkJCQkJbm9kZXMucmVtb3ZlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRIYWx0ZWQoYm9vbGVhbiBoYWx0ZWQpIHsKLQkJCXRoaXMuaGFsdGVkID0gaGFsdGVkOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0hhbHRlZCgpIHsKLQkJCXJldHVybiBoYWx0ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7Ci0JCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBcnJheUxpc3QgPE5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbj4gZ2V0Tm9kZXMoKSB7Ci0JCQlyZXR1cm4gbm9kZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNYWNoaW5lSUQoU3RyaW5nIG5vZGVJRCkgewotCQkJdGhpcy5tYWNoaW5lSUQgPSBub2RlSUQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1hY2hpbmVJRCgpIHsKLQkJCXJldHVybiBtYWNoaW5lSUQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiB7Ci0JCXByaXZhdGUgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIG5vZGVOYW1lID0gIiI7Ci0JCXByaXZhdGUgU3RyaW5nIG5vZGVJRCA9ICIiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEggPSAyMDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDIwOwotCQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBBcnJheUxpc3QgPFN0cmluZz4gam9ic0lEcyA9IG51bGw7Ci0JCQotCQlwdWJsaWMgTm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBub2RlSUQpIHsKLQkJCXRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKLQkJCXRoaXMubm9kZUlEID0gbm9kZUlEOwotCQkJcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCAwLCBXSURUSCwgSEVJR0hUKTsKLQkJCWpvYnNJRHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4gKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gbm9kZU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZWN0YW5nbGUgZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKSB7Ci0JCQlyZXR1cm4gcmVjdGFuZ2xlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbihSZWN0YW5nbGUgcmV0KSB7Ci0JCQlyZWN0YW5nbGUgPSByZXQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5vZGVJRChTdHJpbmcgbm9kZUlEKSB7Ci0JCQl0aGlzLm5vZGVJRCA9IG5vZGVJRDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROb2RlSUQoKSB7Ci0JCQlyZXR1cm4gbm9kZUlEOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldE51bWJlck9mSm9icygpIHsKLQkJCXJldHVybiBqb2JzSURzLnNpemUoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkSm9iKFN0cmluZyBqb2JJRCkgewotCQkJaWYgKCEgam9ic0lEcy5jb250YWlucyhqb2JJRCkpCi0JCQkJam9ic0lEcy5hZGQoam9iSUQpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVKb2IoU3RyaW5nIGpvYklEKSB7Ci0JCQlqb2JzSURzLnJlbW92ZShqb2JJRCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBcnJheUxpc3QgPFN0cmluZz4gZ2V0Sm9ic0lEcyAoKSB7Ci0JCQlyZXR1cm4gam9ic0lEczsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQkJdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotCQkJcmV0dXJuIHNlbGVjdGVkOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BvaW50KGludCB4LCBpbnQgeSkgewotCQkJcmV0dXJuIHJlY3RhbmdsZS5jb250YWlucyh4LCB5KTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBNYWNoaW5lTm9kZXNDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCQlQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQgKDAsIDApOwotCQlTY3JvbGxCYXIgdmVydGljYWxCYXIgPSBudWxsOwotCQlTY3JvbGxCYXIgaG9yaXpvbnRhbEJhciA9IG51bGw7Ci0JCWludCBXSURUSCA9IDEwMDA7Ci0JCWludCBIRUlHSFQgPSAzMDAwOwotCQkKLQkJcHVibGljIE1hY2hpbmVOb2Rlc0NhbnZhcyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKGNvbXBvc2l0ZSwgc3R5bGUpOwotCQkJdGhpcy5jb21wb3NpdGUgPSBjb21wb3NpdGU7Ci0JCQkvKgotCQkJICogTGltaXQgdGhlIHdpZHRoIHNpemUgYmFzZWQgb24gc2NyZWVuIHdpZHRoCi0JCQkgKi8KLQkJCWlmIChnZXREaXNwbGF5KCkuIGdldFByaW1hcnlNb25pdG9yKCkgIT0gbnVsbCkKLQkJCQlXSURUSCA9IGdldERpc3BsYXkoKS4gZ2V0UHJpbWFyeU1vbml0b3IoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCWluc3RhbGxMaXN0ZW5lcnMoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGluc3RhbGxMaXN0ZW5lcnMoKSB7Ci0KLQkJCWxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCQkJLy9oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCQkJLy9oYW5kbGVLZXlEb3duKGV2ZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNXVC5LZXlVcDoKLQkJCQkJCS8vaGFuZGxlS2V5VXAoZXZlbnQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJCWhhbmRsZU1vdXNlRG93bihldmVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCQkJCS8vaGFuZGxlTW91c2VVcChldmVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuTW91c2VEb3VibGVDbGljazoKLQkJCQkJCS8vaGFuZGxlTW91c2VEb3VibGVDbGljayhldmVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQkJLy9oYW5kbGVNb3VzZU1vdmUoZXZlbnQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULk1vdXNlSG92ZXI6Ci0JCQkJCQkvL2hhbmRsZU1vdXNlSG92ZXIoZXZlbnQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULlBhaW50OgotCQkJCQkJaGFuZGxlUGFpbnQoZXZlbnQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCQkJCWhhbmRsZVJlc2l6ZShldmVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTV1QuRm9jdXNPdXQ6Ci0JCQkJCQkvL2hhbmRsZUZvY3VzT3V0KGV2ZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JCQlhZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCQkJYWRkTGlzdGVuZXIoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0JCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JCQlhZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCQkJYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIGxpc3RlbmVyKTsKLQkJCWFkZExpc3RlbmVyKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQkJCWFkZExpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCBsaXN0ZW5lcik7Ci0JCQlhZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLQkJCWFkZExpc3RlbmVyKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQkJCWFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgbGlzdGVuZXIpOwotCi0JCQl2ZXJ0aWNhbEJhciA9IHRoaXMuIGdldFZlcnRpY2FsQmFyKCk7Ci0JCQlob3Jpem9udGFsQmFyID0gdGhpcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCQkKLQkJCWlmIChob3Jpem9udGFsQmFyICE9IG51bGwpIHsKLQkJCQlob3Jpem9udGFsQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCWludCBoU2VsZWN0aW9uID0gaG9yaXpvbnRhbEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQkJCW9yaWdpbi54ID0gLWhTZWxlY3Rpb247Ci0JCQkJCXJlZHJhdygpOwotCQkJCX0KLQkJCX0pOwotCQkJfQotCQkJCi0JCQlpZiAoIHZlcnRpY2FsQmFyIT0gbnVsbCkgewotCQkJCXZlcnRpY2FsQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCWludCB2U2VsZWN0aW9uID0gdmVydGljYWxCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJCQlvcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJCQlyZWRyYXcoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNb3VzZURvd24oRXZlbnQgZSkgewotCQkJLyoKLQkJCSAqIENoZWNrIGlmIHRoZSB1c2VyIGNsaWNrZWQgb24gc29tZSBlbGVtZW50IG9mIG91ciB2aWV3LiBGaXJzdCwgY2hlY2sgCi0JCQkgKiBpZiB0aGUgeSBjb29yZGluYXRlIG1hdGNoZXMgd2l0aCBzb21lIG9mIG91ciBtYWNoaW5lIHJlcHJlc2VudGF0aW9ucywgCi0JCQkgKiBjb25zaWRlcmluZyB0aGF0IG91ciBub2RlcyB5J3MgcmFuZ2Ugd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGVpciByZXNwZWN0aXZlCi0JCQkgKiBtYWNoaW5lcy4KLQkJCSAqLwotCQkJaW50IG1vdXNlWCA9IGUueCAtIG9yaWdpbi54OwotCQkJaW50IG1vdXNlWSA9IGUueSAtIG9yaWdpbi55OwotCQkJT2JqZWN0IHNlbGVjdGlvbiA9IG51bGw7Ci0JCQlmb3IgKE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBtYWNoaW5lZ3I6IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zKSB7Ci0JCQkJaWYgKCAobW91c2VZID4gbWFjaGluZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkueSApICYmIChtb3VzZVkgPCBtYWNoaW5lZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS55ICsgbWFjaGluZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkuaGVpZ2h0ICkpICB7Ci0JCQkJCS8qCi0JCQkJCSAqIG1vdXNlWSBiZWxvbmdzIHRvIHRoaXMgbWFjaGluZSByZXByZXNlbnRhdGlvbidzIFkgcmFuZ2UuIE5vdwotCQkJCQkgKiB3ZSBjaGVjayB0aGUgbWFjaGluZSBhbmQgaXRzIG5vZGVzIHRvIHNlZSBpZiB3ZSBoYXZlIGEgbWF0Y2ggIAotCQkJCQkgKi8KLQkJCQkJaWYgKG1hY2hpbmVnci5jb250YWluc1BvaW50KG1vdXNlWCwgbW91c2VZKSApCi0JCQkJCQlzZWxlY3Rpb24gPSBtYWNoaW5lZ3I7Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gbm9kZWdyOiBtYWNoaW5lZ3IuZ2V0Tm9kZXMoKSkgewotCQkJCQkJCWlmIChub2RlZ3IuY29udGFpbnNQb2ludChtb3VzZVgsIG1vdXNlWSkpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbm9kZWdyOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlbGVjdGlvbiAhPSBlbGVtZW50U2VsZWN0ZWQpIHsKLQkJCQllbGVtZW50U2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0JCQkJcmVmcmVzaFZpZXcoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzaXplKEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBnZXRDbGllbnRBcmVhICgpOwotCQkJaG9yaXpvbnRhbEJhci5zZXRNYXhpbXVtIChXSURUSCk7Ci0JCQl2ZXJ0aWNhbEJhci5zZXRNYXhpbXVtIChIRUlHSFQpOwotCQkJaG9yaXpvbnRhbEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3Qud2lkdGgsIGNsaWVudC53aWR0aCkpOwotCQkJdmVydGljYWxCYXIuc2V0VGh1bWIgKE1hdGgubWluIChyZWN0LmhlaWdodCwgY2xpZW50LmhlaWdodCkpOwotCQkJaW50IGhQYWdlID0gV0lEVEggLSBjbGllbnQud2lkdGg7Ci0JCQlpbnQgdlBhZ2UgPSBIRUlHSFQgLSBjbGllbnQuaGVpZ2h0OwotCQkJaW50IGhTZWxlY3Rpb24gPSBob3Jpem9udGFsQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCB2U2VsZWN0aW9uID0gdmVydGljYWxCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaWYgKGhTZWxlY3Rpb24gPj0gaFBhZ2UpIHsKLQkJCQlpZiAoaFBhZ2UgPD0gMCkgaFNlbGVjdGlvbiA9IDA7Ci0JCQkJb3JpZ2luLnggPSAtaFNlbGVjdGlvbjsKLQkJCX0KLQkJCWlmICh2U2VsZWN0aW9uID49IHZQYWdlKSB7Ci0JCQkJaWYgKHZQYWdlIDw9IDApIHZTZWxlY3Rpb24gPSAwOwotCQkJCW9yaWdpbi55ID0gLXZTZWxlY3Rpb247Ci0JCQl9Ci0JCQlyZWRyYXcgKCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhaW50KEV2ZW50IGV2ZW50KXsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJCi0JCQlpbnQgcmVuZGVyV2lkdGggPSBjbGllbnRBcmVhLndpZHRoOwotCQkJaW50IHJlbmRlckhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0OwotCQkJCi0JCQlpZiAoZXZlbnQuaGVpZ2h0ID09IDAgfHwgKHJlbmRlcldpZHRoID09IDAgJiYgcmVuZGVySGVpZ2h0ID09IDApKSB7Ci0JCQkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgd29yayB0byBkbwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSW1hZ2UgaW1hZ2VCdWZmZXIgPSBudWxsOwotCQkJR0MgbmV3R0MgPSBudWxsOwotCQkJaW1hZ2VCdWZmZXIgPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCBXSURUSCwgSEVJR0hUKTsKLQkJCW5ld0dDID0gbmV3IEdDKGltYWdlQnVmZmVyLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0KLQkJCS8qCi0JCQkgKiBzZXQgZm9udCB0byBvdXIgcHJlZGVmaW5lZCBkZWZhdWx0IGZvbnQKLQkJCSAqLwotCQkJbmV3R0Muc2V0Rm9udChkZWZhdWx0Rm9udCk7Ci0JCQotCQkJLyoKLQkJCSAqICBzZXQgc29tZSBwYXJhbWV0ZXJzIHJlZ2FyZGluZyBmb250IHNpemUKLQkJCSAqLwotCQkJaW50IGZvbnRIZWlnaHQgPSBkZWZhdWx0Rm9udCAuZ2V0Rm9udERhdGEoKVswXS5nZXRIZWlnaHQoKTsJCi0JCQkKLQkJCS8qCi0JCQkgKiBJZiBzb21lIGdyYXBoaWNhbCBlbGVtZW50IGlzIHNlbGVjdGVkLCB3cml0ZSBhZGRpdGlvbmFsIGluZm8gYWJvdXQgaXQKLQkJCSAqIG9uIHRoZSB0b3Agb2YgdGhlIHZpZXcuCi0JCQkgKi8KLQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbz0gbnVsbDsKLQkJCWlmIChlbGVtZW50U2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCWFkZGl0aW9uYWxJbmZvPSJTZWxlY3RlZDogIjsKLQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJaWYgKGVsZW1lbnRTZWxlY3RlZCBpbnN0YW5jZW9mIE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbikgewotCQkJCQlNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gbWFjaGluZSA9IChNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24pIGVsZW1lbnRTZWxlY3RlZDsKLQkJCQkJYWRkaXRpb25hbEluZm8gKz0gIk1hY2hpbmUgbmFtZSA6ICIgKyBtYWNoaW5lLmdldE1hY2hpbmVOYW1lKCkgKyAiIHx8IElEOiAiICsgbWFjaGluZS5nZXRNYWNoaW5lSUQoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWxlbWVudFNlbGVjdGVkIGluc3RhbmNlb2YgTm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKSB7Ci0JCQkJCU5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBub2RlID0gKE5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbikgZWxlbWVudFNlbGVjdGVkOwotCQkJCQlhZGRpdGlvbmFsSW5mbyArPSAiTm9kZSBuYW1lIDogIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICIgfHwgSUQ6ICIgKyBub2RlLmdldE5vZGVJRCgpOwotCQkJCQlpZiAobm9kZS5nZXROdW1iZXJPZkpvYnMoKSA+IDApIHsKLQkJCQkJCWFkZGl0aW9uYWxJbmZvICs9ICIgfHwgam9icyBjdXJyZW50IHJ1bm5pbmc6ICI7Ci0JCQkJCQlmb3IgKFN0cmluZyBqb2JJRDogbm9kZS5nZXRKb2JzSURzKCkpCi0JCQkJCQkJYWRkaXRpb25hbEluZm8gKz0gam9iSUQgKyAiICI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJCi0JCQkJLy8gbWFyayB0aGlzIGVsZW1lbnQgdG8gcmVjZWl2ZSBkaWZmZXJlbnQgYmFja2dyb3VuZCBjb2xvcgkJCQotCQkJCWlmIChlbGVtZW50U2VsZWN0ZWQgaW5zdGFuY2VvZiBNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24pCi0JCQkJCSgoTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKSBlbGVtZW50U2VsZWN0ZWQpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJKChOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24pIGVsZW1lbnRTZWxlY3RlZCkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiBTb21lIGNvbnN0YW50cyB1c2VkIHRvIHBhaW50IG1hY2hpbmVzIGFuZCBub2RlcwotCQkJICovCi0JCQlpbnQgT3ggPSAxMDsKLQkJCWludCB4ID0gT3g7Ci0JCQlpbnQgT3kgPSAxMDsKLQkJCWludCB5ID0gT3k7Ci0JCQlpbnQgbm9kZVdpZHRoID1mb250SGVpZ2h0KjI7Ci0JCQlpbnQgbm9kZUhlaWdodCA9IGZvbnRIZWlnaHQqMjsKLQkJCQotCQkJLyoKLQkJCSAqIEl0IHNlZW1zIHRoYXQgMiogZm9udEhlaWdodCBpcyBlcXVpdmFsZW50IHRvIHRoZSBleGFjdCBoZWlnaHQgc2l6ZQotCQkJICogb2YgdGhlIGZvbnQgaW4gcGl4ZWxzLiBUaGlzIHNwYWNlIHdpbGwgYmUgdXNlZCB0byBkcmF3IHRoZSAKLQkJCSAqIGluZm8gc3RyaW5nIGxhdGVyCi0JCQkgKi8KLQkJCXkgPSB5ICsgKGZvbnRIZWlnaHQgKiA0KTsKLQkJCQotCi0JCQkvKgotCQkJICogcGFpbnQgbWFjaGluZXMgYW5kIHByb2Nlc3NlcwotCQkJICovCi0JCQlmb3IgKE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBtYWNoaW5lZ3I6IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zKQotCQkJewotCQkJCWlmICghIG1hY2hpbmVnci5pc0hhbHRlZCgpICkKLQkJCQl7CQotCQkJCQlpZiAobWFjaGluZWdyLmlzU2VsZWN0ZWQoKSkgewotCQkJCQkJbmV3R0Muc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQkJCQkJCW1hY2hpbmVnci5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJbmV3R0Muc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQkJCi0JCQkJCW1hY2hpbmVnci5nZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpLnggPSB4OwotCQkJCQltYWNoaW5lZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS55ID0geTsJCQkJCi0JCQkJCW5ld0dDLmZpbGxHcmFkaWVudFJlY3RhbmdsZSh4LCB5LCBtYWNoaW5lZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS53aWR0aCwgbWFjaGluZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJCWludCBjdXJyZW50WCA9IG1hY2hpbmVnci5nZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpLnggKyBNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24uV0lEVEggKyAxMDsKLQkJCQkJaW50IGN1cnJlbnRZID0gbWFjaGluZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkueTsKLQkJCQkJLy8gcGFpbnQgcHJvY2VzcyBvZiB0aGlzIG5vZGUKLQkJCQkJaWYgKCBtYWNoaW5lZ3IuZ2V0Tm9kZXMoKSAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQkvKgotCQkJCQkJICogSWYgdGhlIG1hY2hpbmUgaGFzIG1vcmUgdGhhbiA1IG5vZGVzLCB3ZSBkcmF3IHRoZW0gaW4gMiByb3dzLgotCQkJCQkJICogb3RoZXJ3aXNlLCBkcmF3IHRoZW0gaW4gYSBzaW5nbGUgcm93Ci0JCQkJCQkgKi8KLQkJCQkJCWlmIChtYWNoaW5lZ3IuZ2V0Tm9kZXMoKS5zaXplKCkgPiA1KSB7Ci0JCQkJCQkJaW50IHRvdGFsU2l6ZSA9bWFjaGluZWdyLmdldE5vZGVzKCkuc2l6ZSgpOwotCQkJCQkJCWludCBoYWxmID0gdG90YWxTaXplIC8gMjsKLQkJCQkJCQlpbnQgaTsKLQkJCQkJCQlpbnQgeFJvdyA9IGN1cnJlbnRYOwotCQkJCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFsZiArKHRvdGFsU2l6ZSAlIDIpOyBpKyspIHsKLQkJCQkJCQkJTm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIG5vZGVnciA9IG1hY2hpbmVnci5nZXROb2RlcygpIC5nZXQoaSk7Ci0JCQkJCQkJCS8vIGFkanVzdGluZyBub2RlIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbgotCQkJCQkJCQlub2RlZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS53aWR0aCA9IG5vZGVXaWR0aDsKLQkJCQkJCQkJbm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkuaGVpZ2h0ID0gbm9kZUhlaWdodDsKLQkJCQkJCQkJbm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkueCA9IGN1cnJlbnRYOwotCQkJCQkJCQlub2RlZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS55ID0gY3VycmVudFk7Ci0JCQkJCQkJCWlmIChub2RlZ3IuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJCQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCQkJCQkJbm9kZWdyLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJCQkJCW5ld0dDLmZpbGxSZWN0YW5nbGUobm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkpOwotCQkJCQkJCQluZXdHQy5zZXRGb3JlZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQkJCQkJCWlmIChub2RlZ3IuZ2V0TnVtYmVyT2ZKb2JzKCkgPiA5KQotCQkJCQkJCQkJbmV3R0MuZHJhd1N0cmluZygiKyIsIGN1cnJlbnRYICsgZm9udEhlaWdodC8yLCBjdXJyZW50WSk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCW5ld0dDLmRyYXdTdHJpbmcoU3RyaW5nLnZhbHVlT2Yobm9kZWdyLmdldE51bWJlck9mSm9icygpKSwgY3VycmVudFggKyBmb250SGVpZ2h0LzIsIGN1cnJlbnRZKTsKLQkJCQkJCQkJbmV3R0MuZHJhd1JlY3RhbmdsZShub2RlZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJCWN1cnJlbnRYID0gY3VycmVudFggKyBOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24uV0lEVEggKyAxOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvLyB1cGRhdGV4IGFuZCAgeSB0byBwYWludCBuZXh0IHJvdwotCQkJCQkJCS8vIAotCQkJCQkJCWN1cnJlbnRYID0geFJvdzsKLQkJCQkJCQljdXJyZW50WSArPSBub2RlSGVpZ2h0ICsgNTsgCi0JCQkJCQkJZm9yIChpbnQgaiA9IGkgOyBqIDwgdG90YWxTaXplOyBqKyspIHsKLQkJCQkJCQkJTm9kZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIG5vZGVnciA9IG1hY2hpbmVnci5nZXROb2RlcygpIC5nZXQoaik7Ci0JCQkJCQkJCS8vIGFkanVzdGluZyBub2RlIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbgotCQkJCQkJCQlub2RlZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS53aWR0aCA9IG5vZGVXaWR0aDsKLQkJCQkJCQkJbm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkuaGVpZ2h0ID0gbm9kZUhlaWdodDsKLQkJCQkJCQkJbm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkueCA9IGN1cnJlbnRYOwotCQkJCQkJCQlub2RlZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKS55ID0gY3VycmVudFk7Ci0JCQkJCQkJCWlmIChub2RlZ3IuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJCQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCQkJCQkJbm9kZWdyLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJCQkJCW5ld0dDLmZpbGxSZWN0YW5nbGUobm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkpOwotCQkJCQkJCQluZXdHQy5zZXRGb3JlZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQkJCQkJCWlmIChub2RlZ3IuZ2V0TnVtYmVyT2ZKb2JzKCkgPiA5KQotCQkJCQkJCQkJbmV3R0MuZHJhd1N0cmluZygiKyIsIGN1cnJlbnRYICsgZm9udEhlaWdodC8yLCBjdXJyZW50WSk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCW5ld0dDLmRyYXdTdHJpbmcoU3RyaW5nLnZhbHVlT2Yobm9kZWdyLmdldE51bWJlck9mSm9icygpKSwgY3VycmVudFggKyBmb250SGVpZ2h0LzIsIGN1cnJlbnRZKTsKLQkJCQkJCQkJbmV3R0MuZHJhd1JlY3RhbmdsZShub2RlZ3IuZ2V0R3JhcGhpY2FsUmVwcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJCWN1cnJlbnRYID0gY3VycmVudFggKyBOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24uV0lEVEggKyAxOwkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvKgotCQkJCQkJICogSWYgdGhlIG1hY2hpbmUgaGFzIGxlc3MgdGhhbiA1IG5vZGVzLCBwYWludCBhbGwgb2YgdGhlbSBpbiBhIHNpbmdsZSByb3cuCi0JCQkJCQkgKi8KLQkJCQkJCWVsc2UgCi0JCQkJCQlmb3IgKE5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBub2RlZ3IgOiBtYWNoaW5lZ3IuZ2V0Tm9kZXMoKSkgewotCQkJCQkJCS8vIGFkanVzdGluZyBub2RlIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbgotCQkJCQkJCW5vZGVnci5nZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpLndpZHRoID0gbm9kZVdpZHRoOwotCQkJCQkJCW5vZGVnci5nZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpLmhlaWdodCA9IG5vZGVIZWlnaHQ7Ci0JCQkJCQkJbm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkueCA9IGN1cnJlbnRYOwotCQkJCQkJCW5vZGVnci5nZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpLnkgPSBjdXJyZW50WTsKLQkJCQkJCQlpZiAobm9kZWdyLmlzU2VsZWN0ZWQoKSkgewotCQkJCQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCQkJCQlub2RlZ3Iuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJCW5ld0dDLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQkJCQluZXdHQy5maWxsUmVjdGFuZ2xlKG5vZGVnci5nZXRHcmFwaGljYWxSZXByZXNlbnRhdGlvbigpKTsKLQkJCQkJCQluZXdHQy5zZXRGb3JlZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQkJCQkJaWYgKG5vZGVnci5nZXROdW1iZXJPZkpvYnMoKSA+IDkpCi0JCQkJCQkJCW5ld0dDLmRyYXdTdHJpbmcoIisiLCBjdXJyZW50WCArIGZvbnRIZWlnaHQvMiwgY3VycmVudFkpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJbmV3R0MuZHJhd1N0cmluZyhTdHJpbmcudmFsdWVPZihub2RlZ3IuZ2V0TnVtYmVyT2ZKb2JzKCkpLCBjdXJyZW50WCArIGZvbnRIZWlnaHQvMiwgY3VycmVudFkpOwotCQkJCQkJCW5ld0dDLmRyYXdSZWN0YW5nbGUobm9kZWdyLmdldEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKCkpOwotCQkJCQkJCWN1cnJlbnRYID0gY3VycmVudFggKyBOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24uV0lEVEggKyAxOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHVwZGF0ZSB5IHRvIHByaW50IG1hY2hpbmUgbmFtZQotCQkJCQl5ID0geSArIE1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbi5IRUlHSFQgKyAxMDsKLQkJCQkJbmV3R0Muc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCQluZXdHQy5kcmF3U3RyaW5nKG1hY2hpbmVnci5nZXRNYWNoaW5lTmFtZSgpLCB4LCB5KTsKLQkJCQkJLy8gdXBkYXRlIHkgdG8gcGFpbnQgbmV4dCBtYWNoaW5lCi0JCQkJCXkgPSB5ICsgMzA7Ci0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIFdlIHdyaXRlIHRoZSBpbmZvIHN0cmluZyBub3csIHRodXMgaXQnbGwgYmUgb24gdG9wIGFuZAotCQkJICogYWx3YXlzIHZpc2libGUuIE5vdGUgdGhhdCB3ZSB1c2UgeCBpbnN0ZWFkIG9mCi0JCQkgKiB0aGUgcmVsYXRpdmUgcG9zaXRpb24gYmVjYXVzZSB3ZSB3YW50IHRoaXMgc3RyaW5nCi0JCQkgKiB0byBiZSAnc2Nyb2xsYWJsZScgb24gdGhlIGhvcml6b250YWwuLCBidXQgbm90Ci0JCQkgKiBvbiB0aGUgdmVydGljYWwKLQkJCSAqLwotCQkJaWYgKGFkZGl0aW9uYWxJbmZvICE9IG51bGwpIHsKLQkJCQluZXdHQy5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCW5ld0dDLmRyYXdTdHJpbmcoYWRkaXRpb25hbEluZm8sIHgsIE95IC0gb3JpZ2luLnkpOwotCQkJfQotCQkJCi0JCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2VCdWZmZXIsIG9yaWdpbi54LCBvcmlnaW4ueSk7Ci0JCQluZXdHQy5kaXNwb3NlKCk7Ci0JCQlpbWFnZUJ1ZmZlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1hY2hpbmVSZXByZXNlbnRhdGlvbkV4aXN0cyhTdHJpbmcgbWFjaGluZUlEKSB7Ci0JCWZvciAoTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIG1hY2hpbmVnciA6IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zKQotCQkJaWYgKG1hY2hpbmVnci5nZXRNYWNoaW5lSUQoKS5lcXVhbHMobWFjaGluZUlEKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBMaXN0ZW5lciB0byB0YWtlIGNhcmUgb2Ygam9iIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFF1ZXVlQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElRdWV1ZUNoaWxkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZEpvYkV2ZW50IGUpIHsKLQkJCWJvb2xlYW4gbmVlZFJlZnJlc2ggPSBmYWxzZTsKLQkJCWZvciAoSVBKb2Igam9iIDogZS5nZXRKb2JzKCkpIHsKLQkJCQlpZiAoIChqb2IuZ2V0U3RhdGUoKSA9PSAgIEpvYkF0dHJpYnV0ZXMuU3RhdGUuU1RBUlRFRCkgfHwgKCBqb2IuZ2V0U3RhdGUoKSA9PSBKb2JBdHRyaWJ1dGVzLlN0YXRlLlJVTk5JTkcpIHx8IAotCQkJCQkJKGpvYi5nZXRTdGF0ZSgpID09IEpvYkF0dHJpYnV0ZXMuU3RhdGUuUEVORElORyApICkgIHsKLQkJCQkJLyoKLQkJCQkJICogQWRkIGpvYiB0byB0aGUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGl0cyBub2RlCi0JCQkJCSAqLwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYi5nZXRQcm9jZXNzZXMoKS5sZW5ndGg7IGkgKyspIHsKLQkJCQkJCUlQUHJvY2VzcyBwcm9jZXNzPSBqb2IuZ2V0UHJvY2Vzc2VzKClbaV07Ci0JCQkJCQlpZiAocHJvY2Vzcy5nZXROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCW5vZGVzSGFzaE1hcC5nZXQocHJvY2Vzcy5nZXROb2RlKCkuZ2V0SUQoKSkKLQkJCQkJCQkuYWRkSm9iKGpvYi5nZXRJRCgpKTsKLQkJCQkJCQluZWVkUmVmcmVzaCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHJlbW92ZSBqb2IgZnJvbSB0aGUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGl0cyBub2RlCi0JCQkJCSAqLwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYi5nZXRQcm9jZXNzZXMoKS5sZW5ndGg7IGkgKyspIHsKLQkJCQkJCUlQUHJvY2VzcyBwcm9jZXNzPSBqb2IuZ2V0UHJvY2Vzc2VzKClbaV07Ci0JCQkJCQlpZiAocHJvY2Vzcy5nZXROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCW5vZGVzSGFzaE1hcC5nZXQocHJvY2Vzcy5nZXROb2RlKCkuZ2V0SUQoKSkKLQkJCQkJCQkucmVtb3ZlSm9iKGpvYi5nZXRJRCgpKTsKLQkJCQkJCQluZWVkUmVmcmVzaCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5lZWRSZWZyZXNoKQotCQkJCQlyZWZyZXNoVmlldygpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBJTmV3Sm9iRXZlbnQgZSkgewotCQkJYm9vbGVhbiBuZWVkUmVmcmVzaCA9IGZhbHNlOwotCQkJZm9yIChJUEpvYiBqb2I6IGUuZ2V0Sm9icygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBBZGQgam9iIHRvIHRoZSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgaXRzIG5vZGUKLQkJCQkgKi8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYi5nZXRQcm9jZXNzZXMoKS5sZW5ndGg7IGkgKyspIHsKLQkJCQkJSVBQcm9jZXNzIHByb2Nlc3M9IGpvYi5nZXRQcm9jZXNzZXMoKVtpXTsKLQkJCQkJaWYgKHByb2Nlc3MuZ2V0Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCW5vZGVzSGFzaE1hcC5nZXQocHJvY2Vzcy5nZXROb2RlKCkuZ2V0SUQoKSkKLQkJCQkJCQkJLmFkZEpvYihqb2IuZ2V0SUQoKSk7Ci0JCQkJCQluZWVkUmVmcmVzaCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmVlZFJlZnJlc2gpCi0JCQkJcmVmcmVzaFZpZXcoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZUpvYkV2ZW50IGUpIHsKLQkJCWJvb2xlYW4gbmVlZFJlZnJlc2ggPSBmYWxzZTsKLQkJCWZvciAoSVBKb2Igam9iOiBlLmdldEpvYnMoKSkgewotCQkJCS8qCi0JCQkJICogcmVtb3ZlIGpvYiBmcm9tIHRoZSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgaXRzIG5vZGUKLQkJCQkgKi8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYi5nZXRQcm9jZXNzZXMoKS5sZW5ndGg7IGkgKyspIHsKLQkJCQkJSVBQcm9jZXNzIHByb2Nlc3M9IGpvYi5nZXRQcm9jZXNzZXMoKVtpXTsKLQkJCQkJaWYgKHByb2Nlc3MuZ2V0Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCW5vZGVzSGFzaE1hcC5nZXQocHJvY2Vzcy5nZXROb2RlKCkuZ2V0SUQoKSkKLQkJCQkJCQkJLnJlbW92ZUpvYihqb2IuZ2V0SUQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChuZWVkUmVmcmVzaCkKLQkJCQlyZWZyZXNoVmlldygpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgTWFjaGluZUNoaWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJTWFjaGluZUNoaWxkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBJQ2hhbmdlZE5vZGVFdmVudCBlKSB7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElOZXdOb2RlRXZlbnQgZSkgewotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmb3IgKElQTm9kZSBub2RlIDogZS5nZXROb2RlcygpKSB7Ci0JCQkJCQkvLyBjcmVhdGUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RlCi0JCQkJCQlOb2RlR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gbm9kZWdyID0gbmV3IE5vZGVHcmFwaGljYWxSZXByZXNlbnRhdGlvbihub2RlLmdldE5hbWUoKSwgbm9kZS5nZXRJRCgpKTsKLQkJCQkJCS8vIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBjb3JyZXNwb25kZW50IElQTWFjaGluZQotCQkJCQkJCWZvciAoTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIG1hY2hpbmUgOiBtYWNoaW5lc0dyYXBoaWNhbFJlcHJlc2VudGF0aW9ucykgewotCQkJCQkJCQlpZiAobWFjaGluZS5nZXRNYWNoaW5lSUQoKS5lcXVhbHMobm9kZS5nZXRNYWNoaW5lKCkuZ2V0SUQoKSkgKXsKLQkJCQkJCQkJCW1hY2hpbmUuYWRkTm9kZShub2RlZ3IpOwotCQkJCQkJCQkJbm9kZXNIYXNoTWFwLnB1dChub2RlLmdldElEKCksIG5vZGVncik7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQkJCQotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJcmVmcmVzaFZpZXcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElSZW1vdmVOb2RlRXZlbnQgZSkgewotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmb3IgKElQTm9kZSBub2RlIDogZS5nZXROb2RlcygpKSB7Ci0JCQkJCQkvLyBkZWxldGUgdGhlIG5vZGUgZ3JhcGhpY2FsIHZpZXcgb24gdGhlIGNvcnJlc3BvbmRpbmcgSVBNYWNoaW5lCi0JCQkJCQkJZm9yIChNYWNoaW5lR3JhcGhpY2FsUmVwcmVzZW50YXRpb24gbWFjaGluZSA6IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zKSB7Ci0JCQkJCQkJCWlmIChtYWNoaW5lLmdldE1hY2hpbmVJRCgpLmVxdWFscyhub2RlLmdldE1hY2hpbmUoKS5nZXRJRCgpKSApewotCQkJCQkJCQkJbWFjaGluZS5yZW1vdmVOb2RlKG5vZGUuZ2V0SUQoKSk7Ci0JCQkJCQkJCQlub2Rlc0hhc2hNYXAucmVtb3ZlKG5vZGUuZ2V0SUQoKSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQkJCQotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJcmVmcmVzaFZpZXcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgTU1DaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIgewotCQkKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudCBlKSB7Ci0JCQlib29sZWFuIG5lZWRSZWZyZXNoID0gZmFsc2U7Ci0JCQlmb3IgKElSZXNvdXJjZU1hbmFnZXIgcm0gOiBlLmdldFJlc291cmNlTWFuYWdlcnMoKSkgewotCQkJCWlmICggKCBybS5nZXRTdGF0ZSgpID09IFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1RPUFBFRCApIHx8IAotCQkJCQkJKCBybS5nZXRTdGF0ZSgpID09IFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuU1VTUEVOREVEKSB8fAotCQkJCQkJKCBybS5nZXRTdGF0ZSgpID09IFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpICkgewotCQkJCQkvKiAKLQkJCQkJICogcmVmcmVzaCB0aGUgdmlldywgcmVtb3ZpbmcgdGhlIHJlc291cmNlIG1hbmFnZXIgbWFjaGluZXMsIGJ1dAotCQkJCQkgKiBub3QgcmVtb3ZpbmcgbWFjaGluZSBsaXN0ZW5lcnMuCi0JCQkJCSAqLwotCQkJCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogcm0uZ2V0TWFjaGluZXMoKSkgewotCQkJCQkJU3RyaW5nIG1hY2hpbmVJRCA9IG1hY2hpbmUuZ2V0SUQoKTsKLQkJCQkJCWZvciAoTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIG1hY2hpbmVnciA6IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zKSAKLQkJCQkJCQlpZiAobWFjaGluZWdyLmdldE1hY2hpbmVJRCgpLmVxdWFscyhtYWNoaW5lSUQpKSB7Ci0JCQkJCQkJCW1hY2hpbmVnci5zZXRIYWx0ZWQodHJ1ZSk7Ci0JCQkJCQkJCW5lZWRSZWZyZXNoID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCQkvKgotCQkJCSAqIG90aGVyd2lzZSwgcmVhY3RpdmF0ZSBtYWNoaW5lcyBvZiB0aGUgc3RhcnRlZCAvIHN0YXJ0aW5nIHJlc291cmNlCi0JCQkJICogbWFuYWdlcgotCQkJCSAqLwotCQkJCWVsc2UgewotCQkJCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogcm0uZ2V0TWFjaGluZXMoKSkgewotCQkJCQkJU3RyaW5nIG1hY2hpbmVJRCA9IG1hY2hpbmUuZ2V0SUQoKTsKLQkJCQkJCWZvciAoTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uIG1hY2hpbmVnciA6IG1hY2hpbmVzR3JhcGhpY2FsUmVwcmVzZW50YXRpb25zKSAKLQkJCQkJCQlpZiAobWFjaGluZWdyLmdldE1hY2hpbmVJRCgpLmVxdWFscyhtYWNoaW5lSUQpKSB7Ci0JCQkJCQkJCW1hY2hpbmVnci5zZXRIYWx0ZWQoZmFsc2UpOwotCQkJCQkJCQluZWVkUmVmcmVzaCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChuZWVkUmVmcmVzaCkKLQkJCQlyZWZyZXNoVmlldygpOwotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJLyoKLQkJCSAqIEFkZCByZXNvdXJjZSBtYW5hZ2VyIGNoaWxkIGxpc3RlbmVyIHNvIHdlIGdldCBub3RpZmllZCB3aGVuIG5ldwotCQkJICogbWFjaGluZXMgYXJlIGFkZGVkIHRvIHRoZSBtb2RlbC4KLQkJCSAqLwotCQkJZmluYWwgSVJlc291cmNlTWFuYWdlciBybSA9IGUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JICAgICAgICBybS5hZGRDaGlsZExpc3RlbmVyKHJlc291cmNlTWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJCS8qCi0JCQkgKiBSZW1vdmVkIHJlc291cmNlIG1hbmFnZXIgY2hpbGQgbGlzdGVuZXIgd2hlbiByZXNvdXJjZSBtYW5hZ2VyIGlzIHJlbW92ZWQuCi0JCQkgKi8KLQkJCWUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVtb3ZlQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCQkKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBSTUNoaWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRNYWNoaW5lRXZlbnQgZSkgewotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFF1ZXVlRXZlbnQgZSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgSU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCQlib29sZWFuIG5lZWRSZWZyZXNoID0gZmFsc2U7Ci0JCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogZS5nZXRNYWNoaW5lcygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBjaGVjayBpZiB0aGUgbWFjaGluZSB3YXNuJ3QgYWRkZWQgYWxyZWFkeSBvbiB0aGUgCi0JCQkJKiAgc3RhcnQgb2YgdGhlIHZpZXcKLQkJCQkgKi8gCi0JCQkJaWYgKCEgIG1hY2hpbmVSZXByZXNlbnRhdGlvbkV4aXN0cyhtYWNoaW5lLmdldElEKCkpICl7Ci0JCQkJCS8qCi0JCQkJCSAqIEFkZCB1cyBhcyBhIGNoaWxkIGxpc3RlbmVyIHNvIHdlIGdldCBub3RpZmllZCBvZiBub2RlIGV2ZW50cwotCQkJCQkgKi8KLQkJCQkJbWFjaGluZS5hZGRDaGlsZExpc3RlbmVyKG1hY2hpbmVMaXN0ZW5lcik7Ci0JCQkJCU1hY2hpbmVHcmFwaGljYWxSZXByZXNlbnRhdGlvbiBtYWNoaW5lZ3IgPSBuZXcgTWFjaGluZUdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKG1hY2hpbmUuZ2V0TmFtZSgpLCBtYWNoaW5lLmdldElEKCkgKTsKLQkJCQkJbWFjaGluZXNHcmFwaGljYWxSZXByZXNlbnRhdGlvbnMuYWRkKG1hY2hpbmVncik7Ci0JCQkJCW5lZWRSZWZyZXNoID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvL3JlZnJlc2ggaWYgbmVlZGVkCi0JCQlpZiAobmVlZFJlZnJlc2gpCi0JCQkJcmVmcmVzaFZpZXcoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1F1ZXVlRXZlbnQgZSkgewotCQkJZm9yIChJUFF1ZXVlIHF1ZXVlIDogZS5nZXRRdWV1ZXMoKSkgewotCQkJCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgSVJlbW92ZU1hY2hpbmVFdmVudCBlKSB7Ci0JCQkvKgotCQkJICogVXBkYXRlIHZpZXdzIHdoZW4gYSBtYWNoaW5lIGlzIHJlbW92ZWQuCi0JCQkgKi8KLQkJCVVJVXRpbHMuc2FmZVJ1bkFzeW5jSW5VSVRocmVhZChuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZm9yIChJUE1hY2hpbmUgbWFjaGluZSA6IGUuZ2V0TWFjaGluZXMoKSkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYWNoaW5lc0dyYXBoaWNhbFJlcHJlc2VudGF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJCQkJCWlmIChtYWNoaW5lc0dyYXBoaWNhbFJlcHJlc2VudGF0aW9ucy5nZXQoaSkuZ2V0TWFjaGluZUlEKCkuZXF1YWxzKG1hY2hpbmUuZ2V0SUQoKSkpIHsKLQkJCQkJCQkJbWFjaGluZXNHcmFwaGljYWxSZXByZXNlbnRhdGlvbnMucmVtb3ZlKGkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvKgotCQkJCQkJICogUmVtb3ZlIGNoaWxkIGxpc3RlbmVyCi0JCQkJCQkgKi8KLQkJCQkJCW1hY2hpbmUucmVtb3ZlQ2hpbGRMaXN0ZW5lcihtYWNoaW5lTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0pOwotCQkJcmVmcmVzaFZpZXcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVRdWV1ZUV2ZW50IGUpIHsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IGUuZ2V0UXVldWVzKCkpIHsKLQkJCQlxdWV1ZS5yZW1vdmVDaGlsZExpc3RlbmVyKHF1ZXVlQ2hpbGRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgUmVmcmVzaFdvcmtiZW5jaEpvYiBleHRlbmRzIFdvcmtiZW5jaEpvYiB7Ci0JCXByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jawl3YWl0TG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0JCXByaXZhdGUgTGlzdDxCb29sZWFuPiByZWZyZXNoTGlzdCA9IG5ldyBBcnJheUxpc3Q8Qm9vbGVhbj4oKTsKLQkJcHVibGljIFJlZnJlc2hXb3JrYmVuY2hKb2IoKSB7Ci0JCQlzdXBlcigiUmVmcmVzaGluZyB3b3JrYmVuY2guLi4iKTsKLQkJfQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJYm9vbGVhbiByZWZyZXNoQWxsID0gaXNSZWZyZXNoQWxsKCk7Ci0JCQkKLQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCX0KLQkJCQotCQkJLy9pZiBsYXN0IHJlZnJlc2ggb2JqZWN0IGlzIHRydWUgYW5kIHByZXZpb3VzIHJlZnJlc2ggaXMgZmFsc2UsIHRoZW4gcmVmcmVzaCBhZ2FpbiAKLQkJCWJvb2xlYW4gbGFzdFZhbHVlID0gaXNSZWZyZXNoQWxsKCk7Ci0JCQl3YWl0TG9jay5sb2NrKCk7Ci0JCQl0cnkgewotCQkJCXJlZnJlc2hMaXN0LmNsZWFyKCk7Ci0JCQkJaWYgKHJlZnJlc2hBbGwgIT0gbGFzdFZhbHVlICYmICFyZWZyZXNoQWxsKSB7Ci0JCQkJCXJlZnJlc2hMaXN0LmFkZChuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCXNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTY2hlZHVsZSgpIHsKLQkJCWludCBzaXplID0gc2l6ZSgpOwotCQkJCi0JCQlyZXR1cm4gKHNpemUgPT0gMSk7Ci0JCX0KLQkJcHJpdmF0ZSBpbnQgc2l6ZSgpIHsKLQkJCXdhaXRMb2NrLmxvY2soKTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlZnJlc2hMaXN0LnNpemUoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXdhaXRMb2NrLnVubG9jaygpOwotCQkJfQotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBpc1JlZnJlc2hBbGwoKSB7Ci0JCQl3YWl0TG9jay5sb2NrKCk7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZWZyZXNoTGlzdC5nZXQocmVmcmVzaExpc3Quc2l6ZSgpLTEpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgc2NoZWR1bGUoYm9vbGVhbiByZWZyZXNoX2FsbCwgYm9vbGVhbiBmb3JjZSkgewotCQkJd2FpdExvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZm9yY2UpCi0JCQkJCXJlZnJlc2hMaXN0LmNsZWFyKCk7Ci0JCQkJcmVmcmVzaExpc3QuYWRkKG5ldyBCb29sZWFuKHJlZnJlc2hfYWxsKSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl3YWl0TG9jay51bmxvY2soKTsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL1BhcmFsbGVsSm9ic1ZpZXcuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvUGFyYWxsZWxKb2JzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjM3MzExLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvUGFyYWxsZWxKb2JzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZFByb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3Sm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklOZXdSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuUGFyYWxsZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnMuSm9iRm9jdXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnVpLmFjdGlvbnMuUmVtb3ZlQWxsVGVybWluYXRlZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuYWN0aW9ucy5UZXJtaW5hdGVKb2JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JUFRQVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2Vycy5Kb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuV29ya2JlbmNoSm9iOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIEFkZGl0aW9uYWwgY2hhbmdlcyBHcmVnIFdhdHNvbgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbGxlbEpvYnNWaWV3IGV4dGVuZHMgQWJzdHJhY3RQYXJhbGxlbFNldFZpZXcgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewotCXByaXZhdGUgZmluYWwgY2xhc3MgSm9iQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElKb2JDaGlsZExpc3RlbmVyIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKSB7Ci0JCQlpZiAoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElQSm9iKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0gSUpvYkNoaWxkTGlzdGVuZXIgLSBJQ2hhbmdlZFByb2Nlc3NFdmVudDogIiArIHRoaXMpOwotCQkJCX0KLQkJCQlpZiAoISgoSVBKb2IpZS5nZXRTb3VyY2UoKSkuaXNEZWJ1ZygpKSB7Ci0JCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UHJvY2Vzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1Byb2Nlc3NFdmVudCBlKSB7Ci0JCQlpZiAoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElQSm9iKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0gSUpvYkNoaWxkTGlzdGVuZXIgLSBJTmV3UHJvY2Vzc0V2ZW50OiAiICsgdGhpcyk7Ci0JCQkJfQotCQkJCWZvciAoSVBQcm9jZXNzIHByb2MgOiBlLmdldFByb2Nlc3NlcygpKSB7Ci0JCQkJCWdldEpvYk1hbmFnZXIoKS5hZGRQcm9jZXNzKHByb2MpOwotCQkJCX0KLQkJCQlib29sZWFuIGlzQ3VycmVudCA9IGUuZ2V0U291cmNlKCkuZ2V0SUQoKS5lcXVhbHMoZ2V0Q3VycmVudElEKCkpOwotCQkJCWlmIChpc0N1cnJlbnQpIHsKLQkJCQkJdXBkYXRlSm9iU2V0KCk7Ci0JCQkJCWNoYW5nZUpvYlJlZnJlc2goKElQSm9iKWUuZ2V0U291cmNlKCkpOwotCQkJCQkvLyBzaG91bGQgdGhpcyBqdXN0IGJlIHJlZnJlc2hKb2JWaWV3KCk/Ci0JCQkJCS8vIHJlZnJlc2ggd2lsbCBuZWVkIHRvIGJlIGJhdGNoZWQgaW4gdGhlIGZ1dHVyZQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZVByb2Nlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVQcm9jZXNzRXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUEpvYikgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tIElKb2JDaGlsZExpc3RlbmVyIC0gSVJlbW92ZVByb2Nlc3NFdmVudDogIiArIHRoaXMpOwotCQkJCX0KLQkJCQlib29sZWFuIGlzQ3VycmVudCA9IGUuZ2V0U291cmNlKCkuZ2V0SUQoKS5lcXVhbHMoZ2V0Q3VycmVudElEKCkpOwotCQkJCWZvciAoSVBQcm9jZXNzIHByb2MgOiBlLmdldFByb2Nlc3NlcygpKSB7Ci0JCQkJCWdldEpvYk1hbmFnZXIoKS5yZW1vdmVQcm9jZXNzKHByb2MpOwotCQkJCX0KLQkJCQlpZiAoaXNDdXJyZW50KSB7Ci0JCQkJCXVwZGF0ZUpvYlNldCgpOwotCQkJCQljaGFuZ2VKb2JSZWZyZXNoKChJUEpvYillLmdldFNvdXJjZSgpKTsKLQkJCQkJLy8gc2hvdWxkIHRoaXMganVzdCBiZSByZWZyZXNoSm9iVmlldygpPwotCQkJCQkvLyByZWZyZXNoIHdpbGwgbmVlZCB0byBiZSBiYXRjaGVkIGluIHRoZSBmdXR1cmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBNTUNoaWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFJlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJCS8qCi0JCQkgKiBBZGQgcmVzb3VyY2UgbWFuYWdlciBjaGlsZCBsaXN0ZW5lciBzbyB3ZSBnZXQgbm90aWZpZWQgd2hlbiBuZXcKLQkJCSAqIG1hY2hpbmVzIGFyZSBhZGRlZCB0byB0aGUgbW9kZWwuCi0JCQkgKi8KLQkJCWZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm0gPSBlLmdldFJlc291cmNlTWFuYWdlcigpOwotCSAgICAgICAgcm0uYWRkQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5saXN0ZW5lcnMuSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudCBlKSB7Ci0JCQkvKgotCQkJICogUmVtb3ZlZCByZXNvdXJjZSBtYW5hZ2VyIGNoaWxkIGxpc3RlbmVyIHdoZW4gcmVzb3VyY2UgbWFuYWdlciBpcyByZW1vdmVkLgotCQkJICovCi0JCQllLmdldFJlc291cmNlTWFuYWdlcigpLnJlbW92ZUNoaWxkTGlzdGVuZXIocmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBRdWV1ZUNoaWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJUXVldWVDaGlsZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRKb2JFdmVudCBlKSB7Ci0JCQlyZWZyZXNoSm9iVmlldygpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3Sm9iRXZlbnQgZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLSBRdWV1ZUNoaWxkTGlzdGVuZXIgLSBJTmV3Sm9iRXZlbnQ6ICIgKyB0aGlzKTsKLQkJCX0KLQkJCUlQSm9iIGxhc3RKb2IgPSBudWxsOwotCQkJZm9yIChJUEpvYiBqb2IgOiBlLmdldEpvYnMoKSkgewotCQkJCWdldEpvYk1hbmFnZXIoKS5jcmVhdGVFbGVtZW50SGFuZGxlcihqb2IpOwotCQkJCWxhc3RKb2IgPSBqb2I7Ci0JCQl9Ci0JCQlpZiAobGFzdEpvYiAhPSBudWxsKSB7Ci0JCQkJaWYgKGpvYkZvY3VzKSB7Ci0JCQkJCWNoYW5nZUpvYlJlZnJlc2gobGFzdEpvYiwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaEpvYlZpZXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZUpvYkV2ZW50IGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0gUXVldWVDaGlsZExpc3RlbmVyIC0gSVJlbW92ZUpvYkV2ZW50OiAiICsgdGhpcyk7Ci0JCQl9Ci0JCQlmb3IgKElQSm9iIGpvYiA6IGUuZ2V0Sm9icygpKSB7Ci0JCQkJZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYihqb2IpOwotCQkJfQotCQkJY2hhbmdlSm9iUmVmcmVzaChudWxsLCB0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIFJNQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTWFjaGluZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlZE1hY2hpbmVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkTWFjaGluZUV2ZW50IGUpIHsKLQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckNoYW5nZWRRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRRdWV1ZUV2ZW50IGUpIHsKLQkJCS8vIENhbiBzYWZlbHkgaWdub3JlCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlck1hY2hpbmVMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlck5ld01hY2hpbmVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdNYWNoaW5lRXZlbnQgZSkgewotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdRdWV1ZUV2ZW50IGUpIHsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IGUuZ2V0UXVldWVzKCkpIHsKLQkJCQlxdWV1ZS5hZGRDaGlsZExpc3RlbmVyKHF1ZXVlQ2hpbGRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlck1hY2hpbmVMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlclJlbW92ZU1hY2hpbmVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVNYWNoaW5lRXZlbnQgZSkgewotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyUmVtb3ZlUXVldWVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVRdWV1ZUV2ZW50IGUpIHsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IGUuZ2V0UXVldWVzKCkpIHsKLQkJCQlxdWV1ZS5yZW1vdmVDaGlsZExpc3RlbmVyKHF1ZXVlQ2hpbGRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgSm9iVmlld1VwZGF0ZVdvcmtiZW5jaEpvYiBleHRlbmRzIFdvcmtiZW5jaEpvYiB7Ci0JCXByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jawl3YWl0TG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0JCXByaXZhdGUgTGlzdDxJU2VsZWN0aW9uPiByZWZyZXNoSm9iTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbj4oKTsKLQkJCi0JCXB1YmxpYyBKb2JWaWV3VXBkYXRlV29ya2JlbmNoSm9iKCkgewotCQkJc3VwZXIoIlJlZnJlc2hpbmcgam9iIHZpZXcuLi4iKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iI3J1bkluVUlUaHJlYWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCSAqLwotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHNpemUoKSA9PSAwKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRMYXN0Sm9iU2VsZWN0aW9uKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIj09PT09PT09PT09PT0gSm9iVmlld1VwZGF0ZVdvcmtiZW5jaEpvYiByZWZyZXNoOiAiICsgc2VsZWN0aW9uKTsKLQkJCX0KLQkJCWlmICgham9iVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlqb2JUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJCQlqb2JUYWJsZVZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJfQotCQkJCi0JCQkvL2lmIGxhc3QgcmVmcmVzaCBvYmplY3QgaXMgdHJ1ZSBhbmQgcHJldmlvdXMgcmVmcmVzaCBpcyBmYWxzZSwgdGhlbiByZWZyZXNoIGFnYWluIAotCQkJSVNlbGVjdGlvbiBsYXN0U2VsZWN0aW9uID0gZ2V0TGFzdEpvYlNlbGVjdGlvbigpOwotCQkJd2FpdExvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQlyZWZyZXNoSm9iTGlzdC5jbGVhcigpOwotCQkJCWlmICghc2VsZWN0aW9uLmVxdWFscyhsYXN0U2VsZWN0aW9uKSkgewotCQkJCQlyZWZyZXNoSm9iTGlzdC5hZGQobGFzdFNlbGVjdGlvbik7Ci0JCQkJCXNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkJICogQHBhcmFtIGZvcmNlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzY2hlZHVsZShJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBmb3JjZSkgewotCQkJd2FpdExvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZm9yY2UpIHsKLQkJCQkJcmVmcmVzaEpvYkxpc3QuY2xlYXIoKTsKLQkJCQl9Ci0JCQkJaWYgKCFyZWZyZXNoSm9iTGlzdC5jb250YWlucyhzZWxlY3Rpb24pKSB7Ci0JCQkJCXJlZnJlc2hKb2JMaXN0LmFkZChzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXdhaXRMb2NrLnVubG9jaygpOwotCQkJfQotCQkJc2NoZWR1bGUoKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYiNzaG91bGRTY2hlZHVsZSgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTY2hlZHVsZSgpIHsKLQkJCWludCBzaXplID0gc2l6ZSgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCI9PT09PT09PT09PT09IEpvYlZpZXdVcGRhdGVXb3JrYmVuY2hKb2I6ICIgKyByZWZyZXNoSm9iTGlzdC5zaXplKCkpOwotCQkJfQotCQkJcmV0dXJuIChzaXplID09IDEpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uIGdldExhc3RKb2JTZWxlY3Rpb24oKSB7Ci0JCQl3YWl0TG9jay5sb2NrKCk7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZWZyZXNoSm9iTGlzdC5nZXQocmVmcmVzaEpvYkxpc3Quc2l6ZSgpLTEpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGludCBzaXplKCkgewotCQkJd2FpdExvY2subG9jaygpOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVmcmVzaEpvYkxpc3Quc2l6ZSgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBKb2IgZm9jdXMgZmxhZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBqb2JGb2N1cyA9IHRydWU7Ci0JCi0JLyoKLQkgKiBNb2RlbCBsaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIElNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyIG1vZGVsTWFuYWdlckxpc3RlbmVyID0gbmV3IE1NQ2hpbGRMaXN0ZW5lcigpOwotCXByaXZhdGUgZmluYWwgSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIgcmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgUk1DaGlsZExpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBJSm9iQ2hpbGRMaXN0ZW5lciBqb2JDaGlsZExpc3RlbmVyID0gbmV3IEpvYkNoaWxkTGlzdGVuZXIoKTsKLQlwcml2YXRlIGZpbmFsIElRdWV1ZUNoaWxkTGlzdGVuZXIgcXVldWVDaGlsZExpc3RlbmVyID0gbmV3IFF1ZXVlQ2hpbGRMaXN0ZW5lcigpOwotCQotCS8qCi0JICogRGVidWcgZmxhZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IERlYnVnVXRpbC5KT0JTX1ZJRVdfVFJBQ0lORzsKLQkKLQkvKgotCSAqIEVsZW1lbnQgc2VsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgQWN0aW9uIGpvYkZvY3VzQWN0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY3VyX3NlbGVjdGVkX2VsZW1lbnRfaWQgPSBJTWFuYWdlci5FTVBUWV9JRDsKLQkvKgotCSAqIFVJIGNvbXBvbmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgTWVudSBqb2JQb3B1cE1lbnUgPSBudWxsOwotCXByb3RlY3RlZCBTYXNoRm9ybSBzYXNoRm9ybSA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGpvYlRhYmxlVmlld2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGVsZW1lbnRWaWV3Q29tcG9zaXRlID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgSm9iVmlld1VwZGF0ZVdvcmtiZW5jaEpvYiBqb2JWaWV3VXBkYXRlSm9iID0gbmV3IEpvYlZpZXdVcGRhdGVXb3JrYmVuY2hKb2IoKTsKLQkvKgotCSAqIEFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyYWxsZWxBY3Rpb24gdGVybWluYXRlQWxsQWN0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgUGFyYWxsZWxKb2JzVmlldygpIHsKLQkJdGhpcyhQVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Sm9iTWFuYWdlcigpKTsKLQl9Ci0JCi0JcHVibGljIFBhcmFsbGVsSm9ic1ZpZXcoSU1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlcihtYW5hZ2VyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpvYgotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZUpvYlJlZnJlc2goSVBKb2Igam9iKSB7Ci0JCWNoYW5nZUpvYlJlZnJlc2goam9iICwgZmFsc2UpOwotCX0gCQotCQotCS8qKgotCSAqIEBwYXJhbSBqb2IKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VKb2JSZWZyZXNoKElQSm9iIGpvYiwgYm9vbGVhbiBmb3JjZSkgewotCQlJUEpvYiBjdXJfam9iID0gZ2V0Sm9iTWFuYWdlcigpLmdldEpvYigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCWlmIChjdXJfam9iID09IG51bGwgJiYgam9iICE9IG51bGwpIHsKLQkJCWRvQ2hhbmdlSm9iKGpvYik7Ci0JCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihqb2IpOwotCQl9IGVsc2UgaWYgKGN1cl9qb2IgIT0gbnVsbCAmJiBqb2IgPT0gbnVsbCkgewotCQkJZG9DaGFuZ2VKb2IoKElQSm9iKW51bGwpOwotCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIGlmIChjdXJfam9iICE9IG51bGwgJiYgam9iICE9IG51bGwpIHsKLQkJCWlmICghY3VyX2pvYi5nZXRJRCgpLmVxdWFscyhqb2IuZ2V0SUQoKSkpIHsKLQkJCQlkb0NoYW5nZUpvYihqb2IpOwotCQkJfQotCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oam9iKTsKLQkJfSBlbHNlIHsgLy9jdXJfam9iID09IG51bGwgJiYgam9iID09IG51bGwKLQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCX0KLQkJaWYgKGlzVmlzaWJsZSgpKSB7Ci0JCQlqb2JWaWV3VXBkYXRlSm9iLnNjaGVkdWxlKHNlbGVjdGlvbiwgZm9yY2UpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsU2V0VmlldyNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJTW9kZWxNYW5hZ2VyIG1tID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXN5bmNocm9uaXplZCAobW0pIHsKLQkJICAgIGZvciAoSVJlc291cmNlTWFuYWdlciBybSA6IG1tLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCQkJZm9yIChJUFF1ZXVlIHF1ZXVlIDogcm0uZ2V0UXVldWVzKCkpIHsKLQkJCQkJZm9yIChJUEpvYiBqb2IgOiBxdWV1ZS5nZXRKb2JzKCkpIHsKLQkJCQkJCWpvYi5yZW1vdmVDaGlsZExpc3RlbmVyKGpvYkNoaWxkTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCXF1ZXVlLnJlbW92ZUNoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJCQl9Ci0JCSAgICAJcm0ucmVtb3ZlQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCSAgICB9Ci0JCSAgICBtbS5yZW1vdmVMaXN0ZW5lcihtb2RlbE1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQkJZWxlbWVudFZpZXdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENoYW5nZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGpvYiBpbiB0aGUgam9iIHZpZXdlcgotCSAqIAotCSAqIEBwYXJhbSBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0NoYW5nZUpvYihmaW5hbCBJUEpvYiBqb2IpIHsKLQkJc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNlbGVjdEpvYihqb2IpOwotCQkJCXVwZGF0ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgam9iIGluIHRoZSBqb2Igdmlld2VyCi0JICogCi0JICogQHBhcmFtIGpvYl9pZAotCSAqLwotCXB1YmxpYyB2b2lkIGRvQ2hhbmdlSm9iKFN0cmluZyBqb2JfaWQpIHsKLQkJZG9DaGFuZ2VKb2IoKChKb2JNYW5hZ2VyKW1hbmFnZXIpLmZpbmRKb2JCeUlkKGpvYl9pZCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhJRWxlbWVudCBlbGVtZW50KSB7Ci0JCW9wZW5Qcm9jZXNzVmlld2VyKGdldEpvYk1hbmFnZXIoKS5maW5kUHJvY2VzcyhlbGVtZW50LmdldElEKCkpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNnZXRDdXJyZW50SUQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEN1cnJlbnRJRCgpIHsKLQkJSVBKb2Igam9iID0gZ2V0Sm9iTWFuYWdlcigpLmdldEpvYigpOwotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2IuZ2V0SUQoKTsKLQkJfQotCQlyZXR1cm4gSU1hbmFnZXIuRU1QVFlfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjZ2V0SW1hZ2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKLQkJcmV0dXJuIFBhcmFsbGVsSW1hZ2VzLnByb2NJbWFnZXNbaW5kZXgxXVtpbmRleDJdOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHF1ZXVlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgam9iCi0JICogCi0JICogQHJldHVybiBxdWV1ZQotCSAqLwotCXB1YmxpYyBJUFF1ZXVlIGdldFF1ZXVlKCkgewotCQlyZXR1cm4gZ2V0Sm9iTWFuYWdlcigpLmdldFF1ZXVlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgcXVldWUgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBqb2IKLQkgKiAKLQkgKiBAcmV0dXJuIHF1ZXVlIElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWV1ZUlEKCkgewotCQlJUFF1ZXVlIHF1ZXVlID0gZ2V0UXVldWUoKTsKLQkJaWYgKHF1ZXVlICE9IG51bGwpIHsKLQkJCXJldHVybiBxdWV1ZS5nZXRJRCgpOwotCQl9Ci0JCXJldHVybiBJTWFuYWdlci5FTVBUWV9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLklDb250ZW50UHJvdmlkZXIjZ2V0UnVsZXJJbmRleChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdWxlckluZGV4KE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgSUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElFbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSdWxlckluZGV4KG9iaiwgaW5kZXgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgIAlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgIAl9Ci0gICAgCXJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjZ2V0VG9vbFRpcFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VG9vbFRpcFRleHQoT2JqZWN0IG9iaikgewotCQlJRWxlbWVudEhhbmRsZXIgc2V0TWFuYWdlciA9IGdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBJUFByb2Nlc3MpIHx8IHNldE1hbmFnZXIgPT0gbnVsbCB8fCBjdXJfZWxlbWVudF9zZXQgPT0gbnVsbCkKLQkJCXJldHVybiBJVG9vbFRpcFByb3ZpZGVyLk5PX1RPT0xUSVA7Ci0KLQkJSVBQcm9jZXNzIHByb2MgPSAoSVBQcm9jZXNzKW9iajsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIG51bSA9IHByb2MuZ2V0UHJvY2Vzc0luZGV4KCk7Ci0JCWlmIChudW0gIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiSW5kZXg6ICIgKyBudW0pOwotCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJQSUQ6ICIgKyBwcm9jLmdldFBpZCgpKTsKLQkJSUVsZW1lbnRTZXRbXSBzZXRzID0gc2V0TWFuYWdlci5nZXRTZXRzV2l0aEVsZW1lbnQocHJvYy5nZXRJRCgpKTsKLQkJaWYgKHNldHMubGVuZ3RoID4gMSkKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuU2V0OiAiKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHNldHNbaV0uZ2V0SUQoKSk7Ci0JCQlpZiAoaSA8IHNldHMubGVuZ3RoIC0gMSkKLQkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ci0JCX0KLQkJLy8gYnVmZmVyLmFwcGVuZCgiXG5TdGF0dXM6ICIgKyBnZXRKb2JNYW5hZ2VyKCkuZ2V0UHJvY2Vzc1N0YXR1c1RleHQocHJvYykpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgYnVmZmVyLnRvU3RyaW5nKCkgfTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyN1cGRhdGVWaWV3KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYWludChib29sZWFuIGFsbCkgewotCQlpZiAoYWxsKSB7Ci0JCQlpZiAoIWpvYlRhYmxlVmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJam9iVGFibGVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCX0KLQkJfQotCQl1cGRhdGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAJLy8gU2VsZWN0aW9uIGNoYW5nZSBjb3VsZCBjb21lIGZyb20gZWl0aGVyIHRoZSBqb2JUYWJsZVZpZXdlciBvZiB0aGUgZWxlbWVudFZpZXdDb21wb3NpdGUKLSAgICAJc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc3VwZXIuc2V0Rm9jdXMoKTsKLQkJSVBKb2Igam9iID0gZ2V0Sm9iTWFuYWdlcigpLmdldEpvYigpOwotCQlpZiAoam9iID09IG51bGwpIHsKLQkJCWNoYW5nZUpvYlJlZnJlc2gobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIG5ldyBqb2JzIGFyZSBnaXZlIGZvY3VzCi0JICogaW4gdGhlIGpvYnMgdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9jdXMgYSB2YWx1ZSBvZiB0cnVlIHdpbGwgY2F1c2UgbmV3IGpvYnMgdG8gYmUgZGlzcGxheWVkIGluCi0JICogdGhlIGpvYnMgdmlldwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvYkZvY3VzKGJvb2xlYW4gZm9jdXMpIHsKLQkJam9iRm9jdXMgPSBmb2N1czsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgYXJyYXlbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLnNlbGVjdGlvbkNoYW5nZWQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxTZXRWaWV3I3VwZGF0ZUFjdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uKCkgewotCQlzdXBlci51cGRhdGVBY3Rpb24oKTsKLQkJaWYgKHRlcm1pbmF0ZUFsbEFjdGlvbiAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGpvYlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQl0ZXJtaW5hdGVBbGxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCUlQSm9iIGpvYiA9IChJUEpvYikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQl0ZXJtaW5hdGVBbGxBY3Rpb24uc2V0RW5hYmxlZCghKGpvYi5pc0RlYnVnKCkgfHwgam9iLmlzVGVybWluYXRlZCgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIFVwZGF0ZSBKb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVKb2JTZXQoKSB7Ci0JCUlFbGVtZW50SGFuZGxlciBzZXRNYW5hZ2VyID0gZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCk7Ci0JCXNlbGVjdFNldChzZXRNYW5hZ2VyID09IG51bGwgPyBudWxsIDogc2V0TWFuYWdlci5nZXRTZXRSb290KCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I2NvbnZlcnRFbGVtZW50T2JqZWN0KG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRFbGVtZW50T2JqZWN0KElFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIGdldEpvYk1hbmFnZXIoKS5maW5kUHJvY2VzcyhlbGVtZW50LmdldElEKCkpOwotCX0KLQkKLQkvKiogCi0JICogQ3JlYXRlIEpvYiBjb250ZXh0IG1lbnUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKb2JDb250ZXh0TWVudSgpIHsKLQkJTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigiI2pvYnBvcHVwbWVudSIpOwotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlBQ1RJT05HUk9VUCkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUFVJQ29uc3RhbnRzLklVSUVNUFRZR1JPVVApKTsKLQkJCQlmaWxsSm9iQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KGpvYlRhYmxlVmlld2VyLmdldFRhYmxlKCkpOwotCQlqb2JUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldE1lbnUobWVudSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsU2V0VmlldyNjcmVhdGVUb29sQmFyQWN0aW9ucyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRvb2xCYXJBY3Rpb25zKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyKSB7Ci0JCXRlcm1pbmF0ZUFsbEFjdGlvbiA9IG5ldyBUZXJtaW5hdGVKb2JBY3Rpb24odGhpcyk7Ci0JCXRvb2xCYXJNZ3IuYXBwZW5kVG9Hcm91cChJUFRQVUlDb25zdGFudHMuSVVJQUNUSU9OR1JPVVAsIHRlcm1pbmF0ZUFsbEFjdGlvbik7Ci0JCWpvYkZvY3VzQWN0aW9uID0gbmV3IEpvYkZvY3VzQWN0aW9uKHRoaXMpOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlKT0JHUk9VUCkpOwotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUFVJQ29uc3RhbnRzLklVSUpPQkdST1VQLCBqb2JGb2N1c0FjdGlvbik7Ci0JCXN1cGVyLmJ1aWxkSW5Ub29sQmFyQWN0aW9ucyh0b29sQmFyTWdyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQkJc2FzaEZvcm0uc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJam9iVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoc2FzaEZvcm0sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJam9iVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJam9iVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBKb2IpIHsKLQkJCQkJSVBKb2Igam9iID0gKElQSm9iKSBlbGVtZW50OwotCQkJCQlyZXR1cm4gUGFyYWxsZWxJbWFnZXMuam9iSW1hZ2VzW2pvYi5nZXRTdGF0ZSgpLm9yZGluYWwoKV1bam9iLmlzRGVidWcoKSA/IDEgOiAwXTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQSm9iKSB7Ci0JCQkJCXJldHVybiAoKElQSm9iKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfSk7Ci0JCWpvYlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEpvYk1hbmFnZXIpCi0JCQkJCXJldHVybiAoKEpvYk1hbmFnZXIpIGlucHV0RWxlbWVudCkuZ2V0Sm9icygpOwotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQl9KTsKLQkJam9iVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGoxLCBPYmplY3QgajIpIHsKLQkJCQlyZXR1cm4gKChJUEpvYilqMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKElQSm9iKWoyKS5nZXROYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJam9iVGFibGVWaWV3ZXIuc2V0SW5wdXQobWFuYWdlcik7Ci0JCWpvYlRhYmxlVmlld2VyLmdldFRhYmxlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gam9iVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBqb2JUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlqb2JUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmRlc2VsZWN0QWxsKCk7Ci0JCQkJCWRvQ2hhbmdlSm9iKChJUEpvYikgbnVsbCk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJSVBKb2Igam9iID0gKElQSm9iKWl0ZW0uZ2V0RGF0YSgpOwotCQkJCQlpZiAoam9iID09IG51bGwpIHsKLQkJCQkJCWRvQ2hhbmdlSm9iKChJUEpvYikgbnVsbCk7Ci0JCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJZG9DaGFuZ2VKb2Ioam9iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBjdXJfaWQgPSBnZXRDdXJyZW50SUQoKTsKLQkJCQkJCWlmIChjdXJfaWQgPT0gbnVsbCB8fCAhY3VyX2lkLmVxdWFscyhqb2IuZ2V0SUQoKSkpIHsKLQkJCQkJCQlkb0NoYW5nZUpvYihqb2IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXVwZGF0ZSgpOyAvLyBBZGRlZCB0byBlbnN1cmUgdGhhdCB0ZXJtaW5hdGUgYnV0dG9uIGlzIHVwZGF0ZWQgY29ycmVjdGx5Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBFbmFibGUgcHJvcGVydHkgc2hlZXQgdXBkYXRlcyB3aGVuIHRyZWUgaXRlbXMgYXJlIHNlbGVjdGVkLgotCQkvLyBOb3RlIGZvciB0aGlzIHRvIHdvcmsgZWFjaCBpdGVtIGluIHRoZSB0cmVlIG11c3QgZWl0aGVyIGltcGxlbWVudAotCQkvLyBJUHJvcGVydHlTb3VyY2UsIG9yIHN1cHBvcnQgSVByb3BlcnR5U291cmNlLmNsYXNzIGFzIGFuIGFkYXB0ZXIgdHlwZQotCQkvLyBpbiBpdHMgQWRhcHRlckZhY3RvcnkuCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJam9iVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0JCQotCQljcmVhdGVKb2JDb250ZXh0TWVudSgpOwotCQllbGVtZW50Vmlld0NvbXBvc2l0ZSA9IGNyZWF0ZUVsZW1lbnRWaWV3KHNhc2hGb3JtKTsKLQkJCi0JCWpvYlRhYmxlVmlld2VyLmdldFRhYmxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJZWxlbWVudFZpZXdDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJc2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10geyAxLCAyIH0pOwotCi0JCS8qCi0JCSAqIFdhaXQgdW50aWwgdGhlIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCBiZWZvcmUgcmVnaXN0ZXJpbmcgZm9yIGV2ZW50cwotCQkgKi8KLQkJSU1vZGVsTWFuYWdlciBtbSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQlzeW5jaHJvbml6ZWQgKG1tKSB7Ci0JCSAgICAvKgotCQkgICAgICogQWRkIHVzIHRvIGFueSBleGlzdGluZyBSTSdzLiBJIGd1ZXNzIGl0J3MgcG9zc2libGUgd2UgY291bGQKLQkJICAgICAqIG1pc3MgYSBSTSBpZiBhIG5ldyBldmVudCBhcnJpdmVzIHdoaWxlIHdlJ3JlIGRvaW5nIHRoaXMsIGJ1dCBpcyAKLQkJICAgICAqIGl0IGEgcHJvYmxlbT8KLQkJICAgICAqLwotCQkgICAgZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogbW0uZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXJzKCkpIHsKLQkJICAgICAgICBybS5hZGRDaGlsZExpc3RlbmVyKHJlc291cmNlTWFuYWdlckxpc3RlbmVyKTsKLQkJICAgIH0KLQkJICAgIG1tLmFkZExpc3RlbmVyKG1vZGVsTWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKiAKLQkgKiBDcmVhdGUgam9iIGNvbnRleHQgbWVudQotCSAqIEBwYXJhbSBtZW51TWFuYWdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxKb2JDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJUGFyYWxsZWxBY3Rpb24gcmVtb3ZlQWxsVGVybWluYXRlZEFjdGlvbiA9IG5ldyBSZW1vdmVBbGxUZXJtaW5hdGVkQWN0aW9uKHRoaXMpOwotCQlyZW1vdmVBbGxUZXJtaW5hdGVkQWN0aW9uLnNldEVuYWJsZWQoZ2V0Sm9iTWFuYWdlcigpLmhhc1N0b3BwZWRKb2IoKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChyZW1vdmVBbGxUZXJtaW5hdGVkQWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBKb2JNYW5hZ2VyIGdldEpvYk1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKEpvYk1hbmFnZXIpIG1hbmFnZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I2luaXRpYWxFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsRWxlbWVudCgpIHsKLQkJSVBVbml2ZXJzZSB1bml2ZXJzZSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCk7Ci0JCS8qCi0JCSAqIEFkZCB1cyBhcyBhIGNoaWxkIGxpc3RlbmVyIHRvIGFueSBleGlzdGluZyBxdWV1ZQotCQkgKi8KLQkJZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCQlmb3IgKElQUXVldWUgcXVldWUgOiBybS5nZXRRdWV1ZXMoKSkgewotCQkJCXF1ZXVlLmFkZENoaWxkTGlzdGVuZXIocXVldWVDaGlsZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJbWFuYWdlci5pbml0aWFsKHVuaXZlcnNlKTsKLQkJY2hhbmdlSm9iUmVmcmVzaChudWxsLCB0cnVlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNpbml0aWFsVmlldygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFZpZXcoKSB7Ci0JCWluaXRpYWxFbGVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGpvYiB2aWV3LiBDYWxsZWQgdG8gbm90aWZ5IHRoZSBqb2IgdmlldyB0aGF0Ci0JICogdGhlIG1vZGVsIGhhcyBjaGFuZ2VkIGFuZCBpdCBuZWVkcyB0byB1cGRhdGUgdGhlIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEpvYlZpZXcoKSB7Ci0JCXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWpvYlRhYmxlVmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWpvYlRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqIAotCSAqIENoYW5nZSBqb2IKLQkgKiBAcGFyYW0gam9iX2lkIFRhcmdldCBqb2IgSUQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RKb2IoSVBKb2Igam9iKSB7Ci0JCUlQSm9iIG9sZCA9IGdldEpvYk1hbmFnZXIoKS5nZXRKb2IoKTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQlvbGQucmVtb3ZlQ2hpbGRMaXN0ZW5lcihqb2JDaGlsZExpc3RlbmVyKTsKLQkJfQotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCWpvYi5hZGRDaGlsZExpc3RlbmVyKGpvYkNoaWxkTGlzdGVuZXIpOwotCQl9Ci0JCWdldEpvYk1hbmFnZXIoKS5zZXRKb2Ioam9iKTsKLQkJdXBkYXRlSm9iU2V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9QYXJhbGxlbE1hY2hpbmVzVmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9QYXJhbGxlbE1hY2hpbmVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODI2YzQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvUGFyYWxsZWxNYWNoaW5lc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBVbml2ZXJzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkTWFjaGluZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE5vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkUXVldWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld05vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1Byb2Nlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZUNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklOZXdSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuUGFyYWxsZWxJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JUFRQVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2Vycy5BYnN0cmFjdFVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubWFuYWdlcnMuTWFjaGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIEBhdXRob3IgR3JlZyBXYXRzb24KLSAqIAotICogQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSBDbGVtZW50IENodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbGxlbE1hY2hpbmVzVmlldyBleHRlbmRzIEFic3RyYWN0UGFyYWxsZWxTZXRWaWV3IGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyIHsKLQlwcml2YXRlIGZpbmFsIGNsYXNzIE1hY2hpbmVDaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSU1hY2hpbmVDaGlsZExpc3RlbmVyIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZU5vZGVMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU1hY2hpbmVDaGFuZ2VkTm9kZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgSUNoYW5nZWROb2RlRXZlbnQgZSkgewotCQkJcmVmcmVzaCh0cnVlKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZU5vZGVMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU1hY2hpbmVOZXdOb2RlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBJTmV3Tm9kZUV2ZW50IGUpIHsKLQkJCWZpbmFsIGJvb2xlYW4gaXNDdXJyZW50ID0gZS5nZXRTb3VyY2UoKS5lcXVhbHMoZ2V0Q3VycmVudE1hY2hpbmUoKSk7Ci0KLQkJCVVJVXRpbHMuc2FmZVJ1bkFzeW5jSW5VSVRocmVhZChuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZm9yIChJUE5vZGUgbm9kZSA6IGUuZ2V0Tm9kZXMoKSkgewotCQkJCQkJaWYgKGlzQ3VycmVudCkgewotCQkJCQkJCS8qCi0JCQkJCQkJICogQWRkIG5vZGUgY2hpbGQgbGlzdGVuZXIgc28gdGhhdCB3ZSBnZXQgbm90aWZpZWQgd2hlbiBuZXcgcHJvY2Vzc2VzCi0JCQkJCQkJICogYXJlIGFkZGVkIHRvIHRoZSBub2RlIGFuZCBjYW4gdXBkYXRlIHRoZSBub2RlIGljb25zLgotCQkJCQkJCSAqLwotCQkJCQkJCW5vZGUuYWRkQ2hpbGRMaXN0ZW5lcihub2RlTGlzdGVuZXIpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlnZXRNYWNoaW5lTWFuYWdlcigpLmFkZE5vZGUobm9kZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChpc0N1cnJlbnQpIHsKLQkJCQkJCXVwZGF0ZU1hY2hpbmVTZXQoKTsKLQkJCQkJCXJlcGFpbnQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsJCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lTm9kZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTWFjaGluZVJlbW92ZU5vZGVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElSZW1vdmVOb2RlRXZlbnQgZSkgewotCQkJZmluYWwgYm9vbGVhbiBpc0N1cnJlbnQgPSBlLmdldFNvdXJjZSgpLmVxdWFscyhnZXRDdXJyZW50TWFjaGluZSgpKTsKLQotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmb3IgKElQTm9kZSBub2RlIDogZS5nZXROb2RlcygpKSB7Ci0JCQkJCQlpZiAoaXNDdXJyZW50KSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBSZW1vdmUgbm9kZSBjaGlsZCBsaXN0ZW5lciB3aGVuIG5vZGUgaXMgcmVtb3ZlZCAoaWYgZXZlcikKLQkJCQkJCQkgKi8KLQkJCQkJCQlub2RlLnJlbW92ZUNoaWxkTGlzdGVuZXIobm9kZUxpc3RlbmVyKTsKLQkJCQkJCQkKLQkJCQkJCX0KLQkKLQkJCQkJCWdldE1hY2hpbmVNYW5hZ2VyKCkucmVtb3ZlTm9kZShub2RlKTsKLQkJCQkJfQotCQkJCi0JCQkJCWlmIChpc0N1cnJlbnQpIHsKLQkJCQkJCXVwZGF0ZU1hY2hpbmVTZXQoKTsKLQkJCQkJCXJlcGFpbnQodHJ1ZSk7Ci0JCQkJCQlub2RlQXR0clRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCXByb2Nlc3NUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE1NQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJLyoKLQkJCSAqIEFkZCByZXNvdXJjZSBtYW5hZ2VyIGNoaWxkIGxpc3RlbmVyIHNvIHdlIGdldCBub3RpZmllZCB3aGVuIG5ldwotCQkJICogbWFjaGluZXMgYXJlIGFkZGVkIHRvIHRoZSBtb2RlbC4KLQkJCSAqLwotCQkJZmluYWwgSVJlc291cmNlTWFuYWdlciBybSA9IGUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JICAgICAgICBybS5hZGRDaGlsZExpc3RlbmVyKHJlc291cmNlTWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmxpc3RlbmVycy5JTW9kZWxNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVJlc291cmNlTWFuYWdlckV2ZW50IGUpIHsKLQkJCS8qCi0JCQkgKiBSZW1vdmVkIHJlc291cmNlIG1hbmFnZXIgY2hpbGQgbGlzdGVuZXIgd2hlbiByZXNvdXJjZSBtYW5hZ2VyIGlzIHJlbW92ZWQuCi0JCQkgKi8KLQkJCWUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVtb3ZlQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgTm9kZUNoaWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJTm9kZUNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKSB7Ci0JCQkvKgotCQkJICogVXBkYXRlIHZpZXdzIGlmIGFueSBub2RlJ3MgcHJvY2Vzc2VzIHN0YXR1cyBjaGFuZ2VzCi0JCQkgKi8KLQkJCWlmIChlLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVBOb2RlKSB7Ci0JCQkJaWYgKChJUE5vZGUpIGUuZ2V0U291cmNlKCkgPT0gZ2V0UmVnaXN0ZXJlZE5vZGUoKSkgewkKLQkJCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJcHJvY2Vzc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklOb2RlUHJvY2Vzc0xpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTm9kZU5ld1Byb2Nlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElOZXdQcm9jZXNzRXZlbnQgZSkgewotCQkJLyoKLQkJCSAqIFVwZGF0ZSBub2RlIGljb25zIHdoZW4gYSBwcm9jZXNzIGlzIGFkZGVkIHRvIGEgbm9kZS4gCi0JCQkgKi8KLQkJCWlmIChlLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVBOb2RlKSB7Ci0JCQkJaWYgKChJUE5vZGUpIGUuZ2V0U291cmNlKCkgPT0gZ2V0UmVnaXN0ZXJlZE5vZGUoKSkgewkKLQkJCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJcHJvY2Vzc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTm9kZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBJUmVtb3ZlUHJvY2Vzc0V2ZW50IGUpIHsKLQkJCS8qCi0JCQkgKiBVcGRhdGUgbm9kZSBpY29ucyB3aGVuIGEgcHJvY2VzcyBpcyByZW1vdmVkIGZyb20gYSBub2RlLiAKLQkJCSAqLwotCQkJaWYgKGUuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUE5vZGUpIHsKLQkJCQlVSVV0aWxzLnNhZmVSdW5Bc3luY0luVUlUaHJlYWQobmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVBOb2RlIG5vZGUgPSAoSVBOb2RlKWUuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAobm9kZSA9PSBnZXRSZWdpc3RlcmVkTm9kZSgpKSB7Ci0JCQkJCQkJcHJvY2Vzc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJfQotCQl9CQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUk1DaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJNYWNoaW5lTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJDaGFuZ2VkTWFjaGluZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRNYWNoaW5lRXZlbnQgZSkgewotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoIWVsZW1lbnRWaWV3Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJbWFjaGluZVRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckNoYW5nZWRRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRRdWV1ZUV2ZW50IGUpIHsKLQkJCS8vIENhbiBzYWZlbHkgaWdub3JlCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlck1hY2hpbmVMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlck5ld01hY2hpbmVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElOZXdNYWNoaW5lRXZlbnQgZSkgewotCQkJZm9yIChJUE1hY2hpbmUgbWFjaGluZSA6IGUuZ2V0TWFjaGluZXMoKSkgewotCQkJCS8qCi0JCQkJICogQWRkIHVzIGFzIGEgY2hpbGQgbGlzdGVuZXIgc28gd2UgZ2V0IG5vdGlmaWVkIG9mIG5vZGUgZXZlbnRzCi0JCQkJICovCi0JCQkJbWFjaGluZS5hZGRDaGlsZExpc3RlbmVyKG1hY2hpbmVMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJLyoKLQkJCQkgKiBVcGRhdGUgdmlld3Mgd2hlbiBhIG5ldyBtYWNoaW5lIGlzIGFkZGVkCi0JCQkJICovCi0JCQkJY2hhbmdlTWFjaGluZVJlZnJlc2gobWFjaGluZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld1F1ZXVlRXZlbnQgZSkgewotCQkJLy8gQ2FuIHNhZmVseSBpZ25vcmUKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyTWFjaGluZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyUmVtb3ZlTWFjaGluZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgSVJlbW92ZU1hY2hpbmVFdmVudCBlKSB7Ci0JCQkvKgotCQkJICogVXBkYXRlIHZpZXdzIHdoZW4gYSBtYWNoaW5lIGlzIHJlbW92ZWQuCi0JCQkgKi8KLQkJCVVJVXRpbHMuc2FmZVJ1bkFzeW5jSW5VSVRocmVhZChuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZm9yIChJUE1hY2hpbmUgbWFjaGluZSA6IGUuZ2V0TWFjaGluZXMoKSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIFJlbW92ZSBjaGlsZCBsaXN0ZW5lcgotCQkJCQkJICovCi0JCQkJCQltYWNoaW5lLnJlbW92ZUNoaWxkTGlzdGVuZXIobWFjaGluZUxpc3RlbmVyKTsKLQkJCQkJCQotCQkJCQkJLyogCi0JCQkJCQkgKiByZW1vdmUgZnJvbSBtYWNoaW5lIG1hbmFnZXIKLQkJCQkJCSAqLwotCQkJCQkJZ2V0TWFjaGluZU1hbmFnZXIoKS5yZW1vdmVNYWNoaW5lKG1hY2hpbmUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQljaGFuZ2VNYWNoaW5lUmVmcmVzaChudWxsKTsKLQkJCQl9Ci0JCQl9KTsJCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJSZW1vdmVRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVF1ZXVlRXZlbnQgZSkgewotCQkJLy8gQ2FuIHNhZmVseSBpZ25vcmUKLQkJfQotCX0KLQotCS8vIHZpZXcgZmxhZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPVEhfVklFVyA9ICIwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BQ0hJTkVfVklFVyA9ICIxIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1ZJRVcgPSAiMiI7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQotCXByaXZhdGUgZmluYWwgSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIgbW9kZWxNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgTU1DaGlsZExpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyIHJlc291cmNlTWFuYWdlckxpc3RlbmVyID0gbmV3IFJNQ2hpbGRMaXN0ZW5lcigpOwotCi0JcHJpdmF0ZSBmaW5hbCBJTWFjaGluZUNoaWxkTGlzdGVuZXIgbWFjaGluZUxpc3RlbmVyID0gbmV3IE1hY2hpbmVDaGlsZExpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIGZpbmFsIElOb2RlQ2hpbGRMaXN0ZW5lciBub2RlTGlzdGVuZXIgPSBuZXcgTm9kZUNoaWxkTGlzdGVuZXIoKTsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQkKLQkvLyBzZWxlY3RlZCBlbGVtZW50Ci0JcHJvdGVjdGVkIFN0cmluZyBjdXJfc2VsZWN0ZWRfZWxlbWVudF9pZCA9IElNYW5hZ2VyLkVNUFRZX0lEOwotCQotCXByb3RlY3RlZCBNZW51IGpvYlBvcHVwTWVudSA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIFNhc2hGb3JtIHVwcGVyU2FzaEZvcm0gPSBudWxsOwotCXByb3RlY3RlZCBTYXNoRm9ybSBzYXNoRm9ybSA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIG1hY2hpbmVUYWJsZVZpZXdlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHByb2Nlc3NUYWJsZVZpZXdlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIG5vZGVBdHRyVGFibGVWaWV3ZXIgPSBudWxsOwotCXByb3RlY3RlZCBDb21wb3NpdGUgZWxlbWVudFZpZXdDb21wb3NpdGUgPSBudWxsOwotCXByb3RlY3RlZCBDb21wb3NpdGUgaW5mb0NvbXBvc2l0ZSA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIFBhcmFsbGVsQWN0aW9uIHRlcm1pbmF0ZUFsbEFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50X3ZpZXcgPSBCT1RIX1ZJRVc7Ci0JCi0JcHVibGljIFBhcmFsbGVsTWFjaGluZXNWaWV3KCkgewotCQl0aGlzKFBUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNYWNoaW5lTWFuYWdlcigpKTsKLQl9Ci0JCi0JcHVibGljIFBhcmFsbGVsTWFjaGluZXNWaWV3KElNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIobWFuYWdlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfSAKLQkKLQkvKiogCi0JICogQ2hhbmdlIG1hY2hpbmUKLQkgKiBAcGFyYW0gaWQgTWFjaGluZSBJRAotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZU1hY2hpbmUoZmluYWwgU3RyaW5nIGlkKSB7Ci0JCUlQTWFjaGluZSBtYWNoaW5lID0gKChNYWNoaW5lTWFuYWdlciltYW5hZ2VyKS5maW5kTWFjaGluZUJ5SWQoaWQpOwotCQljaGFuZ2VNYWNoaW5lUmVmcmVzaChtYWNoaW5lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2hhbmdlTWFjaGluZVJlZnJlc2goZmluYWwgSVBNYWNoaW5lIG1hY2hpbmUpIHsKLQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFlbGVtZW50Vmlld0NvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2hhbmdlTWFjaGluZShtYWNoaW5lKTsKLQkJCQkJbWFjaGluZVRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCW1hY2hpbmVUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obWFjaGluZSA9PSBudWxsID8gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSA6IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1hY2hpbmUpLCB0cnVlKTsKLQkJCQkJbm9kZUF0dHJUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXByb2Nlc3NUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JLyoqIENoYW5nZSB2aWV3Ci0JICogQHBhcmFtIHZpZXdfZmxhZwotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZVZpZXcoU3RyaW5nIHZpZXdfZmxhZykgewotCQljdXJyZW50X3ZpZXcgPSB2aWV3X2ZsYWc7Ci0JCWlmIChjdXJyZW50X3ZpZXcuZXF1YWxzKFBhcmFsbGVsTWFjaGluZXNWaWV3Lk1BQ0hJTkVfVklFVykpIHsKLQkJCW1hY2hpbmVUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCQllbGVtZW50Vmlld0NvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWluZm9Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDEsIDAgfSk7Ci0JCX0gZWxzZSBpZiAoY3VycmVudF92aWV3LmVxdWFscyhQYXJhbGxlbE1hY2hpbmVzVmlldy5JTkZPX1ZJRVcpKSB7Ci0JCQltYWNoaW5lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWVsZW1lbnRWaWV3Q29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlpbmZvQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDAsIDEgfSk7Ci0JCX0gZWxzZSB7Ci0JCQltYWNoaW5lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZWxlbWVudFZpZXdDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWluZm9Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCS8vc2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10geyAzLCAxIH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZWxlbWVudFZpZXdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKElFbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBpc0VsZW1lbnRSZWdpc3RlcmVkID0gZWxlbWVudC5pc1JlZ2lzdGVyZWQoKTsKLQkJCi0JCS8qCi0JCSAqIFVucmVnaXN0ZXIgYW55IHJlZ2lzdGVyZWQgZWxlbWVudHMKLQkJICovCi0JCXVucmVnaXN0ZXIoKTsKLQotCQkvKgotCQkgKiBSZWdpc3RlciB0aGUgbmV3IGVsZW1lbnQgb25seSBpZiB3ZSdyZSBub3QgdHJ5aW5nCi0JCSAqIHRvIHJlZ2lzdGVyIHRoZSBzYW1lIG9uZS4KLQkJICovCi0JCWlmICghaXNFbGVtZW50UmVnaXN0ZXJlZCkgewotCQkJLyoKLQkJCSAqIE5vdyByZWdpc3RlciB0aGUgbmV3IGVsZW1lbnQKLQkJCSAqLwotCQkJZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCkuYWRkVG9SZWdpc3RlcihuZXcgSUVsZW1lbnRbXSB7IGVsZW1lbnQgfSk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFJlZnJlc2ggdGhlIGF0dHJpYnV0ZSBhbmQgcHJvY2VzcyBwYW5lcy4KLQkJICovCi0JCW5vZGVBdHRyVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQlwcm9jZXNzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I2dldEN1cnJlbnRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50SUQoKSB7Ci0JCUlQTWFjaGluZSBtYWNoaW5lID0gZ2V0TWFjaGluZU1hbmFnZXIoKS5nZXRDdXJyZW50TWFjaGluZSgpOwotCQlpZiAobWFjaGluZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWFjaGluZS5nZXRJRCgpOwotCQl9Ci0JCXJldHVybiBJTWFuYWdlci5FTVBUWV9JRDsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBzZWxlY3RlZCBtYWNoaW5lCi0JICogQHJldHVybiBzZWxlY3RlZCBtYWNoaW5lCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUE1hY2hpbmUgZ2V0Q3VycmVudE1hY2hpbmUoKSB7Ci0JCXJldHVybiBnZXRNYWNoaW5lTWFuYWdlcigpLmdldEN1cnJlbnRNYWNoaW5lKCk7Ci0JfQotCQotCS8qKiAKLQkgKiBHZXQgY3VycmVudCB2aWV3IGZsYWcKLQkgKiBAcmV0dXJuIGZsYWcgb2YgdmlldwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFZpZXcoKSB7Ci0JCXJldHVybiBjdXJyZW50X3ZpZXc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjZ2V0SW1hZ2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKLQkJcmV0dXJuIFBhcmFsbGVsSW1hZ2VzLm5vZGVJbWFnZXNbaW5kZXgxXVtpbmRleDJdOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuSUNvbnRlbnRQcm92aWRlciNnZXRSdWxlckluZGV4KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bGVySW5kZXgoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJRWxlbWVudCkgewotCQkJT2JqZWN0IG5vZGVPYmogPSBjb252ZXJ0RWxlbWVudE9iamVjdCgoSUVsZW1lbnQpb2JqKTsKLQkJCWlmIChub2RlT2JqIGluc3RhbmNlb2YgSVBOb2RlKSB7Ci0JCQkJcmV0dXJuICgoSVBOb2RlKW5vZGVPYmopLmdldE5vZGVOdW1iZXIoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UnVsZXJJbmRleChvYmosIGluZGV4KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLSAgICAJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICAJfQotICAgIAlyZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjZ2V0VG9vbFRpcFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VG9vbFRpcFRleHQoT2JqZWN0IG9iaikgewotCQlJRWxlbWVudEhhbmRsZXIgc2V0TWFuYWdlciA9IGdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBJUE5vZGUpIHx8IHNldE1hbmFnZXIgPT0gbnVsbCB8fCBjdXJfZWxlbWVudF9zZXQgPT0gbnVsbCkKLQkJCXJldHVybiBJVG9vbFRpcFByb3ZpZGVyLk5PX1RPT0xUSVA7Ci0KLQkJSVBOb2RlIG5vZGUgPSAoSVBOb2RlKW9iajsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldE5hbWUoKSk7Ci0JCUlFbGVtZW50U2V0W10gc2V0cyA9IHNldE1hbmFnZXIuZ2V0U2V0c1dpdGhFbGVtZW50KG5vZGUuZ2V0SUQoKSk7Ci0JCWlmIChzZXRzLmxlbmd0aCA+IDEpCi0JCQlidWZmZXIuYXBwZW5kKCJcbiBTZXQ6ICIpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHNldHMubGVuZ3RoOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc2V0c1tpXS5nZXRJRCgpKTsKLQkJCWlmIChpIDwgc2V0cy5sZW5ndGggLSAxKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwiKTsKLQkJfQotCQkvLyBidWZmZXIuYXBwZW5kKCJcblN0YXR1czogIiArIGdldE1hY2hpbmVNYW5hZ2VyKCkuZ2V0Tm9kZVN0YXR1c1RleHQobm9kZSkpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgYnVmZmVyLnRvU3RyaW5nKCkgfTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyN1cGRhdGVWaWV3KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYWludChib29sZWFuIGFsbCkgewotCQlpZiAoYWxsKSB7Ci0JCQlpZiAoIW1hY2hpbmVUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmlzRGlzcG9zZWQoKSkgewotCQkJCW1hY2hpbmVUYWJsZVZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJfQotCQl9Ci0JCXVwZGF0ZSgpOwotCQkvL3VwZGF0ZUxvd2VyUmVnaW9ucygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgIAkvLyBTZWxlY3Rpb24gY2hhbmdlIGNvdWxkIGNvbWUgZnJvbSBlaXRoZXIgdGhlIG1hY2hpbmVUYWJsZVZpZXdlciBvZiB0aGUgZWxlbWVudFZpZXdDb21wb3NpdGUKLSAgICAJc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc3VwZXIuc2V0Rm9jdXMoKTsKLQkJSVBNYWNoaW5lIG1hY2hpbmUgPSBnZXRDdXJyZW50TWFjaGluZSgpOwotCQlpZiAobWFjaGluZSA9PSBudWxsKSB7Ci0JCQljaGFuZ2VNYWNoaW5lKChTdHJpbmcpbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgYXJyYXlbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLnNlbGVjdGlvbkNoYW5nZWQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JLyoqIAotCSAqIFVucmVnaXN0ZXIgYWxsIHJlZ2lzdGVyZWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCkgewotCQlJRWxlbWVudEhhbmRsZXIgZWxlbWVudEhhbmRsZXIgPSBnZXRDdXJyZW50RWxlbWVudEhhbmRsZXIoKTsKLQkJZWxlbWVudEhhbmRsZXIucmVtb3ZlRnJvbVJlZ2lzdGVyKGVsZW1lbnRIYW5kbGVyLmdldFJlZ2lzdGVyZWQoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsU2V0VmlldyN1cGRhdGVBY3Rpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIudXBkYXRlQWN0aW9uKCk7Ci0JfQotCQotCS8qKiAKLQkgKiBVcGRhdGUgbWFjaGluZSBzZXQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNYWNoaW5lU2V0KCkgewotCQlJRWxlbWVudEhhbmRsZXIgc2V0TWFuYWdlciA9IGdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQlzZWxlY3RTZXQoc2V0TWFuYWdlciA9PSBudWxsID8gbnVsbCA6IHNldE1hbmFnZXIuZ2V0U2V0Um9vdCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTWFjaGluZU1hbmFnZXIgZ2V0TWFjaGluZU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKE1hY2hpbmVNYW5hZ2VyKSBtYW5hZ2VyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUE5vZGUgZ2V0UmVnaXN0ZXJlZE5vZGUoKSB7Ci0JCWN1cl9zZWxlY3RlZF9lbGVtZW50X2lkID0gIiI7Ci0JCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlciA9IGdldEN1cnJlbnRFbGVtZW50SGFuZGxlcigpOwotCQlpZiAoZWxlbWVudEhhbmRsZXIgPT0gbnVsbCB8fCBjdXJfZWxlbWVudF9zZXQgPT0gbnVsbCB8fCBlbGVtZW50SGFuZGxlci50b3RhbFJlZ2lzdGVyZWQoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBmaXJzdFJlZ2lzdGVyZWRFbGVtZW50SUQgPSBlbGVtZW50SGFuZGxlci5nZXRSZWdpc3RlcmVkKClbMF0uZ2V0SUQoKTsKLQkJaWYgKCFjdXJfZWxlbWVudF9zZXQuY29udGFpbnMoZmlyc3RSZWdpc3RlcmVkRWxlbWVudElEKSkKLQkJCXJldHVybiBudWxsOwotCQljdXJfc2VsZWN0ZWRfZWxlbWVudF9pZCA9IGZpcnN0UmVnaXN0ZXJlZEVsZW1lbnRJRDsKLQkJcmV0dXJuIGdldE1hY2hpbmVNYW5hZ2VyKCkuZmluZE5vZGUoY3VyX3NlbGVjdGVkX2VsZW1lbnRfaWQpOwotCX0KLQkKLQkvKiogCi0JICogQ2hhbmdlIG1hY2hpbmUKLQkgKiBAcGFyYW0gbWFjaGluZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoYW5nZU1hY2hpbmUoZmluYWwgSVBNYWNoaW5lIG1hY2hpbmUpIHsKLQkJc2VsZWN0TWFjaGluZShtYWNoaW5lKTsKLQkJdXBkYXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjY29udmVydEVsZW1lbnRPYmplY3Qob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydEVsZW1lbnRPYmplY3QoSUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gZ2V0TWFjaGluZU1hbmFnZXIoKS5maW5kTm9kZShlbGVtZW50LmdldElEKCkpOwotCX0KLQkKLQkvKiogCi0JICogQ3JlYXRlIGxvd2VyIHRleHQgcmVnaW9uIGxheW91dAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVMb3dlclJlZ2lvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJLyogaW5uZXIgYm90dG9tIGNvbXBvc2l0ZSAtIHRoaXMgb25lIHVzZXMgYSBncmlkIGxheW91dCAqLwotCQlHcm91cCBub2RlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbm9kZUdyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2R0ZXh0ID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkdGV4dC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkdGV4dC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2R0ZXh0Lmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZHRleHQudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlub2RlR3JvdXAuc2V0TGF5b3V0RGF0YShnZHRleHQpOwotCQlub2RlR3JvdXAuc2V0VGV4dCgiTm9kZSBBdHRyaWJ1dGVzIik7Ci0JCQotCQlHcm91cCBwcm9jR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcHJvY0dyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2RsaXN0ID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkbGlzdC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkbGlzdC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2RsaXN0Lmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZGxpc3QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlwcm9jR3JvdXAuc2V0TGF5b3V0RGF0YShnZGxpc3QpOwotCQlwcm9jR3JvdXAuc2V0VGV4dCgiUHJvY2VzcyBJbmZvIik7Ci0JCQotCQlub2RlQXR0clRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG5vZGVHcm91cCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCVRhYmxlIG5vZGVBdHRyVGFibGUgPSBub2RlQXR0clRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihub2RlQXR0clRhYmxlLCBTV1QuTEVGVCk7Ci0JCWNvbC5zZXRUZXh0KCJBdHRyaWJ1dGUiKTsKLQkJY29sLnNldFdpZHRoKDgwKTsKLQkJY29sLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKG5vZGVBdHRyVGFibGUsIFNXVC5MRUZUKTsKLQkJY29sLnNldFRleHQoIlZhbHVlIik7Ci0JCWNvbC5zZXRXaWR0aCgyMDApOwotCQljb2wuc2V0UmVzaXphYmxlKGZhbHNlKTsKLQkJbm9kZUF0dHJUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlub2RlQXR0clRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJbm9kZUF0dHJUYWJsZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJVGFibGUgdGFibGUgPSAoVGFibGUpZS5nZXRTb3VyY2UoKTsKLQkJCQlpbnQgd2lkdGggPSB0YWJsZS5nZXRDbGllbnRBcmVhKCkud2lkdGg7Ci0JCQkJc3dpdGNoICh0YWJsZS5nZXRDb2x1bW5Db3VudCgpKSB7Ci0JCQkJY2FzZSAxOgotCQkJCQl0YWJsZS5nZXRDb2x1bW4oMCkuc2V0V2lkdGgod2lkdGgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCVRhYmxlQ29sdW1uIGNvbDAgPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCQkJCVRhYmxlQ29sdW1uIGNvbDEgPSB0YWJsZS5nZXRDb2x1bW4oMSk7Ci0JCQkJCWlmIChjb2wwLmdldFdpZHRoKCkgKyBjb2wxLmdldFdpZHRoKCkgPCB3aWR0aCkgewotCQkJCQkJY29sMS5zZXRXaWR0aCh3aWR0aCAtIGNvbDAuZ2V0V2lkdGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlub2RlQXR0clRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7fQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBdHRyaWJ1dGUpIHsKLQkJCQkJSUF0dHJpYnV0ZTw/LD8sPz4gYXR0ciA9IChJQXR0cmlidXRlPD8sPyw/PikgZWxlbWVudDsKLQkJCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlyZXR1cm4gYXR0ci5nZXREZWZpbml0aW9uKCkuZ2V0TmFtZSgpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gInVua25vd24gIiArIGNvbHVtbkluZGV4OwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJfSk7Ci0JCW5vZGVBdHRyVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RVSU1hbmFnZXIpIHsKLQkJCQkJSVBOb2RlIG5vZGUgPSBnZXRSZWdpc3RlcmVkTm9kZSgpOwotCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbm9kZS5nZXREaXNwbGF5QXR0cmlidXRlcygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQl9KTsKLQkJbm9kZUF0dHJUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgYTEsIE9iamVjdCBhMikgewotCQkJCWZpbmFsIElBdHRyaWJ1dGU8Pyw/LD8+IGF0dHIxID0gKElBdHRyaWJ1dGU8Pyw/LD8+KWExOwotCQkJCWZpbmFsIElBdHRyaWJ1dGU8Pyw/LD8+IGF0dHIyID0gKElBdHRyaWJ1dGU8Pyw/LD8+KWEyOwotCQkJCWZpbmFsIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGRlZjEgPSBhdHRyMS5nZXREZWZpbml0aW9uKCk7Ci0JCQkJZmluYWwgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZGVmMiA9IGF0dHIyLmdldERlZmluaXRpb24oKTsKLQkJCQlyZXR1cm4gZGVmMS5jb21wYXJlVG8oZGVmMik7Ci0JCQl9Ci0JCX0pOwotCQlub2RlQXR0clRhYmxlVmlld2VyLnNldElucHV0KG1hbmFnZXIpOwotCQkKLQkJcHJvY2Vzc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHByb2NHcm91cCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCVRhYmxlIHByb2Nlc3NUYWJsZSA9IHByb2Nlc3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQluZXcgVGFibGVDb2x1bW4ocHJvY2Vzc1RhYmxlLCBTV1QuTEVGVCkuc2V0V2lkdGgoMzAwKTsKLQkJcHJvY2Vzc1RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJcHJvY2Vzc1RhYmxlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSllLmdldFNvdXJjZSgpOwotCQkJCWludCB3aWR0aCA9IHRhYmxlLmdldENsaWVudEFyZWEoKS53aWR0aDsKLQkJCQlzd2l0Y2ggKHRhYmxlLmdldENvbHVtbkNvdW50KCkpIHsKLQkJCQljYXNlIDE6Ci0JCQkJCXRhYmxlLmdldENvbHVtbigwKS5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJVGFibGVDb2x1bW4gY29sMCA9IHRhYmxlLmdldENvbHVtbigwKTsKLQkJCQkJVGFibGVDb2x1bW4gY29sMSA9IHRhYmxlLmdldENvbHVtbigxKTsKLQkJCQkJaWYgKGNvbDAuZ2V0V2lkdGgoKSArIGNvbDEuZ2V0V2lkdGgoKSA8IHdpZHRoKSB7Ci0JCQkJCQljb2wxLnNldFdpZHRoKHdpZHRoIC0gY29sMC5nZXRXaWR0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXByb2Nlc3NUYWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJb3BlblByb2Nlc3NWaWV3ZXIoKElQUHJvY2VzcylzZWwuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJfQotCQl9KTsKLQkJcHJvY2Vzc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBQcm9jZXNzKSB7Ci0JCQkJCUlQUHJvY2VzcyBwcm9jZXNzID0gKElQUHJvY2VzcykgZWxlbWVudDsKLQkJCQkJcmV0dXJuIFBhcmFsbGVsSW1hZ2VzLnByb2NJbWFnZXNbcHJvY2Vzcy5nZXRTdGF0ZSgpLm9yZGluYWwoKV1bMF07Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFByb2Nlc3MpIHsKLQkJCQkJSVBQcm9jZXNzIHByb2Nlc3MgPSAoSVBQcm9jZXNzKSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvY2Vzcy5nZXRKb2IoKS5nZXROYW1lKCkgKyAiOiIgKyBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9KTsKLQkJcHJvY2Vzc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0VUlNYW5hZ2VyKSB7Ci0JCQkJCUlQTm9kZSBub2RlID0gZ2V0UmVnaXN0ZXJlZE5vZGUoKTsKLQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG5vZGUuZ2V0UHJvY2Vzc2VzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JCX0pOwotCQlwcm9jZXNzVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IHAxLCBPYmplY3QgcDIpIHsKLQkJCQlJUFByb2Nlc3MgcHJvYzEgPSAoSVBQcm9jZXNzKXAxOwotCQkJCUlQUHJvY2VzcyBwcm9jMiA9IChJUFByb2Nlc3MpcDI7Ci0JCQkJU3RyaW5nIG5hbWUxID0gcHJvYzEuZ2V0Sm9iKCkuZ2V0TmFtZSgpICsgIjoiICsgcHJvYzEuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBuYW1lMiA9IHByb2MyLmdldEpvYigpLmdldE5hbWUoKSArICI6IiArIHByb2MyLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvKG5hbWUyKTsKLQkJCX0KLQkJfSk7Ci0JCXByb2Nlc3NUYWJsZVZpZXdlci5zZXRJbnB1dChtYW5hZ2VyKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKiogCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hY2hpbmVDb250ZXh0TWVudSgpIHsKLQkJTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigiI21hY2hpbmVwb3B1cG1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJUFRQVUlDb25zdGFudHMuSVVJQUNUSU9OR1JPVVApKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBVSUNvbnN0YW50cy5JVUlFTVBUWUdST1VQKSk7Ci0JCQkJZmlsbE1hY2hpbmVDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUobWFjaGluZVRhYmxlVmlld2VyLmdldFRhYmxlKCkpOwotCQltYWNoaW5lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRNZW51KG1lbnUpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbFNldFZpZXcjY3JlYXRlVG9vbEJhckFjdGlvbnMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sQmFyQWN0aW9ucyhJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1ncikgewotCQlzdXBlci5idWlsZEluVG9vbEJhckFjdGlvbnModG9vbEJhck1ncik7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjY3JlYXRlVmlldyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdXBwZXJTYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShzYXNoRm9ybSwgU1dULkhPUklaT05UQUwpOwotCQl1cHBlclNhc2hGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWNoaW5lVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodXBwZXJTYXNoRm9ybSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQltYWNoaW5lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFjaGluZVRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQTWFjaGluZSkgewotCQkJCQlJUE1hY2hpbmUgbWFjaGluZSA9IChJUE1hY2hpbmUpIGVsZW1lbnQ7Ci0JCQkJCUVudW1lcmF0ZWRBdHRyaWJ1dGU8TWFjaGluZUF0dHJpYnV0ZXMuU3RhdGU+IGF0dHIgPSAKLQkJCQkJCW1hY2hpbmUuZ2V0QXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIFBhcmFsbGVsSW1hZ2VzLm1hY2hpbmVJbWFnZXNbYXR0ci5nZXRWYWx1ZUluZGV4KCldOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUE1hY2hpbmUpIHsKLQkJCQkJcmV0dXJuICgoSVBNYWNoaW5lKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfSk7Ci0JCW1hY2hpbmVUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdFVJTWFuYWdlcikKLQkJCQkJcmV0dXJuICgoTWFjaGluZU1hbmFnZXIpIGlucHV0RWxlbWVudCkuZ2V0TWFjaGluZXMoKTsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJfSk7Ci0JCW1hY2hpbmVUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgajEsIE9iamVjdCBqMikgewotCQkJCXJldHVybiAoKElQTWFjaGluZSlqMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKElQTWFjaGluZSlqMikuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW1hY2hpbmVUYWJsZVZpZXdlci5zZXRJbnB1dChtYW5hZ2VyKTsKLQkJbWFjaGluZVRhYmxlVmlld2VyLmdldFRhYmxlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbWFjaGluZVRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gbWFjaGluZVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCW1hY2hpbmVUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmRlc2VsZWN0QWxsKCk7Ci0JCQkJCWNoYW5nZU1hY2hpbmVSZWZyZXNoKChJUE1hY2hpbmUpIG51bGwpOwotCQkJCX0KLQkJCQllbHNlIGlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJSVBNYWNoaW5lIG1hY2hpbmUgPSAoSVBNYWNoaW5lKWl0ZW0uZ2V0RGF0YSgpOwotCQkJCQlpZiAobWFjaGluZSA9PSBudWxsKSB7Ci0JCQkJCQljaGFuZ2VNYWNoaW5lUmVmcmVzaCgoSVBNYWNoaW5lKSBudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQljaGFuZ2VNYWNoaW5lUmVmcmVzaChtYWNoaW5lKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBjdXJfaWQgPSBnZXRDdXJyZW50SUQoKTsKLQkJCQkJCWlmIChjdXJfaWQgPT0gbnVsbCB8fCAhY3VyX2lkLmVxdWFscyhtYWNoaW5lLmdldElEKCkpKSB7Ci0JCQkJCQkJY2hhbmdlTWFjaGluZVJlZnJlc2gobWFjaGluZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVNYWNoaW5lQ29udGV4dE1lbnUoKTsKLQkJZWxlbWVudFZpZXdDb21wb3NpdGUgPSBjcmVhdGVFbGVtZW50Vmlldyh1cHBlclNhc2hGb3JtKTsKLQkJCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gRW5hYmxlIHByb3BlcnR5IHNoZWV0IHVwZGF0ZXMgd2hlbiB0YWJsZSBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0JCS8vIE5vdGUgZm9yIHRoaXMgdG8gd29yayBlYWNoIGl0ZW0gaW4gdGhlIHRhYmxlIG11c3QgZWl0aGVyIGltcGxlbWVudAotCQkvLyBJUHJvcGVydHlTb3VyY2UsIG9yIHN1cHBvcnQgSVByb3BlcnR5U291cmNlLmNsYXNzIGFzIGFuIGFkYXB0ZXIgdHlwZQotCQkvLyBpbiBpdHMgQWRhcHRlckZhY3RvcnkuCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJbWFjaGluZVRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotCQkKLQkJaW5mb0NvbXBvc2l0ZSA9IGNyZWF0ZUxvd2VyUmVnaW9ucyhzYXNoRm9ybSk7Ci0JCWNoYW5nZVZpZXcoY3VycmVudF92aWV3KTsKLQkJCi0JCS8qCi0JCSAqIFdhaXQgdW50aWwgdGhlIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCBiZWZvcmUgcmVnaXN0ZXJpbmcgZm9yIGV2ZW50cwotCQkgKi8KLQkJSU1vZGVsTWFuYWdlciBtbSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQkKLQkJc3luY2hyb25pemVkIChtbSkgewotCQkgICAgLyoKLQkJICAgICAqIEFkZCB1cyB0byBhbnkgZXhpc3RpbmcgUk0ncy4gSSBndWVzcyBpdCdzIHBvc3NpYmxlIHdlIGNvdWxkCi0JCSAgICAgKiBtaXNzIGEgUk0gaWYgYSBuZXcgZXZlbnQgYXJyaXZlcyB3aGlsZSB3ZSdyZSBkb2luZyB0aGlzLCBidXQgaXMgCi0JCSAgICAgKiBpdCBhIHByb2JsZW0/Ci0JCSAgICAgKi8KLQkJICAgIGZvciAoSVJlc291cmNlTWFuYWdlciBybSA6IG1tLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VycygpKSB7Ci0JCSAgICAgICAgcm0uYWRkQ2hpbGRMaXN0ZW5lcihyZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcik7Ci0JCSAgICB9Ci0JCSAgICAKLQkJICAgIG1tLmFkZExpc3RlbmVyKG1vZGVsTWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCX0KLSAgICAKLQkvKiogCi0JICogRmlsbCB0aGUgY29udGV4dCBtZW51Ci0JICogQHBhcmFtIG1lbnVNYW5hZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1hY2hpbmVDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNpbml0aWFsRWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbEVsZW1lbnQoKSB7Ci0JCUlQVW5pdmVyc2UgdW5pdmVyc2UgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpOwotCQkKLQkJLyoKLQkJICogQWRkIHVzIGFzIGEgY2hpbGQgbGlzdGVuZXIgdG8gYW55IGV4aXN0aW5nIG1hY2hpbmVzCi0JCSAqLwotCQlmb3IgKElSZXNvdXJjZU1hbmFnZXIgcm0gOiB1bml2ZXJzZS5nZXRSZXNvdXJjZU1hbmFnZXJzKCkpIHsKLQkJCWZvciAoSVBNYWNoaW5lIG1hY2hpbmUgOiBybS5nZXRNYWNoaW5lcygpKSB7Ci0JCQkJbWFjaGluZS5hZGRDaGlsZExpc3RlbmVyKG1hY2hpbmVMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFNlbGVjdCBpbml0aWFsIG1hY2hpbmUKLQkJICovCi0JCWNoYW5nZU1hY2hpbmVSZWZyZXNoKChJUE1hY2hpbmUpIG1hbmFnZXIuaW5pdGlhbCh1bml2ZXJzZSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbEVsZW1lbnRWaWV3I2luaXRpYWxWaWV3KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsVmlldygpIHsKLQkJaW5pdGlhbEVsZW1lbnQoKTsKLQkJdXBkYXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIENoYW5nZSBtYWNoaW5lCi0JICogQHBhcmFtIG1hY2hpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RNYWNoaW5lKElQTWFjaGluZSBtYWNoaW5lKSB7Ci0JCUlQTWFjaGluZSBvbGQgPSBnZXRNYWNoaW5lTWFuYWdlcigpLmdldEN1cnJlbnRNYWNoaW5lKCk7Ci0JCWlmIChvbGQgIT0gbnVsbCkgewotCQkJZm9yIChJUE5vZGUgbm9kZSA6IG9sZC5nZXROb2RlcygpKSB7Ci0JCQkJbm9kZS5yZW1vdmVDaGlsZExpc3RlbmVyKG5vZGVMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZ2V0TWFjaGluZU1hbmFnZXIoKS5zZXRNYWNoaW5lKG1hY2hpbmUpOwotCQlpZiAobWFjaGluZSAhPSBudWxsKSB7Ci0JCQlmb3IgKElQTm9kZSBub2RlIDogbWFjaGluZS5nZXROb2RlcygpKSB7Ci0JCQkJbm9kZS5hZGRDaGlsZExpc3RlbmVyKG5vZGVMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJdXBkYXRlTWFjaGluZVNldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvUGFyYWxsZWxQcm9jZXNzVmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9QYXJhbGxlbFByb2Nlc3NWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNWU4YTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9QYXJhbGxlbFByb2Nlc3NWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVByb2Nlc3NDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVByb2Nlc3NMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuU3RvcmFnZURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JU3RhdHVzRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBWaWV3IGZvciBkaXNwbGF5aW5nIGRldGFpbHMgYWJvdXQgYW4gaW5kaXZpZHVhbCBwcm9jZXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbGxlbFByb2Nlc3NWaWV3IGV4dGVuZHMgQWJzdHJhY3RUZXh0RWRpdG9yIGltcGxlbWVudHMgSVByb2Nlc3NMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBMYWJlbCBwaWRMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBzdGF0dXNMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0IG91dHB1dFRleHQgPSBudWxsOwotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG51bGw7Ci0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gbXlGb3JtID0gbnVsbDsKLQlwcml2YXRlIElQUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKLQotCXB1YmxpYyBQYXJhbGxlbFByb2Nlc3NWaWV3KCkgewotCQlzdXBlcigpOwotCQlzZXREb2N1bWVudFByb3ZpZGVyKG5ldyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlcigpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcHJvY2Vzcy5yZW1vdmVFbGVtZW50TGlzdGVuZXIodGhpcyk7Ci0JCW15Rm9ybS5kaXNwb3NlKCk7Ci0JCXRvb2xraXQuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJbXlGb3JtLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHt9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQkJT2JqZWN0IG9iaiA9IGdldEVkaXRvcklucHV0KCkuZ2V0QWRhcHRlcihJUFByb2Nlc3MuY2xhc3MpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVBQcm9jZXNzKSB7Ci0JCQlwcm9jZXNzID0gKElQUHJvY2Vzcykgb2JqOwotCQkJcHJvY2Vzcy5hZGRFbGVtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCXByb2Nlc3MucmVtb3ZlRWxlbWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0b29sa2l0ICE9IG51bGwpIHsKLQkJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQYXJhbGxlbFByb2Nlc3NWaWV3LnRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCW15Rm9ybSA9IHRvb2xraXQuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7Ci0JCW15Rm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMSwgZmFsc2UsIDUsIDUpKTsKLQkJbXlGb3JtLmdldEJvZHkoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGV0YWlsc1NlY3Rpb24oKTsKLQkJb3V0cHV0U2VjdGlvbigpOwotCQlpbml0aWFsVGV4dCgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIHByb2Nlc3MgZGV0YWlscyB0byB0aGUgdmlldwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNTZWN0aW9uKCkgewotCQlTZWN0aW9uIGRldGFpbHNTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKG15Rm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJZGV0YWlsc1NlY3Rpb24uc2V0VGV4dCgiUHJvY2VzcyBkZXRhaWxzIik7Ci0JCWRldGFpbHNTZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlDb21wb3NpdGUgZGV0YWlsc0NvbnRhaW5lciA9IGNyZWF0ZUNsaWVudENvbnRhaW5lcihkZXRhaWxzU2VjdGlvbiwgdG9vbGtpdCwgMywgdHJ1ZSwgMiwgMik7Ci0JCXBpZExhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChkZXRhaWxzQ29udGFpbmVyLCBudWxsKTsKLQkJcGlkTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUNvbXBvc2l0ZSBzdGF0dXNDb250YWluZXIgPSBjcmVhdGVDbGllbnRDb250YWluZXIoZGV0YWlsc0NvbnRhaW5lciwgdG9vbGtpdCwgMywgdHJ1ZSwgMCwgMCk7Ci0JCXN0YXR1c0NvbnRhaW5lci5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDMpKTsKLQkJc3RhdHVzTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHN0YXR1c0NvbnRhaW5lciwgbnVsbCk7Ci0JCXN0YXR1c0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJZGV0YWlsc1NlY3Rpb24uc2V0Q2xpZW50KGRldGFpbHNDb250YWluZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIHByb2Nlc3Mgb3V0cHV0IHNlY3Rpb24gdG8gdGhlIHZpZXcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRwdXRTZWN0aW9uKCkgewotCQlTZWN0aW9uIG91dHB1dFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24obXlGb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5USVRMRV9CQVIgfCBTZWN0aW9uLlRXSVNUSUUpOwotCQlvdXRwdXRTZWN0aW9uLnNldFRleHQoIlByb2dyYW0gb3V0cHV0Iik7Ci0JCW91dHB1dFNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCW91dHB1dFNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCUNvbXBvc2l0ZSBvdXB1dENvbnRhaW5lciA9IGNyZWF0ZUNsaWVudENvbnRhaW5lcihvdXRwdXRTZWN0aW9uLCB0b29sa2l0LCAxLCB0cnVlLCAyLCAyKTsKLQkJb3V0cHV0VGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChvdXB1dENvbnRhaW5lciwgbnVsbCwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJb3V0cHV0VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJb3V0cHV0U2VjdGlvbi5zZXRDbGllbnQob3VwdXRDb250YWluZXIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihvdXB1dENvbnRhaW5lcik7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjcmVhdGUgYSBjb250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gY29sdW1ucwotCSAqIEBwYXJhbSBpc0VxdWFsCi0JICogQHBhcmFtIG1oCi0JICogQHBhcmFtIG13Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ2xpZW50Q29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIGludCBjb2x1bW5zLCAKLQkJCWJvb2xlYW4gaXNFcXVhbCwgaW50IG1oLCBpbnQgbXcpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dChjb2x1bW5zLCBpc0VxdWFsLCBtaCwgbXcpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgdmlldwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxUZXh0KCkgewotCQlwaWRMYWJlbC5zZXRUZXh0KCJQSUQ6IE4vQSIpOwotCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCJTdGF0dXM6IE4vQSIpOwotCQlvdXRwdXRUZXh0LnNldFRleHQoIk4vQSIpOwotCQkKLQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJcGlkTGFiZWwuc2V0VGV4dCgiUElEOiAiICsgcHJvY2Vzcy5nZXRQaWQoKSk7Ci0JCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCJTdGF0dXM6ICIgKyBwcm9jZXNzLmdldFN0YXRlKCkpOwotCi0JCQkvKgotCQkJICogU2V0IGluaXRpYWwgb3V0cHV0IHRleHQKLQkJCSAqLwotCQkJb3V0cHV0VGV4dC5zZXRUZXh0KHByb2Nlc3MuZ2V0U2F2ZWRPdXRwdXQoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3Rkb3V0QXR0cmlidXRlRGVmaW5pdGlvbigpKSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklQcm9jZXNzTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklQcm9jZXNzQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIElQcm9jZXNzQ2hhbmdlRXZlbnQgZSkgewotCQlVSVV0aWxzLnNhZmVSdW5Bc3luY0luVUlUaHJlYWQobmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlFbnVtZXJhdGVkQXR0cmlidXRlPFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlPiBzdGF0ZUF0dHIgPSBlLmdldEF0dHJpYnV0ZXMoKS5nZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQkJCWlmIChzdGF0ZUF0dHIgIT0gbnVsbCkgewotCQkJCQlQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSA9IHN0YXRlQXR0ci5nZXRWYWx1ZSgpOwotCQkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCJTdGF0dXM6ICIgKyBzdGF0ZS50b1N0cmluZygpKTsKLQkJCQl9IAotCQkJCQotCQkJCVN0cmluZ0F0dHJpYnV0ZSBzdGRvdXRBdHRyID0gZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0ZG91dEF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCQkJaWYgKHN0ZG91dEF0dHIgIT0gbnVsbCkgewotCQkJCQlvdXRwdXRUZXh0LmFwcGVuZChzdGRvdXRBdHRyLmdldFZhbHVlKCkgKyAiXG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgZ3JpZCBsYXlvdXQKLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1ucwotCSAqIEBwYXJhbSBpc0VxdWFsCi0JICogQHBhcmFtIG1oCi0JICogQHBhcmFtIG13Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBHcmlkTGF5b3V0IGNyZWF0ZUdyaWRMYXlvdXQoaW50IGNvbHVtbnMsIGJvb2xlYW4gaXNFcXVhbCwgaW50IG1oLCBpbnQgbXcpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gY29sdW1uczsKLQkJZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBpc0VxdWFsOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG1oOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gbXc7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgR3JpZERhdGEgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIHN0eWxlCi0JICogQHBhcmFtIHNwYWNlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBHcmlkRGF0YSBzcGFuR3JpZERhdGEoaW50IHN0eWxlLCBpbnQgc3BhY2UpIHsKLQkJR3JpZERhdGEgZ2QgPSBudWxsOwotCQlpZiAoc3R5bGUgPT0gLTEpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShzdHlsZSk7Ci0JCX0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFjZTsKLQkJcmV0dXJuIGdkOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciN1cGRhdGVTdGF0dXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0ZpZWxkKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdGF0dXNGaWVsZCBmaWVsZCA9IGdldFN0YXR1c0ZpZWxkKGNhdGVnb3J5KTsKLQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCWlmIChJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TVEFUVVNfQ0FURUdPUllfSU5QVVRfUE9TSVRJT04uZXF1YWxzKGNhdGVnb3J5KSkgewotCQkJCXRleHQgPSBwaWRMYWJlbC5nZXRUZXh0KCk7Ci0JCQl9IGVsc2UgaWYgKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNUQVRVU19DQVRFR09SWV9JTlBVVF9NT0RFLmVxdWFscyhjYXRlZ29yeSkpIHsKLQkJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBwcm9jZXNzLmdldFN0YXRlKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaWVsZC5zZXRUZXh0KHRleHQgPT0gbnVsbCA/IGZFcnJvckxhYmVsIDogdGV4dCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9Qcm9jZXNzRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNjM4Yi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3ZpZXdzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0vKioKLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0gICAgcHJpdmF0ZSBJUFByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0gICAgCi0gICAgLyoqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvY2Vzc0VkaXRvcklucHV0KElQUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotICAgICAgICB0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotICAgIH0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9ySW5wdXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlQcm9jZXNzRWRpdG9ySW5wdXQgb3RoZXIgPSAoUHJvY2Vzc0VkaXRvcklucHV0KSBvYmo7Ci0JCXJldHVybiBwcm9jZXNzLmVxdWFscyhvdGhlci5wcm9jZXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogRnJvbSB0aGUgaW1wbGVtZW50aW5nIGNsYXNzIElFZGl0b3JJbnB1dC4gIFRoaXMgbWV0aG9kIG9ubHkgaGFzIHRvIGRvCi0JICogd2l0aCB3aGV0aGVyICJhbiBlZGl0b3IgaW5wdXQgc2hvdWxkIGFwcGVhciBpbiB0aGUgIkZpbGUgTW9zdCBSZWNlbnRseSAKLQkgKiBVc2VkIiBtZW51LiAgSW4gb3VyIGNhc2UsIGp1c3QgcmV0dXJuIHRydWUuCi0JICogCi0JICogQHNlZQlJRWRpdG9ySW5wdXQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCS8qIHJldHVybiBwcm9jZXNzLmV4aXN0cygpOyAqLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoKLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBwcm9jZXNzLmV4aXN0cygpOwotCX0KLQkqLwotCQotCS8qKiBHZXQgcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBwcm9jZXNzLmdldEpvYigpLmdldE5hbWUoKSArICI6IiArIHByb2Nlc3MuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciA9PSBJUFByb2Nlc3MuY2xhc3MpCi0JCQlyZXR1cm4gcHJvY2VzczsKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvdmlld3MvUmVzb3VyY2VNYW5hZ2VyVmlldy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9SZXNvdXJjZU1hbmFnZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODMzZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS92aWV3cy9SZXNvdXJjZU1hbmFnZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkTm9kZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZFF1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdKb2JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld01hY2hpbmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld05vZGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1F1ZXVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklRdWV1ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlSm9iRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVOb2RlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVRdWV1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZXNvdXJjZU1hbmFnZXJFcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU1hY2hpbmVDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUXVldWVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSU5ld1Jlc291cmNlTWFuYWdlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUubGlzdGVuZXJzLklNb2RlbE1hbmFnZXJDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyTWVudUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuUFRQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuQWRkUmVzb3VyY2VNYW5hZ2VyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLkVkaXRSZXNvdXJjZU1hbmFnZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUmVtb3ZlUmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIE1hY2hpbmVMaXN0ZW5lciBpbXBsZW1lbnRzIElNYWNoaW5lQ2hpbGRMaXN0ZW5lciwgSU1hY2hpbmVMaXN0ZW5lciB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU1hY2hpbmVDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE5vZGVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkTm9kZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZVZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSU1hY2hpbmVMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU1hY2hpbmVDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElNYWNoaW5lQ2hhbmdlRXZlbnQgZSkgewotCQkJdXBkYXRlVmlld2VyKGUuZ2V0U291cmNlKCkpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JTWFjaGluZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdOb2RlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJTmV3Tm9kZUV2ZW50IGUpIHsKLQkJCXJlZnJlc2hWaWV3ZXIoZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklNYWNoaW5lQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZU5vZGVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVOb2RlRXZlbnQgZSkgewotCQkJcmVmcmVzaFZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgTU1DaGlsZExpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlckNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklNb2RlbE1hbmFnZXJSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5ldmVudHMuSUNoYW5nZWRSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkUmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTW9kZWxNYW5hZ2VyUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklOZXdSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVFdmVudChJTmV3UmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJZmluYWwgSVJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIgPSBlLmdldFJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzb3VyY2VNYW5hZ2Vycy5hZGQocmVzb3VyY2VNYW5hZ2VyKTsKLQkJCXJlc291cmNlTWFuYWdlci5hZGRFbGVtZW50TGlzdGVuZXIocm1MaXN0ZW5lcik7Ci0JCQlyZXNvdXJjZU1hbmFnZXIuYWRkQ2hpbGRMaXN0ZW5lcihybUNoaWxkTGlzdGVuZXIpOwotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJlZnJlc2hWaWV3ZXIoUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKSk7Ci0JCQkJfX0pOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmV2ZW50cy5JTW9kZWxNYW5hZ2VyUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZXZlbnRzLklSZW1vdmVSZXNvdXJjZU1hbmFnZXJFdmVudCkKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVFdmVudChJUmVtb3ZlUmVzb3VyY2VNYW5hZ2VyRXZlbnQgZSkgewotCQkJZmluYWwgSVJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIgPSBlLmdldFJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzb3VyY2VNYW5hZ2Vycy5yZW1vdmUocmVzb3VyY2VNYW5hZ2VyKTsKLQkJCXJlc291cmNlTWFuYWdlci5yZW1vdmVFbGVtZW50TGlzdGVuZXIocm1MaXN0ZW5lcik7Ci0JCQlyZXNvdXJjZU1hbmFnZXIucmVtb3ZlQ2hpbGRMaXN0ZW5lcihybUNoaWxkTGlzdGVuZXIpOwotCQkJcm1DaGlsZExpc3RlbmVyLnJlbW92ZUxpc3RlbmVycyhyZXNvdXJjZU1hbmFnZXIpOwotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJlZnJlc2hWaWV3ZXIoUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKSk7Ci0JCQkJfX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBRdWV1ZUxpc3RlbmVyIGltcGxlbWVudHMgSVF1ZXVlTGlzdGVuZXIsIElRdWV1ZUNoaWxkTGlzdGVuZXIgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklDaGFuZ2VkSm9iRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZEpvYkV2ZW50IGUpIHsKLQkJCXVwZGF0ZVZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld0pvYkV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSU5ld0pvYkV2ZW50IGUpIHsKLQkJCXJlZnJlc2hWaWV3ZXIoZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklRdWV1ZUxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUXVldWVDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElRdWV1ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZVZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVF1ZXVlQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlbW92ZUpvYkV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZUpvYkV2ZW50IGUpIHsKLQkJCXJlZnJlc2hWaWV3ZXIoZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIFJNQ2hpbGRMaXN0ZW5lciBpbXBsZW1lbnRzCi0JCQlJUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgZmluYWwgTWFjaGluZUxpc3RlbmVyIG1hY2hpbmVMaXN0ZW5lciA9IG5ldyBNYWNoaW5lTGlzdGVuZXIoKTsKLQkJcHJpdmF0ZSBRdWV1ZUxpc3RlbmVyIHF1ZXVlTGlzdGVuZXIgPSBuZXcgUXVldWVMaXN0ZW5lcigpOwkJCi0JCXByaXZhdGUgZmluYWwgU2V0PElQTWFjaGluZT4gbWFjaGluZXMgPSBuZXcgSGFzaFNldDxJUE1hY2hpbmU+KCk7Ci0JCXByaXZhdGUgZmluYWwgU2V0PElQUXVldWU+IHF1ZXVlcyA9IG5ldyBIYXNoU2V0PElQUXVldWU+KCk7Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogbWFjaGluZXMpIHsKLQkJCQlyZW1vdmVMaXN0ZW5lcnMobWFjaGluZSk7Ci0JCQl9Ci0JCQltYWNoaW5lcy5jbGVhcigpOwotCQkJCi0JCQlmb3IgKElQUXVldWUgcXVldWUgOiBxdWV1ZXMpIHsKLQkJCQlyZW1vdmVMaXN0ZW5lcnMocXVldWUpOwotCQkJfQotCQkJcXVldWVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JQ2hhbmdlZE1hY2hpbmVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElDaGFuZ2VkTWFjaGluZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZVZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUmVzb3VyY2VNYW5hZ2VyQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckNoYW5nZWRRdWV1ZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUNoYW5nZWRRdWV1ZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZVZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdNYWNoaW5lRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlRXZlbnQoSU5ld01hY2hpbmVFdmVudCBlKSB7Ci0JCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogZS5nZXRNYWNoaW5lcygpKSB7Ci0JCQkJbWFjaGluZXMuYWRkKG1hY2hpbmUpOwotCQkJCWFkZExpc3RlbmVycyhtYWNoaW5lKTsKLQkJCX0KLQkJCXJlZnJlc2hWaWV3ZXIoZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JTmV3UXVldWVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdRdWV1ZUV2ZW50IGUpIHsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IGUuZ2V0UXVldWVzKCkpIHsKLQkJCQlxdWV1ZXMuYWRkKHF1ZXVlKTsKLQkJCQlhZGRMaXN0ZW5lcnMocXVldWUpOwotCQkJfQotCQkJcmVmcmVzaFZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckNoaWxkTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVNYWNoaW5lRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZU1hY2hpbmVFdmVudCBlKSB7Ci0JCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogZS5nZXRNYWNoaW5lcygpKSB7Ci0JCQkJbWFjaGluZXMucmVtb3ZlKG1hY2hpbmUpOwotCQkJCXJlbW92ZUxpc3RlbmVycyhtYWNoaW5lKTsKLQkJCX0KLQkJCXJlZnJlc2hWaWV3ZXIoZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyUmVtb3ZlUXVldWVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZW1vdmVRdWV1ZUV2ZW50IGUpIHsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IGUuZ2V0UXVldWVzKCkpIHsKLQkJCQlxdWV1ZXMucmVtb3ZlKHF1ZXVlKTsKLQkJCQlyZW1vdmVMaXN0ZW5lcnMocXVldWUpOwotCQkJfQotCQkJcmVmcmVzaFZpZXdlcihlLmdldFNvdXJjZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcmVzb3VyY2VNYW5hZ2VyCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKElSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQlMaXN0PElQTWFjaGluZT4gcmVtb3ZlTWFjaGluZXMgPSBBcnJheXMuYXNMaXN0KHJlc291cmNlTWFuYWdlci5nZXRNYWNoaW5lcygpKTsKLQkJCXJlbW92ZU1hY2hpbmVzLnJldGFpbkFsbChtYWNoaW5lcyk7Ci0JCQlmb3IgKElQTWFjaGluZSBtYWNoaW5lIDogcmVtb3ZlTWFjaGluZXMpIHsKLQkJCQlyZW1vdmVMaXN0ZW5lcnMobWFjaGluZSk7Ci0JCQl9Ci0JCQltYWNoaW5lcy5yZW1vdmVBbGwocmVtb3ZlTWFjaGluZXMpOwotCQkJCi0JCQlMaXN0PElQUXVldWU+IHJlbW92ZVF1ZXVlcyA9IEFycmF5cy5hc0xpc3QocmVzb3VyY2VNYW5hZ2VyLmdldFF1ZXVlcygpKTsKLQkJCXJlbW92ZVF1ZXVlcy5yZXRhaW5BbGwocXVldWVzKTsKLQkJCWZvciAoSVBRdWV1ZSBxdWV1ZSA6IHJlbW92ZVF1ZXVlcykgewotCQkJCXJlbW92ZUxpc3RlbmVycyhxdWV1ZSk7Ci0JCQl9Ci0JCQlxdWV1ZXMucmVtb3ZlQWxsKHJlbW92ZVF1ZXVlcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gbWFjaGluZQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBJUE1hY2hpbmUgbWFjaGluZSkgewotCQkJbWFjaGluZS5hZGRFbGVtZW50TGlzdGVuZXIobWFjaGluZUxpc3RlbmVyKTsKLQkJCW1hY2hpbmUuYWRkQ2hpbGRMaXN0ZW5lcihtYWNoaW5lTGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBxdWV1ZQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBJUFF1ZXVlIHF1ZXVlKSB7Ci0JCQlxdWV1ZS5hZGRFbGVtZW50TGlzdGVuZXIocXVldWVMaXN0ZW5lcik7Ci0JCQlxdWV1ZS5hZGRDaGlsZExpc3RlbmVyKHF1ZXVlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIG1hY2hpbmUKLQkJICovCi0JCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnMoZmluYWwgSVBNYWNoaW5lIG1hY2hpbmUpIHsKLQkJCW1hY2hpbmUucmVtb3ZlRWxlbWVudExpc3RlbmVyKG1hY2hpbmVMaXN0ZW5lcik7Ci0JCQltYWNoaW5lLnJlbW92ZUNoaWxkTGlzdGVuZXIobWFjaGluZUxpc3RlbmVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcXVldWUKLQkJICovCi0JCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnMoSVBRdWV1ZSBxdWV1ZSkgewotCQkJcXVldWUucmVtb3ZlRWxlbWVudExpc3RlbmVyKHF1ZXVlTGlzdGVuZXIpOwotCQkJcXVldWUucmVtb3ZlQ2hpbGRMaXN0ZW5lcihxdWV1ZUxpc3RlbmVyKTsKLQkJfQkKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFJNTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VNYW5hZ2VyTGlzdGVuZXIgewotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlc291cmNlTWFuYWdlckNoYW5nZUV2ZW50IGUpIHsKLQkJCXJlZnJlc2hWaWV3ZXIoZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklSZXNvdXJjZU1hbmFnZXJMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVJlc291cmNlTWFuYWdlckVycm9yRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyRXJyb3JFdmVudCBlKSB7Ci0JCQlyZWZyZXNoVmlld2VyKGUuZ2V0U291cmNlKCkpOwotCQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBVSVBsdWdpbi5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKFBUUFVJUGx1Z2luLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLCAiUmVzb3VyY2UgTWFuYWdlciBFcnJvciIsICJUaGUgXCIiICsgZS5nZXRTb3VyY2UoKS5nZXROYW1lKCkgKyAiXCIgcmVzb3VyY2UgbWFuYWdlciByZXBvcnRlZCB0aGUgZm9sbG93aW5nIGVycm9yIiwgc3RhdHVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVJlc291cmNlTWFuYWdlckxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVzb3VyY2VNYW5hZ2VyU3VibWl0Sm9iRXJyb3JFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElSZXNvdXJjZU1hbmFnZXJTdWJtaXRKb2JFcnJvckV2ZW50IGUpIHsKLQkJCS8vIEhhbmRsZWQgYnkgbGF1bmNoIGZyYW1ld29yawotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8SVJlc291cmNlTWFuYWdlcj4gcmVzb3VyY2VNYW5hZ2VycyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZU1hbmFnZXI+KCk7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBSZW1vdmVSZXNvdXJjZU1hbmFnZXJzQWN0aW9uIHJlbW92ZVJlc291cmNlTWFuYWdlckFjdGlvbjsKLQlwcml2YXRlIEFkZFJlc291cmNlTWFuYWdlckFjdGlvbiBhZGRSZXNvdXJjZU1hbmFnZXJBY3Rpb247Ci0JcHJpdmF0ZSBFZGl0UmVzb3VyY2VNYW5hZ2VyQWN0aW9uIGVkaXRSZXNvdXJjZU1hbmFnZXJBY3Rpb247Ci0KLQlwcml2YXRlIGZpbmFsIE1NQ2hpbGRMaXN0ZW5lciBtbUNoaWxkTGlzdGVuZXIgPSBuZXcgTU1DaGlsZExpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBSTUxpc3RlbmVyIHJtTGlzdGVuZXIgPSBuZXcgUk1MaXN0ZW5lcigpOwotCXByaXZhdGUgZmluYWwgUk1DaGlsZExpc3RlbmVyIHJtQ2hpbGRMaXN0ZW5lciA9IG5ldyBSTUNoaWxkTGlzdGVuZXIoKTsKLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXJWaWV3KCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotCi0JCXZpZXdlci5zZXRJbnB1dChQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBFbmFibGUgcmlnaHQtY2xpY2sgcG9wdXAgbWVudQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQljcmVhdGVDb250ZXh0TWVudSgpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gRW5hYmxlIHByb3BlcnR5IHNoZWV0IHVwZGF0ZXMgd2hlbiB0cmVlIGl0ZW1zIGFyZSBzZWxlY3RlZC4KLQkJLy8gTm90ZSBmb3IgdGhpcyB0byB3b3JrIGVhY2ggaXRlbSBpbiB0aGUgdHJlZSBtdXN0IGVpdGhlciBpbXBsZW1lbnQKLQkJLy8gSVByb3BlcnR5U291cmNlLCBvciBzdXBwb3J0IElQcm9wZXJ0eVNvdXJjZS5jbGFzcyBhcyBhbiBhZGFwdGVyIHR5cGUKLQkJLy8gaW4gaXRzIEFkYXB0ZXJGYWN0b3J5LgotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpOwotCi0JCXZpZXdlci5nZXRUcmVlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlciNtb3VzZURvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJCUlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVHJlZVNlbGVjdGlvbil2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCUlSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJtID0gKElSZXNvdXJjZU1hbmFnZXJDb250cm9sKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKHJtLmdldFN0YXRlKCkgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVE9QUEVEKSB7Ci0JCQkJCQllZGl0UmVzb3VyY2VNYW5hZ2VyQWN0aW9uLnNldFJlc291cmNlTWFuYWdlcihybSk7Ci0JCQkJCQllZGl0UmVzb3VyY2VNYW5hZ2VyQWN0aW9uLnJ1bigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyI21vdXNlRG93bihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlUcmVlSXRlbSBpdGVtID0gdmlld2VyLmdldFRyZWUoKS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJCWlmIChpdGVtID09IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJdmlld2VyLmdldFRyZWUoKS5kZXNlbGVjdEFsbCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChpdGVtICE9IG51bGwpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUlNb2RlbE1hbmFnZXIgbW0gPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJCi0JICAgIC8qCi0JICAgICAqIEFkZCB1cyB0byBhbnkgZXhpc3RpbmcgUk0ncy4gSSBndWVzcyBpdCdzIHBvc3NpYmxlIHdlIGNvdWxkCi0JICAgICAqIG1pc3MgYSBSTSBpZiBhIG5ldyBldmVudCBhcnJpdmVzIHdoaWxlIHdlJ3JlIGRvaW5nIHRoaXMsIGJ1dCBpcyAKLQkgICAgICogaXQgYSBwcm9ibGVtPwotCSAgICAgKi8KLQkgICAgZm9yIChJUmVzb3VyY2VNYW5hZ2VyIHJtIDogbW0uZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXJzKCkpIHsKLQkgICAgICAgIHJtLmFkZEVsZW1lbnRMaXN0ZW5lcihybUxpc3RlbmVyKTsKLQkgICAgfQotCQltbS5hZGRMaXN0ZW5lcihtbUNoaWxkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihtbUNoaWxkTGlzdGVuZXIpOwotCQlmb3IgKElSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyIDogcmVzb3VyY2VNYW5hZ2VycykgewotCQkJcmVzb3VyY2VNYW5hZ2VyLnJlbW92ZUVsZW1lbnRMaXN0ZW5lcihybUxpc3RlbmVyKTsKLQkJCXJlc291cmNlTWFuYWdlci5yZW1vdmVDaGlsZExpc3RlbmVyKHJtQ2hpbGRMaXN0ZW5lcik7Ci0JCX0KLQkJcmVzb3VyY2VNYW5hZ2Vycy5jbGVhcigpOwotCQlybUNoaWxkTGlzdGVuZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCWFkZFJlc291cmNlTWFuYWdlckFjdGlvbiA9IG5ldyBBZGRSZXNvdXJjZU1hbmFnZXJBY3Rpb24oc2hlbGwpOwotCQlyZW1vdmVSZXNvdXJjZU1hbmFnZXJBY3Rpb24gPSBuZXcgUmVtb3ZlUmVzb3VyY2VNYW5hZ2Vyc0FjdGlvbihzaGVsbCk7Ci0JCWVkaXRSZXNvdXJjZU1hbmFnZXJBY3Rpb24gPSBuZXcgRWRpdFJlc291cmNlTWFuYWdlckFjdGlvbihzaGVsbCk7Ci0KLQkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCWZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0KLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIHZpZXdlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJbWFuYWdlci5hZGQoYWRkUmVzb3VyY2VNYW5hZ2VyQWN0aW9uKTsKLQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJYm9vbGVhbiBpbkNvbnRleHRGb3JSTSA9IHNlbGVjdGlvbi5zaXplKCkgPiAwOwotCQlib29sZWFuIGluQ29udGV4dEZvckVkaXRSTSA9IGluQ29udGV4dEZvclJNOwotCQlib29sZWFuIGluQ29udGV4dEZvclJlbW92ZVJNID0gaW5Db250ZXh0Rm9yUk07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoIShzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2VNYW5hZ2VyTWVudUNvbnRyaWJ1dGlvbikpIHsKLQkJCQkvLyBOb3QgYWxsIG9mIHRoZSBzZWxlY3RlZCBhcmUgUk1zCi0JCQkJaW5Db250ZXh0Rm9yUk0gPSBmYWxzZTsKLQkJCQlpbkNvbnRleHRGb3JFZGl0Uk0gPSBmYWxzZTsKLQkJCQlpbkNvbnRleHRGb3JSZW1vdmVSTSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWIgPSAoSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24pIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCSAgICBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCkgbWVudUNvbnRyaWIuZ2V0QWRhcHRlcihJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbC5jbGFzcyk7Ci0JCQkgICAgaWYgKHJtLmdldFN0YXRlKCkgIT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVE9QUEVEKSB7Ci0JCQkgICAgCWluQ29udGV4dEZvckVkaXRSTSA9IGZhbHNlOwotCQkJICAgICAgICBpbkNvbnRleHRGb3JSZW1vdmVSTSA9IGZhbHNlOwotCQkJICAgIH0KLQkJCX0KLQkJfQotCQltYW5hZ2VyLmFkZChyZW1vdmVSZXNvdXJjZU1hbmFnZXJBY3Rpb24pOwotCQlyZW1vdmVSZXNvdXJjZU1hbmFnZXJBY3Rpb24uc2V0RW5hYmxlZChpbkNvbnRleHRGb3JSZW1vdmVSTSk7Ci0JCWlmIChpbkNvbnRleHRGb3JSZW1vdmVSTSkgewotCQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2xbXSBybU1hbmFnZXJzID0gbmV3IElSZXNvdXJjZU1hbmFnZXJDb250cm9sW3NlbGVjdGlvbi5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBybU1hbmFnZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24gbWVudUNvbnRyaWIgPSAoSVJlc291cmNlTWFuYWdlck1lbnVDb250cmlidXRpb24pIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQlybU1hbmFnZXJzW2ldID0gKElSZXNvdXJjZU1hbmFnZXJDb250cm9sKSBtZW51Q29udHJpYi5nZXRBZGFwdGVyKElSZXNvdXJjZU1hbmFnZXJDb250cm9sLmNsYXNzKTsKLQkJCX0KLQkJCXJlbW92ZVJlc291cmNlTWFuYWdlckFjdGlvbi5zZXRSZXNvdXJjZU1hbmFnZXIocm1NYW5hZ2Vycyk7Ci0JCX0KLQkJbWFuYWdlci5hZGQoZWRpdFJlc291cmNlTWFuYWdlckFjdGlvbik7Ci0JCWVkaXRSZXNvdXJjZU1hbmFnZXJBY3Rpb24uc2V0RW5hYmxlZChpbkNvbnRleHRGb3JFZGl0Uk0pOwotCQlpZiAoaW5Db250ZXh0Rm9yRWRpdFJNKSB7Ci0JCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyTWVudUNvbnRyaWJ1dGlvbiBtZW51Q29udHJpYiA9IChJUmVzb3VyY2VNYW5hZ2VyTWVudUNvbnRyaWJ1dGlvbikgc2VsZWN0ZWRPYmplY3RzWzBdOwotCQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm1NYW5hZ2VyID0gKElSZXNvdXJjZU1hbmFnZXJDb250cm9sKSBtZW51Q29udHJpYi5nZXRBZGFwdGVyKElSZXNvdXJjZU1hbmFnZXJDb250cm9sLmNsYXNzKTsKLQkJCWVkaXRSZXNvdXJjZU1hbmFnZXJBY3Rpb24uc2V0UmVzb3VyY2VNYW5hZ2VyKHJtTWFuYWdlcik7Ci0JCX0KLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TCi0JCQkJKyAiLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIElQRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTYWZlUnVubmFibGUgc2FmZVJ1bm5hYmxlID0gbmV3IFNhZmVSdW5uYWJsZSgpewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQl2aWV3ZXIucmVmcmVzaChlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKHNhZmVSdW5uYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZpZXdlcihmaW5hbCBJUEVsZW1lbnQgZWxlbWVudCkgewotCQlJU2FmZVJ1bm5hYmxlIHNhZmVSdW5uYWJsZSA9IG5ldyBTYWZlUnVubmFibGUoKXsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJdmlld2VyLnVwZGF0ZShlbGVtZW50LCBudWxsKTsKLQkJCX0KLQkJfTsKLQkJVUlVdGlscy5zYWZlUnVuQXN5bmNJblVJVGhyZWFkKHNhZmVSdW5uYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3dpemFyZHMvUk1Db25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3dpemFyZHMvUk1Db25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWE3MzcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91aS93aXphcmRzL1JNQ29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLlBUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5VSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgUk1Db25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGNsYXNzIE5hbWVBbmREZXNjUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JCXByaXZhdGUgVGV4dCBkZXNjVGV4dDsKLQkJcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JCXB1YmxpYyBOYW1lQW5kRGVzY1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCQlzZXRUaXRsZShwYWdlTmFtZSk7Ci0JCQlzZXREZXNjcmlwdGlvbihVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbmZpZ3VyYXRpb25XaXphcmQuTmFtZURlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCWNyZWF0ZU5hbWVEZXNjQ29udHJvbChjb21wb3NpdGUpOwotCi0JCQlmaW5hbCBib29sZWFuIHRleHRBbmREZXNjcmlwdGlvbkVuYWJsZWQgPSBoYXNGYWN0b3JpZXM7Ci0JCQluYW1lVGV4dC5zZXRFbmFibGVkKHRleHRBbmREZXNjcmlwdGlvbkVuYWJsZWQpOwotCQkJZGVzY1RleHQuc2V0RW5hYmxlZCh0ZXh0QW5kRGVzY3JpcHRpb25FbmFibGVkKTsKLQotCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hbWVEZXNjQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJCUNvbXBvc2l0ZSBuYW1lR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJbmFtZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQkJbmFtZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlmaW5hbCBCdXR0b24gdXNlRGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKG5hbWVHcm91cCwKLQkJCQkJU1dULlRPR0dMRSB8IFNXVC5DSEVDSyk7Ci0JCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRUZXh0KFVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiQ29uZmlndXJhdGlvbldpemFyZC5Vc2VEZWZhdWx0QnV0dG9uTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXVzZURlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbih1c2VEZWZhdWx0TmFtZUFuZERlc2MpOwotCQkJR3JpZERhdGEgYnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJYnV0dG9uRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCQkJdXNlRGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl1c2VEZWZhdWx0TmFtZUFuZERlc2MgPSB1c2VEZWZhdWx0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJZmluYWwgYm9vbGVhbiBlbmFibGVkID0gaGFzRmFjdG9yaWVzCi0JCQkJCQkJJiYgIXVzZURlZmF1bHROYW1lQW5kRGVzYzsKLQkJCQkJaWYgKHVzZURlZmF1bHROYW1lQW5kRGVzYykgewotCQkJCQkJY29uZmlnc1tzZWxlY3RlZEZhY3RvcnldLnNldERlZmF1bHROYW1lQW5kRGVzYygpOwotCQkJCQkJc2V0TmFtZUFuZERlc2NyaXB0aW9uKGNvbmZpZ3Nbc2VsZWN0ZWRGYWN0b3J5XSk7Ci0JCQkJCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCX0KLQkJCQkJbmFtZUFuZERlc2NQYWdlLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKG5hbWVHcm91cCwgU1dULk5PTkUpOwotCQkJbmFtZUxhYmVsLnNldFRleHQoVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJDb25maWd1cmF0aW9uV2l6YXJkLk5hbWVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZVRleHQgPSBuZXcgVGV4dChuYW1lR3JvdXAsIFNXVC5CT1JERVIpOwotCQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWNvbmZpZ3Nbc2VsZWN0ZWRGYWN0b3J5XS5zZXROYW1lKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCQkJCWlmIChuYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKEVNUFRZX1NUUklORykpIHsKLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoIlBsZWFzZSBzcGVjaWZ5IGEgcmVzb3VyY2UgbWFuYWdlciBuYW1lIik7Ci0JCQkJCX0KLQkJCQl9fSk7Ci0KLQkJCUxhYmVsIGRlc2NMYWJlbCA9IG5ldyBMYWJlbChuYW1lR3JvdXAsIFNXVC5OT05FKTsKLQkJCWRlc2NMYWJlbC5zZXRUZXh0KFVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiQ29uZmlndXJhdGlvbldpemFyZC5EZXNjcmlwdGlvbkxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCQlkZXNjVGV4dCA9IG5ldyBUZXh0KG5hbWVHcm91cCwgU1dULkJPUkRFUik7Ci0JCQlkZXNjVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWRlc2NUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlkZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJY29uZmlnc1tzZWxlY3RlZEZhY3RvcnldLnNldERlc2NyaXB0aW9uKGRlc2NUZXh0LmdldFRleHQoKSk7Ci0JCQkJfX0pOwotCQkJCi0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCW5hbWVUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQlkZXNjVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldE5hbWVBbmREZXNjcmlwdGlvbihJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCW5hbWVUZXh0LnNldFRleHQoY29uZmlnLmdldE5hbWUoKSk7Ci0JCQlkZXNjVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXREZXNjcmlwdGlvbigpKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3RGYWN0b3J5UGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JCXByaXZhdGUgTGlzdCBmYWN0b3J5TGlzdDsKLQotCQlwdWJsaWMgU2VsZWN0RmFjdG9yeVBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCQlzZXRUaXRsZShwYWdlTmFtZSk7Ci0JCQlzZXREZXNjcmlwdGlvbihVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbmZpZ3VyYXRpb25XaXphcmQuU2VsZWN0RmFjdG9yeURlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JICAgICAgICAKLQkJCWNyZWF0ZVJNRmFjdG9yeUNob2ljZUNvbnRyb2woY29tcG9zaXRlKTsKLQotCQkJaWYgKGhhc0ZhY3RvcmllcykgewotCQkJCXBhcmVudC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmYWN0b3J5TGlzdC5zZWxlY3QoMCk7Ci0JCQkJCQloYW5kbGVGYWN0b3J5U2VjbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVSTUZhY3RvcnlDaG9pY2VDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCVN0cmluZ1tdIGZhY3RvcnlOYW1lcyA9IG5ldyBTdHJpbmdbZmFjdG9yaWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY3Rvcmllcy5sZW5ndGg7ICsraSkgewotCQkJCWZhY3RvcnlOYW1lc1tpXSA9IGZhY3Rvcmllc1tpXS5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUxhYmVsIGZhY3RvcnlMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJCWZhY3RvcnlMYWJlbC5zZXRUZXh0KFVJTWVzc2FnZS5nZXRSZXNvdXJjZVN0cmluZygiQ29uZmlndXJhdGlvbldpemFyZC5SZXNvdXJjZU1hbmFnZXJUeXBlc0xhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCQlmYWN0b3J5TGlzdCA9IG5ldyBMaXN0KGNvbnRhaW5lciwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIKLQkJCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQkJZmFjdG9yeUxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlmYWN0b3J5TGlzdC5zZXRJdGVtcyhmYWN0b3J5TmFtZXMpOwotCQkJZmFjdG9yeUxpc3Quc2V0RW5hYmxlZChoYXNGYWN0b3JpZXMpOwotCQkJZmFjdG9yeUxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIG5vLW9wCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQloYW5kbGVGYWN0b3J5U2VjbGVjdGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUZhY3RvcnlTZWNsZWN0aW9uKCkgewotCQkJaW50IGluZGV4ID0gZmFjdG9yeUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWZhY3RvcnlTZWxlY3RlZChpbmRleCk7Ci0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXVtdIGNhY2hlZFBhZ2VzOwotCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8V2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgQXJyYXlMaXN0PFdpemFyZFBhZ2U+KCk7Ci0KLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uW10gY29uZmlncyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIFNlbGVjdEZhY3RvcnlQYWdlIHNlbGVjdEZhY3RvcnlQYWdlOwotCi0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeVtdIGZhY3RvcmllczsKLQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNGYWN0b3JpZXM7Ci0KLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IHJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdE5hbWVBbmREZXNjOwotCQotCXByaXZhdGUgZmluYWwgTmFtZUFuZERlc2NQYWdlIG5hbWVBbmREZXNjUGFnZTsKLQotCXByaXZhdGUgaW50IHNlbGVjdGVkRmFjdG9yeSA9IC0xOwotCQotCXByaXZhdGUgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcmVzb3VyY2VNYW5hZ2VyOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciB1c2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgUk1Db25maWd1cmF0aW9uV2l6YXJkKAotCQkJSVJlc291cmNlTWFuYWdlckZhY3RvcnlbXSByZXNvdXJjZU1hbmFnZXJGYWN0b3JpZXMpIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQl0aGlzLmZhY3RvcmllcyA9IHJlc291cmNlTWFuYWdlckZhY3RvcmllczsKLQkJdGhpcy5oYXNGYWN0b3JpZXMgPSBmYWN0b3JpZXMgIT0gbnVsbCAmJiBmYWN0b3JpZXMubGVuZ3RoID4gMDsKLQkJdGhpcy5jYWNoZWRQYWdlcyA9IG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW2ZhY3Rvcmllcy5sZW5ndGhdW107Ci0JCXRoaXMuY29uZmlncyA9IG5ldyBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbltmYWN0b3JpZXMubGVuZ3RoXTsKLQkJdGhpcy5zZWxlY3RGYWN0b3J5UGFnZSA9IG5ldyBTZWxlY3RGYWN0b3J5UGFnZSgKLQkJCQlVSU1lc3NhZ2UuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbmZpZ3VyYXRpb25XaXphcmQuRmlyc3RXaXphcmRQYWdlTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm5hbWVBbmREZXNjUGFnZSA9IG5ldyBOYW1lQW5kRGVzY1BhZ2UoCi0JCQkJVUlNZXNzYWdlLmdldFJlc291cmNlU3RyaW5nKCJDb25maWd1cmF0aW9uV2l6YXJkLlNlY29uZFdpemFyZFBhZ2VOYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMudXNlRGVmYXVsdE5hbWVBbmREZXNjID0gdHJ1ZTsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogQ29uc3RydWN0b3IgdXNlZCB3aGVuIGVkaXRpbmcgY29uZmlndXJhdGlvbiBvZiBhbiBleGlzdGluZyByZXNvdXJjZSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBSTUNvbmZpZ3VyYXRpb25XaXphcmQoSVJlc291cmNlTWFuYWdlckZhY3RvcnkgcmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSwKLQkJCUlSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJlc291cmNlTWFuYWdlcikgewotCQl0aGlzKG5ldyBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeVtdIHsgcmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSB9KTsKLQkJdGhpcy5jb25maWdzWzBdID0gcmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5jb3B5Q29uZmlndXJhdGlvbihyZXNvdXJjZU1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJdGhpcy51c2VEZWZhdWx0TmFtZUFuZERlc2MgPSBmYWxzZTsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7Ci0JCWZhY3RvcnlTZWxlY3RlZCgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHJlc291cmNlTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlhZGRQYWdlKHNlbGVjdEZhY3RvcnlQYWdlKTsKLQkJfQotCQlhZGRQYWdlKG5hbWVBbmREZXNjUGFnZSk7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAoIWhhc0ZhY3RvcmllcykKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgbnVtUGFnZXMgPSBnZXROdW1QYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVBhZ2VzOyArK2kpIHsKLQkJCVdpemFyZFBhZ2UgcGFnZSA9IChXaXphcmRQYWdlKSB3aXphcmRQYWdlcy5nZXQoaSk7Ci0JCQlpZiAoIXBhZ2UuaXNQYWdlQ29tcGxldGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZ3Nbc2VsZWN0ZWRGYWN0b3J5XTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbmFtZUFuZERlc2NQYWdlLmRlc2NUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lQW5kRGVzY1BhZ2UubmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWludCBudW1QYWdlcyA9IGdldE51bVBhZ2VzKCk7Ci0KLQkJaW50IGluZGV4ID0gd2l6YXJkUGFnZXMuaW5kZXhPZihwYWdlKTsKLQkJaWYgKGluZGV4ID09IG51bVBhZ2VzIC0gMSB8fCBpbmRleCA9PSAtMSkgewotCQkJLy8gbGFzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaW5kZXggPT0gbnVtUGFnZXMgLSAyKSB7Ci0JCQkvLyBpbml0aWFsaXplIGxhc3QgcGFnZQotCQkJaWYgKHVzZURlZmF1bHROYW1lQW5kRGVzYykgewotCQkJCWNvbmZpZ3Nbc2VsZWN0ZWRGYWN0b3J5XS5zZXREZWZhdWx0TmFtZUFuZERlc2MoKTsKLQkJCX0KLQkJCW5hbWVBbmREZXNjUGFnZS5zZXROYW1lQW5kRGVzY3JpcHRpb24oY29uZmlnc1tzZWxlY3RlZEZhY3RvcnldKTsKLQkJCW5hbWVBbmREZXNjUGFnZS5zZXRFbmFibGVkKCF1c2VEZWZhdWx0TmFtZUFuZERlc2MpOwotCQl9Ci0JCXJldHVybiAoSVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzLmdldChpbmRleCArIDEpOwotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBpbnQgaW5kZXggPSB3aXphcmRQYWdlcy5pbmRleE9mKHBhZ2UpOwotICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAtMSkgewotCQkJLy8gZmlyc3QgcGFnZSBvciBwYWdlIG5vdCBmb3VuZAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKElXaXphcmRQYWdlKSB3aXphcmRQYWdlcy5nZXQoaW5kZXggLSAxKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWZpbmFsIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3Nbc2VsZWN0ZWRGYWN0b3J5XTsKLQkJaWYgKHVzZURlZmF1bHROYW1lQW5kRGVzYykgewotCQkJY29uZmlnLnNldERlZmF1bHROYW1lQW5kRGVzYygpOwotCQl9Ci0JCWlmIChyZXNvdXJjZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmVzb3VyY2VNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCVBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpLnNhdmVSZXNvdXJjZU1hbmFnZXJzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSA9IHJlc291cmNlTWFuYWdlckZhY3RvcnkuY3JlYXRlKGNvbmZpZyk7Ci0JCQlQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKS5hZGRSZXNvdXJjZU1hbmFnZXIocm0pOwotCQl9Ci0JCUFycmF5cy5maWxsKGNvbmZpZ3MsIG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmFjdG9yeVNlbGVjdGVkKGludCBzZWxlY3RlZEZhY3RvcnkpIHsKLQkJdGhpcy5zZWxlY3RlZEZhY3RvcnkgPSBzZWxlY3RlZEZhY3Rvcnk7Ci0JCXJlc291cmNlTWFuYWdlckZhY3RvcnkgPSBmYWN0b3JpZXNbc2VsZWN0ZWRGYWN0b3J5XTsKLQkJaWYgKGNvbmZpZ3Nbc2VsZWN0ZWRGYWN0b3J5XSA9PSBudWxsKSB7Ci0JCQljb25maWdzW3NlbGVjdGVkRmFjdG9yeV0gPSByZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb24oKTsKLQkJfQotCi0JCXNldFdpemFyZFBhZ2VzKHNlbGVjdGVkRmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TnVtUGFnZXMoKSB7Ci0JCXJldHVybiB3aXphcmRQYWdlcy5zaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFdpemFyZFBhZ2VzKGludCBpbmRleCkgewotCQkvLyBJZiB0aGlzIGZhY3RvcnkgaGFzIG5vdCBiZWVuIHNlbGVjdGVkIGJlZm9yZQotCQkvLyB0aGVuIHdlIG11c3QgZ2V0IHRoZSBhZGRpdGlvbmFsIHdpemFyZCBwYWdlcyBmb3IKLQkJLy8gdGhlIGZhY3RvcnkgYW5kIGNhY2hlIHRoZW0uCi0JCQotCQlpZiAoY2FjaGVkUGFnZXNbaW5kZXhdID09IG51bGwpIHsKLQkJCWZpbmFsIFBUUFVJUGx1Z2luIHVpUGx1Z2luID0gUFRQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJZmluYWwgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgZmFjdG9yeSA9IHVpUGx1Z2luLmdldFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5KHJlc291cmNlTWFuYWdlckZhY3RvcnkpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNhY2hlZFBhZ2VzW2luZGV4XSA9IGZhY3RvcnkuZ2V0UGFnZXModGhpcyk7Ci0JCQl9Ci0KLQkJCWlmIChjYWNoZWRQYWdlc1tpbmRleF0gPT0gbnVsbCkgewotCQkJCWNhY2hlZFBhZ2VzW2luZGV4XSA9IG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlWzBdOwotCQkJfQotCQkJCi0JCQkvLyBBbGwgd2l6YXJkIHBhZ2VzIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoCi0JCQkvLyBhIGNhbGwgdG8gYWRkUGFnZSguLi4pCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFBhZ2VzW2luZGV4XS5sZW5ndGg7ICsraSkgewotCQkJCWFkZFBhZ2UoY2FjaGVkUGFnZXNbaW5kZXhdW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB0aGUgZmlyc3QgYW5kIGxhc3QgcGFnZXMgdG8gdGhlIHNlbGVjdGVkIGZhY3RvcnkncyBwYWdlcwotCQkKLQkJd2l6YXJkUGFnZXMuY2xlYXIoKTsKLQkJaWYgKHJlc291cmNlTWFuYWdlciA9PSBudWxsKSB7Ci0JCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RmFjdG9yeVBhZ2UpOwotCQl9Ci0JCXdpemFyZFBhZ2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNhY2hlZFBhZ2VzW2luZGV4XSkpOwotCQl3aXphcmRQYWdlcy5hZGQobmFtZUFuZERlc2NQYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvd2l6YXJkcy9STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3dpemFyZHMvUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzRmNjM2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvd2l6YXJkcy9STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdG8gc3ViY2xhc3MgY29udHJpYnV0ZWQgV2l6YXJkUGFnZXMgdG8gY3JlYXRlCi0gKiBuZXcgUmVzb3VyY2UgTWFuYWdlcnMKLSAqIAotICogQGF1dGhvciByc3FyZAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgZmluYWwgUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBSTUNvbmZpZ3VyYXRpb25XaXphcmQgZ2V0Q29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJcmV0dXJuIHdpemFyZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3VpL3dpemFyZHMvUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvd2l6YXJkcy9STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2E3YzgxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdWkvd2l6YXJkcy9STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotCi0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBjb250cmlidXRpbmcKLSAqIENvbmZpZ3VyYXRpb25XaXphcmRQYWdlcyB0byB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgcnNxcmQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2l6YXJkIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIFRoZSBjb250cmlidXRlZCBDb25maWd1cmF0aW9uV2l6YXJkUGFnZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZVtdIGdldFBhZ2VzKFJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpOwotCi0JLyoqCi0JICogV2hpY2ggSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZG9lcyB0aGlzIGNvbnRyaWJ1dGVkIHNldAotCSAqIG9mIENvbmZpZ3VyYXRpb25XaXphcmRQYWdlcyBzZXJ2ZT8KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeT4gZ2V0Uk1GYWN0b3J5Q2xhc3MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvdGVtcGxhdGUvY3RlbXBsYXRlLnR4dCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnVpL3RlbXBsYXRlL2N0ZW1wbGF0ZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzBiMDcuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkvdGVtcGxhdGUvY3RlbXBsYXRlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIGRpc3BsYXkoKSB7Ci0JY29uc3QgaW50IHMxID0gMTA7Ci0JY29uc3QgaW50IHMyID0gMjA7Ci0KLQlpbnQgYXJyYXkxW3MxXTsKLQlpbnQgYXJyYXkyW3MxXVtzMl07Ci0JaW50IG51bSA9IDEwOwotCWludCBpLGogPSAwOwotCi0JZm9yIChpPTA7IGk8czE7IGkrKykgewotCQlhcnJheTFbaV0gPSBpOwotCQlmb3IgKGo9MDsgajxzMjsgaisrKSB7Ci0JCQlhcnJheTJbaV1bal0gPSBpICsgajsKLQkJCXByaW50ZigiQXJyYXk6ICVkXG4iLCBhcnJheTJbaV1bal0pOwotCQl9Ci0JfQotCi0JZm9yIChpPTA7IGk8MTA7IGkrKykgewotCQludW0gKz0gaTsKLQkJcHJpbnRmKCJOdW06ICVkXG4iLCBudW0pOwotCX0KLQlwcmludGYoIkZpbmlzaGVkXG4iKTsKLX0KLQotaW50IG1haW4oKSB7Ci0JcHJpbnRmKCJIZWxsbyBDXG4iKTsKLQlkaXNwbGF5KCk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLy5jbGFzc3BhdGggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvLnByb2plY3QgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJiYWE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiYWUxNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBTZXAgMDQgMTU6MjA6MzIgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZWJiZTAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmV4dGVuc2lvbnBvaW50cywKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5maWxlLAotIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmxpbnV4Ci1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9hYm91dC5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9hYm91dC5pbmkgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9hYm91dC5tYXBwaW5ncyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL2Fib3V0LnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2JhNzIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE5MU19NRVNTQUdFRk9STUFUX05PTkUKLSMgTkxTX0VOQ09ESU5HPVVURi04Ci0KLWJsdXJiPVBUUCBDb3JlIFV0aWxpdGllc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLUNvcHlyaWdodCAoYykgMjAwNSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhkNDllLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9lY2xpcHNlMzIucG5nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjMxNGVjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIENvcmUgVXRpbGl0aWVzCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9wbHVnaW4ueG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NhOTNjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvQWN0aXZhdG9yLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZmUzZS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvQXJndW1lbnRQYXJzZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL0FyZ3VtZW50UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDk5NmMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvQXJndW1lbnRQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmVhbVRva2VuaXplcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIENvbnZlcnQgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBpbnRvIGFuCi0gKiBhcnJheSBvZiBzdHJpbmdzIGZvciBlYWNoIHRva2VuLiBQcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIHRoZSB0b2tlbiBpcwotICogcXVvdGVkLgotICogQGRlcHJlY2F0ZWQgVGhpcyBjYWxzcyB3YXMgcmVwbGFjZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmxpbnV4LkFyZ3VtZW50UGFyc2VyfS4KLSAqLwotcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2VyIHsKLQlwcml2YXRlIFN0cmluZyBjbWRMaW5lOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IG51bGw7Ci0JCi0JLy8gUHJldmVudCBpbnN0YW5jZXMKLQkvL3B1YmxpYyBBcmd1bWVudFBhcnNlcihTdHJpbmcgY21kTGluZSkgewotCXByaXZhdGUgQXJndW1lbnRQYXJzZXIoU3RyaW5nIGNtZExpbmUpIHsKLQkJdGhpcy5jbWRMaW5lID0gY21kTGluZTsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBpbnRvIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBhcnJheSBjb250YWluaW5nIGluZGl2aWR1YWwgYXJndW1lbnRzCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBcmd1bWVudHMoKSB7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFyZ3VtZW50czsKLQkJfQotCQkKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJlYW1Ub2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmVhbVRva2VuaXplcihuZXcgU3RyaW5nUmVhZGVyKGNtZExpbmUpKTsKLQkJdG9rZW5zLnJlc2V0U3ludGF4KCk7Ci0JCXRva2Vucy53b3JkQ2hhcnMoJ2EnLCAneicpOwotCQl0b2tlbnMud29yZENoYXJzKCdBJywgJ1onKTsKLQkJdG9rZW5zLndvcmRDaGFycygnMCcsICc5Jyk7Ci0JCXRva2Vucy53b3JkQ2hhcnMoJysnLCAnLycpOwotCQl0b2tlbnMud29yZENoYXJzKCc6JywgJzonKTsKLQkJdG9rZW5zLndvcmRDaGFycygnPScsICc9Jyk7Ci0JCXRva2Vucy53b3JkQ2hhcnMoJ18nLCAnXycpOwotCQl0b2tlbnMud2hpdGVzcGFjZUNoYXJzKDAsICcgJyk7Ci0JCXRva2Vucy5xdW90ZUNoYXIoJyInKTsKLQkJdG9rZW5zLnF1b3RlQ2hhcignXCcnKTsKLQkJCi0JCXRyeSB7Ci0JCQl3aGlsZSAodG9rZW5zLm5leHRUb2tlbigpICE9IFN0cmVhbVRva2VuaXplci5UVF9FT0YpIHsKLQkJCQlyZXN1bHQuYWRkKHRva2Vucy5zdmFsKTsKLQkJCX0KLQkJCWFyZ3VtZW50cyA9IHJlc3VsdDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL1JhbmdlLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9SYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q4NDBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcmFuZ2Ugb2YgbnVtYmVycyBpbmNsdXNpdmUgb2YgbWF4IGFuZCBtaW4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2UgaW1wbGVtZW50cyBJdGVyYWJsZTxTdHJpbmc+IHsKLQlwcml2YXRlIEludGVnZXIgbWluOwotCXByaXZhdGUgSW50ZWdlciBtYXg7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGN1cnI7Ci0JCi0JcHVibGljIFJhbmdlKGludCB2YWwpIHsKLQkJdGhpcyh2YWwsIHZhbCk7Ci0JfQotCQotCXB1YmxpYyBSYW5nZShpbnQgbWluLCBpbnQgbWF4KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKG1pbiA+IG1heCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubWluID0gbWluOwotCQl0aGlzLm1heCA9IG1heDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNaW5WYWx1ZSgpIHsKLQkJcmV0dXJuIG1pbjsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRNYXhWYWx1ZSgpIHsKLQkJcmV0dXJuIG1heDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWluVmFsdWUoaW50IHZhbCkgewotCQltaW4gPSB2YWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1heFZhbHVlKGludCB2YWwpIHsKLQkJbWF4ID0gdmFsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpblJhbmdlKGludCB2YWwpIHsKLQkJcmV0dXJuIHZhbCA+PSBtaW4gJiYgdmFsIDw9IG1heDsKLQl9Ci0JCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbWF4IC0gbWluICsgMTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKG1pbiA9PSBtYXgpCi0JCQlyZXR1cm4gIiIgKyBtaW47Ci0JCQotCQlyZXR1cm4gbWluICsgIi0iICsgbWF4OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgewotCQljdXJyID0gbWluOwotCQkKLQkJcmV0dXJuIG5ldyBJdGVyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQlyZXR1cm4gY3VyciA8PSBtYXg7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKLQkJCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQkJCXJldHVybiAoY3VycisrKS50b1N0cmluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9SYW5nZVNldC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvUmFuZ2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2OWIwOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9SYW5nZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJhbmdlIG9mIG51bWJlcnMuIE5vdGU6IHJhbmdlcyBhcmUgQUxXQVlTIGRpc2pvaW50IGFuZAotICoga2VwdCBpbiBhIHNvcnRlZCBsaXN0LgotICoKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlU2V0IGltcGxlbWVudHMgSXRlcmFibGU8U3RyaW5nPiB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8UmFuZ2U+CXJhbmdlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmFuZ2U+KDApOwotCXByaXZhdGUgSXRlcmF0b3I8UmFuZ2U+CQlyYW5nZUxpc3RJdGVyOwotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPglyYW5nZUl0ZXI7Ci0JCi0JcHVibGljIFJhbmdlU2V0KCkgewotCQkKLQl9Ci0JCi0JcHVibGljIFJhbmdlU2V0KFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSByYW5nZXMgPSBzdHIuc3BsaXQoIiwiKTsKLQkJCWZvciAoU3RyaW5nIHJhbmdlIDogcmFuZ2VzKSB7Ci0JCQkJU3RyaW5nW10gdmFscyA9IHJhbmdlLnNwbGl0KCItIik7Ci0JCQkJaWYgKHZhbHMubGVuZ3RoID09IDEpIHsKLQkJCQkJYWRkKEludGVnZXIucGFyc2VJbnQodmFsc1swXSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZChJbnRlZ2VyLnBhcnNlSW50KHZhbHNbMF0pLCBJbnRlZ2VyLnBhcnNlSW50KHZhbHNbMV0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFJhbmdlU2V0KGludCB2YWwpIHsKLQkJdGhpcyh2YWwsIHZhbCk7Ci0JfQotCQotCXB1YmxpYyBSYW5nZVNldChpbnQgbWluLCBpbnQgbWF4KSB7Ci0JCXJhbmdlTGlzdC5hZGQobmV3IFJhbmdlKG1pbiwgbWF4KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChpbnQgdmFsKSB7Ci0JCWludCBwb3MgPSAwOwotCQkKLQkJaWYgKHJhbmdlTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlwb3MgPSBmaW5kSW5kZXgodmFsKTsKLQkJCQotCQkJaWYgKHBvcyA+PSAwKQotCQkJCXJldHVybjsKLQkJCQotCQkJcG9zID0gLShwb3MgKyAxKTsKLQkgICAgfQotCSAgICAKLSAgICAgICAgcmFuZ2VMaXN0LmFkZChwb3MsIG5ldyBSYW5nZSh2YWwpKTsgIAotICAgICAgICBmaXh1cFJhbmdlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoaW50IG1pbiwgaW50IG1heCkgewotCQlpZiAobWluID09IG1heCkgewotCQkJYWRkKG1pbik7Ci0JCQlyZXR1cm47Ci0JCX0gCi0JCQotCQlpZiAobWluID4gbWF4KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChyYW5nZUxpc3Quc2l6ZSgpID09IDApIHsKLQkJCXJhbmdlTGlzdC5hZGQobmV3IFJhbmdlKG1pbixtYXgpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkgICAgUmFuZ2UgcmxvdyA9IG51bGw7Ci0JICAgIFJhbmdlIHJoaWdoID0gbnVsbDsKLQkgICAgCi0JICAgIGludCBpbG93ID0gZmluZEluZGV4KG1pbik7Ci0JICAgIGludCBpaGlnaCA9IGZpbmRJbmRleChtYXgpOwotCSAgICAKLQkgICAgaWYgKGlsb3cgPj0gMCkgewotCSAgICAJLyoKLQkgICAgCSAqIFF1aWNrIGNoZWNrIHRvIHNlZSBpZiBzdWJzZXQKLQkgICAgCSAqLwotCSAgICAJaWYgKGlsb3cgPT0gaWhpZ2gpIHsKLQkgICAgCQlyZXR1cm47Ci0JICAgIAl9Ci0JICAgIAkKLQkgICAgCS8qCi0JICAgIAkgKiBtaW4gaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IGEgcmFuZ2UKLQkgICAgCSAqLwotCSAgICAJcmxvdyA9IHJhbmdlTGlzdC5nZXQoaWxvdyk7Ci0JICAgIAkKLQkgICAgCWlmIChpaGlnaCA+PSAwKSB7Ci0JICAgIAkJLyoKLQkgICAgCQkgKiBtYXggaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IGEgcmFuZ2UuCi0JICAgIAkJICogTmVlZCB0byBtZXJnZSByYW5nZXMuCi0JICAgIAkJICovCi0JICAgIAkJcmhpZ2ggPSByYW5nZUxpc3QuZ2V0KGloaWdoKTsKLQkgICAgCQlybG93LnNldE1heFZhbHVlKHJoaWdoLmdldE1heFZhbHVlKCkpOwotCSAgICAJfSBlbHNlIHsKLQkJICAgIAkvKgotCQkgICAgCSAqIG1heCBmYWxscyBvdXRzaWRlIGEgcmFuZ2UuCi0JCSAgICAJICogRXh0ZW5kIGN1cnJlbnQgcmFuZ2UuCi0JCSAgICAJICovCi0JICAgIAkJcmxvdy5zZXRNYXhWYWx1ZShtYXgpOwotCSAgICAJCWloaWdoID0gLShpaGlnaCsyKTsKLQkgICAgCX0KLQkgICAgCQotCSAgICAJLyoKLQkgICAgCSAqIFJlbW92ZSByYW5nZXMKLQkgICAgCSAqLwotICAgIAkJZm9yICg7IGloaWdoICE9IGlsb3c7IGloaWdoLS0pIHsKLSAgICAJCQlyYW5nZUxpc3QucmVtb3ZlKGlsb3crMSk7Ci0gICAgCQl9Ci0JICAgIH0gZWxzZSB7Ci0JICAgIAkvKgotCSAgICAJICogbWluIGZhbGxzIG91dHNpZGUgYSByYW5nZQotCSAgICAJICovCi0JICAgIAlpbG93ID0gLShpbG93ICsgMSk7Ci0JICAgIAkKLQkgICAgCWlmIChpaGlnaCA+PSAwKSB7Ci0JICAgIAkJLyoKLQkgICAgCQkgKiBtYXggZmFsbHMgaW5zaWRlIGEgcmFuZ2UKLQkgICAgCQkgKi8KLQkgICAgCQlyaGlnaCA9IHJhbmdlTGlzdC5nZXQoaWhpZ2gpOwotCSAgICAJCXJoaWdoLnNldE1pblZhbHVlKG1pbik7Ci0JICAgIAkJCi0JCSAgICAJLyoKLQkJICAgIAkgKiBSZW1vdmUgcmFuZ2VzCi0JCSAgICAJICovCi0JICAgIAkJZm9yICg7IGloaWdoICE9IGlsb3c7IGloaWdoLS0pIHsKLQkgICAgCQkJcmFuZ2VMaXN0LnJlbW92ZShpbG93KTsKLQkgICAgCQl9Ci0JICAgIAl9IGVsc2UgewotCSAgICAJCWloaWdoID0gLShpaGlnaCArIDEpOwotCSAgICAJCQotCSAgICAJCWlmIChpbG93ID09IGloaWdoKSB7Ci0JICAgIAkJCXJhbmdlTGlzdC5hZGQoaWxvdywgbmV3IFJhbmdlKG1pbiwgbWF4KSk7Ci0JICAgIAkJfSBlbHNlIHsKLQkgICAgCQkJcmxvdyA9IHJhbmdlTGlzdC5nZXQoaWxvdyk7Ci0JICAgIAkJCXJsb3cuc2V0TWluVmFsdWUobWluKTsKLQkgICAgCQkJcmxvdy5zZXRNYXhWYWx1ZShtYXgpOwotCSAgICAJCQkKLQkJCSAgICAJLyoKLQkJCSAgICAJICogUmVtb3ZlIHJhbmdlcwotCQkJICAgIAkgKi8KLQkJICAgIAkJZm9yICg7IGloaWdoID4gaWxvdyArIDE7IGloaWdoLS0pIHsKLQkJICAgIAkJCXJhbmdlTGlzdC5yZW1vdmUoaWxvdysxKTsKLQkJICAgIAkJfQotCSAgICAJCX0KLQkgICAgCX0KLQkgICAgfQotCSAgICAKLQkgICAgZml4dXBSYW5nZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpeHVwUmFuZ2VzKCkgewotCSAgICBmb3IgKGludCBwb3MgPSByYW5nZUxpc3Quc2l6ZSgpIC0gMjsgcG9zID49IDA7IHBvcy0tKSB7Ci0JICAgIAlSYW5nZSByMSA9IHJhbmdlTGlzdC5nZXQocG9zKTsKLQkgICAgCVJhbmdlIHIyID0gcmFuZ2VMaXN0LmdldChwb3MgKyAxKTsKLQkgICAgCWlmIChyMS5nZXRNYXhWYWx1ZSgpID49IHIyLmdldE1pblZhbHVlKCkgLSAxKSB7Ci0JICAgIAkJcjEuc2V0TWF4VmFsdWUocjIuZ2V0TWF4VmFsdWUoKSk7Ci0JICAgIAkJcmFuZ2VMaXN0LnJlbW92ZShwb3MgKyAxKTsKLQkgICAgCX0KLQkgICAgfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHZhbCkgewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBtaW4sIGludCBtYXgpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGluUmFuZ2UoaW50IHZhbCkgewotCQlyZXR1cm4gZmluZEluZGV4KHZhbCkgPj0gMDsKLQl9Ci0JCi0JcHVibGljIGludCBzaXplKCkgewotCQlpbnQgbmVscyA9IDA7Ci0JCQotCQlmb3IgKFJhbmdlIHIgOiByYW5nZUxpc3QpIHsKLQkJCW5lbHMgKz0gci5zaXplKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBuZWxzOwotCX0KLQkKLQlwdWJsaWMgaW50W10gdG9BcnJheSgpIHsKLQkJaW50IGVsdCA9IDA7Ci0JCWludFtdIHZhbHMgPSBuZXcgaW50W3NpemUoKV07Ci0JCQotCQlmb3IgKFJhbmdlIHIgOiByYW5nZUxpc3QpIHsKLQkJCWZvciAoaW50IGkgPSByLmdldE1pblZhbHVlKCk7IGkgPD0gci5nZXRNYXhWYWx1ZSgpOyBpKyspIHsKLQkJCQl2YWxzW2VsdCsrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2YWxzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgc3RyID0gIiI7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlTGlzdC5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCXN0ciArPSAiLCI7Ci0JCQlzdHIgKz0gcmFuZ2VMaXN0LmdldChpKS50b1N0cmluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQlwdWJsaWMgaW50IGZpbmRJbmRleChpbnQgdmFsKSB7Ci0JICAgIGludCBsb3cgPSAwOwotCSAgICBpbnQgaGlnaCA9IHJhbmdlTGlzdC5zaXplKCkgLSAxOwotCSAgICAKLQkgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7Ci0JICAgICAgICBpbnQgcG9zID0gKGxvdyA9PSBoaWdoKSA/IGxvdyA6ICgobG93ICsgaGlnaCkgLyAyKTsKLQkgICAgICAgIFJhbmdlIHIgPSByYW5nZUxpc3QuZ2V0KHBvcyk7Ci0KLQkgICAgICAgIGlmIChyLmluUmFuZ2UodmFsKSkgewotCSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0JICAgICAgICB9IGVsc2UgaWYgKHZhbCA8IHIuZ2V0TWluVmFsdWUoKSkgewotCSAgICAgICAgICAgIGhpZ2ggPSBwb3MgLSAxOwotCSAgICAgICAgfSBlbHNlIGlmICh2YWwgPiByLmdldE1heFZhbHVlKCkpIHsKLQkgICAgICAgICAgICBsb3cgPSBwb3MgKyAxOwotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gLShsb3crMSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IoKSB7Ci0JCXJhbmdlTGlzdEl0ZXIgPSByYW5nZUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCWlmIChyYW5nZUxpc3RJdGVyLmhhc05leHQoKSkKLQkJCXJhbmdlSXRlciA9IHJhbmdlTGlzdEl0ZXIubmV4dCgpLml0ZXJhdG9yKCk7Ci0JCWVsc2UKLQkJCXJhbmdlSXRlciA9IG51bGw7Ci0JCQotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCXJldHVybiByYW5nZUl0ZXIgIT0gbnVsbCAmJiAocmFuZ2VJdGVyLmhhc05leHQoKSB8fCByYW5nZUxpc3RJdGVyLmhhc05leHQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKLQkJCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQkJCWlmICghcmFuZ2VJdGVyLmhhc05leHQoKSkgewotCQkJCQkJcmFuZ2VJdGVyID0gcmFuZ2VMaXN0SXRlci5uZXh0KCkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmFuZ2VJdGVyLm5leHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLX0KLQkKLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvZXh0ZW5zaW9ucG9pbnRzL0V4dGVuc2lvblBvaW50RW51bWVyYXRpb24uamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2V4dGVuc2lvbnBvaW50cy9FeHRlbnNpb25Qb2ludEVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGU2ZTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvZXh0ZW5zaW9ucG9pbnRzL0V4dGVuc2lvblBvaW50RW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuZXh0ZW5zaW9ucG9pbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uUG9pbnRFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCUlFeHRlbnNpb25bXSBleHRlbnNpb25zOwotCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzOwotCQotCUlDb25maWd1cmF0aW9uRWxlbWVudCBjdXJyZW50Q29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgbmV4dENvbmZpZ3VyYXRpb25JbmRleDsKLQlwcml2YXRlIGludCBuZXh0RXh0ZW5zaW9uSW5kZXg7Ci0JCi0JcHVibGljIEV4dGVuc2lvblBvaW50RW51bWVyYXRpb24oU3RyaW5nIGV4dGVuc2lvblBvaW50SWQpIHsKLQkJdGhpcy5uZXh0RXh0ZW5zaW9uSW5kZXggPSAwOwotCQl0aGlzLm5leHRDb25maWd1cmF0aW9uSW5kZXggPSAwOwotCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCXRoaXMuY3VycmVudENvbmZpZ3VyYXRpb25FbGVtZW50ID0gZ2V0TmV4dENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldE5leHRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJd2hpbGUgKG5leHRFeHRlbnNpb25JbmRleCA8IGV4dGVuc2lvbnMubGVuZ3RoKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbbmV4dEV4dGVuc2lvbkluZGV4XTsKLQkJCWlmIChuZXh0Q29uZmlndXJhdGlvbkluZGV4ID09IDApIHsKLQkJCQllbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCX0KLQkJCWlmIChuZXh0Q29uZmlndXJhdGlvbkluZGV4ID49IGVsZW1lbnRzLmxlbmd0aCkgewotCQkJCW5leHRDb25maWd1cmF0aW9uSW5kZXggPSAwOwotCQkJCW5leHRFeHRlbnNpb25JbmRleCsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHNlbGVjdGVkQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBlbGVtZW50c1tuZXh0Q29uZmlndXJhdGlvbkluZGV4XTsKLQkJCW5leHRDb25maWd1cmF0aW9uSW5kZXgrKzsKLQkJCXJldHVybiBzZWxlY3RlZENvbmZpZ3VyYXRpb25FbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIGN1cnJlbnRDb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gY3VycmVudENvbmZpZ3VyYXRpb25FbGVtZW50OwotCQljdXJyZW50Q29uZmlndXJhdGlvbkVsZW1lbnQgPSBnZXROZXh0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2V4dGVuc2lvbnBvaW50cy9JUHJvY2Vzc01lbWJlclZpc2l0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2V4dGVuc2lvbnBvaW50cy9JUHJvY2Vzc01lbWJlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwOTA2Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9leHRlbnNpb25wb2ludHMvSVByb2Nlc3NNZW1iZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmV4dGVuc2lvbnBvaW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc01lbWJlclZpc2l0b3IgewotCi0JcHVibGljIE9iamVjdCBwcm9jZXNzKElFeHRlbnNpb24gZXh0ZW5zaW9uLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVtYmVyKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2V4dGVuc2lvbnBvaW50cy9Qcm9jZXNzRXh0ZW5zaW9ucy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvZXh0ZW5zaW9ucG9pbnRzL1Byb2Nlc3NFeHRlbnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTE1YTQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvZXh0ZW5zaW9ucG9pbnRzL1Byb2Nlc3NFeHRlbnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmV4dGVuc2lvbnBvaW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0V4dGVuc2lvbnMgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzKFN0cmluZyB4cGlkLCBJUHJvY2Vzc01lbWJlclZpc2l0b3IgcHJvY2Vzc29yKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KHhwaWQpOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2pdOwotCQkJCXByb2Nlc3Nvci5wcm9jZXNzKGV4dGVuc2lvbiwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9maWxlL0ZpbGVFbnVtZXJhdGlvbi5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL2NvcmUvZmlsZS9GaWxlRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkZDgyMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9maWxlL0ZpbGVFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgRmlsZUVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotCi0JRmlsZVtdIGZpbGVzOwotCWludCBjdXJyZW50RmlsZTsKLQkKLQlwdWJsaWMgRmlsZUVudW1lcmF0aW9uKEZpbGUgcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCEgcm9vdC5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKHJvb3QuaXNGaWxlKCkpIHsKLQkJCWZpbGVzID0gbmV3IEZpbGVbMV07Ci0JCQlmaWxlc1swXSA9IHJvb3Q7Ci0JCX0gZWxzZSBpZiAocm9vdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZCgiQ2Fubm90IGxpc3QgZGlyZWN0b3J5IHswfSIsIHJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQl9Ci0JCWN1cnJlbnRGaWxlID0gMDsKLQl9Ci0JCi0JRmlsZUVudW1lcmF0aW9uKFN0cmluZyByb290KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzKG5ldyBGaWxlKHJvb3QpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gY3VycmVudEZpbGUgPCBmaWxlcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJaWYgKGN1cnJlbnRGaWxlIDwgZmlsZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmlsZXNbY3VycmVudEZpbGUrK107Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRmlsZUVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudW1lcmF0aW9uID0gbmV3IEZpbGVFbnVtZXJhdGlvbigiYzovY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0gCi0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2ZpbGUvRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9maWxlL0ZpbGVSZWN1cnNpdmVFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTVhMjZjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2ZpbGUvRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0KLQlTdGFjayByb290czsKLQlGaWxlRW51bWVyYXRpb24gY3VycmVudERpcmVjdG9yeTsKLQlGaWxlIG5leHRGaWxlOwotCUxpbmtlZExpc3QgZXhjZXB0aW9uTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQlwdWJsaWMgRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uKFN0cmluZyByb290KSB7Ci0JCXRoaXMobmV3IEZpbGUocm9vdCkpOwotCX0KLQkKLQlwdWJsaWMgRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uKEZpbGUgcm9vdCkgewotCQlpZiAoISByb290LmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcm9vdHMgPSBuZXcgU3RhY2soKTsKLQkJcm9vdHMuYWRkKHJvb3QpOwotCQlmZXRjaE5leHRGaWxlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmZXRjaE5leHRGaWxlKCkgewotCQluZXh0RmlsZSA9IG51bGw7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoY3VycmVudERpcmVjdG9yeSA9PSBudWxsKSB7Ci0JCQkJaWYgKHJvb3RzLmVtcHR5KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlGaWxlIHJvb3QgPSAoRmlsZSlyb290cy5wb3AoKTsKLQkJCQl0cnkgewotCQkJCQljdXJyZW50RGlyZWN0b3J5ID0gbmV3IEZpbGVFbnVtZXJhdGlvbihyb290KTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Y2VwdGlvbkxpc3QuYWRkTGFzdChlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJyZW50RGlyZWN0b3J5Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCW5leHRGaWxlID0gKEZpbGUpY3VycmVudERpcmVjdG9yeS5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAobmV4dEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJcm9vdHMuYWRkKG5leHRGaWxlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudERpcmVjdG9yeSA9IG51bGw7Ci0JCQkJfQotCQkJfQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uTGlzdC5zaXplKCkgPiAwOwotCX0KLQkKLQlwdWJsaWMgRXhjZXB0aW9uIG5leHRFeGNlcHRpb24oKSB7Ci0JCWlmIChleGNlcHRpb25MaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiAoRXhjZXB0aW9uKSBleGNlcHRpb25MaXN0LnJlbW92ZUZpcnN0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5leHRGaWxlICE9IG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJRmlsZSByZXN1bHQgPSBuZXh0RmlsZTsKLQkJZmV0Y2hOZXh0RmlsZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBuZXcgRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uKCJjOi9jb21tYW5kL2dzIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2xpbnV4L0FyZ3VtZW50UGFyc2VyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvY29yZS9saW51eC9Bcmd1bWVudFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIxMzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy9jb3JlL2xpbnV4L0FyZ3VtZW50UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5saW51eDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQXJndW1lbnRQYXJzZXIgewotCUxpc3Q8U3RyaW5nPiB0b2tlbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgc3RyaW5nIHdpdGggYSBzaGVsbCBjb21tYW5kIGxpbmUuCi0JICogVGhlIGNvbW1hbmQgbGluZSBpcyBwYXJzZWQgYW5kIHNwbGl0IG9uIHNwYWNlcy4gUXVvdGVkIG9yIGVzY2FwZWQgc3BhY2VzIGFyZSBwcmVzZXJ2ZWQuLgotCSAqLwotCXB1YmxpYyBBcmd1bWVudFBhcnNlcihTdHJpbmcgY29tbWFuZGxpbmUpIHsKLQkJdGhpcy50b2tlbnMgPSBwYXJzZUNvbW1hbmRsaW5lKGNvbW1hbmRsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLgotCSAqIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBjb21tYW5kLCB0aGUgcmVtYWluaW5nLCB0aGUgYXJndW1lbnRzLgotCSAqIFRoZSBlbGVtZW50cyBhcmUgbm90IHBhcnNlZCBub3QgKHVuKWVzY2FwZWQuLCBidXQgdGFrZWQgYXMgdGhlIGFyZS4KLQkgKi8KLQlwdWJsaWMgQXJndW1lbnRQYXJzZXIoU3RyaW5nIHRva2VuQXJyYXlbXSkgewotCQl0aGlzKEFycmF5cy5hc0xpc3QodG9rZW5BcnJheSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLgotCSAqIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGNvbW1hbmQsIHRoZSByZW1haW5pbmcsIHRoZSBhcmd1bWVudHMuCi0JICogVGhlIGVsZW1lbnRzIGFyZSBub3QgcGFyc2VkIG5vdCAodW4pZXNjYXBlZC4sIGJ1dCB0YWtlZCBhcyB0aGUgYXJlLgotCSAqLwotCXB1YmxpYyBBcmd1bWVudFBhcnNlcihMaXN0IHRva2VuTGlzdCkgewotCQl0aGlzLnRva2VucyA9IG5ldyBBcnJheUxpc3QodG9rZW5MaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgY29tbWFuZCBsaW5lIHJlcHJlc2VudGF0aW9uIGZyb20gdGhlIGNvbW1hbmQgYW5kIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuCi0JICogVGhlIGVsZW1lbnRzIGFyZSBub3QgcGFyc2VkIG5vdCAodW4pZXNjYXBlZC4sIGJ1dCB0YWtlZCBhcyB0aGUgYXJlLgotCSAqLwotCXB1YmxpYyBBcmd1bWVudFBhcnNlcihTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtZXRlckFycmF5W10pIHsKLQkJdGhpcyhjb21tYW5kLCBBcnJheXMuYXNMaXN0KHBhcmFtZXRlckFycmF5KSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGNvbW1hbmQgbGluZSByZXByZXNlbnRhdGlvbiBmcm9tIHRoZSBjb21tYW5kIGFuZCBhbiBsaXN0IG9mIHBhcmFtZXRlcnMuCi0JICogVGhlIGVsZW1lbnRzIGFyZSBub3QgcGFyc2VkIG5vdCAodW4pZXNjYXBlZC4sIGJ1dCB0YWtlZCBhcyB0aGUgYXJlLgotCSAqLwotCXB1YmxpYyBBcmd1bWVudFBhcnNlcihTdHJpbmcgY29tbWFuZCwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QpIHsKLQkJdGhpcy50b2tlbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy50b2tlbnMuYWRkKGNvbW1hbmQpOwotCQl0aGlzLnRva2Vucy5hZGRBbGwocGFyYW1ldGVyTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHBhcnNlQ29tbWFuZGxpbmUoU3RyaW5nIGNvbW1hbmRsaW5lKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihjb21tYW5kbGluZSk7Ci0JICAgIAotCQlmb3IgKGl0ZXJhdG9yLmZpcnN0KCk7IGl0ZXJhdG9yLmN1cnJlbnQoKSAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FOyBpdGVyYXRvci5uZXh0KCkpIHsKLQotCQkJLy8gUmVzdGFydCB0byBza2lwIHdoaXRlIHNwYWNlCi0JICAgIAlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShpdGVyYXRvci5jdXJyZW50KCkpKSB7Ci0JICAgIAkJY29udGludWU7Ci0JICAgIAl9Ci0JICAgIAkKLQkgICAgCS8vIFJlYWQgdG9rZW4KLQkgICAgCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgIAl0b2tlbl9yZWFkZXI6IGZvciAoOyBpdGVyYXRvci5jdXJyZW50KCkgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsgaXRlcmF0b3IubmV4dCgpKSB7Ci0JICAgIAkJY2hhciB0b2tlbkNoYXIgPSBpdGVyYXRvci5jdXJyZW50KCk7Ci0JCSAgICAJCi0JICAgIAkJLy8gQSB3aGl0ZSBzcGFjZSB0ZXJtaW5hdGVzIHRoZSB0b2tlbgotCSAgICAJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRva2VuQ2hhcikpIHsKLQkJICAgIAkJYnJlYWsgdG9rZW5fcmVhZGVyOwotCQkgICAgCX0KLQkJICAgIAkKLQkgICAgCQkvLyBIYW5kbGUgY2hhcmFjdGVyIHRoYXQgY29tcG9zZXMgdGhlIHRva2VuCi0JICAgIAkJc3dpdGNoICh0b2tlbkNoYXIpIHsKLQkgICAgCQljYXNlICciJzoKLQkgICAgCQl7Ci0JICAgIAkJCS8qCi0JICAgIAkJCSAqIFJlYWQgYWxsIHRleHQgd2l0aGluIGRvdWJsZSBxdW90ZXMgb3IgdW50aWwgZW5kIG9mIHN0cmluZy4gQWxsb3dzIGVzY2FwaW5nLgotCSAgICAJCQkgKi8KLQkgICAgCQkJaXRlcmF0b3IubmV4dCgpOyAvLyBTa2lwIHF1b3RlCi0JICAgIAkJCXF1b3RlZF9yZWFkZXI6IHdoaWxlICgoaXRlcmF0b3IuY3VycmVudCgpICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUpICYmIChpdGVyYXRvci5jdXJyZW50KCkgIT0gJyInKSkgewotCSAgICAJCQkJY2hhciBpbm5lckNoYXIgPSBpdGVyYXRvci5jdXJyZW50KCk7Ci0JICAgIAkJCQlzd2l0Y2ggKGlubmVyQ2hhcikgewotCSAgICAJCQkJY2FzZSAnXFwnOgotCSAgICAJCQkJCWNoYXIgbmV4dENoYXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JICAgIAkJCQkJc3dpdGNoIChuZXh0Q2hhcikgewotCSAgICAJCQkJCWNhc2UgQ2hhcmFjdGVySXRlcmF0b3IuRE9ORToKLQkgICAgCQkJCQkJYnJlYWsgcXVvdGVkX3JlYWRlcjsKLQkgICAgCQkJCQljYXNlICciJzoKLQkgICAgCQkJCQkJLy8gQWRkIHRoZSBjaGFyYWN0ZXIsIGJ1dCByZW1vdmUgdGhlIGVzY2FwZQotCSAgICAJCQkJCQlidWZmZXIuYXBwZW5kKG5leHRDaGFyKTsKLQkgICAgCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCSAgICAJCQkJCQljb250aW51ZSBxdW90ZWRfcmVhZGVyOwotCSAgICAJCQkJCWRlZmF1bHQ6Ci0JICAgIAkJCQkJCS8vIEFkZCB0aGUgY2hhcmFjdGVyIGFuZCBrZWVwIGVzY2FwZQotCSAgICAJCQkJCQlidWZmZXIuYXBwZW5kKGlubmVyQ2hhcik7Ci0JICAgIAkJCQkJCWJ1ZmZlci5hcHBlbmQobmV4dENoYXIpOwotCSAgICAJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JICAgIAkJCQkJCWNvbnRpbnVlIHF1b3RlZF9yZWFkZXI7Ci0JICAgIAkJCQkJfQotCSAgICAJCQkJZGVmYXVsdDoKLQkgICAgCQkJCQlidWZmZXIuYXBwZW5kKGlubmVyQ2hhcik7Ci0JICAgIAkJCQkJaXRlcmF0b3IubmV4dCgpOwotCSAgICAJCQkJCWNvbnRpbnVlIHF1b3RlZF9yZWFkZXI7Ci0JICAgIAkJCQl9Ci0JICAgIAkJCX0KLQkgICAgCQkJY29udGludWUgdG9rZW5fcmVhZGVyOwotCSAgICAJCX0KLQkgICAgCQljYXNlICdcJyc6Ci0JICAgIAkJewotCSAgICAJCQkvKgotCSAgICAJCQkgKiBSZWFkIGFsbCB0ZXh0IHdpdGhpbiBzaW5nbGUgcXVvdGVzIG9yIHVudGlsIGVuZCBvZiBzdHJpbmcuIE5vIGVzY2FwaW5nLgotCSAgICAJCQkgKi8KLQkgICAgCQkJaXRlcmF0b3IubmV4dCgpOyAvLyBTa2lwIHRoZSBxdW90ZQotCSAgICAJCQl3aGlsZSAoKGl0ZXJhdG9yLmN1cnJlbnQoKSAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FKSAmJiAoaXRlcmF0b3IuY3VycmVudCgpICE9ICdcJycpKSB7Ci0JICAgIAkJCQlidWZmZXIuYXBwZW5kKGl0ZXJhdG9yLmN1cnJlbnQoKSk7Ci0JICAgIAkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JICAgIAkJCX0KLQkgICAgCQkJY29udGludWUgdG9rZW5fcmVhZGVyOwotCSAgICAJCX0KLQkgICAgCQljYXNlICdcXCc6Ci0JICAgIAkJewotCSAgICAJCQkvKgotCSAgICAJCQkgKiBSZWFkIGVzY2FwZWQgY2hhci4KLQkgICAgCQkJICovCi0JICAgIAkJCWNoYXIgbmV4dENoYXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JICAgIAkJCXN3aXRjaCAobmV4dENoYXIpIHsKLQkgICAgCQkJY2FzZSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FOgotCSAgICAJCQkJYnJlYWsgdG9rZW5fcmVhZGVyOwotCSAgICAJCQljYXNlICdcbic6Ci0JICAgIAkJCQkvLyBJZ25vcmUgbmV3bGluZS4gQm90aCBsaW5lcyBhcmUgY29uY2F0ZW5hdGVkLgotCSAgICAJCQkJY29udGludWUgdG9rZW5fcmVhZGVyOwotCSAgICAJCQlkZWZhdWx0OgotCSAgICAJCQkJLy8gQWRkIHRoZSBjaGFyYWN0ZXIsIGJ1dCByZW1vdmUgdGhlIGVzY2FwZQotCSAgICAJCQkJYnVmZmVyLmFwcGVuZChuZXh0Q2hhcik7Ci0JICAgIAkJCQljb250aW51ZSB0b2tlbl9yZWFkZXI7Ci0JICAgIAkJCX0KLQkgICAgCQl9Ci0JICAgIAkJZGVmYXVsdDoKLQkgICAgCQkJLyoKLQkgICAgCQkJICogQW55IG90aGVyIGNoYXIsIGFkZCB0byB0aGUgYnVmZmVyLgotCSAgICAJCQkgKi8KLQkgICAgCQkJYnVmZmVyLmFwcGVuZCh0b2tlbkNoYXIpOwotCSAgICAJCQljb250aW51ZSB0b2tlbl9yZWFkZXI7Ci0JICAgIAkJfQotCSAgICAJfQotCSAgICAJcmVzdWx0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7IAkKLQkgICAgfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhbGwgdG9rZW5zIGluIGEgZnVsbCBjb21tYW5kIGxpbmUgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgaW4gYSBzaGVsbC4KLQkgKiBAcGFyYW0gZnVsbEVzY2FwZSBJZiBldmVyeSBzcGVjaWFsIGNoYXJhY3RlciBzaGFsbCBiZSBlc2NhcGVkLiBJZiBmYWxzZSwgb25seSB3aGl0ZSBzcGFjZXMKLQkgKiBhcmUgZXNjYXBlZCBhbmQgdGhlIHNoZWxsIHdpbGwgaW50ZXJwcmV0IHRoZSBzcGVjaWFsIGNoYXJzLiBJZiB0cnVlLCB0aGVuIGFsbCBzcGVjaWFsIGNoYXJzIGFyZQotCSAqIHF1b3RlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tYW5kTGluZShib29sZWFuIGZ1bGxFc2NhcGUpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMudG9rZW5zLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoISBmaXJzdCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZXNjYXBlVG9rZW4odG9rZW4sIGZ1bGxFc2NhcGUpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGVzY2FwZVRva2VuKFN0cmluZyB0b2tlbiwgYm9vbGVhbiBmdWxsRXNjYXBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGl0ZXIgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IodG9rZW4pOwotCSAgICBmb3IoY2hhciBjID0gaXRlci5maXJzdCgpOyBjICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkU7IGMgPSBpdGVyLm5leHQoKSkgewotCSAgICAJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkgICAgCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCSAgICAJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JICAgIAkJY29udGludWU7Ci0JICAgIAl9Ci0JICAgIAlzd2l0Y2ggKGMpIHsKLQkgICAgCWNhc2UgJygnOgotCSAgICAJY2FzZSAnKSc6Ci0JICAgIAljYXNlICdbJzoKLQkgICAgCWNhc2UgJ10nOgotCSAgICAJY2FzZSAneyc6Ci0JICAgIAljYXNlICd9JzoKLQkgICAgCWNhc2UgJ3wnOgotCSAgICAJY2FzZSAnXFwnOgotCSAgICAJY2FzZSAnKic6Ci0JICAgIAljYXNlICcmJzoKLQkgICAgCWNhc2UgJ14nOgotCSAgICAJY2FzZSAnJSc6Ci0JICAgIAljYXNlICckJzoKLQkgICAgCWNhc2UgJyMnOgotCSAgICAJY2FzZSAnQCc6Ci0JICAgIAljYXNlICchJzoKLQkgICAgCWNhc2UgJ34nOgotCSAgICAJY2FzZSAnYCc6Ci0JICAgIAljYXNlICdcJyc6Ci0JICAgIAljYXNlICciJzoKLQkgICAgCWNhc2UgJzonOgotCSAgICAJY2FzZSAnOyc6Ci0JICAgIAljYXNlICc/JzoKLQkgICAgCWNhc2UgJz4nOgotCSAgICAJY2FzZSAnPCc6Ci0JICAgIAljYXNlICdcbic6Ci0JICAgIAkJaWYgKGZ1bGxFc2NhcGUpIHsKLQkgICAgCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkgICAgCQl9Ci0JCSAgICAJYnVmZmVyLmFwcGVuZChjKTsKLQkgICAgCQljb250aW51ZTsKLQkgICAgCWNhc2UgJyAnOgotICAgIAkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCSAgICAJYnVmZmVyLmFwcGVuZChjKTsKLQkgICAgCQljb250aW51ZTsgICAgCQkJCi0JICAgIAlkZWZhdWx0OgotCQkgICAgCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JICAgIAkJY29udGludWU7Ci0JICAgIAl9Ci0JICAgICB9Ci0JICAgIHJldHVybiBidWZmZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVudHJpZXMgb2YgdGhlIGNvbW1hbmQgbGluZS4KLQkgKiBAcmV0dXJuIFRoZSBBcnJheQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRUb2tlbkFycmF5KCkgewotCQlyZXR1cm4gKFN0cmluZ1tdKSB0aGlzLnRva2Vucy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy50b2tlbnMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBMaXN0IG9mIGFsbCBlbnRyaWVzIG9mIHRoZSBjb21tYW5kIGxpbmUuCi0JICogQHJldHVybiBUaGUgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VG9rZW5MaXN0KCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCh0aGlzLnRva2Vucyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYXNzdW1pbmcgdGhhdCB0aGUgZmlyc3QgZW50cnkgaXMgYWx3YXlzIHRoZSBjb21tYW5kLgotCSAqIEByZXR1cm4gVGhlIGNvbW1hbmQgb3IgbnVsbCBpZiB0aGUgY29tbWFuZCBsaW5lcyBoYXMgbm8gY29tbWFuZCBub3IgYXJndW1lbnRzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7Ci0JCWlmICh0aGlzLnRva2Vucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMudG9rZW5zLmdldCgwKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhc3N1bWluZyB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpcyBhbHdheXMgdGhlIGNvbW1hbmQuCi0JICogQHJldHVybiBUaGUgY29tbWFuZCBvciBudWxsIGlmIHRoZSBjb21tYW5kIGxpbmVzIGhhcyBubyBjb21tYW5kIG5vciBhcmd1bWVudHMuCi0JICogQHBhcmFtIGZ1bGxFc2NhcGUgSWYgZXZlcnkgc3BlY2lhbCBjaGFyYWN0ZXIgc2hhbGwgYmUgZXNjYXBlZC4gSWYgZmFsc2UsIG9ubHkgd2hpdGUgc3BhY2VzCi0JICogYXJlIGVzY2FwZWQgYW5kIHRoZSBzaGVsbCB3aWxsIGludGVycHJldCB0aGUgc3BlY2lhbCBjaGFycy4gSWYgdHJ1ZSwgdGhlbiBhbGwgc3BlY2lhbCBjaGFycyBhcmUKLQkgKiBxdW90ZWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZENvbW1hbmQoYm9vbGVhbiBmdWxsRXNjYWxwZSkgewotCQlpZiAodGhpcy50b2tlbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBlc2NhcGVUb2tlbigoU3RyaW5nKSB0aGlzLnRva2Vucy5nZXQoMCksIGZ1bGxFc2NhbHBlKS50b1N0cmluZygpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBhcmd1bWVudHMsIGFzc3VtaW5nIHRoYXQgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0JICogQHJldHVybiBUaGUgQXJyYXkgb3IgbnVsbCBpZiB0aGUgY29tbWFuZCBsaW5lcyBoYXMgbm8gY29tbWFuZCBub3IgYXJndW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJBcnJheSgpIHsKLQkJaWYgKHRoaXMudG9rZW5zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSB0aGlzLnRva2Vucy5zdWJMaXN0KDEsIHRoaXMudG9rZW5zLnNpemUoKSkudG9BcnJheShuZXcgU3RyaW5nW3RoaXMudG9rZW5zLnNpemUoKS0xXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBhcmd1bWVudHMsIGFzc3VtaW5nIHRoYXQgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0JICogQHJldHVybiBUaGUgTGlzdCBvciBudWxsIGlmIHRoZSBjb21tYW5kIGxpbmVzIGhhcyBubyBjb21tYW5kIG5vciBhcmd1bWVudHMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFyYW1ldGVyTGlzdCgpIHsKLQkJaWYgKHRoaXMudG9rZW5zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCh0aGlzLnRva2Vucy5zdWJMaXN0KDEsIHRoaXMudG9rZW5zLnNpemUoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy50b2tlbnMuc2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBmb3IgZGVidWcgcHVycG9zZXMuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiPCIpOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy50b2tlbnMuaXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghIGZpcnN0KSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQodG9rZW4pOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJQXJndW1lbnRQYXJzZXIgcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb29iYXIiLCBuZXcgU3RyaW5nW10geyJhcmcxIiwgImFyZzIiLCAiYXJnXFwzIiwgImFyZ1wiNCIsICJhcmcnNSIsICJtb3JlIGFyZ3VtZW50cyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyLmdldENvbW1hbmRMaW5lKGZhbHNlKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIuZ2V0Q29tbWFuZExpbmUodHJ1ZSkpOwotCQkKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCIgZm9vIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vICIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vICBhIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoIiBmb28gYSIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoIiBmb28gYSAiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCIgZm9vICAgYSAiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28JYSIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhCSIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbwlhCSIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgYiAiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBiIGMgIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvb1xcIGEgYiIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBcXGFiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGFcXCBiXFwgYyAiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJcXGZvbyBhIGIgYyAiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBiIGNcXCIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIFxcYiBjIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhXFwnYyBiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGFcXFwiYyBiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgXFwnYyBiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgXFxcImMgYiIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhXFwnIGMgYiIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhXFxcIiBjIGIiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBcXCcgYyBiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgXFxcIiBjIGIiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBjIGJcXCciKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBjIGJcXFwiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgYyBiIFxcJyIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIGMgYiBcXFwiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiXFwnZm9vIGEgYyBiIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiXFxcImZvbyBhIGMgYiIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoIlxcJyBmb28gYSBjIGIiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJcXFwiIGZvbyBhIGMgYiIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsgLy8kTk9OLU5MUy0xJAkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoIidmb28gYScgYiBjIGQiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CQkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIGIgJ2MgZCciKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CQkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhICdiIGMnIGQiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CQkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhICdiXFxlJyBkIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOwkJIC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSBcImJcXGVcIiBkIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOwkJIC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKCJmb28gYSAnYiBjIGQiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CQkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIFwiYiBjIGQiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CQkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIFwiYiBjXCIgZCIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsJCSAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgXCJiIGNcImQiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CSAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgJ2IgYycgZCIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsJCSAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgJ2IgYydkIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOwkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhICdiIFwiIGMnIGQiKTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlcik7CQkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhIFwiYiAnIGNcIiBkIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOwkgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoImZvbyBhICdiIFxcXCIgYycgZCIpOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyKTsJCSAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcigiZm9vIGEgXCJiIFwnIGNcIiBkIik7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIpOwkgLy8kTk9OLU5MUy0xJAkJCi0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIobmV3IFN0cmluZ1tdIHt9KTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlci5nZXRDb21tYW5kTGluZSh0cnVlKSk7Ci0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihuZXcgU3RyaW5nW10geyJhIn0pOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyLmdldENvbW1hbmRMaW5lKHRydWUpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIobmV3IFN0cmluZ1tdIHsiYXYifSk7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIuZ2V0Q29tbWFuZExpbmUodHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihuZXcgU3RyaW5nW10geyJhIGQifSk7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIuZ2V0Q29tbWFuZExpbmUodHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihuZXcgU3RyaW5nW10geyJhIiwgImEifSk7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIuZ2V0Q29tbWFuZExpbmUodHJ1ZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKG5ldyBTdHJpbmdbXSB7ImF2IiwgImEifSk7IFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIuZ2V0Q29tbWFuZExpbmUodHJ1ZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKG5ldyBTdHJpbmdbXSB7ImEgZCIsICJhIn0pOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyLmdldENvbW1hbmRMaW5lKHRydWUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihuZXcgU3RyaW5nW10geyJhIiwgImIgYiJ9KTsgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlci5nZXRDb21tYW5kTGluZSh0cnVlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIobmV3IFN0cmluZ1tdIHsiYXYiLCAiYiBiIn0pOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyLmdldENvbW1hbmRMaW5lKHRydWUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihuZXcgU3RyaW5nW10geyJhIGQiLCAiYiBiIn0pOyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VyLmdldENvbW1hbmRMaW5lKHRydWUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS8uY2xhc3NwYXRoIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLy5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmUxYTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAudXRpbHMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5ZmU5MC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUaHUgU2VwIDA0IDE1OjIxOjEwIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzE4ZTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuQWN0aXZhdG9yCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLAotIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9hYm91dC5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3YWJhMS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0MzgwYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgVUkgVXRpbGl0aWVzCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9BY3RpdmF0b3IuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTkxOGYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWVjOTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBJbWFnSW1hZ2VEZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZUltYWdlRGVzY3JpcHRvcihJbWFnZSBpbWFnZSkgewotCQlzdXBlcigpOwotCQlmSW1hZ2U9IGltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAob2JqICE9IG51bGwpICYmIGdldENsYXNzKCkuZXF1YWxzKG9iai5nZXRDbGFzcygpKSAmJiBmSW1hZ2UuZXF1YWxzKCgoSW1hZ2VJbWFnZURlc2NyaXB0b3Ipb2JqKS5mSW1hZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNnZXRJbWFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkgewotCQlyZXR1cm4gZkltYWdlLmdldEltYWdlRGF0YSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZJbWFnZS5oYXNoQ29kZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL1BpeGVsQ29udmVydGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL1BpeGVsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDM2ZDIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9QaXhlbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGNsYXNzIFBpeGVsQ29udmVydGVyIHsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQkKLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMKLQkgKi8KLQlwdWJsaWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBkbHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBEaWFsb2dQYWdlI2NvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscwotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGludCBjaGFycykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGNoYXJzKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9BdXRoZW50aWNhdGlvbkZyYW1lLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9BdXRoZW50aWNhdGlvbkZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllZDE4OWQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQXV0aGVudGljYXRpb25GcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRnJhbWUgc3BlY2lhbGl6ZWQgZm9yIHVzZSBpbiBlbnZpcm9ubWVudHMgdGhhdCBtdXN0IHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QKLSAqIGZyb20gdGhlIHVzZXIuCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoZW50aWNhdGlvbkZyYW1lIGV4dGVuZHMgRnJhbWUgewotCi0JLyoqCi0JICogSW1wbGVtZW50cyBhIHtAbGluayBTZWxlY3Rpb25MaXN0ZW5lcn0gdGhhdCByZWNlaXZlcyBldmVudHMgZnJvbSB0aGUge0BsaW5rIEJ1dHRvbn0gCi0JICogKFNXVC5PUFRJT04gc3R5bGUpIGNoaWxkcmVuIGNvbnRyb2xzIGNvbnZlcnQgdGhlbSB0byB7QGxpbmsgTW9kaWZ5RXZlbnR9IGFuZCBmb3J3YXJkcyAKLQkgKiB0aGVtIHRvIHRoaXMgY29udHJvbCBsaXN0ZW5lcnMuCi0JICogQWxzbywgaXQgdXBkYXRlcyBhbGwgd2lkZ2V0cyB0aGF0IGRlcGVuZCBvbiB0aGUgY29udHJvbHMgdGhhdCBnZW5lcmF0ZSB0aGUgZXZlbnQuCi0JICogIAotCSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLQkgKgotCSAqLwotCWNsYXNzIE9wdGlvblNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl1cGRhdGVFbmFibGVkV2lkZ2V0cygpOwotCQkJCi0JCQkvLyBDb3B5IHRoZSBTZWxlY3Rpb25FdmVudCB0byB0aGUgTW9kaWZ5RXZlbnQKLQkJCUV2ZW50IG5ld0V2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQluZXdFdmVudC5kYXRhID0gZXZlbnQuZGF0YTsKLQkJCW5ld0V2ZW50LmRpc3BsYXkgPSBldmVudC5kaXNwbGF5OwotCQkJbmV3RXZlbnQudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQluZXdFdmVudC53aWRnZXQgPSBldmVudC53aWRnZXQ7Ci0JCQlNb2RpZnlFdmVudCBtZXZlbnQgPSBuZXcgTW9kaWZ5RXZlbnQobmV3RXZlbnQpOwotCQkJCi0JCQlmb3J3YXJkRXZlbnRUb0V4dGVybmFsTGlzdGVuZXJzKG1ldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW1wbGVtZW50cyBhIHtAbGluayBTZWxlY3Rpb25MaXN0ZW5lcn0gdGhhdCByZWNlaXZlcyBldmVudHMgZnJvbSB0aGUge0BsaW5rIENvbWJvfSAKLQkgKiBjaGlsZHJlbiBjb250cm9scyBjb252ZXJ0IHRoZW0gdG8ge0BsaW5rIE1vZGlmeUV2ZW50fSBhbmQgZm9yd2FyZHMgCi0JICogdGhlbSB0byB0aGlzIGNvbnRyb2wgbGlzdGVuZXJzLgotCSAqICAKLQkgKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0JICoKLQkgKi8KLQljbGFzcyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0vLwkJCSBDb3B5IHRoZSBTZWxlY3Rpb25FdmVudCB0byB0aGUgTW9kaWZ5RXZlbnQKLQkJCUV2ZW50IG5ld0V2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQluZXdFdmVudC5kYXRhID0gZXZlbnQuZGF0YTsKLQkJCW5ld0V2ZW50LmRpc3BsYXkgPSBldmVudC5kaXNwbGF5OwotCQkJbmV3RXZlbnQudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQluZXdFdmVudC53aWRnZXQgPSBldmVudC53aWRnZXQ7Ci0JCQlNb2RpZnlFdmVudCBtZXZlbnQgPSBuZXcgTW9kaWZ5RXZlbnQobmV3RXZlbnQpOwotCQkJCi0JCQlmb3J3YXJkRXZlbnRUb0V4dGVybmFsTGlzdGVuZXJzKG1ldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLy8gVG9wIGNvbnRyb2xzCi0JQnV0dG9uIGxvY2FsaG9zdDsKLQlCdXR0b24gcmVtb3RlaG9zdDsKLQlUZXh0R3JvdXAgaG9zdEFkZHJlc3NUZXh0R3JvdXA7Ci0JVGV4dEdyb3VwIGhvc3RQb3J0VGV4dEdyb3VwOwotCUJ1dHRvbiBwYXNzd29yZEF1dGhCdXR0b247Ci0JQnV0dG9uIHB1YmxpY0tleUF1dGhCdXR0b247Ci0JVGV4dEdyb3VwIHVzZXJuYW1lVGV4dEdyb3VwOwotCVRleHRHcm91cCBwYXNzd29yZFRleHRHcm91cDsKLQlGaWxlR3JvdXAgcHJpdmF0ZUtleVBhdGhHcm91cDsKLQlUZXh0R3JvdXAgcGFzc3BocmFzZVRleHRHcm91cDsKLQkKLQkvLyBCb3R0b20gY29udHJvbHMKLQlUZXh0R3JvdXAgdGltZW91dFRleHRHcm91cDsKLQlDb21ib0dyb3VwIGNpcGhlclR5cGVHcm91cDsKLQkKLQkvLyBMaXN0IG9mIGFsbCBsaXN0ZW5lcnMKLQlDb2xsZWN0aW9uIG1vZGlmeUxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JcHVibGljIEF1dGhlbnRpY2F0aW9uRnJhbWUoQ29tcG9zaXRlIHBhcmVudCwgQXV0aGVudGljYXRpb25GcmFtZU1vbGQgbW9sZCkgewotCQlzdXBlcihwYXJlbnQsIAotCQkJCQlGcmFtZU1vbGQuSEFTX0VYUEFORCB8IEZyYW1lTW9sZC5IQVNfRlJBTUUgfCAoKG1vbGQuYml0bWFzayAmIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkLkhBU19ERVNDUklQVElPTikgIT0gMCA/IEZyYW1lTW9sZC5IQVNfREVTQ1JJUFRJT04gOiAwKSwgCi0JCQkJCTIpOwotCQlzZXRUaXRsZShtb2xkLnRpdGxlKTsKLQkJc3VwZXIuc2V0RXhwYW5kQnV0dG9uTGFiZWwobW9sZC5sYWJlbFNob3dBZHZhbmNlZE9wdGlvbnMpOwotCQlzdXBlci5zZXRTaHJpbmtCdXR0b25MYWJlbChtb2xkLmxhYmVsSGlkZUFkdmFuY2VkT3B0aW9ucyk7Ci0JCWlmIChtb2xkLmRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNldERlc2NyaXB0aW9uKG1vbGQuZGVzY3JpcHRpb24pOwotCQl9Ci0JCQotCQljcmVhdGVUb3BDb250cm9scyhtb2xkKTsKLQkJY3JlYXRlQm90dG9tQ29udHJvbHMobW9sZCk7Ci0JCXJlZ2lzdGVyTGlzdGVuZXJzKCk7Ci0JCXVwZGF0ZUVuYWJsZWRXaWRnZXRzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgbGlzdGVuZXJzIGZvciBhbGwgdXNlci1pbnRlcmFjdGl2ZSBjb250cm9scwotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTGlzdGVuZXJzKCkgewotCQkvLyBHZXQgY29udHJvbHMgZnJvbSBib3RoIHRvcCBhbmQgYm90dG9tIGNvbXBvc2l0ZXMuCi0JCUNvbnRyb2wgW10gY29udHJvbHMgPSB7dGhpcy5sb2NhbGhvc3QsIHRoaXMucmVtb3RlaG9zdCwgdGhpcy5ob3N0QWRkcmVzc1RleHRHcm91cCwgdGhpcy5ob3N0UG9ydFRleHRHcm91cCwgdGhpcy5wYXNzd29yZEF1dGhCdXR0b24sCi0JCQkJdGhpcy5wdWJsaWNLZXlBdXRoQnV0dG9uLCB0aGlzLnVzZXJuYW1lVGV4dEdyb3VwLCB0aGlzLnBhc3N3b3JkVGV4dEdyb3VwLCB0aGlzLnByaXZhdGVLZXlQYXRoR3JvdXAsCi0JCQkJdGhpcy5wYXNzcGhyYXNlVGV4dEdyb3VwLCB0aGlzLnRpbWVvdXRUZXh0R3JvdXAsIHRoaXMuY2lwaGVyVHlwZUdyb3VwfTsKLQkJCi0JCS8vIEFkZCBsaXN0ZW5lcnMgdG8gYWxsIGNvbnRyb2xzIGluIHRoZSBhcnJheQotCQlmb3IoaW50IGk9MDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihjb250cm9sc1tpXSBpbnN0YW5jZW9mIFRleHRHcm91cCkgewotCQkJCSgoVGV4dEdyb3VwKWNvbnRyb2xzW2ldKS5nZXRUZXh0KCkuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRleHRNb2RpZnlMaXN0ZW5lcigpKTsKLQkJCX0gZWxzZSBpZiAoY29udHJvbHNbaV0gaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQlCdXR0b24gYiA9IChCdXR0b24pY29udHJvbHNbaV07Ci0JCQkJYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgT3B0aW9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl9IGVsc2UgaWYoY29udHJvbHNbaV0gaW5zdGFuY2VvZiBDb21ib0dyb3VwKSB7Ci0JCQkJKChDb21ib0dyb3VwKWNvbnRyb2xzW2ldKS5nZXRDb21ibygpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRyb2xzIGZvciB0aGUgdG9wIGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbW9sZCAKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUb3BDb250cm9scyhBdXRoZW50aWNhdGlvbkZyYW1lTW9sZCBtb2xkKSB7Ci0JCUNvbXBvc2l0ZSB0b3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUgPSB0aGlzLmdldFRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZSgpOwotCi0JCUZyYW1lTW9sZCBsbW9sZCA9IG5ldyBGcmFtZU1vbGQoMik7Ci0JCUZyYW1lIGxpbmUgPSBuZXcgRnJhbWUodG9wVXNlclJlc2VydmVkQ29tcG9zaXRlLCBsbW9sZCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCWlmICgobW9sZC5nZXRCaXRtYXNrKCkgJiBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZC5TSE9XX0hPU1RfVFlQRV9SQURJT19CVVRUT04pICE9IDApIHsKLQkJCS8vIFJhZGlvIGJ1dHRvbnMgdG8gc2VsZWN0IGlmIHRhcmdldCBpcyBsb2NhbGhvc3Qgb3IgYSByZW1vdGUgaG9zdC4KLQkJCXRoaXMubG9jYWxob3N0ID0gbmV3IEJ1dHRvbihsaW5lLCBTV1QuUkFESU8pOwotCQkJdGhpcy5sb2NhbGhvc3Quc2V0VGV4dChtb2xkLmxhYmVsTG9jYWxob3N0KTsKLQkJCXRoaXMucmVtb3RlaG9zdCA9IG5ldyBCdXR0b24obGluZSwgU1dULlJBRElPKTsKLQkJCXRoaXMucmVtb3RlaG9zdC5zZXRUZXh0KG1vbGQubGFiZWxSZW1vdGVIb3N0KTsKLQkJCQotCQkJbGluZSA9IG5ldyBGcmFtZSh0b3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUsIGxtb2xkKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCQotCQkvLyBXaWxsIHJldXNlIHRoaXMgbW9sZCBmb3IgYWxsIFRleHRHcm91cCBjb250cm9scy4KLQkJVGV4dE1vbGQgdG1vbGQgPSBuZXcgVGV4dE1vbGQoVGV4dE1vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMIHwgCi0JCQkJVGV4dE1vbGQuR1JJRF9EQVRBX0dSQUJfRVhDRVNTX1NQQUNFLCBNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lX0hvc3QpOwotCQkKLQkJLy8gSG9zdCBmaWVsZAotCQl0bW9sZC5zZXRMYWJlbChtb2xkLmxhYmVsSG9zdEFkZHJlc3MpOwotCQlob3N0QWRkcmVzc1RleHRHcm91cCA9IG5ldyBUZXh0R3JvdXAobGluZSwgdG1vbGQpOwotCQkJCQotCQkvLyBQb3J0IGZpZWxkCi0JCXRtb2xkLnJlbW92ZUJpdG1hc2soVGV4dE1vbGQuR1JJRF9EQVRBX0dSQUJfRVhDRVNTX1NQQUNFKTsKLS8vCQl0bW9sZC5yZW1vdmVCaXRtYXNrKFRleHRHcm91cE1vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMKTsKLQkJdG1vbGQuYWRkQml0bWFzayhUZXh0TW9sZC5XSURUSF9QUk9QT1JUSU9OQUxfTlVNX0NIQVJTKTsKLQkJdG1vbGQuc2V0VGV4dEZpZWxkV2lkdGgoNSk7Ci0JCXRtb2xkLnNldExhYmVsKG1vbGQubGFiZWxIb3N0UG9ydCk7Ci0JCWhvc3RQb3J0VGV4dEdyb3VwID0gbmV3IFRleHRHcm91cChsaW5lLCB0bW9sZCk7Ci0vLwkJaG9zdFBvcnRUZXh0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLS8vCQkgVXNlcm5hbWUgZmllbGQKLQkJdG1vbGQuYWRkQml0bWFzayhUZXh0TW9sZC5HUklEX0RBVEFfR1JBQl9FWENFU1NfU1BBQ0UpOwotLy8JCXRtb2xkLmFkZEJpdG1hc2soVGV4dEdyb3VwTW9sZC5HUklEX0RBVEFfQUxJR05NRU5UX0ZJTEwpOwotCQl0bW9sZC5yZW1vdmVCaXRtYXNrKFRleHRNb2xkLldJRFRIX1BST1BPUlRJT05BTF9OVU1fQ0hBUlMpOwotCQl0bW9sZC51bnNldFRleHRGaWVsZFdpZHRoKCk7Ci0JCXRtb2xkLnNldExhYmVsKG1vbGQubGFiZWxVc2VyTmFtZSk7Ci0JCXVzZXJuYW1lVGV4dEdyb3VwID0gbmV3IFRleHRHcm91cCh0b3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUsIHRtb2xkKTsKLQkJCi0JCS8vIFVzZXIgb3B0aW9uIGJveAotCQlwYXNzd29yZEF1dGhCdXR0b24gPSBuZXcgQnV0dG9uKHRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJcGFzc3dvcmRBdXRoQnV0dG9uLnNldFRleHQobW9sZC5sYWJlbElzUGFzc3dvcmRCYXNlZCk7Ci0JCUdyaWREYXRhIGdkYXV0aGtpbmQwID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkYXV0aGtpbmQwLmhvcml6b250YWxTcGFuID0gMjsKLQkJcGFzc3dvcmRBdXRoQnV0dG9uLnNldExheW91dERhdGEoZ2RhdXRoa2luZDApOwotCQkKLQkJLy8gUGFzc3dvcmQgZmllbGQKLQkJdG1vbGQuc2V0TGFiZWwobW9sZC5sYWJlbFBhc3N3b3JkKTsKLQkJdG1vbGQuYWRkQml0bWFzayhUZXh0TW9sZC5QQVNTV0RfRklFTEQpOwotCQlwYXNzd29yZFRleHRHcm91cCA9IG5ldyBUZXh0R3JvdXAodG9wVXNlclJlc2VydmVkQ29tcG9zaXRlLCB0bW9sZCk7Ci0JCQotCQkvLyBLZXkgb3B0aW9uIGJveAotCQlwdWJsaWNLZXlBdXRoQnV0dG9uID0gbmV3IEJ1dHRvbih0b3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCXB1YmxpY0tleUF1dGhCdXR0b24uc2V0VGV4dChtb2xkLmxhYmVsSXNQdWJsaWNLZXlCYXNlZCk7Ci0JCUdyaWREYXRhIGdkYXV0aGtpbmQxID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkYXV0aGtpbmQxLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHVibGljS2V5QXV0aEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkYXV0aGtpbmQxKTsKLQkJCi0JCS8vIEtleSBmaWxlIHNlbGVjdGlvbgotCQlGaWxlTW9sZCBmc21vbGQgPSBuZXcgRmlsZU1vbGQoRmlsZU1vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMCi0JCQkJfCBGaWxlTW9sZC5HUklEX0RBVEFfU1BBTiwgCi0JCQkJbW9sZC5sYWJlbFByaXZhdGVLZXlQYXRoLCBtb2xkLmxhYmVsUHJpdmF0ZUtleVBhdGhUaXRsZSwgbW9sZC5sYWJlbFB1YmxpY0tleVBhdGhCdXR0b24pOwotCQlwcml2YXRlS2V5UGF0aEdyb3VwID0gbmV3IEZpbGVHcm91cCh0b3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUsIGZzbW9sZCk7Ci0JCQotCQkvLyBQYXNzcGhyYXNlIGZpZWxkCi0JCXRtb2xkLnNldExhYmVsKG1vbGQubGFiZWxQYXNzcGhyYXNlKTsKLQkJdG1vbGQuYWRkQml0bWFzayhUZXh0TW9sZC5HUklEX0RBVEFfU1BBTik7Ci0JCXBhc3NwaHJhc2VUZXh0R3JvdXAgPSBuZXcgVGV4dEdyb3VwKHRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZSwgdG1vbGQpOwotCQkKLQkJcGFzc3dvcmRBdXRoQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJcHVibGljS2V5QXV0aEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkKLQkJLy8gVGhpcyBzb2x2ZXMgdGhlIHRhYm9yZGVyIGlzc3VlLgotCQlpZiAoKG1vbGQuZ2V0Qml0bWFzaygpICYgQXV0aGVudGljYXRpb25GcmFtZU1vbGQuU0hPV19IT1NUX1RZUEVfUkFESU9fQlVUVE9OKSAhPSAwKSB7Ci0JCQl0b3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUuc2V0VGFiTGlzdChuZXcgQ29udHJvbCBbXSB7bG9jYWxob3N0LmdldFBhcmVudCgpLCBob3N0UG9ydFRleHRHcm91cC5nZXRQYXJlbnQoKSwgCi0JCQkJCXVzZXJuYW1lVGV4dEdyb3VwLCBwYXNzd29yZEF1dGhCdXR0b24sIHBhc3N3b3JkVGV4dEdyb3VwLCAKLQkJCQkJcHVibGljS2V5QXV0aEJ1dHRvbiAscHJpdmF0ZUtleVBhdGhHcm91cCwgCi0JCQkJCXBhc3NwaHJhc2VUZXh0R3JvdXB9KTsKLQkJfSBlbHNlIHsKLQkJCXRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZS5zZXRUYWJMaXN0KG5ldyBDb250cm9sIFtdIHtob3N0UG9ydFRleHRHcm91cC5nZXRQYXJlbnQoKSwgCi0JCQkJCXVzZXJuYW1lVGV4dEdyb3VwLCBwYXNzd29yZEF1dGhCdXR0b24sIHBhc3N3b3JkVGV4dEdyb3VwLCAKLQkJCQkJcHVibGljS2V5QXV0aEJ1dHRvbiAscHJpdmF0ZUtleVBhdGhHcm91cCwgCi0JCQkJCXBhc3NwaHJhc2VUZXh0R3JvdXB9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb250cm9scyBmb3IgdGhlIGJvdHRvbSAoaGlkZWFibGUpIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBtb2xkIAotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJvdHRvbUNvbnRyb2xzKEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkIG1vbGQpIHsKLQkJQ29tcG9zaXRlIGJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZSA9IHRoaXMuZ2V0Qm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlKCk7Ci0JCS8vIFRpbWVvdXQgZmllbGQKLQkJVGV4dE1vbGQgdG1vbGQgPSBuZXcgVGV4dE1vbGQoVGV4dE1vbGQuV0lEVEhfUFJPUE9SVElPTkFMX05VTV9DSEFSUywgCi0JCQkJbW9sZC5sYWJlbFRpbWVvdXQsCTUpOwotCQl0aW1lb3V0VGV4dEdyb3VwID0gbmV3IFRleHRHcm91cChib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGUsIHRtb2xkKTsKLQkJQ29tYm9Nb2xkIGNtb2xkID0gbmV3IENvbWJvTW9sZChDb21ib01vbGQuR1JJRF9EQVRBX1NQQU4gfCAKLQkJCQlDb21ib01vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMIHwgQ29tYm9Nb2xkLkdSSURfREFUQV9HUkFCX0VYQ0VTU19TUEFDRSwgCi0JCQkJbW9sZC5sYWJlbENpcGhlclR5cGUpOyAvL2VtcHR5IGNvbWJvCi0JCWNpcGhlclR5cGVHcm91cCA9IG5ldyBDb21ib0dyb3VwKGJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZSwgY21vbGQpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1vZGlmeSBsaXN0ZW5lciBmb3IgdGhpcyBjb250cm9sLiBUaGUgbW9kaWZ5IGxpc3RlbmVyIHdpbGwgbGlzdGVuIHRvIGFsbCB0ZXh0Ym94IGFuZAotCSAqIGFsc28gbGlzdGVuIHRvIHRoZSBvcHRpb24gYnV0dG9ucywgY29udmVydGluZyB0aGVpciBldmVudHMge0BsaW5rIFNlbGVjdGlvbkV2ZW50fSB0bwotCSAqIHtAbGluayBNb2RpZnlFdmVudH0gd2hlbiBuZWNlc3NhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbW9kaWZ5TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbW9kaWZ5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBhIHtAbGluayBNb2RpZnlFdmVudH0gYXJyaXZlcywgZm9yd2FyZCBpdCB0byBhbGwgbGlzdGVuZXJzIG9mIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcndhcmRFdmVudFRvRXh0ZXJuYWxMaXN0ZW5lcnMoTW9kaWZ5RXZlbnQgbWV2ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kaWZ5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gKE1vZGlmeUxpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5tb2RpZnlUZXh0KG1ldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW1wbGVtZW50cyBhIHtAbGluayBNb2RpZnlMaXN0ZW5lcn0gdGhhdCByZWNlaXZlcyBldmVudHMgZnJvbSB0aGUge0BsaW5rIFRleHR9IGNoaWxkcmVuIGNvbnRyb2xzIGFuZCAKLQkgKiBmb3J3YXJkcyB0aGVtIHRvIHRoaXMgY29udHJvbCBsaXN0ZW5lcnMnLgotCSAqIAotCSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLQkgKgotCSAqLwotCWNsYXNzIFRleHRNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBhcmcwKSB7Ci0JCQlmb3J3YXJkRXZlbnRUb0V4dGVybmFsTGlzdGVuZXJzKGFyZzApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIGVuYWJsZS9kaXNhYmxlIG9wdGlvbnMgYmFzZWQgb24gc3RhdHVzIG9mIHNvbWUgY29udHJvbChzKSBvZiB0aGUgCi0JICogYXV0aGVudGljYXRpb24gZnJhbWUuCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlZFdpZGdldHMoKSB7Ci0JCWlmIChpc0xvY2FsaG9zdFNlbGVjdGVkKCkpIHsKLQkJCXRoaXMuaG9zdEFkZHJlc3NUZXh0R3JvdXAuZ2V0VGV4dCgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdGhpcy5ob3N0QWRkcmVzc1RleHRHcm91cC5nZXRUZXh0KCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQlpZihpc1Bhc3N3ZEJhc2VkKCkpCi0JCXsKLQkJCS8vdXNlcm5hbWVUZXh0R3JvdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXBhc3N3b3JkVGV4dEdyb3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlwcml2YXRlS2V5UGF0aEdyb3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcGFzc3BocmFzZVRleHRHcm91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCS8vdXNlcm5hbWVUZXh0R3JvdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlwYXNzd29yZFRleHRHcm91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXByaXZhdGVLZXlQYXRoR3JvdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXBhc3NwaHJhc2VUZXh0R3JvdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGFsbCBmcmFtZSBmaWVsZHMuIFRocm93IGEge0BsaW5rIENvcmVFeGNlcHRpb259IGlmIGZpZWxkIGlzIGludmFsaWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQotCQlpZiAoKCFpc0xvY2FsaG9zdFNlbGVjdGVkKCkpICYmIChob3N0QWRkcmVzc1RleHRHcm91cC5nZXRUZXh0KCkuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW5JRCwgMCwgTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZV9FbXB0eUhvc3RBZGRyZXNzRXhjZXB0aW9uLCAKLQkJCQkJbnVsbCkpOwotCQl9IAotCQlpZihob3N0UG9ydFRleHRHcm91cC5nZXRUZXh0KCkuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCBNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lX0VtcHR5SG9zdFBvcnRFeGNlcHRpb24sIAotCQkJCQludWxsKSk7Ci0JCX0gCi0JCWlmKHVzZXJuYW1lVGV4dEdyb3VwLmdldFRleHQoKS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSUQsIDAsIE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVfRW1wdHlVc2VybmFtZUV4Y2VwdGlvbiwgCi0JCQkJCW51bGwpKTsKLQkJfQotCQlpZighaXNQYXNzd2RCYXNlZCgpKSB7Ci0JCQlpZihwcml2YXRlS2V5UGF0aEdyb3VwLmdldFRleHQoKS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCBNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lX0VtcHR5UHJpdmF0ZUtleVBhdGhFeGNlcHRpb24sIAotCQkJCQkJbnVsbCkpOwotCQkJfSAKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKHByaXZhdGVLZXlQYXRoR3JvdXAuZ2V0VGV4dCgpLmdldFRleHQoKSk7Ci0JCQlpZighcGF0aC5leGlzdHMoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSUQsIDAsIE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVfRmlsZURvZXNOb3RFeGlzdEV4Y2VwdGlvbiwgCi0JCQkJCQkJbnVsbCkpOwotCQkJfQotCQkJaWYoIXBhdGguaXNGaWxlKCkpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCBNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lX1BhdGhJc05vdEZpbGVFeGNwZXRpb24sIAotCQkJCQkJbnVsbCkpOwotCQkJfSAKLQkJCWlmKCFwYXRoLmNhblJlYWQoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSUQsIDAsIE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVfRmlsZU5vdFJlYWRhYmxlRXhjZXB0aW9uLCAKLQkJCQkJCW51bGwpKTsKLQkJCX0gCi0JCX0KLQkJdHJ5IHsKLQkJCUludGVnZXIucGFyc2VJbnQodGltZW91dFRleHRHcm91cC5nZXRUZXh0KCkuZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSUQsIDAsIE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVfVGltZW91dEV4Y2VwdGlvbiwKLQkJCQkJbnVsbCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyLnBhcnNlSW50KGhvc3RQb3J0VGV4dEdyb3VwLmdldFRleHQoKS5nZXRUZXh0KCkpOwotCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW5JRCwgMCwgTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZV9Qb3J0TnVtYmVyRXhjZXB0aW9uLAotCQkJCQludWxsKSk7Ci0JCX0KLQkJaWYoY2lwaGVyVHlwZUdyb3VwLmdldFNlbGVjdGVkSXRlbSgpID09IG51bGwgfHwgY2lwaGVyVHlwZUdyb3VwLmdldFNlbGVjdGVkSXRlbSgpLmdldElkKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCBNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lX0ludmFsaWRDaXBoZXJUeXBlRXhjZXB0aW9uLCBudWxsKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRHcm91cCBnZXRIb3N0QWRkclRleHRHcm91cCgpIHsKLQkJcmV0dXJuIGhvc3RBZGRyZXNzVGV4dEdyb3VwOwotCX0KLQotCXB1YmxpYyBUZXh0R3JvdXAgZ2V0SG9zdFBvcnRUZXh0R3JvdXAoKSB7Ci0JCXJldHVybiBob3N0UG9ydFRleHRHcm91cDsKLQl9Ci0KLQlwdWJsaWMgVGV4dEdyb3VwIGdldFBhc3NwaHJhc2VUZXh0R3JvdXAoKSB7Ci0JCXJldHVybiBwYXNzcGhyYXNlVGV4dEdyb3VwOwotCX0KLQotCXB1YmxpYyBUZXh0R3JvdXAgZ2V0UGFzc3dvcmRUZXh0R3JvdXAoKSB7Ci0JCXJldHVybiBwYXNzd29yZFRleHRHcm91cDsKLQl9Ci0KLQlwdWJsaWMgVGV4dEdyb3VwIGdldFRpbWVvdXRUZXh0R3JvdXAoKSB7Ci0JCXJldHVybiB0aW1lb3V0VGV4dEdyb3VwOwotCX0KLQotCXB1YmxpYyBUZXh0R3JvdXAgZ2V0VXNlcm5hbWVUZXh0R3JvdXAoKSB7Ci0JCXJldHVybiB1c2VybmFtZVRleHRHcm91cDsKLQl9Ci0JCi0JcHVibGljIEZpbGVHcm91cCBnZXRQdWJsaWNLZXlQYXRoR3JvdXAoKSB7Ci0JCXJldHVybiBwcml2YXRlS2V5UGF0aEdyb3VwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3ZEJhc2VkKCkgewotCQlyZXR1cm4gcGFzc3dvcmRBdXRoQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTG9jYWxob3N0U2VsZWN0ZWQoKSB7Ci0JCWlmICh0aGlzLmxvY2FsaG9zdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5sb2NhbGhvc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgQnV0dG9uW10gZ2V0QXV0aEtpbmRTZWxlY3Rpb25CdXR0b25zKCkgewotCQlCdXR0b24gW10gYnV0dG9ucyA9IG5ldyBCdXR0b25bMl07Ci0JCWJ1dHRvbnNbMF0gPSBwYXNzd29yZEF1dGhCdXR0b247Ci0JCWJ1dHRvbnNbMV0gPSBwdWJsaWNLZXlBdXRoQnV0dG9uOwotCQlyZXR1cm4gYnV0dG9uczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhvc3RBZGRyZXNzKCkgewotCQlyZXR1cm4gaG9zdEFkZHJlc3NUZXh0R3JvdXAuZ2V0U3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEhvc3RBZGRyZXNzKFN0cmluZyBzKSB7Ci0JCWhvc3RBZGRyZXNzVGV4dEdyb3VwLnNldFN0cmluZyhzKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRIb3N0UG9ydCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGhvc3RQb3J0VGV4dEdyb3VwLmdldFN0cmluZygpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAyMjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3RQb3J0KGludCBwb3J0KSB7Ci0JCWhvc3RQb3J0VGV4dEdyb3VwLnNldFN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkQmFzZWQoKSB7Ci0JCXJldHVybiBwYXNzd29yZEF1dGhCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkQmFzZWQoYm9vbGVhbiBmbGFnKSB7Ci0JCXBhc3N3b3JkQXV0aEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmxhZyk7Ci0JCXB1YmxpY0tleUF1dGhCdXR0b24uc2V0U2VsZWN0aW9uKCEgZmxhZyk7Ci0JCXVwZGF0ZUVuYWJsZWRXaWRnZXRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2FsaG9zdFNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCWlmICgodGhpcy5sb2NhbGhvc3QgIT0gbnVsbCkgJiYgKHRoaXMucmVtb3RlaG9zdCAhPSBudWxsKSkgewotCQkJdGhpcy5sb2NhbGhvc3Quc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl0aGlzLnJlbW90ZWhvc3Quc2V0U2VsZWN0aW9uKCFzZWxlY3Rpb24pOwotCQkJdXBkYXRlRW5hYmxlZFdpZGdldHMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpY0tleUJhc2VkKCkgewotCQlyZXR1cm4gcHVibGljS2V5QXV0aEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNLZXlCYXNlZChib29sZWFuIGZsYWcpIHsKLQkJcGFzc3dvcmRBdXRoQnV0dG9uLnNldFNlbGVjdGlvbighIGZsYWcpOwotCQlwdWJsaWNLZXlBdXRoQnV0dG9uLnNldFNlbGVjdGlvbihmbGFnKTsKLQkJdXBkYXRlRW5hYmxlZFdpZGdldHMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gcGFzc3dvcmRUZXh0R3JvdXAuZ2V0U3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHMpIHsKLQkJcGFzc3dvcmRUZXh0R3JvdXAuc2V0U3RyaW5nKHMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgewotCQlyZXR1cm4gdXNlcm5hbWVUZXh0R3JvdXAuZ2V0U3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJOYW1lKFN0cmluZyBzKSB7Ci0JCXVzZXJuYW1lVGV4dEdyb3VwLnNldFN0cmluZyhzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhc3NwaHJhc2UoKSB7Ci0JCXJldHVybiBwYXNzcGhyYXNlVGV4dEdyb3VwLmdldFN0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQYXNzcGhyYXNlKFN0cmluZyBzKSB7Ci0JCXBhc3NwaHJhc2VUZXh0R3JvdXAuc2V0U3RyaW5nKHMpOwotCX0KLQotCQotCXB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHRpbWVvdXRUZXh0R3JvdXAuZ2V0U3RyaW5nKCkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDUwMDA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBwb3J0KSB7Ci0JCXRpbWVvdXRUZXh0R3JvdXAuc2V0U3RyaW5nKEludGVnZXIudG9TdHJpbmcocG9ydCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljS2V5UGF0aCgpIHsKLQkJcmV0dXJuIHByaXZhdGVLZXlQYXRoR3JvdXAuZ2V0U3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0tleVBhdGgoU3RyaW5nIHMpIHsKLQkJcHJpdmF0ZUtleVBhdGhHcm91cC5zZXRTdHJpbmcocyk7Ci0JfQotCi0JcHVibGljIENvbWJvR3JvdXBJdGVtIGdldFNlbGVjdGVkQ2lwaGVyVHlwZSgpIHsKLQkJcmV0dXJuIGNpcGhlclR5cGVHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0JCi0JcHVibGljIENvbWJvR3JvdXBJdGVtIGdldENpcGhlclR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBjaXBoZXJUeXBlR3JvdXAuZ2V0SXRlbVVzaW5nSUQoaWQpOwotCX0KLQkKLQlwdWJsaWMgQ29tYm9Hcm91cEl0ZW0gZ2V0Q2lwaGVyVHlwZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGNpcGhlclR5cGVHcm91cC5nZXRJdGVtVXNpbmdJbmRleChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZENpcGhlclR5cGUoQ29tYm9Hcm91cEl0ZW0gY2l0ZW0pIHsKLQkJY2lwaGVyVHlwZUdyb3VwLmFkZChjaXRlbSk7Ci0JfQotCQotCXB1YmxpYyBDb21ib0dyb3VwIGdldENpcGhlclR5cGVHcm91cCgpIHsKLQkJcmV0dXJuIGNpcGhlclR5cGVHcm91cDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0F1dGhlbnRpY2F0aW9uRnJhbWVNb2xkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9BdXRoZW50aWNhdGlvbkZyYW1lTW9sZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTI0ZGUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0F1dGhlbnRpY2F0aW9uRnJhbWVNb2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTX0RFU0NSSVBUSU9OID0gMSA8PCAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19IT1NUX1RZUEVfUkFESU9fQlVUVE9OID0gMSA8PCAxOwotCQotCWludCBiaXRtYXNrOwotCi0JU3RyaW5nIGRlc2NyaXB0aW9uOwotCVN0cmluZyB0aXRsZTsKLQotCVN0cmluZyBsYWJlbExvY2FsaG9zdCA9IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfT3B0aW9uX2xvY2FsaG9zdDsKLQlTdHJpbmcgbGFiZWxSZW1vdGVIb3N0PUF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfT3B0aW9uX1JlbW90ZWhvc3Q7Ci0JU3RyaW5nIGxhYmVsU2hvd0FkdmFuY2VkT3B0aW9ucyA9IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfQnV0dG9uX1Nob3dBZHZhbmNlZDsKLQlTdHJpbmcgbGFiZWxIaWRlQWR2YW5jZWRPcHRpb25zID0gQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9CdXR0b25fSGlkZUFkdmFuY2VkOwotCVN0cmluZyBsYWJlbFBhc3N3b3JkID0gQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9QYXNzd29yZDsKLQlTdHJpbmcgbGFiZWxVc2VyTmFtZSA9IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfVXNlcjsKLQlTdHJpbmcgbGFiZWxJc1Bhc3N3b3JkQmFzZWQgPSBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX09wdGlvbl9QYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotCVN0cmluZyBsYWJlbEhvc3RQb3J0ID0gQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9Qb3J0OwotCVN0cmluZyBsYWJlbEhvc3RBZGRyZXNzID0gQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9Ib3N0OwotCVN0cmluZyBsYWJlbFRpbWVvdXQgPSBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX0ZpZWxkX1RpbWVvdXQ7Ci0JU3RyaW5nIGxhYmVsUGFzc3BocmFzZSA9IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfUGFzc3BocmFzZTsKLQlTdHJpbmcgbGFiZWxQdWJsaWNLZXlQYXRoQnV0dG9uID0gQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9CdXR0b25fUHJpdmF0ZUtleVBhdGg7Ci0JU3RyaW5nIGxhYmVsUHJpdmF0ZUtleVBhdGggPSBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZE1lc3NhZ2VzLkF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX1NlbGVjdGlvbldpbmRvd19MYWJlbF9Qcml2YXRlS2V5UGF0aDsKLQlTdHJpbmcgbGFiZWxQcml2YXRlS2V5UGF0aFRpdGxlID0gQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9TZWxlY3Rpb25XaW5kb3dfVGl0bGVfUHJpdmF0ZUtleVBhdGg7Ci0JU3RyaW5nIGxhYmVsSXNQdWJsaWNLZXlCYXNlZCA9IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfT3B0aW9uX1B1YmxpY0tleUF1dGg7Ci0JU3RyaW5nIGxhYmVsQ2lwaGVyVHlwZSA9IEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuQXV0aGVudGljYXRpb25GcmFtZU1vbGRfQ29tYm9fQ2lwaGVyVHlwZTsKLQkKLQlwdWJsaWMgQXV0aGVudGljYXRpb25GcmFtZU1vbGQoU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMuYml0bWFzayA9IDA7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuYml0bWFzayA9IDA7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Qml0bWFzaygpIHsKLQkJcmV0dXJuIGJpdG1hc2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qml0bWFzayhpbnQgYml0bWFzaykgewotCQl0aGlzLmJpdG1hc2sgPSBiaXRtYXNrOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy50aXRsZSA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsTG9jYWxob3N0KFN0cmluZyBsYWJlbExvY2FsaG9zdCkgewotCQl0aGlzLmxhYmVsTG9jYWxob3N0ID0gbGFiZWxMb2NhbGhvc3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExhYmVsUmVtb3RlSG9zdChTdHJpbmcgbGFiZWxSZW1vdGVIb3N0KSB7Ci0JCXRoaXMubGFiZWxSZW1vdGVIb3N0ID0gbGFiZWxSZW1vdGVIb3N0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYWJlbEhpZGVBZHZhbmNlZE9wdGlvbnMoU3RyaW5nIGxhYmVsSGlkZUFkdmFuY2VkT3B0aW9ucykgewotCQl0aGlzLmxhYmVsSGlkZUFkdmFuY2VkT3B0aW9ucyA9IGxhYmVsSGlkZUFkdmFuY2VkT3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbEhvc3RBZGRyZXNzKFN0cmluZyBsYWJlbEhvc3RBZGRyZXNzKSB7Ci0JCXRoaXMubGFiZWxIb3N0QWRkcmVzcyA9IGxhYmVsSG9zdEFkZHJlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxIb3N0UG9ydChTdHJpbmcgbGFiZWxIb3N0UG9ydCkgewotCQl0aGlzLmxhYmVsSG9zdFBvcnQgPSBsYWJlbEhvc3RQb3J0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsSXNQYXNzd29yZEJhc2VkKFN0cmluZyBsYWJlbElzUGFzc3dvcmRCYXNlZCkgewotCQl0aGlzLmxhYmVsSXNQYXNzd29yZEJhc2VkID0gbGFiZWxJc1Bhc3N3b3JkQmFzZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxJc1B1YmxpY0tleUJhc2VkKFN0cmluZyBsYWJlbElzUHVibGljS2V5QmFzZWQpIHsKLQkJdGhpcy5sYWJlbElzUHVibGljS2V5QmFzZWQgPSBsYWJlbElzUHVibGljS2V5QmFzZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxQYXNzcGhyYXNlKFN0cmluZyBsYWJlbFBhc3NwaHJhc2UpIHsKLQkJdGhpcy5sYWJlbFBhc3NwaHJhc2UgPSBsYWJlbFBhc3NwaHJhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxQYXNzd29yZChTdHJpbmcgbGFiZWxQYXNzd29yZCkgewotCQl0aGlzLmxhYmVsUGFzc3dvcmQgPSBsYWJlbFBhc3N3b3JkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsUHVibGljS2V5UGF0aChTdHJpbmcgbGFiZWxQdWJsaWNLZXlQYXRoKSB7Ci0JCXRoaXMubGFiZWxQcml2YXRlS2V5UGF0aCA9IGxhYmVsUHVibGljS2V5UGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFB1YmxpY0tleVBhdGhCdXR0b24oU3RyaW5nIGxhYmVsUHVibGljS2V5UGF0aEJ1dHRvbikgewotCQl0aGlzLmxhYmVsUHVibGljS2V5UGF0aEJ1dHRvbiA9IGxhYmVsUHVibGljS2V5UGF0aEJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFB1YmxpY0tleVBhdGhUaXRsZShTdHJpbmcgbGFiZWxQdWJsaWNLZXlQYXRoVGl0bGUpIHsKLQkJdGhpcy5sYWJlbFByaXZhdGVLZXlQYXRoVGl0bGUgPSBsYWJlbFB1YmxpY0tleVBhdGhUaXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFNob3dBZHZhbmNlZE9wdGlvbnMoU3RyaW5nIGxhYmVsU2hvd0FkdmFuY2VkT3B0aW9ucykgewotCQl0aGlzLmxhYmVsU2hvd0FkdmFuY2VkT3B0aW9ucyA9IGxhYmVsU2hvd0FkdmFuY2VkT3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRpbWVvdXQoU3RyaW5nIGxhYmVsVGltZW91dCkgewotCQl0aGlzLmxhYmVsVGltZW91dCA9IGxhYmVsVGltZW91dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFVzZXJOYW1lKFN0cmluZyBsYWJlbFVzZXJOYW1lKSB7Ci0JCXRoaXMubGFiZWxVc2VyTmFtZSA9IGxhYmVsVXNlck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxDaXBoZXJUeXBlKFN0cmluZyBsYWJlbENpcGhlclR5cGUpIHsKLQkJdGhpcy5sYWJlbENpcGhlclR5cGUgPSBsYWJlbENpcGhlclR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiN2JhMmQzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0F1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQkvLyBGSVhNRSB3cm9uZyByZWZlcmVuY2UgdG8gYnVuZGxlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuYXV0aF9mcmFtZV9tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX0J1dHRvbl9IaWRlQWR2YW5jZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9CdXR0b25fUHJpdmF0ZUtleVBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9CdXR0b25fU2hvd0FkdmFuY2VkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZU1vbGRfQ29tYm9fQ2lwaGVyVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX0ZpZWxkX0hvc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9QYXNzcGhyYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfUGFzc3dvcmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9Qb3J0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfVGltZW91dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX0ZpZWxkX1VzZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9PcHRpb25fbG9jYWxob3N0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZU1vbGRfT3B0aW9uX1Bhc3N3b3JkQXV0aGVudGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9PcHRpb25fUHVibGljS2V5QXV0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX09wdGlvbl9SZW1vdGVob3N0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZU1vbGRfU2VsZWN0aW9uV2luZG93X0xhYmVsX1ByaXZhdGVLZXlQYXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZU1vbGRfU2VsZWN0aW9uV2luZG93X1RpdGxlX1ByaXZhdGVLZXlQYXRoOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgQXV0aGVudGljYXRpb25GcmFtZU1vbGRNZXNzYWdlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Db21ib0dyb3VwLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Db21ib0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjMmIxMDQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQ29tYm9Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIENvbWJvYm94IGJhc2VkIGdyb3VwCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0dyb3VwIGV4dGVuZHMgR2VuZXJpY0NvbnRyb2xHcm91cCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSBDb21iby5MSU1JVDsKLQkKLQlDb21ibyBjb21ibzsKLQkKLQkvLyBBcnJheSB0aGF0IGtlZXAgdHJhY2sgb2YgdGhlIGNvbWJvIGl0ZW1zLiBJdHMgaW5kZXggaXMgYmFzZWQgb24gdGhlIGNvbWJvIGluZGV4LgotCVZlY3RvciBjb21ib0l0ZW1zID0gbmV3IFZlY3RvcigpOwotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbW9sZAotCSAqLwotCXB1YmxpYyBDb21ib0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIEdlbmVyaWNDb250cm9sTW9sZCBtb2xkKSB7Ci0JCXN1cGVyKHBhcmVudCwgbW9sZCk7Ci0KLQkJQ29tYm9Nb2xkIGNtb2xkID0gKENvbWJvTW9sZCltb2xkOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNtb2xkLml0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tYm9Hcm91cEl0ZW0gaXRlbSA9IChDb21ib0dyb3VwSXRlbSkgaXRlci5uZXh0KCk7Ci0JCQlhZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21Db250cm9sKGludCBiaXRtYXNrLCBHcmlkRGF0YSBnZCkgewotCQkKLQkJaWYoKGJpdG1hc2sgJiBDb21ib01vbGQuRURJVEFCTEUpICE9IDApIHsKLQkJCWNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJY29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQl9CQkKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXB1YmxpYyBDb21ibyBnZXRDb21ibygpIHsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb25JZCgpIHsKLQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEl0ZW1Vc2luZ0luZGV4KGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpLmdldElkKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uSW5kZXgoaW50IGluZGV4KSB7Ci0JCWNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChDb21ib0dyb3VwSXRlbSBjb21ib0l0ZW0pIHsKLQkJY29tYm9JdGVtcy5hZGQoY29tYm9JdGVtKTsKLQkJY29tYm8uYWRkKGNvbWJvSXRlbS52YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChDb21ib0dyb3VwSXRlbSBjb21ib0l0ZW0sIGludCBpbmRleCkgewotCQljb21ib0l0ZW1zLmFkZChpbmRleCwgY29tYm9JdGVtKTsKLQkJY29tYm8uYWRkKGNvbWJvSXRlbS52YWx1ZSwgaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgYW4gaXRlbSB1c2luZyB0aGUgaXRlbSBpZC4KLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIEEgQ29tYm9Hcm91cEl0ZW0gb3IgbnVsbCBpZiB0aGUgaWQgZG9lc24ndCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Hcm91cEl0ZW0gZ2V0SXRlbVVzaW5nSUQoU3RyaW5nIGlkKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gY29tYm9JdGVtcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbWJvR3JvdXBJdGVtIGNpdGVtID0gKENvbWJvR3JvdXBJdGVtKWl0Lm5leHQoKTsKLQkJCWlmKGNpdGVtLmlkLmVxdWFscyhpZCkpIHsKLQkJCQlyZXR1cm4gY2l0ZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdEluZGV4VXNpbmdJRChTdHJpbmcgaWQpIHsKLQkJSXRlcmF0b3IgaXQgPSBjb21ib0l0ZW1zLml0ZXJhdG9yKCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJQ29tYm9Hcm91cEl0ZW0gY2l0ZW0gPSAoQ29tYm9Hcm91cEl0ZW0paXQubmV4dCgpOwotCQkJaWYoY2l0ZW0uaWQuZXF1YWxzKGlkKSkgewotCQkJCWNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW5kZXgrKzsKLQkJfQotCQlpZihjb21ib0l0ZW1zLnNpemUoKSA+IDApCi0JCQljb21iby5zZWxlY3QoMCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHtAbGluayBDb21ib0dyb3VwSXRlbX0gbG9jYXRlZCBhdCBpbmRleCAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbWJvR3JvdXBJdGVtIGdldEl0ZW1Vc2luZ0luZGV4KGludCBpbmRleCkgewotCQlpZihpbmRleCA8IDAgfHwgY29tYm9JdGVtcy5nZXQoaW5kZXgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IENvbWJvR3JvdXBJdGVtKCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gKENvbWJvR3JvdXBJdGVtKWNvbWJvSXRlbXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIENvbWJvR3JvdXBJdGVtIGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGdldEl0ZW1Vc2luZ0luZGV4KGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0NvbWJvR3JvdXBJdGVtLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Db21ib0dyb3VwSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGQ3OTI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0NvbWJvR3JvdXBJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb21ib0dyb3VwSXRlbSB7Ci0JcHVibGljIFN0cmluZyBpZDsKLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyBDb21ib0dyb3VwSXRlbShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0JCi0JcHVibGljIENvbWJvR3JvdXBJdGVtKENvbWJvR3JvdXBJdGVtIGl0ZW0pIHsKLQkJdGhpcy5pZCA9IGl0ZW0uaWQ7Ci0JCXRoaXMudmFsdWUgPSBpdGVtLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0NvbWJvTW9sZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQ29tYm9Nb2xkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ZjUzN2IuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQ29tYm9Nb2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgcmljaGFyZG0KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib01vbGQgZXh0ZW5kcyBHZW5lcmljQ29udHJvbE1vbGQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEhfUFJPUE9SVElPTkFMX05VTV9DSEFSUyA9IDEgPDwgaW5kZXgrKzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRBQkxFID0gMSA8PCBpbmRleCsrOwotCi0JTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlpbnQgc2l6ZSA9IC0xOwotCQotCXB1YmxpYyBDb21ib01vbGQoKSB7Ci0JCXN1cGVyKDApOwotCX0KLQkKLQlwdWJsaWMgQ29tYm9Nb2xkKGludCBiaXRtYXNrKSB7Ci0JCXN1cGVyKGJpdG1hc2spOwotCX0KLQotCXB1YmxpYyBDb21ib01vbGQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKDAsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgQ29tYm9Nb2xkKGludCBiaXRtYXNrLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIoYml0bWFzaywgbGFiZWwpOwotCX0KLQotLy8JcHVibGljIENvbWJvTW9sZChpbnQgYml0bWFzaywgU3RyaW5nIGxhYmVsLCBTdHJpbmcgW10gaXRlbXMpIHsKLS8vCQlzdXBlcihiaXRtYXNrLCBsYWJlbCk7Ci0vLwkJc2V0SXRlbXMoaXRlbXMpOwotLy8JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gZW50cmllcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBlbnRyaWVzW2ldOwotCQkJdGhpcy5pdGVtcy5hZGQobmV3IENvbWJvR3JvdXBJdGVtKG51bGwsIHN0cmluZykpOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRJdGVtKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLml0ZW1zLmFkZChuZXcgQ29tYm9Hcm91cEl0ZW0oa2V5LCB2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEZpZWxkV2lkdGgoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRGaWVsZFdpZHRoKGludCBzaXplKSB7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JCWlmIChzaXplID4gMCkgewotCQkJYWRkQml0bWFzayhXSURUSF9QUk9QT1JUSU9OQUxfTlVNX0NIQVJTKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUJpdG1hc2soV0lEVEhfUFJPUE9SVElPTkFMX05VTV9DSEFSUyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzSGVpZ2h0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzV2lkdGgoKSB7Ci0JCXJldHVybiAoYml0bWFzayAmIFdJRFRIX1BST1BPUlRJT05BTF9OVU1fQ0hBUlMpICE9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvQ29udHJvbHNSZWxhdGlvbnNoaXBIYW5kbGVyLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Db250cm9sc1JlbGF0aW9uc2hpcEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY0MTJlNC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Db250cm9sc1JlbGF0aW9uc2hpcEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBoYW5kbGVyIGNsYXNzIHByb3ZpZGVzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGRlcGVuZGVudAotICogb24gYnV0dG9ucyBzdGF0ZS4KLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xzUmVsYXRpb25zaGlwSGFuZGxlciB7Ci0KLQlNYXAgY29udHJvbHNSZWxhdGlvbnNoaXA7Ci0JQ29udHJvbFJlbGF0aW9uc2hpcExpc3RlbmVyIGNvbnRyb2xIYW5kbGVyOwotCWJvb2xlYW4gZW5hYmxlV2hlbk1hc3RlckVuYWJsZWQ7Ci0JCi0JLyoqCi0JICogQnVpbGRzIHRoZSBoYW5kbGVyIGZyb20gdXNpbmcgYSB7QGxpbmsgTWFwfSB0aGF0IGNvbnRhaW5zIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIG1hc3RlciBjb250cm9sIGFuZAotCSAqIGEgTGlzdCBvZiBzbGF2ZSBjb250cm9scy4gVGhlIHNsYXZlIGNvbnRyb2xzIG9uIHRoZSBsaXN0IG9ubHkgd2lsbCBiZSBlbmFibGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgbWFzdGVyIGNvbnRyb2wgaXMKLQkgKiBzZWxlY3RlZC4gCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2xzUmVsYXRpb25zaGlwIHtAbGluayBNYXB9IEEgbWFwIGNvbnRhaW5pbmcgdGhlIHJlbGF0aW9uICAKLQkgKiBAcGFyYW0gZW5hYmxlV2hlbk1hc3RlckVuYWJsZWQgYm9vbGVhbiBGbGFnIHRoYXQgbGV0IHRoZSB1c2VyIGNob29zZSBiZXR3ZWVuIGVuYWJsZSBjb250cm9scyB3aGVuIHRoZSBtYXN0ZXIgY29udHJvbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCi0JICovCi0JcHVibGljIENvbnRyb2xzUmVsYXRpb25zaGlwSGFuZGxlcihNYXAgY29udHJvbHNSZWxhdGlvbnNoaXAsIGJvb2xlYW4gZW5hYmxlV2hlbk1hc3RlckVuYWJsZWQpIHsKLQkJdGhpcy5jb250cm9sc1JlbGF0aW9uc2hpcCA9IGNvbnRyb2xzUmVsYXRpb25zaGlwOwotCQljb250cm9sSGFuZGxlciA9IG5ldyBDb250cm9sUmVsYXRpb25zaGlwTGlzdGVuZXIoKTsKLQkJdGhpcy5lbmFibGVXaGVuTWFzdGVyRW5hYmxlZCA9IGVuYWJsZVdoZW5NYXN0ZXJFbmFibGVkOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCB0aGUgaGFuZGxlciB1c2luZyBhbiBlbXB0eSByZWxhdGlvbiBtYXAuCi0JICoKLQkgKi8KLQlwdWJsaWMgQ29udHJvbHNSZWxhdGlvbnNoaXBIYW5kbGVyKCkgewotCQl0aGlzKG5ldyBIYXNoTWFwKCksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgaGFuZGxlciBhbmQgYWRkIGEgcmVsYXRpb25zaGlwLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBmb3IgY2hlY2tib3ggY29udHJvbHMgdGhhdAotCSAqIGVuYWJsZS9kaXNhYmxlIHRoZSBpbnRlcmZhY2UKLQkgKiAKLQkgKiBAcGFyYW0gbWFzdGVyCi0JICogQHBhcmFtIHNsYXZlcwotCSAqLwotCXB1YmxpYyBDb250cm9sc1JlbGF0aW9uc2hpcEhhbmRsZXIoQnV0dG9uIG1hc3RlciwgQ29udHJvbCBbXSBzbGF2ZXMsIGJvb2xlYW4gZW5hYmxlV2hlblRydWUpIHsKLQkJdGhpcyhuZXcgSGFzaE1hcCgpLCBlbmFibGVXaGVuVHJ1ZSk7Ci0JCWFkZENvbnRyb2xSZWxhdGlvbnNoaXAobWFzdGVyLCBzbGF2ZXMpOwotCX0KLQkKLQlwdWJsaWMgQ29udHJvbHNSZWxhdGlvbnNoaXBIYW5kbGVyKEJ1dHRvbiBtYXN0ZXIsIENvbnRyb2wgc2xhdmUsIGJvb2xlYW4gZW5hYmxlV2hlblRydWUpIHsKLQkJdGhpcyhuZXcgSGFzaE1hcCgpLCBlbmFibGVXaGVuVHJ1ZSk7Ci0JCWFkZENvbnRyb2xSZWxhdGlvbnNoaXAobWFzdGVyLCBzbGF2ZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1hc3RlciBhbmQgc2xhdmVzLCBzbyB0aGUgc2xhdmVzIHdpbGwgb25seSBiZSBlbmFibGVkIHdoZW4KLQkgKiB0aGUgbWFzdGVyIGlzIHNlbGVjdGVkLiAKLQkgKiAKLQkgKiBAcGFyYW0gbWFzdGVyCi0JICogQHBhcmFtIHNsYXZlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnRyb2xSZWxhdGlvbnNoaXAoQnV0dG9uIG1hc3RlciwgQ29udHJvbCBbXSBzbGF2ZXMpIHsKLQkJY29udHJvbHNSZWxhdGlvbnNoaXAucHV0KG1hc3Rlciwgc2xhdmVzKTsKLQkJbWFzdGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbnRyb2xIYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250cm9sUmVsYXRpb25zaGlwKEJ1dHRvbiBtYXN0ZXIsIENvbnRyb2wgc2xhdmUpIHsKLQkJY29udHJvbHNSZWxhdGlvbnNoaXAucHV0KG1hc3RlciwgbmV3IENvbnRyb2xbXSB7IHNsYXZlIH0pOwotCQltYXN0ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29udHJvbEhhbmRsZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRyb2xSZWxhdGlvbnNoaXAoQnV0dG9uIG1hc3RlcikgewotCQljb250cm9sc1JlbGF0aW9uc2hpcC5yZW1vdmUobWFzdGVyKTsKLQkJbWFzdGVyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGNvbnRyb2xIYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIHRoZSBjb250cm9scyBkZXBlbmRlbnQgb24gdGhlIHNlbGVjdGVkIGNvbnRyb2wgYW5kIGRpc2FibGVzIGFsbCB0aGUgb3RoZXJzCi0JICogQHBhcmFtIGJ0biBCdXR0b24gQ29udHJvbCB0aGF0IGdlbmVyYXRlZCBhIFNlbGVjdGlvbkV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbWFuYWdlRGVwZW5kZW50Q29udHJvbHMoQnV0dG9uIGJ0bikgewotCQkvLyBJdGVyYXRlcyBvdmVyIGFsbCB0aGUgTWFwIGtleXMgdG8gZ2V0IGFzc29jaWF0ZWQgY29udHJvbHMKLQkJU2V0IG1hc3RlclNldCA9IGNvbnRyb2xzUmVsYXRpb25zaGlwLmtleVNldCgpOwotCQlJdGVyYXRvciBpdCA9IG1hc3RlclNldC5pdGVyYXRvcigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCS8vIEdldCB0aGUgbGlzdCBvZiBjb250cm9scyBvZiByZWxhdGVkIHRvIHRoZSBrZXkKLQkJCUJ1dHRvbiBtYXN0ZXIgPSAoQnV0dG9uKWl0Lm5leHQoKTsKLQkJCQotCQkJLy8gTGlzdCBjYW4gYmUgbnVsbAotCQkJT2JqZWN0IG9iaiA9IGNvbnRyb2xzUmVsYXRpb25zaGlwLmdldChtYXN0ZXIpOwotCQkJaWYob2JqICE9IG51bGwpIHsKLQkJCQlDb250cm9sIFtdIGNvbnRyb2xMaXN0ID0gKENvbnRyb2wgW10pb2JqOwotCQkJCQotCQkJCS8vIEVuYWJsZSBhbGwgY29udHJvbHMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUga2V5IHJlY2VpdmVkIGFzIHBhcmFtZXRlci4KLQkJCQlmb3IoaW50IGk9MDsgaSA8IGNvbnRyb2xMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmKGJ0biA9PSBtYXN0ZXIgJiYgYnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQljb250cm9sTGlzdFtpXS5zZXRFbmFibGVkKGVuYWJsZVdoZW5NYXN0ZXJFbmFibGVkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbnRyb2xMaXN0W2ldLnNldEVuYWJsZWQoIWVuYWJsZVdoZW5NYXN0ZXJFbmFibGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIENvbnRyb2xSZWxhdGlvbnNoaXBMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLQkJCW1hbmFnZURlcGVuZGVudENvbnRyb2xzKChCdXR0b24pYXJnMC53aWRnZXQpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRGlyZWN0b3J5QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0RpcmVjdG9yeUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZjRlODYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRGlyZWN0b3J5QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLQlwdWJsaWMgRGlyZWN0b3J5QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoVGV4dCB0ZXh0LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCi0JCURpcmVjdG9yeURpYWxvZyBkaXJlY3RvcnlEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRleHQuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCQkKLQkJZGlyZWN0b3J5RGlhbG9nLnNldEZpbHRlclBhdGgodGV4dC5nZXRUZXh0KCkpOwotCQlkaXJlY3RvcnlEaWFsb2cuc2V0VGV4dCh0aXRsZSk7Ci0JCQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlkaXJlY3RvcnlEaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQlTdHJpbmcgbmV3UGF0aCA9IGRpcmVjdG9yeURpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKG5ld1BhdGggIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KG5ld1BhdGgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVBbmRXb3Jrc3BhY2VHcm91cC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRmlsZUFuZFdvcmtzcGFjZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmFhNGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRmlsZUFuZFdvcmtzcGFjZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlTm9kZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUFuZFdvcmtzcGFjZUdyb3VwIGV4dGVuZHMgR2VuZXJpY0NvbnRyb2xHcm91cCB7Ci0JRmlsZUFuZFdvcmtzcGFjZU1vbGQgbW9sZDsKLQkKLQlDb21wb3NpdGUgY29udGFpbmVyOwotCUJ1dHRvbiBmaW5kSW5Xb3Jrc3BhY2U7Ci0JVGV4dCBwYXRoOwotCi0JRmlsZXN5c3RlbVRyZWVOb2RlIHBhaSA9IG5ldyBGaWxlc3lzdGVtVHJlZU5vZGUobmV3IEludGVnZXIoMSkpOwotCUZpbGVzeXN0ZW1UcmVlTm9kZSBmaWxobzEgPSBuZXcgRmlsZXN5c3RlbVRyZWVOb2RlKG5ldyBTdHJpbmcoImZpbGhvMSIpKTsgLy8kTk9OLU5MUy0xJAotCUZpbGVzeXN0ZW1UcmVlTm9kZSBmaWxobzIgPSBuZXcgRmlsZXN5c3RlbVRyZWVOb2RlKG5ldyBTdHJpbmcoImZpbGhvMiIpKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBjbGFzcyBGaWxlc3lzdGVtVHJlZU5vZGUgZXh0ZW5kcyBUcmVlTm9kZSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCXJldHVybiB2YWx1ZS50b1N0cmluZygpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBGaWxlc3lzdGVtVHJlZU5vZGUoT2JqZWN0IHZhbHVlKSB7Ci0JCQlzdXBlcih2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBtb2xkCi0JICovCi0JcHJpdmF0ZSBGaWxlQW5kV29ya3NwYWNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgRmlsZUFuZFdvcmtzcGFjZU1vbGQgbW9sZCkgewotCQlzdXBlcihwYXJlbnQsIG1vbGQpOwotCQl0aGlzLm1vbGQgPSBtb2xkOwotCQkKLQkJZmluZEluV29ya3NwYWNlLnNldFRleHQobW9sZC53b3Jrc3BhY2VMYWJlbCk7Ci0JCWdldEJ1dHRvbigpLnNldFRleHQobW9sZC5idXR0b25MYWJlbCk7Ci0KLQkJcGFpLnNldENoaWxkcmVuKG5ldyBUcmVlTm9kZVtde2ZpbGhvMSwgZmlsaG8yfSk7Ci0JCQotCQlnZW5lcmF0ZUJ1dHRvbnNIYW5kbGVyKG1vbGQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUJ1dHRvbnNIYW5kbGVyKEZpbGVBbmRXb3Jrc3BhY2VNb2xkIG1vbGQyKSB7Ci0JCS8vIElmIGJpdCBJU19ESVJFQ1RPUlkgaXMgb24sIHJlZ2lzdGVyIGEgZGlyZWN0b3J5IGhhbmRsZXIKLQkJLy8gZm9yIGJvdGggYnV0dG9ucy4KLQkJU2VsZWN0aW9uQWRhcHRlciBicm93c2VTZWxlY3Rpb25MaXN0ZW5lcjsKLQkJaWYoKG1vbGQuYml0bWFzayAmIEZpbGVBbmRXb3Jrc3BhY2VNb2xkLkRJUkVDVE9SWV9TRUxFQ1RJT04pICE9IDApIHsKLQkJCWJyb3dzZVNlbGVjdGlvbkxpc3RlbmVyID0gCi0JCQkJbmV3IERpcmVjdG9yeUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKHBhdGgsIG1vbGQuYnJvd3NlV2luZG93TGFiZWwsIG1vbGQuYnJvd3NlV2luZG93TWVzc2FnZSk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCS8vIEVsc2UgcmVnaXN0ZXIgYSBmaWxlIGhhbmRsZXIKLQkJCWJyb3dzZVNlbGVjdGlvbkxpc3RlbmVyID0gCi0JCQkJbmV3IEZpbGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcihwYXRoLCBtb2xkLmJyb3dzZVdpbmRvd0xhYmVsKTsKLQkJfQotCQlnZXRCdXR0b24oKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihicm93c2VTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvLy9vcmcuZWNsaXBzZS51aS5kaWFsb2dzLgotCQlmaW5kSW5Xb3Jrc3BhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyB0cmVlU2VsZWN0ID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIG5ldyBMYWJlbFByb3ZpZGVyKCksIG5ldyBUcmVlTm9kZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCQkvL3RyZWVTZWxlY3Quc2V0SW5wdXQobmV3IFRyZWVOb2RlIFtde3BhaX0pOwotCQkJCQotCQkJCUZpbGUgd29ya3NwYWNlID0gbmV3IEZpbGUoIi9ob21lL3JpY2hhcmRtL3RtcCIpOyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZXN5c3RlbVRvVHJlZU1hcHBlciB0cmVlTWFwcGVyID0gbmV3IEZpbGVzeXN0ZW1Ub1RyZWVNYXBwZXIoKTsKLQkJCQl0cmVlU2VsZWN0LnNldElucHV0KG5ldyBUcmVlTm9kZSBbXXt0cmVlTWFwcGVyLmZpbGVzeXN0ZW1UcmVlRmFjdG9yeSh3b3Jrc3BhY2UpfSk7Ci0JCQkJLy90cmVlU2VsZWN0LnNlCi0JCQkJCi0JCQkJdHJlZVNlbGVjdC5vcGVuKCk7Ci0JCQkJCi0JCQkJVHJlZU5vZGUgc2VsTm9kZTsKLQkJCQlpZigoc2VsTm9kZSA9IChUcmVlTm9kZSl0cmVlU2VsZWN0LmdldEZpcnN0UmVzdWx0KCkpICE9IG51bGwpIHsKLQkJCQkJcGF0aC5zZXRUZXh0KHNlbE5vZGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvLy9maW5kSW5Xb3Jrc3BhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3ICkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY2VsbC51aS5zd3QuR2VuZXJpY0NvbnRyb2xHcm91cCNjcmVhdGVDdXN0b21Db250cm9sKGludCwgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21Db250cm9sKGludCBiaXRtYXNrLCBHcmlkRGF0YSBncmlkRGF0YSkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJCi0JCS8vIFNldCBsYXlvdXQKLQkJR3JpZExheW91dCBjb250YWluZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29udGFpbmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29udGFpbmVyTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNTsKLQkJY29udGFpbmVyTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbnRhaW5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJLy9jb250YWluZXJMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCQotCQljb250YWluZXIuc2V0TGF5b3V0KGNvbnRhaW5lckxheW91dCk7Ci0JCQotCQkvLyBTZXQgZ3JpZCBkYXRhCi0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJCi0JCS8vIENyZWF0ZSBncmlkZGF0YSBmb3IgdGhlIGNvbnRyb2xzCi0JCUdyaWREYXRhIHBhdGhHRCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQkJR3JpZERhdGEgd29ya3BsYWNlR0QgPSBHcmlkRGF0YUZhY3RvcnkuY29weURhdGEocGF0aEdEKTsKLQkJd29ya3BsYWNlR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQkKLQkJLy8gSW5zZXJ0IHRleHQgYW5kIGJ1dHRvbiBpbnNpZGUgdGhlIGNvbnRhaW5lcgotCQlwYXRoID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXBhdGguc2V0TGF5b3V0RGF0YShwYXRoR0QpOwotCQlmaW5kSW5Xb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlmaW5kSW5Xb3Jrc3BhY2Uuc2V0TGF5b3V0RGF0YSh3b3JrcGxhY2VHRCk7Ci0JCQotCQkKLQkJCi0JCQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwYXRoLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcGF0aC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXBhdGguc2V0VGV4dChzdHJpbmcpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJcmV0dXJuIHBhdGguZ2V0VGV4dCgpOwotCX0KLQkKLQlwdWJsaWMgQnV0dG9uIGdldFdvcmtzcGFjZUJ1dHRvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmluZEluV29ya3NwYWNlOwotCX0KLQkKLQlwdWJsaWMgQnV0dG9uIGdldEJyb3dzZUJ1dHRvbigpIHsKLQkJcmV0dXJuIGdldEJ1dHRvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQotCQlwYXRoLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZpbmRJbldvcmtzcGFjZS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVBbmRXb3Jrc3BhY2VNb2xkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GaWxlQW5kV29ya3NwYWNlTW9sZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWJlNTllLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVBbmRXb3Jrc3BhY2VNb2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi0vKioKLSAqIENvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGEgdGV4dGJveCAod2hpY2ggd2lsbCBiZSB1c2VkIHRvIGVudGVyIGEgcGF0aCkKLSAqIHdpdGggYSBidXR0b24gdG8gZmluZCB0aGUgcGF0aCBpbiB0aGUgd29ya3NwYWNlIGFuZCBhbm90aGVyIHRvIGZpbmQgdGhlCi0gKiBwYXRoIGluIHRoZSBmaWxlc3lzdGVtLiBUaGUgcGF0aCBjYW4gYmUgYSBmaWxlIHBhdGggb3IgYSBkaXJlY3RvcnkgcGF0aC4KLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVBbmRXb3Jrc3BhY2VNb2xkIGV4dGVuZHMgR2VuZXJpY0NvbnRyb2xNb2xkIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVE9SWV9TRUxFQ1RJT04gPSAxIDw8IGluZGV4Kys7Ci0JCi0JU3RyaW5nIHdvcmtzcGFjZUxhYmVsOwotCQotCVN0cmluZyBicm93c2VXaW5kb3dMYWJlbDsKLQlTdHJpbmcgYnJvd3NlV2luZG93TWVzc2FnZTsKLQkKLQlwdWJsaWMgRmlsZUFuZFdvcmtzcGFjZU1vbGQoaW50IGJpdG1hc2ssIFN0cmluZyBsYWJlbCwgU3RyaW5nIHdvcmtzcGFjZUxhYmVsLCBTdHJpbmcgZmlsZUxhYmVsKSB7Ci0JCXN1cGVyKGJpdG1hc2sgfCBHZW5lcmljQ29udHJvbE1vbGQuSEFTQlVUVE9OLCBsYWJlbCk7Ci0JCXNldEJ1dHRvbkxhYmVsKGZpbGVMYWJlbCk7Ci0JCXRoaXMud29ya3NwYWNlTGFiZWwgPSB3b3Jrc3BhY2VMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJyb3dzZVdpbmRvd0xhYmVsKCkgewotCQlyZXR1cm4gYnJvd3NlV2luZG93TGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJvd3NlV2luZG93TGFiZWwoU3RyaW5nIGJyb3dzZVdpbmRvd0xhYmVsKSB7Ci0JCXRoaXMuYnJvd3NlV2luZG93TGFiZWwgPSBicm93c2VXaW5kb3dMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJyb3dzZVdpbmRvd01lc3NhZ2UoKSB7Ci0JCXJldHVybiBicm93c2VXaW5kb3dNZXNzYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJyb3dzZVdpbmRvd01lc3NhZ2UoU3RyaW5nIGJyb3dzZVdpbmRvd01lc3NhZ2UpIHsKLQkJdGhpcy5icm93c2VXaW5kb3dNZXNzYWdlID0gYnJvd3NlV2luZG93TWVzc2FnZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GaWxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWQzM2QwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRmlsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCi0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRmlsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKFRleHQgdGV4dCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCi0JCUZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRleHQuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCi0JCS8qCi0JCSAqIEZpbHRlciBwYXRoIG11c3QgYmUgc2V0IHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZmlsZS4KLQkJICovCi0JCVN0cmluZyBmaWxlTmFtZSA9IHRleHQuZ2V0VGV4dCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZU5hbWUpOwotCQlmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKSk7Ci0JCWZpbGVEaWFsb2cuc2V0VGV4dCh0aXRsZSk7Ci0JCWZpbGVEaWFsb2cuc2V0RmlsZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJCQkKLQkJU3RyaW5nIHJlc3VsdCA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KHJlc3VsdCk7Ci0JCX0KLQl9Ci19Ci0gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRmlsZUdyb3VwLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GaWxlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZlYWQzYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GaWxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlR3JvdXAgZXh0ZW5kcyBUZXh0R3JvdXAgewotCi0JcHVibGljIEZpbGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBGaWxlTW9sZCBtb2xkKSB7Ci0JCXN1cGVyKHBhcmVudCwgbW9sZC5nZXRUZXh0R3JvdXBNb2xkKCkpOwotCQkKLQkJZ2VuZXJhdGVCdXR0b25IYW5kbGVyKG1vbGQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJ1dHRvbkhhbmRsZXIoRmlsZU1vbGQgbW9sZCkgewotCQlTZWxlY3Rpb25MaXN0ZW5lciBidG5saXN0ZW47Ci0JCQotCQlpZigobW9sZC5iaXRtYXNrICYgRmlsZU1vbGQuRElSRUNUT1JZX1NFTEVDVElPTikgIT0gMCkgewotCQkJYnRubGlzdGVuID0gbmV3IERpcmVjdG9yeUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCWdldFRleHQoKSwgbW9sZC5kaWFsb2dMYWJlbCwgbW9sZC5kaWFsb2dNZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCWJ0bmxpc3RlbiA9IG5ldyBGaWxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJCWdldFRleHQoKSwgbW9sZC5kaWFsb2dMYWJlbCk7Ci0JCX0KLQkJCi0JCWdldEJ1dHRvbigpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ0bmxpc3Rlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiB0ZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzKSB7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXRleHQuc2V0VGV4dChzKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVNb2xkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GaWxlTW9sZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjcyYjEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVNb2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLS8qKgotICogTW9sZCB0byBhIHtAbGluayBGaWxlR3JvdXB9LiBUaGlzIGlzbid0IGEgZGVyaXZhdGVkIGNsYXNzCi0gKiBmcm9tIHtAbGluayBUZXh0TW9sZH0gYmVjYXVzZSBzb21lIG9mIHRoZSBpdHMgZmllbGRzIGRvZXNuJ3QgbWFrZSBzZW5zZQotICogZm9yIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTW9sZCBleHRlbmRzIEdlbmVyaWNDb250cm9sTW9sZCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUT1JZX1NFTEVDVElPTiA9IAotCQkxIDw8IGluZGV4Kys7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OX1RFWFQgPSBNZXNzYWdlcy5Ccm93c2VCdXR0b25UZXh0OwotCQotCWludCBiaXRtYXNrOwotCQotCS8qU3RyaW5nIGNvbnRyb2xMYWJlbDsKLQkKLQlib29sZWFuIGxhYmVsQWJvdmU7Ci0JKi8KLQkKLQlTdHJpbmcgY29udHJvbFZhbHVlOwotCQotCVN0cmluZyBkaWFsb2dMYWJlbDsKLQlTdHJpbmcgZGlhbG9nTWVzc2FnZTsKLQkKLQlwdWJsaWMgRmlsZU1vbGQoaW50IGJpdG1hc2ssIFN0cmluZyBsYWJlbCwKLQkJCVN0cmluZyBkaWFsb2dMYWJlbCwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UpIHsKLQkJc3VwZXIoYml0bWFzaywgbGFiZWwpOwotCQl0aGlzLmJpdG1hc2sgPSBiaXRtYXNrOwotCQkvL3RoaXMuY29udHJvbExhYmVsID0gbGFiZWw7Ci0JCS8vdGhpcy5jb250cm9sVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5kaWFsb2dMYWJlbCA9IGRpYWxvZ0xhYmVsOwotCQl0aGlzLmRpYWxvZ01lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFZhbHVlKCkgewotCQlyZXR1cm4gY29udHJvbFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyb2xWYWx1ZShTdHJpbmcgY29udHJvbFZhbHVlKSB7Ci0JCXRoaXMuY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhbG9nTGFiZWwoKSB7Ci0JCXJldHVybiBkaWFsb2dMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFsb2dMYWJlbChTdHJpbmcgZGlhbG9nTGFiZWwpIHsKLQkJdGhpcy5kaWFsb2dMYWJlbCA9IGRpYWxvZ0xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGRpYWxvZ01lc3NhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlhbG9nTWVzc2FnZShTdHJpbmcgZGlhbG9nTWVzc2FnZSkgewotCQl0aGlzLmRpYWxvZ01lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dE1vbGQgZ2V0VGV4dEdyb3VwTW9sZCgpIHsKLQkJCi0JCWludCBiaXRtYXNrID0gdGhpcy5iaXRtYXNrOwotCQkKLQkJLy8gTXVzdCBoYXZlIGJ1dHRvbiEKLQkJYml0bWFzayB8PSBIQVNCVVRUT047CQotCQkKLQkJVGV4dE1vbGQgdG1vbGQgPSBuZXcgVGV4dE1vbGQoYml0bWFzaywgbGFiZWwpOwotCQl0bW9sZC5zZXRCdXR0b25MYWJlbChCVVRUT05fVEVYVCk7Ci0JCQotCQlyZXR1cm4gdG1vbGQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRmlsZXN5c3RlbVRvVHJlZU1hcHBlci5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRmlsZXN5c3RlbVRvVHJlZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjBkN2Q4Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVzeXN0ZW1Ub1RyZWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWNlaXZlcyBhIHRvcCBkaXJlY3RvcnkgYW5kIG1hcHMgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcwotICogKHJlY3Vyc2l2ZWx5KSB0byBhIHRyZWUgc3RydWN0dXJlIHdoZXJlIGVhY2ggbm9kZSBjb3JyZXNwb25kIHRvIGEgZmlsZSBvciBkaXJlY3RvcnkuIAotICogCi0gKiBNYWluIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgdG8gZ2VuZXJhdGUgYSB0cmVlIHRvIGJlIGRpc3BsYXllZCBpbiBhIAotICogRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgd2hvc2UgY29udGVudCBwcm92aWRlciBpcyBhIFRyZWVOb2RlQ29udGVudFByb3ZpZGVyCi0gKiAKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1Ub1RyZWVNYXBwZXIgewotCXB1YmxpYyBGaWxlc3lzdGVtVHJlZU5vZGUgZmlsZXN5c3RlbVRyZWVGYWN0b3J5KEZpbGUgYmFzZWRpcikgewotCQkKLQkJaWYoIWJhc2VkaXIuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJLy8gQ3JlYXRlIGEgbm9kZSBmb3IgdGhlIGJhc2VkaXIKLQkJRmlsZXN5c3RlbVRyZWVOb2RlIGJhc2VOb2RlID0gbmV3IEZpbGVzeXN0ZW1UcmVlTm9kZShiYXNlZGlyKTsKLQkJCi0JCS8vIFN3ZWVwIHRoZSBmaWxlc3lzdGVtIHVuZGVyIGJhc2VkaXIKLQkJYmFzZU5vZGUuc2V0Q2hpbGRyZW4oZ2VuZXJhdGVGaWxlc3lzdGVtVHJlZShiYXNlTm9kZSkpOwotCQkKLQkJcmV0dXJuIGJhc2VOb2RlOwotCX0KLQotCXByaXZhdGUgRmlsZXN5c3RlbVRyZWVOb2RlW10gZ2VuZXJhdGVGaWxlc3lzdGVtVHJlZShGaWxlc3lzdGVtVHJlZU5vZGUgcGFyZW50Tm9kZSkgewotCQkKLQkJTGlzdDxGaWxlc3lzdGVtVHJlZU5vZGU+IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8RmlsZXN5c3RlbVRyZWVOb2RlPigpOwotCQkKLQkJLy8gTGlzdCBkaXIgZW50cmllcwotCQkvL0ZpbGUgZGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLQkJRmlsZSBbXSBkaXJDaGlsZHJlbiA9IHBhcmVudE5vZGUuZ2V0RmlsZSgpLmxpc3RGaWxlcygpOwotCQkKLQkJLy8gSXRlcmF0ZXMgb3ZlciBhbGwgaXRlbXMKLQkJZm9yKGludCBpPTA7IGkgPCBkaXJDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJLy8gVE9ETzogZmlsdGVyIGhlcmUgYmVmb3JlIHByb2Nlc3NpbmcKLQkJCQotCQkJRmlsZXN5c3RlbVRyZWVOb2RlIG5vZGUgPSBuZXcgRmlsZXN5c3RlbVRyZWVOb2RlKGRpckNoaWxkcmVuW2ldKTsKLQkJCW5vZGUuc2V0UGFyZW50KHBhcmVudE5vZGUpOwotCQkJaWYoZGlyQ2hpbGRyZW5baV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCS8vIElmIGRpcmVjdG9yeSwgZ2VuZXJhdGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uCi0JCQkJbm9kZS5zZXRDaGlsZHJlbihnZW5lcmF0ZUZpbGVzeXN0ZW1UcmVlKG5vZGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbm9kZS5zZXRDaGlsZHJlbihudWxsKTsKLQkJCX0KLQkJCWNoaWxkcmVuLmFkZChub2RlKTsKLQkJfQotCQkKLQkJLy8gVHJhbnNmb3JtIGl0IGludG8gYW4gYXJyYXkKLQkJRmlsZXN5c3RlbVRyZWVOb2RlIFtdIHRlbXAgPSBuZXcgRmlsZXN5c3RlbVRyZWVOb2RlW2NoaWxkcmVuLnNpemUoKV07Ci0JCWNoaWxkcmVuLnRvQXJyYXkodGVtcCk7Ci0JCQotCQlyZXR1cm4gdGVtcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GaWxlc3lzdGVtVHJlZU5vZGUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVzeXN0ZW1UcmVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTdmZTRmLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZpbGVzeXN0ZW1UcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZU5vZGU7Ci0KLS8qKgotICogQSBub2RlIG9mIGEgZmlsZXN5c3RlbSB0cmVlIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZXN5c3RlbVRyZWVOb2RlIGV4dGVuZHMgVHJlZU5vZGUgewotCQotCXB1YmxpYyBGaWxlc3lzdGVtVHJlZU5vZGUoRmlsZSBmaWxlT3JEaXJlY3RvcnkpIHsKLQkJc3VwZXIoZmlsZU9yRGlyZWN0b3J5KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvYmplY3Qgc3RvcmVkIGludG8gdGhlIHRyZWUgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIElQYXRoIG9iamVjdAotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiAoRmlsZSlnZXRWYWx1ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRnJhbWUuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhZWEzM2QuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIGZyYW1lIGlzIGEgY3VzdG9taXplZCBjb250YWluZXIgZm9yIGNvbnRyb2xzIHdpdGggbWFueSBhZGRpdGlvbmFsIGZlYXR1cmVzLgotICogVGhlIGZyYW1lIG1heSBiZSB1c2VkIHNpbXBseSB0byBncm91cCBjb250cm9scywgd2l0aG91dCBib3JkZXIgb3IgYWRkaXRpb25hbCBmYWNpbGl0aWVzLiAKLSAqIE9yIGNyZWF0ZSBhIG11bHRpIGNvbHVtbiBsYXlvdXQuCi0gKiBJdCBtYXkgYWxzbyBiZSBjcmVhdGVkIGFzIGEgZnJhbWUgd2l0aCBhIHVzZXItcmVzZXJ2ZWQgYXJlYSwgYSBkZXNjcmlwdGlvbiBhcmVhIGFuZCBhIAotICogaGlkZWFibGUgdXNlci1yZXNlcnZlZCBhcmVhLiBUaGUgZmlyc3Qgb25lIGlzIG9uIHRoZSB0b3AgYW5kIHRoZSBsYXR0ZXIgaXMgb24gdGhlIGJvdHRvbS4gCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwsIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmFtZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlOwotCXByaXZhdGUgQ29tcG9zaXRlIGJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZTsKLQlwcml2YXRlIENvbXBvc2l0ZSBlbmNsb3NpbmdDb250cm9sOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCXByaXZhdGUgTGFiZWwgZGVzY3JpcHRpb25MYWJlbDsKLQlwcml2YXRlIEdyb3VwIGVuY2xvc2luZ0dyb3VwOwotCQotCXByaXZhdGUgYm9vbGVhbiBpc0V4cGFuZGVkTGF5b3V0OwotCQotCS8vIEtlZXAgYWxsIHBvc3NpYmxlIGJ1dHRvbiBsYWJlbHMKLQlwcml2YXRlIFN0cmluZyBleHBhbmRCdXR0b25MYWJlbCA9ICJNb3JlIG9wdGlvbnMiOwotCXByaXZhdGUgU3RyaW5nIHNocmlua0J1dHRvbkxhYmVsID0gIkxlc3Mgb3B0aW9ucyI7Ci0JCi0JcHJpdmF0ZSBpbnQgIGRlYnVnQml0bWFzayA9IFNXVC5Ob25lOy8vU1dULkJPUkRFUjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZnVsbCBmZWF0dXJlZCBmcmFtZSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbW9sZC4KLQkgKiBUaGlzIGlzIHRoZSBtb3N0IGNvbXBsZXRlIGFuZCBtb3N0IGFkdmFuY2VkIHVzZSBvZiB0aGUgRnJhbWUuIFVzZWQKLQkgKiB0eXBpY2FsbHkgdG8gY3JlYXRlIGEgZnJhbWUgd2l0aCBoaWRlYWJsZSBwYW5lbCBhbmQgZXhwbGFuYXRpb24gbWVzc2FnZS4KLQkgKiA8cD4KLQkgKiBUaGUgZnJhbWUgbWF5IGhhdmUgYm9yZGVyIGlmIGNvcnJlc3BvbmRpbmcgYml0IGlzIHNldC4gVGhlIGZyYW1lIGhhcwotCSAqIG1hcmdpbiBpZiBib3JkZXIgaXMgZW5hYmxlZC4gVGhlIGZyYW1lIGhhcyBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbW9sZAotCSAqLwotCXB1YmxpYyBGcmFtZShDb21wb3NpdGUgcGFyZW50LCBGcmFtZU1vbGQgbW9sZCkgewotCQl0aGlzKHBhcmVudCwgbW9sZC5iaXRtYXNrLCBtb2xkLmNvbHVtbnMpOwotCi0JCWlmIChtb2xkLmRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNldERlc2NyaXB0aW9uKG1vbGQuZGVzY3JpcHRpb24pOwotCQl9Ci0JCWlmIChtb2xkLnRpdGxlICE9IG51bGwpIHsKLQkJCXNldFRpdGxlKG1vbGQuZ2V0VGl0bGUoKSk7Ci0JCX0KLQkJaWYgKChtb2xkLmJpdG1hc2sgJiBGcmFtZU1vbGQuSEFTX0VYUEFORCkgIT0gMCAmJiAKLQkJCW1vbGQuZXhwYW5kQnV0dG9uTGFiZWwgIT0gbnVsbCkgewotCQkJc2V0RXhwYW5kQnV0dG9uTGFiZWwobW9sZC5leHBhbmRCdXR0b25MYWJlbCk7Ci0JCX0KLQkJaWYgKChtb2xkLmJpdG1hc2sgJiBGcmFtZU1vbGQuSEFTX0VYUEFORCkgIT0gMCAmJgotCQkJbW9sZC5zaHJpbmtCdXR0b25MYWJlbCAhPSBudWxsKSB7Ci0JCQlzZXRTaHJpbmtCdXR0b25MYWJlbChtb2xkLnNocmlua0J1dHRvbkxhYmVsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGZ1bGwgZmVhdHVyZWQgZnJhbWUgb25seSBiYXNlZCBvbiBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uLgotCSAqIEludGVuZGVkIGZvciBjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoZSBmcmFtZSBhbmQgcHJvdmlkZSB0aGVpciBvd24gbG9naWMKLQkgKiB0byBjb25maWd1cmUgaXRzZWxmIChsaWtlIGl0cyBvd24gbW9sZCkuCi0JICogCi0JICogPHA+Ci0JICogVGhlIGZyYW1lIG1heSBoYXZlIGJvcmRlciBpZiBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQuIFRoZSBmcmFtZSBoYXMKLQkgKiBtYXJnaW4gaWYgYm9yZGVyIGlzIGVuYWJsZWQuIFRoZSBmcmFtZSBoYXMgb25lIG9yIG1vcmUgY29sdW1ucy4KLQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYml0bWFzawotCSAqIEBwYXJhbSBjb2x1bW5zCi0JICovCi0JcHVibGljIEZyYW1lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBiaXRtYXNrLCBpbnQgY29sdW1ucykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJY3JlYXRlQ29udGVudChiaXRtYXNrLCBjb2x1bW5zKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZnJhbWUgdG8gZ3JvdXAgY29udHJvbHMgbG9naWNhbGx5LgotCSAqIFRoZSBmcmFtZSBoYXMgbm8gYm9yZGVyLgotCSAqIFRoZSBmcmFtZSBoYXMgbm8gbWFyZ2luLgotCSAqIFRoZSBmcmFtZSBhcyBvbmUgY29sdW1uLgotCSAqLwotCXB1YmxpYyBGcmFtZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCAwLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmcmFtZSB0byBncm91cCBjb250cm9scyBsb2dpY2FsbHkuCi0JICogVGhlIGZyYW1lIGhhcyBubyBib3JkZXIuCi0JICogVGhlIGZyYW1lIGhhcyBubyBtYXJnaW4uCi0JICogVGhlIGZyYW1lIGFzIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0JICovCi0JcHVibGljIEZyYW1lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zKSB7Ci0JCXRoaXMocGFyZW50LCAwLCBjb2x1bW5zKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmcmFtZSB0byBncm91cCBjb250cm9scyB2aXN1YWxseS4KLQkgKiBUaGUgZnJhbWUgaGFzIGJvcmRlci4KLQkgKiBUaGUgZnJhbWUgaGFzIG1hcmdpbi4KLQkgKi8KLQlwdWJsaWMgRnJhbWUoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMocGFyZW50LCBGcmFtZU1vbGQuSEFTX0ZSQU1FLCAxKTsKLQkJc2V0VGl0bGUodGl0bGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoaW50IGJpdG1hc2ssIGludCBjb2x1bW5zKSB7Ci0JCWNyZWF0ZUVuY2xvc2luZ0NvbnRyb2woYml0bWFzayk7Ci0JCWNyZWF0ZVRvcFVzZXJDb21wb3NpdGUoYml0bWFzaywgY29sdW1ucyk7Ci0JCWNyZWF0ZVNlcGFyYXRvckNvbXBvc2l0ZShiaXRtYXNrKTsKLQkJY3JlYXRlQm90dG9tVXNlckNvbXBvc2l0ZShiaXRtYXNrLCBjb2x1bW5zKTsKLQkJCi0JCWNoYW5nZUV4cGFuZExheW91dChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBzZXR1cCB0aGUgR3JvdXAgY29udHJvbCB0aGF0IGRyYXdzIHRoZSBmcmFtZSB3aXRoIHRoZSB0aXRsZS4KLQkgKiBPbmx5IGNyZWF0ZSB0aGUgZ3JvdXAgaWYgbmVjZXNzYXJ5LiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jbG9zaW5nQ29udHJvbChpbnQgYml0bWFzaykgewotCQlpZiAoKGJpdG1hc2sgJiBGcmFtZU1vbGQuSEFTX0ZSQU1FKSAhPSAwKSB7Ci0JCQkvKgotCQkJICogQ3JlYXRlIHRoZSBncm91cC4gVGhlIEZpbGxMYXlvdXQgaXMgdXNlZCB0byBlbnN1cmUgdGhhdAotCQkJICogdGhlIEdyb3VwIHdpbGwgc3RyZXRjaCBvdmVyIGFsbCBhdmFpbGFibGUgc3BhY2UuCi0JCQkgKi8KLQkJCUZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JCQlmaWxsTGF5b3V0LnR5cGUgPSBTV1QuSE9SSVpPTlRBTDsKLQkJCWZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWZpbGxMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJZmlsbExheW91dC5zcGFjaW5nID0gMDsKLQkJCXRoaXMuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOwotCi0JCQllbmNsb3NpbmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSB8IGRlYnVnQml0bWFzayk7Ci0JCQllbmNsb3NpbmdDb250cm9sID0gZW5jbG9zaW5nR3JvdXA7Ci0JCX0gZWxzZSAgewotCQkJLyoKLQkJCSAqIElmIGZyYW1lIGlzIG5vdCByZXF1aXJlZCwgdGhlbiB1c2UgdGhlIGNvbXBvc2l0ZSBpdHNlbGYgdG8gaG9sZCBjb250ZW50LgotCQkJICogVGhpcyBzYXZlcyByZXNzb3VyY2VzIGJ5IGF2b2luZGluZyB0byBjcmVhdGUgYW4gaW52aXNpYmxlIGZha2UgR3JvdXAuCi0JCQkgKi8KLQkJCWVuY2xvc2luZ0NvbnRyb2wgPSB0aGlzOwotCQl9Ci0JCQotCQkvKgotCQkgKiBTZXQgdGhlIGxheW91dCBmb3IgdGhlIGVuY2xvc2luZyBjb250cm9sLgotCQkgKi8gCi0JCUdyaWRMYXlvdXQgZW5jbG9zaW5nQ29udHJvbExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlmICgoYml0bWFzayAmIEZyYW1lTW9sZC5IQVNfRlJBTUUpICE9IDApIHsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQllbmNsb3NpbmdDb250cm9sTGF5b3V0Lm1hcmdpbkhlaWdodCA9IExheW91dERlZmluaXRpb25zLm1hcmdpbkhlaWdodDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luV2lkdGggPSBMYXlvdXREZWZpbml0aW9ucy5tYXJnaW5XaWR0aDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luUmlnaHQgPSBMYXlvdXREZWZpbml0aW9ucy5tYXJnaW5SaWdodDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luTGVmdCA9IExheW91dERlZmluaXRpb25zLm1hcmdpbkxlZnQ7Ci0JCQllbmNsb3NpbmdDb250cm9sTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IExheW91dERlZmluaXRpb25zLm1hcmdpbkJvdHRvbTsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luVG9wID0gTGF5b3V0RGVmaW5pdGlvbnMubWFyZ2luVG9wOwotCQkJZW5jbG9zaW5nQ29udHJvbExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IExheW91dERlZmluaXRpb25zLmhvcml6b250YWxTcGFjaW5nOwotCQkJZW5jbG9zaW5nQ29udHJvbExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBMYXlvdXREZWZpbml0aW9ucy52ZXJ0aWNhbFNwYWNpbmc7Ci0JCX0gZWxzZSB7Ci0JCQllbmNsb3NpbmdDb250cm9sTGF5b3V0Lm1hcmdpbkhlaWdodCA9IExheW91dERlZmluaXRpb25zLm1hcmdpbkhlaWdodDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luV2lkdGggPSBMYXlvdXREZWZpbml0aW9ucy5tYXJnaW5XaWR0aDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQkJZW5jbG9zaW5nQ29udHJvbExheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBMYXlvdXREZWZpbml0aW9ucy5ob3Jpem9udGFsU3BhY2luZzsKLQkJCWVuY2xvc2luZ0NvbnRyb2xMYXlvdXQudmVydGljYWxTcGFjaW5nID0gTGF5b3V0RGVmaW5pdGlvbnMudmVydGljYWxTcGFjaW5nOwotCQl9Ci0JCWVuY2xvc2luZ0NvbnRyb2wuc2V0TGF5b3V0KGVuY2xvc2luZ0NvbnRyb2xMYXlvdXQpOwotCi0JCS8vIE1ha2UgdGhlIGNvbnRyb2wgZmlsbCBhbGwgYXZhaWxhYmxlIHdpZHRoCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpOwotCQlMYXlvdXQgcGFyZW50TGF5b3V0ID0gcGFyZW50LmdldExheW91dCgpOwotCQlpZiAocGFyZW50TGF5b3V0IGluc3RhbmNlb2YgR3JpZExheW91dCkgewotCQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IChHcmlkRGF0YSkgdGhpcy5nZXRMYXlvdXREYXRhKCk7Ci0JCQlpZiAobGF5b3V0RGF0YSA9PSBudWxsKSB7Ci0JCQkJbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJfQotCQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJdGhpcy5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBtYWluIGNvbXBvc2l0ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9wVXNlckNvbXBvc2l0ZShpbnQgYml0bWFzaywgaW50IGNvbHVtbnMpIHsKLQkJLyoKLQkJICogT25seSBjcmVhdGUgdGhpcyBjb21wb3NpdGUgaWYgYSBkZXNjcmlwdGlvbiBpcyBwcmVzZW50IG9yIGlmIHRoZSBmcmFtZSBpcyBleHBhbmRhYmxlLgotCQkgKiBFbHNlLCB1c2UgdGhlIGVuY2xvc2luZyBncm91cCBpdHNlbGYgdG8gc2F2ZSByZXNzb3VyY2VzLgotCQkgKi8KLQkJYm9vbGVhbiBuZWVkQ29tcG9zaXRlID0gKChiaXRtYXNrICYgRnJhbWVNb2xkLkhBU19ERVNDUklQVElPTikgIT0gMCkgfHwgKChiaXRtYXNrICYgRnJhbWVNb2xkLkhBU19FWFBBTkQpICE9IDApOwotCQlpZiAobmVlZENvbXBvc2l0ZSkgewotCQkJdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShlbmNsb3NpbmdDb250cm9sLCBTV1QuTk9ORSB8IGRlYnVnQml0bWFzayk7Ci0JCQkKLQkJCUdyaWREYXRhIHRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZUxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCXRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZUxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCXRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZUxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJCXRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZUxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlLnNldExheW91dERhdGEodG9wVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YSk7Ci0JCQkKLQkJCUdyaWRMYXlvdXQgdXNlclJlc2VydmVkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCXVzZXJSZXNlcnZlZExheW91dC5tYXJnaW5IZWlnaHQgPSBMYXlvdXREZWZpbml0aW9ucy5tYXJnaW5IZWlnaHQ7Ci0JCQl1c2VyUmVzZXJ2ZWRMYXlvdXQubWFyZ2luV2lkdGggPSBMYXlvdXREZWZpbml0aW9ucy5tYXJnaW5XaWR0aDsKLQkJCXVzZXJSZXNlcnZlZExheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCQl1c2VyUmVzZXJ2ZWRMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCQl1c2VyUmVzZXJ2ZWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJCXVzZXJSZXNlcnZlZExheW91dC5tYXJnaW5Ub3AgPSAwOwotCQkJdXNlclJlc2VydmVkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gTGF5b3V0RGVmaW5pdGlvbnMuaG9yaXpvbnRhbFNwYWNpbmc7Ci0JCQl1c2VyUmVzZXJ2ZWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gTGF5b3V0RGVmaW5pdGlvbnMudmVydGljYWxTcGFjaW5nOwotCQkJdXNlclJlc2VydmVkTGF5b3V0Lm51bUNvbHVtbnMgPSBjb2x1bW5zOwotCQkJdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlLnNldExheW91dCh1c2VyUmVzZXJ2ZWRMYXlvdXQpOwotCQl9IGVsc2UgewotCQkJdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlID0gZW5jbG9zaW5nQ29udHJvbDsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGVuY2xvc2luZ0NvbnRyb2wuZ2V0TGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IGNvbHVtbnM7Ci0JCQlpZiAoKGJpdG1hc2sgJiBGcmFtZU1vbGQuQ09MVU1OU19FUVVBTF9XSURUSCkgIT0gMCkgewotCQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJfQotCQkJZW5jbG9zaW5nQ29udHJvbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCQkKLQl9Ci0JLyoqCi0JICogR2VuZXJhdGUgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2xkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJvdHRvbVVzZXJDb21wb3NpdGUoaW50IGJpdG1hc2ssIGludCBjb2x1bW5zKSB7Ci0JCWlmICgoYml0bWFzayAmIEZyYW1lTW9sZC5IQVNfRVhQQU5EKSAhPSAwKSB7Ci0JCQkvKgotCQkJICogUHV0IHRoZSBzZWNvbmQgdXNlci1yZXNlcnZlZCBjb21wb3NpdGUuCi0JCQkgKi8KLQkJCWJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZW5jbG9zaW5nQ29udHJvbCwgU1dULk5PTkUgfCBkZWJ1Z0JpdG1hc2spOwotCQkJR3JpZERhdGEgYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGVMYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQkJYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGVMYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGVMYXlvdXREYXRhKTsKLQkJCQotCQkJLyoKLQkJCSAqIENyZWF0ZSBhIGdyaWQgbGF5b3V0IHdpdGggbmUgbnVtYmVyIG9mIHJlcXVpcmVkIGNvbHVtbnMKLQkJCSAqIE5vdGUgdGhhdCB3aGVuIG5vIGNvbXBvc2l0ZSB3YXMgY3JlYXRlZCwgdGhlIGxheW91dCBmb3IgdGhlIGVuY2xvc2luZyBjb250cm9sIGlzIG92ZXJyaWRlbi4KLQkJCSAqLwotCQkJR3JpZExheW91dCB1c2VyUmVzZXJ2ZWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJdXNlclJlc2VydmVkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IExheW91dERlZmluaXRpb25zLm1hcmdpbkhlaWdodDsKLQkJCXVzZXJSZXNlcnZlZExheW91dC5tYXJnaW5XaWR0aCA9IExheW91dERlZmluaXRpb25zLm1hcmdpbldpZHRoOwotCQkJdXNlclJlc2VydmVkTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJCXVzZXJSZXNlcnZlZExheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJCXVzZXJSZXNlcnZlZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQkJdXNlclJlc2VydmVkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCQl1c2VyUmVzZXJ2ZWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBMYXlvdXREZWZpbml0aW9ucy5ob3Jpem9udGFsU3BhY2luZzsKLQkJCXVzZXJSZXNlcnZlZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBMYXlvdXREZWZpbml0aW9ucy52ZXJ0aWNhbFNwYWNpbmc7Ci0JCQl1c2VyUmVzZXJ2ZWRMYXlvdXQubnVtQ29sdW1ucyA9IGNvbHVtbnM7Ci0JCQlpZiAoKGJpdG1hc2sgJiBGcmFtZU1vbGQuQ09MVU1OU19FUVVBTF9XSURUSCkgIT0gMCkgewotCQkJCXVzZXJSZXNlcnZlZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJfQotCQkJYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlLnNldExheW91dCh1c2VyUmVzZXJ2ZWRMYXlvdXQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZGVzY3JpcHRpb24gYW5kIHRoZSBidXR0b24gcmVzcG9uc2libGUgZm9yIHNob3dpbmcvaGlkaW5nIHRoZSBib3R0b20gY29tcG9zaXRlLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VwYXJhdG9yQ29tcG9zaXRlKGludCBiaXRtYXNrKSB7Ci0JCS8qCi0JCSAqIFB1dCB0aGUgZGVzY3JpcHRpb24uCi0JCSAqLwotCQlpZiAoKGJpdG1hc2sgJiBGcmFtZU1vbGQuSEFTX0RFU0NSSVBUSU9OKSAhPSAwKSB7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKGVuY2xvc2luZ0NvbnRyb2wsIFNXVC5OT05FIHwgU1dULldSQVAgfCBkZWJ1Z0JpdG1hc2spOwotCQkJR3JpZERhdGEgZGVzY3JpcHRpb25MYWJlTGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGVzY3JpcHRpb25MYWJlTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9ICgoYml0bWFzayAmIEZyYW1lTW9sZC5IQVNfRVhQQU5EKSAhPSAwID8gMSA6IDIpOwotCQkJZGVzY3JpcHRpb25MYWJlTGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCWRlc2NyaXB0aW9uTGFiZUxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJCWRlc2NyaXB0aW9uTGFiZUxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZGVzY3JpcHRpb25MYWJlTGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGRlc2NyaXB0aW9uTGFiZUxheW91dERhdGEpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBQdXQgdGhlIGV4cGFuZCBidXR0b24uCi0JCSAqLwotCQlpZiAoKGJpdG1hc2sgJiBGcmFtZU1vbGQuSEFTX0VYUEFORCkgIT0gMCkgewotCQkJZXhwYW5kQnV0dG9uID0gbmV3IEJ1dHRvbihlbmNsb3NpbmdDb250cm9sLCBTV1QuQlVUVE9OMSk7Ci0JCQlHcmlkRGF0YSBidXR0b25MYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlidXR0b25MYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gKChiaXRtYXNrICYgRnJhbWVNb2xkLkhBU19ERVNDUklQVElPTikgIT0gMCA/IDEgOiAyKTsKLQkJCWJ1dHRvbkxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQkJYnV0dG9uTGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQkJYnV0dG9uTGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQkJYnV0dG9uTGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CT1RUT007Ci0JCQlleHBhbmRCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25MYXlvdXREYXRhKTsKLQkJCWV4cGFuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJY2hhbmdlRXhwYW5kTGF5b3V0KCAhIGlzRXhwYW5kZWRMYXlvdXQpOwotCQkJCQkJYWRqdXN0U2hlbGxTaXplVG9GcmFtZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNob3cgKG9yIGhpZGUpIGJvdHRvbSBjb21wb3NpdGUgYWNjb3JkaW5nIHRvIHZpc2libGUgcGFyYW1ldGVyLgotCSAqIAotCSAqIEBwYXJhbSB2aXNpYmxlIGJvb2xlYW4gRGVmaW5lcyBpZiB0aGUgY29tcG9zaXRlIHdpbGwgYmUgdmlzaWJsZSBvciBub3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUV4cGFuZExheW91dChib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKGJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV4cGFuZEJ1dHRvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlzRXhwYW5kZWRMYXlvdXQgPSB2aXNpYmxlOwotCQkKLQkJR3JpZERhdGEgYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YSA9IChHcmlkRGF0YSkgYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCi0JCWlmKGlzRXhwYW5kZWRMYXlvdXQpIHsKLQkJCS8vIFNob3cgaXQKLQkJCWJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZUxheW91dERhdGEuZXhjbHVkZSA9IGZhbHNlOwotCQkJYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7CQotCQl9IGVsc2UgewotCQkJLy8gSGlkZSBpdAotCQkJYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlTGF5b3V0RGF0YS5leGNsdWRlID0gdHJ1ZTsKLQkJCWJvdHRvbVVzZXJSZXNlcnZlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCQlib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShib3R0b21Vc2VyUmVzZXJ2ZWRDb21wb3NpdGVMYXlvdXREYXRhKTsKLQkJCi0JCXVwZGF0ZUV4cGFuZEJ1dHRvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVFeHBhbmRCdXR0b24oKSB7Ci0JCWlmIChleHBhbmRCdXR0b24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBuZXdMYWJlbCA9IG51bGw7Ci0JCWlmIChpc0V4cGFuZGVkTGF5b3V0KSB7Ci0JCQluZXdMYWJlbCA9IHNocmlua0J1dHRvbkxhYmVsOwotCQl9IGVsc2UgewotCQkJbmV3TGFiZWwgPSBleHBhbmRCdXR0b25MYWJlbDsKLQkJfQotCQlpZiAobmV3TGFiZWwgIT0gbnVsbCkgewotCQkJZXhwYW5kQnV0dG9uLnNldFRleHQobmV3TGFiZWwpOwotCQl9IGVsc2UgewotCQkJZXhwYW5kQnV0dG9uLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2hlbGxTaXplVG9GcmFtZSgpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IGVuY2xvc2luZ0NvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgY3VycmVudFNpemUgPSBlbmNsb3NpbmdDb250cm9sLmdldFNpemUoKTsKLQkJaW50IGRlbHRhWSA9IG5ld1NpemUueSAtIGN1cnJlbnRTaXplLnk7Ci0JCVBvaW50IHNoZWxsU2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlzaGVsbFNpemUueSArPSBkZWx0YVk7Ci0JCWdldFNoZWxsKCkuc2V0U2l6ZShzaGVsbFNpemUpOwotCQlnZXRTaGVsbCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBjb21wb3NpdGUgY29udHJvbCB0aGF0IHJlcHJlc2VudHMgYSByZXNlcnZlZCBzcGFjZSB0byB0aGUgdXNlciBhZGQKLQkgKiBoaXMgY29udHJvbHMuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHRvcCBjb21wb3NpdGUgY29udHJvbAotCSAqIAotCSAqIEByZXR1cm4gQ29tcG9zaXRlIENvbXBvc2l0ZSBjb250cm9sLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0VG9wVXNlclJlc2VydmVkQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdG9wVXNlclJlc2VydmVkQ29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBGYWNpbGl0eSBnZXR0ZXIgZm9yIHtAbGluayAjZ2V0VG9wVXNlclJlc2VydmVkQ29tcG9zaXRlKCl9LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRvcFVzZXJSZXNlcnZlZENvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgY29tcG9zaXRlIGNvbnRyb2wgdGhhdCByZXByZXNlbnRzIGEgcmVzZXJ2ZWQgc3BhY2UgdG8gdGhlIHVzZXIgYWRkCi0JICogaGlzIGNvbnRyb2xzLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBib3R0b20sIGhpZGVhYmxlIGNvbXBvc2l0ZSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gQ29tcG9zaXRlIENvbXBvc2l0ZSBjb250cm9sLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Qm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gYm90dG9tVXNlclJlc2VydmVkQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBpc0V4cGFuZGVkTGF5b3V0OwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVzZXItcmVzZXJ2ZWQgYm90dG9tIGNvbXBvc2l0ZSB2aXNpYmxlIHN0YXRlIAotCSAqIAotCSAqIEBwYXJhbSBleHBhbmRlZCBib29sZWFuIFRydWUgaWYgY29tcG9zaXRlIHdpbGwgYmUgdmlzaWJsZS4gRmFsc2UsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGV4cGFuZGVkKSB7Ci0JCWNoYW5nZUV4cGFuZExheW91dChleHBhbmRlZCk7Ci0JCWFkanVzdFNoZWxsU2l6ZVRvRnJhbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4cGFuZEJ1dHRvbkxhYmVsKCkgewotCQlyZXR1cm4gZXhwYW5kQnV0dG9uTGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kQnV0dG9uTGFiZWwoU3RyaW5nIGV4cGFuZEJ1dHRvbkxhYmVsKSB7Ci0JCWlmIChleHBhbmRCdXR0b24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5GcmFtZV9Ob0V4cGFuZEJ1dHRvbik7Ci0JCX0KLQkJdGhpcy5leHBhbmRCdXR0b25MYWJlbCA9IGV4cGFuZEJ1dHRvbkxhYmVsOwotCQl1cGRhdGVFeHBhbmRCdXR0b24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNocmlua0J1dHRvbkxhYmVsKCkgewotCQlyZXR1cm4gc2hyaW5rQnV0dG9uTGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hyaW5rQnV0dG9uTGFiZWwoU3RyaW5nIHNocmlua0J1dHRvbkxhYmVsKSB7Ci0JCWlmIChleHBhbmRCdXR0b24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5GcmFtZV9Ob0V4cGFuZEJ1dHRvbik7Ci0JCX0KLQkJdGhpcy5zaHJpbmtCdXR0b25MYWJlbCA9IHNocmlua0J1dHRvbkxhYmVsOwotCQl1cGRhdGVFeHBhbmRCdXR0b24oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKGVuY2xvc2luZ0dyb3VwICE9IG51bGwpIHsKLQkJCXJldHVybiBlbmNsb3NpbmdHcm91cC5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBsYWJlbCkgewotCQlpZiAoZW5jbG9zaW5nR3JvdXAgIT0gbnVsbCkgewotCQkJZW5jbG9zaW5nR3JvdXAuc2V0VGV4dChsYWJlbCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLkZyYW1lX05vRW5jbG9zaW5nR3JvdXApOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbkxhYmVsLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWlmIChkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLkZyYW1lX05vRGVzY3JpcHRpb25TZXQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUZpbGxMYXlvdXQgZmlsbExheW91dCA9ICBuZXcgRmlsbExheW91dCgpOwotCQlmaWxsTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlmaWxsTGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCXNoZWxsLnNldExheW91dChmaWxsTGF5b3V0KTsKLQkJCi0JCUZyYW1lTW9sZCBtb2xkID0gbmV3IEZyYW1lTW9sZCgiRnJhbWUgMSIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0vLwkJbW9sZC5zZXREZXNjcmlwdGlvbigiVGhpcyBmcmFtZSBpbGx1c3RyYXRlcyBhIGZyYW1lIHdpdGggc29tZSByYW5kb20gc3R1ZmYgYW5kIGEgbG9uZyBkZXNjcmlwdGlvbi4iKTsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUoc2hlbGwsIG1vbGQpOwotCQkKLQkJc2hlbGwucGFjayh0cnVlKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvRnJhbWVNb2xkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GcmFtZU1vbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmU2ZjA1NS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9GcmFtZU1vbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGNsYXNzIEZyYW1lTW9sZCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgYml0SW5kZXggPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBU19ERVNDUklQVElPTiA9IDEgPDwgYml0SW5kZXgrKzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVNfRlJBTUUgPSAxIDw8IGJpdEluZGV4Kys7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTX0VYUEFORCA9IDEgPDwgYml0SW5kZXgrKzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5TX0VRVUFMX1dJRFRIID0gMSA8PCBiaXRJbmRleCsrOwotCQotCWludCBiaXRtYXNrOwotCQotCVN0cmluZyB0aXRsZTsKLQlTdHJpbmcgZGVzY3JpcHRpb247CQotCWludCBjb2x1bW5zOwotCVN0cmluZyBleHBhbmRCdXR0b25MYWJlbDsKLQlTdHJpbmcgc2hyaW5rQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgRnJhbWVNb2xkKCkgewotCQl0aGlzLmJpdG1hc2sgPSAwOwotCQl0aGlzLmNvbHVtbnMgPSAxOwotCX0KLQkKLQlwdWJsaWMgRnJhbWVNb2xkKFN0cmluZyB0aXRsZSwgYm9vbGVhbiBleHBhbmRhYmxlKSB7Ci0JCXRoaXMuYml0bWFzayA9IChleHBhbmRhYmxlID8gSEFTX0VYUEFORCA6IDApOwotCQl0aGlzLmNvbHVtbnMgPSAxOwotCQlzZXRUaXRsZSh0aXRsZSk7Ci0JfQotCQotCXB1YmxpYyBGcmFtZU1vbGQoU3RyaW5nIHRpdGxlLCBpbnQgY29sdW1ucywgYm9vbGVhbiBleHBhbmRhYmxlKSB7Ci0JCXRoaXMuYml0bWFzayA9IChleHBhbmRhYmxlID8gSEFTX0VYUEFORCA6IDApOwotCQl0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOwotCQlzZXRUaXRsZSh0aXRsZSk7Ci0JfQotCQotCXB1YmxpYyBGcmFtZU1vbGQoU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMuYml0bWFzayA9IDA7Ci0JCXRoaXMuY29sdW1ucyA9IDE7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIEZyYW1lTW9sZChTdHJpbmcgdGl0bGUsIGludCBjb2x1bW5zKSB7Ci0JCXRoaXMuYml0bWFzayA9IDA7Ci0JCXRoaXMuY29sdW1ucyA9IGNvbHVtbnM7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIEZyYW1lTW9sZChpbnQgY29sdW1ucykgewotCQl0aGlzLmJpdG1hc2sgPSAwOwotCQl0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJYml0bWFzayAmPSB+SEFTX0RFU0NSSVBUSU9OOwotCQl9IGVsc2UgewotCQkJYml0bWFzayB8PSBIQVNfREVTQ1JJUFRJT047IAotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE9wdGlvbihpbnQgYml0bWFzaykgewotCQl0aGlzLmJpdG1hc2sgfD0gYml0bWFzazsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlT3B0aW9uKGludCBiaXRtYXNrKSB7Ci0JCXRoaXMuYml0bWFzayAmPSB+Yml0bWFzazsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCWJpdG1hc2sgfD0gSEFTX0ZSQU1FOyAKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1ucygpIHsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1ucyhpbnQgY29sdW1ucykgewotCQl0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kTGFiZWwoKSB7Ci0JCXJldHVybiBleHBhbmRCdXR0b25MYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaHJpbmtCdXR0b25MYWJlbCgpIHsKLQkJcmV0dXJuIHNocmlua0J1dHRvbkxhYmVsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRCdXR0b25MYWJlbChTdHJpbmcgZXhwYW5kTGFiZWwpIHsKLQkJdGhpcy5leHBhbmRCdXR0b25MYWJlbCA9IGV4cGFuZExhYmVsOwotCQl0aGlzLmJpdG1hc2sgfD0gSEFTX0VYUEFORDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hyaW5rQnV0dG9uTGFiZWwoU3RyaW5nIHNocmlua0xhYmVsKSB7Ci0JCXRoaXMuc2hyaW5rQnV0dG9uTGFiZWwgPSBzaHJpbmtMYWJlbDsKLQkJdGhpcy5iaXRtYXNrIHw9IEhBU19FWFBBTkQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1dHRvbkxhYmVscyhTdHJpbmcgZXhwYW5kTGFiZWwsIFN0cmluZyBzaHJpbmtMYWJlbCkgewotCQl0aGlzLnNocmlua0J1dHRvbkxhYmVsID0gc2hyaW5rTGFiZWw7Ci0JCXRoaXMuZXhwYW5kQnV0dG9uTGFiZWwgPSBleHBhbmRMYWJlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9HZW5lcmljQ29udHJvbEdyb3VwLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9HZW5lcmljQ29udHJvbEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2ODI3ZTkuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvR2VuZXJpY0NvbnRyb2xHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgZ2VuZXJpYyBncm91cCBvZiBjb250cm9scyBwcm92aWRlcyBhbiBzdHJ1Y3R1cmUgd2l0aAotICogYW4gb3B0aW9uYWwgbGFiZWwgYW5kIGFuIG9wdGlvbmFsIGJ1dHRvbiBhbmQgcHJvdmlkZXMgc3BhY2UKLSAqIGZvciBhIHVzZXItZGVmaW5lZCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY0NvbnRyb2xHcm91cCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JTGFiZWwgbGFiZWw7Ci0JQnV0dG9uIGJ1dHRvbjsKLQlDb250cm9sIGN1c3RvbUNvbnRyb2w7Ci0JYm9vbGVhbiBidXR0b25FbmFibGVkID0gdHJ1ZTsKLQkKLQlwdWJsaWMgR2VuZXJpY0NvbnRyb2xHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgYml0bWFzaywgaW50IHJvd3MsIGludCBjaGFycykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJY3JlYXRlQ29udGVudHMoYml0bWFzaywgcm93cywgY2hhcnMpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJpY0NvbnRyb2xHcm91cChDb21wb3NpdGUgcGFyZW50LCBHZW5lcmljQ29udHJvbE1vbGQgbW9sZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW50IHJvd3MgPSAwLCBjaGFycyA9IDA7Ci0JCWlmIChtb2xkLmhhc0hlaWdodCgpKSB7Ci0JCQlyb3dzID0gbW9sZC5nZXRIZWlnaHQoKTsKLQkJfQotCQlpZiAobW9sZC5oYXNXaWR0aCgpKSB7Ci0JCQljaGFycyA9IG1vbGQuZ2V0V2lkdGgoKTsKLQkJfQotCQljcmVhdGVDb250ZW50cyhtb2xkLmJpdG1hc2ssIHJvd3MsIGNoYXJzKTsKLQkJCi0JCWlmIChtb2xkLmxhYmVsICE9IG51bGwpIHsKLQkJCXNldExhYmVsKG1vbGQubGFiZWwpOwotCQl9Ci0JCWlmIChtb2xkLmJ1dHRvbkxhYmVsICE9IG51bGwpIHsKLQkJCXNldEJ1dHRvbkxhYmVsKG1vbGQuYnV0dG9uTGFiZWwpOwotCQl9Ci0JCWlmIChtb2xkLnRvb2x0aXAgIT0gbnVsbCkgewotCQkJc2V0VG9vbFRpcChtb2xkLnRvb2x0aXApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKGludCBiaXRtYXNrLCBpbnQgcm93cywgaW50IGNoYXJzKSB7Ci0JCWNyZWF0ZUxheW91dChiaXRtYXNrKTsKLQkJY3JlYXRlTGFiZWwoYml0bWFzayk7Ci0KLQkJLy8gR2VuZXJhdGUgR3JpZERhdGEgZm9yIGNvbnRyb2wKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwkJCi0JCWN1c3RvbUNvbnRyb2wgPSBjcmVhdGVDdXN0b21Db250cm9sKGJpdG1hc2ssIGdkKTsKLQkJaWYgKHJvd3MgPiAwKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gZ2V0Q29udHJvbENoYXJIZWlnaHQoY3VzdG9tQ29udHJvbCkgKiByb3dzOwotCQl9Ci0JCWlmIChjaGFycyA+IDApIHsKLQkJCWdkLndpZHRoSGludCA9IGdldENvbnRyb2xDaGFyV2lkdGgoY3VzdG9tQ29udHJvbCkgKiBjaGFyczsKLQkJfQotCQljdXN0b21Db250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCWNyZWF0ZUJ1dHRvbihiaXRtYXNrKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGxheW91dCBmb3IgdGhlIGVuY2xvc2luZyBjb21wb3NpdGUuLgotCSAqIAotCSAqIEBwYXJhbSBtb2xkCi0JICogQHJldHVybiBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMYXlvdXQoaW50IGJpdG1hc2spIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IExheW91dERlZmluaXRpb25zLm1hcmdpbkhlaWdodDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gTGF5b3V0RGVmaW5pdGlvbnMubWFyZ2luV2lkdGg7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBMYXlvdXREZWZpbml0aW9ucy5ob3Jpem9udGFsU3BhY2luZzsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IExheW91dERlZmluaXRpb25zLnZlcnRpY2FsU3BhY2luZzsKLQkJCi0JCS8qCi0JCSAqIFN0YXJ0IHdpdGggb25lIGNvbHVtbgotCQkgKi8KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkKLQkJLyogCi0JCSAqIEFkZCBhIHNlY29uZCBjb2x1bW4gaWYgdGhlIGxhYmVsIGlzIHNob3duIG9uIHRoZSBsZWZ0LwotCQkgKi8KLQkJaWYoICggKGJpdG1hc2sgJiBHZW5lcmljQ29udHJvbE1vbGQuSEFTX0xBQkVMKSAhPSAwICkgJiYgCi0JCSAgICAoIChiaXRtYXNrICYgR2VuZXJpY0NvbnRyb2xNb2xkLkxBQkVMQUJPVkUpID09IDAgKSApIHsKLQkJCQlsYXlvdXQubnVtQ29sdW1ucysrOwotCQl9Ci0JCQotCQkvKgotCQkgKiBBZGQgb25lIG1vcmUgY29sdW1uIGlmIHRoZSBidXR0b24gaXMgc2hvd24gb24gdGhlIHJpZ2h0LgotCQkgKi8KLQkJaWYoIChiaXRtYXNrICYgR2VuZXJpY0NvbnRyb2xNb2xkLkhBU0JVVFRPTiApICE9IDAgKSB7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucysrOwotCQl9Ci0JCQotCQl0aGlzLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJLyoqCi0JCSAqIFNldCBsYXlvdXQgZGF0YSBpZiBwYXJlbnQgaGFzIGEgR3JpZExheW91dAotCQkgKi8KLQkJaWYgKHRoaXMuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBHcmlkTGF5b3V0KSB7Ci0JCQlpZiAoKGJpdG1hc2sgJiBUZXh0TW9sZC5HUklEX0RBVEFfQUxJR05NRU5UX0ZJTEwpICE9IDAKLQkJCQkJfHwgKGJpdG1hc2sgJiBUZXh0TW9sZC5HUklEX0RBVEFfR1JBQl9FWENFU1NfU1BBQ0UpICE9IDAKLQkJCQkJfHwgKGJpdG1hc2sgJiBUZXh0TW9sZC5HUklEX0RBVEFfU1BBTikgIT0gMCkgewotCQkJCUdyaWREYXRhIGdkcHAgPSBuZXcgR3JpZERhdGEoKTsKLQkJCQkKLQkJCQlpZiggKGJpdG1hc2sgJiBHZW5lcmljQ29udHJvbE1vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMKSAhPSAwKSB7Ci0JCQkJCS8vZ2RwcC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCQkJZ2RwcC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQkJfQotCQkJCQotCQkJCWlmKCAoYml0bWFzayAmIEdlbmVyaWNDb250cm9sTW9sZC5HUklEX0RBVEFfR1JBQl9FWENFU1NfU1BBQ0UpICE9IDApIHsKLQkJCQkJZ2RwcC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCQkJLy9nZHBwLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoIChiaXRtYXNrICYgR2VuZXJpY0NvbnRyb2xNb2xkLkdSSURfREFUQV9TUEFOKSAhPSAwKSB7Ci0JCQkJCUdyaWRMYXlvdXQgZ2xheW91dCA9IChHcmlkTGF5b3V0KXRoaXMuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0KCk7Ci0JCQkJCQotCQkJCQlnZHBwLmhvcml6b250YWxTcGFuID0gZ2xheW91dC5udW1Db2x1bW5zOwotCQkJCX0KLQkJCQl0aGlzLnNldExheW91dERhdGEoZ2RwcCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBsYWJlbCBjb250cm9sIG9uIHRoaXMgY29tcG9zaXRlCi0JICogCi0JICogQHBhcmFtIG1vbGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMYWJlbChpbnQgYml0bWFzaykgewotCQlpZiAoKGJpdG1hc2sgJiBHZW5lcmljQ29udHJvbE1vbGQuSEFTX0xBQkVMKSAhPSAwKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCQotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJCWdkLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCQotCQkJaWYoIChiaXRtYXNrICYgR2VuZXJpY0NvbnRyb2xNb2xkLkxBQkVMQUJPVkUgKQotCQkJCQkhPSAwICkgewotCQkJCWdkLmhvcml6b250YWxTcGFuID0gCi0JCQkJCSgoR3JpZExheW91dCl0aGlzLmdldExheW91dCgpKS5udW1Db2x1bW5zOwkJCQotCQkJfQotCQkKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVzZXItaW1wbGVtZW50ZWQgbWV0aG9kIHRvIGdlbmVyYXRlIGEgY29udHJvbCBvbiB0aGlzCi0JICogY29tcG9zaXRlCi0JICogCi0JICogQHBhcmFtIG1vbGQKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21Db250cm9sKGludCBiaXRtYXNrLCBHcmlkRGF0YSBncmlkRGF0YSk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uKGludCBiaXRtYXNrKSB7Ci0JCS8vIENyZWF0ZSBCdXR0b24gaWYgZGVzaXJlZAotCQlpZiggKGJpdG1hc2sgJiBHZW5lcmljQ29udHJvbE1vbGQuSEFTQlVUVE9OKSAhPSAwKSB7Ci0JCQlidXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5CVVRUT04xKTsKLQkJCQotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuUklHSFQ7Ci0JCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCQlnZC52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb250cm9sQ2hhcldpZHRoKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyAoY29udHJvbCk7Ci0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MgKCk7Ci0JCWludCB3aWR0aCA9IGZtLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0Q29udHJvbENoYXJIZWlnaHQoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDIChjb250cm9sKTsKLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQkJaW50IGhlaWdodCA9IGZtLmdldEhlaWdodCgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCQotCXB1YmxpYyBCdXR0b24gZ2V0QnV0dG9uKCkgewotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wjc2V0RW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZW5hYmxlQnV0dG9uKCk7Ci0JCWlmKGxhYmVsICE9IG51bGwpIHsKLQkJCWxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQkJY3VzdG9tQ29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCdXR0b25FbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmJ1dHRvbkVuYWJsZWQgPSBlbmFibGVkOwotCQllbmFibGVCdXR0b24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUJ1dHRvbigpIHsKLQkJaWYoYnV0dG9uICE9IG51bGwpIHsKLQkJCWJ1dHRvbi5zZXRFbmFibGVkKGJ1dHRvbkVuYWJsZWQgJiYgdGhpcy5nZXRFbmFibGVkKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbGFiZWwuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgdGV4dCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuR2VuZXJpY0NvbnRyb2xHcm91cF9Ob0NvbnRyb2xHcm91cExhYmVsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QnV0dG9uTGFiZWwoKSB7Ci0JCWlmIChidXR0b24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1dHRvbi5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1dHRvbkxhYmVsKFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChidXR0b24gIT0gbnVsbCkgewotCQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLkdlbmVyaWNDb250cm9sR3JvdXBfTm9Db250cm9sR3JvdXBCdXR0b24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnNldFRvb2xUaXBUZXh0KHRleHQpOwotCQlpZiAoYnV0dG9uICE9IG51bGwpIHsKLQkJCWJ1dHRvbi5zZXRUb29sVGlwVGV4dCh0ZXh0KTsKLQkJfSAKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCWxhYmVsLnNldFRvb2xUaXBUZXh0KHRleHQpOwotCQl9IAotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0dlbmVyaWNDb250cm9sTW9sZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvR2VuZXJpY0NvbnRyb2xNb2xkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1ZDg5MTYuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvR2VuZXJpY0NvbnRyb2xNb2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljQ29udHJvbE1vbGQgewotCWludCBiaXRtYXNrOwotCi0JLyoqCi0JICogVGhpcyBmaWVsZCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2MgYml0c2V0IGZpZWxkcy4gSXQgd2lsbCBhbHdheXMKLQkgKiByZXByZXNlbnQgdGhlIHNtYWxsZXIgYml0c2V0IGluZGV4IGF2YWlsYWJsZS4gSXRzIG5hbWUgY29tZXMgZnJvbSB0aGUKLQkgKiBhYmJyIG9mIGV4cG9uZW50LCBiZWNhdXNlIGl0IGluZGljYXRlcyB0aGUgbiBpbiB0aGUgZXhwb25lbnRpYXRpb24KLQkgKiBleHAoMixuKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGluZGV4ID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCQotCS8qKiBBIGxhYmVsIGlzIHNob3duIGFib3ZlIG9yIG9uIHRoZSBsZWZ0IChkZWZhdWx0KSBvZiB0aGUgY29tcG9uZW50LiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBU19MQUJFTCA9IDEgPDwgaW5kZXgrKzsKLQotCS8qKiBBIGxhYmVsIGlzIHNob3duIGFib3ZlIHRoZSBjb21wb25lbnQuIEhhcyBlZmZlY3Qgb25seSB3aGVuIEhBU19MQUJFTCBpcyBzZXQuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxBQk9WRSA9IDEgPDwgaW5kZXgrKzsKLQotCS8qKiBBIHRvb2x0aXAgaXMgc2hvd24gd2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciB0aGUgY29tcG9uZW50LiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBU1RPT0xUSVAgPSAxIDw8IGluZGV4Kys7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRVUFMV0lEVEggPSAxIDw8IGluZGV4Kys7Ci0KLQkvKiogQSBidXR0b24gaXMgc2hvd24gb24gdGhlIHJpZ2h0IG9mIHRoZSBjb21wb25lbnQuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTQlVUVE9OID0gMSA8PCBpbmRleCsrOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMID0gMSA8PCBpbmRleCsrOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JJRF9EQVRBX0dSQUJfRVhDRVNTX1NQQUNFID0gMSA8PCBpbmRleCsrOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JJRF9EQVRBX1NQQU4gPSAxIDw8IGluZGV4Kys7Ci0KLQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0JU3RyaW5nIGJ1dHRvbkxhYmVsID0gbnVsbDsKLQotCVN0cmluZyB0b29sdGlwID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBoYXNMYWJlbAotCSAqLwotCXB1YmxpYyBHZW5lcmljQ29udHJvbE1vbGQoaW50IGJpdG1hc2spIHsKLQkJdGhpcy5iaXRtYXNrID0gYml0bWFzazsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0NvbnRyb2xNb2xkKGludCBiaXRtYXNrLCBTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5iaXRtYXNrID0gYml0bWFzazsKLQkJc2V0TGFiZWwobGFiZWwpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Qml0bWFzaygpIHsKLQkJcmV0dXJuIGJpdG1hc2s7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQml0bWFzayhpbnQgYml0bWFzaykgewotCQl0aGlzLmJpdG1hc2sgfD0gYml0bWFzazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCaXRtYXNrKGludCBiaXRtYXNrKSB7Ci0JCXRoaXMuYml0bWFzayAmPSB+Yml0bWFzazsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHNldEJpdG1hc2soaW50IGJpdG1hc2spIHsKLS8vCQl0aGlzLmJpdG1hc2sgPSBiaXRtYXNrOwotLy8JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlhZGRCaXRtYXNrKEhBU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVCaXRtYXNrKEhBU19MQUJFTCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0JCXJldHVybiB0b29sdGlwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvb2x0aXAoU3RyaW5nIHRvb2x0aXApIHsKLQkJdGhpcy50b29sdGlwID0gdG9vbHRpcDsKLQkJaWYgKHRvb2x0aXAgIT0gbnVsbCkgewotCQkJYWRkQml0bWFzayhIQVNUT09MVElQKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUJpdG1hc2soSEFTVE9PTFRJUCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1dHRvbkxhYmVsKCkgewotCQlyZXR1cm4gYnV0dG9uTGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uTGFiZWwoU3RyaW5nIGJ1dHRvbkxhYmVsKSB7Ci0JCXRoaXMuYnV0dG9uTGFiZWwgPSBidXR0b25MYWJlbDsKLQkJaWYgKGJ1dHRvbkxhYmVsICE9IG51bGwpIHsKLQkJCWFkZEJpdG1hc2soSEFTQlVUVE9OKTsKLQkJfSBlbHNlIHsKLQkJCS8vIG5vdCBuZWNlc3NhcnksIGEgYnV0dG9uIHdpdGhvdXQgbGFiZWwgaXMgYWxsb3dlZC4KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc0hlaWdodCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNXaWR0aCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcm90ZWN0ZWQgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXByb3RlY3RlZCBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0xheW91dERlZmluaXRpb25zLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9MYXlvdXREZWZpbml0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTdjYjgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L0xheW91dERlZmluaXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIExheW91dERlZmluaXRpb25zIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXJnaW5IZWlnaHQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hcmdpbldpZHRoID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXJnaW5SaWdodCA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWFyZ2luTGVmdCA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWFyZ2luQm90dG9tID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXJnaW5Ub3AgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvcml6b250YWxTcGFjaW5nID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJ0aWNhbFNwYWNpbmcgPSA1OwkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L01lc3NhZ2VzLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU5MzVjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVfRW1wdHlIb3N0QWRkcmVzc0V4Y2VwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lX0VtcHR5SG9zdFBvcnRFeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZV9FbXB0eVByaXZhdGVLZXlQYXRoRXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVfRW1wdHlVc2VybmFtZUV4Y2VwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lX0ZpbGVEb2VzTm90RXhpc3RFeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZV9GaWxlTm90UmVhZGFibGVFeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZV9Ib3N0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVfSW52YWxpZENpcGhlclR5cGVFeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aGVudGljYXRpb25GcmFtZV9QYXRoSXNOb3RGaWxlRXhjcGV0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhlbnRpY2F0aW9uRnJhbWVfUG9ydE51bWJlckV4Y2VwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRoZW50aWNhdGlvbkZyYW1lX1RpbWVvdXRFeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJvd3NlQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGcmFtZV9FeHBhbmRCdXR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGcmFtZV9Ob0Rlc2NyaXB0aW9uU2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyYW1lX05vRW5jbG9zaW5nR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJhbWVfTm9FeHBhbmRCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJhbWVfU2hyaW5rQnV0dG9uTGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY0NvbnRyb2xHcm91cF9Ob0NvbnRyb2xHcm91cEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljQ29udHJvbEdyb3VwX05vQ29udHJvbEdyb3VwTGFiZWw7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvU1dUVXRpbC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZiNWU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLlBpeGVsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgcHVzaCBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kL29yIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBidXR0b24gbGFiZWwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIGltYWdlIG9mIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBwdXNoIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLAotCQkJSW1hZ2UgaW1hZ2UpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQl9Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2V0QnV0dG9uRGltZW5zaW9uSGludChidXR0b24pOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2lkdGggYW5kIGhlaWdodCBoaW50IGZvciB0aGUgYnV0dG9uIGNvbnRyb2wuIDxiPk5vdGU6PC9iPiBUaGlzIGlzCi0JICogYSBOT1AgaWYgdGhlIGJ1dHRvbidzIGxheW91dCBkYXRhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBidXR0b24gZm9yIHdoaWNoIHRvIHNldCB0aGUgZGltZW5zaW9uIGhpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QnV0dG9uRGltZW5zaW9uSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYnV0dG9uKTsKLQkJT2JqZWN0IGdkID0gYnV0dG9uLmdldExheW91dERhdGEoKTsKLQkJaWYgKGdkIGluc3RhbmNlb2YgR3JpZERhdGEpIHsKLQkJCSgoR3JpZERhdGEpIGdkKS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYnV0dG9uKTsKLQkJCSgoR3JpZERhdGEpIGdkKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB3aWR0aCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEJ1dHRvbldpZHRoSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCWJ1dHRvbi5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCVBpeGVsQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBQaXhlbENvbnZlcnRlcihidXR0b24pOwotCQlpbnQgd2lkdGhIaW50ID0gY29udmVydGVyLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwKLQkJCQl0cnVlKS54KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9TcGlubmVyR3JvdXAuamF2YSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L1NwaW5uZXJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGY4ODYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L1NwaW5uZXJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGNsYXNzIFNwaW5uZXJHcm91cCBleHRlbmRzIEdlbmVyaWNDb250cm9sR3JvdXAgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBTFVFID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCi0JU3Bpbm5lciBzcGlubmVyOwotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbW9sZAotCSAqLwotCXB1YmxpYyBTcGlubmVyR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgR2VuZXJpY0NvbnRyb2xNb2xkIG1vbGQpIHsKLQkJc3VwZXIocGFyZW50LCBtb2xkKTsKLQkJU3Bpbm5lck1vbGQgc2dtID0gKFNwaW5uZXJNb2xkKW1vbGQ7Ci0JCXNwaW5uZXIuc2V0TWluaW11bShzZ20ubWluKTsKLQkJc3Bpbm5lci5zZXRNYXhpbXVtKHNnbS5tYXgpOwotCQlzcGlubmVyLnNldEluY3JlbWVudChzZ20uaW5jcmVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21Db250cm9sKGludCBiaXRtYXNrLCBHcmlkRGF0YSBncmlkRGF0YSkgewotCQlzcGlubmVyID0gbmV3IFNwaW5uZXIodGhpcywgU1dULkJPUkRFUik7Ci0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNwaW5uZXIKLQkgKi8KLQlwdWJsaWMgU3Bpbm5lciBnZXRTcGlubmVyKCkgewotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gc3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBjb250cm9sIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IG5ld1ZhbHVlKSB7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKG5ld1ZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9TcGlubmVyTW9sZC5qYXZhIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvU3Bpbm5lck1vbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU3YTVjYS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9TcGlubmVyTW9sZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwsIERhbmllbCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9sZCBleHRlbmRzIEdlbmVyaWNDb250cm9sTW9sZCB7Ci0KLQlpbnQgbWluID0gMDsKLQlpbnQgbWF4ID0gMTAwOwotCWludCBpbmNyZW1lbnQgPSAxMDsKLQkKLQlwdWJsaWMgU3Bpbm5lck1vbGQoaW50IGJpdG1hc2ssIFN0cmluZyBsYWJlbCwgaW50IG1pbiwgaW50IG1heCwgaW50IGluYykgewotCQlzdXBlcihiaXRtYXNrLCBsYWJlbCk7Ci0JCXRoaXMubWluID0gbWluOwotCQl0aGlzLm1heCA9IG1heDsKLQkJaW5jcmVtZW50ID0gaW5jOwkJCi0JfQotCi0JLyoqIEluY3JlbWVudC4gKi8KLQlwdWJsaWMgaW50IGdldEluY3JlbWVudCgpIHsKLQkJcmV0dXJuIGluY3JlbWVudDsKLQl9Ci0KLQkvKiogSW5jcmVtZW50LiAqLwotCXB1YmxpYyB2b2lkIHNldEluY3JlbWVudChpbnQgaW5jcmVtZW50KSB7Ci0JCXRoaXMuaW5jcmVtZW50ID0gaW5jcmVtZW50OwotCX0KLQotCS8qKiBNYXhpbXVtIHZhbHVlLiAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4KCkgewotCQlyZXR1cm4gbWF4OwotCX0KLQotCS8qKiBNYXhpbXVtIHZhbHVlLiAqLwotCXB1YmxpYyB2b2lkIHNldE1heChpbnQgbWF4KSB7Ci0JCXRoaXMubWF4ID0gbWF4OwotCX0KLQotCS8qKiBNaW5pbXVtIHZhbHVlLiAqLwotCXB1YmxpYyBpbnQgZ2V0TWluKCkgewotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKiBNaW5pbXVtIHZhbHVlLiAqLwotCXB1YmxpYyB2b2lkIHNldE1pbihpbnQgbWluKSB7Ci0JCXRoaXMubWluID0gbWluOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvVGV4dEdyb3VwLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9UZXh0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgxZDVhMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9UZXh0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFRleHRHcm91cCBleHRlbmRzIEdlbmVyaWNDb250cm9sR3JvdXAgewotCQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSBUZXh0LkxJTUlUOwotCQotCVRleHQgdGV4dDsKLQkKLQlwdWJsaWMgVGV4dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFRleHRNb2xkIG1vbGQpIHsKLQkJc3VwZXIocGFyZW50LCBtb2xkKTsKLQkJVGV4dE1vbGQgdG1vbGQgPSAoVGV4dE1vbGQpbW9sZDsKLQkJaWYodG1vbGQudmFsdWUgIT0gbnVsbCkKLQkJCXRleHQuc2V0VGV4dCh0bW9sZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWlmKCh0bW9sZC5iaXRtYXNrICYgVGV4dE1vbGQuTElNSVRfU0laRSkgIT0gMCkgewotCQkJdGV4dC5zZXRUZXh0TGltaXQodG1vbGQuZ2V0VGV4dEZpZWxkV2lkdGgoKSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUNvbnRyb2woaW50IGJpdG1hc2ssIEdyaWREYXRhIGdkKSB7Ci0JCWlmICggKGJpdG1hc2sgJiBUZXh0TW9sZC5NVUxUSUxJTkVfVEVYVCkgIT0gMCkgewotCQkJdGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwkKLQkJfSBlbHNlIGlmKCAoYml0bWFzayAmIFRleHRNb2xkLlBBU1NXRF9GSUVMRCkgIT0gMCkgewotCQkJdGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlBBU1NXT1JEKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCX0KLQkJCQotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJaWYgKChiaXRtYXNrICYgVGV4dE1vbGQuV0lEVEhfUFJPUE9SVElPTkFMX05VTV9DSEFSUykgIT0gMCkgewotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQl9IGVsc2UgewotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl9CQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIFRleHQgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiB0ZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXRleHQuc2V0VGV4dChzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0ZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L1RleHRNb2xkLmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9UZXh0TW9sZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGQzNWZkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L1RleHRNb2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIERlc2NyaWJlIGEgZ3JvdXAgY29udGFpbmluZyBhIHRleHRib3ggYW5kIGFzc29jaWF0ZWQgY29udHJvbHMgbGlrZSBsYWJlbHMsCi0gKiB0ZXh0IGRlc2NyaXB0aW9ucy4KLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlcmJlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0TW9sZCBleHRlbmRzIEdlbmVyaWNDb250cm9sTW9sZCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU1JVF9TSVpFID0gMSA8PCBpbmRleCsrOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVVMVElMSU5FX1RFWFQgPSAxIDw8IGluZGV4Kys7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSURUSF9QUk9QT1JUSU9OQUxfTlVNX0NIQVJTID0gMSA8PCBpbmRleCsrOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dEX0ZJRUxEID0gMSA8PCBpbmRleCsrOwotCi0JaW50IHNpemUgPSAtMTsKLQotCWludCBudW1iZXJPZkxpbmVzID0gMTsKLQotCVN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBUZXh0TW9sZChpbnQgYml0bWFzaywgU3RyaW5nIGxhYmVsLCBpbnQgc2l6ZSkgewotCQlzdXBlcihiaXRtYXNrLCBsYWJlbCk7Ci0JCXNldFRleHRGaWVsZFdpZHRoKHNpemUpOwotCX0KLQotCXB1YmxpYyBUZXh0TW9sZChpbnQgYml0bWFzaywgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGJpdG1hc2ssIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dE1vbGQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKDAsIGxhYmVsKTsKLQl9Ci0KLQkvKiogTnVtYmVyIG9mIGNoYXJzIChhdmVyYWdlKSBzaG93biBpbiB0aGUgdGV4dCBmaWVsZC4gKi8KLQlwdWJsaWMgaW50IGdldFRleHRGaWVsZFdpZHRoKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKiogTnVtYmVyIG9mIGNoYXJzIChhdmVyYWdlKSBzaG93biBpbiB0aGUgdGV4dCBmaWVsZC4gKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RmllbGRXaWR0aChpbnQgc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCWFkZEJpdG1hc2soV0lEVEhfUFJPUE9SVElPTkFMX05VTV9DSEFSUyk7Ci0JCQlhZGRCaXRtYXNrKExJTUlUX1NJWkUpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQml0bWFzayhXSURUSF9QUk9QT1JUSU9OQUxfTlVNX0NIQVJTKTsKLQkJCXJlbW92ZUJpdG1hc2soTElNSVRfU0laRSk7CQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bnNldFRleHRGaWVsZFdpZHRoKCkgewotCQlyZW1vdmVCaXRtYXNrKFdJRFRIX1BST1BPUlRJT05BTF9OVU1fQ0hBUlMpOwotCQlyZW1vdmVCaXRtYXNrKExJTUlUX1NJWkUpOwotCX0KLQotCS8qKiBJbml0aWFsIHZhbHVlLiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKiogSW5pdGlhbCB2YWx1ZS4gKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKiBOdW1iZXIgb2YgbGluZXMgc2hvd24gaW4gdGhlIHRleHQgZmllbGQuICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKCkgewotCQlyZXR1cm4gbnVtYmVyT2ZMaW5lczsKLQl9Ci0KLQkvKiogTnVtYmVyIG9mIGxpbmVzIHNob3duIGluIHRoZSB0ZXh0IGZpZWxkLiAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlck9mTGluZXMoaW50IG51bWJlck9mTGluZXMpIHsKLQkJaWYgKG51bWJlck9mTGluZXMgPCAyKSB7Ci0JCQludW1iZXJPZkxpbmVzID0gMTsKLQkJCXJlbW92ZUJpdG1hc2soTVVMVElMSU5FX1RFWFQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5udW1iZXJPZkxpbmVzID0gbnVtYmVyT2ZMaW5lczsKLQkJCWFkZEJpdG1hc2soTVVMVElMSU5FX1RFWFQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzSGVpZ2h0KCkgewotCQlyZXR1cm4gKGJpdG1hc2sgJiBUZXh0TW9sZC5NVUxUSUxJTkVfVEVYVCkgIT0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIG51bWJlck9mTGluZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzV2lkdGgoKSB7Ci0JCXJldHVybiAoYml0bWFzayAmIFRleHRNb2xkLldJRFRIX1BST1BPUlRJT05BTF9OVU1fQ0hBUlMpICE9IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Ub29sS2l0LmphdmEgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9Ub29sS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5ZTVlNDUuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMudWkvc3JjL29yZy9lY2xpcHNlL3B0cC91dGlscy91aS9zd3QvVG9vbEtpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBTZXQgb2YgdXNlZnVsIEdVSSBjb25zdHJ1Y3RpbmcgbWV0aG9kcy4KLSAqIFVzZWZ1bCBmb3IgY3JlYXRpbmcgR1VJIGJsb2NrcyB0aGF0IHJlY3VyIGZyZXF1ZW50bHkKLSAqIHdoaWxlIGJ1aWxkaW5nIGZvcm0gKGxpa2UgTGF1bmNoZXIgdGFicywgRGlhbG9ncy9XaXphcmQgdGFicykuCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIFRvb2xLaXQgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYSB0ZXh0IGJveCBhbmQgYWRkIHRoZW0gdG8gdGhlIHBhcmVudC4KLQkgKiBUaGUgbGFiZWwgaXMgb24gdGhlIGxlZnQgb2YgdGhlIHRleHQgYm94LgotCSAqIFRoZSBib3ggc2l6ZSBmaWxsIGF2YWlsYWJsZSBzcGFjZS4KLQkgKiBBICI6IiBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBsYWJlbC4KLQkgKiBOb3RlOiBkb2VzIG5vdCBjcmVhdGUgYSByb3cgZm9yIGJvdGggd2lkZ2V0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IENvbXBvc2l0ZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8uCi0JICogQHBhcmFtIGxhYmVsU3RyaW5nIExhYmVsIGZvciB0aGUgVGV4dCBib3gKLQkgKiBAcGFyYW0gdmFsdWVTdHJpbmcgSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIFRleHRCb3gKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dFdpdGhMYWJlbCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxTdHJpbmcsIAotCQkJU3RyaW5nIHZhbHVlU3RyaW5nKSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0V2l0aExhYmVsKHBhcmVudCwgbGFiZWxTdHJpbmcsIHZhbHVlU3RyaW5nLCAwKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dFdpdGhMYWJlbCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxTdHJpbmcsIAotCQkJU3RyaW5nIHZhbHVlU3RyaW5nLAotCQkJaW50IG51bWJlck9mQ2hhcnMpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxTdHJpbmcgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlpZiAodmFsdWVTdHJpbmcgPT0gbnVsbCkgdmFsdWVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0LnNldFRleHQodmFsdWVTdHJpbmcpOwotCQlpZiAobnVtYmVyT2ZDaGFycyA8PSAwKSB7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQl9IGVsc2UgewotCQkJR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQkJCWludCB3aWR0aCA9IG51bWJlck9mQ2hhcnMgKiBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoICgpOwotCQkJaW50IGhlaWdodCA9IGZtLmdldEhlaWdodCAoKTsKLQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQlHcmlkRGF0YSBsYXlvdXQgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWxheW91dC53aWR0aEhpbnQgPSB3aWR0aDsKLQkJCWxheW91dC5taW5pbXVtV2lkdGggPSB3aWR0aDsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShsYXlvdXQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVQYXNzd29yZFdpdGhMYWJlbCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxTdHJpbmcsIAotCQkJU3RyaW5nIHZhbHVlU3RyaW5nKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCxTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxTdHJpbmcgKyAiOiIpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlBBU1NXT1JEKTsKLQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwpIHZhbHVlU3RyaW5nID0gIiI7Ci0JCXRleHQuc2V0VGV4dCh2YWx1ZVN0cmluZyk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgcm93IGNvbnRhaW5pbmcgYSBsYWJlbCBhbmQgYSB0ZXh0IGJveC4KLQkgKiBBZGRzIHRoaXMgcm93IHRvIHRoZSBwYXJlbnQuCi0JICogVGhlIGxhYmVsIGlzIG9uIHRoZSBsZWZ0IG9mIHRoZSB0ZXh0IGJveC4KLQkgKiBUaGUgbWV0aG9kcyBpcyBjYWxsZWQgIlNob3J0IiBiZWNhdXNlIHRoZSBsYWJlbCBvbiB0aGUgbGVmdAotCSAqIG1ha2VzIHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIHRoZSB0ZXh0IGJveCAnc2hvcnRlcicgYXMgaWYgdGhlCi0JICogbGFiZWwgd2VyZSBvbiB0aGUgdG9wIG9mIHRoZSB0ZXh0IGJveC4KLQkgKiBUaGlzIGxheW91dCBpcyBtb3JlIHNwYWNlIHNhdmluZyB0aGF0IHRoZSBsYXlvdXQgZnJvbSBjcmVhdGVUZXh0Um93KCkuCi0JICogVGhlIGJveCBzaXplIGZpbGwgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSByb3cuCi0JICogQSAiOiIgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBDb21wb3NpdGUgdGhhdCB0aGUgcm93IHdpbGwgYmUgYWRkZWQgdG8uCi0JICogQHBhcmFtIGxhYmVsU3RyaW5nIExhYmVsIGZvciB0aGUgVGV4dCBib3gKLQkgKiBAcGFyYW0gdmFsdWVTdHJpbmcgSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIFRleHRCb3gKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IGJveC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVNob3J0VGV4dFJvdygKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxTdHJpbmcsIAotCQkJU3RyaW5nIHZhbHVlU3RyaW5nKSB7Ci0KLQkJR3JpZExheW91dCByb3dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyb3dMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXJvd0xheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJvd0xheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlDb21wb3NpdGUgcm93ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcm93LnNldExheW91dChyb3dMYXlvdXQpOwotCQlyb3cuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJcmV0dXJuIGNyZWF0ZVRleHRXaXRoTGFiZWwocm93LCBsYWJlbFN0cmluZywgdmFsdWVTdHJpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgcm93IGNvbnRhaW5pbmcgYSBsYWJlbCBhbmQgYSB0ZXh0IGJveC4KLQkgKiBBZGRzIHRoaXMgcm93IHRvIHRoZSBwYXJlbnQuCi0JICogVGhlIGxhYmVsIGlzIG9uIHRoZSBsZWZ0IG9mIHRoZSB0ZXh0IGJveC4KLQkgKiBUaGUgbWV0aG9kcyBpcyBjYWxsZWQgIlNob3J0IiBiZWNhdXNlIHRoZSBsYWJlbCBvbiB0aGUgbGVmdAotCSAqIG1ha2VzIHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIHRoZSB0ZXh0IGJveCAnc2hvcnRlcicgYXMgaWYgdGhlCi0JICogbGFiZWwgd2VyZSBvbiB0aGUgdG9wIG9mIHRoZSB0ZXh0IGJveC4KLQkgKiBUaGUgYm94IHNpemUgZmlsbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIHJvdy4KLQkgKiBBICI6IiBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IENvbXBvc2l0ZSB0aGF0IHRoZSByb3cgd2lsbCBiZSBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbGFiZWxTdHJpbmcgTGFiZWwgZm9yIHRoZSBUZXh0IGJveAotCSAqIEBwYXJhbSB2YWx1ZVN0cmluZyBJbml0aWFsIHZhbHVlIGZvciB0aGUgVGV4dEJveAotCSAqIEByZXR1cm4gVGhlIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0Um93KAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBsYWJlbFN0cmluZywgCi0JCQlTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHRSb3cocGFyZW50LCBsYWJlbFN0cmluZywgdmFsdWVTdHJpbmcsIDApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0Um93KAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBsYWJlbFN0cmluZywgCi0JCQlTdHJpbmcgdmFsdWVTdHJpbmcsCi0JCQlpbnQgbnVtUm93cykgewotCQlHcmlkTGF5b3V0IHJvd0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXJvd0xheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQlyb3dMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyb3dMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJQ29tcG9zaXRlIHJvdyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXJvdy5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJcm93LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocm93LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxTdHJpbmcgKyAiOiIpOwotCQkKLQkJVGV4dCB0ZXh0ID0gbnVsbDsKLQkJaWYgKG51bVJvd3MgPT0gMCkgewotCQkJdGV4dCA9IG5ldyBUZXh0KHJvdywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBuZXcgVGV4dChyb3csIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQkJR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQkJCWludCBoZWlnaHQgPSBmbS5nZXRIZWlnaHQgKCkgKiBudW1Sb3dzOwotCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCUdyaWREYXRhIGxheW91dCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJbGF5b3V0LmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCQlsYXlvdXQubWluaW11bVdpZHRoID0gU1dULkRFRkFVTFQ7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobGF5b3V0KTsKLQkJfQotCQlpZiAodmFsdWVTdHJpbmcgPT0gbnVsbCkgdmFsdWVTdHJpbmcgPSAiIjsKLQkJdGV4dC5zZXRUZXh0KHZhbHVlU3RyaW5nKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUZpbGVGaWVsZFJvdygKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJU3RyaW5nIGxhYmVsU3RyaW5nLCAKLQkJCVN0cmluZyB2YWx1ZVN0cmluZywgCi0JCQlTdHJpbmcgdGl0bGUpIHsKLQkJCi0JCUdyaWRMYXlvdXQgcm93TGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcm93TGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCXJvd0xheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJvd0xheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlDb21wb3NpdGUgcm93ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcm93LnNldExheW91dChyb3dMYXlvdXQpOwotCQlyb3cuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChyb3csIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFN0cmluZyArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJQ29tcG9zaXRlIGl0ZW0gPSBuZXcgQ29tcG9zaXRlKHJvdywgU1dULk5PTkUpOwotCQlpdGVtLnNldExheW91dChsYXlvdXQpOwotCQlpdGVtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChpdGVtLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWlmICh2YWx1ZVN0cmluZyA9PSBudWxsKSB2YWx1ZVN0cmluZyA9ICIiOwotCQl0ZXh0LnNldFRleHQodmFsdWVTdHJpbmcpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihpdGVtLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJyb3dzZUJ1dHRvblRleHQpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEZpbGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcih0ZXh0LCB0aXRsZSkpOwotCQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVEaXJlY3RvcnlGaWVsZFJvdygKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJU3RyaW5nIGxhYmVsU3RyaW5nLCAKLQkJCVN0cmluZyB2YWx1ZVN0cmluZywgCi0JCQlTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQkKLQkJR3JpZExheW91dCByb3dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyb3dMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJcm93TGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcm93TGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCUNvbXBvc2l0ZSByb3cgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlyb3cuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCXJvdy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHJvdywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsU3RyaW5nICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlDb21wb3NpdGUgaXRlbSA9IG5ldyBDb21wb3NpdGUocm93LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWl0ZW0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGl0ZW0sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwpIHZhbHVlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5zZXRUZXh0KHZhbHVlU3RyaW5nKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oaXRlbSwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChNZXNzYWdlcy5Ccm93c2VCdXR0b25UZXh0KTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEaXJlY3RvcnlCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcih0ZXh0LCB0aXRsZSwgbWVzc2FnZSkpOwotCQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgd2hlcmUgbmV3IHJvd3MgY2FuIGJlIGFkZGVkLgotCSAqIEdyb3VwIGlzIGEgYm94IHRoYXQgc3Vycm91bmRzIG90aGVyIGNvbXBvbmVudHMuIFRoZSBncm91cAotCSAqIG1heSBoYXZlIGEgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBDb21wb3NpdGUgdGhhdCB0aGUgcm93IHdpbGwgYmUgYWRkZWQgdG8uCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IHNob3duIGFzIHRpdGxlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlyZXR1cm4gY3JlYXRlR3JvdXAocGFyZW50LCB0aXRsZSwgMSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCB3aGVyZSBuZXcgcm93cyBjYW4gYmUgYWRkZWQgaW4gbW9yZSB0aGF0IG9uZSBjb2x1bW4uCi0JICogR3JvdXAgaXMgYSBib3ggdGhhdCBzdXJyb3VuZHMgb3RoZXIgY29tcG9uZW50cy4gVGhlIGdyb3VwCi0JICogbWF5IGhhdmUgYSB0aXRsZS4KLQkgKiBUaGlzIGxheW91dCBpcyBtb3JlIHNwYWNlIHNhdmluZyB0aGF0IG9ubHkgb25lIHJvdy4gVXNlZnVsIGZvcgotCSAqIG1hbnkgY2hlY2sgYm94ZXMsIHNtYWxsIHRleHQgYm94ZXMgKHVzZSBjcmVhdGVUZXh0V2l0aExhYmVsKS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IENvbXBvc2l0ZSB0aGF0IHRoZSByb3cgd2lsbCBiZSBhZGRlZCB0by4KLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgc2hvd24gYXMgdGl0bGUuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBpbnQgY29sdW1ucywgYm9vbGVhbiBlcXVhbFdpZHRoKSB7Ci0JCUdyaWRMYXlvdXQgZ3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncm91cExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlncm91cExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDM7Ci0JCWdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSBjb2x1bW5zOwotCQlncm91cExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBlcXVhbFdpZHRoOwotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dCh0aXRsZSk7Ci0JCWdyb3VwLnNldExheW91dChncm91cExheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3RCb3hSb3coCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGxhYmVsU3RyaW5nKSB7Ci0KLQkJR3JpZExheW91dCByb3dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyb3dMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJcm93TGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcm93TGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCUNvbXBvc2l0ZSByb3cgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlyb3cuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCXJvdy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHJvdywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsU3RyaW5nICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJTGlzdCBjb21ibyA9IG5ldyBMaXN0KHJvdywgU1dULlNJTkdMRSk7Ci0JCS8vY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2hvcnREcm9wRG93blJvdyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxTdHJpbmcpIHsKLQkJR3JpZExheW91dCByb3dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyb3dMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJcm93TGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcm93TGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXJvd0xheW91dC5udW1Db2x1bW5zID0gMjsKLQkJQ29tcG9zaXRlIHJvdyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXJvdy5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJcm93LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocm93LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxTdHJpbmcgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhyb3csIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWxSb3coQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gY3JlYXRlTGFiZWxSb3cocGFyZW50LCBzdHJpbmcsIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWxSb3coQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHN0cmluZywgaW50IGNvbFNwYW4pIHsKLQkJTGFiZWwgcm93ID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlyb3cuc2V0VGV4dChzdHJpbmcpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2xTcGFuOwotCQlyb3cuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiByb3c7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L2F1dGhfZnJhbWVfbWVzc2FnZXMucHJvcGVydGllcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L2F1dGhfZnJhbWVfbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM0Y2FiMy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9hdXRoX2ZyYW1lX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9PcHRpb25fbG9jYWxob3N0PUxvY2FsaG9zdAotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfT3B0aW9uX1JlbW90ZWhvc3Q9UmVtb3RlIGhvc3QKLUF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkX0J1dHRvbl9TaG93QWR2YW5jZWQ9U2hvdyBBZHZhbmNlZCBPcHRpb25zCi1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9CdXR0b25fSGlkZUFkdmFuY2VkPUhpZGUgQWR2YW5jZWQgT3B0aW9ucwotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfUGFzc3dvcmQ9UGFzc3dvcmQ6Ci1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9Vc2VyPVVzZXI6Ci1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9PcHRpb25fUGFzc3dvcmRBdXRoZW50aWNhdGlvbj1QYXNzd29yZCBiYXNlZCBhdXRoZW50aWNhdGlvbgotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfUG9ydD1Qb3J0OgotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfSG9zdD1Ib3N0OgotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfRmllbGRfVGltZW91dD1UaW1lb3V0KHNlYyk6Ci1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9GaWVsZF9QYXNzcGhyYXNlPVBhc3NwaHJhc2U6Ci1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9CdXR0b25fUHJpdmF0ZUtleVBhdGg9U2VsZWN0Ci1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9TZWxlY3Rpb25XaW5kb3dfTGFiZWxfUHJpdmF0ZUtleVBhdGg9RmlsZSB3aXRoIHByaXZhdGUga2V5Ci1BdXRoZW50aWNhdGlvbkZyYW1lTW9sZF9TZWxlY3Rpb25XaW5kb3dfVGl0bGVfUHJpdmF0ZUtleVBhdGg9U2VsZWN0IGZpbGUgd2l0aCBwcml2YXRlIGtleQotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfT3B0aW9uX1B1YmxpY0tleUF1dGg9UHVibGljIGtleSBiYXNlZCBhdXRoZW50aWNhdGlvbgotQXV0aGVudGljYXRpb25GcmFtZU1vbGRfQ29tYm9fQ2lwaGVyVHlwZT1DaXBoZXIgdHlwZToKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3V0aWxzL3VpL3N3dC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODY0OThlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvdXRpbHMvdWkvc3d0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQXV0aGVudGljYXRpb25GcmFtZV9Ib3N0PUhvc3Q6Ci1BdXRoZW50aWNhdGlvbkZyYW1lX0VtcHR5SG9zdEFkZHJlc3NFeGNlcHRpb249SG9zdCBBZGRyZXNzIGNhbm5vdCBiZSBlbXB0eQotQXV0aGVudGljYXRpb25GcmFtZV9FbXB0eUhvc3RQb3J0RXhjZXB0aW9uPUhvc3QgUG9ydCBjYW5ub3QgYmUgZW1wdHkKLUF1dGhlbnRpY2F0aW9uRnJhbWVfRW1wdHlVc2VybmFtZUV4Y2VwdGlvbj1Vc2VybmFtZSBjYW5ub3QgYmUgZW1wdHkKLUF1dGhlbnRpY2F0aW9uRnJhbWVfRW1wdHlQcml2YXRlS2V5UGF0aEV4Y2VwdGlvbj1Qcml2YXRlIGtleSBwYXRoIGNhbm5vdCBiZSBlbXB0eQotQXV0aGVudGljYXRpb25GcmFtZV9GaWxlRG9lc05vdEV4aXN0RXhjZXB0aW9uPUZpbGUgZG9lc24ndCBleGlzdAotQXV0aGVudGljYXRpb25GcmFtZV9QYXRoSXNOb3RGaWxlRXhjcGV0aW9uPVBhdGggZG9lc24ndCBwb2ludCB0byBhIGZpbGUKLUF1dGhlbnRpY2F0aW9uRnJhbWVfRmlsZU5vdFJlYWRhYmxlRXhjZXB0aW9uPUZpbGUgaXNuJ3QgcmVhZGFibGUKLUF1dGhlbnRpY2F0aW9uRnJhbWVfVGltZW91dEV4Y2VwdGlvbj1UaW1lb3V0IG11c3QgYmUgYW4gaW50ZWdlcgotQXV0aGVudGljYXRpb25GcmFtZV9Qb3J0TnVtYmVyRXhjZXB0aW9uPVBvcnQgbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlcgotQXV0aGVudGljYXRpb25GcmFtZV9JbnZhbGlkQ2lwaGVyVHlwZUV4Y2VwdGlvbj1JbnZhbGlkIGNpcGhlciB0eXBlCi1Ccm93c2VCdXR0b25UZXh0PUJyb3dzZQotRnJhbWVfRXhwYW5kQnV0dG9uTGFiZWw9TW9yZSBvcHRpb25zCi1GcmFtZV9TaHJpbmtCdXR0b25MYWJsZT1MZXNzIG9wdGlvbnMKLUZyYW1lX05vRXhwYW5kQnV0dG9uPUZyYW1lIGhhcyBub3QgZXhwYW5kIGJ1dHRvbiB0byBzZXQgbGFiZWwKLUZyYW1lX05vRW5jbG9zaW5nR3JvdXA9RnJhbWUgaGFzIG5vdCBlbmNsb3NpbmcgZ3JvdXAgdG8gc2V0IHRpdGxlCi1GcmFtZV9Ob0Rlc2NyaXB0aW9uU2V0PUZyYW1lIGhhcyBubyBkZXNjcmlwdGlvbiB0byBiZSBzZXQKLUdlbmVyaWNDb250cm9sR3JvdXBfTm9Db250cm9sR3JvdXBMYWJlbD1Db250cm9sR3JvdXAgaGFzIG5vdCBhIGxhYmVsCi1HZW5lcmljQ29udHJvbEdyb3VwX05vQ29udHJvbEdyb3VwQnV0dG9uPUNvbnRyb2xHcm91cCBoYXMgbm90IGEgYnV0dG9uCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy8uY2R0cHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5jZHRwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJkMDZjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZS1jZHQgdmVyc2lvbj0iMi4wIj8+Ci0KLTxjZHRwcm9qZWN0IGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2UiPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5NYWNoTyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciI+Ci08YXR0cmlidXRlIGtleT0iYysrZmlsdCIgdmFsdWU9ImMrK2ZpbHQiLz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNJbmRleGVyIi8+Ci08ZGF0YT4KLTxpdGVtIGlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9pdGVtPgotPGl0ZW0gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9pdGVtPgotCi0KLTwvZGF0YT4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5jcHJvamVjdCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5jcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlZjVhMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy8uY3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9maWxlVmVyc2lvbiA0LjAuMD8+Ci0KLTxjcHJvamVjdD4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyI+Ci08Y2NvbmZpZ3VyYXRpb24gaWQ9ImNvbnZlcnRlZC5jb25maWcuMzc5MDA0Njc2Ij4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgYnVpbGRTeXN0ZW1JZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZGVmYXVsdENvbmZpZ0RhdGFQcm92aWRlciIgaWQ9ImNvbnZlcnRlZC5jb25maWcuMzc5MDA0Njc2IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9ImNvbnZlcnRlZENvbmZpZyI+Ci08ZXh0ZXJuYWxTZXR0aW5ncy8+Ci08ZXh0ZW5zaW9ucz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbXNvdXJjZWluZGV4ZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5DSW5kZXhlciIvPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5NYWNoTyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciI+Ci08YXR0cmlidXRlIGtleT0iYysrZmlsdCIgdmFsdWU9ImMrK2ZpbHQiLz4KLTwvZXh0ZW5zaW9uPgotPC9leHRlbnNpb25zPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkdGFyZ2V0cyI+Ci08YnVpbGRUYXJnZXRzPgotPHRhcmdldCBuYW1lPSJhbGwiIHBhdGg9IiIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzLz4KLTxidWlsZFRhcmdldD5hbGw8L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD50cnVlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTxydW5BbGxCdWlsZGVycz50cnVlPC9ydW5BbGxCdWlsZGVycz4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJjbGVhbiIgcGF0aD0iIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHMvPgotPGJ1aWxkVGFyZ2V0PmNsZWFuPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+dHJ1ZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08cnVuQWxsQnVpbGRlcnM+dHJ1ZTwvcnVuQWxsQnVpbGRlcnM+Ci08L3RhcmdldD4KLTwvYnVpbGRUYXJnZXRzPgotPC9zdG9yYWdlTW9kdWxlPgotPC9jY29uZmlndXJhdGlvbj4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy8uY3ZzaWdub3JlIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4ZjMwNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLmRlcHMKLXN0YW1wLWgxCi1saWJ0b29sCi1jb25maWcuc3RhdHVzCi1NYWtlZmlsZQotY29uZmlnLmgKLWF1dG9tNHRlLmNhY2hlCi0qLmEKLWJpdHNldF90ZXN0Ci0ubGlicwotLmdkYl9oaXN0b3J5Ci1hcmdzX3Rlc3QKLXJhbmdlc2V0X3Rlc3QKLWEub3V0LmRTWU0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5wcm9qZWN0IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjljN2EuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAudXRpbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2VCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmFyZ3VtZW50czwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0LmNvcmUuZXJyb3JPdXRwdXRQYXJzZXI8L2tleT4KLQkJCQkJPHZhbHVlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLk1ha2VFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5WQ0Vycm9yUGFyc2VyOzwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW52aXJvbm1lbnQ8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQXV0b0J1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuaW5jPC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUZ1bGxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlZEluY3JlbWVudGFsQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmxvY2F0aW9uPC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmNvbW1hbmQ8L2tleT4KLQkJCQkJPHZhbHVlPm1ha2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLnRhcmdldC5jbGVhbjwva2V5PgotCQkJCQk8dmFsdWU+Y2xlYW48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUNsZWFuQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFwcGVuZF9lbnZpcm9ubWVudDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmZ1bGw8L2tleT4KLQkJCQkJPHZhbHVlPmNsZWFuIGFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUudXNlRGVmYXVsdEJ1aWxkQ21kPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuYXV0bzwva2V5PgotCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5zdG9wT25FcnJvcjwva2V5PgotCQkJCQk8dmFsdWU+ZmFsc2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuU2Nhbm5lckNvbmZpZ0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZU5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuU2Nhbm5lckNvbmZpZ05hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlN2U5MS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY2R0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgTWF5IDAxIDEyOjU5OjEyIE1EVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5kZXhlci9pbmRleGVySWQ9b3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlcgotaW5kZXhlcklkPW9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbXNvdXJjZWluZGV4ZXIKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL0FVVEhPUlMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWNiZmJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL0FVVEhPUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HcmVnIFdhdHNvbiA8Zy53YXRzb25AY29tcHV0ZXIub3JnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL0NPUFlJTkcgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdlMTA1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLUFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLW1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIAotTEEtQ0MgMDQtMTE1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvQ2hhbmdlTG9nIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9JTlNUQUxMIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9JTlNUQUxMCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTFjOTQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAudXRpbHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvTWFrZWZpbGUuYW0gYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwMGNmOC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLW5vaW5zdF9MSUJSQVJJRVMgPQkJbGlidXRpbHMuYQotbm9pbnN0X1BST0dSQU1TID0JCWJpdHNldF90ZXN0IFwKLQkJCQkJCWFyZ3NfdGVzdCBcCi0JCQkJCQlyYW5nZXNldF90ZXN0Ci0KLWxpYnV0aWxzX2FfU09VUkNFUyA9CXNyYy9iaXRzZXQuYyBcCi0JCQkJCQlzcmMvYXJncy5jIFwKLQkJCQkJCXNyYy9saXN0LmMgXAotCQkJCQkJc3JjL2hhc2guYyBcCi0JCQkJCQlzcmMvaGFuZGxlci5jIFwKLQkJCQkJCXNyYy9jb21wYXQuYyBcCi0JCQkJCQlzcmMvcmFuZ2VzZXQuYyBcCi0JCQkJCQlzcmMvc2VyZGVzLmMKLQkJCQkJCQotbGlidXRpbHNfYV9DRkxBR1MgPQkJLUkuL2luY2x1ZGUgJChBTV9DRkxBR1MpIC1nIAotCi1iaXRzZXRfdGVzdF9TT1VSQ0VTID0Jc3JjL2JpdHNldF90ZXN0LmMKLWJpdHNldF90ZXN0X0NGTEFHUyA9CS1JLi9pbmNsdWRlICQoQU1fQ0ZMQUdTKSAtZwotYml0c2V0X3Rlc3RfTERGTEFHUyA9CS1nCi1iaXRzZXRfdGVzdF9MREFERCA9CQlsaWJ1dGlscy5hCi0KLWFyZ3NfdGVzdF9TT1VSQ0VTID0JCXNyYy9hcmdzX3Rlc3QuYwotYXJnc190ZXN0X0NGTEFHUyA9CQktSS4vaW5jbHVkZSAkKEFNX0NGTEFHUykgLWcKLWFyZ3NfdGVzdF9MREZMQUdTID0JCS1nCi1hcmdzX3Rlc3RfTERBREQgPQkJbGlidXRpbHMuYQotCi1yYW5nZXNldF90ZXN0X1NPVVJDRVMgPQlzcmMvcmFuZ2VzZXRfdGVzdC5jCi1yYW5nZXNldF90ZXN0X0NGTEFHUyA9CS1JLi9pbmNsdWRlICQoQU1fQ0ZMQUdTKSAtZwotcmFuZ2VzZXRfdGVzdF9MREZMQUdTID0JLWcKLXJhbmdlc2V0X3Rlc3RfTERBREQgPQlsaWJ1dGlscy5hCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9NYWtlZmlsZS5pbiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODViM2FjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzU0ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotCi0KLVZQQVRIID0gQHNyY2RpckAKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotbm9pbnN0X1BST0dSQU1TID0gYml0c2V0X3Rlc3QkKEVYRUVYVCkgYXJnc190ZXN0JChFWEVFWFQpIFwKLQlyYW5nZXNldF90ZXN0JChFWEVFWFQpCi1zdWJkaXIgPSAuCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZy5oLmluIFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSBBVVRIT1JTIENPUFlJTkcgQ2hhbmdlTG9nIElOU1RBTEwgTkVXUyBcCi0JY29tcGlsZSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIFwKLQltaXNzaW5nCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKLSBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotTElCUkFSSUVTID0gJChub2luc3RfTElCUkFSSUVTKQotQVIgPSBhcgotQVJGTEFHUyA9IGNydQotbGlidXRpbHNfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKLWxpYnV0aWxzX2FfTElCQUREID0KLWFtX2xpYnV0aWxzX2FfT0JKRUNUUyA9IGxpYnV0aWxzX2EtYml0c2V0LiQoT0JKRVhUKSBcCi0JbGlidXRpbHNfYS1hcmdzLiQoT0JKRVhUKSBsaWJ1dGlsc19hLWxpc3QuJChPQkpFWFQpIFwKLQlsaWJ1dGlsc19hLWhhc2guJChPQkpFWFQpIGxpYnV0aWxzX2EtaGFuZGxlci4kKE9CSkVYVCkgXAotCWxpYnV0aWxzX2EtY29tcGF0LiQoT0JKRVhUKSBsaWJ1dGlsc19hLXJhbmdlc2V0LiQoT0JKRVhUKSBcCi0JbGlidXRpbHNfYS1zZXJkZXMuJChPQkpFWFQpCi1saWJ1dGlsc19hX09CSkVDVFMgPSAkKGFtX2xpYnV0aWxzX2FfT0JKRUNUUykKLVBST0dSQU1TID0gJChub2luc3RfUFJPR1JBTVMpCi1hbV9hcmdzX3Rlc3RfT0JKRUNUUyA9IGFyZ3NfdGVzdC1hcmdzX3Rlc3QuJChPQkpFWFQpCi1hcmdzX3Rlc3RfT0JKRUNUUyA9ICQoYW1fYXJnc190ZXN0X09CSkVDVFMpCi1hcmdzX3Rlc3RfREVQRU5ERU5DSUVTID0gbGlidXRpbHMuYQotYXJnc190ZXN0X0xJTksgPSAkKENDTEQpICQoYXJnc190ZXN0X0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKGFyZ3NfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1hbV9iaXRzZXRfdGVzdF9PQkpFQ1RTID0gYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3QuJChPQkpFWFQpCi1iaXRzZXRfdGVzdF9PQkpFQ1RTID0gJChhbV9iaXRzZXRfdGVzdF9PQkpFQ1RTKQotYml0c2V0X3Rlc3RfREVQRU5ERU5DSUVTID0gbGlidXRpbHMuYQotYml0c2V0X3Rlc3RfTElOSyA9ICQoQ0NMRCkgJChiaXRzZXRfdGVzdF9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJChiaXRzZXRfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1hbV9yYW5nZXNldF90ZXN0X09CSkVDVFMgPSByYW5nZXNldF90ZXN0LXJhbmdlc2V0X3Rlc3QuJChPQkpFWFQpCi1yYW5nZXNldF90ZXN0X09CSkVDVFMgPSAkKGFtX3Jhbmdlc2V0X3Rlc3RfT0JKRUNUUykKLXJhbmdlc2V0X3Rlc3RfREVQRU5ERU5DSUVTID0gbGlidXRpbHMuYQotcmFuZ2VzZXRfdGVzdF9MSU5LID0gJChDQ0xEKSAkKHJhbmdlc2V0X3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQocmFuZ2VzZXRfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQAotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVNPVVJDRVMgPSAkKGxpYnV0aWxzX2FfU09VUkNFUykgJChhcmdzX3Rlc3RfU09VUkNFUykgXAotCSQoYml0c2V0X3Rlc3RfU09VUkNFUykgJChyYW5nZXNldF90ZXN0X1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGxpYnV0aWxzX2FfU09VUkNFUykgJChhcmdzX3Rlc3RfU09VUkNFUykgXAotCSQoYml0c2V0X3Rlc3RfU09VUkNFUykgJChyYW5nZXNldF90ZXN0X1NPVVJDRVMpCi1FVEFHUyA9IGV0YWdzCi1DVEFHUyA9IGN0YWdzCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi1hbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCi0gIHsgdGVzdCAhIC1kICQoZGlzdGRpcikgXAotICAgIHx8IHsgZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAotICAgICAgICAgJiYgcm0gLWZyICQoZGlzdGRpcik7IH07IH0KLURJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5negotR1pJUF9FTlYgPSAtLWJlc3QKLWRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLWRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQU1UQVIgPSBAQU1UQVJACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNZR1BBVEhfVyA9IEBDWUdQQVRIX1dACi1ERUZTID0gQERFRlNACi1ERVBESVIgPSBAREVQRElSQAotRUNIT19DID0gQEVDSE9fQ0AKLUVDSE9fTiA9IEBFQ0hPX05ACi1FQ0hPX1QgPSBARUNIT19UQAotRVhFRVhUID0gQEVYRUVYVEAKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotYmluZGlyID0gQGJpbmRpckAKLWJ1aWxkID0gQGJ1aWxkQAotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF9jcHUgPSBAYnVpbGRfY3B1QAotYnVpbGRfb3MgPSBAYnVpbGRfb3NACi1idWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAotYnVpbGRkaXIgPSBAYnVpbGRkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1ub2luc3RfTElCUkFSSUVTID0gbGlidXRpbHMuYQotbGlidXRpbHNfYV9TT1VSQ0VTID0gc3JjL2JpdHNldC5jIFwKLQkJCQkJCXNyYy9hcmdzLmMgXAotCQkJCQkJc3JjL2xpc3QuYyBcCi0JCQkJCQlzcmMvaGFzaC5jIFwKLQkJCQkJCXNyYy9oYW5kbGVyLmMgXAotCQkJCQkJc3JjL2NvbXBhdC5jIFwKLQkJCQkJCXNyYy9yYW5nZXNldC5jIFwKLQkJCQkJCXNyYy9zZXJkZXMuYwotCi1saWJ1dGlsc19hX0NGTEFHUyA9IC1JLi9pbmNsdWRlICQoQU1fQ0ZMQUdTKSAtZyAKLWJpdHNldF90ZXN0X1NPVVJDRVMgPSBzcmMvYml0c2V0X3Rlc3QuYwotYml0c2V0X3Rlc3RfQ0ZMQUdTID0gLUkuL2luY2x1ZGUgJChBTV9DRkxBR1MpIC1nCi1iaXRzZXRfdGVzdF9MREZMQUdTID0gLWcKLWJpdHNldF90ZXN0X0xEQUREID0gbGlidXRpbHMuYQotYXJnc190ZXN0X1NPVVJDRVMgPSBzcmMvYXJnc190ZXN0LmMKLWFyZ3NfdGVzdF9DRkxBR1MgPSAtSS4vaW5jbHVkZSAkKEFNX0NGTEFHUykgLWcKLWFyZ3NfdGVzdF9MREZMQUdTID0gLWcKLWFyZ3NfdGVzdF9MREFERCA9IGxpYnV0aWxzLmEKLXJhbmdlc2V0X3Rlc3RfU09VUkNFUyA9IHNyYy9yYW5nZXNldF90ZXN0LmMKLXJhbmdlc2V0X3Rlc3RfQ0ZMQUdTID0gLUkuL2luY2x1ZGUgJChBTV9DRkxBR1MpIC1nCi1yYW5nZXNldF90ZXN0X0xERkxBR1MgPSAtZwotcmFuZ2VzZXRfdGVzdF9MREFERCA9IGxpYnV0aWxzLmEKLWFsbDogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAub2JqCi1hbS0tcmVmcmVzaDoKLQlAOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICBlY2hvICcgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICc7IFwKLQkgICAgICBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIFwKLQkJJiYgZXhpdCAwOyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgTWFrZWZpbGUnOyBcCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWdudSAgTWFrZWZpbGUKLS5QUkVDSU9VUzogTWFrZWZpbGUKLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAY2FzZSAnJD8nIGluIFwKLQkgICpjb25maWcuc3RhdHVzKikgXAotCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAotCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCi0JICAqKSBcCi0JICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCi0JZXNhYzsKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKLQotY29uZmlnLmg6IHN0YW1wLWgxCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JICBybSAtZiBzdGFtcC1oMTsgXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IFwKLQllbHNlIDo7IGZpCi0KLXN0YW1wLWgxOiAkKHNyY2RpcikvY29uZmlnLmguaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQlAcm0gLWYgc3RhbXAtaDEKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi0kKHNyY2RpcikvY29uZmlnLmguaW46ICAkKGFtX19jb25maWd1cmVfZGVwcykgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0Jcm0gLWYgc3RhbXAtaDEKLQl0b3VjaCAkQAotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaCBzdGFtcC1oMQotCi1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKLWxpYnV0aWxzLmE6ICQobGlidXRpbHNfYV9PQkpFQ1RTKSAkKGxpYnV0aWxzX2FfREVQRU5ERU5DSUVTKSAKLQktcm0gLWYgbGlidXRpbHMuYQotCSQobGlidXRpbHNfYV9BUikgbGlidXRpbHMuYSAkKGxpYnV0aWxzX2FfT0JKRUNUUykgJChsaWJ1dGlsc19hX0xJQkFERCkKLQkkKFJBTkxJQikgbGlidXRpbHMuYQotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLWFyZ3NfdGVzdCQoRVhFRVhUKTogJChhcmdzX3Rlc3RfT0JKRUNUUykgJChhcmdzX3Rlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYXJnc190ZXN0JChFWEVFWFQpCi0JJChhcmdzX3Rlc3RfTElOSykgJChhcmdzX3Rlc3RfT0JKRUNUUykgJChhcmdzX3Rlc3RfTERBREQpICQoTElCUykKLWJpdHNldF90ZXN0JChFWEVFWFQpOiAkKGJpdHNldF90ZXN0X09CSkVDVFMpICQoYml0c2V0X3Rlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgYml0c2V0X3Rlc3QkKEVYRUVYVCkKLQkkKGJpdHNldF90ZXN0X0xJTkspICQoYml0c2V0X3Rlc3RfT0JKRUNUUykgJChiaXRzZXRfdGVzdF9MREFERCkgJChMSUJTKQotcmFuZ2VzZXRfdGVzdCQoRVhFRVhUKTogJChyYW5nZXNldF90ZXN0X09CSkVDVFMpICQocmFuZ2VzZXRfdGVzdF9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiByYW5nZXNldF90ZXN0JChFWEVFWFQpCi0JJChyYW5nZXNldF90ZXN0X0xJTkspICQocmFuZ2VzZXRfdGVzdF9PQkpFQ1RTKSAkKHJhbmdlc2V0X3Rlc3RfTERBREQpICQoTElCUykKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2FyZ3NfdGVzdC1hcmdzX3Rlc3QuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2JpdHNldF90ZXN0LWJpdHNldF90ZXN0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJ1dGlsc19hLWFyZ3MuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnV0aWxzX2EtYml0c2V0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJ1dGlsc19hLWNvbXBhdC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlidXRpbHNfYS1oYW5kbGVyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJ1dGlsc19hLWhhc2guUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnV0aWxzX2EtbGlzdC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlidXRpbHNfYS1yYW5nZXNldC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlidXRpbHNfYS1zZXJkZXMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Jhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5Qb0BhbV9fcXVvdGVACi0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi1saWJ1dGlsc19hLWJpdHNldC5vOiBzcmMvYml0c2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtYml0c2V0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnV0aWxzX2EtYml0c2V0LlRwbyAtYyAtbyBsaWJ1dGlsc19hLWJpdHNldC5vIGB0ZXN0IC1mICdzcmMvYml0c2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9iaXRzZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnV0aWxzX2EtYml0c2V0LlRwbyAkKERFUERJUikvbGlidXRpbHNfYS1iaXRzZXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9iaXRzZXQuYycgb2JqZWN0PSdsaWJ1dGlsc19hLWJpdHNldC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnV0aWxzX2EtYml0c2V0Lm8gYHRlc3QgLWYgJ3NyYy9iaXRzZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2JpdHNldC5jCi0KLWxpYnV0aWxzX2EtYml0c2V0Lm9iajogc3JjL2JpdHNldC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJ1dGlsc19hLWJpdHNldC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnV0aWxzX2EtYml0c2V0LlRwbyAtYyAtbyBsaWJ1dGlsc19hLWJpdHNldC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9iaXRzZXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvYml0c2V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9iaXRzZXQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnV0aWxzX2EtYml0c2V0LlRwbyAkKERFUERJUikvbGlidXRpbHNfYS1iaXRzZXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9iaXRzZXQuYycgb2JqZWN0PSdsaWJ1dGlsc19hLWJpdHNldC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlidXRpbHNfYS1iaXRzZXQub2JqIGBpZiB0ZXN0IC1mICdzcmMvYml0c2V0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2JpdHNldC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvYml0c2V0LmMnOyBmaWAKLQotbGlidXRpbHNfYS1hcmdzLm86IHNyYy9hcmdzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtYXJncy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJ1dGlsc19hLWFyZ3MuVHBvIC1jIC1vIGxpYnV0aWxzX2EtYXJncy5vIGB0ZXN0IC1mICdzcmMvYXJncy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvYXJncy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1hcmdzLlRwbyAkKERFUERJUikvbGlidXRpbHNfYS1hcmdzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvYXJncy5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtYXJncy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnV0aWxzX2EtYXJncy5vIGB0ZXN0IC1mICdzcmMvYXJncy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvYXJncy5jCi0KLWxpYnV0aWxzX2EtYXJncy5vYmo6IHNyYy9hcmdzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtYXJncy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnV0aWxzX2EtYXJncy5UcG8gLWMgLW8gbGlidXRpbHNfYS1hcmdzLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2FyZ3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvYXJncy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvYXJncy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1hcmdzLlRwbyAkKERFUERJUikvbGlidXRpbHNfYS1hcmdzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvYXJncy5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtYXJncy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlidXRpbHNfYS1hcmdzLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2FyZ3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvYXJncy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvYXJncy5jJzsgZmlgCi0KLWxpYnV0aWxzX2EtbGlzdC5vOiBzcmMvbGlzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJ1dGlsc19hLWxpc3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlidXRpbHNfYS1saXN0LlRwbyAtYyAtbyBsaWJ1dGlsc19hLWxpc3QubyBgdGVzdCAtZiAnc3JjL2xpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2xpc3QuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnV0aWxzX2EtbGlzdC5UcG8gJChERVBESVIpL2xpYnV0aWxzX2EtbGlzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2xpc3QuYycgb2JqZWN0PSdsaWJ1dGlsc19hLWxpc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJ1dGlsc19hLWxpc3QubyBgdGVzdCAtZiAnc3JjL2xpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2xpc3QuYwotCi1saWJ1dGlsc19hLWxpc3Qub2JqOiBzcmMvbGlzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJ1dGlsc19hLWxpc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJ1dGlsc19hLWxpc3QuVHBvIC1jIC1vIGxpYnV0aWxzX2EtbGlzdC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9saXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2xpc3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2xpc3QuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnV0aWxzX2EtbGlzdC5UcG8gJChERVBESVIpL2xpYnV0aWxzX2EtbGlzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2xpc3QuYycgb2JqZWN0PSdsaWJ1dGlsc19hLWxpc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnV0aWxzX2EtbGlzdC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9saXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2xpc3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2xpc3QuYyc7IGZpYAotCi1saWJ1dGlsc19hLWhhc2gubzogc3JjL2hhc2guYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlidXRpbHNfYS1oYXNoLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnV0aWxzX2EtaGFzaC5UcG8gLWMgLW8gbGlidXRpbHNfYS1oYXNoLm8gYHRlc3QgLWYgJ3NyYy9oYXNoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9oYXNoLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJ1dGlsc19hLWhhc2guVHBvICQoREVQRElSKS9saWJ1dGlsc19hLWhhc2guUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9oYXNoLmMnIG9iamVjdD0nbGlidXRpbHNfYS1oYXNoLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlidXRpbHNfYS1oYXNoLm8gYHRlc3QgLWYgJ3NyYy9oYXNoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9oYXNoLmMKLQotbGlidXRpbHNfYS1oYXNoLm9iajogc3JjL2hhc2guYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlidXRpbHNfYS1oYXNoLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlidXRpbHNfYS1oYXNoLlRwbyAtYyAtbyBsaWJ1dGlsc19hLWhhc2gub2JqIGBpZiB0ZXN0IC1mICdzcmMvaGFzaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9oYXNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9oYXNoLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJ1dGlsc19hLWhhc2guVHBvICQoREVQRElSKS9saWJ1dGlsc19hLWhhc2guUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9oYXNoLmMnIG9iamVjdD0nbGlidXRpbHNfYS1oYXNoLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJ1dGlsc19hLWhhc2gub2JqIGBpZiB0ZXN0IC1mICdzcmMvaGFzaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9oYXNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9oYXNoLmMnOyBmaWAKLQotbGlidXRpbHNfYS1oYW5kbGVyLm86IHNyYy9oYW5kbGVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtaGFuZGxlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJ1dGlsc19hLWhhbmRsZXIuVHBvIC1jIC1vIGxpYnV0aWxzX2EtaGFuZGxlci5vIGB0ZXN0IC1mICdzcmMvaGFuZGxlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvaGFuZGxlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1oYW5kbGVyLlRwbyAkKERFUERJUikvbGlidXRpbHNfYS1oYW5kbGVyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvaGFuZGxlci5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtaGFuZGxlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnV0aWxzX2EtaGFuZGxlci5vIGB0ZXN0IC1mICdzcmMvaGFuZGxlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvaGFuZGxlci5jCi0KLWxpYnV0aWxzX2EtaGFuZGxlci5vYmo6IHNyYy9oYW5kbGVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtaGFuZGxlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnV0aWxzX2EtaGFuZGxlci5UcG8gLWMgLW8gbGlidXRpbHNfYS1oYW5kbGVyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2hhbmRsZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvaGFuZGxlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvaGFuZGxlci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1oYW5kbGVyLlRwbyAkKERFUERJUikvbGlidXRpbHNfYS1oYW5kbGVyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvaGFuZGxlci5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtaGFuZGxlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlidXRpbHNfYS1oYW5kbGVyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2hhbmRsZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvaGFuZGxlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvaGFuZGxlci5jJzsgZmlgCi0KLWxpYnV0aWxzX2EtY29tcGF0Lm86IHNyYy9jb21wYXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlidXRpbHNfYS1jb21wYXQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlidXRpbHNfYS1jb21wYXQuVHBvIC1jIC1vIGxpYnV0aWxzX2EtY29tcGF0Lm8gYHRlc3QgLWYgJ3NyYy9jb21wYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2NvbXBhdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1jb21wYXQuVHBvICQoREVQRElSKS9saWJ1dGlsc19hLWNvbXBhdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2NvbXBhdC5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtY29tcGF0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlidXRpbHNfYS1jb21wYXQubyBgdGVzdCAtZiAnc3JjL2NvbXBhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvY29tcGF0LmMKLQotbGlidXRpbHNfYS1jb21wYXQub2JqOiBzcmMvY29tcGF0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtY29tcGF0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlidXRpbHNfYS1jb21wYXQuVHBvIC1jIC1vIGxpYnV0aWxzX2EtY29tcGF0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL2NvbXBhdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9jb21wYXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2NvbXBhdC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1jb21wYXQuVHBvICQoREVQRElSKS9saWJ1dGlsc19hLWNvbXBhdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2NvbXBhdC5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtY29tcGF0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJ1dGlsc19hLWNvbXBhdC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9jb21wYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvY29tcGF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9jb21wYXQuYyc7IGZpYAotCi1saWJ1dGlsc19hLXJhbmdlc2V0Lm86IHNyYy9yYW5nZXNldC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJ1dGlsc19hLXJhbmdlc2V0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnV0aWxzX2EtcmFuZ2VzZXQuVHBvIC1jIC1vIGxpYnV0aWxzX2EtcmFuZ2VzZXQubyBgdGVzdCAtZiAnc3JjL3Jhbmdlc2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9yYW5nZXNldC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1yYW5nZXNldC5UcG8gJChERVBESVIpL2xpYnV0aWxzX2EtcmFuZ2VzZXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9yYW5nZXNldC5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtcmFuZ2VzZXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJ1dGlsc19hLXJhbmdlc2V0Lm8gYHRlc3QgLWYgJ3NyYy9yYW5nZXNldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcmFuZ2VzZXQuYwotCi1saWJ1dGlsc19hLXJhbmdlc2V0Lm9iajogc3JjL3Jhbmdlc2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYnV0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnV0aWxzX2EtcmFuZ2VzZXQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJ1dGlsc19hLXJhbmdlc2V0LlRwbyAtYyAtbyBsaWJ1dGlsc19hLXJhbmdlc2V0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Jhbmdlc2V0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Jhbmdlc2V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9yYW5nZXNldC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlidXRpbHNfYS1yYW5nZXNldC5UcG8gJChERVBESVIpL2xpYnV0aWxzX2EtcmFuZ2VzZXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9yYW5nZXNldC5jJyBvYmplY3Q9J2xpYnV0aWxzX2EtcmFuZ2VzZXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnV0aWxzX2EtcmFuZ2VzZXQub2JqIGBpZiB0ZXN0IC1mICdzcmMvcmFuZ2VzZXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcmFuZ2VzZXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Jhbmdlc2V0LmMnOyBmaWAKLQotbGlidXRpbHNfYS1zZXJkZXMubzogc3JjL3NlcmRlcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJ1dGlsc19hLXNlcmRlcy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJ1dGlsc19hLXNlcmRlcy5UcG8gLWMgLW8gbGlidXRpbHNfYS1zZXJkZXMubyBgdGVzdCAtZiAnc3JjL3NlcmRlcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvc2VyZGVzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJ1dGlsc19hLXNlcmRlcy5UcG8gJChERVBESVIpL2xpYnV0aWxzX2Etc2VyZGVzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvc2VyZGVzLmMnIG9iamVjdD0nbGlidXRpbHNfYS1zZXJkZXMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJ1dGlsc19hLXNlcmRlcy5vIGB0ZXN0IC1mICdzcmMvc2VyZGVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9zZXJkZXMuYwotCi1saWJ1dGlsc19hLXNlcmRlcy5vYmo6IHNyYy9zZXJkZXMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlidXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlidXRpbHNfYS1zZXJkZXMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJ1dGlsc19hLXNlcmRlcy5UcG8gLWMgLW8gbGlidXRpbHNfYS1zZXJkZXMub2JqIGBpZiB0ZXN0IC1mICdzcmMvc2VyZGVzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3NlcmRlcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvc2VyZGVzLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJ1dGlsc19hLXNlcmRlcy5UcG8gJChERVBESVIpL2xpYnV0aWxzX2Etc2VyZGVzLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvc2VyZGVzLmMnIG9iamVjdD0nbGlidXRpbHNfYS1zZXJkZXMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJ1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnV0aWxzX2Etc2VyZGVzLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3NlcmRlcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9zZXJkZXMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3NlcmRlcy5jJzsgZmlgCi0KLWFyZ3NfdGVzdC1hcmdzX3Rlc3Qubzogc3JjL2FyZ3NfdGVzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChhcmdzX3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGFyZ3NfdGVzdC1hcmdzX3Rlc3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYXJnc190ZXN0LWFyZ3NfdGVzdC5UcG8gLWMgLW8gYXJnc190ZXN0LWFyZ3NfdGVzdC5vIGB0ZXN0IC1mICdzcmMvYXJnc190ZXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9hcmdzX3Rlc3QuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2FyZ3NfdGVzdC1hcmdzX3Rlc3QuVHBvICQoREVQRElSKS9hcmdzX3Rlc3QtYXJnc190ZXN0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvYXJnc190ZXN0LmMnIG9iamVjdD0nYXJnc190ZXN0LWFyZ3NfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChhcmdzX3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYXJnc190ZXN0LWFyZ3NfdGVzdC5vIGB0ZXN0IC1mICdzcmMvYXJnc190ZXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9hcmdzX3Rlc3QuYwotCi1hcmdzX3Rlc3QtYXJnc190ZXN0Lm9iajogc3JjL2FyZ3NfdGVzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChhcmdzX3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGFyZ3NfdGVzdC1hcmdzX3Rlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9hcmdzX3Rlc3QtYXJnc190ZXN0LlRwbyAtYyAtbyBhcmdzX3Rlc3QtYXJnc190ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL2FyZ3NfdGVzdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9hcmdzX3Rlc3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2FyZ3NfdGVzdC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvYXJnc190ZXN0LWFyZ3NfdGVzdC5UcG8gJChERVBESVIpL2FyZ3NfdGVzdC1hcmdzX3Rlc3QuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9hcmdzX3Rlc3QuYycgb2JqZWN0PSdhcmdzX3Rlc3QtYXJnc190ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoYXJnc190ZXN0X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGFyZ3NfdGVzdC1hcmdzX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdzcmMvYXJnc190ZXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2FyZ3NfdGVzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvYXJnc190ZXN0LmMnOyBmaWAKLQotYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3Qubzogc3JjL2JpdHNldF90ZXN0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGJpdHNldF90ZXN0X0NGTEFHUykgJChDRkxBR1MpIC1NVCBiaXRzZXRfdGVzdC1iaXRzZXRfdGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9iaXRzZXRfdGVzdC1iaXRzZXRfdGVzdC5UcG8gLWMgLW8gYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3QubyBgdGVzdCAtZiAnc3JjL2JpdHNldF90ZXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9iaXRzZXRfdGVzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3QuVHBvICQoREVQRElSKS9iaXRzZXRfdGVzdC1iaXRzZXRfdGVzdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2JpdHNldF90ZXN0LmMnIG9iamVjdD0nYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoYml0c2V0X3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3QubyBgdGVzdCAtZiAnc3JjL2JpdHNldF90ZXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9iaXRzZXRfdGVzdC5jCi0KLWJpdHNldF90ZXN0LWJpdHNldF90ZXN0Lm9iajogc3JjL2JpdHNldF90ZXN0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGJpdHNldF90ZXN0X0NGTEFHUykgJChDRkxBR1MpIC1NVCBiaXRzZXRfdGVzdC1iaXRzZXRfdGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2JpdHNldF90ZXN0LWJpdHNldF90ZXN0LlRwbyAtYyAtbyBiaXRzZXRfdGVzdC1iaXRzZXRfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9iaXRzZXRfdGVzdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9iaXRzZXRfdGVzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvYml0c2V0X3Rlc3QuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2JpdHNldF90ZXN0LWJpdHNldF90ZXN0LlRwbyAkKERFUERJUikvYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3QuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9iaXRzZXRfdGVzdC5jJyBvYmplY3Q9J2JpdHNldF90ZXN0LWJpdHNldF90ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoYml0c2V0X3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYml0c2V0X3Rlc3QtYml0c2V0X3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdzcmMvYml0c2V0X3Rlc3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvYml0c2V0X3Rlc3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2JpdHNldF90ZXN0LmMnOyBmaWAKLQotcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0Lm86IHNyYy9yYW5nZXNldF90ZXN0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJhbmdlc2V0X3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9yYW5nZXNldF90ZXN0LXJhbmdlc2V0X3Rlc3QuVHBvIC1jIC1vIHJhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vIGB0ZXN0IC1mICdzcmMvcmFuZ2VzZXRfdGVzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcmFuZ2VzZXRfdGVzdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0LlRwbyAkKERFUERJUikvcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcmFuZ2VzZXRfdGVzdC5jJyBvYmplY3Q9J3Jhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyYW5nZXNldF90ZXN0X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vIGB0ZXN0IC1mICdzcmMvcmFuZ2VzZXRfdGVzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcmFuZ2VzZXRfdGVzdC5jCi0KLXJhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vYmo6IHNyYy9yYW5nZXNldF90ZXN0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJhbmdlc2V0X3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Jhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5UcG8gLWMgLW8gcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Jhbmdlc2V0X3Rlc3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcmFuZ2VzZXRfdGVzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcmFuZ2VzZXRfdGVzdC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0LlRwbyAkKERFUERJUikvcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcmFuZ2VzZXRfdGVzdC5jJyBvYmplY3Q9J3Jhbmdlc2V0X3Rlc3QtcmFuZ2VzZXRfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJhbmdlc2V0X3Rlc3RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcmFuZ2VzZXRfdGVzdC1yYW5nZXNldF90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Jhbmdlc2V0X3Rlc3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcmFuZ2VzZXRfdGVzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcmFuZ2VzZXRfdGVzdC5jJzsgZmlgCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgJCR0YWdzICQkdW5pcXVlOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR0YWdzICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCXRlc3QgLWQgJChkaXN0ZGlyKSB8fCBta2RpciAkKGRpc3RkaXIpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQktZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAotCXx8IGNobW9kIC1SIGErciAkKGRpc3RkaXIpCi1kaXN0LWd6aXA6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LWJ6aXAyOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC10YXJaOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3Qtc2hhcjogZGlzdGRpcgotCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtemlwOiBkaXN0ZGlyCi0JLXJtIC1mICQoZGlzdGRpcikuemlwCi0JemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QgZGlzdC1hbGw6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCi0JKi50YXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5iejIqKSBcCi0JICBidW56aXAyIC1jICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5aKikgXAotCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAotCSouc2hhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikuc2hhci5neiB8IHVuc2hhciA7O1wKLQkqLnppcCopIFwKLQkgIHVuemlwICQoZGlzdGRpcikuemlwIDs7XAotCWVzYWMKLQljaG1vZCAtUiBhLXcgJChkaXN0ZGlyKTsgY2htb2QgYSt3ICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpL19idWlsZAotCW1rZGlyICQoZGlzdGRpcikvX2luc3QKLQljaG1vZCBhLXcgJChkaXN0ZGlyKQotCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAotCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCi0JICAmJiBjZCAkKGRpc3RkaXIpL19idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICQoRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrIFwKLQkgICYmIGNobW9kIC1SIGEtdyAiJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICYmICh7IFwKLQkgICAgICAgKGNkIC4uLy4uICYmIHVtYXNrIDA3NyAmJiBta2RpciAiJCRkY19kZXN0ZGlyIikgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIGluc3RhbGwgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIHVuaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgXAotCSAgICAgICAgICAgIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfZGVzdGRpciIgZGlzdHVuaW5zdGFsbGNoZWNrOyBcCi0JICAgICAgfSB8fCB7IHJtIC1yZiAiJCRkY19kZXN0ZGlyIjsgZXhpdCAxOyB9KSBcCi0JICAmJiBybSAtcmYgIiQkZGNfZGVzdGRpciIgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdCBcCi0JICAmJiBybSAtcmYgJChESVNUX0FSQ0hJVkVTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Y2xlYW5jaGVjawotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCi0JICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCi0JICBzZWQgLWUgMWggLWUgMXMvLi89L2cgLWUgMXAgLWUgMXggLWUgJyQkcCcgLWUgJyQkeCcKLWRpc3R1bmluc3RhbGxjaGVjazoKLQlAY2QgJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKSBcCi0JJiYgdGVzdCBgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtbGUgMSBcCi0JICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKLQkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKLQkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKLQkgICAgICAgIGZpIDsgXAotCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKLQkgICAgICAgIGV4aXQgMTsgfSA+JjIKLWRpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KLQlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKLQkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKLQkgIGV4aXQgMSA7IFwKLQlmaQotCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAotCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCi0JICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKLQkgICAgICAgZXhpdCAxOyB9ID4mMgotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKFBST0dSQU1TKSBjb25maWcuaAotaW5zdGFsbGRpcnM6Ci1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCi0JICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAotCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotY2xlYW46IGNsZWFuLWFtCi0KLWNsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLWFtCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1hbQotCi1pbmZvOiBpbmZvLWFtCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCi0KLWluc3RhbGwtZXhlYy1hbToKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCi0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbToKLQotLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gXAotCWNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIFwKLQlkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgZGlzdC1nemlwIGRpc3Qtc2hhciBkaXN0LXRhclogXAotCWRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAotCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuY2hlY2sgXAotCWRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gXAotCWluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAotCWluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gXAotCWluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCi0JaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBcCi0JaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gXAotCWluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKLQltb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBcCi0JcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL05FV1MgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL05FV1MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvUkVBRE1FIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL1JFQURNRQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9hYm91dC5odG1sIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9hY2xvY2FsLm00IGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkMWYxNS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsODk2ICswLDAgQEAKLSMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjEwIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCi0jIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1tNF9pZihtNF9QQUNLQUdFX1ZFUlNJT04sIFsyLjYxXSwsCi1bbTRfZmF0YWwoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjYxLgotWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoYXQsCi15b3Ugc2hvdWxkIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS5dLCBbNjNdKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KLSMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCi0jIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQotQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAotW2FtX19hcGlfdmVyc2lvbj0nMS4xMCcKLWRubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KLWRubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCi1tNF9pZihbJDFdLCBbMS4xMF0sIFtdLAotICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAotXSkKLQotIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCi0jIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCi0jIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCi1tNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCi0KLSMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCi0jIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQUNfSU5JVF9BVVRPTUFLRS4KLUFDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKLVtBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjEwXSlkbmwKLV9BTV9BVVRPQ09ORl9WRVJTSU9OKG00X1BBQ0tBR0VfVkVSU0lPTildKQotCi0jIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKLSMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KLSMgYCRzcmNkaXInLCBgJHNyY2Rpci8uLicsIG9yIGAkc3JjZGlyLy4uLy4uJy4KLSMKLSMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQotIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAotIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKLSMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCi0jIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCi0jIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQotIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgotIwotIyAkYWNfYXV4X2Rpci9taXNzaW5nCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKLSMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKLSMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKLSMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgotIwotIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgotIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQotIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgYC4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKLSMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KLSMKLSMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCi0jIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgotIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAotIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKLSMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKLSMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KLSMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgotIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCi0jCi0jIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgotIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCi0jIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KLQotQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKLVtkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgotQUNfUFJFUkVRKFsyLjUwXSlkbmwKLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLV0pCi0KLSMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOAotCi0jIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLUFDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCi1bQUNfUFJFUkVRKDIuNTIpZG5sCi0gaWZlbHNlKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKLQlbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCi1BQ19TVUJTVChbJDFfVFJVRV0pZG5sCi1BQ19TVUJTVChbJDFfRkFMU0VdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX1RSVUVdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX0ZBTFNFXSlkbmwKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKAotW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgotICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCi1maV0pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOQotCi0jIFRoZXJlIGFyZSBhIGZldyBkaXJ0eSBoYWNrcyBiZWxvdyB0byBhdm9pZCBsZXR0aW5nIGBBQ19QUk9HX0NDJyBiZQotIyB3cml0dGVuIGluIGNsZWFyLCBpbiB3aGljaCBjYXNlIGF1dG9tYWtlLCB3aGVuIHJlYWRpbmcgYWNsb2NhbC5tNCwKLSMgd2lsbCB0aGluayBpdCBzZWVzIGEgKnVzZSosIGFuZCB0aGVyZWZvcmUgd2lsbCB0cmlnZ2VyIGFsbCBpdCdzCi0jIEMgc3VwcG9ydCBtYWNoaW5lcnkuICBBbHNvIG5vdGUgdGhhdCBpdCBtZWFucyB0aGF0IGF1dG9zY2FuLCBzZWVpbmcKLSMgQ0MgZXRjLiBpbiB0aGUgTWFrZWZpbGUsIHdpbGwgYXNrIGZvciBhbiBBQ19QUk9HX0NDIHVzZS4uLgotCi0KLSMgX0FNX0RFUEVOREVOQ0lFUyhOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KLSMgTkFNRSBpcyAiQ0MiLCAiQ1hYIiwgIkdDSiIsIG9yICJPQkpDIi4KLSMgV2UgdHJ5IGEgZmV3IHRlY2huaXF1ZXMgYW5kIHVzZSB0aGF0IHRvIHNldCBhIHNpbmdsZSBjYWNoZSB2YXJpYWJsZS4KLSMKLSMgV2UgZG9uJ3QgQUNfUkVRVUlSRSB0aGUgY29ycmVzcG9uZGluZyBBQ19QUk9HX0NDIHNpbmNlIHRoZSBsYXR0ZXIgd2FzCi0jIG1vZGlmaWVkIHRvIGludm9rZSBfQU1fREVQRU5ERU5DSUVTKENDKTsgd2Ugd291bGQgaGF2ZSBhIGNpcmN1bGFyCi0jIGRlcGVuZGVuY3ksIGFuZCBnaXZlbiB0aGF0IHRoZSB1c2VyIGlzIG5vdCBleHBlY3RlZCB0byBydW4gdGhpcyBtYWNybywKLSMganVzdCByZWx5IG9uIEFDX1BST0dfQ0MuCi1BQ19ERUZVTihbX0FNX0RFUEVOREVOQ0lFU10sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0RFUERJUl0pZG5sCi1BQ19SRVFVSVJFKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10pZG5sCi1BQ19SRVFVSVJFKFtBTV9NQUtFX0lOQ0xVREVdKWRubAotQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKLQotaWZlbHNlKFskMV0sIENDLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgT0JKQywgW2RlcGNjPSIkT0JKQyIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICBbJDFdLCBVUEMsICBbZGVwY2M9IiRVUEMiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCi0KLUFDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCi0gICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLAotW2lmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAotICBmaQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotXSkKLUFDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQotQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKLV0pCi0KLQotIyBBTV9TRVRfREVQRElSCi0jIC0tLS0tLS0tLS0tLS0KLSMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCi0jIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUwotQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1BQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCi1dKQotCi0KLSMgQU1fREVQX1RSQUNLCi0jIC0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCi1bQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAotWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCi1BQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV0pCi0KLSMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4gICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotI3NlcmlhbCAzCi0KLSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgotICBpZiBzZWQgMTBxICIkbWYiIHwgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGRpcnBhcnQ9YEFTX0RJUk5BTUUoIiRtZiIpYAotICBlbHNlCi0gICAgY29udGludWUKLSAgZmkKLSAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgotICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCi0gIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0Ci0gIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKLSAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKLSAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKLSAgIyBleHBhbnNpb24uCi0gIGZvciBmaWxlIGluIGBzZWQgLW4gIgotICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAotICAgICAgIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbwotICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgotICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKLSAgICBBU19NS0RJUl9QKFskZGlycGFydC8kZmRpcl0pCi0gICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKLSAgZG9uZQotZG9uZQotXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotCi0KLSMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgotIwotIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCi0jIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKLSMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KLUFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCi0gICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCi1dKQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEyCi0KLSMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCi0jIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKLSMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQotIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCi0jIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQotIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgotIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKLSMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKLSMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgotIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgotQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAotW0FDX1BSRVJFUShbMi42MF0pZG5sCi1kbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdwotZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCi1tNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KLSAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKLSAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgotICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi1BQ19TVUJTVChbQ1lHUEFUSF9XXSkKLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCi1tNF9pZnZhbChbJDJdLAotW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKLVtfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKLWRubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgotbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCi0gIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAotCi1fQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKLVtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQotQU1fUFJPR19JTlNUQUxMX1NICi1BTV9QUk9HX0lOU1RBTExfU1RSSVAKLUFDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLUFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLV9BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAotICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKLQkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKLV9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKLV0pCi1dKQotCi0KLSMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLSMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi0jIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KLQotIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQotIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCi0jIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KLUFDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKLVsjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkMSB8ICQxOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkMSIgPmBBU19ESVJOQU1FKFskMV0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NICi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgJGluc3RhbGxfc2guCi1BQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iXCQoU0hFTEwpICRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQotQUNfU1VCU1QoaW5zdGFsbF9zaCldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCi0jIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KLUFDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAotW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi1BQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQotCi0jIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIEFNX01BS0VfSU5DTFVERSgpCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCi1BQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKLVthbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCi0jIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCi0jIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0Ci0jIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAotIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCi1pZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KLSAgIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgIGFtX19xdW90ZT0KLSAgIF9hbV9yZXN1bHQ9R05VCi1maQotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCi0gICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQotICAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgIF9hbV9yZXN1bHQ9QlNECi0gICBmaQotZmkKLUFDX1NVQlNUKFthbV9faW5jbHVkZV0pCi1BQ19TVUJTVChbYW1fX3F1b3RlXSkKLUFDX01TR19SRVNVTFQoWyRfYW1fcmVzdWx0XSkKLXJtIC1mIGNvbmZpbmMgY29uZm1mCi1dKQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1Ci0KLSMgQU1fUFJPR19DQ19DX08KLSMgLS0tLS0tLS0tLS0tLS0KLSMgTGlrZSBBQ19QUk9HX0NDX0NfTywgYnV0IGNoYW5nZWQgZm9yIGF1dG9tYWtlLgotQUNfREVGVU4oW0FNX1BST0dfQ0NfQ19PXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDX0NfT10pZG5sCi1BQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFtjb21waWxlXSlkbmwKLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkWzJdIHwgc2VkIFsncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLyddYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19jY18nJHthY19jY31fY19vYFwiICE9IHllcyI7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLWRubCBNYWtlIHN1cmUgQUNfUFJPR19DQyBpcyBuZXZlciBjYWxsZWQgYWdhaW4sIG9yIGl0IHdpbGwgb3ZlcnJpZGUgb3VyCi1kbmwgc2V0dGluZyBvZiBDQy4KLW00X2RlZmluZShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgW200X2ZhdGFsKFtBQ19QUk9HX0NDIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgQU1fUFJPR19DQ19DX09dKV0pCi1dKQotCi0jIEZha2UgdGhlIGV4aXN0ZW5jZSBvZiBwcm9ncmFtcyB0aGF0IEdOVSBtYWludGFpbmVycyB1c2UuICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKLVtBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQotJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9Ci1BQ19TVUJTVCgkMSldKQotCi0KLSMgQU1fTUlTU0lOR19IQVNfUlVOCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCi0jIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQotZmkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfTUtESVJfUAotIyAtLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCi1BQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKLVtBQ19QUkVSRVEoWzIuNjBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKLWRubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKLWRubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgotZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCi1kbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCi1kbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCi1kbmwgTUtESVJfUCkuCi1BQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCi1bbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi0KLSMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKLVtBQ19GT1JFQUNIKFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQotCi0jIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLUFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKLVttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9TQU5JVFlfQ0hFQ0sKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAotIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKLSMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKLSMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCi0jIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKLSMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQotIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCi1bQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWRubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLUFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dGluZyBWQVJJQUJMRSA9IEBWQVJJQUJMRUAgaW4gTWFrZWZpbGUuaW4uCi0jIFRoaXMgbWFjcm8gaXMgdHJhY2VkIGJ5IEF1dG9tYWtlLgotQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIF9BTV9QUk9HX1RBUihGT1JNQVQpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCi0jIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mIGB2NycsIGB1c3RhcicsIG9yIGBwYXgnLgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAotIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQotIyAkdGFyZGlyLgotIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCi0jIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCi0jICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCi1BQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKLVsjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1BTV9NSVNTSU5HX1BST0coW0FNVEFSXSwgW3Rhcl0pCi1tNF9pZihbJDFdLCBbdjddLAotICAgICBbYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nXSwKLSAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKLSAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCi0jIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCi1fYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJwotX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KLSMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAotIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgotZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKLWRvCi0gIGNhc2UgJF9hbV90b29sIGluCi0gIGdudXRhcikKLSAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7Ci0gICAgZG8KLSAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCi0gICAgZG9uZQotICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCi0gICAgOzsKLSAgcGxhaW50YXIpCi0gICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKLSAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgotICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKLSAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3RhciB4ZiAtJwotICAgIDs7Ci0gIHBheCkKLSAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3BheCAtcicKLSAgICA7OwotICBjcGlvKQotICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKLSAgICA7OwotICBub25lKQotICAgIGFtX190YXI9ZmFsc2UKLSAgICBhbV9fdGFyXz1mYWxzZQotICAgIGFtX191bnRhcj1mYWxzZQotICAgIDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgotICAjIGFuZCBhbV9fdW50YXIgc2V0LgotICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKLQotICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQotICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCi0gICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKLSAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKLSAgZmkKLWRvbmUKLXJtIC1yZiBjb25mdGVzdC5kaXIKLQotQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQotQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQotQUNfU1VCU1QoW2FtX190YXJdKQotQUNfU1VCU1QoW2FtX191bnRhcl0pCi1dKSAjIF9BTV9QUk9HX1RBUgotCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9idWlsZC5wcm9wZXJ0aWVzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMjJjNy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gQVVUSE9SUyxcCi0gICAgICAgICAgICAgICBDT1BZSU5HLFwKLSAgICAgICAgICAgICAgIENoYW5nZUxvZyxcCi0gICAgICAgICAgICAgICBJTlNUQUxMLFwKLSAgICAgICAgICAgICAgIE1ha2VmaWxlLmFtLFwKLSAgICAgICAgICAgICAgIE1ha2VmaWxlLmluLFwKLSAgICAgICAgICAgICAgIE5FV1MsXAotICAgICAgICAgICAgICAgUkVBRE1FLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWNsb2NhbC5tNCxcCi0gICAgICAgICAgICAgICBjb21waWxlLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5ndWVzcyxcCi0gICAgICAgICAgICAgICBjb25maWcuaC5pbixcCi0gICAgICAgICAgICAgICBjb25maWcuc3RhdHVzLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdWIsXAotICAgICAgICAgICAgICAgY29uZmlndXJlLFwKLSAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5pbixcCi0gICAgICAgICAgICAgICBkZXBjb21wLFwKLSAgICAgICAgICAgICAgIGluY2x1ZGUvLFwKLSAgICAgICAgICAgICAgIGluc3RhbGwtc2gsXAotICAgICAgICAgICAgICAgbGlidG9vbCxcCi0gICAgICAgICAgICAgICBsdG1haW4uc2gsXAotICAgICAgICAgICAgICAgbWlzc2luZyxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29tcGlsZSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbXBpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MWUwMDAuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29tcGlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIFdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDMtMTEtMDkuMDAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAotIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCi0jIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBjb21waWxlIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotUmVtb3ZlIGAtbyBkZXN0Lm8nIGZyb20gQVJHUywgcnVuIFBST0dSQU0gd2l0aCB0aGUgcmVtYWluaW5nCi1hcmd1bWVudHMsIGFuZCByZW5hbWUgdGhlIG91dHB1dCBhcyBleHBlY3RlZC4KLQotSWYgeW91IGFyZSB0cnlpbmcgdG8gYnVpbGQgYSB3aG9sZSBwYWNrYWdlIHRoaXMgaXMgbm90IHRoZQotcmlnaHQgc2NyaXB0IHRvIHJ1bjogcGxlYXNlIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGZpbGUgYElOU1RBTEwnLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAwCi0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAwCi0gICAgOzsKLWVzYWMKLQotCi1wcm9nPSQxCi1zaGlmdAotCi1vZmlsZT0KLWNmaWxlPQotYXJncz0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gIGNhc2UgIiQxIiBpbgotICAgIC1vKQotICAgICAgIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCi0gICAgICAjIFNvIHdlIGRvIHNvbWV0aGluZyB1Z2x5IGhlcmUuCi0gICAgICBvZmlsZT0kMgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgIiRvZmlsZSIgaW4KLQkqLm8gfCAqLm9iaikKLQkgIDs7Ci0JKikKLQkgIGFyZ3M9IiRhcmdzIC1vICRvZmlsZSIKLQkgIG9maWxlPQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICAgICA7OwotICAgICouYykKLSAgICAgIGNmaWxlPSQxCi0gICAgICBhcmdzPSIkYXJncyAkMSIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFyZ3M9IiRhcmdzICQxIgotICAgICAgOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KLSAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQotICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCi0gICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KLSAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbwotICAjIG9rLgotICBleGVjICIkcHJvZyIgJGFyZ3MKLWZpCi0KLSMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCi1jb2ZpbGU9YGVjaG8gJGNmaWxlIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5jJC8uby8nYAotCi0jIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCi0jIE5vdGU6IHVzZSBgWy8uLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKLSMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKLSMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgotbG9ja2Rpcj1gZWNobyAkY29maWxlIHwgc2VkIC1lICdzfFsvLi1dfF98ZydgLmQKLXdoaWxlIHRydWU7IGRvCi0gIGlmIG1rZGlyICRsb2NrZGlyID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBicmVhawotICBmaQotICBzbGVlcCAxCi1kb25lCi0jIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KLXRyYXAgInJtZGlyICRsb2NrZGlyOyBleGl0IDEiIDEgMiAxNQotCi0jIFJ1biB0aGUgY29tcGlsZS4KLSIkcHJvZyIgJGFyZ3MKLXN0YXR1cz0kPwotCi1pZiB0ZXN0IC1mICIkY29maWxlIjsgdGhlbgotICBtdiAiJGNvZmlsZSIgIiRvZmlsZSIKLWZpCi0KLXJtZGlyICRsb2NrZGlyCi1leGl0ICRzdGF0dXMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29uZmlnLmd1ZXNzIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGY3NzcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDEzMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDItMDMtMDQnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi0KLWR1bW15PWR1bW15LSQkCi10cmFwICdybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4KLSMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKLSMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KLQotc2V0X2NjX2Zvcl9idWlsZD0nY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgZHVtbXkoKXt9IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IDsgZG8KLQkgICgkYyAkZHVtbXkuYyAtYyAtbyAkZHVtbXkubykgPi9kZXYvbnVsbCAyPiYxIDsKLQkgIGlmIHRlc3QgJD8gPSAwIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjJwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKLQkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgMCA7OwotICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBocDMwMDpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hY3BwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZXBwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlYi11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMzpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFscGhhOk9TRjE6KjoqKQotCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQlmaQotCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgotCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCi0JIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCi0JIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCi0JY2F0IDw8RU9GID4kZHVtbXkucwotCS5kYXRhCi1cJExmb3JtYXQ6Ci0JLmJ5dGUgMzcsMTAwLDQ1LDM3LDEyMCwxMCwwCSMgIiVkLSV4XG4iCi0KLQkudGV4dAotCS5nbG9ibCBtYWluCi0JLmFsaWduIDQKLQkuZW50IG1haW4KLW1haW46Ci0JLmZyYW1lIFwkMzAsMTYsXCQyNiwwCi0JbGRncCBcJDI5LDAoXCQyNykKLQkucHJvbG9ndWUgMQotCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyIFwkMAotCWxkYSBcJDIsLTEKLQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQotCWxkYSBcJDE2LFwkTGZvcm1hdAotCW1vdiBcJDAsXCQxNwotCW5vdCBcJDEsXCQxOAotCWpzciBcJDI2LHByaW50ZgotCWxkZ3AgXCQyOSwwKFwkMjYpCi0JbW92IDAsXCQxNgotCWpzciBcJDI2LGV4aXQKLQkuZW5kIG1haW4KLUVPRgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCWNhc2UgYC4vJGR1bW15YCBpbgotCQkJMC0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTEtMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEtMTAxKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTItMzAzKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQkyLTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciCi0JCQkJOzsKLQkJCTItMTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgMDs7Ci0gICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCAwIDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgTklMRSo6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKLSAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKLSAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCi0gICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgotICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5Ci0gICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKLSAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKLSAgICAjIGJlIG5vIHByb2JsZW0uCi0gICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLQllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IFwKLQkgICYmIC4vJGR1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKLQkgICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgMCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYTY0OkFJWDoqOiopCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAuLyRkdW1teWAKLQkJICAgIGlmIHRlc3QgLXogIiRIUF9BUkNIIjsgdGhlbiBIUF9BUkNIPWhwcGE7IGZpCi0JCSAgICBybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQkJZmkgOzsKLQllc2FjCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0Q6KjoqOiopCi0JZWNobyBhbHBoYS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNwYXJjKjpCU0QvT1M6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpDWUdXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6UFcqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKLQlleGl0IDAgOzsKLSAgICB4ODY6SW50ZXJpeCo6MyopCi0JZWNobyBpMzg2LXBjLWludGVyaXgzCi0JZXhpdCAwIDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpNaW5peDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4Ci0JZXhpdCAwIDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgKLQlleGl0IDAgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBtaXBzOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHMKLQkjdW5kZWYgbWlwc2VsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkgCi0JQ1BVPW1pcHNlbCAKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpIAotCUNQVT1taXBzCi0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmIAotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCi0Jcm0gLWYgJGR1bW15LmMKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS1wYy1saW51eC1nbnUiICYmIGV4aXQgMAotCTs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotICAgICAgICBlc2FjCi0Jb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQlleGl0IDAgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAotCWV4aXQgMCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAotCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KLQkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgotCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCi0JICBlbGYzMi1pMzg2KQotCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgotCQk7OwotCSAgYS5vdXQtaTM4Ni1saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDAgOzsJCQotCSAgY29mZi1pMzg2KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCi0JCWV4aXQgMCA7OwotCSAgIiIpCi0JCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgotCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCAwIDs7Ci0JZXNhYwotCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0JI2lmZGVmIF9fRUxGX18KLQkjIGlmZGVmIF9fR0xJQkNfXwotCSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0JTElCQz1nbnUKLQkjICBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgIGVuZGlmCi0JIyBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgZW5kaWYKLQkjZWxzZQotCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCi0JTElCQz1nbnUKLQkjZWxzZQotCUxJQkM9Z251YW91dAotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAotCXJtIC1mICRkdW1teS5jCi0JdGVzdCB4IiR7TElCQ30iICE9IHggJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IiAmJiBleGl0IDAKLQl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIGVjaG8gIiR7VEVOVEFUSVZFfSIgJiYgZXhpdCAwCi0JOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQotCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NTpbNzhdKikKLQljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgotCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKLQkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7Ci0JICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgP0lJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCWVjaG8gYHVuYW1lIC1wYC1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAieDg2cGMiOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9cGMKLQkJZWNobyBpMzg2LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWVsc2UKLQkJZWNobyBgdW5hbWUgLXBgLSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpRTlg6Kjo0KikKLQllY2hvIGkzODYtcGMtcW54Ci0JZXhpdCAwIDs7Ci0gICAgTlNSLVtHS0xOUFRWV106Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgMCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgMCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgMCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgMCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgMCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgMCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgMCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgMCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotY2F0ID4mMiA8PEVPRgotJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQotCi1UaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQotdGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQotZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCi0KLSAgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L2NvbmZpZy8KLQotSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCi1zZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQotcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKLWluZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KLQotY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9jb25maWcuaC5pbiBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbmZpZy5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWFiZGMzLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbmZpZy5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXNwcmludGYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQVNQUklOVEYKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0IC1jIGFuZCAtbyB0b2dldGhlci4gKi8KLSN1bmRlZiBOT19NSU5VU19DX01JTlVTX08KLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9WRVJTSU9OCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9jb25maWcuc3ViIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29uZmlnLnN1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjM2NTc5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDAyLTAzLTA3JwotCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgotIwotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUwotICAgICAgICQwIFtPUFRJT05dIEFMSUFTCi0KLUNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgotICAgICAgIGV4aXQgMSA7OwotCi0gICAgKmxvY2FsKikKLSAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLSAgICAgICBlY2hvICQxCi0gICAgICAgZXhpdCAwOzsKLQotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotY2FzZSAkIyBpbgotIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotIDEpIDs7Ci0gKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCB3aW5kb3dzMzItKiB8IHJ0bWstbm92YSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcykKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2NvdXQpCi0JCTs7Ci0JLXdycykKLQkJb3M9LXZ4d29ya3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1jaG9ydXNvcyopCi0JCW9zPS1jaG9ydXNvcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0gCS1jaG9ydXNyZGIpCi0gCQlvcz0tY2hvcnVzcmRiCi0JCWJhc2ljX21hY2hpbmU9JDEKLSAJCTs7Ci0JLWhpdXgqKQotCQlvcz0taGl1eHdlMgotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS11ZGsqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWlzYykKLQkJb3M9LWlzYzIuMgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWNsaXgqKQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAotCQk7OwotCS1pc2MqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWx5bngqKQotCQlvcz0tbHlueG9zCi0JCTs7Ci0JLXB0eCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAotCQk7OwotCS13aW5kb3dzbnQqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCi0JCTs7Ci0JLXBzb3MqKQotCQlvcz0tcHNvcwotCQk7OwotCS1taW50IHwgLW1pbnRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotZXNhYwotCi0jIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgotCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCi0JMTc1MGEgfCA1ODAgXAotCXwgYTI5ayBcCi0JfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAotCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCi0JfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRzcDE2eHggXAotCXwgZnIzMCBcCi0JfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAotCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCi0JfCBtMzJyIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgfCBtY29yZSBcCi0JfCBtaXBzIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwczY0ZWwgfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgfCBtaXBzNjR2cjQzMDAgXAotCXwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTY0IFwKLQl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3BlbnJpc2MgfCBvcjMyIFwKLQl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCi0JfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCi0JfCBweXJhbWlkIFwKLQl8IHNoIHwgc2hbMzRdIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoNjQgXAotCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCi0JfCBzdHJvbmdhcm0gXAotCXwgdGFob2UgfCB0aHVtYiB8IHRpYzgwIHwgdHJvbiBcCi0JfCB2ODUwIHwgdjg1MGUgXAotCXwgd2UzMmsgXAotCXwgeDg2IHwgeHNjYWxlIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4aykKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyKQotCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCW9zPS1ub25lCi0JCTs7Ci0JbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpKjg2IHwgeDg2XzY0KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQk1ODAtKiBcCi0JfCBhMjlrLSogXAotCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCi0JfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAotCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCi0JfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybXYqLSogXAotCXwgYXZyLSogXAotCXwgYnMyMDAwLSogXAotCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzU0eC0qIFwKLQl8IGNsaXBwZXItKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIFwKLQl8IGVseHNpLSogXAotCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgbTMyci0qIFwKLQl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1jb3JlLSogXAotCXwgbWlwcy0qIHwgbWlwczE2LSogfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogfCBtaXBzNjRvcmlvbi0qIFwKLQl8IG1pcHM2NG9yaW9uZWwtKiB8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIFwKLQl8IG1pcHNsZS0qIHwgbWlwc2VsLSogfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogXAotCXwgc2gtKiB8IHNoWzM0XS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiB8IHNobGUtKiB8IHNoNjQtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKLQl8IHRhaG9lLSogfCB0aHVtYi0qIHwgdGljMzAtKiB8IHRpYzU0eC0qIHwgdGljODAtKiB8IHRyb24tKiBcCi0JfCB2ODUwLSogfCB2ODUwZS0qIHwgdmF4LSogXAotCXwgd2UzMmstKiBcCi0JfCB4ODYtKiB8IHg4Nl82NC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzdG9ybXkxNi0qIFwKLQl8IHh0ZW5zYS0qIFwKLQl8IHltcC0qIFwKLQl8IHo4ay0qKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQlhbWlnYXVuaXggfCBhbWl4KQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWFwb2xsbzY4YnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1ic2QKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWM5MCkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY29udmV4LWMxKQotCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMyKQotCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzMikKLQkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM0KQotCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzgpCi0JCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY3JheSB8IGo5MCkKLQkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKLQkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWkqODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaSo4NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWkqODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpKjg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdudW0gfCBtMzIzMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJb3M9LXN5c3YKLQkJOzsKLQltZXJsaW4pCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawotCQlvcz0tc3lzdgotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltbWl4KikKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltb3JwaG9zKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQlvcz0tbW9ycGhvcwotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcjMyIHwgb3IzMi0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJOzsKLQlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCi0JICAgICAgICA7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0JcHczMikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KLQkJb3M9LXB3MzIKLQkJOzsKLQlyb202OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JczM5MCB8IHMzOTAtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQotCQk7OwotCXMzOTB4IHwgczM5MHgtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0gICAgICAgIHN2MSkKLQkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZCkKLQkJYmFzaWNfbWFjaGluZT1hbHBoYS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b2FkMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKLQkJb3M9LXRvcHMyMAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jd2luZG93czMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LXdpbmRvd3MzMi1tc3ZjcnQKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoMyB8IHNoNCB8IHNoM2ViIHwgc2g0ZWIpCi0JCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JYzR4KikKLQkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQotCQlvcz0tY29mZgotCQk7OwotCSotdW5rbm93bikKLQkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCi0JICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCi0JICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCi0JICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAotCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8qKQotCQlvcz0tbnRvLXFueAotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3BlbmVkKikKLQkJb3M9LW9wZW5lZGl0aW9uCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCSAgICAgICAgb3M9LW5leHRzdGVwMgotCQk7OwotCS1uc2sqKQotCQlvcz0tbnNrCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkgICAgICAgIG9zPS1taW50Ci0JCTs7Ci0JLW5vbmUpCi0JCTs7Ci0JKikKLQkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLWVsc2UKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgotIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKLSMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KLQotIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAotIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAotIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCi0jIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKLSMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCi0KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KLQlwZHAxMC0qKQotCQlvcz0tdG9wczIwCi0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCW9yMzItKikKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgotCQlvcz0tc3lzdjMKLQkJOzsKLQlzcGFyYy0qIHwgKi1zdW4pCi0JCW9zPS1zdW5vczQuMS4xCi0JCTs7Ci0JKi1iZSkKLQkJb3M9LWJlb3MKLQkJOzsKLQkqLWlibSkKLQkJb3M9LWFpeAotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLSAgICAgICAgKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLSAgICAgICAgKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotICAgICAgICAqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLSAgICAgICAgKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSotcm9tNjhrKQotCQlvcz0tY29mZgotCQk7OwotCSotKmJ1ZykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLWFwcGxlKQotCQlvcz0tbWFjb3MKLQkJOzsKLQkqLWF0YXJpKikKLQkJb3M9LW1pbnQKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktYmVvcyopCi0JCQkJdmVuZG9yPWJlCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLW1wZWl4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyogfCAtb3BlbmVkKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCQktdm9zKikKLQkJCQl2ZW5kb3I9c3RyYXR1cwotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbmZpZ3VyZSBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZjMTkyYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1MDc3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBvcmcuZWNsaXBzZS5wdHAudXRpbHMgMi4xLjQuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLSMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi1pZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCi0gIGlmIChldmFsICI6IikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLQotICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0geWVzICYmIAkgKGV2YWwgIjoKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotKAotICBhc19saW5lbm9fMT1cJExJTkVOTwotICBhc19saW5lbm9fMj1cJExJTkVOTwotICB0ZXN0IFwieFwkYXNfbGluZW5vXzFcIiAhPSBcInhcJGFzX2xpbmVub18yXCIgJiYKLSAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLSIpIDI+IC9kZXYvbnVsbDsgdGhlbgotICA6Ci1lbHNlCi0gIGFzX2NhbmRpZGF0ZV9zaGVsbHM9Ci0gICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBjYXNlICRhc19kaXIgaW4KLQkgLyopCi0JICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKLQkgICBkb25lOzsKLSAgICAgICBlc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KLQkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKLQkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotOgotX0FTRU9GCi19OyB0aGVuCi0gIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKLQkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLQkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0ICQxKQotfQotYXNfZnVuY19zdWNjZXNzICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMAotfQotYXNfZnVuY19mYWlsdXJlICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMQotfQotYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Ci0gIHJldHVybiAwCi19Ci1hc19mdW5jX3JldF9mYWlsdXJlICgpIHsKLSAgcmV0dXJuIDEKLX0KLQotZXhpdGNvZGU9MAotaWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi0KLXRlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotX0FTRU9GCi19OyB0aGVuCi0gIGJyZWFrCi1maQotCi1maQotCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCi0gICAgICAgIGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gICAgICAgIGRvbmUKLSAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci1maQotCi0KLSAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KLSAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQotICAgICAgZWNobyBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgUGxlYXNlIGluc3RhbGwgYQotICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQotICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCi0gICAgICB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLQotZmkKLQotZmkKLQotCi0KLShldmFsICJhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgewotICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgotICBlY2hvIFBsZWFzZSB0ZWxsIGF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCi0gIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKLSAgZWNobyBtZXNzYWdlCi19Ci0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KLS1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gICopICAgRUNIT19DPSdcYyc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyCi1maQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi0KLWV4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKLQotIyBOYW1lIG9mIHRoZSBob3N0LgotIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKLSMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgotYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0KLSMKLSMgSW5pdGlhbGl6YXRpb25zLgotIwotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotYWNfY2xlYW5fZmlsZXM9Ci1hY19jb25maWdfbGlib2JqX2Rpcj0uCi1MSUJPQkpTPQotY3Jvc3NfY29tcGlsaW5nPW5vCi1zdWJkaXJzPQotTUZMQUdTPQotTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCi1QQUNLQUdFX05BTUU9J29yZy5lY2xpcHNlLnB0cC51dGlscycKLVBBQ0tBR0VfVEFSTkFNRT0nb3JnLWVjbGlwc2UtcHRwLXV0aWxzJwotUEFDS0FHRV9WRVJTSU9OPScyLjEuNCcKLVBBQ0tBR0VfU1RSSU5HPSdvcmcuZWNsaXBzZS5wdHAudXRpbHMgMi4xLjQnCi1QQUNLQUdFX0JVR1JFUE9SVD0nJwotCi1hY191bmlxdWVfZmlsZT0ic3JjL2FyZ3MuYyIKLWFjX3N1YnN0X3ZhcnM9J1NIRUxMCi1QQVRIX1NFUEFSQVRPUgotUEFDS0FHRV9OQU1FCi1QQUNLQUdFX1RBUk5BTUUKLVBBQ0tBR0VfVkVSU0lPTgotUEFDS0FHRV9TVFJJTkcKLVBBQ0tBR0VfQlVHUkVQT1JUCi1leGVjX3ByZWZpeAotcHJlZml4Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1iaW5kaXIKLXNiaW5kaXIKLWxpYmV4ZWNkaXIKLWRhdGFyb290ZGlyCi1kYXRhZGlyCi1zeXNjb25mZGlyCi1zaGFyZWRzdGF0ZWRpcgotbG9jYWxzdGF0ZWRpcgotaW5jbHVkZWRpcgotb2xkaW5jbHVkZWRpcgotZG9jZGlyCi1pbmZvZGlyCi1odG1sZGlyCi1kdmlkaXIKLXBkZmRpcgotcHNkaXIKLWxpYmRpcgotbG9jYWxlZGlyCi1tYW5kaXIKLURFRlMKLUVDSE9fQwotRUNIT19OCi1FQ0hPX1QKLUxJQlMKLWJ1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUlOU1RBTExfUFJPR1JBTQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfREFUQQotYW1fX2lzcmMKLUNZR1BBVEhfVwotUEFDS0FHRQotVkVSU0lPTgotQUNMT0NBTAotQVVUT0NPTkYKLUFVVE9NQUtFCi1BVVRPSEVBREVSCi1NQUtFSU5GTwotaW5zdGFsbF9zaAotU1RSSVAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotbWtkaXJfcAotQVdLCi1TRVRfTUFLRQotYW1fX2xlYWRpbmdfZG90Ci1BTVRBUgotYW1fX3RhcgotYW1fX3VudGFyCi1idWlsZAotYnVpbGRfY3B1Ci1idWlsZF92ZW5kb3IKLWJ1aWxkX29zCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1DUFBGTEFHUwotYWNfY3RfQ0MKLUVYRUVYVAotT0JKRVhUCi1ERVBESVIKLWFtX19pbmNsdWRlCi1hbV9fcXVvdGUKLUFNREVQX1RSVUUKLUFNREVQX0ZBTFNFCi1BTURFUEJBQ0tTTEFTSAotQ0NERVBNT0RFCi1hbV9fZmFzdGRlcENDX1RSVUUKLWFtX19mYXN0ZGVwQ0NfRkFMU0UKLVJBTkxJQgotTElCT0JKUwotTFRMSUJPQkpTJwotYWNfc3Vic3RfZmlsZXM9JycKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTJwotCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLWFjX2luaXRfaGVscD0KLWFjX2luaXRfdmVyc2lvbj1mYWxzZQotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWNhY2hlX2ZpbGU9L2Rldi9udWxsCi1leGVjX3ByZWZpeD1OT05FCi1ub19jcmVhdGU9Ci1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi0KLSMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgotIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCi0jIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAotIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgotIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KLSMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJwotZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1kb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCi1pbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJwotaHRtbGRpcj0nJHtkb2NkaXJ9JwotZHZpZGlyPScke2RvY2Rpcn0nCi1wZGZkaXI9JyR7ZG9jZGlyfScKLXBzZGlyPScke2RvY2Rpcn0nCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWxvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJwotbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCi0KLWFjX3ByZXY9Ci1hY19kYXNoZGFzaD0KLWZvciBhY19vcHRpb24KLWRvCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAqPSopCWFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICopCWFjX29wdGFyZz15ZXMgOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCi0gIC0tKQotICAgIGFjX2Rhc2hkYXNoPXllcyA7OwotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLS1jb25maWctY2FjaGUgfCAtQykKLSAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQotICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAotICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKLSAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7Ci0gIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKLSAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCi0gICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1ubyA7OwotCi0gIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCi0gICAgYWNfcHJldj1kb2NkaXIgOzsKLSAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCi0gICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQotICAgIGFjX3ByZXY9ZHZpZGlyIDs7Ci0gIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCi0gICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9XCRhY19vcHRhcmcgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKLSAgICBhY19pbml0X2hlbHA9bG9uZyA7OwotICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCi0gICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OwotICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCi0gICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCi0gICAgYWNfcHJldj1odG1sZGlyIDs7Ci0gIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAotICB8IC0taHQ9KikKLSAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQotICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7Ci0gIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCi0gICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKLSAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKLQotICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQotICAgIGFjX3ByZXY9cGRmZGlyIDs7Ci0gIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCi0gICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQotICAgIGFjX3ByZXY9cHNkaXIgOzsKLSAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCi0gICAgcHNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSRhY19vcHRhcmcgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKLSAgICBhY19pbml0X3ZlcnNpb249OiA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9XCRhY19vcHRhcmcgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPW5vIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKLQotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZwotICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7Ci0KLSAgKikKLSAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCi0gICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgotICAgIDogJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0KLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCi1mb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKLQkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCi0JCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKLQkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKLWRvCi0gIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICBjYXNlICRhY192YWwgaW4KLSAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OwotICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKLSAgZXNhYwotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgotICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogV29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci10ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgotICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkMCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KLSAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLWFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKLWFjX2Fic19jb25mZGlyPWAoCi0JY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCB7IGVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19tc2ciID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBvcmcuZWNsaXBzZS5wdHAudXRpbHMgMi4xLjQgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQotICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJwotICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KLQotSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLQkJCSAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLQkJCSAgW1BSRUZJWF0KLQotQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCi1cYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQotYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKLWZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCi0KLUZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgotCi1GaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotICAtLWJpbmRpcj1ESVIgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQotICAtLWRhdGFyb290ZGlyPURJUiAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KLSAgLS1sb2NhbGVkaXI9RElSICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL29yZy1lY2xpcHNlLXB0cC11dGlsc10KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotX0FDRU9GCi0KLSAgY2F0IDw8XF9BQ0VPRgotCi1Qcm9ncmFtIG5hbWVzOgotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi1fQUNFT0YKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCi0gIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2Ygb3JnLmVjbGlwc2UucHRwLnV0aWxzIDIuMS40OiI7OwotICAgZXNhYwotICBjYXQgPDxcX0FDRU9GCi0KLU9wdGlvbmFsIEZlYXR1cmVzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycwotCi1Tb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCi0gIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKLSAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCi0gICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KLSAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0gICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1fQUNFT0YKLWFjX3N0YXR1cz0kPwotZmkKLQotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgotICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQotICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8IGNvbnRpbnVlCi0gICAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKLSAgICBmaSB8fCBhY19zdGF0dXM9JD8KLSAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Ci0gIGRvbmUKLWZpCi0KLXRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwotaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgotICBjYXQgPDxcX0FDRU9GCi1vcmcuZWNsaXBzZS5wdHAudXRpbHMgY29uZmlndXJlIDIuMS40Ci1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLWNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0KLUl0IHdhcyBjcmVhdGVkIGJ5IG9yZy5lY2xpcHNlLnB0cC51dGlscyAkYXNfbWUgMi4xLjQsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgJCAkMCAkQAotCi1fQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotY2F0IDw8X0FTVU5BTUUKLSMjIC0tLS0tLS0tLSAjIwotIyMgUGxhdGZvcm0uICMjCi0jIyAtLS0tLS0tLS0gIyMKLQotaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0KLV9BU1VOQU1FCi0KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19wYXNzIGluCi0gICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKLSAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgotCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KLSAgICAgIGVsc2UKLQljYXNlICRhY19hcmcgaW4KLQkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAotCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAotCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCi0JICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQotCi0jIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0jIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KLXRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotICB7Ci0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE91dHB1dCB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICAgIGRvbmUgfCBzb3J0Ci0gICAgICBlY2hvCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBjYXQgY29uZmRlZnMuaAotICAgICAgZWNobwotICAgIGZpCi0gICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLQotIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBzZXQgeCAiJENPTkZJR19TSVRFIgotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZmkKLXNoaWZ0Ci1mb3IgYWNfc2l0ZV9maWxlCi1kbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKLSAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gID4kY2FjaGVfZmlsZQotZmkKLQotIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQotIyB2YWx1ZS4KLWFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQotICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KLSAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICwpOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0JYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCi0gICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KLSAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTAnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKLSMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KLSMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgotYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCi1zL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCi1fQUNFT0YKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotcm0gLWYgY29uZnRlc3Quc2VkCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9Ci1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfSB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi0KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCi0gICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BV0s9JGFjX2N2X3Byb2dfQVdLCi1pZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCi1kb25lCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi0KLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotIFBBQ0tBR0U9J29yZy1lY2xpcHNlLXB0cC11dGlscycKLSBWRVJTSU9OPScyLjEuNCcKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLV9BQ0VPRgotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi0KLUFDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KLQotCi1BVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9Ci0KLQotTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9Ci0KLWluc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci0KLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi0KLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi1BTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9Ci0KLWFtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJwotCi0KLQotCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1hY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjY7IH0KLWNhc2UgJGFjX2N2X2J1aWxkIGluCi0qLSotKikgOzsKLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLWVzYWMKLWJ1aWxkPSRhY19jdl9idWlsZAotYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotc2V0IHggJGFjX2N2X2J1aWxkCi1zaGlmdAotYnVpbGRfY3B1PSQxCi1idWlsZF92ZW5kb3I9JDIKLXNoaWZ0OyBzaGlmdAotIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0jIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Ci1idWlsZF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRpbnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1hY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCi17IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0jCi0jIExpc3Qgb2YgcG9zc2libGUgb3V0cHV0IGZpbGVzLCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4KLSMgVGhlIGFsZ29yaXRobSBpcyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikKLSMgb25seSBhcyBhIGxhc3QgcmVzb3J0LiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KLWFjX2ZpbGVzPSdhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0JwotIwotIyBUaGUgSVJJWCA2IGxpbmtlciB3cml0ZXMgaW50byBleGlzdGluZyBmaWxlcyB3aGljaCBtYXkgbm90IGJlCi0jIGV4ZWN1dGFibGUsIHJldGFpbmluZyB0aGVpciBwZXJtaXNzaW9ucy4gIFJlbW92ZSB0aGVtIGZpcnN0IHNvIGEKLSMgc3Vic2VxdWVudCBleGVjdXRpb24gdGVzdCB3b3Jrcy4KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVzCi0KLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZvciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLSAgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Ci0JdGhlbiA6OyBlbHNlCi0JICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JZmkKLQkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKLQkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKLQkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLQkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKLQkjIGFjdHVhbGx5IHdvcmtpbmcuCi0JYnJlYWs7OwotICAgICogKQotCWJyZWFrOzsKLSAgZXNhYwotZG9uZQotdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Ci0KLWVsc2UKLSAgYWNfZmlsZT0nJwotZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLWZpCi0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KLSMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKLSMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBmaQotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0KLXJtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKLSMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAotIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSMgYHJtJy4KLWZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGJyZWFrOzsKLSAgICAqICkgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1ybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY29tcGlsZXJfZ251PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1HQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKLWFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLWFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JQ0ZMQUdTPSIiCi0gICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLQkgQ0ZMQUdTPSItZyIKLQkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0vKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCi1zdHJ1Y3QgYnVmIHsgaW50IHg7IH07Ci1GSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKmUgKHAsIGkpCi0gICAgIGNoYXIgKipwOwotICAgICBpbnQgaTsKLXsKLSAgcmV0dXJuIHBbaV07Ci19Ci1zdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCi17Ci0gIGNoYXIgKnM7Ci0gIHZhX2xpc3QgdjsKLSAgdmFfc3RhcnQgKHYscCk7Ci0gIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7Ci0gIHZhX2VuZCAodik7Ci0gIHJldHVybiBzOwotfQotCi0vKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcwotICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCi0gICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0Ci0gICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCi0gICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07Ci0KLS8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycwotICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLwotI2RlZmluZSBGT08oeCkgJ3gnCi1pbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKLQotaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Ci1zdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKLXN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OwotaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci1pbnQgYXJnYzsKLWNoYXIgKiphcmd2OwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKLQktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgotZG8KLSAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUNDPSRhY19zYXZlX0NDCi0KLWZpCi0jIEFDX0NBQ0hFX1ZBTAotY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KLSAgeCkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKLSAgeG5vKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9dW5zdXBwb3J0ZWQiID4mNjsgfSA7OwotICAqKQotICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Ci1lc2FjCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIGRvbmUKLS5QSE9OWTogYW1fX2RvaXQKLUVORAotIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKLSMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KLSMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKLSMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCi0jIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KLWlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgotICAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICAgYW1fX3F1b3RlPQotICAgX2FtX3Jlc3VsdD1HTlUKLWZpCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KLSAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgICBhbV9fcXVvdGU9IlwiIgotICAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgIGZpCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOwotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLSBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi0KLWRlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0gaWYKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1maQotc2V0IGR1bW15ICRDQzsgYWNfY2M9YGVjaG8gJDIgfAotCQkgICAgICBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX287IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLSMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgotIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KLSMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCi1hY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLXJtIC1mIGNvbmZ0ZXN0Mi4qCi1pZiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsKLXRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz15ZXMKLSAgaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gICAgIyBUZXN0IGZpcnN0IHRoYXQgY2MgZXhpc3RzIGF0IGFsbC4KLSAgICBpZiB7IGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JwotICAgICAgcm0gLWYgY29uZnRlc3QyLioKLSAgICAgIGlmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07Ci0gICAgICB0aGVuCi0JIyBjYyB3b3JrcyB0b28uCi0JOgotICAgICAgZWxzZQotCSMgY2MgZXhpc3RzIGJ1dCBkb2Vzbid0IGxpa2UgLW8uCi0JZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotICAgICAgZmkKLSAgICBmaQotICBmaQotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBOT19NSU5VU19DX01JTlVTX08gMQotX0FDRU9GCi0KLWZpCi0KLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkMiB8IHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX2NjXycke2FjX2NjfV9jX29gXCIgIT0geWVzIjsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbgotICAuLyB8IC4vLyB8IC9jQy8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICBicmVhayAzCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgZG9uZQotICAgIDs7Ci1lc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQotZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNjsgfQotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAkRUNIT19DIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCi1TSEVMTCA9IC9iaW4vc2gKLWFsbDoKLQlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwotX0FDRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLSAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKLWlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KLSAgICBSQU5MSUI9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgotICBmaQotZWxzZQotICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWZpCi0KLQotb3M9YHVuYW1lIC1zYAotaWYgdGVzdCAieCRvcyIgPSAieEFJWCIgOyB0aGVuCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1xaW5mbz1nZW4gLXFjcGx1c2NtdCIKLWVsc2UKLQlDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCi1maQotCi0KLQotZm9yIGFjX2Z1bmMgaW4gYXNwcmludGYKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgotCi1jYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgotIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAotIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAotIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi0jIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KLSMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKLSMgZm9sbG93aW5nIHZhbHVlcy4KLQotX0FDRU9GCi0KLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICAqKSAkYXNfdW5zZXQgJGFjX3ZhciA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCi0gICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICAgIHNlZCAtbiBcCi0JInMvJy8nXFxcXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKSB8Ci0gIHNlZCAnCi0gICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAotICAgICB0IGNsZWFyCi0gICAgIDpjbGVhcgotICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCi0gICAgIHQgZW5kCi0gICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LwotICAgICA6ZW5kJyA+PmNvbmZjYWNoZQotaWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQotICBlbHNlCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLWFjX2xpYm9ianM9Ci1hY19sdGxpYm9ianM9Ci1mb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKLSAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKLSAgYWNfaT1gZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKLSAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgotICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KLSAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotZG9uZQotTElCT0JKUz0kYWNfbGlib2JqcwotCi1MVExJQk9CSlM9JGFjX2x0bGlib2JqcwotCi0KLWlmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotaWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfRkFMU0V9IjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotIyEgJFNIRUxMCi0jIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotZGVidWc9ZmFsc2UKLWFjX2NzX3JlY2hlY2s9ZmFsc2UKLWFjX2NzX3NpbGVudD1mYWxzZQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLQotCi0jIFBBVEggbmVlZHMgQ1IKLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKLSAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotICBjaG1vZCAreCBjb25mJCQuc2gKLSAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgZWxzZQotICAgIFBBVEhfU0VQQVJBVE9SPToKLSAgZmkKLSAgcm0gLWYgY29uZiQkLnNoCi1maQotCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1hc19ubD0nCi0nCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1jYXNlICQwIGluCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi1mb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICi1kbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KLS1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gICopICAgRUNIT19DPSdcYyc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyCi1maQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi1leGVjIDY+JjEKLQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KLSMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KLWFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IG9yZy5lY2xpcHNlLnB0cC51dGlscyAkYXNfbWUgMi4xLjQsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwotICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKLSAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUwotICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCi0gICQgJDAgJEAKLQotb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0iCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKLWNvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotYWNfY3NfdXNhZ2U9IlwKLVxgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQotY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1Vc2FnZTogJDAgW09QVElPTlNdIFtGSUxFXS4uLgotCi0gIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0Ci0gIC1xLCAtLXF1aWV0ICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCi0gIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcwotICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCi0gIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KLQkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCi0gIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQotCi1Db25maWd1cmF0aW9uIGZpbGVzOgotJGNvbmZpZ19maWxlcwotCi1Db25maWd1cmF0aW9uIGhlYWRlcnM6Ci0kY29uZmlnX2hlYWRlcnMKLQotQ29uZmlndXJhdGlvbiBjb21tYW5kczoKLSRjb25maWdfY29tbWFuZHMKLQotUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLWFjX2NzX3ZlcnNpb249IlxcCi1vcmcuZWNsaXBzZS5wdHAudXRpbHMgY29uZmlnLnN0YXR1cyAyLjEuNAotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLAotICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgotCi1Db3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCi0KLWFjX3B3ZD0nJGFjX3B3ZCcKLXNyY2Rpcj0nJHNyY2RpcicKLUlOU1RBTEw9JyRJTlNUQUxMJwotTUtESVJfUD0nJE1LRElSX1AnCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0jIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAotIyB2YWx1ZS4gIEJ5IHdlIG5lZWQgdG8ga25vdyBpZiBmaWxlcyB3ZXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KLWFjX25lZWRfZGVmYXVsdHM9Ogotd2hpbGUgdGVzdCAkIyAhPSAwCi1kbwotICBjYXNlICQxIGluCi0gIC0tKj0qKQotICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCi0gICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAotICAgIGFjX3NoaWZ0PToKLSAgICA7OwotICAqKQotICAgIGFjX29wdGlvbj0kMQotICAgIGFjX29wdGFyZz0kMgotICAgIGFjX3NoaWZ0PXNoaWZ0Ci0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBhY19jc19yZWNoZWNrPTogOzsKLSAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQotICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZSB8IC0taCkKLSAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIC0taGVscCB8IC0taGVsIHwgLWggKQotICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQotICAgIGFjX2NzX3NpbGVudD06IDs7Ci0KLSAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0KLSAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKLSAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwotCi0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Ci0KLWlmICRhY19jc19zaWxlbnQ7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgotZmkKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIGVjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCAkU0hFTEwgJDAgIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgotICBDT05GSUdfU0hFTEw9JFNIRUxMCi0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgZXhlYyAkU0hFTEwgIiQwIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKLSMjIFJ1bm5pbmcgJGFzX21lLiAjIwotX0FTQk9YCi0gIGVjaG8gIiRhY19sb2ciCi19ID4mNQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jCi0jIElOSVQtQ09NTUFORFMKLSMKLUFNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotCi0jIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KLWZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotZG8KLSAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgotICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7Ci0gICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLQotICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0KLSMKLSMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCi0jCi0KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotCi1fQUNFT0YKLQotCi0KLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotU0hFTEwhJFNIRUxMJGFjX2RlbGltCi1QQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KLVBBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi1QQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQotUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KLVBBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCi1leGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KLXByZWZpeCEkcHJlZml4JGFjX2RlbGltCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCi1iaW5kaXIhJGJpbmRpciRhY19kZWxpbQotc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQotZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCi1kYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi1zeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCi1zaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KLWxvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLWluY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KLW9sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KLWRvY2RpciEkZG9jZGlyJGFjX2RlbGltCi1pbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCi1odG1sZGlyISRodG1sZGlyJGFjX2RlbGltCi1kdmlkaXIhJGR2aWRpciRhY19kZWxpbQotcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KLXBzZGlyISRwc2RpciRhY19kZWxpbQotbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLWxvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCi1tYW5kaXIhJG1hbmRpciRhY19kZWxpbQotREVGUyEkREVGUyRhY19kZWxpbQotRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KLUVDSE9fTiEkRUNIT19OJGFjX2RlbGltCi1FQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotTElCUyEkTElCUyRhY19kZWxpbQotYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCi1ob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi10YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQotSU5TVEFMTF9QUk9HUkFNISRJTlNUQUxMX1BST0dSQU0kYWNfZGVsaW0KLUlOU1RBTExfU0NSSVBUISRJTlNUQUxMX1NDUklQVCRhY19kZWxpbQotSU5TVEFMTF9EQVRBISRJTlNUQUxMX0RBVEEkYWNfZGVsaW0KLWFtX19pc3JjISRhbV9faXNyYyRhY19kZWxpbQotQ1lHUEFUSF9XISRDWUdQQVRIX1ckYWNfZGVsaW0KLVBBQ0tBR0UhJFBBQ0tBR0UkYWNfZGVsaW0KLVZFUlNJT04hJFZFUlNJT04kYWNfZGVsaW0KLUFDTE9DQUwhJEFDTE9DQUwkYWNfZGVsaW0KLUFVVE9DT05GISRBVVRPQ09ORiRhY19kZWxpbQotQVVUT01BS0UhJEFVVE9NQUtFJGFjX2RlbGltCi1BVVRPSEVBREVSISRBVVRPSEVBREVSJGFjX2RlbGltCi1NQUtFSU5GTyEkTUFLRUlORk8kYWNfZGVsaW0KLWluc3RhbGxfc2ghJGluc3RhbGxfc2gkYWNfZGVsaW0KLVNUUklQISRTVFJJUCRhY19kZWxpbQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNISRJTlNUQUxMX1NUUklQX1BST0dSQU0kYWNfZGVsaW0KLW1rZGlyX3AhJG1rZGlyX3AkYWNfZGVsaW0KLUFXSyEkQVdLJGFjX2RlbGltCi1TRVRfTUFLRSEkU0VUX01BS0UkYWNfZGVsaW0KLWFtX19sZWFkaW5nX2RvdCEkYW1fX2xlYWRpbmdfZG90JGFjX2RlbGltCi1BTVRBUiEkQU1UQVIkYWNfZGVsaW0KLWFtX190YXIhJGFtX190YXIkYWNfZGVsaW0KLWFtX191bnRhciEkYW1fX3VudGFyJGFjX2RlbGltCi1idWlsZCEkYnVpbGQkYWNfZGVsaW0KLWJ1aWxkX2NwdSEkYnVpbGRfY3B1JGFjX2RlbGltCi1idWlsZF92ZW5kb3IhJGJ1aWxkX3ZlbmRvciRhY19kZWxpbQotYnVpbGRfb3MhJGJ1aWxkX29zJGFjX2RlbGltCi1DQyEkQ0MkYWNfZGVsaW0KLUNGTEFHUyEkQ0ZMQUdTJGFjX2RlbGltCi1MREZMQUdTISRMREZMQUdTJGFjX2RlbGltCi1DUFBGTEFHUyEkQ1BQRkxBR1MkYWNfZGVsaW0KLWFjX2N0X0NDISRhY19jdF9DQyRhY19kZWxpbQotRVhFRVhUISRFWEVFWFQkYWNfZGVsaW0KLU9CSkVYVCEkT0JKRVhUJGFjX2RlbGltCi1ERVBESVIhJERFUERJUiRhY19kZWxpbQotYW1fX2luY2x1ZGUhJGFtX19pbmNsdWRlJGFjX2RlbGltCi1hbV9fcXVvdGUhJGFtX19xdW90ZSRhY19kZWxpbQotQU1ERVBfVFJVRSEkQU1ERVBfVFJVRSRhY19kZWxpbQotQU1ERVBfRkFMU0UhJEFNREVQX0ZBTFNFJGFjX2RlbGltCi1BTURFUEJBQ0tTTEFTSCEkQU1ERVBCQUNLU0xBU0gkYWNfZGVsaW0KLUNDREVQTU9ERSEkQ0NERVBNT0RFJGFjX2RlbGltCi1hbV9fZmFzdGRlcENDX1RSVUUhJGFtX19mYXN0ZGVwQ0NfVFJVRSRhY19kZWxpbQotYW1fX2Zhc3RkZXBDQ19GQUxTRSEkYW1fX2Zhc3RkZXBDQ19GQUxTRSRhY19kZWxpbQotUkFOTElCISRSQU5MSUIkYWNfZGVsaW0KLUxJQk9CSlMhJExJQk9CSlMkYWNfZGVsaW0KLUxUTElCT0JKUyEkTFRMSUJPQkpTJGFjX2RlbGltCi1fQUNFT0YKLQotICBpZiB0ZXN0IGBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuc2VkIHwgZ3JlcCAtYyBYYCA9IDgyOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KLSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICBlbHNlCi0gICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKLSAgZmkKLWRvbmUKLQotYWNfZW9mPWBzZWQgLW4gJy9eQ0VPRlswLTldKiQvcy9DRU9GLzAvcCcgY29uZiQkc3Vicy5zZWRgCi1pZiB0ZXN0IC1uICIkYWNfZW9mIjsgdGhlbgotICBhY19lb2Y9YGVjaG8gIiRhY19lb2YiIHwgc29ydCAtbnJ1IHwgc2VkIDFxYAotICBhY19lb2Y9YGV4cHIgJGFjX2VvZiArIDFgCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotY2F0ID4iXCR0bXAvc3Vicy0xLnNlZCIgPDxcQ0VPRiRhY19lb2YKLS9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIgZW5kCi1fQUNFT0YKLXNlZCAnCi1zL1ssXFwmXS9cXCYvZzsgcy9AL0B8I18hIV8jfC9nCi1zL14vcyxALzsgcy8hL0AsfCNfISFfI3wvCi06bgotdCBuCi1zLyciJGFjX2RlbGltIickLyxnLzsgdAotcy8kL1xcLzsgcAotTjsgcy9eLipcbi8vOyBzL1ssXFwmXS9cXCYvZzsgcy9AL0B8I18hIV8jfC9nOyBiIG4KLScgPj4kQ09ORklHX1NUQVRVUyA8Y29uZiQkc3Vicy5zZWQKLXJtIC1mIGNvbmYkJHN1YnMuc2VkCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotOmVuZAotcy98I18hIV8jfC8vZwotQ0VPRiRhY19lb2YKLV9BQ0VPRgotCi0KLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAotIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKLSMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5Ci0jIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9L3sKLXMvOipcJChzcmNkaXIpOiovOi8KLXMvOipcJHtzcmNkaXJ9OiovOi8KLXMvOipAc3JjZGlyQDoqLzovCi1zL15cKFtePV0qPVsJIF0qXCk6Ki9cMS8KLXMvOiokLy8KLXMvXltePV0qPVsJIF0qJC8vCi19JwotZmkKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLQotZm9yIGFjX3RhZyBpbiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMKLWRvCi0gIGNhc2UgJGFjX3RhZyBpbgotICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKLSAgZXNhYwotICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgotICA6W0ZITF0qOiopOzsKLSAgOkwqIHwgOkMqOiopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJHRtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gICAgICBlc2FjCi0gICAgICBhY19maWxlX2lucHV0cz0iJGFjX2ZpbGVfaW5wdXRzICRhY19mIgotICAgIGRvbmUKLQotICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Ci0gICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgotICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCi0gICAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgZnJvbSAiYElGUz06Ci0JICBlY2hvICQqIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZydgIiBieSBjb25maWd1cmUuIgotICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KLSAgICBmaQotCi0gICAgY2FzZSAkYWNfdGFnIGluCi0gICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFjX2ZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICB7IGFzX2Rpcj0iJGFjX2RpciIKLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7Ci0gICAgYXNfZGlycz0KLSAgICB3aGlsZSA6OyBkbwotICAgICAgY2FzZSAkYXNfZGlyIGluICMoCi0gICAgICAqXCcqKSBhc19xZGlyPWBlY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhc19kaXIiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQotICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLy4uLGc7cywvLCwnYAotICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCi0gICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7Ci0gIGVzYWMgOzsKLWVzYWMKLWFjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAotYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAotIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLWFjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAotCi1jYXNlICRzcmNkaXIgaW4KLSAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgIGFjX3NyY2Rpcj0uCi0gICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKLSAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Ci0gICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OwotICAqKSAjIFJlbGF0aXZlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4Ci0gICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKLWVzYWMKLWFjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLQotCi0gIGNhc2UgJGFjX21vZGUgaW4KLSAgOkYpCi0gICMKLSAgIyBDT05GSUdfRklMRQotICAjCi0KLSAgY2FzZSAkSU5TVEFMTCBpbgotICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7Ci0gICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZF9wcmVmaXgkSU5TVEFMTCA7OwotICBlc2FjCi0gIGFjX01LRElSX1A9JE1LRElSX1AKLSAgY2FzZSAkTUtESVJfUCBpbgotICBbXFwvJF0qIHwgPzpbXFwvXSogKSA7OwotICAqLyopIGFjX01LRElSX1A9JGFjX3RvcF9idWlsZF9wcmVmaXgkTUtESVJfUCA7OwotICBlc2FjCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0jIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCi0jIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KLWFjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQotCi1jYXNlIGBzZWQgLW4gJy9kYXRhcm9vdGRpci8gewotICBwCi0gIHEKLX0KLS9AZGF0YWRpckAvcAotL0Bkb2NkaXJAL3AKLS9AaW5mb2RpckAvcAotL0Bsb2NhbGVkaXJAL3AKLS9AbWFuZGlyQC9wCi0nICRhY19maWxlX2lucHV0c2AgaW4KLSpkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKLSpAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9Ci1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0gIGFjX2RhdGFyb290ZGlyX2hhY2s9JwotICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCi0gIHMmQGRvY2RpckAmJGRvY2RpciZnCi0gIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKLSAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKLSAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKLSAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OwotZXNhYwotX0FDRU9GCi0KLSMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KLSMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgotIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgc2VkICIkYWNfdnBzdWIKLSRleHRyYXN1YgotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLTp0Ci0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCi1zJkBjb25maWd1cmVfaW5wdXRAJiRjb25maWd1cmVfaW5wdXQmO3QgdAotcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0Ci1zJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAotcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAotcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAotcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Ci1zJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKLXMmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0Ci1zJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Ci1zJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0Ci1zJkBNS0RJUl9QQCYkYWNfTUtESVJfUCY7dCB0Ci0kYWNfZGF0YXJvb3RkaXJfaGFjawotIiAkYWNfZmlsZV9pbnB1dHMgfCBzZWQgLWYgIiR0bXAvc3Vicy0xLnNlZCIgPiR0bXAvb3V0Ci0KLXRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0gIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnICIkdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKLXdoaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZC4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKLXdoaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZC4iID4mMjt9Ci0KLSAgcm0gLWYgIiR0bXAvc3RkaW4iCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgLSkgY2F0ICIkdG1wL291dCI7IHJtIC1mICIkdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiOyBtdiAiJHRtcC9vdXQiICRhY19maWxlOzsKLSAgZXNhYwotIDs7Ci0gIDpIKQotICAjCi0gICMgQ09ORklHX0hFQURFUgotICAjCi1fQUNFT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBgY29uZnRlc3QuZGVmaW5lcycsIHRoYXQKLSMgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC50YWlsCi0jIEZpcnN0LCBhcHBlbmQgYSBzcGFjZSB0byBldmVyeSB1bmRlZi9kZWZpbmUgbGluZSwgdG8gZWFzZSBtYXRjaGluZy4KLWVjaG8gJ3MvJC8gLycgPmNvbmZ0ZXN0LmRlZmluZXMKLSMgVGhlbiwgcHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0LCBvciBpbgotIyBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50LCBpbiBjb25maWcuc3RhdHVzLiAgSWYgc29tZSBtYWNyb3Mgd2VyZQotIyBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0aGVyZSBtaWdodCBiZSBzZXZlcmFsICNkZWZpbmVzIGZvciB0aGUgc2FtZQotIyBzeW1ib2wsIHdoaWNoIGlzIHVzZWxlc3MuICBCdXQgZG8gbm90IHNvcnQgdGhlbSwgc2luY2UgdGhlIGxhc3QKLSMgQUNfREVGSU5FIG11c3QgYmUgaG9ub3JlZC4KLWFjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgUEFSQU1TIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkLCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jIFBBUkFNUyBpcyB0aGUgcGFyYW1ldGVyIGxpc3QgaW4gdGhlIG1hY3JvIGRlZmluaXRpb24tLWluIG1vc3QgY2FzZXMsIGl0J3MKLSMganVzdCBhbiBlbXB0eSBzdHJpbmcuCi1hY19kQT0ncyxeXFwoWwkgI10qXFwpW14JIF0qXFwoWwkgXSonCi1hY19kQj0nXFwpWwkgKF0uKixcXDFkZWZpbmVcXDInCi1hY19kQz0nICcKLWFjX2REPScgLCcKLQotdW5pcSBjb25mZGVmcy5oIHwKLSAgc2VkIC1uICcKLQl0IHJzZXQKLQk6cnNldAotCXMvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qLy8KLQl0IG9rCi0JZAotCTpvawotCXMvW1xcJixdL1xcJi9nCi0Jcy9eXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpLyAnIiRhY19kQSInXDEnIiRhY19kQiInXDInIiR7YWNfZEN9IidcMyciJGFjX2REIicvcAotCXMvXlwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS8nIiRhY19kQSInXDEnIiRhY19kQiRhY19kQyInXDInIiRhY19kRCInL3AKLSAgJyA+PmNvbmZ0ZXN0LmRlZmluZXMKLQotIyBSZW1vdmUgdGhlIHNwYWNlIHRoYXQgd2FzIGFwcGVuZGVkIHRvIGVhc2UgbWF0Y2hpbmcuCi0jIFRoZW4gcmVwbGFjZSAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotIyAoVGhlIHJlZ2V4cCBjYW4gYmUgc2hvcnQsIHNpbmNlIHRoZSBsaW5lIGNvbnRhaW5zIGVpdGhlciAjZGVmaW5lIG9yICN1bmRlZi4pCi1lY2hvICdzLyAkLy8KLXMsXlsJICNdKnUuKiwvKiAmICovLCcgPj5jb25mdGVzdC5kZWZpbmVzCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QuZGVmaW5lczoKLWFjX21heF9zZWRfbGluZXM9NTAKLQotIyBGaXJzdCBzZWQgY29tbWFuZCBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAkYWNfZmlsZV9pbnB1dHMgPiIkdG1wL291dDEiCi0jIFNlY29uZCBvbmUgaXM6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MSIgPiIkdG1wL291dDIiCi0jIFRoaXJkIG9uZSB3aWxsIGJlOgkgc2VkIC1mIGRlZmluZXMuc2VkICIkdG1wL291dDIiID4iJHRtcC9vdXQxIgotIyBldCBjZXRlcmEuCi1hY19pbj0nJGFjX2ZpbGVfaW5wdXRzJwotYWNfb3V0PSciJHRtcC9vdXQxIicKLWFjX254dD0nIiR0bXAvb3V0MiInCi0KLXdoaWxlIDoKLWRvCi0gICMgV3JpdGUgYSBoZXJlIGRvY3VtZW50OgotICAgIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0gICAgIyBGaXJzdCwgY2hlY2sgdGhlIGZvcm1hdCBvZiB0aGUgbGluZToKLSAgICBjYXQgPiJcJHRtcC9kZWZpbmVzLnNlZCIgPDxcXENFT0YKLS9eWwkgXSojWwkgXSp1bmRlZlsJIF1bCSBdKiRhY193b3JkX3JlWwkgXSpcJC9iIGRlZgotL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKiRhY193b3JkX3JlWygJIF0vYiBkZWYKLWIKLTpkZWYKLV9BQ0VPRgotICBzZWQgJHthY19tYXhfc2VkX2xpbmVzfXEgY29uZnRlc3QuZGVmaW5lcyA+PiRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgICBzZWQgLWYgIiR0bXAvZGVmaW5lcy5zZWQiJyAiJGFjX2luID4kYWNfb3V0IiA+PiRDT05GSUdfU1RBVFVTCi0gIGFjX2luPSRhY19vdXQ7IGFjX291dD0kYWNfbnh0OyBhY19ueHQ9JGFjX2luCi0gIHNlZCAxLCR7YWNfbWF4X3NlZF9saW5lc31kIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnRhaWwKLSAgZ3JlcCAuIGNvbmZ0ZXN0LnRhaWwgPi9kZXYvbnVsbCB8fCBicmVhawotICBybSAtZiBjb25mdGVzdC5kZWZpbmVzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QuZGVmaW5lcwotZG9uZQotcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC50YWlsCi0KLWVjaG8gImFjX3Jlc3VsdD0kYWNfaW4iID4+JENPTkZJR19TVEFUVVMKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iID4iJHRtcC9jb25maWcuaCIKLSAgICBjYXQgIiRhY19yZXN1bHQiID4+IiR0bXAvY29uZmlnLmgiCi0gICAgaWYgZGlmZiAkYWNfZmlsZSAiJHRtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQotZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9Ci0gICAgZWxzZQotICAgICAgcm0gLWYgJGFjX2ZpbGUKLSAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAkYWNfZmlsZQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIKLSAgICBjYXQgIiRhY19yZXN1bHQiCi0gIGZpCi0gIHJtIC1mICIkdG1wL291dDEyIgotIyBDb21wdXRlICRhY19maWxlJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJGFjX2ZpbGUgfCAkYWNfZmlsZToqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJGFjX2ZpbGUiID5gJGFzX2Rpcm5hbWUgLS0gJGFjX2ZpbGUgfHwKLSRhc19leHByIFgkYWNfZmlsZSA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYJGFjX2ZpbGUgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCRhY19maWxlIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgkYWNfZmlsZSA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCRhY19maWxlIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYC9zdGFtcC1oJF9hbV9zdGFtcF9jb3VudAotIDs7Ci0KLSAgOkMpICB7IGVjaG8gIiRhc19tZTokTElORU5POiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQotZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9Ci0gOzsKLSAgZXNhYwotCi0KLSAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCi0gICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KLSAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAotICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KLSAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gIGlmIHNlZCAxMHEgIiRtZiIgfCBncmVwICdeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlJyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgZGlycGFydD1gJGFzX2Rpcm5hbWUgLS0gIiRtZiIgfHwKLSRhc19leHByIFgiJG1mIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkbWYiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICBlbHNlCi0gICAgY29udGludWUKLSAgZmkKLSAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgotICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCi0gIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0Ci0gIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKLSAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKLSAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKLSAgIyBleHBhbnNpb24uCi0gIGZvciBmaWxlIGluIGBzZWQgLW4gIgotICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAotICAgICAgIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbwotICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgotICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgIGZkaXI9YCRhc19kaXJuYW1lIC0tICIkZmlsZSIgfHwKLSRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRmaWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICB7IGFzX2Rpcj0kZGlycGFydC8kZmRpcgotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Ci0gICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKLSAgZG9uZQotZG9uZQotIDs7Ci0KLSAgZXNhYwotZG9uZSAjIGZvciBhY190YWcKLQotCi17IChleGl0IDApOyBleGl0IDA7IH0KLV9BQ0VPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0KLQotIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgotIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCi0jIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgotIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCi0jIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAotIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAotIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCi0jIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgotaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0gIGFjX2NzX3N1Y2Nlc3M9OgotICBhY19jb25maWdfc3RhdHVzX2FyZ3M9Ci0gIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0gICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCi0gIGV4ZWMgNT4vZGV2L251bGwKLSAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQotICBleGVjIDU+PmNvbmZpZy5sb2cKLSAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKLSAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29uZmlndXJlLmluIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjcwYTNlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLWRubAotZG5sCi0KLUFDX1BSRVJFUSgyLjUwKQotCi1BQ19JTklUKG9yZy5lY2xpcHNlLnB0cC51dGlscywgMi4xLjQpCi1BQ19DT05GSUdfU1JDRElSKHNyYy9hcmdzLmMpCi1BQ19DT05GSUdfSEVBREVSUyhjb25maWcuaCkKLQotQU1fSU5JVF9BVVRPTUFLRQotCi1BQ19DQU5PTklDQUxfQlVJTEQKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIHByb2dyYW1zLgotZG5sCi0KLUFDX1BST0dfQ0MKLUFNX1BST0dfQ0NfQ19PCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfTUFLRV9TRVQKLUFDX1BST0dfUkFOTElCCi0KLW9zPWB1bmFtZSAtc2AKLWlmIHRlc3QgIngkb3MiID0gInhBSVgiIDsgdGhlbgotCUNGTEFHUz0iJENGTEFHUyAtcWluZm89Z2VuIC1xY3BsdXNjbXQiCi1lbHNlCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgotZmkKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGFzcHJpbnRmCi1kbmwKLUFDX0NIRUNLX0ZVTkNTKGFzcHJpbnRmKQotCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvZGVwY29tcCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2RlcGNvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZTJkM2IuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA0LTA1LTMxLjIzCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCi1hcyBzaWRlLWVmZmVjdHMuCi0KLUVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgotICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KLSAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KLSAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0IDAKLSAgICA7OwotICAtdiB8IC0tdiopCi0gICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKLSAgICBleGl0IDAKLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAkZGVwZmlsZQotICAgIGVjaG8gPj4gJGRlcGZpbGUKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAotICAgPj4gJGRlcGZpbGUKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKLSAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIERlcGVuZGVuY2llcyBhcmUgb3V0cHV0IGluIC5sby5kIHdpdGggbGlidG9vbCAxLjQuCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhleSBhcmUgb3V0cHV0IGJvdGggaW4gJGRpci5saWJzLyRiYXNlLm8uZAotICAgICAgIyBhbmQgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQgJGRpciRiYXNlLm8uZC4gIFdlIHByb2Nlc3MgdGhlCi0gICAgICAjIGxhdHRlciwgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgYmUgY2xlYW5lZCB3aGVuICRkaXIubGlicyBpcwotICAgICAgIyBlcmFzZWQuCi0gICAgICB0bXBkZXBmaWxlMT0iJGRpci5saWJzLyRiYXNlLmxvLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLm8uZCIKLSAgICAgIHRtcGRlcGZpbGUzPSIkZGlyLmxpYnMvJGJhc2UuZCIKLSAgICAgICIkQCIgLVdjLC1NRAotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZTE9IiRkaXIkYmFzZS5vLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLmQiCi0gICAgICB0bXBkZXBmaWxlMz0iJGRpciRiYXNlLmQiCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUxIjsgdGhlbgotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUxIgotICAgZWxpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTIiOyB0aGVuCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTMiCi0gICBmaQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAotICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCi0gICIkQCIgfHwgZXhpdCAkPwotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgotICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ub25lKQotICBleGVjICIkQCIKLSAgOzsKLQotKikKLSAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9hcmdzLmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2FyZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4NWIwNi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2FyZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQVJHU19IXwotI2RlZmluZSBfQVJHU19IXwotCi1leHRlcm4gY2hhciAqKglTdHJUb0FyZ3MoY2hhciAqKTsKLWV4dGVybiBjaGFyICoqCU5ld0FyZ3MoY2hhciAqLCAuLi4pOwotZXh0ZXJuIGNoYXIgKioJQXBwZW5kQXJndihjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBjaGFyICoqCUFwcGVuZEFyZ3MoY2hhciAqKiwgLi4uKTsKLWV4dGVybiBjaGFyICoqCUFwcGVuZFN0cihjaGFyICoqLCBjaGFyICopOwotZXh0ZXJuIHZvaWQJCUFyZ3NUb0J1ZihjaGFyICoqLCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiBjaGFyICoJQXJnc1RvU3RyKGNoYXIgKiopOwotZXh0ZXJuIHZvaWQJCUZyZWVBcmdzKGNoYXIgKiopOwotCi0jZW5kaWYgLyogIV9BUkdTX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2JpdHNldC5oIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9iaXRzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmMDliYy4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2JpdHNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseQotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQklUU0VUX0hfCi0jZGVmaW5lIF9CSVRTRVRfSF8KLQotI2RlZmluZSBCSVRfSU5ERVgoYml0KQkJKChiaXQpID4+IDMpIC8gKHNpemVvZihiaXRzKSkKLSNkZWZpbmUgQklUX0lOX09CSihiaXQpCQkoKGJpdCkgJSAoc2l6ZW9mKGJpdHMpIDw8IDMpKQotI2RlZmluZSBTSVpFX1RPX0JZVEVTKHNpemUpCShzaXplb2YoYml0cykgKiAoc2l6ZSkpCi0KLS8qCi0gKiBOT1RFOiBpZiB5b3UgY2hhbmdlIHRoZSBzaXplIG9mIGJpdHMsIHRoZW4gdGhlIGZmcygpIHJvdXRpbmUgbWF5IG5vIGxvbmdlciB3b3JrLgotICovCi10eXBlZGVmIHVuc2lnbmVkIGludAliaXRzOwotCi0vKgotICogQml0c2V0IGRlZmluaXRpb24uIE5vdGUgdGhhdCB0aGUgTFNCIGlzIGJpdCBudW1iZXIgJzAnLgotICovCi1zdHJ1Y3QgYml0c2V0IHsKLQl1bnNpZ25lZCBpbnQJYnNfbmJpdHM7CS8qIHRvdGFsIG51bWJlciBvZiBiaXRzIGluIHNldCAqLwotCWJpdHMgKgkJCWJzX2JpdHM7CS8qIGFjdHVhbCBiaXRzICh1bnVzZWQgYml0cyBhcmUgYWx3YXlzIDApKi8KLQl1bnNpZ25lZCBpbnQJYnNfc2l6ZTsJLyogbnVtYmVyIG9mICdiaXRzJyBvYmplY3RzICovCi19OwotdHlwZWRlZiBzdHJ1Y3QgYml0c2V0IGJpdHNldDsKLQotYml0c2V0ICoJYml0c2V0X25ldyhpbnQgbnVtKTsJCQkJCQkvKiBjcmVhdGUgYSBuZXcgYml0c2V0IHRvIGNvbnRhaW4gJ251bScgYml0cyAqLwotdm9pZAkJYml0c2V0X2ZyZWUoYml0c2V0ICpiKTsJCQkJCQkvKiBkaXNwb3NlIG9mIGEgYml0c2V0ICovCi1iaXRzZXQgKgliaXRzZXRfZHVwKGJpdHNldCAqYik7CQkJCQkJLyogY3JlYXRlIGEgY29weSBvZiBhIGJpdHNldCAqLwotdm9pZAkJYml0c2V0X2NvcHkoYml0c2V0ICpiMSwgYml0c2V0ICpiMik7CQkvKiBjb3B5IGJpdHMgZnJvbSBiMiB0byBiMSAqLwotaW50CQkJYml0c2V0X2lzZW1wdHkoYml0c2V0ICpiKTsJCQkJCS8qIHRlc3QgaWYgYWxsIGJpdHMgYXJlIDAgKi8KLXZvaWQJCWJpdHNldF9jbGVhcihiaXRzZXQgKmIpOwkJCQkJLyogc2V0IGFsbCBiaXRzIHRvIDAgKi8KLXZvaWQJCWJpdHNldF9zZXQoYml0c2V0ICpiLCBpbnQgbik7CQkJCS8qIHNldCBiaXQgJ24nICgwID09IExTQikgdG8gMSAqLwotdm9pZAkJYml0c2V0X3Vuc2V0KGJpdHNldCAqYiwgaW50IG4pOwkJCQkvKiBzZXQgYml0ICduJyB0byAwICovCi1pbnQJCQliaXRzZXRfdGVzdChiaXRzZXQgKmIsIGludCBuKTsJCQkJLyogcmV0dXJuIHRoZSB2YWx1ZSBvZiBiaXQgJ24nICovCi1pbnQJCQliaXRzZXRfZmlyc3RzZXQoYml0c2V0ICpiKTsJCQkJCS8qIGZpbmQgdGhlIGZpcnN0IGJpdCBzZXQgdG8gMSAoc3RhcnRpbmcgZnJvbSBMU0IpICovCi1iaXRzZXQgKgliaXRzZXRfYW5kKGJpdHNldCAqYjEsIGJpdHNldCAqYjIpOwkJCS8qIGNvbXB1dGUgYjMgPSBiMSAmIGIyICovCi12b2lkCQliaXRzZXRfYW5kZXEoYml0c2V0ICpiMSwgYml0c2V0ICpiMik7CQkvKiBjb21wdXRlIGIxICY9IGIyICovCi12b2lkCQliaXRzZXRfYW5kZXFub3QoYml0c2V0ICpiMSwgYml0c2V0ICpiMik7CS8qIGNvbXB1dGUgYjEgJj0gfmIyICovCi1iaXRzZXQgKgliaXRzZXRfb3IoYml0c2V0ICpiMSwgYml0c2V0ICpiMik7CQkJLyogY29tcHV0ZSBiMyA9IGIxIHwgYjIgKi8KLXZvaWQJCWJpdHNldF9vcmVxKGJpdHNldCAqYjEsIGJpdHNldCAqYjIpOwkJLyogY29tcHV0ZSBiMSB8PSBiMiAqLwotdm9pZAkJYml0c2V0X2ludmVydChiaXRzZXQgKmIpOwkJCQkJLyogY29tcHV0ZSB+YiAqLwotaW50CQkJYml0c2V0X2VxKGJpdHNldCAqYjEsIGJpdHNldCAqYjIpOwkJCS8qIHRlc3QgaWYgKGIxICYgYjIpID09IGIxICovCi1pbnQJCQliaXRzZXRfY29tcGFyZShiaXRzZXQgKmIxLCBiaXRzZXQgKmIyKTsJCS8qIHRlc3QgaWYgKGIxICYgYjIpICE9IDAgKi8KLWNoYXIgKgkJYml0c2V0X3RvX3N0cihiaXRzZXQgKmIpOwkJCQkJLyogY29udmVydCBiIHRvIGEgcG9ydGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uICovCi1iaXRzZXQgKglzdHJfdG9fYml0c2V0KGNoYXIgKnN0ciwgY2hhciAqKmVuZCk7CQkvKiBjb252ZXJ0IGEgcG9ydGFibGUgc3RyaW5nIHJlcHJlc2V0YXRpb24gdG8gYSBiaXRzZXQgKi8KLWludAkJCWJpdHNldF9jb3VudChiaXRzZXQgKmIpOwkJCQkJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc2V0ICovCi1pbnQJCQliaXRzZXRfc2l6ZShiaXRzZXQgKmIpOwkJCQkJCS8qIG51bWJlciBvZiBiaXRzIHRoaXMgYml0c2V0IGNhbiByZXByZXNlbnQgKi8KLWNoYXIgKgkJYml0c2V0X3RvX3NldChiaXRzZXQgKmIpOwkJCQkJLyogY29udmVydCBiIHRvIHNldCBub3RhdGlvbiAqLwotI2VuZGlmIC8qX0JJVFNFVF9IXyovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2NvbXBhdC5oIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNWUzMi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfQ09NUEFUX0hfCi0jZGVmaW5lIF9DT01QQVRfSF8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmZGVmIFVTRV9QT1NJWF9USFJFQURTCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2RlZmluZSBUSFJFQURfREVDTChjb250ZXh0KQlwdGhyZWFkX211dGV4X3QgY29udGV4dCAjIyBfdGhyZWFkX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgotI2RlZmluZSBUSFJFQURfTE9DSyhjb250ZXh0KQlwdGhyZWFkX211dGV4X2xvY2soJmNvbnRleHQgIyMgX3RocmVhZF9tdXRleCkKLSNkZWZpbmUgVEhSRUFEX1VOTE9DSyhjb250ZXh0KQlwdGhyZWFkX211dGV4X3VubG9jaygmY29udGV4dCAjIyBfdGhyZWFkX211dGV4KQotI2Vsc2UgLyogVVNFX1BPU0lYX1RIUkVBRFMgKi8KLSNkZWZpbmUgVEhSRUFEX0RFQ0woY29udGV4dCkKLSNkZWZpbmUgVEhSRUFEX0xPQ0soY29udGV4dCkKLSNkZWZpbmUgVEhSRUFEX1VOTE9DSyhjb250ZXh0KQotI2VuZGlmIC8qIFVTRV9QT1NJWF9USFJFQURTICovCi0KLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLCBiKQkJKChhKSA8IChiKSA/IChiKSA6IChhKSkKLSNlbmRpZiAvKiBNQVggKi8KLQotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsIGIpCQkoKGEpID4gKGIpID8gKGIpIDogKGEpKQotI2VuZGlmIC8qIE1BWCAqLwotCi0jaWZkZWYgX19BUFBMRV9fCi0jZGVmaW5lIEJJVFNQRVJCWVRFICAgICBOQkJZCi0jZWxpZiBfX2xpbnV4X18KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNkZWZpbmUgQklUU1BFUkJZVEUgICAgIENIQVJfQklUCi1leHRlcm4gaW50IGRpZ2l0dG9pbnQoaW50KTsKLSNlbGlmIF9BSVgKLSNkZWZpbmUgQklUU1BFUkJZVEUgOAotI2Vsc2UKLSNlcnJvciAiTmVlZCB0byBkZWZpbmUgQklUU1BFUkJZVEUgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSIKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfQVNQUklOVEYKLWludCBhc3ByaW50ZihjaGFyICoqIHJldCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKTsKLSNlbmRpZiAvKiAhSEFWRV9BU1BSSU5URiAqLwotCi0jZGVmaW5lIFNPQ0tFVAkJCWludAotI2RlZmluZSBDTE9TRV9TT0NLRVQocykJKHZvaWQpY2xvc2UocykKLSNkZWZpbmUgSU5WQUxJRF9TT0NLRVQJLTEKLSNkZWZpbmUgU09DS0VUX0VSUk9SCQktMQotCi0jZW5kaWYgLyogX0NPTVBBVF9IXyovCmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2hhbmRsZXIuaCBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2luY2x1ZGUvaGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTYyNjNkLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2luY2x1ZGUvaGFuZGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfSEFORExFUl9IXwotI2RlZmluZSBfSEFORExFUl9IXwotCi0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotCi0jZGVmaW5lIEhBTkRMRVJfRklMRQkJMQotI2RlZmluZSBIQU5ETEVSX1NJR05BTAkJMgotI2RlZmluZSBIQU5ETEVSX0VWRU5UCQkzCi0KLSNkZWZpbmUgUkVBRF9GSUxFX0hBTkRMRVIJMQotI2RlZmluZSBXUklURV9GSUxFX0hBTkRMRVIJMgotI2RlZmluZSBFWENFUFRfRklMRV9IQU5ETEVSCTQKLQotc3RydWN0IGhhbmRsZXIgewotCWludAkJaHR5cGU7Ci0Jdm9pZCAqCWRhdGE7Ci0JCQotCS8qCi0JICogSEFORExFUl9GSUxFCi0JICovCi0JaW50CQlmaWxlX3R5cGU7IAkJCQkJCQkvKiB0eXBlIG9mIHRoaXMgZmlsZSBoYW5kbGVyICovCi0JaW50CQlmZDsJCQkJCQkJCQkvKiBmaWxlIGRlc2NyaXB0b3IgKi8KLQlpbnQJCWVycm9yOwkJCQkJCQkJLyogbGFzdCBvcGVyYXRpb24gcmVzdWx0ICovCi0JaW50CQkoKmZpbGVfaGFuZGxlcikoaW50LCB2b2lkICopOwkJLyogaGFuZGxlciBjYWxsYmFjayBmdW5jdGlvbiAqLwotCQotCS8qCi0JICogSEFORExFUl9TSUdOQUwKLQkgKi8KLQlpbnQJCXNpZ25hbDsJCQkJCQkJCS8qIHNpZ25hbCB0byBoYW5kbGUgKi8KLQotCS8qCi0JICogSEFORExFUl9FVkVOVAotCSAqLwotCWludAkJZXZlbnRfdHlwZTsJCQkJCQkJLyogdHlwZSBvZiB0aGlzIGV2ZW50IGhhbmRsZXIgKi8KLQl2b2lkIAkoKmV2ZW50X2hhbmRsZXIpKHZvaWQgKiwgdm9pZCAqKTsJLyogaGFuZGxlciBjYWxsYmFjayBmdW5jdGlvbiAqLwotfTsKLXR5cGVkZWYgc3RydWN0IGhhbmRsZXIJaGFuZGxlcjsKLQotaGFuZGxlciAqCU5ld0hhbmRsZXIoaW50LCB2b2lkICopOwotdm9pZAkJRGVzdHJveUhhbmRsZXIoaGFuZGxlciAqKTsKLXZvaWQJCVNldEhhbmRsZXIodm9pZCk7Ci1oYW5kbGVyICoJR2V0SGFuZGxlcih2b2lkKTsKLXZvaWQJCVJlZ2lzdGVyRXZlbnRIYW5kbGVyKGludCwgdm9pZCAoKikodm9pZCAqLCB2b2lkICopLCB2b2lkICopOwotdm9pZAkJVW5yZWdpc3RlckV2ZW50SGFuZGxlcihpbnQsIHZvaWQgKCopKHZvaWQgKiwgdm9pZCAqKSk7Ci12b2lkCQlSZWdpc3RlckZpbGVIYW5kbGVyKGludCBmZCwgaW50IHR5cGUsIGludCAoKikoaW50LCB2b2lkICopLCB2b2lkICopOwotdm9pZAkJVW5yZWdpc3RlckZpbGVIYW5kbGVyKGludCk7Ci12b2lkCQlDYWxsRXZlbnRIYW5kbGVycyhpbnQsIHZvaWQgKik7Ci1pbnQJCQlDYWxsRmlsZUhhbmRsZXJzKGZkX3NldCAqcmZkcywgZmRfc2V0ICp3ZmRzLCBmZF9zZXQgKmVmZHMpOwotdm9pZAkJR2VuZXJhdGVGRFNldHMoaW50ICosIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICopOwotI2VuZGlmIC8qICFfSEFORExFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9oYXNoLmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2hhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyNzhjMC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2hhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfSEFTSF9IXwotI2RlZmluZSBfSEFTSF9IXwotCi1zdHJ1Y3QgSGFzaEVudHJ5Ci17Ci0JdW5zaWduZWQgaW50CQloX2h2YWw7CS8qIGFjdHVhbCBoYXNoIHZhbHVlICovCi0Jdm9pZCAqCQkJCWhfZGF0YTsJLyogZW50cnkgZGF0YSAqLwotCXN0cnVjdCBIYXNoRW50cnkgKgloX25leHQ7CS8qIG5leHQgaW4gY2hhaW4gKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBIYXNoRW50cnkJSGFzaEVudHJ5OwotCi0vKiBEYXRhIHR5cGUgZm9yIHJlZW50cmFudCBmdW5jdGlvbnMuICAqLwotc3RydWN0IEhhc2gKLXsKLSAgICBIYXNoRW50cnkgKioJdGFibGU7CQkvKiBoYXNoIGNoYWluIGVudHJpZXMgKi8KLSAgICB1bnNpZ25lZCBpbnQJbG9nc2l6ZTsJLyogbG9nIDIgbnVtYmVyIG9mIGNoYWlucyBpbiB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGludAlzaXplOwkJLyogbnVtYmVyIG9mIGNoYWlucyBpbiB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGludAljb3VudDsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRhYmxlICovCi0gICAgdW5zaWduZWQgaW50CW1hc2s7CQkvKiBtYXNrIHVzZWQgdG8gY29tcHV0ZSBjaGFpbiAqLwotICAgIHVuc2lnbmVkIGludAlzY2FuOwkJLyogdXNlZCBmb3Igc2Nhbm5pbmcgaGFzaCB0YWJsZSAqLwotICAgIEhhc2hFbnRyeSAqCQlzY2FuX2VudHJ5OwotfTsKLXR5cGVkZWYgc3RydWN0IEhhc2gJSGFzaDsKLQotZXh0ZXJuIEhhc2ggKgkJSGFzaENyZWF0ZShpbnQpOwotZXh0ZXJuIHZvaWQJCQlIYXNoRGVzdHJveShIYXNoICosIHZvaWQgKCopKHZvaWQgKikpOwotZXh0ZXJuIHZvaWQgKgkJSGFzaFNlYXJjaChIYXNoICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdW5zaWduZWQgaW50CUhhc2hDb21wdXRlKGNoYXIgKiwgaW50KTsKLWV4dGVybiBIYXNoRW50cnkgKglIYXNoSW5zZXJ0KEhhc2ggKiwgdW5zaWduZWQgaW50LCB2b2lkICopOwotZXh0ZXJuIHZvaWQJCQlIYXNoUmVtb3ZlKEhhc2ggKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkCQkJSGFzaFNldChIYXNoICopOwotZXh0ZXJuIEhhc2hFbnRyeSAqCUhhc2hHZXQoSGFzaCAqKTsKLQotI2VuZGlmIC8qICFfSEFTSF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9saXN0LmggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiYWQ0YS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfTElTVF9IXwotI2RlZmluZSBfTElTVF9IXwotCi1zdHJ1Y3QgTGlzdAotewotCWludAkJCQkJCWxfbmVsOwotCXN0cnVjdCBMaXN0RWxlbWVudCAqCWxfaGVhZDsKLQlzdHJ1Y3QgTGlzdEVsZW1lbnQgKglsX3NjYW47Ci0Jc3RydWN0IExpc3RFbGVtZW50ICoqCWxfdGFpbDsKLX07Ci10eXBlZGVmIHN0cnVjdCBMaXN0CUxpc3Q7Ci0KLXN0cnVjdCBMaXN0RWxlbWVudAotewotCXZvaWQgKgkJCQkJbF92YWx1ZTsKLQlzdHJ1Y3QgTGlzdEVsZW1lbnQgKglsX25leHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgTGlzdEVsZW1lbnQJTGlzdEVsZW1lbnQ7Ci0KLWV4dGVybiBMaXN0ICoJTmV3TGlzdCh2b2lkKTsKLWV4dGVybiB2b2lkCQlBZGRUb0xpc3QoTGlzdCAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQJCUFkZEZpcnN0KExpc3QgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkCQlBcHBlbmRMaXN0KExpc3QgKiwgTGlzdCAqKTsKLWV4dGVybiB2b2lkCQlJbnNlcnRCZWZvcmUoTGlzdCAqbCwgdm9pZCAqdmFsLCB2b2lkICpuZXdfdmFsKTsKLWV4dGVybiB2b2lkCQlSZW1vdmVGcm9tTGlzdChMaXN0ICosIHZvaWQgKik7Ci1leHRlcm4gdm9pZCAqCVJlbW92ZUZpcnN0KExpc3QgKik7Ci1leHRlcm4gdm9pZAkJRGVzdHJveUxpc3QoTGlzdCAqLCB2b2lkICgqKSgpKTsKLWV4dGVybiB2b2lkCQlTZXRMaXN0KExpc3QgKik7Ci1leHRlcm4gdm9pZCAqCUdldExpc3RFbGVtZW50KExpc3QgKik7Ci1leHRlcm4gdm9pZCAqCUdldEZpcnN0RWxlbWVudChMaXN0ICopOwotZXh0ZXJuIGludAkJRW1wdHlMaXN0KExpc3QgKik7Ci1leHRlcm4gaW50CQlJbkxpc3QoTGlzdCAqLCB2b2lkICopOwotZXh0ZXJuIGludAkJU2l6ZU9mTGlzdChMaXN0ICopOwotI2VuZGlmIC8qICFfTElTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9yYW5nZXNldC5oIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9yYW5nZXNldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ3NjUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2luY2x1ZGUvcmFuZ2VzZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibGlzdC5oIgotCi1zdHJ1Y3Qgc3RyX2J1ZiB7Ci0JaW50CQlsZW47Ci0JaW50CQljb3VudDsKLQljaGFyICoJY29udGVudHM7Ci19OwotdHlwZWRlZiBzdHJ1Y3Qgc3RyX2J1ZiBzdHJfYnVmOwotCi1zdHJ1Y3QgcmFuZ2VzZXQgewotCUxpc3QgCSoJZWxlbWVudHM7Ci0Jc3RyX2J1ZiAqCWJ1ZjsKLQlpbnQJCQljaGFuZ2VkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJhbmdlc2V0CXJhbmdlc2V0OwotCi1zdHJ1Y3QgcmFuZ2UgewotCWludCBsb3c7Ci0JaW50IGhpZ2g7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcmFuZ2UJcmFuZ2U7Ci0KLWV4dGVybiByYW5nZXNldCAqbmV3X3Jhbmdlc2V0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5zZXJ0X2luX3Jhbmdlc2V0KHJhbmdlc2V0ICpzZXQsIGludCB2YWwpOwotZXh0ZXJuIGNoYXIgKnJhbmdlc2V0X3RvX3N0cmluZyhyYW5nZXNldCAqc2V0KTsKLWV4dGVybiB2b2lkIGZyZWVfcmFuZ2VzZXQocmFuZ2VzZXQgKnNldCk7CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL3NlcmRlcy5oIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvaW5jbHVkZS9zZXJkZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiMjg0Ni4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbmNsdWRlL3NlcmRlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgU0VSREVTX0hfCi0jZGVmaW5lIFNFUkRFU19IXwotCi1leHRlcm4gdW5zaWduZWQgaW50CWhleF9zdHJfdG9faW50KGNoYXIgKnN0ciwgaW50IGxlbiwgY2hhciAqKmVuZCk7Ci1leHRlcm4gdm9pZAkJCWludF90b19oZXhfc3RyKHVuc2lnbmVkIGludCB2YWwsIGNoYXIgKnN0ciwgaW50IGxlbiwgY2hhciAqKmVuZCk7Ci0KLSNlbmRpZiAvKiBTRVJERVNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2luc3RhbGwtc2ggYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmM2NjkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLSMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgotIwotIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0jIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0jIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKLSMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi0jIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0KLSMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAotCi0jIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCi0KLQotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXRyYW5zZm9ybWJhc2VuYW1lPSIiCi10cmFuc2Zvcm1fYXJnPSIiCi1pbnN0Y21kPSIkbXZwcm9nIgotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPSIiCi1jaGdycGNtZD0iIgotc3RyaXBjbWQ9IiIKLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9IiIKLWRzdD0iIgotZGlyX2FyZz0iIgotCi13aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KLSAgICBjYXNlICQxIGluCi0JLWMpIGluc3RjbWQ9IiRjcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1kKSBkaXJfYXJnPXRydWUKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KLQkgICAgdGhlbgotCQlzcmM9JDEKLQkgICAgZWxzZQotCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKLQkJOgotCQlkc3Q9JDEKLQkgICAgZmkKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotICAgIGVzYWMKLWRvbmUKLQotaWYgWyB4IiRzcmMiID0geCBdCi10aGVuCi0JZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCi0JZXhpdCAxCi1lbHNlCi0JdHJ1ZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KLQlkc3Q9JHNyYwotCXNyYz0iIgotCQotCWlmIFsgLWQgJGRzdCBdOyB0aGVuCi0JCWluc3RjbWQ9OgotCWVsc2UKLQkJaW5zdGNtZD1ta2RpcgotCWZpCi1lbHNlCi0KLSMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAotIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKLSMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotCi0JaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQotCXRoZW4KLQkJdHJ1ZQotCWVsc2UKLQkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCi0JCWV4aXQgMQotCWZpCi0JCi0JaWYgWyB4IiRkc3QiID0geCBdCi0JdGhlbgotCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0JCWV4aXQgMQotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCi0jIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLQotCWlmIFsgLWQgJGRzdCBdCi0JdGhlbgotCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAotCWVsc2UKLQkJdHJ1ZQotCWZpCi1maQotCi0jIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKLWRzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KLSMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAotCi0jIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgotaWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCi1kZWZhdWx0SUZTPScJCi0nCi1JRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgotCi1vSUZTPSIke0lGU30iCi0jIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotSUZTPSclJwotc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCi1JRlM9IiR7b0lGU30iCi0KLXBhdGhjb21wPScnCi0KLXdoaWxlIFsgJCMgLW5lIDAgXSA7IGRvCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKLQlzaGlmdAotCi0JaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7Ci0gICAgICAgIHRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCi1kb25lCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXQotdGhlbgotCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKLQotIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCi0KLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKLQkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQotCWZpCi0KLSMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQotCi0JaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0KLQlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0KLQkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKLQotCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgotCi0jIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLQotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQotIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAotCi1maSAmJgotCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvbHRtYWluLnNoIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvbHRtYWluLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTcxZDI3Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL2x0bWFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MzAgKzAsMCBAQAotIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gY29uZmlndXJlLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLWJhc2VuYW1lPSJzLF4uKi8sLGciCi0KLSMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAotIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKLSMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCi0jIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKLSMgZnVuY3Rpb24uCi1wcm9ncGF0aD0iJDAiCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgotcHJvZ25hbWU9YGVjaG8gIiRwcm9ncGF0aCIgfCAkU0VEICRiYXNlbmFtZWAKLW1vZGVuYW1lPSIkcHJvZ25hbWUiCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLUVYSVRfU1VDQ0VTUz0wCi1FWElUX0ZBSUxVUkU9MQotCi1QUk9HUkFNPWx0bWFpbi5zaAotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuNS4yMAotVElNRVNUQU1QPSIgKDEuMTIyMC4yLjI4NyAyMDA1LzA4LzMxIDE4OjU0OjE1KSIKLQotIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgotIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZmkKLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkcHJvZ3BhdGgiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgJEVYSVRfU1VDQ0VTUwotZmkKLQotZGVmYXVsdF9tb2RlPQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWtkaXI9Im1rZGlyIgotbXY9Im12IC1mIgotcm09InJtIC1mIgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCi0jIHRlc3QgRUJDRElDIG9yIEFTQ0lJCi1jYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCi0gQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KLSAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCi0gIFNQMk5MPSd0ciBcMDQwIFwwMTInCi0gIE5MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKLSAgOzsKLSAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KLSAgU1AyTkw9J3RyIFwxMDAgXG4nCi0gIE5MMlNQPSd0ciBcclxuIFwxMDBcMTAwJwotICA7OwotZXNhYwotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xDX0FMTD0iJExDX0FMTCI7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMCi1maQotaWYgdGVzdCAiJHtMQU5HK3NldH0iID0gc2V0OyB0aGVuCi0gIHNhdmVfTEFORz0iJExBTkciOyBMQU5HPUM7IGV4cG9ydCBMQU5HCi1maQotCi0jIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAotbHRfbmw9JwotJwotSUZTPSIgCSRsdF9ubCIKLQotaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiIDE+JjIKLSAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zOgotIyBUaGlzIHNlZW1zIHRvIGJlIHRoZSBiZXN0IHBsYWNlIGZvciB0aGVtCi0KLSMgZnVuY193aW4zMl9saWJpZCBhcmcKLSMgcmV0dXJuIHRoZSBsaWJyYXJ5IHR5cGUgb2YgZmlsZSAnYXJnJwotIwotIyBOZWVkIGEgbG90IG9mIGdvbyB0byBoYW5kbGUgKmJvdGgqIERMTHMgYW5kIGltcG9ydCBsaWJzCi0jIEhhcyB0byBiZSBhIHNoZWxsIGZ1bmN0aW9uIGluIG9yZGVyIHRvICdlYXQnIHRoZSBhcmd1bWVudAotIyB0aGF0IGlzIHN1cHBsaWVkIHdoZW4gJGZpbGVfbWFnaWNfY29tbWFuZCBpcyBjYWxsZWQuCi1mdW5jX3dpbjMyX2xpYmlkICgpCi17Ci0gIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCi0gIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCi0gIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0Ci0gICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgotICAgIDs7Ci0gICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKLSAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8IFwKLSAgICAgICRFR1JFUCAtZSAnZmlsZSBmb3JtYXQgcGUtaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JyA+L2Rldi9udWxsIDsgdGhlbgotICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BICQxIHwgXAotCXNlZCAtbiAtZSAnMSwxMDB7LyBJIC97eDsvaW1wb3J0LyF7cy9eL2ltcG9ydC87aDtwO307eDt9O30nYAotICAgICAgaWYgdGVzdCAiWCR3aW4zMl9ubXJlcyIgPSAiWGltcG9ydCIgOyB0aGVuCi0gICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCIKLSAgICAgIGVsc2UKLSAgICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgc3RhdGljIgotICAgICAgZmkKLSAgICBmaQotICAgIDs7Ci0gICpETEwqKQotICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCi0gICAgOzsKLSAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCi0gICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgotICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKLSAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gICRlY2hvICR3aW4zMl9saWJpZF90eXBlCi19Ci0KLQotIyBmdW5jX2luZmVyX3RhZyBhcmcKLSMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAotIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KLSMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKLSMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgotIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKLWZ1bmNfaW5mZXJfdGFnICgpCi17Ci0gICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLSAgICAgIENDX3F1b3RlZD0KLSAgICAgIGZvciBhcmcgaW4gJENDOyBkbwotCWNhc2UgJGFyZyBpbgotCSAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRhcmciCi0gICAgICBkb25lCi0gICAgICBjYXNlICRAIGluCi0gICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAotICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCi0gICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkZWNobyAkQ0NgICIqIHwgImAkZWNobyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRlY2hvICRDQ19xdW90ZWRgICIqIHwgImAkZWNobyAkQ0NfcXVvdGVkYCAiKikgOzsKLSAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCi0gICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCi0gICAgICAqKQotCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KLQkgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgotCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgotCSAgICBDQ19xdW90ZWQ9Ci0JICAgIGZvciBhcmcgaW4gJENDOyBkbwotCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0JICAgIGNhc2UgJGFyZyBpbgotCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICAgIGFyZz0iXCIkYXJnXCIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGFyZyIKLQkgIGRvbmUKLQkgICAgY2FzZSAiJEAgIiBpbgotCSAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRlY2hvICRDQ2AgIiogfCAiYCRlY2hvICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJGVjaG8gJENDX3F1b3RlZGAgIiogfCAiYCRlY2hvICRDQ19xdW90ZWRgICIqKQotCSAgICAgICMgVGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUgY29tbWFuZCBtYXRjaGVzCi0JICAgICAgIyB0aGUgb25lIGluIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbi4KLQkgICAgICAjIEFzc3VtZSB0aGlzIGlzIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbiB3ZSB3YW50LgotCSAgICAgIHRhZ25hbWU9JHoKLQkgICAgICBicmVhawotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JZG9uZQotCSMgSWYgJHRhZ25hbWUgc3RpbGwgaXNuJ3Qgc2V0LCB0aGVuIG5vIHRhZ2dlZCBjb25maWd1cmF0aW9uCi0JIyB3YXMgZm91bmQgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdGhlICItLXRhZyIgY29tbWFuZAotCSMgbGluZSBvcHRpb24gbXVzdCBiZSB1c2VkLgotCWlmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgotCSAgJGVjaG8gIiRtb2RlbmFtZTogc3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi19Ci0KLQotIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCi1mdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQotewotICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0Ci0gICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgotCi0gICAgJHNob3cgIihjZCAkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggJGZfZXhfYW5fYXJfb2xkbGliKSIKLSAgICAkcnVuIGV2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwkZl9leF9hbl9hcl9vbGRsaWIpIiB8fCBleGl0ICQ/Ci0gICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgOgotICAgIGVsc2UKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IEVSUk9SOiBvYmplY3QgbmFtZSBjb25mbGljdHM6ICRmX2V4X2FuX2FyX2Rpci8kZl9leF9hbl9hcl9vbGRsaWIiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi19Ci0KLSMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCi1mdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKLXsKLSAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKLSAgICBteV9vbGRsaWJzPSR7MSsiJEAifQotICAgIG15X29sZG9ianM9IiIKLSAgICBteV94bGliPSIiCi0gICAgbXlfeGFicz0iIgotICAgIG15X3hkaXI9IiIKLSAgICBteV9zdGF0dXM9IiIKLQotICAgICRzaG93ICIke3JtfXIgJG15X2dlbnRvcCIKLSAgICAkcnVuICR7cm19ciAiJG15X2dlbnRvcCIKLSAgICAkc2hvdyAiJG1rZGlyICRteV9nZW50b3AiCi0gICAgJHJ1biAkbWtkaXIgIiRteV9nZW50b3AiCi0gICAgbXlfc3RhdHVzPSQ/Ci0gICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfZ2VudG9wIjsgdGhlbgotICAgICAgZXhpdCAkbXlfc3RhdHVzCi0gICAgZmkKLQotICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbwotICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotICAgICAgY2FzZSAkbXlfeGxpYiBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7Ci0JKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7Ci0gICAgICBlc2FjCi0gICAgICBteV94bGliPWAkZWNobyAiWCRteV94bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliIgotCi0gICAgICAkc2hvdyAiJHtybX1yICRteV94ZGlyIgotICAgICAgJHJ1biAke3JtfXIgIiRteV94ZGlyIgotICAgICAgJHNob3cgIiRta2RpciAkbXlfeGRpciIKLSAgICAgICRydW4gJG1rZGlyICIkbXlfeGRpciIKLSAgICAgIHN0YXR1cz0kPwotICAgICAgaWYgdGVzdCAiJHN0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfeGRpciI7IHRoZW4KLQlleGl0ICRzdGF0dXMKLSAgICAgIGZpCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLWRhcndpbiopCi0JJHNob3cgIkV4dHJhY3RpbmcgJG15X3hhYnMiCi0JIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCi0JaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAotCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPwotCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKLQkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKLQkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YCRlY2hvICJYJGRhcndpbl9hcmNoaXZlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkYXJ3aW5fYXJjaGVzPWBsaXBvIC1pbmZvICIkZGFyd2luX2FyY2hpdmUiIDI+L2Rldi9udWxsIHwgJEVHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGxgCi0JICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4gCi0JICAgIGRhcndpbl9hcmNoZXM9YGVjaG8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAotCSAgICBkYXJ3aW5fYXJjaD0KLQkgICAgJHNob3cgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgotCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KLQkgICAgICBta2RpciAtcCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICBsaXBvIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKLQkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgotCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKLQkgICAgICAkcm0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCi0gICAgICAjIyBPa2F5IG5vdyB3ZSBoYXZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQotCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnR8IHhhcmdzIGJhc2VuYW1lIHwgc29ydCAtdSB8ICROTDJTUGAKLQkgICAgZGFyd2luX2ZpbGU9Ci0JICAgIGRhcndpbl9maWxlcz0KLQkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCi0JICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCAkTkwyU1BgCi0JICAgICAgbGlwbyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcwotCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAotCSAgICAke3JtfXIgdW5mYXQtJCQKLQkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCi0JICBlbHNlCi0JICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgotIAkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCi0JICBmaSAjICRkYXJ3aW5fYXJjaGVzCi0JZmkgIyAkcnVuCi0JOzsKLSAgICAgICopCi0gICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgotICAgICAgICA7OwotICAgICAgZXNhYwotICAgICAgbXlfb2xkb2Jqcz0iJG15X29sZG9ianMgImBmaW5kICRteV94ZGlyIC1uYW1lIFwqLiRvYmpleHQgLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKLSAgICBkb25lCi0gICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCi19Ci0jIEVuZCBvZiBTaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9ucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERhcndpbiBzdWNrcwotZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKLQotIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KLXdoaWxlIHRlc3QgIiQjIiAtZ3QgMAotZG8KLSAgYXJnPSIkMSIKLSAgc2hpZnQKLQotICBjYXNlICRhcmcgaW4KLSAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgY2FzZSAkcHJldiBpbgotICAgIGV4ZWN1dGVfZGxmaWxlcykKLSAgICAgIGV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkYXJnIgotICAgICAgOzsKLSAgICB0YWcpCi0gICAgICB0YWduYW1lPSIkYXJnIgotICAgICAgcHJlc2VydmVfYXJncz0iJHtwcmVzZXJ2ZV9hcmdzfT0kYXJnIgotCi0gICAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKLSAgICAgIGNhc2UgJHRhZ25hbWUgaW4KLSAgICAgICpbIS1fQS1aYS16MC05LC9dKikKLQkkZWNobyAiJHByb2duYW1lOiBpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIgMT4mMgotCWV4aXQgJEVYSVRfRkFJTFVSRQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgJHRhZ25hbWUgaW4KLSAgICAgIENDKQotCSMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdywgaXQncyB0aGVyZSwgYnV0Ci0JIyBub3Qgc3BlY2lhbGx5IG1hcmtlZC4KLQk7OwotICAgICAgKikKLQlpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KLQkgIHRhZ2xpc3Q9IiR0YWdsaXN0ICR0YWduYW1lIgotCSAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KLQkgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHRhZ25hbWUnJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHRhZ25hbWUnJC9wJyA8ICRwcm9ncGF0aGAiCi0JZWxzZQotCSAgJGVjaG8gIiRwcm9nbmFtZTogaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiIDE+JjIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkcHJldj1cJGFyZyIKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgcHJldj0KLSAgICBwcmV2b3B0PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PwotICBjYXNlICRhcmcgaW4KLSAgLS1oZWxwKQotICAgIHNob3dfaGVscD15ZXMKLSAgICA7OwotCi0gIC0tdmVyc2lvbikKLSAgICAkZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgotICAgICRlY2hvCi0gICAgJGVjaG8gIkNvcHlyaWdodCAoQykgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIgotICAgICRlY2hvICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTyIKLSAgICAkZWNobyAid2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0tY29uZmlnKQotICAgICR7U0VEfSAtZSAnMSwvXiMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMgIyMjIEVORCBMSUJUT09MIENPTkZJRy8sJGQnICRwcm9ncGF0aAotICAgICMgTm93IHByaW50IHRoZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHRhZ3MuCi0gICAgZm9yIHRhZ25hbWUgaW4gJHRhZ2xpc3Q7IGRvCi0gICAgICAke1NFRH0gLW4gLWUgIi9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkL3AiIDwgIiRwcm9ncGF0aCIKLSAgICBkb25lCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICAkZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotICAgIHNldCAteAotICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRhcmciCi0gICAgOzsKLQotICAtLWRyeS1ydW4gfCAtbikKLSAgICBydW49OgotICAgIDs7Ci0KLSAgLS1mZWF0dXJlcykKLSAgICAkZWNobyAiaG9zdDogJGhvc3QiCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICRlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICAkZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgJGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgICRlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBleGl0ICQ/Ci0gICAgOzsKLQotICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OwotCi0gIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKLSAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7Ci0KLSAgLS1wcmVzZXJ2ZS1kdXAtZGVwcykgZHVwbGljYXRlX2RlcHM9InllcyIgOzsKLQotICAtLXF1aWV0IHwgLS1zaWxlbnQpCi0gICAgc2hvdz06Ci0gICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJGFyZyIKLSAgICA7OwotCi0gIC0tdGFnKSBwcmV2b3B0PSItLXRhZyIgcHJldj10YWcgOzsKLSAgLS10YWc9KikKLSAgICBzZXQgdGFnICIkb3B0YXJnIiAkezErIiRAIn0KLSAgICBzaGlmdAotICAgIHByZXY9dGFnCi0gICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgLS10YWciCi0gICAgOzsKLQotICAtZGxvcGVuKQotICAgIHByZXZvcHQ9Ii1kbG9wZW4iCi0gICAgcHJldj1leGVjdXRlX2RsZmlsZXMKLSAgICA7OwotCi0gIC0qKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkYXJnJyIgMT4mMgotICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIDs7Ci0KLSAgKikKLSAgICBub25vcHQ9IiRhcmciCi0gICAgYnJlYWsKLSAgICA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRwcmV2b3B0IjsgdGhlbgotICAkZWNobyAiJG1vZGVuYW1lOiBvcHRpb24gXGAkcHJldm9wdCcgcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0Ci0jIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKLSMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KLWV4ZWNfY21kPQotCi1pZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgotCi0gICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgotICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGluZmVycmluZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gaXMgZGVwcmVjYXRlZC4iIDE+JjIKLSAgICAkZWNobyAiKioqIEZ1dHVyZSB2ZXJzaW9ucyBvZiBMaWJ0b29sIHdpbGwgcmVxdWlyZSAtLW1vZGU9TU9ERSBiZSBzcGVjaWZpZWQuIiAxPiYyCi0gICAgY2FzZSAkbm9ub3B0IGluCi0gICAgKmNjIHwgY2MqIHwgKisrIHwgZ2NjKiB8ICotZ2NjKiB8IGcrKyogfCB4bGMqKQotICAgICAgbW9kZT1saW5rCi0gICAgICBmb3IgYXJnCi0gICAgICBkbwotCWNhc2UgJGFyZyBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICRtb2RlIGluCi0gICMgbGlidG9vbCBjb21waWxlIG1vZGUKLSAgY29tcGlsZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgotICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCi0gICAgYmFzZV9jb21waWxlPQotICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKLSAgICBzdXBwcmVzc19vcHQ9eWVzCi0gICAgc3VwcHJlc3Nfb3V0cHV0PQotICAgIGFyZ19tb2RlPW5vcm1hbAotICAgIGxpYm9iaj0KLSAgICBsYXRlcj0KLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICAgIGFyZyAgKQotCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKLQlsYXN0YXJnPSIkYXJnIgotCWFyZ19tb2RlPW5vcm1hbAotCTs7Ci0KLSAgICAgIHRhcmdldCApCi0JbGlib2JqPSIkYXJnIgotCWFyZ19tb2RlPW5vcm1hbAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgbm9ybWFsICkKLQkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0JY2FzZSAkYXJnIGluCi0JLW8pCi0JICBpZiB0ZXN0IC1uICIkbGlib2JqIiA7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGFyZ19tb2RlPXRhcmdldAotCSAgY29udGludWUKLQkgIDs7Ci0KLQktc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCi0JICBsYXRlcj0iJGxhdGVyICRhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCS1uby1zdXBwcmVzcykKLQkgIHN1cHByZXNzX29wdD1ubwotCSAgY29udGludWUKLQkgIDs7Ci0KLQktWGNvbXBpbGVyKQotCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAotCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKLQkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCi0KLQktV2MsKikKLQkgIGFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eLVdjLC8vImAKLQkgIGxhc3Rhcmc9Ci0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLSAJICBmb3IgYXJnIGluICRhcmdzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQotCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0JICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0JICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0JICAgIGNhc2UgJGFyZyBpbgotCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICAgIGFyZz0iXCIkYXJnXCIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBsYXN0YXJnPSIkbGFzdGFyZyAkYXJnIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAotCi0JICAjIEFkZCB0aGUgYXJndW1lbnRzIHRvIGJhc2VfY29tcGlsZS4KLQkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JKiApCi0JICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0JICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KLQkgICMKLQkgIGxhc3Rhcmc9IiRzcmNmaWxlIgotCSAgc3JjZmlsZT0iJGFyZyIKLQkgIDs7Ci0JZXNhYyAgIyAgY2FzZSAkYXJnCi0JOzsKLSAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KLSAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICBjYXNlICRsYXN0YXJnIGluCi0gICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0gICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotICAgICAgIyBpbiBzY2FuIHNldHMsIGFuZCBzb21lIFN1bk9TIGtzaCBtaXN0cmVhdCBiYWNrc2xhc2gtZXNjYXBpbmcKLSAgICAgICMgaW4gc2NhbiBzZXRzICh3b3JrZWQgYXJvdW5kIHdpdGggdmFyaWFibGUgZXhwYW5zaW9uKSwKLSAgICAgICMgYW5kIGZ1cnRoZXJtb3JlIGNhbm5vdCBoYW5kbGUgJ3wnICcmJyAnKCcgJyknIGluIHNjYW4gc2V0cyAKLSAgICAgICMgYXQgYWxsLCBzbyB3ZSBzcGVjaWZ5IHRoZW0gc2VwYXJhdGVseS4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0gICAgZG9uZSAjIGZvciBhcmcKLQotICAgIGNhc2UgJGFyZ19tb2RlIGluCi0gICAgYXJnKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgIHRhcmdldCkKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgICopCi0gICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgICBbIC16ICIkbGlib2JqIiBdICYmIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCi0gICAgeGZvcm09J1tjQ0ZTaWZtc29dJwotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmlpKSB4Zm9ybT1paSA7OwotICAgICouY2xhc3MpIHhmb3JtPWNsYXNzIDs7Ci0gICAgKi5jcHApIHhmb3JtPWNwcCA7OwotICAgICouY3h4KSB4Zm9ybT1jeHggOzsKLSAgICAqLmY5MCkgeGZvcm09ZjkwIDs7Ci0gICAgKi5mb3IpIHhmb3JtPWZvciA7OwotICAgICouamF2YSkgeGZvcm09amF2YSA7OwotICAgIGVzYWMKLQotICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKLQotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCi0KLSAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLXN0YXRpYykKLQlidWlsZF9vbGRfbGlicz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1wcmVmZXItcGljKQotCXBpY19tb2RlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXByZWZlci1ub24tcGljKQotCXBpY19tb2RlPW5vCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIHFsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAkcWxpYm9iaiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JcWxpYm9iaj0iXCIkcWxpYm9ialwiIiA7OwotICAgIGVzYWMKLSAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkcWxpYm9iaiIgXAotCSYmICRlY2hvICJYJGxpYm9iaiIgfCBncmVwICdbXX4jXip7fTs8Pj8iJyInIicgCSYoKXxgJFtdJyBcCi0JJiYgJGVjaG8gIiRtb2RlbmFtZTogbGlib2JqIG5hbWUgXGAkbGlib2JqJyBtYXkgbm90IGNvbnRhaW4gc2hlbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLiIKLSAgICBvYmpuYW1lPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICB4ZGlyPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2JqIjsgdGhlbgotICAgICAgeGRpcj0KLSAgICBlbHNlCi0gICAgICB4ZGlyPSR4ZGlyLwotICAgIGZpCi0gICAgbG9iaj0ke3hkaXJ9JG9iamRpci8kb2JqbmFtZQotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgotICAgIGVsc2UKLSAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKLSAgICBmaQotCi0gICAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLSAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0gICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgIHBpY19tb2RlPWRlZmF1bHQKLSAgICBmaQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCi0gICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICBvdXRwdXRfb2JqPQotICAgICAgbmVlZF9sb2Nrcz1ubwotICAgICAgbG9ja2ZpbGU9Ci0gICAgZmkKLQotICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCi0gICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgotICAgICAgdW50aWwgJHJ1biBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCi0Jc2xlZXAgMgotICAgICAgZG9uZQotICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgotICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgotCSRlY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLSAgICAgICRlY2hvICIkc3JjZmlsZSIgPiAiJGxvY2tmaWxlIgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkZml4X3NyY2ZpbGVfcGF0aCI7IHRoZW4KLSAgICAgIGV2YWwgc3JjZmlsZT1cIiRmaXhfc3JjZmlsZV9wYXRoXCIKLSAgICBmaQotICAgIHFzcmNmaWxlPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICBjYXNlICRxc3JjZmlsZSBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0gICAgICBxc3JjZmlsZT0iXCIkcXNyY2ZpbGVcIiIgOzsKLSAgICBlc2FjCi0KLSAgICAkcnVuICRybSAiJGxpYm9iaiIgIiR7bGlib2JqfVQiCi0KLSAgICAjIENyZWF0ZSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUgKGFuYWxvZ291cyB0byBhICIubGEiIGZpbGUpLAotICAgICMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCi0gICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4gJHtsaWJvYmp9VCA8PEVPRgotIyAkbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KLUVPRgotCi0gICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCi0gICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKLQotICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKLSAgICAgIGVsc2UKLQkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICEgLWQgIiR7eGRpcn0kb2JqZGlyIjsgdGhlbgotCSRzaG93ICIkbWtkaXIgJHt4ZGlyfSRvYmpkaXIiCi0JJHJ1biAkbWtkaXIgJHt4ZGlyfSRvYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICIkc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR7eGRpcn0kb2JqZGlyIjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgotCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgotICAgICAgZmkKLQotICAgICAgJHJ1biAkcm0gIiRsb2JqIiAiJG91dHB1dF9vYmoiCi0KLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KLQkkZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkbG9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRsb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBQSUMgb2JqZWN0IHRvIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLXBpY19vYmplY3Q9JyRvYmpkaXIvJG9iam5hbWUnCi0KLUVPRgotCi0gICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgotICAgICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgTm8gUElDIG9iamVjdCBzbyBpbmRpY2F0ZSBpdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBsaWJ0b29sCi0gICAgICAjIG9iamVjdCBmaWxlLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLXBpY19vYmplY3Q9bm9uZQotCi1FT0YKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0geWVzOyB0aGVuCi0JIyBEb24ndCBidWlsZCBQSUMgY29kZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgotICAgICAgZWxzZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgICRydW4gJHJtICIkb2JqIiAiJG91dHB1dF9vYmoiCi0gICAgICAkc2hvdyAiJGNvbW1hbmQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KLQkkZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBub24tUElDIG9iamVjdCB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KLSAgICAgICMgT25seSBhcHBlbmQgaWYgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUgZXhpc3RzLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLSMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QuCi1ub25fcGljX29iamVjdD0nJG9iam5hbWUnCi0KLUVPRgotICAgIGVsc2UKLSAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBub24tUElDIG9iamVjdCB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KLSAgICAgICMgT25seSBhcHBlbmQgaWYgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUgZXhpc3RzLgotICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKLSMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QuCi1ub25fcGljX29iamVjdD1ub25lCi0KLUVPRgotICAgIGZpCi0KLSAgICAkcnVuICRtdiAiJHtsaWJvYmp9VCIgIiR7bGlib2JqfSIKLQotICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rIHwgcmVsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgbGlidG9vbF9hcmdzPSIkbm9ub3B0IgotICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKLSAgICBjb21waWxlX2NvbW1hbmQ9IiRub25vcHQiCi0gICAgZmluYWxpemVfY29tbWFuZD0iJG5vbm9wdCIKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIG9sZF9kZXBsaWJzPQotICAgIGNvbXBpbGVyX2ZsYWdzPQotICAgIGxpbmtlcl9mbGFncz0KLSAgICBkbGxzZWFyY2hwYXRoPQotICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAotICAgIGluc3RfcHJlZml4X2Rpcj0KLQotICAgIGF2b2lkX3ZlcnNpb249bm8KLSAgICBkbGZpbGVzPQotICAgIGRscHJlZmlsZXM9Ci0gICAgZGxzZWxmPW5vCi0gICAgZXhwb3J0X2R5bmFtaWM9bm8KLSAgICBleHBvcnRfc3ltYm9scz0KLSAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KLSAgICBnZW5lcmF0ZWQ9Ci0gICAgbGlib2Jqcz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgbm9faW5zdGFsbD1ubwotICAgIG9ianM9Ci0gICAgbm9uX3BpY19vYmplY3RzPQotICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQotICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubwotICAgIHByZWxvYWQ9bm8KLSAgICBwcmV2PQotICAgIHByZXZhcmc9Ci0gICAgcmVsZWFzZT0KLSAgICBycGF0aD0KLSAgICB4cnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHRocmVhZF9zYWZlPW5vCi0gICAgdmluZm89Ci0gICAgdmluZm9fbnVtYmVyPW5vCi0KLSAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCi0KLSAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JZWxzZQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQlmaQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCXByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlxYXJnPVwiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgXCIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0Ci0JOzsKLSAgICAgICopIHFhcmc9JGFyZyA7OwotICAgICAgZXNhYwotICAgICAgbGlidG9vbF9hcmdzPSIkbGlidG9vbF9hcmdzICRxYXJnIgotCi0gICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCWNhc2UgJHByZXYgaW4KLQlvdXRwdXQpCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkcHJldiBpbgotCWRsZmlsZXN8ZGxwcmVmaWxlcykKLQkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCi0JICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgcHJlbG9hZD15ZXMKLQkgIGZpCi0JICBjYXNlICRhcmcgaW4KLQkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0JICBmb3JjZSkKLQkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgc2VsZikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBlbHNlCi0JICAgICAgZGxzZWxmPW5lZWRsZXNzCi0JICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqKQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgICAgZWxzZQotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWV4cHN5bXMpCi0JICBleHBvcnRfc3ltYm9scz0iJGFyZyIKLQkgIGlmIHRlc3QgISAtZiAiJGFyZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogc3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWV4cHN5bXNfcmVnZXgpCi0JICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlpbnN0X3ByZWZpeCkKLQkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlwcmVjaW91c19yZWdleCkKLQkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJlbGVhc2UpCi0JICByZWxlYXNlPSItJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlvYmplY3RsaXN0KQotCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KLQkgICAgc2F2ZV9hcmc9JGFyZwotCSAgICBtb3JlYXJncz0KLQkgICAgZm9yIGZpbCBpbiBgY2F0ICRzYXZlX2FyZ2AKLQkgICAgZG8KLSMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgotCSAgICAgIGFyZz0kZmlsCi0JICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JICAgICAgaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlwaWNfb2JqZWN0PQotCQlub25fcGljX29iamVjdD0KLQotCQkjIFJlYWQgdGhlIC5sbyBmaWxlCi0JCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCQljYXNlICRhcmcgaW4KLQkJKi8qIHwgKlxcKikgLiAkYXJnIDs7Ci0JCSopIC4gLi8kYXJnIDs7Ci0JCWVzYWMKLQotCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAotCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8Ci0JCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAotCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgotCQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIiAxPiYyCi0JCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCWZpCi0KLQkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkJeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JCSAgeGRpcj0KLQkJZWxzZQotCQkgIHhkaXI9IiR4ZGlyLyIKLQkJZmkKLQotCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKLQotCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KLQkJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCi0JCSAgICAgIHByZXY9Ci0JCSAgICAgIGNvbnRpbnVlCi0JCSAgICBlbHNlCi0JCSAgICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JCSAgICAgIHByZXY9ZGxwcmVmaWxlcwotCQkgICAgZmkKLQkJICBmaQotCi0JCSAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKLQkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JCSAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKLQkJICAgIHByZXY9Ci0JCSAgZmkKLQotCQkgICMgQSBQSUMgb2JqZWN0LgotCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCQkgIGFyZz0iJHBpY19vYmplY3QiCi0JCWZpCi0KLQkJIyBOb24tUElDIG9iamVjdC4KLQkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCi0KLQkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKLQkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgotCQkgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCi0JCSAgZmkKLQkJZmkKLQkgICAgICBlbHNlCi0JCSMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgotCQlpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiIDE+JjIKLQkJICBleGl0ICRFWElUX0ZBSUxVUkUKLQkJZWxzZQotCQkgICMgRHJ5LXJ1biBjYXNlLgotCi0JCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkJICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkJICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCQkgICAgeGRpcj0KLQkJICBlbHNlCi0JCSAgICB4ZGlyPSIkeGRpci8iCi0JCSAgZmkKLQotCQkgIHBpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7b2JqZGlyfS8ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkJICBub25fcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JCSAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCi0JCSAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkJZmkKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBlbHNlCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGxpbmsgaW5wdXQgZmlsZSBcYCRzYXZlX2FyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGFyZz0kc2F2ZV9hcmcKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlycGF0aCB8IHhycGF0aCkKLQkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCSAgY2FzZSAkYXJnIGluCi0JICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JICAqKQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCi0JICAgIGNhc2UgIiRycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKLQkgICAgZXNhYwotCSAgZWxzZQotCSAgICBjYXNlICIkeHJwYXRoICIgaW4KLQkgICAgKiIgJGFyZyAiKikgOzsKLQkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JeGNvbXBpbGVyKQotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKLQkgIHByZXY9Ci0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHFhcmciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkcWFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCXhsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRxYXJnIgotCSAgcHJldj0KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkd2wkcWFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR3bCRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGNjbGlua2VyKQotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRxYXJnIgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKLQkgIHByZXY9Ci0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHFhcmciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkcWFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCXNocmV4dCkKLSAgCSAgc2hyZXh0X2NtZHM9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0gICAgICAgIGRhcndpbl9mcmFtZXdvcmspCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JKikKLQkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQllc2FjCi0gICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JZXhwb3J0X2R5bmFtaWM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZnJhbWV3b3JrfC1hcmNoKQotICAgICAgICBwcmV2PWRhcndpbl9mcmFtZXdvcmsKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgIC1pbnN0LXByZWZpeC1kaXIpCi0JcHJldj1pbnN0X3ByZWZpeAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgotICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAotICAgICAgLUxbQS1aXVtBLVpdKjoqKQotCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCi0Jbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLUwqKQotCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBkaXI9IiRhYnNkaXIiCi0JICA7OwotCWVzYWMKLQljYXNlICIkZGVwbGlicyAiIGluCi0JKiIgLUwkZGlyICIqKSA7OwotCSopCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCi0JICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWwqKQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKLQkgICAgY29udGludWUKLQkgIGVzYWMKLQllbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCi0JIGNhc2UgJGhvc3QgaW4KLQkgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCi0JICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgotCSAgIGNvbnRpbnVlCi0JICAgOzsKLQkgZXNhYwotCWZpCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgVHJ1NjQgVU5JWCB1c2VzIC1tb2RlbCBbYXJnXSB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBDKysKLSAgICAgICMgY2xhc3NlcywgbmFtZSBtYW5nbGluZywgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZy4KLSAgICAgIC1tb2RlbCkKLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQlwcmV2PXhjb21waWxlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAtbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlKQotCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW1vZHVsZSkKLQltb2R1bGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIC02NCwgLW1pcHNbMC05XSBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFNHSSBjb21waWxlcgotICAgICAgIyAtclswLTldWzAtOV0qIHNwZWNpZmllcyB0aGUgcHJvY2Vzc29yIG9uIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTdW4gY29tcGlsZXIKLSAgICAgICMgK0RBKiwgK0REKiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIEhQIGNvbXBpbGVyCi0gICAgICAjIC1xKiBwYXNzIHRocm91Z2ggY29tcGlsZXIgYXJncyBmb3IgdGhlIElCTSBjb21waWxlcgotICAgICAgIyAtbSogcGFzcyB0aHJvdWdoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb21waWxlciBhcmdzIGZvciBHQ0MKLSAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKikKLQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgJGFyZyBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9ICJ5ZXMiIDsgdGhlbgotICAgICAgICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLSAgICAgICAgZmkKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLQotICAgICAgLXNocmV4dCkKLQlwcmV2PXNocmV4dAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKLQlmYXN0X2luc3RhbGw9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby1pbnN0YWxsKQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLQkgICMgVGhlIFBBVEggaGFja2VyeSBpbiB3cmFwcGVyIHNjcmlwdHMgaXMgcmVxdWlyZWQgb24gV2luZG93cwotCSAgIyBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIgMT4mMgotCSAgZmFzdF9pbnN0YWxsPW5vCi0JICA7OwotCSopIG5vX2luc3RhbGw9eWVzIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLXVuZGVmaW5lZCkKLQlhbGxvd191bmRlZmluZWQ9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vYmplY3RsaXN0KQotCXByZXY9b2JqZWN0bGlzdAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW8pIHByZXY9b3V0cHV0IDs7Ci0KLSAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKLQlwcmV2PXByZWNpb3VzX3JlZ2V4Ci0JY29udGludWUKLQk7OwotCi0gICAgICAtcmVsZWFzZSkKLQlwcmV2PXJlbGVhc2UKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1ycGF0aCkKLQlwcmV2PXJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUikKLQlwcmV2PXhycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIqKQotCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRkaXIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiR4cnBhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXN0YXRpYykKLQkjIFRoZSBlZmZlY3RzIG9mIC1zdGF0aWMgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgotCSMgV2UgdXNlZCB0byBkbyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYyBvbiBwbGF0Zm9ybXMgdGhhdAotCSMgZGlkbid0IGhhdmUgYSBQSUMgZmxhZywgYnV0IHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGVmZmVjdHMKLQkjIHdvdWxkIGJlIGVxdWl2YWxlbnQgd2FzIHdyb25nLiAgSXQgd291bGQgYnJlYWsgb24gYXQgbGVhc3QKLQkjIERpZ2l0YWwgVW5peCBhbmQgQUlYLgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXRocmVhZC1zYWZlKQotCXRocmVhZF9zYWZlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24taW5mbykKLQlwcmV2PXZpbmZvCi0JY29udGludWUKLQk7OwotICAgICAgLXZlcnNpb24tbnVtYmVyKQotCXByZXY9dmluZm8KLQl2aW5mb19udW1iZXI9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtV2MsKikKLQlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2MsLy8nYAotCWFyZz0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQlmb3IgZmxhZyBpbiAkYXJnczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgY2FzZSAkZmxhZyBpbgotCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgICAgZmxhZz0iXCIkZmxhZ1wiIgotCSAgICA7OwotCSAgZXNhYwotCSAgYXJnPSIkYXJnICR3bCRmbGFnIgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZmxhZyIKLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCi0JOzsKLQotICAgICAgLVdsLCopCi0JYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdsLC8vJ2AKLQlhcmc9Ci0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0JZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGNhc2UgJGZsYWcgaW4KLQkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgIGZsYWc9IlwiJGZsYWdcIiIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJGZsYWciCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCi0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAotCTs7Ci0KLSAgICAgIC1YY29tcGlsZXIpCi0JcHJldj14Y29tcGlsZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1YbGlua2VyKQotCXByZXY9eGxpbmtlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVhDQ2xpbmtlcikKLQlwcmV2PXhjY2xpbmtlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCi0gICAgICAtKiB8ICsqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgJGFyZyBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgICouJG9iamV4dCkKLQkjIEEgc3RhbmRhcmQgb2JqZWN0LgotCW9ianM9IiRvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KLQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KLQlpZiAoJHtTRUR9IC1lICcycScgJGFyZyB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBwaWNfb2JqZWN0PQotCSAgbm9uX3BpY19vYmplY3Q9Ci0KLQkgICMgUmVhZCB0aGUgLmxvIGZpbGUKLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAkYXJnIGluCi0JICAqLyogfCAqXFwqKSAuICRhcmcgOzsKLQkgICopIC4gLi8kYXJnIDs7Ci0JICBlc2FjCi0KLQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCBcCi0JICAgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8Ci0JICAgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmIFwKLQkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQotCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkgICAgeGRpcj0KLSAJICBlbHNlCi0JICAgIHhkaXI9IiR4ZGlyLyIKLQkgIGZpCi0KLQkgIGlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JICAgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCi0KLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KLQkJZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCi0JCXByZXY9Ci0JCWNvbnRpbnVlCi0JICAgICAgZWxzZQotCQkjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgotCQlwcmV2PWRscHJlZmlsZXMKLQkgICAgICBmaQotCSAgICBmaQotCi0JICAgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCi0JICAgICAgcHJldj0KLQkgICAgZmkKLQotCSAgICAjIEEgUElDIG9iamVjdC4KLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCi0JICAgIGFyZz0iJHBpY19vYmplY3QiCi0JICBmaQotCi0JICAjIE5vbi1QSUMgb2JqZWN0LgotCSAgaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JICAgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKLQotCSAgICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKLQkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkgICAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCi0JICAgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCi0JICAgIGZpCi0JICBmaQotCWVsc2UKLQkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgotCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGVsc2UKLQkgICAgIyBEcnktcnVuIGNhc2UuCi0KLQkgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLQkgICAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JICAgICAgeGRpcj0KLQkgICAgZWxzZQotCSAgICAgIHhkaXI9IiR4ZGlyLyIKLQkgICAgZmkKLQotCSAgICBwaWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke29iamRpcn0vJHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICAgIG5vbl9waWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgJHBpY19vYmplY3QiCi0JICAgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKi4kbGliZXh0KQotCSMgQW4gYXJjaGl2ZS4KLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCW9sZF9kZXBsaWJzPSIkb2xkX2RlcGxpYnMgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgcHJldj0KLQllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgcHJldj0KLQllbHNlCi0JICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCi0gICAgICAqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgJGFyZyBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjICMgYXJnCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgZmkKLSAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0gICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgZmkKLQotICAgIG9sZGxpYnM9Ci0gICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQotICAgIG91dHB1dG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCi0KLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKLSAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJGVjaG8gXCJYXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKLSAgICBlbHNlCi0gICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLQotICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgotICAgIGVsc2UKLSAgICAgIG91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCi0gICAgZmkKLSAgICAjIENyZWF0ZSB0aGUgb2JqZWN0IGRpcmVjdG9yeS4KLSAgICBpZiB0ZXN0ICEgLWQgIiRvdXRwdXRfb2JqZGlyIjsgdGhlbgotICAgICAgJHNob3cgIiRta2RpciAkb3V0cHV0X29iamRpciIKLSAgICAgICRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0gICAgICBzdGF0dXM9JD8KLSAgICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCi0JZXhpdCAkc3RhdHVzCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIERldGVybWluZSB0aGUgdHlwZSBvZiBvdXRwdXQKLSAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAiIikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICA7OwotICAgICouJGxpYmV4dCkgbGlua21vZGU9b2xkbGliIDs7Ci0gICAgKi5sbyB8ICouJG9iamV4dCkgbGlua21vZGU9b2JqIDs7Ci0gICAgKi5sYSkgbGlua21vZGU9bGliIDs7Ci0gICAgKikgbGlua21vZGU9cHJvZyA7OyAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KLSAgICBlc2FjCi0KLSAgICBjYXNlICRob3N0IGluCi0gICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqKQotICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKLSAgICAgIGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz15ZXMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kZHVwbGljYXRlX2RlcHMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIHNwZWNpYWxkZXBsaWJzPQotCi0gICAgbGlicz0KLSAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKLSAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKLSAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbwotICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JY2FzZSAiJGxpYnMgIiBpbgotCSoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgbGlicz0iJGxpYnMgJGRlcGxpYiIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0gICAgICBsaWJzPSIkcHJlZGVwcyAkbGlicyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICRwb3N0ZGVwcyIKLQotICAgICAgIyBDb21wdXRlIGxpYnJhcmllcyB0aGF0IGFyZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gJHByZWRlcHMKLSAgICAgICMgJHBvc3RkZXBzIGFuZCBtYXJrIHRoZW0gYXMgc3BlY2lhbCAoaS5lLiwgd2hvc2UgZHVwbGljYXRlcyBhcmUKLSAgICAgICMgbm90IHRvIGJlIGVsaW1pbmF0ZWQpLgotICAgICAgcHJlX3Bvc3RfZGVwcz0KLSAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KLQkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KLQkgICoiICRwcmVfcG9zdF9kZXAgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJHByZV9wb3N0X2RlcHMiIDs7Ci0JICBlc2FjCi0JICBwcmVfcG9zdF9kZXBzPSIkcHJlX3Bvc3RfZGVwcyAkcHJlX3Bvc3RfZGVwIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBwcmVfcG9zdF9kZXBzPQotICAgIGZpCi0KLSAgICBkZXBsaWJzPQotICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0gICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBjYXNlICRsaW5rbW9kZSBpbgotICAgIGxpYikKLQlwYXNzZXM9ImNvbnYgbGluayIKLQlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KLQkgIGNhc2UgJGZpbGUgaW4KLQkgICoubGEpIDs7Ci0JICAqKQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaWJyYXJpZXMgY2FuIFxgLWRsb3Blbicgb25seSBsaWJ0b29sIGxpYnJhcmllczogJGZpbGUiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCTs7Ci0gICAgcHJvZykKLQljb21waWxlX2RlcGxpYnM9Ci0JZmluYWxpemVfZGVwbGlicz0KLQlhbGxkZXBsaWJzPW5vCi0JbmV3ZGxmaWxlcz0KLQluZXdkbHByZWZpbGVzPQotCXBhc3Nlcz0iY29udiBzY2FuIGRsb3BlbiBkbHByZW9wZW4gbGluayIKLQk7OwotICAgICopICBwYXNzZXM9ImNvbnYiCi0JOzsKLSAgICBlc2FjCi0gICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8Ci0JIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIjsgdGhlbgotCWxpYnM9IiRkZXBsaWJzIgotCWRlcGxpYnM9Ci0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQljYXNlICRwYXNzIGluCi0JZGxvcGVuKSBsaWJzPSIkZGxmaWxlcyIgOzsKLQlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OwotCWxpbmspIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSAkZGVwZW5kZW5jeV9saWJzIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KLQkjIENvbGxlY3QgZGxwcmVvcGVuZWQgbGlicmFyaWVzCi0Jc2F2ZV9kZXBsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLSAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCi0JbGliPQotCWZvdW5kPW5vCi0JY2FzZSAkZGVwbGliIGluCi0JLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSkKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZGVwbGliIgotCSAgZmkKLQkgIGNvbnRpbnVlCi0JICA7OwotCS1sKikKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZzsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIiAxPiYyCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgbmFtZT1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tbC8vJ2AKLQkgIGZvciBzZWFyY2hkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkgICAgZm9yIHNlYXJjaF9leHQgaW4gLmxhICRzdGRfc2hyZXh0IC5zbyAuYTsgZG8KLQkgICAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5Ci0JICAgICAgbGliPSIkc2VhcmNoZGlyL2xpYiR7bmFtZX0ke3NlYXJjaF9leHR9IgotCSAgICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JCWlmIHRlc3QgIiRzZWFyY2hfZXh0IiA9ICIubGEiOyB0aGVuCi0JCSAgZm91bmQ9eWVzCi0JCWVsc2UKLQkJICBmb3VuZD1ubwotCQlmaQotCQlicmVhayAyCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZG9uZQotCSAgaWYgdGVzdCAiJGZvdW5kIiAhPSB5ZXM7IHRoZW4KLQkgICAgIyBkZXBsaWIgZG9lc24ndCBzZWVtIHRvIGJlIGEgbGlidG9vbCBsaWJyYXJ5Ci0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICBlbHNlICMgZGVwbGliIGlzIGEgbGlidG9vbCBsaWJyYXJ5Ci0JICAgICMgSWYgJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyAmJiAkZGVwbGliIGlzIGEgc3RkbGliLAotCSAgICAjIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHRoaW5ncyBoZXJlLCBhbmQgbm90IGxhdGVyLgotCSAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikKLQkJaWYgKCR7U0VEfSAtZSAnMnEnICRsaWIgfAotICAgICAgICAgICAgICAgICAgICBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkgIGxpYnJhcnlfbmFtZXM9Ci0JCSAgb2xkX2xpYnJhcnk9Ci0JCSAgY2FzZSAkbGliIGluCi0JCSAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JCSAgKikgLiAuLyRsaWIgOzsKLQkJICBlc2FjCi0JCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCQkgICAgbGw9IiRsIgotCQkgIGRvbmUKLQkJICBpZiB0ZXN0ICJYJGxsIiA9ICJYJG9sZF9saWJyYXJ5IiA7IHRoZW4gIyBvbmx5IHN0YXRpYyB2ZXJzaW9uIGF2YWlsYWJsZQotCQkgICAgZm91bmQ9bm8KLQkJICAgIGxhZGlyPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkJICAgIHRlc3QgIlgkbGFkaXIiID0gIlgkbGliIiAmJiBsYWRpcj0iLiIKLQkJICAgIGxpYj0kbGFkaXIvJG9sZF9saWJyYXJ5Ci0JCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JCSAgICBlbHNlCi0JCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JCSAgICAgIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JCSAgICBmaQotCQkgICAgY29udGludWUKLQkJICBmaQotCQlmaQotCSAgICAgICAgOzsKLQkgICAgICAqKSA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGZpCi0JICA7OyAjIC1sCi0JLUwqKQotCSAgY2FzZSAkbGlua21vZGUgaW4KLQkgIGxpYikKLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgdGVzdCAiJHBhc3MiID0gY29udiAmJiBjb250aW51ZQotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICJgJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKLQkgICAgOzsKLQkgIHByb2cpCi0JICAgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIGNvbnRpbnVlCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRwYXNzIiA9IHNjYW47IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZmkKLQkgICAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICJgJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKLQkgICAgOzsKLQkgICopCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLUwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiIDE+JjIKLQkgICAgOzsKLQkgIGVzYWMgIyBsaW5rbW9kZQotCSAgY29udGludWUKLQkgIDs7ICMgLUwKLQktUiopCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCi0JICAgIGRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQkgICAgIyBNYWtlIHN1cmUgdGhlIHhycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCSoubGEpIGxpYj0iJGRlcGxpYiIgOzsKLQkqLiRsaWJleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGNvbnRpbnVlCi0JICBmaQotCSAgY2FzZSAkbGlua21vZGUgaW4KLQkgIGxpYikKLQkgICAgdmFsaWRfYV9saWI9bm8KLQkgICAgY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQkgICAgICBtYXRjaF9wYXR0ZXJuKikKLQkJc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgICAgICAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCQlpZiBldmFsICRlY2hvIFwiJGRlcGxpYlwiIDI+L2Rldi9udWxsIFwKLQkJICAgIHwgJFNFRCAxMHEgXAotCQkgICAgfCAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkgIHZhbGlkX2FfbGliPXllcwotCQlmaQotCQk7OwotCSAgICAgIHBhc3NfYWxsKQotCQl2YWxpZF9hX2xpYj15ZXMKLQkJOzsKLSAgICAgICAgICAgIGVzYWMKLQkgICAgaWYgdGVzdCAiJHZhbGlkX2FfbGliIiAhPSB5ZXM7IHRoZW4KLQkgICAgICAkZWNobwotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogVHJ5aW5nIHRvIGxpbmsgd2l0aCBzdGF0aWMgbGliIGFyY2hpdmUgJGRlcGxpYi4iCi0JICAgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JICAgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JICAgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkgICAgICAkZWNobyAiKioqIGJlY2F1c2UgdGhlIGZpbGUgZXh0ZW5zaW9ucyAuJGxpYmV4dCBvZiB0aGlzIGFyZ3VtZW50IG1ha2VzIG1lIGJlbGlldmUiCi0JICAgICAgJGVjaG8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2VkIGhlcmUuIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCi0JICAgICAgJGVjaG8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHByb2cpCi0JICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBlc2FjICMgbGlua21vZGUKLQkgIDs7ICMgKi4kbGliZXh0Ci0JKi5sbyB8ICouJG9iamV4dCkKLQkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcgc3RhdGljYWxseSwKLQkgICAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGVwbGliIgotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkZGVwbGliIgotCSAgICBmaQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JICA7OwotCSVERVBMSUJTJSkKLQkgIGFsbGRlcGxpYnM9eWVzCi0JICBjb250aW51ZQotCSAgOzsKLQllc2FjICMgY2FzZSAkZGVwbGliCi0JaWYgdGVzdCAiJGZvdW5kIiA9IHllcyB8fCB0ZXN0IC1mICIkbGliIjsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgdGhlIGxpYnJhcnkgXGAkbGliJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRsaWIgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQlsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRsYWRpciIgPSAiWCRsaWIiICYmIGxhZGlyPSIuIgotCi0JZGxuYW1lPQotCWRsb3Blbj0KLQlkbHByZW9wZW49Ci0JbGliZGlyPQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKLQkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKLQlpbnN0YWxsZWQ9eWVzCi0Jc2hvdWxkbm90bGluaz1ubwotCWF2b2lkdGVtcHJwYXRoPQotCi0KLQkjIFJlYWQgdGhlIC5sYSBmaWxlCi0JY2FzZSAkbGliIGluCi0JKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JKikgLiAuLyRsaWIgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAotCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCi0JICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkZGxvcGVuIgotCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRscHJlb3BlbiIKLQlmaQotCi0JaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKLQkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKLQkgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgZmkKLQkgICAgIyBJdCBpcyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeSwgc28gYWRkIGluIGl0cyBvYmplY3RzLgotCSAgICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKLQkgICAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKLQkgICAgdG1wX2xpYnM9Ci0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgICBlc2FjCi0gICAgICAgICAgICAgIGZpCi0JICAgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgICBkb25lCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gY29udgotCi0KLQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0JbGlua2xpYj0KLQlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JICBsaW5rbGliPSIkbCIKLQlkb25lCi0JaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCWlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IC1kbG9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8Ci0JICAgICB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fAotCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZwotCSAgICAjIHN0YXRpY2FsbHksIHdlIG5lZWQgdG8gcHJlbG9hZC4gIFdlIGFsc28gbmVlZCB0byBwcmVsb2FkIGFueQotCSAgICAjIGRlcGVuZGVudCBsaWJyYXJpZXMgc28gbGlibHRkbCdzIGRlcGxpYiBwcmVsb2FkZXIgZG9lc24ndAotCSAgICAjIGJvbWIgb3V0IGluIHRoZSBsb2FkIGRlcGxpYnMgcGhhc2UuCi0JICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIgJGRlcGVuZGVuY3lfbGlicyIKLQkgIGVsc2UKLQkgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYiIKLQkgIGZpCi0JICBjb250aW51ZQotCWZpICMgJHBhc3MgPSBkbG9wZW4KLQotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgJGxhZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNfbGFkaXI9IiRsYWRpciIgOzsKLQkqKQotCSAgYWJzX2xhZGlyPWBjZCAiJGxhZGlyIiAmJiBwd2RgCi0JICBpZiB0ZXN0IC16ICIkYWJzX2xhZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIgMT4mMgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIiAxPiYyCi0JICAgIGFic19sYWRpcj0iJGxhZGlyIgotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCWxhbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQkjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KLQlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCi0JICBpZiB0ZXN0ICEgLWYgIiRsaWJkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIiAxPiYyCi0JICAgIGRpcj0iJGxhZGlyIgotCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCi0JICAgIGxpYmRpcj0iJGFic19sYWRpciIKLQkgIGVsc2UKLQkgICAgZGlyPSIkbGliZGlyIgotCSAgICBhYnNkaXI9IiRsaWJkaXIiCi0JICBmaQotCSAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gWHllcyAmJiBhdm9pZHRlbXBycGF0aD15ZXMKLQllbHNlCi0JICBpZiB0ZXN0ICEgLWYgIiRsYWRpci8kb2JqZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgotCSAgICBkaXI9IiRsYWRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgotCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCi0JICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRsYWRpci8kb2JqZGlyIgotCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIvJG9iamRpciIKLQkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgotCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKLQkgIGZpCi0JZmkgIyAkaW5zdGFsbGVkID0geWVzCi0JbmFtZT1gJGVjaG8gIlgkbGFuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0KLQkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQlpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxwcmVvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGRsbmFtZSwgc28gdGhhdCBsdF9kbG9wZW4gZmluZHMgaXQuCi0JICBlbGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGRsbmFtZSIKLQkgIGVsc2UKLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JZmkgIyAkcGFzcyA9IGRscHJlb3BlbgotCi0JaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICMgTGluayB0aGUgY29udmVuaWVuY2UgbGlicmFyeQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgIGVsaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiICMgdXNlZCBmb3IgcHJvZyxzY2FuIHBhc3MKLQkgIGZpCi0JICBjb250aW51ZQotCWZpCi0KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nICYmIHRlc3QgIiRwYXNzIiAhPSBsaW5rOyB0aGVuCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxhZGlyIgotCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKLQotCSAgbGlua2FsbGRlcGxpYnM9bm8KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubyB8fCB0ZXN0IC16ICIkbGlicmFyeV9uYW1lcyIgfHwKLQkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgbGlua2FsbGRlcGxpYnM9eWVzCi0JICBmaQotCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICJgJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tTC8vJ2A7OyAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQkgICAgZXNhYwotCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/Ci0JICAgIGlmIHRlc3QgIiRsaW5rYWxsZGVwbGlicyIgPSB5ZXM7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCi0JICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKLQkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lICMgZm9yIGRlcGxpYgotCSAgY29udGludWUKLQlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCi0JICAgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgotCSAgICAjIFdlIG5lZWQgdG8gaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aAotCSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAteiAiJGF2b2lkdGVtcHJwYXRoIiA7IHRoZW4KLQkgICAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgICAgY2FzZSAiJHRlbXBfcnBhdGggIiBpbgotCSAgICAgICoiICRkaXIgIiopIDs7Ci0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSB0ZW1wX3JwYXRoPSIkdGVtcF9ycGF0aCAkYWJzZGlyIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQotCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCi0JICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKLQkgICAgIyBzZWFyY2ggcGF0aC4KLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAqKQotCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCi0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGZpICMgJGxpbmttb2RlLCRwYXNzID0gcHJvZyxsaW5rLi4uCi0KLQkgIGlmIHRlc3QgIiRhbGxkZXBsaWJzIiA9IHllcyAmJgotCSAgICAgeyB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiID0gcGFzc19hbGwgfHwKLQkgICAgICAgeyB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJgotCQkgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB9OyB9OyB0aGVuCi0JICAgICMgV2Ugb25seSBuZWVkIHRvIHNlYXJjaCBmb3Igc3RhdGljIGxpYnJhcmllcwotCSAgICBjb250aW51ZQotCSAgZmkKLQlmaQotCi0JbGlua19zdGF0aWM9bm8gIyBXaGV0aGVyIHRoZSBkZXBsaWIgd2lsbCBiZSBsaW5rZWQgc3RhdGljYWxseQotCWlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgotCSAgIHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCi0JICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgotCSAgICBuZWVkX3JlbGluaz15ZXMKLQkgIGZpCi0JICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQotCi0JICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24KLQkgICMgc29tZSBzeXN0ZW1zIChkYXJ3aW4pCi0JICBpZiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluayA7IHRoZW4KLQkgICAgJGVjaG8KLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIGV4ZWN1dGFibGUgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgotCSAgICBmaQotCSAgICAkZWNobyAiKioqICRsaW5rbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JICBmaQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJgotCSAgICAgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KLQkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgotCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAgICMgc2VhcmNoIHBhdGguCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCi0JICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCi0JICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCSAgICByZWFsbmFtZT0iJDIiCi0JICAgIHNoaWZ0OyBzaGlmdAotCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPwotCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKLQkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICAgICAgIyBibGVoIHdpbmRvd3MKLQkgICAgICBjYXNlICRob3N0IGluCi0JICAgICAgKmN5Z3dpbiogfCBtaW5ndyopCi0JCW1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkJdmVyc3VmZml4PSItJG1ham9yIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JICAgIGVsc2UKLQkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKLQkgICAgZmkKLQotCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQotCSAgICBzb3Jvb3Q9IiRzb25hbWUiCi0JICAgIHNvbmFtZT1gJGVjaG8gJHNvcm9vdCB8ICR7U0VEfSAtZSAncy9eLipcLy8vJ2AKLQkgICAgbmV3bGliPSJsaWJpbXAtYCRlY2hvICRzb25hbWUgfCAke1NFRH0gJ3MvXmxpYi8vO3MvXC5kbGwkLy8nYC5hIgotCi0JICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93Ci0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6Ci0JICAgIGVsc2UKLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgY21kcz0kZXh0cmFjdF9leHBzeW1zX2NtZHMKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQotCSAgICAjIENyZWF0ZSAkbmV3bGliCi0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKLQkgICAgICAkc2hvdyAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBjbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQlldmFsIGNtZD1cIiRjbWRcIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQotCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKLQkgICAgbGlua2xpYj0kbmV3bGliCi0JICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKLQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSAgICBhZGRfc2hsaWJwYXRoPQotCSAgICBhZGRfZGlyPQotCSAgICBhZGQ9Ci0JICAgIGxpYl9saW5rZWQ9eWVzCi0JICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgotCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkJY2FzZSAkaG9zdCBpbgotCQkgICotKi1zY28zLjJ2NSogKSBhZGRfZGlyPSItTCRkaXIiIDs7Ci0JCSAgKi0qLWRhcndpbiogKQotCQkgICAgIyBpZiB0aGUgbGliIGlzIGEgbW9kdWxlIHRoZW4gd2UgY2FuIG5vdCBsaW5rIGFnYWluc3QKLQkJICAgICMgaXQsIHNvbWVvbmUgaXMgaWdub3JpbmcgdGhlIG5ldyB3YXJuaW5ncyBJIGFkZGVkCi0JCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwgJEVHUkVQICJidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCi0JCSAgICAgICRlY2hvICIqKiBXYXJuaW5nLCBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgotCQkgICAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgotCQkgICAgICAgICRlY2hvCi0JCSAgICAgICAgJGVjaG8gIioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCi0JCSAgICAgICAgJGVjaG8gIioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCi0JCSAgICAgIGVsc2UKLQkJICAgICAgICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgotCQkgICAgICBmaQotCQkgICAgZmkKLQkJZXNhYwotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OwotCQllc2FjCi0JCWFkZF9kaXI9Ii1MJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkJYWRkX3NobGlicGF0aD0iJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsc2UKLQkJbGliX2xpbmtlZD1ubwotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgcmVsaW5rKQotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCQlhZGRfZGlyPSItTCRkaXIiCi0JCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KLQkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJICBjYXNlICRsaWJkaXIgaW4KLQkJICAgIFtcXC9dKikKLQkJICAgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7Ci0JICAgIGVzYWMKLQotCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KLQkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZF9kaXIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGQgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgotCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHllcyAmJiBcCi0JCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKLQkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgotCQkqIjokbGliZGlyOiIqKSA7OwotCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKLQkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KLQkgICAgICAgIGFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCi0JICAgICAgZWxzZQotCSAgICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgotCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKLQkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJY2FzZSAkbGliZGlyIGluCi0JCSAgW1xcL10qKQotCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGFkZD0iLWwkbmFtZSIKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgIGZpCi0JICBmaQotCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZmkKLQllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQotCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KLQotCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCi0JICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgotCSAgICAkZWNobwotCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCi0JICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKLQkgICAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCi0JICAgICAgJGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKLQkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCQkkZWNobwotCQkkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JCSRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgotCQkkZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCQkkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgotCSAgICBsaW5rX3N0YXRpYz15ZXMKLQkgIGZpCi0JZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KLQotCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCi0JICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAotCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8Ci0JICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KLQkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICAgIHRlbXBfZGVwbGlicz0KLQkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGxpYmRpciBpbgotCSAgICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KLQkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7Ci0JCSAgIGVzYWM7OwotCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKLQkgIGZpCi0KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgotCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5Ci0JICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgZG9uZQotCi0JICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKLQkgICAgICAqLmxhKQotCQlkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQl0ZXN0ICJYJGRpciIgPSAiWCRkZXBsaWIiICYmIGRpcj0iLiIKLQkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JCWNhc2UgJGRpciBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKLQkJKikKLQkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgotCQkgICAgYWJzZGlyPSIkZGlyIgotCQkgIGZpCi0JCSAgOzsKLQkJZXNhYwotCQlpZiBncmVwICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgcGF0aD0iJGFic2Rpci8kb2JqZGlyIgotCQllbHNlCi0JCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQkgIGZpCi0JCSAgaWYgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiOyB0aGVuCi0JCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIiAxPiYyCi0JCSAgZmkKLQkJICBwYXRoPSIkYWJzZGlyIgotCQlmaQotCQlkZXBkZXBsPQotCQljYXNlICRob3N0IGluCi0JCSotKi1kYXJ3aW4qKQotCQkgICMgd2UgZG8gbm90IHdhbnQgdG8gbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJzLAotCQkgICMgYnV0IG5lZWQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZAotCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCi0JCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KLQkJICAgICAgZGVwZGVwbD0kdG1wCi0JCSAgICBkb25lCi0JCSAgICBpZiB0ZXN0IC1mICIkcGF0aC8kZGVwZGVwbCIgOyB0aGVuCi0JCSAgICAgIGRlcGRlcGw9IiRwYXRoLyRkZXBkZXBsIgotCQkgICAgZmkKLQkJICAgICMgZG8gbm90IGFkZCBwYXRocyB3aGljaCBhcmUgYWxyZWFkeSB0aGVyZQotCQkgICAgY2FzZSAiICRuZXdsaWJfc2VhcmNoX3BhdGggIiBpbgotCQkgICAgKiIgJHBhdGggIiopIDs7Ci0JCSAgICAqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJHBhdGgiOzsKLQkJICAgIGVzYWMKLQkJICBmaQotCQkgIHBhdGg9IiIKLQkJICA7OwotCQkqKQotCQkgIHBhdGg9Ii1MJHBhdGgiCi0JCSAgOzsKLQkJZXNhYwotCQk7OwotCSAgICAgIC1sKikKLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotZGFyd2luKikKLQkJICAjIEFnYWluLCB3ZSBvbmx5IHdhbnQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKLQkJICBldmFsIHRtcF9saWJzPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgInMsXlwtbCwsImAKLQkJICBmb3IgdG1wIGluICRuZXdsaWJfc2VhcmNoX3BhdGggOyBkbwotCQkgICAgaWYgdGVzdCAtZiAiJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiIDsgdGhlbgotCQkgICAgICBldmFsIGRlcGRlcGw9IiR0bXAvbGliJHRtcF9saWJzLmR5bGliIgotCQkgICAgICBicmVhawotCQkgICAgZmkKLQkJICBkb25lCi0JCSAgcGF0aD0iIgotCQkgIDs7Ci0JCSopIGNvbnRpbnVlIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICAqKSBjb250aW51ZSA7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRwYXRoICIqKSA7OwotCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRkZXBkZXBsICIqKSA7OwotCSAgICAgICopIGRlcGxpYnM9IiRkZXBkZXBsICRkZXBsaWJzIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCi0JZmkgIyBsaW5rbW9kZSA9IGxpYgotICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKLSAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgotCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKLQlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCi0JICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCWRvbmUKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCi0JaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KLQkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgIGxpYl9zZWFyY2hfcGF0aD0KLQkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KLQkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9Ci0JZmkKLQotCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KLQkgIHZhcnM9ImRlcGxpYnMiCi0JZWxzZQotCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCi0JZmkKLQlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKLQkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgotCSAgbmV3X2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KLQkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KLQkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKLQkgICAgIyAgICAgICAgYnJva2VuOgotCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgotCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KLQkgICAgIyBwcmFjdGljZToKLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAtUiopIDs7Ci0JICAgICopCi0JICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKLQkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKLQkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQotCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCi0JICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcwotCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQotCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKLQkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAotCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKLQkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKLQkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5Ci0JICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQotCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0Ci0JICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCi0JICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCSAgICAgICopCi0JCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCQkqIiAkZGVwbGliICIqKSA7OwotCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KLQkgICAgY2FzZSAkZGVwbGliIGluCi0JICAgIC1MKikKLQkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSA7OwotCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgotCWRvbmUgIyBmb3IgdmFyCi0gICAgICBmaQotICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLSAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQotICAgICAgdG1wX2xpYnM9Ci0gICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KLQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRpICIqKQotCSAgaT0iIgotCSAgOzsKLQllc2FjCi0JaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKLQlmaQotICAgICAgZG9uZQotICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicwotICAgIGRvbmUgIyBmb3IgcGFzcwotICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0gICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotICAgIGZpCi0KLSAgICBjYXNlICRsaW5rbW9kZSBpbgotICAgIG9sZGxpYikKLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgb2xkbGlicz0iJG91dHB1dCIKLSAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgotICAgICAgOzsKLQotICAgIGxpYikKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KLSAgICAgIGxpYiopCi0JbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCi0JICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCi0JICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCSAgZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCWVsc2UKLQkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIgMj4mMQotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZWxzZQotCSAgJGVjaG8KLQkgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKLQkgICRlY2hvICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgotCSAgbGlib2Jqcz0iJGxpYm9ianMgJG9ianMiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBzZXQgZHVtbXkgJHJwYXRoCi0gICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCi0JICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KLQkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KLQkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKLQkgIGJ1aWxkX29sZF9saWJzPXllcwotCWZpCi0KLQlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKLQlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBjb252ZXJ0IGFic29sdXRlIHZlcnNpb24gbnVtYmVycyB0byBsaWJ0b29sIGFnZXMKLQkjIHRoaXMgcmV0YWlucyBjb21wYXRpYmlsaXR5IHdpdGggLmxhIGZpbGVzIGFuZCBhdHRlbXB0cwotCSMgdG8gbWFrZSB0aGUgY29kZSBiZWxvdyBhIGJpdCBtb3JlIGNvbXByZWhlbnNpYmxlCi0KLQljYXNlICR2aW5mb19udW1iZXIgaW4KLQl5ZXMpCi0JICBudW1iZXJfbWFqb3I9IiQyIgotCSAgbnVtYmVyX21pbm9yPSIkMyIKLQkgIG51bWJlcl9yZXZpc2lvbj0iJDQiCi0JICAjCi0JICAjIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28ga2luZHMgLS0gdGhvc2UgdGhhdAotCSAgIyB1c2UgdGhlIGN1cnJlbnQgcmV2aXNpb24gYXMgdGhlIG1ham9yIHZlcnNpb24KLQkgICMgYW5kIHRob3NlIHRoYXQgc3VidHJhY3QgYWdlIGFuZCB1c2UgYWdlIGFzCi0JICAjIGEgbWlub3IgdmVyc2lvbi4gIEJ1dCwgdGhlbiB0aGVyZSBpcyBpcml4Ci0JICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgotCSAgIwotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3MpCi0JICAgIGN1cnJlbnQ9YGV4cHIgJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3JgCi0JICAgIGFnZT0iJG51bWJlcl9taW5vciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCi0JICAgIDs7Ci0JICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCi0JICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICBhZ2U9IjAiCi0JICAgIDs7Ci0JICBpcml4fG5vbnN0b3B1eCkKLQkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vciAtIDFgCi0JICAgIGFnZT0iJG51bWJlcl9taW5vciIKLQkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCW5vKQotCSAgY3VycmVudD0iJDIiCi0JICByZXZpc2lvbj0iJDMiCi0JICBhZ2U9IiQ0IgotCSAgOzsKLQllc2FjCi0KLQkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgotCWNhc2UgJGN1cnJlbnQgaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHJldmlzaW9uIGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJGFnZSBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRhZ2UiIC1ndCAiJGN1cnJlbnQiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgotCW1ham9yPQotCXZlcnN1ZmZpeD0KLQl2ZXJzdHJpbmc9Ci0JY2FzZSAkdmVyc2lvbl90eXBlIGluCi0Jbm9uZSkgOzsKLQotCWRhcndpbikKLQkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBhdmFpbGFibGUgaW4KLQkgICMgdmVyc3RyaW5nIGZvciBjb2RpbmcgaXQgaW50byB0aGUgbGlicmFyeSBoZWFkZXIKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgICMgRGFyd2luIGxkIGRvZXNuJ3QgbGlrZSAwIGZvciB0aGVzZSBvcHRpb25zLi4uCi0JICBtaW5vcl9jdXJyZW50PWBleHByICRjdXJyZW50ICsgMWAKLQkgIHZlcnN0cmluZz0iJHt3bH0tY29tcGF0aWJpbGl0eV92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQgJHt3bH0tY3VycmVudF92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCWZyZWVic2QtYW91dCkKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOwotCSAgOzsKLQotCWZyZWVic2QtZWxmKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKLQkgIDs7Ci0KLQlpcml4IHwgbm9uc3RvcHV4KQotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKLQotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKLQkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OwotCSAgZXNhYwotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRyZXZpc2lvbgotCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCi0JICBkb25lCi0KLQkgICMgQmVmb3JlIHRoaXMgcG9pbnQsICRtYWpvciBtdXN0IG5vdCBjb250YWluIGAuJy4KLQkgIG1ham9yPS4kbWFqb3IKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kYWdlCi0JICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKLQkgIGRvbmUKLQotCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKLQkgIDs7Ci0KLQlzdW5vcykKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0Jd2luZG93cykKLQkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKLQkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCi0JICA7OwotCi0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgotCSAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotCi0JIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KLQlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgbWFqb3I9Ci0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbikKLQkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCi0JICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKLQkgICAgdmVyc3RyaW5nPQotCSAgICA7OwotCSAgKikKLQkgICAgdmVyc3RyaW5nPSIwLjAiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5Ci0JIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCi0JcmVtb3ZlbGlzdD0KLQl0ZW1wcmVtb3ZlbGlzdD1gJGVjaG8gIiRvdXRwdXRfb2JqZGlyLyoiYAotCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KLQkgIGNhc2UgJHAgaW4KLQkgICAgKi4kb2JqZXh0KQotCSAgICAgICA7OwotCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQotCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KLQkgICAgICAgICBpZiBlY2hvICRwIHwgJEVHUkVQIC1lICIkcHJlY2lvdXNfZmlsZXNfcmVnZXgiID4vZGV2L251bGwgMj4mMQotCSAgICAgICAgIHRoZW4KLQkJICAgY29udGludWUKLQkJIGZpCi0JICAgICAgIGZpCi0JICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgotCSAgICAgICA7OwotCSAgICAqKSA7OwotCSAgZXNhYwotCWRvbmUKLQlpZiB0ZXN0IC1uICIkcmVtb3ZlbGlzdCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJHJlbW92ZWxpc3QiCi0JICAkcnVuICR7cm19ciAkcmVtb3ZlbGlzdAotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCi0Jb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQotCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KLQlvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KLSAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCi0JbGliX3NlYXJjaF9wYXRoPWAkZWNobyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJHtTRUR9IC1lICdzJSAkcGF0aCAlICVnJ2AKLQlkZXBsaWJzPWAkZWNobyAiJGRlcGxpYnMgIiB8ICR7U0VEfSAtZSAncyUgLUwkcGF0aCAlICVnJ2AKLQlkZXBlbmRlbmN5X2xpYnM9YCRlY2hvICIkZGVwZW5kZW5jeV9saWJzICIgfCAke1NFRH0gLWUgJ3MlIC1MJHBhdGggJSAlZydgCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKLSAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKLSAgICAgIGRsZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KLQljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKLSAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KLQljYXNlICIkZGxwcmVmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKLQkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKLQkgICAgOzsKLQkgICotKi1uZXRic2QqKQotCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0gCSAgKikKLQkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KLQkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyIgPSAieWVzIjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKLQkgICAgZmkKLQkgICAgOzsKLQkgIGVzYWMKLQlmaQotCi0JIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgotCW5hbWVfc2F2ZT0kbmFtZQotCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQotCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQotCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKLQltYWpvcl9zYXZlPSRtYWpvcgotCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCi0JIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCi0JIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/Ci0JcmVsZWFzZT0iIgotCXZlcnN1ZmZpeD0iIgotCW1ham9yPSIiCi0JbmV3ZGVwbGlicz0KLQlkcm9wcGVkZGVwcz1ubwotCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JcGFzc19hbGwpCi0JICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KLQkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKLQkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KLQkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAotCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3IuCi0JICBuZXdkZXBsaWJzPSRkZXBsaWJzCi0JICA7OwotCXRlc3RfY29tcGlsZSkKLQkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCi0JICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAotCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKLQkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgotCSAgJHJtIGNvbmZ0ZXN0LmMKLQkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLQkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQotRU9GCi0JICAkcm0gY29uZnRlc3QKLQkgICRMVENDIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKLQkgIGlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKLQkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLSAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAtbmUgIjAiOyB0aGVuCi0JCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJICAqIiAkaSAiKikKLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgaT0iIgotCQkgICAgOzsKLQkJICBlc2FjCi0JICAgICAgICBmaQotCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JCSAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQkgIGRlcGxpYl9tYXRjaD0kMgotCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgIGVsc2UKLQkJICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgJGVjaG8KLQkJICAgICRlY2hvICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgotCQkgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKLQkJICAgICRlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCi0JCSAgZmkKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCi0JICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgbmFtZT1gZXhwciAkaSA6ICctbFwoLipcKSdgCi0JICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0gICAgICAgICAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JCSRybSBjb25mdGVzdAotCQkkTFRDQyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpCi0JCSMgRGlkIGl0IHdvcms/Ci0JCWlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KLQkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSAgICAqIiAkaSAiKikKLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICAgIGk9IiIKLQkJICAgICAgOzsKLQkJICAgIGVzYWMKLQkJICBmaQotCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgICBkZXBsaWJfbWF0Y2g9JDIKLQkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBlbHNlCi0JCSAgICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgICAkZWNobwotCQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCi0JCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgotCQkgICAgICAkZWNobyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgotCQkgICAgZmkKLQkJICBmaQotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgJGVjaG8KLQkJICAkZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgotCQkgICRlY2hvICIqKiogIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgotCQkgICRlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgICRlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQkgIDs7Ci0JZmlsZV9tYWdpYyopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0gICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAgIiRuYW1lIiAhPSAiMCI7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkqIiAkYV9kZXBsaWIgIiopCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgIGFfZGVwbGliPSIiCi0JCSAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCi0JCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCBncmVwICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCi0JCQljb250aW51ZQotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCi0JCQljYXNlICRwb3RsaWJsaW5rIGluCi0JCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKLQkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKLQkJCWVzYWMKLQkJICAgICAgZG9uZQotCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgXAotCQkJIHwgJHtTRUR9IDEwcSBcCi0JCQkgfCAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkJYV9kZXBsaWI9IiIKLQkJCWJyZWFrIDIKLQkJICAgICAgZmkKLQkJICBkb25lCi0JCWRvbmUKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQkkZWNobwotCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCi0JCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCi0JCWVsc2UKLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKLQkJICAkZWNobyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0JbWF0Y2hfcGF0dGVybiopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICBhX2RlcGxpYj0iIgotCQkgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKLQkJICAgIGlmIGV2YWwgJGVjaG8gXCIkcG90ZW50X2xpYlwiIDI+L2Rldi9udWxsIFwKLQkJICAgICAgICB8ICR7U0VEfSAxMHEgXAotCQkgICAgICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgICAgICBhX2RlcGxpYj0iIgotCQkgICAgICBicmVhayAyCi0JCSAgICBmaQotCQkgIGRvbmUKLQkJZG9uZQotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCSRlY2hvCi0JCSRlY2hvICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkkZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKLQkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCi0JCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKLQkJZWxzZQotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgotCQkgICRlY2hvICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKLQkJZmkKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KLQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JICAgIGZpCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQlub25lIHwgdW5rbm93biB8ICopCi0JICBuZXdkZXBsaWJzPSIiCi0JICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAtZSAncy8gLVtMUl1bXiBdKi8vZydgCi0JICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCi0JICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJwotCSAgICAgIHRtcF9kZXBsaWJzPWAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJHtTRUR9IC1lICIxcyxeWCwsIiAtZSAicywkaSwsImAKLQkgICAgZG9uZQotCSAgZmkKLQkgIGlmICRlY2hvICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAncy9bIAldLy9nJyBcCi0JICAgIHwgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgJGVjaG8KLQkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICAkZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCi0JICAgIGRyb3BwZWRkZXBzPXllcwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKLQltYWpvcj0kbWFqb3Jfc2F2ZQotCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQotCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQotCW5hbWU9JG5hbWVfc2F2ZQotCi0JY2FzZSAkaG9zdCBpbgotCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICBuZXdkZXBsaWJzPWAkZWNobyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgICRlY2hvCi0JICAgICRlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKLQkgICAgJGVjaG8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgotCSAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgICRlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCi0JICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JICAgICAgJGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkgICAgICAkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICBlbHNlCi0JICAgICRlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgotCSAgICAkZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKLQkgICAgJGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQotCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKLQkgICAgICAkZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCi0JICAgICAgJGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKLQkgICAgICAkZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCWZpCi0JIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCi0JZGVwbGlicz0kbmV3ZGVwbGlicwotICAgICAgZmkKLQotICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgotICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgZGxuYW1lPQotCi0gICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0JICBoYXJkY29kZV9saWJkaXJzPQotCSAgZGVwX3JwYXRoPQotCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKLQkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgotCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCi0JICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCQllbHNlCi0JCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgICAgOzsKLQkJICAqKQotCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgICA7OwotCQkgIGVzYWMKLQkJZmkKLQkgICAgICBlbHNlCi0JCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgotCSAgICAgIGZpCi0JICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZG9uZQotCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgotCSAgICBlbHNlCi0JICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIGZpCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgICAgcnBhdGg9Ci0JICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICBkb25lCi0JICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgotCSAgZmkKLQkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCi0JZmkKLQotCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKLQl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKLQlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgotCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotCWZpCi0KLQkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KLQlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCXJlYWxuYW1lPSIkMiIKLQlzaGlmdDsgc2hpZnQKLQotCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQllbHNlCi0JICBzb25hbWU9IiRyZWFsbmFtZSIKLQlmaQotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICBkbG5hbWU9JHNvbmFtZQotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBVc2Ugc3RhbmRhcmQgb2JqZWN0cyBpZiB0aGV5IGFyZSBwaWMKLQl0ZXN0IC16ICIkcGljX2ZsYWciICYmIGxpYm9ianM9YCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQotCSMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgaWYgdGVzdCAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgPSB5ZXMgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICBjbWRzPSRleHBvcnRfc3ltYm9sc19jbWRzCi0JICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAgICAgaWYgbGVuPWBleHByICJYJGNtZCIgOiAiLioiYCAmJgotCSAgICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkgICAgICAgICRzaG93ICIkY21kIgotCSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgICAgICBza2lwcGVkX2V4cG9ydD1mYWxzZQotCSAgICAgIGVsc2UKLQkgICAgICAgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgotCSAgICAgICAgJHNob3cgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgotCSAgICAgICAgc2tpcHBlZF9leHBvcnQ9OgotCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQotCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KLQkJYnJlYWsKLQkgICAgICBmaQotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICAgJHNob3cgIiRFR1JFUCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgotCSAgICAgICRydW4gZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCi0JICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCi0JICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCi0JZmkKLQotCXRtcF9kZXBsaWJzPQotCWZvciB0ZXN0X2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkJY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCi0JCSoiICR0ZXN0X2RlcGxpYiAiKikgOzsKLQkJKikKLQkJCXRtcF9kZXBsaWJzPSIkdG1wX2RlcGxpYnMgJHRlc3RfZGVwbGliIgotCQkJOzsKLQkJZXNhYwotCWRvbmUKLQlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCi0KLQlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcwotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGVsc2UKLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCSAgZmkKLQlmaQotCQotCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgotCWZpCi0KLQkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVUgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/Ci0JZmkKLQotCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgotCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKLQkgIGVsc2UKLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgotCSAgICBjbWRzPSRtb2R1bGVfY21kcwotCSAgZmkKLQllbHNlCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCSAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcwotCWVsc2UKLQkgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCi0JICBjbWRzPSRhcmNoaXZlX2NtZHMKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKLQkgICBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCi0JICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICA6Ci0JZWxzZQotCSAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgcGllY2V3aXNlLgotCSAgJGVjaG8gImNyZWF0aW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLi4uIgotCi0JICAjIFNhdmUgdGhlIHZhbHVlIG9mICRvdXRwdXQgYW5kICRsaWJvYmpzIGJlY2F1c2Ugd2Ugd2FudCB0bwotCSAgIyB1c2UgdGhlbSBsYXRlci4gIElmIHdlIGhhdmUgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsIHdlCi0JICAjIHdhbnQgdG8gdXNlIHNhdmVfbGlib2JqcyBhcyBpdCB3YXMgYmVmb3JlCi0JICAjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIHdhcyBleHBhbmRlZCwgYmVjYXVzZSB3ZSBjYW4ndAotCSAgIyBhc3N1bWUgdGhlIGxpbmtlciB1bmRlcnN0YW5kcyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYy4KLQkgICMgVGhpcyBtYXkgaGF2ZSB0byBiZSByZXZpc2l0ZWQsIGluIGNhc2UgdG9vIG1hbnkKLQkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIGdldCBsaW5rZWQgaW4gYW5kIGVuZCB1cCBleGNlZWRpbmcKLQkgICMgdGhlIHNwZWMuCi0JICBpZiB0ZXN0IC16ICIkY29udmVuaWVuY2UiIHx8IHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCi0JICBmaQotCSAgc2F2ZV9vdXRwdXQ9JG91dHB1dAotCSAgb3V0cHV0X2xhPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCi0KLQkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCi0JICAjIGluaXRpYWxpemUgayB0byBvbmUuCi0JICB0ZXN0X2NtZHM9Ci0JICBjb25jYXRfY21kcz0KLQkgIG9iamxpc3Q9Ci0JICBkZWxmaWxlcz0KLQkgIGxhc3Rfcm9iaj0KLQkgIGs9MQotCSAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAjIExvb3Agb3ZlciB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxpbmtlZC4KLQkgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcwotCSAgZG8KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCi0JICAgIGlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8Ci0JICAgICAgIHsgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgotCQkgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iOyB9OyB0aGVuCi0JICAgICAgb2JqbGlzdD0iJG9iamxpc3QgJG9iaiIKLQkgICAgZWxzZQotCSAgICAgICMgVGhlIGNvbW1hbmQgJHRlc3RfY21kcyBpcyBhbG1vc3QgdG9vIGxvbmcsIGFkZCBhCi0JICAgICAgIyBjb21tYW5kIHRvIHRoZSBxdWV1ZS4KLQkgICAgICBpZiB0ZXN0ICIkayIgLWVxIDEgOyB0aGVuCi0JCSMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCi0JCWV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCi0JICAgICAgZWxzZQotCQkjIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzIHdpbGwgbGluayBpbgotCQkjIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgotCQlldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCi0JICAgICAgZmkKLQkgICAgICBsYXN0X3JvYmo9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKLQkgICAgICBrPWBleHByICRrICsgMWAKLQkgICAgICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKLQkgICAgICBvYmpsaXN0PSRvYmoKLQkgICAgICBsZW49MQotCSAgICBmaQotCSAgZG9uZQotCSAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0Ci0JICAjIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUuICBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdAotCSAgIyBmaWxlcyB3aWxsIGxpbmsgaW4gdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCi0JICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KLQkgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCi0KLQkgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGxpYm9ianM9JG91dHB1dAotCSAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgotCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kZXhwb3J0X3N5bWJvbHNfY21kc1wiCi0gICAgICAgICAgZmkKLQotCSAgIyBTZXQgdXAgYSBjb21tYW5kIHRvIHJlbW92ZSB0aGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMKLQkgICMgYWZ0ZXIgdGhleSBhcmUgdXNlZC4KLQkgIGk9MAotCSAgd2hpbGUgdGVzdCAiJGkiIC1sdCAiJGsiCi0JICBkbwotCSAgICBpPWBleHByICRpICsgMWAKLQkgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7aX0uJG9iamV4dCIKLQkgIGRvbmUKLQotCSAgJGVjaG8gImNyZWF0aW5nIGEgdGVtcG9yYXJ5IHJlbG9hZGFibGUgb2JqZWN0IGZpbGU6ICRvdXRwdXQiCi0KLQkgICMgTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYWJvdmUgYW5kIGV4ZWN1dGUgdGhlbS4KLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY29uY2F0X2NtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQotCSAgbGlib2Jqcz0kb3V0cHV0Ci0JICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KLQkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKLQotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgZmkKLQkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCi0JICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KLQotCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcwotCSAgICBlbHNlCi0JICAgICAgY21kcz0kbW9kdWxlX2NtZHMKLQkgICAgZmkKLQkgIGVsc2UKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQkgIGVsc2UKLQkgICAgY21kcz0kYXJjaGl2ZV9jbWRzCi0JICAgIGZpCi0JICBmaQotCi0JICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzCi0JICAjIHRvIHRoZSBqdXN0LXJlc2V0ICRjbWRzLgotCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkcm0gJGRlbGZpbGVzXCIKLQlmaQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgewotCSAgICBsdF9leGl0PSQ/Ci0KLQkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0Ci0JICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJwotCSAgICBmaQotCi0JICAgIGV4aXQgJGx0X2V4aXQKLQkgIH0KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJG12ICIkcmVhbG5hbWUiVSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/Ci0KLQkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGV4aXQgJEVYSVRfU1VDQ0VTUwotCWZpCi0KLQkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgotCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbwotCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgotCSAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSknIHx8IGV4aXQgJD8KLQkgIGZpCi0JZG9uZQotCi0JIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCi0JICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KLQkgIGRsbmFtZT0iJHNvbmFtZSIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBvYmopCi0gICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgY2FzZSAkb3V0cHV0IGluCi0gICAgICAqLmxvKQotCWlmIHRlc3QgLW4gIiRvYmpzJG9sZF9kZXBsaWJzIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCWxpYm9iaj0iJG91dHB1dCIKLQlvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCTs7Ci0gICAgICAqKQotCWxpYm9iaj0KLQlvYmo9IiRvdXRwdXQiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgotICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCi0KLSAgICAgICMgT2JqZWN0cyBmcm9tIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFRoaXMgYXNzdW1lcwotICAgICAgIyBzaW5nbGUtdmVyc2lvbiBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBXaGVuZXZlciB3ZSBjcmVhdGUKLSAgICAgICMgZGlmZmVyZW50IG9uZXMgZm9yIFBJQy9ub24tUElDLCB0aGlzIHdlJ2xsIGhhdmUgdG8gZHVwbGljYXRlCi0gICAgICAjIHRoZSBleHRyYWN0aW9uLgotICAgICAgcmVsb2FkX2NvbnZfb2Jqcz0KLSAgICAgIGdlbnRvcD0KLSAgICAgICMgcmVsb2FkX2NtZHMgcnVucyAkTEQgZGlyZWN0bHksIHNvIGxldCB1cyBnZXQgcmlkIG9mCi0gICAgICAjIC1XbCBmcm9tIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0gICAgICB3bD0KLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgcmVsb2FkX2NvbnZfb2Jqcz1cIlwkcmVsb2FkX29ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQllbHNlCi0JICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCi0JICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCi0JICByZWxvYWRfY29udl9vYmpzPSIkcmVsb2FkX29ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0Ci0KLSAgICAgIG91dHB1dD0iJG9iaiIKLSAgICAgIGNtZHM9JHJlbG9hZF9jbWRzCi0gICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JZXZhbCBjbWQ9XCIkY21kXCIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KLSAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICRnZW50b3AKLQlmaQotCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgJGdlbnRvcAotCWZpCi0KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JIyAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSMgJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KLQlleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCi0JIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KLQlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCi0Jb3V0cHV0PSIkbGlib2JqIgotCWNtZHM9JHJlbG9hZF9jbWRzCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JJHJ1biAke3JtfXIgJGdlbnRvcAotICAgICAgZmkKLQotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICA7OwotCi0gICAgcHJvZykKLSAgICAgIGNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKikgb3V0cHV0PWAkZWNobyAkb3V0cHV0IHwgJHtTRUR9IC1lICdzLC5leGUkLCw7cywkLC5leGUsJ2AgOzsKLSAgICAgIGVzYWMKLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHVua25vd24gJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gJiYKLQkgICB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd247IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgQUNfTElCVE9PTF9ETE9QRU4nIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yawotCWNvbXBpbGVfZGVwbGlicz1gJGVjaG8gIlggJGNvbXBpbGVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCi0JZmluYWxpemVfZGVwbGlicz1gJGVjaG8gIlggJGZpbmFsaXplX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICpkYXJ3aW4qKQotICAgICAgICAjIERvbid0IGFsbG93IGxhenkgbGlua2luZywgaXQgYnJlYWtzIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzCi0gICAgICAgIGlmIHRlc3QgIiR0YWduYW1lIiA9IENYWCA7IHRoZW4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgotICAgICAgICBmaQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGNvbXBpbGVfZGVwbGlicyIKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmaW5hbGl6ZV9kZXBsaWJzIgotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbwotCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiRsaWJkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgIGRsc3ltcz0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCSAgZGxzeW1zPSIke291dHB1dG5hbWV9Uy5jIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIgMT4mMgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgotCWNhc2UgJGRsc3ltcyBpbgotCSIiKSA7OwotCSouYykKLQkgICMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0JICBubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5ubSIKLQotCSAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiCi0KLQkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCi0JICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQotCSAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gPiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLS8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KLSNkZWZpbmUgbHRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgotCi0JICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KLQkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgICAgZG9uZQotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICckRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIKLQkgICAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICAkcnVuIGV2YWwgIiR7U0VEfSAtbiAtZSAnL146IEBQUk9HUkFNQCAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBlbHNlCi0JICAgICAgJHJ1biBldmFsICIke1NFRH0gLWUgJ3MvXChbIF1bLipeJF1cKS9cXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJwotCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCSAgZmkKLQotCSAgZm9yIGFyZyBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAgIG5hbWU9YCRlY2hvICIkYXJnIiB8ICR7U0VEfSAtZSAncyVeLiovJSUnYAotCSAgICAkcnVuIGV2YWwgJyRlY2hvICI6ICRuYW1lICIgPj4gIiRubGlzdCInCi0JICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgZG9uZQotCi0JICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCi0JICAgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICAkRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAotCSAgICAgICRtdiAiJG5saXN0IlQgIiRubGlzdCIKLQkgICAgZmkKLQotCSAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotCSAgICBpZiBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgfAotCQlpZiBzb3J0IC1rIDMgPC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJICBzb3J0IC1rIDMKLQkJZWxzZQotCQkgIHNvcnQgKzIKLQkJZmkgfAotCQl1bmlxID4gIiRubGlzdCJTOyB0aGVuCi0JICAgICAgOgotCSAgICBlbHNlCi0JICAgICAgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiID4gIiRubGlzdCJTCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCJTID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIicKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQkgICAgZmkKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLQotI3VuZGVmIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0ciB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHIgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotIgotCi0JICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLQkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjYW4ndCBiZSBjb25zdCwgYmVjYXVzZQotICAgcnVudGltZSByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24KLSAgIG9uIHBzZXVkby1yZWxvY3MgKi8KLXN0cnVjdCB7Ci0iCi0JICAgICAgOzsKLQkgICAgKiApCi0JICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLWNvbnN0IHN0cnVjdCB7Ci0iCi0JICAgICAgOzsKLQkgICAgZXNhYwotCi0KLQkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHIgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQote1wKLSIKLQotCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLSAgezAsIChsdF9wdHIpIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZlwKLSIKLQkgIGZpCi0KLQkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAotCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCi0JICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCi0JICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KLQkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCi0JICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKnwqLSotZnJlZWJzZGVsZjMuMCopCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURGUkVFQlNEX1dPUktBUk9VTkQiOzsKLQkgICAgZXNhYzs7Ci0JICAqLSotaHB1eCopCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciOzsKLQkgICAgZXNhYwotCSAgZXNhYwotCi0JICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgotCSAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlIFwiJGRsc3ltc1wiKSIKLQkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0JICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0JICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQotCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KLQkgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKLQkgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KLQkjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0JIyByZWFsbHkgd2FzIHJlcXVpcmVkLgotCi0JIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX3JlbGluayIgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0KLQkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KLQkkc2hvdyAiJGxpbmtfY29tbWFuZCIKLQkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiCi0Jc3RhdHVzPSQ/Ci0KLQkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotCWlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JZmkKLQotCWV4aXQgJHN0YXR1cwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCi0JcnBhdGg9Ci0JZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLQkgIGNhc2UgJGRpciBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotCSAgICAjIEFic29sdXRlIHBhdGguCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgICAgOzsKLQkgICopCi0JICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KLQkgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JdGVtcF9ycGF0aD0iJHJwYXRoIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgotICAgICAgZmkKLQotICAgICAgY29tcGlsZV92YXI9Ci0gICAgICBmaW5hbGl6ZV92YXI9Ci0gICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgotCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KLQkkcnVuICRybSAkb3V0cHV0Ci0JIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0Ci0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/Ci0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIiAxPiYyCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KLQkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKLQkgIGVsc2UKLQkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCi0JICAgIHJlbGlua19jb21tYW5kPQotCSAgZmkKLQllbHNlCi0JICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgIGxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCi0gICAgICAkcnVuICRybSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCi0KLSAgICAgICRzaG93ICIkbGlua19jb21tYW5kIgotICAgICAgJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/Ci0KLSAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLQlmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KLQkgIGlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCi0JICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCSAgZWxzZQotCSAgICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JICAgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCSAgZmkKLQlkb25lCi0JcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJHJlbGlua19jb21tYW5kKSIKLQlyZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0ICJYJGVjaG8iID0gIlgkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICRwcm9ncGF0aCBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcWVjaG89IiRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7Ci0JKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgb3V0cHV0PWAkZWNobyAkb3V0cHV0fCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKLQllc2FjCi0JIyB0ZXN0IGZvciBjeWd3aW4gYmVjYXVzZSBtdiBmYWlscyB3L28gLmV4ZSBleHRlbnNpb25zCi0JY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiopCi0JICAgIGV4ZWV4dD0uZXhlCi0JICAgIG91dHB1dG5hbWU9YCRlY2hvICRvdXRwdXRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKLQkgICopIGV4ZWV4dD0gOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLQkgICAgY3dyYXBwZXJzb3VyY2U9YCRlY2hvICR7b2JqZGlyfS9sdC0ke291dHB1dG5hbWV9LmNgCi0JICAgIGN3cmFwcGVyPWAkZWNobyAke291dHB1dH0uZXhlYAotCSAgICAkcm0gJGN3cmFwcGVyc291cmNlICRjd3JhcHBlcgotCSAgICB0cmFwICIkcm0gJGN3cmFwcGVyc291cmNlICRjd3JhcHBlcjsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotCSAgICBjYXQgPiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKLQotLyogJGN3cmFwcGVyc291cmNlIC0gdGVtcG9yYXJ5IHdyYXBwZXIgZXhlY3V0YWJsZSBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotICAgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotCi0gICBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSAgIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLQotICAgVGhpcyB3cmFwcGVyIGV4ZWN1dGFibGUgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotICAgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0gICBDdXJyZW50bHksIGl0IHNpbXBseSBleGVjcyB0aGUgd3JhcHBlciAqc2NyaXB0KiAiL2Jpbi9zaCAkb3V0cHV0IiwKLSAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKLSAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KLSovCi1FT0YKLQkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZTw8IkVPRiIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaWYgZGVmaW5lZChQQVRIX01BWCkKLSMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKLSNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKLSMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgotI2Vsc2UKLSMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUgotI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCi0gIGRlZmluZWQgKF9fT1MyX18pCi0jZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCi0jaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotI2RlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKLSMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCi0jZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KLSMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKLSAgICAgICAgKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCi0jZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCi0KLSNkZWZpbmUgWE1BTExPQyh0eXBlLCBudW0pICAgICAgKCh0eXBlICopIHhtYWxsb2MgKChudW0pICogc2l6ZW9mKHR5cGUpKSkKLSNkZWZpbmUgWEZSRUUoc3RhbGUpIGRvIHsgXAotICBpZiAoc3RhbGUpIHsgZnJlZSAoKHZvaWQgKikgc3RhbGUpOyBzdGFsZSA9IDA7IH0gXAotfSB3aGlsZSAoMCkKLQotY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lID0gTlVMTDsKLQotdm9pZCAqIHhtYWxsb2MgKHNpemVfdCBudW0pOwotY2hhciAqIHhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci1jaGFyICogYmFzZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpOwotY2hhciAqIGZucXVhbGlmeShjb25zdCBjaGFyICpwYXRoKTsKLWNoYXIgKiBzdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwotdm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBjaGFyICoqbmV3YXJnejsKLSAgaW50IGk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoKGNoYXIgKikgYmFzZW5hbWUgKGFyZ3ZbMF0pKTsKLSAgbmV3YXJneiA9IFhNQUxMT0MoY2hhciAqLCBhcmdjKzIpOwotRU9GCi0KLQkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgotICBuZXdhcmd6WzBdID0gIiRTSEVMTCI7Ci1FT0YKLQotCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKLSAgbmV3YXJnelsxXSA9IGZucXVhbGlmeShhcmd2WzBdKTsKLSAgLyogd2Uga25vdyB0aGUgc2NyaXB0IGhhcyB0aGUgc2FtZSBuYW1lLCB3aXRob3V0IHRoZSAuZXhlICovCi0gIC8qIHNvIG1ha2Ugc3VyZSBuZXdhcmd6WzFdIGRvZXNuJ3QgZW5kIGluIC5leGUgKi8KLSAgc3RyZW5kemFwKG5ld2FyZ3pbMV0sIi5leGUiKTsKLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICBuZXdhcmd6W2krMV0gPSB4c3RyZHVwKGFyZ3ZbaV0pOwotICBuZXdhcmd6W2FyZ2MrMV0gPSBOVUxMOwotRU9GCi0KLQkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgotICBleGVjdigiJFNIRUxMIixuZXdhcmd6KTsKLUVPRgotCi0JICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDwiRU9GIgotICByZXR1cm4gMTI3OwotfQotCi12b2lkICoKLXhtYWxsb2MgKHNpemVfdCBudW0pCi17Ci0gIHZvaWQgKiBwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOwotICBpZiAoIXApCi0gICAgbHRfZmF0YWwgKCJNZW1vcnkgZXhoYXVzdGVkIik7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLWNoYXIgKgoteHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQotewotICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwgc3RyaW5nKSA6IE5VTEwKLTsKLX0KLQotY2hhciAqCi1iYXNlbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqYmFzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCi0gIGlmIChpc2FscGhhIChuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKLSAgICBuYW1lICs9IDI7Ci0jZW5kaWYKLQotICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQotICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCi0gICAgICBiYXNlID0gbmFtZSArIDE7Ci0gIHJldHVybiAoY2hhciAqKSBiYXNlOwotfQotCi1jaGFyICoKLWZucXVhbGlmeShjb25zdCBjaGFyICpwYXRoKQotewotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqcDsKLSAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOwotCi0gIGFzc2VydChwYXRoICE9IE5VTEwpOwotCi0gIC8qIElzIGl0IHF1YWxpZmllZCBhbHJlYWR5PyAqLwotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICBpZiAoaXNhbHBoYSAocGF0aFswXSkgJiYgcGF0aFsxXSA9PSAnOicpCi0gICAgcmV0dXJuIHhzdHJkdXAgKHBhdGgpOwotI2VuZGlmCi0gIGlmIChJU19ESVJfU0VQQVJBVE9SIChwYXRoWzBdKSkKLSAgICByZXR1cm4geHN0cmR1cCAocGF0aCk7Ci0KLSAgLyogcHJlcGVuZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KLSAgLyogZG9lc24ndCBoYW5kbGUgJ34nICovCi0gIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKLSAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKLSAgc2l6ZSA9IHN0cmxlbih0bXApICsgMSArIHN0cmxlbihwYXRoKSArIDE7IC8qICsyIGZvciAnLycgYW5kICdcMCcgKi8KLSAgcCA9IFhNQUxMT0MoY2hhciwgc2l6ZSk7Ci0gIHNwcmludGYocCwgIiVzJWMlcyIsIHRtcCwgRElSX1NFUEFSQVRPUiwgcGF0aCk7Ci0gIHJldHVybiBwOwotfQotCi1jaGFyICoKLXN0cmVuZHphcChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKLXsKLSAgc2l6ZV90IGxlbiwgcGF0bGVuOwotCi0gIGFzc2VydChzdHIgIT0gTlVMTCk7Ci0gIGFzc2VydChwYXQgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuKHN0cik7Ci0gIHBhdGxlbiA9IHN0cmxlbihwYXQpOwotCi0gIGlmIChwYXRsZW4gPD0gbGVuKQotICB7Ci0gICAgc3RyICs9IGxlbiAtIHBhdGxlbjsKLSAgICBpZiAoc3RyY21wKHN0ciwgcGF0KSA9PSAwKQotICAgICAgKnN0ciA9ICdcMCc7Ci0gIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIHZvaWQKLWx0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqIG1vZGUsCi0gICAgICAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2UsIHZhX2xpc3QgYXApCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBtb2RlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXApOwotICBmcHJpbnRmIChzdGRlcnIsICIuXG4iKTsKLQotICBpZiAoZXhpdF9zdGF0dXMgPj0gMCkKLSAgICBleGl0IChleGl0X3N0YXR1cyk7Ci19Ci0KLXZvaWQKLWx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgbWVzc2FnZSk7Ci0gIGx0X2Vycm9yX2NvcmUgKEVYSVRfRkFJTFVSRSwgIkZBVEFMIiwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLUVPRgotCSAgIyB3ZSBzaG91bGQgcmVhbGx5IHVzZSBhIGJ1aWxkLXBsYXRmb3JtIHNwZWNpZmljIGNvbXBpbGVyCi0JICAjIGhlcmUsIGJ1dCBPVE9ILCB0aGUgd3JhcHBlcnMgKHNoZWxsIHNjcmlwdCBhbmQgdGhpcyBDIG9uZSkKLQkgICMgYXJlIG9ubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGV4ZWN1dGUgdGhlICJyZWFsIiBiaW5hcnkuCi0JICAjIFNpbmNlIHRoZSAicmVhbCIgYmluYXJ5IGlzIGJ1aWx0IGZvciAkaG9zdCwgdGhlbiB0aGlzCi0JICAjIHdyYXBwZXIgbWlnaHQgYXMgd2VsbCBiZSBidWlsdCBmb3IgJGhvc3QsIHRvby4KLQkgICRydW4gJExUQ0MgLXMgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQotCSAgOzsKLQllc2FjCi0JJHJtICRvdXRwdXQKLQl0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotCSRlY2hvID4gJG91dHB1dCAiXAotIyEgJFNIRUxMCi0KLSMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPScke1NFRH0gLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKLSAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJwotZWxzZQotICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCi0gIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICBlY2hvPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgotICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICAgICAgc2hpZnQKLSAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCi0gICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQotICAgICAgOgotICAgIGVsc2UKLSAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KLSAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQotICAgIGZpCi0gIGZpXAotIgotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0iCi0KLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0Ci0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0KLSAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCi0gICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKLSAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgotCi0gICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKLQotICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCi0gICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgotICAgIGVsc2UKLSAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICAgIGZpIgotCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQotICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KLSAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgotICAgICAgZWxzZQotCSRlY2hvIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKLQkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAotICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOwotICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9Ci0gICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gIGZpIgotCWVsc2UKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0iCi0JZmkKLQotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKLSAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0JZmkKLQotCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCi0JaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCi0JKi0qLW1pbmd3IHwgKi0qLW9zMiopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCWVzYWMKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXFxcYFwkcHJvZ2Rpci9cJHByb2dyYW0nIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgICRlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLWZpXAotIgotCWNobW9kICt4ICRvdXRwdXQKLSAgICAgIGZpCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCi0gICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgotCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JYWRkbGlicz0iJGNvbnZlbmllbmNlIgotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCi0JICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JZWxzZQotCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCi0JZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCi0Jb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCi0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIGNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLSAgICAgIGVsc2UKLQkjIFBPU0lYIGRlbWFuZHMgbm8gcGF0aHMgdG8gYmUgZW5jb2RlZCBpbiBhcmNoaXZlcy4gIFdlIGhhdmUKLQkjIHRvIGF2b2lkIGNyZWF0aW5nIGFyY2hpdmVzIHdpdGggZHVwbGljYXRlIGJhc2VuYW1lcyBpZiB3ZQotCSMgbWlnaHQgaGF2ZSB0byBleHRyYWN0IHRoZW0gYWZ0ZXJ3YXJkcywgZS5nLiwgd2hlbiBjcmVhdGluZyBhCi0JIyBzdGF0aWMgYXJjaGl2ZSBvdXQgb2YgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvciB3aGVuIGxpbmtpbmcKLQkjIHRoZSBlbnRpcmV0eSBvZiBhIGxpYnRvb2wgYXJjaGl2ZSBpbnRvIGFub3RoZXIgKGN1cnJlbnRseQotCSMgbm90IHN1cHBvcnRlZCBieSBsaWJ0b29sKS4KLQlpZiAoZm9yIG9iaiBpbiAkb2xkb2JqcwotCSAgICBkbwotCSAgICAgICRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnCi0JICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotCSAgOgotCWVsc2UKLQkgICRlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCi0KLQkgIGlmIHRlc3QgLXogIiRnZW50b3AiOyB0aGVuCi0JICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JICAgICRzaG93ICIkbWtkaXIgJGdlbnRvcCIKLQkgICAgJHJ1biAkbWtkaXIgIiRnZW50b3AiCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICIkc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRnZW50b3AiOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICBmaQotCi0JICBzYXZlX29sZG9ianM9JG9sZG9ianMKLQkgIG9sZG9ianM9Ci0JICBjb3VudGVyPTEKLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgb2JqYmFzZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCi0JICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7Ci0JICAgICpbXCAvXSIkb2JqYmFzZSAiKikKLQkgICAgICB3aGlsZSA6OyBkbwotCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbwotCQkjIG92ZXJsYXBzLgotCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQotCQljb3VudGVyPWBleHByICRjb3VudGVyICsgMWAKLQkJY2FzZSAiICRvbGRvYmpzICIgaW4KLQkJKltcIC9dIiRuZXdvYmogIiopIDs7Ci0JCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKLQkJZXNhYwotCSAgICAgIGRvbmUKLQkgICAgICAkc2hvdyAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgJHJ1biBsbiAiJG9iaiIgIiRnZW50b3AvJG5ld29iaiIgfHwKLQkgICAgICAkcnVuIGNwICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIG9sZG9ianM9IiRvbGRvYmpzICRnZW50b3AvJG5ld29iaiIKLQkgICAgICA7OwotCSAgICAqKSBvbGRvYmpzPSIkb2xkb2JqcyAkb2JqIiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKLQotCWlmIGxlbj1gZXhwciAiWCRjbWRzIiA6ICIuKiJgICYmCi0JICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKLQllbHNlCi0JICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cwotCSAgJGVjaG8gInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCi0JICBzYXZlX1JBTkxJQj0kUkFOTElCCi0JICBSQU5MSUI9OgotCSAgb2JqbGlzdD0KLQkgIGNvbmNhdF9jbWRzPQotCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCi0KLQkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PwotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBsYXN0X29sZG9iaj0kb2JqCi0JICBkb25lCi0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIG9sZG9ianM9IiRvYmpsaXN0ICRvYmoiCi0JICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgICBpZiBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCi0JICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKLQkgICAgICBvbGRvYmpzPSRvYmpsaXN0Ci0JICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KLQkgICAgICAgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKLQkgICAgICBmaQotCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCi0JICAgICAgb2JqbGlzdD0KLQkgICAgZmkKLQkgIGRvbmUKLQkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKLQkgIG9sZG9ianM9JG9iamxpc3QKLQkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCi0JICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgotCSAgZWxzZQotCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICBldmFsIGNtZD1cIiRjbWRcIgotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KLSAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgotICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCi0gICAgZmkKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgJG91dHB1dCBpbgotICAgICoubGEpCi0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgotICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCi0JaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KLQkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCi0JZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCi0JICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZWxzZQotCSAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCi0gICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCi0JcmVsaW5rX2NvbW1hbmQ9Ci0gICAgICBmaQotCi0KLSAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KLQkgICAgICBicmVhawotCSAgICBmaQotCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKLQkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcwotCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9Ci0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgICAqLmxhKQotCQluYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQlmaQotCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKLQkJOzsKLQkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdkbGZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCi0JICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgICAgZmkKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCi0JICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgICAgZmkKLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkbGliZGlyLyRuYW1lIgotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZmkKLQkgICRybSAkb3V0cHV0Ci0JICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KLQkgIHRkbG5hbWU9JGRsbmFtZQotCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCi0JICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OwotCSAgZXNhYwotCSAgJGVjaG8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKLSMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJHRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PwotaW5zdGFsbGVkPSRpbnN0YWxsZWQKLQotIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KLXNob3VsZG5vdGxpbms9JG1vZHVsZQotCi0jIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KLWRsb3Blbj0nJGRsZmlsZXMnCi1kbHByZW9wZW49JyRkbHByZWZpbGVzJwotCi0jIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46Ci1saWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKLQkgIGZpCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgotICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KLSAgICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIKLSAgICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSknIHx8IGV4aXQgJD8KLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQotICBpbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCi0KLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCi0gICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKLSAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICAkZWNobyAiWCRub25vcHQiIHwgZ3JlcCBzaHRvb2wgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0kbm9ub3B0Ci0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgJGFyZyBpbgotICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotICAgICAgYXJnPSJcIiRhcmdcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCi0KLSAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCi0gICAgZGVzdD0KLSAgICBmaWxlcz0KLSAgICBvcHRzPQotICAgIHByZXY9Ci0gICAgaW5zdGFsbF90eXBlPQotICAgIGlzZGlyPW5vCi0gICAgc3RyaXBtZT0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgotCWZpbGVzPSIkZmlsZXMgJGRlc3QiCi0JZGVzdD0kYXJnCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIAotICAgICAgCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KLQkqW1xcXCAvXWNwXCAqKSA7OwotCSopIHByZXY9JGFyZyA7OwotCWVzYWMKLQk7OwotICAgICAgLWcgfCAtbSB8IC1vKSBwcmV2PSRhcmcgOzsKLSAgICAgIC1zKQotCXN0cmlwbWU9IiAtcyIKLQljb250aW51ZQotCTs7Ci0gICAgICAtKikKLQk7OwotICAgICAgKikKLQkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCi0JaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlc3Q9JGFyZwotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgotICAgICAgZmkKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCi0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCi0gICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzCi0gICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0gICAgZmkKLSAgICBjYXNlICRkZXN0ZGlyIGluCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0JY2FzZSAkZmlsZSBpbgotCSoubG8pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBzdGF0aWNsaWJzPQotICAgIGZ1dHVyZV9saWJkaXJzPQotICAgIGN1cnJlbnRfbGliZGlycz0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0KLSAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLiRsaWJleHQpCi0JIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KLQlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQlyZWxpbmtfY29tbWFuZD0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICRmaWxlIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KLQlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgotCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZWxzZQotCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgotCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8KLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQotCWRpcj0iJGRpciRvYmpkaXIiCi0KLQlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgotCSAgaW5zdF9wcmVmaXhfZGlyPWAkZWNobyAiJGRlc3RkaXIiIHwgJFNFRCAicyUkbGliZGlyXCQlJSJgCi0KLQkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKLQkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKLQkgICMgYXJlIGluc3RhbGxlZCB0byB0aGUgc2FtZSBwcmVmaXguCi0JICAjIEF0IHByZXNlbnQsIHRoaXMgY2hlY2sgZG9lc24ndCBhZmZlY3Qgd2luZG93cyAuZGxsJ3MgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIGludG8gJGxpYmRpci8uLi9iaW4gKGN1cnJlbnRseSwgdGhhdCB3b3JrcyBmaW5lKQotCSAgIyBidXQgaXQncyBzb21ldGhpbmcgdG8ga2VlcCBhbiBleWUgb24uCi0JICBpZiB0ZXN0ICIkaW5zdF9wcmVmaXhfZGlyIiA9ICIkZGVzdGRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKLQkgIGVsc2UKLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKLQkgIGZpCi0KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyIgMT4mMgotCSAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICBlbHNlCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JZmkKLQotCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JaWYgdGVzdCAtbiAiJDIiOyB0aGVuCi0JICByZWFsbmFtZT0iJDIiCi0JICBzaGlmdAotCSAgc2hpZnQKLQotCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgotCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAotCi0JICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotCSAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KLQkgICAgJHNob3cgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiCi0JICAgICRydW4gZXZhbCAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotCSAgZmkKLQotCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCi0JICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0JICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KLQkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCi0JICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KLQkgICAgZm9yIGxpbmtuYW1lCi0JICAgIGRvCi0JICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgotICAgICAgICAgICAgICAgICRzaG93ICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKLSAgICAgICAgICAgICAgICAkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgY21kcz0kcG9zdGluc3RhbGxfY21kcwotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgewotCSAgICAgIGx0X2V4aXQ9JD8KLQotCSAgICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCSAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCQkkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKLQkgICAgICBmaQotCi0JICAgICAgZXhpdCAkbHRfZXhpdAotCSAgICB9Ci0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPwotCi0JIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgotCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KLQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCWNhc2UgJGRlc3RmaWxlIGluCi0JKi5sbykKLQkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICA7OwotCSouJG9iamV4dCkKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotCWZpCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0JOzsKLQotICAgICAgKikKLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0Ci0JIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bwotCSMgaW5zdGFsbAotCXN0cmlwcGVkX2V4dD0iIgotCWNhc2UgJGZpbGUgaW4KLQkgICouZXhlKQotCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgotCSAgICAgIGZpbGU9YCRlY2hvICRmaWxlfCR7U0VEfSAncywuZXhlJCwsJ2AKLQkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCi0JICAgIGZpCi0JICAgIDs7Ci0JZXNhYwotCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKnwqbWluZ3cqKQotCSAgICB3cmFwcGVyPWAkZWNobyAkZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKLQkgICAgOzsKLQkqKQotCSAgICB3cmFwcGVyPSRmaWxlCi0JICAgIDs7Ci0JZXNhYwotCWlmICgke1NFRH0gLWUgJzRxJyAkd3JhcHBlciB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIik+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIG5vdGluc3RfZGVwbGlicz0KLQkgIHJlbGlua19jb21tYW5kPQotCi0JICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KLQkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKLQkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZwotCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgotCSAgIwotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICR3cmFwcGVyIGluCi0JICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKLQkgICopIC4gLi8ke3dyYXBwZXJ9IDs7Ci0JICBlc2FjCi0KLQkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotCSAgaWYgdGVzdCAteiAiJG5vdGluc3RfZGVwbGlicyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQotCSAgZmluYWxpemU9eWVzCi0JICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCi0JICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLQkgICAgbGliZGlyPQotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgICAgIGNhc2UgJGxpYiBpbgotCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OwotCSAgICAgICopIC4gLi8kbGliIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIHJlbGlua19jb21tYW5kPQotCSAgIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCi0JICAjIGZvbyBldmVuIGlmIGJvdGggZm9vIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCi0JICAjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKLQkgICMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KLQkgICMKLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAkd3JhcHBlciBpbgotCSAgKi8qIHwgKlxcKikgLiAke3dyYXBwZXJ9IDs7Ci0JICAqKSAuIC4vJHt3cmFwcGVyfSA7OwotCSAgZXNhYwotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXMgJiYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgICB0bXBkaXI9Ii90bXAiCi0JICAgICAgdGVzdCAtbiAiJFRNUERJUiIgJiYgdG1wZGlyPSIkVE1QRElSIgotCSAgICAgIHRtcGRpcj0iJHRtcGRpci9saWJ0b29sLSQkIgotCSAgICAgIHNhdmVfdW1hc2s9YHVtYXNrYAotCSAgICAgIHVtYXNrIDAwNzcKLQkgICAgICBpZiAkbWtkaXIgIiR0bXBkaXIiOyB0aGVuCi0JICAgICAgICB1bWFzayAkc2F2ZV91bWFzawotCSAgICAgIGVsc2UKLQkgICAgICAgIHVtYXNrICRzYXZlX3VtYXNrCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkdG1wZGlyJyIgMT4mMgotCQljb250aW51ZQotCSAgICAgIGZpCi0JICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgotCSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQkgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAotCi0JICAgICAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgICAgICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgotCSAgICAgIGVsc2UKLQkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JCSR7cm19ciAiJHRtcGRpciIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyIgMT4mMgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCi0JICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotCSAgZmkKLQlmaQotCi0JIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCi0JIyBvbmUgYW55d2F5IAotCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgotCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKLQkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCi0JICAqLmV4ZToqLmV4ZSkKLQkgICAgIyB0aGlzIGlzIG9rCi0JICAgIDs7Ci0JICAqLmV4ZToqKQotCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCi0JICAgIDs7Ci0JICAqOiouZXhlKQotCSAgICBkZXN0ZmlsZT1gJGVjaG8gJGRlc3RmaWxlIHwgJHtTRUR9IC1lICdzLC5leGUkLCwnYAotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICR7cm19ciAiJHRtcGRpciIKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbwotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgotICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPwotCi0gICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KLQkkc2hvdyAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIgotCSRydW4gZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiB8fCBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBjbWRzPSRvbGRfcG9zdGluc3RhbGxfY21kcwotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCWV2YWwgY21kPVwiJGNtZFwiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJwotICAgIGVsc2UKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIGZpCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKLSAgZmluaXNoKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotICAgIGFkbWluY21kcz0KLQotICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCi0gICAgICBmb3IgZGlyCi0gICAgICBkbwotCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGNtZHM9JGZpbmlzaF9jbWRzCi0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBldmFsIGNtZD1cIiRjbWRcIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgdGVzdCAiJHNob3ciID0gOiAmJiBleGl0ICRFWElUX1NVQ0NFU1MKLQotICAgICRlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICRlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCi0gICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLSAgICAgICRlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICAkZWNobwotICAgICRlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKLSAgICAkZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCi0gICAgJGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCi0gICAgJGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgJGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgICRlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBsaWJkaXI9TElCRElSCi0gICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLSAgICAgICRlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgotICAgICAgJGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKLSAgICBmaQotICAgICRlY2hvCi0gICAgJGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgICRlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICAkZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICA7OwotCi0gICMgbGlidG9vbCBleGVjdXRlIG1vZGUKLSAgZXhlY3V0ZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgotCi0gICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KLSAgICBjbWQ9IiRub25vcHQiCi0gICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICBkaXI9Ci0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KLQlkbG5hbWU9Ci0JbGlicmFyeV9uYW1lcz0KLQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgJGZpbGUgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0KLQlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQk7OwotCi0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KLSAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKLQotICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KLSAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgotICAgICAgZWxzZQotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKLSAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCi0KLSAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCi0gICAgYXJncz0KLSAgICBmb3IgZmlsZQotICAgIGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAtKikgOzsKLSAgICAgICopCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJGZpbGUgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KLSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLQlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotCi0gICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0JTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQlldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotCSRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRjbWQkYXJncyIKLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgIGZpCi0gICAgOzsKLQotICAjIGxpYnRvb2wgY2xlYW4gYW5kIHVuaW5zdGFsbCBtb2RlCi0gIGNsZWFuIHwgdW5pbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6ICRtb2RlIgotICAgIHJtPSIkbm9ub3B0IgotICAgIGZpbGVzPQotICAgIHJtZm9yY2U9Ci0gICAgZXhpdF9zdGF0dXM9MAotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLWYpIHJtPSIkcm0gJGFyZyI7IHJtZm9yY2U9eWVzIDs7Ci0gICAgICAtKikgcm09IiRybSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgcm1kaXJzPQotCi0gICAgb3JpZ29iamRpcj0iJG9iamRpciIKLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiOyB0aGVuCi0JZGlyPS4KLQlvYmpkaXI9IiRvcmlnb2JqZGlyIgotICAgICAgZWxzZQotCW9iamRpcj0iJGRpci8kb3JpZ29iamRpciIKLSAgICAgIGZpCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGwgJiYgb2JqZGlyPSIkZGlyIgotCi0gICAgICAjIFJlbWVtYmVyIG9iamRpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICBpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbjsgdGhlbgotCWNhc2UgIiAkcm1kaXJzICIgaW4KLQkgICoiICRvYmpkaXIgIiopIDs7Ci0JICAqKSBybWRpcnM9IiRybWRpcnMgJG9iamRpciIgOzsKLQllc2FjCi0gICAgICBmaQotCi0gICAgICAjIERvbid0IGVycm9yIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgYW5kIHJtIC1mIHdhcyB1c2VkLgotICAgICAgaWYgKHRlc3QgLUwgIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCAodGVzdCAtaCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCToKLSAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCi0JZXhpdF9zdGF0dXM9MQotCWNvbnRpbnVlCi0gICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBybWZpbGVzPSIkZmlsZSIKLQotICAgICAgY2FzZSAkbmFtZSBpbgotICAgICAgKi5sYSkKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIC4gJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCi0JICBkb25lCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCSAgdGVzdCAiJG1vZGUiID0gY2xlYW4gJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgotCi0JICBpZiB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGw7IHRoZW4KLQkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgICAgY21kcz0kcG9zdHVuaW5zdGFsbF9jbWRzCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkJSUZTPSIkc2F2ZV9pZnMiCi0JCWV2YWwgY21kPVwiJGNtZFwiCi0JCSRzaG93ICIkY21kIgotCQkkcnVuIGV2YWwgIiRjbWQiCi0JCWlmIHRlc3QgIiQ/IiAtbmUgMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCi0JCSAgZXhpdF9zdGF0dXM9MQotCQlmaQotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICAgIGNtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIKLQkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KLQkJICBleGl0X3N0YXR1cz0xCi0JCWZpCi0JICAgICAgZG9uZQotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBmaQotCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0KLQkgICMgUmVhZCB0aGUgLmxvIGZpbGUKLQkgIC4gJGRpci8kbmFtZQotCi0JICAjIEFkZCBQSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KLQkgIGlmIHRlc3QgLW4gIiRwaWNfb2JqZWN0IiBcCi0JICAgICAmJiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRwaWNfb2JqZWN0IgotCSAgZmkKLQotCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgotCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiBcCi0JICAgICAmJiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbm9uX3BpY19vYmplY3QiCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbiA7IHRoZW4KLQkgIG5vZXhlbmFtZT0kbmFtZQotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi5leGUpCi0JICAgIGZpbGU9YCRlY2hvICRmaWxlfCR7U0VEfSAncywuZXhlJCwsJ2AKLQkgICAgbm9leGVuYW1lPWAkZWNobyAkbmFtZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCi0JICAgICMgJGZpbGUgd2l0aCAuZXhlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gcm1maWxlcywKLQkgICAgIyBhZGQgJGZpbGUgd2l0aG91dCAuZXhlCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRmaWxlIgotCSAgICA7OwotCSAgZXNhYwotCSAgIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgYSBsaWJ0b29sIHByb2dyYW0uCi0JICBpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgICAgLiAkZGlyLyRub2V4ZW5hbWUKLQotCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQotCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfVMuJHtvYmpleHR9IgotCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0kbmFtZSIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiWCRub2V4ZW5hbWUiICE9ICJYJG5hbWUiIDsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJHtub2V4ZW5hbWV9LmMiCi0JICAgIGZpCi0JICBmaQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICRzaG93ICIkcm0gJHJtZmlsZXMiCi0gICAgICAkcnVuICRybSAkcm1maWxlcyB8fCBleGl0X3N0YXR1cz0xCi0gICAgZG9uZQotICAgIG9iamRpcj0iJG9yaWdvYmpkaXIiCi0KLSAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKLSAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCi0gICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgotCSRzaG93ICJybWRpciAkZGlyIgotCSRydW4gcm1kaXIgJGRpciA+L2Rldi9udWxsIDI+JjEKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgZXhpdCAkZXhpdF9zdGF0dXMKLSAgICA7OwotCi0gICIiKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCi0gICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAteiAiJGV4ZWNfY21kIjsgdGhlbgotICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICBmaQotZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgotCi1pZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCi0gIGV2YWwgZXhlYyAkZXhlY19jbWQKLSAgZXhpdCAkRVhJVF9GQUlMVVJFCi1maQotCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgJG1vZGUgaW4KLSIiKSAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCi0KLVByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotCi0gICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKLSAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCi0tbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKLSAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCi0gICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXRhZz1UQUcgICAgICAgICB1c2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbSB0YWcgVEFHCi0gICAgLS12ZXJzaW9uICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotCi1NT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgIGNsZWFuICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICBjb21waWxlICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAotICAgICAgZXhlY3V0ZSAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCi0gICAgICBmaW5pc2ggICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAgICAgaW5zdGFsbCAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCi0gICAgICBsaW5rICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCi0gICAgICB1bmluc3RhbGwgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLQotTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCi1hIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KLQotUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKLSAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gIDs7Ci0KLWNsZWFuKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCi13aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gIDs7Ci0KLWNvbXBpbGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCi0KLUNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCi0gIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZGluZyBQSUMgb2JqZWN0cyBvbmx5Ci0gIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZGluZyBub24tUElDIG9iamVjdHMgb25seQotICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotCi1DT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQotZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KLQotVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCi1TT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKLWxpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKLSAgOzsKLQotZXhlY3V0ZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KLQotQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCi0KLVRoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKLWZsYWdzLgotCi1JZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCi1pbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKLWRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgotCi1UaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKLSAgOzsKLQotZmluaXNoKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCi0KLUNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCi0KLUVhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCi0KLVRoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQotdGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCi0gIDs7Ci0KLWluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgotCi1JbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KLQotSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCi1laXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICA7OwotCi1saW5rKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKLSAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKLSAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQotICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAotICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQotICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtb2JqZWN0bGlzdCBGSUxFICBVc2UgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyBmb3VuZCBpbiBGSUxFIHRvIHNwZWNpZnkgb2JqZWN0cwotICAtcHJlY2lvdXMtZmlsZXMtcmVnZXggUkVHRVgKLSAgICAgICAgICAgICAgICAgICAgZG9uJ3QgcmVtb3ZlIG91dHB1dCBmaWxlcyBtYXRjaGluZyBSRUdFWAotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0JCSAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKLW9ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKLXJlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAotdXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCi1pcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICA7OwotCi11bmluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCi1PdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gIDs7Ci0KLSopCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotICA7OwotZXNhYwotCi0kZWNobwotJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotZXhpdCAkPwotCi0jIFRoZSBUQUdzIGJlbG93IGFyZSBkZWZpbmVkIHN1Y2ggdGhhdCB3ZSBuZXZlciBnZXQgaW50byBhIHNpdHVhdGlvbgotIyBpbiB3aGljaCB3ZSBkaXNhYmxlIGJvdGgga2luZHMgb2YgbGlicmFyaWVzLiAgR2l2ZW4gY29uZmxpY3RpbmcKLSMgY2hvaWNlcywgd2UgZ28gZm9yIGEgc3RhdGljIGxpYnJhcnksIHRoYXQgaXMgdGhlIG1vc3QgcG9ydGFibGUsCi0jIHNpbmNlIHdlIGNhbid0IHRlbGwgd2hldGhlciBzaGFyZWQgbGlicmFyaWVzIHdlcmUgZGlzYWJsZWQgYmVjYXVzZQotIyB0aGUgdXNlciBhc2tlZCBmb3IgdGhhdCBvciBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQKLSMgdGhlbS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBvbiBBSVgsIGJlY2F1c2Ugd2UgZG9uJ3QKLSMgc3VwcG9ydCBoYXZpbmcgYm90aCBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZW5hYmxlZCBhdCB0aGUgc2FtZQotIyB0aW1lIG9uIHRoYXQgcGxhdGZvcm0sIHNvIHdlIGRlZmF1bHQgdG8gYSBzaGFyZWQtb25seSBjb25maWd1cmF0aW9uLgotIyBJZiBhIGRpc2FibGUtc2hhcmVkIHRhZyBpcyBnaXZlbiwgd2UnbGwgZmFsbGJhY2sgdG8gYSBzdGF0aWMtb25seQotIyBjb25maWd1cmF0aW9uLiAgQnV0IHdlJ2xsIG5ldmVyIGdvIGZyb20gc3RhdGljLW9ubHkgdG8gc2hhcmVkLW9ubHkuCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKLWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotYnVpbGRfb2xkX2xpYnM9eWVzCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi1idWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgJGVjaG8gbm87OyAqKSAkZWNobyB5ZXM7OyBlc2FjYAotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvbWlzc2luZyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3ZWY4M2EuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvbWlzc2luZworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDMtMDktMDIuMjMKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMgCi0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gIGV4aXQgMQotZmkKLQotcnVuPToKLQotIyBJbiB0aGUgY2FzZXMgd2hlcmUgdGhpcyBtYXR0ZXJzLCBgbWlzc2luZycgaXMgYmVpbmcgcnVuIGluIHRoZQotIyBzcmNkaXIgYWxyZWFkeS4KLWlmIHRlc3QgLWYgY29uZmlndXJlLmFjOyB0aGVuCi0gIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuYWMKLWVsc2UKLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5pbgotZmkKLQotbXNnPSJtaXNzaW5nIG9uIHlvdXIgc3lzdGVtIgotCi1jYXNlICIkMSIgaW4KLS0tcnVuKQotICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCi0gIHJ1bj0KLSAgc2hpZnQKLSAgIiRAIiAmJiBleGl0IDAKLSAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucwotICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCi0gICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKLSAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgotICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KLSAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCi0gICAgcnVuPToKLSAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCi0jIHRyeSB0byBlbXVsYXRlIGl0LgotY2FzZSAiJDEiIGluCi0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCi0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB0YXIgICAgICAgICAgdHJ5IHRhciwgZ251dGFyLCBndGFyLCB0aGVuIHRhciB3aXRob3V0IG5vbi1wb3J0YWJsZSBmbGFncwotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0KLVNlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCi0gICAgOzsKLQotICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCi0gICAgZWNobyAibWlzc2luZyAkc2NyaXB0dmVyc2lvbiAoR05VIEF1dG9tYWtlKSIKLSAgICA7OwotCi0gIC0qKQotICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgotICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gIGFjbG9jYWwqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLSAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8Ci0JCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OwotICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICB0b3VjaCAkdG91Y2hfZmlsZXMKLSAgICA7OwotCi0gIGF1dG9tYWtlKikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgTWFrZWZpbGUuYW0nLCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLgotICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuCi0gICAgICAgICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmluZCAuIC10eXBlIGYgLW5hbWUgTWFrZWZpbGUuYW0gLXByaW50IHwKLQkgICBzZWQgJ3MvXC5hbSQvLmluLycgfAotCSAgIHdoaWxlIHJlYWQgZjsgZG8gdG91Y2ggIiRmIjsgZG9uZQotICAgIDs7Ci0KLSAgYXV0b200dGUpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgotICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotLW91dHB1dFsgPV0qXChbXiBdKlwpLiovXDEvcCdgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vWyBdKlwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIiMhIC9iaW4vc2giCi0JZWNobyAiIyBDcmVhdGVkIGJ5IEdOVSBBdXRvbWFrZSBtaXNzaW5nIGFzIGEgcmVwbGFjZW1lbnQgb2YiCi0JZWNobyAiIyAgJCAkQCIKLQllY2hvICJleGl0IDAiCi0JY2htb2QgK3ggJGZpbGUKLQlleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgYmlzb258eWFjYykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKLQkgICAgZmkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmgKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmggXTsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbGV4fGZsZXgpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLmwpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgbGV4Lnl5LmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKLSAgICBmaQotICAgIDs7Ci0KLSAgaGVscDJtYW4pCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLQkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQotCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKLQkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLQlmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotLW91dHB1dD1cKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBmaQotICAgIGlmIFsgLWYgIiRmaWxlIiBdOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKLQlleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgbWFrZWluZm8pCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBtYWtlaW5mbywgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCi0gICAgICAgICBpbmRpcmVjdGx5IGFmZmVjdGluZyB0aGUgYXNwZWN0IG9mIHRoZSBtYW51YWwuICBUaGUgc3B1cmlvdXMKLSAgICAgICAgIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YgdXNpbmcgYSBidWdneSBcYG1ha2UnIChBSVgsCi0gICAgICAgICBEVSwgSVJJWCkuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYFRleGluZm8nIHBhY2thZ2Ugb3IKLSAgICAgICAgIHRoZSBcYEdOVSBtYWtlJyBwYWNrYWdlLiAgR3JhYiBlaXRoZXIgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgJ3MvLiogXChbXiBdKlwpICokL1wxLydgCi0gICAgICBmaWxlPWBzZWQgLW4gJy9eQHNldGZpbGVuYW1lLyB7IHMvLiogXChbXiBdKlwpICokL1wxLzsgcDsgcTsgfScgJGZpbGVgCi0gICAgZmkKLSAgICB0b3VjaCAkZmlsZQotICAgIDs7Ci0KLSAgdGFyKQotICAgIHNoaWZ0Ci0gICAgaWYgdGVzdCAtbiAiJHJ1biI7IHRoZW4KLSAgICAgIGVjaG8gMT4mMiAiRVJST1I6IFxgdGFyJyByZXF1aXJlcyAtLXJ1biIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KLSAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKLSAgICAjIG1lc3NhZ2VzLgotICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBmaXJzdGFyZz0iJDEiCi0gICAgaWYgc2hpZnQ7IHRoZW4KLQljYXNlICIkZmlyc3RhcmciIGluCi0JKm8qKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL28vL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotCWNhc2UgIiRmaXJzdGFyZyIgaW4KLQkqaCopCi0JICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvaC8vYAotCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKLQkgICAgOzsKLQllc2FjCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogSSBjYW4ndCBzZWVtIHRvIGJlIGFibGUgdG8gcnVuIFxgdGFyJyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0gICAgICAgICBZb3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBHTlUgdGFyIG9yIEZyZWUgcGF4dXRpbHMsIG9yIGNoZWNrIHRoZQotICAgICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4iCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgaXMgJG1zZy4KLSAgICAgICAgIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4gIENoZWNrIHRoZSBcYFJFQURNRScgZmlsZSwKLSAgICAgICAgIGl0IG9mdGVuIHRlbGxzIHlvdSBhYm91dCB0aGUgbmVlZGVkIHByZXJlcXVpc2l0ZXMgZm9yIGluc3RhbGxpbmcKLSAgICAgICAgIHRoaXMgcGFja2FnZS4gIFlvdSBtYXkgYWxzbyBwZWVrIGF0IGFueSBHTlUgYXJjaGl2ZSBzaXRlLCBpbiBjYXNlCi0gICAgICAgICBzb21lIG90aGVyIHBhY2thZ2Ugd291bGQgY29udGFpbiB0aGlzIG1pc3NpbmcgXGAkMScgcHJvZ3JhbS4iCi0gICAgZXhpdCAxCi0gICAgOzsKLWVzYWMKLQotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0Mjk4Zi4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgVXRpbGl0eSBMaWJyYXJ5Ci1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2FyZ3MuYyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9hcmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTE4MmIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2FyZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlCTxzdGRpby5oPgotI2luY2x1ZGUJPHN0ZGFyZy5oPgotI2luY2x1ZGUJPHN0ZGxpYi5oPgotI2luY2x1ZGUJPHN0cmluZy5oPgotI2luY2x1ZGUJPGN0eXBlLmg+Ci0KLSNpbmNsdWRlCSJhcmdzLmgiCi0KLSNkZWZpbmUgQ0hVTktfU0laRQkJCQk4Ci0jZGVmaW5lIExFTkdUSF9UT19DSFVOS1MobGVuKQkobGVuIC8gQ0hVTktfU0laRSArIDEpCi0jZGVmaW5lIEZSRUVfU1BBQ0UobGVuKQkJCShDSFVOS19TSVpFIC0gKGxlbiAtIDEpICUgQ0hVTktfU0laRSAtIDEpCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIGFyZyBhcnJheQotICovCi1jaGFyICoqCi1TdHJUb0FyZ3MoY2hhciAqcykKLXsKLQlpbnQJCXNxdW90ZSA9IDA7Ci0JaW50CQlkcXVvdGUgPSAwOwotCWludAkJYnNxdW90ZSA9IDA7Ci0JaW50CQlhcmdjID0gMDsKLQlpbnQJCW1heGFyZ2MgPSAwOwotCWNoYXIgKglhcmc7Ci0JY2hhciAqCWNvcHlidWY7Ci0JY2hhciAqKglhcmd2ID0gTlVMTDsKLQljaGFyICoqCW5hcmd2OwotCi0JaWYgKCBzID09IE5VTEwgKQotCQlyZXR1cm4gYXJndjsKLQotCWNvcHlidWYgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKLQotCWRvCi0JewotCQl3aGlsZSAoaXNzcGFjZSAoKGludCkqcykpCi0JCQlzKys7Ci0KLQkJaWYgKCAobWF4YXJnYyA9PSAwKSB8fCAoYXJnYyA+PSAobWF4YXJnYyAtIDEpKSApCi0JCXsKLQkJCWlmICggYXJndiA9PSBOVUxMICkKLQkJCXsKLQkJCQltYXhhcmdjID0gQ0hVTktfU0laRTsKLQkJCQluYXJndiA9IChjaGFyICoqKW1hbGxvYyhtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQltYXhhcmdjICs9IENIVU5LX1NJWkU7Ci0JCQkJbmFyZ3YgPSAoY2hhciAqKilyZWFsbG9jKGFyZ3YsIG1heGFyZ2MgKiBzaXplb2YgKGNoYXIgKikpOwotCQkJfQotCi0JCQlhcmd2ID0gbmFyZ3Y7Ci0JCQlhcmd2W2FyZ2NdID0gTlVMTDsKLQkJfQotCi0JCWFyZyA9IGNvcHlidWY7Ci0KLQkJd2hpbGUgKCAqcyAhPSAnXDAnICkKLQkJewotCQkJaWYgKCBpc3NwYWNlKChpbnQpKnMpICYmICFzcXVvdGUgJiYgIWRxdW90ZSAmJiAhYnNxdW90ZSApCi0JCQkJYnJlYWs7Ci0KLQkJCXN3aXRjaCAoKnMpIHsKLQkJCWNhc2UgJ1xcJzoKLQkJCQlpZiAoYnNxdW90ZSkgewotCQkJCQkqYXJnKysgPSAqczsKLQkJCQkJYnNxdW90ZSA9IDA7Ci0JCQkJfSBlbHNlCi0JCQkJCWJzcXVvdGUgPSAxOwotCQkJCWJyZWFrOwotCQkJCi0JCQkKLQkJCWNhc2UgJ1wnJzoKLQkJCQlpZiAoc3F1b3RlKQotCQkJCQlzcXVvdGUgPSAwOwotCQkJCWVsc2UKLQkJCQkJc3F1b3RlID0gMTsKLQkJCQlicmVhazsKLQkJCQotCQkJY2FzZSAnIic6Ci0JCQkJaWYgKGRxdW90ZSkKLQkJCQkJZHF1b3RlID0gMDsKLQkJCQllbHNlCi0JCQkJCWRxdW90ZSA9IDE7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGJzcXVvdGUpCi0JCQkJewotCQkJCQlic3F1b3RlID0gMDsKLQkJCQkJCi0JCQkJCXN3aXRjaCAoKnMpIHsKLQkJCQkJY2FzZSAnbic6Ci0JCQkJCQkqYXJnKysgPSAnXG4nOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ3QnOgotCQkJCQkJKmFyZysrID0gJ1x0JzsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJKmFyZysrID0gKnM7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCSphcmcrKyA9ICpzOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzKys7Ci0JCX0KLQotCQkqYXJnID0gJ1wwJzsKLQotCQlpZiAoIChhcmd2W2FyZ2NdID0gc3RyZHVwKGNvcHlidWYpKSA9PSBOVUxMICkKLQkJewotCQkJZnJlZShjb3B5YnVmKTsKLQkJCUZyZWVBcmdzKGFyZ3YpOwotCQkJYXJndiA9IE5VTEw7Ci0JCQlyZXR1cm4gYXJndjsKLQkJfQotCi0JCWFyZ2MrKzsKLQkJYXJndlthcmdjXSA9IE5VTEw7Ci0KLQkJd2hpbGUgKCBpc3NwYWNlICgoaW50KSpzKSApCi0JCQlzKys7Ci0KLQl9Ci0Jd2hpbGUgKCAqcyAhPSAnXDAnICk7Ci0KLQlmcmVlKGNvcHlidWYpOwotCi0JcmV0dXJuIGFyZ3Y7Ci19Ci0KLS8qCi0gKiBGcmVlIGFuIGFyZyBhcnJheQotICovCi12b2lkCi1GcmVlQXJncyhjaGFyICoqYXJncykKLXsKLQljaGFyICoqCWFwOwotCi0JaWYgKCBhcmdzID09IChjaGFyICoqKU5VTEwgKQotCQlyZXR1cm47Ci0KLQlmb3IgKCBhcCA9IGFyZ3MgOyAqYXAgIT0gTlVMTCA7IGFwKysgKQotCQlmcmVlKCphcCk7Ci0KLQlmcmVlKGFyZ3MpOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IGFyZyBhcnJheS4gSWYgYTAgaXMgTlVMTCwgY3JlYXRlIGFuIGVtcHR5IGFycmF5LgotICovCi1jaGFyICoqCi1OZXdBcmdzKGNoYXIgKmEwLCAuLi4pCi17Ci0JaW50CQluID0gMTsKLQljaGFyICoqCWFwOwotCWNoYXIgKioJYXBwOwotCXZhX2xpc3QgYXJnczsKLQotCWlmICggYTAgPT0gTlVMTCApCi0JewotCQlhcCA9IChjaGFyICoqKW1hbGxvYyhDSFVOS19TSVpFICogc2l6ZW9mKGNoYXIgKikpOwotCQkqYXAgPSBOVUxMOwotCQlyZXR1cm4gYXA7Ci0JfQotCi0JLyoKLQkgKiBDYWxjbHVsYXRlIG51bWJlciBvZiBhcmd1bWVudHMgKG4gc3RhcnRzIGF0IDEgdG8gYWxsb3cgZm9yIGEwKQotCSAqLwotCXZhX3N0YXJ0KGFyZ3MsIGEwKTsKLQotCXdoaWxlICggdmFfYXJnKGFyZ3MsIGNoYXIgKikgIT0gTlVMTCApCi0JCW4rKzsKLQotCXZhX2VuZChhcmdzKTsKLQkKLQkvKgotCSAqIFJvdW5kIHVwIHRvIG11bHRpcGxlIG9mIENIVU5LX1NJWkUuIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IHRoZQotCSAqIE5VTEwgZW50cnkgYWxzby4KLQkgKi8KLQlhcHAgPSBhcCA9IChjaGFyICoqKW1hbGxvYyhMRU5HVEhfVE9fQ0hVTktTKG4gKyAyKSAqIENIVU5LX1NJWkUgKiBzaXplb2YoY2hhciAqKSk7Ci0JKmFwcCsrID0gc3RyZHVwKGEwKTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGEwKTsKLQotCXdoaWxlICggLS1uID4gMCApCi0JCSphcHArKyA9IHN0cmR1cCh2YV9hcmcoYXJncywgY2hhciAqKSk7Ci0KLQl2YV9lbmQoYXJncyk7Ci0KLQkqYXBwID0gTlVMTDsKLQotCXJldHVybiBhcDsKLX0KLQotLyoKLSAqIEFwcGVuZCBhcmcgYXJyYXkgZXAgdG8gYXJnIGFycmF5IGFwLiBSZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5LgotICovCi1jaGFyICoqCi1BcHBlbmRBcmd2KGNoYXIgKiphcCwgY2hhciAqKmVwKQotewotCWludAkJbmEgPSAwOwotCWludCAJbmUgPSAwOwotCWNoYXIgKioJYXBwOwotCWNoYXIgKiogbnBwOwotCi0JZm9yICggYXBwID0gYXAgOyAqYXBwICE9IE5VTEwgOyBhcHArKyApCi0JCW5hKys7Ci0KLQlmb3IgKCBhcHAgPSBlcCA7ICphcHAgIT0gTlVMTCA7IGFwcCsrICkKLQkJbmUrKzsKLQkKLQlucHAgPSAoY2hhciAqKiltYWxsb2MoTEVOR1RIX1RPX0NIVU5LUyhuYSArIG5lICsgMSkgKiBDSFVOS19TSVpFICogc2l6ZW9mKGNoYXIgKikpOwotCi0JZm9yICggYXBwID0gbnBwIDsgKmFwICE9IE5VTEwgOyBhcCsrICkKLQkJKmFwcCsrID0gc3RyZHVwKCphcCk7Ci0KLQlmb3IgKCBhcHAgPSBucHAgKyBuYSA7ICplcCAhPSBOVUxMIDsgZXArKyApCi0JCSphcHArKyA9IHN0cmR1cCgqZXApOwotCi0JKmFwcCA9IE5VTEw7Ci0KLQlyZXR1cm4gbnBwOwotfQotCi0vKgotICogQXBwZW5kIGFyZ3VtZW50cyB0byBhbiBhcmcgYXJyYXkuIFJldHVybnMgYSBuZXdseSBhbGxvY3RlZCBhcnJheS4KLSAqLwotY2hhciAqKgotQXBwZW5kQXJncyhjaGFyICoqYXAsIC4uLikKLXsKLQlpbnQJCW5hID0gMDsKLQlpbnQgCW5lID0gMDsKLQljaGFyICoJYTsKLQljaGFyICoqCWFwcDsKLQljaGFyICoqIG5wcDsKLQl2YV9saXN0IGFyZ3M7Ci0KLQlmb3IgKCBhcHAgPSBhcCA7ICphcHAgIT0gTlVMTCA7IGFwcCsrICkKLQkJbmErKzsKLQotCXZhX3N0YXJ0KGFyZ3MsIGFwKTsKLQotCXdoaWxlICggdmFfYXJnKGFyZ3MsIGNoYXIgKikgIT0gTlVMTCApCi0JCW5lKys7Ci0KLQl2YV9lbmQoYXJncyk7Ci0JCi0JbnBwID0gKGNoYXIgKiopbWFsbG9jKExFTkdUSF9UT19DSFVOS1MobmEgKyBuZSArIDEpICogQ0hVTktfU0laRSAqIHNpemVvZihjaGFyICopKTsKLQotCWZvciAoIGFwcCA9IG5wcCA7ICphcCAhPSBOVUxMIDsgYXArKyApCi0JCSphcHArKyA9IHN0cmR1cCgqYXApOwotCi0JdmFfc3RhcnQoYXJncywgYXApOwotCi0JZm9yICggYXBwID0gbnBwICsgbmE7IChhID0gdmFfYXJnKGFyZ3MsIGNoYXIgKikpICE9IE5VTEwgOyApCi0JCSphcHArKyA9IHN0cmR1cChhKTsKLQotCXZhX2VuZChhcmdzKTsKLQotCSphcHAgPSBOVUxMOwotCi0JcmV0dXJuIG5wcDsKLX0KLQotLyoKLSAqIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgYXJyYXkuIFdpbGwgZXhwYW5kIHRoZSBzaXplIG9mCi0gKiB0aGUgYXJyYXkgaWYgbmVjZXNzYXJ5LiBSZXR1cm5zIHRoZSBhcnJheSB3aXRoIHRoZSBzdHJpbmcKLSAqIGFwcGVuZGVkLgotICovCi1jaGFyICoqCi1BcHBlbmRTdHIoY2hhciAqKmFwLCBjaGFyICpzdHIpCi17Ci0JaW50CQluOwotCWludAkJbmEgPSAwOwotCWNoYXIgKioJYXBwOwotCQotCWZvciAoIGFwcCA9IGFwIDsgKmFwcCAhPSBOVUxMIDsgYXBwKysgKQotCQluYSsrOwotCi0JbiA9IEZSRUVfU1BBQ0UobmEpOwotCQotCWlmIChuIDwgMikgewotCQlhcCA9IChjaGFyICoqKXJlYWxsb2MoYXAsIExFTkdUSF9UT19DSFVOS1MobmEgKyAyKSAqIENIVU5LX1NJWkUgKiBzaXplb2YoY2hhciAqKSk7Ci0JfQotCQotCSooYXAgKyBuYSkgPSBzdHJkdXAoc3RyKTsKLQkqKGFwICsgbmEgKyAxKSA9IE5VTEw7Ci0JCi0JcmV0dXJuIGFwOwotfQotCi0vKgotKiogQ29weSBhcmd1bWVudHMgaW50byBhIHN0cmluZyBidWZmZXIuCi0qLwotdm9pZAotQXJnc1RvQnVmKGNoYXIgKmFyZ3ZbXSwgaW50IGFyZ2MsIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQJaTsKLQlpbnQJbDsKLQotCSpidWYgPSAnXDAnOwotCi0JZm9yICggaSA9IDAgOyBpIDwgYXJnYyA7IGkrKyApCi0JewotCQlsID0gc3RybGVuKGFyZ3ZbaV0pOwotCi0JCWlmICggbCA+IGxlbiAtIDEgKQotCQkJcmV0dXJuOwotCi0JCXN0cmNweShidWYsIGFyZ3ZbaV0pOwotCQlidWYgKz0gbDsKLQkJbGVuIC09IGw7Ci0KLQkJaWYgKCBpIDwgYXJnYyAtIDEgKQotCQl7Ci0JCQlpZiAoIGxlbiA8IDIgKQotCQkJCXJldHVybjsKLQotCQkJc3RyY3B5KGJ1ZiwgIiAiKTsKLQkJCWJ1ZisrOwotCQkJbGVuLS07Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFyZ3VtZW50cyB0byBhIHN0cmluZwotICovCi1jaGFyICoKLUFyZ3NUb1N0cihjaGFyICoqYXApIAotewotCWludCAJbiA9IDA7Ci0JY2hhciAqKglhcHA7Ci0JY2hhciAqCXJlczsKLQljaGFyICoJcnA7Ci0JCi0JZm9yICggYXBwID0gYXAgOyAqYXBwICE9IE5VTEwgOyBhcHArKyApIHsKLQkJbiArPSBzdHJsZW4oKmFwcCkgKyAxOwotCX0KLQotCXJwID0gcmVzID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBuICsgMSk7Ci0JCi0JZm9yICggYXBwID0gYXAgOyAqYXBwICE9IE5VTEwgOyBhcHArKyApIHsKLQkJaWYgKGFwcCAhPSBhcCkgewotCQkJKnJwKysgPSAnICc7Ci0JCX0KLQkJbiA9IHN0cmxlbigqYXBwKTsKLQkJbWVtY3B5KHJwLCAqYXBwLCBuKTsKLQkJcnAgKz0gbjsKLQl9Ci0JKnJwID0gJ1wwJzsKLQkKLQlyZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2FyZ3NfdGVzdC5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2FyZ3NfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTU1MzMwLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9hcmdzX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiYXJncy5oIgotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQljaGFyICoqCWExOwotCWNoYXIgKioJYTI7Ci0JY2hhciAqKglhMzsKLQljaGFyICoqCWE0OwotCWNoYXIgKioJYTU7Ci0JY2hhciAqKglyMTsKLQljaGFyICoqCXIyOwotCWNoYXIgKioJcjM7Ci0JY2hhciAqKglyNDsKLQljaGFyICoqCXI1OwotCWNoYXIgKioJcjY7Ci0JCi0JYTEgPSBOZXdBcmdzKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgTlVMTCk7Ci0JcHJpbnRmKCJhMSA9ICVzXG4iLCBBcmdzVG9TdHIoYTEpKTsKLQlhMiA9IE5ld0FyZ3MoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsIE5VTEwpOwotCXByaW50ZigiYTIgPSAlc1xuIiwgQXJnc1RvU3RyKGEyKSk7Ci0JYTMgPSBTdHJUb0FyZ3MoImEgYiBjIGQgZSIpOwotCXByaW50ZigiYTMgPSAlc1xuIiwgQXJnc1RvU3RyKGEzKSk7Ci0JYTQgPSBTdHJUb0FyZ3MoImEgYiBjIGQgZSBmIGciKTsKLQlwcmludGYoImE0ID0gJXNcbiIsIEFyZ3NUb1N0cihhNCkpOwotCWE1ID0gU3RyVG9BcmdzKCJhIGIgYyBkIGUgZiBnIGgiKTsKLQlwcmludGYoImE1ID0gJXNcbiIsIEFyZ3NUb1N0cihhNSkpOwotCQotCXIxID0gQXBwZW5kQXJndihhMSwgYTMpOwotCXByaW50ZigicjEgPSAlc1xuIiwgQXJnc1RvU3RyKHIxKSk7Ci0JcjIgPSBBcHBlbmRBcmd2KGEyLCBhMyk7Ci0JcHJpbnRmKCJyMiA9ICVzXG4iLCBBcmdzVG9TdHIocjIpKTsKLQlyMyA9IEFwcGVuZEFyZ3YoYTEsIGE0KTsKLQlwcmludGYoInIzID0gJXNcbiIsIEFyZ3NUb1N0cihyMykpOwotCXI0ID0gQXBwZW5kQXJndihhMiwgYTQpOwotCXByaW50ZigicjQgPSAlc1xuIiwgQXJnc1RvU3RyKHI0KSk7Ci0JcjUgPSBBcHBlbmRBcmd2KGExLCBhNSk7Ci0JcHJpbnRmKCJyNSA9ICVzXG4iLCBBcmdzVG9TdHIocjUpKTsKLQlyNiA9IEFwcGVuZEFyZ3YoYTIsIGE1KTsKLQlwcmludGYoInI2ID0gJXNcbiIsIEFyZ3NUb1N0cihyNikpOwotCQotCUZyZWVBcmdzKGExKTsKLQlGcmVlQXJncyhhMik7Ci0JRnJlZUFyZ3MoYTMpOwotCUZyZWVBcmdzKGE0KTsKLQlGcmVlQXJncyhhNSk7Ci0JRnJlZUFyZ3MocjEpOwotCUZyZWVBcmdzKHIyKTsKLQlGcmVlQXJncyhyMyk7Ci0JRnJlZUFyZ3MocjQpOwotCUZyZWVBcmdzKHI1KTsKLQlGcmVlQXJncyhyNik7Ci0JCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvYml0c2V0LmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvYml0c2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjMzYWMuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2JpdHNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0KLWJpdHNldCAqCi1iaXRzZXRfbmV3KGludCBuYml0cykKLXsKLQliaXRzZXQgKgliOwotCi0JYiA9IG1hbGxvYyhzaXplb2YoYml0c2V0KSk7Ci0KLQliLT5ic19uYml0cyA9IG5iaXRzOwotCWItPmJzX3NpemUgPSBCSVRfSU5ERVgobmJpdHMtMSkgKyAxOwotCWItPmJzX2JpdHMgPSAoYml0cyAqKW1hbGxvYyhTSVpFX1RPX0JZVEVTKGItPmJzX3NpemUpKTsKLQltZW1zZXQoYi0+YnNfYml0cywgMCwgU0laRV9UT19CWVRFUyhiLT5ic19zaXplKSk7Ci0KLQlyZXR1cm4gYjsKLX0KLQotdm9pZAotYml0c2V0X2ZyZWUoYml0c2V0ICpiKQotewotCWZyZWUoYi0+YnNfYml0cyk7Ci0JZnJlZShiKTsKLX0KLQotdm9pZAotYml0c2V0X2NvcHkoYml0c2V0ICpiMSwgYml0c2V0ICpiMikKLXsKLQltZW1jcHkoYjEtPmJzX2JpdHMsIGIyLT5ic19iaXRzLCBNSU4oU0laRV9UT19CWVRFUyhiMS0+YnNfc2l6ZSksIFNJWkVfVE9fQllURVMoYjItPmJzX3NpemUpKSk7Ci19Ci0KLWJpdHNldCAqCi1iaXRzZXRfZHVwKGJpdHNldCAqYikKLXsKLQliaXRzZXQgKm5iID0gYml0c2V0X25ldyhiLT5ic19uYml0cyk7Ci0KLQliaXRzZXRfY29weShuYiwgYik7Ci0KLQlyZXR1cm4gbmI7Ci19Ci0KLWludAotYml0c2V0X2lzZW1wdHkoYml0c2V0ICpiKQotewotCWludAlpOwotCi0JZm9yIChpID0gMDsgaSA8IGItPmJzX3NpemU7IGkrKykKLQkJaWYgKGItPmJzX2JpdHNbaV0gIT0gMCkKLQkJCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLQotdm9pZAotYml0c2V0X2NsZWFyKGJpdHNldCAqYikKLXsKLQltZW1zZXQoYi0+YnNfYml0cywgMCwgU0laRV9UT19CWVRFUyhiLT5ic19zaXplKSk7Ci19Ci0KLS8qCi0gKiBDb21wdXRlIGxvZ2ljYWwgQU5EIG9mIGJpdHNldHMKLSAqCi0gKiBJZiBiaXRzZXRzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIGNyZWF0ZSBhIG5ldyBiaXRzZXQgdGhhdAotICogaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbGFyZ2VyIG9mIHRoZSB0d28uIFRoZSBoaWdoIGJpdHMKLSAqIHdpbGwgYmUgQU5EZWQgd2l0aCAwLgotICovCi1iaXRzZXQgKgotYml0c2V0X2FuZChiaXRzZXQgKmIxLCBiaXRzZXQgKmIyKQotewotCWJpdHNldCAqCW5iOwotCi0JaWYgKGIxLT5ic19zaXplID4gYjItPmJzX3NpemUpIHsKLQkJbmIgPSBiaXRzZXRfZHVwKGIxKTsKLQkJYml0c2V0X2FuZGVxKG5iLCBiMik7Ci0JfSBlbHNlIHsKLQkJbmIgPSBiaXRzZXRfZHVwKGIyKTsKLQkJYml0c2V0X2FuZGVxKG5iLCBiMSk7Ci0JfQotCi0JcmV0dXJuIG5iOwotfQotCi0vKgotICogQ29tcHV0ZSBiMSAmPSBiMgotICoKLSAqIElmIGJpdHNldHMgYXJlIGRpZmZlcmVudCBzaXplcywgaGlnaCBiaXRzIGFyZSBhc3N1bWVkCi0gKiB0byBiZSAwLgotICovCi12b2lkCi1iaXRzZXRfYW5kZXEoYml0c2V0ICpiMSwgYml0c2V0ICpiMikKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNSU4oYjEtPmJzX3NpemUsIGIyLT5ic19zaXplKTsgaSsrKQotCQliMS0+YnNfYml0c1tpXSAmPSBiMi0+YnNfYml0c1tpXTsKLQotCS8qCi0JICogTWFzayBoaWdoIGJpdHMgKGlmIGFueSkKLQkgKi8KLQlmb3IgKCA7IGkgPCBiMS0+YnNfc2l6ZTsgaSsrKQotCQliMS0+YnNfYml0c1tpXSA9IDA7Ci19Ci0KLS8qCi0gKiBDb21wdXRlIGIxICY9IH5iMgotICoKLSAqIElmIGJpdHNldHMgYXJlIGRpZmZlcmVudCBzaXplcywgaGlnaCBiaXRzIGFyZSBhc3N1bWVkCi0gKiB0byBiZSAwLgotICovCi12b2lkCi1iaXRzZXRfYW5kZXFub3QoYml0c2V0ICpiMSwgYml0c2V0ICpiMikKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNSU4oYjEtPmJzX3NpemUsIGIyLT5ic19zaXplKTsgaSsrKQotCQliMS0+YnNfYml0c1tpXSAmPSB+YjItPmJzX2JpdHNbaV07Ci0KLQkvKgotCSAqIE1hc2sgaGlnaCBiaXRzIChpZiBhbnkpCi0JICovCi0JZm9yICggOyBpIDwgYjEtPmJzX3NpemU7IGkrKykKLQkJYjEtPmJzX2JpdHNbaV0gPSAwOwotfQotCi0vKgotICogQ29tcHV0ZSBsb2dpY2FsIE9SIG9mIGJpdHNldHMKLSAqLwotYml0c2V0ICoKLWJpdHNldF9vcihiaXRzZXQgKmIxLCBiaXRzZXQgKmIyKQotewotCWJpdHNldCAqCW5iOwotCi0JaWYgKGIxLT5ic19zaXplID4gYjItPmJzX3NpemUpIHsKLQkJbmIgPSBiaXRzZXRfZHVwKGIxKTsKLQkJYml0c2V0X29yZXEobmIsIGIyKTsKLQl9IGVsc2UgewotCQluYiA9IGJpdHNldF9kdXAoYjIpOwotCQliaXRzZXRfb3JlcShuYiwgYjEpOwotCX0KLQotCXJldHVybiBuYjsKLX0KLQotLyoKLSAqIENvbXB1dGUgYjEgfD0gYjIKLSAqLwotdm9pZAotYml0c2V0X29yZXEoYml0c2V0ICpiMSwgYml0c2V0ICpiMikKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNSU4oYjEtPmJzX3NpemUsIGIyLT5ic19zaXplKTsgaSsrKQotCQliMS0+YnNfYml0c1tpXSB8PSBiMi0+YnNfYml0c1tpXTsKLQotCS8qCi0JICogTWFzayBvdXQgdW51c2VkIGhpZ2ggYml0cwotCSAqLwotCWlmIChCSVRfSU5fT0JKKGIxLT5ic19uYml0cykgIT0gMCkKLQkJYjEtPmJzX2JpdHNbYjEtPmJzX3NpemUtMV0gJj0gKDEgPDwgKEJJVF9JTl9PQkooYjEtPmJzX25iaXRzLTEpICsgMSkpIC0gMTsKLX0KLQotLyoKLSAqIENvbXB1dGUgfmIKLSAqLwotdm9pZAotYml0c2V0X2ludmVydChiaXRzZXQgKmIpCi17Ci0JaW50CQlpOwotCi0JZm9yIChpID0gMDsgaSA8IGItPmJzX3NpemU7IGkrKykKLQkJYi0+YnNfYml0c1tpXSA9IH5iLT5ic19iaXRzW2ldOwotCi0JLyoKLQkgKiBNYXNrIG91dCB1bnVzZWQgaGlnaCBiaXRzCi0JICovCi0JaWYgKEJJVF9JTl9PQkooYi0+YnNfbmJpdHMpICE9IDApCi0JCWItPmJzX2JpdHNbYi0+YnNfc2l6ZS0xXSAmPSAoMSA8PCAoQklUX0lOX09CSihiLT5ic19uYml0cy0xKSArIDEpKSAtIDE7Ci19Ci0KLS8qCi0gKiBUZXN0IGlmIHR3byBiaXRzZXRzIGFyZSBlcXVhbAotICoKLSAqIEJpdHNldHMgbXVzdCBiZSB0aGUgc2FtZSBzaXplCi0gKi8KLWludAotYml0c2V0X2VxKGJpdHNldCAqYjEsIGJpdHNldCAqYjIpCi17Ci0JaW50CWk7Ci0KLQlpZiAoYjEtPmJzX25iaXRzICE9IGIyLT5ic19uYml0cykKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYjEtPmJzX3NpemU7IGkrKykKLQkJaWYgKGIxLT5ic19iaXRzW2ldICE9IGIyLT5ic19iaXRzW2ldKQotCQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIFRlc3QgaWYgdHdvIGJpdHNldHMgc2hhcmUgYW55IGJpdHMKLSAqCi0gKiBJZiBiaXRzZXRzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIGhpZ2ggYml0cyBhcmUgYXNzdW1lZAotICogdG8gYmUgMC4KLSAqLwotaW50Ci1iaXRzZXRfY29tcGFyZShiaXRzZXQgKmIxLCBiaXRzZXQgKmIyKQotewotCWludAlpOwotCi0JZm9yIChpID0gMDsgaSA8IE1JTihiMS0+YnNfc2l6ZSwgYjItPmJzX3NpemUpOyBpKyspCi0JCWlmICgoYjEtPmJzX2JpdHNbaV0gJiBiMi0+YnNfYml0c1tpXSkgIT0gMCkKLQkJCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogQWRkIGEgYml0IHRvIHRoZSBzZXQuIEJpdHMgYXJlIG51bWJlcmVkIGZyb20gMC4KLSAqLwotdm9pZAotYml0c2V0X3NldChiaXRzZXQgKmIsIGludCBiaXQpCi17Ci0JaWYgKGJpdCA8IDAgfHwgYml0ID49IGItPmJzX25iaXRzKQotCQlyZXR1cm47Ci0KLQliLT5ic19iaXRzW0JJVF9JTkRFWChiaXQpXSB8PSAoMSA8PCBCSVRfSU5fT0JKKGJpdCkpOwotfQotCi12b2lkCi1iaXRzZXRfdW5zZXQoYml0c2V0ICpiLCBpbnQgYml0KQotewotCWlmIChiaXQgPCAwIHx8IGJpdCA+PSBiLT5ic19uYml0cykKLQkJcmV0dXJuOwotCi0JYi0+YnNfYml0c1tCSVRfSU5ERVgoYml0KV0gJj0gfigxIDw8IEJJVF9JTl9PQkooYml0KSk7Ci19Ci0KLWludAotYml0c2V0X3Rlc3QoYml0c2V0ICpiLCBpbnQgYml0KQotewotCWJpdHMJCW1hc2sgPSAoMSA8PCBCSVRfSU5fT0JKKGJpdCkpOwotCi0JaWYgKGJpdCA8IDAgfHwgYml0ID49IGItPmJzX25iaXRzKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAoYi0+YnNfYml0c1tCSVRfSU5ERVgoYml0KV0gJiBtYXNrKSA9PSBtYXNrOwotfQotCi0vKgotICogRmluZCB0aGUgZmlyc3QgYml0IHNldCBpbiB0aGUgYml0c2V0LgotICoKLSAqIE5PVEU6IGZmcygpIGFzc3VtZXMgYW4gaW50ZWdlciBhcmd1bWVudC4gSWYgc2l6ZW9mKGJpdHMpIGlzIGFueXRoaW5nCi0gKiBlbHNlIHRoaXMgd2lsbCBuZWVkIHRvIGJlIGZpeGVkLgotICovCi1pbnQKLWJpdHNldF9maXJzdHNldChiaXRzZXQgKmIpCi17Ci0JaW50CWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYi0+YnNfc2l6ZTsgaSsrKQotCQlpZiAoYi0+YnNfYml0c1tpXSAhPSAwKQotCQkJYnJlYWs7Ci0KLQlpZiAoaSA9PSBiLT5ic19zaXplKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gKFNJWkVfVE9fQllURVMoaSkgPDwgMykgKyBmZnMoYi0+YnNfYml0c1tpXSkgLSAxOwotfQotCi1zdGF0aWMgY2hhciB0b2hleFtdID0geycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ307Ci0KLSNkZWZpbmUgTlVNX0JZVEVTKGJpdHMpICgoKGJpdHMtMSkgPj4gMykgKyAxKQotCi0vKioKLSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGJpdHNldC4gV2UgdXNlIGhleCB0byBjb21wcmVzcwotICogdGhlIHN0cmluZyBzb21ld2hhdCBhbmQgZHJvcCBsZWFkaW5nIHplcm9zLgotICoKLSAqIEZvcm1hdCBpcyAiTk46SEhISEhILi4uIiB3aGVyZSAiTk4iIGlzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJpdHMgaW4gaGV4LAotICogYW5kICJISEhISC4uLi4iIGlzIGEgaGV4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaXRzIGluIHRoZSBzZXQuIFRoZSBudW1iZXIKLSAqIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGJpdCBzdHJpbmcgaXMgYWx3YXlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgYnl0ZS4KLSAqCi0gKiBlLmcuICIxMTEiIC0+ICIzOjA3IgotICogCQkiMTEwMTEwMTAxMDEwMTExMDEiIC0+ICIxMTowMWI1NWQiCi0gKi8KLWNoYXIgKgotYml0c2V0X3RvX3N0cihiaXRzZXQgKmIpCi17Ci0JaW50CQkJCW47Ci0JaW50CQkJCWJ5dGVzOwotCWludAkJCQlwYml0OwotCWludAkJCQliaXQ7Ci0JY2hhciAqCQkJc3RyOwotCWNoYXIgKgkJCXM7Ci0JdW5zaWduZWQgY2hhcgl2YWw7Ci0KLQlpZiAoYiA9PSBOVUxMKSB7Ci0JCXJldHVybiBzdHJkdXAoIjA6MDAiKTsKLQl9Ci0KLQkvKgotCSAqIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIG5lZWRlZCAocm91bmRlZCB1cCkKLQkgKi8KLQlieXRlcyA9IE5VTV9CWVRFUyhiLT5ic19uYml0cyk7Ci0KLQlzdHIgPSAoY2hhciAqKW1hbGxvYyhieXRlcyArIDggKyAyKTsKLQotCS8qCi0JICogU3RhcnQgd2l0aCBhY3R1YWwgbnVtYmVyIG9mIGJpdHMgKHNpbGVudGx5IHRydW5jYXRlIHRvIDMyIGJpdHMpCi0JICovCi0JbiA9IHNwcmludGYoc3RyLCAiJXgiLCBiLT5ic19uYml0cyAmIDB4ZmZmZmZmZmYpOwotCi0JcyA9IHN0ciArIG47Ci0KLQkqcysrID0gJzonOwotCi0JZm9yIChwYml0ID0gKGJ5dGVzIDw8IDMpIC0gMTsgcGJpdCA+IDA7ICkgewotCQlmb3IgKHZhbCA9IDAsIGJpdCA9IDM7IGJpdCA+PSAwOyBiaXQtLSwgcGJpdC0tKSB7Ci0JCQlpZiAocGJpdCA8IGItPmJzX25iaXRzICYmIGJpdHNldF90ZXN0KGIsIHBiaXQpKSB7Ci0JCQkJdmFsIHw9ICgxIDw8IGJpdCk7Ci0JCQl9Ci0JCX0KLQkJKnMrKyA9IHRvaGV4W3ZhbCAmIDB4MGZdOwotCX0KLQotCWlmIChiLT5ic19uYml0cyA9PSAwKSB7Ci0JCSpzKysgPSAnMCc7Ci0JfQotCi0JKnMgPSAnXDAnOwotCi0JcmV0dXJuIHN0cjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IHN0cmluZyBpbnRvIGEgYml0c2V0LiBJbnZlcnNlIG9mIGJpdHNldF90b19zdHIoKS4KLSAqCi0gKi8KLWJpdHNldCAqCi1zdHJfdG9fYml0c2V0KGNoYXIgKnN0ciwgY2hhciAqKmVuZCkKLXsKLQlpbnQJCQluYml0czsKLQlpbnQJCQlieXRlczsKLQlpbnQJCQluOwotCWludAkJCXBvczsKLQlpbnQJCQliOwotCWJpdHNldCAqCWJwOwotCi0JaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWZvciAobmJpdHMgPSAwOyAqc3RyICE9ICc6JyAmJiAqc3RyICE9ICdcMCcgJiYgaXN4ZGlnaXQoKnN0cik7IHN0cisrKSB7Ci0JCW5iaXRzIDw8PSA0OwotCQluYml0cyArPSBkaWdpdHRvaW50KCpzdHIpOwotCX0KLQotCWJ5dGVzID0gTlVNX0JZVEVTKG5iaXRzKTsKLQotCWlmICgqc3RyKysgIT0gJzonIHx8IG5iaXRzID09IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYnAgPSBiaXRzZXRfbmV3KG5iaXRzKTsKLQotCWZvciAocG9zID0gKGJ5dGVzIDw8IDMpIC0gMTsgKnN0ciAhPSAnXDAnICYmIGlzeGRpZ2l0KCpzdHIpICYmIHBvcyA+PSAwOyBzdHIrKykgewotCQliID0gZGlnaXR0b2ludCgqc3RyKTsKLQkJZm9yIChuID0gMzsgbiA+PSAwOyBuLS0sIHBvcy0tKSB7Ci0JCQlpZiAoYiAmICgxIDw8IG4pKSB7Ci0JCQkJYml0c2V0X3NldChicCwgcG9zKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChlbmQgIT0gTlVMTCkgewotCQkqZW5kID0gc3RyOwotCX0KLQotCXJldHVybiBicDsKLX0KLQotaW50Ci1lbWl0X3JhbmdlKGNoYXIgKiogc3RyLCBjaGFyIHNlcCwgaW50IGxvd2VyLCBpbnQgdXBwZXIpCi17Ci0JaW50CQkJbjsKLQotCWlmIChsb3dlciA8IDAgfHwgdXBwZXIgPCBsb3dlcikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2VwKQotCQkqKCpzdHIpKysgPSBzZXA7Ci0KLQlpZiAobG93ZXIgIT0gdXBwZXIpIHsKLQkJbiA9IHNwcmludGYoKnN0ciwgIiVkLSVkIiwgbG93ZXIsIHVwcGVyKTsKLQl9IGVsc2UgewotCQluID0gc3ByaW50Zigqc3RyLCAiJWQiLCBsb3dlcik7Ci0JfQotCi0JKnN0ciArPSBuOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGJpdHNldCB0byBzZXQgbm90YXRpb24gb2YgdGhlIGZvcm0KLSAqCi0gKiAJezAtMiw0LDUtMTAwfQotICovCi1jaGFyICoKLWJpdHNldF90b19zZXQoYml0c2V0ICpiKQotewotCWludAkJCWJpdDsKLQlpbnQJCQlsb3dlcjsKLQlpbnQJCQl1cHBlcjsKLQljaGFyCQlzZXAgPSAwOwotCWNoYXIgKgkJc3RyOwotCWNoYXIgKgkJczsKLQotCWlmIChiID09IE5VTEwpCi0JCXJldHVybiBzdHJkdXAoInt9Iik7Ci0KLQlzdHIgPSBzID0gKGNoYXIgKiltYWxsb2MoYi0+YnNfbmJpdHMgKiAyICsgMyk7Ci0KLQkqcysrID0gJ3snOwotCi0JZm9yIChiaXQgPSAwLCBsb3dlciA9IC0xLCB1cHBlciA9IC0xOyBiaXQgPCBiLT5ic19uYml0czsgYml0KyspIHsKLQkJaWYgKGJpdHNldF90ZXN0KGIsIGJpdCkpIHsKLQkJCWlmIChsb3dlciA8IDApCi0JCQkJbG93ZXIgPSBiaXQ7Ci0KLQkJCXVwcGVyID0gYml0OwotCQl9IGVsc2UgewotCQkJaWYgKGVtaXRfcmFuZ2UoJnMsIHNlcCwgbG93ZXIsIHVwcGVyKSkKLQkJCQlzZXAgPSAnLCc7Ci0JCQlsb3dlciA9IGJpdCArIDE7Ci0JCX0KLQl9Ci0KLQllbWl0X3JhbmdlKCZzLCBzZXAsIGxvd2VyLCB1cHBlcik7Ci0KLQkqcysrID0gJ30nOwotCSpzID0gJ1wwJzsKLQotCXJldHVybiBzdHI7Ci19Ci0KLXVuc2lnbmVkIGludAotY291bnRfYml0cyhiaXRzIGIpCi17Ci0JdW5zaWduZWQgaW50CW4gPSAwOwotCi0Jd2hpbGUgKGIgIT0gMCkgewotCQluKys7Ci0JCWIgJj0gKGItMSk7Ci0JfQotCi0JcmV0dXJuIG47Ci19Ci0KLS8qKgotICogTnVtYmVyIG9mIGJpdHMgaW4gdGhlIHNldCAoYXMgb3Bwb3NlZCB0byB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc2V0KQotICovCi1pbnQKLWJpdHNldF9jb3VudChiaXRzZXQgKmIpCi17Ci0JaW50CWk7Ci0JaW50CWNvdW50ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBiLT5ic19zaXplOyBpKyspCi0JCWNvdW50ICs9IGNvdW50X2JpdHMoYi0+YnNfYml0c1tpXSk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qKgotICogTnVtYmVyIG9mIGJpdHMgdGhpcyBzZXQgY2FuIHJlcHJlc2VudAotICovCi1pbnQKLWJpdHNldF9zaXplKGJpdHNldCAqYikKLXsKLQlyZXR1cm4gYi0+YnNfbmJpdHM7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvYml0c2V0X3Rlc3QuYyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9iaXRzZXRfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE5YTRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9iaXRzZXRfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0KLXZvaWQgdGVzdF9pbnZlcnRfbWFzayhpbnQgdG51bSwgaW50IG5iaXRzKTsKLXZvaWQgdGVzdF9vcmVxKGludCB0bnVtLCBpbnQgbmIxLCBpbnQgbmIyKTsKLXZvaWQgdGVzdF9zdHIoaW50KTsKLXZvaWQgdGVzdF9ib3VuZGFyeShpbnQpOwotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQgYml0c19zaXplID0gKHNpemVvZihiaXRzKTw8Myk7Ci0KLQl0ZXN0X2ludmVydF9tYXNrKDEsIGJpdHNfc2l6ZSoyLTQpOwotCXRlc3Rfb3JlcSgyLCBiaXRzX3NpemUqMi00LGJpdHNfc2l6ZSoyKTsKLQl0ZXN0X29yZXEoMywgYml0c19zaXplKjIsYml0c19zaXplKjItNCk7Ci0JdGVzdF9zdHIoNCk7Ci0JdGVzdF9ib3VuZGFyeSg1KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkCi10ZXN0X2ludmVydF9tYXNrKGludCB0bnVtLCBpbnQgbmJpdHMpCi17Ci0JaW50CQkJaTsKLQliaXRzIAkJcjsKLQliaXRzZXQgKgliOwotCi0JbWVtc2V0KChjaGFyICopJnIsIDAsIHNpemVvZihiaXRzKSk7Ci0JZm9yIChpID0gMDsgaSA8IG5iaXRzICUgKHNpemVvZihiaXRzKSA8PCAzKTsgaSsrKQotCQlyIHw9ICgxIDw8IGkpOwotCi0JYiA9IGJpdHNldF9uZXcobmJpdHMpOwotCWJpdHNldF9pbnZlcnQoYik7Ci0JaWYgKGItPmJzX2JpdHNbYi0+YnNfc2l6ZS0xXSAhPSByKQotCQlwcmludGYoIlRFU1RfJWQgRkFJTDogaGlnaCBiaXRzIHNob3VsZCBiZSAweCV4LCBhY3R1YWxseSAweCV4XG4iLCB0bnVtLCByLCBiLT5ic19iaXRzW2ItPmJzX3NpemUtMV0pOwotCWVsc2UKLQkJcHJpbnRmKCJURVNUXyVkIFNVQ0NFREVEXG4iLCB0bnVtKTsKLQliaXRzZXRfZnJlZShiKTsKLX0KLQotCi12b2lkCi10ZXN0X29yZXEoaW50IHRudW0sIGludCBuYjEsIGludCBuYjIpCi17Ci0JaW50CQkJaTsKLQliaXRzZXQgKgliMTsKLQliaXRzZXQgKgliMjsKLQliaXRzZXQgKglyOwotCi0JYjEgPSBiaXRzZXRfbmV3KG5iMSk7Ci0JYjIgPSBiaXRzZXRfbmV3KG5iMik7Ci0JYml0c2V0X3NldChiMSwgMSk7Ci0JYml0c2V0X3NldChiMiwgbmIyLTEpOwotCi0JYml0c2V0X29yZXEoYjEsIGIyKTsKLQotCXIgPSBiaXRzZXRfbmV3KG5iMSk7Ci0JYml0c2V0X3NldChyLCAxKTsKLQlpZiAobmIxID49IG5iMikKLQkJYml0c2V0X3NldChyLCBuYjIgLSAxKTsKLQotCWZvciAoaSA9IDA7IGkgPCByLT5ic19zaXplOyBpKyspIHsKLQkJaWYgKHItPmJzX2JpdHNbaV0gIT0gYjEtPmJzX2JpdHNbaV0pIHsKLQkJCXByaW50ZigiVEVTVF8lZCBGQUlMOiBbJWRdIDB4JXggIT0gMHgleFxuIiwgaSwgci0+YnNfYml0c1tpXSwgYjEtPmJzX2JpdHNbaV0sIHRudW0pOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpbnRmKCJURVNUXyVkIFNVQ0NFREVEXG4iLCB0bnVtKTsKLX0KLQotdm9pZAotdGVzdF9zdHIoaW50IHRudW0pCi17Ci0JY2hhciAqCQlzdHIyOwotCWNoYXIgKiAJCXN0cjEgPSAiMTc6NjQxMWVkYSI7Ci0JY2hhciAqCQllbmQ7Ci0JYml0c2V0ICoJYiA9IHN0cl90b19iaXRzZXQoc3RyMSwgJmVuZCk7Ci0Jc3RyMiA9IGJpdHNldF90b19zdHIoYik7Ci0JaWYgKHN0cm5jbXAoc3RyMSwgc3RyMiwgOSkgIT0gMCkgewotCQlwcmludGYoIlRFU1RfJWRfMSBGQUlMOiAlcyAhPSAlc1xuIiwgdG51bSwgc3RyMSwgc3RyMik7Ci0JfSBlbHNlIGlmICgqZW5kICE9ICdhJykgewotCQlwcmludGYoIlRFU1RfJWRfMSBGQUlMOiBlbmQgPT0gJWRcbiIsIHRudW0sICplbmQpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiVEVTVF8lZF8xIFNVQ0NFREVEXG4iLCB0bnVtKTsKLQl9Ci0KLQlzdHIxID0gIjM6MDciOwotCWIgPSBzdHJfdG9fYml0c2V0KHN0cjEsIE5VTEwpOwotCXN0cjIgPSBiaXRzZXRfdG9fc3RyKGIpOwotCWlmIChzdHJuY21wKHN0cjEsIHN0cjIsIDkpICE9IDApIHsKLQkJcHJpbnRmKCJURVNUXyVkXzIgRkFJTDogJXMgIT0gJXNcbiIsIHRudW0sIHN0cjEsIHN0cjIpOwotCX0gZWxzZSBpZiAoKmVuZCAhPSAnYScpIHsKLQkJcHJpbnRmKCJURVNUXyVkXzIgRkFJTDogZW5kID09ICVkXG4iLCB0bnVtLCAqZW5kKTsKLQl9IGVsc2UgewotCQlwcmludGYoIlRFU1RfJWRfMiBTVUNDRURFRFxuIiwgdG51bSk7Ci0JfQotfQotCi12b2lkCi10ZXN0X2JvdW5kYXJ5KGludCB0bnVtKQotewotCWNoYXIgKiAJCXN0cjEgPSAiODo3ZiI7Ci0JY2hhciAqCQlzdHIyOwotCWNoYXIgKgkJc3RyMyA9ICI4OmZmIjsKLQljaGFyICoJCWVuZDsKLQliaXRzZXQgKgliID0gc3RyX3RvX2JpdHNldChzdHIxLCAmZW5kKTsKLQliaXRzZXRfc2V0KGIsIDcpOwotCXN0cjIgPSBiaXRzZXRfdG9fc3RyKGIpOwotCWlmIChzdHJuY21wKHN0cjMsIHN0cjIsIDQpICE9IDApIHsKLQkJcHJpbnRmKCJURVNUXyVkXzEgRkFJTDogJXMgIT0gJXNcbiIsIHRudW0sIHN0cjMsIHN0cjIpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiVEVTVF8lZF8xIFNVQ0NFREVEXG4iLCB0bnVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvY29tcGF0LmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGFiNmQuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2NvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0KLSNpZiBkZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQgKF9BSVgpCi1pbnQKLWRpZ2l0dG9pbnQoaW50IGMpCi17Ci0JaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCQlyZXR1cm4gYyAtICcwJzsKLQkJCi0JaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotCQlyZXR1cm4gYyAtICdhJyArIDEwOwotCQkKLQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCi0JCXJldHVybiBjIC0gJ0EnICsgMTA7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogX19saW51eF9fICovCi0KLQotI2lmbmRlZiBIQVZFX0FTUFJJTlRGCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotLyogCi0gKiBhc3N1bWVzIHByZXNlbmNlIG9mIHNucHJpbnRmIChJU08gQzk5KSB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcgCi0gKi8KLQotaW50Ci1hc3ByaW50ZihjaGFyICoqIHJldCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyIGJ1ZlsyXTsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCi0JbGVuID0gdnNucHJpbnRmKGJ1ZiwgMiwgZm10LCBhcCk7CS8qIGdldCBsZW5ndGggb2Ygc3RyaW5nIGZpcnN0ICovCi0JKnJldCA9IG1hbGxvYyhsZW4rMSk7Ci0JbGVuID0gdnNucHJpbnRmKCpyZXQsIGxlbisxLCBmbXQsIGFwKTsKLQotCXZhX2VuZChhcCk7Ci0JcmV0dXJuIGxlbjsKLX0KLQotI2VuZGlmIC8qICFIQVZFX0FTUFJJTlRGICovCi0KLSNpZmRlZiBfQUlYCi0vKgotKiBUaGUgdmFzcHJpbnRmIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQUlYLiBTaW5jZSBubwotKiBjb2RlIGluIHRoZSBQYXJhbGxlbCBFbnZpcm9ubWVudCBwcm94eSBjYWxscyB2YXNwcmludGYgYXQgdGhpcyAKLSogdGltZSwgdGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGUgZnVuY3Rpb24KLSogdG8gc2F0aXNmeSB0aGUgbGlua2VyIChzaW5jZSBjb2RlIGluIHByb3h5X2V2ZW50LmMsIHVudXNlZCBieQotKiB0aGUgUEUgcHJveHksIGRvZXMgY2FsbCB2YXNwcmludGYpLgotKiBGb3Igbm93LCBhbGwgdGhpcyBhbHRlcm5hdGUgZnVuY3Rpb24gZG9lcyBpcyBjYWxsIGFib3J0KCksCi0qIGFzc3VyaW5nIGEgcHJveHkgY3Jhc2ggaWYgYW55dGhpbmcgZXZlciBkb2VzIGNhbGwgdmFzcHJpbnRmCi0qLwotaW50IHZhc3ByaW50ZihjaGFyICoqc3RycCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotCWFib3J0KCk7Ci19Ci0jZW5kaWYgLyogX0FJWCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2hhbmRsZXIuYyBiL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9oYW5kbGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzhiYTIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2hhbmRsZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiaGFuZGxlci5oIgotI2luY2x1ZGUgImxpc3QuaCIKLQotc3RhdGljIExpc3QgKgkJZGJnX2hhbmRsZXJzID0gTlVMTDsKLQotLyoqCi0gKiBDcmVhdGUgYW4gZXZlbnQgaGFuZGxlciBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBoYW5kbGVycwotICovCi1oYW5kbGVyICoKLU5ld0hhbmRsZXIoaW50IHR5cGUsIHZvaWQgKmRhdGEpCi17Ci0JaGFuZGxlciAqCWg7Ci0JCi0JaWYgKGRiZ19oYW5kbGVycyA9PSBOVUxMKQotCQlkYmdfaGFuZGxlcnMgPSBOZXdMaXN0KCk7Ci0JCQotCWggPSAoaGFuZGxlciAqKW1hbGxvYyhzaXplb2YoaGFuZGxlcikpOwotCWgtPmh0eXBlID0gdHlwZTsKLQloLT5kYXRhID0gZGF0YTsKLQkKLQlBZGRUb0xpc3QoZGJnX2hhbmRsZXJzLCAodm9pZCAqKWgpOwotCQotCXJldHVybiBoOwotfQotCi0vKioKLSAqIFJlbW92ZSBoYW5kbGVyIGZyb20gbGlzdCBhbmQgZGlzcG9zZSBvZiBtZW1vcnkKLSAqLwotdm9pZAotRGVzdHJveUhhbmRsZXIoaGFuZGxlciAqaCkKLXsKLQlSZW1vdmVGcm9tTGlzdChkYmdfaGFuZGxlcnMsICh2b2lkICopaCk7Ci0JZnJlZShoKTsKLX0KLQotdm9pZAotU2V0SGFuZGxlcih2b2lkKQotewotCVNldExpc3QoZGJnX2hhbmRsZXJzKTsKLX0KLQotaGFuZGxlciAqCi1HZXRIYW5kbGVyKHZvaWQpCi17Ci0JcmV0dXJuIChoYW5kbGVyICopR2V0TGlzdEVsZW1lbnQoZGJnX2hhbmRsZXJzKTsKLX0KLQotdm9pZAotUmVnaXN0ZXJFdmVudEhhbmRsZXIoaW50IHR5cGUsIHZvaWQgKCpldmVudF9jYWxsYmFjaykodm9pZCAqLCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCWhhbmRsZXIgKgloOwotCi0JaCA9IE5ld0hhbmRsZXIoSEFORExFUl9FVkVOVCwgTlVMTCk7Ci0JaC0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JaC0+ZXZlbnRfaGFuZGxlciA9IGV2ZW50X2NhbGxiYWNrOwotCWgtPmRhdGEgPSBkYXRhOwotfQotCi0vKioKLSAqIFVucmVnaXN0ZXIgZmlsZSBkZXNjcmlwdG9yIGhhbmRsZXIKLSAqLwotdm9pZAotVW5yZWdpc3RlckV2ZW50SGFuZGxlcihpbnQgdHlwZSwgdm9pZCAoKmV2ZW50X2NhbGxiYWNrKSh2b2lkICosIHZvaWQgKikpCi17Ci0JaGFuZGxlciAqCWg7Ci0KLQlmb3IgKFNldEhhbmRsZXIoKTsgKGggPSBHZXRIYW5kbGVyKCkpICE9IE5VTEw7ICkgewotCQlpZiAoaC0+aHR5cGUgPT0gSEFORExFUl9FVkVOVCAmJiBoLT5ldmVudF90eXBlID09IHR5cGUgJiYgaC0+ZXZlbnRfaGFuZGxlciA9PSBldmVudF9jYWxsYmFjaykKLQkJCURlc3Ryb3lIYW5kbGVyKGgpOwotCX0KLX0KLQotLyoqCi0gKiBSZWdpc3RlciBhIGhhbmRsZXIgZm9yIGZpbGUgZGVzY3JpcHRvciBldmVudHMuCi0gKi8KLXZvaWQKLVJlZ2lzdGVyRmlsZUhhbmRsZXIoaW50IGZkLCBpbnQgdHlwZSwgaW50ICgqZmlsZV9oYW5kbGVyKShpbnQsIHZvaWQgKiksIHZvaWQgKmRhdGEpCi17Ci0JaGFuZGxlciAqCWg7Ci0JCi0JaCA9IE5ld0hhbmRsZXIoSEFORExFUl9GSUxFLCBkYXRhKTsKLQloLT5maWxlX3R5cGUgPSB0eXBlOwotCWgtPmZkID0gZmQ7Ci0JaC0+ZXJyb3IgPSAwOwotCWgtPmZpbGVfaGFuZGxlciA9IGZpbGVfaGFuZGxlcjsKLX0KLQotLyoqCi0gKiBVbnJlZ2lzdGVyIGZpbGUgZGVzY3JpcHRvciBoYW5kbGVyCi0gKi8KLXZvaWQKLVVucmVnaXN0ZXJGaWxlSGFuZGxlcihpbnQgZmQpCi17Ci0JaGFuZGxlciAqCWg7Ci0KLQlmb3IgKFNldEhhbmRsZXIoKTsgKGggPSBHZXRIYW5kbGVyKCkpICE9IE5VTEw7ICkgewotCQlpZiAoaC0+aHR5cGUgPT0gSEFORExFUl9GSUxFICYmIGgtPmZkID09IGZkKQotCQkJRGVzdHJveUhhbmRsZXIoaCk7Ci0JfQotfQotCi0vKioKLSAqIENhbGwgYWxsIGV2ZW50IGhhbmRsZXJzIG9mIGEgcGFydGljdWxhciB0eXBlCi0gKi8KLXZvaWQKLUNhbGxFdmVudEhhbmRsZXJzKGludCB0eXBlLCB2b2lkICpkYXRhKQotewotCWhhbmRsZXIgKgloOwotCi0JZm9yIChTZXRIYW5kbGVyKCk7IChoID0gR2V0SGFuZGxlcigpKSAhPSBOVUxMOyApIHsKLQkJaWYgKGgtPmh0eXBlID09IEhBTkRMRVJfRVZFTlQgJiYgaC0+ZXZlbnRfdHlwZSA9PSB0eXBlKQotCQkJaC0+ZXZlbnRfaGFuZGxlcihoLT5kYXRhLCBkYXRhKTsKLQl9Ci19Ci0KLS8qCi0gKiBDYWxsIGFsbCBmaWxlIGhhbmRsZXJzCi0gKi8KLWludAotQ2FsbEZpbGVIYW5kbGVycyhmZF9zZXQgKnJmZHMsIGZkX3NldCAqd2ZkcywgZmRfc2V0ICplZmRzKQotewotCWludAkJCXJldCA9IDA7Ci0JaGFuZGxlciAqCWg7Ci0JCi0JZm9yIChTZXRIYW5kbGVyKCk7IChoID0gR2V0SGFuZGxlcigpKSAhPSBOVUxMOyApIHsKLQkJaWYgKGgtPmh0eXBlID09IEhBTkRMRVJfRklMRQotCQkJJiYgaC0+ZXJyb3IgPj0gMAotCQkJJiYgKChoLT5maWxlX3R5cGUgJiBSRUFEX0ZJTEVfSEFORExFUiAmJiBGRF9JU1NFVChoLT5mZCwgcmZkcykpCi0JCQkJfHwgKGgtPmZpbGVfdHlwZSAmIFdSSVRFX0ZJTEVfSEFORExFUiAmJiBGRF9JU1NFVChoLT5mZCwgd2ZkcykpCi0JCQkJfHwgKGgtPmZpbGVfdHlwZSAmIEVYQ0VQVF9GSUxFX0hBTkRMRVIgJiYgRkRfSVNTRVQoaC0+ZmQsIGVmZHMpKSkpIHsKLQkJCWgtPmVycm9yID0gaC0+ZmlsZV9oYW5kbGVyKGgtPmZkLCBoLT5kYXRhKTsKLQkJCWlmIChoLT5lcnJvciA8IDApCi0JCQkJcmV0ID0gLTE7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIGZpbGUgZGVzY3JpcHRvciBzZXRzCi0gKi8KLXZvaWQKLUdlbmVyYXRlRkRTZXRzKGludCAqbmZkcywgZmRfc2V0ICpyZmRzLCBmZF9zZXQgKndmZHMsIGZkX3NldCAqZWZkcykKLXsKLQloYW5kbGVyICoJaDsKLQkKLQkqbmZkcyA9IDA7Ci0JRkRfWkVSTyhyZmRzKTsKLQlGRF9aRVJPKHdmZHMpOwotCUZEX1pFUk8oZWZkcyk7Ci0JCi0JZm9yIChTZXRIYW5kbGVyKCk7IChoID0gR2V0SGFuZGxlcigpKSAhPSBOVUxMOyApIHsKLQkJaWYgKGgtPmh0eXBlID09IEhBTkRMRVJfRklMRSkgewotCQkJaWYgKGgtPmZpbGVfdHlwZSAmIFJFQURfRklMRV9IQU5ETEVSKQotCQkJCUZEX1NFVChoLT5mZCwgcmZkcyk7Ci0JCQlpZiAoaC0+ZmlsZV90eXBlICYgV1JJVEVfRklMRV9IQU5ETEVSKQotCQkJCUZEX1NFVChoLT5mZCwgd2Zkcyk7Ci0JCQlpZiAoaC0+ZmlsZV90eXBlICYgRVhDRVBUX0ZJTEVfSEFORExFUikKLQkJCQlGRF9TRVQoaC0+ZmQsIGVmZHMpOwotCQkJaWYgKGgtPmZkID4gKm5mZHMpCi0JCQkJKm5mZHMgPSBoLT5mZDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9oYXNoLmMgYi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjZjNWY1Li4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotLyoKLSoqIE9yaWdpbmFsIGNvcHlyaWdodCBieSBCb2IgSmVua2lucywgRGVjZW1iZXIgMTk5Ni4KLSovCi0KLS8qCi0gKiBOT1RFOiBUaGlzIGhhc2ggaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZCBhY3Jvc3MgaXRlcmF0aW9uIChIYXNoU2V0L0hhc2hHZXQpLiBJZiB0aGVyZSBhcmUgdHdvIAotICogdGhyZWFkcyBzaW11bHRhbmVvdXNseSBhY2Nlc3NpbmcgdGhlIGhhc2gsIHRoZW4gb25lIHRocmVhZCBtYXkgYWZmZWN0IHRoZSBvdGhlcidzIGFjY2Vzcy4gRm9yIGluc3RhbmNlLCAKLSAqIGlmIHRocmVhZCAxIGNhbGxzIEhhc2hHZXQoKSwgdGhlbiB0aHJlYWQgMiBjYWxscyBIYXNoR2V0KCksIHRoZW4gdGhlIG5leHQgdGltZSB0aHJlYWQgMSBjYWxscwotICogSGFzaEdldCgpLCBpdCB3aWxsIGdldCB0aGUgM3JkIGVsZW1lbnQgaW4gdGhlIGhhc2gsIG5vdCB0aGUgMm5kLiBBbHNvLCBpZiB0d28gdGhyZWFkcyBhcmUgYWNjZXNzaW5nIAotICogb2JqZWN0cyBpbiB0aGUgaGFzaCwgYW5kIGZyZWVpbmcgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhvc2Ugb2JqZWN0cyB3aGlsZSB0cmF2ZXJzaW5nIHRoZSBoYXNoLCB0aGVuIHRoaXMgCi0gKiBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlcmUgdGhyZWFkIDEgZnJlZXMgZGF0YSB0aGF0IHRocmVhZCAyIGlzIGFib3V0IHRvIGFjY2Vzcy4KLSAqIAotICogQXBwbGljYXRpb25zIHdpc2hpbmcgdG8gdXNlIHRocmVhZHMgdG8gYWNjZXNzIGhhc2hlcyBpbiB0aGlzIHdheSBzaG91bGQgcHJvdmlkZSBmdW5jdGlvbnMgdGhhdCBvYnRhaW4gCi0gKiBhbmQgcmVsZWFzZSBhIGdsb2JhbCBsb2NrIG9uIHRoZSBoYXNoIHdoaWNoIHByZXZlbnRzIGFueSBvdGhlciB0aHJlYWQgZnJvbSBhY2Nlc3NpbmcgdGhlIGhhc2ggd2hpbGUgCi0gKiB0aGF0IGxvY2sgaXMgaGVsZC4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotVEhSRUFEX0RFQ0woaGFzaCk7Ci0KLS8qCi0qKiBtaXggMyAzMi1iaXQgdmFsdWVzIHJldmVyc2libHkuCi0qKiBGb3IgZXZlcnkgZGVsdGEgd2l0aCBvbmUgb3IgdHdvIGJpdCBzZXQsIGFuZCB0aGUgZGVsdGFzIG9mIGFsbCB0aHJlZQotKiogICBoaWdoIGJpdHMgb3IgYWxsIHRocmVlIGxvdyBiaXRzLCB3aGV0aGVyIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBhLGIsYwotKiogICBpcyBhbG1vc3QgYWxsIHplcm8gb3IgaXMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkLAotKiogSWYgbWl4KCkgaXMgcnVuIGZvcndhcmQgb3IgYmFja3dhcmQsIGF0IGxlYXN0IDMyIGJpdHMgaW4gYSxiLGMKLSoqICBoYXZlIGF0IGxlYXN0IDEvNCBwcm9iYWJpbGl0eSBvZiBjaGFuZ2luZy4KLSoqIElmIG1peCgpIGlzIHJ1biBmb3J3YXJkLCBldmVyeSBiaXQgb2YgYyB3aWxsIGNoYW5nZSBiZXR3ZWVuIDEvMyBhbmQKLSoqICAyLzMgb2YgdGhlIHRpbWUuICAoV2VsbCwgMjIvMTAwIGFuZCA3OC8xMDAgZm9yIHNvbWUgMi1iaXQgZGVsdGFzLikKLSoqIG1peCgpIHdhcyBidWlsdCBvdXQgb2YgMzYgc2luZ2xlLWN5Y2xlIGxhdGVuY3kgaW5zdHJ1Y3Rpb25zIGluIGEgCi0qKiAgc3RydWN0dXJlIHRoYXQgY291bGQgc3VwcG9ydGVkIDJ4IHBhcmFsbGVsaXNtLCBsaWtlIHNvOgotKiogICAgICBhIC09IGI7IAotKiogICAgICBhIC09IGM7IHggPSAoYz4+MTMpOwotKiogICAgICBiIC09IGM7IGEgXj0geDsKLSoqICAgICAgYiAtPSBhOyB4ID0gKGE8PDgpOwotKiogICAgICBjIC09IGE7IGIgXj0geDsKLSoqICAgICAgYyAtPSBiOyB4ID0gKGI+PjEzKTsKLSoqICAgICAgLi4uCi0qKiAgVW5mb3J0dW5hdGVseSwgc3VwZXJzY2FsYXIgUGVudGl1bXMgYW5kIFNwYXJjcyBjYW4ndCB0YWtlIGFkdmFudGFnZSAKLSoqICBvZiB0aGF0IHBhcmFsbGVsaXNtLiAgVGhleSd2ZSBhbHNvIHR1cm5lZCBzb21lIG9mIHRob3NlIHNpbmdsZS1jeWNsZQotKiogIGxhdGVuY3kgaW5zdHJ1Y3Rpb25zIGludG8gbXVsdGktY3ljbGUgbGF0ZW5jeSBpbnN0cnVjdGlvbnMuICBTdGlsbCwKLSoqICB0aGlzIGlzIHRoZSBmYXN0ZXN0IGdvb2QgaGFzaCBJIGNvdWxkIGZpbmQuICBUaGVyZSB3ZXJlIGFib3V0IDJeXjY4Ci0qKiAgdG8gY2hvb3NlIGZyb20uICBJIG9ubHkgbG9va2VkIGF0IGEgYmlsbGlvbiBvciBzby4KLSovCi0jZGVmaW5lIG1peChhLGIsYykgXAoteyBcCi0gIGEgLT0gYjsgYSAtPSBjOyBhIF49IChjPj4xMyk7IFwKLSAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKGE8PDgpOyBcCi0gIGMgLT0gYTsgYyAtPSBiOyBjIF49IChiPj4xMyk7IFwKLSAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKGM+PjEyKTsgIFwKLSAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKGE8PDE2KTsgXAotICBjIC09IGE7IGMgLT0gYjsgYyBePSAoYj4+NSk7IFwKLSAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKGM+PjMpOyAgXAotICBiIC09IGM7IGIgLT0gYTsgYiBePSAoYTw8MTApOyBcCi0gIGMgLT0gYTsgYyAtPSBiOyBjIF49IChiPj4xNSk7IFwKLX0KLQotc3RhdGljIHZvaWQgX2hncm93KEhhc2ggKik7Ci0KLUhhc2ggKgotSGFzaENyZWF0ZShpbnQgc2l6ZSkKLXsKLQl1bnNpZ25lZCBpbnQJaTsKLQl1bnNpZ25lZCBpbnQJbG9nc2l6ZSA9IC0xOwotCUhhc2ggKglodGFiOwotCi0JaHRhYiA9IChIYXNoICopbWFsbG9jKHNpemVvZihIYXNoKSk7Ci0KLQkvKgotCSAqIENvbXB1dGUgbG9nMihzaXplKQotCSAqLwotCWZvciAoaSA9ICh1bnNpZ25lZCBpbnQpc2l6ZTsgaSA+IDA7IGkgPj49IDEpCi0JCWxvZ3NpemUrKzsKLQkJCi0JLyoKLQkqKiBNYXhpbXVtIHNpemUgaXMgMl4zMQotCSovCi0JaWYgKCBsb2dzaXplID4gQklUU1BFUkJZVEUgKiBzaXplb2YodW5zaWduZWQgaW50KSAtIDEgKQotCQlsb2dzaXplID0gQklUU1BFUkJZVEUgKiBzaXplb2YodW5zaWduZWQgaW50KSAtIDE7Ci0JCQotCWlmICggbG9nc2l6ZSA8PSAwICkKLQkJbG9nc2l6ZSA9IDI7Ci0KLQlodGFiLT5sb2dzaXplID0gbG9nc2l6ZTsKLQlodGFiLT5zaXplID0gKHVuc2lnbmVkIGludCkoMSA8PCBsb2dzaXplKTsKLQlodGFiLT5tYXNrID0gaHRhYi0+c2l6ZSAtIDE7Ci0JaHRhYi0+Y291bnQgPSAwOwotCi0JLyogYWxsb2NhdGUgbWVtb3J5IGFuZCB6ZXJvIG91dCAqLwotCWh0YWItPnRhYmxlID0gKEhhc2hFbnRyeSAqKiltYWxsb2MoaHRhYi0+c2l6ZSAqIHNpemVvZihIYXNoRW50cnkgKikpOwotCi0JZm9yICggaSA9IDAgOyBpIDwgaHRhYi0+c2l6ZSA7IGkrKyApCi0JCWh0YWItPnRhYmxlW2ldID0gKEhhc2hFbnRyeSAqKU5VTEw7Ci0KLQkvKiBldmVyeXRoaW5nIHdlbnQgYWxyaWdodCAqLwotCXJldHVybiBodGFiOwotfQotCi12b2lkCi1IYXNoRGVzdHJveShIYXNoICpodGFiLCAgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKikpCi17Ci0JaW50CQlpOwotCUhhc2hFbnRyeSAqCWg7Ci0JSGFzaEVudHJ5ICoJaG47Ci0KLQkvKiBUZXN0IGZvciBjb3JyZWN0IGFyZ3VtZW50cy4gICovCi0JaWYgKCBodGFiID09IE5VTEwgKQotCQlyZXR1cm47Ci0KLQlUSFJFQURfTE9DSyhoYXNoKTsKLQkKLQlmb3IgKCBpID0gMCA7IGkgPCAoaW50KWh0YWItPnNpemUgOyBpKysgKQotCXsKLQkJZm9yICggaCA9IGh0YWItPnRhYmxlW2ldIDsgaCAhPSBOVUxMIDsgKQotCQl7Ci0JCQlpZiAoIGRlc3Ryb3kgIT0gTlVMTCApCi0JCQkJZGVzdHJveShoLT5oX2RhdGEpOwotCi0JCQlobiA9IGgtPmhfbmV4dDsKLQkJCWZyZWUoaCk7Ci0JCQloID0gaG47Ci0JCX0KLQl9Ci0KLQlpZiAoaHRhYi0+dGFibGUgIT0gTlVMTCkKLQkJZnJlZShodGFiLT50YWJsZSk7Ci0KLQlmcmVlKGh0YWIpOwotCQotCVRIUkVBRF9VTkxPQ0soaGFzaCk7Ci19Ci0KLS8qCi0qKiBmaW5kZW50cnkodGFiLCBrZXksIGh2KSAtLSBoYXNoIGEgdmFyaWFibGUtbGVuZ3RoIGtleSBpbnRvIGEgMzItYml0IHZhbHVlCi0qKgotKiogIGtleTogdGhlIGtleSAodGhlIHVuYWxpZ25lZCB2YXJpYWJsZS1sZW5ndGggYXJyYXkgb2YgYnl0ZXMpCi0qKiAgaHYgOiBjYW4gYmUgYW55IDQtYnl0ZSB2YWx1ZQotKioKLSoqIFJldHVybnMgYSAzMi1iaXQgdmFsdWUuICBFdmVyeSBiaXQgb2YgdGhlIGtleSBhZmZlY3RzIGV2ZXJ5IGJpdCBvZgotKiogdGhlIHJldHVybiB2YWx1ZS4gIEV2ZXJ5IDEtYml0IGFuZCAyLWJpdCBkZWx0YSBhY2hpZXZlcyBhdmFsYW5jaGUuCi0qKiBBYm91dCA2bGVuKzM1IGluc3RydWN0aW9ucy4KLSoqCi0qKiBUaGUgYmVzdCBoYXNoIHRhYmxlIHNpemVzIGFyZSBwb3dlcnMgb2YgMi4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gZG8KLSoqIG1vZCBhIHByaW1lIChtb2QgaXMgc29vbyBzbG93ISkuICBJZiB5b3UgbmVlZCBsZXNzIHRoYW4gMzIgYml0cywKLSoqIHVzZSBhIGJpdG1hc2suICBGb3IgZXhhbXBsZSwgaWYgeW91IG5lZWQgb25seSAxMCBiaXRzLCBkbwotKiogICBoID0gKGggJiBoYXNobWFzaygxMCkpOwotKiogSW4gd2hpY2ggY2FzZSwgdGhlIGhhc2ggdGFibGUgc2hvdWxkIGhhdmUgaGFzaHNpemUoMTApIGVsZW1lbnRzLgotKiogCi0qKiBJZiB5b3UgYXJlIGhhc2hpbmcgbiBzdHJpbmdzICh1YjEgKiopaywgZG8gaXQgbGlrZSB0aGlzOgotKiogICBmb3IgKGk9MCwgaD0wOyBpPG47ICsraSkgaCA9IGZpbmRlbnRyeSgga1tpXSwgaCk7Ci0qKiAKLSoqIEJ5IEJvYiBKZW5raW5zLCAxOTk2LiAgYm9iX2plbmtpbnNAYnVydGxlYnVydGxlLm5ldC4gIFlvdSBtYXkgdXNlIHRoaXMKLSoqIGNvZGUgYW55IHdheSB5b3Ugd2lzaCwgcHJpdmF0ZSwgZWR1Y2F0aW9uYWwsIG9yIGNvbW1lcmNpYWwuCi0qKiAKLSoqIFNlZSBodHRwOi8vYnVydGxlYnVydGxlLm5ldC9ib2IvaGFzaC9ldmFoYXNoLmh0bWwKLSoqIFVzZSBmb3IgaGFzaCB0YWJsZSBsb29rdXAsIG9yIGFueXRoaW5nIHdoZXJlIG9uZSBjb2xsaXNpb24gaW4gMl4zMiBpcwotKiogYWNjZXB0YWJsZS4gIERvIE5PVCB1c2UgZm9yIGNyeXB0b2dyYXBoaWMgcHVycG9zZXMuCi0qLwotCi11bnNpZ25lZCBpbnQKLWZpbmRlbnRyeShjaGFyICprZXksIGludCBsZW4sIGludCBodikKLXsKLQl1bnNpZ25lZCBpbnQJYTsKLQl1bnNpZ25lZCBpbnQJYjsKLQl1bnNpZ25lZCBpbnQJYzsKLQl1bnNpZ25lZCBpbnQJbDsKLQotCWlmICgga2V5ID09IE5VTEwgKQotCQlyZXR1cm4gMDsKLQotCS8qIFNldCB1cCB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlhID0gYiA9IDB4OWUzNzc5Yjk7ICAvKiB0aGUgZ29sZGVuIHJhdGlvOyBhbiBhcmJpdHJhcnkgdmFsdWUgKi8KLQljID0gaHY7ICAgICAgICAgICAvKiB0aGUgcHJldmlvdXMgaGFzaCB2YWx1ZSAqLwotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhhbmRsZSBtb3N0IG9mIHRoZSBrZXkgKi8KLQlmb3IgKCBsID0gbGVuIDsgbCA+PSAxMiA7IGwgLT0gMTIgKQotCXsKLQkJYSArPSAoa2V5WzBdICsoKHVuc2lnbmVkIGludClrZXlbMV08PDgpICsoKHVuc2lnbmVkIGludClrZXlbMl08PDE2KSArKCh1bnNpZ25lZCBpbnQpa2V5WzNdPDwyNCkpOwotCQliICs9IChrZXlbNF0gKygodW5zaWduZWQgaW50KWtleVs1XTw8OCkgKygodW5zaWduZWQgaW50KWtleVs2XTw8MTYpICsoKHVuc2lnbmVkIGludClrZXlbN108PDI0KSk7Ci0JCWMgKz0gKGtleVs4XSArKCh1bnNpZ25lZCBpbnQpa2V5WzldPDw4KSArKCh1bnNpZ25lZCBpbnQpa2V5WzEwXTw8MTYpKygodW5zaWduZWQgaW50KWtleVsxMV08PDI0KSk7Ci0KLQkJbWl4KGEsYixjKTsKLQotCQlrZXkgKz0gMTI7Ci0JfQotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhhbmRsZSB0aGUgbGFzdCAxMSBieXRlcyAqLwotCWMgKz0gbGVuOwotCi0Jc3dpdGNoICggbCApICAgICAgICAgICAgICAvKiBhbGwgdGhlIGNhc2Ugc3RhdGVtZW50cyBmYWxsIHRocm91Z2ggKi8KLQl7Ci0JY2FzZSAxMTogYyArPSAoKHVuc2lnbmVkIGludClrZXlbMTBdPDwyNCk7Ci0JY2FzZSAxMDogYyArPSAoKHVuc2lnbmVkIGludClrZXlbOV08PDE2KTsKLQljYXNlIDkgOiBjICs9ICgodW5zaWduZWQgaW50KWtleVs4XTw8OCk7Ci0JLyogdGhlIGZpcnN0IGJ5dGUgb2YgYyBpcyByZXNlcnZlZCBmb3IgdGhlIGxlbmd0aCAqLwotCWNhc2UgOCA6IGIgKz0gKCh1bnNpZ25lZCBpbnQpa2V5WzddPDwyNCk7Ci0JY2FzZSA3IDogYiArPSAoKHVuc2lnbmVkIGludClrZXlbNl08PDE2KTsKLQljYXNlIDYgOiBiICs9ICgodW5zaWduZWQgaW50KWtleVs1XTw8OCk7Ci0JY2FzZSA1IDogYiArPSBrZXlbNF07Ci0JY2FzZSA0IDogYSArPSAoKHVuc2lnbmVkIGludClrZXlbM108PDI0KTsKLQljYXNlIDMgOiBhICs9ICgodW5zaWduZWQgaW50KWtleVsyXTw8MTYpOwotCWNhc2UgMiA6IGEgKz0gKCh1bnNpZ25lZCBpbnQpa2V5WzFdPDw4KTsKLQljYXNlIDEgOiBhICs9IGtleVswXTsKLQkvKiBjYXNlIDA6IG5vdGhpbmcgbGVmdCB0byBhZGQgKi8KLQl9Ci0KLQltaXgoYSxiLGMpOwotCi0JcmV0dXJuIGM7Ci19Ci0KLXVuc2lnbmVkIGludCAKLUhhc2hDb21wdXRlKGNoYXIgKmtleSwgaW50IGxlbikKLXsKLQlyZXR1cm4gZmluZGVudHJ5KGtleSwgbGVuLCAwKTsKLX0KLQotdm9pZCAqCi1IYXNoU2VhcmNoKEhhc2ggKmh0YWIsIHVuc2lnbmVkIGludCBpZHgpCi17Ci0JSGFzaEVudHJ5ICoJaDsKLQkKLQlUSFJFQURfTE9DSyhoYXNoKTsKLQkKLQlmb3IgKCBoID0gaHRhYi0+dGFibGVbaWR4ICYgaHRhYi0+bWFza10gOyBoICE9IE5VTEwgOyBoID0gaC0+aF9uZXh0KQotCXsKLQkJaWYgKCBpZHggPT0gaC0+aF9odmFsICkgewotCQkJVEhSRUFEX1VOTE9DSyhoYXNoKTsKLQkJCXJldHVybiBoLT5oX2RhdGE7Ci0JCX0KLQl9Ci0JCi0JVEhSRUFEX1VOTE9DSyhoYXNoKTsKLQotCXJldHVybiBOVUxMOwotfQotCi1IYXNoRW50cnkgKgotSGFzaEluc2VydChIYXNoICpodGFiLCB1bnNpZ25lZCBpbnQgaWR4LCB2b2lkICpkYXRhKQotewotCUhhc2hFbnRyeSAqCWg7Ci0JSGFzaEVudHJ5ICoqCWhwOwotCQotCVRIUkVBRF9MT0NLKGhhc2gpOwotCQotCS8qCi0JKiogQ2hlY2sgaWYgZW50cnkgYWxyZWFkeSBleGlzdHMKLQkqLwotCWZvciAoIGggPSBodGFiLT50YWJsZVtpZHggJiBodGFiLT5tYXNrXSA7IGggIT0gKEhhc2hFbnRyeSAqKU5VTEwgOyBoID0gaC0+aF9uZXh0KQotCXsKLQkJaWYgKCBpZHggPT0gaC0+aF9odmFsICkgewotCQkJVEhSRUFEX1VOTE9DSyhoYXNoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0JLyoKLQkqKiBHcm93IGhhc2ggdGFibGUgaWYgaXQncyBnZXR0aW5nIGZ1bGwuCi0JKi8KLQotCWlmICggKytodGFiLT5jb3VudCA+IGh0YWItPnNpemUgKQotCQlfaGdyb3coaHRhYik7Ci0KLQloID0gKEhhc2hFbnRyeSAqKW1hbGxvYyhzaXplb2YoSGFzaEVudHJ5KSk7Ci0JaC0+aF9odmFsID0gaWR4OwkKLQloLT5oX2RhdGEgPSBkYXRhOwotCi0JaHAgPSAmaHRhYi0+dGFibGVbaWR4ICYgaHRhYi0+bWFza107Ci0JaC0+aF9uZXh0ID0gKmhwOwotCSpocCA9IGg7Ci0KLQlUSFJFQURfVU5MT0NLKGhhc2gpOwotCi0JcmV0dXJuIGg7Ci19Ci0KLXZvaWQKLUhhc2hSZW1vdmUoSGFzaCAqaHRhYiwgdW5zaWduZWQgaW50IGlkeCkKLXsKLQlIYXNoRW50cnkgKgkJaDsKLQlIYXNoRW50cnkgKioJaHA7Ci0JCi0JVEhSRUFEX0xPQ0soaGFzaCk7Ci0JCi0JLyoKLQkqKiBGaW5kIGl0ZW0uCi0JKi8KLQlmb3IgKCBocCA9ICZodGFiLT50YWJsZVtpZHggJiBodGFiLT5tYXNrXSA7ICpocCAhPSBOVUxMICYmICgqaHApLT5oX2h2YWwgIT0gaWR4IDsgKQotCQlocCA9ICYoKmhwKS0+aF9uZXh0OwotCi0JLyoKLQkgKiBGb3VuZCBpdGVtPwotCSAqLwotCWlmICgqaHAgPT0gTlVMTCkgewotCQlUSFJFQURfVU5MT0NLKGhhc2gpOwotCQlyZXR1cm47Ci0JfQotCQotCS8qCi0JICogVXBkYXRlIHNjYW4gdmFsdWVzCi0JICovCi0JaWYgKGh0YWItPnNjYW5fZW50cnkgPT0gKmhwKQotCQlodGFiLT5zY2FuX2VudHJ5ID0gaHRhYi0+c2Nhbl9lbnRyeS0+aF9uZXh0OwotCQotCS8qCi0JKiogUmVtb3ZlIGl0ZW0uCi0JKi8KLQloID0gKmhwOwotCSpocCA9ICgqaHApLT5oX25leHQ7Ci0JZnJlZShoKTsKLQotCWh0YWItPmNvdW50LS07Ci0JCi0JVEhSRUFEX1VOTE9DSyhoYXNoKTsKLX0KLQotdm9pZAotSGFzaFNldChIYXNoICpodGFiKQotewotCVRIUkVBRF9MT0NLKGhhc2gpOwotCWh0YWItPnNjYW4gPSAwOwotCWh0YWItPnNjYW5fZW50cnkgPSBOVUxMOwotCVRIUkVBRF9VTkxPQ0soaGFzaCk7Ci19Ci0KLUhhc2hFbnRyeSAqCi1IYXNoR2V0KEhhc2ggKmh0YWIpCi17Ci0JSGFzaEVudHJ5ICoJaDsKLQkKLQlUSFJFQURfTE9DSyhoYXNoKTsKLQkKLQlpZiAoKGggPSBodGFiLT5zY2FuX2VudHJ5KSAhPSBOVUxMKSB7Ci0JCWh0YWItPnNjYW5fZW50cnkgPSBodGFiLT5zY2FuX2VudHJ5LT5oX25leHQ7Ci0JCVRIUkVBRF9VTkxPQ0soaGFzaCk7Ci0JCXJldHVybiBoOwotCX0KLQkKLQl3aGlsZSAoaHRhYi0+c2NhbiA8IGh0YWItPnNpemUpIHsKLQkJaWYgKChoID0gaHRhYi0+dGFibGVbaHRhYi0+c2NhbisrXSkgIT0gTlVMTCkgewotCQkJaHRhYi0+c2Nhbl9lbnRyeSA9IGgtPmhfbmV4dDsKLQkJCVRIUkVBRF9VTkxPQ0soaGFzaCk7Ci0JCQlyZXR1cm4gaDsKLQkJfQotCX0KLQkKLQlUSFJFQURfVU5MT0NLKGhhc2gpOwotCQotCXJldHVybiBOVUxMOwotfQkKLQotc3RhdGljIHZvaWQKLV9oZ3JvdyhIYXNoICpodGFiKQotewotCXVuc2lnbmVkIGludAlpOwotCXVuc2lnbmVkIGludAluc2l6ZTsKLQl1bnNpZ25lZCBpbnQJbm1hc2s7Ci0JSGFzaEVudHJ5ICoqCW50YWI7Ci0KLQluc2l6ZSA9ICh1bnNpZ25lZCBpbnQpKDEgPDwgKytodGFiLT5sb2dzaXplKTsKLQlubWFzayA9IG5zaXplIC0gMTsKLQludGFiID0gKEhhc2hFbnRyeSAqKiltYWxsb2MobnNpemUgKiBzaXplb2YoSGFzaEVudHJ5ICopKTsKLQotCWZvciAoIGkgPSAwIDsgaSA8IG5zaXplIDsgaSsrICkKLQkJbnRhYltpXSA9IChIYXNoRW50cnkgKilOVUxMOwotCi0JLyoKLQkqKiBNb3ZlIG9sZCBlbnRyaWVzIHRvIG5ldyB0YWJsZS4KLQkqLwotCWZvciAoIGkgPSAwIDsgaSA8IGh0YWItPnNpemUgOyBpKysgKQotCXsKLQkJSGFzaEVudHJ5ICoJCWg7Ci0JCUhhc2hFbnRyeSAqCQloMjsKLQkJSGFzaEVudHJ5ICoqCWhwOwotCi0JCWZvciAoIGggPSBodGFiLT50YWJsZVtpXSA7IGggIT0gKEhhc2hFbnRyeSAqKU5VTEwgOyApCi0JCXsKLQkJCWgyID0gaDsKLQkJCWggPSBoLT5oX25leHQ7Ci0KLQkJCWhwID0gJm50YWJbaDItPmhfaHZhbCAmIG5tYXNrXTsKLQkJCWgyLT5oX25leHQgPSAqaHA7Ci0JCQkqaHAgPSBoMjsKLQkJfQotCX0KLQotCWZyZWUoaHRhYi0+dGFibGUpOwotCi0JaHRhYi0+dGFibGUgPSBudGFiOwotCWh0YWItPnNpemUgPSBuc2l6ZTsKLQlodGFiLT5tYXNrID0gbm1hc2s7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvbGlzdC5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyYTY2OS4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIE5PVEU6IFRoaXMgbGlzdCBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkIGFjcm9zcyBsaXN0IGl0ZXJhdGlvbi4gSWYgdGhlcmUgYXJlIHR3byB0aHJlYWRzIAotICogc2ltdWx0YW5lb3VzbHkgYWNjZXNzaW5nIHRoZSBsaXN0LCB0aGVuIG9uZSB0aHJlYWQgbWF5IGFmZmVjdCB0aGUgb3RoZXIncyBsaXN0IGFjY2Vzcy4gRm9yIGluc3RhbmNlLCAKLSAqIGlmIHRocmVhZCAxIGNhbGxzIEdldE5leHRFbGVtZW50KCksIHRoZW4gdGhyZWFkIDIgY2FsbHMgR2V0TGlzdEVsZWxlbXQoKSwgdGhlbiB0aGUgbmV4dCB0aW1lIHRocmVhZCAxIGNhbGxzCi0gKiBHZXRMaXN0RWxlbWVudCgpLCBpdCB3aWxsIGdldCB0aGUgM3JkIGVsZW1lbnQgaW4gdGhlIGxpc3QsIG5vdCB0aGUgMm5kLiBBbHNvLCBpZiB0d28gdGhyZWFkcyBhcmUgYWNjZXNzaW5nIAotICogb2JqZWN0cyBpbiB0aGUgbGlzdCwgYW5kIGZyZWVpbmcgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhvc2Ugb2JqZWN0cyB3aGlsZSB0cmF2ZXJzaW5nIHRoZSBsaXN0LCB0aGVuIHRoaXMgCi0gKiBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlcmUgdGhyZWFkIDEgZnJlZXMgZGF0YSB0aGF0IHRocmVhZCAyIGlzIGFib3V0IHRvIGFjY2Vzcy4KLSAqIAotICogQXBwbGljYXRpb25zIHdpc2hpbmcgdG8gdXNlIHRocmVhZHMgdG8gYWNjZXNzIGxpc3RzIGluIHRoaXMgd2F5IHNob3VsZCBwcm92aWRlIGZ1bmN0aW9ucyB0aGF0IG9idGFpbiAKLSAqIGFuZCByZWxlYXNlIGEgZ2xvYmFsIGxvY2sgb24gdGhlIGxpc3Qgd2hpY2ggcHJldmVudHMgYW55IG90aGVyIHRocmVhZCBmcm9tIGFjY2Vzc2luZyB0aGUgbGlzdCB3aGlsZSAKLSAqIHRoYXQgbG9jayBpcyBoZWxkLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZQkiY29tcGF0LmgiCi0jaW5jbHVkZQkibGlzdC5oIgotCi1USFJFQURfREVDTChsaXN0KTsKLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBlbXB0eSBsaXN0Ci0gKi8KLUxpc3QgKgotTmV3TGlzdCh2b2lkKQotewotCUxpc3QgKglsOwotCi0JbCA9IChMaXN0ICopbWFsbG9jKHNpemVvZihMaXN0KSk7Ci0KLQlsLT5sX2hlYWQgPSAoTGlzdEVsZW1lbnQgKilOVUxMOwotCWwtPmxfdGFpbCA9ICZsLT5sX2hlYWQ7Ci0JbC0+bF9uZWwgPSAwOwotCWwtPmxfc2NhbiA9IE5VTEw7Ci0KLQlyZXR1cm4gbDsKLX0KLQotLyoKLSAqIEFkZCBuZXcgZWxlbWVudCB0byBlbmQgb2YgbGlzdC4KLSAqLwotdm9pZAkJCi1BZGRUb0xpc3QoTGlzdCAqbCwgdm9pZCAqdikKLXsKLQlMaXN0RWxlbWVudCAqCWU7Ci0KLQlpZiAoIGwgPT0gKExpc3QgKilOVUxMKQotCQlyZXR1cm47Ci0KLQllID0gbWFsbG9jKHNpemVvZihMaXN0RWxlbWVudCkpOwotCi0JZS0+bF92YWx1ZSA9IHY7Ci0JZS0+bF9uZXh0ID0gKExpc3RFbGVtZW50ICopTlVMTDsKLQkKLQlUSFJFQURfTE9DSyhsaXN0KTsKLQkKLQkqKGwtPmxfdGFpbCkgPSBlOwotCWwtPmxfdGFpbCA9ICZlLT5sX25leHQ7Ci0JbC0+bF9uZWwrKzsKLQkKLQlUSFJFQURfVU5MT0NLKGxpc3QpOwotfQotCi0vKgotICogQWRkIG5ldyBlbGVtZW50IHRvIGJlZ2lubmluZyBvZiBsaXN0IChzdGFjayBlbXVsYXRpb24pLgotICovCi12b2lkCQkKLUFkZEZpcnN0KExpc3QgKmwsIHZvaWQgKnYpCi17Ci0JTGlzdEVsZW1lbnQgKgllOwotCUxpc3RFbGVtZW50ICoJZXA7Ci0KLQlpZiAobCA9PSAoTGlzdCAqKU5VTEwpCi0JCXJldHVybjsKLQotCWUgPSBtYWxsb2Moc2l6ZW9mKExpc3RFbGVtZW50KSk7Ci0KLQllLT5sX3ZhbHVlID0gdjsKLQllLT5sX25leHQgPSBsLT5sX2hlYWQ7Ci0KLQlUSFJFQURfTE9DSyhsaXN0KTsKLQkKLQkvKgotCSoqIEFkanVzdCB0YWlsIGlmIG5lY2Vzc2FyeS4KLQkqLwotCWlmCi0JKAotCQkoZXAgPSBsLT5sX2hlYWQpICE9IChMaXN0RWxlbWVudCAqKU5VTEwgCi0JCSYmCi0JCWVwLT5sX25leHQgPT0gKExpc3RFbGVtZW50ICopTlVMTCAKLQkpCi0JCWwtPmxfdGFpbCA9ICZlcC0+bF9uZXh0OwotCi0JbC0+bF9oZWFkID0gZTsKLQlsLT5sX25lbCsrOwotCQotCVRIUkVBRF9VTkxPQ0sobGlzdCk7Ci19Ci0KLS8qCi0gKiBJbnNlcnQgbmV3IGVsZW1lbnQgYmVmb3JlIGdpdmVuIGVsZW1lbnQKLSAqLwotdm9pZAotSW5zZXJ0QmVmb3JlKExpc3QgKmwsIHZvaWQgKnZhbCwgdm9pZCAqbmV3X3ZhbCkgCi17Ci0JTGlzdEVsZW1lbnQgKioJZTsKLQlMaXN0RWxlbWVudCAqCW5lOwotCi0JaWYgKGwgPT0gKExpc3QgKilOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLyoKLQkgKiBGaW5kIHRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdmFsCi0JICovCi0JVEhSRUFEX0xPQ0sobGlzdCk7Ci0JZm9yIChlID0gJmwtPmxfaGVhZCA7ICplICE9IChMaXN0RWxlbWVudCAqKU5VTEwgOyBlID0gJigqZSktPmxfbmV4dCkgewotCQlpZiAoKCplKS0+bF92YWx1ZSA9PSB2YWwpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCVRIUkVBRF9VTkxPQ0sobGlzdCk7Ci0JCi0JaWYgKCplID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQotCW5lID0gbWFsbG9jKHNpemVvZihMaXN0RWxlbWVudCkpOwotCi0JbmUtPmxfdmFsdWUgPSBuZXdfdmFsOwotCVRIUkVBRF9MT0NLKGxpc3QpOwotCW5lLT5sX25leHQgPSAqZTsKLQkqZSA9IG5lOwotCWwtPmxfbmVsKys7Ci0JVEhSRUFEX1VOTE9DSyhsaXN0KTsJCi19Ci0KLS8qCi0gKiBBcHBlbmQgc291cmNlIGxpc3QgdG8gZGVzdGluYXRpb24gbGlzdAotICovCi12b2lkCi1BcHBlbmRMaXN0KExpc3QgKmRzdCwgTGlzdCAqc3JjKQotewotCXZvaWQgKgllOwotCi0JU2V0TGlzdChzcmMpOwotCi0Jd2hpbGUgKCAoZSA9IEdldExpc3RFbGVtZW50KHNyYykpICE9ICh2b2lkICopTlVMTCkKLQkJQWRkVG9MaXN0KGRzdCwgZSk7Ci19Ci0KLS8qCi0gKiBSZW1vdmUgZWxlbWVudCBmcm9tIGxpc3QKLSAqLwotdm9pZAkJCi1SZW1vdmVGcm9tTGlzdChMaXN0ICpsLCB2b2lkICp2KQotewotCUxpc3RFbGVtZW50ICoJZTsKLQlMaXN0RWxlbWVudCAqCWVwOwotCi0JVEhSRUFEX0xPQ0sobGlzdCk7Ci0JCi0JaWYgKCBsID09IChMaXN0ICopTlVMTCB8fCBsLT5sX25lbCA9PSAwICkgewotCQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yICggZXAgPSBlID0gbC0+bF9oZWFkIDsgZSAhPSAoTGlzdEVsZW1lbnQgKilOVUxMIDsgKQotCXsKLQkJaWYgKCBlLT5sX3ZhbHVlICE9IHYgKQotCQl7Ci0JCQlpZiAoIGVwICE9IGUgKQotCQkJCWVwID0gZXAtPmxfbmV4dDsKLQkJCWUgPSBlLT5sX25leHQ7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICggbC0+bF9zY2FuID09IGUgKQotCQkJbC0+bF9zY2FuID0gZXA7Ci0KLQkJaWYgKCBlcCA9PSBlICkKLQkJewotCQkJbC0+bF9oZWFkID0gZS0+bF9uZXh0OwotCi0JCQlpZiAoIGUtPmxfbmV4dCA9PSAoTGlzdEVsZW1lbnQgKilOVUxMICkKLQkJCQlsLT5sX3RhaWwgPSAmbC0+bF9oZWFkOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZXAtPmxfbmV4dCA9IGUtPmxfbmV4dDsKLQotCQkJaWYgKCBlLT5sX25leHQgPT0gKExpc3RFbGVtZW50ICopTlVMTCApCi0JCQkJbC0+bF90YWlsID0gJmVwLT5sX25leHQ7Ci0JCX0KLQotCQlmcmVlKGUpOwotCi0JCWJyZWFrOwotCX0KLQotCWwtPmxfbmVsLS07Ci0JCi0JVEhSRUFEX1VOTE9DSyhsaXN0KTsKLX0KLQotLyoKLSAqIFJlbW92ZSBmaXJzdCBlbGVtZW50IG9mIGxpc3QgKHN0YWNrIGVtdWxhdGlvbikKLSAqLwotdm9pZCAqCi1SZW1vdmVGaXJzdChMaXN0ICpsKQotewotCXZvaWQgKgkJdjsKLQlMaXN0RWxlbWVudCAqCWU7Ci0JTGlzdEVsZW1lbnQgKgllcDsKLQotCVRIUkVBRF9MT0NLKGxpc3QpOwotCi0JaWYgKCBsID09IChMaXN0ICopTlVMTCB8fCBsLT5sX25lbCA9PSAwICkgewotCQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCQlyZXR1cm4gKHZvaWQgKilOVUxMOwotCX0KLQotCWVwID0gZSA9IGwtPmxfaGVhZDsKLQotCWlmICggbC0+bF9zY2FuID09IGUgKQotCQlsLT5sX3NjYW4gPSBlLT5sX25leHQ7Ci0KLQlsLT5sX2hlYWQgPSBlLT5sX25leHQ7Ci0KLQlpZiAoIGUtPmxfbmV4dCA9PSAoTGlzdEVsZW1lbnQgKilOVUxMICkKLQkJbC0+bF90YWlsID0gJmwtPmxfaGVhZDsKLQotCXYgPSBlLT5sX3ZhbHVlOwotCi0JZnJlZShlKTsKLQotCWwtPmxfbmVsLS07Ci0KLQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCi0JcmV0dXJuIHY7Ci19Ci0KLS8qCi0gKiBEZXN0cm95IGxpc3QgYW5kIGl0cyBjb250ZW50cwotICovCi12b2lkCQkKLURlc3Ryb3lMaXN0KExpc3QgKmwsIHZvaWQgKCpkZXN0cm95KSgpKQotewotCUxpc3RFbGVtZW50ICoJZXA7Ci0JTGlzdEVsZW1lbnQgKgllbjsKLQotCWlmICggbCA9PSAoTGlzdCAqKU5VTEwgKQotCQlyZXR1cm47Ci0KLQlUSFJFQURfTE9DSyhsaXN0KTsKLQotCWVwID0gbC0+bF9oZWFkOwotCi0Jd2hpbGUgKCBlcCAhPSAoTGlzdEVsZW1lbnQgKilOVUxMICkKLQl7Ci0JCWVuID0gZXAtPmxfbmV4dDsKLQotCQlpZiAoIGRlc3Ryb3kgIT0gKHZvaWQgKCopKCkpTlVMTCApCi0JCQlkZXN0cm95KGVwLT5sX3ZhbHVlKTsKLQotCQlmcmVlKGVwKTsKLQotCQllcCA9IGVuOwotCX0KLQotCWZyZWUobCk7Ci0KLQlUSFJFQURfVU5MT0NLKGxpc3QpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBsaXN0IGl0ZXJhdG9yCi0gKi8KLXZvaWQKLVNldExpc3QoTGlzdCAqbCkKLXsKLQlpZiAoIGwgPT0gKExpc3QgKilOVUxMICkKLQkJcmV0dXJuOwotCi0JVEhSRUFEX0xPQ0sobGlzdCk7Ci0JbC0+bF9zY2FuID0gbC0+bF9oZWFkOwotCVRIUkVBRF9VTkxPQ0sobGlzdCk7Ci19Ci0KLS8qCi0gKiBHZXQgbmV4dCBlbGVtZW50IGZyb20gbGlzdC4gUmV0dXJucyBOVUxMIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMKLSAqLwotdm9pZCAqCi1HZXRMaXN0RWxlbWVudChMaXN0ICpsKQotewotCXZvaWQgKgkJCXZhbDsKLQlMaXN0RWxlbWVudCAqCWxlOwotCi0JVEhSRUFEX0xPQ0sobGlzdCk7Ci0JCi0JaWYgKCBsID09IChMaXN0ICopTlVMTCB8fCBsLT5sX3NjYW4gPT0gKExpc3RFbGVtZW50ICopTlVMTCApIHsKLQkJVEhSRUFEX1VOTE9DSyhsaXN0KTsKLQkJcmV0dXJuICh2b2lkICopTlVMTDsKLQl9Ci0KLQlsZSA9IGwtPmxfc2NhbjsKLQlsLT5sX3NjYW4gPSBsZS0+bF9uZXh0OwotCQotCXZhbCA9IGxlLT5sX3ZhbHVlOwotCQotCVRIUkVBRF9VTkxPQ0sobGlzdCk7Ci0JCi0JcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIEdldCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdAotICovCi12b2lkICoKLUdldEZpcnN0RWxlbWVudChMaXN0ICpsKQotewotCXZvaWQgKgl2YWw7Ci0JCi0JVEhSRUFEX0xPQ0sobGlzdCk7Ci0JCi0JaWYgKCBsID09IChMaXN0ICopTlVMTCB8fCBsLT5sX2hlYWQgPT0gKExpc3RFbGVtZW50ICopIE5VTEwpIHsKLQkJVEhSRUFEX1VOTE9DSyhsaXN0KTsKLQkJcmV0dXJuICh2b2lkICopTlVMTDsKLQl9Ci0KLQl2YWwgPSBsLT5sX2hlYWQtPmxfdmFsdWU7Ci0JCi0JVEhSRUFEX1VOTE9DSyhsaXN0KTsKLQkKLQlyZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2hlY2sgaWYgdGhlIGxpc3QgaXMgZW1wdHkuIFJldHVybnMgdHJ1ZSAoMSkgaWYgaXQgaXMuCi0gKi8KLWludAotRW1wdHlMaXN0KExpc3QgKmwpCi17Ci0JaW50CXJlczsKLQkKLQlUSFJFQURfTE9DSyhsaXN0KTsKLQlyZXMgPSAoaW50KShsID09IChMaXN0ICopTlVMTCB8fCBsLT5sX25lbCA9PSAwKTsKLQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBDaGVjayBpZiBlbGVtZW50IGlzIGluIHRoZSBsaXN0Ci0gKi8KLWludAotSW5MaXN0KExpc3QgKmwsIHZvaWQgKnYpCi17Ci0JTGlzdEVsZW1lbnQgKgllOwotCi0JVEhSRUFEX0xPQ0sobGlzdCk7Ci0KLQlpZiAoIGwgPT0gKExpc3QgKilOVUxMICkgewotCQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKCBlID0gbC0+bF9oZWFkIDsgZSAhPSAoTGlzdEVsZW1lbnQgKilOVUxMIDsgZSA9IGUtPmxfbmV4dCApIHsKLQkJaWYgKCBlLT5sX3ZhbHVlID09IHYgKSB7Ci0JCQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlUSFJFQURfVU5MT0NLKGxpc3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdAotICovCi1pbnQKLVNpemVPZkxpc3QoTGlzdCAqbCkKLXsKLQlpbnQJcmVzOwotCQotCWlmICggbCA9PSAoTGlzdCAqKU5VTEwgKQotCQlyZXR1cm4gMDsKLQotCVRIUkVBRF9MT0NLKGxpc3QpOwotCXJlcyA9IGwtPmxfbmVsOwotCVRIUkVBRF9VTkxPQ0sobGlzdCk7Ci0JCi0JcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9yYW5nZXNldC5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL3Jhbmdlc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTYyOGIuLjAwMDAwMDAKLS0tIGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL3Jhbmdlc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAicmFuZ2VzZXQuaCIKLQotI2RlZmluZSBJTklUSUFMX1NJWkUJQlVGU0laCi0KLXN0YXRpYyBzdHJfYnVmICoKLW5ld19idWYodm9pZCkKLXsKLQlzdHJfYnVmICoJYnVmID0gKHN0cl9idWYgKiltYWxsb2Moc2l6ZW9mKHN0cl9idWYpKTsKLQlidWYtPmNvbnRlbnRzID0gKGNoYXIgKiltYWxsb2MoSU5JVElBTF9TSVpFKTsKLQlidWYtPmNvbnRlbnRzWzBdID0gJ1wwJzsKLQlidWYtPmxlbiA9IElOSVRJQUxfU0laRTsKLQlidWYtPmNvdW50ID0gMDsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgdm9pZAotYnVmX3ByaW50ZihzdHJfYnVmICpidWYsIGNoYXIgKmZtdCwgLi4uKQotewotCWludCAJbGVuOwotCWNoYXIgKglzdHI7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICAKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICB2YXNwcmludGYoJnN0ciwgZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLQotCWxlbiA9IHN0cmxlbihzdHIpOwotCQotCXdoaWxlIChidWYtPmNvdW50ICsgbGVuID49IGJ1Zi0+bGVuKSB7Ci0JCWJ1Zi0+bGVuICo9IDI7Ci0JCWJ1Zi0+Y29udGVudHMgPSAoY2hhciAqKXJlYWxsb2MoYnVmLT5jb250ZW50cywgYnVmLT5sZW4pOwotCX0KLQkKLQltZW1jcHkoYnVmLT5jb250ZW50cyArIGJ1Zi0+Y291bnQsIHN0ciwgbGVuKTsKLQlidWYtPmNvdW50ICs9IGxlbjsKLQlidWYtPmNvbnRlbnRzW2J1Zi0+Y291bnRdID0gJ1wwJzsKLQkKLQlmcmVlKHN0cik7Ci19Ci0KLXZvaWQKLXJlc2V0X2J1ZihzdHJfYnVmICpidWYpCi17Ci0JYnVmLT5jb3VudCA9IDA7Ci19Ci0KLWNoYXIgKgotYnVmX2NvbnRlbnRzKHN0cl9idWYgKmJ1ZikKLXsKLQlyZXR1cm4gYnVmLT5jb250ZW50czsKLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfYnVmKHN0cl9idWYgKmJ1ZikKLXsKLQlmcmVlKGJ1Zi0+Y29udGVudHMpOwotCWZyZWUoYnVmKTsKLX0KLQotcmFuZ2VzZXQgKgotbmV3X3Jhbmdlc2V0KHZvaWQpCi17Ci0JcmFuZ2VzZXQgKiBzZXQgPSAocmFuZ2VzZXQgKiltYWxsb2Moc2l6ZW9mKHJhbmdlc2V0KSk7Ci0Jc2V0LT5lbGVtZW50cyA9IE5ld0xpc3QoKTsKLQlzZXQtPmJ1ZiA9IG5ld19idWYoKTsKLQlzZXQtPmNoYW5nZWQgPSAwOwotCXJldHVybiBzZXQ7Ci19Ci0KLXN0YXRpYyByYW5nZSAqCi1uZXdfcmFuZ2UoaW50IGxvdywgaW50IGhpZ2gpCi17Ci0JcmFuZ2UgKiByID0gKHJhbmdlICopbWFsbG9jKHNpemVvZihyYW5nZSkpOwotCXItPmxvdyA9IGxvdzsKLQlyLT5oaWdoID0gaGlnaDsKLQlyZXR1cm4gcjsKLX0KLQotdm9pZAotaW5zZXJ0X2luX3Jhbmdlc2V0KHJhbmdlc2V0ICpzZXQsIGludCB2YWwpCi17Ci0JcmFuZ2UgKiByOwotCXJhbmdlICoJZWxlbWVudDsKLQlyYW5nZSAqIGxhc3QgPSBOVUxMOwotCQotCWlmIChFbXB0eUxpc3Qoc2V0LT5lbGVtZW50cykpIHsKLQkJciA9IG5ld19yYW5nZSh2YWwsIHZhbCk7Ci0JCUFkZFRvTGlzdChzZXQtPmVsZW1lbnRzLCByKTsKLQl9IGVsc2UgewotCQlmb3IgKFNldExpc3Qoc2V0LT5lbGVtZW50cyk7IChlbGVtZW50ID0gKHJhbmdlICopR2V0TGlzdEVsZW1lbnQoc2V0LT5lbGVtZW50cykpICE9IE5VTEw7ICkgewotCQkJaWYgKHZhbCA8IGVsZW1lbnQtPmxvdyAtIDEpIHsKLQkJCQlpZiAobGFzdCA9PSBOVUxMKSB7Ci0JCQkJCXIgPSBuZXdfcmFuZ2UodmFsLCB2YWwpOwotCQkJCQlBZGRGaXJzdChzZXQtPmVsZW1lbnRzLCByKTsKLQkJCQl9IGVsc2UgaWYgKGxhc3QgIT0gTlVMTCAmJiB2YWwgPiBsYXN0LT5oaWdoICsgMSkgewotCQkJCQlyID0gbmV3X3JhbmdlKHZhbCwgdmFsKTsKLQkJCQkJSW5zZXJ0QmVmb3JlKHNldC0+ZWxlbWVudHMsIGVsZW1lbnQsIHIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodmFsID09IGVsZW1lbnQtPmxvdyAtIDEpIHsKLQkJCQllbGVtZW50LT5sb3cgPSB2YWw7Ci0JCQl9IGVsc2UgaWYgKHZhbCA9PSBlbGVtZW50LT5oaWdoICsgMSkgewotCQkJCWVsZW1lbnQtPmhpZ2ggPSB2YWw7Ci0JCQl9Ci0JCQkKLQkJCWxhc3QgPSBlbGVtZW50OwotCQl9Ci0JCQotCQlpZiAodmFsID4gbGFzdC0+aGlnaCArIDEpIHsKLQkJCXIgPSBuZXdfcmFuZ2UodmFsLCB2YWwpOwotCQkJQWRkVG9MaXN0KHNldC0+ZWxlbWVudHMsIHIpOwotCQl9Ci0JfQotCQotCXNldC0+Y2hhbmdlZCA9IDE7Ci19Ci0KLWNoYXIgKgotcmFuZ2VzZXRfdG9fc3RyaW5nKHJhbmdlc2V0ICpzZXQpCi17Ci0JaW50CQkJZmlyc3QgPSAxOwotCXJhbmdlICoJCWVsZW1lbnQ7Ci0JCi0JaWYgKHNldC0+Y2hhbmdlZCkgewotCQlyZXNldF9idWYoc2V0LT5idWYpOwotCQkKLQkJZm9yIChTZXRMaXN0KHNldC0+ZWxlbWVudHMpOyAoZWxlbWVudCA9IChyYW5nZSAqKUdldExpc3RFbGVtZW50KHNldC0+ZWxlbWVudHMpKSAhPSBOVUxMOyApIHsKLQkJCWlmICghZmlyc3QpIHsKLQkJCQlidWZfcHJpbnRmKHNldC0+YnVmLCAiLCIpOwotCQkJfSBlbHNlIHsKLQkJCQlmaXJzdCA9IDA7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC0+bG93ID09IGVsZW1lbnQtPmhpZ2gpIHsKLQkJCQlidWZfcHJpbnRmKHNldC0+YnVmLCAiJWQiLCBlbGVtZW50LT5sb3cpOwotCQkJfSBlbHNlIHsKLQkJCQlidWZfcHJpbnRmKHNldC0+YnVmLCAiJWQtJWQiLCBlbGVtZW50LT5sb3csIGVsZW1lbnQtPmhpZ2gpOwotCQkJfQotCQl9Ci0JCQotCQlzZXQtPmNoYW5nZWQgPSAwOwotCX0KLQkKLQlyZXR1cm4gYnVmX2NvbnRlbnRzKHNldC0+YnVmKTsKLX0KLQotdm9pZAotZnJlZV9yYW5nZXNldChyYW5nZXNldCAqc2V0KQotewotCURlc3Ryb3lMaXN0KHNldC0+ZWxlbWVudHMsIGZyZWUpOwotCWZyZWVfYnVmKHNldC0+YnVmKTsKLQlmcmVlKHNldCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvcmFuZ2VzZXRfdGVzdC5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL3Jhbmdlc2V0X3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNmI2OC4uMDAwMDAwMAotLS0gYS9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy9zcmMvcmFuZ2VzZXRfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJyYW5nZXNldC5oIgotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlyYW5nZXNldCAqCXNldCA9IG5ld19yYW5nZXNldCgpOwotCi0JaW5zZXJ0X2luX3Jhbmdlc2V0KHNldCwgNSk7Ci0JcHJpbnRmKCJyYW5nZXNldCA9ICVzXG4iLCByYW5nZXNldF90b19zdHJpbmcoc2V0KSk7Ci0KLQlpbnNlcnRfaW5fcmFuZ2VzZXQoc2V0LCAxKTsKLQlpbnNlcnRfaW5fcmFuZ2VzZXQoc2V0LCAyKTsKLQlpbnNlcnRfaW5fcmFuZ2VzZXQoc2V0LCA2KTsKLQlpbnNlcnRfaW5fcmFuZ2VzZXQoc2V0LCA3KTsKLQlpbnNlcnRfaW5fcmFuZ2VzZXQoc2V0LCA0KTsKLQlpbnNlcnRfaW5fcmFuZ2VzZXQoc2V0LCAxNSk7Ci0JaW5zZXJ0X2luX3Jhbmdlc2V0KHNldCwgOSk7Ci0JaW5zZXJ0X2luX3Jhbmdlc2V0KHNldCwgMTQpOwotCi0JcHJpbnRmKCJyYW5nZXNldCA9ICVzXG4iLCByYW5nZXNldF90b19zdHJpbmcoc2V0KSk7Ci0JCi0JZnJlZV9yYW5nZXNldChzZXQpOwotCQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL3NlcmRlcy5jIGIvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMvc3JjL3NlcmRlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY3YzZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzL3NyYy9zZXJkZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJkZXMuaCIKLQotLyoKLSAqIENvbnZlcnQgYSBoZXhhZGVjaW1hbCBzdHJpbmcgY29udGFpbmluZyBsZW4gZGlnaXRzIGludG8gYW4gaW50ZWdlci4KLSAqLwotdW5zaWduZWQgaW50Ci1oZXhfc3RyX3RvX2ludChjaGFyICpzdHIsIGludCBsZW4sIGNoYXIgKiplbmQpCi17Ci0JaW50CQkJCW47Ci0JdW5zaWduZWQgaW50CXZhbCA9IDA7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgbGVuICYmICpzdHIgIT0gJ1wwJyAmJiBpc3hkaWdpdCgqc3RyKTsgbisrLCBzdHIrKykgewotCQl2YWwgPDw9IDQ7Ci0JCXZhbCArPSBkaWdpdHRvaW50KCpzdHIpOwotCX0KLQotCWlmIChlbmQgIT0gTlVMTCkgewotCQkqZW5kID0gc3RyOwotCX0KLQotCXJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIGludGVnZXIgdG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcgb2YgbGVuIGRpZ2l0cy4KLSAqLwotdm9pZAotaW50X3RvX2hleF9zdHIodW5zaWduZWQgaW50IHZhbCwgY2hhciAqc3RyLCBpbnQgbGVuLCBjaGFyICoqZW5kKQotewotCWNoYXIgKglidWYgPSAoY2hhciAqKW1hbGxvYyhsZW4rMSk7Ci0KLQkvKgotCSAqIE5lZWQgYSBzZXBhcmF0ZSBidWZmZXIgYmVjYXVzZSBzcHJpbnRmIGFkZHMgYSBudWxsIHRvCi0JICogdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCSAqLwotCXNwcmludGYoYnVmLCAiJTAqeCIsIGxlbiwgdmFsICYgMHhmZmZmZmZmZik7Ci0KLQltZW1jcHkoc3RyLCBidWYsIGxlbik7Ci0KLQlpZiAoZW5kICE9IE5VTEwpIHsKLQkJKmVuZCA9IHN0ciArIGxlbjsKLQl9Ci0KLQlmcmVlKGJ1Zik7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS8uY2xhc3NwYXRoIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNGYzMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwZGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvLmN2c2lnbm9yZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTY5MWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1kb2MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS8ucHJvamVjdCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDJiNmEzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzg3MzMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBKdW4gMjIgMTg6NTA6MzMgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcbiAqIEByZXR1cm4gdGhlICR7YmFyZV9maWVsZF9uYW1lfVxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcbiAqIEBwYXJhbSAke3BhcmFtfSB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldFxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXG4gKiBAYXV0aG9yICR7dXNlcn1cbiAqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCI+LyoqXG4gKiBcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZGVsZWdhdGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBkZWxlZ2F0ZSBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmRlbGVnYXRlY29tbWVudCIgbmFtZVw9ImRlbGVnYXRlY29tbWVudCI+LyoqXG4gKiAke3RhZ3N9XG4gKiAke3NlZV90b190YXJnZXR9XG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIFxuICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgXG4gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSBcbiAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyBcbiAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgXG4gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgXG4gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgXG4gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCBcbiAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC5cbiAqIFxuICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIFxuICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4gKiBcbiAqIExBLUNDIDA0LTExNVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4ke2ZpbGVjb21tZW50fVxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxuXG4vKipcbiAqIEBhdXRob3IgJHt1c2VyfVxuICpcbiAqL1xuJHt0eXBlY29tbWVudH1cbiR7dHlwZV9kZWNsYXJhdGlvbn1cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xuJHtleGNlcHRpb25fdmFyfS5wcmludFN0YWNrVHJhY2UoKTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDljZmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudCwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5sYXVuY2gsCi0gb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwsCi0gb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLAotIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudCwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlciwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwsCi0gb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZiwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdCwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAsCi0gb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvYWJvdXQuaHRtbCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGY1YTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgcGRpLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUFkZHJlc3NMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJQWRkcmVzc0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMTg2MzYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJQWRkcmVzc0xvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgYWRkcmVzcyBsb2NhdGlvbiBpbiB0aGUgZGVidWdnYWJsZSBwcm9ncmFtCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUFkZHJlc3NMb2NhdGlvbiBleHRlbmRzIElQRElMb2NhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIG9yIG51bGwgaWYgdGhlIGFkZHJlc3MgaXMgdW5rbm93bgotCSAqIEByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbgotCSAqLwotCUJpZ0ludGVnZXIgZ2V0QWRkcmVzcygpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElCcmVha3BvaW50TWFuYWdlbWVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJQnJlYWtwb2ludE1hbmFnZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzNzJhNzkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJQnJlYWtwb2ludE1hbmFnZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBZGRyZXNzQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4Y2VwdGlvbnBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYnJlYWtwb2ludCBhY3Rpb24gbWFuYWdlbWVudC4gRWFjaCBtZXRob2RzIHNlbmQgdG8gZGVidWdnZXIgYW5kIHJlcGxpZWQgYnkgZXZlbnQuCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUJyZWFrcG9pbnRNYW5hZ2VtZW50IHsKLQkvKioKLQkgKiBSZXF1ZXN0cyB0byBzZXQgYSBsaW5lIGJyZWFrcG9pbnQgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzIAotCSAqIEBwYXJhbSBicHQgbGluZSBicmVha3BvaW50IHRvIGJlIHNldAotIAkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRMaW5lQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJTGluZUJyZWFrcG9pbnQgYnB0KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHNldCBhIGZ1bmN0aW9uIGJyZWFrcG9pbnQgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGJwdCBmdW5jdGlvbiBicmVha3BvaW50IHRvIGJlIHNldAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHNldEZ1bmN0aW9uQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJRnVuY3Rpb25CcmVha3BvaW50IGJwdCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXF1ZXN0cyB0byBzZXQgYSBhZGRyZXNzIGJyZWFrcG9pbnQgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGJwdCBhZGRyZXNzIGJyZWFrcG9pbnQgdG8gYmUgc2V0Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc2V0QWRkcmVzc0JyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUFkZHJlc3NCcmVha3BvaW50IGJwdCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHNldCBhIHdhdGNocG9pbnQgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGJwdCB3YXRjaHBvaW50IHRvIGJlIHNldAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHNldFdhdGNocG9pbnQoQml0TGlzdCB0YXNrcywgSVBESVdhdGNocG9pbnQgYnB0KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHNldCBhbiBleGNlcHRpb25wb2ludCBvZiBzcGVjaWZ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gYnB0IGFuIGV4Y2VwdGlvbnBvaW50IHRvIGJlIHNldAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHNldEV4Y2VwdGlvbnBvaW50KEJpdExpc3QgdGFza3MsIElQRElFeGNlcHRpb25wb2ludCBicHQpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gZGVsZXRlIGEgZ2l2ZW4gYnJlYWtwb2ludCBvZiBzcGVjaWZ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gYnBpZCBicmVha3BvaW50IGlkIHRvIGJlIGRlbGV0ZWQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBkZWxldGVCcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCBicGlkKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHNldCBlbmFibGUgLyBkaXNhYmxlIGEgZ2l2ZW4gYnJlYWtwb2ludCBvZiBzcGVjaWZ5IHByb2Nlc3MgIAotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBicGlkIGJyZWFrcG9pbnQgaWQgdG8gYmUgZW5hYmxlZCAvIGRpc2FibGVkCi0JICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBlbmFibGUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRFbmFibGVkQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBpbnQgYnBpZCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHNldCBjb25kaXRpb24gb24gZ2l2ZW4gYnJlYWtwb2ludCBvZiBzcGVjaWZ5IHByb2Nlc3MgCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGJwaWQgYnJlYWtwb2ludCBpZCB0byBiZSBzZXQgY29uZGl0aW9uIAotCSAqIEBwYXJhbSBjb25kaXRpb24gY29uZGl0aW9uIHJ1bGUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRDb25kaXRpb25CcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCBicGlkLCBTdHJpbmcgY29uZGl0aW9uKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJQ29uZGl0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElDb25kaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0ZjNiMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGJyZWFrcG9pbnQgY29uZGl0aW9uCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUNvbmRpdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbgotCSAqLwotCVN0cmluZyBnZXRFeHByZXNzaW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWdub3JlIGNvdW50IG9mIHRoaXMgY29uZGl0aW9uCi0JICogQHJldHVybiB0aGUgaWdub3JlIGNvdW50IG9mIHRoaXMgY29uZGl0aW9uCi0JICovCi0JaW50IGdldElnbm9yZUNvdW50KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgYXJyYXkgb2YgdGhyZWFkIGlkcyBvZiB0aGlzIGNvbmRpdGlvbiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgYXJyYXkgb2YgdGhyZWFkIGlkcyBvZiB0aGlzIGNvbmRpdGlvbgotCSAqLwotCVN0cmluZ1tdIGdldFRocmVhZElkcygpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBib3RoIGNvbmRpdGlvbnMgYXJlIHRoZSBzYW1lCi0JICogQHBhcmFtIGNvbmRpdGlvbiBhbm90aGVyIGNvbmRpdGlvbiB0byBiZSBjb21wYXJlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBib3RoIGNvbmRpdGlvbnMgYXJlIHRoZSBzYW1lCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoSVBESUNvbmRpdGlvbiBjb25kaXRpb24pOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElEZWJ1Z2dlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJRGVidWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExZDkxNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElEZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbnVtYmVyIG9mIG1ldGhvZHMgdG8gY29tbXVuaWNhdGlvbiB0byBhIGRlYnVnZ2VyCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESURlYnVnZ2VyIGV4dGVuZHMgCi0JCQlJUERJQnJlYWtwb2ludE1hbmFnZW1lbnQsIAotCQkJSVBESUV4ZWN1dGVNYW5hZ2VtZW50LCAKLQkJCUlQRElWYXJpYWJsZU1hbmFnZW1lbnQsIAotCQkJSVBESVNpZ25hbE1hbmFnZW1lbnQsIAotCQkJSVBESVN0YWNrZnJhbWVNYW5hZ2VtZW50LCAKLQkJCUlQRElUaHJlYWRNYW5hZ2VtZW50LCAKLQkJCUlQRElNZW1vcnlCbG9ja01hbmFnZW1lbnQgewotCS8qKgotCSAqIFJlcXVlc3RzIGEgc3BlY2lhbCBjb21tYW5kIGZvciBzcGVjaWZ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gY29tbWFuZCBjb21tYW5kCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1hbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBjb21tYW5kKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGlzY29ubmVjdHMgb2JzZXJ2ZXIgZnJvbSBkZWJ1Z2dlcgotCSAqIEBwYXJhbSBvYnNlcnZlciBkaXNjb25uZWN0IG9ic2VydmVyIGZyb20gZGVidWdnZXIKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChPYnNlcnZlciBvYnNlcnZlcikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFjdGlvbiB3aGVuIGVycm9yIG9jY3VycmVkCi0JICogCi0JICogQHBhcmFtIGVycm9yQ29kZSBlcnJvciBjb2RlCi0JICogQHJldHVybiBhbiBhY3Rpb24gd2hlbiBlcnJvciBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JBY3Rpb24oaW50IGVycm9yQ29kZSk7Ci0JCi0JLyoqCi0JICogQ29ubmVjdHMgZGVidWdnZXIgYW5kIGFkZHMgb2JzZXJ2ZXIgdG8gZGVidWdnZXIKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZWdpc3RlciBvYnNlcnZlciBmb3Igbm90aWZ5IGV2ZW50IGZyb20gc2RtCi0JICogCi0JICogQHBhcmFtIG9ic2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoT2JzZXJ2ZXIgb2JzZXJ2ZXIpOwotCQotCS8qKgotCSAqIFN0YXJ0cyBkZWJ1Z2dlcgotCSAqIAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERlYnVnZ2VyKFN0cmluZyBhcHAsIFN0cmluZyBwYXRoLCBTdHJpbmcgZGlyLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFN0b3BzIGRlYnVnZ2VyCi0JICogCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BEZWJ1Z2dlcigpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZGVidWdnZXIuIElmIGFyZ3MgaXMgYW4gZW1wdHkgbGlzdCwgYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBkZWJ1Z2dlcgotCSAqIGFuZCBhZGQgYW55IG5lY2Vzc2FyeSBhcmd1bWVudHMgdG8gdGhlIGxpc3QuIElmIGFyZ3MgaXMgbm90IGVtcHR5LCB0aGVuIGF0dGVtcHQgdG8KLQkgKiBpbml0aWFsaXplIHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgc3VwcGxpZWQgYXJndW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGRlYnVnZ2VyIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGFyZ3MgZGVidWdnZXIgYXJndW1lbnRzCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBMaXN0PFN0cmluZz4gYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJRXhlY3V0ZU1hbmFnZW1lbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUV4ZWN1dGVNYW5hZ2VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2NmYjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJRXhlY3V0ZU1hbmFnZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byByZXN1bWUgYSB0aHJlYWQuCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBzdGVwIGludG8sIG92ZXIsIGFuZCB1bnRpbCBmcm9tIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBsb2NhdGlvbi4gIEltcGxlbWVudGF0aW9ucyBtdXN0IGJlIG5vbi1ibG9ja2luZy4KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHN0ZXAgIHJldHVybiBmcm9tIHRoZSBmcmFtZS4gSW1wbGVtZW50YXRpb25zIG11c3QgYmUgbm9uLWJsb2NraW5nLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElFeGVjdXRlTWFuYWdlbWVudCB7Ci0JLyoqCi0JICogQ2F1c2VzIHRoaXMgdGFyZ2V0IHRvIHJlc3VtZSBpdHMgZXhlY3V0aW9uLiAKLQkgKiBpZiBwYXNzU2lnbmFsIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHRhcmdldCB3YXMgc3VzcGVuZGVkIGJ5IGEgc2lnbmFsIHdoZW4gcmVzdW1pbmcgdGhlIHNpZ25hbCB3aWxsIGJlIGRpc2NhcmRlZAotCSAqIEhhcyBubyBlZmZlY3Qgb24gYSB0YXJnZXQgdGhhdCBpcyBub3Qgc3VzcGVuZGVkLgotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBwYXNzU2lnbmFsIHdoZXRoZXIgdG8gZGlzY2FyZCB0aGUgc2lnbmFsCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgcmVzdW1lKEJpdExpc3QgdGFza3MsIGJvb2xlYW4gcGFzc1NpZ25hbCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlc3VtZSBleGVjdXRpb24gYXQgbG9jYXRpb24uIE5vdGUgdGhlIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2Ugc3RhY2tmcmFtZS4KLQkgKiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBpdCBqdW1wcyBvdXRzaWRlIG9mIHRoZSBzdGFja2ZyYW1lLgotCSAqIENhbiAgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCB0YXJnZXQgaXMgc3VzcGVuZGVkLgotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHJlc3VtZShCaXRMaXN0IHRhc2tzLCBJUERJTG9jYXRpb24gbG9jYXRpb24pIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXN1bWUgZXhlY3V0aW9uIHdoZXJlIHRoZSBwcm9ncmFtIHN0b3BwZWQgYnV0IGltbWVkaWF0ZWx5IGdpdmUgdGhlIHNpZ25hbC4KLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gc2lnbmFsCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgcmVzdW1lKEJpdExpc3QgdGFza3MsIElQRElTaWduYWwgc2lnbmFsKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RlcHMgb3ZlciB0aGUgY3VycmVudCBzb3VyY2UgbGluZS4gaWYgY291bnQgPD0gMCBpdCBpcyBhIGxvb3AuIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIHRhcmdldC90aHJlYWQgaXMgc3VzcGVuZGVkLiAKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gY291bnQgYXMgaW4gYHN0ZXAnLCBidXQgZG8gc28gY291bnQgdGltZXMuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc3RlcE92ZXIoQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RlcHMgb3ZlciB0aGUgY3VycmVudCBtYWNoaW5lIGluc3RydWN0aW9uLiBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCB0YXJnZXQvdGhyZWFkIGlzIHN1c3BlbmRlZC4gaWYgY291bnQgPD0gMCBpdCBpcyBhIGxvb3AuCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGNvdW50IGFzIGluIGBzdGVwT3Zlckluc3RydWN0aW9uJywgYnV0IGRvIHNvIGNvdW50IHRpbWVzLgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHN0ZXBPdmVySW5zdHJ1Y3Rpb24oQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RlcHMgaW50byB0aGUgY3VycmVudCBzb3VyY2UgbGluZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgdGFyZ2V0L3RocmVhZCBpcyBzdXNwZW5kZWQuIGlmIGNvdW50IDw9IDAgaXQgaXMgYSBsb29wLgotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBjb3VudCBhcyBpbiBgc3RlcCcsIGJ1dCBkbyBzbyBjb3VudCB0aW1lcy4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzdGVwSW50byhCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdGVwcyBpbnRvIHRoZSBjdXJyZW50IG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIHRhcmdldC90aHJlYWQgaXMgc3VzcGVuZGVkLiBpZiBjb3VudCA8PSAwIGl0IGlzIGEgbG9vcC4KLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzdGVwSW50b0luc3RydWN0aW9uKEJpdExpc3QgdGFza3MsIGludCBjb3VudCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnRpbnVlcyBydW5uaW5nIHVudGlsIGxvY2F0aW9uIGlzIHJlYWNoZWQuCi0JICogSWYgdGhlIHByb2dyYW0gd2lsbCBiZSBzdXNwZW5kZWQgaWYgYXR0ZW1wdCB0byBleGl0IHRoZSBjdXJyZW50IGZyYW1lLgotCSAqIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIHRhcmdldCBpcyBzdXNwZW5kZWQuCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGxvY2F0aW9uIGxvY2F0aW9uCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc3RlcFVudGlsKEJpdExpc3QgdGFza3MsIElQRElMb2NhdGlvbiBsb2NhdGlvbikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGZyYW1lIHJldHVybi4KLQkgKiBAcGFyYW0gY291bnQgYXMgaW4gYHN0ZXAnLCBidXQgZG8gc28gY291bnQgdGltZXMuCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc3RlcFJldHVybihCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYW5jZWwgZXhlY3V0aW9uIG9mIHRoZSBmcmFtZSBhbmQgcmV0dXJuIHdpdGggdmFsdWUuCi0JICogdmFsdWUgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpZiBubyByZXR1cm4gdmFsdWUgaXMgbmVlZGVkLgotCSAqIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIHRhcmdldC90aHJlYWQgaXMgc3VzcGVuZGVkLgotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBhaWYgdmFsdWUgdXNlIGFzIHRoZSByZXR1cm5pbmcgdmFsdWUuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc3RlcFJldHVybihCaXRMaXN0IHRhc2tzLCBJQUlGIGFpZikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDYXVzZXMgdGhpcyB0YXJnZXQvdGhyZWFkIHRvIHN1c3BlbmQgaXRzIGV4ZWN1dGlvbi4gCi0JICogSGFzIG5vIGVmZmVjdCBvbiBhbiBhbHJlYWR5IHN1c3BlbmRlZCB0aHJlYWQuCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc3VzcGVuZChCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gdGVybWluYXRlIG9mIHNwZWNpZnkgcHJvY2VzcwotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHRlcm1pbmF0ZShCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwkKLQotCS8qKgotCSAqIFRPRE8gbm90IGltcGxlbWVudGVkIHlldCBpbiAyLjAKLQkgKiBSZXF1ZXN0cyB0byByZXN0YXJ0IG9mIGRlYnVnZ2luZwotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHJlc3RhcnQoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTdGFydHMgc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc3RhcnQoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUZpbGVMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJRmlsZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODUxNzYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJRmlsZUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi0vKioKLSAqIFJlcHJlc2VudHMgZmlsZSBsb2NhdGlvbgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElGaWxlTG9jYXRpb24gZXh0ZW5kcyBJUERJTG9jYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHNvdXJjZSBmaWxlIG9mIHRoaXMgbG9jYXRpb24gb3IgbnVsbCBpZiB0aGUgc291cmNlIGZpbGUgaXMgdW5rbm93bgotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBmaWxlIG9mIHRoaXMgbG9jYXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0RmlsZSgpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElGb3JtYXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBiODZkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotLyoqCi0gKiBGb3JtYXQgY29uc3RhbnRzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUZvcm1hdCB7Ci0JZmluYWwgc3RhdGljIGludCBOQVRVUkFMID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IERFQ0lNQUwgPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgQklOQVJZICA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBPQ1RBTCA9IDM7Ci0JZmluYWwgc3RhdGljIGludCBIRVhBREVDSU1BTCA9IDQ7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElGdW5jdGlvbkxvY2F0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElGdW5jdGlvbkxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjQwOTYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJRnVuY3Rpb25Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGZ1bmN0aW9uIGxvY2F0aW9uIGluIHRoZSBkZWJ1Z2dhYmxlIHByb2dyYW0KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRnVuY3Rpb25Mb2NhdGlvbiBleHRlbmRzIElQRElGaWxlTG9jYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bmN0aW9uIG9mIHRoaXMgbG9jYXRpb24gb3IgbnVsbCBpZiB0aGUgZnVuY3Rpb24gaXMgdW5rbm93bgotCSAqIEByZXR1cm4gZnVuY3Rpb24gbmFtZSBvZiB0aGlzIGxvY2F0aW9uCi0JICovCi0JU3RyaW5nIGdldEZ1bmN0aW9uKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUxpbmVMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJTGluZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDliY2EuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJTGluZUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbGluZSBsb2NhdGlvbiBpbiB0aGUgZGVidWdnYWJsZSBwcm9ncmFtCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUxpbmVMb2NhdGlvbiBleHRlbmRzIElQRElGaWxlTG9jYXRpb24gewotCS8qKgotCSAqIFJldHVybiB0aGUgbGluZSBudW1iZXIgb2YgdGhpcyBsb2NhdGlvbiBvciAwIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duCi0JICogQHJldHVybiBsaW5lIG51bWJlciBvZiB0aGlzIGxvY2F0aW9uCi0JICovCi0JaW50IGdldExpbmVOdW1iZXIoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJTG9jYXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDhmNTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGxvY2F0aW9uIGluIHRoZSBkZWJ1Z2dhYmxlIHByb2dyYW0KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJTG9jYXRpb24gewotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgYm90aCBsb2NhdGlvbnMgaXMgaW4gdGhlIHNhbWUgcGxhY2UKLQkgKiBAcGFyYW0gbG9jYWl0b24gYW5vdGhlciBsb2NhdGlvbiB0byBjb21wYXJlIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBib3RoIGxvY2F0aW9ucyByZWZlciB0byB0aGUgc2FtZSBwbGFjZQotCSAqLwotCWJvb2xlYW4gZXF1YWxzKElQRElMb2NhdGlvbiBsb2NhaXRvbik7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUxvY2F0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwNDNmNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24gb2YgZmlsZSwgZnVuY3Rpb24sIGxpbmUsIGFkZHJlc3MKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJTG9jYXRvciBleHRlbmRzIElQRElGaWxlTG9jYXRpb24sIElQRElMaW5lTG9jYXRpb24sIElQRElGdW5jdGlvbkxvY2F0aW9uLCBJUERJQWRkcmVzc0xvY2F0aW9uIHsKLQkvKioKLQkgKiBAcGFyYW0gb0FkZHJlc3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxBZGRyZXNzKEJpZ0ludGVnZXIgb0FkZHJlc3MpOwotCi0JLyoqCi0JICogQHBhcmFtIG9GaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFsRmlsZShTdHJpbmcgb0ZpbGUpOwotCi0JLyoqCi0JICogQHBhcmFtIG9GdW5jdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbEZ1bmN0aW9uKFN0cmluZyBvRnVuY3Rpb24pOwotCi0JLyoqCi0JICogQHBhcmFtIG9MaW5lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFsTGluZShpbnQgb0xpbmUpOwotCi0JLyoqCi0JICogQHBhcmFtIGxvY2F0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKElQRElMb2NhdG9yIGxvY2F0b3IpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJTWVtb3J5QmxvY2tNYW5hZ2VtZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElNZW1vcnlCbG9ja01hbmFnZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2NGI2YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElNZW1vcnlCbG9ja01hbmFnZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci0KLS8qKgotICogVGhlIG1lbW9yeSBtYW5hZ2VyIG1hbmFnZXMgdGhlIGNvbGxlY3Rpb24gb2YgbWVtb3J5IGJsb2NrcyBzcGVjaWZpZWQgZm9yIHRoZSBkZWJ1ZyBzZXNzaW9uLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElNZW1vcnlCbG9ja01hbmFnZW1lbnQgewotCS8qKgotCSAqIFJlcXVlc3RzIHRvIGNyZWF0ZSBkYXRhIHJlYWQgbWVtb3J5Ci0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIG9mZnNldCAKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSB3b3JkRm9ybWF0IEhFWEFERUNJTUFMIHx8IE9DVEFMIHx8IEJJTkFSWSB8fCBERUNJTUFMIHx8IFJBVyB8fCBOQVRVUkFMCi0JICogQHBhcmFtIHdvcmRTaXplIFRoZSBzaXplIG9mIGVhY2ggbWVtb3J5IHdvcmQgaW4gYnl0ZXMKLQkgKiBAcGFyYW0gcm93cwotCSAqIEBwYXJhbSBjb2xzCi0JICogQHBhcmFtIGFzQ2hhcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIGNyZWF0ZURhdGFSZWFkTWVtb3J5KEJpdExpc3QgdGFza3MsIGxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgaW50IHdvcmRGb3JtYXQsIGludCB3b3JkU2l6ZSwgaW50IHJvd3MsIGludCBjb2xzLCBDaGFyYWN0ZXIgYXNDaGFyKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIGNyZWF0ZSBkYXRhIHdyaXRlIG1lbW9yeQotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSB3b3JkRm9ybWF0IEhFWEFERUNJTUFMIHx8IE9DVEFMIHx8IEJJTkFSWSB8fCBERUNJTUFMIHx8IFJBVyB8fCBOQVRVUkFMCi0JICogQHBhcmFtIHdvcmRTaXplCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQl2b2lkIGNyZWF0ZURhdGFXcml0ZU1lbW9yeShCaXRMaXN0IHRhc2tzLCBsb25nIG9mZnNldCwgU3RyaW5nIGFkZHJlc3MsIGludCB3b3JkRm9ybWF0LCBpbnQgd29yZFNpemUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVNlc3Npb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjODBmYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV2ZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRSZXF1ZXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1lbW9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVJlZ2lzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJU2lnbmFsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJU291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFyZ2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRocmVhZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3Rvcnk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGRlYnVnIHNlc3Npb24KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2Vzc2lvbiBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0LCBJUERJRXhlY3V0ZU1hbmFnZW1lbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJTkcgPSAxOyAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVEVEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVEVEID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElUSU5HID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElURUQgPSA1OwotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NSdW5uaW5nRXZlbnQoQml0TGlzdCB0YXNrcyk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU291cmNlTWFuYWdlciBnZXRTb3VyY2VNYW5hZ2VyKCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHRocmVhZF9pZAotCSAqIEBwYXJhbSB2YXJzCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc1N1cHNlbmRlZEV2ZW50KEJpdExpc3QgdGFza3MsIGZpbmFsIGludCB0aHJlYWRfaWQsIGZpbmFsIFN0cmluZ1tdIHZhcnMpOwotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gYXBwCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZGlyCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdFRvRGVidWdnZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgYXBwLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDYXVzZXMgdGhpcyBzZXNzaW9uIHRvIGV4aXQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIHZvaWQgZXhpdCgpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyBkZWJ1ZyB0YXJnZXQgb24gZ2l2ZW4gdGFzayBpZCBvciBudWxsIGlmIHRhcmdldCBpcyBub3QgcmVnaXN0ZXJlZAotCSAqIEBwYXJhbSB0aWQgdGFzayBpZAotCSAqIEByZXR1cm4gZGVidWcgdGFyZ2V0Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0IGZpbmRUYXJnZXQoQml0TGlzdCB0YXNrKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnJlYWtwb2ludCBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKiBAcmV0dXJuIElQRElCcmVha3BvaW50TWFuYWdlciB0aGUgYnJlYWtwb2ludCBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgSVBESUJyZWFrcG9pbnRNYW5hZ2VyIGdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVidWdnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gYSBkZWJ1Z2dlciBmb3IgdGhpcyBzZXNzaW9uCi0JICovCi0JcHVibGljIElQRElEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpOwotCQkKLQkvKioKLQkgKiBHZXQgdGhlIGZhY3RvcnkgdG8gY3JlYXRlIGV2ZW50cyBmb3IgdGhpcyBzZXNzaW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRXZlbnRGYWN0b3J5IGdldEV2ZW50RmFjdG9yeSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gSVBESUV2ZW50TWFuYWdlciB0aGUgZXZlbnQgcmVxdWVzdCBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgSVBESUV2ZW50TWFuYWdlciBnZXRFdmVudE1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCByZXF1ZXN0IG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIgdGhlIGV2ZW50IHJlcXVlc3QgbWFuYWdlciBmb3IgdGhpcyBzZXNzaW9uCi0JICovCi0JcHVibGljIElQRElFdmVudFJlcXVlc3RNYW5hZ2VyIGdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gSVBESUV4cHJlc3Npb25NYW5hZ2VyIHRoZSBleHByZXNzaW9uIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqLwotCXB1YmxpYyBJUERJRXhwcmVzc2lvbk1hbmFnZXIgZ2V0RXhwcmVzc2lvbk1hbmFnZXIoKTsKLQotCS8qKiAKLQkgKiBSZXR1cm5zIGpvYiBpZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uCi0JICogQHJldHVybiBqb2IgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpvYklEKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVtb3J5IG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gSVBESU1lbW9yeU1hbmFnZXIgdGhlIG1lbW9yeSBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeU1hbmFnZXIgZ2V0TWVtb3J5TWFuYWdlcigpOwotCi0JLyoqCi0JICogR2V0IHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSBtb2RlbCBlbGVtZW50cyBmb3IgdGhpcyBzZXNzaW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaXN0ZXIgbWFuYWdlciBmb3IgdGhpcyBzZXNzaW9uCi0JICogQHJldHVybiBJUERJUmVnaXN0ZXJNYW5hZ2VyIHRoZSByZWdpc3RlciBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgSVBESVJlZ2lzdGVyTWFuYWdlciBnZXRSZWdpc3Rlck1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgcmVxdWVzdCBmYWN0b3J5Ci0JICogQHJldHVybiByZXF1ZXN0IGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSVBESVJlcXVlc3RGYWN0b3J5IGdldFJlcXVlc3RGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaWduYWwgbWFuYWdlciBmb3IgdGhpcyBzZXNzaW9uCi0JICogQHJldHVybiBJUERJU2lnbmFsTWFuYWdlciB0aGUgc2lnbmFsIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqLwotCXB1YmxpYyBJUERJU2lnbmFsTWFuYWdlciBnZXRTaWduYWxNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gY3VycmVudCBzdGF0dXMgb2YgdGhpcyBzZXNzaW9uCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXQgbWFuYWdlciBmb3IgdGhpcyBzZXNzaW9uCi0JICogQHJldHVybiBJUERJVGFyZ2V0TWFuYWdlciB0aGUgdGFyZ2V0IG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0TWFuYWdlciBnZXRUYXJnZXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqIEByZXR1cm4gSVBESVRhc2tNYW5hZ2VyIHRoZSB0YXNrIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqLwotCXB1YmxpYyBJUERJVGFza01hbmFnZXIgZ2V0VGFza01hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0YXNrcyBvZiB0aGlzIHNlc3Npb24KLQkgKiBAcmV0dXJuIGFsbCB0YXNrcyBvZiB0aGlzIHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRocmVhZCBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKiBAcmV0dXJuIElQRElUaHJlYWRNYW5hZ2VyIHRoZSB0aHJlYWQgbWFuYWdlciBmb3IgdGhpcyBzZXNzaW9uCi0JICovCi0JcHVibGljIElQRElUaHJlYWRNYW5hZ2VyIGdldFRocmVhZE1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0VGltZW91dCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdG90YWwgdGFza3MgaW4gdGhpcyBzZXNzaW9uCi0JICogQHJldHVybiB0b3RhbCB0YXNrcyBpbiB0aGlzIHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRvdGFsVGFza3MoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KLQkgKiBAcmV0dXJuIElQRElWYXJpYWJsZU1hbmFnZXIgdGhlIHZhcmlhYmxlIG1hbmFnZXIgZm9yIHRoaXMgc2Vzc2lvbgotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVNYW5hZ2VyIGdldFZhcmlhYmxlTWFuYWdlcigpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhcmdldC90aHJlYWQgaXMgY3VycmVudGx5IHN1c3BlbmRlZC4KLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0YXJnZXQvdGhyZWFkIGlzIGN1cnJlbnRseSBzdXNwZW5kZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZChCaXRMaXN0IHRhc2tzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0YXJnZXQvdGhyZWFkIGlzIGN1cnJlbnRseSB0ZXJtaW5hdGVkLgotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRhcmdldC90aHJlYWQgaXMgY3VycmVudGx5IHRlcm1pbmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoQml0TGlzdCB0YXNrcyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJ1bm5hYmxlCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVSdW5uYWJsZShSdW5uYWJsZSBydW5uYWJsZSk7Ci0JCi0JLyoqCi0JICogU2V0cyBhIHRpbWVvdXQgZm9yIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0VGltZW91dChsb25nIHRpbWVvdXQpOwotCQotCS8qKgotCSAqIFNldCBzdGF0dXMgZm9yIHNlc3Npb24KLQkgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyBvZiBjdXJyZW50IHNlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cyk7Ci0JCi0JLyoqCi0JICogU2h1dGRvd24gdGhpcyBzZXNzaW9uIAotCSAqIEBwYXJhbSBmb3JjZSB3aGV0aGVyIGZvcmNlIHRvIHRlcm1pbmF0ZSBkZWJ1Z2dlciAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bihib29sZWFuIGZvcmNlKTsKLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciByZXF1ZXN0IHRhc2tzIGNhbiBkbyBzdGVwIHJldHVybgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTdGVwUmV0dXJuKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb247CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJU2Vzc2lvbk9iamVjdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJU2Vzc2lvbk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWE4NDdmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVNlc3Npb25PYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgZGVidWcgc2Vzc2lvbgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTZXNzaW9uT2JqZWN0IGV4dGVuZHMgSVBESVNldCB7Ci0JLyoqCi0JICogUmV0dXJucyBkZWJ1ZyBzZXNzaW9uCi0JICogQHJldHVybiB0aGUgZGVidWcgc2Vzc2lvbgotCSAqLwotCUlQRElTZXNzaW9uIGdldFNlc3Npb24oKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJU2V0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlMmYzNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNldCBvZiBwcm9jZXNzZXMgaW4gUERJIG1vZGVsCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2V0IHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBUYXNrIElEcwotCSAqIEByZXR1cm4gQml0TGlzdCBvZiBhbGwgcHJvY2Vzc2VzCi0JICovCi0JQml0TGlzdCBnZXRUYXNrcygpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElTaWduYWxNYW5hZ2VtZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElTaWduYWxNYW5hZ2VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODZkM2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJU2lnbmFsTWFuYWdlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHNpZ25hbCBtYW5hZ2VtZW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVNpZ25hbE1hbmFnZW1lbnQgewotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHJldHJpZXZlIGEgbGlzdCBzaWduYWxzIGluZm9ybWF0aW9uIHdpdGggZ2l2ZW4gc2lnbmFsIG5hbWUgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzIAotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2Ygc2lnbmFsCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgbGlzdFNpZ25hbHMoQml0TGlzdCB0YXNrcywgU3RyaW5nIG5hbWUpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gcmV0cmlldmUgc2lnbmFsIGluZm9ybWF0aW9uIHdpdGggZ2l2ZW4gYXJndW1lbnQgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGFyZyBhcmd1bWVudCAKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQl2b2lkIHJldHJpZXZlU2lnbmFsSW5mbyhCaXRMaXN0IHRhc2tzLCBTdHJpbmcgYXJnKSB0aHJvd3MgUERJRXhjZXB0aW9uOwkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVN0YWNrZnJhbWVNYW5hZ2VtZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElTdGFja2ZyYW1lTWFuYWdlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRiYzg4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVN0YWNrZnJhbWVNYW5hZ2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgc3RhY2tmcmFtZSBtYW5hZ2VtZW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVN0YWNrZnJhbWVNYW5hZ2VtZW50IHsKLQkvKioKLQkgKiBMaXN0cyBzdGFjayBmcmFtZXMgd2l0aCBnaXZlbiByYW5nZSBvZiBmcmFtZXMKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gbG93IGxvd2VyIG9mIGZyYW1lCi0JICogQHBhcmFtIGRlcHRoIGRlcHRoIG9mIGZyYW1lCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgbGlzdFN0YWNrRnJhbWVzKEJpdExpc3QgdGFza3MsIGludCBsb3csIGludCBkZXB0aCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgc3RhY2sgZnJhbWUgd2l0aCBnaXZlbiBsZXZlbAotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBsZXZlbCBsZXZlbCBvZiBzdGFjayBmcmFtZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHNldEN1cnJlbnRTdGFja0ZyYW1lKEJpdExpc3QgdGFza3MsIGludCBsZXZlbCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVRocmVhZE1hbmFnZW1lbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVRocmVhZE1hbmFnZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2ODkyNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElUaHJlYWRNYW5hZ2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhyZWFkIG1hbmFnZW1lbnQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJVGhyZWFkTWFuYWdlbWVudCB7Ci0JLyoqCi0JICogUmVxdWVzdHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb2YgdGhyZWFkcyBvZiBzcGVjaWZ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBsaXN0SW5mb1RocmVhZHMoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXF1ZXN0cyB0byBzZWxlY3QgdGhyZWFkIHdpdGggZ2l2ZW4gdGhyZWFkIGlkIG9mIHNwZWNpZnkgcHJvY2VzcwotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSB0aWQgdGhyZWFkIGlkIHRvIGJlIHNlbGVjdGVkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc2VsZWN0VGhyZWFkKEJpdExpc3QgdGFza3MsIGludCB0aWQpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gcmV0cmlldmUgYSBzdGFjayBpbmZvIGRlcHRoIG9mIHNwZWNpZnkgcHJvY2VzcwotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHJldHJpZXZlU3RhY2tJbmZvRGVwdGgoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVRyYWNlU25hcHNob3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVRyYWNlU25hcHNob3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxMTRmNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL0lQRElUcmFjZVNuYXBzaG90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi0vKioKLSAqIFRPRE8KLSAqIFJlcHJlc2VudHMgYSB0cmFjZSBzbmFwc2hvdCBpbiB0aGUgZGVidWcgc2Vzc2lvbgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUcmFjZVNuYXBzaG90IGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCi19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvSVBESVZhcmlhYmxlTWFuYWdlbWVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJVmFyaWFibGVNYW5hZ2VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQ3NmYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9JUERJVmFyaWFibGVNYW5hZ2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBldmFsdWF0ZWQgdmFyaWFibGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJVmFyaWFibGVNYW5hZ2VtZW50IHsKLQkvKioKLQkgKiBSZXF1ZXN0cyBJQUlGIHZhbHVlIG9mIGdpdmVuIHZhcmlhYmxlIG5hbWUKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwciB2YXJpYWJsZSBuYW1lCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgcmV0cmlldmVBSUYoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyBwYXJ0aWFsIElBSUYgdmFsdWUgb2YgZ2l2ZW4gdmFyaWFibGUgbmFtZQotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBleHByIHZhcmlhYmxlIG5hbWUKLQkgKiBAcGFyYW0ga2V5IHZhcmlhYmxlIGtleQotCSAqIEBwYXJhbSBsaXN0Q2hpbGRyZW4gaXMgbGlzdCBhIGNoaWxkcmVuPwotCSAqIEBwYXJhbSBleHByZXNzIGlzIGV4cHJlc3Npb24/Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgcmV0cmlldmVQYXJ0aWFsQUlGKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByLCBTdHJpbmcga2V5LCBib29sZWFuIGxpc3RDaGlsZHJlbiwgYm9vbGVhbiBleHByZXNzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVxdWVzdHMgU3RyaW5nIHZhbHVlIG9mIGdpdmVuIHZhcmlhYmxlIG5hbWUKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwciB2YXJpYWJsZSBuYW1lCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgZXZhbHVhdGVFeHByZXNzaW9uKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIFN0cmluZyB2YWx1ZSBvZiBnaXZlbiB2YXJpYWJsZSBuYW1lIAotCSAqIEBwYXJhbSB0YXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBleHByIHZhcmlhYmxlIG5hbWUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBkYXRhRXZhbHVhdGVFeHByZXNzaW9uKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3RzIElBSUZUeXBlIG9mIGdpdmVuIHZhcmlhYmxlIG5hbWUKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAcGFyYW0gdmFyIHZhcmlhYmxlIG5hbWUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCByZXRyaWV2ZVZhcmlhYmxlVHlwZShCaXRMaXN0IHRhc2tzLCBTdHJpbmcgdmFyKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3QgYSBsaXN0IG9mIGFyZ3VtZW50IGZvciBhIHJhbmdlIG9mIGxldmVsCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIGxvdyBtaW5pbXVtIGxldmVsCi0JICogQHBhcmFtIGhpZ2ggbWF4aW11bSBsZXZlbAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIGxpc3RBcmd1bWVudHMoQml0TGlzdCB0YXNrcywgaW50IGxvdywgaW50IGhpZ2gpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVxdWVzdHMgYSBsaXN0IG9mIGxvY2FsIHZhcmlhYmxlcyAKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlIAotCSAqLwotCXZvaWQgbGlzdExvY2FsVmFyaWFibGVzKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVxdWVzdHMgYSBsaXN0IG9mIGdsb2JhbCB2YXJpYWJsZXMKLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MgCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgbGlzdEdsb2JhbFZhcmlhYmxlcyhCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gZGVsZXRlIHdhdGNoaW5nIHZhcmlhYmxlCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIHZhciB3YXRjaGluZyB2YXJpYWJsZSBuYW1lCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgZGVsZXRlVmFyaWFibGUoQml0TGlzdCB0YXNrcywgU3RyaW5nIHZhcikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvUERJRXhjZXB0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL1BESUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjU2ZDhlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvUERJRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotCi0vKioKLSAqIFRocm93biB0byBpbmRpY2F0ZSBzb21lIHVuZXhwZWN0ZWQgZXJyb3IgaGFzIG9jY3VycmVkCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQRElFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCS8qKgotCSAqIEFsbCBzZXJpYWxpemFibGUgb2JqZWN0cyBzaG91bGQgaGF2ZSBhIHN0YWJsZSBzZXJpYWxWZXJzaW9uVUlECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JcHJvdGVjdGVkIEJpdExpc3QgdGFza3M7Ci0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JICogQHBhcmFtIHRhc2tzIHNwZWNpZnkgdGFza3MgdGhyb3cgZXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBQRElFeGNlcHRpb24oQml0TGlzdCB0YXNrcykgewotCQlzdXBlcigpOwotCQl0aGlzLnRhc2tzID0gdGFza3M7Ci0JfQotCS8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSB0YXNrcyBzcGVjaWZ5IHRhc2tzIHRocm93IGV4Y2VwdGlvbiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UuIFRoZSBkZXRhaWwgbWVzc2FnZSBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBQRElFeGNlcHRpb24oQml0TGlzdCB0YXNrcywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JCXRoaXMudGFza3MgPSB0YXNrczsKLQl9Ci0JCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL1BESUludGVybmFsRXhjZXB0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL1BESUludGVybmFsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjY0MDkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9QRElJbnRlcm5hbEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLQotLyoqCi0gKiBUaHJvd24gdG8gaW5kaWNhdGUgc29tZSB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZCAKLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQRElJbnRlcm5hbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIEFsbCBzZXJpYWxpemFibGUgb2JqZWN0cyBzaG91bGQgaGF2ZSBhIHN0YWJsZSBzZXJpYWxWZXJzaW9uVUlECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JcHJvdGVjdGVkIEJpdExpc3QgdGFza3M7Ci0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JICogQHBhcmFtIHRhc2tzIHNwZWNpZnkgdGFza3MgdGhyb3cgZXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBQRElJbnRlcm5hbEV4Y2VwdGlvbihCaXRMaXN0IHRhc2tzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGFza3MgPSB0YXNrczsKLQl9Ci0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JICogQHBhcmFtIHRhc2tzIHNwZWNpZnkgdGFza3MgdGhyb3cgZXhjZXB0aW9uIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZS4gVGhlIGRldGFpbCBtZXNzYWdlIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QuCi0JICovCi0JcHVibGljIFBESUludGVybmFsRXhjZXB0aW9uKEJpdExpc3QgdGFza3MsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQl0aGlzLnRhc2tzID0gdGFza3M7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvUERJTG9jYXRpb25GYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL1BESUxvY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTZlZjgwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvUERJTG9jYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BZGRyZXNzTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkZpbGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuRnVuY3Rpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuTGluZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5Mb2NhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgZ3JlZwotICoKLSAqLwotcHVibGljIGNsYXNzIFBESUxvY2F0aW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQHBhcmFtIGFkZHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUERJQWRkcmVzc0xvY2F0aW9uIG5ld0FkZHJlc3NMb2NhdGlvbihCaWdJbnRlZ2VyIGFkZHIpIHsKLQkJcmV0dXJuIG5ldyBBZGRyZXNzTG9jYXRpb24oYWRkcik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBESUZpbGVMb2NhdGlvbiBuZXdGaWxlTG9jYXRpb25Mb2NhdGlvbihTdHJpbmcgZmlsZSkgewotCQlyZXR1cm4gbmV3IEZpbGVMb2NhdGlvbihmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBmdW5jdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQRElGdW5jdGlvbkxvY2F0aW9uIG5ld0Z1bmN0aW9uTG9jYXRpb24oU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jdGlvbikgewotCQlyZXR1cm4gbmV3IEZ1bmN0aW9uTG9jYXRpb24oZmlsZSwgZnVuY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGxpbmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUERJTGluZUxvY2F0aW9uIG5ld0xpbmVMb2NhdGlvbihTdHJpbmcgZmlsZSwgaW50IGxpbmUpIHsKLQkJcmV0dXJuIG5ldyBMaW5lTG9jYXRpb24oZmlsZSwgbGluZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gZnVuY3Rpb24KLQkgKiBAcGFyYW0gbGluZQotCSAqIEBwYXJhbSBhZGRyZXNzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBESUxvY2F0b3IgbmV3TG9jYXRvcihTdHJpbmcgZmlsZSwgU3RyaW5nIGZ1bmN0aW9uLCBpbnQgbGluZSwgQmlnSW50ZWdlciBhZGRyZXNzKSB7Ci0JCXJldHVybiBuZXcgTG9jYXRvcihmaWxlLCBmdW5jdGlvbiwgbGluZSwgYWRkcmVzcyk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvU2Vzc2lvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9TZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NmE3NjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9TZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QRGVidWdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUJyZWFrcG9pbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV2ZW50UmVxdWVzdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV4cHJlc3Npb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWVtb3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJUmVnaXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElTaWduYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElTb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXJnZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGhyZWFkTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVN0YXJ0RGVidWdnZXJSZXF1ZXN0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb24gaW1wbGVtZW50cyBJUERJU2Vzc2lvbiB7Ci0JcHJpdmF0ZSBJUERJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXI7Ci0JcHJpdmF0ZSBJUERJRXZlbnRNYW5hZ2VyIGV2ZW50TWFuYWdlcjsKLQlwcml2YXRlIElQRElFdmVudFJlcXVlc3RNYW5hZ2VyIGV2ZW50UmVxdWVzdE1hbmFnZXI7Ci0JcHJpdmF0ZSBJUERJVGFza01hbmFnZXIgdGFza01hbmFnZXI7Ci0JcHJpdmF0ZSBJUERJVGFyZ2V0TWFuYWdlciB0YXJnZXRNYW5hZ2VyOyAKLQlwcml2YXRlIElQRElUaHJlYWRNYW5hZ2VyIHRocmVhZE1hbmFnZXI7IAotCXByaXZhdGUgSVBESUV4cHJlc3Npb25NYW5hZ2VyIGV4cHJlc3Npb25NYW5hZ2VyOwotCXByaXZhdGUgSVBESVZhcmlhYmxlTWFuYWdlciB2YXJpYWJsZU1hbmFnZXI7Ci0JcHJpdmF0ZSBJUERJU291cmNlTWFuYWdlciBzb3VyY2VNYW5hZ2VyOwotCXByaXZhdGUgSVBESU1lbW9yeU1hbmFnZXIgbWVtb3J5TWFuYWdlcjsKLQlwcml2YXRlIElQRElTaWduYWxNYW5hZ2VyIHNpZ25hbE1hbmFnZXI7Ci0JcHJpdmF0ZSBJUERJUmVnaXN0ZXJNYW5hZ2VyIHJlZ2lzdGVyTWFuYWdlcjsKLQlwcml2YXRlIElQRElEZWJ1Z2dlciBkZWJ1Z2dlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgam9iX2lkOwotCXByaXZhdGUgaW50IHRvdGFsX3Rhc2tzID0gMDsKLQlwcml2YXRlIGludCBzdGF0dXM7Ci0JcHJpdmF0ZSBsb25nIHRpbWVvdXQgPSAzMDAwMDsKLQlwcml2YXRlIE5vdGlmeUpvYiBub3RpZnlKb2IgPSBudWxsOwotCXByaXZhdGUgSVBESVJlcXVlc3RGYWN0b3J5IHJlcXVlc3RGYWN0b3J5OwotCXByaXZhdGUgSVBESUV2ZW50RmFjdG9yeSBldmVudEZhY3Rvcnk7Ci0JcHJpdmF0ZSBJUERJTW9kZWxGYWN0b3J5IG1vZGVsRmFjdG9yeTsKLQlwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sJd2FpdExvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkKLQlwdWJsaWMgU2Vzc2lvbihJUERJTWFuYWdlckZhY3RvcnkgbWFuYWdlckZhY3RvcnksSVBESVJlcXVlc3RGYWN0b3J5IHJlcXVlc3RGYWN0b3J5LCAKLQkJCUlQRElFdmVudEZhY3RvcnkgZXZlbnRGYWN0b3J5LCBJUERJTW9kZWxGYWN0b3J5IG1vZGVsRmFjdG9yeSwgCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsIGxvbmcgdGltZW91dCwgSVBESURlYnVnZ2VyIGRlYnVnZ2VyLCAKLQkJCVN0cmluZyBqb2JfaWQsIGludCB0b3RhbF90YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQl0aGlzLmRlYnVnZ2VyID0gZGVidWdnZXI7Ci0JCXRoaXMuam9iX2lkID0gam9iX2lkOwotCQl0aGlzLnRvdGFsX3Rhc2tzID0gdG90YWxfdGFza3M7Ci0JCXRoaXMubm90aWZ5Sm9iID0gbmV3IE5vdGlmeUpvYigpOwotCQl0aGlzLnJlcXVlc3RGYWN0b3J5ID0gcmVxdWVzdEZhY3Rvcnk7Ci0JCXRoaXMuZXZlbnRGYWN0b3J5ID0gZXZlbnRGYWN0b3J5OwotCQl0aGlzLm1vZGVsRmFjdG9yeSA9IG1vZGVsRmFjdG9yeTsKLQkJCi0JCXNldEV2ZW50UmVxdWVzdE1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3RXZlbnRSZXF1ZXN0TWFuYWdlcih0aGlzKSk7Ci0JCXNldEV2ZW50TWFuYWdlcihtYW5hZ2VyRmFjdG9yeS5uZXdFdmVudE1hbmFnZXIodGhpcykpOwotCQlzZXRUYXNrTWFuYWdlcihtYW5hZ2VyRmFjdG9yeS5uZXdUYXNrTWFuYWdlcih0aGlzKSk7Ci0JCXNldFRhcmdldE1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3VGFyZ2V0TWFuYWdlcih0aGlzKSk7Ci0JCXNldFRocmVhZE1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3VGhyZWFkTWFuYWdlcih0aGlzKSk7Ci0JCXNldEJyZWFrcG9pbnRNYW5hZ2VyKG1hbmFnZXJGYWN0b3J5Lm5ld0JyZWFrcG9pbnRNYW5hZ2VyKHRoaXMpKTsKLQkJc2V0RXhwcmVzc2lvbk1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3RXhwcmVzc2lvbk1hbmFnZXIodGhpcykpOwotCQlzZXRWYXJpYWJsZU1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3VmFyaWFibGVNYW5hZ2VyKHRoaXMpKTsKLQkJc2V0U291cmNlTWFuYWdlcihtYW5hZ2VyRmFjdG9yeS5uZXdTb3VyY2VNYW5hZ2VyKHRoaXMpKTsKLQkJc2V0TWVtZW9yeU1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3TWVtb3J5TWFuYWdlcih0aGlzKSk7Ci0JCXNldFNpZ25hbE1hbmFnZXIobWFuYWdlckZhY3RvcnkubmV3U2lnbmFsTWFuYWdlcih0aGlzKSk7Ci0JCXNldFJlZ2lzdGVyTWFuYWdlcihtYW5hZ2VyRmFjdG9yeS5uZXdSZWdpc3Rlck1hbmFnZXIodGhpcykpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRSZXF1ZXN0RmFjdG9yeSgpCi0JICovCi0JcHVibGljIElQRElSZXF1ZXN0RmFjdG9yeSBnZXRSZXF1ZXN0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHJlcXVlc3RGYWN0b3J5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jZ2V0VGltZW91dCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0VGltZW91dCgpIHsKLQkJcmV0dXJuIHRpbWVvdXQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNzZXRSZXF1ZXN0VGltZW91dChsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RUaW1lb3V0KGxvbmcgdGltZW91dCkgewotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jY29ubmVjdFRvRGVidWdnZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0VG9EZWJ1Z2dlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBhcHAsIFN0cmluZyBwYXRoLCBTdHJpbmcgZGlyLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJc2V0U3RhdHVzKENPTk5FQ1RJTkcpOwotCQlpZiAoIWdldERlYnVnZ2VyKCkuaXNDb25uZWN0ZWQobW9uaXRvcikpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24oZ2V0VGFza3MoKSwgIkNhbm5vdCBjb25uZWN0IHRvIGRlYnVnZ2VyIik7Ci0JCX0KLQkJZ2V0RGVidWdnZXIoKS5yZWdpc3RlcihldmVudE1hbmFnZXIpOwotCQltb25pdG9yLmJlZ2luVGFzaygiSW5pdGlhbGlzaW5nIGRlYnVnIHByb2Nlc3NlcyAoIit0b3RhbF90YXNrcysiKS4uLiIsIHRvdGFsX3Rhc2tzKTsKLQkJSVBESVN0YXJ0RGVidWdnZXJSZXF1ZXN0IHJlcXVlc3QgPSBnZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFN0YXJ0RGVidWdnZXJSZXF1ZXN0KGdldFRhc2tzKCksIGFwcCwgcGF0aCwgZGlyLCBhcmdzKTsKLQkJZXZlbnRSZXF1ZXN0TWFuYWdlci5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCXJlcXVlc3Qud2FpdFVudGlsQ29tcGxldGVkKG51bGwsIG1vbml0b3IpOwotCQlzZXRTdGF0dXMoQ09OTkVDVEVEKTsKLQkJZXZlbnRNYW5hZ2VyLmZpcmVFdmVudChnZXRFdmVudEZhY3RvcnkoKS5uZXdTdGFydGVkRXZlbnQodGhpcywgZ2V0VGFza3MoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV2ZW50UmVxdWVzdE1hbmFnZXIoSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIgbWFuYWdlcikgewotCQlldmVudFJlcXVlc3RNYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFdmVudE1hbmFnZXIoSVBESUV2ZW50TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWV2ZW50TWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtYW5hZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFza01hbmFnZXIoSVBESVRhc2tNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGFza01hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldE1hbmFnZXIoSVBESVRhcmdldE1hbmFnZXIgbWFuYWdlcikgewotCQl0YXJnZXRNYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKElQRElUaHJlYWRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhyZWFkTWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtYW5hZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QnJlYWtwb2ludE1hbmFnZXIoSVBESUJyZWFrcG9pbnRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJYnJlYWtwb2ludE1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cHJlc3Npb25NYW5hZ2VyKElQRElFeHByZXNzaW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWV4cHJlc3Npb25NYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYXJpYWJsZU1hbmFnZXIoSVBESVZhcmlhYmxlTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXZhcmlhYmxlTWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtYW5hZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlTWFuYWdlcihJUERJU291cmNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXNvdXJjZU1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1lbWVvcnlNYW5hZ2VyKElQRElNZW1vcnlNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWVtb3J5TWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtYW5hZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2lnbmFsTWFuYWdlcihJUERJU2lnbmFsTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXNpZ25hbE1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlZ2lzdGVyTWFuYWdlcihJUERJUmVnaXN0ZXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJcmVnaXN0ZXJNYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldEV2ZW50UmVxdWVzdE1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUERJRXZlbnRSZXF1ZXN0TWFuYWdlciBnZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkgewotCQlyZXR1cm4gZXZlbnRSZXF1ZXN0TWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldEV2ZW50TWFuYWdlcigpCi0JICovCi0JcHVibGljIElQRElFdmVudE1hbmFnZXIgZ2V0RXZlbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gZXZlbnRNYW5hZ2VyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jZ2V0VGFza01hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUERJVGFza01hbmFnZXIgZ2V0VGFza01hbmFnZXIoKSB7Ci0JCXJldHVybiB0YXNrTWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldFRocmVhZE1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkTWFuYWdlciBnZXRUaHJlYWRNYW5hZ2VyKCkgewotCQlyZXR1cm4gdGhyZWFkTWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldFRhcmdldE1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0TWFuYWdlciBnZXRUYXJnZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gdGFyZ2V0TWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldEJyZWFrcG9pbnRNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVBESUJyZWFrcG9pbnRNYW5hZ2VyIGdldEJyZWFrcG9pbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gYnJlYWtwb2ludE1hbmFnZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRFeHByZXNzaW9uTWFuYWdlcigpCi0JICovCi0JcHVibGljIElQRElFeHByZXNzaW9uTWFuYWdlciBnZXRFeHByZXNzaW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb25NYW5hZ2VyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jZ2V0VmFyaWFibGVNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlTWFuYWdlciBnZXRWYXJpYWJsZU1hbmFnZXIoKSB7Ci0JCXJldHVybiB2YXJpYWJsZU1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVNvdXJjZU1hbmFnZXIgZ2V0U291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIHNvdXJjZU1hbmFnZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRNZW1vcnlNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeU1hbmFnZXIgZ2V0TWVtb3J5TWFuYWdlcigpIHsKLQkJcmV0dXJuIG1lbW9yeU1hbmFnZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRTaWduYWxNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVBESVNpZ25hbE1hbmFnZXIgZ2V0U2lnbmFsTWFuYWdlcigpIHsKLQkJcmV0dXJuIHNpZ25hbE1hbmFnZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRSZWdpc3Rlck1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUERJUmVnaXN0ZXJNYW5hZ2VyIGdldFJlZ2lzdGVyTWFuYWdlcigpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyTWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI3NodXRkb3duKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oYm9vbGVhbiBmb3JjZSkgewotCQl0cnkgewotCQkJaWYgKCFmb3JjZSkgewotCQkJCWV4aXQoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzZXRTdGF0dXMoRVhJVElORyk7Ci0JCQlkZWJ1Z2dlci5kaXNjb25uZWN0KGV2ZW50TWFuYWdlcik7Ci0JCX0KLQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdmFyaWFibGVNYW5hZ2VyLnNodXRkb3duKCk7Ci0JCQlleHByZXNzaW9uTWFuYWdlci5zaHV0ZG93bigpOwotCQkJYnJlYWtwb2ludE1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCWV2ZW50TWFuYWdlci5zaHV0ZG93bigpOwotCQkJc291cmNlTWFuYWdlci5zaHV0ZG93bigpOwotCQkJdGFza01hbmFnZXIuc2h1dGRvd24oKTsKLQkJCXRhcmdldE1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCXRocmVhZE1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCW1lbW9yeU1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCXNpZ25hbE1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCWV2ZW50UmVxdWVzdE1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCW5vdGlmeUpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JfQotCQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSVBESUV4ZWN1dGVNYW5hZ2VtZW50Ci0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNyZXN0YXJ0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQljaGVja1N0YXR1cygpOwotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm90IGltcGxlbWVudCByZXN0YXJ0KCkgeWV0Iik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjc3RhcnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQljaGVja1N0YXR1cygpOwotCQlnZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KGdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0UmVzdW1lUmVxdWVzdCh0YXNrcywgZmFsc2UpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNyZXN1bWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZShCaXRMaXN0IHRhc2tzLCBib29sZWFuIHBhc3NTaWduYWwpIHRocm93cyBQRElFeGNlcHRpb24gewotCQljaGVja1N0YXR1cygpOwotCQlpZiAocGFzc1NpZ25hbCkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJOb3QgaW1wbG1lbnQgcmVzdW1lKCkgLSBQYXNzIFNpZ25hbCB5ZXQiKTsKLQkJdGFza01hbmFnZXIuZ2V0U3VzcGVuZGVkVGFza3ModGFza3MpOwotCQlpZiAodGFza3MuaXNFbXB0eSgpKQotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIk5vIHN1c3BlbmRlZCBwcm9jZXNzZXMgZm91bmQiKTsKLQkJZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChnZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFJlc3VtZVJlcXVlc3QodGFza3MsIHBhc3NTaWduYWwpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNyZXN1bWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZShCaXRMaXN0IHRhc2tzLCBJUERJTG9jYXRpb24gbG9jYXRpb24pIHRocm93cyBQRElFeGNlcHRpb24gewotCQljaGVja1N0YXR1cygpOwotCQl0YXNrTWFuYWdlci5nZXRTdXNwZW5kZWRUYXNrcyh0YXNrcyk7Ci0JCWlmICh0YXNrcy5pc0VtcHR5KCkpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm8gc3VzcGVuZGVkIHByb2Nlc3NlcyBmb3VuZCIpOwotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm90IGltcGxtZW50IHJlc3VtZShJUERJTG9jYXRpb24pIHlldCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3Jlc3VtZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZShCaXRMaXN0IHRhc2tzLCBJUERJU2lnbmFsIHNpZ25hbCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFN1c3BlbmRlZFRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJOb3QgaW1wbG1lbnQgcmVzdW1lKElQRElTaWduYWwpIHlldCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N0ZXBJbnRvKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKEJpdExpc3QgdGFza3MsIGludCBjb3VudCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFN1c3BlbmRlZFRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCWdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QoZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRTdGVwSW50b1JlcXVlc3QodGFza3MsIGNvdW50KSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjc3RlcEludG9JbnN0cnVjdGlvbihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwSW50b0luc3RydWN0aW9uKEJpdExpc3QgdGFza3MsIGludCBjb3VudCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFN1c3BlbmRlZFRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJOb3QgaW1wbG1lbnQgc3RlcEludG9JbnN0cnVjdGlvbigpIHlldCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N0ZXBPdmVyKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKEJpdExpc3QgdGFza3MsIGludCBjb3VudCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFN1c3BlbmRlZFRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCWdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QoZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRTdGVwT3ZlclJlcXVlc3QodGFza3MsIGNvdW50KSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjc3RlcE92ZXJJbnN0cnVjdGlvbihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwT3Zlckluc3RydWN0aW9uKEJpdExpc3QgdGFza3MsIGludCBjb3VudCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFN1c3BlbmRlZFRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJOb3QgaW1wbG1lbnQgc3RlcE92ZXJJbnN0cnVjdGlvbigpIHlldCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N0ZXBSZXR1cm4ob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUYpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcFJldHVybihCaXRMaXN0IHRhc2tzLCBJQUlGIGFpZikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFN1c3BlbmRlZFRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJOb3QgaW1wbG1lbnQgc3RlcFJldHVybihJQUlGKSB5ZXQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNzdGVwUmV0dXJuKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJY2hlY2tTdGF0dXMoKTsKLQkJdGFza01hbmFnZXIuZ2V0Q2FuU3RlcFJldHVyblRhc2tzKHRhc2tzKTsKLQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJObyBzdXNwZW5kZWQgcHJvY2Vzc2VzIGZvdW5kIik7Ci0JCWdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QoZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRTdGVwRmluaXNoUmVxdWVzdCh0YXNrcywgY291bnQpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNzdGVwVW50aWwob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBVbnRpbChCaXRMaXN0IHRhc2tzLCBJUERJTG9jYXRpb24gbG9jYXRpb24pIHRocm93cyBQRElFeGNlcHRpb24gewotCQljaGVja1N0YXR1cygpOwotCQl0YXNrTWFuYWdlci5nZXRTdXNwZW5kZWRUYXNrcyh0YXNrcyk7Ci0JCWlmICh0YXNrcy5pc0VtcHR5KCkpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm8gc3VzcGVuZGVkIHByb2Nlc3NlcyBmb3VuZCIpOwotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm90IGltcGxtZW50IHN0ZXBVbnRpbChJUERJTG9jYXRpb24pIHlldCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N1c3BlbmQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmQoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFJ1bm5pbmdUYXNrcyh0YXNrcyk7Ci0JCWlmICh0YXNrcy5pc0VtcHR5KCkpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm8gcnVubmluZyBwcm9jZXNzZXMgZm91bmQiKTsKLQkJZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChnZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFN1c3BlbmRSZXF1ZXN0KHRhc2tzKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjdGVybWluYXRlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWNoZWNrU3RhdHVzKCk7Ci0JCXRhc2tNYW5hZ2VyLmdldE5vblRlcm1pbmF0ZWRUYXNrcyh0YXNrcyk7Ci0JCWlmICh0YXNrcy5pc0VtcHR5KCkpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiQWxsIHByb2Nlc3NlcyBoYXZlIGJlZW4gdGVybWluYXRlZCIpOwotCi0JCUJpdExpc3Qgbm9uVGVyVGFza3MgPSB0YXNrcy5jb3B5KCk7Ci0JCXRhc2tNYW5hZ2VyLmdldFJ1bm5pbmdUYXNrcyhub25UZXJUYXNrcyk7Ci0JCWlmICghbm9uVGVyVGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlnZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KGdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0U3VzcGVuZFJlcXVlc3Qobm9uVGVyVGFza3MsIGZhbHNlKSk7Ci0JCX0KLQkJZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChnZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFRlcm1pbmF0ZVJlcXVlc3QodGFza3MpKTsKLQkJdGFza01hbmFnZXIuc2V0UGVuZGluZ1Rhc2tzKHRydWUsIHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI3ZhbGlkYXRlU3RlcFJldHVybihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTdGVwUmV0dXJuKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQkvKgotCQl0YXNrTWFuYWdlci5nZXRVbnJlZ2lzdGVyZWRUYXNrcyh0YXNrcyk7Ci0JCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlnZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KGdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0R2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0KHRhc2tzKSk7Ci0JCQkvL0ZJWE1FOiBmb3IgdGVzdGluZwotCQkJLy9nZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KGdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0VGVybWluYXRlUmVxdWVzdCh0YXNrcy5jb3B5KCkpKTsKLQkJfQotCQkqLwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jZXhpdCgpCi0JICovCi0JcHVibGljIHZvaWQgZXhpdCgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzICE9IEVYSVRJTkcgJiYgc3RhdHVzICE9IEVYSVRFRCkgewotCQkJc2V0U3RhdHVzKEVYSVRJTkcpOwotCQkJZXZlbnRSZXF1ZXN0TWFuYWdlci5jbGVhbkV2ZW50UmVxdWVzdHMoKTsKLQkJCUJpdExpc3QgdGFza3MgPSBnZXRUYXNrcygpOwotCQkJdGFza01hbmFnZXIuZ2V0UnVubmluZ1Rhc2tzKHRhc2tzKTsKLQkJCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQkJZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChnZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFN1c3BlbmRSZXF1ZXN0KHRhc2tzLCBmYWxzZSkpOwotCQkJfQotCQkJdGFza3MgPSBnZXRUYXNrcygpOwotCQkJdGFza01hbmFnZXIuZ2V0Tm9uVGVybWluYXRlZFRhc2tzKHRhc2tzKTsKLQkJCWlmICghdGFza3MuaXNFbXB0eSgpKQotCQkJCWdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QoZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRUZXJtaW5hdGVSZXF1ZXN0KHRhc2tzKSk7Ci0JCQkKLQkJCWdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QoZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRTdG9wRGVidWdnZXJSZXF1ZXN0KG5ldyBCaXRMaXN0KHRvdGFsX3Rhc2tzKSkpOwotCQkJdGFza01hbmFnZXIuc2V0UGVuZGluZ1Rhc2tzKHRydWUsIHRhc2tzKTsKLQkJfQotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElQRElTZXNzaW9uCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldERlYnVnZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVBESURlYnVnZ2VyIGdldERlYnVnZ2VyKCkgewotCQlyZXR1cm4gZGVidWdnZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRKb2JJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2JJRCgpIHsKLQkJcmV0dXJuIGpvYl9pZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2lzVGVybWluYXRlZChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIHRhc2tNYW5hZ2VyLmlzQWxsVGVybWluYXRlZCh0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNpc1N1c3BlbmRlZChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gdGFza01hbmFnZXIuaXNBbGxTdXNwZW5kZWQodGFza3MpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIHRhc2tNYW5hZ2VyLmlzQWxsUnVubmluZyh0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRUYXNrcygpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoKSB7Ci0JCUJpdExpc3QgdGFza3MgPSBuZXcgQml0TGlzdCh0b3RhbF90YXNrcyk7Ci0JCXRhc2tzLnNldCgwLCB0b3RhbF90YXNrcyk7Ci0JCXJldHVybiB0YXNrczsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNnZXRUb3RhbFRhc2tzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRvdGFsVGFza3MoKSB7Ci0JCXJldHVybiB0b3RhbF90YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0I2dldFNlc3Npb24oKQotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI3NldFN0YXR1cyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKLQkJd2FpdExvY2subG9jaygpOwotCQl0cnkgewotCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl3YWl0TG9jay51bmxvY2soKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jZ2V0U3RhdHVzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1N0YXR1cygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzID09IEVYSVRJTkcgfHwgc3RhdHVzID09IEVYSVRFRCkKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24obnVsbCwgIkNhbm5vdCBwcm9jZXNzIGZvciB5b3VyIHJlcXVlc3QgZHVlIHRvIHNlc3Npb24gaXMgZXhpdGluZyBvciBleGl0ZWQuIik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNmaW5kVGFyZ2V0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldCBmaW5kVGFyZ2V0KEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVRhcmdldCB0YXJnZXQgPSB0YXJnZXRNYW5hZ2VyLmdldFRhcmdldChxVGFza3MpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHFUYXNrcywgIk5vIHRhcmdldCBmb3VuZC4iKTsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldChCaXRMaXN0IHFUYXNrcykgewotCQlyZXR1cm4gKHRhcmdldE1hbmFnZXIuZ2V0VGFyZ2V0KHFUYXNrcykgIT0gbnVsbCk7Ci0JfQotCQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogcHJvY2VzcyBvbiBydW5uaW5nIG9yIHN1c3BlbmRlZCAKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jcHJvY2Vzc1J1bm5pbmdFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3NSdW5uaW5nRXZlbnQoQml0TGlzdCB0YXNrcykgewotCQlJUERJVGFyZ2V0W10gdGFyZ2V0cyA9IHRhcmdldE1hbmFnZXIuZ2V0VGFyZ2V0cygpOwotCQlmb3IgKGZpbmFsIElQRElUYXJnZXQgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJaWYgKHRhcmdldC5nZXRUYXNrcygpLmludGVyc2VjdHModGFza3MpKSB7Ci0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRhcmdldC5zZXRTdXBlbmRlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXF1ZXVlUnVubmFibGUocnVubmFibGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiNwcm9jZXNzU3Vwc2VuZGVkRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHJvY2Vzc1N1cHNlbmRlZEV2ZW50KEJpdExpc3QgdGFza3MsIGZpbmFsIGludCB0aHJlYWRfaWQsIGZpbmFsIFN0cmluZ1tdIHZhcnMpIHsKLQkJSVBESVRhcmdldFtdIHRhcmdldHMgPSB0YXJnZXRNYW5hZ2VyLmdldFRhcmdldHMoKTsKLQkJZm9yIChmaW5hbCBJUERJVGFyZ2V0IHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCWlmICh0YXJnZXQuZ2V0VGFza3MoKS5pbnRlcnNlY3RzKHRhc2tzKSkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0YXJnZXQuc2V0U3VwZW5kZWQodHJ1ZSk7Ci0JCQkJCQl0YXJnZXQudXBkYXRlU3RhdGUodGhyZWFkX2lkKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSVBESVRocmVhZCBwdGhyZWFkID0gdGFyZ2V0LmdldEN1cnJlbnRUaHJlYWQoKTsKLQkJCQkJCQlpZiAocHRocmVhZCA9PSBudWxsKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCi0JCQkJCQkJcHRocmVhZC5nZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQkJCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHZhcmlhYmxlTWFuYWdlci5pc0F1dG9VcGRhdGUoKSkgewotCQkJCQkJCQl2YXJpYWJsZU1hbmFnZXIudXBkYXRlKHRhcmdldC5nZXRUYXNrcygpLCB2YXJzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGV4cHJlc3Npb25NYW5hZ2VyLmlzQXV0b1VwZGF0ZSgpKSB7IAotCQkJCQkJCQlleHByZXNzaW9uTWFuYWdlci51cGRhdGUodGFyZ2V0LmdldFRhc2tzKCksIHZhcnMpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAocmVnaXN0ZXJNYW5hZ2VyLmlzQXV0b1VwZGF0ZSgpKSB7Ci0JCQkJCQkJCXJlZ2lzdGVyTWFuYWdlci51cGRhdGUodGFyZ2V0LmdldFRhc2tzKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAobWVtb3J5TWFuYWdlci5pc0F1dG9VcGRhdGUoKSkgewotCQkJCQkJCQltZW1vcnlNYW5hZ2VyLnVwZGF0ZSh0YXJnZXQuZ2V0VGFza3MoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicmVha3BvaW50TWFuYWdlci5pc0F1dG9VcGRhdGUoKSkgewotCQkJCQkJCQlicmVha3BvaW50TWFuYWdlci51cGRhdGUodGFyZ2V0LmdldFRhc2tzKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2lnbmFsTWFuYWdlci5pc0F1dG9VcGRhdGUoKSkgewotCQkJCQkJCQlzaWduYWxNYW5hZ2VyLnVwZGF0ZSh0YXJnZXQuZ2V0VGFza3MoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzb3VyY2VNYW5hZ2VyLmlzQXV0b1VwZGF0ZSgpKSB7Ci0JCQkJCQkJCXNvdXJjZU1hbmFnZXIudXBkYXRlKHRhcmdldC5nZXRUYXNrcygpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJcXVldWVSdW5uYWJsZShydW5uYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBOb3RpZnkgSm9iCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI3F1ZXVlUnVubmFibGUoamF2YS5sYW5nLlJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlUnVubmFibGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJbm90aWZ5Sm9iLmFkZFJ1bm5hYmxlKHJ1bm5hYmxlKTsKLQl9Ci0JCi0JY2xhc3MgTm90aWZ5Sm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBWZWN0b3I8UnVubmFibGU+IGZSdW5uYWJsZXM7Ci0JCXB1YmxpYyBOb3RpZnlKb2IoKSB7Ci0JCQlzdXBlcigiUFRQIE5vdGlmeSBKb2IiKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCWZSdW5uYWJsZXMgPSBuZXcgVmVjdG9yPFJ1bm5hYmxlPigxMCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkUnVubmFibGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJCXN5bmNocm9uaXplZCAoZlJ1bm5hYmxlcykgewotCQkJCWZSdW5uYWJsZXMuYWRkKHJ1bm5hYmxlKTsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQkJcmV0dXJuICFmUnVubmFibGVzLmlzRW1wdHkoKTsKLQkJfQotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlSdW5uYWJsZVtdIHJ1bm5hYmxlczsKLQkJCXN5bmNocm9uaXplZCAoZlJ1bm5hYmxlcykgewotCQkJCXJ1bm5hYmxlcyA9IGZSdW5uYWJsZXMudG9BcnJheShuZXcgUnVubmFibGVbMF0pOwotCQkJCWZSdW5uYWJsZXMuY2xlYXIoKTsKLQkJCX0KLQkJCU11bHRpU3RhdHVzIGZhaWxlZCA9IG51bGw7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhnZXROYW1lKCksIHJ1bm5hYmxlcy5sZW5ndGgpOwotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiTXNnOiBOb3RpZnlKb2IgLSBzaXplIG9mIHJ1bm5hYmxlczogIiArIHJ1bm5hYmxlcy5sZW5ndGgpOwotCQkJZm9yIChSdW5uYWJsZSBydW5uYWJsZSA6IHJ1bm5hYmxlcykgewotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKGZhaWxlZCA9PSBudWxsKQotCQkJCQkJZmFpbGVkID0gbmV3IE11bHRpU3RhdHVzKFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwgIkV2ZW50IG5vdGlmeSBlcnJvciIsIG51bGwpOwotCQkJCQlmYWlsZWQuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SLCAiRXZlbnQgbm90aWZ5IGVycm9yIiwgZSkpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJaWYgKGZhaWxlZCA9PSBudWxsKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCi0JCQlyZXR1cm4gZmFpbGVkOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uI2dldEV2ZW50RmFjdG9yeSgpCi0JICovCi0JcHVibGljIElQRElFdmVudEZhY3RvcnkgZ2V0RXZlbnRGYWN0b3J5KCkgewotCQlyZXR1cm4gZXZlbnRGYWN0b3J5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24jZ2V0TW9kZWxGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgSVBESU1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKSB7Ci0JCXJldHVybiBtb2RlbEZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9TZXNzaW9uT2JqZWN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL1Nlc3Npb25PYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MTdjNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL1Nlc3Npb25PYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQlwcm90ZWN0ZWQgSVBESVNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEJpdExpc3QgdGFza3MgPSBudWxsOwotCi0JcHVibGljIFNlc3Npb25PYmplY3QoSVBESVNlc3Npb24gcywgQml0TGlzdCB0KSB7Ci0JCXRoaXMuc2Vzc2lvbiA9IHM7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0aGlzLnRhc2tzID0gdC5jb3B5KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdCNnZXRTZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVBESVNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIHNlc3Npb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2V0I2dldFRhc2tzKCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvQWJzdHJhY3RFdmVudEZhY3RvcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvQWJzdHJhY3RFdmVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZDFkOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0Fic3RyYWN0RXZlbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuQnJlYWtwb2ludEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50LkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuQ29ubmVjdGVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50LkNyZWF0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuRGF0YVJlYWRNZW1vcnlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudC5EZXN0cm95ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuRGlzY29ubmVjdGVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50LkVuZFN0ZXBwaW5nUmFuZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudC5FcnJvckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudC5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50LkV4aXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudC5Mb2NhdGlvblJlYWNoZWRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudC5NZW1vcnlCbG9ja0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50LlJlc3VtZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuU2lnbmFsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuU3RhcnRlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudC5TdXNwZW5kZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuVGhyZWFkSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQuVmFyaWFibGVJbmZvOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV2ZW50RmFjdG9yeSBpbXBsZW1lbnRzIElQRElFdmVudEZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3RGF0YVJlYWRNZW1vcnlJbmZvKGphdmEubGFuZy5TdHJpbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5W10pCi0JICovCi0JcHVibGljIE9iamVjdCBuZXdEYXRhUmVhZE1lbW9yeUluZm8oU3RyaW5nIGFkZHJlc3MsIGxvbmcgbmV4dFJvdywgbG9uZyBwcmV2Um93LCBsb25nIG5leHRQYWdlLCBsb25nIHByZXZQYWdlLCBsb25nIG51bUJ5dGVzLAotCQkJbG9uZyB0b3RhbEJ5dGVzLCBJUERJTWVtb3J5W10gbWVtb3JpZXMpIHsKLQkJcmV0dXJuIG5ldyBEYXRhUmVhZE1lbW9yeUluZm8oYWRkcmVzcywgbmV4dFJvdywgcHJldlJvdywgbmV4dFBhZ2UsIHByZXZQYWdlLCBudW1CeXRlcywgdG90YWxCeXRlcywgbWVtb3JpZXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRGYWN0b3J5I25ld0JyZWFrcG9pbnRJbmZvKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQpCi0JICovCi0JcHVibGljIElQRElCcmVha3BvaW50SW5mbyBuZXdCcmVha3BvaW50SW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQpIHsKLQkJcmV0dXJuIG5ldyBCcmVha3BvaW50SW5mbyhzZXNzaW9uLCB0YXNrcywgYnB0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50RmFjdG9yeSNuZXdDaGFuZ2VkRXZlbnQob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUERJQ2hhbmdlZEV2ZW50IG5ld0NoYW5nZWRFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24pIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VkRXZlbnQocmVhc29uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50RmFjdG9yeSNuZXdDb25uZWN0ZWRFdmVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3QsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESUNvbm5lY3RlZEV2ZW50IG5ld0Nvbm5lY3RlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gbmV3IENvbm5lY3RlZEV2ZW50KHJlYXNvbiwgdGFza3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRGYWN0b3J5I25ld0NyZWF0ZWRFdmVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3QpCi0JICovCi0JcHVibGljIElQRElDcmVhdGVkRXZlbnQgbmV3Q3JlYXRlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbikgewotCQlyZXR1cm4gbmV3IENyZWF0ZWRFdmVudChyZWFzb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRGYWN0b3J5I25ld0Rlc3Ryb3llZEV2ZW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBESURlc3Ryb3llZEV2ZW50IG5ld0Rlc3Ryb3llZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbikgewotCQlyZXR1cm4gbmV3IERlc3Ryb3llZEV2ZW50KHJlYXNvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3RGlzY29ubmVjdGVkRXZlbnQob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0LCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElEaXNjb25uZWN0ZWRFdmVudCBuZXdEaXNjb25uZWN0ZWRFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24sIEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIG5ldyBEaXNjb25uZWN0ZWRFdmVudChyZWFzb24sIHRhc2tzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50RmFjdG9yeSNuZXdFbmRTdGVwcGluZ1JhbmdlSW5mbyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yKQotCSAqLwotCXB1YmxpYyBJUERJRW5kU3RlcHBpbmdSYW5nZUluZm8gbmV3RW5kU3RlcHBpbmdSYW5nZUluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESUxvY2F0b3IgbG9jYXRvcikgewotCQlyZXR1cm4gbmV3IEVuZFN0ZXBwaW5nUmFuZ2VJbmZvKHNlc3Npb24sIHRhc2tzLCBsb2NhdG9yKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50RmFjdG9yeSNuZXdFcnJvckV2ZW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBESUVycm9yRXZlbnQgbmV3RXJyb3JFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24pIHsKLQkJcmV0dXJuIG5ldyBFcnJvckV2ZW50KHJlYXNvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3RXJyb3JJbmZvKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElFcnJvckluZm8gbmV3RXJyb3JJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCBjb2RlLCBTdHJpbmcgbXNnLCBTdHJpbmcgZGV0YWlsTXNnKSB7Ci0JCXJldHVybiBuZXcgRXJyb3JJbmZvKHNlc3Npb24sIHRhc2tzLCBjb2RlLCBtc2csIGRldGFpbE1zZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3RXhpdEluZm8ob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUV4aXRJbmZvIG5ld0V4aXRJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCBjb2RlKSB7Ci0JCXJldHVybiBuZXcgRXhpdEluZm8oc2Vzc2lvbiwgdGFza3MsIGNvZGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRGYWN0b3J5I25ld0xvY2F0aW9uUmVhY2hlZEluZm8ob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcikKLQkgKi8KLQlwdWJsaWMgSVBESUxvY2F0aW9uUmVhY2hlZEluZm8gbmV3TG9jYXRpb25SZWFjaGVkSW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJTG9jYXRvciBsb2NhdG9yKSB7Ci0JCXJldHVybiBuZXcgTG9jYXRpb25SZWFjaGVkSW5mbyhzZXNzaW9uLCB0YXNrcywgbG9jYXRvcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3TWVtb3J5QmxvY2tJbmZvKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLm1hdGguQmlnSW50ZWdlcltdLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrKQotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbk9iamVjdCBuZXdNZW1vcnlCbG9ja0luZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgQmlnSW50ZWdlcltdIGJpZ0ludGVnZXJzLCBJUERJTWVtb3J5QmxvY2sgYmxvY2spIHsKLQkJcmV0dXJuIG5ldyBNZW1vcnlCbG9ja0luZm8oc2Vzc2lvbiwgdGFza3MsIGJpZ0ludGVnZXJzLCBibG9jayk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3UmVzdW1lZEV2ZW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdCwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIElQRElSZXN1bWVkRXZlbnQgbmV3UmVzdW1lZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcywgaW50IHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBSZXN1bWVkRXZlbnQocmVhc29uLCB0YXNrcywgdHlwZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3U2lnbmFsSW5mbyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWwsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcikKLQkgKi8KLQlwdWJsaWMgSVBESVNpZ25hbEluZm8gbmV3U2lnbmFsSW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIElQRElTaWduYWwgc2lnbmFsLAotCQkJSVBESUxvY2F0b3IgbG9jYXRvcikgewotCQlyZXR1cm4gbmV3IFNpZ25hbEluZm8oc2Vzc2lvbiwgdGFza3MsIG5hbWUsIGRlc2MsIHNpZ25hbCwgbG9jYXRvcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3U3RhcnRlZEV2ZW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdCwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBJUERJU3RhcnRlZEV2ZW50IG5ld1N0YXJ0ZWRFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24sIEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIG5ldyBTdGFydGVkRXZlbnQocmVhc29uLCB0YXNrcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3U3VzcGVuZGVkRXZlbnQob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nW10sIGludCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIElQRElTdXNwZW5kZWRFdmVudCBuZXdTdXNwZW5kZWRFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24sIFN0cmluZ1tdIHZhcnMsIGludCB0aHJlYWRfaWQsIGludCBsZXZlbCwgaW50IGRlcHRoKSB7Ci0JCXJldHVybiBuZXcgU3VzcGVuZGVkRXZlbnQocmVhc29uLCB2YXJzLCB0aHJlYWRfaWQsIGxldmVsLCBkZXB0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3VGhyZWFkSW5mbyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCkKLQkgKi8KLQlwdWJsaWMgSVBESVNlc3Npb25PYmplY3QgbmV3VGhyZWFkSW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgaWQsIElQRElUaHJlYWQgdGhyZWFkKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkSW5mbyhzZXNzaW9uLCB0YXNrcywgaWQsIHRocmVhZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudEZhY3RvcnkjbmV3VmFyaWFibGVJbmZvKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlKQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVJbmZvIG5ld1ZhcmlhYmxlSW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgbmFtZSwgSVBESVZhcmlhYmxlIHZhcikgewotCQlyZXR1cm4gbmV3IFZhcmlhYmxlSW5mbyhzZXNzaW9uLCB0YXNrcywgbmFtZSwgdmFyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUJyZWFrcG9pbnRJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElCcmVha3BvaW50SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNmZDM3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUJyZWFrcG9pbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzZXNzaW9uIHdoZW4gdGhlIHByb2dyYW0gc3RvcHBlZCBieSBhIGJyZWFrcG9pbnQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJQnJlYWtwb2ludEluZm8gZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYnJlYWtwb2ludCB0aGF0IHN0b3BwZWQgdGhlIHByb2dyYW0KLQkgKiBAcmV0dXJuIHRoZSBicmVha3BvaW50IHRoYXQgc3RvcHBlZCB0aGUgcHJvZ3JhbQotCSAqLwotCUlQRElCcmVha3BvaW50IGdldEJyZWFrcG9pbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUNoYW5nZWRFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTcwYzAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotCi0vKioKLSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9yaWdpbmF0b3IgaGFzIGNoYW5nZWQuIENhbiBiZSBvcmlnaW5hdGVkIGJ5IGFueSBQREkgbW9kZWwgb2JqZWN0LgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBJUERJRXZlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlYXNvbiB3aHkgY2hhbmdlZAotCSAqIGVnOgotCSAqIElQRElCcmVha3BvaW50SW5mbwotCSAqIElQRElNZW1vcnlCbG9ja0luZm8KLQkgKiBJUERJU2lnbmFsSW5mbwotCSAqIElQRElWYXJpYWJsZUluZm8KLQkgKiBAcmV0dXJuIHRoZSByZWFzb24gd2h5IGNoYW5nZWQKLQkgKi8KLQlJUERJU2Vzc2lvbk9iamVjdCBnZXRSZWFzb24oKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJQ29ubmVjdGVkRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUNvbm5lY3RlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzE2ZDYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJQ29ubmVjdGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLS8qKgotICogTm90aWZpZXMgdGhhdCB0aGUgb3JpZ2luYXRvciBoYXMgY29ubmVjdGVkCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUNvbm5lY3RlZEV2ZW50IGV4dGVuZHMgSVBESUV2ZW50IHsKLQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElDcmVhdGVkRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUNyZWF0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZlOTE5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUNyZWF0ZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLQotLyoqCi0gKiBOb3RpZmllcyB0aGF0IHRoZSBvcmlnaW5hdG9yIGhhcyBiZWVuIGNyZWF0ZWQuCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUNyZWF0ZWRFdmVudCBleHRlbmRzIElQRElFdmVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVhc29uIHdoeSBjcmVhdGVkCi0JICogZWc6Ci0JICogSVBESUJyZWFrcG9pbnRJbmZvCi0JICogSVBESVRocmVhZEluZm8KLQkgKiBJUERJTWVtb3J5QmxvY2tJbmZvCi0JICogSVBESVJlZ2lzdGVySW5mbwotCSAqIElQRElTaGFyZWRMaWJyYXJ5SW5mbwotCSAqIElQRElTaWduYWxJbmZvCi0JICogSVBESVZhcmlhYmxlSW5mbwotCSAqIEByZXR1cm4gdGhlIHJlYXNvbiB3aHkgY3JlYXRlZAotCSAqLwotCUlQRElTZXNzaW9uT2JqZWN0IGdldFJlYXNvbigpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElEYXRhUmVhZE1lbW9yeUluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESURhdGFSZWFkTWVtb3J5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEyNWZmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESURhdGFSZWFkTWVtb3J5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeTsKLQotcHVibGljIGludGVyZmFjZSBJUERJRGF0YVJlYWRNZW1vcnlJbmZvIHsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXROdW1iZXJCeXRlcygpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBsb25nIGdldFRvdGFsQnl0ZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXROZXh0Um93KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0UHJldmlvdXNSb3coKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXROZXh0UGFnZSgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBsb25nIGdldFByZXZpb3VzUGFnZSgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTWVtb3J5W10gZ2V0TWVtb3JpZXMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESURlc3Ryb3llZEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElEZXN0cm95ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDYyYTNhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESURlc3Ryb3llZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotCi0vKioKLSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9yaWdpbmF0b3IgaGFzIHRlcm1pbmF0ZWQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRGVzdHJveWVkRXZlbnQgZXh0ZW5kcyBJUERJRXZlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlYXNvbiB3aHkgZGVzdHJveWVkCi0JICogZWc6Ci0JICogSVBESUJyZWFrcG9pbnRJbmZvCi0JICogSVBESUVycm9ySW5mbwotCSAqIElQRElFeGl0SW5mbwotCSAqIElQRElTaGFyZWRMaWJyYXJ5SW5mbwotCSAqIElQRElTaWduYWxJbmZvCi0JICogSVBESVRocmVhZEluZm8KLQkgKiBJUERJVmFyaWFibGVJbmZvCi0JICogQHJldHVybiB0aGUgcmVhc29uIHdoeSBkZXN0cm95ZWQKLQkgKi8KLQlJUERJU2Vzc2lvbk9iamVjdCBnZXRSZWFzb24oKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESURpc2Nvbm5lY3RlZEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElEaXNjb25uZWN0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ5MTJjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESURpc2Nvbm5lY3RlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi0vKioKLSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9yaWdpbmF0b3IgaGFzIGRpc2Nvbm5lY3RlZAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElEaXNjb25uZWN0ZWRFdmVudCBleHRlbmRzIElQRElFdmVudCB7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRW5kU3RlcHBpbmdSYW5nZUluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUVuZFN0ZXBwaW5nUmFuZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjc0MjguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRW5kU3RlcHBpbmdSYW5nZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlc3Npb24gd2hlbiBhIHN0ZXAgY29tbWFuZCBpcyBjb21wbGV0ZWQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRW5kU3RlcHBpbmdSYW5nZUluZm8gZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyBsb2NhdG9yCi0JICogQHJldHVybiBsb2NhdG9yCi0JICovCi0JSVBESUxvY2F0b3IgZ2V0TG9jYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXJyb3JFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXJyb3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFiYzQ2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUVycm9yRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci0KLS8qKgotICogTm90aWZpZXMgdGhhdCB0aGUgb3JpZ2luYXRvciBoYXMgZXJyb3IKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRXJyb3JFdmVudCBleHRlbmRzIElQRElFdmVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVhc29uIHdoeSBnb3QgZXJyb3IKLQkgKiBlZzoKLQkgKiBJUERJRXJyb3JJbmZvCi0JICogQHJldHVybiB0aGUgcmVhc29uIHdoeSBnb3QgZXJyb3IKLQkgKi8KLQlJUERJU2Vzc2lvbk9iamVjdCBnZXRSZWFzb24oKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUVycm9ySW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDAxMGMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlc3Npb24gd2hlbiB0aGUgcHJvZ3JhbSBleGl0ZWQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRXJyb3JJbmZvIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR19OT1JNQUwgPSAwOyAvLyBzaG93IGluIGVycm9yIGxvZyBhbmQgcHVwdXAgZXJyb3IgZGlhbG9nIGFuZCBubyBhY3Rpb24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdfV0FSTklORyA9IDE7IC8vIHNob3cgaW4gZXJyb3IgbG9nIGFuZCBwdXB1cCBlcnJvciBkaWFsb2cgYW5kIHRlcm1pbmF0ZSBlcnJvciBwcm9jZXNlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR19GQVRBTCA9IDI7IC8vIHNob3cgaW4gZXJyb3IgbG9nIGFuZCBwdXB1cCBlcnJvciBkaWFsb2cgYW5kIGFjdGlvbiAtIHRlcm1pbmF0ZSBhbGwgcHJvY2Vzc2VzIGFuZCBzdG9wIGRlYnVnZ2VyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHX0lHTk9SRSA9IDM7IC8vaWdub3JlIHRoaXMgZXJyb3IKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG1vcmUgdmVyYmF0aW0gZXJyb3IgbWVzc2FnZSAoaWYgYW55KQotCSAqIEByZXR1cm4gYSBtb3JlIHZlcmJhdGltIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlTdHJpbmcgZ2V0RGV0YWlsTWVzc2FnZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgZXJyb3IgY29kZQotCSAqIEByZXR1cm4gZXJyb3IgY29kZQotCSAqLwotCWludCBnZXRDb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3YzA3Yi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci0KLS8qKgotICogSVBESUV2ZW50IGlzIHRoZSBjb21tb24gc3VwZXIgaW50ZXJmYWNlIGZvciBhbGwgZXZlbnRzLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElFdmVudCBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGV2ZW50IGNvbnRhaW5zIHRoZSBnaXZlbiB0YXNrcwotCSAqIEBwYXJhbSB0YXNrcyBUYXNrcwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGV2ZW50IGNvbnRhaW5zIHRoZSBnaXZlbiB0YXNrcwotCSAqLwotCWJvb2xlYW4gY29udGFpbnMoQml0TGlzdCB0YXNrcyk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElFdmVudEZhY3RvcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUV2ZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJmYjIwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUV2ZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJUERJRXZlbnRGYWN0b3J5IHsKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBicHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElCcmVha3BvaW50SW5mbyBuZXdCcmVha3BvaW50SW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQpOwotCQotCS8qKgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElDaGFuZ2VkRXZlbnQgbmV3Q2hhbmdlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbik7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYXNvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUNvbm5lY3RlZEV2ZW50IG5ld0Nvbm5lY3RlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYXNvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUNyZWF0ZWRFdmVudCBuZXdDcmVhdGVkRXZlbnQoSVBESVNlc3Npb25PYmplY3QgcmVhc29uKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSBuZXh0Um93Ci0JICogQHBhcmFtIHByZXZSb3cKLQkgKiBAcGFyYW0gbmV4dFBhZ2UKLQkgKiBAcGFyYW0gcHJldlBhZ2UKLQkgKiBAcGFyYW0gbnVtQnl0ZXMKLQkgKiBAcGFyYW0gdG90YWxCeXRlcwotCSAqIEBwYXJhbSBtZW1vcmllcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG5ld0RhdGFSZWFkTWVtb3J5SW5mbyhTdHJpbmcgYWRkcmVzcywgbG9uZyBuZXh0Um93LCBsb25nIHByZXZSb3csIGxvbmcgbmV4dFBhZ2UsIGxvbmcgcHJldlBhZ2UsIGxvbmcgbnVtQnl0ZXMsCi0JCQlsb25nIHRvdGFsQnl0ZXMsIElQRElNZW1vcnlbXSBtZW1vcmllcyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYXNvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESURlc3Ryb3llZEV2ZW50IG5ld0Rlc3Ryb3llZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbik7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYXNvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESURpc2Nvbm5lY3RlZEV2ZW50IG5ld0Rpc2Nvbm5lY3RlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYXNvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBsb2NhdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRW5kU3RlcHBpbmdSYW5nZUluZm8gbmV3RW5kU3RlcHBpbmdSYW5nZUluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESUxvY2F0b3IgbG9jYXRvcik7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYXNvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUVycm9yRXZlbnQgbmV3RXJyb3JFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24pOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGRldGFpbE1zZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUVycm9ySW5mbyBuZXdFcnJvckluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IGNvZGUsIFN0cmluZyBtc2csIFN0cmluZyBkZXRhaWxNc2cpOwotCQotCS8qKgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gY29kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUV4aXRJbmZvIG5ld0V4aXRJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCBjb2RlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBsb2NhdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTG9jYXRpb25SZWFjaGVkSW5mbyBuZXdMb2NhdGlvblJlYWNoZWRJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElMb2NhdG9yIGxvY2F0b3IpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJpZ0ludGVnZXJzCi0JICogQHBhcmFtIGJsb2NrCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbk9iamVjdCBuZXdNZW1vcnlCbG9ja0luZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgQmlnSW50ZWdlcltdIGJpZ0ludGVnZXJzLCBJUERJTWVtb3J5QmxvY2sgYmxvY2spOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVJlc3VtZWRFdmVudCBuZXdSZXN1bWVkRXZlbnQoSVBESVNlc3Npb25PYmplY3QgcmVhc29uLCBCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVhc29uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzYwotCSAqIEBwYXJhbSBzaWduYWwKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVNpZ25hbEluZm8gbmV3U2lnbmFsSW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIElQRElTaWduYWwgc2lnbmFsLCBJUERJTG9jYXRvciBsb2NhdG9yKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU3RhcnRlZEV2ZW50IG5ld1N0YXJ0ZWRFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24sIEJpdExpc3QgdGFza3MpOwotCQotCS8qKgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiBAcGFyYW0gdmFycwotCSAqIEBwYXJhbSB0aHJlYWRfaWQKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTdXNwZW5kZWRFdmVudCBuZXdTdXNwZW5kZWRFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24sIFN0cmluZ1tdIHZhcnMsIGludCB0aHJlYWRfaWQsIGludCBsZXZlbCwgaW50IGRlcHRoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHRocmVhZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVNlc3Npb25PYmplY3QgbmV3VGhyZWFkSW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgaWQsIElQRElUaHJlYWQgdGhyZWFkKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFyCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZUluZm8gbmV3VmFyaWFibGVJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBuYW1lLCBJUERJVmFyaWFibGUgdmFyKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUV2ZW50TGlzdGVuZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiNGMwNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi0vKioKLSAqIEFuIGV2ZW50IGxpc3RlbmVyIHJlZ2lzdGVycyB3aXRoIHRoZSBldmVudCBtYW5hZ2VyIHRvIHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9uIGZyb20gdGhlIFBESSBtb2RlbCBvYmplY3RzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUV2ZW50TGlzdGVuZXIgewotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgb2YgdGhlIGdpdmVuIGV2ZW50LgotCSAqIEBwYXJhbSBldmVudHMgLSB0aGUgZXZlbnQKLQkgKi8KLQl2b2lkIGhhbmRsZURlYnVnRXZlbnRzKElQRElFdmVudFtdIGV2ZW50cyk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXhpdEluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUV4aXRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDA4ZmYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRXhpdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgc2Vzc2lvbiB3aGVuIHRoZSBwcm9ncmFtIGV4aXRlZAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElFeGl0SW5mbyBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4aXQgY29kZS4KLQkgKiBAcmV0dXJuIGFuIGV4aXQgY29kZQotCSAqLwotCWludCBnZXRDb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElGdW5jdGlvbkZpbmlzaGVkSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJRnVuY3Rpb25GaW5pc2hlZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjNzQ1MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElGdW5jdGlvbkZpbmlzaGVkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBmdW5jdGlvbiBmaW5zaWhlZAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElGdW5jdGlvbkZpbmlzaGVkSW5mbyBleHRlbmRzIElQRElFbmRTdGVwcGluZ1JhbmdlSW5mbyB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBBSUYgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uCi0JICogQHJldHVybiBJQUlGIHJldHVybiBBSUYgdmFsdWUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JSUFJRiBnZXRSZXR1cm5BSUYoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJTG9jYXRpb25SZWFjaGVkSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJTG9jYXRpb25SZWFjaGVkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU0NzAxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESUxvY2F0aW9uUmVhY2hlZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsb2NhdGlvbiByZWFjaGVkCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUxvY2F0aW9uUmVhY2hlZEluZm8gZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JSVBESUxvY2F0b3IgZ2V0TG9jYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJTWVtb3J5QmxvY2tJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElNZW1vcnlCbG9ja0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxMmQxOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElNZW1vcnlCbG9ja0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbWVtb3J5IGJsb2NrIGluZm8KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJTWVtb3J5QmxvY2tJbmZvIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmaWVkIGFkZHJlc3Nlcy4KLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmllZCBhZGRyZXNzZXMuCi0JICovCi0JQmlnSW50ZWdlcltdIGdldEFkZHJlc3NlcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmaWVkIG1lbW9yeSBibG9jawotCSAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIG1lbW9yeSBibG9jawotCSAqLwotCUlQRElNZW1vcnlCbG9jayBnZXRNZW1vcnlCbG9jaygpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJUmVnaXN0ZXJJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElSZWdpc3RlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYjJiZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElSZWdpc3RlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHJlZ2lzdGVyIGluZm8KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJUmVnaXN0ZXJJbmZvIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgcmVnaXN0ZXIgbmFtZQotCSAqIEByZXR1cm4gcmVnaXN0ZXIgbmFtZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyByZWdpc3RlcgotCSAqIEByZXR1cm4gcmVnaXN0ZXIKLQkgKi8KLQlJUERJUmVnaXN0ZXIgZ2V0UmVnaXN0ZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVJlc3RhcnRlZEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElSZXN0YXJ0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJjYTk2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVJlc3RhcnRlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi0vKioKLSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9yaWdpbmF0b3IgaGFzIGJlZW4gcmVzdGFydGVkLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElSZXN0YXJ0ZWRFdmVudCBleHRlbmRzIElQRElFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVJlc3VtZWRFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJUmVzdW1lZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGQzMDIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJUmVzdW1lZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50OwotCi0vKioKLSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9yaWdpbmF0b3IgaGFzIGJlZW4gcmVzdW1lZC4KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJUmVzdW1lZEV2ZW50IGV4dGVuZHMgSVBESUV2ZW50IHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05USU5VRSA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RFUF9PVkVSID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEVQX0lOVE8gPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNURVBfT1ZFUl9JTlNUUlVDVElPTiA9IDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RFUF9JTlRPX0lOU1RSVUNUSU9OID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEVQX1JFVFVSTiA9IDU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGVwcGluZyB0eXBlLgotCSAqIEByZXR1cm4gdGhlIHN0ZXBwaW5nIHR5cGUKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJU2hhcmVkTGlicmFyeUluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVNoYXJlZExpYnJhcnlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjZkNDkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJU2hhcmVkTGlicmFyeUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaGFyZWRMaWJyYXJ5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgc2hhcmVkIGxpYnJhcnkgaW5mbwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTaGFyZWRMaWJyYXJ5SW5mbyBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHNoYXJlZCBsaWJyYXJ5IG5hbWUKLQkgKiBAcmV0dXJuIHNoYXJlZCBsaWJyYXJ5IG5hbWUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgc2hhcmVkIGxpYnJhcnkKLQkgKiBAcmV0dXJuIHNoYXJlZCBsaWJyYXJ5Ci0JICovCi0JSVBESVNoYXJlZExpYnJhcnkgZ2V0U2hhcmVkTGlicmFyeSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJU2lnbmFsSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJU2lnbmFsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDk4OWEzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVNpZ25hbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgc2lnbmFsIGluZm8KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2lnbmFsSW5mbyBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHNpZ25hbCBuYW1lCi0JICogQHJldHVybiBzaWduYWwgbmFtZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBzaWduYWwKLQkgKiBAcmV0dXJuIHNpZ25hbCAtIGNhbiBiZSBudWxsCi0JICovCi0JSVBESVNpZ25hbCBnZXRTaWduYWwoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHNpZ25hbCBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nIHNpZ25hbCBkZXNjcmlwdGlvbgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoaXMgc2lnbmFsCi0JICogQHJldHVybiBsb2NhdGlvbiBvZiB0aGlzIHNpZ25hbCAtIGNhbiBiZSBudWxsCi0JICovCi0JSVBESUxvY2F0b3IgZ2V0TG9jYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJU3RhcnRlZEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElTdGFydGVkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZWJlYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElTdGFydGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLS8qKgotICogTm90aWZpZXMgdGhhdCB0aGUgb3JpZ2luYXRvciBoYXMgYmVlbiBzdGFydGVkLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTdGFydGVkRXZlbnQgZXh0ZW5kcyBJUERJRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElTdXNwZW5kZWRFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJU3VzcGVuZGVkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1YjQ0NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElTdXNwZW5kZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLQotLyoqCi0gKiBOb3RpZmllcyB0aGF0IHRoZSBvcmlnaW5hdG9yIGhhcyBiZWVuIHN1c3BlbmRlZC4gCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVN1c3BlbmRlZEV2ZW50IGV4dGVuZHMgSVBESUV2ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCB0aGF0IGNhdXNlZCB0aGUgc3VzcGVuc2lvbgotCSAqIGVnOgotCSAqIElQRElCcmVha3BvaW50SW5mbwotCSAqIElQRElFbmRTdGVwcGluZ1JhbmdlSW5mbwotCSAqIElQRElMb2NhdGlvblJlYWNoZWRJbmZvCi0JICogSVBESVNpZ25hbEluZm8KLQkgKiBJUERJRnVuY3Rpb25GaW5pc2hlZEluZm8KLQkgKiBJUERJU2hhcmVkTGlicmFyeUluZm8KLQkgKiBJUERJV2F0Y2hwb2ludFNjb3BlSW5mbwotCSAqIElQRElXYXRjaHBvaW50VHJpZ2dlckluZm8KLQkgKiBAcmV0dXJuIElQRElTZXNzaW9uT2JqZWN0IHRoZSBzZXNzaW9uIG9iamVjdCB0aGF0IGNhdXNlZCB0aGUgc3VzcGVuc2lvbgotCSAqLwotCUlQRElTZXNzaW9uT2JqZWN0IGdldFJlYXNvbigpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSBjaGFuZ2VkCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdmFyaWFibGVzCi0JICovCi0JU3RyaW5nW10gZ2V0VXBkYXRlZFZhcmlhYmxlcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhyZWFkIElECi0JICogQHJldHVybiB0aHJlYWQgSUQKLQkgKi8KLQlpbnQgZ2V0VGhyZWFkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgbGV2ZWwgb2YgY3VycmVudCBzdXNwZW5kZWQgZnJhbWUKLQkgKiBAcmV0dXJuIGxldmVsIG9mIGN1cnJlbnQgc3VzcGVuZGVkIGZyYW1lCi0JICovCi0JaW50IGdldExldmVsKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF4aW11bSBsZXZlbCBvZiBzdXNwZW5kZWQgZnJhbWUKLQkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1c3BlbmRlZCBmcmFtZQotCSAqLwotCWludCBnZXREZXB0aCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJVGhyZWFkSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJVGhyZWFkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2RkNjU0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVRocmVhZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci0KLS8qKgotICogUmVwcmVzZW5zdHMgdGhyZWFkIGRlc3Ryb3kgaW5mbwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUaHJlYWRJbmZvIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgZGVzdHJveWVkIHRocmVhZCBpZAotCSAqIEByZXR1cm4gZGVzdHJveWVkIHRocmVhZCBpZAotCSAqLwotCWludCBnZXRUaHJlYWRJRCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgZGVzdHJveWVkIHRocmVhZAotCSAqIEByZXR1cm4gZGVzdHJveWVkIHRocmVhZAotCSAqLwotCUlQRElUaHJlYWQgZ2V0VGhyZWFkKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElWYXJpYWJsZUluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVZhcmlhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YyMGYxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVZhcmlhYmxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdmFyaWFibGUgaW5mbwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElWYXJpYWJsZUluZm8gZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB2YXJpYWJsZSBuYW1lCi0JICogQHJldHVybiB2YXJpYWJsZSBuYW1lCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHZhcmlhYmxlCi0JICogQHJldHVybiB2YXJpYWJsZQotCSAqLwotCUlQRElWYXJpYWJsZSBnZXRWYXJpYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJV2F0Y2hwb2ludFNjb3BlSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9ldmVudC9JUERJV2F0Y2hwb2ludFNjb3BlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ1OTlmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVdhdGNocG9pbnRTY29wZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlc3Npb24gd2hlbiBhIHdhdGNocG9pbnQgaXMgZ29pbmcgb3V0IG9mIHNjb3BlLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElXYXRjaHBvaW50U2NvcGVJbmZvIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dCBvZiBzY29wZSB3YXRjaHBvaW50LgotCSAqIEByZXR1cm4gdGhlIHdhdGNocG9pbnQKLQkgKi8KLQlJUERJV2F0Y2hwb2ludCBnZXRXYXRjaHBvaW50KCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL2V2ZW50L0lQRElXYXRjaHBvaW50VHJpZ2dlckluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI5Y2I5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvZXZlbnQvSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVdhdGNocG9pbnQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgc2Vzc2lvbiB3aGVuIGEgd2F0Y2hwb2ludCBpcyB0cmlnZ2VyZWQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJV2F0Y2hwb2ludFRyaWdnZXJJbmZvIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyaWdnZXJlZCB3YXRjaHBvaW50Ci0JICogQHJldHVybiB0aGUgdHJpZ2dlcmVkIHdhdGNocG9pbnQKLQkgKi8KLQlJUERJV2F0Y2hwb2ludCBnZXRXYXRjaHBvaW50KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIHZhbHVlIG9mIHRoZSB3YXRjaGluZyBleHByZXNzaW9uCi0JICogQHJldHVybiB0aGUgb2xkIHZhbHVlIG9mIHRoZSB3YXRjaGluZyBleHByZXNzaW9uCi0JICovCi0JU3RyaW5nIGdldE9sZFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIHRoZSB3YXRjaGluZyBleHByZXNzaW9uCi0JICogQHJldHVybiB0aGUgbmV3IHZhbHVlIG9mIHRoZSB3YXRjaGluZyBleHByZXNzaW9uCi0JICovCi0JU3RyaW5nIGdldE5ld1ZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvQWJzdHJhY3RFdmVudE1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9BYnN0cmFjdEV2ZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM2MTU5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9BYnN0cmFjdEV2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVN0b3BEZWJ1Z2dlclJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXIuQWJzdHJhY3RQRElNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFdmVudE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cyBJUERJRXZlbnRNYW5hZ2VyIHsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotCSAqIGV2ZW50IHNjaGVkdWxlciAKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JY2xhc3MgRXZlbnRSZXF1ZXN0U2NoZWR1bGVkVGFzayB7Ci0JCVRpbWVyIGV2ZW50VGltZXIgPSBudWxsOwotCQlJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QgPSBudWxsOwotCQkKLQkJcHVibGljIEV2ZW50UmVxdWVzdFNjaGVkdWxlZFRhc2soSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCQkJdGhpcy5ldmVudFRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCQlzY2hlZHVsZVRpbWVvdXQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2FuY2VsVGltZW91dCgpIHsKLQkJCWV2ZW50VGltZXIuY2FuY2VsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUERJRXZlbnRSZXF1ZXN0IGdldFJlcXVlc3QoKSB7Ci0JCQlyZXR1cm4gcmVxdWVzdDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2NoZWR1bGVUaW1lb3V0KCkgewotCQkJZXZlbnRUaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJUERlYnVnVXRpbHMucHJpbnRsbigiTXNnOiBFdmVudFJlcXVlc3RTY2hlZHVsZWRUYXNrIC0gc2NoZWR1bGVUaW1lb3V0KCk6IFJlcXVlc3Q6ICIgKyByZXF1ZXN0KTsKLQkJCQkJcmVxdWVzdC5lcnJvcigiVGltZSBvdXQgZm9yIHRoaXMgcmVxdWVzdC4iKTsKLQkJCQkJbm90aWZ5RXZlbnRSZXF1ZXN0KHJlcXVlc3QpOwotCQkJCX0KLQkJCX0sIHNlc3Npb24uZ2V0VGltZW91dCgpKTsKLQkJfQotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBSZXF1ZXN0IE5vdGlmaWVyCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWNsYXNzIFJlcXVlc3ROb3RpZmllciBleHRlbmRzIE9ic2VydmFibGUgewotCQlwdWJsaWMgdm9pZCBub3RpZnkoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlzZXRDaGFuZ2VkKCk7Ci0JCQlub3RpZnlPYnNlcnZlcnMocmVxdWVzdCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PElQRElFdmVudExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8SVBESUV2ZW50TGlzdGVuZXI+KCkpOwotCXByaXZhdGUgTGlzdDxFdmVudFJlcXVlc3RTY2hlZHVsZWRUYXNrPiByZXF1ZXN0TGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxFdmVudFJlcXVlc3RTY2hlZHVsZWRUYXNrPigpKTsKLQlwcml2YXRlIFJlcXVlc3ROb3RpZmllciByZXF1ZXN0Tm90aWZpZXIgPSBuZXcgUmVxdWVzdE5vdGlmaWVyKCk7Ci0JCi0JcHVibGljIEFic3RyYWN0RXZlbnRNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJc3VwZXIoc2Vzc2lvbiwgZmFsc2UpOwotCQlyZXF1ZXN0Tm90aWZpZXIuYWRkT2JzZXJ2ZXIoc2Vzc2lvbi5nZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRNYW5hZ2VyI2FkZEV2ZW50TGlzdGVuZXIob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV2ZW50TGlzdGVuZXIoSVBESUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRNYW5hZ2VyI2ZpcmVFdmVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVFdmVudChJUERJRXZlbnQgZXZlbnQpIHsKLQkJZmlyZUV2ZW50cyhuZXcgSVBESUV2ZW50W10geyBldmVudCB9KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV2ZW50TWFuYWdlciNmaXJlRXZlbnRzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlRXZlbnRzKGZpbmFsIElQRElFdmVudFtdIGV2ZW50cykgewotCQlpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHsKLQkJCUlQRElFdmVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gKElQRElFdmVudExpc3RlbmVyW10pbGlzdGVuZXJMaXN0LnRvQXJyYXkobmV3IElQRElFdmVudExpc3RlbmVyWzBdKTsKLQkJCWZvciAoZmluYWwgSVBESUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIuaGFuZGxlRGVidWdFdmVudHMoZXZlbnRzKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJc2Vzc2lvbi5xdWV1ZVJ1bm5hYmxlKHJ1bm5hYmxlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRNYW5hZ2VyI25vdGlmeUV2ZW50UmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUV2ZW50UmVxdWVzdChJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3luY2hyb25pemVkIChyZXF1ZXN0TGlzdCkgewotCQkJaWYgKCFyZXF1ZXN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlyZXF1ZXN0TGlzdC5yZW1vdmUoMCkuY2FuY2VsVGltZW91dCgpOwotCQkJfQotCQkJcmVxdWVzdE5vdGlmaWVyLm5vdGlmeShyZXF1ZXN0KTsKLQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIioqKiogTXNnOiBBYnN0cmFjdEV2ZW50TWFuYWdlciAtIG5vdGlmeUV2ZW50UmVxdWVzdCgpOiBSZXF1ZXN0OiAiICsgcmVxdWVzdCk7Ci0JCQlzd2l0Y2ggKHJlcXVlc3QuZ2V0U3RhdHVzKCkpIHsKLQkJCS8vY2FzZSBJUERJRXZlbnRSZXF1ZXN0LkRPTkU6Ci0JCQkvL2Nhc2UgSVBESUV2ZW50UmVxdWVzdC5SVU5OSU5HOgotCQkJY2FzZSBJUERJRXZlbnRSZXF1ZXN0LlVOS05PV046Ci0JCQkJZmlyZUV2ZW50KHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JFdmVudCgKLQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JJbmZvKHNlc3Npb24sIHJlcXVlc3QuZ2V0VGFza3MoKSwgSVBESUVycm9ySW5mby5EQkdfTk9STUFMLCByZXF1ZXN0LmdldE5hbWUoKSArICIgZXJyb3IhIiwgIlVua25vd24gZXJyb3IiKSkpOwotCSAgIAkJCWJyZWFrOwotCQkJY2FzZSBJUERJRXZlbnRSZXF1ZXN0LkNBTkNFTExFRDoKLQkJCQlmaXJlRXZlbnQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckV2ZW50KAotCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckluZm8oc2Vzc2lvbiwgcmVxdWVzdC5nZXRUYXNrcygpLCBJUERJRXJyb3JJbmZvLkRCR19OT1JNQUwsIHJlcXVlc3QuZ2V0TmFtZSgpICsgIiBlcnJvciEiLCAiUmVxdWVzdCBoYXMgYmVlbiBjYW5jZWxsZWQiKSkpOwotCSAgIAkJCWJyZWFrOwotCQkJY2FzZSBJUERJRXZlbnRSZXF1ZXN0LkVSUk9SOgotCQkJCWludCBlcnJvclR5cGUgPSBJUERJRXJyb3JJbmZvLkRCR19OT1JNQUw7Ci0JCQkJaWYgKHJlcXVlc3QuZ2V0UmVzcG9uc2VBY3Rpb24oKSA9PSBJUERJRXZlbnRSZXF1ZXN0LkFDVElPTl9URVJNSU5BVEVEKSB7Ci0JCQkJCWVycm9yVHlwZSA9IElQRElFcnJvckluZm8uREJHX0ZBVEFMOwotCQkJCQl0cnkgewotCQkJCQkJc2Vzc2lvbi50ZXJtaW5hdGUocmVxdWVzdC5nZXRUYXNrcygpLmNvcHkoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy9lcnJvciBvbiB0ZXJtaW5hdGUsIG1hbnVhbGx5IGNoYW5nZSB0YXNrcycgc3RhdHVzCi0JCQkJCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0UGVuZGluZ1Rhc2tzKGZhbHNlLCByZXF1ZXN0LmdldFRhc2tzKCkpOwotCQkJCQkJc2Vzc2lvbi5nZXRUYXNrTWFuYWdlcigpLnNldFRlcm1pbmF0ZVRhc2tzKHRydWUsIHJlcXVlc3QuZ2V0VGFza3MoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmlyZUV2ZW50KHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JFdmVudCgKLQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JJbmZvKHNlc3Npb24sIHJlcXVlc3QuZ2V0VGFza3MoKSwgZXJyb3JUeXBlLCByZXF1ZXN0LmdldE5hbWUoKSArICIgZXJyb3IhIiwgcmVxdWVzdC5nZXRFcnJvck1lc3NhZ2UoKSkpKTsKLQkgICAJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRNYW5hZ2VyI3JlZ2lzdGVyRXZlbnRSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFdmVudFJlcXVlc3QoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN5bmNocm9uaXplZCAocmVxdWVzdExpc3QpIHsKLQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSVBESVN0b3BEZWJ1Z2dlclJlcXVlc3QpIHsKLQkJCQlyZXF1ZXN0LmRvbmUoKTsKLQkJCQlub3RpZnlFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkJc2Vzc2lvbi5zZXRTdGF0dXMoSVBESVNlc3Npb24uRVhJVEVEKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlQRGVidWdVdGlscy5wcmludGxuKCIqKioqIE1zZzogQWJzdHJhY3RFdmVudE1hbmFnZXIgLSByZWdpc3RlckV2ZW50UmVxdWVzdCgpOiBSZXF1ZXN0OiAiICsgcmVxdWVzdCk7Ci0JCQkJcmVxdWVzdExpc3QuYWRkKG5ldyBFdmVudFJlcXVlc3RTY2hlZHVsZWRUYXNrKHJlcXVlc3QpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRNYW5hZ2VyI3JlbW92ZUFsbFJlZ2lzdGVyZWRFdmVudFJlcXVlc3RzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxSZWdpc3RlcmVkRXZlbnRSZXF1ZXN0cygpIHsKLQkJc3luY2hyb25pemVkIChyZXF1ZXN0TGlzdCkgewotCQkJRXZlbnRSZXF1ZXN0U2NoZWR1bGVkVGFza1tdIHNjaGVkdWxlZFRhc2tzID0gcmVxdWVzdExpc3QudG9BcnJheShuZXcgRXZlbnRSZXF1ZXN0U2NoZWR1bGVkVGFza1swXSk7Ci0JCQlmb3IgKEV2ZW50UmVxdWVzdFNjaGVkdWxlZFRhc2sgc2NoZWR1bGVkVGFzayA6IHNjaGVkdWxlZFRhc2tzKSB7Ci0JCQkJc2NoZWR1bGVkVGFzay5jYW5jZWxUaW1lb3V0KCk7Ci0JCQl9Ci0JCQlyZXF1ZXN0TGlzdC5jbGVhcigpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFdmVudE1hbmFnZXIjcmVtb3ZlRXZlbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lcihJUERJRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciNzaHV0ZG93bigpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXJlcXVlc3ROb3RpZmllci5kZWxldGVPYnNlcnZlcihzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKSk7Ci0JCWxpc3RlbmVyTGlzdC5jbGVhcigpOwotCQlyZXF1ZXN0TGlzdC5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuQWJzdHJhY3RQRElNYW5hZ2VyI3VwZGF0ZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElFdmVudFJlcXVlc3QgZ2V0Q3VycmVudFJlcXVlc3QoKSB7Ci0JCXN5bmNocm9uaXplZCAocmVxdWVzdExpc3QpIHsKLQkJCWlmICghcmVxdWVzdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIHJlcXVlc3RMaXN0LmdldCgwKS5nZXRSZXF1ZXN0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9BYnN0cmFjdE1hbmFnZXJGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvQWJzdHJhY3RNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIzYmM5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9BYnN0cmFjdE1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXIuQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXIuRXZlbnRSZXF1ZXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlci5FeHByZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlci5NZW1vcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyLlJlZ2lzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlci5TaWduYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyLlNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXIuVGFyZ2V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlci5UYXNrTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlci5UaHJlYWRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyLlZhcmlhYmxlTWFuYWdlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW5hZ2VyRmFjdG9yeSBpbXBsZW1lbnRzIElQRElNYW5hZ2VyRmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld0JyZWFrcG9pbnRNYW5hZ2VyKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbikKLQkgKi8KLQlwdWJsaWMgSVBESUJyZWFrcG9pbnRNYW5hZ2VyIG5ld0JyZWFrcG9pbnRNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBCcmVha3BvaW50TWFuYWdlcihzZXNzaW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWFuYWdlckZhY3RvcnkjbmV3RXZlbnRSZXF1ZXN0TWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElFdmVudFJlcXVlc3RNYW5hZ2VyIG5ld0V2ZW50UmVxdWVzdE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlyZXR1cm4gbmV3IEV2ZW50UmVxdWVzdE1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld0V4cHJlc3Npb25NYW5hZ2VyKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbikKLQkgKi8KLQlwdWJsaWMgSVBESUV4cHJlc3Npb25NYW5hZ2VyIG5ld0V4cHJlc3Npb25NYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBFeHByZXNzaW9uTWFuYWdlcihzZXNzaW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWFuYWdlckZhY3RvcnkjbmV3TWVtb3J5TWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElNZW1vcnlNYW5hZ2VyIG5ld01lbW9yeU1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlyZXR1cm4gbmV3IE1lbW9yeU1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld1JlZ2lzdGVyTWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElSZWdpc3Rlck1hbmFnZXIgbmV3UmVnaXN0ZXJNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBSZWdpc3Rlck1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld1NpZ25hbE1hbmFnZXIob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uKQotCSAqLwotCXB1YmxpYyBJUERJU2lnbmFsTWFuYWdlciBuZXdTaWduYWxNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBTaWduYWxNYW5hZ2VyKHNlc3Npb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElNYW5hZ2VyRmFjdG9yeSNuZXdTb3VyY2VNYW5hZ2VyKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbikKLQkgKi8KLQlwdWJsaWMgSVBESVNvdXJjZU1hbmFnZXIgbmV3U291cmNlTWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCXJldHVybiBuZXcgU291cmNlTWFuYWdlcihzZXNzaW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWFuYWdlckZhY3RvcnkjbmV3VGFyZ2V0TWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElUYXJnZXRNYW5hZ2VyIG5ld1RhcmdldE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlyZXR1cm4gbmV3IFRhcmdldE1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld1Rhc2tNYW5hZ2VyKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbikKLQkgKi8KLQlwdWJsaWMgSVBESVRhc2tNYW5hZ2VyIG5ld1Rhc2tNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBUYXNrTWFuYWdlcihzZXNzaW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWFuYWdlckZhY3RvcnkjbmV3VGhyZWFkTWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElUaHJlYWRNYW5hZ2VyIG5ld1RocmVhZE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlyZXR1cm4gbmV3IFRocmVhZE1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld1ZhcmlhYmxlTWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZU1hbmFnZXIgbmV3VmFyaWFibGVNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBWYXJpYWJsZU1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUJyZWFrcG9pbnRNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUJyZWFrcG9pbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjk1YzcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElCcmVha3BvaW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQWRkcmVzc0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRnVuY3Rpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxpbmVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQWRkcmVzc0JyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRXhjZXB0aW9ucG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElGdW5jdGlvbkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVdhdGNocG9pbnQ7Ci0KLS8qKgotICogUmVwcmVzZW50IGJyZWFrcG9pbnQgbWFuYWdlciB0byBtYW5hZ2UgYnJlYWtwb2ludHMKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJQnJlYWtwb2ludE1hbmFnZXIgZXh0ZW5kcyBJUERJTWFuYWdlciB7Ci0JLyoqCi0JICogQ2FsbGVkIHdoZW4gbmV3IHRhc2tzIGFyZSBhZGRlZCB0byBhIHNldC4gVXBkYXRlcyB0aGUgYnJlYWtwb2ludCBzbyB0aGF0Ci0JICogaXQgaXMgc2V0IG9uIHRoZSBuZXcgdGFza3MuCi0JICogCi0JICogQHBhcmFtIHRhc2tzIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkCi0JICogQHBhcmFtIGJyZWFrcG9pbnQgYnJlYWtwb2ludCB0byB1cGRhdGUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNldEJyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYWRkcmVzcyBsb2NhdGlvbgotCSAqIEBwYXJhbSBhZGRyZXNzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJQWRkcmVzc0xvY2F0aW9uIGNyZWF0ZUFkZHJlc3NMb2NhdGlvbihCaWdJbnRlZ2VyIGFkZHJlc3MpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBjb25kaXRpb24KLQkgKiBAcGFyYW0gaWdub3JlQ291bnQKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0aWRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJQ29uZGl0aW9uIGNyZWF0ZUNvbmRpdGlvbihpbnQgaWdub3JlQ291bnQsIFN0cmluZyBleHByZXNzaW9uLCBTdHJpbmdbXSB0aWRzKTsKLQotCS8qKgotCSAqIENyZWF0ZSBmdW5jdGlvbiBsb2NhdGlvbgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGZ1bmN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRnVuY3Rpb25Mb2NhdGlvbiBjcmVhdGVGdW5jdGlvbkxvY2F0aW9uKFN0cmluZyBmaWxlLCBTdHJpbmcgZnVuY3Rpb24pOwotCQotCS8qKgotCSAqIENyZWF0ZXMgbGluZSBsb2NhdGlvbgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGxpbmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElMaW5lTG9jYXRpb24gY3JlYXRlTGluZUxvY2F0aW9uKFN0cmluZyBmaWxlLCBpbnQgbGluZSk7Ci0KLQkvKioKLQkgKiBEZWxldGVzIGFsbCBicmVha3BvaW50IG9mIGFsbCBwcm9jZXNzZXMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQWxsQnJlYWtwb2ludHMoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGVsZXRlcyBhbGwgYnJlYWtwb2ludHMgb2Ygc3BlY2lmeSBwcm9jZXNzCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEJyZWFrcG9pbnRzKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBEZWxldGVzIGJyZWFrcG9pbnQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUgCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicmVha3BvaW50KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIERlbGV0ZXMgYSBicmVha3BvaW50IHRoYXQgaXMgZGlmZmVyZW50IGZyb20gb3JpZ2luYWwgdGFzawotCSAqIEBwYXJhbSB0YXNrcyBsYXRlc3QgdGFza3MKLQkgKiBAcGFyYW0gYnJlYWtwb2ludCBicmVha3BvaW50IHRvIGJlIGRlbGV0ZWQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVNldEJyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIERpc2FibGUgYnJlYWtwb2ludAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBicmVha3BvaW50Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicmVha3BvaW50KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRW5hYmxlcyBicmVha3BvaW50Ci0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJyZWFrcG9pbnQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUJyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElCcmVha3BvaW50IGdldEJyZWFrcG9pbnQoaW50IGlkKTsKLQkKLQkvKioKLQkgKiBTZXRzIGFkZHJlc3MgYnJlYWtwb2ludAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSBkZWZlcnJlZAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElBZGRyZXNzQnJlYWtwb2ludCBzZXRBZGRyZXNzQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgSVBESUFkZHJlc3NMb2NhdGlvbiBsb2NhdGlvbiwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZGVmZXJyZWQsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgY29uZGl0aW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJyZWFrcG9pbnQKLQkgKiBAcGFyYW0gbmV3Q29uZGl0aW9uCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSVBESUNvbmRpdGlvbiBuZXdDb25kaXRpb24pIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIGV4Y2VwdGlvbnBvaW50Ci0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHBhcmFtIHN0b3BPblRocm93Ci0JICogQHBhcmFtIHN0b3BPbkNhdGNoCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESUV4Y2VwdGlvbnBvaW50IHNldEV4Y2VwdGlvbnBvaW50KEJpdExpc3QgdGFza3MsIFN0cmluZyBjbGF6eiwgYm9vbGVhbiBzdG9wT25UaHJvdywgYm9vbGVhbiBzdG9wT25DYXRjaCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFNldHMgZnVuY3Rpb24gYnJlYWtwb2ludAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSBkZWZlcnJlZAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElGdW5jdGlvbkJyZWFrcG9pbnQgc2V0RnVuY3Rpb25CcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCB0eXBlLCBJUERJRnVuY3Rpb25Mb2NhdGlvbiBsb2NhdGlvbiwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZGVmZXJyZWQsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgbGluZSBicmVha3BvaW50Ci0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIGRlZmVycmVkCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESUxpbmVCcmVha3BvaW50IHNldExpbmVCcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCB0eXBlLCBJUERJTGluZUxvY2F0aW9uIGxvY2F0aW9uLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwgYm9vbGVhbiBkZWZlcnJlZCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0cyB3YXRjaHBvaW50Ci0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gd2F0Y2hUeXBlCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESVdhdGNocG9pbnQgc2V0V2F0Y2hwb2ludChCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgaW50IHdhdGNoVHlwZSwgU3RyaW5nIGV4cHJlc3Npb24sIElQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW55IHBlbmRpbmcgYnJlYWtwb2ludHMuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBkZWJ1Z2dlciBlbnRlcnMgc3VzcGVuZGVkIHN0YXRlCi0JICogdG8gdXBkYXRlIGFueSBicmVha3BvaW50cyB0aGF0IGNvdWxkIG5vdCBiZSBzZXQgb3IgZGVsZXRlZCBiZWNhdXNlIHRhc2tzIHdlcmUgcnVubmluZy4KLQkgKiAKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVBlbmRpbmdCcmVha3BvaW50cygpIHRocm93cyBQRElFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUV2ZW50TWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElFdmVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjY2JkZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUV2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLk9ic2VydmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdDsKLQotLyoqCi0gKiBDbGllbnRzIGludGVyZXN0ZWQgaW4gdGhlIFBESSBtb2RlbCBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1heSByZWdpc3RlciB3aXRoIHRoaXMgb2JqZWN0Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUV2ZW50TWFuYWdlciBleHRlbmRzIElQRElNYW5hZ2VyLCBPYnNlcnZlciB7Ci0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuIAotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgLSB0aGUgbGlzdGVuZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXZlbnRMaXN0ZW5lcihJUERJRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlRXZlbnQoSVBESUV2ZW50IGV2ZW50KTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnRzCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUV2ZW50cyhmaW5hbCBJUERJRXZlbnRbXSBldmVudHMpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUV2ZW50UmVxdWVzdCBnZXRDdXJyZW50UmVxdWVzdCgpOwotCQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXZlbnRSZXF1ZXN0KElQRElFdmVudFJlcXVlc3QgcmVxdWVzdCk7Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgYSByZXF1ZXN0IGluIGV2ZW50IG1hbmFnZXIgZm9yIGxvb2t1cAotCSAqIEBwYXJhbSByZXF1ZXN0IGFuIGV2ZW50IHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckV2ZW50UmVxdWVzdChJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QpOwotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZ2lzdGVyZWRFdmVudFJlcXVlc3RzKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkCi0JICogQHBhcmFtIGxpc3RlbmVyIC0gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUV2ZW50TGlzdGVuZXIoSVBESUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElFdmVudFJlcXVlc3RNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwYTkyMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdDsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgbnVtYmVyIG9mIEV2ZW50UmVxdWVzdHMgZm9yIGEgdGFyZ2V0IGRlYnVnZ2VyLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElFdmVudFJlcXVlc3RNYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIsIE9ic2VydmVyIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbkV2ZW50UmVxdWVzdHMoKTsKLQkKLQkvKioKLQkgKiBBZGRzIGFuIGV2ZW50IHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVxdWVzdCBldmVudCByZXF1ZXN0IGlzIGJlaW5nIGFkZGVkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV2ZW50UmVxdWVzdChJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgaGFuZGxlciBjYW4gZXhlY3V0ZSBvbiB0aGUgZWxlbWVudHMgc3BlY2lmaWVkCi0JICogaW4gdGhlIGdpdmVuIHJlcXVlc3QgYnkgcmVwb3J0aW5nIGVuYWJsZWQgc3RhdGUgdG8gdGhlIHJlcXVlc3QuCi0JICogQHBhcmFtIHJlcXVlc3Qgc3BlY2lmaWVzIGVsZW1lbnRzIHRvIG9wZXJhdGUgb24gYW5kIGNvbGxlY3RzIGVuYWJsZWQgc3RhdGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBoYW5kbGVyIGNhbiBleGVjdXRlIHRoaXMgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KTsKLQkvKioKLQkgKiBEZWxldGVzIGFsbCBldmVudCByZXF1ZXN0cwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVBbGxFdmVudFJlcXVlc3RzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBEZWxldGVzIGFuIGV2ZW50IHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVxdWVzdCBldmVudCByZXF1ZXN0IGlzIGJlaW5nIHJlbW92ZWQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRXZlbnRSZXF1ZXN0KElQRElFdmVudFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGNvbW1hbmQgb24gdGhlIGVsZW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gcmVxdWVzdAotCSAqIHJlcG9ydGluZyBzdGF0dXMgdG8gdGhlIGdpdmVuIHJlcXVlc3QgYW5kIHJldHVybnMgd2hldGhlciB0aGlzIGhhbmRsZXIgc2hvdWxkCi0JICogcmVtYWluIGVuYWJsZWQgd2hpbGUgdGhlIGNvbW1hbmQgaXMgZXhlY3V0aW5nLgotCSAqIEBwYXJhbSByZXF1ZXN0IHNwZWNpZmllcyBlbGVtZW50cyB0byBvcGVyYXRlIG9uIGFuZCBjb2xsZWN0cyBleGVjdXRpb24gc3RhdHVzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RvcmVkIHJlcXVlc3RzCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdG9yZWQgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgSVBESUV2ZW50UmVxdWVzdFtdIGdldFJlcXVlc3RzKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUV4cHJlc3Npb25NYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESUV4cHJlc3Npb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWZkZGYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElFeHByZXNzaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU11bHRpRXhwcmVzc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBSZXByZXNlbnQgZXhwcmVzc2lvbiBtYW5hZ2VyIHRvIG1hbmFnZSBtdWx0aXBsZSBleHByZXNzaW9uCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUV4cHJlc3Npb25NYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIgewotCS8qKgotCSAqIENsZWFuIGV4cHJlc3Npb24gdmFsdWUgd2l0aCBnaXZlbiB0YXNrcwotCSAqIEBwYXJhbSB0YXNrcyB0YXNrcwotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbk11bHRpRXhwcmVzc2lvbnMoQml0TGlzdCB0YXNrcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENsZWFuIGV4cHJlc3Npb24gdmFsdWUgd2l0aCBnaXZlbiB0YXNrcwotCSAqIEBwYXJhbSBleHByVGV4dAotCSAqIEBwYXJhbSB0YXNrcyB0YXNrcwotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbk11bHRpRXhwcmVzc2lvbnMoU3RyaW5nIGV4cHJUZXh0LCBCaXRMaXN0IHRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHByZXNzaW9uIGZvciBzcGVjaWZ5IHZhcmlhYmxlCi0JICogQHBhcmFtIHFUYXNrcyB0YXNrIAotCSAqIEBwYXJhbSBleHByIHZhcmlhYmxlCi0JICogQHJldHVybiBJUERJRXhwcmVzc2lvbiBleHByZXNzaW9uCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0RXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgZXhwcikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIG11dGxpcGxlIGV4cHJlc3Npb24gb2JqZWN0IGZvciBhIG51bWJlciBvZiBwcm9jZXNzZXMgd2l0aCBvbmUgdmFyaWFibGUKLQkgKiBAcGFyYW0gdGFza3MgdGFzawotCSAqIEBwYXJhbSBleHByVGV4dCB2YXJpYWJsZQotCSAqIEBwYXJhbSBlbmFibGVkIHN0YXR1cyBvZiB0aGlzIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVNdXRsaUV4cHJlc3Npb25zKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByVGV4dCwgYm9vbGVhbiBlbmFibGVkKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiBAcGFyYW0gZXhwcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSB2YXJpYWJsZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlVmFyaWFibGUoSVBESVZhcmlhYmxlIHZhcmlhYmxlKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbnMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRlc3Ryb3lFeHByZXNzaW9ucyhCaXRMaXN0IHFUYXNrcywgSVBESUV4cHJlc3Npb25bXSBleHByZXNzaW9ucykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGV4cHIKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUFJRiBnZXRFeHByZXNzaW9uVmFsdWUoQml0TGlzdCBxVGFza3MsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBJUERJTXVsdGlFeHByZXNzaW9ucyB3aXRoIHNwZWNpZmljIGV4cHJlc3Npb24gdmFsdWUKLQkgKiBAcGFyYW0gZXhwclRleHQgZXhwcmVzc2lvbiB2YWx1ZQotCSAqIEByZXR1cm4gSVBESU11bHRpRXhwcmVzc2lvbnMKLQkgKi8KLQlwdWJsaWMgSVBESU11bHRpRXhwcmVzc2lvbnMgZ2V0TXVsdGlFeHByZXNzaW9uKFN0cmluZyBleHByVGV4dCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBtdWx0aXBsZSBleHByZXNzaW9ucwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbXVsdGlwbGUgZXhwcmVzc2lvbnMKLQkgKi8KLQlwdWJsaWMgSVBESU11bHRpRXhwcmVzc2lvbnNbXSBnZXRNdWx0aUV4cHJlc3Npb25zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhcnJheSBvZiBlbmFibGVkIElQRElFeHByZXNzaW9uIHdpdGggc3BlY2lmaWMgdGFzayBpZAotCSAqIEBwYXJhbSB0YXNrIHRhc2sgaWQKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGVuYWJsZWQgSVBESUV4cHJlc3Npb24gd2l0aCBzcGVjaWZpYyB0YXNrIGlkCi0JICovCi0JcHVibGljIElQRElFeHByZXNzaW9uW10gZ2V0TXVsdGlFeHByZXNzaW9ucyhpbnQgdGFzayk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIG11bHRpcGxlIGV4cHJlc3Npb25zIGZyb20gc3RvcmUKLQkgKiBAcGFyYW0gcVRhc2tzIHRhc2sgCi0JICogQHBhcmFtIGV4cHJUZXh0IGV4cHJlc3Npb24gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU11dGxpRXhwcmVzc2lvbnMoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHJUZXh0KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgbXVsdGlwbGUgZXhwcmVzc2lvbnMgZnJvbSBzdG9yZQotCSAqIEBwYXJhbSBleHByVGV4dCBleHByZXNzaW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNdXRsaUV4cHJlc3Npb25zKFN0cmluZyBleHByVGV4dCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIHZhckxpc3QKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcywgU3RyaW5nW10gdmFyTGlzdCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBVcGRhdGUgZXhwcmVzc2lvbiB2YWx1ZQotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aUV4cHJlc3Npb25zKEJpdExpc3QgdGFza3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBVcGRhdGUgZXhwcmVzc2lvbiB2YWx1ZQotCSAqIEBwYXJhbSBleHByVGV4dAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aUV4cHJlc3Npb25zKFN0cmluZyBleHByVGV4dCwgQml0TGlzdCB0YXNrcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFVwZGF0ZSBzdGF0dXMgb2YgbXVsdGlwbGUgZXhwcmVzc2lvbnMKLQkgKiBAcGFyYW0gZXhwclRleHQgZXhwcmVzc2lvbiBuYW1lCi0JICogQHBhcmFtIGVuYWJsZWQgc3RhdHVzIG9mIHRoaXMgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXR1c011bHRpRXhwcmVzc2lvbnMoU3RyaW5nIGV4cHJUZXh0LCBib29sZWFuIGVuYWJsZWQpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOWEzZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogQmFzZSBtYW5hZ2VyIGludGVyZmFjZXMKLSAqIAotICogQGF1dGhvciBncmVnCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElNYW5hZ2VyIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9VcGRhdGUoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdXBkYXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b1VwZGF0ZShib29sZWFuIHVwZGF0ZSk7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjYwZDI1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQRElNYW5hZ2VyRmFjdG9yeSB7Ci0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElCcmVha3BvaW50TWFuYWdlciBuZXdCcmVha3BvaW50TWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRXZlbnRNYW5hZ2VyIG5ld0V2ZW50TWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRXZlbnRSZXF1ZXN0TWFuYWdlciBuZXdFdmVudFJlcXVlc3RNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElFeHByZXNzaW9uTWFuYWdlciBuZXdFeHByZXNzaW9uTWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTWVtb3J5TWFuYWdlciBuZXdNZW1vcnlNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElSZWdpc3Rlck1hbmFnZXIgbmV3UmVnaXN0ZXJNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTaWduYWxNYW5hZ2VyIG5ld1NpZ25hbE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVNvdXJjZU1hbmFnZXIgbmV3U291cmNlTWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0TWFuYWdlciBuZXdUYXJnZXRNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElUYXNrTWFuYWdlciBuZXdUYXNrTWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkTWFuYWdlciBuZXdUaHJlYWRNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZU1hbmFnZXIgbmV3VmFyaWFibGVNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElNZW1vcnlNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESU1lbW9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5YmUyNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESU1lbW9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrOwotCi0vKioKLSAqIFJlcHJlc2VudCBtZW1lb3J5IG1hbmFnZXIgdG8gbWFuYWdlIG1lbW9yeQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElNZW1vcnlNYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIgewotCS8qKgotCSAqIFJldHVybnMgYSBtZW1vcnkgYmxvY2sgc3BlY2lmaWVkIGJ5IGdpdmVuIGlkZW50aWZpZXIuCi0JICogQHBhcmFtIHFUYXNrcyB0YXJnZXQgcHJvY2VzcwotCSAqIEBwYXJhbSBhZGRyZXNzIAotCSAqIEBwYXJhbSB1bml0cyAtIG51bWJlciBvZiBieXRlcwotCSAqIEBwYXJhbSB3b3JkU2l6ZSAtIHRoaXMgcGFyYW1ldGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYWx3YXlzIGJlIHBhc3NlZCBhcyB0aGUgdmFsdWUgMS4gSWYgdGhlIG1lbW9yeSBoYXMgYW4gYWRkcmVzc2FibGUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBhZGRyZXNzKSBncmVhdGhlciB0aGFuIDEsIHRoZSBQREkgY2xpZW50IHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCi0JICogQHJldHVybiBhIG1lbW9yeSBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeUJsb2NrIGNyZWF0ZU1lbW9yeUJsb2NrKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgYWRkcmVzcywgaW50IHVuaXRzLCBpbnQgd29yZFNpemUpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgbWVtb3J5IGJsb2NrcyBzZXQgZm9yIHRoaXMgZGVidWcgc2Vzc2lvbi4KLQkgKiBAcGFyYW0gcVRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhbGwgbWVtb3J5IGJsb2NrcyBzZXQgZm9yIHRoaXMgZGVidWcgc2Vzc2lvbgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeUJsb2NrW10gZ2V0TWVtb3J5QmxvY2tzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gcmVtb3ZlIGFsbCBtZW1vcnkgYmxvY2tzIGZyb20gdGhlIGRlYnVnIHNlc3Npb24uCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbEJsb2NrcyhCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdG8gcmVtb3ZlIHRoZSBnaXZlbiBhcnJheSBvZiBtZW1vcnkgYmxvY2tzIGZyb20gdGhlIGRlYnVnIHNlc3Npb24uCi0JICogQHBhcmFtIHRhc2tzIHRhcmdldCBwcm9jZXNzCi0JICogQHBhcmFtIG1lbW9yeUJsb2NrIC0gdGhlIGFycmF5IG9mIG1lbW9yeSBibG9ja3MgdG8gYmUgcmVtb3ZlZAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja3MoQml0TGlzdCB0YXNrcywgSVBESU1lbW9yeUJsb2NrW10gbWVtb3J5QmxvY2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGJsb2NrCi0JICogQHBhcmFtIGFMaXN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXJbXSB1cGRhdGUoSVBESU1lbW9yeUJsb2NrIGJsb2NrLCBMaXN0PElQRElFdmVudD4gYUxpc3QpIHRocm93cyBQRElFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVJlZ2lzdGVyTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElSZWdpc3Rlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YzVjNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVJlZ2lzdGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnQgcmVnaXN0ZXIgbWFuYWdlciB0byBtYW5hZ2UgcmVnaXN0ZXIKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJUmVnaXN0ZXJNYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIgewotCS8qKgotCSAqIEBwYXJhbSByZWdEZXNjCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElSZWdpc3RlciBjcmVhdGVSZWdpc3RlcihJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIHJlZ0Rlc2MpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lzdGVyCi0JICogQHBhcmFtIGZyYW1lCi0JICogQHBhcmFtIHJlZ05hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlIGNyZWF0ZVNoYWRvd1JlZ2lzdGVyKElQRElSZWdpc3RlciByZWdpc3RlciwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyByZWdOYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSByZWcKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXN0cm95UmVnaXN0ZXIoSVBESVJlZ2lzdGVyIHJlZyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJUmVnaXN0ZXJHcm91cFtdIGdldFJlZ2lzdGVyR3JvdXBzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElTaWduYWxNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVNpZ25hbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxYjVkOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVNpZ25hbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsOwotCi0vKioKLSAqIFJlcHJlc2VudCBzaWduYWwgbWFuYWdlciB0byBtYW5hZ2Ugc2lnbmFsCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVNpZ25hbE1hbmFnZXIgZXh0ZW5kcyBJUERJTWFuYWdlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygc2lnbmFscyBkZWZpbmVkIGZvciB0aGlzIHRhcmdldC4KLQkgKiBAcGFyYW0gdGFza3MgdGFyZ2V0IHByb2Nlc3MgCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc2lnbmFscwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVNpZ25hbFtdIGdldFNpZ25hbHMoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2lnCi0JICogQHBhcmFtIGlzSWdub3JlCi0JICogQHBhcmFtIGlzU3RvcAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlKElQRElTaWduYWwgc2lnLCBib29sZWFuIGlzSWdub3JlLCBib29sZWFuIGlzU3RvcCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJU291cmNlTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElTb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2MxYWYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElTb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1peGVkSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTb3VyY2VNYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSB0eXBlbmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsVHlwZU5hbWUoSVBESVRhcmdldCB0YXJnZXQsIFN0cmluZyB0eXBlbmFtZSkKLQkJCXRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiBAcGFyYW0gdmFyaWFibGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERldGFpbFR5cGVOYW1lRnJvbVZhcmlhYmxlKElQRElTdGFja0ZyYW1lIGZyYW1lLAotCQkJU3RyaW5nIHZhcmlhYmxlKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBlbmQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESUluc3RydWN0aW9uW10gZ2V0SW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLCBCaWdJbnRlZ2VyIHN0YXJ0LAotCQkJQmlnSW50ZWdlciBlbmQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGxpbmVudW0KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESUluc3RydWN0aW9uW10gZ2V0SW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgZmlsZW5hbWUsCi0JCQlpbnQgbGluZW51bSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcGFyYW0gbGluZW51bQotCSAqIEBwYXJhbSBsaW5lcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJSW5zdHJ1Y3Rpb25bXSBnZXRJbnN0cnVjdGlvbnMoQml0TGlzdCBxVGFza3MsIFN0cmluZyBmaWxlbmFtZSwKLQkJCWludCBsaW5lbnVtLCBpbnQgbGluZXMpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGVuZAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJTWl4ZWRJbnN0cnVjdGlvbltdIGdldE1peGVkSW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLAotCQkJQmlnSW50ZWdlciBzdGFydCwgQmlnSW50ZWdlciBlbmQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGxpbmVudW0KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESU1peGVkSW5zdHJ1Y3Rpb25bXSBnZXRNaXhlZEluc3RydWN0aW9ucyhCaXRMaXN0IHFUYXNrcywKLQkJCVN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmVudW0pIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGxpbmVudW0KLQkgKiBAcGFyYW0gbGluZXMKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESU1peGVkSW5zdHJ1Y3Rpb25bXSBnZXRNaXhlZEluc3RydWN0aW9ucyhCaXRMaXN0IHFUYXNrcywKLQkJCVN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmVudW0sIGludCBsaW5lcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U291cmNlUGF0aHMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIHZhcmlhYmxlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZShJUERJVGFyZ2V0IHRhcmdldCwgU3RyaW5nIHZhcmlhYmxlKQotCQkJdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBmcmFtZQotCSAqIEBwYXJhbSB2YXJpYWJsZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVGcm9tVmFyaWFibGUoSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyB2YXJpYWJsZSkKLQkJCXRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGRpcnMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhdGhzKEJpdExpc3QgcVRhc2tzLCBTdHJpbmdbXSBkaXJzKQotCQkJdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJVGFyZ2V0TWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElUYXJnZXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzc5ZjAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElUYXJnZXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQ7Ci0KLS8qKgotICogUmVwcmVzZW50IGV4cHJlc3Npb24gbWFuYWdlciB0byBtYW5hZ2UgcHJvY2Vzc2VzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVRhcmdldE1hbmFnZXIgZXh0ZW5kcyBJUERJTWFuYWdlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0YXJnZXQgb2Ygc3BlY2lmeSB0YXNrcwotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuIHRhcmdldCBvZiBzcGVjaWZ5IHRhc2tzCi0JICovCi0JSVBESVRhcmdldCBnZXRUYXJnZXQoQml0TGlzdCBxVGFza3MpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGFyZ2V0cwotCSAqIEByZXR1cm4gYWxsIHRhcmdldHMKLQkgKi8KLQlJUERJVGFyZ2V0W10gZ2V0VGFyZ2V0cygpOwotCi0JLyoqCi0JICogQWRkcyB0YXNrIHRvIGJlIGEgdGFyZ2V0Ci0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4gY3JlYXRlZCB0YXJnZXQKLQkgKi8KLQlJUERJVGFyZ2V0IGFkZFRhcmdldChCaXRMaXN0IHFUYXNrcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgZ2l2ZW4gdGFza3MgYXJlIGRlbGV0ZWQgaXRzIHRhcmdldAotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuIHRydWUgaWYgZ2l2ZW4gdGFza3MgYXJlIGRlbGV0ZWQgaXRzIHRhcmdldAotCSAqLwotCWJvb2xlYW4gcmVtb3ZlVGFyZ2V0KEJpdExpc3QgcVRhc2tzKTsKLQkKLQkvKioKLQkgKiBDbGVhbnMgdXAgc3RvcmFnZQotCSAqLwotCXZvaWQgY2xlYW51cCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElUYXNrTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElUYXNrTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzQ5YzVhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJVGFza01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50IGV4cHJlc3Npb24gbWFuYWdlciB0byBtYW5hZ2UgcHJvY2Vzc2VzCi0gKiAKLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVRhc2tNYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIgewotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5BbGxTdGVwUmV0dXJuKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldENhbm5vdFN0ZXBSZXR1cm5UYXNrcyhCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRDYW5TdGVwUmV0dXJuVGFza3MoKTsKLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRDYW5TdGVwUmV0dXJuVGFza3MoQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0Tm9uUGVuZGluZ1Rhc2tzKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogRmluZCB0ZXJtaW5hdGVkIG9yIHN1c3BlbmRlZCB0YXNrcwotCSAqIAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXROb25SdW5uaW5nVGFza3MoQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBGaW5kIHRlcm1pbmF0ZWQgb3IgcnVubmluZyB0YXNrcwotCSAqIAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXROb25TdXNwZW5kZWRUYXNrcyhCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEZpbmQgcnVubmluZyBvciBzdXNwZW5kZWQgdGFza3MKLQkgKiAKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0Tm9uVGVybWluYXRlZFRhc2tzKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFBlbmRpbmdUYXNrcygpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFBlbmRpbmdUYXNrcyhCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEdldCBhbGwgcmVnaXN0ZXJlZCB0YXNrcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRSZWdpc3RlcmVkVGFza3MoKTsKLQotCS8qKgotCSAqIEZpbmQgcmVnaXN0ZXJlZCB0YXNrcwotCSAqIAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRSZWdpc3RlcmVkVGFza3MoQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBGaW5kIHJ1bm5pbmcgdGFza3MKLQkgKiAKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0UnVubmluZ1Rhc2tzKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogR2V0IGFsbCBzdXNwZW5kZWQgdGFza3MKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0U3VzcGVuZGVkVGFza3MoKTsKLQotCS8qKgotCSAqIEZpbmQgc3VzcGVuZGVkIHRhc2tzCi0JICogCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFN1c3BlbmRlZFRhc2tzKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogR2V0IGFsbCB0ZXJtaW5hdGVkIHRhc2tzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFRlcm1pbmF0ZWRUYXNrcygpOwotCi0JLyoqCi0JICogRmluZCB0ZXJtaW5hdGVkIHRhc2tzCi0JICogCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFRlcm1pbmF0ZWRUYXNrcyhCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEZpbmQgdW5yZWdpc3RlcmVkIHRhc2tzCi0JICogCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFVucmVnaXN0ZXJlZFRhc2tzKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsUGVuZGluZyhCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbFJlZ2lzdGVyZWQoQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxSdW5uaW5nKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsU3VzcGVuZGVkKEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsVGVybWluYXRlZChCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpc0FkZAotCSAqIEBwYXJhbSB0YXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhblN0ZXBSZXR1cm5UYXNrcyhib29sZWFuIGlzQWRkLCBCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpc0FkZAotCSAqIEBwYXJhbSB0YXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlbmRpbmdUYXNrcyhib29sZWFuIGlzQWRkLCBCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpc0FkZAotCSAqIEBwYXJhbSB0YXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyVGFza3MoYm9vbGVhbiBpc0FkZCwgQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNBZGQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGFza3MoYm9vbGVhbiBpc0FkZCwgQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNBZGQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXJtaW5hdGVUYXNrcyhib29sZWFuIGlzQWRkLCBCaXRMaXN0IHRhc2tzKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJVGhyZWFkTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElUaHJlYWRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGY0Y2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElUaHJlYWRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLQotCi0vKioKLSAqIFJlcHJlc2VudCBleHByZXNzaW9uIG1hbmFnZXIgdG8gbWFuYWdlIHByb2Nlc3NlcwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUaHJlYWRNYW5hZ2VyIGV4dGVuZHMgSVBESU1hbmFnZXIgewotCXB1YmxpYyBJUERJVGhyZWFkW10gZ2V0VGhyZWFkcyhCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJVHJhY2VNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVRyYWNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTE5YjI2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbWFuYWdlci9JUERJVHJhY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXI7Ci0KLQotLyoqCi0gKiBUT0RPCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVRyYWNlTWFuYWdlciBleHRlbmRzIElQRElNYW5hZ2VyIHsKLQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVZhcmlhYmxlTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tYW5hZ2VyL0lQRElWYXJpYWJsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjOWZmMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21hbmFnZXIvSVBESVZhcmlhYmxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBcmd1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFyZ3VtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUdsb2JhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogUmVwcmVzZW50IGV4cHJlc3Npb24gbWFuYWdlciB0byBtYW5hZ2UgcHJvY2Vzc2VzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVZhcmlhYmxlTWFuYWdlciBleHRlbmRzIElQRElNYW5hZ2VyIHsKLQlwdWJsaWMgSVBESUFyZ3VtZW50IGNyZWF0ZUFyZ3VtZW50KElQRElBcmd1bWVudERlc2NyaXB0b3IgYXJnRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlIGNyZWF0ZUdsb2JhbFZhcmlhYmxlKElQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQlwdWJsaWMgSVBESUxvY2FsVmFyaWFibGUgY3JlYXRlTG9jYWxWYXJpYWJsZShJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQlwdWJsaWMgSVBESUFyZ3VtZW50RGVzY3JpcHRvcltdIGdldEFyZ3VtZW50RGVzY3JpcHRvcnMoSVBESVN0YWNrRnJhbWUgZnJhbWUpIHRocm93cyBQRElFeGNlcHRpb247Ci0JcHVibGljIElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcltdIGdldExvY2FsVmFyaWFibGVEZXNjcmlwdG9ycyhJUERJU3RhY2tGcmFtZSBmcmFtZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQlwdWJsaWMgSVBESVZhcmlhYmxlIGdldFZhcmlhYmxlQnlOYW1lKEJpdExpc3QgdGFza3MsIFN0cmluZyB2YXJuYW1lKTsKLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBnZXRHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IoQml0TGlzdCB0YXNrcywgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZnVuY3Rpb24sIFN0cmluZyBuYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCXB1YmxpYyBJUERJVGhyZWFkU3RvcmFnZSBjcmVhdGVUaHJlYWRTdG9yYWdlKElQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvciBkZXNjKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCXB1YmxpYyBJUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3JbXSBnZXRUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcnMoSVBESVRocmVhZCB0aHJlYWQpIHRocm93cyBQRElFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgZGVzdHJveVZhcmlhYmxlKElQRElWYXJpYWJsZSB2YXJpYWJsZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQlwdWJsaWMgSVBESVZhcmlhYmxlIGNyZWF0ZVZhcmlhYmxlKElQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFyRGVzYwotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBnZXRWYXJpYWJsZURlc2NyaXB0b3JBc0FycmF5KElQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSB2YXJEZXNjCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBnZXRWYXJpYWJsZURlc2NyaXB0b3JBc1R5cGUoSVBESVZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gdmFycwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKEJpdExpc3QgcVRhc2tzLCBTdHJpbmdbXSB2YXJzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9BYnN0cmFjdE1vZGVsRmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9BYnN0cmFjdE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQyMzFjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvQWJzdHJhY3RNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElEYXRhUmVhZE1lbW9yeUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLkFkZHJlc3NCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5Bcmd1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuQXJndW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLkV4Y2VwdGlvbnBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5GdW5jdGlvbkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLkdsb2JhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5HbG9iYWxWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLkxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5Mb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5Mb2NhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuTWVtb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5NZW1vcnlCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuTXVsdGlFeHByZXNzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuUmVnaXN0ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5TaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlNpZ25hbERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlN0YWNrRnJhbWVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuVGhyZWFkU3RvcmFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLldhdGNocG9pbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxGYWN0b3J5IGltcGxlbWVudHMgSVBESU1vZGVsRmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdBZGRyZXNzQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVBESUFkZHJlc3NCcmVha3BvaW50IG5ld0FkZHJlc3NCcmVha3BvaW50KElQRElTZXNzaW9uIHNlc3Npb24sCi0JCQlCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgSVBESUxvY2F0aW9uIGxvY2F0aW9uLAotCQkJSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZW5hYmxlZCkgewotCQlyZXR1cm4gbmV3IEFkZHJlc3NCcmVha3BvaW50KHNlc3Npb24sIHRhc2tzLCB0eXBlLCBsb2NhdGlvbiwgY29uZGl0aW9uLCBlbmFibGVkKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdBcmd1bWVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQXJndW1lbnREZXNjcmlwdG9yLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUERJQXJndW1lbnQgbmV3QXJndW1lbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUlQRElBcmd1bWVudERlc2NyaXB0b3IgYXJnRGVzYywgU3RyaW5nIHZhcklkKSB7Ci0JCXJldHVybiBuZXcgQXJndW1lbnQoc2Vzc2lvbiwgYXJnRGVzYywgdmFySWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5I25ld0FyZ3VtZW50RGVzY3JpcHRvcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIElQRElBcmd1bWVudERlc2NyaXB0b3IgbmV3QXJndW1lbnREZXNjcmlwdG9yKElQRElTZXNzaW9uIHNlc3Npb24sCi0JCQlCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsCi0JCQlTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLCBpbnQgZGVwdGgpIHsKLQkJcmV0dXJuIG5ldyBBcmd1bWVudERlc2NyaXB0b3Ioc2Vzc2lvbiwgdGFza3MsIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdDb25kaXRpb24oaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQRElDb25kaXRpb24gbmV3Q29uZGl0aW9uKGludCBpZ25vcmUsIFN0cmluZyBleHAsIFN0cmluZ1tdIGlkcykgewotCQlyZXR1cm4gbmV3IENvbmRpdGlvbihpZ25vcmUsIGV4cCwgaWRzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdFeGNlcHRpb25wb2ludChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24sIGJvb2xlYW4sIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50W10pCi0JICovCi0JcHVibGljIElQRElFeGNlcHRpb25wb2ludCBuZXdFeGNlcHRpb25wb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLAotCQkJQml0TGlzdCB0YXNrcywgU3RyaW5nIGNsYXp6LCBib29sZWFuIHN0b3BPblRocm93LAotCQkJYm9vbGVhbiBzdG9wT25DYXRjaCwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZW5hYmxlZCwKLQkJCUlQRElGdW5jdGlvbkJyZWFrcG9pbnRbXSBmdW5jQnB0cykgewotCQlyZXR1cm4gbmV3IEV4Y2VwdGlvbnBvaW50KHNlc3Npb24sIHRhc2tzLCBjbGF6eiwgc3RvcE9uVGhyb3csIHN0b3BPbkNhdGNoLCBjb25kaXRpb24sIGVuYWJsZWQsIGZ1bmNCcHRzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdFeHByZXNzaW9uKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0RXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKElQRElTZXNzaW9uIHNlc3Npb24sCi0JCQlCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXgpIHsKLQkJcmV0dXJuIG5ldyBFeHByZXNzaW9uKHNlc3Npb24sIHRhc2tzLCBleCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3RnVuY3Rpb25CcmVha3BvaW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRpb24sIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJUERJRnVuY3Rpb25CcmVha3BvaW50IG5ld0Z1bmN0aW9uQnJlYWtwb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLAotCQkJQml0TGlzdCB0YXNrcywgaW50IHR5cGUsIElQRElMb2NhdGlvbiBsb2NhdGlvbiwKLQkJCUlQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJcmV0dXJuIG5ldyBGdW5jdGlvbkJyZWFrcG9pbnQoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGxvY2F0aW9uLCBjb25kaXRpb24sIGVuYWJsZWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5I25ld0dsb2JhbFZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElHbG9iYWxWYXJpYWJsZSBuZXdHbG9iYWxWYXJpYWJsZShJUERJU2Vzc2lvbiBzZXNzaW9uLAotCQkJSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjLCBTdHJpbmcgdmFySWQpIHsKLQkJcmV0dXJuIG5ldyBHbG9iYWxWYXJpYWJsZShzZXNzaW9uLCB2YXJEZXNjLCB2YXJJZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3R2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBuZXdHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IoCi0JCQlJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwKLQkJCUlQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLAotCQkJaW50IGRlcHRoKSB7Ci0JCXJldHVybiBuZXcgR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKHNlc3Npb24sIHRhc2tzLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmdWxsTmFtZSwgcG9zLCBkZXB0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3TGluZUJyZWFrcG9pbnQob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdGlvbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElMaW5lQnJlYWtwb2ludCBuZXdMaW5lQnJlYWtwb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLAotCQkJQml0TGlzdCB0YXNrcywgaW50IHR5cGUsIElQRElMb2NhdGlvbiBsb2NhdGlvbiwKLQkJCUlQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJcmV0dXJuIG5ldyBMaW5lQnJlYWtwb2ludChzZXNzaW9uLCB0YXNrcywgdHlwZSwgbG9jYXRpb24sIGNvbmRpdGlvbiwgZW5hYmxlZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3TG9jYWxWYXJpYWJsZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElMb2NhbFZhcmlhYmxlIG5ld0xvY2FsVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwKLQkJCVN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCwgU3RyaW5nIHZhcmlkKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZShzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgsIHZhcmlkKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdMb2NhbFZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBESUxvY2FsVmFyaWFibGUgbmV3TG9jYWxWYXJpYWJsZShJUERJU2Vzc2lvbiBzZXNzaW9uLAotCQkJSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yIHZhckRlc2MsIFN0cmluZyB2YXJJZCkgewotCQlyZXR1cm4gbmV3IExvY2FsVmFyaWFibGUoc2Vzc2lvbiwgdmFyRGVzYywgdmFySWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5I25ld0xvY2FsVmFyaWFibGVEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yIG5ld0xvY2FsVmFyaWFibGVEZXNjcmlwdG9yKAotCQkJSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESVRocmVhZCB0aHJlYWQsCi0JCQlJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsTmFtZSwgaW50IHBvcywKLQkJCWludCBkZXB0aCkgewotCQlyZXR1cm4gbmV3IExvY2FsVmFyaWFibGVEZXNjcmlwdG9yKHNlc3Npb24sIHRhc2tzLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmdWxsTmFtZSwgcG9zLCBkZXB0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3TWVtb3J5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeSBuZXdNZW1vcnkoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBhc2NpaSwgU3RyaW5nW10gZGF0YSkgewotCQlyZXR1cm4gbmV3IE1lbW9yeShhZGRyZXNzLCBhc2NpaSwgZGF0YSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3TWVtb3J5QmxvY2sob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElEYXRhUmVhZE1lbW9yeUluZm8pCi0JICovCi0JcHVibGljIElQRElNZW1vcnlCbG9jayBuZXdNZW1vcnlCbG9jayhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLAotCQkJU3RyaW5nIGV4cCwgaW50IHdvcmRTaXplLCBib29sZWFuIGIsIElQRElEYXRhUmVhZE1lbW9yeUluZm8gaW5mbykgewotCQlyZXR1cm4gbmV3IE1lbW9yeUJsb2NrKHNlc3Npb24sIHRhc2tzLCBleHAsIHdvcmRTaXplLCBiLCBpbmZvKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdNdWx0aUV4cHJlc3Npb25zKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJUERJTXVsdGlFeHByZXNzaW9ucyBuZXdNdWx0aUV4cHJlc3Npb25zKElQRElTZXNzaW9uIHNlc3Npb24sCi0JCQlCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXgsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlyZXR1cm4gbmV3IE11bHRpRXhwcmVzc2lvbnMoc2Vzc2lvbiwgdGFza3MsIGV4LCBlbmFibGVkKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdSZWdpc3RlckRlc2NyaXB0b3Iob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVEZXNjcmlwdG9yIG5ld1JlZ2lzdGVyRGVzY3JpcHRvcihJUERJU2Vzc2lvbiBzZXNzaW9uLAotCQkJQml0TGlzdCB0YXNrcywgSVBESVRocmVhZCB0aHJlYWQsIElQRElTdGFja0ZyYW1lIGZyYW1lLAotCQkJU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsTmFtZSwgaW50IHBvcywgaW50IGRlcHRoKSB7Ci0JCXJldHVybiBuZXcgUmVnaXN0ZXJEZXNjcmlwdG9yKHNlc3Npb24sIHRhc2tzLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmdWxsTmFtZSwgcG9zLCBkZXB0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3U2lnbmFsKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbERlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIElQRElTaWduYWwgbmV3U2lnbmFsKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsCi0JCQlJUERJU2lnbmFsRGVzY3JpcHRvciBzaWduYWxEZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBuZXcgU2lnbmFsKHNlc3Npb24sIHRhc2tzLCBzaWduYWxEZXNjcmlwdG9yKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdTaWduYWxEZXNjcmlwdG9yKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElTaWduYWxEZXNjcmlwdG9yIG5ld1NpZ25hbERlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIGJvb2xlYW4gc3RvcCwKLQkJCWJvb2xlYW4gcGFzcywgYm9vbGVhbiBwcmludCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU2lnbmFsRGVzY3JpcHRvcihuYW1lLCBzdG9wLCBwYXNzLCBwcmludCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5I25ld1N0YWNrRnJhbWUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCwgaW50LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3IpCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lIG5ld1N0YWNrRnJhbWUoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUlQRElUaHJlYWQgcHRocmVhZCwgaW50IGksIElQRElMb2NhdG9yIGxvY2F0b3IpIHsKLQkJcmV0dXJuIG5ldyBTdGFja0ZyYW1lKHNlc3Npb24sIHB0aHJlYWQsIGksIGxvY2F0b3IpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5I25ld1N0YWNrRnJhbWUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubWF0aC5CaWdJbnRlZ2VyKQotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZSBuZXdTdGFja0ZyYW1lKElQRElTZXNzaW9uIHNlc3Npb24sIElQRElUaHJlYWQgdGhyZWFkLAotCQkJaW50IGxldmVsLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGZ1bmMsIGludCBsaW5lLCBCaWdJbnRlZ2VyIGFkZHIpIHsKLQkJcmV0dXJuIG5ldyBTdGFja0ZyYW1lKHNlc3Npb24sIHRocmVhZCwgbGV2ZWwsIGZpbGUsIGZ1bmMsIGxpbmUsIGFkZHIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTW9kZWxGYWN0b3J5I25ld1N0YWNrRnJhbWVEZXNjcmlwdG9yKGludCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yKQotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZURlc2NyaXB0b3IgbmV3U3RhY2tGcmFtZURlc2NyaXB0b3IoaW50IGxldmVsLAotCQkJSVBESUxvY2F0b3IgbG9jKSB7Ci0JCXJldHVybiBuZXcgU3RhY2tGcmFtZURlc2NyaXB0b3IobGV2ZWwsIGxvYyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3RvcnkjbmV3VGFyZ2V0KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0IG5ld1RhcmdldChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiBuZXcgVGFyZ2V0KHNlc3Npb24sIHRhc2tzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdUaHJlYWQob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkIG5ld1RocmVhZChJUERJU2Vzc2lvbiBzZXNzaW9uLCBJUERJVGFyZ2V0IHRhcmdldCwKLQkJCWludCBwYXJzZUludCkgewotCQlyZXR1cm4gbmV3IFRocmVhZChzZXNzaW9uLCB0YXJnZXQsIHBhcnNlSW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZURlc2NyaXB0b3IgbmV3VGhyZWFkU3RvcmFnZURlc2NyaXB0b3IoCi0JCQlJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwKLQkJCUlQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLAotCQkJaW50IGRlcHRoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkU3RvcmFnZURlc2NyaXB0b3Ioc2Vzc2lvbiwgdGFza3MsIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1vZGVsRmFjdG9yeSNuZXdXYXRjaHBvaW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElXYXRjaHBvaW50IG5ld1dhdGNocG9pbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywKLQkJCWludCB0eXBlLCBTdHJpbmcgZXhwcmVzc2lvbiwgaW50IHR5cGUyLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwKLQkJCWJvb2xlYW4gZW5hYmxlZCkgewotCQlyZXR1cm4gbmV3IFdhdGNocG9pbnQoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGV4cHJlc3Npb24sIHR5cGUyLCBjb25kaXRpb24sIGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUFkZHJlc3NCcmVha3BvaW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElBZGRyZXNzQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQxZTYzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUFkZHJlc3NCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYWRkcmVzcyBicmVha3BvaW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUFkZHJlc3NCcmVha3BvaW50IGV4dGVuZHMgSVBESUxvY2F0aW9uQnJlYWtwb2ludCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUFyZ3VtZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElBcmd1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZGNmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUFyZ3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXJndW1lbnQgaW4gdGhlIHN0YWNrIGZyYW1lCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUFyZ3VtZW50IGV4dGVuZHMgSVBESUxvY2FsVmFyaWFibGUsIElQRElBcmd1bWVudERlc2NyaXB0b3IgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElBcmd1bWVudERlc2NyaXB0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUFyZ3VtZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzlmZTQ3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUFyZ3VtZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFyZ3VtZW50IGRlc2NyaXB0b3IKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJQXJndW1lbnREZXNjcmlwdG9yIGV4dGVuZHMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUJyZWFrcG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUJyZWFrcG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4NzllNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBsb2NhdGlvbiBicmVha3BvaW50cywgd2F0Y2hwb2ludHMgYW5kIGNhdGNocG9pbnRzLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElCcmVha3BvaW50IGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJlZ3VsYXIgdHlwZQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFR1VMQVIgPSAweDA7Ci0JCi0JLyoqCi0JICogVGVtcG9yYXJ5IHR5cGUgCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVNUE9SQVJZID0gMHgxOwotCQotCS8qKgotCSAqIEhhcmR3YXJlIHR5cGUgCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSEFSRFdBUkUgPSAweDI7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBicmVha3BvaW50IGlkIG9mIHRoaXMgYnJlYWtwb2ludAotCSAqIAotCSAqIEByZXR1cm4gYnJlYWtwb2ludCBpZCBvZiB0aGlzIGJyZWFrcG9pbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEJyZWFrcG9pbnRJRCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBvZiB0aGlzIGJyZWFrcG9pbnQgb3IgbnVsbCBpZiBubyBjb25kaXRpb24gaW4gdGhpcyBicmVha3BvaW50Ci0JICogCi0JICogQHJldHVybiB0aGUgY29uZGl0aW9uIG9mIHRoaXMgYnJlYWtwb2ludAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESUNvbmRpdGlvbiBnZXRDb25kaXRpb24oKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybnMgaW50ZXJuYWwgYnJlYWtwb2ludCBpZAotCSAqIAotCSAqIEByZXR1cm4gaW50ZXJuYWwgYnJlYWtwb2ludCBpZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJuYWxJRCgpOwotCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHNldCBvZiBwZW5kaW5nIHRhc2tzIGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24uIElmIHRoZSBicmVha3BvaW50IGlzIG1hcmtlZAotCSAqIGZvciBkZWxldGlvbiwgaXQncyB0aGUgdGFza3MgdGhhdCBzdGlsbCByZXF1aXJlIHRoZSBicmVha3BvaW50IHRvIGJlIHJlbW92ZWQuIE90aGVyd2lzZSwKLQkgKiBpdHMgdGhlIHRhc2tzIG9uIHdoaWNoIHRoZSBicmVha3BvaW50IHN0aWxsIG5lZWRzIHRvIGJlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHBlbmRpbmcgdGFza3MKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRQZW5kaW5nVGFza3MoKTsKLQkKLQkvKioKLQkgKiBCcmVha3BvaW50IGhhcyBiZWVuIG1hcmtlZCBmb3IgZGVsZXRpb24uIFRoZSBicmVha3BvaW50IGlzIG5vdAotCSAqIGFjdHVhbGx5IHJlbW92ZWQgdW50aWwgZ2V0UGVuZGluZ1Rhc2tzKCkuaXNFbXB0eSgpIGlzIHRydWUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGJyZWFrcG9pbnQgaXMgYmVpbmcgZGVsZXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGlzIGJyZWFrcG9pbnQgaXMgZW5hYmxlZAotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGJyZWFrcG9pbnQgaXMgZW5hYmxlZAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGlzIGJyZWFrcG9pbnQgaXMgaGFyZHdhcmUtYXNzaXN0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBicmVha3BvaW50IGlzIGhhcmR3YXJlLWFzc2lzdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZSgpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGlzIGJyZWFrcG9pbnQgaXMgdGVtcG9yYXJ5Ci0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgYnJlYWtwb2ludCBpcyB0ZW1wb3JhcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RlbXBvcmFyeSgpOwotCQotCS8qKgotCSAqIFNldHMgYSBicmVha3BvaW50IGlkIGZvciB0aGlzIGJyZWFrcG9pbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnBpZCBicmVha3BvaW50IGlkIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyZWFrcG9pbnRJRChpbnQgYnBpZCk7Ci0JCi0JLyoqCi0JICogTWFya3MgdGhlIGJyZWFrcG9pbnQgZm9yIGRlbGV0aW9uLiBUaGUgYnJlYWtwb2ludCBzaG91bGQgYmUKLQkgKiBjb25zaWRlcmVkIGRlbGV0ZWQgYXQgdGhpcyBwb2ludCBhbmQgbm8gZnVydGhlciBvcGVyYXRpb25zCi0JICogcGVybWl0dGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBicmVha3BvaW50IHN0YXRlIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0aGlzIGJyZWFrcG9pbnQgc2hvdWxkIGJlIGVuYWJsZWQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZGl0aW9uIG9mIHRoaXMgYnJlYWtwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBjb25kaXRpb24gdG8gc2V0Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc2V0Q29uZGl0aW9uKElQRElDb25kaXRpb24gY29uZGl0aW9uKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJRXhjZXB0aW9ucG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUV4Y2VwdGlvbnBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzM0Y2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJRXhjZXB0aW9ucG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGV4Y2VwdGlvbiBicmVha3BvaW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUV4Y2VwdGlvbnBvaW50IGV4dGVuZHMgSVBESUJyZWFrcG9pbnQgewotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhpcyBleGNlcHRpb24gcG9pbnQgaXMgc3RvcHBlZCBvbiB0aHJvdwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGV4Y2VwdGlvbiBwb2ludCBpcyBzdG9wcGVkIG9uIHRocm93Ci0JICovCi0JYm9vbGVhbiBpc1N0b3BPblRocm93KCk7Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGlzIGV4Y2VwdGlvbiBwb2ludCBpcyBzdG9wcGVkIG9uIGNhdGNoCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgZXhjZXB0aW9uIHBvaW50IGlzIHN0b3BwZWQgb24gY2F0Y2gKLQkgKi8KLQlib29sZWFuIGlzU3RvcE9uQ2F0Y2goKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJRXhwcmVzc2lvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJjNWU2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBBbiBleHByZXNzaW9uIGlzIGEgc25pcHBldCBvZiBjb2RlIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCB0byBwcm9kdWNlIGEgdmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBzbmlwcGV0IG9mIGNvZGUuCi0JICogQHJldHVybiB0aGUgZXhwcmVzc2lvbgotCSAqLwotCVN0cmluZyBnZXRFeHByZXNzaW9uVGV4dCgpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB2YXJpYWJsZSBPYmplY3QgYXJlIHRoZSBzYW1lLAotCSAqIEZvciBleGFtcGxlIGV2ZW50IGlmIHRoZSBuYW1lIGlzIHRoZSBzYW1lIGJlY2F1c2Ugb2YgY2FzdGluZyB0aGlzIG1heSByZXR1cm4gZmFsc2U7Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzYW1lCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoSVBESUV4cHJlc3Npb24gZXhwcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBleHByZXNzaW9uIGZyb20gdGhlIG1hbmFnZXIgbGlzdAotCSAqIEBwYXJhbSB2YXIKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIEFJRiBvZiB0aGlzIGV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIGFpZgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlJQUlGIGdldEFJRigpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogU2V0IGFpZiBmb3IgdGhpcyBleHByZXNzaW9uCi0JICogQHBhcmFtIGFpZgotCSAqLwotCXZvaWQgc2V0QUlGKElBSUYgYWlmKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUZ1bmN0aW9uQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJRnVuY3Rpb25CcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTM3MzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJRnVuY3Rpb25CcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBmdW5jdGlvbiBicmVha3BvaW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUZ1bmN0aW9uQnJlYWtwb2ludCBleHRlbmRzIElQRElMb2NhdGlvbkJyZWFrcG9pbnQgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElHbG9iYWxWYXJpYWJsZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJR2xvYmFsVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0NzY2Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElHbG9iYWxWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGdsb2JhbCB2YXJpYWJsZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElHbG9iYWxWYXJpYWJsZSBleHRlbmRzIElQRElWYXJpYWJsZSwgSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjgzNjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgZ2xvYmFsIHZhcmlhYmxlIGRlc2NyaXB0b3IKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGV4dGVuZHMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUluc3RydWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElJbnN0cnVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTlhZDIyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUluc3RydWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUluc3RydWN0aW9uIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIEFkZHJlc3MuCi0JICogQHJldHVybiB0aGUgYWRkcmVzcy4KLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEFkcmVzcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBmdW5jdGlvbiBuYW1lLgotCSAqLwotCVN0cmluZyBnZXRGdW50aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uCi0JICogQHJldHVybiB0aGUgaW5zdHJ1Y3Rpb24uCi0JICovCi0JU3RyaW5nIGdldEluc3RydWN0aW9uKCk7Ci0gIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG9wY29kZQotCSAqIEByZXR1cm4gdGhlIG9wY29kZQotCSAqLwotCVN0cmluZyBnZXRPcGNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW55IGFyZ3VtZW50cyB0byB0aGUgYXJndW1lbnQKLQkgKiBAcmV0dXJuIGFueSBhcmd1bWVudHMgdG8gdGhlIGFyZ3VtZW50Ci0JICovCi0JU3RyaW5nIGdldEFyZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uJ3Mgb2Zmc2V0LgotCSAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGlzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24KLQkgKi8KLQlsb25nIGdldE9mZnNldCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTGluZUJyZWFrcG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUxpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTViNzMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGxpbmUgYnJlYWtwb2ludAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElMaW5lQnJlYWtwb2ludCBleHRlbmRzIElQRElMb2NhdGlvbkJyZWFrcG9pbnQgewotCi19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUxvY2FsVmFyaWFibGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUxvY2FsVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3NWY5MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElMb2NhbFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbG9jYWwgdmFyaWFibGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJTG9jYWxWYXJpYWJsZSBleHRlbmRzIElQRElWYXJpYWJsZSwgSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yIHsKLQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNzk1MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBsb2NhbCB2YXJpYWJsZSBkZXNjcmlwdG9yCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yIGV4dGVuZHMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyBzdGFja2ZyYW1lIG9mIHRoaXMgdmFyaWFibGUKLQkgKiBAcmV0dXJuIHN0YWNrZnJhbWUgb2YgdGhpcyB2YXJpYWJsZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlJUERJU3RhY2tGcmFtZSBnZXRTdGFja0ZyYW1lKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESUxvY2F0aW9uQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTG9jYXRpb25CcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODhlNmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTG9jYXRpb25CcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIGJyZWFrcG9pbnQ6IGZpbGUsIGxpbmUsIGZ1bmN0aW9uLCBhZGRyZXNzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUxvY2F0aW9uQnJlYWtwb2ludCBleHRlbmRzIElQRElCcmVha3BvaW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgYnJlYWtwb2ludAotCSAqIEByZXR1cm4gSVBESUxvY2F0b3Igb2JqZWN0Ci0JICovCi0JSVBESUxvY2F0b3IgZ2V0TG9jYXRvcigpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElNZW1vcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESU1lbW9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTRhZTA4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESU1lbW9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBESU1lbW9yeSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGxvbmdbXSBnZXREYXRhKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludFtdIGdldEJhZE9mZnNldHMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzY2lpKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTWVtb3J5QmxvY2suamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESU1lbW9yeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYzg0OTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTWVtb3J5QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURhdGFSZWFkTWVtb3J5SW5mbzsKLQotLyoqCi0gKiBBIGNvbnRpZ3VvdXMgc2VnbWVudCBvZiBtZW1vcnkgaW4gYW4gZXhlY3V0aW9uIGNvbnRleHQuCi0gKiBBIG1lbW9yeSBibG9jayBpcyByZXByZXNlbnRlZCBieSBhIHN0YXJ0aW5nIG1lbW9yeSBhZGRyZXNzIGFuZCBhIGxlbmd0aC4KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJTWVtb3J5QmxvY2sgZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0gICAgLyoqCi0gICAgICogQml0IG1hc2sgdXNlZCB0byBpbmRpY2F0ZSBhIGJ5dGUgaXMgcmVhZC1vbmx5Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFQURfT05MWSA9IDB4MDE7Ci0KLQkvKioKLQkgKiBCaXQgbWFzayB1c2VkIHRvIGluZGljYXRlIGEgYnl0ZSBpcyB2YWxpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBWQUxJRCA9IDB4MDI7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElEYXRhUmVhZE1lbW9yeUluZm8gZ2V0RGF0YVJlYWRNZW1vcnlJbmZvKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIG1lbW9yeSBieXRlJ3MgYXR0cmlidXRlIGFzIGEgYml0IG1hc2suCi0JICogVGhlIG1ldGhvZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlIG9mIHRoZSBibG9jay4KLQkgKiBAcmV0dXJuIHRoaXMgbWVtb3J5IGJ5dGUncyBhdHRyaWJ1dGUgYXMgYSBiaXQgbWFzawotCSAqLwotCXB1YmxpYyBieXRlIGdldEZsYWdzKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQHBhcmFtIG0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhUmVhZE1lbW9yeUluZm8oSVBESURhdGFSZWFkTWVtb3J5SW5mbyBtKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlcyBvZiB0aGUgYnl0ZXMgY3VycmVudGx5IGNvbnRhaW5lZCBpbiB0aGlzIHRoaXMgbWVtb3J5IGJsb2NrLgotCSAqIE5vdGU6IHRoZSBudW1iZXIgbWF5YmUgZ3JlYXRlciBvciBsb3dlciB0byB3aGF0IHdhcyByZXF1ZXN0ZWQuCi0JICogQHJldHVybiB0aGUgdmFsdWVzIG9mIHRoZSBieXRlcyBjdXJyZW50bHkgY29udGFpbmVkIGluIHRoaXMgdGhpcyBtZW1vcnkgYmxvY2sKLQkgKiB0aHJvd3MgUENESUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4gIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+PGxpPkZhaWx1cmUgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBkZWJ1ZyB0YXJnZXQuICBUaGUgUERJRXhjZXB0aW9uJ3Mgc3RhdHVzIGNvZGUgY29udGFpbnMgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIHJlc3BvbnNpYmxlIGZvciB0aGUgZmFpbHVyZS48L2xpPjwvdWw+Ci0JICovCQotCWJ5dGVbXSBnZXRCeXRlcygpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBtZW1vcnkgYmxvY2sgaW4gYnl0ZXMKLQkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhpcyBtZW1vcnkgYmxvY2sgaW4gYnl0ZXMKLQkgKi8JCi0JbG9uZyBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhpcyBtZW1vcnkgYmxvY2sKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoaXMgbWVtb3J5IGJsb2NrCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFydEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgZWFjaCBtZW1vcnkgd29yZCBpbiBieXRlcwotCSAqIEByZXR1cm4gVGhlIHNpemUgb2YgZWFjaCBtZW1vcnkgd29yZCBpbiBieXRlcwotCSAqLwotCWludCBnZXRXb3JkU2l6ZSgpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBibG9jayBkb2VzIG5vdCB1cGRhdGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIGRvZXMgbm90IHVwZGF0ZQotCSAqLwotCWJvb2xlYW4gaXNGcm96ZW4oKTsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBkYXRhLCB0aGlzIG1heSBjYXVzZSBldmVudHMgdG8gYmUgdHJpZ2dlciBpZiB0aGUgZGF0YSB2YWx1ZXMgY2hhbmdlZC4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCByZWZyZXNoKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBBIG1lbW9yeUJsb2NrIHNldCBmcm96ZW4gbWVhbnMgdGhhdCB0aGUgYmxvY2sgd2lsbCBub3QgdXBkYXRlIGFuZCBjaGVjayBmb3IgbmV3IGRhdGEKLQkgKiBAcGFyYW0gZnJvemVuIHRoZSBibG9jayBpcyBmcm96ZW4gYnkgZGVmYXVsdAotCSAqLwotCXZvaWQgc2V0RnJvemVuKGJvb2xlYW4gZnJvemVuKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZXMgaW4gdGhpcyBtZW1vcnkgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgd2l0aGluIHRoaXMgbWVtb3J5IGJsb2NrIHRvIHRoZSBzcGVjaWZpZWQgYnl0ZXMuCi0JICogVGhlIG9mZnNldCBpcyB6ZXJvIGJhc2VkLgotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBhdCB3aGljaCB0byBzZXQgdGhlIG5ldyB2YWx1ZXMKLQkgKiBAcGFyYW0gYnl0ZXMgdGhlIG5ldyB2YWx1ZXMKLQkgKiB0aHJvd3MgUERJRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxzLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+RmFpbHVyZSBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGRlYnVnIHRhcmdldC4gIFRoZSBQRElFeGNlcHRpb24ncyBzdGF0dXMgY29kZSBjb250YWlucyB0aGUgdW5kZXJseWluZyBleGNlcHRpb24gcmVzcG9uc2libGUgZm9yIHRoZSBmYWlsdXJlLjwvbGk+Ci0JICogPGxpPlRoaXMgbWVtb3J5IGJsb2NrIGRvZXMgbm90IHN1cHBvcnQgdmFsdWUgbW9kaWZpY2F0aW9uPC9saT4KLQkgKiA8bGk+VGhlIHNwZWNpZmllZCBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBtZW1vcnkgYmxvY2ssIG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3BlY2lmaWVkIGdvZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcyBtZW1vcnkgYmxvY2sgKGluZGV4IG9mIG91dCBvZiByYW5nZSk8L2xpPgotCSAqIDwvdWw+Ci0JICovCi0Jdm9pZCBzZXRWYWx1ZShsb25nIG9mZnNldCwgYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTWl4ZWRJbnN0cnVjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTWl4ZWRJbnN0cnVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYwMDVlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESU1peGVkSW5zdHJ1Y3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESU1peGVkSW5zdHJ1Y3Rpb24gZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIKLQkgKiBAcmV0dXJuIHRoZSBsaW5lIE51bWJlcgotCSAqLwotCWludCBnZXRMaW5lTnVtYmVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lCi0JICogQHJldHVybiB0aGUgZmlsZSBuYW1lCi0JICovCi0JU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJyYXkgb2YgaW5zdHJ1Y3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBpbnN0cnVjdGlvbgotCSAqLwotCUlQRElJbnN0cnVjdGlvbltdIGdldEluc3RydWN0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJTW9kZWxGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMmI5Yi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElEYXRhUmVhZE1lbW9yeUluZm87Ci0KLQotcHVibGljIGludGVyZmFjZSBJUERJTW9kZWxGYWN0b3J5IHsKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJQWRkcmVzc0JyZWFrcG9pbnQgbmV3QWRkcmVzc0JyZWFrcG9pbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IHR5cGUsIAotCQkJSVBESUxvY2F0aW9uIGxvY2F0aW9uLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwgYm9vbGVhbiBlbmFibGVkKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSBhcmdEZXNjCi0JICogQHBhcmFtIHZhcklkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJQXJndW1lbnQgbmV3QXJndW1lbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUlQRElBcmd1bWVudERlc2NyaXB0b3IgYXJnRGVzYywgU3RyaW5nIHZhcklkKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB0aHJlYWQKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBmdWxsTmFtZQotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElBcmd1bWVudERlc2NyaXB0b3IgbmV3QXJndW1lbnREZXNjcmlwdG9yKElQRElTZXNzaW9uIHNlc3Npb24sCi0JCQlCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLCBpbnQgZGVwdGgpOwotCi0JLyoqCi0JICogQHBhcmFtIGlnbm9yZQotCSAqIEBwYXJhbSBleHAKLQkgKiBAcGFyYW0gaWRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJQ29uZGl0aW9uIG5ld0NvbmRpdGlvbihpbnQgaWdub3JlLCBTdHJpbmcgZXhwLCBTdHJpbmdbXSBpZHMpOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAcGFyYW0gc3RvcE9uVGhyb3cKLQkgKiBAcGFyYW0gc3RvcE9uQ2F0Y2gKLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcGFyYW0gZnVuY0JwdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElFeGNlcHRpb25wb2ludCBuZXdFeGNlcHRpb25wb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgY2xhenosIGJvb2xlYW4gc3RvcE9uVGhyb3csIAotCQkJYm9vbGVhbiBzdG9wT25DYXRjaCwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZW5hYmxlZCwgSVBESUZ1bmN0aW9uQnJlYWtwb2ludFtdIGZ1bmNCcHRzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbihJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXgpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElGdW5jdGlvbkJyZWFrcG9pbnQgbmV3RnVuY3Rpb25CcmVha3BvaW50KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCB0eXBlLCAKLQkJCUlQRElMb2NhdGlvbiBsb2NhdGlvbiwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZW5hYmxlZCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdmFyRGVzYwotCSAqIEBwYXJhbSB2YXJJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlIG5ld0dsb2JhbFZhcmlhYmxlKElQRElTZXNzaW9uIHNlc3Npb24sCi0JCQlJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIHZhckRlc2MsIFN0cmluZyB2YXJJZCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gdGhyZWFkCi0JICogQHBhcmFtIGZyYW1lCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZnVsbE5hbWUKLQkgKiBAcGFyYW0gcG9zCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIG5ld0dsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcigKLQkJCUlQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLAotCQkJSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsCi0JCQlpbnQgZGVwdGgpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElMaW5lQnJlYWtwb2ludCBuZXdMaW5lQnJlYWtwb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgCi0JCQlJUERJTG9jYXRpb24gbG9jYXRpb24sIElQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHRocmVhZAotCSAqIEBwYXJhbSBmcmFtZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGZ1bGxOYW1lCi0JICogQHBhcmFtIHBvcwotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEBwYXJhbSB2YXJpZAotCSAqLwotCXB1YmxpYyBJUERJTG9jYWxWYXJpYWJsZSBuZXdMb2NhbFZhcmlhYmxlKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsTmFtZSwgaW50IHBvcywgaW50IGRlcHRoLCBTdHJpbmcgdmFyaWQpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHZhckRlc2MKLQkgKiBAcGFyYW0gdmFySWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElMb2NhbFZhcmlhYmxlIG5ld0xvY2FsVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUlQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjLCBTdHJpbmcgdmFySWQpOwotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gdGhyZWFkCi0JICogQHBhcmFtIGZyYW1lCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZnVsbE5hbWUKLQkgKiBAcGFyYW0gcG9zCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgbmV3TG9jYWxWYXJpYWJsZURlc2NyaXB0b3IoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSBhc2NpaQotCSAqIEBwYXJhbSBkYXRhCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTWVtb3J5IG5ld01lbW9yeShTdHJpbmcgYWRkcmVzcywgU3RyaW5nIGFzY2lpLCBTdHJpbmdbXSBkYXRhKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGV4cAotCSAqIEBwYXJhbSB3b3JkU2l6ZQotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGluZm8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElNZW1vcnlCbG9jayBuZXdNZW1vcnlCbG9jayhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLAotCQkJU3RyaW5nIGV4cCwgaW50IHdvcmRTaXplLCBib29sZWFuIGIsIElQRElEYXRhUmVhZE1lbW9yeUluZm8gaW5mbyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBleAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTXVsdGlFeHByZXNzaW9ucyBuZXdNdWx0aUV4cHJlc3Npb25zKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBleCwgYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHRocmVhZAotCSAqIEBwYXJhbSBmcmFtZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGZ1bGxOYW1lCi0JICogQHBhcmFtIHBvcwotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBuZXdSZWdpc3RlckRlc2NyaXB0b3IoSVBESVNlc3Npb24gc2Vzc2lvbiwKLQkJCUJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwKLQkJCVN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBzaWduYWxEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU2lnbmFsIG5ld1NpZ25hbChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJU2lnbmFsRGVzY3JpcHRvciBzaWduYWxEZXNjcmlwdG9yKTsKLQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gc3RvcAotCSAqIEBwYXJhbSBwYXNzCi0JICogQHBhcmFtIHByaW50Ci0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU2lnbmFsRGVzY3JpcHRvciBuZXdTaWduYWxEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBib29sZWFuIHN0b3AsCi0JCQlib29sZWFuIHBhc3MsIGJvb2xlYW4gcHJpbnQsIFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSBwdGhyZWFkCi0JICogQHBhcmFtIGkKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVN0YWNrRnJhbWUgbmV3U3RhY2tGcmFtZShJUERJU2Vzc2lvbiBzZXNzaW9uLCBJUERJVGhyZWFkIHB0aHJlYWQsIGludCBpLCBJUERJTG9jYXRvciBsb2NhdG9yKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRocmVhZAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGZ1bmMKLQkgKiBAcGFyYW0gbGluZQotCSAqIEBwYXJhbSBhZGRyCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lIG5ld1N0YWNrRnJhbWUoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESVRocmVhZCB0aHJlYWQsIGludCBsZXZlbCwgU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jLCAKLQkJCWludCBsaW5lLCBCaWdJbnRlZ2VyIGFkZHIpOwotCi0JLyoqCi0JICogQHBhcmFtIGxldmVsCi0JICogQHBhcmFtIGxvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yIG5ld1N0YWNrRnJhbWVEZXNjcmlwdG9yKGludCBsZXZlbCwgSVBESUxvY2F0b3IgbG9jKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0IG5ld1RhcmdldChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSBwYXJzZUludAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZCBuZXdUaHJlYWQoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESVRhcmdldCB0YXJnZXQsIGludCBwYXJzZUludCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB0aHJlYWQKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBmdWxsTmFtZQotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZURlc2NyaXB0b3IgbmV3VGhyZWFkU3RvcmFnZURlc2NyaXB0b3IoCi0JCQlJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwKLQkJCUlQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLAotCQkJaW50IGRlcHRoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSB3VHlwZQotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVdhdGNocG9pbnQgbmV3V2F0Y2hwb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgU3RyaW5nIGV4cHJlc3Npb24sIAotCQkJaW50IHdUeXBlLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwgYm9vbGVhbiBlbmFibGVkKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESU11bHRpRXhwcmVzc2lvbnMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESU11bHRpRXhwcmVzc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiMGQ0OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElNdWx0aUV4cHJlc3Npb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLS8qKgotICogSGFuZGxlcyBtb3JlIHRoYW4gb25lIGV4cHJlc3Npb24gZm9yIG11bHRpLXByb2Nlc3NlcwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElNdWx0aUV4cHJlc3Npb25zIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFN0b3JlcyBhbiBleHByZXNzaW9uCi0JICogQHBhcmFtIGV4cHJlc3Npb24gRXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4cHJlc3Npb24oSVBESUV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbkV4cHJlc3Npb25zVmFsdWUoQml0TGlzdCB0YXNrcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGV4cHJlc3Npb24gYW4gZXhwcmVzc2lvbiBmb3IgZ2V0dGluZyB2YWx1ZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgZXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSUFJRiBnZXRBSUYoSVBESUV4cHJlc3Npb24gZXhwcmVzc2lvbikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihpbnQgdGFzayk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBleHByZXNzaW9ucwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMKLQkgKi8KLQlwdWJsaWMgSVBESUV4cHJlc3Npb25bXSBnZXRFeHByZXNzaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBleHByZXNzaW9uIHRleHQKLQkgKiBAcmV0dXJuIGV4cHJlc3Npb24gdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHN0YXR1cyBvZiB0aGlzIGV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGlzIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgYW4gZXhwcmVzc2lvbiBmcm9tIHN0b3JlCi0JICogQHBhcmFtIHRhc2tzIEJpdExpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHByZXNzaW9uKEJpdExpc3QgdGFza3MpOwotCQotCS8qKgotCSAqIFJlbW92ZSBhbiBleHByZXNzaW9uIGZyb20gc3RvcmUKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiBhbiBleHByZXNzaW9uIGdvaW5nIHRvIGJlIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHByZXNzaW9uKElQRElFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCQotCS8qKgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRXhwcmVzc2lvbnNWYWx1ZShCaXRMaXN0IHRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQRElFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElSZWdpc3Rlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJUmVnaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2OWNlZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotCi0vKioKLSAqIEEgcmVnaXN0ZXIgaXMgc3BlY2lhbCBraW5kIG9mIHZhcmlhYmxlIHRoYXQgaXMgY29udGFpbmVkIGluIGEgcmVnaXN0ZXIgZ3JvdXAuCi0gKiBFYWNoIHJlZ2lzdGVyIGhhcyBhIG5hbWUgYW5kIGEgQUlGIHZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVJlZ2lzdGVyIGV4dGVuZHMgSVBESVZhcmlhYmxlLCBJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgY291bGQgYmUgY2hhbmdlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBjb3VsZCBiZSBjaGFuZ2VkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCWJvb2xlYW4gaXNFZGl0YWJsZSgpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyBBSUYgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZQotCSAqIEBwYXJhbSBjb250ZXh0IFN0YWNrRnJhbWUKLQkgKiBAcmV0dXJuIEFJRiB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlJQUlGIGdldEFJRihJUERJU3RhY2tGcmFtZSBjb250ZXh0KSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFNldHMgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBieSBnaXZlbiBleHByZXNzaW9uCi0JICogQHBhcmFtIGV4cHJlc3Npb24gYW4gZXhwcmVzc2lvbiB0byBnZW5lcmF0ZSBhIG5ldyBBSUYgdmFsdWUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgdmFyaWFibGUgZnJvbSB0aGUgbWFuYWdlciBsaXN0Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIGJvdGggdmFyaWFibGVzIGFyZSB0aGUgc2FtZQotCSAqIEBwYXJhbSB2YXJpYWJsZSBJUERJVmFyaWFibGUgZm9yIGNvbXBhcmluZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiB2YXJpYWJsZSBpcyBzYW1lIGFzIHRoZSBjdXJyZW50IHZhcmlhYmxlCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoSVBESVZhcmlhYmxlIHZhcmlhYmxlKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJUmVnaXN0ZXJEZXNjcmlwdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElSZWdpc3RlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZGVkYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElSZWdpc3RlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGJyZWFrIGNvbmRpdGlvbgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElSZWdpc3RlckRlc2NyaXB0b3IgZXh0ZW5kcyBJUERJVmFyaWFibGVEZXNjcmlwdG9yIHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJUmVnaXN0ZXJHcm91cC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJUmVnaXN0ZXJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmJjMzJjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVJlZ2lzdGVyR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZ3JvdXAgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgdGFyZ2V0LgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElSZWdpc3Rlckdyb3VwIGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBncm91cAotCSAqIEByZXR1cm4gU3RyaW5nIG5hbWUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaXN0ZXIgZGVzY3JpcHRvcnMgaW4gdGhpcyByZWdpc3RlciBncm91cC4KLQkgKiBAcmV0dXJuIElQRElSZWdpc3RlckRlc2NyaXB0b3JbXSBpbiB0aGlzIHJlZ2lzdGVyIGdyb3VwCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUlQRElSZWdpc3RlckRlc2NyaXB0b3JbXSBnZXRSZWdpc3RlckRlc2NyaXB0b3JzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHJlZ2lzdGVyIGdyb3VwIGN1cnJlbnRseSBjb250YWlucyBhbnkgcmVnaXN0ZXJzLgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIHJlZ2lzdGVyIGdyb3VwIGN1cnJlbnRseSBjb250YWlucyBhbnkgcmVnaXN0ZXJzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZ2lzdGVycygpIHRocm93cyBQRElFeGNlcHRpb247CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJUnVudGltZU9wdGlvbnMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVJ1bnRpbWVPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODQyZDkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJUnVudGltZU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgY29uZmlndXJhdGlvbiBvZiBkZWJ1ZyBzZXNzaW9uLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElSdW50aW1lT3B0aW9ucyBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBQcm9ncmFtL0luZmVyaW9yIGFyZ3VtZW50cwotCSAqIEBwYXJhbSBhcmdzIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmd1bWVudHMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRBcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2dyYW0vSW5mZXJpb3IgZW52aXJvbm1lbnQgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcHJvcHMgdGhlIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhZGQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRFbnZpcm9ubWVudChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHJvZ3JhbS9JbmZlcmlvciB3b3JraW5nIGRpcmVjdG9yeQotCSAqIEBwYXJhbSB3ZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHByb2dyYW0KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyB3ZCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVNoYXJlZExpYnJhcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVNoYXJlZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MzZlMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTaGFyZWRMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2hhcmVkIGxpYnJhcnkgd2hpY2ggaGFzIGJlZW4gbG9hZGVkIGludG8gdGhlIGRlYnVnIHRhcmdldC4KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2hhcmVkTGlicmFyeSBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IGZpbGUKLQkgKi8KLQlTdHJpbmcgZ2V0RmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoaXMgbGlicmFyeQotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhpcyBsaWJyYXJ5Ci0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFydEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBhZGRyZXNzIG9mIHRoaXMgbGlicmFyeQotCSAqIEByZXR1cm4gdGhlIGVuZCBhZGRyZXNzIG9mIHRoaXMgbGlicmFyeQotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RW5kQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzeW1ib2xzIG9mIHRoaXMgbGlicmFyeSBhcmUgcmVhZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgc3ltYm9scyBvZiB0aGlzIGxpYnJhcnkgYXJlIHJlYWQKLQkgKi8KLQlib29sZWFuIGFyZVN5bWJvbHNMb2FkZWQoKTsKLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgbGlicmFyeSBzeW1ib2xzLgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIGxvYWRTeW1ib2xzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVNoYXJlZExpYnJhcnlNYW5hZ2VtZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTaGFyZWRMaWJyYXJ5TWFuYWdlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjBmNWExLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVNoYXJlZExpYnJhcnlNYW5hZ2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBzaGFyZWRMaWJyYXJpZXMgaW4gdGhlIHRhcmdldC4KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2hhcmVkTGlicmFyeU1hbmFnZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoaXMgdGFyZ2V0LgotCSAqIEByZXR1cm4gSVBESVNoYXJlZExpYnJhcnlbXSBhcnJheQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUuCi0JICovCi0JSVBESVNoYXJlZExpYnJhcnlbXSBnZXRTaGFyZWRMaWJyYXJpZXMoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJU2lnbmFsLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTaWduYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViMjRmYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTaWduYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2lnbmFsCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVNpZ25hbCBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZWFuaW5nIG9mIHRoaXMgc2lnbmFsLgotCSAqIEByZXR1cm4gdGhlIG1lYW5pbmcgb2YgdGhpcyBzaWduYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHNpZ25hbC4KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgc2lnbmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQ2hhbmdlIHRoZSB3YXkgZGVidWdnZXIgaGFuZGxlcyB0aGlzIHNpZ25hbC4KLQkgKiBAcGFyYW0gaWdub3JlIC0gaWYgdHJ1ZSB0aGUgZGVidWdnZXIgc2hvdWxkIG5vdCBhbGxvdyB5b3VyIHByb2dyYW0gdG8gc2VlIHRoaXMgc2lnbmFsCi0JICogQHBhcmFtIHN0b3AgLSBpZiB0cnVlIHRoZSBkZWJ1Z2dlciBzaG91bGQgc3RvcCB5b3VyIHByb2dyYW0gd2hlbiB0aGlzIHNpZ25hbCBoYXBwZW5zCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZShib29sZWFuIGlnbm9yZSwgYm9vbGVhbiBzdG9wKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogaWYgZmFsc2UgbWVhbnMgcHJvZ3JhbSB3aWxsIHNlZSB0aGUgc2lnbmFsLgotCSAqIE90aGVyd2lzZSBwcm9ncmFtIGRvZXMgbm90IGtub3cuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmUoKTsKLQotCS8qKgotCSAqIE1lYW5zIHJlZW50ZXIgZGVidWdnZXIgaWYgdGhpcyBzaWduYWwgaGFwcGVucwotCSAqIE1ldGhvZCAgaXNTdG9wU2V0LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RvcFNldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGRlc2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKElQRElTaWduYWxEZXNjcmlwdG9yIGRlc2MpOwotCi0JLyoqCi0JICogQHBhcmFtIGlzSWdub3JlCi0JICogQHBhcmFtIGlzU3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZShib29sZWFuIGlzSWdub3JlLCBib29sZWFuIGlzU3RvcCk7Ci0JCi0JLyoqCi0JICogQ29udGludWUgcHJvZ3JhbSBnaXZpbmcgaXQgdGhpcyBzaWduYWwuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNpZ25hbCgpIHRocm93cyBQRElFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTaWduYWxEZXNjcmlwdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTaWduYWxEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2QzYTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJU2lnbmFsRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHNpZ25hbAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2lnbmFsRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFBhc3MoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJpbnQoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RvcCgpOwotCQotCS8qKgotCSAqIEBwYXJhbSBkZXNjCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpOwotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFzcyhib29sZWFuIHBhc3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHByaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpbnQoYm9vbGVhbiBwcmludCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3AoYm9vbGVhbiBzdG9wKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVNvdXJjZU1hbmFnZW1lbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVNvdXJjZU1hbmFnZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkYjY5NS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTb3VyY2VNYW5hZ2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIE1haW50YWlucyB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlcy4KLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVNvdXJjZU1hbmFnZW1lbnQgewotCS8qKgotCSAqIFNldCB0aGUgc291cmNlIHNlYXJjaCBwYXRocyBmb3IgdGhlIGRlYnVnIHNlc3Npb24uCi0JICogQHBhcmFtIFN0cmluZyBhcnJheSBvZiBzZWFyY2ggcGF0aHMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBzZXRTb3VyY2VQYXRocyhTdHJpbmdbXSBzcmNQYXRocykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgb2Ygc291cmNlIHBhdGhzCi0JICogQHJldHVybiBTdHJpbmcgYXJyYXkgb2Ygc2VhcmNoIHBhdGhzLgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlTdHJpbmdbXSBnZXRTb3VyY2VQYXRocygpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RhcnRBZGRyZXNzIGlzIHRoZSBiZWdpbmluZyBhZGRyZXNzCi0JICogQHBhcmFtIGVuZEFkZHJlc3MgaXMgdGhlIGVuZCBhZGRyZXNzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZS4KLQkgKi8KLQlJUERJSW5zdHJ1Y3Rpb25bXSBnZXRJbnN0cnVjdGlvbnMoQmlnSW50ZWdlciBzdGFydEFkZHJlc3MsIEJpZ0ludGVnZXIgZW5kQWRkcmVzcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBkaXNhc3NlbWJsZQotCSAqIEBwYXJhbSBsaW5lbnVtIGlzIHRoZSBsaW5lIG51bWJlciB0byBkaXNhc3NlbWJsZSBhcm91bmQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotCSAqLwotCUlQRElJbnN0cnVjdGlvbltdIGdldEluc3RydWN0aW9ucyhTdHJpbmcgZmlsZW5hbWUsIGludCBsaW5lbnVtKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRpc2Fzc2VtYmxlCi0JICogQHBhcmFtIGxpbmVudW0gaXMgdGhlIGxpbmUgbnVtYmVyIHRvIGRpc2Fzc2VtYmxlIGFyb3VuZAotCSAqIEBwYXJhbSBsaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGRpc2Fzc2VtYmx5IHRvIHByb2R1Y2VkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZS4KLQkgKi8KLQlJUERJSW5zdHJ1Y3Rpb25bXSBnZXRJbnN0cnVjdGlvbnMoU3RyaW5nIGZpbGVuYW1lLCBpbnQgbGluZW51bSwgaW50IGxpbmVzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHN0YXJ0QWRkcmVzcyBpcyB0aGUgYmVnaW5pbmcgYWRkcmVzcwotCSAqIEBwYXJhbSBlbmRBZGRyZXNzIGlzIHRoZSBlbmQgYWRkcmVzcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUuCi0JICovCi0JSVBESU1peGVkSW5zdHJ1Y3Rpb25bXSBnZXRNaXhlZEluc3RydWN0aW9ucyhCaWdJbnRlZ2VyIHN0YXJ0QWRkcmVzcywgQmlnSW50ZWdlciBlbmRBZGRyZXNzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRpc2Fzc2VtYmxlCi0JICogQHBhcmFtIGxpbmVudW0gaXMgdGhlIGxpbmUgbnVtYmVyIHRvIGRpc2Fzc2VtYmxlIGFyb3VuZAotCSAqIEBwYXJhbSBsaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGRpc2Fzc2VtYmx5IHRvIHByb2R1Y2VkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZS4KLQkgKi8KLQlJUERJTWl4ZWRJbnN0cnVjdGlvbltdIGdldE1peGVkSW5zdHJ1Y3Rpb25zKFN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmVudW0pIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZGlzYXNzZW1ibGUKLQkgKiBAcGFyYW0gbGluZW51bSBpcyB0aGUgbGluZSBudW1iZXIgdG8gZGlzYXNzZW1ibGUgYXJvdW5kCi0JICogQHBhcmFtIGxpbmVzIGlzIHRoZSBudW1iZXIgb2YgZGlzYXNzZW1ibHkgdG8gcHJvZHVjZWQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotCSAqLwotCUlQRElNaXhlZEluc3RydWN0aW9uW10gZ2V0TWl4ZWRJbnN0cnVjdGlvbnMoU3RyaW5nIGZpbGVuYW1lLCBpbnQgbGluZW51bSwgaW50IGxpbmVzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJU3RhY2tGcmFtZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJU3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjMzODYwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVN0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogQSBzdGFjayBmcmFtZSBpbiBhIHN1c3BlbmRlZCB0aHJlYWQuCi0gKiBBIHN0YWNrIGZyYW1lIGNvbnRhaW5zIHZhcmlhYmxlcyByZXByZXNlbnRpbmcgdmlzaWJsZSBsb2NhbHMgYW5kIGFyZ3VtZW50cyBhdCB0aGUgY3VycmVudCBleGVjdXRpb24gbG9jYXRpb24uCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVN0YWNrRnJhbWUgZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgaW4gdGhpcyAgc3RhY2sgZnJhbWUuCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIKLQkgKi8KLQlJUERJTG9jYXRvciBnZXRMb2NhdG9yKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmlzaWJsZSB2YXJpYWJsZXMgaW4gdGhpcyBzdGFjayBmcmFtZS4gQW4gZW1wdHkgY29sbGVjdGlvbiBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgbm8gdmlzaWJsZSB2YXJpYWJsZXMuCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdmlzaWJsZSB2YXJpYWJsZXMgCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUlQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcltdIGdldExvY2FsVmFyaWFibGVEZXNjcmlwdG9ycygpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB2YXJpYWJsZSBmcm9tIHRoZSBkZXNjcmlwdG9yIGZvciBldmFsdWF0aW9uLiAgQSBDcmVhdGVkRXZlbnQgd2lsbCBiZSB0cmlnZ2VyIGFuZAotCSAqIENoYW5nZWRFdmVudCB3aWxsIGFsc28gYmUgdHJpZ2dlciB3aGVuIHRoZSB2YXJpYWJsZSBpcyBhc3NpZ24gYSBuZXcgdmFsdWUuCi0JICogRGVzdHJveWVkRXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdmFyaWFibGUgaXMgb3V0IG9mIHNjb3BlIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgbWFuYWdlciBsaXN0LgotCSAqIEBwYXJhbSB2YXJEZXNjIElQRElBcmd1bWVudERlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGFyZ3VtZW50Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUlQRElBcmd1bWVudCBjcmVhdGVBcmd1bWVudChJUERJQXJndW1lbnREZXNjcmlwdG9yIHZhckRlc2MpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB2YXJpYWJsZSBmcm9tIHRoZSBkZXNjcmlwdG9yIGZvciBldmFsdWF0aW9uLiAgQSBDcmVhdGVkRXZlbnQgd2lsbCBiZSB0cmlnZ2VyIGFuZAotCSAqIENoYW5nZWRFdmVudCB3aWxsIGFsc28gYmUgdHJpZ2dlciB3aGVuIHRoZSB2YXJpYWJsZSBpcyBhc3NpZ24gYSBuZXcgdmFsdWUuCi0JICogRGVzdHJveWVkRXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdmFyaWFibGUgaXMgb3V0IG9mIHNjb3BlIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgbWFuYWdlciBsaXN0LgotCSAqIEBwYXJhbSB2YXJEZXNjIElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcgotCSAqIEByZXR1cm4gbG9jYWwgdmFyaWFibGUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JSVBESUxvY2FsVmFyaWFibGUgY3JlYXRlTG9jYWxWYXJpYWJsZShJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFyZ3VtZW50cyBpbiB0aGlzIHN0YWNrIGZyYW1lLiBBbiBlbXB0eSBjb2xsZWN0aW9uIGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMuCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgYXJndW1lbnRzIAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlJUERJQXJndW1lbnREZXNjcmlwdG9yW10gZ2V0QXJndW1lbnREZXNjcmlwdG9ycygpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aHJlYWQgdGhpcyBzdGFja2ZyYW1lIGlzIGNvbnRhaW5lZCBpbi4KLQkgKiBAcmV0dXJuIHRoZSB0aHJlYWQKLQkgKi8KLQlJUERJVGhyZWFkIGdldFRocmVhZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldCB0aGlzIHN0YWNrZnJhbWUgaXMgY29udGFpbmVkIGluLgotCSAqIEByZXR1cm4gdGhlIHRhcmdldAotCSAqLwotCUlQRElUYXJnZXQgZ2V0VGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZXZlbCBvZiB0aGUgc3RhY2sgZnJhbWUsIDEgYmFzZWQuCi0JICogQHJldHVybiB0aGUgbGV2ZWwgb2YgdGhlIHN0YWNrIGZyYW1lIAotCSAqLwotCWludCBnZXRMZXZlbCgpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBib3RoIHN0YWNrZnJhbWVzIGFyZSB0aGUgc2FtZQotCSAqIEBwYXJhbSBzdGFja2ZyYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmcmFtZXMgYXJlIHRoZSBzYW1lLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKElQRElTdGFja0ZyYW1lIHN0YWNrZnJhbWUpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTdGFja0ZyYW1lRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJU3RhY2tGcmFtZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiYTJhZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElTdGFja0ZyYW1lRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yIHsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExldmVsKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElMb2NhdG9yIGdldExvY2F0b3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElUYXJnZXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGZlOTgwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBkZWJ1Z2dhYmxlIHByb2Nlc3MuIFRoaXMgaXMgYSByb290IG9iamVjdCBvZiB0aGUgUERJIG1vZGVsLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUYXJnZXQgZXh0ZW5kcyBJUERJU291cmNlTWFuYWdlbWVudCwgSVBESVNoYXJlZExpYnJhcnlNYW5hZ2VtZW50LCBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogQ3JlYXRlIGEgdmFyaWFibGUgZnJvbSB0aGUgZGVzY3JpcHRvciBmb3IgZXZhbHVhdGlvbi4gIEEgQ3JlYXRlZEV2ZW50IHdpbGwgYmUgdHJpZ2dlciBhbmQKLQkgKiBDaGFuZ2VkRXZlbnQgd2lsbCBhbHNvIGJlIHRyaWdnZXIgd2hlbiB0aGUgdmFyaWFibGUgaXMgYXNzaWduIGEgbmV3IHZhbHVlLgotCSAqIERlc3Ryb3llZEV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG91dCBvZiBzY29wZSBhbmQgYXV0b21hdGljYWxseQotCSAqIHJlbW92ZWQgZnJvbSB0aGUgbWFuYWdlciBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSB2YXJEZXNjIElQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIElQRElHbG9iYWxWYXJpYWJsZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlIGNyZWF0ZUdsb2JhbFZhcmlhYmxlKElQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSB2YXJpYWJsZSBmcm9tIHRoZSBkZXNjcmlwdG9yIGZvciBldmFsdWF0aW9uLiAgQSBDcmVhdGVkRXZlbnQgd2lsbCBiZSB0cmlnZ2VyIGFuZAotCSAqIENoYW5nZWRFdmVudCB3aWxsIGFsc28gYmUgdHJpZ2dlciB3aGVuIHRoZSB2YXJpYWJsZSBpcyBhc3NpZ24gYSBuZXcgdmFsdWUuCi0JICogRGVzdHJveWVkRXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdmFyaWFibGUgaXMgb3V0IG9mIHNjb3BlIGFuZCBhdXRvbWF0aWNhbGx5Ci0JICogcmVtb3ZlZCBmcm9tIHRoZSBtYW5hZ2VyIGxpc3QuCi0JICogQHBhcmFtIHZhckRlc2MgSVBEVGhyZWFkU3RvcmFnZURlc2MKLQkgKiBAcmV0dXJuIElQRElSZWdpc3RlcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVJlZ2lzdGVyIGNyZWF0ZVJlZ2lzdGVyKElQRElSZWdpc3RlckRlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBFdmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBzdHJpbmcuIFJldHVybnMgdGhlIGV2YWx1YXRpb24gcmVzdWx0IGFzIGEgU3RyaW5nLgotCSAqIEBwYXJhbSAtIGV4cHJlc3Npb24gc3RyaW5nIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV2YWx1YXRlRXhwcmVzc2lvblRvU3RyaW5nKElQRElTdGFja0ZyYW1lIGNvbnRleHQsIFN0cmluZyBleHByZXNzaW9uVGV4dCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkLgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQKLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZCBnZXRDdXJyZW50VGhyZWFkKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBBIHN0YXRpYy9nbG9iYWwgdmFyaWFibGUgaW4gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG9yIGZpbGUsCi0JICogZmlsZW5hbWUgb3IvYW5kIGZ1bmN0aW9uIGlzIHRoZSBjb250ZXh0IGZvciB0aGUgc3RhdGljIElQRElWYXJpYWJsZURlc2NyaXB0b3IuCi0JICogPHByZT4KLQkgKiBoZWxsby5jOgotCSAqICAgaW50IGJhcjsKLQkgKiAgIGludCBtYWluKCkgewotCSAqICAgCXN0YXRpYyBpbnQgYmFyOwotCSAqICAgfQotCSAqIGZpbGUuYzoKLQkgKiAgIGludCBmb28oKSB7Ci0JICogICAJc3RhdGljIGludCBiYXI7Ci0JICogICB9Ci0JICogZ2V0VmFyaWFibGVPYmplY3QobnVsbCwgbnVsbCwgImJhciIpOwotCSAqIGdldFZhcmlhYmxlT2JqZWN0KG51bGwsICJtYWluIiwgImJhciIpOwotCSAqIGdldFZhcmlhYmxlT2JqZWN0KCJmaWxlLmMiLCAiZm9vIiwgImJhciIpOwotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEBwYXJhbSBmdW5jdGlvbgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGdldEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcnMoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZnVuY3Rpb24sIFN0cmluZyBuYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0ZXIgZ3JvdXBzLgotCSAqIEByZXR1cm4gSVBESVJlZ2lzdGVyR3JvdXBbXQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVJlZ2lzdGVyR3JvdXBbXSBnZXRSZWdpc3Rlckdyb3VwcygpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBSdW50aW1lIG9wdGlvbnMgZm9yIHRoaXMgdGFyZ2V0IGRlYnVnIHNlc3Npb24uCi0JICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJUnVudGltZU9wdGlvbnMgZ2V0UnVudGltZU9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRocmVhZHMgY29udGFpbmVkIGluIHRoaXMgdGFyZ2V0LiBBbiBlbXB0eSBjb2xsZWN0aW9uIGlzIHJldHVybmVkIGlmIHRoaXMgdGFyZ2V0IGNvbnRhaW5zIG5vIHRocmVhZHMuCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhyZWFkcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZFtdIGdldFRocmVhZHMoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvY2tUYXJnZXQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlVGFyZ2V0KCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHB0aHJlYWQKLQkgKiBAcGFyYW0gZG9VcGRhdGUKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRUaHJlYWQoSVBESVRocmVhZCBwdGhyZWFkLCBib29sZWFuIGRvVXBkYXRlKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVuZGVkKGJvb2xlYW4gc3RhdGUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBuZXdUaHJlYWRJZAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKGludCBuZXdUaHJlYWRJZCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElUYXJnZXRFeHByZXNzaW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElUYXJnZXRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGQ2MWYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVGFyZ2V0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogQW4gZXhwcmVzc2lvbiBpcyBhIHNuaXBwZXQgb2YgY29kZSB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgdG8gcHJvZHVjZSBhIHZhbHVlIGZvciByZWdpc3RlcmVkIHByb2Nlc3MKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJVGFyZ2V0RXhwcmVzc2lvbiBleHRlbmRzIElQRElFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBvZiB0aGlzIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gSVBESVN0YWNrRnJhbWUgZnJhbWUgY29udGV4dAotCSAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIG9mIHRoaXMgZXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlJUERJVmFyaWFibGUgZ2V0VmFyaWFibGUoSVBESVN0YWNrRnJhbWUgY29udGV4dCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRocmVhZC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzQzMzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgdGhyZWFkIGluIGEgZGVidWcgdGFyZ2V0LgotICogQSB0aHJlYWQgY29udGFpbnMgc3RhY2sgZnJhbWVzLiAgU3RhY2sgZnJhbWVzIGFyZSBvbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSB0aHJlYWQgaXMgc3VzcGVuZGVkLCBhbmQgYXJlIHJldHVybmVkIGluIHRvcC1kb3duIG9yZGVyLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUaHJlYWQgZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RBQ0tGUkFNRV9ERUZBVUxUX0RFUFRIID0gMjAwOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgdmFyaWFibGUgZnJvbSB0aGUgZGVzY3JpcHRvciBmb3IgZXZhbHVhdGlvbi4gIEEgQ3JlYXRlZEV2ZW50IHdpbGwgYmUgdHJpZ2dlciBhbmQKLQkgKiBDaGFuZ2VkRXZlbnQgd2lsbCBhbHNvIGJlIHRyaWdnZXIgd2hlbiB0aGUgdmFyaWFibGUgaXMgYXNzaWduIGEgbmV3IHZhbHVlLgotCSAqIERlc3Ryb3llZEV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG91dCBvZiBzY29wZSBhbmQgYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhlIG1hbmFnZXIgbGlzdC4KLQkgKiBAcGFyYW0gdmFyRGVzYyBJUERUaHJlYWRTdG9yYWdlRGVzYwotCSAqIEByZXR1cm4gSVBESVRocmVhZFN0b3JhZ2UKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIElQRElUaHJlYWRTdG9yYWdlIGNyZWF0ZVRocmVhZFN0b3JhZ2UoSVBESVRocmVhZFN0b3JhZ2VEZXNjcmlwdG9yIHZhckRlc2MpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIGJvdGggdGhyZWFkcyBhcmUgdGhlIHNhbWUuCi0JICogQHBhcmFtIHRoZWFkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB0aHJlYWRzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVBESVRocmVhZCB0aGVhZCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lIGdldEN1cnJlbnRTdGFja0ZyYW1lKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVwdGggb2YgdGhlIHN0YWNrIGZyYW1lcy4KLQkgKiBAcmV0dXJuICBkZXB0aCBvZiBzdGFjayBmcmFtZXMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIGludCBnZXRTdGFja0ZyYW1lQ291bnQoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhY2sgZnJhbWVzIGNvbnRhaW5lZCBpbiB0aGlzIHRocmVhZC4gQW4gZW1wdHkgY29sbGVjdGlvbiBpcyByZXR1cm5lZCBpZiB0aGlzIHRocmVhZCBjb250YWlucwotCSAqIG5vIHN0YWNrIGZyYW1lcywgb3IgaXMgbm90IGN1cnJlbnRseSBzdXNwZW5kZWQuIFN0YWNrIGZyYW1lcyBhcmUgcmV0dXJuZWQgaW4gdG9wIGRvd24gb3JkZXIuCi0JICogQHJldHVybiAgYSBjb2xsZWN0aW9uIG9mIHN0YWNrIGZyYW1lcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVN0YWNrRnJhbWVbXSBnZXRTdGFja0ZyYW1lcygpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFjayBmcmFtZXMgY29udGFpbmVkIGluIHRoaXMgdGhyZWFkIGJldHdlZW4gdGhlIHNwZWNpZmllZAotICAgICAqIDx0dD5mcm9tSW5kZXg8L3R0PiwgaW5jbHVzaXZlLCBhbmQgPHR0PnRvSW5kZXg8L3R0PiwgZXhjbHVzaXZlLgotCSAqIEFuIGVtcHR5IGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQgaWYgdGhpcyB0aHJlYWQgY29udGFpbnMKLQkgKiBubyBzdGFjayBmcmFtZXMsIG9yIGlzIG5vdCBjdXJyZW50bHkgc3VzcGVuZGVkLiBTdGFjayBmcmFtZXMgYXJlIHJldHVybmVkIGluIHRvcCBkb3duIG9yZGVyLgotCSAqIEByZXR1cm4gIGEgY29sbGVjdGlvbiBvZiBzdGFjayBmcmFtZXMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGZvciBhbiBpbGxlZ2FsIGVuZHBvaW50IGluZGV4IHZhbHVlCi0gICAgICogICAgIChmcm9tSW5kZXggJmx0OyAwIHx8IHRvSW5kZXggJmd0OyBzaXplIHx8IGZyb21JbmRleCAmZ3Q7IHRvSW5kZXgpLgotIAotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZVtdIGdldFN0YWNrRnJhbWVzKGludCBmcm9tSW5kZXgsIGludCBsZW4pIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHBkaSB0YXJnZXQgaW4gdGhpcyB0aHJlYWQKLQkgKiBAcmV0dXJuIHBkaSB0YXJnZXQgaW4gdGhpcyB0aHJlYWQKLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldCBnZXRUYXJnZXQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aHJlYWQgbG9jYWwgc3RvcmFnZSB2YXJpYWJsZXMgZGVzY3JpcHRvci4KLQkgKiBAcmV0dXJuIElQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZFN0b3JhZ2VEZXNjcmlwdG9yW10gZ2V0VGhyZWFkU3RvcmFnZURlc2NyaXB0b3JzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RhY2tmcmFtZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudFN0YWNrRnJhbWUoSVBESVN0YWNrRnJhbWUgc3RhY2tmcmFtZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RhY2tmcmFtZQotCSAqIEBwYXJhbSBkb1VwZGF0ZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudFN0YWNrRnJhbWUoSVBESVN0YWNrRnJhbWUgc3RhY2tmcmFtZSwgYm9vbGVhbiBkb1VwZGF0ZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRocmVhZEdyb3VwLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElUaHJlYWRHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWZiMzY2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRocmVhZEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aHJlYWQgZ3JvdXAKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJVGhyZWFkR3JvdXAgZXh0ZW5kcyBJUERJU2Vzc2lvbk9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdGhyZWFkcyBjb250YWluZWQgaW4gdGhpcyB0YXJnZXQuIAotCSAqIEFuIGVtcHR5IGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQgaWYgdGhpcyB0YXJnZXQgY29udGFpbnMgbm8gdGhyZWFkcy4KLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aHJlYWRzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUlQRElUaHJlYWRbXSBnZXRUaHJlYWRzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQuCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRocmVhZAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlJUERJVGhyZWFkIGdldEN1cnJlbnRUaHJlYWQoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVGhyZWFkU3RvcmFnZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVGhyZWFkU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjdkMDUzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRocmVhZFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aHJlYWQgU3RvcmFnZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUaHJlYWRTdG9yYWdlIGV4dGVuZHMgSVBESVZhcmlhYmxlLCBJUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzMjE5My4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aHJlYWQgc3RvcmFnZSBkZXNjcmlwdG9yCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVRocmVhZFN0b3JhZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdGhyZWFkCi0JICogQHJldHVybiB0aGUgdGhyZWFkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUlQRElUaHJlYWQgZ2V0VGhyZWFkKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVHJhY2Vwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVHJhY2Vwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRiMTdjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVRyYWNlcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIERlZmluZXMgYSBwb2ludCBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24gd2hlbiB0aGUgc3BlY2lmaWVkIGRhdGEgdG8gYmUgY29sbGVjdGVkLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElUcmFjZXBvaW50IGV4dGVuZHMgSVBESVNlc3Npb25PYmplY3QgewotCS8qKgotCSAqIFJlcHJlc2VudHMgYW4gYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gdGhlIHRyYWNlcG9pbnQgaXMgaGl0LgotCSAqIEBhdXRob3IgY2xlbWVudAotCSAqCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJQWN0aW9uIHt9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGlzIHRyYWNlcG9pbnQuCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyB0cmFjZXBvaW50Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUlQRElMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0cmFjZXBvaW50IGlzIGVuYWJsZWQuCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgdHJhY2Vwb2ludCBpcyBlbmFibGVkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCWJvb2xlYW4gaXNFbmFibGVkKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyB0cmFjZXBvaW50LiBUaGlzIGhhcyBubyBlZmZlY3QgCi0JICogaWYgdGhlIGN1cnJlbnQgZW5hYmxlZCBzdGF0ZSBpcyB0aGUgc2FtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGVuYWJsZWQgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSBlbmFibGVkIC0gd2hldGhlciB0aGlzIHRyYWNlcG9pbnQgc2hvdWxkIGJlIGVuYWJsZWQgCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXNzIGNvdW50IG9mIHRoaXMgdHJhY2Vwb2ludC4KLQkgKiBAcmV0dXJuIHRoZSBwYXNzIGNvdW50IG9mIHRoaXMgdHJhY2Vwb2ludAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlpbnQgZ2V0UGFzc0NvdW50KCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBwYXNzIGNvdW50IG9mIHRoaXMgdHJhY2Vwb2ludC4KLQkgKiBAcGFyYW0gdGhlIHBhc3MgY291bnQgdG8gc2V0Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgc2V0UGFzc0NvdW50KGludCBwYXNzQ291bnQpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBhY3Rpb25zIHRvIHRoZSBhY3Rpb24gbGlzdCBvZiB0aGlzIHRyYWNlcG9pbnQuCi0JICogQHBhcmFtIGFjdGlvbnMgdG8gYWRkCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXZvaWQgYWRkQWN0aW9ucyhJUERJVHJhY2Vwb2ludC5JQWN0aW9uW10gYWN0aW9ucykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGFjdGlvbnMgZnJvbSB0aGUgYWN0aW9uIGxpc3Qgb2YgdGhpcyB0cmFjZXBvaW50LgotCSAqIEBwYXJhbSBhY3Rpb25zIHRvIHJlbW92ZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQl2b2lkIHJlbW92ZUFjdGlvbnMoSVBESVRyYWNlcG9pbnQuSUFjdGlvbltdIGFjdGlvbnMpIHRocm93cyBQRElFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGFjdGlvbiBsaXN0IG9mIHRoaXMgdHJhY2Vwb2ludC4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0Jdm9pZCBjbGVhckFjdGlvbnMoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aW9ucyBhc3NpZ25lZCB0byB0aGlzIHRyYWNlcG9pbnQuCi0JICogQHJldHVybiB0aGUgYWN0aW9ucyBvZiB0aGlzIHRyYWNlcG9pbnQKLQkgKi8KLQlJUERJVHJhY2Vwb2ludC5JQWN0aW9uW10gZ2V0QWN0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVmFyaWFibGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzEyMDkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgcHJvZ3JhbS4KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJVmFyaWFibGUgZXh0ZW5kcyBJUERJVmFyaWFibGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHZhcmlhYmxlIGZyb20gdGhlIG1hbmFnZXIgbGlzdAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYm90aCB2YXJpYWJsZXMgYXJlIHRoZSBzYW1lCi0JICogQHBhcmFtIHZhcmlhYmxlIElQRElWYXJpYWJsZSBmb3IgY29tcGFyaW5nCi0JICogQHJldHVybiB0cnVlIGlmIGdpdmVuIHZhcmlhYmxlIGlzIHNhbWUgYXMgdGhlIGN1cnJlbnQgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVBESVZhcmlhYmxlIHZhcmlhYmxlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFyaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZSBnZXRDaGlsZChTdHJpbmcgdmFyaWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgSVBESVZhcmlhYmxlcyBvZiB0aGUgY2hpbGRyZW4gb2YgY3VycmVudCB2YXJpYWJsZSBvciBlbXB0eSBhcnJheSBpZiBub3RoaW5nCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBJUERJVmFyaWFibGVzIG9mIHRoZSBjaGlsZHJlbiBvZiBjdXJyZW50IHZhcmlhYmxlCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVbXSBnZXRDaGlsZHJlbigpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBJUERJVmFyaWFibGVzIG9mIHRoZSBjaGlsZHJlbiBvZiBjdXJyZW50IHZhcmlhYmxlIGJ5IGdpdmVuIGEgcmFuZ2UgIG9yIGVtcHR5IGFycmF5IGlmIG5vdGhpbmcKLQkgKiBAcGFyYW0gZmluZGV4IGZpcnN0IGluZGV4IG9mIHRoaXMgdmFyaWFibGUgCi0JICogQHBhcmFtIHBzaXplIHNpemUgb2YgdGhpcyB2YXJpYWJsZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSVBESVZhcmlhYmxlIG9mIHRoZSBjaGlsZHJlbiBvZiBjdXJyZW50IHZhcmlhYmxlCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVbXSBnZXRDaGlsZHJlbihpbnQgZmluZGV4LCBpbnQgcHNpemUpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgdmFyaWFibGUKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyB2YXJpYWJsZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkcmVuTnVtYmVyKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgY291bGQgYmUgZWRpdGVkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGNvdWxkIGJlIGVkaXRlZAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXNldHMgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGJ5IGdpdmVuIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiBhbiBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGEgbmV3IEFJRiB2YWx1ZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVZhcmlhYmxlRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVmFyaWFibGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlY2VmNDMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9JUERJVmFyaWFibGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHZhcmlhYmxlIGRlc2NyaXB0aW9uCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBleHRlbmRzIElQRElTZXNzaW9uT2JqZWN0IHsKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYm90aCBkZXNjcmlwdG9ycyBhcmUgdGhlIHNhbWUKLQkgKiBAcGFyYW0gdmFyaWFibGUgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBmb3IgY29tcGFyaW5nCi0JICogQHJldHVybiB0cnVlIGlmIGdpdmVuIGRlc2NyaXB0b3JzIGlzIHNhbWUgYXMgdGhlIGN1cnJlbnQgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbERlc2NyaXB0b3JzKElQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyaWFibGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgQUlGIG9mIHRoaXMgdmFyaWFibGUKLQkgKiBAcmV0dXJuIEFJRiBvZiB0aGlzIHZhcmlhYmxlCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJQUlGIGdldEFJRigpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIHBvc2l0aW9uCi0JICogQHJldHVybiB0aGUgZW5kIHBvc2l0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDYXN0aW5nQXJyYXlFbmQoKTsKLQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENhc3RpbmdBcnJheVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENhc3RpbmdUeXBlcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHZhcmlhYmxlCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHZhcmlhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB2YXJpYWJsZQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHZhcmlhYmxlIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHZhcmlhYmxlIGRlc2NyaXB0b3IKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFja0RlcHRoKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lIGdldFN0YWNrRnJhbWUoKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkIGdldFRocmVhZCgpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZSBvZiB0aGlzIHZhcmlhYmxlIGRlc2NyaXB0b3IKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ29uc2lkZXIgdGhlIHZhcmlhYmxlIG9iamVjdCBhcyBhbiBBcnJheSBvZiB0eXBlIGFuZCByYW5nIFtzdGFydCwgc3RhcnQgKyBsZW5ndGggLSAxXQotCSAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleAotCSAqIEBwYXJhbSBsZW5ndGggc2l6ZSBvZiBhcnJheQotCSAqIEByZXR1cm4gSVBESVZhcmlhYmxlRGVzY3JpcHRvcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBnZXRWYXJpYWJsZURlc2NyaXB0b3JBc0FycmF5KGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiAgQ29uc2lkZXIgdGhlIHZhcmlhYmxlIG9iamVjdCBhcyBhIHR5cGUKLQkgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHZhcmlhYmxlCi0JICogQHJldHVybiBJUERJVmFyaWFibGVEZXNjcmlwdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVEZXNjcmlwdG9yIGdldFZhcmlhYmxlRGVzY3JpcHRvckFzVHlwZShTdHJpbmcgdHlwZSkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gdW5pcXVlIGlkIG9mIHRoaXMgdmFyaWFibGUKLQkgKiBAcmV0dXJuIGFuIHVuaXF1ZSBpZCBvZiB0aGlzIHZhcmlhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJJZCgpOwotCQotCS8qKgotCSAqIFNldHMgSUFJRiB0byB0aGlzIHZhcmlhYmxlCi0JICogQHBhcmFtIGFpZiBBSUYgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QUlGKElBSUYgYWlmKTsKLQkKLQkvKioKLQkgKiBTZXRzIGVuZCBwb3NpdGlvbiBvZiBjYXN0aW5nIGFycmF5Ci0JICogQHBhcmFtIGVuZCBwb3NpdGlvbiB0byBlbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXN0aW5nQXJyYXlFbmQoaW50IGVuZCk7Ci0JCi0JLyoqCi0JICogU2V0cyBzdGFydCBwb3NpdGlvbiBvZiBjYXN0aW5nIGFycmF5Ci0JICogQHBhcmFtIHN0YXJ0IHBvc2l0aW9uIHRvIHN0YXJ0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzdGluZ0FycmF5U3RhcnQoaW50IHN0YXJ0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgdmFyaWFibGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyB2YXJpYWJsZSBkZXNjcmlwdG9yCi0JICogQHRocm93cyBQRElFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZW9mKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVdhdGNocG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvSVBESVdhdGNocG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4Y2M5MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL0lQRElXYXRjaHBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgd2F0Y2hwb2ludAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElXYXRjaHBvaW50IGV4dGVuZHMgSVBESUJyZWFrcG9pbnQgewotCS8qKgotCSAqIFdyaXRlIHZhbHVlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV1JJVEUgPSAweDE7Ci0JCi0JLyoqCi0JICogUmVhZCB2YWx1ZQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQUQgPSAweDI7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB3YXRjaHBvaW50IGlzIGEgd3JpdGUgd2F0Y2hwb2ludAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHd3YXRjaHBvaW50IGlzIGEgd3JpdGUgd2F0Y2hwb2ludAotCSAqLwotCWJvb2xlYW4gaXNXcml0ZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB3YXRjaHBvaW50IGlzIGEgcmVhZCB3YXRjaHBvaW50Ci0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgd2F0Y2hwb2ludCBpcyBhIHJlYWQgd2F0Y2hwaW9udAotCSAqLwotCWJvb2xlYW4gaXNSZWFkVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyB3YXRjaHBvaW50Ci0JICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHdhdGNocG9pbnQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JU3RyaW5nIGdldFdhdGNoRXhwcmVzc2lvbigpIHRocm93cyBQRElFeGNlcHRpb247Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0FJRkV4Y2VwdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvQUlGRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzJkMzcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvQUlGRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBSUZFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM4NzUxNjk5MzEyNDIyOTk0OUw7Ci0gICAgCi0gICAgcHVibGljIEFJRkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgCXN1cGVyKG1zZyk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9BSUZGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9BSUZGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYWY1YzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvQUlGRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVHlwZUFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlQm9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlR5cGVDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVHlwZUNoYXJQb2ludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVHlwZUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlRmxvYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlSW5jb21wbGV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlR5cGVJbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlTmFtZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZUeXBlU3RyaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVHlwZVN0cnVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlR5cGVVbmlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlR5cGVWb2lkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVmFsdWVBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVmFsdWVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlQm9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlQ2hhclBvaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZWYWx1ZUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVmFsdWVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVmFsdWVGbG9hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlSW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVmFsdWVOYW1lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWYuQUlGVmFsdWVTdHJpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZWYWx1ZVN0cnVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmLkFJRlZhbHVlVW5pb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZWYWx1ZVVua25vd247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZi5BSUZWYWx1ZVZvaWQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBSUZGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUJ5dGVCdWZmZXIgewotCQlieXRlW10gYnl0ZXM7Ci0JCWludCBwb3MgPSAwOwotCQlTaW1wbGVCeXRlQnVmZmVyKGJ5dGVbXSBieXRlcykgewotCQkJaWYgKGJ5dGVzID09IG51bGwpIHsKLQkJCQlieXRlcyA9IG5ldyBieXRlWzBdOwotCQkJfQotCQkJdGhpcy5ieXRlcyA9IGJ5dGVzOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGVuZCgpIHsKLQkJCXJldHVybiAocG9zID09IGJ5dGVzLmxlbmd0aCk7Ci0JCX0KLQkJcHVibGljIGJ5dGUgZ2V0KCkgewotCQkJcmV0dXJuIGJ5dGVzW3BvcysrXTsKLQkJfQotCQlwdWJsaWMgYnl0ZSBnZXQoaW50IHBvcykgewotCQkJcmV0dXJuIGJ5dGVzW3Bvc107Ci0JCX0KLQkJcHVibGljIGJ5dGVbXSBnZXRCeXRlKCkgewotCQkJcmV0dXJuIGJ5dGVzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q2FwYWNpdHkoKSB7Ci0JCQlyZXR1cm4gYnl0ZXMubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCQlyZXR1cm4gcG9zOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFBvcyhpbnQgcG9zKSB7Ci0JCQl0aGlzLnBvcyA9IHBvczsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX0FSUkFZID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGRFNfQk9PTCA9ICdiJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX0NIQVIgPSAnYyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19FTlVNID0gJzwnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGRFNfRkxPQVQgPSAnZic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19GVU5DVElPTiA9ICcmJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX0lOVCA9ICdpJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX1BPSU5URVIgPSAnXic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19TVFJJTkcgPSAncyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19TVFJVQ1RfQ0xBU1MgPSAneyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19VTklPTiA9ICcoJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX1ZPSUQgPSAndic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19SRUZFUkVOQ0UgPSAnPic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZEU19OQU1FRCA9ICclJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX0FERFJFU1MgPSAnYSc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkRTX0NIQVJfUE9JTlRFUiA9ICdwJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRFNfRkxPQVRfU0laRV9QT1MgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZEU19WT0lEX1NJWkVfUE9TID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRFNfSU5URUdFUl9TSUdOX1BPUyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkRTX0lOVEVHRVJfU0laRV9QT1MgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZEU19SQU5HRV9ET1RfTEVOID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOX09QRU4gPSAiWyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTl9DTE9TRSA9ICJdIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOX1NUUk9LRSA9ICJ8IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOX0NPTU1BID0gIiwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05fRVFVQUwgPSAiPSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTl9TRU1JX0NPTE9OID0gIjsiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05fQ09MT04gPSAiOiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTl9ET1QgPSAiLiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkRTX1NUUlVDVF9FTkQgPSAiOzs7fSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkRTX0NMQVNTX0VORCA9ICJ9IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRFNfVU5JT05fRU5EID0gIikiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZEU19FTlVNX0VORCA9ICAiPiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkRTX0ZVTkNUSU9OX0VORCA9ICAiLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkRTX1JFRkVSRU5DRV9FTkQgPSAiLyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkRTX05BTUVEX0VORCA9ICIvIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TSVpFID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0JPT0wgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfQ0hBUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9GTE9BVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9ET1VCTEUgPSA4OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfSU5WQUxJRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJQUlGVHlwZSBVTktOT1dOVFlQRSA9IG5ldyBBSUZUeXBlSW5jb21wbGV0ZSgpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUFJRlZhbHVlIFVOS05PV05WQUxVRSA9IG5ldyBBSUZWYWx1ZVVua25vd24oVU5LTk9XTlRZUEUpOwotCQotCS8qKgotCSAqIEBwYXJhbSBmbXQKLQkgKiBAcGFyYW0gc3RhcnRfcG9zCi0JICogQHBhcmFtIGVuZF9wb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdEZvcm1hdChTdHJpbmcgZm10LCBpbnQgc3RhcnRfcG9zLCBpbnQgZW5kX3BvcykgewotCQlyZXR1cm4gZm10LnN1YnN0cmluZyhzdGFydF9wb3MsIGVuZF9wb3MpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gQUlGIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBmZHMKLQkgKiBAcGFyYW0gZGF0YQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBSUYgbmV3QUlGKFN0cmluZyBmZHMsIGJ5dGVbXSBkYXRhLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBBSUYoZmRzLCBkYXRhLCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBBSUYgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGFpZlR5cGUKLQkgKiBAcGFyYW0gYWlmVmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQUlGIG5ld0FJRihJQUlGVHlwZSBhaWZUeXBlLCBJQUlGVmFsdWUgYWlmVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBBSUYoYWlmVHlwZSwgYWlmVmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gQUlGIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBmZHMKLQkgKiBAcGFyYW0gZGF0YQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBSUYgbmV3QUlGKFN0cmluZyBmZHMsIGJ5dGVbXSBkYXRhKSB7Ci0JCXJldHVybiBuZXcgQUlGKGZkcywgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZtdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBSUZUeXBlIGdldEFJRlR5cGUoU3RyaW5nIGZtdCkgewotCQlpZiAoZm10ID09IG51bGwgfHwgZm10Lmxlbmd0aCgpID09IDApIHsKLQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIiAgICAgICAgPT09PT09PSBudWxsOiAiICsgZm10KTsKLQkJCXJldHVybiBVTktOT1dOVFlQRTsJCQkKLQkJfQotCQlzd2l0Y2ggKGZtdC5jaGFyQXQoMCkpIHsKLQkJY2FzZSBGRFNfQ0hBUjogLy9jaGFyIGlzIHNpZ25lZCBvciB1bnNpZ25lZCA/Pz8KLQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIiAgICAgICAgPT09PT09PSBjaGFyYWN0ZXI6ICIgKyBmbXQpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlQ2hhcigpOwotCQljYXNlIEZEU19GTE9BVDoKLQkJCWludCBmbG9hdF9zaXplID0gQ2hhcmFjdGVyLmRpZ2l0KGZtdC5jaGFyQXQoRkRTX0ZMT0FUX1NJWkVfUE9TKSwgMTApOwotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IGZsb2F0aW5nOiAiICsgZm10ICsgIiwgc2l6ZTogIiArIGZsb2F0X3NpemUpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlRmxvYXQoZmxvYXRfc2l6ZSk7Ci0JCWNhc2UgRkRTX0lOVDogLy9sb25nIGFuZCBpbnQgaXMgc2FtZT8/PyAgbG9uZyBsb25nIHR5cGUKLQkJCWJvb2xlYW4gc2lnbmVkID0gKGZtdC5jaGFyQXQoRkRTX0lOVEVHRVJfU0lHTl9QT1MpID09ICdzJyk7Ci0JCQlpbnQgaW50X3NpemUgPSBDaGFyYWN0ZXIuZGlnaXQoZm10LmNoYXJBdChGRFNfSU5URUdFUl9TSVpFX1BPUyksIDEwKTsKLQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIiAgICAgICAgPT09PT09PSBpbnQ6ICIgKyBmbXQgKyAiLCBzaXplOiAiICsgaW50X3NpemUpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlSW50KHNpZ25lZCwgaW50X3NpemUpOwotCQljYXNlIEZEU19DSEFSX1BPSU5URVI6Ci0JCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gY2hhciBwb2ludGVyOiAiICsgZm10KTsKLQkJCXJldHVybiBuZXcgQUlGVHlwZUNoYXJQb2ludGVyKGdldEFJRlR5cGUoZm10LnN1YnN0cmluZygxLCAzKSkpOwotCQljYXNlIEZEU19TVFJJTkc6Ci0JCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gc3RyaW5nOiAiICsgZm10KTsKLQkJCXJldHVybiBuZXcgQUlGVHlwZVN0cmluZygpOwotCQljYXNlIEZEU19CT09MOgotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IGJvb2xlYW46ICIgKyBmbXQpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlQm9vbCgpOwotCQljYXNlIEZEU19FTlVNOgotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IGVudW06ICIgKyBmbXQpOwotCQkJaW50IGVudW1fZW5kX3BvcyA9IGdldEVuZFBvc0Zyb21MYXN0KGZtdCwgRkRTX0VOVU1fRU5EKTsKLQkJCVN0cmluZyBlbnVtX3R5cGUgPSBmbXQuc3Vic3RyaW5nKGVudW1fZW5kX3BvcytGRFNfRU5VTV9FTkQubGVuZ3RoKCkpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlRW51bShleHRyYWN0Rm9ybWF0KGZtdCwgMSwgZW51bV9lbmRfcG9zKSwgZ2V0QUlGVHlwZShlbnVtX3R5cGUpKTsKLQkJY2FzZSBGRFNfRlVOQ1RJT046Ci0JCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gZnVuY3Rpb246ICIgKyBmbXQpOwotCQkJaW50IGZ1bmNfZW5kX3BvcyA9IGdldEVuZFBvc0Zyb21MYXN0KGZtdCwgRkRTX0ZVTkNUSU9OX0VORCk7Ci0JCQlTdHJpbmcgZnVuY190eXBlID0gZm10LnN1YnN0cmluZyhmdW5jX2VuZF9wb3MrRkRTX0ZVTkNUSU9OX0VORC5sZW5ndGgoKSk7Ci0JCQlyZXR1cm4gbmV3IEFJRlR5cGVGdW5jdGlvbihleHRyYWN0Rm9ybWF0KGZtdCwgMSwgZnVuY19lbmRfcG9zKSwgZ2V0QUlGVHlwZShmdW5jX3R5cGUpKTsKLQkJY2FzZSBGRFNfU1RSVUNUX0NMQVNTOiAvL3N0cnVjdCBvciBjbGFzcwotCQkJaW50IHN0cnVjdF9lbmRfcG9zID0gZ2V0RW5kUG9zRnJvbUxhc3QoZm10LCBGRFNfU1RSVUNUX0VORCk7Ci0JCQlpZiAoZm10Lmxlbmd0aCgpID09IHN0cnVjdF9lbmRfcG9zICsgRkRTX1NUUlVDVF9FTkQubGVuZ3RoKCkpIHsKLQkJCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gc3RydWN0ICIgKyBmbXQpOwotCQkJCXJldHVybiBuZXcgQUlGVHlwZVN0cnVjdChleHRyYWN0Rm9ybWF0KGZtdCwgMSwgc3RydWN0X2VuZF9wb3MpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0cnVjdF9lbmRfcG9zID0gZ2V0RW5kUG9zRnJvbUxhc3QoZm10LCBGRFNfQ0xBU1NfRU5EKTsKLQkJCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gY2xhc3MgIiArIGZtdCk7Ci0JCQkJcmV0dXJuIG5ldyBBSUZUeXBlQ2xhc3MoZXh0cmFjdEZvcm1hdChmbXQsIDEsIHN0cnVjdF9lbmRfcG9zKSk7Ci0JCQl9Ci0JCWNhc2UgRkRTX1VOSU9OOgotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IHVuaW9uOiAiICsgZm10KTsKLQkJCWludCB1bmlvbl9lbmRfcG9zID0gZ2V0RW5kUG9zRnJvbUxhc3QoZm10LCBGRFNfVU5JT05fRU5EKTsKLQkJCXJldHVybiBuZXcgQUlGVHlwZVVuaW9uKGV4dHJhY3RGb3JtYXQoZm10LCAxLCB1bmlvbl9lbmRfcG9zKSk7Ci0JCWNhc2UgRkRTX1JFRkVSRU5DRToKLQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIiAgICAgICAgPT09PT09PSByZWZlcmVuY2U6ICIgKyBmbXQpOwotCQkJaW50IHJlZl9lbmRfcG9zID0gZ2V0RW5kUG9zRnJvbVN0YXJ0KGZtdCwgRkRTX1JFRkVSRU5DRV9FTkQpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlUmVmZXJlbmNlKGV4dHJhY3RGb3JtYXQoZm10LCAxLCByZWZfZW5kX3BvcykpOwotCQljYXNlIEZEU19BRERSRVNTOgotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IGFkZHJlc3M6ICIgKyBmbXQpOwotCQkJcmV0dXJuIG5ldyBBSUZUeXBlQWRkcmVzcyhDaGFyYWN0ZXIuZGlnaXQoZm10LmNoYXJBdCgxKSwgMTApKTsKLQkJY2FzZSBGRFNfUE9JTlRFUjoKLQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIiAgICAgICAgPT09PT09PSBwb2ludGVyOiAiICsgZm10KTsKLQkJCXJldHVybiBuZXcgQUlGVHlwZVBvaW50ZXIoZ2V0QUlGVHlwZShmbXQuc3Vic3RyaW5nKDEsIDMpKSwgZ2V0QUlGVHlwZShmbXQuc3Vic3RyaW5nKDMpKSk7Ci0JCWNhc2UgRkRTX1ZPSUQ6Ci0JCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gdm9pZDogIiArIGZtdCk7Ci0JCQlpbnQgdm9pZF9zaXplID0gQ2hhcmFjdGVyLmRpZ2l0KGZtdC5jaGFyQXQoRkRTX1ZPSURfU0laRV9QT1MpLCAxMCk7Ci0JCQlyZXR1cm4gbmV3IEFJRlR5cGVWb2lkKHZvaWRfc2l6ZSk7Ci0JCWNhc2UgRkRTX0FSUkFZOgotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IGFycmF5OiAiICsgZm10KTsKLQkJCWludCBhcnJheV9lbmRfcG9zID0gZ2V0RW5kUG9zRnJvbVN0YXJ0KGZtdCwgU0lHTl9DTE9TRSk7Ci0JCQlyZXR1cm4gbmV3IEFJRlR5cGVBcnJheShleHRyYWN0Rm9ybWF0KGZtdCwgMSwgYXJyYXlfZW5kX3BvcyksIGdldEFJRlR5cGUoZm10LnN1YnN0cmluZyhhcnJheV9lbmRfcG9zKzEpKSk7Ci0JCWNhc2UgRkRTX05BTUVEOgotCQkJUERlYnVnVXRpbHMucHJpbnRsbigiICAgICAgICA9PT09PT09IG5hbWVkOiAiICsgZm10KTsKLQkJCWludCBuYW1lZF9lbmRfcG9zID0gZ2V0RW5kUG9zRnJvbVN0YXJ0KGZtdCwgRkRTX05BTUVEX0VORCk7Ci0JCQlyZXR1cm4gbmV3IEFJRlR5cGVOYW1lZChleHRyYWN0Rm9ybWF0KGZtdCwgMSwgbmFtZWRfZW5kX3BvcyksIGdldEFJRlR5cGUoZm10LnN1YnN0cmluZyhuYW1lZF9lbmRfcG9zKzEpKSk7Ci0JCWRlZmF1bHQ6Ci0JCQlQRGVidWdVdGlscy5wcmludGxuKCIgICAgICAgID09PT09PT0gdW5rbm93bjogIiArIGZtdCk7Ci0JCQlyZXR1cm4gbmV3IEFJRlR5cGVJbmNvbXBsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQUlGVmFsdWUgZ2V0QUlGVmFsdWUoSVZhbHVlUGFyZW50IHBhcmVudCwgSUFJRlR5cGUgdHlwZSwgYnl0ZVtdIGRhdGEpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCA8IDApIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVVbmtub3duKHR5cGUpOwotCQl9Ci0JCXJldHVybiBnZXRBSUZWYWx1ZShwYXJlbnQsIHR5cGUsIG5ldyBTaW1wbGVCeXRlQnVmZmVyKGRhdGEpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBSUZWYWx1ZSBnZXRBSUZWYWx1ZShJVmFsdWVQYXJlbnQgcGFyZW50LCBJQUlGVHlwZSB0eXBlLCBTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoYnVmZmVyLmVuZCgpKSB7Ci0JCQlyZXR1cm4gbmV3IEFJRlZhbHVlVW5rbm93bih0eXBlKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVDaGFyKSB7Ci0JCQkgcmV0dXJuIG5ldyBBSUZWYWx1ZUNoYXIoKElBSUZUeXBlQ2hhcil0eXBlLCBidWZmZXIpOwotCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZUZsb2F0KSB7Ci0JCQlyZXR1cm4gbmV3IEFJRlZhbHVlRmxvYXQoKElBSUZUeXBlRmxvYXQpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVJbnQpIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVJbnQoKElBSUZUeXBlSW50KXR5cGUsIGJ1ZmZlcik7Ci0JCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlQ2hhclBvaW50ZXIpIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVDaGFyUG9pbnRlcigoSUFJRlR5cGVDaGFyUG9pbnRlcil0eXBlLCBidWZmZXIpOwotCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZVN0cmluZykgewotCQkJcmV0dXJuIG5ldyBBSUZWYWx1ZVN0cmluZygoSUFJRlR5cGVTdHJpbmcpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVCb29sKSB7Ci0JCQlyZXR1cm4gbmV3IEFJRlZhbHVlQm9vbCgoSUFJRlR5cGVCb29sKXR5cGUsIGJ1ZmZlcik7Ci0JCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlQXJyYXkpIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVBcnJheSgoSUFJRlR5cGVBcnJheSl0eXBlLCBidWZmZXIpOwotCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZUVudW0pIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVFbnVtKChJQUlGVHlwZUVudW0pdHlwZSwgYnVmZmVyKTsJCQotCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZUFkZHJlc3MpIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVBZGRyZXNzKChJQUlGVHlwZUFkZHJlc3MpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVQb2ludGVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFJRlZhbHVlUG9pbnRlcihwYXJlbnQsIChJQUlGVHlwZVBvaW50ZXIpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVOYW1lZCkgewotCQkJcmV0dXJuIG5ldyBBSUZWYWx1ZU5hbWVkKHBhcmVudCwgKElBSUZUeXBlTmFtZWQpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVSZWZlcmVuY2UpIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVSZWZlcmVuY2UocGFyZW50LCAoSUFJRlR5cGVSZWZlcmVuY2UpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVTdHJ1Y3QpIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVTdHJ1Y3QocGFyZW50LCAoSUFJRlR5cGVTdHJ1Y3QpdHlwZSwgYnVmZmVyKTsJCQkKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVVbmlvbikgewotCQkJcmV0dXJuIG5ldyBBSUZWYWx1ZVVuaW9uKHBhcmVudCwgKElBSUZUeXBlVW5pb24pdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVDbGFzcykgewotCQkJcmV0dXJuIG5ldyBBSUZWYWx1ZUNsYXNzKHBhcmVudCwgKElBSUZUeXBlQ2xhc3MpdHlwZSwgYnVmZmVyKTsKLQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVWb2lkKSB7Ci0JCQlyZXR1cm4gbmV3IEFJRlZhbHVlVm9pZCgoSUFJRlR5cGVWb2lkKXR5cGUsIGJ1ZmZlcik7Ci0JCS8qCi0JCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlRnVuY3Rpb24pIHsKLQkJCXJldHVybiBuZXcgQUlGVmFsdWVGdW5jdGlvbigoSUFJRlR5cGVGdW5jdGlvbil0eXBlLCBkYXRhKTsJCQkKLQkJKi8JCQkJCi0JCX0JCQotCQlyZXR1cm4gbmV3IEFJRlZhbHVlVW5rbm93bih0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZvcm1hdAotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlnaXRQb3MoU3RyaW5nIGZvcm1hdCwgaW50IHBvcykgewotCQlpbnQgbGVuID0gZm9ybWF0Lmxlbmd0aCgpOwotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQljaGFyIGFDaGFyID0gZm9ybWF0LmNoYXJBdChwb3MpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChhQ2hhcikpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBvcysrOwotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmbXQKLQkgKiBAcGFyYW0gcmVnZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RW5kUG9zRnJvbUxhc3QoU3RyaW5nIGZtdCwgU3RyaW5nIHJlZ2V4KSB7Ci0JCXJldHVybiBmbXQubGFzdEluZGV4T2YocmVnZXgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZm10Ci0JICogQHBhcmFtIHJlZ2V4Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEVuZFBvc0Zyb21TdGFydChTdHJpbmcgZm10LCBTdHJpbmcgcmVnZXgpIHsKLQkJcmV0dXJuIGZtdC5pbmRleE9mKHJlZ2V4KTsKLQl9Ci0JCi0JLyoqCi0JICogdGVzdGluZyBwdXJwb3NlIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHJhbmRvbV9udW0oaW50IG1pbiwgaW50IG1heCkgewotCSAgICBSYW5kb20gZ2VuZXJhdG9yID0gbmV3IFJhbmRvbSgpOwotCSAgICBsb25nIHJhbmdlID0gKGxvbmcpbWF4IC0gKGxvbmcpbWluICsgMTsKLQkgICAgbG9uZyBmcmFjdGlvbiA9IChsb25nKShyYW5nZSAqIGdlbmVyYXRvci5uZXh0RG91YmxlKCkpOwotCSAgICByZXR1cm4gKGludCkoZnJhY3Rpb24gKyBtaW4pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBSUYgVU5LTk9XTkFJRigpIHsKLQkJcmV0dXJuIG5ldyBBSUYoVU5LTk9XTlRZUEUsIFVOS05PV05WQUxVRSk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUYuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkNTgwMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdmFsdWUgYW5kIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGluIEFJRiBmb3JtYXQgIAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUYgewotCS8qKgotCSAqIFJldHVybnMgSUFJRlR5cGUgb2YgdGhpcyBBSUYKLQkgKiBAcmV0dXJuIElBSUZUeXBlIG9mIHRoaXMgQUlGCi0JICovCi0JSUFJRlR5cGUgZ2V0VHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgSUFJRlZhbHVlIG9mIHRoaXMgQUlGCi0JICogQHJldHVybiBJQUlGVmFsdWUgb2YgdGhpcyBBSUYKLQkgKi8KLQlJQUlGVmFsdWUgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGRlc2NyaXB0aW9uIG9mIHRoaXMgQUlGCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGlzIEFJRgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMjE0YzYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdHlwZSBvZiBBSUYgb2JqZWN0Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGUgewotCS8qKgotCSAqIFJldHVybnMgc2l6ZSBvZiB0aGlzIEFJRiB0eXBlCi0JICogQHJldHVybiBzaXplIG9mIHRoaXMgQUlGIHR5cGUKLQkgKi8KLQlpbnQgc2l6ZW9mKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUFkZHJlc3MuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRmOWNjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhZGRyZXNzIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZUFkZHJlc3MgZXh0ZW5kcyBJQUlGVHlwZSB7fTsKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQXJyYXkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxMjgxZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUFycmF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFycmF5IHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZUFycmF5IGV4dGVuZHMgSVR5cGVEZXJpdmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaW1lbnNpb24gb2YgdGhpcyBhcnJheQotCSAqIEByZXR1cm4gZGltZW5zaW9uIG9mIHRoaXMgYXJyYXkKLQkgKi8KLQlpbnQgZ2V0RGltZW5zaW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBkaW1lbnNpb24gc2l6ZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZGltZW5zaW9uIHNpemUKLQkgKi8KLQlpbnRbXSBnZXREaW1lbnNpb25EZXRhaWxzKCk7Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgYXJyYXkgdHlwZSBpcyBkaW1lbnNpb24gb3Igbm90Ci0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgYXJyYXkgdHlwZSBoYXMgZGltZW5zaW9uCi0JICovCi0JYm9vbGVhbiBpc0RpbWVuc2lvbkFycmF5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhcnJheSB0eXBlIGluIGdpdmVuIGRpbWVuc2lvbiBwb3NpdGlvbiAKLQkgKiBAcGFyYW0gZGltX3BvcyBkaW1lbnNpb24gcG9zaXRpb24gb2YgY3VycmVudCBhcnJheQotCSAqIEByZXR1cm4gYXJyYXkgdHlwZQotCSAqLwotCUlBSUZUeXBlQXJyYXkgZ2V0QUlGVHlwZUFycmF5KGludCBkaW1fcG9zKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHN0cmluZyBmb3JtYXQgaW4gZ2l2ZW4gcmFuZ2UKLQkgKiBAcGFyYW0gcmFuZ2UgcmFuZ2UgbnVtYmVyCi0JICogQHJldHVybiBzdHJpbmcgZm9ybWF0IG9mIHRoZSBjdXJyZW50IHR5cGUKLQkgKi8KLQlTdHJpbmcgdG9TdHJpbmcoaW50IHJhbmdlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb3dlc3QgaW5kZXggb2YgdGhpcyBhcnJheQotCSAqIEByZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBvZiB0aGlzIGFycmF5Ci0JICovCi0JaW50IGdldExvdygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhpZ2hlc3QgaW5kZXggb2YgdGhpcyBhcnJheQotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggb2YgdGhpcyBhcnJheQotCSAqLwotCWludCBnZXRIaWdoKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmFuZ2Ugb2YgdGhpcyBhcnJheQotCSAqIEByZXR1cm4gdGhlIHJhbmdlIG9mIHRoaXMgYXJyYXkKLQkgKi8KLQlpbnQgZ2V0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJhc2UgdHlwZSBvZiB0aGlzIGFycmF5IAotCSAqIEByZXR1cm4gYmFzZSB0eXBlIG9mIHRoaXMgYXJyYXkKLQkgKi8KLQlJQUlGVHlwZSBnZXRGb3VuZGF0aW9uVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVCb29sLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUJvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlN2VhOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUJvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYm9vbGVhbiB0eXBlIGluIElBSUZUeXBlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGVCb29sIGV4dGVuZHMgSVR5cGVJbnRlZ3JhbCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVDaGFyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUNoYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyOWE5NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUNoYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgY2hhciB0eXBlIGluIElBSUZUeXBlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGVDaGFyIGV4dGVuZHMgSVR5cGVJbnRlZ3JhbCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVDaGFyUG9pbnRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVDaGFyUG9pbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQ0YjY0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQ2hhclBvaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgY2hhciBwb2ludGVyIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZUNoYXJQb2ludGVyIGV4dGVuZHMgSUFJRlR5cGVTdHJpbmcgewotCS8qKgotCSAqIFJldHVybnMgYWRkcmVzcyB0eXBlIG9mIHRoaXMgY2hhciBwb2ludCB0eXBlCi0JICogQHJldHVybiBhZGRyZXNzIHR5cGUgb2YgdGhpcyBjaGFyIHBvaW50IHR5cGUKLQkgKi8KLQlJQUlGVHlwZUFkZHJlc3MgZ2V0QWRkcmVzc1R5cGUoKTsJCi19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQ2xhc3MuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4YjBlYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGNsYXNzIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZUNsYXNzIGV4dGVuZHMgSVR5cGVBZ2dyZWdhdGUge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlRW51bS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDAwYzYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGVudW0gdHlwZSBpbiBJQUlGVHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZUeXBlRW51bSBleHRlbmRzIElUeXBlSW50ZWdyYWwgewotCS8qKgotCSAqIFJldHVybnMgYmFzZSB0eXBlIG9mIHRoZSBjdXJyZW50IHR5cGUKLQkgKiBAcmV0dXJuIGJhc2UgdHlwZSBvZiB0aGUgY3VycmVudCB0eXBlCi0JICovCi0JSUFJRlR5cGUgZ2V0QmFzZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIG5hbWUgb2YgdGhlIGN1cnJlbnQgdHlwZQotCSAqIEByZXR1cm4gbmFtZSBvZiB0aGUgY3VycmVudCB0eXBlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgdHlwZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGZpZWxkcyBvZiB0aGUgY3VycmVudCB0eXBlCi0JICovCi0JU3RyaW5nW10gZ2V0RmllbGRzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcyBvZiB0aGUgY3VycmVudCB0eXBlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcyBvZiB0aGUgY3VycmVudCB0eXBlCi0JICovCi0JU3RyaW5nW10gZ2V0VHlwZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGZpZWxkIG9mIHRoZSBjdXJyZW50IHR5cGUgYnkgZ2l2ZW4gcG9zaXRpb24KLQkgKiBAcGFyYW0gaW5kZXggcG9zaXRpb24gb2YgdGhpcyBlbnVtIHR5cGUKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGZpZWxkIG9mIHRoZSBjdXJyZW50IHR5cGUKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIG5hbWUgb2YgdmFsdWUgb2YgdGhpcyB0eXBlIGJ5IGdpdmVuIHBvc2l0aW9uCi0JICogQHBhcmFtIGluZGV4IHBvc2l0aW9uIG9mIHRoaXMgdHlwZQotCSAqIEByZXR1cm4gbmFtZSBvZiB2YWx1ZSBvZiB0aGlzIHR5cGUgYnkgZ2l2ZW4gcG9zaXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIHR5cGUKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIHR5cGUKLQkgKi8KLQlpbnQgZ2V0TnVtYmVyT2ZDaGlsZHJlbigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVGbG9hdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVGbG9hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTEyMDM0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlRmxvYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgZmxvYXQgdHlwZSBpbiB0aGlzIElBSUZUeXBlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGVGbG9hdCBleHRlbmRzIElBSUZUeXBlIHsKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGltYWdpbmFyeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgaXMgaW1hZ2luYXJ5Ci0JICovCi0JYm9vbGVhbiBpc0ltYWdpbmFyeSgpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGlzIGlzIGNvbXBsZXggdHlwZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IHR5cGUgaXMgY29tcGxleAotCSAqLwotCWJvb2xlYW4gaXNDb21wbGV4KCk7Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIGN1cnJlbnQgdHlwZSBpcyBsb25nCi0JICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnQgdHlwZSBpcyBsb25nCi0JICovCi0JYm9vbGVhbiBpc0xvbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlRnVuY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlMjhmOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGZ1bmN0aW9uIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZUZ1bmN0aW9uIGV4dGVuZHMgSVR5cGVEZXJpdmVkIHt9CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1N2QxMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLS8qKgotICogUmVwcmVzZW50cyBpbnQgdHlwZSBpbiBJQUlGVHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZUeXBlSW50IGV4dGVuZHMgSVR5cGVJbnRlZ3JhbCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVMb25nLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUxvbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyMWYxYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZUxvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbG9uZyB0eXBlIGluIElBSUZUeXBlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGVMb25nIGV4dGVuZHMgSVR5cGVJbnRlZ3JhbCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVMb25nTG9uZy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVMb25nTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzMyMTY3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlTG9uZ0xvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbG9uZyBsb25nIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZUxvbmdMb25nIGV4dGVuZHMgSVR5cGVJbnRlZ3JhbCB7fQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZU5hbWVkLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZU5hbWVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmI2MDAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVOYW1lZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLS8qKgotICogUmVwcmVzZW50cyBuYW1lZCB0eXBlIGluIElBSUZUeXBlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGVOYW1lZCBleHRlbmRzIElUeXBlRGVyaXZlZCB7Ci0JLyoqCi0JICogUmV0dXJucyBuYW1lIG9mIHRoaXMgdHlwZQotCSAqIEByZXR1cm4gbmFtZSBvZiB0aGlzIHR5cGUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVQb2ludGVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVBvaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3OWEyOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVBvaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgcG9pbnRlciB0eXBlIGluIElBSUZUeXBlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlR5cGVQb2ludGVyIGV4dGVuZHMgSVR5cGVEZXJpdmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIGFkZHJlc3MgdHlwZSBvZiB0aGlzIHR5cGUKLQkgKiBAcmV0dXJuIGFkZHJlc3MgdHlwZSBvZiB0aGlzIHR5cGUKLQkgKi8KLQlJQUlGVHlwZUFkZHJlc3MgZ2V0QWRkcmVzc1R5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlUmFuZ2UuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMzcyYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHJhbmdlIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZVJhbmdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb3dlc3QgaW5kZXggb2YgdGhpcyB0eXBlCi0JICogQHJldHVybiB0aGUgbG93ZXN0IGluZGV4IG9mIHRoaXMgdHlwZQotCSAqLwotCWludCBnZXRMb3dlcigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhpZ2hlc3QgaW5kZXggb2YgdGhpcyB0eXBlCi0JICogQHJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBvZiB0aGlzIHR5cGUKLQkgKi8KLQlpbnQgZ2V0VXBwZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gaW50ZXJuYWwgdHlwZSBvZiB0aGlzIHR5cGUgb3IgbnVsbCBpZiBubyBpbnRlcm5hbCB0eXBlCi0JICogQHJldHVybiBpbnRlcm5hbCB0eXBlIG9mIHRoaXMgdHlwZQotCSAqLwotCUlBSUZUeXBlIGdldEludGVybmFsVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVSZWZlcmVuY2UuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2M0OGQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgcmVmZXJlbmNlIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZVJlZmVyZW5jZSBleHRlbmRzIElBSUZUeXBlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlU2hvcnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlU2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExZjQ5ZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHNob3J0IHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZVNob3J0IGV4dGVuZHMgSVR5cGVJbnRlZ3JhbCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVTdHJpbmcuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzQ2NDMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgc3RyaW5nIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZVN0cmluZyBleHRlbmRzIElBSUZUeXBlIHt9CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVN0cnVjdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVTdHJ1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxODA3YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVN0cnVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLS8qKgotICogUmVwcmVzZW50cyBzdHJ1Y3QgdHlwZSBpbiBJQUlGVHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZUeXBlU3RydWN0IGV4dGVuZHMgSVR5cGVBZ2dyZWdhdGUge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlVW5pb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlVW5pb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYTk4Ni4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVHlwZVVuaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHVuaW9uIHR5cGUgaW4gSUFJRlR5cGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVHlwZVVuaW9uIGV4dGVuZHMgSVR5cGVBZ2dyZWdhdGUge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZUeXBlVm9pZC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVWb2lkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZTY5Y2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlR5cGVWb2lkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHZvaWQgdHlwZSBpbiBJQUlGVHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZUeXBlVm9pZCBleHRlbmRzIElBSUZUeXBlIHt9CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg5YWNhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLS8qKgotICogUmVwcmVzZW50cyB2YWx1ZSBvZiBBSUYgb2JqZWN0Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlIHsKLQkvKioKLQkgKiBSZXR1cm5zIElBSUZUeXBlIG9mIGN1cnJlbnQgdmFsdWUKLQkgKiBAcmV0dXJuIElBSUZUeXBlIG9mIGN1cnJlbnQgdmFsdWUKLQkgKi8KLQlJQUlGVHlwZSBnZXRUeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIG9mIGN1cnJlbnQgdmFsdWUKLQkgKiBAcmV0dXJuIG5hbWUgb2YgY3VycmVudCB2YWx1ZQotCSAqIEB0aHJvd3MgQUlGRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybnMgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIGN1cnJlbnQgdmFsdWUKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBjaGlsZHJlbiBvZiBjdXJyZW50IHZhbHVlCi0JICogQHRocm93cyBBSUZFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCWludCBnZXRDaGlsZHJlbk51bWJlcigpIHRocm93cyBBSUZFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgdmFsdWUgY29udGFpbnMgbW9yZSB0aGFuIG9uZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKLQkgKiBAdGhyb3dzIEFJRkV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JYm9vbGVhbiBoYXNDaGlsZHJlbigpIHRocm93cyBBSUZFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyBzaXplIG9mIHRoaXMgdmFsdWUKLQkgKiBAcmV0dXJuIHNpemUgb2YgdGhpcyB2YWx1ZQotCSAqLwotCWludCBzaXplb2YoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUFkZHJlc3MuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0YjZiMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFkZHJlc3MgdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlQWRkcmVzcyBleHRlbmRzIElBSUZWYWx1ZSB7Ci0JLyoqCi0JICogUmV0dXJucyBhZGRyZXNzIHZhbHVlIG9mIHRoaXMgdmFsdWUKLQkgKiBAcmV0dXJuIGFkZHJlc3MgdmFsdWUgb2YgdGhpcyB2YWx1ZQotCSAqIEB0aHJvd3MgQUlGRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEFkZHJlc3MoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQXJyYXkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUFycmF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmM1ZGIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYXJyYXkgdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlQXJyYXkgZXh0ZW5kcyBJVmFsdWVEZXJpdmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBJQUlGVmFsdWVzIG9mIHRoaXMgdmFsdWUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBJQUlGVmFsdWVzIG9mIHRoaXMgdmFsdWUKLQkgKi8KLQlJQUlGVmFsdWVbXSBnZXRWYWx1ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUJvb2wuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUJvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyM2VjNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVCb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGJvb2xlYW4gdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlQm9vbCBleHRlbmRzIElWYWx1ZUludGVncmFsIHsKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyB0cnVlIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIHRydWUKLQkgKiBAdGhyb3dzIEFJRkV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JYm9vbGVhbiBib29sZWFuVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQ2hhci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQ2hhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTZhMmY1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUNoYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgY2hhciB2YWx1ZSBvZiBJQUlGVmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVmFsdWVDaGFyIGV4dGVuZHMgSVZhbHVlSW50ZWdyYWwgewotCS8qKgotCSAqIFJldHVybnMgY2hhciBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiBjaGFyIG9mIHRoaXMgdmFsdWUKLQkgKiBAdGhyb3dzIEFJRkV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JY2hhciBjaGFyVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybnMgYnl0ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiBieXRlIG9mIHRoaXMgdmFsdWUKLQkgKiBAdGhyb3dzIEFJRkV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JYnl0ZSBieXRlVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQ2hhclBvaW50ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUNoYXJQb2ludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWY1ZWEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQ2hhclBvaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBjaGFyIHBvaW50ZXIgdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlQ2hhclBvaW50ZXIgZXh0ZW5kcyBJQUlGVmFsdWVTdHJpbmcgewotCS8qKgotCSAqIFJldHVybnMgYWRkcmVzcyB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiBhZGRyZXNzIHZhbHVlIG9mIHRoaXMgdmFsdWUKLQkgKiBAdGhyb3dzIEFJRkV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JQmlnSW50ZWdlciBwb2ludGVyVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQ2xhc3MuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMWMyNDQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgY2xhc3MgdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlQ2xhc3MgZXh0ZW5kcyBJVmFsdWVBZ2dyZWdhdGUge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUVudW0uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGVudW0gdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlRW51bSBleHRlbmRzIElWYWx1ZUludGVncmFsIHt9CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVGbG9hdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlRmxvYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkZmI4Ny4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLS8qKgotICogUmVwcmVzZW50cyBmbG9hdCB2YWx1ZSBvZiBJQUlGVmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVmFsdWVGbG9hdCBleHRlbmRzIElWYWx1ZVBhcmVudCB7Ci0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgdmFsdWUgaXMgZmxvYXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBpZiBmbG9hdAotCSAqLwotCWJvb2xlYW4gaXNGbG9hdCgpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhpcyB2YWx1ZSBpcyBkb3VibGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBkb3VibGUKLQkgKi8KLQlib29sZWFuIGlzRG91YmxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHRocm93cyBBSUZFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCWRvdWJsZSBkb3VibGVWYWx1ZSgpIHRocm93cyBBSUZFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHRocm93cyBBSUZFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCWZsb2F0IGZsb2F0VmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUZ1bmN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVGdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjA2OTEzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGZ1bmN0aW9uIHZhbHVlIG9mIElBSUZWYWx1ZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZWYWx1ZUZ1bmN0aW9uIGV4dGVuZHMgSVZhbHVlRGVyaXZlZCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlSW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4OWZlZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgaW50IHZhbHVlIG9mIElBSUZWYWx1ZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZWYWx1ZUludCBleHRlbmRzIElWYWx1ZUludGVncmFsIHsKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBsb25nCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgdmFsdWUgaWYgbG9uZwotCSAqLwotCWJvb2xlYW4gaXNMb25nKCk7Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgdmFsdWUgaXMgc2hvcnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBzaG9ydAotCSAqLwotCWJvb2xlYW4gaXNTaG9ydCgpOwotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGlzIHZhbHVlIGlzIGludAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIGludAotCSAqLwotCWJvb2xlYW4gaXNJbnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJ5dGUgYXJyYXkgb2YgdGhpcyB2YWx1ZQotCSAqIEByZXR1cm4gYnV0ZSBhcnJheSBvZiB0aGlzIHZhbHVlIAotCSAqIEB0aHJvd3MgQUlGRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlieXRlW10gYnl0ZVZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHZhbHVlIG9mIHRoaXMgdmFsdWUKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHRoaXMgdmFsdWUKLQkgKiBAdGhyb3dzIEFJRkV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0JICovCi0JbG9uZyBsb25nVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybnMgdmFsdWUgb2YgdGhpcyB2YWx1ZQotCSAqIEByZXR1cm4gdmFsdWUgb2YgdGhpcyB2YWx1ZQotCSAqIEB0aHJvd3MgQUlGRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlzaG9ydCBzaG9ydFZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdmFsdWUgb2YgdGhpcyB2YWx1ZQotCSAqIEByZXR1cm4gdmFsdWUgb2YgdGhpcyB2YWx1ZQotCSAqIEB0aHJvd3MgQUlGRXhjZXB0aW9uIG9uIGZhaWx1cmUKLQkgKi8KLQlpbnQgaW50VmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlTmFtZWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZU5hbWVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjM3ZTMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlTmFtZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbmFtZWQgdmFsdWUgaW4gSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlTmFtZWQgZXh0ZW5kcyBJVmFsdWVEZXJpdmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIElBSUZWYWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiBJQUlGVmFsdWUgb2YgdGhpcyB2YWx1ZQotCSAqLwotCUlBSUZWYWx1ZSBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIG9mIHRoaXMgdmFsdWUKLQkgKiBAcmV0dXJuIG5hbWUgb2YgdGhpcyB2YWx1ZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVQb2ludGVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVQb2ludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzkwMjMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlUG9pbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWY7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHBvaW50ZXIgdmFsdWUgaW4gSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlUG9pbnRlciBleHRlbmRzIElWYWx1ZVBhcmVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHRocm93cyBBSUZFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUJpZ0ludGVnZXIgcG9pbnRlclZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIElBSUZWYWx1ZSBvZiB0aGlzIHZhbHVlIG9yIG51bGwgaWYgbm90aGluZwotCSAqIEByZXR1cm4gSUFJRlZhbHVlIG9mIHRoaXMgdmFsdWUKLQkgKi8KLQlJQUlGVmFsdWUgZ2V0VmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZVJlZmVyZW5jZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDIxYmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHJlZmVyZW5jZSB2YWx1ZSBpbiBJQUlGVmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQUlGVmFsdWVSZWZlcmVuY2UgZXh0ZW5kcyBJVmFsdWVQYXJlbnQgewotCS8qKgotCSAqIFJldHVybnMgbmFtZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiBuYW1lIG9mIHRoaXMgdmFsdWUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlU3RyaW5nLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlNTM1Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgc3RyaW5nIHZhbHVlIGluIElBSUZWYWx1ZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZWYWx1ZVN0cmluZyBleHRlbmRzIElBSUZWYWx1ZSB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlU3RydWN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVTdHJ1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkZjllMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JQUlGVmFsdWVTdHJ1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgc3RydWN0IHZhbHVlIGluIElBSUZWYWx1ZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBSUZWYWx1ZVN0cnVjdCBleHRlbmRzIElWYWx1ZUFnZ3JlZ2F0ZSB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlVW5pb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lBSUZWYWx1ZVVuaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNDEzNGQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSUFJRlZhbHVlVW5pb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdW5pb24gdmFsdWUgaW4gSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFJRlZhbHVlVW5pb24gZXh0ZW5kcyBJVmFsdWVBZ2dyZWdhdGUge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lUeXBlQWdncmVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JVHlwZUFnZ3JlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGY1YTRiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lUeXBlQWdncmVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgdHlwZSBvZiBhZ2dyZWdhdGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVHlwZUFnZ3JlZ2F0ZSBleHRlbmRzIElBSUZUeXBlIHsKLQkvKioKLQkgKiBSZXR1cm5zIG5hbWUgb2YgdGhpcyB0eXBlCi0JICogQHJldHVybiBuYW1lIG9mIHRoaXMgdHlwZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBmaWVsZCBuYW1lcyBvZiB0aGlzIHR5cGUKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGZpZWxkIG5hbWVzIAotCSAqLwotCVN0cmluZ1tdIGdldEZpZWxkcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhpcyB0eXBlIG9yIGVtcHR5IG9mIGFycmF5IGlmIG5vdGhpbmcKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHRoaXMgdHlwZQotCSAqLwotCUlBSUZUeXBlW10gZ2V0VHlwZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGZpZWxkIG5hbWUgb2YgdGhpcyB0eXBlIGJ5IGdpdmVuIHBvc2l0aW9uCi0JICogQHBhcmFtIGluZGV4IHBvc2l0aW9uIG9mIHRoaXMgdHlwZQotCSAqIEByZXR1cm4gZmllbGQgbmFtZSBvZiB0aGlzIHR5cGUgYnkgZ2l2ZW4gcG9zaXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIElBSUZUeXBlIG9mIHRoaXMgdHlwZSBieSBnaXZlbiBwb3NpdGlvbgotCSAqIEBwYXJhbSBpbmRleCBwb3NpdGlvbiBvZiB0eXBlCi0JICogQHJldHVybiBJQUlGVHlwZSBvZiB0aGlzIHR5cGUgYnkgZ2l2ZW4gcG9zaXRpb24KLQkgKi8KLQlJQUlGVHlwZSBnZXRUeXBlKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyB0eXBlCi0JICogQHJldHVybiBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyB0eXBlCi0JICovCi0JaW50IGdldE51bWJlck9mQ2hpbGRyZW4oKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lUeXBlRGVyaXZlZC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVR5cGVEZXJpdmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDYzZjguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVR5cGVEZXJpdmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGRlcml2ZWQgdHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlRGVyaXZlZCBleHRlbmRzIElBSUZUeXBlIHsKLQkvKioKLQkgKiBSZXR1cm5zIGJhc2UgdHlwZSBvZiB0aGlzIHR5cGUKLQkgKiBAcmV0dXJuIGJhc2UgdHlwZSBvZiB0aGlzIHR5cGUKLQkgKi8KLQlJQUlGVHlwZSBnZXRCYXNlVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVR5cGVJbnRlZ3JhbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVR5cGVJbnRlZ3JhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI2NTg3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lUeXBlSW50ZWdyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi0vKioKLSAqIFJlcHJlc2VudHMgaW50ZWdyYWwgdHlwZSBvZiBJQUlGVHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlSW50ZWdyYWwgZXh0ZW5kcyBJQUlGVHlwZSB7Ci0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBzaWduZWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIGlzIHNpZ25lZAotCSAqLwotCWJvb2xlYW4gaXNTaWduZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lWYWx1ZUFnZ3JlZ2F0ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVZhbHVlQWdncmVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YTU4M2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVZhbHVlQWdncmVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFnZ3Jlc2dhdGUgdmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsdWVBZ2dyZWdhdGUgZXh0ZW5kcyBJVmFsdWVQYXJlbnQgewotCS8qKgotCSAqIFJldHVybiBJQUlGVmFsdWUgb2YgdGhpcyB2YWx1ZSBieSBnaXZlbiBwb3NpdGlvbiBvciBudWxsIGlmIG5vdGhpbmcgZm91bmQKLQkgKiBAcGFyYW0gaW5kZXggcG9zaXRpb24gb2YgdGhpcyB2YWx1ZQotCSAqIEByZXR1cm4gSUFJRlZhbHVlIG9mIHRoaXMgdmFsdWUKLQkgKi8KLQlJQUlGVmFsdWUgZ2V0VmFsdWUoaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lWYWx1ZURlcml2ZWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lWYWx1ZURlcml2ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNDVkMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL21vZGVsL2FpZi9JVmFsdWVEZXJpdmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGRlcml2ZWQgdmFsdWUgb2YgSUFJRlZhbHVlCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbHVlRGVyaXZlZCBleHRlbmRzIElWYWx1ZVBhcmVudCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVZhbHVlSW50ZWdyYWwuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lWYWx1ZUludGVncmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGNiNzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVZhbHVlSW50ZWdyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBpbnRlZ3JhbCB2YWx1ZSBvZiBJQUlGVmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsdWVJbnRlZ3JhbCBleHRlbmRzIElBSUZWYWx1ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHJldHVybiB2YWx1ZSBvZiB0aGlzIHZhbHVlCi0JICogQHRocm93cyBBSUZFeGNlcHRpb24gb24gZmFpbHVyZQotCSAqLwotCUJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvbW9kZWwvYWlmL0lWYWx1ZVBhcmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVZhbHVlUGFyZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjQ0ZTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9tb2RlbC9haWYvSVZhbHVlUGFyZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHBhcmVudCBvbiBBSUZJVmFsdWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsdWVQYXJlbnQgZXh0ZW5kcyBJQUlGVmFsdWUgewotCS8qKgotCSAqIFJldHVybnMgSVZhbHVlUGFyZW50IG9mIHRoaXMgdmFsdWUKLQkgKiBAcmV0dXJuIElWYWx1ZVBhcmVudCBvZiB0aGlzIHZhbHVlCi0JICovCi0JSVZhbHVlUGFyZW50IGdldFBhcmVudCgpOwotCQotCS8qKgotCSAqIFNldHMgSVZhbHVlUGFyZW50IHRvIHRoaXMgdmFsdWUKLQkgKiBAcGFyYW0gcGFyZW50IElWYWx1ZVBhcmVudCBnb2luZyB0byBzZXQgdG8gdGhpcyB2YWx1ZQotCSAqLwotCXZvaWQgc2V0UGFyZW50KElWYWx1ZVBhcmVudCBwYXJlbnQpOwkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdERhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3REYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI5ZjAyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdERhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCBpbXBsZW1lbnRzIElQRElEYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdCB7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhwcjsKLQkKLQlwdWJsaWMgQWJzdHJhY3REYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXhwcikgewotCQlzdXBlcih0YXNrcyk7Ci0JCXRoaXMuZXhwciA9IGV4cHI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5kYXRhRXZhbHVhdGVFeHByZXNzaW9uKHRhc2tzLCBleHByKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0I2dldEFJRihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElBSUYgZ2V0QUlGKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBSUYpIHsKLQkJCXJldHVybiAoSUFJRilvYmo7Ci0JCX0KLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsICJWYXJpYWJsZSAiKyBleHByICsiOiBObyB2YWx1ZSBmb3VuZCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJEYXRhIGV2YWx1YXRlIGV4cHJlc3Npb24gcmVxdWVzdCI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0RGF0YVJlYWRNZW1vcnlSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3REYXRhUmVhZE1lbW9yeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyMzk3Ny4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3REYXRhUmVhZE1lbW9yeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElEYXRhUmVhZE1lbW9yeUluZm87Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhUmVhZE1lbW9yeVJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCBpbXBsZW1lbnRzIElQRElEYXRhUmVhZE1lbW9yeVJlcXVlc3QgewotCXByaXZhdGUgbG9uZyBvZmZzZXQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsKLQlwcml2YXRlIGludCB3b3JkRm9ybWF0OwotCXByaXZhdGUgaW50IHdvcmRTaXplOwotCXByaXZhdGUgaW50IHJvd3M7Ci0JcHJpdmF0ZSBpbnQgY29sczsKLQlwcml2YXRlIENoYXJhY3RlciBhc0NoYXI7Ci0JCi0JcHVibGljIEFic3RyYWN0RGF0YVJlYWRNZW1vcnlSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgaW50IHdvcmRGb3JtYXQsIGludCB3b3JkU2l6ZSwgaW50IHJvd3MsIGludCBjb2xzLCBDaGFyYWN0ZXIgYXNDaGFyKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0JCXRoaXMud29yZEZvcm1hdCA9IHdvcmRGb3JtYXQ7Ci0JCXRoaXMud29yZFNpemUgPSB3b3JkU2l6ZTsKLQkJdGhpcy5yb3dzID0gcm93czsKLQkJdGhpcy5jb2xzID0gY29sczsKLQkJdGhpcy5hc0NoYXIgPSBhc0NoYXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5jcmVhdGVEYXRhUmVhZE1lbW9yeSh0YXNrcywgb2Zmc2V0LCBhZGRyZXNzLCB3b3JkRm9ybWF0LCB3b3JkU2l6ZSwgcm93cywgY29scywgYXNDaGFyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdCNnZXREYXRhUmVhZE1lbW9yeUluZm8ob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBJUERJRGF0YVJlYWRNZW1vcnlJbmZvIGdldERhdGFSZWFkTWVtb3J5SW5mbyhCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXdhaXRVbnRpbENvbXBsZXRlZChxVGFza3MpOwotCQlPYmplY3Qgb2JqID0gZ2V0UmVzdWx0KHFUYXNrcyk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUERJRGF0YVJlYWRNZW1vcnlJbmZvKSB7Ci0JCQlyZXR1cm4gKElQRElEYXRhUmVhZE1lbW9yeUluZm8pb2JqOwotCQl9Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCAiTm8gZGF0YSByZWFkIG1lbW9yeSBpbmZvIik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIkNyZWF0ZSBkYXRhIHJlYWQgbWVtb3J5IHJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdEV2ZW50UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0RXZlbnRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZWVkYjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0RXZlbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXZlbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUV2ZW50UmVxdWVzdCB7Ci0JcHJvdGVjdGVkIGludCBzdGF0dXMgPSBVTktOT1dOOwotCXByb3RlY3RlZCBCaXRMaXN0IHRhc2tzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLQkKLQlwdWJsaWMgQWJzdHJhY3RFdmVudFJlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQl0aGlzLnRhc2tzID0gdGFza3MuY29weSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2NhbmNlbCgpCi0JICovCi0JcHVibGljIHZvaWQgY2FuY2VsKCkgewotCQl0cnkgewotCQkJZG9GaW5pc2goKTsKLQkJCXRoaXMuc3RhdHVzID0gSVBESUV2ZW50UmVxdWVzdC5DQU5DRUxMRUQ7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNjb21wbGV0ZWQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbXBsZXRlZChCaXRMaXN0IGNUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQl0YXNrcy5hbmROb3QoY1Rhc2tzKTsKLQkJcmV0dXJuIHRhc2tzLmlzRW1wdHkoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNkb25lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lKCkgewotCQl0cnkgewotCQkJZG9GaW5pc2goKTsKLQkJCXRoaXMuc3RhdHVzID0gSVBESUV2ZW50UmVxdWVzdC5ET05FOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZXJyb3IoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLnN0YXR1cyA9IElQRElFdmVudFJlcXVlc3QuRVJST1I7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRyeSB7Ci0JCQlkb0ZpbmlzaCgpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJdGhpcy5tZXNzYWdlICs9ICIgLSAiICsgZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNleGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHsKLQkJdHJ5IHsKLQkJCWRvRXhlY3V0ZShkZWJ1Z2dlcik7Ci0JCQl0aGlzLnN0YXR1cyA9IElQRElFdmVudFJlcXVlc3QuUlVOTklORzsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldFJlc3BvbnNlQWN0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlc3BvbnNlQWN0aW9uKCkgewotICAgIAlyZXR1cm4gQUNUSU9OX05PTkU7Ly8gZGVmYXVsdCBhY3Rpb24KLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXRTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNldCNnZXRUYXNrcygpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNzZXRTdGF0dXMoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7Ci0JCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzID0gZ2V0TmFtZSgpICsgIiBpbiBzdGF0dXMgWyI7Ci0JCQotCQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIEVSUk9SOgotCQkJcmVzICs9ICJFUlJPUiI7Ci0JCQlicmVhazsKLQkJY2FzZSBSVU5OSU5HOgotCQkJcmVzICs9ICJSVU5OSU5HIjsKLQkJCWJyZWFrOwotCQljYXNlIERPTkU6Ci0JCQlyZXMgKz0gIkRPTkUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FOQ0VMTEVEOgotCQkJcmVzICs9ICJDQU5DRUxMRUQiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXMgKz0gIlVOS05PV04iOwotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXJldHVybiByZXMgKyAiXSBmb3IgIiArIEJpdExpc3Quc2hvd0JpdExpc3QoZ2V0VGFza3MoKSkgKyAiLiI7Ci0JfQotCQotICAgIC8qKgotCSAqIEBwYXJhbSBkZWJ1Z2dlcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvRmluaXNoKCkgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODM4YTguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGV2ZW50cyB0aGF0IHJldHVybiByZXN1bHRzCi0gKiAKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlcXVlc3QgaW1wbGVtZW50cyBJUERJSW50ZXJuYWxFdmVudFJlcXVlc3QgewotCXByaXZhdGUgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JcHJvdGVjdGVkIE1hcDxCaXRMaXN0LCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxCaXRMaXN0LCBPYmplY3Q+KCk7Ci0JcHJvdGVjdGVkIGxvbmcgREVGQVVMVF9USU1FT1VUID0gNTAwMDsKLQkKLQlwdWJsaWMgQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQlzdXBlcih0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2NvbXBsZXRlZChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29tcGxldGVkKEJpdExpc3QgY1Rhc2tzLCBPYmplY3QgcmVzdWx0KSB7Ci0JCS8vaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgSVByb3h5RGVidWdFdmVudCkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJaWYgKHRhc2tzLmludGVyc2VjdHMoY1Rhc2tzKSkgewotCQkJc3RvcmVSZXN1bHQoY1Rhc2tzLmNvcHkoKSwgcmVzdWx0KTsKLQkJCW5vdGlmeVdhaXRpbmcoKTsKLQkJCXJldHVybiBzdXBlci5jb21wbGV0ZWQoY1Rhc2tzLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZ2V0UmVzcG9uc2VBY3Rpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VBY3Rpb24oKSB7Ci0gICAgCXJldHVybiBBQ1RJT05fVEVSTUlOQVRFRDsKLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUludGVybmFsRXZlbnRSZXF1ZXN0I2dldFJlc3VsdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZXN1bHQoQml0TGlzdCAgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKGZpbmRSZXN1bHQocVRhc2tzKSkKLQkJCXJldHVybiByZXN1bHRzLmdldChxVGFza3MpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxCaXRMaXN0PiBpID0gcmVzdWx0cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUJpdExpc3Qgc1Rhc2tzID0gaS5uZXh0KCk7Ci0JCQlpZiAoc1Rhc2tzLmludGVyc2VjdHMocVRhc2tzKSkKLQkJCQlyZXR1cm4gcmVzdWx0cy5nZXQoc1Rhc2tzKTsKLQkJfQotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHFUYXNrcywgZ2V0TmFtZSgpICsgIjogTm8gcmVxdWVzdCB0YXNrIGZvdW5kIik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElJbnRlcm5hbEV2ZW50UmVxdWVzdCNnZXRSZXN1bHRNYXAob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBNYXA8Qml0TGlzdCwgT2JqZWN0PiBnZXRSZXN1bHRNYXAoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl3YWl0VW50aWxDb21wbGV0ZWQocVRhc2tzKTsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElJbnRlcm5hbEV2ZW50UmVxdWVzdCN3YWl0VW50aWxDb21wbGV0ZWQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbENvbXBsZXRlZChCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXdhaXRpbmcoKTsKLQkJaWYgKHN0YXR1cyA9PSBFUlJPUikKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCBnZXRFcnJvck1lc3NhZ2UoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElJbnRlcm5hbEV2ZW50UmVxdWVzdCN3YWl0VW50aWxDb21wbGV0ZWQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxDb21wbGV0ZWQoQml0TGlzdCBxVGFza3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXdoaWxlICghdGFza3MuaXNFbXB0eSgpICYmIChzdGF0dXMgPT0gVU5LTk9XTiB8fCBzdGF0dXMgPT0gUlVOTklORykpIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWVycm9yKCJUaGlzIHJlcXVlc3QgaXMgaW50ZXJydXB0ZWQuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlsb2NrUmVxdWVzdCg1MDApOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJaWYgKHN0YXR1cyA9PSBFUlJPUikKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCBnZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCWlmIChzdGF0dXMgPT0gRE9ORSkKLQkJCW1vbml0b3IuZG9uZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5V2FpdGluZygpIHsKLQkJcmVsZWFzZVJlcXVlc3QoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9GaW5pc2goKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRmluaXNoKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCW5vdGlmeVdhaXRpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaW5kUmVzdWx0KEJpdExpc3QgcVRhc2tzKSB7Ci0JCXJldHVybiByZXN1bHRzLmNvbnRhaW5zS2V5KHFUYXNrcyk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9ja1JlcXVlc3QobG9uZyB0aW1lb3V0KSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJdHJ5IHsKLQkJCQlsb2NrLndhaXQodGltZW91dCk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHt9IAotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VSZXF1ZXN0KCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWxvY2subm90aWZ5QWxsKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJUYXNrcwotCSAqIEBwYXJhbSByZXN1bHQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gclRhc2tzCi0JICogQHBhcmFtIHJlc3VsdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVW5rbm93blJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQlyZXN1bHRzLnB1dChyVGFza3MsIHJlc3VsdCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdhaXRpbmcoKSB7Ci0JCXdoaWxlICghdGFza3MuaXNFbXB0eSgpICYmIChzdGF0dXMgPT0gVU5LTk9XTiB8fCBzdGF0dXMgPT0gUlVOTklORykpIHsKLQkJCWxvY2tSZXF1ZXN0KERFRkFVTFRfVElNRU9VVCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RHZXRBSUZSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RHZXRBSUZSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTBhZTMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0R2V0QUlGUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLS8qKgotICogQGF1dGhvciBncmVnCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHZXRBSUZSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3QgaW1wbGVtZW50cyBJUERJR2V0QUlGUmVxdWVzdCB7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhwcjsKLQkKLQlwdWJsaWMgQWJzdHJhY3RHZXRBSUZSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5leHByID0gZXhwcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnJldHJpZXZlQUlGKHRhc2tzLCBleHByKTsKLQl9Ci0JCi0JcHVibGljIElBSUYgZ2V0QUlGKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBSUYpIHsKLQkJCXJldHVybiAoSUFJRilvYmo7Ci0JCX0KLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsICJWYXJpYWJsZSAiKyBleHByICsiOiBObyB2YWx1ZSBmb3VuZCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJHZXQgYWlmIHJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdEdldEluZm9UaHJlYWRzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0R2V0SW5mb1RocmVhZHNSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODYwNzMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0R2V0SW5mb1RocmVhZHNSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHZXRJbmZvVGhyZWFkc1JlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCBpbXBsZW1lbnRzIElQRElHZXRJbmZvVGhyZWFkc1JlcXVlc3QgewotCXB1YmxpYyBBYnN0cmFjdEdldEluZm9UaHJlYWRzUmVxdWVzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLmxpc3RJbmZvVGhyZWFkcyh0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIkdldCBpbmZvIHRocmVhZCByZXF1ZXN0IjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdCNnZXRUaHJlYWRJZHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRUaHJlYWRJZHMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl3YWl0VW50aWxDb21wbGV0ZWQocVRhc2tzKTsKLQkJT2JqZWN0IG9iaiA9IGdldFJlc3VsdChxVGFza3MpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLQkJCXJldHVybiAoU3RyaW5nW10pb2JqOwotCQl9Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCAiTm8gdGhyZWFkIGlkcyBmb3VuZCIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdEdldFBhcnRpYWxBSUZSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RHZXRQYXJ0aWFsQUlGUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QwMDM3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdEdldFBhcnRpYWxBSUZSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R2V0UGFydGlhbEFJRlJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCBpbXBsZW1lbnRzIElQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdCB7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhwcjsKLQlwcml2YXRlIFN0cmluZyB2YXJpZDsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdENoaWxkcmVuID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGV4cHJlc3MgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQWJzdHJhY3RHZXRQYXJ0aWFsQUlGUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXhwciwgU3RyaW5nIHZhcmlkKSB7Ci0JCXRoaXModGFza3MsIGV4cHIsIHZhcmlkLCBmYWxzZSwgKHZhcmlkICE9IG51bGwpKTsKLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0R2V0UGFydGlhbEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIsIFN0cmluZyB2YXJpZCwgYm9vbGVhbiBsaXN0Q2hpbGRyZW4pIHsKLQkJdGhpcyh0YXNrcywgZXhwciwgdmFyaWQsIGxpc3RDaGlsZHJlbiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RHZXRQYXJ0aWFsQUlGUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXhwciwgU3RyaW5nIHZhcmlkLCBib29sZWFuIGxpc3RDaGlsZHJlbiwgYm9vbGVhbiBleHByZXNzKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5leHByID0gZXhwcjsKLQkJdGhpcy52YXJpZCA9IHZhcmlkOwotCQl0aGlzLmxpc3RDaGlsZHJlbiA9IGxpc3RDaGlsZHJlbjsKLQkJdGhpcy5leHByZXNzID0gZXhwcmVzczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnJldHJpZXZlUGFydGlhbEFJRih0YXNrcywgZXhwciwgdmFyaWQsIGxpc3RDaGlsZHJlbiwgZXhwcmVzcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIkdldCBwYXJ0aWFsIGFpZiByZXF1ZXN0IjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldFBhcnRpYWxBSUZSZXF1ZXN0I2dldFBhcnRpYWxBSUYob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBJQUlGIGdldFBhcnRpYWxBSUYoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl3YWl0VW50aWxDb21wbGV0ZWQocVRhc2tzKTsKLQkJT2JqZWN0IG9iaiA9IGdldFJlc3VsdChxVGFza3MpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIHJldHVyblZhbHVlcyA9IChPYmplY3RbXSlvYmo7Ci0JCQlyZXR1cm4gKElBSUYpcmV0dXJuVmFsdWVzWzFdOwotCQl9Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCAiVmFyaWFibGUgIiArIGV4cHIgKyAiOiBObyBhaWYgZm91bmQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldFBhcnRpYWxBSUZSZXF1ZXN0I2dldFZhcklkKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcklkKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQlPYmplY3RbXSByZXR1cm5WYWx1ZXMgPSAoT2JqZWN0W10pb2JqOwotCQkJcmV0dXJuIChTdHJpbmcpcmV0dXJuVmFsdWVzWzBdOwotCQl9Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCAiVmFyaWFibGUgSUQgIiArIHZhcmlkICsgIjogTm8gdmFyaWFibGUgSUQgZm91bmQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkgKyAiIGZvciB0YXNrcyAiICsgQml0TGlzdC5zaG93Qml0TGlzdChnZXRUYXNrcygpKSArICIsIGV4cDogIiArIGV4cHIgKyAiLCB2YXIgaWQ6ICIgKyB2YXJpZCArICIsIGlzIGxpc3QgY2hpbGRyZW46ICIgKyBsaXN0Q2hpbGRyZW4gKyAiLCBpcyBleHByZXNzOiAiICsgZXhwcmVzczsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0R2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RHZXRTdGFja0luZm9EZXB0aFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyNTZmNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RHZXRTdGFja0luZm9EZXB0aFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdCB7Ci0JcHVibGljIEFic3RyYWN0R2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0KEJpdExpc3QgdGFza3MpIHsKLQkJc3VwZXIodGFza3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIucmV0cmlldmVTdGFja0luZm9EZXB0aCh0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElHZXRTdGFja0luZm9EZXB0aFJlcXVlc3QjZ2V0RGVwdGgob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVwdGgoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl3YWl0VW50aWxDb21wbGV0ZWQocVRhc2tzKTsKLQkJT2JqZWN0IG9iaiA9IGdldFJlc3VsdChxVGFza3MpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJcmV0dXJuICgoSW50ZWdlcilvYmopLmludFZhbHVlKCk7Ci0JCX0KLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsICJObyBzdGFjayBpbmZvIGRlcHRoIGZvdW5kIik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlJldHJpZXZlIHN0YWNrIGluZm8gZGVwdGggcmVxdWVzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0TGlzdEFyZ3VtZW50c1JlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdExpc3RBcmd1bWVudHNSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDcwYzQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0TGlzdEFyZ3VtZW50c1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0QXJndW1lbnRzUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUxpc3RBcmd1bWVudHNSZXF1ZXN0IHsKLQlwcml2YXRlIGludCBsb3cgPSAwOwotCXByaXZhdGUgaW50IGhpZ2ggPSAwOwotCQotCXB1YmxpYyBBYnN0cmFjdExpc3RBcmd1bWVudHNSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGludCBsb3csIGludCBoaWdoKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5sb3cgPSBsb3c7Ci0JCXRoaXMuaGlnaCA9IGhpZ2g7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5saXN0QXJndW1lbnRzKHRhc2tzLCBsb3csIGhpZ2gpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJTGlzdEFyZ3VtZW50c1JlcXVlc3QjZ2V0QXJndW1lbnRzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKW9iajsKLQkJfQotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHFUYXNrcywgIk5vIGFyZ3VtZW50cyBmb3VuZCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJMaXN0IGFyZ3VtZW50cyByZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2MxYTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0TGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3QgewotCXB1YmxpYyBBYnN0cmFjdExpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQlzdXBlcih0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5saXN0TG9jYWxWYXJpYWJsZXModGFza3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJTGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdCNnZXRMb2NhbFZhcmlhYmxlcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldExvY2FsVmFyaWFibGVzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKW9iajsKLQkJfQotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHFUYXNrcywgIk5vIGxvY2FsIHZhcmlhYmxlcyBmb3VuZCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJMaXN0IGxvY2FsIHZhcmlhYmxlcyByZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RMaXN0U2lnbmFsc1JlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdExpc3RTaWduYWxzUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcxZDIxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdExpc3RTaWduYWxzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RTaWduYWxzUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUxpc3RTaWduYWxzUmVxdWVzdCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwdWJsaWMgQWJzdHJhY3RMaXN0U2lnbmFsc1JlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodGFza3MpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIubGlzdFNpZ25hbHModGFza3MsIG5hbWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJMaXN0IHNpZ25hbHMgcmVxdWVzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0TGlzdFN0YWNrRnJhbWVzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0TGlzdFN0YWNrRnJhbWVzUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTllY2EyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdExpc3RTdGFja0ZyYW1lc1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3QgaW1wbGVtZW50cyBJUERJTGlzdFN0YWNrRnJhbWVzUmVxdWVzdCB7Ci0JcHJpdmF0ZSBpbnQgbG93ID0gMDsKLQlwcml2YXRlIGludCBoaWdoID0gMDsKLQkKLQlwdWJsaWMgQWJzdHJhY3RMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGludCBsb3csIGludCBoaWdoKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5sb3cgPSBsb3c7Ci0JCXRoaXMuaGlnaCA9IGhpZ2g7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5saXN0U3RhY2tGcmFtZXModGFza3MsIGxvdywgaGlnaCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIkxpc3Qgc3RhY2sgZnJhbWVzIHJlcXVlc3QiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RSZXF1ZXN0RmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0Fic3RyYWN0UmVxdWVzdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhZmEzMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RSZXF1ZXN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQWRkcmVzc0JyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkNvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkRhdGFXcml0ZU1lbW9yeVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuRGVsZXRlQnJlYWtwb2ludFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuRGVsZXRlVmFyaWFibGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkRpc2FibGVCcmVha3BvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5FbmFibGVCcmVha3BvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5SZXN1bWVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LlNldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5TZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LlNldExpbmVCcmVha3BvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5TZXRXYXRjaHBvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5TdGFydERlYnVnZ2VyUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5TdGVwRmluaXNoUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5TdGVwSW50b1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuU3RlcE92ZXJSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LlN0b3BEZWJ1Z2dlclJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuU3VzcGVuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuVGVybWluYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLS8qKgotICogQGF1dGhvciBncmVnCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1ZXN0RmFjdG9yeSBpbXBsZW1lbnRzIElQRElSZXF1ZXN0RmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5I2dldENvbW1hbmRSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBESUNvbW1hbmRSZXF1ZXN0IGdldENvbW1hbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZFJlcXVlc3QodGFza3MsIGNvbW1hbmQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXREYXRhV3JpdGVNZW1vcnlSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgbG9uZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElEYXRhV3JpdGVNZW1vcnlSZXF1ZXN0IGdldERhdGFXcml0ZU1lbW9yeVJlcXVlc3QoQml0TGlzdCB0YXNrcywKLQkJCWxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgaW50IHdvcmRGb3JtYXQsIGludCB3b3JkU2l6ZSwKLQkJCVN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IERhdGFXcml0ZU1lbW9yeVJlcXVlc3QodGFza3MsIG9mZnNldCwgYWRkcmVzcywgd29yZEZvcm1hdCwgd29yZFNpemUsIHZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0RGVsZXRlQnJlYWtwb2ludFJlcXVlc3Qob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElEZWxldGVCcmVha3BvaW50UmVxdWVzdCBnZXREZWxldGVCcmVha3BvaW50UmVxdWVzdCgKLQkJCUJpdExpc3QgdGFza3MsIElQRElCcmVha3BvaW50IGJwdCwgYm9vbGVhbiBhbGxvd1VwZGF0ZSkgewotCQlyZXR1cm4gbmV3IERlbGV0ZUJyZWFrcG9pbnRSZXF1ZXN0KHRhc2tzLCBicHQsIGFsbG93VXBkYXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0RGVsZXRlVmFyaWFibGVSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBESURlbGV0ZVZhcmlhYmxlUmVxdWVzdCBnZXREZWxldGVWYXJpYWJsZVJlcXVlc3QoQml0TGlzdCB0YXNrcywKLQkJCVN0cmluZyB2YXJpZCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZVZhcmlhYmxlUmVxdWVzdCh0YXNrcywgdmFyaWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0RGlzYWJsZUJyZWFrcG9pbnRSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyBJUERJRGlzYWJsZUJyZWFrcG9pbnRSZXF1ZXN0IGdldERpc2FibGVCcmVha3BvaW50UmVxdWVzdCgKLQkJCUJpdExpc3QgdGFza3MsIElQRElCcmVha3BvaW50IGJwdCkgewotCQlyZXR1cm4gbmV3IERpc2FibGVCcmVha3BvaW50UmVxdWVzdCh0YXNrcywgYnB0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5I2dldEVuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyBJUERJRW5hYmxlQnJlYWtwb2ludFJlcXVlc3QgZ2V0RW5hYmxlQnJlYWtwb2ludFJlcXVlc3QoCi0JCQlCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQpIHsKLQkJcmV0dXJuIG5ldyBFbmFibGVCcmVha3BvaW50UmVxdWVzdCh0YXNrcywgYnB0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0UmVzdW1lUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElHb1JlcXVlc3QgZ2V0UmVzdW1lUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBib29sZWFuIHBhc3NTaWduYWwpIHsKLQkJcmV0dXJuIG5ldyBSZXN1bWVSZXF1ZXN0KHRhc2tzLCBwYXNzU2lnbmFsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBZGRyZXNzQnJlYWtwb2ludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVBESVNldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdCBnZXRTZXRBZGRyZXNzQnJlYWtwb2ludFJlcXVlc3QoCi0JCQlCaXRMaXN0IHRhc2tzLCBJUERJQWRkcmVzc0JyZWFrcG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKSB7Ci0JCXJldHVybiBuZXcgU2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0KHRhc2tzLCBicHQsIGFsbG93VXBkYXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJUERJU2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdCBnZXRTZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0KAotCQkJQml0TGlzdCB0YXNrcywgSVBESUZ1bmN0aW9uQnJlYWtwb2ludCBicHQsIGJvb2xlYW4gYWxsb3dVcGRhdGUpIHsKLQkJcmV0dXJuIG5ldyBTZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0KHRhc2tzLCBicHQsIGFsbG93VXBkYXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMaW5lQnJlYWtwb2ludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVBESVNldExpbmVCcmVha3BvaW50UmVxdWVzdCBnZXRTZXRMaW5lQnJlYWtwb2ludFJlcXVlc3QoCi0JCQlCaXRMaXN0IHRhc2tzLCBJUERJTGluZUJyZWFrcG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKSB7Ci0JCXJldHVybiBuZXcgU2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0KHRhc2tzLCBicHQsIGFsbG93VXBkYXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U2V0V2F0Y2hwb2ludFJlcXVlc3Qob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVdhdGNocG9pbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElTZXRXYXRjaHBvaW50UmVxdWVzdCBnZXRTZXRXYXRjaHBvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLAotCQkJSVBESVdhdGNocG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKSB7Ci0JCXJldHVybiBuZXcgU2V0V2F0Y2hwb2ludFJlcXVlc3QodGFza3MsIGJwdCwgYWxsb3dVcGRhdGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRTdGFydERlYnVnZ2VyUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVBESVN0YXJ0RGVidWdnZXJSZXF1ZXN0IGdldFN0YXJ0RGVidWdnZXJSZXF1ZXN0KEJpdExpc3QgdGFza3MsCi0JCQlTdHJpbmcgYXBwLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gbmV3IFN0YXJ0RGVidWdnZXJSZXF1ZXN0KHRhc2tzLCBhcHAsIHBhdGgsIGRpciwgYXJncyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5I2dldFN0ZXBGaW5pc2hSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJU3RlcEZpbmlzaFJlcXVlc3QgZ2V0U3RlcEZpbmlzaFJlcXVlc3QoQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB7Ci0JCXJldHVybiBuZXcgU3RlcEZpbmlzaFJlcXVlc3QodGFza3MsIGNvdW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U3RlcEludG9SZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJU3RlcEludG9SZXF1ZXN0IGdldFN0ZXBJbnRvUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIG5ldyBTdGVwSW50b1JlcXVlc3QodGFza3MsIGNvdW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U3RlcE92ZXJSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJU3RlcE92ZXJSZXF1ZXN0IGdldFN0ZXBPdmVyUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIG5ldyBTdGVwT3ZlclJlcXVlc3QodGFza3MsIGNvdW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U3RvcERlYnVnZ2VyUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElTdG9wRGVidWdnZXJSZXF1ZXN0IGdldFN0b3BEZWJ1Z2dlclJlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gbmV3IFN0b3BEZWJ1Z2dlclJlcXVlc3QodGFza3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRTdXNwZW5kUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElIYWx0UmVxdWVzdCBnZXRTdXNwZW5kUmVxdWVzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiBuZXcgU3VzcGVuZFJlcXVlc3QodGFza3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRTdXNwZW5kUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElIYWx0UmVxdWVzdCBnZXRTdXNwZW5kUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBib29sZWFuIHNlbmRFdmVudCkgewotCQlyZXR1cm4gbmV3IFN1c3BlbmRSZXF1ZXN0KHRhc2tzLCBzZW5kRXZlbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRUZXJtaW5hdGVSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESVRlcm1pbmF0ZVJlcXVlc3QgZ2V0VGVybWluYXRlUmVxdWVzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiBuZXcgVGVybWluYXRlUmVxdWVzdCh0YXNrcyk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RTZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJlNzA5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdCB7Ci0JcHJpdmF0ZSBpbnQgbGV2ZWwgPSAwOwotCQotCXB1YmxpYyBBYnN0cmFjdFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgbGV2ZWwpIHsKLQkJc3VwZXIodGFza3MpOwotCQl0aGlzLmxldmVsID0gbGV2ZWw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5zZXRDdXJyZW50U3RhY2tGcmFtZSh0YXNrcywgbGV2ZWwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJTZXQgY3VycmVudCBzdGFjayBmcmFtZSByZXF1ZXN0IjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkgKyAiIHNldCBsZXZlbCB0byAiICsgbGV2ZWw7IAotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdFNldFRocmVhZFNlbGVjdFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9BYnN0cmFjdFNldFRocmVhZFNlbGVjdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNTNhMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvQWJzdHJhY3RTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2V0VGhyZWFkU2VsZWN0UmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESVNldFRocmVhZFNlbGVjdFJlcXVlc3QgewotCXByaXZhdGUgaW50IGlkID0gMDsKLQkKLQlwdWJsaWMgQWJzdHJhY3RTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGludCBpZCkgewotCQlzdXBlcih0YXNrcyk7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnNlbGVjdFRocmVhZCh0YXNrcywgaWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU2V0VGhyZWFkU2VsZWN0UmVxdWVzdCNnZXRUaHJlYWRJZChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIGludCBnZXRUaHJlYWRJZChCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXdhaXRVbnRpbENvbXBsZXRlZChxVGFza3MpOwotCQlPYmplY3Qgb2JqID0gZ2V0UmVzdWx0KHFUYXNrcyk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RbXSkgewotCQkJT2JqZWN0W10gcmV0dXJuVmFsdWVzID0gKE9iamVjdFtdKW9iajsKLQkJCXJldHVybiAoKEludGVnZXIpcmV0dXJuVmFsdWVzWzBdKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCAiTm8gVGhyZWFkIElEIGZvdW5kIik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlNldCB0aHJlYWQgc2VsZWN0IHJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJQnJlYWtwb2ludFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJQnJlYWtwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViYmU4Ny4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGEgYnJlYWtwb2ludAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElCcmVha3BvaW50UmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCS8qKgotCSAqIFJldHVybnMgcGRpIGJyZWFrcG9pbnQKLQkgKiBAcmV0dXJuIHBkaSBicmVha3BvaW50Ci0JICovCi0JSVBESUJyZWFrcG9pbnQgZ2V0QnJlYWtwb2ludCgpOwotCQotCS8qKgotCSAqIFdoZXRoZXIgc2VuZCBQREkgZXZlbnQgb3Igbm90Ci0JICogQHJldHVybiBmYWxzZSBpZiBkb24ndCBldmVudCBwZGkgZXZlbnQKLQkgKi8KLQlib29sZWFuIGlzQWxsb3dVcGRhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJQ29tbWFuZFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJQ29tbWFuZFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4N2VkMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUNvbW1hbmRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IHNwZWNpYWwgY29tbWFuZAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElDb21tYW5kUmVxdWVzdCBleHRlbmRzIElQRElJbnRlcm5hbEV2ZW50UmVxdWVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJQ29uZGl0aW9uQnJlYWtwb2ludFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJQ29uZGl0aW9uQnJlYWtwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyYmEyNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUNvbmRpdGlvbkJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGEgY29uZGl0aW9uIGJyZWFrcG9pbnQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJQ29uZGl0aW9uQnJlYWtwb2ludFJlcXVlc3QgZXh0ZW5kcyBJUERJQnJlYWtwb2ludFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUNvbm5lY3Rpb25SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUNvbm5lY3Rpb25SZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMTY1YzUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElDb25uZWN0aW9uUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBhIGNvbm5lY3Rpb24gdG8gZGVidWdnZXIKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJQ29ubmVjdGlvblJlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTlmZmU0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgYSBkYXRhIGV2YWx1YXRlIGV4cHJlc3Npb24KLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QgZXh0ZW5kcyBJUERJSW50ZXJuYWxFdmVudFJlcXVlc3QgewotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUFJRiBnZXRBSUYoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEYXRhUmVhZE1lbW9yeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiY2EyMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElEYXRhUmVhZE1lbW9yeUluZm87Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGEgZGF0YSByZWFkIG1lbW9yeQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElEYXRhUmVhZE1lbW9yeVJlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElEYXRhUmVhZE1lbW9yeUluZm8gZ2V0RGF0YVJlYWRNZW1vcnlJbmZvKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEYXRhV3JpdGVNZW1vcnlSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESURhdGFXcml0ZU1lbW9yeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MWU4MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESURhdGFXcml0ZU1lbW9yeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgYSBkYXRhIHdyaXRlIG1lbW9yeQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElEYXRhV3JpdGVNZW1vcnlSZXF1ZXN0IGV4dGVuZHMgSVBESUludGVybmFsRXZlbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEZWxldGVCcmVha3BvaW50UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEZWxldGVCcmVha3BvaW50UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDczMDViLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRGVsZXRlQnJlYWtwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgZGVsZXRpbmcgYSBicmVha3BvaW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESURlbGV0ZUJyZWFrcG9pbnRSZXF1ZXN0IGV4dGVuZHMgSVBESUJyZWFrcG9pbnRSZXF1ZXN0IHsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESURlbGV0ZVZhcmlhYmxlUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTMyMDc0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGRlbGV0aW5nIGEgdmFyaWFibGUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0IGV4dGVuZHMgSVBESUludGVybmFsRXZlbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEaXNhYmxlQnJlYWtwb2ludFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRGlzYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDA1Y2UuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElEaXNhYmxlQnJlYWtwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgZGlzYWJsaW5nIGEgYnJlYWtwb2ludAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElEaXNhYmxlQnJlYWtwb2ludFJlcXVlc3QgZXh0ZW5kcyBJUERJQnJlYWtwb2ludFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUVuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUVuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWJkMGMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElFbmFibGVCcmVha3BvaW50UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBlbmFibGluZyBhIGJyZWFrcG9pbnQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJRW5hYmxlQnJlYWtwb2ludFJlcXVlc3QgZXh0ZW5kcyBJUERJQnJlYWtwb2ludFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDkzMGJlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBldmFsdXRpbmcgZXhwcmVzc2lvbgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0IGV4dGVuZHMgSVBESUV2ZW50UmVxdWVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRXZlbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUV2ZW50UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc4MjcyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJRXZlbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlcXVlc3QgZm9yIG5vdGlmaWNhdGlvbiBvZiBhbiBldmVudC4gIAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElFdmVudFJlcXVlc3QgZXh0ZW5kcyBJUERJU2V0IHsKLQkvL3N0YXR1cwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SID0gMHgxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJVTk5JTkcgPSAweDI7IAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPTkUgPSAweDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0FOQ0VMTEVEID0gMHg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOS05PV04gPSAweDU7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUNUSU9OX05PTkUgPSAweDE7CQkJLy9ieSBkZWZhdWx0LCBub3RoaW5nCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUNUSU9OX1RFUk1JTkFURUQgPSAweDI7CS8vdGVybWluYXRlIGFsbCByZW1haW5pbmcgdGFza3MKLQkKLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMgcmVxdWVzdAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQl2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIHJlcXVlc3QKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIHJlcXVlc3QKLQkgKi8KLQlpbnQgZ2V0U3RhdHVzKCk7Ci0JCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoaXMgcmVxdWVzdCBpcyBjb21wbGV0ZS4gQ2xpZW50cyBtdXN0IGNhbGwgdGhpcyBtZXRob2QKLSAgICAgKiB3aGV0aGVyIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLCBmYWlscywgb3IgaXMgY2FuY2VsbGVkIHRvIGluZGljYXRlIHRoYXQKLSAgICAgKiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiBPbmx5IGNsaWVudHMgZnVsZmlsbGluZyBhIHJlcXVlc3Qgc2hvdWxkIGNhbGwgdGhpcwotICAgICAqIG1ldGhvZC4gQ2xpZW50cyBtYWtpbmcgYSByZXF1ZXN0IGFyZSBub3QgaW50ZW5kZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLSAgICB2b2lkIGRvbmUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoaXMgcmVxdWVzdC4gQSByZXF1ZXN0IG1heSBiZSBjYW5jZWxsZWQgYnkgdGhlIG9yaWdpbmF0b3Igb2YgcmVxdWVzdAotICAgICAqIG9yIGEgY2xpZW50IGZ1bGZpbGxpbmcgYSByZXF1ZXN0LiBPcHRpb25hbGx5IGEgY2FuY2VsbGVkIHN0YXR1cyBtYXkgYmUgc2V0IG9uCi0gICAgICogdGhpcyByZXF1ZXN0IHdpdGggbW9yZSBkZXRhaWxzLiBBIGNsaWVudCBmdWxmaWxsaW5nIGEgcmVxdWVzdCBtdXN0IHN0aWxsIGNhbGwKLSAgICAgKiA8Y29kZT5kb25lKCk8L2NvZGU+IHRvIGluZGljYXRlIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlLgotICAgICAqLwotICAgIHZvaWQgY2FuY2VsKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoaXMgcmVxdWVzdCBpcyBleGVjdXRpbmcuIAotICAgICAqIEBwYXJhbSBkZWJ1Z2dlcgotICAgICAqLwotICAgIHZvaWQgZXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGlzIHJlcXVlc3QgaGFzIGFuIGVycm9yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG5hbWUgb2YgdGhpcyByZXF1ZXN0IAotICAgICAqIEByZXR1cm4gbmFtZSBvZiB0aGlzIHJlcXVlc3QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgZXJyb3IgbWVzc2FnZSBvZiB0aGlzIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIGVycm9yIG1lc3NhZ2Ugb2YgdGhpcyByZXF1ZXN0Ci0gICAgICovCi0gICAgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0YXNrcyBhcmUgY29tcGxldGVkIGFuZCBzZXQgcmVzdWx0Ci0gICAgICogQHBhcmFtIHFUYXNrcwotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhc2tzIGFyZSBjb21wbGV0ZWQKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbXBsZXRlZChCaXRMaXN0IHFUYXNrcywgT2JqZWN0IHJlc3VsdCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhY3Rpb24gdHlwZSBmb3IgYWN0aW9uIGFmdGVyIGNvbXBsZXRpbmcgdGhpcyByZXF1ZXN0Ci0gICAgICogQHJldHVybiBhY3Rpb24gdHlwZQotICAgICAqLwotICAgIGludCBnZXRSZXNwb25zZUFjdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRBSUZSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdldEFJRlJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxYjVlOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdldEFJRlJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgYW4gQUlGCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUdldEFJRlJlcXVlc3QgZXh0ZW5kcyBJUERJSW50ZXJuYWxFdmVudFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRJbmZvVGhyZWFkc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5NmVkZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGdldHRpbmcgaW5mbyB0aHJlYWRzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VGhyZWFkSWRzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYyODc3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJR2V0UGFydGlhbEFJRlJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgYSBwYXJ0aWFsIEFJRgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdCBleHRlbmRzIElQRElJbnRlcm5hbEV2ZW50UmVxdWVzdCB7Ci0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQUlGIGdldFBhcnRpYWxBSUYoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFySWQoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRTdGFja0luZm9EZXB0aFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0ZjIyZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGdldHRpbmcgc3RhY2sgaW5mbyBkZXB0aAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElHZXRTdGFja0luZm9EZXB0aFJlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXREZXB0aChCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJR2V0VmFyaWFibGVUeXBlUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRWYXJpYWJsZVR5cGVSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjhjN2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElHZXRWYXJpYWJsZVR5cGVSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGdldHRpbmcgdmFyaWFibGUgdHlwZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElHZXRWYXJpYWJsZVR5cGVSZXF1ZXN0IGV4dGVuZHMgSVBESUV2ZW50UmVxdWVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJR29SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUdvUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY0Y2JmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJR29SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGdvaW5nCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUdvUmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUhhbHRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUhhbHRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGE3NjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElIYWx0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBoYWx0aW5nCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUhhbHRSZXF1ZXN0IGV4dGVuZHMgSVBESUV2ZW50UmVxdWVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJSW50ZXJuYWxFdmVudFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJSW50ZXJuYWxFdmVudFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5MWRjOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUludGVybmFsRXZlbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElJbnRlcm5hbEV2ZW50UmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VsdChCaXRMaXN0ICBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBNYXA8Qml0TGlzdCwgT2JqZWN0PiBnZXRSZXN1bHRNYXAoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsQ29tcGxldGVkKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsQ29tcGxldGVkKEJpdExpc3QgcVRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQRElFeGNlcHRpb247Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJTGlzdEFyZ3VtZW50c1JlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJTGlzdEFyZ3VtZW50c1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzMzAwZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RBcmd1bWVudHNSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgYSBsaXN0IG9mIGFyZ3VtZW50cwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElMaXN0QXJndW1lbnRzUmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElMaXN0R2xvYmFsVmFyaWFibGVzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElMaXN0R2xvYmFsVmFyaWFibGVzUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE0YmQ3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJTGlzdEdsb2JhbFZhcmlhYmxlc1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgYSBsaXN0IG9mIGdsb2JhbCB2YXJpYWJsZXMKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJTGlzdEdsb2JhbFZhcmlhYmxlc1JlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5YzczNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBhIGxpc3Qgb2YgbG9jYWwgdmFyaWFibGVzCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRMb2NhbFZhcmlhYmxlcyhCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RTaWduYWxzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElMaXN0U2lnbmFsc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwZjZiMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RTaWduYWxzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWxEZXNjcmlwdG9yOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBhIGxpc3Qgb2Ygc2lnbmFscwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElMaXN0U2lnbmFsc1JlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQlwdWJsaWMgSVBESVNpZ25hbERlc2NyaXB0b3JbXSBnZXRTaWduYWxzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMGY4Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZURlc2NyaXB0b3I7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IGEgbGlzdCBvZiBzdGFja2ZyYW1lcwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0IGV4dGVuZHMgSVBESUludGVybmFsRXZlbnRSZXF1ZXN0IHsKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lRGVzY3JpcHRvcltdIGdldFN0YWNrRnJhbWVzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElSZXF1ZXN0RmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElSZXF1ZXN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAwZmViLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJUmVxdWVzdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQWRkcmVzc0JyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJUmVxdWVzdEZhY3RvcnkgewotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBleHByCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJR2V0QUlGUmVxdWVzdCBnZXRBSUZSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUNvbW1hbmRSZXF1ZXN0IGdldENvbW1hbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBjb21tYW5kKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gZXhwcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0IGdldERhdGFFdmFsdWF0ZUV4cHJlc2lvblJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBleHByCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QgZ2V0RGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBhZGRyZXNzCi0JICogQHBhcmFtIHdvcmRGb3JtYXQKLQkgKiBAcGFyYW0gd29yZFNpemUKLQkgKiBAcGFyYW0gcm93cwotCSAqIEBwYXJhbSBjb2xzCi0JICogQHBhcmFtIGFzQ2hhcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdCBnZXREYXRhUmVhZE1lbW9yeVJlcXVlc3QoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCBpbnQgd29yZEZvcm1hdCwgaW50IHdvcmRTaXplLCBpbnQgcm93cywgaW50IGNvbHMsIENoYXJhY3RlciBhc0NoYXIpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSB3b3JkRm9ybWF0Ci0JICogQHBhcmFtIHdvcmRTaXplCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRGF0YVdyaXRlTWVtb3J5UmVxdWVzdCBnZXREYXRhV3JpdGVNZW1vcnlSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgaW50IHdvcmRGb3JtYXQsIGludCB3b3JkU2l6ZSwgU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gYnB0Ci0JICogQHBhcmFtIGFsbG93VXBkYXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRGVsZXRlQnJlYWtwb2ludFJlcXVlc3QgZ2V0RGVsZXRlQnJlYWtwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gdmFyaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElEZWxldGVWYXJpYWJsZVJlcXVlc3QgZ2V0RGVsZXRlVmFyaWFibGVSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyB2YXJpZCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJwdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESURpc2FibGVCcmVha3BvaW50UmVxdWVzdCBnZXREaXNhYmxlQnJlYWtwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnB0KTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gYnB0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRW5hYmxlQnJlYWtwb2ludFJlcXVlc3QgZ2V0RW5hYmxlQnJlYWtwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnB0KTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElHZXRJbmZvVGhyZWFkc1JlcXVlc3QgZ2V0R2V0SW5mb1RocmVhZHNSZXF1ZXN0KEJpdExpc3QgdGFza3MpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBleHByCi0JICogQHBhcmFtIHZhcmlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJR2V0UGFydGlhbEFJRlJlcXVlc3QgZ2V0R2V0UGFydGlhbEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIsIFN0cmluZyB2YXJpZCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGV4cHIKLQkgKiBAcGFyYW0gdmFyaWQKLQkgKiBAcGFyYW0gbGlzdENoaWxkcmVuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJR2V0UGFydGlhbEFJRlJlcXVlc3QgZ2V0R2V0UGFydGlhbEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIsIFN0cmluZyB2YXJpZCwgYm9vbGVhbiBsaXN0Q2hpbGRyZW4pOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJR2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0IGdldEdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdChCaXRMaXN0IHRhc2tzKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBkaWZmCi0JICogQHBhcmFtIGRpZmYyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTGlzdEFyZ3VtZW50c1JlcXVlc3QgZ2V0TGlzdEFyZ3VtZW50c1JlcXVlc3QoQml0TGlzdCB0YXNrcywgaW50IGRpZmYsIGludCBkaWZmMik7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJTGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdCBnZXRMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0KEJpdExpc3QgdGFza3MpOwotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElMaXN0U2lnbmFsc1JlcXVlc3QgZ2V0TGlzdFNpZ25hbHNSZXF1ZXN0KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBuYW1lKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QgZ2V0TGlzdFN0YWNrRnJhbWVzUmVxdWVzdChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzKTsKLQkJCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gbG93Ci0JICogQHBhcmFtIGhpZ2gKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0IGdldExpc3RTdGFja0ZyYW1lc1JlcXVlc3QoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IGxvdywgaW50IGhpZ2gpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBwYXNzU2lnbmFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJR29SZXF1ZXN0IGdldFJlc3VtZVJlcXVlc3QoQml0TGlzdCB0YXNrcywgYm9vbGVhbiBwYXNzU2lnbmFsKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gYnB0Ci0JICogQHBhcmFtIGFsbG93VXBkYXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0IGdldFNldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLCBJUERJQWRkcmVzc0JyZWFrcG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3QgZ2V0U2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGludCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJwdAotCSAqIEBwYXJhbSBhbGxvd1VwZGF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVNldEZ1bmN0aW9uQnJlYWtwb2ludFJlcXVlc3QgZ2V0U2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLCBJUERJRnVuY3Rpb25CcmVha3BvaW50IGJwdCwgYm9vbGVhbiBhbGxvd1VwZGF0ZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJwdAotCSAqIEBwYXJhbSBhbGxvd1VwZGF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVNldExpbmVCcmVha3BvaW50UmVxdWVzdCBnZXRTZXRMaW5lQnJlYWtwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESUxpbmVCcmVha3BvaW50IGJwdCwgYm9vbGVhbiBhbGxvd1VwZGF0ZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0IGdldFNldFRocmVhZFNlbGVjdFJlcXVlc3QoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IGlkKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gYnB0Ci0JICogQHBhcmFtIGFsbG93VXBkYXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU2V0V2F0Y2hwb2ludFJlcXVlc3QgZ2V0U2V0V2F0Y2hwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESVdhdGNocG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gYXBwCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZGlyCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTdGFydERlYnVnZ2VyUmVxdWVzdCBnZXRTdGFydERlYnVnZ2VyUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgYXBwLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncyk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGNvdW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU3RlcEZpbmlzaFJlcXVlc3QgZ2V0U3RlcEZpbmlzaFJlcXVlc3QoQml0TGlzdCB0YXNrcywgaW50IGNvdW50KTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTdGVwSW50b1JlcXVlc3QgZ2V0U3RlcEludG9SZXF1ZXN0KEJpdExpc3QgdGFza3MsIGludCBjb3VudCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGNvdW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU3RlcE92ZXJSZXF1ZXN0IGdldFN0ZXBPdmVyUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpOwotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVN0b3BEZWJ1Z2dlclJlcXVlc3QgZ2V0U3RvcERlYnVnZ2VyUmVxdWVzdChCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUhhbHRSZXF1ZXN0IGdldFN1c3BlbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHNlbmRFdmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESUhhbHRSZXF1ZXN0IGdldFN1c3BlbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGJvb2xlYW4gc2VuZEV2ZW50KTsKLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVRlcm1pbmF0ZVJlcXVlc3QgZ2V0VGVybWluYXRlUmVxdWVzdChCaXRMaXN0IHRhc2tzKTsKLQkKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElSZXN0YXJ0UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElSZXN0YXJ0UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA0MGE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJUmVzdGFydFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3QgcmVzdGFydGluZwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElSZXN0YXJ0UmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTZXRBZGRyZXNzQnJlYWtwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNjI4MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzZXR0aW5nIGEgZnVuY3Rpb24gYnJlYWtwb2ludAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTZXRBZGRyZXNzQnJlYWtwb2ludFJlcXVlc3QgZXh0ZW5kcyBJUERJQnJlYWtwb2ludFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlZjcwMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzZXR0aW5nIGN1cnJlbnQgZnJhbWUKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0IGV4dGVuZHMgSVBESUludGVybmFsRXZlbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldEZ1bmN0aW9uQnJlYWtwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkZTNlZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldEZ1bmN0aW9uQnJlYWtwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3Qgc2V0dGluZyBhIGZ1bmN0aW9uIGJyZWFrcG9pbnQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdCBleHRlbmRzIElQRElCcmVha3BvaW50UmVxdWVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldExpbmVCcmVha3BvaW50UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzVmOWFjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IHNldHRpbmcgYSBsaW5lIGJyZWFrcG9pbnQKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0IGV4dGVuZHMgSVBESUJyZWFrcG9pbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldFRocmVhZFNlbGVjdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjMDRlYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldFRocmVhZFNlbGVjdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZURlc2NyaXB0b3I7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IHNldHRpbmcgdGhyZWFkIHNlbGVjdAotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0IGV4dGVuZHMgSVBESUV2ZW50UmVxdWVzdCB7Ci0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZURlc2NyaXB0b3IgZ2V0U3RhY2tGcmFtZShCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRUaHJlYWRJZChCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU2V0V2F0Y2hwb2ludFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU2V0V2F0Y2hwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MWQ5Ny4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVNldFdhdGNocG9pbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IHNldHRpbmcgYSB3YXRjaHBvaW50Ci0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVNldFdhdGNocG9pbnRSZXF1ZXN0IGV4dGVuZHMgSVBESUJyZWFrcG9pbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGFydERlYnVnZ2VyUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGFydERlYnVnZ2VyUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VhYTA3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU3RhcnREZWJ1Z2dlclJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3Qgc3RhcnRpbmcgZGVidWdnZXIKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU3RhcnREZWJ1Z2dlclJlcXVlc3QgZXh0ZW5kcyBJUERJSW50ZXJuYWxFdmVudFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBGaW5pc2hSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBGaW5pc2hSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTBhY2UuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwRmluaXNoUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzdGVwcGluZyBmaW5pc2gKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERJU3RlcEZpbmlzaFJlcXVlc3QgZXh0ZW5kcyBJUERJU3RlcFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBJbnRvSW5zdHJ1Y3Rpb25SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBJbnRvSW5zdHJ1Y3Rpb25SZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTU2YjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwSW50b0luc3RydWN0aW9uUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzdGVwcGluZyBpbnRvCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVN0ZXBJbnRvSW5zdHJ1Y3Rpb25SZXF1ZXN0IGV4dGVuZHMgSVBESVN0ZXBSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwSW50b1JlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU3RlcEludG9SZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2U5NGEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwSW50b1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3Qgc3RlcHBpbmcgaW50bwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTdGVwSW50b1JlcXVlc3QgZXh0ZW5kcyBJUERJU3RlcFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBPdmVySW5zdHJ1Y3Rpb25SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBPdmVySW5zdHJ1Y3Rpb25SZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOWRlZjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwT3Zlckluc3RydWN0aW9uUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzdGVwcGluZyBpbnRvCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVN0ZXBPdmVySW5zdHJ1Y3Rpb25SZXF1ZXN0IGV4dGVuZHMgSVBESVN0ZXBSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwT3ZlclJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU3RlcE92ZXJSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Zjc0YWIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwT3ZlclJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRvIHJlcXVlc3Qgc3RlcHBpbmcgb3ZlcgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTdGVwT3ZlclJlcXVlc3QgZXh0ZW5kcyBJUERJU3RlcFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0ZXBSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MzkyYjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElTdGVwUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzdGVwcGluZwotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTdGVwUmVxdWVzdCBleHRlbmRzIElQRElFdmVudFJlcXVlc3QgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvcGRpL3JlcXVlc3QvSVBESVN0b3BEZWJ1Z2dlclJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU3RvcERlYnVnZ2VyUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE5YTAxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJU3RvcERlYnVnZ2VyUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdG8gcmVxdWVzdCBzdG9wcGluZyBkZWJ1Z2dlcgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRElTdG9wRGVidWdnZXJSZXF1ZXN0IGV4dGVuZHMgSVBESUV2ZW50UmVxdWVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9wZGkvcmVxdWVzdC9JUERJVGVybWluYXRlUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElUZXJtaW5hdGVSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDAzMzEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3BkaS9yZXF1ZXN0L0lQRElUZXJtaW5hdGVSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0byByZXF1ZXN0IHRlcm1pbmF0aW5nCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBESVRlcm1pbmF0ZVJlcXVlc3QgZXh0ZW5kcyBJUERJRXZlbnRSZXF1ZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9BZGRyZXNzTG9jYXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvQWRkcmVzc0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmNiNTAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9BZGRyZXNzTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQWRkcmVzc0xvY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NMb2NhdGlvbiBleHRlbmRzIExvY2F0aW9uIGltcGxlbWVudHMgSVBESUFkZHJlc3NMb2NhdGlvbiB7Ci0JcHVibGljIEFkZHJlc3NMb2NhdGlvbihCaWdJbnRlZ2VyIGFkZHIpIHsKLQkJc3VwZXIoYWRkcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9GaWxlTG9jYXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvRmlsZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWFiZjQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9GaWxlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUZpbGVMb2NhdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVMb2NhdGlvbiBleHRlbmRzIExvY2F0aW9uIGltcGxlbWVudHMgSVBESUZpbGVMb2NhdGlvbiB7Ci0JcHVibGljIEZpbGVMb2NhdGlvbihTdHJpbmcgZmlsZSkgewotCQlzdXBlcihmaWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL0Z1bmN0aW9uTG9jYXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvRnVuY3Rpb25Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNjODY3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvRnVuY3Rpb25Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRnVuY3Rpb25Mb2NhdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uTG9jYXRpb24gZXh0ZW5kcyBMb2NhdGlvbiBpbXBsZW1lbnRzIElQRElGdW5jdGlvbkxvY2F0aW9uIHsKLQlwdWJsaWMgRnVuY3Rpb25Mb2NhdGlvbihTdHJpbmcgZmlsZSwgU3RyaW5nIGZ1bmN0aW9uKSB7Ci0JCXN1cGVyKGZpbGUsIGZ1bmN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL0xpbmVMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9MaW5lTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxYzliYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL0xpbmVMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTGluZUxvY2F0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTGluZUxvY2F0aW9uIGV4dGVuZHMgTG9jYXRpb24gaW1wbGVtZW50cyBJUERJTGluZUxvY2F0aW9uIHsKLQlwdWJsaWMgTGluZUxvY2F0aW9uKFN0cmluZyBmaWxlLCBpbnQgbGluZSkgewotCQlzdXBlcihmaWxlLCBsaW5lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL0xvY2F0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTUyMzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQWRkcmVzc0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRmlsZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRnVuY3Rpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxpbmVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIExvY2F0aW9uIGltcGxlbWVudHMgSVBESUxvY2F0aW9uIHsKLQlwcml2YXRlIEJpZ0ludGVnZXIgYWRkciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVuY3Rpb24gPSBudWxsOwotCXByaXZhdGUgaW50IGxpbmUgPSAwOwotCQotCXB1YmxpYyBMb2NhdGlvbihTdHJpbmcgZmlsZSkgewotCQl0aGlzKGZpbGUsIG51bGwsIDAsIG51bGwpOwotCX0KLQlwdWJsaWMgTG9jYXRpb24oU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jdGlvbikgewotCQl0aGlzKGZpbGUsIGZ1bmN0aW9uLCAwLCBudWxsKTsKLQl9Ci0JcHVibGljIExvY2F0aW9uKFN0cmluZyBmaWxlLCBpbnQgbGluZSkgewotCQl0aGlzKGZpbGUsIG51bGwsIGxpbmUsIG51bGwpOwotCX0KLQlwdWJsaWMgTG9jYXRpb24oQmlnSW50ZWdlciBhZGRyKSB7Ci0JCXRoaXMobnVsbCwgbnVsbCwgMCwgYWRkcik7Ci0JfQotCXB1YmxpYyBMb2NhdGlvbihTdHJpbmcgZmlsZSwgU3RyaW5nIGZ1bmN0aW9uLCBpbnQgbGluZSwgQmlnSW50ZWdlciBhZGRyKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMuZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQkJdGhpcy5saW5lID0gbGluZTsKLQkJdGhpcy5hZGRyID0gYWRkcjsKLQl9Ci0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIGFkZHI7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb24oKSB7Ci0JCXJldHVybiBmdW5jdGlvbjsKLQl9Ci0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gbGluZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKElQRElMb2NhdGlvbiBsb2NhdGlvbikgewotCQlpZiAobG9jYXRpb24gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgSVBESUxpbmVMb2NhdGlvbikgewotCQkJSVBESUxpbmVMb2NhdGlvbiBsaW5lTG9jYXRpb24gPSAoSVBESUxpbmVMb2NhdGlvbilsb2NhdGlvbjsKLQkJCVN0cmluZyBvRmlsZSA9IGxpbmVMb2NhdGlvbi5nZXRGaWxlKCk7Ci0JCQlpZiAob0ZpbGUgIT0gbnVsbCAmJiBvRmlsZS5sZW5ndGgoKSA+IDAgJiYgZmlsZSAhPSBudWxsICYmIGZpbGUubGVuZ3RoKCkgPiAwICYmIG9GaWxlLmVxdWFscyhmaWxlKSkgewotCQkJCWlmIChsaW5lTG9jYXRpb24uZ2V0TGluZU51bWJlcigpID09IGxpbmUpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoZmlsZSA9PSBudWxsIHx8IGZpbGUubGVuZ3RoKCkgPT0gMCkgJiYgKG9GaWxlID09IG51bGwgfHwgb0ZpbGUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlpZiAobGluZUxvY2F0aW9uLmdldExpbmVOdW1iZXIoKSA9PSBsaW5lKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIElQRElGdW5jdGlvbkxvY2F0aW9uKSB7Ci0JCQlJUERJRnVuY3Rpb25Mb2NhdGlvbiBmdW5jTG9jYXRpb24gPSAoSVBESUZ1bmN0aW9uTG9jYXRpb24pbG9jYXRpb247Ci0JCQlTdHJpbmcgb0ZpbGUgPSBmdW5jTG9jYXRpb24uZ2V0RmlsZSgpOwotCQkJU3RyaW5nIG9GdW5jdGlvbiA9IGZ1bmNMb2NhdGlvbi5nZXRGdW5jdGlvbigpOwotCQkJaWYgKG9GaWxlICE9IG51bGwgJiYgb0ZpbGUubGVuZ3RoKCkgPiAwICYmIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmxlbmd0aCgpID4gMCAmJiBvRmlsZS5lcXVhbHMoZmlsZSkpIHsKLQkJCQlpZiAob0Z1bmN0aW9uICE9IG51bGwgJiYgb0Z1bmN0aW9uLmxlbmd0aCgpID4gMCAmJiBmdW5jdGlvbiAhPSBudWxsICYmIGZ1bmN0aW9uLmxlbmd0aCgpID4gMCAmJiBvRnVuY3Rpb24uZXF1YWxzKGZ1bmN0aW9uKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKChvRnVuY3Rpb24gPT0gbnVsbCB8fCBvRnVuY3Rpb24ubGVuZ3RoKCkgPT0gMCkgJiYgKGZ1bmN0aW9uID09IG51bGwgfHwgZnVuY3Rpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoZmlsZSA9PSBudWxsIHx8IGZpbGUubGVuZ3RoKCkgPT0gMCkgJiYgKG9GaWxlID09IG51bGwgfHwgb0ZpbGUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlpZiAob0Z1bmN0aW9uICE9IG51bGwgJiYgb0Z1bmN0aW9uLmxlbmd0aCgpID4gMCAmJiBmdW5jdGlvbiAhPSBudWxsICYmIGZ1bmN0aW9uLmxlbmd0aCgpID4gMCAmJiBvRnVuY3Rpb24uZXF1YWxzKGZ1bmN0aW9uKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKChvRnVuY3Rpb24gPT0gbnVsbCB8fCBvRnVuY3Rpb24ubGVuZ3RoKCkgPT0gMCkgJiYgKGZ1bmN0aW9uID09IG51bGwgfHwgZnVuY3Rpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgSVBESUFkZHJlc3NMb2NhdGlvbikgewotCQkJSVBESUFkZHJlc3NMb2NhdGlvbiBhZGRyTG9jYXRpb24gPSAoSVBESUFkZHJlc3NMb2NhdGlvbilsb2NhdGlvbjsKLQkJCUJpZ0ludGVnZXIgb0FkZHIgPSBhZGRyTG9jYXRpb24uZ2V0QWRkcmVzcygpOwotCQkJaWYgKG9BZGRyICE9IG51bGwgJiYgb0FkZHIuZXF1YWxzKGFkZHIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG9BZGRyID09IG51bGwgJiYgYWRkciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBJUERJRmlsZUxvY2F0aW9uKSB7Ci0JCQlJUERJRmlsZUxvY2F0aW9uIGZpbGVMb2NhdGlvbiA9IChJUERJRmlsZUxvY2F0aW9uKWxvY2F0aW9uOwotCQkJU3RyaW5nIG9GaWxlID0gZmlsZUxvY2F0aW9uLmdldEZpbGUoKTsKLQkJCWlmIChvRmlsZSAhPSBudWxsICYmIG9GaWxlLmxlbmd0aCgpID4gMCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5sZW5ndGgoKSA+IDAgJiYgb0ZpbGUuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKChmaWxlID09IG51bGwgfHwgZmlsZS5sZW5ndGgoKSA9PSAwKSAmJiAob0ZpbGUgPT0gbnVsbCB8fCBvRmlsZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL0xvY2F0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzc3ZmUwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhdG9yIGV4dGVuZHMgTG9jYXRpb24gaW1wbGVtZW50cyBJUERJTG9jYXRvciB7Ci0JcHVibGljIExvY2F0b3IoU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jdGlvbiwgaW50IGxpbmUsIEJpZ0ludGVnZXIgYWRkcmVzcykgewotCQlzdXBlcihmaWxlLCBmdW5jdGlvbiwgbGluZSwgYWRkcmVzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yI2VxdWFsQWRkcmVzcyhqYXZhLm1hdGguQmlnSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbEFkZHJlc3MoQmlnSW50ZWdlciBvQWRkcmVzcykgewotCQlpZiAob0FkZHJlc3MgPT0gbnVsbCAmJiBnZXRBZGRyZXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9BZGRyZXNzICE9IG51bGwgJiYgb0FkZHJlc3MuZXF1YWxzKGdldEFkZHJlc3MoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3IjZXF1YWxGaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxGaWxlKFN0cmluZyBvRmlsZSkgewotCQlyZXR1cm4gZXF1YWxTdHJpbmcob0ZpbGUsIGdldEZpbGUoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yI2VxdWFsRnVuY3Rpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbEZ1bmN0aW9uKFN0cmluZyBvRnVuY3Rpb24pIHsKLQkJcmV0dXJuIGVxdWFsU3RyaW5nKG9GdW5jdGlvbiwgZ2V0RnVuY3Rpb24oKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yI2VxdWFsTGluZShpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxMaW5lKGludCBvTGluZSkgewotCQlyZXR1cm4gb0xpbmUgPT0gZ2V0TGluZU51bWJlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvciNlcXVhbHMob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhJUERJTG9jYXRvciBsb2NhdG9yKSB7Ci0JCWlmIChsb2NhdG9yID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCVN0cmluZyBvRmlsZSA9IGxvY2F0b3IuZ2V0RmlsZSgpOwotCQlTdHJpbmcgb0Z1bmN0aW9uID0gbG9jYXRvci5nZXRGdW5jdGlvbigpOwotCQlpbnQgb0xpbmUgPSBsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJQmlnSW50ZWdlciBvQWRkcmVzcyA9IGxvY2F0b3IuZ2V0QWRkcmVzcygpOwotCi0JCWlmIChlcXVhbEZpbGUob0ZpbGUpICYmIGVxdWFsRnVuY3Rpb24ob0Z1bmN0aW9uKSAmJiBlcXVhbExpbmUob0xpbmUpICYmIGVxdWFsQWRkcmVzcyhvQWRkcmVzcykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZjEKLQkgKiBAcGFyYW0gZjIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGVxdWFsU3RyaW5nKFN0cmluZyBmMSwgU3RyaW5nIGYyKSB7Ci0JCWlmIChmMSAhPSBudWxsICYmIGYxLmxlbmd0aCgpID4gMCAmJiBmMiAhPSBudWxsICYmIGYyLmxlbmd0aCgpID4gMCkgewotCQkJcmV0dXJuIGYxLmVxdWFscyhmMik7Ci0JCX0gZWxzZSBpZiAoKGYxID09IG51bGwgfHwgZjEubGVuZ3RoKCkgPT0gMCkgJiYgKGYyID09IG51bGwgfHwgZjIubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUYuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY5ZDE4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWU7Ci0KLXB1YmxpYyBjbGFzcyBBSUYgaW1wbGVtZW50cyBJQUlGIHsKLQlwcml2YXRlIElBSUZUeXBlIGFpZlR5cGU7Ci0JcHJpdmF0ZSBJQUlGVmFsdWUgYWlmVmFsdWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZURlc2MgPSAiIjsKLQotCXB1YmxpYyBBSUYoSUFJRlR5cGUgYWlmVHlwZSwgSUFJRlZhbHVlIGFpZlZhbHVlKSB7Ci0JCXRoaXMuYWlmVHlwZSA9IGFpZlR5cGU7Ci0JCXRoaXMuYWlmVmFsdWUgPSBhaWZWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIEFJRihTdHJpbmcgZmRzLCBieXRlW10gZGF0YSkgewotCQlhaWZUeXBlID0gQUlGRmFjdG9yeS5nZXRBSUZUeXBlKGZkcyk7Ci0JCWFpZlZhbHVlID0gQUlGRmFjdG9yeS5nZXRBSUZWYWx1ZShudWxsLCBhaWZUeXBlLCBkYXRhKTsKLQl9Ci0JCi0JcHVibGljIEFJRihTdHJpbmcgZmRzLCBieXRlW10gZGF0YSwgU3RyaW5nIGRlc2MpIHsKLQkJdGhpcyhmZHMsIGRhdGEpOwotCQl0eXBlRGVzYyA9IGRlc2M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRiNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMudHlwZURlc2M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRiNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgSUFJRlR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGFpZlR5cGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRiNnZXRWYWx1ZSgpCi0JICovCi0JcHVibGljIElBSUZWYWx1ZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGFpZlZhbHVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQl0cnkgewotCQkJcmV0dXJuICI8IiArIGFpZlR5cGUudG9TdHJpbmcoKSArICIsIiArIGFpZlZhbHVlLnRvU3RyaW5nKCkgKyAiPiI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gImVycjogIiArIGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgQUlGIHR5cGUKLQkgKiBAcGFyYW0gdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFR5cGUoSUFJRlR5cGUgdCkgewotCQlhaWZUeXBlID0gdDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBBSUYgdmFsdWUKLQkgKiBAcGFyYW0gdgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKElBSUZWYWx1ZSB2KSB7Ci0JCWFpZlZhbHVlID0gdjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODk3YTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBSUZUeXBlIGltcGxlbWVudHMgSUFJRlR5cGUge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVBZGRyZXNzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU5MzkzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQWRkcmVzczsKLQotcHVibGljIGNsYXNzIEFJRlR5cGVBZGRyZXNzIGV4dGVuZHMgQUlGVHlwZSBpbXBsZW1lbnRzIElBSUZUeXBlQWRkcmVzcyB7Ci0JaW50IHNpemUgPSAwOwotCS8vY2hhcio6IGE0Ci0JcHVibGljIEFJRlR5cGVBZGRyZXNzKGludCBzaXplKSB7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZihBSUZGYWN0b3J5LkZEU19BRERSRVNTKSArIHNpemU7Ci0JfQotCXB1YmxpYyBpbnQgc2l6ZW9mKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUFycmF5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViYmIzZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVBcnJheTsKLQotcHVibGljIGNsYXNzIEFJRlR5cGVBcnJheSBleHRlbmRzIFR5cGVEZXJpdmVkIGltcGxlbWVudHMgSUFJRlR5cGVBcnJheSB7Ci0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDE7Ci0JcHJpdmF0ZSBpbnQgbG93ID0gMDsKLQlwcml2YXRlIGludCBoaWdoID0gMDsKLQlwcml2YXRlIGludCBkaW1lbnNpb24gPSAwOwotCi0JLy9jaGFyW106IFtyMC4uM2lzNF1jCi0JLy8yRFszXVsyXTogW3IwLi4xaXM0XVtyMC4uMmlzNF1pczQKLQkvLzJEWzJdWzNdOiBbcjAuLjJpczRdW3IwLi4xaXM0XWlzNAotCS8vaW50W106IFtyMC4uOWlzNF1pczQKLQkvL2NoYXJbXTogW3IwLi40aXM0XWMKLQkvL3NlcGFyYXRlIGludG8gdHdvIHBhcnRzOiAgMS1bcjAuLjFpczRdLCAyLVtyMC4uMmlzNF1pczQKLQlwdWJsaWMgQUlGVHlwZUFycmF5KFN0cmluZyBmb3JtYXQsIElBSUZUeXBlIGJhc2V0eXBlKSB7Ci0JCXN1cGVyKGJhc2V0eXBlKTsKLQkJcGFyc2UoZm9ybWF0KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHBhcnNlKFN0cmluZyBmbXQpIHsKLQkJaW50IGxvd19wb3MgPSBBSUZGYWN0b3J5LmdldERpZ2l0UG9zKGZtdCwgMSk7Ci0JCWxvdyA9IEludGVnZXIucGFyc2VJbnQoZm10LnN1YnN0cmluZygxLCBsb3dfcG9zKSk7Ci0JCWludCB1cF9wb3MgPSBBSUZGYWN0b3J5LmdldERpZ2l0UG9zKGZtdCwgbG93X3BvcysyKTsKLQkJaGlnaCA9IEludGVnZXIucGFyc2VJbnQoZm10LnN1YnN0cmluZyhsb3dfcG9zKzIsIHVwX3BvcykpOwotCQlzaXplID0gc2l6ZSAqIChoaWdoLWxvdysxKSAqIGJhc2V0eXBlLnNpemVvZigpOwotCX0KLQlwdWJsaWMgaW50IGdldExvdygpIHsKLQkJcmV0dXJuIGxvdzsKLQl9Ci0JcHVibGljIGludCBnZXRIaWdoKCkgewotCQlyZXR1cm4gaGlnaDsKLQl9Ci0JcHVibGljIGludCBnZXRSYW5nZSgpIHsKLQkJcmV0dXJuIChoaWdoLWxvdykgKyAxOwotCX0KLQlwdWJsaWMgSUFJRlR5cGUgZ2V0Rm91bmRhdGlvblR5cGUoKSB7Ci0JCWlmIChiYXNldHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlQXJyYXkpIHsKLQkJCXJldHVybiAoKElBSUZUeXBlQXJyYXkpYmFzZXR5cGUpLmdldEZvdW5kYXRpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2V0eXBlOwotCX0KLQlwdWJsaWMgaW50W10gZ2V0RGltZW5zaW9uRGV0YWlscygpIHsKLQkJaW50W10gZGltcyA9IG5ldyBpbnRbZ2V0RGltZW5zaW9uKCldOwotCQlmb3IgKGludCBpPTA7IGk8ZGltcy5sZW5ndGg7IGkrKykgewotCQkJZGltc1tpXSA9IGdldEFJRlR5cGVBcnJheShpKS5nZXRSYW5nZSgpOwotCQl9Ci0JCXJldHVybiBkaW1zOwotCX0KLQlwdWJsaWMgaW50IGdldERpbWVuc2lvbigpIHsKLQkJaWYgKGRpbWVuc2lvbiA9PSAwKSB7Ci0JCQlkaW1lbnNpb24gPSAxOwotCQkJaWYgKGJhc2V0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVBcnJheSkgewotCQkJCWRpbWVuc2lvbiArPSAoKElBSUZUeXBlQXJyYXkpYmFzZXR5cGUpLmdldERpbWVuc2lvbigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaW1lbnNpb247Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRGltZW5zaW9uQXJyYXkoKSB7Ci0JCXJldHVybiAoYmFzZXR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KTsKLQl9Ci0JcHVibGljIElBSUZUeXBlQXJyYXkgZ2V0QUlGVHlwZUFycmF5KGludCBkaW1fcG9zKSB7Ci0JCWlmIChkaW1fcG9zID09IDApCi0JCQlyZXR1cm4gdGhpczsKLQotCQlpZiAoZGltX3BvcyA8IDAgfHwgZGltX3BvcyA+IGdldERpbWVuc2lvbigpLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKChJQUlGVHlwZUFycmF5KWJhc2V0eXBlKS5nZXRBSUZUeXBlQXJyYXkoZGltX3Bvcy0xKTsKLQl9Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCByYW5nZSkgewotCQlyZXR1cm4gZ2V0QUlGVHlwZUFycmF5KHJhbmdlKS50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIltyIiArIGxvdyArICIuLiIgKyBoaWdoICsgIlVdIiArIGJhc2V0eXBlLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIGZtdCA9ICJbcjAuLjJpczRdW3IwLi41aXM0XVtyMC4uNWlzNF1bcjAuLjVpczRdW3IwLi41aXM0XWlzNCI7Ci0JCUlBSUZUeXBlIHR5cGUgPSBBSUZGYWN0b3J5LmdldEFJRlR5cGUoZm10KTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oImRpbTogIiArICgoSUFJRlR5cGVBcnJheSl0eXBlKS5nZXREaW1lbnNpb24oKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oImJhc2U6ICIgKyAoKElBSUZUeXBlQXJyYXkpdHlwZSkuZ2V0QmFzZVR5cGUoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oImZvdW5kYXRpb246ICIgKyAoKElBSUZUeXBlQXJyYXkpdHlwZSkuZ2V0Rm91bmRhdGlvblR5cGUoKSk7Ci0JCX0KLQkJU3lzdGVtLmVyci5wcmludGxuKCJzaXplOiAiICsgdHlwZS5zaXplb2YoKSk7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiMXN0OiAiICsgKChJQUlGVHlwZUFycmF5KXR5cGUpLmdldEFJRlR5cGVBcnJheSgwKSk7Ci0JfQotCQotCS8qCi0JcHVibGljIElBSUZUeXBlUmFuZ2VbXSBnZXRSYW5nZXMoKSB7Ci0JCXJldHVybiAoSUFJRlR5cGVSYW5nZVtdKXJhbmdlcy50b0FycmF5KG5ldyBJQUlGVHlwZVJhbmdlWzBdKTsKLQl9Ci0JcHVibGljIElBSUZUeXBlUmFuZ2UgZ2V0UmFuZ2UoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoSUFJRlR5cGVSYW5nZSlyYW5nZXMuZ2V0KGluZGV4KTsKLQl9Ci0JcHVibGljIGludCBnZXRMb3dlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldFJhbmdlKGluZGV4KS5nZXRMb3dlcigpOwotCX0KLQlwdWJsaWMgaW50IGdldFVwcGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0UmFuZ2UoaW5kZXgpLmdldFVwcGVyKCk7Ci0JfQotCXB1YmxpYyBJQUlGVHlwZSBnZXRJbnRlcm5hbFR5cGUoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXRSYW5nZShpbmRleCkuZ2V0SW50ZXJuYWxUeXBlKCk7Ci0JfQkKLQlwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIGZtdCkgewotCQl3aGlsZSAoZm10Lmxlbmd0aCgpID4gMCkgewotCQkJZm10ID0gcGFyc2VSYW5nZShmbXQpOwotCQl9Ci0JCXNpemUgPSBzaXplICogYmFzZXR5cGUuc2l6ZW9mKCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgcGFyc2VSYW5nZShTdHJpbmcgZm10KSB7Ci0JCWludCBwb3MgPSBmbXQuaW5kZXhPZihBSUZGYWN0b3J5LlNJR05fQ0xPU0UpOwotCQlyYW5nZXMuYWRkKGdldFJhbmdlKGZtdC5zdWJzdHJpbmcoMSwgcG9zKSkpOwotCQlyZXR1cm4gZm10LnN1YnN0cmluZyhwb3MrMSk7Ci0JfQotCS8vcmFuZ2U6IHJMLi5VVAotCXByb3RlY3RlZCBJQUlGVHlwZVJhbmdlIGdldFJhbmdlKFN0cmluZyBmbXQpIHsKLQkJaW50IGxvd19wb3MgPSBBSUZGYWN0b3J5LmdldERpZ2l0UG9zKGZtdCwgMSk7Ci0JCWludCBsb3dlciA9IEludGVnZXIucGFyc2VJbnQoZm10LnN1YnN0cmluZygxLCBsb3dfcG9zKSk7Ci0JCWludCB1cF9wb3MgPSBBSUZGYWN0b3J5LmdldERpZ2l0UG9zKGZtdCwgbG93X3BvcysyKTsKLQkJaW50IHVwcGVyID0gSW50ZWdlci5wYXJzZUludChmbXQuc3Vic3RyaW5nKGxvd19wb3MrMiwgdXBfcG9zKSk7Ci0JCXNpemUgPSBzaXplICogKHVwcGVyLWxvd2VyKzEpOwotCQkvL0FJRkZhY3RvcnkuZ2V0QUlGVHlwZShmbXQuc3Vic3RyaW5nKHVwX3BvcykpCi0JCXJldHVybiBuZXcgQUlGVHlwZVJhbmdlKGxvd2VyLCB1cHBlciwgbnVsbCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGRpbWVuc2lvbikgewotCQlJQUlGVHlwZVJhbmdlIHJhbmdlID0gKElBSUZUeXBlUmFuZ2UpcmFuZ2VzLmdldChkaW1lbnNpb24pOwotCQkvL3JhbmdlLmdldEludGVybmFsVHlwZSgpLnRvU3RyaW5nKCkKLQkJcmV0dXJuICJbciIgKyByYW5nZS5nZXRMb3dlcigpICsgIi4uIiArIHJhbmdlLmdldFVwcGVyKCkgKyAiVSIgKyAgIl0iOwkJCi0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBjb250ZW50ID0gIiI7Ci0JCWZvciAoaW50IGk9MDsgaTxyYW5nZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWNvbnRlbnQgKz0gdG9TdHJpbmcoaSk7Ci0JCX0KLQkJY29udGVudCArPSBnZXRCYXNlVHlwZSgpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQkKLQljbGFzcyBBSUZUeXBlUmFuZ2UgaW1wbGVtZW50cyBJQUlGVHlwZVJhbmdlIHsKLQkJaW50IGxvd2VyOwotCQlpbnQgdXBwZXI7Ci0JCS8vVE9ETyAtLSBub3QgaW1wb3J0YW50IGZvciB0aGF0Ci0JCUlBSUZUeXBlIGludGVyYWxUeXBlOwotCQkKLQkJQUlGVHlwZVJhbmdlKGludCBsb3dlciwgaW50IHVwcGVyLCBJQUlGVHlwZSBpbnRlcmFsVHlwZSkgewotCQkJdGhpcy5sb3dlciA9IGxvd2VyOwotCQkJdGhpcy51cHBlciA9IHVwcGVyOwotCQkJdGhpcy5pbnRlcmFsVHlwZSA9IGludGVyYWxUeXBlOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TG93ZXIoKSB7Ci0JCQlyZXR1cm4gbG93ZXI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRVcHBlcigpIHsKLQkJCXJldHVybiB1cHBlcjsKLQkJfQotCQlwdWJsaWMgSUFJRlR5cGUgZ2V0SW50ZXJuYWxUeXBlKCkgewotCQkJcmV0dXJuIGludGVyYWxUeXBlOwotCQl9Ci0JfQotCSovCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlQm9vbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUJvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2MmEyYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlQm9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUJvb2w7Ci0KLXB1YmxpYyBjbGFzcyBBSUZUeXBlQm9vbCBleHRlbmRzIFR5cGVJbnRlZ3JhbCBpbXBsZW1lbnRzIElBSUZUeXBlQm9vbCB7Ci0JLy9iCi0JcHVibGljIEFJRlR5cGVCb29sKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQlwdWJsaWMgQUlGVHlwZUJvb2woYm9vbGVhbiBzaWduZWQpIHsKLQkJc3VwZXIoc2lnbmVkKTsKLQl9Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBBSUZGYWN0b3J5LlNJWkVfQk9PTDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJiIiArIHNpemVvZigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVDaGFyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlQ2hhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDAxMmUxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVDaGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQ2hhcjsKLQotcHVibGljIGNsYXNzIEFJRlR5cGVDaGFyIGV4dGVuZHMgVHlwZUludGVncmFsIGltcGxlbWVudHMgSUFJRlR5cGVDaGFyIHsKLQkvL2MKLQlwdWJsaWMgQUlGVHlwZUNoYXIoKSB7Ci0JCXRoaXModHJ1ZSk7Ci0JfQotCXB1YmxpYyBBSUZUeXBlQ2hhcihib29sZWFuIHNpZ25lZCkgewotCQlzdXBlcihzaWduZWQpOwotCX0KLQlwdWJsaWMgaW50IHNpemVvZigpIHsKLQkJcmV0dXJuIEFJRkZhY3RvcnkuU0laRV9DSEFSOwotCX0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJjIiArIHNpemVvZigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVDaGFyUG9pbnRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUNoYXJQb2ludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNWJkNTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUNoYXJQb2ludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVDaGFyUG9pbnRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlR5cGVDaGFyUG9pbnRlciBleHRlbmRzIEFJRlR5cGVTdHJpbmcgaW1wbGVtZW50cyBJQUlGVHlwZUNoYXJQb2ludGVyIHsKLQlwcml2YXRlIElBSUZUeXBlIGFkZHI7Ci0JLy9jaGFyKjogcGE0Ci0JaW50IHNpemUgPSBBSUZGYWN0b3J5LlNJWkVfSU5WQUxJRDsKLQkKLQlwdWJsaWMgQUlGVHlwZUNoYXJQb2ludGVyKElBSUZUeXBlIGFkZHIpIHsKLQkJdGhpcy5hZGRyID0gYWRkcjsKLQl9Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBnZXRBZGRyZXNzVHlwZSgpLnNpemVvZigpICsgc2l6ZTsKLQl9Ci0JcHVibGljIElBSUZUeXBlQWRkcmVzcyBnZXRBZGRyZXNzVHlwZSgpIHsKLQkJcmV0dXJuIChJQUlGVHlwZUFkZHJlc3MpYWRkcjsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIEFJRkZhY3RvcnkuRkRTX0NIQVJfUE9JTlRFUiArIGFkZHIudG9TdHJpbmcoKTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVDbGFzcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjRlZTYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQ2xhc3M7Ci0KLXB1YmxpYyBjbGFzcyBBSUZUeXBlQ2xhc3MgZXh0ZW5kcyBUeXBlQWdncmVnYXRlIGltcGxlbWVudHMgSUFJRlR5cGVDbGFzcyB7Ci0JLy97SUR8TjE9RjEsLi4uOyBOMj1GMiwuLi47IE4zPUYzLC4uLjsgTjQ9RjQsLi4ufQotCXB1YmxpYyBBSUZUeXBlQ2xhc3MoU3RyaW5nIGZvcm1hdCkgewotCQlzdXBlcihmb3JtYXQpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQUlGRmFjdG9yeS5GRFNfU1RSVUNUX0NMQVNTICsgc3VwZXIudG9TdHJpbmcoKSArIEFJRkZhY3RvcnkuRkRTX0NMQVNTX0VORDsKLQl9Ci0JCi0JLyoKLQlwcml2YXRlIGludCAJCQkJaWQgPSAtMTsKLQlwcml2YXRlIEFJRlR5cGVGaWVsZFtdCXB1YmxpY0ZpZWxkczsKLQlwcml2YXRlIEFJRlR5cGVGaWVsZFtdCXByb3RlY3RlZEZpZWxkczsKLQlwcml2YXRlIEFJRlR5cGVGaWVsZFtdCXByaXZhdGVGaWVsZHM7Ci0JcHJpdmF0ZSBBSUZUeXBlRmllbGRbXQloaWRkZW5GaWVsZHM7Ci0JCi0JcHVibGljIEFJRlR5cGVDbGFzcyhBSUZUeXBlRmllbGRbXSBwdWIsIEFJRlR5cGVGaWVsZFtdIHByb3QsIEFJRlR5cGVGaWVsZFtdIHByaXYsIEFJRlR5cGVGaWVsZFtdIGhpZCkgewotCQl0aGlzLnB1YmxpY0ZpZWxkcyA9IHB1YjsKLQkJdGhpcy5wcm90ZWN0ZWRGaWVsZHMgPSBwcm90OwotCQl0aGlzLnByaXZhdGVGaWVsZHMgPSBwcml2OwotCQl0aGlzLmhpZGRlbkZpZWxkcyA9IGhpZDsKLQl9Ci0KLQlwdWJsaWMgQUlGVHlwZUNsYXNzKGludCBpZCwgQUlGVHlwZUZpZWxkW10gcHViLCBBSUZUeXBlRmllbGRbXSBwcm90LCBBSUZUeXBlRmllbGRbXSBwcml2LCBBSUZUeXBlRmllbGRbXSBoaWQpIHsKLQkJdGhpcyhwdWIsIHByb3QsIHByaXYsIGhpZCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzID0gInsiOwotCQkKLQkJaWYgKHRoaXMuaWQgPj0gMCkKLQkJCXJlcyArPSBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuaWQpICsgInwiOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnB1YmxpY0ZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCXJlcyArPSAiLCI7Ci0JCQlyZXMgKz0gdGhpcy5wdWJsaWNGaWVsZHNbaV0udG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJcmVzICs9ICI7IjsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wcm90ZWN0ZWRGaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkKLQkJCQlyZXMgKz0gIiwiOwotCQkJcmVzICs9IHRoaXMucHJvdGVjdGVkRmllbGRzW2ldLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJlcyArPSAiOyI7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJpdmF0ZUZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCXJlcyArPSAiLCI7Ci0JCQlyZXMgKz0gdGhpcy5wcml2YXRlRmllbGRzW2ldLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJlcyArPSAiOyI7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaGlkZGVuRmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApCi0JCQkJcmVzICs9ICIsIjsKLQkJCXJlcyArPSB0aGlzLmhpZGRlbkZpZWxkc1tpXS50b1N0cmluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzICsgIn0iOwotCX0KLQkqLwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUVudW0uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzgyZDYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlRW51bTsKLQotcHVibGljIGNsYXNzIEFJRlR5cGVFbnVtIGV4dGVuZHMgVHlwZUludGVncmFsIGltcGxlbWVudHMgSUFJRlR5cGVFbnVtIHsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlwcml2YXRlIElBSUZUeXBlIGJhc2V0eXBlOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JLy88SUR8UzE9VjEsUzI9VjI+aXM0Ci0JcHVibGljIEFJRlR5cGVFbnVtKFN0cmluZyBmb3JtYXQsIElBSUZUeXBlIGJhc2V0eXBlKSB7Ci0JCXRoaXMoZm9ybWF0LCB0cnVlLCBiYXNldHlwZSk7Ci0JfQotCXB1YmxpYyBBSUZUeXBlRW51bShTdHJpbmcgZm9ybWF0LCBib29sZWFuIHNpZ25lZCwgSUFJRlR5cGUgYmFzZXR5cGUpIHsKLQkJc3VwZXIoc2lnbmVkKTsKLQkJdGhpcy5iYXNldHlwZSA9IGJhc2V0eXBlOwotCQlwYXJzZShmb3JtYXQpOwotCX0KLQlwdWJsaWMgSUFJRlR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0JCXJldHVybiBiYXNldHlwZTsKLQl9Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBnZXROdW1iZXJPZkNoaWxkcmVuKCkgKiBiYXNldHlwZS5zaXplb2YoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU3RyaW5nIGZtdCkgewotCQlmbXQgPSBwYXJzZU5hbWUoZm10KTsKLQkJaWYgKGZtdC5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZ1tdIHBhaXJzID0gZm10LnNwbGl0KEFJRkZhY3RvcnkuU0lHTl9DT01NQSk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cGFpcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmdbXSByZXN1bHRzID0gcGFpcnNbaV0uc3BsaXQoQUlGRmFjdG9yeS5TSUdOX0VRVUFMKTsKLQkJCQlmaWVsZHMuYWRkKHJlc3VsdHNbMF0pOwotCQkJCXZhbHVlcy5hZGQocmVzdWx0c1sxXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXJzZU5hbWUoU3RyaW5nIGZtdCkgewotCQlpbnQgcG9zID0gZm10LmluZGV4T2YoQUlGRmFjdG9yeS5TSUdOX1NUUk9LRSk7Ci0JCW5hbWUgPSBmbXQuc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCWludCBsYXN0X3BvcyA9IGZtdC5sYXN0SW5kZXhPZihBSUZGYWN0b3J5LkZEU19FTlVNX0VORCk7Ci0JCWlmIChsYXN0X3BvcyA9PSAtMSkKLQkJCXJldHVybiAiIjsKLQkJCi0JCXJldHVybiBmbXQuc3Vic3RyaW5nKHBvcysxLCBsYXN0X3Bvcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmdbXSBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiAoU3RyaW5nW10pZmllbGRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCXB1YmxpYyBTdHJpbmdbXSBnZXRUeXBlcygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSl2YWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRGaWVsZChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChTdHJpbmcpZmllbGRzLmdldChpbmRleCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoU3RyaW5nKXZhbHVlcy5nZXQoaW5kZXgpOwotCX0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBmaWVsZHMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgY29udGVudCA9ICI8IiArIGdldE5hbWUoKSArIEFJRkZhY3RvcnkuU0lHTl9TVFJPS0U7Ci0JCWZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCWNvbnRlbnQgKz0gKFN0cmluZylmaWVsZHMuZ2V0KGkpICsgIj0iICsgKFN0cmluZyl2YWx1ZXMuZ2V0KGkpOwotCQkJaWYgKGkgPCBmaWVsZHMuc2l6ZSgpLTEpIHsKLQkJCQljb250ZW50ICs9ICIsIjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudCArICI+IiArIHN1cGVyLnRvU3RyaW5nKCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlRmllbGQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWI4NTJjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB0ZW1wb3JhcnkKLSAqLwotcHVibGljIGNsYXNzIEFJRlR5cGVGaWVsZCB7Ci0JLyoKLQlwcml2YXRlIFN0cmluZyAJZmllbGROYW1lOwotCXByaXZhdGUgSUFJRlR5cGUJZmllbGRUeXBlOwotCQotCXB1YmxpYyBBSUZUeXBlRmllbGQoU3RyaW5nIG5hbWUsIElBSUZUeXBlIHR5cGUpIHsKLQkJdGhpcy5maWVsZE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpZWxkVHlwZSA9IHR5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZSArICI9IiArIHRoaXMuZmllbGRUeXBlLnRvU3RyaW5nKCk7Ci0JfQotCSovCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlRmxvYXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVGbG9hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJkMWQyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlRmxvYXQ7Ci0KLQotcHVibGljIGNsYXNzIEFJRlR5cGVGbG9hdCBleHRlbmRzIEFJRlR5cGUgaW1wbGVtZW50cyBJQUlGVHlwZUZsb2F0IHsKLQlpbnQgc2l6ZTsKLQlib29sZWFuIGNvbXBsZXg7Ci0JYm9vbGVhbiBpbWFnaW5hcnk7Ci0JYm9vbGVhbiBpc2xvbmc7Ci0JCi0JcHVibGljIEFJRlR5cGVGbG9hdChpbnQgc2l6ZSkgewotCQl0aGlzKHNpemUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCX0KLQlwdWJsaWMgQUlGVHlwZUZsb2F0KGludCBzaXplLCBib29sZWFuIGNvbXBsZXgsIGJvb2xlYW4gaW1hZ2luYXJ5LCBib29sZWFuIGlzbG9uZykgewotCQl0aGlzLnNpemUgPSBzaXplOwotCQl0aGlzLmNvbXBsZXggPSBjb21wbGV4OwotCQl0aGlzLmltYWdpbmFyeSA9IGltYWdpbmFyeTsKLQkJdGhpcy5pc2xvbmcgPSBpc2xvbmc7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxleCgpIHsKLQkJcmV0dXJuIGNvbXBsZXg7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzSW1hZ2luYXJ5KCkgewotCQlyZXR1cm4gaW1hZ2luYXJ5OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvbmcoKSB7Ci0JCXJldHVybiBpc2xvbmc7Ci0JfQotCXB1YmxpYyBpbnQgc2l6ZW9mKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJmIiArIHNpemVvZigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVGdW5jdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjFkNmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVGdW5jdGlvbjsKLQotcHVibGljIGNsYXNzIEFJRlR5cGVGdW5jdGlvbiBleHRlbmRzIFR5cGVEZXJpdmVkIGltcGxlbWVudHMgSUFJRlR5cGVGdW5jdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1swXTsKLQkKLQkvLyZBMSxBMiwuLi4vVAkKLQlwdWJsaWMgQUlGVHlwZUZ1bmN0aW9uKFN0cmluZyBmb3JtYXQsIElBSUZUeXBlIGJhc2V0eXBlKSB7Ci0JCXN1cGVyKGJhc2V0eXBlKTsKLQkJcGFyc2UoZm9ybWF0KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHBhcnNlKFN0cmluZyBmbXQpIHsKLQkJYXJncyA9IGZtdC5zcGxpdChBSUZGYWN0b3J5LlNJR05fQ09NTUEpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgY29udGVudCA9ICImIjsKLQkJZm9yIChpbnQgaSA9IDA7IGk8YXJncy5sZW5ndGg7IGkrKykgewotCQkJY29udGVudCArPSBhcmdzW2ldOwotCQkJaWYgKGkgPCBhcmdzLmxlbmd0aCAtIDEpCi0JCQkJY29udGVudCArPSAiLCI7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnQgKyAiLyIgKyBzdXBlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVJbmNvbXBsZXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlSW5jb21wbGV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWM4ODQwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVJbmNvbXBsZXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFJRlR5cGVJbmNvbXBsZXRlIGV4dGVuZHMgQUlGVHlwZSB7Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBBSUZGYWN0b3J5LlNJWkVfSU5WQUxJRDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICI8aW5jb21wbGV0ZSB0eXBlPiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZUludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzBiNGU0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUludDsKLQotCi1wdWJsaWMgY2xhc3MgQUlGVHlwZUludCBleHRlbmRzIFR5cGVJbnRlZ3JhbCBpbXBsZW1lbnRzIElBSUZUeXBlSW50IHsKLQlwcml2YXRlIGludCBzaXplOwotCS8vaXM/Ci0JcHVibGljIEFJRlR5cGVJbnQoaW50IHNpemUpIHsKLQkJdGhpcyh0cnVlLCBzaXplKTsKLQl9Ci0JcHVibGljIEFJRlR5cGVJbnQoYm9vbGVhbiBzaWduZWQsIGludCBzaXplKSB7Ci0JCXN1cGVyKHNpZ25lZCk7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JfQotCXB1YmxpYyBpbnQgc2l6ZW9mKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlTmFtZWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVOYW1lZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTI0YTZhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVOYW1lZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlTmFtZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVHlwZUFnZ3JlZ2F0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlR5cGVOYW1lZCBleHRlbmRzIFR5cGVEZXJpdmVkIGltcGxlbWVudHMgSUFJRlR5cGVOYW1lZCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCi0JLy8lMC97c3xhPWlzNCxiPV4+MC87Ozt9Ci0JcHVibGljIEFJRlR5cGVOYW1lZChTdHJpbmcgbmFtZSwgSUFJRlR5cGUgYmFzZXR5cGUpIHsKLQkJc3VwZXIoYmFzZXR5cGUpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQUlGRmFjdG9yeS5GRFNfTkFNRUQgKyBnZXROYW1lKCkgKyBBSUZGYWN0b3J5LkZEU19OQU1FRF9FTkQgKyBnZXRCYXNlVHlwZSgpLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoaW50IGluZGV4KSB7Ci0JCWlmIChiYXNldHlwZSBpbnN0YW5jZW9mIElUeXBlQWdncmVnYXRlKSB7Ci0JCQlyZXR1cm4gKChJVHlwZUFnZ3JlZ2F0ZSliYXNldHlwZSkuZ2V0RmllbGQoaW5kZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVBvaW50ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVQb2ludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2NmZjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVBvaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVBvaW50ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBSUZUeXBlUG9pbnRlciBleHRlbmRzIFR5cGVEZXJpdmVkIGltcGxlbWVudHMgSUFJRlR5cGVQb2ludGVyIHsKLQlwcml2YXRlIElBSUZUeXBlIGFkZHI7Ci0JLy9jaGFyKjogXmE0YwotCS8vXiUxL3tzMSAqfGE9aXM0LGI9Xj4xLyxjPV4+MS87Ozt9Ci0JLy9eJTEve3MxICp8YT1mOCxiPV4lMi97cyAqfGE9ZjgsYj1ePjIvOzs7fSxjPV4+MS87Ozt9Ci0JcHVibGljIEFJRlR5cGVQb2ludGVyKElBSUZUeXBlIGFkZHIsIElBSUZUeXBlIGJhc2V0eXBlKSB7Ci0JCXN1cGVyKGJhc2V0eXBlKTsKLQkJdGhpcy5hZGRyID0gYWRkcjsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIEFJRkZhY3RvcnkuRkRTX1BPSU5URVIgKyBhZGRyLnRvU3RyaW5nKCkgKyBzdXBlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgaW50IHNpemVvZigpIHsKLQkJcmV0dXJuIHN1cGVyLnNpemVvZigpICsgZ2V0QWRkcmVzc1R5cGUoKS5zaXplb2YoKSArIDE7Ci0JfQotCXB1YmxpYyBJQUlGVHlwZUFkZHJlc3MgZ2V0QWRkcmVzc1R5cGUoKSB7Ci0JCXJldHVybiAoSUFJRlR5cGVBZGRyZXNzKWFkZHI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy9JQUlGVHlwZSB0ZXN0VHlwZSA9IEFJRkZhY3RvcnkuZ2V0QUlGVHlwZSgiXiUxL3tzMSAqfGE9aXM0LGI9Xj4xLyxjPV4+MS87Ozt9Iik7Ci0JCUlBSUZUeXBlIHRlc3RUeXBlID0gQUlGRmFjdG9yeS5nZXRBSUZUeXBlKCJeYTReYTQiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tOiAiICsgKChJQUlGVHlwZVBvaW50ZXIpdGVzdFR5cGUpLmdldEJhc2VUeXBlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS06ICIgKyB0ZXN0VHlwZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLTogIiArIHRlc3RUeXBlLnNpemVvZigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlUmVmZXJlbmNlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNjJlYzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVJlZmVyZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBBSUZUeXBlIGltcGxlbWVudHMgSUFJRlR5cGVSZWZlcmVuY2UgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JLy8+bmFtZS8KLQlwdWJsaWMgQUlGVHlwZVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQlwdWJsaWMgY2hhciB0eXBlKCkgewotCQlyZXR1cm4gQUlGRmFjdG9yeS5GRFNfUkVGRVJFTkNFOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgaW50IHNpemVvZigpIHsKLQkJcmV0dXJuIEFJRkZhY3RvcnkuTk9fU0laRTsKLQl9CQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBBSUZGYWN0b3J5LkZEU19SRUZFUkVOQ0UgKyBnZXROYW1lKCkgKyBBSUZGYWN0b3J5LkZEU19SRUZFUkVOQ0VfRU5EOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVTdHJpbmcuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZGEyNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlU3RyaW5nOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQUlGVHlwZVN0cmluZyBleHRlbmRzIEFJRlR5cGUgaW1wbGVtZW50cyBJQUlGVHlwZVN0cmluZyB7Ci0JaW50IHNpemUgPSBBSUZGYWN0b3J5LlNJWkVfSU5WQUxJRDsKLQkKLQlwdWJsaWMgaW50IHNpemVvZigpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNpemVvZihpbnQgc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoQUlGRmFjdG9yeS5GRFNfU1RSSU5HKTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVTdHJ1Y3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVTdHJ1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjMGVkNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZUeXBlU3RydWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVTdHJ1Y3Q7Ci0KLXB1YmxpYyBjbGFzcyBBSUZUeXBlU3RydWN0IGV4dGVuZHMgVHlwZUFnZ3JlZ2F0ZSBpbXBsZW1lbnRzIElBSUZUeXBlU3RydWN0IHsJCi0JLy9vbmx5IGJhc2UgdHlwZToge3N0cnVjdE5hbWV8ZmxvYXRudW1iZXI9ZjQsaW50bnVtYmVyPWlzNCxzaG9ydG51bWJlcj1pczIsbG9uZ251bWJlcj1pczQsZG91YmxldW1iZXI9Zjg7Ozt9Ci0JLy9jb21wbGV4IHR5cGU6IHtzdHJ1Y3ROYW1lfGZsb2F0bnVtYmVyPWY0LGludG51bWJlcj1pczQsdFN0cjIyPXt0ZXN0U3RydWN0fGFGbG9hdD1mNCxpbnROdW09aXM0Ozs7fSxzaG9ydG51bWJlcj1pczI7Ozt9Ci0JcHVibGljIEFJRlR5cGVTdHJ1Y3QoU3RyaW5nIGZvcm1hdCkgewotCQlzdXBlcihmb3JtYXQpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQUlGRmFjdG9yeS5GRFNfU1RSVUNUX0NMQVNTICsgc3VwZXIudG9TdHJpbmcoKSArIEFJRkZhY3RvcnkuRkRTX1NUUlVDVF9FTkQ7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJSUFJRlR5cGUgdGVzdFR5cGUgPSBBSUZGYWN0b3J5LmdldEFJRlR5cGUoIntzdHJ1Y3ROYW1lfGZsb2F0bnVtYmVyPWY0LGludG51bWJlcj1pczQsdFN0cjIyPXt0ZXN0U3RydWN0fGFGbG9hdD1mNCxpbnROdW09aXM0Ozs7fSxzaG9ydG51bWJlcj1pczI7Ozt9Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLTogIiArIHRlc3RUeXBlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tOiAiICsgdGVzdFR5cGUuc2l6ZW9mKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVVbmlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVVuaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmY4MDguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVVuaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlVW5pb247Ci0KLXB1YmxpYyBjbGFzcyBBSUZUeXBlVW5pb24gZXh0ZW5kcyBUeXBlQWdncmVnYXRlIGltcGxlbWVudHMgSUFJRlR5cGVVbmlvbiB7Ci0JLy8oSUR8TjE9RjEsTjI9RjIpCi0JcHVibGljIEFJRlR5cGVVbmlvbihTdHJpbmcgZm9ybWF0KSB7Ci0JCXN1cGVyKGZvcm1hdCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBBSUZGYWN0b3J5LkZEU19VTklPTiArIHN1cGVyLnRvU3RyaW5nKCkgKyBBSUZGYWN0b3J5LkZEU19VTklPTl9FTkQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVZvaWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlR5cGVWb2lkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGFhMzEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVHlwZVZvaWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVZvaWQ7Ci0KLQotcHVibGljIGNsYXNzIEFJRlR5cGVWb2lkIGV4dGVuZHMgQUlGVHlwZSBpbXBsZW1lbnRzIElBSUZUeXBlVm9pZCB7Ci0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQkKLQlwdWJsaWMgQUlGVHlwZVZvaWQoaW50IHNpemUpIHsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gInYiICsgc2l6ZW9mKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzdjODcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFJRlZhbHVlIGltcGxlbWVudHMgSUFJRlZhbHVlIHsKLQlwcm90ZWN0ZWQgSUFJRlR5cGUgdHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgc2l6ZTsKLQkKLQlwdWJsaWMgQUlGVmFsdWUoSUFJRlR5cGUgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQlwdWJsaWMgSUFJRlR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5OdW1iZXIoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZ2V0Q2hpbGRyZW5OdW1iZXIoKSA+IDApOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldFZhbHVlU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEFJRkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gImVycjogIiArIGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKTsKLQlwdWJsaWMgaW50IHNpemVvZigpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCS8qCi0JcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcihieXRlW10gZGF0YSkgewotCQlyZXR1cm4gYnl0ZUJ1ZmZlcihkYXRhLCAwKTsKLQl9Ci0JcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcihieXRlW10gZGF0YSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGRhdGEsIG9mZnNldCwgZGF0YS5sZW5ndGgpOwotCX0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNyZWF0ZUJ5dGVBcnJheShieXRlW10gZGF0YSwgaW50IGZyb20sIGludCBzaXplKSB7Ci0vL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tZGF0YSBsZW46ICIgKyBkYXRhLmxlbmd0aCAgKyAiLCBmcm9tOiAiICsgZnJvbSArICIsIHNpemU6ICIgKyBzaXplKTsKLQkJYnl0ZVtdIG5ld0J5dGUgPSBuZXcgYnl0ZVtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBmcm9tLCBuZXdCeXRlLCAwLCBzaXplKTsKLQkJcmV0dXJuIG5ld0J5dGU7Ci0JfQotCSovCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUFkZHJlc3MuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5OWM1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlQWRkcmVzcyBleHRlbmRzIEFJRlZhbHVlIGltcGxlbWVudHMgSUFJRlZhbHVlQWRkcmVzcyB7Ci0JU3RyaW5nIGFkZHIgPSAiIjsKLQotCXB1YmxpYyBBSUZWYWx1ZUFkZHJlc3MoSUFJRlR5cGVBZGRyZXNzIHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHR5cGUpOwotCQlwYXJzZShidWZmZXIpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzaXplID0gdHlwZS5zaXplb2YoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotCQkJYWRkciArPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4MDEwMCArIChidWZmZXIuZ2V0KCkgJiAweDAwRkYpKS5zdWJzdHJpbmcoMSk7Ci0JCX0KLQl9Ci0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9ICIweCIgKyBhZGRyOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEFkZHJlc3MoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbHVlSW50ZWdyYWwuYmlnSW50ZWdlclZhbHVlKGdldFZhbHVlU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQXJyYXkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2OWVmOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUFycmF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUFycmF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeS5TaW1wbGVCeXRlQnVmZmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQUlGVmFsdWVBcnJheSBleHRlbmRzIFZhbHVlRGVyaXZlZCBpbXBsZW1lbnRzIElBSUZWYWx1ZUFycmF5IHsKLQlJQUlGVmFsdWVbXSB2YWx1ZXMgPSBuZXcgSUFJRlZhbHVlWzBdOwotCVNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgQUlGVmFsdWVBcnJheShJQUlGVHlwZUFycmF5IHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHR5cGUpOwotCQl0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJSUFJRlR5cGVBcnJheSBhcnJUeXBlID0gKElBSUZUeXBlQXJyYXkpdHlwZTsKLQkJSUFJRlR5cGUgYmFzZVR5cGUgPSBhcnJUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCXRoaXMudmFsdWVzID0gbmV3IElBSUZWYWx1ZVthcnJUeXBlLmdldFJhbmdlKCldOwotCQlmb3IgKGludCBpPTA7IGk8dmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YWx1ZXNbaV0gPSBBSUZGYWN0b3J5LmdldEFJRlZhbHVlKHRoaXMsIGJhc2VUeXBlLCBidWZmZXIpOwotCQkJc2l6ZSArPSB2YWx1ZXNbaV0uc2l6ZW9mKCk7Ci0JCX0KLQl9Ci0JcHVibGljIElBSUZWYWx1ZVtdIGdldFZhbHVlcygpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggPT0gMCAmJiBidWZmZXIgIT0gbnVsbCkgewotCQkJcGFyc2UoYnVmZmVyKTsKLQkJCWJ1ZmZlciA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlTdHJpbmcgY29udGVudCA9ICJbIjsKLQkJSUFJRlZhbHVlW10gYWlmVmFsdWVzID0gZ2V0VmFsdWVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhaWZWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRlbnQgKz0gYWlmVmFsdWVzW2ldLmdldFZhbHVlU3RyaW5nKCk7Ci0JCQlpZiAoaSA8IGFpZlZhbHVlcy5sZW5ndGggLSAxKSB7Ci0JCQkJY29udGVudCArPSAiLCI7Ci0JCQl9Ci0JCX0KLQkJY29udGVudCArPSAiXSI7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQm9vbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVCb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzUxODEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVCb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVCb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlQm9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlQm9vbCBleHRlbmRzIFZhbHVlSW50ZWdyYWwgaW1wbGVtZW50cyBJQUlGVmFsdWVCb29sIHsKLQlib29sZWFuIGJvb2xWYWx1ZTsKLQkKLQlwdWJsaWMgQUlGVmFsdWVCb29sKElBSUZUeXBlQm9vbCB0eXBlLCBTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzdXBlcih0eXBlKTsKLQkJcGFyc2UoYnVmZmVyKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJYm9vbFZhbHVlID0gKGJ1ZmZlci5nZXQoKT4wKTsKLQkJc2l6ZSA9IHR5cGUuc2l6ZW9mKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBTdHJpbmcudmFsdWVPZihib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBib29sVmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVDaGFyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUNoYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiZmQzMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUNoYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUNoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeS5TaW1wbGVCeXRlQnVmZmVyOwotCi1wdWJsaWMgY2xhc3MgQUlGVmFsdWVDaGFyIGV4dGVuZHMgVmFsdWVJbnRlZ3JhbCBpbXBsZW1lbnRzIElBSUZWYWx1ZUNoYXIgewotCWJ5dGUgYnl0ZVZhbHVlOwotCi0JcHVibGljIEFJRlZhbHVlQ2hhcihJQUlGVHlwZUNoYXIgdHlwZSwgU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCWJ5dGVWYWx1ZSA9IGJ1ZmZlci5nZXQoKTsKLQkJc2l6ZSA9IHR5cGUuc2l6ZW9mKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBTdHJpbmcudmFsdWVPZihjaGFyVmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIGNoYXIgY2hhclZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoY2hhcilieXRlVmFsdWUoKTsKLQl9Ci0JcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBieXRlVmFsdWU7Ci0JfQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQl0cnkgewotCQkJY2hhciBjaGFyVmFsdWUgPSBjaGFyVmFsdWUoKTsKLQkJCXJldHVybiAoKENoYXJhY3Rlci5pc0lTT0NvbnRyb2woY2hhclZhbHVlKSAmJiBjaGFyVmFsdWUgIT0gJ1xiJyAmJiBjaGFyVmFsdWUgIT0gJ1x0JyAmJiBjaGFyVmFsdWUgIT0gJ1xuJyAmJiBjaGFyVmFsdWUgIT0gJ1xmJyAmJiBjaGFyVmFsdWUgIT0gJ1xyJykgfHwgY2hhclZhbHVlIDwgMCkgPyAiIiA6IFN0cmluZy52YWx1ZU9mKGNoYXJWYWx1ZSk7CQkKLQkJfSBjYXRjaCAoQUlGRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiZXJyOiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0JLyoKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgY2ggPSAiIisoY2hhcil2YWwrIiI7Ci0JCQotCQlzd2l0Y2ggKHRoaXMudmFsKSB7Ci0JCWNhc2UgNzoKLQkJCWNoID0gIlxcYSI7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJY2ggPSAiXFxiIjsKLQkJCWJyZWFrOwotCQljYXNlIDk6Ci0JCQljaCA9ICJcXHQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQljaCA9ICJcbiI7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJCWNoID0gIlxcdiI7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzoKLQkJCWNoID0gIlxcciI7Ci0JCQlicmVhazsKLQkJY2FzZSAyNzoKLQkJCWNoID0gIlxcZSI7Ci0JCQlicmVhazsKLQkJY2FzZSAzOToKLQkJCWNoID0gIlxcJyI7Ci0JCQlicmVhazsKLQkJY2FzZSA5MjoKLQkJCWNoID0gIlxcXFwiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAodGhpcy52YWwgPCAzMiB8fCB0aGlzLnZhbCA+PSAxMjcpIHsKLQkJCQljaCA9ICJcXCIgKyBJbnRlZ2VyLnRvT2N0YWxTdHJpbmcodmFsICYgMHhmZik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEJ5dGUudG9TdHJpbmcodmFsKSArICIgJyIgKyBjaCArICInIjsKLQl9Ci0JKi8KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQ2hhclBvaW50ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQ2hhclBvaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxYzljYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUNoYXJQb2ludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVDaGFyUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUNoYXJQb2ludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeS5TaW1wbGVCeXRlQnVmZmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQUlGVmFsdWVDaGFyUG9pbnRlciBleHRlbmRzIEFJRlZhbHVlU3RyaW5nIGltcGxlbWVudHMgSUFJRlZhbHVlQ2hhclBvaW50ZXIgewkKLQlJQUlGVmFsdWUgYWRkclZhbHVlOwotCi0JcHVibGljIEFJRlZhbHVlQ2hhclBvaW50ZXIoSUFJRlR5cGVDaGFyUG9pbnRlciB0eXBlLCBTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzdXBlcih0eXBlLCBidWZmZXIpOwotCQkoKEFJRlR5cGVDaGFyUG9pbnRlcil0eXBlKS5zaXplID0gc2l6ZTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJYWRkclZhbHVlID0gQUlGRmFjdG9yeS5nZXRBSUZWYWx1ZShudWxsLCAoKElBSUZUeXBlQ2hhclBvaW50ZXIpdHlwZSkuZ2V0QWRkcmVzc1R5cGUoKSwgYnVmZmVyKTsKLQkJc3VwZXIucGFyc2UoYnVmZmVyKTsKLQkJc2l6ZSArPSBhZGRyVmFsdWUuc2l6ZW9mKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiIjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgQmlnSW50ZWdlciBwb2ludGVyVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbHVlSW50ZWdyYWwuYmlnSW50ZWdlclZhbHVlKGFkZHJWYWx1ZS5nZXRWYWx1ZVN0cmluZygpKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVDbGFzcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjhkODhiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVmFsdWVQYXJlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5LlNpbXBsZUJ5dGVCdWZmZXI7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBSUZWYWx1ZUNsYXNzIGV4dGVuZHMgVmFsdWVBZ2dyZWdhdGUgaW1wbGVtZW50cyBJQUlGVmFsdWVDbGFzcyB7Ci0JcHVibGljIEFJRlZhbHVlQ2xhc3MoSVZhbHVlUGFyZW50IHBhcmVudCwgSUFJRlR5cGVDbGFzcyB0eXBlLCBTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGJ1ZmZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVFbnVtLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2MjY1NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlRW51bSBleHRlbmRzIFZhbHVlSW50ZWdyYWwgaW1wbGVtZW50cyBJQUlGVmFsdWVFbnVtIHsKLQlJQUlGVmFsdWUgdmFsdWU7Ci0JCi0JcHVibGljIEFJRlZhbHVlRW51bShJQUlGVHlwZUVudW0gdHlwZSwgU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJc3VwZXIodHlwZSk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCUlBSUZUeXBlRW51bSBwVHlwZSA9IChJQUlGVHlwZUVudW0pdHlwZTsKLQkJdmFsdWUgPSBBSUZGYWN0b3J5LmdldEFJRlZhbHVlKG51bGwsIHBUeXBlLmdldEJhc2VUeXBlKCksIGJ1ZmZlcik7Ci0JCXNpemUgPSB2YWx1ZS5zaXplb2YoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IHZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUZsb2F0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZUZsb2F0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTdmZjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlRmxvYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVGbG9hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlRmxvYXQgZXh0ZW5kcyBWYWx1ZVBhcmVudCBpbXBsZW1lbnRzIElBSUZWYWx1ZUZsb2F0IHsKLQlCeXRlQnVmZmVyIGJ5dGVCdWZmZXI7Ci0JCi0JcHVibGljIEFJRlZhbHVlRmxvYXQoSUFJRlR5cGVGbG9hdCB0eXBlLCBTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzdXBlcih0eXBlKTsKLQkJcGFyc2UoYnVmZmVyKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJYnl0ZVtdIGRzdCA9IG5ldyBieXRlW3R5cGUuc2l6ZW9mKCldOyAKLQkJZm9yIChpbnQgaT0wOyBpPGRzdC5sZW5ndGg7IGkrKykgewotCQkJZHN0W2ldID0gYnVmZmVyLmdldCgpOwotCQl9Ci0JCWJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAoZHN0LCAwLCBkc3QubGVuZ3RoKTsKLQkJc2l6ZSA9IHR5cGUuc2l6ZW9mKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKGlzRmxvYXQoKSkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZsb2F0VmFsdWUoKSk7Ci0JCX0gZWxzZSBpZiAoaXNEb3VibGUoKSkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGRvdWJsZVZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5hcnJheSgpKTsKLQkJfQotCX0KLQlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0RmxvYXQoKTsKLQkJfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9IGZpbmFsbHkgewotCQkJYnl0ZUJ1ZmZlci5yZXdpbmQoKTsJCQkKLQkJfQotCX0KLQlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnl0ZUJ1ZmZlci5nZXREb3VibGUoKTsKLQkJfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9IGZpbmFsbHkgewotCQkJYnl0ZUJ1ZmZlci5yZXdpbmQoKTsJCQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZSgpIHsKLQkJcmV0dXJuICh0eXBlLnNpemVvZigpID09IDgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KCkgewotCQlyZXR1cm4gKHR5cGUuc2l6ZW9mKCkgPT0gNCk7Ci0JfQotCS8qCi0JcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHRocm93cyBQQ0RJRXhjZXB0aW9uIHsKLQkJZG91YmxlIHJlc3VsdCA9IDA7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IGdldFZhbHVlU3RyaW5nKCk7Ci0JCWlmIChpc05hTih2YWx1ZVN0cmluZykpCi0JCQlyZXN1bHQgPSBEb3VibGUuTmFOOwotCQllbHNlIGlmIChpc05lZ2F0aXZlSW5maW5pdHkodmFsdWVTdHJpbmcpKQotCQkJcmVzdWx0ID0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwotCQllbHNlIGlmIChpc1Bvc2l0aXZlSW5maW5pdHkodmFsdWVTdHJpbmcpKQotCQkJcmVzdWx0ID0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotCQllbHNlIHsJCQotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBEb3VibGUucGFyc2VEb3VibGUodmFsdWVTdHJpbmcpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHRocm93cyBQQ0RJRXhjZXB0aW9uIHsKLQkJZmxvYXQgcmVzdWx0ID0gMDsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gZ2V0VmFsdWVTdHJpbmcoKTsKLQkJaWYgKGlzTmFOKHZhbHVlU3RyaW5nKSkKLQkJCXJlc3VsdCA9IEZsb2F0Lk5hTjsKLQkJZWxzZSBpZiAoaXNOZWdhdGl2ZUluZmluaXR5KHZhbHVlU3RyaW5nKSkKLQkJCXJlc3VsdCA9IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZOwotCQllbHNlIGlmIChpc1Bvc2l0aXZlSW5maW5pdHkodmFsdWVTdHJpbmcpKQotCQkJcmVzdWx0ID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7Ci0JCWVsc2UgewkJCi0JCQl0cnkgewotCQkJCXJlc3VsdCA9IEZsb2F0LnBhcnNlRmxvYXQodmFsdWVTdHJpbmcpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNQb3NpdGl2ZUluZmluaXR5KFN0cmluZyB2YWx1ZVN0cmluZykgewotCQlyZXR1cm4gKHZhbHVlU3RyaW5nICE9IG51bGwpID8gdmFsdWVTdHJpbmcuaW5kZXhPZigiaW5mIikgIT0gLTEgOiBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzTmVnYXRpdmVJbmZpbml0eShTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLQkJcmV0dXJuICh2YWx1ZVN0cmluZyAhPSBudWxsKSA/IHZhbHVlU3RyaW5nLmluZGV4T2YoIi1pbmYiKSAhPSAtMSA6IGZhbHNlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNOYU4oU3RyaW5nIHZhbHVlU3RyaW5nKSB7Ci0JCXJldHVybiAodmFsdWVTdHJpbmcgIT0gbnVsbCkgPyB2YWx1ZVN0cmluZy5pbmRleE9mKCJuYW4iKSAhPSAtMSA6IGZhbHNlOwotCX0KLQkqLwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVGdW5jdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVGdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFlYTZiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5LlNpbXBsZUJ5dGVCdWZmZXI7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBSUZWYWx1ZUZ1bmN0aW9uIGV4dGVuZHMgVmFsdWVEZXJpdmVkIGltcGxlbWVudHMgSUFJRlZhbHVlRnVuY3Rpb24gewotCXB1YmxpYyBBSUZWYWx1ZUZ1bmN0aW9uKElBSUZUeXBlRnVuY3Rpb24gdHlwZSwgU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJc3VwZXIodHlwZSk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXNpemUgPSB0eXBlLnNpemVvZigpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gU3RyaW5nLnZhbHVlT2YoIiIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVJbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNDcyMzUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlSW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlSW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeS5TaW1wbGVCeXRlQnVmZmVyOwotCi1wdWJsaWMgY2xhc3MgQUlGVmFsdWVJbnQgZXh0ZW5kcyBWYWx1ZUludGVncmFsIGltcGxlbWVudHMgSUFJRlZhbHVlSW50IHsKLQlCeXRlQnVmZmVyIGJ5dGVCdWZmZXI7Ci0JCi0JcHVibGljIEFJRlZhbHVlSW50KElBSUZUeXBlSW50IHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHR5cGUpOwotCQlwYXJzZShidWZmZXIpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlieXRlW10gZHN0ID0gbmV3IGJ5dGVbdHlwZS5zaXplb2YoKV07IAotCQlmb3IgKGludCBpPTA7IGk8ZHN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlkc3RbaV0gPSBidWZmZXIuZ2V0KCk7Ci0JCX0KLQkJYnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChkc3QsIDAsIGRzdC5sZW5ndGgpOwotCQlzaXplID0gdHlwZS5zaXplb2YoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmIChpc1Nob3J0KCkpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihzaG9ydFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGlzSW50KCkpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihpbnRWYWx1ZSgpKTsKLQkJfQotCQllbHNlIGlmIChpc0xvbmcoKSkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGxvbmdWYWx1ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGJ5dGVWYWx1ZSgpKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvbmcoKSB7Ci0JCXJldHVybiAoc2l6ZSA9PSA4KTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNTaG9ydCgpIHsKLQkJcmV0dXJuIChzaXplID09IDIpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ludCgpIHsKLQkJcmV0dXJuIChzaXplID09IDQpOwotCX0KLQlwdWJsaWMgYnl0ZVtdIGJ5dGVWYWx1ZSgpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlyZXR1cm4gYnl0ZUJ1ZmZlci5hcnJheSgpOwotCX0KLQlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBieXRlQnVmZmVyLmdldExvbmcoKTsKLQkJfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9IGZpbmFsbHkgewotCQkJYnl0ZUJ1ZmZlci5yZXdpbmQoKTsJCQkKLQkJfQotCX0KLQlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0U2hvcnQoKTsKLQkJfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9IGZpbmFsbHkgewotCQkJYnl0ZUJ1ZmZlci5yZXdpbmQoKTsJCQkKLQkJfQotCX0KLQlwdWJsaWMgaW50IGludFZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnl0ZUJ1ZmZlci5nZXRJbnQoKTsKLQkJfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9IGZpbmFsbHkgewotCQkJYnl0ZUJ1ZmZlci5yZXdpbmQoKTsJCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlTmFtZWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlTmFtZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiZWQ3Ni4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZU5hbWVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlTmFtZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVOYW1lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlTmFtZWQgZXh0ZW5kcyBWYWx1ZURlcml2ZWQgaW1wbGVtZW50cyBJQUlGVmFsdWVOYW1lZCB7Ci0JSUFJRlZhbHVlIHZhbHVlOwotCVN0cmluZyBuYW1lOwotCQotCXB1YmxpYyBBSUZWYWx1ZU5hbWVkKElWYWx1ZVBhcmVudCBwYXJlbnQsIElBSUZUeXBlTmFtZWQgdHlwZSwgU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlKTsKLQkJdGhpcy5uYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXZhbHVlID0gQUlGRmFjdG9yeS5nZXRBSUZWYWx1ZSh0aGlzLCAoKElBSUZUeXBlTmFtZWQpdHlwZSkuZ2V0QmFzZVR5cGUoKSwgYnVmZmVyKTsKLQl9Ci0JcHVibGljIGludCBnZXRDaGlsZHJlbk51bWJlcigpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlyZXR1cm4gdmFsdWUuZ2V0Q2hpbGRyZW5OdW1iZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IHZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotCXB1YmxpYyBJQUlGVmFsdWUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZVBvaW50ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlUG9pbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2I3ZDM4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlUG9pbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZU5hbWVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlUG9pbnRlciBleHRlbmRzIFZhbHVlRGVyaXZlZCBpbXBsZW1lbnRzIElBSUZWYWx1ZVBvaW50ZXIgewotCUlBSUZWYWx1ZSB2YWx1ZTsKLQlJQUlGVmFsdWUgYWRkclZhbHVlOwotCQotCXB1YmxpYyBBSUZWYWx1ZVBvaW50ZXIoSVZhbHVlUGFyZW50IHBhcmVudCwgSUFJRlR5cGVQb2ludGVyIHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCWludCBtYXJrZXIgPSBidWZmZXIuZ2V0KCk7Ci0JCUlBSUZUeXBlUG9pbnRlciBwVHlwZSA9IChJQUlGVHlwZVBvaW50ZXIpdHlwZTsKLQotCQlzd2l0Y2ggKG1hcmtlcikgewotCQljYXNlIDA6Ci0JCQl2YWx1ZSA9IEFJRkZhY3RvcnkuVU5LTk9XTlZBTFVFOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWFkZHJWYWx1ZSA9IEFJRkZhY3RvcnkuZ2V0QUlGVmFsdWUobnVsbCwgcFR5cGUuZ2V0QWRkcmVzc1R5cGUoKSwgYnVmZmVyKTsKLQkJCXZhbHVlID0gQUlGRmFjdG9yeS5nZXRBSUZWYWx1ZShnZXRQYXJlbnQoKSwgcFR5cGUuZ2V0QmFzZVR5cGUoKSwgYnVmZmVyKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl2YWx1ZSA9IEFJRkZhY3RvcnkuVU5LTk9XTlZBTFVFOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2l6ZSA9IGFkZHJWYWx1ZS5zaXplb2YoKSArIHZhbHVlLnNpemVvZigpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIGNoaWxkcmVuIG51bWJlciBvZiBwb2ludGVyLiAgUmV0dXJuIDEgaWYgdGhlIGJhc2UgdHlwZSBpcyBwcmltaXRpdmUgCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZHJlbk51bWJlcigpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpbnQgY2hpbGRyZW4gPSB2YWx1ZS5nZXRDaGlsZHJlbk51bWJlcigpOwotCQlpZiAoY2hpbGRyZW4gPT0gMCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gYWRkclZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIEJpZ0ludGVnZXIgcG9pbnRlclZhbHVlKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWx1ZUludGVncmFsLmJpZ0ludGVnZXJWYWx1ZShhZGRyVmFsdWUuZ2V0VmFsdWVTdHJpbmcoKSk7Ci0JfQotCXB1YmxpYyBJQUlGVmFsdWUgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElBSUZWYWx1ZU5hbWVkKSB7Ci0JCQlyZXR1cm4gKChJQUlGVmFsdWVOYW1lZCl2YWx1ZSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVSZWZlcmVuY2UuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjQ5ZjAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZU5hbWVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSVZhbHVlUGFyZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeS5TaW1wbGVCeXRlQnVmZmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQUlGVmFsdWVSZWZlcmVuY2UgZXh0ZW5kcyBWYWx1ZVBhcmVudCBpbXBsZW1lbnRzIElBSUZWYWx1ZVJlZmVyZW5jZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCi0JcHVibGljIEFJRlZhbHVlUmVmZXJlbmNlKElWYWx1ZVBhcmVudCBwYXJlbnQsIElBSUZUeXBlUmVmZXJlbmNlIHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JCXRoaXMubmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzaXplID0gdHlwZS5zaXplb2YoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IChnZXRQYXJlbnQoKT09bnVsbCk/InVua25vd24gdmFsdWUiOiJyZWY6ICIgKyBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIElWYWx1ZVBhcmVudCBnZXRQYXJlbnQoKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQUlGVmFsdWVOYW1lZCkgewotCQkJaWYgKCgoSUFJRlZhbHVlTmFtZWQpcGFyZW50KS5nZXROYW1lKCkuZXF1YWxzKGdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcGFyZW50LmdldFBhcmVudCgpOwotCQkJfQotCQl9CQkKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIGdldFBhcmVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlU3RyaW5nLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTBkNmY1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVTdHJpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVTdHJpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5LlNpbXBsZUJ5dGVCdWZmZXI7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBSUZWYWx1ZVN0cmluZyBleHRlbmRzIEFJRlZhbHVlIGltcGxlbWVudHMgSUFJRlZhbHVlU3RyaW5nIHsJCi0JcHVibGljIEFJRlZhbHVlU3RyaW5nKElBSUZUeXBlU3RyaW5nIHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHR5cGUpOwotCQlwYXJzZShidWZmZXIpOwotCQkoKEFJRlR5cGVTdHJpbmcpdHlwZSkuc2l6ZSA9IHNpemU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXNpemUgPSBnZXRTaXplKGJ1ZmZlcik7Ci0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOwotCQlmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCQlieXRlc1tpXSA9IGJ1ZmZlci5nZXQoKTsKLQkJfQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTaXplKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCVN0cmluZyBoZXggPSAiIjsKLQkJZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewotCQkJaGV4ICs9IEludGVnZXIudG9IZXhTdHJpbmcoMHgwMTAwICsgKGJ1ZmZlci5nZXQoKSAmIDB4MDBGRikpLnN1YnN0cmluZygxKTsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaGV4LCAxNik7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gIiI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgbGVuZ3RoID0gMzA7Ci0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzJdOwotCQkKLQkJYnl0ZXNbMF0gPSAoYnl0ZSkoKGxlbmd0aCA+PiA4KSAmIDB4ZmYpOwotCQlieXRlc1sxXSA9IChieXRlKShsZW5ndGggJiAweGZmKTsKLQkJCi0JCVN5c3RlbS5lcnIucHJpbnRsbigiLS0tLSBieXRlczogIiArIGJ5dGVzKTsKLQotCQlTdHJpbmcgaGV4ID0gIiI7Ci0JCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJCWhleCArPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4MDEwMCArIChieXRlc1tpXSAmIDB4MDBGRikpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJoZXg6ICIgKyBoZXgpOwotCQl9Ci0KLQkJaW50IHRlc3QgPSAwOwotCQl0cnkgewotCQkJdGVzdCA9IEludGVnZXIucGFyc2VJbnQoaGV4LCAxNik7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0ZXN0ID0gLTE7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tIHRlc3Q6ICIgKyAgdGVzdCk7Ci0JfQotCQkvKgotCQlpbnQgbGVuID0gZGF0YS5nZXQoKTsKLQkJbGVuIDw8PSA4OyAvLzJeOAotCQlsZW4gKz0gZGF0YS5nZXQoKTsKLQkJYnl0ZVtdIGRzdCA9IG5ldyBieXRlW2xlbl07Ci0JCWZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgewotCQkgICAgZHN0W2ldID0gZGF0YS5nZXQoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhkc3QpOwotCQkqLwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVTdHJ1Y3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlU3RydWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzJiYmYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVTdHJ1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVN0cnVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZVN0cnVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlU3RydWN0IGV4dGVuZHMgVmFsdWVBZ2dyZWdhdGUgaW1wbGVtZW50cyBJQUlGVmFsdWVTdHJ1Y3QgewotCXB1YmxpYyBBSUZWYWx1ZVN0cnVjdChJVmFsdWVQYXJlbnQgcGFyZW50LCBJQUlGVHlwZVN0cnVjdCB0eXBlLCBTaW1wbGVCeXRlQnVmZmVyIGJ1ZmZlcikgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGJ1ZmZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVVbmlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvQUlGVmFsdWVVbmlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGRmZGJiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlVW5pb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVVuaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlZhbHVlVW5pb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVHlwZUFnZ3JlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFJRlZhbHVlVW5pb24gZXh0ZW5kcyBWYWx1ZUFnZ3JlZ2F0ZSBpbXBsZW1lbnRzIElBSUZWYWx1ZVVuaW9uIHsKLQlwdWJsaWMgQUlGVmFsdWVVbmlvbihJVmFsdWVQYXJlbnQgcGFyZW50LCBJQUlGVHlwZVVuaW9uIHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgYnVmZmVyKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJSVR5cGVBZ2dyZWdhdGUgdHlwZUFnZ3JlZ2F0ZSA9IChJVHlwZUFnZ3JlZ2F0ZSlnZXRUeXBlKCk7Ci0JCWludCBsZW5ndGggPSB0eXBlQWdncmVnYXRlLmdldE51bWJlck9mQ2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQlJQUlGVHlwZSBhaWZUeXBlID0gdHlwZUFnZ3JlZ2F0ZS5nZXRUeXBlKGkpOwotCQkJSUFJRlZhbHVlIHZhbCA9IEFJRkZhY3RvcnkuZ2V0QUlGVmFsdWUoZ2V0UGFyZW50KCksIGFpZlR5cGUsIGJ1ZmZlcik7Ci0JCQl2YWx1ZXMuYWRkKHZhbCk7Ci0JCQlzaXplICs9IHZhbC5zaXplb2YoKTsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZVVua25vd24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlVW5rbm93bi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODEzZDhmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlVW5rbm93bi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotcHVibGljIGNsYXNzIEFJRlZhbHVlVW5rbm93biBleHRlbmRzIEFJRlZhbHVlIHsKLQlwdWJsaWMgQUlGVmFsdWVVbmtub3duKElBSUZUeXBlIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JCXNpemUgPSBBSUZGYWN0b3J5Lk5PX1NJWkU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7fQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiTk9UIFNVUFBPUlRFRCI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9BSUZWYWx1ZVZvaWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlVm9pZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU2YjEyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL0FJRlZhbHVlVm9pZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeS5TaW1wbGVCeXRlQnVmZmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQUlGVmFsdWVWb2lkIGV4dGVuZHMgQUlGVmFsdWUgewotCXB1YmxpYyBBSUZWYWx1ZVZvaWQoSUFJRlR5cGUgdHlwZSwgU2ltcGxlQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLQkJc3VwZXIodHlwZSk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXNpemUgPSB0eXBlLnNpemVvZigpOwotCX0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWlmIChzaXplID09IDApIHsKLQkJCQlyZXN1bHQgPSAiKE5vIHZhbHVlKSI7Ci0JCQl9Ci0JCQllbHNlICB7Ci0JCQkJcmVzdWx0ID0gIiI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9UeXBlQWdncmVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9UeXBlQWdncmVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWE1N2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVHlwZUFnZ3JlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSVR5cGVBZ2dyZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQWdncmVnYXRlIGV4dGVuZHMgQUlGVHlwZSBpbXBsZW1lbnRzIElUeXBlQWdncmVnYXRlIHsKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyAKLQlwcm90ZWN0ZWQgTGlzdDxJQUlGVHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElBSUZUeXBlPigpOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBUeXBlQWdncmVnYXRlKFN0cmluZyBmb3JtYXQpIHsKLQkJcGFyc2UoZm9ybWF0KTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZ1tdIGdldEZpZWxkcygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSlmaWVsZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JcHVibGljIElBSUZUeXBlW10gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiAoSUFJRlR5cGVbXSl0eXBlcy50b0FycmF5KG5ldyBJQUlGVHlwZVswXSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoU3RyaW5nKWZpZWxkcy5nZXQoaW5kZXgpOwotCX0KLQlwdWJsaWMgSUFJRlR5cGUgZ2V0VHlwZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChJQUlGVHlwZSl0eXBlcy5nZXQoaW5kZXgpOwotCX0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBmaWVsZHMuc2l6ZSgpOwotCX0KLQlwdWJsaWMgaW50IHNpemVvZigpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFN0cmluZyBmbXQpIHsKLQkJZm10ID0gcGFyc2VOYW1lKGZtdCk7Ci0JCXdoaWxlIChmbXQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmbXQgPSBwYXJzZUZpZWxkKGZtdCk7Ci0JCQlmbXQgPSBwYXJzZVR5cGUoZm10KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnNlTmFtZShTdHJpbmcgZm10KSB7Ci0JCWludCBwb3MgPSBmbXQuaW5kZXhPZihBSUZGYWN0b3J5LlNJR05fU1RST0tFKTsKLQkJbmFtZSA9IGZtdC5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJcmV0dXJuIGZtdC5zdWJzdHJpbmcocG9zKzEpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnNlRmllbGQoU3RyaW5nIGZtdCkgewotCQlpbnQgcG9zID0gZm10LmluZGV4T2YoQUlGRmFjdG9yeS5TSUdOX0VRVUFMKTsKLQkJZmllbGRzLmFkZChmbXQuc3Vic3RyaW5nKDAsIHBvcykpOwotCQlyZXR1cm4gZm10LnN1YnN0cmluZyhwb3MrMSk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgcGFyc2VUeXBlKFN0cmluZyBmbXQpIHsKLQkJaW50IHBvcyA9IGdldFNlcGVyYXRlUG9zaXRpb24oZm10KTsKLQkJaWYgKHBvcyA+IC0xKSB7Ci0JCQlTdHJpbmcgdG1wX2ZtdCA9IGZtdC5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCWlmICh0bXBfZm10LmluZGV4T2YoQUlGRmFjdG9yeS5GRFNfU1RSVUNUX0NMQVNTKSA+IC0xKSB7Ci0JCQkJcG9zID0gZ2V0U2VwZXJhdGVQb3NpdGlvbihmbXQsIEFJRkZhY3RvcnkuRkRTX1NUUlVDVF9FTkQpOwotCQkJCWlmIChwb3MgPT0gLTEpIHsKLQkJCQkJcG9zID0gZ2V0U2VwZXJhdGVQb3NpdGlvbihmbXQsIEFJRkZhY3RvcnkuRkRTX0NMQVNTX0VORCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG1wX2ZtdC5pbmRleE9mKEFJRkZhY3RvcnkuRkRTX1VOSU9OKSA+IC0xKSB7Ci0JCQkJcG9zID0gZ2V0U2VwZXJhdGVQb3NpdGlvbihmbXQsIEFJRkZhY3RvcnkuRkRTX1VOSU9OX0VORCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocG9zID09IC0xKSB7Ci0JCQlwb3MgPSBmbXQubGVuZ3RoKCk7Ci0JCX0KLQkJSUFJRlR5cGUgYWlmVHlwZSA9IEFJRkZhY3RvcnkuZ2V0QUlGVHlwZShmbXQuc3Vic3RyaW5nKDAsIHBvcykpOwotCQlzaXplICs9IGFpZlR5cGUuc2l6ZW9mKCk7Ci0JCXR5cGVzLmFkZChhaWZUeXBlKTsKLQkJCi0JCWlmIChwb3MgPT0gZm10Lmxlbmd0aCgpKQotCQkJcmV0dXJuICIiOwotCi0JCXJldHVybiBmbXQuc3Vic3RyaW5nKHBvcysxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFNlcGVyYXRlUG9zaXRpb24oU3RyaW5nIGZtdCkgewotCQlyZXR1cm4gZ2V0U2VwZXJhdGVQb3NpdGlvbihmbXQsICIiKTsKLQl9Ci0JcHJvdGVjdGVkIGludCBnZXRTZXBlcmF0ZVBvc2l0aW9uKFN0cmluZyBmbXQsIFN0cmluZyByZWdleCkgewotCQlpbnQgcmVnZXhfbGVuID0gcmVnZXgubGVuZ3RoKCk7CQkKLQkJaW50IHBvcyA9IGZtdC5pbmRleE9mKHJlZ2V4K0FJRkZhY3RvcnkuU0lHTl9DT01NQSk7Ci0JCWlmIChwb3MgPT0gLTEpIHsKLQkJCWlmIChyZWdleF9sZW4gPiAwKQotCQkJCXBvcyA9IGZtdC5pbmRleE9mKHJlZ2V4KTsKLQkJfQotCQlpZiAocG9zID4gLTEpIHsKLQkJCXBvcyArPSByZWdleF9sZW47Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBnZXROYW1lKCkgKyBBSUZGYWN0b3J5LlNJR05fU1RST0tFOwotCQlmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQljb250ZW50ICs9IChTdHJpbmcpZmllbGRzLmdldChpKSArICI9IiArICgoSUFJRlR5cGUpdHlwZXMuZ2V0KGkpKS50b1N0cmluZygpOwotCQkJaWYgKGkgPCBmaWVsZHMuc2l6ZSgpLTEpIHsKLQkJCQljb250ZW50ICs9ICIsIjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9UeXBlRGVyaXZlZC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVHlwZURlcml2ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3ZDU4OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9UeXBlRGVyaXZlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSVR5cGVEZXJpdmVkOwotCi0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlRGVyaXZlZCBleHRlbmRzIEFJRlR5cGUgaW1wbGVtZW50cyBJVHlwZURlcml2ZWQgewotCXByb3RlY3RlZCBJQUlGVHlwZSBiYXNldHlwZTsKLQkKLQlwdWJsaWMgVHlwZURlcml2ZWQoSUFJRlR5cGUgYmFzZXR5cGUpIHsKLQkJdGhpcy5iYXNldHlwZSA9IGJhc2V0eXBlOwotCX0KLQlwdWJsaWMgSUFJRlR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0JCXJldHVybiBiYXNldHlwZTsKLQl9Ci0JcHVibGljIGludCBzaXplb2YoKSB7Ci0JCXJldHVybiBiYXNldHlwZS5zaXplb2YoKTsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEJhc2VUeXBlKCkudG9TdHJpbmcoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL1R5cGVJbnRlZ3JhbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVHlwZUludGVncmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTQ0ZDcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVHlwZUludGVncmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSVR5cGVJbnRlZ3JhbDsKLQotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUludGVncmFsIGV4dGVuZHMgQUlGVHlwZSBpbXBsZW1lbnRzIElUeXBlSW50ZWdyYWwgewotCWJvb2xlYW4gc2lnbmVkOwotCQotCXB1YmxpYyBUeXBlSW50ZWdyYWwoYm9vbGVhbiBzaWduZWQpIHsKLQkJdGhpcy5zaWduZWQgPSBzaWduZWQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzU2lnbmVkKCkgewotCQlyZXR1cm4gc2lnbmVkOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gImkiICsgKGlzU2lnbmVkKCk/InMiOiJ1IikgKyBzaXplb2YoKTsKLQl9CQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9WYWx1ZUFnZ3JlZ2F0ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVmFsdWVBZ2dyZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3YWQxMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9WYWx1ZUFnZ3JlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVHlwZUFnZ3JlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZUFnZ3JlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkZhY3RvcnkuU2ltcGxlQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbHVlQWdncmVnYXRlIGV4dGVuZHMgVmFsdWVQYXJlbnQgaW1wbGVtZW50cyBJVmFsdWVBZ2dyZWdhdGUgewotCXByb3RlY3RlZCBMaXN0PElBSUZWYWx1ZT4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxJQUlGVmFsdWU+KCk7Ci0JCi0JcHVibGljIFZhbHVlQWdncmVnYXRlKElWYWx1ZVBhcmVudCBwYXJlbnQsIElUeXBlQWdncmVnYXRlIHR5cGUsIFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSk7Ci0JCXBhcnNlKGJ1ZmZlcik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFNpbXBsZUJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0JCUlUeXBlQWdncmVnYXRlIHR5cGVBZ2dyZWdhdGUgPSAoSVR5cGVBZ2dyZWdhdGUpZ2V0VHlwZSgpOwotCQlpbnQgbnVtX2NoaWxkcmVuID0gdHlwZUFnZ3JlZ2F0ZS5nZXROdW1iZXJPZkNoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxudW1fY2hpbGRyZW47IGkrKykgewotCQkJSUFJRlR5cGUgYWlmVHlwZSA9IHR5cGVBZ2dyZWdhdGUuZ2V0VHlwZShpKTsKLQkJCUlBSUZWYWx1ZSB2YWwgPSBBSUZGYWN0b3J5LmdldEFJRlZhbHVlKGdldFBhcmVudCgpLCBhaWZUeXBlLCBidWZmZXIpOwotCQkJdmFsdWVzLmFkZCh2YWwpOwotCQkJc2l6ZSArPSB2YWwuc2l6ZW9mKCk7Ci0JCX0KLQl9CQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5OdW1iZXIoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHZhbHVlcy5zaXplKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSAieyI7Ci0JCWludCBsZW5ndGggPSB2YWx1ZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCUlBSUZWYWx1ZSB2YWx1ZSA9IChJQUlGVmFsdWUpdmFsdWVzLmdldChpKTsKLQkJCWNvbnRlbnQgKz0gdmFsdWUuZ2V0VmFsdWVTdHJpbmcoKTsKLQkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgewotCQkJCWNvbnRlbnQgKz0gIiwiOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50ICsgIn0iOwotCX0KLQlwdWJsaWMgSUFJRlZhbHVlIGdldFZhbHVlKGludCBpbmRleCkgewotCQlyZXR1cm4gKElBSUZWYWx1ZSl2YWx1ZXMuZ2V0KGluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9WYWx1ZURlcml2ZWQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL1ZhbHVlRGVyaXZlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmQ2YmE0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL1ZhbHVlRGVyaXZlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5haWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklUeXBlRGVyaXZlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklWYWx1ZURlcml2ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVmFsdWVQYXJlbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbHVlRGVyaXZlZCBleHRlbmRzIFZhbHVlUGFyZW50IGltcGxlbWVudHMgSVZhbHVlRGVyaXZlZCB7Ci0JcHVibGljIFZhbHVlRGVyaXZlZChJVHlwZURlcml2ZWQgdHlwZSkgewotCQlzdXBlcih0eXBlKTsKLQl9Ci0JcHVibGljIFZhbHVlRGVyaXZlZChJVmFsdWVQYXJlbnQgcGFyZW50LCBJVHlwZURlcml2ZWQgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVmFsdWVJbnRlZ3JhbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9haWYvVmFsdWVJbnRlZ3JhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNkYTk0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL1ZhbHVlSW50ZWdyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuYWlmOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5FeHRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVHlwZUludGVncmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSVZhbHVlSW50ZWdyYWw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUludGVncmFsIGV4dGVuZHMgQUlGVmFsdWUgaW1wbGVtZW50cyBJVmFsdWVJbnRlZ3JhbCB7Ci0JcHVibGljIFZhbHVlSW50ZWdyYWwoSVR5cGVJbnRlZ3JhbCB0eXBlKSB7Ci0JCXN1cGVyKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJpZ0ludGVnZXJWYWx1ZShnZXRWYWx1ZVN0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZShTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLQkJaWYgKHZhbHVlU3RyaW5nLnN0YXJ0c1dpdGgoIkAiKSkgewotCQkJdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQlpbnQgY29sb24gPSB2YWx1ZVN0cmluZy5pbmRleE9mKCc6Jyk7Ci0JCQlpZiAoY29sb24gIT0gLTEpIHsKLQkJCQl2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nLnN1YnN0cmluZyhjb2xvbiArIDEpOyAKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBzcGFjZSA9IHZhbHVlU3RyaW5nLmluZGV4T2YoJyAnKTsKLQkJCWlmIChzcGFjZSAhPSAtMSkgewotCQkJCXZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcuc3Vic3RyaW5nKDAsIHNwYWNlKS50cmltKCk7Ci0JCQl9CQkJCi0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIEV4dEZvcm1hdC5nZXRCaWdJbnRlZ2VyKHZhbHVlU3RyaW5nKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gQmlnSW50ZWdlci5aRVJPOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL1ZhbHVlUGFyZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2FpZi9WYWx1ZVBhcmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ5YjUxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvYWlmL1ZhbHVlUGFyZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmFpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVmFsdWVQYXJlbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbHVlUGFyZW50IGV4dGVuZHMgQUlGVmFsdWUgaW1wbGVtZW50cyBJVmFsdWVQYXJlbnQgewotCXByb3RlY3RlZCBJVmFsdWVQYXJlbnQgcGFyZW50OwotCQotCXB1YmxpYyBWYWx1ZVBhcmVudChJQUlGVHlwZSB0eXBlKSB7Ci0JCXRoaXMobnVsbCwgdHlwZSk7Ci0JfQotCXB1YmxpYyBWYWx1ZVBhcmVudChJVmFsdWVQYXJlbnQgcGFyZW50LCBJQUlGVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHR5cGUpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9CQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmFsdWVQYXJlbnQgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQlwdWJsaWMgSVZhbHVlUGFyZW50IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChwYXJlbnQ9PW51bGwpP3RoaXM6cGFyZW50OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9BYnN0cmFjdEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Fic3RyYWN0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwZGIxNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Fic3RyYWN0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5TZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFdmVudCBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJRXZlbnQgewotCXB1YmxpYyBBYnN0cmFjdEV2ZW50KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50I2NvbnRhaW5zKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhCaXRMaXN0IHFUYXNrcykgewotCQlyZXR1cm4gdGFza3MuaW50ZXJzZWN0cyhxVGFza3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvQnJlYWtwb2ludEluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvQnJlYWtwb2ludEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwMmViNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0JyZWFrcG9pbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUJyZWFrcG9pbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha3BvaW50SW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJQnJlYWtwb2ludEluZm8gewotCXByaXZhdGUgSVBESUJyZWFrcG9pbnQgYnB0OwotCQotCXB1YmxpYyBCcmVha3BvaW50SW5mbyhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQl0aGlzLmJwdCA9IGJwdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElCcmVha3BvaW50SW5mbyNnZXRCcmVha3BvaW50KCkKLQkgKi8KLQlwdWJsaWMgSVBESUJyZWFrcG9pbnQgZ2V0QnJlYWtwb2ludCgpIHsKLQkJcmV0dXJuIGJwdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0NoYW5nZWRFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9DaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjZWUwOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUNoYW5nZWRFdmVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZWRFdmVudCBleHRlbmRzIEFic3RyYWN0RXZlbnQgaW1wbGVtZW50cyBJUERJQ2hhbmdlZEV2ZW50IHsKLQlwcml2YXRlIElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbjsKLQkKLQlwdWJsaWMgQ2hhbmdlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbikgewotCQlzdXBlcigoU2Vzc2lvbilyZWFzb24uZ2V0U2Vzc2lvbigpLCByZWFzb24uZ2V0VGFza3MoKSk7Ci0JCXRoaXMucmVhc29uID0gcmVhc29uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUNoYW5nZWRFdmVudCNnZXRSZWFzb24oKQotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbk9iamVjdCBnZXRSZWFzb24oKSB7Ci0JCXJldHVybiByZWFzb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9Db25uZWN0ZWRFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9Db25uZWN0ZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmMxMTEzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvQ29ubmVjdGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUNvbm5lY3RlZEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RlZEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudCBpbXBsZW1lbnRzIElQRElDb25uZWN0ZWRFdmVudCB7Ci0JcHVibGljIENvbm5lY3RlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcykgewotCQlzdXBlcihyZWFzb24uZ2V0U2Vzc2lvbigpLCB0YXNrcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9DcmVhdGVkRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvQ3JlYXRlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTlhNGIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9DcmVhdGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDcmVhdGVkRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlZEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudCBpbXBsZW1lbnRzIElQRElDcmVhdGVkRXZlbnQgewotCXByaXZhdGUgSVBESVNlc3Npb25PYmplY3QgcmVhc29uOwotCQotCXB1YmxpYyBDcmVhdGVkRXZlbnQoSVBESVNlc3Npb25PYmplY3QgcmVhc29uKSB7Ci0JCXN1cGVyKHJlYXNvbi5nZXRTZXNzaW9uKCksIHJlYXNvbi5nZXRUYXNrcygpKTsKLQkJdGhpcy5yZWFzb24gPSByZWFzb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJQ3JlYXRlZEV2ZW50I2dldFJlYXNvbigpCi0JICovCi0JcHVibGljIElQRElTZXNzaW9uT2JqZWN0IGdldFJlYXNvbigpIHsKLQkJcmV0dXJuIHJlYXNvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0RhdGFSZWFkTWVtb3J5SW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9EYXRhUmVhZE1lbW9yeUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3NThiMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0RhdGFSZWFkTWVtb3J5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURhdGFSZWFkTWVtb3J5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIERhdGFSZWFkTWVtb3J5SW5mbyBpbXBsZW1lbnRzIElQRElEYXRhUmVhZE1lbW9yeUluZm8gewotCVN0cmluZyBhZGRyOwotCWxvbmcgbmV4dFJvdzsKLQlsb25nIHByZXZSb3c7Ci0JbG9uZyBuZXh0UGFnZTsKLQlsb25nIHByZXZQYWdlOwotCWxvbmcgbnVtQnl0ZXM7Ci0JbG9uZyB0b3RhbEJ5dGVzOwotCUlQRElNZW1vcnlbXSBtZW1vcmllczsKLQotCXB1YmxpYyBEYXRhUmVhZE1lbW9yeUluZm8oU3RyaW5nIGFkZHIsIGxvbmcgbmV4dFJvdywgbG9uZyBwcmV2Um93LAotCQkJbG9uZyBuZXh0UGFnZSwgbG9uZyBwcmV2UGFnZSwgbG9uZyBudW1CeXRlcywgbG9uZyB0b3RhbEJ5dGVzLAotCQkJSVBESU1lbW9yeVtdIG1lbW9yaWVzKSB7Ci0JCXRoaXMuYWRkciA9IGFkZHI7Ci0JCXRoaXMubmV4dFJvdyA9IG5leHRSb3c7Ci0JCXRoaXMucHJldlJvdyA9IHByZXZSb3c7Ci0JCXRoaXMubmV4dFBhZ2UgPSBuZXh0UGFnZTsKLQkJdGhpcy5wcmV2UGFnZSA9IHByZXZQYWdlOwotCQl0aGlzLm51bUJ5dGVzID0gbnVtQnl0ZXM7Ci0JCXRoaXMudG90YWxCeXRlcyA9IHRvdGFsQnl0ZXM7Ci0JCXRoaXMubWVtb3JpZXMgPSBtZW1vcmllczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5JUERJRGF0YVJlYWRNZW1vcnlJbmZvI2dldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIGFkZHI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESURhdGFSZWFkTWVtb3J5SW5mbyNnZXRNZW1vcmllcygpCi0JICovCi0JcHVibGljIElQRElNZW1vcnlbXSBnZXRNZW1vcmllcygpIHsKLQkJcmV0dXJuIG1lbW9yaWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLklQRElEYXRhUmVhZE1lbW9yeUluZm8jZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESURhdGFSZWFkTWVtb3J5SW5mbyNnZXROZXh0Um93KCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXROZXh0Um93KCkgewotCQlyZXR1cm4gbmV4dFJvdzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5JUERJRGF0YVJlYWRNZW1vcnlJbmZvI2dldE51bWJlckJ5dGVzKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXROdW1iZXJCeXRlcygpIHsKLQkJcmV0dXJuIG51bUJ5dGVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLklQRElEYXRhUmVhZE1lbW9yeUluZm8jZ2V0UHJldmlvdXNQYWdlKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0JCXJldHVybiBwcmV2UGFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5JUERJRGF0YVJlYWRNZW1vcnlJbmZvI2dldFByZXZpb3VzUm93KCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRQcmV2aW91c1JvdygpIHsKLQkJcmV0dXJuIHByZXZSb3c7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESURhdGFSZWFkTWVtb3J5SW5mbyNnZXRUb3RhbEJ5dGVzKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUb3RhbEJ5dGVzKCkgewotCQlyZXR1cm4gdG90YWxCeXRlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Rlc3Ryb3llZEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Rlc3Ryb3llZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2YzOGEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9EZXN0cm95ZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURlc3Ryb3llZEV2ZW50OwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVzdHJveWVkRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50IGltcGxlbWVudHMgSVBESURlc3Ryb3llZEV2ZW50IHsKLQlwcml2YXRlIElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbjsKLQkKLQlwdWJsaWMgRGVzdHJveWVkRXZlbnQoSVBESVNlc3Npb25PYmplY3QgcmVhc29uKSB7Ci0JCXN1cGVyKHJlYXNvbi5nZXRTZXNzaW9uKCksIHJlYXNvbi5nZXRUYXNrcygpKTsKLQkJdGhpcy5yZWFzb24gPSByZWFzb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRGVzdHJveWVkRXZlbnQjZ2V0UmVhc29uKCkKLQkgKi8KLQlwdWJsaWMgSVBESVNlc3Npb25PYmplY3QgZ2V0UmVhc29uKCkgewotCQlyZXR1cm4gcmVhc29uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvRGlzY29ubmVjdGVkRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvRGlzY29ubmVjdGVkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjNDZhNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Rpc2Nvbm5lY3RlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURpc2Nvbm5lY3RlZEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIERpc2Nvbm5lY3RlZEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudCBpbXBsZW1lbnRzIElQRElEaXNjb25uZWN0ZWRFdmVudCB7Ci0JcHVibGljIERpc2Nvbm5lY3RlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcykgewotCQlzdXBlcihyZWFzb24uZ2V0U2Vzc2lvbigpLCB0YXNrcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9FbmRTdGVwcGluZ1JhbmdlSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9FbmRTdGVwcGluZ1JhbmdlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFhODNhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvRW5kU3RlcHBpbmdSYW5nZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFbmRTdGVwcGluZ1JhbmdlSW5mbzsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRTdGVwcGluZ1JhbmdlSW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJRW5kU3RlcHBpbmdSYW5nZUluZm8gewotCXByaXZhdGUgSVBESUxvY2F0b3IgbG9jYXRvcjsKLQkKLQlwdWJsaWMgRW5kU3RlcHBpbmdSYW5nZUluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESUxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRW5kU3RlcHBpbmdSYW5nZUluZm8jZ2V0TG9jYXRvcigpCi0JICovCi0JcHVibGljIElQRElMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0JCXJldHVybiBsb2NhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvRXJyb3JFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9FcnJvckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDY0NTIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9FcnJvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXJyb3JFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudCBpbXBsZW1lbnRzIElQRElFcnJvckV2ZW50IHsKLQlwcml2YXRlIElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbjsKLQkKLQlwdWJsaWMgRXJyb3JFdmVudChJUERJU2Vzc2lvbk9iamVjdCByZWFzb24pIHsKLQkJc3VwZXIocmVhc29uLmdldFNlc3Npb24oKSwgcmVhc29uLmdldFRhc2tzKCkpOwotCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFcnJvckV2ZW50I2dldFJlYXNvbigpCi0JICovCi0JcHVibGljIElQRElTZXNzaW9uT2JqZWN0IGdldFJlYXNvbigpIHsKLQkJcmV0dXJuIHJlYXNvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Vycm9ySW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9FcnJvckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkODYwNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0Vycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5TZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXJyb3JJbmZvOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEVycm9ySW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJRXJyb3JJbmZvIHsKLQlwcml2YXRlIGludCBjb2RlOwotCXByaXZhdGUgU3RyaW5nIGRldGFpbE1zZzsKLQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQlwdWJsaWMgRXJyb3JJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCBjb2RlLCBTdHJpbmcgbXNnLCBTdHJpbmcgZGV0YWlsTXNnKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzKTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQkJdGhpcy5tc2cgPSBtc2c7Ci0JCXRoaXMuZGV0YWlsTXNnID0gZGV0YWlsTXNnOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUVycm9ySW5mbyNnZXRDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvZGUoKSB7Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUVycm9ySW5mbyNnZXREZXRhaWxNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERldGFpbE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBkZXRhaWxNc2c7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXJyb3JJbmZvI2dldE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1zZzsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvRXhpdEluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvRXhpdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhYzYyYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0V4aXRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFeGl0SW5mbzsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGl0SW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJRXhpdEluZm8gewotCXByaXZhdGUgaW50IGNvZGU7Ci0KLQlwdWJsaWMgRXhpdEluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IGNvZGUpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQl0aGlzLmNvZGUgPSBjb2RlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4aXRJbmZvI2dldENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGNvZGU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L0xvY2F0aW9uUmVhY2hlZEluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvTG9jYXRpb25SZWFjaGVkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ3MzAxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvTG9jYXRpb25SZWFjaGVkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUxvY2F0aW9uUmVhY2hlZEluZm87Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25SZWFjaGVkSW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJTG9jYXRpb25SZWFjaGVkSW5mbyB7Ci0JcHJpdmF0ZSBJUERJTG9jYXRvciBsb2NhdG9yOwotCi0JcHVibGljIExvY2F0aW9uUmVhY2hlZEluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESUxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRpb25SZWFjaGVkSW5mbyNnZXRMb2NhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVBESUxvY2F0b3IgZ2V0TG9jYXRvcigpIHsKLQkJcmV0dXJuIGxvY2F0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9NZW1vcnlCbG9ja0luZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvTWVtb3J5QmxvY2tJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NTA0Y2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9NZW1vcnlCbG9ja0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElNZW1vcnlCbG9ja0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnlCbG9jazsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW1vcnlCbG9ja0luZm8gZXh0ZW5kcyBTZXNzaW9uT2JqZWN0IGltcGxlbWVudHMgSVBESU1lbW9yeUJsb2NrSW5mbyB7Ci0JcHJpdmF0ZSBCaWdJbnRlZ2VyW10gYWRkcmVzc2VzOwotCXByaXZhdGUgSVBESU1lbW9yeUJsb2NrIGJsb2NrOwotCQotCXB1YmxpYyBNZW1vcnlCbG9ja0luZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgQmlnSW50ZWdlcltdIGFkZHJlc3NlcywgSVBESU1lbW9yeUJsb2NrIGJsb2NrKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzKTsKLQkJdGhpcy5hZGRyZXNzZXMgPSBhZGRyZXNzZXM7Ci0JCXRoaXMuYmxvY2sgPSBibG9jazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElNZW1vcnlCbG9ja0luZm8jZ2V0QWRkcmVzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlcltdIGdldEFkZHJlc3NlcygpIHsKLQkJcmV0dXJuIGFkZHJlc3NlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElNZW1vcnlCbG9ja0luZm8jZ2V0TWVtb3J5QmxvY2soKQotCSAqLwotCXB1YmxpYyBJUERJTWVtb3J5QmxvY2sgZ2V0TWVtb3J5QmxvY2soKSB7Ci0JCXJldHVybiBibG9jazsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L1Jlc3RhcnRlZEV2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L1Jlc3RhcnRlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDE5NzUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9SZXN0YXJ0ZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVJlc3RhcnRlZEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3RhcnRlZEV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudCBpbXBsZW1lbnRzIElQRElSZXN0YXJ0ZWRFdmVudCB7Ci0JcHVibGljIFJlc3RhcnRlZEV2ZW50KFNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcykgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9SZXN1bWVkRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvUmVzdW1lZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYmQ4MGYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9SZXN1bWVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJUmVzdW1lZEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3VtZWRFdmVudCBleHRlbmRzIEFic3RyYWN0RXZlbnQgaW1wbGVtZW50cyBJUERJUmVzdW1lZEV2ZW50IHsKLQlwcml2YXRlIGludCB0eXBlOwotCQotCXB1YmxpYyBSZXN1bWVkRXZlbnQoSVBESVNlc3Npb25PYmplY3QgcmVhc29uLCBCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSkgewotCQlzdXBlcihyZWFzb24uZ2V0U2Vzc2lvbigpLCB0YXNrcyk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJUmVzdW1lZEV2ZW50I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9TaWduYWxJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L1NpZ25hbEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkY2Q2ZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L1NpZ25hbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVNpZ25hbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWw7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsSW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJU2lnbmFsSW5mbyB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjOwotCXByaXZhdGUgSVBESVNpZ25hbCBzaWduYWw7Ci0JcHJpdmF0ZSBJUERJTG9jYXRvciBsb2NhdG9yOwotCQotCXB1YmxpYyBTaWduYWxJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgSVBESVNpZ25hbCBzaWduYWwsIElQRElMb2NhdG9yIGxvY2F0b3IpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnNpZ25hbCA9IHNpZ25hbDsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTaWduYWxJbmZvI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzYzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTaWduYWxJbmZvI2dldExvY2F0b3IoKQotCSAqLwotCXB1YmxpYyBJUERJTG9jYXRvciBnZXRMb2NhdG9yKCkgewotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTaWduYWxJbmZvI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2lnbmFsSW5mbyNnZXRTaWduYWwoKQotCSAqLwotCXB1YmxpYyBJUERJU2lnbmFsIGdldFNpZ25hbCgpIHsKLQkJcmV0dXJuIHNpZ25hbDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9TdGFydGVkRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvU3RhcnRlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Y2VmMWQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9TdGFydGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU3RhcnRlZEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0ZWRFdmVudCBleHRlbmRzIEFic3RyYWN0RXZlbnQgaW1wbGVtZW50cyBJUERJU3RhcnRlZEV2ZW50IHsKLQlwdWJsaWMgU3RhcnRlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgQml0TGlzdCB0YXNrcykgewotCQlzdXBlcihyZWFzb24uZ2V0U2Vzc2lvbigpLCB0YXNrcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9TdXNwZW5kZWRFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9TdXNwZW5kZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQ5MjMyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvU3VzcGVuZGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElTdXNwZW5kZWRFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXNwZW5kZWRFdmVudCBleHRlbmRzIEFic3RyYWN0RXZlbnQgaW1wbGVtZW50cyBJUERJU3VzcGVuZGVkRXZlbnQgewotCXByaXZhdGUgSVBESVNlc3Npb25PYmplY3QgcmVhc29uOwotCXByaXZhdGUgU3RyaW5nW10gdmFyczsKLQlwcml2YXRlIGludCB0aHJlYWRfaWQ7Ci0JcHJpdmF0ZSBpbnQgbGV2ZWw7Ci0JcHJpdmF0ZSBpbnQgZGVwdGg7Ci0JCi0JcHVibGljIFN1c3BlbmRlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgU3RyaW5nW10gdmFycywgaW50IHRocmVhZF9pZCwgaW50IGxldmVsLCBpbnQgZGVwdGgpIHsKLQkJc3VwZXIocmVhc29uLmdldFNlc3Npb24oKSwgcmVhc29uLmdldFRhc2tzKCkpOwotCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQkJdGhpcy52YXJzID0gdmFyczsKLQkJdGhpcy50aHJlYWRfaWQgPSB0aHJlYWRfaWQ7Ci0JCXRoaXMubGV2ZWwgPSBsZXZlbDsKLQkJdGhpcy5kZXB0aCA9IGRlcHRoOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVN1c3BlbmRlZEV2ZW50I2dldERlcHRoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlcHRoKCkgewotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU3VzcGVuZGVkRXZlbnQjZ2V0TGV2ZWwoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElTdXNwZW5kZWRFdmVudCNnZXRSZWFzb24oKQotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbk9iamVjdCBnZXRSZWFzb24oKSB7Ci0JCXJldHVybiByZWFzb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU3VzcGVuZGVkRXZlbnQjZ2V0VGhyZWFkSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGhyZWFkSUQoKSB7Ci0JCXJldHVybiB0aHJlYWRfaWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU3VzcGVuZGVkRXZlbnQjZ2V0VXBkYXRlZFZhcmlhYmxlcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFVwZGF0ZWRWYXJpYWJsZXMoKSB7Ci0JCXJldHVybiB2YXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvVGhyZWFkSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9UaHJlYWRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjA1YTQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9ldmVudC9UaHJlYWRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVRocmVhZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkSW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJVGhyZWFkSW5mbyB7Ci0JcHJpdmF0ZSBpbnQgdGhyZWFkX2lkOwotCXByaXZhdGUgSVBESVRocmVhZCB0aHJlYWQ7Ci0JCi0JcHVibGljIFRocmVhZEluZm8oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IHRocmVhZF9pZCwgSVBESVRocmVhZCB0aHJlYWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQl0aGlzLnRocmVhZF9pZCA9IHRocmVhZF9pZDsKLQkJdGhpcy50aHJlYWQgPSB0aHJlYWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJVGhyZWFkSW5mbyNnZXRUaHJlYWQoKQotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkIGdldFRocmVhZCgpIHsKLQkJcmV0dXJuIHRocmVhZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElUaHJlYWRJbmZvI2dldFRocmVhZElEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRocmVhZElEKCkgewotCQlyZXR1cm4gdGhyZWFkX2lkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvVmFyaWFibGVJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL2V2ZW50L1ZhcmlhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTljMDBiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvZXZlbnQvVmFyaWFibGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVZhcmlhYmxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmxlSW5mbyBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJVmFyaWFibGVJbmZvIHsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSVBESVZhcmlhYmxlIHZhcjsKLQkKLQlwdWJsaWMgVmFyaWFibGVJbmZvKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBuYW1lLCBJUERJVmFyaWFibGUgdmFyKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52YXIgPSB2YXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJVmFyaWFibGVJbmZvI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJVmFyaWFibGVJbmZvI2dldFZhcmlhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlIGdldFZhcmlhYmxlKCkgewotCQlyZXR1cm4gdmFyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9BYnN0cmFjdFBESU1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9BYnN0cmFjdFBESU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5MjFmNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvQWJzdHJhY3RQRElNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBESU1hbmFnZXIgZXh0ZW5kcyBTZXNzaW9uT2JqZWN0IGltcGxlbWVudHMgSVBESU1hbmFnZXIgewotCWJvb2xlYW4gYXV0b1VwZGF0ZTsKLQotCXB1YmxpYyBBYnN0cmFjdFBESU1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbiwgYm9vbGVhbiB1cGRhdGUpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgbnVsbCk7Ci0JCWF1dG9VcGRhdGUgPSB1cGRhdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElNYW5hZ2VyI3NldEF1dG9VcGRhdGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvVXBkYXRlKGJvb2xlYW4gdXBkYXRlKSB7Ci0JCWF1dG9VcGRhdGUgPSB1cGRhdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElNYW5hZ2VyI2lzQXV0b1VwZGF0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvVXBkYXRlKCkgewotCQlyZXR1cm4gYXV0b1VwZGF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaHV0ZG93bigpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL0JyZWFrcG9pbnRNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvQnJlYWtwb2ludE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3ZjkyMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvQnJlYWtwb2ludE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQWRkcmVzc0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRnVuY3Rpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxpbmVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJTG9jYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFkZHJlc3NCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4Y2VwdGlvbnBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMb2NhdGlvbkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtwb2ludE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cyBJUERJQnJlYWtwb2ludE1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgSVBESUJyZWFrcG9pbnRbXSBFTVBUWV9CUkVBS1BPSU5UUyA9IHt9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIEVYQ0VQVElPTl9GVU5DUyA9IG5ldyBTdHJpbmdbXSB7Il9fY3hhX3Rocm93IiwgIl9fY3hhX2JlZ2luX2NhdGNoIn07Ci0KLQlwcml2YXRlIExpc3Q8SVBESUJyZWFrcG9pbnQ+IGJyZWFrTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxJUERJQnJlYWtwb2ludD4oKSk7Ci0JCi0JcHJpdmF0ZSBJUERJQnJlYWtwb2ludFtdIGV4Y2VwdGlvbkJwcyA9IG5ldyBJUERJQnJlYWtwb2ludFsyXTsKLQkKLQlwcml2YXRlIGZpbmFsIGludCBFWENFUFRJT05fVEhST1dfSURYID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBFWENFUFRJT05fQ0FUQ0hfSURYID0gMTsKLQkKLQlwdWJsaWMgQnJlYWtwb2ludE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlzdXBlcihzZXNzaW9uLCBmYWxzZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNhZGRTZXRCcmVha3BvaW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNldEJyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZChicmVha3BvaW50LmdldEJyZWFrcG9pbnRJRCgpKSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgUERJUmVzb3VyY2VzLmdldFN0cmluZygicGRpLkJyZWFrcG9pbnRNYW5hZ2VyLk5vdF9hX1BUUF9icmVha3BvaW50IikpOwkJCQotCQl9Ci0JCWJyZWFrcG9pbnQuZ2V0VGFza3MoKS5vcih0YXNrcyk7Ci0JCWJyZWFrcG9pbnQuZ2V0UGVuZGluZ1Rhc2tzKCkub3IodGFza3MpOwotCQlzZXRQZW5kaW5nQnJlYWtwb2ludChicmVha3BvaW50KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUJyZWFrcG9pbnRNYW5hZ2VyI2NyZWF0ZUFkZHJlc3NMb2NhdGlvbihqYXZhLm1hdGguQmlnSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgSVBESUFkZHJlc3NMb2NhdGlvbiBjcmVhdGVBZGRyZXNzTG9jYXRpb24oQmlnSW50ZWdlciBhZGRyZXNzKSB7Ci0JCXJldHVybiBQRElMb2NhdGlvbkZhY3RvcnkubmV3QWRkcmVzc0xvY2F0aW9uKGFkZHJlc3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjY3JlYXRlQ29uZGl0aW9uKGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUERJQ29uZGl0aW9uIGNyZWF0ZUNvbmRpdGlvbihpbnQgaWdub3JlQ291bnQsIFN0cmluZyBleHByZXNzaW9uLCBTdHJpbmdbXSB0aWRzKSB7Ci0JCXJldHVybiBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld0NvbmRpdGlvbihpZ25vcmVDb3VudCwgZXhwcmVzc2lvbiwgdGlkcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNjcmVhdGVGdW5jdGlvbkxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElGdW5jdGlvbkxvY2F0aW9uIGNyZWF0ZUZ1bmN0aW9uTG9jYXRpb24oU3RyaW5nIGZpbGUsIFN0cmluZyBmdW5jdGlvbikgewotCQlyZXR1cm4gUERJTG9jYXRpb25GYWN0b3J5Lm5ld0Z1bmN0aW9uTG9jYXRpb24oZmlsZSwgZnVuY3Rpb24pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjY3JlYXRlTGluZUxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUxpbmVMb2NhdGlvbiBjcmVhdGVMaW5lTG9jYXRpb24oU3RyaW5nIGZpbGUsIGludCBsaW5lKSB7Ci0JCXJldHVybiBQRElMb2NhdGlvbkZhY3RvcnkubmV3TGluZUxvY2F0aW9uKGZpbGUsIGxpbmUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjZGVsZXRlQWxsQnJlYWtwb2ludHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEJyZWFrcG9pbnRzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElCcmVha3BvaW50W10gcGRpQnJlYWtwb2ludHMgPSBnZXRBbGxQRElCcmVha3BvaW50cygpOwotCQlmb3IgKElQRElCcmVha3BvaW50IHBkaUJwdCA6IHBkaUJyZWFrcG9pbnRzKSB7Ci0JCQlkZWxldGVCcmVha3BvaW50KHNlc3Npb24uZ2V0VGFza3MoKSwgcGRpQnB0KTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjZGVsZXRlQWxsQnJlYWtwb2ludHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEJyZWFrcG9pbnRzKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJQnJlYWtwb2ludFtdIHBkaUJyZWFrcG9pbnRzID0gZ2V0QWxsUERJQnJlYWtwb2ludHMoKTsKLQkJZm9yIChJUERJQnJlYWtwb2ludCBwZGlCcHQgOiBwZGlCcmVha3BvaW50cykgewotCQkJaWYgKHBkaUJwdC5nZXRUYXNrcygpLmludGVyc2VjdHModGFza3MpKSB7Ci0JCQkJZGVsZXRlQnJlYWtwb2ludCh0YXNrcywgcGRpQnB0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjZGVsZXRlQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVCcmVha3BvaW50KEJpdExpc3QgdGFza3MsIElQRElCcmVha3BvaW50IGJyZWFrcG9pbnQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWQoYnJlYWtwb2ludC5nZXRCcmVha3BvaW50SUQoKSkpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsIFBESVJlc291cmNlcy5nZXRTdHJpbmcoInBkaS5CcmVha3BvaW50TWFuYWdlci5Ob3RfYV9QVFBfYnJlYWtwb2ludCIpKTsJCQkKLQkJfQotCQlicmVha3BvaW50LnNldERlbGV0ZWQoKTsKLQkJZGVsZXRlUGVuZGluZ0JyZWFrcG9pbnQoYnJlYWtwb2ludCwgdHJ1ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNkZWxldGVTZXRCcmVha3BvaW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVNldEJyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZChicmVha3BvaW50LmdldEJyZWFrcG9pbnRJRCgpKSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgUERJUmVzb3VyY2VzLmdldFN0cmluZygicGRpLkJyZWFrcG9pbnRNYW5hZ2VyLk5vdF9hX1BUUF9icmVha3BvaW50IikpOwkJCQotCQl9Ci0JCWJyZWFrcG9pbnQuZ2V0VGFza3MoKS5hbmROb3QodGFza3MpOwotCQlicmVha3BvaW50LmdldFBlbmRpbmdUYXNrcygpLmFuZE5vdCh0YXNrcyk7Ci0JCWJyZWFrcG9pbnQuc2V0RGVsZXRlZCgpOwotCQlkZWxldGVQZW5kaW5nQnJlYWtwb2ludChicmVha3BvaW50LCBmYWxzZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNkaXNhYmxlQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicmVha3BvaW50KSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkKGJyZWFrcG9pbnQuZ2V0QnJlYWtwb2ludElEKCkpKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCBQRElSZXNvdXJjZXMuZ2V0U3RyaW5nKCJwZGkuQnJlYWtwb2ludE1hbmFnZXIuTm90X2FfUFRQX2JyZWFrcG9pbnQiKSk7CQkJCi0JCX0KLQkJYnJlYWtwb2ludC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0U2Vzc2lvbigpLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3Qoc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldERpc2FibGVCcmVha3BvaW50UmVxdWVzdCh0YXNrcywgYnJlYWtwb2ludCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjZW5hYmxlQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVCcmVha3BvaW50KEJpdExpc3QgdGFza3MsIElQRElCcmVha3BvaW50IGJyZWFrcG9pbnQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWQoYnJlYWtwb2ludC5nZXRCcmVha3BvaW50SUQoKSkpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsIFBESVJlc291cmNlcy5nZXRTdHJpbmcoInBkaS5CcmVha3BvaW50TWFuYWdlci5Ob3RfYV9QVFBfYnJlYWtwb2ludCIpKTsJCQkKLQkJfQotCQlicmVha3BvaW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWdldFNlc3Npb24oKS5nZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRFbmFibGVCcmVha3BvaW50UmVxdWVzdCh0YXNrcywgYnJlYWtwb2ludCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjZ2V0QnJlYWtwb2ludChpbnQpCi0JICovCi0JcHVibGljIElQRElCcmVha3BvaW50IGdldEJyZWFrcG9pbnQoaW50IGlkKSB7Ci0JCUlQRElCcmVha3BvaW50W10gcGRpQnJlYWtwb2ludHMgPSBnZXRBbGxQRElCcmVha3BvaW50cygpOwotCQlmb3IgKElQRElCcmVha3BvaW50IHBkaUJyZWFrcG9pbnQgOiBwZGlCcmVha3BvaW50cykgewotCQkJaWYgKHBkaUJyZWFrcG9pbnQuZ2V0QnJlYWtwb2ludElEKCkgPT0gaWQpIHsKLQkJCQlyZXR1cm4gcGRpQnJlYWtwb2ludDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUJyZWFrcG9pbnRNYW5hZ2VyI3NldEFkZHJlc3NCcmVha3BvaW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUFkZHJlc3NMb2NhdGlvbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24sIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElBZGRyZXNzQnJlYWtwb2ludCBzZXRBZGRyZXNzQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgSVBESUFkZHJlc3NMb2NhdGlvbiBsb2NhdGlvbiwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZGVmZXJyZWQsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7CQkKLQkJSVBESUFkZHJlc3NCcmVha3BvaW50IGJrcHQgPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld0FkZHJlc3NCcmVha3BvaW50KHNlc3Npb24sIHRhc2tzLCB0eXBlLCBsb2NhdGlvbiwgY29uZGl0aW9uLCBlbmFibGVkKTsKLQkJc2V0TmV3TG9jYXRpb25CcmVha3BvaW50KGJrcHQsIGRlZmVycmVkKTsKLQkJcmV0dXJuIGJrcHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNzZXRDb25kaXRpb24ob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmRpdGlvbihCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicmVha3BvaW50LCBJUERJQ29uZGl0aW9uIG5ld0NvbmRpdGlvbikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlbGV0ZUJyZWFrcG9pbnQodGFza3MsIGJyZWFrcG9pbnQpOwotCQlicmVha3BvaW50LnNldENvbmRpdGlvbihuZXdDb25kaXRpb24pOwotCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQRElMb2NhdGlvbkJyZWFrcG9pbnQpIHsKLQkJCXNldExvY2F0aW9uQnJlYWtwb2ludCgoSVBESUxvY2F0aW9uQnJlYWtwb2ludClicmVha3BvaW50KTsKLQkJfSBlbHNlIGlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSVBESVdhdGNocG9pbnQpIHsKLQkJCXNldFdhdGNocG9pbnQoKElQRElXYXRjaHBvaW50KWJyZWFrcG9pbnQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgUERJUmVzb3VyY2VzLmdldFN0cmluZygicGRpLkJyZWFrcG9pbnRNYW5hZ2VyLk5vdF9hX1BUUF9icmVha3BvaW50IikpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNzZXRFeGNlcHRpb25wb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElFeGNlcHRpb25wb2ludCBzZXRFeGNlcHRpb25wb2ludChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgY2xhenosIGJvb2xlYW4gc3RvcE9uVGhyb3csIGJvb2xlYW4gc3RvcE9uQ2F0Y2gsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICghc3RvcE9uVGhyb3cgJiYgIXN0b3BPbkNhdGNoKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTXVzdCBzdXNwZW5kIG9uIHRocm93IG9yIGNhdGNoIik7Ci0JCX0KLQkJTGlzdDxJUERJRnVuY3Rpb25CcmVha3BvaW50PiBmdW5jQnB0TGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBESUZ1bmN0aW9uQnJlYWtwb2ludD4oMik7Ci0JCWlmIChzdG9wT25UaHJvdykgewotCQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbkJwcykgewotCQkJCWludCBpZCA9IEVYQ0VQVElPTl9USFJPV19JRFg7Ci0JCQkJaWYgKGV4Y2VwdGlvbkJwc1tFWENFUFRJT05fVEhST1dfSURYXSA9PSBudWxsKSB7Ci0JCQkJCUlQRElGdW5jdGlvbkxvY2F0aW9uIGxvY2F0aW9uID0gUERJTG9jYXRpb25GYWN0b3J5Lm5ld0Z1bmN0aW9uTG9jYXRpb24obnVsbCwgRVhDRVBUSU9OX0ZVTkNTW2lkXSk7Ci0JCQkJCUlQRElGdW5jdGlvbkJyZWFrcG9pbnQgYnAgPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld0Z1bmN0aW9uQnJlYWtwb2ludChzZXNzaW9uLCB0YXNrcywgSVBESUJyZWFrcG9pbnQuUkVHVUxBUiwgbG9jYXRpb24sIG51bGwsIGVuYWJsZWQpOwotCQkJCQlzZXRMb2NhdGlvbkJyZWFrcG9pbnQoYnApOwotCQkJCQlleGNlcHRpb25CcHNbaWRdID0gYnA7Ci0JCQkJCWZ1bmNCcHRMaXN0LmFkZChicCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzdG9wT25DYXRjaCkgewotCQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbkJwcykgewotCQkJCWludCBpZCA9IEVYQ0VQVElPTl9USFJPV19JRFg7Ci0JCQkJaWYgKGV4Y2VwdGlvbkJwc1tpZF0gPT0gbnVsbCkgewotCQkJCQlJUERJRnVuY3Rpb25Mb2NhdGlvbiBsb2NhdGlvbiA9IFBESUxvY2F0aW9uRmFjdG9yeS5uZXdGdW5jdGlvbkxvY2F0aW9uKG51bGwsIEVYQ0VQVElPTl9GVU5DU1tpZF0pOwotCQkJCQlJUERJRnVuY3Rpb25CcmVha3BvaW50IGJwID0gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdGdW5jdGlvbkJyZWFrcG9pbnQoc2Vzc2lvbiwgdGFza3MsIElQRElCcmVha3BvaW50LlJFR1VMQVIsIGxvY2F0aW9uLCBudWxsLCBlbmFibGVkKTsKLQkJCQkJc2V0TG9jYXRpb25CcmVha3BvaW50KGJwKTsKLQkJCQkJZXhjZXB0aW9uQnBzW2lkXSA9IGJwOwotCQkJCQlmdW5jQnB0TGlzdC5hZGQoYnApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJUERJRXhjZXB0aW9ucG9pbnQgZXhjcCA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3RXhjZXB0aW9ucG9pbnQoc2Vzc2lvbiwgdGFza3MsIGNsYXp6LCBzdG9wT25UaHJvdywgc3RvcE9uQ2F0Y2gsIG51bGwsIGVuYWJsZWQsIGZ1bmNCcHRMaXN0LnRvQXJyYXkobmV3IElQRElGdW5jdGlvbkJyZWFrcG9pbnRbMF0pKTsKLQkJYWRkQnJlYWtwb2ludChleGNwKTsKLQkJcmV0dXJuIGV4Y3A7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciNzZXRGdW5jdGlvbkJyZWFrcG9pbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRnVuY3Rpb25Mb2NhdGlvbiwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24sIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElGdW5jdGlvbkJyZWFrcG9pbnQgc2V0RnVuY3Rpb25CcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCB0eXBlLCBJUERJRnVuY3Rpb25Mb2NhdGlvbiBsb2NhdGlvbiwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZGVmZXJyZWQsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7CQkKLQkJSVBESUZ1bmN0aW9uQnJlYWtwb2ludCBia3B0ID0gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdGdW5jdGlvbkJyZWFrcG9pbnQoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGxvY2F0aW9uLCBjb25kaXRpb24sIGVuYWJsZWQpOwotCQlzZXROZXdMb2NhdGlvbkJyZWFrcG9pbnQoYmtwdCwgZGVmZXJyZWQpOwotCQlyZXR1cm4gYmtwdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJQnJlYWtwb2ludE1hbmFnZXIjc2V0TGluZUJyZWFrcG9pbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTGluZUxvY2F0aW9uLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbiwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVBESUxpbmVCcmVha3BvaW50IHNldExpbmVCcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCB0eXBlLCBJUERJTGluZUxvY2F0aW9uIGxvY2F0aW9uLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwgYm9vbGVhbiBkZWZlcnJlZCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsJCQotCQlJUERJTGluZUJyZWFrcG9pbnQgYmtwdCA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3TGluZUJyZWFrcG9pbnQoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGxvY2F0aW9uLCBjb25kaXRpb24sIGVuYWJsZWQpOwotCQlzZXROZXdMb2NhdGlvbkJyZWFrcG9pbnQoYmtwdCwgZGVmZXJyZWQpOwotCQlyZXR1cm4gYmtwdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUJyZWFrcG9pbnRNYW5hZ2VyI3NldFdhdGNocG9pbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElQRElXYXRjaHBvaW50IHNldFdhdGNocG9pbnQoQml0TGlzdCB0YXNrcywgaW50IHR5cGUsIGludCB3YXRjaFR5cGUsIFN0cmluZyBleHByZXNzaW9uLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVdhdGNocG9pbnQgYmtwdCA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3V2F0Y2hwb2ludChzZXNzaW9uLCB0YXNrcywgdHlwZSwgZXhwcmVzc2lvbiwgd2F0Y2hUeXBlLCBjb25kaXRpb24sIGVuYWJsZWQpOwotCQlzZXRXYXRjaHBvaW50KGJrcHQpOwotCQlhZGRCcmVha3BvaW50KGJrcHQpOwotCQlyZXR1cm4gYmtwdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuQWJzdHJhY3RQRElNYW5hZ2VyI3NodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJLy9icmVha0xpc3QuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJLy9UT0RPCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBicmVha3BvaW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEJyZWFrcG9pbnQoSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQlzeW5jaHJvbml6ZWQoYnJlYWtMaXN0KSB7Ci0JCQlpZiAoIWJyZWFrcG9pbnQuaXNUZW1wb3JhcnkoKSkgewotCQkJCWJyZWFrTGlzdC5hZGQoYnJlYWtwb2ludCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUJyZWFrcG9pbnQoaW50IGlkKSB7Ci0JCUlQRElCcmVha3BvaW50W10gcGRpQnJlYWtwb2ludHMgPSBnZXRBbGxQRElCcmVha3BvaW50cygpOwotCQlmb3IgKGludCBpPTA7IGk8cGRpQnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwZGlCcmVha3BvaW50c1tpXS5nZXRCcmVha3BvaW50SUQoKSA9PSBpZCkgewotCQkJCWJyZWFrTGlzdC5yZW1vdmUoaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUERJQnJlYWtwb2ludFtdIGdldEFsbFBESUJyZWFrcG9pbnRzKCkgewotCQlzeW5jaHJvbml6ZWQoYnJlYWtMaXN0KSB7Ci0JCQlyZXR1cm4gYnJlYWtMaXN0LnRvQXJyYXkobmV3IElQRElCcmVha3BvaW50WzBdKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoaW50IGlkKSB7Ci0JCXJldHVybiAoZ2V0QnJlYWtwb2ludChpZCkgIT0gbnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlciN1cGRhdGVQZW5kaW5nQnJlYWtwb2ludHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVBlbmRpbmdCcmVha3BvaW50cygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlmb3IgKElQRElCcmVha3BvaW50IGJwIDogZ2V0QWxsUERJQnJlYWtwb2ludHMoKSkgewotCQkJaWYgKCFicC5nZXRQZW5kaW5nVGFza3MoKS5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoIWJwLmlzRGVsZXRlZCgpKSB7Ci0JCQkJCXNldFBlbmRpbmdCcmVha3BvaW50KGJwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZWxldGVQZW5kaW5nQnJlYWtwb2ludChicCwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIGJyZWFrcG9pbnQgb24gYWxsIHN1c3BlbmRlZCB0YXNrcy4KLQkgKiAKLQkgKiBAcGFyYW0gYnAgYnJlYWtwb2ludCB0byBzZXQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlbmRpbmdCcmVha3BvaW50KElQRElCcmVha3BvaW50IGJwKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJQml0TGlzdCBzdXNwZW5kZWRUYXNrcyA9IGJwLmdldFBlbmRpbmdUYXNrcygpLmNvcHkoKTsKLQkJaWYgKHNlc3Npb24uZ2V0U3RhdHVzKCkgPT0gSVBESVNlc3Npb24uU1RBUlRFRCkgewotCQkJZ2V0U2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuZ2V0U3VzcGVuZGVkVGFza3Moc3VzcGVuZGVkVGFza3MpOwotCQl9CQkJCi0JCWlmICghc3VzcGVuZGVkVGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QgPSBudWxsOwotCQkJaWYgKGJwIGluc3RhbmNlb2YgSVBESUZ1bmN0aW9uQnJlYWtwb2ludCkgewotCQkJCXJlcXVlc3QgPSBzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0U2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdChzdXNwZW5kZWRUYXNrcywgKElQRElGdW5jdGlvbkJyZWFrcG9pbnQpYnAsIHRydWUpOwotCQkJfQotCQkJZWxzZSBpZiAoYnAgaW5zdGFuY2VvZiBJUERJQWRkcmVzc0JyZWFrcG9pbnQpIHsKLQkJCQlyZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFNldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdChzdXNwZW5kZWRUYXNrcywgKElQRElBZGRyZXNzQnJlYWtwb2ludClicCwgdHJ1ZSk7CQkJCi0JCQl9Ci0JCQllbHNlIGlmIChicCBpbnN0YW5jZW9mIElQRElMaW5lQnJlYWtwb2ludCkgewotCQkJCXJlcXVlc3QgPSBzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0U2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0KHN1c3BlbmRlZFRhc2tzLCAoSVBESUxpbmVCcmVha3BvaW50KWJwLCB0cnVlKTsJCQkKLQkJCX0KLQkJCWVsc2UgaWYgKGJwIGluc3RhbmNlb2YgSVBESVdhdGNocG9pbnQpIHsKLQkJCQlyZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFNldFdhdGNocG9pbnRSZXF1ZXN0KHN1c3BlbmRlZFRhc2tzLCAoSVBESVdhdGNocG9pbnQpYnAsIHRydWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihicC5nZXRUYXNrcygpLCBQRElSZXNvdXJjZXMuZ2V0U3RyaW5nKCJwZGkuQ29tbW9uLk5vdF9pbXBsZW1lbnRlZCIpKTsKLQkJCX0KLQkJCWJwLmdldFBlbmRpbmdUYXNrcygpLmFuZE5vdChzdXNwZW5kZWRUYXNrcyk7Ci0JCQlnZXRTZXNzaW9uKCkuZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGSVhNRSB3b3JrIG91dCBjb3JyZWN0IHVzYWdlIG9mIGFsbG93VXBkYXRlCi0JICogIAotCSAqIERlbGV0ZSBhIGJyZWFrcG9pbnQgZnJvbSBhbGwgc3VzcGVuZGVkIHRhc2tzLgotCSAqIAotCSAqIEBwYXJhbSBicCBicmVha3BvaW50IHRvIGRlbGV0ZQotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUGVuZGluZ0JyZWFrcG9pbnQoSVBESUJyZWFrcG9pbnQgYnAsIGJvb2xlYW4gYWxsb3dVcGRhdGUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlCaXRMaXN0IHN1c3BlbmRlZFRhc2tzID0gYnAuZ2V0UGVuZGluZ1Rhc2tzKCkuY29weSgpOwotCQlpZiAoc2Vzc2lvbi5nZXRTdGF0dXMoKSA9PSBJUERJU2Vzc2lvbi5TVEFSVEVEKSB7Ci0JCQlnZXRTZXNzaW9uKCkuZ2V0VGFza01hbmFnZXIoKS5nZXRTdXNwZW5kZWRUYXNrcyhzdXNwZW5kZWRUYXNrcyk7Ci0JCX0JCQkKLQkJaWYgKCFzdXNwZW5kZWRUYXNrcy5pc0VtcHR5KCkpIHsKLQkJCWdldFNlc3Npb24oKS5nZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KAotCQkJCQlzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0RGVsZXRlQnJlYWtwb2ludFJlcXVlc3Qoc3VzcGVuZGVkVGFza3MsIGJwLCBhbGxvd1VwZGF0ZSkpOwotCQkJYnAuZ2V0UGVuZGluZ1Rhc2tzKCkuYW5kTm90KHN1c3BlbmRlZFRhc2tzKTsKLQkJCWlmIChicC5nZXRQZW5kaW5nVGFza3MoKS5pc0VtcHR5KCkgJiYgYWxsb3dVcGRhdGUpIHsKLQkJCQlkZWxldGVCcmVha3BvaW50KGJwLmdldEJyZWFrcG9pbnRJRCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBia3B0Ci0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TG9jYXRpb25CcmVha3BvaW50KElQRElMb2NhdGlvbkJyZWFrcG9pbnQgYmtwdCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXNldFBlbmRpbmdCcmVha3BvaW50KGJrcHQpOwotCQlpZiAoIWJrcHQuaXNFbmFibGVkKCkpIHsKLQkJCWRpc2FibGVCcmVha3BvaW50KGJrcHQuZ2V0VGFza3MoKSwgYmtwdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHdhdGNocG9pbnQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRXYXRjaHBvaW50KElQRElXYXRjaHBvaW50IHdhdGNocG9pbnQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlzZXRQZW5kaW5nQnJlYWtwb2ludCh3YXRjaHBvaW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGJrcHQKLQkgKiBAcGFyYW0gZGVmZXJyZWQKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5ld0xvY2F0aW9uQnJlYWtwb2ludChJUERJTG9jYXRpb25CcmVha3BvaW50IGJrcHQsIGJvb2xlYW4gZGVmZXJyZWQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlzZXRMb2NhdGlvbkJyZWFrcG9pbnQoYmtwdCk7Ci0JCWFkZEJyZWFrcG9pbnQoYmtwdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL0V2ZW50UmVxdWVzdE1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9FdmVudFJlcXVlc3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDBlMmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL0V2ZW50UmVxdWVzdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRSZXF1ZXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdG9wRGVidWdnZXJSZXF1ZXN0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudFJlcXVlc3RNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RQRElNYW5hZ2VyIGltcGxlbWVudHMgSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIgewotCXB1YmxpYyBjbGFzcyBFdmVudFJlcXVlc3REaXNwYXRjaEpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgVmVjdG9yPElQRElFdmVudFJlcXVlc3Q+IGZSZXF1ZXN0cyA9IG51bGw7Ci0JCQotCQlwdWJsaWMgRXZlbnRSZXF1ZXN0RGlzcGF0Y2hKb2IoKSB7Ci0JCQlzdXBlcigiUFRQIERlYnVnIFJlcXVlc3QgSm9iIik7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlmUmVxdWVzdHMgPSBuZXcgVmVjdG9yPElQRElFdmVudFJlcXVlc3Q+KDEwKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSByZXF1ZXN0Ci0JCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRFdmVudFJlcXVlc3QoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJCXN5bmNocm9uaXplZCAoZlJlcXVlc3RzKSB7Ci0JCQkJaWYgKGNvbnRhaW5FdmVudFJlcXVlc3QocmVxdWVzdCkpCi0JCQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocmVxdWVzdC5nZXRUYXNrcygpLCAiWyIgKyByZXF1ZXN0LmdldE5hbWUoKSArICJdIHJlcXVlc3QgaXMgYWxyZWFkeSBhZGRlZC4iKTsKLQotCQkJCVBEZWJ1Z1V0aWxzLnByaW50bG4oIk1zZzogRXZlbnRSZXF1ZXN0TWFuYWdlciAtIGFkZEV2ZW50UmVxdWVzdCgpOiBSZXF1ZXN0OiAiICsgcmVxdWVzdCk7Ci0JCQkJZlJlcXVlc3RzLmFkZChyZXF1ZXN0KTsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsZWFuRXZlbnRSZXF1ZXN0cygpIHsKLQkJCXN5bmNocm9uaXplZCAoZlJlcXVlc3RzKSB7Ci0JCQkJZlJlcXVlc3RzLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gcmVxdWVzdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluRXZlbnRSZXF1ZXN0KElQRElFdmVudFJlcXVlc3QgcmVxdWVzdCkgewotCQkJc3luY2hyb25pemVkIChmUmVxdWVzdHMpIHsKLQkJCQlyZXR1cm4gZlJlcXVlc3RzLmNvbnRhaW5zKHJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIElQRElFdmVudFJlcXVlc3QgZ2V0Q3VycmVudEV2ZW50UmVxdWVzdCgpIHsKLQkJCXN5bmNocm9uaXplZCAoZlJlcXVlc3RzKSB7Ci0JCQkJaWYgKGZSZXF1ZXN0cy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiBmUmVxdWVzdHMuZ2V0KDApOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIElQRElFdmVudFJlcXVlc3RbXSBnZXRFdmVudFJlcXVlc3RzKCkgewotCQkJc3luY2hyb25pemVkIChmUmVxdWVzdHMpIHsKLQkJCQlyZXR1cm4gZlJlcXVlc3RzLnRvQXJyYXkobmV3IElQRElFdmVudFJlcXVlc3RbMF0pOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVDdXJyZW50RXZlbnRSZXF1ZXN0KCkgewotCQkJc3luY2hyb25pemVkIChmUmVxdWVzdHMpIHsKLQkJCQlpZiAoIWZSZXF1ZXN0cy5pc0VtcHR5KCkpCi0JCQkJCWZSZXF1ZXN0cy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHJlcXVlc3QKLQkJICogQHRocm93cyBQRElFeGNlcHRpb24KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUV2ZW50UmVxdWVzdChJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBQRElFeGNlcHRpb24gewotCQkJc3luY2hyb25pemVkIChmUmVxdWVzdHMpIHsKLQkJCQlpZiAocmVxdWVzdC5nZXRTdGF0dXMoKSA9PSBJUERJRXZlbnRSZXF1ZXN0LlJVTk5JTkcpCi0JCQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocmVxdWVzdC5nZXRUYXNrcygpLCAiWyIgKyByZXF1ZXN0LmdldE5hbWUoKSArICJdIHJlcXVlc3QgY2Fubm90IGJlIGRlbGV0ZWQgZHVyaW5nIGV4ZWN1dGluZy4iKTsKLQkJCQlpZiAoIWNvbnRhaW5FdmVudFJlcXVlc3QocmVxdWVzdCkpCi0JCQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocmVxdWVzdC5nZXRUYXNrcygpLCAiWyIgKyByZXF1ZXN0LmdldE5hbWUoKSArICJdIHJlcXVlc3QgaXMgbm90IGV4aXN0ZWQgb3IgYWxyZWFkeSBkZWxldGVkLiIpOwotCQkJCWZSZXF1ZXN0cy5yZW1vdmUocmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlRXZlbnRSZXF1ZXN0cygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQkJc3luY2hyb25pemVkIChmUmVxdWVzdHMpIHsKLQkJCQlpbnQgZW5kID0gZlJlcXVlc3RzLnNpemUoKSAtIDE7Ci0JCQkJZm9yIChpbnQgaT1lbmQ7IGk+PTA7IGktLSkgewotCQkJCQlyZW1vdmVFdmVudFJlcXVlc3QoZlJlcXVlc3RzLmdldChpKSk7Ci0JCQkJCWZSZXF1ZXN0cy5yZW1vdmUoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJICovCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWV4ZWN1dGUoZ2V0Q3VycmVudEV2ZW50UmVxdWVzdCgpKTsKLQkJCQl9Ci0JCQl9KTsJCQkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZSZXF1ZXN0cykgewotCQkJCXJldHVybiAoIWZSZXF1ZXN0cy5pc0VtcHR5KCkgJiYgZ2V0Q3VycmVudEV2ZW50UmVxdWVzdCgpLmdldFN0YXR1cygpID09IElQRElFdmVudFJlcXVlc3QuVU5LTk9XTik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEV2ZW50UmVxdWVzdERpc3BhdGNoSm9iIGRpc3BhdGNoSm9iID0gbmV3IEV2ZW50UmVxdWVzdERpc3BhdGNoSm9iKCk7Ci0JCi0JcHVibGljIEV2ZW50UmVxdWVzdE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlzdXBlcihzZXNzaW9uLCBmYWxzZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3RNYW5hZ2VyI2FkZEV2ZW50UmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV2ZW50UmVxdWVzdChJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoIShyZXF1ZXN0IGluc3RhbmNlb2YgSVBESVN0b3BEZWJ1Z2dlclJlcXVlc3QpKSB7Ci0JCQlpZiAocmVxdWVzdC5nZXRUYXNrcygpLmlzRW1wdHkoKSkgewotCQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocmVxdWVzdC5nZXRUYXNrcygpLCByZXF1ZXN0LmdldE5hbWUoKSAgKyAiOiBObyB0YXNrcyBmb3VuZCIpOwotCQkJfQotCQkJaWYgKHNlc3Npb24uZ2V0VGFza01hbmFnZXIoKS5pc0FsbFBlbmRpbmcocmVxdWVzdC5nZXRUYXNrcygpKSkgewotCQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24ocmVxdWVzdC5nZXRUYXNrcygpLCByZXF1ZXN0LmdldE5hbWUoKSArICI6IFJlcXVlc3QgdGFza3MgYXJlIGluIHBlbmRpbmcgc3RhdHVzLiIpOwotCQkJfQotCQl9Ci0JCWRpc3BhdGNoSm9iLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIjY2FuRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0TWFuYWdlciNjbGVhbkV2ZW50UmVxdWVzdHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuRXZlbnRSZXF1ZXN0cygpIHsKLQkJc2Vzc2lvbi5nZXRFdmVudE1hbmFnZXIoKS5yZW1vdmVBbGxSZWdpc3RlcmVkRXZlbnRSZXF1ZXN0cygpOwotCQlkaXNwYXRjaEpvYi5jbGVhbkV2ZW50UmVxdWVzdHMoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIjZGVsZXRlQWxsRXZlbnRSZXF1ZXN0cygpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQWxsRXZlbnRSZXF1ZXN0cygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkaXNwYXRjaEpvYi5yZW1vdmVFdmVudFJlcXVlc3RzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3RNYW5hZ2VyI2RlbGV0ZUV2ZW50UmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUV2ZW50UmVxdWVzdChJUERJRXZlbnRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkaXNwYXRjaEpvYi5yZW1vdmVFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3RNYW5hZ2VyI2V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQRElFdmVudFJlcXVlc3QgcmVxdWVzdCkgewotCQlzZXNzaW9uLmdldEV2ZW50TWFuYWdlcigpLnJlZ2lzdGVyRXZlbnRSZXF1ZXN0KHJlcXVlc3QpOwotCQlyZXF1ZXN0LmV4ZWN1dGUoc2Vzc2lvbi5nZXREZWJ1Z2dlcigpKTsKLQkJaWYgKHJlcXVlc3QuZ2V0U3RhdHVzKCkgPT0gSVBESUV2ZW50UmVxdWVzdC5FUlJPUikgewotCQkJc2Vzc2lvbi5nZXRFdmVudE1hbmFnZXIoKS5ub3RpZnlFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdE1hbmFnZXIjZ2V0UmVxdWVzdHMoKQotCSAqLwotCXB1YmxpYyBJUERJRXZlbnRSZXF1ZXN0W10gZ2V0UmVxdWVzdHMoKSB7Ci0JCXJldHVybiBkaXNwYXRjaEpvYi5nZXRFdmVudFJlcXVlc3RzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BYnN0cmFjdFBESU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuQWJzdHJhY3RQRElNYW5hZ2VyI3VwZGF0ZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuT2JzZXJ2ZXIjdXBkYXRlKGphdmEudXRpbC5PYnNlcnZhYmxlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIG8sIE9iamVjdCBhcmcpIHsKLQkJaWYgKGFyZyBpbnN0YW5jZW9mIElQRElFdmVudFJlcXVlc3QpIHsKLQkJCWRpc3BhdGNoSm9iLnJlbW92ZUN1cnJlbnRFdmVudFJlcXVlc3QoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9FeHByZXNzaW9uTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL0V4cHJlc3Npb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZGNlMjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL0V4cHJlc3Npb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTXVsdGlFeHByZXNzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElEYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cyBJUERJRXhwcmVzc2lvbk1hbmFnZXIgewotCWZpbmFsIHN0YXRpYyBJUERJRXhwcmVzc2lvbltdIEVNUFRZX0VYUFJFU1NJT05TID0ge307Ci0JTWFwPEJpdExpc3QsIExpc3Q8SVBESUV4cHJlc3Npb24+PiBleHBNYXA7Ci0JTWFwPEJpdExpc3QsIExpc3Q8SVBESVZhcmlhYmxlPj4gdmFyTWFwOwotCU1hcDxTdHJpbmcsIElQRElNdWx0aUV4cHJlc3Npb25zPiBtdXRsaUV4cHJNYXA7Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbk1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlzdXBlcihzZXNzaW9uLCB0cnVlKTsKLQkJZXhwTWFwID0gbmV3IEhhc2h0YWJsZTxCaXRMaXN0LCBMaXN0PElQRElFeHByZXNzaW9uPj4oKTsKLQkJdmFyTWFwID0gbmV3IEhhc2h0YWJsZTxCaXRMaXN0LCBMaXN0PElQRElWYXJpYWJsZT4+KCk7Ci0JCW11dGxpRXhwck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVBESU11bHRpRXhwcmVzc2lvbnM+KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlciNjbGVhbk11bHRpRXhwcmVzc2lvbnMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbk11bHRpRXhwcmVzc2lvbnMoQml0TGlzdCB0YXNrcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZm9yIChJUERJTXVsdGlFeHByZXNzaW9ucyBtZXhwciA6IGdldE11bHRpRXhwcmVzc2lvbnMoKSkgewotCQkJbWV4cHIuY2xlYW5FeHByZXNzaW9uc1ZhbHVlKHRhc2tzLCBtb25pdG9yKTsKLQkJfQotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV4cHJlc3Npb25NYW5hZ2VyI2NsZWFuTXVsdGlFeHByZXNzaW9ucyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuTXVsdGlFeHByZXNzaW9ucyhTdHJpbmcgZXhwclRleHQsIEJpdExpc3QgdGFza3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElNdWx0aUV4cHJlc3Npb25zIG1leHByID0gZ2V0TXVsdGlFeHByZXNzaW9uKGV4cHJUZXh0KTsKLQkJaWYgKG1leHByID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm8gZXhwcmVzc2lvbiAiICsgZXhwclRleHQgKyAiIGZvdW5kIik7Ci0JCi0JCW1leHByLmNsZWFuRXhwcmVzc2lvbnNWYWx1ZSh0YXNrcywgbW9uaXRvcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlciNjcmVhdGVFeHByZXNzaW9uKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldEV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbihCaXRMaXN0IHFUYXNrcywgU3RyaW5nIG5hbWUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVGFyZ2V0RXhwcmVzc2lvbiBleHByZXNzaW9uID0gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdFeHByZXNzaW9uKHNlc3Npb24sIHFUYXNrcywgbmFtZSk7Ci0JCUxpc3Q8SVBESUV4cHJlc3Npb24+IGV4cHJMaXN0ID0gZ2V0RXhwcmVzc2lvbkxpc3QocVRhc2tzKTsKLQkJZXhwckxpc3QuYWRkKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV4cHJlc3Npb25NYW5hZ2VyI2NyZWF0ZU11dGxpRXhwcmVzc2lvbnMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZU11dGxpRXhwcmVzc2lvbnMoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHJUZXh0LCBib29sZWFuIGVuYWJsZWQpIHsKLQkJbXV0bGlFeHByTWFwLnB1dChleHByVGV4dCwgc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdNdWx0aUV4cHJlc3Npb25zKHNlc3Npb24sIHRhc2tzLCBleHByVGV4dCwgZW5hYmxlZCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjY3JlYXRlVmFyaWFibGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVRhcmdldCB0YXJnZXQgPSBmcmFtZS5nZXRUYXJnZXQoKTsKLQkJSVBESVRocmVhZCBjdXJyZW50VGhyZWFkID0gdGFyZ2V0LmdldEN1cnJlbnRUaHJlYWQoKTsKLQkJSVBESVN0YWNrRnJhbWUgY3VycmVudEZyYW1lID0gY3VycmVudFRocmVhZC5nZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQl0cnkgewotCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoZnJhbWUuZ2V0VGhyZWFkKCksIGZhbHNlKTsKLQkJCWZyYW1lLmdldFRocmVhZCgpLnNldEN1cnJlbnRTdGFja0ZyYW1lKGZyYW1lLCBmYWxzZSk7Ci0KLQkJCUlQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldEdldFBhcnRpYWxBSUZSZXF1ZXN0KHRhcmdldC5nZXRUYXNrcygpLCBleHByLCBudWxsKTsKLQkJCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCUlBSUYgYWlmID0gcmVxdWVzdC5nZXRQYXJ0aWFsQUlGKHRhcmdldC5nZXRUYXNrcygpKTsKLQkJCVN0cmluZyB2YXJpZCA9IHJlcXVlc3QuZ2V0VmFySWQodGFyZ2V0LmdldFRhc2tzKCkpOwotCQkJCi0JCQlJUERJVmFyaWFibGUgdiA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3TG9jYWxWYXJpYWJsZShzZXNzaW9uLCB0YXJnZXQuZ2V0VGFza3MoKSwgbnVsbCwgZnJhbWUsIGV4cHIsIG51bGwsIDAsIDAsIHZhcmlkKTsKLQkJCXYuc2V0QUlGKGFpZik7Ci0JCQkKLQkJCUxpc3Q8SVBESVZhcmlhYmxlPiB2YXJMaXN0ID0gZ2V0VmFyaWFibGVMaXN0KHRhcmdldC5nZXRUYXNrcygpKTsKLQkJCXZhckxpc3QuYWRkKHYpOwotCQkJcmV0dXJuIHY7Ci0JCX0gZmluYWxseSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChjdXJyZW50VGhyZWFkLCBmYWxzZSk7Ci0JCQljdXJyZW50VGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKGN1cnJlbnRGcmFtZSwgZmFsc2UpOwotCQkJdGFyZ2V0LnJlbGVhc2VUYXJnZXQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVBbGxWYXJpYWJsZXMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlMaXN0PElQRElWYXJpYWJsZT4gdmFyTGlzdCA9IGdldFZhcmlhYmxlTGlzdChxVGFza3MpOwotCQlJUERJVmFyaWFibGVbXSB2YXJpYWJsZXMgPSAoSVBESVZhcmlhYmxlW10pIHZhckxpc3QudG9BcnJheShuZXcgSVBESVZhcmlhYmxlW3Zhckxpc3Quc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgKytpKSB7Ci0JCQlkZWxldGVWYXJpYWJsZSh2YXJpYWJsZXNbaV0pOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlciNkZWxldGVWYXJpYWJsZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVZhcmlhYmxlKElQRElWYXJpYWJsZSB2YXJpYWJsZSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElEZWxldGVWYXJpYWJsZVJlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXREZWxldGVWYXJpYWJsZVJlcXVlc3QodmFyaWFibGUuZ2V0VGFza3MoKSwgdmFyaWFibGUuZ2V0VmFySWQoKSk7Ci0JCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJcmVxdWVzdC53YWl0VW50aWxDb21wbGV0ZWQodmFyaWFibGUuZ2V0VGFza3MoKSk7Ci0JCQotCQlMaXN0PElQRElWYXJpYWJsZT4gdmFyTGlzdCA9IGdldFZhcmlhYmxlTGlzdCh2YXJpYWJsZS5nZXRUYXNrcygpKTsKLQkJdmFyTGlzdC5yZW1vdmUodmFyaWFibGUpOwotCQkKLQkJTGlzdDxJUERJRXZlbnQ+IGV2ZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBESUV2ZW50PigpOwotCQkKLQkJSVBESVZhcmlhYmxlW10gY2hpbGRyZW4gPSB2YXJpYWJsZS5nZXRDaGlsZHJlbigpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJCWlmIChjaGlsZHJlblswXSBpbnN0YW5jZW9mIElQRElWYXJpYWJsZSkgewotCQkJCQlJUERJVmFyaWFibGUgY2hpbGQgPSAoSVBESVZhcmlhYmxlKWNoaWxkcmVuW2ldOwotCQkJCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGVzdHJveWVkRXZlbnQoCi0JCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdWYXJpYWJsZUluZm8oc2Vzc2lvbiwgdmFyaWFibGUuZ2V0VGFza3MoKSwgY2hpbGQuZ2V0VmFySWQoKSwgY2hpbGQpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdEZXN0cm95ZWRFdmVudCgKLQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1ZhcmlhYmxlSW5mbyhzZXNzaW9uLCB2YXJpYWJsZS5nZXRUYXNrcygpLCB2YXJpYWJsZS5nZXRWYXJJZCgpLCB2YXJpYWJsZSkpKTsKLQkJc2Vzc2lvbi5nZXRFdmVudE1hbmFnZXIoKS5maXJlRXZlbnRzKChJUERJRXZlbnRbXSkgZXZlbnRMaXN0LnRvQXJyYXkobmV3IElQRElFdmVudFswXSkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXN0cm95QWxsRXhwcmVzc2lvbnMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zID0gZ2V0RXhwcmVzc2lvbnMocVRhc2tzKTsKLQkJZGVzdHJveUV4cHJlc3Npb25zKHFUYXNrcywgZXhwcmVzc2lvbnMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjZGVzdHJveUV4cHJlc3Npb25zKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElFeHByZXNzaW9uW10pCi0JICovCi0JcHVibGljIHZvaWQgZGVzdHJveUV4cHJlc3Npb25zKEJpdExpc3QgcVRhc2tzLCBJUERJRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJTGlzdDxJUERJRXhwcmVzc2lvbj4gZXhwTGlzdCA9IGdldEV4cHJlc3Npb25MaXN0KHFUYXNrcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMubGVuZ3RoOyArK2kpIHsKLQkJCWV4cExpc3QucmVtb3ZlKGV4cHJlc3Npb25zW2ldKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEBwYXJhbSBleHByCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElBSUYgZ2V0QUlGKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgZXhwcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldEdldFBhcnRpYWxBSUZSZXF1ZXN0KHFUYXNrcywgZXhwciwgbnVsbCk7Ci0JCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJcmV0dXJuIHJlcXVlc3QuZ2V0UGFydGlhbEFJRihxVGFza3MpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElFeHByZXNzaW9uW10gZ2V0RXhwcmVzc2lvbnMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlMaXN0PElQRElFeHByZXNzaW9uPiBleHBMaXN0ID0gZXhwTWFwLmdldChxVGFza3MpOwotCQlpZiAoZXhwTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKElQRElFeHByZXNzaW9uW10pZXhwTGlzdC50b0FycmF5KEVNUFRZX0VYUFJFU1NJT05TKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfRVhQUkVTU0lPTlM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlciNnZXRFeHByZXNzaW9uVmFsdWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQUlGIGdldEV4cHJlc3Npb25WYWx1ZShCaXRMaXN0IHFUYXNrcywgU3RyaW5nIGV4cHIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXREYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdChxVGFza3MsIGV4cHIpOwotCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCXJldHVybiByZXF1ZXN0LmdldEFJRihxVGFza3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjZ2V0TXVsdGlFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElNdWx0aUV4cHJlc3Npb25zIGdldE11bHRpRXhwcmVzc2lvbihTdHJpbmcgZXhwclRleHQpIHsKLQkJcmV0dXJuIG11dGxpRXhwck1hcC5nZXQoZXhwclRleHQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjZ2V0TXVsdGlFeHByZXNzaW9ucygpCi0JICovCi0JcHVibGljIElQRElNdWx0aUV4cHJlc3Npb25zW10gZ2V0TXVsdGlFeHByZXNzaW9ucygpIHsKLQkJcmV0dXJuIG11dGxpRXhwck1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBJUERJTXVsdGlFeHByZXNzaW9uc1swXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlciNnZXRNdWx0aUV4cHJlc3Npb25zKGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUV4cHJlc3Npb25bXSBnZXRNdWx0aUV4cHJlc3Npb25zKGludCB0YXNrKSB7Ci0JCUxpc3Q8SVBESUV4cHJlc3Npb24+IGV4cHJMaXN0ID0gbmV3IEFycmF5TGlzdDxJUERJRXhwcmVzc2lvbj4oKTsKLQkJZm9yIChJUERJTXVsdGlFeHByZXNzaW9ucyBtZXhwciA6IGdldE11bHRpRXhwcmVzc2lvbnMoKSkgewotCQkJaWYgKCFtZXhwci5pc0VuYWJsZWQoKSkKLQkJCQljb250aW51ZTsKLQkJCUlQRElFeHByZXNzaW9uIGV4cHIgPSBtZXhwci5nZXRFeHByZXNzaW9uKHRhc2spOwotCQkJaWYgKGV4cHIgIT0gbnVsbCkgewotCQkJCWV4cHJMaXN0LmFkZChleHByKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXhwckxpc3QudG9BcnJheShuZXcgSVBESUV4cHJlc3Npb25bMF0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIHZhcmlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGUgZ2V0VmFyaWFibGUoQml0TGlzdCBxVGFza3MsIFN0cmluZyB2YXJpZCkgewotCQlMaXN0PElQRElWYXJpYWJsZT4gdmFyTGlzdCA9IGdldFZhcmlhYmxlTGlzdChxVGFza3MpOwotCQlJUERJVmFyaWFibGVbXSB2YXJzID0gKElQRElWYXJpYWJsZVtdKXZhckxpc3QudG9BcnJheShuZXcgSVBESVZhcmlhYmxlWzBdKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodmFyc1tpXS5nZXRWYXJJZCgpLmVxdWFscyh2YXJpZCkpIHsKLQkJCQlyZXR1cm4gdmFyc1tpXTsKLQkJCX0KLQkJCUlQRElWYXJpYWJsZSB2ID0gdmFyc1tpXS5nZXRDaGlsZCh2YXJpZCk7Ci0JCQlpZiAodiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlciNyZW1vdmVNdXRsaUV4cHJlc3Npb25zKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNdXRsaUV4cHJlc3Npb25zKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByVGV4dCkgewotCQlJUERJTXVsdGlFeHByZXNzaW9ucyBtZXhwciA9IGdldE11bHRpRXhwcmVzc2lvbihleHByVGV4dCk7Ci0JCWlmIChtZXhwciAhPSBudWxsKSB7Ci0JCQltZXhwci5yZW1vdmVFeHByZXNzaW9uKHRhc2tzKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjcmVtb3ZlTXV0bGlFeHByZXNzaW9ucyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU11dGxpRXhwcmVzc2lvbnMoU3RyaW5nIGV4cHJUZXh0KSB7Ci0JCUlQRElNdWx0aUV4cHJlc3Npb25zIG1leHByID0gZ2V0TXVsdGlFeHByZXNzaW9uKGV4cHJUZXh0KTsKLQkJaWYgKG1leHByICE9IG51bGwpIHsKLQkJCW1leHByLnNodXRkb3duKCk7Ci0JCX0KLQkJbXV0bGlFeHByTWFwLnJlbW92ZShleHByVGV4dCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BYnN0cmFjdFBESU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlleHBNYXAuY2xlYXIoKTsKLQkJdmFyTWFwLmNsZWFyKCk7Ci0JCW11dGxpRXhwck1hcC5jbGVhcigpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXVwZGF0ZShxVGFza3MsIG5ldyBTdHJpbmdbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjdXBkYXRlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcywgU3RyaW5nW10gdmFyTGlzdCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVBESUV2ZW50PiBldmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PElQRElFdmVudD4oKTsKLQkJZm9yIChpbnQgaT0wOyBpPHZhckxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUlQRElWYXJpYWJsZSB2YXJpYWJsZSA9IGdldFZhcmlhYmxlKHFUYXNrcywgdmFyTGlzdFtpXSk7Ci0JCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgewotCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdDaGFuZ2VkRXZlbnQoCi0JCQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1ZhcmlhYmxlSW5mbyhzZXNzaW9uLCBxVGFza3MsIHZhckxpc3RbaV0sIHZhcmlhYmxlKSkpOwotCQkJfQotCQl9Ci0JCXNlc3Npb24uZ2V0RXZlbnRNYW5hZ2VyKCkuZmlyZUV2ZW50cygoSVBESUV2ZW50W10pIGV2ZW50TGlzdC50b0FycmF5KG5ldyBJUERJRXZlbnRbMF0pKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV4cHJlc3Npb25NYW5hZ2VyI3VwZGF0ZU11bHRpRXhwcmVzc2lvbnMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aUV4cHJlc3Npb25zKEJpdExpc3QgdGFza3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWZvciAoSVBESU11bHRpRXhwcmVzc2lvbnMgbWV4cHIgOiBnZXRNdWx0aUV4cHJlc3Npb25zKCkpIHsKLQkJCWlmIChtZXhwci5pc0VuYWJsZWQoKSkKLQkJCQltZXhwci51cGRhdGVFeHByZXNzaW9uc1ZhbHVlKHRhc2tzLCBtb25pdG9yKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXhwcmVzc2lvbk1hbmFnZXIjdXBkYXRlTXVsdGlFeHByZXNzaW9ucyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU11bHRpRXhwcmVzc2lvbnMoU3RyaW5nIGV4cHJUZXh0LCBCaXRMaXN0IHRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJTXVsdGlFeHByZXNzaW9ucyBtZXhwciA9IGdldE11bHRpRXhwcmVzc2lvbihleHByVGV4dCk7Ci0JCWlmIChtZXhwciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIk5vIGV4cHJlc3Npb24gIiArIGV4cHJUZXh0ICsgIiBmb3VuZCIpOwotCQotCQlpZiAobWV4cHIuaXNFbmFibGVkKCkpCi0JCQltZXhwci51cGRhdGVFeHByZXNzaW9uc1ZhbHVlKHRhc2tzLCBtb25pdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESUV4cHJlc3Npb25NYW5hZ2VyI3VwZGF0ZVN0YXR1c011bHRpRXhwcmVzc2lvbnMoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0dXNNdWx0aUV4cHJlc3Npb25zKFN0cmluZyBleHByVGV4dCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCUlQRElNdWx0aUV4cHJlc3Npb25zIG1leHByID0gZ2V0TXVsdGlFeHByZXNzaW9uKGV4cHJUZXh0KTsKLQkJaWYgKG1leHByICE9IG51bGwpIHsKLQkJCW1leHByLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBMaXN0PElQRElFeHByZXNzaW9uPiBnZXRFeHByZXNzaW9uTGlzdChCaXRMaXN0IHFUYXNrcykgewotCQlMaXN0PElQRElFeHByZXNzaW9uPiBleHBMaXN0ID0gZXhwTWFwLmdldChxVGFza3MpOwotCQlpZiAoZXhwTGlzdCA9PSBudWxsKSB7Ci0JCQlleHBMaXN0ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PElQRElFeHByZXNzaW9uPigpKTsKLQkJCWV4cE1hcC5wdXQocVRhc2tzLCBleHBMaXN0KTsKLQkJfQotCQlyZXR1cm4gZXhwTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBMaXN0PElQRElWYXJpYWJsZT4gZ2V0VmFyaWFibGVMaXN0KEJpdExpc3QgcVRhc2tzKSB7Ci0JCUxpc3Q8SVBESVZhcmlhYmxlPiB2YXJMaXN0ID0gdmFyTWFwLmdldChxVGFza3MpOwotCQlpZiAodmFyTGlzdCA9PSBudWxsKSB7Ci0JCQl2YXJMaXN0ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PElQRElWYXJpYWJsZT4oKSk7Ci0JCQl2YXJNYXAucHV0KHFUYXNrcywgdmFyTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIHZhckxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL01lbW9yeU1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9NZW1vcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNDhjZDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL01lbW9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLkV4dEZvcm1hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURhdGFSZWFkTWVtb3J5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElNZW1vcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lbW9yeU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cyBJUERJTWVtb3J5TWFuYWdlciB7Ci0JSVBESU1lbW9yeUJsb2NrW10gRU1QVFlfTUVNT1JZX0JMT0NLUyA9IHt9OwotCU1hcDxCaXRMaXN0LCBMaXN0PElQRElNZW1vcnlCbG9jaz4+IGJsb2NrTWFwOwotCi0JcHVibGljIE1lbW9yeU1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlzdXBlcihzZXNzaW9uLCB0cnVlKTsKLQkJYmxvY2tNYXAgPSBuZXcgSGFzaHRhYmxlPEJpdExpc3QsIExpc3Q8SVBESU1lbW9yeUJsb2NrPj4oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1lbW9yeU1hbmFnZXIjY3JlYXRlTWVtb3J5QmxvY2sob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeUJsb2NrIGNyZWF0ZU1lbW9yeUJsb2NrKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgYWRkcmVzcywgaW50IHVuaXRzLCBpbnQgd29yZFNpemUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJRGF0YVJlYWRNZW1vcnlJbmZvIGluZm8gPSBjcmVhdGVEYXRhUmVhZE1lbW9yeUluZm8ocVRhc2tzLCBhZGRyZXNzLCB1bml0cywgd29yZFNpemUpOwotCQlJUERJTWVtb3J5QmxvY2sgYmxvY2sgPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld01lbW9yeUJsb2NrKHNlc3Npb24sIHFUYXNrcywgYWRkcmVzcywgd29yZFNpemUsIHRydWUsIGluZm8pOwotCQlMaXN0PElQRElNZW1vcnlCbG9jaz4gYmxvY2tMaXN0ID0gZ2V0TWVtb3J5QmxvY2tMaXN0KHFUYXNrcyk7Ci0JCWJsb2NrTGlzdC5hZGQoYmxvY2spOwotCQlJUERJRXZlbnQgZXZlbnQgPSBzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0NyZWF0ZWRFdmVudCgKLQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld01lbW9yeUJsb2NrSW5mbyhzZXNzaW9uLCBxVGFza3MsIG5ldyBCaWdJbnRlZ2VyW10geyBibG9jay5nZXRTdGFydEFkZHJlc3MoKSB9LCBibG9jaykpOwotCQlzZXNzaW9uLmdldEV2ZW50TWFuYWdlcigpLmZpcmVFdmVudHMobmV3IElQRElFdmVudFtdIHsgZXZlbnQgfSk7Ci0JCXJldHVybiBibG9jazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1lbW9yeU1hbmFnZXIjZ2V0TWVtb3J5QmxvY2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeUJsb2NrW10gZ2V0TWVtb3J5QmxvY2tzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJTGlzdDxJUERJTWVtb3J5QmxvY2s+IGJsb2NrTGlzdCA9IGdldE1lbW9yeUJsb2NrTGlzdChxVGFza3MpOwotCQlyZXR1cm4gKElQRElNZW1vcnlCbG9ja1tdKSBibG9ja0xpc3QudG9BcnJheShuZXcgSVBESU1lbW9yeUJsb2NrW2Jsb2NrTGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1lbW9yeU1hbmFnZXIjcmVtb3ZlQWxsQmxvY2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxCbG9ja3MoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJTWVtb3J5QmxvY2tbXSBibG9ja3MgPSBnZXRNZW1vcnlCbG9ja3MocVRhc2tzKTsKLQkJcmVtb3ZlQmxvY2tzKHFUYXNrcywgYmxvY2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1lbW9yeU1hbmFnZXIjcmVtb3ZlQmxvY2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnlCbG9ja1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrcyhCaXRMaXN0IHFUYXNrcywgSVBESU1lbW9yeUJsb2NrW10gbWVtb3J5QmxvY2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJTGlzdDxJUERJTWVtb3J5QmxvY2s+IGJsb2NrTGlzdCA9IGJsb2NrTWFwLmdldChxVGFza3MpOwotCQlpZiAoYmxvY2tMaXN0ICE9IG51bGwpIHsKLQkJCWJsb2NrTGlzdC5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChtZW1vcnlCbG9ja3MpKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuQWJzdHJhY3RQRElNYW5hZ2VyI3NodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJYmxvY2tNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcykgewotCQlMaXN0PElQRElNZW1vcnlCbG9jaz4gYmxvY2tMaXN0ID0gZ2V0TWVtb3J5QmxvY2tMaXN0KHFUYXNrcyk7Ci0JCUlQRElNZW1vcnlCbG9ja1tdIGJsb2NrcyA9IChJUERJTWVtb3J5QmxvY2tbXSkgYmxvY2tMaXN0LnRvQXJyYXkobmV3IElQRElNZW1vcnlCbG9ja1tibG9ja0xpc3Quc2l6ZSgpXSk7Ci0JCUxpc3Q8SVBESUV2ZW50PiBldmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PElQRElFdmVudD4oYmxvY2tzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoISBibG9ja3NbaV0uaXNGcm96ZW4oKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZShibG9ja3NbaV0sIGV2ZW50TGlzdCk7Ci0JCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSVBESUV2ZW50W10gZXZlbnRzID0gKElQRElFdmVudFtdKWV2ZW50TGlzdC50b0FycmF5KG5ldyBJUERJRXZlbnRbMF0pOwotCQlzZXNzaW9uLmdldEV2ZW50TWFuYWdlcigpLmZpcmVFdmVudHMoZXZlbnRzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1lbW9yeU1hbmFnZXIjdXBkYXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2ssIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyW10gdXBkYXRlKElQRElNZW1vcnlCbG9jayBibG9jaywgTGlzdDxJUERJRXZlbnQ+IGFMaXN0KSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESU1lbW9yeUJsb2NrIG5ld0Jsb2NrID0gY2xvbmVCbG9jayhibG9jayk7Ci0JCWJvb2xlYW4gbmV3QWRkcmVzcyA9ICEgbmV3QmxvY2suZ2V0U3RhcnRBZGRyZXNzKCkuZXF1YWxzKGJsb2NrLmdldFN0YXJ0QWRkcmVzcygpKTsKLQkJQmlnSW50ZWdlcltdIGFycmF5ID0gY29tcGFyZUJsb2NrcyhibG9jaywgbmV3QmxvY2spOwotCQlibG9jay5zZXREYXRhUmVhZE1lbW9yeUluZm8obmV3QmxvY2suZ2V0RGF0YVJlYWRNZW1vcnlJbmZvKCkpOwotCQlpZiAoYXJyYXkubGVuZ3RoID4gMCB8fCBuZXdBZGRyZXNzKSB7Ci0JCQlJUERJRXZlbnQgZXZlbnQgPSBzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0NoYW5nZWRFdmVudCgKLQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdNZW1vcnlCbG9ja0luZm8oc2Vzc2lvbiwgYmxvY2suZ2V0VGFza3MoKSwgYXJyYXksIGJsb2NrKSk7Ci0JCQlpZiAoYUxpc3QgIT0gbnVsbCkgewotCQkJCWFMaXN0LmFkZChldmVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXNlc3Npb24uZ2V0RXZlbnRNYW5hZ2VyKCkuZmlyZUV2ZW50cyhuZXcgSVBESUV2ZW50W10geyBldmVudCB9KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBibG9jawotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVBESU1lbW9yeUJsb2NrIGNsb25lQmxvY2soSVBESU1lbW9yeUJsb2NrIGJsb2NrKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGV4cCA9IGJsb2NrLmdldEV4cHJlc3Npb24oKTsKLQkJaW50IHdvcmRTaXplID0gYmxvY2suZ2V0V29yZFNpemUoKTsKLQkJSVBESURhdGFSZWFkTWVtb3J5SW5mbyBpbmZvID0gY3JlYXRlRGF0YVJlYWRNZW1vcnlJbmZvKGJsb2NrLmdldFRhc2tzKCksIGV4cCwgKGludClibG9jay5nZXRMZW5ndGgoKSwgd29yZFNpemUpOwotCQlyZXR1cm4gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdNZW1vcnlCbG9jayhzZXNzaW9uLCBibG9jay5nZXRUYXNrcygpLCBleHAsIHdvcmRTaXplLCB0cnVlLCBpbmZvKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG9sZEJsb2NrCi0JICogQHBhcmFtIG5ld0Jsb2NrCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBCaWdJbnRlZ2VyW10gY29tcGFyZUJsb2NrcyhJUERJTWVtb3J5QmxvY2sgb2xkQmxvY2ssIElQRElNZW1vcnlCbG9jayBuZXdCbG9jaykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBvbGRCeXRlcyA9IG9sZEJsb2NrLmdldEJ5dGVzKCk7Ci0JCWJ5dGVbXSBuZXdCeXRlcyA9IG5ld0Jsb2NrLmdldEJ5dGVzKCk7Ci0JCUxpc3Q8QmlnSW50ZWdlcj4gYUxpc3QgPSBuZXcgQXJyYXlMaXN0PEJpZ0ludGVnZXI+KG5ld0J5dGVzLmxlbmd0aCk7Ci0JCUJpZ0ludGVnZXIgZGlzdGFuY2UgPSBuZXdCbG9jay5nZXRTdGFydEFkZHJlc3MoKS5zdWJ0cmFjdChvbGRCbG9jay5nZXRTdGFydEFkZHJlc3MoKSk7Ci0JCWludCBkaWZmID0gZGlzdGFuY2UuaW50VmFsdWUoKTsKLQkJaWYgKCBNYXRoLmFicyhkaWZmKSA8ICBuZXdCeXRlcy5sZW5ndGgpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Qnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSArIGRpZmYgPCBvbGRCeXRlcy5sZW5ndGggJiYgaSArIGRpZmYgPj0gMCkgewotCQkJCQlpZiAob2xkQnl0ZXNbaSArIGRpZmZdICE9IG5ld0J5dGVzW2ldKSB7Ci0JCQkJCQlhTGlzdC5hZGQobmV3QmxvY2suZ2V0U3RhcnRBZGRyZXNzKCkuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihpKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoQmlnSW50ZWdlcltdKSBhTGlzdC50b0FycmF5KG5ldyBCaWdJbnRlZ2VyW2FMaXN0LnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGV4cAotCSAqIEBwYXJhbSB1bml0cwotCSAqIEBwYXJhbSB3b3JkU2l6ZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVBESURhdGFSZWFkTWVtb3J5SW5mbyBjcmVhdGVEYXRhUmVhZE1lbW9yeUluZm8oQml0TGlzdCBxVGFza3MsIFN0cmluZyBleHAsIGludCB1bml0cywgaW50IHdvcmRTaXplKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldERhdGFSZWFkTWVtb3J5UmVxdWVzdChzZXNzaW9uLCBxVGFza3MsIDAsIGV4cCwgRXh0Rm9ybWF0LkhFWEFERUNJTUFMLCB3b3JkU2l6ZSwgMSwgdW5pdHMsIG51bGwpOwotCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCXJldHVybiByZXF1ZXN0LmdldERhdGFSZWFkTWVtb3J5SW5mbyhxVGFza3MpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIExpc3Q8SVBESU1lbW9yeUJsb2NrPiBnZXRNZW1vcnlCbG9ja0xpc3QoQml0TGlzdCBxVGFza3MpIHsKLQkJTGlzdDxJUERJTWVtb3J5QmxvY2s+IGJsb2NrTGlzdCA9IGJsb2NrTWFwLmdldChxVGFza3MpOwotCQlpZiAoYmxvY2tMaXN0ID09IG51bGwpIHsKLQkJCWJsb2NrTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxJUERJTWVtb3J5QmxvY2s+KCkpOwotCQkJYmxvY2tNYXAucHV0KHFUYXNrcywgYmxvY2tMaXN0KTsKLQkJfQotCQlyZXR1cm4gYmxvY2tMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9QRElSZXNvdXJjZXMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9QRElSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhNTFkNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvUERJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQRElSZXNvdXJjZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlci5QRElSZXNvdXJjZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JcHJpdmF0ZSBQRElSZXNvdXJjZXMoKSB7fQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9QRElSZXNvdXJjZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9QRElSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjYjcxNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvUERJUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBRTlggU29mdHdhcmUgU3lzdGVtcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wZGkuQ29tbW9uLk5vX2Fuc3dlcj1ObyBhbnN3ZXIKLXBkaS5Db21tb24uTm90X2ltcGxlbWVudGVkPU5vdCBJbXBsZW1lbnRlZAotcGRpLlNvdXJjZU1hbmFnZXIuVW5rbm93bl90eXBlPVVua25vd24gdHlwZQotcGRpLlJlZ2lzdGVyTWFuYWdlci5Xcm9uZ19yZWdpc3Rlcl90eXBlPVdyb25nIHJlZ2lzdGVyIHR5cGUKLXBkaS5CcmVha3BvaW50TWFuYWdlci5Ob3RfYV9QVFBfYnJlYWtwb2ludD1Ob3QgYSBQVFAgYnJlYWtwb2ludAotcGRpLkJyZWFrcG9pbnRNYW5hZ2VyLk5vdF9TdXBwb3J0ZWQ9Tm90IFN1cHBvcnRlZAotcGRpLkJyZWFrcG9pbnRNYW5hZ2VyLlBhcnNpbmdfRXJyb3I9UGFyc2luZyBFcnJvcgotcGRpLlJ1bnRpbWVPcHRpb25zLlVuYWJsZV90b19zZXRfYXJnc190YXJnZXRfbm90X3Jlc3BvbmRpbmc9VW5hYmxlIHRvIHNldCBhcmd1bWVudHM6IHRhcmdldCBpcyBub3QgcmVzcG9uZGluZwotcGRpLlJ1bnRpbWVPcHRpb25zLlVuYWJsZV90b19zZXRfYXJncz1VbmFibGUgdG8gc2V0IGFyZ3VtZW50czogCi1wZGkuUnVudGltZU9wdGlvbnMuVW5hYmxlX3RvX3NldF9hcmdzPVVuYWJsZSB0byBzZXQgZW52aXJvbm1lbnQ6IAotcGRpLlJ1bnRpbWVPcHRpb25zLlVuYWJsZV90b19zZXRfd29ya2luZ19kaXI9VW5hYmxlIHRvIHNldCB3b3JraW5nIGRpcmVjdG9yeTogCi1wZGkuU2Vzc2lvbi5Vbmtub3duX3RhcmdldD1Vbmtvd24gdGFyZ2V0Ci1wZGkuVmFyaWFibGVNYW5hZ2VyLlVua25vd25fdHlwZT1Vbmtub3duIHR5cGUKLXBkaS5WYXJpYWJsZU1hbmFnZXIuV3JvbmdfdmFyaWFibGVfdHlwZT1Xcm9uZyB2YXJpYWJsZSB0eXBlCi1wZGkuVmFyaWFibGVNYW5hZ2VyLlVua25vd25fdmFyaWFibGVfb2JqZWN0PVVua25vd24gdmFyaWFibGUgb2JqZWN0Ci1wZGkubW9kZWwuVmFyaWFibGVPYmplY3QuVGFyZ2V0X25vdF9yZXNwb25kaW5nPVRhcmdldCBpcyBub3QgcmVzcG9uZGluZwotcGRpLm1vZGVsLlRhcmdldC5Vbmtub3duX3RocmVhZD1Vbmtub3duIHRocmVhZAotcGRpLm1vZGVsLlRhcmdldC5UYXJnZXRfbm90X3Jlc3BvbmRpbmc9VGFyZ2V0IGlzIG5vdCByZXNwb25kaW5nCi1wZGkubW9kZWwuVGFyZ2V0LkNhbm5vdF9zd2l0Y2hfdG9fdGhyZWFkPUNhbiBub3Qgc3dpdGNoIHRvIHRocmVhZCAKLXBkaS5tb2RlbC5UYXJnZXQuSW5mZXJpb3JfYWxyZWFkeV9ydW5uaW5nPUluZmVyaW9yIGlzIGFscmVhZHkgcnVubmluZwotcGRpLm1vZGVsLk1lbW9yeUJsb2NrLkJhZF9PZmZzZXQ9QmFkIE9mZnNldAotcGRpLm1vZGUuVGFyZ2V0LkJhZF9sb2NhdGlvbj1CYWQgbG9jYXRpb24KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9SZWdpc3Rlck1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9SZWdpc3Rlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmNjUzNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvUmVnaXN0ZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJUmVnaXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3Rlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lzdGVyTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UERJTWFuYWdlciBpbXBsZW1lbnRzIElQRElSZWdpc3Rlck1hbmFnZXIgewotCWZpbmFsIGludCBNQVhfRU5UUklFUyA9IDE1MDsKLQkKLQlwdWJsaWMgUmVnaXN0ZXJNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdHJ1ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElSZWdpc3Rlck1hbmFnZXIjY3JlYXRlUmVnaXN0ZXIob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlckRlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIElQRElSZWdpc3RlciBjcmVhdGVSZWdpc3RlcihJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIHJlZ0Rlc2MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHJlZ0Rlc2MuZ2V0VGFza3MoKSwgIk5vdCBpbXBsZW1lbnQgUmVnaXN0ZXJNYW5hZ2VyIC0gY3JlYXRlUmVnaXN0ZXIoKSB5ZXQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVJlZ2lzdGVyTWFuYWdlciNjcmVhdGVTaGFkb3dSZWdpc3RlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZSBjcmVhdGVTaGFkb3dSZWdpc3RlcihJUERJUmVnaXN0ZXIgcmVnaXN0ZXIsIElQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgcmVnTmFtZSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocmVnaXN0ZXIuZ2V0VGFza3MoKSwgIk5vdCBpbXBsZW1lbnQgUmVnaXN0ZXJNYW5hZ2VyIC0gY3JlYXRlU2hhZG93UmVnaXN0ZXIoKSB5ZXQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVJlZ2lzdGVyTWFuYWdlciNkZXN0cm95UmVnaXN0ZXIob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXN0cm95UmVnaXN0ZXIoSVBESVJlZ2lzdGVyIHJlZykgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJUmVnaXN0ZXJNYW5hZ2VyI2dldFJlZ2lzdGVyR3JvdXBzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESVJlZ2lzdGVyR3JvdXBbXSBnZXRSZWdpc3Rlckdyb3VwcyhCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCS8vVE9ETyBOb3QgaW1wbGVtZW50IFJlZ2lzdGVyTWFuYWdlciAtIGdldFJlZ2lzdGVyR3JvdXBzKCkgeWV0Ci0JCXJldHVybiBuZXcgSVBESVJlZ2lzdGVyR3JvdXBbMF07Ci0JCS8vdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsICJOb3QgaW1wbGVtZW50IFJlZ2lzdGVyTWFuYWdlciAtIGdldFJlZ2lzdGVyR3JvdXBzKCkgeWV0Iik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BYnN0cmFjdFBESU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuQWJzdHJhY3RQRElNYW5hZ2VyI3VwZGF0ZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9TaWduYWxNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvU2lnbmFsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJmZDQ4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9TaWduYWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJU2lnbmFsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUNvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElMaXN0U2lnbmFsc1JlcXVlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UERJTWFuYWdlciBpbXBsZW1lbnRzIElQRElTaWduYWxNYW5hZ2VyIHsKLQlwcml2YXRlIElQRElTaWduYWxbXSBFTVBUWV9TSUdOQUxTID0ge307Ci0JcHJpdmF0ZSBNYXA8Qml0TGlzdCwgTGlzdDxJUERJU2lnbmFsPj4gc2lnbmFsc01hcDsKLQotCXB1YmxpYyBTaWduYWxNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJc3VwZXIoc2Vzc2lvbiwgZmFsc2UpOwotCQlzaWduYWxzTWFwID0gbmV3IEhhc2h0YWJsZTxCaXRMaXN0LCBMaXN0PElQRElTaWduYWw+PigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJU2lnbmFsTWFuYWdlciNnZXRTaWduYWxzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESVNpZ25hbFtdIGdldFNpZ25hbHMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlMaXN0PElQRElTaWduYWw+IHNpZ25hbHNMaXN0ID0gc2lnbmFsc01hcC5nZXQocVRhc2tzKTsKLQkJaWYgKHNpZ25hbHNMaXN0ID09IG51bGwpIHsKLQkJCXVwZGF0ZShxVGFza3MpOwotCQl9Ci0JCXNpZ25hbHNMaXN0ID0gc2lnbmFsc01hcC5nZXQocVRhc2tzKTsKLQkJaWYgKHNpZ25hbHNMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiAoSVBESVNpZ25hbFtdKXNpZ25hbHNMaXN0LnRvQXJyYXkobmV3IElQRElTaWduYWxbMF0pOwotCQl9Ci0JCXJldHVybiBFTVBUWV9TSUdOQUxTOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJU2lnbmFsTWFuYWdlciNoYW5kbGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWwsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlKElQRElTaWduYWwgc2lnLCBib29sZWFuIGlzSWdub3JlLCBib29sZWFuIGlzU3RvcCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNpZy5nZXROYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCIgIik7Ci0JCWlmIChpc0lnbm9yZSkgewotCQkJYnVmZmVyLmFwcGVuZCgiaWdub3JlIik7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJub2lnbm9yZSIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIiAiKTsKLQkJaWYgKGlzU3RvcCkgewotCQkJYnVmZmVyLmFwcGVuZCgic3RvcCIpOwotCQl9IGVsc2UgIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIm5vc3RvcCIpOwotCQl9Ci0JCQotCQlJUERJQ29tbWFuZFJlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRDb21tYW5kUmVxdWVzdChzaWcuZ2V0VGFza3MoKSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCXJlcXVlc3Qud2FpdFVudGlsQ29tcGxldGVkKHNpZy5nZXRUYXNrcygpKTsKLQkJc2lnLnNldEhhbmRsZShpc0lnbm9yZSwgaXNTdG9wKTsKLQkJc2Vzc2lvbi5nZXRFdmVudE1hbmFnZXIoKS5maXJlRXZlbnRzKG5ldyBJUERJRXZlbnRbXSB7IAotCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3Q2hhbmdlZEV2ZW50KAotCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdTaWduYWxJbmZvKHNlc3Npb24sIHNpZy5nZXRUYXNrcygpLCBzaWcuZ2V0TmFtZSgpLCBzaWcuZ2V0RGVzY3JpcHRpb24oKSwgc2lnLCBudWxsKSkgfSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BYnN0cmFjdFBESU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlzaWduYWxzTWFwLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BYnN0cmFjdFBESU1hbmFnZXIjdXBkYXRlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJU2lnbmFsRGVzY3JpcHRvcltdIG5ld19zaWdzID0gY3JlYXRlU2lnbmFscyhxVGFza3MpOwotCQlMaXN0PElQRElFdmVudD4gZXZlbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxJUERJRXZlbnQ+KG5ld19zaWdzLmxlbmd0aCk7Ci0JCUxpc3Q8SVBESVNpZ25hbD4gc2lnbmFsc0xpc3QgPSBnZXRTaWduYWxzTGlzdChxVGFza3MpOwotCQlmb3IgKGludCBpID0gMDsgaTxuZXdfc2lncy5sZW5ndGg7IGkrKykgewotCQkJSVBESVNpZ25hbCBzaWcgPSBmaW5kU2lnbmFsKHFUYXNrcywgbmV3X3NpZ3NbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmIChzaWcgIT0gbnVsbCkgewotCQkJCWlmIChoYXNTaWduYWxDaGFuZ2VkKHNpZywgbmV3X3NpZ3NbaV0pKSB7Ci0JCQkJCS8vIEZpcmUgQ2hhbmdlZEV2ZW50Ci0JCQkJCXNpZy5zZXREZXNjcmlwdG9yKG5ld19zaWdzW2ldKTsKLQkJCQkJZXZlbnRMaXN0LmFkZChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0NoYW5nZWRFdmVudCgKLQkJCQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1NpZ25hbEluZm8oc2Vzc2lvbiwgcVRhc2tzLCBzaWcuZ2V0TmFtZSgpLCBzaWcuZ2V0RGVzY3JpcHRpb24oKSwgc2lnLCBudWxsKSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2lnbmFsc0xpc3QuYWRkKHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3U2lnbmFsKHNlc3Npb24sIHFUYXNrcywgbmV3X3NpZ3NbaV0pKTsKLQkJCX0KLQkJfQotCQlJUERJRXZlbnRbXSBldmVudHMgPSAoSVBESUV2ZW50W10pZXZlbnRMaXN0LnRvQXJyYXkobmV3IElQRElFdmVudFswXSk7Ci0JCXNlc3Npb24uZ2V0RXZlbnRNYW5hZ2VyKCkuZmlyZUV2ZW50cyhldmVudHMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJUERJU2lnbmFsRGVzY3JpcHRvcltdIGNyZWF0ZVNpZ25hbHMoQml0TGlzdCBxVGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlU2lnbmFscyhxVGFza3MsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElQRElTaWduYWxEZXNjcmlwdG9yW10gY3JlYXRlU2lnbmFscyhCaXRMaXN0IHFUYXNrcywgU3RyaW5nIG5hbWUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJTGlzdFNpZ25hbHNSZXF1ZXN0IHJlcXVlc3QgPSBzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0TGlzdFNpZ25hbHNSZXF1ZXN0KHNlc3Npb24sIHFUYXNrcywgbmFtZSk7Ci0JCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJcmV0dXJuIHJlcXVlc3QuZ2V0U2lnbmFscyhxVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTGlzdDxJUERJU2lnbmFsPiBnZXRTaWduYWxzTGlzdChCaXRMaXN0IHFUYXNrcykgewotCQlMaXN0PElQRElTaWduYWw+IHNpZ25hbHNMaXN0ID0gc2lnbmFsc01hcC5nZXQocVRhc2tzKTsKLQkJaWYgKHNpZ25hbHNMaXN0ID09IG51bGwpIHsKLQkJCXNpZ25hbHNMaXN0ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PElQRElTaWduYWw+KCkpOwotCQkJc2lnbmFsc01hcC5wdXQocVRhc2tzLCBzaWduYWxzTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIHNpZ25hbHNMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2lnCi0JICogQHBhcmFtIGRlc2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1NpZ25hbENoYW5nZWQoSVBESVNpZ25hbCBzaWcsIElQRElTaWduYWxEZXNjcmlwdG9yIGRlc2MpIHsKLQkJcmV0dXJuICFzaWcuZ2V0TmFtZSgpLmVxdWFscyhkZXNjLmdldE5hbWUoKSkgfHwgc2lnLmlzU3RvcFNldCgpICE9IGRlc2MuZ2V0U3RvcCgpIHx8IHNpZy5pc0lnbm9yZSgpICE9ICFkZXNjLmdldFBhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUERJU2lnbmFsIGZpbmRTaWduYWwoQml0TGlzdCBxVGFza3MsIFN0cmluZyBuYW1lKSB7Ci0JCUlQRElTaWduYWwgc2lnID0gbnVsbDsKLQkJTGlzdDxJUERJU2lnbmFsPiBzaWduYWxzTGlzdCA9IHNpZ25hbHNNYXAuZ2V0KHFUYXNrcyk7Ci0JCWlmIChzaWduYWxzTGlzdCAhPSBudWxsKSB7Ci0JCQlJUERJU2lnbmFsW10gc2lncyA9IChJUERJU2lnbmFsW10pc2lnbmFsc0xpc3QudG9BcnJheShuZXcgSVBESVNpZ25hbFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2lnc1tpXS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXNpZyA9IHNpZ3NbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2lnOwotCX0KLX0gCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvU291cmNlTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL1NvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1MTc5OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvU291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElTb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNaXhlZEluc3RydWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cwotCQlJUERJU291cmNlTWFuYWdlciB7Ci0JcHVibGljIFNvdXJjZU1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlzdXBlcihzZXNzaW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuSVBESVNvdXJjZU1hbmFnZXIjZ2V0RGV0YWlsVHlwZU5hbWUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlRhcmdldCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXRhaWxUeXBlTmFtZShJUERJVGFyZ2V0IHRhcmdldCwgU3RyaW5nIHR5cGVuYW1lKQotCQkJdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFyZ2V0LmdldFRhc2tzKCksCi0JCQkJIk5vdCBpbXBsZW1lbnRzIFNvdXJjZU1hbmFnZXIgLSBnZXREZXRhaWxUeXBlTmFtZSgpIHlldCIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLklQRElTb3VyY2VNYW5hZ2VyI2dldERldGFpbFR5cGVOYW1lRnJvbVZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5TdGFja0ZyYW1lLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERldGFpbFR5cGVOYW1lRnJvbVZhcmlhYmxlKElQRElTdGFja0ZyYW1lIGZyYW1lLAotCQkJU3RyaW5nIHZhcmlhYmxlKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVRhcmdldCB0YXJnZXQgPSBmcmFtZS5nZXRUYXJnZXQoKTsKLQkJSVBESVRocmVhZCBjdXJyZW50VGhyZWFkID0gdGFyZ2V0LmdldEN1cnJlbnRUaHJlYWQoKTsKLQkJSVBESVN0YWNrRnJhbWUgY3VycmVudEZyYW1lID0gY3VycmVudFRocmVhZC5nZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQl0cnkgewotCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoZnJhbWUuZ2V0VGhyZWFkKCksIGZhbHNlKTsKLQkJCWZyYW1lLmdldFRocmVhZCgpLnNldEN1cnJlbnRTdGFja0ZyYW1lKGZyYW1lLCBmYWxzZSk7Ci0JCQlyZXR1cm4gZ2V0RGV0YWlsVHlwZU5hbWUodGFyZ2V0LCB2YXJpYWJsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChjdXJyZW50VGhyZWFkLCBmYWxzZSk7Ci0JCQljdXJyZW50VGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKGN1cnJlbnRGcmFtZSwgZmFsc2UpOwotCQkJdGFyZ2V0LnJlbGVhc2VUYXJnZXQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLklQRElTb3VyY2VNYW5hZ2VyI2dldEluc3RydWN0aW9ucyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsCi0JICogICAgICBqYXZhLm1hdGguQmlnSW50ZWdlciwgamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0JICovCi0JcHVibGljIElQRElJbnN0cnVjdGlvbltdIGdldEluc3RydWN0aW9ucyhCaXRMaXN0IHFUYXNrcywgQmlnSW50ZWdlciBzdGFydCwKLQkJCUJpZ0ludGVnZXIgZW5kKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsCi0JCQkJIk5vdCBpbXBsZW1lbnRlZCBTb3VyY2VNYW5hZ2VyIC0gZ2V0SW5zdHJ1Y3Rpb25zKCkgeWV0Iik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuSVBESVNvdXJjZU1hbmFnZXIjZ2V0SW5zdHJ1Y3Rpb25zKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUluc3RydWN0aW9uW10gZ2V0SW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgZmlsZW5hbWUsCi0JCQlpbnQgbGluZW51bSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRJbnN0cnVjdGlvbnMocVRhc2tzLCBmaWxlbmFtZSwgbGluZW51bSwgLTEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLklQRElTb3VyY2VNYW5hZ2VyI2dldEluc3RydWN0aW9ucyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUluc3RydWN0aW9uW10gZ2V0SW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgZmlsZW5hbWUsCi0JCQlpbnQgbGluZW51bSwgaW50IGxpbmVzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsCi0JCQkJIk5vdCBpbXBsZW1lbnRlZCBTb3VyY2VNYW5hZ2VyIC0gZ2V0SW5zdHJ1Y3Rpb25zKCkgeWV0Iik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuSVBESVNvdXJjZU1hbmFnZXIjZ2V0TWl4ZWRJbnN0cnVjdGlvbnMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LAotCSAqICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIsIGphdmEubWF0aC5CaWdJbnRlZ2VyKQotCSAqLwotCXB1YmxpYyBJUERJTWl4ZWRJbnN0cnVjdGlvbltdIGdldE1peGVkSW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLAotCQkJQmlnSW50ZWdlciBzdGFydCwgQmlnSW50ZWdlciBlbmQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHFUYXNrcywKLQkJCQkiTm90IGltcGxlbWVudGVkIFNvdXJjZU1hbmFnZXIgLSBnZXRNaXhlZEluc3RydWN0aW9ucygpIHlldCIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLklQRElTb3VyY2VNYW5hZ2VyI2dldE1peGVkSW5zdHJ1Y3Rpb25zKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESU1peGVkSW5zdHJ1Y3Rpb25bXSBnZXRNaXhlZEluc3RydWN0aW9ucyhCaXRMaXN0IHFUYXNrcywKLQkJCVN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmVudW0pIHRocm93cyBQRElFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TWl4ZWRJbnN0cnVjdGlvbnMocVRhc2tzLCBmaWxlbmFtZSwgbGluZW51bSwgLTEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLklQRElTb3VyY2VNYW5hZ2VyI2dldE1peGVkSW5zdHJ1Y3Rpb25zKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJTWl4ZWRJbnN0cnVjdGlvbltdIGdldE1peGVkSW5zdHJ1Y3Rpb25zKEJpdExpc3QgcVRhc2tzLAotCQkJU3RyaW5nIGZpbGVuYW1lLCBpbnQgbGluZW51bSwgaW50IGxpbmVzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsCi0JCQkJIk5vdCBpbXBsZW1lbnRlZCBTb3VyY2VNYW5hZ2VyIC0gZ2V0TWl4ZWRJbnN0cnVjdGlvbnMoKSB5ZXQiKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5JUERJU291cmNlTWFuYWdlciNnZXRTb3VyY2VQYXRocyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFNvdXJjZVBhdGhzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsCi0JCQkJIk5vdCBpbXBsZW1lbnRlZCBTb3VyY2VNYW5hZ2VyIC0gZ2V0U291cmNlUGF0aHMoKSB5ZXQiKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5JUERJU291cmNlTWFuYWdlciNnZXRUeXBlTmFtZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuVGFyZ2V0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKElQRElUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgdmFyaWFibGUpCi0JCQl0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXJnZXQuZ2V0VGFza3MoKSwKLQkJCQkiTm90IGltcGxlbWVudHMgU291cmNlTWFuYWdlciAtIGdldFR5cGVOYW1lKCkgeWV0Iik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuSVBESVNvdXJjZU1hbmFnZXIjZ2V0VHlwZU5hbWVGcm9tVmFyaWFibGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlN0YWNrRnJhbWUsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVGcm9tVmFyaWFibGUoSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyB2YXJpYWJsZSkKLQkJCXRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVGFyZ2V0IHRhcmdldCA9IGZyYW1lLmdldFRhcmdldCgpOwotCQlJUERJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSB0YXJnZXQuZ2V0Q3VycmVudFRocmVhZCgpOwotCQlJUERJU3RhY2tGcmFtZSBjdXJyZW50RnJhbWUgPSBjdXJyZW50VGhyZWFkLmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCXRhcmdldC5sb2NrVGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChmcmFtZS5nZXRUaHJlYWQoKSwgZmFsc2UpOwotCQkJZnJhbWUuZ2V0VGhyZWFkKCkuc2V0Q3VycmVudFN0YWNrRnJhbWUoZnJhbWUsIGZhbHNlKTsKLQkJCXJldHVybiBnZXRUeXBlTmFtZSh0YXJnZXQsIHZhcmlhYmxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRhcmdldC5zZXRDdXJyZW50VGhyZWFkKGN1cnJlbnRUaHJlYWQsIGZhbHNlKTsKLQkJCWN1cnJlbnRUaHJlYWQuc2V0Q3VycmVudFN0YWNrRnJhbWUoY3VycmVudEZyYW1lLCBmYWxzZSk7Ci0JCQl0YXJnZXQucmVsZWFzZVRhcmdldCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuSVBESVNvdXJjZU1hbmFnZXIjc2V0U291cmNlUGF0aHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhdGhzKEJpdExpc3QgcVRhc2tzLCBTdHJpbmdbXSBkaXJzKQotCQkJdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLAotCQkJCSJOb3QgaW1wbGVtZW50ZWQgU291cmNlTWFuYWdlciAtIHNldFNvdXJjZVBhdGhzKCkgeWV0Iik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciNzaHV0ZG93bigpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCS8vIERvIGRvdGhpbmcgaGVyZQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9UYXJnZXRNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvVGFyZ2V0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmVkNTRiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9UYXJnZXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhcmdldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TWFuYWdlciBleHRlbmRzIEFic3RyYWN0UERJTWFuYWdlciBpbXBsZW1lbnRzIElQRElUYXJnZXRNYW5hZ2VyIHsKLQlwcml2YXRlIE1hcDxCaXRMaXN0LCBJUERJVGFyZ2V0PiB0YXJnZXRNYXA7Ci0KLQlwdWJsaWMgVGFyZ2V0TWFuYWdlcihJUERJU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRydWUpOwotCQl0YXJnZXRNYXAgPSBuZXcgSGFzaE1hcDxCaXRMaXN0LCBJUERJVGFyZ2V0PigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFyZ2V0TWFuYWdlciNhZGRUYXJnZXQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBJUERJVGFyZ2V0IGFkZFRhcmdldChCaXRMaXN0IHFUYXNrcykgewotCQlpZiAoZ2V0VGFyZ2V0KHFUYXNrcykgPT0gbnVsbCkgewotCQkJSVBESVRhcmdldCB0YXJnZXQgPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld1RhcmdldChzZXNzaW9uLCBxVGFza3MpOwotCQkJdGFyZ2V0TWFwLnB1dChxVGFza3MsIHRhcmdldCk7Ci0JCQlyZXR1cm4gdGFyZ2V0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFyZ2V0TWFuYWdlciNjbGVhbnVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotCQl0YXJnZXRNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhcmdldE1hbmFnZXIjZ2V0VGFyZ2V0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldCBnZXRUYXJnZXQoQml0TGlzdCBxVGFza3MpIHsKLQkJc3luY2hyb25pemVkICh0YXJnZXRNYXApIHsKLQkJCXJldHVybiB0YXJnZXRNYXAuZ2V0KHFUYXNrcyk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhcmdldE1hbmFnZXIjZ2V0VGFyZ2V0cygpCi0JICovCi0JcHVibGljIElQRElUYXJnZXRbXSBnZXRUYXJnZXRzKCkgewotCQlyZXR1cm4gdGFyZ2V0TWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IElQRElUYXJnZXRbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFyZ2V0TWFuYWdlciNyZW1vdmVUYXJnZXQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVRhcmdldChCaXRMaXN0IHFUYXNrcykgewotCQlyZXR1cm4gKHRhcmdldE1hcC5yZW1vdmUocVRhc2tzKSAhPSBudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXIuQWJzdHJhY3RQRElNYW5hZ2VyI3NodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJdGFyZ2V0TWFwLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tYW5hZ2VyL1Rhc2tNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvVGFza01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjZDM4MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvVGFza01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGFza01hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cyBJUERJVGFza01hbmFnZXIgewotCXByaXZhdGUgQml0TGlzdCB0ZXJtaW5hdGVkVGFza3M7Ci0JcHJpdmF0ZSBCaXRMaXN0IHN1c3BlbmRlZFRhc2tzOwotCXByaXZhdGUgQml0TGlzdCByZWdpc3RlcmVkVGFza3M7Ci0JcHJpdmF0ZSBCaXRMaXN0IHBlbmRpbmdUYXNrczsKLQlwcml2YXRlIEJpdExpc3QgY2FuU3RlcFJldHVyblRhc2tzOwotCi0JcHVibGljIFRhc2tNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJc3VwZXIoc2Vzc2lvbiwgZmFsc2UpOwotCQl0ZXJtaW5hdGVkVGFza3MgPSBuZXcgQml0TGlzdChzZXNzaW9uLmdldFRvdGFsVGFza3MoKSk7Ci0JCXN1c3BlbmRlZFRhc2tzID0gbmV3IEJpdExpc3Qoc2Vzc2lvbi5nZXRUb3RhbFRhc2tzKCkpOwotCQlyZWdpc3RlcmVkVGFza3MgPSBuZXcgQml0TGlzdChzZXNzaW9uLmdldFRvdGFsVGFza3MoKSk7Ci0JCXBlbmRpbmdUYXNrcyA9IG5ldyBCaXRMaXN0KHNlc3Npb24uZ2V0VG90YWxUYXNrcygpKTsKLQkJY2FuU3RlcFJldHVyblRhc2tzID0gbmV3IEJpdExpc3Qoc2Vzc2lvbi5nZXRUb3RhbFRhc2tzKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjY2FuQWxsU3RlcFJldHVybihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQWxsU3RlcFJldHVybihCaXRMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiBnZXRDYW5ub3RTdGVwUmV0dXJuVGFza3ModGFza3MuY29weSgpKS5pc0VtcHR5KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNnZXRDYW5ub3RTdGVwUmV0dXJuVGFza3Mob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldENhbm5vdFN0ZXBSZXR1cm5UYXNrcyhCaXRMaXN0IHRhc2tzKSB7Ci0JCXRhc2tzLmFuZE5vdChnZXRDYW5TdGVwUmV0dXJuVGFza3MoKSk7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2dldENhblN0ZXBSZXR1cm5UYXNrcygpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0Q2FuU3RlcFJldHVyblRhc2tzKCkgewotCQlyZXR1cm4gY2FuU3RlcFJldHVyblRhc2tzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjZ2V0Q2FuU3RlcFJldHVyblRhc2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRDYW5TdGVwUmV0dXJuVGFza3MoQml0TGlzdCB0YXNrcykgewotCQl0YXNrcy5hbmQoZ2V0Q2FuU3RlcFJldHVyblRhc2tzKCkpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNnZXROb25QZW5kaW5nVGFza3Mob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldE5vblBlbmRpbmdUYXNrcyhCaXRMaXN0IHRhc2tzKSB7Ci0JCXRhc2tzLmFuZE5vdChnZXRQZW5kaW5nVGFza3MoKSk7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2dldE5vblJ1bm5pbmdUYXNrcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0Tm9uUnVubmluZ1Rhc2tzKEJpdExpc3QgdGFza3MpIHsKLQkJdGFza3MuYW5kTm90KGdldFJ1bm5pbmdUYXNrcyh0YXNrcy5jb3B5KCkpKTsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjZ2V0Tm9uU3VzcGVuZGVkVGFza3Mob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldE5vblN1c3BlbmRlZFRhc2tzKEJpdExpc3QgdGFza3MpIHsKLQkJdGFza3MuYW5kTm90KGdldFN1c3BlbmRlZFRhc2tzKCkpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNnZXROb25UZXJtaW5hdGVkVGFza3Mob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldE5vblRlcm1pbmF0ZWRUYXNrcyhCaXRMaXN0IHRhc2tzKSB7Ci0JCXRhc2tzLmFuZE5vdChnZXRUZXJtaW5hdGVkVGFza3MoKSk7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2dldFBlbmRpbmdUYXNrcygpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0UGVuZGluZ1Rhc2tzKCkgewotCQlyZXR1cm4gcGVuZGluZ1Rhc2tzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjZ2V0UGVuZGluZ1Rhc2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRQZW5kaW5nVGFza3MoQml0TGlzdCB0YXNrcykgewotCQl0YXNrcy5hbmQoZ2V0UGVuZGluZ1Rhc2tzKCkpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNnZXRSZWdpc3RlcmVkVGFza3MoKQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFJlZ2lzdGVyZWRUYXNrcygpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyZWRUYXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2dldFJlZ2lzdGVyZWRUYXNrcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0UmVnaXN0ZXJlZFRhc2tzKEJpdExpc3QgdGFza3MpIHsKLQkJdGFza3MuYW5kKGdldFJlZ2lzdGVyZWRUYXNrcygpKTsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjZ2V0UnVubmluZ1Rhc2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRSdW5uaW5nVGFza3MoQml0TGlzdCB0YXNrcykgewotCQl0YXNrcy5hbmROb3QoZ2V0VGVybWluYXRlZFRhc2tzKCkpOwotCQl0YXNrcy5hbmROb3QoZ2V0U3VzcGVuZGVkVGFza3MoKSk7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2dldFN1c3BlbmRlZFRhc2tzKCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRTdXNwZW5kZWRUYXNrcygpIHsKLQkJcmV0dXJuIHN1c3BlbmRlZFRhc2tzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjZ2V0U3VzcGVuZGVkVGFza3Mob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFN1c3BlbmRlZFRhc2tzKEJpdExpc3QgdGFza3MpIHsKLQkJdGFza3MuYW5kKGdldFN1c3BlbmRlZFRhc2tzKCkpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNnZXRUZXJtaW5hdGVkVGFza3MoKQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFRlcm1pbmF0ZWRUYXNrcygpIHsKLQkJcmV0dXJuIHRlcm1pbmF0ZWRUYXNrczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjZ2V0VGVybWluYXRlZFRhc2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUZXJtaW5hdGVkVGFza3MoQml0TGlzdCB0YXNrcykgewotCQl0YXNrcy5hbmQoZ2V0VGVybWluYXRlZFRhc2tzKCkpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2dldFVucmVnaXN0ZXJlZFRhc2tzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRVbnJlZ2lzdGVyZWRUYXNrcyhCaXRMaXN0IHRhc2tzKSB7Ci0JCXRhc2tzLmFuZE5vdChnZXRSZWdpc3RlcmVkVGFza3MoKSk7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2lzQWxsUGVuZGluZyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxQZW5kaW5nKEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIGdldE5vblBlbmRpbmdUYXNrcyh0YXNrcy5jb3B5KCkpLmlzRW1wdHkoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI2lzQWxsUmVnaXN0ZXJlZChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxSZWdpc3RlcmVkKEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIGdldFVucmVnaXN0ZXJlZFRhc2tzKHRhc2tzLmNvcHkoKSkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjaXNBbGxSdW5uaW5nKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbFJ1bm5pbmcoQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gKCFpc0FsbFN1c3BlbmRlZCh0YXNrcykgJiYgIWlzQWxsVGVybWluYXRlZCh0YXNrcykpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjaXNBbGxTdXNwZW5kZWQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsU3VzcGVuZGVkKEJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIGdldE5vblN1c3BlbmRlZFRhc2tzKHRhc2tzLmNvcHkoKSkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjaXNBbGxUZXJtaW5hdGVkKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbFRlcm1pbmF0ZWQoQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gZ2V0Tm9uVGVybWluYXRlZFRhc2tzKHRhc2tzLmNvcHkoKSkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXIjc2V0Q2FuU3RlcFJldHVyblRhc2tzKGJvb2xlYW4sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5TdGVwUmV0dXJuVGFza3MoYm9vbGVhbiBpc0FkZCwgQml0TGlzdCB0YXNrcykgewotCQlpZiAoaXNBZGQpCi0JCQljYW5TdGVwUmV0dXJuVGFza3MgPSBhZGRUYXNrcyhjYW5TdGVwUmV0dXJuVGFza3MsIHRhc2tzKTsKLQkJZWxzZQotCQkJcmVtb3ZlVGFza3MoY2FuU3RlcFJldHVyblRhc2tzLCB0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNzZXRQZW5kaW5nVGFza3MoYm9vbGVhbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlbmRpbmdUYXNrcyhib29sZWFuIGlzQWRkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCWlmIChpc0FkZCkKLQkJCXBlbmRpbmdUYXNrcyA9IGFkZFRhc2tzKHBlbmRpbmdUYXNrcywgdGFza3MpOwotCQllbHNlCi0JCQlyZW1vdmVUYXNrcyhwZW5kaW5nVGFza3MsIHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI3NldFJlZ2lzdGVyVGFza3MoYm9vbGVhbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyVGFza3MoYm9vbGVhbiBpc0FkZCwgQml0TGlzdCB0YXNrcykgewotCQlpZiAoaXNBZGQpCi0JCQlyZWdpc3RlcmVkVGFza3MgPSBhZGRUYXNrcyhyZWdpc3RlcmVkVGFza3MsIHRhc2tzKTsKLQkJZWxzZQotCQkJcmVtb3ZlVGFza3MocmVnaXN0ZXJlZFRhc2tzLCB0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElUYXNrTWFuYWdlciNzZXRTdXNwZW5kVGFza3MoYm9vbGVhbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1c3BlbmRUYXNrcyhib29sZWFuIGlzQWRkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCWlmIChpc0FkZCkKLQkJCXN1c3BlbmRlZFRhc2tzID0gYWRkVGFza3Moc3VzcGVuZGVkVGFza3MsIHRhc2tzKTsKLQkJZWxzZSB7Ci0JCQlyZW1vdmVUYXNrcyhzdXNwZW5kZWRUYXNrcywgdGFza3MpOwotCQkJc2V0Q2FuU3RlcFJldHVyblRhc2tzKGZhbHNlLCB0YXNrcyk7Ly9yZW1vdmUgY2FuIHN0ZXAgcmV0dXJuIHRhc2tzCQkJCi0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRhc2tNYW5hZ2VyI3NldFRlcm1pbmF0ZVRhc2tzKGJvb2xlYW4sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXJtaW5hdGVUYXNrcyhib29sZWFuIGlzQWRkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCWlmIChpc0FkZCkgewotCQkJdGVybWluYXRlZFRhc2tzID0gYWRkVGFza3ModGVybWluYXRlZFRhc2tzLCB0YXNrcyk7Ci0JCQlzZXRTdXNwZW5kVGFza3MoZmFsc2UsIHRhc2tzKTsvL3JlbW92ZSBzdXNwZW5kZWQgdGFza3MKLQkJfQotCQllbHNlCi0JCQlyZW1vdmVUYXNrcyh0ZXJtaW5hdGVkVGFza3MsIHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciNzaHV0ZG93bigpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCS8qCi0JCXRlcm1pbmF0ZWRUYXNrcyA9IG51bGw7Ci0JCXN1c3BlbmRlZFRhc2tzID0gbnVsbDsKLQkJcmVnaXN0ZXJlZFRhc2tzID0gbnVsbDsKLQkJcGVuZGluZ1Rhc2tzID0gbnVsbDsKLQkJY2FuU3RlcFJldHVyblRhc2tzID0gbnVsbDsKLQkJKi8KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGN1clRhc2tzCi0JICogQHBhcmFtIG5ld1Rhc2tzCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgQml0TGlzdCBhZGRUYXNrcyhCaXRMaXN0IGN1clRhc2tzLCBCaXRMaXN0IG5ld1Rhc2tzKSB7Ci0JCWlmIChjdXJUYXNrcy5zaXplKCkgPCBuZXdUYXNrcy5zaXplKCkpIHsKLQkJCW5ld1Rhc2tzLm9yKGN1clRhc2tzKTsKLQkJCWN1clRhc2tzID0gIG5ld1Rhc2tzLmNvcHkoKTsKLQkJfQotCQljdXJUYXNrcy5vcihuZXdUYXNrcyk7Ci0JCXJldHVybiBjdXJUYXNrczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGN1clRhc2tzCi0JICogQHBhcmFtIG5ld1Rhc2tzCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVUYXNrcyhCaXRMaXN0IGN1clRhc2tzLCBCaXRMaXN0IG5ld1Rhc2tzKSB7Ci0JCWN1clRhc2tzLmFuZE5vdChuZXdUYXNrcyk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9UaHJlYWRNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvVGhyZWFkTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMzZGY5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9UaHJlYWRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1hbmFnZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGhyZWFkTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJR2V0SW5mb1RocmVhZHNSZXF1ZXN0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFRocmVhZE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBESU1hbmFnZXIgaW1wbGVtZW50cyBJUERJVGhyZWFkTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBESVRocmVhZFtdIG5vVGhyZWFkcyA9IG5ldyBJUERJVGhyZWFkWzBdOwotCXByaXZhdGUgTWFwPEJpdExpc3QsIElQRElUaHJlYWRbXT4gdGhyZWFkTWFwID0gbmV3IEhhc2h0YWJsZTxCaXRMaXN0LCBJUERJVGhyZWFkW10+KCk7Ci0JCi0JcHVibGljIFRocmVhZE1hbmFnZXIoSVBESVNlc3Npb24gc2Vzc2lvbikgewotCQlzdXBlcihzZXNzaW9uLCB0cnVlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVRocmVhZE1hbmFnZXIjZ2V0VGhyZWFkcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElUaHJlYWRbXSBnZXRUaHJlYWRzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVRocmVhZFtdIHRocmVhZHMgPSAgdGhyZWFkTWFwLmdldChxVGFza3MpOwotCQlpZiAodGhyZWFkcyA9PSBudWxsKSB7Ci0JCQl0aHJlYWRzID0gZ2V0UFRocmVhZHMocVRhc2tzKTsKLQkJCXRocmVhZE1hcC5wdXQocVRhc2tzLCB0aHJlYWRzKTsKLQkJfQotCQlyZXR1cm4gdGhyZWFkczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciNzaHV0ZG93bigpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRocmVhZE1hcC5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuQWJzdHJhY3RQRElNYW5hZ2VyI3VwZGF0ZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVBESVRocmVhZFtdIGdldFBUaHJlYWRzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVRocmVhZFtdIHB0aHJlYWRzID0gbm9UaHJlYWRzOwotCQlpbnQgY3VycmVudFRocmVhZElkID0gMDsKLQkJCi0JCUlQRElUYXJnZXQgdGFyZ2V0ID0gc2Vzc2lvbi5maW5kVGFyZ2V0KHFUYXNrcyk7Ci0JCUlQRElHZXRJbmZvVGhyZWFkc1JlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRHZXRJbmZvVGhyZWFkc1JlcXVlc3QocVRhc2tzKTsKLQkJc2Vzc2lvbi5nZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KHJlcXVlc3QpOwotCQlTdHJpbmdbXSBpZHMgPSByZXF1ZXN0LmdldFRocmVhZElkcyhxVGFza3MpOwotCQlpZiAoaWRzLmxlbmd0aCA+IDApIHsKLQkJCXB0aHJlYWRzID0gbmV3IElQRElUaHJlYWRbaWRzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHRocmVhZHNbaV0gPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld1RocmVhZChzZXNzaW9uLCB0YXJnZXQsIEludGVnZXIucGFyc2VJbnQoaWRzW2ldKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwdGhyZWFkcyA9IG5ldyBJUERJVGhyZWFkW10geyBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld1RocmVhZChzZXNzaW9uLCB0YXJnZXQsIDApIH07Ci0JCX0KLQkJY3VycmVudFRocmVhZElkID0gcHRocmVhZHNbMF0uZ2V0SWQoKTsKLQkJaWYgKGN1cnJlbnRUaHJlYWRJZCA9PSAwICYmIHB0aHJlYWRzLmxlbmd0aCA+IDEpIHsKLQkJCWN1cnJlbnRUaHJlYWRJZCA9IHB0aHJlYWRzWzFdLmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHB0aHJlYWRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9WYXJpYWJsZU1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbWFuYWdlci9WYXJpYWJsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0ZTA1OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21hbmFnZXIvVmFyaWFibGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tYW5hZ2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFyZ3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQXJndW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJR2xvYmFsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWRTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJTGlzdEFyZ3VtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFibGVNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RQRElNYW5hZ2VyIGltcGxlbWVudHMgSVBESVZhcmlhYmxlTWFuYWdlciB7Ci0Jc3RhdGljIGZpbmFsIElQRElWYXJpYWJsZVtdIEVNUFRZX1ZBUklBQkxFUyA9IHt9OwotCWludCBNQVhfU1RBQ0tfREVQVEggPSBJUERJVGhyZWFkLlNUQUNLRlJBTUVfREVGQVVMVF9ERVBUSDsKLQlNYXA8Qml0TGlzdCwgTGlzdDxJUERJVmFyaWFibGU+PiB2YXJpYWJsZXNNYXA7Ci0KLQlwdWJsaWMgVmFyaWFibGVNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdHJ1ZSk7Ci0JCXZhcmlhYmxlc01hcCA9IG5ldyBIYXNodGFibGU8Qml0TGlzdCwgTGlzdDxJUERJVmFyaWFibGU+PigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVmFyaWFibGVNYW5hZ2VyI2NyZWF0ZUFyZ3VtZW50KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQXJndW1lbnREZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBJUERJQXJndW1lbnQgY3JlYXRlQXJndW1lbnQoSVBESUFyZ3VtZW50RGVzY3JpcHRvciBhcmdEZXNjKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVZhcmlhYmxlIHZhcmlhYmxlID0gZmluZFZhcmlhYmxlKGFyZ0Rlc2MpOwotCQlJUERJQXJndW1lbnQgYXJndW1lbnQgPSBudWxsOwotCQlpZiAodmFyaWFibGUgIT0gbnVsbCAmJiB2YXJpYWJsZSBpbnN0YW5jZW9mIElQRElBcmd1bWVudCkgewotCQkJYXJndW1lbnQgPSAoSVBESUFyZ3VtZW50KSB2YXJpYWJsZTsKLQkJfQotCQlpZiAoYXJndW1lbnQgPT0gbnVsbCkgewotCQkJSVBESVN0YWNrRnJhbWUgc3RhY2sgPSBhcmdEZXNjLmdldFN0YWNrRnJhbWUoKTsKLQkJCUlQRElUYXJnZXQgdGFyZ2V0ID0gc3RhY2suZ2V0VGFyZ2V0KCk7Ci0JCQlJUERJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSB0YXJnZXQuZ2V0Q3VycmVudFRocmVhZCgpOwotCQkJSVBESVN0YWNrRnJhbWUgY3VycmVudEZyYW1lID0gY3VycmVudFRocmVhZC5nZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQkJdGFyZ2V0LmxvY2tUYXJnZXQoKTsKLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoc3RhY2suZ2V0VGhyZWFkKCksIGZhbHNlKTsKLQkJCQlzdGFjay5nZXRUaHJlYWQoKS5zZXRDdXJyZW50U3RhY2tGcmFtZShzdGFjaywgZmFsc2UpOwotCQkJCWFyZ3VtZW50ID0gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdBcmd1bWVudChzZXNzaW9uLCBhcmdEZXNjLCBhcmdEZXNjLmdldFZhcklkKCkpOwotCQkJCUxpc3Q8SVBESVZhcmlhYmxlPiB2YXJpYWJsZXNMaXN0ID0gZ2V0VmFyaWFibGVzTGlzdChhcmdEZXNjLmdldFRhc2tzKCkpOwotCQkJCXZhcmlhYmxlc0xpc3QuYWRkKGFyZ3VtZW50KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoY3VycmVudFRocmVhZCwgZmFsc2UpOwotCQkJCWN1cnJlbnRUaHJlYWQuc2V0Q3VycmVudFN0YWNrRnJhbWUoY3VycmVudEZyYW1lLCBmYWxzZSk7Ci0JCQkJdGFyZ2V0LnJlbGVhc2VUYXJnZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJndW1lbnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElWYXJpYWJsZU1hbmFnZXIjY3JlYXRlR2xvYmFsVmFyaWFibGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIElQRElHbG9iYWxWYXJpYWJsZSBjcmVhdGVHbG9iYWxWYXJpYWJsZShJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIHZhckRlc2MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVmFyaWFibGUgdmFyaWFibGUgPSBmaW5kVmFyaWFibGUodmFyRGVzYyk7Ci0JCUlQRElHbG9iYWxWYXJpYWJsZSBnbG9iYWwgPSBudWxsOwotCQlpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBJUERJR2xvYmFsVmFyaWFibGUpIHsKLQkJCWdsb2JhbCA9IChJUERJR2xvYmFsVmFyaWFibGUpdmFyaWFibGU7Ci0JCX0KLQkJaWYgKGdsb2JhbCA9PSBudWxsKSB7Ci0JCQlnbG9iYWwgPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld0dsb2JhbFZhcmlhYmxlKHNlc3Npb24sIHZhckRlc2MsIHZhckRlc2MuZ2V0VmFySWQoKSk7Ci0JCQlMaXN0PElQRElWYXJpYWJsZT4gdmFyaWFibGVzTGlzdCA9IGdldFZhcmlhYmxlc0xpc3QodmFyRGVzYy5nZXRUYXNrcygpKTsKLQkJCXZhcmlhYmxlc0xpc3QuYWRkKGdsb2JhbCk7Ci0JCX0KLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlciNjcmVhdGVMb2NhbFZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIElQRElMb2NhbFZhcmlhYmxlIGNyZWF0ZUxvY2FsVmFyaWFibGUoSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yIHZhckRlc2MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVmFyaWFibGUgdmFyaWFibGUgPSBmaW5kVmFyaWFibGUodmFyRGVzYyk7Ci0JCUlQRElMb2NhbFZhcmlhYmxlIGxvY2FsID0gbnVsbDsKLQkJaWYgKHZhcmlhYmxlIGluc3RhbmNlb2YgSVBESUxvY2FsVmFyaWFibGUpIHsKLQkJCWxvY2FsID0gKElQRElMb2NhbFZhcmlhYmxlKXZhcmlhYmxlOwotCQl9Ci0JCWlmIChsb2NhbCA9PSBudWxsKSB7Ci0JCQlJUERJU3RhY2tGcmFtZSBzdGFjayA9IChJUERJU3RhY2tGcmFtZSl2YXJEZXNjLmdldFN0YWNrRnJhbWUoKTsKLQkJCUlQRElUYXJnZXQgdGFyZ2V0ID0gc3RhY2suZ2V0VGFyZ2V0KCk7Ci0JCQlJUERJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSB0YXJnZXQuZ2V0Q3VycmVudFRocmVhZCgpOwotCQkJSVBESVN0YWNrRnJhbWUgY3VycmVudEZyYW1lID0gY3VycmVudFRocmVhZC5nZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQkJdGFyZ2V0LmxvY2tUYXJnZXQoKTsKLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoc3RhY2suZ2V0VGhyZWFkKCksIGZhbHNlKTsKLQkJCQlzdGFjay5nZXRUaHJlYWQoKS5zZXRDdXJyZW50U3RhY2tGcmFtZShzdGFjaywgZmFsc2UpOwotCQkJCWxvY2FsID0gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdMb2NhbFZhcmlhYmxlKHNlc3Npb24sIHZhckRlc2MsIHZhckRlc2MuZ2V0VmFySWQoKSk7Ci0JCQkJTGlzdDxJUERJVmFyaWFibGU+IHZhcmlhYmxlc0xpc3QgPSBnZXRWYXJpYWJsZXNMaXN0KHZhckRlc2MuZ2V0VGFza3MoKSk7Ci0JCQkJdmFyaWFibGVzTGlzdC5hZGQobG9jYWwpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChjdXJyZW50VGhyZWFkLCBmYWxzZSk7Ci0JCQkJY3VycmVudFRocmVhZC5zZXRDdXJyZW50U3RhY2tGcmFtZShjdXJyZW50RnJhbWUsIGZhbHNlKTsKLQkJCQl0YXJnZXQucmVsZWFzZVRhcmdldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlciNjcmVhdGVUaHJlYWRTdG9yYWdlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIElQRElUaHJlYWRTdG9yYWdlIGNyZWF0ZVRocmVhZFN0b3JhZ2UoSVBESVRocmVhZFN0b3JhZ2VEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKGRlc2MuZ2V0VGFza3MoKSwgUERJUmVzb3VyY2VzLmdldFN0cmluZygicGRpLlZhcmlhYmxlTWFuYWdlci5Vbmtub3duX3ZhcmlhYmxlX29iamVjdCIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhckRlc2MKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlIGNyZWF0ZVZhcmlhYmxlKElQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICh2YXJEZXNjIGluc3RhbmNlb2YgSVBESUFyZ3VtZW50RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIGNyZWF0ZUFyZ3VtZW50KChJUERJQXJndW1lbnREZXNjcmlwdG9yKXZhckRlc2MpOwotCQl9IGVsc2UgaWYgKHZhckRlc2MgaW5zdGFuY2VvZiBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBjcmVhdGVMb2NhbFZhcmlhYmxlKChJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IpdmFyRGVzYyk7Ci0JCX0gZWxzZSBpZiAodmFyRGVzYyBpbnN0YW5jZW9mIElQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBjcmVhdGVHbG9iYWxWYXJpYWJsZSgoSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcil2YXJEZXNjKTsKLQkJfSBlbHNlIGlmICh2YXJEZXNjIGluc3RhbmNlb2YgSVBESVJlZ2lzdGVyRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkuY3JlYXRlUmVnaXN0ZXIoKElQRElSZWdpc3RlckRlc2NyaXB0b3IpdmFyRGVzYyk7Ci0JCX0gZWxzZSBpZiAodmFyRGVzYyBpbnN0YW5jZW9mIElQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIGNyZWF0ZVRocmVhZFN0b3JhZ2UoKElQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcil2YXJEZXNjKTsKLQkJfQotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHZhckRlc2MuZ2V0VGFza3MoKSwgUERJUmVzb3VyY2VzLmdldFN0cmluZygicGRpLlZhcmlhYmxlTWFuYWdlci5Vbmtub3duX3ZhcmlhYmxlX29iamVjdCIpKTsJCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZGVzdHJveUFsbFZhcmlhYmxlcyhCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVBESUV2ZW50PiBldmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PElQRElFdmVudD4oKTsKLQkJSVBESVZhcmlhYmxlW10gdmFyaWFibGVzID0gZ2V0VmFyaWFibGVzKHFUYXNrcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgKytpKSB7Ci0JCQlyZW1vdmVWYXIocVRhc2tzLCB2YXJpYWJsZXNbaV0uZ2V0VmFySWQoKSk7Ci0JCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGVzdHJveWVkRXZlbnQoCi0JCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3VmFyaWFibGVJbmZvKHNlc3Npb24sIHFUYXNrcywgdmFyaWFibGVzW2ldLmdldFZhcklkKCksIHZhcmlhYmxlc1tpXSkpKTsKLQkJfQotCQlzZXNzaW9uLmdldEV2ZW50TWFuYWdlcigpLmZpcmVFdmVudHMoKElQRElFdmVudFtdKSBldmVudExpc3QudG9BcnJheShuZXcgSVBESUV2ZW50WzBdKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElWYXJpYWJsZU1hbmFnZXIjZGVzdHJveVZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGUpCi0JICovCi0JcHVibGljIHZvaWQgZGVzdHJveVZhcmlhYmxlKElQRElWYXJpYWJsZSB2YXJpYWJsZSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUJpdExpc3QgcVRhc2tzID0gdmFyaWFibGUuZ2V0VGFza3MoKTsKLQkJTGlzdDxJUERJVmFyaWFibGU+IHZhckxpc3QgPSBnZXRWYXJpYWJsZXNMaXN0KHFUYXNrcyk7Ci0JCWlmICh2YXJMaXN0LmNvbnRhaW5zKHZhcmlhYmxlKSkgewotCQkJcmVtb3ZlVmFyKHFUYXNrcywgdmFyaWFibGUuZ2V0VmFySWQoKSk7Ci0JCX0KLQkJSVBESUV2ZW50IGV2ZW50ID0gc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdEZXN0cm95ZWRFdmVudCgKLQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1ZhcmlhYmxlSW5mbyhzZXNzaW9uLCBxVGFza3MsIHZhcmlhYmxlLmdldFZhcklkKCksIHZhcmlhYmxlKSk7Ci0JCXNlc3Npb24uZ2V0RXZlbnRNYW5hZ2VyKCkuZmlyZUV2ZW50cyhuZXcgSVBESUV2ZW50W10geyBldmVudCB9KTsKLQl9Ci0JCi0JLyoqCi0JICogWFhYOiBjb2RlIGNoYW5nZSB0aGF0IGNvdWxkIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmVoYXZpb3IKLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGUgZmluZFZhcmlhYmxlKElQRElWYXJpYWJsZURlc2NyaXB0b3IgdikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElWYXJpYWJsZVtdIHZhcnMgPSBnZXRWYXJpYWJsZXModi5nZXRUYXNrcygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvL1RPRE8gY29tcGFyZSBGVUxMIE5BTUUKLQkJCWlmICh2YXJzW2ldLmdldEZ1bGxOYW1lKCkuZXF1YWxzKHYuZ2V0RnVsbE5hbWUoKSkKLQkJCQkJJiYgdmFyc1tpXS5lcXVhbERlc2NyaXB0b3JzKHYpKSB7Ci0JCQkJcmV0dXJuIHZhcnNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElWYXJpYWJsZU1hbmFnZXIjZ2V0QXJndW1lbnREZXNjcmlwdG9ycyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUpCi0JICovCi0JcHVibGljIElQRElBcmd1bWVudERlc2NyaXB0b3JbXSBnZXRBcmd1bWVudERlc2NyaXB0b3JzKElQRElTdGFja0ZyYW1lIGZyYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJTGlzdDxJUERJQXJndW1lbnREZXNjcmlwdG9yPiBhcmdPYmplY3RzID0gbmV3IEFycmF5TGlzdDxJUERJQXJndW1lbnREZXNjcmlwdG9yPigpOwotCQlJUERJVGFyZ2V0IHRhcmdldCA9IGZyYW1lLmdldFRhcmdldCgpOwotCQlJUERJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSB0YXJnZXQuZ2V0Q3VycmVudFRocmVhZCgpOwotCQlJUERJU3RhY2tGcmFtZSBjdXJyZW50RnJhbWUgPSBjdXJyZW50VGhyZWFkLmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCXRhcmdldC5sb2NrVGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChmcmFtZS5nZXRUaHJlYWQoKSwgZmFsc2UpOwotCQkJZnJhbWUuZ2V0VGhyZWFkKCkuc2V0Q3VycmVudFN0YWNrRnJhbWUoZnJhbWUsIGZhbHNlKTsKLQkJCQkJCQotCQkJaW50IGRlcHRoID0gZnJhbWUuZ2V0VGhyZWFkKCkuZ2V0U3RhY2tGcmFtZUNvdW50KCk7Ci0JCQlpbnQgbGV2ZWwgPSBmcmFtZS5nZXRMZXZlbCgpOwotCQkJaW50IGRpZmYgPSBkZXB0aCAtIGxldmVsOwotCQkJCi0JCQlJUERJTGlzdEFyZ3VtZW50c1JlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRMaXN0QXJndW1lbnRzUmVxdWVzdCh0YXJnZXQuZ2V0VGFza3MoKSwgZGlmZiwgZGlmZik7Ci0JCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQlTdHJpbmdbXSBhcmdzID0gcmVxdWVzdC5nZXRBcmd1bWVudHModGFyZ2V0LmdldFRhc2tzKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXJnT2JqZWN0cy5hZGQoc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdBcmd1bWVudERlc2NyaXB0b3Ioc2Vzc2lvbiwgdGFyZ2V0LmdldFRhc2tzKCksIG51bGwsIGZyYW1lLCBhcmdzW2ldLCBudWxsLCBhcmdzLmxlbmd0aCAtIGksIGxldmVsKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChjdXJyZW50VGhyZWFkLCBmYWxzZSk7Ci0JCQljdXJyZW50VGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKGN1cnJlbnRGcmFtZSwgZmFsc2UpOwotCQkJdGFyZ2V0LnJlbGVhc2VUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gKElQRElBcmd1bWVudERlc2NyaXB0b3JbXSkgYXJnT2JqZWN0cy50b0FycmF5KG5ldyBJUERJQXJndW1lbnREZXNjcmlwdG9yWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGZ1bmN0aW9uCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBnZXRHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IoQml0TGlzdCB0YXNrcywgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZnVuY3Rpb24sIFN0cmluZyBuYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpIHsKLQkJCWZpbGVuYW1lID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCWlmIChmdW5jdGlvbiA9PSBudWxsKSB7Ci0JCQlmdW5jdGlvbiA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChmaWxlbmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ1wnJykuYXBwZW5kKGZpbGVuYW1lKS5hcHBlbmQoJ1wnJykuYXBwZW5kKCI6OiIpOwotCQl9Ci0JCWlmIChmdW5jdGlvbi5sZW5ndGgoKSA+IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZnVuY3Rpb24pLmFwcGVuZCgiOjoiKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlyZXR1cm4gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3Ioc2Vzc2lvbiwgdGFza3MsIG51bGwsIG51bGwsIGJ1ZmZlci50b1N0cmluZygpLCBudWxsLCAwLCAwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlciNnZXRMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcnMob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lKQotCSAqLwotCXB1YmxpYyBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3JbXSBnZXRMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcnMoSVBESVN0YWNrRnJhbWUgZnJhbWUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlMaXN0PElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcj4gdmFyT2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8SVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yPigpOwotCQlJUERJVGFyZ2V0IHRhcmdldCA9IGZyYW1lLmdldFRhcmdldCgpOwotCQlJUERJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSB0YXJnZXQuZ2V0Q3VycmVudFRocmVhZCgpOwotCQlJUERJU3RhY2tGcmFtZSBjdXJyZW50RnJhbWUgPSBjdXJyZW50VGhyZWFkLmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCXRhcmdldC5sb2NrVGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChmcmFtZS5nZXRUaHJlYWQoKSwgZmFsc2UpOwotCQkJZnJhbWUuZ2V0VGhyZWFkKCkuc2V0Q3VycmVudFN0YWNrRnJhbWUoZnJhbWUsIGZhbHNlKTsKLQkJCWludCBsZXZlbCA9IGZyYW1lLmdldExldmVsKCk7Ci0JCQkKLQkJCUlQRElMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0IHJlcXVlc3QgPSBzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0TGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdCh0YXJnZXQuZ2V0VGFza3MoKSk7Ci0JCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQlTdHJpbmdbXSB2YXJzID0gcmVxdWVzdC5nZXRMb2NhbFZhcmlhYmxlcyh0YXJnZXQuZ2V0VGFza3MoKSk7Ci0JCQlmb3IgKGludCBpPTA7IGk8dmFycy5sZW5ndGg7IGkrKykgewotCQkJCXZhck9iamVjdHMuYWRkKHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3TG9jYWxWYXJpYWJsZURlc2NyaXB0b3Ioc2Vzc2lvbiwgdGFyZ2V0LmdldFRhc2tzKCksIG51bGwsIGZyYW1lLCB2YXJzW2ldLCBudWxsLCB2YXJzLmxlbmd0aCAtIGksIGxldmVsKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChjdXJyZW50VGhyZWFkLCBmYWxzZSk7Ci0JCQljdXJyZW50VGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKGN1cnJlbnRGcmFtZSwgZmFsc2UpOwotCQkJdGFyZ2V0LnJlbGVhc2VUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gKElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcltdKSB2YXJPYmplY3RzLnRvQXJyYXkobmV3IElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvclswXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElWYXJpYWJsZU1hbmFnZXIjZ2V0VGhyZWFkU3RvcmFnZURlc2NyaXB0b3JzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkKQotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3JbXSBnZXRUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcnMoSVBESVRocmVhZCB0aHJlYWQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvclswXTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHZhcmlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGUgZ2V0VmFyaWFibGUoQml0TGlzdCB0YXNrcywgU3RyaW5nIHZhcmlkKSB7Ci0JCUlQRElWYXJpYWJsZVtdIHZhcnMgPSBnZXRWYXJpYWJsZXModGFza3MpOwotCQlmb3IgKElQRElWYXJpYWJsZSB2YXIgOiB2YXJzKSB7Ci0JCQlpZiAodmFyLmdldFZhcklkKCkuZXF1YWxzKHZhcmlkKSkgewotCQkJCXJldHVybiB2YXI7Ci0JCQl9Ci0JCQlJUERJVmFyaWFibGUgdiA9IHZhci5nZXRDaGlsZCh2YXJpZCk7Ci0JCQlpZiAodiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElWYXJpYWJsZU1hbmFnZXIjZ2V0VmFyaWFibGVCeU5hbWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGUgZ2V0VmFyaWFibGVCeU5hbWUoQml0TGlzdCB0YXNrcywgU3RyaW5nIHZhcm5hbWUpIHsKLQkJSVBESVZhcmlhYmxlW10gdmFycyA9IGdldFZhcmlhYmxlcyh0YXNrcyk7Ci0JCWZvciAoSVBESVZhcmlhYmxlIHZhciA6IHZhcnMpIHsKLQkJCWlmICh2YXIuZ2V0TmFtZSgpLmVxdWFscyh2YXJuYW1lKSkKLQkJCQlyZXR1cm4gdmFyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVmFyaWFibGVNYW5hZ2VyI2dldFZhcmlhYmxlRGVzY3JpcHRvckFzQXJyYXkob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVEZXNjcmlwdG9yIGdldFZhcmlhYmxlRGVzY3JpcHRvckFzQXJyYXkoSVBESVZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVGhyZWFkIHRocmVhZCA9IHZhckRlc2MuZ2V0VGhyZWFkKCk7Ci0JCUlQRElTdGFja0ZyYW1lIGZyYW1lID0gdmFyRGVzYy5nZXRTdGFja0ZyYW1lKCk7Ci0JCVN0cmluZyBuYW1lID0gdmFyRGVzYy5nZXROYW1lKCk7Ci0JCVN0cmluZyBmdWxsTmFtZSA9IHZhckRlc2MuZ2V0RnVsbE5hbWUoKTsKLQkJaW50IHBvcyA9IHZhckRlc2MuZ2V0UG9zaXRpb24oKTsKLQkJaW50IGRlcHRoID0gdmFyRGVzYy5nZXRTdGFja0RlcHRoKCk7Ci0JCUlQRElWYXJpYWJsZURlc2NyaXB0b3Igdm8gPSBudWxsOwotCi0JCWlmICh2YXJEZXNjIGluc3RhbmNlb2YgSVBESUFyZ3VtZW50RGVzY3JpcHRvciB8fCB2YXJEZXNjIGluc3RhbmNlb2YgSVBESUFyZ3VtZW50KSB7Ci0JCQl2byA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3QXJndW1lbnREZXNjcmlwdG9yKHNlc3Npb24sIHZhckRlc2MuZ2V0VGFza3MoKSwgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgpOwotCQl9IGVsc2UgaWYgKHZhckRlc2MgaW5zdGFuY2VvZiBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgfHwgdmFyRGVzYyBpbnN0YW5jZW9mIElQRElMb2NhbFZhcmlhYmxlKSB7Ci0JCQl2byA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3TG9jYWxWYXJpYWJsZURlc2NyaXB0b3Ioc2Vzc2lvbiwgdmFyRGVzYy5nZXRUYXNrcygpLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmdWxsTmFtZSwgcG9zLCBkZXB0aCk7Ci0JCX0gZWxzZSBpZiAodmFyRGVzYyBpbnN0YW5jZW9mIElQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IgfHwgdmFyRGVzYyBpbnN0YW5jZW9mIElQRElHbG9iYWxWYXJpYWJsZSkgewotCQkJdm8gPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld0dsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcihzZXNzaW9uLCB2YXJEZXNjLmdldFRhc2tzKCksIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoKTsKLQkJfSBlbHNlIGlmICh2YXJEZXNjIGluc3RhbmNlb2YgSVBESVJlZ2lzdGVyRGVzY3JpcHRvciB8fCB2YXJEZXNjIGluc3RhbmNlb2YgSVBESVJlZ2lzdGVyKSB7Ci0JCQl2byA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3UmVnaXN0ZXJEZXNjcmlwdG9yKHNlc3Npb24sIHZhckRlc2MuZ2V0VGFza3MoKSwgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgpOwotCQl9IGVsc2UgaWYgKHZhckRlc2MgaW5zdGFuY2VvZiBJUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IgfHwgdmFyRGVzYyBpbnN0YW5jZW9mIElQRElUaHJlYWRTdG9yYWdlKSB7Ci0JCQl2byA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3VGhyZWFkU3RvcmFnZURlc2NyaXB0b3Ioc2Vzc2lvbiwgdmFyRGVzYy5nZXRUYXNrcygpLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmdWxsTmFtZSwgcG9zLCBkZXB0aCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHZhckRlc2MuZ2V0VGFza3MoKSwgUERJUmVzb3VyY2VzLmdldFN0cmluZygicGRpLlZhcmlhYmxlTWFuYWdlci5Vbmtub3duX3ZhcmlhYmxlX29iamVjdCIpKTsJCQkKLQkJfQotCi0JCXZvLnNldENhc3RpbmdBcnJheVN0YXJ0KHZhckRlc2MuZ2V0Q2FzdGluZ0FycmF5U3RhcnQoKSArIHN0YXJ0KTsKLQkJdm8uc2V0Q2FzdGluZ0FycmF5RW5kKGxlbmd0aCk7Ci0JCXJldHVybiB2bzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlciNnZXRWYXJpYWJsZURlc2NyaXB0b3JBc1R5cGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZURlc2NyaXB0b3IgZ2V0VmFyaWFibGVEZXNjcmlwdG9yQXNUeXBlKElQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYywgU3RyaW5nIHR5cGUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHZhckRlc2MuZ2V0VGFza3MoKSwgIk5vdCBpbXBsZW1lbnRlZCBnZXRWYXJpYWJsZURlc2NyaXB0b3JBc1R5cGUoKSB5ZXQuIik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKEJpdExpc3QgdGFza3MpIHsKLQkJTGlzdDxJUERJVmFyaWFibGU+IHZhcmlhYmxlTGlzdCA9IChMaXN0PElQRElWYXJpYWJsZT4pdmFyaWFibGVzTWFwLmdldCh0YXNrcyk7Ci0JCWlmICh2YXJpYWJsZUxpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIChJUERJVmFyaWFibGVbXSkgdmFyaWFibGVMaXN0LnRvQXJyYXkobmV3IElQRElWYXJpYWJsZVt2YXJpYWJsZUxpc3Quc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJUERJVmFyaWFibGVbMF07Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB2YXJpZAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFyKEJpdExpc3QgdGFza3MsIFN0cmluZyB2YXJpZCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0RGVsZXRlVmFyaWFibGVSZXF1ZXN0KHRhc2tzLCB2YXJpZCkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gdmFySWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZSByZW1vdmVWYXJpYWJsZUZyb21MaXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyB2YXJJZCkgewotCQlMaXN0PElQRElWYXJpYWJsZT4gdmFyTGlzdCA9IGdldFZhcmlhYmxlc0xpc3QodGFza3MpOwotCQlzeW5jaHJvbml6ZWQgKHZhckxpc3QpIHsKLQkJCWZvciAoSXRlcmF0b3I8SVBESVZhcmlhYmxlPiBpdGVyYXRvciA9IHZhckxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlQRElWYXJpYWJsZSB2YXJpYWJsZSA9IChJUERJVmFyaWFibGUpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICh2YXJpYWJsZS5nZXRWYXJJZCgpLmVxdWFscyh2YXJJZCkpIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCXJldHVybiB2YXJpYWJsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5BYnN0cmFjdFBESU1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQl2YXJpYWJsZXNNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLkFic3RyYWN0UERJTWFuYWdlciN1cGRhdGUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXVwZGF0ZShxVGFza3MsIG5ldyBTdHJpbmdbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIHZhcnMKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShCaXRMaXN0IHFUYXNrcywgU3RyaW5nW10gdmFycykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVBESUV2ZW50PiBldmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PElQRElFdmVudD4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUERJVmFyaWFibGUgdmFyaWFibGUgPSBnZXRWYXJpYWJsZShxVGFza3MsIHZhcnNbaV0pOwotCQkJaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKLQkJCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3Q2hhbmdlZEV2ZW50KAotCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdWYXJpYWJsZUluZm8oc2Vzc2lvbiwgcVRhc2tzLCB2YXJpYWJsZS5nZXRWYXJJZCgpLCB2YXJpYWJsZSkpKTsKLQkJCX0KLQkJfQotCQlzZXNzaW9uLmdldEV2ZW50TWFuYWdlcigpLmZpcmVFdmVudHMoKElQRElFdmVudFtdKSBldmVudExpc3QudG9BcnJheShuZXcgSVBESUV2ZW50WzBdKSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBMaXN0PElQRElWYXJpYWJsZT4gZ2V0VmFyaWFibGVzTGlzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCUxpc3Q8SVBESVZhcmlhYmxlPiB2YXJpYWJsZXNMaXN0ID0gKExpc3Q8SVBESVZhcmlhYmxlPikgdmFyaWFibGVzTWFwLmdldCh0YXNrcyk7Ci0JCWlmICh2YXJpYWJsZXNMaXN0ID09IG51bGwpIHsKLQkJCXZhcmlhYmxlc0xpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8SVBESVZhcmlhYmxlPigpKTsKLQkJCXZhcmlhYmxlc01hcC5wdXQodGFza3MsIHZhcmlhYmxlc0xpc3QpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZXNMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvQWRkcmVzc0JyZWFrcG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvQWRkcmVzc0JyZWFrcG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyZGRjNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0FkZHJlc3NCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQWRkcmVzc0JyZWFrcG9pbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0JyZWFrcG9pbnQgZXh0ZW5kcyBMb2NhdGlvbkJyZWFrcG9pbnQgaW1wbGVtZW50cyBJUERJQWRkcmVzc0JyZWFrcG9pbnQgewotCXB1YmxpYyBBZGRyZXNzQnJlYWtwb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgSVBESUxvY2F0aW9uIGxvY2F0aW9uLCBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzLCB0eXBlLCBsb2NhdGlvbiwgY29uZGl0aW9uLCBlbmFibGVkKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvQXJndW1lbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvQXJndW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0ODc2ZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0FyZ3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFyZ3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQXJndW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEFyZ3VtZW50IGV4dGVuZHMgVmFyaWFibGUgaW1wbGVtZW50cyBJUERJQXJndW1lbnQgewotCXB1YmxpYyBBcmd1bWVudChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCwgU3RyaW5nIHZhcmlkKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmdWxsTmFtZSwgcG9zLCBkZXB0aCwgdmFyaWQpOwotCX0KLQkKLQlwdWJsaWMgQXJndW1lbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESUFyZ3VtZW50RGVzY3JpcHRvciBhcmdEZXNjLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgYXJnRGVzYywgdmFyaWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuVmFyaWFibGUjY3JlYXRlVmFyaWFibGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLlNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlRocmVhZCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgSVBESVZhcmlhYmxlIGNyZWF0ZVZhcmlhYmxlKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsTmFtZSwgaW50IHBvcywgaW50IGRlcHRoLCBTdHJpbmcgdmFyaWQpIHsKLQkJcmV0dXJuIG5ldyBBcmd1bWVudChzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgsIHZhcmlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0FyZ3VtZW50RGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9Bcmd1bWVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NmE3Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0FyZ3VtZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBcmd1bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEFyZ3VtZW50RGVzY3JpcHRvciBleHRlbmRzIExvY2FsVmFyaWFibGVEZXNjcmlwdG9yIGltcGxlbWVudHMgSVBESUFyZ3VtZW50RGVzY3JpcHRvciB7Ci0JcHVibGljIEFyZ3VtZW50RGVzY3JpcHRvcihJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuLCBTdHJpbmcgZm4sIGludCBwb3MsIGludCBkZXB0aCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbiwgZm4sIHBvcywgZGVwdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9CcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjI0YmUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9CcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJlYWtwb2ludCBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJQnJlYWtwb2ludCB7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGludGVybmFsX2NvdW50ZXIgPSAwOwotCi0JcHJpdmF0ZSBJUERJQ29uZGl0aW9uIGNvbmRpdGlvbjsKLQlwcml2YXRlIGludCBicGlkID0gLTE7IC8vYnkgZGVmYXVsdCBpZCBpcyAtMQotCXByaXZhdGUgaW50IHR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVsZXRlZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IGludGVybmFsX2lkOwotCi0JcHJpdmF0ZSBCaXRMaXN0IHBlbmRpbmdUYXNrczsgLy8gdGFza3MgcmVtYWluaW5nIHRvIHNldCBicmVha3BvaW50Ci0KLQlwdWJsaWMgQnJlYWtwb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgdHlwZSwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOwotCQl0aGlzLmVuYWJsZSA9IGVuYWJsZWQ7Ci0JCXRoaXMuaW50ZXJuYWxfaWQgPSBpbnRlcm5hbF9jb3VudGVyKys7Ci0gCQl0aGlzLnBlbmRpbmdUYXNrcyA9IHRhc2tzLmNvcHkoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50I2dldEJyZWFrcG9pbnRJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRCcmVha3BvaW50SUQoKSB7Ci0JCXJldHVybiBicGlkOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQjZ2V0Q29uZGl0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVBESUNvbmRpdGlvbiBnZXRDb25kaXRpb24oKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKGNvbmRpdGlvbiA9PSBudWxsKSB7Ci0JCQljb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKDAsIG5ldyBTdHJpbmcoKSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGNvbmRpdGlvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50I2dldEludGVybmFsSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJuYWxJRCgpIHsKLQkJcmV0dXJuIGludGVybmFsX2lkOwotCX0KLQkKLQlwdWJsaWMgQml0TGlzdCBnZXRQZW5kaW5nVGFza3MoKSB7Ci0JCXJldHVybiBwZW5kaW5nVGFza3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCNpc0RlbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJcmV0dXJuIGRlbGV0ZWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsgCi0JCXJldHVybiBlbmFibGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCNpc0hhcmR3YXJlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlKCkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVBESUJyZWFrcG9pbnQuSEFSRFdBUkUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQjaXNUZW1wb3JhcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVtcG9yYXJ5KCkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVBESUJyZWFrcG9pbnQuVEVNUE9SQVJZKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50I3NldEJyZWFrcG9pbnRJRChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJlYWtwb2ludElEKGludCBicGlkKSB7Ci0JCXRoaXMuYnBpZCA9IGJwaWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludCNzZXRDb25kaXRpb24ob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uKElQRElDb25kaXRpb24gY29uZGl0aW9uKSB7Ci0JCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQjc2V0RGVsZXRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZCgpIHsKLQkJdGhpcy5kZWxldGVkID0gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50I3NldEVuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZSA9IGVuYWJsZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9Db25kaXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvQ29uZGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmYzYmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9Db25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmRpdGlvbiBpbXBsZW1lbnRzIElQRElDb25kaXRpb24gewotCXByaXZhdGUgaW50IGlnbm9yZUNvdW50OwotCXByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0aWRzOwotCi0JcHVibGljIENvbmRpdGlvbihpbnQgaWdub3JlLCBTdHJpbmcgZXhwLCBTdHJpbmdbXSBpZHMpIHsKLQkJaWdub3JlQ291bnQgPSBpZ25vcmU7Ci0JCWV4cHJlc3Npb24gPSAoZXhwID09IG51bGwpID8gbmV3IFN0cmluZygpIDogZXhwOwotCQl0aWRzID0gKGlkcyA9PSBudWxsKSA/IG5ldyBTdHJpbmdbMF0gOiBpZHM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uI2VxdWFscyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVBESUNvbmRpdGlvbiBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmRpdGlvbikgewotCQkJQ29uZGl0aW9uIGNvbmQgPSAoQ29uZGl0aW9uKW9iajsKLQkJCWlmIChjb25kLmdldElnbm9yZUNvdW50KCkgIT0gdGhpcy5nZXRJZ25vcmVDb3VudCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb25kLmdldEV4cHJlc3Npb24oKS5jb21wYXJlVG8odGhpcy5nZXRFeHByZXNzaW9uKCkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGNvbmQuZ2V0VGhyZWFkSWRzKCkubGVuZ3RoICE9IHRoaXMuZ2V0VGhyZWFkSWRzKCkubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZC5nZXRUaHJlYWRJZHMoKS5sZW5ndGg7ICsraSkgewotCQkJCWlmIChjb25kLmdldFRocmVhZElkcygpW2ldLmNvbXBhcmVUbyh0aGlzLmdldFRocmVhZElkcygpW2ldKSAhPSAwKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uI2dldEV4cHJlc3Npb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uI2dldElnbm9yZUNvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElnbm9yZUNvdW50KCkgewotCQlyZXR1cm4gaWdub3JlQ291bnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uI2dldFRocmVhZElkcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFRocmVhZElkcygpIHsKLQkJcmV0dXJuIHRpZHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9FeGNlcHRpb25wb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9FeGNlcHRpb25wb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU3MWNlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvRXhjZXB0aW9ucG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4Y2VwdGlvbnBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnBvaW50IGV4dGVuZHMgQnJlYWtwb2ludCBpbXBsZW1lbnRzIElQRElFeGNlcHRpb25wb2ludCB7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xheno7Ci0JcHJpdmF0ZSBib29sZWFuIHN0b3BPblRocm93OwotCXByaXZhdGUgYm9vbGVhbiBzdG9wT25DYXRjaDsKLQlwcml2YXRlIElQRElGdW5jdGlvbkJyZWFrcG9pbnRbXSBmdW5jQnB0cyA9IHt9OwotCQotCXB1YmxpYyBFeGNlcHRpb25wb2ludChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgY2xhenosIGJvb2xlYW4gc3RvcE9uVGhyb3csIGJvb2xlYW4gc3RvcE9uQ2F0Y2gsIElQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQsIElQRElGdW5jdGlvbkJyZWFrcG9pbnRbXSBmdW5jQnB0cykgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgSVBESUJyZWFrcG9pbnQuUkVHVUxBUiwgY29uZGl0aW9uLCBlbmFibGVkKTsKLQkJdGhpcy5jbGF6eiA9IGNsYXp6OwotCQl0aGlzLnN0b3BPblRocm93ID0gc3RvcE9uVGhyb3c7Ci0JCXRoaXMuc3RvcE9uQ2F0Y2ggPSBzdG9wT25DYXRjaDsKLQkJdGhpcy5mdW5jQnB0cyA9IGZ1bmNCcHRzOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25OYW1lKCkgewotCQlyZXR1cm4gY2xheno7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRXhjZXB0aW9ucG9pbnQjaXNTdG9wT25UaHJvdygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdG9wT25UaHJvdygpIHsKLQkJcmV0dXJuIHN0b3BPblRocm93OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4Y2VwdGlvbnBvaW50I2lzU3RvcE9uQ2F0Y2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RvcE9uQ2F0Y2goKSB7Ci0JCXJldHVybiBzdG9wT25DYXRjaDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJRnVuY3Rpb25CcmVha3BvaW50W10gZ2V0RnVuY3Rpb25CcmVha3BvaW50cygpIHsKLQkJcmV0dXJuIGZ1bmNCcHRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvRXhwcmVzc2lvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWZkNTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9FeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIFNlc3Npb25PYmplY3QgaW1wbGVtZW50cyBJUERJVGFyZ2V0RXhwcmVzc2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IElEX0NPVU5UID0gMDsKLQlwcml2YXRlIGludCBpZDsKLQlwcml2YXRlIFN0cmluZyBmRXhwcmVzc2lvbjsKLQlwcml2YXRlIElQRElWYXJpYWJsZSB2YXJpYWJsZSA9IG51bGw7CQotCi0JcHVibGljIEV4cHJlc3Npb24oSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4KSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzKTsKLQkJZkV4cHJlc3Npb24gPSBleDsKLQkJaWQgPSArK0lEX0NPVU5UOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4cHJlc3Npb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlzZXNzaW9uLmdldEV4cHJlc3Npb25NYW5hZ2VyKCkuZGVzdHJveUV4cHJlc3Npb25zKGdldFRhc2tzKCksIG5ldyBFeHByZXNzaW9uW10geyB0aGlzIH0pOwotCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgewotCQkJc2Vzc2lvbi5nZXRFeHByZXNzaW9uTWFuYWdlcigpLmRlbGV0ZVZhcmlhYmxlKChWYXJpYWJsZSl2YXJpYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElFeHByZXNzaW9uI2VxdWFscyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKElQRElFeHByZXNzaW9uIG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRXhwcmVzc2lvbikgewotCQkJRXhwcmVzc2lvbiBvdGhlciA9IChFeHByZXNzaW9uKSBvYmo7Ci0JCQlyZXR1cm4gb3RoZXIuaWQgPT0gaWQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4cHJlc3Npb24jZ2V0QUlGKCkKLQkgKi8KLQlwdWJsaWMgSUFJRiBnZXRBSUYoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKHZhcmlhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHZhcmlhYmxlLmdldEFJRigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvblRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0JCXJldHVybiBmRXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXRFeHByZXNzaW9uI2dldFZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSkKLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlIGdldFZhcmlhYmxlKElQRElTdGFja0ZyYW1lIGNvbnRleHQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVmFyaWFibGUgdmFyID0gc2Vzc2lvbi5nZXRFeHByZXNzaW9uTWFuYWdlcigpLmNyZWF0ZVZhcmlhYmxlKChTdGFja0ZyYW1lKWNvbnRleHQsIGdldEV4cHJlc3Npb25UZXh0KCkpOwotCQlpZiAodmFyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKGNvbnRleHQuZ2V0VGFza3MoKSwgIk5vIHZhcmlhYmxlIGZvdW5kIik7Ci0JCQotCQl2YXJpYWJsZSA9IHZhcjsKLQkJcmV0dXJuIHZhcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElFeHByZXNzaW9uI3NldEFJRihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUYpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUlGKElBSUYgYWlmKSB7Ci0JCWlmICh2YXJpYWJsZSAhPSBudWxsKSB7Ci0JCQl2YXJpYWJsZS5zZXRBSUYoYWlmKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvRnVuY3Rpb25CcmVha3BvaW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0Z1bmN0aW9uQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmE3MmY4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvRnVuY3Rpb25CcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uQnJlYWtwb2ludCBleHRlbmRzIExvY2F0aW9uQnJlYWtwb2ludCBpbXBsZW1lbnRzIElQRElGdW5jdGlvbkJyZWFrcG9pbnQgewotCXB1YmxpYyBGdW5jdGlvbkJyZWFrcG9pbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IHR5cGUsIElQRElMb2NhdGlvbiBsb2NhdGlvbiwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24sIGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdHlwZSwgbG9jYXRpb24sIGNvbmRpdGlvbiwgZW5hYmxlZCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0dsb2JhbFZhcmlhYmxlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0dsb2JhbFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjQwN2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9HbG9iYWxWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElHbG9iYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iYWxWYXJpYWJsZSBleHRlbmRzIFZhcmlhYmxlIGltcGxlbWVudHMgSVBESUdsb2JhbFZhcmlhYmxlIHsKLQlwdWJsaWMgR2xvYmFsVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdmFyRGVzYywgdmFyaWQpOwotCX0KLQkKLQlwdWJsaWMgR2xvYmFsVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESVRocmVhZCB0aHJlYWQsIElQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLCBpbnQgZGVwdGgsIFN0cmluZyB2YXJpZCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgsIHZhcmlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlZhcmlhYmxlI2NyZWF0ZVZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5TZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5UaHJlYWQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIElQRElWYXJpYWJsZSBjcmVhdGVWYXJpYWJsZShJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCwgU3RyaW5nIHZhcmlkKSB7Ci0JCXJldHVybiBuZXcgR2xvYmFsVmFyaWFibGUoc2Vzc2lvbiwgdGFza3MsIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoLCB2YXJpZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9HbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTI0OTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9HbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IgZXh0ZW5kcyBWYXJpYWJsZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIHsKLQlwdWJsaWMgR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG4sIFN0cmluZyBmbiwgaW50IHBvcywgaW50IGRlcHRoKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzLCB0aHJlYWQsIGZyYW1lLCBuLCBmbiwgcG9zLCBkZXB0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9MaW5lQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9MaW5lQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjJiZTE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvTGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMaW5lQnJlYWtwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lQnJlYWtwb2ludCBleHRlbmRzIExvY2F0aW9uQnJlYWtwb2ludCBpbXBsZW1lbnRzIElQRElMaW5lQnJlYWtwb2ludCB7Ci0JcHVibGljIExpbmVCcmVha3BvaW50KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCB0eXBlLCBJUERJTG9jYXRpb24gbG9jYXRpb24sIElQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGxvY2F0aW9uLCBjb25kaXRpb24sIGVuYWJsZWQpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9Mb2NhbFZhcmlhYmxlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0xvY2FsVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkZTQ2Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0xvY2FsVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGUgZXh0ZW5kcyBWYXJpYWJsZSBpbXBsZW1lbnRzIElQRElMb2NhbFZhcmlhYmxlIHsKLQlwdWJsaWMgTG9jYWxWYXJpYWJsZShJUERJU2Vzc2lvbiBzZXNzaW9uLCBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgdmFyRGVzYywgU3RyaW5nIHZhcmlkKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHZhckRlc2MsIHZhcmlkKTsKLQl9Ci0JCi0JcHVibGljIExvY2FsVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESVRocmVhZCB0aHJlYWQsIElQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLCBpbnQgZGVwdGgsIFN0cmluZyB2YXJpZCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgsIHZhcmlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlZhcmlhYmxlI2NyZWF0ZVZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5TZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5UaHJlYWQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIElQRElWYXJpYWJsZSBjcmVhdGVWYXJpYWJsZShJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCwgU3RyaW5nIHZhcmlkKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZShzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbmFtZSwgZnVsbE5hbWUsIHBvcywgZGVwdGgsIHZhcmlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0xvY2FsVmFyaWFibGVEZXNjcmlwdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0xvY2FsVmFyaWFibGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGU1YjMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9Mb2NhbFZhcmlhYmxlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgZXh0ZW5kcyBWYXJpYWJsZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IgewotCXB1YmxpYyBMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcihJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuLCBTdHJpbmcgZm4sIGludCBwb3MsIGludCBkZXB0aCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbiwgZm4sIHBvcywgZGVwdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvTG9jYXRpb25CcmVha3BvaW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL0xvY2F0aW9uQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGZhMTUzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvTG9jYXRpb25CcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElBZGRyZXNzTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElGdW5jdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTGluZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJTG9jYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYXRpb25CcmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExvY2F0aW9uQnJlYWtwb2ludCBleHRlbmRzIEJyZWFrcG9pbnQgaW1wbGVtZW50cyBJUERJTG9jYXRpb25CcmVha3BvaW50IHsKLQlwcml2YXRlIElQRElMb2NhdGlvbiBsb2NhdGlvbjsKLQkKLQlwdWJsaWMgTG9jYXRpb25CcmVha3BvaW50KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCB0eXBlLCBJUERJTG9jYXRpb24gbG9jYXRpb24sIElQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGNvbmRpdGlvbiwgZW5hYmxlZCk7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEFkZHJlc3MoKSB7Ci0JCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIElQRElBZGRyZXNzTG9jYXRpb24pIHsKLQkJCXJldHVybiAoKElQRElBZGRyZXNzTG9jYXRpb24pbG9jYXRpb24pLmdldEFkZHJlc3MoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKLQkJaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgSVBESUxpbmVMb2NhdGlvbikgewotCQkJcmV0dXJuICgoSVBESUxpbmVMb2NhdGlvbilsb2NhdGlvbikuZ2V0RmlsZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgSVBESUZ1bmN0aW9uTG9jYXRpb24pIHsKLQkJCXJldHVybiAoKElQRElGdW5jdGlvbkxvY2F0aW9uKWxvY2F0aW9uKS5nZXRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uKCkgewotCQlpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBJUERJRnVuY3Rpb25Mb2NhdGlvbikgewotCQkJcmV0dXJuICgoSVBESUZ1bmN0aW9uTG9jYXRpb24pbG9jYXRpb24pLmdldEZ1bmN0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIElQRElMaW5lTG9jYXRpb24pIHsKLQkJCXJldHVybiAoKElQRElMaW5lTG9jYXRpb24pbG9jYXRpb24pLmdldExpbmVOdW1iZXIoKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMb2NhdGlvbkJyZWFrcG9pbnQjZ2V0TG9jYXRvcigpCi0JICovCi0JcHVibGljIElQRElMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0JCXJldHVybiBQRElMb2NhdGlvbkZhY3RvcnkubmV3TG9jYXRvcihnZXRGaWxlKCksIGdldEZ1bmN0aW9uKCksIGdldExpbmVOdW1iZXIoKSwgZ2V0QWRkcmVzcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL01lbW9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9NZW1vcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlODFhZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL01lbW9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnk7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW1vcnkgaW1wbGVtZW50cyBJUERJTWVtb3J5IHsKLQlwcml2YXRlIFN0cmluZyBhZGRyOwotCXByaXZhdGUgbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1swXTsKLQlwcml2YXRlIExpc3Q8SW50ZWdlcj4gYmFkT2Zmc2V0cyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQlwcml2YXRlIFN0cmluZyBhc2NpaSA9ICIiOwotCi0JcHVibGljIE1lbW9yeShTdHJpbmcgYWRkciwgU3RyaW5nIGFzY2lpLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJdGhpcy5hZGRyID0gYWRkcjsKLQkJdGhpcy5hc2NpaSA9IGFzY2lpOwotCQlwYXJzZSh2YWx1ZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnkjZ2V0QWRkcmVzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gYWRkcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5I2dldEFzY2lpKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzY2lpKCkgewotCQlyZXR1cm4gYXNjaWk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeSNnZXRCYWRPZmZzZXRzKCkKLQkgKi8KLQlwdWJsaWMgaW50W10gZ2V0QmFkT2Zmc2V0cygpIHsKLQkJaW50W10gZGF0YSA9IG5ldyBpbnRbYmFkT2Zmc2V0cy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHsKLQkJCUludGVnZXIgbyA9IChJbnRlZ2VyKSBiYWRPZmZzZXRzLmdldChpKTsKLQkJCWRhdGFbaV0gPSBvLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeSNnZXREYXRhKCkKLQkgKi8KLQlwdWJsaWMgbG9uZ1tdIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnkjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoImFkZHI9XCIiICsgYWRkciArICJcIiIpOwotCQlidWZmZXIuYXBwZW5kKCJkYXRhPVsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnIicpLmFwcGVuZChMb25nLnRvSGV4U3RyaW5nKGRhdGFbaV0pKS5hcHBlbmQoJyInKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCddJyk7Ci0JCWlmIChhc2NpaS5sZW5ndGgoKSA+IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIixhc2NpaT1cIiIgKyBhc2NpaSArICJcIiIpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKFN0cmluZ1tdIHZhbHVlcykgewotCQlkYXRhID0gbmV3IGxvbmdbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWRhdGFbaV0gPSBMb25nLmRlY29kZSh2YWx1ZXNbaV0udHJpbSgpKS5sb25nVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYmFkT2Zmc2V0cy5hZGQobmV3IEludGVnZXIoaSkpOwotCQkJCWRhdGFbaV0gPSAwOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9NZW1vcnlCbG9jay5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9NZW1vcnlCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTkwMmJlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvTWVtb3J5QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuRXh0Rm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5TZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRGF0YVJlYWRNZW1vcnlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElFeHByZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWVtb3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJUmVnaXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElWYXJpYWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnlCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRGF0YVdyaXRlTWVtb3J5UmVxdWVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lbW9yeUJsb2NrIGV4dGVuZHMgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElNZW1vcnlCbG9jayB7Ci0JcHJpdmF0ZSBJUERJRGF0YVJlYWRNZW1vcnlJbmZvIG1lbTsKLQlwcml2YXRlIGludCBmV29yZFNpemU7Ci0JcHJpdmF0ZSBCaWdJbnRlZ2VyIHBTdGFydEFkZHJlc3M7IC8vY2FjaGVkIHN0YXJ0IGFkZHJlc3MKLQotCXByaXZhdGUgYnl0ZVtdIGNCeXRlczsgLy9jYWNoZWQgYnl0ZXMKLQlwcml2YXRlIGludFtdIGJhZE9mZnNldHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0xpdHRsZUVuZGlhbjsKLQlTdHJpbmcgZXhwcmVzc2lvbjsKLQlib29sZWFuIGZyb3plbjsKLQotCXB1YmxpYyBNZW1vcnlCbG9jayhJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXhwLCBpbnQgd29yZFNpemUsIGJvb2xlYW4gaXNMaXR0bGUsIElQRElEYXRhUmVhZE1lbW9yeUluZm8gaW5mbykgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCWV4cHJlc3Npb24gPSBleHA7Ci0JCWZXb3JkU2l6ZSA9IHdvcmRTaXplOwotCQlmcm96ZW4gPSB0cnVlOwotCQlmSXNMaXR0bGVFbmRpYW4gPSBpc0xpdHRsZTsKLQkJc2V0RGF0YVJlYWRNZW1vcnlJbmZvKGluZm8pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrI2dldEJ5dGVzKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjQnl0ZXM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2sjZ2V0RGF0YVJlYWRNZW1vcnlJbmZvKCkKLQkgKi8KLQlwdWJsaWMgSVBESURhdGFSZWFkTWVtb3J5SW5mbyBnZXREYXRhUmVhZE1lbW9yeUluZm8oKSB7Ci0JCXJldHVybiBtZW07Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2sjZ2V0RXhwcmVzc2lvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnlCbG9jayNnZXRGbGFncyhpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBieXRlIGdldEZsYWdzKGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGdldExlbmd0aCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChiYWRPZmZzZXRzID09IG51bGwpIHsKLQkJCWJhZE9mZnNldHMgPSBnZXRCYWRPZmZzZXRzKG1lbSk7Ci0JCX0KLQkJaWYgKGJhZE9mZnNldHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYWRPZmZzZXRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKGJhZE9mZnNldHNbaV0gPT0gb2Zmc2V0KSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gVkFMSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2sjZ2V0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMZW5ndGgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0Qnl0ZXMoKS5sZW5ndGg7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUuCi0JCX0KLQkJcmV0dXJuIG1lbS5nZXRUb3RhbEJ5dGVzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2sjZ2V0U3RhcnRBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFydEFkZHJlc3MoKSB7Ci0JCXJldHVybiBwU3RhcnRBZGRyZXNzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrI2dldFdvcmRTaXplKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdvcmRTaXplKCkgewotCQlyZXR1cm4gZldvcmRTaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrI2lzRnJvemVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Zyb3plbigpIHsKLQkJcmV0dXJuIGZyb3plbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnlCbG9jayNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElNZW1vcnlNYW5hZ2VyIG1nciA9IHNlc3Npb24uZ2V0TWVtb3J5TWFuYWdlcigpOwotCQlCaWdJbnRlZ2VyW10gYWRkcmVzc2VzID0gbWdyLnVwZGF0ZSh0aGlzLCBudWxsKTsKLQkJLy8gQ2hlY2sgaWYgdGhpcyBhZmZlY3RzIG90aGVyIGJsb2Nrcy4KLQkJaWYgKGFkZHJlc3Nlcy5sZW5ndGggPiAwKSB7Ci0JCQlJUERJTWVtb3J5QmxvY2tbXSBibG9ja3MgPSBtZ3IuZ2V0TWVtb3J5QmxvY2tzKGdldFRhc2tzKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHsKLQkJCQlNZW1vcnlCbG9jayBibG9jayA9IChNZW1vcnlCbG9jaylibG9ja3NbaV07Ci0JCQkJaWYgKCEgYmxvY2suZXF1YWxzKHRoaXMpICYmIGJsb2NrLmNvbnRhaW5zKGFkZHJlc3NlcykpIHsKLQkJCQkJbWdyLnVwZGF0ZShibG9jaywgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2sjc2V0RGF0YVJlYWRNZW1vcnlJbmZvKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRGF0YVJlYWRNZW1vcnlJbmZvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFSZWFkTWVtb3J5SW5mbyhJUERJRGF0YVJlYWRNZW1vcnlJbmZvIG0pIHsKLQkJcFN0YXJ0QWRkcmVzcyA9IEV4dEZvcm1hdC5nZXRCaWdJbnRlZ2VyKG0uZ2V0QWRkcmVzcygpKTsKLQkJY0J5dGVzID0gZ2V0Qnl0ZXMobSk7Ci0JCW1lbSA9IG07Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTWVtb3J5QmxvY2sjc2V0RnJvemVuKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnJvemVuKGJvb2xlYW4gZnJvemVuKSB7Ci0JCXRoaXMuZnJvemVuID0gZnJvemVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrI3NldFZhbHVlKGxvbmcsIGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShsb25nIG9mZnNldCwgYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKG9mZnNldCA+PSBnZXRMZW5ndGgoKSB8fCBvZmZzZXQgKyBieXRlcy5sZW5ndGggPiBnZXRMZW5ndGgoKSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihnZXRUYXNrcygpLCAiTm8gYmFkIG9mZnNldCBmb3VuZCIpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWxvbmcgbCA9IG5ldyBCeXRlKGJ5dGVzW2ldKS5sb25nVmFsdWUoKSAmIDB4ZmY7Ci0JCQlTdHJpbmcgdmFsdWUgPSAiMHgiICsgTG9uZy50b0hleFN0cmluZyhsKTsKLQkJCUlQRElEYXRhV3JpdGVNZW1vcnlSZXF1ZXN0IHJlcXVlc3QgPSBzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0RGF0YVdyaXRlTWVtb3J5UmVxdWVzdChnZXRUYXNrcygpLCBvZmZzZXQgKyBpLCBleHByZXNzaW9uLCBFeHRGb3JtYXQuSEVYQURFQ0lNQUwsIDEsIHZhbHVlKTsKLQkJCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCXJlcXVlc3Qud2FpdFVudGlsQ29tcGxldGVkKGdldFRhc2tzKCkpOwotCQl9Ci0JCXJlZnJlc2goKTsKLQotCQlJUERJUmVnaXN0ZXJNYW5hZ2VyIHJlZ01nciA9IHNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCk7Ci0JCWlmIChyZWdNZ3IuaXNBdXRvVXBkYXRlKCkpIHsKLQkJCXJlZ01nci51cGRhdGUoZ2V0VGFza3MoKSk7Ci0JCX0KLQkJCi0JCUlQRElFeHByZXNzaW9uTWFuYWdlciBleHBNZ3IgPSBzZXNzaW9uLmdldEV4cHJlc3Npb25NYW5hZ2VyKCk7Ci0JCWlmIChleHBNZ3IuaXNBdXRvVXBkYXRlKCkpIHsKLQkJCWV4cE1nci51cGRhdGUoZ2V0VGFza3MoKSk7Ci0JCX0KLQkJCi0JCUlQRElWYXJpYWJsZU1hbmFnZXIgdmFyTWdyID0gc2Vzc2lvbi5nZXRWYXJpYWJsZU1hbmFnZXIoKTsKLQkJaWYgKHZhck1nci5pc0F1dG9VcGRhdGUoKSkgewotCQkJdmFyTWdyLnVwZGF0ZShnZXRUYXNrcygpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYWRkcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoQmlnSW50ZWdlciBhZGRyKSB7Ci0JCUJpZ0ludGVnZXIgc3RhcnQgPSBnZXRTdGFydEFkZHJlc3MoKTsKLQkJbG9uZyBsZW5ndGggPSBnZXRMZW5ndGgoKTsKLQkJaWYgKCBzdGFydC5jb21wYXJlVG8oYWRkcikgPD0gMCAmJiBhZGRyLmNvbXBhcmVUbyhzdGFydC5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKGxlbmd0aCkpKSA8PSAwICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYWRkcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoQmlnSW50ZWdlcltdIGFkZHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGFpbnMoYWRkc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50W10gZ2V0QmFkT2Zmc2V0cyhJUERJRGF0YVJlYWRNZW1vcnlJbmZvIG0pIHsKLQkJaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbMF07Ci0JCWlmIChtID09IG51bGwpIHsKLQkJCXJldHVybiBvZmZzZXRzOwotCQl9Ci0KLQkJSVBESU1lbW9yeVtdIG1pTWVtID0gbS5nZXRNZW1vcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pTWVtLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnRbXSBkYXRhID0gbWlNZW1baV0uZ2V0QmFkT2Zmc2V0cygpOwotCQkJaWYgKGRhdGEubGVuZ3RoID4gMCkgewotCQkJCWludCBvbGVuID0gb2Zmc2V0cy5sZW5ndGg7Ci0JCQkJaW50W10gbmV3T2Zmc2V0cyA9IG5ldyBpbnRbb2xlbiArIGRhdGEubGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9mZnNldHMsIDAsIG5ld09mZnNldHMsIDAsIG9sZW4pOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3T2Zmc2V0cywgb2xlbiwgZGF0YS5sZW5ndGgpOwotCQkJCW9mZnNldHMgPSBuZXdPZmZzZXRzOwotCQkJfQotCQl9Ci0JCXJldHVybiBvZmZzZXRzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJ5dGVbXSBnZXRCeXRlcyhJUERJRGF0YVJlYWRNZW1vcnlJbmZvIG0pIHsKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMF07Ci0JCWlmIChtID09IG51bGwpIHsKLQkJCXJldHVybiBieXRlczsKLQkJfQotCi0JCUlQRElNZW1vcnlbXSBtaU1lbSA9IG0uZ2V0TWVtb3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaU1lbS5sZW5ndGg7ICsraSkgewotCQkJbG9uZ1tdIGRhdGEgPSBtaU1lbVtpXS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7ICsraikgewotCQkJCQlieXRlW10gYnMgPSBsb25nVG9CeXRlcyhkYXRhW2pdKTsKLQkJCQkJLy8gZ3JvdyB0aGUgYXJyYXkKLQkJCQkJaW50IGJsZW4gPSBieXRlcy5sZW5ndGg7Ci0JCQkJCWJ5dGVbXSBuZXdCeXRlcyA9IG5ldyBieXRlW2JsZW4gKyBicy5sZW5ndGhdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBuZXdCeXRlcywgMCwgYmxlbik7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYnMsIDAsIG5ld0J5dGVzLCBibGVuLCBicy5sZW5ndGgpOwotCQkJCQlieXRlcyA9IG5ld0J5dGVzOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYnl0ZXM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYnl0ZVtdIGxvbmdUb0J5dGVzKGxvbmcgdikgewkJCi0JCS8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZAotCQlpbnQgY291bnQgPSAxOwotCQlsb25nIHZhbHVlID0gdjsKLQkJZm9yIChjb3VudCA9IDE7ICh2YWx1ZSAvPSAweDEwMCkgPiAwOyArK2NvdW50KQotCQkJOwotCi0JCS8vIFJlc2V0IHRoZSB3b3JkU2l6ZSBpZiBpbmNvcnJlY3QuCi0JCWlmIChmV29yZFNpemUgIT0gY291bnQpIHsKLQkJCWZXb3JkU2l6ZSA9IGNvdW50OwotCQl9Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbY291bnRdOwotCQlpZiAoZklzTGl0dGxlRW5kaWFuKSB7Ci0JCQlmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IC0taSkgewotCQkJCWludCBzaGlmdCA9IGkgKiBjb3VudDsKLQkJCQlieXRlc1tpXSA9IChieXRlKSgodiA+Pj4gc2hpZnQpICYgMHhGRik7Ci0JCQl9Ci0vLwkJCWJ5dGVzWzddID0gKGJ5dGUpKCh2ID4+PiA1NikgJiAweEZGKTsKLS8vCQkJYnl0ZXNbNl0gPSAoYnl0ZSkoKHYgPj4+IDQ4KSAmIDB4RkYpOwotLy8JCQlieXRlc1s1XSA9IChieXRlKSgodiA+Pj4gNDApICYgMHhGRik7Ci0vLwkJCWJ5dGVzWzRdID0gKGJ5dGUpKCh2ID4+PiAzMikgJiAweEZGKTsKLS8vCQkJYnl0ZXNbM10gPSAoYnl0ZSkoKHYgPj4+IDI0KSAmIDB4RkYpOwotLy8JCQlieXRlc1syXSA9IChieXRlKSgodiA+Pj4gMTYpICYgMHhGRik7Ci0vLwkJCWJ5dGVzWzFdID0gKGJ5dGUpKCh2ID4+PiAgOCkgJiAweEZGKTsKLS8vCQkJYnl0ZXNbMF0gPSAoYnl0ZSkoKHYgPj4+ICAwKSAmIDB4RkYpOwkJCQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQkJaW50IHNoaWZ0ID0gKGNvdW50IC0gaSAtIDEpICogY291bnQ7Ci0JCQkJYnl0ZXNbaV0gPSAoYnl0ZSkoKHYgPj4+IHNoaWZ0KSAmIDB4RkYpOwotCQkJfQotLy8JCQlieXRlc1swXSA9IChieXRlKSgodiA+Pj4gNTYpICYgMHhGRik7Ci0vLwkJCWJ5dGVzWzFdID0gKGJ5dGUpKCh2ID4+PiA0OCkgJiAweEZGKTsKLS8vCQkJYnl0ZXNbMl0gPSAoYnl0ZSkoKHYgPj4+IDQwKSAmIDB4RkYpOwotLy8JCQlieXRlc1szXSA9IChieXRlKSgodiA+Pj4gMzIpICYgMHhGRik7Ci0vLwkJCWJ5dGVzWzRdID0gKGJ5dGUpKCh2ID4+PiAyNCkgJiAweEZGKTsKLS8vCQkJYnl0ZXNbNV0gPSAoYnl0ZSkoKHYgPj4+IDE2KSAmIDB4RkYpOwotLy8JCQlieXRlc1s2XSA9IChieXRlKSgodiA+Pj4gIDgpICYgMHhGRik7Ci0vLwkJCWJ5dGVzWzddID0gKGJ5dGUpKCh2ID4+PiAgMCkgJiAweEZGKTsJCQkKLQkJfQotCQlyZXR1cm4gYnl0ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9NdWx0aUV4cHJlc3Npb25zLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL011bHRpRXhwcmVzc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2MzNiOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL011bHRpRXhwcmVzc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5TZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU11bHRpRXhwcmVzc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi0vKioKLSAqIEBhdXRob3IgZ3JlZwotICoKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRXhwcmVzc2lvbnMgZXh0ZW5kcyBTZXNzaW9uT2JqZWN0IGltcGxlbWVudHMgSVBESU11bHRpRXhwcmVzc2lvbnMgewotCWNsYXNzIE1FeHByZXNzaW9uIGltcGxlbWVudHMgSVBESUV4cHJlc3Npb24gewotCQlwcml2YXRlIGludCBpZDsKLQkJcHJpdmF0ZSBJQUlGIGFpZjsKLQkJcHVibGljIE1FeHByZXNzaW9uKGludCBpZCkgewotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJCWFpZiA9IG51bGw7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKElQRElFeHByZXNzaW9uIGV4cHIpIHsKLQkJCWlmIChleHByIGluc3RhbmNlb2YgTUV4cHJlc3Npb24pIHsKLQkJCQlyZXR1cm4gKChNRXhwcmVzc2lvbilleHByKS5nZXRJZCgpID09IGlkOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBJQUlGIGdldEFJRigpIHRocm93cyBQRElFeGNlcHRpb24gewotCQkJcmV0dXJuIGFpZjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25UZXh0KCkgewotCQkJcmV0dXJuIGV4cHI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRJZCgpIHsKLQkJCXJldHVybiBpZDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBSUYoSUFJRiBhaWYpIHsKLQkJCXRoaXMuYWlmID0gYWlmOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGV4cHI7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0JcHJpdmF0ZSBNYXA8SW50ZWdlcixJUERJRXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLElQRElFeHByZXNzaW9uPigpOwotCQotCXB1YmxpYyBNdWx0aUV4cHJlc3Npb25zKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBleCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzKTsKLQkJdGhpcy5leHByID0gZXg7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCWluaXRpdGFsKCk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU11bHRpRXhwcmVzc2lvbnMjYWRkRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhwcmVzc2lvbihJUERJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTUV4cHJlc3Npb24pIHsKLQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcigoKE1FeHByZXNzaW9uKWV4cHJlc3Npb24pLmdldElkKCkpOwotCQkJZXhwcmVzc2lvbnMucHV0KGlkLCBleHByZXNzaW9uKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU11bHRpRXhwcmVzc2lvbnMjY2xlYW5FeHByZXNzaW9uc1ZhbHVlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5FeHByZXNzaW9uc1ZhbHVlKEJpdExpc3QgdGFza3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQltb25pdG9yLnNldFRhc2tOYW1lKCJDbGVhbmluZyBleHByZXNzaW9uIFsiK2V4cHIrIl0uLi4iKTsKLQkJZm9yIChpbnQgdGFzayA6IHRhc2tzLnRvQXJyYXkoKSkgewotCQkJSVBESUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb24odGFzayk7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJZXhwcmVzc2lvbi5zZXRBSUYobnVsbCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU11bHRpRXhwcmVzc2lvbnMjZ2V0QUlGKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgSUFJRiBnZXRBSUYoSVBESUV4cHJlc3Npb24gZXhwcmVzc2lvbikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleHByZXNzaW9uLmdldEFJRigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU11bHRpRXhwcmVzc2lvbnMjZ2V0RXhwcmVzc2lvbihpbnQpCi0JICovCi0JcHVibGljIElQRElFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oaW50IHRhc2spIHsKLQkJcmV0dXJuIGV4cHJlc3Npb25zLmdldChuZXcgSW50ZWdlcih0YXNrKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTXVsdGlFeHByZXNzaW9ucyNnZXRFeHByZXNzaW9ucygpCi0JICovCi0JcHVibGljIElQRElFeHByZXNzaW9uW10gZ2V0RXhwcmVzc2lvbnMoKSB7Ci0JCXJldHVybiBleHByZXNzaW9ucy52YWx1ZXMoKS50b0FycmF5KG5ldyBJUERJRXhwcmVzc2lvblswXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTXVsdGlFeHByZXNzaW9ucyNnZXRFeHByZXNzaW9uVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uVGV4dCgpIHsKLQkJcmV0dXJuIGV4cHI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTXVsdGlFeHByZXNzaW9ucyNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTXVsdGlFeHByZXNzaW9ucyNyZW1vdmVFeHByZXNzaW9uKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHByZXNzaW9uKEJpdExpc3QgdGFza3MpIHsKLQkJZm9yIChpbnQgdGFzayA6IHRhc2tzLnRvQXJyYXkoKSkgewotCQkJZXhwcmVzc2lvbnMucmVtb3ZlKG5ldyBJbnRlZ2VyKHRhc2spKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVFeHByZXNzaW9uKElQRElFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNRXhwcmVzc2lvbikgewotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKCgoTUV4cHJlc3Npb24pZXhwcmVzc2lvbikuZ2V0SWQoKSk7Ci0JCQlleHByZXNzaW9ucy5yZW1vdmUoaWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNdWx0aUV4cHJlc3Npb25zI3NodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJZXhwcmVzc2lvbnMuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNdWx0aUV4cHJlc3Npb25zI3VwZGF0ZUV4cHJlc3Npb25zVmFsdWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFeHByZXNzaW9uc1ZhbHVlKEJpdExpc3QgdGFza3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3Iuc2V0VGFza05hbWUoIlVwZGF0aW5nIGV4cHJlc3Npb24gWyIrZXhwcisiXS4uLiIpOwotCQlJUERJRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXREYXRhRXZhbHVhdGVFeHByZXNpb25SZXF1ZXN0KHRhc2tzLCBleHByKTsKLQkJc2Vzc2lvbi5nZXRFdmVudFJlcXVlc3RNYW5hZ2VyKCkuYWRkRXZlbnRSZXF1ZXN0KHJlcXVlc3QpOwotCQlNYXA8Qml0TGlzdCwgT2JqZWN0PiByZXN1bHRzID0gcmVxdWVzdC5nZXRSZXN1bHRNYXAodGFza3MpOwotCQlmb3IgKEl0ZXJhdG9yPEJpdExpc3Q+IGkgPSByZXN1bHRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJQml0TGlzdCBzVGFza3MgPSBpLm5leHQoKTsKLQkJCU9iamVjdCBvYmogPSByZXN1bHRzLmdldChzVGFza3MpOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUFJRikpIHsKLQkJCQkvL3NldCB1bmtub3duIGFpZiBmb3IgdGFza3MKLQkJCQlmb3IgKGludCB0YXNrIDogc1Rhc2tzLnRvQXJyYXkoKSkgewotCQkJCQlJUERJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0RXhwcmVzc2lvbih0YXNrKTsKLQkJCQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlleHByZXNzaW9uLnNldEFJRihBSUZGYWN0b3J5LlVOS05PV05BSUYoKSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJCS8vdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIlVwZGF0aW5nIGV4cHJlc3Npb24gdmFsdWUgZXJyb3IiKTsKLQkJCX0KLQkJCQkKLQkJCUlBSUYgYWlmID0gKElBSUYpb2JqOwotCQkJZm9yIChpbnQgdGFzayA6IHNUYXNrcy50b0FycmF5KCkpIHsKLQkJCQlJUERJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0RXhwcmVzc2lvbih0YXNrKTsKLQkJCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJZXhwcmVzc2lvbi5zZXRBSUYoQUlGRmFjdG9yeS5VTktOT1dOQUlGKCkpOwotCQkJCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiVXBkYXRpbmcgaXMgY2FuY2VsbGVkIGJ5IHVzZXIiKTsKLQkJCQl9Ci0JCQkJZXhwcmVzc2lvbi5zZXRBSUYoYWlmKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpdGFsKCkgewotCQlmb3IgKGludCB0YXNrIDogZ2V0VGFza3MoKS50b0FycmF5KCkpIHsKLQkJCWFkZEV4cHJlc3Npb24obmV3IE1FeHByZXNzaW9uKHRhc2spKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9SZWdpc3Rlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9SZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjc0N2M1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvUmVnaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVnaXN0ZXIgZXh0ZW5kcyBWYXJpYWJsZSBpbXBsZW1lbnRzIElQRElSZWdpc3RlciB7Ci0JcHVibGljIFJlZ2lzdGVyKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG4sIFN0cmluZyBxLCBpbnQgcG9zLCBpbnQgZGVwdGgsIFN0cmluZyB2YXJpZCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbiwgcSwgcG9zLCBkZXB0aCwgdmFyaWQpOwotCX0KLQotCXB1YmxpYyBSZWdpc3RlcihJUERJU2Vzc2lvbiBzZXNzaW9uLCBSZWdpc3RlckRlc2NyaXB0b3Igb2JqLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgb2JqLCB2YXJpZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlZhcmlhYmxlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJc2Vzc2lvbi5nZXRSZWdpc3Rlck1hbmFnZXIoKS5kZXN0cm95UmVnaXN0ZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlciNnZXRBSUYob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lKQotCSAqLwotCXB1YmxpYyBJQUlGIGdldEFJRihJUERJU3RhY2tGcmFtZSBjb250ZXh0KSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJSVBESVZhcmlhYmxlIHZhciA9IHNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkuY3JlYXRlU2hhZG93UmVnaXN0ZXIodGhpcywgKFN0YWNrRnJhbWUpY29udGV4dCwgZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJcmV0dXJuIHZhci5nZXRBSUYoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuVmFyaWFibGVEZXNjcmlwdG9yI2dldEZ1bGxOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlpZiAoZkZ1bGxOYW1lID09IG51bGwpIHsKLQkJCVN0cmluZyBuID0gZ2V0TmFtZSgpOwotCQkJaWYgKCFuLnN0YXJ0c1dpdGgoIiQiKSkgewotCQkJCWZGdWxsTmFtZSA9ICIkIiArIG47Ci0JCQl9IGVsc2UgewotCQkJCWZGdWxsTmFtZSA9IG47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZGdWxsTmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsLlZhcmlhYmxlI2NyZWF0ZVZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5TZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5UaHJlYWQsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIElQRElWYXJpYWJsZSBjcmVhdGVWYXJpYWJsZShJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbE5hbWUsIGludCBwb3MsIGludCBkZXB0aCwgU3RyaW5nIHZhcmlkKSB7Ci0JCXJldHVybiBuZXcgUmVnaXN0ZXIoc2Vzc2lvbiwgdGFza3MsIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoLCB2YXJpZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9SZWdpc3RlckRlc2NyaXB0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvUmVnaXN0ZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzAxNDQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9SZWdpc3RlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpc3RlckRlc2NyaXB0b3IgZXh0ZW5kcyBWYXJpYWJsZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIHsKLQlwdWJsaWMgUmVnaXN0ZXJEZXNjcmlwdG9yKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmbiwgaW50IHBvcywgaW50IGRlcHRoKSB7Ci0JCXN1cGVyKHNlc3Npb24sIHRhc2tzLCB0aHJlYWQsIGZyYW1lLCBuYW1lLCBmbiwgcG9zLCBkZXB0aCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0JCWlmIChmRnVsbE5hbWUgPT0gbnVsbCkgewotCQkJU3RyaW5nIG4gPSBnZXROYW1lKCk7Ci0JCQlpZiAoIW4uc3RhcnRzV2l0aCgiJCIpKSB7Ci0JCQkJZkZ1bGxOYW1lID0gIiQiICsgbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkZ1bGxOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvU2lnbmFsLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1NpZ25hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjM5N2RkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvU2lnbmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbERlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsIGV4dGVuZHMgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElTaWduYWwgewotCXByaXZhdGUgSVBESVNpZ25hbERlc2NyaXB0b3IgZGVzYzsKLQotCXB1YmxpYyBTaWduYWwoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESVNpZ25hbERlc2NyaXB0b3IgZGVzYykgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzYy5nZXREZXNjcmlwdGlvbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBkZXNjLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWwjaGFuZGxlKGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlKGJvb2xlYW4gaXNJZ25vcmUsIGJvb2xlYW4gaXNTdG9wKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJc2Vzc2lvbi5nZXRTaWduYWxNYW5hZ2VyKCkuaGFuZGxlKHRoaXMsIGlzSWdub3JlLCBpc1N0b3ApOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbCNpc0lnbm9yZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmUoKSB7Ci0JCXJldHVybiAhaXNQYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Bhc3MoKSB7Ci0JCXJldHVybiBkZXNjLmdldFBhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbnQoKSB7Ci0JCXJldHVybiBkZXNjLmdldFByaW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0b3AoKSB7Ci0JCXJldHVybiBkZXNjLmdldFN0b3AoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWwjaXNTdG9wU2V0KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0b3BTZXQoKSB7Ci0JCXJldHVybiBpc1N0b3AoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWwjc2V0SGFuZGxlKGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlKGJvb2xlYW4gaXNJZ25vcmUsIGJvb2xlYW4gaXNTdG9wKSB7Ci0JCWRlc2Muc2V0UGFzcyghaXNJZ25vcmUpOwotCQlkZXNjLnNldFN0b3AoaXNTdG9wKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWwjc2V0RGVzY3JpcHRvcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbERlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvcihJUERJU2lnbmFsRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsI3NpZ25hbCgpCi0JICovCi0JcHVibGljIHZvaWQgc2lnbmFsKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXNlc3Npb24ucmVzdW1lKGdldFRhc2tzKCksIHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZGVzYy50b1N0cmluZygpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1NpZ25hbERlc2NyaXB0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvU2lnbmFsRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU4MzcwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvU2lnbmFsRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTaWduYWxEZXNjcmlwdG9yIGltcGxlbWVudHMgSVBESVNpZ25hbERlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIHN0b3A7Ci0JcHJpdmF0ZSBib29sZWFuIHByaW50OwotCXByaXZhdGUgYm9vbGVhbiBwYXNzOwotCXByaXZhdGUgU3RyaW5nIGRlc2M7Ci0KLQlwdWJsaWMgU2lnbmFsRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBzdG9wLCBib29sZWFuIHByaW50LCBib29sZWFuIHBhc3MsIFN0cmluZyBkZXNjKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuc3RvcCA9IHN0b3A7Ci0JCXRoaXMucHJpbnQgPSBwcmludDsKLQkJdGhpcy5wYXNzID0gcGFzczsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWxEZXNjcmlwdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzYzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWxEZXNjcmlwdG9yI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsRGVzY3JpcHRvciNnZXRQYXNzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQYXNzKCkgewotCQlyZXR1cm4gcGFzczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWxEZXNjcmlwdG9yI2dldFByaW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQcmludCgpIHsKLQkJcmV0dXJuIHByaW50OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbERlc2NyaXB0b3IjZ2V0U3RvcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsRGVzY3JpcHRvciNzZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKSB7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWxEZXNjcmlwdG9yI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWxEZXNjcmlwdG9yI3NldFBhc3MoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXNzKGJvb2xlYW4gcGFzcykgewotCQl0aGlzLnBhc3MgPSBwYXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsRGVzY3JpcHRvciNzZXRQcmludChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW50KGJvb2xlYW4gcHJpbnQpIHsKLQkJdGhpcy5wcmludCA9IHByaW50OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsRGVzY3JpcHRvciNzZXRTdG9wKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChib29sZWFuIHN0b3ApIHsKLQkJdGhpcy5zdG9wID0gc3RvcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk5hbWU6ICIgKyBuYW1lICsgIiwgc3RvcDogIiArIHN0b3AgKyAiLCBwcmludDogIiArIHByaW50ICsgIiwgcGFzczogIiArIHBhc3MgKyAiLCBkZXNjOiAiICsgZGVzYzsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9TdGFja0ZyYW1lLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1N0YWNrRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlNGU5Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1N0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUxvY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFyZ3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQXJndW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja0ZyYW1lIGV4dGVuZHMgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElTdGFja0ZyYW1lIHsKLQlwdWJsaWMgY2xhc3MgQXJnIHsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyB2YWx1ZTsKLQkJcHVibGljIEFyZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUERJVGhyZWFkIHB0aHJlYWQ7Ci0JcHJpdmF0ZSBJUERJQXJndW1lbnREZXNjcmlwdG9yW10gYXJnRGVzY3M7Ci0JcHJpdmF0ZSBJUERJTG9jYWxWYXJpYWJsZURlc2NyaXB0b3JbXSBsb2NhbERlc2NzOwotCXByaXZhdGUgSVBESUxvY2F0b3IgZkxvY2F0b3I7Ci0KLQkvL0ZyYW1lIGRldGFpbHMKLQlwcml2YXRlIGludCBsZXZlbCA9IC0xOwotCXByaXZhdGUgQXJnW10gYXJncyA9IG5ldyBBcmdbMF07Ci0JCi0JcHVibGljIFN0YWNrRnJhbWUoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESVRocmVhZCB0aHJlYWQsIGludCBsZXZlbCwgSVBESUxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzZXNzaW9uLCB0aHJlYWQuZ2V0VGFza3MoKSk7Ci0JCXRoaXMucHRocmVhZCA9IHRocmVhZDsKLQkJdGhpcy5sZXZlbCA9IGxldmVsOwotCQl0aGlzLmZMb2NhdG9yID0gbG9jYXRvcjsKLQkJaWYgKGFyZ3MgIT0gbnVsbCkgCi0JCQl0aGlzLmFyZ3MgPSBhcmdzOwotCX0KLQkKLQlwdWJsaWMgU3RhY2tGcmFtZShJUERJU2Vzc2lvbiBzZXNzaW9uLCBJUERJVGhyZWFkIHRocmVhZCwgaW50IGxldmVsLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGZ1bmMsIGludCBsaW5lLCBCaWdJbnRlZ2VyIGFkZHIpIHsKLQkJdGhpcyhzZXNzaW9uLCB0aHJlYWQsIGxldmVsLCBQRElMb2NhdGlvbkZhY3RvcnkubmV3TG9jYXRvcihmaWxlLCBmdW5jLCBsaW5lLCBhZGRyKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSNjcmVhdGVBcmd1bWVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFyZ3VtZW50RGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgSVBESUFyZ3VtZW50IGNyZWF0ZUFyZ3VtZW50KElQRElBcmd1bWVudERlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICh2YXJEZXNjIGluc3RhbmNlb2YgQXJndW1lbnREZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gc2Vzc2lvbi5nZXRWYXJpYWJsZU1hbmFnZXIoKS5jcmVhdGVBcmd1bWVudCgoQXJndW1lbnREZXNjcmlwdG9yKXZhckRlc2MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUjY3JlYXRlTG9jYWxWYXJpYWJsZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBJUERJTG9jYWxWYXJpYWJsZSBjcmVhdGVMb2NhbFZhcmlhYmxlKElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKHZhckRlc2MgaW5zdGFuY2VvZiBBcmd1bWVudERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBjcmVhdGVBcmd1bWVudCgoSVBESUFyZ3VtZW50RGVzY3JpcHRvcil2YXJEZXNjKTsKLQkJfSBlbHNlIGlmICh2YXJEZXNjIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBzZXNzaW9uLmdldFZhcmlhYmxlTWFuYWdlcigpLmNyZWF0ZUxvY2FsVmFyaWFibGUoKExvY2FsVmFyaWFibGVEZXNjcmlwdG9yKXZhckRlc2MpOwkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUjZXF1YWxzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVBESVN0YWNrRnJhbWUgc3RhY2tmcmFtZSkgewotCQlpZiAoc3RhY2tmcmFtZSBpbnN0YW5jZW9mIFN0YWNrRnJhbWUpIHsKLQkJCVN0YWNrRnJhbWUgc3RhY2sgPSAoU3RhY2tGcmFtZSlzdGFja2ZyYW1lOwotCQkJYm9vbGVhbiBlcXVhbCA9ICBwdGhyZWFkICE9IG51bGwgJiYgcHRocmVhZC5lcXVhbHMoc3RhY2suZ2V0VGhyZWFkKCkpICYmIGdldExldmVsKCkgPT0gc3RhY2suZ2V0TGV2ZWwoKTsKLQkJCWlmIChlcXVhbCkgewotCQkJCUlQRElMb2NhdG9yIG90aGVyTG9jYXRvciA9IHN0YWNrLmdldExvY2F0b3IoKTsKLQkJCQlJUERJTG9jYXRvciBteUxvY2F0b3IgPSBnZXRMb2NhdG9yKCk7Ci0JCQkJaWYgKG15TG9jYXRvci5lcXVhbEZpbGUob3RoZXJMb2NhdG9yLmdldEZpbGUoKSkpIHsKLQkJCQkJaWYgKG15TG9jYXRvci5lcXVhbEZ1bmN0aW9uKG90aGVyTG9jYXRvci5nZXRGdW5jdGlvbigpKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhzdGFja2ZyYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lI2dldEFyZ3VtZW50RGVzY3JpcHRvcnMoKQotCSAqLwotCXB1YmxpYyBJUERJQXJndW1lbnREZXNjcmlwdG9yW10gZ2V0QXJndW1lbnREZXNjcmlwdG9ycygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoYXJnRGVzY3MgPT0gbnVsbCkgewotCQkJYXJnRGVzY3MgPSBzZXNzaW9uLmdldFZhcmlhYmxlTWFuYWdlcigpLmdldEFyZ3VtZW50RGVzY3JpcHRvcnModGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGFyZ0Rlc2NzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUjZ2V0TGV2ZWwoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lI2dldExvY2FsVmFyaWFibGVEZXNjcmlwdG9ycygpCi0JICovCi0JcHVibGljIElQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcltdIGdldExvY2FsVmFyaWFibGVEZXNjcmlwdG9ycygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAobG9jYWxEZXNjcyA9PSBudWxsKSB7Ci0JCQlsb2NhbERlc2NzID0gc2Vzc2lvbi5nZXRWYXJpYWJsZU1hbmFnZXIoKS5nZXRMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcnModGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRGVzY3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZSNnZXRMb2NhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVBESUxvY2F0b3IgZ2V0TG9jYXRvcigpIHsKLQkJaWYgKGZMb2NhdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBmTG9jYXRvcjsKLQkJfQotCQlyZXR1cm4gUERJTG9jYXRpb25GYWN0b3J5Lm5ld0xvY2F0b3IoIiIsICIiLCAwLCBCaWdJbnRlZ2VyLlpFUk8pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUjZ2V0VGFyZ2V0KCkKLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5nZXRUYXJnZXQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lI2dldFRocmVhZCgpCi0JICovCi0JcHVibGljIElQRElUaHJlYWQgZ2V0VGhyZWFkKCkgewotCQlyZXR1cm4gcHRocmVhZDsKLQl9Ci0JCi0JLyoqCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWdldFRocmVhZCgpLnNldEN1cnJlbnRTdGFja0ZyYW1lKHRoaXMsIGZhbHNlKTsKLQkJc2Vzc2lvbi5zdGVwUmV0dXJuKGdldFRhc2tzKCksIDApOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYWlmCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKElBSUYgYWlmKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZ2V0VGhyZWFkKCkuc2V0Q3VycmVudFN0YWNrRnJhbWUodGhpcywgZmFsc2UpOwotCQlzZXNzaW9uLnN0ZXBSZXR1cm4oZ2V0VGFza3MoKSwgYWlmKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvU3RhY2tGcmFtZURlc2NyaXB0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvU3RhY2tGcmFtZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkMDFjMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1N0YWNrRnJhbWVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgU3RhY2tGcmFtZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJUERJU3RhY2tGcmFtZURlc2NyaXB0b3IgewotCXByaXZhdGUgaW50CQkJbGV2ZWw7Ci0JcHJpdmF0ZSBJUERJTG9jYXRvcglsb2M7Ci0JCi0JcHVibGljIFN0YWNrRnJhbWVEZXNjcmlwdG9yKGludCBsZXZlbCwgSVBESUxvY2F0b3IgbG9jKSB7Ci0JCXRoaXMubGV2ZWwgPSBsZXZlbDsKLQkJdGhpcy5sb2MgPSBsb2M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZURlc2NyaXB0b3IjZ2V0TGV2ZWwoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxldmVsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yI2dldExvY2F0b3IoKQotCSAqLwotCXB1YmxpYyBJUERJTG9jYXRvciBnZXRMb2NhdG9yKCkgewotCQlyZXR1cm4gbG9jOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TGV2ZWwoKSArICIgIiArIGxvYy50b1N0cmluZygpOwkgCi0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9UYXJnZXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGJhZmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9UYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJTG9jYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5TZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVJlZ2lzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJR2xvYmFsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1peGVkSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSdW50aW1lT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNoYXJlZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU2V0VGhyZWFkU2VsZWN0UmVxdWVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0IGV4dGVuZHMgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElUYXJnZXQgewotCXByaXZhdGUgVGhyZWFkW10gbm9UaHJlYWRzID0gbmV3IFRocmVhZFswXTsKLQlwcml2YXRlIFRocmVhZFtdIGN1cnJlbnRUaHJlYWRzOwotCXByaXZhdGUgaW50IGN1cnJlbnRUaHJlYWRJZDsKLQlwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0KLQlwdWJsaWMgVGFyZ2V0KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQljdXJyZW50VGhyZWFkcyA9IG5vVGhyZWFkczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldCNjcmVhdGVHbG9iYWxWYXJpYWJsZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlIGNyZWF0ZUdsb2JhbFZhcmlhYmxlKAotCQkJSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKHZhckRlc2MgaW5zdGFuY2VvZiBJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKSB7Ci0JCQlJUERJVmFyaWFibGVNYW5hZ2VyIHZhck1nciA9IGdldFNlc3Npb24oKS5nZXRWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCXJldHVybiB2YXJNZ3IuY3JlYXRlR2xvYmFsVmFyaWFibGUoKElQRElHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IpIHZhckRlc2MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I2NyZWF0ZVJlZ2lzdGVyKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXJEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBJUERJUmVnaXN0ZXIgY3JlYXRlUmVnaXN0ZXIoSVBESVJlZ2lzdGVyRGVzY3JpcHRvciB2YXJEZXNjKQotCQkJdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICh2YXJEZXNjIGluc3RhbmNlb2YgUmVnaXN0ZXJEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gc2Vzc2lvbi5nZXRSZWdpc3Rlck1hbmFnZXIoKS5jcmVhdGVSZWdpc3RlcigoUmVnaXN0ZXJEZXNjcmlwdG9yKSB2YXJEZXNjKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldCNldmFsdWF0ZUV4cHJlc3Npb25Ub1N0cmluZyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBldmFsdWF0ZUV4cHJlc3Npb25Ub1N0cmluZyhJUERJU3RhY2tGcmFtZSBjb250ZXh0LCBTdHJpbmcgZXhwcikKLQkJCXRocm93cyBQRElFeGNlcHRpb24gewotCQlUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldCkgY29udGV4dC5nZXRUYXJnZXQoKTsKLQkJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSAoVGhyZWFkKSB0YXJnZXQuZ2V0Q3VycmVudFRocmVhZCgpOwotCQlJUERJU3RhY2tGcmFtZSBjdXJyZW50RnJhbWUgPSBjdXJyZW50VGhyZWFkLmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCXRhcmdldC5zZXRDdXJyZW50VGhyZWFkKChJUERJVGhyZWFkKSBjb250ZXh0LmdldFRocmVhZCgpLCBmYWxzZSk7Ci0JCSgoVGhyZWFkKSBjb250ZXh0LmdldFRocmVhZCgpKS5zZXRDdXJyZW50U3RhY2tGcmFtZSgKLQkJCQkoU3RhY2tGcmFtZSkgY29udGV4dCwgZmFsc2UpOwotCQl0cnkgewotCQkJSUFJRiBhaWYgPSBudWxsOwotCQkJSVBESVZhcmlhYmxlIHZhciA9IHNlc3Npb24uZ2V0VmFyaWFibGVNYW5hZ2VyKCkuZ2V0VmFyaWFibGVCeU5hbWUodGFza3MsIGV4cHIpOwotCQkJaWYgKHZhciA9PSBudWxsKSB7Ci0JCQkJYWlmID0gc2Vzc2lvbi5nZXRFeHByZXNzaW9uTWFuYWdlcigpLmdldEV4cHJlc3Npb25WYWx1ZShnZXRUYXNrcygpLCBleHByKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWlmID0gdmFyLmdldEFJRigpOwotCQkJfQotCQkJaWYgKGFpZiAhPSBudWxsKQotCQkJCXJldHVybiBhaWYuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihnZXRUYXNrcygpLCAiVW5rbm9udyB2YXJpYmFsZTogIiArIGV4cHIpOwotCQl9IGZpbmFsbHkgewotCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoY3VycmVudFRocmVhZCwgZmFsc2UpOwotCQkJY3VycmVudFRocmVhZC5zZXRDdXJyZW50U3RhY2tGcmFtZShjdXJyZW50RnJhbWUsIGZhbHNlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I2dldEN1cnJlbnRUaHJlYWQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgVGhyZWFkIGdldEN1cnJlbnRUaHJlYWQoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJVGhyZWFkW10gdGhyZWFkcyA9IGdldFRocmVhZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUaHJlYWQgcHRocmVhZCA9IChUaHJlYWQpIHRocmVhZHNbaV07Ci0JCQlpZiAocHRocmVhZC5nZXRJZCgpID09IGN1cnJlbnRUaHJlYWRJZCkgewotCQkJCXJldHVybiBwdGhyZWFkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I2dldEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcnMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBnZXRHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3JzKAotCQkJU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZnVuY3Rpb24sIFN0cmluZyBuYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlc3Npb24uZ2V0VmFyaWFibGVNYW5hZ2VyKCkuZ2V0R2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKAotCQkJCWdldFRhc2tzKCksIGZpbGVuYW1lLCBmdW5jdGlvbiwgbmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTb3VyY2VNYW5hZ2VtZW50I2dldEluc3RydWN0aW9ucyhqYXZhLm1hdGguQmlnSW50ZWdlciwgamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0JICovCi0JcHVibGljIElQRElJbnN0cnVjdGlvbltdIGdldEluc3RydWN0aW9ucyhCaWdJbnRlZ2VyIHN0YXJ0QWRkcmVzcywKLQkJCUJpZ0ludGVnZXIgZW5kQWRkcmVzcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFNvdXJjZU1hbmFnZXIoKS5nZXRJbnN0cnVjdGlvbnMoZ2V0VGFza3MoKSwKLQkJCQlzdGFydEFkZHJlc3MsIGVuZEFkZHJlc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU291cmNlTWFuYWdlbWVudCNnZXRJbnN0cnVjdGlvbnMoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJUERJSW5zdHJ1Y3Rpb25bXSBnZXRJbnN0cnVjdGlvbnMoU3RyaW5nIGZpbGVuYW1lLCBpbnQgbGluZW51bSkKLQkJCXRocm93cyBQRElFeGNlcHRpb24gewotCQlyZXR1cm4gc2Vzc2lvbi5nZXRTb3VyY2VNYW5hZ2VyKCkuZ2V0SW5zdHJ1Y3Rpb25zKGdldFRhc2tzKCksIGZpbGVuYW1lLAotCQkJCWxpbmVudW0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU291cmNlTWFuYWdlbWVudCNnZXRJbnN0cnVjdGlvbnMoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIElQRElJbnN0cnVjdGlvbltdIGdldEluc3RydWN0aW9ucyhTdHJpbmcgZmlsZW5hbWUsIGludCBsaW5lbnVtLAotCQkJaW50IGxpbmVzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlc3Npb24uZ2V0U291cmNlTWFuYWdlcigpLmdldEluc3RydWN0aW9ucyhnZXRUYXNrcygpLCBmaWxlbmFtZSwKLQkJCQlsaW5lbnVtLCBsaW5lcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTb3VyY2VNYW5hZ2VtZW50I2dldE1peGVkSW5zdHJ1Y3Rpb25zKGphdmEubWF0aC5CaWdJbnRlZ2VyLCBqYXZhLm1hdGguQmlnSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgSVBESU1peGVkSW5zdHJ1Y3Rpb25bXSBnZXRNaXhlZEluc3RydWN0aW9ucyhCaWdJbnRlZ2VyIHN0YXJ0QWRkcmVzcywKLQkJCUJpZ0ludGVnZXIgZW5kQWRkcmVzcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFNvdXJjZU1hbmFnZXIoKS5nZXRNaXhlZEluc3RydWN0aW9ucyhnZXRUYXNrcygpLAotCQkJCXN0YXJ0QWRkcmVzcywgZW5kQWRkcmVzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTb3VyY2VNYW5hZ2VtZW50I2dldE1peGVkSW5zdHJ1Y3Rpb25zKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESU1peGVkSW5zdHJ1Y3Rpb25bXSBnZXRNaXhlZEluc3RydWN0aW9ucyhTdHJpbmcgZmlsZW5hbWUsCi0JCQlpbnQgbGluZW51bSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFNvdXJjZU1hbmFnZXIoKS5nZXRNaXhlZEluc3RydWN0aW9ucyhnZXRUYXNrcygpLAotCQkJCWZpbGVuYW1lLCBsaW5lbnVtKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNvdXJjZU1hbmFnZW1lbnQjZ2V0TWl4ZWRJbnN0cnVjdGlvbnMoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIElQRElNaXhlZEluc3RydWN0aW9uW10gZ2V0TWl4ZWRJbnN0cnVjdGlvbnMoU3RyaW5nIGZpbGVuYW1lLAotCQkJaW50IGxpbmVudW0sIGludCBsaW5lcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFNvdXJjZU1hbmFnZXIoKS5nZXRNaXhlZEluc3RydWN0aW9ucyhnZXRUYXNrcygpLAotCQkJCWZpbGVuYW1lLCBsaW5lbnVtLCBsaW5lcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQjZ2V0UmVnaXN0ZXJHcm91cHMoKQotCSAqLwotCXB1YmxpYyBJUERJUmVnaXN0ZXJHcm91cFtdIGdldFJlZ2lzdGVyR3JvdXBzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFJlZ2lzdGVyTWFuYWdlcigpLmdldFJlZ2lzdGVyR3JvdXBzKGdldFRhc2tzKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I2dldFJ1bnRpbWVPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgSVBESVJ1bnRpbWVPcHRpb25zIGdldFJ1bnRpbWVPcHRpb25zKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2hhcmVkTGlicmFyeU1hbmFnZW1lbnQjZ2V0U2hhcmVkTGlicmFyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSVBESVNoYXJlZExpYnJhcnlbXSBnZXRTaGFyZWRMaWJyYXJpZXMoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihnZXRUYXNrcygpLAotCQkJCSJOb3QgaW1wbGVtZW50ZWQgeWV0IC0gVGFyZ2V0OiBnZXRTaGFyZWRMaWJyYXJpZXMoKSIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU291cmNlTWFuYWdlbWVudCNnZXRTb3VyY2VQYXRocygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFNvdXJjZVBhdGhzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFNvdXJjZU1hbmFnZXIoKS5nZXRTb3VyY2VQYXRocyhnZXRUYXNrcygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldCNnZXRUaHJlYWRzKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFRocmVhZFtdIGdldFRocmVhZHMoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKGN1cnJlbnRUaHJlYWRzLmxlbmd0aCA9PSAwKSB7Ci0JCQljdXJyZW50VGhyZWFkcyA9IGdldFBUaHJlYWRzKCk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRUaHJlYWRzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I2xvY2tUYXJnZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvY2tUYXJnZXQoKSB7Ci0JCWxvY2subG9jaygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I3JlbGVhc2VUYXJnZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VUYXJnZXQoKSB7Ci0JCWxvY2sudW5sb2NrKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQjc2V0Q3VycmVudFRocmVhZChvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuVGhyZWFkLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRUaHJlYWQoSVBESVRocmVhZCBwdGhyZWFkLCBib29sZWFuIGRvVXBkYXRlKQotCQkJdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmIChwdGhyZWFkIGluc3RhbmNlb2YgSVBESVRocmVhZCkgewotCQkJaW50IGlkID0gcHRocmVhZC5nZXRJZCgpOwotCQkJaWYgKGlkID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoY3VycmVudFRocmVhZElkICE9IGlkKSB7Ci0JCQkJSVBESVNldFRocmVhZFNlbGVjdFJlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0KAotCQkJCQkJc2Vzc2lvbiwgZ2V0VGFza3MoKSwgaWQpOwotCQkJCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCQljdXJyZW50VGhyZWFkSWQgPSByZXF1ZXN0LmdldFRocmVhZElkKGdldFRhc2tzKCkpOwotCQkJCUlQRElTdGFja0ZyYW1lRGVzY3JpcHRvciBmcmFtZSA9IHJlcXVlc3QuZ2V0U3RhY2tGcmFtZShnZXRUYXNrcygpKTsKLQkJCQlpZiAoZnJhbWUgIT0gbnVsbCkgewotCQkJCQlpbnQgZGVwdGggPSBwdGhyZWFkLmdldFN0YWNrRnJhbWVDb3VudCgpOwotCQkJCQlJUERJTG9jYXRvciBsb2NhdG9yID0gUERJTG9jYXRpb25GYWN0b3J5Lm5ld0xvY2F0b3IoZnJhbWUuZ2V0TG9jYXRvcigpCi0JCQkJCQkJLmdldEZpbGUoKSwgZnJhbWUuZ2V0TG9jYXRvcigpLmdldEZ1bmN0aW9uKCksIGZyYW1lCi0JCQkJCQkJLmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCksIGZyYW1lLmdldExvY2F0b3IoKQotCQkJCQkJCS5nZXRBZGRyZXNzKCkpOwotCQkJCQlwdGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3U3RhY2tGcmFtZShzZXNzaW9uLCBwdGhyZWFkLCBkZXB0aAotCQkJCQkJCS0gZnJhbWUuZ2V0TGV2ZWwoKSwgbG9jYXRvcikpOwotCQkJCX0KLQkKLQkJCQlpZiAoZG9VcGRhdGUpIHsKLQkJCQkJSVBESVJlZ2lzdGVyTWFuYWdlciByZWdNZ3IgPSBzZXNzaW9uLmdldFJlZ2lzdGVyTWFuYWdlcigpOwotCQkJCQlpZiAocmVnTWdyLmlzQXV0b1VwZGF0ZSgpKSB7Ci0JCQkJCQlyZWdNZ3IudXBkYXRlKGdldFRhc2tzKCkpOwotCQkJCQl9Ci0JCQkJCUlQRElWYXJpYWJsZU1hbmFnZXIgdmFyTWdyID0gc2Vzc2lvbi5nZXRWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCQkJaWYgKHZhck1nci5pc0F1dG9VcGRhdGUoKSkgewotCQkJCQkJdmFyTWdyLnVwZGF0ZShnZXRUYXNrcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjdXJyZW50VGhyZWFkSWQgIT0gaWQpIHsKLQkJCQlzZXNzaW9uLmdldEV2ZW50TWFuYWdlcigpLmZpcmVFdmVudHMoCi0JCQkJCQluZXcgSVBESUV2ZW50W10geyBzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0Rlc3Ryb3llZEV2ZW50KAotCQkJCQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1RocmVhZEluZm8oc2Vzc2lvbiwgZ2V0VGFza3MoKSwgaWQsIGdldFRocmVhZChpZCkpKSB9KTsKLQkJCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKGdldFRhc2tzKCksCi0JCQkJCQkiVGFyZ2V0IC0gQ2Fubm90IHN3aXRjaCB0byB0aHJlYWQgIiArIGlkKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24oZ2V0VGFza3MoKSwgIlRhcmdldCAtIFVua25vd25fdGhyZWFkIik7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNvdXJjZU1hbmFnZW1lbnQjc2V0U291cmNlUGF0aHMoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhdGhzKFN0cmluZ1tdIHNyY1BhdGhzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJc2Vzc2lvbi5nZXRTb3VyY2VNYW5hZ2VyKCkuc2V0U291cmNlUGF0aHMoZ2V0VGFza3MoKSwgc3JjUGF0aHMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0I3NldFN1cGVuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN1cGVuZGVkKGJvb2xlYW4gc3RhdGUpIHsKLQkJbm90aWZ5QWxsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQjdXBkYXRlU3RhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVTdGF0ZShpbnQgbmV3VGhyZWFkSWQpIHsKLQkJVGhyZWFkW10gb2xkVGhyZWFkcyA9IGN1cnJlbnRUaHJlYWRzOwotCi0JCWxvY2tUYXJnZXQoKTsKLQkJY3VycmVudFRocmVhZElkID0gbmV3VGhyZWFkSWQ7Ci0JCXRyeSB7Ci0JCQljdXJyZW50VGhyZWFkcyA9IGdldFBUaHJlYWRzKCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQljdXJyZW50VGhyZWFkcyA9IG5vVGhyZWFkczsKLQkJfQotCQlyZWxlYXNlVGFyZ2V0KCk7Ci0KLQkJTGlzdDxJbnRlZ2VyPiBwTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oY3VycmVudFRocmVhZHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50VGhyZWFkcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRUaHJlYWRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKGN1cnJlbnRUaHJlYWRzW2ldLmdldElkKCkgPT0gb2xkVGhyZWFkc1tqXS5nZXRJZCgpKSB7Ci0JCQkJCW9sZFRocmVhZHNbal0uY2xlYXJTdGF0ZSgpOwotCQkJCQljdXJyZW50VGhyZWFkc1tpXSA9IG9sZFRocmVhZHNbal07Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCXBMaXN0LmFkZChuZXcgSW50ZWdlcihjdXJyZW50VGhyZWFkc1tpXS5nZXRJZCgpKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFwTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUlQRElFdmVudFtdIGV2ZW50cyA9IG5ldyBJUERJRXZlbnRbcExpc3Quc2l6ZSgpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXZlbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaW50IGlkID0gKChJbnRlZ2VyKSBwTGlzdC5nZXQoaikpLmludFZhbHVlKCk7Ci0JCQkJZXZlbnRzW2pdID0gc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdDcmVhdGVkRXZlbnQoCi0JCQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1RocmVhZEluZm8oc2Vzc2lvbiwgZ2V0VGFza3MoKSwgaWQsIGdldFRocmVhZChpZCkpKTsKLQkJCX0KLQkJCXNlc3Npb24uZ2V0RXZlbnRNYW5hZ2VyKCkuZmlyZUV2ZW50cyhldmVudHMpOwotCQl9Ci0JCS8vIEZpcmUgZGVzdHJveWVkIGV2ZW50IGZvciBvbGQgdGhyZWFkcwotCQlMaXN0PEludGVnZXI+IGRMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPihvbGRUaHJlYWRzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkVGhyZWFkcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50VGhyZWFkcy5sZW5ndGg7IGorKykgewotCQkJCWlmIChjdXJyZW50VGhyZWFkc1tqXS5nZXRJZCgpID09IG9sZFRocmVhZHNbaV0uZ2V0SWQoKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlkTGlzdC5hZGQobmV3IEludGVnZXIob2xkVGhyZWFkc1tpXS5nZXRJZCgpKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUlQRElFdmVudFtdIGV2ZW50cyA9IG5ldyBJUERJRXZlbnRbZExpc3Quc2l6ZSgpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXZlbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaW50IGlkID0gKChJbnRlZ2VyKSBkTGlzdC5nZXQoaikpLmludFZhbHVlKCk7Ci0JCQkJZXZlbnRzW2pdID0gc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdEZXN0cm95ZWRFdmVudCgKLQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3VGhyZWFkSW5mbyhzZXNzaW9uLCBnZXRUYXNrcygpLCBpZCwgZ2V0VGhyZWFkKGlkKSkpOwotCQkJfQotCQkJc2Vzc2lvbi5nZXRFdmVudE1hbmFnZXIoKS5maXJlRXZlbnRzKGV2ZW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBQRElFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBUaHJlYWRbXSBnZXRQVGhyZWFkcygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlUaHJlYWRbXSBwdGhyZWFkcyA9IG5vVGhyZWFkczsKLQkJbG9ja1RhcmdldCgpOwotCQl0cnkgewotCQkJSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldEdldEluZm9UaHJlYWRzUmVxdWVzdCgKLQkJCQkJZ2V0VGFza3MoKSk7Ci0JCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQlTdHJpbmdbXSBpZHMgPSByZXF1ZXN0LmdldFRocmVhZElkcyhnZXRUYXNrcygpKTsKLQkJCWlmIChpZHMubGVuZ3RoID4gMCkgewotCQkJCXB0aHJlYWRzID0gbmV3IFRocmVhZFtpZHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgdGlkID0gMDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRpZCA9IEludGVnZXIucGFyc2VJbnQoaWRzW2ldKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJcHRocmVhZHNbaV0gPSBuZXcgVGhyZWFkKHNlc3Npb24sIHRoaXMsIHRpZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwdGhyZWFkcyA9IG5ldyBUaHJlYWRbXSB7IG5ldyBUaHJlYWQoc2Vzc2lvbiwgdGhpcywgMCkgfTsKLQkJCX0KLQkJCWN1cnJlbnRUaHJlYWRJZCA9IHB0aHJlYWRzWzBdLmdldElkKCk7Ci0JCQlpZiAoY3VycmVudFRocmVhZElkID09IDAgJiYgcHRocmVhZHMubGVuZ3RoID4gMSkgewotCQkJCWN1cnJlbnRUaHJlYWRJZCA9IHB0aHJlYWRzWzFdLmdldElkKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWxlYXNlVGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHB0aHJlYWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUaHJlYWQgZ2V0VGhyZWFkKGludCB0aWQpIHsKLQkJVGhyZWFkIHRoID0gbnVsbDsKLQkJaWYgKGN1cnJlbnRUaHJlYWRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudFRocmVhZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlUaHJlYWQgcHRocmVhZCA9IGN1cnJlbnRUaHJlYWRzW2ldOwotCQkJCWlmIChwdGhyZWFkLmdldElkKCkgPT0gdGlkKSB7Ci0JCQkJCXRoID0gcHRocmVhZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1RocmVhZC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9UaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NmY1YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1RocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5TZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElSZWdpc3Rlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESVZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJR2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkIGV4dGVuZHMgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElUaHJlYWQgewotCXByaXZhdGUgc3RhdGljIElQRElTdGFja0ZyYW1lW10gbm9TdGFjayA9IG5ldyBJUERJU3RhY2tGcmFtZVswXTsKLQlwcml2YXRlIGludCBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSVBESVN0YWNrRnJhbWUgY3VycmVudEZyYW1lID0gbnVsbDsKLQlwcml2YXRlIExpc3Q8SVBESVN0YWNrRnJhbWU+IGN1cnJlbnRGcmFtZXMgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YWNrZGVwdGggPSAwOwotCXByaXZhdGUgSVBESVRhcmdldCB0YXJnZXQgPSBudWxsOwotCi0JcHVibGljIFRocmVhZChJUERJU2Vzc2lvbiBzZXNzaW9uLCBJUERJVGFyZ2V0IHRhcmdldCwgaW50IHRocmVhZElkKSB7Ci0JCXRoaXMoc2Vzc2lvbiwgdGFyZ2V0LCB0aHJlYWRJZCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBUaHJlYWQoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESVRhcmdldCB0YXJnZXQsIGludCB0aHJlYWRJZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFyZ2V0LmdldFRhc2tzKCkpOwotCQl0aGlzLmlkID0gdGhyZWFkSWQ7Ci0JCXRoaXMubmFtZSA9IHRocmVhZE5hbWU7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclN0YXRlKCkgewotCQlzdGFja2RlcHRoID0gMDsKLQkJY3VycmVudEZyYW1lID0gbnVsbDsKLQkJY3VycmVudEZyYW1lcyA9IG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkI2NyZWF0ZVRocmVhZFN0b3JhZ2Uob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZFN0b3JhZ2UgY3JlYXRlVGhyZWFkU3RvcmFnZShJUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IgdmFyRGVzYykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmICh2YXJEZXNjIGluc3RhbmNlb2YgVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IpIHsKLQkJCUlQRElWYXJpYWJsZU1hbmFnZXIgdmFyTWdyID0gc2Vzc2lvbi5nZXRWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCXJldHVybiB2YXJNZ3IuY3JlYXRlVGhyZWFkU3RvcmFnZSgoVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IpdmFyRGVzYyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkI2VxdWFscyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVBESVRocmVhZCB0aHJlYWQpIHsKLQkJaWYgKHRocmVhZCBpbnN0YW5jZW9mIFRocmVhZCkgewotCQkJVGhyZWFkIHB0aHJlYWQgPSAoVGhyZWFkKSB0aHJlYWQ7Ci0JCQlyZXR1cm4gaWQgPT0gcHRocmVhZC5nZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHModGhyZWFkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQjZ2V0Q3VycmVudFN0YWNrRnJhbWUoKQotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZSBnZXRDdXJyZW50U3RhY2tGcmFtZSgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoY3VycmVudEZyYW1lID09IG51bGwpIHsKLQkJCUlQRElTdGFja0ZyYW1lW10gZnJhbWVzID0gZ2V0U3RhY2tGcmFtZXMoMCwgMCk7Ci0JCQlpZiAoZnJhbWVzLmxlbmd0aCA+IDApIHsKLQkJCQljdXJyZW50RnJhbWUgPSAoU3RhY2tGcmFtZSlmcmFtZXNbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRGcmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQjZ2V0U3RhY2tGcmFtZUNvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YWNrRnJhbWVDb3VudCgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoc3RhY2tkZXB0aCA9PSAwKSB7Ci0JCQlUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldClnZXRUYXJnZXQoKTsKLQkJCUlQRElUaHJlYWQgY3VycmVudFRocmVhZCA9IChJUERJVGhyZWFkKXRhcmdldC5nZXRDdXJyZW50VGhyZWFkKCk7Ci0JCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZCh0aGlzLCBmYWxzZSk7Ci0JCQkJSVBESUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldEdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdChnZXRUYXNrcygpKTsKLQkJCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkJc3RhY2tkZXB0aCA9IHJlcXVlc3QuZ2V0RGVwdGgoZ2V0VGFza3MoKSk7Ci0JCQl9IAotCQkJZmluYWxseSB7Ci0JCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoY3VycmVudFRocmVhZCwgZmFsc2UpOwotCQkJCXRhcmdldC5yZWxlYXNlVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YWNrZGVwdGg7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkI2dldFN0YWNrRnJhbWVzKCkKLQkgKi8KLQlwdWJsaWMgSVBESVN0YWNrRnJhbWVbXSBnZXRTdGFja0ZyYW1lcygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpbnQgZGVwdGggPSBnZXRTdGFja0ZyYW1lQ291bnQoKTsKLQotCQkvLyByZWZyZXNoIGlmIHdlIGhhdmUgbm90aGluZyBvciBpZiB3ZSBoYXZlIGp1c3QgYSBzdWJzZXQgZ2V0IGV2ZXJ5dGhpbmcuCi0JCWlmIChjdXJyZW50RnJhbWVzID09IG51bGwgfHwgY3VycmVudEZyYW1lcy5zaXplKCkgPCBkZXB0aCkgewotCQkJY3VycmVudEZyYW1lcyA9IG5ldyBBcnJheUxpc3Q8SVBESVN0YWNrRnJhbWU+KCk7Ci0JCQlUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldClnZXRUYXJnZXQoKTsKLQkJCUlQRElUaHJlYWQgY3VycmVudFRocmVhZCA9IChJUERJVGhyZWFkKXRhcmdldC5nZXRDdXJyZW50VGhyZWFkKCk7Ci0JCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZCh0aGlzLCBmYWxzZSk7Ci0JCQkJSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KHNlc3Npb24sIGdldFRhc2tzKCkpOwotCQkJCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCQlJUERJU3RhY2tGcmFtZURlc2NyaXB0b3JbXSBmcmFtZXMgPSByZXF1ZXN0LmdldFN0YWNrRnJhbWVzKGdldFRhc2tzKCkpOwotCQkJCWZvciAoSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yIGZyYW1lIDogZnJhbWVzKSB7Ci0JCQkJCUlQRElMb2NhdG9yIGxvY2F0b3IgPSBmcmFtZS5nZXRMb2NhdG9yKCk7Ci0JCQkJCWN1cnJlbnRGcmFtZXMuYWRkKHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3U3RhY2tGcmFtZShzZXNzaW9uLCB0aGlzLCBkZXB0aCAtIGZyYW1lLmdldExldmVsKCksIAotCQkJCQkJCWxvY2F0b3IuZ2V0RmlsZSgpLCBsb2NhdG9yLmdldEZ1bmN0aW9uKCksIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBsb2NhdG9yLmdldEFkZHJlc3MoKSkpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoY3VycmVudFRocmVhZCwgZmFsc2UpOwotCQkJCXRhcmdldC5yZWxlYXNlVGFyZ2V0KCk7Ci0JCQl9Ci0JCQkvLyBhc3NpZ24gdGhlIGN1cnJlbnRGcmFtZSBpZiBpdCB3YXMgbm90IGRvbmUgeWV0LgotCQkJaWYgKGN1cnJlbnRGcmFtZSA9PSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50RnJhbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQRElTdGFja0ZyYW1lIHN0YWNrID0gKElQRElTdGFja0ZyYW1lKSBjdXJyZW50RnJhbWVzLmdldChpKTsKLQkJCQkJaWYgKHN0YWNrLmdldExldmVsKCkgPT0gZGVwdGgpIHsKLQkJCQkJCWN1cnJlbnRGcmFtZSA9IChTdGFja0ZyYW1lKXN0YWNrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSVBESVN0YWNrRnJhbWVbXSkgY3VycmVudEZyYW1lcy50b0FycmF5KG5vU3RhY2spOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCNnZXRTdGFja0ZyYW1lcyhpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESVN0YWNrRnJhbWVbXSBnZXRTdGFja0ZyYW1lcyhpbnQgbG93LCBpbnQgaGlnaCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmIChjdXJyZW50RnJhbWVzID09IG51bGwgfHwgY3VycmVudEZyYW1lcy5zaXplKCkgPCBoaWdoKSB7Ci0JCQljdXJyZW50RnJhbWVzID0gbmV3IEFycmF5TGlzdDxJUERJU3RhY2tGcmFtZT4oKTsKLQkJCVRhcmdldCB0YXJnZXQgPSAoVGFyZ2V0KWdldFRhcmdldCgpOwotCQkJSVBESVRocmVhZCBjdXJyZW50VGhyZWFkID0gdGFyZ2V0LmdldEN1cnJlbnRUaHJlYWQoKTsKLQkJCXRhcmdldC5sb2NrVGFyZ2V0KCk7Ci0JCQl0cnkgewotCQkJCXRhcmdldC5zZXRDdXJyZW50VGhyZWFkKHRoaXMsIGZhbHNlKTsKLQkJCQlpbnQgZGVwdGggPSBnZXRTdGFja0ZyYW1lQ291bnQoKTsKLQkJCQlpbnQgdXBwZXJCb3VuZDsKLQkJCQlpZiAoaGlnaCA8IGRlcHRoKSB7Ci0JCQkJCXVwcGVyQm91bmQgPSBNYXRoLm1pbihkZXB0aCwgU1RBQ0tGUkFNRV9ERUZBVUxUX0RFUFRIKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXVwcGVyQm91bmQgPSBkZXB0aDsKLQkJCQl9Ci0JCQkJSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KHNlc3Npb24sCi0JCQkJCQlnZXRUYXNrcygpLCAwLCB1cHBlckJvdW5kKTsKLQkJCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkJSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yW10gZnJhbWVzID0gcmVxdWVzdC5nZXRTdGFja0ZyYW1lcyhnZXRUYXNrcygpKTsKLQkJCQlmb3IgKElQRElTdGFja0ZyYW1lRGVzY3JpcHRvciBmcmFtZSA6IGZyYW1lcykgewotCQkJCQlJUERJTG9jYXRvciBsb2NhdG9yID0gZnJhbWUuZ2V0TG9jYXRvcigpOwotCQkJCQljdXJyZW50RnJhbWVzLmFkZChzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld1N0YWNrRnJhbWUoc2Vzc2lvbiwgdGhpcywgZGVwdGggLSBmcmFtZS5nZXRMZXZlbCgpLCAKLQkJCQkJCQlsb2NhdG9yLmdldEZpbGUoKSwgbG9jYXRvci5nZXRGdW5jdGlvbigpLCBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbG9jYXRvci5nZXRBZGRyZXNzKCkpKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRhcmdldC5zZXRDdXJyZW50VGhyZWFkKGN1cnJlbnRUaHJlYWQsIGZhbHNlKTsKLQkJCQl0YXJnZXQucmVsZWFzZVRhcmdldCgpOwotCQkJfQotCQkJaWYgKGN1cnJlbnRGcmFtZSA9PSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGN1cnJlbnRGcmFtZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJU3RhY2tGcmFtZSBmID0gKFN0YWNrRnJhbWUpY3VycmVudEZyYW1lcy5nZXQoaSk7Ci0JCQkJCWlmIChmLmdldExldmVsKCkgPT0gMCkgewotCQkJCQkJY3VycmVudEZyYW1lID0gZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0PElQRElTdGFja0ZyYW1lPiBsaXN0ID0gKChoaWdoIC0gbG93ICsgMSkgPD0gY3VycmVudEZyYW1lcy5zaXplKCkpID8gY3VycmVudEZyYW1lcy5zdWJMaXN0KGxvdywgaGlnaCArIDEpIDogY3VycmVudEZyYW1lczsKLQkJcmV0dXJuIChJUERJU3RhY2tGcmFtZVtdKWxpc3QudG9BcnJheShub1N0YWNrKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQjZ2V0VGFyZ2V0KCkKLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkI2dldFRocmVhZFN0b3JhZ2VEZXNjcmlwdG9ycygpCi0JICovCi0JcHVibGljIElQRElUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcltdIGdldFRocmVhZFN0b3JhZ2VEZXNjcmlwdG9ycygpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVmFyaWFibGVNYW5hZ2VyIHZhck1nciA9IHNlc3Npb24uZ2V0VmFyaWFibGVNYW5hZ2VyKCk7Ci0JCXJldHVybiB2YXJNZ3IuZ2V0VGhyZWFkU3RvcmFnZURlc2NyaXB0b3JzKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50U3RhY2tGcmFtZShJUERJU3RhY2tGcmFtZSBzdGFja2ZyYW1lKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJY3VycmVudEZyYW1lID0gc3RhY2tmcmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZCNzZXRDdXJyZW50U3RhY2tGcmFtZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudFN0YWNrRnJhbWUoSVBESVN0YWNrRnJhbWUgc3RhY2tmcmFtZSwgYm9vbGVhbiBkb1VwZGF0ZSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWludCBmcmFtZUxldmVsID0gMDsKLQkJaWYgKHN0YWNrZnJhbWUgIT0gbnVsbCkgewotCQkJZnJhbWVMZXZlbCA9IHN0YWNrZnJhbWUuZ2V0TGV2ZWwoKTsKLQkJfQotCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGFscmVhZHkgYXQgdGhpcyBsZXZlbAotCQlpZiAoY3VycmVudEZyYW1lICE9IG51bGwgJiYgY3VycmVudEZyYW1lLmdldExldmVsKCkgPT0gZnJhbWVMZXZlbCkgewotCQkJaWYgKHN0YWNrZnJhbWUgIT0gbnVsbCkgewotCQkJCVRocmVhZCBhVGhyZWFkID0gKFRocmVhZClzdGFja2ZyYW1lLmdldFRocmVhZCgpOwotCQkJCWlmIChhVGhyZWFkICE9IG51bGwgJiYgYVRocmVhZC5nZXRJZCgpID09IGdldElkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldClnZXRUYXJnZXQoKTsKLQkJaW50IGxldmVsID0gZ2V0U3RhY2tGcmFtZUNvdW50KCkgLSBmcmFtZUxldmVsOwotCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQl0cnkgewotCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQodGhpcywgZG9VcGRhdGUpOwotCQkJSVBESVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdChnZXRUYXNrcygpLCBsZXZlbCk7Ci0JCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQlyZXF1ZXN0LndhaXRVbnRpbENvbXBsZXRlZChnZXRUYXNrcygpKTsKLQkJCWN1cnJlbnRGcmFtZSA9IHN0YWNrZnJhbWU7Ci0JCQlpZiAoZG9VcGRhdGUpIHsKLQkJCQlJUERJUmVnaXN0ZXJNYW5hZ2VyIHJlZ01nciA9IHNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCk7Ci0JCQkJaWYgKHJlZ01nci5pc0F1dG9VcGRhdGUoKSkgewotCQkJCQlyZWdNZ3IudXBkYXRlKHRhcmdldC5nZXRUYXNrcygpKTsKLQkJCQl9Ci0JCQkJSVBESVZhcmlhYmxlTWFuYWdlciB2YXJNZ3IgPSBzZXNzaW9uLmdldFZhcmlhYmxlTWFuYWdlcigpOwotCQkJCWlmICh2YXJNZ3IuaXNBdXRvVXBkYXRlKCkpIHsKLQkJCQkJdmFyTWdyLnVwZGF0ZSh0YXJnZXQuZ2V0VGFza3MoKSk7Ci0JCQkJfQotCQkJfQotCQl9IAotCQlmaW5hbGx5IHsKLQkJCXRhcmdldC5yZWxlYXNlVGFyZ2V0KCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHN0ciA9IEludGVnZXIudG9TdHJpbmcoaWQpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlzdHIgKz0gIiAiICsgbmFtZTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZSgpIHsKLQkJdHJ5IHsKLQkJCWdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7fQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvVGhyZWFkU3RvcmFnZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9UaHJlYWRTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDgwMTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9UaHJlYWRTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWRTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkU3RvcmFnZSBleHRlbmRzIFZhcmlhYmxlIGltcGxlbWVudHMgSVBESVRocmVhZFN0b3JhZ2UgewotCXB1YmxpYyBUaHJlYWRTdG9yYWdlKElQRElTZXNzaW9uIHNlc3Npb24sIFRocmVhZFN0b3JhZ2VEZXNjcmlwdG9yIHRocmVhZERlc2MsIFN0cmluZyB2YXJpZCkgewotCQlzdXBlcihzZXNzaW9uLCB0aHJlYWREZXNjLCB2YXJpZCk7Ci0JfQotCQotCXB1YmxpYyBUaHJlYWRTdG9yYWdlKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsTmFtZSwgaW50IHBvcywgaW50IGRlcHRoLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MsIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoLCB2YXJpZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbC5WYXJpYWJsZSNjcmVhdGVWYXJpYWJsZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkuU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWwuVGhyZWFkLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWUsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBJUERJVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESVRocmVhZCB0aHJlYWQsIElQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLCBpbnQgZGVwdGgsIFN0cmluZyB2YXJpZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1RocmVhZFN0b3JhZ2VEZXNjcmlwdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1RocmVhZFN0b3JhZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZGMwMDcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9UaHJlYWRTdG9yYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IgZXh0ZW5kcyBWYXJpYWJsZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJUERJVGhyZWFkU3RvcmFnZURlc2NyaXB0b3IgewotCXB1YmxpYyBUaHJlYWRTdG9yYWdlRGVzY3JpcHRvcihJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBuLCBTdHJpbmcgZm4sIGludCBwb3MsIGludCBkZXB0aCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcywgdGhyZWFkLCBmcmFtZSwgbiwgZm4sIHBvcywgZGVwdGgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9WYXJpYWJsZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9WYXJpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzUxYzI5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVBvaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUFycmF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSVR5cGVBZ2dyZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVHlwZURlcml2ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVmFsdWVBZ2dyZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldFBhcnRpYWxBSUZSZXF1ZXN0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlIGV4dGVuZHMgVmFyaWFibGVEZXNjcmlwdG9yIGltcGxlbWVudHMgSVBESVZhcmlhYmxlIHsKLQlwcml2YXRlIHN0YXRpYyBJUERJVmFyaWFibGVbXSBOT19DSElMRFJFTiA9IG5ldyBJUERJVmFyaWFibGVbMF07Ci0JcHJpdmF0ZSBJUERJVmFyaWFibGVbXSBjaGlsZHJlbiA9IE5PX0NISUxEUkVOOwotCi0JcHJvdGVjdGVkIFN0cmluZyBlZGl0YWJsZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYW5ndWFnZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0ZWQgPSB0cnVlOwotCQkJCi0JcHVibGljIFZhcmlhYmxlKElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIElQRElUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsTmFtZSwgaW50IHBvcywgaW50IGRlcHRoLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MsIHRocmVhZCwgZnJhbWUsIG5hbWUsIGZ1bGxOYW1lLCBwb3MsIGRlcHRoKTsKLQkJdGhpcy52YXJpZCA9IHZhcmlkOwotCX0KLQkKLQlwdWJsaWMgVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB2YXJEZXNjLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdmFyRGVzYyk7Ci0JCXRoaXMudmFyaWQgPSB2YXJpZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXNlc3Npb24uZ2V0VmFyaWFibGVNYW5hZ2VyKCkuZGVzdHJveVZhcmlhYmxlKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlI2VxdWFscyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhJUERJVmFyaWFibGUgdmFyKSB7Ci0JCWlmICh2YXIgaW5zdGFuY2VvZiBWYXJpYWJsZSkgewotCQkJVmFyaWFibGUgdmFyaWFibGUgPSAoVmFyaWFibGUpIHZhcjsKLQkJCXJldHVybiB2YXJpYWJsZS5nZXRWYXJJZCgpLmVxdWFscyhnZXRWYXJJZCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZXF1YWxEZXNjcmlwdG9ycyh2YXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlI2dldENoaWxkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElWYXJpYWJsZSBnZXRDaGlsZChTdHJpbmcgdmFyaWQpIHsKLQkJZm9yIChJUERJVmFyaWFibGUgdmFyaWFibGUgOiBjaGlsZHJlbikgewotCQkJaWYgKHZhcmlhYmxlLmdldFZhcklkKCkuZXF1YWxzKHZhcmlkKSkgewotCQkJCXJldHVybiAoVmFyaWFibGUpdmFyaWFibGU7Ci0JCQl9Ci0JCQlJUERJVmFyaWFibGUgZ3JhbmRDaGlsZCA9ICgoSVBESVZhcmlhYmxlKXZhcmlhYmxlKS5nZXRDaGlsZCh2YXJpZCk7Ci0JCQlpZiAoZ3JhbmRDaGlsZCAhPSBudWxsKQotCQkJCXJldHVybiBncmFuZENoaWxkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlI2dldENoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlW10gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZuID0gZ2V0RnVsbE5hbWUoKTsKLQkJCi0JCVRhcmdldCB0YXJnZXQgPSAoVGFyZ2V0KWZTdGFja0ZyYW1lLmdldFRhcmdldCgpOwotCQlUaHJlYWQgY3VycmVudFRocmVhZCA9IChUaHJlYWQpdGFyZ2V0LmdldEN1cnJlbnRUaHJlYWQoKTsKLQkJSVBESVN0YWNrRnJhbWUgY3VycmVudEZyYW1lID0gY3VycmVudFRocmVhZC5nZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQl0cnkgewotCQkJdGFyZ2V0LnNldEN1cnJlbnRUaHJlYWQoZlN0YWNrRnJhbWUuZ2V0VGhyZWFkKCksIGZhbHNlKTsJCQkJCi0JCQkoKFRocmVhZClmU3RhY2tGcmFtZS5nZXRUaHJlYWQoKSkuc2V0Q3VycmVudFN0YWNrRnJhbWUoZlN0YWNrRnJhbWUsIGZhbHNlKTsKLQotCQkJSVBESUdldFBhcnRpYWxBSUZSZXF1ZXN0IHJlcXVlc3QgPSBzZXNzaW9uLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0R2V0UGFydGlhbEFJRlJlcXVlc3QoZ2V0VGFza3MoKSwgZ2V0UXVhbGlmaWVkTmFtZSgpLCB2YXJpZCwgdHJ1ZSk7Ci0JCQlzZXNzaW9uLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQlJQUlGIGFpZiA9IHJlcXVlc3QuZ2V0UGFydGlhbEFJRihnZXRUYXNrcygpKTsKLQkJCVN0cmluZyBjaF92YXJpZCA9IHJlcXVlc3QuZ2V0VmFySWQoZ2V0VGFza3MoKSk7Ci0JCi0JCQlJQUlGVHlwZSB0eXBlID0gYWlmLmdldFR5cGUoKTsKLQkJCUlBSUZWYWx1ZSB2YWx1ZSA9IGFpZi5nZXRWYWx1ZSgpOwotCQkJZlR5cGVuYW1lID0gYWlmLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAodmFyaWQgPT0gbnVsbCkgewotCQkJCXZhcmlkID0gY2hfdmFyaWQ7Ci0JCQl9Ci0JCi0JCQlpZiAodHlwZSBpbnN0YW5jZW9mIElUeXBlRGVyaXZlZCkgewotCQkJCUlBSUZUeXBlIGJhc2VUeXBlID0gKChJVHlwZURlcml2ZWQpdHlwZSkuZ2V0QmFzZVR5cGUoKTsKLQkJCQlpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlQXJyYXkpIHsKLQkJCQkJLy9hbHdheXMgZ2V0IGZyb20gMAotCQkJCQlJQUlGVmFsdWVbXSB2YWx1ZXMgPSAoKElBSUZWYWx1ZUFycmF5KXZhbHVlKS5nZXRWYWx1ZXMoKTsKLQkJCQkJY2hpbGRyZW4gPSBuZXcgVmFyaWFibGVbdmFsdWVzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkJaW50IGluZGV4ID0gY2FzdGluZ0luZGV4ICsgaTsKLQkJCQkJCVN0cmluZyBjaF9mbiA9ICIoIiArIGZuICsgIilbIiArIGluZGV4ICsgIl0iOwotCQkJCQkJU3RyaW5nIGNoX24gPSBnZXROYW1lKCkgKyAiWyIgKyBpbmRleCArICJdIjsKLQkJCQkJCVN0cmluZyBjaF9rID0gdmFyaWQgKyAiLiIgKyBpOwotCQkJCQkJSVBESVZhcmlhYmxlIHYgPSBjcmVhdGVWYXJpYWJsZShzZXNzaW9uLCBnZXRUYXNrcygpLCBmVGhyZWFkLCBmU3RhY2tGcmFtZSwgY2hfbiwgY2hfZm4sIGdldFBvc2l0aW9uKCksIGdldFN0YWNrRGVwdGgoKSwgY2hfayk7CQkJCQkKLQkJCQkJCXYuc2V0QUlGKEFJRkZhY3RvcnkubmV3QUlGKGJhc2VUeXBlLCB2YWx1ZXNbaV0pKTsKLQkJCQkJCWNoaWxkcmVuW2ldID0gdjsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVQb2ludGVyKSB7Ci0JCQkJCWlmIChiYXNlVHlwZSBpbnN0YW5jZW9mIElUeXBlQWdncmVnYXRlKSB7Ci0JCQkJCQlJVHlwZUFnZ3JlZ2F0ZSBhZ2dyVHlwZSA9IChJVHlwZUFnZ3JlZ2F0ZSliYXNlVHlwZTsKLQkJCQkJCWNoaWxkcmVuID0gbmV3IFZhcmlhYmxlW2FnZ3JUeXBlLmdldE51bWJlck9mQ2hpbGRyZW4oKV07Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgY2hfZm4gPSAiKCIgKyBmbiArICIpLT4iICsgYWdnclR5cGUuZ2V0RmllbGQoaSk7Ci0JCQkJCQkJU3RyaW5nIGNoX24gPSBhZ2dyVHlwZS5nZXRGaWVsZChpKTsgCi0JCQkJCQkJU3RyaW5nIGNoX2sgPSB2YXJpZCArICIuIiArIGNoX247Ci0JCQkJCQkJSVBESVZhcmlhYmxlIHYgPSBjcmVhdGVWYXJpYWJsZShzZXNzaW9uLCBnZXRUYXNrcygpLCBmVGhyZWFkLCBmU3RhY2tGcmFtZSwgY2hfbiwgY2hfZm4sIGdldFBvc2l0aW9uKCksIGdldFN0YWNrRGVwdGgoKSwgY2hfayk7Ci0JCQkJCQkJdi5zZXRBSUYoQUlGRmFjdG9yeS5uZXdBSUYoYWdnclR5cGUuZ2V0VHlwZShpKSwgKChJVmFsdWVBZ2dyZWdhdGUpdmFsdWUpLmdldFZhbHVlKGkpKSk7Ci0JCQkJCQkJY2hpbGRyZW5baV0gPSB2OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY2hpbGRyZW4gPSBuZXcgVmFyaWFibGVbMV07Ci0JCQkJCQlTdHJpbmcgY2hfZm4gPSAiKigiICsgZm4gKyAiKSI7Ci0JCQkJCQlTdHJpbmcgY2hfbiA9IGNoX3ZhcmlkOwotCQkJCQkJU3RyaW5nIGNoX2sgPSB2YXJpZCArICIuIiArIGNoX247Ci0JCQkJCQlJUERJVmFyaWFibGUgdiA9IGNyZWF0ZVZhcmlhYmxlKHNlc3Npb24sIGdldFRhc2tzKCksIGZUaHJlYWQsIGZTdGFja0ZyYW1lLCBjaF9uLCBjaF9mbiwgZ2V0UG9zaXRpb24oKSwgZ2V0U3RhY2tEZXB0aCgpLCBjaF9rKTsKLQkJCQkJCXYuc2V0QUlGKEFJRkZhY3RvcnkubmV3QUlGKHR5cGUsIHZhbHVlKSk7Ci0JCQkJCQljaGlsZHJlblswXSA9IHY7CQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZVJlZmVyZW5jZSkgewotCQkJCWNoaWxkcmVuID0gbmV3IFZhcmlhYmxlWzFdOwotCQkJCVN0cmluZyBjaF9mbiA9ICIoIiArIGZuICsgIiktPiIgKyAoKElBSUZUeXBlUmVmZXJlbmNlKXR5cGUpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgY2hfbiA9ICgoSUFJRlR5cGVSZWZlcmVuY2UpdHlwZSkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBjaF9rID0gdmFyaWQgKyAiLiIgKyBjaF9uOwotCQkJCUlQRElWYXJpYWJsZSB2ID0gY3JlYXRlVmFyaWFibGUoc2Vzc2lvbiwgZ2V0VGFza3MoKSwgZlRocmVhZCwgZlN0YWNrRnJhbWUsIGNoX24sIGNoX2ZuLCBnZXRQb3NpdGlvbigpLCBnZXRTdGFja0RlcHRoKCksIGNoX2spOwotCQkJCXYuc2V0QUlGKEFJRkZhY3RvcnkubmV3QUlGKHR5cGUsIHZhbHVlKSk7Ci0JCQkJY2hpbGRyZW5bMF0gPSB2OwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSVR5cGVBZ2dyZWdhdGUpIHsKLQkJCQlJVHlwZUFnZ3JlZ2F0ZSBhZ2dyVHlwZSA9IChJVHlwZUFnZ3JlZ2F0ZSl0eXBlOwotCQkJCWNoaWxkcmVuID0gbmV3IFZhcmlhYmxlW2FnZ3JUeXBlLmdldE51bWJlck9mQ2hpbGRyZW4oKV07Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBjaF9mbiA9ICIoIiArIGZuICsgIikuIiArIGFnZ3JUeXBlLmdldEZpZWxkKGkpOwotCQkJCQlTdHJpbmcgY2hfbiA9IGFnZ3JUeXBlLmdldEZpZWxkKGkpOyAKLQkJCQkJU3RyaW5nIGNoX2sgPSB2YXJpZCArICIuIiArIGNoX247Ci0JCQkJCUlQRElWYXJpYWJsZSB2ID0gY3JlYXRlVmFyaWFibGUoc2Vzc2lvbiwgZ2V0VGFza3MoKSwgZlRocmVhZCwgZlN0YWNrRnJhbWUsIGNoX24sIGNoX2ZuLCBnZXRQb3NpdGlvbigpLCBnZXRTdGFja0RlcHRoKCksIGNoX2spOwotCQkJCQl2LnNldEFJRihBSUZGYWN0b3J5Lm5ld0FJRihhZ2dyVHlwZS5nZXRUeXBlKGkpLCAoKElWYWx1ZUFnZ3JlZ2F0ZSl2YWx1ZSkuZ2V0VmFsdWUoaSkpKTsKLQkJCQkJY2hpbGRyZW5baV0gPSB2OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWNoaWxkcmVuID0gbmV3IFZhcmlhYmxlWzFdOwotCQkJCVN0cmluZyBjaF9mbiA9IGZuOwotCQkJCVN0cmluZyBjaF9uID0gY2hfdmFyaWQ7Ci0JCQkJU3RyaW5nIGNoX2sgPSB2YXJpZCArICIuIiArIGNoX247Ci0JCQkJSVBESVZhcmlhYmxlIHYgPSBjcmVhdGVWYXJpYWJsZShzZXNzaW9uLCBnZXRUYXNrcygpLCBmVGhyZWFkLCBmU3RhY2tGcmFtZSwgY2hfbiwgY2hfZm4sIGdldFBvc2l0aW9uKCksIGdldFN0YWNrRGVwdGgoKSwgY2hfayk7Ci0JCQkJdi5zZXRBSUYoQUlGRmFjdG9yeS5uZXdBSUYodHlwZSwgdmFsdWUpKTsKLQkJCQljaGlsZHJlblswXSA9IHY7Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChjdXJyZW50VGhyZWFkLCBmYWxzZSk7Ci0JCQljdXJyZW50VGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKGN1cnJlbnRGcmFtZSwgZmFsc2UpOwotCQkJdGFyZ2V0LnJlbGVhc2VUYXJnZXQoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlI2dldENoaWxkcmVuKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVbXSBnZXRDaGlsZHJlbihpbnQgZmluZGV4LCBpbnQgcHNpemUpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZvID0gZ2V0VmFyaWFibGVEZXNjcmlwdG9yQXNBcnJheShmaW5kZXgsIHBzaXplKTsKLQkJSVBESVZhcmlhYmxlIHZhciA9IHNlc3Npb24uZ2V0VmFyaWFibGVNYW5hZ2VyKCkuY3JlYXRlVmFyaWFibGUoKFZhcmlhYmxlRGVzY3JpcHRvcil2byk7Ci0JCXJldHVybiB2YXIuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZSNnZXRDaGlsZHJlbk51bWJlcigpCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZHJlbk51bWJlcigpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJQUlGIGE9IGdldEFJRigpOwotCQlpZiAoYS5nZXRUeXBlKCkgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQlyZXR1cm4gKChJQUlGVHlwZUFycmF5KWEuZ2V0VHlwZSgpKS5nZXRSYW5nZSgpOwotCQl9Ci0JCWlmIChhLmdldFR5cGUoKSBpbnN0YW5jZW9mIElUeXBlQWdncmVnYXRlKSB7Ci0JCQlyZXR1cm4gKChJVHlwZUFnZ3JlZ2F0ZSlhLmdldFR5cGUoKSkuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlI2lzRWRpdGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKGVkaXRhYmxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24oZ2V0VGFza3MoKSwgIk5vdCBpbXBsZW1lbnQgeWV0IC0gVmFyaWFibGU6IGlzRWRpdGFibGUoKSIpOwotCQl9Ci0JCXJldHVybiAoZWRpdGFibGUgPT0gbnVsbCkgPyBmYWxzZSA6IGVkaXRhYmxlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZSNyZXNldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFZhbHVlKCkgewotCQlzZXRBSUYobnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGUjc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24oZ2V0VGFza3MoKSwgIk5vdCBpbXBsZW1lbnRlZCBzZXRWYWx1ZShTdHJpbmcpIHlldC4iKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gdGhyZWFkCi0JICogQHBhcmFtIGZyYW1lCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZnVsbE5hbWUKLQkgKiBAcGFyYW0gcG9zCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHBhcmFtIHZhcmlkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJUERJVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgSVBESVRocmVhZCB0aHJlYWQsIElQRElTdGFja0ZyYW1lIGZyYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBpbnQgcG9zLCBpbnQgZGVwdGgsIFN0cmluZyB2YXJpZCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1ZhcmlhYmxlRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9tb2RlbC9WYXJpYWJsZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzNjE3OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1ZhcmlhYmxlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJR2V0UGFydGlhbEFJRlJlcXVlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVEZXNjcmlwdG9yIGV4dGVuZHMgU2Vzc2lvbk9iamVjdCBpbXBsZW1lbnRzIElQRElWYXJpYWJsZURlc2NyaXB0b3IgewotCS8qKgotCSAqIEBwYXJhbSB2YXIxCi0JICogQHBhcmFtIHZhcjIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0Nhc3RpbmcoVmFyaWFibGVEZXNjcmlwdG9yIHZhcjEsIFZhcmlhYmxlRGVzY3JpcHRvciB2YXIyKSB7Ci0JCVN0cmluZ1tdIGNhc3RpbmdzMSA9IHZhcjEuZ2V0Q2FzdGluZ1R5cGVzKCk7Ci0JCVN0cmluZ1tdIGNhc3RpbmdzMiA9IHZhcjIuZ2V0Q2FzdGluZ1R5cGVzKCk7Ci0JCWlmIChjYXN0aW5nczEgPT0gbnVsbCAmJiBjYXN0aW5nczIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoY2FzdGluZ3MxICE9IG51bGwgJiYgY2FzdGluZ3MyICE9IG51bGwgJiYgY2FzdGluZ3MxLmxlbmd0aCA9PSBjYXN0aW5nczIubGVuZ3RoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc3RpbmdzMS5sZW5ndGg7ICsraSkgewotCQkJCWlmICghY2FzdGluZ3MxW2ldLmVxdWFscyhjYXN0aW5nczJbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vIENhc3RpbmcgaW5mby4KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY2FzdGluZ1R5cGVzOwotCXByb3RlY3RlZCBpbnQgY2FzdGluZ0luZGV4OwotCi0JcHJvdGVjdGVkIGludCBjYXN0aW5nTGVuZ3RoOwotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWU7Ci0JcHJvdGVjdGVkIGludCBwb3NpdGlvbjsKLQlwcm90ZWN0ZWQgSVBESVN0YWNrRnJhbWUgZlN0YWNrRnJhbWU7Ci0JcHJvdGVjdGVkIElQRElUaHJlYWQgZlRocmVhZDsKLQotCXByb3RlY3RlZCBpbnQgc3RhY2tkZXB0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZkZ1bGxOYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlbmFtZSA9IG51bGw7CQotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWQgPSBudWxsOwotCXByb3RlY3RlZCBJQUlGIGFpZiA9IG51bGw7Ci0JCi0JcHVibGljIFZhcmlhYmxlRGVzY3JpcHRvcihJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJVGhyZWFkIHRocmVhZCwgSVBESVN0YWNrRnJhbWUgc3RhY2ssIFN0cmluZyBuLCBTdHJpbmcgZm4sIGludCBwb3MsIGludCBkZXB0aCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCWZOYW1lID0gbjsKLQkJZkZ1bGxOYW1lID0gZm47Ci0JCWZTdGFja0ZyYW1lID0gc3RhY2s7Ci0JCWZUaHJlYWQgPSB0aHJlYWQ7Ci0JCXBvc2l0aW9uID0gcG9zOwotCQlzdGFja2RlcHRoID0gZGVwdGg7Ci0JfQotCQotCXB1YmxpYyBWYXJpYWJsZURlc2NyaXB0b3IoSVBESVNlc3Npb24gc2Vzc2lvbiwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXN1cGVyKHNlc3Npb24sIGRlc2MuZ2V0VGFza3MoKSk7Ci0JCXRoaXMuZk5hbWUgPSBkZXNjLmdldE5hbWUoKTsKLQkJdGhpcy5mRnVsbE5hbWUgPSBkZXNjLmdldEZ1bGxOYW1lKCk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmZTdGFja0ZyYW1lID0gKFN0YWNrRnJhbWUpZGVzYy5nZXRTdGFja0ZyYW1lKCk7Ci0JCQl0aGlzLmZUaHJlYWQgPSAoVGhyZWFkKWRlc2MuZ2V0VGhyZWFkKCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdGhpcy5wb3NpdGlvbiA9IGRlc2MuZ2V0UG9zaXRpb24oKTsKLQkJdGhpcy5zdGFja2RlcHRoID0gZGVzYy5nZXRTdGFja0RlcHRoKCk7Ci0JCXRoaXMuY2FzdGluZ0luZGV4ID0gZGVzYy5nZXRDYXN0aW5nQXJyYXlTdGFydCgpOwotCQl0aGlzLmNhc3RpbmdMZW5ndGggPSBkZXNjLmdldENhc3RpbmdBcnJheUVuZCgpOwotCQl0aGlzLmNhc3RpbmdUeXBlcyA9IGRlc2MuZ2V0Q2FzdGluZ1R5cGVzKCk7Ci0JfQotCQotCS8qCi0JICogRklYTUUgLS0gaXQgZGVzaWducyBmb3IgR0RCCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlVmFyaWFibGUoKSB7Ci0JCVN0cmluZyBmbiA9IGdldEZ1bGxOYW1lKCk7Ci0JCWlmIChjYXN0aW5nTGVuZ3RoID4gMCB8fCBjYXN0aW5nSW5kZXggPiAwKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmZmVyLmFwcGVuZCgiKigiKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJygnKS5hcHBlbmQoZm4pLmFwcGVuZCgnKScpOwotCQkJYnVmZmVyLmFwcGVuZCgnKycpLmFwcGVuZChjYXN0aW5nSW5kZXgpLmFwcGVuZCgnKScpOwotCQkJYnVmZmVyLmFwcGVuZCgnQCcpLmFwcGVuZChjYXN0aW5nTGVuZ3RoKTsKLQkJCWZuID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSBpZiAoY2FzdGluZ1R5cGVzICE9IG51bGwgJiYgY2FzdGluZ1R5cGVzLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc3RpbmdUeXBlcy5sZW5ndGg7ICsraSkgewotCQkJCWlmIChjYXN0aW5nVHlwZXNbaV0gIT0gbnVsbCAmJiBjYXN0aW5nVHlwZXNbaV0ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgnKCcpLmFwcGVuZChjYXN0aW5nVHlwZXNbaV0pLmFwcGVuZCgnKScpOwotCQkJCQkJYnVmZmVyLmFwcGVuZChmbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlidWZmZXIuaW5zZXJ0KDAsICcoJyk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWIuYXBwZW5kKCcoJykuYXBwZW5kKGNhc3RpbmdUeXBlc1tpXSkuYXBwZW5kKCcpJyk7Ci0JCQkJCQlidWZmZXIuaW5zZXJ0KDAsIGIudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmbiA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBmbjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhckRlc2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxEZXNjcmlwdG9ycyhJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZhckRlc2MpIHsKLQkJaWYgKHZhckRlc2MgaW5zdGFuY2VvZiBWYXJpYWJsZURlc2NyaXB0b3IpIHsKLQkJCVZhcmlhYmxlRGVzY3JpcHRvciBkZXNjID0gKFZhcmlhYmxlRGVzY3JpcHRvcikgdmFyRGVzYzsKLQkJCWlmIChkZXNjLmdldE5hbWUoKS5lcXVhbHMoZ2V0TmFtZSgpKQotCQkJCSYmIGRlc2MuZ2V0Q2FzdGluZ0FycmF5U3RhcnQoKSA9PSBnZXRDYXN0aW5nQXJyYXlTdGFydCgpCi0JCQkJJiYgZGVzYy5nZXRDYXN0aW5nQXJyYXlFbmQoKSA9PSBnZXRDYXN0aW5nQXJyYXlFbmQoKQotCQkJCSYmIGVxdWFsc0Nhc3RpbmcoZGVzYywgdGhpcykpIHsKLQotCQkJCS8vIENoZWNrIHRoZSB0aHJlYWRzCi0JCQkJSVBESVRocmVhZCB2YXJUaHJlYWQgPSBudWxsOwotCQkJCUlQRElUaHJlYWQgb3VyVGhyZWFkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl2YXJUaHJlYWQgPSBkZXNjLmdldFRocmVhZCgpOwotCQkJCQlvdXJUaHJlYWQgPSBnZXRUaHJlYWQoKTsKLQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJaWYgKChvdXJUaHJlYWQgPT0gbnVsbCAmJiB2YXJUaHJlYWQgPT0gbnVsbCkgfHwgKHZhclRocmVhZCAhPSBudWxsICYmIG91clRocmVhZCAhPSBudWxsICYmIHZhclRocmVhZC5lcXVhbHMob3VyVGhyZWFkKSkpIHsKLQkJCQkJLy8gY2hlY2sgdGhlIHN0YWNrRnJhbWVzCi0JCQkJCUlQRElTdGFja0ZyYW1lIHZhckZyYW1lID0gbnVsbDsKLQkJCQkJSVBESVN0YWNrRnJhbWUgb3VyRnJhbWUgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJdmFyRnJhbWUgPSBkZXNjLmdldFN0YWNrRnJhbWUoKTsKLQkJCQkJCW91ckZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJaWYgKG91ckZyYW1lID09IG51bGwgJiYgdmFyRnJhbWUgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSBpZiAodmFyRnJhbWUgIT0gbnVsbCAmJiBvdXJGcmFtZSAhPSBudWxsICYmIHZhckZyYW1lLmVxdWFscyhvdXJGcmFtZSkpIHsKLQkJCQkJCWlmIChkZXNjLmdldFN0YWNrRGVwdGgoKSA9PSBnZXRTdGFja0RlcHRoKCkpIHsKLQkJCQkJCQlpZiAoZGVzYy5nZXRQb3NpdGlvbigpID09IGdldFBvc2l0aW9uKCkpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKHZhckRlc2MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlRGVzY3JpcHRvciNnZXRBSUYoKQotCSAqLwotCXB1YmxpYyBJQUlGIGdldEFJRigpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlpZiAoYWlmID09IG51bGwpIHsKLQkJCVRhcmdldCB0YXJnZXQgPSAoVGFyZ2V0KWZTdGFja0ZyYW1lLmdldFRhcmdldCgpOwotCQkJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSAoVGhyZWFkKXRhcmdldC5nZXRDdXJyZW50VGhyZWFkKCk7Ci0JCQlJUERJU3RhY2tGcmFtZSBjdXJyZW50RnJhbWUgPSBjdXJyZW50VGhyZWFkLmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCQl0YXJnZXQubG9ja1RhcmdldCgpOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXQuc2V0Q3VycmVudFRocmVhZChmU3RhY2tGcmFtZS5nZXRUaHJlYWQoKSwgZmFsc2UpOwkJCQkKLQkJCQkoKFRocmVhZClmU3RhY2tGcmFtZS5nZXRUaHJlYWQoKSkuc2V0Q3VycmVudFN0YWNrRnJhbWUoZlN0YWNrRnJhbWUsIGZhbHNlKTsKLQkJCQotCQkJCUlQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRSZXF1ZXN0RmFjdG9yeSgpLmdldEdldFBhcnRpYWxBSUZSZXF1ZXN0KGdldFRhc2tzKCksIGdldFF1YWxpZmllZE5hbWUoKSwgdmFyaWQpOwotCQkJCXNlc3Npb24uZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCQlhaWYgPSByZXF1ZXN0LmdldFBhcnRpYWxBSUYoZ2V0VGFza3MoKSk7Ci0JCQkJdmFyaWQgPSByZXF1ZXN0LmdldFZhcklkKGdldFRhc2tzKCkpOwotCQkJfSAKLQkJCWZpbmFsbHkgewotCQkJCXRhcmdldC5zZXRDdXJyZW50VGhyZWFkKGN1cnJlbnRUaHJlYWQsIGZhbHNlKTsKLQkJCQljdXJyZW50VGhyZWFkLnNldEN1cnJlbnRTdGFja0ZyYW1lKGN1cnJlbnRGcmFtZSwgZmFsc2UpOwotCQkJCXRhcmdldC5yZWxlYXNlVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFpZjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IjZ2V0Q2FzdGluZ0FycmF5RW5kKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENhc3RpbmdBcnJheUVuZCgpIHsKLQkJcmV0dXJuIGNhc3RpbmdMZW5ndGg7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldENhc3RpbmdBcnJheVN0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENhc3RpbmdBcnJheVN0YXJ0KCkgewotCQlyZXR1cm4gY2FzdGluZ0luZGV4OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENhc3RpbmdUeXBlcygpIHsKLQkJcmV0dXJuIGNhc3RpbmdUeXBlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0JCWlmIChmRnVsbE5hbWUgPT0gbnVsbCkgewotCQkJZkZ1bGxOYW1lID0gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBmRnVsbE5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldFBvc2l0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlRGVzY3JpcHRvciNnZXRRdWFsaWZpZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkgewotCQkJcXVhbGlmaWVkTmFtZSA9IGVuY29kZVZhcmlhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldFN0YWNrRGVwdGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhY2tEZXB0aCgpIHsKLQkJcmV0dXJuIHN0YWNrZGVwdGg7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldFN0YWNrRnJhbWUoKQotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZSBnZXRTdGFja0ZyYW1lKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmU3RhY2tGcmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IjZ2V0VGhyZWFkKCkKLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZCBnZXRUaHJlYWQoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZUaHJlYWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWlmIChmVHlwZW5hbWUgPT0gbnVsbCkgewotCQkJZlR5cGVuYW1lID0gZ2V0QUlGKCkuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZUeXBlbmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IjZ2V0VmFyaWFibGVEZXNjcmlwdG9yQXNBcnJheShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBnZXRWYXJpYWJsZURlc2NyaXB0b3JBc0FycmF5KGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFZhcmlhYmxlTWFuYWdlcigpLmdldFZhcmlhYmxlRGVzY3JpcHRvckFzQXJyYXkodGhpcywgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI2dldFZhcmlhYmxlRGVzY3JpcHRvckFzVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUERJVmFyaWFibGVEZXNjcmlwdG9yIGdldFZhcmlhYmxlRGVzY3JpcHRvckFzVHlwZShTdHJpbmcgdHlwZSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFZhcmlhYmxlTWFuYWdlcigpLmdldFZhcmlhYmxlRGVzY3JpcHRvckFzVHlwZSh0aGlzLCB0eXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3IjZ2V0VmFySWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFySWQoKSB7Ci0JCXJldHVybiB2YXJpZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3Ijc2V0QUlGKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBSUYoSUFJRiBhaWYpIHsKLQkJdGhpcy5haWYgPSBhaWY7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI3NldENhc3RpbmdBcnJheUVuZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzdGluZ0FycmF5RW5kKGludCBlbmQpIHsKLQkJY2FzdGluZ0xlbmd0aCA9IGVuZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlRGVzY3JpcHRvciNzZXRDYXN0aW5nQXJyYXlTdGFydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzdGluZ0FycmF5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCWNhc3RpbmdJbmRleCA9IHN0YXJ0OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc3RpbmdUeXBlcyhTdHJpbmdbXSB0KSB7Ci0JCWNhc3RpbmdUeXBlcyA9IHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yI3NpemVvZigpCi0JICovCi0JcHVibGljIGludCBzaXplb2YoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEFJRigpLmdldFR5cGUoKS5zaXplb2YoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL21vZGVsL1dhdGNocG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvV2F0Y2hwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgzMjVhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvbW9kZWwvV2F0Y2hwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVdhdGNocG9pbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgV2F0Y2hwb2ludCBleHRlbmRzIEJyZWFrcG9pbnQgaW1wbGVtZW50cyBJUERJV2F0Y2hwb2ludCB7Ci0JcHJpdmF0ZSBpbnQgd2F0Y2hUeXBlOwotCXByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0JCi0JcHVibGljIFdhdGNocG9pbnQoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IHR5cGUsIFN0cmluZyBleHByZXNzaW9uLCBpbnQgd1R5cGUsIElQRElDb25kaXRpb24gY29uZGl0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MsIHR5cGUsIGNvbmRpdGlvbiwgZW5hYmxlZCk7Ci0JCXRoaXMud2F0Y2hUeXBlID0gd1R5cGU7Ci0JCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJV2F0Y2hwb2ludCNnZXRXYXRjaEV4cHJlc3Npb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2F0Y2hFeHByZXNzaW9uKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVdhdGNocG9pbnQjaXNSZWFkVHlwZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkVHlwZSgpIHsKLQkJcmV0dXJuICgod2F0Y2hUeXBlICYgSVBESVdhdGNocG9pbnQuUkVBRCkgPT0gSVBESVdhdGNocG9pbnQuUkVBRCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJV2F0Y2hwb2ludCNpc1dyaXRlVHlwZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXcml0ZVR5cGUoKSB7Ci0JCXJldHVybiAoKHdhdGNoVHlwZSAmIElQRElXYXRjaHBvaW50LldSSVRFKSA9PSBJUERJV2F0Y2hwb2ludC5XUklURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0JyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvQnJlYWtwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkNmVkNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvQnJlYWtwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJQnJlYWtwb2ludFJlcXVlc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCcmVha3BvaW50UmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUJyZWFrcG9pbnRSZXF1ZXN0IHsKLQlwcm90ZWN0ZWQgSVBESUJyZWFrcG9pbnQgYnB0OwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93VXBkYXRlOwotCQotCXB1YmxpYyBCcmVha3BvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQpIHsKLQkJdGhpcyh0YXNrcywgYnB0LCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIEJyZWFrcG9pbnRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIElQRElCcmVha3BvaW50IGJwdCwgYm9vbGVhbiBhbGxvd1VwZGF0ZSkgewotCQlzdXBlcih0YXNrcyk7Ci0JCXRoaXMuYnB0ID0gYnB0OwotCQl0aGlzLmFsbG93VXBkYXRlID0gYWxsb3dVcGRhdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbmlzaCgpIHRocm93cyBQRElFeGNlcHRpb24gewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJQnJlYWtwb2ludFJlcXVlc3QjZ2V0QnJlYWtwb2ludCgpCi0JICovCi0JcHVibGljIElQRElCcmVha3BvaW50IGdldEJyZWFrcG9pbnQoKSB7Ci0JCXJldHVybiBicHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElCcmVha3BvaW50UmVxdWVzdCNpc0FsbG93VXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG93VXBkYXRlKCkgewotCQlyZXR1cm4gYWxsb3dVcGRhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0NvbW1hbmRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvQ29tbWFuZFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxYWMxYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvQ29tbWFuZFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUNvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3QgaW1wbGVtZW50cyBJUERJQ29tbWFuZFJlcXVlc3QgewotCXByaXZhdGUgU3RyaW5nIGNvbW1hbmQ7Ci0JCi0JcHVibGljIENvbW1hbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBjb21tYW5kKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiQ29tbWFuZCByZXF1ZXN0IjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLmNvbW1hbmRSZXF1ZXN0KHRhc2tzLCBjb21tYW5kKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Qjc3RvcmVSZXN1bHQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGF0YVdyaXRlTWVtb3J5UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0RhdGFXcml0ZU1lbW9yeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMWU1Ni4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGF0YVdyaXRlTWVtb3J5UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRGF0YVdyaXRlTWVtb3J5UmVxdWVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhV3JpdGVNZW1vcnlSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3QgaW1wbGVtZW50cyBJUERJRGF0YVdyaXRlTWVtb3J5UmVxdWVzdCB7Ci0JcHJpdmF0ZSBsb25nIG9mZnNldDsKLQlwcml2YXRlIFN0cmluZyBhZGRyZXNzOwotCXByaXZhdGUgaW50IHdvcmRGb3JtYXQ7Ci0JcHJpdmF0ZSBpbnQgd29yZFNpemU7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCi0JcHVibGljIERhdGFXcml0ZU1lbW9yeVJlcXVlc3QoQml0TGlzdCB0YXNrcywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCBpbnQgd29yZEZvcm1hdCwgaW50IHdvcmRTaXplLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3VwZXIodGFza3MpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLQkJdGhpcy53b3JkU2l6ZSA9IHdvcmRTaXplOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMud29yZEZvcm1hdCA9IHdvcmRGb3JtYXQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5jcmVhdGVEYXRhV3JpdGVNZW1vcnkodGFza3MsIG9mZnNldCwgYWRkcmVzcywgd29yZEZvcm1hdCwgd29yZFNpemUsIHZhbHVlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiQ3JlYXRlIGRhdGEgd3JpdGUgbWVtb3J5IHJlcXVlc3QiOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCNzdG9yZVJlc3VsdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlUmVzdWx0KEJpdExpc3QgclRhc2tzLCBPYmplY3QgcmVzdWx0KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0RlbGV0ZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGVsZXRlQnJlYWtwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhZThmOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGVsZXRlQnJlYWtwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElEZWxldGVCcmVha3BvaW50UmVxdWVzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUJyZWFrcG9pbnRSZXF1ZXN0IGV4dGVuZHMgQnJlYWtwb2ludFJlcXVlc3QgaW1wbGVtZW50cyBJUERJRGVsZXRlQnJlYWtwb2ludFJlcXVlc3QgewotCXB1YmxpYyBEZWxldGVCcmVha3BvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQsIGJvb2xlYW4gYWxsb3dVcGRhdGUpIHsKLQkJc3VwZXIodGFza3MsIGJwdCwgYWxsb3dVcGRhdGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIuZGVsZXRlQnJlYWtwb2ludChnZXRUYXNrcygpLCBnZXRCcmVha3BvaW50KCkuZ2V0QnJlYWtwb2ludElEKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJEZWxldGUgQnJlYWtwb2ludCBSZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGVsZXRlVmFyaWFibGVSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGVsZXRlVmFyaWFibGVSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYmQ5NWEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0RlbGV0ZVZhcmlhYmxlUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVZhcmlhYmxlUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESURlbGV0ZVZhcmlhYmxlUmVxdWVzdCB7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFyaWQ7Ci0JCi0JcHVibGljIERlbGV0ZVZhcmlhYmxlUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgdmFyaWQpIHsKLQkJc3VwZXIodGFza3MpOwotCQl0aGlzLnZhcmlkID0gdmFyaWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5kZWxldGVWYXJpYWJsZSh0YXNrcywgdmFyaWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJEZWxldGUgdmFyaWFibGUgcmVxdWVzdCI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I3N0b3JlUmVzdWx0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVSZXN1bHQoQml0TGlzdCByVGFza3MsIE9iamVjdCByZXN1bHQpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGlzYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvRGlzYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGJlOTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0Rpc2FibGVCcmVha3BvaW50UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESURpc2FibGVCcmVha3BvaW50UmVxdWVzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIERpc2FibGVCcmVha3BvaW50UmVxdWVzdCBleHRlbmRzIEJyZWFrcG9pbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESURpc2FibGVCcmVha3BvaW50UmVxdWVzdCB7Ci0JcHVibGljIERpc2FibGVCcmVha3BvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBicHQpIHsKLQkJc3VwZXIodGFza3MsIGJwdCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5zZXRFbmFibGVkQnJlYWtwb2ludChnZXRUYXNrcygpLCBnZXRCcmVha3BvaW50KCkuZ2V0QnJlYWtwb2ludElEKCksIGZhbHNlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiRGlzYWJsZSBCcmVha3BvaW50IFJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9FbmFibGVCcmVha3BvaW50UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0VuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDdlODQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L0VuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRW5hYmxlQnJlYWtwb2ludFJlcXVlc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVCcmVha3BvaW50UmVxdWVzdCBleHRlbmRzIEJyZWFrcG9pbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESUVuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0IHsKLQlwdWJsaWMgRW5hYmxlQnJlYWtwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESUJyZWFrcG9pbnQgYnB0KSB7Ci0JCXN1cGVyKHRhc2tzLCBicHQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIuc2V0RW5hYmxlZEJyZWFrcG9pbnQoZ2V0VGFza3MoKSwgZ2V0QnJlYWtwb2ludCgpLmdldEJyZWFrcG9pbnRJRCgpLCB0cnVlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiRW5hYmxlIEJyZWFrcG9pbnQgUmVxdWVzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1Jlc3VtZVJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9SZXN1bWVSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmE5NmYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1Jlc3VtZVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdvUmVxdWVzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3VtZVJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UmVxdWVzdCBpbXBsZW1lbnRzIElQRElHb1JlcXVlc3QgewotCXByaXZhdGUgYm9vbGVhbiBwYXNzU2lnbmFsID0gZmFsc2U7Ci0JCi0JcHVibGljIFJlc3VtZVJlcXVlc3QoQml0TGlzdCB0YXNrcywgYm9vbGVhbiBwYXNzU2lnbmFsKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5wYXNzU2lnbmFsID0gcGFzc1NpZ25hbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnJlc3VtZSh0YXNrcywgcGFzc1NpZ25hbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbmlzaCgpIHRocm93cyBQRElFeGNlcHRpb24ge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJSZXN1bWUgcmVxdWVzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1NldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1NldEFkZHJlc3NCcmVha3BvaW50UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGM2N2UzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TZXRBZGRyZXNzQnJlYWtwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBZGRyZXNzQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0OwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0IGV4dGVuZHMgQnJlYWtwb2ludFJlcXVlc3QgaW1wbGVtZW50cyBJUERJU2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0IHsKLQlwdWJsaWMgU2V0QWRkcmVzc0JyZWFrcG9pbnRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIElQRElBZGRyZXNzQnJlYWtwb2ludCBicHQsIGJvb2xlYW4gYWxsb3dVcGRhdGUpIHsKLQkJc3VwZXIodGFza3MsIGJwdCwgYWxsb3dVcGRhdGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIuc2V0QWRkcmVzc0JyZWFrcG9pbnQoZ2V0VGFza3MoKSwgKElQRElBZGRyZXNzQnJlYWtwb2ludClnZXRCcmVha3BvaW50KCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJTZXQgQWRkcmVzcyBCcmVha3BvaW50IFJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDZhNTIxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0OwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU2V0RnVuY3Rpb25CcmVha3BvaW50UmVxdWVzdCBleHRlbmRzIEJyZWFrcG9pbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESVNldEZ1bmN0aW9uQnJlYWtwb2ludFJlcXVlc3QgewotCXB1YmxpYyBTZXRGdW5jdGlvbkJyZWFrcG9pbnRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIElQRElGdW5jdGlvbkJyZWFrcG9pbnQgYnB0LCBib29sZWFuIGFsbG93VXBkYXRlKSB7Ci0JCXN1cGVyKHRhc2tzLCBicHQsIGFsbG93VXBkYXRlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnNldEZ1bmN0aW9uQnJlYWtwb2ludChnZXRUYXNrcygpLCAoSVBESUZ1bmN0aW9uQnJlYWtwb2ludClnZXRCcmVha3BvaW50KCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJTZXQgRnVuY3Rpb24gQnJlYWtwb2ludCBSZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU2V0TGluZUJyZWFrcG9pbnRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODg0MzcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1NldExpbmVCcmVha3BvaW50UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTZXRMaW5lQnJlYWtwb2ludFJlcXVlc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRMaW5lQnJlYWtwb2ludFJlcXVlc3QgZXh0ZW5kcyBCcmVha3BvaW50UmVxdWVzdCBpbXBsZW1lbnRzIElQRElTZXRMaW5lQnJlYWtwb2ludFJlcXVlc3QgewotCXB1YmxpYyBTZXRMaW5lQnJlYWtwb2ludFJlcXVlc3QoQml0TGlzdCB0YXNrcywgSVBESUxpbmVCcmVha3BvaW50IGJwdCwgYm9vbGVhbiBhbGxvd1VwZGF0ZSkgewotCQlzdXBlcih0YXNrcywgYnB0LCBhbGxvd1VwZGF0ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5zZXRMaW5lQnJlYWtwb2ludChnZXRUYXNrcygpLCAoSVBESUxpbmVCcmVha3BvaW50KWdldEJyZWFrcG9pbnQoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlNldCBMaW5lIEJyZWFrcG9pbnQgUmVxdWVzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1NldFdhdGNocG9pbnRSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU2V0V2F0Y2hwb2ludFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MmRiNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU2V0V2F0Y2hwb2ludFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTZXRXYXRjaHBvaW50UmVxdWVzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFNldFdhdGNocG9pbnRSZXF1ZXN0IGV4dGVuZHMgQnJlYWtwb2ludFJlcXVlc3QgaW1wbGVtZW50cyBJUERJU2V0V2F0Y2hwb2ludFJlcXVlc3QgewotCXB1YmxpYyBTZXRXYXRjaHBvaW50UmVxdWVzdChCaXRMaXN0IHRhc2tzLCBJUERJV2F0Y2hwb2ludCBicHQsIGJvb2xlYW4gYWxsb3dVcGRhdGUpIHsKLQkJc3VwZXIodGFza3MsIGJwdCwgYWxsb3dVcGRhdGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIuc2V0V2F0Y2hwb2ludChnZXRUYXNrcygpLCAoSVBESVdhdGNocG9pbnQpZ2V0QnJlYWtwb2ludCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiU2V0IExpbmUgQnJlYWtwb2ludCBSZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RhcnREZWJ1Z2dlclJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdGFydERlYnVnZ2VyUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQ0NjAzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdGFydERlYnVnZ2VyUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU3RhcnREZWJ1Z2dlclJlcXVlc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydERlYnVnZ2VyUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgSVBESVN0YXJ0RGVidWdnZXJSZXF1ZXN0IHsKLQlwcml2YXRlIFN0cmluZyBhcHA7Ci0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQlwcml2YXRlIFN0cmluZyBkaXI7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBhcmdzOwotCQotCXB1YmxpYyBTdGFydERlYnVnZ2VyUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBTdHJpbmcgYXBwLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncykgewotCQlzdXBlcih0YXNrcyk7Ci0JCXRoaXMuYXBwID0gYXBwOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLmRpciA9IGRpcjsKLQkJdGhpcy5hcmdzID0gYXJnczsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnN0YXJ0RGVidWdnZXIoYXBwLCBwYXRoLCBkaXIsIGFyZ3MpOwkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiU3RhcnQgZGVidWdnZXIgcmVxdWVzdCI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I2dldFJlc3BvbnNlQWN0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlc3BvbnNlQWN0aW9uKCkgewotICAgIAlyZXR1cm4gQUNUSU9OX1RFUk1JTkFURUQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I3N0b3JlUmVzdWx0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVSZXN1bHQoQml0TGlzdCByVGFza3MsIE9iamVjdCByZXN1bHQpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RlcEZpbmlzaFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdGVwRmluaXNoUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM3Yzc3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdGVwRmluaXNoUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU3RlcEZpbmlzaFJlcXVlc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwRmluaXNoUmVxdWVzdCBleHRlbmRzIFN0ZXBSZXF1ZXN0IGltcGxlbWVudHMgSVBESVN0ZXBGaW5pc2hSZXF1ZXN0IHsKLQlwdWJsaWMgU3RlcEZpbmlzaFJlcXVlc3QoQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB7Ci0JCXN1cGVyKHRhc2tzLCBjb3VudCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5zdGVwUmV0dXJuKHRhc2tzLCBjb3VudCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LlN0ZXBSZXF1ZXN0I2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbmlzaCgpIHRocm93cyBQRElFeGNlcHRpb24ge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJTdGVwIGZpbmlzaCByZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RlcEludG9SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RlcEludG9SZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGE4YjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1N0ZXBJbnRvUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU3RlcEludG9SZXF1ZXN0OwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RlcEludG9SZXF1ZXN0IGV4dGVuZHMgU3RlcFJlcXVlc3QgaW1wbGVtZW50cyBJUERJU3RlcEludG9SZXF1ZXN0IHsKLQlwdWJsaWMgU3RlcEludG9SZXF1ZXN0KEJpdExpc3QgdGFza3MpIHsKLQkJdGhpcyh0YXNrcywgMSk7Ci0JfQotCQotCXB1YmxpYyBTdGVwSW50b1JlcXVlc3QoQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB7Ci0JCXN1cGVyKHRhc2tzLCBjb3VudCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5zdGVwSW50byh0YXNrcywgY291bnQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5TdGVwUmVxdWVzdCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIHZvaWQgZG9GaW5pc2goKSB0aHJvd3MgUERJRXhjZXB0aW9uIHt9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUV2ZW50UmVxdWVzdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiU3RlcCBpbnRvIHJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdGVwT3ZlclJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdGVwT3ZlclJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1MDUzMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RlcE92ZXJSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdGVwT3ZlclJlcXVlc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwT3ZlclJlcXVlc3QgZXh0ZW5kcyBTdGVwUmVxdWVzdCBpbXBsZW1lbnRzIElQRElTdGVwT3ZlclJlcXVlc3QgewotCXB1YmxpYyBTdGVwT3ZlclJlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQl0aGlzKHRhc2tzLCAxKTsKLQl9Ci0JCi0JcHVibGljIFN0ZXBPdmVyUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHsKLQkJc3VwZXIodGFza3MsIGNvdW50KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9FeGVjdXRlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZG9FeGVjdXRlKElQRElEZWJ1Z2dlciBkZWJ1Z2dlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWRlYnVnZ2VyLnN0ZXBPdmVyKHRhc2tzLCBjb3VudCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LlN0ZXBSZXF1ZXN0I2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbmlzaCgpIHRocm93cyBQRElFeGNlcHRpb24ge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJTdGVwIG92ZXIgcmVxdWVzdCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1N0ZXBSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RlcFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxOTVjOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RlcFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdGVwUmVxdWVzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0ZXBSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlcXVlc3QgaW1wbGVtZW50cyBJUERJU3RlcFJlcXVlc3QgewotCXByb3RlY3RlZCBpbnQgY291bnQgPSAwOwotCQotCXB1YmxpYyBTdGVwUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHsKLQkJc3VwZXIodGFza3MpOwotCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbmlzaCgpIHRocm93cyBQRElFeGNlcHRpb24ge30KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdG9wRGVidWdnZXJSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvU3RvcERlYnVnZ2VyUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJhNDllLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdG9wRGVidWdnZXJSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdG9wRGVidWdnZXJSZXF1ZXN0OwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RvcERlYnVnZ2VyUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESVN0b3BEZWJ1Z2dlclJlcXVlc3QgewotCXB1YmxpYyBTdG9wRGVidWdnZXJSZXF1ZXN0KEJpdExpc3QgdGFza3MpIHsKLQkJc3VwZXIodGFza3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIuc3RvcERlYnVnZ2VyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbmlzaCgpIHRocm93cyBQRElFeGNlcHRpb24ge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRXZlbnRSZXF1ZXN0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJTdG9wIGRlYnVnZ2VyIHJlcXVlc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9TdXNwZW5kUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1N1c3BlbmRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjRlMWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvcGRpL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3BkaS9yZXF1ZXN0L1N1c3BlbmRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElIYWx0UmVxdWVzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFN1c3BlbmRSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RFdmVudFJlcXVlc3QgaW1wbGVtZW50cyBJUERJSGFsdFJlcXVlc3QgewotCXByaXZhdGUgYm9vbGVhbiBzZW5kRXZlbnQ7Ci0KLQlwdWJsaWMgU3VzcGVuZFJlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQl0aGlzKHRhc2tzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFN1c3BlbmRSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGJvb2xlYW4gc2VuZEV2ZW50KSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQkJdGhpcy5zZW5kRXZlbnQgPSBzZW5kRXZlbnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESURlYnVnZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZShJUERJRGVidWdnZXIgZGVidWdnZXIpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlkZWJ1Z2dlci5zdXNwZW5kKHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9GaW5pc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRmluaXNoKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlN1c3BlbmQgcmVxdWVzdCI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0I3NlbmRFdmVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2VuZEV2ZW50KCkgewotCQlyZXR1cm4gc2VuZEV2ZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9UZXJtaW5hdGVSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wZGkvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvcGRpL3JlcXVlc3QvVGVybWluYXRlUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRkZjllLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BkaS9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9wZGkvcmVxdWVzdC9UZXJtaW5hdGVSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElUZXJtaW5hdGVSZXF1ZXN0OwotCi0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVybWluYXRlUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0RXZlbnRSZXF1ZXN0IGltcGxlbWVudHMgSVBESVRlcm1pbmF0ZVJlcXVlc3QgewotCXB1YmxpYyBUZXJtaW5hdGVSZXF1ZXN0KEJpdExpc3QgdGFza3MpIHsKLQkJc3VwZXIodGFza3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVxdWVzdCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoSVBESURlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJZGVidWdnZXIudGVybWluYXRlKHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlcXVlc3QjZG9GaW5pc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRmluaXNoKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlRlcm1pbmF0ZSByZXF1ZXN0IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA5NDQwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBDbGVtZW50IENodQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIERlYnVnIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCi0KLWNvbnRhaW5lck5hbWUubWFwcGluZz1QYXRoIE1hcHBpbmcKLWNvbnRhaW5lckRlc2NyaXB0aW9uLm1hcHBpbmc9QSBwYXRoIG1hcHBpbmcuCi1jb250YWluZXJOYW1lLm1hcEVudHJ5PVBhdGggTWFwIEVudHJ5Ci1jb250YWluZXJEZXNjcmlwdGlvbi5tYXBFbnRyeT1BbiBlbnRyeSBpbiBhIHBhdGggbWFwcGluZy4KLWNvbnRhaW5lck5hbWUuZGlyZWN0b3J5PURpcmVjdG9yeQotY29udGFpbmVyRGVzY3JpcHRpb24uZGlyZWN0b3J5PUEgZGlyZWN0b3J5IGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotCi0KLVBMaW5lQnJlYWtwb2ludC5uYW1lPVBhcmFsbGVsIExpbmUgQnJlYWtwb2ludAotUEFkZHJlc3NCcmVha3BvaW50Lm5hbWU9UGFyYWxsZWwgQWRkcmVzcyBCcmVha3BvaW50Ci1QRnVuY3Rpb25CcmVha3BvaW50Lm5hbWU9UGFyYWxsZWwgRnVuY3Rpb24gQnJlYWtwb2ludAotUFdhdGNoQnJlYWtwb2ludC5uYW1lPVBhcmFsbGVsIFdhdGNoIEJyZWFrcG9pbnQKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BsdWdpbi54bWwgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmY2MTQ3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gPGV4dGVuc2lvbi1wb2ludCBpZD0icGFyYWxsZWxEZWJ1Z2dlcnMiIG5hbWU9IlBhcmFsbGVsIERlYnVnZ2VycyIgc2NoZW1hPSJzY2hlbWEvcGFyYWxsZWxEZWJ1Z2dlcnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icEJyZWFrcG9pbnRNYXJrZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgIDxzdXBlcgotICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmJyZWFrcG9pbnRNYXJrZXIiPgotICAgICA8L3N1cGVyPgotICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICB2YWx1ZT0iZmFsc2UiPgotICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuY29uZGl0aW9uIj4KLSAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuaWdub3JlQ291bnQiPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS50aHJlYWRJZCI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmluc3RhbGxDb3VudCI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZUhhbmRsZSI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmpvYmlkIj4KLSAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc2V0aWQiPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5jdXJzZXRpZCI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29tbW9uUExpbmVCcmVha3BvaW50TWFya2VyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICA8c3VwZXIKLSAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucEJyZWFrcG9pbnRNYXJrZXIiPgotICAgICA8L3N1cGVyPgotICAgICA8c3VwZXIKLSAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5saW5lQnJlYWtwb2ludE1hcmtlciI+Ci0gICAgIDwvc3VwZXI+Ci0gICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgIHZhbHVlPSJmYWxzZSI+Ci0gICAgIDwvcGVyc2lzdGVudD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InBMaW5lQnJlYWtwb2ludE1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgPHN1cGVyCi0gICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmNvbW1vblBMaW5lQnJlYWtwb2ludE1hcmtlciI+Ci0gICAgIDwvc3VwZXI+Ci0gICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgIHZhbHVlPSJmYWxzZSI+Ci0gICAgIDwvcGVyc2lzdGVudD4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5mdW5jdGlvbiI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmFkZHJlc3MiPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InBBZGRyZXNzQnJlYWtwb2ludE1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgPHN1cGVyCi0gICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmNvbW1vblBMaW5lQnJlYWtwb2ludE1hcmtlciI+Ci0gICAgIDwvc3VwZXI+Ci0gICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgIHZhbHVlPSJmYWxzZSI+Ci0gICAgIDwvcGVyc2lzdGVudD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InBGdW5jdGlvbkJyZWFrcG9pbnRNYXJrZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgIDxzdXBlcgotICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5jb21tb25QTGluZUJyZWFrcG9pbnRNYXJrZXIiPgotICAgICA8L3N1cGVyPgotICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICB2YWx1ZT0iZmFsc2UiPgotICAgICA8L3BlcnNpc3RlbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJwV2F0Y2hwb2ludE1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgPHN1cGVyCi0gICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBCcmVha3BvaW50TWFya2VyIj4KLSAgICAgPC9zdXBlcj4KLSAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgdmFsdWU9ImZhbHNlIj4KLSAgICAgPC9wZXJzaXN0ZW50PgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV4cHJlc3Npb24iPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS53cml0ZSI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnJlYWQiPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5icmVha3BvaW50cyI+Ci0gICAgICA8YnJlYWtwb2ludAotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucExpbmVCcmVha3BvaW50TWFya2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLmJyZWFrcG9pbnQuUExpbmVCcmVha3BvaW50IgotICAgICAgICAgICAgbmFtZT0iJVBMaW5lQnJlYWtwb2ludC5uYW1lIgotICAgICAgICAgICAgaWQ9InBMaW5lQnJlYWtwb2ludCI+Ci0gICAgICA8L2JyZWFrcG9pbnQ+Ci0gICAgICA8YnJlYWtwb2ludAotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucEFkZHJlc3NCcmVha3BvaW50TWFya2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLmJyZWFrcG9pbnQuUEFkZHJlc3NCcmVha3BvaW50IgotICAgICAgICAgICAgbmFtZT0iJVBBZGRyZXNzQnJlYWtwb2ludC5uYW1lIgotICAgICAgICAgICAgaWQ9InBBZGRyZXNzQnJlYWtwb2ludCI+Ci0gICAgICA8L2JyZWFrcG9pbnQ+Ci0gICAgICA8YnJlYWtwb2ludAotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucEZ1bmN0aW9uQnJlYWtwb2ludE1hcmtlciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5icmVha3BvaW50LlBGdW5jdGlvbkJyZWFrcG9pbnQiCi0gICAgICAgICAgICBuYW1lPSIlUEZ1bmN0aW9uQnJlYWtwb2ludC5uYW1lIgotICAgICAgICAgICAgaWQ9InBGdW5jdGlvbkJyZWFrcG9pbnQiPgotICAgICAgPC9icmVha3BvaW50PgotICAgICAgPGJyZWFrcG9pbnQKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBXYXRjaHBvaW50TWFya2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLmJyZWFrcG9pbnQuUFdhdGNocG9pbnQiCi0gICAgICAgICAgICBuYW1lPSIlUFdhdGNoQnJlYWtwb2ludC5uYW1lIgotICAgICAgICAgICAgaWQ9InBXYXRjaHBvaW50Ij4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlcnMiPgotCQk8c291cmNlUGF0aENvbXB1dGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlBTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZUxvY2F0b3JzIj4KLQkJPHNvdXJjZUxvY2F0b3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuUFNvdXJjZUxvb2t1cERpcmVjdG9yIgotCQkJbmFtZT0iUFRQIFNvdXJjZSBMb2NhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZUxvY2F0b3IiLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZUNvbnRhaW5lclR5cGVzIj4KLQkJPHNvdXJjZUNvbnRhaW5lclR5cGUKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuTWFwcGluZ1NvdXJjZUNvbnRhaW5lclR5cGUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbnRhaW5lckRlc2NyaXB0aW9uLm1hcHBpbmciCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuY29udGFpbmVyVHlwZS5tYXBwaW5nIgotCQkJbmFtZT0iJWNvbnRhaW5lck5hbWUubWFwcGluZyIvPgotCQk8c291cmNlQ29udGFpbmVyVHlwZQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5NYXBFbnRyeVNvdXJjZUNvbnRhaW5lclR5cGUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbnRhaW5lckRlc2NyaXB0aW9uLm1hcEVudHJ5IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmNvbnRhaW5lclR5cGUubWFwRW50cnkiCi0JCQluYW1lPSIlY29udGFpbmVyTmFtZS5tYXBFbnRyeSIvPgotCQk8c291cmNlQ29udGFpbmVyVHlwZQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5QRGlyZWN0b3J5U291cmNlQ29udGFpbmVyVHlwZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29udGFpbmVyRGVzY3JpcHRpb24uZGlyZWN0b3J5IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmNvbnRhaW5lclR5cGUuZGlyZWN0b3J5IgotCQkJbmFtZT0iJWNvbnRhaW5lck5hbWUuZGlyZWN0b3J5Ii8+Ci0gICAgICA8c291cmNlQ29udGFpbmVyVHlwZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5BYnNvbHV0ZVBhdGhTb3VyY2VDb250YWluZXJUeXBlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjb250YWluZXJEZXNjcmlwdGlvbi5hYnNvbHV0ZVBhdGgiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuY29udGFpbmVyVHlwZS5hYnNvbHV0ZVBhdGgiCi0gICAgICAgICAgICBuYW1lPSIlY29udGFpbmVyTmFtZS5hYnNvbHV0ZVBhdGgiLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zY2hlbWEvcGFyYWxsZWxEZWJ1Z2dlcnMuZXhzZCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NjaGVtYS9wYXJhbGxlbERlYnVnZ2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE2NDFiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NjaGVtYS9wYXJhbGxlbERlYnVnZ2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSIgaWQ9InBhcmFsbGVsRGVidWdnZXJzIiBuYW1lPSJQYXJhbGxlbCBEZWJ1Z2dlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHBsdWctaW5zIHRvIGNvbnRyaWJ1dGUgYSBwYXJhbGxlbCBkZWJ1Z2dlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVidWdnZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVidWdnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUERlYnVnZ2VyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjcHUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGxhdGZvcm0iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kZXMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9EZWJ1Z0NvcmVNZXNzYWdlcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0RlYnVnQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmU5N2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0RlYnVnQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRGVidWdDb3JlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5EZWJ1Z0NvcmVNZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgRGVidWdDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvRGVidWdDb3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9EZWJ1Z0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZkN2IyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9EZWJ1Z0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBUUERlYnVnQ29yZVBsdWdpbi4wPU5vIHN1Y2ggZGVidWdnZXIKLVBUUERlYnVnTW9kZWwuMD1VbmFibGUgdG8gc2V0IHRlbXBvcmFyeSBicmVha3BvaW50IGluIG1haW4uXG5SZWFzb246IHswfVxuQ29udGludWU/Ci1QQ0RJRGVidWdNb2RlbC4wPVVuYWJsZSB0byBwYXJzZXIgYmluYXJ5IGluZm9ybWF0aW9uIGZyb20gZmlsZQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0RlYnVnSm9iU3RvcmFnZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0RlYnVnSm9iU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhmNDYzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9EZWJ1Z0pvYlN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgRGVidWdKb2JTdG9yYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBEZWJ1Z0pvYlN0b3JhZ2U+IHN0b3JhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEZWJ1Z0pvYlN0b3JhZ2U+KCk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0b3JhZ2U+IGpvYk1hcDsKLQkKLQlwdWJsaWMgRGVidWdKb2JTdG9yYWdlKFN0cmluZyBuYW1lKSB7Ci0JCWpvYk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RvcmFnZT4oKTsKLQkJaWYgKGNvbnRhaW5zS2V5KG5hbWUpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2V5OiAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkLiIpOwotCi0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWFkZERlYnVnU3RvcmFnZSh0aGlzLm5hbWUsIHRoaXMpOwotCX0KLQlwdWJsaWMgdm9pZCBjbG9zZURlYnVnSm9iU3RvcmFnZSgpIHsKLQkJU3RvcmFnZVtdIHN0b3JhZ2VzID0gam9iTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IFN0b3JhZ2VbMF0pOwotCQlmb3IgKFN0b3JhZ2Ugc3QgOiBzdG9yYWdlcykgewotCQkJc3QuY2xlYW4oKTsKLQkJfQotCQlqb2JNYXAuY2xlYXIoKTsKLQkJcmVtb3ZlRGVidWdTdG9yYWdlKG5hbWUpOwotCX0KLQlwcml2YXRlIFN0b3JhZ2UgZ2V0Sm9iU3RvcmFnZShTdHJpbmcgam9iX2lkKSB7Ci0JCXN5bmNocm9uaXplZCAoam9iTWFwKSB7Ci0JCQlpZiAoIWpvYk1hcC5jb250YWluc0tleShqb2JfaWQpKSB7Ci0JCQkJam9iTWFwLnB1dChqb2JfaWQsIG5ldyBTdG9yYWdlKCkpOwotCQkJfQotCQkJcmV0dXJuIChTdG9yYWdlKWpvYk1hcC5nZXQoam9iX2lkKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2JTdG9yYWdlKFN0cmluZyBqb2JfaWQpIHsKLQkJc3luY2hyb25pemVkIChqb2JNYXApIHsKLQkJCVN0b3JhZ2Ugc3RvcmFnZSA9IChTdG9yYWdlKWpvYk1hcC5yZW1vdmUoam9iX2lkKTsKLQkJCWlmIChzdG9yYWdlICE9IG51bGwpIHsKLQkJCQlzdG9yYWdlLmNsZWFuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiBnZXRKb2JWYWx1ZUNvbGxlY3Rpb24oKSB7Ci0JCXN5bmNocm9uaXplZCAoam9iTWFwKSB7Ci0JCQlMaXN0PE9iamVjdD4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlmb3IgKFN0b3JhZ2Ugc3QgOiBqb2JNYXAudmFsdWVzKCkpIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKHN0LmdldFZhbHVlQ29sbGVjdGlvbigpKTsKLQkJCX0KLQkJCXJldHVybiB2YWx1ZXM7Ci0JCX0KLQl9Ci0JcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiBnZXRWYWx1ZUNvbGxlY3Rpb24oU3RyaW5nIGpvYl9pZCkgewotCQlzeW5jaHJvbml6ZWQgKGpvYk1hcCkgewotCQkJcmV0dXJuIGdldEpvYlN0b3JhZ2Uoam9iX2lkKS5nZXRWYWx1ZUNvbGxlY3Rpb24oKTsKLQkJfQotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBqb2JfaWQsIFN0cmluZyBrZXkpIHsKLQkJc3luY2hyb25pemVkIChqb2JNYXApIHsKLQkJCXJldHVybiBnZXRKb2JTdG9yYWdlKGpvYl9pZCkuZ2V0U3RvcmUoa2V5KTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgam9iX2lkLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJc3luY2hyb25pemVkIChqb2JNYXApIHsKLQkJCWdldEpvYlN0b3JhZ2Uoam9iX2lkKS5hZGRTdG9yZShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZVZhbHVlKFN0cmluZyBqb2JfaWQsIFN0cmluZyBrZXkpIHsKLQkJc3luY2hyb25pemVkIChqb2JNYXApIHsKLQkJCXJldHVybiBnZXRKb2JTdG9yYWdlKGpvYl9pZCkucmVtb3ZlU3RvcmUoa2V5KTsKLQkJfQotCX0KLQkvKioqKioqKioqKioKLQkgKiBTdG9yYWdlICoKLQkgKioqKioqKioqKiovCi0JY2xhc3MgU3RvcmFnZSB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gYU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQl2b2lkIGNsZWFuKCkgewotCQkJYU1hcC5jbGVhcigpOwotCQl9Ci0JCWJvb2xlYW4gY29udGFpbnNTdG9yZShTdHJpbmcga2V5KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFNYXApIHsKLQkJCQlyZXR1cm4gYU1hcC5jb250YWluc0tleShrZXkpOwotCQkJfQotCQl9Ci0JCXZvaWQgYWRkU3RvcmUoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFNYXApIHsKLQkJCQlhTWFwLnB1dChrZXksIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlPYmplY3QgcmVtb3ZlU3RvcmUoU3RyaW5nIGtleSkgewotCQkJc3luY2hyb25pemVkIChhTWFwKSB7Ci0JCQkJcmV0dXJuIGFNYXAucmVtb3ZlKGtleSk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IGdldFN0b3JlKFN0cmluZyBrZXkpIHsKLQkJCXN5bmNocm9uaXplZCAoYU1hcCkgewotCQkJCXJldHVybiBhTWFwLmdldChrZXkpOwotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBnZXRWYWx1ZUNvbGxlY3Rpb24oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFNYXApIHsKLQkJCQlyZXR1cm4gYU1hcC52YWx1ZXMoKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBnZXRLZXlzKCkgewotCQkJc3luY2hyb25pemVkIChhTWFwKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmdbXSlhTWFwLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIHN0YXRpYyBmdW5jdGlvbnMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcgbmFtZSkgewotCQlzeW5jaHJvbml6ZWQgKHN0b3JhZ2VzKSB7Ci0JCQlyZXR1cm4gc3RvcmFnZXMuY29udGFpbnNLZXkobmFtZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyBEZWJ1Z0pvYlN0b3JhZ2UgZ2V0RGVidWdTdG9yYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN5bmNocm9uaXplZCAoc3RvcmFnZXMpIHsKLQkJCXJldHVybiAoRGVidWdKb2JTdG9yYWdlKXN0b3JhZ2VzLmdldChuYW1lKTsKLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVidWdTdG9yYWdlKFN0cmluZyBuYW1lLCBEZWJ1Z0pvYlN0b3JhZ2Ugc3RvcmFnZSkgewotCQlzeW5jaHJvbml6ZWQgKHN0b3JhZ2VzKSB7Ci0JCQlzdG9yYWdlcy5wdXQobmFtZSwgc3RvcmFnZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyBEZWJ1Z0pvYlN0b3JhZ2VbXSBnZXREZWJ1Z1N0b3JhZ2VzKCkgewotCQlzeW5jaHJvbml6ZWQgKHN0b3JhZ2VzKSB7Ci0JCQlyZXR1cm4gKERlYnVnSm9iU3RvcmFnZVtdKXN0b3JhZ2VzLnZhbHVlcygpLnRvQXJyYXkobmV3IERlYnVnSm9iU3RvcmFnZVswXSk7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZURlYnVnU3RvcmFnZShTdHJpbmcgbmFtZSkgewotCQlzeW5jaHJvbml6ZWQgKHN0b3JhZ2VzKSB7Ci0JCQlEZWJ1Z0pvYlN0b3JhZ2Ugc3RvcmFnZSA9IChEZWJ1Z0pvYlN0b3JhZ2Upc3RvcmFnZXMucmVtb3ZlKG5hbWUpOwotCQkJaWYgKHN0b3JhZ2UgIT0gbnVsbCkgewotCQkJCXN0b3JhZ2UuY2xvc2VEZWJ1Z0pvYlN0b3JhZ2UoKTsKLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRGVidWdTdG9yYWdlcygpIHsKLQkJc3luY2hyb25pemVkIChzdG9yYWdlcykgewotCQkJRGVidWdKb2JTdG9yYWdlW10gZFN0b3JlYWdlcyA9IHN0b3JhZ2VzLnZhbHVlcygpLnRvQXJyYXkobmV3IERlYnVnSm9iU3RvcmFnZVswXSk7Ci0JCQlmb3IgKERlYnVnSm9iU3RvcmFnZSBkU3RvcmVhZ2UgOiBkU3RvcmVhZ2VzKSB7Ci0JCQkJZFN0b3JlYWdlLmNsb3NlRGVidWdKb2JTdG9yYWdlKCk7Ci0JCQl9Ci0JCQlzdG9yYWdlcy5jbGVhcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0V4dEZvcm1hdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0V4dEZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjFjMjZhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9FeHRGb3JtYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRXh0Rm9ybWF0IHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRVhBREVDSU1BTCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT0NUQUwgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJJTkFSWSA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVDSU1BTCA9IDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkFXID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOQVRVUkFMID0gNTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZMT0FUID0gMTA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUREUkVTUyA9IDExOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOU1RSVUNUSU9OID0gMTI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBUiA9IDEzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUUklORyA9IDE0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOU0lHTkVEID0gMTU7Ci0KLQlwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgZGVjb2RlQWRyZXNzKFN0cmluZyBidWZmZXIpIHsKLQkJaW50IHJhZGl4ID0gMTA7Ci0JCWludCBjdXJzb3IgPSAwOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGgoKTsKLQotCQlpZiAoKG9mZnNldCA9IGJ1ZmZlci5pbmRleE9mKCIweCIpKSAhPSAtMSB8fCAob2Zmc2V0ID0gYnVmZmVyLmluZGV4T2YoIjBYIikpICE9IC0xKSB7Ci0JCQlyYWRpeCA9IDE2OwotCQkJY3Vyc29yID0gb2Zmc2V0ICsgMjsKLQkJfQotCQl3aGlsZSAoY3Vyc29yIDwgbGVuICYmIENoYXJhY3Rlci5kaWdpdChidWZmZXIuY2hhckF0KGN1cnNvciksIHJhZGl4KSAhPSAtMSkgewotCQkJY3Vyc29yKys7Ci0JCX0KLQkJcmV0dXJuIGdldEJpZ0ludGVnZXIoYnVmZmVyLnN1YnN0cmluZyhvZmZzZXQsIGN1cnNvcikpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlcihTdHJpbmcgYWRkcmVzcykgewotCQlpbnQgaW5kZXggPSAwOwotCQlpbnQgcmFkaXggPSAxMDsKLQkJYm9vbGVhbiBuZWdhdGl2ZSA9IGZhbHNlOwotCi0JCS8vIEhhbmRsZSB6ZXJvIGxlbmd0aAotCQlhZGRyZXNzID0gYWRkcmVzcy50cmltKCk7Ci0JCWlmIChhZGRyZXNzLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBCaWdJbnRlZ2VyLlpFUk87Ci0JCX0KLQotCQkvLyBIYW5kbGUgbWludXMgc2lnbiwgaWYgcHJlc2VudAotCQlpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCItIikpIHsKLQkJCW5lZ2F0aXZlID0gdHJ1ZTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgiMHgiLCBpbmRleCkgfHwgYWRkcmVzcy5zdGFydHNXaXRoKCIwWCIsIGluZGV4KSkgewotCQkJaW5kZXggKz0gMjsKLQkJCXJhZGl4ID0gMTY7Ci0JCX0gZWxzZSBpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCIjIiwgaW5kZXgpKSB7Ci0JCQlpbmRleCArKzsKLQkJCXJhZGl4ID0gMTY7Ci0JCX0gZWxzZSBpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCIwIiwgaW5kZXgpICYmIGFkZHJlc3MubGVuZ3RoKCkgPiAxICsgaW5kZXgpIHsKLQkJCWluZGV4ICsrOwotCQkJcmFkaXggPSA4OwotCQl9Ci0KLQkJaWYgKGluZGV4ID4gMCkgewotCQkJYWRkcmVzcyA9IGFkZHJlc3Muc3Vic3RyaW5nKGluZGV4KTsKLQkJfQotCQlpZiAobmVnYXRpdmUpIHsKLQkJCWFkZHJlc3MgPSAiLSIgKyBhZGRyZXNzOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoYWRkcmVzcywgcmFkaXgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJLy8gV2hhdCBjYW4gd2UgZG8gPz8/Ci0JCX0KLQkJcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQQnJlYWtwb2ludE1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUEJyZWFrcG9pbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZjgxYWEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQQnJlYWtwb2ludE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJV2F0Y2hwb2ludDsKLQotcHVibGljIGludGVyZmFjZSBJUEJyZWFrcG9pbnRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRhc2tzIGFyZSBhZGRlZCB0byBhIHRhc2sgc2V0LiBUaGlzIGNhdXNlcyB0aGUgYnJlYWtwb2ludHMKLQkgKiB0byBiZSBzZXQgb24gdGhlIG5ldyB0YXNrcyBhbHNvLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrcyBuZXcgdGFza3MgYmVpbmcgYWRkZWQgdG8gdGhlIHNldAotCSAqIEBwYXJhbSBicmVha3BvaW50cyBicmVha3BvaW50cyB0aGF0IGFyZSB0byBiZSB1cGRhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2V0QnJlYWtwb2ludHMoQml0TGlzdCB0YXNrcywgSVBCcmVha3BvaW50W10gYnJlYWtwb2ludHMpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJyZWFrcG9pbnRzCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlU2V0QnJlYWtwb2ludHMoQml0TGlzdCB0YXNrcywgSVBCcmVha3BvaW50W10gYnJlYWtwb2ludHMpOwotCi0JLyoqCi0JICogQHBhcmFtIHBkaUJwdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUJyZWFrcG9pbnQgZ2V0QnJlYWtwb2ludChJUERJQnJlYWtwb2ludCBwZGlCcHQpOwotCi0JLyoqCi0JICogQHBhcmFtIGJyZWFrcG9pbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QnJlYWtwb2ludEFkZHJlc3MoSVBMaW5lQnJlYWtwb2ludCBicmVha3BvaW50KTsKLQotCS8qKgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2tpcEJyZWFrcG9pbnRzKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcGRpV2F0Y2hwb2ludAotCSAqLwotCXB1YmxpYyB2b2lkIHdhdGNocG9pbnRPdXRPZlNjb3BlKEJpdExpc3QgdGFza3MsIElQRElXYXRjaHBvaW50IHBkaVdhdGNocG9pbnQpOwotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBEZWJ1Z0NvbmZpZ3VyYXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUERlYnVnQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIyMThhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUERlYnVnQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQRGVidWdDb25maWd1cmF0aW9uIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDUFVfTkFUSVZFID0gIm5hdGl2ZSI7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvcmVGaWxlRXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDUFVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRGVidWdnZXIgZ2V0RGVidWdnZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE1vZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybSgpOwotCi0JLyoqCi0JICogQHBhcmFtIGNwdQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NQVShTdHJpbmcgY3B1KTsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTW9kZShTdHJpbmcgbW9kZSk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBEZWJ1Z0NvbnN0YW50cy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQRGVidWdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MGYyZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBEZWJ1Z0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotLyoqCi0gKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgUFRQIGRlYnVnIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBEZWJ1Z0NvbnN0YW50cyB7Ci0JLyoqCi0JICogU3RhdHVzIGhhbmRsZXIgY29kZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfUVVFU1RJT04gPSAxMDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9JTkZPID0gMTAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfRVJST1IgPSAxMDAwMjsKLQotCS8qKgotCSAqIFN0cmluZyBwcmVmZXJlbmNlIGZvciB0aGUgY29tbW9uIHNvdXJjZSBjb250YWluZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ09NTU9OX1NPVVJDRV9DT05UQUlORVJTID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIucERlYnVnLmNvbW1vbl9zb3VyY2VfY29udGFpbmVycyI7Ci0JCi0JLyoqCi0JICogQy9DKysgZGVidWcgcGx1Zy1pbiBpZGVudGlmaWVyICh2YWx1ZQotCSAqIDxjb2RlPiJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlZmF1bHQgdmFyaWFibGUgZm9ybWF0IHRvIHVzZSBpbiB0aGUgdmFyaWFibGVzIHZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0RFRkFVTFRfVkFSSUFCTEVfRk9STUFUID0gUExVR0lOX0lEICsgInBEZWJ1Zy5kZWZhdWx0X3ZhcmlhYmxlX2Zvcm1hdCI7Ci0JCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBmb3JtYXQgdG8gdXNlIGluIHRoZSBleHByZXNzaW9ucyB2aWV3cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9FWFBSRVNTSU9OX0ZPUk1BVCA9IFBMVUdJTl9JRCArICJwRGVidWcuZGVmYXVsdF9leHByZXNzaW9uX2Zvcm1hdCI7Ci0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29tbW9uIHNvdXJjZSBsb2NhdGlvbnMgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU09VUkNFX0xPQ0FUSU9OUyA9IFBMVUdJTl9JRCArICJwRGVidWcuU291cmNlLnNvdXJjZV9sb2NhdGlvbnMiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0hPV19GVUxMX1BBVEhTID0gUExVR0lOX0lEICsgIi5wRGVidWcuc2hvd19mdWxsX3BhdGhzIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUFRQX0RFQlVHR0VSID0gUExVR0lOX0lEICsgIi5wRGVidWcuZGVidWdnZXJzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BUUF9ERUJVR19DT01NX1RJTUVPVVQgPSBQTFVHSU5fSUQgKyAiLnBEZWJ1Zy50aW1lb3V0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUFRQX0RFQlVHX1JFR0lTVEVSX1BST0NfMCA9IFBMVUdJTl9JRCArICIucERlYnVnLnJlZ1BybzAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9ERUJVR0dFUl9UWVBFID0gUExVR0lOX0lEICsgIi5wRGVidWcuZGVmYXVsdERlYnVnZ2VyIjsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERUJVR19DT01NX1RJTUVPVVQgPSA2MDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fUkVRVUVTVF9USU1FT1VUID0gMTAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFUVVFU1RfVElNRU9VVCA9IEludGVnZXIuTUFYX1ZBTFVFOwkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVVBEQVRFX1ZBUklBQkxFU19PTl9TVVNQRU5EID0gUExVR0lOX0lEICsgIi5wRGVidWcudXBkYXRlX3ZhcmlhYmxlc19vbl9zdXNwZW5kIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1VQREFURV9WQVJJQUJMRVNfT05fQ0hBTkdFID0gUExVR0lOX0lEICsgIi5wRGVidWcudXBkYXRlX3ZhcmlhYmxlc19vbl9jaGFuZ2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTlNUUlVDVElPTl9TVEVQX01PREVfT04gPSBQTFVHSU5fSUQgKyAicERlYnVnLkRpc2Fzc2VtYmx5Lmluc3RydWN0aW9uU3RlcE9uIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0RFRkFVTFRfUkVHSVNURVJfRk9STUFUID0gUExVR0lOX0lEICsgInBEZWJ1Zy5kZWZhdWx0X3JlZ2lzdGVyX2Zvcm1hdCI7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUERlYnVnRXZlbnRMaXN0ZW5lci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQRGVidWdFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGQ2YjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQRGVidWdFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0V2ZW50OwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRGVidWdFdmVudExpc3RlbmVyIHsKLQkvKioKLQkgKiBIYW5kbGUgZGVidWcgZXZlbnQKLQkgKiBAcGFyYW0gZXZlbnQgSVBEZWJ1Z0V2ZW50Ci0JICovCi0Jdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50KElQRGVidWdFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBEZWJ1Z2dlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQRGVidWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwZmNkZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBEZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOiBRTlggU29mdHdhcmUgU3lzdGVtcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubGF1bmNoLklQTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLQotcHVibGljIGludGVyZmFjZSBJUERlYnVnZ2VyIHsKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZGVidWdnZXIgc2Vzc2lvbi4KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSBjb3JlZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbiBjcmVhdGVEZWJ1Z1Nlc3Npb24obG9uZyB0aW1lb3V0LCBJUExhdW5jaCBsYXVuY2gsIElQYXRoIGNvcmVmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGRlYnVnZ2VyLiBUaGlzIGRvZXMgd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHRvIGdldCB0aGUgZGVidWdnZXIgcmVhZHkKLQkgKiB0byBzdGFydCBkZWJ1Z2dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24uIFRoZSBhdHRyTWdyIGFyZ3VtZW50IGNhbiBzdXBwbHkgYXR0cmlidXRlcwotCSAqIGZyb20gYSBwcmV2aW91c2x5IHN1Ym1pdHRlZCBqb2IgdGhhdCBtYXkgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBkZWJ1ZyBzZXNzaW9uLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gZGVidWdnZXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gYXR0ck1nciBhdHRyaWJ1dGUgbWFuYWdlciBjb250YWluaW5nIGF0dHJpYnV0ZXMgZm9yIGxhdW5jaAotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGRlYnVnZ2VyIGNhbm5vdCBiZSBpbml0aWFsaXplZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNpbmcgdGhlIHN1cHBsaWVkIElMYXVuY2hDb25maWd1cmF0aW9uLCBhZGQgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgdG8gYXR0ck1ncgotCSAqIG5lZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBzdWJtaXRKb2IgY29tbWFuZCB0byBsYXVuY2ggdGhlIGFwcGxpY2F0aW9uIHVuZGVyIGRlYnVnZ2VyIGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGRlYnVnIHNlc3Npb24KLQkgKiBAcGFyYW0gYXR0ck1nciBhdHRyaWJ1dGUgbWFuYWdlciBjb250YWluaW5nIGF0dHJpYnV0ZXMgZm9yIGxhdW5jaAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGdldExhdW5jaEF0dHJpYnV0ZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyLCBJUExhdW5jaCBsYXVuY2gpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQTWVtb3J5TWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQTWVtb3J5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTkxNjhkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUE1lbW9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tSZXRyaWV2YWxFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z1RhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIGdyZWcKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBNZW1vcnlNYW5hZ2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKEJpdExpc3QgcVRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gc3RhcnRBZGRyZXNzCi0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElNZW1vcnlCbG9jayBnZXRNZW1vcnlCbG9jayhCaXRMaXN0IHFUYXNrcywgbG9uZyBzdGFydEFkZHJlc3MsIGxvbmcgbGVuZ3RoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJTWVtb3J5QmxvY2tSZXRyaWV2YWxFeHRlbnNpb24gZ2V0TWVtb3J5UmV0cmlldmFsKEJpdExpc3QgcVRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gZGVidWdUYXJnZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEJpdExpc3QgcVRhc2tzLCBQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQpOwotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoQml0TGlzdCBxVGFza3MpOwotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBSZWdpc3Rlck1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFJlZ2lzdGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzk5NDRlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFJlZ2lzdGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3Rlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFBlcnNpc3RhYmxlUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBTdGFja0ZyYW1lOwotCi0vKioKLSAqIEBhdXRob3IgZ3JlZwotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUFJlZ2lzdGVyTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWdpc3Rlckdyb3VwKGZpbmFsIEJpdExpc3QgcVRhc2tzLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgSVBSZWdpc3RlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBSZWdpc3RlckRlc2NyaXB0b3JbXSBnZXRBbGxSZWdpc3RlckRlc2NyaXB0b3JzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUFN0YWNrRnJhbWUgZ2V0Q3VycmVudEZyYW1lKEJpdExpc3QgcVRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUmVnaXN0ZXJHcm91cFtdIGdldFJlZ2lzdGVyR3JvdXBzKEJpdExpc3QgcVRhc2tzLCBQU3RhY2tGcmFtZSBmcmFtZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEBwYXJhbSBkZWJ1Z1RhcmdldAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQml0TGlzdCBxVGFza3MsIFBEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHBhcmFtIGdyb3VwCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5UmVnaXN0ZXJHcm91cChmaW5hbCBCaXRMaXN0IHFUYXNrcywgZmluYWwgSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAgZ3JvdXAsCi0JCQlmaW5hbCBJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gZ3JvdXBzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVnaXN0ZXJHcm91cHMoZmluYWwgQml0TGlzdCBxVGFza3MsIGZpbmFsIElSZWdpc3Rlckdyb3VwW10gZ3JvdXBzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdHMoZmluYWwgQml0TGlzdCBxVGFza3MpOwotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN1c3BlbmRlZChCaXRMaXN0IHFUYXNrcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFNlc3Npb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4NGNlZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubGF1bmNoLklQTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQU2Vzc2lvbiBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGFwcAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIGN3ZAotCSAqIEBwYXJhbSBhcmdzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdFRvRGVidWdnZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgYXBwLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGN3ZCwgU3RyaW5nW10gYXJncykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcmVmcmVzaAotCSAqIEBwYXJhbSByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZURlYnVnVGFyZ2V0KEJpdExpc3QgdGFza3MsIGJvb2xlYW4gcmVmcmVzaCwgYm9vbGVhbiByZWdpc3Rlcik7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHJlZnJlc2gKLQkgKiBAcGFyYW0gcmVnaXN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEZWJ1Z1RhcmdldChCaXRMaXN0IHRhc2tzLCBib29sZWFuIHJlZnJlc2gsIGJvb2xlYW4gcmVnaXN0ZXIpOwotCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lzdGVyCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGVidWdUYXJnZXRzKGJvb2xlYW4gcmVnaXN0ZXIpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERlYnVnVGFyZ2V0IGZpbmREZWJ1Z1RhcmdldChCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjaGFuZ2UKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgZmlyZURlYnVnRXZlbnQoaW50IGNoYW5nZSwgaW50IGJyZWFrcG9pbnQsIElQRGVidWdJbmZvIGluZm8pOwotCi0JLyoqCi0JICogQHBhcmFtIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VTdG9wcGVkRGVidWdnZXIoUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUgc3RhdGUpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUEJyZWFrcG9pbnRNYW5hZ2VyIGdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRGVidWdJbmZvIGdldERlYnVnSW5mbyhCaXRMaXN0IHRhc2tzKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQSm9iIGdldEpvYigpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBMYXVuY2ggZ2V0TGF1bmNoKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUE1lbW9yeU1hbmFnZXIgZ2V0TWVtb3J5TWFuYWdlcigpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbiBnZXRQRElTZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBSZWdpc3Rlck1hbmFnZXIgZ2V0UmVnaXN0ZXJNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQU2V0TWFuYWdlciBnZXRTZXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQU2lnbmFsTWFuYWdlciBnZXRTaWduYWxNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcyhpbnQgaWQpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWR5KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcmVmcmVzaAotCSAqIEBwYXJhbSByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9hZERlYnVnVGFyZ2V0cyhCaXRMaXN0IHRhc2tzLCBib29sZWFuIHJlZnJlc2gsIGJvb2xlYW4gcmVnaXN0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQU2V0TWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL0lQU2V0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWM1MzMyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFNldE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGdyZWcKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBTZXRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzaWQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrcyhTdHJpbmcgc2lkLCBCaXRMaXN0IHRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzaWQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZXQoU3RyaW5nIHNpZCwgQml0TGlzdCB0YXNrcyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2lkCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlU2V0cyhTdHJpbmcgc2lkKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoU3RyaW5nIHNpZCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2lkCi0JICogQHBhcmFtIHRhc2tzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFza3MoU3RyaW5nIHNpZCwgQml0TGlzdCB0YXNrcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFNpZ25hbE1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9JUFNpZ25hbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5YTdhMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvSVBTaWduYWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbDsKLQotLyoqCi0gKiBAYXV0aG9yIGdyZWcKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBTaWduYWxNYW5hZ2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKEJpdExpc3QgcVRhc2tzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUFNpZ25hbFtdIGdldFNpZ25hbHMoQml0TGlzdCBxVGFza3MpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gcGRpU2lnbmFsCi0JICovCi0JcHVibGljIHZvaWQgc2lnbmFsQ2hhbmdlZChCaXRMaXN0IHFUYXNrcywgSVBESVNpZ25hbCBwZGlTaWduYWwpOwotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvUERlYnVnTW9kZWwuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9QRGVidWdNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmM0Y2NiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9QRGVidWdNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5JUERlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuUERlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuUERlYnVnUmVnaXN0ZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmxhdW5jaC5JUExhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEFkZHJlc3NCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLlBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLlBTZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5icmVha3BvaW50LlBBZGRyZXNzQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5icmVha3BvaW50LlBGdW5jdGlvbkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuYnJlYWtwb2ludC5QTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuYnJlYWtwb2ludC5QV2F0Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QRGVidWdUYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQRGVidWdNb2RlbCB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBzb3VyY2VIYW5kbGUKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHBhcmFtIGlnbm9yZUNvdW50Ci0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSByZWdpc3RlcgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gam9iX2lkCi0JICogQHBhcmFtIGpvYk5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUEFkZHJlc3NCcmVha3BvaW50IGNyZWF0ZUFkZHJlc3NCcmVha3BvaW50KFN0cmluZyBtb2R1bGUsIFN0cmluZyBzb3VyY2VIYW5kbGUsIElSZXNvdXJjZSByZXNvdXJjZSwgQmlnSW50ZWdlciBhZGRyZXNzLCBib29sZWFuIGVuYWJsZWQsIGludCBpZ25vcmVDb3VudCwgU3RyaW5nIGNvbmRpdGlvbiwgYm9vbGVhbiByZWdpc3RlciwgU3RyaW5nIHNldF9pZCwgU3RyaW5nIGpvYl9pZCwgU3RyaW5nIGpvYk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUFkZHJlc3NCcmVha3BvaW50KG1vZHVsZSwgc291cmNlSGFuZGxlLCByZXNvdXJjZSwgLTEsIGFkZHJlc3MsIGVuYWJsZWQsIGlnbm9yZUNvdW50LCBjb25kaXRpb24sIHJlZ2lzdGVyLCBzZXRfaWQsIGpvYl9pZCwgam9iTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gc291cmNlSGFuZGxlCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHBhcmFtIGlnbm9yZUNvdW50Ci0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSByZWdpc3RlcgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gam9iX2lkCi0JICogQHBhcmFtIGpvYk5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUEFkZHJlc3NCcmVha3BvaW50IGNyZWF0ZUFkZHJlc3NCcmVha3BvaW50KFN0cmluZyBtb2R1bGUsIFN0cmluZyBzb3VyY2VIYW5kbGUsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGxpbmVOdW1iZXIsIEJpZ0ludGVnZXIgYWRkcmVzcywgYm9vbGVhbiBlbmFibGVkLCBpbnQgaWdub3JlQ291bnQsIFN0cmluZyBjb25kaXRpb24sIGJvb2xlYW4gcmVnaXN0ZXIsIFN0cmluZyBzZXRfaWQsIFN0cmluZyBqb2JfaWQsIFN0cmluZyBqb2JOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMTApOwotCQlhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5JRCwgZ2V0UGx1Z2luSWRlbnRpZmllcigpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcigtMSkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcigtMSkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihsaW5lTnVtYmVyKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElCcmVha3BvaW50LkVOQUJMRUQsIEJvb2xlYW4udmFsdWVPZihlbmFibGVkKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElQTGluZUJyZWFrcG9pbnQuQUREUkVTUywgYWRkcmVzcy50b1N0cmluZygxMCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuU09VUkNFX0hBTkRMRSwgc291cmNlSGFuZGxlKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LklHTk9SRV9DT1VOVCwgbmV3IEludGVnZXIoaWdub3JlQ291bnQpKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkNPTkRJVElPTiwgY29uZGl0aW9uKTsKLQkJLy9hdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuTU9EVUxFLCBtb2R1bGUpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuU0VUX0lELCBzZXRfaWQpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuQ1VSX1NFVF9JRCwgc2V0X2lkKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkpPQl9JRCwgam9iX2lkKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkpPQl9OQU1FLCBqb2JOYW1lKTsKLQkJcmV0dXJuIG5ldyBQQWRkcmVzc0JyZWFrcG9pbnQocmVzb3VyY2UsIGF0dHJpYnV0ZXMsIHJlZ2lzdGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZUhhbmRsZQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBmdW5jdGlvbgotCSAqIEBwYXJhbSBjaGFyU3RhcnQKLQkgKiBAcGFyYW0gY2hhckVuZAotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiBAcGFyYW0gaWdub3JlQ291bnQKLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIHJlZ2lzdGVyCi0JICogQHBhcmFtIHNldF9pZAotCSAqIEBwYXJhbSBqb2JfaWQKLQkgKiBAcGFyYW0gam9iTmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQRnVuY3Rpb25CcmVha3BvaW50IGNyZWF0ZUZ1bmN0aW9uQnJlYWtwb2ludChTdHJpbmcgc291cmNlSGFuZGxlLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBmdW5jdGlvbiwgaW50IGNoYXJTdGFydCwgaW50IGNoYXJFbmQsIGludCBsaW5lTnVtYmVyLCBib29sZWFuIGVuYWJsZWQsIGludCBpZ25vcmVDb3VudCwgU3RyaW5nIGNvbmRpdGlvbiwgYm9vbGVhbiByZWdpc3RlciwgU3RyaW5nIHNldF9pZCwgU3RyaW5nIGpvYl9pZCwgU3RyaW5nIGpvYk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigxMCk7Ci0JCWF0dHJpYnV0ZXMucHV0KElCcmVha3BvaW50LklELCBnZXRQbHVnaW5JZGVudGlmaWVyKCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKGNoYXJTdGFydCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihjaGFyRW5kKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGxpbmVOdW1iZXIpKTsKLQkJYXR0cmlidXRlcy5wdXQoSUJyZWFrcG9pbnQuRU5BQkxFRCwgQm9vbGVhbi52YWx1ZU9mKGVuYWJsZWQpKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBMaW5lQnJlYWtwb2ludC5GVU5DVElPTiwgZnVuY3Rpb24pOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuU09VUkNFX0hBTkRMRSwgc291cmNlSGFuZGxlKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LklHTk9SRV9DT1VOVCwgbmV3IEludGVnZXIoaWdub3JlQ291bnQpKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkNPTkRJVElPTiwgY29uZGl0aW9uKTsKLQkJcmV0dXJuIG5ldyBQRnVuY3Rpb25CcmVha3BvaW50KHJlc291cmNlLCBhdHRyaWJ1dGVzLCByZWdpc3Rlcik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2VIYW5kbGUKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gbGluZU51bWJlcgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHBhcmFtIGlnbm9yZUNvdW50Ci0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSByZWdpc3RlcgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gam9iCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBMaW5lQnJlYWtwb2ludCBjcmVhdGVMaW5lQnJlYWtwb2ludChTdHJpbmcgc291cmNlSGFuZGxlLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBsaW5lTnVtYmVyLCBib29sZWFuIGVuYWJsZWQsIGludCBpZ25vcmVDb3VudCwgU3RyaW5nIGNvbmRpdGlvbiwgYm9vbGVhbiByZWdpc3RlciwgU3RyaW5nIHNldF9pZCwgSVBKb2Igam9iKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBqb2JfaWQgPSBJUEJyZWFrcG9pbnQuR0xPQkFMOwotCQlTdHJpbmcgam9iTmFtZSA9IElQQnJlYWtwb2ludC5HTE9CQUw7Ci0JCWlmIChqb2IgIT0gbnVsbCAmJiAham9iLmlzVGVybWluYXRlZCgpKSB7Ci0JCQlJUFNlc3Npb24gc2Vzc2lvbiA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWJ1Z01vZGVsKCkuZ2V0U2Vzc2lvbihqb2IpOwotCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgewotCQkJCWpvYl9pZCA9IGpvYi5nZXRJRCgpOwotCQkJCWpvYk5hbWUgPSBqb2IuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCUhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMTApOwotCQlhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5JRCwgZ2V0UGx1Z2luSWRlbnRpZmllcigpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobGluZU51bWJlcikpOwotCQlhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5FTkFCTEVELCBuZXcgQm9vbGVhbihlbmFibGVkKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElQQnJlYWtwb2ludC5TT1VSQ0VfSEFORExFLCBzb3VyY2VIYW5kbGUpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuSUdOT1JFX0NPVU5ULCBuZXcgSW50ZWdlcihpZ25vcmVDb3VudCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuQ09ORElUSU9OLCBjb25kaXRpb24pOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuU0VUX0lELCBzZXRfaWQpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuQ1VSX1NFVF9JRCwgc2V0X2lkKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkpPQl9JRCwgam9iX2lkKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkpPQl9OQU1FLCBqb2JOYW1lKTsKLQkJcmV0dXJuIG5ldyBQTGluZUJyZWFrcG9pbnQocmVzb3VyY2UsIGF0dHJpYnV0ZXMsIHJlZ2lzdGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZUhhbmRsZQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSB3cml0ZUFjY2VzcwotCSAqIEBwYXJhbSByZWFkQWNjZXNzCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqIEBwYXJhbSBpZ25vcmVDb3VudAotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiBAcGFyYW0gcmVnaXN0ZXIKLQkgKiBAcGFyYW0gc2V0X2lkCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBqb2JOYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBXYXRjaHBvaW50IGNyZWF0ZVdhdGNocG9pbnQoU3RyaW5nIHNvdXJjZUhhbmRsZSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHdyaXRlQWNjZXNzLCBib29sZWFuIHJlYWRBY2Nlc3MsIFN0cmluZyBleHByZXNzaW9uLCBib29sZWFuIGVuYWJsZWQsIGludCBpZ25vcmVDb3VudCwgU3RyaW5nIGNvbmRpdGlvbiwgYm9vbGVhbiByZWdpc3RlciwgU3RyaW5nIHNldF9pZCwgU3RyaW5nIGpvYl9pZCwgU3RyaW5nIGpvYk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigxMCk7Ci0JCWF0dHJpYnV0ZXMucHV0KElCcmVha3BvaW50LklELCBnZXRQbHVnaW5JZGVudGlmaWVyKCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5FTkFCTEVELCBCb29sZWFuLnZhbHVlT2YoZW5hYmxlZCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuU09VUkNFX0hBTkRMRSwgc291cmNlSGFuZGxlKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LklHTk9SRV9DT1VOVCwgbmV3IEludGVnZXIoaWdub3JlQ291bnQpKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBCcmVha3BvaW50LkNPTkRJVElPTiwgY29uZGl0aW9uKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBXYXRjaHBvaW50LkVYUFJFU1NJT04sIGV4cHJlc3Npb24gKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBXYXRjaHBvaW50LlJFQUQsIEJvb2xlYW4udmFsdWVPZihyZWFkQWNjZXNzKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElQV2F0Y2hwb2ludC5XUklURSwgQm9vbGVhbi52YWx1ZU9mKHdyaXRlQWNjZXNzKSk7Ci0JCXJldHVybiBuZXcgUFdhdGNocG9pbnQocmVzb3VyY2UsIGF0dHJpYnV0ZXMsIHJlZ2lzdGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZUhhbmRsZQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBjaGFyU3RhcnQKLQkgKiBAcGFyYW0gY2hhckVuZAotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogQHBhcmFtIHdyaXRlQWNjZXNzCi0JICogQHBhcmFtIHJlYWRBY2Nlc3MKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogQHBhcmFtIGlnbm9yZUNvdW50Ci0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSByZWdpc3RlcgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gam9iX2lkCi0JICogQHBhcmFtIGpvYk5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUFdhdGNocG9pbnQgY3JlYXRlV2F0Y2hwb2ludChTdHJpbmcgc291cmNlSGFuZGxlLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBjaGFyU3RhcnQsIGludCBjaGFyRW5kLCBpbnQgbGluZU51bWJlciwgYm9vbGVhbiB3cml0ZUFjY2VzcywgYm9vbGVhbiByZWFkQWNjZXNzLCBTdHJpbmcgZXhwcmVzc2lvbiwgYm9vbGVhbiBlbmFibGVkLCBpbnQgaWdub3JlQ291bnQsIFN0cmluZyBjb25kaXRpb24sIGJvb2xlYW4gcmVnaXN0ZXIsIFN0cmluZyBzZXRfaWQsIFN0cmluZyBqb2JfaWQsIFN0cmluZyBqb2JOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMTApOwotCQlhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5JRCwgZ2V0UGx1Z2luSWRlbnRpZmllcigpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihjaGFyU3RhcnQpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoY2hhckVuZCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihsaW5lTnVtYmVyKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElCcmVha3BvaW50LkVOQUJMRUQsIEJvb2xlYW4udmFsdWVPZihlbmFibGVkKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElQQnJlYWtwb2ludC5TT1VSQ0VfSEFORExFLCBzb3VyY2VIYW5kbGUpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuSUdOT1JFX0NPVU5ULCBuZXcgSW50ZWdlcihpZ25vcmVDb3VudCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJUEJyZWFrcG9pbnQuQ09ORElUSU9OLCBjb25kaXRpb24pOwotCQlhdHRyaWJ1dGVzLnB1dChJUFdhdGNocG9pbnQuRVhQUkVTU0lPTiwgZXhwcmVzc2lvbiApOwotCQlhdHRyaWJ1dGVzLnB1dChJUFdhdGNocG9pbnQuUkVBRCwgQm9vbGVhbi52YWx1ZU9mKHJlYWRBY2Nlc3MpKTsKLQkJYXR0cmlidXRlcy5wdXQoSVBXYXRjaHBvaW50LldSSVRFLCBCb29sZWFuLnZhbHVlT2Yod3JpdGVBY2Nlc3MpKTsKLQkJcmV0dXJuIG5ldyBQV2F0Y2hwb2ludChyZXNvdXJjZSwgYXR0cmlidXRlcywgcmVnaXN0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gam9iX2lkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVBCcmVha3BvaW50KGZpbmFsIFN0cmluZyBqb2JfaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBmaW5kUEJyZWFrcG9pbnRzKGpvYl9pZCwgZmFsc2UpOwotCQlpZiAoYnJlYWtwb2ludHMubGVuZ3RoID4gMCkKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUEJyZWFrcG9pbnQoZmluYWwgU3RyaW5nIGpvYl9pZCwgZmluYWwgU3RyaW5nIHNldF9pZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUEJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IGZpbmRQQnJlYWtwb2ludHMoam9iX2lkLCBzZXRfaWQpOwotCQlpZiAoYnJlYWtwb2ludHMubGVuZ3RoID4gMCkKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCB0cnVlKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gam9iX2lkCi0JICogQHBhcmFtIGluY2x1ZGVHbG9iYWwKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUEJyZWFrcG9pbnRbXSBmaW5kUEJyZWFrcG9pbnRzKFN0cmluZyBqb2JfaWQsIGJvb2xlYW4gaW5jbHVkZUdsb2JhbCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PElQQnJlYWtwb2ludD4gYnB0TGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBCcmVha3BvaW50PigpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZ2V0UEJyZWFrcG9pbnRzKCk7Ci0JCWZvciAoSUJyZWFrcG9pbnQgYnB0IDogYnJlYWtwb2ludHMpIHsKLQkJCWlmICghKGJwdCBpbnN0YW5jZW9mIElQQnJlYWtwb2ludCkpCi0JCQkJY29udGludWU7Ci0JCQlJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IChJUEJyZWFrcG9pbnQpIGJwdDsKLQkJCVN0cmluZyBicF9qb2JfaWQgPSBicmVha3BvaW50LmdldEpvYklkKCk7Ci0JCQlpZiAoYnBfam9iX2lkLmVxdWFscyhqb2JfaWQpIHx8IChpbmNsdWRlR2xvYmFsICYmIGJwX2pvYl9pZC5lcXVhbHMoSVBCcmVha3BvaW50LkdMT0JBTCkpKSB7Ci0JCQkJYnB0TGlzdC5hZGQoYnJlYWtwb2ludCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUEJyZWFrcG9pbnRbXSkgYnB0TGlzdC50b0FycmF5KG5ldyBJUEJyZWFrcG9pbnRbYnB0TGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUEJyZWFrcG9pbnRbXSBmaW5kUEJyZWFrcG9pbnRzKFN0cmluZyBqb2JfaWQsIFN0cmluZyBzZXRfaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdDxJUEJyZWFrcG9pbnQ+IGJwdExpc3QgPSBuZXcgQXJyYXlMaXN0PElQQnJlYWtwb2ludD4oKTsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IGdldFBCcmVha3BvaW50cygpOwotCQlmb3IgKElCcmVha3BvaW50IGJwdCA6IGJyZWFrcG9pbnRzKSB7Ci0JCQlpZiAoIShicHQgaW5zdGFuY2VvZiBJUEJyZWFrcG9pbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJSVBCcmVha3BvaW50IGJyZWFrcG9pbnQgPSAoSVBCcmVha3BvaW50KSBicHQ7Ci0JCQlpZiAoYnJlYWtwb2ludC5nZXRKb2JJZCgpLmVxdWFscyhqb2JfaWQpICYmIGJyZWFrcG9pbnQuZ2V0U2V0SWQoKS5lcXVhbHMoc2V0X2lkKSkgewotCQkJCWJwdExpc3QuYWRkKGJyZWFrcG9pbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVBCcmVha3BvaW50W10pIGJwdExpc3QudG9BcnJheShuZXcgSVBCcmVha3BvaW50WzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZUhhbmRsZQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBmdW5jdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQRnVuY3Rpb25CcmVha3BvaW50W10gZnVuY3Rpb25CcmVha3BvaW50RXhpc3RzKFN0cmluZyBzb3VyY2VIYW5kbGUsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGZ1bmN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBnZXRQQnJlYWtwb2ludHMoKTsKLQkJTGlzdDxJQnJlYWtwb2ludD4gZm91bmRCcmVha3BvaW50cyA9IG5ldyBBcnJheUxpc3Q8SUJyZWFrcG9pbnQ+KDApOwotCQlTdHJpbmcgbWFya2VyVHlwZSA9IFBGdW5jdGlvbkJyZWFrcG9pbnQuZ2V0TWFya2VyVHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShicmVha3BvaW50c1tpXSBpbnN0YW5jZW9mIElQRnVuY3Rpb25CcmVha3BvaW50KSkKLQkJCQljb250aW51ZTsKLQkJCUlQRnVuY3Rpb25CcmVha3BvaW50IGJyZWFrcG9pbnQgPSAoSVBGdW5jdGlvbkJyZWFrcG9pbnQpIGJyZWFrcG9pbnRzW2ldOwotCQkJaWYgKGJyZWFrcG9pbnQuZ2V0TWFya2VyKCkuZ2V0VHlwZSgpLmVxdWFscyhtYXJrZXJUeXBlKSkgewotCQkJCWlmIChzYW1lU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSwgYnJlYWtwb2ludC5nZXRTb3VyY2VIYW5kbGUoKSkpIHsKLQkJCQkJaWYgKGJyZWFrcG9pbnQuZ2V0TWFya2VyKCkuZ2V0UmVzb3VyY2UoKS5lcXVhbHMocmVzb3VyY2UpKSB7Ci0JCQkJCQlpZiAoYnJlYWtwb2ludC5nZXRGdW5jdGlvbigpICE9IG51bGwgJiYgYnJlYWtwb2ludC5nZXRGdW5jdGlvbigpLmVxdWFscyhmdW5jdGlvbikpIHsKLQkJCQkJCQlmb3VuZEJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRCcmVha3BvaW50cy50b0FycmF5KG5ldyBJUEZ1bmN0aW9uQnJlYWtwb2ludFswXSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElCcmVha3BvaW50W10gZ2V0UEJyZWFrcG9pbnRzKCkgewotCQlyZXR1cm4gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZ2V0QnJlYWtwb2ludHMoZ2V0UGx1Z2luSWRlbnRpZmllcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYnJlYWtwb2ludHMKLQkgKiBAcGFyYW0gam9iCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBMaW5lQnJlYWtwb2ludCBsaW5lQnJlYWtwb2ludEV4aXN0cyhJUExpbmVCcmVha3BvaW50W10gYnJlYWtwb2ludHMsIElQSm9iIGpvYikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyByZW1vdmUgZ2xvYmFsIGJyZWFrcG9pbnQgb3IgdGhlIGJyZWFrcG9pbnQgc2FtZSBhcyBqb2IgaWQgZ2l2ZW4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGJwdF9qb2JfaWQgPSBicmVha3BvaW50c1tpXS5nZXRKb2JJZCgpOwotCQkJaWYgKGJwdF9qb2JfaWQuZXF1YWxzKElQQnJlYWtwb2ludC5HTE9CQUwpIHx8IChqb2IgIT0gbnVsbCAmJiBicHRfam9iX2lkLmVxdWFscyhqb2IuZ2V0SUQoKSkpKQotCQkJCXJldHVybiBicmVha3BvaW50c1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZUhhbmRsZQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBMaW5lQnJlYWtwb2ludFtdIGxpbmVCcmVha3BvaW50c0V4aXN0cyhTdHJpbmcgc291cmNlSGFuZGxlLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBsaW5lTnVtYmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBnZXRQQnJlYWtwb2ludHMoKTsKLQkJTGlzdDxJQnJlYWtwb2ludD4gZm91bmRCcmVha3BvaW50cyA9IG5ldyBBcnJheUxpc3Q8SUJyZWFrcG9pbnQ+KDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShicmVha3BvaW50c1tpXSBpbnN0YW5jZW9mIElQTGluZUJyZWFrcG9pbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJSVBMaW5lQnJlYWtwb2ludCBicmVha3BvaW50ID0gKElQTGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnRzW2ldOwotCQkJaWYgKHNhbWVTb3VyY2VIYW5kbGUoc291cmNlSGFuZGxlLCBicmVha3BvaW50LmdldFNvdXJjZUhhbmRsZSgpKSkgewotCQkJCWlmIChicmVha3BvaW50LmdldE1hcmtlcigpLmdldFJlc291cmNlKCkuZXF1YWxzKHJlc291cmNlKSkgewotCQkJCQlpZiAoYnJlYWtwb2ludC5nZXRMaW5lTnVtYmVyKCkgPT0gbGluZU51bWJlcikgewotCQkJCQkJZm91bmRCcmVha3BvaW50cy5hZGQoYnJlYWtwb2ludCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kQnJlYWtwb2ludHMudG9BcnJheShuZXcgSVBMaW5lQnJlYWtwb2ludFswXSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQQnJlYWtwb2ludHMoU3RyaW5nIHNldF9pZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZ2V0UEJyZWFrcG9pbnRzKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiVXBkYXRpbmcgcGFyYWxsZWwgYnJlYWtwb2ludC4uLiIsIGJyZWFrcG9pbnRzLmxlbmd0aCk7Ci0JCQlmb3IgKElCcmVha3BvaW50IGJwdCA6IGJyZWFrcG9pbnRzKSB7Ci0JCQkJaWYgKCEoYnB0IGluc3RhbmNlb2YgSVBCcmVha3BvaW50KSkKLQkJCQkJY29udGludWU7Ci0JCQkJKChJUEJyZWFrcG9pbnQpIGJwdCkuc2V0Q3VyU2V0SWQoc2V0X2lkKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2VIYW5kbGUKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQV2F0Y2hwb2ludFtdIHdhdGNocG9pbnRFeGlzdHMoU3RyaW5nIHNvdXJjZUhhbmRsZSwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZ2V0UEJyZWFrcG9pbnRzKCk7Ci0JCUxpc3Q8SUJyZWFrcG9pbnQ+IGZvdW5kQnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0PElCcmVha3BvaW50PigwKTsKLQkJU3RyaW5nIG1hcmtlclR5cGUgPSBQV2F0Y2hwb2ludC5nZXRNYXJrZXJUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghKGJyZWFrcG9pbnRzW2ldIGluc3RhbmNlb2YgSVBXYXRjaHBvaW50KSkKLQkJCQljb250aW51ZTsKLQkJCUlQV2F0Y2hwb2ludCBicmVha3BvaW50ID0gKElQV2F0Y2hwb2ludCkgYnJlYWtwb2ludHNbaV07Ci0JCQlpZiAoYnJlYWtwb2ludC5nZXRNYXJrZXIoKS5nZXRUeXBlKCkuZXF1YWxzKG1hcmtlclR5cGUpKSB7Ci0JCQkJaWYgKHNhbWVTb3VyY2VIYW5kbGUoc291cmNlSGFuZGxlLCBicmVha3BvaW50LmdldFNvdXJjZUhhbmRsZSgpKSkgewotCQkJCQlpZiAoYnJlYWtwb2ludC5nZXRNYXJrZXIoKS5nZXRSZXNvdXJjZSgpLmVxdWFscyhyZXNvdXJjZSkpIHsKLQkJCQkJCWlmIChicmVha3BvaW50LmdldEV4cHJlc3Npb24oKS5lcXVhbHMoZXhwcmVzc2lvbikpIHsKLQkJCQkJCQlmb3VuZEJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRCcmVha3BvaW50cy50b0FycmF5KG5ldyBJUFdhdGNocG9pbnRbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaGFuZGxlMQotCSAqIEBwYXJhbSBoYW5kbGUyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2FtZVNvdXJjZUhhbmRsZShTdHJpbmcgaGFuZGxlMSwgU3RyaW5nIGhhbmRsZTIpIHsKLQkJaWYgKGhhbmRsZTEgPT0gbnVsbCB8fCBoYW5kbGUyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlQYXRoIHBhdGgxID0gbmV3IFBhdGgoaGFuZGxlMSk7Ci0JCUlQYXRoIHBhdGgyID0gbmV3IFBhdGgoaGFuZGxlMik7Ci0JCWlmIChwYXRoMS5pc1ZhbGlkUGF0aChoYW5kbGUxKSAmJiBwYXRoMi5pc1ZhbGlkUGF0aChoYW5kbGUyKSkKLQkJCXJldHVybiBwYXRoMS5lcXVhbHMocGF0aDIpOwotCQlyZXR1cm4gaGFuZGxlMS5lcXVhbHMoaGFuZGxlMik7Ci0JfQotCQotCXByaXZhdGUgUFNlc3Npb25NYW5hZ2VyIHNlc3Npb25NZ3IgPSBuZXcgUFNlc3Npb25NYW5hZ2VyKCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBwZGlUYXJnZXRzCi0JICogQHBhcmFtIHJlZnJlc2gKLQkgKiBAcGFyYW0gcmVzdW1lVGFyZ2V0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTmV3RGVidWdUYXJnZXRzKGZpbmFsIElQTGF1bmNoIGxhdW5jaCwgZmluYWwgQml0TGlzdCB0YXNrcywgZmluYWwgSVBESVRhcmdldFtdIHBkaVRhcmdldHMsIGZpbmFsIGJvb2xlYW4gcmVmcmVzaCwgZmluYWwgYm9vbGVhbiByZXN1bWVUYXJnZXQpIHsKLQkJV29ya3NwYWNlSm9iIGFKb2IgPSBuZXcgV29ya3NwYWNlSm9iKCJDcmVhdGluZyBuZXcgZGVidWcgdGFyZ2V0cy4uLiIpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWJvb2xlYW4gYWxsb3dUZXJtaW5hdGUgPSB0cnVlOwotCQkJCWJvb2xlYW4gYWxsb3dEaXNjb25uZWN0ID0gZmFsc2U7Ci0JCQkJSVBTZXNzaW9uIHNlc3Npb24gPSBnZXRTZXNzaW9uKGxhdW5jaC5nZXRQSm9iKCkpOwotCQkJCWlmIChzZXNzaW9uID09IG51bGwpCi0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQlmb3IgKElQRElUYXJnZXQgcGRpVGFyZ2V0OiBwZGlUYXJnZXRzKSB7Ci0JCQkJCUlQRGVidWdUYXJnZXQgdGFyZ2V0ID0gbmV3IFBEZWJ1Z1RhcmdldChzZXNzaW9uLCBwZGlUYXJnZXQsIGFsbG93VGVybWluYXRlLCBhbGxvd0Rpc2Nvbm5lY3QpOwotCQkJCQlpZiAocmVzdW1lVGFyZ2V0KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLnJlc3VtZSh0YXJnZXQuZ2V0VGFza3MoKSwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlsYXVuY2guYWRkRGVidWdUYXJnZXQodGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZmlyZVJlZ2lzdGVyRXZlbnQobGF1bmNoLmdldFBKb2IoKSwgdGFza3MsIHJlZnJlc2gpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlhSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJYUpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgbmV3IHRhc2tzIHRvIGEgdGFzayBzZXQKLQkgKiAKLQkgKiBAcGFyYW0gc2Vzc2lvbiBjdXJyZW50IGRlYnVnIHNlc3Npb24KLQkgKiBAcGFyYW0gc2V0X2lkIElEIG9mIHRoZSBzZXQgdG8gYWRkIHRoZSB0YXNrcyB0bwotCSAqIEBwYXJhbSB0YXNrcyB0YXNrcyB0byBhZGQgdG8gdGhlIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tzKElQU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc2V0X2lkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCUJpdExpc3QgY3VyU2V0VGFza3MgPSBnZXRUYXNrcyhzZXNzaW9uLCBzZXRfaWQpOwotCQlzZXNzaW9uLmdldFNldE1hbmFnZXIoKS5hZGRUYXNrcyhzZXRfaWQsIHRhc2tzKTsKLQkJdGFza3MuYW5kTm90KGN1clNldFRhc2tzKTsKLQkJdHJ5IHsKLQkJCUlQQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZmluZFBCcmVha3BvaW50cyhzZXNzaW9uLmdldEpvYigpLmdldElEKCksIHNldF9pZCk7Ci0JCQlzZXNzaW9uLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuYWRkU2V0QnJlYWtwb2ludHModGFza3MsIGJyZWFrcG9pbnRzKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHBhcmFtIGRlYnVnZ2VyCi0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvcmVGaWxlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUFNlc3Npb24gY3JlYXRlRGVidWdTZXNzaW9uKElQRGVidWdnZXIgZGVidWdnZXIsIElQTGF1bmNoIGxhdW5jaCwgSVByb2plY3QgcHJvamVjdCwgSVBhdGggY29yZUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9uZyB0aW1lb3V0ID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldExvbmcoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1BUUF9ERUJVR19DT01NX1RJTUVPVVQpOwotCQlJUERJU2Vzc2lvbiBwZGlTZXNzaW9uID0gZGVidWdnZXIuY3JlYXRlRGVidWdTZXNzaW9uKHRpbWVvdXQsIGxhdW5jaCwgY29yZUZpbGUpOwotCQlJUFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBQU2Vzc2lvbihwZGlTZXNzaW9uLCBsYXVuY2gsIHByb2plY3QpOwotCQlzZXNzaW9uTWdyLmFkZFNlc3Npb24obGF1bmNoLmdldFBKb2IoKSwgc2Vzc2lvbik7Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZXQoSVBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXRfaWQsIEJpdExpc3QgdGFza3MpIHsKLQkJc2Vzc2lvbi5nZXRTZXRNYW5hZ2VyKCkuY3JlYXRlU2V0KHNldF9pZCwgdGFza3MpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVTZXQoSVBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXRfaWQpIHsKLQkJdHJ5IHsKLQkJCVBEZWJ1Z01vZGVsLmRlbGV0ZVBCcmVha3BvaW50KHNlc3Npb24uZ2V0Sm9iKCkuZ2V0SUQoKSwgc2V0X2lkKTsJCQkKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCS8vbXVzdCBkZWxldGUgYnJlYWtwb2ludCBhbmQgdGhlbiBkZWxldGUgc2V0Ci0JCXNlc3Npb24uZ2V0U2V0TWFuYWdlcigpLmRlbGV0ZVNldHMoc2V0X2lkKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpvYgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSByZWZyZXNoCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVJlZ2lzdGVyRXZlbnQoSVBKb2Igam9iLCBCaXRMaXN0IHRhc2tzLCBib29sZWFuIHJlZnJlc2gpIHsKLQkJaWYgKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbihqb2IpOwotCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgewotCQkJCUlQRGVidWdJbmZvIGluZm8gPSBuZXcgUERlYnVnUmVnaXN0ZXJJbmZvKGpvYiwgdGFza3MsIG51bGwsIG51bGwsIHJlZnJlc2gpOwotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZmlyZURlYnVnRXZlbnQobmV3IFBEZWJ1Z0V2ZW50KHNlc3Npb24sIElQRGVidWdFdmVudC5DUkVBVEUsIElQRGVidWdFdmVudC5SRUdJU1RFUiwgaW5mbykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqb2IKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcmVmcmVzaAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVVbnJlZ2lzdGVyRXZlbnQoSVBKb2Igam9iLCBCaXRMaXN0IHRhc2tzLCBib29sZWFuIHJlZnJlc2gpIHsKLQkJaWYgKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbihqb2IpOwotCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgewotCQkJCUlQRGVidWdJbmZvIGluZm8gPSBuZXcgUERlYnVnUmVnaXN0ZXJJbmZvKGpvYiwgdGFza3MsIG51bGwsIG51bGwsIHJlZnJlc2gpOwotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZmlyZURlYnVnRXZlbnQobmV3IFBEZWJ1Z0V2ZW50KHNlc3Npb24sIElQRGVidWdFdmVudC5URVJNSU5BVEUsIElQRGVidWdFdmVudC5SRUdJU1RFUiwgaW5mbykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqb2IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQU2Vzc2lvbiBnZXRTZXNzaW9uKElQSm9iIGpvYikgewotCQlyZXR1cm4gc2Vzc2lvbk1nci5nZXRTZXNzaW9uKGpvYik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHNldF9pZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcyhJUFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNldF9pZCkgewotCQlCaXRMaXN0IHRhc2tzID0gc2Vzc2lvbi5nZXRTZXRNYW5hZ2VyKCkuZ2V0VGFza3Moc2V0X2lkKTsKLQkJaWYgKHRhc2tzICE9IG51bGwpCi0JCQlyZXR1cm4gdGFza3MuY29weSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSByZWZyZXNoCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVidWdUYXJnZXQoZmluYWwgSVBMYXVuY2ggbGF1bmNoLCBmaW5hbCBCaXRMaXN0IHRhc2tzLCBmaW5hbCBib29sZWFuIHJlZnJlc2gpIHsKLQkJV29ya3NwYWNlSm9iIGFKb2IgPSBuZXcgV29ya3NwYWNlSm9iKCJSZW1vdmluZyB0aGUgZGVidWcgdGFyZ2V0cy4uLiIpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWludFtdIHRhc2tBcnJheSA9IHRhc2tzLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCB0YXNrIDogdGFza0FycmF5KSB7Ci0JCQkJCUlQRGVidWdUYXJnZXQgdGFyZ2V0ID0gbGF1bmNoLmdldERlYnVnVGFyZ2V0KHRhc2spOwotCQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCXRhcmdldC5kaXNwb3NlKCk7Ci0JCQkJCQlsYXVuY2gucmVtb3ZlRGVidWdUYXJnZXQodGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaXJlVW5yZWdpc3RlckV2ZW50KGxhdW5jaC5nZXRQSm9iKCksIHRhc2tzLCByZWZyZXNoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJYUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWFKb2Iuc2NoZWR1bGUoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2Vzc2lvbgotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrcyhJUFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNldF9pZCwgQml0TGlzdCB0YXNrcykgewotCQlCaXRMaXN0IGN1clNldFRhc2tzID0gZ2V0VGFza3Moc2Vzc2lvbiwgc2V0X2lkKTsKLQkJc2Vzc2lvbi5nZXRTZXRNYW5hZ2VyKCkucmVtb3ZlVGFza3Moc2V0X2lkLCB0YXNrcyk7Ci0JCXRhc2tzLmFuZChjdXJTZXRUYXNrcyk7Ci0JCXRyeSB7Ci0JCQlJUEJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IGZpbmRQQnJlYWtwb2ludHMoc2Vzc2lvbi5nZXRKb2IoKS5nZXRJRCgpLCBzZXRfaWQpOwotCQkJc2Vzc2lvbi5nZXRCcmVha3BvaW50TWFuYWdlcigpLmRlbGV0ZVNldEJyZWFrcG9pbnRzKHRhc2tzLCBicmVha3BvaW50cyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJZm9yIChJUFNlc3Npb24gc2Vzc2lvbiA6IHNlc3Npb25NZ3IuZ2V0U2Vzc2lvbnMoKSkgewotCQkJc2h1dGRvd25uU2Vzc2lvbihzZXNzaW9uKTsKLQkJfQotCQlzZXNzaW9uTWdyLnNodXRkb3duKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd25uU2Vzc2lvbihJUFNlc3Npb24gc2Vzc2lvbikgewotCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGV0ZVBCcmVha3BvaW50KHNlc3Npb24uZ2V0Sm9iKCkuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJCXNlc3Npb24uZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93blNlc3Npb24oSVBKb2Igam9iKSB7Ci0JCWlmIChqb2IgIT0gbnVsbCkgewotCQkJc2h1dGRvd25uU2Vzc2lvbihnZXRTZXNzaW9uKGpvYikpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL1BEZWJ1Z1V0aWxzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvUERlYnVnVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNmFkZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvUERlYnVnVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUERlYnVnVXRpbHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50bG4oU3RyaW5nIG1zZykgewotCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHF1ZXN0aW9uKElTdGF0dXMgc3RhdHVzLCBPYmplY3Qgc291cmNlKSB7Ci0JCUJvb2xlYW4gcmVzdWx0ID0gQm9vbGVhbi5GQUxTRTsKLQkJSVN0YXR1c0hhbmRsZXIgaGFuZGxlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0dXNIYW5kbGVyKHN0YXR1cyk7Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gKEJvb2xlYW4paGFuZGxlci5oYW5kbGVTdGF0dXMoc3RhdHVzLCBzb3VyY2UpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKElTdGF0dXMgc3RhdHVzLCBPYmplY3Qgc291cmNlKSB7Ci0JCUlTdGF0dXNIYW5kbGVyIGhhbmRsZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdHVzSGFuZGxlcihzdGF0dXMpOwotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWhhbmRsZXIuaGFuZGxlU3RhdHVzKHN0YXR1cywgc291cmNlKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbmZvKElTdGF0dXMgc3RhdHVzLCBPYmplY3Qgc291cmNlKSB7Ci0JCUlTdGF0dXNIYW5kbGVyIGhhbmRsZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdHVzSGFuZGxlcihzdGF0dXMpOwotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWhhbmRsZXIuaGFuZGxlU3RhdHVzKHN0YXR1cywgc291cmNlKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQkKLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRCeXRlVGV4dChieXRlIGIpIHsKLQkJcmV0dXJuIG5ldyBjaGFyW117IGNoYXJGcm9tQnl0ZSgoYnl0ZSkoKGIgPj4+IDQpICYgMHgwZikpLCBjaGFyRnJvbUJ5dGUoKGJ5dGUpKGIgJiAweDBmKSkgfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGUgdGV4dFRvQnl0ZShjaGFyW10gdGV4dCkgewotCQlieXRlIHJlc3VsdCA9IDA7Ci0JCWlmICh0ZXh0Lmxlbmd0aCA9PSAyKSB7Ci0JCQlieXRlW10gYnl0ZXMgPSB7IGNoYXJUb0J5dGUodGV4dFswXSksIGNoYXJUb0J5dGUodGV4dFsxXSkgfTsKLQkJCXJlc3VsdCA9IChieXRlKSgoYnl0ZXNbMF0gPDwgNCkgKyBieXRlc1sxXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNoYXIgY2hhckZyb21CeXRlKGJ5dGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID49IDB4MCAmJiB2YWx1ZSA8PSAweDkpCi0JCQlyZXR1cm4gKGNoYXIpKHZhbHVlICsgJzAnKTsKLQkJaWYgKHZhbHVlID49IDB4YSAmJiB2YWx1ZSA8PSAweGYpCi0JCQlyZXR1cm4gKGNoYXIpKHZhbHVlIC0gMHhhICsgJ2EnKTsKLQkJcmV0dXJuICcwJzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGUgY2hhclRvQnl0ZShjaGFyIGNoKSB7Ci0JCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjaCkpIHsKLQkJCXJldHVybiAoYnl0ZSkoY2ggLSAnMCcpOwotCQl9Ci0JCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0JCQlyZXR1cm4gKGJ5dGUpKDB4YSArIGNoIC0gJ2EnKTsKLQkJfQotCQlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotCQkJcmV0dXJuIChieXRlKSgweGEgKyBjaCAtICdBJyk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyIGJ5dGVzVG9DaGFyKGJ5dGVbXSBieXRlcykgewotCQl0cnkgewotCQkJcmV0dXJuIChjaGFyKVNob3J0LnBhcnNlU2hvcnQobmV3IFN0cmluZyhieXRlcyksIDE2KTsKLQkJfQotCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGUgdG9CeXRlKGNoYXJbXSBieXRlcywgYm9vbGVhbiBsZSkgewotCQlpZiAoYnl0ZXMubGVuZ3RoICE9IDIpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIChieXRlKUxvbmcucGFyc2VMb25nKGJ5dGVzVG9TdHJpbmcoYnl0ZXMsIGxlLCB0cnVlKSwgMTYpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgc2hvcnQgdG9VbnNpZ25lZEJ5dGUoY2hhcltdIGJ5dGVzLCBib29sZWFuIGxlKSB7Ci0JCWlmIChieXRlcy5sZW5ndGggIT0gMikKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gKHNob3J0KUxvbmcucGFyc2VMb25nKGJ5dGVzVG9TdHJpbmcoYnl0ZXMsIGxlLCBmYWxzZSksIDE2KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHNob3J0IHRvU2hvcnQoY2hhcltdIGJ5dGVzLCBib29sZWFuIGxlKSB7Ci0JCWlmIChieXRlcy5sZW5ndGggIT0gNCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gKHNob3J0KUxvbmcucGFyc2VMb25nKGJ5dGVzVG9TdHJpbmcoYnl0ZXMsIGxlLCB0cnVlKSwgMTYpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IHRvVW5zaWduZWRTaG9ydChjaGFyW10gYnl0ZXMsIGJvb2xlYW4gbGUpIHsKLQkJaWYgKGJ5dGVzLmxlbmd0aCAhPSA0KQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAoaW50KUxvbmcucGFyc2VMb25nKGJ5dGVzVG9TdHJpbmcoYnl0ZXMsIGxlLCBmYWxzZSksIDE2KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCB0b0ludChjaGFyW10gYnl0ZXMsIGJvb2xlYW4gbGUpIHsKLQkJaWYgKGJ5dGVzLmxlbmd0aCAhPSA4KQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAoaW50KUxvbmcucGFyc2VMb25nKGJ5dGVzVG9TdHJpbmcoYnl0ZXMsIGxlLCB0cnVlKSwgMTYpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgbG9uZyB0b1Vuc2lnbmVkSW50KGNoYXJbXSBieXRlcywgYm9vbGVhbiBsZSkgewotCQlpZiAoYnl0ZXMubGVuZ3RoICE9IDgpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIExvbmcucGFyc2VMb25nKGJ5dGVzVG9TdHJpbmcoYnl0ZXMsIGxlLCBmYWxzZSksIDE2KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnl0ZXNUb1N0cmluZyhjaGFyW10gYnl0ZXMsIGJvb2xlYW4gbGUsIGJvb2xlYW4gc2lnbmVkKSB7Ci0JCWNoYXJbXSBjb3B5ID0gbmV3IGNoYXJbYnl0ZXMubGVuZ3RoXTsKLQkJaWYgKGxlKSB7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoIC8gMjsgKytpKSB7Ci0JCQkJY29weVsyICogaV0gPSBieXRlc1tieXRlcy5sZW5ndGggLSAyICogaSAtIDJdOwotCQkJCWNvcHlbMiAqIGkgKyAxXSA9IGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDIgKiBpIC0gMV07Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29weSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlcGVuZFN0cmluZyhTdHJpbmcgdGV4dCwgaW50IGxlbmd0aCwgY2hhciBjaCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQodGV4dC5zdWJzdHJpbmcoMCwgbGVuZ3RoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyW10gcHJlZml4ID0gbmV3IGNoYXJbbGVuZ3RoIC0gdGV4dC5sZW5ndGgoKV07Ci0JCQlBcnJheXMuZmlsbChwcmVmaXgsIGNoKTsKLQkJCXNiLmFwcGVuZChwcmVmaXgpOwotCQkJc2IuYXBwZW5kKHRleHQpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIExpc3Q8SVByb2plY3Q+IGdldFJlZmVyZW5jZWRQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFycmF5TGlzdDxJUHJvamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KDEwKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCUlQcm9qZWN0W10gcmVmcyA9IG5ldyBJUHJvamVjdFswXTsKLQkJCXRyeSB7Ci0JCQkJcmVmcyA9IHByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWZvcihpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKCFwcm9qZWN0LmVxdWFscyhyZWZzW2ldKSAmJiByZWZzW2ldICE9IG51bGwgJiYgcmVmc1tpXS5leGlzdHMoKSAmJiByZWZzW2ldLmlzT3BlbigpKSB7Ci0JCQkJCWxpc3QuYWRkKHJlZnNbaV0pOwotCQkJCQlnZXRSZWZlcmVuY2VkUHJvamVjdHMocHJvamVjdCwgcmVmc1tpXSwgbGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldFJlZmVyZW5jZWRQcm9qZWN0cyhJUHJvamVjdCByb290LCBJUHJvamVjdCBwcm9qZWN0LCBMaXN0PElQcm9qZWN0PiBsaXN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlJUHJvamVjdFtdIHJlZnMgPSBuZXcgSVByb2plY3RbMF07Ci0JCQl0cnkgewotCQkJCXJlZnMgPSBwcm9qZWN0LmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7ICsraSkgewotCQkJCWlmICghbGlzdC5jb250YWlucyhyZWZzW2ldKSAmJiByZWZzW2ldICE9IG51bGwgJiYgIXJlZnNbaV0uZXF1YWxzKHJvb3QpICYmIHJlZnNbaV0uZXhpc3RzKCkgJiYgcmVmc1tpXS5pc09wZW4oKSkgewotCQkJCQlsaXN0LmFkZChyZWZzW2ldKTsKLQkJCQkJZ2V0UmVmZXJlbmNlZFByb2plY3RzKHJvb3QsIHJlZnNbaV0sIGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkUHJvamVjdChJUHJvamVjdCBwYXJlbnQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5leGlzdHMoKSkgewotCQkJTGlzdDxJUHJvamVjdD4gcHJvamVjdHMgPSBQRGVidWdVdGlscy5nZXRSZWZlcmVuY2VkUHJvamVjdHMocHJvamVjdCk7Ci0JCQlJdGVyYXRvcjxJUHJvamVjdD4gaXQgPSBwcm9qZWN0cy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVByb2plY3QgcHJqID0gKElQcm9qZWN0KWl0Lm5leHQoKTsKLQkJCQlpZiAocHJqLmV4aXN0cygpICYmIChwcmouZXF1YWxzKHByb2plY3QpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBTZXJpYWxpemVzIGEgWE1MIGRvY3VtZW50IGludG8gYSBzdHJpbmcgLSBlbmNvZGVkIGluIFVURjggZm9ybWF0LCB3aXRoIHBsYXRmb3JtIGxpbmUgc2VwYXJhdG9ycy4KLQkgKiBAcGFyYW0gZG9jIGRvY3VtZW50IHRvIHNlcmlhbGl6ZQotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotCQlTdHJlYW1SZXN1bHQgb3V0cHV0VGFyZ2V0ID0gbmV3IFN0cmVhbVJlc3VsdChzKTsKLQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgb3V0cHV0VGFyZ2V0KTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoIlVURjgiKTsJCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QWRkcmVzc1NpemUoKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXRPU0FyY2goKS5lbmRzV2l0aCgiNjQiKSkKLQkJCXJldHVybiA4OwotCQlyZXR1cm4gNDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9QVFBEZWJ1Z0NvcmVQbHVnaW4uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9QVFBEZWJ1Z0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyZTJhMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvUFRQRGVidWdDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JUFNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5QU291cmNlTG9va3VwRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuUERlYnVnQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuQ29tbW9uU291cmNlTG9va3VwRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgUFRQRGVidWdDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQljbGFzcyBFdmVudERpc3BhdGNoSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBFdmVudE5vdGlmaWVyIGZOb3RpZmllciA9IG5ldyBFdmVudE5vdGlmaWVyKCk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgZXZlbnQgZGlzcGF0Y2ggam9iLgotCQkgKi8KLQkJcHVibGljIEV2ZW50RGlzcGF0Y2hKb2IoKSB7Ci0JCQlzdXBlcigiRXZlbnREaXNwYXRjaEpvYiIpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQkJcmV0dXJuIHNob3VsZFNjaGVkdWxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTY2hlZHVsZSgpIHsKLQkJCXJldHVybiAhKGlzU2h1dHRpbmdEb3duKCkgfHwgZkV2ZW50TGlzdGVuZXJzLmlzRW1wdHkoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl3aGlsZSAoIWZFdmVudFF1ZXVlLmlzRW1wdHkoKSkgewotCQkJCUlQRGVidWdFdmVudCBldmVudCA9IG51bGw7Ci0JCQkJc3luY2hyb25pemVkIChmRXZlbnRRdWV1ZSkgewotCQkJCQlpZiAoIWZFdmVudFF1ZXVlLmlzRW1wdHkoKSkgewotCQkJCQkJZXZlbnQgPSAoSVBEZWJ1Z0V2ZW50KSBmRXZlbnRRdWV1ZS5yZW1vdmUoMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCQkJZk5vdGlmaWVyLmRpc3BhdGNoKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQkKLQljbGFzcyBFdmVudE5vdGlmaWVyIGltcGxlbWVudHMgSVNhZmVSdW5uYWJsZSB7Ci0JCXByaXZhdGUgSVBEZWJ1Z0V2ZW50IGZFdmVudDsKLQkJcHJpdmF0ZSBJUERlYnVnRXZlbnRMaXN0ZW5lciBmTGlzdGVuZXI7Ci0KLQkJcHVibGljIHZvaWQgZGlzcGF0Y2goSVBEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCQlmRXZlbnQgPSBldmVudDsKLQkJCXRyeSB7Ci0JCQkJc2V0RGlzcGF0Y2hpbmcodHJ1ZSk7Ci0JCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZ2V0RXZlbnRMaXN0ZW5lcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlmTGlzdGVuZXIgPSAoSVBEZWJ1Z0V2ZW50TGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJU2FmZVJ1bm5lci5ydW4odGhpcyk7Ci0JCQkJfQotCi0JCQl9IGZpbmFsbHkgewotCQkJCXNldERpc3BhdGNoaW5nKGZhbHNlKTsKLQkJCX0KLQkJCWZFdmVudCA9IG51bGw7Ci0JCQlmTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSU5URVJOQUxfRVJST1IsCi0JCQkJCSJQVFBEZWJ1Z0NvcmVQbHVnaW4gb2NjdXJyZWQgZXhjZXB0aW9uIHdoaWxlIGRpc3BhY3RoaW5nIGRlYnVnIGV2ZW50IiwgZXhjZXB0aW9uKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCWZMaXN0ZW5lci5oYW5kbGVEZWJ1Z0V2ZW50KGZFdmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDEwMDA7Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgaWRlbnRpZnlpbmcgdGhlIGpvYiBmYW1pbHkgaWRlbnRpZmllciBmb3IgdGhlIGJhY2tncm91bmQgZXZlbnQKLQkgKiBqb2IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRkFNSUxZX0VWRU5UID0gbmV3IE9iamVjdCgpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBERUJVR0dFUl9FWFRFTlNJT05fUE9JTlRfSUQgPSAicGFyYWxsZWxEZWJ1Z2dlcnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHR0VSX0VMRU1FTlQgPSAiZGVidWdnZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgUFRQRGVidWdDb3JlUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIHN0YXRpYyBQRGVidWdNb2RlbCBkZWJ1Z01vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBEZWJ1Z01vZGVsIGdldERlYnVnTW9kZWwoKSB7Ci0JCXJldHVybiBkZWJ1Z01vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQVFBEZWJ1Z0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlSWRlbnRpZmllcigpIHsKLQkJaWYgKGdldERlZmF1bHQoKSA9PSBudWxsKSB7Ci0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0KSB7Ci0JCVRocm93YWJsZSB0b3AgPSB0OwotCQlpZiAodCBpbnN0YW5jZW9mIERlYnVnRXhjZXB0aW9uKSB7Ci0JCQlEZWJ1Z0V4Y2VwdGlvbiBkZSA9IChEZWJ1Z0V4Y2VwdGlvbikgdDsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZGUuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQl0b3AgPSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBtZXNzYWdlIGlzIGludGVudGlvbmFsbHkgbm90IGludGVybmF0aW9uYWxpemVkLCBhcyBhbiBleGNlcHRpb24KLQkJLy8gbWF5Ci0JCS8vIGJlIGR1ZSB0byB0aGUgcmVzb3VyY2UgYnVuZGxlIGl0c2VsZgotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElOVEVSTkFMX0VSUk9SLCAiSW50ZXJuYWwgZXJyb3IgbG9nZ2VkIGZyb20gUERJIERlYnVnOiAiLCB0b3ApKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBQRGVidWdDb25maWd1cmF0aW9uPiBmRGVidWdDb25maWd1cmF0aW9uczsKLQlwcml2YXRlIENvbW1vblNvdXJjZUxvb2t1cERpcmVjdG9yIGZDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvcjsKLQlwcml2YXRlIEV2ZW50RGlzcGF0Y2hKb2IgZGlzcGF0Y2hKb2IgPSBuZXcgRXZlbnREaXNwYXRjaEpvYigpOwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZFdmVudExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIExpc3Q8SVBEZWJ1Z0V2ZW50PiBmRXZlbnRRdWV1ZSA9IG5ldyBBcnJheUxpc3Q8SVBEZWJ1Z0V2ZW50PigpOwotCXByaXZhdGUgYm9vbGVhbiBmU2h1dHRpbmdEb3duID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZkRpc3BhdGNoaW5nID0gMDsKLQotCXB1YmxpYyBQVFBEZWJ1Z0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGVidWdFdmVudExpc3RlbmVyKElQRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZFdmVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVEZWJ1Z0V2ZW50KElQRGVidWdFdmVudCBldmVudCkgewotCQlpZiAoaXNTaHV0dGluZ0Rvd24oKSB8fCBldmVudCA9PSBudWxsIHx8IGZFdmVudExpc3RlbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZkV2ZW50UXVldWUpIHsKLQkJCWZFdmVudFF1ZXVlLmFkZChldmVudCk7Ci0JCX0KLQkJZGlzcGF0Y2hKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRDb21tYW5kVGltZW91dCgpIHsKLQkJcmV0dXJuIGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KElQRGVidWdDb25zdGFudHMuUFJFRl9QVFBfREVCVUdfQ09NTV9USU1FT1VUKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQU291cmNlTG9jYXRpb25bXSBnZXRDb21tb25Tb3VyY2VMb2NhdGlvbnMoKSB7Ci0JCXJldHVybiBTb3VyY2VVdGlscy5nZXRDb21tb25Tb3VyY2VMb2NhdGlvbnNGcm9tTWVtZW50byhnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZygKLQkJCQlJUERlYnVnQ29uc3RhbnRzLlBSRUZfU09VUkNFX0xPQ0FUSU9OUykpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUFNvdXJjZUxvb2t1cERpcmVjdG9yIGdldENvbW1vblNvdXJjZUxvb2t1cERpcmVjdG9yKCkgewotCQlyZXR1cm4gZkNvbW1vblNvdXJjZUxvb2t1cERpcmVjdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBEZWJ1Z0NvbmZpZ3VyYXRpb24gZ2V0RGVidWdDb25maWd1cmF0aW9uKFN0cmluZyBpZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkRlYnVnQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZURlYnVnQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCUlQRGVidWdDb25maWd1cmF0aW9uIGRiZ0NmZyA9IChJUERlYnVnQ29uZmlndXJhdGlvbikgZkRlYnVnQ29uZmlndXJhdGlvbnMuZ2V0KGlkKTsKLQkJaWYgKGRiZ0NmZyA9PSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAxMDAsICJQVFBEZWJ1Z0NvcmVQbHVnaW4gRGVidWcgQ29uZmlndXJhdGlvbiBFcnJvciIsCi0JCQkJCW51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gZGJnQ2ZnOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBEZWJ1Z0NvbmZpZ3VyYXRpb25bXSBnZXREZWJ1Z0NvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoZkRlYnVnQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZURlYnVnQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCXJldHVybiAoSVBEZWJ1Z0NvbmZpZ3VyYXRpb25bXSkgZkRlYnVnQ29uZmlndXJhdGlvbnMudmFsdWVzKCkudG9BcnJheShuZXcgSVBEZWJ1Z0NvbmZpZ3VyYXRpb25bMF0pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBEZWJ1Z0NvbmZpZ3VyYXRpb24gZ2V0RGVmYXVsdERlYnVnQ29uZmlndXJhdGlvbigpIHsKLQkJSVBEZWJ1Z0NvbmZpZ3VyYXRpb24gcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldERlYnVnQ29uZmlndXJhdGlvbihnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZygKLQkJCQkJSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX0RFRkFVTFRfREVCVUdHRVJfVFlQRSkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdERlYnVnQ29uZmlndXJhdGlvbihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIChpZC5jb21wYXJlVG8oZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoCi0JCQkJSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX0RFRkFVTFRfREVCVUdHRVJfVFlQRSkpID09IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBkZWJ1ZyBldmVudHMgYXJlIGJlaW5nIGRpc3BhdGNoZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEaXNwYXRjaGluZygpIHsKLQkJcmV0dXJuIGZEaXNwYXRjaGluZyA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGx1Zy1pbiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzaHV0ZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBwbHVnLWluIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHNodXRkb3duCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaHV0dGluZ0Rvd24oKSB7Ci0JCXJldHVybiBmU2h1dHRpbmdEb3duOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcihJUERlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmRXZlbnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbW1vblNvdXJjZUxvY2F0aW9ucyhJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zKSB7Ci0JCWdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1NPVVJDRV9MT0NBVElPTlMsCi0JCQkJU291cmNlVXRpbHMuZ2V0Q29tbW9uU291cmNlTG9jYXRpb25zTWVtZW50byhsb2NhdGlvbnMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlRGVmYXVsdERlYnVnQ29uZmlndXJhdGlvbihTdHJpbmcgaWQpIHsKLQkJZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShJUERlYnVnQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9ERUJVR0dFUl9UWVBFLAotCQkJCShpZCAhPSBudWxsKSA/IGlkIDogIiIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGlzIHBsdWctaW4gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc2h1dGRvd24uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoaXMgcGx1Zy1pbiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzaHV0ZG93bgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNodXR0aW5nRG93bihib29sZWFuIHZhbHVlKSB7Ci0JCWZTaHV0dGluZ0Rvd24gPSB2YWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJZGVidWdNb2RlbCA9IG5ldyBQRGVidWdNb2RlbCgpOwotCQlpbml0aWFsaXplQ29tbW9uU291cmNlTG9va3VwRGlyZWN0b3IoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldFNodXR0aW5nRG93bih0cnVlKTsKLQkJCWRlYnVnTW9kZWwuc2h1dGRvd24oKTsKLQkJCWRpc3Bvc2VDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvcigpOwotCQkJZGlzcG9zZURlYnVnQ29uZmlndXJhdGlvbnMoKTsKLQkJCURlYnVnSm9iU3RvcmFnZS5yZW1vdmVEZWJ1Z1N0b3JhZ2VzKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpcmVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRTb3VyY2VMb2NhdGlvbnMoQ29tbW9uU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IpIHsKLQkJZGlyZWN0b3Iuc2V0U291cmNlQ29udGFpbmVycyhTb3VyY2VVdGlscy5jb252ZXJ0U291cmNlTG9jYXRpb25zKGdldENvbW1vblNvdXJjZUxvY2F0aW9ucygpKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvcigpIHsKLQkJaWYgKGZDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvciAhPSBudWxsKQotCQkJZkNvbW1vblNvdXJjZUxvb2t1cERpcmVjdG9yLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZURlYnVnQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChmRGVidWdDb25maWd1cmF0aW9ucyAhPSBudWxsKSB7Ci0JCQlmRGVidWdDb25maWd1cmF0aW9ucy5jbGVhcigpOwotCQkJZkRlYnVnQ29uZmlndXJhdGlvbnMgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gZ2V0RXZlbnRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBmRXZlbnRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvcigpIHsKLQkJaWYgKGZDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvciA9PSBudWxsKSB7Ci0JCQlmQ29tbW9uU291cmNlTG9va3VwRGlyZWN0b3IgPSBuZXcgQ29tbW9uU291cmNlTG9va3VwRGlyZWN0b3IoKTsKLQkJCVN0cmluZyBuZXdNZW1lbnRvID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoCi0JCQkJCUlQRGVidWdDb25zdGFudHMuUFJFRl9DT01NT05fU09VUkNFX0NPTlRBSU5FUlMpOwotCQkJaWYgKG5ld01lbWVudG8ubGVuZ3RoKCkgPT0gMCkgewotCQkJCS8vIENvbnZlcnQgc291cmNlIGxvY2F0aW9ucyB0byBzb3VyY2UgY29udGFpbmVycwotCQkJCWNvbnZlcnRTb3VyY2VMb2NhdGlvbnMoZkNvbW1vblNvdXJjZUxvb2t1cERpcmVjdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZkNvbW1vblNvdXJjZUxvb2t1cERpcmVjdG9yLmluaXRpYWxpemVGcm9tTWVtZW50byhuZXdNZW1lbnRvKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVidWdDb25maWd1cmF0aW9uKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KGdldFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQlQREVCVUdHRVJfRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGluZm9zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmRGVidWdDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUERlYnVnQ29uZmlndXJhdGlvbj4oaW5mb3MubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBpbmZvc1tpXTsKLQkJCQlQRGVidWdDb25maWd1cmF0aW9uIGNvbmZpZ1R5cGUgPSBuZXcgUERlYnVnQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uRWxlbWVudCk7Ci0JCQkJZkRlYnVnQ29uZmlndXJhdGlvbnMucHV0KGNvbmZpZ1R5cGUuZ2V0SUQoKSwgY29uZmlnVHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlzcGF0Y2hpbmcKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldERpc3BhdGNoaW5nKGJvb2xlYW4gZGlzcGF0Y2hpbmcpIHsKLQkJaWYgKGRpc3BhdGNoaW5nKSB7Ci0JCQlmRGlzcGF0Y2hpbmcrKzsKLQkJfSBlbHNlIHsKLQkJCWZEaXNwYXRjaGluZy0tOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL1Byb2Nlc3NJbnB1dFN0cmVhbS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL1Byb2Nlc3NJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxYmQ2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9Qcm9jZXNzSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUHJvY2Vzc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUHJvY2Vzc0xpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIGltcGxlbWVudHMgSVByb2Nlc3NMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWZmZXJzOwotICAgIHByb3RlY3RlZCBpbnQgcG9zOwotICAgIHByb3RlY3RlZCBpbnQgY291bnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudEJ1ZmZlcjsKLSAgICBwcml2YXRlIElQUHJvY2VzcyBwcm9jZXNzOwotCi0gICAgcHVibGljIFByb2Nlc3NJbnB1dFN0cmVhbShJUFByb2Nlc3MgcHJvY2VzcykgewotICAgIAl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotICAgIAlidWZmZXJzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCkpOwotCQlwcm9jZXNzLmFkZEVsZW1lbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgcHVibGljIElQUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotICAgIAlyZXR1cm4gcHJvY2VzczsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoU3RyaW5nIGJ1ZmZlcikgewotICAgIAlzeW5jaHJvbml6ZWQoYnVmZmVycykgewotICAgIAkJYnVmZmVycy5hZGQoYnVmZmVyPT1udWxsPyIiOmJ1ZmZlcik7Ci0JICAgIAlidWZmZXJzLm5vdGlmeUFsbCgpOwotICAgIAl9Ci0gICAgfQotICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1ZmZlcigpIHsKLQkJc3luY2hyb25pemVkIChidWZmZXJzKSB7Ci0JCQlTdHJpbmcgYnVmZmVyOwotCQkJd2hpbGUgKGJ1ZmZlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYnVmZmVycy53YWl0KCk7Ci0JCSAgICAJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkgICAgCQlidWZmZXIgPSAiIjsKLQkJICAgIAl9Ci0JCQl9Ci0JCQlidWZmZXIgPSAoU3RyaW5nKWJ1ZmZlcnMucmVtb3ZlKDApOwotCQkJcmVzZXQoYnVmZmVyLmxlbmd0aCgpKTsKLQkJCXJldHVybiBidWZmZXI7Ci0JCX0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcmVzdGFydCgpIHsKLSAgICAJcHJvY2Vzcy5hZGRFbGVtZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgIAlhZGRJbnB1dCgiIik7Ci0gICAgCXByb2Nlc3MuYWRkRWxlbWVudExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICBwdWJsaWMgaW50IHJlYWQoKSB7Ci0gICAgCXN5bmNocm9uaXplZCAoYnVmZmVycykgewotICAgIAkJaWYgKGNvdW50IDw9IHBvcykKLSAgICAJCQljdXJyZW50QnVmZmVyID0gZ2V0QnVmZmVyKCk7Ci0gICAgCQkKLSAgICAJCXJldHVybiAocG9zIDwgY291bnQpID8gKGN1cnJlbnRCdWZmZXIuY2hhckF0KHBvcysrKSAmIDB4RkYpIDogLTE7Ci0gICAgCX0KLSAgICB9Ci0gICAgcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0gICAgCXN5bmNocm9uaXplZCAoYnVmZmVycykgewotICAgIAkJU3RyaW5nIGJ1ZmZlciA9IGdldEJ1ZmZlcigpOwotCQkJaWYgKGIgPT0gbnVsbCkgewotCQkJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfSBlbHNlIGlmICgob2ZmIDwgMCkgfHwgKG9mZiA+IGIubGVuZ3RoKSB8fCAobGVuIDwgMCkgfHwgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKSB7Ci0JCQkgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChwb3MgPj0gY291bnQpIHsKLQkJCSAgICByZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAocG9zICsgbGVuID4gY291bnQpIHsKLQkJCSAgICBsZW4gPSBjb3VudCAtIHBvczsKLQkJCX0KLQkJCWlmIChsZW4gPD0gMCkgewotCQkJICAgIHJldHVybiAwOwotCQkJfQotCQkJaW50IGNudCA9IGxlbjsKLQkJCXdoaWxlICgtLWNudCA+PSAwKSB7Ci0JCQkgICAgYltvZmYrK10gPSAoYnl0ZSlidWZmZXIuY2hhckF0KHBvcysrKTsKLQkJCX0KLQkJCXJldHVybiBsZW47Ci0gICAgCX0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcmVzZXQoaW50IGxlbikgewotICAgIAlzeW5jaHJvbml6ZWQgKGJ1ZmZlcnMpIHsKLQkgICAgCXBvcyA9IDA7Ci0JICAgIAljb3VudCA9IGxlbjsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5saXN0ZW5lcnMuSVByb2Nlc3NMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSVByb2Nlc3NDaGFuZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJvY2Vzc0NoYW5nZUV2ZW50IGUpIHsKLQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZT4gc3RhdGVBdHRyID0gZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKHN0YXRlQXR0ciAhPSBudWxsKSB7Ci0JCQlQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSA9IHN0YXRlQXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHN0YXRlID09IFN0YXRlLkVYSVRFRCB8fCBzdGF0ZSA9PSBTdGF0ZS5FWElURURfU0lHTkFMTEVEIHx8IHN0YXRlID09IFN0YXRlLkVSUk9SKSB7Ci0JCQkJY2xvc2UoKTsKLQkJCX0KLQkJfSAKLQkJCi0JCVN0cmluZ0F0dHJpYnV0ZSBzdGRvdXRBdHRyID0gZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0ZG91dEF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCWlmIChzdGRvdXRBdHRyICE9IG51bGwpIHsKLQkJCWFkZElucHV0KHN0ZG91dEF0dHIuZ2V0VmFsdWUoKSArICJcbiIpOwotCQl9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0JyZWFrcG9pbnRJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0JyZWFrcG9pbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2IzMzAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdCcmVha3BvaW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERlYnVnQnJlYWtwb2ludEluZm8gZXh0ZW5kcyBJUERlYnVnSW5mbyB7Ci0JaW50IGdldEJyZWFrcG9pbnRJRCgpOwotCU1hcDxTdHJpbmcsPz4gZ2V0SW5mbygpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0Vycm9ySW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdFcnJvckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2Nzg0ZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0Vycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50OwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERlYnVnRXJyb3JJbmZvIGV4dGVuZHMgSVBEZWJ1Z0luZm8gewotCVN0cmluZyBnZXREZXRhaWxzTXNnKCk7Ci0JU3RyaW5nIGdldE1zZygpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0V2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2I2ZDAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRGVidWdFdmVudCB7Ci0JLyoqCi0JICogUmVzdW1lIGV2ZW50IGtpbmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FPSAweDAwMDE7Ci0KLQkvKioKLQkgKiBTdXNwZW5kIGV2ZW50IGtpbmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VTUEVORD0gMHgwMDAyOwotCi0JLyoqCi0JICogQ3JlYXRlIGV2ZW50IGtpbmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFPSAweDAwMDQ7Ci0KLQkvKioKLQkgKiBUZXJtaW5hdGUgZXZlbnQga2luZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVJNSU5BVEU9IDB4MDAwODsKLQkKLQkvKioKLQkgKiBDaGFuZ2UgZXZlbnQga2luZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0U9IDB4MDAxMDsKLQotCS8qKgotCSAqIEVycm9yIGV2ZW50IGtpbmQgb3IgZGV0YWlsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1I9IDB4MDA0MDsKLQotCS8qKgotCSAqIFByb2Nlc3Mgc3BlY2lmaWMgZXZlbnQgZGV0YWlsLgotCSAqIAotCSAqIEBzaW5jZSAyLjEuMgotCSAqLwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfU1BFQ0lGSUM9IDB4MDAyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTX1NQRUNJRklDPSAweDAwMjA7Ci0KLQkvKioKLQkgKiBTdGVwIHN0YXJ0IGRldGFpbC4gSW5kaWNhdGVzIGEgdGhyZWFkIHdhcyByZXN1bWVkIGJ5IGEgc3RlcAotCSAqIGludG8gYWN0aW9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQX0lOVE89IDB4MDAwMTsKLQkKLQkvKioKLQkgKiBTdGVwIHN0YXJ0IGRldGFpbC4gSW5kaWNhdGVzIGEgdGhyZWFkIHdhcyByZXN1bWVkIGJ5IGEgc3RlcAotCSAqIG92ZXIgYWN0aW9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQX09WRVI9IDB4MDAwMjsKLQkKLQkvKioKLQkgKiBTdGVwIHN0YXJ0IGRldGFpbC4gSW5kaWNhdGVzIGEgdGhyZWFkIHdhcyByZXN1bWVkIGJ5IGEgc3RlcAotCSAqIHJldHVybiBhY3Rpb24uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNURVBfUkVUVVJOPSAweDAwMDQ7Ci0KLQkvKioKLQkgKiBTdGVwIGVuZCBkZXRhaWwuIEluZGljYXRlcyBhIHRocmVhZCB3YXMgc3VzcGVuZGVkIGR1ZQotCSAqIHRvIHRoZSBjb21wbGV0aW9uIG9mIGEgc3RlcCBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUF9FTkQ9IDB4MDAwODsKLQkKLQkvKioKLQkgKiBCcmVha3BvaW50IGRldGFpbC4gSW5kaWNhdGVzIGEgdGhyZWFkIHdhcyBzdXNwZW5kZWQgYnkgYSBicmVha3BvaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJSRUFLUE9JTlQ9IDB4MDAxMDsKLQkKLQkvKioKLQkgKiBDbGllbnQgcmVxdWVzdCBkZXRhaWwuIEluZGljYXRlcyBhIHRocmVhZCB3YXMgc3VzcGVuZGVkIGR1ZSB0byBhIGNsaWVudCByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9SRVFVRVNUPSAweDAwMjA7Ci0JCi0JLyoqCi0JICogRXZhbHVhdGlvbiBkZXRhaWwuIEluZGljYXRlcyB0aGF0IGEgdGhyZWFkIHdhcyByZXN1bWVkIG9yCi0JICogc3VzcGVuZGVkIHRvIHBlcmZvcm0gYW4gZXhwcmVzc2lvbiBldmFsdWF0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkFMVUFUSU9OID0gMHgwMDQwOwotCQotCS8qKgotCSAqIEV2YWx1YXRpb24gZGV0YWlsLiBJbmRpY2F0ZXMgdGhhdCBhIHRocmVhZCB3YXMgcmVzdW1lZCBvcgotCSAqIHN1c3BlbmRlZCB0byBwZXJmb3JtIGFuIGltcGxpY2l0IGV4cHJlc3Npb24gZXZhbHVhdGlvbi4KLQkgKiBBbiBpbXBsaWNpdCBldmFsdWF0aW9uIGlzIGFuIGV2YWx1YXRpb24gdGhhdCBpcyBwZXJmb3JtZWQKLQkgKiBhcyBhbiBpbmRpcmVjdCByZXN1bHQgb2YgYSB1c2VyIGFjdGlvbi4KLQkgKiBDbGllbnRzIG1heSB1c2UgdGhpcyBkZXRhaWwgZXZlbnQgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90Ci0JICogdG8gYWxlcnQgdGhlIHVzZXIgdGhhdCBhbiBldmFsdWF0aW9uIGlzIHRha2luZyBwbGFjZS4uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWQUxVQVRJT05fSU1QTElDSVQgPSAweDAwODA7Ci0KLQkvKioKLQkgKiBTdGF0ZSBjaGFuZ2UgZGV0YWlsLiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIAotCSAqIGRlYnVnIGVsZW1lbnQgaGFzIGNoYW5nZWQuIE9ubHkgdmFsaWQgZm9yIDxjb2RlPkNIQU5HRTwvY29kZT4KLQkgKiBldmVudHMuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFID0gMHgwMTAwOwotCQotCS8qKgotCSAqIENvbnRlbnQgY2hhbmdlIGRldGFpbC4gSW5kaWNhdGVzIHRoZSBjb250ZW50IG9mIGEgZGVidWcgZWxlbWVudAotCSAqIChhbmQgcG90ZW50aWFsbHkgaXRzIGNoaWxkcmVuKSBoYXMgY2hhbmdlZC4gT25seSB2YWxpZCBmb3IKLQkgKiA8Y29kZT5DSEFOR0U8L2NvZGU+IGV2ZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVCA9IDB4MDIwMDsKLQotCS8qKgotCSAqIERlYnVnZ2VyIGRldGFpbC4gSW5kaWNhdGVzIHRoZSBkZWJ1Z2dlciBpcyB0ZXJtaW5hdGVkIG9yIGNyZWF0ZWQKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdHRVIgPSAweDA0MDA7Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBkZXRhaWwuIEluZGljYXRlcyB0aGUgcmVnaXN0ZXJlZCBwcm9jZXNzIGlzIGNyZWF0ZWQgb3IgdGVybWluYXRlZAotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUdJU1RFUiA9IDB4MDgwMDsKLQkKLQkvKioKLQkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIGtpbmQgb3IgZGV0YWlsIG9mIGEgZGVidWcKLQkgKiBldmVudCBpcyB1bnNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRCA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJfTk9STUFMPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJSX1dBUk5JTkc9IDB4MDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJfRkFUQUw9IDB4MDAwNDsJCQotCi0JaW50IGdldEtpbmQoKTsKLQlpbnQgZ2V0RGV0YWlsKCk7Ci0JSVBEZWJ1Z0luZm8gZ2V0SW5mbygpOwotCWJvb2xlYW4gaXNTdGVwU3RhcnQoKTsKLQlib29sZWFuIGlzRXZhbHVhdGlvbigpOyAKLQkKLQlPYmplY3QgZ2V0U291cmNlKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9JUERlYnVnRXhpdEluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9JUERlYnVnRXhpdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwZGM1OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z0V4aXRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQ7Ci0vKioKLSAqIEBhdXRob3IgQ2xlbWVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRGVidWdFeGl0SW5mbyBleHRlbmRzIElQRGVidWdJbmZvIHsKLQlpbnQgZ2V0Q29kZSgpOwotCVN0cmluZyBnZXRNZXNzYWdlKCk7Ci0JU3RyaW5nIGdldE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9JUERlYnVnSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzdkMGEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBEZWJ1Z0luZm8gewotCUlQSm9iIGdldEpvYigpOwotCUJpdExpc3QgZ2V0QWxsVGFza3MoKTsKLQlCaXRMaXN0IGdldEFsbFJlZ2lzdGVyZWRUYXNrcygpOwotCUJpdExpc3QgZ2V0QWxsVW5yZWdpc3RlcmVkVGFza3MoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdSZWdpc3RlckluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9JUERlYnVnUmVnaXN0ZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNWNmNmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdSZWdpc3RlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudDsKLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBEZWJ1Z1JlZ2lzdGVySW5mbyBleHRlbmRzIElQRGVidWdJbmZvIHsKLQlib29sZWFuIGlzUmVmcmVzaCgpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z1N1c3BlbmRJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvSVBEZWJ1Z1N1c3BlbmRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZThjMTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdTdXNwZW5kSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50OwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERlYnVnU3VzcGVuZEluZm8gZXh0ZW5kcyBJUERlYnVnSW5mbyB7Ci0JaW50IGdldExldmVsKCk7Ci0JU3RyaW5nIGdldEZpbGVuYW1lKCk7Ci0JaW50IGdldExpbmVOdW1iZXIoKTsKLQlpbnQgZ2V0RGVwdGgoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdWYWx1ZUluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9JUERlYnVnVmFsdWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGIxZjMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L0lQRGVidWdWYWx1ZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERlYnVnVmFsdWVJbmZvIGV4dGVuZHMgSVBEZWJ1Z0luZm8gewotCUlBSUYgZ2V0QUlGKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdCcmVha3BvaW50SW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z0JyZWFrcG9pbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTZiZTYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z0JyZWFrcG9pbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z0JyZWFrcG9pbnRJbmZvIGV4dGVuZHMgUERlYnVnSW5mbyBpbXBsZW1lbnRzIElQRGVidWdCcmVha3BvaW50SW5mbyB7Ci0JcHJpdmF0ZSBpbnQgYnBpZDsKLQlwcml2YXRlIE1hcDxTdHJpbmcsID8+IGluZm9NYXA7Ci0JCi0JcHVibGljIFBEZWJ1Z0JyZWFrcG9pbnRJbmZvKElQRGVidWdJbmZvIGluZm8sIGludCBicGlkKSB7Ci0JCXRoaXMoaW5mbywgYnBpZCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0JcHVibGljIFBEZWJ1Z0JyZWFrcG9pbnRJbmZvKElQRGVidWdJbmZvIGluZm8sIGludCBicGlkLCBNYXA8U3RyaW5nLCA/PiBpbmZvTWFwKSB7Ci0JCXN1cGVyKGluZm8pOwotCQl0aGlzLmJwaWQgPSBicGlkOwotCQl0aGlzLmluZm9NYXAgPSBpbmZvTWFwOwotCX0KLQlwdWJsaWMgaW50IGdldEJyZWFrcG9pbnRJRCgpIHsKLQkJcmV0dXJuIGJwaWQ7Ci0JfQotCXB1YmxpYyBNYXA8U3RyaW5nLD8+IGdldEluZm8oKSB7Ci0JCXJldHVybiBpbmZvTWFwOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z0Vycm9ySW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z0Vycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFkZjI1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdFcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudDsKLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBQRGVidWdFcnJvckluZm8gZXh0ZW5kcyBQRGVidWdJbmZvIGltcGxlbWVudHMgSVBEZWJ1Z0Vycm9ySW5mbyB7Ci0JcHJpdmF0ZSBTdHJpbmcgbXNnOwotCXByaXZhdGUgU3RyaW5nIGRldGFpbHNNc2c7Ci0JcHJpdmF0ZSBpbnQgZXJyQ29kZTsKLQkKLQlwdWJsaWMgUERlYnVnRXJyb3JJbmZvKElQRGVidWdJbmZvIGluZm8sIFN0cmluZyBtc2csIFN0cmluZyBkZXRhaWxzTXNnLCBpbnQgZXJyQ29kZSkgewotCQlzdXBlcihpbmZvKTsKLQkJdGhpcy5tc2cgPSBtc2c7Ci0JCXRoaXMuZGV0YWlsc01zZyA9IGRldGFpbHNNc2c7Ci0JCXRoaXMuZXJyQ29kZSA9IGVyckNvZGU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsc01zZygpIHsKLQkJcmV0dXJuIGRldGFpbHNNc2c7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TXNnKCkgewotCQlyZXR1cm4gbXNnOwotCX0KLQlwdWJsaWMgaW50IGdldEVycm9yQ29kZSgpIHsKLQkJcmV0dXJuIGVyckNvZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z0V2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvUERlYnVnRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3NDg1Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvUERlYnVnRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQRGVidWdFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IGltcGxlbWVudHMgSVBEZWJ1Z0V2ZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkvKioKLQkgKiBUaGUga2luZCBvZiBldmVudCAtIG9uZSBvZiB0aGUga2luZCBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqIHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBpbnQgZktpbmQ9IFVOU1BFQ0lGSUVEOwotCS8qKgotCSAqIFRoZSBkZXRhaWwgb2YgdGhlIGV2ZW50IC0gb25lIG9mIHRoZSBkZXRhaWwgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiB0aGlzIGNsYXNzLgotCSAqLwotCXByaXZhdGUgaW50IGZEZXRhaWw9IFVOU1BFQ0lGSUVEOwotCi0JcHJpdmF0ZSBJUERlYnVnSW5mbyBmSW5mbyA9IG51bGw7Ci0JCi0JcHVibGljIFBEZWJ1Z0V2ZW50KE9iamVjdCBldmVudFNvdXJjZSwgaW50IGtpbmQsIGludCBkZXRhaWwsIElQRGVidWdJbmZvIGluZm8pIHsKLQkJc3VwZXIoZXZlbnRTb3VyY2UpOwotCQlpZiAoKGtpbmQgJiAoUkVTVU1FIHwgU1VTUEVORCB8IENSRUFURSB8IFRFUk1JTkFURSB8IENIQU5HRSB8IEVSUk9SIHwgUFJPQ0VTU19TUEVDSUZJQykpID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEZWJ1ZyBldmVudCBpbGxlZ2FsIGtpbmQiKTsgCi0JCWlmIChraW5kICE9IFBST0NFU1NfU1BFQ0lGSUMgJiYgZGV0YWlsICE9IFVOU1BFQ0lGSUVEICYmIChkZXRhaWwgJiAoU1RFUF9FTkQgfCBTVEVQX0lOVE8gfCBTVEVQX09WRVIgfCBTVEVQX1JFVFVSTiB8IEJSRUFLUE9JTlQgfCBDTElFTlRfUkVRVUVTVCB8RVZBTFVBVElPTiB8IEVWQUxVQVRJT05fSU1QTElDSVQgfCBTVEFURSB8IENPTlRFTlQgfCBERUJVR0dFUiB8IFJFR0lTVEVSIHwgRVJSX05PUk1BTCB8IEVSUl9XQVJOSU5HIHwgRVJSX0ZBVEFMKSkgPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRlYnVnIGV2ZW50IGlsbGVnYWwgZGV0YWlsIik7Ci0JCWZLaW5kPSBraW5kOwotCQlmRGV0YWlsPSBkZXRhaWw7Ci0JCWZJbmZvID0gaW5mbzsKLQl9Ci0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gZktpbmQ7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0RGV0YWlsKCkgewotCQlyZXR1cm4gZkRldGFpbDsKLQl9Ci0JcHVibGljIElQRGVidWdJbmZvIGdldEluZm8oKSB7Ci0JCXJldHVybiBmSW5mbzsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNTdGVwU3RhcnQoKSB7Ci0JCXJldHVybiAoZ2V0RGV0YWlsKCkgJiAoU1RFUF9JTlRPIHwgU1RFUF9PVkVSIHwgU1RFUF9SRVRVUk4pKSA+IDA7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRXZhbHVhdGlvbigpIHsKLQkJcmV0dXJuIChnZXREZXRhaWwoKSAmIChFVkFMVUFUSU9OIHwgRVZBTFVBVElPTl9JTVBMSUNJVCkpID4gMDsKLQl9CQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJEZWJ1Z0V2ZW50WyIpOwotCQlpZiAoZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJYnVmLmFwcGVuZChnZXRTb3VyY2UoKS50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoIm51bGwiKTsKLQkJfQotCQlidWYuYXBwZW5kKCIsICIpOwotCQlzd2l0Y2ggKGdldEtpbmQoKSkgewotCQkJY2FzZSBDUkVBVEU6Ci0JCQkJYnVmLmFwcGVuZCgiQ1JFQVRFIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRFUk1JTkFURToKLQkJCQlidWYuYXBwZW5kKCJURVJNSU5BVEUiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVTVU1FOgotCQkJCWJ1Zi5hcHBlbmQoIlJFU1VNRSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVVNQRU5EOgotCQkJCWJ1Zi5hcHBlbmQoIlNVU1BFTkQiKTsKLQkJCQlicmVhazsJCQkJCi0JCQljYXNlIENIQU5HRToKLQkJCQlidWYuYXBwZW5kKCJDSEFOR0UiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6Ci0JCQkJYnVmLmFwcGVuZCgiVU5TUEVDSUZJRUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJPQ0VTU19TUEVDSUZJQzoKLQkJCQlidWYuYXBwZW5kKCJQUk9DRVNTX1NQRUNJRklDIik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJYnVmLmFwcGVuZCgiLCAiKTsKLQkJc3dpdGNoIChnZXREZXRhaWwoKSkgewotCQkJY2FzZSBCUkVBS1BPSU5UOgotCQkJCWJ1Zi5hcHBlbmQoIkJSRUFLUE9JTlQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0xJRU5UX1JFUVVFU1Q6Ci0JCQkJYnVmLmFwcGVuZCgiQ0xJRU5UX1JFUVVFU1QiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RFUF9FTkQ6Ci0JCQkJYnVmLmFwcGVuZCgiU1RFUF9FTkQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RFUF9JTlRPOgotCQkJCWJ1Zi5hcHBlbmQoIlNURVBfSU5UTyIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEVQX09WRVI6Ci0JCQkJYnVmLmFwcGVuZCgiU1RFUF9PVkVSIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNURVBfUkVUVVJOOgotCQkJCWJ1Zi5hcHBlbmQoIlNURVBfUkVUVVJOIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVWQUxVQVRJT046Ci0JCQkJYnVmLmFwcGVuZCgiRVZBTFVBVElPTiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkFMVUFUSU9OX0lNUExJQ0lUOgotCQkJCWJ1Zi5hcHBlbmQoIkVWQUxVQVRJT05fSU1QTElDSVQiKTsKLQkJCQlicmVhazsJCQkJCQkJCQotCQkJY2FzZSBTVEFURToKLQkJCQlidWYuYXBwZW5kKCJTVEFURSIpOwotCQkJCWJyZWFrOwkJCQotCQkJY2FzZSBDT05URU5UOgotCQkJCWJ1Zi5hcHBlbmQoIkNPTlRFTlQiKTsKLQkJCQlicmVhazsJCQkJCQotCQkJY2FzZSBVTlNQRUNJRklFRDoKLQkJCQlidWYuYXBwZW5kKCJVTlNQRUNJRklFRCIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBtb2RlbCBzcGVjaWZpYwotCQkJCWJ1Zi5hcHBlbmQoZ2V0RGV0YWlsKCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoIl0iKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z0V4aXRJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvUERlYnVnRXhpdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmYmU5Ni4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvUERlYnVnRXhpdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudDsKLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBQRGVidWdFeGl0SW5mbyBleHRlbmRzIFBEZWJ1Z0luZm8gaW1wbGVtZW50cyBJUERlYnVnRXhpdEluZm8gewotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGludCBjb2RlOwotCQotCXB1YmxpYyBQRGVidWdFeGl0SW5mbyhJUERlYnVnSW5mbyBpbmZvLCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGluZm8pOwotCQl0aGlzLmNvZGUgPSBjb2RlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgaW50IGdldENvZGUoKSB7Ci0JCXJldHVybiBjb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdJbmZvLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvUERlYnVnSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWM3YmU0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBQRGVidWdJbmZvIGltcGxlbWVudHMgSVBEZWJ1Z0luZm8gewotCXByaXZhdGUgQml0TGlzdCBhbGxUYXNrcyA9IG51bGw7Ci0JcHJpdmF0ZSBCaXRMaXN0IGFsbFJlZ1Rhc2tzID0gbnVsbDsKLQlwcml2YXRlIEJpdExpc3QgYWxsVW5yZWdUYXNrcyA9IG51bGw7Ci0JcHJpdmF0ZSBJUEpvYiBqb2IgPSBudWxsOwotCQotCXB1YmxpYyBQRGVidWdJbmZvKElQRGVidWdJbmZvIGluZm8pIHsKLQkJdGhpcy5qb2IgPSBpbmZvLmdldEpvYigpOwotCQl0aGlzLmFsbFRhc2tzID0gaW5mby5nZXRBbGxUYXNrcygpOwotCQl0aGlzLmFsbFJlZ1Rhc2tzID0gaW5mby5nZXRBbGxSZWdpc3RlcmVkVGFza3MoKTsKLQkJdGhpcy5hbGxVbnJlZ1Rhc2tzID0gaW5mby5nZXRBbGxVbnJlZ2lzdGVyZWRUYXNrcygpOwotCX0KLQlwdWJsaWMgUERlYnVnSW5mbyhJUEpvYiBqb2IsIEJpdExpc3QgYWxsVGFza3MsIEJpdExpc3QgYWxsUmVnVGFza3MsIEJpdExpc3QgYWxsVW5yZWdUYXNrcykgewotCQl0aGlzLmpvYiA9IGpvYjsKLQkJdGhpcy5hbGxUYXNrcyA9IGFsbFRhc2tzOwotCQl0aGlzLmFsbFJlZ1Rhc2tzID0gYWxsUmVnVGFza3M7Ci0JCXRoaXMuYWxsVW5yZWdUYXNrcyA9IGFsbFVucmVnVGFza3M7Ci0JfQotCXB1YmxpYyBCaXRMaXN0IGdldEFsbFRhc2tzKCkgewotCQlyZXR1cm4gYWxsVGFza3M7Ci0JfQotCXB1YmxpYyBCaXRMaXN0IGdldEFsbFJlZ2lzdGVyZWRUYXNrcygpIHsKLQkJcmV0dXJuIGFsbFJlZ1Rhc2tzOwotCX0KLQlwdWJsaWMgQml0TGlzdCBnZXRBbGxVbnJlZ2lzdGVyZWRUYXNrcygpIHsKLQkJcmV0dXJuIGFsbFVucmVnVGFza3M7Ci0JfQotCXB1YmxpYyBJUEpvYiBnZXRKb2IoKSB7Ci0JCXJldHVybiBqb2I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z1JlZ2lzdGVySW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2V2ZW50L1BEZWJ1Z1JlZ2lzdGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmJhMGIzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdSZWdpc3RlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z1JlZ2lzdGVySW5mbyBleHRlbmRzIFBEZWJ1Z0luZm8gaW1wbGVtZW50cyBJUERlYnVnUmVnaXN0ZXJJbmZvIHsKLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaDsKLQkKLQlwdWJsaWMgUERlYnVnUmVnaXN0ZXJJbmZvKElQSm9iIGpvYiwgQml0TGlzdCBhbGxQcm9jZXNzZXMsIEJpdExpc3QgYWxsUmVnUHJvY2Vzc2VzLCBCaXRMaXN0IGFsbFVucmVnUHJvY2Vzc2VzLCBib29sZWFuIHJlZnJlc2gpIHsKLQkJc3VwZXIoam9iLCBhbGxQcm9jZXNzZXMsIGFsbFJlZ1Byb2Nlc3NlcywgYWxsVW5yZWdQcm9jZXNzZXMpOwotCQl0aGlzLnJlZnJlc2ggPSByZWZyZXNoOwotCX0KLQlwdWJsaWMgUERlYnVnUmVnaXN0ZXJJbmZvKElQRGVidWdJbmZvIGluZm8sIGJvb2xlYW4gcmVmcmVzaCkgewotCQlzdXBlcihpbmZvKTsKLQkJdGhpcy5yZWZyZXNoID0gcmVmcmVzaDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoKCkgewotCQlyZXR1cm4gcmVmcmVzaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvZXZlbnQvUERlYnVnU3VzcGVuZEluZm8uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdTdXNwZW5kSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWY4M2I5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9ldmVudC9QRGVidWdTdXNwZW5kSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50OwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z1N1c3BlbmRJbmZvIGV4dGVuZHMgUERlYnVnSW5mbyBpbXBsZW1lbnRzIElQRGVidWdTdXNwZW5kSW5mbyB7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQlwcml2YXRlIGludCBsZXZlbDsKLQlwcml2YXRlIGludCBkZXB0aDsKLQkKLQlwdWJsaWMgUERlYnVnU3VzcGVuZEluZm8oSVBEZWJ1Z0luZm8gaW5mbywgU3RyaW5nIGZpbGVuYW1lLCBpbnQgbGluZU51bWJlciwgaW50IGxldmVsLCBpbnQgZGVwdGgpIHsKLQkJc3VwZXIoaW5mbyk7Ci0JCXRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJdGhpcy5sZXZlbCA9IGxldmVsOwotCQl0aGlzLmRlcHRoID0gZGVwdGg7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCXJldHVybiBmaWxlbmFtZTsKLQl9Ci0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gbGluZU51bWJlcjsKLQl9Ci0JcHVibGljIGludCBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQlwdWJsaWMgaW50IGdldERlcHRoKCkgewotCQlyZXR1cm4gZGVwdGg7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbGF1bmNoL0lQTGF1bmNoLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbGF1bmNoL0lQTGF1bmNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTgwMDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2xhdW5jaC9JUExhdW5jaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5sYXVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci0KLS8qKgotICogRXh0ZW5kIElMYXVuY2ggdG8gc3VwcG9ydCBwYXJhbGxlbCBkZWJ1ZyBqb2JzCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQTGF1bmNoIGV4dGVuZHMgSUxhdW5jaCB7Ci0JLyoqCi0JICogR2V0IHRoZSBJUERlYnVnVGFyZ2V0IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvY2Vzc2VzIGluIHByb2NzCi0JICogCi0JICogQHBhcmFtIHRhc2tzIEJpdExpc3QgY29udGFpbmluZyBwcm9jZXNzZXMgd2UncmUgaW50ZXJlc3RlZCBpbgotCSAqIEByZXR1cm4gSVBEZWJ1Z1RhcmdldCByZXNwb25zaWJsZSBmb3IgcHJvY2Vzc2VzCi0JICovCi0JcHVibGljIElQRGVidWdUYXJnZXQgZ2V0RGVidWdUYXJnZXQoQml0TGlzdCBwcm9jcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUERlYnVnVGFyZ2V0IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvY0lkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jSWQgcHJvY2VzcyB3ZSdyZSBpbnRlcmVzdGVkIGluCi0JICogQHJldHVybiBJUERlYnVnVGFyZ2V0IHJlc3BvbnNpYmxlIGZvciBwcm9jSWQKLQkgKi8KLQlwdWJsaWMgSVBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldChpbnQgcHJvY0lkKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGpvYiBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2gKLQkgKiAKLQkgKiBAcmV0dXJuIElQSm9iCi0JICovCi0JcHVibGljIElQSm9iIGdldFBKb2IoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGpvYiBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2gKLQkgKiAKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHVibGljIHZvaWQgc2V0UEpvYihJUEpvYiBqb2IpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL2xhdW5jaC9QTGF1bmNoLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbGF1bmNoL1BMYXVuY2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyNDNjOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbGF1bmNoL1BMYXVuY2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubGF1bmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotCi1wdWJsaWMgY2xhc3MgUExhdW5jaCBleHRlbmRzIExhdW5jaCBpbXBsZW1lbnRzIElQTGF1bmNoIHsKLQlwcml2YXRlIElQSm9iIHBKb2I7Ci0KLQlwdWJsaWMgUExhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSVNvdXJjZUxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihsYXVuY2hDb25maWd1cmF0aW9uLCBtb2RlLCBsb2NhdG9yKTsKLQl9Ci0JcHVibGljIElQSm9iIGdldFBKb2IoKSB7Ci0JCXJldHVybiBwSm9iOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQSm9iKElQSm9iIGpvYikgewotCQlwSm9iID0gam9iOwotCX0KLQlwdWJsaWMgSVBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldChCaXRMaXN0IHRhc2tzKSB7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaT1nZXREZWJ1Z1RhcmdldHMwKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJUERlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0ID0gKElQRGVidWdUYXJnZXQpaS5uZXh0KCk7Ci0JCQlpZiAoZGVidWdUYXJnZXQuZ2V0VGFza3MoKS5lcXVhbHModGFza3MpKQotCQkJCXJldHVybiBkZWJ1Z1RhcmdldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIElQRGVidWdUYXJnZXQgZ2V0RGVidWdUYXJnZXQoaW50IHRhc2tfaWQpIHsKLQkJZm9yIChJdGVyYXRvcjw/PiBpPWdldERlYnVnVGFyZ2V0czAoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQgPSAoSVBEZWJ1Z1RhcmdldClpLm5leHQoKTsKLQkJCWlmIChkZWJ1Z1RhcmdldC5nZXRUYXNrcygpLmdldCh0YXNrX2lkKSkKLQkJCQlyZXR1cm4gZGVidWdUYXJnZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLQkJaWYgKHBKb2IgIT0gbnVsbCkKLQkJCXJldHVybiBwSm9iLmlzVGVybWluYXRlZCgpOwotCQlyZXR1cm4gc3VwZXIuaXNUZXJtaW5hdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lFbmFibGVEaXNhYmxlVGFyZ2V0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSUVuYWJsZURpc2FibGVUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3MTI1MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSUVuYWJsZURpc2FibGVUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVEaXNhYmxlVGFyZ2V0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvYmplY3Qgc3VwcG9ydHMgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBvYmplY3Qgc3VwcG9ydHMgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9ucwotCSAqLwotCWJvb2xlYW4gY2FuRW5hYmxlRGlzYWJsZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG9iamVjdCBpcyBlbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYnZqZWN0IGlzIGVuYWJsZWQsIAotCSAqIAkJICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGlzRW5hYmxlZCgpOwotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlcyB0aGlzIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkIGVuYWJsZW1lbnQgZmxhZyB2YWx1ZQotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQl2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSUV4ZWNGaWxlSW5mby5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lFeGVjRmlsZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1MDI5ZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSUV4ZWNGaWxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXhlY0ZpbGVJbmZvIHsKLQkvKiogR2V0IGJpbmFyeSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCS8vcHVibGljIElCaW5hcnlPYmplY3QgZ2V0RXhlY0ZpbGUoKTsKLQkvKiogR2V0IGdsb2JhbCB2YXJpYWJsZSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3JbXSBnZXRHbG9iYWxzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lGb3JtYXRTdXBwb3J0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSUZvcm1hdFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyNTdkZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSUZvcm1hdFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZvcm1hdFN1cHBvcnQgewotCWJvb2xlYW4gc3VwcG9ydHNGb3JtYXR0aW5nKCk7Ci0JUFZhcmlhYmxlRm9ybWF0IGdldEZvcm1hdCgpOwotCXZvaWQgY2hhbmdlRm9ybWF0KFBWYXJpYWJsZUZvcm1hdCBmb3JtYXQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JSnVtcFRvQWRkcmVzcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lKdW1wVG9BZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTg4NDEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lKdW1wVG9BZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKdW1wVG9BZGRyZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdGhpcyBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSnVtcFRvQWRkcmVzcyhCaWdJbnRlZ2VyIGFkZHJlc3MpOwotCi0JLyoqCi0JICogQ2F1c2VzIHRoaXMgZWxlbWVudCB0byByZXN1bWUgdGhlIGV4ZWN1dGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCi0JICogCi0JICogQGV4Y2VwdGlvbiBEZWJ1Z0V4Y2VwdGlvbiBvbiBmYWlsdXJlLiBSZWFzb25zIGluY2x1ZGU6Ci0JICovCi0JcHVibGljIHZvaWQganVtcFRvQWRkcmVzcyhCaWdJbnRlZ2VyIGFkZHJlc3MpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JSnVtcFRvTGluZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lKdW1wVG9MaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTZlMWMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lKdW1wVG9MaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHJlc3VtZSBhIGRlYnVnIHRhcmdldCBhdCB0aGUgZ2l2ZW4gbGluZQotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKdW1wVG9MaW5lIHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdGhpcyBmaWxlIGFuZCBsaW5lIG51bWJlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkp1bXBUb0xpbmUoSUZpbGUgZmlsZSwgaW50IGxpbmVOdW1iZXIpOwotCi0JLyoqCi0JICogQ2F1c2VzIHRoaXMgZWxlbWVudCB0byByZXN1bWUgdGhlIGV4ZWN1dGlvbiBhdCB0aGUgc3BlY2lmaWVkIGxpbmUuCi0JICogCi0JICogQGV4Y2VwdGlvbiBEZWJ1Z0V4Y2VwdGlvbiBvbiBmYWlsdXJlLiBSZWFzb25zIGluY2x1ZGU6Ci0JICovCi0JcHVibGljIHZvaWQganVtcFRvTGluZShJRmlsZSBmaWxlLCBpbnQgbGluZU51bWJlcikgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHRoaXMgZmlsZSBhbmQgbGluZSBudW1iZXIuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5KdW1wVG9MaW5lKFN0cmluZyBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIpOwotCi0JLyoqCi0JICogQ2F1c2VzIHRoaXMgZWxlbWVudCB0byByZXN1bWUgdGhlIGV4ZWN1dGlvbiBhdCB0aGUgc3BlY2lmaWVkIGxpbmUuCi0JICogCi0JICogQGV4Y2VwdGlvbiBEZWJ1Z0V4Y2VwdGlvbiBvbiBmYWlsdXJlLiBSZWFzb25zIGluY2x1ZGU6Ci0JICovCi0JcHVibGljIHZvaWQganVtcFRvTGluZShTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBBSUYuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUEFJRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk4YzNhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUEFJRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBBSUYgZXh0ZW5kcyBJVmFsdWUsIElQRGVidWdFbGVtZW50IHsKLQlJQUlGIGdldEFJRigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQlTdHJpbmcgZXZhbHVhdGVBc0V4cHJlc3Npb24oSVBTdGFja0ZyYW1lIGZyYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUEFkZHJlc3NCcmVha3BvaW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBBZGRyZXNzQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDNjMjMzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUEFkZHJlc3NCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUEFkZHJlc3NCcmVha3BvaW50IGV4dGVuZHMgSVBMaW5lQnJlYWtwb2ludCB7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBCcmVha3BvaW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTgxZDIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQQnJlYWtwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQQnJlYWtwb2ludCBleHRlbmRzIElCcmVha3BvaW50IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9CQUwgPSAiR2xvYmFsIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ESVRJT04gPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuY29uZGl0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfQ09VTlQgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuaWdub3JlQ291bnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9IQU5ETEUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlSGFuZGxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMX0NPVU5UID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmluc3RhbGxDb3VudCI7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJFQURfSUQgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUudGhyZWFkSWQiOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZHVsZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNldGlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJfU0VUX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmN1cnNldGlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfSUQgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuam9iaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmpvYm5hbWUiOwotCi0Jdm9pZCB1cGRhdGVNYXJrZXJNZXNzYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JYm9vbGVhbiBpc0dsb2JhbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCVN0cmluZyBnZXRDdXJTZXRJZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgc2V0Q3VyU2V0SWQoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCVN0cmluZyBnZXRTZXRJZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgc2V0U2V0SWQoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlTdHJpbmcgZ2V0Sm9iSWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQl2b2lkIHNldEpvYklkKFN0cmluZyBpZCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JU3RyaW5nIGdldEpvYk5hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQl2b2lkIHNldEpvYk5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCWJvb2xlYW4gaXNJbnN0YWxsZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQlib29sZWFuIGlzQ29uZGl0aW9uYWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCWludCBpbmNyZW1lbnRJbnN0YWxsQ291bnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQlpbnQgZGVjcmVtZW50SW5zdGFsbENvdW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0Jdm9pZCByZXNldEluc3RhbGxDb3VudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JU3RyaW5nIGdldENvbmRpdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgc2V0Q29uZGl0aW9uKFN0cmluZyBjb25kaXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCWludCBnZXRJZ25vcmVDb3VudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgc2V0SWdub3JlQ291bnQoaW50IGlnbm9yZUNvdW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlTdHJpbmcgZ2V0U291cmNlSGFuZGxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0Jdm9pZCBzZXRTb3VyY2VIYW5kbGUoU3RyaW5nIHNvdXJjZUhhbmRsZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0vKgotICogVE9ETyAtIE5vdCBJbXBsZW1lbnRlZAotCVN0cmluZyBnZXRUaHJlYWRJZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgc2V0VGhyZWFkSWQoU3RyaW5nIHRocmVhZElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlTdHJpbmcgZ2V0TW9kdWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0Jdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0Jdm9pZCBzZXRUYXJnZXRGaWx0ZXIoSVBEZWJ1Z1RhcmdldCB0YXJnZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgcmVtb3ZlVGFyZ2V0RmlsdGVyKElQRGVidWdUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQl2b2lkIHNldFRocmVhZEZpbHRlcnMoSVBUaHJlYWRbXSB0aHJlYWRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQl2b2lkIHJlbW92ZVRocmVhZEZpbHRlcnMoSVBUaHJlYWRbXSB0aHJlYWRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQlJUFRocmVhZFtdIGdldFRocmVhZEZpbHRlcnMoSVBEZWJ1Z1RhcmdldCB0YXJnZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCUlQRGVidWdUYXJnZXRbXSBnZXRUYXJnZXRGaWx0ZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0qLyAKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUERlYnVnRWxlbWVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQRGVidWdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODE5ZjAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQRGVidWdFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRGVidWdFbGVtZW50IGV4dGVuZHMgSURlYnVnRWxlbWVudCB7Ci0JUERlYnVnRWxlbWVudFN0YXRlIGdldFN0YXRlKCk7Ci0JT2JqZWN0IGdldEN1cnJlbnRTdGF0ZUluZm8oKTsKLQlJUFNlc3Npb24gZ2V0U2Vzc2lvbigpOwotCWludCBnZXRJRCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQRGVidWdFbGVtZW50U3RhdHVzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmNThjNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBEZWJ1Z0VsZW1lbnRTdGF0dXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDI7Ci0JYm9vbGVhbiBpc09LKCk7Ci0JaW50IGdldFNldmVyaXR5KCk7Ci0JU3RyaW5nIGdldE1lc3NhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUERlYnVnVGFyZ2V0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBEZWJ1Z1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JjMWQ3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUERlYnVnVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVJlZ2lzdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQRGVidWdUYXJnZXQgZXh0ZW5kcyBJRGVidWdUYXJnZXQsIElFeGVjRmlsZUluZm8sIElSZXN0YXJ0LCBJUmVzdW1lV2l0aG91dFNpZ25hbCwgSVBEZWJ1Z0VsZW1lbnQsCi0JCUlUYXJnZXRQcm9wZXJ0aWVzLCBJU3RlcHBpbmdNb2RlVGFyZ2V0IHsKLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZ2lzdGVyR3JvdXAoU3RyaW5nIG5hbWUsIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMpOwotCi0JLyoqCi0JICogQHBhcmFtIGdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBHbG9iYWxWYXJpYWJsZSBjcmVhdGVHbG9iYWxWYXJpYWJsZShJUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBnbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50Ci0JICovCi0JcHVibGljIHZvaWQgZmlyZUNoYW5nZUV2ZW50KGludCBjb250ZW50KTsKLQotCS8qKgotCSAqIEBwYXJhbSBicmVha3BvaW50Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCcmVha3BvaW50QWRkcmVzcyhJUExpbmVCcmVha3BvaW50IGJyZWFrcG9pbnQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVRhcmdldCBnZXRQRElUYXJnZXQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZ2V0UmVnaXN0ZXJEZXNjcmlwdG9ycygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQU2lnbmFsW10gZ2V0U2lnbmFscygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTaWduYWxzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGl0dGxlRW5kaWFuKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQb3N0TW9ydGVtKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ3JvdXAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlSZWdpc3Rlckdyb3VwKElQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwIGdyb3VwLCBJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBncm91cHMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWdpc3Rlckdyb3VwcyhJUmVnaXN0ZXJHcm91cFtdIGdyb3Vwcyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFJlZ2lzdGVyR3JvdXBzKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBEdW1teVN0YWNrRnJhbWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUER1bW15U3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGMyMjJhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUER1bW15U3RhY2tGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUER1bW15U3RhY2tGcmFtZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUEZ1bmN0aW9uQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQRnVuY3Rpb25CcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODVhNzEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQRnVuY3Rpb25CcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUEZ1bmN0aW9uQnJlYWtwb2ludCBleHRlbmRzIElQTGluZUJyZWFrcG9pbnQgewotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQR2xvYmFsVmFyaWFibGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUEdsb2JhbFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzU4MWYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQR2xvYmFsVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUEdsb2JhbFZhcmlhYmxlIGV4dGVuZHMgSVBWYXJpYWJsZSB7Ci0JcHVibGljIElQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxNDY4MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciB7Ci0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JcHVibGljIElQYXRoIGdldFBhdGgoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQTGluZUJyZWFrcG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUExpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzlhNWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQTGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUExpbmVCcmVha3BvaW50IGV4dGVuZHMgSVBCcmVha3BvaW50LCBJTGluZUJyZWFrcG9pbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmZ1bmN0aW9uIjsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTUyA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5hZGRyZXNzIjsJCi0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgc2V0RnVuY3Rpb24oU3RyaW5nIGZ1bmN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBNb2R1bGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NlMWFiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUE1vZHVsZSBleHRlbmRzIElQRGVidWdFbGVtZW50IHsKLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBleGVjdXRhYmxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRBQkxFID0gMTsKLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBzaGFyZWQgbGlicmFyaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVJFRF9MSUJSQVJZID0gMjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIG9uZSBvZgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgbmFtZSBvZiB0aGlzIG1vZHVsZS4gVGhlIG5hbWUgbWF5IG9yIG1heSBub3QgY29udGFpbiBhCi0JICogZnVsbCBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIG5hbWUgb2YgdGhpcyBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0SW1hZ2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB3aGljaCBzeW1ib2xzIHRvIGJlIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB3aGljaCBzeW1ib2xzIHRvIGJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTeW1ib2xzRmlsZU5hbWUoKTsKLQotCS8qKgotCSAqIEFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBzeW1ib2wgcHJvdmlkZXIgZm9yIHRoaXMgbW9kdWxlLiBJZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBhc3NlZCBhcyBhIGZpbGUgbmFtZSB0aGUgaW50ZXJuYWwgc3ltYm9scyBzZWFyY2gKLQkgKiBtZWNoYW5pc20gd2lsbCBiZSB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xzRmlsZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbCBwcm92aWRlciBmb3IgdGhpcyBtb2R1bGUuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGZhaWxzLiBSZWFzb25zIGluY2x1ZGU6Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3ltYm9sc0ZpbGVOYW1lKElQYXRoIHN5bWJvbHNGaWxlKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoaXMgbW9kdWxlCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZUFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIG1vZHVsZQotCSAqLwotCXB1YmxpYyBsb25nIGdldFNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3ltYm9scyBvZiB0aGlzIG1vZHVsZSBhcmUgcmVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHN5bWJvbHMgb2YgdGhpcyBtb2R1bGUgYXJlIHJlYWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcmVTeW1ib2xzTG9hZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG1vZHVsZSdzIHN5bWJvbHMgY2FuIGJlIGxvYWRlZCBvciByZWxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG1vZHVsZSdzIHN5bWJvbHMgY2FuIGJlIGxvYWRlZCBvciByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkxvYWRTeW1ib2xzKCk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgbW9kdWxlIHN5bWJvbHMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4gUmVhc29ucyBpbmNsdWRlOgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTeW1ib2xzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsYXRmb3JtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtb2R1bGUgaXMgbGl0dGxlIGVuZGlhbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBtb2R1bGUgaXMgbGl0dGxlIGVuZGlhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGl0dGxlRW5kaWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDUFUgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBDUFUgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q1BVKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFBlcnNpc3RhYmxlUmVnaXN0ZXJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODlkNzRmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFBlcnNpc3RhYmxlUmVnaXN0ZXJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAgZXh0ZW5kcyBJUmVnaXN0ZXJHcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyBhIG1lbWVudG8gdGhhdCBjYW4gYmUgdXNlZCB0byByZWNvbnN0cnVjdCB0aGlzIGdyb3VwCi0JICogQHJldHVybiBhIG1lbWVudG8gdGhhdCBjYW4gYmUgdXNlZCB0byByZWNvbnN0cnVjdCB0aGlzIGdyb3VwCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjb25zdHJ1Y3QgYSBtZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBncm91cCBiYXNlZCBvbiB0aGUgZ2l2ZW4gbWVtZW50by4KLQkgKiBAcGFyYW0gbWVtZW50byBhIG1lbWVudG8gdG8gaW5pdGlhbGl6ZSB0aGlzIGdyb3VwCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIG9uIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU1lbWVudG8oU3RyaW5nIG1lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXAncyByZWdpc3RlciBkZXNjcmlwdG9ycy4KLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBncm91cCdzIHJlZ2lzdGVyIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZ2V0UmVnaXN0ZXJEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGdyb3VwIHJlZ2lzdGVyIGRlc2NyaXB0b3JzIGJ5IHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvcnMuCi0JICogQHBhcmFtIHRoZSBhcnJheSBvZiByZWdpc3RlciBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyRGVzY3JpcHRvcnMoSVBSZWdpc3RlckRlc2NyaXB0b3JbXSByZWdpc3RlckRlc2NyaXB0b3JzKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFJlZ2lzdGVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWRkZDU0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3RlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBSZWdpc3RlciBleHRlbmRzIElQVmFyaWFibGUsIElSZWdpc3RlciB7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFJlZ2lzdGVyRGVzY3JpcHRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQUmVnaXN0ZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDU5NjQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQUmVnaXN0ZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQUmVnaXN0ZXJEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpc2VyJ3MgbmFtZQotCSAqIEByZXR1cm4gdGhlIHJlZ2lzdGVyJ3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIgZ3JvdXAgdGhpcyByZWdpc3RlciBiZWxvbmdzIHRvCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIgZ3JvdXAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQU2lnbmFsLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBTaWduYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NTc3OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBTaWduYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVBTaWduYWwgZXh0ZW5kcyBJUERlYnVnRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHNpZ25hbAotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBzaWduYWwncyBuYW1lCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBzaWduYWwuCi0JICogCi0JICogQHJldHVybiB0aGlzIHNpZ25hbCdzIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciAicGFzcyIgaXMgaW4gZWZmZWN0IGZvciB0aGlzIHNpZ25hbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgInBhc3MiIGlzIGluIGVmZmVjdCBmb3IgdGhpcyBzaWduYWwKLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFzc0VuYWJsZWQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyICJzdG9wIiBpcyBpbiBlZmZlY3QgZm9yIHRoaXMgc2lnbmFsLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciAic3RvcCIgaXMgaW4gZWZmZWN0IGZvciB0aGlzIHNpZ25hbAotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgZmFpbHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdG9wRW5hYmxlZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSAicGFzcyIgZmxhZyBvZiB0aGlzIHNpZ25hbC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlIHRoZSBmbGFnIHZhbHVlIHRvIHNldAotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgZmFpbHMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFzc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSAic3RvcCIgZmxhZyBvZiB0aGlzIHNpZ25hbC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlIHRoZSBmbGFnIHZhbHVlIHRvIHNldAotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgZmFpbHMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlc3VtZXMgZXhlY3V0aW9uLCBidXQgaW1tZWRpYXRlbHkgZ2l2ZXMgdGhlIHRhcmdldCB0aGlzIHNpZ25hbC4KLQkgKiAKLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNpZ25hbCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgbW9kaWZpY2F0aW9uIGlzIGFsbG93ZWQgZm9yIHRoaXMgc2lnbmFsJ3MgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgbW9kaWZpY2F0aW9uIGlzIGFsbG93ZWQgZm9yIHRoaXMgc2lnbmFsJ3MgcGFyYW1ldGVycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeSgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQU3RhY2tGcmFtZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQU3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdmODBlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFN0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRocmVhZDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUFN0YWNrRnJhbWUgZXh0ZW5kcyBJUnVuVG9MaW5lLCBJUnVuVG9BZGRyZXNzLCBJSnVtcFRvTGluZSwgSUp1bXBUb0FkZHJlc3MsIElQRGVidWdFbGVtZW50LCBJU3RhY2tGcmFtZSB7Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV2YWx1YXRlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElWYWx1ZSBldmFsdWF0ZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV2YWx1YXRlRXhwcmVzc2lvblRvU3RyaW5nKFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QWRkcmVzcygpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RnJhbWVMaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdW5jdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESVN0YWNrRnJhbWUgZ2V0UERJU3RhY2tGcmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUERJVGhyZWFkIGdldFBESVRocmVhZCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQVGhyZWFkLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzODUxYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUFRocmVhZCBleHRlbmRzIElUaHJlYWQsIElQRGVidWdFbGVtZW50IHsKLQlJUERlYnVnVGFyZ2V0IGdldERlYnVnVGFyZ2V0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFZhbHVlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQwNjAzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBWYWx1ZSBleHRlbmRzIElWYWx1ZSwgSVBEZWJ1Z0VsZW1lbnQgewotCUlBSUYgZ2V0QUlGKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCVN0cmluZyBldmFsdWF0ZUFzRXhwcmVzc2lvbihJUFN0YWNrRnJhbWUgZnJhbWUpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBWYXJpYWJsZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lQVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0YTVjNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBWYXJpYWJsZSBleHRlbmRzIElWYXJpYWJsZSwgSVBEZWJ1Z0VsZW1lbnQsIElGb3JtYXRTdXBwb3J0LCBJVmFsdWVNb2RpZmljYXRpb24sIElFbmFibGVEaXNhYmxlVGFyZ2V0IHsKLQlJQUlGIGdldEFJRigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQlib29sZWFuIGlzQXJndW1lbnQoKTsKLQlwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFdhdGNocG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUFdhdGNocG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1ZWM4My4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVBXYXRjaHBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGluZUJyZWFrcG9pbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBXYXRjaHBvaW50IGV4dGVuZHMgSVBCcmVha3BvaW50LCBJTGluZUJyZWFrcG9pbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT04gPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXhwcmVzc2lvbiI7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLndyaXRlIjsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRCA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5yZWFkIjsKLQlib29sZWFuIGlzV3JpdGVUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JYm9vbGVhbiBpc1JlYWRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JU3RyaW5nIGdldEV4cHJlc3Npb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUmVzdGFydC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSZXN0YXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzY3NmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSZXN0YXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzdGFydCB7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gY3VycmVudGx5IGJlIHJlc3RhcnRlZC4KLQkgKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGVsZW1lbnQgY2FuIGN1cnJlbnRseSBiZSByZXN0YXJ0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0KCk7Ci0JLyoqCi0JICogQ2F1c2VzIHRoaXMgZWxlbWVudCB0byByZXN0YXJ0IGl0cyBleGVjdXRpb24uCi0JICoKLQkgKiBAZXhjZXB0aW9uIERlYnVnRXhjZXB0aW9uIG9uIGZhaWx1cmUuIFJlYXNvbnMgaW5jbHVkZToKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSZXN1bWVXaXRob3V0U2lnbmFsLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVJlc3VtZVdpdGhvdXRTaWduYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NzI5Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvSVJlc3VtZVdpdGhvdXRTaWduYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50Ci0gKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcmVzdW1lIGV4ZWN1dGlvbiB3aXRob3V0IGdpdmluZyBhIHNpZ25hbC4gCi0gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBwcm9ncmFtIHN0b3BwZWQgb24gYWNjb3VudCBvZiBhIHNpZ25hbCBhbmQgd291bGQgCi0gKiBvcmRpbmFyeSBzZWUgdGhlIHNpZ25hbCB3aGVuIHJlc3VtZWQuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXN1bWVXaXRob3V0U2lnbmFsIHsKLQkvKioKLQkgKiBDYXVzZXMgdGhpcyBlbGVtZW50IHRvIHJlc3VtZSBpdHMgZXhlY3V0aW9uIGlnbm9yaW5nIGEgc2lnbmFsLgotCSAqIEhhcyBubyBlZmZlY3Qgb24gYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBzdXNwZW5kZWQgYmVjYXVzZSBvZiBhIHNpZ25hbC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERlYnVnRXhjZXB0aW9uIG9uIGZhaWx1cmUuIFJlYXNvbnMgaW5jbHVkZToKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVXaXRob3V0U2lnbmFsKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gY3VycmVudGx5IGJlIHJlc3VtZWQgd2l0aG91dCBzaWduYWwuCi0JICoKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBlbGVtZW50IGNhbiBjdXJyZW50bHkgYmUgcmVzdW1lZCB3aXRob3V0IHNpZ25hbAotCSAqLwotCWJvb2xlYW4gY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSdW5Ub0FkZHJlc3MuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUnVuVG9BZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjY5NzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSdW5Ub0FkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBydW4gYSBkZWJ1ZyB0YXJnZXQgdG8gdGhlIGdpdmVuIGFkZHJlc3MKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUnVuVG9BZGRyZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdGhpcyBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuVG9BZGRyZXNzKEJpZ0ludGVnZXIgYWRkcmVzcyk7Ci0KLQkvKioKLQkgKiBDYXVzZXMgdGhpcyBlbGVtZW50IHRvIHJ1biB0byBzcGVjaWZpZWQgYWRkcmVzcy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERlYnVnRXhjZXB0aW9uIG9uIGZhaWx1cmUuIFJlYXNvbnMgaW5jbHVkZToKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5Ub0FkZHJlc3MoQmlnSW50ZWdlciBhZGRyZXNzLCBib29sZWFuIHNraXBCcmVha3BvaW50cykgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSdW5Ub0xpbmUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JUnVuVG9MaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMWJlZDguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lSdW5Ub0xpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcnVuIGEgZGVidWcgdGFyZ2V0IHRvIHRoZSBnaXZlbiBsaW5lLgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW5Ub0xpbmUgewotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHRoaXMgZmlsZSBhbmQgbGluZSBudW1iZXIuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5Ub0xpbmUoSUZpbGUgZmlsZSwgaW50IGxpbmVOdW1iZXIpOwotCi0JLyoqCi0JICogQ2F1c2VzIHRoaXMgZWxlbWVudCB0byBydW4gdG8gc3BlY2lmaWVkIGxvY2F0aW9uLgotCSAqIAotCSAqIEBleGNlcHRpb24gRGVidWdFeGNlcHRpb24gb24gZmFpbHVyZS4gUmVhc29ucyBpbmNsdWRlOgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blRvTGluZShJRmlsZSBmaWxlLCBpbnQgbGluZU51bWJlciwgYm9vbGVhbiBza2lwQnJlYWtwb2ludHMpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB0aGlzIGZpbGUgYW5kIGxpbmUgbnVtYmVyLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuVG9MaW5lKFN0cmluZyBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIpOwotCi0JLyoqCi0JICogQ2F1c2VzIHRoaXMgZWxlbWVudCB0byBydW4gdG8gc3BlY2lmaWVkIGxvY2F0aW9uLgotCSAqIAotCSAqIEBleGNlcHRpb24gRGVidWdFeGNlcHRpb24gb24gZmFpbHVyZS4gUmVhc29ucyBpbmNsdWRlOgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blRvTGluZShTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCBib29sZWFuIHNraXBCcmVha3BvaW50cykgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lTdGVwcGluZ01vZGVUYXJnZXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JU3RlcHBpbmdNb2RlVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTdkNGEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lTdGVwcGluZ01vZGVUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbDsKLQotLyoqCi0gKiBTdXBwb3J0IGZvciB0aGUgaW5zdHJ1Y3Rpb24gc3RlcHBpbmcgbW9kZSBmb3IgYSBkZWJ1ZyB0YXJnZXQuCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0ZXBwaW5nTW9kZVRhcmdldCB7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZGVidWcgdGFyZ2V0IHN1cHBvcnRzIGluc3RydWN0aW9uIHN0ZXBwaW5nLgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGRlYnVnIHRhcmdldCBzdXBwb3J0cyBpbnN0cnVjdGlvbiBzdGVwcGluZwotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNJbnN0cnVjdGlvblN0ZXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIHN0ZXBwaW5nIGFyZSBlbmFibGVkIGluIHRoaXMgZGVidWcgdGFyZ2V0LgotCSAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIHN0ZXBwaW5nIGFyZSBlbmFibGVkIGluIHRoaXMgZGVidWcgdGFyZ2V0Ci0JICovCi0Jdm9pZCBlbmFibGVJbnN0cnVjdGlvblN0ZXBwaW5nKGJvb2xlYW4gZW5hYmxlZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBzdGVwcGluZyBhcmUgY3VycmVudGx5IGVuYWJsZWQgaW4gdGhpcyBkZWJ1ZyB0YXJnZXQuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBzdGVwcGluZyBhcmUgY3VycmVudGx5IGVuYWJsZWQgaW4gdGhpcyBkZWJ1ZyB0YXJnZXQKLQkgKi8KLQlib29sZWFuIGlzSW5zdHJ1Y3Rpb25TdGVwcGluZ0VuYWJsZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9JVGFyZ2V0UHJvcGVydGllcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lUYXJnZXRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTI5MmUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL0lUYXJnZXRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0lOU1RSVUNUSU9OX1NURVBQSU5HX01PREUgPSAiaW5zdHJ1Y3Rpb25fc3RlcHBpbmdfbW9kZSI7Ci0KLQkvKioKLQkgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgdGFyZ2V0LgotCSAqIEhhcyBubyBhZmZlY3QgaWYgdGhlIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIHRhcmdldC4KLQkgKiBIYXMgbm8gYWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvUERlYnVnRWxlbWVudFN0YXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvUERlYnVnRWxlbWVudFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODI0MzguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL21vZGVsL1BEZWJ1Z0VsZW1lbnRTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z0VsZW1lbnRTdGF0ZSB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIFBEZWJ1Z0VsZW1lbnRTdGF0ZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBVTkRFRklORUQgPSBuZXcgUERlYnVnRWxlbWVudFN0YXRlKCJ1bmRlZmluZWQiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBURVJNSU5BVElORyA9IG5ldyBQRGVidWdFbGVtZW50U3RhdGUoInRlcm1pbmF0aW5nIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQRGVidWdFbGVtZW50U3RhdGUgVEVSTUlOQVRFRCA9IG5ldyBQRGVidWdFbGVtZW50U3RhdGUoInRlcm1pbmF0ZWQiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBESVNDT05ORUNUSU5HID0gbmV3IFBEZWJ1Z0VsZW1lbnRTdGF0ZSgiZGlzY29ubmVjdGluZyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUERlYnVnRWxlbWVudFN0YXRlIERJU0NPTk5FQ1RFRCA9IG5ldyBQRGVidWdFbGVtZW50U3RhdGUoImRpc2Nvbm5lY3RlZCIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUERlYnVnRWxlbWVudFN0YXRlIFJFU1VNSU5HID0gbmV3IFBEZWJ1Z0VsZW1lbnRTdGF0ZSgicmVzdW1pbmciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBSRVNVTUVEID0gbmV3IFBEZWJ1Z0VsZW1lbnRTdGF0ZSgicmVzdW1lZCIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUERlYnVnRWxlbWVudFN0YXRlIFNURVBQSU5HID0gbmV3IFBEZWJ1Z0VsZW1lbnRTdGF0ZSgic3RlcHBpbmciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBTVEVQUEVEID0gbmV3IFBEZWJ1Z0VsZW1lbnRTdGF0ZSgic3RlcHBlZCIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUERlYnVnRWxlbWVudFN0YXRlIFNVU1BFTkRJTkcgPSBuZXcgUERlYnVnRWxlbWVudFN0YXRlKCJzdXNwZW5kaW5nIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQRGVidWdFbGVtZW50U3RhdGUgU1VTUEVOREVEID0gbmV3IFBEZWJ1Z0VsZW1lbnRTdGF0ZSgic3VzcGVuZGVkIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQRGVidWdFbGVtZW50U3RhdGUgUkVTVEFSVElORyA9IG5ldyBQRGVidWdFbGVtZW50U3RhdGUoInJlc3RhcnRpbmciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBFWElURUQgPSBuZXcgUERlYnVnRWxlbWVudFN0YXRlKCJleGl0ZWQiKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9QVmFyaWFibGVGb3JtYXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9tb2RlbC9QVmFyaWFibGVGb3JtYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiZWRiMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvbW9kZWwvUFZhcmlhYmxlRm9ybWF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUFZhcmlhYmxlRm9ybWF0IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgUFZhcmlhYmxlRm9ybWF0KFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgc3RhdGljIFBWYXJpYWJsZUZvcm1hdCBnZXRGb3JtYXQoaW50IGNvZGUpIHsKLQkJc3dpdGNoKGNvZGUpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIE5BVFVSQUw7Ci0JCWNhc2UgMToKLQkJCXJldHVybiBERUNJTUFMOwotCQljYXNlIDI6Ci0JCQlyZXR1cm4gQklOQVJZOwotCQljYXNlIDM6Ci0JCQlyZXR1cm4gT0NUQUw7Ci0JCWNhc2UgNDoKLQkJCXJldHVybiBIRVhBREVDSU1BTDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBERUNJTUFMOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFZhcmlhYmxlRm9ybWF0IE5BVFVSQUwgPSBuZXcgUFZhcmlhYmxlRm9ybWF0KCJuYXR1cmFsIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQVmFyaWFibGVGb3JtYXQgREVDSU1BTCA9IG5ldyBQVmFyaWFibGVGb3JtYXQoImRlY2ltYWwiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBWYXJpYWJsZUZvcm1hdCBCSU5BUlkgPSBuZXcgUFZhcmlhYmxlRm9ybWF0KCJiaW5hcnkiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBWYXJpYWJsZUZvcm1hdCBPQ1RBTCA9IG5ldyBQVmFyaWFibGVGb3JtYXQoIm9jdGFsIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQVmFyaWFibGVGb3JtYXQgSEVYQURFQ0lNQUwgPSBuZXcgUFZhcmlhYmxlRm9ybWF0KCJkZXhhZGVjaW1hbCIpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9BYnNvbHV0ZVBhdGhTb3VyY2VDb250YWluZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvQWJzb2x1dGVQYXRoU291cmNlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWE4ZjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9BYnNvbHV0ZVBhdGhTb3VyY2VDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5BYnN0cmFjdFNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkxvY2FsRmlsZVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnNvbHV0ZVBhdGhTb3VyY2VDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUNvbnRhaW5lciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLmNvbnRhaW5lclR5cGUuYWJzb2x1dGVQYXRoIjsKLQotCXByaXZhdGUgT2JqZWN0W10gZmluZFNvdXJjZUVsZW1lbnRCeUZpbGUoRmlsZSBmaWxlKSB7Ci0JCUlGaWxlW10gd2ZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCWlmICh3ZmlsZXMubGVuZ3RoID4gMCkKLQkJCXJldHVybiB3ZmlsZXM7Ci0KLQkJdHJ5IHsKLQkJCS8vIENoZWNrIHRoZSBjYW5vbmljYWwgcGF0aCBhcyB3ZWxsIHRvIHN1cHBvcnQgY2FzZSBpbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgbGlrZSBXaW5kb3dzLgotCQkJd2ZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlLmdldENhbm9uaWNhbFBhdGgoKSkpOwotCQkJaWYgKHdmaWxlcy5sZW5ndGggPiAwKQotCQkJCXJldHVybiB3ZmlsZXM7Ci0KLQkJCS8vIFRoZSBmaWxlIGlzIG5vdCBhbHJlYWR5IGluIHRoZSB3b3Jrc3BhY2Ugc28gdHJ5IHRvIGNyZWF0ZSBhbiBleHRlcm5hbCB0cmFuc2xhdGlvbiB1bml0IGZvciBpdC4KLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldERpcmVjdG9yKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgIiIpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCQkvL1RPRE8KLQkJCQkvL1N0cmluZyBpZCA9IENvcmVNb2RlbC5nZXRSZWdpc3RlZENvbnRlbnRUeXBlSWQocHJvamVjdC5nZXRQcm9qZWN0KCksIHBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQkJLy9yZXR1cm4gbmV3IEV4dGVybmFsVHJhbnNsYXRpb25Vbml0W10geyBuZXcgRXh0ZXJuYWxUcmFuc2xhdGlvblVuaXQocHJvamVjdCwgbmV3IFBhdGgoZmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpLCBpZCkgfTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvLyBpZ25vcmUgaWYgZ2V0Q2Fub25pY2FsUGF0aCB0aHJvd3MKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJLy8gSWYgd2UgY2FuJ3QgY3JlYXRlIGFuIEVUVSB0aGVuIGZhbGwgYmFjayBvbiBMb2NhbEZpbGVTdG9yYWdlLgotCQlyZXR1cm4gbmV3IExvY2FsRmlsZVN0b3JhZ2VbXSB7IG5ldyBMb2NhbEZpbGVTdG9yYWdlKGZpbGUpIH07Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRBYnNvbHV0ZUZpbGVQYXRoKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBpc1ZhbGlkQWJzb2x1dGVGaWxlUGF0aChuZXcgRmlsZShuYW1lKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRBYnNvbHV0ZUZpbGVQYXRoKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZS5pc0Fic29sdXRlKCkgJiYgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpOwotCX0KLQlwdWJsaWMgT2JqZWN0W10gZmluZFNvdXJjZUVsZW1lbnRzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCQkJaWYgKGlzVmFsaWRBYnNvbHV0ZUZpbGVQYXRoKGZpbGUpKSB7Ci0JCQkJcmV0dXJuIGZpbmRTb3VyY2VFbGVtZW50QnlGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIkFic29sdXRlUGF0aFNvdXJjZUNvbnRhaW5lci4wIik7Ci0JfQotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlQ29udGFpbmVyVHlwZShUWVBFX0lEKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JRGlyZWN0b3J5U291cmNlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOTkxZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlyZWN0b3J5U291cmNlTG9jYXRpb24gZXh0ZW5kcyBJUFNvdXJjZUxvY2F0aW9uIHsKLQlJUGF0aCBnZXREaXJlY3RvcnkoKTsKLQlJUGF0aCBnZXRBc3NvY2lhdGlvbigpOwotCWJvb2xlYW4gc2VhcmNoU3ViZm9sZGVycygpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JUFNvdXJjZUxvY2F0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lQU291cmNlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZGU2ZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lQU291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUFNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JT2JqZWN0IGZpbmRTb3VyY2VFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQlTdHJpbmcgZ2V0TWVtZW50bygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXZvaWQgaW5pdGlhbGl6ZUZyb20oU3RyaW5nIG1lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCWJvb2xlYW4gc2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoKTsKLQl2b2lkIHNldFNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKGJvb2xlYW4gc2VhcmNoKTsKLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvSVBTb3VyY2VMb2NhdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lQU291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGYwMzYxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvSVBTb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUFNvdXJjZUxvY2F0b3IgZXh0ZW5kcyBJU291cmNlTG9jYXRvciB7Ci0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCWludCBnZXRMaW5lTnVtYmVyKElTdGFja0ZyYW1lIHN0YWNrRnJhbWUpOwotCUlQU291cmNlTG9jYXRpb25bXSBnZXRTb3VyY2VMb2NhdGlvbnMoKTsKLQl2b2lkIHNldFNvdXJjZUxvY2F0aW9ucyhJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zKTsKLQlib29sZWFuIGNvbnRhaW5zKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0JT2JqZWN0IGZpbmRTb3VyY2VFbGVtZW50KFN0cmluZyBmaWxlTmFtZSk7Ci0JYm9vbGVhbiBzZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpOwotCXZvaWQgc2V0U2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoYm9vbGVhbiBzZWFyY2gpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JUFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lQU291cmNlTG9va3VwRGlyZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MzE3Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL0lQU291cmNlTG9va3VwRGlyZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBTb3VyY2VMb29rdXBEaXJlY3RvciB7Ci0JcHVibGljIElQYXRoIGdldENvbXBpbGF0aW9uUGF0aChTdHJpbmcgc291cmNlTmFtZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvSVByb2plY3RTb3VyY2VMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JUHJvamVjdFNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOWQwOTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JUHJvamVjdFNvdXJjZUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RTb3VyY2VMb2NhdGlvbiBleHRlbmRzIElQU291cmNlTG9jYXRpb24gewotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQlib29sZWFuIGlzR2VuZXJpYygpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JU291cmNlTG9va3VwQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvSVNvdXJjZUxvb2t1cENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDA2NjEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9JU291cmNlTG9va3VwQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwRGlyZWN0b3I7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUxvb2t1cENoYW5nZUxpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBzb3VyY2VDb250YWluZXJzQ2hhbmdlZChJU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9NYXBwaW5nU291cmNlQ29udGFpbmVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL01hcHBpbmdTb3VyY2VDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3OWU1YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL01hcHBpbmdTb3VyY2VDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5BYnN0cmFjdFNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLk1hcEVudHJ5U291cmNlQ29udGFpbmVyOwotCi0vKioKLSAqIFRoZSBzb3VyY2UgY29udGFpbmVyIGZvciBwYXRoIG1hcHBpbmdzLgotICovCi1wdWJsaWMgY2xhc3MgTWFwcGluZ1NvdXJjZUNvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0U291cmNlQ29udGFpbmVyIHsKLQkvKioKLQkgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hcHBpbmcgc291cmNlIGNvbnRhaW5lciB0eXBlICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5jZHQuZGVidWcuY29yZS5jb250YWluZXJUeXBlLm1hcHBpbmc8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuY29udGFpbmVyVHlwZS5tYXBwaW5nIjsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgQXJyYXlMaXN0PE1hcEVudHJ5U291cmNlQ29udGFpbmVyPiBmQ29udGFpbmVyczsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYXBwaW5nU291cmNlQ29udGFpbmVyLgotCSAqLwotCXB1YmxpYyBNYXBwaW5nU291cmNlQ29udGFpbmVyKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQkJZkNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0PE1hcEVudHJ5U291cmNlQ29udGFpbmVyPigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXIjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIElTb3VyY2VDb250YWluZXJUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VDb250YWluZXJUeXBlKFRZUEVfSUQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNpc0NvbXBvc2l0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiAhZkNvbnRhaW5lcnMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNmaW5kU291cmNlRWxlbWVudHMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZmluZFNvdXJjZUVsZW1lbnRzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaW5kU291cmNlRWxlbWVudHMobmFtZSwgZ2V0U291cmNlQ29udGFpbmVycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZmluZFNvdXJjZUVsZW1lbnRzKFN0cmluZyBuYW1lLCBJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVycykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PE9iamVjdD4gcmVzdWx0cyA9IG51bGw7Ci0JCUNvcmVFeGNlcHRpb24gc2luZ2xlID0gbnVsbDsKLQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBudWxsOwotCQlpZiAoaXNGaW5kRHVwbGljYXRlcygpKSB7Ci0JCQlyZXN1bHRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU291cmNlQ29udGFpbmVyIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbaV07Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIG9iamVjdHMgPSBjb250YWluZXIuZmluZFNvdXJjZUVsZW1lbnRzKG5hbWUpOwotCQkJCWlmIChvYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKGlzRmluZER1cGxpY2F0ZXMoKSkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvYmplY3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJcmVzdWx0cy5hZGQob2JqZWN0c1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAob2JqZWN0cy5sZW5ndGggPT0gMSkgewotCQkJCQkJCXJldHVybiBvYmplY3RzOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG9iamVjdHNbMF0gfTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmIChzaW5nbGUgPT0gbnVsbCkgewotCQkJCQlzaW5nbGUgPSBlOwotCQkJCX0gZWxzZSBpZiAobXVsdGlTdGF0dXMgPT0gbnVsbCkgewotCQkJCQltdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhEZWJ1Z1BsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIERlYnVnUGx1Z2luLklOVEVSTkFMX0VSUk9SLCBuZXcgSVN0YXR1c1tdIHsgc2luZ2xlLmdldFN0YXR1cygpIH0sIFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiTWFwcGluZ1NvdXJjZUNvbnRhaW5lci4wIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJCW11bHRpU3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJCQl9IGVsc2UgewotCQkJCQltdWx0aVN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHRzID09IG51bGwpIHsKLQkJCWlmIChtdWx0aVN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obXVsdGlTdGF0dXMpOwotCQkJfSBlbHNlIGlmIChzaW5nbGUgIT0gbnVsbCkgewotCQkJCXRocm93IHNpbmdsZTsKLQkJCX0KLQkJCXJldHVybiBFTVBUWTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0cy50b0FycmF5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkFic3RyYWN0U291cmNlQ29udGFpbmVyI2dldFNvdXJjZUNvbnRhaW5lcnMoKQotCSAqLwotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gZ2V0U291cmNlQ29udGFpbmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcltdKSBmQ29udGFpbmVycy50b0FycmF5KG5ldyBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcltmQ29udGFpbmVycy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYXBFbnRyeShNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBlbnRyeSkgewotCQlmQ29udGFpbmVycy5hZGQoZW50cnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1hcEVudHJpZXMoTWFwRW50cnlTb3VyY2VDb250YWluZXJbXSBlbnRyaWVzKSB7Ci0JCWZDb250YWluZXJzLmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNYXBFbnRyeShNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBlbnRyeSkgewotCQlmQ29udGFpbmVycy5yZW1vdmUoZW50cnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1hcEVudHJpZXMoTWFwRW50cnlTb3VyY2VDb250YWluZXJbXSBlbnRyaWVzKSB7Ci0JCWZDb250YWluZXJzLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJSXRlcmF0b3I8TWFwRW50cnlTb3VyY2VDb250YWluZXI+IGl0ID0gZkNvbnRhaW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChJU291cmNlQ29udGFpbmVyKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCQlmQ29udGFpbmVycy5jbGVhcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUl0ZXJhdG9yPE1hcEVudHJ5U291cmNlQ29udGFpbmVyPiBpdCA9IGZDb250YWluZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCSgoSVNvdXJjZUNvbnRhaW5lcikgaXQubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCX0KLQkJZkNvbnRhaW5lcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgTWFwcGluZ1NvdXJjZUNvbnRhaW5lciBjb3B5KCkgewotCQlNYXBwaW5nU291cmNlQ29udGFpbmVyIGNvcHkgPSBuZXcgTWFwcGluZ1NvdXJjZUNvbnRhaW5lcihmTmFtZSk7Ci0JCU1hcEVudHJ5U291cmNlQ29udGFpbmVyW10gZW50cmllcyA9IG5ldyBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcltmQ29udGFpbmVycy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsKLQkJCWNvcHkuYWRkTWFwRW50cnkoKChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcikgZkNvbnRhaW5lcnMuZ2V0KGkpKS5jb3B5KCkpOwotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRDb21waWxhdGlvblBhdGgoU3RyaW5nIHNvdXJjZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHNvdXJjZU5hbWUpOwotCQlJUGF0aCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBlbnRyeSA9IChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcikgY29udGFpbmVyc1tpXTsKLQkJCQlJUGF0aCBsb2NhbCA9IGVudHJ5LmdldExvY2FsUGF0aCgpOwotCQkJCWlmIChsb2NhbC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCXJlc3VsdCA9IGVudHJ5LmdldEJhY2tlbmRQYXRoKCkuYXBwZW5kKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhsb2NhbC5zZWdtZW50Q291bnQoKSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTG9va3VwRGlyZWN0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvUFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzM2YWQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTG9va3VwRGlyZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5BYnN0cmFjdFNvdXJjZUxvb2t1cERpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuRGlyZWN0b3J5U291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuRm9sZGVyU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuUHJvamVjdFNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLldvcmtzcGFjZVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlBEaXJlY3RvcnlTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlBTb3VyY2VMb29rdXBQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIFBTb3VyY2VMb29rdXBEaXJlY3RvciBleHRlbmRzIEFic3RyYWN0U291cmNlTG9va3VwRGlyZWN0b3IgaW1wbGVtZW50cyBJUFNvdXJjZUxvb2t1cERpcmVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBmU3VwcG9ydGVkVHlwZXM7Ci0Jc3RhdGljIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmU3VwcG9ydGVkVHlwZXMuYWRkKFdvcmtzcGFjZVNvdXJjZUNvbnRhaW5lci5UWVBFX0lEKTsKLQkJZlN1cHBvcnRlZFR5cGVzLmFkZChQcm9qZWN0U291cmNlQ29udGFpbmVyLlRZUEVfSUQpOwotCQlmU3VwcG9ydGVkVHlwZXMuYWRkKEZvbGRlclNvdXJjZUNvbnRhaW5lci5UWVBFX0lEKTsKLQkJZlN1cHBvcnRlZFR5cGVzLmFkZChEaXJlY3RvcnlTb3VyY2VDb250YWluZXIuVFlQRV9JRCk7Ci0JCS8qKgotCQkgKglObyBNYXBwaW5nCi0JCSAqIAlmU3VwcG9ydGVkVHlwZXMuYWRkKE1hcHBpbmdTb3VyY2VDb250YWluZXIuVFlQRV9JRCk7Ci0JCSAqLwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYXJ0aWNpcGFudHMoKSB7Ci0JCWFkZFBhcnRpY2lwYW50cyhuZXcgSVNvdXJjZUxvb2t1cFBhcnRpY2lwYW50W10geyBuZXcgUFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50KCkgfSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU291cmNlQ29udGFpbmVyVHlwZShJU291cmNlQ29udGFpbmVyVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBmU3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZS5nZXRJZCgpKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVBCcmVha3BvaW50IGJyZWFrcG9pbnQpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBoYW5kbGUgPSBicmVha3BvaW50LmdldFNvdXJjZUhhbmRsZSgpOwotCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlpZiAoY29udGFpbnMoY29udGFpbmVyc1tpXSwgaGFuZGxlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoY29udGFpbnMoY29udGFpbmVyc1tpXSwgcHJvamVjdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoSVNvdXJjZUNvbnRhaW5lciBjb250YWluZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2plY3RTb3VyY2VDb250YWluZXIgJiYgKChQcm9qZWN0U291cmNlQ29udGFpbmVyKSBjb250YWluZXIpLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVyczsKLQkJCWNvbnRhaW5lcnMgPSBjb250YWluZXIuZ2V0U291cmNlQ29udGFpbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKGNvbnRhaW5zKGNvbnRhaW5lcnNbaV0sIHByb2plY3QpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoSVNvdXJjZUNvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBzb3VyY2VOYW1lKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChzb3VyY2VOYW1lKTsKLQkJaWYgKCFwYXRoLmlzVmFsaWRQYXRoKHNvdXJjZU5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvamVjdFNvdXJjZUNvbnRhaW5lcikgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoUHJvamVjdFNvdXJjZUNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRQcm9qZWN0KCk7Ci0JCQlJUGF0aCBwcm9qUGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChwcm9qUGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoUHJvamVjdFNvdXJjZUNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvalBhdGguc2VnbWVudENvdW50KCkpKTsKLQkJCQlyZXR1cm4gKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKTsKLQkJCX0KLQkJfQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRm9sZGVyU291cmNlQ29udGFpbmVyKSB7Ci0JCQlJQ29udGFpbmVyIGZvbGRlciA9ICgoRm9sZGVyU291cmNlQ29udGFpbmVyKSBjb250YWluZXIpLmdldENvbnRhaW5lcigpOwotCQkJSVBhdGggZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRMb2NhdGlvbigpOwotCQkJaWYgKGZvbGRlclBhdGguaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCUlGaWxlIGZpbGUgPSAoKEZvbGRlclNvdXJjZUNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRDb250YWluZXIoKS5nZXRGaWxlKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmb2xkZXJQYXRoLnNlZ21lbnRDb3VudCgpKSk7Ci0JCQkJcmV0dXJuIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIpIHsKLQkJCUZpbGUgZGlyID0gKChQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyKSBjb250YWluZXIpLmdldERpcmVjdG9yeSgpOwotCQkJYm9vbGVhbiBzZWFyY2hTdWJmb2xkZXJzID0gKChQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyKSBjb250YWluZXIpLnNlYXJjaFN1YmZvbGRlcnMoKTsKLQkJCUlQYXRoIGRpclBhdGggPSBuZXcgUGF0aChkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKHNlYXJjaFN1YmZvbGRlcnMgfHwgZGlyUGF0aC5zZWdtZW50Q291bnQoKSArIDEgPT0gcGF0aC5zZWdtZW50Q291bnQoKSkKLQkJCQlyZXR1cm4gZGlyUGF0aC5pc1ByZWZpeE9mKHBhdGgpOwotCQl9Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNYXBwaW5nU291cmNlQ29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gKCgoTWFwcGluZ1NvdXJjZUNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRDb21waWxhdGlvblBhdGgoc291cmNlTmFtZSkgIT0gbnVsbCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUlTb3VyY2VDb250YWluZXJbXSBjb250YWluZXJzOwotCQkJY29udGFpbmVycyA9IGNvbnRhaW5lci5nZXRTb3VyY2VDb250YWluZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlpZiAoY29udGFpbnMoY29udGFpbmVyc1tpXSwgc291cmNlTmFtZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBJUGF0aCBnZXRDb21waWxhdGlvblBhdGgoU3RyaW5nIHNvdXJjZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCUlTb3VyY2VDb250YWluZXJbXSBjb250YWluZXJzID0gZ2V0U291cmNlQ29udGFpbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCUlQYXRoIGNwID0gZ2V0Q29tcGlsYXRpb25QYXRoKGNvbnRhaW5lcnNbaV0sIHNvdXJjZU5hbWUpOwotCQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCQlwYXRoID0gY3A7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCXByaXZhdGUgSVBhdGggZ2V0Q29tcGlsYXRpb25QYXRoKElTb3VyY2VDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgc291cmNlTmFtZSkgewotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1hcHBpbmdTb3VyY2VDb250YWluZXIpIHsKLQkJCXBhdGggPSAoKE1hcHBpbmdTb3VyY2VDb250YWluZXIpIGNvbnRhaW5lcikuZ2V0Q29tcGlsYXRpb25QYXRoKHNvdXJjZU5hbWUpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVyczsKLQkJCQljb250YWluZXJzID0gY29udGFpbmVyLmdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcGF0aCA9IGdldENvbXBpbGF0aW9uUGF0aChjb250YWluZXJzW2ldLCBzb3VyY2VOYW1lKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvY29yZS9zb3VyY2Vsb29rdXAvU291cmNlTG9va3VwRmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9Tb3VyY2VMb29rdXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NjgwYTIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9Tb3VyY2VMb29rdXBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5QRGlyZWN0b3J5U291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlBQcm9qZWN0U291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlBTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5QU291cmNlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUxvb2t1cEZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RTb3VyY2VMb2NhdGlvbiBjcmVhdGVQcm9qZWN0U291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFBQcm9qZWN0U291cmNlTG9jYXRpb24ocHJvamVjdCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RTb3VyY2VMb2NhdGlvbiBjcmVhdGVQcm9qZWN0U291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBnZW5lcmF0ZWQpIHsKLQkJcmV0dXJuIG5ldyBQUHJvamVjdFNvdXJjZUxvY2F0aW9uKHByb2plY3QsIGdlbmVyYXRlZCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgSURpcmVjdG9yeVNvdXJjZUxvY2F0aW9uIGNyZWF0ZURpcmVjdG9yeVNvdXJjZUxvY2F0aW9uKElQYXRoIGRpcmVjdG9yeSwgSVBhdGggYXNzb2NpYXRpb24sIGJvb2xlYW4gc2VhcmNoU3ViZm9sZGVycykgewotCQlyZXR1cm4gbmV3IFBEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbihkaXJlY3RvcnksIGFzc29jaWF0aW9uLCBzZWFyY2hTdWJmb2xkZXJzKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBJUFNvdXJjZUxvY2F0b3IgY3JlYXRlU291cmNlTG9jYXRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgUFNvdXJjZU1hbmFnZXIobmV3IFBTb3VyY2VMb2NhdG9yKHByb2plY3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL1NvdXJjZUxvb2t1cE1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL1NvdXJjZUxvb2t1cE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDRmZGIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9Tb3VyY2VMb29rdXBNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VMb29rdXBNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLlNvdXJjZUxvb2t1cE1lc3NhZ2VzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIFNvdXJjZUxvb2t1cE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL1NvdXJjZUxvb2t1cE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2NvcmUvc291cmNlbG9va3VwL1NvdXJjZUxvb2t1cE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yjc5YzcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9jb3JlL3NvdXJjZWxvb2t1cC9Tb3VyY2VMb29rdXBNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU1hcHBpbmdTb3VyY2VDb250YWluZXIuMD1Tb3VyY2UgbG9va3VwIGVycm9yCi1BYnNvbHV0ZVBhdGhTb3VyY2VDb250YWluZXIuMD1BYnNvbHV0ZSBGaWxlIFBhdGgKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9JbnRlcm5hbERlYnVnQ29yZU1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2IxZjMzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9JbnRlcm5hbERlYnVnQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLkludGVybmFsRGVidWdDb3JlTWVzc2FnZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEludGVybmFsRGVidWdDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL0ludGVybmFsRGVidWdDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhZDcwOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBHbG9iYWxWYXJpYWJsZU1hbmFnZXIuMD1JbnZhbGlkIGdsb2JhbCB2YXJpYWJsZXMgZGF0YS4KLVBUUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uLjA9RXhwcmVzc2lvbiAnJ3swfScnIGV2YWx1YXRlZCB0byBpbnZhbGlkIGFkZHJlc3MgdmFsdWU6IHsxfS4KLVBUUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uLjE9SW52YWxpZCBleHByZXNzaW9uIHR5cGU6ICcnezB9JycKLVBUUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uLjI9SW52YWxpZCBleHByZXNzaW9uOiAnJ3swfScnCi1QVFBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbi4zPU1lbW9yeSBpbml0aWFsaXphdGlvbjogaW52YWxpZCBtZW1lbnRvLgotUERlYnVnQ29uZmlndXJhdGlvbi4wPVRoaXMgZGVidWdnZXIgbm8gbG9uZ2VyIHN1cHBvcnRzIHRoaXMgb3BlcmF0aW9uCi1QRGVidWdBZGFwdGVyLjA9VGhpcyBkZWJ1Z2dlciBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBleHRlcm5hbCBmaWxlcwotUERlYnVnQWRhcHRlci4xPURlYnVnZ2VyIFByb2Nlc3MKLVBEZWJ1Z0FkYXB0ZXIuUHJvZ3JhbV9maWxlX25vdF9zcGVjaWZpZWQ9UHJvZ3JhbSBmaWxlIG5vdCBzcGVjaWZpZWQKLVBSZWdpc3Rlck1hbmFnZXIuMD1VbmFibGUgdG8gcmVzdG9yZSByZWdpc3RlciBncm91cHMgLSBpbnZhbGlkIG1lbWVudG8uCi1QUmVnaXN0ZXJNYW5hZ2VyLjE9VW5hYmxlIHRvIHJlc3RvcmUgcmVnaXN0ZXIgZ3JvdXBzIC0gZXhwZWN0aW5nIHJlZ2lzdGVyIGdyb3VwIGxpc3QgZWxlbWVudC4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QQnJlYWtwb2ludE1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QQnJlYWtwb2ludE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkMzc3Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUEJyZWFrcG9pbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludHNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Mb2NhbEZpbGVTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5JUERlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuUERlYnVnQnJlYWtwb2ludEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBBZGRyZXNzQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBGdW5jdGlvbkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFdhdGNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElBZGRyZXNzTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElGdW5jdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTGluZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElCcmVha3BvaW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUNyZWF0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURlc3Ryb3llZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tYW5hZ2VyLklQRElCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFkZHJlc3NCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUZ1bmN0aW9uQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYXRpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJV2F0Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVBTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5QU291cmNlTG9va3VwRGlyZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQQnJlYWtwb2ludE1hbmFnZXIgaW1wbGVtZW50cyBJQnJlYWtwb2ludHNMaXN0ZW5lciwgSUJyZWFrcG9pbnRNYW5hZ2VyTGlzdGVuZXIsIElQRElFdmVudExpc3RlbmVyLCBJQWRhcHRhYmxlLCBJUEJyZWFrcG9pbnRNYW5hZ2VyIHsKLQlwcml2YXRlIGNsYXNzIEJyZWFrcG9pbnRNYXAgewotCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElQQnJlYWtwb2ludD4gZlBCcmVha3BvaW50czsKLQkJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJUERJQnJlYWtwb2ludD4gZlBESUJyZWFrcG9pbnRzOwotCi0JCXByb3RlY3RlZCBCcmVha3BvaW50TWFwKCkgewotCQkJZlBCcmVha3BvaW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVBCcmVha3BvaW50PigxMCk7Ci0JCQlmUERJQnJlYWtwb2ludHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQRElCcmVha3BvaW50PigxMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGJyZWFrcG9pbnQKLQkJICogQHBhcmFtIHBkaUJyZWFrcG9pbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzU2FtZUJyZWFrcG9pbnQoSVBCcmVha3BvaW50IGJyZWFrcG9pbnQsIElQRElCcmVha3BvaW50IHBkaUJyZWFrcG9pbnQpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUEZ1bmN0aW9uQnJlYWtwb2ludCAmJiBwZGlCcmVha3BvaW50IGluc3RhbmNlb2YgSVBESUZ1bmN0aW9uQnJlYWtwb2ludCkgewotCQkJCQlyZXR1cm4gKCgoSVBGdW5jdGlvbkJyZWFrcG9pbnQpIGJyZWFrcG9pbnQpLmdldEZ1bmN0aW9uKCkuY29tcGFyZVRvKAotCQkJCQkJCSgoSVBESUZ1bmN0aW9uQnJlYWtwb2ludCkgcGRpQnJlYWtwb2ludCkuZ2V0TG9jYXRvcigpLmdldEZ1bmN0aW9uKCkpID09IDApOwotCQkJCX0KLQkJCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQQWRkcmVzc0JyZWFrcG9pbnQgJiYgcGRpQnJlYWtwb2ludCBpbnN0YW5jZW9mIElQRElBZGRyZXNzQnJlYWtwb2ludCkgewotCQkJCQlyZXR1cm4gKCgoSVBBZGRyZXNzQnJlYWtwb2ludCkgYnJlYWtwb2ludCkuZ2V0QWRkcmVzcygpKS5lcXVhbHMoKCgoSVBESUFkZHJlc3NCcmVha3BvaW50KSBwZGlCcmVha3BvaW50KQotCQkJCQkJCS5nZXRMb2NhdG9yKCkuZ2V0QWRkcmVzcygpKSk7Ci0JCQkJfQotCQkJCWlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSVBMaW5lQnJlYWtwb2ludCAmJiBwZGlCcmVha3BvaW50IGluc3RhbmNlb2YgSVBESUxpbmVCcmVha3BvaW50KSB7Ci0JCQkJCUlQRElMb2NhdG9yIGxvY2F0aW9uID0gKChJUERJTGluZUJyZWFrcG9pbnQpIHBkaUJyZWFrcG9pbnQpLmdldExvY2F0b3IoKTsKLQkJCQkJU3RyaW5nIGZpbGUgPSBsb2NhdGlvbi5nZXRGaWxlKCk7Ci0JCQkJCVN0cmluZyBzb3VyY2VIYW5kbGUgPSBmaWxlOwotCQkJCQlpZiAoIWlzRW1wdHkoZmlsZSkpIHsKLQkJCQkJCU9iamVjdCBzb3VyY2VFbGVtZW50ID0gZ2V0U291cmNlRWxlbWVudChmaWxlKTsKLQkJCQkJCWlmIChzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCQlzb3VyY2VIYW5kbGUgPSAoKElGaWxlKSBzb3VyY2VFbGVtZW50KS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJCX0gZWxzZSBpZiAoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlKSB7Ci0JCQkJCQkJc291cmNlSGFuZGxlID0gKChJU3RvcmFnZSkgc291cmNlRWxlbWVudCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgYnBTb3VyY2VIYW5kbGUgPSAoKElQTGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnQpLmdldFNvdXJjZUhhbmRsZSgpOwotCQkJCQkJaWYgKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBMb2NhbEZpbGVTdG9yYWdlKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJYnBTb3VyY2VIYW5kbGUgPSBuZXcgRmlsZShicFNvdXJjZUhhbmRsZSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzb3VyY2VIYW5kbGUuZXF1YWxzKGJwU291cmNlSGFuZGxlKQotCQkJCQkJCQkmJiBsb2NhdGlvbi5nZXRMaW5lTnVtYmVyKCkgPT0gKChJUExpbmVCcmVha3BvaW50KSBicmVha3BvaW50KS5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUFdhdGNocG9pbnQgJiYgcGRpQnJlYWtwb2ludCBpbnN0YW5jZW9mIElQRElXYXRjaHBvaW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUFdhdGNocG9pbnQgd2F0Y2hwb2ludCA9IChJUFdhdGNocG9pbnQpIGJyZWFrcG9pbnQ7Ci0JCQkJCQlJUERJV2F0Y2hwb2ludCBwZGlXYXRjaHBvaW50ID0gKElQRElXYXRjaHBvaW50KSBwZGlCcmVha3BvaW50OwotCQkJCQkJcmV0dXJuICh3YXRjaHBvaW50LmdldEV4cHJlc3Npb24oKS5jb21wYXJlVG8ocGRpV2F0Y2hwb2ludC5nZXRXYXRjaEV4cHJlc3Npb24oKSkgPT0gMAotCQkJCQkJCQkmJiB3YXRjaHBvaW50LmlzUmVhZFR5cGUoKSA9PSBwZGlXYXRjaHBvaW50LmlzUmVhZFR5cGUoKSAmJiB3YXRjaHBvaW50LmlzV3JpdGVUeXBlKCkgPT0gcGRpV2F0Y2hwb2ludAotCQkJCQkJCQkuaXNXcml0ZVR5cGUoKSk7Ci0JCQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlBCcmVha3BvaW50cy5jbGVhcigpOwotCQkJZlBESUJyZWFrcG9pbnRzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIElQQnJlYWtwb2ludFtdIGdldEFsbFBCcmVha3BvaW50cygpIHsKLQkJCUNvbGxlY3Rpb248SVBCcmVha3BvaW50PiBjb2xsZWN0aW9uID0gZlBCcmVha3BvaW50cy52YWx1ZXMoKTsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkobmV3IElQQnJlYWtwb2ludFtjb2xsZWN0aW9uLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBJUERJQnJlYWtwb2ludFtdIGdldEFsbFBESUJyZWFrcG9pbnRzKCkgewotCQkJQ29sbGVjdGlvbjxJUERJQnJlYWtwb2ludD4gY29sbGVjdGlvbiA9IGZQRElCcmVha3BvaW50cy52YWx1ZXMoKTsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkobmV3IElQRElCcmVha3BvaW50W2NvbGxlY3Rpb24uc2l6ZSgpXSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHBkaUJwdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgSVBCcmVha3BvaW50IGdldFBCcmVha3BvaW50KElQRElCcmVha3BvaW50IHBkaUJwdCkgewotCQkJSVBCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBmUEJyZWFrcG9pbnRzLmdldChTdHJpbmcudmFsdWVPZihwZGlCcHQuZ2V0SW50ZXJuYWxJRCgpKSk7Ci0JCQlpZiAoYnJlYWtwb2ludCA9PSBudWxsKSB7Ci0JCQkJSVBCcmVha3BvaW50W10gYnB0cyA9IGdldEFsbFBCcmVha3BvaW50cygpOwotCQkJCWZvciAoSVBCcmVha3BvaW50IGJwdCA6IGJwdHMpIHsKLQkJCQkJaWYgKGlzU2FtZUJyZWFrcG9pbnQoYnB0LCBwZGlCcHQpKSB7Ci0JCQkJCQlmUEJyZWFrcG9pbnRzLnB1dChTdHJpbmcudmFsdWVPZihwZGlCcHQuZ2V0SW50ZXJuYWxJRCgpKSwgYnB0KTsKLQkJCQkJCWJyZWFrcG9pbnQgPSBicHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBicmVha3BvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwQnB0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBJUERJQnJlYWtwb2ludCBnZXRQRElCcmVha3BvaW50KElQQnJlYWtwb2ludCBwQnB0KSB7Ci0JCQlyZXR1cm4gZlBESUJyZWFrcG9pbnRzLmdldChTdHJpbmcudmFsdWVPZihwQnB0LmdldE1hcmtlcigpLmdldElkKCkpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcEJwdAotCQkgKiBAcGFyYW0gcGRpQnB0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBwdXQoSVBCcmVha3BvaW50IHBCcHQsIElQRElCcmVha3BvaW50IHBkaUJwdCkgewotCQkJZlBCcmVha3BvaW50cy5wdXQoU3RyaW5nLnZhbHVlT2YocGRpQnB0LmdldEludGVybmFsSUQoKSksIHBCcHQpOwotCQkJZlBESUJyZWFrcG9pbnRzLnB1dChTdHJpbmcudmFsdWVPZihwQnB0LmdldE1hcmtlcigpLmdldElkKCkpLCBwZGlCcHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwZGlCcHQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBESUJyZWFrcG9pbnQoSVBESUJyZWFrcG9pbnQgcGRpQnB0KSB7Ci0JCQlpZiAocGRpQnB0ICE9IG51bGwpIHsKLQkJCQlJUEJyZWFrcG9pbnQgcEJwdCA9IGZQQnJlYWtwb2ludHMucmVtb3ZlKFN0cmluZy52YWx1ZU9mKHBkaUJwdC5nZXRJbnRlcm5hbElEKCkpKTsKLQkJCQlpZiAocEJwdCAhPSBudWxsKQotCQkJCQlmUERJQnJlYWtwb2ludHMucmVtb3ZlKFN0cmluZy52YWx1ZU9mKHBCcHQuZ2V0TWFya2VyKCkuZ2V0SWQoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBJUFNlc3Npb24gc2Vzc2lvbjsKLQlwcml2YXRlIGZpbmFsIEJyZWFrcG9pbnRNYXAgZk1hcCA9IG5ldyBCcmVha3BvaW50TWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZTa2lwQnJlYWtwb2ludCA9IGZhbHNlOwotCi0JcHVibGljIFBCcmVha3BvaW50TWFuYWdlcihJUFNlc3Npb24gc2Vzc2lvbikgewotCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5hZGRCcmVha3BvaW50TGlzdGVuZXIodGhpcyk7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnRNYW5hZ2VyTGlzdGVuZXIodGhpcyk7Ci0JCWdldFBESVNlc3Npb24oKS5nZXRFdmVudE1hbmFnZXIoKS5hZGRFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQQnJlYWtwb2ludE1hbmFnZXIjYWRkU2V0QnJlYWtwb2ludHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXRCcmVha3BvaW50cyhCaXRMaXN0IHRhc2tzLCBJUEJyZWFrcG9pbnRbXSBicmVha3BvaW50cykgewotCQlpZiAoYnJlYWtwb2ludHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKElQQnJlYWtwb2ludCBicHQgOiBicmVha3BvaW50cykgewotCQkJSVBESUJyZWFrcG9pbnQgcGRpQnJlYWtwb2ludCA9IG51bGw7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEJyZWFrcG9pbnRNYXAoKSkgewotCQkJCXBkaUJyZWFrcG9pbnQgPSBnZXRCcmVha3BvaW50TWFwKCkuZ2V0UERJQnJlYWtwb2ludChicHQpOwotCQkJfQotCQkJaWYgKHBkaUJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWdldFBESVNlc3Npb24oKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZFNldEJyZWFrcG9pbnQodGFza3MsIHBkaUJyZWFrcG9pbnQpOwotCQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBleCkgewotCQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlckxpc3RlbmVyI2JyZWFrcG9pbnRNYW5hZ2VyRW5hYmxlbWVudENoYW5nZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50TWFuYWdlckVuYWJsZW1lbnRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlkb1NraXBCcmVha3BvaW50cyghZW5hYmxlZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludHNMaXN0ZW5lciNicmVha3BvaW50c0FkZGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50c0FkZGVkKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJQXJyYXlMaXN0PElQQnJlYWtwb2ludD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBCcmVha3BvaW50PihicmVha3BvaW50cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoaXNUYXJnZXRCcmVha3BvaW50KGJyZWFrcG9pbnRzW2ldKSkgewotCQkJCWxpc3QuYWRkKChJUEJyZWFrcG9pbnQpIGJyZWFrcG9pbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIElQQnJlYWtwb2ludFtdIHBCcmVha3BvaW50cyA9IGxpc3QudG9BcnJheShuZXcgSVBCcmVha3BvaW50W2xpc3Quc2l6ZSgpXSk7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldEJyZWFrcG9pbnRzT25TZXNzaW9uMChwQnJlYWtwb2ludHMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50c0xpc3RlbmVyI2JyZWFrcG9pbnRzQ2hhbmdlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50W10sIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGJyZWFrcG9pbnRzQ2hhbmdlZChJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzLCBJTWFya2VyRGVsdGFbXSBkZWx0YXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGlzVGFyZ2V0QnJlYWtwb2ludChicmVha3BvaW50c1tpXSkpIHsKLQkJCQljaGFuZ2VCcmVha3BvaW50UHJvcGVydGllcygoSVBCcmVha3BvaW50KSBicmVha3BvaW50c1tpXSwgZGVsdGFzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRzTGlzdGVuZXIjYnJlYWtwb2ludHNSZW1vdmVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnRbXSwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhW10pCi0JICovCi0JcHVibGljIHZvaWQgYnJlYWtwb2ludHNSZW1vdmVkKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMsIElNYXJrZXJEZWx0YVtdIGRlbHRhcykgewotCQlBcnJheUxpc3Q8SVBCcmVha3BvaW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUEJyZWFrcG9pbnQ+KGJyZWFrcG9pbnRzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChpc1RhcmdldEJyZWFrcG9pbnQoYnJlYWtwb2ludHNbaV0pKSB7Ci0JCQkJbGlzdC5hZGQoKElQQnJlYWtwb2ludCkgYnJlYWtwb2ludHNbaV0pOwotCQkJfQotCQl9Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJZmluYWwgSVBCcmVha3BvaW50W10gcEJyZWFrcG9pbnRzID0gbGlzdC50b0FycmF5KG5ldyBJUEJyZWFrcG9pbnRbbGlzdC5zaXplKCldKTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGVsZXRlQnJlYWtwb2ludHNPblNlc3Npb24wKHBCcmVha3BvaW50cyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQQnJlYWtwb2ludE1hbmFnZXIjZGVsZXRlU2V0QnJlYWtwb2ludHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVTZXRCcmVha3BvaW50cyhCaXRMaXN0IHRhc2tzLCBJUEJyZWFrcG9pbnRbXSBicmVha3BvaW50cykgewotCQlpZiAoYnJlYWtwb2ludHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWZvciAoSVBCcmVha3BvaW50IGJwdCA6IGJyZWFrcG9pbnRzKSB7Ci0JCQlJUERJQnJlYWtwb2ludCBwZGlCcmVha3BvaW50ID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QnJlYWtwb2ludE1hcCgpKSB7Ci0JCQkJcGRpQnJlYWtwb2ludCA9IGdldEJyZWFrcG9pbnRNYXAoKS5nZXRQRElCcmVha3BvaW50KGJwdCk7Ci0JCQl9Ci0JCQlpZiAocGRpQnJlYWtwb2ludCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0UERJU2Vzc2lvbigpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZGVsZXRlU2V0QnJlYWtwb2ludCh0YXNrcywgcGRpQnJlYWtwb2ludCk7Ci0JCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkucmVtb3ZlQnJlYWtwb2ludE1hbmFnZXJMaXN0ZW5lcih0aGlzKTsKLQkJZ2V0QnJlYWtwb2ludE1hcCgpLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoUEJyZWFrcG9pbnRNYW5hZ2VyLmNsYXNzKSkKLQkJCXJldHVybiB0aGlzOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoUFNlc3Npb24uY2xhc3MpKQotCQkJcmV0dXJuIGdldFNlc3Npb24oKTsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQU2Vzc2lvbi5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0U2Vzc2lvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUEJyZWFrcG9pbnRNYW5hZ2VyI2dldEJyZWFrcG9pbnQob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyBJQnJlYWtwb2ludCBnZXRCcmVha3BvaW50KElQRElCcmVha3BvaW50IHBkaUJwdCkgewotCQlPYmplY3QgYiA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZ2V0QnJlYWtwb2ludE1hcCgpKSB7Ci0JCQliID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBCcmVha3BvaW50KHBkaUJwdCk7Ci0JCX0KLQkJcmV0dXJuIChiIGluc3RhbmNlb2YgSUJyZWFrcG9pbnQpID8gKElCcmVha3BvaW50KSBiIDogbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUEJyZWFrcG9pbnRNYW5hZ2VyI2dldEJyZWFrcG9pbnRBZGRyZXNzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQTGluZUJyZWFrcG9pbnQpCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QnJlYWtwb2ludEFkZHJlc3MoSVBMaW5lQnJlYWtwb2ludCBicmVha3BvaW50KSB7Ci0JCUJpZ0ludGVnZXIgYWRkcmVzcyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZ2V0QnJlYWtwb2ludE1hcCgpKSB7Ci0JCQlJUERJQnJlYWtwb2ludCBwZGlCcmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBESUJyZWFrcG9pbnQoYnJlYWtwb2ludCk7Ci0JCQlpZiAocGRpQnJlYWtwb2ludCBpbnN0YW5jZW9mIElQRElMb2NhdGlvbkJyZWFrcG9pbnQpIHsKLQkJCQlJUERJTG9jYXRvciBsb2NhdG9yID0gKChJUERJTG9jYXRpb25CcmVha3BvaW50KSBwZGlCcmVha3BvaW50KS5nZXRMb2NhdG9yKCk7Ci0JCQkJaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotCQkJCQlhZGRyZXNzID0gbG9jYXRvci5nZXRBZGRyZXNzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRMaXN0ZW5lciNoYW5kbGVEZWJ1Z0V2ZW50cyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoSVBESUV2ZW50W10gZXZlbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUERJRXZlbnQgZXZlbnQgPSBldmVudHNbaV07Ci0JCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ3JlYXRlZEV2ZW50KSB7Ci0JCQkJaGFuZGxlQ3JlYXRlZEV2ZW50KChJUERJQ3JlYXRlZEV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESURlc3Ryb3llZEV2ZW50KSB7Ci0JCQkJaGFuZGxlRGVzdHJveWVkRXZlbnQoKElQRElEZXN0cm95ZWRFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQRElDaGFuZ2VkRXZlbnQpIHsKLQkJCQloYW5kbGVDaGFuZ2VkRXZlbnQoKElQRElDaGFuZ2VkRXZlbnQpIGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCcmVha3BvaW50cygpIHsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmdldEJyZWFrcG9pbnRzKAotCQkJCVBEZWJ1Z01vZGVsLmdldFBsdWdpbklkZW50aWZpZXIoKSk7Ci0JCUFycmF5TGlzdDxJUEJyZWFrcG9pbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElQQnJlYWtwb2ludD4oYnJlYWtwb2ludHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGlzVGFyZ2V0QnJlYWtwb2ludChicmVha3BvaW50c1tpXSkpIHsKLQkJCQlsaXN0LmFkZCgoSVBCcmVha3BvaW50KSBicmVha3BvaW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJUEJyZWFrcG9pbnRbXSBwQnJlYWtwb2ludHMgPSBsaXN0LnRvQXJyYXkobmV3IElQQnJlYWtwb2ludFtsaXN0LnNpemUoKV0pOwotCQlzZXRCcmVha3BvaW50c09uU2Vzc2lvbjAocEJyZWFrcG9pbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3BJbk1haW4oQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRElCcmVha3BvaW50TWFuYWdlciBwZGlCcHRNZ3IgPSBnZXRQRElTZXNzaW9uKCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJSVBESUZ1bmN0aW9uTG9jYXRpb24gbG9jYXRpb24gPSBwZGlCcHRNZ3IuY3JlYXRlRnVuY3Rpb25Mb2NhdGlvbigiIiwgIm1haW4iKTsKLQkJcGRpQnB0TWdyLnNldEZ1bmN0aW9uQnJlYWtwb2ludCh0YXNrcywgSVBESUJyZWFrcG9pbnQuVEVNUE9SQVJZLCBsb2NhdGlvbiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBCcmVha3BvaW50TWFuYWdlciNza2lwQnJlYWtwb2ludHMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBza2lwQnJlYWtwb2ludHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChmU2tpcEJyZWFrcG9pbnQgIT0gZW5hYmxlZCAmJiAoRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuaXNFbmFibGVkKCkgfHwgIWVuYWJsZWQpKSB7Ci0JCQlmU2tpcEJyZWFrcG9pbnQgPSBlbmFibGVkOwotCQkJZG9Ta2lwQnJlYWtwb2ludHMoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FkZHJlc3NCcmVha3BvaW50KElQQWRkcmVzc0JyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQkvLyBUT0RPIE5PVCBpbXBsZW1lbnRlZCBhZGRyZXNzIGJyZWFrcG9pbnQgc3VwcG9ydGVkCi0JCXJldHVybiBmYWxzZTsKLQkJLyoKLQkJICogU3RyaW5nIG1vZHVsZSA9IG51bGw7IHRyeSB7IG1vZHVsZSA9IGJyZWFrcG9pbnQuZ2V0TW9kdWxlKCk7IH0KLQkJICogY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7IH0gaWYgKG1vZHVsZSAhPSBudWxsKSByZXR1cm4KLQkJICogZ2V0RXhlY0ZpbGVQYXRoKCkudG9PU1N0cmluZygpLmVxdWFscyhtb2R1bGUpOyB0cnkgeyByZXR1cm4KLQkJICogZ2V0RXhlY0ZpbGVQYXRoKCkudG9PU1N0cmluZygpLmVxdWFscyhicmVha3BvaW50LmdldFNvdXJjZUhhbmRsZSgpKTsgfQotCQkgKiBjYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsgfSByZXR1cm4gZmFsc2U7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBwZGlXYXRjaHBvaW50Ci0JICovCi0JcHVibGljIHZvaWQgd2F0Y2hwb2ludE91dE9mU2NvcGUoQml0TGlzdCB0YXNrcywgSVBESVdhdGNocG9pbnQgcGRpV2F0Y2hwb2ludCkgewotCQlkb0hhbmRsZURlc3Ryb3llZEV2ZW50KHRhc2tzLCBwZGlXYXRjaHBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEBwYXJhbSBkZWx0YQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VCcmVha3BvaW50UHJvcGVydGllcyhJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSU1hcmtlckRlbHRhIGRlbHRhKSB7Ci0JCUlQRElCcmVha3BvaW50IHBkaUJyZWFrcG9pbnQgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGdldEJyZWFrcG9pbnRNYXAoKSkgewotCQkJcGRpQnJlYWtwb2ludCA9IGdldEJyZWFrcG9pbnRNYXAoKS5nZXRQRElCcmVha3BvaW50KGJyZWFrcG9pbnQpOwotCQl9Ci0JCWlmIChwZGlCcmVha3BvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSBicmVha3BvaW50LmlzRW5hYmxlZCgpOwotCQkJYm9vbGVhbiBvbGRFbmFibGVkID0gKGRlbHRhICE9IG51bGwpID8gZGVsdGEuZ2V0QXR0cmlidXRlKElCcmVha3BvaW50LkVOQUJMRUQsIHRydWUpIDogZW5hYmxlZDsKLQkJCWludCBpZ25vcmVDb3VudCA9IGJyZWFrcG9pbnQuZ2V0SWdub3JlQ291bnQoKTsKLQkJCWludCBvbGRJZ25vcmVDb3VudCA9IChkZWx0YSAhPSBudWxsKSA/IGRlbHRhLmdldEF0dHJpYnV0ZShJUEJyZWFrcG9pbnQuSUdOT1JFX0NPVU5ULCAwKSA6IGlnbm9yZUNvdW50OwotCQkJU3RyaW5nIGNvbmRpdGlvbiA9IGJyZWFrcG9pbnQuZ2V0Q29uZGl0aW9uKCk7Ci0JCQlTdHJpbmcgb2xkQ29uZGl0aW9uID0gKGRlbHRhICE9IG51bGwpID8gZGVsdGEuZ2V0QXR0cmlidXRlKElQQnJlYWtwb2ludC5DT05ESVRJT04sICIiKSA6IGNvbmRpdGlvbjsKLQkJCS8vIFRPRE8gbm90IHN1cHBvcnQgdGhyZWFkIGJyZWFrcG9pbnQKLQkJCUJvb2xlYW4gZW5hYmxlZDAgPSBudWxsOwotCQkJSVBESUNvbmRpdGlvbiBjb25kaXRpb24wID0gbnVsbDsKLQkJCWlmIChlbmFibGVkICE9IG9sZEVuYWJsZWQgJiYgZW5hYmxlZCAhPSBwZGlCcmVha3BvaW50LmlzRW5hYmxlZCgpKSB7Ci0JCQkJZW5hYmxlZDAgPSBCb29sZWFuLnZhbHVlT2YoZW5hYmxlZCk7Ci0JCQl9Ci0JCQlpZiAoaWdub3JlQ291bnQgIT0gb2xkSWdub3JlQ291bnQgfHwgY29uZGl0aW9uLmNvbXBhcmVUbyhvbGRDb25kaXRpb24pICE9IDApIHsKLQkJCQlJUERJQ29uZGl0aW9uIHBkaUNvbmRpdGlvbiA9IGdldFBESVNlc3Npb24oKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmNyZWF0ZUNvbmRpdGlvbihpZ25vcmVDb3VudCwgY29uZGl0aW9uLCBudWxsKTsKLQkJCQlpZiAoIXBkaUNvbmRpdGlvbi5lcXVhbHMocGRpQnJlYWtwb2ludC5nZXRDb25kaXRpb24oKSkpIHsKLQkJCQkJY29uZGl0aW9uMCA9IHBkaUNvbmRpdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZW5hYmxlZDAgIT0gbnVsbCB8fCBjb25kaXRpb24wICE9IG51bGwpIHsKLQkJCQljaGFuZ2VCcmVha3BvaW50UHJvcGVydGllc09uU2Vzc2lvbihnZXRCcmVha3BvaW50VGFza3MoYnJlYWtwb2ludCksIHBkaUJyZWFrcG9pbnQsIGVuYWJsZWQwLCBjb25kaXRpb24wKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBicmVha3BvaW50Ci0JICogQHBhcmFtIHBkaUJyZWFrcG9pbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQnJlYWtwb2ludFByb3BlcnRpZXMoSVBCcmVha3BvaW50IGJyZWFrcG9pbnQsIElQRElCcmVha3BvaW50IHBkaUJyZWFrcG9pbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gZW5hYmxlZCA9IG51bGw7Ci0JCQlpZiAocGRpQnJlYWtwb2ludC5pc0VuYWJsZWQoKSAhPSBicmVha3BvaW50LmlzRW5hYmxlZCgpKQotCQkJCWVuYWJsZWQgPSBCb29sZWFuLnZhbHVlT2YoYnJlYWtwb2ludC5pc0VuYWJsZWQoKSk7Ci0KLQkJCUlQRElDb25kaXRpb24gY29uZGl0aW9uID0gbnVsbDsKLQkJCUlQRElDb25kaXRpb24gYyA9IGNyZWF0ZUNvbmRpdGlvbihicmVha3BvaW50KTsKLQkJCWlmICghcGRpQnJlYWtwb2ludC5nZXRDb25kaXRpb24oKS5lcXVhbHMoYykpCi0JCQkJY29uZGl0aW9uID0gYzsKLQkJCWlmIChlbmFibGVkICE9IG51bGwgfHwgY29uZGl0aW9uICE9IG51bGwpCi0JCQkJY2hhbmdlQnJlYWtwb2ludFByb3BlcnRpZXNPblNlc3Npb24oZ2V0QnJlYWtwb2ludFRhc2tzKGJyZWFrcG9pbnQpLCBwZGlCcmVha3BvaW50LCBlbmFibGVkLCBjb25kaXRpb24pOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gcGUpIHsKLQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2cocGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIGJyZWFrcG9pbnQKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQnJlYWtwb2ludFByb3BlcnRpZXNPblNlc3Npb24oZmluYWwgQml0TGlzdCB0YXNrcywgZmluYWwgSVBESUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgZmluYWwgQm9vbGVhbiBlbmFibGVkLAotCQkJZmluYWwgSVBESUNvbmRpdGlvbiBjb25kaXRpb24pIHsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGVuYWJsZWQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGVuYWJsZWQuYm9vbGVhblZhbHVlKCkpCi0JCQkJCQkJZ2V0UERJU2Vzc2lvbigpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZW5hYmxlQnJlYWtwb2ludCh0YXNrcywgYnJlYWtwb2ludCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZ2V0UERJU2Vzc2lvbigpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZGlzYWJsZUJyZWFrcG9pbnQodGFza3MsIGJyZWFrcG9pbnQpOwotCQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWdldFBESVNlc3Npb24oKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnNldENvbmRpdGlvbih0YXNrcywgYnJlYWtwb2ludCwgY29uZGl0aW9uKTsKLQkJCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2VIYW5kbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBjb252ZXJ0UGF0aChTdHJpbmcgc291cmNlSGFuZGxlKSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoUGF0aC5FTVBUWS5pc1ZhbGlkUGF0aChzb3VyY2VIYW5kbGUpKSB7Ci0JCQlJU291cmNlTG9jYXRvciBzbCA9IGdldFNvdXJjZUxvY2F0b3IoKTsKLQkJCWlmIChzbCBpbnN0YW5jZW9mIFBTb3VyY2VMb29rdXBEaXJlY3RvcikgewotCQkJCXBhdGggPSAoKFBTb3VyY2VMb29rdXBEaXJlY3Rvcikgc2wpLmdldENvbXBpbGF0aW9uUGF0aChzb3VyY2VIYW5kbGUpOwotCQkJfQotCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCXBhdGggPSBuZXcgUGF0aChzb3VyY2VIYW5kbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwQnB0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJUERJQ29uZGl0aW9uIGNyZWF0ZUNvbmRpdGlvbihJUEJyZWFrcG9pbnQgcEJwdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFBESUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRQRElTZXNzaW9uKCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5jcmVhdGVDb25kaXRpb24ocEJwdC5nZXRJZ25vcmVDb3VudCgpLCBwQnB0LmdldENvbmRpdGlvbigpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcGRpQnJlYWtwb2ludAotCSAqLwotCXByaXZhdGUgdm9pZCBkb0hhbmRsZUNoYW5nZWRFdmVudChCaXRMaXN0IHRhc2tzLCBJUERJQnJlYWtwb2ludCBwZGlCcmVha3BvaW50KSB7Ci0JCUlQQnJlYWtwb2ludCBicmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBCcmVha3BvaW50KHBkaUJyZWFrcG9pbnQpOwotCQlpZiAoYnJlYWtwb2ludCAhPSBudWxsKSB7Ci0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigzKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFmU2tpcEJyZWFrcG9pbnQgJiYgRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuaXNFbmFibGVkKCkpIHsKLQkJCQkJbWFwLnB1dChJQnJlYWtwb2ludC5FTkFCTEVELCBCb29sZWFuLnZhbHVlT2YocGRpQnJlYWtwb2ludC5pc0VuYWJsZWQoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hcC5wdXQoSUJyZWFrcG9pbnQuRU5BQkxFRCwgQm9vbGVhbi52YWx1ZU9mKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIHBlKSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhwZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW1hcC5wdXQoSVBCcmVha3BvaW50LklHTk9SRV9DT1VOVCwgbmV3IEludGVnZXIocGRpQnJlYWtwb2ludC5nZXRDb25kaXRpb24oKS5nZXRJZ25vcmVDb3VudCgpKSk7Ci0JCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW1hcC5wdXQoSVBCcmVha3BvaW50LkNPTkRJVElPTiwgcGRpQnJlYWtwb2ludC5nZXRDb25kaXRpb24oKS5nZXRFeHByZXNzaW9uKCkpOwotCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJSVBEZWJ1Z0luZm8gaW5mbyA9IG5ldyBQRGVidWdCcmVha3BvaW50SW5mbyhnZXRTZXNzaW9uKCkuZ2V0RGVidWdJbmZvKHRhc2tzKSwgcGRpQnJlYWtwb2ludC5nZXRCcmVha3BvaW50SUQoKSwgbWFwKTsKLQkJCWdldFNlc3Npb24oKS5maXJlRGVidWdFdmVudChJUERlYnVnRXZlbnQuQ0hBTkdFLCBJUERlYnVnRXZlbnQuQlJFQUtQT0lOVCwgaW5mbyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcGRpQnJlYWtwb2ludAotCSAqLwotCXByaXZhdGUgdm9pZCBkb0hhbmRsZURlc3Ryb3llZEV2ZW50KEJpdExpc3QgdGFza3MsIElQRElCcmVha3BvaW50IHBkaUJyZWFrcG9pbnQpIHsKLQkJSVBCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGdldEJyZWFrcG9pbnRNYXAoKSkgewotCQkJYnJlYWtwb2ludCA9IGdldEJyZWFrcG9pbnRNYXAoKS5nZXRQQnJlYWtwb2ludChwZGlCcmVha3BvaW50KTsKLQkJCWdldEJyZWFrcG9pbnRNYXAoKS5yZW1vdmVQRElCcmVha3BvaW50KHBkaUJyZWFrcG9pbnQpOwotCQl9Ci0JCWlmIChicmVha3BvaW50ICE9IG51bGwpIHsKLQkJCUlQRGVidWdJbmZvIGluZm8gPSBuZXcgUERlYnVnQnJlYWtwb2ludEluZm8oZ2V0U2Vzc2lvbigpLmdldERlYnVnSW5mbyh0YXNrcyksIHBkaUJyZWFrcG9pbnQuZ2V0QnJlYWtwb2ludElEKCkpOwotCQkJZ2V0U2Vzc2lvbigpLmZpcmVEZWJ1Z0V2ZW50KElQRGVidWdFdmVudC5URVJNSU5BVEUsIElQRGVidWdFdmVudC5CUkVBS1BPSU5ULCBpbmZvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSBwZGlCcmVha3BvaW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGRvSGFuZGxlTG9jYXRpb25CcmVha3BvaW50Q3JlYXRlZEV2ZW50KEJpdExpc3QgdGFza3MsIElQRElMb2NhdGlvbkJyZWFrcG9pbnQgcGRpQnJlYWtwb2ludCkgewotCQlpZiAocGRpQnJlYWtwb2ludC5pc1RlbXBvcmFyeSgpKQotCQkJcmV0dXJuOwotCQlJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZ2V0QnJlYWtwb2ludE1hcCgpKSB7Ci0JCQlicmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBCcmVha3BvaW50KHBkaUJyZWFrcG9pbnQpOwotCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkKLQkJCQlnZXRCcmVha3BvaW50TWFwKCkucHV0KGJyZWFrcG9pbnQsIHBkaUJyZWFrcG9pbnQpOwotCQl9Ci0JCWlmIChicmVha3BvaW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVBEZWJ1Z0luZm8gaW5mbyA9IG5ldyBQRGVidWdCcmVha3BvaW50SW5mbyhnZXRTZXNzaW9uKCkuZ2V0RGVidWdJbmZvKHRhc2tzKSwgcGRpQnJlYWtwb2ludC5nZXRCcmVha3BvaW50SUQoKSk7Ci0JCQkJZ2V0U2Vzc2lvbigpLmZpcmVEZWJ1Z0V2ZW50KElQRGVidWdFdmVudC5DUkVBVEUsIElQRGVidWdFdmVudC5CUkVBS1BPSU5ULCBpbmZvKTsKLQkJCQljaGFuZ2VCcmVha3BvaW50UHJvcGVydGllcyhicmVha3BvaW50LCBwZGlCcmVha3BvaW50KTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcGFyYW0gcGRpV2F0Y2hwb2ludAotCSAqLwotCXByaXZhdGUgdm9pZCBkb0hhbmRsZVdhdGNocG9pbnRDcmVhdGVkRXZlbnQoQml0TGlzdCB0YXNrcywgSVBESVdhdGNocG9pbnQgcGRpV2F0Y2hwb2ludCkgewotCQlJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZ2V0QnJlYWtwb2ludE1hcCgpKSB7Ci0JCQlicmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBCcmVha3BvaW50KHBkaVdhdGNocG9pbnQpOwotCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkKLQkJCQlnZXRCcmVha3BvaW50TWFwKCkucHV0KGJyZWFrcG9pbnQsIHBkaVdhdGNocG9pbnQpOwotCQl9Ci0JCWlmIChicmVha3BvaW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVBEZWJ1Z0luZm8gaW5mbyA9IG5ldyBQRGVidWdCcmVha3BvaW50SW5mbyhnZXRTZXNzaW9uKCkuZ2V0RGVidWdJbmZvKHRhc2tzKSwgcGRpV2F0Y2hwb2ludC5nZXRCcmVha3BvaW50SUQoKSk7Ci0JCQkJZ2V0U2Vzc2lvbigpLmZpcmVEZWJ1Z0V2ZW50KElQRGVidWdFdmVudC5DUkVBVEUsIElQRGVidWdFdmVudC5CUkVBS1BPSU5ULCBpbmZvKTsKLQkJCQljaGFuZ2VCcmVha3BvaW50UHJvcGVydGllcyhicmVha3BvaW50LCBwZGlXYXRjaHBvaW50KTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkb1NraXBCcmVha3BvaW50cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJSVBCcmVha3BvaW50W10gcEJyZWFrcG9pbnRzID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldEFsbFBCcmVha3BvaW50cygpOwotCQlmb3IgKElQQnJlYWtwb2ludCBicHQgOiBwQnJlYWtwb2ludHMpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJwdC5pc0VuYWJsZWQoKSkgewotCQkJCQlJUERJQnJlYWtwb2ludCBwZGlCcmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBESUJyZWFrcG9pbnQoYnB0KTsKLQkJCQkJaWYgKHBkaUJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCQkJcGRpQnJlYWtwb2ludC5zZXRFbmFibGVkKCFlbmFibGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBCcmVha3BvaW50TWFwIGdldEJyZWFrcG9pbnRNYXAoKSB7Ci0JCXJldHVybiBmTWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwQnB0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgQml0TGlzdCBnZXRCcmVha3BvaW50VGFza3MoSVBCcmVha3BvaW50IHBCcHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNpZCA9IHBCcHQuZ2V0U2V0SWQoKTsKLQkJaWYgKHNpZC5lcXVhbHMoUHJlZmVyZW5jZUNvbnN0YW50cy5TRVRfUk9PVF9JRCkpIHsKLQkJCXJldHVybiBzZXNzaW9uLmdldFRhc2tzKCk7Ci0JCX0KLQkJQml0TGlzdCBzZXRUYXNrcyA9IHNlc3Npb24uZ2V0U2V0TWFuYWdlcigpLmdldFRhc2tzKHNpZCk7Ci0JCWlmIChzZXRUYXNrcyAhPSBudWxsKQotCQkJcmV0dXJuIHNldFRhc2tzLmNvcHkoKTsKLQotCQlJUERJQnJlYWtwb2ludCBwZGlCcHQgPSBnZXRCcmVha3BvaW50TWFwKCkuZ2V0UERJQnJlYWtwb2ludChwQnB0KTsKLQkJaWYgKHBkaUJwdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsCi0JCQkJCSJObyBwZGkgYnJlYWtwb2ludCBmb3VuZCIsIG51bGwpKTsKLQkJfQotCQlyZXR1cm4gcGRpQnB0LmdldFRhc2tzKCkuY29weSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBzZXNzaW9uLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU291cmNlTG9jYXRvciBnZXRTb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gZ2V0U2Vzc2lvbigpLmdldExhdW5jaCgpLmdldFNvdXJjZUxvY2F0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hhbmdlZEV2ZW50KElQRElDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gZXZlbnQuZ2V0UmVhc29uKCk7Ci0JCWlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJQnJlYWtwb2ludEluZm8pIHsKLQkJCWRvSGFuZGxlQ2hhbmdlZEV2ZW50KGV2ZW50LmdldFRhc2tzKCksICgoSVBESUJyZWFrcG9pbnRJbmZvKSByZWFzb24pLmdldEJyZWFrcG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogRXZlbnRzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDcmVhdGVkRXZlbnQoSVBESUNyZWF0ZWRFdmVudCBldmVudCkgewotCQlJUERJU2Vzc2lvbk9iamVjdCByZWFzb24gPSBldmVudC5nZXRSZWFzb24oKTsKLQkJaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQkJSVBESUJyZWFrcG9pbnQgcGRpQnJlYWtwb2ludCA9ICgoSVBESUJyZWFrcG9pbnRJbmZvKSByZWFzb24pLmdldEJyZWFrcG9pbnQoKTsKLQkJCWlmIChwZGlCcmVha3BvaW50IGluc3RhbmNlb2YgSVBESVdhdGNocG9pbnQpIHsKLQkJCQlkb0hhbmRsZVdhdGNocG9pbnRDcmVhdGVkRXZlbnQoZXZlbnQuZ2V0VGFza3MoKSwgKElQRElXYXRjaHBvaW50KSBwZGlCcmVha3BvaW50KTsKLQkJCX0gZWxzZSBpZiAocGRpQnJlYWtwb2ludCBpbnN0YW5jZW9mIElQRElMb2NhdGlvbkJyZWFrcG9pbnQpIHsKLQkJCQlkb0hhbmRsZUxvY2F0aW9uQnJlYWtwb2ludENyZWF0ZWRFdmVudChldmVudC5nZXRUYXNrcygpLCAoSVBESUxvY2F0aW9uQnJlYWtwb2ludCkgcGRpQnJlYWtwb2ludCk7Ci0JCQl9Ci0KLQkJCWlmICghcGRpQnJlYWtwb2ludC5pc1RlbXBvcmFyeSgpICYmICFEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5pc0VuYWJsZWQoKSkgewotCQkJCWNoYW5nZUJyZWFrcG9pbnRQcm9wZXJ0aWVzT25TZXNzaW9uKGV2ZW50LmdldFRhc2tzKCksIHBkaUJyZWFrcG9pbnQsIG5ldyBCb29sZWFuKGZhbHNlKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVzdHJveWVkRXZlbnQoSVBESURlc3Ryb3llZEV2ZW50IGV2ZW50KSB7Ci0JCUlQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiA9IGV2ZW50LmdldFJlYXNvbigpOwotCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUJyZWFrcG9pbnRJbmZvKSB7Ci0JCQlkb0hhbmRsZURlc3Ryb3llZEV2ZW50KGV2ZW50LmdldFRhc2tzKCksICgoSVBESUJyZWFrcG9pbnRJbmZvKSByZWFzb24pLmdldEJyZWFrcG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXRCcmVha3BvaW50KElCcmVha3BvaW50IGJyZWFrcG9pbnQpIHsKLQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUEJyZWFrcG9pbnQpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGJwX2pvYl9pZCA9ICgoSVBCcmVha3BvaW50KSBicmVha3BvaW50KS5nZXRKb2JJZCgpOwotCQkJCWlmIChicF9qb2JfaWQuZXF1YWxzKGdldFBESVNlc3Npb24oKS5nZXRKb2JJRCgpKSB8fCBicF9qb2JfaWQuZXF1YWxzKElQQnJlYWtwb2ludC5HTE9CQUwpKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGJyZWFrcG9pbnQuZ2V0TWFya2VyKCkuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUEFkZHJlc3NCcmVha3BvaW50KQotCQkJCQkJcmV0dXJuIHN1cHBvcnRzQWRkcmVzc0JyZWFrcG9pbnQoKElQQWRkcmVzc0JyZWFrcG9pbnQpIGJyZWFrcG9pbnQpOwotCQkJCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQTGluZUJyZWFrcG9pbnQpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGhhbmRsZSA9ICgoSVBCcmVha3BvaW50KSBicmVha3BvaW50KS5nZXRTb3VyY2VIYW5kbGUoKTsKLQkJCQkJCQlJU291cmNlTG9jYXRvciBzbCA9IGdldFNvdXJjZUxvY2F0b3IoKTsKLQkJCQkJCQlpZiAoc2wgaW5zdGFuY2VvZiBJUFNvdXJjZUxvY2F0b3IpCi0JCQkJCQkJCXJldHVybiAoKChJUFNvdXJjZUxvY2F0b3IpIHNsKS5maW5kU291cmNlRWxlbWVudChoYW5kbGUpICE9IG51bGwpOwotCQkJCQkJCWVsc2UgaWYgKHNsIGluc3RhbmNlb2YgUFNvdXJjZUxvb2t1cERpcmVjdG9yKSB7Ci0JCQkJCQkJCXJldHVybiAoKChQU291cmNlTG9va3VwRGlyZWN0b3IpIHNsKS5jb250YWlucygoKElQQnJlYWtwb2ludCkgYnJlYWtwb2ludCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJSVNvdXJjZUxvY2F0b3Igc2wgPSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCQkJCQkJaWYgKHNsIGluc3RhbmNlb2YgSVBTb3VyY2VMb2NhdG9yKQotCQkJCQkJCQlyZXR1cm4gKChJUFNvdXJjZUxvY2F0b3IpIHNsKS5jb250YWlucyhwcm9qZWN0KTsKLQkJCQkJCQllbHNlIGlmIChzbCBpbnN0YW5jZW9mIFBTb3VyY2VMb29rdXBEaXJlY3RvcikKLQkJCQkJCQkJcmV0dXJuICgoUFNvdXJjZUxvb2t1cERpcmVjdG9yKSBzbCkuY29udGFpbnMocHJvamVjdCk7Ci0JCQkJCQkJaWYgKHByb2plY3QuZXF1YWxzKGdldFByb2plY3QoKSkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCXJldHVybiBQRGVidWdVdGlscy5pc1JlZmVyZW5jZWRQcm9qZWN0KGdldFByb2plY3QoKSwgcHJvamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYnJlYWtwb2ludHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVCcmVha3BvaW50c09uU2Vzc2lvbjAoSVBCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJSVBESUJyZWFrcG9pbnRNYW5hZ2VyIHBkaUJwdE1nciA9IGdldFBESVNlc3Npb24oKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlmb3IgKElQQnJlYWtwb2ludCBicmVha3BvaW50IDogYnJlYWtwb2ludHMpIHsKLQkJCUlQRElCcmVha3BvaW50IHBkaUJyZWFrcG9pbnQgPSBudWxsOwotCQkJc3luY2hyb25pemVkIChnZXRCcmVha3BvaW50TWFwKCkpIHsKLQkJCQlwZGlCcmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludE1hcCgpLmdldFBESUJyZWFrcG9pbnQoYnJlYWtwb2ludCk7Ci0JCQl9Ci0JCQlpZiAocGRpQnJlYWtwb2ludCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQl0cnkgewotCQkJCXBkaUJwdE1nci5kZWxldGVCcmVha3BvaW50KHBkaUJyZWFrcG9pbnQuZ2V0VGFza3MoKS5jb3B5KCksIHBkaUJyZWFrcG9pbnQpOwotCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGV4KSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQRElTZXNzaW9uIGdldFBESVNlc3Npb24oKSB7Ci0JCXJldHVybiBnZXRTZXNzaW9uKCkuZ2V0UERJU2Vzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0U291cmNlRWxlbWVudChTdHJpbmcgZmlsZSkgewotCQlPYmplY3Qgc291cmNlRWxlbWVudCA9IG51bGw7Ci0JCUlTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCWlmIChsb2NhdG9yIGluc3RhbmNlb2YgSVBTb3VyY2VMb2NhdG9yIHx8IGxvY2F0b3IgaW5zdGFuY2VvZiBQU291cmNlTG9va3VwRGlyZWN0b3IpIHsKLQkJCWlmIChsb2NhdG9yIGluc3RhbmNlb2YgSVBTb3VyY2VMb2NhdG9yKQotCQkJCXNvdXJjZUVsZW1lbnQgPSAoKElQU291cmNlTG9jYXRvcikgbG9jYXRvcikuZmluZFNvdXJjZUVsZW1lbnQoZmlsZSk7Ci0JCQllbHNlCi0JCQkJc291cmNlRWxlbWVudCA9ICgoUFNvdXJjZUxvb2t1cERpcmVjdG9yKSBsb2NhdG9yKS5nZXRTb3VyY2VFbGVtZW50KGZpbGUpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiAhKHN0ciAhPSBudWxsICYmIHN0ci50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYnJlYWtwb2ludHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCcmVha3BvaW50c09uU2Vzc2lvbjAoSVBCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJSVBESUJyZWFrcG9pbnRNYW5hZ2VyIHBkaUJwdE1nciA9IGdldFBESVNlc3Npb24oKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlmb3IgKElQQnJlYWtwb2ludCBicHQgOiBicmVha3BvaW50cykgewotCQkJdHJ5IHsKLQkJCQlJUERJQnJlYWtwb2ludCBiID0gbnVsbDsKLQkJCQlpZiAoYnB0IGluc3RhbmNlb2YgSVBGdW5jdGlvbkJyZWFrcG9pbnQpIHsKLQkJCQkJSVBGdW5jdGlvbkJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IChJUEZ1bmN0aW9uQnJlYWtwb2ludCkgYnB0OwotCQkJCQlTdHJpbmcgZnVuY3Rpb24gPSBicmVha3BvaW50LmdldEZ1bmN0aW9uKCk7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IGJyZWFrcG9pbnQuZ2V0RmlsZU5hbWUoKTsKLQkJCQkJSVBESUZ1bmN0aW9uTG9jYXRpb24gbG9jYXRpb24gPSBwZGlCcHRNZ3IuY3JlYXRlRnVuY3Rpb25Mb2NhdGlvbihmaWxlTmFtZSwgZnVuY3Rpb24pOwotCQkJCQlJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IGNyZWF0ZUNvbmRpdGlvbihicmVha3BvaW50KTsKLQkJCQkJYiA9IHBkaUJwdE1nci5zZXRGdW5jdGlvbkJyZWFrcG9pbnQoZ2V0QnJlYWtwb2ludFRhc2tzKGJwdCksIElQRElCcmVha3BvaW50LlJFR1VMQVIsIGxvY2F0aW9uLCBjb25kaXRpb24sIHRydWUsCi0JCQkJCQkJYnB0LmlzRW5hYmxlZCgpKTsKLQkJCQl9IGVsc2UgaWYgKGJwdCBpbnN0YW5jZW9mIElQQWRkcmVzc0JyZWFrcG9pbnQpIHsKLQkJCQkJSVBBZGRyZXNzQnJlYWtwb2ludCBicmVha3BvaW50ID0gKElQQWRkcmVzc0JyZWFrcG9pbnQpIGJwdDsKLQkJCQkJU3RyaW5nIGFkZHJlc3MgPSBicmVha3BvaW50LmdldEFkZHJlc3MoKTsKLQkJCQkJSVBESUFkZHJlc3NMb2NhdGlvbiBsb2NhdGlvbiA9IHBkaUJwdE1nci5jcmVhdGVBZGRyZXNzTG9jYXRpb24obmV3IEJpZ0ludGVnZXIoCi0JCQkJCQkJKGFkZHJlc3Muc3RhcnRzV2l0aCgiMHgiKSkgPyBhZGRyZXNzLnN1YnN0cmluZygyKSA6IGFkZHJlc3MsIDE2KSk7Ci0JCQkJCUlQRElDb25kaXRpb24gY29uZGl0aW9uID0gY3JlYXRlQ29uZGl0aW9uKGJyZWFrcG9pbnQpOwotCQkJCQliID0gcGRpQnB0TWdyLnNldEFkZHJlc3NCcmVha3BvaW50KGdldEJyZWFrcG9pbnRUYXNrcyhicHQpLCBJUERJQnJlYWtwb2ludC5SRUdVTEFSLCBsb2NhdGlvbiwgY29uZGl0aW9uLCB0cnVlLAotCQkJCQkJCWJwdC5pc0VuYWJsZWQoKSk7Ci0JCQkJfSBlbHNlIGlmIChicHQgaW5zdGFuY2VvZiBJUExpbmVCcmVha3BvaW50KSB7Ci0JCQkJCUlQTGluZUJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IChJUExpbmVCcmVha3BvaW50KSBicHQ7Ci0JCQkJCVN0cmluZyBoYW5kbGUgPSBicmVha3BvaW50LmdldFNvdXJjZUhhbmRsZSgpOwotCQkJCQlJUGF0aCBwYXRoID0gY29udmVydFBhdGgoaGFuZGxlKTsKLQkJCQkJSVBESUxpbmVMb2NhdGlvbiBsb2NhdGlvbiA9IHBkaUJwdE1nci5jcmVhdGVMaW5lTG9jYXRpb24ocGF0aC50b1BvcnRhYmxlU3RyaW5nKCksIGJyZWFrcG9pbnQuZ2V0TGluZU51bWJlcigpKTsKLQkJCQkJSVBESUNvbmRpdGlvbiBjb25kaXRpb24gPSBjcmVhdGVDb25kaXRpb24oYnJlYWtwb2ludCk7Ci0JCQkJCWIgPSBwZGlCcHRNZ3Iuc2V0TGluZUJyZWFrcG9pbnQoZ2V0QnJlYWtwb2ludFRhc2tzKGJwdCksIElQRElCcmVha3BvaW50LlJFR1VMQVIsIGxvY2F0aW9uLCBjb25kaXRpb24sIHRydWUsIGJwdAotCQkJCQkJCS5pc0VuYWJsZWQoKSk7Ci0JCQkJfSBlbHNlIGlmIChicHQgaW5zdGFuY2VvZiBJUFdhdGNocG9pbnQpIHsKLQkJCQkJSVBXYXRjaHBvaW50IHdhdGNocG9pbnQgPSAoSVBXYXRjaHBvaW50KSBicHQ7Ci0JCQkJCWludCBhY2Nlc3NUeXBlID0gMDsKLQkJCQkJYWNjZXNzVHlwZSB8PSAod2F0Y2hwb2ludC5pc1dyaXRlVHlwZSgpKSA/IElQRElXYXRjaHBvaW50LldSSVRFIDogMDsKLQkJCQkJYWNjZXNzVHlwZSB8PSAod2F0Y2hwb2ludC5pc1JlYWRUeXBlKCkpID8gSVBESVdhdGNocG9pbnQuUkVBRCA6IDA7Ci0JCQkJCVN0cmluZyBleHByZXNzaW9uID0gd2F0Y2hwb2ludC5nZXRFeHByZXNzaW9uKCk7Ci0JCQkJCUlQRElDb25kaXRpb24gY29uZGl0aW9uID0gY3JlYXRlQ29uZGl0aW9uKHdhdGNocG9pbnQpOwotCQkJCQliID0gcGRpQnB0TWdyLnNldFdhdGNocG9pbnQoZ2V0QnJlYWtwb2ludFRhc2tzKGJwdCksIElQRElCcmVha3BvaW50LlJFR1VMQVIsIGFjY2Vzc1R5cGUsIGV4cHJlc3Npb24sIGNvbmRpdGlvbiwKLQkJCQkJCQlicHQuaXNFbmFibGVkKCkpOwotCQkJCX0KLQkJCQlpZiAoYiAhPSBudWxsKSB7Ci0JCQkJCWdldEJyZWFrcG9pbnRNYXAoKS5wdXQoYnB0LCBiKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBhbnkgcGVuZGluZyBicmVha3BvaW50cy4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGRlYnVnZ2VyIGVudGVycyBzdXNwZW5kZWQgc3RhdGUKLQkgKiB0byB1cGRhdGUgYW55IGJyZWFrcG9pbnRzIHRoYXQgY291bGQgbm90IGJlIHNldCBvciBkZWxldGVkIGJlY2F1c2UgdGFza3Mgd2VyZSBydW5uaW5nLgotCSAqIAotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUGVuZGluZ0JyZWFrcG9pbnRzKCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWdldFBESVNlc3Npb24oKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnVwZGF0ZVBlbmRpbmdCcmVha3BvaW50cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QRGVidWdDb25maWd1cmF0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUERlYnVnQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzgyMTZiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QRGVidWdDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUERlYnVnQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUERlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIFBEZWJ1Z0NvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJUERlYnVnQ29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQ7Ci0JcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gZk1vZGVzOwotCXByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGZDUFVzOwotCXByaXZhdGUgU3RyaW5nW10gZkNvcmVFeHQ7Ci0KLQlwdWJsaWMgUERlYnVnQ29uZmlndXJhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBmRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgSVBEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlYnVnZ2VyID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQlpZiAoZGVidWdnZXIgaW5zdGFuY2VvZiBJUERlYnVnZ2VyKSB7Ci0JCQlyZXR1cm4gKElQRGVidWdnZXIpZGVidWdnZXI7Ci0JCX0KLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAtMSwgSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIkRlYnVnQ29uZmlndXJhdGlvbi4wIiksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUgOiAiIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybSgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoInBsYXRmb3JtIik7Ci0JCWlmIChwbGF0Zm9ybSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIioiOwotCQl9Ci0JCXJldHVybiBwbGF0Zm9ybTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q1BVTGlzdCgpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSkgZ2V0Q1BVcygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldE1vZGVMaXN0KCkgewotCQlyZXR1cm4gKFN0cmluZ1tdKSBnZXRNb2RlcygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNb2RlKFN0cmluZyBtb2RlKSB7Ci0JCXJldHVybiBnZXRNb2RlcygpLmNvbnRhaW5zKG1vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ1BVKFN0cmluZyBjcHUpIHsKLQkJU3RyaW5nIG5hdGl2ZUNQVSA9IFBsYXRmb3JtLmdldE9TQXJjaCgpOwotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlpZiAoIG5hdGl2ZUNQVS5zdGFydHNXaXRoKGNwdSkgKSB7Ci0JCQlyZXQgPSBnZXRDUFVzKCkuY29udGFpbnMoQ1BVX05BVElWRSk7Ci0JCX0KLQkJcmV0dXJuIHJldCB8fCBnZXRDUFVzKCkuY29udGFpbnMoY3B1KSB8fCBnZXRDUFVzKCkuY29udGFpbnMoIioiKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIG1vZGVzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBkYXRhLgotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBtb2RlcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZGF0YQotCSAqLwotCXByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRNb2RlcygpIHsKLQkJaWYgKGZNb2RlcyA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZXMgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibW9kZXMiKTsKLQkJCWlmIChtb2RlcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4oMCk7Ci0JCQl9Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RlcywgIiwiKTsKLQkJCWZNb2RlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4odG9rZW5pemVyLmNvdW50VG9rZW5zKCkpOwotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlmTW9kZXMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmTW9kZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldENQVXMoKSB7Ci0JCWlmIChmQ1BVcyA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY3B1cyA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJjcHUiKTsKLQkJCWlmIChjcHVzID09IG51bGwpIHsKLQkJCQlmQ1BVcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oMSk7Ci0JCQkJZkNQVXMuYWRkKENQVV9OQVRJVkUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG5hdGl2ZUNQVSA9IFBsYXRmb3JtLmdldE9TQXJjaCgpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNwdXMsICIsIik7Ci0JCQkJZkNQVXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHRva2VuaXplci5jb3VudFRva2VucygpKTsKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgY3B1ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQkJZkNQVXMuYWRkKGNwdSk7Ci0JCQkJCWlmIChuYXRpdmVDUFUuc3RhcnRzV2l0aChjcHUpKSB7IC8vIG9zIGFyY2ggYmUgY3B1e2xlL2JlfQotCQkJCQkJZkNQVXMuYWRkKENQVV9OQVRJVkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmQ1BVczsKLQl9Ci0JcHVibGljIFN0cmluZ1tdIGdldENvcmVGaWxlRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZDb3JlRXh0ID09IG51bGwpIHsKLQkJCUxpc3Q8U3RyaW5nPiBleHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlTdHJpbmcgY2V4dHMgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpLmdldEF0dHJpYnV0ZSgiY29yZUZpbGVGaWx0ZXIiKTsKLQkJCWlmIChjZXh0cyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2V4dHMsICIsIik7Ci0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIGV4dCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJCWV4dHMuYWRkKGV4dCk7Ci0JCQkJfQotCQkJfQotCQkJZXh0cy5hZGQoIiouKiIpOwotCQkJZkNvcmVFeHQgPSAoU3RyaW5nW10pZXh0cy50b0FycmF5KG5ldyBTdHJpbmdbZXh0cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZkNvcmVFeHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BNZW1vcnlNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUE1lbW9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlOTAxMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUE1lbW9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQTWVtb3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElNZW1vcnlCbG9ja0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElSZXN0YXJ0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVJlc3VtZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklUeXBlSW50ZWdyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBNZW1vcnlCbG9ja0V4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QVGhyZWFkOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUE1lbW9yeU1hbmFnZXIgaW1wbGVtZW50cyBJQWRhcHRhYmxlLCBJUERJRXZlbnRMaXN0ZW5lciwgSVBNZW1vcnlNYW5hZ2VyIHsKLQlwcml2YXRlIGNsYXNzIFBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbiBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSU1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uIHsKLQkJcHJpdmF0ZSBJUERlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0ID0gbnVsbDsKLQkJcHJpdmF0ZSBmaW5hbCBCaXRMaXN0IG1UYXNrczsKLQotCQlwdWJsaWMgUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uKEJpdExpc3QgbVRhc2tzLCBQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQpIHsKLQkJCXRoaXMubVRhc2tzID0gbVRhc2tzOwotCQkJdGhpcy5kZWJ1Z1RhcmdldCA9IGRlYnVnVGFyZ2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBtZXNzYWdlCi0JCSAqIEBwYXJhbSBlCi0JCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWJvcnQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwKLQkJCQkJbWVzc2FnZSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZXhwcmVzc2lvbnMKLQkJICogQHBhcmFtIG1lbW9yeVNwYWNlSURzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjcmVhdGVNZW1vcnlCbG9ja3MoU3RyaW5nW10gZXhwcmVzc2lvbnMsIFN0cmluZ1tdIG1lbW9yeVNwYWNlSURzKSB7Ci0JCQlBcnJheUxpc3Q8UE1lbW9yeUJsb2NrRXh0ZW5zaW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQTWVtb3J5QmxvY2tFeHRlbnNpb24+KGV4cHJlc3Npb25zLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQmlnSW50ZWdlciBhZGRyZXNzID0gbmV3IEJpZ0ludGVnZXIoZXhwcmVzc2lvbnNbaV0pOwotCQkJCQlpZiAoYWRkcmVzcyAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobWVtb3J5U3BhY2VJRHNbaV0gPT0gbnVsbCkgewotCQkJCQkJCWxpc3QuYWRkKG5ldyBQTWVtb3J5QmxvY2tFeHRlbnNpb24oc2Vzc2lvbiwgbVRhc2tzLCBhZGRyZXNzLnRvU3RyaW5nKDE2KSwgYWRkcmVzcykpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlsaXN0LmFkZChuZXcgUE1lbW9yeUJsb2NrRXh0ZW5zaW9uKHNlc3Npb24sIG1UYXNrcywgYWRkcmVzcywgbWVtb3J5U3BhY2VJRHNbaV0pKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhleGMpOwotCQkJCX0KLQkJCX0KLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNZW1vcnlCbG9ja01hbmFnZXIoKS5hZGRNZW1vcnlCbG9ja3MoKElNZW1vcnlCbG9ja1tdKSBsaXN0LnRvQXJyYXkobmV3IElNZW1vcnlCbG9ja1swXSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgSVBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJCWlmIChkZWJ1Z1RhcmdldCA9PSBudWxsKSB7Ci0JCQkJZGVidWdUYXJnZXQgPSBzZXNzaW9uLmZpbmREZWJ1Z1RhcmdldChtVGFza3MpOwotCQkJfQotCQkJcmV0dXJuIGRlYnVnVGFyZ2V0OwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uI2dldEV4dGVuZGVkTWVtb3J5QmxvY2soamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJTWVtb3J5QmxvY2tFeHRlbnNpb24gZ2V0RXh0ZW5kZWRNZW1vcnlCbG9jayhTdHJpbmcgZXhwcmVzc2lvbiwgT2JqZWN0IHNlbGVjdGVkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJU3RyaW5nIGFkZHJlc3MgPSBudWxsOwotCQkJUEV4cHJlc3Npb24gZXhwID0gbnVsbDsKLQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBJRGVidWdFbGVtZW50KSB7Ci0JCQkJCUlEZWJ1Z0VsZW1lbnQgZGVidWdFbGVtZW50ID0gKElEZWJ1Z0VsZW1lbnQpIHNlbGVjdGVkOwotCQkJCQlJRGVidWdUYXJnZXQgdGFyZ2V0ID0gZGVidWdFbGVtZW50LmdldERlYnVnVGFyZ2V0KCk7Ci0JCQkJCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIFBEZWJ1Z1RhcmdldCkpIHsKLQkJCQkJCXRocm93IG5ldyBEZWJ1Z0V4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksCi0JCQkJCQkJCURlYnVnRXhjZXB0aW9uLlJFUVVFU1RfRkFJTEVELCBtc2csIG51bGwpKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIG5ldyBQTWVtb3J5QmxvY2tFeHRlbnNpb24oc2Vzc2lvbiwgbVRhc2tzLCBleHByZXNzaW9uLCBuZXcgQmlnSW50ZWdlcihleHByZXNzaW9uLCAxNikpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleGMpIHsKLQkJCQkJfQotCi0JCQkJCVBTdGFja0ZyYW1lIGZyYW1lID0gZ2V0U3RhY2tGcmFtZShkZWJ1Z0VsZW1lbnQpOwotCQkJCQlpZiAoZnJhbWUgIT0gbnVsbCkgewotCQkJCQkJLy8gV2UgbmVlZCB0byBwcm92aWRlIGEgYmV0dGVyIHdheSBmb3IgcmV0cmlldmluZyB0aGUKLQkJCQkJCS8vIGFkZHJlc3Mgb2YgZXhwcmVzc2lvbgotCQkJCQkJSVBESVRhcmdldEV4cHJlc3Npb24gcGRpRXhwcmVzc2lvbiA9IHNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldEV4cHJlc3Npb25NYW5hZ2VyKCkuY3JlYXRlRXhwcmVzc2lvbigKLQkJCQkJCQkJZnJhbWUuZ2V0VGFza3MoKSwgZXhwcmVzc2lvbik7Ci0JCQkJCQlleHAgPSBuZXcgUEV4cHJlc3Npb24oZnJhbWUsIHBkaUV4cHJlc3Npb24sIG51bGwpOwotCQkJCQkJSVZhbHVlIHZhbHVlID0gZXhwLmdldFZhbHVlKCk7Ci0JCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJUFZhbHVlKSB7Ci0JCQkJCQkJSUFJRiBhaWYgPSAoKElQVmFsdWUpIHZhbHVlKS5nZXRBSUYoKTsKLQkJCQkJCQlpZiAoYWlmICE9IG51bGwKLQkJCQkJCQkJCSYmIChhaWYuZ2V0VHlwZSgpIGluc3RhbmNlb2YgSUFJRlR5cGVQb2ludGVyIHx8IGFpZi5nZXRUeXBlKCkgaW5zdGFuY2VvZiBJVHlwZUludGVncmFsIHx8IGFpZgotCQkJCQkJCQkJCQkuZ2V0VHlwZSgpIGluc3RhbmNlb2YgSUFJRlR5cGVBcnJheSkpIHsKLQkJCQkJCQkJYWRkcmVzcyA9IGFpZi5nZXRWYWx1ZSgpLmdldFZhbHVlU3RyaW5nKCk7Ci0JCQkJCQkJCWlmIChhZGRyZXNzICE9IG51bGwpIHsKLQkJCQkJCQkJCUJpZ0ludGVnZXIgYSA9IChhZGRyZXNzLnN0YXJ0c1dpdGgoIjB4IikpID8gbmV3IEJpZ0ludGVnZXIoYWRkcmVzcy5zdWJzdHJpbmcoMiksIDE2KQotCQkJCQkJCQkJCQk6IG5ldyBCaWdJbnRlZ2VyKGFkZHJlc3MpOwotCQkJCQkJCQkJcmV0dXJuIG5ldyBQTWVtb3J5QmxvY2tFeHRlbnNpb24oc2Vzc2lvbiwgbVRhc2tzLCBleHByZXNzaW9uLCBhKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsRGVidWdDb3JlTWVzc2FnZXMKLQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJQVFBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbi4xIiksIG5ldyBPYmplY3RbXSB7IGV4cHJlc3Npb24gfSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbERlYnVnQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUFRQTWVtb3J5QmxvY2tSZXRyaWV2YWxFeHRlbnNpb24uMiIpLAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgZXhwcmVzc2lvbiB9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBwZSkgewotCQkJCW1zZyA9IHBlLmdldE1lc3NhZ2UoKTsKLQkJCX0gY2F0Y2ggKEFJRkV4Y2VwdGlvbiBlKSB7Ci0JCQkJbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsRGVidWdDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbi4wIiksIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlleHByZXNzaW9uLCBhZGRyZXNzIH0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZXhwICE9IG51bGwpIHsKLQkJCQkJZXhwLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCQlEZWJ1Z0V4Y2VwdGlvbi5SRVFVRVNUX0ZBSUxFRCwgbXNnLCBudWxsKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJICovCi0JCXB1YmxpYyAJU3RyaW5nIGdldE1lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJTWVtb3J5QmxvY2tbXSBibG9ja3MgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TWVtb3J5QmxvY2tNYW5hZ2VyKCkuZ2V0TWVtb3J5QmxvY2tzKGdldERlYnVnVGFyZ2V0KCkpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBEZWJ1Z1BsdWdpbi5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBleHByTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTUVNT1JZX0JMT0NLX0VYUFJFU1NJT05fTElTVCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7ICsraSkgewotCQkJCWlmIChibG9ja3NbaV0gaW5zdGFuY2VvZiBJTWVtb3J5QmxvY2tFeHRlbnNpb24pIHsKLQkJCQkJSU1lbW9yeUJsb2NrRXh0ZW5zaW9uIG1lbUJsb2NrRXh0ID0gKElNZW1vcnlCbG9ja0V4dGVuc2lvbikgYmxvY2tzW2ldOwotCQkJCQlFbGVtZW50IGV4cHJJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChNRU1PUllfQkxPQ0tfRVhQUkVTU0lPTl9JVEVNKTsKLQkJCQkJZXhwckxpc3QuYXBwZW5kQ2hpbGQoZXhwckl0ZW0pOwotCi0JCQkJCUJpZ0ludGVnZXIgYWRkckJpZ0ludCA9IG51bGw7Ci0JCQkJCVN0cmluZyBtZW1vcnlTcGFjZUlEID0gbnVsbDsKLQkJCQkJaWYgKGhhc01lbW9yeVNwYWNlcygpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCWFkZHJCaWdJbnQgPSBzdHJpbmdUb0FkZHJlc3MobWVtQmxvY2tFeHQuZ2V0RXhwcmVzc2lvbigpLCBzYnVmKTsKLQkJCQkJCQltZW1vcnlTcGFjZUlEID0gc2J1Zi50b1N0cmluZygpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJRWxlbWVudCBjaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTUVNT1JZX0JMT0NLX0VYUFJFU1NJT04pOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGFkZHJCaWdJbnQgIT0gbnVsbCAmJiBtZW1vcnlTcGFjZUlEICE9IG51bGwpIHsKLQkJCQkJCQljaGlsZC5zZXRBdHRyaWJ1dGUoQVRUUl9NRU1PUllfQkxPQ0tfRVhQUkVTU0lPTl9URVhULCBhZGRyQmlnSW50LnRvU3RyaW5nKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljaGlsZC5zZXRBdHRyaWJ1dGUoQVRUUl9NRU1PUllfQkxPQ0tfRVhQUkVTU0lPTl9URVhULCBtZW1CbG9ja0V4dC5nZXRCaWdCYXNlQWRkcmVzcygpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQkJZXhwckl0ZW0uYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJCWlmIChtZW1vcnlTcGFjZUlEICE9IG51bGwpIHsKLQkJCQkJCWNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChNRU1PUllfQkxPQ0tfTUVNU1BBQ0VJRCk7Ci0JCQkJCQljaGlsZC5zZXRBdHRyaWJ1dGUoQVRUUl9NRU1PUllfQkxPQ0tfTUVNU1BBQ0VJRF9URVhULCBtZW1vcnlTcGFjZUlEKTsKLQkJCQkJCWV4cHJJdGVtLmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGV4cHJMaXN0KTsKLQkJCXJldHVybiBEZWJ1Z1BsdWdpbi5zZXJpYWxpemVEb2N1bWVudChkb2N1bWVudCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tSZXRyaWV2YWwjZ2V0TWVtb3J5QmxvY2sobG9uZywgbG9uZykKLQkJICovCi0JCXB1YmxpYyBJTWVtb3J5QmxvY2sgZ2V0TWVtb3J5QmxvY2sobG9uZyBzdGFydEFkZHJlc3MsIGxvbmcgbGVuZ3RoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJU3RyaW5nIGV4cHJlc3Npb24gPSBMb25nLnRvSGV4U3RyaW5nKHN0YXJ0QWRkcmVzcyk7Ci0JCQlCaWdJbnRlZ2VyIGFkZHJlc3MgPSBuZXcgQmlnSW50ZWdlcihleHByZXNzaW9uLCAxNik7Ci0JCQlleHByZXNzaW9uICs9ICIweCI7Ci0JCQlyZXR1cm4gbmV3IFBNZW1vcnlCbG9ja0V4dGVuc2lvbihzZXNzaW9uLCBtVGFza3MsIGV4cHJlc3Npb24sIGFkZHJlc3MpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBhZGRyZXNzCi0JCSAqIEBwYXJhbSBtZW1vcnlTcGFjZUlECi0JCSAqIEBwYXJhbSBzZWxlY3RlZAotCQkgKiBAcmV0dXJuCi0JCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkJICovCi0JCXB1YmxpYyBJTWVtb3J5QmxvY2tFeHRlbnNpb24gZ2V0TWVtb3J5QmxvY2tXaXRoTWVtb3J5U3BhY2VJRChTdHJpbmcgYWRkcmVzcywgU3RyaW5nIG1lbW9yeVNwYWNlSUQsIE9iamVjdCBzZWxlY3RlZCkKLQkJCQl0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElEZWJ1Z0VsZW1lbnQpIHsKLQkJCQkJSURlYnVnRWxlbWVudCBkZWJ1Z0VsZW1lbnQgPSAoSURlYnVnRWxlbWVudCkgc2VsZWN0ZWQ7Ci0JCQkJCUlEZWJ1Z1RhcmdldCB0YXJnZXQgPSBkZWJ1Z0VsZW1lbnQuZ2V0RGVidWdUYXJnZXQoKTsKLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBEZWJ1Z1RhcmdldCkgewotCQkJCQkJaWYgKGFkZHJlc3MgIT0gbnVsbCkgewotCQkJCQkJCUJpZ0ludGVnZXIgYWRkciA9IChhZGRyZXNzLnN0YXJ0c1dpdGgoIjB4IikpID8gbmV3IEJpZ0ludGVnZXIoYWRkcmVzcy5zdWJzdHJpbmcoMiksIDE2KQotCQkJCQkJCQkJOiBuZXcgQmlnSW50ZWdlcihhZGRyZXNzKTsKLQkJCQkJCQlyZXR1cm4gbmV3IFBNZW1vcnlCbG9ja0V4dGVuc2lvbihzZXNzaW9uLCBtVGFza3MsIGFkZHIsIG1lbW9yeVNwYWNlSUQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQltc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbERlYnVnQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uLjQiKSwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IGFkZHJlc3MgfSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCQlEZWJ1Z0V4Y2VwdGlvbi5SRVFVRVNUX0ZBSUxFRCwgbXNnLCBudWxsKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGdldE1lbW9yeVNwYWNlcygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBzZWxlY3RlZAotCQkgKiBAcmV0dXJuCi0JCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkJICovCi0JCXB1YmxpYyBQU3RhY2tGcmFtZSBnZXRTdGFja0ZyYW1lKElEZWJ1Z0VsZW1lbnQgc2VsZWN0ZWQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBQU3RhY2tGcmFtZSkgewotCQkJCXJldHVybiAoUFN0YWNrRnJhbWUpIHNlbGVjdGVkOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgUFRocmVhZCkgewotCQkJCUlTdGFja0ZyYW1lIGZyYW1lID0gKChQVGhyZWFkKSBzZWxlY3RlZCkuZ2V0VG9wU3RhY2tGcmFtZSgpOwotCQkJCWlmIChmcmFtZSBpbnN0YW5jZW9mIFBTdGFja0ZyYW1lKSB7Ci0JCQkJCXJldHVybiAoUFN0YWNrRnJhbWUpIGZyYW1lOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc01lbW9yeVNwYWNlcygpIHsKLQkJCXJldHVybiBnZXRNZW1vcnlTcGFjZXMoKS5sZW5ndGggPiAwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlc3Npb24uZ2V0TGF1bmNoKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbWVtZW50byA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9NRU1PUllfQkxPQ0tTLCAiIik7Ci0JCQkJaWYgKG1lbWVudG8gIT0gbnVsbCAmJiBtZW1lbnRvLnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWluaXRpYWxpemVGcm9tTWVtZW50byhtZW1lbnRvKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBtZW1lbnRvCi0JCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21NZW1lbnRvKFN0cmluZyBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlFbGVtZW50IHJvb3QgPSBEZWJ1Z1BsdWdpbi5wYXJzZURvY3VtZW50KG1lbWVudG8pOwotCQkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9CTE9DS19FWFBSRVNTSU9OX0xJU1QpKSB7Ci0JCQkJTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJTGlzdDxTdHJpbmc+IG1lbW9yeVNwYWNlSURzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJTm9kZUxpc3QgbGlzdCA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLQkJCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50IGVudHJ5ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlpZiAoZW50cnkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9CTE9DS19FWFBSRVNTSU9OKSkgewotCQkJCQkJCXBhcnNlTWVtZW50b0V4cHJJdGVtKGVudHJ5LCBleHByZXNzaW9ucywgbWVtb3J5U3BhY2VJRHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNyZWF0ZU1lbW9yeUJsb2NrcygoU3RyaW5nW10pIGV4cHJlc3Npb25zLnRvQXJyYXkobmV3IFN0cmluZ1swXSksIChTdHJpbmdbXSkgbWVtb3J5U3BhY2VJRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWJvcnQoSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uLjMiKSwgbnVsbCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogQHBhcmFtIGV4cHJlc3Npb25zCi0JCSAqIEBwYXJhbSBtZW1vcnlTcGFjZUlEcwotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFyc2VNZW1lbnRvRXhwckl0ZW0oRWxlbWVudCBlbGVtZW50LCBMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIExpc3Q8U3RyaW5nPiBtZW1vcnlTcGFjZUlEcykgewotCQkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJaW50IGxlbmd0aCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlTdHJpbmcgZXhwID0gbnVsbDsKLQkJCVN0cmluZyBtZW1vcnlTcGFjZUlEID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLQkJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50IGVudHJ5ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCWlmIChlbnRyeS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0JMT0NLX0VYUFJFU1NJT04pKSB7Ci0JCQkJCQlleHAgPSBlbnRyeS5nZXRBdHRyaWJ1dGUoQVRUUl9NRU1PUllfQkxPQ0tfRVhQUkVTU0lPTl9URVhUKTsKLQkJCQkJfSBlbHNlIGlmIChlbnRyeS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0JMT0NLX01FTVNQQUNFSUQpKSB7Ci0JCQkJCQltZW1vcnlTcGFjZUlEID0gZW50cnkuZ2V0QXR0cmlidXRlKEFUVFJfTUVNT1JZX0JMT0NLX01FTVNQQUNFSURfVEVYVCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXhwICE9IG51bGwpIHsKLQkJCQlleHByZXNzaW9ucy5hZGQoZXhwKTsKLQkJCQltZW1vcnlTcGFjZUlEcy5hZGQobWVtb3J5U3BhY2VJRCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tSZXRyaWV2YWwjc3VwcG9ydHNTdG9yYWdlUmV0cmlldmFsKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3RvcmFnZVJldHJpZXZhbCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9CTE9DS19FWFBSRVNTSU9OX0xJU1QgPSAibWVtb3J5QmxvY2tFeHByZXNzaW9uTGlzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9CTE9DS19FWFBSRVNTSU9OX0lURU0gPSAibWVtb3J5QmxvY2tFeHByZXNzaW9uSXRlbSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9CTE9DS19FWFBSRVNTSU9OID0gImV4cHJlc3Npb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1PUllfQkxPQ0tfTUVNU1BBQ0VJRCA9ICJtZW1vcnlTcGFjZUlEIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRU1PUllfQkxPQ0tfTUVNU1BBQ0VJRF9URVhUID0gInRleHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FTU9SWV9CTE9DS19FWFBSRVNTSU9OX1RFWFQgPSAidGV4dCI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRkcmVzcwotCSAqIEBwYXJhbSBtZW1vcnlTcGFjZUlECi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZHJlc3NUb1N0cmluZyhCaWdJbnRlZ2VyIGFkZHJlc3MsIFN0cmluZyBtZW1vcnlTcGFjZUlEKSB7Ci0JCXJldHVybiBtZW1vcnlTcGFjZUlEICsgIjoweCIgKyBhZGRyZXNzLnRvU3RyaW5nKDE2KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyCi0JICogQHBhcmFtIG1lbW9yeVNwYWNlSURfb3V0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBzdHJpbmdUb0FkZHJlc3MoU3RyaW5nIHN0ciwgU3RyaW5nQnVmZmVyIG1lbW9yeVNwYWNlSURfb3V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWludCBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZignOicpOwotCi0JCS8vIG1pbmltdW0gaXMgIjxzcGFjZT46MHg/IgotCQlpZiAoaW5kZXggPT0gLTEgfHwgc3RyLmxlbmd0aCgpIDw9IGluZGV4ICsgMyB8fCBzdHIuY2hhckF0KGluZGV4ICsgMSkgIT0gJzAnIHx8IHN0ci5jaGFyQXQoaW5kZXggKyAyKSAhPSAneCcpIHsKLQkJCUlTdGF0dXMgcyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SLAotCQkJCQlJbnRlcm5hbERlYnVnQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uLjUiKSwgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzKTsKLQkJfQotCQltZW1vcnlTcGFjZUlEX291dC5zZXRMZW5ndGgoMCk7Ci0JCW1lbW9yeVNwYWNlSURfb3V0LmFwcGVuZChzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0JCXJldHVybiBuZXcgQmlnSW50ZWdlcihzdHIuc3Vic3RyaW5nKGluZGV4ICsgMyksIDE2KTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIElQU2Vzc2lvbiBzZXNzaW9uOwotCXByb3RlY3RlZCBmaW5hbCBNYXA8Qml0TGlzdCwgUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uPiBmTWVtb3J5UmV0cmlldmFsTWFwID0gbmV3IEhhc2hNYXA8Qml0TGlzdCwgUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uPigpOwotCi0JcHVibGljIFBNZW1vcnlNYW5hZ2VyKElQU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0JCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLmFkZEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBNZW1vcnlNYW5hZ2VyI2Rpc3Bvc2Uob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoQml0TGlzdCBxVGFza3MpIHsKLQkJZ2V0TWVtb3J5UmV0cmlldmFsKHFUYXNrcykuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZk1lbW9yeVJldHJpZXZhbE1hcC5jbGVhcigpOwotCQlzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRFdmVudE1hbmFnZXIoKS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUERJU2Vzc2lvbi5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0U2Vzc2lvbigpOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoUE1lbW9yeU1hbmFnZXIuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElNZW1vcnlCbG9ja0V4dGVuc2lvbiBnZXRFeHRlbmRlZE1lbW9yeUJsb2NrKEJpdExpc3QgcVRhc2tzLCBTdHJpbmcgZXhwcmVzc2lvbiwgT2JqZWN0IHNlbGVjdGVkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TWVtb3J5UmV0cmlldmFsKHFUYXNrcykuZ2V0RXh0ZW5kZWRNZW1vcnlCbG9jayhleHByZXNzaW9uLCBzZWxlY3RlZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBNZW1vcnlNYW5hZ2VyI2dldE1lbW9yeUJsb2NrKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgbG9uZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgSU1lbW9yeUJsb2NrIGdldE1lbW9yeUJsb2NrKEJpdExpc3QgcVRhc2tzLCBsb25nIHN0YXJ0QWRkcmVzcywgbG9uZyBsZW5ndGgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRNZW1vcnlSZXRyaWV2YWwocVRhc2tzKS5nZXRNZW1vcnlCbG9jayhzdGFydEFkZHJlc3MsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEBwYXJhbSBhZGRyZXNzCi0JICogQHBhcmFtIG1lbW9yeVNwYWNlSUQKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTWVtb3J5QmxvY2tFeHRlbnNpb24gZ2V0TWVtb3J5QmxvY2tXaXRoTWVtb3J5U3BhY2VJRChCaXRMaXN0IHFUYXNrcywgU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBtZW1vcnlTcGFjZUlELAotCQkJT2JqZWN0IHNlbGVjdGVkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TWVtb3J5UmV0cmlldmFsKHFUYXNrcykuZ2V0TWVtb3J5QmxvY2tXaXRoTWVtb3J5U3BhY2VJRChhZGRyZXNzLCBtZW1vcnlTcGFjZUlELCBzZWxlY3RlZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBNZW1vcnlNYW5hZ2VyI2dldE1lbW9yeVJldHJpZXZhbChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIFBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbiBnZXRNZW1vcnlSZXRyaWV2YWwoQml0TGlzdCBxVGFza3MpIHsKLQkJc3luY2hyb25pemVkIChmTWVtb3J5UmV0cmlldmFsTWFwKSB7Ci0JCQlQTWVtb3J5QmxvY2tSZXRyaWV2YWxFeHRlbnNpb24gc2V0ID0gKFBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbikgZk1lbW9yeVJldHJpZXZhbE1hcC5nZXQocVRhc2tzKTsKLQkJCWlmIChzZXQgPT0gbnVsbCkgewotCQkJCXNldCA9IG5ldyBQTWVtb3J5QmxvY2tSZXRyaWV2YWxFeHRlbnNpb24ocVRhc2tzLCBudWxsKTsKLQkJCQlmTWVtb3J5UmV0cmlldmFsTWFwLnB1dChxVGFza3MsIHNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIHNlc3Npb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyI2hhbmRsZURlYnVnRXZlbnRzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhJUERJRXZlbnRbXSBldmVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQRElFdmVudCBldmVudCA9IGV2ZW50c1tpXTsKLQkJCWlmICghZk1lbW9yeVJldHJpZXZhbE1hcC5jb250YWluc0tleShldmVudC5nZXRUYXNrcygpKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESVJlc3VtZWRFdmVudCB8fCBldmVudCBpbnN0YW5jZW9mIElQRElSZXN0YXJ0ZWRFdmVudCkgewotCQkJCWRvUmVzZXRDaGFuZ2UoZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQRElDaGFuZ2VkRXZlbnQpIHsKLQkJCQloYW5kbGVDaGFuZ2VkRXZlbnQoKElQRElDaGFuZ2VkRXZlbnQpIGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQTWVtb3J5TWFuYWdlciNpbml0aWFsaXplKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnVGFyZ2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQml0TGlzdCBxVGFza3MsIFBEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCkgewotCQlzeW5jaHJvbml6ZWQgKGZNZW1vcnlSZXRyaWV2YWxNYXApIHsKLQkJCVBNZW1vcnlCbG9ja1JldHJpZXZhbEV4dGVuc2lvbiBzZXQgPSBuZXcgUE1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uKHFUYXNrcywgZGVidWdUYXJnZXQpOwotCQkJZk1lbW9yeVJldHJpZXZhbE1hcC5wdXQocVRhc2tzLCBzZXQpOwotCQkJc2V0LmluaXRpYWxpemUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcGFyYW0gbWVtZW50bwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tTWVtZW50byhCaXRMaXN0IHFUYXNrcywgU3RyaW5nIG1lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0TWVtb3J5UmV0cmlldmFsKHFUYXNrcykuaW5pdGlhbGl6ZUZyb21NZW1lbnRvKG1lbWVudG8pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQTWVtb3J5TWFuYWdlciNzYXZlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKEJpdExpc3QgcVRhc2tzKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbWVtdG8gPSBnZXRNZW1vcnlSZXRyaWV2YWwocVRhc2tzKS5nZXRNZW1lbnRvKCk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXNzaW9uLmdldExhdW5jaCgpLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKLQkJCQl3Yy5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9NRU1PUllfQkxPQ0tTLCBtZW10byk7Ci0JCQkJd2MuZG9TYXZlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBxVGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdG9yYWdlUmV0cmlldmFsKEJpdExpc3QgcVRhc2tzKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBkb1Jlc2V0Q2hhbmdlKGZpbmFsIElQRElFdmVudCBldmVudCkgewotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJUERlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0ID0gZ2V0TWVtb3J5UmV0cmlldmFsKGV2ZW50LmdldFRhc2tzKCkpLmdldERlYnVnVGFyZ2V0KCk7Ci0JCQkJSU1lbW9yeUJsb2NrW10gYmxvY2tzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1lbW9yeUJsb2NrTWFuYWdlcigpLmdldE1lbW9yeUJsb2NrcyhkZWJ1Z1RhcmdldCk7Ci0JCQkJZm9yIChJTWVtb3J5QmxvY2sgYmxvY2sgOiBibG9ja3MpIHsKLQkJCQkJaWYgKGJsb2NrIGluc3RhbmNlb2YgSU1lbW9yeUJsb2NrRXh0ZW5zaW9uKSB7Ci0JCQkJCQkoKFBNZW1vcnlCbG9ja0V4dGVuc2lvbikgYmxvY2spLnJlc2V0Q2hhbmdlcygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZWRFdmVudChmaW5hbCBJUERJQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiA9ICgoSVBESUNoYW5nZWRFdmVudCkgZXZlbnQpLmdldFJlYXNvbigpOwotCQkJCWlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJTWVtb3J5QmxvY2tJbmZvKSB7Ci0JCQkJCUlQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQgPSBnZXRNZW1vcnlSZXRyaWV2YWwoZXZlbnQuZ2V0VGFza3MoKSkuZ2V0RGVidWdUYXJnZXQoKTsKLQkJCQkJSU1lbW9yeUJsb2NrW10gYmxvY2tzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1lbW9yeUJsb2NrTWFuYWdlcigpLmdldE1lbW9yeUJsb2NrcyhkZWJ1Z1RhcmdldCk7Ci0JCQkJCWZvciAoSU1lbW9yeUJsb2NrIGJsb2NrIDogYmxvY2tzKSB7Ci0JCQkJCQlpZiAoYmxvY2sgaW5zdGFuY2VvZiBJTWVtb3J5QmxvY2tFeHRlbnNpb24pIHsKLQkJCQkJCQkoKFBNZW1vcnlCbG9ja0V4dGVuc2lvbikgYmxvY2spLmNoYW5nZXMoKChJUERJTWVtb3J5QmxvY2tJbmZvKSByZWFzb24pLmdldE1lbW9yeUJsb2NrKCksCi0JCQkJCQkJCQkoKElQRElNZW1vcnlCbG9ja0luZm8pIHJlYXNvbikuZ2V0QWRkcmVzc2VzKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUFJlZ2lzdGVyTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BSZWdpc3Rlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmMGY5Yi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUFJlZ2lzdGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUmVnaXN0ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUFJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBSZWdpc3Rlck1hbmFnZXIgaW1wbGVtZW50cyBJQWRhcHRhYmxlLCBJUFJlZ2lzdGVyTWFuYWdlciB7Ci0JcHJpdmF0ZSBjbGFzcyBQUmVnaXN0ZXJTZXQgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8SVJlZ2lzdGVyR3JvdXA+IGZSZWdpc3Rlckdyb3VwcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxJUmVnaXN0ZXJHcm91cD4oMjApKTsKLQkJcHJpdmF0ZSBJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGZSZWdpc3RlckRlc2NyaXB0b3JzOwotCQlwcml2YXRlIGJvb2xlYW4gZlVzZURlZmF1bHRSZWdpc3Rlckdyb3VwcyA9IHRydWU7Ci0JCXByaXZhdGUgSVBTdGFja0ZyYW1lIGZDdXJyZW50RnJhbWU7Ci0JCXByaXZhdGUgSVBEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCA9IG51bGw7Ci0JCXByaXZhdGUgZmluYWwgQml0TGlzdCByVGFza3M7Ci0KLQkJcHVibGljIFBSZWdpc3RlclNldChCaXRMaXN0IHJUYXNrcywgUERlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0KSB7Ci0JCQl0aGlzLnJUYXNrcyA9IHJUYXNrczsKLQkJCXRoaXMuZGVidWdUYXJnZXQgPSBkZWJ1Z1RhcmdldDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbWVzc2FnZQotCQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWJvcnQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uSU5URVJOQUxfRVJST1IsCi0JCQkJCW1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkUmVnaXN0ZXJHcm91cChTdHJpbmcgbmFtZSwgSVBSZWdpc3RlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQkJZlJlZ2lzdGVyR3JvdXBzLmFkZChuZXcgUFJlZ2lzdGVyR3JvdXAoc2Vzc2lvbiwgclRhc2tzLCBuYW1lLCBkZXNjcmlwdG9ycykpOwotCQkJc2V0VXNlRGVmYXVsdFJlZ2lzdGVyR3JvdXBzKGZhbHNlKTsKLQkJCWdldERlYnVnVGFyZ2V0KCkuZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuQ09OVEVOVCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3luY2hyb25pemVkIChmUmVnaXN0ZXJHcm91cHMpIHsKLQkJCQlJdGVyYXRvcjxJUmVnaXN0ZXJHcm91cD4gaXQgPSBmUmVnaXN0ZXJHcm91cHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCSgoUFJlZ2lzdGVyR3JvdXApIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlmUmVnaXN0ZXJHcm91cHMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZ3JvdXAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvQWRkUmVnaXN0ZXJHcm91cChJUmVnaXN0ZXJHcm91cCBncm91cCkgewotCQkJZlJlZ2lzdGVyR3JvdXBzLmFkZChncm91cCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGdyb3VwTmFtZQotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgSVBSZWdpc3RlckRlc2NyaXB0b3IgZmluZERlc2NyaXB0b3IoU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlZ2lzdGVyRGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlJUFJlZ2lzdGVyRGVzY3JpcHRvciBkID0gZlJlZ2lzdGVyRGVzY3JpcHRvcnNbaV07Ci0JCQkJaWYgKGdyb3VwTmFtZS5lcXVhbHMoZC5nZXRHcm91cE5hbWUoKSkgJiYgbmFtZS5lcXVhbHMoZC5nZXROYW1lKCkpKQotCQkJCQlyZXR1cm4gZDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZ2V0QWxsUmVnaXN0ZXJEZXNjcmlwdG9ycygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZlJlZ2lzdGVyRGVzY3JpcHRvcnM7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIElQU3RhY2tGcmFtZSBnZXRDdXJyZW50RnJhbWUoKSB7Ci0JCQlyZXR1cm4gZkN1cnJlbnRGcmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgSVBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJCWlmIChkZWJ1Z1RhcmdldCA9PSBudWxsKSB7Ci0JCQkJZGVidWdUYXJnZXQgPSBzZXNzaW9uLmZpbmREZWJ1Z1RhcmdldChyVGFza3MpOwotCQkJfQotCQkJcmV0dXJuIGRlYnVnVGFyZ2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZSZWdpc3Rlckdyb3VwcykgewotCQkJCWlmICh1c2VEZWZhdWx0UmVnaXN0ZXJHcm91cHMoKSB8fCBmUmVnaXN0ZXJHcm91cHMgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gIiI7Ci0JCQkJfQotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gRGVidWdQbHVnaW4ubmV3RG9jdW1lbnQoKTsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEVMRU1FTlRfUkVHSVNURVJfR1JPVVBfTElTVCk7Ci0JCQkJSXRlcmF0b3I8SVJlZ2lzdGVyR3JvdXA+IGl0ID0gZlJlZ2lzdGVyR3JvdXBzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlQUmVnaXN0ZXJHcm91cCBncm91cCA9IChQUmVnaXN0ZXJHcm91cCkgaXQubmV4dCgpOwotCQkJCQlFbGVtZW50IGNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChFTEVNRU5UX1JFR0lTVEVSX0dST1VQKTsKLQkJCQkJY2hpbGQuc2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJfR1JPVVBfTUVNRU5UTywgZ3JvdXAuZ2V0TWVtZW50bygpKTsKLQkJCQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJCXJldHVybiBEZWJ1Z1BsdWdpbi5zZXJpYWxpemVEb2N1bWVudChkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGZyYW1lCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIElSZWdpc3Rlckdyb3VwW10gZ2V0UmVnaXN0ZXJHcm91cHMoUFN0YWNrRnJhbWUgZnJhbWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlJUmVnaXN0ZXJHcm91cFtdIGdyb3VwcyA9IChJUmVnaXN0ZXJHcm91cFtdKSBmUmVnaXN0ZXJHcm91cHMudG9BcnJheShuZXcgSVJlZ2lzdGVyR3JvdXBbMF0pOwotCQkJaWYgKGdldEN1cnJlbnRGcmFtZSgpICE9IGZyYW1lKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJKChQUmVnaXN0ZXJHcm91cCkgZ3JvdXBzW2ldKS5yZXNldFJlZ2lzdGVyVmFsdWVzKCk7Ci0JCQkJfQotCQkJCXNldEN1cnJlbnRGcmFtZShmcmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ3JvdXBzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUlQRElSZWdpc3Rlckdyb3VwW10gZ3JvdXBzID0gbmV3IElQRElSZWdpc3Rlckdyb3VwWzBdOwotCQkJdHJ5IHsKLQkJCQlncm91cHMgPSBnZXREZWJ1Z1RhcmdldCgpLmdldFBESVRhcmdldCgpLmdldFJlZ2lzdGVyR3JvdXBzKCk7Ci0JCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCQlMaXN0PElQUmVnaXN0ZXJEZXNjcmlwdG9yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUFJlZ2lzdGVyRGVzY3JpcHRvcj4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgKytpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVBESVJlZ2lzdGVyRGVzY3JpcHRvcltdIHBkaURlc2NyaXB0b3JzID0gZ3JvdXBzW2ldLmdldFJlZ2lzdGVyRGVzY3JpcHRvcnMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwZGlEZXNjcmlwdG9ycy5sZW5ndGg7ICsraikgewotCQkJCQkJbGlzdC5hZGQobmV3IFBSZWdpc3RlckRlc2NyaXB0b3IoZ3JvdXBzW2ldLCBwZGlEZXNjcmlwdG9yc1tqXSkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmUmVnaXN0ZXJEZXNjcmlwdG9ycyA9IChJUFJlZ2lzdGVyRGVzY3JpcHRvcltdKSBsaXN0LnRvQXJyYXkobmV3IElQUmVnaXN0ZXJEZXNjcmlwdG9yWzBdKTsKLQkJCWNyZWF0ZVJlZ2lzdGVyR3JvdXBzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSB7Ci0JCQlzZXRVc2VEZWZhdWx0UmVnaXN0ZXJHcm91cHModHJ1ZSk7Ci0JCQlTdHJpbmcgY3VycmVudCA9IG51bGw7Ci0JCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZWdpc3RlckRlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7Ci0JCQkJUFJlZ2lzdGVyRGVzY3JpcHRvciBkID0gKFBSZWdpc3RlckRlc2NyaXB0b3IpIGZSZWdpc3RlckRlc2NyaXB0b3JzW2ldOwotCQkJCWlmIChjdXJyZW50ICE9IG51bGwgJiYgZC5nZXRHcm91cE5hbWUoKS5jb21wYXJlVG8oY3VycmVudCkgIT0gMCkgewotCQkJCQlJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IElQUmVnaXN0ZXJEZXNjcmlwdG9yW2kgLSBzdGFydEluZGV4XTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmUmVnaXN0ZXJEZXNjcmlwdG9ycywgc3RhcnRJbmRleCwgZGVzY3JpcHRvcnMsIDAsIGRlc2NyaXB0b3JzLmxlbmd0aCk7Ci0JCQkJCWZSZWdpc3Rlckdyb3Vwcy5hZGQobmV3IFBSZWdpc3Rlckdyb3VwKHNlc3Npb24sIHJUYXNrcywgY3VycmVudCwgZGVzY3JpcHRvcnMpKTsKLQkJCQkJc3RhcnRJbmRleCA9IGk7Ci0JCQkJfQotCQkJCWN1cnJlbnQgPSBkLmdldEdyb3VwTmFtZSgpOwotCQkJfQotCQkJaWYgKHN0YXJ0SW5kZXggPCBmUmVnaXN0ZXJEZXNjcmlwdG9ycy5sZW5ndGgpIHsKLQkJCQlJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IElQUmVnaXN0ZXJEZXNjcmlwdG9yW2ZSZWdpc3RlckRlc2NyaXB0b3JzLmxlbmd0aCAtIHN0YXJ0SW5kZXhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZlJlZ2lzdGVyRGVzY3JpcHRvcnMsIHN0YXJ0SW5kZXgsIGRlc2NyaXB0b3JzLCAwLCBkZXNjcmlwdG9ycy5sZW5ndGgpOwotCQkJCWZSZWdpc3Rlckdyb3Vwcy5hZGQobmV3IFBSZWdpc3Rlckdyb3VwKHNlc3Npb24sIHJUYXNrcywgY3VycmVudCwgZGVzY3JpcHRvcnMpKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZ3JvdXAKLQkJICogQHBhcmFtIGRlc2NyaXB0b3JzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RpZnlSZWdpc3Rlckdyb3VwKElQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwIGdyb3VwLCBJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0JCQlncm91cC5zZXRSZWdpc3RlckRlc2NyaXB0b3JzKGRlc2NyaXB0b3JzKTsKLQkJCSgoUFJlZ2lzdGVyR3JvdXApIGdyb3VwKS5maXJlQ2hhbmdlRXZlbnQoRGVidWdFdmVudC5DT05URU5UKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZ2lzdGVyR3JvdXBzKCkgewotCQkJc3luY2hyb25pemVkIChmUmVnaXN0ZXJHcm91cHMpIHsKLQkJCQlJdGVyYXRvcjxJUmVnaXN0ZXJHcm91cD4gaXQgPSBmUmVnaXN0ZXJHcm91cHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCSgoUFJlZ2lzdGVyR3JvdXApIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlmUmVnaXN0ZXJHcm91cHMuY2xlYXIoKTsKLQkJCX0KLQkJCXNldFVzZURlZmF1bHRSZWdpc3Rlckdyb3VwcyhmYWxzZSk7Ci0JCQlnZXREZWJ1Z1RhcmdldCgpLmZpcmVDaGFuZ2VFdmVudChEZWJ1Z0V2ZW50LkNPTlRFTlQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBncm91cHMKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVJlZ2lzdGVyR3JvdXBzKElSZWdpc3Rlckdyb3VwW10gZ3JvdXBzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7ICsraSkgewotCQkJCSgoUFJlZ2lzdGVyR3JvdXApIGdyb3Vwc1tpXSkuZGlzcG9zZSgpOwotCQkJfQotCQkJZlJlZ2lzdGVyR3JvdXBzLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KGdyb3VwcykpOwotCQkJc2V0VXNlRGVmYXVsdFJlZ2lzdGVyR3JvdXBzKGZhbHNlKTsKLQkJCWdldERlYnVnVGFyZ2V0KCkuZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuQ09OVEVOVCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdHMoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZSZWdpc3Rlckdyb3VwcykgewotCQkJCUl0ZXJhdG9yPElSZWdpc3Rlckdyb3VwPiBpdCA9IGZSZWdpc3Rlckdyb3Vwcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJKChQUmVnaXN0ZXJHcm91cCkgaXQubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWZSZWdpc3Rlckdyb3Vwcy5jbGVhcigpOwotCQkJCWluaXRpYWxpemVEZWZhdWx0cygpOwotCQkJfQotCQkJZ2V0RGVidWdUYXJnZXQoKS5maXJlQ2hhbmdlRXZlbnQoRGVidWdFdmVudC5DT05URU5UKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY3VycmVudEZyYW1lCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50RnJhbWUoUFN0YWNrRnJhbWUgY3VycmVudEZyYW1lKSB7Ci0JCQlmQ3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB1c2VEZWZhdWx0UmVnaXN0ZXJHcm91cHMKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRSZWdpc3Rlckdyb3Vwcyhib29sZWFuIHVzZURlZmF1bHRSZWdpc3Rlckdyb3VwcykgewotCQkJZlVzZURlZmF1bHRSZWdpc3Rlckdyb3VwcyA9IHVzZURlZmF1bHRSZWdpc3Rlckdyb3VwczsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHRhcmdldFN1c3BlbmRlZCgpIHsKLQkJCXN5bmNocm9uaXplZCAoZlJlZ2lzdGVyR3JvdXBzKSB7Ci0JCQkJSXRlcmF0b3I8SVJlZ2lzdGVyR3JvdXA+IGl0ID0gZlJlZ2lzdGVyR3JvdXBzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkoKFBSZWdpc3Rlckdyb3VwKSBpdC5uZXh0KCkpLnRhcmdldFN1c3BlbmRlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0UmVnaXN0ZXJHcm91cHMoKSB7Ci0JCQlyZXR1cm4gZlVzZURlZmF1bHRSZWdpc3Rlckdyb3VwczsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVSZWdpc3Rlckdyb3VwcygpIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlc3Npb24uZ2V0TGF1bmNoKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbWVtZW50byA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9SRUdJU1RFUl9HUk9VUFMsICIiKTsKLQkJCQlpZiAobWVtZW50byAhPSBudWxsICYmIG1lbWVudG8ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWluaXRpYWxpemVGcm9tTWVtZW50byhtZW1lbnRvKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIG1lbWVudG8KLQkJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZyb21NZW1lbnRvKFN0cmluZyBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlOb2RlIG5vZGUgPSBEZWJ1Z1BsdWdpbi5wYXJzZURvY3VtZW50KG1lbWVudG8pOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWFib3J0KEludGVybmFsRGVidWdDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUmVnaXN0ZXJNYW5hZ2VyLjAiKSwgbnVsbCk7Ci0JCQl9Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCWlmICghRUxFTUVOVF9SRUdJU1RFUl9HUk9VUF9MSVNULmVxdWFscyhlbGVtZW50LmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJYWJvcnQoSW50ZXJuYWxEZWJ1Z0NvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlBSZWdpc3Rlck1hbmFnZXIuMSIpLCBudWxsKTsKLQkJCX0KLQkJCU5vZGUgY2hpbGROb2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJCWlmIChFTEVNRU5UX1JFR0lTVEVSX0dST1VQLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJU3RyaW5nIGdyb3VwTWVtZW50byA9IGNoaWxkLmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSX0dST1VQX01FTUVOVE8pOwotCQkJCQkJUFJlZ2lzdGVyR3JvdXAgZ3JvdXAgPSBuZXcgUFJlZ2lzdGVyR3JvdXAoc2Vzc2lvbiwgclRhc2tzKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZ3JvdXAuaW5pdGlhbGl6ZUZyb21NZW1lbnRvKGdyb3VwTWVtZW50byk7Ci0JCQkJCQkJZG9BZGRSZWdpc3Rlckdyb3VwKGdyb3VwKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHNraXAgdGhpcyBncm91cAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJc2V0VXNlRGVmYXVsdFJlZ2lzdGVyR3JvdXBzKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JFR0lTVEVSX0dST1VQX0xJU1QgPSAicmVnaXN0ZXJHcm91cHMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JFR0lTVEVSX0dST1VQID0gImdyb3VwIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRUdJU1RFUl9HUk9VUF9NRU1FTlRPID0gIm1lbWVudG8iOwotCi0JcHJpdmF0ZSBmaW5hbCBJUFNlc3Npb24gc2Vzc2lvbjsKLQlwcm90ZWN0ZWQgZmluYWwgTWFwPEJpdExpc3QsIFBSZWdpc3RlclNldD4gZlJlZ2lzdGVyU2V0TWFwID0gbmV3IEhhc2hNYXA8Qml0TGlzdCwgUFJlZ2lzdGVyU2V0PigpOwotCi0JcHVibGljIFBSZWdpc3Rlck1hbmFnZXIoSVBTZXNzaW9uIHNlc3Npb24pIHsKLQkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUFJlZ2lzdGVyTWFuYWdlciNhZGRSZWdpc3Rlckdyb3VwKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBSZWdpc3RlckRlc2NyaXB0b3JbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWdpc3Rlckdyb3VwKGZpbmFsIEJpdExpc3QgcVRhc2tzLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgSVBSZWdpc3RlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRSZWdpc3RlclNldChxVGFza3MpLmFkZFJlZ2lzdGVyR3JvdXAobmFtZSwgZGVzY3JpcHRvcnMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN5bmNocm9uaXplZCAoZlJlZ2lzdGVyU2V0TWFwKSB7Ci0JCQkJCUl0ZXJhdG9yPFBSZWdpc3RlclNldD4gaXQgPSBmUmVnaXN0ZXJTZXRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJKChQUmVnaXN0ZXJTZXQpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCWZSZWdpc3RlclNldE1hcC5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEBwYXJhbSBncm91cE5hbWUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBSZWdpc3RlckRlc2NyaXB0b3IgZmluZERlc2NyaXB0b3IoQml0TGlzdCBxVGFza3MsIFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRSZWdpc3RlclNldChxVGFza3MpLmZpbmREZXNjcmlwdG9yKGdyb3VwTmFtZSwgbmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQU2Vzc2lvbi5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0U2Vzc2lvbigpOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoUFJlZ2lzdGVyTWFuYWdlci5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXIjZ2V0QWxsUmVnaXN0ZXJEZXNjcmlwdG9ycyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZ2V0QWxsUmVnaXN0ZXJEZXNjcmlwdG9ycyhCaXRMaXN0IHFUYXNrcykgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFJlZ2lzdGVyU2V0KHFUYXNrcykuZ2V0QWxsUmVnaXN0ZXJEZXNjcmlwdG9ycygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQUmVnaXN0ZXJNYW5hZ2VyI2dldEN1cnJlbnRGcmFtZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQU3RhY2tGcmFtZSBnZXRDdXJyZW50RnJhbWUoQml0TGlzdCBxVGFza3MpIHsKLQkJcmV0dXJuIGdldFJlZ2lzdGVyU2V0KHFUYXNrcykuZ2V0Q3VycmVudEZyYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXIjZ2V0UmVnaXN0ZXJHcm91cHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QU3RhY2tGcmFtZSkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lzdGVyR3JvdXBbXSBnZXRSZWdpc3Rlckdyb3VwcyhCaXRMaXN0IHFUYXNrcywgUFN0YWNrRnJhbWUgZnJhbWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRSZWdpc3RlclNldChxVGFza3MpLmdldFJlZ2lzdGVyR3JvdXBzKGZyYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcVRhc2tzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBQUmVnaXN0ZXJTZXQgZ2V0UmVnaXN0ZXJTZXQoQml0TGlzdCBxVGFza3MpIHsKLQkJc3luY2hyb25pemVkIChmUmVnaXN0ZXJTZXRNYXApIHsKLQkJCVBSZWdpc3RlclNldCBzZXQgPSAoUFJlZ2lzdGVyU2V0KSBmUmVnaXN0ZXJTZXRNYXAuZ2V0KHFUYXNrcyk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlzZXQgPSBuZXcgUFJlZ2lzdGVyU2V0KHFUYXNrcywgbnVsbCk7Ci0JCQkJZlJlZ2lzdGVyU2V0TWFwLnB1dChxVGFza3MsIHNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2V0OwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXIjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z1RhcmdldCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEJpdExpc3QgcVRhc2tzLCBQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQpIHsKLQkJc3luY2hyb25pemVkIChmUmVnaXN0ZXJTZXRNYXApIHsKLQkJCVBSZWdpc3RlclNldCBzZXQgPSBuZXcgUFJlZ2lzdGVyU2V0KHFUYXNrcywgZGVidWdUYXJnZXQpOwotCQkJZlJlZ2lzdGVyU2V0TWFwLnB1dChxVGFza3MsIHNldCk7Ci0JCQlzZXQuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXIjbW9kaWZ5UmVnaXN0ZXJHcm91cChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFJlZ2lzdGVyRGVzY3JpcHRvcltdKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVJlZ2lzdGVyR3JvdXAoZmluYWwgQml0TGlzdCBxVGFza3MsIGZpbmFsIElQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwIGdyb3VwLAotCQkJZmluYWwgSVBSZWdpc3RlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRSZWdpc3RlclNldChxVGFza3MpLm1vZGlmeVJlZ2lzdGVyR3JvdXAoZ3JvdXAsIGRlc2NyaXB0b3JzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZ2lzdGVyR3JvdXBzKGZpbmFsIEJpdExpc3QgcVRhc2tzKSB7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldFJlZ2lzdGVyU2V0KHFUYXNrcykucmVtb3ZlQWxsUmVnaXN0ZXJHcm91cHMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXIjcmVtb3ZlUmVnaXN0ZXJHcm91cHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3Rlckdyb3VwW10pCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVnaXN0ZXJHcm91cHMoZmluYWwgQml0TGlzdCBxVGFza3MsIGZpbmFsIElSZWdpc3Rlckdyb3VwW10gZ3JvdXBzKSB7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldFJlZ2lzdGVyU2V0KHFUYXNrcykucmVtb3ZlUmVnaXN0ZXJHcm91cHMoZ3JvdXBzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBSZWdpc3Rlck1hbmFnZXIjcmVzdG9yZURlZmF1bHRzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdHMoZmluYWwgQml0TGlzdCBxVGFza3MpIHsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0UmVnaXN0ZXJTZXQocVRhc2tzKS5yZXN0b3JlRGVmYXVsdHMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoQml0TGlzdCBxVGFza3MpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBtZW10byA9IGdldFJlZ2lzdGVyU2V0KHFUYXNrcykuZ2V0TWVtZW50bygpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2Vzc2lvbi5nZXRMYXVuY2goKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9SRUdJU1RFUl9HUk9VUFMsIG1lbXRvKTsKLQkJCXdjLmRvU2F2ZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUFJlZ2lzdGVyTWFuYWdlciN0YXJnZXRTdXNwZW5kZWQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN1c3BlbmRlZChCaXRMaXN0IHFUYXNrcykgewotCQlnZXRSZWdpc3RlclNldChxVGFza3MpLnRhcmdldFN1c3BlbmRlZCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QU2Vzc2lvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjMyZDYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUEJyZWFrcG9pbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQTWVtb3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFJlZ2lzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2lnbmFsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LklQRGVidWdJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LlBEZWJ1Z0Vycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5QRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5QRGVidWdFeGl0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5QRGVidWdJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LlBEZWJ1Z1N1c3BlbmRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmxhdW5jaC5JUExhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJQnJlYWtwb2ludEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDb25uZWN0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUNyZWF0ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURlc3Ryb3llZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRGlzY29ubmVjdGVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFbmRTdGVwcGluZ1JhbmdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUVycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFeGl0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUZ1bmN0aW9uRmluaXNoZWRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJTG9jYXRpb25SZWFjaGVkSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESU1lbW9yeUJsb2NrSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVJlZ2lzdGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVJlc3RhcnRlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJUmVzdW1lZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU2hhcmVkTGlicmFyeUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElTaWduYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU3RhcnRlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU3VzcGVuZGVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElUaHJlYWRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJVmFyaWFibGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJV2F0Y2hwb2ludFNjb3BlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJVGFza01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTG9jYXRpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z1RhcmdldDsKLQotcHVibGljIGNsYXNzIFBTZXNzaW9uIGltcGxlbWVudHMgSVBTZXNzaW9uLCBJUERJRXZlbnRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBJUERJU2Vzc2lvbiBwZGlTZXNzaW9uOwotCXByaXZhdGUgZmluYWwgSVBMYXVuY2ggbGF1bmNoOwotCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIFBTaWduYWxNYW5hZ2VyIHNpZ25hbE1ncjsKLQlwcml2YXRlIGZpbmFsIFBCcmVha3BvaW50TWFuYWdlciBicHRNZ3I7Ci0JcHJpdmF0ZSBmaW5hbCBQTWVtb3J5TWFuYWdlciBtZW1NZ3I7Ci0JcHJpdmF0ZSBmaW5hbCBQUmVnaXN0ZXJNYW5hZ2VyIHJlZ01ncjsKLQlwcml2YXRlIGZpbmFsIFBTZXRNYW5hZ2VyIHNldE1ncjsKLQotCXB1YmxpYyBQU2Vzc2lvbihJUERJU2Vzc2lvbiBwZGlTZXNzaW9uLCBJUExhdW5jaCBsYXVuY2gsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wZGlTZXNzaW9uID0gcGRpU2Vzc2lvbjsKLQkJdGhpcy5sYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXNpZ25hbE1nciA9IG5ldyBQU2lnbmFsTWFuYWdlcih0aGlzKTsKLQkJYnB0TWdyID0gbmV3IFBCcmVha3BvaW50TWFuYWdlcih0aGlzKTsKLQkJbWVtTWdyID0gbmV3IFBNZW1vcnlNYW5hZ2VyKHRoaXMpOwotCQlyZWdNZ3IgPSBuZXcgUFJlZ2lzdGVyTWFuYWdlcih0aGlzKTsKLQkJc2V0TWdyID0gbmV3IFBTZXRNYW5hZ2VyKHRoaXMpOwotCQlnZXRQRElTZXNzaW9uKCkuZ2V0RXZlbnRNYW5hZ2VyKCkuYWRkRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2UoZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcG9zZShmaW5hbCBib29sZWFuIGZvcmNlKSB7Ci0JCVdvcmtzcGFjZUpvYiBhSm9iID0gbmV3IFdvcmtzcGFjZUpvYigiRGlzcG9zaW5nIHNlc3Npb24uLi4iKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlzaWduYWxNZ3IuZGlzcG9zZShtb25pdG9yKTsKLQkJCQlicHRNZ3IuZGlzcG9zZShtb25pdG9yKTsKLQkJCQltZW1NZ3IuZGlzcG9zZShtb25pdG9yKTsKLQkJCQlyZWdNZ3IuZGlzcG9zZShtb25pdG9yKTsKLQkJCQlzZXRNZ3IuZGlzcG9zZShtb25pdG9yKTsKLQkJCQlkZWxldGVEZWJ1Z1RhcmdldHModHJ1ZSk7Ci0JCQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLnJlbW92ZUV2ZW50TGlzdGVuZXIoUFNlc3Npb24udGhpcyk7Ci0JCQkJZ2V0UERJU2Vzc2lvbigpLnNodXRkb3duKGZvcmNlKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJYUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWFKb2Iuc2NoZWR1bGUoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3RUb0RlYnVnZ2VyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIGFwcCwgU3RyaW5nIHBhdGgsIFN0cmluZyBjd2QsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWdldFBESVNlc3Npb24oKS5jb25uZWN0VG9EZWJ1Z2dlcihtb25pdG9yLCBhcHAsIHBhdGgsIGN3ZCwgYXJncyk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsZWQgPSB0cnVlOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgbnVsbCkpOwkJCQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZhaWxlZCB8fCBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0U2V0TWFuYWdlcigpCi0JICovCi0JcHVibGljIElQU2V0TWFuYWdlciBnZXRTZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gc2V0TWdyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0U2lnbmFsTWFuYWdlcigpCi0JICovCi0JcHVibGljIElQU2lnbmFsTWFuYWdlciBnZXRTaWduYWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gc2lnbmFsTWdyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0QnJlYWtwb2ludE1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJUEJyZWFrcG9pbnRNYW5hZ2VyIGdldEJyZWFrcG9pbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gYnB0TWdyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVBSZWdpc3Rlck1hbmFnZXIgZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkgewotCQlyZXR1cm4gcmVnTWdyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0TWVtb3J5TWFuYWdlcigpCi0JICovCi0JcHVibGljIElQTWVtb3J5TWFuYWdlciBnZXRNZW1vcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWVtTWdyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVBESVNlc3Npb24uY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhQU2lnbmFsTWFuYWdlci5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0U2lnbmFsTWFuYWdlcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBEZWJ1Z0luZm8gZ2V0RGVidWdJbmZvKEJpdExpc3QgZVRhc2tzKSB7Ci0JCUlQRElUYXNrTWFuYWdlciB0YXNrTWdyID0gZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCk7Ci0JCXJldHVybiBuZXcgUERlYnVnSW5mbyhnZXRKb2IoKSwgZVRhc2tzLCB0YXNrTWdyLmdldFJlZ2lzdGVyZWRUYXNrcyhlVGFza3MuY29weSgpKSwgdGFza01nci5nZXRVbnJlZ2lzdGVyZWRUYXNrcyhlVGFza3MuY29weSgpKSk7Ci0JfQotCQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSVBESUV2ZW50TGlzdGVuZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXIjaGFuZGxlRGVidWdFdmVudHMob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKElQRElFdmVudFtdIGV2ZW50cykgewotCQlmb3IgKElQRElFdmVudCBldmVudCA6IGV2ZW50cykgewotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESUNvbm5lY3RlZEV2ZW50KSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5maXJlRGVidWdFdmVudChuZXcgUERlYnVnRXZlbnQoZ2V0U2Vzc2lvbigpLCBJUERlYnVnRXZlbnQuQ1JFQVRFLCBJUERlYnVnRXZlbnQuREVCVUdHRVIsIGdldERlYnVnSW5mbyhldmVudC5nZXRUYXNrcygpKSkpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQRElTdGFydGVkRXZlbnQpIHsKLQkJCQkvL29ubHkgY2FsbCBvbmNlCi0JCQkJYnB0TWdyLnNldEluaXRpYWxCcmVha3BvaW50cygpOwotCQkJCWJvb2xlYW4gc3RvcEluTWFpbiA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RvcEluTWFpbiA9IGdldExhdW5jaCgpLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TVE9QX0lOX01BSU4sIGZhbHNlKTsJCQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vZG8gbm90aGluZwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpZiAoc3RvcEluTWFpbikgewotCQkJCQkJYnB0TWdyLnNldFN0b3BJbk1haW4oZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tzKCkpOwotCQkJCQl9Ci0JCQkJCWdldFBESVNlc3Npb24oKS5zdGFydChnZXRQRElTZXNzaW9uKCkuZ2V0VGFza3MoKSk7Ci0JCQkJCWdldFBESVNlc3Npb24oKS5zZXRTdGF0dXMoSVBESVNlc3Npb24uU1RBUlRFRCk7Ci0JCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZmlyZURlYnVnRXZlbnQobmV3IFBEZWJ1Z0V2ZW50KGdldFNlc3Npb24oKSwgSVBEZWJ1Z0V2ZW50LkNIQU5HRSwgSVBEZWJ1Z0V2ZW50LlBST0NFU1NfU1BFQ0lGSUMsIGdldERlYnVnSW5mbyhldmVudC5nZXRUYXNrcygpKSkpOwotCQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUlQRGVidWdJbmZvIGVyckluZm8gPSBuZXcgUERlYnVnRXJyb3JJbmZvKGdldERlYnVnSW5mbyhldmVudC5nZXRUYXNrcygpKSwgIlN0YXJ0aW5nIHByb2Nlc3NlcyBlcnJvciEiLCBlLmdldE1lc3NhZ2UoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SKTsKLQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5maXJlRGVidWdFdmVudChuZXcgUERlYnVnRXZlbnQodGhpcywgSVBEZWJ1Z0V2ZW50LkVSUk9SLCBJUERlYnVnRXZlbnQuVU5TUEVDSUZJRUQsIGVyckluZm8pKTsJCQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJRGlzY29ubmVjdGVkRXZlbnQpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudChnZXRTZXNzaW9uKCksIElQRGVidWdFdmVudC5URVJNSU5BVEUsIElQRGVidWdFdmVudC5ERUJVR0dFUiwgZ2V0RGVidWdJbmZvKGV2ZW50LmdldFRhc2tzKCkpKSk7CQkJCQotCQkJCWRpc3Bvc2UoKTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJZmlyZUNoYW5nZUV2ZW50KChJUERJQ2hhbmdlZEV2ZW50KWV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ3JlYXRlZEV2ZW50KSB7Ci0JCQkJZmlyZUNyZWF0ZUV2ZW50KChJUERJQ3JlYXRlZEV2ZW50KWV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJRGVzdHJveWVkRXZlbnQpIHsKLQkJCQlmaXJlRGVzdHJveUV2ZW50KChJUERJRGVzdHJveWVkRXZlbnQpZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQRElFcnJvckV2ZW50KSB7Ci0JCQkJZmlyZUVycm9yRXZlbnQoKElQRElFcnJvckV2ZW50KWV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJUmVzdGFydGVkRXZlbnQpIHsKLQkJCQkvL1RPRE8KLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJUmVzdW1lZEV2ZW50KSB7Ci0JCQkJZmlyZVJlc3VtZUV2ZW50KChJUERJUmVzdW1lZEV2ZW50KWV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJU3VzcGVuZGVkRXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlicHRNZ3IudXBkYXRlUGVuZGluZ0JyZWFrcG9pbnRzKCk7Ci0JCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJZmlyZVN1c3BlbmRFdmVudCgoSVBESVN1c3BlbmRlZEV2ZW50KWV2ZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVBEZWJ1Z0V2ZW50IGRlYnVnRXZlbnQgPSBuZXcgUERlYnVnRXZlbnQodGhpcywgSVBEZWJ1Z0V2ZW50LlVOU1BFQ0lGSUVELCBJUERlYnVnRXZlbnQuVU5TUEVDSUZJRUQsIGdldERlYnVnSW5mbyhldmVudC5nZXRUYXNrcygpKSk7CQkKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbiNmb3JjZVN0b3BwZWREZWJ1Z2dlcihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcmNlU3RvcHBlZERlYnVnZ2VyKFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlIHN0YXRlKSB7Ci0JCUJpdExpc3QgdGFza3MgPSBnZXRUYXNrcygpOwotCQljaGFuZ2VQcm9jZXNzU3RhdGUodGFza3MsIHN0YXRlKTsKLQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5maXJlRGVidWdFdmVudChuZXcgUERlYnVnRXZlbnQoZ2V0U2Vzc2lvbigpLCBJUERlYnVnRXZlbnQuVEVSTUlOQVRFLCBJUERlYnVnRXZlbnQuREVCVUdHRVIsIGdldERlYnVnSW5mbyh0YXNrcykpKTsKLQkJZGlzcG9zZSh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHN0YXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVByb2Nlc3NTdGF0ZShCaXRMaXN0IHRhc2tzLCBQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSkgewotCQlJUEpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJTGlzdDxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PElQUHJvY2Vzc0NvbnRyb2w+KCk7Ci0JCWZvciAoaW50IHRhc2sgOiB0YXNrcy50b0FycmF5KCkpIHsKLQkJCUlQUHJvY2VzcyBwID0gam9iLmdldFByb2Nlc3NCeUluZGV4KHRhc2spOwotCQkJaWYgKHAgaW5zdGFuY2VvZiBJUFByb2Nlc3NDb250cm9sKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZCgoSVBQcm9jZXNzQ29udHJvbClwKTsKLQkJCX0KLQkJfQotCQkoKElQSm9iQ29udHJvbClqb2IpLmFkZFByb2Nlc3NBdHRyaWJ1dGVzKHByb2Nlc3NlcywgbmV3IElBdHRyaWJ1dGVbXSB7IFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShzdGF0ZSkgfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVTdXNwZW5kRXZlbnQoSVBESVN1c3BlbmRlZEV2ZW50IGV2ZW50KSB7Ci0JCS8qCi0JCXRyeSB7Ci0JCQlnZXRQRElTZXNzaW9uKCkudmFsaWRhdGVTdGVwUmV0dXJuKGV2ZW50LmdldFRhc2tzKCkuY29weSgpKTsKLQkJfQotCQljYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCUlQRGVidWdJbmZvIGVyckluZm8gPSBuZXcgUERlYnVnRXJyb3JJbmZvKGdldERlYnVnSW5mbyhlLmdldFRhc2tzKCkpLCAiQ2hlY2sgc3RlcCByZXR1cm4gZXJyb3IhIiwgZS5nZXRNZXNzYWdlKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUik7Ci0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudCh0aGlzLCBJUERlYnVnRXZlbnQuRVJST1IsIElQRGVidWdFdmVudC5VTlNQRUNJRklFRCwgZXJySW5mbykpOwkJCi0JCX0KLQkJKi8KLQkJSVBEZWJ1Z0luZm8gYmFzZUluZm8gPSBnZXREZWJ1Z0luZm8oZXZlbnQuZ2V0VGFza3MoKSk7Ci0JCWludCBkZXRhaWwgPSBJUERlYnVnRXZlbnQuVU5TUEVDSUZJRUQ7Ci0JCQotCQlpbnQgbGluZU51bWJlciA9IDA7Ci0JCWludCBsZXZlbCA9IGV2ZW50LmdldExldmVsKCk7Ci0JCWludCBkZXB0aCA9IGV2ZW50LmdldERlcHRoKCk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9ICIiOwotCQlJUERJU2Vzc2lvbk9iamVjdCByZWFzb24gPSBldmVudC5nZXRSZWFzb24oKTsKLQkJaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQkJSVBESUJyZWFrcG9pbnQgYnB0ID0gKChJUERJQnJlYWtwb2ludEluZm8pcmVhc29uKS5nZXRCcmVha3BvaW50KCk7Ci0JCQlpZiAoYnB0IGluc3RhbmNlb2YgSVBESUxvY2F0aW9uQnJlYWtwb2ludCkgewotCQkJCUlQRElMb2NhdG9yIGxvY2F0b3IgPSAoKElQRElMb2NhdGlvbkJyZWFrcG9pbnQpIGJwdCkuZ2V0TG9jYXRvcigpOwotCQkJCWlmIChsb2NhdG9yICE9IG51bGwpIHsKLQkJCQkJbGluZU51bWJlciA9IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotCQkJCQlmaWxlTmFtZSArPSBsb2NhdG9yLmdldEZpbGUoKTsKLQkJCQkJZGV0YWlsID0gSVBEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQ7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElFbmRTdGVwcGluZ1JhbmdlSW5mbykgewotCQkJSVBESUxvY2F0b3IgbG9jYXRvciA9ICgoSVBESUVuZFN0ZXBwaW5nUmFuZ2VJbmZvKXJlYXNvbikuZ2V0TG9jYXRvcigpOwotCQkJaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotCQkJCWxpbmVOdW1iZXIgPSBsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCQlmaWxlTmFtZSArPSBsb2NhdG9yLmdldEZpbGUoKTsKLQkJCQlkZXRhaWwgPSBJUERlYnVnRXZlbnQuU1RFUF9FTkQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUxvY2F0aW9uUmVhY2hlZEluZm8pIHsKLQkJCUlQRElMb2NhdG9yIGxvY2F0b3IgPSAoKElQRElMb2NhdGlvblJlYWNoZWRJbmZvKXJlYXNvbikuZ2V0TG9jYXRvcigpOwotCQkJaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotCQkJCWxpbmVOdW1iZXIgPSBsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCQlmaWxlTmFtZSArPSBsb2NhdG9yLmdldEZpbGUoKTsKLQkJCQlkZXRhaWwgPSBJUERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1Q7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVNpZ25hbEluZm8pIHsKLQkJCUlQRElMb2NhdG9yIGxvY2F0b3IgPSAoKElQRElTaWduYWxJbmZvKXJlYXNvbikuZ2V0TG9jYXRvcigpOwotCQkJaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotCQkJCWxpbmVOdW1iZXIgPSBsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCQlmaWxlTmFtZSArPSBsb2NhdG9yLmdldEZpbGUoKTsKLQkJCQlkZXRhaWwgPSBJUERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1Q7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUZ1bmN0aW9uRmluaXNoZWRJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJU2hhcmVkTGlicmFyeUluZm8pIHsKLQkJCS8vVE9ETwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElXYXRjaHBvaW50U2NvcGVJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJV2F0Y2hwb2ludFRyaWdnZXJJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfQotCQljaGFuZ2VQcm9jZXNzU3RhdGUoZXZlbnQuZ2V0VGFza3MoKSwgUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuU1VTUEVOREVEKTsKLQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5maXJlRGVidWdFdmVudChuZXcgUERlYnVnRXZlbnQoZ2V0U2Vzc2lvbigpLCBJUERlYnVnRXZlbnQuU1VTUEVORCwgZGV0YWlsLCBuZXcgUERlYnVnU3VzcGVuZEluZm8oYmFzZUluZm8sIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBsZXZlbCwgZGVwdGgpKSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVSZXN1bWVFdmVudChJUERJUmVzdW1lZEV2ZW50IGV2ZW50KSB7Ci0JCUlQRGVidWdJbmZvIGJhc2VJbmZvID0gZ2V0RGVidWdJbmZvKGV2ZW50LmdldFRhc2tzKCkpOwotCQlpbnQgZGV0YWlsID0gSVBEZWJ1Z0V2ZW50LlVOU1BFQ0lGSUVEOwotCi0JCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX0lOVE86Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX0lOVE9fSU5TVFJVQ1RJT046Ci0JCQlkZXRhaWwgPSBJUERlYnVnRXZlbnQuU1RFUF9JTlRPOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX09WRVI6Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX09WRVJfSU5TVFJVQ1RJT046Ci0JCQlkZXRhaWwgPSBJUERlYnVnRXZlbnQuU1RFUF9PVkVSOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX1JFVFVSTjoKLQkJCWRldGFpbCA9IElQRGVidWdFdmVudC5TVEVQX1JFVFVSTjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2hhbmdlUHJvY2Vzc1N0YXRlKGV2ZW50LmdldFRhc2tzKCksIFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLlJVTk5JTkcpOwotCi0JCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZmlyZURlYnVnRXZlbnQobmV3IFBEZWJ1Z0V2ZW50KHRoaXMsIElQRGVidWdFdmVudC5SRVNVTUUsIGRldGFpbCwgYmFzZUluZm8pKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgZmlyZURlc3Ryb3lFdmVudChJUERJRGVzdHJveWVkRXZlbnQgZXZlbnQpIHsKLQkJSVBEZWJ1Z0V2ZW50IGRlYnVnRXZlbnQgPSBudWxsOwotCQlJUERlYnVnSW5mbyBiYXNlSW5mbyA9IGdldERlYnVnSW5mbyhldmVudC5nZXRUYXNrcygpKTsKLQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gZXZlbnQuZ2V0UmVhc29uKCk7Ci0KLQkJaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElFcnJvckluZm8pIHsKLQkJCWRlbGV0ZURlYnVnVGFyZ2V0KGJhc2VJbmZvLmdldEFsbFJlZ2lzdGVyZWRUYXNrcygpLmNvcHkoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlJUERlYnVnSW5mbyBlcnJJbmZvID0gbmV3IFBEZWJ1Z0Vycm9ySW5mbyhiYXNlSW5mbywgKChJUERJRXJyb3JJbmZvKXJlYXNvbikuZ2V0TWVzc2FnZSgpLCAoKElQRElFcnJvckluZm8pcmVhc29uKS5nZXREZXRhaWxNZXNzYWdlKCksICgoSVBESUVycm9ySW5mbylyZWFzb24pLmdldENvZGUoKSk7Ci0JCQlkZWJ1Z0V2ZW50ID0gbmV3IFBEZWJ1Z0V2ZW50KHRoaXMsIElQRGVidWdFdmVudC5URVJNSU5BVEUsIElQRGVidWdFdmVudC5FUlJPUiwgZXJySW5mbyk7Ci0JCQljaGFuZ2VQcm9jZXNzU3RhdGUoZXZlbnQuZ2V0VGFza3MoKSwgUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuRVJST1IpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElFeGl0SW5mbykgewotCQkJZGVsZXRlRGVidWdUYXJnZXQoYmFzZUluZm8uZ2V0QWxsUmVnaXN0ZXJlZFRhc2tzKCkuY29weSgpLCB0cnVlLCB0cnVlKTsKLQkJCUlQRGVidWdJbmZvIGV4aXRJbmZvID0gbmV3IFBEZWJ1Z0V4aXRJbmZvKGJhc2VJbmZvLCAoKElQRElFeGl0SW5mbylyZWFzb24pLmdldENvZGUoKSwgIkV4aXRlZCIsICJFeGl0ZWQiKTsKLQkJCWRlYnVnRXZlbnQgPSBuZXcgUERlYnVnRXZlbnQodGhpcywgSVBEZWJ1Z0V2ZW50LlRFUk1JTkFURSwgSVBEZWJ1Z0V2ZW50LlBST0NFU1NfU1BFQ0lGSUMsIGV4aXRJbmZvKTsKLQkJCWNoYW5nZVByb2Nlc3NTdGF0ZShldmVudC5nZXRUYXNrcygpLCBQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5FWElURUQpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaWduYWxJbmZvKSB7Ci0JCQlkZWxldGVEZWJ1Z1RhcmdldChiYXNlSW5mby5nZXRBbGxSZWdpc3RlcmVkVGFza3MoKS5jb3B5KCksIHRydWUsIHRydWUpOwotCQkJSVBEZWJ1Z0luZm8gZXhpdEluZm8gPSBuZXcgUERlYnVnRXhpdEluZm8oYmFzZUluZm8sIDAsICgoSVBESVNpZ25hbEluZm8pcmVhc29uKS5nZXREZXNjcmlwdGlvbigpLCAoKElQRElTaWduYWxJbmZvKXJlYXNvbikuZ2V0TmFtZSgpKTsKLQkJCWRlYnVnRXZlbnQgPSBuZXcgUERlYnVnRXZlbnQodGhpcywgSVBEZWJ1Z0V2ZW50LlRFUk1JTkFURSwgSVBEZWJ1Z0V2ZW50LlBST0NFU1NfU1BFQ0lGSUMsIGV4aXRJbmZvKTsKLQkJCWNoYW5nZVByb2Nlc3NTdGF0ZShldmVudC5nZXRUYXNrcygpLCBQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5FWElURURfU0lHTkFMTEVEKTsKLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJU2hhcmVkTGlicmFyeUluZm8pIHsKLQkJCS8vVE9ETwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElUaHJlYWRJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJVmFyaWFibGVJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfSBlbHNlIHsKLQkJCWRlYnVnRXZlbnQgPSBuZXcgUERlYnVnRXZlbnQodGhpcywgSVBEZWJ1Z0V2ZW50LlRFUk1JTkFURSwgSVBEZWJ1Z0V2ZW50LlVOU1BFQ0lGSUVELCBiYXNlSW5mbyk7CQkKLQkJfQotCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlRXJyb3JFdmVudChJUERJRXJyb3JFdmVudCBldmVudCkgewotCQlJUERlYnVnSW5mbyBiYXNlSW5mbyA9IGdldERlYnVnSW5mbyhldmVudC5nZXRUYXNrcygpKTsKLQkJaW50IGRldGFpbCA9IElQRGVidWdFdmVudC5VTlNQRUNJRklFRDsKLQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gZXZlbnQuZ2V0UmVhc29uKCk7Ci0JCWlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJRXJyb3JJbmZvKSB7Ci0JCQlpbnQgY29kZSA9ICgoSVBESUVycm9ySW5mbylyZWFzb24pLmdldENvZGUoKTsKLQkJCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBJUERJRXJyb3JJbmZvLkRCR19GQVRBTDoKLQkJCQlkZXRhaWwgPSBJUERlYnVnRXZlbnQuRVJSX0ZBVEFMOwotCQkJCS8vb25seSBmYXRhbCBlcnJvciByZXBvcnRzIHByb2Nlc3MgZXJyb3IKLQkJCQljaGFuZ2VQcm9jZXNzU3RhdGUoZXZlbnQuZ2V0VGFza3MoKSwgUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuRVJST1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUERJRXJyb3JJbmZvLkRCR19XQVJOSU5HOgotCQkJCWRldGFpbCA9IElQRGVidWdFdmVudC5FUlJfV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVBESUVycm9ySW5mby5EQkdfSUdOT1JFOgotCQkJY2FzZSBJUERJRXJyb3JJbmZvLkRCR19OT1JNQUw6Ci0JCQkJZGV0YWlsID0gSVBEZWJ1Z0V2ZW50LkVSUl9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlJUERlYnVnSW5mbyBlcnJJbmZvID0gbmV3IFBEZWJ1Z0Vycm9ySW5mbyhiYXNlSW5mbywgKChJUERJRXJyb3JJbmZvKXJlYXNvbikuZ2V0TWVzc2FnZSgpLCAoKElQRElFcnJvckluZm8pcmVhc29uKS5nZXREZXRhaWxNZXNzYWdlKCksICgoSVBESUVycm9ySW5mbylyZWFzb24pLmdldENvZGUoKSk7CQkJCi0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudCh0aGlzLCBJUERlYnVnRXZlbnQuRVJST1IsIGRldGFpbCwgZXJySW5mbykpOwotCQl9IGVsc2UgewotCQkJSVBEZWJ1Z0luZm8gZXJySW5mbyA9IG5ldyBQRGVidWdFcnJvckluZm8oYmFzZUluZm8sICJJbnRlcm5hbCBFcnJvciEiLCAiVW5rbm93biIsIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUik7Ci0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudCh0aGlzLCBJUERlYnVnRXZlbnQuRVJST1IsIElQRGVidWdFdmVudC5VTlNQRUNJRklFRCwgZXJySW5mbykpOwkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgZmlyZUNoYW5nZUV2ZW50KElQRElDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVBEZWJ1Z0luZm8gYmFzZUluZm8gPSBnZXREZWJ1Z0luZm8oZXZlbnQuZ2V0VGFza3MoKSk7Ci0JCWludCBkZXRhaWwgPSBJUERlYnVnRXZlbnQuVU5TUEVDSUZJRUQ7Ci0JCQotCQlJUERJU2Vzc2lvbk9iamVjdCByZWFzb24gPSBldmVudC5nZXRSZWFzb24oKTsKLQkJaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElNZW1vcnlCbG9ja0luZm8pIHsKLQkJCS8vVE9ETwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaWduYWxJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJVmFyaWFibGVJbmZvKSB7Ci0JCQkvL1RPRE8KLQkJfQotCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudCh0aGlzLCBJUERlYnVnRXZlbnQuQ0hBTkdFLCBkZXRhaWwsIGJhc2VJbmZvKSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDcmVhdGVFdmVudChJUERJQ3JlYXRlZEV2ZW50IGV2ZW50KSB7Ci0JCUlQRGVidWdJbmZvIGJhc2VJbmZvID0gZ2V0RGVidWdJbmZvKGV2ZW50LmdldFRhc2tzKCkpOwotCQlpbnQgZGV0YWlsID0gSVBEZWJ1Z0V2ZW50LlVOU1BFQ0lGSUVEOwotCi0JCUlQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiA9IGV2ZW50LmdldFJlYXNvbigpOwotCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUJyZWFrcG9pbnRJbmZvKSB7Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVRocmVhZEluZm8pIHsKLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJTWVtb3J5QmxvY2tJbmZvKSB7Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVJlZ2lzdGVySW5mbykgewotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaGFyZWRMaWJyYXJ5SW5mbykgewotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElWYXJpYWJsZUluZm8pIHsKLQkJfSBlbHNlIHsKLQkJfQotCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudCh0aGlzLCBJUERlYnVnRXZlbnQuQ1JFQVRFLCBkZXRhaWwsIGJhc2VJbmZvKSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiBAcGFyYW0gaW5mbwotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVEZWJ1Z0V2ZW50KGludCB0eXBlLCBpbnQgZGV0YWlscywgSVBEZWJ1Z0luZm8gaW5mbykgewotCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50KG5ldyBQRGVidWdFdmVudCh0aGlzLCB0eXBlLCBkZXRhaWxzLCBpbmZvKSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlRGVidWdFdmVudChpbnQgdHlwZSwgaW50IGRldGFpbHMsIEJpdExpc3QgdGFza3MpIHsKLQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5maXJlRGVidWdFdmVudChuZXcgUERlYnVnRXZlbnQodGhpcywgdHlwZSwgZGV0YWlscywgZ2V0RGVidWdJbmZvKHRhc2tzKSkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0UERJU2Vzc2lvbigpCi0JICovCi0JcHVibGljIElQRElTZXNzaW9uIGdldFBESVNlc3Npb24oKSB7Ci0JCXJldHVybiBwZGlTZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0Sm9iKCkKLQkgKi8KLQlwdWJsaWMgSVBKb2IgZ2V0Sm9iKCkgewotCQlyZXR1cm4gZ2V0TGF1bmNoKCkuZ2V0UEpvYigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0TGF1bmNoKCkKLQkgKi8KLQlwdWJsaWMgSVBMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQlyZXR1cm4gbGF1bmNoOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZmluZERlYnVnVGFyZ2V0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgUERlYnVnVGFyZ2V0IGZpbmREZWJ1Z1RhcmdldChCaXRMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiAoUERlYnVnVGFyZ2V0KWxhdW5jaC5nZXREZWJ1Z1RhcmdldCh0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbiNnZXRUYXNrcyhpbnQpCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoaW50IGlkKSB7Ci0JCWludCBtYXggPSBnZXRQRElTZXNzaW9uKCkuZ2V0VG90YWxUYXNrcygpOwotCQlCaXRMaXN0IHRhc2tzID0gbmV3IEJpdExpc3QobWF4KTsKLQkJaWYgKGlkID49IDAgJiYgaWQgPD0gbWF4KQotCQkJdGFza3Muc2V0KGlkKTsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZ2V0VGFza3MoKQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFRhc2tzKCkgewotCQlyZXR1cm4gZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbiNpc1JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWR5KCkgewotCQlyZXR1cm4gKGdldFBESVNlc3Npb24oKS5nZXRTdGF0dXMoKSA9PSBJUERJU2Vzc2lvbi5TVEFSVEVEKTsKLQl9Ci0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiByZWdpc3RlciAvIHVucmVnaXN0ZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb24jZGVsZXRlRGVidWdUYXJnZXRzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGVidWdUYXJnZXRzKGJvb2xlYW4gcmVnaXN0ZXIpIHsKLQkJaWYgKGlzUmVhZHkoKSkgewotCQkJQml0TGlzdCB0YXNrcyA9IGdldFBESVNlc3Npb24oKS5nZXRUYXNrTWFuYWdlcigpLmdldFJlZ2lzdGVyZWRUYXNrcygpLmNvcHkoKTsKLQkJCWRlbGV0ZURlYnVnVGFyZ2V0KHRhc2tzLCB0cnVlLCByZWdpc3Rlcik7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uI3JlbG9hZERlYnVnVGFyZ2V0cyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2FkRGVidWdUYXJnZXRzKEJpdExpc3QgdGFza3MsIGJvb2xlYW4gcmVmcmVzaCwgYm9vbGVhbiByZWdpc3RlcikgewotCQlpZiAoaXNSZWFkeSgpKSB7Ci0JCQlCaXRMaXN0IGN1clJlZ1Rhc2tzID0gZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuZ2V0UmVnaXN0ZXJlZFRhc2tzKHRhc2tzLmNvcHkoKSk7Ci0JCQlCaXRMaXN0IG90aFJlZ1Rhc2tzID0gZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuZ2V0UmVnaXN0ZXJlZFRhc2tzKCkuY29weSgpOwotCQkJb3RoUmVnVGFza3MuYW5kTm90KGN1clJlZ1Rhc2tzKTsKLQkJCWRlbGV0ZURlYnVnVGFyZ2V0KG90aFJlZ1Rhc2tzLCByZWZyZXNoLCByZWdpc3Rlcik7Ci0JCQljcmVhdGVEZWJ1Z1RhcmdldChjdXJSZWdUYXNrcywgcmVmcmVzaCwgcmVnaXN0ZXIpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbiNjcmVhdGVEZWJ1Z1RhcmdldChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGVidWdUYXJnZXQoQml0TGlzdCB0YXNrcywgYm9vbGVhbiByZWZyZXNoLCBib29sZWFuIHJlZ2lzdGVyKSB7Ci0JCWlmIChpc1JlYWR5KCkpIHsKLQkJCUxpc3Q8SVBESVRhcmdldD4gdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8SVBESVRhcmdldD4oKTsKLQkJCWludFtdIHRhc2tfYXJyYXkgPSB0YXNrcy50b0FycmF5KCk7Ci0JCQlmb3IgKGludCB0YXNrX2lkIDogdGFza19hcnJheSkgewotCQkJCUlQRElUYXJnZXQgdGFyZ2V0ID0gZ2V0UERJU2Vzc2lvbigpLmdldFRhcmdldE1hbmFnZXIoKS5hZGRUYXJnZXQoZ2V0VGFza3ModGFza19pZCkpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQl0YXJnZXRzLmFkZCh0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGFza3MuY2xlYXIodGFza19pZCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlZ2lzdGVyKQotCQkJCWdldFBESVNlc3Npb24oKS5nZXRUYXNrTWFuYWdlcigpLnNldFJlZ2lzdGVyVGFza3ModHJ1ZSwgdGFza3MpOwotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlYnVnTW9kZWwoKS5hZGROZXdEZWJ1Z1RhcmdldHMoZ2V0TGF1bmNoKCksIHRhc2tzLCB0YXJnZXRzLnRvQXJyYXkobmV3IElQRElUYXJnZXRbMF0pLCByZWZyZXNoLCBmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uI2RlbGV0ZURlYnVnVGFyZ2V0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEZWJ1Z1RhcmdldChCaXRMaXN0IHRhc2tzLCBib29sZWFuIHJlZnJlc2gsIGJvb2xlYW4gcmVnaXN0ZXIpIHsKLQkJaW50W10gdGFza19hcnJheSA9IHRhc2tzLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgdGFza19pZCA6IHRhc2tfYXJyYXkpIHsKLQkJCWlmICghZ2V0UERJU2Vzc2lvbigpLmdldFRhcmdldE1hbmFnZXIoKS5yZW1vdmVUYXJnZXQoZ2V0VGFza3ModGFza19pZCkpKSB7Ci0JCQkJdGFza3MuY2xlYXIodGFza19pZCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZ2lzdGVyKQotCQkJZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuc2V0UmVnaXN0ZXJUYXNrcyhmYWxzZSwgdGFza3MpOwotCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVidWdNb2RlbCgpLnJlbW92ZURlYnVnVGFyZ2V0KGdldExhdW5jaCgpLCB0YXNrcywgcmVmcmVzaCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTZXNzaW9uTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTZXNzaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGM4YzhkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QU2Vzc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUFNlc3Npb25NYW5hZ2VyIGltcGxlbWVudHMgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBNYXA8SVBKb2IsIElQU2Vzc2lvbj4gc2Vzc2lvbk1hcDsKLQkKLQlwdWJsaWMgUFNlc3Npb25NYW5hZ2VyKCkgewotCQlzZXNzaW9uTWFwID0gbmV3IEhhc2h0YWJsZTxJUEpvYiwgSVBTZXNzaW9uPigpOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQlwdWJsaWMgSVBTZXNzaW9uIGdldFNlc3Npb24oSVBKb2Igam9iKSB7Ci0JCXN5bmNocm9uaXplZCAoc2Vzc2lvbk1hcCkgewotCQkJcmV0dXJuIHNlc3Npb25NYXAuZ2V0KGpvYik7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgYWRkU2Vzc2lvbihJUEpvYiBqb2IsIElQU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCXN5bmNocm9uaXplZCAoc2Vzc2lvbk1hcCkgewotCQkJc2Vzc2lvbk1hcC5wdXQoam9iLCBzZXNzaW9uKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXNzaW9uKElQSm9iIGpvYikgewotCQlzeW5jaHJvbml6ZWQgKHNlc3Npb25NYXApIHsKLQkJCXNlc3Npb25NYXAucmVtb3ZlKGpvYik7Ci0JCX0KLQl9Ci0JcHVibGljIElQU2Vzc2lvbltdIGdldFNlc3Npb25zKCkgewotCQlzeW5jaHJvbml6ZWQgKHNlc3Npb25NYXApIHsKLQkJCXJldHVybiBzZXNzaW9uTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IElQU2Vzc2lvblswXSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCXNlc3Npb25NYXAuY2xlYXIoKTsKLQl9Ci0JcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9QU2V0TWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTZXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTY4ZjMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTZXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQU2V0TWFuYWdlciBpbXBsZW1lbnRzIElQU2V0TWFuYWdlciB7Ci0JcHJpdmF0ZSBmaW5hbCBJUFNlc3Npb24gc2Vzc2lvbjsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEJpdExpc3Q+IHNldE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQml0TGlzdD4oKTsKLQotCXB1YmxpYyBQU2V0TWFuYWdlcihJUFNlc3Npb24gc2Vzc2lvbikgewotCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCQljcmVhdGVTZXQoUHJlZmVyZW5jZUNvbnN0YW50cy5TRVRfUk9PVF9JRCwgc2Vzc2lvbi5nZXRUYXNrcygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUFNldE1hbmFnZXIjYWRkVGFza3MoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tzKFN0cmluZyBzaWQsIEJpdExpc3QgdGFza3MpIHsKLQkJY3JlYXRlU2V0KHNpZCwgdGFza3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQU2V0TWFuYWdlciNjcmVhdGVTZXQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVNldChTdHJpbmcgc2lkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCUJpdExpc3Qgb2xkVGFza3MgPSBnZXRUYXNrcyhzaWQpOwotCQlpZiAob2xkVGFza3MgPT0gbnVsbCkgewotCQkJc2V0TWFwLnB1dChzaWQsIHRhc2tzKTsKLQkJfSBlbHNlIHsKLQkJCW9sZFRhc2tzLm9yKHRhc2tzKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQU2V0TWFuYWdlciNkZWxldGVTZXRzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlU2V0cyhTdHJpbmcgc2lkKSB7Ci0JCXNldE1hcC5yZW1vdmUoc2lkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNldE1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLklQU2V0TWFuYWdlciNnZXRUYXNrcyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFRhc2tzKFN0cmluZyBzaWQpIHsKLQkJcmV0dXJuIHNldE1hcC5nZXQoc2lkKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUFNldE1hbmFnZXIjcmVtb3ZlVGFza3MoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2tzKFN0cmluZyBzaWQsIEJpdExpc3QgdGFza3MpIHsKLQkJQml0TGlzdCBvbGRUYXNrcyA9IGdldFRhc2tzKHNpZCk7Ci0JCWlmIChvbGRUYXNrcyAhPSBudWxsKSB7Ci0JCQlvbGRUYXNrcy5hbmROb3QodGFza3MpOwotCQl9Ci0JCWlmIChvbGRUYXNrcy5pc0VtcHR5KCkpIHsKLQkJCWRlbGV0ZVNldHMoc2lkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBESVNlc3Npb24gZ2V0UERJU2Vzc2lvbigpIHsKLQkJcmV0dXJuIGdldFNlc3Npb24oKS5nZXRQRElTZXNzaW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1BTaWduYWxNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUFNpZ25hbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZTNiNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUFNpZ25hbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTaWduYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBTaWduYWw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgUFNpZ25hbE1hbmFnZXIgaW1wbGVtZW50cyBJQWRhcHRhYmxlLCBJUERJRXZlbnRMaXN0ZW5lciwgSVBTaWduYWxNYW5hZ2VyIHsKLQlwcml2YXRlIGNsYXNzIFBTaWduYWxTZXQgewotCQlwcml2YXRlIElQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQ7Ci0JCXByaXZhdGUgZmluYWwgQml0TGlzdCBzVGFza3M7Ci0JCXByaXZhdGUgSVBTaWduYWxbXSBmU2lnbmFscyA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSXNEaXNwb3NlZCA9IGZhbHNlOwotCi0JCXB1YmxpYyBQU2lnbmFsU2V0KEJpdExpc3Qgc1Rhc2tzLCBQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQpIHsKLQkJCXRoaXMuc1Rhc2tzID0gc1Rhc2tzOwotCQkJdGhpcy5kZWJ1Z1RhcmdldCA9IGRlYnVnVGFyZ2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAoZlNpZ25hbHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNpZ25hbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJKChQU2lnbmFsKSBmU2lnbmFsc1tpXSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWZTaWduYWxzID0gbnVsbDsKLQkJCWZJc0Rpc3Bvc2VkID0gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGRpU2lnbmFsCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBQU2lnbmFsIGZpbmQoSVBESVNpZ25hbCBwZGlTaWduYWwpIHsKLQkJCXRyeSB7Ci0JCQkJSVBTaWduYWxbXSBzaWduYWxzID0gZ2V0U2lnbmFscygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmFscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAoc2lnbmFsc1tpXS5nZXROYW1lKCkuZXF1YWxzKHBkaVNpZ25hbC5nZXROYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gKFBTaWduYWwpIHNpZ25hbHNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgSVBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJCWlmIChkZWJ1Z1RhcmdldCA9PSBudWxsKSB7Ci0JCQkJZGVidWdUYXJnZXQgPSBzZXNzaW9uLmZpbmREZWJ1Z1RhcmdldChzVGFza3MpOwotCQkJfQotCQkJcmV0dXJuIGRlYnVnVGFyZ2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBJUFNpZ25hbFtdIGdldFNpZ25hbHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJaWYgKCFmSXNEaXNwb3NlZCAmJiBmU2lnbmFscyA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVBESVNpZ25hbFtdIHBkaVNpZ25hbHMgPSBzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRTaWduYWxNYW5hZ2VyKCkuZ2V0U2lnbmFscyhzVGFza3MpOwotCQkJCQlBcnJheUxpc3Q8SVBTaWduYWw+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElQU2lnbmFsPihwZGlTaWduYWxzLmxlbmd0aCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGRpU2lnbmFscy5sZW5ndGg7ICsraSkgewotCQkJCQkJbGlzdC5hZGQobmV3IFBTaWduYWwoc2Vzc2lvbiwgc1Rhc2tzLCBwZGlTaWduYWxzW2ldKSk7Ci0JCQkJCX0KLQkJCQkJZlNpZ25hbHMgPSAoSVBTaWduYWxbXSkgbGlzdC50b0FycmF5KG5ldyBJUFNpZ25hbFtsaXN0LnNpemUoKV0pOwotCQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93RGVidWdFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIERlYnVnRXhjZXB0aW9uLlRBUkdFVF9SRVFVRVNUX0ZBSUxFRCwgZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChmU2lnbmFscyAhPSBudWxsKSA/IGZTaWduYWxzIDogbmV3IElQU2lnbmFsWzBdOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwZGlTaWduYWwKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNpZ25hbENoYW5nZWQoSVBESVNpZ25hbCBwZGlTaWduYWwpIHsKLQkJCVBTaWduYWwgc2lnbmFsID0gZmluZChwZGlTaWduYWwpOwotCQkJaWYgKHNpZ25hbCAhPSBudWxsKSB7Ci0JCQkJc2lnbmFsLmZpcmVDaGFuZ2VFdmVudChEZWJ1Z0V2ZW50LlNUQVRFKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgSVBTZXNzaW9uIHNlc3Npb247Ci0JcHJvdGVjdGVkIGZpbmFsIE1hcDxCaXRMaXN0LCBQU2lnbmFsU2V0PiBmUFNpZ25hbFNldE1hcCA9IG5ldyBIYXNoTWFwPEJpdExpc3QsIFBTaWduYWxTZXQ+KCk7Ci0KLQlwdWJsaWMgUFNpZ25hbE1hbmFnZXIoSVBTZXNzaW9uIHNlc3Npb24pIHsKLQkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUFNpZ25hbE1hbmFnZXIjZGlzcG9zZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZShCaXRMaXN0IHFUYXNrcykgewotCQlnZXRTaWduYWxTZXQocVRhc2tzKS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGZQU2lnbmFsU2V0TWFwKSB7Ci0JCQkJCUl0ZXJhdG9yPFBTaWduYWxTZXQ+IGl0ID0gZlBTaWduYWxTZXRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJKChQU2lnbmFsU2V0KSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlmUFNpZ25hbFNldE1hcC5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQRElTZXNzaW9uLmNsYXNzKSkKLQkJCXJldHVybiBnZXRTZXNzaW9uKCk7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhQU2lnbmFsTWFuYWdlci5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuSVBTaWduYWxNYW5hZ2VyI2dldFNpZ25hbHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyBJUFNpZ25hbFtdIGdldFNpZ25hbHMoQml0TGlzdCBxVGFza3MpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRTaWduYWxTZXQocVRhc2tzKS5nZXRTaWduYWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUFNpZ25hbFNldCBnZXRTaWduYWxTZXQoQml0TGlzdCBxVGFza3MpIHsKLQkJc3luY2hyb25pemVkIChmUFNpZ25hbFNldE1hcCkgewotCQkJUFNpZ25hbFNldCBzZXQgPSAoUFNpZ25hbFNldCkgZlBTaWduYWxTZXRNYXAuZ2V0KHFUYXNrcyk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlzZXQgPSBuZXcgUFNpZ25hbFNldChxVGFza3MsIG51bGwpOwotCQkJCWZQU2lnbmFsU2V0TWFwLnB1dChxVGFza3MsIHNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2V0OwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyI2hhbmRsZURlYnVnRXZlbnRzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhJUERJRXZlbnRbXSBldmVudHMpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5JUFNpZ25hbE1hbmFnZXIjc2lnbmFsQ2hhbmdlZChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNpZ25hbENoYW5nZWQoQml0TGlzdCBxVGFza3MsIElQRElTaWduYWwgcGRpU2lnbmFsKSB7Ci0JCWdldFNpZ25hbFNldChxVGFza3MpLnNpZ25hbENoYW5nZWQocGRpU2lnbmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd0RlYnVnRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERlYnVnRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUERlYnVnTW9kZWwuZ2V0UGx1Z2luSWRlbnRpZmllcigpLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDk0Y2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlOyAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElGb3JtYXQ7Ci0gCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCXB1YmxpYyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJUERlYnVnQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9WQVJJQUJMRV9GT1JNQVQsIElQRElGb3JtYXQuTkFUVVJBTCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX0RFRkFVTFRfRVhQUkVTU0lPTl9GT1JNQVQsIElQRElGb3JtYXQuTkFUVVJBTCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1NIT1dfRlVMTF9QQVRIUywgZmFsc2UpOwotCQlzdG9yZS5zZXREZWZhdWx0KElQRGVidWdDb25zdGFudHMuUFJFRl9QVFBfREVCVUdfUkVHSVNURVJfUFJPQ18wLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJUERlYnVnQ29uc3RhbnRzLlBSRUZfUFRQX0RFQlVHX0NPTU1fVElNRU9VVCwgSVBEZWJ1Z0NvbnN0YW50cy5ERUZBVUxUX0RFQlVHX0NPTU1fVElNRU9VVCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1VQREFURV9WQVJJQUJMRVNfT05fU1VTUEVORCwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1VQREFURV9WQVJJQUJMRVNfT05fQ0hBTkdFLCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvQWJzdHJhY3RMaW5lQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvQWJzdHJhY3RMaW5lQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzkxZjhkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L0Fic3RyYWN0TGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5icmVha3BvaW50OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUExpbmVCcmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpbmVCcmVha3BvaW50IGV4dGVuZHMgUEJyZWFrcG9pbnQgaW1wbGVtZW50cyBJUExpbmVCcmVha3BvaW50IHsKLQlwdWJsaWMgQWJzdHJhY3RMaW5lQnJlYWtwb2ludCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIEFic3RyYWN0TGluZUJyZWFrcG9pbnQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWFya2VyVHlwZSwgTWFwPD8sPz4gYXR0cmlidXRlcywgYm9vbGVhbiBhZGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocmVzb3VyY2UsIG1hcmtlclR5cGUsIGF0dHJpYnV0ZXMsIGFkZCk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuc3VyZU1hcmtlcigpLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0Q2hhclN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgLTEpOwotCX0KLQlwdWJsaWMgaW50IGdldENoYXJFbmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgLTEpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSVBMaW5lQnJlYWtwb2ludC5BRERSRVNTLCAiIik7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSVBMaW5lQnJlYWtwb2ludC5GVU5DVElPTiwgIiIpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJUExpbmVCcmVha3BvaW50LkFERFJFU1MsIGFkZHJlc3MpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbihTdHJpbmcgZnVuY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKElQTGluZUJyZWFrcG9pbnQuRlVOQ1RJT04sIGZ1bmN0aW9uKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0U291cmNlSGFuZGxlKCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlTmFtZSk7Ci0JCXJldHVybiAocGF0aC5pc1ZhbGlkUGF0aChmaWxlTmFtZSkpP3BhdGgubGFzdFNlZ21lbnQoKTpudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L0JyZWFrcG9pbnRNZXNzYWdlcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvQnJlYWtwb2ludE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDA2MjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvQnJlYWtwb2ludE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuYnJlYWtwb2ludDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha3BvaW50TWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5icmVha3BvaW50LkJyZWFrcG9pbnRNZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvYnJlYWtwb2ludC9CcmVha3BvaW50TWVzc2FnZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L0JyZWFrcG9pbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFjNDdjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L0JyZWFrcG9pbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAjIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAjIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAjIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAjIAotICMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAjIAotICMgTEEtQ0MgMDQtMTE1Ci0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSAjIEBhdXRob3IgQ2xlbWVudAotICMKLSAjIwotCi1QQnJlYWtwb2ludC4xPVwgW2lnbm9yZSBjb3VudDogezB9XQotUEJyZWFrcG9pbnQuMj1cIGlmIHswfQotCi0jIFRoZSBtYXJrZXIgbWVzc2FnZSBvZiBhIGxpbmUgYnJlYWtwb2ludC4gCi0jIEZvcm1hdDogTGluZSBicmVha3BvaW50OiA8ZmlsZSBuYW1lPltsaW5lOiA8bGluZSBudW1iZXI+XSA8Y29uZGl0aW9uPgotUExpbmVCcmVha3BvaW50PUxpbmUgYnJlYWtwb2ludDp7MH1bbGluZTogezF9XSB7Mn0KLQotUEZ1bmN0aW9uQnJlYWtwb2ludD1GdW5jdGlvbiBicmVha3BvaW50OnswfVtmdW5jdGlvbjogezF9XSB7Mn0KLQotUEFkZHJlc3NCcmVha3BvaW50PUFkZHJlc3MgYnJlYWtwb2ludDp7MH1bYWRkcmVzczogezF9XSB7Mn0KLQotIyBUaGUgbWFya2VyIG1lc3NhZ2Ugb2YgYSB3cml0ZSB3YXRjaHBvaW50LiAKLSMgRm9ybWF0OiBXcml0ZSB3YXRjaHBvaW50OiA8ZmlsZSBuYW1lPiBhdCA8ZXhwcmVzc2lvbj4gPGNvbmRpdGlvbj4KLVBXYXRjaHBvaW50LjA9V3JpdGUgd2F0Y2hwb2ludHswfWF0ezF9ezJ9Ci0KLSMgVGhlIG1hcmtlciBtZXNzYWdlIG9mIGEgcmVhZCB3YXRjaHBvaW50LiAKLSMgRm9ybWF0OiBSZWFkIHdhdGNocG9pbnQ6IDxmaWxlIG5hbWU+IGF0IDxleHByZXNzaW9uPiA8Y29uZGl0aW9uPgotUFdhdGNocG9pbnQuMT1SZWFkIHdhdGNocG9pbnR7MH1hdHsxfXsyfQotCi0jIFRoZSBtYXJrZXIgbWVzc2FnZSBvZiBhbiBhY2Nlc3Mgd2F0Y2hwb2ludC4gCi0jIEZvcm1hdDogQWNjZXNzIHdhdGNocG9pbnQ6IDxmaWxlIG5hbWU+IGF0IDxleHByZXNzaW9uPiA8Y29uZGl0aW9uPgotUFdhdGNocG9pbnQuMj1BY2Nlc3Mgd2F0Y2hwb2ludHswfWF0ezF9ezJ9Ci0KLSMgVGhlIG1hcmtlciBtZXNzYWdlIG9mIGEgd2F0Y2hwb2ludC4gCi0jIEZvcm1hdDogV2F0Y2hwb2ludDogPGZpbGUgbmFtZT4gYXQgPGV4cHJlc3Npb24+IDxjb25kaXRpb24+Ci1QV2F0Y2hwb2ludC4zPT1XYXRjaHBvaW50ezB9YXR7MX17Mn0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L1BBZGRyZXNzQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUEFkZHJlc3NCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWRhN2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUEFkZHJlc3NCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuYnJlYWtwb2ludDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBBZGRyZXNzQnJlYWtwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUEFkZHJlc3NCcmVha3BvaW50IGV4dGVuZHMgQWJzdHJhY3RMaW5lQnJlYWtwb2ludCBpbXBsZW1lbnRzIElQQWRkcmVzc0JyZWFrcG9pbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX0FERFJFU1NfQlJFQUtQT0lOVCA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wQWRkcmVzc0JyZWFrcG9pbnRNYXJrZXIiOwotCi0JcHVibGljIFBBZGRyZXNzQnJlYWtwb2ludCgpIHsKLQl9Ci0JcHVibGljIFBBZGRyZXNzQnJlYWtwb2ludChJUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDw/LD8+IGF0dHJpYnV0ZXMsIGJvb2xlYW4gYWRkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHJlc291cmNlLCBnZXRNYXJrZXJUeXBlKCksIGF0dHJpYnV0ZXMsIGFkZCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1hcmtlclR5cGUoKSB7Ci0JCXJldHVybiBQX0FERFJFU1NfQlJFQUtQT0lOVDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJNZXNzYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBlbnN1cmVNYXJrZXIoKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgZmlsZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmaWxlTmFtZSA9ICcgJyArIGZpbGVOYW1lICsgJyAnOwotCQl9Ci0JCXJldHVybiBnZXRKb2JTZXRGb3JtYXQoKSArICIgIiArIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJyZWFrcG9pbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlBBZGRyZXNzQnJlYWtwb2ludCIpLCBuZXcgT2JqZWN0W10geyBmaWxlTmFtZSwgZ2V0QWRkcmVzcygpLCBnZXRDb25kaXRpb25UZXh0KCkgfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUEJyZWFrcG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L1BCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTQ5M2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUEJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuYnJlYWtwb2ludDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQQnJlYWtwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBCcmVha3BvaW50IGV4dGVuZHMgQnJlYWtwb2ludCBpbXBsZW1lbnRzIElQQnJlYWtwb2ludCB7Ci0JcHVibGljIFBCcmVha3BvaW50KCkge30KLQkKLQlwdWJsaWMgUEJyZWFrcG9pbnQoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgbWFya2VyVHlwZSwgZmluYWwgTWFwPD8sPz4gYXR0cmlidXRlcywgZmluYWwgYm9vbGVhbiBhZGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcygpOwotCQlJV29ya3NwYWNlUnVubmFibGUgd3IgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIGNyZWF0ZSB0aGUgbWFya2VyCi0JCQkJc2V0TWFya2VyKHJlc291cmNlLmNyZWF0ZU1hcmtlcihtYXJrZXJUeXBlKSk7Ci0JCQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJCQllbnN1cmVNYXJrZXIoKS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJCS8vIHNldCB0aGUgbWFya2VyIG1lc3NhZ2UKLQkJCQlzZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBnZXRNYXJrZXJNZXNzYWdlKCkpOwotCQkJCS8vIGFkZCB0byBicmVha3BvaW50IG1hbmFnZXIgaWYgcmVxdWVzdGVkCi0JCQkJcmVnaXN0ZXIoYWRkKTsKLQkJCX0KLQkJfTsKLQkJcnVuKHdyKTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlTWFya2VyKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIG1hcmtlclR5cGUsIGZpbmFsIE1hcDw/LD8+IGF0dHJpYnV0ZXMsIGZpbmFsIGJvb2xlYW4gYWRkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUnVubmFibGUgd3IgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIGNyZWF0ZSB0aGUgbWFya2VyCi0JCQkJc2V0TWFya2VyKHJlc291cmNlLmNyZWF0ZU1hcmtlcihtYXJrZXJUeXBlKSk7Ci0JCQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJCQllbnN1cmVNYXJrZXIoKS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJCS8vIHNldCB0aGUgbWFya2VyIG1lc3NhZ2UKLQkJCQlzZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBnZXRNYXJrZXJNZXNzYWdlKCkpOwotCQkJCS8vIGFkZCB0byBicmVha3BvaW50IG1hbmFnZXIgaWYgcmVxdWVzdGVkCi0JCQkJcmVnaXN0ZXIoYWRkKTsKLQkJCX0KLQkJfTsKLQkJcnVuKHdyKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNb2RlbElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuc3VyZU1hcmtlcigpLmdldEF0dHJpYnV0ZShJTlNUQUxMX0NPVU5ULCAwKSA+IDA7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldEluc3RhbGxDb3VudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKElOU1RBTExfQ09VTlQsIDApOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBpbmNyZW1lbnRJbnN0YWxsQ291bnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWludCBjb3VudCA9IGdldEluc3RhbGxDb3VudCgpOwotCQlzZXRBdHRyaWJ1dGUoSU5TVEFMTF9DT1VOVCwgKytjb3VudCk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JcHVibGljIGludCBnZXRJbnN0YWxsQ291bnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU5TVEFMTF9DT1VOVCwgMCk7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlY3JlbWVudEluc3RhbGxDb3VudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IGNvdW50ID0gZ2V0SW5zdGFsbENvdW50KCk7Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCXNldEF0dHJpYnV0ZShJTlNUQUxMX0NPVU5ULCAtLWNvdW50KTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKENPTkRJVElPTiwgIiIpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoQ09ORElUSU9OLCBjb25kaXRpb24pOwotCQlzZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBnZXRNYXJrZXJNZXNzYWdlKCkpOwotCX0KLQlwdWJsaWMgaW50IGdldElnbm9yZUNvdW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKElHTk9SRV9DT1VOVCwgMCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldElnbm9yZUNvdW50KGludCBpZ25vcmVDb3VudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoSUdOT1JFX0NPVU5ULCBpZ25vcmVDb3VudCk7Ci0JCXNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIGdldE1hcmtlck1lc3NhZ2UoKSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlSGFuZGxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKFNPVVJDRV9IQU5ETEUsICIiKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U291cmNlSGFuZGxlKFN0cmluZyBzb3VyY2VIYW5kbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNPVVJDRV9IQU5ETEUsIHNvdXJjZUhhbmRsZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U2V0SWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoU0VUX0lELCAiIik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNldElkKFN0cmluZyBpZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VUX0lELCBpZCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gKGdldEpvYklkKCkuZXF1YWxzKElQQnJlYWtwb2ludC5HTE9CQUwpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKb2JJZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuc3VyZU1hcmtlcigpLmdldEF0dHJpYnV0ZShKT0JfSUQsICIiKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Sm9iSWQoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShKT0JfSUQsIGlkKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKb2JOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKEpPQl9OQU1FLCAiIik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEpvYk5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKEpPQl9OQU1FLCBuYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRDdXJTZXRJZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuc3VyZU1hcmtlcigpLmdldEF0dHJpYnV0ZShDVVJfU0VUX0lELCAiIik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEN1clNldElkKFN0cmluZyBpZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoQ1VSX1NFVF9JRCwgaWQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBydW4oSVdvcmtzcGFjZVJ1bm5hYmxlIHdyKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3ciwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERlYnVnRXhjZXB0aW9uKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKGJvb2xlYW4gcmVnaXN0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlZ2lzdGVyKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5hZGRCcmVha3BvaW50KHRoaXMpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHVwZGF0ZU1hcmtlck1lc3NhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIGdldE1hcmtlck1lc3NhZ2UoKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQ29uZGl0aW9uYWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoKGdldENvbmRpdGlvbigpICE9IG51bGwgJiYgZ2V0Q29uZGl0aW9uKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgfHwgZ2V0SWdub3JlQ291bnQoKSA+IDApOwotCX0KLQlwdWJsaWMgdm9pZCBmaXJlQ2hhbmdlZCgpIHsKLQkJaWYgKG1hcmtlckV4aXN0cygpKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5maXJlQnJlYWtwb2ludENoYW5nZWQodGhpcyk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb25kaXRpb25UZXh0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBpZ25vcmVDb3VudCA9IGdldElnbm9yZUNvdW50KCk7Ci0JCWlmIChpZ25vcmVDb3VudCA+IDApIHsKLQkJCXNiLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChCcmVha3BvaW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJQQnJlYWtwb2ludC4xIiksIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGlnbm9yZUNvdW50KSB9KSk7Ci0JCX0KLQkJU3RyaW5nIGNvbmRpdGlvbiA9IGdldENvbmRpdGlvbigpOwotCQlpZiAoY29uZGl0aW9uICE9IG51bGwgJiYgY29uZGl0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJc2IuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJyZWFrcG9pbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50LjIiKSwgbmV3IE9iamVjdFtdIHsgY29uZGl0aW9uIH0pKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKb2JTZXRGb3JtYXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAieyIgKyBnZXRKb2JOYW1lKCkgKyAiOiIgKyBnZXRTZXRJZCgpICsgIn0iOwotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE1hcmtlck1lc3NhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkvKgotCXB1YmxpYyBTdHJpbmcgZ2V0VGhyZWFkSWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoVEhSRUFEX0lELCBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGhyZWFkSWQoU3RyaW5nIHRocmVhZElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShUSFJFQURfSUQsIHRocmVhZElkKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNb2R1bGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoTU9EVUxFLCBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TW9kdWxlKFN0cmluZyBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKE1PRFVMRSwgbW9kdWxlKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RmlsdGVyKElQRGVidWdUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZGaWx0ZXJlZFRocmVhZHNCeVRhcmdldC5wdXQodGFyZ2V0LCBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGhyZWFkRmlsdGVycyhJUFRocmVhZFtdIHRocmVhZHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRocmVhZHMgIT0gbnVsbCAmJiB0aHJlYWRzLmxlbmd0aCA+IDApIHsKLQkJCWZGaWx0ZXJlZFRocmVhZHNCeVRhcmdldC5wdXQoKElQRGVidWdUYXJnZXQpdGhyZWFkc1swXS5nZXREZWJ1Z1RhcmdldCgpLCBuZXcgSGFzaFNldDxJUFRocmVhZD4oQXJyYXlzLmFzTGlzdCh0aHJlYWRzKSkpOwotCQl9Ci0JfQotCXB1YmxpYyBJUERlYnVnVGFyZ2V0W10gZ2V0VGFyZ2V0RmlsdGVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU2V0PElQRGVidWdUYXJnZXQ+IHNldCA9IGZGaWx0ZXJlZFRocmVhZHNCeVRhcmdldC5rZXlTZXQoKTsKLQkJcmV0dXJuIChJUERlYnVnVGFyZ2V0W10pIHNldC50b0FycmF5KG5ldyBJUERlYnVnVGFyZ2V0W3NldC5zaXplKCldKTsKLQl9Ci0JcHVibGljIElQVGhyZWFkW10gZ2V0VGhyZWFkRmlsdGVycyhJUERlYnVnVGFyZ2V0IHRhcmdldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTZXQ8SVBUaHJlYWQ+IHNldCA9IGZGaWx0ZXJlZFRocmVhZHNCeVRhcmdldC5nZXQodGFyZ2V0KTsKLQkJcmV0dXJuIChzZXQgIT0gbnVsbCkgPyAoSVBUaHJlYWRbXSkgc2V0LnRvQXJyYXkobmV3IElQVGhyZWFkW3NldC5zaXplKCldKSA6IG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhcmdldEZpbHRlcihJUERlYnVnVGFyZ2V0IHRhcmdldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkZpbHRlcmVkVGhyZWFkc0J5VGFyZ2V0LmNvbnRhaW5zS2V5KHRhcmdldCkpIHsKLQkJCWZGaWx0ZXJlZFRocmVhZHNCeVRhcmdldC5yZW1vdmUodGFyZ2V0KTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVUaHJlYWRGaWx0ZXJzKElQVGhyZWFkW10gdGhyZWFkcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGhyZWFkcyAhPSBudWxsICYmIHRocmVhZHMubGVuZ3RoID4gMCkgewotCQkJSURlYnVnVGFyZ2V0IHRhcmdldCA9IHRocmVhZHNbMF0uZ2V0RGVidWdUYXJnZXQoKTsKLQkJCWlmIChmRmlsdGVyZWRUaHJlYWRzQnlUYXJnZXQuY29udGFpbnNLZXkodGFyZ2V0KSkgewotCQkJCVNldDxJUFRocmVhZD4gc2V0ID0gZkZpbHRlcmVkVGhyZWFkc0J5VGFyZ2V0LmdldCh0YXJnZXQpOwotCQkJCWlmIChzZXQgIT0gbnVsbCkgewotCQkJCQlzZXQucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QodGhyZWFkcykpOwotCQkJCQlpZiAoc2V0LmlzRW1wdHkoKSkgewotCQkJCQkJZkZpbHRlcmVkVGhyZWFkc0J5VGFyZ2V0LnJlbW92ZSh0YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCSovCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvYnJlYWtwb2ludC9QRnVuY3Rpb25CcmVha3BvaW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvYnJlYWtwb2ludC9QRnVuY3Rpb25CcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWMyOWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUEZ1bmN0aW9uQnJlYWtwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRnVuY3Rpb25CcmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQRnVuY3Rpb25CcmVha3BvaW50IGV4dGVuZHMgQWJzdHJhY3RMaW5lQnJlYWtwb2ludCBpbXBsZW1lbnRzIElQRnVuY3Rpb25CcmVha3BvaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9GVU5DVElPTl9CUkVBS1BPSU5UID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBGdW5jdGlvbkJyZWFrcG9pbnRNYXJrZXIiOwotCi0JcHVibGljIFBGdW5jdGlvbkJyZWFrcG9pbnQoKSB7Ci0JfQotCXB1YmxpYyBQRnVuY3Rpb25CcmVha3BvaW50KElSZXNvdXJjZSByZXNvdXJjZSwgTWFwPD8sPz4gYXR0cmlidXRlcywgYm9vbGVhbiBhZGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocmVzb3VyY2UsIGdldE1hcmtlclR5cGUoKSwgYXR0cmlidXRlcywgYWRkKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFya2VyVHlwZSgpIHsKLQkJcmV0dXJuIFBfRlVOQ1RJT05fQlJFQUtQT0lOVDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJNZXNzYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBlbnN1cmVNYXJrZXIoKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgZmlsZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmaWxlTmFtZSA9ICcgJyArIGZpbGVOYW1lICsgJyAnOwotCQl9Ci0JCXJldHVybiBnZXRKb2JTZXRGb3JtYXQoKSArICIgIiArIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJyZWFrcG9pbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlBGdW5jdGluQnJlYWtwb2ludCIpLCBuZXcgT2JqZWN0W10geyBmaWxlTmFtZSwgZ2V0RnVuY3Rpb24oKSwgZ2V0Q29uZGl0aW9uVGV4dCgpIH0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L1BMaW5lQnJlYWtwb2ludC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUExpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjBmOGUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUExpbmVCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuYnJlYWtwb2ludDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFBMaW5lQnJlYWtwb2ludCBleHRlbmRzIEFic3RyYWN0TGluZUJyZWFrcG9pbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX0xJTkVfQlJFQUtQT0lOVCA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wTGluZUJyZWFrcG9pbnRNYXJrZXIiOwotCQotCXB1YmxpYyBQTGluZUJyZWFrcG9pbnQoKSB7Ci0JfQkKLQlwdWJsaWMgUExpbmVCcmVha3BvaW50KElSZXNvdXJjZSByZXNvdXJjZSwgTWFwPD8sPz4gYXR0cmlidXRlcywgYm9vbGVhbiBhZGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocmVzb3VyY2UsIGdldE1hcmtlclR5cGUoKSwgYXR0cmlidXRlcywgYWRkKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFya2VyVHlwZSgpIHsKLQkJcmV0dXJuIFBfTElORV9CUkVBS1BPSU5UOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlck1lc3NhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGVuc3VyZU1hcmtlcigpLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCAmJiBmaWxlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWZpbGVOYW1lID0gJyAnICsgZmlsZU5hbWUgKyAnICc7Ci0JCX0KLQkJcmV0dXJuIGdldEpvYlNldEZvcm1hdCgpICsgIiAiICsgTWVzc2FnZUZvcm1hdC5mb3JtYXQoQnJlYWtwb2ludE1lc3NhZ2VzLmdldFN0cmluZygiUExpbmVCcmVha3BvaW50IiksIG5ldyBPYmplY3RbXSB7IGZpbGVOYW1lLCBuZXcgSW50ZWdlcihnZXRMaW5lTnVtYmVyKCkpLCBnZXRDb25kaXRpb25UZXh0KCkgfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUFdhdGNocG9pbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9icmVha3BvaW50L1BXYXRjaHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTAwYjQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL2JyZWFrcG9pbnQvUFdhdGNocG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5icmVha3BvaW50OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQV2F0Y2hwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQV2F0Y2hwb2ludCBleHRlbmRzIFBCcmVha3BvaW50IGltcGxlbWVudHMgSVBXYXRjaHBvaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9XQVRDSFBPSU5UID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBXYXRjaHBvaW50TWFya2VyIjsKLQotCXB1YmxpYyBQV2F0Y2hwb2ludCgpIHsKLQl9Ci0JcHVibGljIFBXYXRjaHBvaW50KElSZXNvdXJjZSByZXNvdXJjZSwgTWFwPD8sPz4gYXR0cmlidXRlcywgYm9vbGVhbiBhZGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocmVzb3VyY2UsIGdldE1hcmtlclR5cGUoKSwgYXR0cmlidXRlcywgYWRkKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNXcml0ZVR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoV1JJVEUsIHRydWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKFJFQUQsIGZhbHNlKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKEVYUFJFU1NJT04sICIiKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFya2VyVHlwZSgpIHsKLQkJcmV0dXJuIFBfV0FUQ0hQT0lOVDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJNZXNzYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZm9ybWF0ID0gQnJlYWtwb2ludE1lc3NhZ2VzLmdldFN0cmluZygiUFdhdGNocG9pbnQuMyIpOwotCQlpZiAoaXNXcml0ZVR5cGUoKSAmJiAhaXNSZWFkVHlwZSgpKQotCQkJZm9ybWF0ID0gQnJlYWtwb2ludE1lc3NhZ2VzLmdldFN0cmluZygiUFdhdGNocG9pbnQuMCIpOwotCQllbHNlIGlmICghaXNXcml0ZVR5cGUoKSAmJiBpc1JlYWRUeXBlKCkpCi0JCQlmb3JtYXQgPSBCcmVha3BvaW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJQV2F0Y2hwb2ludC4xIik7Ci0JCWVsc2UgaWYgKGlzV3JpdGVUeXBlKCkgJiYgaXNSZWFkVHlwZSgpKQotCQkJZm9ybWF0ID0gQnJlYWtwb2ludE1lc3NhZ2VzLmdldFN0cmluZygiUFdhdGNocG9pbnQuMiIpOwotCQlyZXR1cm4gZ2V0Sm9iU2V0Rm9ybWF0KCkgKyAiICIgKyBNZXNzYWdlRm9ybWF0LmZvcm1hdChCcmVha3BvaW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJQRnVuY3RpbkJyZWFrcG9pbnQiKSwgbmV3IE9iamVjdFtdIHsgZm9ybWF0IH0pOwotCX0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgLTEpOwotCX0KLQlwdWJsaWMgaW50IGdldENoYXJTdGFydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuc3VyZU1hcmtlcigpLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKTsKLQl9Ci0JcHVibGljIGludCBnZXRDaGFyRW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlTWFya2VyKCkuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvQWJzdHJhY3RQVmFsdWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9BYnN0cmFjdFBWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODJjY2ZhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9BYnN0cmFjdFBWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUFycmF5OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQVmFsdWUgZXh0ZW5kcyBQRGVidWdFbGVtZW50IGltcGxlbWVudHMgSVBWYWx1ZSB7Ci0JcHJpdmF0ZSBBYnN0cmFjdFBWYXJpYWJsZSBmUGFyZW50ID0gbnVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdFBWYWx1ZShBYnN0cmFjdFBWYXJpYWJsZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LmdldFNlc3Npb24oKSwgcGFyZW50LmdldFRhc2tzKCkpOwotCQlmUGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFsdWUjZXZhbHVhdGVBc0V4cHJlc3Npb24ob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXZhbHVhdGVBc0V4cHJlc3Npb24oSVBTdGFja0ZyYW1lIGZyYW1lKSB7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9ICIiOwotCQlBYnN0cmFjdFBWYXJpYWJsZSBwYXJlbnQgPSBnZXRQYXJlbnRWYXJpYWJsZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChmcmFtZSAhPSBudWxsICYmIGZyYW1lLmNhbkV2YWx1YXRlKCkpIHsKLQkJCQl0cnkgewotCQkJCQlJQUlGVmFsdWUgdmFsdWUgPSBwYXJlbnQuZ2V0QUlGKCkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUFJRlZhbHVlQXJyYXkpIHsKLQkJCQkJCS8vVE9ETyBpZiB2YWx1ZSBpcyBhcnJheSwgc2hvdyBub3RoaW5nLiAgUHJldmVudCBubyB2YWx1ZSBmb3IgcGFydGlhbCBhaWYKLQkJCQkJCXZhbHVlU3RyaW5nID0gIiI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZVN0cmluZyA9IHZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JCQkJCQlpZiAodmFsdWVTdHJpbmcgPT0gbnVsbCB8fCB2YWx1ZVN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCXZhbHVlU3RyaW5nID0gZnJhbWUuZXZhbHVhdGVFeHByZXNzaW9uVG9TdHJpbmcocGFyZW50LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChBSUZFeGNlcHRpb24gZSkgewotCQkJCQl2YWx1ZVN0cmluZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQVmFyaWFibGUgZ2V0UGFyZW50VmFyaWFibGUoKSB7Ci0JCXJldHVybiBmUGFyZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByZXNlcnZlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZXNldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRDaGFuZ2VkKGJvb2xlYW4gY2hhbmdlZCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvQWJzdHJhY3RQVmFyaWFibGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9BYnN0cmFjdFBWYXJpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGViNzdlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9BYnN0cmFjdFBWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUVuYWJsZURpc2FibGVUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFyaWFibGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBWYXJpYWJsZSBleHRlbmRzIFBEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJUFZhcmlhYmxlIHsKLQlwcml2YXRlIFBEZWJ1Z0VsZW1lbnQgZlBhcmVudDsKLQotCXB1YmxpYyBBYnN0cmFjdFBWYXJpYWJsZShQRGVidWdFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQuZ2V0U2Vzc2lvbigpLCBwYXJlbnQuZ2V0VGFza3MoKSk7Ci0JCXNldFBhcmVudChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z0VsZW1lbnQjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElFbmFibGVEaXNhYmxlVGFyZ2V0LmNsYXNzKSkKLQkJCXJldHVybiB0aGlzOwotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudChQRGVidWdFbGVtZW50IHBhcmVudCkgewotCQlmUGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUERlYnVnRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBmUGFyZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBTdGFja0ZyYW1lIGdldFN0YWNrRnJhbWUoKSB7Ci0JCVBEZWJ1Z0VsZW1lbnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBYnN0cmFjdFBWYWx1ZSkgewotCQkJQWJzdHJhY3RQVmFyaWFibGUgcHYgPSAoKEFic3RyYWN0UFZhbHVlKSBwYXJlbnQpLmdldFBhcmVudFZhcmlhYmxlKCk7Ci0JCQlpZiAocHYgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHYuZ2V0U3RhY2tGcmFtZSgpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQU3RhY2tGcmFtZSkKLQkJCXJldHVybiAoUFN0YWNrRnJhbWUpIHBhcmVudDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJlc2VydmUoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlc2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0Q2hhbmdlZChib29sZWFuIGNoYW5nZWQpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL0NvcmVNb2RlbE1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvQ29yZU1vZGVsTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0ODQzNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvQ29yZU1vZGVsTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ29yZU1vZGVsTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5Db3JlTW9kZWxNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBDb3JlTW9kZWxNZXNzYWdlcygpIHt9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL0NvcmVNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvQ29yZU1vZGVsTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5YWZiMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvQ29yZU1vZGVsTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QZWJ1Z1RhcmdldC5VbmFibGVfdG9fZ2V0X2dsb2JhbHNfMT1VbmFibGUgdG8gZ2V0IGdsb2JhbHMuIFJlYXNvbjogCi1QQXJyYXlQYXJ0aXRpb24uMD1UeXBlIGlzIG5vdCBhdmFpbGFibGUuCi1QQXJyYXlQYXJ0aXRpb24uMT1RdWFsaWZpZWQgbmFtZSBpcyBub3QgYXZhaWxhYmxlLgotUERlYnVnVGFyZ2V0LjE9RXhlY3V0aW9uIGlzIHN1c3BlbmRlZCBiZWNhdXNlIG9mIGVycm9yLgotUE1vZGlmaWNhdGlvblZhcmlhYmxlLjA9VW5hYmxlIHRvIHNldCB2YWx1ZS4KLVBNb2RpZmljYXRpb25WYXJpYWJsZS4xPVVuYWJsZSB0byBzZXQgdmFsdWUuCi1QU3RhY2tGcmFtZS4wPXswfSBhdCB7MX06IHsyfQotUFRocmVhZC4wPVN0YWNrIGlzIG5vdCBhdmFpbGFibGU6IHswfS4KLVBUaHJlYWQuMT1TdGFjayBpcyBub3QgYXZhaWxhYmxlOiB7MH0uCi1QVmFsdWUuMD1ub3QgYXZhaWxhYmxlOiB7MH0gCi1QVmFyaWFibGUuMD1ub3QgYXZhaWxhYmxlOiB7MH0KLVBWYXJpYWJsZS4xPW5vdCBhdmFpbGFibGU6IHswfQotUFZhcmlhYmxlLjI9VmFyaWFibGUgZG9lcyBub3Qgc3VwcG9ydCB2YWx1ZSBtb2RpZmljYXRpb24uCi1QVmFyaWFibGUuMz1WYXJpYWJsZSBkb2VzIG5vdCBzdXBwb3J0IHZhbHVlIG1vZGlmaWNhdGlvbi4KLVBWYXJpYWJsZS40PVF1YWxpZmllZCBuYW1lIGlzIG5vdCBhdmFpbGFibGUuCi1QVmFyaWFibGUuNT1UeXBlIGlzIG5vdCBhdmFpbGFibGUuCi1QSW5kZXhlZFZhbHVlLjA9SW5kZXggb3V0IG9mIGJvdW5kcy4KLVBJbmRleGVkVmFsdWUuMT1JbmRleCBvdXQgb2YgYm91bmRzLgotUEluZGV4ZWRWYWx1ZS4yPVNwZWNpZmllZCByYW5nZSBvdXQgb2YgYm91bmRzLgotUE1vZHVsZS4wPVVua25vd24KLVBNb2R1bGUuMT1Vbmtub3duCi1QTW9kdWxlLjI9SW52YWxpZCBzeW1ib2xzIGZpbGUuCi1QTW9kdWxlLjQ9Tm90IHN1cHBvcnRlZAotUE1vZHVsZU1hbmFnZXIuMD1FcnJvciBsb2FkaW5nIHN5bWJvbHMuCi1QTW9kdWxlTWFuYWdlci4xPUVycm9yIGxvYWRpbmcgc3ltYm9scy4KLVBSZWdpc3Rlckdyb3VwLjA9VW5hYmxlIHRvIHJlc3RvcmUgcmVnaXN0ZXIgZ3JvdXAgLSBpbnZhbGlkIG1lbWVudG8uCi1QUmVnaXN0ZXJHcm91cC4xPVVuYWJsZSB0byByZXN0b3JlIHJlZ2lzdGVyIGdyb3VwIC0gZXhwZWN0aW5nIHJlZ2lzdGVyIGdyb3VwIGVsZW1lbnQuCi1QUmVnaXN0ZXJHcm91cC4yPVVuYWJsZSB0byByZXN0b3JlIHJlZ2lzdGVyIGdyb3VwIC0gbWlzc2luZyBuYW1lIGF0dHJpYnV0ZS4KLVBSZWdpc3Rlckdyb3VwLjM9VW5hYmxlIHRvIHJlc3RvcmUgcmVnaXN0ZXIgLSBtaXNzaW5nIGF0dHJpYnV0ZXMuCi1QUmVnaXN0ZXJHcm91cC40PVJlZ2lzdGVyIGRvZXNuJ3QgZXhpc3Qgb24gdGhpcyB0YXJnZXQuCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUERlYnVnRWxlbWVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BEZWJ1Z0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhZTk1YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUERlYnVnRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5QRGVidWdFbGVtZW50U3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUYXJnZXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQRGVidWdFbGVtZW50IGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJUERlYnVnRWxlbWVudCwgSVBEZWJ1Z0VsZW1lbnRTdGF0dXMgewotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBub3RTdXBwb3J0ZWQoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRocm93RGVidWdFeGNlcHRpb24obWVzc2FnZSwgRGVidWdFeGNlcHRpb24uTk9UX1NVUFBPUlRFRCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZQotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdEZhaWxlZChTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJlcXVlc3RGYWlsZWQobWVzc2FnZSwgZSwgRGVidWdFeGNlcHRpb24uUkVRVUVTVF9GQUlMRUQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gY29kZQotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdEZhaWxlZChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUsIGludCBjb2RlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQl0aHJvd0RlYnVnRXhjZXB0aW9uKG1lc3NhZ2UsIGNvZGUsIGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRhcmdldFJlcXVlc3RGYWlsZWQoU3RyaW5nIG1lc3NhZ2UsIFBESUV4Y2VwdGlvbiBlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXF1ZXN0RmFpbGVkKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJUYXJnZXQgcmVxdWVzdCBmYWlsZWQ6IHswfS4iLCBuZXcgT2JqZWN0W10geyBtZXNzYWdlIH0pLCBlLAotCQkJCURlYnVnRXhjZXB0aW9uLlRBUkdFVF9SRVFVRVNUX0ZBSUxFRCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZQotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGFyZ2V0UmVxdWVzdEZhaWxlZChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRocm93RGVidWdFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlRhcmdldCByZXF1ZXN0IGZhaWxlZDogezB9LiIsIG5ldyBPYmplY3RbXSB7IG1lc3NhZ2UgfSksCi0JCQkJRGVidWdFeGNlcHRpb24uVEFSR0VUX1JFUVVFU1RfRkFJTEVELCBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdGhyb3dEZWJ1Z0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIFRocm93YWJsZSBleGNlcHRpb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBEZWJ1Z0V4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBEZWJ1Z01vZGVsLmdldFBsdWdpbklkZW50aWZpZXIoKSwgY29kZSwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5ID0gSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuT0s7Ci0KLQlwcml2YXRlIFN0cmluZyBmTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBQRGVidWdFbGVtZW50U3RhdGUgZlN0YXRlID0gUERlYnVnRWxlbWVudFN0YXRlLlVOREVGSU5FRDsKLQlwcml2YXRlIFBEZWJ1Z0VsZW1lbnRTdGF0ZSBmT2xkU3RhdGUgPSBQRGVidWdFbGVtZW50U3RhdGUuVU5ERUZJTkVEOwotCXByaXZhdGUgT2JqZWN0IGZDdXJyZW50U3RhdGVJbmZvID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgSVBTZXNzaW9uIGZTZXNzaW9uOwotCXByb3RlY3RlZCBmaW5hbCBCaXRMaXN0IHRhc2tzOwotCi0JcHVibGljIFBEZWJ1Z0VsZW1lbnQoSVBTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MpIHsKLQkJZlNlc3Npb24gPSBzZXNzaW9uOwotCQl0aGlzLnRhc2tzID0gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRldGFpbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudCBjcmVhdGVDaGFuZ2VFdmVudChpbnQgZGV0YWlsKSB7Ci0JCXJldHVybiBuZXcgRGVidWdFdmVudCh0aGlzLCBEZWJ1Z0V2ZW50LkNIQU5HRSwgZGV0YWlsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERlYnVnRXZlbnQgY3JlYXRlQ3JlYXRlRXZlbnQoKSB7Ci0JCXJldHVybiBuZXcgRGVidWdFdmVudCh0aGlzLCBEZWJ1Z0V2ZW50LkNSRUFURSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRldGFpbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudCBjcmVhdGVSZXN1bWVFdmVudChpbnQgZGV0YWlsKSB7Ci0JCXJldHVybiBuZXcgRGVidWdFdmVudCh0aGlzLCBEZWJ1Z0V2ZW50LlJFU1VNRSwgZGV0YWlsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGV0YWlsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEZWJ1Z0V2ZW50IGNyZWF0ZVN1c3BlbmRFdmVudChpbnQgZGV0YWlsKSB7Ci0JCXJldHVybiBuZXcgRGVidWdFdmVudCh0aGlzLCBEZWJ1Z0V2ZW50LlNVU1BFTkQsIGRldGFpbCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEZWJ1Z0V2ZW50IGNyZWF0ZVRlcm1pbmF0ZUV2ZW50KCkgewotCQlyZXR1cm4gbmV3IERlYnVnRXZlbnQodGhpcywgRGVidWdFdmVudC5URVJNSU5BVEUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXRhaWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ2hhbmdlRXZlbnQoaW50IGRldGFpbCkgewotCQlmaXJlRXZlbnQobmV3IERlYnVnRXZlbnQodGhpcywgRGVidWdFdmVudC5DSEFOR0UsIGRldGFpbCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDcmVhdGlvbkV2ZW50KCkgewotCQlmaXJlRXZlbnQobmV3IERlYnVnRXZlbnQodGhpcywgRGVidWdFdmVudC5DUkVBVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGV0YWlsCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVJlc3VtZUV2ZW50KGludCBkZXRhaWwpIHsKLQkJZmlyZUV2ZW50KG5ldyBEZWJ1Z0V2ZW50KHRoaXMsIERlYnVnRXZlbnQuUkVTVU1FLCBkZXRhaWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGV0YWlsCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN1c3BlbmRFdmVudChpbnQgZGV0YWlsKSB7Ci0JCWZpcmVFdmVudChuZXcgRGVidWdFdmVudCh0aGlzLCBEZWJ1Z0V2ZW50LlNVU1BFTkQsIGRldGFpbCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUZXJtaW5hdGVFdmVudCgpIHsKLQkJZmlyZUV2ZW50KG5ldyBEZWJ1Z0V2ZW50KHRoaXMsIERlYnVnRXZlbnQuVEVSTUlOQVRFKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0I2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJRGVidWdFbGVtZW50LmNsYXNzKSkKLQkJCXJldHVybiB0aGlzOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVBEZWJ1Z0VsZW1lbnQuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUERlYnVnRWxlbWVudFN0YXR1cy5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQU2Vzc2lvbi5jbGFzcykpCi0JCQlyZXR1cm4gZlNlc3Npb247Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUERlYnVnVGFyZ2V0LmNsYXNzKSkKLQkJCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoSURlYnVnVGFyZ2V0LmNsYXNzKSkKLQkJCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoSUxhdW5jaC5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0TGF1bmNoKCk7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnQjZ2V0Q3VycmVudFN0YXRlSW5mbygpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0Q3VycmVudFN0YXRlSW5mbygpIHsKLQkJcmV0dXJuIGZDdXJyZW50U3RhdGVJbmZvOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnRWxlbWVudCNnZXREZWJ1Z1RhcmdldCgpCi0JICovCi0JcHVibGljIElEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJLy8gcmV0dXJuIGZTZXNzaW9uLmZpbmREZWJ1Z1RhcmdldChnZXRUYXNrcygpKTsKLQkJcmV0dXJuIGZTZXNzaW9uLmdldExhdW5jaCgpLmdldERlYnVnVGFyZ2V0KGdldElEKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50I2dldElEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElEKCkgewotCQlyZXR1cm4gdGFza3MubmV4dFNldEJpdCgwKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z0VsZW1lbnQjZ2V0TGF1bmNoKCkKLQkgKi8KLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiBmU2Vzc2lvbi5nZXRMYXVuY2goKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnRWxlbWVudFN0YXR1cyNnZXRNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z0VsZW1lbnQjZ2V0TW9kZWxJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIFBEZWJ1Z01vZGVsLmdldFBsdWdpbklkZW50aWZpZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQRElTZXNzaW9uIGdldFBESVNlc3Npb24oKSB7Ci0JCXJldHVybiBmU2Vzc2lvbi5nZXRQRElTZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUERJRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQRElUYXJnZXQgZ2V0UERJVGFyZ2V0KCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCUlQRGVidWdUYXJnZXQgZGVidWdUYXJnZXQgPSBmU2Vzc2lvbi5maW5kRGVidWdUYXJnZXQoZ2V0VGFza3MoKSk7Ci0JCWlmIChkZWJ1Z1RhcmdldCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKGdldFRhc2tzKCksICJObyBQRElUYXJnZXQgZm91bmQiKTsKLQkJfQotCQlyZXR1cm4gZGVidWdUYXJnZXQuZ2V0UERJVGFyZ2V0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnQjZ2V0U2Vzc2lvbigpCi0JICovCi0JcHVibGljIElQU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gZlNlc3Npb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnRTdGF0dXMjZ2V0U2V2ZXJpdHkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gZlNldmVyaXR5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50I2dldFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgUERlYnVnRWxlbWVudFN0YXRlIGdldFN0YXRlKCkgewotCQlzeW5jaHJvbml6ZWQgKGZTdGF0ZSkgewotCQkJcmV0dXJuIGZTdGF0ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50U3RhdHVzI2lzT0soKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc09LKCkgewotCQlyZXR1cm4gKGZTZXZlcml0eSA9PSBJUERlYnVnRWxlbWVudFN0YXR1cy5PSyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUV2ZW50KERlYnVnRXZlbnQgZXZlbnQpIHsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50U2V0KG5ldyBEZWJ1Z0V2ZW50W10geyBldmVudCB9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUV2ZW50U2V0KERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpcmVEZWJ1Z0V2ZW50U2V0KGV2ZW50cyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmZvTWVzc2FnZShUaHJvd2FibGUgZSkgewotCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQRGVidWdNb2RlbC5nZXRQbHVnaW5JZGVudGlmaWVyKCksIElQRGVidWdDb25zdGFudHMuU1RBVFVTX0NPREVfSU5GTywgZQotCQkJCS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQlQRGVidWdVdGlscy5pbmZvKG5ld1N0YXR1cywgZ2V0RGVidWdUYXJnZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihFeGNlcHRpb24gZSkgewotCQlEZWJ1Z1BsdWdpbi5sb2coZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlEZWJ1Z1BsdWdpbi5sb2dNZXNzYWdlKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZXNldFN0YXR1cygpIHsKLQkJZlNldmVyaXR5ID0gSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuT0s7Ci0JCWZNZXNzYWdlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlU3RhdGUoKSB7Ci0JCXN5bmNocm9uaXplZCAoZlN0YXRlKSB7Ci0JCQlmU3RhdGUgPSBmT2xkU3RhdGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3VycmVudFN0YXRlSW5mbwotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDdXJyZW50U3RhdGVJbmZvKE9iamVjdCBjdXJyZW50U3RhdGVJbmZvKSB7Ci0JCWZDdXJyZW50U3RhdGVJbmZvID0gY3VycmVudFN0YXRlSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RhdGUKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZSBzdGF0ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoZlN0YXRlKSB7Ci0JCQlmT2xkU3RhdGUgPSBmU3RhdGU7Ci0JCQlmU3RhdGUgPSBzdGF0ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWZTZXZlcml0eSA9IHNldmVyaXR5OwotCQlmTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWlmIChmTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlmTWVzc2FnZS50cmltKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUERlYnVnVGFyZ2V0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUERlYnVnVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzdkNzguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BEZWJ1Z1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUV4cHJlc3Npb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklFeHByZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrUmV0cmlldmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrUmV0cmlldmFsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5EaXJlY3RvcnlTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Gb2xkZXJTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Qcm9qZWN0U291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JRXhlY0ZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnRWxlbWVudFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQR2xvYmFsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFBlcnNpc3RhYmxlUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5QRGVidWdFbGVtZW50U3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJQnJlYWtwb2ludEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDcmVhdGVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElEZXN0cm95ZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESURpc2Nvbm5lY3RlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRW5kU3RlcHBpbmdSYW5nZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElGdW5jdGlvbkZpbmlzaGVkSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUxvY2F0aW9uUmVhY2hlZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElNZW1vcnlCbG9ja0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElSZWdpc3RlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElSZXN1bWVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElTaGFyZWRMaWJyYXJ5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVNpZ25hbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElTdXNwZW5kZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVRocmVhZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElWYXJpYWJsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElXYXRjaHBvaW50U2NvcGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJV2F0Y2hwb2ludFRyaWdnZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JUFNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuUFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5QU291cmNlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z1RhcmdldCBleHRlbmRzIFBEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJUERlYnVnVGFyZ2V0LCBJUERJRXZlbnRMaXN0ZW5lciwgSUxhdW5jaExpc3RlbmVyLCBJRXhwcmVzc2lvbkxpc3RlbmVyLAotCQlJU291cmNlTG9va3VwQ2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBST0NFU1NfTkFNRSA9ICJQcm9jZXNzICI7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SVRocmVhZD4gZlRocmVhZHM7Ci0JcHJpdmF0ZSBJUERJVGFyZ2V0IHBkaVRhcmdldDsKLQlwcml2YXRlIEJvb2xlYW4gZklzTGl0dGxlRW5kaWFuID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQlwdWJsaWMgUERlYnVnVGFyZ2V0KElQU2Vzc2lvbiBzZXNzaW9uLCBJUERJVGFyZ2V0IHBkaVRhcmdldCwgYm9vbGVhbiBhbGxvd1Rlcm1pbmF0ZSwgYm9vbGVhbiBhbGxvd0Rpc2Nvbm5lY3QpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgcGRpVGFyZ2V0LmdldFRhc2tzKCkpOwotCQl0aGlzLnBkaVRhcmdldCA9IHBkaVRhcmdldDsKLQkJaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7Ci0JCXNldFRocmVhZExpc3QobmV3IEFycmF5TGlzdDxJVGhyZWFkPig1KSk7Ci0JCWlmIChzZXNzaW9uLmdldFBESVNlc3Npb24oKS5pc1Rlcm1pbmF0ZWQocGRpVGFyZ2V0LmdldFRhc2tzKCkpKSB7Ci0JCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuVEVSTUlOQVRFRCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuaXNTdXNwZW5kZWQocGRpVGFyZ2V0LmdldFRhc2tzKCkpKSB7Ci0JCQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlNVU1BFTkRFRCk7Ci0JCQl9IGVsc2UgewotCQkJCXNldFN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5VTkRFRklORUQpOwotCQkJfQotCi0JCQlpbml0aWFsaXplKCk7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmFkZExhdW5jaExpc3RlbmVyKHRoaXMpOwotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEV4cHJlc3Npb25NYW5hZ2VyKCkuYWRkRXhwcmVzc2lvbkxpc3RlbmVyKHRoaXMpOwotCQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLmFkZEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JVGFyZ2V0UHJvcGVydGllcyNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmUHJlZmVyZW5jZXMgIT0gbnVsbCkKLQkJCWZQcmVmZXJlbmNlcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0I2FkZFJlZ2lzdGVyR3JvdXAoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBSZWdpc3RlckRlc2NyaXB0b3JbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWdpc3Rlckdyb3VwKFN0cmluZyBuYW1lLCBJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0JCWZTZXNzaW9uLmdldFJlZ2lzdGVyTWFuYWdlcigpLmFkZFJlZ2lzdGVyR3JvdXAoZ2V0VGFza3MoKSwgbmFtZSwgZGVzY3JpcHRvcnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRMaXN0ZW5lciNicmVha3BvaW50QWRkZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50QWRkZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRMaXN0ZW5lciNicmVha3BvaW50Q2hhbmdlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGEpCi0JICovCi0JcHVibGljIHZvaWQgYnJlYWtwb2ludENoYW5nZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSU1hcmtlckRlbHRhIGRlbHRhKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludExpc3RlbmVyI2JyZWFrcG9pbnRSZW1vdmVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQsIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50UmVtb3ZlZChJQnJlYWtwb2ludCBicmVha3BvaW50LCBJTWFya2VyRGVsdGEgZGVsdGEpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEaXNjb25uZWN0I2NhbkRpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7Ci0JCS8vIEZJWE1FIE5vIGRpc2Nvbm5lY3QKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN0YXJ0I2NhblJlc3RhcnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjY2FuUmVzdW1lKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWUoKSB7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN1bWVXaXRob3V0U2lnbmFsI2NhblJlc3VtZVdpdGhvdXRTaWduYWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlc3VtZVdpdGhvdXRTaWduYWwoKSB7Ci0JCS8vIENoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9uIHN1cHBvcnRzIHRoaXMhISEKLQkJcmV0dXJuIChjYW5SZXN1bWUoKSAmJiBnZXRDdXJyZW50U3RhdGVJbmZvKCkgaW5zdGFuY2VvZiBJUERJU2lnbmFsSW5mbyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNjYW5TdXNwZW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXNwZW5kKCkgewotCQlpZiAoZ2V0U3RhdGUoKS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLlJFU1VNRUQpKSB7Ci0JCQkvLyBvbmx5IGFsbG93IHN1c3BlbmQgaWYgbm8gdGhyZWFkcyBhcmUgY3VycmVudGx5IHN1c3BlbmRlZAotCQkJSVRocmVhZFtdIHRocmVhZHMgPSBnZXRUaHJlYWRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGhyZWFkc1tpXS5pc1N1c3BlbmRlZCgpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI2NhblRlcm1pbmF0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkgewotCQlyZXR1cm4gaXNBdmFpbGFibGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0I2NyZWF0ZUdsb2JhbFZhcmlhYmxlKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBJUEdsb2JhbFZhcmlhYmxlIGNyZWF0ZUdsb2JhbFZhcmlhYmxlKElQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGluZm8pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUlQRElWYXJpYWJsZURlc2NyaXB0b3Igdm8gPSBudWxsOwotCQl0cnkgewotCQkJdm8gPSAoSVBESVZhcmlhYmxlRGVzY3JpcHRvcikgZ2V0UERJVGFyZ2V0KCkuZ2V0R2xvYmFsVmFyaWFibGVEZXNjcmlwdG9ycyhpbmZvLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpLCBudWxsLAotCQkJCQlpbmZvLmdldE5hbWUoKSk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCQlEZWJ1Z0V4Y2VwdGlvbi5UQVJHRVRfUkVRVUVTVF9GQUlMRUQsICh2byAhPSBudWxsKSA/IHZvLmdldE5hbWUoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSA6IGUuZ2V0TWVzc2FnZSgpLAotCQkJCQludWxsKSk7Ci0JCX0KLQkJcmV0dXJuIFBWYXJpYWJsZUZhY3RvcnkuY3JlYXRlR2xvYmFsVmFyaWFibGUodGhpcywgaW5mbywgdm8pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURpc2Nvbm5lY3QjZGlzY29ubmVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRhcmdldFJlcXVlc3RGYWlsZWQoIk5vdCBpbXBsZW1lbnQgUERlYnVnVGFyZ2V0IC0gZGlzY29ubmVjdCgpIHlldCIsIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2xlYW51cCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwcGluZ01vZGVUYXJnZXQjZW5hYmxlSW5zdHJ1Y3Rpb25TdGVwcGluZyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUluc3RydWN0aW9uU3RlcHBpbmcoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWZQcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0lOU1RSVUNUSU9OX1NURVBQSU5HX01PREUsIGVuYWJsZWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUV4cHJlc3Npb25MaXN0ZW5lciNleHByZXNzaW9uQWRkZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHByZXNzaW9uQWRkZWQoSUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUV4cHJlc3Npb25MaXN0ZW5lciNleHByZXNzaW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4cHJlc3Npb25DaGFuZ2VkKElFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklFeHByZXNzaW9uTGlzdGVuZXIjZXhwcmVzc2lvblJlbW92ZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHByZXNzaW9uUmVtb3ZlZChJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgUEV4cHJlc3Npb24gJiYgZXhwcmVzc2lvbi5nZXREZWJ1Z1RhcmdldCgpLmVxdWFscyh0aGlzKSkgewotCQkJKChQRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVBEZWJ1Z0VsZW1lbnQuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJRGVidWdUYXJnZXQuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUERlYnVnVGFyZ2V0LmNsYXNzKSkKLQkJCXJldHVybiB0aGlzOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVBESVRhcmdldC5jbGFzcykpCi0JCQlyZXR1cm4gcGRpVGFyZ2V0OwotCQlpZiAoYWRhcHRlci5lcXVhbHMoSUV4ZWNGaWxlSW5mby5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQRElTZXNzaW9uLmNsYXNzKSkKLQkJCXJldHVybiBnZXRQRElTZXNzaW9uKCk7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJTWVtb3J5QmxvY2tSZXRyaWV2YWxFeHRlbnNpb24uY2xhc3MpKQotCQkJcmV0dXJuIGZTZXNzaW9uLmdldE1lbW9yeU1hbmFnZXIoKS5nZXRNZW1vcnlSZXRyaWV2YWwoZ2V0VGFza3MoKSk7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJTWVtb3J5QmxvY2tSZXRyaWV2YWwuY2xhc3MpKQotCQkJcmV0dXJuIGZTZXNzaW9uLmdldE1lbW9yeU1hbmFnZXIoKS5nZXRNZW1vcnlSZXRyaWV2YWwoZ2V0VGFza3MoKSk7Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQjZ2V0QnJlYWtwb2ludEFkZHJlc3Mob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBMaW5lQnJlYWtwb2ludCkKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCcmVha3BvaW50QWRkcmVzcyhJUExpbmVCcmVha3BvaW50IGJyZWFrcG9pbnQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZlNlc3Npb24uZ2V0QnJlYWtwb2ludE1hbmFnZXIoKSAhPSBudWxsKSA/IGZTZXNzaW9uLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZ2V0QnJlYWtwb2ludEFkZHJlc3MoYnJlYWtwb2ludCkKLQkJCQk6IG5ldyBCaWdJbnRlZ2VyKCIwIik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudCNnZXREZWJ1Z1RhcmdldCgpCi0JICovCi0JcHVibGljIFBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUV4ZWNGaWxlSW5mbyNnZXRHbG9iYWxzKCkKLQkgKi8KLQlwdWJsaWMgSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3JbXSBnZXRHbG9iYWxzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJdGFyZ2V0UmVxdWVzdEZhaWxlZCgiTm90IGltcGxlbWVudCBQRGVidWdUYXJnZXQgLSBnZXRHbG9iYWwoKSB5ZXQiLCBudWxsKTsKLQkJcmV0dXJuIG5ldyBJUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvclswXTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja1JldHJpZXZhbCNnZXRNZW1vcnlCbG9jayhsb25nLCBsb25nKQotCSAqLwotCXB1YmxpYyBJTWVtb3J5QmxvY2sgZ2V0TWVtb3J5QmxvY2sobG9uZyBzdGFydEFkZHJlc3MsIGxvbmcgbGVuZ3RoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZlNlc3Npb24uZ2V0TWVtb3J5TWFuYWdlcigpLmdldE1lbW9yeUJsb2NrKGdldFRhc2tzKCksIHN0YXJ0QWRkcmVzcywgbGVuZ3RoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gUFJPQ0VTU19OQU1FICsgZ2V0SUQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QRGVidWdFbGVtZW50I2dldFBESVRhcmdldCgpCi0JICovCi0JcHVibGljIElQRElUYXJnZXQgZ2V0UERJVGFyZ2V0KCkgewotCQlyZXR1cm4gcGRpVGFyZ2V0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0I2dldFByb2Nlc3MoKQotCSAqLwotCXB1YmxpYyBJUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0I2dldFJlZ2lzdGVyRGVzY3JpcHRvcnMoKQotCSAqLwotCXB1YmxpYyBJUFJlZ2lzdGVyRGVzY3JpcHRvcltdIGdldFJlZ2lzdGVyRGVzY3JpcHRvcnMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZlNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkuZ2V0QWxsUmVnaXN0ZXJEZXNjcmlwdG9ycyhnZXRUYXNrcygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0I2dldFNpZ25hbHMoKQotCSAqLwotCXB1YmxpYyBJUFNpZ25hbFtdIGdldFNpZ25hbHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZlNlc3Npb24uZ2V0U2lnbmFsTWFuYWdlcigpLmdldFNpZ25hbHMoZ2V0VGFza3MoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQjZ2V0VGhyZWFkcygpCi0JICovCi0JcHVibGljIElUaHJlYWRbXSBnZXRUaHJlYWRzKCkgewotCQlMaXN0PElUaHJlYWQ+IHRocmVhZHMgPSBnZXRUaHJlYWRMaXN0KCk7Ci0JCXJldHVybiAoSVRocmVhZFtdKSB0aHJlYWRzLnRvQXJyYXkobmV3IElUaHJlYWRbdGhyZWFkcy5zaXplKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXIjaGFuZGxlRGVidWdFdmVudHMob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKElQRElFdmVudFtdIGV2ZW50cykgewotCQlmb3IgKElQRElFdmVudCBldmVudCA6IGV2ZW50cykgewotCQkJaWYgKCFldmVudC5jb250YWlucyhnZXRUYXNrcygpKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESURlc3Ryb3llZEV2ZW50KSB7Ci0JCQkJaGFuZGxlVGVybWluYXRlZEV2ZW50KChJUERJRGVzdHJveWVkRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ3JlYXRlZEV2ZW50KSB7Ci0JCQkJaGFuZGxlQ3JlYXRlZEV2ZW50KChJUERJQ3JlYXRlZEV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESVN1c3BlbmRlZEV2ZW50KSB7Ci0JCQkJaGFuZGxlU3VzcGVuZGVkRXZlbnQoKElQRElTdXNwZW5kZWRFdmVudCkgZXZlbnQpOwotCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQRElSZXN1bWVkRXZlbnQpIHsKLQkJCQloYW5kbGVSZXN1bWVkRXZlbnQoKElQRElSZXN1bWVkRXZlbnQpIGV2ZW50KTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJRGlzY29ubmVjdGVkRXZlbnQpIHsKLQkJCQloYW5kbGVEaXNjb25uZWN0ZWRFdmVudCgoSVBESURpc2Nvbm5lY3RlZEV2ZW50KSBldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESUNoYW5nZWRFdmVudCkgewotCQkJCWhhbmRsZUNoYW5nZWRFdmVudCgoSVBESUNoYW5nZWRFdmVudCkgZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z1RhcmdldCNoYXNTaWduYWxzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTaWduYWxzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChmU2Vzc2lvbi5nZXRTaWduYWxNYW5hZ2VyKCkuZ2V0U2lnbmFscyhnZXRUYXNrcygpKS5sZW5ndGggPiAwKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldCNoYXNUaHJlYWRzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNUaHJlYWRzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRocmVhZExpc3QoKS5zaXplKCkgPiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURpc2Nvbm5lY3QjaXNEaXNjb25uZWN0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY29ubmVjdGVkKCkgewotCQlyZXR1cm4gKGdldFN0YXRlKCkuZXF1YWxzKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5ESVNDT05ORUNURUQpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JU3RlcHBpbmdNb2RlVGFyZ2V0I2lzSW5zdHJ1Y3Rpb25TdGVwcGluZ0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5zdHJ1Y3Rpb25TdGVwcGluZ0VuYWJsZWQoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfSU5TVFJVQ1RJT05fU1RFUFBJTkdfTU9ERSkKLQkJCQl8fCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkKLQkJCQkJCS5nZXRCb29sZWFuKElQRGVidWdDb25zdGFudHMuUFJFRl9JTlNUUlVDVElPTl9TVEVQX01PREVfT04pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQjaXNMaXR0bGVFbmRpYW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGl0dGxlRW5kaWFuKCkgewotCQkvLyBUT0RPIGFsd2F5cyB0cnVlCi0JCWlmIChmSXNMaXR0bGVFbmRpYW4gPT0gbnVsbCkgewotCQkJZklzTGl0dGxlRW5kaWFuID0gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBmSXNMaXR0bGVFbmRpYW4uYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z1RhcmdldCNpc1Bvc3RNb3J0ZW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUG9zdE1vcnRlbSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjaXNTdXNwZW5kZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkgewotCQlyZXR1cm4gKGdldFN0YXRlKCkuZXF1YWxzKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5TVVNQRU5ERUQpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjaXNUZXJtaW5hdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKSB7Ci0JCXJldHVybiAoZ2V0U3RhdGUoKS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLlRFUk1JTkFURUQpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hMaXN0ZW5lciNsYXVuY2hBZGRlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoQWRkZWQoSUxhdW5jaCBsYXVuY2gpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hMaXN0ZW5lciNsYXVuY2hDaGFuZ2VkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2hDaGFuZ2VkKElMYXVuY2ggbGF1bmNoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTGlzdGVuZXIjbGF1bmNoUmVtb3ZlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoUmVtb3ZlZChJTGF1bmNoIGxhdW5jaCkgewotCQlpZiAoIWlzQXZhaWxhYmxlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobGF1bmNoLmVxdWFscyhnZXRMYXVuY2goKSkpIHsKLQkJCWRpc2Nvbm5lY3RlZCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z1RhcmdldCNtb2RpZnlSZWdpc3Rlckdyb3VwKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwLCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFJlZ2lzdGVyRGVzY3JpcHRvcltdKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVJlZ2lzdGVyR3JvdXAoSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAgZ3JvdXAsIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMpIHsKLQkJZlNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkubW9kaWZ5UmVnaXN0ZXJHcm91cChnZXRUYXNrcygpLCBncm91cCwgZGVzY3JpcHRvcnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklUYXJnZXRQcm9wZXJ0aWVzI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZQcmVmZXJlbmNlcyAhPSBudWxsKQotCQkJZlByZWZlcmVuY2VzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQjcmVtb3ZlUmVnaXN0ZXJHcm91cHMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZ2lzdGVyR3JvdXBzKElSZWdpc3Rlckdyb3VwW10gZ3JvdXBzKSB7Ci0JCWZTZXNzaW9uLmdldFJlZ2lzdGVyTWFuYWdlcigpLnJlbW92ZVJlZ2lzdGVyR3JvdXBzKGdldFRhc2tzKCksIGdyb3Vwcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3RhcnQjcmVzdGFydCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRhcmdldFJlcXVlc3RGYWlsZWQoIk5vdCBpbXBsZW1lbnQgUERlYnVnVGFyZ2V0IC0gcmVzdGFydCgpIHlldCIsIG51bGwpOwotCQlpZiAoIWNhblJlc3RhcnQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z1RhcmdldCNyZXN0b3JlRGVmYXVsdFJlZ2lzdGVyR3JvdXBzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFJlZ2lzdGVyR3JvdXBzKCkgewotCQlmU2Vzc2lvbi5nZXRSZWdpc3Rlck1hbmFnZXIoKS5yZXN0b3JlRGVmYXVsdHMoZ2V0VGFza3MoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNyZXN1bWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuUmVzdW1lKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQljaGFuZ2VTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuUkVTVU1JTkcpOwotCQl0cnkgewotCQkJZ2V0UERJU2Vzc2lvbigpLnJlc3VtZShnZXRUYXNrcygpLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN0b3JlT2xkU3RhdGUoKTsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3VtZVdpdGhvdXRTaWduYWwjcmVzdW1lV2l0aG91dFNpZ25hbCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lV2l0aG91dFNpZ25hbCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuUmVzdW1lKCkpCi0JCQlyZXR1cm47Ci0JCWNoYW5nZVN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5SRVNVTUlORyk7Ci0JCXRyeSB7Ci0JCQlnZXRQRElTZXNzaW9uKCkucmVzdW1lKGdldFRhc2tzKCksIGZhbHNlKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3RvcmVPbGRTdGF0ZSgpOwotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cENoYW5nZUxpc3RlbmVyI3NvdXJjZUNvbnRhaW5lcnNDaGFuZ2VkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBEaXJlY3RvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzb3VyY2VDb250YWluZXJzQ2hhbmdlZChJU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IpIHsKLQkJc2V0U291cmNlTG9va3VwUGF0aChkaXJlY3Rvci5nZXRTb3VyY2VDb250YWluZXJzKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0I3N1cHBvcnRzQnJlYWtwb2ludChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQnJlYWtwb2ludChJQnJlYWtwb2ludCBicmVha3BvaW50KSB7Ci0JCXJldHVybiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQQnJlYWtwb2ludCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXBwaW5nTW9kZVRhcmdldCNzdXBwb3J0c0luc3RydWN0aW9uU3RlcHBpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5zdHJ1Y3Rpb25TdGVwcGluZygpIHsKLQkJLy8gVE9ETyBOb3QgaW1wbGVtZW50IHlldAotCQkvLyByZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLnN1cHBvcnRzSW5zdHJ1Y3Rpb25TdGVwcGluZygpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tSZXRyaWV2YWwjc3VwcG9ydHNTdG9yYWdlUmV0cmlldmFsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N0b3JhZ2VSZXRyaWV2YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI3N1c3BlbmQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoIWNhblN1c3BlbmQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWNoYW5nZVN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5TVVNQRU5ESU5HKTsKLQkJdHJ5IHsKLQkJCWdldFBESVNlc3Npb24oKS5zdXNwZW5kKGdldFRhc2tzKCkpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJcmVzdG9yZU9sZFN0YXRlKCk7Ci0JCQl0YXJnZXRSZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRlcm1pbmF0ZSN0ZXJtaW5hdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuVGVybWluYXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQljaGFuZ2VTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuVEVSTUlOQVRJTkcpOwotCQl0cnkgewotCQkJZ2V0UERJU2Vzc2lvbigpLnRlcm1pbmF0ZShnZXRUYXNrcygpKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3RvcmVPbGRTdGF0ZSgpOwotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXROYW1lKCk7Ci0JCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdGF0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUgc3RhdGUpIHsKLQkJc2V0U3RhdGUoc3RhdGUpOwotCQlJdGVyYXRvcjxJVGhyZWFkPiBpdCA9IGdldFRocmVhZExpc3QoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkoKFBUaHJlYWQpIGl0Lm5leHQoKSkuc2V0U3RhdGUoc3RhdGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0JCXJlc2V0U3RhdHVzKCk7Ci0JCXJlbW92ZUFsbFRocmVhZHMoKTsKLQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRFeHByZXNzaW9uTWFuYWdlcigpLnJlbW92ZUV4cHJlc3Npb25MaXN0ZW5lcih0aGlzKTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5yZW1vdmVMYXVuY2hMaXN0ZW5lcih0aGlzKTsKLQkJZGlzcG9zZVNpZ25hbE1hbmFnZXIoKTsKLQkJZGlzcG9zZVJlZ2lzdGVyTWFuYWdlcigpOwotCQlzYXZlTWVtb3J5QmxvY2tzKCk7Ci0JCWRpc3Bvc2VNZW1vcnlNYW5hZ2VyKCk7Ci0JCWRpc3Bvc2VTb3VyY2VNYW5hZ2VyKCk7Ci0JCWRpc3Bvc2VTb3VyY2VMb29rdXBQYXRoKCk7Ci0JCXJlbW92ZUFsbEV4cHJlc3Npb25zKCk7Ci0JCWRpc3Bvc2VQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwb3NlUHJlZmVyZW5jZXMoKSB7Ci0JCWZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBkaVRocmVhZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFBUaHJlYWQgZmluZFRocmVhZChJUERJVGhyZWFkIHBkaVRocmVhZCkgewotCQlMaXN0PElUaHJlYWQ+IHRocmVhZHMgPSBnZXRUaHJlYWRMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5zaXplKCk7IGkrKykgewotCQkJUFRocmVhZCB0ID0gKFBUaHJlYWQpIHRocmVhZHMuZ2V0KGkpOwotCQkJaWYgKHQuZ2V0UERJVGhyZWFkKCkuZXF1YWxzKHBkaVRocmVhZCkpCi0JCQkJcmV0dXJuIHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocmVhZHMKLQkgKiBAcGFyYW0gcGRpVGhyZWFkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgUFRocmVhZCBmaW5kVGhyZWFkKExpc3Q8SVRocmVhZD4gdGhyZWFkcywgSVBESVRocmVhZCBwZGlUaHJlYWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0JCQlQVGhyZWFkIHQgPSAoUFRocmVhZCkgdGhyZWFkcy5nZXQoaSk7Ci0JCQlpZiAodC5nZXRQRElUaHJlYWQoKS5lcXVhbHMocGRpVGhyZWFkKSkKLQkJCQlyZXR1cm4gdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSBjb250YWluZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdldFNvdXJjZUxvb2t1cFBhdGgoTGlzdDxTdHJpbmc+IGxpc3QsIElTb3VyY2VDb250YWluZXJbXSBjb250YWluZXJzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGNvbnRhaW5lcnNbaV0gaW5zdGFuY2VvZiBQcm9qZWN0U291cmNlQ29udGFpbmVyKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoUHJvamVjdFNvdXJjZUNvbnRhaW5lcikgY29udGFpbmVyc1tpXSkuZ2V0UHJvamVjdCgpOwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkJCQkJbGlzdC5hZGQocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyc1tpXSBpbnN0YW5jZW9mIEZvbGRlclNvdXJjZUNvbnRhaW5lcikgewotCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKChGb2xkZXJTb3VyY2VDb250YWluZXIpIGNvbnRhaW5lcnNbaV0pLmdldENvbnRhaW5lcigpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZXhpc3RzKCkpCi0JCQkJCWxpc3QuYWRkKGNvbnRhaW5lci5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyc1tpXSBpbnN0YW5jZW9mIERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lcikgewotCQkJCUZpbGUgZGlyID0gKChEaXJlY3RvcnlTb3VyY2VDb250YWluZXIpIGNvbnRhaW5lcnNbaV0pLmdldERpcmVjdG9yeSgpOwotCQkJCWlmIChkaXIgIT0gbnVsbCAmJiBkaXIuZXhpc3RzKCkpIHsKLQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWxpc3QuYWRkKHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyc1tpXS5pc0NvbXBvc2l0ZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0U291cmNlTG9va3VwUGF0aChsaXN0LCBjb250YWluZXJzW2ldLmdldFNvdXJjZUNvbnRhaW5lcnMoKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZWRFdmVudChJUERJQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiA9IGV2ZW50LmdldFJlYXNvbigpOwotCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVNpZ25hbEluZm8pIHsKLQkJCWZTZXNzaW9uLmdldFNpZ25hbE1hbmFnZXIoKS5zaWduYWxDaGFuZ2VkKGdldFRhc2tzKCksICgoSVBESVNpZ25hbEluZm8pIHJlYXNvbikuZ2V0U2lnbmFsKCkpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElNZW1vcnlCbG9ja0luZm8pIHsKLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJVmFyaWFibGVJbmZvKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ3JlYXRlZEV2ZW50KElQRElDcmVhdGVkRXZlbnQgZXZlbnQpIHsKLQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gZXZlbnQuZ2V0UmVhc29uKCk7Ci0JCWlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJQnJlYWtwb2ludEluZm8pIHsKLQotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElUaHJlYWRJbmZvKSB7Ci0JCQlJUERJVGhyZWFkIHBkaVRocmVhZCA9ICgoSVBESVRocmVhZEluZm8pIHJlYXNvbikuZ2V0VGhyZWFkKCk7Ci0JCQlQVGhyZWFkIHRocmVhZCA9IGZpbmRUaHJlYWQocGRpVGhyZWFkKTsKLQkJCWlmICh0aHJlYWQgPT0gbnVsbCkgewotCQkJCXRocmVhZCA9IGNyZWF0ZVRocmVhZChwZGlUaHJlYWQpOwotCQkJCXRocmVhZC5maXJlQ3JlYXRpb25FdmVudCgpOwotCQkJfQotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaGFyZWRMaWJyYXJ5SW5mbykgewotCQkJLy8gZlNlc3Npb24uZ2V0TW9kdWxlTWFuYWdlcigpLnNoYXJlZExpYnJhcnlMb2FkZWQoKChJUERJU2hhcmVkTGlicmFyeUluZm8pcmVhc29uKS5nZXRTaGFyZWRMaWJyYXJ5KCkpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElNZW1vcnlCbG9ja0luZm8pIHsKLQotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElSZWdpc3RlckluZm8pIHsKLQotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElWYXJpYWJsZUluZm8pIHsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURpc2Nvbm5lY3RlZEV2ZW50KElQRElEaXNjb25uZWN0ZWRFdmVudCBldmVudCkgewotCQlkaXNjb25uZWN0ZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVzdW1lZEV2ZW50KElQRElSZXN1bWVkRXZlbnQgZXZlbnQpIHsKLQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlJFU1VNRUQpOwotCQlzZXRDdXJyZW50U3RhdGVJbmZvKG51bGwpOwotCQlyZXNldFN0YXR1cygpOwotCQlBcnJheUxpc3Q8RGVidWdFdmVudD4gZGVidWdFdmVudHMgPSBuZXcgQXJyYXlMaXN0PERlYnVnRXZlbnQ+KDEwKTsKLQkJaW50IGRldGFpbCA9IERlYnVnRXZlbnQuVU5TUEVDSUZJRUQ7Ci0JCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5DT05USU5VRToKLQkJCWRldGFpbCA9IERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBJUERJUmVzdW1lZEV2ZW50LlNURVBfSU5UTzoKLQkJY2FzZSBJUERJUmVzdW1lZEV2ZW50LlNURVBfSU5UT19JTlNUUlVDVElPTjoKLQkJCWRldGFpbCA9IERlYnVnRXZlbnQuU1RFUF9JTlRPOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX09WRVI6Ci0JCWNhc2UgSVBESVJlc3VtZWRFdmVudC5TVEVQX09WRVJfSU5TVFJVQ1RJT046Ci0JCQlkZXRhaWwgPSBEZWJ1Z0V2ZW50LlNURVBfT1ZFUjsKLQkJCWJyZWFrOwotCQljYXNlIElQRElSZXN1bWVkRXZlbnQuU1RFUF9SRVRVUk46Ci0JCQlkZXRhaWwgPSBEZWJ1Z0V2ZW50LlNURVBfUkVUVVJOOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVidWdFdmVudHMuYWRkKGNyZWF0ZVJlc3VtZUV2ZW50KGRldGFpbCkpOwotCQlyZXN1bWVUaHJlYWRzKGRlYnVnRXZlbnRzLCBkZXRhaWwpOwotCQlmaXJlRXZlbnRTZXQoKERlYnVnRXZlbnRbXSkgZGVidWdFdmVudHMudG9BcnJheShuZXcgRGVidWdFdmVudFtkZWJ1Z0V2ZW50cy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVN1c3BlbmRlZEV2ZW50KElQRElTdXNwZW5kZWRFdmVudCBldmVudCkgewotCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuU1VTUEVOREVEKTsKLQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gZXZlbnQuZ2V0UmVhc29uKCk7Ci0JCXNldEN1cnJlbnRTdGF0ZUluZm8ocmVhc29uKTsKLQkJZlNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkudGFyZ2V0U3VzcGVuZGVkKGdldFRhc2tzKCkpOwotCQlmU2Vzc2lvbi5nZXRCcmVha3BvaW50TWFuYWdlcigpLnNraXBCcmVha3BvaW50cyhmYWxzZSk7Ci0JCXJlZnJlc2hUaHJlYWRzKCk7Ci0JCXN1c3BlbmRUaHJlYWRzKGV2ZW50KTsKLQkJaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElFbmRTdGVwcGluZ1JhbmdlSW5mbykgewotCQkJZmlyZVN1c3BlbmRFdmVudChEZWJ1Z0V2ZW50LlVOU1BFQ0lGSUVEKTsKLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJVGhyZWFkSW5mbykgewotCQkJSVBESVRocmVhZCBwZGlUaHJlYWQgPSAoKElQRElUaHJlYWRJbmZvKSByZWFzb24pLmdldFRocmVhZCgpOwotCQkJUFRocmVhZCB0aHJlYWQgPSBmaW5kVGhyZWFkKHBkaVRocmVhZCk7Ci0JCQlpZiAodGhyZWFkICE9IG51bGwpIHsKLQkJCQlnZXRUaHJlYWRMaXN0KCkucmVtb3ZlKHRocmVhZCk7Ci0JCQkJdGhyZWFkLmhhbmRsZURlYnVnRXZlbnRzKG5ldyBJUERJRXZlbnRbXSB7IGV2ZW50IH0pOwotCQkJfQotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQkJZmlyZVN1c3BlbmRFdmVudChEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaWduYWxJbmZvKSB7Ci0JCQlmaXJlU3VzcGVuZEV2ZW50KERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1QpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElXYXRjaHBvaW50VHJpZ2dlckluZm8pIHsKLQkJCWZpcmVTdXNwZW5kRXZlbnQoRGVidWdFdmVudC5CUkVBS1BPSU5UKTsKLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJV2F0Y2hwb2ludFNjb3BlSW5mbykgewotCQkJZlNlc3Npb24uZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS53YXRjaHBvaW50T3V0T2ZTY29wZShnZXRUYXNrcygpLCAoKElQRElXYXRjaHBvaW50U2NvcGVJbmZvKSByZWFzb24pLmdldFdhdGNocG9pbnQoKSk7Ci0JCQlmaXJlU3VzcGVuZEV2ZW50KERlYnVnRXZlbnQuQlJFQUtQT0lOVCk7Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVNoYXJlZExpYnJhcnlJbmZvKSB7Ci0JCQlmaXJlU3VzcGVuZEV2ZW50KERlYnVnRXZlbnQuVU5TUEVDSUZJRUQpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElGdW5jdGlvbkZpbmlzaGVkSW5mbykgewotCi0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUxvY2F0aW9uUmVhY2hlZEluZm8pIHsKLQotCQl9IGVsc2UgewotCQkJZmlyZVN1c3BlbmRFdmVudChEZWJ1Z0V2ZW50LlVOU1BFQ0lGSUVEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVUZXJtaW5hdGVkRXZlbnQoSVBESURlc3Ryb3llZEV2ZW50IGV2ZW50KSB7Ci0JCUlQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiA9IGV2ZW50LmdldFJlYXNvbigpOwotCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUJyZWFrcG9pbnRJbmZvKSB7Ci0KLQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJVGhyZWFkSW5mbykgewotCQkJSVBESVRocmVhZCBwZGlUaHJlYWQgPSAoKElQRElUaHJlYWRJbmZvKSByZWFzb24pLmdldFRocmVhZCgpOwotCQkJUFRocmVhZCB0aHJlYWQgPSBmaW5kVGhyZWFkKHBkaVRocmVhZCk7Ci0JCQlpZiAodGhyZWFkICE9IG51bGwpIHsKLQkJCQlnZXRUaHJlYWRMaXN0KCkucmVtb3ZlKHRocmVhZCk7Ci0JCQkJdGhyZWFkLnRlcm1pbmF0ZWQoKTsKLQkJCQl0aHJlYWQuZmlyZVRlcm1pbmF0ZUV2ZW50KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUVycm9ySW5mbykgewotCQkJSVBESUVycm9ySW5mbyBpbmZvID0gKElQRElFcnJvckluZm8pIHJlYXNvbjsKLQkJCXNldFN0YXR1cyhJUERlYnVnRWxlbWVudFN0YXR1cy5FUlJPUiwgaW5mby5nZXRNZXNzYWdlKCkpOwotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElQRGVidWdDb25zdGFudHMuU1RBVFVTX0NPREVfRVJST1IsCi0JCQkJCUNvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiUERlYnVnVGFyZ2V0LjEiKSwgbnVsbCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluZm8uZ2V0RGV0YWlsTWVzc2FnZSgpLCAiXG5cciIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICh0b2tlbi5sZW5ndGgoKSA+IDIwMCkgewotCQkJCQl0b2tlbiA9IHRva2VuLnN1YnN0cmluZygwLCAyMDApOwotCQkJCX0KLQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgc3RhdHVzLmdldFBsdWdpbigpLCBJUERlYnVnQ29uc3RhbnRzLlNUQVRVU19DT0RFX0VSUk9SLCB0b2tlbiwgbnVsbCkpOwotCQkJfQotCQkJUERlYnVnVXRpbHMuZXJyb3Ioc3RhdHVzLCB0aGlzKTsKLQkJCWZpcmVUZXJtaW5hdGVFdmVudCgpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaGFyZWRMaWJyYXJ5SW5mbykgewotCQkJLy8gZlNlc3Npb24uZ2V0TW9kdWxlTWFuYWdlcigpLnNoYXJlZExpYnJhcnlVbmxvYWRlZCgoKElQRElTaGFyZWRMaWJyYXJ5SW5mbylyZWFzb24pLmdldFNoYXJlZExpYnJhcnkoKSk7Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVNpZ25hbEluZm8pIHsKLQkJCXJlbW92ZUFsbFRocmVhZHMoKTsKLQkJCXNldFN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5FWElURUQpOwotCQkJc2V0Q3VycmVudFN0YXRlSW5mbyhyZWFzb24pOwotCQkJZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuQ09OVEVOVCk7Ci0JCQl0ZXJtaW5hdGVkKCk7Ci0JCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVZhcmlhYmxlSW5mbykgewotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXMgPSBuZXcgUHJlZmVyZW5jZXMoKTsKLQkJZlByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9JTlNUUlVDVElPTl9TVEVQUElOR19NT0RFLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLQkJcmV0dXJuICEoaXNUZXJtaW5hdGVkKCkgfHwgaXNUZXJtaW5hdGluZygpIHx8IGlzRGlzY29ubmVjdGVkKCkgfHwgaXNEaXNjb25uZWN0aW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250YWluZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNvdXJjZUxvb2t1cFBhdGgoSVNvdXJjZUNvbnRhaW5lcltdIGNvbnRhaW5lcnMpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihjb250YWluZXJzLmxlbmd0aCk7Ci0JCWdldFNvdXJjZUxvb2t1cFBhdGgobGlzdCwgY29udGFpbmVycyk7Ci0JCXRyeSB7Ci0JCQlnZXRQRElUYXJnZXQoKS5zZXRTb3VyY2VQYXRocygoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJlYWRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFRocmVhZExpc3QoQXJyYXlMaXN0PElUaHJlYWQ+IHRocmVhZHMpIHsKLQkJZlRocmVhZHMgPSB0aHJlYWRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB0ZXJtaW5hdGVkKCkgewotCQlpZiAoIWlzVGVybWluYXRlZCgpKSB7Ci0JCQlpZiAoIWlzRGlzY29ubmVjdGVkKCkpIHsKLQkJCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuVEVSTUlOQVRFRCk7Ci0JCQl9Ci0JCQljbGVhbnVwKCk7Ci0JCQlmaXJlVGVybWluYXRlRXZlbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwZGlUaHJlYWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFBUaHJlYWQgY3JlYXRlVGhyZWFkKElQRElUaHJlYWQgcGRpVGhyZWFkKSB7Ci0JCVBUaHJlYWQgdGhyZWFkID0gbmV3IFBUaHJlYWQodGhpcywgcGRpVGhyZWFkKTsKLQkJZ2V0VGhyZWFkTGlzdCgpLmFkZCh0aHJlYWQpOwotCQlyZXR1cm4gdGhyZWFkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2Nvbm5lY3RlZCgpIHsKLQkJaWYgKCFpc0Rpc2Nvbm5lY3RlZCgpKSB7Ci0JCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuRElTQ09OTkVDVEVEKTsKLQkJCWNsZWFudXAoKTsKLQkJCWZpcmVUZXJtaW5hdGVFdmVudCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZU1lbW9yeU1hbmFnZXIoKSB7Ci0JCWZTZXNzaW9uLmdldE1lbW9yeU1hbmFnZXIoKS5kaXNwb3NlKGdldFRhc2tzKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VSZWdpc3Rlck1hbmFnZXIoKSB7Ci0JCWZTZXNzaW9uLmdldE1lbW9yeU1hbmFnZXIoKS5zYXZlKGdldFRhc2tzKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VTaWduYWxNYW5hZ2VyKCkgewotCQlmU2Vzc2lvbi5nZXRTaWduYWxNYW5hZ2VyKCkuZGlzcG9zZShnZXRUYXNrcygpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlU291cmNlTG9va3VwUGF0aCgpIHsKLQkJSVNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IGdldExhdW5jaCgpLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJaWYgKGxvY2F0b3IgaW5zdGFuY2VvZiBJU291cmNlTG9va3VwRGlyZWN0b3IpIHsKLQkJCUlTb3VyY2VMb29rdXBQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9ICgoSVNvdXJjZUxvb2t1cERpcmVjdG9yKSBsb2NhdG9yKS5nZXRQYXJ0aWNpcGFudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljaXBhbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKHBhcnRpY2lwYW50c1tpXSBpbnN0YW5jZW9mIFBTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCkgewotCQkJCQkoKFBTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCkgcGFydGljaXBhbnRzW2ldKS5yZW1vdmVTb3VyY2VMb29rdXBDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlU291cmNlTWFuYWdlcigpIHsKLQkJSVNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IGdldExhdW5jaCgpLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJaWYgKGxvY2F0b3IgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcikgKChJQWRhcHRhYmxlKSBsb2NhdG9yKQotCQkJCQkuZ2V0QWRhcHRlcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJVGhyZWFkIGdldEN1cnJlbnRUaHJlYWQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJVGhyZWFkW10gdGhyZWFkcyA9IGdldFRocmVhZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoKChQVGhyZWFkKSB0aHJlYWRzW2ldKS5pc0N1cnJlbnQoKSkKLQkJCQlyZXR1cm4gdGhyZWFkc1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxJVGhyZWFkPiBnZXRUaHJlYWRMaXN0KCkgewotCQlyZXR1cm4gZlRocmVhZHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gaW5pdGlhbGl6ZVNvdXJjZUxvb2t1cFBhdGgoKTsKLQkJQXJyYXlMaXN0PERlYnVnRXZlbnQ+IGRlYnVnRXZlbnRzID0gbmV3IEFycmF5TGlzdDxEZWJ1Z0V2ZW50PigxKTsKLQkJZGVidWdFdmVudHMuYWRkKGNyZWF0ZUNyZWF0ZUV2ZW50KCkpOwotCQlpbml0aWFsaXplVGhyZWFkcyhkZWJ1Z0V2ZW50cyk7Ci0JCWluaXRpYWxpemVSZWdpc3RlcnMoKTsKLQkJaW5pdGlhbGl6ZVNvdXJjZU1hbmFnZXIoKTsKLQkJaW5pdGlhbGl6ZU1lbW9yeUJsb2NrcygpOwotCQlmaXJlRXZlbnRTZXQoKERlYnVnRXZlbnRbXSkgZGVidWdFdmVudHMudG9BcnJheShuZXcgRGVidWdFdmVudFtkZWJ1Z0V2ZW50cy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1lbW9yeUJsb2NrcygpIHsKLQkJZlNlc3Npb24uZ2V0TWVtb3J5TWFuYWdlcigpLmluaXRpYWxpemUoZ2V0VGFza3MoKSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVJlZ2lzdGVycygpIHsKLQkJZlNlc3Npb24uZ2V0UmVnaXN0ZXJNYW5hZ2VyKCkuaW5pdGlhbGl6ZShnZXRUYXNrcygpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU291cmNlTG9va3VwUGF0aCgpIHsKLQkJSVNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IGdldExhdW5jaCgpLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJaWYgKGxvY2F0b3IgaW5zdGFuY2VvZiBJU291cmNlTG9va3VwRGlyZWN0b3IpIHsKLQkJCUlTb3VyY2VMb29rdXBQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9ICgoSVNvdXJjZUxvb2t1cERpcmVjdG9yKSBsb2NhdG9yKS5nZXRQYXJ0aWNpcGFudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljaXBhbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKHBhcnRpY2lwYW50c1tpXSBpbnN0YW5jZW9mIFBTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCkgewotCQkJCQkoKFBTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCkgcGFydGljaXBhbnRzW2ldKS5hZGRTb3VyY2VMb29rdXBDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXRTb3VyY2VMb29rdXBQYXRoKCgoSVNvdXJjZUxvb2t1cERpcmVjdG9yKSBsb2NhdG9yKS5nZXRTb3VyY2VDb250YWluZXJzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNvdXJjZU1hbmFnZXIoKSB7Ci0JCUlTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRMYXVuY2goKS5nZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCWlmIChsb2NhdG9yIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVBTb3VyY2VMb2NhdG9yIGNsb2NhdG9yID0gKElQU291cmNlTG9jYXRvcikgKChJQWRhcHRhYmxlKSBsb2NhdG9yKS5nZXRBZGFwdGVyKElQU291cmNlTG9jYXRvci5jbGFzcyk7Ci0JCQlpZiAoY2xvY2F0b3IgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJUFNvdXJjZU1hbmFnZXIgc20gPSAoUFNvdXJjZU1hbmFnZXIpICgoSUFkYXB0YWJsZSkgY2xvY2F0b3IpLmdldEFkYXB0ZXIoUFNvdXJjZU1hbmFnZXIuY2xhc3MpOwotCQkJCWlmIChzbSAhPSBudWxsKQotCQkJCQlzbS5zZXREZWJ1Z1RhcmdldCh0aGlzKTsKLQkJCX0KLQkJCUlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKSAoKElBZGFwdGFibGUpIGxvY2F0b3IpCi0JCQkJCS5nZXRBZGFwdGVyKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWJ1Z0V2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUaHJlYWRzKExpc3Q8RGVidWdFdmVudD4gZGVidWdFdmVudHMpIHsKLQkJSVBESVRocmVhZFtdIHBkaVRocmVhZHMgPSBuZXcgSVBESVRocmVhZFswXTsKLQkJdHJ5IHsKLQkJCWlmIChpc1N1c3BlbmRlZCgpKQotCQkJCXBkaVRocmVhZHMgPSBnZXRQRElUYXJnZXQoKS5nZXRUaHJlYWRzKCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlEZWJ1Z0V2ZW50IHN1c3BlbmRFdmVudCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGRpVGhyZWFkcy5sZW5ndGg7ICsraSkgewotCQkJUFRocmVhZCB0aHJlYWQgPSBjcmVhdGVUaHJlYWQocGRpVGhyZWFkc1tpXSk7Ci0JCQlkZWJ1Z0V2ZW50cy5hZGQodGhyZWFkLmNyZWF0ZUNyZWF0ZUV2ZW50KCkpOwotCQkJdHJ5IHsKLQkJCQlpZiAocGRpVGhyZWFkc1tpXS5lcXVhbHMoZ2V0UERJVGFyZ2V0KCkuZ2V0Q3VycmVudFRocmVhZCgpKSAmJiB0aHJlYWQuaXNTdXNwZW5kZWQoKSkgewotCQkJCQkvLyBVc2UgQlJFQUtQT0lOVCBhcyBhIGRldGFpbCB0byBmb3JjZSBwZXJzcGVjdGl2ZSBzd2l0Y2gKLQkJCQkJc3VzcGVuZEV2ZW50ID0gdGhyZWFkLmNyZWF0ZVN1c3BlbmRFdmVudChEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKHN1c3BlbmRFdmVudCAhPSBudWxsKSB7Ci0JCQlkZWJ1Z0V2ZW50cy5hZGQoc3VzcGVuZEV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RpbmcoKSB7Ci0JCXJldHVybiAoZ2V0U3RhdGUoKS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLkRJU0NPTk5FQ1RJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXNwZW5kaW5nKCkgewotCQlyZXR1cm4gKGdldFN0YXRlKCkuZXF1YWxzKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5TVVNQRU5ESU5HKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVGVybWluYXRpbmcoKSB7Ci0JCXJldHVybiAoZ2V0U3RhdGUoKS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLlRFUk1JTkFUSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTGlzdDxJVGhyZWFkPiByZWZyZXNoVGhyZWFkcygpIHsKLQkJQXJyYXlMaXN0PElUaHJlYWQ+IG5ld1RocmVhZHMgPSBuZXcgQXJyYXlMaXN0PElUaHJlYWQ+KDUpOwotCQlBcnJheUxpc3Q8SVRocmVhZD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVRocmVhZD4oNSk7Ci0JCUFycmF5TGlzdDxEZWJ1Z0V2ZW50PiBkZWJ1Z0V2ZW50cyA9IG5ldyBBcnJheUxpc3Q8RGVidWdFdmVudD4oNSk7Ci0JCUxpc3Q8SVRocmVhZD4gb2xkTGlzdCA9IChMaXN0PElUaHJlYWQ+KSBnZXRUaHJlYWRMaXN0KCkuY2xvbmUoKTsKLQkJSVBESVRocmVhZFtdIHBkaVRocmVhZHMgPSBuZXcgSVBESVRocmVhZFswXTsKLQkJSVBESVRocmVhZCBjdXJyZW50UERJVGhyZWFkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBkaVRocmVhZHMgPSAoSVBESVRocmVhZFtdKSBnZXRQRElUYXJnZXQoKS5nZXRUaHJlYWRzKCk7Ci0JCQljdXJyZW50UERJVGhyZWFkID0gKElQRElUaHJlYWQpIGdldFBESVRhcmdldCgpLmdldEN1cnJlbnRUaHJlYWQoKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBkaVRocmVhZHMubGVuZ3RoOyArK2kpIHsKLQkJCVBUaHJlYWQgdGhyZWFkID0gZmluZFRocmVhZChvbGRMaXN0LCBwZGlUaHJlYWRzW2ldKTsKLQkJCWlmICh0aHJlYWQgPT0gbnVsbCkgewotCQkJCXRocmVhZCA9IG5ldyBQVGhyZWFkKHRoaXMsIHBkaVRocmVhZHNbaV0pOwotCQkJCW5ld1RocmVhZHMuYWRkKHRocmVhZCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZExpc3QucmVtb3ZlKHRocmVhZCk7Ci0JCQl9Ci0JCQl0aHJlYWQuc2V0Q3VycmVudChwZGlUaHJlYWRzW2ldLmVxdWFscyhjdXJyZW50UERJVGhyZWFkKSk7Ci0JCQlsaXN0LmFkZCh0aHJlYWQpOwotCQl9Ci0JCUl0ZXJhdG9yPElUaHJlYWQ+IGl0ID0gb2xkTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQVGhyZWFkIHRocmVhZCA9IChQVGhyZWFkKSBpdC5uZXh0KCk7Ci0JCQl0aHJlYWQudGVybWluYXRlZCgpOwotCQkJZGVidWdFdmVudHMuYWRkKHRocmVhZC5jcmVhdGVUZXJtaW5hdGVFdmVudCgpKTsKLQkJfQotCQlzZXRUaHJlYWRMaXN0KGxpc3QpOwotCQlpdCA9IG5ld1RocmVhZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZGVidWdFdmVudHMuYWRkKCgoUFRocmVhZCkgaXQubmV4dCgpKS5jcmVhdGVDcmVhdGVFdmVudCgpKTsKLQkJfQotCQlpZiAoZGVidWdFdmVudHMuc2l6ZSgpID4gMCkKLQkJCWZpcmVFdmVudFNldCgoRGVidWdFdmVudFtdKSBkZWJ1Z0V2ZW50cy50b0FycmF5KG5ldyBEZWJ1Z0V2ZW50W2RlYnVnRXZlbnRzLnNpemUoKV0pKTsKLQkJcmV0dXJuIG5ld1RocmVhZHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsRXhwcmVzc2lvbnMoKSB7Ci0JCUlFeHByZXNzaW9uTWFuYWdlciBlbSA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRFeHByZXNzaW9uTWFuYWdlcigpOwotCQlJRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zID0gZW0uZ2V0RXhwcmVzc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGV4cHJlc3Npb25zW2ldIGluc3RhbmNlb2YgUEV4cHJlc3Npb24gJiYgZXhwcmVzc2lvbnNbaV0uZ2V0RGVidWdUYXJnZXQoKS5lcXVhbHModGhpcykpIHsKLQkJCQllbS5yZW1vdmVFeHByZXNzaW9uKGV4cHJlc3Npb25zW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbFRocmVhZHMoKSB7Ci0JCUxpc3Q8SVRocmVhZD4gdGhyZWFkcyA9IGdldFRocmVhZExpc3QoKTsKLQkJc2V0VGhyZWFkTGlzdChuZXcgQXJyYXlMaXN0PElUaHJlYWQ+KDApKTsKLQkJQXJyYXlMaXN0PERlYnVnRXZlbnQ+IGRlYnVnRXZlbnRzID0gbmV3IEFycmF5TGlzdDxEZWJ1Z0V2ZW50Pih0aHJlYWRzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yPElUaHJlYWQ+IGl0ID0gdGhyZWFkcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQVGhyZWFkIHRocmVhZCA9IChQVGhyZWFkKSBpdC5uZXh0KCk7Ci0JCQl0aHJlYWQudGVybWluYXRlZCgpOwotCQkJZGVidWdFdmVudHMuYWRkKHRocmVhZC5jcmVhdGVUZXJtaW5hdGVFdmVudCgpKTsKLQkJfQotCQlmaXJlRXZlbnRTZXQoKERlYnVnRXZlbnRbXSkgZGVidWdFdmVudHMudG9BcnJheShuZXcgRGVidWdFdmVudFtkZWJ1Z0V2ZW50cy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZU9sZFN0YXRlKCkgewotCQlyZXN0b3JlU3RhdGUoKTsKLQkJSXRlcmF0b3I8SVRocmVhZD4gaXQgPSBnZXRUaHJlYWRMaXN0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChQVGhyZWFkKSBpdC5uZXh0KCkpLnJlc3RvcmVTdGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlYnVnRXZlbnRzCi0JICogQHBhcmFtIGRldGFpbAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZXN1bWVUaHJlYWRzKExpc3Q8RGVidWdFdmVudD4gZGVidWdFdmVudHMsIGludCBkZXRhaWwpIHsKLQkJSVRocmVhZFtdIHRocmVhZHMgPSBnZXRUaHJlYWRMaXN0KCkudG9BcnJheShuZXcgSVRocmVhZFswXSk7Ci0JCWZvciAoSVRocmVhZCB0aHJlYWQgOiB0aHJlYWRzKSB7Ci0JCQkoKFBUaHJlYWQpIHRocmVhZCkucmVzdW1lZEJ5VGFyZ2V0KGRldGFpbCwgZGVidWdFdmVudHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1lbW9yeUJsb2NrcygpIHsKLQkJZlNlc3Npb24uZ2V0TWVtb3J5TWFuYWdlcigpLnNhdmUoZ2V0VGFza3MoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3VzcGVuZFRocmVhZHMoSVBESVN1c3BlbmRlZEV2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhdG9yPElUaHJlYWQ+IGl0ID0gZ2V0VGhyZWFkTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVBUaHJlYWQgdGhyZWFkID0gKFBUaHJlYWQpIGl0Lm5leHQoKTsKLQkJCUlQRElUaHJlYWQgc3VzcGVuc2lvblRocmVhZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN1c3BlbnNpb25UaHJlYWQgPSAoSVBESVRocmVhZCkgZ2V0UERJVGFyZ2V0KCkuZ2V0Q3VycmVudFRocmVhZCgpOwotCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXRocmVhZC5zdXNwZW5kQnlUYXJnZXQoZXZlbnQuZ2V0UmVhc29uKCksIHN1c3BlbnNpb25UaHJlYWQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BEdW1teVN0YWNrRnJhbWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QRHVtbXlTdGFja0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjMzM2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BEdW1teVN0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVJlZ2lzdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUER1bW15U3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFRocmVhZDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZHVtbXkgc3RhY2sgZnJhbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQRHVtbXlTdGFja0ZyYW1lIGV4dGVuZHMgUERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElTdGFja0ZyYW1lLCBJUER1bW15U3RhY2tGcmFtZSB7Ci0JcHJpdmF0ZSBQVGhyZWFkIGZUaHJlYWQ7Ci0KLQlwdWJsaWMgUER1bW15U3RhY2tGcmFtZShQVGhyZWFkIHRocmVhZCkgewotCQlzdXBlcih0aHJlYWQuZ2V0U2Vzc2lvbigpLCB0aHJlYWQuZ2V0VGFza3MoKSk7Ci0JCXNldFRocmVhZCh0aHJlYWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjY2FuUmVzdW1lKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBJbnRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwSW50bygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjY2FuU3RlcE92ZXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblN0ZXBPdmVyKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNjYW5TdGVwUmV0dXJuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwUmV0dXJuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNjYW5TdXNwZW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXNwZW5kKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI2NhblRlcm1pbmF0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVBEdW1teVN0YWNrRnJhbWUuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJU3RhY2tGcmFtZS5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXRDaGFyRW5kKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoYXJFbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldENoYXJTdGFydCgpCi0JICovCi0JcHVibGljIGludCBnZXRDaGFyU3RhcnQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QRGVidWdFbGVtZW50I2dldERlYnVnVGFyZ2V0KCkKLQkgKi8KLQlwdWJsaWMgUERlYnVnVGFyZ2V0IGdldERlYnVnVGFyZ2V0KCkgewotCQlyZXR1cm4gZlRocmVhZC5nZXREZWJ1Z1RhcmdldCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0TGluZU51bWJlcigpCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gIi4uLiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXRSZWdpc3Rlckdyb3VwcygpCi0JICovCi0JcHVibGljIElSZWdpc3Rlckdyb3VwW10gZ2V0UmVnaXN0ZXJHcm91cHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElSZWdpc3Rlckdyb3VwWzBdOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0VGhyZWFkKCkKLQkgKi8KLQlwdWJsaWMgSVBUaHJlYWQgZ2V0VGhyZWFkKCkgewotCQlyZXR1cm4gZlRocmVhZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldFZhcmlhYmxlcygpCi0JICovCi0JcHVibGljIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSVZhcmlhYmxlWzBdOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjaGFzUmVnaXN0ZXJHcm91cHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZ2lzdGVyR3JvdXBzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjaGFzVmFyaWFibGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNpc1N0ZXBwaW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0ZXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNpc1N1c3BlbmRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjaXNUZXJtaW5hdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI3Jlc3VtZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI3N0ZXBJbnRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNzdGVwT3ZlcigpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcE92ZXIoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjc3RlcFJldHVybigpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcFJldHVybigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNzdXNwZW5kKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXNwZW5kKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjdGVybWluYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUaHJlYWQoUFRocmVhZCB0aHJlYWQpIHsKLQkJZlRocmVhZCA9IHRocmVhZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUEV4cHJlc3Npb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhjM2Q2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUERlYnVnQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5QVmFyaWFibGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVJlc3VtZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVZhcmlhYmxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZUFycmF5OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUEV4cHJlc3Npb24gZXh0ZW5kcyBQTG9jYWxWYXJpYWJsZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uIHsKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIElQRElUYXJnZXRFeHByZXNzaW9uIGZQRElFeHByZXNzaW9uOwotCXByaXZhdGUgUFN0YWNrRnJhbWUgZlN0YWNrRnJhbWU7Ci0JcHJpdmF0ZSBJUFZhbHVlIGZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuTlVMTF9WQUxVRTsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBmcmFtZQotCSAqIEBwYXJhbSBjZGlFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhck9iamVjdAotCSAqLwotCXB1YmxpYyBQRXhwcmVzc2lvbihQU3RhY2tGcmFtZSBmcmFtZSwgSVBESVRhcmdldEV4cHJlc3Npb24gcGRpRXhwcmVzc2lvbiwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB2YXJPYmplY3QpIHsKLQkJc3VwZXIoZnJhbWUsIHZhck9iamVjdCk7Ci0JCXNldEZvcm1hdChQVmFyaWFibGVGb3JtYXQuZ2V0Rm9ybWF0KFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX0RFRkFVTFRfRVhQUkVTU0lPTl9GT1JNQVQpKSk7Ci0JCWZUZXh0ID0gcGRpRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uVGV4dCgpOwotCQlmUERJRXhwcmVzc2lvbiA9IHBkaUV4cHJlc3Npb247Ci0JCWZTdGFja0ZyYW1lID0gZnJhbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0JcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoSVBESUV2ZW50W10gZXZlbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUERJRXZlbnQgZXZlbnQgPSBldmVudHNbaV07Ci0JCQlpZiAoIWV2ZW50LmNvbnRhaW5zKGdldFRhc2tzKCkpKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJUmVzdW1lZEV2ZW50KSB7Ci0JCQkJc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCQkJcmVzZXRWYWx1ZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gKChJUERJQ2hhbmdlZEV2ZW50KWV2ZW50KS5nZXRSZWFzb24oKTsKLQkJCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVZhcmlhYmxlSW5mbykgewotCQkJCQlzZXRDaGFuZ2VkKGZhbHNlKTsKLQkJCQkJcmVzZXRWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVEZWJ1Z0V2ZW50cyhldmVudHMpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVEaXNhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCb29ra2VlcGluZ0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIElQVmFsdWUgZ2V0VmFsdWUoKSB7Ci0JCVBTdGFja0ZyYW1lIGZyYW1lID0gKFBTdGFja0ZyYW1lKSBnZXRTdGFja0ZyYW1lKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoZnJhbWUpOwotCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgSVBWYWx1ZSBnZXRWYWx1ZShQU3RhY2tGcmFtZSBmcmFtZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGZWYWx1ZS5lcXVhbHMoUFZhbHVlRmFjdG9yeS5OVUxMX1ZBTFVFKSkgewotCQkJaWYgKGZyYW1lLmlzU3VzcGVuZGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlJUERJVmFyaWFibGUgdmFyaWFibGUgPSBmUERJRXhwcmVzc2lvbi5nZXRWYXJpYWJsZShmcmFtZS5nZXRQRElTdGFja0ZyYW1lKCkpOwotCQkJCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgewotCQkJCQkJSUFJRiBhaWYgPSB2YXJpYWJsZS5nZXRBSUYoKTsKLQkJCQkJCWlmIChhaWYgIT0gbnVsbCAmJiBhaWYuZ2V0VHlwZSgpIGluc3RhbmNlb2YgSUFJRlR5cGVBcnJheSkgewotCQkJCQkJCWludFtdIGRpbXMgPSAoKElBSUZUeXBlQXJyYXkpYWlmLmdldFR5cGUoKSkuZ2V0RGltZW5zaW9uRGV0YWlscygpOwotCQkJCQkJCWlmIChkaW1zLmxlbmd0aCA+IDAgJiYgZGltc1swXSA+IDApCi0JCQkJCQkJCWZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuY3JlYXRlSW5kZXhlZFZhbHVlKHRoaXMsIHZhcmlhYmxlLCAwLCBkaW1zWzBdKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUodGhpcywgdmFyaWFibGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCXByb3RlY3RlZCBJUFN0YWNrRnJhbWUgZ2V0U3RhY2tGcmFtZSgpIHsKLQkJcmV0dXJuIGZTdGFja0ZyYW1lOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFZhbHVlKCkgewotCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCSgoQWJzdHJhY3RQVmFsdWUpIGZWYWx1ZSkucmVzZXQoKTsKLQkJfSAKLQkJZlZhbHVlID0gUFZhbHVlRmFjdG9yeS5OVUxMX1ZBTFVFOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvblRleHQoKTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZQRElFeHByZXNzaW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZlBESUV4cHJlc3Npb24uZGlzcG9zZSgpOwotCQkJCWZQRElFeHByZXNzaW9uID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZWYWx1ZSBpbnN0YW5jZW9mIEFic3RyYWN0UFZhbHVlKSB7Ci0JCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLmRpc3Bvc2UoKTsKLQkJCWZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuTlVMTF9WQUxVRTsKLQkJfQotCQlpbnRlcm5hbERpc3Bvc2UodHJ1ZSk7Ci0JCXNldERpc3Bvc2VkKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QRmxvYXRpbmdQb2ludFZhbHVlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUEZsb2F0aW5nUG9pbnRWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjM4ZDExLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QRmxvYXRpbmdQb2ludFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVGbG9hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUZsb2F0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBDSFUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUEZsb2F0aW5nUG9pbnRWYWx1ZSBleHRlbmRzIFBWYWx1ZSB7Ci0JcHJpdmF0ZSBOdW1iZXIgZkZsb2F0aW5nUG9pbnRWYWx1ZTsKLQotCXB1YmxpYyBQRmxvYXRpbmdQb2ludFZhbHVlKFBWYXJpYWJsZSBwYXJlbnQsIElQRElWYXJpYWJsZSB2YXJpYWJsZSkgewotCQlzdXBlcihwYXJlbnQsIHZhcmlhYmxlKTsKLQl9Ci0JcHVibGljIE51bWJlciBnZXRGbG9hdGluZ1BvaW50VmFsdWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24sIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmIChmRmxvYXRpbmdQb2ludFZhbHVlID09IG51bGwpIHsKLQkJCUlBSUYgYWlmID0gZ2V0QUlGKCk7Ci0JCQlpZiAoYWlmICE9IG51bGwpIHsKLQkJCQlpZiAoYWlmLmdldFR5cGUoKSBpbnN0YW5jZW9mIElBSUZUeXBlRmxvYXQpIHsKLQkJCQkJSUFJRlZhbHVlRmxvYXQgZmxvYXRWYWx1ZSA9IChJQUlGVmFsdWVGbG9hdClhaWYuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGZsb2F0VmFsdWUuaXNEb3VibGUoKSkgewotCQkJCQkJZkZsb2F0aW5nUG9pbnRWYWx1ZSA9IG5ldyBEb3VibGUoZmxvYXRWYWx1ZS5kb3VibGVWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChmbG9hdFZhbHVlLmlzRmxvYXQoKSkgewotCQkJCQkJZkZsb2F0aW5nUG9pbnRWYWx1ZSA9IG5ldyBGbG9hdChmbG9hdFZhbHVlLmZsb2F0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0YXJnZXRSZXF1ZXN0RmFpbGVkKCJVbmtub3duIGZsb2F0aW5nIHBvaW50IHZhbHVlIiwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZGbG9hdGluZ1BvaW50VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BHbG9iYWxWYWx1ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BHbG9iYWxWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YwZmM1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QR2xvYmFsVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLQotcHVibGljIGNsYXNzIFBHbG9iYWxWYWx1ZSBleHRlbmRzIFBWYWx1ZSB7Ci0JcHJpdmF0ZSBCb29sZWFuIGZIYXNDaGlsZHJlbiA9IG51bGw7Ci0KLQlwdWJsaWMgUEdsb2JhbFZhbHVlKFBWYXJpYWJsZSBwYXJlbnQsIElQRElWYXJpYWJsZSB2YXJpYWJsZSkgewotCQlzdXBlcihwYXJlbnQsIHZhcmlhYmxlKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaGFzVmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGZIYXNDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlmSGFzQ2hpbGRyZW4gPSBuZXcgQm9vbGVhbihzdXBlci5oYXNWYXJpYWJsZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGZIYXNDaGlsZHJlbi5ib29sZWFuVmFsdWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUEdsb2JhbFZhcmlhYmxlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUEdsb2JhbFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWQ2OGEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BHbG9iYWxWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBHbG9iYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVJlc3VtZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUFyZ3VtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQXJyYXk7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQR2xvYmFsVmFyaWFibGUgZXh0ZW5kcyBQVmFyaWFibGUgaW1wbGVtZW50cyBJUEdsb2JhbFZhcmlhYmxlIHsKLQlwcml2YXRlIGNsYXNzIEludGVybmFsVmFyaWFibGUgaW1wbGVtZW50cyBJSW50ZXJuYWxWYXJpYWJsZSB7Ci0JCXByaXZhdGUgUFZhcmlhYmxlIGZWYXJpYWJsZTsKLQkJcHJpdmF0ZSBJUERJVmFyaWFibGVEZXNjcmlwdG9yIGZQRElWYXJpYWJsZU9iamVjdDsKLQkJcHJpdmF0ZSBJUERJVmFyaWFibGUgZlBESVZhcmlhYmxlOwotCQlwcml2YXRlIFN0cmluZyBmUXVhbGlmaWVkTmFtZTsKLQkJcHJpdmF0ZSBJUFZhbHVlIGZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuTlVMTF9WQUxVRTsKLQkJcHJpdmF0ZSBib29sZWFuIGZDaGFuZ2VkID0gZmFsc2U7Ci0KLQkJSW50ZXJuYWxWYXJpYWJsZShQVmFyaWFibGUgdmFyLCBJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZhck9iamVjdCkgewotCQkJc2V0VmFyaWFibGUodmFyKTsKLQkJCXNldFBESVZhcmlhYmxlT2JqZWN0KHZhck9iamVjdCk7Ci0JCQlzZXRQRElWYXJpYWJsZSgodmFyT2JqZWN0IGluc3RhbmNlb2YgSVBESVZhcmlhYmxlKSA/IChJUERJVmFyaWFibGUpIHZhck9iamVjdCA6IG51bGwpOwotCQl9Ci0JCXB1YmxpYyBJSW50ZXJuYWxWYXJpYWJsZSBjcmVhdGVTaGFkb3coaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpdiA9IG5ldyBJbnRlcm5hbFZhcmlhYmxlKGdldFZhcmlhYmxlKCksIGdldFBESVZhcmlhYmxlT2JqZWN0KCkuZ2V0VmFyaWFibGVEZXNjcmlwdG9yQXNBcnJheShzdGFydCwgbGVuZ3RoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBpdjsKLQkJfQotCQlwdWJsaWMgSUludGVybmFsVmFyaWFibGUgY3JlYXRlU2hhZG93KFN0cmluZyB0eXBlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpdiA9IG5ldyBJbnRlcm5hbFZhcmlhYmxlKGdldFZhcmlhYmxlKCksIGdldFBESVZhcmlhYmxlT2JqZWN0KCkuZ2V0VmFyaWFibGVEZXNjcmlwdG9yQXNUeXBlKHR5cGUpKTsKLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaXY7Ci0JCX0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSVBESVZhcmlhYmxlIGdldFBESVZhcmlhYmxlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJCWlmIChmUERJVmFyaWFibGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZQRElWYXJpYWJsZSA9IGdldFBESVRhcmdldCgpLmNyZWF0ZUdsb2JhbFZhcmlhYmxlKChJUERJR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKSBnZXRQRElWYXJpYWJsZU9iamVjdCgpKTsKLQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlBESVZhcmlhYmxlOwotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRQRElWYXJpYWJsZShJUERJVmFyaWFibGUgdmFyaWFibGUpIHsKLQkJCWZQRElWYXJpYWJsZSA9IHZhcmlhYmxlOwotCQl9Ci0JCXByaXZhdGUgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBnZXRQRElWYXJpYWJsZU9iamVjdCgpIHsKLQkJCWlmIChmUERJVmFyaWFibGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmUERJVmFyaWFibGU7Ci0JCQl9Ci0JCQlyZXR1cm4gZlBESVZhcmlhYmxlT2JqZWN0OwotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRQRElWYXJpYWJsZU9iamVjdChJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZhcmlhYmxlT2JqZWN0KSB7Ci0JCQlmUERJVmFyaWFibGVPYmplY3QgPSB2YXJpYWJsZU9iamVjdDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJaWYgKGZRdWFsaWZpZWROYW1lID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmUXVhbGlmaWVkTmFtZSA9IChmUERJVmFyaWFibGVPYmplY3QgIT0gbnVsbCkgPyBmUERJVmFyaWFibGVPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpIDogbnVsbDsKLQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlF1YWxpZmllZE5hbWU7Ci0JCX0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbnZhbGlkYXRlKGJvb2xlYW4gZGVzdHJveSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGVzdHJveSAmJiBmUERJVmFyaWFibGUgIT0gbnVsbCkKLQkJCQkJZlBESVZhcmlhYmxlLmRpc3Bvc2UoKTsKLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJaW52YWxpZGF0ZVZhbHVlKCk7Ci0JCQlzZXRQRElWYXJpYWJsZShudWxsKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKGJvb2xlYW4gZGVzdHJveSkgewotCQkJaW52YWxpZGF0ZShkZXN0cm95KTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVWYXJpYWJsZShJUERJVmFyaWFibGUgcGRpVmFyKSB7Ci0JCQlyZXR1cm4gKGZQRElWYXJpYWJsZSAhPSBudWxsKSA/IGZQRElWYXJpYWJsZS5lcXVhbHMocGRpVmFyKSA6IGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBpbnQgc2l6ZW9mKCkgewotCQkJaWYgKGdldFBESVZhcmlhYmxlT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLnNpemVvZigpOwotCQkJCX0KLQkJCQljYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0FyZ3VtZW50KCkgewotCQkJcmV0dXJuIChnZXRQRElWYXJpYWJsZU9iamVjdCgpIGluc3RhbmNlb2YgSVBESUFyZ3VtZW50RGVzY3JpcHRvcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlJUERJVmFyaWFibGUgcGRpVmFyaWFibGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwZGlWYXJpYWJsZSA9IGdldFBESVZhcmlhYmxlKCk7Ci0JCQkJaWYgKHBkaVZhcmlhYmxlICE9IG51bGwpCi0JCQkJCXBkaVZhcmlhYmxlLnNldFZhbHVlKGV4cHJlc3Npb24pOwotCQkJCWVsc2UKLQkJCQkJcmVxdWVzdEZhaWxlZChDb3JlTW9kZWxNZXNzYWdlcy5nZXRTdHJpbmcoIlBNb2RpZmljYXRpb25WYXJpYWJsZS4wIiksIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCBJUFZhbHVlIGdldFZhbHVlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJCWlmIChmVmFsdWUuZXF1YWxzKFBWYWx1ZUZhY3RvcnkuTlVMTF9WQUxVRSkpIHsKLQkJCQlJUERJVmFyaWFibGUgdmFyID0gZ2V0UERJVmFyaWFibGUoKTsKLQkJCQlpZiAodmFyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlBSUYgYWlmID0gdmFyLmdldEFJRigpOwotCQkJCQkJaWYgKGFpZiAhPSBudWxsICYmIGFpZi5nZXRUeXBlKCkgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQkJCQkJaW50W10gZGltcyA9ICgoSUFJRlR5cGVBcnJheSlhaWYuZ2V0VHlwZSgpKS5nZXREaW1lbnNpb25EZXRhaWxzKCk7Ci0JCQkJCQkJaWYgKGRpbXMubGVuZ3RoID4gMCAmJiBkaW1zWzBdID4gMCkKLQkJCQkJCQkJZlZhbHVlID0gUFZhbHVlRmFjdG9yeS5jcmVhdGVJbmRleGVkVmFsdWUoZ2V0VmFyaWFibGUoKSwgdmFyLCAwLCBkaW1zWzBdKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUoZ2V0VmFyaWFibGUoKSwgdmFyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZWYWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnZhbGlkYXRlVmFsdWUoKSB7Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLmRpc3Bvc2UoKTsKLQkJCQlmVmFsdWUgPSBQVmFsdWVGYWN0b3J5Lk5VTExfVkFMVUU7Ci0JCQkJaWYgKGZQRElWYXJpYWJsZSAhPSBudWxsKQotCQkJCQlmUERJVmFyaWFibGUucmVzZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlZCgpIHsKLQkJCXJldHVybiBmQ2hhbmdlZDsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2hhbmdlZChib29sZWFuIGNoYW5nZWQpIHsKLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJaW52YWxpZGF0ZVZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLnNldENoYW5nZWQoY2hhbmdlZCk7Ci0JCQl9Ci0JCQlmQ2hhbmdlZCA9IGNoYW5nZWQ7Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHByZXNlcnZlKCkgewotCQkJc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLnByZXNlcnZlKCk7Ci0JCQl9Ci0JCX0KLQkJUFZhcmlhYmxlIGdldFZhcmlhYmxlKCkgewotCQkJcmV0dXJuIGZWYXJpYWJsZTsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0VmFyaWFibGUoUFZhcmlhYmxlIHZhcmlhYmxlKSB7Ci0JCQlmVmFyaWFibGUgPSB2YXJpYWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXNldFZhbHVlKCkgewotCQkJaWYgKGZWYWx1ZSBpbnN0YW5jZW9mIEFic3RyYWN0UFZhbHVlKSB7Ci0JCQkJKChBYnN0cmFjdFBWYWx1ZSkgZlZhbHVlKS5yZXNldCgpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSVBESVZhcmlhYmxlIHZhciA9IGdldFBESVZhcmlhYmxlKCk7Ci0JCQlpZiAodmFyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gdmFyLmlzRWRpdGFibGUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSW50ZXJuYWxWYXJpYWJsZSkgewotCQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLmVxdWFscygoKEludGVybmFsVmFyaWFibGUpIG9iaikuZ2V0UERJVmFyaWFibGVPYmplY3QoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNTYW1lRGVzY3JpcHRvcihJUERJVmFyaWFibGVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLmVxdWFscyhkZXNjKTsKLQkJfQotCX0KLQlwcml2YXRlIElQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGZEZXNjcmlwdG9yOwotCi0JcHJvdGVjdGVkIFBHbG9iYWxWYXJpYWJsZShQRGVidWdFbGVtZW50IHBhcmVudCwgSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBwZGlWYXJpYWJsZU9iamVjdCkgewotCQlzdXBlcihwYXJlbnQsIHBkaVZhcmlhYmxlT2JqZWN0KTsKLQkJZkRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLQlwcm90ZWN0ZWQgUEdsb2JhbFZhcmlhYmxlKFBEZWJ1Z0VsZW1lbnQgcGFyZW50LCBJUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJUERJVmFyaWFibGVEZXNjcmlwdG9yIHBkaVZhcmlhYmxlT2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnQsIHBkaVZhcmlhYmxlT2JqZWN0LCBtZXNzYWdlKTsKLQkJZkRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVEaXNhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoSVBESUV2ZW50W10gZXZlbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUERJRXZlbnQgZXZlbnQgPSBldmVudHNbaV07Ci0JCQlpZiAoIWV2ZW50LmNvbnRhaW5zKGdldFRhc2tzKCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJUmVzdW1lZEV2ZW50KSB7Ci0JCQkJc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlRGVidWdFdmVudHMoZXZlbnRzKTsKLQl9Ci0JcHVibGljIElQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRvcjsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW50ZXJuYWxEaXNwb3NlKHRydWUpOwotCQlzZXREaXNwb3NlZCh0cnVlKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JpZ2luYWwoSVBESVZhcmlhYmxlRGVzY3JpcHRvciB2bykgewotCQlpZiAodm8gIT0gbnVsbCkgewotCQkJc2V0TmFtZSh2by5nZXROYW1lKCkpOwotCQkJc2V0T3JpZ2luYWwobmV3IEludGVybmFsVmFyaWFibGUodGhpcywgdm8pKTsKLQkJfQotCX0KLQlwdWJsaWMgSUFJRiBnZXRBSUYoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFsdWUoKS5nZXRBSUYoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUEluZGV4ZWRWYWx1ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BJbmRleGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4NTU2My4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUEluZGV4ZWRWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JSW5kZXhlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQSW5kZXhlZFZhbHVlIGV4dGVuZHMgQWJzdHJhY3RQVmFsdWUgaW1wbGVtZW50cyBJSW5kZXhlZFZhbHVlIHsKLQlwcml2YXRlIElQRElWYXJpYWJsZSBwZGlWYXJpYWJsZTsKLQlwcml2YXRlIElWYXJpYWJsZVtdIGZWYXJpYWJsZXM7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQlwcml2YXRlIGludCBmU2l6ZTsKLQotCXB1YmxpYyBQSW5kZXhlZFZhbHVlKEFic3RyYWN0UFZhcmlhYmxlIHBhcmVudCwgSVBESVZhcmlhYmxlIHZhcmlhYmxlLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQlmVmFyaWFibGVzID0gbmV3IElWYXJpYWJsZVtzaXplXTsKLQkJcGRpVmFyaWFibGUgPSB2YXJpYWJsZTsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNpemUgPSBzaXplOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDaGFuZ2VkKGJvb2xlYW4gY2hhbmdlZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChmVmFyaWFibGVzW2ldICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0UFZhcmlhYmxlKSBmVmFyaWFibGVzW2ldKS5zZXRDaGFuZ2VkKGNoYW5nZWQpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlZhcmlhYmxlcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGZWYXJpYWJsZXNbaV0gIT0gbnVsbCkgewotCQkJCSgoQWJzdHJhY3RQVmFyaWFibGUpIGZWYXJpYWJsZXNbaV0pLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVmFyaWFibGVzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoZlZhcmlhYmxlc1tpXSAhPSBudWxsKSB7Ci0JCQkJKChBYnN0cmFjdFBWYXJpYWJsZSkgZlZhcmlhYmxlc1tpXSkucmVzZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHByZXNlcnZlKCkgewotCQlyZXNldFN0YXR1cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChmVmFyaWFibGVzW2ldICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0UFZhcmlhYmxlKSBmVmFyaWFibGVzW2ldKS5wcmVzZXJ2ZSgpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBJQUlGIGdldEFJRigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGRpVmFyaWFibGUuZ2V0QUlGKCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0YXJnZXRSZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0QUlGKCkuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gIlsiICsgZk9mZnNldCArICIgLSAiICsgZlNpemUgKyAiXSI7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQWxsb2NhdGVkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBJVmFyaWFibGVbXSBnZXRWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFyaWFibGVzMChnZXRJbml0aWFsT2Zmc2V0KCksIGdldFNpemUoKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc1ZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRTaXplKCkgPiAwOwotCX0KLQlwdWJsaWMgSVZhcmlhYmxlIGdldFZhcmlhYmxlKGludCBvZmZzZXQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChvZmZzZXQgPj0gZ2V0U2l6ZSgpKSB7Ci0JCQlyZXF1ZXN0RmFpbGVkKENvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiUEluZGV4ZWRWYWx1ZS4wIiksIG51bGwpOwotCQl9Ci0JCXJldHVybiBnZXRWYXJpYWJsZXMwKG9mZnNldCwgMSlbMF07Ci0JfQotCXB1YmxpYyBJVmFyaWFibGVbXSBnZXRWYXJpYWJsZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKG9mZnNldCA+PSBnZXRTaXplKCkpIHsKLQkJCXJlcXVlc3RGYWlsZWQoQ29yZU1vZGVsTWVzc2FnZXMuZ2V0U3RyaW5nKCJQSW5kZXhlZFZhbHVlLjEiKSwgbnVsbCk7Ci0JCX0KLQkJaWYgKChvZmZzZXQgKyBsZW5ndGggLSAxKSA+PSBnZXRTaXplKCkpIHsKLQkJCXJlcXVlc3RGYWlsZWQoQ29yZU1vZGVsTWVzc2FnZXMuZ2V0U3RyaW5nKCJQSW5kZXhlZFZhbHVlLjIiKSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGdldFZhcmlhYmxlczAob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0U2l6ZTAoKTsKLQl9Ci0JcHVibGljIGludCBnZXRJbml0aWFsT2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldDsKLQl9Ci0JcHJpdmF0ZSBpbnQgZ2V0UGFydGl0aW9uU2l6ZShpbnQgaW5kZXgpIHsKLQkJaW50IHBzaXplID0gZ2V0UHJlZmVycmVkUGFydGl0aW9uU2l6ZSgpOwotCQlpbnQgc2l6ZSA9IGdldFNpemUwKCk7Ci0JCWludCBwY291bnQgPSBzaXplIC8gcHNpemUgKyAxOwotCQlpZiAocGNvdW50IC0gMSA8IGluZGV4KQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAocGNvdW50IC0gMSA9PSBpbmRleCkgPyBzaXplICUgcHNpemUgOiBwc2l6ZTsKLQl9Ci0JcHJpdmF0ZSBpbnQgZ2V0UGFydGl0aW9uSW5kZXgoaW50IG9mZnNldCkgewotCQlyZXR1cm4gb2Zmc2V0IC8gZ2V0UHJlZmVycmVkUGFydGl0aW9uU2l6ZSgpOwotCX0KLQlwcml2YXRlIGludCBnZXRQcmVmZXJyZWRQYXJ0aXRpb25TaXplKCkgewotCQlyZXR1cm4gMTAwOwotCX0KLQlwcml2YXRlIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlczAoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJSVZhcmlhYmxlW10gcmVzdWx0ID0gbmV3IElWYXJpYWJsZVtsZW5ndGhdOwotCQlpbnQgZmlyc3RJbmRleCA9IGdldFBhcnRpdGlvbkluZGV4KG9mZnNldCk7Ci0JCWludCBsYXN0SW5kZXggPSBnZXRQYXJ0aXRpb25JbmRleChvZmZzZXQgKyBNYXRoLm1heChsZW5ndGggLSAxLCAwKSk7Ci0JCWZvciAoaW50IGkgPSBmaXJzdEluZGV4OyBpIDw9IGxhc3RJbmRleDsgKytpKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoIWlzUGFydGl0aW9uTG9hZGVkKGkpKSB7Ci0JCQkJCWxvYWRQYXJ0aXRpb24oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoZlZhcmlhYmxlcywgb2Zmc2V0LCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRpdGlvbkxvYWRlZChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGZWYXJpYWJsZXNbaW5kZXggKiBnZXRQcmVmZXJyZWRQYXJ0aXRpb25TaXplKCldICE9IG51bGw7Ci0JfQotCXByaXZhdGUgdm9pZCBsb2FkUGFydGl0aW9uKGludCBpbmRleCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaW50IHByZWZTaXplID0gZ2V0UHJlZmVycmVkUGFydGl0aW9uU2l6ZSgpOwotCQlpbnQgcHNpemUgPSBnZXRQYXJ0aXRpb25TaXplKGluZGV4KTsKLQkJaW50IGZpbmRleCA9IGluZGV4ICogcHJlZlNpemU7Ci0JCUlQRElWYXJpYWJsZVtdIHBkaVZhcnMgPSBuZXcgSVBESVZhcmlhYmxlWzBdOwotCQl0cnkgewotCQkJcGRpVmFycyA9IHBkaVZhcmlhYmxlLmdldENoaWxkcmVuKGZpbmRleCwgcHNpemUpOwotCQl9Ci0JCWNhdGNoKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJfQotCQlmb3IoIGludCBpPTA7IGk8cGRpVmFycy5sZW5ndGg7ICsraSkgewotCQkJZlZhcmlhYmxlc1tpICsgZmluZGV4XSA9IFBWYXJpYWJsZUZhY3RvcnkuY3JlYXRlTG9jYWxWYXJpYWJsZSh0aGlzLCBwZGlWYXJzW2ldKTsKLQkJfQotCX0KLQlwcml2YXRlIGludCBnZXRTaXplMCgpIHsKLQkJcmV0dXJuIGZTaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QTG9jYWxWYXJpYWJsZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BMb2NhbFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjk0ZjEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BMb2NhbFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBcmd1bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElMb2NhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQXJyYXk7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFBMb2NhbFZhcmlhYmxlIGV4dGVuZHMgUFZhcmlhYmxlIHsKLQlwcml2YXRlIGNsYXNzIEludGVybmFsVmFyaWFibGUgaW1wbGVtZW50cyBJSW50ZXJuYWxWYXJpYWJsZSB7Ci0JCXByaXZhdGUgUFZhcmlhYmxlIGZWYXJpYWJsZTsKLQkJcHJpdmF0ZSBJUERJVmFyaWFibGVEZXNjcmlwdG9yIGZQRElWYXJpYWJsZU9iamVjdDsKLQkJcHJpdmF0ZSBJUERJVmFyaWFibGUgZlBESVZhcmlhYmxlOwotCQlwcml2YXRlIFN0cmluZyBmUXVhbGlmaWVkTmFtZTsKLQkJcHJpdmF0ZSBJUFZhbHVlIGZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuTlVMTF9WQUxVRTsKLQkJcHJpdmF0ZSBib29sZWFuIGZDaGFuZ2VkID0gZmFsc2U7Ci0JCQotCQlJbnRlcm5hbFZhcmlhYmxlKFBWYXJpYWJsZSB2YXIsIElQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyT2JqZWN0KSB7Ci0JCQlzZXRWYXJpYWJsZSh2YXIpOwotCQkJc2V0UERJVmFyaWFibGVPYmplY3QodmFyT2JqZWN0KTsKLQkJCXNldFBESVZhcmlhYmxlKCh2YXJPYmplY3QgaW5zdGFuY2VvZiBJUERJVmFyaWFibGUpID8gKElQRElWYXJpYWJsZSkgdmFyT2JqZWN0IDogbnVsbCk7Ci0JCX0KLQkJcHVibGljIElJbnRlcm5hbFZhcmlhYmxlIGNyZWF0ZVNoYWRvdyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWl2ID0gbmV3IEludGVybmFsVmFyaWFibGUoZ2V0VmFyaWFibGUoKSwgZ2V0UERJVmFyaWFibGVPYmplY3QoKS5nZXRWYXJpYWJsZURlc2NyaXB0b3JBc0FycmF5KHN0YXJ0LCBsZW5ndGgpKTsKLQkJCX0KLQkJCWNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCXJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGl2OwotCQl9Ci0JCXB1YmxpYyBJSW50ZXJuYWxWYXJpYWJsZSBjcmVhdGVTaGFkb3coU3RyaW5nIHR5cGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWl2ID0gbmV3IEludGVybmFsVmFyaWFibGUoZ2V0VmFyaWFibGUoKSwgZ2V0UERJVmFyaWFibGVPYmplY3QoKS5nZXRWYXJpYWJsZURlc2NyaXB0b3JBc1R5cGUodHlwZSkpOwotCQkJfQotCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaXY7Ci0JCX0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSVBESVZhcmlhYmxlIGdldFBESVZhcmlhYmxlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJCWlmIChmUERJVmFyaWFibGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZQRElWYXJpYWJsZSA9ICgoUFN0YWNrRnJhbWUpZ2V0U3RhY2tGcmFtZSgpKS5nZXRQRElTdGFja0ZyYW1lKCkuY3JlYXRlTG9jYWxWYXJpYWJsZSgoSVBESUxvY2FsVmFyaWFibGVEZXNjcmlwdG9yKWdldFBESVZhcmlhYmxlT2JqZWN0KCkpOwotCQkJCX0KLQkJCQljYXRjaChQRElFeGNlcHRpb24gZSkgewotCQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlBESVZhcmlhYmxlOwotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRQRElWYXJpYWJsZShJUERJVmFyaWFibGUgdmFyaWFibGUpIHsKLQkJCWZQRElWYXJpYWJsZSA9IHZhcmlhYmxlOwotCQl9Ci0JCXByaXZhdGUgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBnZXRQRElWYXJpYWJsZU9iamVjdCgpIHsKLQkJCWlmIChmUERJVmFyaWFibGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmUERJVmFyaWFibGU7Ci0JCQl9Ci0JCQlyZXR1cm4gZlBESVZhcmlhYmxlT2JqZWN0OwotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRQRElWYXJpYWJsZU9iamVjdChJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZhcmlhYmxlT2JqZWN0KSB7Ci0JCQlmUERJVmFyaWFibGVPYmplY3QgPSB2YXJpYWJsZU9iamVjdDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJaWYgKGZRdWFsaWZpZWROYW1lID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmUXVhbGlmaWVkTmFtZSA9IChmUERJVmFyaWFibGVPYmplY3QgIT0gbnVsbCkgPyBmUERJVmFyaWFibGVPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpIDogbnVsbDsKLQkJCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlF1YWxpZmllZE5hbWU7Ci0JCX0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbnZhbGlkYXRlKGJvb2xlYW4gZGVzdHJveSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGVzdHJveSAmJiBmUERJVmFyaWFibGUgIT0gbnVsbCkKLQkJCQkJZlBESVZhcmlhYmxlLmRpc3Bvc2UoKTsKLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJaW52YWxpZGF0ZVZhbHVlKCk7CQkJCi0JCQlzZXRQRElWYXJpYWJsZShudWxsKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKGJvb2xlYW4gZGVzdHJveSkgewotCQkJaW52YWxpZGF0ZShkZXN0cm95KTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVWYXJpYWJsZShJUERJVmFyaWFibGUgcGRpVmFyKSB7Ci0JCQlyZXR1cm4gKGZQRElWYXJpYWJsZSAhPSBudWxsKSA/IGZQRElWYXJpYWJsZS5lcXVhbHMocGRpVmFyKSA6IGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBpbnQgc2l6ZW9mKCkgewotCQkJaWYgKGdldFBESVZhcmlhYmxlT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLnNpemVvZigpOwotCQkJCX0KLQkJCQljYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0FyZ3VtZW50KCkgewotCQkJcmV0dXJuIChnZXRQRElWYXJpYWJsZU9iamVjdCgpIGluc3RhbmNlb2YgSVBESUFyZ3VtZW50RGVzY3JpcHRvcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlJUERJVmFyaWFibGUgcGRpVmFyaWFibGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwZGlWYXJpYWJsZSA9IGdldFBESVZhcmlhYmxlKCk7Ci0JCQkJaWYgKHBkaVZhcmlhYmxlICE9IG51bGwpCi0JCQkJCXBkaVZhcmlhYmxlLnNldFZhbHVlKGV4cHJlc3Npb24pOwotCQkJCWVsc2UKLQkJCQkJcmVxdWVzdEZhaWxlZChDb3JlTW9kZWxNZXNzYWdlcy5nZXRTdHJpbmcoIlBNb2RpZmljYXRpb25WYXJpYWJsZS4wIiksIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCBJUFZhbHVlIGdldFZhbHVlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJCWlmIChmVmFsdWUuZXF1YWxzKFBWYWx1ZUZhY3RvcnkuTlVMTF9WQUxVRSkpIHsKLQkJCQlJUERJVmFyaWFibGUgdmFyID0gZ2V0UERJVmFyaWFibGUoKTsKLQkJCQlpZiAodmFyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlBSUYgYWlmID0gdmFyLmdldEFJRigpOwotCQkJCQkJaWYgKGFpZiAhPSBudWxsICYmIGFpZi5nZXRUeXBlKCkgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQkJCQkJaW50W10gZGltcyA9ICgoSUFJRlR5cGVBcnJheSlhaWYuZ2V0VHlwZSgpKS5nZXREaW1lbnNpb25EZXRhaWxzKCk7Ci0JCQkJCQkJaWYgKGRpbXMubGVuZ3RoID4gMCAmJiBkaW1zWzBdID4gMCkKLQkJCQkJCQkJZlZhbHVlID0gUFZhbHVlRmFjdG9yeS5jcmVhdGVJbmRleGVkVmFsdWUoZ2V0VmFyaWFibGUoKSwgdmFyLCAwLCBkaW1zWzBdKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUoZ2V0VmFyaWFibGUoKSwgdmFyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZWYWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnZhbGlkYXRlVmFsdWUoKSB7Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLmRpc3Bvc2UoKTsKLQkJCQlmVmFsdWUgPSBQVmFsdWVGYWN0b3J5Lk5VTExfVkFMVUU7Ci0JCQkJaWYgKGZQRElWYXJpYWJsZSAhPSBudWxsKQotCQkJCQlmUERJVmFyaWFibGUucmVzZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlZCgpIHsKLQkJCXJldHVybiBmQ2hhbmdlZDsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2hhbmdlZChib29sZWFuIGNoYW5nZWQpIHsKLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJaW52YWxpZGF0ZVZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLnNldENoYW5nZWQoY2hhbmdlZCk7Ci0JCQl9Ci0JCQlmQ2hhbmdlZCA9IGNoYW5nZWQ7Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHByZXNlcnZlKCkgewotCQkJc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKSBmVmFsdWUpLnByZXNlcnZlKCk7Ci0JCQl9Ci0JCX0KLQkJUFZhcmlhYmxlIGdldFZhcmlhYmxlKCkgewotCQkJcmV0dXJuIGZWYXJpYWJsZTsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0VmFyaWFibGUoUFZhcmlhYmxlIHZhcmlhYmxlKSB7Ci0JCQlmVmFyaWFibGUgPSB2YXJpYWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXNldFZhbHVlKCkgewotCQkJaWYgKGZWYWx1ZSBpbnN0YW5jZW9mIEFic3RyYWN0UFZhbHVlKSB7Ci0JCQkJKChBYnN0cmFjdFBWYWx1ZSkgZlZhbHVlKS5yZXNldCgpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSVBESVZhcmlhYmxlIHZhciA9IGdldFBESVZhcmlhYmxlKCk7Ci0JCQlpZiAodmFyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gdmFyLmlzRWRpdGFibGUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSW50ZXJuYWxWYXJpYWJsZSkgewotCQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLmVxdWFscygoKEludGVybmFsVmFyaWFibGUpIG9iaikuZ2V0UERJVmFyaWFibGVPYmplY3QoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNTYW1lRGVzY3JpcHRvcihJUERJVmFyaWFibGVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLmVxdWFscyhkZXNjKTsKLQkJfQotCX0KLQlwdWJsaWMgUExvY2FsVmFyaWFibGUoUERlYnVnRWxlbWVudCBwYXJlbnQsIElQRElWYXJpYWJsZURlc2NyaXB0b3IgcGRpVmFyaWFibGVPYmplY3QsIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50LCBwZGlWYXJpYWJsZU9iamVjdCwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0JcHVibGljIFBMb2NhbFZhcmlhYmxlKFBEZWJ1Z0VsZW1lbnQgcGFyZW50LCBJUERJVmFyaWFibGVEZXNjcmlwdG9yIHBkaVZhcmlhYmxlT2JqZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCwgcGRpVmFyaWFibGVPYmplY3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcmlnaW5hbChJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZvKSB7Ci0JCWlmICh2byAhPSBudWxsKSB7Ci0JCQlzZXROYW1lKHZvLmdldE5hbWUoKSk7Ci0JCQlzZXRPcmlnaW5hbChuZXcgSW50ZXJuYWxWYXJpYWJsZSh0aGlzLCB2bykpOwotCQl9Ci0JfQotCXB1YmxpYyBJQUlGIGdldEFJRigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpLmdldEFJRigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QTWVtb3J5QmxvY2tFeHRlbnNpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QTWVtb3J5QmxvY2tFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNDg4MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUE1lbW9yeUJsb2NrRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja0V4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja1JldHJpZXZhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLk1lbW9yeUJ5dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QRGVidWdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESU1lbW9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLlBNZW1vcnlNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUE1lbW9yeUJsb2NrRXh0ZW5zaW9uIGV4dGVuZHMgUERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElNZW1vcnlCbG9ja0V4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZkV4cHJlc3Npb247Ci0JcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIGZCYXNlQWRkcmVzczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmTWVtb3J5U3BhY2VJRDsKLQlwcml2YXRlIElQRElNZW1vcnlCbG9jayBmUERJQmxvY2sgPSBudWxsOwotCXByaXZhdGUgTWVtb3J5Qnl0ZVtdIGZCeXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTZXQ8QmlnSW50ZWdlcj4gZkNoYW5nZXMgPSBuZXcgSGFzaFNldDxCaWdJbnRlZ2VyPigpOwotCi0JcHVibGljIFBNZW1vcnlCbG9ja0V4dGVuc2lvbihJUFNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgQmlnSW50ZWdlciBiYXNlQWRkcmVzcywgU3RyaW5nIG1lbW9yeVNwYWNlSUQpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQlmQmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzczsKLQkJZk1lbW9yeVNwYWNlSUQgPSBtZW1vcnlTcGFjZUlEOwotCQlmRXhwcmVzc2lvbiA9IFBNZW1vcnlNYW5hZ2VyLmFkZHJlc3NUb1N0cmluZyhiYXNlQWRkcmVzcywgbWVtb3J5U3BhY2VJRCk7Ci0JfQotCi0JcHVibGljIFBNZW1vcnlCbG9ja0V4dGVuc2lvbihJUFNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHJlc3Npb24sIEJpZ0ludGVnZXIgYmFzZUFkZHJlc3MpIHsKLQkJdGhpcyhzZXNzaW9uLCB0YXNrcywgZXhwcmVzc2lvbiwgYmFzZUFkZHJlc3MsIDEpOwotCX0KLQotCXB1YmxpYyBQTWVtb3J5QmxvY2tFeHRlbnNpb24oSVBTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByZXNzaW9uLCBCaWdJbnRlZ2VyIGJhc2VBZGRyZXNzLCBpbnQgd29yZFNpemUpIHsKLQkJc3VwZXIoc2Vzc2lvbiwgdGFza3MpOwotCQlmRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWZCYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzOwotCQlmTWVtb3J5U3BhY2VJRCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lbW9yeUJsb2NrCi0JICogQHBhcmFtIGFkZHJlc3NlcwotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZXMoSVBESU1lbW9yeUJsb2NrIG1lbW9yeUJsb2NrLCBCaWdJbnRlZ2VyW10gYWRkcmVzc2VzKSB7Ci0JCUlQRElNZW1vcnlCbG9jayBibG9jayA9IGdldFBESUJsb2NrKCk7Ci0JCWlmIChibG9jayAhPSBudWxsICYmIGZCeXRlcyAhPSBudWxsKSB7Ci0JCQlpZiAobWVtb3J5QmxvY2suZXF1YWxzKGJsb2NrKSkgewotCQkJCU1lbW9yeUJ5dGVbXSBtZW1CeXRlcyA9IChNZW1vcnlCeXRlW10pIGZCeXRlcy5jbG9uZSgpOwotCQkJCXRyeSB7Ci0JCQkJCUJpZ0ludGVnZXIgc3RhcnQgPSBnZXRSZWFsQmxvY2tBZGRyZXNzKCk7Ci0JCQkJCWxvbmcgbGVuZ3RoID0gYmxvY2suZ2V0TGVuZ3RoKCk7Ci0JCQkJCWJ5dGVbXSBuZXdCeXRlcyA9IGJsb2NrLmdldEJ5dGVzKCk7Ci0JCQkJCXNhdmVDaGFuZ2VzKGFkZHJlc3Nlcyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQlmQ2hhbmdlcy5hZGQoYWRkcmVzc2VzW2ldKTsKLQkJCQkJCWlmIChhZGRyZXNzZXNbaV0uY29tcGFyZVRvKHN0YXJ0KSA+PSAwICYmIGFkZHJlc3Nlc1tpXS5jb21wYXJlVG8oc3RhcnQuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihsZW5ndGgpKSkgPCAwKSB7Ci0JCQkJCQkJaW50IGluZGV4ID0gYWRkcmVzc2VzW2ldLnN1YnRyYWN0KHN0YXJ0KS5pbnRWYWx1ZSgpOwotCQkJCQkJCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbWVtQnl0ZXMubGVuZ3RoICYmIGluZGV4IDwgbmV3Qnl0ZXMubGVuZ3RoKSB7Ci0JCQkJCQkJCW1lbUJ5dGVzW2luZGV4XS5zZXRDaGFuZ2VkKHRydWUpOwotCQkJCQkJCQltZW1CeXRlc1tpbmRleF0uc2V0VmFsdWUobmV3Qnl0ZXNbaW5kZXhdKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZkJ5dGVzID0gbWVtQnl0ZXM7Ci0JCQkJCWZpcmVDaGFuZ2VFdmVudChEZWJ1Z0V2ZW50LkNPTlRFTlQpOwotCQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURlYnVnUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja0V4dGVuc2lvbiNjb25uZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jZGlzY29ubmVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZDaGFuZ2VzLmNsZWFyKCk7Ci0JCUlQRElNZW1vcnlCbG9jayBwZGlCbG9jayA9IGdldFBESUJsb2NrKCk7Ci0JCWlmIChwZGlCbG9jayAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWdldFBESVNlc3Npb24oKS5nZXRNZW1vcnlNYW5hZ2VyKCkucmVtb3ZlQmxvY2tzKGdldFRhc2tzKCksIG5ldyBJUERJTWVtb3J5QmxvY2tbXSB7IHBkaUJsb2NrIH0pOwotCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJZlBESUJsb2NrID0gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z0VsZW1lbnQjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElNZW1vcnlCbG9ja1JldHJpZXZhbC5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0TWVtb3J5QmxvY2tSZXRyaWV2YWwoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jZ2V0QWRkcmVzc2FibGVTaXplKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFkZHJlc3NhYmxlU2l6ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChnZXRQRElCbG9jaygpID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0UERJQmxvY2soY3JlYXRlUERJQmxvY2soZkJhc2VBZGRyZXNzLCAxMDApKTsKLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFBESUJsb2NrKCkuZ2V0V29yZFNpemUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja0V4dGVuc2lvbiNnZXRBZGRyZXNzU2l6ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRBZGRyZXNzU2l6ZSgpIHsKLQkJcmV0dXJuIFBEZWJ1Z1V0aWxzLmdldEFkZHJlc3NTaXplKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jZ2V0QmlnQmFzZUFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0Jhc2VBZGRyZXNzKCkgewotCQlyZXR1cm4gZkJhc2VBZGRyZXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uI2dldEJpZ0xlbmd0aCgpCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnTGVuZ3RoKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJSVBESU1lbW9yeUJsb2NrIGJsb2NrID0gZ2V0UERJQmxvY2soKTsKLQkJaWYgKGJsb2NrICE9IG51bGwpIHsKLQkJCUJpZ0ludGVnZXIgbGVuZ3RoID0gbmV3IEJpZ0ludGVnZXIoTG9uZy50b0hleFN0cmluZyhibG9jay5nZXRMZW5ndGgoKSksIDE2KTsKLQkJCXJldHVybiBsZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9jayNnZXRCeXRlcygpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uI2dldEJ5dGVzRnJvbUFkZHJlc3MoamF2YS5tYXRoLkJpZ0ludGVnZXIsIGxvbmcpCi0JICovCi0JcHVibGljIE1lbW9yeUJ5dGVbXSBnZXRCeXRlc0Zyb21BZGRyZXNzKEJpZ0ludGVnZXIgYWRkcmVzcywgbG9uZyBsZW5ndGgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUlQRElNZW1vcnlCbG9jayBwZGlCbG9jayA9IGdldFBESUJsb2NrKCk7Ci0JCWlmIChwZGlCbG9jayA9PSBudWxsCi0JCQkJfHwgcGRpQmxvY2suZ2V0U3RhcnRBZGRyZXNzKCkuY29tcGFyZVRvKGFkZHJlc3MpID4gMAotCQkJCXx8IHBkaUJsb2NrLmdldFN0YXJ0QWRkcmVzcygpLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YocGRpQmxvY2suZ2V0TGVuZ3RoKCkpKS5jb21wYXJlVG8oCi0JCQkJCQlhZGRyZXNzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YobGVuZ3RoKSkpIDwgMCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJYnl0ZVtdIGJ5dGVzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlwZGlCbG9jayA9IGdldFBESUJsb2NrKCk7Ci0JCQkJCWlmIChwZGlCbG9jayA9PSBudWxsCi0JCQkJCQkJfHwgcGRpQmxvY2suZ2V0U3RhcnRBZGRyZXNzKCkuY29tcGFyZVRvKGFkZHJlc3MpID4gMAotCQkJCQkJCXx8IHBkaUJsb2NrLmdldFN0YXJ0QWRkcmVzcygpLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YocGRpQmxvY2suZ2V0TGVuZ3RoKCkpKS5jb21wYXJlVG8oCi0JCQkJCQkJCQlhZGRyZXNzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YobGVuZ3RoKSkpIDwgMCkgewotCQkJCQkJaWYgKHBkaUJsb2NrICE9IG51bGwpIHsKLQkJCQkJCQlkaXNwb3NlUERJQmxvY2soKTsKLQkJCQkJCQlmQnl0ZXMgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc2V0UERJQmxvY2soY3JlYXRlUERJQmxvY2soYWRkcmVzcywgbGVuZ3RoKSk7Ci0JCQkJCX0KLQkJCQkJYnl0ZXMgPSBnZXRQRElCbG9jaygpLmdldEJ5dGVzKCk7Ci0JCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJfQotCQkJCWZCeXRlcyA9IG5ldyBNZW1vcnlCeXRlW2J5dGVzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7ICsraSkgewotCQkJCQlmQnl0ZXNbaV0gPSBjcmVhdGVNZW1vcnlCeXRlKGJ5dGVzW2ldLCBnZXRQRElCbG9jaygpLmdldEZsYWdzKGkpLCBoYXNDaGFuZ2VkKGdldFJlYWxCbG9ja0FkZHJlc3MoKS5hZGQoCi0JCQkJCQkJQmlnSW50ZWdlci52YWx1ZU9mKGkpKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNZW1vcnlCeXRlW10gcmVzdWx0ID0gbmV3IE1lbW9yeUJ5dGVbMF07Ci0JCWlmIChmQnl0ZXMgIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IGFkZHJlc3Muc3VidHJhY3QoZ2V0UmVhbEJsb2NrQWRkcmVzcygpKS5pbnRWYWx1ZSgpOwotCQkJaW50IG9mZnNldEluQnl0ZXMgPSBvZmZzZXQgKiBwZGlCbG9jay5nZXRXb3JkU2l6ZSgpOwotCQkJbG9uZyBsZW5ndGhJbkJ5dGVzID0gbGVuZ3RoICogcGRpQmxvY2suZ2V0V29yZFNpemUoKTsKLQkJCWlmIChvZmZzZXQgPj0gMCkgewotCQkJCWludCBzaXplID0gKGZCeXRlcy5sZW5ndGggLSBvZmZzZXRJbkJ5dGVzID49IGxlbmd0aEluQnl0ZXMpID8gKGludCkgbGVuZ3RoSW5CeXRlcyA6IGZCeXRlcy5sZW5ndGggLSBvZmZzZXRJbkJ5dGVzOwotCQkJCWlmIChzaXplID4gMCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTWVtb3J5Qnl0ZVtzaXplXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmQnl0ZXMsIG9mZnNldEluQnl0ZXMsIHJlc3VsdCwgMCwgc2l6ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jZ2V0Qnl0ZXNGcm9tT2Zmc2V0KGphdmEubWF0aC5CaWdJbnRlZ2VyLCBsb25nKQotCSAqLwotCXB1YmxpYyBNZW1vcnlCeXRlW10gZ2V0Qnl0ZXNGcm9tT2Zmc2V0KEJpZ0ludGVnZXIgdW5pdE9mZnNldCwgbG9uZyBhZGRyZXNzYWJsZVVuaXRzKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja0V4dGVuc2lvbiNnZXRDb25uZWN0aW9ucygpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja0V4dGVuc2lvbiNnZXRFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBmRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9jayNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jZ2V0TWVtb3J5QmxvY2tFbmRBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRNZW1vcnlCbG9ja0VuZEFkZHJlc3MoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsvLyByZXR1cm4gbnVsbCB0byBtZWFuIG5vdCBib3VuZGVkIC4uLiBhY2NvcmRpbmcgdG8gdGhlIHNwZWMKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9ja0V4dGVuc2lvbiNnZXRNZW1vcnlCbG9ja1JldHJpZXZhbCgpCi0JICovCi0JcHVibGljIElNZW1vcnlCbG9ja1JldHJpZXZhbCBnZXRNZW1vcnlCbG9ja1JldHJpZXZhbCgpIHsKLQkJcmV0dXJuIChJTWVtb3J5QmxvY2tSZXRyaWV2YWwpIGdldERlYnVnVGFyZ2V0KCkuZ2V0QWRhcHRlcihJTWVtb3J5QmxvY2tSZXRyaWV2YWwuY2xhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uI2dldE1lbW9yeUJsb2NrU3RhcnRBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRNZW1vcnlCbG9ja1N0YXJ0QWRkcmVzcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOyAvLyByZXR1cm4gbnVsbCB0byBtZWFuIG5vdCBib3VuZGVkIC4uLiBhY2NvcmRpbmcgdG8gdGhlCi0JCQkJCQkvLyBzcGVjCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5U3BhY2VJRCgpIHsKLQkJcmV0dXJuIGZNZW1vcnlTcGFjZUlEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBESU1lbW9yeUJsb2NrIGdldFBESUJsb2NrKCkgewotCQlyZXR1cm4gZlBESUJsb2NrOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrI2dldFN0YXJ0QWRkcmVzcygpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3RhcnRBZGRyZXNzKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldENoYW5nZXMoKSB7Ci0JCWlmIChmQnl0ZXMgIT0gbnVsbCkgewotCQkJQmlnSW50ZWdlcltdIGNoYW5nZXMgPSAoQmlnSW50ZWdlcltdKSBmQ2hhbmdlcy50b0FycmF5KG5ldyBCaWdJbnRlZ2VyW2ZDaGFuZ2VzLnNpemUoKV0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJQmlnSW50ZWdlciByZWFsID0gZ2V0UmVhbEJsb2NrQWRkcmVzcygpOwotCQkJCWlmIChyZWFsLmNvbXBhcmVUbyhjaGFuZ2VzW2ldKSA8PSAwICYmIHJlYWwuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihnZXRCbG9ja1NpemUoKSkpLmNvbXBhcmVUbyhjaGFuZ2VzW2ldKSA+IDApIHsKLQkJCQkJaW50IGluZGV4ID0gY2hhbmdlc1tpXS5zdWJ0cmFjdChyZWFsKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGZCeXRlcy5sZW5ndGgpIHsKLQkJCQkJCWZCeXRlc1tpbmRleF0uc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZkNoYW5nZXMuY2xlYXIoKTsKLQkJZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuQ09OVEVOVCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jc2V0QmFzZUFkZHJlc3MoamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZUFkZHJlc3MoQmlnSW50ZWdlciBhZGRyZXNzKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uI3NldFZhbHVlKGphdmEubWF0aC5CaWdJbnRlZ2VyLCBieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQmlnSW50ZWdlciBvZmZzZXQsIGJ5dGVbXSBieXRlcykgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJSVBESU1lbW9yeUJsb2NrIGJsb2NrID0gZ2V0UERJQmxvY2soKTsKLQkJaWYgKGJsb2NrICE9IG51bGwpIHsKLQkJCUJpZ0ludGVnZXIgYmFzZSA9IGdldEJpZ0Jhc2VBZGRyZXNzKCk7Ci0JCQlCaWdJbnRlZ2VyIHJlYWwgPSBnZXRSZWFsQmxvY2tBZGRyZXNzKCk7Ci0JCQlsb25nIHJlYWxPZmZzZXQgPSBiYXNlLmFkZChvZmZzZXQpLnN1YnRyYWN0KHJlYWwpLmxvbmdWYWx1ZSgpOwotCQkJdHJ5IHsKLQkJCQlibG9jay5zZXRWYWx1ZShyZWFsT2Zmc2V0LCBieXRlcyk7Ci0JCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2sjc2V0VmFsdWUobG9uZywgYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGxvbmcgb2Zmc2V0LCBieXRlW10gYnl0ZXMpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXNldFZhbHVlKEJpZ0ludGVnZXIudmFsdWVPZihvZmZzZXQpLCBieXRlcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tFeHRlbnNpb24jc3VwcG9ydEJhc2VBZGRyZXNzTW9kaWZpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0QmFzZUFkZHJlc3NNb2RpZmljYXRpb24oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrRXh0ZW5zaW9uI3N1cHBvcnRzQ2hhbmdlTWFuYWdlbWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDaGFuZ2VNYW5hZ2VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklNZW1vcnlCbG9jayNzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gcGRpRmxhZ3MKLQkgKiBAcGFyYW0gY2hhbmdlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1lbW9yeUJ5dGUgY3JlYXRlTWVtb3J5Qnl0ZShieXRlIHZhbHVlLCBieXRlIHBkaUZsYWdzLCBib29sZWFuIGNoYW5nZWQpIHsKLQkJYnl0ZSBmbGFncyA9IDA7Ci0JCWlmICgocGRpRmxhZ3MgJiBJUERJTWVtb3J5QmxvY2suVkFMSUQpICE9IDApIHsKLQkJCWZsYWdzIHw9IE1lbW9yeUJ5dGUuSElTVE9SWV9LTk9XTiB8IE1lbW9yeUJ5dGUuRU5ESUFORVNTX0tOT1dOOwotCQkJaWYgKChwZGlGbGFncyAmIElQRElNZW1vcnlCbG9jay5SRUFEX09OTFkpICE9IDApIHsKLQkJCQlmbGFncyB8PSBNZW1vcnlCeXRlLlJFQURBQkxFOwotCQkJfSBlbHNlIHsKLQkJCQlmbGFncyB8PSBNZW1vcnlCeXRlLlJFQURBQkxFIHwgTWVtb3J5Qnl0ZS5XUklUQUJMRTsKLQkJCX0KLQkJCWlmIChpc0JpZ0VuZGlhbigpKSB7Ci0JCQkJZmxhZ3MgfD0gTWVtb3J5Qnl0ZS5CSUdfRU5ESUFOOwotCQkJfQotCQkJaWYgKGNoYW5nZWQpCi0JCQkJZmxhZ3MgfD0gTWVtb3J5Qnl0ZS5DSEFOR0VEOwotCQl9Ci0JCXJldHVybiBuZXcgTWVtb3J5Qnl0ZSh2YWx1ZSwgZmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGRyZXNzCi0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFBESUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVBESU1lbW9yeUJsb2NrIGNyZWF0ZVBESUJsb2NrKEJpZ0ludGVnZXIgYWRkcmVzcywgbG9uZyBsZW5ndGgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUERJTWVtb3J5QmxvY2sgYmxvY2sgPSBnZXRQRElTZXNzaW9uKCkuZ2V0TWVtb3J5TWFuYWdlcigpLmNyZWF0ZU1lbW9yeUJsb2NrKGdldFRhc2tzKCksIGFkZHJlc3MudG9TdHJpbmcoKSwgKGludCkgbGVuZ3RoLAotCQkJCTEpOwotCQlibG9jay5zZXRGcm96ZW4oZmFsc2UpOwotCQlyZXR1cm4gYmxvY2s7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VQRElCbG9jaygpIHsKLQkJSVBESU1lbW9yeUJsb2NrIGJsb2NrID0gZ2V0UERJQmxvY2soKTsKLQkJaWYgKGJsb2NrICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UERJU2Vzc2lvbigpLmdldE1lbW9yeU1hbmFnZXIoKS5yZW1vdmVCbG9ja3MoZ2V0VGFza3MoKSwgbmV3IElQRElNZW1vcnlCbG9ja1tdIHsgYmxvY2sgfSk7Ci0JCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCURlYnVnUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJCXNldFBESUJsb2NrKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgbG9uZyBnZXRCbG9ja1NpemUoKSB7Ci0JCUlQRElNZW1vcnlCbG9jayBibG9jayA9IGdldFBESUJsb2NrKCk7Ci0JCXJldHVybiAoYmxvY2sgIT0gbnVsbCkgPyBibG9jay5nZXRMZW5ndGgoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQmlnSW50ZWdlciBnZXRSZWFsQmxvY2tBZGRyZXNzKCkgewotCQlJUERJTWVtb3J5QmxvY2sgYmxvY2sgPSBnZXRQRElCbG9jaygpOwotCQlyZXR1cm4gKGJsb2NrICE9IG51bGwpID8gYmxvY2suZ2V0U3RhcnRBZGRyZXNzKCkgOiBCaWdJbnRlZ2VyLlpFUk87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkZHJlc3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NoYW5nZWQoQmlnSW50ZWdlciBhZGRyZXNzKSB7Ci0JCXJldHVybiBmQ2hhbmdlcy5jb250YWlucyhhZGRyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQmlnRW5kaWFuKCkgewotCQkvLyBUT0RPIGFsd2F5cyB0cnVlCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGRyZXNzZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZUNoYW5nZXMoQmlnSW50ZWdlcltdIGFkZHJlc3NlcykgewotCQlmQ2hhbmdlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChhZGRyZXNzZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGRpQmxvY2sKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UERJQmxvY2soSVBESU1lbW9yeUJsb2NrIHBkaUJsb2NrKSB7Ci0JCWZQRElCbG9jayA9IHBkaUJsb2NrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QUmVnaXN0ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QUmVnaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5NWIyYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3Rlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBSZWdpc3RlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuUFZhcmlhYmxlRm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElNZW1vcnlCbG9ja0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElSZXN1bWVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBcmd1bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQXJyYXk7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUFJlZ2lzdGVyIGV4dGVuZHMgUFZhcmlhYmxlIGltcGxlbWVudHMgSVBSZWdpc3RlciB7Ci0JcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbFZhcmlhYmxlIGltcGxlbWVudHMgSUludGVybmFsVmFyaWFibGUgewotCQlwcml2YXRlIFBWYXJpYWJsZSBmVmFyaWFibGU7Ci0JCXByaXZhdGUgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBmUERJVmFyaWFibGVPYmplY3Q7Ci0JCXByaXZhdGUgSVBESVJlZ2lzdGVyIGZQRElSZWdpc3RlcjsKLQkJcHJpdmF0ZSBTdHJpbmcgZlF1YWxpZmllZE5hbWU7Ci0JCXByaXZhdGUgSVBWYWx1ZSBmVmFsdWUgPSBQVmFsdWVGYWN0b3J5Lk5VTExfVkFMVUU7Ci0JCXByaXZhdGUgYm9vbGVhbiBmQ2hhbmdlZCA9IGZhbHNlOwotCi0JCUludGVybmFsVmFyaWFibGUoUFZhcmlhYmxlIHZhciwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciB2YXJPYmplY3QpIHsKLQkJCXNldFZhcmlhYmxlKHZhcik7Ci0JCQlzZXRQRElWYXJpYWJsZU9iamVjdCh2YXJPYmplY3QpOwotCQkJc2V0UERJUmVnaXN0ZXIoKHZhck9iamVjdCBpbnN0YW5jZW9mIElQRElSZWdpc3RlcikgPyAoSVBESVJlZ2lzdGVyKXZhck9iamVjdCA6IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIElJbnRlcm5hbFZhcmlhYmxlIGNyZWF0ZVNoYWRvdyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWl2ID0gbmV3IEludGVybmFsVmFyaWFibGUoZ2V0VmFyaWFibGUoKSwgZ2V0UERJVmFyaWFibGVPYmplY3QoKS5nZXRWYXJpYWJsZURlc2NyaXB0b3JBc0FycmF5KHN0YXJ0LCBsZW5ndGgpKTsKLQkJCX0KLQkJCWNhdGNoKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaXY7Ci0JCX0KLQotCQlwdWJsaWMgSUludGVybmFsVmFyaWFibGUgY3JlYXRlU2hhZG93KFN0cmluZyB0eXBlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpdiA9IG5ldyBJbnRlcm5hbFZhcmlhYmxlKGdldFZhcmlhYmxlKCksIGdldFBESVZhcmlhYmxlT2JqZWN0KCkuZ2V0VmFyaWFibGVEZXNjcmlwdG9yQXNUeXBlKHR5cGUpKTsKLQkJCX0KLQkJCWNhdGNoKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaXY7Ci0JCX0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSVBESVJlZ2lzdGVyIGdldFBESVJlZ2lzdGVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJCWlmIChmUERJUmVnaXN0ZXIgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZQRElSZWdpc3RlciA9IGdldFBESVRhcmdldCgpLmNyZWF0ZVJlZ2lzdGVyKChJUERJUmVnaXN0ZXJEZXNjcmlwdG9yKWdldFBESVZhcmlhYmxlT2JqZWN0KCkpOwotCQkJCX0KLQkJCQljYXRjaChQRElFeGNlcHRpb24gZSkgewotCQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlBESVJlZ2lzdGVyOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldFBESVJlZ2lzdGVyKElQRElSZWdpc3RlciByZWdpc3RlcikgewotCQkJZlBESVJlZ2lzdGVyID0gcmVnaXN0ZXI7Ci0JCX0KLQotCQlwcml2YXRlIElQRElWYXJpYWJsZURlc2NyaXB0b3IgZ2V0UERJVmFyaWFibGVPYmplY3QoKSB7Ci0JCQlpZiAoZlBESVJlZ2lzdGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZlBESVJlZ2lzdGVyOwotCQkJfQotCQkJcmV0dXJuIGZQRElWYXJpYWJsZU9iamVjdDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRQRElWYXJpYWJsZU9iamVjdChJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZhcmlhYmxlT2JqZWN0KSB7Ci0JCQlmUERJVmFyaWFibGVPYmplY3QgPSB2YXJpYWJsZU9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlpZiAoZlF1YWxpZmllZE5hbWUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZRdWFsaWZpZWROYW1lID0gKGZQRElWYXJpYWJsZU9iamVjdCAhPSBudWxsKSA/IGZQRElWYXJpYWJsZU9iamVjdC5nZXRRdWFsaWZpZWROYW1lKCkgOiBudWxsOwotCQkJCX0KLQkJCQljYXRjaChQRElFeGNlcHRpb24gZSkgewotCQkJCQlyZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlF1YWxpZmllZE5hbWU7Ci0JCX0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbnZhbGlkYXRlKGJvb2xlYW4gZGVzdHJveSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGVzdHJveSAmJiBmUERJUmVnaXN0ZXIgIT0gbnVsbCkKLQkJCQkJZlBESVJlZ2lzdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWNhdGNoKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJaW52YWxpZGF0ZVZhbHVlKCk7Ci0JCQlzZXRQRElSZWdpc3RlcihudWxsKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKGJvb2xlYW4gZGVzdHJveSkgewotCQkJaW52YWxpZGF0ZShkZXN0cm95KTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVWYXJpYWJsZShJUERJVmFyaWFibGUgcGRpVmFyKSB7Ci0JCQlyZXR1cm4gKGZQRElSZWdpc3RlciAhPSBudWxsKSA/IGZQRElSZWdpc3Rlci5lcXVhbHMocGRpVmFyKSA6IGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBpbnQgc2l6ZW9mKCkgewotCQkJaWYgKGdldFBESVZhcmlhYmxlT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBnZXRQRElWYXJpYWJsZU9iamVjdCgpLnNpemVvZigpOwotCQkJCX0KLQkJCQljYXRjaChQRElFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQXJndW1lbnQoKSB7Ci0JCQlyZXR1cm4gKGdldFBESVZhcmlhYmxlT2JqZWN0KCkgaW5zdGFuY2VvZiBJUERJQXJndW1lbnREZXNjcmlwdG9yKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJCUlQRElSZWdpc3RlciBwZGlSZWdpc3RlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXBkaVJlZ2lzdGVyID0gZ2V0UERJUmVnaXN0ZXIoKTsKLQkJCQlpZiAocGRpUmVnaXN0ZXIgIT0gbnVsbCkKLQkJCQkJcGRpUmVnaXN0ZXIuc2V0VmFsdWUoZXhwcmVzc2lvbik7Ci0JCQkJZWxzZQotCQkJCQlyZXF1ZXN0RmFpbGVkKENvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiQ01vZGlmaWNhdGlvblZhcmlhYmxlLjAiKSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaChQRElFeGNlcHRpb24gZSkgewotCQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVBWYWx1ZSBnZXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlpZiAoZlZhbHVlLmVxdWFscyhQVmFsdWVGYWN0b3J5Lk5VTExfVkFMVUUpKSB7Ci0JCQkJSVBESVJlZ2lzdGVyIHJlZyA9IGdldFBESVJlZ2lzdGVyKCk7Ci0JCQkJaWYgKHJlZyAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQUlGIGFpZiA9IHJlZy5nZXRBSUYoZ2V0Q3VycmVudFN0YWNrRnJhbWUoKS5nZXRQRElTdGFja0ZyYW1lKCkpOwotCQkJCQkJaWYgKGFpZiAhPSBudWxsICYmIGFpZi5nZXRUeXBlKCkgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQkJCQkJaW50W10gZGltcyA9ICgoSUFJRlR5cGVBcnJheSlhaWYuZ2V0VHlwZSgpKS5nZXREaW1lbnNpb25EZXRhaWxzKCk7Ci0JCQkJCQkJaWYgKGRpbXMubGVuZ3RoID4gMCAmJiBkaW1zWzBdID4gMCkKLQkJCQkJCQkJZlZhbHVlID0gUFZhbHVlRmFjdG9yeS5jcmVhdGVJbmRleGVkVmFsdWUoZ2V0VmFyaWFibGUoKSwgcmVnLCAwLCBkaW1zWzBdKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWZWYWx1ZSA9IFBWYWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUoZ2V0VmFyaWFibGUoKSwgcmVnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChQRElFeGNlcHRpb24gZSkgewotCQkJCQkJcmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlZhbHVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsKLQkJCWlmIChmVmFsdWUgaW5zdGFuY2VvZiBBYnN0cmFjdFBWYWx1ZSkgewotCQkJCSgoQWJzdHJhY3RQVmFsdWUpZlZhbHVlKS5kaXNwb3NlKCk7Ci0JCQkJZlZhbHVlID0gUFZhbHVlRmFjdG9yeS5OVUxMX1ZBTFVFOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlZCgpIHsKLQkJCXJldHVybiBmQ2hhbmdlZDsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2hhbmdlZChib29sZWFuIGNoYW5nZWQpIHsKLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJaW52YWxpZGF0ZVZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoZlZhbHVlIGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpIHsKLQkJCQkoKEFic3RyYWN0UFZhbHVlKWZWYWx1ZSkuc2V0Q2hhbmdlZChjaGFuZ2VkKTsKLQkJCX0KLQkJCWZDaGFuZ2VkID0gY2hhbmdlZDsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHJlc2VydmUoKSB7Ci0JCQlzZXRDaGFuZ2VkKGZhbHNlKTsKLQkJCWlmIChmVmFsdWUgaW5zdGFuY2VvZiBBYnN0cmFjdFBWYWx1ZSkgewotCQkJCSgoQWJzdHJhY3RQVmFsdWUpZlZhbHVlKS5wcmVzZXJ2ZSgpOwotCQkJfQotCQl9Ci0JCVBWYXJpYWJsZSBnZXRWYXJpYWJsZSgpIHsKLQkJCXJldHVybiBmVmFyaWFibGU7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldFZhcmlhYmxlKFBWYXJpYWJsZSB2YXJpYWJsZSkgewotCQkJZlZhcmlhYmxlID0gdmFyaWFibGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVzZXRWYWx1ZSgpIHsKLQkJCWlmIChmVmFsdWUgaW5zdGFuY2VvZiBBYnN0cmFjdFBWYWx1ZSkgewotCQkJCSgoQWJzdHJhY3RQVmFsdWUpZlZhbHVlKS5yZXNldCgpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSVBESVJlZ2lzdGVyIHJlZyA9IGdldFBESVJlZ2lzdGVyKCk7Ci0JCQlpZiAocmVnICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gcmVnLmlzRWRpdGFibGUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goUERJRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJbnRlcm5hbFZhcmlhYmxlKSB7Ci0JCQkJcmV0dXJuIGdldFBESVZhcmlhYmxlT2JqZWN0KCkuZXF1YWxzKCgoSW50ZXJuYWxWYXJpYWJsZSlvYmopLmdldFBESVZhcmlhYmxlT2JqZWN0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzU2FtZURlc2NyaXB0b3IoSVBESVZhcmlhYmxlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCQlyZXR1cm4gZ2V0UERJVmFyaWFibGVPYmplY3QoKS5lcXVhbHMoZGVzYyk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIFBSZWdpc3RlcihQUmVnaXN0ZXJHcm91cCBwYXJlbnQsIElQUmVnaXN0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIocGFyZW50LCAoKFBSZWdpc3RlckRlc2NyaXB0b3IpZGVzY3JpcHRvcikuZ2V0UERJRGVzY3JpcHRvcigpKTsKLQkJc2V0Rm9ybWF0KFBWYXJpYWJsZUZvcm1hdC5nZXRGb3JtYXQoUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChJUERlYnVnQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9SRUdJU1RFUl9GT1JNQVQpKSk7Ci0JfQotCXByb3RlY3RlZCBQUmVnaXN0ZXIoUFJlZ2lzdGVyR3JvdXAgcGFyZW50LCBJUFJlZ2lzdGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnQsICgoUFJlZ2lzdGVyRGVzY3JpcHRvcilkZXNjcmlwdG9yKS5nZXRQRElEZXNjcmlwdG9yKCksIG1lc3NhZ2UpOwotCQlzZXRGb3JtYXQoUFZhcmlhYmxlRm9ybWF0LmdldEZvcm1hdChQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KElQRGVidWdDb25zdGFudHMuUFJFRl9ERUZBVUxUX1JFR0lTVEVSX0ZPUk1BVCkpKTsKLQl9Ci0JcHVibGljIElSZWdpc3Rlckdyb3VwIGdldFJlZ2lzdGVyR3JvdXAoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gKElSZWdpc3Rlckdyb3VwKWdldFBhcmVudCgpOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jvb2trZWVwaW5nRW5hYmxlZCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlRGlzYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKElQRElFdmVudFtdIGV2ZW50cykgewotCQlmb3IoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUERJRXZlbnQgZXZlbnQgPSBldmVudHNbaV07Ci0JCQlpZiAoIWV2ZW50LmNvbnRhaW5zKGdldFRhc2tzKCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJSVBESVNlc3Npb25PYmplY3QgcmVhc29uID0gKChJUERJQ2hhbmdlZEV2ZW50KWV2ZW50KS5nZXRSZWFzb24oKTsKLQkJCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESU1lbW9yeUJsb2NrSW5mbykgewotCQkJCQlyZXNldFZhbHVlKCk7Ci0JCQkJCXJldHVybjsJLy8gYXZvaWQgc2ltaWxhciBidXQgbG9naWMgaW5hcHByb3ByaWF0ZSBmb3IgdXMgaW4gUFZhcmlhYmxlCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJUmVzdW1lZEV2ZW50KSB7Ci0JCQkJc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlRGVidWdFdmVudHMoZXZlbnRzKTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW50ZXJuYWxEaXNwb3NlKHRydWUpOwotCQlzZXREaXNwb3NlZCh0cnVlKTsKLQl9Ci0JcHJvdGVjdGVkIElQU3RhY2tGcmFtZSBnZXRTdGFja0ZyYW1lKCkgewotCQlJUFN0YWNrRnJhbWUgZnJhbWUgPSBzdXBlci5nZXRTdGFja0ZyYW1lKCk7Ci0JCWlmIChmcmFtZSA9PSBudWxsKQotCQkJZnJhbWUgPSBnZXRDdXJyZW50U3RhY2tGcmFtZSgpOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCXByb3RlY3RlZCBJUFN0YWNrRnJhbWUgZ2V0Q3VycmVudFN0YWNrRnJhbWUoKSB7Ci0JCXJldHVybiBmU2Vzc2lvbi5nZXRSZWdpc3Rlck1hbmFnZXIoKS5nZXRDdXJyZW50RnJhbWUoZ2V0VGFza3MoKSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9yaWdpbmFsKElQRElWYXJpYWJsZURlc2NyaXB0b3Igdm8pIHsKLQkJaWYgKHZvICE9IG51bGwpIHsKLQkJCXNldE5hbWUodm8uZ2V0TmFtZSgpKTsKLQkJCXNldE9yaWdpbmFsKG5ldyBJbnRlcm5hbFZhcmlhYmxlKHRoaXMsIHZvKSk7Ci0JCX0KLQl9Ci0JcHVibGljIElBSUYgZ2V0QUlGKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFZhbHVlKCkuZ2V0QUlGKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BSZWdpc3RlckRlc2NyaXB0b3IuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QUmVnaXN0ZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmM2NWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BSZWdpc3RlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUmVnaXN0ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJUmVnaXN0ZXJHcm91cDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQUmVnaXN0ZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSVBSZWdpc3RlckRlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgU3RyaW5nIGZHcm91cE5hbWU7Ci0JcHJpdmF0ZSBJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIGZQRElEZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBQUmVnaXN0ZXJEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQkJZkdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKLQl9Ci0JcHVibGljIFBSZWdpc3RlckRlc2NyaXB0b3IoSVBESVJlZ2lzdGVyR3JvdXAgZ3JvdXAsIElQRElSZWdpc3RlckRlc2NyaXB0b3IgZGVzYykgewotCQlmTmFtZSA9IGRlc2MuZ2V0TmFtZSgpOwotCQlmR3JvdXBOYW1lID0gZ3JvdXAuZ2V0TmFtZSgpOwotCQlmUERJRGVzY3JpcHRvciA9IGRlc2M7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwTmFtZSgpIHsKLQkJcmV0dXJuIGZHcm91cE5hbWU7Ci0JfQotCXB1YmxpYyBJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIGdldFBESURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBmUERJRGVzY3JpcHRvcjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UERJRGVzY3JpcHRvcihJUERJUmVnaXN0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJZlBESURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QUmVnaXN0ZXJHcm91cC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BSZWdpc3Rlckdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmM0OTQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BSZWdpc3Rlckdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JRW5hYmxlRGlzYWJsZVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFBlcnNpc3RhYmxlUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFJlZ2lzdGVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5QUmVnaXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUFJlZ2lzdGVyR3JvdXAgZXh0ZW5kcyBQRGVidWdFbGVtZW50IGltcGxlbWVudHMgSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAsIElFbmFibGVEaXNhYmxlVGFyZ2V0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9SRUdJU1RFUl9HUk9VUCA9ICJyZWdpc3Rlckdyb3VwIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRUdJU1RFUl9HUk9VUF9OQU1FID0gIm5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFR0lTVEVSX0dST1VQX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUkVHSVNURVIgPSAicmVnaXN0ZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFR0lTVEVSX05BTUUgPSAibmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVHSVNURVJfT1JJR0lOQUxfR1JPVVBfTkFNRSA9ICJvcmlnaW5hbEdyb3VwTmFtZSI7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZlJlZ2lzdGVyRGVzY3JpcHRvcnM7Ci0JcHJpdmF0ZSBJUmVnaXN0ZXJbXSBmUmVnaXN0ZXJzOwotCXByaXZhdGUgYm9vbGVhbiBmSXNFbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZkRpc3Bvc2VkID0gZmFsc2U7Ci0KLQlwdWJsaWMgUFJlZ2lzdGVyR3JvdXAoSVBTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MpIHsKLQkJdGhpcyhzZXNzaW9uLCB0YXNrcywgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFBSZWdpc3Rlckdyb3VwKElQU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgbmFtZSwgSVBSZWdpc3RlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCWZOYW1lID0gbmFtZTsKLQkJZlJlZ2lzdGVyRGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JRW5hYmxlRGlzYWJsZVRhcmdldCNjYW5FbmFibGVEaXNhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVEaXNhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRGlzcG9zZWQgPSB0cnVlOwotCQlpbnZhbGlkYXRlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSUVuYWJsZURpc2FibGVUYXJnZXQuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwI2dldE1lbWVudG8oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVtZW50bygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBEZWJ1Z1BsdWdpbi5uZXdEb2N1bWVudCgpOwotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEVMRU1FTlRfUkVHSVNURVJfR1JPVVApOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSX0dST1VQX05BTUUsIGdldE5hbWUoKSk7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJfR1JPVVBfRU5BQkxFRCwgQm9vbGVhbi52YWx1ZU9mKGlzRW5hYmxlZCgpKS50b1N0cmluZygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVnaXN0ZXJEZXNjcmlwdG9ycy5sZW5ndGg7ICsraSkgewotCQkJRWxlbWVudCBjaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9SRUdJU1RFUik7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoQVRUUl9SRUdJU1RFUl9OQU1FLCBmUmVnaXN0ZXJEZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJfT1JJR0lOQUxfR1JPVVBfTkFNRSwgZlJlZ2lzdGVyRGVzY3JpcHRvcnNbaV0uZ2V0R3JvdXBOYW1lKCkpOwotCQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCX0KLQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCXJldHVybiBEZWJ1Z1BsdWdpbi5zZXJpYWxpemVEb2N1bWVudChkb2N1bWVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAjZ2V0UmVnaXN0ZXJEZXNjcmlwdG9ycygpCi0JICovCi0JcHVibGljIElQUmVnaXN0ZXJEZXNjcmlwdG9yW10gZ2V0UmVnaXN0ZXJEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZSZWdpc3RlckRlc2NyaXB0b3JzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVJlZ2lzdGVyR3JvdXAjZ2V0UmVnaXN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lzdGVyW10gZ2V0UmVnaXN0ZXJzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGZEaXNwb3NlZCkKLQkJCXJldHVybiBuZXcgSVJlZ2lzdGVyWzBdOwotCQlpZiAoZlJlZ2lzdGVycyA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoZlJlZ2lzdGVycyA9PSBudWxsKSB7Ci0JCQkJCWZSZWdpc3RlcnMgPSBuZXcgSVJlZ2lzdGVyW2ZSZWdpc3RlckRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlZ2lzdGVycy5sZW5ndGg7ICsraSkgewotCQkJCQkJZlJlZ2lzdGVyc1tpXSA9IG5ldyBQUmVnaXN0ZXIodGhpcywgZlJlZ2lzdGVyRGVzY3JpcHRvcnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmUmVnaXN0ZXJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVJlZ2lzdGVyR3JvdXAjaGFzUmVnaXN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3RlcnMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gKGZSZWdpc3RlckRlc2NyaXB0b3JzLmxlbmd0aCA+IDApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQUGVyc2lzdGFibGVSZWdpc3Rlckdyb3VwI2luaXRpYWxpemVGcm9tTWVtZW50byhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tTWVtZW50byhTdHJpbmcgbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlOb2RlIG5vZGUgPSBEZWJ1Z1BsdWdpbi5wYXJzZURvY3VtZW50KG1lbWVudG8pOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlhYm9ydChDb3JlTW9kZWxNZXNzYWdlcy5nZXRTdHJpbmcoIlBSZWdpc3Rlckdyb3VwLjAiKSwgbnVsbCk7Ci0JCX0KLQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmICghRUxFTUVOVF9SRUdJU1RFUl9HUk9VUC5lcXVhbHMoZWxlbWVudC5nZXROb2RlTmFtZSgpKSkgewotCQkJYWJvcnQoQ29yZU1vZGVsTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUmVnaXN0ZXJHcm91cC4xIiksIG51bGwpOwotCQl9Ci0JCVN0cmluZyBncm91cE5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSX0dST1VQX05BTUUpOwotCQlpZiAoZ3JvdXBOYW1lID09IG51bGwgfHwgZ3JvdXBOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWFib3J0KENvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiUFJlZ2lzdGVyR3JvdXAuMiIpLCBudWxsKTsKLQkJfQotCQlTdHJpbmcgZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJfR1JPVVBfRU5BQkxFRCk7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IEJvb2xlYW4udmFsdWVPZihlKS5ib29sZWFuVmFsdWUoKTsKLQkJUFJlZ2lzdGVyTWFuYWdlciBybSA9IGdldFJlZ2lzdGVyTWFuYWdlcigpOwotCQlBcnJheUxpc3Q8SVBSZWdpc3RlckRlc2NyaXB0b3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElQUmVnaXN0ZXJEZXNjcmlwdG9yPigpOwotCQlOb2RlIGNoaWxkTm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCkgY2hpbGROb2RlOwotCQkJCWlmIChFTEVNRU5UX1JFR0lTVEVSLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSX05BTUUpOwotCQkJCQlTdHJpbmcgb3JpZ2luYWxHcm91cE5hbWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoQVRUUl9SRUdJU1RFUl9PUklHSU5BTF9HUk9VUF9OQU1FKTsKLQkJCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgb3JpZ2luYWxHcm91cE5hbWUgPT0gbnVsbCB8fCBvcmlnaW5hbEdyb3VwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlhYm9ydChDb3JlTW9kZWxNZXNzYWdlcy5nZXRTdHJpbmcoIlBSZWdpc3Rlckdyb3VwLjMiKSwgbnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJUFJlZ2lzdGVyRGVzY3JpcHRvciBkID0gcm0uZmluZERlc2NyaXB0b3IoZ2V0VGFza3MoKSwgb3JpZ2luYWxHcm91cE5hbWUsIG5hbWUpOwotCQkJCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQkJCQlsaXN0LmFkZChkKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKENvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiUFJlZ2lzdGVyR3JvdXAuNCIpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXNldE5hbWUoZ3JvdXBOYW1lKTsKLQkJZlJlZ2lzdGVyRGVzY3JpcHRvcnMgPSAoSVBSZWdpc3RlckRlc2NyaXB0b3JbXSkgbGlzdC50b0FycmF5KG5ldyBJUFJlZ2lzdGVyRGVzY3JpcHRvcltsaXN0LnNpemUoKV0pOwotCQlzZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklFbmFibGVEaXNhYmxlVGFyZ2V0I2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZklzRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFJlZ2lzdGVyVmFsdWVzKCkgewotCQlpZiAoZlJlZ2lzdGVycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVnaXN0ZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoZlJlZ2lzdGVyc1tpXSAhPSBudWxsKSB7Ci0JCQkJKChQUmVnaXN0ZXIpIGZSZWdpc3RlcnNbaV0pLmludmFsaWRhdGVWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUVuYWJsZURpc2FibGVUYXJnZXQjc2V0RW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoZlJlZ2lzdGVycyAhPSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZSZWdpc3RlcnMpIHsKLQkJCQlpZiAoZlJlZ2lzdGVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlZ2lzdGVycy5sZW5ndGg7ICsraSkgewotCQkJCQkJaWYgKGZSZWdpc3RlcnNbaV0gaW5zdGFuY2VvZiBQUmVnaXN0ZXIpIHsKLQkJCQkJCQkoKFBSZWdpc3RlcikgZlJlZ2lzdGVyc1tpXSkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmSXNFbmFibGVkID0gZW5hYmxlZDsKLQkJZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuQ09OVEVOVCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBQZXJzaXN0YWJsZVJlZ2lzdGVyR3JvdXAjc2V0UmVnaXN0ZXJEZXNjcmlwdG9ycyhvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFJlZ2lzdGVyRGVzY3JpcHRvcltdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyRGVzY3JpcHRvcnMoSVBSZWdpc3RlckRlc2NyaXB0b3JbXSByZWdpc3RlckRlc2NyaXB0b3JzKSB7Ci0JCWludmFsaWRhdGUoKTsKLQkJZlJlZ2lzdGVyRGVzY3JpcHRvcnMgPSByZWdpc3RlckRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN1c3BlbmRlZCgpIHsKLQkJaWYgKGZSZWdpc3RlcnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlZ2lzdGVycy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGZSZWdpc3RlcnNbaV0gIT0gbnVsbCAmJiAoKFBSZWdpc3RlcikgZlJlZ2lzdGVyc1tpXSkuaGFzRXJyb3JzKCkpIHsKLQkJCQkoKFBSZWdpc3RlcikgZlJlZ2lzdGVyc1tpXSkucmVzZXRTdGF0dXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhYm9ydChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SLAotCQkJCW1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgUFJlZ2lzdGVyTWFuYWdlciBnZXRSZWdpc3Rlck1hbmFnZXIoKSB7Ci0JCXJldHVybiAoUFJlZ2lzdGVyTWFuYWdlcikgZ2V0U2Vzc2lvbigpLmdldEFkYXB0ZXIoUFJlZ2lzdGVyTWFuYWdlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludmFsaWRhdGUoKSB7Ci0JCWlmIChmUmVnaXN0ZXJzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZWdpc3RlcnMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChmUmVnaXN0ZXJzW2ldICE9IG51bGwpIHsKLQkJCQkoKFBSZWdpc3RlcikgZlJlZ2lzdGVyc1tpXSkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZSZWdpc3RlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QU2lnbmFsLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFNpZ25hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWJmYTczLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QU2lnbmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgUFNpZ25hbCBleHRlbmRzIFBEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJUFNpZ25hbCB7Ci0JcHJpdmF0ZSBmaW5hbCBJUERJU2lnbmFsIHBkaVNpZ25hbDsKLQotCXB1YmxpYyBQU2lnbmFsKElQU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBJUERJU2lnbmFsIHBkaVNpZ25hbCkgewotCQlzdXBlcihzZXNzaW9uLCB0YXNrcyk7Ci0JCXRoaXMucGRpU2lnbmFsID0gcGRpU2lnbmFsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsI2Nhbk1vZGlmeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KCkgewotCQkvLyBUT0RPIGFkZCBjYW5Nb2RpZnkgbWV0aG9kIHRvIElQRElTaWduYWwKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRQRElTaWduYWwoKS5nZXREZXNjcmlwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRQRElTaWduYWwoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTaWduYWwjaXNQYXNzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXNzRW5hYmxlZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAhZ2V0UERJU2lnbmFsKCkuaXNJZ25vcmUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbCNpc1N0b3BFbmFibGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0b3BFbmFibGVkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFBESVNpZ25hbCgpLmlzU3RvcFNldCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsI3NldFBhc3NFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFzc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWhhbmRsZShlbmFibGUsIGlzU3RvcEVuYWJsZWQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTaWduYWwjc2V0U3RvcEVuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdG9wRW5hYmxlZChib29sZWFuIGVuYWJsZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaGFuZGxlKGlzUGFzc0VuYWJsZWQoKSwgZW5hYmxlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbCNzaWduYWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNpZ25hbCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlnZXRQRElTZXNzaW9uKCkucmVzdW1lKGdldFRhc2tzKCksIGdldFBESVNpZ25hbCgpKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhc3MKLQkgKiBAcGFyYW0gc3RvcAotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlKGJvb2xlYW4gcGFzcywgYm9vbGVhbiBzdG9wKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQl0cnkgewotCQkJZ2V0UERJU2lnbmFsKCkuaGFuZGxlKCFwYXNzLCBzdG9wKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUERJU2lnbmFsIGdldFBESVNpZ25hbCgpIHsKLQkJcmV0dXJuIHBkaVNpZ25hbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFN0YWNrRnJhbWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QU3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y5MjQyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QU3RhY2tGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrUmV0cmlldmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVJlZ2lzdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JSnVtcFRvQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JSnVtcFRvTGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEdsb2JhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN0YXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN1bWVXaXRob3V0U2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSdW5Ub0FkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJ1blRvTGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVRhcmdldEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklQU291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5QU2Vzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBTdGFja0ZyYW1lIGV4dGVuZHMgUERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElQU3RhY2tGcmFtZSwgSVJlc3RhcnQsIElSZXN1bWVXaXRob3V0U2lnbmFsLCBJUERJRXZlbnRMaXN0ZW5lciB7Ci0JLyoqCi0JICogQHBhcmFtIGZyYW1lT25lCi0JICogQHBhcmFtIGZyYW1lVHdvCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBlcXVhbEZyYW1lKElQRElTdGFja0ZyYW1lIGZyYW1lT25lLCBJUERJU3RhY2tGcmFtZSBmcmFtZVR3bykgewotCQlpZiAoZnJhbWVPbmUgPT0gbnVsbCB8fCBmcmFtZVR3byA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJUERJTG9jYXRvciBsb2MxID0gKElQRElMb2NhdG9yKSBmcmFtZU9uZS5nZXRMb2NhdG9yKCk7Ci0JCUlQRElMb2NhdG9yIGxvYzIgPSAoSVBESUxvY2F0b3IpIGZyYW1lVHdvLmdldExvY2F0b3IoKTsKLQkJaWYgKGxvYzEgPT0gbnVsbCB8fCBsb2MyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChsb2MxLmdldEZpbGUoKSAhPSBudWxsICYmIGxvYzEuZ2V0RmlsZSgpLmxlbmd0aCgpID4gMCAmJiBsb2MyLmdldEZpbGUoKSAhPSBudWxsICYmIGxvYzIuZ2V0RmlsZSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIGxvYzEuZ2V0RmlsZSgpLmVxdWFscyhsb2MyLmdldEZpbGUoKSkpIHsKLQkJCWlmIChsb2MxLmdldEZ1bmN0aW9uKCkgIT0gbnVsbCAmJiBsb2MxLmdldEZ1bmN0aW9uKCkubGVuZ3RoKCkgPiAwICYmIGxvYzIuZ2V0RnVuY3Rpb24oKSAhPSBudWxsCi0JCQkJCSYmIGxvYzIuZ2V0RnVuY3Rpb24oKS5sZW5ndGgoKSA+IDAgJiYgbG9jMS5nZXRGdW5jdGlvbigpLmVxdWFscyhsb2MyLmdldEZ1bmN0aW9uKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobG9jMS5nZXRGaWxlKCkgPT0gbnVsbCB8fCBsb2MxLmdldEZpbGUoKS5sZW5ndGgoKSA8IDEpICYmIChsb2MyLmdldEZpbGUoKSA9PSBudWxsIHx8IGxvYzIuZ2V0RmlsZSgpLmxlbmd0aCgpIDwgMSkpIHsKLQkJCWlmIChsb2MxLmdldEZ1bmN0aW9uKCkgIT0gbnVsbCAmJiBsb2MxLmdldEZ1bmN0aW9uKCkubGVuZ3RoKCkgPiAwICYmIGxvYzIuZ2V0RnVuY3Rpb24oKSAhPSBudWxsCi0JCQkJCSYmIGxvYzIuZ2V0RnVuY3Rpb24oKS5sZW5ndGgoKSA+IDAgJiYgbG9jMS5nZXRGdW5jdGlvbigpLmVxdWFscyhsb2MyLmdldEZ1bmN0aW9uKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobG9jMS5nZXRGaWxlKCkgPT0gbnVsbCB8fCBsb2MxLmdldEZpbGUoKS5sZW5ndGgoKSA8IDEpICYmIChsb2MyLmdldEZpbGUoKSA9PSBudWxsIHx8IGxvYzIuZ2V0RmlsZSgpLmxlbmd0aCgpIDwgMSkKLQkJCQkmJiAobG9jMS5nZXRGdW5jdGlvbigpID09IG51bGwgfHwgbG9jMS5nZXRGdW5jdGlvbigpLmxlbmd0aCgpIDwgMSkKLQkJCQkmJiAobG9jMi5nZXRGdW5jdGlvbigpID09IG51bGwgfHwgbG9jMi5nZXRGdW5jdGlvbigpLmxlbmd0aCgpIDwgMSkpIHsKLQkJCWlmIChsb2MxLmdldEFkZHJlc3MoKSA9PSBsb2MyLmdldEFkZHJlc3MoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJUERJU3RhY2tGcmFtZSBwZGlTdGFja0ZyYW1lOwotCXByaXZhdGUgSVBESVN0YWNrRnJhbWUgbGFzdFBESVN0YWNrRnJhbWU7Ci0JcHJpdmF0ZSBQVGhyZWFkIGZUaHJlYWQ7Ci0JcHJpdmF0ZSBMaXN0PElQVmFyaWFibGU+IGZWYXJpYWJsZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZWZyZXNoVmFyaWFibGVzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3Q8UEV4cHJlc3Npb24+IGZFeHByZXNzaW9uczsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNEaXNwb3NlZCA9IGZhbHNlOwotCi0JcHVibGljIFBTdGFja0ZyYW1lKFBUaHJlYWQgdGhyZWFkLCBJUERJU3RhY2tGcmFtZSBwZGlGcmFtZSkgewotCQlzdXBlcih0aHJlYWQuZ2V0U2Vzc2lvbigpLCB0aHJlYWQuZ2V0VGFza3MoKSk7Ci0JCXNldFBESVN0YWNrRnJhbWUocGRpRnJhbWUpOwotCQlzZXRUaHJlYWQodGhyZWFkKTsKLQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLmFkZEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lI2NhbkV2YWx1YXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FdmFsdWF0ZSgpIHsKLQkJcmV0dXJuIGdldERlYnVnVGFyZ2V0KCkuaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JSnVtcFRvQWRkcmVzcyNjYW5KdW1wVG9BZGRyZXNzKGphdmEubWF0aC5CaWdJbnRlZ2VyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkp1bXBUb0FkZHJlc3MoQmlnSW50ZWdlciBhZGRyZXNzKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5SZXN1bWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JSnVtcFRvTGluZSNjYW5KdW1wVG9MaW5lKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLCBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSnVtcFRvTGluZShJRmlsZSBmaWxlLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuUmVzdW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUp1bXBUb0xpbmUjY2FuSnVtcFRvTGluZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSnVtcFRvTGluZShTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5SZXN1bWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUmVzdGFydCNjYW5SZXN0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0KCkgewotCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKSBpbnN0YW5jZW9mIElSZXN0YXJ0ICYmICgoSVJlc3RhcnQpIGdldERlYnVnVGFyZ2V0KCkpLmNhblJlc3RhcnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI2NhblJlc3VtZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lKCkgewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuUmVzdW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3VtZVdpdGhvdXRTaWduYWwjY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpIHsKLQkJcmV0dXJuIChnZXREZWJ1Z1RhcmdldCgpIGluc3RhbmNlb2YgSVJlc3VtZVdpdGhvdXRTaWduYWwgJiYgKChJUmVzdW1lV2l0aG91dFNpZ25hbCkgZ2V0RGVidWdUYXJnZXQoKSkKLQkJCQkuY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUnVuVG9BZGRyZXNzI2NhblJ1blRvQWRkcmVzcyhqYXZhLm1hdGguQmlnSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5Ub0FkZHJlc3MoQmlnSW50ZWdlciBhZGRyZXNzKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5SZXN1bWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUnVuVG9MaW5lI2NhblJ1blRvTGluZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJ1blRvTGluZShJRmlsZSBmaWxlLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuUmVzdW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJ1blRvTGluZSNjYW5SdW5Ub0xpbmUoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJ1blRvTGluZShTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5SZXN1bWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBJbnRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwSW50bygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBleGlzdHMoKSAvKiAmJiBpc1RvcFN0YWNrRnJhbWUoKSAqLyYmIGdldFRocmVhZCgpLmNhblN0ZXBJbnRvKCk7Ci0JCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNjYW5TdGVwT3ZlcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcE92ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZXhpc3RzKCkgJiYgZ2V0VGhyZWFkKCkuY2FuU3RlcE92ZXIoKTsKLQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJbG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjY2FuU3RlcFJldHVybigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcFJldHVybigpIHsKLQkJdHJ5IHsKLQkJCWlmICghZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaXN0PElTdGFja0ZyYW1lPiBmcmFtZXMgPSAoKFBUaHJlYWQpIGdldFRocmVhZCgpKS5jb21wdXRlU3RhY2tGcmFtZXMoKTsKLQkJCWlmIChmcmFtZXMgIT0gbnVsbCAmJiAhZnJhbWVzLmlzRW1wdHkoKSkgewotCQkJCWJvb2xlYW4gYm90dG9tRnJhbWUgPSB0aGlzLmVxdWFscyhmcmFtZXMuZ2V0KGZyYW1lcy5zaXplKCkgLSAxKSk7Ci0JCQkJcmV0dXJuICFib3R0b21GcmFtZSAmJiBnZXRUaHJlYWQoKS5jYW5TdGVwUmV0dXJuKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI2NhblN1c3BlbmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdXNwZW5kKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI2NhblRlcm1pbmF0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkgewotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQl0cnkgewotCQkJZXhpc3RzID0gZXhpc3RzKCk7Ci0JCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBleGlzdHMgJiYgZ2V0VGhyZWFkKCkuY2FuVGVybWluYXRlKCkgfHwgZ2V0RGVidWdUYXJnZXQoKS5jYW5UZXJtaW5hdGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWUjZXZhbHVhdGVFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElWYWx1ZSBldmFsdWF0ZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb25UZXh0KSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoIWlzRGlzcG9zZWQoKSkgewotCQkJUEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb24oZXhwcmVzc2lvblRleHQpOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBleHByZXNzaW9uLmdldFZhbHVlKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZSNldmFsdWF0ZUV4cHJlc3Npb25Ub1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXZhbHVhdGVFeHByZXNzaW9uVG9TdHJpbmcoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UERJVGFyZ2V0KCkuZXZhbHVhdGVFeHByZXNzaW9uVG9TdHJpbmcoZ2V0UERJU3RhY2tGcmFtZSgpLCBleHByZXNzaW9uKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z0VsZW1lbnQjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgPT0gSVJ1blRvTGluZS5jbGFzcykgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgPT0gSVJ1blRvQWRkcmVzcy5jbGFzcykgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgPT0gSUp1bXBUb0xpbmUuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmIChhZGFwdGVyID09IElKdW1wVG9BZGRyZXNzLmNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoYWRhcHRlciA9PSBJUFN0YWNrRnJhbWUuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmIChhZGFwdGVyID09IElTdGFja0ZyYW1lLmNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoYWRhcHRlciA9PSBJUERJU3RhY2tGcmFtZS5jbGFzcykgewotCQkJcmV0dXJuIGdldFBESVN0YWNrRnJhbWUoKTsKLQkJfQotCQlpZiAoYWRhcHRlciA9PSBJTWVtb3J5QmxvY2tSZXRyaWV2YWwuY2xhc3MpIHsKLQkJCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lI2dldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEFkZHJlc3MoKSB7Ci0JCXJldHVybiBnZXRQRElTdGFja0ZyYW1lKCkuZ2V0TG9jYXRvcigpLmdldEFkZHJlc3MoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldENoYXJFbmQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhckVuZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldENoYXJTdGFydCgpCi0JICovCi0JcHVibGljIGludCBnZXRDaGFyU3RhcnQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudCNnZXREZWJ1Z1RhcmdldCgpCi0JICovCi0JcHVibGljIFBEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJcmV0dXJuIGZUaHJlYWQuZ2V0RGVidWdUYXJnZXQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWUjZ2V0RmlsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlKCkgewotCQlyZXR1cm4gZ2V0UERJU3RhY2tGcmFtZSgpLmdldExvY2F0b3IoKS5nZXRGaWxlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lI2dldEZyYW1lTGluZU51bWJlcigpCi0JICovCi0JcHVibGljIGludCBnZXRGcmFtZUxpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBnZXRQRElTdGFja0ZyYW1lKCkuZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWUjZ2V0RnVuY3Rpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb24oKSB7Ci0JCXJldHVybiBnZXRQRElTdGFja0ZyYW1lKCkuZ2V0TG9jYXRvcigpLmdldEZ1bmN0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lI2dldExldmVsKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExldmVsKCkgewotCQlyZXR1cm4gZ2V0UERJU3RhY2tGcmFtZSgpLmdldExldmVsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXRMaW5lTnVtYmVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoaXNTdXNwZW5kZWQoKSkgewotCQkJSVNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IGdldExhdW5jaCgpLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJCWlmIChsb2NhdG9yICE9IG51bGwgJiYgbG9jYXRvciBpbnN0YW5jZW9mIElBZGFwdGFibGUKLQkJCQkJJiYgKChJQWRhcHRhYmxlKSBsb2NhdG9yKS5nZXRBZGFwdGVyKElQU291cmNlTG9jYXRvci5jbGFzcykgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKChJUFNvdXJjZUxvY2F0b3IpICgoSUFkYXB0YWJsZSkgbG9jYXRvcikuZ2V0QWRhcHRlcihJUFNvdXJjZUxvY2F0b3IuY2xhc3MpKS5nZXRMaW5lTnVtYmVyKHRoaXMpOwotCQkJaWYgKGdldFBESVN0YWNrRnJhbWUoKSAhPSBudWxsICYmIGdldFBESVN0YWNrRnJhbWUoKS5nZXRMb2NhdG9yKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0UERJU3RhY2tGcmFtZSgpLmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJSVBESUxvY2F0b3IgbG9jYXRvciA9IChJUERJTG9jYXRvcikgZ2V0UERJU3RhY2tGcmFtZSgpLmdldExvY2F0b3IoKTsKLQkJU3RyaW5nIGZ1bmMgPSAiIjsKLQkJU3RyaW5nIGZpbGUgPSAiIjsKLQkJU3RyaW5nIGxpbmUgPSAiIjsKLQkJaWYgKGxvY2F0b3IuZ2V0RnVuY3Rpb24oKSAhPSBudWxsICYmIGxvY2F0b3IuZ2V0RnVuY3Rpb24oKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJZnVuYyArPSBsb2NhdG9yLmdldEZ1bmN0aW9uKCkgKyAiKCkgIjsKLQkJaWYgKGxvY2F0b3IuZ2V0RmlsZSgpICE9IG51bGwgJiYgbG9jYXRvci5nZXRGaWxlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJZmlsZSA9IGxvY2F0b3IuZ2V0RmlsZSgpOwotCQkJaWYgKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpICE9IDApIHsKLQkJCQlsaW5lID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCkuZm9ybWF0KG5ldyBJbnRlZ2VyKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZnVuYzsKLQkJfQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29yZU1vZGVsTWVzc2FnZXMuZ2V0U3RyaW5nKCJQU3RhY2tGcmFtZS4wIiksIG5ldyBPYmplY3RbXSB7IGZ1bmMsIGZpbGUsIGxpbmUgfSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lI2dldFBESVN0YWNrRnJhbWUoKQotCSAqLwotCXB1YmxpYyBJUERJU3RhY2tGcmFtZSBnZXRQRElTdGFja0ZyYW1lKCkgewotCQlyZXR1cm4gcGRpU3RhY2tGcmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWUjZ2V0UERJVGhyZWFkKCkKLQkgKi8KLQlwdWJsaWMgSVBESVRocmVhZCBnZXRQRElUaHJlYWQoKSB7Ci0JCXJldHVybiAoSVBESVRocmVhZCkgKChQVGhyZWFkKSBnZXRUaHJlYWQoKSkuZ2V0UERJVGhyZWFkKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXRSZWdpc3Rlckdyb3VwcygpCi0JICovCi0JcHVibGljIElSZWdpc3Rlckdyb3VwW10gZ2V0UmVnaXN0ZXJHcm91cHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gKGlzRGlzcG9zZWQoKSkgPyBuZXcgSVJlZ2lzdGVyR3JvdXBbMF0gOiBmU2Vzc2lvbi5nZXRSZWdpc3Rlck1hbmFnZXIoKS5nZXRSZWdpc3Rlckdyb3VwcyhnZXRUYXNrcygpLCB0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldFRocmVhZCgpCi0JICovCi0JcHVibGljIElUaHJlYWQgZ2V0VGhyZWFkKCkgewotCQlyZXR1cm4gZlRocmVhZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldFZhcmlhYmxlcygpCi0JICovCi0JcHVibGljIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChpc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBuZXcgSVZhcmlhYmxlWzBdOwotCQl9Ci0JCUlQR2xvYmFsVmFyaWFibGVbXSBnbG9iYWxzID0gZ2V0R2xvYmFscygpOwotCQlMaXN0PElQVmFyaWFibGU+IHZhcnMgPSBnZXRWYXJpYWJsZXMwKCk7Ci0JCUxpc3Q8SVBWYXJpYWJsZT4gYWxsID0gbmV3IEFycmF5TGlzdDxJUFZhcmlhYmxlPihnbG9iYWxzLmxlbmd0aCArIHZhcnMuc2l6ZSgpKTsKLQkJYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KGdsb2JhbHMpKTsKLQkJYWxsLmFkZEFsbCh2YXJzKTsKLQkJcmV0dXJuIChJVmFyaWFibGVbXSkgYWxsLnRvQXJyYXkobmV3IElWYXJpYWJsZVthbGwuc2l6ZSgpXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyI2hhbmRsZURlYnVnRXZlbnRzKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhJUERJRXZlbnRbXSBldmVudHMpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2hhc1JlZ2lzdGVyR3JvdXBzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3Rlckdyb3VwcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAoaXNEaXNwb3NlZCgpKSA/IGZhbHNlCi0JCQkJOiBnZXREZWJ1Z1RhcmdldCgpLmZTZXNzaW9uLmdldFJlZ2lzdGVyTWFuYWdlcigpLmdldFJlZ2lzdGVyR3JvdXBzKGdldFRhc2tzKCksIHRoaXMpLmxlbmd0aCA+IDA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNoYXNWYXJpYWJsZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYXJpYWJsZXMwKCkuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2lzU3RlcHBpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RlcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5pc1N0ZXBwaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNpc1N1c3BlbmRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5pc1N1c3BlbmRlZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRlcm1pbmF0ZSNpc1Rlcm1pbmF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmlzVGVybWluYXRlZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklKdW1wVG9BZGRyZXNzI2p1bXBUb0FkZHJlc3MoamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0JICovCi0JcHVibGljIHZvaWQganVtcFRvQWRkcmVzcyhCaWdJbnRlZ2VyIGFkZHJlc3MpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuSnVtcFRvQWRkcmVzcyhhZGRyZXNzKSkKLQkJCXJldHVybjsKLQotCQlJUERJTG9jYXRpb24gbG9jYXRpb24gPSBnZXRQRElTZXNzaW9uKCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5jcmVhdGVBZGRyZXNzTG9jYXRpb24oYWRkcmVzcyk7Ci0JCXRyeSB7Ci0JCQlnZXRQRElTZXNzaW9uKCkucmVzdW1lKGdldFRhc2tzKCksIGxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUp1bXBUb0xpbmUjanVtcFRvTGluZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGp1bXBUb0xpbmUoSUZpbGUgZmlsZSwgaW50IGxpbmVOdW1iZXIpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuSnVtcFRvTGluZShmaWxlLCBsaW5lTnVtYmVyKSkKLQkJCXJldHVybjsKLQkJanVtcFRvTGluZShmaWxlLmdldExvY2F0aW9uKCkubGFzdFNlZ21lbnQoKSwgbGluZU51bWJlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUp1bXBUb0xpbmUjanVtcFRvTGluZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQganVtcFRvTGluZShTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoIWNhbkp1bXBUb0xpbmUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpKQotCQkJcmV0dXJuOwotCQlJUERJTG9jYXRpb24gbG9jYXRpb24gPSBnZXRQRElTZXNzaW9uKCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5jcmVhdGVMaW5lTG9jYXRpb24oZmlsZU5hbWUsIGxpbmVOdW1iZXIpOwotCQl0cnkgewotCQkJZ2V0UERJU2Vzc2lvbigpLnJlc3VtZShnZXRUYXNrcygpLCBsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0YXJnZXRSZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN0YXJ0I3Jlc3RhcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoY2FuUmVzdGFydCgpKSB7Ci0JCQkoKElSZXN0YXJ0KSBnZXREZWJ1Z1RhcmdldCgpKS5yZXN0YXJ0KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI3Jlc3VtZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJZ2V0VGhyZWFkKCkucmVzdW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3VtZVdpdGhvdXRTaWduYWwjcmVzdW1lV2l0aG91dFNpZ25hbCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lV2l0aG91dFNpZ25hbCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChjYW5SZXN1bWVXaXRob3V0U2lnbmFsKCkpIHsKLQkJCSgoSVJlc3VtZVdpdGhvdXRTaWduYWwpIGdldERlYnVnVGFyZ2V0KCkpLnJlc3VtZVdpdGhvdXRTaWduYWwoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSdW5Ub0FkZHJlc3MjcnVuVG9BZGRyZXNzKGphdmEubWF0aC5CaWdJbnRlZ2VyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blRvQWRkcmVzcyhCaWdJbnRlZ2VyIGFkZHJlc3MsIGJvb2xlYW4gc2tpcEJyZWFrcG9pbnRzKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoIWNhblJ1blRvQWRkcmVzcyhhZGRyZXNzKSkKLQkJCXJldHVybjsKLQkJaWYgKHNraXBCcmVha3BvaW50cykgewotCQkJZlNlc3Npb24uZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5za2lwQnJlYWtwb2ludHModHJ1ZSk7Ci0JCX0KLQkJSVBESUxvY2F0aW9uIGxvY2F0aW9uID0gZ2V0UERJU2Vzc2lvbigpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuY3JlYXRlQWRkcmVzc0xvY2F0aW9uKGFkZHJlc3MpOwotCQl0cnkgewotCQkJZ2V0UERJU2Vzc2lvbigpLnN0ZXBVbnRpbChnZXRUYXNrcygpLCBsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoc2tpcEJyZWFrcG9pbnRzKSB7Ci0JCQkJZlNlc3Npb24uZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5za2lwQnJlYWtwb2ludHMoZmFsc2UpOwotCQkJfQotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUnVuVG9MaW5lI3J1blRvTGluZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blRvTGluZShJRmlsZSBmaWxlLCBpbnQgbGluZU51bWJlciwgYm9vbGVhbiBza2lwQnJlYWtwb2ludHMpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuUnVuVG9MaW5lKGZpbGUsIGxpbmVOdW1iZXIpKQotCQkJcmV0dXJuOwotCQlydW5Ub0xpbmUoZmlsZS5nZXRMb2NhdGlvbigpLmxhc3RTZWdtZW50KCksIGxpbmVOdW1iZXIsIHNraXBCcmVha3BvaW50cyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJ1blRvTGluZSNydW5Ub0xpbmUoamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blRvTGluZShTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCBib29sZWFuIHNraXBCcmVha3BvaW50cykgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5SdW5Ub0xpbmUoZmlsZU5hbWUsIGxpbmVOdW1iZXIpKQotCQkJcmV0dXJuOwotCQlpZiAoc2tpcEJyZWFrcG9pbnRzKSB7Ci0JCQlmU2Vzc2lvbi5nZXRCcmVha3BvaW50TWFuYWdlcigpLnNraXBCcmVha3BvaW50cyh0cnVlKTsKLQkJfQotCQlJUERJTG9jYXRpb24gbG9jYXRpb24gPSBnZXRQRElTZXNzaW9uKCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5jcmVhdGVMaW5lTG9jYXRpb24oZmlsZU5hbWUsIGxpbmVOdW1iZXIpOwotCQl0cnkgewotCQkJZ2V0UERJU2Vzc2lvbigpLnN0ZXBVbnRpbChnZXRUYXNrcygpLCBsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoc2tpcEJyZWFrcG9pbnRzKSB7Ci0JCQkJZlNlc3Npb24uZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5za2lwQnJlYWtwb2ludHMoZmFsc2UpOwotCQkJfQotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI3N0ZXBJbnRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChjYW5TdGVwSW50bygpKSB7Ci0JCQlnZXRUaHJlYWQoKS5zdGVwSW50bygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNzdGVwT3ZlcigpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcE92ZXIoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoY2FuU3RlcE92ZXIoKSkgewotCQkJZ2V0VGhyZWFkKCkuc3RlcE92ZXIoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjc3RlcFJldHVybigpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcFJldHVybigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChjYW5TdGVwUmV0dXJuKCkpIHsKLQkJCWdldFRocmVhZCgpLnN0ZXBSZXR1cm4oKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjc3VzcGVuZCgpCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWdldFRocmVhZCgpLnN1c3BlbmQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjdGVybWluYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoZ2V0VGhyZWFkKCkuY2FuVGVybWluYXRlKCkpIHsKLQkJCWdldFRocmVhZCgpLnRlcm1pbmF0ZSgpOwotCQl9IGVsc2UgewotCQkJZ2V0RGVidWdUYXJnZXQoKS50ZXJtaW5hdGUoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblRleHQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIFBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb25UZXh0KSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZkV4cHJlc3Npb25zID09IG51bGwpIHsKLQkJCWZFeHByZXNzaW9ucyA9IG5ldyBBcnJheUxpc3Q8UEV4cHJlc3Npb24+KDUpOwotCQl9Ci0JCVBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCQlJdGVyYXRvcjxQRXhwcmVzc2lvbj4gaXQgPSBmRXhwcmVzc2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZXhwcmVzc2lvbiA9IChQRXhwcmVzc2lvbikgaXQubmV4dCgpOwotCQkJaWYgKGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblRleHQoKS5jb21wYXJlVG8oZXhwcmVzc2lvblRleHQpID09IDApIHsKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJSVBESVRhcmdldEV4cHJlc3Npb24gcGRpRXhwcmVzc2lvbiA9IGdldFBESVNlc3Npb24oKS5nZXRFeHByZXNzaW9uTWFuYWdlcigpCi0JCQkJCS5jcmVhdGVFeHByZXNzaW9uKGdldFRhc2tzKCksIGV4cHJlc3Npb25UZXh0KTsKLQkJCWV4cHJlc3Npb24gPSBuZXcgUEV4cHJlc3Npb24odGhpcywgcGRpRXhwcmVzc2lvbiwgbnVsbCk7Ci0JCQlmRXhwcmVzc2lvbnMuYWRkKGV4cHJlc3Npb24pOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVBHbG9iYWxWYXJpYWJsZVtdIGdldEdsb2JhbHMoKSB7Ci0JCS8vIFRPRE8gTm90IGltcGxlbWVudCBQU3RhY2tGcmFtZSAtIGdldEdsb2JhbHMoKSB5ZXQKLQkJcmV0dXJuIG5ldyBJUEdsb2JhbFZhcmlhYmxlWzBdOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZUV4cHJlc3Npb25zKCkgewotCQlpZiAoZkV4cHJlc3Npb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yPFBFeHByZXNzaW9uPiBpdCA9IGZFeHByZXNzaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQRXhwcmVzc2lvbiBleHAgPSAoUEV4cHJlc3Npb24pIGl0Lm5leHQoKTsKLQkJCWV4cC5wcmVzZXJ2ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByZXNlcnZlVmFyaWFibGVzKCkgewotCQlpZiAoZlZhcmlhYmxlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjxJUFZhcmlhYmxlPiBpdCA9IGZWYXJpYWJsZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQWJzdHJhY3RQVmFyaWFibGUgYXYgPSAoQWJzdHJhY3RQVmFyaWFibGUpIGl0Lm5leHQoKTsKLQkJCWF2LnByZXNlcnZlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hWYXJpYWJsZXMoKSB7Ci0JCXJldHVybiBmUmVmcmVzaFZhcmlhYmxlczsKLQl9Ci0KLQkvLyBGSVhNRSAtIGNvbW1lbnRlZCBzeW5jaHJvbml6ZWQgdG8gcHJldmVudCBoYW5naW5nIGhlcmUKLQkvKioKLQkgKiBAcGFyYW0gaXNEaXNwb3NlZAotCSAqLwotCXByaXZhdGUvKiBzeW5jaHJvbml6ZWQgKi92b2lkIHNldERpc3Bvc2VkKGJvb2xlYW4gaXNEaXNwb3NlZCkgewotCQlmSXNEaXNwb3NlZCA9IGlzRGlzcG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZnJlc2gKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UmVmcmVzaFZhcmlhYmxlcyhib29sZWFuIHJlZnJlc2gpIHsKLQkJZlJlZnJlc2hWYXJpYWJsZXMgPSByZWZyZXNoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNldERpc3Bvc2VkKHRydWUpOwotCQlnZXRQRElTZXNzaW9uKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQkJZGlzcG9zZUFsbFZhcmlhYmxlcygpOwotCQlkaXNwb3NlRXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQWxsVmFyaWFibGVzKCkgewotCQlpZiAoZlZhcmlhYmxlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjxJUFZhcmlhYmxlPiBpdCA9IGZWYXJpYWJsZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChQVmFyaWFibGUpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQl9Ci0JCWZWYXJpYWJsZXMuY2xlYXIoKTsKLQkJZlZhcmlhYmxlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUV4cHJlc3Npb25zKCkgewotCQlpZiAoZkV4cHJlc3Npb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFBFeHByZXNzaW9uPiBpdCA9IGZFeHByZXNzaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCSgoUEV4cHJlc3Npb24pIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJfQotCQkJZkV4cHJlc3Npb25zLmNsZWFyKCk7Ci0JCX0KLQkJZkV4cHJlc3Npb25zID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TdGVwUmV0dXJuKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWdldFBESVNlc3Npb24oKS5zdGVwUmV0dXJuKGdldFRhc2tzKCksIDApOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4aXN0cygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAoKFBUaHJlYWQpIGdldFRocmVhZCgpKS5jb21wdXRlU3RhY2tGcmFtZXMoKS5pbmRleE9mKHRoaXMpICE9IC0xOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHBhcmFtIHZhcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBmaW5kVmFyaWFibGUoTGlzdDxJUERJVmFyaWFibGVEZXNjcmlwdG9yPiBsaXN0LCBQVmFyaWFibGUgdmFyKSB7Ci0JCUl0ZXJhdG9yPElQRElWYXJpYWJsZURlc2NyaXB0b3I+IGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUERJVmFyaWFibGVEZXNjcmlwdG9yIG5ld1Zhck9iamVjdCA9IChJUERJVmFyaWFibGVEZXNjcmlwdG9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAodmFyLnNhbWVWYXJpYWJsZShuZXdWYXJPYmplY3QpKQotCQkJCXJldHVybiBuZXdWYXJPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxJUERJVmFyaWFibGVEZXNjcmlwdG9yPiBnZXRBbGxQRElWYXJpYWJsZU9iamVjdHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlMaXN0PElQRElWYXJpYWJsZURlc2NyaXB0b3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElQRElWYXJpYWJsZURlc2NyaXB0b3I+KCk7Ci0JCWxpc3QuYWRkQWxsKGdldFBESUFyZ3VtZW50T2JqZWN0cygpKTsKLQkJbGlzdC5hZGRBbGwoZ2V0UERJTG9jYWxWYXJpYWJsZU9iamVjdHMoKSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBESVN0YWNrRnJhbWUgZ2V0TGFzdFBESVN0YWNrRnJhbWUoKSB7Ci0JCXJldHVybiBsYXN0UERJU3RhY2tGcmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBMaXN0PElQRElWYXJpYWJsZURlc2NyaXB0b3I+IGdldFBESUFyZ3VtZW50T2JqZWN0cygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVBESVZhcmlhYmxlRGVzY3JpcHRvcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBESVZhcmlhYmxlRGVzY3JpcHRvcj4oKTsKLQkJdHJ5IHsKLQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0UERJU3RhY2tGcmFtZSgpLmdldEFyZ3VtZW50RGVzY3JpcHRvcnMoKSkpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxJUERJVmFyaWFibGVEZXNjcmlwdG9yPiBnZXRQRElMb2NhbFZhcmlhYmxlT2JqZWN0cygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVBESVZhcmlhYmxlRGVzY3JpcHRvcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBESVZhcmlhYmxlRGVzY3JpcHRvcj4oKTsKLQkJdHJ5IHsKLQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0UERJU3RhY2tGcmFtZSgpLmdldExvY2FsVmFyaWFibGVEZXNjcmlwdG9ycygpKSk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0YXJnZXRSZXF1ZXN0RmFpbGVkKGUuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTGlzdDxJUFZhcmlhYmxlPiBnZXRWYXJpYWJsZXMwKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJUFRocmVhZCB0aHJlYWQgPSAoUFRocmVhZCkgZ2V0VGhyZWFkKCk7Ci0JCWlmICh0aHJlYWQuaXNTdXNwZW5kZWQoKSkgewotCQkJaWYgKGZWYXJpYWJsZXMgPT0gbnVsbCkgewotCQkJCUxpc3Q8SVBESVZhcmlhYmxlRGVzY3JpcHRvcj4gdmFycyA9IGdldEFsbFBESVZhcmlhYmxlT2JqZWN0cygpOwotCQkJCWZWYXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PElQVmFyaWFibGU+KHZhcnMuc2l6ZSgpKTsKLQkJCQlJdGVyYXRvcjxJUERJVmFyaWFibGVEZXNjcmlwdG9yPiBpdCA9IHZhcnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWZWYXJpYWJsZXMuYWRkKFBWYXJpYWJsZUZhY3RvcnkuY3JlYXRlTG9jYWxWYXJpYWJsZSh0aGlzLCAoSVBESVZhcmlhYmxlRGVzY3JpcHRvcikgaXQubmV4dCgpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZhcmlhYmxlcygpKSB7Ci0JCQkJCXVwZGF0ZVZhcmlhYmxlcygpOwotCQkJCX0KLQkJCX0KLQkJCXNldFJlZnJlc2hWYXJpYWJsZXMoZmFsc2UpOwotCQl9Ci0JCXJldHVybiAoZlZhcmlhYmxlcyAhPSBudWxsKSA/IGZWYXJpYWJsZXMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gZklzRGlzcG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RvcFN0YWNrRnJhbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJU3RhY2tGcmFtZSB0b3MgPSBnZXRUaHJlYWQoKS5nZXRUb3BTdGFja0ZyYW1lKCk7Ci0JCXJldHVybiB0b3MgIT0gbnVsbCAmJiB0b3MuZXF1YWxzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVzZXJ2ZSgpIHsKLQkJcHJlc2VydmVWYXJpYWJsZXMoKTsKLQkJcHJlc2VydmVFeHByZXNzaW9ucygpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmcmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFBESVN0YWNrRnJhbWUoSVBESVN0YWNrRnJhbWUgZnJhbWUpIHsKLQkJaWYgKGZyYW1lICE9IG51bGwpIHsKLQkJCWxhc3RQRElTdGFja0ZyYW1lID0gZnJhbWU7Ci0JCX0gZWxzZSB7Ci0JCQlsYXN0UERJU3RhY2tGcmFtZSA9IHBkaVN0YWNrRnJhbWU7Ci0JCX0KLQkJcGRpU3RhY2tGcmFtZSA9IGZyYW1lOwotCQlzZXRSZWZyZXNoVmFyaWFibGVzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUaHJlYWQoUFRocmVhZCB0aHJlYWQpIHsKLQkJZlRocmVhZCA9IHRocmVhZDsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJTGlzdDxJUERJVmFyaWFibGVEZXNjcmlwdG9yPiBsb2NhbHMgPSBnZXRBbGxQRElWYXJpYWJsZU9iamVjdHMoKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgZlZhcmlhYmxlcy5zaXplKCkpIHsKLQkJCUlQRElWYXJpYWJsZURlc2NyaXB0b3IgdmFyT2JqZWN0ID0gZmluZFZhcmlhYmxlKGxvY2FscywgKFBWYXJpYWJsZSkgZlZhcmlhYmxlcy5nZXQoaW5kZXgpKTsKLQkJCWlmICh2YXJPYmplY3QgIT0gbnVsbCkgewotCQkJCWxvY2Fscy5yZW1vdmUodmFyT2JqZWN0KTsKLQkJCQlpbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQkvLyByZW1vdmUgdmFyaWFibGUKLQkJCQlmVmFyaWFibGVzLnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIGFueSBuZXcgbG9jYWxzCi0JCUl0ZXJhdG9yPElQRElWYXJpYWJsZURlc2NyaXB0b3I+IG5ld09uZXMgPSBsb2NhbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG5ld09uZXMuaGFzTmV4dCgpKSB7Ci0JCQlmVmFyaWFibGVzLmFkZChQVmFyaWFibGVGYWN0b3J5LmNyZWF0ZUxvY2FsVmFyaWFibGUodGhpcywgKElQRElWYXJpYWJsZURlc2NyaXB0b3IpIG5ld09uZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFRocmVhZC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxOGFlNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2tSZXRyaWV2YWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUEJyZWFrcG9pbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklKdW1wVG9BZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklKdW1wVG9MaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRHVtbXlTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUmVzdGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUmVzdW1lV2l0aG91dFNpZ25hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUnVuVG9BZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSdW5Ub0xpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudFN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJQnJlYWtwb2ludEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFbmRTdGVwcGluZ1JhbmdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUZ1bmN0aW9uRmluaXNoZWRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJTG9jYXRpb25SZWFjaGVkSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVNoYXJlZExpYnJhcnlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJU2lnbmFsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVdhdGNocG9pbnRTY29wZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElXYXRjaHBvaW50VHJpZ2dlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVGhyZWFkOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQVGhyZWFkIGV4dGVuZHMgUERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElQVGhyZWFkLCBJUmVzdGFydCwgSVJlc3VtZVdpdGhvdXRTaWduYWwsIElQRElFdmVudExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1NUQUNLX0RFUFRIID0gMTAwOwotCXByaXZhdGUgSVBESVRocmVhZCBwZGlUaHJlYWQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SVN0YWNrRnJhbWU+IGZTdGFja0ZyYW1lczsKLQlwcml2YXRlIGJvb2xlYW4gZlJlZnJlc2hDaGlsZHJlbiA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0N1cnJlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGludCBmTGFzdFN0YWNrRGVwdGggPSAwOwotCXByaXZhdGUgYm9vbGVhbiBmRGlzcG9zZWQgPSBmYWxzZTsKLQlwcml2YXRlIFBEZWJ1Z1RhcmdldCBmRGVidWdUYXJnZXQgPSBudWxsOwotCi0JcHVibGljIFBUaHJlYWQoUERlYnVnVGFyZ2V0IHRhcmdldCwgSVBESVRocmVhZCBwZGlUaHJlYWQpIHsKLQkJc3VwZXIodGFyZ2V0LmdldFNlc3Npb24oKSwgdGFyZ2V0LmdldFRhc2tzKCkpOwotCQl0aGlzLmZEZWJ1Z1RhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5wZGlUaHJlYWQgPSBwZGlUaHJlYWQ7Ci0JCWlmICh0YXJnZXQuZ2V0UERJU2Vzc2lvbigpLmlzU3VzcGVuZGVkKHRhcmdldC5nZXRUYXNrcygpKSkgewotCQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlNVU1BFTkRFRCk7Ci0JCQlzZXRDdXJyZW50KHRydWUpOwotCQl9IGVsc2UgewotCQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlJFU1VNRUQpOwotCQl9Ci0JCWluaXRpYWxpemUoKTsKLQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLmFkZEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3RhcnQjY2FuUmVzdGFydCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdGFydCgpIHsKLQkJcmV0dXJuIGdldERlYnVnVGFyZ2V0KCkgaW5zdGFuY2VvZiBJUmVzdGFydCAmJiAoKElSZXN0YXJ0KSBnZXREZWJ1Z1RhcmdldCgpKS5jYW5SZXN0YXJ0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNjYW5SZXN1bWUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlc3VtZSgpIHsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3VtZVdpdGhvdXRTaWduYWwjY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpIHsKLQkJcmV0dXJuIChnZXREZWJ1Z1RhcmdldCgpIGluc3RhbmNlb2YgSVJlc3VtZVdpdGhvdXRTaWduYWwgJiYgKChJUmVzdW1lV2l0aG91dFNpZ25hbCkgZ2V0RGVidWdUYXJnZXQoKSkKLQkJCQkuY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBJbnRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwSW50bygpIHsKLQkJcmV0dXJuIGNhblN0ZXAoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBPdmVyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwT3ZlcigpIHsKLQkJcmV0dXJuIGNhblN0ZXAoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBSZXR1cm4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblN0ZXBSZXR1cm4oKSB7Ci0JCWlmICghY2FuUmVzdW1lKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gKGZTdGFja0ZyYW1lcy5zaXplKCkgPiAxKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI2NhblN1c3BlbmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKSB7Ci0JCVBEZWJ1Z0VsZW1lbnRTdGF0ZSBzdGF0ZSA9IGdldFN0YXRlKCk7Ci0JCXJldHVybiAoc3RhdGUuZXF1YWxzKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5SRVNVTUVEKSB8fCBzdGF0ZS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLlNURVBQRUQpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjY2FuVGVybWluYXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5UZXJtaW5hdGUoKSB7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmNhblRlcm1pbmF0ZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpc3Q8SVN0YWNrRnJhbWU+IGNvbXB1dGVOZXdTdGFja0ZyYW1lcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb21wdXRlU3RhY2tGcmFtZXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlzdDxJU3RhY2tGcmFtZT4gY29tcHV0ZVN0YWNrRnJhbWVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbXB1dGVTdGFja0ZyYW1lcyhyZWZyZXNoQ2hpbGRyZW4oKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVJ1blRvTGluZS5jbGFzcykgfHwgYWRhcHRlci5lcXVhbHMoSVJ1blRvQWRkcmVzcy5jbGFzcykgfHwgYWRhcHRlci5lcXVhbHMoSUp1bXBUb0xpbmUuY2xhc3MpCi0JCQkJfHwgYWRhcHRlci5lcXVhbHMoSUp1bXBUb0FkZHJlc3MuY2xhc3MpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoSVBTdGFja0ZyYW1lKSBnZXRUb3BTdGFja0ZyYW1lKCk7Ci0JCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhQRGVidWdFbGVtZW50U3RhdGUuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyID09IElQU3RhY2tGcmFtZS5jbGFzcykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKElQU3RhY2tGcmFtZSkgZ2V0VG9wU3RhY2tGcmFtZSgpOwotCQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfQotCQlpZiAoYWRhcHRlciA9PSBJTWVtb3J5QmxvY2tSZXRyaWV2YWwuY2xhc3MpIHsKLQkJCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkI2dldEJyZWFrcG9pbnRzKCkKLQkgKi8KLQlwdWJsaWMgSUJyZWFrcG9pbnRbXSBnZXRCcmVha3BvaW50cygpIHsKLQkJTGlzdDxJQnJlYWtwb2ludD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJyZWFrcG9pbnQ+KDEpOwotCQlpZiAoaXNTdXNwZW5kZWQoKSkgewotCQkJSUJyZWFrcG9pbnQgYmtwdCA9IG51bGw7Ci0JCQlJUEJyZWFrcG9pbnRNYW5hZ2VyIGJNZ3IgPSBmU2Vzc2lvbi5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQkJaWYgKGdldEN1cnJlbnRTdGF0ZUluZm8oKSBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQkJCWJrcHQgPSBiTWdyLmdldEJyZWFrcG9pbnQoKChJUERJQnJlYWtwb2ludEluZm8pIGdldEN1cnJlbnRTdGF0ZUluZm8oKSkuZ2V0QnJlYWtwb2ludCgpKTsKLQkJCX0gZWxzZSBpZiAoZ2V0Q3VycmVudFN0YXRlSW5mbygpIGluc3RhbmNlb2YgSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mbykgewotCQkJCWJrcHQgPSBiTWdyLmdldEJyZWFrcG9pbnQoKChJUERJV2F0Y2hwb2ludFRyaWdnZXJJbmZvKSBnZXRDdXJyZW50U3RhdGVJbmZvKCkpLmdldFdhdGNocG9pbnQoKSk7Ci0JCQl9Ci0JCQlpZiAoYmtwdCAhPSBudWxsKQotCQkJCWxpc3QuYWRkKGJrcHQpOwotCQl9Ci0JCXJldHVybiAoSUJyZWFrcG9pbnRbXSkgbGlzdC50b0FycmF5KG5ldyBJQnJlYWtwb2ludFtsaXN0LnNpemUoKV0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBEZWJ1Z0VsZW1lbnQjZ2V0RGVidWdUYXJnZXQoKQotCSAqLwotCXB1YmxpYyBQRGVidWdUYXJnZXQgZ2V0RGVidWdUYXJnZXQoKSB7Ci0JCXJldHVybiBmRGVidWdUYXJnZXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRQRElUaHJlYWQoKS50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZCNnZXRQcmlvcml0eSgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZCNnZXRTdGFja0ZyYW1lcygpCi0JICovCi0JcHVibGljIElTdGFja0ZyYW1lW10gZ2V0U3RhY2tGcmFtZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlMaXN0PElTdGFja0ZyYW1lPiBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJdHJ5IHsKLQkJCWxpc3QgPSBjb21wdXRlU3RhY2tGcmFtZXMoKTsKLQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJc2V0U3RhdHVzKElQRGVidWdFbGVtZW50U3RhdHVzLkVSUk9SLCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCXJldHVybiAoSVN0YWNrRnJhbWVbXSkgbGlzdC50b0FycmF5KG5ldyBJU3RhY2tGcmFtZVtsaXN0LnNpemUoKV0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZCNnZXRUb3BTdGFja0ZyYW1lKCkKLQkgKi8KLQlwdWJsaWMgSVN0YWNrRnJhbWUgZ2V0VG9wU3RhY2tGcmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUxpc3Q8SVN0YWNrRnJhbWU+IGMgPSBjb21wdXRlU3RhY2tGcmFtZXMoKTsKLQkJcmV0dXJuIChjLmlzRW1wdHkoKSkgPyBudWxsIDogKElTdGFja0ZyYW1lKSBjLmdldCgwKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50TGlzdGVuZXIjaGFuZGxlRGVidWdFdmVudHMob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudFtdKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhJUERJRXZlbnRbXSBldmVudHMpIHsKLQkJLyoKLQkJICogRklYTUUgTm90IHN1cHBvcnQgdGhyZWFkLCBhbHdheXMgZmlyZSBldmVudCBieSB0YXJnZXQKLQkJaWYgKGlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQRElFdmVudCBldmVudCA9IGV2ZW50c1tpXTsKLQkJCWlmICghZXZlbnQuY29udGFpbnMoZ2V0UERJVGFyZ2V0KCkuZ2V0VGFza3MoKSkpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElQRElTdXNwZW5kZWRFdmVudCkgewotCQkJCWhhbmRsZVN1c3BlbmRlZEV2ZW50KChJUERJU3VzcGVuZGVkRXZlbnQpZXZlbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJUmVzdW1lZEV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzdW1lZEV2ZW50KChJUERJUmVzdW1lZEV2ZW50KWV2ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESURlc3Ryb3llZEV2ZW50KSB7Ci0JCQkJaGFuZGxlVGVybWluYXRlZEV2ZW50KChJUERJRGVzdHJveWVkRXZlbnQpZXZlbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJRGlzY29ubmVjdGVkRXZlbnQpIHsKLQkJCQloYW5kbGVEaXNjb25uZWN0ZWRFdmVudCgoSVBESURpc2Nvbm5lY3RlZEV2ZW50KWV2ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVBESUNoYW5nZWRFdmVudCkgewotCQkJCWhhbmRsZUNoYW5nZWRFdmVudCgoSVBESUNoYW5nZWRFdmVudClldmVudCk7Ci0JCQl9Ci0JCX0KLQkJICovCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkI2hhc1N0YWNrRnJhbWVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFja0ZyYW1lcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCS8vIEFsd2F5cyByZXR1cm4gdHJ1ZSB0byBwb3N0cG9uZSB0aGUgc3RhY2sgZnJhbWVzIHJlcXVlc3QKLQkJaWYgKGdldFN0YXRlKCkuZXF1YWxzKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5SRVNVTUVEKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNpc1N0ZXBwaW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0ZXBwaW5nKCkgewotCQlyZXR1cm4gKGdldFN0YXRlKCkuZXF1YWxzKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5TVEVQUElORykpIHx8IChnZXRTdGF0ZSgpLmVxdWFscyhQRGVidWdFbGVtZW50U3RhdGUuU1RFUFBFRCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjaXNTdXNwZW5kZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkgewotCQlyZXR1cm4gZ2V0U3RhdGUoKS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLlNVU1BFTkRFRCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI2lzVGVybWluYXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkgewotCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKS5pc1Rlcm1pbmF0ZWQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUmVzdGFydCNyZXN0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGNhblJlc3RhcnQoKSkgewotCQkJKChJUmVzdGFydCkgZ2V0RGVidWdUYXJnZXQoKSkucmVzdGFydCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNyZXN1bWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuUmVzdW1lKCkpCi0JCQlyZXR1cm47Ci0JCVBEZWJ1Z0VsZW1lbnRTdGF0ZSBvbGRTdGF0ZSA9IGdldFN0YXRlKCk7Ci0JCXNldFN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5SRVNVTUlORyk7Ci0JCXRyeSB7Ci0JCQlnZXRQRElTZXNzaW9uKCkucmVzdW1lKGdldFRhc2tzKCksIGZhbHNlKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXNldFN0YXRlKG9sZFN0YXRlKTsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVJlc3VtZVdpdGhvdXRTaWduYWwjcmVzdW1lV2l0aG91dFNpZ25hbCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lV2l0aG91dFNpZ25hbCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChjYW5SZXN1bWVXaXRob3V0U2lnbmFsKCkpIHsKLQkJCSgoSVJlc3VtZVdpdGhvdXRTaWduYWwpIGdldERlYnVnVGFyZ2V0KCkpLnJlc3VtZVdpdGhvdXRTaWduYWwoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjc3RlcEludG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5TdGVwSW50bygpKQotCQkJcmV0dXJuOwotCQlQRGVidWdFbGVtZW50U3RhdGUgb2xkU3RhdGUgPSBnZXRTdGF0ZSgpOwotCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuU1RFUFBJTkcpOwotCQl0cnkgewotCQkJaWYgKCFpc0luc3RydWN0aW9uc3RlcHBpbmdFbmFibGVkKCkpIHsKLQkJCQlnZXRQRElTZXNzaW9uKCkuc3RlcEludG8oZ2V0VGFza3MoKSwgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWdldFBESVNlc3Npb24oKS5zdGVwSW50b0luc3RydWN0aW9uKGdldFRhc2tzKCksIDEpOwotCQkJfQotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJc2V0U3RhdGUob2xkU3RhdGUpOwotCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZChlLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI3N0ZXBPdmVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuU3RlcE92ZXIoKSkKLQkJCXJldHVybjsKLQkJUERlYnVnRWxlbWVudFN0YXRlIG9sZFN0YXRlID0gZ2V0U3RhdGUoKTsKLQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlNURVBQSU5HKTsKLQkJdHJ5IHsKLQkJCWlmICghaXNJbnN0cnVjdGlvbnN0ZXBwaW5nRW5hYmxlZCgpKSB7Ci0JCQkJZ2V0UERJU2Vzc2lvbigpLnN0ZXBPdmVyKGdldFRhc2tzKCksIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlnZXRQRElTZXNzaW9uKCkuc3RlcE92ZXJJbnN0cnVjdGlvbihnZXRUYXNrcygpLCAxKTsKLQkJCX0KLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXNldFN0YXRlKG9sZFN0YXRlKTsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNzdGVwUmV0dXJuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5TdGVwUmV0dXJuKCkpCi0JCQlyZXR1cm47Ci0JCUlTdGFja0ZyYW1lW10gZnJhbWVzID0gZ2V0U3RhY2tGcmFtZXMoKTsKLQkJaWYgKGZyYW1lcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJUFN0YWNrRnJhbWUgZiA9IChQU3RhY2tGcmFtZSkgZnJhbWVzWzBdOwotCQlQRGVidWdFbGVtZW50U3RhdGUgb2xkU3RhdGUgPSBnZXRTdGF0ZSgpOwotCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuU1RFUFBJTkcpOwotCQl0cnkgewotCQkJZi5kb1N0ZXBSZXR1cm4oKTsKLQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJc2V0U3RhdGUob2xkU3RhdGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjc3VzcGVuZCgpCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghY2FuU3VzcGVuZCgpKQotCQkJcmV0dXJuOwotCQlQRGVidWdFbGVtZW50U3RhdGUgb2xkU3RhdGUgPSBnZXRTdGF0ZSgpOwotCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuU1VTUEVORElORyk7Ci0JCXRyeSB7Ci0JCQlnZXRQRElTZXNzaW9uKCkuc3VzcGVuZChnZXRUYXNrcygpKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXNldFN0YXRlKG9sZFN0YXRlKTsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI3Rlcm1pbmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJZ2V0RGVidWdUYXJnZXQoKS50ZXJtaW5hdGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXROYW1lKCk7Ci0JCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdGcmFtZXMKLQkgKiBAcGFyYW0gb2xkRnJhbWVzCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVTdGFja0ZyYW1lcyhJUERJU3RhY2tGcmFtZVtdIG5ld0ZyYW1lcywgTGlzdDxJU3RhY2tGcmFtZT4gb2xkRnJhbWVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBpbmRleCA9IG9mZnNldDsKLQkJSXRlcmF0b3I8SVN0YWNrRnJhbWU+IGl0ID0gb2xkRnJhbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgaW5kZXggPCBuZXdGcmFtZXMubGVuZ3RoKSB7Ci0JCQlQU3RhY2tGcmFtZSBmcmFtZSA9IChQU3RhY2tGcmFtZSkgaXQubmV4dCgpOwotCQkJaWYgKCFmcmFtZS5nZXRQRElTdGFja0ZyYW1lKCkuZXF1YWxzKG5ld0ZyYW1lc1tpbmRleCsrXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUJyZWFrcG9pbnRIaXQoSVBESUJyZWFrcG9pbnRJbmZvIGluZm8pIHsKLQkJZmlyZVN1c3BlbmRFdmVudChEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUVuZFN0ZXBwaW5nUmFuZ2UoSVBESUVuZFN0ZXBwaW5nUmFuZ2VJbmZvIGluZm8pIHsKLQkJZmlyZVN1c3BlbmRFdmVudChEZWJ1Z0V2ZW50LlNURVBfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTdXNwZW5kZWRCeVNpZ25hbChJUERJU2lnbmFsSW5mbyBpbmZvKSB7Ci0JCWZpcmVTdXNwZW5kRXZlbnQoRGVidWdFdmVudC5VTlNQRUNJRklFRCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBmUmVmcmVzaENoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXB0aAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRMYXN0U3RhY2tEZXB0aChpbnQgZGVwdGgpIHsKLQkJZkxhc3RTdGFja0RlcHRoID0gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZnJlc2gKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UmVmcmVzaENoaWxkcmVuKGJvb2xlYW4gcmVmcmVzaCkgewotCQlmUmVmcmVzaENoaWxkcmVuID0gcmVmcmVzaDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY1dpdGhCYWNrZW5kKCkgewotCQlJUERJVGhyZWFkIHBkaVRocmVhZCA9IGdldFBESVRocmVhZCgpOwotCQlJUERJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBudWxsOwotCQl0cnkgewotCQkJY3VycmVudFRocmVhZCA9IHBkaVRocmVhZC5nZXRUYXJnZXQoKS5nZXRDdXJyZW50VGhyZWFkKCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlzZXRDdXJyZW50KHBkaVRocmVhZC5lcXVhbHMoY3VycmVudFRocmVhZCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdGcmFtZXMKLQkgKiBAcGFyYW0gc3RhcnRJbmRleAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gYXBwZW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhY2tGcmFtZXMoSVBESVN0YWNrRnJhbWVbXSBuZXdGcmFtZXMsIGludCBzdGFydEluZGV4LCBpbnQgbGVuZ3RoLCBib29sZWFuIGFwcGVuZCkgewotCQlpZiAobmV3RnJhbWVzLmxlbmd0aCA+PSBzdGFydEluZGV4ICsgbGVuZ3RoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKGFwcGVuZCkKLQkJCQkJZlN0YWNrRnJhbWVzLmFkZChuZXcgUFN0YWNrRnJhbWUodGhpcywgbmV3RnJhbWVzW3N0YXJ0SW5kZXggKyBpXSkpOwotCQkJCWVsc2UKLQkJCQkJZlN0YWNrRnJhbWVzLmFkZChpLCBuZXcgUFN0YWNrRnJhbWUodGhpcywgbmV3RnJhbWVzW3N0YXJ0SW5kZXggKyBpXSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblN0ZXAoKSB7Ci0JCWlmICghaXNTdXNwZW5kZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhZlN0YWNrRnJhbWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwKCkgewotCQlnZXRQRElTZXNzaW9uKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQkJZGlzcG9zZVN0YWNrRnJhbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZnJlc2hDaGlsZHJlbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBMaXN0PElTdGFja0ZyYW1lPiBjb21wdXRlU3RhY2tGcmFtZXMoYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW4pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1N1c3BlbmRlZCgpKSB7Ci0JCQlpZiAoaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQlmU3RhY2tGcmFtZXMgPSBuZXcgQXJyYXlMaXN0PElTdGFja0ZyYW1lPigpOwotCQkJfSBlbHNlIGlmIChyZWZyZXNoQ2hpbGRyZW4pIHsKLQkJCQlpZiAoZlN0YWNrRnJhbWVzLnNpemUoKSA+IDApIHsKLQkJCQkJT2JqZWN0IGZyYW1lID0gZlN0YWNrRnJhbWVzLmdldChmU3RhY2tGcmFtZXMuc2l6ZSgpIC0gMSk7Ci0JCQkJCWlmIChmcmFtZSBpbnN0YW5jZW9mIElQRHVtbXlTdGFja0ZyYW1lKSB7Ci0JCQkJCQlmU3RhY2tGcmFtZXMucmVtb3ZlKGZyYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpbnQgZGVwdGggPSBnZXRTdGFja0RlcHRoKCk7Ci0JCQkJaWYgKGRlcHRoID49IGdldE1heFN0YWNrRGVwdGgoKSkKLQkJCQkJZGVwdGggPSBnZXRNYXhTdGFja0RlcHRoKCkgLSAxOwotCi0JCQkJSVBESVN0YWNrRnJhbWVbXSBmcmFtZXMgPSAoZGVwdGggIT0gMCkgPyBnZXRQRElTdGFja0ZyYW1lcygwLCBkZXB0aCAtIDEpIDogbmV3IElQRElTdGFja0ZyYW1lWzBdOwotCQkJCWRlcHRoID0gZnJhbWVzLmxlbmd0aDsKLQotCQkJCWlmIChmU3RhY2tGcmFtZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWlmIChmcmFtZXMubGVuZ3RoID4gMCkgewotCQkJCQkJYWRkU3RhY2tGcmFtZXMoZnJhbWVzLCAwLCBmcmFtZXMubGVuZ3RoLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgZGlmZiA9IGRlcHRoIC0gZ2V0TGFzdFN0YWNrRGVwdGgoKTsKLQkJCQkJaW50IG9mZnNldCA9IChkaWZmID4gMCkgPyBmcmFtZXMubGVuZ3RoIC0gZGlmZiA6IDA7Ci0JCQkJCWludCBsZW5ndGggPSAoZGlmZiA+IDApID8gZGlmZiA6IC1kaWZmOwotCQkJCQlpZiAoIWNvbXBhcmVTdGFja0ZyYW1lcyhmcmFtZXMsIGZTdGFja0ZyYW1lcywgb2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCQkJCQlkaXNwb3NlU3RhY2tGcmFtZXMoMCwgZlN0YWNrRnJhbWVzLnNpemUoKSk7Ci0JCQkJCQlhZGRTdGFja0ZyYW1lcyhmcmFtZXMsIDAsIGZyYW1lcy5sZW5ndGgsIGZhbHNlKTsKLQkJCQkJfQotCQkJCQlpZiAoZGlmZiA8IDApIHsKLQkJCQkJCS8vIHN0ZXBwaW5nIG91dCBvZiB0aGUgbGFzdCBmcmFtZQotCQkJCQkJZGlzcG9zZVN0YWNrRnJhbWVzKDAsIGdldExhc3RTdGFja0RlcHRoKCkgLSBkZXB0aCk7Ci0JCQkJCQlpZiAoZnJhbWVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQl1cGRhdGVTdGFja0ZyYW1lcyhmcmFtZXMsIDAsIGZTdGFja0ZyYW1lcywgZlN0YWNrRnJhbWVzLnNpemUoKSk7Ci0JCQkJCQkJaWYgKGZTdGFja0ZyYW1lcy5zaXplKCkgPCBmcmFtZXMubGVuZ3RoKSB7Ci0JCQkJCQkJCWFkZFN0YWNrRnJhbWVzKGZyYW1lcywgZlN0YWNrRnJhbWVzLnNpemUoKSwgZnJhbWVzLmxlbmd0aCAtIGZTdGFja0ZyYW1lcy5zaXplKCksIHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChkaWZmID4gMCkgewotCQkJCQkJLy8gc3RlcHBpbmcgaW50byBhIG5ldyBmcmFtZQotCQkJCQkJZGlzcG9zZVN0YWNrRnJhbWVzKGZyYW1lcy5sZW5ndGggLSBkZXB0aCArIGdldExhc3RTdGFja0RlcHRoKCksIGRlcHRoIC0gZ2V0TGFzdFN0YWNrRGVwdGgoKSk7Ci0JCQkJCQlhZGRTdGFja0ZyYW1lcyhmcmFtZXMsIDAsIGRlcHRoIC0gZ2V0TGFzdFN0YWNrRGVwdGgoKSwgZmFsc2UpOwotCQkJCQkJdXBkYXRlU3RhY2tGcmFtZXMoZnJhbWVzLCBkZXB0aCAtIGdldExhc3RTdGFja0RlcHRoKCksIGZTdGFja0ZyYW1lcywgZnJhbWVzLmxlbmd0aCAtIGRlcHRoCi0JCQkJCQkJCSsgZ2V0TGFzdFN0YWNrRGVwdGgoKSk7Ci0JCQkJCX0gZWxzZSB7IC8vIGRpZmYgPT0gMAotCQkJCQkJaWYgKGRlcHRoICE9IDApIHsKLQkJCQkJCQkvLyB3ZSBhcmUgaW4gdGhlIHNhbWUgZnJhbWUKLQkJCQkJCQl1cGRhdGVTdGFja0ZyYW1lcyhmcmFtZXMsIDAsIGZTdGFja0ZyYW1lcywgZnJhbWVzLmxlbmd0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlcHRoID4gZ2V0TWF4U3RhY2tEZXB0aCgpKSB7Ci0JCQkJCWZTdGFja0ZyYW1lcy5hZGQobmV3IFBEdW1teVN0YWNrRnJhbWUodGhpcykpOwotCQkJCX0KLQkJCQlzZXRMYXN0U3RhY2tEZXB0aChkZXB0aCk7Ci0JCQkJc2V0UmVmcmVzaENoaWxkcmVuKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlN0YWNrRnJhbWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEBwYXJhbSBmcmFtZXMKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBMaXN0PElTdGFja0ZyYW1lPiBjcmVhdGVBbGxTdGFja0ZyYW1lcyhpbnQgZGVwdGgsIElQRElTdGFja0ZyYW1lW10gZnJhbWVzKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlMaXN0PElTdGFja0ZyYW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU3RhY2tGcmFtZT4oZnJhbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgKytpKSB7Ci0JCQlsaXN0LmFkZChuZXcgUFN0YWNrRnJhbWUodGhpcywgZnJhbWVzW2ldKSk7Ci0JCX0KLQkJaWYgKGRlcHRoID4gZnJhbWVzLmxlbmd0aCkgewotCQkJbGlzdC5hZGQobmV3IFBEdW1teVN0YWNrRnJhbWUodGhpcykpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZEaXNwb3NlZCA9IHRydWU7Ci0JCWNsZWFudXAoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGlzcG9zZVN0YWNrRnJhbWVzKCkgewotCQlJdGVyYXRvcjxJU3RhY2tGcmFtZT4gaXQgPSBmU3RhY2tGcmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQU3RhY2tGcmFtZSkgewotCQkJCSgoUFN0YWNrRnJhbWUpIG9iaikuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZTdGFja0ZyYW1lcy5jbGVhcigpOwotCQlzZXRMYXN0U3RhY2tEZXB0aCgwKTsKLQkJcmVzZXRTdGF0dXMoKTsKLQkJc2V0UmVmcmVzaENoaWxkcmVuKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlU3RhY2tGcmFtZXMoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Q8SVN0YWNrRnJhbWU+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElTdGFja0ZyYW1lPihsZW5ndGgpOwotCQlJdGVyYXRvcjxJU3RhY2tGcmFtZT4gaXQgPSBmU3RhY2tGcmFtZXMuaXRlcmF0b3IoKTsKLQkJaW50IGNvdW50ZXIgPSAwOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUFN0YWNrRnJhbWUgZnJhbWUgPSAoSVBTdGFja0ZyYW1lKSAoKChJQWRhcHRhYmxlKSBpdC5uZXh0KCkpLmdldEFkYXB0ZXIoSVBTdGFja0ZyYW1lLmNsYXNzKSk7Ci0JCQlpZiAoZnJhbWUgaW5zdGFuY2VvZiBQU3RhY2tGcmFtZSAmJiBjb3VudGVyID49IGluZGV4ICYmIGNvdW50ZXIgPCBpbmRleCArIGxlbmd0aCkgewotCQkJCSgoUFN0YWNrRnJhbWUpIGZyYW1lKS5kaXNwb3NlKCk7Ci0JCQkJcmVtb3ZlTGlzdC5hZGQoZnJhbWUpOwotCQkJfQotCQkJKytjb3VudGVyOwotCQl9Ci0JCWZTdGFja0ZyYW1lcy5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGFzdFN0YWNrRGVwdGgoKSB7Ci0JCXJldHVybiBmTGFzdFN0YWNrRGVwdGg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWF4U3RhY2tEZXB0aCgpIHsKLQkJcmV0dXJuIE1BWF9TVEFDS19ERVBUSDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJUERJU3RhY2tGcmFtZVtdIGdldFBESVN0YWNrRnJhbWVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBJUERJU3RhY2tGcmFtZVswXTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG93RnJhbWUKLQkgKiBAcGFyYW0gaGlnaEZyYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVBESVN0YWNrRnJhbWVbXSBnZXRQRElTdGFja0ZyYW1lcyhpbnQgbG93RnJhbWUsIGludCBoaWdoRnJhbWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UERJVGhyZWFkKCkuZ2V0U3RhY2tGcmFtZXMobG93RnJhbWUsIGhpZ2hGcmFtZSk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRTdGF0dXMoSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuV0FSTklORywgTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ29yZU1vZGVsTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVGhyZWFkLjAiKSwgbmV3IE9iamVjdFtdIHsgZQotCQkJCQkuZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JCXJldHVybiBuZXcgSVBESVN0YWNrRnJhbWVbMF07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUERJVGhyZWFkIGdldFBESVRocmVhZCgpIHsKLQkJcmV0dXJuIHBkaVRocmVhZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U3RhY2tEZXB0aCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXRyeSB7Ci0JCQlkZXB0aCA9IGdldFBESVRocmVhZCgpLmdldFN0YWNrRnJhbWVDb3VudCgpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJc2V0U3RhdHVzKElQRGVidWdFbGVtZW50U3RhdHVzLldBUk5JTkcsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiUFRocmVhZC4xIiksIG5ldyBPYmplY3RbXSB7IGUKLQkJCQkJLmdldE1lc3NhZ2UoKSB9KSk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZTdGFja0ZyYW1lcyA9IG5ldyBBcnJheUxpc3Q8SVN0YWNrRnJhbWU+KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ3VycmVudCgpIHsKLQkJcmV0dXJuIGZJc0N1cnJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBmRGlzcG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5zdHJ1Y3Rpb25zdGVwcGluZ0VuYWJsZWQoKSB7Ci0JCXJldHVybiAoKFBEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuaXNJbnN0cnVjdGlvblN0ZXBwaW5nRW5hYmxlZCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVzZXJ2ZVN0YWNrRnJhbWVzKCkgewotCQlJdGVyYXRvcjxJU3RhY2tGcmFtZT4gaXQgPSBmU3RhY2tGcmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVBTdGFja0ZyYW1lIGZyYW1lID0gKElQU3RhY2tGcmFtZSkgKCgoSUFkYXB0YWJsZSkgaXQubmV4dCgpKS5nZXRBZGFwdGVyKElQU3RhY2tGcmFtZS5jbGFzcykpOwotCQkJaWYgKGZyYW1lIGluc3RhbmNlb2YgUFN0YWNrRnJhbWUpIHsKLQkJCQkoKFBTdGFja0ZyYW1lKSBmcmFtZSkucHJlc2VydmUoKTsKLQkJCX0KLQkJfQotCQlzZXRSZWZyZXNoQ2hpbGRyZW4odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRldGFpbAotCSAqIEBwYXJhbSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN1bWVkQnlUYXJnZXQoaW50IGRldGFpbCwgTGlzdDxEZWJ1Z0V2ZW50PiBldmVudHMpIHsKLQkJc3luY1dpdGhCYWNrZW5kKCk7Ci0JCWlmIChpc0N1cnJlbnQoKSAmJiBkZXRhaWwgIT0gRGVidWdFdmVudC5DTElFTlRfUkVRVUVTVCAmJiBkZXRhaWwgIT0gRGVidWdFdmVudC5VTlNQRUNJRklFRCkgewotCQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlNURVBQRUQpOwotCQkJcHJlc2VydmVTdGFja0ZyYW1lcygpOwotCQkJZXZlbnRzLmFkZChjcmVhdGVSZXN1bWVFdmVudChkZXRhaWwpKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXRlKFBEZWJ1Z0VsZW1lbnRTdGF0ZS5SRVNVTUVEKTsKLQkJCWRpc3Bvc2VTdGFja0ZyYW1lcygpOwotCQkJZXZlbnRzLmFkZChjcmVhdGVDaGFuZ2VFdmVudChEZWJ1Z0V2ZW50LkNMSUVOVF9SRVFVRVNUKSk7Ci0JCX0KLQkJc2V0Q3VycmVudChmYWxzZSk7Ci0JCXNldEN1cnJlbnRTdGF0ZUluZm8obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGN1cnJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50KGJvb2xlYW4gY3VycmVudCkgewotCQlmSXNDdXJyZW50ID0gY3VycmVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVhc29uCi0JICogQHBhcmFtIHN1c3BlbnNpb25UaHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdXNwZW5kQnlUYXJnZXQoSVBESVNlc3Npb25PYmplY3QgcmVhc29uLCBJUERJVGhyZWFkIHN1c3BlbnNpb25UaHJlYWQpIHsKLQkJc2V0U3RhdGUoUERlYnVnRWxlbWVudFN0YXRlLlNVU1BFTkRFRCk7Ci0JCXNldEN1cnJlbnRTdGF0ZUluZm8obnVsbCk7Ci0JCWlmIChnZXRQRElUaHJlYWQoKS5lcXVhbHMoc3VzcGVuc2lvblRocmVhZCkpIHsKLQkJCXNldEN1cnJlbnQodHJ1ZSk7Ci0JCQlzZXRDdXJyZW50U3RhdGVJbmZvKHJlYXNvbik7Ci0JCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESUJyZWFrcG9pbnRJbmZvKSB7Ci0JCQkJaGFuZGxlQnJlYWtwb2ludEhpdCgoSVBESUJyZWFrcG9pbnRJbmZvKSByZWFzb24pOwotCQkJfSBlbHNlIGlmIChyZWFzb24gaW5zdGFuY2VvZiBJUERJRW5kU3RlcHBpbmdSYW5nZUluZm8pIHsKLQkJCQloYW5kbGVFbmRTdGVwcGluZ1JhbmdlKChJUERJRW5kU3RlcHBpbmdSYW5nZUluZm8pIHJlYXNvbik7Ci0JCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElGdW5jdGlvbkZpbmlzaGVkSW5mbykgewotCi0JCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElMb2NhdGlvblJlYWNoZWRJbmZvKSB7Ci0KLQkJCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVNpZ25hbEluZm8pIHsKLQkJCQloYW5kbGVTdXNwZW5kZWRCeVNpZ25hbCgoSVBESVNpZ25hbEluZm8pIHJlYXNvbik7Ci0JCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElTaGFyZWRMaWJyYXJ5SW5mbykgewotCi0JCQl9IGVsc2UgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIElQRElXYXRjaHBvaW50U2NvcGVJbmZvKSB7Ci0KLQkJCX0gZWxzZSBpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mbykgewotCi0JCQl9IGVsc2UgewotCQkJCS8vIGZpcmVTdXNwZW5kRXZlbnQoIERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1QgKTsKLQkJCQkvLyBUZW1wb3JhcnkgZml4IGZvciBidWcgNTY1MjAKLQkJCQlmaXJlU3VzcGVuZEV2ZW50KERlYnVnRXZlbnQuQlJFQUtQT0lOVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZXJtaW5hdGVkKCkgewotCQlzZXRTdGF0ZShQRGVidWdFbGVtZW50U3RhdGUuVEVSTUlOQVRFRCk7Ci0JCWRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RnJhbWVzCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBvbGRGcmFtZXMKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YWNrRnJhbWVzKElQRElTdGFja0ZyYW1lW10gbmV3RnJhbWVzLCBpbnQgb2Zmc2V0LCBMaXN0PElTdGFja0ZyYW1lPiBvbGRGcmFtZXMsIGludCBsZW5ndGgpCi0JCQl0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlQU3RhY2tGcmFtZSBmcmFtZSA9IChQU3RhY2tGcmFtZSkgb2xkRnJhbWVzLmdldChvZmZzZXQpOwotCQkJZnJhbWUuc2V0UERJU3RhY2tGcmFtZShuZXdGcmFtZXNbb2Zmc2V0XSk7Ci0JCQlvZmZzZXQrKzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QVmFsdWUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MzQ5NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5QVmFyaWFibGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVGbG9hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlSW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVQb2ludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVHlwZVN0cmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUNoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVGbG9hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZUludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZWYWx1ZVBvaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGVmFsdWVTdHJpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JVHlwZUFnZ3JlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklUeXBlRGVyaXZlZDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUFZhbHVlIGV4dGVuZHMgQWJzdHJhY3RQVmFsdWUgewotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZVN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0PElWYXJpYWJsZT4gZlZhcmlhYmxlcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JcHJpdmF0ZSBJUERJVmFyaWFibGUgZlZhcmlhYmxlOwotCi0JcHJvdGVjdGVkIFBWYWx1ZShQVmFyaWFibGUgcGFyZW50LCBJUERJVmFyaWFibGUgdmFyaWFibGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJZlZhcmlhYmxlID0gdmFyaWFibGU7CQkKLQl9Ci0JcHJvdGVjdGVkIFBWYWx1ZShQVmFyaWFibGUgcGFyZW50LCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQlzZXRTdGF0dXMoSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGVOYW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChnZXRQYXJlbnRWYXJpYWJsZSgpICE9IG51bGwpID8gZ2V0UGFyZW50VmFyaWFibGUoKS5nZXRSZWZlcmVuY2VUeXBlTmFtZSgpIDogbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChmVmFsdWVTdHJpbmcgPT0gbnVsbCAmJiBnZXRBSUYoKSAhPSBudWxsKSB7Ci0JCQlyZXNldFN0YXR1cygpOwotCQkJSVBTdGFja0ZyYW1lIHBmcmFtZSA9IGdldFBhcmVudFZhcmlhYmxlKCkuZ2V0U3RhY2tGcmFtZSgpOwotCQkJYm9vbGVhbiBpc1N1c3BlbmRlZCA9IChwZnJhbWUgPT0gbnVsbCkgPyBnZXRQRElTZXNzaW9uKCkuaXNTdXNwZW5kZWQoZ2V0VGFza3MoKSkgOiBwZnJhbWUuaXNTdXNwZW5kZWQoKTsKLQkJCWlmIChpc1N1c3BlbmRlZCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChmVmFyaWFibGUgPT0gbnVsbCkgewotCQkJCQkJdGFyZ2V0UmVxdWVzdEZhaWxlZCgiTm8gdmFyaWFibGUgZm91bmQiLCBudWxsKTsKLQkJCQkJfQotCQkJCQlmVmFsdWVTdHJpbmcgPSBwcm9jZXNzVW5kZXJseWluZ1ZhbHVlKGdldEFJRigpKTsKLQkJCQl9IGNhdGNoIChBSUZFeGNlcHRpb24gcGUpIHsKLQkJCQkJc2V0U3RhdHVzKElQRGVidWdFbGVtZW50U3RhdHVzLkVSUk9SLCBwZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZlZhbHVlU3RyaW5nOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG9jYXRlZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJTGlzdDxJVmFyaWFibGU+IGxpc3QgPSBnZXRWYXJpYWJsZXMwKCk7Ci0JCXJldHVybiAoSVZhcmlhYmxlW10pIGxpc3QudG9BcnJheShuZXcgSVZhcmlhYmxlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTGlzdDxJVmFyaWFibGU+IGdldFZhcmlhYmxlczAoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoIWlzQWxsb2NhdGVkKCkgfHwgIWhhc1ZhcmlhYmxlcygpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChmVmFyaWFibGVzLnNpemUoKSA9PSAwKSB7Ci0JCQl0cnkgewotCQkJCUxpc3Q8SVBESVZhcmlhYmxlPiB2YXJzID0gZ2V0UERJVmFyaWFibGVzKCk7Ci0JCQkJZlZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8SVZhcmlhYmxlPih2YXJzLnNpemUoKSk7Ci0JCQkJSXRlcmF0b3I8SVBESVZhcmlhYmxlPiBpdCA9IHZhcnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWZWYXJpYWJsZXMuYWRkKFBWYXJpYWJsZUZhY3RvcnkuY3JlYXRlTG9jYWxWYXJpYWJsZSh0aGlzLCAoSVBESVZhcmlhYmxlKWl0Lm5leHQoKSkpOwotCQkJCX0KLQkJCQlyZXNldFN0YXR1cygpOwotCQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJCXNldFN0YXR1cyhJUERlYnVnRWxlbWVudFN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVmFyaWFibGVzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJQUlGIGFpZiA9IGdldEFJRigpOwotCQlpZiAoYWlmICE9IG51bGwpIHsKLQkJCUlBSUZUeXBlIHR5cGUgPSBhaWYuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBJVHlwZUFnZ3JlZ2F0ZSB8fCB0eXBlIGluc3RhbmNlb2YgSVR5cGVEZXJpdmVkKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgSUFJRiBnZXRBSUYoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZWYXJpYWJsZS5nZXRBSUYoKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXRhcmdldFJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIExpc3Q8SVBESVZhcmlhYmxlPiBnZXRQRElWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJUERJVmFyaWFibGVbXSB2YXJzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChmVmFyaWFibGUgIT0gbnVsbCkgewotCQkJCXZhcnMgPSBmVmFyaWFibGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlpZiAodmFycyA9PSBudWxsKSB7Ci0JCQkJCXZhcnMgPSBuZXcgSVBESVZhcmlhYmxlWzBdOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXJlcXVlc3RGYWlsZWQoZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHZhcnMpOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0Q2hhbmdlZChib29sZWFuIGNoYW5nZWQpIHsKLQkJaWYgKGNoYW5nZWQpIHsKLQkJCWZWYWx1ZVN0cmluZyA9IG51bGw7Ci0JCQlyZXNldFN0YXR1cygpOwotCQl9Ci0JCUl0ZXJhdG9yPElWYXJpYWJsZT4gaXQgPSBmVmFyaWFibGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCSgoQWJzdHJhY3RQVmFyaWFibGUpIGl0Lm5leHQoKSkuc2V0Q2hhbmdlZChjaGFuZ2VkKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJdGVyYXRvcjxJVmFyaWFibGU+IGl0ID0gZlZhcmlhYmxlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkoKEFic3RyYWN0UFZhcmlhYmxlKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3NVbmRlcmx5aW5nVmFsdWUoSUFJRiBhaWYpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAoYWlmICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9jZXNzVW5kZXJseWluZ1ZhbHVlKGFpZi5nZXRUeXBlKCksIGFpZi5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1VuZGVybHlpbmdWYWx1ZShJQUlGVHlwZSB0eXBlLCBJQUlGVmFsdWUgdmFsdWUpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlQ2hhcikKLQkJCXJldHVybiBnZXRDaGFyVmFsdWVTdHJpbmcoKElBSUZWYWx1ZUNoYXIpIHZhbHVlKTsKLQkJZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlSW50KQotCQkJcmV0dXJuIGdldEludFZhbHVlU3RyaW5nKChJQUlGVmFsdWVJbnQpIHZhbHVlKTsKLQkJZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlRmxvYXQpCi0JCQlyZXR1cm4gZ2V0RmxvYXRpbmdQb2ludFZhbHVlU3RyaW5nKChJQUlGVmFsdWVGbG9hdCkgdmFsdWUpOwotCQllbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVQb2ludGVyKQotCQkJcmV0dXJuIGdldFBvaW50ZXJWYWx1ZVN0cmluZygoSUFJRlZhbHVlUG9pbnRlcikgdmFsdWUpOwotCQllbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVSZWZlcmVuY2UpCi0JCQlyZXR1cm4gcHJvY2Vzc1VuZGVybHlpbmdWYWx1ZSh0eXBlLCAoKElBSUZWYWx1ZVJlZmVyZW5jZSkgdmFsdWUpLmdldFBhcmVudCgpKTsKLQkJZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlU3RyaW5nKQotCQkJcmV0dXJuIGdldFdDaGFyVmFsdWVTdHJpbmcoKElBSUZWYWx1ZVN0cmluZykgdmFsdWUpOwotCQllbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSVR5cGVBZ2dyZWdhdGUpCi0JCQlyZXR1cm4gInsuLi59IjsKLQkJZWxzZQotCQkJcmV0dXJuIHZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldENoYXJWYWx1ZVN0cmluZyhJQUlGVmFsdWVDaGFyIHZhbHVlKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJUFZhcmlhYmxlRm9ybWF0IGZvcm1hdCA9IGdldFBhcmVudFZhcmlhYmxlKCkuZ2V0Rm9ybWF0KCk7Ci0JCWNoYXIgY2hhclZhbHVlID0gdmFsdWUuY2hhclZhbHVlKCk7Ci0JCWlmIChQVmFyaWFibGVGb3JtYXQuTkFUVVJBTC5lcXVhbHMoZm9ybWF0KSkgewotCQkJcmV0dXJuICgoQ2hhcmFjdGVyLmlzSVNPQ29udHJvbChjaGFyVmFsdWUpICYmIGNoYXJWYWx1ZSAhPSAnXGInICYmIGNoYXJWYWx1ZSAhPSAnXHQnICYmIGNoYXJWYWx1ZSAhPSAnXG4nICYmIGNoYXJWYWx1ZSAhPSAnXGYnICYmIGNoYXJWYWx1ZSAhPSAnXHInKSB8fCBjaGFyVmFsdWUgPCAwKSA/ICIiIDogIlwnIiArIHZhbHVlLmdldFZhbHVlU3RyaW5nKCkgKyAiXCciOwotCQl9IGVsc2UgaWYgKFBWYXJpYWJsZUZvcm1hdC5ERUNJTUFMLmVxdWFscyhmb3JtYXQpKSB7Ci0JCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZygoYnl0ZSljaGFyVmFsdWUpOwotCQl9IGVsc2UgaWYgKFBWYXJpYWJsZUZvcm1hdC5IRVhBREVDSU1BTC5lcXVhbHMoZm9ybWF0KSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiMHgiKTsKLQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IEludGVnZXIudG9TdHJpbmcoKGJ5dGUpY2hhclZhbHVlKTsKLQkJCXNiLmFwcGVuZCgoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAyKSA/IHN0cmluZ1ZhbHVlLnN1YnN0cmluZyhzdHJpbmdWYWx1ZS5sZW5ndGgoKSAtIDIpIDogc3RyaW5nVmFsdWUpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldEludFZhbHVlU3RyaW5nKElBSUZWYWx1ZUludCB2YWx1ZSkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCVBWYXJpYWJsZUZvcm1hdCBmb3JtYXQgPSBnZXRQYXJlbnRWYXJpYWJsZSgpLmdldEZvcm1hdCgpOwotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSB2YWx1ZS5nZXRWYWx1ZVN0cmluZygpOwotCQlpZiAoUFZhcmlhYmxlRm9ybWF0Lk5BVFVSQUwuZXF1YWxzKGZvcm1hdCkgfHwgUFZhcmlhYmxlRm9ybWF0LkRFQ0lNQUwuZXF1YWxzKGZvcm1hdCkpIHsKLQkJCXJldHVybiBzdHJpbmdWYWx1ZTsKLQkJfSBlbHNlIGlmIChQVmFyaWFibGVGb3JtYXQuSEVYQURFQ0lNQUwuZXF1YWxzKGZvcm1hdCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIjB4Iik7Ci0JCQlpZiAodmFsdWUuaXNTaG9ydCgpKSB7Ci0JCQkJc3RyaW5nVmFsdWUgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZhbHVlLnNob3J0VmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKHZhbHVlLmlzSW50KCkpIHsKLQkJCQlzdHJpbmdWYWx1ZSA9IEludGVnZXIudG9IZXhTdHJpbmcodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKHZhbHVlLmlzTG9uZygpKSB7Ci0JCQkJc3RyaW5nVmFsdWUgPSBMb25nLnRvSGV4U3RyaW5nKHZhbHVlLmxvbmdWYWx1ZSgpKTsKLQkJCX0KLQkJCXNiLmFwcGVuZCgoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiA4KSA/IHN0cmluZ1ZhbHVlLnN1YnN0cmluZyhzdHJpbmdWYWx1ZS5sZW5ndGgoKSAtIDgpIDogc3RyaW5nVmFsdWUpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldEZsb2F0aW5nUG9pbnRWYWx1ZVN0cmluZyhJQUlGVmFsdWVGbG9hdCB2YWx1ZSkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCWlmICh2YWx1ZS5pc0RvdWJsZSgpKSB7Ci0JCQlyZXR1cm4gZ2V0RG91YmxlVmFsdWVTdHJpbmcodmFsdWUuZ2V0VmFsdWVTdHJpbmcoKSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUuaXNGbG9hdCgpKSB7Ci0JCQlyZXR1cm4gZ2V0RmxvYXRWYWx1ZVN0cmluZyh2YWx1ZS5nZXRWYWx1ZVN0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB2YWx1ZS5nZXRWYWx1ZVN0cmluZygpOwotCQl9Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldEZsb2F0VmFsdWVTdHJpbmcoU3RyaW5nIGZsb2F0VmFsdWUpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlQVmFyaWFibGVGb3JtYXQgZm9ybWF0ID0gZ2V0UGFyZW50VmFyaWFibGUoKS5nZXRGb3JtYXQoKTsKLQkJaWYgKFBWYXJpYWJsZUZvcm1hdC5OQVRVUkFMLmVxdWFscyhmb3JtYXQpKSB7Ci0JCQlyZXR1cm4gZmxvYXRWYWx1ZTsKLQkJfQotCQlGbG9hdCBmbHQgPSBuZXcgRmxvYXQoZmxvYXRWYWx1ZSk7Ci0JCWlmIChmbHQuaXNOYU4oKSB8fCBmbHQuaXNJbmZpbml0ZSgpKQotCQkJcmV0dXJuICIiOwotCQlsb25nIGxvbmdWYWx1ZSA9IGZsdC5sb25nVmFsdWUoKTsKLQkJaWYgKFBWYXJpYWJsZUZvcm1hdC5ERUNJTUFMLmVxdWFscyhmb3JtYXQpKSB7Ci0JCQlyZXR1cm4gTG9uZy50b1N0cmluZyhsb25nVmFsdWUpOwotCQl9IGVsc2UgaWYgKFBWYXJpYWJsZUZvcm1hdC5IRVhBREVDSU1BTC5lcXVhbHMoZm9ybWF0KSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiMHgiKTsKLQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IExvbmcudG9IZXhTdHJpbmcobG9uZ1ZhbHVlKTsKLQkJCXNiLmFwcGVuZCgoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiA4KSA/IHN0cmluZ1ZhbHVlLnN1YnN0cmluZyhzdHJpbmdWYWx1ZS5sZW5ndGgoKSAtIDgpIDogc3RyaW5nVmFsdWUpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZsb2F0VmFsdWU7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldERvdWJsZVZhbHVlU3RyaW5nKFN0cmluZyBkb3VibGVWYWx1ZSkgdGhyb3dzIEFJRkV4Y2VwdGlvbiB7Ci0JCVBWYXJpYWJsZUZvcm1hdCBmb3JtYXQgPSBnZXRQYXJlbnRWYXJpYWJsZSgpLmdldEZvcm1hdCgpOwotCQlpZiAoUFZhcmlhYmxlRm9ybWF0Lk5BVFVSQUwuZXF1YWxzKGZvcm1hdCkpIHsKLQkJCXJldHVybiBkb3VibGVWYWx1ZTsKLQkJfQotCQlEb3VibGUgZGJsID0gbmV3IERvdWJsZShkb3VibGVWYWx1ZSk7Ci0JCWlmIChkYmwuaXNOYU4oKSB8fCBkYmwuaXNJbmZpbml0ZSgpKQotCQkJcmV0dXJuICIiOwotCQlsb25nIGxvbmdWYWx1ZSA9IGRibC5sb25nVmFsdWUoKTsKLQkJaWYgKFBWYXJpYWJsZUZvcm1hdC5ERUNJTUFMLmVxdWFscyhmb3JtYXQpKSB7Ci0JCQlyZXR1cm4gTG9uZy50b1N0cmluZyhsb25nVmFsdWUpOwotCQl9IGVsc2UgaWYgKFBWYXJpYWJsZUZvcm1hdC5IRVhBREVDSU1BTC5lcXVhbHMoZm9ybWF0KSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiMHgiKTsKLQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IExvbmcudG9IZXhTdHJpbmcobG9uZ1ZhbHVlKTsKLQkJCXNiLmFwcGVuZCgoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAxNikgPyBzdHJpbmdWYWx1ZS5zdWJzdHJpbmcoc3RyaW5nVmFsdWUubGVuZ3RoKCkgLSAxNikgOiBzdHJpbmdWYWx1ZSk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZG91YmxlVmFsdWU7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFBvaW50ZXJWYWx1ZVN0cmluZyhJQUlGVmFsdWVQb2ludGVyIHZhbHVlKSB0aHJvd3MgQUlGRXhjZXB0aW9uIHsKLQkJQmlnSW50ZWdlciBwdiA9IHZhbHVlLnBvaW50ZXJWYWx1ZSgpOwotCQlpZiAocHYgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQkJUFZhcmlhYmxlRm9ybWF0IGZvcm1hdCA9IGdldFBhcmVudFZhcmlhYmxlKCkuZ2V0Rm9ybWF0KCk7Ci0JCWlmIChQVmFyaWFibGVGb3JtYXQuTkFUVVJBTC5lcXVhbHMoZm9ybWF0KSB8fCBQVmFyaWFibGVGb3JtYXQuSEVYQURFQ0lNQUwuZXF1YWxzKGZvcm1hdCkpCi0JCQlyZXR1cm4gcHYudG9TdHJpbmcoMTYpOwotCQlpZiAoUFZhcmlhYmxlRm9ybWF0LkRFQ0lNQUwuZXF1YWxzKGZvcm1hdCkpCi0JCQlyZXR1cm4gcHYudG9TdHJpbmcoMTApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0V0NoYXJWYWx1ZVN0cmluZyhJQUlGVmFsdWVTdHJpbmcgdmFsdWUpIHRocm93cyBBSUZFeGNlcHRpb24gewotCQlyZXR1cm4gdmFsdWUuZ2V0VmFsdWVTdHJpbmcoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCXJlc2V0U3RhdHVzKCk7Ci0JCWZWYWx1ZVN0cmluZyA9IG51bGw7Ci0JCUl0ZXJhdG9yPElWYXJpYWJsZT4gaXQgPSBmVmFyaWFibGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCSgoQWJzdHJhY3RQVmFyaWFibGUpIGl0Lm5leHQoKSkucmVzZXRWYWx1ZSgpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHByZXNlcnZlKCkgewotCQlzZXRDaGFuZ2VkKGZhbHNlKTsKLQkJcmVzZXRTdGF0dXMoKTsKLQkJSXRlcmF0b3I8SVZhcmlhYmxlPiBpdCA9IGZWYXJpYWJsZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChBYnN0cmFjdFBWYXJpYWJsZSkgaXQubmV4dCgpKS5wcmVzZXJ2ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BWYWx1ZUZhY3RvcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QVmFsdWVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTQwNTcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BWYWx1ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuUERlYnVnRWxlbWVudFN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUFZhbHVlRmFjdG9yeSB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBJUFZhbHVlIE5VTExfVkFMVUUgPSBuZXcgSVBWYWx1ZSgpIHsKLQkJcHVibGljIElBSUYgZ2V0QUlGKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIElQU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNBbGxvY2F0ZWQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IElWYXJpYWJsZVswXTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkgewotCQkJcmV0dXJuIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCX0KLQkJcHVibGljIElEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBJTGF1bmNoIGdldExhdW5jaCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGV2YWx1YXRlQXNFeHByZXNzaW9uKElQU3RhY2tGcmFtZSBmcmFtZSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBQRGVidWdFbGVtZW50U3RhdGUgZ2V0U3RhdGUoKSB7Ci0JCQlyZXR1cm4gUERlYnVnRWxlbWVudFN0YXRlLlVOREVGSU5FRDsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnRTdGF0ZUluZm8oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgaW50IGdldElEKCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQlzdGF0aWMgcHVibGljIFBWYWx1ZSBjcmVhdGVWYWx1ZShQVmFyaWFibGUgcGFyZW50LCBJUERJVmFyaWFibGUgdmFyaWFibGUpIHsKLQkJcmV0dXJuIG5ldyBQVmFsdWUocGFyZW50LCB2YXJpYWJsZSk7Ci0JfQotCXN0YXRpYyBwdWJsaWMgUEluZGV4ZWRWYWx1ZSBjcmVhdGVJbmRleGVkVmFsdWUoQWJzdHJhY3RQVmFyaWFibGUgcGFyZW50LCBJUERJVmFyaWFibGUgdmFyaWFibGUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IFBJbmRleGVkVmFsdWUocGFyZW50LCB2YXJpYWJsZSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCXN0YXRpYyBwdWJsaWMgUFZhbHVlIGNyZWF0ZVZhbHVlV2l0aEVycm9yKFBWYXJpYWJsZSBwYXJlbnQsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgUFZhbHVlKHBhcmVudCwgbWVzc2FnZSk7Ci0JfQotCXN0YXRpYyBwdWJsaWMgUFZhbHVlIGNyZWF0ZUdsb2JhbFZhbHVlKFBWYXJpYWJsZSBwYXJlbnQsIElQRElWYXJpYWJsZSB2YXJpYWJsZSkgewotCQlyZXR1cm4gbmV3IFBHbG9iYWxWYWx1ZShwYXJlbnQsIHZhcmlhYmxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFZhcmlhYmxlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZWE3YTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL21vZGVsL1BWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5QVmFyaWFibGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJUmVzdW1lZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJVmFyaWFibGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElWYXJpYWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5JQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVQb2ludGVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQVmFyaWFibGUgZXh0ZW5kcyBBYnN0cmFjdFBWYXJpYWJsZSBpbXBsZW1lbnRzIElQRElFdmVudExpc3RlbmVyIHsKLQlpbnRlcmZhY2UgSUludGVybmFsVmFyaWFibGUgewotCQlJSW50ZXJuYWxWYXJpYWJsZSBjcmVhdGVTaGFkb3coaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGNyZWF0ZVNoYWRvdyhTdHJpbmcgdHlwZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCQlTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQkJSVBWYWx1ZSBnZXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQkJdm9pZCBzZXRWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCQlib29sZWFuIGlzQ2hhbmdlZCgpOwotCQl2b2lkIHNldENoYW5nZWQoYm9vbGVhbiBjaGFuZ2VkKTsKLQkJdm9pZCBkaXNwb3NlKGJvb2xlYW4gZGVzdHJveSk7Ci0JCWJvb2xlYW4gaXNTYW1lRGVzY3JpcHRvcihJUERJVmFyaWFibGVEZXNjcmlwdG9yIGRlc2MpOwotCQlib29sZWFuIGlzU2FtZVZhcmlhYmxlKElQRElWYXJpYWJsZSBwZGlWYXIpOwotCQl2b2lkIHJlc2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBpc0VkaXRhYmxlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCQlib29sZWFuIGlzQXJndW1lbnQoKTsKLQkJaW50IHNpemVvZigpOwotCQl2b2lkIGludmFsaWRhdGVWYWx1ZSgpOwotCQl2b2lkIHByZXNlcnZlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0VuYWJsZWQgPSB0cnVlOwotCXByaXZhdGUgSUludGVybmFsVmFyaWFibGUgZk9yaWdpbmFsOwotCXByaXZhdGUgSUludGVybmFsVmFyaWFibGUgZlNoYWRvdzsKLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIFBWYXJpYWJsZUZvcm1hdCBmRm9ybWF0ID0gUFZhcmlhYmxlRm9ybWF0LmdldEZvcm1hdChQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KElQRGVidWdDb25zdGFudHMuUFJFRl9ERUZBVUxUX1ZBUklBQkxFX0ZPUk1BVCkpOwotCXByaXZhdGUgYm9vbGVhbiBmSXNEaXNwb3NlZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFBWYXJpYWJsZShQRGVidWdFbGVtZW50IHBhcmVudCwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBwZGlWYXJpYWJsZU9iamVjdCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpZiAocGRpVmFyaWFibGVPYmplY3QgIT0gbnVsbCkgewotCQkJc2V0TmFtZShwZGlWYXJpYWJsZU9iamVjdC5nZXROYW1lKCkpOwotCQkJY3JlYXRlT3JpZ2luYWwocGRpVmFyaWFibGVPYmplY3QpOwotCQl9Ci0JCWZJc0VuYWJsZWQgPSAocGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RQVmFsdWUpID8gKChBYnN0cmFjdFBWYWx1ZSkgcGFyZW50KS5nZXRQYXJlbnRWYXJpYWJsZSgpLmlzRW5hYmxlZCgpIDogIWlzQm9va2tlZXBpbmdFbmFibGVkKCk7Ci0JCWdldFBESVNlc3Npb24oKS5nZXRFdmVudE1hbmFnZXIoKS5hZGRFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgUFZhcmlhYmxlKFBEZWJ1Z0VsZW1lbnQgcGFyZW50LCBJUERJVmFyaWFibGVEZXNjcmlwdG9yIHBkaVZhcmlhYmxlT2JqZWN0LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWlmIChwZGlWYXJpYWJsZU9iamVjdCAhPSBudWxsKSB7Ci0JCQlzZXROYW1lKHBkaVZhcmlhYmxlT2JqZWN0LmdldE5hbWUoKSk7Ci0JCQljcmVhdGVPcmlnaW5hbChwZGlWYXJpYWJsZU9iamVjdCk7Ci0JCX0KLQkJZklzRW5hYmxlZCA9ICFpc0Jvb2trZWVwaW5nRW5hYmxlZCgpOwotCQlzZXRTdGF0dXMoSVBEZWJ1Z0VsZW1lbnRTdGF0dXMuRVJST1IsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvcmVNb2RlbE1lc3NhZ2VzLmdldFN0cmluZygiUFZhcmlhYmxlLjEiKSwgbmV3IE9iamVjdFtdIHsgZXJyb3JNZXNzYWdlIH0pKTsKLQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLmFkZEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZJc0VuYWJsZWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldE9yaWdpbmFsKCk7Ci0JCWlmIChpdiAhPSBudWxsKQotCQkJaXYuZGlzcG9zZSh0cnVlKTsKLQkJaXYgPSBnZXRTaGFkb3coKTsKLQkJaWYgKGl2ICE9IG51bGwpCi0JCQlpdi5kaXNwb3NlKHRydWUpOwotCQlmSXNFbmFibGVkID0gZW5hYmxlZDsKLQkJZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuU1RBVEUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVEaXNhYmxlKCkgewotCQlyZXR1cm4gIShnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElWYWx1ZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQXJndW1lbnQoKSB7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGl2ID0gZ2V0T3JpZ2luYWwoKTsKLQkJcmV0dXJuIChpdiAhPSBudWxsKSA/IGl2LmlzQXJndW1lbnQoKSA6IGZhbHNlOwotCX0KLQlwdWJsaWMgSVBWYWx1ZSBnZXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghaXNEaXNwb3NlZCgpICYmIGlzRW5hYmxlZCgpKSB7Ci0JCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCk7Ci0JCQlpZiAoaXYgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBpdi5nZXRWYWx1ZSgpOwotCQkJCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJc2V0U3RhdHVzKElQRGVidWdFbGVtZW50U3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBQVmFsdWVGYWN0b3J5Lk5VTExfVkFMVUU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUlBSUYgYWlmID0gZ2V0QUlGKCk7Ci0JCXJldHVybiAoYWlmICE9IG51bGwpID8gYWlmLmdldFR5cGUoKS50b1N0cmluZygpIDogIiI7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc1ZhbHVlQ2hhbmdlZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChpc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGl2ID0gZ2V0Q3VycmVudEludGVybmFsVmFyaWFibGUoKTsKLQkJcmV0dXJuIChpdiAhPSBudWxsKSA/IGl2LmlzQ2hhbmdlZCgpIDogZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRm9ybWF0dGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBQVmFyaWFibGVGb3JtYXQgZ2V0Rm9ybWF0KCkgewotCQlyZXR1cm4gZkZvcm1hdDsKLQl9Ci0JcHVibGljIHZvaWQgY2hhbmdlRm9ybWF0KFBWYXJpYWJsZUZvcm1hdCBmb3JtYXQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXNldEZvcm1hdChmb3JtYXQpOwotCQlyZXNldFZhbHVlKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGNhbkNhc3RUb0FycmF5KCkgewotCQl0cnkgewotCQkJcmV0dXJuIChnZXRPcmlnaW5hbCgpICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYgKGdldEFJRigpLmdldFR5cGUoKSBpbnN0YW5jZW9mIElBSUZUeXBlUG9pbnRlcikpOwotCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgY2FzdFRvQXJyYXkoaW50IHN0YXJ0SW5kZXgsIGludCBsZW5ndGgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGN1cnJlbnQgPSBnZXRDdXJyZW50SW50ZXJuYWxWYXJpYWJsZSgpOwotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQlJSW50ZXJuYWxWYXJpYWJsZSBuZXdWYXIgPSBjdXJyZW50LmNyZWF0ZVNoYWRvdyhzdGFydEluZGV4LCBsZW5ndGgpOwotCQkJaWYgKGdldFNoYWRvdygpICE9IG51bGwpCi0JCQkJZ2V0U2hhZG93KCkuZGlzcG9zZSh0cnVlKTsKLQkJCXNldFNoYWRvdyhuZXdWYXIpOwotCQkJcmVzZXRWYWx1ZSgpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCk7Ci0JCWlmIChpdiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3RXhwcmVzc2lvbiA9IHByb2Nlc3NFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQkJaXYuc2V0VmFsdWUobmV3RXhwcmVzc2lvbik7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0VmFsdWUoSVZhbHVlIHZhbHVlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlub3RTdXBwb3J0ZWQoQ29yZU1vZGVsTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVmFyaWFibGUuMyIpKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNWYWx1ZU1vZGlmaWNhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDdXJyZW50SW50ZXJuYWxWYXJpYWJsZSgpLmlzRWRpdGFibGUoKTsKLQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIHZlcmlmeVZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoSVZhbHVlIHZhbHVlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gdmFsdWUuZ2V0RGVidWdUYXJnZXQoKS5lcXVhbHMoZ2V0RGVidWdUYXJnZXQoKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGNhbkNhc3QoKSB7Ci0JCXJldHVybiAoZ2V0T3JpZ2luYWwoKSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVzdG9yZU9yaWdpbmFsKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJSUludGVybmFsVmFyaWFibGUgb2xkVmFyID0gZ2V0U2hhZG93KCk7Ci0JCXNldFNoYWRvdyhudWxsKTsKLQkJaWYgKG9sZFZhciAhPSBudWxsKQotCQkJb2xkVmFyLmRpc3Bvc2UodHJ1ZSk7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGl2ID0gZ2V0T3JpZ2luYWwoKTsKLQkJaWYgKGl2ICE9IG51bGwpCi0JCQlpdi5pbnZhbGlkYXRlVmFsdWUoKTsKLQkJcmVzZXRWYWx1ZSgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc3RlZCgpIHsKLQkJcmV0dXJuIChnZXRTaGFkb3coKSAhPSBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoSVBESUV2ZW50W10gZXZlbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUERJRXZlbnQgZXZlbnQgPSBldmVudHNbaV07Ci0JCQlpZiAoIWV2ZW50LmNvbnRhaW5zKGdldFRhc2tzKCkpKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUERJQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJaGFuZGxlQ2hhbmdlZEV2ZW50KChJUERJQ2hhbmdlZEV2ZW50KSBldmVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQRElSZXN1bWVkRXZlbnQpIHsKLQkJCQloYW5kbGVSZXN1bWVkRXZlbnQoKElQRElSZXN1bWVkRXZlbnQpZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXN1bWVkRXZlbnQoSVBESVJlc3VtZWRFdmVudCBldmVudCkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJaWYgKGhhc0Vycm9ycygpKSB7Ci0JCQlyZXNldFN0YXR1cygpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCk7Ci0JCQlpZiAoaXYgIT0gbnVsbCkKLQkJCQlpdi5pbnZhbGlkYXRlVmFsdWUoKTsKLQkJfQotCQlpZiAoY2hhbmdlZCkKLQkJCWZpcmVDaGFuZ2VFdmVudChEZWJ1Z0V2ZW50LlNUQVRFKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZWRFdmVudChJUERJQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiA9IGV2ZW50LmdldFJlYXNvbigpOwotCQlpZiAocmVhc29uIGluc3RhbmNlb2YgSVBESVZhcmlhYmxlSW5mbykgewotCQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBnZXRDdXJyZW50SW50ZXJuYWxWYXJpYWJsZSgpOwotCQkJaWYgKGl2ICE9IG51bGwpIHsKLQkJCQlpZiAoaXYuaXNTYW1lVmFyaWFibGUoKChJUERJVmFyaWFibGVJbmZvKXJlYXNvbikuZ2V0VmFyaWFibGUoKSkpIHsKLQkJCQkJaXYuc2V0Q2hhbmdlZCh0cnVlKTsKLQkJCQkJZmlyZUNoYW5nZUV2ZW50KERlYnVnRXZlbnQuU1RBVEUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIElJbnRlcm5hbFZhcmlhYmxlIGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCkgewotCQlpZiAoZ2V0U2hhZG93KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTaGFkb3coKTsKLQkJcmV0dXJuIGdldE9yaWdpbmFsKCk7Ci0JfQotCXByaXZhdGUgSUludGVybmFsVmFyaWFibGUgZ2V0T3JpZ2luYWwoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWw7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE9yaWdpbmFsKElJbnRlcm5hbFZhcmlhYmxlIG9yaWdpbmFsKSB7Ci0JCWZPcmlnaW5hbCA9IG9yaWdpbmFsOwotCX0KLQlwcml2YXRlIElJbnRlcm5hbFZhcmlhYmxlIGdldFNoYWRvdygpIHsKLQkJcmV0dXJuIGZTaGFkb3c7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRTaGFkb3coSUludGVybmFsVmFyaWFibGUgc2hhZG93KSB7Ci0JCWZTaGFkb3cgPSBzaGFkb3c7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGlzQm9va2tlZXBpbmdFbmFibGVkKCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcmlnaW5hbChJUERJVmFyaWFibGVEZXNjcmlwdG9yIHZvKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0JCXJldHVybiAhaXNPSygpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDaGFuZ2VkKGJvb2xlYW4gY2hhbmdlZCkgewotCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCk7Ci0JCWlmIChpdiAhPSBudWxsKSB7Ci0JCQlpdi5zZXRDaGFuZ2VkKGNoYW5nZWQpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlc2V0VmFsdWUoKSB7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGl2ID0gZ2V0Q3VycmVudEludGVybmFsVmFyaWFibGUoKTsKLQkJaWYgKGl2ICE9IG51bGwpIHsKLQkJCXJlc2V0U3RhdHVzKCk7Ci0JCQlpdi5yZXNldFZhbHVlKCk7Ci0JCQlmaXJlQ2hhbmdlRXZlbnQoRGVidWdFdmVudC5TVEFURSk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0V4cHJlc3Npb24oU3RyaW5nIG9sZEV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBvbGRFeHByZXNzaW9uOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnRlcm5hbERpc3Bvc2UoZmFsc2UpOwotCQlzZXREaXNwb3NlZCh0cnVlKTsKLQl9Ci0JcHJvdGVjdGVkIGludCBzaXplb2YoKSB7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGl2ID0gZ2V0Q3VycmVudEludGVybmFsVmFyaWFibGUoKTsKLQkJcmV0dXJuIChpdiAhPSBudWxsKSA/IGl2LnNpemVvZigpIDogLTE7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQVmFyaWFibGUpIHsKLQkJCWlmIChpc0Rpc3Bvc2VkKCkgIT0gKChQVmFyaWFibGUpb2JqKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBnZXRPcmlnaW5hbCgpOwotCQkJcmV0dXJuIChpdiAhPSBudWxsKSA/IGl2LmVxdWFscygoKFBWYXJpYWJsZSkgb2JqKS5nZXRPcmlnaW5hbCgpKSA6IGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2FtZVZhcmlhYmxlKElQRElWYXJpYWJsZURlc2NyaXB0b3Igdm8pIHsKLQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBnZXRPcmlnaW5hbCgpOwotCQlyZXR1cm4gKGl2ICE9IG51bGwgJiYgaXYuaXNTYW1lRGVzY3JpcHRvcih2bykpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JtYXQoUFZhcmlhYmxlRm9ybWF0IGZvcm1hdCkgewotCQlmRm9ybWF0ID0gZm9ybWF0OwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCk7Ci0JCXJldHVybiAoaXYgIT0gbnVsbCkgPyBpdi5nZXRRdWFsaWZpZWROYW1lKCkgOiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVzZXJ2ZSgpIHsKLQkJcmVzZXRTdGF0dXMoKTsKLQkJSUludGVybmFsVmFyaWFibGUgaXYgPSBnZXRDdXJyZW50SW50ZXJuYWxWYXJpYWJsZSgpOwotCQlpZiAoaXYgIT0gbnVsbCkKLQkJCWl2LnByZXNlcnZlKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsRGlzcG9zZShib29sZWFuIGRlc3Ryb3kpIHsKLQkJZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50TWFuYWdlcigpLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCUlJbnRlcm5hbFZhcmlhYmxlIGl2ID0gZ2V0T3JpZ2luYWwoKTsKLQkJaWYgKGl2ICE9IG51bGwpCi0JCQlpdi5kaXNwb3NlKGRlc3Ryb3kpOwotCQlpdiA9IGdldFNoYWRvdygpOwotCQlpZiAoaXYgIT0gbnVsbCkKLQkJCWl2LmRpc3Bvc2UoZGVzdHJveSk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBmSXNEaXNwb3NlZDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0RGlzcG9zZWQoYm9vbGVhbiBpc0Rpc3Bvc2VkKSB7Ci0JCWZJc0Rpc3Bvc2VkID0gaXNEaXNwb3NlZDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW52YWxpZGF0ZVZhbHVlKCkgewotCQlyZXNldFN0YXR1cygpOwotCQlJSW50ZXJuYWxWYXJpYWJsZSBpdiA9IGdldEN1cnJlbnRJbnRlcm5hbFZhcmlhYmxlKCk7Ci0JCWlmIChpdiAhPSBudWxsKQotCQkJaXYuaW52YWxpZGF0ZVZhbHVlKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QVmFyaWFibGVGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvbW9kZWwvUFZhcmlhYmxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBlODI2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9tb2RlbC9QVmFyaWFibGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVZhcmlhYmxlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBWYXJpYWJsZUZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgUFZhcmlhYmxlIGNyZWF0ZUxvY2FsVmFyaWFibGUoUERlYnVnRWxlbWVudCBwYXJlbnQsIElQRElWYXJpYWJsZURlc2NyaXB0b3IgcGRpVmFyaWFibGVPYmplY3QpIHsKLQkJcmV0dXJuIG5ldyBQTG9jYWxWYXJpYWJsZShwYXJlbnQsIHBkaVZhcmlhYmxlT2JqZWN0KTsKLQl9Ci0JcHVibGljIHN0YXRpYyBQVmFyaWFibGUgY3JlYXRlTG9jYWxWYXJpYWJsZVdpdGhFcnJvcihQRGVidWdFbGVtZW50IHBhcmVudCwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBwZGlWYXJpYWJsZU9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBQTG9jYWxWYXJpYWJsZShwYXJlbnQsIHBkaVZhcmlhYmxlT2JqZWN0LCBtZXNzYWdlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBJUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvciBjcmVhdGVHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIG5ldyBJUEdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQkJCXJldHVybiAocGF0aCAhPSBudWxsKSA/IHBhdGggOiBuZXcgUGF0aCgiIik7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9Ojp7MX0iLCBuZXcgT2JqZWN0W10geyBnZXRQYXRoKCkudG9PU1N0cmluZygpLCBnZXROYW1lKCkgfSk7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlQR2xvYmFsVmFyaWFibGVEZXNjcmlwdG9yIGQgPSAoSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IpIG9iajsKLQkJCQlyZXR1cm4gKGdldE5hbWUoKS5jb21wYXJlVG8oZC5nZXROYW1lKCkpID09IDAgJiYgZ2V0UGF0aCgpLmVxdWFscyhkLmdldFBhdGgoKSkpOwotCQkJfQotCQl9OwotCX0KLQlwdWJsaWMgc3RhdGljIFBHbG9iYWxWYXJpYWJsZSBjcmVhdGVHbG9iYWxWYXJpYWJsZShQRGVidWdFbGVtZW50IHBhcmVudCwgSVBHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgSVBESVZhcmlhYmxlRGVzY3JpcHRvciBwZGlWYXJpYWJsZU9iamVjdCkgewotCQlyZXR1cm4gbmV3IFBHbG9iYWxWYXJpYWJsZShwYXJlbnQsIGRlc2NyaXB0b3IsIHBkaVZhcmlhYmxlT2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL0Fic29sdXRlUGF0aFNvdXJjZUNvbnRhaW5lclR5cGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvQWJzb2x1dGVQYXRoU291cmNlQ29udGFpbmVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRlMWViLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvQWJzb2x1dGVQYXRoU291cmNlQ29udGFpbmVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5BYnN0cmFjdFNvdXJjZUNvbnRhaW5lclR5cGVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuQWJzb2x1dGVQYXRoU291cmNlQ29udGFpbmVyOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIEFic29sdXRlUGF0aFNvdXJjZUNvbnRhaW5lclR5cGUgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUNvbnRhaW5lclR5cGVEZWxlZ2F0ZSB7Ci0JcHVibGljIElTb3VyY2VDb250YWluZXIgY3JlYXRlU291cmNlQ29udGFpbmVyKFN0cmluZyBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQWJzb2x1dGVQYXRoU291cmNlQ29udGFpbmVyKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVtZW50byhJU291cmNlQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9Db21tb25Tb3VyY2VMb29rdXBEaXJlY3Rvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9Db21tb25Tb3VyY2VMb29rdXBEaXJlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWMwZWRjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvQ29tbW9uU291cmNlTG9va3VwRGlyZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5QU291cmNlTG9va3VwRGlyZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvciBleHRlbmRzIFBTb3VyY2VMb29rdXBEaXJlY3RvciB7Ci0JcHVibGljIHZvaWQgc2V0U291cmNlQ29udGFpbmVycyhJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVycykgewotCQl0cnkgewotCQkJc3VwZXIuc2V0U291cmNlQ29udGFpbmVycyhjb250YWluZXJzKTsKLQkJCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShJUERlYnVnQ29uc3RhbnRzLlBSRUZfQ09NTU9OX1NPVVJDRV9DT05UQUlORVJTLCBnZXRNZW1lbnRvKCkpOwotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9JbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL0ludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjNjRmZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL0ludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMoKSB7fQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9JbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjhkZWIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9JbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBRTlggU29mdHdhcmUgU3lzdGVtcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QUERpcmVjdG9yeVNvdXJjZUxvY2F0aW9uLjA9VW5hYmxlIHRvIGNyZWF0ZSBtZW1lbnRvIGZvciBQVFAgZGlyZWN0b3J5IHNvdXJjZSBsb2NhdGlvbiB7MH0uCi1QRGlyZWN0b3J5U291cmNlTG9jYXRpb24uMT1VbmFibGUgdG8gaW5pdGlhbGl6ZSBzb3VyY2UgbG9jYXRpb24gLSBtaXNzaW5nIGRpcmVjdG9yeSBwYXRoLgotUERpcmVjdG9yeVNvdXJjZUxvY2F0aW9uLjI9VW5hYmxlIHRvIGluaXRpYWxpemUgc291cmNlIGxvY2F0aW9uIC0gaW52YWxpZCBkaXJlY3RvcnkgcGF0aCB7MH0uCi1QRGlyZWN0b3J5U291cmNlTG9jYXRpb24uMz1FeGNlcHRpb24gb2NjdXJyZWQgaW5pdGlhbGl6aW5nIHNvdXJjZSBsb2NhdGlvbi4KLVBEaXJlY3RvcnlTb3VyY2VDb250YWluZXJUeXBlLjA9VW5hYmxlIHRvIHJlc3RvcmUgZGlyZWN0b3J5IHNvdXJjZSBsb29rdXAgZW50cnkgLSBtaXNzaW5nIHBhdGggYXR0cmlidXRlLgotUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lclR5cGUuMT1VbmFibGUgdG8gcmVzdG9yZSBkaXJlY3Rvcnkgc291cmNlIGxvb2t1cCBlbnRyeSAtIGV4cGVjdGluZyBkaXJlY3RvcnkgZWxlbWVudC4KLVBEaXJlY3RvcnlTb3VyY2VDb250YWluZXJUeXBlLjI9VW5hYmxlIHRvIHJlc3RvcmUgZGlyZWN0b3J5IHNvdXJjZSBsb29rdXAgZW50cnkgLSBpbnZhbGlkIG1lbWVudG8uCi1QUHJvamVjdFNvdXJjZUxvY2F0aW9uLjA9VW5hYmxlIHRvIGNyZWF0ZSBtZW1lbnRvIGZvciBQVFAgcHJvamVjdCBzb3VyY2UgbG9jYXRpb24gezB9LgotUFByb2plY3RTb3VyY2VMb2NhdGlvbi4xPVVuYWJsZSB0byBpbml0aWFsaXplIHNvdXJjZSBsb2NhdGlvbiAtIG1pc3NpbmcgcHJvamVjdCBuYW1lCi1QUHJvamVjdFNvdXJjZUxvY2F0aW9uLjI9RXhjZXB0aW9uIG9jY3VycmVkIGluaXRpYWxpemluZyBzb3VyY2UgbG9jYXRpb24uCi1QU291cmNlTG9jYXRvci4wPVVuYWJsZSB0byBjcmVhdGUgbWVtZW50byBmb3IgUFRQIHNvdXJjZSBsb2NhdG9yLgotUFNvdXJjZUxvY2F0b3IuMT1VbmFibGUgdG8gcmVzdG9yZSBQVFAgc291cmNlIGxvY2F0b3IgLSBpbnZhbGlkIGZvcm1hdC4KLVBTb3VyY2VMb2NhdG9yLjI9RXhjZXB0aW9uIG9jY3VycmVkIGluaXRpYWxpemluZyBzb3VyY2UgbG9jYXRvci4KLVBTb3VyY2VMb2NhdG9yLjM9RXJyb3IgaW5pdGlhbGl6aW5nIGRpcmVjdG9yeSBzb3VyY2UgbG9jYXRpb24uCi1NYXBFbnRyeVNvdXJjZUNvbnRhaW5lclR5cGUuMD1Tb3VyY2UgbG9va3VwOiB1bmFibGUgdG8gcmVzdG9yZSBtYXAgZW50cnkgLSBtaXNzaW5nIGJhY2tlbmQgcGF0aCBhdHRyaWJ1dGUuCi1NYXBFbnRyeVNvdXJjZUNvbnRhaW5lclR5cGUuMT1Tb3VyY2UgbG9va3VwOiB1bmFibGUgdG8gcmVzdG9yZSBtYXAgZW50cnkgLSBtaXNzaW5nIGxvY2FsIHBhdGggYXR0cmlidXRlLgotTWFwRW50cnlTb3VyY2VDb250YWluZXJUeXBlLjI9U291cmNlIGxvb2t1cDogdW5hYmxlIHRvIHJlc3RvcmUgbWFwIGVudHJ5IC0gZXhwZWN0aW5nIG1hcCBlbnRyeSBlbGVtZW50LgotTWFwRW50cnlTb3VyY2VDb250YWluZXJUeXBlLjM9U291cmNlIGxvb2t1cDogdW5hYmxlIHRvIHJlc3RvcmUgbWFwIGVudHJ5IC0gaW52YWxpZCBtZW1lbnRvLgotTWFwcGluZ1NvdXJjZUNvbnRhaW5lclR5cGUuMD1Tb3VyY2UgbG9va3VwOiB1bmFibGUgdG8gcmVzdG9yZSBtYXAgZW50cnkgLSBleHBlY3RpbmcgbWVtbnRvIGF0dHJpYnV0ZS4KLU1hcHBpbmdTb3VyY2VDb250YWluZXJUeXBlLjE9U291cmNlIGxvb2t1cDogdW5hYmxlIHRvIHJlc3RvcmUgbWFwcGluZyAtIGV4cGVjdGluZyBtYXBwaW5nIGVsZW1lbnQuCi1NYXBwaW5nU291cmNlQ29udGFpbmVyVHlwZS4yPVNvdXJjZSBsb29rdXA6IHVuYWJsZSB0byByZXN0b3JlIG1hcHBpbmcgLSBpbnZhbGlkIG1lbWVudG8uCi1Tb3VyY2VVdGlscy4wPU1hcHBpbmcKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvTWFwRW50cnlTb3VyY2VDb250YWluZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvTWFwRW50cnlTb3VyY2VDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3MmU3NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL01hcEVudHJ5U291cmNlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkFic3RyYWN0U291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuTG9jYWxGaWxlU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0U291cmNlQ29udGFpbmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuY29udGFpbmVyVHlwZS5tYXBFbnRyeSI7Ci0JcHJpdmF0ZSBJUGF0aCBmTG9jYWxQYXRoOwotCXByaXZhdGUgSVBhdGggZkJhY2tlbmRQYXRoOwotCi0JcHVibGljIE1hcEVudHJ5U291cmNlQ29udGFpbmVyKCkgewotCQlmQmFja2VuZFBhdGggPSBQYXRoLkVNUFRZOwotCQlmTG9jYWxQYXRoID0gUGF0aC5FTVBUWTsKLQl9Ci0JcHVibGljIE1hcEVudHJ5U291cmNlQ29udGFpbmVyKElQYXRoIGJhY2tlbmQsIElQYXRoIGxvY2FsKSB7Ci0JCWZCYWNrZW5kUGF0aCA9IGJhY2tlbmQ7Ci0JCWZMb2NhbFBhdGggPSBsb2NhbDsKLQl9Ci0JcHVibGljIE9iamVjdFtdIGZpbmRTb3VyY2VFbGVtZW50cyhTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7Ci0JCWlmIChnZXRCYWNrZW5kUGF0aCgpLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoZ2V0QmFja2VuZFBhdGgoKS5zZWdtZW50Q291bnQoKSk7Ci0JCQlwYXRoID0gZ2V0TG9jYWxQYXRoKCkuYXBwZW5kKHBhdGgpOwotCQkJSUZpbGVbXSB3c0ZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihwYXRoKTsKLQkJCUFycmF5TGlzdDxJRmlsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHdzRmlsZXMubGVuZ3RoOyArK2opIHsKLQkJCQlpZiAod3NGaWxlc1tqXS5leGlzdHMoKSkgewotCQkJCQlsaXN0LmFkZCh3c0ZpbGVzW2pdKTsKLQkJCQkJaWYgKCFpc0ZpbmREdXBsaWNhdGVzKCkpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGlzdC5zaXplKCkgPiAwKQotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBMb2NhbEZpbGVTdG9yYWdlKGZpbGUpIH07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVNUFRZOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9IC0gezF9IiwgbmV3IE9iamVjdFtdIHsgZ2V0QmFja2VuZFBhdGgoKS50b09TU3RyaW5nKCksIGdldExvY2FsUGF0aCgpLnRvT1NTdHJpbmcoKSB9KTsKLQl9Ci0JcHVibGljIElTb3VyY2VDb250YWluZXJUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VDb250YWluZXJUeXBlKFRZUEVfSUQpOwotCX0KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlyZXR1cm4gZkxvY2FsUGF0aDsKLQl9Ci0JcHVibGljIElQYXRoIGdldEJhY2tlbmRQYXRoKCkgewotCQlyZXR1cm4gZkJhY2tlbmRQYXRoOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbFBhdGgoSVBhdGggbG9jYWwpIHsKLQkJZkxvY2FsUGF0aCA9IGxvY2FsOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZW5kUGF0aChJUGF0aCBiYWNrZW5kKSB7Ci0JCWZCYWNrZW5kUGF0aCA9IGJhY2tlbmQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgTWFwRW50cnlTb3VyY2VDb250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBlbnRyeSA9IChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcikgbzsKLQkJcmV0dXJuIChlbnRyeS5nZXRCYWNrZW5kUGF0aCgpLmVxdWFscyhnZXRCYWNrZW5kUGF0aCgpKSAmJiBlbnRyeS5nZXRMb2NhbFBhdGgoKS5lcXVhbHMoZ2V0TG9jYWxQYXRoKCkpKTsKLQl9Ci0JcHVibGljIE1hcEVudHJ5U291cmNlQ29udGFpbmVyIGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgTWFwRW50cnlTb3VyY2VDb250YWluZXIoZkJhY2tlbmRQYXRoLCBmTG9jYWxQYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL01hcEVudHJ5U291cmNlQ29udGFpbmVyVHlwZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9NYXBFbnRyeVNvdXJjZUNvbnRhaW5lclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiNzFjOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL01hcEVudHJ5U291cmNlQ29udGFpbmVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuQWJzdHJhY3RTb3VyY2VDb250YWluZXJUeXBlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIE1hcEVudHJ5U291cmNlQ29udGFpbmVyVHlwZSBleHRlbmRzIEFic3RyYWN0U291cmNlQ29udGFpbmVyVHlwZURlbGVnYXRlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUxFTUVOVF9OQU1FID0gIm1hcEVudHJ5IjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQkFDS0VORF9QQVRIID0gImJhY2tlbmRQYXRoIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DQUxfUEFUSCA9ICJsb2NhbFBhdGgiOwotCi0JcHVibGljIElTb3VyY2VDb250YWluZXIgY3JlYXRlU291cmNlQ29udGFpbmVyKFN0cmluZyBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU5vZGUgbm9kZSA9IHBhcnNlRG9jdW1lbnQobWVtZW50byk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0JCQlpZiAoRUxFTUVOVF9OQU1FLmVxdWFscyhlbGVtZW50LmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShCQUNLRU5EX1BBVEgpOwotCQkJCUlQYXRoIGJhY2tlbmQgPSBuZXcgUGF0aChwYXRoKTsKLQkJCQlpZiAoIWJhY2tlbmQuaXNWYWxpZFBhdGgocGF0aCkpIHsKLQkJCQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcEVudHJ5U291cmNlQ29udGFpbmVyVHlwZS4wIiksIG51bGwpOwotCQkJCX0KLQkJCQlwYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTE9DQUxfUEFUSCk7Ci0JCQkJSVBhdGggbG9jYWwgPSBuZXcgUGF0aChwYXRoKTsKLQkJCQlpZiAoIWxvY2FsLmlzVmFsaWRQYXRoKHBhdGgpKSB7Ci0JCQkJCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBFbnRyeVNvdXJjZUNvbnRhaW5lclR5cGUuMSIpLCBudWxsKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcihiYWNrZW5kLCBsb2NhbCk7Ci0JCQl9Ci0JCQlhYm9ydChJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiTWFwRW50cnlTb3VyY2VDb250YWluZXJUeXBlLjIiKSwgbnVsbCk7Ci0JCX0KLQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcEVudHJ5U291cmNlQ29udGFpbmVyVHlwZS4zIiksIG51bGwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKElTb3VyY2VDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hcEVudHJ5U291cmNlQ29udGFpbmVyIGVudHJ5ID0gKE1hcEVudHJ5U291cmNlQ29udGFpbmVyKWNvbnRhaW5lcjsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXdEb2N1bWVudCgpOwotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEVMRU1FTlRfTkFNRSk7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKEJBQ0tFTkRfUEFUSCwgZW50cnkuZ2V0QmFja2VuZFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShMT0NBTF9QQVRILCBlbnRyeS5nZXRMb2NhbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJcmV0dXJuIHNlcmlhbGl6ZURvY3VtZW50KGRvY3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL01hcHBpbmdTb3VyY2VDb250YWluZXJUeXBlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL01hcHBpbmdTb3VyY2VDb250YWluZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZWQ5MTguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9NYXBwaW5nU291cmNlQ29udGFpbmVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuQWJzdHJhY3RTb3VyY2VDb250YWluZXJUeXBlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLk1hcHBpbmdTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIE1hcHBpbmdTb3VyY2VDb250YWluZXJUeXBlIGV4dGVuZHMgQWJzdHJhY3RTb3VyY2VDb250YWluZXJUeXBlRGVsZWdhdGUgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFTEVNRU5UX01BUFBJTkcgPSAibWFwcGluZyI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfTUFQX0VOVFJZID0gIm1hcEVudHJ5IjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX01FTUVOVE8gPSAibWVtZW50byI7Ci0KLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lciBjcmVhdGVTb3VyY2VDb250YWluZXIoU3RyaW5nIG1lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTm9kZSBub2RlID0gcGFyc2VEb2N1bWVudChtZW1lbnRvKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLQkJCWlmIChFTEVNRU5UX01BUFBJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgCi0JCQkJCW5hbWUgPSAiIjsKLQkJCQlMaXN0PE1hcEVudHJ5U291cmNlQ29udGFpbmVyPiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcj4oKTsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCXdoaWxlKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KWNoaWxkTm9kZTsKLQkJCQkJCWlmIChFTEVNRU5UX01BUF9FTlRSWS5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQlTdHJpbmcgY2hpbGRNZW1lbnRvID0gY2hpbGQuZ2V0QXR0cmlidXRlKEFUVFJfTUVNRU5UTyk7Ci0JCQkJCQkJaWYgKGNoaWxkTWVtZW50byA9PSBudWxsIHx8IGNoaWxkTWVtZW50by5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBwaW5nU291cmNlQ29udGFpbmVyVHlwZS4wIiksIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlJU291cmNlQ29udGFpbmVyVHlwZSB0eXBlID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5nZXRTb3VyY2VDb250YWluZXJUeXBlKE1hcEVudHJ5U291cmNlQ29udGFpbmVyLlRZUEVfSUQpOwotCQkJCQkJCU1hcEVudHJ5U291cmNlQ29udGFpbmVyIGVudHJ5ID0gKE1hcEVudHJ5U291cmNlQ29udGFpbmVyKXR5cGUuY3JlYXRlU291cmNlQ29udGFpbmVyKGNoaWxkTWVtZW50byk7Ci0JCQkJCQkJZW50cmllcy5hZGQoZW50cnkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCQlNYXBwaW5nU291cmNlQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBNYXBwaW5nU291cmNlQ29udGFpbmVyKG5hbWUpOwotCQkJCUl0ZXJhdG9yPE1hcEVudHJ5U291cmNlQ29udGFpbmVyPiBpdCA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCQkJY29udGFpbmVyLmFkZE1hcEVudHJ5KChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcilpdC5uZXh0KCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJfQotCQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcHBpbmdTb3VyY2VDb250YWluZXJUeXBlLjEiKSwgbnVsbCk7Ci0JCX0KLQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcHBpbmdTb3VyY2VDb250YWluZXJUeXBlLjIiKSwgbnVsbCk7Ci0JCXJldHVybiBudWxsOwkJCi0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVtZW50byhJU291cmNlQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG5ld0RvY3VtZW50KCk7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9NQVBQSU5HKTsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9OQU1FLCBjb250YWluZXIuZ2V0TmFtZSgpKTsKLQkJSVNvdXJjZUNvbnRhaW5lcltdIGVudHJpZXMgPSAoKE1hcHBpbmdTb3VyY2VDb250YWluZXIpY29udGFpbmVyKS5nZXRTb3VyY2VDb250YWluZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgewotCQkJRWxlbWVudCBjaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9NQVBfRU5UUlkpOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKEFUVFJfTUVNRU5UTywgZW50cmllc1tpXS5nZXRUeXBlKCkuZ2V0TWVtZW50byhlbnRyaWVzW2ldKSk7Ci0JCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJfQotCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJcmV0dXJuIHNlcmlhbGl6ZURvY3VtZW50KGRvY3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BEaXJlY3RvcnlTb3VyY2VDb250YWluZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjE0OGMzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cDsgCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuQ29tcG9zaXRlU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuTG9jYWxGaWxlU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci0gCi0vKioKLSAqIEl0IGlzIG5vdCBzdXBwb3NlZCB0byBzdWJjbGFzcyBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIsIGJ1dCB3ZSBuZWVkIHRvIHVzZSAKLSAqIHRoZSBkaWZmZXJlbnQgYnJvd3Nlci4KLSAqLwotcHVibGljIGNsYXNzIFBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIgZXh0ZW5kcyBDb21wb3NpdGVTb3VyY2VDb250YWluZXIgewotCi0JLyoqCi0JICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBQVFAgZGlyZWN0b3J5IHNvdXJjZSBjb250YWluZXIgdHlwZQotCSAqICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5jb250YWluZXJUeXBlLmRpcmVjdG9yeTwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi5jb250YWluZXJUeXBlLmRpcmVjdG9yeSI7Ci0KLQkvLyByb290IGRpcmVjdG9yeQotCXByaXZhdGUgRmlsZSBmRGlyZWN0b3J5OwotCS8vIHdoZXRoZXIgdG8gc2VhcmNoIHN1YmZvbGRlcnMKLQlwcml2YXRlIGJvb2xlYW4gZlN1YmZvbGRlcnMgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN1dHJ1Y3RzIGFuIGV4dGVybmFsIGZvbGRlciBjb250YWluZXIgZm9yIHRoZQotCSAqIGRpcmVjdG9yeSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBkaXJQYXRoIHBhdGggdG8gYSBkaXJlY3RvcnkgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0JICogQHBhcmFtIHN1YmZvbGRlcnMgd2hldGhlciBmb2xkZXJzIHdpdGhpbiB0aGUgcm9vdCBkaXJlY3RvcnkKLQkgKiAgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBzb3VyY2UgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lciggSVBhdGggZGlyUGF0aCwgYm9vbGVhbiBzdWJmb2xkZXJzICkgewotCQl0aGlzKCBkaXJQYXRoLnRvRmlsZSgpLCBzdWJmb2xkZXJzICk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN1dHJ1Y3RzIGFuIGV4dGVybmFsIGZvbGRlciBjb250YWluZXIgZm9yIHRoZQotCSAqIGRpcmVjdG9yeSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIgYSBkaXJlY3RvcnkgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0JICogQHBhcmFtIHN1YmZvbGRlcnMgd2hldGhlciBmb2xkZXJzIHdpdGhpbiB0aGUgcm9vdCBkaXJlY3RvcnkKLQkgKiAgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBzb3VyY2UgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lciggRmlsZSBkaXIsIGJvb2xlYW4gc3ViZm9sZGVycyApIHsKLQkJZkRpcmVjdG9yeSA9IGRpcjsKLQkJZlN1YmZvbGRlcnMgPSBzdWJmb2xkZXJzOwotCX0JCi0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkRpcmVjdG9yeS5nZXROYW1lKCk7Ci0JfQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGRpcmVjdG9yeSBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gYXNzb2NpYXRlZAotCSAqIHdpdGggdGhpcyBzb3VyY2UgY29udGFpbmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJvb3QgZGlyZWN0b3J5IGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGlzIHNvdXJjZSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXREaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBmRGlyZWN0b3J5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNlYXJjaFN1YmZvbGRlcnMoKSB7Ci0JCXJldHVybiBmU3ViZm9sZGVyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlQ29udGFpbmVyVHlwZSggVFlQRV9JRCApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXIjZmluZFNvdXJjZUVsZW1lbnRzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGZpbmRTb3VyY2VFbGVtZW50cyggU3RyaW5nIG5hbWUgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxPYmplY3Q+IHNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJRmlsZSBkaXJlY3RvcnkgPSBnZXREaXJlY3RvcnkoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIGRpcmVjdG9yeSwgbmFtZSApOwotCQlpZiAoIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKSApIHsKLQkJCXNvdXJjZXMuYWRkKCBuZXcgTG9jYWxGaWxlU3RvcmFnZSggZmlsZSApICk7Ci0JCX0KLQkJLy8gY2hlY2sgc3ViZm9sZGVycwotCQlpZiAoIChpc0ZpbmREdXBsaWNhdGVzKCkgJiYgZlN1YmZvbGRlcnMpIHx8IChzb3VyY2VzLmlzRW1wdHkoKSAmJiBmU3ViZm9sZGVycykgKSB7Ci0JCQlJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLQkJCWZvciggaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7IGkrKyApIHsKLQkJCQlPYmplY3RbXSBvYmplY3RzID0gY29udGFpbmVyc1tpXS5maW5kU291cmNlRWxlbWVudHMoIG5hbWUgKTsKLQkJCQlpZiAoIG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmxlbmd0aCA9PSAwICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKCBpc0ZpbmREdXBsaWNhdGVzKCkgKSB7Ci0JCQkJCWZvciggaW50IGogPSAwOyBqIDwgb2JqZWN0cy5sZW5ndGg7IGorKyApCi0JCQkJCQlzb3VyY2VzLmFkZCggb2JqZWN0c1tqXSApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc291cmNlcy5hZGQoIG9iamVjdHNbMF0gKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICggc291cmNlcy5pc0VtcHR5KCkgKQotCQkJcmV0dXJuIEVNUFRZOwotCQlyZXR1cm4gc291cmNlcy50b0FycmF5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNpc0NvbXBvc2l0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBmU3ViZm9sZGVyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyggT2JqZWN0IG9iaiApIHsKLQkJaWYgKCBvYmogaW5zdGFuY2VvZiBQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyICkgewotCQkJUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lciBjb250YWluZXIgPSAoUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lcilvYmo7Ci0JCQlyZXR1cm4gY29udGFpbmVyLmdldERpcmVjdG9yeSgpLmVxdWFscyggZ2V0RGlyZWN0b3J5KCkgKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldERpcmVjdG9yeSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Db21wb3NpdGVTb3VyY2VDb250YWluZXIjY3JlYXRlU291cmNlQ29udGFpbmVycygpCi0JICovCi0JcHJvdGVjdGVkIElTb3VyY2VDb250YWluZXJbXSBjcmVhdGVTb3VyY2VDb250YWluZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIGlzQ29tcG9zaXRlKCkgKSB7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZEaXJlY3RvcnkubGlzdCgpOwotCQkJaWYgKCBmaWxlcyAhPSBudWxsICkgewotCQkJCUxpc3Q8SVNvdXJjZUNvbnRhaW5lcj4gZGlycyA9IG5ldyBBcnJheUxpc3Q8SVNvdXJjZUNvbnRhaW5lcj4oKTsKLQkJCQlmb3IoIGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrICkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGZpbGVzW2ldOwotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSggZ2V0RGlyZWN0b3J5KCksIG5hbWUgKTsKLQkJCQkJaWYgKCBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSApIHsKLQkJCQkJCWRpcnMuYWRkKCBuZXcgUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lciggZmlsZSwgdHJ1ZSApICk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSAoSVNvdXJjZUNvbnRhaW5lcltdKWRpcnMudG9BcnJheSggbmV3IElTb3VyY2VDb250YWluZXJbZGlycy5zaXplKCldICk7Ci0JCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgaSsrICkgewotCQkJCQlJU291cmNlQ29udGFpbmVyIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbaV07Ci0JCQkJCWNvbnRhaW5lci5pbml0KCBnZXREaXJlY3RvcigpICk7Ci0JCQkJfQotCQkJCXJldHVybiBjb250YWluZXJzOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSVNvdXJjZUNvbnRhaW5lclswXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BEaXJlY3RvcnlTb3VyY2VDb250YWluZXJUeXBlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BEaXJlY3RvcnlTb3VyY2VDb250YWluZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWQ1NjEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QRGlyZWN0b3J5U291cmNlQ29udGFpbmVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5BYnN0cmFjdFNvdXJjZUNvbnRhaW5lclR5cGVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKiBTZWUgPGNvZGU+UERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyVHlwZSBleHRlbmRzIEFic3RyYWN0U291cmNlQ29udGFpbmVyVHlwZURlbGVnYXRlIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXJUeXBlI2NyZWF0ZVNvdXJjZUNvbnRhaW5lcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU291cmNlQ29udGFpbmVyIGNyZWF0ZVNvdXJjZUNvbnRhaW5lcihTdHJpbmcgbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlOb2RlIG5vZGUgPSBwYXJzZURvY3VtZW50KG1lbWVudG8pOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCWlmICgiZGlyZWN0b3J5Ii5lcXVhbHMoZWxlbWVudC5nZXROb2RlTmFtZSgpKSkgewotCQkJCVN0cmluZyBzdHJpbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicGF0aCIpOwotCQkJCWlmIChzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlhYm9ydChJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiUERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lclR5cGUuMCIpLCBudWxsKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5lc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmVzdCIpOwotCQkJCWJvb2xlYW4gbmVzdGVkID0gInRydWUiLmVxdWFscyhuZXN0KTsKLQkJCQlyZXR1cm4gbmV3IFBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIobmV3IFBhdGgoc3RyaW5nKSwgbmVzdGVkKTsKLQkJCX0KLQkJCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyVHlwZS4xIiksIG51bGwpOwotCQl9Ci0JCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyVHlwZS4yIiksIG51bGwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyVHlwZSNnZXRNZW1lbnRvKG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXIpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKElTb3VyY2VDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIgZm9sZGVyID0gKFBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIpIGNvbnRhaW5lcjsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXdEb2N1bWVudCgpOwotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXJlY3RvcnkiKTsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInBhdGgiLCBmb2xkZXIuZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlTdHJpbmcgbmVzdCA9ICJmYWxzZSI7Ci0JCWlmIChmb2xkZXIuaXNDb21wb3NpdGUoKSkgewotCQkJbmVzdCA9ICJ0cnVlIjsKLQkJfQotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibmVzdCIsIG5lc3QpOwotCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJcmV0dXJuIHNlcmlhbGl6ZURvY3VtZW50KGRvY3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QRGlyZWN0b3J5U291cmNlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4NTYyZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuTG9jYWxGaWxlU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QRGVidWdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVBTb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbiBpbXBsZW1lbnRzIElEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJjRGlyZWN0b3J5U291cmNlTG9jYXRpb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RJUkVDVE9SWSA9ICJkaXJlY3RvcnkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FTU09DSUFUSU9OID0gImFzc29jaWF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRUFSQ0hfU1VCRk9MREVSUyA9ICJzZWFyY2hTdWJmb2xkZXJzIjsKLQlwcml2YXRlIElQYXRoIGZEaXJlY3Rvcnk7Ci0JcHJpdmF0ZSBJUGF0aCBmQXNzb2NpYXRpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmU2VhcmNoRm9yRHVwbGljYXRlRmlsZXMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNlYXJjaFN1YmZvbGRlcnMgPSBmYWxzZTsKLQlwcml2YXRlIEZpbGVbXSBmRm9sZGVycyA9IG51bGw7Ci0KLQlwdWJsaWMgUERpcmVjdG9yeVNvdXJjZUxvY2F0aW9uKCkge30KLQotCXB1YmxpYyBQRGlyZWN0b3J5U291cmNlTG9jYXRpb24oSVBhdGggZGlyZWN0b3J5LCBJUGF0aCBhc3NvY2lhdGlvbiwgYm9vbGVhbiBzZWFyY2hTdWJmb2xkZXJzKSB7Ci0JCXNldERpcmVjdG9yeShkaXJlY3RvcnkpOwotCQlzZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbik7Ci0JCXNldFNlYXJjaFN1YmZvbGRlcnMoc2VhcmNoU3ViZm9sZGVycyk7Ci0JfQotCXB1YmxpYyBPYmplY3QgZmluZFNvdXJjZUVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghaXNFbXB0eShuYW1lKSAmJiBnZXREaXJlY3RvcnkoKSAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLQkJCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkKLQkJCQlyZXN1bHQgPSBmaW5kRmlsZUJ5QWJzb2x1dGVQYXRoKG5hbWUpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IGZpbmRGaWxlQnlSZWxhdGl2ZVBhdGgobmFtZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgZ2V0QXNzb2NpYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJiBnZXRBc3NvY2lhdGlvbigpLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJcGF0aCA9IGdldERpcmVjdG9yeSgpLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoZ2V0QXNzb2NpYXRpb24oKS5zZWdtZW50Q291bnQoKSkpOwotCQkJCQlyZXN1bHQgPSBmaW5kRmlsZUJ5QWJzb2x1dGVQYXRoKHBhdGgudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQU291cmNlTG9jYXRpb24uY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhQRGlyZWN0b3J5U291cmNlTG9jYXRpb24uY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUGF0aC5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0RGlyZWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0RGlyZWN0b3J5KElQYXRoIGRpcmVjdG9yeSkgewotCQlmRGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotCX0KLQlwdWJsaWMgSVBhdGggZ2V0RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZkRpcmVjdG9yeTsKLQl9Ci0JcHVibGljIHZvaWQgZ2V0RGlyZWN0b3J5KElQYXRoIHBhdGgpIHsKLQkJZkRpcmVjdG9yeSA9IHBhdGg7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFzc29jaWF0aW9uKElQYXRoIGFzc29jaWF0aW9uKSB7Ci0JCWZBc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uOwotCX0KLQlwdWJsaWMgSVBhdGggZ2V0QXNzb2NpYXRpb24oKSB7Ci0JCXJldHVybiBmQXNzb2NpYXRpb247Ci0JfQotCXByaXZhdGUgT2JqZWN0IGZpbmRGaWxlQnlBYnNvbHV0ZVBhdGgoU3RyaW5nIG5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRmlsZVtdIGZvbGRlcnMgPSBnZXRGb2xkZXJzKCk7Ci0JCWlmIChmb2xkZXJzICE9IG51bGwpIHsKLQkJCUxpbmtlZExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGZpbmRGaWxlQnlBYnNvbHV0ZVBhdGgoZm9sZGVyc1tpXSwgbmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJaWYgKHNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKCkpCi0JCQkJCQlsaXN0LmFkZEFsbCgoTGlzdDw/PilyZXN1bHQpOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gbGlzdC5nZXRGaXJzdCgpOwotCQkJCX0gZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKCkpCi0JCQkJCQlsaXN0LmFkZChyZXN1bHQpOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJCWlmIChsaXN0LnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIChsaXN0LnNpemUoKSA9PSAxKSA/IGxpc3QuZ2V0Rmlyc3QoKSA6IGxpc3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgT2JqZWN0IGZpbmRGaWxlQnlBYnNvbHV0ZVBhdGgoRmlsZSBmb2xkZXIsIFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgobmFtZSk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlJUGF0aCBhc3NvY2lhdGlvbiA9IGdldEFzc29jaWF0aW9uKCk7Ci0JCWlmICghaXNQcmVmaXgocGF0aCwgZmlsZVBhdGgpIHx8IHBhdGguc2VnbWVudENvdW50KCkgKyAxICE9IGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpKSB7Ci0JCQlpZiAoYXNzb2NpYXRpb24gIT0gbnVsbCAmJiBpc1ByZWZpeChhc3NvY2lhdGlvbiwgZmlsZVBhdGgpICYmIGFzc29jaWF0aW9uLnNlZ21lbnRDb3VudCgpICsgMSA9PSBmaWxlUGF0aC5zZWdtZW50Q291bnQoKSkKLQkJCQlmaWxlUGF0aCA9IHBhdGguYXBwZW5kKGZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoYXNzb2NpYXRpb24uc2VnbWVudENvdW50KCkpKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBUcnkgZm9yIGEgZmlsZSBpbiBhbm90aGVyIHdvcmtzcGFjZSBwcm9qZWN0Ci0JCUlGaWxlW10gd3NGaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQlMaW5rZWRMaXN0PElGaWxlPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgd3NGaWxlcy5sZW5ndGg7ICsraikKLQkJCWlmICh3c0ZpbGVzW2pdLmV4aXN0cygpKSB7Ci0JCQkJaWYgKCFzZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpKQotCQkJCQlyZXR1cm4gd3NGaWxlc1tqXTsKLQkJCQlsaXN0LmFkZCh3c0ZpbGVzW2pdKTsKLQkJCX0KLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkKLQkJCXJldHVybiAobGlzdC5zaXplKCkgPT0gMSkgPyBsaXN0LmdldEZpcnN0KCkgOiBsaXN0OwotCQlmaWxlID0gZmlsZVBhdGgudG9GaWxlKCk7Ci0JCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCkpIHsKLQkJCXJldHVybiBjcmVhdGVFeHRlcm5hbEZpbGVTdG9yYWdlKGZpbGVQYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBPYmplY3QgZmluZEZpbGVCeVJlbGF0aXZlUGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJRmlsZVtdIGZvbGRlcnMgPSBnZXRGb2xkZXJzKCk7Ci0JCWlmIChmb2xkZXJzICE9IG51bGwpIHsKLQkJCUxpbmtlZExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGZpbmRGaWxlQnlSZWxhdGl2ZVBhdGgoZm9sZGVyc1tpXSwgZmlsZU5hbWUpOwotCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCWlmIChzZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpKQotCQkJCQkJbGlzdC5hZGRBbGwoKExpc3Q8Pz4pIHJlc3VsdCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBsaXN0LmdldEZpcnN0KCk7Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlpZiAoc2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoKSkKLQkJCQkJCWxpc3QuYWRkKHJlc3VsdCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKGxpc3Quc2l6ZSgpID09IDEpID8gbGlzdC5nZXRGaXJzdCgpIDogbGlzdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBPYmplY3QgZmluZEZpbGVCeVJlbGF0aXZlUGF0aChGaWxlIGZvbGRlciwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQlpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlJRmlsZVtdIHdzRmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKHBhdGgpOwotCQkJTGlua2VkTGlzdDxJRmlsZT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PElGaWxlPigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3c0ZpbGVzLmxlbmd0aDsgKytqKQotCQkJCWlmICh3c0ZpbGVzW2pdLmV4aXN0cygpKSB7Ci0JCQkJCWlmICghc2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoKSkKLQkJCQkJCXJldHVybiB3c0ZpbGVzW2pdOwotCQkJCQlsaXN0LmFkZCh3c0ZpbGVzW2pdKTsKLQkJCQl9Ci0JCQlpZiAobGlzdC5zaXplKCkgPiAwKQotCQkJCXJldHVybiAobGlzdC5zaXplKCkgPT0gMSkgPyBsaXN0LmdldEZpcnN0KCkgOiBsaXN0OwotCQkJcmV0dXJuIGNyZWF0ZUV4dGVybmFsRmlsZVN0b3JhZ2UocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSVN0b3JhZ2UgY3JlYXRlRXh0ZXJuYWxGaWxlU3RvcmFnZShJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxGaWxlU3RvcmFnZShwYXRoLnRvRmlsZSgpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCVRocm93YWJsZSBleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChFTEVNRU5UX05BTUUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQlub2RlLnNldEF0dHJpYnV0ZShBVFRSX0RJUkVDVE9SWSwgZ2V0RGlyZWN0b3J5KCkudG9PU1N0cmluZygpKTsKLQkJCWlmIChnZXRBc3NvY2lhdGlvbigpICE9IG51bGwpCi0JCQkJbm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl9BU1NPQ0lBVElPTiwgZ2V0QXNzb2NpYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJbm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl9TRUFSQ0hfU1VCRk9MREVSUywgbmV3IEJvb2xlYW4oc2VhcmNoU3ViZm9sZGVycygpKS50b1N0cmluZygpKTsKLQkJCXJldHVybiBQRGVidWdVdGlscy5zZXJpYWxpemVEb2N1bWVudChkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlhYm9ydChNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiUERpcmVjdG9yeVNvdXJjZUxvY2F0aW9uLjAiKSwgbmV3IE9iamVjdFtdIHsgZ2V0RGlyZWN0b3J5KCkudG9PU1N0cmluZygpIH0pLCBleCk7Ci0JCS8vIGV4ZWN1dGlvbiB3aWxsIG5vdCByZWFjaCBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShTdHJpbmcgbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlFeGNlcHRpb24gZXggPSBudWxsOwotCQl0cnkgewotCQkJRWxlbWVudCByb290ID0gbnVsbDsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihtZW1lbnRvKTsKLQkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOwotCQkJcm9vdCA9IHBhcnNlci5wYXJzZShzb3VyY2UpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJU3RyaW5nIGRpciA9IHJvb3QuZ2V0QXR0cmlidXRlKEFUVFJfRElSRUNUT1JZKTsKLQkJCWlmIChpc0VtcHR5KGRpcikpIHsKLQkJCQlhYm9ydChJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiUERpcmVjdG9yeVNvdXJjZUxvY2F0aW9uLjEiKSwgbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXIpOwotCQkJCWlmIChwYXRoLmlzVmFsaWRQYXRoKGRpcikgJiYgcGF0aC50b0ZpbGUoKS5pc0RpcmVjdG9yeSgpICYmIHBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJc2V0RGlyZWN0b3J5KHBhdGgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFib3J0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGlyZWN0b3J5U291cmNlTG9jYXRpb24uMiIpLCBuZXcgT2JqZWN0W10geyBkaXIgfSksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWRpciA9IHJvb3QuZ2V0QXR0cmlidXRlKEFUVFJfQVNTT0NJQVRJT04pOwotCQkJaWYgKGlzRW1wdHkoZGlyKSkgewotCQkJCXNldEFzc29jaWF0aW9uKG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlyKTsKLQkJCQlpZiAocGF0aC5pc1ZhbGlkUGF0aChkaXIpKSB7Ci0JCQkJCXNldEFzc29jaWF0aW9uKHBhdGgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldEFzc29jaWF0aW9uKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCXNldFNlYXJjaFN1YmZvbGRlcnMoQm9vbGVhbi52YWx1ZU9mKHJvb3QuZ2V0QXR0cmlidXRlKEFUVFJfU0VBUkNIX1NVQkZPTERFUlMpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIlBEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbi4zIiksIGV4KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFib3J0KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSwgZSk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHMpOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbikgewotCQkJSVBhdGggZGlyID0gKChJRGlyZWN0b3J5U291cmNlTG9jYXRpb24pIG9iaikuZ2V0RGlyZWN0b3J5KCk7Ci0JCQlJUGF0aCBhc3NvY2lhdGlvbiA9ICgoSURpcmVjdG9yeVNvdXJjZUxvY2F0aW9uKSBvYmopLmdldEFzc29jaWF0aW9uKCk7Ci0JCQlpZiAoZGlyID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYm9vbGVhbiByZXN1bHQgPSBkaXIuZXF1YWxzKGdldERpcmVjdG9yeSgpKTsKLQkJCWlmIChyZXN1bHQpIHsKLQkJCQlpZiAoYXNzb2NpYXRpb24gPT0gbnVsbCAmJiBnZXRBc3NvY2lhdGlvbigpID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChhc3NvY2lhdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gYXNzb2NpYXRpb24uZXF1YWxzKGdldEFzc29jaWF0aW9uKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzUHJlZml4KElQYXRoIHByZWZpeCwgSVBhdGggcGF0aCkgewotCQlpbnQgc2VnQ291bnQgPSBwcmVmaXguc2VnbWVudENvdW50KCk7Ci0JCWlmIChzZWdDb3VudCA+PSBwYXRoLnNlZ21lbnRDb3VudCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgcHJlZml4U3RyaW5nID0gcHJlZml4LnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cyhwYXRoLnNlZ21lbnRDb3VudCgpIC0gc2VnQ291bnQpLnRvT1NTdHJpbmcoKTsKLQkJcmV0dXJuIHByZWZpeFN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKHBhdGhTdHJpbmcpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hGb3JEdXBsaWNhdGVGaWxlcyhib29sZWFuIHNlYXJjaCkgewotCQlmU2VhcmNoRm9yRHVwbGljYXRlRmlsZXMgPSBzZWFyY2g7Ci0JfQotCXB1YmxpYyBib29sZWFuIHNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKCkgewotCQlyZXR1cm4gZlNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBzZWFyY2hTdWJmb2xkZXJzKCkgewotCQlyZXR1cm4gZlNlYXJjaFN1YmZvbGRlcnM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaFN1YmZvbGRlcnMoYm9vbGVhbiBzZWFyY2gpIHsKLQkJcmVzZXRGb2xkZXJzKCk7Ci0JCWZTZWFyY2hTdWJmb2xkZXJzID0gc2VhcmNoOwotCX0KLQlwcm90ZWN0ZWQgRmlsZVtdIGdldEZvbGRlcnMoKSB7Ci0JCWlmIChmRm9sZGVycyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUZvbGRlcnMoKTsKLQkJcmV0dXJuIGZGb2xkZXJzOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEZvbGRlcnMoKSB7Ci0JCWZGb2xkZXJzID0gbnVsbDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb2xkZXJzKCkgewotCQlpZiAoZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0PEZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCQlGaWxlIHJvb3QgPSBnZXREaXJlY3RvcnkoKS50b0ZpbGUoKTsKLQkJCWxpc3QuYWRkKHJvb3QpOwotCQkJaWYgKHNlYXJjaFN1YmZvbGRlcnMoKSkKLQkJCQlsaXN0LmFkZEFsbChnZXRGaWxlRm9sZGVycyhyb290KSk7Ci0JCQlmRm9sZGVycyA9IChGaWxlW10pIGxpc3QudG9BcnJheShuZXcgRmlsZVtsaXN0LnNpemUoKV0pOwotCQl9Ci0JfQotCXByaXZhdGUgTGlzdDxGaWxlPiBnZXRGaWxlRm9sZGVycyhGaWxlIGZpbGUpIHsKLQkJQXJyYXlMaXN0PEZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCUZpbGVbXSBmb2xkZXJzID0gZmlsZS5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCXJldHVybiBwYXRobmFtZS5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmb2xkZXJzKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm9sZGVycy5sZW5ndGg7ICsraSkKLQkJCWxpc3QuYWRkQWxsKGdldEZpbGVGb2xkZXJzKGZvbGRlcnNbaV0pKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgPyBnZXREaXJlY3RvcnkoKS50b09TU3RyaW5nKCkgOiAiIjsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BQcm9qZWN0U291cmNlTG9jYXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvUFByb2plY3RTb3VyY2VMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEwM2JmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvUFByb2plY3RTb3VyY2VMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBEZWJ1Z1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVBTb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVByb2plY3RTb3VyY2VMb2NhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBQcm9qZWN0U291cmNlTG9jYXRpb24gaW1wbGVtZW50cyBJUHJvamVjdFNvdXJjZUxvY2F0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImNQcm9qZWN0U291cmNlTG9jYXRpb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST0pFQ1QgPSAicHJvamVjdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfR0VORVJJQyA9ICJnZW5lcmljIjsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCXByaXZhdGUgSVJlc291cmNlW10gZkZvbGRlcnM7Ci0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBmQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMjApOwotCXByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGZOb3RGb3VuZENhY2hlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigyMCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZHZW5lcmF0ZWQgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmU2VhcmNoRm9yRHVwbGljYXRlRmlsZXMgPSBmYWxzZTsKLQotCXB1YmxpYyBQUHJvamVjdFNvdXJjZUxvY2F0aW9uKCkge30KLQlwdWJsaWMgUFByb2plY3RTb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCWZHZW5lcmF0ZWQgPSB0cnVlOwotCX0KLQlwdWJsaWMgUFByb2plY3RTb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGdlbmVyYXRlZCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlmR2VuZXJhdGVkID0gZ2VuZXJhdGVkOwotCX0KLQlwdWJsaWMgT2JqZWN0IGZpbmRTb3VyY2VFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoIWlzRW1wdHkobmFtZSkgJiYgZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW5vdEZvdW5kQ2FjaGVMb29rdXAobmFtZSkpIHsKLQkJCXJlc3VsdCA9IGNhY2hlTG9va3VwKG5hbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gZG9GaW5kU291cmNlRWxlbWVudChuYW1lKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJY2FjaGVTb3VyY2VFbGVtZW50KG5hbWUsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJY2FjaGVOb3RGb3VuZChuYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVBTb3VyY2VMb2NhdGlvbi5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKFBQcm9qZWN0U291cmNlTG9jYXRpb24uY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUHJvamVjdC5jbGFzcykpCi0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCXByaXZhdGUgT2JqZWN0IGRvRmluZFNvdXJjZUVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JCXJldHVybiAoZmlsZS5pc0Fic29sdXRlKCkpID8gZmluZEZpbGVCeUFic29sdXRlUGF0aChmaWxlKSA6IGZpbmRGaWxlQnlSZWxhdGl2ZVBhdGgobmFtZSk7Ci0JfQotCXByaXZhdGUgT2JqZWN0IGZpbmRGaWxlQnlBYnNvbHV0ZVBhdGgoRmlsZSBmaWxlKSB7Ci0JCUxpbmtlZExpc3Q8SUZpbGU+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxJRmlsZT4oKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCUlGaWxlW10gd3NGaWxlcyA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdzRmlsZXMubGVuZ3RoOyArK2kpCi0JCQkJaWYgKHdzRmlsZXNbaV0uZ2V0UHJvamVjdCgpLmVxdWFscyhnZXRQcm9qZWN0KCkpICYmIHdzRmlsZXNbaV0uZXhpc3RzKCkpIHsKLQkJCQkJaWYgKCFzZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpKQotCQkJCQkJcmV0dXJuIHdzRmlsZXNbaV07Ci0JCQkJCWxpc3QuYWRkKHdzRmlsZXNbaV0pOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gKGxpc3Quc2l6ZSgpID4gMCkgPyAoKGxpc3Quc2l6ZSgpID09IDEpID8gbGlzdC5nZXRGaXJzdCgpIDogbGlzdCkgOiBudWxsOwotCX0KLQlwcml2YXRlIE9iamVjdCBmaW5kRmlsZUJ5UmVsYXRpdmVQYXRoKFN0cmluZyBmaWxlTmFtZSkgewotCQlJUmVzb3VyY2VbXSBmb2xkZXJzID0gZ2V0Rm9sZGVycygpOwotCQlMaW5rZWRMaXN0PElGaWxlPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm9sZGVycy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGxpc3Quc2l6ZSgpID4gMCAmJiAhc2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoKSkKLQkJCQlicmVhazsKLQkJCUlQYXRoIHBhdGggPSBmb2xkZXJzW2ldLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJSUZpbGVbXSB3c0ZpbGVzID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihwYXRoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3c0ZpbGVzLmxlbmd0aDsgKytqKQotCQkJCQkJaWYgKHdzRmlsZXNbal0uZXhpc3RzKCkpIHsKLQkJCQkJCQlpZiAoIXNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKCkpCi0JCQkJCQkJCXJldHVybiB3c0ZpbGVzW2pdOwotCQkJCQkJCWxpc3QuYWRkKHdzRmlsZXNbal0pOwotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKGxpc3Quc2l6ZSgpID4gMCkgPyAoKGxpc3Quc2l6ZSgpID09IDEpID8gbGlzdC5nZXRGaXJzdCgpIDogbGlzdCkgOiBudWxsOwotCX0KLQlwcml2YXRlIE9iamVjdCBjYWNoZUxvb2t1cChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZkNhY2hlLmdldChuYW1lKTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIG5vdEZvdW5kQ2FjaGVMb29rdXAoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZOb3RGb3VuZENhY2hlLmNvbnRhaW5zKG5hbWUpOwotCX0KLQlwcml2YXRlIHZvaWQgY2FjaGVTb3VyY2VFbGVtZW50KFN0cmluZyBuYW1lLCBPYmplY3QgZWxlbWVudCkgewotCQlmQ2FjaGUucHV0KG5hbWUsIGVsZW1lbnQpOwotCX0KLQlwcml2YXRlIHZvaWQgY2FjaGVOb3RGb3VuZChTdHJpbmcgbmFtZSkgewotCQlmTm90Rm91bmRDYWNoZS5hZGQobmFtZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZDYWNoZS5jbGVhcigpOwotCQlmTm90Rm91bmRDYWNoZS5jbGVhcigpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJVGhyb3dhYmxlIGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEVMRU1FTlRfTkFNRSk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCW5vZGUuc2V0QXR0cmlidXRlKEFUVFJfUFJPSkVDVCwgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQlub2RlLnNldEF0dHJpYnV0ZShBVFRSX0dFTkVSSUMsIG5ldyBCb29sZWFuKGlzR2VuZXJpYygpKS50b1N0cmluZygpKTsKLQkJCXJldHVybiBQRGVidWdVdGlscy5zZXJpYWxpemVEb2N1bWVudChkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlhYm9ydChNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiUFByb2plY3RTb3VyY2VMb2NhdGlvbi4wIiksIG5ldyBPYmplY3RbXSB7IGdldFByb2plY3QoKS5nZXROYW1lKCkgfSksIGV4KTsKLQkJLy8gZXhlY3V0aW9uIHdpbGwgbm90IHJlYWNoIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFN0cmluZyBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlFbGVtZW50IHJvb3QgPSBudWxsOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKG1lbWVudG8pOwotCQkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0JCQlyb290ID0gcGFyc2VyLnBhcnNlKHNvdXJjZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHJvb3QuZ2V0QXR0cmlidXRlKEFUVFJfUFJPSkVDVCk7Ci0JCQlpZiAoaXNFbXB0eShuYW1lKSkgewotCQkJCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUHJvamVjdFNvdXJjZUxvY2F0aW9uLjEiKSwgbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJCX0KLQkJCVN0cmluZyBpc0dlbmVyaWMgPSByb290LmdldEF0dHJpYnV0ZShBVFRSX0dFTkVSSUMpOwotCQkJaWYgKGlzR2VuZXJpYyA9PSBudWxsIHx8IGlzR2VuZXJpYy50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQlpc0dlbmVyaWMgPSBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCk7Ci0JCQlzZXRHZW5lcmF0ZWQoaXNHZW5lcmljLmVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSkpOwotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUHJvamVjdFNvdXJjZUxvY2F0aW9uLjIiKSwgZXgpOwotCX0KLQlwcml2YXRlIHZvaWQgYWJvcnQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgcyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlLCBlKTsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBmR2VuZXJhdGVkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWQoYm9vbGVhbiBiKSB7Ci0JCWZHZW5lcmF0ZWQgPSBiOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3RTb3VyY2VMb2NhdGlvbiAmJiBnZXRQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZXF1YWxzKCgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgb2JqKS5nZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9sZGVycygpIHsKLQkJZmluYWwgTGlua2VkTGlzdDxJUmVzb3VyY2U+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxJUmVzb3VyY2U+KCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRQcm9qZWN0KCkuZXhpc3RzKCkpIHsKLQkJCWxpc3QuYWRkKGdldFByb2plY3QoKSk7Ci0JCQl0cnkgewotCQkJCWdldFByb2plY3QoKS5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXN3aXRjaCAocHJveHkuZ2V0VHlwZSgpKSB7Ci0JCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFOgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUjoKLQkJCQkJCQlsaXN0LmFkZExhc3QocHJveHkucmVxdWVzdFJlc291cmNlKCkpOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9LCBJUmVzb3VyY2UuTk9ORSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChmRm9sZGVycyA9PSBudWxsKSB7Ci0JCQkJZkZvbGRlcnMgPSAoSVJlc291cmNlW10pIGxpc3QudG9BcnJheShuZXcgSVJlc291cmNlW2xpc3Quc2l6ZSgpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIElSZXNvdXJjZVtdIGdldEZvbGRlcnMoKSB7Ci0JCWlmIChmRm9sZGVycyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUZvbGRlcnMoKTsKLQkJcmV0dXJuIGZGb2xkZXJzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBzZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpIHsKLQkJcmV0dXJuIGZTZWFyY2hGb3JEdXBsaWNhdGVGaWxlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoYm9vbGVhbiBzZWFyY2gpIHsKLQkJZkNhY2hlLmNsZWFyKCk7Ci0JCWZOb3RGb3VuZENhY2hlLmNsZWFyKCk7Ci0JCWZTZWFyY2hGb3JEdXBsaWNhdGVGaWxlcyA9IHNlYXJjaDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgPyBmUHJvamVjdC50b1N0cmluZygpIDogIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTG9jYXRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzE5ZWE4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvUFNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QRGVidWdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JUFNvdXJjZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JUFNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklQcm9qZWN0U291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLlNvdXJjZUxvb2t1cEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUFNvdXJjZUxvY2F0b3IgaW1wbGVtZW50cyBJUFNvdXJjZUxvY2F0b3IsIElQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3IsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0xPQ0FUT1JfTkFNRSA9ICJwU291cmNlTG9jYXRvciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0dFTkVSSUNfUFJPSkVDVF9OQU1FID0gImRpc2FibGVkR2VuZXJpY1Byb2plY3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX1NPVVJDRV9MT0NBVElPTl9OQU1FID0gImFkZGl0aW9uYWxTb3VyY2VMb2NhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9MT0NBVElPTl9OQU1FID0gImNTb3VyY2VMb2NhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FTUVOVE8gPSAibWVtZW50byI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPSkVDVF9OQU1FID0gInByb2plY3ROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9EVVBMSUNBVEVfRklMRVMgPSAiZHVwbGljYXRlRmlsZXMiOwotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSVBTb3VyY2VMb2NhdGlvbltdIGZTb3VyY2VMb2NhdGlvbnM7Ci0JcHJpdmF0ZSBMaXN0PElQcm9qZWN0PiBmUmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oMTApOwotCXByaXZhdGUgYm9vbGVhbiBmRHVwbGljYXRlRmlsZXMgPSBmYWxzZTsKLQotCXB1YmxpYyBQU291cmNlTG9jYXRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCXNldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQlzZXRTb3VyY2VMb2NhdGlvbnMoZ2V0RGVmYXVsdFNvdXJjZUxvY2F0aW9ucygpKTsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRTb3VyY2VFbGVtZW50KElTdGFja0ZyYW1lIHN0YWNrRnJhbWUpIHsKLQkJcmV0dXJuIGdldElucHV0KHN0YWNrRnJhbWUpOwotCX0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoSVN0YWNrRnJhbWUgZnJhbWUpIHsKLQkJcmV0dXJuIChmcmFtZSBpbnN0YW5jZW9mIElQU3RhY2tGcmFtZSkgPyAoKElQU3RhY2tGcmFtZSkgZnJhbWUpLmdldEZyYW1lTGluZU51bWJlcigpIDogMDsKLQl9Ci0JcHJvdGVjdGVkIE9iamVjdCBnZXRJbnB1dChJU3RhY2tGcmFtZSBmKSB7Ci0JCWlmIChmIGluc3RhbmNlb2YgSVBTdGFja0ZyYW1lKSB7Ci0JCQlJUFN0YWNrRnJhbWUgZnJhbWUgPSAoSVBTdGFja0ZyYW1lKSBmOwotCQkJTGlua2VkTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7Ci0JCQlpZiAoZnJhbWUgIT0gbnVsbCkgewotCQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGZyYW1lLmdldEZpbGUoKTsKLQkJCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCAmJiBmaWxlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJSVBTb3VyY2VMb2NhdGlvbltdIGxvY2F0aW9ucyA9IGdldFNvdXJjZUxvY2F0aW9ucygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXN1bHQgPSBsb2NhdGlvbnNbaV0uZmluZFNvdXJjZUVsZW1lbnQoZmlsZU5hbWUpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkJfQotCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCQkJCWxpc3QuYWRkQWxsKChMaXN0PD8+KSByZXN1bHQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJbGlzdC5hZGQocmVzdWx0KTsKLQkJCQkJCQlpZiAoIXNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKCkpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChsaXN0LnNpemUoKSA+IDApID8gKChsaXN0LnNpemUoKSA9PSAxKSA/IGxpc3QuZ2V0Rmlyc3QoKSA6IGxpc3QpIDogbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQU291cmNlTG9jYXRpb25bXSBsb2NhdGlvbnMgPSBnZXRTb3VyY2VMb2NhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJaWYgKGxvY2F0aW9uc1tpXSBpbnN0YW5jZW9mIFBQcm9qZWN0U291cmNlTG9jYXRpb24gJiYgKChQUHJvamVjdFNvdXJjZUxvY2F0aW9uKSBsb2NhdGlvbnNbaV0pLmdldFByb2plY3QoKS5lcXVhbHMocmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGxvY2F0aW9uc1tpXS5maW5kU291cmNlRWxlbWVudChyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJRmlsZSAmJiAoKElGaWxlKSByZXN1bHQpLmVxdWFscyhyZXNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExpc3QgJiYgKChMaXN0PD8+KSByZXN1bHQpLmNvbnRhaW5zKHJlc291cmNlKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBJUFNvdXJjZUxvY2F0aW9uW10gZ2V0U291cmNlTG9jYXRpb25zKCkgewotCQlyZXR1cm4gZlNvdXJjZUxvY2F0aW9uczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U291cmNlTG9jYXRpb25zKElQU291cmNlTG9jYXRpb25bXSBsb2NhdGlvbnMpIHsKLQkJZlNvdXJjZUxvY2F0aW9ucyA9IGxvY2F0aW9uczsKLQl9Ci0JcHVibGljIHN0YXRpYyBJUFNvdXJjZUxvY2F0aW9uW10gZ2V0RGVmYXVsdFNvdXJjZUxvY2F0aW9ucyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFycmF5TGlzdDxJUHJvamVjdFNvdXJjZUxvY2F0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdFNvdXJjZUxvY2F0aW9uPigpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWxpc3QuYWRkKFNvdXJjZUxvb2t1cEZhY3RvcnkuY3JlYXRlUHJvamVjdFNvdXJjZUxvY2F0aW9uKHByb2plY3QpKTsKLQkJCWFkZFJlZmVyZW5jZWRTb3VyY2VMb2NhdGlvbnMobGlzdCwgcHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIChJUFNvdXJjZUxvY2F0aW9uW10pIGxpc3QudG9BcnJheShuZXcgSVBTb3VyY2VMb2NhdGlvbltsaXN0LnNpemUoKV0pOwotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlZmVyZW5jZWRTb3VyY2VMb2NhdGlvbnMoTGlzdDxJUHJvamVjdFNvdXJjZUxvY2F0aW9uPiBsaXN0LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocHJvamVjdHNbaV0uZXhpc3RzKCkgJiYgIWNvbnRhaW5zUHJvamVjdChsaXN0LCBwcm9qZWN0c1tpXSkpIHsKLQkJCQkJCWxpc3QuYWRkKFNvdXJjZUxvb2t1cEZhY3RvcnkuY3JlYXRlUHJvamVjdFNvdXJjZUxvY2F0aW9uKHByb2plY3RzW2ldKSk7Ci0JCQkJCQlhZGRSZWZlcmVuY2VkU291cmNlTG9jYXRpb25zKGxpc3QsIHByb2plY3RzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zUHJvamVjdChMaXN0PElQcm9qZWN0U291cmNlTG9jYXRpb24+IGxpc3QsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSXRlcmF0b3I8SVByb2plY3RTb3VyY2VMb2NhdGlvbj4gaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0U291cmNlTG9jYXRpb24gbG9jYXRpb24gPSAoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgaXQubmV4dCgpOwotCQkJaWYgKHByb2plY3QuZXF1YWxzKGxvY2F0aW9uLmdldFByb2plY3QoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGZpbmRTb3VyY2VFbGVtZW50KFN0cmluZyBmaWxlTmFtZSkgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgZmlsZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zID0gZ2V0U291cmNlTG9jYXRpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdCA9IGxvY2F0aW9uc1tpXS5maW5kU291cmNlRWxlbWVudChmaWxlTmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJVGhyb3dhYmxlIGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFNPVVJDRV9MT0NBVE9SX05BTUUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQlJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zID0gZ2V0U291cmNlTG9jYXRpb25zKCk7Ci0JCQlzYXZlRGlzYWJsZWRHZW5lcmljU291cmNlTG9jYXRpb25zKGxvY2F0aW9ucywgZG9jdW1lbnQsIG5vZGUpOwotCQkJc2F2ZUFkZGl0aW9uYWxTb3VyY2VMb2NhdGlvbnMobG9jYXRpb25zLCBkb2N1bWVudCwgbm9kZSk7Ci0JCQlub2RlLnNldEF0dHJpYnV0ZShBVFRSX0RVUExJQ0FURV9GSUxFUywgbmV3IEJvb2xlYW4oc2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoKSkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gUERlYnVnVXRpbHMuc2VyaWFsaXplRG9jdW1lbnQoZG9jdW1lbnQpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIlBTb3VyY2VMb2NhdG9yLjAiKSwgZXgpOwotCQkvLyBleGVjdXRpb24gd2lsbCBub3QgcmVhY2ggaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0U291cmNlTG9jYXRpb25zKGdldERlZmF1bHRTb3VyY2VMb2NhdGlvbnMoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tTWVtZW50byhTdHJpbmcgbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlFeGNlcHRpb24gZXggPSBudWxsOwotCQl0cnkgewotCQkJRWxlbWVudCByb290ID0gbnVsbDsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihtZW1lbnRvKTsKLQkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOwotCQkJcm9vdCA9IHBhcnNlci5wYXJzZShzb3VyY2UpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJaWYgKCFyb290LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShTT1VSQ0VfTE9DQVRPUl9OQU1FKSkgewotCQkJCWFib3J0KEludGVybmFsU291cmNlTG9va3VwTWVzc2FnZXMuZ2V0U3RyaW5nKCJQU291cmNlTG9jYXRvci4xIiksIG51bGwpOwotCQkJfQotCQkJTGlzdDxJUFNvdXJjZUxvY2F0aW9uPiBzb3VyY2VMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElQU291cmNlTG9jYXRpb24+KCk7Ci0JCQkvLyBBZGQgbG9jYXRpb25zIGJhc2VkIG9uIHJlZmVyZW5jZWQgcHJvamVjdHMKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc09wZW4oKSkKLQkJCQlzb3VyY2VMb2NhdGlvbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0RGVmYXVsdFNvdXJjZUxvY2F0aW9ucygpKSk7Ci0JCQlyZW1vdmVEaXNhYmxlZExvY2F0aW9ucyhyb290LCBzb3VyY2VMb2NhdGlvbnMpOwotCQkJYWRkQWRkaXRpb25hbExvY2F0aW9ucyhyb290LCBzb3VyY2VMb2NhdGlvbnMpOwotCQkJLy8gVG8gc3VwcG9ydCBvbGQgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkJCWFkZE9sZExvY2F0aW9ucyhyb290LCBzb3VyY2VMb2NhdGlvbnMpOwotCQkJc2V0U291cmNlTG9jYXRpb25zKChJUFNvdXJjZUxvY2F0aW9uW10pIHNvdXJjZUxvY2F0aW9ucy50b0FycmF5KG5ldyBJUFNvdXJjZUxvY2F0aW9uW3NvdXJjZUxvY2F0aW9ucy5zaXplKCldKSk7Ci0JCQlzZXRTZWFyY2hGb3JEdXBsaWNhdGVGaWxlcyhCb29sZWFuLnZhbHVlT2Yocm9vdC5nZXRBdHRyaWJ1dGUoQVRUUl9EVVBMSUNBVEVfRklMRVMpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJYWJvcnQoSW50ZXJuYWxTb3VyY2VMb29rdXBNZXNzYWdlcy5nZXRTdHJpbmcoIlBTb3VyY2VMb2NhdG9yLjIiKSwgZXgpOwotCX0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRGlzYWJsZWRMb2NhdGlvbnMoRWxlbWVudCByb290LCBMaXN0PElQU291cmNlTG9jYXRpb24+IHNvdXJjZUxvY2F0aW9ucykgewotCQlOb2RlTGlzdCBsaXN0ID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotCQlIYXNoU2V0PFN0cmluZz4gZGlzYWJsZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4obGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBlbnRyeSA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChlbnRyeS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoRElTQUJMRURfR0VORVJJQ19QUk9KRUNUX05BTUUpKSB7Ci0JCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGVudHJ5LmdldEF0dHJpYnV0ZShBVFRSX1BST0pFQ1RfTkFNRSk7Ci0JCQkJCWlmIChpc0VtcHR5KHByb2plY3ROYW1lKSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZygiVW5hYmxlIHRvIHJlc3RvcmUgQy9DKysgc291cmNlIGxvY2F0b3IgLSBpbnZhbGlkIGZvcm1hdC4iKTsKLQkJCQkJfQotCQkJCQlkaXNhYmxlZFByb2plY3RzLmFkZChwcm9qZWN0TmFtZS50cmltKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJdGVyYXRvcjxJUFNvdXJjZUxvY2F0aW9uPiBpdCA9IHNvdXJjZUxvY2F0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0gKElQU291cmNlTG9jYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIElQcm9qZWN0U291cmNlTG9jYXRpb24gJiYgZGlzYWJsZWRQcm9qZWN0cy5jb250YWlucygoKElQcm9qZWN0U291cmNlTG9jYXRpb24pIGxvY2F0aW9uKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkKLQkJCQlpdC5yZW1vdmUoKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgYWRkQWRkaXRpb25hbExvY2F0aW9ucyhFbGVtZW50IHJvb3QsIExpc3Q8SVBTb3VyY2VMb2NhdGlvbj4gc291cmNlTG9jYXRpb25zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpOwotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SLCBJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiUFNvdXJjZUxvY2F0b3IuMyIpLCBudWxsKTsKLQkJTm9kZUxpc3QgbGlzdCA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBlbnRyeSA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChlbnRyeS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQURESVRJT05BTF9TT1VSQ0VfTE9DQVRJT05fTkFNRSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVudHJ5LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCQkJU3RyaW5nIGRhdGEgPSBlbnRyeS5nZXRBdHRyaWJ1dGUoQVRUUl9NRU1FTlRPKTsKLQkJCQkJaWYgKGlzRW1wdHkoY2xhc3NOYW1lKSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZygiVW5hYmxlIHRvIHJlc3RvcmUgQy9DKysgc291cmNlIGxvY2F0b3IgLSBpbnZhbGlkIGZvcm1hdC4iKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUNsYXNzIGNsYXp6ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlVuYWJsZSB0byByZXN0b3JlIHNvdXJjZSBsb2NhdGlvbiAtIGNsYXNzIG5vdCBmb3VuZCB7MH0iLCBuZXcgT2JqZWN0W10geyBjbGFzc05hbWUgfSkpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJSVBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsb2NhdGlvbiA9IChJUFNvdXJjZUxvY2F0aW9uKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coIlVuYWJsZSB0byByZXN0b3JlIHNvdXJjZSBsb2NhdGlvbi4iKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coIlVuYWJsZSB0byByZXN0b3JlIHNvdXJjZSBsb2NhdGlvbi4iKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsb2NhdGlvbi5pbml0aWFsaXplRnJvbShkYXRhKTsKLQkJCQkJCXNvdXJjZUxvY2F0aW9ucy5hZGQobG9jYXRpb24pOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXN0YXR1cy5hZGRBbGwoZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5PSykKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRPbGRMb2NhdGlvbnMoRWxlbWVudCByb290LCBMaXN0PElQU291cmNlTG9jYXRpb24+IHNvdXJjZUxvY2F0aW9ucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlCdW5kbGUgYnVuZGxlID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJTm9kZUxpc3QgbGlzdCA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBlbnRyeSA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChlbnRyeS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoU09VUkNFX0xPQ0FUSU9OX05BTUUpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQkJCVN0cmluZyBkYXRhID0gZW50cnkuZ2V0QXR0cmlidXRlKEFUVFJfTUVNRU5UTyk7Ci0JCQkJCWlmIChpc0VtcHR5KGNsYXNzTmFtZSkpIHsKLQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coIlVuYWJsZSB0byByZXN0b3JlIEMvQysrIHNvdXJjZSBsb2NhdG9yIC0gaW52YWxpZCBmb3JtYXQuIik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlDbGFzcyBjbGF6eiA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJVbmFibGUgdG8gcmVzdG9yZSBzb3VyY2UgbG9jYXRpb24gLSBjbGFzcyBub3QgZm91bmQgezB9IiwgbmV3IE9iamVjdFtdIHsgY2xhc3NOYW1lIH0pKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUlQU291cmNlTG9jYXRpb24gbG9jYXRpb24gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJbG9jYXRpb24gPSAoSVBTb3VyY2VMb2NhdGlvbikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKCJVbmFibGUgdG8gcmVzdG9yZSBzb3VyY2UgbG9jYXRpb24uIik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKCJVbmFibGUgdG8gcmVzdG9yZSBzb3VyY2UgbG9jYXRpb24uIik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlsb2NhdGlvbi5pbml0aWFsaXplRnJvbShkYXRhKTsKLQkJCQkJaWYgKCFzb3VyY2VMb2NhdGlvbnMuY29udGFpbnMobG9jYXRpb24pKSB7Ci0JCQkJCQlpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBQUHJvamVjdFNvdXJjZUxvY2F0aW9uKQotCQkJCQkJCSgoUFByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb24pLnNldEdlbmVyYXRlZChpc1JlZmVyZW5jZWRQcm9qZWN0KCgoUFByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb24pLmdldFByb2plY3QoKSkpOwotCQkJCQkJc291cmNlTG9jYXRpb25zLmFkZChsb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFib3J0KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSwgZSk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHMpOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJV29ya3NwYWNlICYmIGV2ZW50LmdldERlbHRhKCkgIT0gbnVsbCkgewotCQkJSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWlmIChkZWx0YXMgIT0gbnVsbCkgewotCQkJCUFycmF5TGlzdDxJUmVzb3VyY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oZGVsdGFzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyArK2kpCi0JCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCQkJbGlzdC5hZGQoZGVsdGFzW2ldLmdldFJlc291cmNlKCkpOwotCQkJCXJlc2V0U291cmNlTG9jYXRpb25zKGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBzYXZlRGlzYWJsZWRHZW5lcmljU291cmNlTG9jYXRpb25zKElQU291cmNlTG9jYXRpb25bXSBsb2NhdGlvbnMsIERvY3VtZW50IGRvYywgRWxlbWVudCBub2RlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlMaXN0PElQcm9qZWN0PiBsaXN0ID0gUERlYnVnVXRpbHMuZ2V0UmVmZXJlbmNlZFByb2plY3RzKHByb2plY3QpOwotCQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihsaXN0LnNpemUoKSArIDEpOwotCQkJbmFtZXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCUl0ZXJhdG9yPD8+IGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5hbWVzLmFkZCgoKElQcm9qZWN0KSBpdC5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7ICsraSkKLQkJCQlpZiAobG9jYXRpb25zW2ldIGluc3RhbmNlb2YgSVByb2plY3RTb3VyY2VMb2NhdGlvbiAmJiAoKElQcm9qZWN0U291cmNlTG9jYXRpb24pIGxvY2F0aW9uc1tpXSkuaXNHZW5lcmljKCkpCi0JCQkJCW5hbWVzLnJlbW92ZSgoKElQcm9qZWN0U291cmNlTG9jYXRpb24pIGxvY2F0aW9uc1tpXSkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0KLQkJCWl0ID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlFbGVtZW50IGNoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnQoRElTQUJMRURfR0VORVJJQ19QUk9KRUNUX05BTUUpOwotCQkJCWNoaWxkLnNldEF0dHJpYnV0ZShBVFRSX1BST0pFQ1RfTkFNRSwgKFN0cmluZykgaXQubmV4dCgpKTsKLQkJCQlub2RlLmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgc2F2ZUFkZGl0aW9uYWxTb3VyY2VMb2NhdGlvbnMoSVBTb3VyY2VMb2NhdGlvbltdIGxvY2F0aW9ucywgRG9jdW1lbnQgZG9jLCBFbGVtZW50IG5vZGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsb2NhdGlvbnNbaV0gaW5zdGFuY2VvZiBJUHJvamVjdFNvdXJjZUxvY2F0aW9uICYmICgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldKS5pc0dlbmVyaWMoKSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnQgY2hpbGQgPSBkb2MuY3JlYXRlRWxlbWVudChBRERJVElPTkFMX1NPVVJDRV9MT0NBVElPTl9OQU1FKTsKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZShBVFRSX0NMQVNTLCBsb2NhdGlvbnNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJdHJ5IHsKLQkJCQljaGlsZC5zZXRBdHRyaWJ1dGUoQVRUUl9NRU1FTlRPLCBsb2NhdGlvbnNbaV0uZ2V0TWVtZW50bygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlub2RlLmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJfQotCX0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWZlcmVuY2VkUHJvamVjdChJUHJvamVjdCByZWYpIHsKLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBBcnJheXMuYXNMaXN0KGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKSkuY29udGFpbnMocmVmKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlmUmVmZXJlbmNlZFByb2plY3RzLmNsZWFyKCk7Ci0JCWZSZWZlcmVuY2VkUHJvamVjdHMgPSBQRGVidWdVdGlscy5nZXRSZWZlcmVuY2VkUHJvamVjdHMoZ2V0UHJvamVjdCgpKTsKLQl9Ci0JcHJvdGVjdGVkIElQU291cmNlTG9jYXRpb25bXSBnZXREZWZhdWx0U291cmNlTG9jYXRpb25zKCkgewotCQlJdGVyYXRvcjxJUHJvamVjdD4gaXQgPSBmUmVmZXJlbmNlZFByb2plY3RzLml0ZXJhdG9yKCk7Ci0JCUFycmF5TGlzdDxJUHJvamVjdFNvdXJjZUxvY2F0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdFNvdXJjZUxvY2F0aW9uPihmUmVmZXJlbmNlZFByb2plY3RzLnNpemUoKSk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRQcm9qZWN0KCkuZXhpc3RzKCkgJiYgZ2V0UHJvamVjdCgpLmlzT3BlbigpKQotCQkJbGlzdC5hZGQoU291cmNlTG9va3VwRmFjdG9yeS5jcmVhdGVQcm9qZWN0U291cmNlTG9jYXRpb24oZ2V0UHJvamVjdCgpKSk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzT3BlbigpKQotCQkJCWxpc3QuYWRkKFNvdXJjZUxvb2t1cEZhY3RvcnkuY3JlYXRlUHJvamVjdFNvdXJjZUxvY2F0aW9uKHByb2plY3QpKTsKLQkJfQotCQlyZXR1cm4gKElQU291cmNlTG9jYXRpb25bXSkgbGlzdC50b0FycmF5KG5ldyBJUFNvdXJjZUxvY2F0aW9uW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCXByaXZhdGUgdm9pZCByZXNldFNvdXJjZUxvY2F0aW9ucyhMaXN0PElSZXNvdXJjZT4gYWZmZWN0ZWRQcm9qZWN0cykgewotCQlpZiAoYWZmZWN0ZWRQcm9qZWN0cy5zaXplKCkgIT0gMCAmJiBnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKCFnZXRQcm9qZWN0KCkuZXhpc3RzKCkgfHwgIWdldFByb2plY3QoKS5pc09wZW4oKSkgewotCQkJCXJlbW92ZUdlbmVyaWNTb3VyY2VMb2NhdGlvbnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlR2VuZXJpY1NvdXJjZUxvY2F0aW9ucyhhZmZlY3RlZFByb2plY3RzKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR2VuZXJpY1NvdXJjZUxvY2F0aW9ucygpIHsKLQkJZlJlZmVyZW5jZWRQcm9qZWN0cy5jbGVhcigpOwotCQlJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zID0gZ2V0U291cmNlTG9jYXRpb25zKCk7Ci0JCUFycmF5TGlzdDxJUFNvdXJjZUxvY2F0aW9uPiBuZXdMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElQU291cmNlTG9jYXRpb24+KGxvY2F0aW9ucy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7ICsraSkKLQkJCWlmICghKGxvY2F0aW9uc1tpXSBpbnN0YW5jZW9mIElQcm9qZWN0U291cmNlTG9jYXRpb24pIHx8ICEoKElQcm9qZWN0U291cmNlTG9jYXRpb24pIGxvY2F0aW9uc1tpXSkuaXNHZW5lcmljKCkpCi0JCQkJbmV3TG9jYXRpb25zLmFkZChsb2NhdGlvbnNbaV0pOwotCQlzZXRTb3VyY2VMb2NhdGlvbnMoKElQU291cmNlTG9jYXRpb25bXSkgbmV3TG9jYXRpb25zLnRvQXJyYXkobmV3IElQU291cmNlTG9jYXRpb25bbmV3TG9jYXRpb25zLnNpemUoKV0pKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdlbmVyaWNTb3VyY2VMb2NhdGlvbnMoTGlzdDxJUmVzb3VyY2U+IGFmZmVjdGVkUHJvamVjdHMpIHsKLQkJTGlzdDxJUHJvamVjdD4gbmV3UmVmcyA9IFBEZWJ1Z1V0aWxzLmdldFJlZmVyZW5jZWRQcm9qZWN0cyhnZXRQcm9qZWN0KCkpOwotCQlJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zID0gZ2V0U291cmNlTG9jYXRpb25zKCk7Ci0JCUFycmF5TGlzdDxJUFNvdXJjZUxvY2F0aW9uPiBuZXdMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElQU291cmNlTG9jYXRpb24+KGxvY2F0aW9ucy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJaWYgKCEobG9jYXRpb25zW2ldIGluc3RhbmNlb2YgSVByb2plY3RTb3VyY2VMb2NhdGlvbikgfHwgISgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldKS5pc0dlbmVyaWMoKSkgewotCQkJCW5ld0xvY2F0aW9ucy5hZGQobG9jYXRpb25zW2ldKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldKS5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlpZiAobmV3UmVmcy5jb250YWlucyhwcm9qZWN0KSB8fCBwcm9qZWN0LmVxdWFscyhnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQluZXdMb2NhdGlvbnMuYWRkKGxvY2F0aW9uc1tpXSk7Ci0JCQkJCQluZXdSZWZzLnJlbW92ZShwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlJdGVyYXRvcjxJUHJvamVjdD4gaXQgPSBuZXdSZWZzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0Lm5leHQoKTsKLQkJCWlmICghZlJlZmVyZW5jZWRQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KSkKLQkJCQluZXdMb2NhdGlvbnMuYWRkKFNvdXJjZUxvb2t1cEZhY3RvcnkuY3JlYXRlUHJvamVjdFNvdXJjZUxvY2F0aW9uKHByb2plY3QpKTsKLQkJfQotCQlmUmVmZXJlbmNlZFByb2plY3RzID0gbmV3UmVmczsKLQkJc2V0U291cmNlTG9jYXRpb25zKChJUFNvdXJjZUxvY2F0aW9uW10pIG5ld0xvY2F0aW9ucy50b0FycmF5KG5ldyBJUFNvdXJjZUxvY2F0aW9uW25ld0xvY2F0aW9ucy5zaXplKCldKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIHNlYXJjaEZvckR1cGxpY2F0ZUZpbGVzKCkgewotCQlyZXR1cm4gZkR1cGxpY2F0ZUZpbGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hGb3JEdXBsaWNhdGVGaWxlcyhib29sZWFuIHNlYXJjaCkgewotCQlmRHVwbGljYXRlRmlsZXMgPSBzZWFyY2g7Ci0JCUlQU291cmNlTG9jYXRpb25bXSBsb2NhdGlvbnMgPSBnZXRTb3VyY2VMb2NhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyArK2kpCi0JCQlsb2NhdGlvbnNbaV0uc2V0U2VhcmNoRm9yRHVwbGljYXRlRmlsZXMoc2VhcmNoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTG9va3VwUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwMGNjZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLkFic3RyYWN0U291cmNlTG9va3VwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cERpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCB7Ci0Jc3RhdGljIHByaXZhdGUgY2xhc3MgTm9Tb3VyY2VFbGVtZW50IHt9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOb1NvdXJjZUVsZW1lbnQgZ2ZOb1NvdXJjZSA9IG5ldyBOb1NvdXJjZUVsZW1lbnQoKTsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzOwotCi0JcHVibGljIFBTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQkJZkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoMSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZShPYmplY3Qgb2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBvYmplY3Q7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlQU3RhY2tGcmFtZSBmcmFtZSA9IChJUFN0YWNrRnJhbWUpICgoSUFkYXB0YWJsZSkgb2JqZWN0KS5nZXRBZGFwdGVyKElQU3RhY2tGcmFtZS5jbGFzcyk7Ci0JCQlpZiAoZnJhbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZnJhbWUuZ2V0RmlsZSgpOwotCQkJCXJldHVybiAobmFtZSAhPSBudWxsICYmIG5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgPyBuYW1lIDogbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIE9iamVjdFtdIGZpbmRTb3VyY2VFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFdvcmthcm91bmQgZm9yIGNhc2VzIHdoZW4gdGhlIHN0YWNrIGZyYW1lIGRvZXNuJ3QgY29udGFpbiB0aGUgc291cmNlIGZpbGUgbmFtZQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlJUFN0YWNrRnJhbWUgZnJhbWUgPSAoSVBTdGFja0ZyYW1lKSAoKElBZGFwdGFibGUpIG9iamVjdCkuZ2V0QWRhcHRlcihJUFN0YWNrRnJhbWUuY2xhc3MpOwotCQkJaWYgKGZyYW1lICE9IG51bGwpIHsKLQkJCQluYW1lID0gZnJhbWUuZ2V0RmlsZSgpLnRyaW0oKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGdmTm9Tb3VyY2UgfTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBvYmplY3Q7Ci0JCX0KLQkJT2JqZWN0W10gZm91bmRFbGVtZW50cyA9IHN1cGVyLmZpbmRTb3VyY2VFbGVtZW50cyhvYmplY3QpOwotCQlpZiAoZm91bmRFbGVtZW50cy5sZW5ndGggPT0gMCAmJiAob2JqZWN0IGluc3RhbmNlb2YgSURlYnVnRWxlbWVudCkpCi0JCQlmb3VuZEVsZW1lbnRzID0gbmV3IE9iamVjdFtdIHsgbmV3IFBTb3VyY2VOb3RGb3VuZEVsZW1lbnQoKElEZWJ1Z0VsZW1lbnQpb2JqZWN0KSB9OwotCQlyZXR1cm4gZm91bmRFbGVtZW50czsKLQl9Ci0JLyoKLQlwcml2YXRlIE9iamVjdFtdIGZpbmRTb3VyY2VFbGVtZW50QnlGaWxlKEZpbGUgZmlsZSkgewotCQlJRmlsZVtdIHdmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZS5nZXRQYXRoKCkpKTsKLQkJaWYgKHdmaWxlcy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIHdmaWxlczsKLQkJcmV0dXJuIG5ldyBMb2NhbEZpbGVTdG9yYWdlW10geyBuZXcgTG9jYWxGaWxlU3RvcmFnZShmaWxlKSB9OwotCX0KLQkqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRTb3VyY2VMb29rdXBDaGFuZ2VMaXN0ZW5lcihJU291cmNlTG9va3VwQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVTb3VyY2VMb29rdXBDaGFuZ2VMaXN0ZW5lcihJU291cmNlTG9va3VwQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBzb3VyY2VDb250YWluZXJzQ2hhbmdlZChJU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IpIHsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpCi0JCQkoKElTb3VyY2VMb29rdXBDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5zb3VyY2VDb250YWluZXJzQ2hhbmdlZChkaXJlY3Rvcik7Ci0JCXN1cGVyLnNvdXJjZUNvbnRhaW5lcnNDaGFuZ2VkKGRpcmVjdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BTb3VyY2VNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BTb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNzc3MmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklQU291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklQU291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5tb2RlbC5QRGVidWdUYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQU291cmNlTWFuYWdlciBpbXBsZW1lbnRzIElQU291cmNlTG9jYXRvciwgSVBlcnNpc3RhYmxlU291cmNlTG9jYXRvciwgSUFkYXB0YWJsZSB7Ci0JcHJpdmF0ZSBJU291cmNlTG9jYXRvciBmU291cmNlTG9jYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGF1bmNoIGZMYXVuY2ggPSBudWxsOwotCXByaXZhdGUgUERlYnVnVGFyZ2V0IGZEZWJ1Z1RhcmdldCA9IG51bGw7Ci0KLQlwdWJsaWMgUFNvdXJjZU1hbmFnZXIoSVNvdXJjZUxvY2F0b3Igc291cmNlTG9jYXRvcikgewotCQlzZXRTb3VyY2VMb2NhdG9yKHNvdXJjZUxvY2F0b3IpOwotCX0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoSVN0YWNrRnJhbWUgZnJhbWUpIHsKLQkJaWYgKGdldFBTb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBTb3VyY2VMb2NhdG9yKCkuZ2V0TGluZU51bWJlcihmcmFtZSk7Ci0JCX0KLQkJaWYgKGZyYW1lIGluc3RhbmNlb2YgSVBTdGFja0ZyYW1lKSB7Ci0JCQlyZXR1cm4gKChJUFN0YWNrRnJhbWUpIGZyYW1lKS5nZXRGcmFtZUxpbmVOdW1iZXIoKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JcHVibGljIElQU291cmNlTG9jYXRpb25bXSBnZXRTb3VyY2VMb2NhdGlvbnMoKSB7Ci0JCXJldHVybiAoZ2V0UFNvdXJjZUxvY2F0b3IoKSAhPSBudWxsKSA/IGdldFBTb3VyY2VMb2NhdG9yKCkuZ2V0U291cmNlTG9jYXRpb25zKCkgOiBuZXcgSVBTb3VyY2VMb2NhdGlvblswXTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U291cmNlTG9jYXRpb25zKElQU291cmNlTG9jYXRpb25bXSBsb2NhdGlvbnMpIHsKLQkJaWYgKGdldFBTb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UFNvdXJjZUxvY2F0b3IoKS5zZXRTb3VyY2VMb2NhdGlvbnMobG9jYXRpb25zKTsKLQkJCVBEZWJ1Z1RhcmdldCB0YXJnZXQgPSBnZXREZWJ1Z1RhcmdldCgpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJLyoqCi0JCQkJICogRklYTUUgCi0JCQkJIERpc2Fzc2VtYmx5IGQgPSBudWxsOyAKLQkJCQkgdHJ5IHsgCi0JCQkJIAlkID0gKERpc2Fzc2VtYmx5KXRhcmdldC5nZXREaXNhc3NlbWJseSgpOyAKLQkJCQkgfSBjYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7fSAKLQkJCQkgaWYgKGQgIT0gbnVsbCkgewotCQkJCSAJZC5yZXNldCgpOwotCQkJCSB9Ci0JCQkJICovCi0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiAoZ2V0UFNvdXJjZUxvY2F0b3IoKSAhPSBudWxsKSA/IGdldFBTb3VyY2VMb2NhdG9yKCkuY29udGFpbnMocmVzb3VyY2UpIDogZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhQU291cmNlTWFuYWdlci5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQU291cmNlTG9jYXRvci5jbGFzcykpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3IuY2xhc3MpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5jbGFzcykgJiYgZlNvdXJjZUxvY2F0b3IgaW5zdGFuY2VvZiBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcikKLQkJCXJldHVybiBmU291cmNlTG9jYXRvcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0U291cmNlRWxlbWVudChJU3RhY2tGcmFtZSBzdGFja0ZyYW1lKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0U291cmNlTG9jYXRvcigpICE9IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRTb3VyY2VMb2NhdG9yKCkuZ2V0U291cmNlRWxlbWVudChzdGFja0ZyYW1lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIElQU291cmNlTG9jYXRvciBnZXRQU291cmNlTG9jYXRvcigpIHsKLQkJaWYgKGdldFNvdXJjZUxvY2F0b3IoKSBpbnN0YW5jZW9mIElQU291cmNlTG9jYXRvcikKLQkJCXJldHVybiAoSVBTb3VyY2VMb2NhdG9yKSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgSVNvdXJjZUxvY2F0b3IgZ2V0U291cmNlTG9jYXRvcigpIHsKLQkJaWYgKGZTb3VyY2VMb2NhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gZlNvdXJjZUxvY2F0b3I7Ci0JCWVsc2UgaWYgKGZMYXVuY2ggIT0gbnVsbCkKLQkJCXJldHVybiBmTGF1bmNoLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VMb2NhdG9yKElTb3VyY2VMb2NhdG9yIHNsKSB7Ci0JCWZTb3VyY2VMb2NhdG9yID0gc2w7Ci0JfQotCXB1YmxpYyBPYmplY3QgZmluZFNvdXJjZUVsZW1lbnQoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChnZXRQU291cmNlTG9jYXRvcigpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQU291cmNlTG9jYXRvcigpLmZpbmRTb3VyY2VFbGVtZW50KGZpbGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0UGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3IoKS5nZXRNZW1lbnRvKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0UGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkKLQkJCWdldFBlcnNpc3RhYmxlU291cmNlTG9jYXRvcigpLmluaXRpYWxpemVEZWZhdWx0cyhjb25maWd1cmF0aW9uKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21NZW1lbnRvKFN0cmluZyBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3IoKSAhPSBudWxsKQotCQkJZ2V0UGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yKCkuaW5pdGlhbGl6ZUZyb21NZW1lbnRvKG1lbWVudG8pOwotCX0KLQlwcml2YXRlIElQZXJzaXN0YWJsZVNvdXJjZUxvY2F0b3IgZ2V0UGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yKCkgewotCQlpZiAoZlNvdXJjZUxvY2F0b3IgaW5zdGFuY2VvZiBJUGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yKQotCQkJcmV0dXJuIChJUGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yKSBmU291cmNlTG9jYXRvcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKGdldFBTb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkgPyBnZXRQU291cmNlTG9jYXRvcigpLmdldFByb2plY3QoKSA6IG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERlYnVnVGFyZ2V0KFBEZWJ1Z1RhcmdldCB0YXJnZXQpIHsKLQkJZkRlYnVnVGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQlwcm90ZWN0ZWQgUERlYnVnVGFyZ2V0IGdldERlYnVnVGFyZ2V0KCkgewotCQlyZXR1cm4gZkRlYnVnVGFyZ2V0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hGb3JEdXBsaWNhdGVGaWxlcyhib29sZWFuIHNlYXJjaCkgewotCQlpZiAoZ2V0UFNvdXJjZUxvY2F0b3IoKSAhPSBudWxsKQotCQkJZ2V0UFNvdXJjZUxvY2F0b3IoKS5zZXRTZWFyY2hGb3JEdXBsaWNhdGVGaWxlcyhzZWFyY2gpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBzZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpIHsKLQkJcmV0dXJuIChnZXRQU291cmNlTG9jYXRvcigpICE9IG51bGwpID8gZ2V0UFNvdXJjZUxvY2F0b3IoKS5zZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpIDogZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlTm90Rm91bmRFbGVtZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BTb3VyY2VOb3RGb3VuZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4OTQ5MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL2NvcmUvc291cmNlbG9va3VwL1BTb3VyY2VOb3RGb3VuZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUFNvdXJjZU5vdEZvdW5kRWxlbWVudCBpbXBsZW1lbnRzIElEZWJ1Z0VsZW1lbnQgewotCXByaXZhdGUgSURlYnVnRWxlbWVudCBlbGVtZW50OwotCi0JcHVibGljIElEZWJ1Z0VsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFBTb3VyY2VOb3RGb3VuZEVsZW1lbnQoSURlYnVnRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIElEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0RGVidWdUYXJnZXQoKTsKLQl9Ci0KLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldExhdW5jaCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRNb2RlbElkZW50aWZpZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKLQkJSVBTdGFja0ZyYW1lIGZyYW1lID0gKElQU3RhY2tGcmFtZSkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKElQU3RhY2tGcmFtZS5jbGFzcyk7Ci0JCWlmIChmcmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZnJhbWUuZ2V0RmlsZSgpLnRyaW0oKTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvUFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjliYjAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9QU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLlByb2plY3RTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICogQ29tcHV0ZXMgdGhlIGRlZmF1bHQgc291cmNlIGxvb2t1cCBwYXRoIGZvciBhIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIGltcGxlbWVudHMgSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIHsKLQlwdWJsaWMgUFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU291cmNlQ29udGFpbmVyW10gY29tbW9uID0gUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb21tb25Tb3VyY2VMb29rdXBEaXJlY3RvcigpLmdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLQkJQXJyYXlMaXN0PElTb3VyY2VDb250YWluZXI+IGNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTb3VyY2VDb250YWluZXI+KGNvbW1vbi5sZW5ndGggKyAxKTsKLQkJY29udGFpbmVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21tb24pKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCWNvbnRhaW5lcnMuYWRkKDAsIG5ldyBQcm9qZWN0U291cmNlQ29udGFpbmVyKHByb2plY3QsIHRydWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElTb3VyY2VDb250YWluZXJbXSkgY29udGFpbmVycy50b0FycmF5KG5ldyBJU291cmNlQ29udGFpbmVyW2NvbnRhaW5lcnMuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9Tb3VyY2VVdGlscy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC9jb3JlL3NvdXJjZWxvb2t1cC9Tb3VyY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM3ZGRmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvY29yZS9zb3VyY2Vsb29rdXAvU291cmNlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLlByb2plY3RTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JRGlyZWN0b3J5U291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklQU291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklQcm9qZWN0U291cmNlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLk1hcHBpbmdTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNvdXJjZVV0aWxzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT01NT05fU09VUkNFX0xPQ0FUSU9OUyA9ICJjb21tb25Tb3VyY2VMb2NhdGlvbnMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NPVVJDRV9MT0NBVElPTiA9ICJzb3VyY2VMb2NhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FTUVOVE8gPSAibWVtZW50byI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21tb25Tb3VyY2VMb2NhdGlvbnNNZW1lbnRvKElQU291cmNlTG9jYXRpb25bXSBsb2NhdGlvbnMpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlUaHJvd2FibGUgZXggPSBudWxsOwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTkFNRV9DT01NT05fU09VUkNFX0xPQ0FUSU9OUyk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCXNhdmVTb3VyY2VMb2NhdGlvbnMoZG9jdW1lbnQsIGVsZW1lbnQsIGxvY2F0aW9ucyk7Ci0JCQlyZXR1cm4gUERlYnVnVXRpbHMuc2VyaWFsaXplRG9jdW1lbnQoZG9jdW1lbnQpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIDAsICJFcnJvciBzYXZpbmcgY29tbW9uIHNvdXJjZSBzZXR0aW5ncy4iLCBleCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlU291cmNlTG9jYXRpb25zKERvY3VtZW50IGRvYywgRWxlbWVudCBub2RlLCBJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlFbGVtZW50IGNoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnQoTkFNRV9TT1VSQ0VfTE9DQVRJT04pOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKEFUVFJfQ0xBU1MsIGxvY2F0aW9uc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQl0cnkgewotCQkJCWNoaWxkLnNldEF0dHJpYnV0ZShBVFRSX01FTUVOVE8sIGxvY2F0aW9uc1tpXS5nZXRNZW1lbnRvKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgSVBTb3VyY2VMb2NhdGlvbltdIGdldENvbW1vblNvdXJjZUxvY2F0aW9uc0Zyb21NZW1lbnRvKFN0cmluZyBtZW1lbnRvKSB7Ci0JCUlQU291cmNlTG9jYXRpb25bXSByZXN1bHQgPSBuZXcgSVBTb3VyY2VMb2NhdGlvblswXTsKLQkJaWYgKCFpc0VtcHR5KG1lbWVudG8pKSB7Ci0JCQl0cnkgewotCQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIobWVtZW50byk7Ci0JCQkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0JCQkJRWxlbWVudCByb290ID0gcGFyc2VyLnBhcnNlKHNvdXJjZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE5BTUVfQ09NTU9OX1NPVVJDRV9MT0NBVElPTlMpKQotCQkJCQlyZXN1bHQgPSBpbml0aWFsaXplU291cmNlTG9jYXRpb25zKHJvb3QpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIDAsICJFcnJvciBpbml0aWFsaXppbmcgY29tbW9uIHNvdXJjZSBzZXR0aW5ncy4iLCBlKSk7Ci0JCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAwLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGNvbW1vbiBzb3VyY2Ugc2V0dGluZ3MuIiwgZSkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAwLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGNvbW1vbiBzb3VyY2Ugc2V0dGluZ3MuIiwgZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBzdGF0aWMgSVBTb3VyY2VMb2NhdGlvbltdIGluaXRpYWxpemVTb3VyY2VMb2NhdGlvbnMoRWxlbWVudCByb290KSB7Ci0JCUxpc3Q8SVBTb3VyY2VMb2NhdGlvbj4gc291cmNlTG9jYXRpb25zID0gbmV3IExpbmtlZExpc3Q8SVBTb3VyY2VMb2NhdGlvbj4oKTsKLQkJTm9kZUxpc3QgbGlzdCA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBlbnRyeSA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChlbnRyeS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTkFNRV9TT1VSQ0VfTE9DQVRJT04pKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQkJCVN0cmluZyBkYXRhID0gZW50cnkuZ2V0QXR0cmlidXRlKEFUVFJfTUVNRU5UTyk7Ci0JCQkJCWlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coIlVuYWJsZSB0byByZXN0b3JlIGNvbW1vbiBzb3VyY2UgbG9jYXRpb25zIC0gaW52YWxpZCBmb3JtYXQuIik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlDbGFzcyBjbGF6eiA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGF6eiA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiVW5hYmxlIHRvIHJlc3RvcmUgc291cmNlIGxvY2F0aW9uIC0gY2xhc3Mgbm90IGZvdW5kIHswfSIsIG5ldyBPYmplY3RbXSB7IGNsYXNzTmFtZSB9KSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlJUFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxvY2F0aW9uID0gKElQU291cmNlTG9jYXRpb24pIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZygiVW5hYmxlIHRvIHJlc3RvcmUgc291cmNlIGxvY2F0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZygiVW5hYmxlIHRvIHJlc3RvcmUgc291cmNlIGxvY2F0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWxvY2F0aW9uLmluaXRpYWxpemVGcm9tKGRhdGEpOwotCQkJCQkJc291cmNlTG9jYXRpb25zLmFkZChsb2NhdGlvbik7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZygiVW5hYmxlIHRvIHJlc3RvcmUgc291cmNlIGxvY2F0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSVBTb3VyY2VMb2NhdGlvbltdKSBzb3VyY2VMb2NhdGlvbnMudG9BcnJheShuZXcgSVBTb3VyY2VMb2NhdGlvbltzb3VyY2VMb2NhdGlvbnMuc2l6ZSgpXSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci0Jc3RhdGljIHB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29udmVydFNvdXJjZUxvY2F0aW9ucyhJUFNvdXJjZUxvY2F0aW9uW10gbG9jYXRpb25zKSB7Ci0JCUFycmF5TGlzdDxJU291cmNlQ29udGFpbmVyPiBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxJU291cmNlQ29udGFpbmVyPihsb2NhdGlvbnMubGVuZ3RoKTsKLQkJaW50IG1hcHBpbmdDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAobG9jYXRpb25zW2ldIGluc3RhbmNlb2YgSVByb2plY3RTb3VyY2VMb2NhdGlvbikgewotCQkJCWNvbnRhaW5lcnMuYWRkKG5ldyBQcm9qZWN0U291cmNlQ29udGFpbmVyKCgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldKS5nZXRQcm9qZWN0KCksIGZhbHNlKSk7Ci0JCQl9IGVsc2UgaWYgKGxvY2F0aW9uc1tpXSBpbnN0YW5jZW9mIElEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbikgewotCQkJCUlEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbiBkID0gKElEaXJlY3RvcnlTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldOwotCQkJCUlQYXRoIGEgPSBkLmdldEFzc29jaWF0aW9uKCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCQlNYXBwaW5nU291cmNlQ29udGFpbmVyIG1hcHBpbmcgPSBuZXcgTWFwcGluZ1NvdXJjZUNvbnRhaW5lcihJbnRlcm5hbFNvdXJjZUxvb2t1cE1lc3NhZ2VzLmdldFN0cmluZygiU291cmNlVXRpbHMuMCIpICsgKCsrbWFwcGluZ0NvdW50KSk7Ci0JCQkJCW1hcHBpbmcuYWRkTWFwRW50cmllcyhuZXcgTWFwRW50cnlTb3VyY2VDb250YWluZXJbXSB7IG5ldyBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcihhLCBkLmdldERpcmVjdG9yeSgpKSB9KTsKLQkJCQkJY29udGFpbmVycy5hZGQobWFwcGluZyk7Ci0JCQkJfQotCQkJCWNvbnRhaW5lcnMuYWRkKG5ldyBQRGlyZWN0b3J5U291cmNlQ29udGFpbmVyKGQuZ2V0RGlyZWN0b3J5KCksIGQuc2VhcmNoU3ViZm9sZGVycygpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJU291cmNlQ29udGFpbmVyW10pIGNvbnRhaW5lcnMudG9BcnJheShuZXcgSVNvdXJjZUNvbnRhaW5lcltjb250YWluZXJzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8uY2xhc3NwYXRoIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvLmN2c2lnbm9yZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE2OTFlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWRvYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8ub3B0aW9ucyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNDc1MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgVHJhY2Ugam9iIHRoYXQgZXhlY3V0ZXMgU0RNIG1hc3Rlcgotb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9kZWJ1Zy9TRE1tYXN0ZXI9dHJ1ZQotb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2RlYnVnL1NETW1hc3Rlci9tb3JlPXRydWUKLW9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9kZWJ1Zy9TRE1tYXN0ZXIvb3V0cHV0PXRydWUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8ucHJvamVjdCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNTQ5OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTEyMjlhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUuU0RNRGVidWdDb3JlUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7Ci0gIHVzZXM6PSJvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLAotICAgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlciwKLSAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcywKLSAgIG9yZy5vc2dpLmZyYW1ld29yaywKLSAgIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudCwKLSAgIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LAotICAgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubGF1bmNoLAotICAgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbCwKLSAgIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaSwKLSAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSAgIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbCwKLSAgIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLAotIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGk7Ci0gIHVzZXM6PSJvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQsCi0gICBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucHJveHksCi0gICBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLAotICAgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbCwKLSAgIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaSwKLSAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSAgIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbCIsCi0gb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnByb3h5O3VzZXM6PSJvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSxvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCwKLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iMS4yLjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvYWJvdXQuaHRtbCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvYWJvdXQuaW5pIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvYWJvdXQubWFwcGluZ3MgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzNjYWEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTkxTX01FU1NBR0VGT1JNQVRfTk9ORQotIyBOTFNfRU5DT0RJTkc9VVRGLTgKLQotYmx1cmI9UFRQIFNjYWxhYmxlIERlYnVnIE1hbmFnZXJcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3B0cFxuCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjgzNDIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9lY2xpcHNlMzIucG5nIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjk1MjguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBDbGVtZW50IENodQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFNjYWxhYmxlIERlYnVnIE1hbmFnZXIgQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKLQotU0RNLm5hbWU9U0RNCi1TaW11bGF0b3IubmFtZT1TaW11bGF0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvcGx1Z2luLnhtbCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWRmZWJhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLlByZWZlcmVuY2VJbml0aWFsaXplciI+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXI+Ci0gICAgIDwvZXh0ZW5zaW9uPgotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wYXJhbGxlbERlYnVnZ2VycyI+Ci0gICAgICAgIDxkZWJ1Z2dlcgotICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLlNETURlYnVnZ2VyIgotICAgICAgICAgICAgICBjcHU9IioiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIgotICAgICAgICAgICAgICBtb2Rlcz0icnVuIgotICAgICAgICAgICAgICBuYW1lPSIlU0RNLm5hbWUiCi0gICAgICAgICAgICAgIHBsYXRmb3JtPSIqIj4KLSAgICAgICAgPC9kZWJ1Z2dlcj4KLSAgICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODNmNTcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFNETURlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkvL1N0cmluZyBkZWJ1Z2dlckZpbGUgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5sb2NhdGVGcmFnbWVudEZpbGUoIm9yZy5lY2xpcHNlLnB0cCIsICJzZG0iKTsKLQkJLy9pZiAoZGVidWdnZXJGaWxlICE9IG51bGwpCi0JCQkvL3N0b3JlLnNldERlZmF1bHQoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfRklMRSwgZGVidWdnZXJGaWxlKTsKLSAKLQkJLy9zdG9yZS5zZXREZWZhdWx0KFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0hPU1QsIFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFRkFVTFRfREVVQkdHRVJfSE9TVCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfQkFDS0VORF9UWVBFLCAKLQkJCQlTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9CQUNLRU5EU1tTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUZBVUxUX0RFRFVHR0VSX0JBQ0tFTkRfSU5ERVhdKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9CQUNLRU5EX1BBVEgsIFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFRkFVTFRfREVEVUdHRVJfQkFDS0VORF9QQVRIKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1EZWJ1Z0NvcmVQbHVnaW4uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETURlYnVnQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWMwZDMyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETURlYnVnQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgU0RNRGVidWdDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlIjsKLQotCXByaXZhdGUgc3RhdGljIFNETURlYnVnQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTRE1EZWJ1Z0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwbHVnaW4KLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU0RNRGVidWdDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlEZWJ1Z1V0aWwuY29uZmlndXJlUGx1Z2luRGVidWdPcHRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1EZWJ1Z2dlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNRGVidWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkZWM4OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1EZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkFycmF5QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Kb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUERlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5sYXVuY2guSVBMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5TRE1SdW5uZXIuU0RNTWFzdGVyU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5QRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2guUFRQTGF1bmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTRE1EZWJ1Z2dlciBpbXBsZW1lbnRzIElQRGVidWdnZXIgewotCXByaXZhdGUgSVBESURlYnVnZ2VyIHBkaURlYnVnZ2VyID0gbnVsbDsKLQlwcml2YXRlIElQRElNb2RlbEZhY3RvcnkgbW9kZWxGYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIElQRElNYW5hZ2VyRmFjdG9yeSBtYW5hZ2VyRmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJUERJRXZlbnRGYWN0b3J5IGV2ZW50RmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJUERJUmVxdWVzdEZhY3RvcnkgcmVxdWVzdEZhY3RvcnkgPSBudWxsOwotCi0JSUZpbGVTdG9yZSByb3V0aW5nRmlsZVN0b3JlID0gbnVsbDsKLQlTRE1SdW5uZXIgc2RtUnVubmVyID0gbnVsbDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdnZXIjY3JlYXRlRGVidWdTZXNzaW9uKGxvbmcsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmxhdW5jaC5JUExhdW5jaCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBJUERJU2Vzc2lvbiBjcmVhdGVEZWJ1Z1Nlc3Npb24obG9uZyB0aW1lb3V0LCBmaW5hbCBJUExhdW5jaCBsYXVuY2gsIElQYXRoIGNvcmVmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbEZhY3RvcnkgPT0gbnVsbCkgewotCQkJbW9kZWxGYWN0b3J5ID0gbmV3IFNETU1vZGVsRmFjdG9yeSgpOwotCQl9Ci0JCWlmIChtYW5hZ2VyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQltYW5hZ2VyRmFjdG9yeSA9IG5ldyBTRE1NYW5hZ2VyRmFjdG9yeSgpOwotCQl9Ci0JCWlmIChldmVudEZhY3RvcnkgPT0gbnVsbCkgewotCQkJZXZlbnRGYWN0b3J5ID0gbmV3IFNETUV2ZW50RmFjdG9yeSgpOwotCQl9Ci0JCWlmIChyZXF1ZXN0RmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXF1ZXN0RmFjdG9yeSA9IG5ldyBTRE1SZXF1ZXN0RmFjdG9yeSgpOwotCQl9Ci0KLQkJLyoKLQkJICogV3JpdGluZyB0aGUgcm91bnRpbmcgZmlsZSBhY3R1YWxseSBzdGFydHMgdGhlIFNETSBzZXJ2ZXJzLgotCQkgKi8KLQkJd3JpdGVSb3V0aW5nRmlsZShsYXVuY2gpOwotCi0JCS8qCi0JCSAqIERlbGF5IHN0YXJ0aW5nIHRoZSBtYXN0ZXIgU0RNIChha2EgU0RNIGNsaWVudCksIHRvIHdhaXQgdW50aWwgU0RNIHNlcnZlcnMgaGF2ZSBzdGFydGVkIGFuZCB1bnRpbCB0aGUgc2Vzc2lvbnMKLQkJICogYXJlIGxpc3RlbmluZyBvbiB0aGUgZGVidWdnZXIgc29ja2V0LgotCQkgKi8KLQkJc2RtUnVubmVyLnNldEpvYihsYXVuY2guZ2V0UEpvYigpKTsKLQkJc2RtUnVubmVyLnNjaGVkdWxlKCk7Ci0KLQkJSVBESVNlc3Npb24gc2Vzc2lvbiA9IGNyZWF0ZVNlc3Npb24odGltZW91dCwgbGF1bmNoLCBjb3JlZmlsZSk7Ci0KLQkJcmV0dXJuIHNlc3Npb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z2dlciNpbml0aWFsaXplKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5QXR0cmlidXRlPFN0cmluZz4gZGJnQXJnc0F0dHIgPSBhdHRyTWdyLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldERlYnVnZ2VyQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQotCQlpZiAoZGJnQXJnc0F0dHIgPT0gbnVsbCkgewotCQkJZGJnQXJnc0F0dHIgPSBKb2JBdHRyaWJ1dGVzLmdldERlYnVnZ2VyQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoZGJnQXJnc0F0dHIpOwotCQl9Ci0KLQkJTGlzdDxTdHJpbmc+IGRiZ0FyZ3MgPSBkYmdBcmdzQXR0ci5nZXRWYWx1ZSgpOwotCi0JCXRyeSB7Ci0JCQlnZXREZWJ1Z2dlcigpLmluaXRpYWxpemUoY29uZmlndXJhdGlvbiwgZGJnQXJncywgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJLyoKLQkJICogU3RvcmUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIHJvdXRpbmcgZmlsZSBsYXRlci4KLQkJICovCi0JCXByZXBhcmVSb3V0aW5nRmlsZShjb25maWd1cmF0aW9uLCBhdHRyTWdyLCBtb25pdG9yKTsKLQotCQkvKgotCQkgKiBQcmVwYXJlIHRoZSBNYXN0ZXIgU0RNIGNvbnRyb2xsZXIgdGhyZWFkLgotCQkgKi8KLQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gPSBudWxsOwotCQlybSA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCkgZ2V0UmVzb3VyY2VNYW5hZ2VyKGNvbmZpZ3VyYXRpb24pOwotCQlzZG1SdW5uZXIgPSBuZXcgU0RNUnVubmVyKHJtKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUERlYnVnZ2VyI2dldExhdW5jaEF0dHJpYnV0ZXMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdldExhdW5jaEF0dHJpYnV0ZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5QXR0cmlidXRlPFN0cmluZz4gZGJnQXJnc0F0dHIgPSBhdHRyTWdyLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldERlYnVnZ2VyQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQotCQlpZiAoZGJnQXJnc0F0dHIgPT0gbnVsbCkgewotCQkJZGJnQXJnc0F0dHIgPSBKb2JBdHRyaWJ1dGVzLmdldERlYnVnZ2VyQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpOwotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoZGJnQXJnc0F0dHIpOwotCQl9Ci0KLQkJTGlzdDxTdHJpbmc+IGRiZ0FyZ3MgPSBkYmdBcmdzQXR0ci5nZXRWYWx1ZSgpOwotCi0JCVByZWZlcmVuY2VzIHN0b3JlID0gU0RNRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCVN0cmluZyBsb2NhbEFkZHJlc3MgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFQlVHR0VSX0hPU1QsICJsb2NhbGhvc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRiZ0FyZ3MuYWRkKCItLWhvc3Q9IiArIGxvY2FsQWRkcmVzcyk7IC8vJE5PTi1OTFMtMSQKLQkJZGJnQXJncy5hZGQoIi0tZGVidWdnZXI9IiArIHN0b3JlLmdldFN0cmluZyhTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9CQUNLRU5EX1RZUEUpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBkYmdQYXRoID0gc3RvcmUuZ2V0U3RyaW5nKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0JBQ0tFTkRfUEFUSCk7Ci0JCWlmIChkYmdQYXRoLmxlbmd0aCgpID4gMCkgewotCQkJZGJnQXJncy5hZGQoIi0tZGVidWdnZXJfcGF0aD0iICsgZGJnUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBkYmdFeHRyYUFyZ3MgPSBzdG9yZS5nZXRTdHJpbmcoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfQVJHUyk7Ci0JCWlmIChkYmdFeHRyYUFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkYmdBcmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KGRiZ0V4dHJhQXJncy5zcGxpdCgiICIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHJlbW90ZSBzZXR0aW5nCi0JCVN0cmluZyBkYmdFeGVQYXRoID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9FWEVDVVRBQkxFX1BBVEgsICIiKTsKLQkJLy9pZiAoZGJnRXhlUGF0aCA9PSBudWxsKSB7Ci0JCQkvL2RiZ0V4ZVBhdGggPSBzdG9yZS5nZXRTdHJpbmcoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfRklMRSk7Ci0JCS8vfQotCQlJUGF0aCBwYXRoID0gUFRQTGF1bmNoUGx1Z2luLmdldERlZmF1bHQoKS52ZXJpZnlSZXNvdXJjZShkYmdFeGVQYXRoLCBjb25maWd1cmF0aW9uKTsKLQkJLy9JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGJnRXhlUGF0aCk7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdnZXJFeGVjdXRhYmxlTmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUocGF0aC5sYXN0U2VnbWVudCgpKSk7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdnZXJFeGVjdXRhYmxlUGF0aEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKSkpOwotCi0JCVN0cmluZyBkYmdXRCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfV09SS0lOR19ESVIsIChTdHJpbmcpbnVsbCk7Ci0JCWlmIChkYmdXRCAhPSBudWxsKSB7Ci0JCQlTdHJpbmdBdHRyaWJ1dGUgd2RBdHRyID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRXb3JraW5nRGlyZWN0b3J5QXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCWlmICh3ZEF0dHIgIT0gbnVsbCkgewotCQkJCXdkQXR0ci5zZXRWYWx1ZUFzU3RyaW5nKGRiZ1dEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRXb3JraW5nRGlyZWN0b3J5QXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShkYmdXRCkpOwotCQkJfQotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRFeGVjdXRhYmxlUGF0aEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoZGJnV0QgKyAiL0RlYnVnIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXREZWJ1Z0ZsYWdBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHRydWUpKTsKLQotCQkvKgotCQkgKiBTYXZlIFNETSBjb21tYW5kIGxpbmUgZm9yIGZ1dHVyZSB1c2UuCi0JCSAqLwotCQlMaXN0PFN0cmluZz4gc2RtQ29tbWFuZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzZG1Db21tYW5kLmFkZChhdHRyTWdyLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldERlYnVnZ2VyRXhlY3V0YWJsZVBhdGhBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCkrIi8iK2F0dHJNZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdnZXJFeGVjdXRhYmxlTmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKSk7Ci0JCXNkbUNvbW1hbmQuYWRkKCItLW1hc3RlciIpOwotCQlzZG1Db21tYW5kLmFkZEFsbChkYmdBcmdzKTsKLQkJc2RtUnVubmVyLnNldENvbW1hbmQoc2RtQ29tbWFuZCk7Ci0JCXNkbVJ1bm5lci5zZXRXb3JrRGlyKGF0dHJNZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0V29ya2luZ0RpcmVjdG9yeUF0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IsIElQTGF1bmNoIGxhdW5jaCkgewotCQlpZiAoc2RtUnVubmVyICE9IG51bGwpIHsKLQkJCWlmIChzZG1SdW5uZXIuZ2V0U2RtU3RhdGUoKSA9PSBTRE1NYXN0ZXJTdGF0ZS5SVU5OSU5HKSB7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5TRE1fTUFTVEVSX1RSQUNJTkcsICJzZG0gbWFzdGVyOiBzdGlsbCBydW5uaW5nLCBjYW5jZWwgaXMgdG8gYmUgaXNzdWVkIHNvb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBUaHJlYWQoIlNETSBtYXN0ZXIga2lsbGVyIHRocmVhZCIpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HX01PUkUsICJzZG0gbWFzdGVyIGtpbGxlcjogdGhyZWFkIHN0YXJ0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJd2FpdCg1MDAwKTsKLQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIElnbm9yZQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChzZG1SdW5uZXIuZ2V0U2RtU3RhdGUoKSA9PSBTRE1NYXN0ZXJTdGF0ZS5SVU5OSU5HKSB7Ci0JCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5TRE1fTUFTVEVSX1RSQUNJTkcsICJzZG0gbWFzdGVyIGtpbGxlcjogY2FuY2VsIFNETSBtYXN0ZXIgbm93Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzZG1SdW5uZXIuY2FuY2VsKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HLCAic2RtIG1hc3RlciBraWxsZXI6IGRvIG5vdCBjYW5jZWwgU0RNIG1hc3Rlciwgc2luY2UgaXQgZmluaXNoZWQgYnkgaXRzZWxmLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lOR19NT1JFLCAic2RtIG1hc3RlciBraWxsZXI6IHRocmVhZCBmaW5pc2hlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFBESSBkZWJ1Z2dlciBpbXBsZW1lbnRhdGlvbi4gQ3JlYXRlcyB0aGUgY2xhc3MgaWYgbmVjZXNzYXJ5LgotCSAqCi0JICogQHJldHVybiBJUERJRGVidWdnZXIKLQkgKi8KLQlwcml2YXRlIElQRElEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpIHsKLQkJaWYgKHBkaURlYnVnZ2VyID09IG51bGwpIHsKLQkJCXBkaURlYnVnZ2VyID0gbmV3IFBESURlYnVnZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHBkaURlYnVnZ2VyOwotCX0KLQotCS8qKgotCSAqIFdvcmsgb3V0IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHRoZSBqb2IuIElmIGl0IGhhc24ndCBiZWVuCi0JICogc3BlY2lmaWVkLCBhc3N1bWUgb25lLgotCSAqCi0JICogQHBhcmFtIGpvYiBqb2IgdGhhdCB3YXMgbGF1bmNoZWQKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBwcm9jZXNzZXMKLQkgKi8KLQlwcml2YXRlIGludCBnZXRKb2JTaXplKElQSm9iIGpvYikgewotCQlpbnQgbnByb2NzID0gam9iLmdldFByb2Nlc3NlcygpLmxlbmd0aDsKLQkJaWYgKG5wcm9jcyA9PSAwKSB7Ci0JCQlucHJvY3MgPSAxOwotCQl9Ci0JCXJldHVybiBucHJvY3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ29yZUV4Y2VwdGlvbiB0aGF0IGNhbiBiZSB0aHJvd24KLQkgKgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIENvcmVFeGNlcHRpb24gbmV3Q29yZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTRE1EZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uSU5URVJOQUxfRVJST1IsICJDYW5ub3Qgc3RhcnQgZGVidWdnaW5nIiwgZXhjZXB0aW9uKTsKLQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNETURlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwgZXhjZXB0aW9uID09IG51bGwgPyBuZXcgU3RyaW5nKCkgOiBleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgUERJIHNlc3Npb24KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHBhcmFtIGxhdW5jaAotCSAqIEBwYXJhbSBjb3JlZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBTZXNzaW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihsb25nIHRpbWVvdXQsIElQTGF1bmNoIGxhdW5jaCwgSVBhdGggY29yZWZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBKb2Igam9iID0gbGF1bmNoLmdldFBKb2IoKTsKLQkJaW50IGpvYl9zaXplID0gZ2V0Sm9iU2l6ZShqb2IpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBTZXNzaW9uKG1hbmFnZXJGYWN0b3J5LCByZXF1ZXN0RmFjdG9yeSwgZXZlbnRGYWN0b3J5LCBtb2RlbEZhY3RvcnksCi0JCQkJCWxhdW5jaC5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCksIHRpbWVvdXQsIGdldERlYnVnZ2VyKCksIGpvYi5nZXRJRCgpLCBqb2Jfc2l6ZSk7Ci0JCX0KLQkJY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQVW5pdmVyc2UgdW5pdmVyc2UgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpOwotCQlJUmVzb3VyY2VNYW5hZ2VyW10gcm1zID0gdW5pdmVyc2UuZ2V0UmVzb3VyY2VNYW5hZ2VycygpOwotCQlTdHJpbmcgcm1VbmlxdWVOYW1lID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9SRVNPVVJDRV9NQU5BR0VSX1VOSVFVRU5BTUUsIChTdHJpbmcpbnVsbCk7Ci0JCWZvciAoSVJlc291cmNlTWFuYWdlciBybSA6IHJtcykgewotCQkJaWYgKHJtLmdldFN0YXRlKCkgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVEFSVEVEICYmCi0JCQkJCXJtLmdldFVuaXF1ZU5hbWUoKS5lcXVhbHMocm1VbmlxdWVOYW1lKSkgewotCQkJCXJldHVybiBybTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVJvdXRpbmdGaWxlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcm91dGluZ0ZpbGVQYXRoID0gbmV3IFBhdGgoYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRXb3JraW5nRGlyZWN0b3J5QXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpKTsKLQkJcm91dGluZ0ZpbGVQYXRoID0gcm91dGluZ0ZpbGVQYXRoLmFwcGVuZCgicm91dGluZ19maWxlIik7Ci0KLQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gPSAoSVJlc291cmNlTWFuYWdlckNvbnRyb2wpIGdldFJlc291cmNlTWFuYWdlcihjb25maWd1cmF0aW9uKTsKLQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZiA9IHJtLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIHJlbUNvbmYgPSAoQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKWNvbmY7Ci0JCUlSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKHJlbUNvbmYuZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIHJjb25uTWdyID0gcmVtb3RlU2VydmljZXMuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKTsKLQkJSVJlbW90ZUNvbm5lY3Rpb24gcmNvbm4gPSByY29ubk1nci5nZXRDb25uZWN0aW9uKHJlbUNvbmYuZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCUlSZW1vdGVGaWxlTWFuYWdlciByZW1vdGVGaWxlTWFuYWdlciA9IHJlbW90ZVNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKHJjb25uKTsKLQotCQl0cnkgewotCQkJdGhpcy5yb3V0aW5nRmlsZVN0b3JlID0gcmVtb3RlRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2Uocm91dGluZ0ZpbGVQYXRoLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCUlGaWxlSW5mbyBpbmZvID0gcm91dGluZ0ZpbGVTdG9yZS5mZXRjaEluZm8oKTsKLQkJaWYgKGluZm8uZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcm91dGluZ0ZpbGVTdG9yZS5kZWxldGUoMCwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcm91dGluZ0ZpbGVTdG9yZS5mZXRjaEluZm8oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVJvdXRpbmdGaWxlKElQTGF1bmNoIGxhdW5jaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lORywgImRlYnVnOiBXcml0ZSByb3V0aW5nIGZpbGUiKTsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9zID0gcm91dGluZ0ZpbGVTdG9yZS5vcGVuT3V0cHV0U3RyZWFtKDAsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIob3MpOwotCQlJUFByb2Nlc3MgcHJvY2Vzc2VzW10gPSBsYXVuY2guZ2V0UEpvYigpLmdldFByb2Nlc3NlcygpOwotCQlwdy5mb3JtYXQoIiVkXG4iLCBwcm9jZXNzZXMubGVuZ3RoKTsKLQkJaW50IGJhc2UgPSAxMDAwMDsKLQkJaW50IHJhbmdlID0gMTAwMDA7Ci0JCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JCWZvciAoSVBQcm9jZXNzIHByb2Nlc3MgOiBwcm9jZXNzZXMpIHsKLQkJCVN0cmluZyBpbmRleCA9IHByb2Nlc3MuZ2V0UHJvY2Vzc0luZGV4KCk7Ci0JCQlJUE5vZGUgbm9kZSA9IHByb2Nlc3MuZ2V0Tm9kZSgpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpbnQgcG9ydE51bWJlciA9IGJhc2UgKyByYW5kb20ubmV4dEludChyYW5nZSk7Ci0JCQlwdy5mb3JtYXQoIiVzICVzICVkXG4iLCBpbmRleCwgbm9kZU5hbWUsIHBvcnROdW1iZXIpOwotCQl9Ci0JCXB3LmNsb3NlKCk7Ci0JCXRyeSB7Ci0JCQlvcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNRXZlbnRGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1FdmVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkOTI1ZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1FdmVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuQWJzdHJhY3RFdmVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTRE1FdmVudEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50RmFjdG9yeSB7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1FdmVudE1hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETUV2ZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ4MTRhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETUV2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9ic2VydmFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb25PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJTG9jYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElSZXN1bWVkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuQWJzdHJhY3RFdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElCcmVha3BvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJQ29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUNvbmRpdGlvbkJyZWFrcG9pbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElEZWxldGVCcmVha3BvaW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElEaXNhYmxlQnJlYWtwb2ludFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUVuYWJsZUJyZWFrcG9pbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElFdmVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdvUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdGFydERlYnVnZ2VyUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU3RlcEZpbmlzaFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVN0ZXBJbnRvSW5zdHJ1Y3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdGVwSW50b1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVN0ZXBPdmVySW5zdHJ1Y3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTdGVwT3ZlclJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVN0ZXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElUZXJtaW5hdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wcm94eS5Qcm94eURlYnVnQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuUHJveHlEZWJ1Z0xvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnQXJnc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0JyZWFrcG9pbnRIaXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRGF0YUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0RhdGFFeHBWYWx1ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0Vycm9yRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXhpdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnSW5pdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdPS0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTaWduYWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU2lnbmFsc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1N0ZXBFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTdXNwZW5kRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnVHlwZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1ZhcnNFdmVudDsKLQotcHVibGljIGNsYXNzIFNETUV2ZW50TWFuYWdlciBleHRlbmRzIEFic3RyYWN0RXZlbnRNYW5hZ2VyIHsKLQlwdWJsaWMgU0RNRXZlbnRNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJc3VwZXIoc2Vzc2lvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5PYnNlcnZlciN1cGRhdGUoamF2YS51dGlsLk9ic2VydmFibGUsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKE9ic2VydmFibGUgbywgZmluYWwgT2JqZWN0IGFyZykgewotCQlQRGVidWdVdGlscy5wcmludGxuKCJNc2c6IFNETUV2ZW50TWFuYWdlciAtIHVwZGF0ZSgpOiBFdmVudDogIiArICgoSVByb3h5RGVidWdFdmVudClhcmcpLnRvU3RyaW5nKCkpOwotCQlJUHJveHlEZWJ1Z0V2ZW50IGV2ZW50ID0gKElQcm94eURlYnVnRXZlbnQpIGFyZzsKLQkJSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3VycmVudFJlcXVlc3QoKTsKLQkJZmlyZUV2ZW50KHJlcXVlc3QsIGV2ZW50KTsKLQkJdmVyaWZ5RXZlbnQocmVxdWVzdCwgZXZlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcmVhc29uCi0JICogQHBhcmFtIHRocmVhZF9pZAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEBwYXJhbSB2YXJzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVBESUV2ZW50IGNyZWF0ZVN1c3BlbmRlZEV2ZW50KElQRElTZXNzaW9uT2JqZWN0IHJlYXNvbiwgaW50IHRocmVhZF9pZCwgaW50IGxldmVsLCBpbnQgZGVwdGgsIFN0cmluZ1tdIHZhcnMpIHsKLQkJaWYgKGRlcHRoID4gMSkgewotCQkJc2Vzc2lvbi5nZXRUYXNrTWFuYWdlcigpLnNldENhblN0ZXBSZXR1cm5UYXNrcyh0cnVlLCByZWFzb24uZ2V0VGFza3MoKSk7Ci0JCX0KLQkJc2Vzc2lvbi5nZXRUYXNrTWFuYWdlcigpLnNldFN1c3BlbmRUYXNrcyh0cnVlLCByZWFzb24uZ2V0VGFza3MoKSk7Ci0JCXNlc3Npb24ucHJvY2Vzc1N1cHNlbmRlZEV2ZW50KHJlYXNvbi5nZXRUYXNrcygpLmNvcHkoKSwgdGhyZWFkX2lkLCB2YXJzKTsKLQkJcmV0dXJuIHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3U3VzcGVuZGVkRXZlbnQocmVhc29uLCB2YXJzLCB0aHJlYWRfaWQsIGxldmVsLCBkZXB0aCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBmaXJlRXZlbnQoSVBESUV2ZW50UmVxdWVzdCByZXF1ZXN0LCBJUHJveHlEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCUJpdExpc3QgZVRhc2tzID0gUHJveHlEZWJ1Z0NsaWVudC5kZWNvZGVCaXRTZXQoZXZlbnQuZ2V0Qml0U2V0KCkpOwotCi0JCVBEZWJ1Z1V0aWxzLnByaW50bG4oIk1zZzogU0RNRXZlbnRNYW5hZ2VyIC0gZmlyZUV2ZW50KCk6IGV2ZW50ICIgKyBldmVudCk7Ci0JCQotCQlMaXN0PElQRElFdmVudD4gZXZlbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxJUERJRXZlbnQ+KCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhZGQoSVBESUV2ZW50IGUpIHsKLQkJCQlQRGVidWdVdGlscy5wcmludGxuKCJNc2c6IFNETUV2ZW50TWFuYWdlciAtIGZpcmVFdmVudCgpOiBhZGRlZCBQRElFdmVudDogIiArIGUpOwotCQkJCXJldHVybiBzdXBlci5hZGQoZSk7Ci0JCQl9Ci0JCX07Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURlYnVnT0tFdmVudCkgewotCQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSVBESUdvUmVxdWVzdCkgewotCQkJCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0U3VzcGVuZFRhc2tzKGZhbHNlLCBlVGFza3MpOwotCQkJCQlzZXNzaW9uLnByb2Nlc3NSdW5uaW5nRXZlbnQoZVRhc2tzLmNvcHkoKSk7Ci0JCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdSZXN1bWVkRXZlbnQoc2Vzc2lvbiwgZVRhc2tzLCBJUERJUmVzdW1lZEV2ZW50LkNPTlRJTlVFKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJU3RlcFJlcXVlc3QpIHsKLQkJCQkJaW50IGRldGFpbHM7Ci0JCQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSVBESVN0ZXBJbnRvUmVxdWVzdCkKLQkJCQkJCWRldGFpbHMgPSBJUERJUmVzdW1lZEV2ZW50LlNURVBfSU5UTzsKLQkJCQkJZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElQRElTdGVwT3ZlclJlcXVlc3QpCi0JCQkJCQlkZXRhaWxzID0gSVBESVJlc3VtZWRFdmVudC5TVEVQX09WRVI7Ci0JCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJU3RlcEZpbmlzaFJlcXVlc3QpCi0JCQkJCQlkZXRhaWxzID0gSVBESVJlc3VtZWRFdmVudC5TVEVQX1JFVFVSTjsKLQkJCQkJZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElQRElTdGVwSW50b0luc3RydWN0aW9uUmVxdWVzdCkKLQkJCQkJCWRldGFpbHMgPSBJUERJUmVzdW1lZEV2ZW50LlNURVBfSU5UT19JTlNUUlVDVElPTjsKLQkJCQkJZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElQRElTdGVwT3Zlckluc3RydWN0aW9uUmVxdWVzdCkKLQkJCQkJCWRldGFpbHMgPSBJUERJUmVzdW1lZEV2ZW50LlNURVBfT1ZFUl9JTlNUUlVDVElPTjsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlkZXRhaWxzID0gSVBESVJlc3VtZWRFdmVudC5DT05USU5VRTsKLQkJCQkJfQotCQkJCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0U3VzcGVuZFRhc2tzKGZhbHNlLCBlVGFza3MpOwotCQkJCQlzZXNzaW9uLnByb2Nlc3NSdW5uaW5nRXZlbnQoZVRhc2tzLmNvcHkoKSk7Ci0JCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdSZXN1bWVkRXZlbnQoc2Vzc2lvbiwgZVRhc2tzLCBkZXRhaWxzKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJRW5hYmxlQnJlYWtwb2ludFJlcXVlc3QpIHsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElQRElEaXNhYmxlQnJlYWtwb2ludFJlcXVlc3QpIHsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElQRElDb25kaXRpb25CcmVha3BvaW50UmVxdWVzdCkgewotCQkJCX0KLQkJCQllbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSVBESURlbGV0ZUJyZWFrcG9pbnRSZXF1ZXN0KSB7Ci0JCQkJCWlmICgoKElQRElCcmVha3BvaW50UmVxdWVzdClyZXF1ZXN0KS5pc0FsbG93VXBkYXRlKCkpIHsKLQkJCQkJCUlQRElCcmVha3BvaW50IGJwdCA9ICgoSVBESURlbGV0ZUJyZWFrcG9pbnRSZXF1ZXN0KXJlcXVlc3QpLmdldEJyZWFrcG9pbnQoKTsKLQkJCQkJCWlmIChicHQgPT0gbnVsbCkgewotCQkJCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckV2ZW50KAotCQkJCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckluZm8oc2Vzc2lvbiwgZVRhc2tzLCBJUERJRXJyb3JJbmZvLkRCR19OT1JNQUwsICJEZWxldGUgQnJlYWtwb2ludCBFcnJvciIsICJObyBQREkgYnJlYWtwb2ludCBmb3VuZCIpKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGVzdHJveWVkRXZlbnQoCi0JCQkJCQkJCQlzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0JyZWFrcG9pbnRJbmZvKHNlc3Npb24sIGVUYXNrcywgYnB0KSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJVGVybWluYXRlUmVxdWVzdCkgewotCQkJCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0UGVuZGluZ1Rhc2tzKGZhbHNlLCBlVGFza3MpOwotCQkJCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0VGVybWluYXRlVGFza3ModHJ1ZSwgZVRhc2tzKTsKLQkJCQkJZXZlbnRMaXN0LmFkZChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0Rlc3Ryb3llZEV2ZW50KAotCQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXhpdEluZm8oc2Vzc2lvbiwgZVRhc2tzLCAxKSkpOwotCQkJCQlpZiAoc2Vzc2lvbi5nZXRUYXNrTWFuYWdlcigpLmlzQWxsVGVybWluYXRlZChzZXNzaW9uLmdldFRhc2tzKCkpKSB7Ci0JCQkJCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGlzY29ubmVjdGVkRXZlbnQoc2Vzc2lvbiwgc2Vzc2lvbi5nZXRUYXNrcygpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElQRElTdGFydERlYnVnZ2VyUmVxdWVzdCkgewotCQkJCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3Q29ubmVjdGVkRXZlbnQoc2Vzc2lvbiwgZVRhc2tzKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJU2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0KSB7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJRGVsZXRlVmFyaWFibGVSZXF1ZXN0KSB7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJQ29tbWFuZFJlcXVlc3QpIHsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQpIHsKLQkJCWlmICghKHJlcXVlc3QgaW5zdGFuY2VvZiBJUERJQnJlYWtwb2ludFJlcXVlc3QpIHx8ICEoKElQRElCcmVha3BvaW50UmVxdWVzdClyZXF1ZXN0KS5pc0FsbG93VXBkYXRlKCkpICB7Ci0JCQkJSVByb3h5RGVidWdCcmVha3BvaW50U2V0RXZlbnQgZSA9IChJUHJveHlEZWJ1Z0JyZWFrcG9pbnRTZXRFdmVudClldmVudDsKLQkJCQlJUERJQnJlYWtwb2ludCBicHQgPSBzZXNzaW9uLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZ2V0QnJlYWtwb2ludChlLmdldEJyZWFrcG9pbnRJZCgpKTsKLQkJCQlpZiAoYnB0ID09IG51bGwpIHsKLQkJCQkJZXZlbnRMaXN0LmFkZChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0Vycm9yRXZlbnQoCi0JCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckluZm8oc2Vzc2lvbiwgZVRhc2tzLCBJUERJRXJyb3JJbmZvLkRCR19OT1JNQUwsICJTZXQgQnJlYWtwb2ludCBFcnJvciIsICJObyBQREkgYnJlYWtwb2ludCBmb3VuZCIpKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3Q3JlYXRlZEV2ZW50KAotCQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3QnJlYWtwb2ludEluZm8oc2Vzc2lvbiwgZVRhc2tzLCBicHQpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdFeGl0RXZlbnQpIHsKLQkJCUlQcm94eURlYnVnRXhpdEV2ZW50IGUgPSAoSVByb3h5RGVidWdFeGl0RXZlbnQpZXZlbnQ7Ci0JCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0UGVuZGluZ1Rhc2tzKGZhbHNlLCBlVGFza3MpOwotCQkJc2Vzc2lvbi5nZXRUYXNrTWFuYWdlcigpLnNldFRlcm1pbmF0ZVRhc2tzKHRydWUsIGVUYXNrcyk7Ci0JCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGVzdHJveWVkRXZlbnQoCi0JCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXhpdEluZm8oc2Vzc2lvbiwgZVRhc2tzLCBlLmdldEV4aXRTdGF0dXMoKSkpKTsKLQkJCWlmIChzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuaXNBbGxUZXJtaW5hdGVkKHNlc3Npb24uZ2V0VGFza3MoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzZXNzaW9uLmV4aXQoKTsKLQkJCQkJZXZlbnRMaXN0LmFkZChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0Rpc2Nvbm5lY3RlZEV2ZW50KHNlc3Npb24sIHNlc3Npb24uZ2V0VGFza3MoKSkpOwotCQkJCX0KLQkJCQljYXRjaCAoUERJRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckV2ZW50KAotCQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JJbmZvKHNlc3Npb24sIGV4LmdldFRhc2tzKCksIElQRElFcnJvckluZm8uREJHX0ZBVEFMLCAiU2h1dGRvd24gZGVidWdnZXIgZXJyb3IiLCBleC5nZXRNZXNzYWdlKCkpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdFcnJvckV2ZW50KSB7Ci0JCQlJUHJveHlEZWJ1Z0Vycm9yRXZlbnQgZSA9IChJUHJveHlEZWJ1Z0Vycm9yRXZlbnQpZXZlbnQ7Ci0JCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJcmVxdWVzdC5lcnJvcihlLmdldEVycm9yTWVzc2FnZSgpKTsKLQkJCX0KLQkJCWludCBhY3Rpb25UeXBlID0gc2Vzc2lvbi5nZXREZWJ1Z2dlcigpLmdldEVycm9yQWN0aW9uKGUuZ2V0RXJyb3JDb2RlKCkpOwotCQkJaWYgKGFjdGlvblR5cGUgPT0gSVBESUVycm9ySW5mby5EQkdfRkFUQUwpIHsKLQkJCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0UGVuZGluZ1Rhc2tzKGZhbHNlLCBlVGFza3MpOwotCQkJCXNlc3Npb24uZ2V0VGFza01hbmFnZXIoKS5zZXRUZXJtaW5hdGVUYXNrcyh0cnVlLCBlVGFza3MpOwotCQkJfQotCQkJZXZlbnRMaXN0LmFkZChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0Vycm9yRXZlbnQoCi0JCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JJbmZvKHNlc3Npb24sIGVUYXNrcywgYWN0aW9uVHlwZSwgIkludGVybmFsIEVycm9yIiwgZS5nZXRFcnJvck1lc3NhZ2UoKSkpKTsKLQkJfQotCQllbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURlYnVnRGF0YUV4cFZhbHVlRXZlbnQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdJbml0RXZlbnQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQpIHsKLQkJCUlQcm94eURlYnVnU2lnbmFsRXhpdEV2ZW50IGUgPSAoSVByb3h5RGVidWdTaWduYWxFeGl0RXZlbnQpZXZlbnQ7Ci0JCQlzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuc2V0UGVuZGluZ1Rhc2tzKGZhbHNlLCBlVGFza3MpOwotCQkJc2Vzc2lvbi5nZXRUYXNrTWFuYWdlcigpLnNldFRlcm1pbmF0ZVRhc2tzKHRydWUsIGVUYXNrcyk7Ci0JCQlldmVudExpc3QuYWRkKHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGVzdHJveWVkRXZlbnQoCi0JCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3U2lnbmFsSW5mbyhzZXNzaW9uLCBlVGFza3MsIGUuZ2V0U2lnbmFsTmFtZSgpLCBlLmdldFNpZ25hbE1lYW5pbmcoKSwgbnVsbCwgbnVsbCkpKTsKLQkJCWlmIChzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuaXNBbGxUZXJtaW5hdGVkKHNlc3Npb24uZ2V0VGFza3MoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzZXNzaW9uLmV4aXQoKTsKLQkJCQkJZXZlbnRMaXN0LmFkZChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld0Rpc2Nvbm5lY3RlZEV2ZW50KHNlc3Npb24sIHNlc3Npb24uZ2V0VGFza3MoKSkpOwotCQkJCX0KLQkJCQljYXRjaCAoUERJRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckV2ZW50KAotCQkJCQkJCXNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RXJyb3JJbmZvKHNlc3Npb24sIGV4LmdldFRhc2tzKCksIElQRElFcnJvckluZm8uREJHX0ZBVEFMLCAiU2h1dGRvd24gZGVidWdnZXIgZXJyb3IiLCBleC5nZXRNZXNzYWdlKCkpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQpIHsKLQkJCUlQcm94eURlYnVnQnJlYWtwb2ludEhpdEV2ZW50IGUgPSAoSVByb3h5RGVidWdCcmVha3BvaW50SGl0RXZlbnQpZXZlbnQ7Ci0JCQlJUERJQnJlYWtwb2ludCBicHQgPSBzZXNzaW9uLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuZ2V0QnJlYWtwb2ludChlLmdldEJyZWFrcG9pbnRJZCgpKTsKLQkJCWlmIChicHQgPT0gbnVsbCkgewotCQkJCWV2ZW50TGlzdC5hZGQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckV2ZW50KAotCQkJCQkJc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFcnJvckluZm8oc2Vzc2lvbiwgZVRhc2tzLCBJUERJRXJyb3JJbmZvLkRCR19OT1JNQUwsICJIaXQgQnJlYWtwb2ludCBFcnJvciIsICJObyBQREkgYnJlYWtwb2ludCBmb3VuZCIpKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlldmVudExpc3QuYWRkKGNyZWF0ZVN1c3BlbmRlZEV2ZW50KHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3QnJlYWtwb2ludEluZm8oc2Vzc2lvbiwgZVRhc2tzLCBicHQpLCBlLmdldFRocmVhZElkKCksIDAsIGUuZ2V0RGVwdGgoKSwgZS5nZXRDaGFuZ2VkVmFycygpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1NpZ25hbEV2ZW50KSB7Ci0JCQlJUHJveHlEZWJ1Z1NpZ25hbEV2ZW50IGUgPSAoSVByb3h5RGVidWdTaWduYWxFdmVudClldmVudDsKLQkJCVByb3h5RGVidWdMb2NhdG9yIGxvYyA9IGUuZ2V0RnJhbWUoKS5nZXRMb2NhdG9yKCk7Ci0JCQlJUERJTG9jYXRvciBsb2NhdG9yID0gUERJTG9jYXRpb25GYWN0b3J5Lm5ld0xvY2F0b3IobG9jLmdldEZpbGUoKSwgbG9jLmdldEZ1bmN0aW9uKCksIGxvYy5nZXRMaW5lTnVtYmVyKCksIGxvYy5nZXRBZGRyZXNzKCkpOwotCQkJZXZlbnRMaXN0LmFkZChjcmVhdGVTdXNwZW5kZWRFdmVudChzZXNzaW9uLmdldEV2ZW50RmFjdG9yeSgpLm5ld1NpZ25hbEluZm8oc2Vzc2lvbiwgZVRhc2tzLCBlLmdldFNpZ25hbE5hbWUoKSwgZS5nZXRTaWduYWxNZWFuaW5nKCksIG51bGwsIGxvY2F0b3IpLCBlLmdldFRocmVhZElkKCksIGUuZ2V0RnJhbWUoKS5nZXRMZXZlbCgpLCBlLmdldERlcHRoKCksIGUuZ2V0Q2hhbmdlZFZhcnMoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdTdGVwRXZlbnQpIHsKLQkJCUlQcm94eURlYnVnU3RlcEV2ZW50IGUgPSAoSVByb3h5RGVidWdTdGVwRXZlbnQpZXZlbnQ7Ci0JCQlQcm94eURlYnVnTG9jYXRvciBsb2MgPSBlLmdldEZyYW1lKCkuZ2V0TG9jYXRvcigpOwotCQkJSVBESUxvY2F0b3IgbG9jYXRvciA9IFBESUxvY2F0aW9uRmFjdG9yeS5uZXdMb2NhdG9yKGxvYy5nZXRGaWxlKCksIGxvYy5nZXRGdW5jdGlvbigpLCBsb2MuZ2V0TGluZU51bWJlcigpLCBsb2MuZ2V0QWRkcmVzcygpKTsKLQkJCWV2ZW50TGlzdC5hZGQoY3JlYXRlU3VzcGVuZGVkRXZlbnQoc2Vzc2lvbi5nZXRFdmVudEZhY3RvcnkoKS5uZXdFbmRTdGVwcGluZ1JhbmdlSW5mbyhzZXNzaW9uLCBlVGFza3MsICBsb2NhdG9yKSwgZS5nZXRUaHJlYWRJZCgpLCBlLmdldEZyYW1lKCkuZ2V0TGV2ZWwoKSwgZS5nZXREZXB0aCgpLCBlLmdldENoYW5nZWRWYXJzKCkpKTsKLQkJfQotCQllbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURlYnVnU3VzcGVuZEV2ZW50KSB7Ci0JCQlJUHJveHlEZWJ1Z1N1c3BlbmRFdmVudCBlID0gKElQcm94eURlYnVnU3VzcGVuZEV2ZW50KWV2ZW50OwotCQkJUHJveHlEZWJ1Z0xvY2F0b3IgbG9jID0gZS5nZXRGcmFtZSgpLmdldExvY2F0b3IoKTsKLQkJCUlQRElMb2NhdG9yIGxvY2F0b3IgPSBQRElMb2NhdGlvbkZhY3RvcnkubmV3TG9jYXRvcihsb2MuZ2V0RmlsZSgpLCBsb2MuZ2V0RnVuY3Rpb24oKSwgbG9jLmdldExpbmVOdW1iZXIoKSwgbG9jLmdldEFkZHJlc3MoKSk7Ci0JCQlldmVudExpc3QuYWRkKGNyZWF0ZVN1c3BlbmRlZEV2ZW50KHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3TG9jYXRpb25SZWFjaGVkSW5mbyhzZXNzaW9uLCBlVGFza3MsIGxvY2F0b3IpLCBlLmdldFRocmVhZElkKCksIGUuZ2V0RnJhbWUoKS5nZXRMZXZlbCgpLCBlLmdldERlcHRoKCksIGUuZ2V0Q2hhbmdlZFZhcnMoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdUeXBlRXZlbnQpIHsKLQkJfQotCQllbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURlYnVnVmFyc0V2ZW50KSB7Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z0RhdGFFdmVudCkgeyAvL2J5cGFzcwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdBcmdzRXZlbnQpIHsgLy9ieXBhc3MKLQkJfQotCQllbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURlYnVnSW5mb1RocmVhZHNFdmVudCkgeyAvL2J5cGFzcwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudCkgeyAvL2J5cGFzcwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSVByb3h5RGVidWdTaWduYWxzRXZlbnQpIHsgLy9ieXBhc3MKLQkJfQotCQllbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50KSB7IC8vYnlwYXNzCi0JCX0KLQkJZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1N0YWNrSW5mb0RlcHRoRXZlbnQpIHsgLy9ieXBhc3MKLQkJfQotCQllbHNlIHsKLQkJfQotCQlmaXJlRXZlbnRzKGV2ZW50TGlzdC50b0FycmF5KG5ldyBJUERJRXZlbnRbMF0pKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KElQRElFdmVudFJlcXVlc3QgcmVxdWVzdCwgSVByb3h5RGVidWdFdmVudCByZXN1bHQpIHsKLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJQml0TGlzdCBlVGFza3MgPSBQcm94eURlYnVnQ2xpZW50LmRlY29kZUJpdFNldChyZXN1bHQuZ2V0Qml0U2V0KCkpOwotCQkJaWYgKHJlcXVlc3QuY29tcGxldGVkKGVUYXNrcywgcmVzdWx0KSkgewotCQkJCXJlcXVlc3QuZG9uZSgpOwotCQkJCW5vdGlmeUV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETU1hbmFnZXJGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1NYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ4YmRhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuQWJzdHJhY3RNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubWFuYWdlci5JUERJRXZlbnRNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTRE1NYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TWFuYWdlckZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1hbmFnZXIuSVBESU1hbmFnZXJGYWN0b3J5I25ld0V2ZW50TWFuYWdlcihvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24pCi0JICovCi0JcHVibGljIElQRElFdmVudE1hbmFnZXIgbmV3RXZlbnRNYW5hZ2VyKElQRElTZXNzaW9uIHNlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBTRE1FdmVudE1hbmFnZXIoc2Vzc2lvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNTW9kZWxGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1Nb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzNWVhMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5BYnN0cmFjdE1vZGVsRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgU0RNTW9kZWxGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbEZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTliZmMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIFBUUCBkZWJ1ZyBwbHVnLWluLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNETVByZWZlcmVuY2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFNETURlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBMb2NhdGlvbiBvZiB0aGUgc2RtCi0JICovCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRE1fREVCVUdHRVJfRklMRSA9IFBMVUdJTl9JRCArICIuZGVidWdnZXJfZmlsZSI7Ci0JCi0JLyoqCi0JICogRXh0cmEgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNkbSAoZS5nLiBkZWJ1Z2dpbmcgZmxhZ3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RNX0RFQlVHR0VSX0FSR1MgPSBQTFVHSU5fSUQgKyAiLmRlYnVnZ2VyX2FyZ3MiOwotCi0JLyoqCi0JICogSG9zdCBmb3IgdGhlIHNkbSBjbGllbnQKLQkgKi8KLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNETV9ERUJVR0dFUl9IT1NUID0gUExVR0lOX0lEICsgIi5kZWJ1Z2dlcl9ob3N0IjsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNETV9ERUZBVUxUX0RFVUJHR0VSX0hPU1QgPSAibG9jYWxob3N0IjsKLQotCS8qKgotCSAqIERlYnVnZ2VyIGJhY2tlbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRE1fREVCVUdHRVJfQkFDS0VORF9UWVBFID0gUExVR0lOX0lEICsgIi5kZWJ1Z2dlcl9iYWNrZW5kIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRE1fREVGQVVMVF9ERURVR0dFUl9CQUNLRU5EX0lOREVYID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNETV9ERUJVR0dFUl9CQUNLRU5EUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJnZGItbWkiCi0JfTsKLQkKLQkvKioKLQkgKiBQYXRoIHRvIGJhY2tlbmQgZGVidWdnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRE1fREVCVUdHRVJfQkFDS0VORF9QQVRIID0gUExVR0lOX0lEICsgIi5kZWJ1Z2dlcl9iYWNrZW5kX3BhdGgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNETV9ERUZBVUxUX0RFRFVHR0VSX0JBQ0tFTkRfUEFUSCA9ICIiOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNUmVxdWVzdEZhY3RvcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL1NETVJlcXVlc3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYWU5MjAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNUmVxdWVzdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0UmVxdWVzdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElEYXRhUmVhZE1lbW9yeVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldEFJRlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJR2V0UGFydGlhbEFJRlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJTGlzdEFyZ3VtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUxpc3RTaWduYWxzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJTGlzdFN0YWNrRnJhbWVzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJU2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdC5TRE1EYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3QuU0RNRGF0YVJlYWRNZW1vcnlSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdC5TRE1HZXRBSUZSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdC5TRE1HZXRJbmZvVGhyZWFkc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0LlNETUdldFBhcnRpYWxBSUZSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdC5TRE1HZXRTdGFja0luZm9EZXB0aFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0LlNETUxpc3RBcmd1bWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdC5TRE1MaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdC5TRE1MaXN0U2lnbmFsc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0LlNETUxpc3RTdGFja0ZyYW1lc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0LlNETVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3QuU0RNU2V0VGhyZWFkU2VsZWN0UmVxdWVzdDsKLQotCi1wdWJsaWMgY2xhc3MgU0RNUmVxdWVzdEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0QUlGUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElHZXRBSUZSZXF1ZXN0IGdldEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIpIHsKLQkJcmV0dXJuIG5ldyBTRE1HZXRBSUZSZXF1ZXN0KHRhc2tzLCBleHByKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0RGF0YUV2YWx1YXRlRXhwcmVzaW9uUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElEYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdCBnZXREYXRhRXZhbHVhdGVFeHByZXNpb25SZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB7Ci0JCXJldHVybiBuZXcgU0RNRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QodGFza3MsIGV4cHIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXREYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElEYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdCBnZXREYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdCgKLQkJCUJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB7Ci0JCXJldHVybiBuZXcgU0RNRGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3QodGFza3MsIGV4cHIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXREYXRhUmVhZE1lbW9yeVJlcXVlc3Qob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGxvbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgamF2YS5sYW5nLkNoYXJhY3RlcikKLQkgKi8KLQlwdWJsaWMgSVBESURhdGFSZWFkTWVtb3J5UmVxdWVzdCBnZXREYXRhUmVhZE1lbW9yeVJlcXVlc3QoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywKLQkJCWxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgaW50IHdvcmRGb3JtYXQsIGludCB3b3JkU2l6ZSwKLQkJCWludCByb3dzLCBpbnQgY29scywgQ2hhcmFjdGVyIGFzQ2hhcikgewotCQlyZXR1cm4gbmV3IFNETURhdGFSZWFkTWVtb3J5UmVxdWVzdChzZXNzaW9uLCB0YXNrcywgb2Zmc2V0LCBhZGRyZXNzLCB3b3JkRm9ybWF0LCB3b3JkU2l6ZSwgcm93cywgY29scywgYXNDaGFyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0R2V0SW5mb1RocmVhZHNSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESUdldEluZm9UaHJlYWRzUmVxdWVzdCBnZXRHZXRJbmZvVGhyZWFkc1JlcXVlc3QoQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gbmV3IFNETUdldEluZm9UaHJlYWRzUmVxdWVzdCh0YXNrcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRHZXRQYXJ0aWFsQUlGUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQRElHZXRQYXJ0aWFsQUlGUmVxdWVzdCBnZXRHZXRQYXJ0aWFsQUlGUmVxdWVzdChCaXRMaXN0IHRhc2tzLAotCQkJU3RyaW5nIGV4cHIsIFN0cmluZyB2YXJpZCkgewotCQlyZXR1cm4gbmV3IFNETUdldFBhcnRpYWxBSUZSZXF1ZXN0KHRhc2tzLCBleHByLCB2YXJpZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5I2dldEdldFBhcnRpYWxBSUZSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVBESUdldFBhcnRpYWxBSUZSZXF1ZXN0IGdldEdldFBhcnRpYWxBSUZSZXF1ZXN0KEJpdExpc3QgdGFza3MsCi0JCQlTdHJpbmcgZXhwciwgU3RyaW5nIHZhcmlkLCBib29sZWFuIGxpc3RDaGlsZHJlbikgewotCQlyZXR1cm4gbmV3IFNETUdldFBhcnRpYWxBSUZSZXF1ZXN0KHRhc2tzLCBleHByLCB2YXJpZCwgbGlzdENoaWxkcmVuKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0R2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdCBnZXRHZXRTdGFja0luZm9EZXB0aFJlcXVlc3QoCi0JCQlCaXRMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiBuZXcgU0RNR2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0KHRhc2tzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0TGlzdEFyZ3VtZW50c1JlcXVlc3Qob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUxpc3RBcmd1bWVudHNSZXF1ZXN0IGdldExpc3RBcmd1bWVudHNSZXF1ZXN0KEJpdExpc3QgdGFza3MsIGludCBkaWZmLCBpbnQgZGlmZjIpIHsKLQkJcmV0dXJuIG5ldyBTRE1MaXN0QXJndW1lbnRzUmVxdWVzdCh0YXNrcywgZGlmZiwgZGlmZjIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESUxpc3RMb2NhbFZhcmlhYmxlc1JlcXVlc3QgZ2V0TGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdCgKLQkJCUJpdExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIG5ldyBTRE1MaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0KHRhc2tzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0TGlzdFNpZ25hbHNSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUERJTGlzdFNpZ25hbHNSZXF1ZXN0IGdldExpc3RTaWduYWxzUmVxdWVzdChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmV3IFNETUxpc3RTaWduYWxzUmVxdWVzdChzZXNzaW9uLCB0YXNrcywgbmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5I2dldExpc3RTdGFja0ZyYW1lc1JlcXVlc3Qob3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0IGdldExpc3RTdGFja0ZyYW1lc1JlcXVlc3QoSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcykgewotCQlyZXR1cm4gbmV3IFNETUxpc3RTdGFja0ZyYW1lc1JlcXVlc3Qoc2Vzc2lvbiwgdGFza3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LklQRElSZXF1ZXN0RmFjdG9yeSNnZXRMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QgZ2V0TGlzdFN0YWNrRnJhbWVzUmVxdWVzdChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgbG93LCBpbnQgaGlnaCkgewotCQlyZXR1cm4gbmV3IFNETUxpc3RTdGFja0ZyYW1lc1JlcXVlc3Qoc2Vzc2lvbiwgdGFza3MsIGxvdywgaGlnaCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVJlcXVlc3RGYWN0b3J5I2dldFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSVBESVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdCBnZXRTZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3QoCi0JCQlCaXRMaXN0IHRhc2tzLCBpbnQgbGV2ZWwpIHsKLQkJcmV0dXJuIG5ldyBTRE1TZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3QodGFza3MsIGxldmVsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJUmVxdWVzdEZhY3RvcnkjZ2V0U2V0VGhyZWFkU2VsZWN0UmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBJUERJU2V0VGhyZWFkU2VsZWN0UmVxdWVzdCBnZXRTZXRUaHJlYWRTZWxlY3RSZXF1ZXN0KAotCQkJSVBESVNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcywgaW50IGlkKSB7Ci0JCXJldHVybiBuZXcgU0RNU2V0VGhyZWFkU2VsZWN0UmVxdWVzdChzZXNzaW9uLCB0YXNrcywgaWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvU0RNUnVubmVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1SdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2NjYyZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9TRE1SdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5QVFBSZW1vdGVDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTRE1SdW5uZXIgZXh0ZW5kcyBKb2IgewotCXB1YmxpYyBlbnVtIFNETU1hc3RlclN0YXRlIHtVTktOT1dOLCBTVEFSVElORywgUlVOTklORywgRklOSVNIRUQsIEVSUk9SfTsKLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbW1hbmQ7Ci0JcHJpdmF0ZSBTdHJpbmcgd29ya0RpcjsKLQlwcml2YXRlIFNETU1hc3RlclN0YXRlIHNkbVN0YXRlID0gU0RNTWFzdGVyU3RhdGUuU1RBUlRJTkc7Ci0KLQlwcml2YXRlIElQSm9iIGlwSm9iID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJtQ29udHJvbCA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVtb3RlUHJvY2VzcyBzZG1Qcm9jZXNzOwotCi0JcHVibGljIFNETVJ1bm5lcihJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybUNvbnRyb2wpIHsKLQkJc3VwZXIoIk1hc3RlciBTRE0gY29udHJvbCIpOwotCQl0aGlzLnNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJdGhpcy5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCXRoaXMuc2V0U3lzdGVtKGZhbHNlKTsKLQkJdGhpcy5ybUNvbnRyb2wgPSBybUNvbnRyb2w7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HX01PUkUsICJDcmVhdGVkIHNkbSBtYXN0ZXIgcnVubmVyLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbWFuZChMaXN0PFN0cmluZz4gY29tbWFuZCkgewotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lOR19NT1JFLCAic2RtIG1hc3RlcjogY29tbWFuZDogezB9IiwgY29tbWFuZC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdvcmtEaXIoU3RyaW5nIHdvcmtEaXIpIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5TRE1fTUFTVEVSX1RSQUNJTkdfTU9SRSwgInNkbSBtYXN0ZXI6IHdvcmtkaXI6IHswfSIsIHdvcmtEaXIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMud29ya0RpciA9IHdvcmtEaXI7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTRE1NYXN0ZXJTdGF0ZSBnZXRTZG1TdGF0ZSgpIHsKLQkJcmV0dXJuIHNkbVN0YXRlOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZG1TdGF0ZShTRE1NYXN0ZXJTdGF0ZSBzZG1TdGF0ZSkgewotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lOR19NT1JFLCAic2RtIG1hc3RlcjogY2hhbmdlZCBzdGF0ZSB0byB7MH0iLCBzZG1TdGF0ZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNkbVN0YXRlID0gc2RtU3RhdGU7Ci0JCXRoaXMubm90aWZ5QWxsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Sm9iKElQSm9iIGlwSm9iKSB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HX01PUkUsICJzZG0gbWFzdGVyOiBhc3NvY2lhdGVkIHRvIGpvYiAjezB9IiwgaXBKb2IuZ2V0SUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5pcEpvYiA9IGlwSm9iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJYXNzZXJ0IHdvcmtEaXIgIT0gbnVsbDsKLQkJYXNzZXJ0IGNvbW1hbmQgIT0gbnVsbDsKLQkJYXNzZXJ0IHNkbVByb2Nlc3MgPT0gbnVsbDsKLQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lORywgInNkbSBtYXN0ZXI6IHRocmVhZCBzdGFydGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIENhdGNoIGFsbCB0cnkuLi5jYXRjaAotCQkgKi8KLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkvKgotCQkJICogUHJlcGFyZSByZW1vdGUgY29ubmVjdGlvbi4KLQkJCSAqLwotCQkJQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBybUNvbnRyb2wuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMoY29uZmlndXJhdGlvbi5nZXRSZW1vdGVTZXJ2aWNlc0lkKCkpOwotCQkJSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gcmVtb3RlU2VydmljZXMuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKTsKLQkJCUlSZW1vdGVDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uTWFuYWdlci5nZXRDb25uZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCQlJUmVtb3RlRmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSByZW1vdGVTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcihjb25uZWN0aW9uKTsKLQotCQkJSUZpbGVTdG9yZSBkaXJlY3RvcnkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlkaXJlY3RvcnkgPSBmaWxlTWFuYWdlci5nZXRSZXNvdXJjZShuZXcgUGF0aCh3b3JrRGlyKSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAiRmFpbGVkIHRvIGRldGVybWluZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgbWFzdGVyIFNETS4iLCBlKSk7Ci0JCQl9Ci0JCQlJUmVtb3RlUHJvY2Vzc0J1aWxkZXIgc2RtUHJvY2Vzc0J1aWxkZXIgPSByZW1vdGVTZXJ2aWNlcy5nZXRQcm9jZXNzQnVpbGRlcihjb25uZWN0aW9uLCBjb21tYW5kKTsKLQkJCXNkbVByb2Nlc3NCdWlsZGVyLmRpcmVjdG9yeShkaXJlY3RvcnkpOwotCi0JCQkvKgotCQkJICogV2FpdCBzb21lIHRpbWUgdG8gYXNzdXJlIHRoYXQgU0RNIHNlcnZlcnMgYW5kIGZyb250IGVuZCBoYXZlIHN0YXJ0ZWQuCi0JCQkgKi8KLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HLCAic2RtIG1hc3Rlcjogd2FpdGluZyBmb3IgU0RNIHNlcnZlcnMgYW5kIGZyb250IGVuZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCXdhaXQoMzAwMCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBDcmVhdGUgcHJvY2Vzcy4KLQkJCSAqLwotCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5TRE1fTUFTVEVSX1RSQUNJTkcsICJzZG0gbWFzdGVyOiBjcmVhdGUgcHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJc2RtUHJvY2VzcyA9IHNkbVByb2Nlc3NCdWlsZGVyLnN0YXJ0KCk7Ci0JCQl9Ci0JCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBlcnJfcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzZG1Qcm9jZXNzLmdldEVycm9yU3RyZWFtKCkpKTsKLQkJCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIG91dF9yZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNkbVByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpOwotCi0JCQlpZiAoRGVidWdVdGlsLlNETV9NQVNURVJfT1VUUFVUX1RSQUNJTkcpIHsKLQkJCQluZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgb3V0cHV0OwotCQkJCQkJCXdoaWxlICgob3V0cHV0ID0gb3V0X3JlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2RtIG1hc3RlcjogIiArIG91dHB1dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gSWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9LCAic2RtIG1hc3RlciBzdGFuZGFyZCBvdXRwdXQgdGhyZWFkIikuc3RhcnQoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoRGVidWdVdGlsLlNETV9NQVNURVJfT1VUUFVUX1RSQUNJTkcpIHsKLQkJCQluZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgbGluZTsKLQkJCQkJCQl3aGlsZSAoKGxpbmUgPSBlcnJfcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJzZG0gbWFzdGVyOiAiICsgbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gSWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9LCAic2RtIG1hc3RlciBlcnJvciBvdXRwdXQgdGhyZWFkIikuc3RhcnQoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0KLQkJCS8qCi0JCQkgKiBXYWl0IHdoaWxlIHJ1bm5pbmcgYnV0IG5vdCBjYW5jZWxlZC4KLQkJCSAqLwotCQkJc2V0U2RtU3RhdGUoU0RNTWFzdGVyU3RhdGUuUlVOTklORyk7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lOR19NT1JFLCAic2RtIG1hc3Rlcjogd2FpdGluZyB0byBmaW5pc2guIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICghIHNkbVByb2Nlc3MuaXNDb21wbGV0ZWQoKSkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQl3YWl0KDUwMCk7Ci0JCQkJfQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBDaGVjayBpZiBwcm9jZXNzIHRlcm1pbmF0ZWQgc3VjY2Vzc2Z1bGx5IChpZiBub3QgY2FuY2VsZWQpLgotCQkJICovCi0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lORywgInNkbSBtYXN0ZXI6IGV4aXQgdmFsdWUgezB9LiIsIHNkbVByb2Nlc3MuZXhpdFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2RtUHJvY2Vzcy5leGl0VmFsdWUoKSAhPSAwKSB7Ci0JCQkJaWYgKCEgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTRE1EZWJ1Z0NvcmVQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBOTFMuYmluZCgic2RtIG1hc3RlciBwcm9jZXNzIGZpbmlzaGVkIHdpdGggZXhpdCBjb2RlIHswfS4iLCBzZG1Qcm9jZXNzLmV4aXRWYWx1ZSgpKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HLCAic2RtIG1hc3RlcjogaWdub3JpbmcgZXhpdCBjb2RlIHNpbmNlIHJlcXVlc3RlZCB0byB0ZXJtaW5hdGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXRTZG1TdGF0ZShTRE1NYXN0ZXJTdGF0ZS5GSU5JU0hFRCk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8qCi0JCQkgKiBUZXJtaW5hdGUgdGhlIGpvYiwgaGFuZGxpbmcgdGhlIGVycm9yLgotCQkJICogQWxzbyB0ZXJtaW5hdGVzIHRoZSBpcGpvYiBzaW5jZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHRoZSBpcGpvYiBydW5uaW5nIHdpdGhvdXQgZGVidWdnZXIuCi0JCQkgKi8KLQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HLCAic2RtIG1hc3RlcjogZXhjZXB0aW9uOiB7MH0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0U2RtU3RhdGUoU0RNTWFzdGVyU3RhdGUuRVJST1IpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJRGVidWdVdGlsLmVycm9yKERlYnVnVXRpbC5TRE1fTUFTVEVSX1RSQUNJTkcsICJzZG0gbWFzdGVyOiBkZXN0cm95IHByb2Nlc3MiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNkbVByb2Nlc3MuZGVzdHJveSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lORywgInNkbSBtYXN0ZXI6IHJlcXVlc3Qgam9iIHswfSB0byB0ZXJtaW5hdGUuIiwgaXBKb2IuZ2V0SUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlybUNvbnRyb2wudGVybWluYXRlSm9iKGlwSm9iKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQlQVFBEZWJ1Z0NvcmVQbHVnaW4ubG9nKGUxKTsKLQkJCX0KLQkJCWlmIChlIGluc3RhbmNlb2YgSW50ZXJydXB0ZWRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJcmV0dXJuICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNETURlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksICJGYWlsZWQgdG8gbGF1bmNoIHNkbSBtYXN0ZXIgcHJvY2Vzcy4iLCBlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuU0RNX01BU1RFUl9UUkFDSU5HLCAic2RtIG1hc3RlcjogdGhyZWFkIGZpbmlzaGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlzZG1Qcm9jZXNzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbGluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoc2RtUHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJc2RtUHJvY2Vzcy5kZXN0cm95KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvSVNETUVycm9yQ29kZXMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9JU0RNRXJyb3JDb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmYwY2VjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9JU0RNRXJyb3JDb2Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGk7Ci0KLS8qKgotICogRXJyb3IgY29kZXMgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBTRE0gcHJveHkuIFRoZXNlCi0gKiBhcmUgbWFwcGVkIG9udG8gaW50ZXJuYWwgZXJyb3IgY29kZXMuCi0gKiAKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFcnJvckluZm8KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTRE1FcnJvckNvZGVzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfTk9USU1QCQkJPQkxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9QUk9YWV9URVJNCQk9CTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1BST1hZX1BST1RPCQk9CTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX0RFQlVHR0VSCQkJPQk0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9OT0JBQ0tFTkQJCT0JNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfSU5QUk9HUkVTUwkJPQk2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9DQkNSRUFURQkJCT0JNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfTk9TRVNTSU9OCQk9CTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1NFU1NJT04JCQk9CTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PTElORQkJCT0JMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PRlVOQwkJCT0JMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PRklMRQkJCT0JMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PQlAJCQkJPQkxMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfTk9TWU0JCQk9CTE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9OT01FTQkJCT0JMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX0NBTlRSVU4JCQk9CTE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9JTlZPS0UJCQk9CTE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9JU1JVTk5JTkcJCT0JMTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PVFJVTgkJCT0JMTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX0ZJUlNURlJBTUUJCT0JMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX0xBU1RGUkFNRQkJPQkyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfQkFEQlBBUkcJCQk9CTIyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9SRUdFWAkJCT0JMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PU1RBQ0sJCQk9CTI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9PVVRPRlJBTkdFCQk9CTI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9OT0ZJTEVESVIJCT0JMjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PU1lNUwkJCT0JMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1RFTVAJCQkJPQkyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfUElQRQkJCQk9CTI5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9GT1JLCQkJCT0JMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1NZU1RFTQkJCT0JMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX05PVEVYRUMJCQk9CTMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9DSERJUgkJCT0JMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1NPVVJDRQkJCT0JMzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1NFVFZBUgkJCT0JMzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREJHRVJSX1BST0NTRVQJCQk9CTM2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9VTktOT1dOCQkJPQkzNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQkdFUlJfVU5LTk9XTl9UWVBFCQk9CTM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCR0VSUl9VTktOT1dOX1ZBUklBQkxFCT0JMzk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvUERJRGVidWdnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9QRElEZWJ1Z2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDY2NDk2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9QRElEZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuT2JzZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFVuaXZlcnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5SZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5FeHRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElDb25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElFcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElBZGRyZXNzQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4Y2VwdGlvbnBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucHJveHkuUHJveHlEZWJ1Z0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZXZlbnQuSVByb3h5RXh0ZW5kZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb3h5T3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5QVFBSZW1vdGVDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUERJRGVidWdnZXIgZXh0ZW5kcyBQcm94eURlYnVnQ2xpZW50IGltcGxlbWVudHMgSVBESURlYnVnZ2VyIHsKLQlwcml2YXRlIGNsYXNzIFByb3h5Tm90aWZpZXIgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKLQkJLyoqCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5KElQcm94eURlYnVnRXZlbnQgZXZlbnQpIHsKLQkJCXNldENoYW5nZWQoKTsKLQkJCW5vdGlmeU9ic2VydmVycyhldmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgYnBpZCA9IDA7Ci0JcHJpdmF0ZSBQcm94eU5vdGlmaWVyIHByb3h5Tm90aWZpZXIgPSBuZXcgUHJveHlOb3RpZmllcigpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlciNjb21tYW5kUmVxdWVzdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY29tbWFuZFJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGNvbW1hbmQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdDTElIYW5kbGUodGFza3MsIGNvbW1hbmQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsICJFcnJvciBvbiBzZW5kaW5nIGdlbmVyaWMgY29tbWFuZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElNZW1vcnlCbG9ja01hbmFnZW1lbnQjY3JlYXRlRGF0YVJlYWRNZW1vcnkob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBsb25nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGphdmEubGFuZy5DaGFyYWN0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGF0YVJlYWRNZW1vcnkoQml0TGlzdCB0YXNrcywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCBpbnQgd29yZEZvcm1hdCwgaW50IHdvcmRTaXplLCBpbnQgcm93cywgaW50IGNvbHMsCi0JCQlDaGFyYWN0ZXIgYXNDaGFyKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldERhdGFSZWFkTWVtb3J5Q29tbWFuZCh0YXNrcywgb2Zmc2V0LCBhZGRyZXNzLCBnZXRGb3JtYXQod29yZEZvcm1hdCksIHdvcmRTaXplLCByb3dzLCBjb2xzLCBhc0NoYXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gc2V0dGluZyBkYXRhIHJlYWQgbWVtb3J5OiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESU1lbW9yeUJsb2NrTWFuYWdlbWVudCNjcmVhdGVEYXRhV3JpdGVNZW1vcnkob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBsb25nLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVEYXRhV3JpdGVNZW1vcnkoQml0TGlzdCB0YXNrcywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCBpbnQgd29yZEZvcm1hdCwgaW50IHdvcmRTaXplLCBTdHJpbmcgdmFsdWUpCi0JCQl0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldERhdGFXcml0ZU1lbW9yeUNvbW1hbmQodGFza3MsIG9mZnNldCwgYWRkcmVzcywgZ2V0Rm9ybWF0KHdvcmRGb3JtYXQpLCB3b3JkU2l6ZSwgdmFsdWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gc2V0dGluZyBkYXRhIHdyaXRlIG1lbW9yeTogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElWYXJpYWJsZU1hbmFnZW1lbnQjZGF0YUV2YWx1YXRlRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGF0YUV2YWx1YXRlRXhwcmVzc2lvbihCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXhwcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z0RhdGFFdmFsdWF0ZUV4cHJlc3Npb24odGFza3MsIGV4cHIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gZXZhbHVhdGluZyBkYXRhIGV4cHJlc3Npb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQnJlYWtwb2ludE1hbmFnZW1lbnQjZGVsZXRlQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVCcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCBicGlkKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnRGVsZXRlQnJlYWtwb2ludCh0YXNrcywgYnBpZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBkZWxldGluZyBicmVha3BvaW50OiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVZhcmlhYmxlTWFuYWdlbWVudCNkZWxldGVWYXJpYWJsZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlVmFyaWFibGUoQml0TGlzdCB0YXNrcywgU3RyaW5nIHZhcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1ZhcmlhYmxlRGVsZXRlKHRhc2tzLCB2YXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gZGVsZXRpbmcgdmFyaWFibGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIjZGlzY29ubmVjdChqYXZhLnV0aWwuT2JzZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChPYnNlcnZlciBvYnNlcnZlcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXN0b3BEZWJ1Z2dlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJVmFyaWFibGVNYW5hZ2VtZW50I2V2YWx1YXRlRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZXZhbHVhdGVFeHByZXNzaW9uKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnRXZhbHVhdGVFeHByZXNzaW9uKHRhc2tzLCBleHByKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIGV2YWx1YXRpbmcgZXhwcmVzc2lvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlciNpbml0aWFsaXplKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgTGlzdDxTdHJpbmc+IGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCWludCBwb3J0ID0gMDsKLQkJCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHBvcnQgc3BlY2lmaWVkLCB1c2UgaXQgaWYgcG9zc2libGUuCi0JCSAqLwotCQlmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7Ci0JCQlpZiAoYXJnLnN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZy5zdWJzdHJpbmcoNywgYXJnLmxlbmd0aCgpKSk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlkb0luaXRpYWxpemUocG9ydCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24obnVsbCwgIkVycm9yIG9uIGdldHRpbmcgcHJveHkgcG9ydCBudW1iZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChybSAhPSBudWxsKSB7Ci0JCQlwb3J0ID0gZ2V0U2Vzc2lvblBvcnQoKTsKLQkJCUlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmYgPSBybS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZiBpbnN0YW5jZW9mIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgewotCQkJCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiByZW1Db25mID0gKEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiljb25mOwotCQkJCWlmIChyZW1Db25mLnRlc3RPcHRpb24oSVJlbW90ZVByb3h5T3B0aW9ucy5QT1JUX0ZPUldBUkRJTkcpKSB7Ci0JCQkJCUlSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKHJlbUNvbmYuZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJCQkJaWYgKHJlbW90ZVNlcnZpY2VzICE9IG51bGwpIHsKLQkJCQkJCUlSZW1vdGVDb25uZWN0aW9uTWFuYWdlciBjb25uTWdyID0gcmVtb3RlU2VydmljZXMuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKTsKLQkJCQkJCWlmIChjb25uTWdyICE9IG51bGwpIHsKLQkJCQkJCQlJUmVtb3RlQ29ubmVjdGlvbiBjb25uID0gY29ubk1nci5nZXRDb25uZWN0aW9uKHJlbUNvbmYuZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCQkJCQkJaWYgKGNvbm4gIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJLyoKLQkJCQkJCQkJCSAqIEJpbmQgcmVtb3RlIHBvcnQgdG8gYWxsIGludGVyZmFjZXMuIFRoaXMgYWxsb3dzIHRoZSBzZG0gbWFzdGVyCi0JCQkJCQkJCQkgKiBwcm9jZXNzIHJ1bm5pbmcgb24gYSBjbHVzdGVyIG5vZGUgdG8gdXNlIHRoZSB0dW5uZWwuIAotCQkJCQkJCQkJICogCi0JCQkJCQkJCQkgKiBGSVhNRTogU2luY2UgdGhpcyByZXF1aXJlcyBhIHNwZWNpYWwgb3B0aW9uIHRvIGJlIGVuYWJsZWQgaW4gc3NoZAotCQkJCQkJCQkJICogb24gdGhlIGhlYWQgbm9kZSAoR2F0ZXdheVBvcnRzKSwgSSdkIGxpa2UgdGhpcyB0byBnbyB3YXkuCi0JCQkJCQkJCQkgKi8KLQkJCQkJCQkJCXBvcnQgPSBjb25uLmZvcndhcmRSZW1vdGVQb3J0KCIiLCBnZXRTZXNzaW9uUG9ydCgpLCBtb25pdG9yKTsKLQkJCQkJCQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24obnVsbCwgIkVycm9yIGdldHRpbmcgY29ubmVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsICJFcnJvciBnZXR0aW5nIGNvbm5lY3Rpb24gbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsICJFcnJvciBnZXR0aW5nIHJlbW90ZSBzZXJ2aWNlcyBmb3IgY29ubmVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlhcmdzLmFkZCgiLS1wb3J0PSIgKyBwb3J0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihudWxsLCAiRXJyb3IgZ2V0dGluZyByZXNvdXJjZSBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCByZXNvdXJjZSBtYW5hZ2VyIGZyb20gYSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgZ2V0UmVzb3VyY2VNYW5hZ2VyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBQRElFeGNlcHRpb24gewotCQlJUFVuaXZlcnNlIHVuaXZlcnNlID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKTsKLQkJSVJlc291cmNlTWFuYWdlcltdIHJtcyA9IHVuaXZlcnNlLmdldFJlc291cmNlTWFuYWdlcnMoKTsKLQkJU3RyaW5nIHJtVW5pcXVlTmFtZTsKLQkJdHJ5IHsKLQkJCXJtVW5pcXVlTmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUkVTT1VSQ0VfTUFOQUdFUl9VTklRVUVOQU1FLCAoU3RyaW5nKW51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24obnVsbCwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZvciAoSVJlc291cmNlTWFuYWdlciBybSA6IHJtcykgewotCQkJaWYgKHJtLmdldFN0YXRlKCkgPT0gUmVzb3VyY2VNYW5hZ2VyQXR0cmlidXRlcy5TdGF0ZS5TVEFSVEVEICYmCi0JCQkJCXJtLmdldFVuaXF1ZU5hbWUoKS5lcXVhbHMocm1VbmlxdWVOYW1lKSkgewotCQkJCXJldHVybiAoSVJlc291cmNlTWFuYWdlckNvbnRyb2wpcm07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIjZ2V0RXJyb3JBY3Rpb24oaW50KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JBY3Rpb24oaW50IGVycm9yQ29kZSkgewotCQlzd2l0Y2ggKGVycm9yQ29kZSkgewotCQljYXNlIElTRE1FcnJvckNvZGVzLkRCR0VSUl9OT0JBQ0tFTkQ6Ci0JCWNhc2UgSVNETUVycm9yQ29kZXMuREJHRVJSX0RFQlVHR0VSOgotCQljYXNlIElTRE1FcnJvckNvZGVzLkRCR0VSUl9OT0ZJTEVESVI6Ci0JCWNhc2UgSVNETUVycm9yQ29kZXMuREJHRVJSX0NIRElSOgotCQkJcmV0dXJuIElQRElFcnJvckluZm8uREJHX0ZBVEFMOwotCQkJLy8gY2FzZSBJU0RNRXJyb3JDb2Rlcy5EQkdFUlJfSU5QUk9HUkVTUzoKLQkJY2FzZSBJU0RNRXJyb3JDb2Rlcy5EQkdFUlJfVU5LTk9XTl9UWVBFOgotCQljYXNlIElTRE1FcnJvckNvZGVzLkRCR0VSUl9OT0ZJTEU6Ci0JCWNhc2UgSVNETUVycm9yQ29kZXMuREJHRVJSX05PQlA6Ci0JCQlyZXR1cm4gSVBESUVycm9ySW5mby5EQkdfTk9STUFMOwotCQljYXNlIElTRE1FcnJvckNvZGVzLkRCR0VSUl9VTktOT1dOX1ZBUklBQkxFOgotCQkJcmV0dXJuIElQRElFcnJvckluZm8uREJHX0lHTk9SRTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBJUERJRXJyb3JJbmZvLkRCR19XQVJOSU5HOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5BYnN0cmFjdFByb3h5RGVidWdDbGllbnQjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLnByb3h5LmV2ZW50LklQcm94eUV4dGVuZGVkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVByb3h5RXh0ZW5kZWRFdmVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSVByb3h5RGVidWdFdmVudCkgewotCQkJcHJveHlOb3RpZmllci5ub3RpZnkoKElQcm94eURlYnVnRXZlbnQpIGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlciNpc0Nvbm5lY3RlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHdhaXRDb25uZWN0KG1vbml0b3IpKSB7Ci0JCQkJc2Vzc2lvbkhhbmRsZUV2ZW50cygpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZGlzY29ubmVjdChudWxsKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZGlzY29ubmVjdChudWxsKTsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24obnVsbCwgIkVycm9yIG9uIGNvbm5lY3RpbmcgcHJveHk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJVmFyaWFibGVNYW5hZ2VtZW50I2xpc3RBcmd1bWVudHMob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaXN0QXJndW1lbnRzKEJpdExpc3QgdGFza3MsIGludCBsb3csIGludCBoaWdoKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnTGlzdEFyZ3VtZW50cyh0YXNrcywgbG93LCBoaWdoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIGxpc3RpbmcgYXJndW1lbnRzOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVZhcmlhYmxlTWFuYWdlbWVudCNsaXN0R2xvYmFsVmFyaWFibGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaXN0R2xvYmFsVmFyaWFibGVzKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdMaXN0R2xvYmFsVmFyaWFibGVzKHRhc2tzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIGxpc3RpbmcgZ2xvYmFsIHZhcmlhYmxlczogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElUaHJlYWRNYW5hZ2VtZW50I2xpc3RJbmZvVGhyZWFkcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgbGlzdEluZm9UaHJlYWRzKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdMaXN0SW5mb1RocmVhZHModGFza3MpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gbGlzdGluZyB0aHJlYWQgaW5mbzogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElWYXJpYWJsZU1hbmFnZW1lbnQjbGlzdExvY2FsVmFyaWFibGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaXN0TG9jYWxWYXJpYWJsZXMoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z0xpc3RMb2NhbFZhcmlhYmxlcyh0YXNrcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBsaXN0aW5nIGxvY2FsIHZhcmlhYmxlczogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTaWduYWxNYW5hZ2VtZW50I2xpc3RTaWduYWxzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaXN0U2lnbmFscyhCaXRMaXN0IHRhc2tzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z0xpc3RTaWduYWxzKHRhc2tzLCBuYW1lKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIGxpc3Rpbmcgc2lnbmFsOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVN0YWNrZnJhbWVNYW5hZ2VtZW50I2xpc3RTdGFja0ZyYW1lcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpc3RTdGFja0ZyYW1lcyhCaXRMaXN0IHRhc2tzLCBpbnQgbG93LCBpbnQgZGVwdGgpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdMaXN0U3RhY2tmcmFtZXModGFza3MsIGxvdywgZGVwdGgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gbGlzdGluZyBzdGFjayBmcmFtZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIjcmVnaXN0ZXIoamF2YS51dGlsLk9ic2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKE9ic2VydmVyIG9ic2VydmVyKSB7Ci0JCXByb3h5Tm90aWZpZXIuYWRkT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjcmVzdGFydChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydChCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihudWxsLCAiTm90IGltcGxlbWVudCBQRElEZWJ1Z2dlciAtIHJlc3RhcnQoKSB5ZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjcmVzdW1lKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWUoQml0TGlzdCB0YXNrcywgYm9vbGVhbiBwYXNzU2lnbmFsKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnR28odGFza3MpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gcmVzdW1pbmcgdGFza3M6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjcmVzdW1lKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWUoQml0TGlzdCB0YXNrcywgSVBESUxvY2F0aW9uIGxvY2F0aW9uKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihudWxsLCAiTm90IGltcGxlbWVudCBQRElEZWJ1Z2dlciAtIHJlc3VtZShJUERJTG9jYXRpb24pIHlldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNyZXN1bWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVNpZ25hbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWUoQml0TGlzdCB0YXNrcywgSVBESVNpZ25hbCBzaWduYWwpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsICJOb3QgaW1wbGVtZW50IFBESURlYnVnZ2VyIC0gcmVzdW1lKElQRElTaWduYWwpIHlldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElWYXJpYWJsZU1hbmFnZW1lbnQjcmV0cmlldmVBSUYob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJldHJpZXZlQUlGKEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnRXZhbHVhdGVFeHByZXNzaW9uKHRhc2tzLCBleHByKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIGdldHRpbmcgYWlmOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVZhcmlhYmxlTWFuYWdlbWVudCNyZXRyaWV2ZVBhcnRpYWxBSUYob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJldHJpZXZlUGFydGlhbEFJRihCaXRMaXN0IHRhc2tzLCBTdHJpbmcgZXhwciwgU3RyaW5nIGtleSwgYm9vbGVhbiBsaXN0Q2hpbGRyZW4sIGJvb2xlYW4gZXhwcmVzcykKLQkJCXRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdHZXRQYXJ0aWFsQUlGKHRhc2tzLCBleHByLCBrZXksIGxpc3RDaGlsZHJlbiwgZXhwcmVzcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBnZXR0aW5nIHBhcnRpYWwgYWlmOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNpZ25hbE1hbmFnZW1lbnQjcmV0cmlldmVTaWduYWxJbmZvKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXRyaWV2ZVNpZ25hbEluZm8oQml0TGlzdCB0YXNrcywgU3RyaW5nIGFyZykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1NpZ25hbEluZm8odGFza3MsIGFyZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBnZXR0aW5nIHNpZ25hbCBpbmZvOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVRocmVhZE1hbmFnZW1lbnQjcmV0cmlldmVTdGFja0luZm9EZXB0aChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgcmV0cmlldmVTdGFja0luZm9EZXB0aChCaXRMaXN0IHRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnU3RhY2tJbmZvRGVwdGgodGFza3MpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gZ2V0dGluZyBzdGFjayBpbmZvIGRlcHRoOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVZhcmlhYmxlTWFuYWdlbWVudCNyZXRyaWV2ZVZhcmlhYmxlVHlwZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmV0cmlldmVWYXJpYWJsZVR5cGUoQml0TGlzdCB0YXNrcywgU3RyaW5nIHZhcikgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z0dldFR5cGUodGFza3MsIHZhcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBnZXR0aW5nIHZhcmlhYmxlIHR5cGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJVGhyZWFkTWFuYWdlbWVudCNzZWxlY3RUaHJlYWQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0VGhyZWFkKEJpdExpc3QgdGFza3MsIGludCB0aWQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdTZXRUaHJlYWRTZWxlY3QodGFza3MsIHRpZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBzZXR0aW5nIHRocmVhZCBpZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElCcmVha3BvaW50TWFuYWdlbWVudCNzZXRBZGRyZXNzQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJQWRkcmVzc0JyZWFrcG9pbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkcmVzc0JyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUFkZHJlc3NCcmVha3BvaW50IGJwdCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJOb3QgaW1wbGVtZW50IFBESURlYnVnZ2VyIC0gc2V0QWRkcmVzc0JyZWFrcG9pbnQoKSB5ZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQnJlYWtwb2ludE1hbmFnZW1lbnQjc2V0Q29uZGl0aW9uQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb25CcmVha3BvaW50KEJpdExpc3QgdGFza3MsIGludCBicGlkLCBTdHJpbmcgY29uZGl0aW9uKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnQ29uZGl0aW9uQnJlYWtwb2ludCh0YXNrcywgYnBpZCwgY29uZGl0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIHNldHRpbmcgY29uZGl0aW9uIGJyZWFrcG9pbnQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU3RhY2tmcmFtZU1hbmFnZW1lbnQjc2V0Q3VycmVudFN0YWNrRnJhbWUob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudFN0YWNrRnJhbWUoQml0TGlzdCB0YXNrcywgaW50IGxldmVsKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWRlYnVnU2V0Q3VycmVudFN0YWNrZnJhbWUodGFza3MsIGxldmVsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIHNldHRpbmcgY3VycmVudCBzdGFjayBmcmFtZSBsZXZlbDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElCcmVha3BvaW50TWFuYWdlbWVudCNzZXRFbmFibGVkQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBpbnQgYnBpZCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChlbmFibGVkKQotCQkJCWRlYnVnRW5hYmxlQnJlYWtwb2ludCh0YXNrcywgYnBpZCk7Ci0JCQllbHNlCi0JCQkJZGVidWdEaXNhYmxlQnJlYWtwb2ludCh0YXNrcywgYnBpZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBzZXR0aW5nIGVuYWJsaW5nIGJyZWFrcG9pbnQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJQnJlYWtwb2ludE1hbmFnZW1lbnQjc2V0RXhjZXB0aW9ucG9pbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESUV4Y2VwdGlvbnBvaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnBvaW50KEJpdExpc3QgdGFza3MsIElQRElFeGNlcHRpb25wb2ludCBicHQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiTm90IGltcGxlbWVudCBQRElEZWJ1Z2dlciAtIHNldEV4Y2VwdGlvbnBvaW50KCkgeWV0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUJyZWFrcG9pbnRNYW5hZ2VtZW50I3NldEZ1bmN0aW9uQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJRnVuY3Rpb25CcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZ1bmN0aW9uQnJlYWtwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJRnVuY3Rpb25CcmVha3BvaW50IGJwdCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IGJwdC5nZXRDb25kaXRpb24oKTsKLQkJCWludCBpZCA9IGJwdC5nZXRCcmVha3BvaW50SUQoKTsKLQkJCWlmIChpZCA9PSAtMSkgewotCQkJCWlkID0gbmV3QnJlYWtwb2ludElkKCk7Ci0JCQkJYnB0LnNldEJyZWFrcG9pbnRJRChpZCk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIisrRnVuYyBCcHQgLSBmaWxlOiAiICsKLQkJCS8vIGdldEZpbGVuYW1lKGJwdC5nZXRMb2NhdG9yKCkuZ2V0RmlsZSgpKSArICIsIGZ1bmM6ICIgKwotCQkJLy8gYnB0LmdldExvY2F0b3IoKS5nZXRGdW5jdGlvbigpKTsKLQkJCWRlYnVnU2V0RnVuY0JyZWFrcG9pbnQodGFza3MsIGlkLCBicHQuaXNUZW1wb3JhcnkoKSwgYnB0LmlzSGFyZHdhcmUoKSwgZ2V0RmlsZW5hbWUoYnB0LmdldExvY2F0b3IoKS5nZXRGaWxlKCkpLCBicHQKLQkJCQkJLmdldExvY2F0b3IoKS5nZXRGdW5jdGlvbigpLCAoY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24uZ2V0RXhwcmVzc2lvbigpIDogIiIpLAotCQkJCQkoY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24uZ2V0SWdub3JlQ291bnQoKSA6IDApLCAwKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIHNldHRpbmcgZnVuY3Rpb24gYnJlYWtwb2ludDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElCcmVha3BvaW50TWFuYWdlbWVudCNzZXRMaW5lQnJlYWtwb2ludChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJTGluZUJyZWFrcG9pbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZUJyZWFrcG9pbnQoQml0TGlzdCB0YXNrcywgSVBESUxpbmVCcmVha3BvaW50IGJwdCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUERJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IGJwdC5nZXRDb25kaXRpb24oKTsKLQkJCWludCBpZCA9IGJwdC5nZXRCcmVha3BvaW50SUQoKTsKLQkJCWlmIChpZCA9PSAtMSkgewotCQkJCWlkID0gbmV3QnJlYWtwb2ludElkKCk7Ci0JCQkJYnB0LnNldEJyZWFrcG9pbnRJRChpZCk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIisrTGluZSBCcHQgLSBmaWxlOiAiICsKLQkJCS8vIGdldEZpbGVuYW1lKGJwdC5nZXRMb2NhdG9yKCkuZ2V0RmlsZSgpKSArICIsIGxpbmU6ICIgKwotCQkJLy8gYnB0LmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJZGVidWdTZXRMaW5lQnJlYWtwb2ludCh0YXNrcywgaWQsIGJwdC5pc1RlbXBvcmFyeSgpLCBicHQuaXNIYXJkd2FyZSgpLCBnZXRGaWxlbmFtZShicHQuZ2V0TG9jYXRvcigpLmdldEZpbGUoKSksIGJwdAotCQkJCQkuZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKSwgKGNvbmRpdGlvbiAhPSBudWxsID8gY29uZGl0aW9uLmdldEV4cHJlc3Npb24oKSA6ICIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24uZ2V0SWdub3JlQ291bnQoKSA6IDApLCAwKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIHNldHRpbmcgbGluZSBicmVha3BvaW50OiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUJyZWFrcG9pbnRNYW5hZ2VtZW50I3NldFdhdGNocG9pbnQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVdhdGNocG9pbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2F0Y2hwb2ludChCaXRMaXN0IHRhc2tzLCBJUERJV2F0Y2hwb2ludCBicHQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJU3RyaW5nIGV4cHJlc3Npb24gPSBicHQuZ2V0V2F0Y2hFeHByZXNzaW9uKCk7Ci0JCQlib29sZWFuIGFjY2VzcyA9IGJwdC5pc1JlYWRUeXBlKCkgJiYgYnB0LmlzV3JpdGVUeXBlKCk7Ci0JCQlib29sZWFuIHJlYWQgPSAhYnB0LmlzV3JpdGVUeXBlKCkgJiYgYnB0LmlzUmVhZFR5cGUoKTsKLQkJCUlQRElDb25kaXRpb24gY29uZGl0aW9uID0gYnB0LmdldENvbmRpdGlvbigpOwotCQkJaW50IGlkID0gYnB0LmdldEJyZWFrcG9pbnRJRCgpOwotCQkJaWYgKGlkID09IC0xKSB7Ci0JCQkJaWQgPSBuZXdCcmVha3BvaW50SWQoKTsKLQkJCQlicHQuc2V0QnJlYWtwb2ludElEKGlkKTsKLQkJCX0KLQkJCWRlYnVnU2V0V2F0Y2hwb2ludCh0YXNrcywgaWQsIGV4cHJlc3Npb24sIGFjY2VzcywgcmVhZCwgKGNvbmRpdGlvbiAhPSBudWxsID8gY29uZGl0aW9uLmdldEV4cHJlc3Npb24oKSA6ICIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24uZ2V0SWdub3JlQ291bnQoKSA6IDApKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbih0YXNrcywgIkVycm9yIG9uIHNldHRpbmcgd2FjdGhwb2ludDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNzdGFydChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXJlc3VtZSh0YXNrcywgZmFsc2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRGVidWdnZXIjc3RhcnREZWJ1Z2dlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnREZWJ1Z2dlcihTdHJpbmcgYXBwLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1N0YXJ0U2Vzc2lvbihhcHAsIHBhdGgsIGRpciwgYXJncyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24obnVsbCwgIkVycm9yIG9uIHN0YXJ0aW5nIGRlYnVnZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N0ZXBJbnRvKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKEJpdExpc3QgdGFza3MsIGludCBjb3VudCkgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z1N0ZXAodGFza3MsIGNvdW50LCBQcm94eURlYnVnQ2xpZW50LlNURVBfSU5UTyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBzdGVwcGluZyBpbnRvOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N0ZXBJbnRvSW5zdHJ1Y3Rpb24ob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcEludG9JbnN0cnVjdGlvbihCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsICJOb3QgaW1wbGVtZW50IFBESURlYnVnZ2VyIC0gc3RlcEludG9JbnN0cnVjdGlvbigpIHlldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNzdGVwT3ZlcihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwT3ZlcihCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdTdGVwKHRhc2tzLCBjb3VudCwgUHJveHlEZWJ1Z0NsaWVudC5TVEVQX09WRVIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gc3RlcHBpbmcgb3ZlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElFeGVjdXRlTWFuYWdlbWVudCNzdGVwT3Zlckluc3RydWN0aW9uKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBPdmVySW5zdHJ1Y3Rpb24oQml0TGlzdCB0YXNrcywgaW50IGNvdW50KSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihudWxsLCAiTm90IGltcGxlbWVudCBQRElEZWJ1Z2dlciAtIHN0ZXBPdmVySW5zdHJ1Y3Rpb24oKSB5ZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjc3RlcFJldHVybihvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKEJpdExpc3QgdGFza3MsIElBSUYgYWlmKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihudWxsLCAiTm90IGltcGxlbWVudCBQRElEZWJ1Z2dlciAtIHN0ZXBSZXR1cm4oSUFJRikgeWV0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N0ZXBSZXR1cm4ob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc3RlcFJldHVybihCaXRMaXN0IHRhc2tzLCBpbnQgY291bnQpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdTdGVwKHRhc2tzLCBjb3VudCwgUHJveHlEZWJ1Z0NsaWVudC5TVEVQX0ZJTklTSCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBzdGVwcGluZyByZXR1cm46ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJRXhlY3V0ZU1hbmFnZW1lbnQjc3RlcFVudGlsKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwVW50aWwoQml0TGlzdCB0YXNrcywgSVBESUxvY2F0aW9uIGxvY2F0aW9uKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihudWxsLCAiTm90IGltcGxlbWVudCBQRElEZWJ1Z2dlciAtIHN0ZXBVbnRpbChJUERJTG9jYXRpb24pIHlldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElEZWJ1Z2dlciNzdG9wRGVidWdnZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BEZWJ1Z2dlcigpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZG9TaHV0ZG93bigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKG51bGwsICJFcnJvciBvbiBzdG9wcGluZyBkZWJ1Z2dlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJcHJveHlOb3RpZmllci5kZWxldGVPYnNlcnZlcnMoKTsKLQkJCWZpbmFsaXplKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3N1c3BlbmQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmQoQml0TGlzdCB0YXNrcykgdGhyb3dzIFBESUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkZWJ1Z0ludGVycnVwdCh0YXNrcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQRElFeGNlcHRpb24odGFza3MsICJFcnJvciBvbiBzdXNwZW5kaW5nIHRhc2tzOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUV4ZWN1dGVNYW5hZ2VtZW50I3Rlcm1pbmF0ZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlKEJpdExpc3QgdGFza3MpIHRocm93cyBQRElFeGNlcHRpb24gewotCQl0cnkgewotCQkJZGVidWdUZXJtaW5hdGUodGFza3MpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHRhc2tzLCAiRXJyb3Igb24gdGVybWluYXRpbmcgdGFza3M6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dHJhY3QgZmlsZSBuYW1lIHBhcnQgb2YgYSBwYXRoCi0JICogCi0JICogQHBhcmFtIGZ1bGxQYXRoCi0JICogQHJldHVybiBmaWxlIG5hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlbmFtZShTdHJpbmcgZnVsbFBhdGgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZ1bGxQYXRoKTsKLQkJaWYgKHBhdGguaXNFbXB0eSgpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB3b3JkIGZvcm1hdCB0byBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gd29yZEZvcm1hdAotCSAqIEByZXR1cm4gY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9ybWF0KGludCB3b3JkRm9ybWF0KSB7Ci0JCXN3aXRjaCAod29yZEZvcm1hdCkgewotCQljYXNlIEV4dEZvcm1hdC5VTlNJR05FRDoKLQkJCXJldHVybiAidSI7IC8vJE5PTi1OTFMtMSQKLQkJY2FzZSBFeHRGb3JtYXQuRkxPQVQ6Ci0JCQlyZXR1cm4gImYiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgRXh0Rm9ybWF0LkFERFJFU1M6Ci0JCQlyZXR1cm4gImEiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgRXh0Rm9ybWF0LklOU1RSVUNUSU9OOgotCQkJcmV0dXJuICJpIjsgLy8kTk9OLU5MUy0xJAotCQljYXNlIEV4dEZvcm1hdC5DSEFSOgotCQkJcmV0dXJuICJjIjsgLy8kTk9OLU5MUy0xJAotCQljYXNlIEV4dEZvcm1hdC5TVFJJTkc6Ci0JCQlyZXR1cm4gInMiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgRXh0Rm9ybWF0LkRFQ0lNQUw6Ci0JCQlyZXR1cm4gImQiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgRXh0Rm9ybWF0LkJJTkFSWToKLQkJCXJldHVybiAidCI7IC8vJE5PTi1OTFMtMSQKLQkJY2FzZSBFeHRGb3JtYXQuT0NUQUw6Ci0JCQlyZXR1cm4gIm8iOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgRXh0Rm9ybWF0LkhFWEFERUNJTUFMOgotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJ4IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSBuZXcgdW5pcXVlIGJyZWFrcG9pbnQgSUQKLQkgKiAKLQkgKiBAcmV0dXJuIHVuaXF1ZSBicmVha3BvaW50IElECi0JICovCi0JcHJpdmF0ZSBpbnQgbmV3QnJlYWtwb2ludElkKCkgewotCQlyZXR1cm4gYnBpZCsrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1EYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVhZDU5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RGF0YUV2YWx1YXRlRXhwcmVzc2lvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0RhdGFFdmVudDsKLQotcHVibGljIGNsYXNzIFNETURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3REYXRhRXZhbHVhdGVFeHByZXNzaW9uUmVxdWVzdCB7Ci0JcHVibGljIFNETURhdGFFdmFsdWF0ZUV4cHJlc3Npb25SZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByKSB7Ci0JCXN1cGVyKHRhc2tzLCBleHByKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Qjc3RvcmVSZXN1bHQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSVByb3h5RGVidWdEYXRhRXZlbnQpIHsKLQkJCVByb3h5RGVidWdBSUYgcHJveHlBSUYgPSAoKElQcm94eURlYnVnRGF0YUV2ZW50KXJlc3VsdCkuZ2V0RGF0YSgpOwotCQkJcmVzdWx0cy5wdXQoclRhc2tzLCBBSUZGYWN0b3J5Lm5ld0FJRihwcm94eUFJRi5nZXRGRFMoKSwgcHJveHlBSUYuZ2V0RGF0YSgpLCBwcm94eUFJRi5nZXREZXNjcmlwdGlvbigpKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdG9yZVVua25vd25SZXN1bHQoclRhc2tzLCByZXN1bHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNRGF0YVJlYWRNZW1vcnlSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1EYXRhUmVhZE1lbW9yeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiNzgxMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1EYXRhUmVhZE1lbW9yeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElNZW1vcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3REYXRhUmVhZE1lbW9yeVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnTWVtb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuUHJveHlEZWJ1Z01lbW9yeUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnTWVtb3J5SW5mb0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgU0RNRGF0YVJlYWRNZW1vcnlSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3REYXRhUmVhZE1lbW9yeVJlcXVlc3QgewotCXByaXZhdGUgSVBESVNlc3Npb24gc2Vzc2lvbjsKLQkKLQlwdWJsaWMgU0RNRGF0YVJlYWRNZW1vcnlSZXF1ZXN0KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGxvbmcgb2Zmc2V0LCBTdHJpbmcgYWRkcmVzcywgaW50IHdvcmRGb3JtYXQsIGludCB3b3JkU2l6ZSwgaW50IHJvd3MsIGludCBjb2xzLCBDaGFyYWN0ZXIgYXNDaGFyKSB7Ci0JCXN1cGVyKHRhc2tzLCBvZmZzZXQsIGFkZHJlc3MsIHdvcmRGb3JtYXQsIHdvcmRTaXplLCByb3dzLCBjb2xzLCBhc0NoYXIpOwotCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCNzdG9yZVJlc3VsdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlUmVzdWx0KEJpdExpc3QgclRhc2tzLCBPYmplY3QgcmVzdWx0KSB7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z01lbW9yeUluZm9FdmVudCkgewotCQkJUHJveHlEZWJ1Z01lbW9yeUluZm8gaW5mbyA9ICgoSVByb3h5RGVidWdNZW1vcnlJbmZvRXZlbnQpcmVzdWx0KS5nZXRNZW1vcnlJbmZvKCk7Ci0JCQlQcm94eURlYnVnTWVtb3J5W10gcHJveHlNZW1zID0gaW5mby5nZXRNZW1vcmllcygpOwotCQkJSVBESU1lbW9yeVtdIG1lbW9yaWVzID0gbmV3IElQRElNZW1vcnlbcHJveHlNZW1zLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8cHJveHlNZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWVtb3JpZXNbaV0gPSBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld01lbW9yeShwcm94eU1lbXNbaV0uZ2V0QWRkcmVzcygpLCBwcm94eU1lbXNbaV0uZ2V0QXNjaWkoKSwgcHJveHlNZW1zW2ldLmdldERhdGEoKSk7Ci0JCQl9Ci0JCQlyZXN1bHRzLnB1dChyVGFza3MsIHNlc3Npb24uZ2V0RXZlbnRGYWN0b3J5KCkubmV3RGF0YVJlYWRNZW1vcnlJbmZvKGluZm8uZ2V0QWRkcmVzcygpLCBpbmZvLmdldE5leHRSb3coKSwgaW5mby5nZXRQcmV2Um93KCksIGluZm8uZ2V0TmV4dFBhZ2UoKSwgaW5mby5nZXRQcmV2UGFnZSgpLCBpbmZvLmdldE51bUJ5dGVzKCksIGluZm8uZ2V0VG90YWxCeXRlcygpLCBtZW1vcmllcykpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RvcmVVbmtub3duUmVzdWx0KHJUYXNrcywgcmVzdWx0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldEFJRlJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldEFJRlJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmODU1OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1HZXRBSUZSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0R2V0QUlGUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdBSUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRGF0YUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgU0RNR2V0QUlGUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0R2V0QUlGUmVxdWVzdCB7Ci0JcHVibGljIFNETUdldEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIpIHsKLQkJc3VwZXIodGFza3MsIGV4cHIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0R2V0QUlGUmVxdWVzdCNzdG9yZVJlc3VsdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlUmVzdWx0KEJpdExpc3QgclRhc2tzLCBPYmplY3QgcmVzdWx0KSB7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z0RhdGFFdmVudCkgewotCQkJUHJveHlEZWJ1Z0FJRiBwcm94eUFJRiA9ICgoSVByb3h5RGVidWdEYXRhRXZlbnQpcmVzdWx0KS5nZXREYXRhKCk7Ci0JCQlyZXN1bHRzLnB1dChyVGFza3MsIEFJRkZhY3RvcnkubmV3QUlGKHByb3h5QUlGLmdldEZEUygpLCBwcm94eUFJRi5nZXREYXRhKCksIHByb3h5QUlGLmdldERlc2NyaXB0aW9uKCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0b3JlVW5rbm93blJlc3VsdChyVGFza3MsIHJlc3VsdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1HZXRJbmZvVGhyZWFkc1JlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldEluZm9UaHJlYWRzUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2QzZGUyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldEluZm9UaHJlYWRzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0R2V0SW5mb1RocmVhZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0luZm9UaHJlYWRzRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTRE1HZXRJbmZvVGhyZWFkc1JlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdEdldEluZm9UaHJlYWRzUmVxdWVzdCB7Ci0JcHVibGljIFNETUdldEluZm9UaHJlYWRzUmVxdWVzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Qjc3RvcmVSZXN1bHQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50KSB7Ci0JCQlyZXN1bHRzLnB1dChyVGFza3MsICgoSVByb3h5RGVidWdJbmZvVGhyZWFkc0V2ZW50KXJlc3VsdCkuZ2V0VGhyZWFkSWRzKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RvcmVVbmtub3duUmVzdWx0KHJUYXNrcywgcmVzdWx0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldFBhcnRpYWxBSUZSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1HZXRQYXJ0aWFsQUlGUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWUwYWEzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldFBhcnRpYWxBSUZSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLmFpZi5BSUZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0R2V0UGFydGlhbEFJRlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnQUlGOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1BhcnRpYWxBSUZFdmVudDsKLQotcHVibGljIGNsYXNzIFNETUdldFBhcnRpYWxBSUZSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RHZXRQYXJ0aWFsQUlGUmVxdWVzdCB7Ci0JcHVibGljIFNETUdldFBhcnRpYWxBSUZSZXF1ZXN0KEJpdExpc3QgdGFza3MsIFN0cmluZyBleHByLCBTdHJpbmcgdmFyaWQpIHsKLQkJdGhpcyh0YXNrcywgZXhwciwgdmFyaWQsIGZhbHNlLCAodmFyaWQgIT0gbnVsbCkpOwotCX0KLQkKLQlwdWJsaWMgU0RNR2V0UGFydGlhbEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIsIFN0cmluZyB2YXJpZCwgYm9vbGVhbiBsaXN0Q2hpbGRyZW4pIHsKLQkJdGhpcyh0YXNrcywgZXhwciwgdmFyaWQsIGxpc3RDaGlsZHJlbiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgU0RNR2V0UGFydGlhbEFJRlJlcXVlc3QoQml0TGlzdCB0YXNrcywgU3RyaW5nIGV4cHIsIFN0cmluZyB2YXJpZCwgYm9vbGVhbiBsaXN0Q2hpbGRyZW4sIGJvb2xlYW4gZXhwcmVzcykgewotCQlzdXBlcih0YXNrcywgZXhwciwgdmFyaWQsIGxpc3RDaGlsZHJlbiwgZXhwcmVzcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I3N0b3JlUmVzdWx0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVSZXN1bHQoQml0TGlzdCByVGFza3MsIE9iamVjdCByZXN1bHQpIHsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIElQcm94eURlYnVnUGFydGlhbEFJRkV2ZW50KSB7Ci0JCQlPYmplY3RbXSBvYmpzID0gbmV3IE9iamVjdFsyXTsKLQkJCW9ianNbMF0gPSAoKElQcm94eURlYnVnUGFydGlhbEFJRkV2ZW50KXJlc3VsdCkuZ2V0TmFtZSgpOwotCQkJUHJveHlEZWJ1Z0FJRiBwcm94eUFJRiA9ICgoSVByb3h5RGVidWdQYXJ0aWFsQUlGRXZlbnQpcmVzdWx0KS5nZXREYXRhKCk7Ci0JCQlvYmpzWzFdID0gQUlGRmFjdG9yeS5uZXdBSUYocHJveHlBSUYuZ2V0RkRTKCksIHByb3h5QUlGLmdldERhdGEoKSwgcHJveHlBSUYuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQlyZXN1bHRzLnB1dChyVGFza3MsIG9ianMpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RvcmVVbmtub3duUmVzdWx0KHJUYXNrcywgcmVzdWx0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNR2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YmQ1YWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNR2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RHZXRTdGFja0luZm9EZXB0aFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudDsKLQotcHVibGljIGNsYXNzIFNETUdldFN0YWNrSW5mb0RlcHRoUmVxdWVzdCBleHRlbmRzIEFic3RyYWN0R2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0IHsKLQlwdWJsaWMgU0RNR2V0U3RhY2tJbmZvRGVwdGhSZXF1ZXN0KEJpdExpc3QgdGFza3MpIHsKLQkJc3VwZXIodGFza3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I3N0b3JlUmVzdWx0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVSZXN1bHQoQml0TGlzdCByVGFza3MsIE9iamVjdCByZXN1bHQpIHsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIElQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudCkgewotCQkJcmVzdWx0cy5wdXQoclRhc2tzLCBuZXcgSW50ZWdlcigoKElQcm94eURlYnVnU3RhY2tJbmZvRGVwdGhFdmVudClyZXN1bHQpLmdldERlcHRoKCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0b3JlVW5rbm93blJlc3VsdChyVGFza3MsIHJlc3VsdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1MaXN0QXJndW1lbnRzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNTGlzdEFyZ3VtZW50c1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZjZhNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1MaXN0QXJndW1lbnRzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0TGlzdEFyZ3VtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnQXJnc0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgU0RNTGlzdEFyZ3VtZW50c1JlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3RBcmd1bWVudHNSZXF1ZXN0IHsKLQkKLQlwdWJsaWMgU0RNTGlzdEFyZ3VtZW50c1JlcXVlc3QoQml0TGlzdCB0YXNrcywgaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJc3VwZXIodGFza3MsIGxvdywgaGlnaCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I3N0b3JlUmVzdWx0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSVByb3h5RGVidWdBcmdzRXZlbnQpIHsKLQkJCXJlc3VsdHMucHV0KHJUYXNrcywgKChJUHJveHlEZWJ1Z0FyZ3NFdmVudClyZXN1bHQpLmdldFZhcmlhYmxlcygpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0b3JlVW5rbm93blJlc3VsdChyVGFza3MsIHJlc3VsdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1MaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1MaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODg4Y2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNTGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0TGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdWYXJzRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTRE1MaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0TG9jYWxWYXJpYWJsZXNSZXF1ZXN0IHsKLQlwdWJsaWMgU0RNTGlzdExvY2FsVmFyaWFibGVzUmVxdWVzdChCaXRMaXN0IHRhc2tzKSB7Ci0JCXN1cGVyKHRhc2tzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Qjc3RvcmVSZXN1bHQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSVByb3h5RGVidWdWYXJzRXZlbnQpIHsKLQkJCXJlc3VsdHMucHV0KHJUYXNrcywgKChJUHJveHlEZWJ1Z1ZhcnNFdmVudClyZXN1bHQpLmdldFZhcmlhYmxlcygpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0b3JlVW5rbm93blJlc3VsdChyVGFza3MsIHJlc3VsdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1MaXN0U2lnbmFsc1JlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUxpc3RTaWduYWxzUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc4NDM0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUxpc3RTaWduYWxzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnBkaS5yZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5JUERJU2lnbmFsRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdExpc3RTaWduYWxzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnU2lnbmFsc0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgU0RNTGlzdFNpZ25hbHNSZXF1ZXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0U2lnbmFsc1JlcXVlc3QgewotCXByaXZhdGUgSVBESVNlc3Npb24gc2Vzc2lvbjsKLQkKLQlwdWJsaWMgU0RNTGlzdFNpZ25hbHNSZXF1ZXN0KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHRhc2tzLCBuYW1lKTsKLQkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUxpc3RTaWduYWxzUmVxdWVzdCNnZXRTaWduYWxzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCkKLQkgKi8KLQlwdWJsaWMgSVBESVNpZ25hbERlc2NyaXB0b3JbXSBnZXRTaWduYWxzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3h5RGVidWdTaWduYWxbXSkgewotCQkJUHJveHlEZWJ1Z1NpZ25hbFtdIHByb3h5U2lncyA9IChQcm94eURlYnVnU2lnbmFsW10pb2JqOwotCQkJSVBESVNpZ25hbERlc2NyaXB0b3JbXSBzaWduYWxzID0gbmV3IElQRElTaWduYWxEZXNjcmlwdG9yW3Byb3h5U2lncy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWduYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2lnbmFsc1tpXSA9IHNlc3Npb24uZ2V0TW9kZWxGYWN0b3J5KCkubmV3U2lnbmFsRGVzY3JpcHRvcihwcm94eVNpZ3NbaV0uZ2V0TmFtZSgpLCBwcm94eVNpZ3NbaV0uaXNTdG9wKCksIHByb3h5U2lnc1tpXS5pc1Bhc3MoKSwgCi0JCQkJCQlwcm94eVNpZ3NbaV0uaXNQcmludCgpLCBwcm94eVNpZ3NbaV0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2lnbmFsczsKLQkJfQotCQl0aHJvdyBuZXcgUERJRXhjZXB0aW9uKHFUYXNrcywgIk5vIHNpZ25hbHMgZm91bmQiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Qjc3RvcmVSZXN1bHQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkgewotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSVByb3h5RGVidWdTaWduYWxzRXZlbnQpIHsKLQkJCXJlc3VsdHMucHV0KHJUYXNrcywgKChJUHJveHlEZWJ1Z1NpZ25hbHNFdmVudClyZXN1bHQpLmdldFNpZ25hbHMoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdG9yZVVua25vd25SZXN1bHQoclRhc2tzLCByZXN1bHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNTGlzdFN0YWNrRnJhbWVzUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNTGlzdFN0YWNrRnJhbWVzUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWFhYjBjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5wZGkucmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuSVBESUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUxvY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0TGlzdFN0YWNrRnJhbWVzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z1N0YWNrZnJhbWVFdmVudDsKLQotcHVibGljIGNsYXNzIFNETUxpc3RTdGFja0ZyYW1lc1JlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3RTdGFja0ZyYW1lc1JlcXVlc3QgewotCXByaXZhdGUgSVBESVNlc3Npb24gc2Vzc2lvbjsKLQotCXB1YmxpYyBTRE1MaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MpIHsKLQkJdGhpcyhzZXNzaW9uLCB0YXNrcywgMCwgMCk7Ci0JfQotCQotCXB1YmxpYyBTRE1MaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KElQRElTZXNzaW9uIHNlc3Npb24sIEJpdExpc3QgdGFza3MsIGludCBsb3csIGludCBoaWdoKSB7Ci0JCXN1cGVyKHRhc2tzLCBsb3csIGhpZ2gpOwotCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5JUERJTGlzdFN0YWNrRnJhbWVzUmVxdWVzdCNnZXRTdGFja0ZyYW1lcyhvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lRGVzY3JpcHRvcltdIGdldFN0YWNrRnJhbWVzKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3h5RGVidWdTdGFja0ZyYW1lW10pIHsKLQkJCVByb3h5RGVidWdTdGFja0ZyYW1lW10gZnJhbWVzID0gKFByb3h5RGVidWdTdGFja0ZyYW1lW10pb2JqOwotCQkJSVBESVN0YWNrRnJhbWVEZXNjcmlwdG9yW10gZGVzYyA9IG5ldyBJUERJU3RhY2tGcmFtZURlc2NyaXB0b3JbZnJhbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2MubGVuZ3RoOyBpKyspIHsKLQkJCQlJUERJTG9jYXRvciBsb2MgPSBQRElMb2NhdGlvbkZhY3RvcnkubmV3TG9jYXRvcihmcmFtZXNbaV0uZ2V0TG9jYXRvcigpLmdldEZpbGUoKSwgZnJhbWVzW2ldLmdldExvY2F0b3IoKS5nZXRGdW5jdGlvbigpLAotCQkJCQkJZnJhbWVzW2ldLmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCksIGZyYW1lc1tpXS5nZXRMb2NhdG9yKCkuZ2V0QWRkcmVzcygpKTsKLQkJCQlkZXNjW2ldID0gc2Vzc2lvbi5nZXRNb2RlbEZhY3RvcnkoKS5uZXdTdGFja0ZyYW1lRGVzY3JpcHRvcihmcmFtZXNbaV0uZ2V0TGV2ZWwoKSwgbG9jKTsKLQkJCX0KLQkJCXJldHVybiBkZXNjOwotCQl9Ci0JCXRocm93IG5ldyBQRElFeGNlcHRpb24ocVRhc2tzLCAiTm8gc3RhY2sgZnJhbWVzIGZvdW5kIik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnBkaS5yZXF1ZXN0LkFic3RyYWN0RXZlbnRSZXN1bHRSZXF1ZXN0I3N0b3JlUmVzdWx0KG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdCwgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmV2ZW50LklQcm94eURlYnVnRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVSZXN1bHQoQml0TGlzdCByVGFza3MsIE9iamVjdCByZXN1bHQpIHsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIElQcm94eURlYnVnU3RhY2tmcmFtZUV2ZW50KSB7Ci0JCQlyZXN1bHRzLnB1dChyVGFza3MsICgoSVByb3h5RGVidWdTdGFja2ZyYW1lRXZlbnQpcmVzdWx0KS5nZXRGcmFtZXMoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdG9yZVVua25vd25SZXN1bHQoclRhc2tzLCByZXN1bHQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNU2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTI2NDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcGRpL3JlcXVlc3QvU0RNU2V0Q3VycmVudFN0YWNrRnJhbWVSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RTZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTRE1TZXRDdXJyZW50U3RhY2tGcmFtZVJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdFNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdCB7Ci0JCi0JcHVibGljIFNETVNldEN1cnJlbnRTdGFja0ZyYW1lUmVxdWVzdChCaXRMaXN0IHRhc2tzLCBpbnQgbGV2ZWwpIHsKLQkJc3VwZXIodGFza3MsIGxldmVsKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUucGRpLnJlcXVlc3QuQWJzdHJhY3RFdmVudFJlc3VsdFJlcXVlc3Qjc3RvcmVSZXN1bHQob3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0LCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVJlc3VsdChCaXRMaXN0IHJUYXNrcywgT2JqZWN0IHJlc3VsdCkge30KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETVNldFRocmVhZFNlbGVjdFJlcXVlc3QuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3BkaS9yZXF1ZXN0L1NETVNldFRocmVhZFNlbGVjdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhNjg3OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wZGkvcmVxdWVzdC9TRE1TZXRUaHJlYWRTZWxlY3RSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUucGRpLnJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5JUERJU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuUERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElMb2NhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElTdGFja0ZyYW1lRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdFNldFRocmVhZFNlbGVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuZXZlbnQuSVByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RFdmVudDsKLQotcHVibGljIGNsYXNzIFNETVNldFRocmVhZFNlbGVjdFJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdFNldFRocmVhZFNlbGVjdFJlcXVlc3QgewotCXByaXZhdGUgSVBESVNlc3Npb24gc2Vzc2lvbjsKLQkKLQlwdWJsaWMgU0RNU2V0VGhyZWFkU2VsZWN0UmVxdWVzdChJUERJU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzLCBpbnQgaWQpIHsKLQkJc3VwZXIodGFza3MsIGlkKTsKLQkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESVNldFRocmVhZFNlbGVjdFJlcXVlc3QjZ2V0U3RhY2tGcmFtZShvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QpCi0JICovCi0JcHVibGljIElQRElTdGFja0ZyYW1lRGVzY3JpcHRvciBnZXRTdGFja0ZyYW1lKEJpdExpc3QgcVRhc2tzKSB0aHJvd3MgUERJRXhjZXB0aW9uIHsKLQkJd2FpdFVudGlsQ29tcGxldGVkKHFUYXNrcyk7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXN1bHQocVRhc2tzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQlPYmplY3RbXSByZXR1cm5WYWx1ZXMgPSAoT2JqZWN0W10pb2JqOwotCQkJUHJveHlEZWJ1Z1N0YWNrRnJhbWUgZnJhbWUgPSAoUHJveHlEZWJ1Z1N0YWNrRnJhbWUpcmV0dXJuVmFsdWVzWzFdOwotCQkJSVBESUxvY2F0b3IgbG9jID0gUERJTG9jYXRpb25GYWN0b3J5Lm5ld0xvY2F0b3IoZnJhbWUuZ2V0TG9jYXRvcigpLmdldEZpbGUoKSwgZnJhbWUuZ2V0TG9jYXRvcigpLmdldEZ1bmN0aW9uKCksIAotCQkJCQlmcmFtZS5nZXRMb2NhdG9yKCkuZ2V0TGluZU51bWJlcigpLCBmcmFtZS5nZXRMb2NhdG9yKCkuZ2V0QWRkcmVzcygpKTsKLQkJCXJldHVybiBzZXNzaW9uLmdldE1vZGVsRmFjdG9yeSgpLm5ld1N0YWNrRnJhbWVEZXNjcmlwdG9yKGZyYW1lLmdldExldmVsKCksIGxvYyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFBESUV4Y2VwdGlvbihxVGFza3MsICJObyBTdGFjayBmcmFtZSBmb3VuZCIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5wZGkucmVxdWVzdC5BYnN0cmFjdEV2ZW50UmVzdWx0UmVxdWVzdCNzdG9yZVJlc3VsdChvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3QsIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5ldmVudC5JUHJveHlEZWJ1Z0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlUmVzdWx0KEJpdExpc3QgclRhc2tzLCBPYmplY3QgcmVzdWx0KSB7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdEV2ZW50KSB7Ci0JCQlPYmplY3RbXSBvYmpzID0gbmV3IE9iamVjdFsyXTsKLQkJCW9ianNbMF0gPSBuZXcgSW50ZWdlcigoKElQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0RXZlbnQpcmVzdWx0KS5nZXRUaHJlYWRJZCgpKTsKLQkJCW9ianNbMV0gPSAoKElQcm94eURlYnVnU2V0VGhyZWFkU2VsZWN0RXZlbnQpcmVzdWx0KS5nZXRGcmFtZSgpOwotCQkJcmVzdWx0cy5wdXQoclRhc2tzLCBvYmpzKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0b3JlVW5rbm93blJlc3VsdChyVGFza3MsIHJlc3VsdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wcm94eS9Qcm94eURlYnVnQ2xpZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vY29yZS9wcm94eS9Qcm94eURlYnVnQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWQ4OWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvcHJveHkvUHJveHlEZWJ1Z0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jbGllbnQuQWJzdHJhY3RQcm94eURlYnVnQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLklQcm94eURlYnVnQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnQnJlYWtwb2ludEFmdGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnQ0xJQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnQ29uZGl0aW9uQnJlYWtwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0RhdGFSZWFkTWVtb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnRGF0YVdyaXRlTWVtb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnRGVsZXRlQnJlYWtwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0Rpc2FibGVCcmVha3BvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnRW5hYmxlQnJlYWtwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0V2YWx1YXRlRXhwcmVzc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0dldFBhcnRpYWxBSUZDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdHZXRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnR29Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdJbnRlcnJ1cHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdMaXN0QXJndW1lbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnTGlzdEdsb2JhbFZhcmlhYmxlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0xpc3RJbmZvVGhyZWFkc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0xpc3RMb2NhbFZhcmlhYmxlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z0xpc3RTaWduYWxzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnTGlzdFN0YWNrZnJhbWVzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnU2V0Q3VycmVudFN0YWNrZnJhbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdTZXRGdW5jdGlvbkJyZWFrcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdTZXRMaW5lQnJlYWtwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z1NldFRocmVhZFNlbGVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNvbW1hbmQuUHJveHlEZWJ1Z1NldFdhdGNocG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdTaWduYWxJbmZvQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnU3RhY2tJbmZvRGVwdGhDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdTdGFydFNlc3Npb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5kZWJ1Zy5jb21tYW5kLlByb3h5RGVidWdTdGVwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnVGVybWluYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY29tbWFuZC5Qcm94eURlYnVnVmFyaWFibGVEZWxldGVDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgUHJveHlEZWJ1Z0NsaWVudCBleHRlbmRzIEFic3RyYWN0UHJveHlEZWJ1Z0NsaWVudCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUF9JTlRPID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQX09WRVIgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNURVBfRklOSVNIID0gMjsKLQotCS8qKgotCSAqIENvbnZlcnQgYSBwcm94eSByZXByZXNlbnRhdGlvbiBvZiBhIGJpdHNldCBpbnRvIGEgQml0TGlzdAotCSAqCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4gcHJveHkgYml0c2V0IGNvbnZlcnRlZCB0byBCaXRMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCaXRMaXN0IGRlY29kZUJpdFNldChTdHJpbmcgc3RyKSB7Ci0JCVN0cmluZ1tdIHBhcnRzID0gc3RyLnNwbGl0KCI6Iik7Ci0JCWludCBsZW4gPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdLCAxNik7IC8vIFNraXAgdHJhaWxpbmcgTlVMTAotCQlyZXR1cm4gbmV3IEJpdExpc3QobGVuLCBwYXJ0c1sxXSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIEJpdExpc3QgdG8gaXQncyBwcm94eSByZXByZXNlbnRhdGlvbgotCSAqCi0JICogQHBhcmFtIHNldAotCSAqIEByZXR1cm4gcHJveHkgcmVwcmVzZW50YXRpb24gb2YgYSBCaXRMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQml0U2V0KEJpdExpc3Qgc2V0KSB7Ci0JCVN0cmluZyBsZW5TdHIgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHNldC5zaXplKCkpOwotCQlyZXR1cm4gbGVuU3RyICsgIjoiICsgc2V0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogV2FpdCBmb3IgdGhlIGRlYnVnZ2VyIHRvIGNvbm5lY3QuIFdlIHdpbGwgcmVjZWl2ZSBhIGNvbm5lY3RlZCBldmVudAotCSAqIHdoZW4gdGhlIGRlYnVnIHNlcnZlciBhY3R1YWxseSBjb25uZWN0cywgb3IgYSB0aW1lb3V0IGV2ZW50IGlmIHRoZSBzZXJ2ZXIKLQkgKiBmYWlscyB0byBjb25uZWN0LgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCBmYWxzZSBvdGhlcndpc2UKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdENvbm5lY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlNETV9NQVNURVJfVFJBQ0lORywgImRlYnVnOiB3YWl0aW5nIGZvciBjb25uZWN0Iik7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXdhaXRMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCWlmIChzdGF0ZSA9PSBEZWJ1Z1Byb3h5U3RhdGUuQ09OTkVDVElORykgewotCQkJCXdoaWxlIChzdGF0ZSA9PSBEZWJ1Z1Byb3h5U3RhdGUuQ09OTkVDVElORyAmJiAhdGltZW91dCAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJd2FpdGluZyA9IHRydWU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvL2FkZGVkIHRvIHdhaXQgZm9yIDEwMDAKLQkJCQkJCXdhaXRDb25kaXRpb24uYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gRXhwZWN0IHRvIGJlIGludGVycnVwdGVkIGlmIG1vbml0b3IgaXMgY2FuY2VsZWQKLQkJCQkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRpbWVvdXQpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaW1lb3V0IHdhaXRpbmcgZm9yIGRlYnVnZ2VyIHRvIGNvbm5lY3QiKTsKLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKHN0YXRlICE9IERlYnVnUHJveHlTdGF0ZS5DT05ORUNURUQpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJd2FpdExvY2sudW5sb2NrKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnU3RhcnRTZXNzaW9uKFN0cmluZyBwcm9nLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGRpciwgU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnU3RhcnRTZXNzaW9uQ29tbWFuZChwcm9nLCBwYXRoLCBkaXIsIGFyZ3MpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdTZXRMaW5lQnJlYWtwb2ludChCaXRMaXN0IHByb2NzLCBpbnQgYnBpZCwgYm9vbGVhbiBpc1RlbXBvcmFyeSwgYm9vbGVhbiBpc0hhcmR3YXJlLCBTdHJpbmcgZmlsZSwgaW50IGxpbmUsIFN0cmluZyBleHByZXNzaW9uLCBpbnQgaWdub3JlQ291bnQsIGludCB0aWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm94eURlYnVnQ29tbWFuZCBjbWQgPSBuZXcgUHJveHlEZWJ1Z1NldExpbmVCcmVha3BvaW50Q29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBicGlkLCBpc1RlbXBvcmFyeSwgaXNIYXJkd2FyZSwgZmlsZSwgbGluZSwgZXhwcmVzc2lvbiwgaWdub3JlQ291bnQsIHRpZCk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z1NldEZ1bmNCcmVha3BvaW50KEJpdExpc3QgcHJvY3MsIGludCBicGlkLCBib29sZWFuIGlzVGVtcG9yYXJ5LCBib29sZWFuIGlzSGFyZHdhcmUsIFN0cmluZyBmaWxlLCBTdHJpbmcgZnVuYywgU3RyaW5nIGV4cHJlc3Npb24sIGludCBpZ25vcmVDb3VudCwgaW50IHRpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnU2V0RnVuY3Rpb25CcmVha3BvaW50Q29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBicGlkLCBpc1RlbXBvcmFyeSwgaXNIYXJkd2FyZSwgZmlsZSwgZnVuYywgZXhwcmVzc2lvbiwgaWdub3JlQ291bnQsIHRpZCk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z1NldFdhdGNocG9pbnQoQml0TGlzdCBwcm9jcywgaW50IGJwaWQsIFN0cmluZyBleHByZXNzaW9uLCBib29sZWFuIGlzQWNjZXNzLCBib29sZWFuIGlzUmVhZCwgU3RyaW5nIGNvbmRpdGlvbiwgaW50IGlnbm9yZUNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdTZXRXYXRjaHBvaW50Q29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBicGlkLCBleHByZXNzaW9uLCBpc0FjY2VzcywgaXNSZWFkLCBjb25kaXRpb24sIGlnbm9yZUNvdW50KTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnRGVsZXRlQnJlYWtwb2ludChCaXRMaXN0IHByb2NzLCBpbnQgYnBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnRGVsZXRlQnJlYWtwb2ludENvbW1hbmQoZW5jb2RlQml0U2V0KHByb2NzKSwgYnBpZCk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z0VuYWJsZUJyZWFrcG9pbnQoQml0TGlzdCBwcm9jcywgaW50IGJwaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm94eURlYnVnQ29tbWFuZCBjbWQgPSBuZXcgUHJveHlEZWJ1Z0VuYWJsZUJyZWFrcG9pbnRDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcyksIGJwaWQpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdEaXNhYmxlQnJlYWtwb2ludChCaXRMaXN0IHByb2NzLCBpbnQgYnBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnRGlzYWJsZUJyZWFrcG9pbnRDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcyksIGJwaWQpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdDb25kaXRpb25CcmVha3BvaW50KEJpdExpc3QgcHJvY3MsIGludCBicGlkLCBTdHJpbmcgZXhwcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnQ29uZGl0aW9uQnJlYWtwb2ludENvbW1hbmQoZW5jb2RlQml0U2V0KHByb2NzKSwgYnBpZCwgZXhwcik7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z0JyZWFrcG9pbnRBZnRlcihCaXRMaXN0IHByb2NzLCBpbnQgYnBpZCwgaW50IGljb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnQnJlYWtwb2ludEFmdGVyQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBicGlkLCBpY291bnQpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdTdGFja0luZm9EZXB0aChCaXRMaXN0IHByb2NzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdTdGFja0luZm9EZXB0aENvbW1hbmQoZW5jb2RlQml0U2V0KHByb2NzKSk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z0dvKEJpdExpc3QgcHJvY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm94eURlYnVnQ29tbWFuZCBjbWQgPSBuZXcgUHJveHlEZWJ1Z0dvQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnU3RlcChCaXRMaXN0IHByb2NzLCBpbnQgY291bnQsIGludCB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdTdGVwQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBjb3VudCwgdHlwZSk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z1Rlcm1pbmF0ZShCaXRMaXN0IHByb2NzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdUZXJtaW5hdGVDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcykpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdJbnRlcnJ1cHQoQml0TGlzdCBwcm9jcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnSW50ZXJydXB0Q29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnTGlzdFN0YWNrZnJhbWVzKEJpdExpc3QgcHJvY3MsIGludCBsb3csIGludCBoaWdoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdMaXN0U3RhY2tmcmFtZXNDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcyksIGxvdywgaGlnaCk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z1NldEN1cnJlbnRTdGFja2ZyYW1lKEJpdExpc3QgcHJvY3MsIGludCBsZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnU2V0Q3VycmVudFN0YWNrZnJhbWVDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcyksIGxldmVsKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnR2V0VHlwZShCaXRMaXN0IHByb2NzLCBTdHJpbmcgZXhwcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnR2V0VHlwZUNvbW1hbmQoZW5jb2RlQml0U2V0KHByb2NzKSwgZXhwcik7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z0xpc3RMb2NhbFZhcmlhYmxlcyhCaXRMaXN0IHByb2NzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdMaXN0TG9jYWxWYXJpYWJsZXNDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcykpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdMaXN0QXJndW1lbnRzKEJpdExpc3QgcHJvY3MsIGludCBsb3csIGludCBoaWdoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdMaXN0QXJndW1lbnRzQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBsb3csIGhpZ2gpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdMaXN0R2xvYmFsVmFyaWFibGVzKEJpdExpc3QgcHJvY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm94eURlYnVnQ29tbWFuZCBjbWQgPSBuZXcgUHJveHlEZWJ1Z0xpc3RHbG9iYWxWYXJpYWJsZXNDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcykpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdMaXN0SW5mb1RocmVhZHMoQml0TGlzdCBwcm9jcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnTGlzdEluZm9UaHJlYWRzQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQlwdWJsaWMgdm9pZCBkZWJ1Z1NldFRocmVhZFNlbGVjdChCaXRMaXN0IHByb2NzLCBpbnQgdGhyZWFkTnVtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdTZXRUaHJlYWRTZWxlY3RDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcyksIHRocmVhZE51bSk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhUmVhZE1lbW9yeUNvbW1hbmQoQml0TGlzdCBwcm9jcywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgZm9ybWF0LCBpbnQgd29yZFNpemUsIGludCByb3dzLCBpbnQgY29scywgQ2hhcmFjdGVyIGFzQ2hhcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnRGF0YVJlYWRNZW1vcnlDb21tYW5kKGVuY29kZUJpdFNldChwcm9jcyksIG9mZnNldCwgYWRkcmVzcywgZm9ybWF0LCB3b3JkU2l6ZSwgcm93cywgY29scywgYXNDaGFyKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFXcml0ZU1lbW9yeUNvbW1hbmQoQml0TGlzdCBwcm9jcywgbG9uZyBvZmZzZXQsIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgZm9ybWF0LCBpbnQgd29yZFNpemUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnRGF0YVdyaXRlTWVtb3J5Q29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBvZmZzZXQsIGFkZHJlc3MsIGZvcm1hdCwgd29yZFNpemUsIHZhbHVlKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnTGlzdFNpZ25hbHMoQml0TGlzdCBwcm9jcywgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm94eURlYnVnQ29tbWFuZCBjbWQgPSBuZXcgUHJveHlEZWJ1Z0xpc3RTaWduYWxzQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBuYW1lKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYnVnU2lnbmFsSW5mbyhCaXRMaXN0IHByb2NzLCBTdHJpbmcgYXJnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdTaWduYWxJbmZvQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBhcmcpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdDTElIYW5kbGUoQml0TGlzdCBwcm9jcywgU3RyaW5nIGFyZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnQ0xJQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBhcmcpOwotCQlzZW5kQ29tbWFuZChjbWQpOwotCQljbWQuY29tcGxldGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVidWdHZXRQYXJ0aWFsQUlGKEJpdExpc3QgcHJvY3MsIFN0cmluZyBuYW1lLCBTdHJpbmcga2V5LCBib29sZWFuIGxpc3RDaGlsZHJlbiwgYm9vbGVhbiBleHByZXNzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdHZXRQYXJ0aWFsQUlGQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBuYW1lLCBrZXksIGxpc3RDaGlsZHJlbiwgZXhwcmVzcyk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWJ1Z1ZhcmlhYmxlRGVsZXRlKEJpdExpc3QgcHJvY3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUHJveHlEZWJ1Z0NvbW1hbmQgY21kID0gbmV3IFByb3h5RGVidWdWYXJpYWJsZURlbGV0ZUNvbW1hbmQoZW5jb2RlQml0U2V0KHByb2NzKSwgbmFtZSk7Ci0JCXNlbmRDb21tYW5kKGNtZCk7Ci0JCWNtZC5jb21wbGV0ZWQoKTsKLQl9Ci0JLy9UT0RPIG1pc3NpbmcgRGF0YSBFdmFsdWF0ZSBFeHByZXNzaW9uIG9yIEV2YWx1YXRlIEV4cHJlc3Npb24gQ29tbWFuZAotCXB1YmxpYyB2b2lkIGRlYnVnRGF0YUV2YWx1YXRlRXhwcmVzc2lvbihCaXRMaXN0IHByb2NzLCBTdHJpbmcgZXhwcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnRXZhbHVhdGVFeHByZXNzaW9uQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBleHByKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLQlwdWJsaWMgdm9pZCBkZWJ1Z0V2YWx1YXRlRXhwcmVzc2lvbihCaXRMaXN0IHByb2NzLCBTdHJpbmcgZXhwcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVByb3h5RGVidWdDb21tYW5kIGNtZCA9IG5ldyBQcm94eURlYnVnRXZhbHVhdGVFeHByZXNzaW9uQ29tbWFuZChlbmNvZGVCaXRTZXQocHJvY3MpLCBleHByKTsKLQkJc2VuZENvbW1hbmQoY21kKTsKLQkJY21kLmNvbXBsZXRlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9jb3JlL3V0aWxzL0RlYnVnVXRpbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvdXRpbHMvRGVidWdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTE2MzUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2NvcmUvdXRpbHMvRGVidWdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS51dGlsczsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlLlNETURlYnVnQ29yZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIERlYnVnVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNETV9NQVNURVJfVFJBQ0lOR19PUFRJT04gPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2RlYnVnL1NETW1hc3RlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RNX01BU1RFUl9UUkFDSU5HX09QVElPTl9NT1JFID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS9kZWJ1Zy9TRE1tYXN0ZXIvbW9yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RNX01BU1RFUl9PVVRQVVRfVFJBQ0lOR19PUFRJT04gPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlL2RlYnVnL1NETW1hc3Rlci9vdXRwdXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gU0RNX01BU1RFUl9UUkFDSU5HID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFNETV9NQVNURVJfVFJBQ0lOR19NT1JFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFNETV9NQVNURVJfT1VUUFVUX1RSQUNJTkcgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVQbHVnaW5EZWJ1Z09wdGlvbnMoKSB7Ci0JCWlmIChTRE1EZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCVN0cmluZyBvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihTRE1fTUFTVEVSX1RSQUNJTkdfT1BUSU9OKTsKLQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJCVNETV9NQVNURVJfVFJBQ0lORyA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihTRE1fTUFTVEVSX1RSQUNJTkdfT1BUSU9OX01PUkUpOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJU0RNX01BU1RFUl9UUkFDSU5HX01PUkUgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oU0RNX01BU1RFUl9PVVRQVVRfVFJBQ0lOR19PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJU0RNX01BU1RFUl9PVVRQVVRfVFJBQ0lORyA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYm9vbGVhbiBvcHRpb24sIFN0cmluZyBwYXR0ZXJuLCBPYmplY3QgLi4uIGFyZ3VtZW50cykgewotCQl0cmFjZShvcHRpb24sIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIGFyZ3VtZW50cykpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShib29sZWFuIG9wdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9wdGlvbikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKGJvb2xlYW4gb3B0aW9uLCBTdHJpbmcgcGF0dGVybiwgT2JqZWN0IC4uLiBhcmd1bWVudHMpIHsKLQkJZXJyb3Iob3B0aW9uLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmd1bWVudHMpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoYm9vbGVhbiBvcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvcHRpb24pIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvLmNsYXNzcGF0aCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhM2U2OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpLy5jdnNpZ25vcmUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTY5MWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWRvYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvLnByb2plY3QgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGI2ODdjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZjMTAyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkuU0RNRGVidWdVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5wdHAudWksCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUsCi0gb3JnLmVjbGlwc2UudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL2Fib3V0Lmh0bWwgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2VjZDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkMGYxYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBDbGVtZW50IENodQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFNjYWxhYmxlIERlYnVnIE1hbmFnZXIgVUkKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCi0KLVNETVByZWZlcmVuY2VQYWdlLm5hbWU9U0RNCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3BsdWdpbi54bWwgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTQ3ZGYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVNETVByZWZlcmVuY2VQYWdlLm5hbWUiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBEZWJ1Z1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuU0RNUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS5TRE1QcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuZGVidWdnZXJDb25maWd1cmF0aW9ucyI+Ci0gICAgICA8ZGVidWdnZXJDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5pbnRlcm5hbC51aS5TRE1QYWdlIgotICAgICAgICAgICAgZGVidWdnZXJJRD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLlNETVBhZ2UiPgotICAgICAgPC9kZWJ1Z2dlckNvbmZpZ3VyYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9NZXNzYWdlcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjMWFmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5pbnRlcm5hbC51aS5NZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODQzNjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotU0RNRGVidWdnZXJQYWdlLmRlYnVnZ25hbWU9RGVidWdnZXIKLVNETURlYnVnZ2VyUGFnZS5lbmFibGVyZW1vdGVkZWJ1Z2dpbmc9RW5hYmxlIHJlbW90ZSBkZWJ1Z2dpbmcKLVNETURlYnVnZ2VyUGFnZS5icm93c2U9QnJvd3NlCi1TRE1EZWJ1Z2dlclBhZ2UucGF0aD1QYXRoIHRvIGRlYnVnZ2VyIGV4ZWN1dGFibGU6Ci1TRE1EZWJ1Z2dlclBhZ2UuaG9zdD1EZWJ1Z2dlciBzZXNzaW9uIGFkZHJlc3M6Ci1TRE1EZWJ1Z2dlclBhZ2Uuc2VsZWN0RGVidWdnZXJFeGU9U2VsZWN0IERlYnVnZ2VyIEV4ZWN1dGFibGUKLVNETURlYnVnZ2VyUGFnZS5lcnIxPUV4ZWN1dGFibGUgcGF0aCBtdXN0IGJlIHNwZWNpZmllZAotU0RNRGVidWdnZXJQYWdlLmVycjI9RXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgY29uZmlndXJhdGlvbgotU0RNRGVidWdnZXJQYWdlLmVycjM9RGVidWdnZXIgaG9zdCBtdXN0IGJlIHNwZWNpZmllZAotU0RNRGVidWdnZXJQYWdlLmVycjQ9U0RNIHBhdGggaXMgaW52YWxpZApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9TRE1QYWdlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL1NETVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZjE0NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL1NETVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBRTlggU29mdHdhcmUgU3lzdGVtcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb3h5T3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5QVFBSZW1vdGVDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLlBUUFJlbW90ZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBkeW5hbWljIHRhYiBmb3IgU0RNLWJhc2VkIGRlYnVnZ2VyIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFNETVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRE1fTE9DQVRJT04gPSAibGFzdF92YWxpZF9hcHBsaWVkX2xvY2F0aW9uX29mX3NkbV9leGVjdXRhYmxlIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCByZXNvdXJjZU1hbmFnZXIgPSBudWxsOwotCXByaXZhdGUgSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlcnJNc2cgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwYXRoSXNEaXJ0eSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHBhdGhJc1ZhbGlkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFRleHQgZlJNRGVidWdnZXJQYXRoVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgZlJNRGVidWdnZXJBZGRyZXNzVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUk1EZWJ1Z2dlckJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSkgewotCQkvKgotCQkgKiBEZWJ1Z2dlciB0YWIgaXMgc2VsZWN0ZWQgZnJvbSB3aXRoaW4gYW4gZXhpc3RpbmcgcGFnZS4uLgotCQkgKi8KLQkJdHJ5IHsKLQkJCWZSTURlYnVnZ2VyQWRkcmVzc1RleHQuc2V0VGV4dChnZXRBZGRyZXNzKHdvcmtpbmdDb3B5KSk7Ci0JCQlmUk1EZWJ1Z2dlclBhdGhUZXh0LnNldFRleHQod29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfRVhFQ1VUQUJMRV9QQVRILCBFTVBUWV9TVFJJTkcpKTsKLQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiU0RNRGVidWdnZXJQYWdlLnBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmUk1EZWJ1Z2dlclBhdGhUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlmUk1EZWJ1Z2dlclBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCQlmUk1EZWJ1Z2dlclBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXBhdGhJc0RpcnR5ID0gdHJ1ZTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCQlmUk1EZWJ1Z2dlckJyb3dzZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oY29tcCwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1EZWJ1Z2dlclBhZ2UuYnJvd3NlIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWZSTURlYnVnZ2VyQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGZpbGUgPSBicm93c2VGaWxlKCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlmUk1EZWJ1Z2dlclBhdGhUZXh0LnNldFRleHQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1EZWJ1Z2dlclBhZ2UuaG9zdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZSTURlYnVnZ2VyQWRkcmVzc1RleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWZSTURlYnVnZ2VyQWRkcmVzc1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0JCWZSTURlYnVnZ2VyQWRkcmVzc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1EZWJ1Z2dlclBhZ2UuZGVidWdnbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCS8qCi0JCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkIG9yIHdlIGhhdmUganVzdCBzZWxlY3RlZCBTRE0gYXMgdGhlIGRlYnVnZ2VyLi4uCi0JCSAqLwotCQl0cnkgewotCQkJU3RyaW5nIHJtSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1JFU09VUkNFX01BTkFHRVJfVU5JUVVFTkFNRSwgRU1QVFlfU1RSSU5HKTsKLQkJCXJlc291cmNlTWFuYWdlciA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbClQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKS5nZXRSZXNvdXJjZU1hbmFnZXJGcm9tVW5pcXVlTmFtZShybUlkKTsKLQkJCWZSTURlYnVnZ2VyQWRkcmVzc1RleHQuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFQlVHR0VSX0hPU1QsIEVNUFRZX1NUUklORykpOwotCQkJZlJNRGVidWdnZXJQYXRoVGV4dC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfRVhFQ1VUQUJMRV9QQVRILCBFTVBUWV9TVFJJTkcpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJaWYgKGdldEZpZWxkQ29udGVudChmUk1EZWJ1Z2dlckFkZHJlc3NUZXh0LmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiU0RNRGVidWdnZXJQYWdlLmVycjMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChnZXRGaWVsZENvbnRlbnQoZlJNRGVidWdnZXJQYXRoVGV4dC5nZXRUZXh0KCkpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlNETURlYnVnZ2VyUGFnZS5lcnIxIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlpZiAocGF0aElzRGlydHkpIHsKLQkJCQlpZiAoIXZlcmlmeVBhdGgoZlJNRGVidWdnZXJQYXRoVGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQkJCXBhdGhJc1ZhbGlkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0aElzVmFsaWQgPSB0cnVlOwotCQkJCX0KLQkJCQlwYXRoSXNEaXJ0eSA9IGZhbHNlOwotCQkJfSAKLQkJCQotCQkJaWYgKCFwYXRoSXNWYWxpZCkgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlNETURlYnVnZ2VyUGFnZS5lcnI0IikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIChnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjY2FuU2F2ZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuU2F2ZSgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlpZiAoZ2V0RmllbGRDb250ZW50KGZSTURlYnVnZ2VyQWRkcmVzc1RleHQuZ2V0VGV4dCgpKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1EZWJ1Z2dlclBhZ2UuZXJyMyIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGdldEZpZWxkQ29udGVudChmUk1EZWJ1Z2dlclBhdGhUZXh0LmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiU0RNRGVidWdnZXJQYWdlLmVycjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXRoSXNEaXJ0eSkgewotCQkJCWlmICghdmVyaWZ5UGF0aChmUk1EZWJ1Z2dlclBhdGhUZXh0LmdldFRleHQoKSkpIHsKLQkJCQkJcGF0aElzVmFsaWQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYXRoSXNWYWxpZCA9IHRydWU7Ci0JCQkJfQotCQkJCXBhdGhJc0RpcnR5ID0gZmFsc2U7Ci0JCQl9IAotCQkJCi0JCQlpZiAoIXBhdGhJc1ZhbGlkKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiU0RNRGVidWdnZXJQYWdlLmVycjQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvL3NldEVycm9yTWVzc2FnZShlcnJNc2cpOwotCQlyZXR1cm4gKGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZnkgdGhhdCB0aGUgc3VwcGxpZWQgcGF0aCBleGlzdHMgb24gdGhlIHJlbW90ZSBzeXN0ZW0KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHZlcmlmeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwYXRoIGV4aXN0cwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2ZXJpZnlQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUlSZW1vdGVDb25uZWN0aW9uIHJtQ29ubiA9IGdldFJlbW90ZUNvbm5lY3Rpb24oKTsKLQkJaWYgKHJtQ29ubiAhPSBudWxsKSB7Ci0JCQlJUmVtb3RlRmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSBnZXRSZW1vdGVTZXJ2aWNlcygpLmdldEZpbGVNYW5hZ2VyKHJtQ29ubik7Ci0JCQl0cnkgewotCQkJCUlGaWxlU3RvcmUgcmVzID0gZmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UobmV3IFBhdGgocGF0aCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWlmIChyZXMuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ldyBQYXRoKHBhdGgpLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCS8qCi0JCSAqIE5vdGU6IHBlcmZvcm1BcHBseSBnZXRzIGNhbGxlZCB3aGVuIGVpdGhlciB0ZXh0IGlzIG1vZGlmaWVkIHZpYQotCQkgKiB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCkuIE9ubHkgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGlmCi0JCSAqIHRoaW5ncyBhcmUgdmFsaWQuCi0JCSAqLwotCQlpZiAoaXNWYWxpZChjb25maWd1cmF0aW9uKSkgewotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9FWEVDVVRBQkxFX1BBVEgsIGdldEZpZWxkQ29udGVudChmUk1EZWJ1Z2dlclBhdGhUZXh0LmdldFRleHQoKSkpOwotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9IT1NULCBnZXRGaWVsZENvbnRlbnQoZlJNRGVidWdnZXJBZGRyZXNzVGV4dC5nZXRUZXh0KCkpKTsKLQkJCQotCQkJUGx1Z2luIHBsdWdpbj1vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpLlNETURlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQotCQkJcHJlZnMuc2V0VmFsdWUoU0RNX0xPQ0FUSU9OLCBnZXRGaWVsZENvbnRlbnQoZlJNRGVidWdnZXJQYXRoVGV4dC5nZXRUZXh0KCkpKTsKLQkJCQotCQkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNzZXREZWZhdWx0cyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmUganVzdCBzZWxlY3RlZCBTRE0gYXMgdGhlIGRlYnVnZ2VyLi4uCi0JCSAqLwotCQkvL1ByZWZlcmVuY2VzIHN0b3JlID0gU0RNRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgcGF0aCA9ICIiOy8vc3RvcmUuZ2V0U3RyaW5nKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0ZJTEUpOwotCQkvKgotCQkgKiBHdWVzcyB0aGF0IHRoZSBzZG0gZXhlY3V0YWJsZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgcHJveHkuIElmIG5vdCB0aGVuIHVzZSB0aGUKLQkJICogcHJlZmVyZW5jZSBzZXR0aW5nLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVN0cmluZyBybUlkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9SRVNPVVJDRV9NQU5BR0VSX1VOSVFVRU5BTUUsIEVNUFRZX1NUUklORyk7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBybSA9IChJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbClQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNb2RlbE1hbmFnZXIoKS5nZXRSZXNvdXJjZU1hbmFnZXJGcm9tVW5pcXVlTmFtZShybUlkKTsKLQkJCWlmIChybSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gcm1Db25maWcgPSBybS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKHJtQ29uZmlnIGluc3RhbmNlb2YgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSB7Ci0JCQkJCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiByZW1Db25maWcgPSAoQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKXJtQ29uZmlnOwotCQkJCQlJUGF0aCBybVBhdGggPSBuZXcgUGF0aChyZW1Db25maWcuZ2V0UHJveHlTZXJ2ZXJQYXRoKCkpOwotCQkJCQlwYXRoID0gcm1QYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoInNkbSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQvCi0JCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlpZihwYXRoLmVxdWFscygic2RtIil8fHBhdGguZXF1YWxzKCIiKSl7Ci0JCQkJCVBsdWdpbiBwbHVnaW49b3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS5TRE1EZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQkJcGF0aD1wcmVmcy5nZXRTdHJpbmcoU0RNX0xPQ0FUSU9OKTsKLQkJCQkJaWYocGF0aD09bnVsbHx8cGF0aC5lcXVhbHMoIiIpKXsKLQkJCQkJCXBhdGg9InNkbSI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVBUUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUJVR0dFUl9FWEVDVVRBQkxFX1BBVEgsIHBhdGgpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFQlVHR0VSX0hPU1QsIGdldEFkZHJlc3MoY29uZmlndXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEJyb3dzZSBmb3IgYSBmaWxlLiBJZiByZW1vdGVTZXJ2aWNlcyBpcyBub3QgbnVsbCwgdGhlbiB0aGUgY3VycmVudGx5Ci0JICogc2VsZWN0IHJlc291cmNlIG1hbmFnZXIgc3VwcG9ydHMgcmVtb3RlIGJyb3dzaW5nLgotCSAqIAotCSAqIEByZXR1cm4gcGF0aCB0byBmaWxlIHNlbGVjdGVkIGluIGJyb3dzZXIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBicm93c2VGaWxlKCkgewotCQlJUmVtb3RlVUlTZXJ2aWNlcyByZW1vdGVVSVNydiA9IGdldFJlbW90ZVVJU2VydmljZXMoKTsKLQkJaWYgKHJlbW90ZVVJU3J2ICE9IG51bGwpIHsKLQkJCUlSZW1vdGVVSUZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gcmVtb3RlVUlTcnYuZ2V0VUlGaWxlTWFuYWdlcigpOwotCQkJaWYgKGZpbGVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlmaWxlTWFuYWdlci5zZXRDb25uZWN0aW9uKGdldFJlbW90ZUNvbm5lY3Rpb24oKSk7Ci0JCQkJSVBhdGggcGF0aCA9IGZpbGVNYW5hZ2VyLmJyb3dzZUZpbGUoZ2V0U2hlbGwoKSwKLQkJCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiU0RNRGVidWdnZXJQYWdlLnNlbGVjdERlYnVnZ2VyRXhlIiksCi0JCQkJCQlmUk1EZWJ1Z2dlclBhdGhUZXh0LmdldFRleHQoKSk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNETURlYnVnZ2VyUGFnZS5zZWxlY3REZWJ1Z2dlckV4ZSIpKTsKLQkJCWRpYWxvZy5zZXRGaWxlTmFtZShmUk1EZWJ1Z2dlclBhdGhUZXh0LmdldFRleHQoKSk7Ci0JCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBXb3JrIG91dCB0aGUgYWRkcmVzcyB0byBzdXBwbHkgYXMgYXJndW1lbnQgdG8gdGhlIGRlYnVnIHNlcnZlci4gVGhlcmUgYXJlIGN1cnJlbnRseQotCSAqIHR3byBjYXNlczoKLQkgKiAKLQkgKiAxLiBJZiBwb3J0IGZvcndhcmRpbmcgaXMgZW5hYmxlZCwgdGhlbiB0aGUgYWRkcmVzcyBuZWVkcyB0byBiZSB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0aGF0IGlzCi0JICogcnVubmluZyB0aGUgcHJveHkgKHNpbmNlIHRoaXMgaXMgd2hlcmUgdGhlIHR1bm5lbCBiZWdpbnMpLCBidXQgYWNjZXNzaWJsZSBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcKLQkgKiB0aGUgZGVidWcgc2VydmVyLiBTaW5jZSB0aGUgZGVidWcgc2VydmVyIG1hY2hpbmUgbWF5IGJlIG9uIGEgbG9jYWwgbmV0d29yayAoZS5nLiBhIG5vZGUgaW4gYQotCSAqIGNsdXN0ZXIpLCBpdCB3aWxsIHR5cGljYWxseSBOT1QgYmUgdGhlIHNhbWUgYWRkcmVzcyB0aGF0IGlzIHVzZWQgdG8gc3RhcnQgdGhlIHByb3h5LgotCSAqIAotCSAqIDIuIElmIHBvcnQgZm9yd2FyZGluZyBpcyBub3QgZW5hYmxlZCwgdGhlbiB0aGUgYWRkcmVzcyB3aWxsIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBob3N0IHJ1bm5pbmcKLQkgKiBFY2xpcHNlKS4gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgdGhlIG1hY2hpbmUgcnVubmluZyB0aGUgZGVidWcgc2VydmVyIGNhbiBjb250YWN0IHRoZSBsb2NhbCBob3N0IGRpcmVjdGx5LgotCSAqIEluIHRoZSBjYXNlIG9mIHRoZSBTRE0sIHRoZSAibWFzdGVyIiBkZWJ1ZyBzZXJ2ZXIgcHJvY2VzcyBjYW4gcG90ZW50aWFsbHkgcnVuIG9uIGFueSBub2RlIGluIHRoZSBjbHVzdGVyLgotCSAqIEluIG1hbnkgZW52aXJvbm1lbnRzLCBjb21wdXRlIG5vZGVzIGNhbm5vdCBjb21tdW5pY2F0ZSBvdXRzaWRlIHRoZWlyIGxvY2FsIG5ldHdvcmsuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QWRkcmVzcyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJU3RyaW5nIGFkZHJlc3M7Ci0JCVN0cmluZyBybUlkOwotCQl0cnkgewotCQkJYWRkcmVzcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQVFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVCVUdHRVJfSE9TVCwgRU1QVFlfU1RSSU5HKTsKLQkJCXJtSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUFRQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1JFU09VUkNFX01BTkFHRVJfVU5JUVVFTkFNRSwgRU1QVFlfU1RSSU5HKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJSVJlc291cmNlTWFuYWdlckNvbnRyb2wgcm0gPSAoSVJlc291cmNlTWFuYWdlckNvbnRyb2wpUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyRnJvbVVuaXF1ZU5hbWUocm1JZCk7Ci0JCWlmIChybSAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIHJlc291cmNlIG1hbmFnZXIgaGFzIGJlZW4gY2hhbmdlZCBhbmQgdGhpcyBpcyBhIHJlbW90ZQotCQkJICogcmVzb3VyY2UgbWFuYWdlciwgdGhlbiB1cGRhdGUgdGhlIGhvc3QgZmllbGQKLQkJCSAqLwotCQkJaWYgKHJlc291cmNlTWFuYWdlciAhPSBybSkgewotCQkJCXJlc291cmNlTWFuYWdlciA9IHJtOwotCQkJCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmUoKTsKLQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbmZpZy50ZXN0T3B0aW9uKElSZW1vdGVQcm94eU9wdGlvbnMuUE9SVF9GT1JXQVJESU5HKSkKLQkJCQkJCXJldHVybiBnZXRSZW1vdGVDb25uZWN0aW9uKCkuZ2V0QWRkcmVzcygpOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gIGNvbmZpZy5nZXRMb2NhbEFkZHJlc3MoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuICJsb2NhbGhvc3QiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBSTSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBnZXRSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmUoKSB7Ci0JCWlmIChyZXNvdXJjZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gcm1Db25maWcgPSByZXNvdXJjZU1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJaWYgKHJtQ29uZmlnIGluc3RhbmNlb2YgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKQotCQkJCXJldHVybiAoQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKXJtQ29uZmlnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHJlbW90ZSBzZXJ2aWNlcwotCSAqIEByZXR1cm4gcmVtb3RlIHNlcnZpY2VzCi0JICovCi0JcHJpdmF0ZSBJUmVtb3RlU2VydmljZXMgZ2V0UmVtb3RlU2VydmljZXMoKSB7Ci0JCWlmIChyZXNvdXJjZU1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChyZW1vdGVTZXJ2aWNlcyA9PSBudWxsKSB7Ci0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBybUNvbmZpZyA9IHJlc291cmNlTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAocm1Db25maWcgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIHsKLQkJCQlBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gcmVtQ29uZmlnID0gKEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbilybUNvbmZpZzsKLQkJCQlyZW1vdGVTZXJ2aWNlcyA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKHJlbUNvbmZpZy5nZXRSZW1vdGVTZXJ2aWNlc0lkKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdGVTZXJ2aWNlczsKLQl9Ci0JCi0JLyoqCi0JICogTG9vayB1cCByZW1vdGUgVUkgc2VydmljZXMKLQkgKiAKLQkgKiBAcmV0dXJuIElSZW1vdGVVSVNlcnZpY2VzCi0JICovCi0JcHJpdmF0ZSBJUmVtb3RlVUlTZXJ2aWNlcyBnZXRSZW1vdGVVSVNlcnZpY2VzKCkgewotCQlJUmVtb3RlU2VydmljZXMgcnNydiA9IGdldFJlbW90ZVNlcnZpY2VzKCk7Ci0JCWlmIChyc3J2ICE9IG51bGwpCi0JCQlyZXR1cm4gUFRQUmVtb3RlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVVJU2VydmljZXMocnNydik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCByZW1vdGUgY29ubmVjdGlvbiBzZWxlY3RlZCBpbiB0aGUgUk0KLQkgKiAKLQkgKiBAcmV0dXJuIElSZW1vdGVDb25uZWN0aW9uCi0JICovCi0JcHJpdmF0ZSBJUmVtb3RlQ29ubmVjdGlvbiBnZXRSZW1vdGVDb25uZWN0aW9uKCkgewotCQlJUmVtb3RlU2VydmljZXMgcnNydiA9IGdldFJlbW90ZVNlcnZpY2VzKCk7Ci0JCWlmIChyc3J2ICE9IG51bGwpIHsKLQkJCUFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmUoKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcnNydi5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24oY29uZmlnLmdldENvbm5lY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCBhbmQgY2xlYW4gY29udGVudCBvZiBhIFRleHQgZmllbGQKLQkgKiBAcGFyYW0gdGV4dCB0ZXh0IG9idGFpbmVkIGZyb20gYSBUZXh0IGZpZWxkCi0JICogQHJldHVybiBjbGVhbmVkIHVwIGNvbnRlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkQ29udGVudChTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCB0ZXh0LmVxdWFscyhFTVBUWV9TVFJJTkcpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZU1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWE1NTBlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VNZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgUHJlZmVyZW5jZU1lc3NhZ2VzKCkge30KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlTWVzc2FnZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NWIxMTcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAjIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAjIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gIyAKLSAjIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gIyAKLSAjIExBLUNDIDA0LTExNQotICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0gIyBAYXV0aG9yIENsZW1lbnQKLSAjCi0gIyMKLSAKLVNETVByZWZlcmVuY2VQYWdlLmJyb3dzZV8xPUImcm93c2UKLVNETVByZWZlcmVuY2VQYWdlLnNkbV9kZXNjPVNjYWxhYmxlIERlYnVnIE1hbmFnZXIgc2V0dGluZ3MKLVNETVByZWZlcmVuY2VQYWdlLnNkbV9ncm91cD1EZWJ1Z2dlciBsYXVuY2ggcHJlZmVyZW5jZXMKLVNETVByZWZlcmVuY2VQYWdlLnNkbV9zZWxlY3Rpb249U0RNIGV4ZWN1dGFibGUKLVNETVByZWZlcmVuY2VQYWdlLnNkbV9hcmdzPUV4dHJhIFNETSBhcmd1bWVudHMKLVNETVByZWZlcmVuY2VQYWdlLnNkbV9ob3N0PVNETSBjbGllbnQgaG9zdAotU0RNUHJlZmVyZW5jZVBhZ2Uuc2RtX2JhY2tlbmQ9QmFja2VuZCBkZWJ1Z2dlcgotU0RNUHJlZmVyZW5jZVBhZ2Uuc2RtX2JhY2tlbmRfcGF0aD1QYXRoIHRvIGJhY2tlbmQgZGVidWdnZXIKLVNETVByZWZlcmVuY2VQYWdlLlNlbGVjdGlvbl9tdXN0X2JlX2ZpbGU9U2VsZWN0aW9uIG11c3QgYmUgYSBmaWxlIHR5cGUKLVNETVByZWZlcmVuY2VQYWdlLm5vX3NkbT1ObyBzZG0gZm91bmQKLQotU0RNUHJlZmVyZW5jZVBhZ2UuZGVmYXVsdDM9Q29tbXVuaWNhdGlvbgotU0RNUHJlZmVyZW5jZVBhZ2UuZGVmYXVsdDQ9VGltZSBvdXQKLVNETVByZWZlcmVuY2VQYWdlLmRlZmF1bHQ1PUV2ZW50Ci1TRE1QcmVmZXJlbmNlUGFnZS5kZWZhdWx0Nj1UaW1lIHJhbmdlCi0KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1NETVByZWZlcmVuY2VQYWdlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvc2RtL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1NETVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzJjOGYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TRE1QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUuU0RNRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZS5TRE1QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QcmVmZXJlbmNlc0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU0RNUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotICAgCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkgICAgCQlzZXRWYWxpZChpc1ZhbGlkKCkpOyAgICAgICAgCQotCSAgICB9Ci0JICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgIAkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgCQkJLy9pZiAoc291cmNlID09IHNkbVBhdGhCdXR0b24pCi0gICAJCQkJLy9oYW5kbGVTRE1CdXR0b25TZWxlY3RlZCgpOwotICAgCQkJaWYgKHNvdXJjZSA9PSBzZG1CYWNrZW5kQ29tYm8pCi0gICAJCQkJaGFuZGxlU0RNQ29tYm9TZWxlY3RlZCgpOwotICAgCQl9Ci0gICAgfQotCS8vcHJpdmF0ZSBUZXh0IHNkbVBhdGhUZXh0ID0gbnVsbDsKLQkvL3ByaXZhdGUgVGV4dCBzZG1Ib3N0VGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0IHNkbUJhY2tlbmRQYXRoVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0IHNkbUFyZ3NUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENvbWJvIHNkbUJhY2tlbmRDb21ibyA9IG51bGw7Ci0JCi0gICAgLy9wcml2YXRlIEJ1dHRvbiBzZG1QYXRoQnV0dG9uID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgV2lkZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsKLSAgICAKLQlwdWJsaWMgU0RNUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShuZXcgUHJlZmVyZW5jZXNBZGFwdGVyKFNETURlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKSkpOwotCQlzZXREZXNjcmlwdGlvbihQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1QcmVmZXJlbmNlUGFnZS5zZG1fZGVzYyIpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNpc1ZhbGlkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCS8qCi0JCVN0cmluZyBuYW1lID0gc2RtUGF0aFRleHQuZ2V0VGV4dCgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiU0RNUHJlZmVyZW5jZVBhZ2Uubm9fc2RtIikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUZpbGUgc2RtRmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCQlpZiAoIXNkbUZpbGUuaXNGaWxlKCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1QcmVmZXJlbmNlUGFnZS5TZWxlY3Rpb25fbXVzdF9iZV9maWxlIikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCSovCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeyAKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvL3NkbVBhdGhUZXh0LnNldFRleHQoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9GSUxFKSk7Ci0JCXNkbUFyZ3NUZXh0LnNldFRleHQoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9BUkdTKSk7Ci0JCS8vc2RtSG9zdFRleHQuc2V0VGV4dChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0hPU1QpKTsKLQkJc2RtQmFja2VuZENvbWJvLnNlbGVjdChzZG1CYWNrZW5kQ29tYm8uaW5kZXhPZihzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0JBQ0tFTkRfVFlQRSkpKTsKLQkJc2RtQmFja2VuZFBhdGhUZXh0LnNldFRleHQoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9CQUNLRU5EX1BBVEgpKTsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCVNETURlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50Ci0JICogCi0gICAgICogQHBhcmFtIGV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgIAlzZXRWYWxpZChpc1ZhbGlkKCkpOwotICAgIH0JCi0JCi0JLyoqCi0JICogSGFuZGxlIHNkbSBwYXRoIGJ1dHRvbiBzZWxlY3RlZAotCSAqLwotICAgIC8qCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNETUJ1dHRvblNlbGVjdGVkKCkgewotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJU3RyaW5nIGZpbGVQYXRoID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCXNkbVBhdGhUZXh0LnNldFRleHQoZmlsZVBhdGgpOwotCQl9Ci0JfQotCSovCi0JCi0gICAgLyoqCi0JICogSGFuZGxlIGNvbWJvIHNlbGVjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTRE1Db21ib1NlbGVjdGVkKCkgewotCX0JCi0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL1RPRE8gaWdub3JlZCBoZWxwCi0JCS8vZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJUERlYnVnSGVscENvbnRleHRJZHMuUF9ERUJVR19QUkVGRVJFTkNFX1BBR0UpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNyZWF0ZVNwYWNlcihjb21wb3NpdGUsIDEpOwotCQljcmVhdGVTRE1TZXR0aW5nKGNvbXBvc2l0ZSk7Ci0JCXNldFZhbHVlcygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU0RNU2V0dGluZyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBncm91cCA9IGNyZWF0ZUdyb3VwQ29tcG9zaXRlKHBhcmVudCwgMSwgZmFsc2UsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlNETVByZWZlcmVuY2VQYWdlLnNkbV9ncm91cCIpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBjcmVhdGVDb21wb3NpdGUoZ3JvdXAsIDIpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCS8qCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlNETVByZWZlcmVuY2VQYWdlLnNkbV9ob3N0IikpOwotCQlzZG1Ib3N0VGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJc2RtSG9zdFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNkbUhvc3RUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKi8KLQkJCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dChQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTRE1QcmVmZXJlbmNlUGFnZS5zZG1fYmFja2VuZCIpKTsKLQkJc2RtQmFja2VuZENvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5SRUFEX09OTFkpOwotCQlzZG1CYWNrZW5kQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNkbUJhY2tlbmRDb21iby5zZXRJdGVtcyhTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9CQUNLRU5EUyk7Ci0JCXNkbUJhY2tlbmRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlNETVByZWZlcmVuY2VQYWdlLnNkbV9iYWNrZW5kX3BhdGgiKSk7Ci0JCXNkbUJhY2tlbmRQYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJc2RtQmFja2VuZFBhdGhUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlzZG1CYWNrZW5kUGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJLyoKLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlNETVByZWZlcmVuY2VQYWdlLnNkbV9zZWxlY3Rpb24iKSk7Ci0JCXNkbVBhdGhUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzZG1QYXRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2RtUGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwkJCi0JCXNkbVBhdGhCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcCwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiU0RNUHJlZmVyZW5jZVBhZ2UuYnJvd3NlXzEiKSwgU1dULlBVU0gpOwotCQlzZG1QYXRoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKi8KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlNETVByZWZlcmVuY2VQYWdlLnNkbV9hcmdzIikpOwotCQlzZG1BcmdzVGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJc2RtQXJnc1RleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNkbUFyZ3NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzZXRWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvL3NkbVBhdGhUZXh0LnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0ZJTEUpKTsKLQkJc2RtQXJnc1RleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfQVJHUykpOwotCQkvL3NkbUhvc3RUZXh0LnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0hPU1QpKTsKLQkJc2RtQmFja2VuZENvbWJvLnNlbGVjdChzZG1CYWNrZW5kQ29tYm8uaW5kZXhPZihzdG9yZS5nZXRTdHJpbmcoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfQkFDS0VORF9UWVBFKSkpOwotCQlzZG1CYWNrZW5kUGF0aFRleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfQkFDS0VORF9QQVRIKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI3N0b3JlVmFsdWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvL3N0b3JlLnNldFZhbHVlKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0ZJTEUsIHNkbVBhdGhUZXh0LmdldFRleHQoKSk7Ci0JCXN0b3JlLnNldFZhbHVlKFNETVByZWZlcmVuY2VDb25zdGFudHMuU0RNX0RFQlVHR0VSX0FSR1MsIHNkbUFyZ3NUZXh0LmdldFRleHQoKSk7Ci0JCS8vc3RvcmUuc2V0VmFsdWUoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfSE9TVCwgc2RtSG9zdFRleHQuZ2V0VGV4dCgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoU0RNUHJlZmVyZW5jZUNvbnN0YW50cy5TRE1fREVCVUdHRVJfQkFDS0VORF9UWVBFLCBzZG1CYWNrZW5kQ29tYm8uZ2V0SXRlbShzZG1CYWNrZW5kQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQlzdG9yZS5zZXRWYWx1ZShTRE1QcmVmZXJlbmNlQ29uc3RhbnRzLlNETV9ERUJVR0dFUl9CQUNLRU5EX1BBVEgsIHNkbUJhY2tlbmRQYXRoVGV4dC5nZXRUZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9zZG0vdWkvU0RNRGVidWdVSVBsdWdpbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS91aS9TRE1EZWJ1Z1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Mzk5ZTIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3NkbS91aS9TRE1EZWJ1Z1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTRE1EZWJ1Z1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU0RNRGVidWdVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTRE1EZWJ1Z1VJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU0RNRGVidWdVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkiLCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLy5jZHRwcm9qZWN0IGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS8uY2R0cHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2YWViMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLy5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZS1jZHQgdmVyc2lvbj0iMi4wIj8+Ci0KLTxjZHRwcm9qZWN0IGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2UiPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuTWFjaE8iPgotPGF0dHJpYnV0ZSBrZXk9ImMrK2ZpbHQiIHZhbHVlPSJjKytmaWx0Ii8+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNJbmRleGVyIiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlciIvPgotPGRhdGE+Ci08aXRlbSBpZD0ic2Nhbm5lckNvbmZpZ3VyYXRpb24iPgotPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIi8+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIHVzZURlZmF1bHQ9InRydWUiIGNvbW1hbmQ9ImdjYyIgYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyRmlsZVByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgotPHJ1bkFjdGlvbiB1c2VEZWZhdWx0PSJ0cnVlIiBjb21tYW5kPSJtYWtlIiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIHVzZURlZmF1bHQ9InRydWUiIGNvbW1hbmQ9ImdjYyIgYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIHVzZURlZmF1bHQ9InRydWUiIGNvbW1hbmQ9ImdjYyIgYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTwvaXRlbT4KLTxpdGVtIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5wYXRoZW50cnkiPgotPHBhdGhlbnRyeSBraW5kPSJpbmMiIHBhdGg9IiIgaW5jbHVkZT0iL3Vzci9sb2NhbC9vbXBpL2luY2x1ZGUiIHN5c3RlbT0idHJ1ZSIvPgotPHBhdGhlbnRyeSBraW5kPSJpbmMiIHBhdGg9IiIgaW5jbHVkZT0iL3Vzci9sb2NhbC9vbXBpL2luY2x1ZGUvb3Blbm1waS9vcnRlIiBzeXN0ZW09InRydWUiLz4KLTxwYXRoZW50cnkga2luZD0iaW5jIiBwYXRoPSIiIGluY2x1ZGU9Ii91c3IvbG9jYWwvb21waS9pbmNsdWRlL29wZW5tcGkvb3BhbCIgc3lzdGVtPSJ0cnVlIi8+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9pdGVtPgotPGl0ZW0gaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGR0YXJnZXRzIj4KLTxidWlsZFRhcmdldHM+Ci08dGFyZ2V0IG5hbWU9ImFsbCIgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLk1ha2VUYXJnZXRCdWlsZGVyIiBwYXRoPSIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHMvPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImNsZWFuIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9IiI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD50cnVlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJpbnN0YWxsIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9IiI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+aW5zdGFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08L2J1aWxkVGFyZ2V0cz4KLTwvaXRlbT4KLTwvZGF0YT4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vLmNwcm9qZWN0IGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS8uY3Byb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODM2OWIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS8uY3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZmlsZVZlcnNpb24gNC4wLjA/PgotCi08Y3Byb2plY3Q+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPgotPGNjb25maWd1cmF0aW9uIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjEyMzQ1MjE4MDciPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08L3N0b3JhZ2VNb2R1bGU+Ci0KLQotPHN0b3JhZ2VNb2R1bGUgYnVpbGRTeXN0ZW1JZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZGVmYXVsdENvbmZpZ0RhdGFQcm92aWRlciIgaWQ9ImNvbnZlcnRlZC5jb25maWcuMTIzNDUyMTgwNyIgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIiBuYW1lPSJjb252ZXJ0ZWRDb25maWciPgotPGV4dGVybmFsU2V0dGluZ3MvPgotPGV4dGVuc2lvbnM+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5kb21zb3VyY2VpbmRleGVyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQ0luZGV4ZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLk1hY2hPIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIj4KLTxhdHRyaWJ1dGUga2V5PSJjKytmaWx0IiB2YWx1ZT0iYysrZmlsdCIvPgotPC9leHRlbnNpb24+Ci08L2V4dGVuc2lvbnM+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUubGFuZ3VhZ2UubWFwcGluZyIvPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5wYXRoZW50cnkiPgotPHBhdGhlbnRyeSBpbmNsdWRlPSIvdXNyL2xvY2FsL29wZW5tcGktMS4yLjMvaW5jbHVkZSIga2luZD0iaW5jIiBwYXRoPSIiIHN5c3RlbT0idHJ1ZSIvPgotPHBhdGhlbnRyeSBpbmNsdWRlPSIvdXNyL2xvY2FsL29wZW5tcGktMS4yLjMvaW5jbHVkZS9vcGVubXBpL29ydGUiIGtpbmQ9ImluYyIgcGF0aD0iIiBzeXN0ZW09InRydWUiLz4KLTxwYXRoZW50cnkgaW5jbHVkZT0iL3Vzci9sb2NhbC9vcGVubXBpLTEuMi4zL2luY2x1ZGUvb3Blbm1waS9vcGFsIiBraW5kPSJpbmMiIHBhdGg9IiIgc3lzdGVtPSJ0cnVlIi8+Ci08cGF0aGVudHJ5IGJhc2UtcGF0aD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSIgaW5jbHVkZT0iIiBraW5kPSJpbmMiIHBhdGg9IiIgc3lzdGVtPSJ0cnVlIi8+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS50ZXh0LmNvbW1lbnRPd25lclByb2plY3RNYXBwaW5ncyIvPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGR0YXJnZXRzIj4KLTxidWlsZFRhcmdldHM+Ci08dGFyZ2V0IG5hbWU9ImFsbCIgcGF0aD0iIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHMvPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPHJ1bkFsbEJ1aWxkZXJzPnRydWU8L3J1bkFsbEJ1aWxkZXJzPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImNsZWFuIiBwYXRoPSIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD50cnVlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTxydW5BbGxCdWlsZGVycz50cnVlPC9ydW5BbGxCdWlsZGVycz4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBwYXRoPSIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+aW5zdGFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPHJ1bkFsbEJ1aWxkZXJzPnRydWU8L3J1bkFsbEJ1aWxkZXJzPgotPC90YXJnZXQ+Ci08L2J1aWxkVGFyZ2V0cz4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY2NvbmZpZ3VyYXRpb24+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08L2Nwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS8uY3ZzaWdub3JlIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJhMTYzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS5saWJzCi0uZGVwcwotLmRpcnN0YW1wCi1hdXRvbTR0ZS5jYWNoZQotKi5vCi0qLlBvCi1NYWtlZmlsZQotbGlidG9vbAotc3RhbXAtaDEKLSoubGEKLWNvbmZpZy5oCi0qLmEKLXNkbQotLmdkYl9oaXN0b3J5Ci10ZXN0XyoKLWNvbmZpZy5zdGF0dXMKLWEub3V0LmRTWU0KLXNkbV9tYXN0ZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vLnByb2plY3QgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2E0MmM3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZUJ1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+Y2xlYW4sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLmFyZ3VtZW50czwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0LmNvcmUuZXJyb3JPdXRwdXRQYXJzZXI8L2tleT4KLQkJCQkJPHZhbHVlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLk1ha2VFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5WQ0Vycm9yUGFyc2VyOzwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQXV0b0J1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW52aXJvbm1lbnQ8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlRnVsbEJ1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuaW5jPC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZWRJbmNyZW1lbnRhbEJ1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC5sb2NhdGlvbjwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuY2xlYW48L2tleT4KLQkJCQkJPHZhbHVlPmNsZWFuPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC5jb21tYW5kPC9rZXk+Ci0JCQkJCTx2YWx1ZT5tYWtlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVDbGVhbkJ1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5hcHBlbmRfZW52aXJvbm1lbnQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLnRhcmdldC5mdWxsPC9rZXk+Ci0JCQkJCTx2YWx1ZT5jbGVhbiBhbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnVzZURlZmF1bHRCdWlsZENtZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmF1dG88L2tleT4KLQkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuc3RvcE9uRXJyb3I8L2tleT4KLQkJCQkJPHZhbHVlPmZhbHNlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLlNjYW5uZXJDb25maWdCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLmNuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2VOYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLlNjYW5uZXJDb25maWdOYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jZHQuY29yZS5wcmVmcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVhNTYwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jV2VkIEZlYiAxOCAxMzoyNjoxNyBFU1QgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluZGV4ZXIvZmlsZXNUb1BhcnNlVXBGcm9udD0KLWluZGV4ZXIvaW5kZXhBbGxGaWxlcz1mYWxzZQotaW5kZXhlci9pbmRleGVySWQ9b3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlcgotaW5kZXhlci9za2lwUmVmZXJlbmNlcz1mYWxzZQotaW5kZXhlci9za2lwVHlwZVJlZmVyZW5jZXM9ZmFsc2UKLWluZGV4ZXJJZD1vcmcuZWNsaXBzZS5jZHQuY29yZS5kb21zb3VyY2VpbmRleGVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL0FVVEhPUlMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL0FVVEhPUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1Y2JmYmMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9BVVRIT1JTCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR3JlZyBXYXRzb24gPGcud2F0c29uQGNvbXB1dGVyLm9yZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL0NPUFlJTkcgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2UxMDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi1mb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLW9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi1HT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi1BU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgCi1tYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLQotQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAKLUxBLUNDIDA0LTExNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vQ2hhbmdlTG9nIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9JTlNUQUxMIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBjNDJmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVNlZSBSRUFETUUgZm9yIGJ1aWxkL2luc3RhbGwgaW5zdHJ1Y3Rpb25zLgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2YxYmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0KLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnB0cC5wcm94eSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vTWFrZWZpbGUuYW0gYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmE3ZWM0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotU1VCRElSUyA9CQkJCQlsaWJhaWYKLQotYmluX1BST0dSQU1TID0JCQkJc2RtCi1ub2luc3RfUFJPR1JBTVMgPQkJCXRlc3RfcHJveHkgdGVzdF9wcm94eV9yZXYgdGVzdF9taQotCi1zZG1fU09VUkNFUyA9CQkJCXNyYy9jbGllbnQvc3RhcnR1cC5jXAotCQkJCQkJCXNyYy9jbGllbnQvY2xpZW50LmMgXAotCQkJCQkJCXNyYy9jbGllbnQvY2xpZW50X2NtZHMuYyBcCi0JCQkJCQkJc3JjL3NlcnZlci9zZXJ2ZXIuYyBcCi0JCQkJCQkJc3JjL3NlcnZlci9zZXJ2ZXJfY21kcy5jIFwKLQkJCQkJCQlzcmMvc2VydmVyL2JhY2tlbmQuYyBcCi0JCQkJCQkJc3JjL3NlcnZlci9nZGJtaV9iYWNrZW5kLmMgXAotCQkJCQkJCXNyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMgXAotCQkJCQkJCXNyYy9pbXBsL3NkbS5jIFwKLQkJCQkJCQlzcmMvaW1wbC9zZG1fYWdncmVnYXRlX2hhc2guYyBcCi0JCQkJCQkJc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMgXAotCQkJCQkJCXNyYy9pbXBsL3NkbV9tZXNzYWdlX3RjcGlwLmMgXAotCQkJCQkJCXNyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMgXCBcCi0JCQkJCQkJc3JjL2ltcGwvc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5jIFwKLQkJCQkJCQlzcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jCi0JCQkJCQotc2RtX0NGTEFHUyA9CQkJCS1JLi9pbmNsdWRlIC1JLi9saWJhaWYgLUkuL3NyYy9taSAkKEFNX0NGTEFHUykKLXNkbV9MREFERCA9CQkJCQlsaWJkYmd1dGlscy5hIGxpYm1pLmEgbGliYWlmL2xpYmFpZi5hIEBTVlJfTElCU0AKLQotdGVzdF9wcm94eV9TT1VSQ0VTID0JCXNyYy90ZXN0L3Rlc3RfcHJveHkuYyBcCi0JCQkJCQkJc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMKLXRlc3RfcHJveHlfQ0ZMQUdTID0JCQktSS4vaW5jbHVkZSAtSS4vbGliYWlmICQoQU1fQ0ZMQUdTKSAtZwotdGVzdF9wcm94eV9MREZMQUdTID0gCQktZwotdGVzdF9wcm94eV9MREFERCA9CQkJbGliZGJnY2xudC5hIGxpYmRiZ3V0aWxzLmEgbGliYWlmL2xpYmFpZi5hIEBDTE5UX0xJQlNACi0KLXRlc3RfcHJveHlfcmV2X1NPVVJDRVMgPQlzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jIFwKLQkJCQkJCQlzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYwotdGVzdF9wcm94eV9yZXZfQ0ZMQUdTID0JCS1JLi9pbmNsdWRlIC1JLi9saWJhaWYgJChBTV9DRkxBR1MpIC1nCi10ZXN0X3Byb3h5X3Jldl9MREZMQUdTID0gCS1nCi10ZXN0X3Byb3h5X3Jldl9MREFERCA9CQlsaWJkYmdjbG50LmEgbGliZGJndXRpbHMuYSBsaWJhaWYvbGliYWlmLmEgQENMTlRfTElCU0AKLQotdGVzdF9taV9TT1VSQ0VTID0JCQlzcmMvbWkvdGVzdF9taS5jCi10ZXN0X21pX0NGTEFHUyA9CQkJLUkuL2luY2x1ZGUgLUkuL3NyYy9taSAkKEFNX0NGTEFHUykgLWcKLXRlc3RfbWlfTERGTEFHUyA9IAkJCS1nCi10ZXN0X21pX0xEQUREID0JCQkJbGlibWkuYQotCi1ub2luc3RfSEVBREVSUyA9CQkJaW5jbHVkZS9iYWNrZW5kLmggXAotCQkJCQkJCWluY2x1ZGUvYnJlYWtwb2ludC5oIFwKLQkJCQkJCQlpbmNsdWRlL2RiZ19jbGllbnQuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmdfZXJyb3IuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmdfZXZlbnQuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmdfcHJveHkuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmcuaCBcCi0JCQkJCQkJaW5jbHVkZS9oZWxsb3Byb3RvLmggXAotCQkJCQkJCWluY2x1ZGUvaXRpbWVyLmggXAotCQkJCQkJCWluY2x1ZGUvbG9jYXRpb24uaCBcCi0JCQkJCQkJaW5jbHVkZS9tZW1vcnlpbmZvLmggXAotCQkJCQkJCWluY2x1ZGUvcm91dGluZ190YWJsZS5oIFwKLQkJCQkJCQlpbmNsdWRlL3NkbS5oIFwKLQkJCQkJCQlpbmNsdWRlL3Nlc3Npb24uaCBcCi0JCQkJCQkJaW5jbHVkZS9zaWduYWxpbmZvLmggXAotCQkJCQkJCWluY2x1ZGUvc3RhY2tmcmFtZS5oCi0KLW5vaW5zdF9MSUJSQVJJRVMgPQkJCWxpYmRiZ2NsbnQuYSBsaWJkYmd1dGlscy5hIGxpYm1pLmEKLQotbGliZGJnY2xudF9hX1NPVVJDRVMgPQkJc3JjL2NsaWVudC9jbGllbnRfaW50ZXJmYWNlLmMgCi1saWJkYmdjbG50X2FfQ0ZMQUdTID0JCS1JLi9pbmNsdWRlIC1JLi9saWJhaWYgJChBTV9DRkxBR1MpIC1nCi0KLWxpYmRiZ3V0aWxzX2FfU09VUkNFUyA9CQlzcmMvdXRpbHMvZXJyb3IuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL2JyZWFrcG9pbnQuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL3N0YWNrZnJhbWUuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL2V2ZW50LmMgXAotCQkJCQkJCXNyYy91dGlscy9pdGltZXIuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL21lbW9yeWluZm8uYyBcCi0JCQkJCQkJc3JjL3V0aWxzL3NpZ25hbGluZm8uYyBcCi0JCQkJCQkJc3JjL3V0aWxzL2RlYnVnLmMKLQkJCQkJCQotbGliZGJndXRpbHNfYV9DRkxBR1MgPQkJLUkuL2luY2x1ZGUgLUkuL2xpYmFpZiAkKEFNX0NGTEFHUykgLWcKLQotbGlibWlfYV9TT1VSQ0VTID0JCQlzcmMvbWkvTUlQYXJzZXIuYyBcCi0JCQkJCQkJc3JjL21pL01JT09CUmVjb3JkLmMgXAotCQkJCQkJCXNyYy9taS9NSU91dHB1dC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlSZXN1bHQuYyBcCi0JCQkJCQkJc3JjL21pL01JUmVzdWx0UmVjb3JkLmMgXAotCQkJCQkJCXNyYy9taS9NSVZhbHVlLmMgXAotCQkJCQkJCXNyYy9taS9NSVN0cmluZy5jIFwKLQkJCQkJCQlzcmMvbWkvTUlCcmVha3BvaW50LmMgXAotCQkJCQkJCXNyYy9taS9NSUZyYW1lLmMgXAotCQkJCQkJCXNyYy9taS9NSVRocmVhZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlBcmcuYyBcCi0JCQkJCQkJc3JjL21pL01JVmFyLmMgXAotCQkJCQkJCXNyYy9taS9NSUV2ZW50LmMgXAotCQkJCQkJCXNyYy9taS9NSUNvbW1hbmQuYyBcCi0JCQkJCQkJc3JjL21pL01JR0RCQ29tbWFuZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlFeGVjQ29tbWFuZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlCcmVha0NvbW1hbmQuYyBcCi0JCQkJCQkJc3JjL21pL01JU3RhY2tDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9NSVZhckNvbW1hbmQuYyBcCi0JCQkJCQkJc3JjL21pL01JRXJyb3IuYyBcCi0JCQkJCQkJc3JjL21pL01JU2Vzc2lvbi5jIFwKLQkJCQkJCQlzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9NSU1lbW9yeS5jIFwKLQkJCQkJCQlzcmMvbWkvTUlNZW1vcnlDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9DTElDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9DTElPdXRwdXQuYwotCQkJCQkJCi1saWJtaV9hX0NGTEFHUyA9CQkJLUkuL2luY2x1ZGUgJChBTV9DRkxBR1MpIC1nCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL01ha2VmaWxlLmluIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyZTRlYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTkyNSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotCi0KLVZQQVRIID0gQHNyY2RpckAKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotYmluX1BST0dSQU1TID0gc2RtJChFWEVFWFQpCi1ub2luc3RfUFJPR1JBTVMgPSB0ZXN0X3Byb3h5JChFWEVFWFQpIHRlc3RfcHJveHlfcmV2JChFWEVFWFQpIFwKLQl0ZXN0X21pJChFWEVFWFQpCi1zdWJkaXIgPSAuCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChub2luc3RfSEVBREVSUykgXAotCSQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAotCSQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSBBVVRIT1JTIENPUFlJTkcgXAotCUNoYW5nZUxvZyBJTlNUQUxMIE5FV1MgY29tcGlsZSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBkZXBjb21wIFwKLQlpbnN0YWxsLXNoIGx0bWFpbi5zaCBtaXNzaW5nCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLWFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCi0gY29uZmlndXJlLmxpbmVubyBjb25maWcuc3RhdHVzLmxpbmVubwotbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0KLUxJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKLUFSID0gYXIKLUFSRkxBR1MgPSBjcnUKLWxpYmRiZ2NsbnRfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKLWxpYmRiZ2NsbnRfYV9MSUJBREQgPQotYW1fX2RpcnN0YW1wID0gJChhbV9fbGVhZGluZ19kb3QpZGlyc3RhbXAKLWFtX2xpYmRiZ2NsbnRfYV9PQkpFQ1RTID0gIFwKLQlzcmMvY2xpZW50L2xpYmRiZ2NsbnRfYS1jbGllbnRfaW50ZXJmYWNlLiQoT0JKRVhUKQotbGliZGJnY2xudF9hX09CSkVDVFMgPSAkKGFtX2xpYmRiZ2NsbnRfYV9PQkpFQ1RTKQotbGliZGJndXRpbHNfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKLWxpYmRiZ3V0aWxzX2FfTElCQUREID0KLWFtX2xpYmRiZ3V0aWxzX2FfT0JKRUNUUyA9IHNyYy91dGlscy9saWJkYmd1dGlsc19hLWVycm9yLiQoT0JKRVhUKSBcCi0Jc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC4kKE9CSkVYVCkgXAotCXNyYy91dGlscy9saWJkYmd1dGlsc19hLXN0YWNrZnJhbWUuJChPQkpFWFQpIFwKLQlzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC4kKE9CSkVYVCkgXAotCXNyYy91dGlscy9saWJkYmd1dGlsc19hLWl0aW1lci4kKE9CSkVYVCkgXAotCXNyYy91dGlscy9saWJkYmd1dGlsc19hLW1lbW9yeWluZm8uJChPQkpFWFQpIFwKLQlzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zaWduYWxpbmZvLiQoT0JKRVhUKSBcCi0Jc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZGVidWcuJChPQkpFWFQpCi1saWJkYmd1dGlsc19hX09CSkVDVFMgPSAkKGFtX2xpYmRiZ3V0aWxzX2FfT0JKRUNUUykKLWxpYm1pX2FfQVIgPSAkKEFSKSAkKEFSRkxBR1MpCi1saWJtaV9hX0xJQkFERCA9Ci1hbV9saWJtaV9hX09CSkVDVFMgPSBzcmMvbWkvbGlibWlfYS1NSVBhcnNlci4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JT09CUmVjb3JkLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlPdXRwdXQuJChPQkpFWFQpIFwKLQlzcmMvbWkvbGlibWlfYS1NSVJlc3VsdC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlWYWx1ZS4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JU3RyaW5nLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50LiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlGcmFtZS4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JVGhyZWFkLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlBcmcuJChPQkpFWFQpIHNyYy9taS9saWJtaV9hLU1JVmFyLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlFdmVudC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JQ29tbWFuZC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JR0RCQ29tbWFuZC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JRXhlY0NvbW1hbmQuJChPQkpFWFQpIFwKLQlzcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlWYXJDb21tYW5kLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlFcnJvci4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JU2Vzc2lvbi4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLU1JTWVtb3J5LiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtTUlNZW1vcnlDb21tYW5kLiQoT0JKRVhUKSBcCi0Jc3JjL21pL2xpYm1pX2EtQ0xJQ29tbWFuZC4kKE9CSkVYVCkgXAotCXNyYy9taS9saWJtaV9hLUNMSU91dHB1dC4kKE9CSkVYVCkKLWxpYm1pX2FfT0JKRUNUUyA9ICQoYW1fbGlibWlfYV9PQkpFQ1RTKQotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGJpbmRpcikiCi1iaW5QUk9HUkFNU19JTlNUQUxMID0gJChJTlNUQUxMX1BST0dSQU0pCi1QUk9HUkFNUyA9ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLWFtX3NkbV9PQkpFQ1RTID0gc3JjL2NsaWVudC9zZG0tc3RhcnR1cC4kKE9CSkVYVCkgXAotCXNyYy9jbGllbnQvc2RtLWNsaWVudC4kKE9CSkVYVCkgXAotCXNyYy9jbGllbnQvc2RtLWNsaWVudF9jbWRzLiQoT0JKRVhUKSBcCi0Jc3JjL3NlcnZlci9zZG0tc2VydmVyLiQoT0JKRVhUKSBcCi0Jc3JjL3NlcnZlci9zZG0tc2VydmVyX2NtZHMuJChPQkpFWFQpIFwKLQlzcmMvc2VydmVyL3NkbS1iYWNrZW5kLiQoT0JKRVhUKSBcCi0Jc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC4kKE9CSkVYVCkgXAotCXNyYy9zZXJ2ZXIvc2RtLXRlc3RfYmFja2VuZC4kKE9CSkVYVCkgXAotCXNyYy9pbXBsL3NkbS1zZG0uJChPQkpFWFQpIFwKLQlzcmMvaW1wbC9zZG0tc2RtX2FnZ3JlZ2F0ZV9oYXNoLiQoT0JKRVhUKSBcCi0Jc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by4kKE9CSkVYVCkgXAotCXNyYy9pbXBsL3NkbS1zZG1fbWVzc2FnZV90Y3BpcC4kKE9CSkVYVCkgXAotCXNyYy9pbXBsL3NkbS1zZG1fcm91dGVfdHJlZS4kKE9CSkVYVCkgXAotCXNyYy9pbXBsL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLiQoT0JKRVhUKSBcCi0Jc3JjL2ltcGwvc2RtLXNkbV9zZXRfYml0c2V0LiQoT0JKRVhUKQotc2RtX09CSkVDVFMgPSAkKGFtX3NkbV9PQkpFQ1RTKQotc2RtX0RFUEVOREVOQ0lFUyA9IGxpYmRiZ3V0aWxzLmEgbGlibWkuYSBsaWJhaWYvbGliYWlmLmEKLXNkbV9MSU5LID0gJChDQ0xEKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gXAotCSRACi1hbV90ZXN0X21pX09CSkVDVFMgPSBzcmMvbWkvdGVzdF9taS10ZXN0X21pLiQoT0JKRVhUKQotdGVzdF9taV9PQkpFQ1RTID0gJChhbV90ZXN0X21pX09CSkVDVFMpCi10ZXN0X21pX0RFUEVOREVOQ0lFUyA9IGxpYm1pLmEKLXRlc3RfbWlfTElOSyA9ICQoQ0NMRCkgJCh0ZXN0X21pX0NGTEFHUykgJChDRkxBR1MpICQodGVzdF9taV9MREZMQUdTKSBcCi0JJChMREZMQUdTKSAtbyAkQAotYW1fdGVzdF9wcm94eV9PQkpFQ1RTID0gc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5LiQoT0JKRVhUKSBcCi0Jc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5X2NsbnQuJChPQkpFWFQpCi10ZXN0X3Byb3h5X09CSkVDVFMgPSAkKGFtX3Rlc3RfcHJveHlfT0JKRUNUUykKLXRlc3RfcHJveHlfREVQRU5ERU5DSUVTID0gbGliZGJnY2xudC5hIGxpYmRiZ3V0aWxzLmEgbGliYWlmL2xpYmFpZi5hCi10ZXN0X3Byb3h5X0xJTksgPSAkKENDTEQpICQodGVzdF9wcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSBcCi0JJCh0ZXN0X3Byb3h5X0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLWFtX3Rlc3RfcHJveHlfcmV2X09CSkVDVFMgPSAgXAotCXNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2LiQoT0JKRVhUKSBcCi0Jc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50LiQoT0JKRVhUKQotdGVzdF9wcm94eV9yZXZfT0JKRUNUUyA9ICQoYW1fdGVzdF9wcm94eV9yZXZfT0JKRUNUUykKLXRlc3RfcHJveHlfcmV2X0RFUEVOREVOQ0lFUyA9IGxpYmRiZ2NsbnQuYSBsaWJkYmd1dGlscy5hIFwKLQlsaWJhaWYvbGliYWlmLmEKLXRlc3RfcHJveHlfcmV2X0xJTksgPSAkKENDTEQpICQodGVzdF9wcm94eV9yZXZfQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQodGVzdF9wcm94eV9yZXZfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AKLWRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKLWFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKLQkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1TT1VSQ0VTID0gJChsaWJkYmdjbG50X2FfU09VUkNFUykgJChsaWJkYmd1dGlsc19hX1NPVVJDRVMpIFwKLQkkKGxpYm1pX2FfU09VUkNFUykgJChzZG1fU09VUkNFUykgJCh0ZXN0X21pX1NPVVJDRVMpIFwKLQkkKHRlc3RfcHJveHlfU09VUkNFUykgJCh0ZXN0X3Byb3h5X3Jldl9TT1VSQ0VTKQotRElTVF9TT1VSQ0VTID0gJChsaWJkYmdjbG50X2FfU09VUkNFUykgJChsaWJkYmd1dGlsc19hX1NPVVJDRVMpIFwKLQkkKGxpYm1pX2FfU09VUkNFUykgJChzZG1fU09VUkNFUykgJCh0ZXN0X21pX1NPVVJDRVMpIFwKLQkkKHRlc3RfcHJveHlfU09VUkNFUykgJCh0ZXN0X3Byb3h5X3Jldl9TT1VSQ0VTKQotUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLQlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLQlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi0JaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLQlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAotCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAotCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCi1IRUFERVJTID0gJChub2luc3RfSEVBREVSUykKLVJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTID0gbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZQlcCi0gIGRpc3RjbGVhbi1yZWN1cnNpdmUgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLWFtX19yZW1vdmVfZGlzdGRpciA9IFwKLSAgeyB0ZXN0ICEgLWQgJChkaXN0ZGlyKSBcCi0gICAgfHwgeyBmaW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC0yMDAgLWV4ZWMgY2htb2QgdSt3IHt9ICc7JyBcCi0gICAgICAgICAmJiBybSAtZnIgJChkaXN0ZGlyKTsgfTsgfQotRElTVF9BUkNISVZFUyA9ICQoZGlzdGRpcikudGFyLmd6Ci1HWklQX0VOViA9IC0tYmVzdAotZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAotZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNMTlRfTElCUyA9IEBDTE5UX0xJQlNACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUdSRVAgPSBAR1JFUEAKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtESVJfUCA9IEBNS0RJUl9QQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1TVlJfTElCUyA9IEBTVlJfTElCU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWFic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACi1hYnNfc3JjZGlyID0gQGFic19zcmNkaXJACi1hYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACi1hYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKLWFjX2N0X0NDID0gQGFjX2N0X0NDQAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWh0bWxkaXIgPSBAaHRtbGRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLWluc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKLWxpYmRpciA9IEBsaWJkaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1sb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLW1rZGlyX3AgPSBAbWtkaXJfcEAKLW9sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKLXBkZmRpciA9IEBwZGZkaXJACi1wcmVmaXggPSBAcHJlZml4QAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotcHNkaXIgPSBAcHNkaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLXNyY2RpciA9IEBzcmNkaXJACi1zdWJkaXJzID0gQHN1YmRpcnNACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVNVQkRJUlMgPSBsaWJhaWYKLXNkbV9TT1VSQ0VTID0gc3JjL2NsaWVudC9zdGFydHVwLmNcCi0JCQkJCQkJc3JjL2NsaWVudC9jbGllbnQuYyBcCi0JCQkJCQkJc3JjL2NsaWVudC9jbGllbnRfY21kcy5jIFwKLQkJCQkJCQlzcmMvc2VydmVyL3NlcnZlci5jIFwKLQkJCQkJCQlzcmMvc2VydmVyL3NlcnZlcl9jbWRzLmMgXAotCQkJCQkJCXNyYy9zZXJ2ZXIvYmFja2VuZC5jIFwKLQkJCQkJCQlzcmMvc2VydmVyL2dkYm1pX2JhY2tlbmQuYyBcCi0JCQkJCQkJc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYyBcCi0JCQkJCQkJc3JjL2ltcGwvc2RtLmMgXAotCQkJCQkJCXNyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jIFwKLQkJCQkJCQlzcmMvaW1wbC9zZG1faGVsbG9fcHJvdG8uYyBcCi0JCQkJCQkJc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYyBcCi0JCQkJCQkJc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYyBcIFwKLQkJCQkJCQlzcmMvaW1wbC9zZG1fcm91dGluZ190YWJsZV9maWxlLmMgXAotCQkJCQkJCXNyYy9pbXBsL3NkbV9zZXRfYml0c2V0LmMKLQotc2RtX0NGTEFHUyA9IC1JLi9pbmNsdWRlIC1JLi9saWJhaWYgLUkuL3NyYy9taSAkKEFNX0NGTEFHUykKLXNkbV9MREFERCA9IGxpYmRiZ3V0aWxzLmEgbGlibWkuYSBsaWJhaWYvbGliYWlmLmEgQFNWUl9MSUJTQAotdGVzdF9wcm94eV9TT1VSQ0VTID0gc3JjL3Rlc3QvdGVzdF9wcm94eS5jIFwKLQkJCQkJCQlzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYwotCi10ZXN0X3Byb3h5X0NGTEFHUyA9IC1JLi9pbmNsdWRlIC1JLi9saWJhaWYgJChBTV9DRkxBR1MpIC1nCi10ZXN0X3Byb3h5X0xERkxBR1MgPSAtZwotdGVzdF9wcm94eV9MREFERCA9IGxpYmRiZ2NsbnQuYSBsaWJkYmd1dGlscy5hIGxpYmFpZi9saWJhaWYuYSBAQ0xOVF9MSUJTQAotdGVzdF9wcm94eV9yZXZfU09VUkNFUyA9IHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMgXAotCQkJCQkJCXNyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jCi0KLXRlc3RfcHJveHlfcmV2X0NGTEFHUyA9IC1JLi9pbmNsdWRlIC1JLi9saWJhaWYgJChBTV9DRkxBR1MpIC1nCi10ZXN0X3Byb3h5X3Jldl9MREZMQUdTID0gLWcKLXRlc3RfcHJveHlfcmV2X0xEQUREID0gbGliZGJnY2xudC5hIGxpYmRiZ3V0aWxzLmEgbGliYWlmL2xpYmFpZi5hIEBDTE5UX0xJQlNACi10ZXN0X21pX1NPVVJDRVMgPSBzcmMvbWkvdGVzdF9taS5jCi10ZXN0X21pX0NGTEFHUyA9IC1JLi9pbmNsdWRlIC1JLi9zcmMvbWkgJChBTV9DRkxBR1MpIC1nCi10ZXN0X21pX0xERkxBR1MgPSAtZwotdGVzdF9taV9MREFERCA9IGxpYm1pLmEKLW5vaW5zdF9IRUFERVJTID0gaW5jbHVkZS9iYWNrZW5kLmggXAotCQkJCQkJCWluY2x1ZGUvYnJlYWtwb2ludC5oIFwKLQkJCQkJCQlpbmNsdWRlL2RiZ19jbGllbnQuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmdfZXJyb3IuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmdfZXZlbnQuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmdfcHJveHkuaCBcCi0JCQkJCQkJaW5jbHVkZS9kYmcuaCBcCi0JCQkJCQkJaW5jbHVkZS9oZWxsb3Byb3RvLmggXAotCQkJCQkJCWluY2x1ZGUvaXRpbWVyLmggXAotCQkJCQkJCWluY2x1ZGUvbG9jYXRpb24uaCBcCi0JCQkJCQkJaW5jbHVkZS9tZW1vcnlpbmZvLmggXAotCQkJCQkJCWluY2x1ZGUvcm91dGluZ190YWJsZS5oIFwKLQkJCQkJCQlpbmNsdWRlL3NkbS5oIFwKLQkJCQkJCQlpbmNsdWRlL3Nlc3Npb24uaCBcCi0JCQkJCQkJaW5jbHVkZS9zaWduYWxpbmZvLmggXAotCQkJCQkJCWluY2x1ZGUvc3RhY2tmcmFtZS5oCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJkYmdjbG50LmEgbGliZGJndXRpbHMuYSBsaWJtaS5hCi1saWJkYmdjbG50X2FfU09VUkNFUyA9IHNyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jIAotbGliZGJnY2xudF9hX0NGTEFHUyA9IC1JLi9pbmNsdWRlIC1JLi9saWJhaWYgJChBTV9DRkxBR1MpIC1nCi1saWJkYmd1dGlsc19hX1NPVVJDRVMgPSBzcmMvdXRpbHMvZXJyb3IuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL2JyZWFrcG9pbnQuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL3N0YWNrZnJhbWUuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL2V2ZW50LmMgXAotCQkJCQkJCXNyYy91dGlscy9pdGltZXIuYyBcCi0JCQkJCQkJc3JjL3V0aWxzL21lbW9yeWluZm8uYyBcCi0JCQkJCQkJc3JjL3V0aWxzL3NpZ25hbGluZm8uYyBcCi0JCQkJCQkJc3JjL3V0aWxzL2RlYnVnLmMKLQotbGliZGJndXRpbHNfYV9DRkxBR1MgPSAtSS4vaW5jbHVkZSAtSS4vbGliYWlmICQoQU1fQ0ZMQUdTKSAtZwotbGlibWlfYV9TT1VSQ0VTID0gc3JjL21pL01JUGFyc2VyLmMgXAotCQkJCQkJCXNyYy9taS9NSU9PQlJlY29yZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlPdXRwdXQuYyBcCi0JCQkJCQkJc3JjL21pL01JUmVzdWx0LmMgXAotCQkJCQkJCXNyYy9taS9NSVJlc3VsdFJlY29yZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlWYWx1ZS5jIFwKLQkJCQkJCQlzcmMvbWkvTUlTdHJpbmcuYyBcCi0JCQkJCQkJc3JjL21pL01JQnJlYWtwb2ludC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlGcmFtZS5jIFwKLQkJCQkJCQlzcmMvbWkvTUlUaHJlYWQuYyBcCi0JCQkJCQkJc3JjL21pL01JQXJnLmMgXAotCQkJCQkJCXNyYy9taS9NSVZhci5jIFwKLQkJCQkJCQlzcmMvbWkvTUlFdmVudC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9NSUdEQkNvbW1hbmQuYyBcCi0JCQkJCQkJc3JjL21pL01JRXhlY0NvbW1hbmQuYyBcCi0JCQkJCQkJc3JjL21pL01JQnJlYWtDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9NSVN0YWNrQ29tbWFuZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlWYXJDb21tYW5kLmMgXAotCQkJCQkJCXNyYy9taS9NSUVycm9yLmMgXAotCQkJCQkJCXNyYy9taS9NSVNlc3Npb24uYyBcCi0JCQkJCQkJc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jIFwKLQkJCQkJCQlzcmMvbWkvTUlNZW1vcnkuYyBcCi0JCQkJCQkJc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jIFwKLQkJCQkJCQlzcmMvbWkvQ0xJQ29tbWFuZC5jIFwKLQkJCQkJCQlzcmMvbWkvQ0xJT3V0cHV0LmMKLQotbGlibWlfYV9DRkxBR1MgPSAtSS4vaW5jbHVkZSAkKEFNX0NGTEFHUykgLWcKLWFsbDogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLm9iagotYW0tLXJlZnJlc2g6Ci0JQDoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAnOyBcCi0JICAgICAgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBcCi0JCSYmIGV4aXQgMDsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIE1ha2VmaWxlJzsgXAotCWNkICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgIE1ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgZWNobyAnICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyc7IFwKLQkgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCi0KLWNvbmZpZy5oOiBzdGFtcC1oMQotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCSAgcm0gLWYgc3RhbXAtaDE7IFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHN0YW1wLWgxOyBcCi0JZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotJChzcmNkaXIpL2NvbmZpZy5oLmluOiAgJChhbV9fY29uZmlndXJlX2RlcHMpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCXJtIC1mIHN0YW1wLWgxCi0JdG91Y2ggJEAKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmggc3RhbXAtaDEKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi1zcmMvY2xpZW50LyQoYW1fX2RpcnN0YW1wKToKLQlAJChNS0RJUl9QKSBzcmMvY2xpZW50Ci0JQDogPiBzcmMvY2xpZW50LyQoYW1fX2RpcnN0YW1wKQotc3JjL2NsaWVudC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgotCUAkKE1LRElSX1ApIHNyYy9jbGllbnQvJChERVBESVIpCi0JQDogPiBzcmMvY2xpZW50LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9jbGllbnQvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UuJChPQkpFWFQpOiAgXAotCXNyYy9jbGllbnQvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvY2xpZW50LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLWxpYmRiZ2NsbnQuYTogJChsaWJkYmdjbG50X2FfT0JKRUNUUykgJChsaWJkYmdjbG50X2FfREVQRU5ERU5DSUVTKSAKLQktcm0gLWYgbGliZGJnY2xudC5hCi0JJChsaWJkYmdjbG50X2FfQVIpIGxpYmRiZ2NsbnQuYSAkKGxpYmRiZ2NsbnRfYV9PQkpFQ1RTKSAkKGxpYmRiZ2NsbnRfYV9MSUJBREQpCi0JJChSQU5MSUIpIGxpYmRiZ2NsbnQuYQotc3JjL3V0aWxzLyQoYW1fX2RpcnN0YW1wKToKLQlAJChNS0RJUl9QKSBzcmMvdXRpbHMKLQlAOiA+IHNyYy91dGlscy8kKGFtX19kaXJzdGFtcCkKLXNyYy91dGlscy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgotCUAkKE1LRElSX1ApIHNyYy91dGlscy8kKERFUERJUikKLQlAOiA+IHNyYy91dGlscy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci4kKE9CSkVYVCk6IHNyYy91dGlscy8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy91dGlscy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1icmVha3BvaW50LiQoT0JKRVhUKTogIFwKLQlzcmMvdXRpbHMvJChhbV9fZGlyc3RhbXApIHNyYy91dGlscy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLiQoT0JKRVhUKTogIFwKLQlzcmMvdXRpbHMvJChhbV9fZGlyc3RhbXApIHNyYy91dGlscy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC4kKE9CSkVYVCk6IHNyYy91dGlscy8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy91dGlscy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIuJChPQkpFWFQpOiBzcmMvdXRpbHMvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvdXRpbHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby4kKE9CSkVYVCk6ICBcCi0Jc3JjL3V0aWxzLyQoYW1fX2RpcnN0YW1wKSBzcmMvdXRpbHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby4kKE9CSkVYVCk6ICBcCi0Jc3JjL3V0aWxzLyQoYW1fX2RpcnN0YW1wKSBzcmMvdXRpbHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZGVidWcuJChPQkpFWFQpOiBzcmMvdXRpbHMvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvdXRpbHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotbGliZGJndXRpbHMuYTogJChsaWJkYmd1dGlsc19hX09CSkVDVFMpICQobGliZGJndXRpbHNfYV9ERVBFTkRFTkNJRVMpIAotCS1ybSAtZiBsaWJkYmd1dGlscy5hCi0JJChsaWJkYmd1dGlsc19hX0FSKSBsaWJkYmd1dGlscy5hICQobGliZGJndXRpbHNfYV9PQkpFQ1RTKSAkKGxpYmRiZ3V0aWxzX2FfTElCQUREKQotCSQoUkFOTElCKSBsaWJkYmd1dGlscy5hCi1zcmMvbWkvJChhbV9fZGlyc3RhbXApOgotCUAkKE1LRElSX1ApIHNyYy9taQotCUA6ID4gc3JjL21pLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6Ci0JQCQoTUtESVJfUCkgc3JjL21pLyQoREVQRElSKQotCUA6ID4gc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JUGFyc2VyLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JT09CUmVjb3JkLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JT3V0cHV0LiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JUmVzdWx0LiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JVmFsdWUuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50LiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JRnJhbWUuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlBcmcuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlWYXIuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlFdmVudC4kKE9CSkVYVCk6IHNyYy9taS8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9taS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvbWkvbGlibWlfYS1NSUNvbW1hbmQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlHREJDb21tYW5kLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JRXhlY0NvbW1hbmQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlCcmVha0NvbW1hbmQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlWYXJDb21tYW5kLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JRXJyb3IuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtTUlTZXNzaW9uLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC4kKE9CSkVYVCk6IHNyYy9taS8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9taS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvbWkvbGlibWlfYS1NSU1lbW9yeS4kKE9CSkVYVCk6IHNyYy9taS8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9taS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL21pL2xpYm1pX2EtQ0xJQ29tbWFuZC4kKE9CSkVYVCk6IHNyYy9taS8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9taS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvbWkvbGlibWlfYS1DTElPdXRwdXQuJChPQkpFWFQpOiBzcmMvbWkvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvbWkvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotbGlibWkuYTogJChsaWJtaV9hX09CSkVDVFMpICQobGlibWlfYV9ERVBFTkRFTkNJRVMpIAotCS1ybSAtZiBsaWJtaS5hCi0JJChsaWJtaV9hX0FSKSBsaWJtaS5hICQobGlibWlfYV9PQkpFQ1RTKSAkKGxpYm1pX2FfTElCQUREKQotCSQoUkFOTElCKSBsaWJtaS5hCi1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKGJpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgcDE9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKLQkgIGlmIHRlc3QgLWYgJCRwIFwKLQkgIDsgdGhlbiBcCi0JICAgIGY9YGVjaG8gIiQkcDEiIHwgc2VkICdzLF4uKi8sLDskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICckJHAnICckKERFU1RESVIpJChiaW5kaXIpLyQkZiciOyBcCi0JICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICIkJHAiICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBmPWBlY2hvICIkJHAiIHwgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKLQkgIHJtIC1mICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiI7IFwKLQlkb25lCi0KLWNsZWFuLWJpblBST0dSQU1TOgotCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLXNyYy9jbGllbnQvc2RtLXN0YXJ0dXAuJChPQkpFWFQpOiBzcmMvY2xpZW50LyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL2NsaWVudC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvY2xpZW50L3NkbS1jbGllbnQuJChPQkpFWFQpOiBzcmMvY2xpZW50LyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL2NsaWVudC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy4kKE9CSkVYVCk6IHNyYy9jbGllbnQvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvY2xpZW50LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9zZXJ2ZXIvJChhbV9fZGlyc3RhbXApOgotCUAkKE1LRElSX1ApIHNyYy9zZXJ2ZXIKLQlAOiA+IHNyYy9zZXJ2ZXIvJChhbV9fZGlyc3RhbXApCi1zcmMvc2VydmVyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6Ci0JQCQoTUtESVJfUCkgc3JjL3NlcnZlci8kKERFUERJUikKLQlAOiA+IHNyYy9zZXJ2ZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3NlcnZlci9zZG0tc2VydmVyLiQoT0JKRVhUKTogc3JjL3NlcnZlci8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9zZXJ2ZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3NlcnZlci9zZG0tc2VydmVyX2NtZHMuJChPQkpFWFQpOiBzcmMvc2VydmVyLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL3NlcnZlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvc2VydmVyL3NkbS1iYWNrZW5kLiQoT0JKRVhUKTogc3JjL3NlcnZlci8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9zZXJ2ZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC4kKE9CSkVYVCk6IHNyYy9zZXJ2ZXIvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvc2VydmVyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9zZXJ2ZXIvc2RtLXRlc3RfYmFja2VuZC4kKE9CSkVYVCk6IHNyYy9zZXJ2ZXIvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvc2VydmVyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9pbXBsLyQoYW1fX2RpcnN0YW1wKToKLQlAJChNS0RJUl9QKSBzcmMvaW1wbAotCUA6ID4gc3JjL2ltcGwvJChhbV9fZGlyc3RhbXApCi1zcmMvaW1wbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgotCUAkKE1LRElSX1ApIHNyYy9pbXBsLyQoREVQRElSKQotCUA6ID4gc3JjL2ltcGwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL2ltcGwvc2RtLXNkbS4kKE9CSkVYVCk6IHNyYy9pbXBsLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL2ltcGwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC4kKE9CSkVYVCk6IHNyYy9pbXBsLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL2ltcGwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by4kKE9CSkVYVCk6IHNyYy9pbXBsLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL2ltcGwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL2ltcGwvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLiQoT0JKRVhUKTogc3JjL2ltcGwvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvaW1wbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUuJChPQkpFWFQpOiBzcmMvaW1wbC8kKGFtX19kaXJzdGFtcCkgXAotCXNyYy9pbXBsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy9pbXBsL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLiQoT0JKRVhUKTogIFwKLQlzcmMvaW1wbC8kKGFtX19kaXJzdGFtcCkgc3JjL2ltcGwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL2ltcGwvc2RtLXNkbV9zZXRfYml0c2V0LiQoT0JKRVhUKTogc3JjL2ltcGwvJChhbV9fZGlyc3RhbXApIFwKLQlzcmMvaW1wbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zZG0kKEVYRUVYVCk6ICQoc2RtX09CSkVDVFMpICQoc2RtX0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHNkbSQoRVhFRVhUKQotCSQoc2RtX0xJTkspICQoc2RtX09CSkVDVFMpICQoc2RtX0xEQUREKSAkKExJQlMpCi1zcmMvbWkvdGVzdF9taS10ZXN0X21pLiQoT0JKRVhUKTogc3JjL21pLyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXRlc3RfbWkkKEVYRUVYVCk6ICQodGVzdF9taV9PQkpFQ1RTKSAkKHRlc3RfbWlfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgdGVzdF9taSQoRVhFRVhUKQotCSQodGVzdF9taV9MSU5LKSAkKHRlc3RfbWlfT0JKRUNUUykgJCh0ZXN0X21pX0xEQUREKSAkKExJQlMpCi1zcmMvdGVzdC8kKGFtX19kaXJzdGFtcCk6Ci0JQCQoTUtESVJfUCkgc3JjL3Rlc3QKLQlAOiA+IHNyYy90ZXN0LyQoYW1fX2RpcnN0YW1wKQotc3JjL3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKLQlAJChNS0RJUl9QKSBzcmMvdGVzdC8kKERFUERJUikKLQlAOiA+IHNyYy90ZXN0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLXNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS4kKE9CSkVYVCk6IHNyYy90ZXN0LyQoYW1fX2RpcnN0YW1wKSBcCi0Jc3JjL3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5X2NsbnQuJChPQkpFWFQpOiAgXAotCXNyYy90ZXN0LyQoYW1fX2RpcnN0YW1wKSBzcmMvdGVzdC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi10ZXN0X3Byb3h5JChFWEVFWFQpOiAkKHRlc3RfcHJveHlfT0JKRUNUUykgJCh0ZXN0X3Byb3h5X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHRlc3RfcHJveHkkKEVYRUVYVCkKLQkkKHRlc3RfcHJveHlfTElOSykgJCh0ZXN0X3Byb3h5X09CSkVDVFMpICQodGVzdF9wcm94eV9MREFERCkgJChMSUJTKQotc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYuJChPQkpFWFQpOiAgXAotCXNyYy90ZXN0LyQoYW1fX2RpcnN0YW1wKSBzcmMvdGVzdC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi1zcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X2NsbnQuJChPQkpFWFQpOiAgXAotCXNyYy90ZXN0LyQoYW1fX2RpcnN0YW1wKSBzcmMvdGVzdC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCi10ZXN0X3Byb3h5X3JldiQoRVhFRVhUKTogJCh0ZXN0X3Byb3h5X3Jldl9PQkpFQ1RTKSAkKHRlc3RfcHJveHlfcmV2X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHRlc3RfcHJveHlfcmV2JChFWEVFWFQpCi0JJCh0ZXN0X3Byb3h5X3Jldl9MSU5LKSAkKHRlc3RfcHJveHlfcmV2X09CSkVDVFMpICQodGVzdF9wcm94eV9yZXZfTERBREQpICQoTElCUykKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2NsaWVudC9saWJkYmdjbG50X2EtY2xpZW50X2ludGVyZmFjZS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2NsaWVudC9zZG0tY2xpZW50LiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2NsaWVudC9zZG0tc3RhcnR1cC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2ltcGwvc2RtLXNkbS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL2ltcGwvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9pbXBsL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvaW1wbC9zZG0tc2RtX3NldF9iaXRzZXQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLUNMSUNvbW1hbmQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLUNMSU91dHB1dC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlBcmcuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSUJyZWFrcG9pbnQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLU1JQ29tbWFuZC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlFcnJvci4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlFdmVudC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlGcmFtZS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlHREJDb21tYW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlNZW1vcnlDb21tYW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlPdXRwdXQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLU1JUGFyc2VyLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlSZXN1bHRSZWNvcmQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLU1JU2Vzc2lvbi4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9taS9saWJtaV9hLU1JU3RyaW5nLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSVRocmVhZC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlUaHJlYWRDb21tYW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSVZhbHVlLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvbGlibWlfYS1NSVZhci4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL21pL2xpYm1pX2EtTUlWYXJDb21tYW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvbWkvdGVzdF9taS10ZXN0X21pLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvc2VydmVyL3NkbS1iYWNrZW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvc2VydmVyL3NkbS1nZGJtaV9iYWNrZW5kLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvc2VydmVyL3NkbS1zZXJ2ZXIuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy9zZXJ2ZXIvc2RtLXNlcnZlcl9jbWRzLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvc2VydmVyL3NkbS10ZXN0X2JhY2tlbmQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5X2NsbnQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWJyZWFrcG9pbnQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLiQoT0JKRVhUKQotCS1ybSAtZiBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZXZlbnQuJChPQkpFWFQpCi0JLXJtIC1mIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWl0aW1lci4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby4kKE9CSkVYVCkKLQktcm0gLWYgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc3RhY2tmcmFtZS4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9jbGllbnQvJChERVBESVIpL2xpYmRiZ2NsbnRfYS1jbGllbnRfaW50ZXJmYWNlLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50X2NtZHMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9jbGllbnQvJChERVBESVIpL3NkbS1zdGFydHVwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fYWdncmVnYXRlX2hhc2guUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX2hlbGxvX3Byb3RvLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0ZV90cmVlLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX3NldF9iaXRzZXQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1DTElDb21tYW5kLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtQ0xJT3V0cHV0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlBcmcuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQnJlYWtwb2ludC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQ29tbWFuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRXJyb3IuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV2ZW50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRnJhbWUuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUdEQkNvbW1hbmQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU1lbW9yeS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5Q29tbWFuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JT09CUmVjb3JkLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlPdXRwdXQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVBhcnNlci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUmVzdWx0LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlSZXN1bHRSZWNvcmQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVNlc3Npb24uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVN0YWNrQ29tbWFuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JU3RyaW5nLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlUaHJlYWQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVRocmVhZENvbW1hbmQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVZhbHVlLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVZhckNvbW1hbmQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taS8kKERFUERJUikvdGVzdF9taS10ZXN0X21pLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tYmFja2VuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3NlcnZlci8kKERFUERJUikvc2RtLWdkYm1pX2JhY2tlbmQuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1zZXJ2ZXIuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1zZXJ2ZXJfY21kcy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXRlc3RfYmFja2VuZC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvdGVzdC8kKERFUERJUikvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvdGVzdC8kKERFUERJUikvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1icmVha3BvaW50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZGVidWcuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1lcnJvci5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWV2ZW50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtaXRpbWVyLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLlBvQGFtX19xdW90ZUAKLQotLmMubzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLm8kJHx8J2A7XAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJCRkZXBiYXNlLlRwbyAtYyAtbyAkQCAkPCAmJlwKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAtbyAkQCAkPAotCi0uYy5vYmo6Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5vYmokJHx8J2A7XAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJCRkZXBiYXNlLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgICYmXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJCRkZXBiYXNlLlRwbyAkJGRlcGJhc2UuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotc3JjL2NsaWVudC9saWJkYmdjbG50X2EtY2xpZW50X2ludGVyZmFjZS5vOiBzcmMvY2xpZW50L2NsaWVudF9pbnRlcmZhY2UuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJnY2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvY2xpZW50L2xpYmRiZ2NsbnRfYS1jbGllbnRfaW50ZXJmYWNlLm8gLU1EIC1NUCAtTUYgc3JjL2NsaWVudC8kKERFUERJUikvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UuVHBvIC1jIC1vIHNyYy9jbGllbnQvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UubyBgdGVzdCAtZiAnc3JjL2NsaWVudC9jbGllbnRfaW50ZXJmYWNlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvY2xpZW50LyQoREVQRElSKS9saWJkYmdjbG50X2EtY2xpZW50X2ludGVyZmFjZS5UcG8gc3JjL2NsaWVudC8kKERFUERJUikvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jJyBvYmplY3Q9J3NyYy9jbGllbnQvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJnY2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9jbGllbnQvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UubyBgdGVzdCAtZiAnc3JjL2NsaWVudC9jbGllbnRfaW50ZXJmYWNlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jCi0KLXNyYy9jbGllbnQvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2Uub2JqOiBzcmMvY2xpZW50L2NsaWVudF9pbnRlcmZhY2UuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJnY2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvY2xpZW50L2xpYmRiZ2NsbnRfYS1jbGllbnRfaW50ZXJmYWNlLm9iaiAtTUQgLU1QIC1NRiBzcmMvY2xpZW50LyQoREVQRElSKS9saWJkYmdjbG50X2EtY2xpZW50X2ludGVyZmFjZS5UcG8gLWMgLW8gc3JjL2NsaWVudC9saWJkYmdjbG50X2EtY2xpZW50X2ludGVyZmFjZS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvY2xpZW50L2NsaWVudF9pbnRlcmZhY2UuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2NsaWVudC8kKERFUERJUikvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2UuVHBvIHNyYy9jbGllbnQvJChERVBESVIpL2xpYmRiZ2NsbnRfYS1jbGllbnRfaW50ZXJmYWNlLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvY2xpZW50L2NsaWVudF9pbnRlcmZhY2UuYycgb2JqZWN0PSdzcmMvY2xpZW50L2xpYmRiZ2NsbnRfYS1jbGllbnRfaW50ZXJmYWNlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJnY2xudF9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9jbGllbnQvbGliZGJnY2xudF9hLWNsaWVudF9pbnRlcmZhY2Uub2JqIGBpZiB0ZXN0IC1mICdzcmMvY2xpZW50L2NsaWVudF9pbnRlcmZhY2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvY2xpZW50L2NsaWVudF9pbnRlcmZhY2UuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2NsaWVudC9jbGllbnRfaW50ZXJmYWNlLmMnOyBmaWAKLQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZXJyb3Iubzogc3JjL3V0aWxzL2Vycm9yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWVycm9yLm8gLU1EIC1NUCAtTUYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWVycm9yLlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci5vIGB0ZXN0IC1mICdzcmMvdXRpbHMvZXJyb3IuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3V0aWxzL2Vycm9yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1lcnJvci5UcG8gc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWVycm9yLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdXRpbHMvZXJyb3IuYycgb2JqZWN0PSdzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWVycm9yLm8gYHRlc3QgLWYgJ3NyYy91dGlscy9lcnJvci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvZXJyb3IuYwotCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci5vYmo6IHNyYy91dGlscy9lcnJvci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci5vYmogLU1EIC1NUCAtTUYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWVycm9yLlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9lcnJvci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9lcnJvci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdXRpbHMvZXJyb3IuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWVycm9yLlRwbyBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZXJyb3IuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy91dGlscy9lcnJvci5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLWVycm9yLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1lcnJvci5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9lcnJvci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9lcnJvci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdXRpbHMvZXJyb3IuYyc7IGZpYAotCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1icmVha3BvaW50Lm86IHNyYy91dGlscy9icmVha3BvaW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWJyZWFrcG9pbnQubyAtTUQgLU1QIC1NRiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC5UcG8gLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC5vIGB0ZXN0IC1mICdzcmMvdXRpbHMvYnJlYWtwb2ludC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvYnJlYWtwb2ludC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC5UcG8gc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWJyZWFrcG9pbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy91dGlscy9icmVha3BvaW50LmMnIG9iamVjdD0nc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWJyZWFrcG9pbnQubyBgdGVzdCAtZiAnc3JjL3V0aWxzL2JyZWFrcG9pbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3V0aWxzL2JyZWFrcG9pbnQuYwotCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1icmVha3BvaW50Lm9iajogc3JjL3V0aWxzL2JyZWFrcG9pbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC5vYmogLU1EIC1NUCAtTUYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWJyZWFrcG9pbnQuVHBvIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWJyZWFrcG9pbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvdXRpbHMvYnJlYWtwb2ludC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9icmVha3BvaW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy91dGlscy9icmVha3BvaW50LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1icmVha3BvaW50LlRwbyBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtYnJlYWtwb2ludC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3V0aWxzL2JyZWFrcG9pbnQuYycgb2JqZWN0PSdzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1icmVha3BvaW50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1icmVha3BvaW50Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3V0aWxzL2JyZWFrcG9pbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvdXRpbHMvYnJlYWtwb2ludC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdXRpbHMvYnJlYWtwb2ludC5jJzsgZmlgCi0KLXNyYy91dGlscy9saWJkYmd1dGlsc19hLXN0YWNrZnJhbWUubzogc3JjL3V0aWxzL3N0YWNrZnJhbWUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc3RhY2tmcmFtZS5vIC1NRCAtTVAgLU1GIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLm8gYHRlc3QgLWYgJ3NyYy91dGlscy9zdGFja2ZyYW1lLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy91dGlscy9zdGFja2ZyYW1lLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLlRwbyBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2Etc3RhY2tmcmFtZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3V0aWxzL3N0YWNrZnJhbWUuYycgb2JqZWN0PSdzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc3RhY2tmcmFtZS5vIGB0ZXN0IC1mICdzcmMvdXRpbHMvc3RhY2tmcmFtZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvc3RhY2tmcmFtZS5jCi0KLXNyYy91dGlscy9saWJkYmd1dGlsc19hLXN0YWNrZnJhbWUub2JqOiBzcmMvdXRpbHMvc3RhY2tmcmFtZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLm9iaiAtTUQgLU1QIC1NRiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2Etc3RhY2tmcmFtZS5UcG8gLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc3RhY2tmcmFtZS5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9zdGFja2ZyYW1lLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3V0aWxzL3N0YWNrZnJhbWUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3V0aWxzL3N0YWNrZnJhbWUuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLXN0YWNrZnJhbWUuVHBvIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1zdGFja2ZyYW1lLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdXRpbHMvc3RhY2tmcmFtZS5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLXN0YWNrZnJhbWUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLXN0YWNrZnJhbWUub2JqIGBpZiB0ZXN0IC1mICdzcmMvdXRpbHMvc3RhY2tmcmFtZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9zdGFja2ZyYW1lLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy91dGlscy9zdGFja2ZyYW1lLmMnOyBmaWAKLQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZXZlbnQubzogc3JjL3V0aWxzL2V2ZW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWV2ZW50Lm8gLU1EIC1NUCAtTUYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWV2ZW50LlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC5vIGB0ZXN0IC1mICdzcmMvdXRpbHMvZXZlbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3V0aWxzL2V2ZW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1ldmVudC5UcG8gc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWV2ZW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdXRpbHMvZXZlbnQuYycgb2JqZWN0PSdzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWV2ZW50Lm8gYHRlc3QgLWYgJ3NyYy91dGlscy9ldmVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvZXZlbnQuYwotCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC5vYmo6IHNyYy91dGlscy9ldmVudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC5vYmogLU1EIC1NUCAtTUYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWV2ZW50LlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9ldmVudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9ldmVudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdXRpbHMvZXZlbnQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWV2ZW50LlRwbyBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZXZlbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy91dGlscy9ldmVudC5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLWV2ZW50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1ldmVudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9ldmVudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9ldmVudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdXRpbHMvZXZlbnQuYyc7IGZpYAotCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIubzogc3JjL3V0aWxzL2l0aW1lci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIubyAtTUQgLU1QIC1NRiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtaXRpbWVyLlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIubyBgdGVzdCAtZiAnc3JjL3V0aWxzL2l0aW1lci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvaXRpbWVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1pdGltZXIuVHBvIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1pdGltZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy91dGlscy9pdGltZXIuYycgb2JqZWN0PSdzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIubyBgdGVzdCAtZiAnc3JjL3V0aWxzL2l0aW1lci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvaXRpbWVyLmMKLQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtaXRpbWVyLm9iajogc3JjL3V0aWxzL2l0aW1lci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1pdGltZXIub2JqIC1NRCAtTVAgLU1GIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1pdGltZXIuVHBvIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWl0aW1lci5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9pdGltZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvdXRpbHMvaXRpbWVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy91dGlscy9pdGltZXIuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWl0aW1lci5UcG8gc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWl0aW1lci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3V0aWxzL2l0aW1lci5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLWl0aW1lci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtaXRpbWVyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3V0aWxzL2l0aW1lci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9pdGltZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3V0aWxzL2l0aW1lci5jJzsgZmlgCi0KLXNyYy91dGlscy9saWJkYmd1dGlsc19hLW1lbW9yeWluZm8ubzogc3JjL3V0aWxzL21lbW9yeWluZm8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby5vIC1NRCAtTVAgLU1GIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1tZW1vcnlpbmZvLlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1tZW1vcnlpbmZvLm8gYHRlc3QgLWYgJ3NyYy91dGlscy9tZW1vcnlpbmZvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy91dGlscy9tZW1vcnlpbmZvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1tZW1vcnlpbmZvLlRwbyBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3V0aWxzL21lbW9yeWluZm8uYycgb2JqZWN0PSdzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1tZW1vcnlpbmZvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby5vIGB0ZXN0IC1mICdzcmMvdXRpbHMvbWVtb3J5aW5mby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvbWVtb3J5aW5mby5jCi0KLXNyYy91dGlscy9saWJkYmd1dGlsc19hLW1lbW9yeWluZm8ub2JqOiBzcmMvdXRpbHMvbWVtb3J5aW5mby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1tZW1vcnlpbmZvLm9iaiAtTUQgLU1QIC1NRiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby5UcG8gLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtbWVtb3J5aW5mby5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9tZW1vcnlpbmZvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3V0aWxzL21lbW9yeWluZm8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3V0aWxzL21lbW9yeWluZm8uYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLW1lbW9yeWluZm8uVHBvIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1tZW1vcnlpbmZvLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdXRpbHMvbWVtb3J5aW5mby5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLW1lbW9yeWluZm8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLW1lbW9yeWluZm8ub2JqIGBpZiB0ZXN0IC1mICdzcmMvdXRpbHMvbWVtb3J5aW5mby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy91dGlscy9tZW1vcnlpbmZvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy91dGlscy9tZW1vcnlpbmZvLmMnOyBmaWAKLQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby5vOiBzcmMvdXRpbHMvc2lnbmFsaW5mby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zaWduYWxpbmZvLm8gLU1EIC1NUCAtTUYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8uVHBvIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8ubyBgdGVzdCAtZiAnc3JjL3V0aWxzL3NpZ25hbGluZm8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3V0aWxzL3NpZ25hbGluZm8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8uVHBvIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1zaWduYWxpbmZvLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdXRpbHMvc2lnbmFsaW5mby5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zaWduYWxpbmZvLm8gYHRlc3QgLWYgJ3NyYy91dGlscy9zaWduYWxpbmZvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy91dGlscy9zaWduYWxpbmZvLmMKLQotc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby5vYmo6IHNyYy91dGlscy9zaWduYWxpbmZvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy91dGlscy9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8ub2JqIC1NRCAtTVAgLU1GIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1zaWduYWxpbmZvLlRwbyAtYyAtbyBzcmMvdXRpbHMvbGliZGJndXRpbHNfYS1zaWduYWxpbmZvLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3V0aWxzL3NpZ25hbGluZm8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvdXRpbHMvc2lnbmFsaW5mby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdXRpbHMvc2lnbmFsaW5mby5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby5UcG8gc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLXNpZ25hbGluZm8uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy91dGlscy9zaWduYWxpbmZvLmMnIG9iamVjdD0nc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2Etc2lnbmFsaW5mby5vYmogYGlmIHRlc3QgLWYgJ3NyYy91dGlscy9zaWduYWxpbmZvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3V0aWxzL3NpZ25hbGluZm8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3V0aWxzL3NpZ25hbGluZm8uYyc7IGZpYAotCi1zcmMvdXRpbHMvbGliZGJndXRpbHNfYS1kZWJ1Zy5vOiBzcmMvdXRpbHMvZGVidWcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZGJndXRpbHNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZGVidWcubyAtTUQgLU1QIC1NRiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZGVidWcuVHBvIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLm8gYHRlc3QgLWYgJ3NyYy91dGlscy9kZWJ1Zy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdXRpbHMvZGVidWcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3V0aWxzLyQoREVQRElSKS9saWJkYmd1dGlsc19hLWRlYnVnLlRwbyBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZGVidWcuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy91dGlscy9kZWJ1Zy5jJyBvYmplY3Q9J3NyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZGVidWcubyBgdGVzdCAtZiAnc3JjL3V0aWxzL2RlYnVnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy91dGlscy9kZWJ1Zy5jCi0KLXNyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLm9iajogc3JjL3V0aWxzL2RlYnVnLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRiZ3V0aWxzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLm9iaiAtTUQgLU1QIC1NRiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZGVidWcuVHBvIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3V0aWxzL2RlYnVnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3V0aWxzL2RlYnVnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy91dGlscy9kZWJ1Zy5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvdXRpbHMvJChERVBESVIpL2xpYmRiZ3V0aWxzX2EtZGVidWcuVHBvIHNyYy91dGlscy8kKERFUERJUikvbGliZGJndXRpbHNfYS1kZWJ1Zy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3V0aWxzL2RlYnVnLmMnIG9iamVjdD0nc3JjL3V0aWxzL2xpYmRiZ3V0aWxzX2EtZGVidWcub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkYmd1dGlsc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy91dGlscy9saWJkYmd1dGlsc19hLWRlYnVnLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3V0aWxzL2RlYnVnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3V0aWxzL2RlYnVnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy91dGlscy9kZWJ1Zy5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JUGFyc2VyLm86IHNyYy9taS9NSVBhcnNlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVBhcnNlci5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVBhcnNlci5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlQYXJzZXIubyBgdGVzdCAtZiAnc3JjL21pL01JUGFyc2VyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVBhcnNlci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlQYXJzZXIuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVBhcnNlci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JUGFyc2VyLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlQYXJzZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVBhcnNlci5vIGB0ZXN0IC1mICdzcmMvbWkvTUlQYXJzZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JUGFyc2VyLmMKLQotc3JjL21pL2xpYm1pX2EtTUlQYXJzZXIub2JqOiBzcmMvbWkvTUlQYXJzZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlQYXJzZXIub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVBhcnNlci5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlQYXJzZXIub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlQYXJzZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlQYXJzZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JUGFyc2VyLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVBhcnNlci5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUGFyc2VyLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlQYXJzZXIuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVBhcnNlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlQYXJzZXIub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlQYXJzZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlQYXJzZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JUGFyc2VyLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlPT0JSZWNvcmQubzogc3JjL21pL01JT09CUmVjb3JkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JT09CUmVjb3JkLm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JT09CUmVjb3JkLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlPT0JSZWNvcmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JT09CUmVjb3JkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU9PQlJlY29yZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JT09CUmVjb3JkLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlPT0JSZWNvcmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JT09CUmVjb3JkLm8gYHRlc3QgLWYgJ3NyYy9taS9NSU9PQlJlY29yZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlPT0JSZWNvcmQuYwotCi1zcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC5vYmo6IHNyYy9taS9NSU9PQlJlY29yZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JT09CUmVjb3JkLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSU9PQlJlY29yZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSU9PQlJlY29yZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlPT0JSZWNvcmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JT09CUmVjb3JkLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlPT0JSZWNvcmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSU9PQlJlY29yZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JT09CUmVjb3JkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU9PQlJlY29yZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSU9PQlJlY29yZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSU9PQlJlY29yZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlPT0JSZWNvcmQuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSU91dHB1dC5vOiBzcmMvbWkvTUlPdXRwdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlPdXRwdXQubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlPdXRwdXQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JT3V0cHV0Lm8gYHRlc3QgLWYgJ3NyYy9taS9NSU91dHB1dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlPdXRwdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JT3V0cHV0LlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlPdXRwdXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSU91dHB1dC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JT3V0cHV0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlPdXRwdXQubyBgdGVzdCAtZiAnc3JjL21pL01JT3V0cHV0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSU91dHB1dC5jCi0KLXNyYy9taS9saWJtaV9hLU1JT3V0cHV0Lm9iajogc3JjL21pL01JT3V0cHV0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JT3V0cHV0Lm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlPdXRwdXQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JT3V0cHV0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JT3V0cHV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JT3V0cHV0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSU91dHB1dC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlPdXRwdXQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU91dHB1dC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JT3V0cHV0LmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlPdXRwdXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JT3V0cHV0Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JT3V0cHV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JT3V0cHV0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSU91dHB1dC5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JUmVzdWx0Lm86IHNyYy9taS9NSVJlc3VsdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVJlc3VsdC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlSZXN1bHQubyBgdGVzdCAtZiAnc3JjL21pL01JUmVzdWx0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVJlc3VsdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlSZXN1bHQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVJlc3VsdC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JUmVzdWx0LmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlSZXN1bHQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlSZXN1bHQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JUmVzdWx0LmMKLQotc3JjL21pL2xpYm1pX2EtTUlSZXN1bHQub2JqOiBzcmMvbWkvTUlSZXN1bHQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlSZXN1bHQub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVJlc3VsdC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlSZXN1bHQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlSZXN1bHQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlSZXN1bHQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JUmVzdWx0LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVJlc3VsdC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUmVzdWx0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlSZXN1bHQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVJlc3VsdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlSZXN1bHQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlSZXN1bHQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlSZXN1bHQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JUmVzdWx0LmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlSZXN1bHRSZWNvcmQubzogc3JjL21pL01JUmVzdWx0UmVjb3JkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlSZXN1bHRSZWNvcmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JUmVzdWx0UmVjb3JkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlSZXN1bHRSZWNvcmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLm8gYHRlc3QgLWYgJ3NyYy9taS9NSVJlc3VsdFJlY29yZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlSZXN1bHRSZWNvcmQuYwotCi1zcmMvbWkvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5vYmo6IHNyYy9taS9NSVJlc3VsdFJlY29yZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSVJlc3VsdFJlY29yZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSVJlc3VsdFJlY29yZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlSZXN1bHRSZWNvcmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlSZXN1bHRSZWNvcmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSVJlc3VsdFJlY29yZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JUmVzdWx0UmVjb3JkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVJlc3VsdFJlY29yZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSVJlc3VsdFJlY29yZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSVJlc3VsdFJlY29yZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlSZXN1bHRSZWNvcmQuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSVZhbHVlLm86IHNyYy9taS9NSVZhbHVlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JVmFsdWUubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYWx1ZS5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlWYWx1ZS5vIGB0ZXN0IC1mICdzcmMvbWkvTUlWYWx1ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlWYWx1ZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYWx1ZS5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVmFsdWUuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSVZhbHVlLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlWYWx1ZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFsdWUubyBgdGVzdCAtZiAnc3JjL21pL01JVmFsdWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JVmFsdWUuYwotCi1zcmMvbWkvbGlibWlfYS1NSVZhbHVlLm9iajogc3JjL21pL01JVmFsdWUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlWYWx1ZS5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVmFsdWUuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFsdWUub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlWYWx1ZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSVZhbHVlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSVZhbHVlLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVZhbHVlLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYWx1ZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JVmFsdWUuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVZhbHVlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVZhbHVlLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JVmFsdWUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlWYWx1ZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlWYWx1ZS5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JU3RyaW5nLm86IHNyYy9taS9NSVN0cmluZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVN0cmluZy5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVN0cmluZy5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcubyBgdGVzdCAtZiAnc3JjL21pL01JU3RyaW5nLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVN0cmluZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlTdHJpbmcuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVN0cmluZy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JU3RyaW5nLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVN0cmluZy5vIGB0ZXN0IC1mICdzcmMvbWkvTUlTdHJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JU3RyaW5nLmMKLQotc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcub2JqOiBzcmMvbWkvTUlTdHJpbmcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVN0cmluZy5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlTdHJpbmcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlTdHJpbmcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JU3RyaW5nLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVN0cmluZy5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JU3RyaW5nLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlTdHJpbmcuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVN0cmluZy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlTdHJpbmcub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlTdHJpbmcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlTdHJpbmcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JU3RyaW5nLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50Lm86IHNyYy9taS9NSUJyZWFrcG9pbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50Lm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQnJlYWtwb2ludC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50Lm8gYHRlc3QgLWYgJ3NyYy9taS9NSUJyZWFrcG9pbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JQnJlYWtwb2ludC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlCcmVha3BvaW50LlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlCcmVha3BvaW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlCcmVha3BvaW50LmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50Lm8gYHRlc3QgLWYgJ3NyYy9taS9NSUJyZWFrcG9pbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JQnJlYWtwb2ludC5jCi0KLXNyYy9taS9saWJtaV9hLU1JQnJlYWtwb2ludC5vYmo6IHNyYy9taS9NSUJyZWFrcG9pbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlCcmVha3BvaW50Lm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlCcmVha3BvaW50LlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUJyZWFrcG9pbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlCcmVha3BvaW50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JQnJlYWtwb2ludC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlCcmVha3BvaW50LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUJyZWFrcG9pbnQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUJyZWFrcG9pbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUJyZWFrcG9pbnQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUJyZWFrcG9pbnQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JQnJlYWtwb2ludC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUJyZWFrcG9pbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlCcmVha3BvaW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSUJyZWFrcG9pbnQuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSUZyYW1lLm86IHNyYy9taS9NSUZyYW1lLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JRnJhbWUubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlGcmFtZS5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlGcmFtZS5vIGB0ZXN0IC1mICdzcmMvbWkvTUlGcmFtZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlGcmFtZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlGcmFtZS5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRnJhbWUuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUZyYW1lLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlGcmFtZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JRnJhbWUubyBgdGVzdCAtZiAnc3JjL21pL01JRnJhbWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JRnJhbWUuYwotCi1zcmMvbWkvbGlibWlfYS1NSUZyYW1lLm9iajogc3JjL21pL01JRnJhbWUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlGcmFtZS5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRnJhbWUuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JRnJhbWUub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlGcmFtZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUZyYW1lLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSUZyYW1lLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUZyYW1lLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlGcmFtZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JRnJhbWUuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUZyYW1lLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUZyYW1lLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JRnJhbWUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlGcmFtZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlGcmFtZS5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JVGhyZWFkLm86IHNyYy9taS9NSVRocmVhZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVRocmVhZC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVRocmVhZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQubyBgdGVzdCAtZiAnc3JjL21pL01JVGhyZWFkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVRocmVhZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlUaHJlYWQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVRocmVhZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JVGhyZWFkLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVRocmVhZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlUaHJlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JVGhyZWFkLmMKLQotc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQub2JqOiBzcmMvbWkvTUlUaHJlYWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVRocmVhZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlUaHJlYWQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlUaHJlYWQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JVGhyZWFkLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVRocmVhZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVGhyZWFkLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlUaHJlYWQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVRocmVhZC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlUaHJlYWQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlUaHJlYWQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlUaHJlYWQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JVGhyZWFkLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlBcmcubzogc3JjL21pL01JQXJnLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JQXJnLm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQXJnLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUFyZy5vIGB0ZXN0IC1mICdzcmMvbWkvTUlBcmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JQXJnLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUFyZy5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQXJnLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlBcmcuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUFyZy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JQXJnLm8gYHRlc3QgLWYgJ3NyYy9taS9NSUFyZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlBcmcuYwotCi1zcmMvbWkvbGlibWlfYS1NSUFyZy5vYmo6IHNyYy9taS9NSUFyZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUFyZy5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQXJnLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUFyZy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUFyZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUFyZy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlBcmcuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQXJnLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlBcmcuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUFyZy5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JQXJnLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUFyZy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUFyZy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUFyZy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlBcmcuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSVZhci5vOiBzcmMvbWkvTUlWYXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlWYXIubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXIuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFyLm8gYHRlc3QgLWYgJ3NyYy9taS9NSVZhci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlWYXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVmFyLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSVZhci5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JVmFyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlWYXIubyBgdGVzdCAtZiAnc3JjL21pL01JVmFyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVZhci5jCi0KLXNyYy9taS9saWJtaV9hLU1JVmFyLm9iajogc3JjL21pL01JVmFyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JVmFyLm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXIuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JVmFyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JVmFyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSVZhci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXIuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVZhci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JVmFyLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlWYXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFyLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JVmFyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JVmFyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSVZhci5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JRXZlbnQubzogc3JjL21pL01JRXZlbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlFdmVudC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV2ZW50LlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUV2ZW50Lm8gYHRlc3QgLWYgJ3NyYy9taS9NSUV2ZW50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSUV2ZW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV2ZW50LlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlFdmVudC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JRXZlbnQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUV2ZW50Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlFdmVudC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlFdmVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlFdmVudC5jCi0KLXNyYy9taS9saWJtaV9hLU1JRXZlbnQub2JqOiBzcmMvbWkvTUlFdmVudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUV2ZW50Lm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlFdmVudC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlFdmVudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUV2ZW50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JRXZlbnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JRXZlbnQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRXZlbnQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV2ZW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlFdmVudC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JRXZlbnQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JRXZlbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlFdmVudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUV2ZW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSUV2ZW50LmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlDb21tYW5kLm86IHNyYy9taS9NSUNvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlDb21tYW5kLm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQ29tbWFuZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlDb21tYW5kLm8gYHRlc3QgLWYgJ3NyYy9taS9NSUNvbW1hbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JQ29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlDb21tYW5kLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlDb21tYW5kLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlDb21tYW5kLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlDb21tYW5kLm8gYHRlc3QgLWYgJ3NyYy9taS9NSUNvbW1hbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JQ29tbWFuZC5jCi0KLXNyYy9taS9saWJtaV9hLU1JQ29tbWFuZC5vYmo6IHNyYy9taS9NSUNvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlDb21tYW5kLm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUNvbW1hbmQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JQ29tbWFuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlDb21tYW5kLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUNvbW1hbmQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUNvbW1hbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUNvbW1hbmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUNvbW1hbmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JQ29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUNvbW1hbmQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSUNvbW1hbmQuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSUdEQkNvbW1hbmQubzogc3JjL21pL01JR0RCQ29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUdEQkNvbW1hbmQubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlHREJDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUdEQkNvbW1hbmQubyBgdGVzdCAtZiAnc3JjL21pL01JR0RCQ29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlHREJDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUdEQkNvbW1hbmQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUdEQkNvbW1hbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUdEQkNvbW1hbmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUdEQkNvbW1hbmQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUdEQkNvbW1hbmQubyBgdGVzdCAtZiAnc3JjL21pL01JR0RCQ29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlHREJDb21tYW5kLmMKLQotc3JjL21pL2xpYm1pX2EtTUlHREJDb21tYW5kLm9iajogc3JjL21pL01JR0RCQ29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUdEQkNvbW1hbmQub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUdEQkNvbW1hbmQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JR0RCQ29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUdEQkNvbW1hbmQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlHREJDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSUdEQkNvbW1hbmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JR0RCQ29tbWFuZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JR0RCQ29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JR0RCQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JR0RCQ29tbWFuZC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlHREJDb21tYW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JR0RCQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUdEQkNvbW1hbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JR0RCQ29tbWFuZC5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JRXhlY0NvbW1hbmQubzogc3JjL21pL01JRXhlY0NvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV4ZWNDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUV4ZWNDb21tYW5kLm8gYHRlc3QgLWYgJ3NyYy9taS9NSUV4ZWNDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSUV4ZWNDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV4ZWNDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JRXhlY0NvbW1hbmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUV4ZWNDb21tYW5kLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlFeGVjQ29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlFeGVjQ29tbWFuZC5jCi0KLXNyYy9taS9saWJtaV9hLU1JRXhlY0NvbW1hbmQub2JqOiBzcmMvbWkvTUlFeGVjQ29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUV4ZWNDb21tYW5kLm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlFeGVjQ29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUV4ZWNDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JRXhlY0NvbW1hbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JRXhlY0NvbW1hbmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRXhlY0NvbW1hbmQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUV4ZWNDb21tYW5kLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlFeGVjQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JRXhlY0NvbW1hbmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JRXhlY0NvbW1hbmQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlFeGVjQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUV4ZWNDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSUV4ZWNDb21tYW5kLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlCcmVha0NvbW1hbmQubzogc3JjL21pL01JQnJlYWtDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlCcmVha0NvbW1hbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JQnJlYWtDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlCcmVha0NvbW1hbmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLm8gYHRlc3QgLWYgJ3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlCcmVha0NvbW1hbmQuYwotCi1zcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5vYmo6IHNyYy9taS9NSUJyZWFrQ29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlCcmVha0NvbW1hbmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlCcmVha0NvbW1hbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JQnJlYWtDb21tYW5kLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUJyZWFrQ29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlCcmVha0NvbW1hbmQuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSVN0YWNrQ29tbWFuZC5vOiBzcmMvbWkvTUlTdGFja0NvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLm8gYHRlc3QgLWYgJ3NyYy9taS9NSVN0YWNrQ29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlTdGFja0NvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSVN0YWNrQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQubyBgdGVzdCAtZiAnc3JjL21pL01JU3RhY2tDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVN0YWNrQ29tbWFuZC5jCi0KLXNyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLm9iajogc3JjL21pL01JU3RhY2tDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JU3RhY2tDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JU3RhY2tDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSVN0YWNrQ29tbWFuZC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVN0YWNrQ29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JU3RhY2tDb21tYW5kLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlTdGFja0NvbW1hbmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JU3RhY2tDb21tYW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JU3RhY2tDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JU3RhY2tDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSVN0YWNrQ29tbWFuZC5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JVmFyQ29tbWFuZC5vOiBzcmMvbWkvTUlWYXJDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JVmFyQ29tbWFuZC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVZhckNvbW1hbmQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFyQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlWYXJDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVZhckNvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVmFyQ29tbWFuZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVmFyQ29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JVmFyQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JVmFyQ29tbWFuZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVmFyQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlWYXJDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVZhckNvbW1hbmQuYwotCi1zcmMvbWkvbGlibWlfYS1NSVZhckNvbW1hbmQub2JqOiBzcmMvbWkvTUlWYXJDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JVmFyQ29tbWFuZC5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVmFyQ29tbWFuZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlWYXJDb21tYW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JVmFyQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSVZhckNvbW1hbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JVmFyQ29tbWFuZC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXJDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlWYXJDb21tYW5kLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlWYXJDb21tYW5kLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlWYXJDb21tYW5kLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVZhckNvbW1hbmQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlWYXJDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JVmFyQ29tbWFuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlWYXJDb21tYW5kLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlFcnJvci5vOiBzcmMvbWkvTUlFcnJvci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSUVycm9yLm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRXJyb3IuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JRXJyb3IubyBgdGVzdCAtZiAnc3JjL21pL01JRXJyb3IuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JRXJyb3IuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRXJyb3IuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUVycm9yLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlFcnJvci5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JRXJyb3IubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUVycm9yLm8gYHRlc3QgLWYgJ3NyYy9taS9NSUVycm9yLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSUVycm9yLmMKLQotc3JjL21pL2xpYm1pX2EtTUlFcnJvci5vYmo6IHNyYy9taS9NSUVycm9yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JRXJyb3Iub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSUVycm9yLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSUVycm9yLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JRXJyb3IuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlFcnJvci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlFcnJvci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlFcnJvci5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JRXJyb3IuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSUVycm9yLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlFcnJvci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlFcnJvci5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSUVycm9yLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JRXJyb3IuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JRXJyb3IuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSVNlc3Npb24ubzogc3JjL21pL01JU2Vzc2lvbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVNlc3Npb24ubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlTZXNzaW9uLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVNlc3Npb24ubyBgdGVzdCAtZiAnc3JjL21pL01JU2Vzc2lvbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlTZXNzaW9uLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVNlc3Npb24uVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVNlc3Npb24uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSVNlc3Npb24uYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSVNlc3Npb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVNlc3Npb24ubyBgdGVzdCAtZiAnc3JjL21pL01JU2Vzc2lvbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlTZXNzaW9uLmMKLQotc3JjL21pL2xpYm1pX2EtTUlTZXNzaW9uLm9iajogc3JjL21pL01JU2Vzc2lvbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSVNlc3Npb24ub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVNlc3Npb24uVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JU2Vzc2lvbi5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSVNlc3Npb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlTZXNzaW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSVNlc3Npb24uYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JU2Vzc2lvbi5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JU2Vzc2lvbi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JU2Vzc2lvbi5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JU2Vzc2lvbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlTZXNzaW9uLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JU2Vzc2lvbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSVNlc3Npb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JU2Vzc2lvbi5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5vOiBzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSVRocmVhZENvbW1hbmQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVRocmVhZENvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9NSVRocmVhZENvbW1hbmQuYwotCi1zcmMvbWkvbGlibWlfYS1NSVRocmVhZENvbW1hbmQub2JqOiBzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JVGhyZWFkQ29tbWFuZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlUaHJlYWRDb21tYW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSVRocmVhZENvbW1hbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlUaHJlYWRDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlUaHJlYWRDb21tYW5kLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtTUlUaHJlYWRDb21tYW5kLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSVRocmVhZENvbW1hbmQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlUaHJlYWRDb21tYW5kLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtTUlNZW1vcnkubzogc3JjL21pL01JTWVtb3J5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS9saWJtaV9hLU1JTWVtb3J5Lm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5LlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeS5vIGB0ZXN0IC1mICdzcmMvbWkvTUlNZW1vcnkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL01JTWVtb3J5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU1lbW9yeS5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvTUlNZW1vcnkuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSU1lbW9yeS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JTWVtb3J5Lm8gYHRlc3QgLWYgJ3NyYy9taS9NSU1lbW9yeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlNZW1vcnkuYwotCi1zcmMvbWkvbGlibWlfYS1NSU1lbW9yeS5vYmo6IHNyYy9taS9NSU1lbW9yeS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeS5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5LlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSU1lbW9yeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSU1lbW9yeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlNZW1vcnkuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5LlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlNZW1vcnkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSU1lbW9yeS5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JTWVtb3J5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSU1lbW9yeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSU1lbW9yeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvTUlNZW1vcnkuYyc7IGZpYAotCi1zcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQubzogc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtTUlNZW1vcnlDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQubyBgdGVzdCAtZiAnc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlNZW1vcnlDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9NSU1lbW9yeUNvbW1hbmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQubyBgdGVzdCAtZiAnc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvTUlNZW1vcnlDb21tYW5kLmMKLQotc3JjL21pL2xpYm1pX2EtTUlNZW1vcnlDb21tYW5kLm9iajogc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQub2JqIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1NSU1lbW9yeUNvbW1hbmQuVHBvIC1jIC1vIHNyYy9taS9saWJtaV9hLU1JTWVtb3J5Q29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9NSU1lbW9yeUNvbW1hbmQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvTUlNZW1vcnlDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9NSU1lbW9yeUNvbW1hbmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5Q29tbWFuZC5UcG8gc3JjL21pLyQoREVQRElSKS9saWJtaV9hLU1JTWVtb3J5Q29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLU1JTWVtb3J5Q29tbWFuZC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtTUlNZW1vcnlDb21tYW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9NSU1lbW9yeUNvbW1hbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jJzsgZmlgCi0KLXNyYy9taS9saWJtaV9hLUNMSUNvbW1hbmQubzogc3JjL21pL0NMSUNvbW1hbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtQ0xJQ29tbWFuZC5vIC1NRCAtTVAgLU1GIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1DTElDb21tYW5kLlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1DTElDb21tYW5kLm8gYHRlc3QgLWYgJ3NyYy9taS9DTElDb21tYW5kLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9taS9DTElDb21tYW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1DTElDb21tYW5kLlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtQ0xJQ29tbWFuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL0NMSUNvbW1hbmQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1DTElDb21tYW5kLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtQ0xJQ29tbWFuZC5vIGB0ZXN0IC1mICdzcmMvbWkvQ0xJQ29tbWFuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvQ0xJQ29tbWFuZC5jCi0KLXNyYy9taS9saWJtaV9hLUNMSUNvbW1hbmQub2JqOiBzcmMvbWkvQ0xJQ29tbWFuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvbWkvbGlibWlfYS1DTElDb21tYW5kLm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtQ0xJQ29tbWFuZC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtQ0xJQ29tbWFuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9DTElDb21tYW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL0NMSUNvbW1hbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL21pL0NMSUNvbW1hbmQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLUNMSUNvbW1hbmQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1DTElDb21tYW5kLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvQ0xJQ29tbWFuZC5jJyBvYmplY3Q9J3NyYy9taS9saWJtaV9hLUNMSUNvbW1hbmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLUNMSUNvbW1hbmQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvQ0xJQ29tbWFuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS9DTElDb21tYW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9DTElDb21tYW5kLmMnOyBmaWAKLQotc3JjL21pL2xpYm1pX2EtQ0xJT3V0cHV0Lm86IHNyYy9taS9DTElPdXRwdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtQ0xJT3V0cHV0Lm8gLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS9saWJtaV9hLUNMSU91dHB1dC5UcG8gLWMgLW8gc3JjL21pL2xpYm1pX2EtQ0xJT3V0cHV0Lm8gYHRlc3QgLWYgJ3NyYy9taS9DTElPdXRwdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL0NMSU91dHB1dC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtQ0xJT3V0cHV0LlRwbyBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtQ0xJT3V0cHV0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvbWkvQ0xJT3V0cHV0LmMnIG9iamVjdD0nc3JjL21pL2xpYm1pX2EtQ0xJT3V0cHV0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYm1pX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL21pL2xpYm1pX2EtQ0xJT3V0cHV0Lm8gYHRlc3QgLWYgJ3NyYy9taS9DTElPdXRwdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL0NMSU91dHB1dC5jCi0KLXNyYy9taS9saWJtaV9hLUNMSU91dHB1dC5vYmo6IHNyYy9taS9DTElPdXRwdXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGlibWlfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL2xpYm1pX2EtQ0xJT3V0cHV0Lm9iaiAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL2xpYm1pX2EtQ0xJT3V0cHV0LlRwbyAtYyAtbyBzcmMvbWkvbGlibWlfYS1DTElPdXRwdXQub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvQ0xJT3V0cHV0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL21pL0NMSU91dHB1dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvQ0xJT3V0cHV0LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1DTElPdXRwdXQuVHBvIHNyYy9taS8kKERFUERJUikvbGlibWlfYS1DTElPdXRwdXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS9DTElPdXRwdXQuYycgb2JqZWN0PSdzcmMvbWkvbGlibWlfYS1DTElPdXRwdXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJtaV9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS9saWJtaV9hLUNMSU91dHB1dC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9taS9DTElPdXRwdXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvQ0xJT3V0cHV0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS9DTElPdXRwdXQuYyc7IGZpYAotCi1zcmMvY2xpZW50L3NkbS1zdGFydHVwLm86IHNyYy9jbGllbnQvc3RhcnR1cC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9jbGllbnQvc2RtLXN0YXJ0dXAubyAtTUQgLU1QIC1NRiBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tc3RhcnR1cC5UcG8gLWMgLW8gc3JjL2NsaWVudC9zZG0tc3RhcnR1cC5vIGB0ZXN0IC1mICdzcmMvY2xpZW50L3N0YXJ0dXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2NsaWVudC9zdGFydHVwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9jbGllbnQvJChERVBESVIpL3NkbS1zdGFydHVwLlRwbyBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tc3RhcnR1cC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2NsaWVudC9zdGFydHVwLmMnIG9iamVjdD0nc3JjL2NsaWVudC9zZG0tc3RhcnR1cC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2NsaWVudC9zZG0tc3RhcnR1cC5vIGB0ZXN0IC1mICdzcmMvY2xpZW50L3N0YXJ0dXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2NsaWVudC9zdGFydHVwLmMKLQotc3JjL2NsaWVudC9zZG0tc3RhcnR1cC5vYmo6IHNyYy9jbGllbnQvc3RhcnR1cC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9jbGllbnQvc2RtLXN0YXJ0dXAub2JqIC1NRCAtTVAgLU1GIHNyYy9jbGllbnQvJChERVBESVIpL3NkbS1zdGFydHVwLlRwbyAtYyAtbyBzcmMvY2xpZW50L3NkbS1zdGFydHVwLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2NsaWVudC9zdGFydHVwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2NsaWVudC9zdGFydHVwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9jbGllbnQvc3RhcnR1cC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tc3RhcnR1cC5UcG8gc3JjL2NsaWVudC8kKERFUERJUikvc2RtLXN0YXJ0dXAuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9jbGllbnQvc3RhcnR1cC5jJyBvYmplY3Q9J3NyYy9jbGllbnQvc2RtLXN0YXJ0dXAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2NsaWVudC9zZG0tc3RhcnR1cC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9jbGllbnQvc3RhcnR1cC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9jbGllbnQvc3RhcnR1cC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvY2xpZW50L3N0YXJ0dXAuYyc7IGZpYAotCi1zcmMvY2xpZW50L3NkbS1jbGllbnQubzogc3JjL2NsaWVudC9jbGllbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvY2xpZW50L3NkbS1jbGllbnQubyAtTUQgLU1QIC1NRiBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50LlRwbyAtYyAtbyBzcmMvY2xpZW50L3NkbS1jbGllbnQubyBgdGVzdCAtZiAnc3JjL2NsaWVudC9jbGllbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2NsaWVudC9jbGllbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2NsaWVudC8kKERFUERJUikvc2RtLWNsaWVudC5UcG8gc3JjL2NsaWVudC8kKERFUERJUikvc2RtLWNsaWVudC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2NsaWVudC9jbGllbnQuYycgb2JqZWN0PSdzcmMvY2xpZW50L3NkbS1jbGllbnQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9jbGllbnQvc2RtLWNsaWVudC5vIGB0ZXN0IC1mICdzcmMvY2xpZW50L2NsaWVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvY2xpZW50L2NsaWVudC5jCi0KLXNyYy9jbGllbnQvc2RtLWNsaWVudC5vYmo6IHNyYy9jbGllbnQvY2xpZW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL2NsaWVudC9zZG0tY2xpZW50Lm9iaiAtTUQgLU1QIC1NRiBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50LlRwbyAtYyAtbyBzcmMvY2xpZW50L3NkbS1jbGllbnQub2JqIGBpZiB0ZXN0IC1mICdzcmMvY2xpZW50L2NsaWVudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9jbGllbnQvY2xpZW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9jbGllbnQvY2xpZW50LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9jbGllbnQvJChERVBESVIpL3NkbS1jbGllbnQuVHBvIHNyYy9jbGllbnQvJChERVBESVIpL3NkbS1jbGllbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9jbGllbnQvY2xpZW50LmMnIG9iamVjdD0nc3JjL2NsaWVudC9zZG0tY2xpZW50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9jbGllbnQvc2RtLWNsaWVudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9jbGllbnQvY2xpZW50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2NsaWVudC9jbGllbnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2NsaWVudC9jbGllbnQuYyc7IGZpYAotCi1zcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vOiBzcmMvY2xpZW50L2NsaWVudF9jbWRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL2NsaWVudC9zZG0tY2xpZW50X2NtZHMubyAtTUQgLU1QIC1NRiBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50X2NtZHMuVHBvIC1jIC1vIHNyYy9jbGllbnQvc2RtLWNsaWVudF9jbWRzLm8gYHRlc3QgLWYgJ3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2NsaWVudC9jbGllbnRfY21kcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50X2NtZHMuVHBvIHNyYy9jbGllbnQvJChERVBESVIpL3NkbS1jbGllbnRfY21kcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2NsaWVudC9jbGllbnRfY21kcy5jJyBvYmplY3Q9J3NyYy9jbGllbnQvc2RtLWNsaWVudF9jbWRzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vIGB0ZXN0IC1mICdzcmMvY2xpZW50L2NsaWVudF9jbWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9jbGllbnQvY2xpZW50X2NtZHMuYwotCi1zcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vYmo6IHNyYy9jbGllbnQvY2xpZW50X2NtZHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vYmogLU1EIC1NUCAtTUYgc3JjL2NsaWVudC8kKERFUERJUikvc2RtLWNsaWVudF9jbWRzLlRwbyAtYyAtbyBzcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvY2xpZW50L2NsaWVudF9jbWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2NsaWVudC8kKERFUERJUikvc2RtLWNsaWVudF9jbWRzLlRwbyBzcmMvY2xpZW50LyQoREVQRElSKS9zZG0tY2xpZW50X2NtZHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYycgb2JqZWN0PSdzcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvY2xpZW50L3NkbS1jbGllbnRfY21kcy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvY2xpZW50L2NsaWVudF9jbWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYyc7IGZpYAotCi1zcmMvc2VydmVyL3NkbS1zZXJ2ZXIubzogc3JjL3NlcnZlci9zZXJ2ZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvc2VydmVyL3NkbS1zZXJ2ZXIubyAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tc2VydmVyLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS1zZXJ2ZXIubyBgdGVzdCAtZiAnc3JjL3NlcnZlci9zZXJ2ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci9zZXJ2ZXIuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXNlcnZlci5UcG8gc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXNlcnZlci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3NlcnZlci9zZXJ2ZXIuYycgb2JqZWN0PSdzcmMvc2VydmVyL3NkbS1zZXJ2ZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9zZXJ2ZXIvc2RtLXNlcnZlci5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL3NlcnZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvc2VydmVyL3NlcnZlci5jCi0KLXNyYy9zZXJ2ZXIvc2RtLXNlcnZlci5vYmo6IHNyYy9zZXJ2ZXIvc2VydmVyLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3NlcnZlci9zZG0tc2VydmVyLm9iaiAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tc2VydmVyLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS1zZXJ2ZXIub2JqIGBpZiB0ZXN0IC1mICdzcmMvc2VydmVyL3NlcnZlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9zZXJ2ZXIvc2VydmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9zZXJ2ZXIvc2VydmVyLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1zZXJ2ZXIuVHBvIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1zZXJ2ZXIuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9zZXJ2ZXIvc2VydmVyLmMnIG9iamVjdD0nc3JjL3NlcnZlci9zZG0tc2VydmVyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9zZXJ2ZXIvc2RtLXNlcnZlci5vYmogYGlmIHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvc2VydmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3NlcnZlci9zZXJ2ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3NlcnZlci9zZXJ2ZXIuYyc7IGZpYAotCi1zcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vOiBzcmMvc2VydmVyL3NlcnZlcl9jbWRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3NlcnZlci9zZG0tc2VydmVyX2NtZHMubyAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tc2VydmVyX2NtZHMuVHBvIC1jIC1vIHNyYy9zZXJ2ZXIvc2RtLXNlcnZlcl9jbWRzLm8gYHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci9zZXJ2ZXJfY21kcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tc2VydmVyX2NtZHMuVHBvIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1zZXJ2ZXJfY21kcy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3NlcnZlci9zZXJ2ZXJfY21kcy5jJyBvYmplY3Q9J3NyYy9zZXJ2ZXIvc2RtLXNlcnZlcl9jbWRzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL3NlcnZlcl9jbWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYwotCi1zcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vYmo6IHNyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vYmogLU1EIC1NUCAtTUYgc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXNlcnZlcl9jbWRzLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvc2VydmVyL3NlcnZlcl9jbWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXNlcnZlcl9jbWRzLlRwbyBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tc2VydmVyX2NtZHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYycgb2JqZWN0PSdzcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvc2VydmVyL3NkbS1zZXJ2ZXJfY21kcy5vYmogYGlmIHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvc2VydmVyL3NlcnZlcl9jbWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYyc7IGZpYAotCi1zcmMvc2VydmVyL3NkbS1iYWNrZW5kLm86IHNyYy9zZXJ2ZXIvYmFja2VuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9zZXJ2ZXIvc2RtLWJhY2tlbmQubyAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tYmFja2VuZC5UcG8gLWMgLW8gc3JjL3NlcnZlci9zZG0tYmFja2VuZC5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL2JhY2tlbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci9iYWNrZW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1iYWNrZW5kLlRwbyBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tYmFja2VuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3NlcnZlci9iYWNrZW5kLmMnIG9iamVjdD0nc3JjL3NlcnZlci9zZG0tYmFja2VuZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3NlcnZlci9zZG0tYmFja2VuZC5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL2JhY2tlbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci9iYWNrZW5kLmMKLQotc3JjL3NlcnZlci9zZG0tYmFja2VuZC5vYmo6IHNyYy9zZXJ2ZXIvYmFja2VuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9zZXJ2ZXIvc2RtLWJhY2tlbmQub2JqIC1NRCAtTVAgLU1GIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1iYWNrZW5kLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS1iYWNrZW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3NlcnZlci9iYWNrZW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3NlcnZlci9iYWNrZW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9zZXJ2ZXIvYmFja2VuZC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tYmFja2VuZC5UcG8gc3JjL3NlcnZlci8kKERFUERJUikvc2RtLWJhY2tlbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9zZXJ2ZXIvYmFja2VuZC5jJyBvYmplY3Q9J3NyYy9zZXJ2ZXIvc2RtLWJhY2tlbmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3NlcnZlci9zZG0tYmFja2VuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvYmFja2VuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9zZXJ2ZXIvYmFja2VuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvc2VydmVyL2JhY2tlbmQuYyc7IGZpYAotCi1zcmMvc2VydmVyL3NkbS1nZGJtaV9iYWNrZW5kLm86IHNyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9zZXJ2ZXIvc2RtLWdkYm1pX2JhY2tlbmQubyAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tZ2RibWlfYmFja2VuZC5UcG8gLWMgLW8gc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL2dkYm1pX2JhY2tlbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci9nZGJtaV9iYWNrZW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1nZGJtaV9iYWNrZW5kLlRwbyBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tZ2RibWlfYmFja2VuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3NlcnZlci9nZGJtaV9iYWNrZW5kLmMnIG9iamVjdD0nc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL2dkYm1pX2JhY2tlbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci9nZGJtaV9iYWNrZW5kLmMKLQotc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC5vYmo6IHNyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9zZXJ2ZXIvc2RtLWdkYm1pX2JhY2tlbmQub2JqIC1NRCAtTVAgLU1GIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS1nZGJtaV9iYWNrZW5kLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS1nZGJtaV9iYWNrZW5kLm9iaiBgaWYgdGVzdCAtZiAnc3JjL3NlcnZlci9nZGJtaV9iYWNrZW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3NlcnZlci9nZGJtaV9iYWNrZW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tZ2RibWlfYmFja2VuZC5UcG8gc3JjL3NlcnZlci8kKERFUERJUikvc2RtLWdkYm1pX2JhY2tlbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jJyBvYmplY3Q9J3NyYy9zZXJ2ZXIvc2RtLWdkYm1pX2JhY2tlbmQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3NlcnZlci9zZG0tZ2RibWlfYmFja2VuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvc2VydmVyL2dkYm1pX2JhY2tlbmQuYyc7IGZpYAotCi1zcmMvc2VydmVyL3NkbS10ZXN0X2JhY2tlbmQubzogc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvc2VydmVyL3NkbS10ZXN0X2JhY2tlbmQubyAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tdGVzdF9iYWNrZW5kLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS10ZXN0X2JhY2tlbmQubyBgdGVzdCAtZiAnc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXRlc3RfYmFja2VuZC5UcG8gc3JjL3NlcnZlci8kKERFUERJUikvc2RtLXRlc3RfYmFja2VuZC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYycgb2JqZWN0PSdzcmMvc2VydmVyL3NkbS10ZXN0X2JhY2tlbmQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9zZXJ2ZXIvc2RtLXRlc3RfYmFja2VuZC5vIGB0ZXN0IC1mICdzcmMvc2VydmVyL3Rlc3RfYmFja2VuZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvc2VydmVyL3Rlc3RfYmFja2VuZC5jCi0KLXNyYy9zZXJ2ZXIvc2RtLXRlc3RfYmFja2VuZC5vYmo6IHNyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3NlcnZlci9zZG0tdGVzdF9iYWNrZW5kLm9iaiAtTUQgLU1QIC1NRiBzcmMvc2VydmVyLyQoREVQRElSKS9zZG0tdGVzdF9iYWNrZW5kLlRwbyAtYyAtbyBzcmMvc2VydmVyL3NkbS10ZXN0X2JhY2tlbmQub2JqIGBpZiB0ZXN0IC1mICdzcmMvc2VydmVyL3Rlc3RfYmFja2VuZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS10ZXN0X2JhY2tlbmQuVHBvIHNyYy9zZXJ2ZXIvJChERVBESVIpL3NkbS10ZXN0X2JhY2tlbmQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMnIG9iamVjdD0nc3JjL3NlcnZlci9zZG0tdGVzdF9iYWNrZW5kLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9zZXJ2ZXIvc2RtLXRlc3RfYmFja2VuZC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtLm86IHNyYy9pbXBsL3NkbS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9pbXBsL3NkbS1zZG0ubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbS5UcG8gLWMgLW8gc3JjL2ltcGwvc2RtLXNkbS5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtLlRwbyBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtLmMnIG9iamVjdD0nc3JjL2ltcGwvc2RtLXNkbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2ltcGwvc2RtLXNkbS5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtLmMKLQotc3JjL2ltcGwvc2RtLXNkbS5vYmo6IHNyYy9pbXBsL3NkbS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9pbXBsL3NkbS1zZG0ub2JqIC1NRCAtTVAgLU1GIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2ltcGwvc2RtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2ltcGwvc2RtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbS5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbS5UcG8gc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG0uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbS5jJyBvYmplY3Q9J3NyYy9pbXBsL3NkbS1zZG0ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2ltcGwvc2RtLXNkbS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9pbXBsL3NkbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvaW1wbC9zZG0uYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtX2FnZ3JlZ2F0ZV9oYXNoLm86IHNyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9pbXBsL3NkbS1zZG1fYWdncmVnYXRlX2hhc2gubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5UcG8gLWMgLW8gc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fYWdncmVnYXRlX2hhc2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX2FnZ3JlZ2F0ZV9oYXNoLlRwbyBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMnIG9iamVjdD0nc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fYWdncmVnYXRlX2hhc2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMKLQotc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5vYmo6IHNyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9pbXBsL3NkbS1zZG1fYWdncmVnYXRlX2hhc2gub2JqIC1NRCAtTVAgLU1GIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX2FnZ3JlZ2F0ZV9oYXNoLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX2FnZ3JlZ2F0ZV9oYXNoLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5UcG8gc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fYWdncmVnYXRlX2hhc2guUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jJyBvYmplY3Q9J3NyYy9pbXBsL3NkbS1zZG1fYWdncmVnYXRlX2hhc2gub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2ltcGwvc2RtLXNkbV9hZ2dyZWdhdGVfaGFzaC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvaW1wbC9zZG1fYWdncmVnYXRlX2hhc2guYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtX2hlbGxvX3Byb3RvLm86IHNyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9pbXBsL3NkbS1zZG1faGVsbG9fcHJvdG8ubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9oZWxsb19wcm90by5UcG8gLWMgLW8gc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1faGVsbG9fcHJvdG8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX2hlbGxvX3Byb3RvLlRwbyBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9oZWxsb19wcm90by5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMnIG9iamVjdD0nc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1faGVsbG9fcHJvdG8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMKLQotc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by5vYmo6IHNyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9pbXBsL3NkbS1zZG1faGVsbG9fcHJvdG8ub2JqIC1NRCAtTVAgLU1GIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX2hlbGxvX3Byb3RvLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX2hlbGxvX3Byb3RvLm9iaiBgaWYgdGVzdCAtZiAnc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9oZWxsb19wcm90by5UcG8gc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1faGVsbG9fcHJvdG8uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jJyBvYmplY3Q9J3NyYy9pbXBsL3NkbS1zZG1faGVsbG9fcHJvdG8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzZG1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL2ltcGwvc2RtLXNkbV9oZWxsb19wcm90by5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvaW1wbC9zZG1faGVsbG9fcHJvdG8uYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtX21lc3NhZ2VfdGNwaXAubzogc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvaW1wbC9zZG0tc2RtX21lc3NhZ2VfdGNwaXAubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX21lc3NhZ2VfdGNwaXAubyBgdGVzdCAtZiAnc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fbWVzc2FnZV90Y3BpcC5UcG8gc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fbWVzc2FnZV90Y3BpcC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYycgb2JqZWN0PSdzcmMvaW1wbC9zZG0tc2RtX21lc3NhZ2VfdGNwaXAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fbWVzc2FnZV90Y3BpcC5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fbWVzc2FnZV90Y3BpcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvaW1wbC9zZG1fbWVzc2FnZV90Y3BpcC5jCi0KLXNyYy9pbXBsL3NkbS1zZG1fbWVzc2FnZV90Y3BpcC5vYmo6IHNyYy9pbXBsL3NkbV9tZXNzYWdlX3RjcGlwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL2ltcGwvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLm9iaiAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX21lc3NhZ2VfdGNwaXAub2JqIGBpZiB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fbWVzc2FnZV90Y3BpcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9pbXBsL3NkbV9tZXNzYWdlX3RjcGlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9tZXNzYWdlX3RjcGlwLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX21lc3NhZ2VfdGNwaXAuVHBvIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX21lc3NhZ2VfdGNwaXAuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbV9tZXNzYWdlX3RjcGlwLmMnIG9iamVjdD0nc3JjL2ltcGwvc2RtLXNkbV9tZXNzYWdlX3RjcGlwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fbWVzc2FnZV90Y3BpcC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9tZXNzYWdlX3RjcGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUubzogc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0ZV90cmVlLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUubyBgdGVzdCAtZiAnc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fcm91dGVfdHJlZS5UcG8gc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fcm91dGVfdHJlZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYycgb2JqZWN0PSdzcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fcm91dGVfdHJlZS5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fcm91dGVfdHJlZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvaW1wbC9zZG1fcm91dGVfdHJlZS5jCi0KLXNyYy9pbXBsL3NkbS1zZG1fcm91dGVfdHJlZS5vYmo6IHNyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL2ltcGwvc2RtLXNkbV9yb3V0ZV90cmVlLm9iaiAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0ZV90cmVlLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3JvdXRlX3RyZWUub2JqIGBpZiB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fcm91dGVfdHJlZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX3JvdXRlX3RyZWUuVHBvIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX3JvdXRlX3RyZWUuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMnIG9iamVjdD0nc3JjL2ltcGwvc2RtLXNkbV9yb3V0ZV90cmVlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fcm91dGVfdHJlZS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2ltcGwvc2RtX3JvdXRlX3RyZWUuYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vOiBzcmMvaW1wbC9zZG1fcm91dGluZ190YWJsZV9maWxlLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL2ltcGwvc2RtLXNkbV9yb3V0aW5nX3RhYmxlX2ZpbGUubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuVHBvIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLm8gYHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuVHBvIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5jJyBvYmplY3Q9J3NyYy9pbXBsL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fcm91dGluZ190YWJsZV9maWxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYwotCi1zcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vYmo6IHNyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vYmogLU1EIC1NUCAtTUYgc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvaW1wbC9zZG1fcm91dGluZ190YWJsZV9maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fcm91dGluZ190YWJsZV9maWxlLlRwbyBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYycgb2JqZWN0PSdzcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvaW1wbC9zZG1fcm91dGluZ190YWJsZV9maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYyc7IGZpYAotCi1zcmMvaW1wbC9zZG0tc2RtX3NldF9iaXRzZXQubzogc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvaW1wbC9zZG0tc2RtX3NldF9iaXRzZXQubyAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9zZXRfYml0c2V0LlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3NldF9iaXRzZXQubyBgdGVzdCAtZiAnc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fc2V0X2JpdHNldC5UcG8gc3JjL2ltcGwvJChERVBESVIpL3NkbS1zZG1fc2V0X2JpdHNldC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYycgb2JqZWN0PSdzcmMvaW1wbC9zZG0tc2RtX3NldF9iaXRzZXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fc2V0X2JpdHNldC5vIGB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jCi0KLXNyYy9pbXBsL3NkbS1zZG1fc2V0X2JpdHNldC5vYmo6IHNyYy9pbXBsL3NkbV9zZXRfYml0c2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHNkbV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL2ltcGwvc2RtLXNkbV9zZXRfYml0c2V0Lm9iaiAtTUQgLU1QIC1NRiBzcmMvaW1wbC8kKERFUERJUikvc2RtLXNkbV9zZXRfYml0c2V0LlRwbyAtYyAtbyBzcmMvaW1wbC9zZG0tc2RtX3NldF9iaXRzZXQub2JqIGBpZiB0ZXN0IC1mICdzcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9pbXBsL3NkbV9zZXRfYml0c2V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9pbXBsL3NkbV9zZXRfYml0c2V0LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX3NldF9iaXRzZXQuVHBvIHNyYy9pbXBsLyQoREVQRElSKS9zZG0tc2RtX3NldF9iaXRzZXQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9pbXBsL3NkbV9zZXRfYml0c2V0LmMnIG9iamVjdD0nc3JjL2ltcGwvc2RtLXNkbV9zZXRfYml0c2V0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc2RtX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9pbXBsL3NkbS1zZG1fc2V0X2JpdHNldC5vYmogYGlmIHRlc3QgLWYgJ3NyYy9pbXBsL3NkbV9zZXRfYml0c2V0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYyc7IGZpYAotCi1zcmMvbWkvdGVzdF9taS10ZXN0X21pLm86IHNyYy9taS90ZXN0X21pLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfbWlfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy9taS90ZXN0X21pLXRlc3RfbWkubyAtTUQgLU1QIC1NRiBzcmMvbWkvJChERVBESVIpL3Rlc3RfbWktdGVzdF9taS5UcG8gLWMgLW8gc3JjL21pL3Rlc3RfbWktdGVzdF9taS5vIGB0ZXN0IC1mICdzcmMvbWkvdGVzdF9taS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvbWkvdGVzdF9taS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvbWkvJChERVBESVIpL3Rlc3RfbWktdGVzdF9taS5UcG8gc3JjL21pLyQoREVQRElSKS90ZXN0X21pLXRlc3RfbWkuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9taS90ZXN0X21pLmMnIG9iamVjdD0nc3JjL21pL3Rlc3RfbWktdGVzdF9taS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X21pX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy9taS90ZXN0X21pLXRlc3RfbWkubyBgdGVzdCAtZiAnc3JjL21pL3Rlc3RfbWkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL21pL3Rlc3RfbWkuYwotCi1zcmMvbWkvdGVzdF9taS10ZXN0X21pLm9iajogc3JjL21pL3Rlc3RfbWkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9taV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL21pL3Rlc3RfbWktdGVzdF9taS5vYmogLU1EIC1NUCAtTUYgc3JjL21pLyQoREVQRElSKS90ZXN0X21pLXRlc3RfbWkuVHBvIC1jIC1vIHNyYy9taS90ZXN0X21pLXRlc3RfbWkub2JqIGBpZiB0ZXN0IC1mICdzcmMvbWkvdGVzdF9taS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9taS90ZXN0X21pLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9taS90ZXN0X21pLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy9taS8kKERFUERJUikvdGVzdF9taS10ZXN0X21pLlRwbyBzcmMvbWkvJChERVBESVIpL3Rlc3RfbWktdGVzdF9taS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL21pL3Rlc3RfbWkuYycgb2JqZWN0PSdzcmMvbWkvdGVzdF9taS10ZXN0X21pLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9taV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvbWkvdGVzdF9taS10ZXN0X21pLm9iaiBgaWYgdGVzdCAtZiAnc3JjL21pL3Rlc3RfbWkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvbWkvdGVzdF9taS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvbWkvdGVzdF9taS5jJzsgZmlgCi0KLXNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS5vOiBzcmMvdGVzdC90ZXN0X3Byb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS5vIC1NRCAtTVAgLU1GIHNyYy90ZXN0LyQoREVQRElSKS90ZXN0X3Byb3h5LXRlc3RfcHJveHkuVHBvIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS5vIGB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy90ZXN0L3Rlc3RfcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eS5UcG8gc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eS5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Rlc3QvdGVzdF9wcm94eS5jJyBvYmplY3Q9J3NyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS5vIGB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy90ZXN0L3Rlc3RfcHJveHkuYwotCi1zcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHkub2JqOiBzcmMvdGVzdC90ZXN0X3Byb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eS5vYmogLU1EIC1NUCAtTUYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eS5UcG8gLWMgLW8gc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Rlc3QvdGVzdF9wcm94eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy90ZXN0L3Rlc3RfcHJveHkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3Rlc3QvdGVzdF9wcm94eS5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiBzcmMvdGVzdC8kKERFUERJUikvdGVzdF9wcm94eS10ZXN0X3Byb3h5LlRwbyBzcmMvdGVzdC8kKERFUERJUikvdGVzdF9wcm94eS10ZXN0X3Byb3h5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdGVzdC90ZXN0X3Byb3h5LmMnIG9iamVjdD0nc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHkub2JqIGBpZiB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Rlc3QvdGVzdF9wcm94eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdGVzdC90ZXN0X3Byb3h5LmMnOyBmaWAKLQotc3JjL3Rlc3QvdGVzdF9wcm94eS10ZXN0X3Byb3h5X2NsbnQubzogc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50Lm8gLU1EIC1NUCAtTUYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50LlRwbyAtYyAtbyBzcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5vIGB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy90ZXN0LyQoREVQRElSKS90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5UcG8gc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYycgb2JqZWN0PSdzcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50Lm8gYHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYwotCi1zcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5vYmo6IHNyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5vYmogLU1EIC1NUCAtTUYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50LlRwbyAtYyAtbyBzcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50LlRwbyBzcmMvdGVzdC8kKERFUERJUikvdGVzdF9wcm94eS10ZXN0X3Byb3h5X2NsbnQuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJyBvYmplY3Q9J3NyYy90ZXN0L3Rlc3RfcHJveHktdGVzdF9wcm94eV9jbG50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzcmMvdGVzdC90ZXN0X3Byb3h5LXRlc3RfcHJveHlfY2xudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYyc7IGZpYAotCi1zcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X3Jldi5vOiBzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3Byb3h5X3Jldl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYubyAtTUQgLU1QIC1NRiBzcmMvdGVzdC8kKERFUERJUikvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYuVHBvIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2Lm8gYHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy90ZXN0LyQoREVQRElSKS90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X3Jldi5UcG8gc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jJyBvYmplY3Q9J3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJveHlfcmV2X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2Lm8gYHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMKLQotc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYub2JqOiBzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3Byb3h5X3Jldl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYub2JqIC1NRCAtTVAgLU1GIHNyYy90ZXN0LyQoREVQRElSKS90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X3Jldi5UcG8gLWMgLW8gc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYub2JqIGBpZiB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mIHNyYy90ZXN0LyQoREVQRElSKS90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X3Jldi5UcG8gc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jJyBvYmplY3Q9J3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfcmV2Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcm94eV9yZXZfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9yZXYub2JqIGBpZiB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LmMnOyBmaWAKLQotc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm86IHNyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3Byb3h5X3Jldl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm8gLU1EIC1NUCAtTUYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5UcG8gLWMgLW8gc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm8gYHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5UcG8gc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMnIG9iamVjdD0nc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJveHlfcmV2X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5vIGB0ZXN0IC1mICdzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMKLQotc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm9iajogc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJveHlfcmV2X0NGTEFHUykgJChDRkxBR1MpIC1NVCBzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X2NsbnQub2JqIC1NRCAtTVAgLU1GIHNyYy90ZXN0LyQoREVQRElSKS90ZXN0X3Byb3h5X3Jldi10ZXN0X3Byb3h5X2NsbnQuVHBvIC1jIC1vIHNyYy90ZXN0L3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5vYmogYGlmIHRlc3QgLWYgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5UcG8gc3JjL3Rlc3QvJChERVBESVIpL3Rlc3RfcHJveHlfcmV2LXRlc3RfcHJveHlfY2xudC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMnIG9iamVjdD0nc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcm94eV9yZXZfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYtdGVzdF9wcm94eV9jbG50Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3Rlc3QvdGVzdF9wcm94eV9jbG50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jJzsgZmlgCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0kKFJFQ1VSU0lWRV9UQVJHRVRTKToKLQlAZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICB8fCBldmFsICQkZmFpbGNvbTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi0kKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKLQlAZmFpbGNvbT0nZXhpdCAxJzsgXAotCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKLQkgIGNhc2UgJCRmIGluIFwKLQkgICAgKj0qIHwgLS1bIWtdKik7OyBcCi0JICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCi0JICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCi0JZXNhYzsgXAotCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIGZpOyBcCi0JZG9uZTsgXAotCXJldj0iJCRyZXYgLiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi1jdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKLQlkb25lCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD0uOyBcCi0JZWxzZSBcCi0JICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKLQkgIGVtcHR5X2ZpeD07IFwKLQlmaTsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAotCSAgICAgIHRhZ3M9IiQkdGFncyAkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHRhZ3MgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmIGNkICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JdGVzdCAtZCAkKGRpc3RkaXIpIHx8IG1rZGlyICQoZGlzdGRpcikKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCi0JICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGRpc3RkaXI9YCQoYW1fX2NkKSAkKGRpc3RkaXIpICYmIHB3ZGA7IFwKLQkgICAgdG9wX2Rpc3RkaXI9YCQoYW1fX2NkKSAkKHRvcF9kaXN0ZGlyKSAmJiBwd2RgOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiBcCi0JICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkdG9wX2Rpc3RkaXIiIFwKLQkgICAgICAgIGRpc3RkaXI9IiQkZGlzdGRpci8kJHN1YmRpciIgXAotCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCi0JCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKLQkgICAgICAgIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCi0JfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKLWRpc3QtZ3ppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtYnppcDI6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXRhclo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1zaGFyOiBkaXN0ZGlyCi0Jc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC16aXA6IGRpc3RkaXIKLQktcm0gLWYgJChkaXN0ZGlyKS56aXAKLQl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKLQkqLnRhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmJ6MiopIFwKLQkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAotCSouemlwKikgXAotCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCi0JZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS9faW5zdAotCWNobW9kIGEtdyAkKGRpc3RkaXIpCi0JZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCi0JICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKLQkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAotCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgJiYgKHsgXAotCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCi0JICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKLQkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKLQkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKLQkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKLQkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKLQkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JwotZGlzdHVuaW5zdGFsbGNoZWNrOgotCUBjZCAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpIFwKLQkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKLQkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAotCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAotCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAotCSAgICAgICAgZmkgOyBcCi0JICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICAgZXhpdCAxOyB9ID4mMgotZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgotCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAotCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKLQkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICBleGl0IDE7IH0gPiYyCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKFBST0dSQU1TKSAkKEhFQURFUlMpIGNvbmZpZy5oCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChiaW5kaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBzcmMvY2xpZW50LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL2NsaWVudC8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL2ltcGwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotCS1ybSAtZiBzcmMvaW1wbC8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL21pLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL21pLyQoYW1fX2RpcnN0YW1wKQotCS1ybSAtZiBzcmMvc2VydmVyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL3NlcnZlci8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL3Rlc3QvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQotCS1ybSAtZiBzcmMvdGVzdC8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL3V0aWxzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKLQktcm0gLWYgc3JjL3V0aWxzLyQoYW1fX2RpcnN0YW1wKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQljbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmIHNyYy9jbGllbnQvJChERVBESVIpIHNyYy9pbXBsLyQoREVQRElSKSBzcmMvbWkvJChERVBESVIpIHNyYy9zZXJ2ZXIvJChERVBESVIpIHNyYy90ZXN0LyQoREVQRElSKSBzcmMvdXRpbHMvJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLXJlY3Vyc2l2ZQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtcmVjdXJzaXZlCi0KLWluZm86IGluZm8tcmVjdXJzaXZlCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCi0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCi0JLXJtIC1yZiBzcmMvY2xpZW50LyQoREVQRElSKSBzcmMvaW1wbC8kKERFUERJUikgc3JjL21pLyQoREVQRElSKSBzcmMvc2VydmVyLyQoREVQRElSKSBzcmMvdGVzdC8kKERFUERJUikgc3JjL3V0aWxzLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotcGRmOiBwZGYtcmVjdXJzaXZlCi0KLXBkZi1hbToKLQotcHM6IHBzLXJlY3Vyc2l2ZQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMKLQotLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGluc3RhbGwtYW0gXAotCWluc3RhbGwtc3RyaXAKLQotLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCi0JYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1iaW5QUk9HUkFNUyBcCi0JY2xlYW4tZ2VuZXJpYyBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgXAotCWN0YWdzLXJlY3Vyc2l2ZSBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgZGlzdC1nemlwIGRpc3Qtc2hhciBcCi0JZGlzdC10YXJaIGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAotCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuY2hlY2sgXAotCWRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gXAotCWluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKLQlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAotCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCi0JaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKLQlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCi0JbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCW1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKLQl1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5QUk9HUkFNUwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL05FV1MgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9ORVdTCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vUkVBRE1FIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGMzZmYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1UaGlzIGlzIHRoZSBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFBUUCBTY2FsYWJsZSBEZWJ1ZyBNYW5hZ2VyIChTRE0pLiBUaGUgU0RNIGlzIGFuIAotTVBJLWJhc2VkIGNsaWVudC9zZXJ2ZXIgZnJhbWV3b3JrIGZvciBjb250cm9sbGluZyBtdWx0aXBsZSBkaXN0cmlidXRlZCBwcm9jZXNzZXMuIFRoZSAKLXByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGZyYW1ld29yayBpcyB0byBhdHRhY2ggYmFja2VuZCBkZWJ1Z2dlcnMgdG8gdGhlIHByb2Nlc3NlcyBiZWluZyAKLWRlYnVnZ2VkLCBhbmQgdG8gcHJvdmlkZSBhIGxpYnJhcnkgaW50ZXJmYWNlIHRvIGNvbnRyb2wgdGhlIGRlYnVnZ2luZyBvZiB0aGVzZSBwcm9jZXNzZXMuCi0KLUJhc2ljIEluc3RhbGxhdGlvbgotPT09PT09PT09PT09PT09PT09Ci0KLVRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHVzZWQgdG8gc2V0IHVwIHlvdXIgYnVpbGQgZW52aXJvbm1lbnQgc28gdGhhdCB0aGUgZXhlY3V0YWJsZQotIHdpbGwgYmUgY29ycmVjdGx5IGJ1aWx0IGFuZCBpbnN0YWxsZWQuIEluIG9yZGVyIHRvIHVzZSB0aGUgc2VydmVyIGJpbmFyeSwgaXQgbmVlZHMgdG8gCi1iZSBpbnN0YWxsZWQgaW4gYSBmcmFnbWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIG1hY2hpbmUgCi1pdCB3aWxsIGJlIHJ1biBvbi4gCi0KLTEuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBjaGVja2VkIG91dCB0aGUgZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0byB5b3VyIGFyY2hpdGVjdHVyZS4gCi0gICBGb3IgZXhhbXBsZSwgaWYgeW91J3JlIG9uIGEgTGludXggeDg2IG1hY2hpbmUsIHlvdSBzaG91bGQgaGF2ZSB0aGUgZnJhZ21lbnQ6Ci0KLQkJb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4NgotCi0yLiBSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIElOIFRIRSBGUkFHTUVOVCBESVJFQ1RPUlkgdG8gY29uZmlndXJlLCBidWlsZCBhbmQgCi0gICBpbnN0YWxsIHRoZSBwcm9qZWN0OgotICAgCi0gICAJCXNoIEJVSUxECi0KLTMuIFlvdSBjYW4gYWxzbyB1c2UgJ21ha2UnIGFuZCAnbWFrZSBpbnN0YWxsJyBmcm9tIHRoaXMgZGlyZWN0b3J5LCBlaXRoZXIgZnJvbQotICAgdGhlIGNvbW1hbmQgbGluZSwgb3IgZnJvbSB0aGUgJ01ha2UgVGFyZ2V0cycgdmlldyBpbiBFY2xpcHNlIHRvIAotICAgYnVpbGQgYW5kIGluc3RhbGwgdGhlIGV4ZWN1dGFibGUgaW50byB0aGUgZnJhZ21lbnQgZGlyZWN0b3J5LgotCi00LiBJZiBhbnkgb2YgdGhlIGF1dG9tYWtlL2F1dG9jb25mIGZpbGVzIGNoYW5nZXMsIHlvdSBzaG91bGQganVzdCBuZWVkIHRvCi0gICBydW4gJ21ha2UnIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgZmlsZXMuCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYWJvdXQuaHRtbCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYWNpbmNsdWRlLm00IGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWYzN2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotZG5sICRJZDogYWNsb2NhbC5tNCx2IDEuMSAyMDA1LzA4LzE4IDIzOjM4OjI5IGd3YXRzb24gRXhwICQKLWRubAotZG5sIEFDX1RFU1RfUEFDS0FHRV9ORVcocGFja2FnZSxoZWFkZXJzLGxpYnJhcmllcyxleHRyYSBsaWJzLGRlZmF1bHQgbG9jYXRpb25zLCBjb25kaXRpb25hbCkKLQotQUNfUFJFUkVRKDIuNTApZG5sIDIuNTAKLUFDX0RFRlVOKFtBQ19URVNUX1BBQ0tBR0VdLFtNWV9URVNUX1BBQ0tBR0VfTkVXKCQxLFsjaW5jbHVkZSA8JDI+XSwkNCwsJDUpXSkKLQotQUNfREVGVU4oW0FDX1RFU1RfUEFDS0FHRV9ORVddLFsKLUFDX0FSR19XSVRIKCQxLAotWyAgLS13aXRoLSQxPWRpciAgICAgICAgICAgICAgICB1c2UgJDEgaW4gZGlyXSkKLUFDX0FSR19XSVRIKCQxLWxpYiwKLVsgIC0td2l0aC0kMS1saWI9ZGlyICAgICAgICAgICAgdXNlICQxIGxpYnJhcmllcyBpbiBkaXJdLAotW2lmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0gIEFDX01TR19FUlJPUihbTm8gYXJndW1lbnQgZm9yIC0td2l0aC0kMS1saWJdKQotZWxpZiB0ZXN0ICJYJHdpdGhfJDEiID0gIlgiOyB0aGVuCi0gIHdpdGhfJDE9eWVzCi1maV0pCi1BQ19BUkdfV0lUSCgkMS1pbmNsdWRlLAotWyAgLS13aXRoLSQxLWluY2x1ZGU9ZGlyICAgICAgICB1c2UgJDEgaGVhZGVycyBpbiBkaXJdLAotW2lmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0gIEFDX01TR19FUlJPUihbTm8gYXJndW1lbnQgZm9yIC0td2l0aC0kMS1pbmNsdWRlXSkKLWVsaWYgdGVzdCAiWCR3aXRoXyQxIiA9ICJYIjsgdGhlbgotICB3aXRoXyQxPXllcwotZmldKQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yICQxKQotCi1jYXNlICIkd2l0aF8kMSIgaW4KLXllcykJOzsKLW5vKQk7OwotIiIpCTs7Ci0qKQlpZiB0ZXN0ICIkd2l0aF8kMV9pbmNsdWRlIiA9ICIiOyB0aGVuCi0JCXdpdGhfJDFfaW5jbHVkZT0iJHdpdGhfJDEvaW5jbHVkZSAkd2l0aF8kMSIKLQlmaQotCWlmIHRlc3QgIiR3aXRoXyQxX2xpYiIgPSAiIjsgdGhlbgotCQl3aXRoXyQxX2xpYj0iJHdpdGhfJDEvbGliJGFiaWxpYmRpcmV4dCAkd2l0aF8kMSIKLQlmaQotCTs7Ci1lc2FjCi1oZWFkZXJfZGlycz0KLWxpYl9kaXJzPQotZD0nJDUnCi1mb3IgaSBpbiAvdXNyICRkOyBkbwotCWhlYWRlcl9kaXJzPSIkaGVhZGVyX2RpcnMgJGkvaW5jbHVkZSIKLQlsaWJfZGlycz0iJGxpYl9kaXJzICRpL2xpYiRhYmlsaWJkaXJleHQiCi1kb25lCi1oZWFkZXJfZGlycz0iJGhlYWRlcl9kaXJzICInJDUnCi1saWJfZGlycz0iJGxpYl9kaXJzICInJDUnCi0KLWNhc2UgIiR3aXRoXyQxX2luY2x1ZGUiIGluCi15ZXMpIDs7Ci1ubykgIDs7Ci0qKSAgIGhlYWRlcl9kaXJzPSIkd2l0aF8kMV9pbmNsdWRlICRoZWFkZXJfZGlycyI7OwotZXNhYwotY2FzZSAiJHdpdGhfJDFfbGliIiBpbgoteWVzKSA7Owotbm8pICA7OwotKikgICBsaWJfZGlycz0iJHdpdGhfJDFfbGliICRsaWJfZGlycyI7OwotZXNhYwotCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLXNhdmVfTElCUz0iJExJQlMiCi1pcmVzPSBscmVzPQotCi1mb3IgaSBpbiAkaGVhZGVyX2RpcnM7IGRvCi0JQ0ZMQUdTPSItSSRpICRzYXZlX0NGTEFHUyIKLQlDRkxBR1M9YGVjaG8gJENGTEFHUyB8IHNlZCAncy8kKFRPUCkvLi9nJ2AKLQlBQ19UUllfQ09NUElMRShbJDJdLCxpcmVzPSRpO2JyZWFrKQotZG9uZQotZm9yIGkgaW4gJGxpYl9kaXJzOyBkbwotCUxJQlM9Ii1MJGkgJDMgJDQgJHNhdmVfTElCUyIKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLyQoVE9QKS8uL2cnYAotCUFDX1RSWV9MSU5LKFskMl0sLGxyZXM9JGk7YnJlYWspCi1kb25lCi1DRkxBR1M9IiRzYXZlX0NGTEFHUyIKLUxJQlM9IiRzYXZlX0xJQlMiCi0KLWlmIHRlc3QgIiRpcmVzIiAtYSAiJGxyZXMiIC1hICIkd2l0aF8kMSIgIT0gIm5vIjsgdGhlbgotCSQxX2luY2x1ZGVkaXI9IiRpcmVzIgotCSQxX2xpYmRpcj0iJGxyZXMiCi0JRElSXyQxPQotCWlmIHRlc3QgIiQkMV9pbmNsdWRlZGlyIiAhPSAiL3Vzci9pbmNsdWRlIjsgdGhlbgotCQlJTkNMVURFXyQxPSItSSQkMV9pbmNsdWRlZGlyIgotCWZpCi0JaWYgdGVzdCAiJCQxX2xpYmRpciIgIT0gIi91c3IvbGliIjsgdGhlbgotCQlMSUJfJDE9Ii1MJCQxX2xpYmRpciAkMyIKLQllbHNlCi0JCUxJQl8kMT0iJDMiCi0JZmkKLQltNF9pZnZhbChbJDZdLAotCQlBQ19ERUZJTkVfVU5RVU9URUQoJDYsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAkMSBwYWNrYWdlLl0pLAotCQlBQ19ERUZJTkVfVU5RVU9URUQodXBjYXNlKCQxKSwxLFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICQxIHBhY2thZ2UuXSkpCi0Jd2l0aF8kMT15ZXMKLQlBQ19NU0dfUkVTVUxUKFtoZWFkZXJzICRpcmVzLCBsaWJyYXJpZXMgJGxyZXNdKQotZWxzZQotCURJUl8kMT0iJDEiCi0JSU5DTFVERV8kMT0KLQlMSUJfJDE9Ci0Jd2l0aF8kMT1ubwotCUFDX01TR19SRVNVTFQoJHdpdGhfJDEpCi1maQotZG5sIG00X2lmdmFsKFskNl0sCi1kbmwgCUFNX0NPTkRJVElPTkFMKCQ2LCB0ZXN0ICIkd2l0aF8kMSIgPSB5ZXMpCi1kbmwgCUFNX0NPTkRJVElPTkFMKHVwY2FzZSgkMSksIHRlc3QgIiR3aXRoXyQxIiA9IHllcykpCi1BQ19TVUJTVChESVJfJDEpCi1BQ19TVUJTVChJTkNMVURFXyQxKQotQUNfU1VCU1QoTElCXyQxKQotXSkKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYWNsb2NhbC5tNCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2YTI3Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSw5MDkgKzAsMCBAQAotIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKLSMgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLW00X2lmKG00X1BBQ0tBR0VfVkVSU0lPTiwgWzIuNjFdLCwKLVttNF9mYXRhbChbdGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZm9yIGF1dG9jb25mIDIuNjEuCi1Zb3UgaGF2ZSBhbm90aGVyIHZlcnNpb24gb2YgYXV0b2NvbmYuICBJZiB5b3Ugd2FudCB0byB1c2UgdGhhdCwKLXlvdSBzaG91bGQgcmVnZW5lcmF0ZSB0aGUgYnVpbGQgc3lzdGVtIGVudGlyZWx5Ll0sIFs2M10pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fQVVUT01BS0VfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEF1dG9tYWtlIFguWSB0cmFjZXMgdGhpcyBtYWNybyB0byBlbnN1cmUgYWNsb2NhbC5tNCBoYXMgYmVlbgotIyBnZW5lcmF0ZWQgZnJvbSB0aGUgbTQgZmlsZXMgYWNjb21wYW55aW5nIEF1dG9tYWtlIFguWS4KLSMgKFRoaXMgcHJpdmF0ZSBtYWNybyBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoaXMgZmlsZS4pCi1BQ19ERUZVTihbQU1fQVVUT01BS0VfVkVSU0lPTl0sCi1bYW1fX2FwaV92ZXJzaW9uPScxLjEwJwotZG5sIFNvbWUgdXNlcnMgZmluZCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBtaXN0YWtlIGl0IGZvciBhIHdheSB0bwotZG5sIHJlcXVpcmUgc29tZSBtaW5pbXVtIHZlcnNpb24uICBQb2ludCB0aGVtIHRvIHRoZSByaWdodCBtYWNyby4KLW00X2lmKFskMV0sIFsxLjEwXSwgW10sCi0gICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCi1dKQotCi0jIF9BTV9BVVRPQ09ORl9WRVJTSU9OKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGFjbG9jYWwgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZmluZCB0aGUgQXV0b2NvbmYgdmVyc2lvbi4KLSMgVGhpcyBpcyBhIHByaXZhdGUgbWFjcm8gdG9vLiAgVXNpbmcgbTRfZGVmaW5lIHNpbXBsaWZpZXMKLSMgdGhlIGxvZ2ljIGluIGFjbG9jYWwsIHdoaWNoIGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgZGVmaW5pdGlvbi4KLW00X2RlZmluZShbX0FNX0FVVE9DT05GX1ZFUlNJT05dLCBbXSkKLQotIyBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KLSMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBQ19JTklUX0FVVE9NQUtFLgotQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAotW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTBdKWRubAotX0FNX0FVVE9DT05GX1ZFUlNJT04obTRfUEFDS0FHRV9WRVJTSU9OKV0pCi0KLSMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cwotIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bwotIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgotIwotIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCi0jIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCi0jIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAotIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKLSMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKLSMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCi0jIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCi0jCi0jICRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQotIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCi0jICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAotIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCi0jCi0jIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCi0jIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5Ci0jIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQotIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgotIwotIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKLSMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6Ci0jICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCi0jIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcwotIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgotIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQotIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgotIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCi0jIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KLSMKLSMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCi0jIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKLSMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgotCi1BQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAotW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCi1BQ19QUkVSRVEoWzIuNTBdKWRubAotIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAotYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotXSkKLQotIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA4Ci0KLSMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKLVtBQ19QUkVSRVEoMi41MilkbmwKLSBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAotCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKLUFDX1NVQlNUKFskMV9UUlVFXSlkbmwKLUFDX1NVQlNUKFskMV9GQUxTRV0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmkKLUFDX0NPTkZJR19DT01NQU5EU19QUkUoCi1baWYgdGVzdCAteiAiJHskMV9UUlVFfSIgJiYgdGVzdCAteiAiJHskMV9GQUxTRX0iOyB0aGVuCi0gIEFDX01TR19FUlJPUihbW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS5dXSkKLWZpXSldKQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA5Ci0KLSMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCi0jIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAotIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKLSMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZwotIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCi0KLQotIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgotIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgotIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgotIwotIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKLSMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKLSMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAotIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KLUFDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKLUFDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKLUFDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCi1BQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAotCi1pZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKLQotQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKLSAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCi1baWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gWydzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJ10gPCAuL2RlcGNvbXBgCi0gIGZpCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBlbHNlCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi1dKQotQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCi1BTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQotXSkKLQotCi0jIEFNX1NFVF9ERVBESVIKLSMgLS0tLS0tLS0tLS0tLQotIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KLSMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCi1BQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLUFDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKLV0pCi0KLQotIyBBTV9ERVBfVFJBQ0sKLSMgLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKLVtBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCi1bICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKLWlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgotICBBTURFUEJBQ0tTTEFTSD0nXCcKLWZpCi1BTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKLUFDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pZG5sCi1fQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBCQUNLU0xBU0hdKWRubAotXSkKLQotIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jc2VyaWFsIDMKLQotIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLVtmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KLSAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAotICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KLSAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKLSAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCi0gIGlmIHNlZCAxMHEgIiRtZiIgfCBncmVwICdeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlJyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCi0gIGVsc2UKLSAgICBjb250aW51ZQotICBmaQotICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCi0gIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKLSAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCi0gICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAjIGV4cGFuc2lvbi4KLSAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0gICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCi0gICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAotICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKLSAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgotICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICBkb25lCi1kb25lCi1dKSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0KLQotIyBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCi0jCi0jIFRoaXMgY29kZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gYXV0b21hdGljIGRlcGVuZGVuY3kgdHJhY2tpbmcKLSMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAotIyBuZWVkIGluIG9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBjb2RlLgotQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLVtBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKLSAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi0gICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDgKLQotIyBBTV9DT05GSUdfSEVBREVSIGlzIG9ic29sZXRlLiAgSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgQUNfQ09ORklHX0hFQURFUlMuCi1BVV9ERUZVTihbQU1fQ09ORklHX0hFQURFUl0sIFtBQ19DT05GSUdfSEVBREVSUygkQCldKQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEyCi0KLSMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCi0jIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKLSMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQotIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCi0jIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQotIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgotIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKLSMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKLSMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgotIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgotQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAotW0FDX1BSRVJFUShbMi42MF0pZG5sCi1kbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdwotZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCi1tNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KLSAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKLSAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgotICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi1BQ19TVUJTVChbQ1lHUEFUSF9XXSkKLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCi1tNF9pZnZhbChbJDJdLAotW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKLVtfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKLWRubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgotbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCi0gIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAotCi1fQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKLVtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQotQU1fUFJPR19JTlNUQUxMX1NICi1BTV9QUk9HX0lOU1RBTExfU1RSSVAKLUFDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLUFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLV9BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAotICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKLQkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKLV9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKLV0pCi1dKQotCi0KLSMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLSMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi0jIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KLQotIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQotIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCi0jIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KLUFDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKLVsjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkMSB8ICQxOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkMSIgPmBBU19ESVJOQU1FKFskMV0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NICi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgJGluc3RhbGxfc2guCi1BQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iXCQoU0hFTEwpICRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQotQUNfU1VCU1QoaW5zdGFsbF9zaCldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCi0jIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KLUFDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAotW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi1BQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQotCi0jIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIEFNX01BS0VfSU5DTFVERSgpCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCi1BQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKLVthbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCi0jIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCi0jIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0Ci0jIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAotIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCi1pZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KLSAgIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgIGFtX19xdW90ZT0KLSAgIF9hbV9yZXN1bHQ9R05VCi1maQotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCi0gICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQotICAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgIF9hbV9yZXN1bHQ9QlNECi0gICBmaQotZmkKLUFDX1NVQlNUKFthbV9faW5jbHVkZV0pCi1BQ19TVUJTVChbYW1fX3F1b3RlXSkKLUFDX01TR19SRVNVTFQoWyRfYW1fcmVzdWx0XSkKLXJtIC1mIGNvbmZpbmMgY29uZm1mCi1dKQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1Ci0KLSMgQU1fUFJPR19DQ19DX08KLSMgLS0tLS0tLS0tLS0tLS0KLSMgTGlrZSBBQ19QUk9HX0NDX0NfTywgYnV0IGNoYW5nZWQgZm9yIGF1dG9tYWtlLgotQUNfREVGVU4oW0FNX1BST0dfQ0NfQ19PXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDX0NfT10pZG5sCi1BQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFtjb21waWxlXSlkbmwKLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkWzJdIHwgc2VkIFsncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLyddYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19jY18nJHthY19jY31fY19vYFwiICE9IHllcyI7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLWRubCBNYWtlIHN1cmUgQUNfUFJPR19DQyBpcyBuZXZlciBjYWxsZWQgYWdhaW4sIG9yIGl0IHdpbGwgb3ZlcnJpZGUgb3VyCi1kbmwgc2V0dGluZyBvZiBDQy4KLW00X2RlZmluZShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgW200X2ZhdGFsKFtBQ19QUk9HX0NDIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgQU1fUFJPR19DQ19DX09dKV0pCi1dKQotCi0jIEZha2UgdGhlIGV4aXN0ZW5jZSBvZiBwcm9ncmFtcyB0aGF0IEdOVSBtYWludGFpbmVycyB1c2UuICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDUKLQotIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKLVtBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQotJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9Ci1BQ19TVUJTVCgkMSldKQotCi0KLSMgQU1fTUlTU0lOR19IQVNfUlVOCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCi0jIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLUFDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQotZmkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfTUtESVJfUAotIyAtLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCi1BQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKLVtBQ19QUkVSRVEoWzIuNjBdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKLWRubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKLWRubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgotZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCi1kbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCi1kbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCi1kbmwgTUtESVJfUCkuCi1BQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKLWNhc2UgJG1rZGlyX3AgaW4KLSAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCi1bbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi0KLSMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKLVtBQ19GT1JFQUNIKFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQotCi0jIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLUFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKLVttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9TQU5JVFlfQ0hFQ0sKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAotIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKLSMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKLSMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCi0jIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKLSMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQotIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCi1bQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWRubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKLUFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dGluZyBWQVJJQUJMRSA9IEBWQVJJQUJMRUAgaW4gTWFrZWZpbGUuaW4uCi0jIFRoaXMgbWFjcm8gaXMgdHJhY2VkIGJ5IEF1dG9tYWtlLgotQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIF9BTV9QUk9HX1RBUihGT1JNQVQpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCi0jIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mIGB2NycsIGB1c3RhcicsIG9yIGBwYXgnLgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAotIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQotIyAkdGFyZGlyLgotIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCi0jIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCi0jICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCi1BQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKLVsjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1BTV9NSVNTSU5HX1BST0coW0FNVEFSXSwgW3Rhcl0pCi1tNF9pZihbJDFdLCBbdjddLAotICAgICBbYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nXSwKLSAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKLSAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCi0jIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCi1fYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJwotX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KLSMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAotIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgotZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKLWRvCi0gIGNhc2UgJF9hbV90b29sIGluCi0gIGdudXRhcikKLSAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7Ci0gICAgZG8KLSAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCi0gICAgZG9uZQotICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCi0gICAgOzsKLSAgcGxhaW50YXIpCi0gICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKLSAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgotICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKLSAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3RhciB4ZiAtJwotICAgIDs7Ci0gIHBheCkKLSAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3BheCAtcicKLSAgICA7OwotICBjcGlvKQotICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKLSAgICA7OwotICBub25lKQotICAgIGFtX190YXI9ZmFsc2UKLSAgICBhbV9fdGFyXz1mYWxzZQotICAgIGFtX191bnRhcj1mYWxzZQotICAgIDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgotICAjIGFuZCBhbV9fdW50YXIgc2V0LgotICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKLQotICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQotICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCi0gICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKLSAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKLSAgZmkKLWRvbmUKLXJtIC1yZiBjb25mdGVzdC5kaXIKLQotQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQotQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQotQUNfU1VCU1QoW2FtX190YXJdKQotQUNfU1VCU1QoW2FtX191bnRhcl0pCi1dKSAjIF9BTV9QUk9HX1RBUgotCi1tNF9pbmNsdWRlKFthY2luY2x1ZGUubTRdKQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9hdXRvZ2VuLnNoIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9hdXRvZ2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmYwNmE3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYXV0b2dlbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhL2Jpbi9zaAotCi1BQ0xPQ0FMPWFjbG9jYWwKLUFVVE9NQUtFPWF1dG9tYWtlCi1BVVRPQ09ORj1hdXRvY29uZgotCi1hdXRvZ2VuKCkKLXsKLQllY2hvICJhdXRvZ2VuIGluICQxIgotCSRBQ0xPQ0FMCi0JJEFVVE9NQUtFCi0JJEFVVE9DT05GCi19Ci0JCi1ESVJTPSIuIgotCi1mb3IgZGlyIGluICRESVJTCi1kbwotCShjZCAkZGlyOyBhdXRvZ2VuICRkaXIpCi1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9idWlsZC5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDcxNDEwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBBVVRIT1JTLFwKLSAgICAgICAgICAgICAgIENPUFlJTkcsXAotICAgICAgICAgICAgICAgQ2hhbmdlTG9nLFwKLSAgICAgICAgICAgICAgIElOU1RBTEwsXAotICAgICAgICAgICAgICAgTWFrZWZpbGUuYW0sXAotICAgICAgICAgICAgICAgTWFrZWZpbGUuaW4sXAotICAgICAgICAgICAgICAgTkVXUyxcCi0gICAgICAgICAgICAgICBSRUFETUUsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhY2luY2x1ZGUubTQsXAotICAgICAgICAgICAgICAgYWNsb2NhbC5tNCxcCi0gICAgICAgICAgICAgICBhdXRvZ2VuLnNoLFwKLSAgICAgICAgICAgICAgIGNvbXBpbGUsXAotICAgICAgICAgICAgICAgY29uZmlnLmd1ZXNzLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5oLmluLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMsXAotICAgICAgICAgICAgICAgY29uZmlnLnN1YixcCi0gICAgICAgICAgICAgICBjb25maWd1cmUuaW4sXAotICAgICAgICAgICAgICAgY29uZmlndXJlLFwKLSAgICAgICAgICAgICAgIGRlcGNvbXAsXAotICAgICAgICAgICAgICAgaW5jbHVkZS8sXAotICAgICAgICAgICAgICAgaW5zdGFsbC1zaCxcCi0gICAgICAgICAgICAgICBsaWJhaWYvLFwKLSAgICAgICAgICAgICAgIGxpYnRvb2wsXAotICAgICAgICAgICAgICAgbHRtYWluLnNoLFwKLSAgICAgICAgICAgICAgIG1pc3NpbmcsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHNyYy9jbGllbnQvY2xpZW50LmMsXAotICAgICAgICAgICAgICAgc3JjL2NsaWVudC9jbGllbnRfY21kcy5jLFwKLSAgICAgICAgICAgICAgIHNyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jLFwKLSAgICAgICAgICAgICAgIHNyYy9jbGllbnQvY2xpZW50X3N2ci5jLFwKLSAgICAgICAgICAgICAgIHNyYy9jbGllbnQvc3RhcnR1cC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9DTElDb21tYW5kLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL0NMSU91dHB1dC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9DTElPdXRwdXQuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUkuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlBcmcuYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlBcmcuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlCcmVha0NvbW1hbmQuYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlCcmVha3BvaW50LmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JQnJlYWtwb2ludC5oLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSUNvbW1hbmQuYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlDb21tYW5kLmgsXAotICAgICAgICAgICAgICAgc3JjL21pL01JRXJyb3IuYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlFcnJvci5oLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSUV2ZW50LmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JRXZlbnQuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlFeGVjQ29tbWFuZC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSUZyYW1lLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JRnJhbWUuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlHREJDb21tYW5kLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JTWVtb3J5LmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JTWVtb3J5LmgsXAotICAgICAgICAgICAgICAgc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSU9PQlJlY29yZC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSU91dHB1dC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSU9PQlJlY29yZC5oLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSU91dHB1dC5oLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVBhcnNlci5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVJlc3VsdC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVJlc3VsdC5oLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVJlc3VsdFJlY29yZC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVJlc3VsdFJlY29yZC5oLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVNlc3Npb24uYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlTZXNzaW9uLmgsXAotICAgICAgICAgICAgICAgc3JjL21pL01JU3RhY2tDb21tYW5kLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JU3RyaW5nLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JU3RyaW5nLmgsXAotICAgICAgICAgICAgICAgc3JjL21pL01JVGhyZWFkLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JVGhyZWFkLmgsXAotICAgICAgICAgICAgICAgc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jLFwKLSAgICAgICAgICAgICAgIHNyYy9taS9NSVZhbHVlLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL01JVmFsdWUuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlWYXIuYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlWYXIuaCxcCi0gICAgICAgICAgICAgICBzcmMvbWkvTUlWYXJDb21tYW5kLmMsXAotICAgICAgICAgICAgICAgc3JjL21pL3Rlc3RfbWkuYyxcCi0gICAgICAgICAgICAgICBzcmMvbWkvdGVzdC5pbnB1dCxcCi0gICAgICAgICAgICAgICBzcmMvc2VydmVyL2JhY2tlbmQuYyxcCi0gICAgICAgICAgICAgICBzcmMvc2VydmVyL2dkYm1pX2JhY2tlbmQuYyxcCi0gICAgICAgICAgICAgICBzcmMvc2VydmVyL3NlcnZlci5jLFwKLSAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYyxcCi0gICAgICAgICAgICAgICBzcmMvc2VydmVyL3Rlc3RfYmFja2VuZC5jLFwKLSAgICAgICAgICAgICAgIHNyYy90ZXN0L3Rlc3RfcHJveHkuYyxcCi0gICAgICAgICAgICAgICBzcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYyxcCi0gICAgICAgICAgICAgICBzcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jLFwKLSAgICAgICAgICAgICAgIHNyYy90ZXN0L3Rlc3RfcHJveHlfc3ZyLmMsXAotICAgICAgICAgICAgICAgc3JjL3V0aWxzL2JyZWFrcG9pbnQuYyxcCi0gICAgICAgICAgICAgICBzcmMvdXRpbHMvZGVidWcuYyxcCi0gICAgICAgICAgICAgICBzcmMvdXRpbHMvZXJyb3IuYyxcCi0gICAgICAgICAgICAgICBzcmMvdXRpbHMvZXZlbnQuYyxcCi0gICAgICAgICAgICAgICBzcmMvdXRpbHMvaXRpbWVyLmMsXAotICAgICAgICAgICAgICAgc3JjL3V0aWxzL21lbW9yeWluZm8uYyxcCi0gICAgICAgICAgICAgICBzcmMvdXRpbHMvcnVudGltZS5jLFwKLSAgICAgICAgICAgICAgIHNyYy91dGlscy9zaWduYWxpbmZvLmMsXAotICAgICAgICAgICAgICAgc3JjL3V0aWxzL3N0YWNrZnJhbWUuYyxcCi0gICAgICAgICAgICAgICBzcmMvaW1wbC9zZG0uYyxcCi0gICAgICAgICAgICAgICBzcmMvaW1wbC9zZG1fYWdncmVnYXRlX2hhc2guYyxcCi0gICAgICAgICAgICAgICBzcmMvaW1wbC9zZG1faGVsbG9fcHJvdG8uYyxcCi0gICAgICAgICAgICAgICBzcmMvaW1wbC9zZG1fbWVzc2FnZV9vbXBpLmMsXAotICAgICAgICAgICAgICAgc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYyxcCi0gICAgICAgICAgICAgICBzcmMvaW1wbC9zZG1fcm91dGVfdHJlZS5jLFwKLSAgICAgICAgICAgICAgIHNyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYyxcCi0gICAgICAgICAgICAgICBzcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jLFwKLSAgICAgICAgICAgICAgIHNyYy91dGlscy9zZXJkZXMuYwotYmluLmV4Y2x1ZGVzID0gbGliYWlmLy5kZXBzLyxcCi0gICAgICAgICAgICAgICBsaWJhaWYvLmN2c2lnbm9yZSxcCi0gICAgICAgICAgICAgICBsaWJhaWYvZG9jLy5jdnNpZ25vcmUsXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLXV0aWwubyxcCi0gICAgICAgICAgICAgICBsaWJhaWYvbGliYWlmX2Etc3RydWN0Lm8sXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLXByaW50Lm8sXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLWlvLm8sXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLWZkcy5vLFwKLSAgICAgICAgICAgICAgIGxpYmFpZi9saWJhaWZfYS1lcnJvci5vLFwKLSAgICAgICAgICAgICAgIGxpYmFpZi9saWJhaWZfYS1jb252Lm8sXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLWNtcC5vLFwKLSAgICAgICAgICAgICAgIGxpYmFpZi9saWJhaWZfYS1jYWxjLm8sXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLWFycmF5Lm8sXAotICAgICAgICAgICAgICAgbGliYWlmL2xpYmFpZl9hLWFpZi5vLFwKLSAgICAgICAgICAgICAgIGxpYmFpZi9saWJhaWYuYSxcCi0gICAgICAgICAgICAgICBsaWJhaWYvTWFrZWZpbGUsXAotICAgICAgICAgICAgICAgbGliYWlmL2NvbmZpZy5sb2csXAotICAgICAgICAgICAgICAgbGliYWlmL2NvbmZpZy5oLFwKLSAgICAgICAgICAgICAgIGxpYmFpZi9zdGFtcC1oMSxcCi0gICAgICAgICAgICAgICBsaWJhaWYvdGVzdGFpZixcCi0gICAgICAgICAgICAgICBsaWJhaWYvdGVzdGFpZi10ZXN0YWlmLm8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vY29tcGlsZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vY29tcGlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTgxZTAwMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2NvbXBpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KLQotc2NyaXB0dmVyc2lvbj0yMDAzLTExLTA5LjAwCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKLSMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bwotIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KLQotY2FzZSAkMSBpbgotICAnJykKLSAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICAgICBleGl0IDE7Ci0gICAgIDs7Ci0gIC1oIHwgLS1oKikKLSAgICBjYXQgPDxcRU9GCi1Vc2FnZTogY29tcGlsZSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQotCi1XcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KLVJlbW92ZSBgLW8gZGVzdC5vJyBmcm9tIEFSR1MsIHJ1biBQUk9HUkFNIHdpdGggdGhlIHJlbWFpbmluZwotYXJndW1lbnRzLCBhbmQgcmVuYW1lIHRoZSBvdXRwdXQgYXMgZXhwZWN0ZWQuCi0KLUlmIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgd2hvbGUgcGFja2FnZSB0aGlzIGlzIG5vdCB0aGUKLXJpZ2h0IHNjcmlwdCB0byBydW46IHBsZWFzZSBzdGFydCBieSByZWFkaW5nIHRoZSBmaWxlIGBJTlNUQUxMJy4KLQotUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KLUVPRgotICAgIGV4aXQgMAotICAgIDs7Ci0gIC12IHwgLS12KikKLSAgICBlY2hvICJjb21waWxlICRzY3JpcHR2ZXJzaW9uIgotICAgIGV4aXQgMAotICAgIDs7Ci1lc2FjCi0KLQotcHJvZz0kMQotc2hpZnQKLQotb2ZpbGU9Ci1jZmlsZT0KLWFyZ3M9Ci13aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbwotICBjYXNlICIkMSIgaW4KLSAgICAtbykKLSAgICAgICMgY29uZmlndXJlIG1pZ2h0IGNob29zZSB0byBydW4gY29tcGlsZSBhcyBgY29tcGlsZSBjYyAtbyBmb28gZm9vLmMnLgotICAgICAgIyBTbyB3ZSBkbyBzb21ldGhpbmcgdWdseSBoZXJlLgotICAgICAgb2ZpbGU9JDIKLSAgICAgIHNoaWZ0Ci0gICAgICBjYXNlICIkb2ZpbGUiIGluCi0JKi5vIHwgKi5vYmopCi0JICA7OwotCSopCi0JICBhcmdzPSIkYXJncyAtbyAkb2ZpbGUiCi0JICBvZmlsZT0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgICAgOzsKLSAgICAqLmMpCi0gICAgICBjZmlsZT0kMQotICAgICAgYXJncz0iJGFyZ3MgJDEiCi0gICAgICA7OwotICAgICopCi0gICAgICBhcmdzPSIkYXJncyAkMSIKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotaWYgdGVzdCAteiAiJG9maWxlIiB8fCB0ZXN0IC16ICIkY2ZpbGUiOyB0aGVuCi0gICMgSWYgbm8gYC1vJyBvcHRpb24gd2FzIHNlZW4gdGhlbiB3ZSBtaWdodCBoYXZlIGJlZW4gaW52b2tlZCBmcm9tIGEKLSAgIyBwYXR0ZXJuIHJ1bGUgd2hlcmUgd2UgZG9uJ3QgbmVlZCBvbmUuICBUaGF0IGlzIG9rIC0tIHRoaXMgaXMgYQotICAjIG5vcm1hbCBjb21waWxhdGlvbiB0aGF0IHRoZSBsb3NpbmcgY29tcGlsZXIgY2FuIGhhbmRsZS4gIElmIG5vCi0gICMgYC5jJyBmaWxlIHdhcyBzZWVuIHRoZW4gd2UgYXJlIHByb2JhYmx5IGxpbmtpbmcuICBUaGF0IGlzIGFsc28KLSAgIyBvay4KLSAgZXhlYyAiJHByb2ciICRhcmdzCi1maQotCi0jIE5hbWUgb2YgZmlsZSB3ZSBleHBlY3QgY29tcGlsZXIgdG8gY3JlYXRlLgotY29maWxlPWBlY2hvICRjZmlsZSB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wuYyQvLm8vJ2AKLQotIyBDcmVhdGUgdGhlIGxvY2sgZGlyZWN0b3J5LgotIyBOb3RlOiB1c2UgYFsvLi1dJyBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgc2FtZSBuYW1lCi0jIHRoYXQgd2UgYXJlIHVzaW5nIGZvciB0aGUgLm8gZmlsZS4gIEFsc28sIGJhc2UgdGhlIG5hbWUgb24gdGhlIGV4cGVjdGVkCi0jIG9iamVjdCBmaWxlIG5hbWUsIHNpbmNlIHRoYXQgaXMgd2hhdCBtYXR0ZXJzIHdpdGggYSBwYXJhbGxlbCBidWlsZC4KLWxvY2tkaXI9YGVjaG8gJGNvZmlsZSB8IHNlZCAtZSAnc3xbLy4tXXxffGcnYC5kCi13aGlsZSB0cnVlOyBkbwotICBpZiBta2RpciAkbG9ja2RpciA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYnJlYWsKLSAgZmkKLSAgc2xlZXAgMQotZG9uZQotIyBGSVhNRTogcmFjZSBjb25kaXRpb24gaGVyZSBpZiB1c2VyIGtpbGxzIGJldHdlZW4gbWtkaXIgYW5kIHRyYXAuCi10cmFwICJybWRpciAkbG9ja2RpcjsgZXhpdCAxIiAxIDIgMTUKLQotIyBSdW4gdGhlIGNvbXBpbGUuCi0iJHByb2ciICRhcmdzCi1zdGF0dXM9JD8KLQotaWYgdGVzdCAtZiAiJGNvZmlsZSI7IHRoZW4KLSAgbXYgIiRjb2ZpbGUiICIkb2ZpbGUiCi1maQotCi1ybWRpciAkbG9ja2RpcgotZXhpdCAkc3RhdHVzCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOiBzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246IDIKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vY29uZmlnLmd1ZXNzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0Zjc3NzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDAyLTAzLTA0JwotCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4uCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAotIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KLSMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCi0jIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgotIwotIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKLSMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0KLQotT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCi0KLU9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0KLWhlbHA9IgotVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotd2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQotICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCAwIDs7Ci0gICAgLS12ZXJzaW9uIHwgLXYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCi0gICAgICAgZXhpdCAxIDs7Ci0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gIGV4aXQgMQotZmkKLQotCi1kdW1teT1kdW1teS0kJAotdHJhcCAncm0gLWYgJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXk7IGV4aXQgMScgMSAyIDE1Ci0KLSMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuCi0jIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCi0jIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCi0KLXNldF9jY19mb3JfYnVpbGQ9J2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KLSAsLCkgICAgZWNobyAiaW50IGR1bW15KCl7fSIgPiAkZHVtbXkuYyA7Ci0JZm9yIGMgaW4gY2MgZ2NjIGM4OSA7IGRvCi0JICAoJGMgJGR1bW15LmMgLWMgLW8gJGR1bW15Lm8pID4vZGV2L251bGwgMj4mMSA7Ci0JICBpZiB0ZXN0ICQ/ID0gMCA7IHRoZW4KLQkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7Ci0JICBmaSA7Ci0JZG9uZSA7Ci0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCA7Ci0JaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KLQkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7Ci0JZmkKLQk7OwotICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7Ci0gLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OwotZXNhYycKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgICo6TmV0QlNEOio6KikKLQkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKLQkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQotCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKLQkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4KLQkjCi0JIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCi0JIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCi0Jc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgotCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAotCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OwotCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OwotCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7Ci0JICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKLQllc2FjCi0JIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCi0JIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KLQljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCi0JICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JCQl8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsCi0JCXRoZW4KLQkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KLQkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPwotCQkgICAgb3M9bmV0YnNkCi0JCWVsc2UKLQkJICAgIG9zPW5ldGJzZGVsZgotCQlmaQotCQk7OwotCSAgICAqKQotCSAgICAgICAgb3M9bmV0YnNkCi0JCTs7Ci0JZXNhYwotCSMgVGhlIE9TIHJlbGVhc2UKLQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgotCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgotCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KLQllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKLQlleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWNwcGM6T3BlbkJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTg4azpPcGVuQlNEOio6KikKLQllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWVwcGM6T3BlbkJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwbWF4Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzZ2k6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWItdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjM6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICB3Z3Jpc2M6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+JGR1bW15LnMKLQkuZGF0YQotXCRMZm9ybWF0OgotCS5ieXRlIDM3LDEwMCw0NSwzNywxMjAsMTAsMAkjICIlZC0leFxuIgotCi0JLnRleHQKLQkuZ2xvYmwgbWFpbgotCS5hbGlnbiA0Ci0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDE2LFwkMjYsMAotCWxkZ3AgXCQyOSwwKFwkMjcpCi0JLnByb2xvZ3VlIDEKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciBcJDAKLQlsZGEgXCQyLC0xCi0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrIFwkMixcJDEKLQlsZGEgXCQxNixcJExmb3JtYXQKLQltb3YgXCQwLFwkMTcKLQlub3QgXCQxLFwkMTgKLQlqc3IgXCQyNixwcmludGYKLQlsZGdwIFwkMjksMChcJDI2KQotCW1vdiAwLFwkMTYKLQlqc3IgXCQyNixleGl0Ci0JLmVuZCBtYWluCi1FT0YKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JJENDX0ZPUl9CVUlMRCAkZHVtbXkucyAtbyAkZHVtbXkgMj4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQljYXNlIGAuLyRkdW1teWAgaW4KLQkJCTAtMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMS0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgotCQkJCTs7Ci0JCQkxLTEpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxLTEwMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkyLTMwMykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQkJMi0zMDcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IgotCQkJCTs7Ci0JCQkyLTEzMDcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IgotCQkJCTs7Ci0JCWVzYWMKLQlmaQotCXJtIC1mICRkdW1teS5zICRkdW1teQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0JZXhpdCAwIDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCAwIDs7Ci0gICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCi0JZWNobyBtNjhrLXVua25vd24tc3lzdjQKLQlleGl0IDA7OwotICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcwotCWV4aXQgMCA7OwotICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcwotCWV4aXQgMCA7OwotICAgICo6T1MvMzkwOio6KikKLQllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCi0JZXhpdCAwIDs7Ci0gICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQotCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgMDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIE5JTEUqOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCi0JdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwotCWNhc2UgImAvYmluL2FyY2hgIiBpbgotCSAgICBzdW4zKQotCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCSAgICBzdW40KQotCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQllc2FjCi0JZXhpdCAwIDs7Ci0gICAgYXVzaHA6U3VuT1M6KjoqKQotCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0JZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSSVNDKjpNYWNoOio6KikKLQllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCAwIDs7Ci0gICAgUklTQyo6VUxUUklYOio6KikKLQllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCi0JZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCi0JaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSNlbHNlCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKLSNlbmRpZgotCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjZW5kaWYKLQkgIGV4aXQgKC0xKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSBcCi0JICAmJiAuLyRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKLQllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KLQl0aGVuCi0JICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAotCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQotCSAgICB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCSAgICBlbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCSAgICBmaQotCWVsc2UKLQkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaSo4NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOjI6MykKLQlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0JCXJtIC1mICRkdW1teS5jICRkdW1teQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6WzQ1XSkKLQlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKLQlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJSUJNX0FSQ0g9cnM2MDAwCi0JZWxzZQotCQlJQk1fQVJDSD1wb3dlcnBjCi0JZmkKLQlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KLQkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKLQllbHNlCi0JCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjoqKQotCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCi0JZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bwotCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCi0gICAgKjpCT1NYOio6KikKLQllY2hvIHJzNjAwMC1idWxsLWJvc3gKLQlleGl0IDAgOzsKLSAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQotCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7Ci0JICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKLQkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCi0JCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCi0JCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgotICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAotICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQotICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OwotCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7Ci0gICAgICAgICAgICAgICAgICAgIGVzYWMKLQkJZmkKLQkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCi0JCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKLQotICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQotICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KLQotICAgICAgICAgICAgICBpbnQgbWFpbiAoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCi0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKLSAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQotICAgICAgICAgICAgICAJCXsKLSAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCX0gYnJlYWs7Ci0gICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCi0gICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICBleGl0ICgwKTsKLSAgICAgICAgICAgICAgfQotRU9GCi0JCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gLi8kZHVtbXlgCi0JCSAgICBpZiB0ZXN0IC16ICIkSFBfQVJDSCI7IHRoZW4gSFBfQVJDSD1ocHBhOyBmaQotCQkgICAgcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWZpIDs7Ci0JZXNhYwotCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICBpYTY0OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAkZHVtbXkuYyAtbyAkZHVtbXkgJiYgLi8kZHVtbXkgJiYgcm0gLWYgJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCXJtIC1mICRkdW1teS5jICRkdW1teQotCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKLQlleGl0IDAgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCi0JZWNobyBocHBhMS4wLWhwLWJzZAotCWV4aXQgMCA7OwotICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKLQllY2hvIGhwcGExLjAtaHAtbXBlaXgKLQlleGl0IDAgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaHA4Pz86T1NGMToqOiopCi0JZWNobyBocHBhMS4wLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGkqODY6T1NGMToqOiopCi0JaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKLQllbHNlCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKLQlmaQotCWV4aXQgMCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDAgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpbQS1aXTkwOio6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAotCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAotCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKLQkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OwotICAgIENSQVkqVDNEOio6KjoqKQotCWVjaG8gYWxwaGEtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OwotICAgIENSQVkqVDNFOio6KjoqKQotCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OwotICAgIENSQVkqU1YxOio6KjoqKQotCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0JRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotICAgICAgICBleGl0IDAgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzcGFyYyo6QlNEL09TOio6KikKLQllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCAwIDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIGkqOlBXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCi0JZXhpdCAwIDs7Ci0gICAgeDg2OkludGVyaXgqOjMqKQotCWVjaG8gaTM4Ni1wYy1pbnRlcml4MwotCWV4aXQgMCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KLQllY2hvIGkzODYtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDAgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgMCA7OwotICAgIGkqODY6TWluaXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAotCWV4aXQgMCA7OwotICAgIGFybSo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGlhNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4Ci0JZXhpdCAwIDs7Ci0gICAgbTY4KjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgbWlwczpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiBtaXBzCi0JI3VuZGVmIG1pcHNlbAotCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpIAotCUNQVT1taXBzZWwgCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKSAKLQlDUFU9bWlwcwotCSNlbHNlCi0JQ1BVPQotCSNlbmRpZgotCSNlbmRpZiAKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5DUFU9YAotCXJtIC1mICRkdW1teS5jCi0JdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiBlY2hvICIke0NQVX0tcGMtbGludXgtZ251IiAmJiBleGl0IDAKLQk7OwotICAgIHBwYzpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgcHBjNjQ6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgYWxwaGE6TGludXg6KjoqKQotCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCi0JICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OwotCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7Ci0JICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7Ci0JICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7Ci0JICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OwotCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7Ci0JICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKLSAgICAgICAgZXNhYwotCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgbGQuc28uMSA+L2Rldi9udWxsCi0JaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9Ci0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQotCSMgTG9vayBmb3IgQ1BVIGxldmVsCi0JY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KLQkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OwotCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7Ci0JICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKLQllc2FjCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKLQllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKLQlleGl0IDAgOzsKLSAgICBzaCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBpKjg2OkxpbnV4Oio6KikKLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKLQkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCi0JIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KLQlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgotCSAgZWxmMzItaTM4NikKLQkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKLQkJOzsKLQkgIGEub3V0LWkzODYtbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKLQkJZXhpdCAwIDs7CQkKLQkgIGNvZmYtaTM4NikKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIgotCQlleGl0IDAgOzsKLQkgICIiKQotCQkjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkgb3IKLQkJIyBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiCi0JCWV4aXQgMCA7OwotCWVzYWMKLQkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCSNpZmRlZiBfX0VMRl9fCi0JIyBpZmRlZiBfX0dMSUJDX18KLQkjICBpZiBfX0dMSUJDX18gPj0gMgotCUxJQkM9Z251Ci0JIyAgZWxzZQotCUxJQkM9Z251bGliYzEKLQkjICBlbmRpZgotCSMgZWxzZQotCUxJQkM9Z251bGliYzEKLQkjIGVuZGlmCi0JI2Vsc2UKLQkjaWZkZWYgX19JTlRFTF9DT01QSUxFUgotCUxJQkM9Z251Ci0JI2Vsc2UKLQlMSUJDPWdudWFvdXQKLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKLQlybSAtZiAkZHVtbXkuYwotCXRlc3QgeCIke0xJQkN9IiAhPSB4ICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIgJiYgZXhpdCAwCi0JdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiBlY2hvICIke1RFTlRBVElWRX0iICYmIGV4aXQgMAotCTs7Ci0gICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKLQkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgotCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKLQkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgotCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKLQlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKLQlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqOjU6Wzc4XSopCi0JY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KLQkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7Ci0JICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OwotCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6My4yOiopCi0JaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgotCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCi0JZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8ZWdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGVncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50ID9JSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqRE9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAotCWV4aXQgMCA7OwotICAgIHBjOio6KjoqKQotCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgotICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAotICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgotCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEludGVsOk1hY2g6Myo6KikKLQllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDAgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCAwIDs7Ci0gICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAotCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0Ci0JZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgotCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKLQlmaQotCWV4aXQgMCA7OwotICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKLQkjICJtaW5pZnJhbWUiCi0JZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgTTY4KjoqOlIzVls1NjddKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCkKLQlPU19SRUw9JycKLQl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKLQkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OwotICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JZWNobyBtNjhrLWF0YXJpLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LjAqOiopCi0JZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgU01bQkVdUzpVTklYX1NWOio6KikKLQllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBSTSo6U0lOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6U0lOSVgtKjoqOiopCi0JaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAotCWVsc2UKLQkJZWNobyBuczMyay1zbmktc3lzdgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLSAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6Vk9TOio6KikKLQkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KLQllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKLQlleGl0IDAgOzsKLSAgICBtYzY4KjpBL1VYOio6KikKLQllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3M2Ci0JZXhpdCAwIDs7Ci0gICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCi0JaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCi0JICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWJlLWJlb3MKLQlleGl0IDAgOzsKLSAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDAgOzsKLSAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgotCWVjaG8gaTU4Ni1wYy1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgU1gtNDpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgU1gtNTpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpSaGFwc29keToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RGFyd2luOio6KikKLQllY2hvIGB1bmFtZSAtcGAtYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQotCWlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIng4NnBjIjsgdGhlbgotCQlVTkFNRV9NQUNISU5FPXBjCi0JCWVjaG8gaTM4Ni0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngKLQllbHNlCi0JCWVjaG8gYHVuYW1lIC1wYC0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngKLQlmaQotCWV4aXQgMCA7OwotICAgICo6UU5YOio6NCopCi0JZWNobyBpMzg2LXBjLXFueAotCWV4aXQgMCA7OwotICAgIE5TUi1bR0tMTlBUVlddOk5PTlNUT1BfS0VSTkVMOio6KikKLQllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6Tm9uU3RvcC1VWDoqOiopCi0JZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKLQlleGl0IDAgOzsKLSAgICBCUzIwMDA6UE9TSVgqOio6KikKLQllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKLQlleGl0IDAgOzsKLSAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6UGxhbjk6KjoqKQotCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgotCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2Ci0JIyBvcGVyYXRpbmcgc3lzdGVtcy4KLQlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgotCSAgICBVTkFNRV9NQUNISU5FPWkzODYKLQllbHNlCi0JICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKLQlleGl0IDAgOzsKLSAgICBpKjg2Ok9TLzI6KjoqKQotCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5Ci0JIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKLQlleGl0IDAgOzsKLSAgICAqOlRPUFMtMTA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKLQlleGl0IDAgOzsKLSAgICAqOlRFTkVYOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKLQlleGl0IDAgOzsKLSAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAotCWV4aXQgMCA7OwotICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC14a2wtdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgKjpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgKjpJVFM6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKLQlleGl0IDAgOzsKLSAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKLQlleGl0IDAgOzsKLSAgICBpKjg2OmF0aGVvczoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCi0JZXhpdCAwIDs7Ci1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1ldmFsICRzZXRfY2NfZm9yX2J1aWxkCi1jYXQgPiRkdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQotI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgotI2VuZGlmCi0gIGludCB2ZXJzaW9uOwotICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIGlmICh2ZXJzaW9uIDwgNCkKLSAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBlbHNlCi0gICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jIGlmICFkZWZpbmVkICh1bHRyaXgpCi0jICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgIGlmIGRlZmluZWQgKEJTRCkKLSMgICBpZiBCU0QgPT0gNDMKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7Ci0jICAgZWxzZQotIyAgICBpZiBCU0QgPT0gMTk5MDA2Ci0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKLSMgICAgZWxzZQotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSAgZXhpdCAoMSk7Ci19Ci1FT0YKLQotJENDX0ZPUl9CVUlMRCAkZHVtbXkuYyAtbyAkZHVtbXkgMj4vZGV2L251bGwgJiYgLi8kZHVtbXkgJiYgcm0gLWYgJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KLQotIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQotCi1pZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQotdGhlbgotICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCi0gICAgYzEqKQotCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMyKikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzM4KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzQqKQotCWVjaG8gYzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGVzYWMKLWZpCi0KLWNhdCA+JjIgPDxFT0YKLSQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKLQotVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKLXRoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKLWRvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQotCi0gICAgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9jb25maWcvCi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCi0KLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAotCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCi0KLVVOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9Ci1VTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQotVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQotVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KLUVPRgotCi1leGl0IDEKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWcuaC5pbiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGY0MjMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotI2RlZmluZSBERUJVRwotI2lmZGVmIERFQlVHCi1leHRlcm4gaW50IGRlYnVnX2xldmVsOwotZXh0ZXJuIHZvaWQgZGVidWdfcHJpbnRmKGludCwgY2hhciAqLCAuLi4pOwotI2RlZmluZSBERUJVR19MRVZFTF9OT05FCTB4MDAKLSNkZWZpbmUgREVCVUdfTEVWRUxfQUxMCQkweGZmCi0jZGVmaW5lIERFQlVHX0xFVkVMX1NUQVJUVVAJMHgwMQotI2RlZmluZSBERUJVR19MRVZFTF9DTElFTlQJMHgwMgotI2RlZmluZSBERUJVR19MRVZFTF9TRVJWRVIJMHgwNAotI2RlZmluZSBERUJVR19MRVZFTF9CQUNLRU5ECTB4MDgKLSNkZWZpbmUgVEVTVF9ERUJVR19MRVZFTChsZXZlbCkJCQkoKGRlYnVnX2xldmVsJihsZXZlbCkpPT0obGV2ZWwpKQotI2RlZmluZSBERUJVR19QUklOVEYobGV2ZWwsZm9ybWF0LC4uLikJZGVidWdfcHJpbnRmKChsZXZlbCksKGZvcm1hdCksX19WQV9BUkdTX18pCi0jZGVmaW5lIERFQlVHX1BSSU5UUyhsZXZlbCxzdHIpCQkJZGVidWdfcHJpbnRmKChsZXZlbCksIiVzIiwoc3RyKSkKLSNlbHNlIC8qIERFQlVHICovCi0jZGVmaW5lIERFQlVHX1BSSU5URihsZXZlbCxmb3JtYXQsLi4uKQotI2RlZmluZSBERUJVR19QUklOVFMobGV2ZWwsc3RyKQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBkb24ndCBoYXZlIGB2cHJpbnRmJyBidXQgZG8gaGF2ZSBgX2RvcHJudC4nICovCi0jdW5kZWYgSEFWRV9ET1BSTlQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0bmFtZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRIT1NUTkFNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGpuaS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0pOSV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbnNsJyBsaWJyYXJ5ICgtbG5zbCkuICovCi0jdW5kZWYgSEFWRV9MSUJOU0wKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb3NpeDQnIGxpYnJhcnkgKC1scG9zaXg0KS4gKi8KLSN1bmRlZiBIQVZFX0xJQlBPU0lYNAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgbGlicmFyeSAoLWxzb2NrZXQpLiAqLwotI3VuZGVmIEhBVkVfTElCU09DS0VUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXRpbHMnIGxpYnJhcnkgKC1sdXRpbHMpLiAqLwotI3VuZGVmIEhBVkVfTElCVVRJTFMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBTeXN0ZW0gaGFzIG9wZW5wdHkoKSBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX09QRU5QVFkKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZWxlY3QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VMRUNUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnaG9sZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TSUdIT0xECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lncmVsc2UnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0lHUkVMU0UKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdzZXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0lHU0VUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJEVVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzdHInIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSU1RSCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG91bCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJUT1VMCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZwcmludGYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfVlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQgLWMgYW5kIC1vIHRvZ2V0aGVyLiAqLwotI3VuZGVmIE5PX01JTlVTX0NfTUlOVVNfTwotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRW5hYmxlIFBPU0lYIHN1cHBvcnQgaW4gR3VhcmQuICovCi0jdW5kZWYgUE9TSVgKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGBpbnQnIG9yIGB2b2lkJykuICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCi0jdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgPHN5cy90aW1lLmg+IGRlY2xhcmVzIGBzdHJ1Y3QgdG0nLiAqLwotI3VuZGVmIFRNX0lOX1NZU19USU1FCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2NvbmZpZy5zdWIgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNjU3OTcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDAyLTAzLTA3JwotCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgotIwotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUwotICAgICAgICQwIFtPUFRJT05dIEFMSUFTCi0KLUNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgotICAgICAgIGV4aXQgMSA7OwotCi0gICAgKmxvY2FsKikKLSAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLSAgICAgICBlY2hvICQxCi0gICAgICAgZXhpdCAwOzsKLQotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotY2FzZSAkIyBpbgotIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotIDEpIDs7Ci0gKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCB3aW5kb3dzMzItKiB8IHJ0bWstbm92YSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcykKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2NvdXQpCi0JCTs7Ci0JLXdycykKLQkJb3M9LXZ4d29ya3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1jaG9ydXNvcyopCi0JCW9zPS1jaG9ydXNvcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0gCS1jaG9ydXNyZGIpCi0gCQlvcz0tY2hvcnVzcmRiCi0JCWJhc2ljX21hY2hpbmU9JDEKLSAJCTs7Ci0JLWhpdXgqKQotCQlvcz0taGl1eHdlMgotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS11ZGsqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWlzYykKLQkJb3M9LWlzYzIuMgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWNsaXgqKQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAotCQk7OwotCS1pc2MqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWx5bngqKQotCQlvcz0tbHlueG9zCi0JCTs7Ci0JLXB0eCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAotCQk7OwotCS13aW5kb3dzbnQqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCi0JCTs7Ci0JLXBzb3MqKQotCQlvcz0tcHNvcwotCQk7OwotCS1taW50IHwgLW1pbnRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotZXNhYwotCi0jIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgotCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCi0JMTc1MGEgfCA1ODAgXAotCXwgYTI5ayBcCi0JfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAotCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCi0JfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRzcDE2eHggXAotCXwgZnIzMCBcCi0JfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAotCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCi0JfCBtMzJyIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgfCBtY29yZSBcCi0JfCBtaXBzIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwczY0ZWwgfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgfCBtaXBzNjR2cjQzMDAgXAotCXwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTY0IFwKLQl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3BlbnJpc2MgfCBvcjMyIFwKLQl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCi0JfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCi0JfCBweXJhbWlkIFwKLQl8IHNoIHwgc2hbMzRdIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoNjQgXAotCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCi0JfCBzdHJvbmdhcm0gXAotCXwgdGFob2UgfCB0aHVtYiB8IHRpYzgwIHwgdHJvbiBcCi0JfCB2ODUwIHwgdjg1MGUgXAotCXwgd2UzMmsgXAotCXwgeDg2IHwgeHNjYWxlIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4aykKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyKQotCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCW9zPS1ub25lCi0JCTs7Ci0JbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpKjg2IHwgeDg2XzY0KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQk1ODAtKiBcCi0JfCBhMjlrLSogXAotCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCi0JfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAotCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCi0JfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybXYqLSogXAotCXwgYXZyLSogXAotCXwgYnMyMDAwLSogXAotCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzU0eC0qIFwKLQl8IGNsaXBwZXItKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIFwKLQl8IGVseHNpLSogXAotCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgbTMyci0qIFwKLQl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1jb3JlLSogXAotCXwgbWlwcy0qIHwgbWlwczE2LSogfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogfCBtaXBzNjRvcmlvbi0qIFwKLQl8IG1pcHM2NG9yaW9uZWwtKiB8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIFwKLQl8IG1pcHNsZS0qIHwgbWlwc2VsLSogfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogXAotCXwgc2gtKiB8IHNoWzM0XS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiB8IHNobGUtKiB8IHNoNjQtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKLQl8IHRhaG9lLSogfCB0aHVtYi0qIHwgdGljMzAtKiB8IHRpYzU0eC0qIHwgdGljODAtKiB8IHRyb24tKiBcCi0JfCB2ODUwLSogfCB2ODUwZS0qIHwgdmF4LSogXAotCXwgd2UzMmstKiBcCi0JfCB4ODYtKiB8IHg4Nl82NC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzdG9ybXkxNi0qIFwKLQl8IHh0ZW5zYS0qIFwKLQl8IHltcC0qIFwKLQl8IHo4ay0qKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQlhbWlnYXVuaXggfCBhbWl4KQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWFwb2xsbzY4YnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1ic2QKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWM5MCkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY29udmV4LWMxKQotCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMyKQotCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzMikKLQkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM0KQotCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzgpCi0JCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY3JheSB8IGo5MCkKLQkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKLQkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWkqODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaSo4NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWkqODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpKjg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdudW0gfCBtMzIzMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJb3M9LXN5c3YKLQkJOzsKLQltZXJsaW4pCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawotCQlvcz0tc3lzdgotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltbWl4KikKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltb3JwaG9zKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQlvcz0tbW9ycGhvcwotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcjMyIHwgb3IzMi0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJOzsKLQlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCi0JICAgICAgICA7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0JcHczMikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KLQkJb3M9LXB3MzIKLQkJOzsKLQlyb202OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JczM5MCB8IHMzOTAtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQotCQk7OwotCXMzOTB4IHwgczM5MHgtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0gICAgICAgIHN2MSkKLQkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZCkKLQkJYmFzaWNfbWFjaGluZT1hbHBoYS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b2FkMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKLQkJb3M9LXRvcHMyMAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jd2luZG93czMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LXdpbmRvd3MzMi1tc3ZjcnQKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoMyB8IHNoNCB8IHNoM2ViIHwgc2g0ZWIpCi0JCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JYzR4KikKLQkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQotCQlvcz0tY29mZgotCQk7OwotCSotdW5rbm93bikKLQkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCi0JICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCi0JICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCi0JICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAotCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8qKQotCQlvcz0tbnRvLXFueAotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3BlbmVkKikKLQkJb3M9LW9wZW5lZGl0aW9uCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCSAgICAgICAgb3M9LW5leHRzdGVwMgotCQk7OwotCS1uc2sqKQotCQlvcz0tbnNrCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkgICAgICAgIG9zPS1taW50Ci0JCTs7Ci0JLW5vbmUpCi0JCTs7Ci0JKikKLQkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLWVsc2UKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgotIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKLSMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KLQotIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAotIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAotIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCi0jIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKLSMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCi0KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KLQlwZHAxMC0qKQotCQlvcz0tdG9wczIwCi0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCW9yMzItKikKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgotCQlvcz0tc3lzdjMKLQkJOzsKLQlzcGFyYy0qIHwgKi1zdW4pCi0JCW9zPS1zdW5vczQuMS4xCi0JCTs7Ci0JKi1iZSkKLQkJb3M9LWJlb3MKLQkJOzsKLQkqLWlibSkKLQkJb3M9LWFpeAotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLSAgICAgICAgKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLSAgICAgICAgKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotICAgICAgICAqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLSAgICAgICAgKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSotcm9tNjhrKQotCQlvcz0tY29mZgotCQk7OwotCSotKmJ1ZykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLWFwcGxlKQotCQlvcz0tbWFjb3MKLQkJOzsKLQkqLWF0YXJpKikKLQkJb3M9LW1pbnQKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktYmVvcyopCi0JCQkJdmVuZG9yPWJlCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLW1wZWl4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyogfCAtb3BlbmVkKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCQktdm9zKikKLQkJCQl2ZW5kb3I9c3RyYXR1cwotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vY29uZmlndXJlIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2MTZlYzcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIDIuMS40LgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCi0jIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLQotCi0jIFBBVEggbmVlZHMgQ1IKLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKLSAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotICBjaG1vZCAreCBjb25mJCQuc2gKLSAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgZWxzZQotICAgIFBBVEhfU0VQQVJBVE9SPToKLSAgZmkKLSAgcm0gLWYgY29uZiQkLnNoCi1maQotCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1hc19ubD0nCi0nCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1jYXNlICQwIGluCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi1mb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICi1kbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KLQotaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgotICBpZiAoZXZhbCAiOiIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi1lbHNlCi0gIGFzX2hhdmVfcmVxdWlyZWQ9bm8KLWZpCi0KLSAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IHllcyAmJiAJIChldmFsICI6Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9XCRMSU5FTk8KLSAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzJcIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0iKSAyPiAvZGV2L251bGw7IHRoZW4KLSAgOgotZWxzZQotICBhc19jYW5kaWRhdGVfc2hlbGxzPQotICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgY2FzZSAkYXNfZGlyIGluCi0JIC8qKQotCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KLQkgICAgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9IiRhc19jYW5kaWRhdGVfc2hlbGxzICRhc19kaXIvJGFzX2Jhc2UiCi0JICAgZG9uZTs7Ci0gICAgICAgZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLSAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCi0JICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0JCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLV9BU0VPRgotfTsgdGhlbgotICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsCi0JICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0JICAgICAgIGlmIHsgIiRhc19zaGVsbCIgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi06Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCAkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9ICIkMSIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotCi0oCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLV9BU0VPRgotfTsgdGhlbgotICBicmVhawotZmkKLQotZmkKLQotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgotICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgotICAgICAgICBkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICAgICAgICBkb25lCi0gICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQotZmkKLQotCi0gICAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IG5vOyB0aGVuCi0gIGVjaG8gVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCB0aGUKLSAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKLSAgICAgIGVjaG8gbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4gdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEKLSAgICAgIGVjaG8gc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLgotICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0KLWZpCi0KLWZpCi0KLQotCi0oZXZhbCAiYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCIpIHx8IHsKLSAgZWNobyBObyBzaGVsbCBmb3VuZCB0aGF0IHN1cHBvcnRzIHNoZWxsIGZ1bmN0aW9ucy4KLSAgZWNobyBQbGVhc2UgdGVsbCBhdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAotICBlY2hvIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0gIGVjaG8gbWVzc2FnZQotfQotCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgewotCi0gICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KLSAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQotICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKLSAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcwotICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0gICMgY2FzZSBhdCBsaW5lIGVuZC4KLSAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCi0gICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQotICBzZWQgLW4gJwotICAgIHAKLSAgICAvWyRdTElORU5PLz0KLSAgJyA8JGFzX215c2VsZiB8Ci0gICAgc2VkICcKLSAgICAgIHMvWyRdTElORU5PLiovJi0vCi0gICAgICB0IGxpbmVubwotICAgICAgYgotICAgICAgOmxpbmVubwotICAgICAgTgotICAgICAgOmxvb3AKLSAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwotICAgICAgdCBsb29wCi0gICAgICBzLy1cbi4qLy8KLSAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3hcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICAqKSAgIEVDSE9fQz0nXGMnOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpcgotZmkKLWVjaG8gPmNvbmYkJC5maWxlCi1pZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz0nbG4gLXMnCi0gICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgYXNfbG5fcz0nY3AgLXAnCi1lbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPWxuCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPToKLWVsc2UKLSAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSAgYXNfbWtkaXJfcD1mYWxzZQotZmkKLQotaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc190ZXN0X3g9J3Rlc3QgLXgnCi1lbHNlCi0gIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGFzX2xzX0xfb3B0aW9uPUwKLSAgZWxzZQotICAgIGFzX2xzX0xfb3B0aW9uPQotICBmaQotICBhc190ZXN0X3g9JwotICAgIGV2YWwgc2ggLWMgJ1wnJwotICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCi0gICAgICAgIHRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4KLSAgICAgICAgLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotCi1leGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCi0KLSMgTmFtZSBvZiB0aGUgaG9zdC4KLSMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCi0jIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLWFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotCi0jCi0jIEluaXRpYWxpemF0aW9ucy4KLSMKLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLWFjX2NsZWFuX2ZpbGVzPQotYWNfY29uZmlnX2xpYm9ial9kaXI9LgotTElCT0JKUz0KLWNyb3NzX2NvbXBpbGluZz1ubwotc3ViZGlycz0KLU1GTEFHUz0KLU1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtJwotUEFDS0FHRV9UQVJOQU1FPSdvcmctZWNsaXBzZS1wdHAtZGVidWctc2RtJwotUEFDS0FHRV9WRVJTSU9OPScyLjEuNCcKLVBBQ0tBR0VfU1RSSU5HPSdvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIDIuMS40JwotUEFDS0FHRV9CVUdSRVBPUlQ9JycKLQotYWNfdW5pcXVlX2ZpbGU9InNyYy9jbGllbnQvY2xpZW50LmMiCi0jIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCi1hY19pbmNsdWRlc19kZWZhdWx0PSJcCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9TVERMSUJfSAotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKLSMgIGluY2x1ZGUgPG1lbW9yeS5oPgotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERJTlRfSAotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYiCi0KLWFjX3N1YnN0X3ZhcnM9J1NIRUxMCi1QQVRIX1NFUEFSQVRPUgotUEFDS0FHRV9OQU1FCi1QQUNLQUdFX1RBUk5BTUUKLVBBQ0tBR0VfVkVSU0lPTgotUEFDS0FHRV9TVFJJTkcKLVBBQ0tBR0VfQlVHUkVQT1JUCi1leGVjX3ByZWZpeAotcHJlZml4Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1iaW5kaXIKLXNiaW5kaXIKLWxpYmV4ZWNkaXIKLWRhdGFyb290ZGlyCi1kYXRhZGlyCi1zeXNjb25mZGlyCi1zaGFyZWRzdGF0ZWRpcgotbG9jYWxzdGF0ZWRpcgotaW5jbHVkZWRpcgotb2xkaW5jbHVkZWRpcgotZG9jZGlyCi1pbmZvZGlyCi1odG1sZGlyCi1kdmlkaXIKLXBkZmRpcgotcHNkaXIKLWxpYmRpcgotbG9jYWxlZGlyCi1tYW5kaXIKLURFRlMKLUVDSE9fQwotRUNIT19OCi1FQ0hPX1QKLUxJQlMKLWJ1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUlOU1RBTExfUFJPR1JBTQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfREFUQQotYW1fX2lzcmMKLUNZR1BBVEhfVwotUEFDS0FHRQotVkVSU0lPTgotQUNMT0NBTAotQVVUT0NPTkYKLUFVVE9NQUtFCi1BVVRPSEVBREVSCi1NQUtFSU5GTwotaW5zdGFsbF9zaAotU1RSSVAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotbWtkaXJfcAotQVdLCi1TRVRfTUFLRQotYW1fX2xlYWRpbmdfZG90Ci1BTVRBUgotYW1fX3RhcgotYW1fX3VudGFyCi1idWlsZAotYnVpbGRfY3B1Ci1idWlsZF92ZW5kb3IKLWJ1aWxkX29zCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1DUFBGTEFHUwotYWNfY3RfQ0MKLUVYRUVYVAotT0JKRVhUCi1ERVBESVIKLWFtX19pbmNsdWRlCi1hbV9fcXVvdGUKLUFNREVQX1RSVUUKLUFNREVQX0ZBTFNFCi1BTURFUEJBQ0tTTEFTSAotQ0NERVBNT0RFCi1hbV9fZmFzdGRlcENDX1RSVUUKLWFtX19mYXN0ZGVwQ0NfRkFMU0UKLVJBTkxJQgotU1ZSX0xJQlMKLUNMTlRfTElCUwotQ1BQCi1HUkVQCi1FR1JFUAotUFRQREJHSk5JX1RSVUUKLVBUUERCR0pOSV9GQUxTRQotTElCT0JKUwotc3ViZGlycwotTFRMSUJPQkpTJwotYWNfc3Vic3RfZmlsZXM9JycKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTCi1DUFAnCi1hY19zdWJkaXJzX2FsbD0nbGliYWlmJwotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi1hY19pbml0X2hlbHA9Ci1hY19pbml0X3ZlcnNpb249ZmFsc2UKLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1jYWNoZV9maWxlPS9kZXYvbnVsbAotZXhlY19wcmVmaXg9Tk9ORQotbm9fY3JlYXRlPQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotCi0jIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KLSMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgotIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKLSMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KLSMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCi0jIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKLWRhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9JwotaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKLWh0bWxkaXI9JyR7ZG9jZGlyfScKLWR2aWRpcj0nJHtkb2NkaXJ9JwotcGRmZGlyPScke2RvY2Rpcn0nCi1wc2Rpcj0nJHtkb2NkaXJ9JwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1sb2NhbGVkaXI9JyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZScKLW1hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJwotCi1hY19wcmV2PQotYWNfZGFzaGRhc2g9Ci1mb3IgYWNfb3B0aW9uCi1kbwotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICRhY19vcHRpb24gaW4KLSAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OwotICAqKQlhY19vcHRhcmc9eWVzIDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgotICAtLSkKLSAgICBhY19kYXNoZGFzaD15ZXMgOzsKLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSRhY19vcHRhcmcgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OwotCi0gIC0tY29uZmlnLWNhY2hlIHwgLUMpCi0gICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKLSAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKLSAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCi0gICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OwotICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCi0gIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQotICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPVwkYWNfb3B0YXJnIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCi0gICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKLSAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQotICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKLSAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQotICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQotICAgIGFjX3ByZXY9aHRtbGRpciA7OwotICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKLSAgfCAtLWh0PSopCi0gICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKLSAgICBhY19wcmV2PWxvY2FsZWRpciA7OwotICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQotICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKLSAgICBhY19wcmV2PXBkZmRpciA7OwotICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQotICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKLSAgICBhY19wcmV2PXBzZGlyIDs7Ci0gIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQotICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCi0gICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPVwkYWNfb3B0YXJnIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1ubyA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgOzsKLQotICAqPSopCi0gICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKLSAgICBleHBvcnQgJGFjX2VudnZhciA7OwotCi0gICopCi0gICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgotICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCi0gICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259Ci0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZG9uZQotCi0jIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCi0jIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KLSMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLWJ1aWxkPSRidWlsZF9hbGlhcwotaG9zdD0kaG9zdF9hbGlhcwotdGFyZ2V0PSR0YXJnZXRfYWxpYXMKLQotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotaWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCi0gIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQotICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KLSAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZC4iID4mMgotICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPXllcwotICBmaQotZmkKLQotYWNfdG9vbF9wcmVmaXg9Ci10ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCi0KLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKLQotCi1hY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKLWFjX2xzX2RpPWBscyAtZGkgLmAgJiYKLWFjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IFdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotdGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8Ci0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJDAiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyBlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfbXNnIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCXB3ZClgCi0jIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgotaWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgotICBzcmNkaXI9LgotZmkKLSMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCi0jIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KLSMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgotY2FzZSAkc3JjZGlyIGluCi0qLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKLWVzYWMKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Ci0gIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Ci1kb25lCi0KLSMKLSMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KLSMKLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCi0gICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gIGNhdCA8PF9BQ0VPRgotXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSAyLjEuNCB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCi0KLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgotCi1UbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCi1WQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgotCi1EZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KLQotQ29uZmlndXJhdGlvbjoKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQotICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKLSAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCi0gIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCi0gIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotCQkJICBbUFJFRklYXQotCi1CeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLVxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5Ci1hbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAotZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLQotRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCi0KLUZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0tZGF0YXJvb3RkaXI9RElSICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQotICAtLWxvY2FsZWRpcj1ESVIgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCi0gIC0tZG9jZGlyPURJUiAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2Mvb3JnLWVjbGlwc2UtcHRwLWRlYnVnLXNkbV0KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotX0FDRU9GCi0KLSAgY2F0IDw8XF9BQ0VPRgotCi1Qcm9ncmFtIG5hbWVzOgotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi1fQUNFT0YKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCi0gIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2Ygb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSAyLjEuNDoiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKLQotU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCi0gIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQotICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0gIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KLSAgQ1BQRkxBR1MgICAgQy9DKysvT2JqZWN0aXZlIEMgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgotICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKLQotVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKLWl0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KLQotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fCBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0gICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQotICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgotICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KLSAgICAgIGVjaG8gJiYKLSAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCi0gICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLSAgICAgIGVjaG8gJiYKLSAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSBjb25maWd1cmUgMi4xLjQKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCi0yMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLV9BQ0VPRgotICBleGl0Ci1maQotY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLQotSXQgd2FzIGNyZWF0ZWQgYnkgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSAkYXNfbWUgMi4xLjQsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgJCAkMCAkQAotCi1fQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotY2F0IDw8X0FTVU5BTUUKLSMjIC0tLS0tLS0tLSAjIwotIyMgUGxhdGZvcm0uICMjCi0jIyAtLS0tLS0tLS0gIyMKLQotaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0KLV9BU1VOQU1FCi0KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19wYXNzIGluCi0gICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKLSAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgotCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KLSAgICAgIGVsc2UKLQljYXNlICRhY19hcmcgaW4KLQkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAotCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAotCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCi0JICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQotCi0jIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0jIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KLXRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotICB7Ci0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE91dHB1dCB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICAgIGRvbmUgfCBzb3J0Ci0gICAgICBlY2hvCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBjYXQgY29uZmRlZnMuaAotICAgICAgZWNobwotICAgIGZpCi0gICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLQotIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBzZXQgeCAiJENPTkZJR19TSVRFIgotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZmkKLXNoaWZ0Ci1mb3IgYWNfc2l0ZV9maWxlCi1kbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKLSAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gID4kY2FjaGVfZmlsZQotZmkKLQotIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQotIyB2YWx1ZS4KLWFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQotICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KLSAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICwpOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0JYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCi0gICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KLSAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTAnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKLSMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KLSMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgotYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCi1zL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCi1fQUNFT0YKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotcm0gLWYgY29uZnRlc3Quc2VkCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9Ci1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfSB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi0KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCi0gICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BV0s9JGFjX2N2X3Byb2dfQVdLCi1pZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCi1kb25lCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi0KLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotIFBBQ0tBR0U9J29yZy1lY2xpcHNlLXB0cC1kZWJ1Zy1zZG0nCi0gVkVSU0lPTj0nMi4xLjQnCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1fQUNFT0YKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotCi1BQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9Ci0KLQotQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQotCi0KLUFVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQotCi0KLU1BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQotCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iXCQoU0hFTEwpICRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQotCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKLWlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU1RSSVAiID4mNQotZWNobyAiJHtFQ0hPX1R9JFNUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KLSAgYWNfY3RfU1RSSVA9JFNUUklQCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKLWlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1NUUklQIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgotICAgIFNUUklQPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgU1RSSVA9JGFjX2N0X1NUUklQCi0gIGZpCi1lbHNlCi0gIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKLWZpCi0KLWZpCi1JTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgotCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLSMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotQU1UQVI9JHtBTVRBUi0iJHthbV9taXNzaW5nX3J1bn10YXIifQotCi1hbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLScKLQotCi0KLQotCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRhY19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQotCi0KLVVUSUxTPSIuLi9vcmcuZWNsaXBzZS5wdHAudXRpbHMiCi1pZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JVVRJTFM9ImBlY2hvICR7VVRJTFN9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHV0aWxzIGRpcmVjdG9yeSBub3QgZm91bmQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCWZpCi1maQotCi1QUk9YWT0iLi4vb3JnLmVjbGlwc2UucHRwLnByb3h5IgotaWYgdGVzdCAhIC1kICRQUk9YWTsgdGhlbgotCVBST1hZPSJgZWNobyAke1BST1hZfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRQUk9YWTsgdGhlbgotCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBwcm94eSBkaXJlY3Rvcnkgbm90IGZvdW5kIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHByb3h5IGRpcmVjdG9yeSBub3QgZm91bmQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQlmaQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZmkKLQotZmkKLQotCi10ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLWFjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC12ID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAtdiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLVYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQotCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0jIG9mIGV4ZWV4dC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLSMKLSMgTGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgZmlsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LgotIyBUaGUgYWxnb3JpdGhtIGlzIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKQotIyBvbmx5IGFzIGEgbGFzdCByZXNvcnQuICBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgotYWNfZmlsZXM9J2Ffb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQnCi0jCi0jIFRoZSBJUklYIDYgbGlua2VyIHdyaXRlcyBpbnRvIGV4aXN0aW5nIGZpbGVzIHdoaWNoIG1heSBub3QgYmUKLSMgZXhlY3V0YWJsZSwgcmV0YWluaW5nIHRoZWlyIHBlcm1pc3Npb25zLiAgUmVtb3ZlIHRoZW0gZmlyc3Qgc28gYQotIyBzdWJzZXF1ZW50IGV4ZWN1dGlvbiB0ZXN0IHdvcmtzLgotYWNfcm1maWxlcz0KLWZvciBhY19maWxlIGluICRhY19maWxlcwotZG8KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSAgZXNhYwotZG9uZQotcm0gLWYgJGFjX3JtZmlsZXMKLQotaWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwotIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKLSMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0jIEF1dG9jb25mLgotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCi1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKLQl0aGVuIDo7IGVsc2UKLQkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQlmaQotCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAotCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgotCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgotCSMgYWN0dWFsbHkgd29ya2luZy4KLQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi10ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLQotZWxzZQotICBhY19maWxlPScnCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbgotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotZmkKLQotYWNfZXhlZXh0PSRhY19jdl9leGVleHQKLQotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQotIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAotIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVzCi0gICAgZWxzZQotCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGZpCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQotcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjY7IH0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSAgYnJlYWs7OwotICAgICogKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mICkgOzsKLSAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKLSAgICAgICBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNjsgfQotT0JKRVhUPSRhY19jdl9vYmpleHQKLWFjX29iamV4dD0kT0JKRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jb21waWxlcl9nbnU9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLUdDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlDRkxBR1M9IiIKLSAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9wcm9nX2NjX2M4OT1ubwotYWNfc2F2ZV9DQz0kQ0MKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KLXN0cnVjdCBidWYgeyBpbnQgeDsgfTsKLUZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqZSAocCwgaSkKLSAgICAgY2hhciAqKnA7Ci0gICAgIGludCBpOwotewotICByZXR1cm4gcFtpXTsKLX0KLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgdmFfbGlzdCB2OwotICB2YV9zdGFydCAodixwKTsKLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKLSAgdmFfZW5kICh2KTsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCi0gICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCi0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKLSAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKLSAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZwotICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLwotaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKLQotLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCi0gICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCi0jZGVmaW5lIEZPTyh4KSAneCcKLWludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOwotCi1pbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKLXN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Owotc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307Ci1pbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKLWludCBhcmdjOwotY2hhciAqKmFyZ3Y7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAotCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCi1kbwotICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAotICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawotZG9uZQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotQ0M9JGFjX3NhdmVfQ0MKLQotZmkKLSMgQUNfQ0FDSEVfVkFMCi1jYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgotICB4KQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNjsgfSA7OwotICB4bm8pCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH11bnN1cHBvcnRlZCIgPiY2OyB9IDs7Ci0gICopCi0gICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKLWVzYWMKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1ERVBESVI9IiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiCi0KLWFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKLQotCi1hbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAkRUNIT19DIiA+JjY7IH0KLWFtX19pbmNsdWRlPSIjIgotYW1fX3F1b3RlPQotX2FtX3Jlc3VsdD1ub25lCi0jIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgotZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgotIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JwotIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgotIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAotIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKLSMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgotaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCi0gICBhbV9faW5jbHVkZT1pbmNsdWRlCi0gICBhbV9fcXVvdGU9Ci0gICBfYW1fcmVzdWx0PUdOVQotZmkKLSMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgotaWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgotICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgotICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgotICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgIGFtX19xdW90ZT0iXCIiCi0gICAgICBfYW1fcmVzdWx0PUJTRAotICAgZmkKLWZpCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kX2FtX3Jlc3VsdCIgPiY2OyB9Ci1ybSAtZiBjb25maW5jIGNvbmZtZgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7Ci1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBBTURFUF9UUlVFPQotICBBTURFUF9GQUxTRT0nIycKLWVsc2UKLSAgQU1ERVBfVFJVRT0nIycKLSAgQU1ERVBfRkFMU0U9Ci1maQotCi0KLQotZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCi0gIGZpCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBlbHNlCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCi0gICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQotICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAotICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCi0gICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKLSAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLQotICBjZCAuLgotICBybSAtcmYgY29uZnRlc3QuZGlyCi1lbHNlCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLWZpCi0KLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQotQ0NERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCi0KLSBpZgotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgotICBhbV9fZmFzdGRlcENDX1RSVUU9Ci0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9JyMnCi1lbHNlCi0gIGFtX19mYXN0ZGVwQ0NfVFJVRT0nIycKLSAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0KLWZpCi0KLQotaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlci4uLiAkRUNIT19DIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlci4uLiAkRUNIT19DIiA+JjY7IH0KLWZpCi1zZXQgZHVtbXkgJENDOyBhY19jYz1gZWNobyAkMiB8Ci0JCSAgICAgIHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCi1pZiB7IGFzX3Zhcj1hY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotIyBNYWtlIHN1cmUgaXQgd29ya3MgYm90aCB3aXRoICRDQyBhbmQgd2l0aCBzaW1wbGUgY2MuCi0jIFdlIGRvIHRoZSB0ZXN0IHR3aWNlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbgotIyBleGlzdGluZyAubyBmaWxlIHdpdGggLW8sIHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KLWFjX3RyeT0nJENDIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1Jwotcm0gLWYgY29uZnRlc3QyLioKLWlmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OwotdGhlbgotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPXllcwotICBpZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KLSAgICAjIFRlc3QgZmlyc3QgdGhhdCBjYyBleGlzdHMgYXQgYWxsLgotICAgIGlmIHsgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgICAgIGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCi0gICAgICBybSAtZiBjb25mdGVzdDIuKgotICAgICAgaWYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsKLSAgICAgIHRoZW4KLQkjIGNjIHdvcmtzIHRvby4KLQk6Ci0gICAgICBlbHNlCi0JIyBjYyBleGlzdHMgYnV0IGRvZXNuJ3QgbGlrZSAtby4KLQlldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0KgotCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28gPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIE5PX01JTlVTX0NfTUlOVVNfTyAxCi1fQUNFT0YKLQotZmkKLQotIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCi0jIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KLXNldCBkdW1teSAkQ0MKLWFjX2NjPWBlY2hvICQyIHwgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfY2NfJyR7YWNfY2N9X2Nfb2BcIiAhPSB5ZXMiOyB0aGVuCi0gICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgotICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KLSAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgotICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAotICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKLSAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKLWZpCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1SQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQotZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotICBhY19jdF9SQU5MSUI9JFJBTkxJQgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgotaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9SQU5MSUIiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgotICAgIFJBTkxJQj0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCi0gIGZpCi1lbHNlCi0gIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotZmkKLQotCi1vcz1gdW5hbWUgLXNgCi1pZiB0ZXN0ICJ4JG9zIiA9ICJ4QUlYIiA7IHRoZW4KLSAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1xaW5mbz1nZW4gLXFjcGx1c2NtdCIKLWVsc2UKLSAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgotZmkKLQotQ0ZMQUdTPSIkQ0ZMQUdTIC1JJFVUSUxTL2luY2x1ZGUgLUkkUFJPWFkvaW5jbHVkZSIKLUxJQlM9IiRMSUJTIC1MJFVUSUxTIC1MJFBST1hZIgotCi0KLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCTlNMIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sbnNsICRMSUJTIgotCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfc29ja2V0X3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNvY2tldCAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzb2NrZXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzb2NrZXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9saWJfc29ja2V0X3NvY2tldD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQlNPQ0tFVCAxCi1fQUNFT0YKLQotICBMSUJTPSItbHNvY2tldCAkTElCUyIKLQotZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVucHR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVucHR5Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfb3BlbnB0eStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIG9wZW5wdHkgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBvcGVucHR5ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfbGliIGluICcnIHV0aWw7IGRvCi0gIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCi0gICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgotICBlbHNlCi0gICAgYWNfcmVzPS1sJGFjX2xpYgotICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X3NlYXJjaF9vcGVucHR5PSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX29wZW5wdHkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgYnJlYWsKLWZpCi1kb25lCi1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVucHR5K3NldH0iID0gc2V0OyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3Zfc2VhcmNoX29wZW5wdHk9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfb3BlbnB0eSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2VhcmNoX29wZW5wdHkiID4mNjsgfQotYWNfcmVzPSRhY19jdl9zZWFyY2hfb3BlbnB0eQotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9PUEVOUFRZIDEKLV9BQ0VPRgotCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBiaXRzZXRfbmV3IGluIC1sdXRpbHMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYml0c2V0X25ldyBpbiAtbHV0aWxzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfdXRpbHNfYml0c2V0X25ldytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHV0aWxzICAkTElCUyIKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGJpdHNldF9uZXcgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBiaXRzZXRfbmV3ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXc9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3ID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJVVElMUyAxCi1fQUNFT0YKLQotICBMSUJTPSItbHV0aWxzICRMSUJTIgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJveHlfc3ZyX2luaXQgaW4gLWxwcm94eXN2ciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwcm94eV9zdnJfaW5pdCBpbiAtbHByb3h5c3ZyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwcm94eXN2ciAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwcm94eV9zdnJfaW5pdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHByb3h5X3N2cl9pbml0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQgPSB5ZXM7IHRoZW4KLSAgU1ZSX0xJQlM9IiRTVlJfTElCUyAtbHByb3h5c3ZyIgotZmkKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJveHlfY2xudF9pbml0IGluIC1scHJveHljbG50IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByb3h5X2NsbnRfaW5pdCBpbiAtbHByb3h5Y2xudC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3Byb3h5Y2xudF9wcm94eV9jbG50X2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwcm94eWNsbnQgICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcHJveHlfY2xudF9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcHJveHlfY2xudF9pbml0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3Byb3h5Y2xudF9wcm94eV9jbG50X2luaXQ9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfcHJveHljbG50X3Byb3h5X2NsbnRfaW5pdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3Byb3h5Y2xudF9wcm94eV9jbG50X2luaXQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wcm94eWNsbnRfcHJveHlfY2xudF9pbml0IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl9wcm94eWNsbnRfcHJveHlfY2xudF9pbml0ID0geWVzOyB0aGVuCi0gIENMTlRfTElCUz0iJENMTlRfTElCUyAtbHByb3h5Y2xudCIKLWZpCi0KLQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjbG9ja19nZXR0aW1lIGluIC1scG9zaXg0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNsb2NrX2dldHRpbWUgaW4gLWxwb3NpeDQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9wb3NpeDRfY2xvY2tfZ2V0dGltZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHBvc2l4NCAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBjbG9ja19nZXR0aW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gY2xvY2tfZ2V0dGltZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl9wb3NpeDRfY2xvY2tfZ2V0dGltZT15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9wb3NpeDRfY2xvY2tfZ2V0dGltZT1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3Bvc2l4NF9jbG9ja19nZXR0aW1lIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcG9zaXg0X2Nsb2NrX2dldHRpbWUiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX3Bvc2l4NF9jbG9ja19nZXR0aW1lID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJQT1NJWDQgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwb3NpeDQgJExJQlMiCi0KLWZpCi0KLWlmIHRlc3QgIiRhY19jdl9saWJfcG9zaXg0X2Nsb2NrX2dldHRpbWUiID0geWVzOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFBPU0lYIDEKLV9BQ0VPRgotCi0JTElCUz0iJExJQlMgLWxwb3NpeDQiCi1maQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2OyB9Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KLSAgYnJlYWsKLWZpCi0KLSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotCi1maQotICBDUFA9JGFjX2N2X3Byb2dfQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDUFAiID4mNQotZWNobyAiJHtFQ0hPX1R9JENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuCi0gIDoKLWVsc2UKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJncmVwIGdncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi1zZXQgZHVtbXkgZ3JlcCBnZ3JlcDsgYWNfcHJvZ19uYW1lPSQyCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQotICAgICMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKLWNhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgIGVjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgotICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotCi0gICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gIGRvbmUKLWRvbmUKLQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi1pZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQotIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImVncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotc2V0IGR1bW15IGVncmVwOyBhY19wcm9nX25hbWU9JDIKLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCi0jIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCi0gICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi1jYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYWNfY291bnQ9YGV4cHIgJGFjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0KLSAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gIGRvbmUKLWRvbmUKLQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLWlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1lbHNlCi0gIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCi1maQotCi0KLSAgIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9Ci0gRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci1lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0oIGV4aXQgJGFjX3N0YXR1cyApCi1hY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotX0FDRU9GCi0KLWZpCi0KLSMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi0KLQotCi0KLQotCi0KLQotCi1mb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKLQkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLQotCi0KLWZvciBhY19oZWFkZXIgaW4gc3RyaW5ncy5oIHN5cy90aW1lLmggdW5pc3RkLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oZWFkZXJfY29tcGlsZXI9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0gIHllczpubzogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotCi0gICAgOzsKLWVzYWMKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotCi1maQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCi1mb3IgYWNfaGVhZGVyIGluIGpuaS5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWVsc2UKLSAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotICB5ZXM6bm86ICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX2puaV9oIiA9IHllczsgdGhlbgotICBQVFBEQkdKTklfVFJVRT0KLSAgUFRQREJHSk5JX0ZBTFNFPScjJwotZWxzZQotICBQVFBEQkdKTklfVFJVRT0nIycKLSAgUFRQREJHSk5JX0ZBTFNFPQotZmkKLQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl90aW1lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLWlmICgoc3RydWN0IHRtICopIDApCi1yZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9oZWFkZXJfdGltZT15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2hlYWRlcl90aW1lPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RpbWUiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zdHJ1Y3RfdG0rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCB0bSB0bTsKLQkJCQkgICAgIGludCAqcCA9ICZ0bS50bV9zZWM7Ci0gCQkJCSAgICAgcmV0dXJuICFwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3N0cnVjdF90bT10aW1lLmgKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3N0cnVjdF90bT1zeXMvdGltZS5oCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdHJ1Y3RfdG0iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3N0cnVjdF90bSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9zdHJ1Y3RfdG0gPSBzeXMvdGltZS5oOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFRNX0lOX1NZU19USU1FIDEKLV9BQ0VPRgotCi1maQotCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWVtY21wIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWVtY21wLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9mdW5jX21lbWNtcF93b3JraW5nK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm8KLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiBtZW1jbXAgYXJlIG5vdCA4LWJpdCBjbGVhbi4gICovCi0gIGNoYXIgYzAgPSAnXDEwMCcsIGMxID0gJ1wyMDAnLCBjMiA9ICdcMjAxJzsKLSAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCi0gICAgIG9yIG1vcmUgYW5kIHdpdGggYXQgbGVhc3Qgb25lIGJ1ZmZlciBub3Qgc3RhcnRpbmcgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0gICAgIFdpbGxpYW0gTGV3aXMgcHJvdmlkZWQgdGhpcyB0ZXN0IHByb2dyYW0uICAgKi8KLSAgewotICAgIGNoYXIgZm9vWzIxXTsKLSAgICBjaGFyIGJhclsyMV07Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgIHsKLQljaGFyICphID0gZm9vICsgaTsKLQljaGFyICpiID0gYmFyICsgaTsKLQlzdHJjcHkgKGEsICItLS0tLS0tLTAxMTExMTExIik7Ci0Jc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOwotCWlmIChtZW1jbXAgKGEsIGIsIDE2KSA+PSAwKQotCSAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyIgPiY2OyB9Ci10ZXN0ICRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nID0gbm8gJiYgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgbWVtY21wLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBtZW1jbXAuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaWduYWwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLWludAotbWFpbiAoKQotewotcmV0dXJuICooc2lnbmFsICgwLCAwKSkgKDApID09IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfdHlwZV9zaWduYWw9aW50Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX3NpZ25hbD12b2lkCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpZ25hbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaWduYWwiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1fQUNFT0YKLQotCi0KLWZvciBhY19mdW5jIGluIHZwcmludGYKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfZG9wcm50IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIF9kb3BybnQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfX2RvcHJudCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSBfZG9wcm50IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgX2RvcHJudC4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSBfZG9wcm50IGlubm9jdW91c19fZG9wcm50Ci0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIF9kb3BybnQgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgX2RvcHJudAotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIF9kb3BybnQgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl9fZG9wcm50IHx8IGRlZmluZWQgX19zdHViX19fX2RvcHJudAotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBfZG9wcm50ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfZnVuY19fZG9wcm50PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfZnVuY19fZG9wcm50PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX19kb3BybnQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfX2RvcHJudCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX19kb3BybnQgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ET1BSTlQgMQotX0FDRU9GCi0KLWZpCi0KLWZpCi1kb25lCi0KLQotCi0KLQotCi0KLQotCi0KLWZvciBhY19mdW5jIGluIGdldGhvc3RuYW1lIHNlbGVjdCBzdHJkdXAgc3Ryc3RyIHN0cnRvdWwgc2lnc2V0IHNpZ2hvbGQgc2lncmVsc2UKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQotCi0KLQotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgotCi1zdWJkaXJzPSIkc3ViZGlycyBsaWJhaWYiCi0KLWNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCi0jIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0Ci0jIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Ci0jIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgotIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzLgotCi1fQUNFT0YKLQotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLWZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCi0gICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgotICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCi1kb25lCi1MSUJPQkpTPSRhY19saWJvYmpzCi0KLUxUTElCT0JKUz0kYWNfbHRsaWJvYmpzCi0KLQotaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotaWYgdGVzdCAteiAiJHtQVFBEQkdKTklfVFJVRX0iICYmIHRlc3QgLXogIiR7UFRQREJHSk5JX0ZBTFNFfSI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJQVFBEQkdKTklcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIlBUUERCR0pOSVwiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Ci1jYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jISAkU0hFTEwKLSMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1kZWJ1Zz1mYWxzZQotYWNfY3NfcmVjaGVjaz1mYWxzZQotYWNfY3Nfc2lsZW50PWZhbHNlCi1TSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKLQotICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0gICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCi0gICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0gICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKLSAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAotICAjIGNhc2UgYXQgbGluZSBlbmQuCi0gICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKLSAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgotLW4qKQotICBjYXNlIGBlY2hvICd4XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKLWZpCi1lY2hvID5jb25mJCQuZmlsZQotaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9J2xuIC1zJwotICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgIGFzX2xuX3M9J2NwIC1wJwotZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz1sbgotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD06Ci1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotICAgICAgICB0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluCi0gICAgICAgIC0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4KLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCi0jIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgotYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSAkYXNfbWUgMi4xLjQsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwotICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKLSAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUwotICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCi0gICQgJDAgJEAKLQotb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0iCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKLWNvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotYWNfY3NfdXNhZ2U9IlwKLVxgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQotY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1Vc2FnZTogJDAgW09QVElPTlNdIFtGSUxFXS4uLgotCi0gIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0Ci0gIC1xLCAtLXF1aWV0ICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCi0gIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcwotICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCi0gIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KLQkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCi0gIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQotCi1Db25maWd1cmF0aW9uIGZpbGVzOgotJGNvbmZpZ19maWxlcwotCi1Db25maWd1cmF0aW9uIGhlYWRlcnM6Ci0kY29uZmlnX2hlYWRlcnMKLQotQ29uZmlndXJhdGlvbiBjb21tYW5kczoKLSRjb25maWdfY29tbWFuZHMKLQotUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLWFjX2NzX3ZlcnNpb249IlxcCi1vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIGNvbmZpZy5zdGF0dXMgMi4xLjQKLWNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MSwKLSAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKLQotQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLU1LRElSX1A9JyRNS0RJUl9QJwotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyBJZiBubyBmaWxlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gd2UgbmVlZCB0byBwcm92aWRlIGRlZmF1bHQKLSMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi1hY19uZWVkX2RlZmF1bHRzPToKLXdoaWxlIHRlc3QgJCMgIT0gMAotZG8KLSAgY2FzZSAkMSBpbgotICAtLSo9KikKLSAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAotICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKLSAgICBhY19zaGlmdD06Ci0gICAgOzsKLSAgKikKLSAgICBhY19vcHRpb249JDEKLSAgICBhY19vcHRhcmc9JDIKLSAgICBhY19zaGlmdD1zaGlmdAotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICRhY19vcHRpb24gaW4KLSAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgYWNfY3NfcmVjaGVjaz06IDs7Ci0gIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKLSAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKLSAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKLSAgICBkZWJ1Zz06IDs7Ci0gIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCi0gICAgJGFjX3NoaWZ0Ci0gICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCi0gICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Ci0gIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKLSAgICAkYWNfc2hpZnQKLSAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICRhY19vcHRhcmciCi0gICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Ci0gIC0taGUgfCAtLWgpCi0gICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKLSAgICBlY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7Ci0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKLSAgICBhY19jc19zaWxlbnQ9OiA7OwotCi0gICMgVGhpcyBpcyBhbiBlcnJvci4KLSAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OwotCi0gICopIGFjX2NvbmZpZ190YXJnZXRzPSIkYWNfY29uZmlnX3RhcmdldHMgJDEiCi0gICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKLQotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KLWFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQotCi1pZiAkYWNfY3Nfc2lsZW50OyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLSAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLWlmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgotICBlY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgJFNIRUxMICQwICIkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAiIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIiA+JjYKLSAgQ09ORklHX1NIRUxMPSRTSEVMTAotICBleHBvcnQgQ09ORklHX1NIRUxMCi0gIGV4ZWMgJFNIRUxMICIkMCIkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgotZmkKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotICBlY2hvCi0gIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCi0jIyBSdW5uaW5nICRhc19tZS4gIyMKLV9BU0JPWAotICBlY2hvICIkYWNfbG9nIgotfSA+JjUKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotIwotIyBJTklULUNPTU1BTkRTCi0jCi1BTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLQotIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCi1mb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKLWRvCi0gIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KLSAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OwotICAgICJkZXBmaWxlcyIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZXBmaWxlcyIgOzsKLSAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7Ci0KLSAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICBlc2FjCi1kb25lCi0KLQotIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAotIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCi0jIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5Ci0jIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgotaWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KLSAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKLSAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKLSAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKLWZpCi0KLSMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQotIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAotIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgotIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgotIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgotIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCi0kZGVidWcgfHwKLXsKLSAgdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICB7IHRlc3QgLXogIiR0bXAiIHx8IHRlc3QgISAtZCAiJHRtcCIgfHwgcm0gLWZyICIkdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cwotJyAwCi0gIHRyYXAgJ3sgKGV4aXQgMSk7IGV4aXQgMTsgfScgMSAyIDEzIDE1Ci19Ci0jIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KLQotewotICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKLSAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKLX0gIHx8Ci17Ci0gIHRtcD0uL2NvbmYkJC0kUkFORE9NCi0gICh1bWFzayAwNzcgJiYgbWtkaXIgIiR0bXAiKQotfSB8fAotewotICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotfQotCi0jCi0jIFNldCB1cCB0aGUgc2VkIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIwotCi0jIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aGVuIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotX0FDRU9GCi0KLQotCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGNhdCA+Y29uZiQkc3Vicy5zZWQgPDxfQUNFT0YKLVNIRUxMISRTSEVMTCRhY19kZWxpbQotUEFUSF9TRVBBUkFUT1IhJFBBVEhfU0VQQVJBVE9SJGFjX2RlbGltCi1QQUNLQUdFX05BTUUhJFBBQ0tBR0VfTkFNRSRhY19kZWxpbQotUEFDS0FHRV9UQVJOQU1FISRQQUNLQUdFX1RBUk5BTUUkYWNfZGVsaW0KLVBBQ0tBR0VfVkVSU0lPTiEkUEFDS0FHRV9WRVJTSU9OJGFjX2RlbGltCi1QQUNLQUdFX1NUUklORyEkUEFDS0FHRV9TVFJJTkckYWNfZGVsaW0KLVBBQ0tBR0VfQlVHUkVQT1JUISRQQUNLQUdFX0JVR1JFUE9SVCRhY19kZWxpbQotZXhlY19wcmVmaXghJGV4ZWNfcHJlZml4JGFjX2RlbGltCi1wcmVmaXghJHByZWZpeCRhY19kZWxpbQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSEkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSRhY19kZWxpbQotYmluZGlyISRiaW5kaXIkYWNfZGVsaW0KLXNiaW5kaXIhJHNiaW5kaXIkYWNfZGVsaW0KLWxpYmV4ZWNkaXIhJGxpYmV4ZWNkaXIkYWNfZGVsaW0KLWRhdGFyb290ZGlyISRkYXRhcm9vdGRpciRhY19kZWxpbQotZGF0YWRpciEkZGF0YWRpciRhY19kZWxpbQotc3lzY29uZmRpciEkc3lzY29uZmRpciRhY19kZWxpbQotc2hhcmVkc3RhdGVkaXIhJHNoYXJlZHN0YXRlZGlyJGFjX2RlbGltCi1sb2NhbHN0YXRlZGlyISRsb2NhbHN0YXRlZGlyJGFjX2RlbGltCi1pbmNsdWRlZGlyISRpbmNsdWRlZGlyJGFjX2RlbGltCi1vbGRpbmNsdWRlZGlyISRvbGRpbmNsdWRlZGlyJGFjX2RlbGltCi1kb2NkaXIhJGRvY2RpciRhY19kZWxpbQotaW5mb2RpciEkaW5mb2RpciRhY19kZWxpbQotaHRtbGRpciEkaHRtbGRpciRhY19kZWxpbQotZHZpZGlyISRkdmlkaXIkYWNfZGVsaW0KLXBkZmRpciEkcGRmZGlyJGFjX2RlbGltCi1wc2RpciEkcHNkaXIkYWNfZGVsaW0KLWxpYmRpciEkbGliZGlyJGFjX2RlbGltCi1sb2NhbGVkaXIhJGxvY2FsZWRpciRhY19kZWxpbQotbWFuZGlyISRtYW5kaXIkYWNfZGVsaW0KLURFRlMhJERFRlMkYWNfZGVsaW0KLUVDSE9fQyEkRUNIT19DJGFjX2RlbGltCi1FQ0hPX04hJEVDSE9fTiRhY19kZWxpbQotRUNIT19UISRFQ0hPX1QkYWNfZGVsaW0KLUxJQlMhJExJQlMkYWNfZGVsaW0KLWJ1aWxkX2FsaWFzISRidWlsZF9hbGlhcyRhY19kZWxpbQotaG9zdF9hbGlhcyEkaG9zdF9hbGlhcyRhY19kZWxpbQotdGFyZ2V0X2FsaWFzISR0YXJnZXRfYWxpYXMkYWNfZGVsaW0KLUlOU1RBTExfUFJPR1JBTSEkSU5TVEFMTF9QUk9HUkFNJGFjX2RlbGltCi1JTlNUQUxMX1NDUklQVCEkSU5TVEFMTF9TQ1JJUFQkYWNfZGVsaW0KLUlOU1RBTExfREFUQSEkSU5TVEFMTF9EQVRBJGFjX2RlbGltCi1hbV9faXNyYyEkYW1fX2lzcmMkYWNfZGVsaW0KLUNZR1BBVEhfVyEkQ1lHUEFUSF9XJGFjX2RlbGltCi1QQUNLQUdFISRQQUNLQUdFJGFjX2RlbGltCi1WRVJTSU9OISRWRVJTSU9OJGFjX2RlbGltCi1BQ0xPQ0FMISRBQ0xPQ0FMJGFjX2RlbGltCi1BVVRPQ09ORiEkQVVUT0NPTkYkYWNfZGVsaW0KLUFVVE9NQUtFISRBVVRPTUFLRSRhY19kZWxpbQotQVVUT0hFQURFUiEkQVVUT0hFQURFUiRhY19kZWxpbQotTUFLRUlORk8hJE1BS0VJTkZPJGFjX2RlbGltCi1pbnN0YWxsX3NoISRpbnN0YWxsX3NoJGFjX2RlbGltCi1TVFJJUCEkU1RSSVAkYWNfZGVsaW0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSEkSU5TVEFMTF9TVFJJUF9QUk9HUkFNJGFjX2RlbGltCi1ta2Rpcl9wISRta2Rpcl9wJGFjX2RlbGltCi1BV0shJEFXSyRhY19kZWxpbQotU0VUX01BS0UhJFNFVF9NQUtFJGFjX2RlbGltCi1hbV9fbGVhZGluZ19kb3QhJGFtX19sZWFkaW5nX2RvdCRhY19kZWxpbQotQU1UQVIhJEFNVEFSJGFjX2RlbGltCi1hbV9fdGFyISRhbV9fdGFyJGFjX2RlbGltCi1hbV9fdW50YXIhJGFtX191bnRhciRhY19kZWxpbQotYnVpbGQhJGJ1aWxkJGFjX2RlbGltCi1idWlsZF9jcHUhJGJ1aWxkX2NwdSRhY19kZWxpbQotYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KLWJ1aWxkX29zISRidWlsZF9vcyRhY19kZWxpbQotQ0MhJENDJGFjX2RlbGltCi1DRkxBR1MhJENGTEFHUyRhY19kZWxpbQotTERGTEFHUyEkTERGTEFHUyRhY19kZWxpbQotQ1BQRkxBR1MhJENQUEZMQUdTJGFjX2RlbGltCi1hY19jdF9DQyEkYWNfY3RfQ0MkYWNfZGVsaW0KLUVYRUVYVCEkRVhFRVhUJGFjX2RlbGltCi1PQkpFWFQhJE9CSkVYVCRhY19kZWxpbQotREVQRElSISRERVBESVIkYWNfZGVsaW0KLWFtX19pbmNsdWRlISRhbV9faW5jbHVkZSRhY19kZWxpbQotYW1fX3F1b3RlISRhbV9fcXVvdGUkYWNfZGVsaW0KLUFNREVQX1RSVUUhJEFNREVQX1RSVUUkYWNfZGVsaW0KLUFNREVQX0ZBTFNFISRBTURFUF9GQUxTRSRhY19kZWxpbQotQU1ERVBCQUNLU0xBU0ghJEFNREVQQkFDS1NMQVNIJGFjX2RlbGltCi1DQ0RFUE1PREUhJENDREVQTU9ERSRhY19kZWxpbQotYW1fX2Zhc3RkZXBDQ19UUlVFISRhbV9fZmFzdGRlcENDX1RSVUUkYWNfZGVsaW0KLWFtX19mYXN0ZGVwQ0NfRkFMU0UhJGFtX19mYXN0ZGVwQ0NfRkFMU0UkYWNfZGVsaW0KLVJBTkxJQiEkUkFOTElCJGFjX2RlbGltCi1TVlJfTElCUyEkU1ZSX0xJQlMkYWNfZGVsaW0KLUNMTlRfTElCUyEkQ0xOVF9MSUJTJGFjX2RlbGltCi1DUFAhJENQUCRhY19kZWxpbQotR1JFUCEkR1JFUCRhY19kZWxpbQotRUdSRVAhJEVHUkVQJGFjX2RlbGltCi1QVFBEQkdKTklfVFJVRSEkUFRQREJHSk5JX1RSVUUkYWNfZGVsaW0KLVBUUERCR0pOSV9GQUxTRSEkUFRQREJHSk5JX0ZBTFNFJGFjX2RlbGltCi1MSUJPQkpTISRMSUJPQkpTJGFjX2RlbGltCi1zdWJkaXJzISRzdWJkaXJzJGFjX2RlbGltCi1MVExJQk9CSlMhJExUTElCT0JKUyRhY19kZWxpbQotX0FDRU9GCi0KLSAgaWYgdGVzdCBgc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLnNlZCB8IGdyZXAgLWMgWGAgPSA5MDsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLWFjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8wL3AnIGNvbmYkJHN1YnMuc2VkYAotaWYgdGVzdCAtbiAiJGFjX2VvZiI7IHRoZW4KLSAgYWNfZW9mPWBlY2hvICIkYWNfZW9mIiB8IHNvcnQgLW5ydSB8IHNlZCAxcWAKLSAgYWNfZW9mPWBleHByICRhY19lb2YgKyAxYAotZmkKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLWNhdCA+IlwkdG1wL3N1YnMtMS5zZWQiIDw8XENFT0YkYWNfZW9mCi0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiIGVuZAotX0FDRU9GCi1zZWQgJwotcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZwotcy9eL3MsQC87IHMvIS9ALHwjXyEhXyN8LwotOm4KLXQgbgotcy8nIiRhY19kZWxpbSInJC8sZy87IHQKLXMvJC9cXC87IHAKLU47IHMvXi4qXG4vLzsgcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZzsgYiBuCi0nID4+JENPTkZJR19TVEFUVVMgPGNvbmYkJHN1YnMuc2VkCi1ybSAtZiBjb25mJCRzdWJzLnNlZAotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLTplbmQKLXMvfCNfISFfI3wvL2cKLUNFT0YkYWNfZW9mCi1fQUNFT0YKLQotCi0jIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKLSMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97Ci1zLzoqXCQoc3JjZGlyKToqLzovCi1zLzoqXCR7c3JjZGlyfToqLzovCi1zLzoqQHNyY2RpckA6Ki86Lwotcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCi1zLzoqJC8vCi1zL15bXj1dKj1bCSBdKiQvLwotfScKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgotCi0KLWZvciBhY190YWcgaW4gIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICA6QyAkQ09ORklHX0NPTU1BTkRTCi1kbwotICBjYXNlICRhY190YWcgaW4KLSAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7Ci0gIGVzYWMKLSAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KLSAgOltGSExdKjoqKTs7Ci0gIDpMKiB8IDpDKjoqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIDpbRkhdLSkgYWNfdGFnPS06LTs7Ci0gIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7Ci0gIGVzYWMKLSAgYWNfc2F2ZV9JRlM9JElGUwotICBJRlM9OgotICBzZXQgeCAkYWNfdGFnCi0gIElGUz0kYWNfc2F2ZV9JRlMKLSAgc2hpZnQKLSAgYWNfZmlsZT0kMQotICBzaGlmdAotCi0gIGNhc2UgJGFjX21vZGUgaW4KLSAgOkwpIGFjX3NvdXJjZT0kMTs7Ci0gIDpbRkhdKQotICAgIGFjX2ZpbGVfaW5wdXRzPQotICAgIGZvciBhY19mCi0gICAgZG8KLSAgICAgIGNhc2UgJGFjX2YgaW4KLSAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKLSAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCi0JICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAotCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgotCSB0ZXN0IC1mICIkYWNfZiIgfHwKLQkgICBjYXNlICRhY19mIGluCi0JICAgW1xcLyRdKikgZmFsc2U7OwotCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKLQkgICBlc2FjIHx8Ci0JICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICAgICAgZXNhYwotICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAkYWNfZiIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGZyb20gImBJRlM9OgotCSAgZWNobyAkKiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnYCIgYnkgY29uZmlndXJlLiIKLSAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgZmkKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIjs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLQotICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKLSRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgeyBhc19kaXI9IiRhY19kaXIiCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLSAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpGKQotICAjCi0gICMgQ09ORklHX0ZJTEUKLSAgIwotCi0gIGNhc2UgJElOU1RBTEwgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OwotICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKLSAgZXNhYwotICBhY19NS0RJUl9QPSRNS0RJUl9QCi0gIGNhc2UgJE1LRElSX1AgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKLSAgKi8qKSBhY19NS0RJUl9QPSRhY190b3BfYnVpbGRfcHJlZml4JE1LRElSX1AgOzsKLSAgZXNhYwotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgotIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCi1hY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KLQotY2FzZSBgc2VkIC1uICcvZGF0YXJvb3RkaXIvIHsKLSAgcAotICBxCi19Ci0vQGRhdGFkaXJAL3AKLS9AZG9jZGlyQC9wCi0vQGluZm9kaXJAL3AKLS9AbG9jYWxlZGlyQC9wCi0vQG1hbmRpckAvcAotJyAkYWNfZmlsZV9pbnB1dHNgIGluCi0qZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7Ci0qQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICBhY19kYXRhcm9vdGRpcl9oYWNrPScKLSAgcyZAZGF0YWRpckAmJGRhdGFkaXImZwotICBzJkBkb2NkaXJAJiRkb2NkaXImZwotICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCi0gIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCi0gIHMmQG1hbmRpckAmJG1hbmRpciZnCi0gICAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0gIHNlZCAiJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotcyZAY29uZmlndXJlX2lucHV0QCYkY29uZmlndXJlX2lucHV0Jjt0IHQKLXMmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAotcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKLXMmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKLXMmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKLXMmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAotcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0Ci1zJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAotcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAotcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAotcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAotJGFjX2RhdGFyb290ZGlyX2hhY2sKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgc2VkIC1mICIkdG1wL3N1YnMtMS5zZWQiID4kdG1wL291dAotCi10ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQotCi0gIHJtIC1mICIkdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJHRtcC9vdXQiOyBybSAtZiAiJHRtcC9vdXQiOzsKLSAgKikgcm0gLWYgIiRhY19maWxlIjsgbXYgIiR0bXAvb3V0IiAkYWNfZmlsZTs7Ci0gIGVzYWMKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotX0FDRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgYGNvbmZ0ZXN0LmRlZmluZXMnLCB0aGF0Ci0jIHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KLXJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAotIyBGaXJzdCwgYXBwZW5kIGEgc3BhY2UgdG8gZXZlcnkgdW5kZWYvZGVmaW5lIGxpbmUsIHRvIGVhc2UgbWF0Y2hpbmcuCi1lY2hvICdzLyQvIC8nID5jb25mdGVzdC5kZWZpbmVzCi0jIFRoZW4sIHByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCwgb3IgaW4KLSMgYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCwgaW4gY29uZmlnLnN0YXR1cy4gIElmIHNvbWUgbWFjcm9zIHdlcmUKLSMgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCAjZGVmaW5lcyBmb3IgdGhlIHNhbWUKLSMgc3ltYm9sLCB3aGljaCBpcyB1c2VsZXNzLiAgQnV0IGRvIG5vdCBzb3J0IHRoZW0sIHNpbmNlIHRoZSBsYXN0Ci0jIEFDX0RFRklORSBtdXN0IGJlIGhvbm9yZWQuCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIFBBUkFNUyBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCwgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIyBQQVJBTVMgaXMgdGhlIHBhcmFtZXRlciBsaXN0IGluIHRoZSBtYWNybyBkZWZpbml0aW9uLS1pbiBtb3N0IGNhc2VzLCBpdCdzCi0jIGp1c3QgYW4gZW1wdHkgc3RyaW5nLgotYWNfZEE9J3MsXlxcKFsJICNdKlxcKVteCSBdKlxcKFsJIF0qJwotYWNfZEI9J1xcKVsJIChdLiosXFwxZGVmaW5lXFwyJwotYWNfZEM9JyAnCi1hY19kRD0nICwnCi0KLXVuaXEgY29uZmRlZnMuaCB8Ci0gIHNlZCAtbiAnCi0JdCByc2V0Ci0JOnJzZXQKLQlzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8vCi0JdCBvawotCWQKLQk6b2sKLQlzL1tcXCYsXS9cXCYvZwotCXMvXlwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS8gJyIkYWNfZEEiJ1wxJyIkYWNfZEIiJ1wyJyIke2FjX2RDfSInXDMnIiRhY19kRCInL3AKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvJyIkYWNfZEEiJ1wxJyIkYWNfZEIkYWNfZEMiJ1wyJyIkYWNfZEQiJy9wCi0gICcgPj5jb25mdGVzdC5kZWZpbmVzCi0KLSMgUmVtb3ZlIHRoZSBzcGFjZSB0aGF0IHdhcyBhcHBlbmRlZCB0byBlYXNlIG1hdGNoaW5nLgotIyBUaGVuIHJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSMgKFRoZSByZWdleHAgY2FuIGJlIHNob3J0LCBzaW5jZSB0aGUgbGluZSBjb250YWlucyBlaXRoZXIgI2RlZmluZSBvciAjdW5kZWYuKQotZWNobyAncy8gJC8vCi1zLF5bCSAjXSp1LiosLyogJiAqLywnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXM6Ci1hY19tYXhfc2VkX2xpbmVzPTUwCi0KLSMgRmlyc3Qgc2VkIGNvbW1hbmQgaXM6CSBzZWQgLWYgZGVmaW5lcy5zZWQgJGFjX2ZpbGVfaW5wdXRzID4iJHRtcC9vdXQxIgotIyBTZWNvbmQgb25lIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICIkdG1wL291dDEiID4iJHRtcC9vdXQyIgotIyBUaGlyZCBvbmUgd2lsbCBiZToJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQyIiA+IiR0bXAvb3V0MSIKLSMgZXQgY2V0ZXJhLgotYWNfaW49JyRhY19maWxlX2lucHV0cycKLWFjX291dD0nIiR0bXAvb3V0MSInCi1hY19ueHQ9JyIkdG1wL291dDIiJwotCi13aGlsZSA6Ci1kbwotICAjIFdyaXRlIGEgaGVyZSBkb2N1bWVudDoKLSAgICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICAgICMgRmlyc3QsIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGxpbmU6Ci0gICAgY2F0ID4iXCR0bXAvZGVmaW5lcy5zZWQiIDw8XFxDRU9GCi0vXlsJIF0qI1sJIF0qdW5kZWZbCSBdWwkgXSokYWNfd29yZF9yZVsJIF0qXCQvYiBkZWYKLS9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSokYWNfd29yZF9yZVsoCSBdL2IgZGVmCi1iCi06ZGVmCi1fQUNFT0YKLSAgc2VkICR7YWNfbWF4X3NlZF9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gICAgc2VkIC1mICIkdG1wL2RlZmluZXMuc2VkIicgIiRhY19pbiA+JGFjX291dCIgPj4kQ09ORklHX1NUQVRVUwotICBhY19pbj0kYWNfb3V0OyBhY19vdXQ9JGFjX254dDsgYWNfbnh0PSRhY19pbgotICBzZWQgMSwke2FjX21heF9zZWRfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCi0gIGdyZXAgLiBjb25mdGVzdC50YWlsID4vZGV2L251bGwgfHwgYnJlYWsKLSAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAotCi1lY2hvICJhY19yZXN1bHQ9JGFjX2luIiA+PiRDT05GSUdfU1RBVFVTCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiA+IiR0bXAvY29uZmlnLmgiCi0gICAgY2F0ICIkYWNfcmVzdWx0IiA+PiIkdG1wL2NvbmZpZy5oIgotICAgIGlmIGRpZmYgJGFjX2ZpbGUgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLWVjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIHJtIC1mICRhY19maWxlCi0gICAgICBtdiAiJHRtcC9jb25maWcuaCIgJGFjX2ZpbGUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iCi0gICAgY2F0ICIkYWNfcmVzdWx0IgotICBmaQotICBybSAtZiAiJHRtcC9vdXQxMiIKLSMgQ29tcHV0ZSAkYWNfZmlsZSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRhY19maWxlIHwgJGFjX2ZpbGU6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRhY19maWxlIiA+YCRhc19kaXJuYW1lIC0tICRhY19maWxlIHx8Ci0kYXNfZXhwciBYJGFjX2ZpbGUgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCRhY19maWxlIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgkYWNfZmlsZSA6ICdYXCgvL1wpJCcgXHwgXAotCSBYJGFjX2ZpbGUgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgkYWNfZmlsZSB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotCi0gIDpDKSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKLWVjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQotIDs7Ci0gIGVzYWMKLQotCi0gIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgotICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgotICBpZiBzZWQgMTBxICIkbWYiIHwgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8Ci0kYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgZWxzZQotICAgIGNvbnRpbnVlCi0gIGZpCi0gICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICMgZXhwYW5zaW9uLgotICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLSAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8Ci0kYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgeyBhc19kaXI9JGRpcnBhcnQvJGZkaXIKLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7Ci0gICAgYXNfZGlycz0KLSAgICB3aGlsZSA6OyBkbwotICAgICAgY2FzZSAkYXNfZGlyIGluICMoCi0gICAgICAqXCcqKSBhc19xZGlyPWBlY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhc19kaXIiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQotICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gIGRvbmUKLWRvbmUKLSA7OwotCi0gIGVzYWMKLWRvbmUgIyBmb3IgYWNfdGFnCi0KLQoteyAoZXhpdCAwKTsgZXhpdCAwOyB9Ci1fQUNFT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotCi0KLSMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KLSMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgotIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KLSMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cwotIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKLSMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKLSMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQotIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KLWlmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgotICBhY19jc19zdWNjZXNzPToKLSAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQotICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgotICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgotICBleGVjIDU+L2Rldi9udWxsCi0gICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKLSAgZXhlYyA1Pj5jb25maWcubG9nCi0gICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCi0gICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgotICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLSMKLSMgQ09ORklHX1NVQkRJUlMgc2VjdGlvbi4KLSMKLWlmIHRlc3QgIiRub19yZWN1cnNpb24iICE9IHllczsgdGhlbgotCi0gICMgUmVtb3ZlIC0tY2FjaGUtZmlsZSBhbmQgLS1zcmNkaXIgYXJndW1lbnRzIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0gIGFjX3N1Yl9jb25maWd1cmVfYXJncz0KLSAgYWNfcHJldj0KLSAgZXZhbCAic2V0IHggJGFjX2NvbmZpZ3VyZV9hcmdzIgotICBzaGlmdAotICBmb3IgYWNfYXJnCi0gIGRvCi0gICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgICBhY19wcmV2PQotICAgICAgY29udGludWUKLSAgICBmaQotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICAgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIFwKLSAgICB8IC0tYz0qKQotICAgICAgOzsKLSAgICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgICAgOzsKLSAgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgICAgOzsKLSAgICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgICAgYWNfcHJldj1wcmVmaXggOzsKLSAgICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgICA7OwotICAgICopCi0gICAgICBjYXNlICRhY19hcmcgaW4KLSAgICAgICpcJyopIGFjX2FyZz1gZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGFjX3N1Yl9jb25maWd1cmVfYXJncz0iJGFjX3N1Yl9jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgIyBBbHdheXMgcHJlcGVuZCAtLXByZWZpeCB0byBlbnN1cmUgdXNpbmcgdGhlIHNhbWUgcHJlZml4Ci0gICMgaW4gc3ViZGlyIGNvbmZpZ3VyYXRpb25zLgotICBhY19hcmc9Ii0tcHJlZml4PSRwcmVmaXgiCi0gIGNhc2UgJGFjX2FyZyBpbgotICAqXCcqKSBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gIGVzYWMKLSAgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPSInJGFjX2FyZycgJGFjX3N1Yl9jb25maWd1cmVfYXJncyIKLQotICAjIFBhc3MgLS1zaWxlbnQKLSAgaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgICBhY19zdWJfY29uZmlndXJlX2FyZ3M9Ii0tc2lsZW50ICRhY19zdWJfY29uZmlndXJlX2FyZ3MiCi0gIGZpCi0KLSAgYWNfcG9wZGlyPWBwd2RgCi0gIGZvciBhY19kaXIgaW4gOiAkc3ViZGlyczsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLQotICAgICMgRG8gbm90IGNvbXBsYWluLCBzbyBhIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGNvbmZpZ3VyZSB3aGljaGV2ZXIKLSAgICAjIHBhcnRzIG9mIGEgbGFyZ2Ugc291cmNlIHRyZWUgYXJlIHByZXNlbnQuCi0gICAgdGVzdCAtZCAiJHNyY2Rpci8kYWNfZGlyIiB8fCBjb250aW51ZQotCi0gICAgYWNfbXNnPSI9PT0gY29uZmlndXJpbmcgaW4gJGFjX2RpciAoYHB3ZGAvJGFjX2RpcikiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19tc2ciID4mNQotICAgIGVjaG8gIiRhY19tc2ciID4mNgotICAgIHsgYXNfZGlyPSIkYWNfZGlyIgotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Ci0gICAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLQotICAgIGNkICIkYWNfZGlyIgotCi0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCi0gICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zcmNkaXIvY29uZmlndXJlLmdudQotICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0gICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zcmNkaXIvY29uZmlndXJlCi0gICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbiI7IHRoZW4KLSAgICAgICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLSAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlCi0gICAgZWxzZQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjI7fQotICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0KLSAgICBmaQotCi0gICAgIyBUaGUgcmVjdXJzaW9uIGlzIGhlcmUuCi0gICAgaWYgdGVzdCAtbiAiJGFjX3N1Yl9jb25maWd1cmUiOyB0aGVuCi0gICAgICAjIE1ha2UgdGhlIGNhY2hlIGZpbGUgbmFtZSBjb3JyZWN0IHJlbGF0aXZlIHRvIHRoZSBzdWJkaXJlY3RvcnkuCi0gICAgICBjYXNlICRjYWNoZV9maWxlIGluCi0gICAgICBbXFwvXSogfCA/OltcXC9dKiApIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7Ci0gICAgICAqKSAjIFJlbGF0aXZlIG5hbWUuCi0JYWNfc3ViX2NhY2hlX2ZpbGU9JGFjX3RvcF9idWlsZF9wcmVmaXgkY2FjaGVfZmlsZSA7OwotICAgICAgZXNhYwotCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBydW5uaW5nICRTSEVMTCAkYWNfc3ViX2NvbmZpZ3VyZSAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIC0tY2FjaGUtZmlsZT0kYWNfc3ViX2NhY2hlX2ZpbGUgLS1zcmNkaXI9JGFjX3NyY2RpciIgPiY1Ci1lY2hvICIkYXNfbWU6IHJ1bm5pbmcgJFNIRUxMICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3JjZGlyIiA+JjY7fQotICAgICAgIyBUaGUgZXZhbCBtYWtlcyBxdW90aW5nIGFyZ3VtZW50cyB3b3JrLgotICAgICAgZXZhbCAiXCRTSEVMTCBcIlwkYWNfc3ViX2NvbmZpZ3VyZVwiICRhY19zdWJfY29uZmlndXJlX2FyZ3MgXAotCSAgIC0tY2FjaGUtZmlsZT1cIlwkYWNfc3ViX2NhY2hlX2ZpbGVcIiAtLXNyY2Rpcj1cIlwkYWNfc3JjZGlyXCIiIHx8Ci0JeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX3N1Yl9jb25maWd1cmUgZmFpbGVkIGZvciAkYWNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19zdWJfY29uZmlndXJlIGZhaWxlZCBmb3IgJGFjX2RpciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGZpCi0KLSAgICBjZCAiJGFjX3BvcGRpciIKLSAgZG9uZQotZmkKLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9jb25maWd1cmUuaW4gYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwMDUwMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi1kbmwKLWRubAotCi1BQ19QUkVSRVEoMi41MCkKLQotQUNfSU5JVChvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLCAyLjEuNCkKLUFDX0NPTkZJR19TUkNESVIoc3JjL2NsaWVudC9jbGllbnQuYykKLQotQU1fSU5JVF9BVVRPTUFLRShbc3ViZGlyLW9iamVjdHNdKQotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oKQotQUNfQ0FOT05JQ0FMX0JVSUxECi0KLWRubAotZG5sIEVjbGlwc2UgYWRkcyB2ZXJzaW9uIG51bWJlciB0byBlbmQgb2YgcGFja2FnZSB3aGVuIGRlcGxveWluZyB2aWEgdXBkYXRlIHNpdGUKLWRubAotCi1VVElMUz0iLi4vb3JnLmVjbGlwc2UucHRwLnV0aWxzIgotaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCVVUSUxTPSJgZWNobyAke1VUSUxTfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCQlBQ19NU0dfRVJST1IoW3V0aWxzIGRpcmVjdG9yeSBub3QgZm91bmRdKQotCWZpCi1maQotCi1QUk9YWT0iLi4vb3JnLmVjbGlwc2UucHRwLnByb3h5IgotaWYgdGVzdCAhIC1kICRQUk9YWTsgdGhlbgotCVBST1hZPSJgZWNobyAke1BST1hZfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRQUk9YWTsgdGhlbgotCQlBQ19NU0dfRVJST1IoW3Byb3h5IGRpcmVjdG9yeSBub3QgZm91bmRdKQotCWZpCi1maQotCi1kbmwKLWRubCBDaGVjayBmb3IgcHJvZ3JhbXMuCi1kbmwKLQotQUNfUFJPR19DQwotQU1fUFJPR19DQ19DX08KLUFDX1BST0dfSU5TVEFMTAotQUNfUFJPR19NQUtFX1NFVAotQUNfUFJPR19SQU5MSUIKLQotb3M9YHVuYW1lIC1zYAotaWYgdGVzdCAieCRvcyIgPSAieEFJWCIgOyB0aGVuCi0gICAgICAgIENGTEFHUz0iJENGTEFHUyAtcWluZm89Z2VuIC1xY3BsdXNjbXQiCi1lbHNlCi0gICAgICAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKLWZpCi0KLUNGTEFHUz0iJENGTEFHUyAtSSRVVElMUy9pbmNsdWRlIC1JJFBST1hZL2luY2x1ZGUiCi1MSUJTPSIkTElCUyAtTCRVVElMUyAtTCRQUk9YWSIKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGxpYnJhcmllcy4KLWRubAotCi1BQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lKQotQUNfQ0hFQ0tfTElCKHNvY2tldCwgc29ja2V0KQotQUNfU0VBUkNIX0xJQlMob3BlbnB0eSwgW3V0aWxdLAotCVtBQ19ERUZJTkUoSEFWRV9PUEVOUFRZLCAxLCBbU3lzdGVtIGhhcyBvcGVucHR5KCkgZnVuY3Rpb24uXSldKWRubAotCi1BQ19DSEVDS19MSUIodXRpbHMsIGJpdHNldF9uZXcpCi1BQ19DSEVDS19MSUIocHJveHlzdnIsIHByb3h5X3N2cl9pbml0LCBbU1ZSX0xJQlM9IiRTVlJfTElCUyAtbHByb3h5c3ZyIl0pCi1BQ19TVUJTVChbU1ZSX0xJQlNdKQotQUNfQ0hFQ0tfTElCKHByb3h5Y2xudCwgcHJveHlfY2xudF9pbml0LCBbQ0xOVF9MSUJTPSIkQ0xOVF9MSUJTIC1scHJveHljbG50Il0pCi1BQ19TVUJTVChbQ0xOVF9MSUJTXSkKLQotZG5sIENoZWNrIGZvciBwb3NpeDQKLUFDX0NIRUNLX0xJQihwb3NpeDQsIGNsb2NrX2dldHRpbWUpCi1pZiB0ZXN0ICIkYWNfY3ZfbGliX3Bvc2l4NF9jbG9ja19nZXR0aW1lIiA9IHllczsgdGhlbgotCUFDX0RFRklORShQT1NJWCwgMSwgW0VuYWJsZSBQT1NJWCBzdXBwb3J0IGluIEd1YXJkLl0pCi0JTElCUz0iJExJQlMgLWxwb3NpeDQiCi1maQotCi1kbmwKLWRubCBDaGVjayBmb3IgaGVhZGVyIGZpbGVzLgotZG5sCi0KLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZ3MuaCBzeXMvdGltZS5oIHVuaXN0ZC5oKQotQUNfQ0hFQ0tfSEVBREVSUyhqbmkuaCkKLUFNX0NPTkRJVElPTkFMKFBUUERCR0pOSSwgW3Rlc3QgIiRhY19jdl9oZWFkZXJfam5pX2giID0geWVzXSkKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgotZG5sCi0KLUFDX0hFQURFUl9USU1FCi1BQ19TVFJVQ1RfVE0KLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgotZG5sCi0KLUFDX0ZVTkNfTUVNQ01QCi1BQ19UWVBFX1NJR05BTAotQUNfRlVOQ19WUFJJTlRGCi1BQ19DSEVDS19GVU5DUyhnZXRob3N0bmFtZSBzZWxlY3Qgc3RyZHVwIHN0cnN0ciBzdHJ0b3VsIHNpZ3NldCBzaWdob2xkIHNpZ3JlbHNlKQotCi1BSF9WRVJCQVRJTShbREVCVUddLAotWyNkZWZpbmUgREVCVUcKLSNpZmRlZiBERUJVRwotZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsKLWV4dGVybiB2b2lkIGRlYnVnX3ByaW50ZihpbnQsIGNoYXIgKiwgLi4uKTsKLSNkZWZpbmUgREVCVUdfTEVWRUxfTk9ORQkweDAwCi0jZGVmaW5lIERFQlVHX0xFVkVMX0FMTAkJMHhmZgotI2RlZmluZSBERUJVR19MRVZFTF9TVEFSVFVQCTB4MDEKLSNkZWZpbmUgREVCVUdfTEVWRUxfQ0xJRU5UCTB4MDIKLSNkZWZpbmUgREVCVUdfTEVWRUxfU0VSVkVSCTB4MDQKLSNkZWZpbmUgREVCVUdfTEVWRUxfQkFDS0VORAkweDA4Ci0jZGVmaW5lIFRFU1RfREVCVUdfTEVWRUwobGV2ZWwpCQkJKChkZWJ1Z19sZXZlbCYobGV2ZWwpKT09KGxldmVsKSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGKGxldmVsLGZvcm1hdCwuLi4pCWRlYnVnX3ByaW50ZigobGV2ZWwpLChmb3JtYXQpLF9fVkFfQVJHU19fKQotI2RlZmluZSBERUJVR19QUklOVFMobGV2ZWwsc3RyKQkJCWRlYnVnX3ByaW50ZigobGV2ZWwpLCIlcyIsKHN0cikpCi0jZWxzZSAvKiBERUJVRyAqLwotI2RlZmluZSBERUJVR19QUklOVEYobGV2ZWwsZm9ybWF0LC4uLikKLSNkZWZpbmUgREVCVUdfUFJJTlRTKGxldmVsLHN0cikKLSNlbmRpZiAvKiBERUJVRyAqL10pCi0KLUFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGVdKQotQUNfQ09ORklHX1NVQkRJUlMoW2xpYmFpZl0pCi1BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vZGVwY29tcCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vZGVwY29tcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTFlMmQzYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2RlcGNvbXAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCi0KLXNjcmlwdHZlcnNpb249MjAwNC0wNS0zMS4yMwotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0jIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBkZXBjb21wIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVJ1biBQUk9HUkFNUyBBUkdTIHRvIGNvbXBpbGUgYSBmaWxlLCBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcwotYXMgc2lkZS1lZmZlY3RzLgotCi1FbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIGRlcG1vZGUgICAgIERlcGVuZGVuY3kgdHJhY2tpbmcgbW9kZS4KLSAgc291cmNlICAgICAgU291cmNlIGZpbGUgcmVhZCBieSBgUFJPR1JBTVMgQVJHUycuCi0gIG9iamVjdCAgICAgIE9iamVjdCBmaWxlIG91dHB1dCBieSBgUFJPR1JBTVMgQVJHUycuCi0gIERFUERJUiAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBkZXBlbmRlbmNpZXMuCi0gIGRlcGZpbGUgICAgIERlcGVuZGVuY3kgZmlsZSB0byBvdXRwdXQuCi0gIHRtcGRlcGZpbGUgIFRlbXBvcmFyeSBmaWxlIHRvIHVzZSB3aGVuIG91dHB1dGluZyBkZXBlbmRlbmNpZXMuCi0gIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAwCi0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAwCi0gICAgOzsKLWVzYWMKLQotaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCi0gIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgRGVwZW5kZW5jaWVzIGZvciBzdWIvYmFyLm8gb3Igc3ViL2Jhci5vYmogZ28gaW50byBzdWIvLmRlcHMvYmFyLlBvLgotZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwKLSAgc2VkICdzfFteXFwvXSokfCcke0RFUERJUi0uZGVwc30nLyZ8O3N8XC5cKFteLl0qXCkkfC5QXDF8O3N8UG9iaiR8UG98J2B9Ci10bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQotCi1ybSAtZiAiJHRtcGRlcGZpbGUiCi0KLSMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQotIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKLSMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKLSMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgotICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KLSAgZ2NjZmxhZz0tTQotICBkZXBtb2RlPWdjYwotZmkKLQotaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCi0gICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCi0gICBkYXNobWZsYWc9LXhNCi0gICBkZXBtb2RlPWRhc2htc3Rkb3V0Ci1maQotCi1jYXNlICIkZGVwbW9kZSIgaW4KLWdjYzMpCi0jIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAotIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKLSMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KLSAgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIG12ICIkdG1wZGVwZmlsZSIgIiRkZXBmaWxlIgotICA7OwotCi1nY2MpCi0jIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncwotIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6Ci0jIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAotIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgotIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKLSMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCi0jIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4KLSMjIC0gVXNpbmcgLU0gZGlyZWN0bHkgbWVhbnMgcnVubmluZyB0aGUgY29tcGlsZXIgdHdpY2UgKGV2ZW4gd29yc2UKLSMjICAgdGhhbiByZW5hbWluZykuCi0gIGlmIHRlc3QgLXogIiRnY2NmbGFnIjsgdGhlbgotICAgIGdjY2ZsYWc9LU1ELAotICBmaQotICAiJEAiIC1XcCwiJGdjY2ZsYWckdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgYWxwaGE9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egotIyMgVGhlIHNlY29uZCAtZSBleHByZXNzaW9uIGhhbmRsZXMgRE9TLXN0eWxlIGZpbGUgbmFtZXMgd2l0aCBkcml2ZSBsZXR0ZXJzLgotICBzZWQgLWUgJ3MvXlteOl0qOiAvIC8nIFwKLSAgICAgIC1lICdzL15bJyRhbHBoYSddOlwvW146XSo6IC8gLycgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSMjIFRoaXMgbmV4dCBwaWVjZSBvZiBtYWdpYyBhdm9pZHMgdGhlIGBkZWxldGVkIGhlYWRlciBmaWxlJyBwcm9ibGVtLgotIyMgVGhlIHByb2JsZW0gaXMgdGhhdCB3aGVuIGEgaGVhZGVyIGZpbGUgd2hpY2ggYXBwZWFycyBpbiBhIC5QIGZpbGUKLSMjIGlzIGRlbGV0ZWQsIHRoZSBkZXBlbmRlbmN5IGNhdXNlcyBtYWtlIHRvIGRpZSAoYmVjYXVzZSB0aGVyZSBpcwotIyMgdHlwaWNhbGx5IG5vIHdheSB0byByZWJ1aWxkIHRoZSBoZWFkZXIpLiAgV2UgYXZvaWQgdGhpcyBieSBhZGRpbmcKLSMjIGR1bW15IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBoZWFkZXIgZmlsZS4gIFRvbyBiYWQgZ2NjIGRvZXNuJ3QgZG8KLSMjIHRoaXMgZm9yIHVzIGRpcmVjdGx5LgotICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgfAotIyMgU29tZSB2ZXJzaW9ucyBvZiBnY2MgcHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBgOicuICBPbiB0aGUgdGhlb3J5Ci0jIyB0aGF0IHRoZSBzcGFjZSBtZWFucyBzb21ldGhpbmcsIHdlIGFkZCBhIHNwYWNlIHRvIHRoZSBvdXRwdXQgYXMKLSMjIHdlbGwuCi0jIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgotIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ocCkKLSAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5Ci0gICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKLSAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLXNnaSkKLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgIiRAIiAiLVdwLC1NRHVwZGF0ZSwkdG1wZGVwZmlsZSIKLSAgZWxzZQotICAgICIkQCIgLU1EdXBkYXRlICIkdG1wZGVwZmlsZSIKLSAgZmkKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gICMgeWVzLCB0aGUgc291cmNlZmlsZSBkZXBlbmQgb24gb3RoZXIgZmlsZXMKLSAgICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotCi0gICAgIyBDbGlwIG9mZiB0aGUgaW5pdGlhbCBlbGVtZW50ICh0aGUgZGVwZW5kZW50KS4gIERvbid0IHRyeSB0byBiZQotICAgICMgY2xldmVyIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBzZWQgY29kZSwgYXMgSVJJWCBzZWQgd29uJ3QgaGFuZGxlCi0gICAgIyBsaW5lcyB3aXRoIG1vcmUgdGhhbiBhIGZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzICg0MDk2IGluCi0gICAgIyBJUklYIDYuMiBzZWQsIDgxOTIgaW4gSVJJWCA2LjUpLiAgV2UgYWxzbyByZW1vdmUgY29tbWVudCBsaW5lczsKLSAgICAjIHRoZSBJUklYIGNjIGFkZHMgY29tbWVudHMgbGlrZSBgIzpmZWMnIHRvIHRoZSBlbmQgb2YgdGhlCi0gICAgIyBkZXBlbmRlbmN5IGxpbmUuCi0gICAgdHIgJyAnICcKLScgPCAiJHRtcGRlcGZpbGUiIFwKLSAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCi0gICAgdHIgJwotJyAnICcgPj4gJGRlcGZpbGUKLSAgICBlY2hvID4+ICRkZXBmaWxlCi0KLSAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKLSAgID4+ICRkZXBmaWxlCi0gIGVsc2UKLSAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAotICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQotICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCi0gICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgZmkKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1haXgpCi0gICMgVGhlIEMgZm9yIEFJWCBDb21waWxlciB1c2VzIC1NIGFuZCBvdXRwdXRzIHRoZSBkZXBlbmRlbmNpZXMKLSAgIyBpbiBhIC51IGZpbGUuICBJbiBvbGRlciB2ZXJzaW9ucywgdGhpcyBmaWxlIGFsd2F5cyBsaXZlcyBpbiB0aGUKLSAgIyBjdXJyZW50IGRpcmVjdG9yeS4gIEFsc28sIHRoZSBBSVggY29tcGlsZXIgcHV0cyBgJG9iamVjdDonIGF0IHRoZQotICAjIHN0YXJ0IG9mIGVhY2ggbGluZTsgJG9iamVjdCBkb2Vzbid0IGhhdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgotICAjIFZlcnNpb24gNiB1c2VzIHRoZSBkaXJlY3RvcnkgaW4gYm90aCBjYXNlcy4KLSAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL1woLipcKVwuLiokL1wxLydgCi0gIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiIC1XYywtTQotICBlbHNlCi0gICAgIiRAIiAtTQotICBmaQotICBzdGF0PSQ/Ci0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuIDoKLSAgZWxzZQotICAgIHN0cmlwcGVkPWBlY2hvICIkc3RyaXBwZWQiIHwgc2VkICdzLF4uKi8sLCdgCi0gICAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGZpCi0KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgotICAgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgotICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgotICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIGVsc2UKLSAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAotICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQotICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCi0gICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgZmkKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1pY2MpCi0gICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgotICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKLSAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCi0gICMgICAgZm9vLm86IHN1Yi9mb28uYwotICAjICAgIGZvby5vOiBzdWIvZm9vLmgKLSAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6Ci0gICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAotICAjICAgIHN1Yi9mb28uYzoKLSAgIyAgICBzdWIvZm9vLmg6Ci0gICMgSUNDIDcuMSB3aWxsIG91dHB1dAotICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCi0gICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgotICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKLSAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCi0gICMgICAgIC4uLgotCi0gICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0gICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAotICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgotICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bwotICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgotICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAotICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLXRydTY0KQotICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQotICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgotICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAotICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCi0gICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCi0gICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9Ci0gICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCi0KLSAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICAgIyBEZXBlbmRlbmNpZXMgYXJlIG91dHB1dCBpbiAubG8uZCB3aXRoIGxpYnRvb2wgMS40LgotICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoZXkgYXJlIG91dHB1dCBib3RoIGluICRkaXIubGlicy8kYmFzZS5vLmQKLSAgICAgICMgYW5kIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kICRkaXIkYmFzZS5vLmQuICBXZSBwcm9jZXNzIHRoZQotICAgICAgIyBsYXR0ZXIsIGJlY2F1c2UgdGhlIGZvcm1lciB3aWxsIGJlIGNsZWFuZWQgd2hlbiAkZGlyLmxpYnMgaXMKLSAgICAgICMgZXJhc2VkLgotICAgICAgdG1wZGVwZmlsZTE9IiRkaXIubGlicy8kYmFzZS5sby5kIgotICAgICAgdG1wZGVwZmlsZTI9IiRkaXIkYmFzZS5vLmQiCi0gICAgICB0bXBkZXBmaWxlMz0iJGRpci5saWJzLyRiYXNlLmQiCi0gICAgICAiJEAiIC1XYywtTUQKLSAgIGVsc2UKLSAgICAgIHRtcGRlcGZpbGUxPSIkZGlyJGJhc2Uuby5kIgotICAgICAgdG1wZGVwZmlsZTI9IiRkaXIkYmFzZS5kIgotICAgICAgdG1wZGVwZmlsZTM9IiRkaXIkYmFzZS5kIgotICAgICAgIiRAIiAtTUQKLSAgIGZpCi0KLSAgIHN0YXQ9JD8KLSAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICAgZWxzZQotICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKLSAgICAgIGV4aXQgJHN0YXQKLSAgIGZpCi0KLSAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlMSI7IHRoZW4KLSAgICAgIHRtcGRlcGZpbGU9IiR0bXBkZXBmaWxlMSIKLSAgIGVsaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUyIjsgdGhlbgotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUyIgotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUzIgotICAgZmkKLSAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgotICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KLSAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotICAgZWxzZQotICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKLSAgIGZpCi0gICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICA7OwotCi0jbm9zaWRlZWZmZWN0KQotICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKLSAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KLQotZGFzaG1zdGRvdXQpCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgotICAiJEAiIHx8IGV4aXQgJD8KLQotICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCi0gICAgICBzaGlmdAotICAgIGRvbmUKLSAgICBzaGlmdAotICBmaQotCi0gICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KLSAgSUZTPSIgIgotICBmb3IgYXJnCi0gIGRvCi0gICAgY2FzZSAkYXJnIGluCi0gICAgLW8pCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAkb2JqZWN0KQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgotICAgICAgc2hpZnQgIyBmbm9yZAotICAgICAgc2hpZnQgIyAkYXJnCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIHRlc3QgLXogIiRkYXNobWZsYWciICYmIGRhc2htZmxhZz0tTQotICAjIFJlcXVpcmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgYDonCi0gICMgaW4gdGhlIHRhcmdldCBuYW1lLiAgVGhpcyBpcyB0byBjb3BlIHdpdGggRE9TLXN0eWxlIGZpbGVuYW1lczoKLSAgIyBhIGRlcGVuZGVuY3kgc3VjaCBhcyBgYzovZm9vL2JhcicgY291bGQgYmUgc2VlbiBhcyB0YXJnZXQgYGMnIG90aGVyd2lzZS4KLSAgIiRAIiAkZGFzaG1mbGFnIHwKLSAgICBzZWQgJ3M6XlsgIF0qW146IF1bXjpdW146XSpcOlsgICAgXSo6JyIkb2JqZWN0IidcOiA6JyA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgfCBcCi0jIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgotIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1kYXNoWG1zdGRvdXQpCi0gICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCi0gIGV4aXQgMQotICA7OwotCi1tYWtlZGVwZW5kKQotICAiJEAiIHx8IGV4aXQgJD8KLSAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCi0gICAgICBzaGlmdAotICAgIGRvbmUKLSAgICBzaGlmdAotICBmaQotICAjIFggbWFrZWRlcGVuZAotICBzaGlmdAotICBjbGVhcmVkPW5vCi0gIGZvciBhcmcgaW4gIiRAIjsgZG8KLSAgICBjYXNlICRjbGVhcmVkIGluCi0gICAgbm8pCi0gICAgICBzZXQgIiI7IHNoaWZ0Ci0gICAgICBjbGVhcmVkPXllcyA7OwotICAgIGVzYWMKLSAgICBjYXNlICIkYXJnIiBpbgotICAgIC1EKnwtSSopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7Ci0gICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKLSAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCi0gICAgLSp8JG9iamVjdCkKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgb2JqX3N1ZmZpeD0iYGVjaG8gJG9iamVjdCB8IHNlZCAncy9eLipcLi8uLydgIgotICB0b3VjaCAiJHRtcGRlcGZpbGUiCi0gICR7TUFLRURFUEVORC1tYWtlZGVwZW5kfSAtbyIkb2JqX3N1ZmZpeCIgLWYiJHRtcGRlcGZpbGUiICIkQCIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgfCB0ciAnICcgJwotJyB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZSIuYmFrCi0gIDs7Ci0KLWNwcCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgIiRAIiAtRSB8Ci0gICAgc2VkIC1uICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIHwKLSAgICBzZWQgJyQgczogXFwkOjonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotICBzZWQgPCAiJHRtcGRlcGZpbGUiICcvXiQvZDtzL14gLy87cy8gXFwkLy87cy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLW1zdmlzdWFsY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtbywKLSAgIyBiZWNhdXNlIHdlIG11c3QgdXNlIC1vIHdoZW4gcnVubmluZyBsaWJ0b29sLgotICAiJEAiIHx8IGV4aXQgJD8KLSAgSUZTPSIgIgotICBmb3IgYXJnCi0gIGRvCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAiLUdtInwiL0dtInwiLUdpInwiL0dpInwiLVpJInwiL1pJIikKLQlzZXQgZm5vcmQgIiRAIgotCXNoaWZ0Ci0Jc2hpZnQKLQk7OwotICAgICopCi0Jc2V0IGZub3JkICIkQCIgIiRhcmciCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgZXNhYwotICBkb25lCi0gICIkQCIgLUUgfAotICBzZWQgLW4gJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIvIHM6OmVjaG8gImBjeWdwYXRoIC11IFxcIlwxXFwiYCI6cCcgfCBzb3J0IHwgdW5pcSA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICAuICIkdG1wZGVwZmlsZSIgfCBzZWQgJ3MlICVcXCAlZycgfCBzZWQgLW4gJy9eXCguKlwpJC8gczo6CVwxIFxcOnAnID4+ICIkZGVwZmlsZSIKLSAgZWNobyAiCSIgPj4gIiRkZXBmaWxlIgotICAuICIkdG1wZGVwZmlsZSIgfCBzZWQgJ3MlICVcXCAlZycgfCBzZWQgLW4gJy9eXCguKlwpJC8gczo6XDFcOjpwJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbm9uZSkKLSAgZXhlYyAiJEAiCi0gIDs7Ci0KLSopCi0gIGVjaG8gIlVua25vd24gZGVwbW9kZSAkZGVwbW9kZSIgMT4mMgotICBleGl0IDEKLSAgOzsKLWVzYWMKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOiBzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246IDIKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9iYWNrZW5kLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvYmFja2VuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFjYzFhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9iYWNrZW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaWZuZGVmIF9CQUNLRU5EX0hfCi0jZGVmaW5lIF9CQUNLRU5EX0hfCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSAKLSNpbmNsdWRlICJiaXRzZXQuaCIKLSNpbmNsdWRlICJicmVha3BvaW50LmgiCi0jaW5jbHVkZSAic3RhY2tmcmFtZS5oIgotI2luY2x1ZGUgIm1lbW9yeWluZm8uaCIKLSNpbmNsdWRlICJkYmdfZXZlbnQuaCIKLQotc3RydWN0IGRiZ19iYWNrZW5kX2Z1bmNzIHsKLQlpbnQgKCppbml0KSh2b2lkICgqKShkYmdfZXZlbnQgKikpOwotCWludCAoKnByb2dyZXNzKSh2b2lkKTsKLQlpbnQgKCppbnRlcnJ1cHQpKHZvaWQpOwotCWludCAoKnN0YXJ0X3Nlc3Npb24pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqKiwgY2hhciAqKiwgbG9uZyk7Ci0JaW50ICgqc2V0bGluZWJyZWFrcG9pbnQpKGludCwgaW50LCBpbnQsIGNoYXIgKiwgaW50LCBjaGFyICosIGludCwgaW50KTsKLQlpbnQgKCpzZXRmdW5jYnJlYWtwb2ludCkoaW50LCBpbnQsIGludCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpOwotCWludCAoKmRlbGV0ZWJyZWFrcG9pbnQpKGludCk7Ci0JaW50ICgqZW5hYmxlYnJlYWtwb2ludCkoaW50KTsKLQlpbnQgKCpkaXNhYmxlYnJlYWtwb2ludCkoaW50KTsKLQlpbnQgKCpjb25kaXRpb25icmVha3BvaW50KShpbnQsIGNoYXIgKik7Ci0JaW50ICgqYnJlYWtwb2ludGFmdGVyKShpbnQsIGludCk7Ci0JaW50ICgqc2V0d2F0Y2hwb2ludCkoaW50LCBjaGFyICosIGludCwgaW50LCBjaGFyICosIGludCk7Ci0JaW50ICgqZ28pKHZvaWQpOwotCWludCAoKnN0ZXApKGludCwgaW50KTsKLQlpbnQgKCp0ZXJtaW5hdGUpKHZvaWQpOwotCWludCAoKmxpc3RzdGFja2ZyYW1lcykoaW50LCBpbnQpOwotCWludCAoKnNldGN1cnJlbnRzdGFja2ZyYW1lKShpbnQpOwotCWludCAoKmV2YWx1YXRlZXhwcmVzc2lvbikoY2hhciAqKTsKLQlpbnQgKCpnZXR0eXBlKShjaGFyICopOwotCWludCAoKmxpc3Rsb2NhbHZhcmlhYmxlcykodm9pZCk7Ci0JaW50ICgqbGlzdGFyZ3VtZW50cykoaW50LCBpbnQpOwotCWludCAoKmxpc3RnbG9iYWx2YXJpYWJsZXMpKHZvaWQpOwotCWludCAoKmxpc3RpbmZvdGhyZWFkcykodm9pZCk7Ci0JaW50ICgqc2V0dGhyZWFkc2VsZWN0KShpbnQpOwotCWludCAoKnN0YWNraW5mb2RlcHRoKSh2b2lkKTsKLQlpbnQJKCpkYXRhcmVhZG1lbW9yeSkobG9uZywgY2hhciosIGNoYXIqLCBpbnQsIGludCwgaW50LCBjaGFyKik7Ci0JaW50CSgqZGF0YXdyaXRlbWVtb3J5KShsb25nLCBjaGFyKiwgY2hhciosIGludCwgY2hhciopOwotCWludCAoKmxpc3RzaWduYWxzKShjaGFyKik7Ci0JaW50ICgqc2lnbmFsaW5mbykoY2hhciopOyAvKiBkZXByZWNhdGVkICovCi0JaW50ICgqY2xpaGFuZGxlKShjaGFyKik7Ci0JaW50ICgqZGF0YWV2YWx1YXRlZXhwcmVzc2lvbikoY2hhciopOyAvKiBkZXByZWNhdGVkICovCi0JaW50ICgqZ2V0cGFydGlhbGFpZikoY2hhciosIGNoYXIqLCBpbnQsIGludCk7Ci0JaW50ICgqdmFyaWFibGVkZWxldGUpKGNoYXIqKTsKLQlpbnQgKCpxdWl0KSh2b2lkKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfYmFja2VuZF9mdW5jcwlkYmdfYmFja2VuZF9mdW5jczsKLQotc3RydWN0IGRiZ19iYWNrZW5kIHsKLQljaGFyICoJCQkJCQlkYl9uYW1lOwotCXN0cnVjdCBkYmdfYmFja2VuZF9mdW5jcyAqCWRiX2Z1bmNzOwotCWNoYXIgKgkJCQkJCWRiX2V4ZV9wYXRoOwotfTsKLXR5cGVkZWYgc3RydWN0IGRiZ19iYWNrZW5kCWRiZ19iYWNrZW5kOwotCi1leHRlcm4gZGJnX2JhY2tlbmQgCWRiZ19iYWNrZW5kc1tdOwotCi1leHRlcm4gaW50CWZpbmRfZGJnX2JhY2tlbmQoY2hhciAqLCBkYmdfYmFja2VuZCAqKik7Ci1leHRlcm4gdm9pZAliYWNrZW5kX3NldF9wYXRoKGRiZ19iYWNrZW5kICosIGNoYXIgKik7Ci0KLSNlbmRpZiAvKiBfQkFDS0VORF9IXyovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvYnJlYWtwb2ludC5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2JyZWFrcG9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmYWRlOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvYnJlYWtwb2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfQlJFQUtQT0lOVF9IXwotI2RlZmluZSBfQlJFQUtQT0lOVF9IXwotCi0jaW5jbHVkZSAibG9jYXRpb24uaCIKLSNpbmNsdWRlICJsaXN0LmgiCi0KLXN0cnVjdCBicmVha3BvaW50IHsKLQlpbnQJCQlpZDsKLQlpbnQJCQlpZ25vcmU7Ci0JaW50CQkJc3BlY2lhbDsKLQlpbnQJCQlkZWxldGVkOwotCWNoYXIgKgkJdHlwZTsKLQlsb2NhdGlvbgkJbG9jOwotCWludAkJCWhpdHM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgYnJlYWtwb2ludCBicmVha3BvaW50OwotCi1leHRlcm4gYnJlYWtwb2ludCAqCU5ld0JyZWFrcG9pbnQoaW50KTsKLWV4dGVybiB2b2lkCQkJRnJlZUJyZWFrcG9pbnQoYnJlYWtwb2ludCAqKTsKLWV4dGVybiBicmVha3BvaW50ICoJQ29weUJyZWFrcG9pbnQoYnJlYWtwb2ludCAqKTsKLWV4dGVybiB2b2lkCQkJQWRkQnJlYWtwb2ludChMaXN0ICosIGJyZWFrcG9pbnQgKik7Ci1leHRlcm4gdm9pZAkJCVJlbW92ZUJyZWFrcG9pbnQoTGlzdCAqLCBpbnQpOwotZXh0ZXJuIGJyZWFrcG9pbnQgKglGaW5kQnJlYWtwb2ludChMaXN0ICosIGludCk7Ci0jZW5kaWYgLyogX0JSRUFLUE9JTlRfSF8qLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZy5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjFmYTcyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9kYmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaWZuZGVmIF9EQkdfSF8KLSNkZWZpbmUgX0RCR19IXwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJzZXNzaW9uLmgiCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0jaW5jbHVkZSAiYnJlYWtwb2ludC5oIgotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJtZW1vcnlpbmZvLmgiCi0jaW5jbHVkZSAiZGJnX2Vycm9yLmgiCi0jaW5jbHVkZSAiZGJnX2V2ZW50LmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgInByb3h5LmgiCi0KLSNkZWZpbmUgREJHUkVTX09LCQkJUFJPWFlfUkVTX09LCi0jZGVmaW5lIERCR1JFU19FUlIJCQlQUk9YWV9SRVNfRVJSCi0KLS8qCi0gKiBTZXNzaW9uIGNvbnRyb2wKLSAqLwotaW50IAlEYmdJbml0KHNlc3Npb24gKiosIGNoYXIgKiwgY2hhciAqLCAuLi4pOwotaW50CQlEYmdDb25uZWN0KHNlc3Npb24gKik7Ci1pbnQJCURiZ0NyZWF0ZShzZXNzaW9uICopOwotdm9pZCAJRGJnUmVnaXN0ZXJFdmVudEhhbmRsZXIoc2Vzc2lvbiAqLCB2b2lkICgqKShkYmdfZXZlbnQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLWludCAJRGJnU3RhcnRTZXNzaW9uKHNlc3Npb24gKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKik7Ci1pbnQgCURiZ1F1aXQoc2Vzc2lvbiAqKTsKLQotLyoKLSAqIEJyZWFrcG9pbnQgb3BlcmF0aW9ucwotICovCi1pbnQJCURiZ1NldExpbmVCcmVha3BvaW50KHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBpbnQgYnBpZCwgY2hhciAqZmlsZSwgaW50IGxpbmUpOwotaW50IAlEYmdTZXRGdW5jQnJlYWtwb2ludChzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IGJwaWQsIGNoYXIgKmZpbGUsIGNoYXIgKmZ1bmMpOwotaW50IAlEYmdEZWxldGVCcmVha3BvaW50KHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBpbnQgYnBpZCk7Ci0KLS8qCi0gKiBQcm9jZXNzIGNvbnRyb2wgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0dvKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0KTsKLWludCAJRGJnU3RlcChzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IGNvdW50LCBpbnQgdHlwZSk7Ci1pbnQgCURiZ1Rlcm1pbmF0ZShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCk7Ci1pbnQgCURiZ1N1c3BlbmQoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQpOwotCi0vKgotICogU3RhY2sgZnJhbWUgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0xpc3RTdGFja2ZyYW1lcyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IGxvdywgaW50IGhpZ2gpOwotaW50IAlEYmdTZXRDdXJyZW50U3RhY2tmcmFtZShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IGxldmVsKTsKLQotLyoKLSAqIEV4cHJlc3Npb24vdmFyaWFibGUgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0V2YWx1YXRlRXhwcmVzc2lvbihzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciAqZXhwKTsKLWludCAJRGJnR2V0VHlwZShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciAqZXhwKTsKLWludCAJRGJnTGlzdExvY2FsVmFyaWFibGVzKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0KTsKLWludCAJRGJnTGlzdEFyZ3VtZW50cyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50LCBpbnQpOwotaW50IAlEYmdMaXN0R2xvYmFsVmFyaWFibGVzKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0KTsKLQotLyoqCi0gKiBUaHJlYWQgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0xpc3RJbmZvVGhyZWFkcyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCk7Ci1pbnQgCURiZ1NldFRocmVhZFNlbGVjdChzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50KTsKLWludAkJRGJnU3RhY2tJbmZvRGVwdGgoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQpOwotCi0vKioKLSAqIE1lbW9yeSBvcGVyYXRpb25zCi0gKi8KLWludCAJRGJnRGF0YVJlYWRNZW1vcnkoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGxvbmcsIGNoYXIqLCBjaGFyKiwgaW50LCBpbnQsIGludCwgY2hhciopOwotaW50IAlEYmdEYXRhV3JpdGVNZW1vcnkoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGxvbmcsIGNoYXIqLCBjaGFyKiwgaW50LCBjaGFyKik7Ci0KLS8qCi0gKiBFdmVudCBIYW5kbGluZwotICovCi1pbnQgCURiZ1Byb2dyZXNzKHNlc3Npb24gKik7Ci12b2lkIAlEYmdSZWdpc3RlclJlYWRGaWxlSGFuZGxlcihzZXNzaW9uICpzLCBpbnQsIGludCAoKikoaW50LCB2b2lkICopLCB2b2lkICopOwotdm9pZCAJRGJnUmVnaXN0ZXJXcml0ZUZpbGVIYW5kbGVyKHNlc3Npb24gKnMsIGludCwgaW50ICgqKShpbnQsIHZvaWQgKiksIHZvaWQgKik7Ci12b2lkIAlEYmdSZWdpc3RlckV4Y2VwdEZpbGVIYW5kbGVyKHNlc3Npb24gKnMsIGludCwgaW50ICgqKShpbnQsIHZvaWQgKiksIHZvaWQgKik7Ci12b2lkCURiZ1VucmVnaXN0ZXJGaWxlSGFuZGxlcihzZXNzaW9uICpzLCBpbnQpOwotdm9pZCAJRGJnUmVnaXN0ZXJFdmVudEhhbmRsZXIoc2Vzc2lvbiAqcywgdm9pZCAoKikoZGJnX2V2ZW50ICosIHZvaWQgKiksIHZvaWQgKik7Ci0KLS8qCi0gKiBFcnJvciBIYW5kbGluZwotICovCi12b2lkCURiZ1NldEVycm9yKGludCwgY2hhciAqKTsKLWludAkJRGJnR2V0RXJyb3Iodm9pZCk7Ci1jaGFyICoJRGJnR2V0RXJyb3JTdHIodm9pZCk7Ci0KLS8qCi0gKiBDTEkgSGFuZGxpbmcKLSAqLwotaW50IAlEYmdDTElIYW5kbGUoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIqKTsKLQotLyoKLSAqIFNpZ25hbCBvcGVyYXRpb25zCi0gKi8KLWludCAJRGJnTGlzdFNpZ25hbHMoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIqKTsKLWludCAJRGJnU2lnbmFsSW5mbyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciopOwotCi0vKgotICogTmV3IGZ1bmN0aW9ucwotICovCi1pbnQgCURiZ0RhdGFFdmFsdXRlRXhwcmVzc2lvbihzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciopOwotaW50IAlEYmdWYXJpYWJsZUNyZWF0ZShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciopOwotaW50IAlEYmdWYXJpYWJsZURlbGV0ZShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciopOwotaW50IAlEYmdWYXJpYWJsZVVwZGF0ZShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgY2hhciopOwotaW50IAlEYmdHZXRQcnRpYWxBSUYoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIqLCBjaGFyICosIGludCwgaW50KTsKLWludCAJRGJnR2V0QUlGVmFsdWUoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIqKTsKLQotI2VuZGlmIC8qIF9EQkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9kYmdfY2xpZW50LmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvZGJnX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjIyZmUxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9kYmdfY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfREJHX0NMSUVOVF9IXwotI2RlZmluZSBfREJHX0NMSUVOVF9IXwotCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0jaW5jbHVkZSAiYnJlYWtwb2ludC5oIgotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJkYmdfZXZlbnQuaCIKLSNpbmNsdWRlICJwcm94eS5oIgotCi0vKgotICogU2Vzc2lvbiBjb250cm9sCi0gKi8KLWludCAJRGJnQ2xudEluaXQoaW50LCBpbnQsIGNoYXIgKiwgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcyAqLCBwcm94eV9jb21tYW5kcyAqKTsKLWludCAJRGJnQ2xudENyZWF0ZVNlc3Npb24oaW50LCBjaGFyICosIGludCk7Ci1pbnQgCURiZ0NsbnRTdGFydFNlc3Npb24oaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50UXVpdChpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRJc1NodXRkb3duKHZvaWQpOwotdm9pZCAJRGJnQ2xudEZpbmlzaCh2b2lkKTsKLQotLyoKLSAqIEJyZWFrcG9pbnQgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0NsbnRTZXRMaW5lQnJlYWtwb2ludChpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRTZXRGdW5jQnJlYWtwb2ludChpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnREZWxldGVCcmVha3BvaW50KGludCwgaW50LCBjaGFyICoqKTsKLWludCAJRGJnQ2xudEVuYWJsZUJyZWFrcG9pbnQoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50RGlzYWJsZUJyZWFrcG9pbnQoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50Q29uZGl0aW9uQnJlYWtwb2ludChpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRCcmVha3BvaW50QWZ0ZXIoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50U2V0V2F0Y2hwb2ludChpbnQsIGludCwgY2hhciAqKik7Ci0KLS8qCi0gKiBQcm9jZXNzIGNvbnRyb2wgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0NsbnRHbyhpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRTdGVwKGludCwgaW50LCBjaGFyICoqKTsKLWludCAJRGJnQ2xudFRlcm1pbmF0ZShpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRTdXNwZW5kKGludCwgaW50LCBjaGFyICoqKTsKLQotLyoKLSAqIFN0YWNrIGZyYW1lIG9wZXJhdGlvbnMKLSAqLwotaW50IAlEYmdDbG50TGlzdFN0YWNrZnJhbWVzKGludCwgaW50LCBjaGFyICoqKTsKLWludCAJRGJnQ2xudFNldEN1cnJlbnRTdGFja2ZyYW1lKGludCwgaW50LCBjaGFyICoqKTsKLQotLyoKLSAqIEV4cHJlc3Npb24vdmFyaWFibGUgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0NsbnRFdmFsdWF0ZUV4cHJlc3Npb24oaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50R2V0VHlwZShpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRMaXN0TG9jYWxWYXJpYWJsZXMoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50TGlzdEFyZ3VtZW50cyhpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRMaXN0R2xvYmFsVmFyaWFibGVzKGludCwgaW50LCBjaGFyICoqKTsKLQotLyoqCi0gKiBUaHJlYWQgb3BlcmF0aW9ucwotICovCi1pbnQgCURiZ0NsbnRMaXN0SW5mb1RocmVhZHMoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50U2V0VGhyZWFkU2VsZWN0KGludCwgaW50LCBjaGFyICoqKTsKLQotaW50IAlEYmdDbG50U3RhY2tJbmZvRGVwdGgoaW50LCBpbnQsIGNoYXIgKiopOwotCi0vKioKLSAqIFRocmVhZCBvcGVyYXRpb25zCi0gKi8KLWludCAJRGJnQ2xudERhdGFSZWFkTWVtb3J5KGludCwgaW50LCBjaGFyICoqKTsKLWludCAJRGJnQ2xudERhdGFXcml0ZU1lbW9yeShpbnQsIGludCwgY2hhciAqKik7Ci0KLS8qCi0gKiBFdmVudCBIYW5kbGluZwotICovCi1pbnQgCURiZ0NsbnRQcm9ncmVzcyh2b2lkKTsKLXZvaWQgCURiZ0NsbnRSZWdpc3RlclJlYWRGaWxlSGFuZGxlcihpbnQsIGludCAoKikoaW50LCB2b2lkICopLCB2b2lkICopOwotdm9pZAlEYmdDbG50UmVnaXN0ZXJXcml0ZUZpbGVIYW5kbGVyKGludCwgaW50ICgqKShpbnQsIHZvaWQgKiksIHZvaWQgKik7Ci12b2lkIAlEYmdDbG50UmVnaXN0ZXJFeGNlcHRGaWxlSGFuZGxlcihpbnQsIGludCAoKikoaW50LCB2b2lkICopLCB2b2lkICopOwotdm9pZCAJRGJnQ2xudFVucmVnaXN0ZXJGaWxlSGFuZGxlcihpbnQpOwotdm9pZCAJRGJnQ2xudFJlZ2lzdGVyRXZlbnRIYW5kbGVyKHZvaWQgKCopKGRiZ19ldmVudCAqLCB2b2lkICopLCB2b2lkICopOwotCi0vKgotICogRXJyb3IgSGFuZGxpbmcKLSAqLwotdm9pZAlEYmdDbG50U2V0RXJyb3IoaW50LCBjaGFyICopOwotaW50CQlEYmdDbG50R2V0RXJyb3Iodm9pZCk7Ci1jaGFyICoJRGJnQ2xudEdldEVycm9yU3RyKHZvaWQpOwotCi0vKgotICogQ0xJIEhhbmRsaW5nCi0gKi8KLWludAkJRGJnQ2xudENMSUhhbmRsZShpbnQsIGludCwgY2hhciAqKik7Ci0KLS8qKgotICogU2lnbmFsIG9wZXJhdGlvbnMKLSAqLwotaW50IAlEYmdDbG50TGlzdFNpZ25hbHMoaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50U2lnbmFsSW5mbyhpbnQsIGludCwgY2hhciAqKik7Ci0KLWludCAJRGJnQ2xudERhdGFFdmFsdWF0ZUV4cHJlc3Npb24oaW50LCBpbnQsIGNoYXIgKiopOwotaW50IAlEYmdDbG50R2V0UGFydGlhbEFJRihpbnQsIGludCwgY2hhciAqKik7Ci1pbnQgCURiZ0NsbnRWYXJpYWJsZURlbGV0ZShpbnQsIGludCwgY2hhciAqKik7Ci0KLSNlbmRpZiAvKiBfREJHX0NMSUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZ19lcnJvci5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZ19lcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc0Mjc0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9kYmdfZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpZm5kZWYgX0RCR19FUlJPUl9IXwotI2RlZmluZSBfREJHX0VSUk9SX0hfCi0KLSNkZWZpbmUgREJHRVJSX05PVElNUAkJCTEKLSNkZWZpbmUgREJHRVJSX1BST1hZX1RFUk0JCTIKLSNkZWZpbmUgREJHRVJSX1BST1hZX1BST1RPCQkzCi0jZGVmaW5lIERCR0VSUl9ERUJVR0dFUgkJCTQKLSNkZWZpbmUgREJHRVJSX05PQkFDS0VORAkJNQotI2RlZmluZSBEQkdFUlJfSU5QUk9HUkVTUwkJNgotI2RlZmluZSBEQkdFUlJfQ0JDUkVBVEUJCQk3Ci0jZGVmaW5lIERCR0VSUl9OT1NFU1NJT04JCTgKLSNkZWZpbmUgREJHRVJSX1NFU1NJT04JCQk5Ci0jZGVmaW5lIERCR0VSUl9OT0xJTkUJCQkxMAotI2RlZmluZSBEQkdFUlJfTk9GVU5DCQkJMTEKLSNkZWZpbmUgREJHRVJSX05PRklMRQkJCTEyCi0jZGVmaW5lIERCR0VSUl9OT0JQCQkJCTEzCi0jZGVmaW5lIERCR0VSUl9OT1NZTQkJCTE0Ci0jZGVmaW5lIERCR0VSUl9OT01FTQkJCTE1Ci0jZGVmaW5lIERCR0VSUl9DQU5UUlVOCQkJMTYKLSNkZWZpbmUgREJHRVJSX0lOVk9LRQkJCTE3Ci0jZGVmaW5lIERCR0VSUl9JU1JVTk5JTkcJCTE4Ci0jZGVmaW5lIERCR0VSUl9OT1RSVU4JCQkxOQotI2RlZmluZSBEQkdFUlJfRklSU1RGUkFNRQkJMjAKLSNkZWZpbmUgREJHRVJSX0xBU1RGUkFNRQkJMjEKLSNkZWZpbmUgREJHRVJSX0JBREJQQVJHCQkJMjIKLSNkZWZpbmUgREJHRVJSX1JFR0VYCQkJMjMKLSNkZWZpbmUgREJHRVJSX05PU1RBQ0sJCQkyNAotI2RlZmluZSBEQkdFUlJfT1VUT0ZSQU5HRQkJMjUKLSNkZWZpbmUgREJHRVJSX05PRklMRURJUgkJMjYKLSNkZWZpbmUgREJHRVJSX05PU1lNUwkJCTI3Ci0jZGVmaW5lIERCR0VSUl9URU1QCQkJCTI4Ci0jZGVmaW5lIERCR0VSUl9QSVBFCQkJCTI5Ci0jZGVmaW5lIERCR0VSUl9GT1JLCQkJCTMwCi0jZGVmaW5lIERCR0VSUl9TWVNURU0JCQkzMQotI2RlZmluZSBEQkdFUlJfTk9URVhFQwkJCTMyCi0jZGVmaW5lIERCR0VSUl9DSERJUgkJCTMzCi0jZGVmaW5lIERCR0VSUl9TT1VSQ0UJCQkzNAotI2RlZmluZSBEQkdFUlJfU0VUVkFSCQkJMzUKLSNkZWZpbmUgREJHRVJSX1BST0NTRVQJCQkzNgotI2RlZmluZSBEQkdFUlJfVU5LTk9XTgkJCTM3Ci0jZGVmaW5lIERCR0VSUl9VTktOT1dOX1RZUEUJCTM4Ci0jZGVmaW5lIERCR0VSUl9VTktOT1dOX1ZBUklBQkxFCTM5Ci0vKiBSRU1FQkVSIFRPIEFERCBORVcgRVJST1JTIFRPIHV0aWxzL2Vycm9yLmMhICovCi0vKgotICogRXJyb3IgSGFuZGxpbmcKLSAqLwotdm9pZAlEYmdTZXRFcnJvcihpbnQsIGNoYXIgKik7Ci1pbnQJCURiZ0dldEVycm9yKHZvaWQpOwotY2hhciAqCURiZ0dldEVycm9yU3RyKHZvaWQpOwotCi0jZW5kaWYgLyogX0RCR19FUlJPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZ19ldmVudC5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZ19ldmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTcxZTRiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9kYmdfZXZlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9EQkdfRVZFTlRfSF8KLSNkZWZpbmUgX0RCR19FVkVOVF9IXwotCi0jaW5jbHVkZSA8YWlmLmg+Ci0KLSNpbmNsdWRlICJicmVha3BvaW50LmgiCi0jaW5jbHVkZSAic3RhY2tmcmFtZS5oIgotI2luY2x1ZGUgIm1lbW9yeWluZm8uaCIKLSNpbmNsdWRlICJzaWduYWxpbmZvLmgiCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgInByb3h5X21zZy5oIgotCi0jZGVmaW5lIERCR19FVl9XQUlUQUxMCTAKLSNkZWZpbmUgREJHX0VWX1dBSVRTT01FCTEwMDAwMAotCi0jZGVmaW5lIERCR19FVl9PRkZTRVQJCTEwMAotI2RlZmluZSBEQkdFVl9FWElUCQkJREJHX0VWX09GRlNFVCArIDIKLSNkZWZpbmUgCURCR0VWX0VYSVRfTk9STUFMCTAKLSNkZWZpbmUgCURCR0VWX0VYSVRfU0lHTkFMCTEKLSNkZWZpbmUgREJHRVZfQlBTRVQJCQlEQkdfRVZfT0ZGU0VUICsgNAotI2RlZmluZSBEQkdFVl9GUkFNRVMJCURCR19FVl9PRkZTRVQgKyA1Ci0jZGVmaW5lIERCR0VWX0RBVEEJCQlEQkdfRVZfT0ZGU0VUICsgNgotI2RlZmluZSBEQkdFVl9UWVBFCQkJREJHX0VWX09GRlNFVCArIDcKLSNkZWZpbmUgREJHRVZfVkFSUwkJCURCR19FVl9PRkZTRVQgKyA4Ci0jZGVmaW5lIERCR0VWX0FSR1MJCQlEQkdfRVZfT0ZGU0VUICsgOQotI2RlZmluZSBEQkdFVl9JTklUCQkJREJHX0VWX09GRlNFVCArIDEwIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgREJHRVZfT0sJCQlEQkdfRVZfT0ZGU0VUICsgMTEKLSNkZWZpbmUgREJHRVZfRVJST1IJCQlEQkdfRVZfT0ZGU0VUICsgMTIKLSNkZWZpbmUgREJHRVZfU1VTUEVORAkJREJHX0VWX09GRlNFVCArIDEzCi0jZGVmaW5lIAlEQkdFVl9TVVNQRU5EX0JQSElUCQkwCi0jZGVmaW5lIAlEQkdFVl9TVVNQRU5EX1NJR05BTAkxCi0jZGVmaW5lIAlEQkdFVl9TVVNQRU5EX1NURVAJCTIKLSNkZWZpbmUgCURCR0VWX1NVU1BFTkRfSU5UCQkzCi0jZGVmaW5lIERCR0VWX1RIUkVBRFMJCURCR19FVl9PRkZTRVQgKyAxNAotI2RlZmluZSBEQkdFVl9USFJFQURfU0VMRUNUCURCR19FVl9PRkZTRVQgKyAxNQotI2RlZmluZSBEQkdFVl9TVEFDS19ERVBUSAlEQkdfRVZfT0ZGU0VUICsgMTYKLSNkZWZpbmUgREJHRVZfREFUQVJfTUVNCQlEQkdfRVZfT0ZGU0VUICsgMTcKLSNkZWZpbmUgREJHRVZfREFUQVdfTUVNCQlEQkdfRVZfT0ZGU0VUICsgMTgKLSNkZWZpbmUgREJHRVZfU0lHTkFMUwkJREJHX0VWX09GRlNFVCArIDE5Ci0KLSNkZWZpbmUgREJHRVZfREFUQV9FVkFfRVgJREJHX0VWX09GRlNFVCArIDIwIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgREJHRVZfUEFSVElBTF9BSUYJREJHX0VWX09GRlNFVCArIDIxCi0KLQotc3RydWN0IGRiZ19zdXNwZW5kX2V2ZW50IHsKLQlpbnQJcmVhc29uOwotCi0JdW5pb24gewotCQlpbnQJCQkJYnBpZDsJLyogREJHRVZfU1VTUEVORF9CUEhJVCAqLwotCQlzaWduYWxpbmZvICoJc2lnOwkvKiBEQkdFVl9TVVNQRU5EX1NJR05BTCAqLwotCX0gZXZfdTsKLQotCWludAkJCQl0aHJlYWRfaWQ7Ci0Jc3RhY2tmcmFtZSAqCWZyYW1lOwotCWludAkJCQlkZXB0aDsKLQotCUxpc3QgKgkJCWNoYW5nZWRfdmFyczsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfc3VzcGVuZF9ldmVudAlkYmdfc3VzcGVuZF9ldmVudDsKLQotc3RydWN0IGRiZ19leGl0X2V2ZW50IHsKLQlpbnQJcmVhc29uOwotCi0JdW5pb24gewotCQlpbnQJCQkJZXhpdF9zdGF0dXM7CS8qIERCR0VWX0VYSVRfTk9STUFMICovCi0JCXNpZ25hbGluZm8gKglzaWc7CQkJLyogREJHRVZfRVhJVF9TSUdOQUwgKi8KLQl9IGV2X3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgZGJnX2V4aXRfZXZlbnQJZGJnX2V4aXRfZXZlbnQ7Ci0KLXN0cnVjdCBkYmdfZXJyb3JfZXZlbnQgewotCWludAkJZXJyb3JfY29kZTsKLQljaGFyICoJZXJyb3JfbXNnOwotfTsKLXR5cGVkZWYgc3RydWN0IGRiZ19lcnJvcl9ldmVudAlkYmdfZXJyb3JfZXZlbnQ7Ci0KLXN0cnVjdCBkYmdfYnBzZXRfZXZlbnQgewotCWludAkJCQlicGlkOwotCWJyZWFrcG9pbnQgKglicDsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfYnBzZXRfZXZlbnQJZGJnX2Jwc2V0X2V2ZW50OwotCi1zdHJ1Y3QgZGJnX2RhdGFfZXZlbnQgewotCWNoYXIgKgl0eXBlX2Rlc2M7Ci0JQUlGICoJZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfZGF0YV9ldmVudAlkYmdfZGF0YV9ldmVudDsKLQotc3RydWN0IGRiZ190aHJlYWRzX2V2ZW50IHsKLQlMaXN0ICoJbGlzdDsKLQlpbnQJCXRocmVhZF9pZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfdGhyZWFkc19ldmVudAlkYmdfdGhyZWFkc19ldmVudDsKLQotc3RydWN0IGRiZ190aHJlYWRfc2VsZWN0X2V2ZW50IHsKLQlzdGFja2ZyYW1lICoJZnJhbWU7Ci0JaW50CQkJCXRocmVhZF9pZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfdGhyZWFkX3NlbGVjdF9ldmVudAlkYmdfdGhyZWFkX3NlbGVjdF9ldmVudDsKLQotc3RydWN0IGRiZ19wYXJ0aWFsX2FpZl9ldmVudCB7Ci0JQUlGICoJZGF0YTsKLQljaGFyICoJdHlwZV9kZXNjOwotCWNoYXIgKgluYW1lOwotfTsKLXR5cGVkZWYgc3RydWN0IGRiZ19wYXJ0aWFsX2FpZl9ldmVudCBkYmdfcGFydGlhbF9haWZfZXZlbnQ7Ci0KLXN0cnVjdCBkYmdfZXZlbnQgewotCWludAkJCWV2ZW50X2lkOwotCWludAkJCXRyYW5zX2lkOwotCWJpdHNldCAqCXByb2NzOwotCi0JdW5pb24gewotCQkvKgotCQkgKiBEQkdFVl9JTklUCi0JCSAqLwotCQlpbnQJCQkJCW51bV9zZXJ2ZXJzOwotCi0JCS8qCi0JCSAqIERCR0VWX0JQU0VUCi0JCSAqLwotCQlkYmdfYnBzZXRfZXZlbnQJCWJwc2V0X2V2ZW50OwotCi0JCS8qCi0JCSAqIERCR0VWX0ZSQU1FUywgREJHRVZfVkFSUywgREJHRVZfQVJHUywgREJHRVZfU0lHTkFMUwotCQkgKi8KLQkJTGlzdCAqCQkJCWxpc3Q7Ci0KLQkJLyoKLQkJICogREJHRVZfVFlQRQotCQkgKi8KLQkJY2hhciAqCQkJCXR5cGVfZGVzYzsKLQotCQkvKgotCQkgKiBEQkdFVl9EQVRBCi0JCSAqLwotCQlkYmdfZGF0YV9ldmVudAkJZGF0YV9ldmVudDsKLQotCQkvKgotCQkgKiBEQkdFVl9FWElUCi0JCSAqLwotCQlkYmdfZXhpdF9ldmVudAkJZXhpdF9ldmVudDsKLQotCQkvKgotCQkgKiBEQkdFVl9FUlJPUgotCQkgKi8KLQkJZGJnX2Vycm9yX2V2ZW50CQllcnJvcl9ldmVudDsKLQotCQkvKgotCQkgKiBEQkdFVl9TVVNQRU5ECi0JCSAqLwotCQlkYmdfc3VzcGVuZF9ldmVudAlzdXNwZW5kX2V2ZW50OwotCi0JCS8qCi0JCSAqIERCR0VWX1NUQUNLX0RFUFRICi0JCSAqLwotCQlpbnQJCQkJCXN0YWNrX2RlcHRoOwotCi0JCS8qCi0JCSAqIERCR0VWX0RBVEFSX01FTQotCQkgKi8KLQkJbWVtb3J5aW5mbyAqCQltZW1pbmZvOwotCi0JCS8qCi0JCSAqIERCR0VWX1RIUkVBRFMKLQkJICovCi0JCWRiZ190aHJlYWRzX2V2ZW50CXRocmVhZHNfZXZlbnQ7Ci0KLQkJLyoKLQkJICogREJHRVZfVEhSRUFEX1NFTEVDVAotCQkgKi8KLQkJZGJnX3RocmVhZF9zZWxlY3RfZXZlbnQJdGhyZWFkX3NlbGVjdF9ldmVudDsKLQotCQkvKgotCQkgKiBEQkdFVl9EQVRBX0VWQV9FWAotCQkgKi8KLQkJY2hhciAqIGRhdGFfZXhwcmVzc2lvbjsKLQotCQkvKgotCQkgKiBEQkdFVl9QQVJUSUFMX0FJRgotCQkgKi8KLQkJZGJnX3BhcnRpYWxfYWlmX2V2ZW50IHBhcnRpYWxfYWlmX2V2ZW50OwotCi0JfSBkYmdfZXZlbnRfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBkYmdfZXZlbnQgZGJnX2V2ZW50OwotCi1leHRlcm4gaW50IAkJCURiZ0Rlc2VyaWFsaXplRXZlbnQoaW50LCBpbnQsIGNoYXIgKiosIGRiZ19ldmVudCAqKik7Ci1leHRlcm4gaW50IAkJCURiZ1NlcmlhbGl6ZUV2ZW50KGRiZ19ldmVudCAqLCBjaGFyICoqLCBpbnQgKik7Ci1leHRlcm4gZGJnX2V2ZW50ICoJTmV3RGJnRXZlbnQoaW50KTsKLWV4dGVybiB2b2lkCQkJRnJlZURiZ0V2ZW50KGRiZ19ldmVudCAqKTsKLWV4dGVybiBkYmdfZXZlbnQgKglEYmdFcnJvckV2ZW50KGludCwgY2hhciAqKTsKLSNlbmRpZiAvKiBfREJHX0VWRU5UX0hfICovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvZGJnX3Byb3h5LmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvZGJnX3Byb3h5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjBhNzguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2RiZ19wcm94eS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfREJHX1BST1hZX0hfCi0jZGVmaW5lIF9EQkdfUFJPWFlfSF8KLQotI2RlZmluZSBEQkdfQ01EX0JBU0UJCQkJCTAKLQotI2RlZmluZSBEQkdfUVVJVF9DTUQJCQkJCURCR19DTURfQkFTRSswCi0jZGVmaW5lIERCR19TVEFSVFNFU1NJT05fQ01ECQkJREJHX0NNRF9CQVNFKzEKLSNkZWZpbmUgREJHX1NFVExJTkVCUkVBS1BPSU5UX0NNRAkJREJHX0NNRF9CQVNFKzIKLSNkZWZpbmUgREJHX1NFVEZVTkNCUkVBS1BPSU5UX0NNRAkJREJHX0NNRF9CQVNFKzMKLSNkZWZpbmUgREJHX0RFTEVURUJSRUFLUE9JTlRfQ01ECQlEQkdfQ01EX0JBU0UrNAotI2RlZmluZSBEQkdfRU5BQkxFQlJFQUtQT0lOVF9DTUQJCURCR19DTURfQkFTRSs1Ci0jZGVmaW5lIERCR19ESVNBQkxFQlJFQUtQT0lOVF9DTUQJCURCR19DTURfQkFTRSs2Ci0jZGVmaW5lIERCR19DT05ESVRJT05CUkVBS1BPSU5UX0NNRAkJREJHX0NNRF9CQVNFKzcKLSNkZWZpbmUgREJHX0JSRUFLUE9JTlRBRlRFUl9DTUQJCQlEQkdfQ01EX0JBU0UrOAotI2RlZmluZSBEQkdfU0VUV0FUQ0hQT0lOVF9DTUQJCQlEQkdfQ01EX0JBU0UrOQotI2RlZmluZSBEQkdfR09fQ01ECQkJCQkJREJHX0NNRF9CQVNFKzEwCi0jZGVmaW5lIERCR19TVEVQX0NNRAkJCQkJREJHX0NNRF9CQVNFKzExCi0jZGVmaW5lIERCR19URVJNSU5BVEVfQ01ECQkJCURCR19DTURfQkFTRSsxMgotI2RlZmluZSBEQkdfU1VTUEVORF9DTUQJCQkJCURCR19DTURfQkFTRSsxMwotI2RlZmluZSBEQkdfTElTVFNUQUNLRlJBTUVTX0NNRAkJCURCR19DTURfQkFTRSsxNAotI2RlZmluZSBEQkdfU0VUQ1VSUkVOVFNUQUNLRlJBTUVfQ01ECURCR19DTURfQkFTRSsxNQotI2RlZmluZSBEQkdfRVZBTFVBVEVFWFBSRVNTSU9OX0NNRAkJREJHX0NNRF9CQVNFKzE2Ci0jZGVmaW5lIERCR19HRVRUWVBFX0NNRAkJCQkJREJHX0NNRF9CQVNFKzE3Ci0jZGVmaW5lIERCR19MSVNUTE9DQUxWQVJJQUJMRVNfQ01ECQlEQkdfQ01EX0JBU0UrMTgKLSNkZWZpbmUgREJHX0xJU1RBUkdVTUVOVFNfQ01ECQkJREJHX0NNRF9CQVNFKzE5Ci0jZGVmaW5lIERCR19MSVNUR0xPQkFMVkFSSUFCTEVTX0NNRAkJREJHX0NNRF9CQVNFKzIwCi0jZGVmaW5lIERCR19MSVNUSU5GT1RIUkVBRFNfQ01ECQkJREJHX0NNRF9CQVNFKzIxCi0jZGVmaW5lIERCR19TRVRUSFJFQURTRUxFQ1RfQ01ECQkJREJHX0NNRF9CQVNFKzIyCi0jZGVmaW5lIERCR19TVEFDS0lORk9ERVBUSF9DTUQJCQlEQkdfQ01EX0JBU0UrMjMKLSNkZWZpbmUgREJHX0RBVEFSRUFETUVNT1JZX0NNRAkJCURCR19DTURfQkFTRSsyNAotI2RlZmluZSBEQkdfREFUQVdSSVRFTUVNT1JZX0NNRAkJCURCR19DTURfQkFTRSsyNQotI2RlZmluZSBEQkdfTElTVFNJR05BTFNfQ01ECQkJCURCR19DTURfQkFTRSsyNgotI2RlZmluZSBEQkdfU0lHTkFMSU5GT19DTUQJCQkJREJHX0NNRF9CQVNFKzI3IC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgREJHX0NMSUhBTkRMRV9DTUQJCQkJREJHX0NNRF9CQVNFKzI4Ci0jZGVmaW5lIERCR19EQVRBRVZBTFVBVEVFWFBSRVNTSU9OX0NNRAlEQkdfQ01EX0JBU0UrMjkgLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBEQkdfR0VUUEFSVElBTEFJRl9DTUQJCQlEQkdfQ01EX0JBU0UrMzAKLSNkZWZpbmUgREJHX1ZBUklBQkxFREVMRVRFX0NNRAkJCURCR19DTURfQkFTRSszMQotCi0jZW5kaWYgLyogX0RCR19QUk9YWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2hlbGxvcHJvdG8uaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9oZWxsb3Byb3RvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjYyZjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2hlbGxvcHJvdG8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEhFTExPUFJPVE9fSF8KLSNkZWZpbmUgSEVMTE9QUk9UT19IXwotCi1pbnQgaXNfc2VydmVyX3BlZXJfdmFsaWQoaW50IHNvY2tmZCk7Ci1pbnQgaXNfY2xpZW50X3BlZXJfdmFsaWQoaW50IHNvY2tmZCk7Ci0KLSNlbmRpZiAvKkhFTExPUFJPVE9fSF8qLwotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvaXRpbWVyLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvaXRpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjliYjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2l0aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfSVRJTUVSX0hfCi0jZGVmaW5lIF9JVElNRVJfSF8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNkZWZpbmUgTUFYX01BUktTCTEwMAotCi1zdHJ1Y3QgaXRfbWFyayB7Ci0JbG9uZwkJZWxhcHNlZDsKLQljaGFyICoJbGFiZWw7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgaXRfbWFyawlpdF9tYXJrOwotCi1zdHJ1Y3QgaXRpbWVyIHsKLQlpbnQJCQkJcnVubmluZzsKLQlpbnQJCQkJbWFya19jbnQ7Ci0JY2hhciAqCQkJbGFiZWw7Ci0JY2hhciAqCQkJbWFya19sYWJlbDsKLQlsb25nCQkJCWVsYXBzZWQ7Ci0JbG9uZwkJCQl0b3RhbF9lbGFwc2VkOwotCXN0cnVjdCB0aW1ldmFsCXN0YXJ0OwotCXN0cnVjdCB0aW1ldmFsCWxhc3RfbWFyazsKLQlzdHJ1Y3QgdGltZXZhbAlzdG9wOwotCWl0X21hcmsJCQltYXJrc1tNQVhfTUFSS1NdOwotfTsKLXR5cGVkZWYgc3RydWN0IGl0aW1lcgkJaXRpbWVyOwotCi1leHRlcm4gaXRpbWVyICoJaXRpbWVyX25ldyhjaGFyICpsYWJlbCk7Ci1leHRlcm4gdm9pZAkJaXRpbWVyX3N0YXJ0KGl0aW1lciAqdCk7Ci1leHRlcm4gdm9pZAkJaXRpbWVyX21hcmsoaXRpbWVyICp0LCBjaGFyICptc2cpOwotZXh0ZXJuIHZvaWQJCWl0aW1lcl9zdG9wKGl0aW1lciAqdCk7Ci1leHRlcm4gdm9pZAkJaXRpbWVyX3Jlc2V0KGl0aW1lciAqdCk7Ci1leHRlcm4gdm9pZAkJaXRpbWVyX2ZyZWUoaXRpbWVyICp0KTsKLWV4dGVybiB2b2lkCQlpdGltZXJfcHJpbnQoaXRpbWVyICp0KTsKLQotI2VuZGlmIC8qIF9JVElNRVJfSF8qLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL2xvY2F0aW9uLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvbG9jYXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxZTQ0Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvbG9jYXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpZm5kZWYgTE9DQVRJT05fSF8KLSNkZWZpbmUgTE9DQVRJT05fSF8KLQotc3RydWN0IGxvY2F0aW9uCi17Ci0JY2hhciAqCWZpbGU7Ci0JY2hhciAqCWZ1bmM7Ci0JY2hhciAqCWFkZHI7Ci0JaW50CQlsaW5lOwotfTsKLXR5cGVkZWYgc3RydWN0IGxvY2F0aW9uIGxvY2F0aW9uOwotCi0jZW5kaWYgLypMT0NBVElPTl9IXyovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvbWVtb3J5aW5mby5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL21lbW9yeWluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhZGI0MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvbWVtb3J5aW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotCi0jaWZuZGVmIF9NRU1PUllJTkZPX0hfCi0jZGVmaW5lIF9NRU1PUllJTkZPX0hfCi0KLSNpbmNsdWRlICJsaXN0LmgiCi0KLXN0cnVjdCBtZW1vcnlpbmZvIHsKLQljaGFyICphZGRyOwotCWxvbmcgbmV4dFJvdzsKLQlsb25nIHByZXZSb3c7Ci0JbG9uZyBuZXh0UGFnZTsKLQlsb25nIHByZXZQYWdlOwotCWxvbmcgbnVtQnl0ZXM7Ci0JbG9uZyB0b3RhbEJ5dGVzOwotCUxpc3QgKm1lbW9yaWVzOwotfTsKLXR5cGVkZWYgc3RydWN0IG1lbW9yeWluZm8gbWVtb3J5aW5mbzsKLQotc3RydWN0IG1lbW9yeSB7Ci0JY2hhciAqYWRkcjsKLQljaGFyICphc2NpaTsKLQlMaXN0ICpkYXRhOwotfTsKLXR5cGVkZWYgc3RydWN0IG1lbW9yeSBtZW1vcnk7Ci0KLWV4dGVybiBtZW1vcnlpbmZvICoJTmV3TWVtb3J5SW5mbyh2b2lkKTsKLWV4dGVybiB2b2lkCUZyZWVNZW1vcnlJbmZvKG1lbW9yeWluZm8gKik7Ci0KLWV4dGVybiBtZW1vcnkgKglOZXdNZW1vcnkodm9pZCk7Ci1leHRlcm4gdm9pZAlGcmVlTWVtb3J5KG1lbW9yeSAqKTsKLQotI2VuZGlmIC8qX01FTU9SWUlORk9fSF8qLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL3JvdXRpbmdfdGFibGUuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9yb3V0aW5nX3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWJhMDguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL3JvdXRpbmdfdGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFJPVVRJTkdfVEFCTEVfSF8KLSNkZWZpbmUgUk9VVElOR19UQUJMRV9IXwotCi1zdHJ1Y3Qgcm91dGluZ190YWJsZV9lbnRyeSB7Ci0Jc2RtX2lkIAlub2RlSUQ7Ci0JY2hhciAJaG9zdG5hbWVbMjU1XTsgLy8gU2VlIFJGQzEwMzQgZm9yIG1heGltdW0gc2l6ZSBvZiBhIGRvbWFpbiBuYW1lCi0JaW50CQlwb3J0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJvdXRpbmdfdGFibGVfZW50cnkJcm91dGluZ190YWJsZV9lbnRyeTsKLQotZXh0ZXJuIGludAkJCQkJCXNkbV9yb3V0aW5nX3RhYmxlX2luaXQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Ci1leHRlcm4gdm9pZAkJCQkJCXNkbV9yb3V0aW5nX3RhYmxlX3NldCh2b2lkKTsKLWV4dGVybiByb3V0aW5nX3RhYmxlX2VudHJ5ICoJc2RtX3JvdXRpbmdfdGFibGVfbmV4dCh2b2lkKTsKLQotI2VuZGlmIC8qIFJPVVRJTkdfVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9zZG0uaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9zZG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkY2UyOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvc2RtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgU0RNX0hfCi0jZGVmaW5lIFNETV9IXwotCi0jZGVmaW5lIFNETV9BR0dSRUdBVEVfVVBTVFJFQU0JCTB4MDAwMDAwMDEKLSNkZWZpbmUgU0RNX0FHR1JFR0FURV9ET1dOU1RSRUFNCTB4MDAwMDAwMDIKLSNkZWZpbmUgU0RNX0FHR1JFR0FURV9JTklUCQkJMHgwMDAwMDAwNAotI2RlZmluZSBTRE1fQUdHUkVHQVRFX1RJTUVPVVQJCTB4MDAwMDAwMDgKLQotc3RydWN0IHNkbV9pZHNldDsKLXN0cnVjdCBzZG1fbWVzc2FnZTsKLXN0cnVjdCBzZG1fYWdncmVnYXRlOwotCi10eXBlZGVmIGludAkJCQkJCXNkbV9pZDsKLXR5cGVkZWYgc3RydWN0IHNkbV9pZHNldCAqCQlzZG1faWRzZXQ7Ci10eXBlZGVmIHN0cnVjdCBzZG1fbWVzc2FnZSAqCXNkbV9tZXNzYWdlOwotdHlwZWRlZiBzdHJ1Y3Qgc2RtX2FnZ3JlZ2F0ZSAqCXNkbV9hZ2dyZWdhdGU7Ci0KLWV4dGVybiBzZG1faWQJU0RNX01BU1RFUjsKLQotI2luY2x1ZGUgInJvdXRpbmdfdGFibGUuaCIKLQotLyoKLSAqIFN0YXJ0dXAvSW5pdGlhbGl6YXRpb24KLSAqLwotZXh0ZXJuIGludCBzZG1faW5pdChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLWV4dGVybiBpbnQgc2RtX2Nvbm5lY3QoY29uc3Qgc2RtX2lkc2V0IGlkcyk7Ci1leHRlcm4gdm9pZCBzZG1fZmluYWxpemUodm9pZCk7Ci1leHRlcm4gdm9pZCBzZG1fcHJvZ3Jlc3Modm9pZCk7Ci0KLS8qCi0gKiBDb21tdW5pY2F0aW9uCi0gKi8KLWV4dGVybiBpbnQgc2RtX21lc3NhZ2VfaW5pdChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLWV4dGVybiB2b2lkIHNkbV9tZXNzYWdlX2ZpbmFsaXplKHZvaWQpOwotZXh0ZXJuIHNkbV9tZXNzYWdlIHNkbV9tZXNzYWdlX25ldyhjaGFyICpidWYsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgc2RtX21lc3NhZ2VfZnJlZShzZG1fbWVzc2FnZSBtc2cpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBzZG1fbWVzc2FnZV9nZXRfaWQoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKTsKLWV4dGVybiB2b2lkIHNkbV9tZXNzYWdlX3NldF9pZChjb25zdCBzZG1fbWVzc2FnZSBtc2csIGNvbnN0IHVuc2lnbmVkIGludCBpZCk7Ci1leHRlcm4gc2RtX2lkc2V0IHNkbV9tZXNzYWdlX2dldF9kZXN0aW5hdGlvbihjb25zdCBzZG1fbWVzc2FnZSBtc2cpOwotZXh0ZXJuIHNkbV9hZ2dyZWdhdGUgc2RtX21lc3NhZ2VfZ2V0X2FnZ3JlZ2F0ZShjb25zdCBzZG1fbWVzc2FnZSBtc2cpOwotZXh0ZXJuIHNkbV9pZHNldCBzZG1fbWVzc2FnZV9nZXRfc291cmNlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZyk7Ci1leHRlcm4gdm9pZCBzZG1fbWVzc2FnZV9zZXRfc291cmNlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgY29uc3Qgc2RtX2lkc2V0IHNyYyk7Ci1leHRlcm4gdm9pZCBzZG1fbWVzc2FnZV9nZXRfcGF5bG9hZChjb25zdCBzZG1fbWVzc2FnZSBtc2csIGNoYXIgKipidWYsIGludCAqbGVuKTsKLWV4dGVybiBpbnQgc2RtX21lc3NhZ2Vfc2VuZChjb25zdCBzZG1fbWVzc2FnZSBtc2cpOwotZXh0ZXJuIHZvaWQgc2RtX21lc3NhZ2Vfc2V0X3NlbmRfY2FsbGJhY2soY29uc3Qgc2RtX21lc3NhZ2UgbXNnLCB2b2lkICgqY2FsbGJhY2spKGNvbnN0IHNkbV9tZXNzYWdlIG1zZykpOwotZXh0ZXJuIHZvaWQgc2RtX21lc3NhZ2Vfc2V0X3JlY3ZfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKShjb25zdCBzZG1fbWVzc2FnZSBtc2cpKTsKLWV4dGVybiB2b2lkIHNkbV9tZXNzYWdlX3NldF9kZWxpdmVyX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKSk7Ci1leHRlcm4gaW50IHNkbV9tZXNzYWdlX3Byb2dyZXNzKHZvaWQpOwotZXh0ZXJuIHZvaWQJc2RtX21lc3NhZ2VfZGVsaXZlcihjb25zdCBzZG1fbWVzc2FnZSBtc2cpOwotCi0vKgotICogU2V0IG9wZXJhdGlvbnMKLSAqLwotZXh0ZXJuIHNkbV9pZHNldCBzZG1fc2V0X25ldyh2b2lkKTsKLWV4dGVybiB2b2lkIHNkbV9zZXRfZnJlZShzZG1faWRzZXQgc2V0KTsKLWV4dGVybiBzZG1faWRzZXQgc2RtX3NldF9jbGVhcihzZG1faWRzZXQgc2V0KTsKLWV4dGVybiBpbnQgc2RtX3NldF9zaXplKGNvbnN0IHNkbV9pZHNldCBzZXQpOwotZXh0ZXJuIHNkbV9pZHNldCBzZG1fc2V0X2FkZF9lbGVtZW50KGNvbnN0IHNkbV9pZHNldCBzZXQsIGNvbnN0IHNkbV9pZCBpZCk7Ci1leHRlcm4gc2RtX2lkc2V0IHNkbV9zZXRfcmVtb3ZlX2VsZW1lbnQoY29uc3Qgc2RtX2lkc2V0IHNldCwgY29uc3Qgc2RtX2lkIGlkKTsKLWV4dGVybiBzZG1faWRzZXQgc2RtX3NldF9hZGRfYWxsKGNvbnN0IHNkbV9pZHNldCBzZXQsIGNvbnN0IHNkbV9pZCBpZCk7Ci1leHRlcm4gaW50IHNkbV9zZXRfaXNfc3Vic2V0KGNvbnN0IHNkbV9pZHNldCBzZXQxLCBjb25zdCBzZG1faWRzZXQgc2V0Mik7Ci1leHRlcm4gaW50IHNkbV9zZXRfaXNfZW1wdHkoY29uc3Qgc2RtX2lkc2V0IHNldCk7Ci1leHRlcm4gaW50IHNkbV9zZXRfY29tcGFyZShjb25zdCBzZG1faWRzZXQgc2V0MSwgY29uc3Qgc2RtX2lkc2V0IHNldDIpOwotZXh0ZXJuIHNkbV9pZHNldCBzZG1fc2V0X3VuaW9uKGNvbnN0IHNkbV9pZHNldCBzZXQxLCBjb25zdCBzZG1faWRzZXQgc2V0Mik7Ci1leHRlcm4gc2RtX2lkc2V0IHNkbV9zZXRfaW50ZXJzZWN0KGNvbnN0IHNkbV9pZHNldCBzZXQxLCBjb25zdCBzZG1faWRzZXQgc2V0Mik7Ci1leHRlcm4gc2RtX2lkc2V0IHNkbV9zZXRfZGlmZihjb25zdCBzZG1faWRzZXQgc2V0MSwgY29uc3Qgc2RtX2lkc2V0IHNldDIpOwotZXh0ZXJuIGludCBzZG1fc2V0X2NvbnRhaW5zKGNvbnN0IHNkbV9pZHNldCBzZXQsIGNvbnN0IHNkbV9pZCBpZCk7Ci1leHRlcm4gc2RtX2lkIHNkbV9zZXRfbWF4KGNvbnN0IHNkbV9pZHNldCBzZXQpOwotZXh0ZXJuIHNkbV9pZCBzZG1fc2V0X2ZpcnN0KGNvbnN0IHNkbV9pZHNldCBzZXQpOwotZXh0ZXJuIHNkbV9pZCBzZG1fc2V0X25leHQoY29uc3Qgc2RtX2lkc2V0IHNldCk7Ci1leHRlcm4gaW50IHNkbV9zZXRfZG9uZShjb25zdCBzZG1faWRzZXQgc2V0KTsKLWV4dGVybiBpbnQgc2RtX3NldF9zZXJpYWxpemUoY29uc3Qgc2RtX2lkc2V0IHNldCwgY2hhciAqYnVmLCBjaGFyICoqZW5kKTsKLWV4dGVybiBpbnQgc2RtX3NldF9zZXJpYWxpemVkX2xlbmd0aChjb25zdCBzZG1faWRzZXQgc2V0KTsKLWV4dGVybiBpbnQgc2RtX3NldF9kZXNlcmlhbGl6ZShzZG1faWRzZXQgc2V0LCBjaGFyICpzdHIsIGNoYXIgKiplbmQpOwotZXh0ZXJuIGNoYXIgKl9zZXRfdG9fc3RyKGNvbnN0IHNkbV9pZHNldCBzZXQpOwotCi0vKgotICogUm91dGluZwotICovCi1leHRlcm4gaW50IHNkbV9yb3V0ZV9pbml0KGludCBhcmdjLCBjaGFyICphcmd2W10pOwotZXh0ZXJuIHZvaWQgc2RtX3JvdXRlX2ZpbmFsaXplKHZvaWQpOwotZXh0ZXJuIHNkbV9pZCBzZG1fcm91dGVfZ2V0X3BhcmVudCh2b2lkKTsKLWV4dGVybiBzZG1faWQgc2RtX3JvdXRlX2dldF9pZCh2b2lkKTsKLWV4dGVybiB2b2lkIHNkbV9yb3V0ZV9zZXRfaWQoc2RtX2lkIGlkKTsKLWV4dGVybiBpbnQgc2RtX3JvdXRlX2dldF9zaXplKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2RtX3JvdXRlX3NldF9zaXplKGludCBzKTsKLWV4dGVybiBzZG1faWRzZXQgc2RtX3JvdXRlX2dldF9yb3V0ZShjb25zdCBzZG1faWRzZXQgZGVzdCk7Ci1leHRlcm4gc2RtX2lkc2V0IHNkbV9yb3V0ZV9yZWFjaGFibGUoY29uc3Qgc2RtX2lkc2V0IGRlc3QpOwotCi0vKgotICogQWdncmVnYXRpb24KLSAqLwotZXh0ZXJuIGludCBzZG1fYWdncmVnYXRlX2luaXQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Ci1leHRlcm4gdm9pZAlzZG1fYWdncmVnYXRlX2ZpbmFsaXplKHZvaWQpOwotZXh0ZXJuIHNkbV9hZ2dyZWdhdGUgc2RtX2FnZ3JlZ2F0ZV9uZXcodm9pZCk7Ci1leHRlcm4gdm9pZCBzZG1fYWdncmVnYXRlX2ZyZWUoc2RtX2FnZ3JlZ2F0ZSBhKTsKLWV4dGVybiBpbnQgc2RtX2FnZ3JlZ2F0ZV9zZXJpYWxpemUoY29uc3Qgc2RtX2FnZ3JlZ2F0ZSBhLCBjaGFyICpidWYsIGNoYXIgKiplbmQpOwotZXh0ZXJuIGludCBzZG1fYWdncmVnYXRlX3NlcmlhbGl6ZWRfbGVuZ3RoKGNvbnN0IHNkbV9hZ2dyZWdhdGUgYSk7Ci1leHRlcm4gaW50IHNkbV9hZ2dyZWdhdGVfZGVzZXJpYWxpemUoc2RtX2FnZ3JlZ2F0ZSBhLCBjaGFyICpzdHIsIGNoYXIgKiplbmQpOwotZXh0ZXJuIHZvaWQgc2RtX2FnZ3JlZ2F0ZV9jb3B5KGNvbnN0IHNkbV9hZ2dyZWdhdGUgYTEsIGNvbnN0IHNkbV9hZ2dyZWdhdGUgYTIpOwotZXh0ZXJuIHZvaWQgc2RtX2FnZ3JlZ2F0ZV9zZXRfY29tcGxldGlvbl9jYWxsYmFjayhpbnQgKCpjYWxsYmFjaykoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKSk7Ci1leHRlcm4gdm9pZCBzZG1fYWdncmVnYXRlX3NldF92YWx1ZShjb25zdCBzZG1fYWdncmVnYXRlIGEsIGludCB0eXBlLCAuLi4pOwotZXh0ZXJuIHZvaWQgc2RtX2FnZ3JlZ2F0ZV9tZXNzYWdlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgdW5zaWduZWQgaW50IGZsYWdzKTsKLWV4dGVybiB2b2lkCXNkbV9hZ2dyZWdhdGVfcHJvZ3Jlc3Modm9pZCk7Ci1leHRlcm4gY2hhciAqIF9hZ2dyZWdhdGVfdG9fc3RyKHNkbV9hZ2dyZWdhdGUgYSk7Ci0KLS8qCi0gKiBJL08gZm9yd2FyZGluZwotICovCi1leHRlcm4gaW50IHNkbV9pb2Zfc2V0X3N0ZGluX2hhbmRsZXIoaW50IGZkX2luLCBpbnQgZmRfb3V0LCBpbnQgKCpzdGRpbl9oYW5kbGVyKShpbnQgZmRfaW4sIGludCBmZF9vdXQpKTsKLWV4dGVybiBpbnQgc2RtX2lvZl9zZXRfc3Rkb3V0X2hhbmRsZXIoaW50IGZkX2luLCBpbnQgZmRfb3V0LCBpbnQgKCpzdGRvdXRfaGFuZGxlcikoaW50IGZkX2luLCBpbnQgZmRfb3V0KSk7Ci1leHRlcm4gaW50IHNkbV9pb2Zfc2V0X3N0ZGVycl9oYW5kbGVyKGludCBmZF9pbiwgaW50IGZkX291dCwgaW50ICgqc3RkZXJyX2hhbmRsZXIpKGludCBmZF9pbiwgaW50IGZkX291dCkpOwotCi0jZW5kaWYgLyogU0RNX0hfICovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvc2Vzc2lvbi5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL3Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3ZWUzZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvc2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfU0VTU0lPTl9IXwotI2RlZmluZSBfU0VTU0lPTl9IXwotCi0jaW5jbHVkZSAiZGJnX2V2ZW50LmgiCi0KLXN0cnVjdCBzZXNzaW9uIHsKLQlpbnQJCQkJCXNlc3NfcHJvY3M7Ci0Jc3RydWN0IHByb3h5X2NsbnQgKglzZXNzX3Byb3h5OwotCXZvaWQJCQkJKCpzZXNzX2V2ZW50X2hhbmRsZXIpKGRiZ19ldmVudCAqLCB2b2lkICopOwotCXZvaWQgKgkJCQlzZXNzX2V2ZW50X2RhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3Qgc2Vzc2lvbglzZXNzaW9uOwotCi0jZW5kaWYgLyogX1NFU1NJT05fSF8qLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL3NpZ25hbGluZm8uaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5jbHVkZS9zaWduYWxpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YzdmZWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL3NpZ25hbGluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpZm5kZWYgU0lHTkFMSU5GT19IXwotI2RlZmluZSBTSUdOQUxJTkZPX0hfCi0KLXN0cnVjdCBzaWduYWxpbmZvIHsKLQljaGFyICpuYW1lOwotCWludCBzdG9wOwotCWludCBwcmludDsKLQlpbnQgcGFzczsKLQljaGFyICpkZXNjOwotfTsKLXR5cGVkZWYgc3RydWN0IHNpZ25hbGluZm8gc2lnbmFsaW5mbzsKLQotZXh0ZXJuIHNpZ25hbGluZm8gKk5ld1NpZ25hbEluZm8odm9pZCk7Ci1leHRlcm4gdm9pZCBGcmVlU2lnbmFsSW5mbyhzaWduYWxpbmZvICopOwotI2VuZGlmIC8qU0lHTkFMSU5GT19IXyovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvc3RhY2tmcmFtZS5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9pbmNsdWRlL3N0YWNrZnJhbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlMTJhNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luY2x1ZGUvc3RhY2tmcmFtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBTVEFDS0ZSQU1FX0hfCi0jZGVmaW5lIFNUQUNLRlJBTUVfSF8KLQotI2luY2x1ZGUgImxvY2F0aW9uLmgiCi0KLXN0cnVjdCBzdGFja2ZyYW1lIHsKLQlpbnQJCWxldmVsOwotCWxvY2F0aW9uCWxvYzsKLX07Ci10eXBlZGVmIHN0cnVjdCBzdGFja2ZyYW1lIHN0YWNrZnJhbWU7Ci0KLWV4dGVybiBzdGFja2ZyYW1lICoJTmV3U3RhY2tmcmFtZShpbnQpOwotZXh0ZXJuIHZvaWQJCQlGcmVlTG9jYXRpb24obG9jYXRpb24gKik7Ci1leHRlcm4gdm9pZAkJCUZyZWVTdGFja2ZyYW1lKHN0YWNrZnJhbWUgKik7Ci0jZW5kaWYgLypTVEFDS0ZSQU1FX0hfKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5zdGFsbC1zaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vaW5zdGFsbC1zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJjNjY5MS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLSMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgotIwotIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0jIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0jIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKLSMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi0jIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0KLSMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAotCi0jIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCi0KLQotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXRyYW5zZm9ybWJhc2VuYW1lPSIiCi10cmFuc2Zvcm1fYXJnPSIiCi1pbnN0Y21kPSIkbXZwcm9nIgotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPSIiCi1jaGdycGNtZD0iIgotc3RyaXBjbWQ9IiIKLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9IiIKLWRzdD0iIgotZGlyX2FyZz0iIgotCi13aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KLSAgICBjYXNlICQxIGluCi0JLWMpIGluc3RjbWQ9IiRjcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1kKSBkaXJfYXJnPXRydWUKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KLQkgICAgdGhlbgotCQlzcmM9JDEKLQkgICAgZWxzZQotCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKLQkJOgotCQlkc3Q9JDEKLQkgICAgZmkKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotICAgIGVzYWMKLWRvbmUKLQotaWYgWyB4IiRzcmMiID0geCBdCi10aGVuCi0JZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCi0JZXhpdCAxCi1lbHNlCi0JdHJ1ZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KLQlkc3Q9JHNyYwotCXNyYz0iIgotCQotCWlmIFsgLWQgJGRzdCBdOyB0aGVuCi0JCWluc3RjbWQ9OgotCWVsc2UKLQkJaW5zdGNtZD1ta2RpcgotCWZpCi1lbHNlCi0KLSMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAotIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKLSMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotCi0JaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQotCXRoZW4KLQkJdHJ1ZQotCWVsc2UKLQkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCi0JCWV4aXQgMQotCWZpCi0JCi0JaWYgWyB4IiRkc3QiID0geCBdCi0JdGhlbgotCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0JCWV4aXQgMQotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCi0jIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLQotCWlmIFsgLWQgJGRzdCBdCi0JdGhlbgotCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAotCWVsc2UKLQkJdHJ1ZQotCWZpCi1maQotCi0jIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKLWRzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KLSMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAotCi0jIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgotaWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCi1kZWZhdWx0SUZTPScJCi0nCi1JRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgotCi1vSUZTPSIke0lGU30iCi0jIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotSUZTPSclJwotc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCi1JRlM9IiR7b0lGU30iCi0KLXBhdGhjb21wPScnCi0KLXdoaWxlIFsgJCMgLW5lIDAgXSA7IGRvCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKLQlzaGlmdAotCi0JaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7Ci0gICAgICAgIHRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCi1kb25lCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXQotdGhlbgotCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKLQotIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCi0KLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKLQkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQotCWZpCi0KLSMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQotCi0JaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0KLQlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0KLQkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKLQotCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgotCi0jIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLQotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQotIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAotCi1maSAmJgotCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9qbmkvLmN2c2lnbm9yZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vam5pLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjdmNjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9qbmkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLmRlcHMKLS5saWJzCi0qLmxvCi0uZGlyc3RhbXAKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vam5pL2RiZ19qbmkuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vam5pL2RiZ19qbmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4ZmRkYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2puaS9kYmdfam5pLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEhFIEpOSSBGVU5DVElPTlMgVEhBVCBUSEUgUlVOVElNRSBFTlZJUk9OTUVOVCBXSUxMIENBTEwgLSBUSEVTRSBBUkUKLSAqIEpVU1QgU1RVQlMgVEhBVCBXSUxMIENBTEwgQURESVRJT05BTCBGVU5DVElPTlMgVE8gRE8gVEhFICdSRUFMJwotICogV09SSwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUpOSUVYUE9SVCBpbnQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9wdHBfZGVidWdfZXh0ZXJuYWxfZGVidWdnZXJfUGFyYWxsZWxEZWJ1Z2dlcl9EYmdSdW4oSk5JRW52ICplbnYsIGppbnRBcnJheSBwcm9jcykKLXsKLSAgICAJcmV0dXJuIERiZ1J1bigpOwotfQotCi1KTklFWFBPUlQgaW50IEpOSUNBTEwKLUphdmFfb3JnX2VjbGlwc2VfcHRwX2RlYnVnX2V4dGVybmFsX2RlYnVnZ2VyX1BhcmFsbGVsRGVidWdnZXJfRGJnR28oSk5JRW52ICplbnYsIGppbnRBcnJheSBwcm9jcykKLXsKLSAgICAJcmV0dXJuIERiZ0dvKCk7Ci19Ci0KLUpOSUVYUE9SVCBpbnQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9wdHBfZGVidWdfZXh0ZXJuYWxfZGVidWdnZXJfUGFyYWxsZWxEZWJ1Z2dlcl9EYmdTdGVwKEpOSUVudiAqZW52LCBqaW50QXJyYXkgcHJvY3MsIGppbnQgY291bnQsIGppbnQgdHlwZSkKLXsKLSAgICAJcmV0dXJuIERiZ1N0ZXAoKTsKLX0KLQotSk5JRVhQT1JUIGludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX3B0cF9kZWJ1Z19leHRlcm5hbF9kZWJ1Z2dlcl9QYXJhbGxlbERlYnVnZ2VyX0RiZ0tpbGwoSk5JRW52ICplbnYsIGppbnRBcnJheSBwcm9jcykKLXsKLSAgICAJcmV0dXJuIERiZ0tpbGwoKTsKLX0KLQotSk5JRVhQT1JUIGludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX3B0cF9kZWJ1Z19leHRlcm5hbF9kZWJ1Z2dlcl9QYXJhbGxlbERlYnVnZ2VyX0RiZ0hhbHQoSk5JRW52ICplbnYsIGppbnRBcnJheSBwcm9jcykKLXsKLSAgICAJcmV0dXJuIERiZ0hhbHQoKTsKLX0KLQotSk5JRVhQT1JUIGludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX3B0cF9kZWJ1Z19leHRlcm5hbF9kZWJ1Z2dlcl9QYXJhbGxlbERlYnVnZ2VyX0RiZ1NldExpbmVCcmVha3BvaW50KEpOSUVudiAqZW52LCBqaW50QXJyYXkgcHJvY3MpCi17Ci0gICAgCXJldHVybiBEYmdTZXRMaW5lQnJlYWtwb2ludCgpOwotfQotCi1KTklFWFBPUlQgaW50IEpOSUNBTEwKLUphdmFfb3JnX2VjbGlwc2VfcHRwX2RlYnVnX2V4dGVybmFsX2RlYnVnZ2VyX1BhcmFsbGVsRGVidWdnZXJfRGJnU2V0RnVuY0JyZWFrcG9pbnQoSk5JRW52ICplbnYsIGppbnRBcnJheSBwcm9jcykKLXsKLSAgICAJcmV0dXJuIERiZ1NldEZ1bmNCcmVha3BvaW50KCk7Ci0KLX0KLQotSk5JRVhQT1JUIGludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX3B0cF9kZWJ1Z19leHRlcm5hbF9kZWJ1Z2dlcl9QYXJhbGxlbERlYnVnZ2VyX0RlbGV0ZUJyZWFrcG9pbnRzKEpOSUVudiAqZW52LCBqaW50QXJyYXkgcHJvY3MpCi17Ci0gICAgCXJldHVybiBEYmdEZWxldGVCcmVha3BvaW50cygpOwotCi19Ci0KLUpOSUVYUE9SVCBpbnQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9wdHBfZGVidWdfZXh0ZXJuYWxfZGVidWdnZXJfUGFyYWxsZWxEZWJ1Z2dlcl9MaXN0U3RhY2tmcmFtZXMoSk5JRW52ICplbnYsIGppbnRBcnJheSBwcm9jcykKLXsKLSAgICAJcmV0dXJuIERiZ0xpc3RTdGFja2ZyYW1lcygpOwotCi19Ci0KLUpOSUVYUE9SVCBpbnQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9wdHBfZGVidWdfZXh0ZXJuYWxfZGVidWdnZXJfUGFyYWxsZWxEZWJ1Z2dlcl9TZXRDdXJyZW50U3RhY2tmcmFtZShKTklFbnYgKmVudiwgamludEFycmF5IHByb2NzKQotewotICAgIAlyZXR1cm4gRGJnU2V0Q3VycmVudFN0YWNrZnJhbWUoKTsKLQotfQotCi1KTklFWFBPUlQgaW50IEpOSUNBTEwKLUphdmFfb3JnX2VjbGlwc2VfcHRwX2RlYnVnX2V4dGVybmFsX2RlYnVnZ2VyX1BhcmFsbGVsRGVidWdnZXJfTGlzdExvY2FsVmFyaWFibGVzKEpOSUVudiAqZW52LCBqaW50QXJyYXkgcHJvY3MpCi17Ci0gICAgCXJldHVybiBEYmdMaXN0TG9jYWxWYXJpYWJsZXMoKTsKLQotfQotCi1KTklFWFBPUlQgaW50IEpOSUNBTEwKLUphdmFfb3JnX2VjbGlwc2VfcHRwX2RlYnVnX2V4dGVybmFsX2RlYnVnZ2VyX1BhcmFsbGVsRGVidWdnZXJfTGlzdEFyZ3VtZW50cyhKTklFbnYgKmVudiwgamludEFycmF5IHByb2NzKQotewotICAgIAlyZXR1cm4gRGJnTGlzdEFyZ3VtZW50cygpOwotCi19Ci0KLUpOSUVYUE9SVCBpbnQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9wdHBfZGVidWdfZXh0ZXJuYWxfZGVidWdnZXJfUGFyYWxsZWxEZWJ1Z2dlcl9MaXN0R2xvYmFsVmFyaWFibGVzKEpOSUVudiAqZW52LCBqaW50QXJyYXkgcHJvY3MpCi17Ci0gICAgCXJldHVybiBEYmdMaXN0R2xvYmFsVmFyaWFibGVzKCk7Ci0KLX0KLQotSk5JRVhQT1JUIGludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX3B0cF9kZWJ1Z19leHRlcm5hbF9kZWJ1Z2dlcl9QYXJhbGxlbERlYnVnZ2VyX0V2YWx1YXRlRXhwcmVzc2lvbihKTklFbnYgKmVudiwgamludEFycmF5IHByb2NzKQotewotICAgIAlyZXR1cm4gRGJnRXZhbHVhdGVFeHByZXNzaW9uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vam5pL21ha2VfbWFjb3N4Lm1hayBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vam5pL21ha2VfbWFjb3N4Lm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODc0Ny4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2puaS9tYWtlX21hY29zeC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgTWFrZWZpbGUgZm9yIE9NUEkgbGlicmFyaWVzIG9uIE1hYyBPUyBYCi0KLVBSRUZJWD1kYmcKLUFSQ0hfUFJFRklYPW1hY29zeAotVkVSU0lPTj0xLjAuMAotCi1EQkdfTElCPWxpYiQoUFJFRklYKS0kKEFSQ0hfUFJFRklYKS0kKFZFUlNJT04pLmpuaWxpYgotCi1DQyA9IGdjYwotSkFWQUggPSBqYXZhaAotI0RFQlVHID0gLWcKLUNGTEFHUyA9IC1jICQoREVCVUcpIC1JL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9IZWFkZXJzCi1MRkxBR1MgPSAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAtZnJhbWV3b3JrIEphdmFWTSAtZmxhdF9uYW1lc3BhY2UgLXVuZGVmaW5lZCBzdXBwcmVzcwotT0JKRUNUUyA9IGRiZ19qbmkubwotU1JDUyA9IGRiZ19qbmkuYwotSERSUyA9IGRiZ19qbmkuaAotCi1hbGw6ICQoREJHX0xJQikKLQotLmMubzoKLQkkKENDKSAkKENGTEFHUykgJCouYwotCi0kKERCR19MSUIpOiAkKE9CSkVDVFMpCi0JJChDQykgLW8gJChEQkdfTElCKSAkKExGTEFHUykgJChPQkpFQ1RTKQotCi0kKEhEUlMpOgotCSQoSkFWQUgpIC1vICQoSERSUykgLWNsYXNzcGF0aCAuLi8uLi9iaW4vb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2V4dGVybmFsL2RlYnVnZ2VyIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5leHRlcm5hbC5kZWJ1Z2dlci5QYXJhbGxlbERlYnVnZ2VyCi0JCi1pbnN0YWxsOiBhbGwKLQljcCAqLmpuaWxpYiAkKE9VVFBVVF9ESVIpCi0KLWNsZWFuOgotCXJtIC1mICouam5pbGliICoubwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvLmN2c2lnbm9yZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDgyYTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXRlc3RhaWYKLWNvbmZpZy5zdGF0dXMKLU1ha2VmaWxlCi1haWZfeGRyLmMKLWNvbmZpZy5oCi0qLmEKLWF1dG9tNHRlLmNhY2hlCi0uZGVwcwotc3RhbXAtaDEKLWEub3V0LmRTWU0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0FVVEhPUlMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWNiZmJjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0FVVEhPUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HcmVnIFdhdHNvbiA8Zy53YXRzb25AY29tcHV0ZXIub3JnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0NIQU5HRVMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9DSEFOR0VTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZmOTFjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0NIQU5HRVMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotJExvZzogQ0hBTkdFUyx2ICQKLVJldmlzaW9uIDEuMTIgIDIwMDIvMDgvMjkgMTc6NTc6MDggIGdyZWcKLURvbm55IG1hZGUgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotCi0JTW9yZSBjb21tZW50IG9uIEZEU0VudW1Db25zdEJ5TmFtZQotCUEgbmV3IGZ1bmN0aW9uIDogRkRTRW51bUNvbnN0QnlWYWx1ZSAoY2hhbmdlcyBpbiBmZHMuYyBhbmQgZmRzLmgpCi0JTm93LCBwcmludGluZyBhbiBlbnVtIHdpbGwgcHJpbnQgdGhlIHN0cmluZwotCU5ldyB0ZXN0IGZpbGVzOiB0ZXN0YWlmLmMgYW5kIHRlc3RhaWYuaAotCi1SZXZpc2lvbiAxLjExICAyMDAyLzA3LzIyIDIyOjMyOjAzICBncmVnCi1HcmVnIG1hZGUgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotCi0JRml4ZWQgc29tZSBtaW5vciBidWdzLgotCUFkZGVkIGFwcGx5cGF0Y2ggYW5kIGZpeGVkIGNyZWF0ZXBhdGNoIHNjcmlwdHMuCi0JVXBkYXRlZCBwYXRjaGVzIHRvIHN1cHBvcnQgR0RCIDUuMgotCVVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KLQlVcGRhdGVkIGxpY2VuY2UgdG8gR05VLgotCi1SZXZpc2lvbiAxLjEwICAyMDAyLzA3LzA0IDE3OjI4OjMzICBncmVnCi1HcmVnL0Rvbm55IG1hZGUgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotCi0JRml4ZWQgc3VwcG9ydCBmb3IgdW5zaWduZWQgaW50ZWdlcnMuCi0KLVJldmlzaW9uIDEuOSAgMjAwMi8wNy8wMiAyMDo0Mjo0NyAgZ3JlZwotR3JlZyBtYWRlIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKLQotCUFkZGVkIHN1cHBvcnQgZm9yIE1hY09TIFguCi0JVXBkYXRlZCBjb3B5cmlnaHQgbm90aWNlcyBpbiBzb3VyY2UgZmlsZXMuCi0KLVJldmlzaW9uIDEuOCAgMjAwMi8wNS8xOCAwNjoxMTowNCAgZ3JlZwotRG9ubnkgbWFkZSB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Ci0JMS4gTmV3IHRlc3QgZm9yIEFJRkRpZmYoKSBpbiB0ZXN0YWlmLmMKLQkyLiBBIG1vZGlmaWNhdGlvbiBmb3IgdGhlICJub24tbnVsbCB3aXRoIG51bGwiIGNvbXBhcmlzb24gaW4gY2FsYy5jCi0JICAgYW5kIGNtcC5jCi0JMy4gU29tZSBhZGRpdGlvbnMgaW4gYWlmLXZhbHByaW50LmMsIGEgcGFydGlhbCBzdXBwb3J0IGZvcgotCSAgIFRZUEVfQ09ERV9GVU5DLCBhbmQgYWxzbyBhIGNoYW5nZSBpbiBUWVBFX0NPREVfVk9JRC4KLQk0LiBBIGNoYW5nZSBpbiBBSUZfRlVOQ1RJT04gYW5kIGFsc28gYSBuZXcgZnVuY3Rpb24gaW4gZmRzLmMKLQkgICB0aGF0IHN1cHBvcnQgdGhlIGNoYW5nZXMgaW4gYWlmLXZhbHByaW50LmMKLUNWZTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZXZpc2lvbiAxLjggIDIwMDIvMDUvMTggMDY6MTE6MDQgIGdyZWcKLURvbm55IG1hZGUgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotCTEuIE5ldyB0ZXN0IGZvciBBSUZEaWZmKCkgaW4gdGVzdGFpZi5jCi0JMi4gQSBtb2RpZmljYXRpb24gZm9yIHRoZSAibm9uLW51bGwgd2l0aCBudWxsIiBjb21wYXJpc29uIGluIGNhbGMuYwotCSAgIGFuZCBjbXAuYwotCTMuIFNvbWUgYWRkaXRpb25zIGluIGFpZi12YWxwcmludC5jLCBhIHBhcnRpYWwgc3VwcG9ydCBmb3IKLQkgICBUWVBFX0NPREVfRlVOQywgYW5kIGFsc28gYSBjaGFuZ2UgaW4gVFlQRV9DT0RFX1ZPSUQuCi0JNC4gQSBjaGFuZ2UgaW4gQUlGX0ZVTkNUSU9OIGFuZCBhbHNvIGEgbmV3IGZ1bmN0aW9uIGluIGZkcy5jCi0JICAgdGhhdCBzdXBwb3J0IHRoZSBjaGFuZ2VzIGluIGFpZi12YWxwcmludC5jCi1DVmU6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGh1IE1heSAxNiAxNToyNjozNiBFU1QgMjAwMiBncmVnCi0JRG9ubnkgbWFkZSBzb21lIGNoYW5nZXMgdG8gc3RydWN0L2NsYXNzIGNvZGUgaW4gY29udi5jLgotTW9uIEFwciAyOSAxMToxNjoyNiBFU1QgMjAwMiBncmVnCi0JRG9ubnkgYWRkZWQgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gc3VwcG9ydCBjaXJjdWxhciBsaXN0cy4KLQlJIGZpeGVkIGEgYnVnIGluIF9haWZfYXJyYXlfcmVmKCkuCi1Nb24gQXByIDE1IDA5OjQwOjE4IEVTVCAyMDAyIGdyZWcKLQlEb25ueSBtYWRlIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKLQkJZml4ZWQgYnVncyBpbiBfYWlmX3N0cmluZ190b19zdHIgLSB3cm9uZyBhcmd1bWVudHMKLQkJZml4ZWQgYSBidWcgaW4gX2FpZl9lbnVtX3RvX3N0ciAtIG11c3QgYmUgYWR2YW5jZWQgdW50aWwgdGhlIGVuZAotCQlmaXhlZCBidWcgaW4gX2FpZl9lbnVtX3RvX3N0ciAtIHdyb25nIHdheSBvZiBkb2luZyBpdAotCQlmaXhlZCBhIGJ1ZyBpbiBBSUZfU1RSVUNUIGluIF9haWZfdW5hcnlfb3AgLSAKLQkJCV9haWZfdW5hcnlfb3AgY2hhbmdlcyB0aGUgZmRzCi0JCWFkZCBBSUZfRU5VTSBpbiBfZmRzX2FkdmFuY2UoKSwgX2Zkc19jb3VudF9ieXRlcygpLAotCQkJX2FpZl9iaW5hcnlfb3AoKSwgX2FpZl91bmFyeV9vcCgpCi0JCW5ldyB0ZXN0cyBpbiB0ZXN0YWlmLmMKLVdlZCBBcHIgMTAgMTU6Mzc6MDggRVNUIDIwMDIgZ3JlZwotCURvbm55IG1hZGUgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotCQlmaXhlZCBtZW1zZXQgYnVnIGluIEJvb2xUb0FJRigpLgotCQltZXJnZWQgQUlGKlRvU3RyKCkgYW5kIEFJRlByaW50KigpIHJvdXRpbmVzLgotVGh1IE1hciAyMSAxMjoyMzo0NyBFU1QgMjAwMiBncmVnCi0JRG9ubnkgbWFkZSB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Ci0JCXVwZGF0ZWQgSU5URVJOQUwKLQkJY2hhbmdlZCBGRFNfSUQsIHNvIG5vdzoKLQkJCXt8YWE9aXM0Ozs7fSBmb3IgYW5vbnltb3VzIHN0cnVjdAotCQkJe2lkfGFhPWlzNDs7O30gZm9yIG5vbi1hbm9ueW1vdXMgc3RydWN0Ci0JCWNoYW5nZWQgQUlGUHJpbnQoKSBzbyB0aGF0IGl0IGRvZXNuJ3QgcHJpbnQgdGhlIEZEU19JRAotCQljbGVhbiB1cCB0aGUgX2FpZl9kaWZmKCkgJiBfYWlmX2JpbmFyeV9vcCgpCi0JCQlub3RlOiB0aGVyZSBpcyBzdGlsbCAnY2FzZSBBSUZfQk9PTEVBTicgaW4gCi0JCQlfYWlmX2JpbmFyeV9vcCgpIGZvciBBTkQgJiBPUiBvcGVyYXRpb25zCi0JCWRlcHRoIGFyZ3VtZW50IGluIEFJRlByaW50KCksIEFJRkNvbXBhcmUoKSAmIEFJRkRpZmYoKQotCQkJKCBkZXB0aCA9PSAwIC0tLT4gYWxsICkKLQkJY2hhbmdlZCB0ZXN0YWlmLmMgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcwotTW9uIE1hciAgNCAxMzo0OTo0NSBFU1QgMjAwMiBncmVnCi0JRG9ubnkgZml4ZWQgYSBudW1iZXIgb2YgYnVncyBpbiBmZHMuYzoKLQkJY2FsbCB0byBTVEFSVF9TVFJVQ1QoKSBpbiBfZGF0YV9sZW5fcHVibGljKCkgaW5jb3JyZWN0Ci0JCUZEU0FkZEZpZWxkVG9DbGFzcygpIG5lZWRzIHRvIGNoZWNrIGZvciBuYW1lZCBzdHJ1Y3QsIGFsc28KLQkJCXBvaW50ZXJzIG5vdCBoYW5kbGVkIHByb3Blcmx5Ci0JCXdyb25nIGFyZ3VtZW50IHVzZWQgaW4gQUlGQWRkRmllbGRUb1N0cnVjdCgpCi0JCXN0cm5jbXAoKSBpbiBGRFNTdHJ1Y3RGaWVsZEJ5TmFtZSgpCi0JCUZEU1R5cGVDb21wYXJlKCkgcmV0dXJucyB3cm9uZyB2YWx1ZQotCQl3cm9uZyBhcmd1bWVudCB0byBfZmllbGRfYXR0cmlidXRlKCkgaW4gRkRTU3RydWN0RmllbGRCeU5hbWUoKQotCURvbm55IGZpeGVkIGFyZ3VtZW50cyB0byB0ZXN0QXNjaWkoKSBpbiB0ZXN0YWlmLmMKLQotV2VkIEZlYiAyNyAxODo0ODo0MiBFU1QgMjAwMiBncmVnCi0JQWRkZWQgRG9ubnkncyBjaGFuZ2VzIHRvIHN1cHBvcnQgbmV3IGRhdGEgdHlwZXM6Ci0JCWJvb2xlYW4KLQkJZW51bWVyYXRlZCB0eXBlcwotCQl1bmlvbnMKLQkJY2xhc3NlcwotCUZpeGVkIGEgYnVnIGluIFR5cGVUb0ZEUygpIC0gbWlzc2luZyB2YV9zdGFydCgpLgotCVJlbW92ZWQgbG9nIG1lc3NhZ2VzIGFzIHRoZXkgd2VyZSBnZXR0aW5nIHRvbyBtZXNzeS4KLQotVHVlIEF1ZyAyMiAxNDoxMToxOSBFU1QgMjAwMCByZmlua2VsCi0JY2xlYW5lZCB1cCBjb2RlCi0JCWFkZGVkIGZpbGUgaW50ZXJuYWwuZG9jIHRvIGV4cGxhaW4gdGhlIGRhdGEgc3RydWN0dXJlcwotCQlhZGRlZCBmaWxlIGludGVybmFsLmggZm9yIHByb3RvdHlwZXMgb2YgaW50ZXJuYWwgcm91dGluZXMKLQkJcmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzCi0JCWFkZGVkICJjb25zdCIgdG8gbWFueSBwcm90b3R5cGVzIHRvIGVuZm9yY2UgcmVhZG9ubHkgc3RhdHVzCi0JZml4ZWQgYnVncwotCQlfYWlmX2ludF90b19zdHIgaW52b2tlZCBfYWlmX2Rpdl9pbnQgd2l0aCBhIGJhZCBwYXJhbWV0ZXJzLgotCQlfYWlmX2NvbXBhcmUgb2YgdHdvIGFycmF5cyBjYWxsZWQgX2FpZl9jb21wYXJlIHdpdGggYmFkIHBhcmFtcy4KLQljb2xsYXBzZWQgX2ZpZWxkX3R5cGUgYW5kIF9maWVsZF9uYW1lIGludG8gX2ZpZWxkX2F0dHJpYnV0ZTsgY2hhbmdlZAotCQlmcm9tIHN0YXRpYyB0byBkeW5hbWljIGFsbG9jYXRpb24gb2YgdHlwZSBhbmQgbmFtZSByZXR1cm4KLQkJZmllbGRzIGJlY2F1c2UgdHlwZXMgY2FuIGJlIGVtYmVkZGVkIHdpdGhpbiB0eXBlcy4KLQlhZGRlZCByb3V0aW5lcyB0byB0aGUgQVBJIGZvciBwb2ludGVycwotCQlBSUYgKlBvaW50ZXJUb0FJRihjb25zdCBBSUYgKik7Ci0JCUFJRiAqQUlGTnVsbCgpOyAvKiByZXR1cm4gbnVsbCB2YWx1ZSAqLwotCQl2b2lkIEFJRlByaW50UG9pbnRlcihGSUxFICosIEFJRiAqKTsKLQkJZW5oYW5jZWQgcm91dGluZXMgaW4gY21wLmMgdG8gaGFuZGxlIHBvaW50ZXJzCi0JYWRkZWQgcm91dGluZXMgdG8gdGhlIEFQSSBmb3Igc3RydWN0cwotCQlBSUYgKkVtcHR5U3RydWN0VG9BSUYoY29uc3QgY2hhciAqKTsKLQkJaW50ICBBSUZBZGRGaWVsZFRvU3RydWN0KEFJRiAqLCBjaGFyKiwgQUlGICopOwotCQl2b2lkIEFJRlByaW50U3RydWN0KEZJTEUgKiwgQUlGICopOwotCQllbmhhbmNlZCByb3V0aW5lcyBpbiBmZHMuYyBmb3IgbmVzdGVkIHN0cnVjdHMKLQkJZW5oYW5jZWQgcm91dGluZXMgaW4gY21wLmMgdG8gaGFuZGxlIHN0cnVjdHMKLQlhZGRlZCByb3V0aW5lcyB0byB0aGUgQVBJIGZvciBuYW1lcyAoZm9yIGNpcmN1bGFyIHN0cnVjdHVyZXMpCi0JCUFJRiAqTmFtZUFJRihjb25zdCBBSUYgKiwgY29uc3QgY2hhciAqKTsKLQkJQUlGICpSZWZlcmVuY2VBSUYoY29uc3QgY2hhciAqKTsKLQkJQUlGICpDYW5vbmljYWxBSUYoY29uc3QgQUlGICopOwotCQllbmhhbmNlZCByb3V0aW5lcyBpbiBjbXAuYyB0byBoYW5kbGUgbmFtZXMKLQotRnJpIEZlYiAgOSAwOTo1MTo0NCBFU1QgMjAwMSByZmlua2VsCi0JUmVvcmdhbml6ZWQgdGhlIG1lYW5pbmcgb2YgdGhlIGZkcyBhbmQgaXRzIGFzc29jaWF0ZWQgZGF0YSB0byBjb25mb3JtIHdpdGgKLQkJdGhlIG91dHB1dCBvZiBnZGIgd2l0aCB0aGUgbmV3ICJzZXQgcHJpbnQgYWlmIG9uIiBvcHRpb24uCi0JCUFkZGVkIGNvZGUgZm9yIGEgc3RyaW5nIHR5cGUuCi0JYWRkZWQgcm91dGluZXMgdG8gQVBJCi0JCUFJRiAqRnJvbUFzY2lpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLQltb2RpZmllZCB0aGUgY29tcGFyaXNvbiwgYXJpdGhtZXRpYywgYW5kIGR1bXAvcHJpbnQgcm91dGluZXMgdG8gYWR2YW5jZQotCQlmaWxlIGFuZCBkYXRhIHBvaW50ZXJzIHNvIHRoYXQgZGF0YSBsZW5ndGggaXMgbm8gbG9uZ2VyIHBhc3NlZCBpbi4gIEluCi0JCXRoaXMgd2F5IHdlIGNhbiBoYW5kbGUgZGF0YSBvZiBpbmRldGVybWluYXRlIGxlbmd0aCwgc3VjaCBhcyBsaW5rZWQKLQkJbGlzdHMuCi0JcHJlY2lzaW9uCi0JCWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGludGVnZXJzIGlzIG5vdyBsb25nIGxvbmcgaW50IHRvIGluY3JlYXNlCi0JCQlyYW5nZS4KLQkJX2FpZl90b19kb3VibGUoKSBjYW4gbm93IGhhbmRsZSBmMTYgZm9ybWF0OyBjaGFuZ2VkIGFsbCBjYWxsZXJzIHRvCi0JCQl1bmRlcnN0YW5kIHRoYXQsIGFsdGhvdWdoIHdpdGggcG9zc2libGUgbG9zcyBvZiBwcmVjaXNpb24uCi0JYWxnb3JpdGhtCi0JCV9haWZfYWRkX2ludCBhbmQgdGhlIGxpa2Ugbm93IGNvbnZlcnQgdG8gbmF0aXZlIHR5cGVzLCBkbyBhcml0aG1ldGljLAotCQkJdGhlbiBjb252ZXJ0IGJhY2sgdG8gQUlGOyB0aGV5IHVzZWQgdG8gc2ltdWxhdGUgYXJpdGhtZXRpYyBieQotCQkJYml0IG1hbmlwdWxhdGlvbiBvbiB0aGUgQUlGX0RBVEEuICBJZiBuZWNlc3NhcnksIHdlIGNhbiBzaW11bGF0ZQotCQkJbG9uZ2VyIHByZWNpc2lvbiBieSBzcGxpdHRpbmcgaW50byBzaG9ydC1wcmVjaXNpb24gY2h1bmtzLgotCQlzaW1pbGFybHksIHR5cGUgY29udmVyc2lvbnMgbm93IGdvIHRocm91Z2ggbmF0aXZlIHR5cGVzLgotCWNsZWFuZWQgdXAgY29kZQotCQlhZGRlZCAiY29uc3QiIHRvIG1vcmUgcHJvdG90eXBlcyB0byBlbmZvcmNlIHJlYWRvbmx5IHN0YXR1cy4KLQkJcmVndWxhcml6ZWQgdGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgYW5kIHRoZWlyIGZvcm1hbCBuYW1lcy4KLQkJYWRkZWQgc29tZSBmb3JtYWwgbmFtZXMgdG8gcHJvdG90eXBlcyBhcyBleHRlcm5hbCBkb2N1bWVudGlvbi4KLQkJQWZ0ZXIgSSBoYXZlIG1vZGlmaWVkL2NoZWNrZWQgYSByb3V0aW5lLCBJIHB1dCBhIGNvbW1lbnQKLQkJCWF0IHRoZSBjbG9zaW5nIGJyYWNlIG5hbWluZyB0aGUgcm91dGluZS4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0NPUFlJTkcgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdlMTA1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLUFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLW1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIAotTEEtQ0MgMDQtMTE1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvQ2hhbmdlTG9nIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0NoYW5nZUxvZworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9JTlNUQUxMIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwYzQyZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9JTlNUQUxMCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU2VlIFJFQURNRSBmb3IgYnVpbGQvaW5zdGFsbCBpbnN0cnVjdGlvbnMuCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9JTlRFUk5BTCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0lOVEVSTkFMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE5MDgxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL0lOVEVSTkFMCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLUludGVybmFsIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhaWYgbGlicmFyeS4KLQotQUlGIHN0YW5kcyBmb3IgImFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmb3JtIi4gIEFueSBkYXRhIHN0cnVjdHVyZSBpbiBhbnkKLWxhbmd1YWdlIHNob3VsZCBiZSBjb252ZXJ0YWJsZSB0byBhbiBBSUYuICBUaGUgQUlGIG1heSBiZSBzYWZlbHkgc2hpcHBlZCBmcm9tCi1tYWNoaW5lIHRvIG1hY2hpbmUgYW5kIGNvbnZlcnRlZCBiYWNrIHRvIGFuIGVxdWl2YWxlbnQgZGF0YSBzdHJ1Y3R1cmUuCi0KLUFuIEFJRiBpcyBhIHN0cnVjdCB3aXRoIGZpZWxkcyBmb3IgdGhlIGZvcm1hdC1kZXNjcmlwdG9yIHN0cmluZyAoZmRzKSBhbmQgdGhlCi1kYXRhICh3aXRoIGV4cGxpY2l0IGxlbmd0aCkuICBUaGUgZmRzIHVzZXMgY2hhcmFjdGVycyB0byBpbmRpY2F0ZSB0aGUgdHlwZS4KLUFsbCBieXRlcyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGEgYnkgdHdvIGhleCBjaGFyYWN0ZXJzLCByZXByZXNlbnRpbmcgdXBwZXIKLW5pYmJsZSB0aGVuIGxvd2VyIG5pYmJsZS4gIFRoZSBjaGFyYWN0ZXJzIGFuZCBmb3JtYXRzIGhhdmUgY2hhbmdlZCBvdmVyIHRpbWUuCi1UaGlzIGlzIHRoZSBjdXJyZW50bHkgb3BlcmF0aXZlIGxpc3Q6Ci0KLWI6IGJvb2xlYW4KLQktIHRoZSBkYXRhIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgYSBuYXRpdmUgaW50ZWdlcgotCS0gdGhlIGRhdGEgZm9yIGEgdHJ1ZSB2YWx1ZSBpcyAtMSBhbmQgMCBmb3IgYSBmYWxzZSB2YWx1ZQotCi1jOiBjaGFyYWN0ZXIgIAotCS0gdXNlcyAxIGJ5dGUgb2YgZGF0YQotCS0gY2hhcmFjdGVycyBhcmUgYWx3YXlzIHVuc2lnbmVkCi0KLWk6IGludGVnZXI6IGkoc3x1KU4KLQktIHMgbWVhbnMgc2lnbmVkOyB1IG1lYW5zIHVuc2lnbmVkCi0JLSBOIGlzIGEgc2luZ2xlIGRpZ2l0IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhCi0KLWY6IGZsb2F0aW5nOiBmTgotCS0gTiBpcyBhIHNpbmdsZSBkaWdpdCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YQotCi1eOiBwb2ludGVyOiBeVAotCS0gVCBpcyBhIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgKHBvc3NpYmx5IG9mID4gZm9ybSkKLQktIFRoZSBmaXJzdCBieXRlIGluIHRoZSBkYXRhIGlzIGEgbWFya2VyLCB3aXRoIHZhbHVlOgotCQkwIHRvIGluZGljYXRlIGEgbnVsbCB2YWx1ZQotCQkxIHRvIGluZGljYXRlIGEgbm9ybWFsIHZhbHVlLiAgVGhlIHRhcmdldCBpcyBmb3VuZCBpbiB0aGUgCi0JCSAgc3Vic2VxdWVudCBieXRlcwotCQkyIHRvIGluZGljYXRlIGEgbm9ybWFsIHZhbHVlIHRoYXQgd2lsbCBiZSByZWZlcnJlZCB0byBsYXRlci4gIAotCQkgIFRoZSBuZXh0IGJ5dGUgZ2l2ZXMgYSBuYW1lIHRvIHRoaXMgdmFsdWUuICBTdWJzZXF1ZW50IAotCQkgIGJ5dGVzIHJlcHJlc2VudCB0aGUgdmFsdWUgb2YgdGhlIHRhcmdldAotCQkzIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGNpcmN1bGFyLiAgVGhlIG5leHQgYnl0ZSBnaXZlcyAKLQkJICB0aGUgbmFtZSBieSB3aGljaCB0aGlzIHZhbHVlIGlzIGtub3duCi0JCTQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCBwb2ludGVyIHZhbHVlCi0KLSU6IG5hbWVkIGNvbXBvbmVudDogJW5hbWUvVAotCS0gd2hlcmUgVCBpcyBhIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQKLQktIHVzZXMgMCBieXRlcyBvZiBkYXRhCi0KLT46IHJlZmVyZW5jZSB0byBuYW1lZCBjb21wb25lbnQ6ID5uYW1lLwotCS0gdXNlZCBpbiBjaXJjdWxhciBsaW5rZWQgdHlwZXMgdG8gbWFrZSByZXByZXNlbnRhdGlvbiBmaW5pdGUKLQktIHVzZXMgMCBieXRlcyBvZiBkYXRhCi0KLVs6IGFycmF5OiBbUl1UCi0JLSBSIGlzIGEgcmFuZ2UgaW5kaWNhdGluZyBsb3cgYW5kIGhpZ2ggYm91bmRzCi0JLSBUIGlzIGEgZm9ybWF0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGJhc2UgdHlwZSAoY2FuIGJlIGFuIGFycmF5KQotCS0gaXRzZWxmIHVzZXMgMCBieXRlcyBvZiBkYXRhLCBidXQgdGhlIGNvbXBvbmVudHMgbWF5IHVzZSBkYXRhCi0KLXs6IHN0cnVjdDoge0lEfE4xPUYxLE4yPUYyLC4uLjs7O30KLQktIElEIGlzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc3RydWN0LCBpdCBpcyBvcHRpb25hbAotCS0gTm4gaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JLSBGbiBpcyBhIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWVsZAotCS0gc3RydWN0IGFuZCBjbGFzcyBzaGFyZSB0aGUgc2FtZSBmb3JtYXQgc3RyaW5nIHNpbmNlIGNvbmNlcHR1YWxseQotCSAgdGhleSBhcmUgdGhlIHNhbWUgKGV4Y2VwdCBmb3IgdGhlIGRlZmF1bHQgbWVtYmVyIGFjY2VzcyBzcGVjaWZpZXJzKQotCi17OiBjbGFzczoge0lEfE4xPUYxLC4uLjsgTjI9RjIsLi4uOyBOMz1GMywuLi47IE40PUY0LC4uLn0KLQktIElEIGlzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgY2xhc3MsIGl0IGlzIG9wdGlvbmFsCi0JLSBObiBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQktIEZuIGlzIGEgZm9ybWF0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZpZWxkCi0JLSBUaGUgY2xhc3MgZm9ybWF0IHN0cmluZyBpcyBkaXZpZGVkIGludG8gZm91ciBzZWN0aW9ucyAKLQkgIChzZXBhcmF0ZWQgYnkgYSA7KSA6Ci0JICBUaGUgZmlyc3Qgc2VjdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHB1YmxpYyBkYXRhIChlZzogTjEpCi0JICBUaGUgc2Vjb25kIHNlY3Rpb24gaXMgdXNlZCB0byBzdG9yZSBwcm90ZWN0ZWQgZGF0YSAoZWc6IE4yKQotCSAgVGhlIHRoaXJkIHNlY3Rpb24gaXMgdXNlZCB0byBzdG9yZSBwcml2YXRlIGRhdGEgKGVnOiBOMykKLQkgIFRoZSBmb3VydGggc2VjdGlvbiBpcyB1c2VkIHRvIHN0b3JlIGhpZGRlbiBkYXRhIChlZzogTjMpCi0KLSg6IHVuaW9uOiAoSUR8TjE9RjEsTjI9RjIsLi4uKQotCS0gSUQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSB1bmlvbiwgaXQgaXMgb3B0aW9uYWwKLQktIE5uIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCS0gRm4gaXMgYSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmllbGQKLQotPDogZW51bWVyYXRpb246IDxJRHxTMT1WMSxTMj1WMiwuLi4+aXM0Ci0JLSBJRCBpcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGVudW0sIGl0IGlzIG9wdGlvbmFsCi0JLSBjb25zaXN0cyBvZiBuYW1lL3ZhbCBwYWlycyBTbj1WbiB3aGVyZSBTbiBpcyB0aGUgbmFtZSBvZiB0aGUgCi0JICBlbnVtZXJhdGVkIHZhbHVlIGFuZCBWbiBpcyB0aGUgdmFsdWUgb2YgdGhlIGVudW1lcmF0aW9uLiBWYWx1ZXMgCi0JICBhcmUgaW50ZWdlcnMgd2hvc2UgdHlwZSBpcyBpczQgKHNpZ25lZCBpbnRlZ2VyIHdpdGggNCBieXRlcykKLQotcjogcmFuZ2U6IHJMLi5VVAotCS0gYSByYW5nZSBmcm9tIEwgdG8gVSwgd2hlcmUgTCBhbmQgVSBhcmUgaW50ZWdlciB0eXBlcyBzcGVjaWZpZWQgYnkgVAotCi0mOiBmdW5jdGlvbjogJkExLEEyLC4uLi9UCi0JLSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0eXBlIFQgYW5kIHRoYXQgaGFzIGFyZ3VtZW50cyBvZiB0eXBlIAotCSAgQTEsIEEyLCAuLi4gRGF0YSBjb25zaXN0cyBvZiBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyAKLQkgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgotCi1zOiBzdHJpbmc6IHMKLQktIHRoZSBmaXJzdCAyIGJ5dGVzIG9mIHRoZSBkYXRhIGluZGljYXRlIHRoZSBsZW5ndGggKG1vcmUgc2lnbmlmaWNhbnQgCi0JICBieXRlIGZpcnN0KSBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzLiAgVGhlc2UgYnl0ZXMgZm9sbG93IGltbWVkaWF0ZWx5Ci0KLXY6IHZvaWQ6IHZOCi0JLSBOIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YQotCi16OiBaUEwgcmVnaW9uOiB6TlQKLQktIGEgWlBMIHJlZ2lvbiBvZiByYW5rIE4uIFR5cGUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBkZXNjcmliaW5nCi0JICB0aGUgYm91bmRzIG9mIGVhY2ggcmFuayBhbmQgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUuIFRoZSBkYXRhIAotCSAgY29uc2lzdHMgb2YgcGFpcnMgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUgbG93ZXIgYW5kIHVwcGVyCi0JICBib3VuZHMgb2YgZWFjaCByYW5rIHJlc3BlY3RpdmVseQotCi0/OiBpbnZhbGlkOiA/bj8gCi0JLSBuIGlzIGFuIGludGVnZXIgY29kZSAoY3VycmVudGx5IG9ubHkgMCkKLQktIDAgYnl0ZXMgb2YgZGF0YQotCi1UaGUgY29uc3RydWN0aW9uIHJvdXRpbmVzIGFsbG93IGEgY2xpZW50IHRvIGJ1aWxkIG1vc3QgcmVhc29uYWJsZSBBSUZzLCBidXQgaW4KLWJ1aWxkaW5nIGRhdGEtY2lyY3VsYXIgQUlGcyByZXF1aXJlcyB1c2luZyBsb3dlci1sZXZlbCBhY2Nlc3MuICBGb3IgYXJyYXlzLCBpdAotaXMgbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGFycmF5IHVzaW5nIGxvdy1sZXZlbAotbWVjaGFuaXNtcyBiZWZvcmUgdXNpbmcgb3VyIGNvbnN0cnVjdG9ycyB0byBtYWtlIHRoZSBmaW5hbCBBSUYuCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9MSUNFTkNFIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvTElDRU5DRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMDU0Yi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9MSUNFTkNFCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMAotCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAKLUFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIAotQUdSRUVNRU5ULgotCi0xLiBERUZJTklUSU9OUwotCi0iQ29udHJpYnV0aW9uIiBtZWFuczoKLQotCWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIAotCXRoaXMgQWdyZWVtZW50LCBhbmQKLQliKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6Ci0JaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCi0JaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKLQl3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgCi0JcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIAotCVByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIAotCW5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIAotCWNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgCi0JdGhlIFByb2dyYW0uCi0KLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KLQotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgCi10aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCi0KLSJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCi0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgotCi0yLiBHUkFOVCBPRiBSSUdIVFMKLQotCWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgCi0Jbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MgCi0Jb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIAotCUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgotCWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgCi0Jbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIAotCW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiAKLQlzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIAotCUNvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIAotCWFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIAotCXBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gCi0JaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KLQljKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgCi0Jc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgCi0JaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgCi0JZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCAKLQlvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCAKLQlsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IAotCW90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIAotCWlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byAKLQlhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgotCWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgCi0JQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCi0KLTMuIFJFUVVJUkVNRU5UUwotCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSAKLWFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKLQotCWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQliKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6Ci0JaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIAotCWFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCAKLQl3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKLQlpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIAotCWRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0JaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIAotCWFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQKLQlpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIAotCWxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciAKLQlzb2Z0d2FyZSBleGNoYW5nZS4KLQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgotCi0JYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0JYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0JCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IAotcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIAotYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgCi10aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gCi1pbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgCi1Db250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgCi1Db250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCAKLUNvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCAKLWxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgCi1leHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyAKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgCi1hcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gCi1JbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgCi1pbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgCi1Db250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIAotVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgCi1wZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgCi1Db250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIAotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotNS4gTk8gV0FSUkFOVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLVBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCAKLWFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIAotb2Ygb3BlcmF0aW9ucy4KLQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgCi1BTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgCi1JTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIAotVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgCi1BRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLTcuIEdFTkVSQUwKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCAKLWFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgCi1uZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCi0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIAotaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIAotc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIAotdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgCi1tYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIAotb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgCi10ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IAotcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSAKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgCi1pbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IAotZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIAotcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIAotdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgCi1tYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIAotYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSAKLVByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAKLTIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgCi1Db250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCAKLXJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyAKLW9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyAKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgCi10cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uCi0KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9NYWtlZmlsZS5hbSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjg5MjJmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotbm9pbnN0X1BST0dSQU1TID0JCQl0ZXN0YWlmCi1ub2luc3RfTElCUkFSSUVTID0JCQlsaWJhaWYuYQotCi1saWJhaWZfYV9TT1VSQ0VTID0JCQlhaWYuYyBcCi0JCQkJCQkJY2FsYy5jIFwKLQkJCQkJCQlmZHMuYyBcCi0JCQkJCQkJYXJyYXkuYyBcCi0JCQkJCQkJY29udi5jIFwKLQkJCQkJCQljbXAuYyBcCi0JCQkJCQkJcHJpbnQuYyBcCi0JCQkJCQkJZXJyb3IuYyBcCi0JCQkJCQkJaW8uYyBcCi0JCQkJCQkJc3RydWN0LmMgXAotCQkJCQkJCXV0aWwuYyBcCi0JCQkJCQkJYWlmLngKLQkJCQkJCi1saWJhaWZfYV9DRkxBR1MgPQkJCSQoQU1fQ0ZMQUdTKSAKLQotdGVzdGFpZl9TT1VSQ0VTID0JCQl0ZXN0YWlmLmMKLXRlc3RhaWZfQ0ZMQUdTID0JCQktSS4gJChBTV9DRkxBR1MpIC1nCi10ZXN0YWlmX0xERkxBR1MgPSAJCQktZwotdGVzdGFpZl9MREFERCA9CQkJCWxpYmFpZi5hCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9NYWtlZmlsZS5pbiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVjNzc0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzQ4ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotCi0KLVZQQVRIID0gQHNyY2RpckAKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1hbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCi1pbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAotaW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYwotaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCi1JTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQotdHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1ub2luc3RfUFJPR1JBTVMgPSB0ZXN0YWlmJChFWEVFWFQpCi1zdWJkaXIgPSAuCi1ESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKLQkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZy5oLmluIFwKLQkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKHRvcF9zcmNkaXIpL2RvYy9NYWtlZmlsZS5pbiBBVVRIT1JTIFwKLQlDT1BZSU5HIENoYW5nZUxvZyBJTlNUQUxMIE5FV1MgY29tcGlsZSBkZXBjb21wIGluc3RhbGwtc2ggXAotCW1pc3NpbmcgbWtpbnN0YWxsZGlycwotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLWFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCi0gY29uZmlndXJlLmxpbmVubyBjb25maWcuc3RhdHVzLmxpbmVubwotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSBkb2MvTWFrZWZpbGUKLUxJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKLUFSID0gYXIKLUFSRkxBR1MgPSBjcnUKLWxpYmFpZl9hX0FSID0gJChBUikgJChBUkZMQUdTKQotbGliYWlmX2FfTElCQUREID0KLWFtX2xpYmFpZl9hX09CSkVDVFMgPSBsaWJhaWZfYS1haWYuJChPQkpFWFQpIGxpYmFpZl9hLWNhbGMuJChPQkpFWFQpIFwKLQlsaWJhaWZfYS1mZHMuJChPQkpFWFQpIGxpYmFpZl9hLWFycmF5LiQoT0JKRVhUKSBcCi0JbGliYWlmX2EtY29udi4kKE9CSkVYVCkgbGliYWlmX2EtY21wLiQoT0JKRVhUKSBcCi0JbGliYWlmX2EtcHJpbnQuJChPQkpFWFQpIGxpYmFpZl9hLWVycm9yLiQoT0JKRVhUKSBcCi0JbGliYWlmX2EtaW8uJChPQkpFWFQpIGxpYmFpZl9hLXN0cnVjdC4kKE9CSkVYVCkgXAotCWxpYmFpZl9hLXV0aWwuJChPQkpFWFQpCi1saWJhaWZfYV9PQkpFQ1RTID0gJChhbV9saWJhaWZfYV9PQkpFQ1RTKQotUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKLWFtX3Rlc3RhaWZfT0JKRUNUUyA9IHRlc3RhaWYtdGVzdGFpZi4kKE9CSkVYVCkKLXRlc3RhaWZfT0JKRUNUUyA9ICQoYW1fdGVzdGFpZl9PQkpFQ1RTKQotdGVzdGFpZl9ERVBFTkRFTkNJRVMgPSBsaWJhaWYuYQotdGVzdGFpZl9MSU5LID0gJChDQ0xEKSAkKHRlc3RhaWZfQ0ZMQUdTKSAkKENGTEFHUykgJCh0ZXN0YWlmX0xERkxBR1MpIFwKLQkkKExERkxBR1MpIC1vICRACi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQAotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVNPVVJDRVMgPSAkKGxpYmFpZl9hX1NPVVJDRVMpICQodGVzdGFpZl9TT1VSQ0VTKQotRElTVF9TT1VSQ0VTID0gJChsaWJhaWZfYV9TT1VSQ0VTKSAkKHRlc3RhaWZfU09VUkNFUykKLUVUQUdTID0gZXRhZ3MKLUNUQUdTID0gY3RhZ3MKLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLWFtX19yZW1vdmVfZGlzdGRpciA9IFwKLSAgeyB0ZXN0ICEgLWQgJChkaXN0ZGlyKSBcCi0gICAgfHwgeyBmaW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC0yMDAgLWV4ZWMgY2htb2QgdSt3IHt9ICc7JyBcCi0gICAgICAgICAmJiBybSAtZnIgJChkaXN0ZGlyKTsgfTsgfQotRElTVF9BUkNISVZFUyA9ICQoZGlzdGRpcikudGFyLmd6Ci1HWklQX0VOViA9IC0tYmVzdAotZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAotZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BTVRBUiA9IEBBTVRBUkAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BV0sgPSBAQVdLQAotQ0MgPSBAQ0NACi1DQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUCA9IEBDUFBACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNZR1BBVEhfVyA9IEBDWUdQQVRIX1dACi1ERUZTID0gQERFRlNACi1ERVBESVIgPSBAREVQRElSQAotRUNIT19DID0gQEVDSE9fQ0AKLUVDSE9fTiA9IEBFQ0hPX05ACi1FQ0hPX1QgPSBARUNIT19UQAotRUdSRVAgPSBARUdSRVBACi1FWEVFWFQgPSBARVhFRVhUQAotR1JFUCA9IEBHUkVQQAotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJPQkpTID0gQExJQk9CSlNACi1MSUJTID0gQExJQlNACi1MVExJQk9CSlMgPSBATFRMSUJPQkpTQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0RJUl9QID0gQE1LRElSX1BACi1PQkpFWFQgPSBAT0JKRVhUQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACi1QQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAotUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACi1QQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAotUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKLVBBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAotUkFOTElCID0gQFJBTkxJQkAKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TVFJJUCA9IEBTVFJJUEAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVhNTFRPID0gQFhNTFRPQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKLWFtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACi1hbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAotYW1fX3RhciA9IEBhbV9fdGFyQAotYW1fX3VudGFyID0gQGFtX191bnRhckAKLWJpbmRpciA9IEBiaW5kaXJACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkZGlyID0gQGJ1aWxkZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACi1kb2NkaXIgPSBAZG9jZGlyQAotZHZpZGlyID0gQGR2aWRpckAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmFpZi5hCi1saWJhaWZfYV9TT1VSQ0VTID0gYWlmLmMgXAotCQkJCQkJCWNhbGMuYyBcCi0JCQkJCQkJZmRzLmMgXAotCQkJCQkJCWFycmF5LmMgXAotCQkJCQkJCWNvbnYuYyBcCi0JCQkJCQkJY21wLmMgXAotCQkJCQkJCXByaW50LmMgXAotCQkJCQkJCWVycm9yLmMgXAotCQkJCQkJCWlvLmMgXAotCQkJCQkJCXN0cnVjdC5jIFwKLQkJCQkJCQl1dGlsLmMgXAotCQkJCQkJCWFpZi54Ci0KLWxpYmFpZl9hX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAKLXRlc3RhaWZfU09VUkNFUyA9IHRlc3RhaWYuYwotdGVzdGFpZl9DRkxBR1MgPSAtSS4gJChBTV9DRkxBR1MpIC1nCi10ZXN0YWlmX0xERkxBR1MgPSAtZwotdGVzdGFpZl9MREFERCA9IGxpYmFpZi5hCi1hbGw6IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLWFtCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLm9iagotYW0tLXJlZnJlc2g6Ci0JQDoKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAnOyBcCi0JICAgICAgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBcCi0JCSYmIGV4aXQgMDsgXAotCSAgICAgIGV4aXQgMTs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIE1ha2VmaWxlJzsgXAotCWNkICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1nbnUgIE1ha2VmaWxlCi0uUFJFQ0lPVVM6IE1ha2VmaWxlCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQGNhc2UgJyQ/JyBpbiBcCi0JICAqY29uZmlnLnN0YXR1cyopIFwKLQkgICAgZWNobyAnICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyc7IFwKLQkgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzOzsgXAotCSAgKikgXAotCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLSQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCi0KLWNvbmZpZy5oOiBzdGFtcC1oMQotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCSAgcm0gLWYgc3RhbXAtaDE7IFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHN0YW1wLWgxOyBcCi0JZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotJChzcmNkaXIpL2NvbmZpZy5oLmluOiAgJChhbV9fY29uZmlndXJlX2RlcHMpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCXJtIC1mIHN0YW1wLWgxCi0JdG91Y2ggJEAKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmggc3RhbXAtaDEKLWRvYy9NYWtlZmlsZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS9kb2MvTWFrZWZpbGUuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACi0KLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQotbGliYWlmLmE6ICQobGliYWlmX2FfT0JKRUNUUykgJChsaWJhaWZfYV9ERVBFTkRFTkNJRVMpIAotCS1ybSAtZiBsaWJhaWYuYQotCSQobGliYWlmX2FfQVIpIGxpYmFpZi5hICQobGliYWlmX2FfT0JKRUNUUykgJChsaWJhaWZfYV9MSUJBREQpCi0JJChSQU5MSUIpIGxpYmFpZi5hCi0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotdGVzdGFpZiQoRVhFRVhUKTogJCh0ZXN0YWlmX09CSkVDVFMpICQodGVzdGFpZl9ERVBFTkRFTkNJRVMpIAotCUBybSAtZiB0ZXN0YWlmJChFWEVFWFQpCi0JJCh0ZXN0YWlmX0xJTkspICQodGVzdGFpZl9PQkpFQ1RTKSAkKHRlc3RhaWZfTERBREQpICQoTElCUykKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmFpZl9hLWFpZi5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliYWlmX2EtYXJyYXkuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmFpZl9hLWNhbGMuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmFpZl9hLWNtcC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliYWlmX2EtY29udi5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliYWlmX2EtZXJyb3IuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmFpZl9hLWZkcy5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliYWlmX2EtaW8uUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmFpZl9hLXByaW50LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJhaWZfYS1zdHJ1Y3QuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmFpZl9hLXV0aWwuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Rlc3RhaWYtdGVzdGFpZi5Qb0BhbV9fcXVvdGVACi0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi1saWJhaWZfYS1haWYubzogYWlmLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS1haWYubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2EtYWlmLlRwbyAtYyAtbyBsaWJhaWZfYS1haWYubyBgdGVzdCAtZiAnYWlmLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFpZi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliYWlmX2EtYWlmLlRwbyAkKERFUERJUikvbGliYWlmX2EtYWlmLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhaWYuYycgb2JqZWN0PSdsaWJhaWZfYS1haWYubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtYWlmLm8gYHRlc3QgLWYgJ2FpZi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhaWYuYwotCi1saWJhaWZfYS1haWYub2JqOiBhaWYuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmFpZl9hLWFpZi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWFpZi5UcG8gLWMgLW8gbGliYWlmX2EtYWlmLm9iaiBgaWYgdGVzdCAtZiAnYWlmLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWlmLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FpZi5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliYWlmX2EtYWlmLlRwbyAkKERFUERJUikvbGliYWlmX2EtYWlmLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhaWYuYycgb2JqZWN0PSdsaWJhaWZfYS1haWYub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1haWYub2JqIGBpZiB0ZXN0IC1mICdhaWYuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhaWYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYWlmLmMnOyBmaWAKLQotbGliYWlmX2EtY2FsYy5vOiBjYWxjLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS1jYWxjLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWNhbGMuVHBvIC1jIC1vIGxpYmFpZl9hLWNhbGMubyBgdGVzdCAtZiAnY2FsYy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjYWxjLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1jYWxjLlRwbyAkKERFUERJUikvbGliYWlmX2EtY2FsYy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2FsYy5jJyBvYmplY3Q9J2xpYmFpZl9hLWNhbGMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtY2FsYy5vIGB0ZXN0IC1mICdjYWxjLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNhbGMuYwotCi1saWJhaWZfYS1jYWxjLm9iajogY2FsYy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtY2FsYy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWNhbGMuVHBvIC1jIC1vIGxpYmFpZl9hLWNhbGMub2JqIGBpZiB0ZXN0IC1mICdjYWxjLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2FsYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jYWxjLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1jYWxjLlRwbyAkKERFUERJUikvbGliYWlmX2EtY2FsYy5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2FsYy5jJyBvYmplY3Q9J2xpYmFpZl9hLWNhbGMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1jYWxjLm9iaiBgaWYgdGVzdCAtZiAnY2FsYy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NhbGMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2FsYy5jJzsgZmlgCi0KLWxpYmFpZl9hLWZkcy5vOiBmZHMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmFpZl9hLWZkcy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJhaWZfYS1mZHMuVHBvIC1jIC1vIGxpYmFpZl9hLWZkcy5vIGB0ZXN0IC1mICdmZHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZmRzLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1mZHMuVHBvICQoREVQRElSKS9saWJhaWZfYS1mZHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Zkcy5jJyBvYmplY3Q9J2xpYmFpZl9hLWZkcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1mZHMubyBgdGVzdCAtZiAnZmRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZkcy5jCi0KLWxpYmFpZl9hLWZkcy5vYmo6IGZkcy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtZmRzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2EtZmRzLlRwbyAtYyAtbyBsaWJhaWZfYS1mZHMub2JqIGBpZiB0ZXN0IC1mICdmZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmZHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZmRzLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1mZHMuVHBvICQoREVQRElSKS9saWJhaWZfYS1mZHMuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Zkcy5jJyBvYmplY3Q9J2xpYmFpZl9hLWZkcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmFpZl9hLWZkcy5vYmogYGlmIHRlc3QgLWYgJ2Zkcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Zkcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mZHMuYyc7IGZpYAotCi1saWJhaWZfYS1hcnJheS5vOiBhcnJheS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtYXJyYXkubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2EtYXJyYXkuVHBvIC1jIC1vIGxpYmFpZl9hLWFycmF5Lm8gYHRlc3QgLWYgJ2FycmF5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFycmF5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1hcnJheS5UcG8gJChERVBESVIpL2xpYmFpZl9hLWFycmF5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhcnJheS5jJyBvYmplY3Q9J2xpYmFpZl9hLWFycmF5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmFpZl9hLWFycmF5Lm8gYHRlc3QgLWYgJ2FycmF5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFycmF5LmMKLQotbGliYWlmX2EtYXJyYXkub2JqOiBhcnJheS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtYXJyYXkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJhaWZfYS1hcnJheS5UcG8gLWMgLW8gbGliYWlmX2EtYXJyYXkub2JqIGBpZiB0ZXN0IC1mICdhcnJheS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FycmF5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FycmF5LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1hcnJheS5UcG8gJChERVBESVIpL2xpYmFpZl9hLWFycmF5LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhcnJheS5jJyBvYmplY3Q9J2xpYmFpZl9hLWFycmF5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtYXJyYXkub2JqIGBpZiB0ZXN0IC1mICdhcnJheS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FycmF5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FycmF5LmMnOyBmaWAKLQotbGliYWlmX2EtY29udi5vOiBjb252LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS1jb252Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWNvbnYuVHBvIC1jIC1vIGxpYmFpZl9hLWNvbnYubyBgdGVzdCAtZiAnY29udi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb252LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1jb252LlRwbyAkKERFUERJUikvbGliYWlmX2EtY29udi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udi5jJyBvYmplY3Q9J2xpYmFpZl9hLWNvbnYubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtY29udi5vIGB0ZXN0IC1mICdjb252LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnYuYwotCi1saWJhaWZfYS1jb252Lm9iajogY29udi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtY29udi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWNvbnYuVHBvIC1jIC1vIGxpYmFpZl9hLWNvbnYub2JqIGBpZiB0ZXN0IC1mICdjb252LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb252LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1jb252LlRwbyAkKERFUERJUikvbGliYWlmX2EtY29udi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udi5jJyBvYmplY3Q9J2xpYmFpZl9hLWNvbnYub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1jb252Lm9iaiBgaWYgdGVzdCAtZiAnY29udi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udi5jJzsgZmlgCi0KLWxpYmFpZl9hLWNtcC5vOiBjbXAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmFpZl9hLWNtcC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJhaWZfYS1jbXAuVHBvIC1jIC1vIGxpYmFpZl9hLWNtcC5vIGB0ZXN0IC1mICdjbXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY21wLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1jbXAuVHBvICQoREVQRElSKS9saWJhaWZfYS1jbXAuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NtcC5jJyBvYmplY3Q9J2xpYmFpZl9hLWNtcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1jbXAubyBgdGVzdCAtZiAnY21wLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNtcC5jCi0KLWxpYmFpZl9hLWNtcC5vYmo6IGNtcC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtY21wLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2EtY21wLlRwbyAtYyAtbyBsaWJhaWZfYS1jbXAub2JqIGBpZiB0ZXN0IC1mICdjbXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY21wLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1jbXAuVHBvICQoREVQRElSKS9saWJhaWZfYS1jbXAuUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NtcC5jJyBvYmplY3Q9J2xpYmFpZl9hLWNtcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmFpZl9hLWNtcC5vYmogYGlmIHRlc3QgLWYgJ2NtcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NtcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jbXAuYyc7IGZpYAotCi1saWJhaWZfYS1wcmludC5vOiBwcmludC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtcHJpbnQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2EtcHJpbnQuVHBvIC1jIC1vIGxpYmFpZl9hLXByaW50Lm8gYHRlc3QgLWYgJ3ByaW50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHByaW50LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1wcmludC5UcG8gJChERVBESVIpL2xpYmFpZl9hLXByaW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwcmludC5jJyBvYmplY3Q9J2xpYmFpZl9hLXByaW50Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmFpZl9hLXByaW50Lm8gYHRlc3QgLWYgJ3ByaW50LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHByaW50LmMKLQotbGliYWlmX2EtcHJpbnQub2JqOiBwcmludC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtcHJpbnQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJhaWZfYS1wcmludC5UcG8gLWMgLW8gbGliYWlmX2EtcHJpbnQub2JqIGBpZiB0ZXN0IC1mICdwcmludC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ByaW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3ByaW50LmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS1wcmludC5UcG8gJChERVBESVIpL2xpYmFpZl9hLXByaW50LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwcmludC5jJyBvYmplY3Q9J2xpYmFpZl9hLXByaW50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtcHJpbnQub2JqIGBpZiB0ZXN0IC1mICdwcmludC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ByaW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3ByaW50LmMnOyBmaWAKLQotbGliYWlmX2EtZXJyb3IubzogZXJyb3IuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmFpZl9hLWVycm9yLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWVycm9yLlRwbyAtYyAtbyBsaWJhaWZfYS1lcnJvci5vIGB0ZXN0IC1mICdlcnJvci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlcnJvci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliYWlmX2EtZXJyb3IuVHBvICQoREVQRElSKS9saWJhaWZfYS1lcnJvci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXJyb3IuYycgb2JqZWN0PSdsaWJhaWZfYS1lcnJvci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1lcnJvci5vIGB0ZXN0IC1mICdlcnJvci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlcnJvci5jCi0KLWxpYmFpZl9hLWVycm9yLm9iajogZXJyb3IuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmFpZl9hLWVycm9yLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2EtZXJyb3IuVHBvIC1jIC1vIGxpYmFpZl9hLWVycm9yLm9iaiBgaWYgdGVzdCAtZiAnZXJyb3IuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcnJvci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcnJvci5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliYWlmX2EtZXJyb3IuVHBvICQoREVQRElSKS9saWJhaWZfYS1lcnJvci5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXJyb3IuYycgb2JqZWN0PSdsaWJhaWZfYS1lcnJvci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmFpZl9hLWVycm9yLm9iaiBgaWYgdGVzdCAtZiAnZXJyb3IuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcnJvci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcnJvci5jJzsgZmlgCi0KLWxpYmFpZl9hLWlvLm86IGlvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS1pby5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJhaWZfYS1pby5UcG8gLWMgLW8gbGliYWlmX2EtaW8ubyBgdGVzdCAtZiAnaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgaW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmFpZl9hLWlvLlRwbyAkKERFUERJUikvbGliYWlmX2EtaW8uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2lvLmMnIG9iamVjdD0nbGliYWlmX2EtaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtaW8ubyBgdGVzdCAtZiAnaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgaW8uYwotCi1saWJhaWZfYS1pby5vYmo6IGlvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS1pby5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLWlvLlRwbyAtYyAtbyBsaWJhaWZfYS1pby5vYmogYGlmIHRlc3QgLWYgJ2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaW8uYyc7IGZpYAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYmFpZl9hLWlvLlRwbyAkKERFUERJUikvbGliYWlmX2EtaW8uUG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2lvLmMnIG9iamVjdD0nbGliYWlmX2EtaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1pby5vYmogYGlmIHRlc3QgLWYgJ2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaW8uYyc7IGZpYAotCi1saWJhaWZfYS1zdHJ1Y3Qubzogc3RydWN0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS1zdHJ1Y3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliYWlmX2Etc3RydWN0LlRwbyAtYyAtbyBsaWJhaWZfYS1zdHJ1Y3QubyBgdGVzdCAtZiAnc3RydWN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0cnVjdC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliYWlmX2Etc3RydWN0LlRwbyAkKERFUERJUikvbGliYWlmX2Etc3RydWN0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdHJ1Y3QuYycgb2JqZWN0PSdsaWJhaWZfYS1zdHJ1Y3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2Etc3RydWN0Lm8gYHRlc3QgLWYgJ3N0cnVjdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdHJ1Y3QuYwotCi1saWJhaWZfYS1zdHJ1Y3Qub2JqOiBzdHJ1Y3QuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmFpZl9hLXN0cnVjdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLXN0cnVjdC5UcG8gLWMgLW8gbGliYWlmX2Etc3RydWN0Lm9iaiBgaWYgdGVzdCAtZiAnc3RydWN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RydWN0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0cnVjdC5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGliYWlmX2Etc3RydWN0LlRwbyAkKERFUERJUikvbGliYWlmX2Etc3RydWN0LlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdHJ1Y3QuYycgb2JqZWN0PSdsaWJhaWZfYS1zdHJ1Y3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS1zdHJ1Y3Qub2JqIGBpZiB0ZXN0IC1mICdzdHJ1Y3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdHJ1Y3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RydWN0LmMnOyBmaWAKLQotbGliYWlmX2EtdXRpbC5vOiB1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmFpZl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJhaWZfYS11dGlsLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLXV0aWwuVHBvIC1jIC1vIGxpYmFpZl9hLXV0aWwubyBgdGVzdCAtZiAndXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS11dGlsLlRwbyAkKERFUERJUikvbGliYWlmX2EtdXRpbC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbC5jJyBvYmplY3Q9J2xpYmFpZl9hLXV0aWwubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliYWlmX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliYWlmX2EtdXRpbC5vIGB0ZXN0IC1mICd1dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWwuYwotCi1saWJhaWZfYS11dGlsLm9iajogdXRpbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliYWlmX2EtdXRpbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmFpZl9hLXV0aWwuVHBvIC1jIC1vIGxpYmFpZl9hLXV0aWwub2JqIGBpZiB0ZXN0IC1mICd1dGlsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXRpbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlsLmMnOyBmaWAKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJhaWZfYS11dGlsLlRwbyAkKERFUERJUikvbGliYWlmX2EtdXRpbC5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbC5jJyBvYmplY3Q9J2xpYmFpZl9hLXV0aWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJhaWZfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJhaWZfYS11dGlsLm9iaiBgaWYgdGVzdCAtZiAndXRpbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdXRpbC5jJzsgZmlgCi0KLXRlc3RhaWYtdGVzdGFpZi5vOiB0ZXN0YWlmLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RhaWZfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHRlc3RhaWYtdGVzdGFpZi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS90ZXN0YWlmLXRlc3RhaWYuVHBvIC1jIC1vIHRlc3RhaWYtdGVzdGFpZi5vIGB0ZXN0IC1mICd0ZXN0YWlmLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3RhaWYuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL3Rlc3RhaWYtdGVzdGFpZi5UcG8gJChERVBESVIpL3Rlc3RhaWYtdGVzdGFpZi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVzdGFpZi5jJyBvYmplY3Q9J3Rlc3RhaWYtdGVzdGFpZi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0YWlmX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHRlc3RhaWYtdGVzdGFpZi5vIGB0ZXN0IC1mICd0ZXN0YWlmLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3RhaWYuYwotCi10ZXN0YWlmLXRlc3RhaWYub2JqOiB0ZXN0YWlmLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RhaWZfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHRlc3RhaWYtdGVzdGFpZi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3RhaWYtdGVzdGFpZi5UcG8gLWMgLW8gdGVzdGFpZi10ZXN0YWlmLm9iaiBgaWYgdGVzdCAtZiAndGVzdGFpZi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3RhaWYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVzdGFpZi5jJzsgZmlgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvdGVzdGFpZi10ZXN0YWlmLlRwbyAkKERFUERJUikvdGVzdGFpZi10ZXN0YWlmLlBvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0YWlmLmMnIG9iamVjdD0ndGVzdGFpZi10ZXN0YWlmLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdGFpZl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0ZXN0YWlmLXRlc3RhaWYub2JqIGBpZiB0ZXN0IC1mICd0ZXN0YWlmLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdGFpZi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0YWlmLmMnOyBmaWAKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCW1raWQgLWZJRCAkJHVuaXF1ZQotdGFnczogVEFHUwotCi1UQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQotY3RhZ3M6IENUQUdTCi1DVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCi0JICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCi0JICAgICAkJHRhZ3MgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmIGNkICQodG9wX3NyY2RpcikgXAotCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JdGVzdCAtZCAkKGRpc3RkaXIpIHx8IG1rZGlyICQoZGlzdGRpcikKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCi0JfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKLWRpc3QtZ3ppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtYnppcDI6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXRhclo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1zaGFyOiBkaXN0ZGlyCi0Jc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC16aXA6IGRpc3RkaXIKLQktcm0gLWYgJChkaXN0ZGlyKS56aXAKLQl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKLQkqLnRhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmJ6MiopIFwKLQkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAotCSouemlwKikgXAotCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCi0JZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS9faW5zdAotCWNobW9kIGEtdyAkKGRpc3RkaXIpCi0JZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCi0JICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKLQkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAotCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgJiYgKHsgXAotCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCi0JICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKLQkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKLQkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKLQkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKLQkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKLQkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JwotZGlzdHVuaW5zdGFsbGNoZWNrOgotCUBjZCAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpIFwKLQkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKLQkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAotCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAotCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAotCSAgICAgICAgZmkgOyBcCi0JICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICAgZXhpdCAxOyB9ID4mMgotZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgotCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAotCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKLQkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICBleGl0IDE7IH0gPiYyCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoUFJPR1JBTVMpIGNvbmZpZy5oCi1pbnN0YWxsZGlyczoKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCi0JICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQltb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotCi1pbnN0YWxsLW1hbjoKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOgotCi0uTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBcCi0JY2xlYW4tZ2VuZXJpYyBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgXAotCWRpc3QgZGlzdC1hbGwgZGlzdC1iemlwMiBkaXN0LWd6aXAgZGlzdC1zaGFyIGRpc3QtdGFyWiBcCi0JZGlzdC16aXAgZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW5jaGVjayBcCi0JZGlzdGRpciBkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBcCi0JaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBcCi0JaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBcCi0JaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKLQlpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIFwKLQlpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBcCi0JaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIFwKLQlwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvTkVXUyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvTkVXUworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9SRUFETUUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2Q0MDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGlzIGlzIGEgbGlicmFyeSBmb3IgbWFuYWdpbmcgZGF0YSBpbiBhbiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgZm9ybWF0LiBJdCBpcyBpbmNsdWRlZAotYXMgcGFydCBvZiB0aGUgU0RNIGRlYnVnZ2VyLgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWNsb2NhbC5tNCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDFmMTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0jIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMCAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotbTRfaWYobTRfUEFDS0FHRV9WRVJTSU9OLCBbMi42MV0sLAotW200X2ZhdGFsKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42MS4KLVlvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGF0LAoteW91IHNob3VsZCByZWdlbmVyYXRlIHRoZSBidWlsZCBzeXN0ZW0gZW50aXJlbHkuXSwgWzYzXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCi0jIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgotIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKLUFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKLVthbV9fYXBpX3ZlcnNpb249JzEuMTAnCi1kbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCi1kbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgotbTRfaWYoWyQxXSwgWzEuMTBdLCBbXSwKLSAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKLV0pCi0KLSMgX0FNX0FVVE9DT05GX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgYWNsb2NhbCB0cmFjZXMgdGhpcyBtYWNybyB0byBmaW5kIHRoZSBBdXRvY29uZiB2ZXJzaW9uLgotIyBUaGlzIGlzIGEgcHJpdmF0ZSBtYWNybyB0b28uICBVc2luZyBtNF9kZWZpbmUgc2ltcGxpZmllcwotIyB0aGUgbG9naWMgaW4gYWNsb2NhbCwgd2hpY2ggY2FuIHNpbXBseSBpZ25vcmUgdGhpcyBkZWZpbml0aW9uLgotbTRfZGVmaW5lKFtfQU1fQVVUT0NPTkZfVkVSU0lPTl0sIFtdKQotCi0jIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gdGhleSBjYW4gYmUgdHJhY2VkLgotIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFDX0lOSVRfQVVUT01BS0UuCi1BQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCi1bQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMF0pZG5sCi1fQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9QQUNLQUdFX1ZFUlNJT04pXSkKLQotIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCi0jICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCi0jIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCi0jCi0jIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKLSMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKLSMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCi0jIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQotIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAotIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKLSMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KLSMKLSMgJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCi0jICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCi0jICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKLSMKLSMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKLSMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKLSMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91Ci0jIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCi0jCi0jIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAotIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKLSMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKLSMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCi0jICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCi0jIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCi0jIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KLSMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgotIwotIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KLSMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQotIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCi0KLUFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCi1bZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KLUFDX1BSRVJFUShbMi41MF0pZG5sCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1dKQotCi0jIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDgKLQotIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi1BQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAotW0FDX1BSRVJFUSgyLjUyKWRubAotIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCi0JWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAotQUNfU1VCU1QoWyQxX1RSVUVdKWRubAotQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maQotQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKLVtpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQotZmldKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDkKLQotIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKLSMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCi0jIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncwotIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCi0jIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KLQotCi0jIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCi0jIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCi0jIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCi0jCi0jIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcwotIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgotIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCi0jIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgotQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAotQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAotQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKLUFDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCi0KLWlmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAotICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKLVtpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKLSAgZmkKLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgY2FzZSAkZGVwbW9kZSBpbgotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLV0pCi1BQ19TVUJTVChbJDFERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKLUFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcCQxXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCi1dKQotCi0KLSMgQU1fU0VUX0RFUERJUgotIyAtLS0tLS0tLS0tLS0tCi0jIENob29zZSBhIGRpcmVjdG9yeSBuYW1lIGZvciBkZXBlbmRlbmN5IGZpbGVzLgotIyBUaGlzIG1hY3JvIGlzIEFDX1JFUVVJUkVkIGluIF9BTV9ERVBFTkRFTkNJRVMKLUFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAotXSkKLQotCi0jIEFNX0RFUF9UUkFDSwotIyAtLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAotW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKLVsgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLUFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQotQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV9BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCi1dKQotCi0jIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSNzZXJpYWwgMwotCi0jIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW2ZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbwotICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAotICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgotICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQotICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KLSAgaWYgc2VkIDEwcSAiJG1mIiB8IGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKLSAgZWxzZQotICAgIGNvbnRpbnVlCi0gIGZpCi0gICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICMgZXhwYW5zaW9uLgotICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLSAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCi0gICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQotICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gIGRvbmUKLWRvbmUKLV0pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLQotCi0jIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KLSMKLSMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZwotIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCi0jIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCi1BQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAotICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLSAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQotXSkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKLSMgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAxMgotCi0jIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgotIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCi0jIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKLSMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQotIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KLSMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KLSMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCi0jIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCi0jIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKLSMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KLUFDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKLVtBQ19QUkVSRVEoWzIuNjBdKWRubAotZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKLWRubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgotbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCi1BQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAotICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLSAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi0gIGZpCi1maQotCi0jIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKLWlmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCi0gIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKLSAgZWxzZQotICAgIENZR1BBVEhfVz1lY2hvCi0gIGZpCi1maQotQUNfU1VCU1QoW0NZR1BBVEhfV10pCi0KLSMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KLWRubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgotbTRfaWZ2YWwoWyQyXSwKLVttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCi1bX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCi1kbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KLW00X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAotICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKLQotX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCi1bQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKLUFNX1BST0dfSU5TVEFMTF9TSAotQU1fUFJPR19JTlNUQUxMX1NUUklQCi1BQ19SRVFVSVJFKFtBTV9QUk9HX01LRElSX1BdKWRubAotIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KLSMgc29tZSBwbGF0Zm9ybXMuCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1fQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKLSAgICAgICAgICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCi0JICAgICAgCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCi1fQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKLVtBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKENDKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCi0gICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKLSAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19PQkpDXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSwKLSAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCi1dKQotXSkKLQotCi0jIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi0jIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotIyB0aGF0IGlzIGdlbmVyYXRlZC4gIFRoZSBzdGFtcCBmaWxlcyBhcmUgbnVtYmVyZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMuCi0KLSMgQXV0b2NvbmYgY2FsbHMgX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PSyAod2hlbiBkZWZpbmVkKSBpbiB0aGUKLSMgbG9vcCB3aGVyZSBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIGhlYWRlcnMsIHNvIHdlIGNhbiBnZW5lcmF0ZQotIyBvdXIgc3RhbXAgZmlsZXMgdGhlcmUuCi1BQ19ERUZVTihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sCi1bIyBDb21wdXRlICQxJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJDEgfCAkMToqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJDEiID5gQVNfRElSTkFNRShbJDFdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfSU5TVEFMTF9TSAotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lICRpbnN0YWxsX3NoLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotaW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIlwkKFNIRUxMKSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIn0KLUFDX1NVQlNUKGluc3RhbGxfc2gpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDIKLQotIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcwotIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCi1BQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKLVtybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKLQotIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDMKLQotIyBBTV9NQUtFX0lOQ0xVREUoKQotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgotQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCi1bYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIGRvbmUKLS5QSE9OWTogYW1fX2RvaXQKLUVORAotIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgotQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKLWFtX19pbmNsdWRlPSIjIgotYW1fX3F1b3RlPQotX2FtX3Jlc3VsdD1ub25lCi0jIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgotZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgotIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JwotIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgotIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAotIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKLSMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgotaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCi0gICBhbV9faW5jbHVkZT1pbmNsdWRlCi0gICBhbV9fcXVvdGU9Ci0gICBfYW1fcmVzdWx0PUdOVQotZmkKLSMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgotaWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgotICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgotICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgotICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgIGFtX19xdW90ZT0iXCIiCi0gICAgICBfYW1fcmVzdWx0PUJTRAotICAgZmkKLWZpCi1BQ19TVUJTVChbYW1fX2luY2x1ZGVdKQotQUNfU1VCU1QoW2FtX19xdW90ZV0pCi1BQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCi1ybSAtZiBjb25maW5jIGNvbmZtZgotXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNQotCi0jIEFNX1BST0dfQ0NfQ19PCi0jIC0tLS0tLS0tLS0tLS0tCi0jIExpa2UgQUNfUFJPR19DQ19DX08sIGJ1dCBjaGFuZ2VkIGZvciBhdXRvbWFrZS4KLUFDX0RFRlVOKFtBTV9QUk9HX0NDX0NfT10sCi1bQUNfUkVRVUlSRShbQUNfUFJPR19DQ19DX09dKWRubAotQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotQUNfUkVRVUlSRV9BVVhfRklMRShbY29tcGlsZV0pZG5sCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYWNfY2M9YGVjaG8gJFsyXSB8IHNlZCBbJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nXWAKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfY2NfJyR7YWNfY2N9X2Nfb2BcIiAhPSB5ZXMiOyB0aGVuCi0gICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgotICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KLSAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgotICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAotICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKLSAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKLWZpCi1kbmwgTWFrZSBzdXJlIEFDX1BST0dfQ0MgaXMgbmV2ZXIgY2FsbGVkIGFnYWluLCBvciBpdCB3aWxsIG92ZXJyaWRlIG91cgotZG5sIHNldHRpbmcgb2YgQ0MuCi1tNF9kZWZpbmUoW0FDX1BST0dfQ0NdLAotICAgICAgICAgIFttNF9mYXRhbChbQUNfUFJPR19DQyBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIEFNX1BST0dfQ0NfQ19PXSldKQotXSkKLQotIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1Ci0KLSMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCi1bQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKLSQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIEFNX01JU1NJTkdfSEFTX1JVTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgotIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCi1BQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSlkbmwKLXRlc3QgeCIke01JU1NJTkcrc2V0fSIgPSB4c2V0IHx8IE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgQUNfTVNHX1dBUk4oW2BtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKLWZpCi1dKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX01LRElSX1AKLSMgLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBgbWtkaXIgLXAnLgotQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCi1bQUNfUFJFUkVRKFsyLjYwXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCi1kbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCi1kbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLWRubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KLWRubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgotZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgotZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgotZG5sIE1LRElSX1ApLgotQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCi1jYXNlICRta2Rpcl9wIGluCi0gIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7Ci0gICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKLWVzYWMKLV0pCi0KLSMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDMKLQotIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKLVtbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQotCi0jIF9BTV9TRVRfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAotW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQotCi0jIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgotQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCi1bQUNfRk9SRUFDSChbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKLQotIyBfQU1fSUZfT1BUSU9OKE9QVElPTiwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXhlY3V0ZSBJRi1TRVQgaWYgT1BUSU9OIGlzIHNldCwgSUYtTk9ULVNFVCBvdGhlcndpc2UuCi1BQ19ERUZVTihbX0FNX0lGX09QVElPTl0sCi1bbTRfaWZzZXQoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIFskMl0sIFskM10pXSkKLQotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4gICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA0Ci0KLSMgQU1fU0FOSVRZX0NIRUNLCi0jIC0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGVgCi0gICBmaQotICAgcm0gLWYgY29uZnRlc3QuZmlsZQotICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKLSMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci0jIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCi0jIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgotIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCi0jIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKLSMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAotW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBfQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByZXZlbnQgQXV0b21ha2UgZnJvbSBvdXRwdXRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgotIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KLUFDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCi0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDIKLQotIyBfQU1fUFJPR19UQVIoRk9STUFUKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgotIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KLSMKLSMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKLSMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKLSMgJHRhcmRpci4KLSMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKLSMKLSMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAotIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgotIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgotQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCi1bIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotQU1fTUlTU0lOR19QUk9HKFtBTVRBUl0sIFt0YXJdKQotbTRfaWYoWyQxXSwgW3Y3XSwKLSAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCi0gICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCi0gICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQotQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQotIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgotX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKLV9hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9Ci0jIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKLSMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KLWZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCi1kbwotICBjYXNlICRfYW1fdG9vbCBpbgotICBnbnV0YXIpCi0gICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOwotICAgIGRvCi0gICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhawotICAgIGRvbmUKLSAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgotICAgIDs7Ci0gIHBsYWludGFyKQotICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCi0gICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KLSAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCi0gICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSd0YXIgeGYgLScKLSAgICA7OwotICBwYXgpCi0gICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSdwYXggLXInCi0gICAgOzsKLSAgY3BpbykKLSAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKLSAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCi0gICAgOzsKLSAgbm9uZSkKLSAgICBhbV9fdGFyPWZhbHNlCi0gICAgYW1fX3Rhcl89ZmFsc2UKLSAgICBhbV9fdW50YXI9ZmFsc2UKLSAgICA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKLSAgIyBhbmQgYW1fX3VudGFyIHNldC4KLSAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCi0KLSAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKLSAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgotICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCi0gICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCi0gIGZpCi1kb25lCi1ybSAtcmYgY29uZnRlc3QuZGlyCi0KLUFDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKLUFDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKLUFDX1NVQlNUKFthbV9fdGFyXSkKLUFDX1NVQlNUKFthbV9fdW50YXJdKQotXSkgIyBfQU1fUFJPR19UQVIKLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWlmLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9haWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0M2RjNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9haWYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogR2VuZXJpYyBBSUYgcm91dGluZXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlCTxjb25maWcuaD4KLSNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCi0KLSNpbmNsdWRlCTxzdGRpby5oPgotCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZQk8c3RkbGliLmg+IC8qIGZvciBhdG9pKCkgKi8KLSNpbmNsdWRlCTxzdHJpbmcuaD4gLyogbWVtc2V0KCkgKi8KLSNlbmRpZiAvKiBTVERDX0hFQURFUlMgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZQk8aW8uaD4KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0jaW5jbHVkZQkiYWlmLmgiCi0jaW5jbHVkZQkiYWlmZXJyLmgiCi0jaW5jbHVkZQkiYWlmaW50LmgiCi0KLWNoYXIgKglfYWlmX3ZhbHVlc19zZWVuW01BWF9WQUxVRVNfU0VFTisxXTsKLWNoYXIgKglfYWlmX3R5cGVzX3NlZW5bTUFYX1RZUEVTX1NFRU4rMV07Ci0KLXN0YXRpYyBpbnQJX2FpZl9vcHRfY21wX2RlcHRoID0gMDsKLXN0YXRpYyBpbnQJX2FpZl9vcHRfY21wX21ldGhvZCA9IDA7Ci0KLWludAotQUlGU2V0T3B0aW9uKGFpZm9wdCBvcHQsIGludCBhcmcpCi17Ci0Jc3dpdGNoKCBvcHQgKQotCXsKLQljYXNlIEFJRk9QVF9DTVBfREVQVEg6Ci0JCV9haWZfb3B0X2NtcF9kZXB0aCA9IGFyZzsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk9QVF9DTVBfTUVUSE9EOgotCQlpZiAoIGFyZyAhPSBBSUZfQ01QX0JZX1BPU0lUSU9OICYmIGFyZyAhPSBBSUZfQ01QX0JZX05BTUUgKQotCQkJcmV0dXJuIC0xOwotCQlfYWlmX29wdF9jbXBfbWV0aG9kID0gYXJnOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotQUlGR2V0T3B0aW9uKGFpZm9wdCBvcHQpCi17Ci0Jc3dpdGNoKCBvcHQgKQotCXsKLQljYXNlIEFJRk9QVF9DTVBfREVQVEg6Ci0JCXJldHVybiBfYWlmX29wdF9jbXBfZGVwdGg7Ci0KLQljYXNlIEFJRk9QVF9DTVBfTUVUSE9EOgotCQlyZXR1cm4gX2FpZl9vcHRfY21wX21ldGhvZDsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLXZvaWQKLUFJRkZyZWUoQUlGICphKQotewotCWlmICggQUlGX0ZPUk1BVChhKSAhPSBOVUxMICkKLQkJX2FpZl9mcmVlKEFJRl9GT1JNQVQoYSkpOwotCi0JaWYgKCBBSUZfREFUQShhKSAhPSBOVUxMICkKLQkJX2FpZl9mcmVlKEFJRl9EQVRBKGEpKTsKLQotCV9haWZfZnJlZShhKTsKLX0KLQotaW50Ci1BSUZUeXBlKEFJRiAqYSkKLXsKLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiBBSUZfSU5WQUxJRDsKLQl9Ci0KLQlyZXR1cm4gRkRTVHlwZShBSUZfRk9STUFUKGEpKTsKLX0KLQotaW50Ci1BSUZCYXNlVHlwZShBSUYgKmEpCi17Ci0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gQUlGX0lOVkFMSUQ7Ci0JfQotCi0JcmV0dXJuIEZEU1R5cGUoRkRTQmFzZVR5cGUoQUlGX0ZPUk1BVChhKSkpOwotfQotCi1sb25nCi1BSUZUeXBlU2l6ZShBSUYgKmEpCi17Ci0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIEFJRl9MRU4oYSk7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBuZXcgQUlGIG9iamVjdC4gMCBmb3IgZWl0aGVyIGxlbiBtZWFucwotICogcHJvdmlkZWQgbGF0ZXIuCi0gKi8KLUFJRiAqCi1OZXdBSUYoaW50IGZtdF9sZW4sIGludCBkYXRhX2xlbikKLXsKLQlBSUYgKglhOwotCi0JYSA9IChBSUYgKilfYWlmX2FsbG9jKHNpemVvZihBSUYpKTsKLQotCUFJRl9GT1JNQVQoYSkgPSAoY2hhciAqKU5VTEw7Ci0JQUlGX0RBVEEoYSkgPSAoY2hhciAqKU5VTEw7Ci0KLQlpZiAoIGZtdF9sZW4gPiAwICkKLQl7Ci0JCUFJRl9GT1JNQVQoYSkgPSAoY2hhciAqKV9haWZfYWxsb2MoZm10X2xlbik7Ci0JCW1lbXNldChBSUZfRk9STUFUKGEpLCAwLCBmbXRfbGVuKTsKLQl9Ci0KLQlpZiAoIGRhdGFfbGVuID4gMCApCi0JewotCQlBSUZfREFUQShhKSA9IChjaGFyICopX2FpZl9hbGxvYyhkYXRhX2xlbik7Ci0JCW1lbXNldChBSUZfREFUQShhKSwgMCwgZGF0YV9sZW4pOwotCX0KLQotCUFJRl9MRU4oYSkgPSBkYXRhX2xlbjsKLQotCXJldHVybiBhOwotfQotCi1BSUYgKgotTWFrZUFJRihjaGFyICpmbXQsIGNoYXIgKmRhdGEpCi17Ci0JQUlGICoJYTsKLQotCWlmICggZm10ID09IE5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlpZiAoIGRhdGEgPT0gTlVMTCApCi0JewotCQlhID0gTmV3QUlGKDAsIEZEU1R5cGVTaXplKGZtdCkpOwotCQlBSUZfRk9STUFUKGEpID0gZm10OwotCX0KLQllbHNlCi0JewotCQljaGFyICogdG1wMTsKLQkJY2hhciAqIHRtcDI7Ci0JCXRtcDEgPSBmbXQ7Ci0JCXRtcDIgPSBkYXRhOwotCQlfZmRzX3NraXBfZGF0YSgmdG1wMSwgJnRtcDIpOwotCQlhID0gTmV3QUlGKDAsIDApOwotCQlBSUZfRk9STUFUKGEpID0gZm10OwotCQlBSUZfTEVOKGEpID0gdG1wMi1kYXRhOwotCQlBSUZfREFUQShhKSA9IGRhdGE7Ci0JfQotCi0JcmV0dXJuIGE7Ci19Ci0KLUFJRiAqCi1Db3B5QUlGKEFJRiAqYSkKLXsKLQlpbnQJbDE7Ci0JQUlGICoJYTE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlsMSA9IHN0cmxlbihBSUZfRk9STUFUKGEpKSArIDE7Ci0KLQlhMSA9IE5ld0FJRihsMSwgQUlGX0xFTihhKSk7Ci0KLQltZW1jcHkoQUlGX0ZPUk1BVChhMSksIEFJRl9GT1JNQVQoYSksIGwxKTsKLQotCWlmICggQUlGX0xFTihhKSA+IDAgKQotCQltZW1jcHkoQUlGX0RBVEEoYTEpLCBBSUZfREFUQShhKSwgQUlGX0xFTihhKSk7Ci0KLQlyZXR1cm4gYTE7Ci19Ci0KLS8qCi0gKiBDb3B5IGRhdGEgaW50byBBSUYgc3RydWN0dXJlLgotICovCi12b2lkCi1BSUZTZXREYXRhKEFJRiAqYSwgY2hhciAqZGF0YSwgaW50IHNpemUpCi17Ci0JaW50CWxlbjsKLQotCWxlbiA9IHNpemUgPiAoaW50KUFJRl9MRU4oYSkgPyBzaXplIDogKGludClBSUZfTEVOKGEpOwotCi0JbWVtY3B5KEFJRl9EQVRBKGEpLCBkYXRhLCBsZW4pOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9haWYuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FpZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWYzOGMxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FpZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBNYXN0ZXIgaGVhZGVyIGZpbGUgZm9yIHRoZSBBSUYgbGlicmFyeS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jaWZuZGVmIF9BSUZfSAotI2RlZmluZSBfQUlGX0gKLQotI2lmZGVmIFdJTk5UCi0jZGVmaW5lIFdJTkRPV1NOVAotI2VuZGlmIC8qIFdJTk5UICovCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEUFJJTlQocykgcwotI2Vsc2UgLyogREVCVUcgKi8KLSNkZWZpbmUgRFBSSU5UKHMpIC8qKi8KLSNlbmRpZiAvKkRFQlVHICovCi0KLS8qCi0gKiBJbmNsdWRlIGZvciBNSU4gJiBNQVgKLSAqLwotI2lmIGRlZmluZWQoc3VuKQotI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KLSNlbGlmIGRlZmluZWQoX19zZ2kpIHx8IGRlZmluZWQoX19saW51eCkKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbHNlCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSwgYikgKChhKSA8IChiKSA/IChiKSA6IChhKSkKLSNlbmRpZiAvKiBNQVggKi8KLQotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPiAoYikgPyAoYikgOiAoYSkpCi0jZW5kaWYgLyogTUlOICovCi0jZW5kaWYKLQotI2lmbmRlZiBBSUZMT05HRVNUCi0jaWZkZWYgQ0NfSEFTX0xPTkdfTE9ORwotdHlwZWRlZiBsb25nIGxvbmcgaW50IEFJRkxPTkdFU1Q7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGludCBBSUZMT05HRVNUOwotI2VuZGlmIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLSNlbmRpZiAvKiAhTE9OR0VTVCAqLwotCi0jaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotdHlwZWRlZiBsb25nIGRvdWJsZSBBSUZET1VCTEVTVDsKLSNlbHNlCi10eXBlZGVmIGRvdWJsZSBBSUZET1VCTEVTVDsKLSNlbmRpZiAvKiBIQVZFX0xPTkdfRE9VQkxFICovCi0KLSNpZmRlZiBXSU4zMgotI2RlZmluZSBSX09LCTQKLSNkZWZpbmUgV19PSwkyCi0jZGVmaW5lIFhfT0sJMQotI2RlZmluZSBGX09LCTAKLSNkZWZpbmUgQ0xPU0VfU09DS0VUKHMpCWNsb3Nlc29ja2V0KHMpCi0jZGVmaW5lIHNucHJpbnRmCV9zbnByaW50ZgotI2RlZmluZSBhbGxvY2EJCV9hbGxvY2EKLSNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JMjU1Ci0jZGVmaW5lIE1BWFBBVEhMRU4JMTAyNAotI2Vsc2UgLyogV0lOMzIgKi8KLSNkZWZpbmUgU09DS0VUCQlpbnQKLSNkZWZpbmUgQ0xPU0VfU09DS0VUKHMpCSh2b2lkKWNsb3NlKHMpCi0jZGVmaW5lIElOVkFMSURfU09DS0VUCS0xCi0jZGVmaW5lIFNPQ0tFVF9FUlJPUgktMQotI2VuZGlmIC8qIFdJTjMyICovCi0KLSNkZWZpbmUgQUlGX0lOVkFMSUQJCTAKLSNkZWZpbmUgQUlGX0lOVEVHRVIJCTEKLSNkZWZpbmUgQUlGX0ZMT0FUSU5HCQkyCi0jZGVmaW5lIEFJRl9QT0lOVEVSCQkzCi0jZGVmaW5lIEFJRl9BUlJBWQkJNAotI2RlZmluZSBBSUZfU1RSVUNUCQk1Ci0jZGVmaW5lIEFJRl9VTklPTgkJNgotI2RlZmluZSBBSUZfRlVOQ1RJT04JCTcKLSNkZWZpbmUgQUlGX1ZPSUQJCTgKLSNkZWZpbmUgQUlGX1JFR0lPTgkJOQotI2RlZmluZSBBSUZfTkFNRQkJMTAKLSNkZWZpbmUgQUlGX1JFRkVSRU5DRQkJMTEKLSNkZWZpbmUgQUlGX1NUUklORwkJMTIKLSNkZWZpbmUgQUlGX0NIQVJBQ1RFUgkJMTMKLSNkZWZpbmUgQUlGX1JBTkdFCQkxNAotI2RlZmluZSBBSUZfRU5VTQkJMTUKLSNkZWZpbmUgQUlGX0JPT0xFQU4JCTE2Ci0jZGVmaW5lIEFJRl9BRERSRVNTCQkxNwotI2RlZmluZSBBSUZfQ0hBUl9QT0lOVEVSCTE4Ci0jZGVmaW5lIE5VTV9BSUZfVFlQRVMJMTkKLQotI2RlZmluZSBBSUZfUFRSX05JTAkJCTAKLSNkZWZpbmUgQUlGX1BUUl9OT1JNQUwJCTEKLSNkZWZpbmUgQUlGX1BUUl9OQU1FCQkyCi0jZGVmaW5lIEFJRl9QVFJfUkVGRVJFTkNFCTMKLSNkZWZpbmUgQUlGX1BUUl9JTlZBTElECQk0Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgdXNlZCB0byBpbmRleCBpbnRvIGEgCi0gKiBtdWxpLWRpbWVuc2lvbmFsIGFycmF5LgotICovCi1zdHJ1Y3QgQUlGSW5kZXgKLXsKLQlpbnQJCWlfZmluaXNoZWQ7Ci0JaW50CQlpX3Jhbms7Ci0JaW50CQlpX25lbDsKLQlpbnQgKglpX21pbjsKLQlpbnQgKglpX21heDsKLQlpbnQgKglpX2luZGV4OwotCWNoYXIgKglpX2J0eXBlOwotCWludAkJaV9ic2l6ZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBBSUZJbmRleAlBSUZJbmRleDsKLQotLyoKLSAqIEFJRiBPYmplY3QKLSAqLwotc3RydWN0IEFJRgotewotCWNoYXIgKglhX2ZkczsKLQotCXN0cnVjdAotCXsKLQkJdW5zaWduZWQJCWFfZGF0YV9sZW47Ci0JCWNoYXIgKgkJYV9kYXRhX3ZhbDsKLQl9IGFfZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBBSUYgQUlGOwotCi0jZGVmaW5lIEFJRl9GT1JNQVQoYSkJKGEpLT5hX2ZkcwotI2RlZmluZSBBSUZfTEVOKGEpCShhKS0+YV9kYXRhLmFfZGF0YV9sZW4KLSNkZWZpbmUgQUlGX0RBVEEoYSkJKGEpLT5hX2RhdGEuYV9kYXRhX3ZhbAotCi0vKgotICogQXJpdGhtZXRpYy9sb2dpY2FsIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgCi0gKiBwZXJmb3JtZWQgb24gQUlGIG9iamVjdHMuCi0gKi8KLWVudW0gYWlmb3AKLXsKLQlBSUZPUF9BREQsCi0JQUlGT1BfU1VCLAotCUFJRk9QX01VTCwKLQlBSUZPUF9ESVYsCi0JQUlGT1BfUkVNLAotCUFJRk9QX0FORCwKLQlBSUZPUF9PUiwKLQlBSUZPUF9ORUcsCi0JQUlGT1BfTk9UCi19OwotdHlwZWRlZiBlbnVtIGFpZm9wCWFpZm9wOwotCi0vKgotICogQUlGIE9iamVjdCBBY2Nlc3MgU3BlY2lmaWVycwotICovCi1lbnVtIGFpZmFjY2VzcwotewotCUFJRkFDQ19QUklWQVRFLAotCUFJRkFDQ19QUk9URUNURUQsCi0JQUlGQUNDX1BVQkxJQwotfTsKLXR5cGVkZWYgZW51bSBhaWZhY2Nlc3MJYWlmYWNjZXNzOwotCi0vKgotICogQUlGIGVycm9yIGNvZGVzLgotICovCi1lbnVtIGFpZmVycgotewotCUFJRkVSUl9OT0VSUiwKLQlBSUZFUlJfU0laRSwKLQlBSUZFUlJfQ09OViwKLQlBSUZFUlJfVFlQRSwKLQlBSUZFUlJfQkFEQVJHLAotCUFJRkVSUl9OT1RJTVAsCi0JQUlGRVJSX09QRU4sCi0JQUlGRVJSX1JFQUQsCi0JQUlGRVJSX1dSSVRFLAotCUFJRkVSUl9TRUVLLAotCUFJRkVSUl9CQURIRFIsCi0JQUlGRVJSX01PREUsCi0JQUlGRVJSX0ZEUywKLQlBSUZFUlJfRklFTEQsCi0JQUlGRVJSX0FSSVRILAotCUFJRkVSUl9CQVNFLAotCUFJRkVSUl9JTkRFWCwKLQlBSUZFUlJfU1RSSU5HLAotCUFJRkVSUl9DQU5USEFQUEVOCi19OwotdHlwZWRlZiBlbnVtIGFpZmVycglhaWZlcnI7Ci1leHRlcm4gYWlmZXJyCQlBSUZFcnJubzsKLQotLyoKLSAqIEFJRiBvcHRpb24gY29kZXMuCi0gKi8KLWVudW0gYWlmb3B0Ci17Ci0JQUlGT1BUX0NNUF9ERVBUSCwKLQlBSUZPUFRfQ01QX01FVEhPRAotfTsKLXR5cGVkZWYgZW51bSBhaWZvcHQJYWlmb3B0OwotCi0jZGVmaW5lIEFJRl9DTVBfQllfUE9TSVRJT04JMAotI2RlZmluZSBBSUZfQ01QX0JZX05BTUUJCTEKLQotLyoKLSAqIERlZmluaXRvbnMgZm9yIHJlYWRpbmcvd3JpdGluZyBBSUYKLSAqIGRhdGEgdG8gYSBmaWxlLgotICovCi0KLSNkZWZpbmUgQUlGTU9ERV9SRUFECQkweDAwMQotI2RlZmluZSBBSUZNT0RFX0NSRUFURQkweDAwMgotI2RlZmluZSBBSUZNT0RFX0FQUEVORAkweDAwNAotCi0jaW5jbHVkZQk8c3RkaW8uaD4KLQotc3RydWN0IEFJRkZJTEUKLXsKLQlGSUxFICoJYWZfZnA7Ci0JaW50CQlhZl9tb2RlOwotCWludAkJYWZfY250OwotfTsKLXR5cGVkZWYgc3RydWN0IEFJRkZJTEUJQUlGRklMRTsKLQotI2luY2x1ZGUJImZkcy5oIgotCi0jZGVmaW5lIEFJRl9BUlJBWV9UWVBFKHJhbmdlLCBiYXNlKQkJVHlwZVRvRkRTKEFJRl9BUlJBWSwgKHJhbmdlKSwgKGJhc2UpKQotI2RlZmluZSBBSUZfQk9PTEVBTl9UWVBFKCkJCQkJVHlwZVRvRkRTKEFJRl9CT09MRUFOKQotI2RlZmluZSBBSUZfQ0hBUkFDVEVSX1RZUEUoKQkJCVR5cGVUb0ZEUyhBSUZfQ0hBUkFDVEVSKQotI2RlZmluZSBBSUZfRU5VTV9UWVBFKHNpZ24pCQkJCVR5cGVUb0ZEUyhBSUZfRU5VTSwgKHNpZ24pKQotI2RlZmluZSBBSUZfRkxPQVRJTkdfVFlQRShsZW4pCQkJVHlwZVRvRkRTKEFJRl9GTE9BVElORywgKGxlbikpCi0jZGVmaW5lIEFJRl9GVU5DVElPTl9UWVBFKGJhc2UpCQkJVHlwZVRvRkRTKEFJRl9GVU5DVElPTiwgKGJhc2UpKQotI2RlZmluZSBBSUZfSU5URUdFUl9UWVBFKHNpZ24sIGxlbikJCVR5cGVUb0ZEUyhBSUZfSU5URUdFUiwgKHNpZ24pLCAobGVuKSkKLSNkZWZpbmUgQUlGX05BTUVfVFlQRShuYW1lLCBiYXNlKQkJVHlwZVRvRkRTKEFJRl9OQU1FLCAobmFtZSksIChiYXNlKSkKLSNkZWZpbmUgQUlGX1BPSU5URVJfVFlQRShhZGRyLCBiYXNlKQlUeXBlVG9GRFMoQUlGX1BPSU5URVIsIChhZGRyKSwgKGJhc2UpKQotI2RlZmluZSBBSUZfUkFOR0VfVFlQRShsbywgaGksIGJhc2UpCVR5cGVUb0ZEUyhBSUZfUkFOR0UsIChsbyksIChoaSksIChiYXNlKSkKLSNkZWZpbmUgQUlGX1JFRkVSRU5DRV9UWVBFKHJlZikJCQlUeXBlVG9GRFMoQUlGX1JFRkVSRU5DRSwgKHJlZikpCi0jZGVmaW5lIEFJRl9SRUdJT05fVFlQRShuYW1lLCBiYXNlKQkJVHlwZVRvRkRTKEFJRl9SRUdJT04sIChuYW1lKSwgKGJhc2UpKQotI2RlZmluZSBBSUZfU1RSSU5HX1RZUEUoKQkJCQlUeXBlVG9GRFMoQUlGX1NUUklORykKLSNkZWZpbmUgQUlGX1NUUlVDVF9UWVBFKCkJCQkJVHlwZVRvRkRTKEFJRl9TVFJVQ1QpCi0jZGVmaW5lIEFJRl9VTklPTl9UWVBFKCkJCQkJVHlwZVRvRkRTKEFJRl9VTklPTikKLSNkZWZpbmUgQUlGX1ZPSURfVFlQRShsZW4pCQkJCVR5cGVUb0ZEUyhBSUZfVk9JRCwgKGxlbikpCi0jZGVmaW5lIEFJRl9BRERSRVNTX1RZUEUobGVuKQkJCVR5cGVUb0ZEUyhBSUZfQUREUkVTUywgKGxlbikpCi0jZGVmaW5lIEFJRl9DSEFSX1BPSU5URVJfVFlQRShhZGRyKQkJVHlwZVRvRkRTKEFJRl9DSEFSX1BPSU5URVIsIChhZGRyKSkKLQotLyoKLSAqIEFJRiByb3V0aW5lcy4KLSAqLwotCi1leHRlcm4gQUlGICoJCUFJRkFkZChBSUYgKiwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGQWRkQ29uc3RUb0VudW0oQUlGICosIGNoYXIgKiwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGQWRkRmllbGRUb1N0cnVjdChBSUYgKiwgY2hhciAqLCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZBZGRGaWVsZFRvVW5pb24oQUlGICosIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiB2b2lkCQlBSUZBZGRBcnJheUVsZW1lbnQoQUlGICosIGludCwgQUlGICopOwotZXh0ZXJuIEFJRiAqCQlBSUZBbmQoQUlGICosIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5Qm91bmRzKEFJRiAqLCBpbnQsIGludCAqKiwgaW50ICoqLCBpbnQgKiopOwotZXh0ZXJuIEFJRiAqCQlBSUZBcnJheUVsZW1lbnQoQUlGICosIEFJRkluZGV4ICopOwotZXh0ZXJuIGludAkJQUlGQXJyYXlFbGVtZW50VG9Eb3VibGUoQUlGICosIEFJRkluZGV4ICosIGRvdWJsZSAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5RWxlbWVudFRvRG91Ymxlc3QoQUlGICosIEFJRkluZGV4ICosIEFJRkRPVUJMRVNUICopOwotZXh0ZXJuIGludAkJQUlGQXJyYXlFbGVtZW50VG9JbnQoQUlGICosIEFJRkluZGV4ICosIGludCAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5RWxlbWVudFRvTG9uZ2VzdChBSUYgKiwgQUlGSW5kZXggKiwgQUlGTE9OR0VTVCAqKTsKLWV4dGVybiB2b2lkCQlBSUZBcnJheUluZGV4RnJlZShBSUZJbmRleCAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5SW5kZXhJbmMoQUlGSW5kZXggKik7Ci1leHRlcm4gQUlGSW5kZXggKkFJRkFycmF5SW5kZXhJbml0KEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5SW5kZXhJblJhbmdlKGludCwgaW50ICosIGludCAqLCBpbnQgKik7Ci1leHRlcm4gaW50CQlBSUZBcnJheUluZGV4VG9TdHIoY2hhciAqKiwgQUlGSW5kZXggKik7Ci1leHRlcm4gY2hhciAqCUFJRkFycmF5SW5kZXhUeXBlKEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5SW5mbyhBSUYgKiwgaW50ICosIGNoYXIgKiosIGludCAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5TWF4SW5kZXgoQUlGICosIGludCk7Ci1leHRlcm4gaW50CQlBSUZBcnJheU1pbkluZGV4KEFJRiAqLCBpbnQpOwotZXh0ZXJuIEFJRiAqCQlBSUZBcnJheVBlcm0oQUlGICosIGludCAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5UmFuayhBSUYgKik7Ci1leHRlcm4gQUlGICoJCUFJRkFycmF5UmVmKEFJRiAqLCBpbnQsIGludCAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5U2l6ZShBSUYgKik7Ci1leHRlcm4gQUlGICoJCUFJRkFycmF5U2xpY2UoQUlGICosIGludCwgaW50ICosIGludCAqKTsKLWV4dGVybiBpbnQJCUFJRkFycmF5VG9TdHIoY2hhciAqKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZCYXNlVHlwZShBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZCb29sVG9TdHIoY2hhciAqKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZDbG9zZVNldChBSUZGSUxFICopOwotZXh0ZXJuIEFJRiAqCQlBSUZDb2VyY2UoQUlGICosIGNoYXIgKik7Ci1leHRlcm4gaW50CQlBSUZDb21wYXJlKGludCwgQUlGICosIEFJRiAqLCBpbnQgKik7Ci1leHRlcm4gQUlGICoJCUFJRkRpZmYoaW50LCBBSUYgKiwgQUlGICopOwotZXh0ZXJuIEFJRiAqCQlBSUZEaXYoQUlGICosIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRkVQUyhBSUYgKiwgQUlGICosIEFJRiAqLCBpbnQgKik7Ci1leHRlcm4gaW50CQlBSUZFbnVtVG9TdHIoY2hhciAqKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gYWlmZXJyCUFJRkVycm9yKHZvaWQpOwotZXh0ZXJuIGNoYXIgKglBSUZFcnJvclN0cih2b2lkKTsKLWV4dGVybiBpbnQJCUFJRkZpZWxkVG9Eb3VibGUoQUlGICosIGNoYXIgKiwgZG91YmxlICopOwotZXh0ZXJuIGludAkJQUlGRmllbGRUb0RvdWJsZXN0KEFJRiAqLCBjaGFyICosIEFJRkRPVUJMRVNUICopOwotZXh0ZXJuIGludAkJQUlGRmllbGRUb0ludChBSUYgKiwgY2hhciAqLCBpbnQgKik7Ci1leHRlcm4gaW50CQlBSUZGaWVsZFRvTG9uZ2VzdChBSUYgKiwgY2hhciAqLCBBSUZMT05HRVNUICopOwotZXh0ZXJuIGludAkJQUlGRmllbGRUeXBlKEFJRiAqLCBjaGFyICopOwotZXh0ZXJuIGludAkJQUlGRmxvYXRUb1N0cihjaGFyICoqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRkZ1bmN0aW9uVG9TdHIoY2hhciAqKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gdm9pZAkJQUlGRnJlZShBSUYgKik7Ci1leHRlcm4gQUlGICoJCUFJRkdldEVudW0oQUlGICopOwotZXh0ZXJuIGNoYXIgKglBSUZHZXRJZGVudGlmaWVyKEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRkdldE9wdGlvbihhaWZvcHQpOwotZXh0ZXJuIEFJRiAqCQlBSUZHZXRTdHJ1Y3QoQUlGICosIGNoYXIgKik7Ci1leHRlcm4gQUlGICoJCUFJRkdldFVuaW9uKEFJRiAqLCBjaGFyICopOwotZXh0ZXJuIGludAkJQUlGSW5kZXhJblJhbmdlKGludCwgaW50ICosIGludCAqLCBpbnQgKik7Ci1leHRlcm4gaW50CQlBSUZJbmRleE9mZnNldChpbnQsIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKLWV4dGVybiBpbnQJCUFJRkludFRvU3RyKGNoYXIgKiosIGludCwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGSXNaZXJvKEFJRiAqLCBpbnQgKik7Ci1leHRlcm4gQUlGICoJCUFJRk11bChBSUYgKiwgQUlGICopOwotZXh0ZXJuIEFJRiAqCQlBSUZOZWcoQUlGICopOwotZXh0ZXJuIHZvaWQJCUFJRk5vcm1hbGlzZShjaGFyICosIGludCwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIEFJRiAqCQlBSUZOb3QoQUlGICopOwotZXh0ZXJuIEFJRiAqCQlBSUZOdWxsKEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRk51bUZpZWxkcyhBSUYgKik7Ci1leHRlcm4gQUlGRklMRSAqCUFJRk9wZW5TZXQoY2hhciAqLCBpbnQpOwotZXh0ZXJuIEFJRiAqCQlBSUZPcihBSUYgKiwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGUG9pbnRlclRvU3RyKGNoYXIgKiosIGludCwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGUHJpbnQoRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50QXJyYXkoRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50Qm9vbChGSUxFICosIGludCwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGUHJpbnRDaGFyKEZJTEUgKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZQcmludEVudW0oRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50RmxvYXQoRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50RnVuY3Rpb24oRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50SW50KEZJTEUgKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZQcmludE5hbWUoRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50UG9pbnRlcihGSUxFICosIGludCwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGUHJpbnRSZWZlcmVuY2UoRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50UmVnaW9uKEZJTEUgKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZQcmludFN0cmluZyhGSUxFICosIGludCwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGUHJpbnRTdHJ1Y3QoRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50VW5pb24oRklMRSAqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlByaW50Vm9pZChGSUxFICosIGludCwgQUlGICopOwotZXh0ZXJuIGludAkJQUlGUHJpbnRBcnJheUluZGV4KEZJTEUgKiwgQUlGSW5kZXggKik7Ci1leHRlcm4gaW50CQlBSUZSZWZlcmVuY2VUb1N0cihjaGFyICoqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBBSUYgKgkJQUlGUmVhZFNldChBSUZGSUxFICosIGNoYXIgKiopOwotZXh0ZXJuIEFJRiAqCQlBSUZSZW0oQUlGICosIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlNldEFycmF5RGF0YShBSUYgKiwgQUlGSW5kZXggKiwgQUlGICopOwotZXh0ZXJuIHZvaWQJCUFJRlNldERhdGEoQUlGICosIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQJCUFJRlNldEVudW0oQUlGICosIGNoYXIgKik7Ci1leHRlcm4gaW50CQlBSUZTZXRJZGVudGlmaWVyKEFJRiAqLCBjaGFyICopOwotZXh0ZXJuIGludAkJQUlGU2V0T3B0aW9uKGFpZm9wdCwgaW50KTsKLWV4dGVybiBpbnQJCUFJRlNldFN0cnVjdChBSUYgKiwgY2hhciAqLCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZTZXRVbmlvbihBSUYgKiwgY2hhciAqLCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZTdHJ1Y3RUb1N0cihjaGFyICoqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBBSUYgKgkJQUlGU3ViKEFJRiAqLCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZUb0NoYXIoQUlGICosIGNoYXIgKik7Ci1leHRlcm4gaW50CQlBSUZUb0RvdWJsZShBSUYgKiwgZG91YmxlICopOwotZXh0ZXJuIGludAkJQUlGVG9Eb3VibGVzdChBSUYgKiwgQUlGRE9VQkxFU1QgKik7Ci1leHRlcm4gaW50CQlBSUZUb0ludChBSUYgKiwgaW50ICopOwotZXh0ZXJuIGludAkJQUlGVG9Mb25nZXN0KEFJRiAqLCBBSUZMT05HRVNUICopOwotZXh0ZXJuIGludAkJQUlGVG9GbG9hdChBSUYgKiwgZmxvYXQgKik7Ci1leHRlcm4gaW50CQlBSUZUb1N0cihjaGFyICoqLCBpbnQsIEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlRvVm9pZChBSUYgKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAkJQUlGVHlwZShBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZUeXBlQ29tcGFyZShBSUYgKiwgQUlGICopOwotZXh0ZXJuIGxvbmcJCUFJRlR5cGVTaXplKEFJRiAqKTsKLWV4dGVybiBpbnQJCUFJRlVuaW9uVG9TdHIoY2hhciAqKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZWb2lkVG9TdHIoY2hhciAqKiwgaW50LCBBSUYgKik7Ci1leHRlcm4gaW50CQlBSUZXcml0ZVNldChBSUZGSUxFICosIEFJRiAqLCBjaGFyICopOwotZXh0ZXJuIEFJRiAqCQlBcnJheVRvQUlGKGludCwgaW50ICosIGludCAqLCBjaGFyICosIGludCwgY2hhciAqKTsKLWV4dGVybiBBSUYgKgkJQXNjaWlUb0FJRihjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gQUlGICogCUJvb2xUb0FJRihpbnQpOwotZXh0ZXJuIEFJRiAqCQlDaGFyVG9BSUYoY2hhcik7Ci1leHRlcm4gQUlGICoJCUNvcHlBSUYoQUlGICopOwotZXh0ZXJuIEFJRiAqCQlEb3VibGVUb0FJRihkb3VibGUpOwotZXh0ZXJuIEFJRiAqCQlFbXB0eUFycmF5VG9BSUYoaW50LCBpbnQsIEFJRiAqKTsKLWV4dGVybiBBSUYgKgkJRW1wdHlFbnVtVG9BSUYoY2hhciAqKTsKLWV4dGVybiBBSUYgKgkJRW1wdHlTdHJ1Y3RUb0FJRihjaGFyICopOwotZXh0ZXJuIEFJRiAqCQlFbXB0eVVuaW9uVG9BSUYoY2hhciAqKTsKLWV4dGVybiBBSUYgKgkJRmxvYXRUb0FJRihmbG9hdCk7Ci1leHRlcm4gQUlGICoJCUludFRvQUlGKGludCk7Ci1leHRlcm4gQUlGICoJCUxvbmdUb0FJRihsb25nKTsKLSNpZmRlZiBDQ19IQVNfTE9OR19MT05HCi1leHRlcm4gQUlGICoJCUxvbmdMb25nVG9BSUYobG9uZyBsb25nKTsKLSNlbmRpZiAvKiBDQ19IQVNfTE9OR19MT05HICovCi1leHRlcm4gQUlGICoJCUxvbmdlc3RUb0FJRihBSUZMT05HRVNUKTsKLWV4dGVybiBBSUYgKgkJTWFrZUFJRihjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gQUlGICoJCU5hbWVBSUYoQUlGICosIGludCk7Ci1leHRlcm4gQUlGICoJCU5ld0FJRihpbnQsIGludCk7Ci1leHRlcm4gQUlGICoJCVBvaW50ZXJOYW1lVG9BSUYoQUlGICopOwotZXh0ZXJuIEFJRiAqCQlQb2ludGVyUmVmZXJlbmNlVG9BSUYoQUlGICopOwotZXh0ZXJuIEFJRiAqCQlQb2ludGVyVG9BSUYoQUlGICosIEFJRiAqKTsKLWV4dGVybiBBSUYgKgkJUmVmZXJlbmNlQUlGKGludCk7IAotZXh0ZXJuIEFJRiAqCQlTaG9ydFRvQUlGKHNob3J0KTsKLWV4dGVybiBBSUYgKgkJU3RyaW5nVG9BSUYoY2hhciAqKTsKLWV4dGVybiBBSUYgKgkJVW5zaWduZWRTaG9ydFRvQUlGKHVuc2lnbmVkIHNob3J0KTsKLWV4dGVybiBBSUYgKgkJVW5zaWduZWRJbnRUb0FJRih1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIEFJRiAqCQlVbnNpZ25lZExvbmdUb0FJRih1bnNpZ25lZCBsb25nKTsKLSNpZmRlZiBDQ19IQVNfTE9OR19MT05HCi1leHRlcm4gQUlGICoJCVVuc2lnbmVkTG9uZ0xvbmdUb0FJRih1bnNpZ25lZCBsb25nIGxvbmcpOwotI2VuZGlmIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLWV4dGVybiBBSUYgKgkJVm9pZFRvQUlGKGNoYXIgKiwgaW50KTsKLWV4dGVybiBBSUYgKgkJQWRkcmVzc1RvQUlGKGNoYXIgKiwgaW50KTsKLWV4dGVybiBBSUYgKgkJQ2hhclBvaW50ZXJUb0FJRihBSUYgKiwgY2hhciAqKTsKLWV4dGVybiBBSUYgKgkJRW1wdHlDb21wbGV4QXJyYXlUb0FJRihpbnQsIGludCwgQUlGICopOwotZXh0ZXJuIHZvaWQJCQlBSUZBZGRDb21wbGV4QXJyYXlFbGVtZW50KEFJRiAqLCBBSUYgKik7Ci0KLSNlbmRpZiAvKiAhX0FJRl9IICovCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FpZi54IGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWlmLngKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODY3NDIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWlmLngKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotKiogQXJjaGl0ZWN1cmUgSW5kZXBlbmRlbnQgRm9ybWF0IChBSUYpIFhEUiBkZWZpbml0aW9uLgotKioKLSoqIENvcHlyaWdodCAoYykgMTk5NiBieSBNb25hc2ggVW5pdmVyc2l0eS4KLSoqCi0qKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotKiogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0qKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKioKLSoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qKgotKiogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0qKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSoqCi0qLwotCi0lI2luY2x1ZGUJPHJwYy9ycGMuaD4KLQotc3RydWN0IEFJRgotewotCXN0cmluZwlhX2Zkczw+OwotCW9wYXF1ZQlhX2RhdGE8PjsKLX07CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9haWZlcnIuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FpZmVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTBkYTMyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FpZmVyci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIEhlYWRlciBmaWxlIGZvciBBSUYgZXJyb3Igcm91dGluZXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKi8KLQotI2lmbmRlZiBfQUlGX0VSUk9SX0gKLSNkZWZpbmUgX0FJRl9FUlJPUl9ICi0KLXZvaWQJU2V0QUlGRXJyb3IoYWlmZXJyLCBjaGFyICopOwotdm9pZAlSZXNldEFJRkVycm9yKHZvaWQpOwotCi0jZW5kaWYgLyogIV9fQUlGX0VSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2FpZmludC5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWlmaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YjllNjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYWlmaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIEhlYWRlciBmaWxlIGZvciBpbnRlcm5hbCBBSUYgdXRpbGl0eSByb3V0aW5lcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jaWZuZGVmIF9BSUZJTlRfSAotI2RlZmluZSBfQUlGSU5UX0gKLQotI2RlZmluZSBNQVhfVkFMVUVTX1NFRU4gMTAwMAotI2RlZmluZSBNQVhfVFlQRVNfU0VFTiAxMDAKLQotZXh0ZXJuIGNoYXIgKglfYWlmX3ZhbHVlc19zZWVuW107Ci1leHRlcm4gY2hhciAqCV9haWZfdHlwZXNfc2VlbltdOwotCi1leHRlcm4gdm9pZAlfYWlmX2FkZF9pbnQoY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgKglfYWlmX2FsbG9jKGludCk7Ci1leHRlcm4gdm9pZAlfYWlmX2FuZF9ib29sKGNoYXIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiB2b2lkCV9haWZfYW5kX2ludChjaGFyICosIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gQUlGICoJX2FpZl9hcnJheV9yZWYoQUlGICosIGludCwgaW50ICosIGludCAqLCBpbnQgKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludCAJX2FpZl9hcnJheV9zbGljZV9wb3N0KGNoYXIgKiosIGNoYXIgKiosIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludCAJX2FpZl9hcnJheV9zbGljZV9wcmUoY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfYXJyYXlfdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfYmluYXJ5X29wKGFpZm9wLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9iaW5hcnlfb3BfYm9vbChhaWZvcCwgY2hhciAqKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQJX2FpZl9iaW5hcnlfb3BfZmxvYXQoYWlmb3AsIGNoYXIgKiosIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50CV9haWZfYmluYXJ5X29wX2ludChhaWZvcCwgY2hhciAqKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQJX2FpZl9ib29sX3RvX3N0cihpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX2NoYXJfdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfY29tcGFyZShpbnQsIGludCAqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9jbXBfaW50KGludCAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAlfYWlmX2NtcF9mbG9hdChpbnQgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQJX2FpZl9kaWZmKGludCwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gdm9pZAlfYWlmX2Rpdl9pbnQoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZAlfYWlmX2R1bXBfaW50KGNoYXIgKiosIGNoYXIgKiosIEZJTEUgKik7Ci1leHRlcm4gdm9pZAlfYWlmX2R1bXBfZmxvYXQoY2hhciAqKiwgY2hhciAqKiwgRklMRSAqKTsKLWV4dGVybiB2b2lkCV9haWZfZHVtcChjaGFyICoqLCBjaGFyICoqLCBGSUxFICopOwotZXh0ZXJuIHZvaWQJX2FpZl9kdW1wX2FycmF5KGNoYXIgKiosIGNoYXIgKiosIEZJTEUgKik7Ci1leHRlcm4gaW50CV9haWZfZW51bV90b19zdHIoaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9lcHMoY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqLCBjaGFyICosIGludCwgaW50ICopOwotZXh0ZXJuIHZvaWQJX2FpZl9mcmVlKHZvaWQgKik7Ci1leHRlcm4gaW50CV9haWZfZmxvYXRfdG9fYWlmX2ludChjaGFyICoqLCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50CV9haWZfZmxvYXRfdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfZnVuY3Rpb25fdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfaW50X2lzX3plcm8oY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAlfYWlmX2ludF90b19haWZfZmxvYXQoY2hhciAqKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAlfYWlmX2ludF90b19kb3VibGUoY2hhciAqLCBpbnQsIGRvdWJsZSAqKTsKLWV4dGVybiBpbnQJX2FpZl9pbnRfdG9fZG91Ymxlc3QoY2hhciAqLCBpbnQsIEFJRkRPVUJMRVNUICopOwotZXh0ZXJuIGludAlfYWlmX2ludF90b19zdHIoaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9pc196ZXJvKGNoYXIgKiosIGNoYXIgKiosIGludCwgaW50ICopOwotZXh0ZXJuIHZvaWQJX2FpZl9tdWxfaW50KGNoYXIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQJX2FpZl9uYW1lX3RvX3N0cihpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIHZvaWQJX2FpZl9uZWdfaW50KGNoYXIgKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQJX2FpZl9ub3RfYm9vbChjaGFyICosIGNoYXIgKiwgaW50KTsKLWV4dGVybiB2b2lkCV9haWZfbm90X2ludChjaGFyICosIGNoYXIgKiwgaW50KTsKLWV4dGVybiB2b2lkCV9haWZfb3JfYm9vbChjaGFyICosIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZAlfYWlmX29yX2ludChjaGFyICosIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50CV9haWZfcG9pbnRlcl90b19zdHIoaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludChGSUxFICosIGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfcHJpbnRfYXJyYXkoRklMRSAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ByaW50X2Jvb2woRklMRSAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ByaW50X2NoYXIoRklMRSAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ByaW50X2VudW0oRklMRSAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ByaW50X2Zsb2F0KEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludF9mdW5jdGlvbihGSUxFICosIGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfcHJpbnRfaW50KEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludF9uYW1lKEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludF9wb2ludGVyKEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludF9yZWZlcmVuY2UoRklMRSAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ByaW50X3JlZ2lvbihGSUxFICosIGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfcHJpbnRfc3RyaW5nKEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludF9zdHJ1Y3QoRklMRSAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ByaW50X3VuaW9uKEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9wcmludF92b2lkKEZJTEUgKiwgaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJX2FpZl9yZWZlcmVuY2VfdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfcmVnaW9uX3RvX3N0cihpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIHZvaWQgKglfYWlmX3Jlc2l6ZSh2b2lkICosIGludCk7Ci1leHRlcm4gaW50CV9haWZfc3RyaW5nX3RvX3N0cihpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3N0cnVjdF90b19zdHIoaW50LCBjaGFyICoqLCBjaGFyICoqKTsKLWV4dGVybiB2b2lkCV9haWZfc3ViX2ludChjaGFyICosIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50CV9haWZfdG9fY2hhcihjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gaW50CV9haWZfdG9fbG9uZ2VzdChjaGFyICosIGludCwgQUlGTE9OR0VTVCAqKTsKLWV4dGVybiBpbnQJX2FpZl90b19kb3VibGVzdChjaGFyICosIGludCwgQUlGRE9VQkxFU1QgKik7Ci1leHRlcm4gaW50CV9haWZfdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9haWZfdW5hcnlfb3AoYWlmb3AsIGNoYXIgKiosIGNoYXIgKiosIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3VuYXJ5X29wX2Jvb2woYWlmb3AsIGNoYXIgKiosIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQJX2FpZl91bmFyeV9vcF9mbG9hdChhaWZvcCwgY2hhciAqKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAlfYWlmX3VuYXJ5X29wX2ludChhaWZvcCwgY2hhciAqKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAlfYWlmX3VuaW9uX3RvX3N0cihpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAlfYWlmX3ZvaWRfdG9fc3RyKGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CV9jaGFyX3RvX2FpZihjaGFyICoqLCBjaGFyKTsKLWV4dGVybiBpbnQJX2RvdWJsZXN0X3RvX2FpZihjaGFyICoqLCBpbnQsIEFJRkRPVUJMRVNUKTsKLWV4dGVybiBpbnQgCV9kYXRhX2xlbl9pbmRleChjaGFyICosIGludCk7Ci1leHRlcm4gaW50IAlfZGF0YV9sZW5fcHVibGljKGNoYXIgKik7Ci1leHRlcm4gY2hhciAqIAlfZmRzX2FkZF9mdW5jdGlvbl9hcmcoY2hhciAqLCBjaGFyICopOwotZXh0ZXJuIGNoYXIgKglfZmRzX2Jhc2VfdHlwZShjaGFyICopOwotZXh0ZXJuIGludAlfZmRzX2NvdW50X2J5dGVzKGNoYXIgKiopOwotZXh0ZXJuIGludAlfZmRzX2NvdW50X2J5dGVzX25hKGNoYXIgKiopOwotZXh0ZXJuIHZvaWQJX2Zkc19hZHZhbmNlKGNoYXIgKiopOwotZXh0ZXJuIGludAlfZmRzX2FycmF5X21pbl9pbmRleChjaGFyICopOwotZXh0ZXJuIGludAlfZmRzX2FycmF5X21heF9pbmRleChjaGFyICopOwotZXh0ZXJuIGludAlfZmRzX2dldG51bShjaGFyICopOwotZXh0ZXJuIGNoYXIgKglfZmRzX2xvb2t1cChjaGFyICoqKTsKLWV4dGVybiB2b2lkCV9mZHNfcmVzb2x2ZShjaGFyICoqKTsKLWV4dGVybiB2b2lkCV9mZHNfc2tpcF9kYXRhKGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGNoYXIgKglfZmRzX3NraXB0b21hdGNoKGNoYXIgKik7Ci1leHRlcm4gY2hhciAqIAlfZmRzX3NraXB0b2ZpZWxkKGNoYXIgKmZkcywgaW50IG4pOwotZXh0ZXJuIGNoYXIgKglfZmRzX3NraXB0byhjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gY2hhciAqCV9mZHNfc2tpcG51bShjaGFyICopOwotZXh0ZXJuIHZvaWQgIAlfZmRzX3NraXBpZChjaGFyICoqKTsKLWV4dGVybiBpbnQJX2Zkc19zdHJ1Y3RfYXJyYW5nZShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyKiosIGNoYXIqKik7Ci1leHRlcm4gY2hhciAqCV9maWVsZF9hdHRyaWJ1dGUoY2hhciAqLCBjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gY2hhciAqCV9maW5kX3RhcmdldChjaGFyICoqLCBpbnQpOwotZXh0ZXJuIGludAlfbG9uZ2VzdF90b19haWYoY2hhciAqKiwgaW50LCBBSUZMT05HRVNUKTsKLWV4dGVybiB2b2lkCV9zdHJfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkCV9zdHJfY2F0KGNoYXIgKik7Ci1leHRlcm4gdm9pZAlfc3RyX2FkZChjaGFyKTsKLWV4dGVybiBjaGFyICoJX3N0cl9nZXQodm9pZCk7Ci1leHRlcm4gdm9pZAlfcHRybmFtZV90b19pbnQoY2hhciAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZAlfaW50X3RvX3B0cm5hbWUoaW50LCBjaGFyICopOwotCi0jZW5kaWYgLyogX0FJRklOVF9IICovCi0KLQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9hcnJheS5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvYXJyYXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzYmQ2OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9hcnJheS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NCArMCwwIEBACi0vKgotICogQUlGIHJvdXRpbmVzIHRoYXQgb3BlcmF0ZSBzcGVjaWZpY2FsbHkgb24gYXJyYXlzLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIGJ5IEd1YXJkc29mdCBQdHkgTHRkLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZQk8Y29uZmlnLmg+Ci0jZW5kaWYgLyogSEFWRV9DT05GSUdfSCAqLwotCi0jaW5jbHVkZQk8c3RkaW8uaD4KLSNpbmNsdWRlCTxtZW1vcnkuaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLQotI2luY2x1ZGUJImFpZi5oIgotI2luY2x1ZGUJImFpZmVyci5oIgotI2luY2x1ZGUJImFpZmludC5oIgotCi1pbnQKLUFJRkFycmF5UmFuayhBSUYgKmEpCi17Ci0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZUeXBlKGEpICE9IEFJRl9BUlJBWSApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gRkRTQXJyYXlSYW5rKEFJRl9GT1JNQVQoYSkpOwotfQotCi1pbnQKLUFJRkFycmF5U2l6ZShBSUYgKmEpCi17Ci0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZUeXBlKGEpICE9IEFJRl9BUlJBWSApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gRkRTQXJyYXlTaXplKEFJRl9GT1JNQVQoYSkpOwotfQotCi0vKgotICogUGFyc2UgYXJyYXkgdHlwZSBkZXNjcmlwdG9yIGFuZCBleHRyYWN0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCi0gKiBhcnJheSBpbmRleCB2YWx1ZXMgZm9yIGVhY2ggZGltZW5zaW9uLiBBbHNvLCBpZiBzaXplIGlzIG5vdCBOVUxMLAotICogd2lsbCByZXR1cm4gdGhlIHNpemUgb2YgZGltZW5zaW9uLgotICovCi1pbnQKLUFJRkFycmF5Qm91bmRzKEFJRiAqYSwgaW50IHJhbmssIGludCAqKm1pbiwgaW50ICoqbWF4LCBpbnQgKipzaXplKQotewotCWlmICggYSA9PSAoQUlGICopTlVMTCB8fCBtaW4gPT0gKGludCAqKilOVUxMIHx8IG1heCA9PSAoaW50ICoqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIEFJRlR5cGUoYSkgIT0gQUlGX0FSUkFZICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUZEU0FycmF5Qm91bmRzKEFJRl9GT1JNQVQoYSksIHJhbmssIG1pbiwgbWF4LCBzaXplKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRXh0cmFjdCBpbmZvIGFib3V0IGFuIGFycmF5LiBSZXR1cm5zIHRoZSBpbmRleCB0eXBlIG9mIHRoZQotICogZmlyc3QgZGltZW5zaW9uIChhc3N1bWVzIGFsbCBkaW1lbnNpb25zIGFyZSB0aGUgc2FtZSB0eXBlKSwKLSAqIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5LCBhbmQgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zCi0gKiBvZiB0aGUgYXJyYXkuCi0gKi8KLWludAotQUlGQXJyYXlJbmZvKEFJRiAqYSwgaW50ICpyYW5rLCBjaGFyICoqdHlwZSwgaW50ICppZHgpCi17Ci0JY2hhciAqCWl0eXBlOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMIHx8IHJhbmsgPT0gKGludCAqKU5VTEwgfHwgdHlwZSA9PSAoY2hhciAqKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZUeXBlKGEpICE9IEFJRl9BUlJBWSApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlGRFNBcnJheUluZm8oQUlGX0ZPUk1BVChhKSwgcmFuaywgKGNoYXIgKiopdHlwZSwgJml0eXBlKTsKLQotCWlmICggaWR4ICE9IChpbnQgKilOVUxMICkKLQkJKmlkeCA9IEZEU1R5cGUoaXR5cGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcG9zdC1wcm9jZXNzaW5nIHJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgYnkgQUlGQXJyYXlTbGljZSgpLgotICogVGhpcyByb3V0aW5lIGNoZWNrcyB0aGUgZmRzIGFuZCB0aGUgZGF0YSBvZiBhbiBBSUYgb2JqZWN0LCBhbmQgaXQgY3JlYXRlcwotICogYSBuZXcgZGF0YSBmb3IgdGhlIG9iamVjdCAncmRhdGEnIHdoaWNoIGlzIGNvbnNpc3RlbnQuIFRoZSBmdW5jdGlvbiBjaGVja3MKLSAqIGFsbCBvZiB0aGUgQUlGX1BUUl9SRUZFUkVOQ0VzIGFuZCBpdCBjaGFuZ2VzIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgYQotICogcGFydGljdWxhciBBSUZfUFRSX1JFRkVSRU5DRSB0byBhbiBhcHByb3ByaWF0ZSBBSUZfUFRSX05BTUUgYmFzZWQgb24gdGhlCi0gKiAncmVzJyBhcnJheS4gSXQgbW9kaWZpZXMgdGhlICdmZHMnIGFuZCB0aGUgJ2RhdGEnLiAncmRhdGEnIHdpbGwgYWxzbwotICogYmUgYWR2YW5jZWQgdG8gdGhlIGVuZC4KLSAqCi0gKiBUaGUgcm91dGluZSBnZXRzIDQgcGFyYW1ldGVyczoKLSAqIGZkcyAtIHRoZSBmZHMgb2YgYW4gQUlGIG9iamVjdAotICogZGF0YSAtIHRoZSBvcmlnaW5hbCBkYXRhIG9mIGFuIEFJRiBvYmplY3QKLSAqIHJkYXRhIC0gdGhlIG5ldyBkYXRhIGZvciB0aGUgb2JqZWN0Ci0gKiByZXMgLSBhICdjaGFyIConIGFycmF5IHRoYXQgc3RvcmVzIHRoZSByZWZlcmVuY2VzCi0gKi8KLWludAotX2FpZl9hcnJheV9zbGljZV9wb3N0KGNoYXIgKipmZHMsIGNoYXIgKipkYXRhLCBjaGFyICoqcmRhdGEsIGNoYXIgKipyZXMpCi17Ci0JaW50IAlkYXRhbGVuOwotCWludCAJaW5kZXg7Ci0JY2hhciAqCWZtdDsKLQotCV9mZHNfcmVzb2x2ZShmZHMpOwotCi0Jc3dpdGNoICggRkRTVHlwZSgqZmRzKSApCi0JewotCWNhc2UgQUlGX1JFRkVSRU5DRToKLQkJZm10ID0gX2Zkc19sb29rdXAoZmRzKTsKLQkJX2FpZl9hcnJheV9zbGljZV9wb3N0KCZmbXQsIGRhdGEsIHJkYXRhLCByZXMpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX0FSUkFZOgotCQl7Ci0JCQlBSUZJbmRleCAqIGl4OwotCQkJaW50IGk7Ci0JCQljaGFyICogZmJhc2U7Ci0KLQkJCWl4ID0gRkRTQXJyYXlJbmRleEluaXQoKmZkcyk7Ci0JCQlfZmRzX2FkdmFuY2UoZmRzKTsKLQotCQkJZm9yICggaSA9IDA7IGkgPCBpeC0+aV9uZWw7IGkrKyApCi0JCQl7Ci0JCQkJZmJhc2UgPSBpeC0+aV9idHlwZTsKLQkJCQlfYWlmX2FycmF5X3NsaWNlX3Bvc3QoJmZiYXNlLCBkYXRhLCByZGF0YSwgcmVzKTsKLQkJCX0KLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCWNhc2UgQUlGX1NUUlVDVDoKLQkJKCpmZHMpKys7Ci0JCV9mZHNfc2tpcGlkKGZkcyk7Ci0KLQkJd2hpbGUgKCAqKmZkcyAhPSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAgKQotCQl7Ci0JCQkqZmRzID0gc3RyY2hyKCpmZHMsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsKLQkJCV9haWZfYXJyYXlfc2xpY2VfcG9zdChmZHMsIGRhdGEsIHJkYXRhLCByZXMpOwotCi0JCQlpZiAoICoqZmRzID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkKLQkJCQkoKmZkcykrKzsKLQkJfQotCi0JCSpmZHMgPSBzdHJjaHIoKmZkcywgRkRTX1NUUlVDVF9FTkQpICsgMTsKLQotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0KLQkJKCpmZHMpKys7Ci0KLQkJc3dpdGNoICggKGludCkqKmRhdGEgKQotCQl7Ci0JCWNhc2UgQUlGX1BUUl9OSUw6Ci0JCQkqKnJkYXRhID0gKipkYXRhOwotCQkJKCpkYXRhKSsrOwotCQkJKCpyZGF0YSkrKzsKLQkJCV9mZHNfYWR2YW5jZShmZHMpOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBBSUZfUFRSX05PUk1BTDoKLQkJCSoqcmRhdGEgPSAqKmRhdGE7Ci0JCQkoKmRhdGEpKys7Ci0JCQkoKnJkYXRhKSsrOwotCQkJX2FpZl9hcnJheV9zbGljZV9wb3N0KGZkcywgZGF0YSwgcmRhdGEsIHJlcyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEFJRl9QVFJfTkFNRToKLQkJCW1lbWNweSgqcmRhdGEsICpkYXRhLCA1KTsgLyogMSArIDQgKHB0ciBuYW1lKSAqLwotCQkJKCpkYXRhKSArPSA1OwotCQkJKCpyZGF0YSkgKz0gNTsKLQkJCV9haWZfYXJyYXlfc2xpY2VfcG9zdChmZHMsIGRhdGEsIHJkYXRhLCByZXMpOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBBSUZfUFRSX1JFRkVSRU5DRToKLQkJCV9wdHJuYW1lX3RvX2ludCgqZGF0YSArIDEsICZpbmRleCk7Ci0JCQlpZiAoIHJlc1tpbmRleF0gIT0gTlVMTCApCi0JCQl7Ci0JCQkJKigqcmRhdGEpKysgPSBBSUZfUFRSX05BTUU7Ci0JCQkJX2ludF90b19wdHJuYW1lKGluZGV4LCAqcmRhdGEpOwotCQkJCSpyZGF0YSArPSA0OwotCQkJCWRhdGFsZW4gPSBGRFNEYXRhU2l6ZSgqZmRzLCByZXNbaW5kZXhdKTsKLQkJCQltZW1jcHkoKnJkYXRhLCByZXNbaW5kZXhdLCBkYXRhbGVuKTsKLQkJCQkoKnJkYXRhKSArPSBkYXRhbGVuOwotCQkJCSgqZGF0YSkgKz0gNTsKLQkJCQlfZmRzX2FkdmFuY2UoZmRzKTsKLQkJCQlyZXNbaW5kZXhdPU5VTEw7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbWVtY3B5KCpyZGF0YSwgKmRhdGEsIDUpOwotCQkJCSgqZGF0YSkgKz0gNTsKLQkJCQkoKnJkYXRhKSArPSA1OwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCQlkYXRhbGVuID0gRkRTRGF0YVNpemUoKmZkcywgKmRhdGEpOwotCQkJX2Zkc19hZHZhbmNlKGZkcyk7Ci0JCQltZW1jcHkoKnJkYXRhLCAqZGF0YSwgZGF0YWxlbik7Ci0JCQkoKmRhdGEpICs9IGRhdGFsZW47Ci0JCQkoKnJkYXRhKSArPSBkYXRhbGVuOwotCQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotICogQSBwcmUtcHJvY2Vzc2luZyByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIGJ5IEFJRkFycmF5U2xpY2UoKS4KLSAqIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIGZkcyBhbmQgdGhlIGRhdGEsIGFuZCBpdCBzYXZlcyBhbGwgb2YgdGhlCi0gKiByZWZlcmVuY2VzIHRoYXQgYXJlIHBvaW50ZWQgYnkgQUlGX1BUUl9OQU1FcyBpbnRvICdyZXMnLgotICoKLSAqIFRoZSBmdW5jdGlvbiBnZXRzIDMgcGFyYW1ldGVycywgdGhlIGZkcyBhbmQgdGhlIGRhdGEgb2YgYW4gQUlGIG9iamVjdAotICogdGhhdCBpcyBnb2luZyB0byBiZSBzY2FubmVkLCBhbmQgYSAnY2hhciAqJyBhcnJheSAocmVzKSB0byBzdG9yZQotICogdGhlIHJlc3VsdHMuIEFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlICdyZXMnIGFycmF5IG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAqIHRvIE5VTEwuIEl0IG1vZGlmaWVzICdmZHMnIGFuZCAnZGF0YScuCi0gKi8KLWludAotX2FpZl9hcnJheV9zbGljZV9wcmUoY2hhciAqKmZkcywgY2hhciAqKmRhdGEsIGNoYXIgKipyZXMpCi17Ci0JaW50IAlkYXRhbGVuOwotCWNoYXIgKiAJZm10OwotCi0JX2Zkc19yZXNvbHZlKGZkcyk7Ci0KLQlzd2l0Y2ggKCBGRFNUeXBlKCpmZHMpICkKLQl7Ci0JY2FzZSBBSUZfUkVGRVJFTkNFOgotCQlmbXQgPSBfZmRzX2xvb2t1cChmZHMpOwotCQlfYWlmX2FycmF5X3NsaWNlX3ByZSgmZm10LCBkYXRhLCByZXMpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX0FSUkFZOgotCQl7Ci0JCQlBSUZJbmRleCAqIGl4OwotCQkJaW50IGk7Ci0JCQljaGFyICogZmJhc2U7Ci0KLQkJCWl4ID0gRkRTQXJyYXlJbmRleEluaXQoKmZkcyk7Ci0JCQlfZmRzX2FkdmFuY2UoZmRzKTsKLQotCQkJZm9yICggaSA9IDA7IGkgPCBpeC0+aV9uZWw7IGkrKyApCi0JCQl7Ci0JCQkJZmJhc2UgPSBpeC0+aV9idHlwZTsKLQkJCQlfYWlmX2FycmF5X3NsaWNlX3ByZSgmZmJhc2UsIGRhdGEsIHJlcyk7Ci0JCQl9Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQljYXNlIEFJRl9TVFJVQ1Q6Ci0JCSgqZmRzKSsrOwotCQlfZmRzX3NraXBpZChmZHMpOwotCi0JCXdoaWxlICggKipmZHMgIT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLQkJewotCQkJKmZkcyA9IHN0cmNocigqZmRzLCBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EKSArIDE7Ci0JCQlfYWlmX2FycmF5X3NsaWNlX3ByZShmZHMsIGRhdGEsIHJlcyk7Ci0KLQkJCWlmICggKipmZHMgPT0gRkRTX1NUUlVDVF9GSUVMRF9TRVAgKQotCQkJCSgqZmRzKSsrOwotCQl9Ci0KLQkJKmZkcyA9IHN0cmNocigqZmRzLCBGRFNfU1RSVUNUX0VORCkgKyAxOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfUE9JTlRFUjoKLQkJewotCQkJaW50IGluZGV4OwotCi0JCQkoKmZkcykrKzsKLQotCQkJc3dpdGNoICggKGludCkqKmRhdGEgKQotCQkJewotCQkJY2FzZSBBSUZfUFRSX05JTDoKLQkJCQkoKmRhdGEpKys7Ci0JCQkJX2Zkc19hZHZhbmNlKGZkcyk7Ci0JCQkJcmV0dXJuIDA7Ci0KLQkJCWNhc2UgQUlGX1BUUl9OT1JNQUw6Ci0JCQkJKCpkYXRhKSsrOwotCQkJCV9haWZfYXJyYXlfc2xpY2VfcHJlKGZkcywgZGF0YSwgcmVzKTsKLQkJCQlyZXR1cm4gMDsKLQotCQkJY2FzZSBBSUZfUFRSX05BTUU6Ci0JCQkJKCpkYXRhKSsrOwotCQkJCV9wdHJuYW1lX3RvX2ludCgqZGF0YSwgJmluZGV4KTsKLQkJCQkqZGF0YSArPSA0OwotCQkJCXJlc1tpbmRleF0gPSAqZGF0YTsKLQkJCQlfYWlmX2FycmF5X3NsaWNlX3ByZShmZHMsIGRhdGEsIHJlcyk7Ci0JCQkJcmV0dXJuIDA7Ci0KLQkJCWNhc2UgQUlGX1BUUl9SRUZFUkVOQ0U6Ci0JCQkJKCpkYXRhKSArPSA1OwotCQkJCV9mZHNfYWR2YW5jZShmZHMpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0KLQlkZWZhdWx0OgotCQkJZGF0YWxlbiA9IEZEU0RhdGFTaXplKCpmZHMsICpkYXRhKTsKLQkJCV9mZHNfYWR2YW5jZShmZHMpOwotCQkJKCpkYXRhKSArPSBkYXRhbGVuOwotCQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotICogRXZhbHVhdGUgYXJyYXkgc2xpY2UuCi0gKiBYWFg6IFRPRklYCi0gKi8KLUFJRiAqCi1BSUZBcnJheVNsaWNlKEFJRiAqYSwgaW50IHJhbmssIGludCAqbW4sIGludCAqbXgpCi17Ci0JaW50CQlpOwotCWludAkJbnJhbmsgPSAwOwotCWludCAqCQlyYW5rcDsKLQlpbnQJCXJsOwotCWNoYXIgKgkJcmY7Ci0JY2hhciAqCQlmZHM7Ci0JQUlGICoJCXJhOwotCUFJRkluZGV4ICoJaXgxOwotCUFJRkluZGV4ICoJaXgyID0gKEFJRkluZGV4ICopTlVMTDsKLQljaGFyICoJCXJlc19hcnJheVtNQVhfVkFMVUVTX1NFRU4rMV0gPSB7TlVMTH07Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgfHwgbW4gPT0gKGludCAqKU5VTEwgfHwgbXggPT0gKGludCAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlpZiAoIEFJRlR5cGUoYSkgIT0gQUlGX0FSUkFZICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCWl4MSA9IEZEU0FycmF5SW5kZXhJbml0KEFJRl9GT1JNQVQoYSkpOwotCi0JaWYgKCByYW5rICE9IGl4MS0+aV9yYW5rICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9JTkRFWCwgTlVMTCk7Ci0JCUFJRkFycmF5SW5kZXhGcmVlKGl4MSk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQkvKgotCSoqIENyZWF0ZSByYW5rcCBhcnJheSB1c2VkIGJ5IEFJRkluZGV4SW5SYW5nZSgpLgotCSovCi0JcmFua3AgPSAoaW50ICopX2FpZl9hbGxvYyhyYW5rICogc2l6ZW9mKGludCAqKSk7Ci0KLQkvKgotCSoqIENvbnN0cnVjdCBhIG5ldyBmZHMuCi0JKi8KLQlybCA9IHN0cmxlbihBSUZfRk9STUFUKGEpKSArIDE7Ci0JcmYgPSBmZHMgPSAoY2hhciAqKV9haWZfYWxsb2MocmwpOwotCi0JLyoKLQkqKiBDYWx1Y3VsYXRlIG5yYW5rLCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIChuZXcpIGFycmF5LgotCSoqIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyB3aGVyZSBtbiAhPSBteAotCSoqIChpLmUuIHdoZXJlIGFuIGVtcHR5IHNsaWNlIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQuKQotCSoqIFdoZW4gbW4gJiBteCA9PSAtMSB3ZSBzbGljZSB0aGUgd2hvbGUgZGltZW5zaW9uLgotCSovCi0JZm9yICggaSA9IDAgOyBpIDwgcmFuayA7IGkrKyApCi0JewotCQlpZiAoIG1uW2ldIDwgMCAmJiBteFtpXSA8IDAgKQotCQl7Ci0JCQltbltpXSA9IGl4MS0+aV9taW5baV07Ci0JCQlteFtpXSA9IGl4MS0+aV9tYXhbaV07Ci0JCX0KLQkJZWxzZSBpZgotCQkoCi0JCQltbltpXSA8IGl4MS0+aV9taW5baV0gCi0JCQl8fAotCQkJbW5baV0gPiBpeDEtPmlfbWF4W2ldCi0JCQl8fAotCQkJbXhbaV0gPCBpeDEtPmlfbWluW2ldIAotCQkJfHwKLQkJCW14W2ldID4gaXgxLT5pX21heFtpXQotCQkpCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9JTkRFWCwgTlVMTCk7Ci0JCQlBSUZBcnJheUluZGV4RnJlZShpeDEpOwotCQkJX2FpZl9mcmVlKGZkcyk7Ci0JCQlfYWlmX2ZyZWUocmFua3ApOwotCQkJcmV0dXJuIChBSUYgKilOVUxMOwotCQl9Ci0JCWVsc2UgaWYgKCBtbltpXSA9PSBteFtpXSApCi0JCQljb250aW51ZTsKLQotCQlyYW5rcFtucmFuaysrXSA9IGk7Ci0KLQkJc25wcmludGYocmYsIHJsLCAiW3IlZC4uJWRpczRdIiwgbW5baV0sIG14W2ldKTsKLQkJcmYgKz0gc3RybGVuKHJmKTsKLQkJcmwgLT0gc3RybGVuKHJmKTsKLQl9Ci0KLQlzdHJjcHkocmYsIGl4MS0+aV9idHlwZSk7Ci0KLQkvKgotCSoqIENyZWF0ZSBhIG5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgc2xpY2VkIGFycmF5LgotCSovCi0KLQkvKiBJbiB0aGUgb2xkIGltcGxlbWVudGF0aW9uLCB3ZSB1c2UgOiByYSA9IE1ha2VBSUYoZmRzLCBOVUxMKTsgCi0JICogSG93ZXZlciwgd2l0aCBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgd2UgY2Fubm90IHVzZSBNYWtlQUlGKCkKLQkgKiBzaW5jZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJhIChpLmUuIEFJRl9MRU4ocmEpKSBjYW5ub3QgYmUga25vd24gCi0JICogb25seSBmcm9tIHRoZSB2YXJpYWJsZSAnZmRzJy4KLQkgKi8KLQotCXJhID0gTmV3QUlGKDAsIEJVRlNJWik7Ci0JQUlGX0ZPUk1BVChyYSkgPSBmZHM7Ci0KLQlpZiAoIG5yYW5rID4gMCApCi0JCWl4MiA9IEZEU0FycmF5SW5kZXhJbml0KEFJRl9GT1JNQVQocmEpKTsKLQotCS8qCi0JKiogTm93IGJ1aWxkIHRoZSBkYXRhLgotCSovCi0JZm9yICggaSA9IDAgOyBpIDwgaXgxLT5pX25lbCA7IGkrKyApCi0JewotCQljaGFyICoJZGF0YTsKLQkJY2hhciAqCW5kYXRhOwotCQlpbnQgY291bnRlciwgbGltaXQ7Ci0JCWludCBzaXplID0gMDsKLQkJaW50IHN1YnNpemUgPSAwOwotCQlpbnQgbGVuOwotCi0JCWlmICggIUFJRkluZGV4SW5SYW5nZShyYW5rLCBpeDEtPmlfaW5kZXgsIG1uLCBteCkgKQotCQl7Ci0JCQlBSUZBcnJheUluZGV4SW5jKGl4MSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWxpbWl0ID0gQUlGSW5kZXhPZmZzZXQoaXgxLT5pX3JhbmssIGl4MS0+aV9pbmRleCwgCi0JCQkJCWl4MS0+aV9taW4sIGl4MS0+aV9tYXgsIE5VTEwpOwotCQlmb3IgKCBjb3VudGVyID0gMDsgY291bnRlciA8IGxpbWl0OyBjb3VudGVyKysgKQotCQl7Ci0JCQlzdWJzaXplID0gRkRTRGF0YVNpemUoaXgxLT5pX2J0eXBlLEFJRl9EQVRBKGEpK3NpemUpOwotCQkJc2l6ZSArPSBzdWJzaXplOwotCQl9Ci0KLQkJZGF0YSA9IEFJRl9EQVRBKGEpICsgc2l6ZTsKLQkJbGVuID0gRkRTRGF0YVNpemUoaXgxLT5pX2J0eXBlLCBkYXRhKTsKLQotCQkvKiBvbGQgY29kZTogZGF0YSA9IEFJRl9EQVRBKGEpICsgQUlGSW5kZXhPZmZzZXQoaXgxLT5pX3JhbmssIGl4MS0+aV9pbmRleCwgaXgxLT5pX21pbiwgaXgxLT5pX21heCwgTlVMTCkgKiBpeDEtPmlfYnNpemU7ICovCi0KLQkJaWYgKCBucmFuayA9PSAwICkKLQkJewotCQkJbWVtY3B5KEFJRl9EQVRBKHJhKSwgZGF0YSwgbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc2l6ZSA9IDA7IHN1YnNpemUgPSAwOwotCQlsaW1pdCA9IEFJRkluZGV4T2Zmc2V0KGl4Mi0+aV9yYW5rLCBpeDItPmlfaW5kZXgsIAotCQkJCQlpeDItPmlfbWluLCBpeDItPmlfbWF4LCBOVUxMKTsKLQkJZm9yICggY291bnRlciA9IDA7IGNvdW50ZXIgPCBsaW1pdDsgY291bnRlcisrICkKLQkJewotCQkJc3Vic2l6ZSA9IEZEU0RhdGFTaXplKGl4Mi0+aV9idHlwZSxBSUZfREFUQShyYSkrc2l6ZSk7Ci0JCQlzaXplICs9IHN1YnNpemU7Ci0JCX0KLQotCQluZGF0YSA9IEFJRl9EQVRBKHJhKSArIHNpemU7Ci0KLQkJLyogb2xkIGNvZGU6IG5kYXRhID0gQUlGX0RBVEEocmEpICsgQUlGSW5kZXhPZmZzZXQoaXgyLT5pX3JhbmssIGl4Mi0+aV9pbmRleCwgaXgyLT5pX21pbiwgaXgyLT5pX21heCwgTlVMTCkgKiBpeDItPmlfYnNpemU7ICovCi0KLQkJLyogb2xkIGNvZGU6IG1lbWNweShuZGF0YSwgZGF0YSwgaXgxLT5pX2JzaXplKTsgKi8KLQkJbWVtY3B5KG5kYXRhLCBkYXRhLCBsZW4pOwotCi0JCUFJRkFycmF5SW5kZXhJbmMoaXgxKTsKLQkJQUlGQXJyYXlJbmRleEluYyhpeDIpOwotCX0KLQotCS8qIERvIHByZS1wcm9jZXNzaW5nIGFuZCBwb3N0LXByb2Nlc3Npbmcgc3RlcHMgKi8KLQl7Ci0JCWNoYXIgKiBmID0gQUlGX0ZPUk1BVChhKTsKLQkJY2hhciAqIGQgPSBBSUZfREFUQShhKTsKLQkJY2hhciAqIG47Ci0JCWNoYXIgKiB0bXA7Ci0KLQkJX2FpZl9hcnJheV9zbGljZV9wcmUoJmYsICZkLCByZXNfYXJyYXkpOwotCi0JCWYgPSBBSUZfRk9STUFUKHJhKTsKLQkJZCA9IF9haWZfYWxsb2MoQlVGU0laKTsKLQkJdG1wID0gZDsKLQkJbWVtY3B5KGQsIEFJRl9EQVRBKHJhKSwgQlVGU0laKTsKLQkJbiA9IEFJRl9EQVRBKHJhKTsKLQotCQlfYWlmX2FycmF5X3NsaWNlX3Bvc3QoJmYsICZkLCAmbiwgcmVzX2FycmF5KTsKLQkJLyogd2UgbmVlZCB0byB1c2UgJ3RtcCcgYmVjYXVzZSBhZnRlciB0aGUgY2FsbCBvZgotCQkgKiBfYWlmX2FycmF5X3NsaWNlX3Bvc3QoKSwgZCBwb2ludHMgdG8gdGhlIGVuZCwgdGh1cwotCQkgKiB0aGUgbWVtb3J5IGNhbm5vdCBiZSBmcmVlZCBieSB1c2luZyBfYWlmX2ZyZWUoZCkKLQkJICovCi0KLQkJX2FpZl9mcmVlKHRtcCk7Ci0JfQotCi0JQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQotCWlmICggbnJhbmsgPiAwICkKLQkJQUlGQXJyYXlJbmRleEZyZWUoaXgyKTsKLQotCV9haWZfZnJlZShyYW5rcCk7Ci0KLQlyZXR1cm4gcmE7Ci19Ci0KLS8qCi0gKiBYWFg6IFRPRklYCi0gKi8KLS8qCi0gKiBUaGUgb2xkIEFJRkFycmF5UGVybSgpIHJlbGllZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBlbGVtZW50cyBvZiB0aGUKLSAqIEFJRiBhcnJheSBoYXZlIHRoZSBzYW1lIHNpemUgKGkuZS4gaXQgd3JvdGUgdGhlIGRhdGEgZm9yIHRoZSAKLSAqIHJlc3VsdGFudCBhcnJheSBpbiBhICJyYW5kb20gYWNjZXNzIiB3YXkpLgotICogVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB3ZSBjcmVhdGUgZHluYW1pYyBhcnJheXMgdG8gaG9sZCB0aGUgZGF0YSBhbmQgdGhlCi0gKiBsZW5ndGgsIGFmdGVyIHRoYXQgd2UgaXRlcmF0ZSB0aGUgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgdG8gdGhlIHJlc3VsdGFudAotICogQUlGIGFycmF5LgotICovCi1BSUYgKgotQUlGQXJyYXlQZXJtKEFJRiAqYSwgaW50ICppbmRleCkKLXsKLQlpbnQJCWk7Ci0JaW50CQlybDsKLQljaGFyICoJCXJmOwotCUFJRiAqCQlyYTsKLQlBSUZJbmRleCAqCWl4OwotCWludCAJCWxlbjsKLQotCWNoYXIgKioJCWRhdGFfYXJyYXk7Ci0JaW50ICoJCWxlbl9hcnJheTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCB8fCBpbmRleCA9PSAoaW50ICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JLyoKLQkqKiBJbml0aWFsaXNlIHRoZSBpbmRleCBhcnJheXMuCi0JKi8KLQlpeCA9IEZEU0FycmF5SW5kZXhJbml0KEFJRl9GT1JNQVQoYSkpOwotCi0JLyoKLQkqKiBDcmVhdGUgYSBuZXcgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHBlcm11dGVkIGFycmF5LgotCSovCi0JcmEgPSBOZXdBSUYoc3RybGVuKEFJRl9GT1JNQVQoYSkpKzEsIEJVRlNJWik7Ci0KLQkvKgotCSoqIENvbnN0cnVjdCBhIG5ldyBmZHMuCi0JKi8KLQltZW1jcHkoQUlGX0ZPUk1BVChyYSksIEFJRl9GT1JNQVQoYSksIHN0cmxlbihBSUZfRk9STUFUKGEpKSsxKTsKLQlyZiA9IEFJRl9GT1JNQVQocmEpOwotCXJsID0gc3RybGVuKHJmKSArIDE7Ci0KLQlmb3IgKCBpID0gMCA7IGkgPCBpeC0+aV9yYW5rIDsgaSsrICkKLQl7Ci0JCXNucHJpbnRmKHJmLCBybCwgIltyJWQuLiVkaXM0XSIsIGl4LT5pX21pbltpbmRleFtpXV0sIGl4LT5pX21heFtpbmRleFtpXV0pOwotCQlyZiArPSBzdHJsZW4ocmYpOwotCQlybCAtPSBzdHJsZW4ocmYpOwotCX0KLQotCXN0cmNhdChBSUZfRk9STUFUKHJhKSwgaXgtPmlfYnR5cGUpOwotCi0JbGVuX2FycmF5ID0gX2FpZl9hbGxvYyggaXgtPmlfbmVsICogc2l6ZW9mKGludCkgKTsKLQlkYXRhX2FycmF5ID0gX2FpZl9hbGxvYyggaXgtPmlfbmVsICogc2l6ZW9mKGNoYXIgKikgKTsKLQotCS8qCi0JKiogTm93IGJ1aWxkIHRoZSBkYXRhLgotCSovCi0JZm9yICggaSA9IDAgOyBpIDwgaXgtPmlfbmVsIDsgaSsrICkKLQl7Ci0JCWNoYXIgKglkOwotCQlpbnQgCWNvdW50ZXIsIGxpbWl0OwotCQlpbnQJc2l6ZSA9IDA7IAotCQlpbnQJc3Vic2l6ZSA9IDA7Ci0KLQkJbGltaXQgPSBBSUZJbmRleE9mZnNldChpeC0+aV9yYW5rLCBpeC0+aV9pbmRleCwKLQkJCQlpeC0+aV9taW4sIGl4LT5pX21heCwgTlVMTCk7Ci0KLQkJZm9yICggY291bnRlciA9IDA7IGNvdW50ZXIgPCBsaW1pdDsgY291bnRlcisrICkKLQkJewotCQkJc3Vic2l6ZSA9IEZEU0RhdGFTaXplKGl4LT5pX2J0eXBlLCBBSUZfREFUQShhKStzaXplKTsKLQkJCXNpemUgKz0gc3Vic2l6ZTsKLQkJfQotCi0JCWQgPSBBSUZfREFUQShhKSArIHNpemU7Ci0JCWxlbiA9IEZEU0RhdGFTaXplKGl4LT5pX2J0eXBlLCBkKTsKLQotCQlzaXplID0gMDsgc3Vic2l6ZSA9IDA7Ci0JCWxpbWl0ID0gQUlGSW5kZXhPZmZzZXQoaXgtPmlfcmFuaywgaXgtPmlfaW5kZXgsCi0JCQkJaXgtPmlfbWluLCBpeC0+aV9tYXgsIGluZGV4KTsKLQotCQlkYXRhX2FycmF5W2xpbWl0XSA9IGQ7Ci0JCWxlbl9hcnJheVtsaW1pdF0gPSBsZW47Ci0KLQkJQUlGQXJyYXlJbmRleEluYyhpeCk7Ci0JfQotCi0JbGVuID0gMDsKLQotCS8qIENvcHkgdGhlIGRhdGEgdG8gdGhlIHJlc3VsdGFudCBBSUYgYXJyYXkgKi8KLQlmb3IgKCBpID0gMCA7IGkgPCBpeC0+aV9uZWwgOyBpKysgKQotCXsKLQkJY2hhciAqIHJkOwotCi0JCXJkID0gQUlGX0RBVEEocmEpICsgbGVuOwotCi0JCW1lbWNweShyZCwgZGF0YV9hcnJheVtpXSwgbGVuX2FycmF5W2ldKTsKLQotCQlsZW4gKz0gbGVuX2FycmF5W2ldOwotCX0KLQotCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQotCV9haWZfZnJlZShkYXRhX2FycmF5KTsKLQlfYWlmX2ZyZWUobGVuX2FycmF5KTsKLQotCXJldHVybiByYTsKLX0KLQotY2hhciAqCi1BSUZBcnJheUluZGV4VHlwZShBSUYgKmEpCi17Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gRkRTQXJyYXlJbmRleFR5cGUoQUlGX0ZPUk1BVChhKSk7Ci19Ci0KLWludAotQUlGQXJyYXlNaW5JbmRleChBSUYgKmEsIGludCBuKQotewotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIEZEU0FycmF5TWluSW5kZXgoQUlGX0ZPUk1BVChhKSwgbik7Ci19Ci0KLWludAotQUlGQXJyYXlNYXhJbmRleChBSUYgKmEsIGludCBuKQotewotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIEZEU0FycmF5TWF4SW5kZXgoQUlGX0ZPUk1BVChhKSwgbik7Ci19Ci0KLS8qCi0gKiBUaGUgaW5kZXggYXJyYXkgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiBkYXRhIGluCi0gKiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCBhbmQgYmFzaWNhbGx5IGNvcnJlc3BvbmRzIHRvIGEgbG9vcAotICogY291bnRlciBpbiBub3JtYWwgY2lyY3Vtc3RhbmNlcy4KLSAqLwotCi0jZGVmaW5lIFBFUk1VVEUocCwgZCkgKChwKSAhPSBOVUxMID8gKHApW2RdIDogZCkKLQotLyoKLSAqIEluaXRpYWxpc2UgYW4gaW5kZXggYXJyYXkgdG8gdGhlIG1pbmltdW0gaW5kZXggdmFsdWUgZm9yIGVhY2ggCi0gKiBkaW1lbnNpb24sIGdpdmVuIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyAocmFuayksIGFuZCB0aGUgbWluaW11bSAKLSAqIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiBlYWNoIGRpbWVuc2lvbiAobWluLCBtYXgpLiBSZXR1cm5zIHRoZSBudW1iZXIgCi0gKiBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCi0gKi8KLUFJRkluZGV4ICoKLUFJRkFycmF5SW5kZXhJbml0KEFJRiAqYSkKLXsKLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAoQUlGSW5kZXggKilOVUxMOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gKEFJRkluZGV4ICopTlVMTDsKLQl9Ci0KLQlyZXR1cm4gRkRTQXJyYXlJbmRleEluaXQoQUlGX0ZPUk1BVChhKSk7Ci19Ci0KLS8qCi0gKiBDaGVjayB0aGF0IHRoZSBpbmRleCB2YWx1ZSBvZiBlYWNoIGluZGV4IGluIHJhbmtwIGlzIHdpdGhpbiB0aGUgcmFuZ2UKLSAqIHNwZWNpZmllZCBieSBtaW4gYW5kIG1heC4gUmV0dXJucyAxIGlmIHRoZXkgYXJlLCBvdGhlcndpc2UgMC4KLSAqCi0gKiBOb3RlOiByYW5rcCwgaW5kZXgsIG1pbiBhbmQgbWF4IGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3QKLSAqIHJhbmsgZWxlbWVudHMuCi0gKi8KLWludAotQUlGSW5kZXhJblJhbmdlKGludCByYW5rLCBpbnQgKmluZGV4LCBpbnQgKm1pbiwgaW50ICptYXgpCi17Ci0JaW50CWQ7Ci0KLQlmb3IgKCBkID0gcmFuayAtIDEgOyBkID49IDAgOyBkLS0gKQotCXsKLQkJaWYgKCBtaW5bZF0gPCAwICkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICggaW5kZXhbZF0gPCBtaW5bZF0gfHwgaW5kZXhbZF0gPiBtYXhbZF0gKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBTdGVwIHRocm91Z2ggaW5kZXhlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBwZXJtIGFycmF5LgotICogSW5kZXhlcyBjeWNsZSBmcm9tIG1pbiB0byBtYXguIFJldHVybnMgMSBvbiBjYXJyeSBvdXQuCi0gKi8KLWludAotQUlGQXJyYXlJbmRleEluYyhBSUZJbmRleCAqaXgpCi17Ci0JaW50CWQ7Ci0KLQlmb3IgKCBkID0gaXgtPmlfcmFuayAtIDEgOyBkID49IDAgOyBkLS0gKQotCXsKLQkJaWYgKCArKyhpeC0+aV9pbmRleFtkXSkgPiBpeC0+aV9tYXhbZF0gKQotCQl7Ci0JCQlpeC0+aV9pbmRleFtkXSA9IGl4LT5pX21pbltkXTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JaXgtPmlfZmluaXNoZWQgPSAxOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLUFJRkFycmF5SW5kZXhGcmVlKEFJRkluZGV4ICppeCkKLXsKLQlfYWlmX2ZyZWUoaXgtPmlfYnR5cGUpOwotCV9haWZfZnJlZShpeC0+aV9pbmRleCk7Ci0JX2FpZl9mcmVlKGl4LT5pX21pbik7Ci0JX2FpZl9mcmVlKGl4LT5pX21heCk7Ci0JX2FpZl9mcmVlKGl4KTsKLX0KLQotLyoKLSAqIEluZGV4IGFycmF5IGVsZW1lbnQgYW5kIHJldHVybiBhcyBkb3VibGVzdAotICogWFhYOiBUT0ZJWAotICovCi1pbnQKLUFJRkFycmF5RWxlbWVudFRvRG91Ymxlc3QoQUlGICphLCBBSUZJbmRleCAqaXgsIEFJRkRPVUJMRVNUICp2YWwpCi17Ci0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZUeXBlKGEpICE9IEFJRl9BUlJBWSApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIEFJRkJhc2VUeXBlKGEpICE9IEFJRl9GTE9BVElORyApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gX2FpZl90b19kb3VibGVzdChBSUZfREFUQShhKSArIEFJRkluZGV4T2Zmc2V0KGl4LT5pX3JhbmssIGl4LT5pX2luZGV4LCBpeC0+aV9taW4sIGl4LT5pX21heCwgTlVMTCkgKiBpeC0+aV9ic2l6ZSwgaXgtPmlfYnNpemUsIHZhbCk7Ci19Ci0KLWludAotQUlGQXJyYXlFbGVtZW50VG9Eb3VibGUoQUlGICphLCBBSUZJbmRleCAqaXgsIGRvdWJsZSAqdmFsKQotewotCWludAkJcmVzOwotCUFJRkRPVUJMRVNUCWRkOwotCi0JcmVzID0gQUlGQXJyYXlFbGVtZW50VG9Eb3VibGVzdChhLCBpeCwgJmRkKTsKLQkKLQlpZiAoIHJlcyA+PSAwICkKLQkJKnZhbCA9IChkb3VibGUpZGQ7IC8qIG1heWJlIGxvc2Ugc29tZSBwcmVjaXNpb24gKi8KLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBJbmRleCBhcnJheSBlbGVtZW50IGFuZCByZXR1cm4gYXMgbG9uZ2VzdAotICogWFhYOiBUT0ZJWAotICovCi1pbnQKLUFJRkFycmF5RWxlbWVudFRvTG9uZ2VzdChBSUYgKmEsIEFJRkluZGV4ICppeCwgQUlGTE9OR0VTVCAqdmFsKQotewotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZCYXNlVHlwZShhKSAhPSBBSUZfSU5URUdFUiApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gX2FpZl90b19sb25nZXN0KEFJRl9EQVRBKGEpICsgQUlGSW5kZXhPZmZzZXQoaXgtPmlfcmFuaywgaXgtPmlfaW5kZXgsIGl4LT5pX21pbiwgaXgtPmlfbWF4LCBOVUxMKSAqIGl4LT5pX2JzaXplLCBpeC0+aV9ic2l6ZSwgdmFsKTsKLX0KLQotaW50Ci1BSUZBcnJheUVsZW1lbnRUb0ludChBSUYgKmEsIEFJRkluZGV4ICppeCwgaW50ICp2YWwpCi17Ci0JaW50CQlyZXM7Ci0JQUlGTE9OR0VTVAlsOwotCi0JcmVzID0gQUlGQXJyYXlFbGVtZW50VG9Mb25nZXN0KGEsIGl4LCAmbCk7Ci0KLQlpZiAoIHJlcyA+PSAwICkKLQkJKnZhbCA9IChpbnQpbDsKLQkKLQlyZXR1cm4gcmVzOwotfQotCi1BSUYgKgotX2FpZl9hcnJheV9yZWYoQUlGICphLCBpbnQgcmFuaywgaW50ICppbmRleCwgaW50ICptaW4sIGludCAqbWF4LCBjaGFyICpidHlwZSwgaW50IGJzaXplKQotewotCUFJRiAqCWFlOwotCWludAljb3VudGVyOwotCWludAlvZmZzZXQ7Ci0JY2hhciAqCXRoZUZvcm1hdDsKLQljaGFyICoJZGF0YVN0YXJ0OwotCWNoYXIgKglkYXRhRW5kOwotCi0JYWUgPSBNYWtlQUlGKHN0cmR1cChidHlwZSksIE5VTEwpOwotCi0Jb2Zmc2V0ID0gQUlGSW5kZXhPZmZzZXQocmFuaywgaW5kZXgsIG1pbiwgbWF4LCAoaW50ICopTlVMTCk7Ci0JZGF0YUVuZCA9IEFJRl9EQVRBKGEpOwotCi0JZm9yICggY291bnRlciA9IDAgOyBjb3VudGVyIDw9IG9mZnNldCA7IGNvdW50ZXIrKyApCi0JewotCQl0aGVGb3JtYXQgPSBidHlwZTsKLQkJZGF0YVN0YXJ0ID0gZGF0YUVuZDsKLQkJX2Zkc19za2lwX2RhdGEoJnRoZUZvcm1hdCwgJmRhdGFFbmQpOwotCX0KLQotCUFJRl9EQVRBKGFlKSA9IF9haWZfYWxsb2MoZGF0YUVuZCAtIGRhdGFTdGFydCArIDEpOwotCW1lbWNweShBSUZfREFUQShhZSksIGRhdGFTdGFydCwgZGF0YUVuZCAtIGRhdGFTdGFydCk7Ci0KLQlyZXR1cm4gYWU7Ci19Ci0KLS8qCi0gKiBDb21wdXRlIHNpemUgb2YgYXJyYXkuCi0gKi8KLWludAotX2FpZl9hcnJheV9zaXplKGNoYXIgKmZkcywgY2hhciAqZGF0YSkKLXsKLQlpbnQJCWk7Ci0JaW50CQluID0gMDsKLQljaGFyICoJCWRzdGFydDsKLQljaGFyICoJCWZtdDsKLQljaGFyICoJCWJ0eXBlOwotCUFJRkluZGV4ICoJaXg7Ci0KLQlpeCA9IEZEU0FycmF5SW5kZXhJbml0KGZkcyk7Ci0KLQlidHlwZSA9IEZEU0Jhc2VUeXBlKGZkcyk7Ci0KLQlmb3IgKCBpID0gMCA7IGkgPD0gaXgtPmlfbmVsIDsgaSsrICkKLQl7Ci0JCWZtdCA9IGJ0eXBlOwotCQlkc3RhcnQgPSBkYXRhOwotCQlfZmRzX3NraXBfZGF0YSgmZm10LCAmZGF0YSk7Ci0JCW4gKz0gZGF0YSAtIGRzdGFydDsKLQl9Ci0KLQlBSUZBcnJheUluZGV4RnJlZShpeCk7Ci0KLQlyZXR1cm4gbjsKLX0KLQotLyoKLSAqIFJldHVybiBhcnJheSBlbGVtZW50IGF0IGluZGV4LgotICovCi1BSUYgKgotQUlGQXJyYXlFbGVtZW50KEFJRiAqYSwgQUlGSW5kZXggKml4KQotewotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JaWYgKCBpeC0+aV9maW5pc2hlZCApCi0JCXJldHVybiAoQUlGICopTlVMTDsKLQotCXJldHVybiBfYWlmX2FycmF5X3JlZihhLCBpeC0+aV9yYW5rLCBpeC0+aV9pbmRleCwgaXgtPmlfbWluLCBpeC0+aV9tYXgsIGl4LT5pX2J0eXBlLCBpeC0+aV9ic2l6ZSk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gYXJyYXkgZWxlbWVudCBhdCBsb2NhdGlvbi4KLSAqLwotQUlGICoKLUFJRkFycmF5UmVmKEFJRiAqYSwgaW50IHJhbmssIGludCAqbG9jKQotewotCWludAkJaTsKLQlBSUYgKgkJYWU7Ci0JQUlGSW5kZXggKglpeDsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfQVJSQVkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JaXggPSBBSUZBcnJheUluZGV4SW5pdChhKTsKLQotCWlmICggcmFuayAhPSBpeC0+aV9yYW5rICkKLQl7Ci0JCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0lOREVYLCBOVUxMKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCWZvciAoIGkgPSAwIDsgaSA8IHJhbmsgOyBpKysgKQotCXsKLQkJaWYgKCBsb2NbaV0gPCBpeC0+aV9taW5baV0gfHwgbG9jW2ldID4gaXgtPmlfbWF4W2ldICkKLQkJewotCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgpOwotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0lOREVYLCBOVUxMKTsKLQkJCXJldHVybiAoQUlGICopTlVMTDsKLQkJfQotCX0KLQotCWFlID0gX2FpZl9hcnJheV9yZWYoYSwgaXgtPmlfcmFuaywgbG9jLCBpeC0+aV9taW4sIGl4LT5pX21heCwgaXgtPmlfYnR5cGUsIGl4LT5pX2JzaXplKTsKLQotCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQotCXJldHVybiBhZTsKLX0KLQotLyoKLSAqIENvcHkgZGF0YSBpbnRvIGFuIGFycmF5LgotICogWFhYOiBUT0ZJWAotICovCi1pbnQKLUFJRlNldEFycmF5RGF0YShBSUYgKmRzdCwgQUlGSW5kZXggKml4LCBBSUYgKnNyYykKLXsKLQljaGFyICoJZGQ7Ci0KLQlpZgotCSgKLQkJZHN0ID09IChBSUYgKilOVUxMCi0JCXx8Ci0JCXNyYyA9PSAoQUlGICopTlVMTAotCQl8fAotCQlpeCA9PSAoQUlGSW5kZXggKilOVUxMCi0JKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9ICAgICAgICAgICAgICAgCi0KLQlpZgotCSggCi0JCUFJRlR5cGUoZHN0KSAhPSBBSUZfQVJSQVkKLQkJfHwKLQkJQUlGQmFzZVR5cGUoZHN0KSAhPSBBSUZUeXBlKHNyYykKLQkpCi0JeyAgICAgICAKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGQgPSBBSUZfREFUQShkc3QpICsgQUlGSW5kZXhPZmZzZXQoaXgtPmlfcmFuaywgaXgtPmlfaW5kZXgsIGl4LT5pX21pbiwgaXgtPmlfbWF4LCBOVUxMKSAqIGl4LT5pX2JzaXplOwotCi0JbWVtY3B5KGRkLCBBSUZfREFUQShzcmMpLCBpeC0+aV9ic2l6ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSB0aGUgZGF0YSBvZmZzZXQgaW4gdGhlIGFycmF5IGdpdmVuIHRoZSBjdXJyZW50IHZhbHVlCi0gKiBvZiB0aGUgaW5kZXhlcywgYW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGluZGljZXMgb2YgZWFjaCBkaW1lbnNpb24uCi0gKi8KLWludAotQUlGSW5kZXhPZmZzZXQoaW50IHJhbmssIGludCAqaW5kZXgsIGludCAqbWluLCBpbnQgKm1heCwgaW50ICpwZXJtKQotewotCWludAlkOwotCWludAlwOwotCWludAlvZmYgPSAwOwotCWludAlzeiA9IDE7Ci0KLQlmb3IgKCBkID0gcmFuayAtIDEgOyBkID49IDAgOyBkLS0gKQotCXsKLQkJcCA9IFBFUk1VVEUocGVybSwgZCk7Ci0JCW9mZiArPSAoaW5kZXhbcF0gLSBtaW5bcF0pICogc3o7Ci0JCXN6ICo9IG1heFtwXSAtIG1pbltwXSArIDE7Ci0JfQotCi0JcmV0dXJuIG9mZjsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NhbGMuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NhbGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwOTE3Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jYWxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQ1ICswLDAgQEAKLS8qCi0gKiBSb3V0aW5lcyB0aGF0IHN1cHBvcnQgYXJpdGhtZXRpYy9sb2dpY2FsIG9wZXJhdGlvbnMgb24KLSAqIEFJRiBvYmplY3RzLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIGJ5IEd1YXJkc29mdCBQdHkgTHRkLgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIFRoZSBfYWlmX2Rpdl9pbnQoKSByb3V0aW5lIHdhcyBkZXJpdmVkIGZyb20gc291cmNlIHVuZGVyCi0gKiB0aGUgZm9sbG93aW5nIGNvcHlyaWdodDoKLSAqCi0gKiAgIFVzZSBvZiB0aGlzIHByb2dyYW0sIGZvciBhbnkgcHVycG9zZSwgaXMgZ3JhbnRlZCB0aGUgYXV0aG9yLAotICogICBJYW4gS2FwbGFuLCBhcyBsb25nIGFzIHRoaXMgY29weXJpZ2h0IG5vdGljZSBpcyBpbmNsdWRlZCBpbgotICogICB0aGUgc291cmNlIGNvZGUgb3IgYW55IHNvdXJjZSBjb2RlIGRlcml2ZWQgZnJvbSB0aGlzIHByb2dyYW0uCi0gKiAgIFRoZSB1c2VyIGFzc3VtZXMgYWxsIHJlc3BvbnNpYmlsaXR5IGZvciB1c2luZyB0aGlzIGNvZGUuCi0gKgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZQk8Y29uZmlnLmg+Ci0jZW5kaWYgLyogSEFWRV9DT05GSUdfSCAqLwotCi0jaW5jbHVkZQk8c3RkaW8uaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLQotI2luY2x1ZGUJImFpZi5oIgotI2luY2x1ZGUJImFpZmVyci5oIgotI2luY2x1ZGUJImFpZmludC5oIgotCi0jaWYgZGVmaW5lZChXSU5ET1dTTlQpIHx8IGRlZmluZWQoV0lOMzIpCi0jZGVmaW5lIEJJVFNQRVJCWVRFICAgICA4Ci0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSNpbmNsdWRlICAgICAgICA8c3lzL3R5cGVzLmg+Ci0jZGVmaW5lIEJJVFNQRVJCWVRFICAgICBOQkJZCi0jZWxzZQotI2luY2x1ZGUgICAgICAgIDx2YWx1ZXMuaD4KLSNlbmRpZiAvKiBXSU5ET1dTTlQgfHwgV0lOMzIgKi8KLQotLyoKLSAqIEJvb2xlYW4gYml0d2lzZSBhbmQuCi0gKi8KLXZvaWQKLV9haWZfYW5kX2Jvb2woY2hhciAqcmQsIGNoYXIgKmQxLCBpbnQgbDEsIGNoYXIgKmQyLCBpbnQgbDIpCi17Ci0JX2FpZl9hbmRfaW50KHJkLCBkMSwgbDEsIGQyLCBsMik7Ci19Ci0KLS8qCi0gKiBCb29sZWFuIGJpdHdpc2Ugb3IuCi0gKi8KLXZvaWQKLV9haWZfb3JfYm9vbChjaGFyICpyZCwgY2hhciAqZDEsIGludCBsMSwgY2hhciAqZDIsIGludCBsMikKLXsKLQlfYWlmX29yX2ludChyZCwgZDEsIGwxLCBkMiwgbDIpOwotfQotCi0vKgotICogQm9vbGVhbiAyJ3MgY29tcGxpbWVudC4KLSAqLwotdm9pZAotX2FpZl9ub3RfYm9vbChjaGFyICpyZCwgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlfYWlmX25vdF9pbnQocmQsIGRhdGEsIGxlbik7Ci19Ci0KLS8qCi0gKiBJbnRlZ2VyIDIncyBjb21wbGltZW50LgotICovCi12b2lkCi1fYWlmX25vdF9pbnQoY2hhciAqcmQsIGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0JQUlGTE9OR0VTVAl2YWw7Ci0KLQlfYWlmX3RvX2xvbmdlc3QoZGF0YSwgbGVuLCAmdmFsKTsKLQl2YWwgPSB+dmFsOwotCV9sb25nZXN0X3RvX2FpZigmcmQsIGxlbiwgdmFsKTsKLX0KLQotLyoKLSAqIEludGVnZXIgbmVnYXRpb24uCi0gKi8KLXZvaWQKLV9haWZfbmVnX2ludChjaGFyICpyZCwgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlBSUZMT05HRVNUCXZhbDsKLQotCV9haWZfdG9fbG9uZ2VzdChkYXRhLCBsZW4sICZ2YWwpOwotCXZhbCA9IC12YWw7Ci0JX2xvbmdlc3RfdG9fYWlmKCZyZCwgbGVuLCB2YWwpOwotfQotCi0vKgotICogSW50ZWdlciBhZGRpdGlvbi4KLSAqLwotdm9pZAotX2FpZl9hZGRfaW50KGNoYXIgKnJkLCBjaGFyICpkMSwgaW50IGwxLCBjaGFyICpkMiwgaW50IGwyKQotewotCUFJRkxPTkdFU1QJdmFsMTsKLQlBSUZMT05HRVNUCXZhbDI7Ci0JQUlGTE9OR0VTVAl2YWw7Ci0KLQlfYWlmX3RvX2xvbmdlc3QoZDEsIGwxLCAmdmFsMSk7Ci0JX2FpZl90b19sb25nZXN0KGQyLCBsMiwgJnZhbDIpOwotCXZhbCA9IHZhbDEgKyB2YWwyOwotCV9sb25nZXN0X3RvX2FpZigmcmQsIE1BWChsMSwgbDIpLCB2YWwpOwotfQotCi0vKgotICogSW50ZWdlciBiaXR3aXNlIGFuZC4KLSAqLwotdm9pZAotX2FpZl9hbmRfaW50KGNoYXIgKnJkLCBjaGFyICpkMSwgaW50IGwxLCBjaGFyICpkMiwgaW50IGwyKQotewotCUFJRkxPTkdFU1QJdmFsMTsKLQlBSUZMT05HRVNUCXZhbDI7Ci0JQUlGTE9OR0VTVAl2YWw7Ci0KLQlfYWlmX3RvX2xvbmdlc3QoZDEsIGwxLCAmdmFsMSk7Ci0JX2FpZl90b19sb25nZXN0KGQyLCBsMiwgJnZhbDIpOwotCXZhbCA9IHZhbDEgJiB2YWwyOwotCV9sb25nZXN0X3RvX2FpZigmcmQsIE1BWChsMSwgbDIpLCB2YWwpOwotfQotCi0vKgotICogSW50ZWdlciBiaXR3aXNlIG9yLgotICovCi12b2lkCi1fYWlmX29yX2ludChjaGFyICpyZCwgY2hhciAqZDEsIGludCBsMSwgY2hhciAqZDIsIGludCBsMikKLXsKLQlBSUZMT05HRVNUCXZhbDE7Ci0JQUlGTE9OR0VTVAl2YWwyOwotCUFJRkxPTkdFU1QJdmFsOwotCi0JX2FpZl90b19sb25nZXN0KGQxLCBsMSwgJnZhbDEpOwotCV9haWZfdG9fbG9uZ2VzdChkMiwgbDIsICZ2YWwyKTsKLQl2YWwgPSB2YWwxIHwgdmFsMjsKLQlfbG9uZ2VzdF90b19haWYoJnJkLCBNQVgobDEsIGwyKSwgdmFsKTsKLX0KLQotLyoKLSAqIEludGVnZXIgc3VidHJhY3Rpb24uCi0gKi8KLXZvaWQKLV9haWZfc3ViX2ludChjaGFyICpyZCwgY2hhciAqZDEsIGludCBsMSwgY2hhciAqZDIsIGludCBsMikKLXsKLQlBSUZMT05HRVNUCXZhbDE7Ci0JQUlGTE9OR0VTVAl2YWwyOwotCUFJRkxPTkdFU1QJdmFsOwotCi0JX2FpZl90b19sb25nZXN0KGQxLCBsMSwgJnZhbDEpOwotCV9haWZfdG9fbG9uZ2VzdChkMiwgbDIsICZ2YWwyKTsKLQl2YWwgPSB2YWwxIC0gdmFsMjsKLQlfbG9uZ2VzdF90b19haWYoJnJkLCBNQVgobDEsIGwyKSwgdmFsKTsKLX0KLQotLyoKLSAqIEludGVnZXIgbXVsdGlwbGljYXRpb24uIFJlc3VsdCBpcyBzYW1lIHNpemUgYXMgdGhlIGxhcmdlc3QKLSAqIGFyZ3VtZW50LiAKLSAqLwotdm9pZAotX2FpZl9tdWxfaW50KGNoYXIgKnJkLCBjaGFyICpkMSwgaW50IGwxLCBjaGFyICpkMiwgaW50IGwyKQotewotCUFJRkxPTkdFU1QJdmFsMTsKLQlBSUZMT05HRVNUCXZhbDI7Ci0JQUlGTE9OR0VTVAl2YWw7Ci0KLQlfYWlmX3RvX2xvbmdlc3QoZDEsIGwxLCAmdmFsMSk7Ci0JX2FpZl90b19sb25nZXN0KGQyLCBsMiwgJnZhbDIpOwotCXZhbCA9IHZhbDEgKiB2YWwyOwotCV9sb25nZXN0X3RvX2FpZigmcmQsIE1BWChsMSwgbDIpLCB2YWwpOwotfSAKLQotLyoKLSAqIENvbXBhcmUgdHdvIGludGVnZXJzLiBSZXR1cm5zOgotICoJLTEgaWYgZDEgPCBkMgotICoJIDAgaWYgZDEgPT0gZDIKLSAqCSAxIGlmIGQxID4gZDIKLSAqLwotaW50Ci1jb21wYXJlX2ludChjaGFyICpkMSwgaW50IGwxLCBjaGFyICpkMiwgaW50IGwyKQotewotCWludAlzMSA9IDA7Ci0JaW50CXMyID0gMDsKLQotCWlmICggbDIgPiBsMSApCi0JewotCQlmb3IgKCBzMiA9IDAgOyBzMiA8IGwyLWwxOyBzMisrICkKLQkJCWlmICggZDJbczJdICE9IDB4MCApCi0JCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JewotCQlmb3IgKCBzMSA9IDAgOyBzMSA8IGwxLWwyOyBzMSsrICkKLQkJCWlmICggZDFbczFdICE9IDB4MCApCi0JCQkJcmV0dXJuIDE7Ci0JfQotCi0JZm9yICggOyBzMSA8IGwxIDsgczErKywgczIrKykKLQl7Ci0JCWlmICggZDJbczJdID4gZDFbczFdICkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIGQyW3MyXSA8IGQxW3MxXSApCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNoaWZ0IGQsIHMgYml0cyB0byB0aGUgbGVmdC4gcyA8IEJJVFNQRVJCWVRFLiBSZXN1bHQgaW4gci4KLSAqIGQgYW5kIHIgY2FuIG92ZXJsYXAsIGJ1dCBtdXN0IGJlIHRoZSBzYW1lIHNpemUuCi0gKi8KLXZvaWQKLWxzaGlmdF9pbnQodW5zaWduZWQgY2hhciAqciwgdW5zaWduZWQgY2hhciAqZCwgaW50IGwsIGludCBzKQotewotCWludAlpOwotCWludAlzMiA9IEJJVFNQRVJCWVRFIC0gczsKLQotCi0JZm9yICggaSA9IDAgOyBpIDwgbC0xIDsgaSsrICkKLQkJcltpXSA9IChkW2ldIDw8IHMpIHwgKGRbaSsxXSA+PiBzMik7Ci0KLQlyW2ldID0gZFtpXSA8PCBzOwotfQotCi0vKgotICogU2hpZnQgZCwgcyBiaXRzIHRvIHRoZSByaWdodC4gcyA8IEJJVFNQRVJCWVRFLiBSZXN1bHQgaW4gci4KLSAqIGQgYW5kIHIgY2FuIG92ZXJsYXAsIGJ1dCBtdXN0IGJlIHRoZSBzYW1lIHNpemUuCi0gKi8KLXZvaWQKLXJzaGlmdF9pbnQodW5zaWduZWQgY2hhciAqciwgdW5zaWduZWQgY2hhciAqZCwgaW50IGwsIGludCBzKQotewotCWludAlpOwotCWludAlzMiA9IEJJVFNQRVJCWVRFIC0gczsKLQotCi0JZm9yICggaSA9IGwtMSA7IGkgPiAwIDsgaS0tICkKLQkJcltpXSA9IChkW2ldID4+IHMpIHwgKGRbaS0xXSA8PCBzMik7Ci0KLQlyWzBdID0gZFswXSA+PiBzOwotfQotCi0vKgotICogSW50ZWdlciBkaXZpc2lvbiBkMS9kMiA9IHJxICsgcnIvZDIuIFF1b3RpZW50IGlzIHNhbWUgc2l6ZSBhcyB0aGUgbGFyZ2VzdAotICogYXJndW1lbnQuIE5vdGU6IGQyICE9IDAuCi0gKgotICogWFhYIG5lZWQgdG8gY2hlY2sgcmVtYWluZGVyIGZvciBjb3JyZWN0IHNpZ24uCi0gKi8KLXZvaWQKLV9haWZfZGl2X2ludChjaGFyICpycSwgY2hhciAqcnIsIGNoYXIgKmQxLCBpbnQgbDEsIGNoYXIgKmQyLCBpbnQgbDIpCi17Ci0JQUlGTE9OR0VTVAl2YWwxOwotCUFJRkxPTkdFU1QJdmFsMjsKLQlBSUZMT05HRVNUCXZhbDsKLQotCV9haWZfdG9fbG9uZ2VzdChkMSwgbDEsICZ2YWwxKTsKLQlfYWlmX3RvX2xvbmdlc3QoZDIsIGwyLCAmdmFsMik7Ci0JdmFsID0gdmFsMSAvIHZhbDI7Ci0JX2xvbmdlc3RfdG9fYWlmKCZycSwgTUFYKGwxLCBsMiksIHZhbCk7Ci0JdmFsID0gdmFsMSAlIHZhbDI7Ci0JX2xvbmdlc3RfdG9fYWlmKCZyciwgTUFYKGwxLCBsMiksIHZhbCk7Ci19IAotCi0vKgotICogUGVyZm9ybSBhIGJpbmFyeSBpbnRlZ2VyIG9wZXJhdGlvbi4KLSAqLwotaW50Ci1fYWlmX2JpbmFyeV9vcF9pbnQoYWlmb3Agb3AsIGNoYXIgKipyZCwgY2hhciAqZDEsIGludCBsMSwgY2hhciAqZDIsIGludCBsMikKLXsKLQljaGFyICoJcnQ9TlVMTDsKLQotCi0JaWYgKCBsMSA+IHNpemVvZihBSUZMT05HRVNUKSApCi0JCWZwcmludGYoc3RkZXJyLCAiYmluYXJ5IGludCBvcGVyYXRpb246IGFyZzEgZXhjZWVkcyBwcmVjaXNpb25cbiIpOwotCi0JaWYgKCBsMiA+IHNpemVvZihBSUZMT05HRVNUKSApCi0JCWZwcmludGYoc3RkZXJyLCAiYmluYXJ5IGludCBvcGVyYXRpb246IGFyZzIgZXhjZWVkcyBwcmVjaXNpb25cbiIpOwotCi0Jc3dpdGNoICggb3AgKQotCXsKLQljYXNlIEFJRk9QX0FERDoKLQljYXNlIEFJRk9QX1NVQjoKLQljYXNlIEFJRk9QX01VTDoKLQljYXNlIEFJRk9QX0FORDoKLQljYXNlIEFJRk9QX09SOgotCQlpZiAoICpyZCA9PSBOVUxMICkKLQkJCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhNQVgobDEsIGwyKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZPUF9ESVY6Ci0JY2FzZSBBSUZPUF9SRU06Ci0JCWlmICggKnJkID09IE5VTEwgKQotCQkJKnJkID0gKGNoYXIgKilfYWlmX2FsbG9jKGwxKTsKLQotCQkvKgotCQkqKiBUZW1wIGZvciBxdW90aWVudC4KLQkJKi8KLQkJcnQgPSAoY2hhciAqKV9haWZfYWxsb2MobDEpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXN3aXRjaCAoIG9wICkKLQl7Ci0JY2FzZSBBSUZPUF9BREQ6Ci0JCV9haWZfYWRkX2ludCgqcmQsIGQxLCBsMSwgZDIsIGwyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk9QX1NVQjoKLQkJX2FpZl9zdWJfaW50KCpyZCwgZDEsIGwxLCBkMiwgbDIpOwotCQlicmVhazsKLQotCWNhc2UgQUlGT1BfTVVMOgotCQlfYWlmX211bF9pbnQoKnJkLCBkMSwgbDEsIGQyLCBsMik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZPUF9BTkQ6Ci0JCV9haWZfYW5kX2ludCgqcmQsIGQxLCBsMSwgZDIsIGwyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk9QX09SOgotCQlfYWlmX29yX2ludCgqcmQsIGQxLCBsMSwgZDIsIGwyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk9QX0RJVjoKLQkJaWYgKCBfYWlmX2ludF9pc196ZXJvKGQyLCBsMikgKQotCQl7Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQVJJVEgsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJX2FpZl9kaXZfaW50KCpyZCwgcnQsIGQxLCBsMSwgZDIsIGwyKTsKLQotCQlfYWlmX2ZyZWUocnQpOwotCQlicmVhazsKLQotCWNhc2UgQUlGT1BfUkVNOgotCQlpZiAoIF9haWZfaW50X2lzX3plcm8oZDIsIGwyKSApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9BUklUSCwgTlVMTCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlfYWlmX2Rpdl9pbnQocnQsICpyZCwgZDEsIGwxLCBkMiwgbDIpOwotCi0JCV9haWZfZnJlZShydCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGEgYmluYXJ5IGJvb2xlYW4gb3BlcmF0aW9uLgotICovCi1pbnQKLV9haWZfYmluYXJ5X29wX2Jvb2woYWlmb3Agb3AsIGNoYXIgKipyZCwgY2hhciAqZDEsIGludCBsMSwgY2hhciAqZDIsIGludCBsMikKLXsKLQlpZiAoICpyZCA9PSBOVUxMICkKLQkJKnJkID0gKGNoYXIgKilfYWlmX2FsbG9jKE1BWChsMSwgbDIpKTsKLQotCXN3aXRjaCAoIG9wICkKLQl7Ci0JY2FzZSBBSUZPUF9BTkQ6Ci0JCV9haWZfYW5kX2Jvb2woKnJkLCBkMSwgbDEsIGQyLCBsMik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZPUF9PUjoKLQkJX2FpZl9vcl9ib29sKCpyZCwgZDEsIGwxLCBkMiwgbDIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogUGVyZm9ybSBhIHVuYXJ5IGJvb2xlYW4gb3BlcmF0aW9uLgotICovCi1pbnQKLV9haWZfdW5hcnlfb3BfYm9vbChhaWZvcCBvcCwgY2hhciAqKnJkLCBjaGFyICpkLCBpbnQgbCkKLXsKLQlpZiAoICpyZCA9PSBOVUxMICkKLQkJKnJkID0gKGNoYXIgKilfYWlmX2FsbG9jKGwpOwotCi0Jc3dpdGNoICggb3AgKQotCXsKLQljYXNlIEFJRk9QX05PVDoKLQkJX2FpZl9ub3RfYm9vbCgqcmQsIGQsIGwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogUGVyZm9ybSBhIHVuYXJ5IGludGVnZXIgb3BlcmF0aW9uLgotICovCi1pbnQKLV9haWZfdW5hcnlfb3BfaW50KGFpZm9wIG9wLCBjaGFyICoqcmQsIGNoYXIgKmQsIGludCBsKQotewotCWlmICggKnJkID09IE5VTEwgKQotCQkqcmQgPSAoY2hhciAqKV9haWZfYWxsb2MobCk7Ci0KLQlzd2l0Y2ggKCBvcCApCi0JewotCWNhc2UgQUlGT1BfTkVHOgotCQlfYWlmX25lZ19pbnQoKnJkLCBkLCBsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk9QX05PVDoKLQkJX2FpZl9ub3RfaW50KCpyZCwgZCwgbCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGEgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbi4KLSAqLwotaW50Ci1fYWlmX2JpbmFyeV9vcF9mbG9hdChhaWZvcCBvcCwgY2hhciAqKnJkLCBjaGFyICpkMSwgaW50IGwxLCBjaGFyICpkMiwgaW50IGwyKQotewotCUFJRkRPVUJMRVNUCXY7Ci0JQUlGRE9VQkxFU1QJdjE7Ci0JQUlGRE9VQkxFU1QJdjI7Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlpZgotCSgKLQkJX2FpZl90b19kb3VibGVzdChkMSwgbDEsICZ2MSkgPCAwCi0JCXx8Ci0JCV9haWZfdG9fZG91Ymxlc3QoZDIsIGwyLCAmdjIpIDwgMAotCSkKLQkJcmV0dXJuIC0xOwotCi0Jc3dpdGNoICggb3AgKQotCXsKLQljYXNlIEFJRk9QX0FERDoKLQkJdiA9IHYxICsgdjI7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZPUF9TVUI6Ci0JCXYgPSB2MSAtIHYyOwotCQlicmVhazsKLQotCWNhc2UgQUlGT1BfTVVMOgotCQl2ID0gdjEgKiB2MjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk9QX0RJVjoKLQkJLyoKLQkJKiogTGV0IGZsb2F0aW5nIHBvaW50IC8gZGVhbCB3aXRoIHYyID09IDAuCi0JCSovCi0JCXYgPSB2MSAvIHYyOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggTUFYKGwxLCBsMikgPiBzaXplb2YoZmxvYXQpICkKLQkJcmV0dXJuIF9kb3VibGVzdF90b19haWYocmQsIE1BWChsMSwgbDIpLCB2KTsKLQllbHNlCi0JCXJldHVybiBfZG91Ymxlc3RfdG9fYWlmKHJkLCBsMSwgdik7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGEgdW5hcnkgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uLgotICovCi1pbnQKLV9haWZfdW5hcnlfb3BfZmxvYXQoYWlmb3Agb3AsIGNoYXIgKipyZCwgY2hhciAqZDEsIGludCBsMSkKLXsKLQlBSUZET1VCTEVTVAl2OwotCUFJRkRPVUJMRVNUCXYxOwotCi0JaWYgKCBfYWlmX3RvX2RvdWJsZXN0KGQxLCBsMSwgJnYxKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQlzd2l0Y2ggKCBvcCApCi0JewotCWNhc2UgQUlGT1BfTkVHOgotCQl2ID0gLXYxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiBfZG91Ymxlc3RfdG9fYWlmKHJkLCBsMSwgdik7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGEgYmluYXJ5IG9wZXJhdGlvbi4gQXJndW1lbnRzIGNhbiBiZSBpbnRlZ2VyIG9yCi0gKiBmbG9hdGluZyBwb2ludCBvciBzdHJ1Y3RzIG9yIGFycmF5cyByZXN1bHRpbmcgaW4gc3VjaC4KLSAqIEFkdmFuY2UgdGhlIGRhdGEgYW5kIGZvcm1hdCBwb2ludGVycyBhY3Jvc3MgdGhlIGRhdGEuCi0gKiBSZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuCi0gKiBSZXN1bHQgaW4gcmQgYW5kIHJmLgotICogSWYgcmQgaXMgbnVsbCwgd2UgZ2VuZXJhdGUgb3VyIG93biBmb3JtYXQgYW5kIGRhdGEgc3RyaW5ncy4gIEl0IGlzCi0gKiBpbXBvc3NpYmxlIHRvIGRlY2lkZSB0aGUgcHJvcGVyIGxlbmd0aCBmb3IgdGhlIGRhdGEgZm9yIHN0cnVjdHVyZWQgdHlwZXM7IHdlCi0gKiBtYWtlIHdpbGQgZ3Vlc3Nlcy4gIEl0J3MgYSBidWcuCi0gKi8KLWludAotX2FpZl9iaW5hcnlfb3AoYWlmb3Agb3AsIAotCWNoYXIgKipyZiwgY2hhciAqKnJkLCAKLQljaGFyICoqZjEsIGNoYXIgKipkMSwKLQljaGFyICoqZjIsIGNoYXIgKipkMikKLXsKLQlpbnQJaTsKLQlpbnQJYnl0ZXMxOwotCWludAlieXRlczI7Ci0JaW50CWJ5dGVzMzsKLQljaGFyICoJZDsKLQljaGFyICoJZm10OwotCWNoYXIgKglkMyA9IE5VTEw7Ci0JaW50IHJlczsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCV9mZHNfcmVzb2x2ZShmMSk7Ci0JX2Zkc19yZXNvbHZlKGYyKTsKLQotCWlmICggRkRTVHlwZSgqZjEpID09IEFJRl9SRUZFUkVOQ0UgKQotCXsKLQkJZm10ID0gX2Zkc19sb29rdXAoZjEpOwotCQlyZXR1cm4gX2FpZl9iaW5hcnlfb3Aob3AsIHJmLCByZCwgJmZtdCwgZDEsIGYyLCBkMik7Ci0JfQotCi0JaWYgKCBGRFNUeXBlKCpmMikgPT0gQUlGX1JFRkVSRU5DRSApCi0JewotCQlmbXQgPSBfZmRzX2xvb2t1cChmMik7Ci0JCXJldHVybiBfYWlmX2JpbmFyeV9vcChvcCwgcmYsIHJkLCBmMSwgZDEsICZmbXQsIGQyKTsKLQl9Ci0KLQlzd2l0Y2ggKCBGRFNUeXBlKCpmMSkgKQotCXsKLQljYXNlIEFJRl9FTlVNOgotCQlieXRlczEgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYxKTsKLQotCQlzd2l0Y2ggKCBGRFNUeXBlKCpmMikgKQotCQl7Ci0JCWNhc2UgQUlGX0VOVU06Ci0JCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCQlieXRlczIgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYyKTsKLQotCQkJaWYgKCBfYWlmX2JpbmFyeV9vcF9pbnQob3AsIHJkLCAqZDEsIGJ5dGVzMSwgKmQyLCBieXRlczIpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQkoKmQxKSArPSBieXRlczE7Ci0JCQkoKmQyKSArPSBieXRlczI7Ci0KLQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCSpyZiA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDEsIE1BWChieXRlczEsIGJ5dGVzMikpKTsKLQkJCWVsc2UKLQkJCXsKLQkJCQljaGFyICp0MSwgKnQyOwotCQkJCWludCBsZW47Ci0KLQkJCQl0MSA9IHN0cnN0cigqcmYsICpmMSk7CQotCi0JCQkJaWYgKCB0MSA9PSBOVUxMICkKLQkJCQl7Ci0JCQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCXQyID0gX2Zkc19iYXNlX3R5cGUodDEpOwotCQkJCWxlbiA9IHN0cmxlbih0Mik7Ci0JCQkJbWVtbW92ZSh0MSwgdDIsIGxlbisxKTsKLQkJCX0KLQotCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCV9mZHNfYWR2YW5jZShmMik7Ci0KLQkJCXJldHVybiAwOwotCi0JCWNhc2UgQUlGX0ZMT0FUSU5HOgotCQkJYnl0ZXMyID0gX2Zkc19jb3VudF9ieXRlc19uYShmMik7Ci0KLQkJCWlmICggKGJ5dGVzMyA9IF9haWZfaW50X3RvX2FpZl9mbG9hdCgmZDMsICpkMSwgYnl0ZXMxKSkgPCAwICkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCWlmICggX2FpZl9iaW5hcnlfb3BfZmxvYXQob3AsIHJkLCBkMywgYnl0ZXMzLCAqZDIsIGJ5dGVzMikgPCAwICkKLQkJCXsKLQkJCQlfYWlmX2ZyZWUoZDMpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJKCpkMSkgKz0gYnl0ZXMxOwotCQkJKCpkMikgKz0gYnl0ZXMyOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkgCi0JCQkJKnJmID0gc3RyZHVwKEFJRl9GTE9BVElOR19UWVBFKE1BWChieXRlczIsIGJ5dGVzMykpKTsKLQkJCWVsc2UKLQkJCXsKLQkJCQljaGFyICp0MSwgKnQyOwotCQkJCWludCBsZW47Ci0KLQkJCQl0MSA9IHN0cnN0cigqcmYsICpmMSk7CQotCi0JCQkJaWYgKCB0MSA9PSBOVUxMICkKLQkJCQl7Ci0JCQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCXQyID0gdDE7Ci0JCQkJX2Zkc19hZHZhbmNlKCZ0Mik7Ci0JCQkJbGVuID0gc3RybGVuKHQyKTsKLQkJCQkqdDEgPSBGRFNfRkxPQVRJTkc7Ci0JCQkJKih0MSsxKSA9IChjaGFyKSBNQVgoYnl0ZXMyLCBieXRlczMpOwotCQkJCW1lbW1vdmUodDErMiwgdDIsIGxlbisxKTsKLQkJCX0KLQotCQkJX2FpZl9mcmVlKGQzKTsKLQotCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCV9mZHNfYWR2YW5jZShmMik7Ci0KLQkJCXJldHVybiAwOwotCi0JCWRlZmF1bHQ6Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQ09OViwgTlVMTCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JCS8qIGNhc2UgQUlGX0VOVU0gKi8KLQotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCWJ5dGVzMSA9IF9mZHNfY291bnRfYnl0ZXNfbmEoZjEpOwotCi0JCXN3aXRjaCAoIEZEU1R5cGUoKmYyKSApCi0JCXsKLQkJY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQljYXNlIEFJRl9JTlRFR0VSOgotCQljYXNlIEFJRl9FTlVNOgotCQkJYnl0ZXMyID0gX2Zkc19jb3VudF9ieXRlc19uYShmMik7Ci0KLQkJCWlmICggX2FpZl9iaW5hcnlfb3BfaW50KG9wLCByZCwgKmQxLCBieXRlczEsICpkMiwgYnl0ZXMyKSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJKCpkMSkgKz0gYnl0ZXMxOwotCQkJKCpkMikgKz0gYnl0ZXMyOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQkqcmYgPSBzdHJkdXAoQUlGX0lOVEVHRVJfVFlQRSgKLQkJCQkJRkRTSXNTaWduZWQoKmYxKSB8fCBGRFNJc1NpZ25lZCgqZjIpLAotCQkJCQlNQVgoYnl0ZXMxLCBieXRlczIpKSk7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEFJRl9GTE9BVElORzoKLQkJCWJ5dGVzMiA9IF9mZHNfY291bnRfYnl0ZXNfbmEoZjIpOwotCi0JCQlpZiAoIChieXRlczMgPSBfYWlmX2ludF90b19haWZfZmxvYXQoJmQzLCAqZDEsIGJ5dGVzMSkpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAoIF9haWZfYmluYXJ5X29wX2Zsb2F0KG9wLCByZCwgZDMsIGJ5dGVzMywgKmQyLCBieXRlczIpIDwgMCApCi0JCQl7Ci0JCQkJX2FpZl9mcmVlKGQzKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCSgqZDEpICs9IGJ5dGVzMTsKLQkJCSgqZDIpICs9IGJ5dGVzMjsKLQotCQkJaWYgKCAqcmYgPT0gTlVMTCApIAotCQkJCSpyZiA9IHN0cmR1cChBSUZfRkxPQVRJTkdfVFlQRShNQVgoYnl0ZXMyLCBieXRlczMpKSk7Ci0KLQkJCV9haWZfZnJlZShkMyk7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEFJRl9WT0lEOgotCQkJZCA9IE5VTEw7Ci0JCQlyZXMgPSAxOwotCQkJaWYgKCBfbG9uZ2VzdF90b19haWYoJmQsIHNpemVvZihpbnQpLCAoQUlGTE9OR0VTVClyZXMpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQkqcmQgPSBkOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQkqcmYgPSBzdHJkdXAoQUlGX0lOVEVHRVJfVFlQRSgxLCBzaXplb2YoaW50KSkpOwotCi0JCQlyZXR1cm4gMDsKLQotCi0JCWRlZmF1bHQ6Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQ09OViwgTlVMTCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JCS8qIGNhc2UgQUlGX0lOVEVHRVIgKi8KLQotCWNhc2UgQUlGX0ZMT0FUSU5HOgotCQlieXRlczEgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYxKTsKLQotCQlzd2l0Y2ggKCBGRFNUeXBlKCpmMikgKQotCQl7Ci0JCWNhc2UgQUlGX0VOVU06Ci0JCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCQlieXRlczIgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYyKTsKLQotCQkJaWYgKCAoYnl0ZXMzID0gX2FpZl9pbnRfdG9fYWlmX2Zsb2F0KCZkMywgKmQyLCBieXRlczIpKSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJaWYgKCBfYWlmX2JpbmFyeV9vcF9mbG9hdChvcCwgcmQsICpkMSwgYnl0ZXMxLCBkMywgYnl0ZXMzKSA8IDAgKQotCQkJewotCQkJCV9haWZfZnJlZShkMyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQkoKmQxKSArPSBieXRlczE7Ci0JCQkoKmQyKSArPSBieXRlczI7Ci0KLQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCSpyZiA9IHN0cmR1cChBSUZfRkxPQVRJTkdfVFlQRShNQVgoYnl0ZXMyLCBieXRlczMpKSk7Ci0KLQkJCV9haWZfZnJlZShkMyk7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQlyZXR1cm4gMDsKLQkJCQotCQljYXNlIEFJRl9GTE9BVElORzoKLQkJCWJ5dGVzMiA9IF9mZHNfY291bnRfYnl0ZXNfbmEoZjIpOwotCi0JCQlpZiAoIF9haWZfYmluYXJ5X29wX2Zsb2F0KG9wLCByZCwgKmQxLCBieXRlczEsICpkMiwgYnl0ZXMyKSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJKCpkMSkgKz0gYnl0ZXMxOwotCQkJKCpkMikgKz0gYnl0ZXMyOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQkqcmYgPSBzdHJkdXAoQUlGX0ZMT0FUSU5HX1RZUEUoTUFYKGJ5dGVzMSwgYnl0ZXMyKSkpOwotCi0JCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBBSUZfVk9JRDoKLQkJCWQgPSBOVUxMOwotCQkJcmVzID0gMTsKLQkJCWlmICggX2xvbmdlc3RfdG9fYWlmKCZkLCBzaXplb2YoaW50KSwgKEFJRkxPTkdFU1QpcmVzKSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJKnJkID0gZDsKLQotCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJKnJmID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMSwgc2l6ZW9mKGludCkpKTsKLQotCQkJcmV0dXJuIDA7Ci0KLQkJZGVmYXVsdDoKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUlGX0JPT0xFQU46Ci0JCWJ5dGVzMSA9IF9mZHNfY291bnRfYnl0ZXNfbmEoZjEpOwotCQlieXRlczIgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYyKTsKLQotCQlzd2l0Y2ggKCBGRFNUeXBlKCpmMikgKQotCQl7Ci0JCWNhc2UgQUlGX0JPT0xFQU46Ci0JCQlpZiAoIF9haWZfYmluYXJ5X29wX2Jvb2wob3AsIHJkLCAqZDEsIGJ5dGVzMSwgKmQyLCBieXRlczIpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQkqcmYgPSBzdHJkdXAoQUlGX0JPT0xFQU5fVFlQRSgpKTsKLQotCQkJKmQxICs9IGJ5dGVzMTsKLQkJCSpkMiArPSBieXRlczI7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQlyZXR1cm4gMDsKLQotCQlkZWZhdWx0OgotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQlieXRlczEgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYxKTsKLQkJYnl0ZXMyID0gX2Zkc19jb3VudF9ieXRlc19uYShmMik7Ci0KLQkJc3dpdGNoICggRkRTVHlwZSgqZjIpICkKLQkJewotCQljYXNlIEFJRl9JTlRFR0VSOgotCQkJaWYgKCBfYWlmX2JpbmFyeV9vcF9pbnQob3AsIHJkLCAqZDEsIGJ5dGVzMSwgKmQyLCBieXRlczIpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQkqZDEgKz0gYnl0ZXMxOwotCQkJKmQyICs9IGJ5dGVzMjsKLQotCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJKnJmID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoCi0JCQkJCQlGRFNJc1NpZ25lZCgqZjIpLAotCQkJCQkJTUFYKGJ5dGVzMSwgYnl0ZXMyKSkpOwotCi0JCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQkJaWYgKCBfYWlmX2JpbmFyeV9vcF9pbnQob3AsIHJkLCAqZDEsIGJ5dGVzMSwgKmQyLCBieXRlczIpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQkqcmYgPSBzdHJkdXAoQUlGX0NIQVJBQ1RFUl9UWVBFKCkpOwotCi0JCQkqZDEgKz0gYnl0ZXMxOwotCQkJKmQyICs9IGJ5dGVzMjsKLQotCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCV9mZHNfYWR2YW5jZShmMik7Ci0KLQkJCXJldHVybiAwOwotCi0JCWNhc2UgQUlGX1ZPSUQ6Ci0JCQlkID0gTlVMTDsKLQkJCXJlcyA9IDE7Ci0JCQlpZiAoIF9sb25nZXN0X3RvX2FpZigmZCwgc2l6ZW9mKGludCksIChBSUZMT05HRVNUKXJlcykgPCAwICkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCSpyZCA9IGQ7Ci0KLQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCSpyZiA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDEsIHNpemVvZihpbnQpKSk7Ci0KLQkJCXJldHVybiAwOwotCi0JCWRlZmF1bHQ6Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQ09OViwgTlVMTCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9BUlJBWToKLQkJewotCQkJQUlGSW5kZXggKglpeDE7Ci0JCQlBSUZJbmRleCAqCWl4MjsKLQkJCWNoYXIgKgkJZm10MTsKLQkJCWNoYXIgKgkJZm10MjsKLQkJCWNoYXIgKgkJZnJlcyA9IE5VTEw7Ci0JCQljaGFyICoJCWRyZXMgPSBOVUxMOwotCi0JCQlpZiAoIEZEU1R5cGUoKmYyKSAhPSBBSUZfQVJSQVkgKQotCQkJewotCQkJCWlmICggRkRTVHlwZSgqZjIpID09IEFJRl9WT0lEICkKLQkJCQl7Ci0JCQkJCWQgPSBOVUxMOwotCQkJCQlyZXMgPSAxOwotCQkJCQlpZiAoIF9sb25nZXN0X3RvX2FpZigmZCwgc2l6ZW9mKGludCksIChBSUZMT05HRVNUKXJlcykgPCAwICkKLQkJCQkJCXJldHVybiAtMTsKLQotCQkJCQkqcmQgPSBkOwotCi0JCQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCQkJKnJmID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMSwgc2l6ZW9mKGludCkpKTsKLQotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0KLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpeDEgPSBGRFNBcnJheUluZGV4SW5pdCgqZjEpOwotCQkJaXgyID0gRkRTQXJyYXlJbmRleEluaXQoKmYyKTsKLQotCQkJaWYgKCBpeDEtPmlfbmVsICE9IGl4Mi0+aV9uZWwgKQotCQkJewotCQkJCVNldEFJRkVycm9yKEFJRkVSUl9TSVpFLCBOVUxMKTsKLQkJCQlBSUZBcnJheUluZGV4RnJlZShpeDEpOwotCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpZiAoICpyZCA9PSBOVUxMICkKLQkJCQkqcmQgPSAoY2hhciAqKV9haWZfYWxsb2MoQlVGU0laKTsgLyogbm8gd2F5IHRvIGtub3cgaG93IGJpZyEgKi8KLQotCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJKnJmID0gc3RyZHVwKCpmMSk7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7IC8qIHNraXAgb3ZlciB0aGUgZW50aXJlIGFycmF5IGZkcyAqLwotCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJLyoKLQkJCSoqIElmIG5lbFsxMl0gPiBNQVhfQUREUkVTUyB0aGVuIHdlIGFyZSBub3QgZ29pbmcgdG8gYmUKLQkJCSoqIGFibGUgdG8gYWRkcmVzcyBhbGwgdGhlIGRhdGEgaW4gdGhlIGFycmF5LiBXaGF0IHNob3VsZAotCQkJKiogd2UgZG8/Ci0JCQkqLwotCi0JCQlkID0gKnJkOyAvKiBzdGFydCBvZiBvdXIgZGF0YSByZXN1bHQgcmVnaW9uICovCi0KLQkJCWZvciAoIGkgPSAwIDsgaSA8IGl4MS0+aV9uZWwgOyBpKysgKQotCQkJewotCQkJCWNoYXIgKiB0bXAxOwotCQkJCWNoYXIgKiB0bXAyOwotCi0JCQkJaWYgKCBkcmVzICE9IE5VTEwpIAotCQkJCXsKLQkJCQkJX2FpZl9mcmVlKGRyZXMpOwotCQkJCQlkcmVzID0gTlVMTDsKLQkJCQl9Ci0KLQkJCQlpZiAoIGZyZXMgIT0gTlVMTCkgCi0JCQkJewotCQkJCQlfYWlmX2ZyZWUoZnJlcyk7Ci0JCQkJCWZyZXMgPSBOVUxMOwotCQkJCX0KLQotCQkJCWZtdDEgPSBpeDEtPmlfYnR5cGU7Ci0JCQkJZm10MiA9IGl4Mi0+aV9idHlwZTsKLQotCQkJCWlmICggX2FpZl9iaW5hcnlfb3Aob3AsICZmcmVzLCAmZHJlcywgJmZtdDEsIGQxLCAmZm10MiwgZDIgKSA8IDAgKQotCQkJCXsKLQkJCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQkJCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgyKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCUFJRkFycmF5SW5kZXhJbmMoaXgxKTsKLQkJCQlBSUZBcnJheUluZGV4SW5jKGl4Mik7Ci0KLQkJCQl0bXAxID0gZnJlczsKLQkJCQl0bXAyID0gZHJlczsKLQkJCQlfZmRzX3NraXBfZGF0YSgmdG1wMSwgJnRtcDIpOwotCQkJCW1lbWNweShkLCBkcmVzLCB0bXAyLWRyZXMpOwotCQkJCWQgKz0gKHRtcDItZHJlcyk7Ci0JCQl9Ci0KLQkJCXsKLQkJCQljaGFyICp0MSwgKnQyOwotCQkJCWludCBsZW47Ci0KLQkJCQl0MSA9IF9mZHNfYmFzZV90eXBlKCpyZik7Ci0JCQkJdDIgPSB0MTsKLQkJCQlfZmRzX2FkdmFuY2UoJnQyKTsKLQotCQkJCWxlbiA9IHN0cmxlbihmcmVzKTsKLQkJCQltZW1tb3ZlKHQxLCBmcmVzLCBsZW4pOwotCQkJCXQxICs9IGxlbjsKLQotCQkJCWlmICggKnQyICE9ICdcMCcgKQotCQkJCXsKLQkJCQkJbGVuID0gc3RybGVuKHQyKTsKLQkJCQkJbWVtbW92ZSh0MSwgdDIsIGxlbisxKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQkqdDEgPSAnXDAnOwotCQkJfQotCi0JCQlfYWlmX2ZyZWUoZnJlcyk7Ci0JCQlfYWlmX2ZyZWUoZHJlcyk7Ci0KLQkJCWZtdCA9ICpyZjsKLQkJCV9mZHNfYWR2YW5jZSgmZm10KTsKLQkJCSpmbXQgPSAnXDAnOwotCi0JCQlBSUZBcnJheUluZGV4RnJlZShpeDEpOwotCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgyKTsKLQkJfQotCi0JCXJldHVybiAwOwotCi0JLyogb25seSB3b3JrcyB3aXRoIHRoZSBwdWJsaWMgc2VjdGlvbiBpbiBBSUZfU1RSVUNUICovCi0JY2FzZSBBSUZfU1RSVUNUOgotCQlpZiAoIEZEU1R5cGUoKmYyKSAhPSBBSUZfU1RSVUNUICkKLQkJewotCQkJaWYgKCBGRFNUeXBlKCpmMikgPT0gQUlGX1ZPSUQgKQotCQkJewotCQkJCWQgPSBOVUxMOwotCQkJCXJlcyA9IDE7Ci0JCQkJaWYgKCBfbG9uZ2VzdF90b19haWYoJmQsIHNpemVvZihpbnQpLCAoQUlGTE9OR0VTVClyZXMpIDwgMCApCi0JCQkJCXJldHVybiAtMTsKLQotCQkJCSpyZCA9IGQ7Ci0KLQkJCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQkJKnJmID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMSwgc2l6ZW9mKGludCkpKTsKLQotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoICpyZCA9PSBOVUxMICkKLQkJCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhCVUZTSVopOyAvKiBubyB3YXkgdG8ga25vdyBob3cgYmlnISAqLwotCi0JCWlmICggKnJmID09IE5VTEwgKQotCQkJKnJmID0gc3RyZHVwKCpmMSk7IC8qIGluY2x1ZGVzIHRyYWlsaW5nIGp1bmsuICBidWcuICovCi0KLQkJZCA9ICpyZDsgLyogc3RhcnQgb2Ygb3VyIGRhdGEgcmVzdWx0IHJlZ2lvbiAqLwotCi0JCSgqZjEpKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCQkoKmYyKSsrOyAvKiBwYXN0IG9wZW4gYnJhY2UgKi8KLQotCQlfZmRzX3NraXBpZChmMSk7Ci0JCV9mZHNfc2tpcGlkKGYyKTsKLQotCQl3aGlsZSAoICoqZjEgIT0gJzsnICkKLQkJeyAvKiBkbyBvbmUgZmllbGQgKi8KLQotCQkJY2hhciAqIGRyZXMgPSBOVUxMOwotCQkJY2hhciAqIGZyZXMgPSBOVUxMOwotCQkJY2hhciAqIHRtcDE7Ci0JCQljaGFyICogdG1wMjsKLQotCQkJaWYgKCoqZjIgPT0gJzsnKSB7IC8qIGYxIGhhcyBtb3JlIGZpZWxkcyAqLwotCQkJCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCSpmMSA9IHN0cmNocigqZjEsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsgLyogdG8gc3RhcnQgb2YgZmllbGQqLwotCQkJKmYyID0gc3RyY2hyKCpmMiwgRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORCkgKyAxOyAvKiB0byBzdGFydCBvZiBmaWVsZCovCi0JCQkKLQkJCWZtdCA9ICpmMTsKLQotCQkJaWYgKCBfYWlmX2JpbmFyeV9vcChvcCwgJmZyZXMsICZkcmVzLCBmMSwgZDEsIGYyLCBkMiApIDwgMCApCi0JCQkJcmV0dXJuIC0xOyAvKiBub24temVybyByZXMgbWVhbnMgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIgKi8KLQotCQkJdG1wMSA9IGZyZXM7Ci0JCQl0bXAyID0gZHJlczsKLQkJCV9mZHNfc2tpcF9kYXRhKCZ0bXAxLCAmdG1wMik7Ci0JCQltZW1jcHkoZCwgZHJlcywgdG1wMi1kcmVzKTsKLQkJCWQgKz0gKHRtcDItZHJlcyk7Ci0KLQkJCXsKLQkJCQljaGFyICp0MSwgKnQyOwotCQkJCWludCBsZW47Ci0KLQkJCQl0MSA9IHN0cnN0cigqcmYsIGZtdCk7Ci0JCQkJdDIgPSB0MTsKLQkJCQlfZmRzX2FkdmFuY2UoJnQyKTsKLQotCQkJCWxlbiA9IHN0cmxlbihmcmVzKTsKLQkJCQltZW1tb3ZlKHQxLCBmcmVzLCBsZW4pOwotCQkJCXQxICs9IGxlbjsKLQotCQkJCWlmICggdDEgIT0gdDIgKQotCQkJCXsKLQkJCQkJbGVuID0gc3RybGVuKHQyKTsKLQkJCQkJbWVtbW92ZSh0MSwgdDIsIGxlbisxKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCV9haWZfZnJlZShmcmVzKTsKLQkJCV9haWZfZnJlZShkcmVzKTsKLQotCQkJaWYgKCAqKmYxID09ICcsJyApCi0JCQkJKCpmMSkrKzsKLQotCQkJaWYgKCAqKmYyID09ICcsJyApCi0JCQkJKCpmMikrKzsKLQkJfSAvKiBvbmUgZmllbGQgKi8KLQotCQlpZiAoICoqZjIgIT0gJzsnICkKLQkJeyAvKiBmMiBoYXMgbW9yZSBmaWVsZHMgKi8KLQkJCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWZtdCA9ICpyZjsKLQkJX2Zkc19hZHZhbmNlKCZmbXQpOwotCQkqZm10ID0gJ1wwJzsKLQotCQkqZjEgPSBzdHJjaHIoKmYxLCAnfScpICsgMTsgLyogdG8gc3RhcnQgb2YgZmllbGQqLwotCQkqZjIgPSBzdHJjaHIoKmYyLCAnfScpICsgMTsgLyogdG8gc3RhcnQgb2YgZmllbGQqLwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfUE9JTlRFUjoKLQkJaWYgKCBGRFNUeXBlKCpmMikgIT0gQUlGX1BPSU5URVIgKQotCQl7Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpbnQgICAgcmV0OwotCQkJaW50ICAgIGxlbjsKLQkJCWludCAgICBmZHNfdHlwZTsKLQkJCWNoYXIgKiB0bXAxOwotCQkJY2hhciAqIHRtcDI7Ci0JCQljaGFyICogcHRyX3R5cGVfMSA9ICpkMTsKLQkJCWNoYXIgKiBwdHJfdHlwZV8yID0gKmQyOwotCi0JCQljaGFyICogdGFyZ2V0MSA9IF9maW5kX3RhcmdldChkMSwgMCk7Ci0JCQljaGFyICogdGFyZ2V0MiA9IF9maW5kX3RhcmdldChkMiwgTUFYX1ZBTFVFU19TRUVOLzIpOwotCi0JCQljaGFyICogZnJlczsKLQkJCWNoYXIgKiBkcmVzOwotCi0JCQlpZiAoIHRhcmdldDEgPT0gMCAmJiB0YXJnZXQyID09IDAgKSAvKiBpZiBpdCBpcyBOVUxMICovCi0JCQl7Ci0JCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJewotCQkJCQl0bXAyID0gKmYxOwotCQkJCQl0bXAxID0gdG1wMjsKLQkJCQkJX2Zkc19hZHZhbmNlKCZ0bXAxKTsKLQkJCQkJbGVuID0gdG1wMSAtIHRtcDI7Ci0JCQkJCSpyZiA9IF9haWZfYWxsb2Moc2l6ZW9mKGNoYXIpKmxlbiArIDEpOwotCQkJCQlzdHJuY3B5KCpyZiwgdG1wMiwgbGVuKTsKLQkJCQkJKCpyZilbbGVuXSA9ICdcMCc7Ci0JCQkJfQotCi0JCQkJaWYgKCAqcmQgIT0gTlVMTCApCi0JCQkJCV9haWZfZnJlZSgqcmQpOwotCQkJCSpyZCA9IF9haWZfYWxsb2MoMSk7Ci0JCQkJKipyZCA9IChjaGFyKSAwOwotCi0JCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWlmICggKnB0cl90eXBlXzEgPT0gQUlGX1BUUl9SRUZFUkVOQ0UgfHwKLQkJCSAgICAgKnB0cl90eXBlXzIgPT0gQUlGX1BUUl9SRUZFUkVOQ0UgKQotCQkJewotCQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCXsKLQkJCQkJdG1wMiA9ICgqcHRyX3R5cGVfMT09QUlGX1BUUl9SRUZFUkVOQ0UpPwkJCQkJCSAJKmYxIDogKmYyOwotCi0JCQkJCXRtcDEgPSB0bXAyOwotCQkJCQlfZmRzX2FkdmFuY2UoJnRtcDEpOwotCQkJCQlsZW4gPSB0bXAxIC0gdG1wMjsKLQkJCQkJKnJmID0gX2FpZl9hbGxvYyhzaXplb2YoY2hhcikqbGVuICsgMSk7Ci0JCQkJCXN0cm5jcHkoKnJmLCB0bXAyLCBsZW4pOwotCQkJCQkoKnJmKVtsZW5dID0gJ1wwJzsKLQkJCQl9Ci0KLQkJCQlpZiAoICpyZCAhPSBOVUxMICkKLQkJCQkJX2FpZl9mcmVlKCpyZCk7Ci0JCQkJKnJkID0gX2FpZl9hbGxvYyg1KTsgLyogMSArIDQgKHB0ciBuYW1lKSAqLwotCQkJCQotCQkJCWlmICgqcHRyX3R5cGVfMSA9PSBBSUZfUFRSX1JFRkVSRU5DRSkKLQkJCQl7Ci0JCQkJCWludCBpOwotCQkJCQlmb3IgKCBpID0gMDsgaSA8IDU7IGkrKykgKCpyZClbaV0gPSBwdHJfdHlwZV8xW2ldOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpbnQgaTsKLQkJCQkJZm9yICggaSA9IDA7IGkgPCA1OyBpKyspICgqcmQpW2ldID0gcHRyX3R5cGVfMltpXTsKLQkJCQl9Ci0KLQkJCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJCV9mZHNfYWR2YW5jZShmMik7Ci0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0YXJnZXQxID09IDAgKSAgICAgLyogdGFyZ2V0MSBpcyBudWxsLCBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQyIGFzIHRoZSByZXN1bHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcmYgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gKmYyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mZHNfYWR2YW5jZSgmdG1wMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdG1wMSAtIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJmID0gX2FpZl9hbGxvYyhzaXplb2YoY2hhcikqbGVuICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweSgqcmYsIHRtcDIsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpyZilbbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpyZCAhPSBOVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWlmX2ZyZWUoKnJkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIF9kMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogX2QyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2QyID0gcHRyX3R5cGVfMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZDEgPSBfZDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9ICpmMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAxID0gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmRzX3NraXBfZGF0YSgmdG1wMSwgJl9kMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gX2QxIC0gX2QyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZCA9IF9haWZfYWxsb2Moc2l6ZW9mKGNoYXIpKmxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCpyZCwgX2QyLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zkc19hZHZhbmNlKGYxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmMikrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zkc19za2lwX2RhdGEoZjIsIGQyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0YXJnZXQyID09IDAgKSAgICAgLyogdGFyZ2V0MiBpcyBudWxsLCBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQxIGFzIHRoZSByZXN1bHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcmYgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gKmYxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mZHNfYWR2YW5jZSgmdG1wMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdG1wMSAtIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJmID0gX2FpZl9hbGxvYyhzaXplb2YoY2hhcikqbGVuICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweSgqcmYsIHRtcDIsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpyZilbbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpyZCAhPSBOVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWlmX2ZyZWUoKnJkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIF9kMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogX2QyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2QyID0gcHRyX3R5cGVfMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZDEgPSBfZDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2QxID0gX2QyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSAqZjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMSA9IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zkc19za2lwX2RhdGEoJnRtcDEsICZfZDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IF9kMSAtIF9kMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmQgPSBfYWlmX2FsbG9jKHNpemVvZihjaGFyKSpsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgqcmQsIF9kMiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mZHNfYWR2YW5jZShmMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZjEpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mZHNfc2tpcF9kYXRhKGYxLCBkMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQkJCSgqZjEpKys7Ci0JCQkoKmYyKSsrOwotCi0JCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCXsKLQkJCQkqcmYgPSBfYWlmX2FsbG9jKEJVRlNJWik7Ci0JCQkJKipyZiA9ICdcMCc7Ci0JCQkJc3RyY2F0KCpyZiwgIl4iKTsKLQkJCX0KLQotCQkJaWYgKCAqcmQgIT0gTlVMTCApCi0JCQkJX2FpZl9mcmVlKCpyZCk7Ci0JCQkqcmQgPSAoY2hhciAqKV9haWZfYWxsb2MoQlVGU0laKTsKLQotCQkJaWYgKCAqcHRyX3R5cGVfMSA9PSBBSUZfUFRSX05BTUUgKQotCQkJewotCQkJCWludCBpOwotCQkJCWZvciAoIGkgPSAwOyBpIDwgNTsgaSsrKSAoKnJkKVtpXSA9IHB0cl90eXBlXzFbaV07Ci0JCQl9Ci0JCQllbHNlCi0JCQkJKipyZCA9IChjaGFyKSBBSUZfUFRSX05PUk1BTDsKLQotCQkJZHJlcyA9IE5VTEw7Ci0JCQlmcmVzID0gTlVMTDsKLQotCQkJZmRzX3R5cGUgPSBGRFNUeXBlKCpmMSk7Ci0JCQl0bXAxID0gKmYxOwotCi0JCQlyZXQgPSBfYWlmX2JpbmFyeV9vcChvcCwgJmZyZXMsICZkcmVzLCBmMSwgZDEsIGYyLCBkMik7Ci0KLQkJCXsKLQkJCQljaGFyICogZmYgPSBmcmVzOwotCQkJCWNoYXIgKiBkZCA9IGRyZXM7Ci0KLQkJCQlfZmRzX3NraXBfZGF0YSgmZmYsICZkZCk7Ci0KLQkJCQlpZiAoICpwdHJfdHlwZV8xID09IEFJRl9QVFJfTkFNRSApCi0JCQkJCW1lbWNweSgoKnJkKSs1LCBkcmVzLCBkZC1kcmVzKTsKLQkJCQllbHNlCi0JCQkJCW1lbWNweSgoKnJkKSsxLCBkcmVzLCBkZC1kcmVzKTsKLQotCQkJCWlmICggZmRzX3R5cGUgPT0gQUlGX1JFRkVSRU5DRSApCi0JCQkJewotCQkJCQltZW1jcHkoKCpyZikrMSwgdG1wMSwgKmYxLXRtcDEpOwotCQkJCQkoKnJmKVsxICsgKmYxIC0gdG1wMV0gPSAnXDAnOwotCQkJCX0KLQkJCQllbHNlIGlmICggZmRzX3R5cGUgPT0gQUlGX05BTUUgKQotCQkJCXsKLQkJCQkJdG1wMiA9IHRtcDE7Ci0JCQkJCXRtcDIrKzsKLQkJCQkJdG1wMiA9IF9mZHNfc2tpcG51bSh0bXAyKTsKLQkJCQkJdG1wMisrOwotCi0JCQkJCW1lbWNweSgoKnJmKSsxLCB0bXAxLCB0bXAyLXRtcDEpOwotCQkJCQkoKnJmKVsxICsgdG1wMiAtIHRtcDFdID0gJ1wwJzsKLQotCQkJCQlzdHJuY2F0KCgqcmYpLCBmcmVzLCBmZi1mcmVzKzEpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0cm5jYXQoKCpyZiksIGZyZXMsIGZmLWZyZXMrMSk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXQ7Ci0KLQkJfQotCi0JY2FzZSBBSUZfU1RSSU5HOgotCQlpZiAoIEZEU1R5cGUoKmYyKSAhPSBBSUZfU1RSSU5HIHx8IG9wICE9IEFJRk9QX0FERCApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCSgqZjEpKys7IC8qIHBhc3QgInMiICovCi0JCSgqZjIpKys7IC8qIHBhc3QgInMiICovCi0KLQkJYnl0ZXMxID0gKCooKmQxKSsrICYgMHhmZikgPDwgODsKLQkJYnl0ZXMxICs9ICooKmQxKSsrICYgMHhmZjsKLQkJYnl0ZXMyID0gKCooKmQyKSsrICYgMHhmZikgPDwgODsKLQkJYnl0ZXMyICs9ICooKmQyKSsrICYgMHhmZjsKLQotICAgICAgICAgICAgICAgIGlmICggKnJkICE9IE5VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgX2FpZl9mcmVlKCpyZCk7Ci0KLQkJZCA9IF9haWZfYWxsb2MoYnl0ZXMxICsgYnl0ZXMyICsgMik7Ci0KLQkJZFswXSA9ICgoYnl0ZXMxICsgYnl0ZXMyKSA+PiA4KSAmIDB4ZmY7Ci0JCWRbMV0gPSAoYnl0ZXMxICsgYnl0ZXMyKSAmIDB4ZmY7Ci0KLQkJbWVtY3B5KGQrMiwgKmQxLCBieXRlczEpOwotCQltZW1jcHkoZCsyK2J5dGVzMSwgKmQyLCBieXRlczIpOwotCi0JCSpkMSArPSBieXRlczE7Ci0JCSpkMiArPSBieXRlczI7Ci0KLQkJKnJkID0gZDsKLQotCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCSpyZiA9IHN0cmR1cChBSUZfU1RSSU5HX1RZUEUoKSk7Ci0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIEFJRl9WT0lEOgotCQlpZiAoIEZEU1R5cGUoKmYyKSA9PSBBSUZfVk9JRCApCi0JCXsKLQkJCWQgPSBOVUxMOwotCQkJcmVzID0gMDsKLQkJCWlmICggX2xvbmdlc3RfdG9fYWlmKCZkLCBzaXplb2YoaW50KSwgKEFJRkxPTkdFU1QpcmVzKSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJKnJkID0gZDsKLQotCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJKnJmID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMSwgc2l6ZW9mKGludCkpKTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlkID0gTlVMTDsKLQkJCXJlcyA9IDE7Ci0JCQlpZiAoIF9sb25nZXN0X3RvX2FpZigmZCwgc2l6ZW9mKGludCksIChBSUZMT05HRVNUKXJlcykgPCAwICkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCSpyZCA9IGQ7Ci0KLQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCSpyZiA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDEsIHNpemVvZihpbnQpKSk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JZGVmYXVsdDoKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotfQotCi0vKgotICogUGVyZm9ybSBhIHVuYXJ5IG9wZXJhdGlvbi4gQXJndW1lbnQgY2FuIGJlIGludGVnZXIgb3IKLSAqIGZsb2F0aW5nIHBvaW50IG9yIHN0cnVjdHMgb3IgYXJyYXlzIHJlc3VsdGluZyBpbiBzdWNoLgotICogQWR2YW5jZSB0aGUgZGF0YSBhbmQgZm9ybWF0IHBvaW50ZXJzIGFjcm9zcyB0aGUgZGF0YS4KLSAqIFJldHVybiAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4KLSAqIFJlc3VsdCBpbiByZCBhbmQgcmYuCi0gKiBJZiByZCBpcyBudWxsLCB3ZSBnZW5lcmF0ZSBvdXIgb3duIGZvcm1hdCBhbmQgZGF0YSBzdHJpbmdzLiAgSXQgaXMKLSAqIGltcG9zc2libGUgdG8gZGVjaWRlIHRoZSBwcm9wZXIgbGVuZ3RoIGZvciB0aGUgZGF0YSBmb3Igc3RydWN0dXJlZCB0eXBlczsgd2UKLSAqIG1ha2Ugd2lsZCBndWVzc2VzLiAgSXQncyBhIGJ1Zy4KLSAqLwotaW50Ci1fYWlmX3VuYXJ5X29wKGFpZm9wIG9wLCBjaGFyICoqcmYsIGNoYXIgKipyZCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JaW50CWk7Ci0JaW50CWJ5dGVzOwotCWNoYXIgKglkcDsKLQotCXN3aXRjaCAoIEZEU1R5cGUoKmZkcykgKQotCXsKLQljYXNlIEFJRl9CT09MRUFOOgotCQlieXRlcyA9IF9mZHNfY291bnRfYnl0ZXMoZmRzKTsKLQotCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCSpyZiA9IHN0cmR1cChBSUZfQk9PTEVBTl9UWVBFKCkpOwotCi0JCWlmICggX2FpZl91bmFyeV9vcF9ib29sKG9wLCByZCwgKmRhdGEsIGJ5dGVzKSA8IDAgKQotCQkJcmV0dXJuIC0xOwotCi0JCSgqZGF0YSkgKz0gYnl0ZXM7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfRU5VTToKLQkJZHAgPSAqZmRzOwotCQlieXRlcyA9IF9mZHNfY291bnRfYnl0ZXMoZmRzKTsKLQotCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCSpyZiA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDEsIGJ5dGVzKSk7Ci0JCWVsc2UKLQkJewotCQkJY2hhciAqdDEsICp0MjsKLQkJCWludCBsZW47Ci0KLQkJCXQxID0gc3Ryc3RyKCpyZiwgZHApOwkKLQotCQkJaWYgKCB0MSA9PSBOVUxMICkKLQkJCXsKLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfQ09OViwgTlVMTCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQl0MiA9IF9mZHNfYmFzZV90eXBlKHQxKTsKLQkJCWxlbiA9IHN0cmxlbih0Mik7Ci0JCQltZW1tb3ZlKHQxLCB0MiwgbGVuKzEpOwotCQl9Ci0KLQkJaWYgKCBfYWlmX3VuYXJ5X29wX2ludChvcCwgcmQsICpkYXRhLCBieXRlcykgPCAwICkKLQkJCXJldHVybiAtMTsKLQotCQkoKmRhdGEpICs9IGJ5dGVzOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfSU5URUdFUjoKLQkJYnl0ZXMgPSBfZmRzX2NvdW50X2J5dGVzX25hKGZkcyk7Ci0KLQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkqcmYgPSBzdHJkdXAoQUlGX0lOVEVHRVJfVFlQRShGRFNJc1NpZ25lZCgqZmRzKSwgYnl0ZXMpKTsKLQkJX2Zkc19hZHZhbmNlKGZkcyk7Ci0KLQkJaWYgKCBfYWlmX3VuYXJ5X29wX2ludChvcCwgcmQsICpkYXRhLCBieXRlcykgPCAwICkKLQkJCXJldHVybiAtMTsKLQotCQkoKmRhdGEpICs9IGJ5dGVzOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JCWJ5dGVzID0gX2Zkc19jb3VudF9ieXRlcyhmZHMpOwotCi0JCWlmICggKnJmID09IE5VTEwgKQotCQkJKnJmID0gc3RyZHVwKEFJRl9GTE9BVElOR19UWVBFKGJ5dGVzKSk7Ci0KLQkJaWYgKCBfYWlmX3VuYXJ5X29wX2Zsb2F0KG9wLCByZCwgKmRhdGEsIGJ5dGVzKSA8IDAgKQotCQkJcmV0dXJuIC0xOwotCi0JCSgqZGF0YSkgKz0gYnl0ZXM7Ci0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIEFJRl9BUlJBWToKLQkJewotCQkJQUlGSW5kZXggKglpeDsKLQkJCWNoYXIgKgkJZm10OwotCQkJY2hhciAqCQlmcmVzID0gTlVMTDsKLQotCQkJaXggPSBGRFNBcnJheUluZGV4SW5pdCgqZmRzKTsKLQotCQkJaWYgKCAqcmQgPT0gTlVMTCApCi0JCQl7Ci0JCQkJKnJkID0gKGNoYXIgKilfYWlmX2FsbG9jKGl4LT5pX25lbCAqIGl4LT5pX2JzaXplKTsgLyogd29ya3MgdW5sZXNzIHdlIGhhdmUgc3Vib3JkaW5hdGUgbGlzdHMgKi8KLQkJCQkqcmYgPSBzdHJkdXAoKmZkcyk7Ci0JCQl9Ci0KLQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJCSpyZiA9IHN0cmR1cCgqZmRzKTsKLQotCQkJX2Zkc19hZHZhbmNlKGZkcyk7IC8qIHNraXAgb3ZlciB0aGUgZW50aXJlIGFycmF5IGZkcyAqLwotCi0JCQlkcCA9ICpyZDsgLyogc3RhcnQgb2Ygb3VyIGRhdGEgcmVzdWx0IHJlZ2lvbiAqLwotCi0JCQlmb3IgKCBpID0gMCA7IGkgPCBpeC0+aV9uZWwgOyBpKysgKQotCQkJewotCQkJCWlmICggZnJlcyAhPSBOVUxMICkKLQkJCQl7Ci0JCQkJCV9haWZfZnJlZShmcmVzKTsKLQkJCQkJZnJlcyA9IE5VTEw7Ci0JCQkJfQotCi0JCQkJZm10ID0gaXgtPmlfYnR5cGU7Ci0KLQkJCQlpZiAoIF9haWZfdW5hcnlfb3Aob3AsICZmcmVzLCAmZHAsICZmbXQsIGRhdGEpIDwgMCApCi0JCQkJewotCQkJCQlBSUZBcnJheUluZGV4RnJlZShpeCk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0KLQkJCQlkcCArPSBpeC0+aV9ic2l6ZTsKLQotCQkJCUFJRkFycmF5SW5kZXhJbmMoaXgpOwotCQkJfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnQxLCAqdDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSBfZmRzX2Jhc2VfdHlwZSgqcmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MiA9IHQxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmRzX2FkdmFuY2UoJnQyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oZnJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUodDEsIGZyZXMsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxICs9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICp0MiAhPSAnXDAnICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbih0Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSh0MSwgdDIsIGxlbisxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnQxID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0JCQlfYWlmX2ZyZWUoZnJlcyk7Ci0KLQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCS8qIG9ubHkgd29ya3Mgd2l0aCB0aGUgcHVibGljIHNlY3Rpb24gaW4gQUlGX1NUUlVDVCAqLwotCWNhc2UgQUlGX1NUUlVDVDoKLQkJaWYgKCAqcmQgPT0gTlVMTCApCi0JCXsKLQkJCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhCVUZTSVopOyAvKiBubyB3YXkgdG8ga25vdyBob3cgYmlnISAqLwotCQkJKnJmID0gc3RyZHVwKCpmZHMpOyAvKiB3aWxsIGluY2x1ZGUgdHJhaWxpbmcganVuay4gIEJ1ZyAqLwotCQl9Ci0KLQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkqcmYgPSBzdHJkdXAoKmZkcyk7Ci0KLQkJKCpmZHMpKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCQlfZmRzX3NraXBpZChmZHMpOwotCi0JCWRwID0gKnJkOwotCi0JCXdoaWxlICggKipmZHMgIT0gJzsnICkKLQkJewotCQkJY2hhciAqIGZyZXMgPSBOVUxMOwotCQkJY2hhciAqIGZtdDsKLQotCQkJKmZkcyA9IHN0cmNocigqZmRzLCBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EKSArIDE7IC8qdG8gc3RhcnQgb2YgZmllbGQqLwotCQkJZm10ID0gKmZkczsKLQotCQkJaSA9IF9mZHNfY291bnRfYnl0ZXNfbmEoZmRzKTsKLQotCQkJaWYgKCBfYWlmX3VuYXJ5X29wKG9wLCAmZnJlcywgJmRwLCBmZHMsIGRhdGEpIDwgMCApCi0JCQkJcmV0dXJuIC0xOyAvKiBub24temVybyByZXMgbWVhbnMgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIgKi8KLQotCQkJZHAgKz0gaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp0MSwgKnQyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gc3Ryc3RyKCpyZiwgZm10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDIgPSBzdHJzdHIoKnJmLCAqZmRzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oZnJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUodDEsIGZyZXMsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxICs9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHQxICE9IHQyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbih0Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSh0MSwgdDIsIGxlbisxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0JCQlfYWlmX2ZyZWUoZnJlcyk7Ci0KLQkJCWlmICgqKmZkcyA9PSAnLCcpICgqZmRzKSsrOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBOT1QgUkVBQ0hFRCAqLwotfQotCi1BSUYgKgotX2FpZl91bmFyeShBSUYgKmEsIGFpZm9wIG9wKQotewotCWNoYXIgKglyZDsKLQljaGFyICoJcmY7Ci0JY2hhciAqCWY7Ci0JY2hhciAqCWQ7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0JCi0JZiA9IEFJRl9GT1JNQVQoYSk7Ci0JZCA9IEFJRl9EQVRBKGEpOwotCi0JcmYgPSBOVUxMOwotCXJkID0gX2FpZl9hbGxvYyhBSUZfTEVOKGEpKTsKLQotCWlmICggX2FpZl91bmFyeV9vcChvcCwgJnJmLCAmcmQsICZmLCAmZCkgPCAwICkKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCi0JcmV0dXJuIE1ha2VBSUYocmYsIHJkKTsKLX0KLQotQUlGICoKLUFJRk5vdChBSUYgKmEpCi17Ci0JcmV0dXJuIF9haWZfdW5hcnkoYSwgQUlGT1BfTk9UKTsKLX0KLQotQUlGICoKLUFJRk5lZyhBSUYgKmEpCi17Ci0JcmV0dXJuIF9haWZfdW5hcnkoYSwgQUlGT1BfTkVHKTsKLX0KLQotQUlGICoKLV9haWZfYmluYXJ5KEFJRiAqYTEsIEFJRiAqYTIsIGFpZm9wIG9wKQotewotCWNoYXIgKglyZDsKLQljaGFyICoJcmY7Ci0JY2hhciAqCWYxOwotCWNoYXIgKglmMjsKLQljaGFyICoJZDE7Ci0JY2hhciAqCWQyOwotCi0JaWYgKCBhMSA9PSAoQUlGICopTlVMTCB8fCBhMiA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZjEgPSBBSUZfRk9STUFUKGExKTsKLQlmMiA9IEFJRl9GT1JNQVQoYTIpOwotCWQxID0gQUlGX0RBVEEoYTEpOwotCWQyID0gQUlGX0RBVEEoYTIpOwotCi0JcmYgPSBOVUxMOyAvKiB3ZSBkb24ndCBrbm93IHJlc3VsdCBzbyBsZXQgX2FpZl9iaW5hcnlfb3Agd29yayBpdCBvdXQgKi8KLQlyZCA9IE5VTEw7Ci0KLQlpZiAoIF9haWZfYmluYXJ5X29wKG9wLCAmcmYsICZyZCwgJmYxLCAmZDEsICZmMiwgJmQyKSA8IDAgKQotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0KLQlyZXR1cm4gTWFrZUFJRihyZiwgcmQpOwotfQotQUlGICoKLUFJRkFkZChBSUYgKmExLCBBSUYgKmEyKQotewotCXJldHVybiBfYWlmX2JpbmFyeShhMSwgYTIsIEFJRk9QX0FERCk7Ci19Ci0KLUFJRiAqCi1BSUZTdWIoQUlGICphMSwgQUlGICphMikKLXsKLQlyZXR1cm4gX2FpZl9iaW5hcnkoYTEsIGEyLCBBSUZPUF9TVUIpOwotfQotCi1BSUYgKgotQUlGTXVsKEFJRiAqYTEsIEFJRiAqYTIpCi17Ci0JcmV0dXJuIF9haWZfYmluYXJ5KGExLCBhMiwgQUlGT1BfTVVMKTsKLX0gCi0KLUFJRiAqCi1BSUZEaXYoQUlGICphMSwgQUlGICphMikKLXsKLQlyZXR1cm4gX2FpZl9iaW5hcnkoYTEsIGEyLCBBSUZPUF9ESVYpOwotfSAKLQotQUlGICoKLUFJRlJlbShBSUYgKmExLCBBSUYgKmEyKQotewotCXJldHVybiBfYWlmX2JpbmFyeShhMSwgYTIsIEFJRk9QX1JFTSk7Ci19IAotCi1BSUYgKgotQUlGQW5kKEFJRiAqYTEsIEFJRiAqYTIpCi17Ci0JcmV0dXJuIF9haWZfYmluYXJ5KGExLCBhMiwgQUlGT1BfQU5EKTsKLX0gCi0KLUFJRiAqCi1BSUZPcihBSUYgKmExLCBBSUYgKmEyKQotewotCXJldHVybiBfYWlmX2JpbmFyeShhMSwgYTIsIEFJRk9QX09SKTsKLX0gCi0KLQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jZi9taXNjLm00IGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvY2YvbWlzYy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5YzY5ZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jZi9taXNjLm00CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1kbmwgJElkOiBtaXNjLm00LHYgMS4xIDIwMDEvMDgvMDggMDY6NTM6MDggYmFtIEV4cCAkCi1kbmwKLUFDX0RFRlVOKFt1cGNhc2VdLFtgZWNobyAkMSB8IHRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYF0pZG5sCi1BQ19ERUZVTihbQ09ORklHX0hFQURFUl0sW0FIX1RPUChbI2lmbmRlZiBSQ1NJRAotI2RlZmluZSBSQ1NJRChtc2cpIFwKLXN0YXRpYyAvKiovY29uc3QgY2hhciAqY29uc3QgcmNzaWRbXSA9IHsgKGNvbnN0IGNoYXIgKilyY3NpZCwgIlwxMDAoIykiIG1zZyB9Ci0jZW5kaWYKLV0pXSkKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NtcC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzMwNTYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI3ICswLDAgQEAKLS8qCi0gKiBSb3V0aW5lcyBmb3IgY29tcGFyaW5nIEFJRiBvYmplY3RzLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIGJ5IEd1YXJkc29mdCBQdHkgTHRkLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZQk8Y29uZmlnLmg+Ci0jZW5kaWYgLyogSEFWRV9DT05GSUdfSCAqLwotCi0jaW5jbHVkZQk8c3RkaW8uaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLSNpbmNsdWRlCTxtYXRoLmg+Ci0KLSNpbmNsdWRlCSJhaWYuaCIKLSNpbmNsdWRlCSJhaWZlcnIuaCIKLSNpbmNsdWRlCSJhaWZpbnQuaCIKLQotaW50Ci1BSUZJc1plcm8oQUlGICphLCBpbnQgKnZhbCkKLXsKLQljaGFyICoJZjsKLQljaGFyICoJZDsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCB8fCB2YWwgPT0gKGludCAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmID0gQUlGX0ZPUk1BVChhKTsKLQlkID0gQUlGX0RBVEEoYSk7Ci0KLQlyZXR1cm4gX2FpZl9pc196ZXJvKCZmLCAmZCwgQUlGX0xFTihhKSwgdmFsKTsKLX0KLQotaW50Ci1fYWlmX2lzX3plcm8oY2hhciAqKmZkcywgY2hhciAqKmRhdGEsIGludCBsZW4sIGludCAqdmFsKQotewotCWludAkJaTsKLQlpbnQJCW52OwotCWludAkJYnl0ZXM7Ci0JaW50CQlyZWc7Ci0JaW50CQlzdWNjZXNzOwotCWNoYXIJCWM7Ci0JY2hhciAqCQl0YXJnZXQ7Ci0JQUlGSW5kZXggKglpeDsKLQljaGFyICoJCWZtdDsKLQlBSUZET1VCTEVTVAl2OwotCi0JaWYgKCAqKmZkcyA9PSBGRFNfTkFNRSApCi0JewotCQkqZmRzID0gX2Zkc19za2lwdG8oKmZkcywgIi8iKTsKLQkJKCpmZHMpKys7Ci0JfQotCi0Jc3dpdGNoICggRkRTVHlwZSgqZmRzKSApCi0JewotCWNhc2UgQUlGX1VOSU9OOgotCQlieXRlcyA9IEZEU1R5cGVTaXplKCpmZHMpOwotCQkqdmFsID0gMTsgLyogemVybyB1bmxlc3Mgc2hvd24gb3RoZXJ3aXNlICovCi0KLQkJKCpmZHMpKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCi0JCV9mZHNfc2tpcGlkKGZkcyk7Ci0KLQkJd2hpbGUgKCAqKmZkcyAhPSBGRFNfVU5JT05fRU5EICkKLQkJewotCQkJKmZkcyA9IHN0cmNocigqZmRzLCBGRFNfVU5JT05fRklFTERfTkFNRV9FTkQpICsgMTsgLyogdG8gc3RhcnQgb2YgZmllbGQgKi8KLQotICAgICAgICAgICAgICAgIAlpZiAoIChpID0gRkRTVHlwZVNpemUoKmZkcykpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIAlmbXQgPSBfYWlmX2FsbG9jKCBzaXplb2YoY2hhcikgKiBpICk7Ci0gICAgICAgICAgICAgICAgCXRhcmdldCA9IGZtdDsKLSAgICAgICAgICAgICAgICAJbWVtY3B5KHRhcmdldCwgKmRhdGEsIGkpOwotCi0JCQlpZiAoIF9haWZfaXNfemVybyhmZHMsICZ0YXJnZXQsIGxlbiwgdmFsKSA8IDAgKQotCQkJewotCQkJCV9haWZfZnJlZShmbXQpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJaWYgKCAqdmFsID09IDAgKQotCQkJCXJldHVybiAwOyAvKiB6ZXJvIHJlcyBtZWFucyBubyBuZWVkIHRvIGxvb2sgZnVydGhlciAqLwotCQkJaWYgKCAqKmZkcyA9PSBGRFNfVU5JT05fRklFTERfU0VQICkKLQkJCQkoKmZkcykrKzsKLQkJfQotCi0JCSpmZHMgPSBzdHJjaHIoKmZkcywgRkRTX1NUUlVDVF9FTkQpICsgMTsgLypwYXN0IGNsb3NlIGJyYWNlKi8KLQkJKmRhdGEgKz0gYnl0ZXM7Ci0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIEFJRl9FTlVNOgotCQkqZmRzID0gX2Zkc19iYXNlX3R5cGUoKmZkcyk7Ci0JCWJ5dGVzID0gX2Zkc19jb3VudF9ieXRlcyhmZHMpOwotCQkqdmFsID0gX2FpZl9pbnRfaXNfemVybygqZGF0YSwgYnl0ZXMpOwotCQkoKmRhdGEpICs9IGJ5dGVzOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfUE9JTlRFUjoKLQkJcmVnID0gKCoqZGF0YSA8IChjaGFyKSBBSUZfUFRSX1JFRkVSRU5DRSk7IC8qIGRhdGEgbm90IGEgcmVmZXJlbmNlICovCi0KLQkJKCpmZHMpKys7IC8qIHBhc3QgXiAqLwotCi0JCXRhcmdldCA9IF9maW5kX3RhcmdldChkYXRhLCAwKTsKLQotCQlpZiAoIHRhcmdldCA9PSAwICkKLQkJewotCQkJLyoKLQkJCSoqIG51bGwgcG9pbnRlci4gIFdlIGNhbGwgaXQgZXF1aXZhbGVudCB0byAwCi0JCQkqLwotCQkJKnZhbCA9IDE7Ci0JCQlfZmRzX2FkdmFuY2UoZmRzKTsgLyogc2tpcCBvdmVyIHRoZSB0YXJnZXQgZmRzICovCi0JCQlyZXR1cm4gMDsgLyogYnV0IHdlIGZhaWwgdG8gZmluZCBpdC4gKi8KLQkJfQotCi0JCXN1Y2Nlc3MgPSBfYWlmX2lzX3plcm8oZmRzLCAmdGFyZ2V0LCBsZW4sIHZhbCk7Ci0KLQkJaWYgKCByZWcgKQotCQkJKmRhdGEgPSB0YXJnZXQ7IC8qIG90aGVyd2lzZSBfZmluZF90YXJnZXQgYWR2YW5jZWQgZm9yIHVzICovCi0JCXJldHVybiBzdWNjZXNzOwotCi0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQlieXRlcyA9IF9mZHNfY291bnRfYnl0ZXMoZmRzKTsKLQotCQlpZiAoIF9haWZfdG9fY2hhcigqZGF0YSwgJmMpIDwgMCApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJKnZhbCA9IChjID09ICdcMCcpOwotCQkoKmRhdGEpICs9IGJ5dGVzOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfSU5URUdFUjoKLQljYXNlIEFJRl9CT09MRUFOOiAvKiBpZiBpdCBpcyBGQUxTRSwgdmFsID0gMSwgaWYgaXQgaXMgVFJVRSwgdmFsID0gMCAqLwotCQlieXRlcyA9IF9mZHNfY291bnRfYnl0ZXMoZmRzKTsKLQkJKnZhbCA9IF9haWZfaW50X2lzX3plcm8oKmRhdGEsIGJ5dGVzKTsKLQkJKCpkYXRhKSArPSBieXRlczsKLQotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX0ZMT0FUSU5HOgotCQlieXRlcyA9IF9mZHNfY291bnRfYnl0ZXMoZmRzKTsKLQotCQlpZiAoIF9haWZfdG9fZG91Ymxlc3QoKmRhdGEsIGJ5dGVzLCAmdikgPCAwICkKLQkJCXJldHVybiAtMTsKLQotCQkqdmFsID0gKHYgPT0gKEFJRkRPVUJMRVNUKTAuMEwpOwotCQkoKmRhdGEpICs9IGJ5dGVzOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfQVJSQVk6Ci0JCWl4ID0gRkRTQXJyYXlJbmRleEluaXQoKmZkcyk7Ci0KLQkJX2Zkc19hZHZhbmNlKGZkcyk7IC8qIHNraXAgb3ZlciB0aGUgZW50aXJlIGFycmF5IGZkcyAqLwotCi0JCWZvciAoIGkgPSAwIDsgaSA8IGl4LT5pX25lbCA7IGkrKyApCi0JCXsKLQkJCWZtdCA9IGl4LT5pX2J0eXBlOwotCi0JCQlpZiAoIF9haWZfaXNfemVybygmZm10LCBkYXRhLCBpeC0+aV9ic2l6ZSwgJm52KSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJaWYgKCBudiA9PSAwICkgLyogbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIgKi8KLQkJCXsKLQkJCQkqdmFsID0gMDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCi0JCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQotCQkqdmFsID0gMTsKLQotCQlyZXR1cm4gMDsKLQotCS8qCi0JKiogb25seSB1c2VzIHRoZSBwdWJsaWMgc2VjdGlvbiBpbiBBSUZfU1RSVUNUIAotCSovCi0JY2FzZSBBSUZfU1RSVUNUOgotCQkqdmFsID0gMTsgLyogemVybyB1bmxlc3Mgc2hvd24gb3RoZXJ3aXNlICovCi0KLQkJKCpmZHMpKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCQlfZmRzX3NraXBpZChmZHMpOwotCi0JCXdoaWxlICggKipmZHMgIT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLQkJewotCQkJKmZkcyA9IHN0cmNocigqZmRzLCBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EKSArIDE7IC8qIHRvIHN0YXJ0IG9mIGZpZWxkICovCi0KLQkJCWlmICggX2FpZl9pc196ZXJvKGZkcywgZGF0YSwgbGVuLCB2YWwpIDwgMCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAoICp2YWwgPT0gMCApCi0JCQkJcmV0dXJuIDA7IC8qIHplcm8gcmVzIG1lYW5zIG5vIG5lZWQgdG8gbG9vayBmdXJ0aGVyICovCi0JCQlpZiAoICoqZmRzID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkKLQkJCQkoKmZkcykrKzsKLQkJfQotCi0JCSpmZHMgPSBzdHJjaHIoKmZkcywgRkRTX1NUUlVDVF9FTkQpICsgMTsgLypwYXN0IGNsb3NlIGJyYWNlKi8KLQotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX1NUUklORzoKLQkJKCpmZHMpKys7IC8qIHBhc3QgInMiICovCi0JCWJ5dGVzID0gKCooKmRhdGEpKysgJiAweGZmKSA8PCA4OwotCQlieXRlcyArPSAqKCpkYXRhKSsrICYgMHhmZjsKLQkJCi0JCSpkYXRhICs9IGJ5dGVzOwotCi0JCSp2YWwgPSAoYnl0ZXMgPT0gMCk7Ci0KLQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLWludAotX2FpZl9pbnRfaXNfemVybyhjaGFyICpkYXRhLCBpbnQgbGVuKQotewotCWludAlpOwotCi0JZm9yICggaSA9IDAgOyBpIDwgbGVuIDsgaSsrICkKLQkJaWYgKCAoaW50KSpkYXRhKysgIT0gMCApCi0JCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi0vKgotICogQ29tcGFyZSB0eXBlcyBvZiB0d28gQUlGIHZhbHVlcy4gUmV0dXJuIHRydWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudCwKLSAqIGZhbHNlIGlmIG5vdC4KLSAqLwotaW50Ci1BSUZUeXBlQ29tcGFyZShBSUYgKmExLCBBSUYgKmEyKQotewotCXJldHVybiBGRFNUeXBlQ29tcGFyZShBSUZfRk9STUFUKGExKSwgQUlGX0ZPUk1BVChhMikpOwotfQotCi1pbnQKLUFJRkNvbXBhcmUoaW50IGRlcHRoLCBBSUYgKmExLCBBSUYgKmEyLCBpbnQgKnJlcykKLXsKLQljaGFyICoJZjE7Ci0JY2hhciAqCWYyOwotCWNoYXIgKglkMTsKLQljaGFyICoJZDI7Ci0KLQlpZiAoIGExID09IChBSUYgKilOVUxMIHx8IGEyID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZjEgPSBBSUZfRk9STUFUKGExKTsKLQlmMiA9IEFJRl9GT1JNQVQoYTIpOwotCWQxID0gQUlGX0RBVEEoYTEpOwotCWQyID0gQUlGX0RBVEEoYTIpOwotCi0JcmV0dXJuIF9haWZfY29tcGFyZShkZXB0aCwgcmVzLCAmZjEsICZkMSwgJmYyLCAmZDIpOwotfQotCi1pbnQKLV9haWZfY21wX2ludChpbnQgKnJlcywgY2hhciAqZDEsIGludCBsMSwgY2hhciAqZDIsIGludCBsMikKLXsKLQlpbnQJaTsKLQljaGFyICoJcjE7Ci0JY2hhciAqCXIyOwotCi0JcjEgPSAoY2hhciAqKV9haWZfYWxsb2MobDIpOwotCi0JX2FpZl9uZWdfaW50KHIxLCBkMiwgbDIpOwotCi0JcjIgPSAoY2hhciAqKV9haWZfYWxsb2MoTUFYKGwxLCBsMikpOwotCi0JX2FpZl9hZGRfaW50KHIyLCBkMSwgbDEsIHIxLCBsMik7Ci0KLQlfYWlmX2ZyZWUocjEpOwotCi0JaWYgKCAqcjIgJiAweDgwICkKLQl7Ci0JCS8qCi0JCSoqIG5lZ2F0aXZlIHJlc3VsdCA9PiBhIDwgYgotCQkqLwotCQlfYWlmX2ZyZWUocjIpOwotCQkqcmVzID0gLTE7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JKiogQ2hlY2sgZm9yIHplcm8KLQkqLwotCi0JZm9yICggaSA9IDAgOyBpIDwgTUFYKGwxLCBsMikgOyBpKysgKQotCXsKLQkJaWYgKCByMltpXSAhPSAweDAgKQotCQl7Ci0JCQkvKgotCQkJKiogcG9zaXRpdmUgcmVzdWx0ID0+IGEgPiBiCi0JCQkqLwotCQkJX2FpZl9mcmVlKHIyKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKgotCSoqIHplcm8gcmVzdWx0ID0+IGEgPSBiCi0JKi8KLQlfYWlmX2ZyZWUocjIpOwotCSpyZXMgPSAwOwotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfY21wX2Zsb2F0KGludCAqcmVzLCBjaGFyICpkMSwgaW50IGwxLCBjaGFyICpkMiwgaW50IGwyKQotewotCUFJRkRPVUJMRVNUCXYxOwotCUFJRkRPVUJMRVNUCXYyOwotCi0JaWYKLQkoCi0JCV9haWZfdG9fZG91Ymxlc3QoZDEsIGwxLCAmdjEpIDwgMAotCQl8fAotCQlfYWlmX3RvX2RvdWJsZXN0KGQyLCBsMiwgJnYyKSA8IDAKLQkpCi0JCXJldHVybiAtMTsKLQotCWlmICggdjEgPCB2MiApCi0JCSpyZXMgPSAtMTsKLQllbHNlIGlmICggdjEgPiB2MiApCi0JCSpyZXMgPSAxOwotCWVsc2UKLQkJKnJlcyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX2NtcF9jaGFyKGludCAqcmVzLCBjaGFyICpkMSwgY2hhciAqZDIpCi17Ci0JY2hhcgl2MTsKLQljaGFyCXYyOwotCi0JaWYKLQkoCi0JCV9haWZfdG9fY2hhcihkMSwgJnYxKSA8IDAKLQkJfHwKLQkJX2FpZl90b19jaGFyKGQyLCAmdjIpIDwgMAotCSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCB2MSA8IHYyICkKLQkJKnJlcyA9IC0xOwotCWVsc2UgaWYgKCB2MSA+IHYyICkKLQkJKnJlcyA9IDE7Ci0JZWxzZQotCQkqcmVzID0gMDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogZGF0YSBwb2ludHMgdG8gdGhlIGRhdGEgcGFydCBvZiBhbiBBSUYsIHN0YXJ0aW5nIGF0IHRoZSBmb3JtYXQgYnl0ZS4KLSAqICAwIG1lYW5zIG51bGwKLSAqICAxIG1lYW5zIG9yZGluYXJ5IHBvaW50ZXIKLSAqICAyIG1lYW5zIG9yZGluYXJ5IHBvaW50ZXIsIG5hbWVkCi0gKiAgMyBtZWFucyByZWZlciB0byBleGlzdGluZyBuYW1lCi0gKgotICogV2Ugc2F2ZSBhbnkgbmFtZXMgd2Ugc2VlLiAgV2Ugb2Zmc2V0IHRoZSBpbmRleCBmb3Igc2F2aW5nL3JldHJpZXZpbmcgCi0gKiB2YWx1ZXMgYnkgIm9mZnNldCIgaW4gb3JkZXIgdG8gc2ltdWx0YW5lb3VzbHkgbWFpbnRhaW4gdGFyZ2V0cyBmb3IgbXVsdGlwbGUgCi0gKiBBSUZzLiAgV2UgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZGF0YSByZWdpb24gd2hlcmUgdGhlIHZhbHVlIGFjdHVhbGx5IAotICogc3RhcnRzLCBvciAwIGlmIG51bGwuICBXZSBhbHNvIGFkdmFuY2UgdGhlIGRhdGEgcG9pbnRlciBwYXN0IHRoZSBpbml0aWFsIAotICogY29kZSAoYW5kIG5hbWUgaWYgcHJlc2VudCkuCi0gKi8KLQotY2hhciAqCi1fZmluZF90YXJnZXQoY2hhciAqKmRhdGEsIGludCBvZmZzZXQpCi17Ci0JaW50CW5hbWU7Ci0JY2hhcgljb2RlID0gKipkYXRhOwotCi0JKCpkYXRhKSsrOyAvKiBwYXN0IHRoZSBjb2RlICovCi0KLQlzd2l0Y2ggKCBjb2RlICkKLQl7Ci0JY2FzZSBBSUZfUFRSX05JTDoKLQkJcmV0dXJuIChjaGFyKSAwOwotCi0JY2FzZSBBSUZfUFRSX05PUk1BTDogLyogdW5hZG9ybmVkIHZhbHVlICovCi0JCXJldHVybiAqZGF0YTsKLQotCWNhc2UgQUlGX1BUUl9OQU1FOiAvKiBuYW1lZCB2YWx1ZSAqLwotCQlfcHRybmFtZV90b19pbnQoKmRhdGEsICZuYW1lKTsKLQkJKCpkYXRhKSArPSA0OyAvKiBwYXN0IHRoZSBuYW1lICovCi0JCV9haWZfdmFsdWVzX3NlZW5bbmFtZStvZmZzZXRdID0gKmRhdGE7Ci0KLQkJcmV0dXJuICpkYXRhOwotCi0JY2FzZSBBSUZfUFRSX1JFRkVSRU5DRTogLyogcmVmZXJlbmNlIHRvIG5hbWVkIHZhbHVlICovCi0JCV9wdHJuYW1lX3RvX2ludCgqZGF0YSwgJm5hbWUpOwotCQkoKmRhdGEpICs9IDQ7IC8qIHBhc3QgdGhlIG5hbWUgKi8KLQotCQlyZXR1cm4gX2FpZl92YWx1ZXNfc2VlbltuYW1lK29mZnNldF07Ci0JfQotCi0JcmV0dXJuIDA7IC8qIGlmIHdlIGZhbGwgdGhyb3VnaCwgbm8gdGFyZ2V0IHRvIGJlIGZvdW5kICovCi19Ci0KLS8qCi0gKiBDb21wYXJlIHR3byBBSUYgdmFsdWVzLiAKLSAqCi0gKiBGb3IgbnVtZXJpYyB2YWx1ZXMsIHNldHMgcmVzIHRvOgotICoKLSAqICAgICAgLTEgaWYgZDEgPCBkMgotICogICAgICAgMCBpZiBkMSA9PSBkMgotICogICAgICAgMSBpZiBkMSA+IGQyCi0gKgotICogRm9yIG90aGVyIHZhbHVlcywgc2V0cyByZXMgdG86Ci0gKgotICogICAgICAgMCBpZiBkMSA9PSBkMgotICogICAgICAgMSBpZiBkMSAhPSBkMgotICoKLSAqIEZvciBhcnJheSB0eXBlLCByZXMgaXMgMCBpZiBhbGwgZWxlbWVudHMgYXJlIGVxdWFsLCAxIG90aGVyd2lzZS4KLSAqIFRoZSBwYXJhbWV0ZXJzIGYxLCBkMSwgZjIsIGQyIGFyZSBhZHZhbmNlZCB0aHJvdWdoIHRoZWlyIHN0cnVjdHVyZXM7IG9uCi0gKiByZXR1cm4sIHRoZXkgYXJlIGluIHRoZSBwb3NpdGlvbiBmb2xsb3dpbmcgdGhlIHJlbGV2YW50IHBhcnRzLgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZSBpZiB0aGVyZSBpcyBhIHR5cGUgZmFpbHVyZS4KLSAqLwotaW50Ci1fYWlmX2NvbXBhcmUoaW50IGRlcHRoLCBpbnQgKnJlcywgY2hhciAqKmYxLCBjaGFyICoqZDEsIGNoYXIgKipmMiwgY2hhciAqKmQyKQotewotCWludAkJaTsKLQlpbnQJCWwzOwotCWludAkJc3VjY2VzczsgLyogdmFsdWUgdG8gcmV0dXJuIGluZGljYXRpbmcgdHlwZSBtYXRjaCAqLwotCWludAkJYnl0ZXMxOwotCWludAkJYnl0ZXMyOyAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYXJpdGhtZXRpYyBkYXRhICovCi0JY2hhciAqCQlmbXQ7Ci0JY2hhciAqCQlkMyA9IE5VTEw7Ci0JQUlGSW5kZXggKglpeDE7Ci0JQUlGSW5kZXggKglpeDI7Ci0JQUlGTE9OR0VTVAl2YWwxOwotCUFJRkxPTkdFU1QJdmFsMjsKLQotCS8qIHRoZXNlIGNtcF9ieV9uYW1lLCBmMl94KiBhbmQgZDJfeCogYXJlIHVzZWQgYnkgJ2Nhc2UgQUlGX1NUUlVDVCcgKi8KLQlpbnQJY21wX2J5X25hbWUgPSAwOwotCWNoYXIgKglmMl94MTsKLQljaGFyICoJZjJfeDI7Ci0JY2hhciAqCWQyX3gxOwotCWNoYXIgKglkMl94MjsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCS8qCi0JKiogcmVzb2x2ZSBuYW1lcyBhbmQgcmVmZXJlbmNlcyBmaXJzdAotCSovCi0JX2Zkc19yZXNvbHZlKGYxKTsKLQlfZmRzX3Jlc29sdmUoZjIpOwotCi0JaWYgKCBGRFNUeXBlKCpmMSkgPT0gQUlGX1JFRkVSRU5DRSApCi0JewotCQlmbXQgPSBfZmRzX2xvb2t1cChmMSk7Ci0JCXJldHVybiBfYWlmX2NvbXBhcmUoZGVwdGgsIHJlcywgJmZtdCwgZDEsIGYyLCBkMik7Ci0JfQotCi0JaWYgKCBGRFNUeXBlKCpmMikgPT0gQUlGX1JFRkVSRU5DRSApCi0JewotCQlmbXQgPSBfZmRzX2xvb2t1cChmMik7Ci0JCXJldHVybiBfYWlmX2NvbXBhcmUoZGVwdGgsIHJlcywgZjEsIGQxLCAmZm10LCBkMik7Ci0JfQotCi0Jc3dpdGNoICggRkRTVHlwZSgqZjEpICkKLQl7Ci0JY2FzZSBBSUZfUE9JTlRFUjoKLQkJKCpmMSkrKzsKLQotCQlpZiAoIEZEU1R5cGUoKmYyKSA9PSBBSUZfUE9JTlRFUiApCi0JCXsKLQkJCWludAlyZWcxID0gKCoqZDEgPCAoY2hhcikgMyk7Ci0JCQlpbnQJcmVnMiA9ICgqKmQyIDwgKGNoYXIpIDMpOwotCQkJY2hhciAqCXRhcmdldDEgPSBfZmluZF90YXJnZXQoZDEsIDApOwotCQkJY2hhciAqCXRhcmdldDIgPSBfZmluZF90YXJnZXQoZDIsIE1BWF9WQUxVRVNfU0VFTi8yKTsKLQotCQkJKCpmMikrKzsKLQotCQkJaWYgKCBkZXB0aCA9PSAtMSApCi0JCQl7Ci0JCQkJKnJlcyA9IDA7Ci0KLQkJCQlpZiAoIHRhcmdldDEgPT0gMCApCi0JCQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQkJZWxzZSBpZiAoICFyZWcxICkKLQkJCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCQllbHNlCi0JCQkJCV9mZHNfc2tpcF9kYXRhKGYxLCBkMSk7Ci0KLQkJCQlpZiAoIHRhcmdldDIgPT0gMCApCi0JCQkJCV9mZHNfYWR2YW5jZShmMik7Ci0JCQkJZWxzZSBpZiAoICFyZWcyICkKLQkJCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQkJCQllbHNlCi0JCQkJCV9mZHNfc2tpcF9kYXRhKGYyLCBkMik7Ci0JCQkJCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmICggZGVwdGggPT0gMSApCi0JCQkJZGVwdGggPSAtMTsKLQkJCWVsc2UgaWYgKCBkZXB0aCA+IDEgKQotCQkJCWRlcHRoLS07Ci0KLQkJCWlmICggIXJlZzEgJiYgIXJlZzIgKQotCQkJewotCQkJCS8qCi0JCQkJKiogYm90aCBwYXJhbWV0ZXJzIHJlZmVyIHRvIGVsc2V3aGVyZSBpbiB0aGUKLQkJCQkqKiBkYXRhLiAgVG8gYXZvaWQgaW5maW5pdGUgbG9vcCwgd2UganVzdCBjYWxsIAotCQkJCSoqIHRoZW0gZXF1YWwuCi0JCQkJKi8KLQotCQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJCSpyZXMgPSAwOwotCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmICggcmVnMSBeIHJlZzIgKQotCQkJewotCQkJCS8qCi0JCQkJKiogb25seSBvbmUgcGFyYW1ldGVyIHJlZmVycyBlbHNld2hlcmUuCi0JCQkJKiogVW5kZXIgb3VyIHN0cmljdCBpbnRlcnByZXRhdGlvbiwgdGhlIGRhdGEgCi0JCQkJKiogYXJlIGRpZmZlcmVudC4KLQkJCQkqLwotCQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJCSpyZXMgPSAwOwotCi0JCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCi0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZiAoICF0YXJnZXQxICYmICF0YXJnZXQyICkKLQkJCXsKLQkJCQkvKgotCQkJCSoqIGJvdGggZDEgYW5kIGQyIGFyZSBudWxsCi0JCQkJKi8KLQkJCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJCV9mZHNfYWR2YW5jZShmMik7Ci0KLQkJCQkqcmVzID0gMDsKLQotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZiAoICh0YXJnZXQxID09IDApIF4gKHRhcmdldDIgPT0gMCkgKQotCQkJewotCQkJCS8qIAotCQkJCSoqIG9ubHkgb25lIG51bGwgbAotCQkJCSovCi0JCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQkJLyoKLQkJCQkqKiBmdWRnZSBhbiBhbnN3ZXIKLQkJCQkqLwotCQkJCSpyZXMgPSAodGFyZ2V0MSA9PSAwKSA/IC0xIDogMTsKLQotCQkJCS8qCi0JCQkJKiogYnV0IGl0IGlzIGEgdHlwZSBtaXNtYXRjaAotCQkJCSovCi0JCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCi0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQkvKiAKLQkJCSoqIGJvdGggcG9pbnQgdG8gc29tZXRoaW5nIHJlYWwuIAotCQkJKi8KLQotCQkJc3VjY2VzcyA9IF9haWZfY29tcGFyZShkZXB0aCwgcmVzLCBmMSwgJnRhcmdldDEsIGYyLCAmdGFyZ2V0Mik7Ci0KLQkJCWlmICggcmVnMSApCi0JCQkJKmQxID0gdGFyZ2V0MTsKLQotCQkJaWYgKCByZWcyICkKLQkJCQkqZDIgPSB0YXJnZXQyOwotCi0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qCi0JCQkqKiBpbmNvbXBhdGlibGUgdHlwZXMKLQkJCSovCi0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQ09OViwgTlVMTCk7Ci0JCQkqcmVzID0gMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JY2FzZSBBSUZfVU5JT046Ci0JCWJ5dGVzMSA9IEZEU1R5cGVTaXplKCpmMSk7Ci0JCWJ5dGVzMiA9IEZEU1R5cGVTaXplKCpmMik7Ci0KLQkJaWYgKCBGRFNUeXBlKCpmMikgIT0gQUlGX1VOSU9OICkKLQkJewotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCQkJKnJlcyA9IDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQkoKmYxKSsrOyAvKiBwYXN0IG9wZW4gYnJhY2UgKi8KLQkJKCpmMikrKzsgLyogcGFzdCBvcGVuIGJyYWNlICovCi0JCV9mZHNfc2tpcGlkKGYxKTsKLQkJX2Zkc19za2lwaWQoZjIpOwotCi0JCSpyZXMgPSAwOyAvKiBmaXJzdCBhc3N1bXB0aW9uLCB0aGV5IGFyZSBlcXVhbCAqLwotCi0JCXdoaWxlICggKipmMSAhPSBGRFNfVU5JT05fRU5EICkKLQkJewotCQkJaW50IHNpemUxLCBzaXplMjsKLQkJCWNoYXIgKnRlbXAxLCAqdGVtcDIsICpkYXRhMSwgKmRhdGEyOwotCi0JCQlpZiAoICoqZjIgPT0gRkRTX1VOSU9OX0VORCApCi0JCQl7IAotCQkJCS8qIAotCQkJCSoqIGYxIGhhcyBtb3JlIGZpZWxkcwotCQkJCSovCi0JCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCi0JCQkJKnJlcyA9IDE7IC8qIGluIGEgc2Vuc2UsIGQxID4gZDIgKi8KLQotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJKmYxID0gc3RyY2hyKCpmMSwgRkRTX1VOSU9OX0ZJRUxEX05BTUVfRU5EKSArIDE7Ci0JCQkqZjIgPSBzdHJjaHIoKmYyLCBGRFNfVU5JT05fRklFTERfTkFNRV9FTkQpICsgMTsKLQkJCQotCQkJc2l6ZTEgPSBGRFNUeXBlU2l6ZSgqZjEpOwotCQkJc2l6ZTIgPSBGRFNUeXBlU2l6ZSgqZjIpOwotCQkJdGVtcDEgPSBfYWlmX2FsbG9jKCBzaXplb2YoY2hhcikgKiBzaXplMSApOwotCQkJdGVtcDIgPSBfYWlmX2FsbG9jKCBzaXplb2YoY2hhcikgKiBzaXplMiApOwotCQkJZGF0YTEgPSB0ZW1wMTsKLQkJCWRhdGEyID0gdGVtcDI7Ci0JCQltZW1jcHkoZGF0YTEsICpkMSwgc2l6ZTEpOwotCQkJbWVtY3B5KGRhdGEyLCAqZDIsIHNpemUyKTsKLQotCQkJc3VjY2VzcyA9IF9haWZfY29tcGFyZShkZXB0aCwgcmVzLCBmMSwgJmRhdGExLCBmMiwgJmRhdGEyKTsKLQkJCV9haWZfZnJlZSh0ZW1wMSk7Ci0JCQlfYWlmX2ZyZWUodGVtcDIpOwotCi0JCQkvKgotCQkJKiogbm9uLXplcm8gcmVzIG1lYW5zIG5vIG5lZWQgdG8gbG9vayBmdXJ0aGVyCi0JCQkqLwotCQkJaWYgKCAqcmVzICkKLQkJCQlyZXR1cm4gMDsKLQotCQkJaWYgKCAqKmYxID09IEZEU19VTklPTl9GSUVMRF9TRVAgKQotCQkJCSgqZjEpKys7Ci0KLQkJCWlmICggKipmMiA9PSBGRFNfVU5JT05fRklFTERfU0VQICkKLQkJCQkoKmYyKSsrOwotCQl9Ci0KLQkJaWYgKCAqKmYyICE9IEZEU19VTklPTl9FTkQgKQotCQl7Ci0JCQkvKgotCQkJKiogZjIgaGFzIG1vcmUgZmllbGRzIAotCQkJKi8KLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQotCQkJKnJlcyA9IC0xOyAvKiBpbiBhIHNlbnNlLCBkMSA8IGQyICovCi0JCQkKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCSpmMSA9IHN0cmNocigqZjEsIEZEU19VTklPTl9FTkQpICsgMTsgLypwYXN0IGNsb3NlIGJyYWNlKi8KLQkJKmYyID0gc3RyY2hyKCpmMiwgRkRTX1VOSU9OX0VORCkgKyAxOyAvKnBhc3QgY2xvc2UgYnJhY2UqLwotCQkqZDEgKz0gYnl0ZXMxOwotCQkqZDIgKz0gYnl0ZXMyOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfRU5VTToKLQkJc3dpdGNoICggRkRTVHlwZSgqZjIpICkKLQkJewotCQljYXNlIEFJRl9FTlVNOgotCQkJKmYxID0gX2Zkc19iYXNlX3R5cGUoKmYxKTsKLQkJCSpmMiA9IF9mZHNfYmFzZV90eXBlKCpmMik7Ci0KLQkJCWJ5dGVzMSA9IF9mZHNfY291bnRfYnl0ZXMoZjEpOwotCQkJYnl0ZXMyID0gX2Zkc19jb3VudF9ieXRlcyhmMik7Ci0KLQkJCXN1Y2Nlc3MgPSBfYWlmX2NtcF9pbnQocmVzLCAqZDEsIGJ5dGVzMSwgKmQyLCBieXRlczIpOwotCi0JCQkqZDEgKz0gYnl0ZXMxOwotCQkJKmQyICs9IGJ5dGVzMjsKLQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0KLQkJZGVmYXVsdDoKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfSU5URUdFUjoKLQkJc3dpdGNoICggRkRTVHlwZSgqZjIpICkKLQkJewotCQljYXNlIEFJRl9JTlRFR0VSOgotCQkJYnl0ZXMxID0gX2Zkc19jb3VudF9ieXRlcyhmMSk7Ci0JCQlieXRlczIgPSBfZmRzX2NvdW50X2J5dGVzKGYyKTsKLQotCQkJc3VjY2VzcyA9IF9haWZfY21wX2ludChyZXMsICpkMSwgYnl0ZXMxLCAqZDIsIGJ5dGVzMik7Ci0KLQkJCSpkMSArPSBieXRlczE7Ci0JCQkqZDIgKz0gYnl0ZXMyOwotCi0JCQlyZXR1cm4gc3VjY2VzczsKLQotCQljYXNlIEFJRl9GTE9BVElORzoKLQkJCWJ5dGVzMSA9IF9mZHNfY291bnRfYnl0ZXMoZjEpOwotCQkJbDMgPSBfYWlmX2ludF90b19haWZfZmxvYXQoJmQzLCAqZDEsIGJ5dGVzMSk7Ci0JCQkqZDEgKz0gYnl0ZXMxOwotCi0JCQlpZiAoIGwzIDwgMCApCi0JCQl7Ci0JCQkJKnJlcyA9IDE7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlieXRlczIgPSBfZmRzX2NvdW50X2J5dGVzKGYyKTsKLQkJCXN1Y2Nlc3MgPSBfYWlmX2NtcF9mbG9hdChyZXMsIGQzLCBsMywgKmQyLCBieXRlczIpOwotCQkJKmQyICs9IGJ5dGVzMjsKLQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0KLQkJZGVmYXVsdDoKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JCXN3aXRjaCAoIEZEU1R5cGUoKmYyKSApCi0JCXsKLQkJY2FzZSBBSUZfSU5URUdFUjoKLQkJCWJ5dGVzMiA9IF9mZHNfY291bnRfYnl0ZXMoZjIpOwotCQkJbDMgPSBfYWlmX2ludF90b19haWZfZmxvYXQoJmQzLCAqZDIsIGJ5dGVzMik7Ci0JCQkqZDIgKz0gYnl0ZXMyOwotCi0JCQlpZiAoIGwzIDwgMCApCi0JCQl7Ci0JCQkJKnJlcyA9IDE7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlieXRlczEgPSBfZmRzX2NvdW50X2J5dGVzKGYxKTsKLQkJCXN1Y2Nlc3MgPSBfYWlmX2NtcF9mbG9hdChyZXMsICpkMSwgYnl0ZXMxLCBkMywgbDMpOwotCQkJKmQxICs9IGJ5dGVzMTsKLQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCQkKLQkJY2FzZSBBSUZfRkxPQVRJTkc6Ci0JCQlieXRlczEgPSBfZmRzX2NvdW50X2J5dGVzKGYxKTsKLQkJCWJ5dGVzMiA9IF9mZHNfY291bnRfYnl0ZXMoZjIpOwotCi0JCQlzdWNjZXNzID0gX2FpZl9jbXBfZmxvYXQocmVzLCAqZDEsIGJ5dGVzMSwgKmQyLCBieXRlczIpOwotCi0JCQkqZDEgKz0gYnl0ZXMxOwotCQkJKmQyICs9IGJ5dGVzMjsKLQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0KLQkJZGVmYXVsdDoKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQlzd2l0Y2ggKCBGRFNUeXBlKCpmMikgKQotCQl7Ci0JCWNhc2UgQUlGX0NIQVJBQ1RFUjoKLQkJCWJ5dGVzMSA9IF9mZHNfY291bnRfYnl0ZXMoZjEpOwotCQkJYnl0ZXMyID0gX2Zkc19jb3VudF9ieXRlcyhmMik7Ci0KLQkJCXN1Y2Nlc3MgPSBfYWlmX2NtcF9jaGFyKHJlcywgKmQxLCAqZDIpOwotCi0JCQkqZDEgKz0gYnl0ZXMxOwotCQkJKmQyICs9IGJ5dGVzMjsKLQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0KLQkJZGVmYXVsdDoKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfQVJSQVk6Ci0JCXN3aXRjaCAoIEZEU1R5cGUoKmYyKSApCi0JCXsKLQkJY2FzZSBBSUZfQVJSQVk6Ci0JCQlpeDEgPSBGRFNBcnJheUluZGV4SW5pdCgqZjEpOwotCQkJaXgyID0gRkRTQXJyYXlJbmRleEluaXQoKmYyKTsKLQotCQkJLyogCi0JCQkqKiBza2lwIG92ZXIgdGhlIGVudGlyZSBhcnJheSBmZHMKLQkJCSovCi0JCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJKnJlcyA9IDA7IC8qIGZpcnN0IGFzc3VtcHRpb24sIHRoZXkgYXJlIGVxdWFsICovCi0KLQkJCWlmICggaXgxLT5pX25lbCAhPSBpeDItPmlfbmVsICkKLQkJCXsKLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfU0laRSwgTlVMTCk7Ci0JCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQkJCQlBSUZBcnJheUluZGV4RnJlZShpeDIpOwotCi0JCQkJKnJlcyA9IDE7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlmb3IgKCBpID0gMCA7IGkgPCBpeDEtPmlfbmVsIDsgaSsrICkKLQkJCXsKLQkJCQljaGFyICoJZm10MTsKLQkJCQljaGFyICoJZm10MjsKLQotCQkJCWZtdDEgPSBpeDEtPmlfYnR5cGU7Ci0JCQkJZm10MiA9IGl4Mi0+aV9idHlwZTsKLQotCQkJCXN1Y2Nlc3MgPSBfYWlmX2NvbXBhcmUoZGVwdGgsIHJlcywgJmZtdDEsIGQxLCAmZm10MiwgZDIpOwotCQkJCWlmICggc3VjY2VzcyA8IDAgKQotCQkJCXsKLQkJCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQkJCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgyKTsKLQkJCQkJLyogRG8gbm90IG5lZWQgdG8gc2V0ICdyZXMnIGhlcmUsCi0JCQkJCSAqIEl0J3MgYWxyZWFkeSBzZXQgZnJvbSB0aGUgY2FsbAotCQkJCQkgKiB0byBfYWlmX2NvbXBhcmUoKQotCQkJCQkgKi8KLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCWlmICggKnJlcyAhPSAwICkKLQkJCQl7Ci0JCQkJCS8qIAotCQkJCQkqKiBubyBuZWVkIHRvIGNvbnRpbnVlCi0JCQkJCSovCi0JCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4MSk7Ci0JCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQotCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0KLQkJCXJldHVybiAwOwotCi0JCWRlZmF1bHQ6Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQ09OViwgTlVMTCk7Ci0JCQkqcmVzID0gMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JLyoKLQkqKiBvbmx5IHVzZXMgdGhlIHB1YmxpYyBzZWN0aW9uIGluIEFJRl9TVFJVQ1QKLQkqLwotCWNhc2UgQUlGX1NUUlVDVDoKLQkJLyogCi0JCSoqIHN0cnVjdHVyZSBlcXVpdmFsZW5jZTogd2UgaWdub3JlIGZpZWxkIG5hbWVzCi0JCSovCi0KLQkJaWYgKCBGRFNUeXBlKCpmMikgIT0gQUlGX1NUUlVDVCApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKCBBSUZHZXRPcHRpb24oQUlGT1BUX0NNUF9NRVRIT0QpID09IEFJRl9DTVBfQllfTkFNRSApCi0JCXsJCi0JCQljbXBfYnlfbmFtZSA9IDE7Ci0JCQlmMl94MSA9ICpmMjsKLQkJCWQyX3gxID0gKmQyOwotCQkJZjJfeDIgPSBOVUxMOwotCQkJZDJfeDIgPSBOVUxMOwotCQkJX2Zkc19za2lwX2RhdGEoJmYyX3gxLCAmZDJfeDEpOwotCQkJaWYgKCBfZmRzX3N0cnVjdF9hcnJhbmdlKCpmMSwgKmYyLCAqZDIsICZmMl94MiwgJmQyX3gyKSA8IDAgKQotCQkJewotCQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCQkqcmVzID0gMTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCSpmMiA9IGYyX3gyOyAKLQkJCSpkMiA9IGQyX3gyOwotCQkJLyogYXQgdGhlIGVuZCwgd2UgYXNzaWduIGYyX3gxIHRvIGYyLCBkMl94MSB0byBkMiwKLQkJCSoqIGFuZCB3ZSBmcmVlIGYyX3gyIGFuZCBkMl94MiAqLwotCQl9Ci0KLQkJKCpmMSkrKzsgLyogcGFzdCBvcGVuIGJyYWNlICovCi0JCSgqZjIpKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCQlfZmRzX3NraXBpZChmMSk7Ci0JCV9mZHNfc2tpcGlkKGYyKTsKLQotCQkqcmVzID0gMDsgLyogZmlyc3QgYXNzdW1wdGlvbiwgdGhleSBhcmUgZXF1YWwgKi8KLQotCQl3aGlsZSAoICoqZjEgIT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLQkJewotCQkJaWYgKCAqKmYyID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCQl7IAotCQkJCS8qIAotCQkJCSoqIGYxIGhhcyBtb3JlIGZpZWxkcwotCQkJCSovCi0JCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCi0JCQkJKnJlcyA9IDE7IC8qIGluIGEgc2Vuc2UsIGQxID4gZDIgKi8KLQotCQkJCWlmIChjbXBfYnlfbmFtZSA9PSAxKQotCQkJCXsKLQkJCQkJX2FpZl9mcmVlKGYyX3gyKTsKLQkJCQkJX2FpZl9mcmVlKGQyX3gyKTsKLQkJCQkJKmYyID0gZjJfeDE7Ci0JCQkJCSpkMiA9IGQyX3gxOwotCQkJCX0KLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCSpmMSA9IHN0cmNocigqZjEsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsgLyogdG8gc3RhcnQgb2YgZmllbGQgKi8KLQkJCSpmMiA9IHN0cmNocigqZjIsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsgLyogdG8gc3RhcnQgb2YgZmllbGQgKi8KLQotCQkJc3VjY2VzcyA9IF9haWZfY29tcGFyZShkZXB0aCwgcmVzLCBmMSwgZDEsIGYyLCBkMik7Ci0KLQkJCWlmICggc3VjY2VzcyA8IDAgKQotCQkJewotCQkJCWlmIChjbXBfYnlfbmFtZSA9PSAxKQotCQkJCXsKLQkJCQkJX2FpZl9mcmVlKGYyX3gyKTsKLQkJCQkJX2FpZl9mcmVlKGQyX3gyKTsKLQkJCQkJKmYyID0gZjJfeDE7Ci0JCQkJCSpkMiA9IGQyX3gxOwotCQkJCX0KLQkJCQkvKiBEbyBub3QgbmVlZCB0byBzZXQgJ3JlcycgaGVyZSwKLQkJCQkgKiBJdCdzIGFscmVhZHkgc2V0IGZyb20gdGhlIGNhbGwKLQkJCQkgKiB0byBfYWlmX2NvbXBhcmUoKQotCQkJCSAqLwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJLyoKLQkJCSoqIG5vbi16ZXJvIHJlcyBtZWFucyBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQkJKi8KLQkJCWlmICggKnJlcyApCi0JCQl7Ci0JCQkJaWYgKGNtcF9ieV9uYW1lID09IDEpCi0JCQkJewotCQkJCQlfYWlmX2ZyZWUoZjJfeDIpOwotCQkJCQlfYWlmX2ZyZWUoZDJfeDIpOwotCQkJCQkqZjIgPSBmMl94MTsKLQkJCQkJKmQyID0gZDJfeDE7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlpZiAoICoqZjEgPT0gRkRTX1NUUlVDVF9GSUVMRF9TRVAgKQotCQkJCSgqZjEpKys7Ci0KLQkJCWlmICggKipmMiA9PSBGRFNfU1RSVUNUX0ZJRUxEX1NFUCApCi0JCQkJKCpmMikrKzsKLQkJfQotCi0JCWlmICggKipmMiAhPSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAgKQotCQl7Ci0JCQkvKgotCQkJKiogZjIgaGFzIG1vcmUgZmllbGRzIAotCQkJKi8KLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQotCQkJKnJlcyA9IC0xOyAvKiBpbiBhIHNlbnNlLCBkMSA8IGQyICovCi0JCQkKLQkJCWlmIChjbXBfYnlfbmFtZSA9PSAxKQotCQkJewotCQkJCV9haWZfZnJlZShmMl94Mik7Ci0JCQkJX2FpZl9mcmVlKGQyX3gyKTsKLQkJCQkqZjIgPSBmMl94MTsKLQkJCQkqZDIgPSBkMl94MTsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCSpmMSA9IHN0cmNocigqZjEsIEZEU19TVFJVQ1RfRU5EKSArIDE7IC8qcGFzdCBjbG9zZSBicmFjZSovCi0JCSpmMiA9IHN0cmNocigqZjIsIEZEU19TVFJVQ1RfRU5EKSArIDE7IC8qcGFzdCBjbG9zZSBicmFjZSovCi0KLQkJaWYgKGNtcF9ieV9uYW1lID09IDEpCi0JCXsKLQkJCV9haWZfZnJlZShmMl94Mik7Ci0JCQlfYWlmX2ZyZWUoZDJfeDIpOwotCQkJKmYyID0gZjJfeDE7Ci0JCQkqZDIgPSBkMl94MTsKLQkJfQotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX1NUUklORzoKLQkJaWYgKCBGRFNUeXBlKCpmMikgIT0gQUlGX1NUUklORyApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCSpyZXMgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJKCpmMSkrKzsgLyogcGFzdCAicyIgKi8KLQkJKCpmMikrKzsgLyogcGFzdCAicyIgKi8KLQotCQlieXRlczEgPSAoKigqZDEpKysgJiAweGZmKSA8PCA4OwotCQlieXRlczEgKz0gKigqZDEpKysgJiAweGZmOwotCQlieXRlczIgPSAoKigqZDIpKysgJiAweGZmKSA8PCA4OwotCQlieXRlczIgKz0gKigqZDIpKysgJiAweGZmOwotCi0JCSpyZXMgPSBzdHJuY21wKCpkMSwgKmQyLCBNSU4oYnl0ZXMxLCBieXRlczIpKTsKLQotCQkqZDEgKz0gYnl0ZXMxOwotCQkqZDIgKz0gYnl0ZXMyOwotCi0JCWlmICggKnJlcyApCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoIGJ5dGVzMSA9PSBieXRlczIgKQotCQl7Ci0JCQkvKiAKLQkJCSoqIHRoZXkgYXJlIHRoZSBzYW1lIGluIGxlbmd0aCBhbmQgY29udGVudHMKLQkJCSovCi0JCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qCi0JCQkqKiB0aGV5IHN0YXJ0IHRoZSBzYW1lLCBidXQgb25lIGlzIGxvbmdlcgotCQkJKi8KLQkJCSpyZXMgPSAoYnl0ZXMxIDwgYnl0ZXMyKSA/IC0xIDogMTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQljYXNlIEFJRl9CT09MRUFOOgotCQlieXRlczEgPSBfZmRzX2NvdW50X2J5dGVzX25hKGYxKTsKLQkJYnl0ZXMyID0gX2Zkc19jb3VudF9ieXRlc19uYShmMik7Ci0KLQkJc3dpdGNoICggRkRTVHlwZSgqZjIpICkKLQkJewotCQljYXNlIEFJRl9CT09MRUFOOgotCQkJX2FpZl90b19sb25nZXN0KCpkMSwgYnl0ZXMxLCAmdmFsMSk7Ci0JCQlfYWlmX3RvX2xvbmdlc3QoKmQyLCBieXRlczIsICZ2YWwyKTsKLQotCQkJaWYoIHZhbDEgPT0gdmFsMikKLQkJCQkqcmVzID0gMDsKLQkJCWVsc2UKLQkJCQkqcmVzID0gMTsKLQkJCQotCQkJKmQxICs9IGJ5dGVzMTsKLQkJCSpkMiArPSBieXRlczI7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQlyZXR1cm4gMDsKLQotCQlkZWZhdWx0OgotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCQkJKnJlcyA9IDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCWNhc2UgQUlGX1ZPSUQ6Ci0JCWlmICggRkRTVHlwZSgqZjIpID09IEFJRl9WT0lEICkKLQkJCSpyZXMgPSAwOwotCQllbHNlCi0JCQkqcmVzID0gMTsKLQotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJKnJlcyA9IDE7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLWludAotX2FpZl9lcHMoY2hhciAqbG9fZmRzLCBjaGFyICpsb19kYXRhLCBpbnQgbG9fbGVuLCBjaGFyICpoaV9mZHMsIGNoYXIgKmhpX2RhdGEsIGludCBoaV9sZW4sIGNoYXIgKmFfZmRzLCBjaGFyICphX2RhdGEsIGludCBhX2xlbiwgaW50ICp2YWwpCi17Ci0JaW50CQlmdDsKLQljaGFyICoJCWZkc19yZWY7CQotCi0JaW50CQlsb19pLCBoaV9pLCBhX2k7Ci0JZG91YmxlCQlsb19kLCBoaV9kLCBhX2Q7Ci0KLQlBSUZMT05HRVNUCWxvX2xsLCBoaV9sbCwgYV9sbDsKLQlBSUZET1VCTEVTVAlsb19kZCwgaGlfZGQsIGFfZGQ7Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlfZmRzX3Jlc29sdmUoJmFfZmRzKTsKLQotCWlmICggRkRTVHlwZShhX2ZkcykgPT0gQUlGX1JFRkVSRU5DRSApCi0JewotCQlmZHNfcmVmID0gX2Zkc19sb29rdXAoJmFfZmRzKTsKLQkJcmV0dXJuIF9haWZfZXBzKGxvX2ZkcywgbG9fZGF0YSwgbG9fbGVuLCBoaV9mZHMsIGhpX2RhdGEsIGhpX2xlbiwgZmRzX3JlZiwgYV9kYXRhLCBhX2xlbiwgdmFsKTsKLQl9Ci0KLQlzd2l0Y2ggKCBmdCA9IEZEU1R5cGUoYV9mZHMpICkKLQl7Ci0JY2FzZSBBSUZfQk9PTEVBTjoKLQotCQlpZiAoIEZEU1R5cGUobG9fZmRzKSAhPSBBSUZfQk9PTEVBTiApCi0JCXsJCi0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJIAlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoIF9haWZfdG9fbG9uZ2VzdChsb19kYXRhLCBsb19sZW4sICZsb19sbCkgPCAwIHx8Ci0JCSAgICAgX2FpZl90b19sb25nZXN0KGFfZGF0YSwgYV9sZW4sICZhX2xsKSA8IDAgKQotCQkJcmV0dXJuIC0xOwotCi0JCWxvX2kgPSAoaW50KSBsb19sbDsKLQkJaGlfaSA9IChpbnQpIGhpX2xsOwotCQlhX2kgPSAoaW50KSBhX2xsOwotCi0JCWlmICggbG9faSA9PSAwICYmIGFfaSA9PSAwICkKLQkJCSp2YWwgPSAtMTsKLQkJZWxzZSBpZiAoIGxvX2kgPT0gLTEgJiYgYV9pID09IDAgKQotCQkJKnZhbCA9IDA7Ci0JCWVsc2UgaWYgKCBhX2kgPT0gLTEgKQotCQkJKnZhbCA9IDE7Ci0KLQkJcmV0dXJuIDA7Ci0JCQotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCWNhc2UgQUlGX0VOVU06Ci0JCQotCQlpZiAoIEZEU1R5cGUobG9fZmRzKSAhPSBmdCB8fAotCQkgICAgIEZEU1R5cGUoaGlfZmRzKSAhPSBmdCApCi0JCXsJCi0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkgCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoIF9haWZfdG9fbG9uZ2VzdChsb19kYXRhLCBsb19sZW4sICZsb19sbCkgPCAwIHx8Ci0JCSAgICAgX2FpZl90b19sb25nZXN0KGFfZGF0YSwgYV9sZW4sICZhX2xsKSA8IDAgfHwKLQkJICAgICBfYWlmX3RvX2xvbmdlc3QoaGlfZGF0YSwgaGlfbGVuLCAmaGlfbGwpIDwgMCApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJbG9faSA9IChpbnQpIGxvX2xsOwotCQloaV9pID0gKGludCkgaGlfbGw7Ci0JCWFfaSA9IChpbnQpIGFfbGw7Ci0KLQkJaWYgKCBhX2kgPCBsb19pICkKLQkJCSp2YWwgPSAtMTsKLQkJZWxzZSBpZiAoIGxvX2kgPD0gYV9pICYmIGFfaSA8PSBoaV9pICkKLQkJCSp2YWwgPSAwOwotCQllbHNlIGlmIChhX2kgPiBoaV9pICkKLQkJCSp2YWwgPSAxOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfU1RSSU5HOgotCi0JCWlmICggRkRTVHlwZShsb19mZHMpICE9IEFJRl9TVFJJTkcgfHwKLQkJICAgICBGRFNUeXBlKGhpX2ZkcykgIT0gQUlGX1NUUklORyApCi0JCXsJCi0JCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkgCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoIF9haWZfdG9fbG9uZ2VzdChsb19kYXRhICsgMiwgbG9fbGVuIC0gMiwgJmxvX2xsKSA8IDAgfHwKLQkJICAgICBfYWlmX3RvX2xvbmdlc3QoYV9kYXRhICsgMiwgYV9sZW4gLSAyLCAmYV9sbCkgPCAwIHx8Ci0JCSAgICAgX2FpZl90b19sb25nZXN0KGhpX2RhdGEgKyAyLCBoaV9sZW4gLSAyLCAmaGlfbGwpIDwgMCApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJbG9faSA9IChpbnQpIGxvX2xsOwotCQloaV9pID0gKGludCkgaGlfbGw7Ci0JCWFfaSA9IChpbnQpIGFfbGw7Ci0KLQkJaWYgKCBhX2kgPCBsb19pICkKLQkJCSp2YWwgPSAtMTsKLQkJZWxzZSBpZiAoIGxvX2kgPD0gYV9pICYmIGFfaSA8PSBoaV9pICkKLQkJCSp2YWwgPSAwOwotCQllbHNlIGlmIChhX2kgPiBoaV9pICkKLQkJCSp2YWwgPSAxOwotCi0JCXJldHVybiAwOwotCi0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JCQotCQlpZiAoIEZEU1R5cGUobG9fZmRzKSAhPSBBSUZfRkxPQVRJTkcgfHwKLQkJICAgICBGRFNUeXBlKGhpX2ZkcykgIT0gQUlGX0ZMT0FUSU5HICkKLQkJewkKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCSAJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmICggX2FpZl90b19kb3VibGVzdChsb19kYXRhLCBsb19sZW4sICZsb19kZCkgPCAwIHx8Ci0JCSAgICAgX2FpZl90b19kb3VibGVzdChhX2RhdGEsIGFfbGVuLCAmYV9kZCkgPCAwIHx8Ci0JCSAgICAgX2FpZl90b19kb3VibGVzdChoaV9kYXRhLCBoaV9sZW4sICZoaV9kZCkgPCAwICkKLQkJCXJldHVybiAtMTsKLQotCQlsb19kID0gKGludCkgbG9fZGQ7Ci0JCWhpX2QgPSAoaW50KSBoaV9kZDsKLQkJYV9kID0gKGludCkgYV9kZDsKLQotCQlpZiAoIGFfZCA8IGxvX2QgKQotCQkJKnZhbCA9IC0xOwotCQllbHNlIGlmICggbG9fZCA8PSBhX2QgJiYgYV9kIDw9IGhpX2QgKQotCQkJKnZhbCA9IDA7Ci0JCWVsc2UgaWYgKGFfZCA+IGhpX2QgKQotCQkJKnZhbCA9IDE7Ci0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIEFJRl9BUlJBWToKLQkJewotCQkJaW50IAkJdG1wLCBpOwotCQkJQUlGSW5kZXggKglpeDsKLQotCQkJY2hhciAqCQl0X2ZtdDsKLQkJCWNoYXIgKgkJdF9kdDE7Ci0JCQljaGFyICoJCXRfZHQyOwotCQkJaW50CQl0X2xlbjsKLQotCQkJaXggPSBGRFNBcnJheUluZGV4SW5pdChhX2Zkcyk7Ci0KLQkJCXRfZHQxID0gYV9kYXRhOwotCi0JCQlmb3IgKCBpID0gMCA7IGkgPCBpeC0+aV9uZWwgOyBpKysgKQotCQkJewotCQotCQkJCXRfZm10ID0gaXgtPmlfYnR5cGU7Ci0JCQkJdF9kdDIgPSB0X2R0MTsKLQotCQkJCV9mZHNfc2tpcF9kYXRhKCZ0X2ZtdCwgJnRfZHQxKTsKLQkJCQl0X2xlbiA9IHRfZHQxIC0gdF9kdDI7Ci0KLQkJCQlpZiAoIF9haWZfZXBzKGxvX2ZkcywgbG9fZGF0YSwgbG9fbGVuLCBoaV9mZHMsIGhpX2RhdGEsIGhpX2xlbiwgaXgtPmlfYnR5cGUsIHRfZHQyLCB0X2xlbiwgJnRtcCkgPCAwICkKLQkJCQl7Ci0JCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCWlmICggdG1wID09IDAgfHwgdG1wID09IDEgKQotCQkJCXsKLQkJCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgpOwotCQkJCQkqdmFsID0gdG1wOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4KTsKLQkJCSp2YWwgPSAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkvKiBvbmx5IHdvcmtzIHdpdGggdGhlIHB1YmxpYyBzZWN0aW9uIGluIEFJRl9TVFJVQ1QgKi8KLQljYXNlIEFJRl9TVFJVQ1Q6Ci0JCXsKLQkJCWludCAJCXRtcDsKLQotCQkJY2hhciAqCQl0X2Z0MTsKLQkJCWNoYXIgKgkJdF9mdDI7Ci0JCQljaGFyICoJCXRfZHQxOwotCQkJY2hhciAqCQl0X2R0MjsKLQkJCWludAkJdF9sZW47Ci0KLQkJCWFfZmRzKys7Ci0JCQlfZmRzX3NraXBpZCgmYV9mZHMpOwotCi0JCQl0X2R0MSA9IGFfZGF0YTsKLQkJCXRfZnQxID0gYV9mZHM7Ci0KLQkJCXdoaWxlICggKnRfZnQxICE9ICc7JyApCi0JCQl7Ci0JCi0JCQkJdF9mdDEgPSBzdHJjaHIodF9mdDEsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsKLQotCQkJCXRfZHQyID0gdF9kdDE7Ci0JCQkJdF9mdDIgPSB0X2Z0MTsKLQotCQkJCV9mZHNfc2tpcF9kYXRhKCZ0X2Z0MSwgJnRfZHQxKTsKLQkJCQl0X2xlbiA9IHRfZHQxIC0gdF9kdDI7Ci0KLQkJCQlpZiAoIF9haWZfZXBzKGxvX2ZkcywgbG9fZGF0YSwgbG9fbGVuLCBoaV9mZHMsIGhpX2RhdGEsIGhpX2xlbiwgdF9mdDIsIHRfZHQyLCB0X2xlbiwgJnRtcCkgPCAwICkKLQkJCQl7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0KLQkJCQlpZiAoIHRtcCA9PSAwIHx8IHRtcCA9PSAxICkKLQkJCQl7Ci0JCQkJCSp2YWwgPSB0bXA7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQotCQkJKnZhbCA9IC0xOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0JCXsKLQkJCWNoYXIgKgl0YXJnZXQgPSBfZmluZF90YXJnZXQoJmFfZGF0YSwgMCk7Ci0JCQlpbnQJdG1wOwotCi0JCQlhX2ZkcysrOwotCQkJYV9sZW4tLTsKLQotCQkJaWYgKCBfYWlmX2Vwcyhsb19mZHMsIGxvX2RhdGEsIGxvX2xlbiwgaGlfZmRzLCBoaV9kYXRhLCBoaV9sZW4sIGFfZmRzLCB0YXJnZXQsIGFfbGVuLCAmdG1wKSA8IDAgKQotCQkJewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJKnZhbCA9IHRtcDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qIEFJRkVQUwotICoKLSAqIHJldHVybl92YWx1ZSBpcyBpbiB2YWwKLSAqCi0gKiBBSUZfQk9PTEVBTiAodHlwZSBvZiBsbyAmIGhpIGlzIEFJRl9CT09MRUFOKQotICogdmFsID0gLTEJCWlmCSFsbyAmICFhCi0gKiB2YWwgPSAwCQlpZglsbyAmICFhCi0gKiB2YWwgPSAxCQlpZiAJYQotICoKLSAqIEFJRl9JTlRFR0VSLCBBSUZfQ0hBUiwgQUlGX0VOVU0sIEFJRl9TVFJJTkcgKHR5cGUgb2YgbG8gJiBoaSBpcyBBSUZfSU5URUdFUikKLSAqIHZhbCA9IC0xCQlpZglhIDwgbG8KLSAqIHZhbCA9IDAJCWlmCWxvIDw9IGEgPD0gaGkKLSAqIHZhbCA9IDEJCWlmCWEgPiBoaQotICoKLSAqIEFJRl9GTE9BVElORyAodHlwZSBvZiBsbyAmIGhpIGlzIEFJRl9GTE9BVElORykKLSAqIHZhbCA9IC0xCQlpZglhIDwgbG8KLSAqIHZhbCA9IDAJCWlmCWxvIDw9IGEgPD0gaGkKLSAqIHZhbCA9IDEJCWlmCWEgPiBoaQotICoKLSAqIEFJRl9BUlJBWSAodHlwZSBvZiBsbyAmIGhpIGlzIHRoZSBiYXNlIG9mIEFJRl9BUlJBWSkKLSAqIHZhbCA9IC0xCQlpZgllcHMoYVtpXSkgPT0gLTEgZm9yIEFMTCBpCi0gKiB2YWwgPSAwCQlpZgllcHMoYVtpXSkgPT0gMCBmb3IgQU5ZIGkKLSAqIHZhbCA9IDEJCWlmCWVwcyhhW2ldKSA9PSAxIGZvciBBTlkgaQotICoKLSAqIEFJRl9TVFJVQ1QgKHR5cGUgb2YgbG8gJiBoaSBpcyBBSUZfU1RSVUNUKQotICogdmFsID0gLTEJCWlmCWVwcyhlbGVtZW50W2ldKSA9PSAtMSBmb3IgQUxMIGkKLSAqIHZhbCA9IDAJCWlmCWVwcyhlbGVtZW50W2ldKSA9PSAwIGZvciBBTlkgaQotICogdmFsID0gMQkJaWYJZXBzKGVsZW1lbnRbaV0pID09IDEgZm9yIEFOWSBpCi0gKgotICogQUlGX1BPSU5URVIgKHR5cGUgb2YgbG8gJiBoaSBpcyB0aGUgYmFzZSBvZiBBSUZfQVJSQVkpCi0gKiB2YWwgPSBlcHMoYSkJCWlmCWEgPSAqcAotICoKLSAqIE90aGVyIHR5cGVzCi0gKiBFUlJPUgotICovCi0KLWludAotQUlGRVBTKEFJRiAqbG8sIEFJRiAqaGksIEFJRiAqYSwgaW50ICp2YWwpCi17Ci0JcmV0dXJuIF9haWZfZXBzKEFJRl9GT1JNQVQobG8pLCBBSUZfREFUQShsbyksIEFJRl9MRU4obG8pLCBBSUZfRk9STUFUKGhpKSwgQUlGX0RBVEEoaGkpLCBBSUZfTEVOKGhpKSwgQUlGX0ZPUk1BVChhKSwgQUlGX0RBVEEoYSksIEFJRl9MRU4oYSksIHZhbCk7Ci19Ci0KLQotQUlGICoKLUFJRkRpZmYoaW50IGRlcHRoLCBBSUYgKmExLCBBSUYgKmEyKQotewotICAgICAgICBjaGFyICogIHJkOwotICAgICAgICBjaGFyICogIHJmOwotICAgICAgICBjaGFyICogIGYxOwotICAgICAgICBjaGFyICogIGYyOwotICAgICAgICBjaGFyICogIGQxOwotICAgICAgICBjaGFyICogIGQyOwotCi0gICAgICAgIGlmICggYTEgPT0gKEFJRiAqKU5VTEwgfHwgYTIgPT0gKEFJRiAqKU5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBmMSA9IEFJRl9GT1JNQVQoYTEpOwotICAgICAgICBmMiA9IEFJRl9GT1JNQVQoYTIpOwotICAgICAgICBkMSA9IEFJRl9EQVRBKGExKTsKLSAgICAgICAgZDIgPSBBSUZfREFUQShhMik7Ci0KLSAgICAgICAgcmYgPSBOVUxMOyAvKiB3ZSBkb24ndCBrbm93IHJlc3VsdCBzbyBsZXQgX2FpZl9iaW5hcnlfb3Agd29yayBpdCBvdXQgKi8KLSAgICAgICAgcmQgPSBOVUxMOwotICAgICAgICAvL3JkID0gX2FpZl9hbGxvYyhNQVgoQUlGX0xFTihhMSksIEFJRl9MRU4oYTIpKSk7Ci0KLSAgICAgICAgaWYgKCBfYWlmX2RpZmYoZGVwdGgsICZyZiwgJnJkLCAmZjEsICZkMSwgJmYyLCAmZDIpIDwgMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIChBSUYgKilOVUxMOwotCi0JcmV0dXJuIE1ha2VBSUYocmYsIHJkKTsKLX0KLQotLyoKLSAqIENvbXBhcmUgdHdvIEFJRiB2YWx1ZXMuIFJldHVybnMgYW4gQUlGIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUKLSAqICdkaWZmZXJlbmNlJyBiZXR3ZWVuIHRoZSB2YWx1ZXMuCi0gKgotICogSW4gdGhlIGNhc2Ugb2Ygc2NhbGFyIHZhbHVlcyB0aGUgZGlmZmVyZW5jZSBpczogdmFsMSAtIHZhbDIKLSAqIEluIHRoZSBjYXNlIG9mIGJvb2xlYW5zIGl0IGlzIFRSVUUgaWYgdGhleSBhcmUgZGlmZmVyZW50Ci0gKiBJbiB0aGUgY2FzZSBvZiBzdHJpbmdzIGl0IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgJzEnIGluIHRoZSBwb3NpdGlvbnMKLSAqICAgd2hlcmUgY2hhcmFjdGVycyBkaWZmZXIgYW5kICcwJyBpbiBwb3NpdGlvbnMgd2hlcmUgdGhleSBhcmUgdGhlIHNhbWUuCi0gKiAKLSAqIENvbXBsZXggb2JqZWN0cyBjYW4gYWxzbyBiZSBjb21wYXJlZC4gSW4gdGhpcyBjYXNlIHRoZSBhYm92ZSBydWxlcyBhcmUKLSAqIGFwcGxpZWQgdG8gZWFjaCBmaWVsZCBvciBlbGVtZW50IGluIHRoZSBvYmplY3QuCi0gKi8KLWludAotX2FpZl9kaWZmKGludCBkZXB0aCwgY2hhciAqKnJmLCBjaGFyICoqcmQsCi0JICAJICAgICBjaGFyICoqZjEsIGNoYXIgKipkMSwKLQkgIAkgICAgIGNoYXIgKipmMiwgY2hhciAqKmQyKQotewotCWludAlpOwotCWludAlieXRlczE7Ci0JaW50CWJ5dGVzMjsKLQljaGFyICoJZm10OwotCWludAlkYXRhbGVuOyAvKiB0byBrZWVwIHRyYWNrIG9mIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGFudCBkYXRhICovCi0JaW50CWN1cnJlbnRsZW47IC8qIGN1cnJlbnQgZGF0YSBsZW5ndGggKi8KLQotCS8qIHRoZXNlIGNtcF9ieV9uYW1lLCBmMl94KiBhbmQgZDJfeCogYXJlIHVzZWQgYnkgJ2Nhc2UgQUlGX1NUUlVDVCcgKi8KLQlpbnQJY21wX2J5X25hbWUgPSAwOwotCWNoYXIgKglmMl94MTsKLQljaGFyICoJZjJfeDI7Ci0JY2hhciAqCWQyX3gxOwotCWNoYXIgKglkMl94MjsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCV9mZHNfcmVzb2x2ZShmMSk7Ci0JX2Zkc19yZXNvbHZlKGYyKTsKLQotCWlmICggRkRTVHlwZSgqZjEpID09IEFJRl9SRUZFUkVOQ0UgKQotCXsKLQkJZm10ID0gX2Zkc19sb29rdXAoZjEpOwotCQlyZXR1cm4gX2FpZl9kaWZmKGRlcHRoLCByZiwgcmQsICZmbXQsIGQxLCBmMiwgZDIpOwotCX0KLQotCWlmICggRkRTVHlwZSgqZjIpID09IEFJRl9SRUZFUkVOQ0UgKQotCXsKLQkJZm10ID0gX2Zkc19sb29rdXAoZjIpOwotCQlyZXR1cm4gX2FpZl9kaWZmKGRlcHRoLCByZiwgcmQsIGYxLCBkMSwgJmZtdCwgZDIpOwotCX0KLQotCXN3aXRjaCAoIEZEU1R5cGUoKmYxKSApCi0JewotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQlyZXR1cm4gX2FpZl9iaW5hcnlfb3AoQUlGT1BfU1VCLCByZiwgcmQsIGYxLCBkMSwgZjIsIGQyKTsKLQotCS8qIHJldHVybnMgRkFMU0UgaWYgdGhleSBhcmUgdGhlIHNhbWUgKi8JCi0JY2FzZSBBSUZfQk9PTEVBTjoKLQkJYnl0ZXMxID0gX2Zkc19jb3VudF9ieXRlc19uYShmMSk7Ci0JCWJ5dGVzMiA9IF9mZHNfY291bnRfYnl0ZXNfbmEoZjIpOwotCi0JCXN3aXRjaCAoIEZEU1R5cGUoKmYyKSApCi0JCXsKLQkJY2FzZSBBSUZfQk9PTEVBTjoKLQkJCXsKLQkJCQotCQkJCUFJRkxPTkdFU1QJdmFsMTsKLQkJCQlBSUZMT05HRVNUCXZhbDI7Ci0JCQkJQUlGTE9OR0VTVAl2YWwzOwotCQkJCi0JCQkJaWYgKCAqcmQgPT0gTlVMTCApCi0JCQkJCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhNQVgoYnl0ZXMxLCBieXRlczIpKTsKLQotCQkJCV9haWZfdG9fbG9uZ2VzdCgqZDEsIGJ5dGVzMSwgJnZhbDEpOwotCQkJCV9haWZfdG9fbG9uZ2VzdCgqZDIsIGJ5dGVzMiwgJnZhbDIpOwotCQkJCXZhbDMgPSB2YWwxIF4gdmFsMjsKLQkJCQlfbG9uZ2VzdF90b19haWYocmQsIE1BWChieXRlczEsIGJ5dGVzMiksIHZhbDMpOwotCi0JCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJCSpyZiA9IHN0cmR1cChBSUZfQk9PTEVBTl9UWVBFKCkpOwotCi0JCQkJKmQxICs9IGJ5dGVzMTsKLQkJCQkqZDIgKz0gYnl0ZXMyOwotCi0JCQkJX2Zkc19hZHZhbmNlKGYxKTsKLQkJCQlfZmRzX2FkdmFuY2UoZjIpOwotCQkJfQotCi0JCQlyZXR1cm4gMDsKLQotCQlkZWZhdWx0OgotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfQVJSQVk6Ci0JCXsKLQkJCUFJRkluZGV4ICoJaXgxOwotCQkJQUlGSW5kZXggKglpeDI7Ci0JCQljaGFyICoJCWZtdDE7Ci0JCQljaGFyICoJCWZtdDI7Ci0JCQljaGFyICoJCWZyZXMgPSBOVUxMOwotCQkJY2hhciAqCQlkcmVzID0gTlVMTDsKLQotCQkJaWYgKCBGRFNUeXBlKCpmMikgIT0gQUlGX0FSUkFZICkKLQkJCXsKLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpeDEgPSBGRFNBcnJheUluZGV4SW5pdCgqZjEpOwotCQkJaXgyID0gRkRTQXJyYXlJbmRleEluaXQoKmYyKTsKLQotCQkJaWYgKCBpeDEtPmlfbmVsICE9IGl4Mi0+aV9uZWwgKQotCQkJewotCQkJCVNldEFJRkVycm9yKEFJRkVSUl9TSVpFLCBOVUxMKTsKLQkJCQlBSUZBcnJheUluZGV4RnJlZShpeDEpOwotCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpZiAoICpyZCA9PSBOVUxMICkKLQkJCXsKLQkJCQkvKiBXZSBhbGxvY2F0ZSByZCBhcyBiaWcgYXMgZDEuCi0JCQkJKiBOb3RlOiBTaW5jZSBfYWlmX2RpZmYgY2FuIHByb2R1Y2UgcmVzdWx0IHdoaWNoCi0JCQkJKiBpcyBiaWdnZXIgdGhhbiBpdHMgYXJndW1lbnRzLCAoZWc6IF9haWZfZGlmZgotCQkJCSogd2l0aCBTVFJJTkdTIGFuZCBQT0lOVEVSUyksIHdlIGFsc28gbmVlZCB0bwotCQkJCSoga2VlcCB0cmFjayBvZiB0aGUgbGVuZ3RoIG9mIHJkLCBhbmQgcmVzaXplIGl0Ci0JCQkJKiB3aGVuIGl0J3Mgbm90IGVub3VnaC4KLQkJCQkqLwotCi0JCQkJY2hhciAqIHRlbXAxID0gKmYxOwotCQkJCWNoYXIgKiB0ZW1wMiA9ICpkMTsKLQkJCQlpbnQgICAgdGVtcDMgPSAwOwotCi0JCQkJX2Zkc19za2lwX2RhdGEoJnRlbXAxLCAmdGVtcDIpOwotCQkJCXRlbXAzID0gdGVtcDIgLSAoKmQxKTsKLQkJCQkqcmQgPSAoY2hhciAqKV9haWZfYWxsb2ModGVtcDMpOwotCQkJCWRhdGFsZW4gPSB0ZW1wMzsKLQkJCX0KLQotCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJKnJmID0gc3RyZHVwKCpmMSk7Ci0KLQkJCV9mZHNfYWR2YW5jZShmMSk7IC8qIHNraXAgb3ZlciB0aGUgZW50aXJlIGFycmF5IGZkcyAqLwotCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQotCQkJLyoKLQkJCSoqIElmIG5lbFsxMl0gPiBNQVhfQUREUkVTUyB0aGVuIHdlIGFyZSBub3QgZ29pbmcgdG8gYmUKLQkJCSoqIGFibGUgdG8gYWRkcmVzcyBhbGwgdGhlIGRhdGEgaW4gdGhlIGFycmF5LiBXaGF0IHNob3VsZAotCQkJKiogd2UgZG8/Ci0JCQkqLwotCi0JCQljdXJyZW50bGVuID0gMDsgLyogc3RhcnQgb2Ygb3VyIGRhdGEgcmVzdWx0IHJlZ2lvbiAqLwotCi0JCQlmb3IgKCBpID0gMCA7IGkgPCBpeDEtPmlfbmVsIDsgaSsrICkKLQkJCXsKLQkJCQljaGFyICogdG1wMTsKLQkJCQljaGFyICogdG1wMjsKLQotCQkJCWlmICggZHJlcyAhPSBOVUxMICkKLQkJCQl7Ci0JCQkJCV9haWZfZnJlZShkcmVzKTsKLQkJCQkJZHJlcyA9IE5VTEw7Ci0JCQkJfQotCi0JCQkJaWYgKCBmcmVzICE9IE5VTEwgKQotCQkJCXsKLQkJCQkJX2FpZl9mcmVlKGZyZXMpOwotCQkJCQlmcmVzID0gTlVMTDsKLQkJCQl9Ci0KLQkJCQlmbXQxID0gaXgxLT5pX2J0eXBlOwotCQkJCWZtdDIgPSBpeDItPmlfYnR5cGU7Ci0KLQkJCQlpZiAoIF9haWZfZGlmZihkZXB0aCwgJmZyZXMsICZkcmVzLCAmZm10MSwgZDEsICZmbXQyLCBkMikgPCAwICkKLQkJCQl7Ci0JCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4MSk7Ci0JCQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0KLQkJCQlBSUZBcnJheUluZGV4SW5jKGl4MSk7Ci0JCQkJQUlGQXJyYXlJbmRleEluYyhpeDIpOwotCi0JCQkJdG1wMSA9IGZyZXM7Ci0JCQkJdG1wMiA9IGRyZXM7Ci0JCQkJX2Zkc19za2lwX2RhdGEoJnRtcDEsICZ0bXAyKTsKLQotCQkJCS8qIElzIHRoZSAqcmQgbGFyZ2UgZW5vdWdoPyAqLwotCQkJCWlmIChkYXRhbGVuIDwgKGN1cnJlbnRsZW4gKyAodG1wMiAtIGRyZXMpKSkKLQkJCQl7Ci0JCQkJCSpyZCA9IF9haWZfcmVzaXplKCpyZCwgZGF0YWxlbiArIEJVRlNJWik7Ci0JCQkJCWRhdGFsZW4gKz0gQlVGU0laOwotCQkJCX0KLQotCQkJCW1lbWNweSgqcmQgKyBjdXJyZW50bGVuLCBkcmVzLCB0bXAyLWRyZXMpOwotCQkJCWN1cnJlbnRsZW4gKz0gKHRtcDItZHJlcyk7Ci0JCQl9Ci0KLQkJCXsKLQkJCQkvKiB3ZSBuZWVkIHRvIG1vZGlmeSAncmYnIGJlY2F1c2UgaXQgaXMKLQkJCQkgKiBwb3NzaWJsZSB0aGF0IF9haWZfZGlmZiByZXR1cm5zIHNvbWV0aGluZwotCQkJCSAqIHRoYXQgaGFzIGEgZGlmZmVyZW50IGZkcyB0aGFuIHRoZSBvcGVyYW5kcwotCQkJCSAqLwotCi0JCQkJY2hhciAqdDEsICp0MjsKLQkJCQlpbnQgbGVuOwotCi0JCQkJdDEgPSBfZmRzX2Jhc2VfdHlwZSgqcmYpOwotCi0JCQkJLyogaWYgaXQgaXMgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIG1vdmUgdDEKLQkJCQkgKiB0byB0aGUgYmFzZSB0eXBlCi0JCQkJICovCi0KLQkJCQl3aGlsZSAoICp0MSA9PSBGRFNfQVJSQVlfU1RBUlQgKQotCQkJCQl0MSA9IF9mZHNfYmFzZV90eXBlKHQxKTsKLQotCQkJCS8qIHdlIHdhbnQgdG8ga2VlcCB0aGUgRkRTX05BTUUgKi8KLQkJCQl3aGlsZSAoICp0MSA9PSBGRFNfTkFNRSApCi0JCQkJewotCQkJCQl0MSsrOwotCQkJCQl0MSA9IChjaGFyICopX2Zkc19za2lwbnVtKHQxKSsxOwotCQkJCX0KLQotCQkJCXQyID0gdDE7Ci0JCQkJX2Zkc19hZHZhbmNlKCZ0Mik7Ci0KLQkJCQlsZW4gPSBzdHJsZW4oZnJlcyk7Ci0JCQkJbWVtbW92ZSh0MSwgZnJlcywgbGVuKTsKLQkJCQl0MSArPSBsZW47Ci0KLQkJCQkvKiB0aGlzIHBhcnQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaXQKLQkJCQkgKiBpcyBwb3NzaWJsZSB0aGF0IHRoZSBhcnJheSBpcyBwYXJ0IG9mIGEKLQkJCQkgKiBsYXJnZXIgc3RydWN0dXJlIChpZTogd2UgZG9uJ3Qgd2FudCB0byBjdXQKLQkJCQkgKiB0aGUgcmVzdCBvZiB0aGUgZmRzKQotCQkJCSAqLwotCQkJCWlmICggKnQyICE9ICdcMCcgKQotCQkJCXsKLQkJCQkJbGVuID0gc3RybGVuKHQyKTsKLQkJCQkJbWVtbW92ZSh0MSwgdDIsIGxlbisxKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQkqdDEgPSAnXDAnOwotCQkJfQotCi0JCQlfYWlmX2ZyZWUoZnJlcyk7Ci0JCQlfYWlmX2ZyZWUoZHJlcyk7Ci0KLQkJCWZtdCA9ICpyZjsKLQkJCV9mZHNfYWR2YW5jZSgmZm10KTsKLQkJCSpmbXQgPSAnXDAnOwotCi0JCQlBSUZBcnJheUluZGV4RnJlZShpeDEpOwotCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgyKTsKLQkJfQotCi0JCXJldHVybiAwOwotCi0JLyogb25seSB3b3JrcyB3aXRoIHRoZSBwdWJsaWMgc2VjdGlvbiBpbiBBSUZfU1RSVUNUICovCi0JY2FzZSBBSUZfU1RSVUNUOgotCQlpZiAoIEZEU1R5cGUoKmYyKSAhPSBBSUZfU1RSVUNUICkKLQkJewotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKCBBSUZHZXRPcHRpb24oQUlGT1BUX0NNUF9NRVRIT0QpID09IEFJRl9DTVBfQllfTkFNRSApCi0JCXsJCi0JCQljbXBfYnlfbmFtZSA9IDE7Ci0JCQlmMl94MSA9ICpmMjsKLQkJCWQyX3gxID0gKmQyOwotCQkJZjJfeDIgPSBOVUxMOwotCQkJZDJfeDIgPSBOVUxMOwotCQkJX2Zkc19za2lwX2RhdGEoJmYyX3gxLCAmZDJfeDEpOwotCQkJaWYgKCBfZmRzX3N0cnVjdF9hcnJhbmdlKCpmMSwgKmYyLCAqZDIsICZmMl94MiwgJmQyX3gyKSA8IDAgKQotCQkJewotCQkJCVNldEFJRkVycm9yKEFJRkVSUl9DT05WLCBOVUxMKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkqZjIgPSBmMl94MjsgCi0JCQkqZDIgPSBkMl94MjsKLQkJCS8qIGF0IHRoZSBlbmQsIHdlIGFzc2lnbiBmMl94MSB0byBmMiwgZDJfeDEgdG8gZDIsCi0JCQkqKiBhbmQgd2UgZnJlZSBmMl94MiBhbmQgZDJfeDIgKi8KLQkJfQotCi0JCWlmICggKnJkID09IE5VTEwgKQotCQl7Ci0JCQkvKiBXZSBhbGxvY2F0ZSByZCBhcyBiaWcgYXMgZDEuCi0JCQkqIE5vdGU6IFNpbmNlIF9haWZfZGlmZiBjYW4gcHJvZHVjZSByZXN1bHQgd2hpY2gKLQkJCSogaXMgYmlnZ2VyIHRoYW4gaXRzIGFyZ3VtZW50cywgKGVnOiBfYWlmX2RpZmYKLQkJCSogd2l0aCBTVFJJTkdTIGFuZCBQT0lOVEVSUyksIHdlIGFsc28gbmVlZCB0bwotCQkJKiBrZWVwIHRyYWNrIG9mIHRoZSBsZW5ndGggb2YgcmQsIGFuZCByZXNpemUgaXQKLQkJCSogd2hlbiBpdCdzIG5vdCBlbm91Z2guCi0JCQkqLwotCi0JCQljaGFyICogdGVtcDEgPSAqZjE7Ci0JCQljaGFyICogdGVtcDIgPSAqZDE7Ci0JCQlpbnQgICAgdGVtcDMgPSAwOwotCi0JCQlfZmRzX3NraXBfZGF0YSgmdGVtcDEsICZ0ZW1wMik7Ci0JCQl0ZW1wMyA9IHRlbXAyIC0gKCpkMSk7Ci0JCQkqcmQgPSAoY2hhciAqKV9haWZfYWxsb2ModGVtcDMpOwotCQkJZGF0YWxlbiA9IHRlbXAzOwotCQl9Ci0KLQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkqcmYgPSBzdHJkdXAoKmYxKTsKLQotCQljdXJyZW50bGVuID0gMDsgLyogc3RhcnQgb2Ygb3VyIGRhdGEgcmVzdWx0IHJlZ2lvbiAqLwotCi0JCSgqZjEpKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCQkoKmYyKSsrOyAvKiBwYXN0IG9wZW4gYnJhY2UgKi8KLQkJX2Zkc19za2lwaWQoZjEpOwotCQlfZmRzX3NraXBpZChmMik7Ci0KLQkJd2hpbGUgKCAqKmYxICE9ICc7JyApCi0JCXsgLyogZG8gb25lIGZpZWxkICovCi0KLQkJCWNoYXIgKiBkcmVzID0gTlVMTDsKLQkJCWNoYXIgKiBmcmVzID0gTlVMTDsKLQkJCWNoYXIgKiB0bXAxOwotCQkJY2hhciAqIHRtcDI7Ci0KLQkJCWlmICgqKmYyID09ICc7JykgeyAvKiBmMSBoYXMgbW9yZSBmaWVsZHMgKi8KLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQkJaWYgKGNtcF9ieV9uYW1lID09IDEpCi0JCQkJewotCQkJCQlfYWlmX2ZyZWUoZjJfeDIpOwotCQkJCQlfYWlmX2ZyZWUoZDJfeDIpOwotCQkJCQkqZjIgPSBmMl94MTsKLQkJCQkJKmQyID0gZDJfeDE7Ci0JCQkJfQotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJKmYxID0gc3RyY2hyKCpmMSwgRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORCkgKyAxOyAvKiB0byBzdGFydCBvZiBmaWVsZCovCi0JCQkqZjIgPSBzdHJjaHIoKmYyLCBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EKSArIDE7IC8qIHRvIHN0YXJ0IG9mIGZpZWxkKi8KLQotCQkJZm10ID0gKmYxOwotCi0JCQlpZiAoIF9haWZfZGlmZihkZXB0aCwgJmZyZXMsICZkcmVzLCBmMSwgZDEsIGYyLCBkMikgPCAwICkKLQkJCXsKLQkJCQlpZiAoY21wX2J5X25hbWUgPT0gMSkKLQkJCQl7Ci0JCQkJCV9haWZfZnJlZShmMl94Mik7Ci0JCQkJCV9haWZfZnJlZShkMl94Mik7Ci0JCQkJCSpmMiA9IGYyX3gxOwotCQkJCQkqZDIgPSBkMl94MTsKLQkJCQl9Ci0JCQkJcmV0dXJuIC0xOyAvKiBub24temVybyByZXMgbWVhbnMgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIgKi8KLQkJCX0KLQotCQkJdG1wMSA9IGZyZXM7Ci0JCQl0bXAyID0gZHJlczsKLQkJCV9mZHNfc2tpcF9kYXRhKCZ0bXAxLCAmdG1wMik7Ci0KLQkJCS8qIElzIHRoZSAqcmQgbGFyZ2UgZW5vdWdoPyAqLwotCQkJaWYgKGRhdGFsZW4gPCAoY3VycmVudGxlbiArICh0bXAyIC0gZHJlcykpKQotCQkJewotCQkJCSpyZCA9IF9haWZfcmVzaXplKCpyZCwgZGF0YWxlbiArIEJVRlNJWik7Ci0JCQkJZGF0YWxlbiArPSBCVUZTSVo7Ci0JCQl9Ci0KLQkJCW1lbWNweSgqcmQgKyBjdXJyZW50bGVuLCBkcmVzLCB0bXAyLWRyZXMpOwotCQkJY3VycmVudGxlbiArPSAodG1wMi1kcmVzKTsKLQotCQkJewotCQkJCWNoYXIgKnQxLCAqdDI7Ci0JCQkJaW50IGxlbjsKLQotCQkJCXQxID0gc3Ryc3RyKCpyZiwgZm10KTsKLQkJCQl0MiA9IHQxOwotCQkJCV9mZHNfYWR2YW5jZSgmdDIpOwotCi0JCQkJbGVuID0gc3RybGVuKGZyZXMpOwotCQkJCW1lbW1vdmUodDEsIGZyZXMsIGxlbik7Ci0JCQkJdDEgKz0gbGVuOwotCi0JCQkJaWYgKCB0MSAhPSB0MiApCi0JCQkJewotCQkJCQlsZW4gPSBzdHJsZW4odDIpOwotCQkJCQltZW1tb3ZlKHQxLCB0MiwgbGVuKzEpOwotCQkJCX0KLQkJCX0KLQotCQkJX2FpZl9mcmVlKGZyZXMpOwotCQkJX2FpZl9mcmVlKGRyZXMpOwotCi0JCQlpZiAoICoqZjEgPT0gJywnICkKLQkJCQkoKmYxKSsrOwotCi0JCQlpZiAoICoqZjIgPT0gJywnICkKLQkJCQkoKmYyKSsrOwotCQl9IC8qIG9uZSBmaWVsZCAqLwotCi0JCWlmICggKipmMiAhPSAnOycgKQotCQl7IC8qIGYyIGhhcyBtb3JlIGZpZWxkcyAqLwotCQkJaWYgKGNtcF9ieV9uYW1lID09IDEpCi0JCQl7Ci0JCQkJX2FpZl9mcmVlKGYyX3gyKTsKLQkJCQlfYWlmX2ZyZWUoZDJfeDIpOwotCQkJCSpmMiA9IGYyX3gxOwotCQkJCSpkMiA9IGQyX3gxOwotCQkJfQotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJZm10ID0gKnJmOwotCQlfZmRzX2FkdmFuY2UoJmZtdCk7Ci0JCSpmbXQgPSAnXDAnOwotCi0JCSpmMSA9IHN0cmNocigqZjEsICd9JykgKyAxOyAvKiB0byBzdGFydCBvZiBmaWVsZCovCi0JCSpmMiA9IHN0cmNocigqZjIsICd9JykgKyAxOyAvKiB0byBzdGFydCBvZiBmaWVsZCovCi0KLQkJaWYgKGNtcF9ieV9uYW1lID09IDEpCi0JCXsKLQkJCV9haWZfZnJlZShmMl94Mik7Ci0JCQlfYWlmX2ZyZWUoZDJfeDIpOwotCQkJKmYyID0gZjJfeDE7Ci0JCQkqZDIgPSBkMl94MTsKLQkJfQotCQlyZXR1cm4gMDsKLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0JCWlmICggRkRTVHlwZSgqZjIpICE9IEFJRl9QT0lOVEVSICkKLQkJewotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaW50ICAgIHJldDsKLQkJCWludCAgICBsZW47Ci0JCQlpbnQgICAgZmRzX3R5cGU7Ci0JCQljaGFyICogdG1wMTsKLQkJCWNoYXIgKiB0bXAyOwotCQkJY2hhciAqIHB0cl90eXBlXzEgPSAqZDE7Ci0JCQljaGFyICogcHRyX3R5cGVfMiA9ICpkMjsKLQotCQkJY2hhciAqIHRhcmdldDEgPSBfZmluZF90YXJnZXQoZDEsIDApOwotCQkJY2hhciAqIHRhcmdldDIgPSBfZmluZF90YXJnZXQoZDIsIE1BWF9WQUxVRVNfU0VFTi8yKTsKLQotCQkJY2hhciAqIGZyZXM7Ci0JCQljaGFyICogZHJlczsKLQotCQkJaWYgKCBkZXB0aCA9PSAtMSApCi0JCQl7Ci0JCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJewotCQkJCQl0bXAyID0gKHRhcmdldDEgPT0gMCkgPyAqZjEgOiAqZjI7Ci0KLQkJCQkJdG1wMSA9IHRtcDI7Ci0JCQkJCV9mZHNfYWR2YW5jZSgmdG1wMSk7Ci0JCQkJCWxlbiA9IHRtcDEgLSB0bXAyOwotCQkJCQkqcmYgPSBfYWlmX2FsbG9jKHNpemVvZihjaGFyKSpsZW4gKyAxKTsKLQkJCQkJc3RybmNweSgqcmYsIHRtcDIsIGxlbik7Ci0JCQkJCSgqcmYpW2xlbl0gPSAnXDAnOwotCQkJCX0KLQotCQkJCWlmICggKnJkICE9IE5VTEwgKQotCQkJCQlfYWlmX2ZyZWUoKnJkKTsKLQkJCQkqcmQgPSBfYWlmX2FsbG9jKDEpOwotCQkJCSoqcmQgPSAoY2hhcikgMDsKLQotCQkJCSgqZjEpKys7Ci0JCQkJKCpmMikrKzsKLQotCQkJCWlmICggdGFyZ2V0MSA9PSAwIHx8Ci0JCQkJICAgICAqcHRyX3R5cGVfMSA9PSBBSUZfUFRSX1JFRkVSRU5DRSApCi0JCQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQkJZWxzZQotCQkJCQlfZmRzX3NraXBfZGF0YShmMSwgZDEpOwotCi0JCQkJaWYgKCB0YXJnZXQyID09IDAgfHwKLQkJCQkgICAgICpwdHJfdHlwZV8yID09IEFJRl9QVFJfUkVGRVJFTkNFICkKLQkJCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQkJCQllbHNlCi0JCQkJCV9mZHNfc2tpcF9kYXRhKGYyLCBkMik7Ci0KLQkJCQlyZXR1cm4gMDsKLQotCQkJfQotCQkJZWxzZSBpZiAoIGRlcHRoID09IDEgKQotCQkJCWRlcHRoID0gLTE7Ci0JCQllbHNlIGlmICggZGVwdGggPiAxICkKLQkJCQlkZXB0aC0tOwotCi0KLQkJCWlmICggdGFyZ2V0MSA9PSAwICYmIHRhcmdldDIgPT0gMCApIC8qIGlmIGl0IGlzIE5VTEwgKi8KLQkJCXsKLQkJCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQl7Ci0JCQkJCXRtcDIgPSAqZjE7Ci0JCQkJCXRtcDEgPSB0bXAyOwotCQkJCQlfZmRzX2FkdmFuY2UoJnRtcDEpOwotCQkJCQlsZW4gPSB0bXAxIC0gdG1wMjsKLQkJCQkJKnJmID0gX2FpZl9hbGxvYyhzaXplb2YoY2hhcikqbGVuICsgMSk7Ci0JCQkJCXN0cm5jcHkoKnJmLCB0bXAyLCBsZW4pOwotCQkJCQkoKnJmKVtsZW5dID0gJ1wwJzsKLQkJCQl9Ci0KLQkJCQlpZiAoICpyZCAhPSBOVUxMICkKLQkJCQkJX2FpZl9mcmVlKCpyZCk7Ci0JCQkJKnJkID0gX2FpZl9hbGxvYygxKTsKLQkJCQkqKnJkID0gKGNoYXIpIDA7Ci0KLQkJCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJCV9mZHNfYWR2YW5jZShmMik7Ci0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJaWYgKCAqcHRyX3R5cGVfMSA9PSBBSUZfUFRSX1JFRkVSRU5DRSB8fAotCQkJICAgICAqcHRyX3R5cGVfMiA9PSBBSUZfUFRSX1JFRkVSRU5DRSApCi0JCQl7Ci0JCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJewotCQkJCQl0bXAyID0gKCpwdHJfdHlwZV8xPT1BSUZfUFRSX1JFRkVSRU5DRSk/CQkJCQkJIAkqZjEgOiAqZjI7Ci0KLQkJCQkJdG1wMSA9IHRtcDI7Ci0JCQkJCV9mZHNfYWR2YW5jZSgmdG1wMSk7Ci0JCQkJCWxlbiA9IHRtcDEgLSB0bXAyOwotCQkJCQkqcmYgPSBfYWlmX2FsbG9jKHNpemVvZihjaGFyKSpsZW4gKyAxKTsKLQkJCQkJc3RybmNweSgqcmYsIHRtcDIsIGxlbik7Ci0JCQkJCSgqcmYpW2xlbl0gPSAnXDAnOwotCQkJCX0KLQotCQkJCWlmICggKnJkICE9IE5VTEwgKQotCQkJCQlfYWlmX2ZyZWUoKnJkKTsKLQkJCQkqcmQgPSBfYWlmX2FsbG9jKDUpOyAvKiAxICsgNCAocHRyIG5hbWUpICovCi0KLQkJCQlpZiAoKnB0cl90eXBlXzEgPT0gQUlGX1BUUl9SRUZFUkVOQ0UpCi0JCQkJewotCQkJCQlpbnQgaTsKLQkJCQkJZm9yICggaSA9IDA7IGkgPCA1OyBpKyspICgqcmQpW2ldID0gcHRyX3R5cGVfMVtpXTsKLQotCQkJCQlfZmRzX2FkdmFuY2UoZjEpOwotCi0JCQkJCS8qCi0JCQkJCSoqIGlmIGl0IGlzIG51bGwgb3IgYSBQVFJfUkVGLCBqdXN0Ci0JCQkJCSoqIGFkdmFuY2UgdGhlIGZkcywgc2luY2Ugd2UndmUKLQkJCQkJKiogc2tpcHBlZCB0aGUgZGF0YSB3aXRoIF9maW5kX3RhcmdldAotCQkJCQkqLwotCQkJCQlpZiAoIHRhcmdldDIgPT0gMCB8fCAqcHRyX3R5cGVfMiA9PSBBSUZfUFRSX1JFRkVSRU5DRSkKLQkJCQkJCV9mZHNfYWR2YW5jZShmMik7Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJKCpmMikrKzsKLQkJCQkJCV9mZHNfc2tpcF9kYXRhKGYyLCBkMik7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpbnQgaTsKLQkJCQkJZm9yICggaSA9IDA7IGkgPCA1OyBpKyspICgqcmQpW2ldID0gcHRyX3R5cGVfMltpXTsKLQotCQkJCQlfZmRzX2FkdmFuY2UoZjIpOwotCi0JCQkJCS8qCi0JCQkJCSoqIGlmIGl0IGlzIG51bGwgb3IgYSBQVFJfUkVGLCBqdXN0Ci0JCQkJCSoqIGFkdmFuY2UgdGhlIGZkcywgc2luY2Ugd2UndmUKLQkJCQkJKiogc2tpcHBlZCB0aGUgZGF0YSB3aXRoIF9maW5kX3RhcmdldAotCQkJCQkqLwotCQkJCQlpZiAoIHRhcmdldDEgPT0gMCB8fCAqcHRyX3R5cGVfMSA9PSBBSUZfUFRSX1JFRkVSRU5DRSkKLQkJCQkJCV9mZHNfYWR2YW5jZShmMSk7Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJKCpmMSkrKzsKLQkJCQkJCV9mZHNfc2tpcF9kYXRhKGYxLCBkMSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJaWYgKCB0YXJnZXQxID09IDAgKQkvKiB0YXJnZXQxIGlzIG51bGwsIG1ha2UgCi0JCQkJCQl0YXJnZXQyIGFzIHRoZSByZXN1bHQgKi8KLQkJCXsKLQkJCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCQl7Ci0JCQkJCXRtcDIgPSAqZjI7Ci0JCQkJCXRtcDEgPSB0bXAyOwotCQkJCQlfZmRzX2FkdmFuY2UoJnRtcDEpOwotCQkJCQlsZW4gPSB0bXAxIC0gdG1wMjsKLQkJCQkJKnJmID0gX2FpZl9hbGxvYyhzaXplb2YoY2hhcikqbGVuICsgMSk7Ci0JCQkJCXN0cm5jcHkoKnJmLCB0bXAyLCBsZW4pOwotCQkJCQkoKnJmKVtsZW5dID0gJ1wwJzsKLQkJCQl9Ci0KLQkJCQlpZiAoICpyZCAhPSBOVUxMICkKLQkJCQkJX2FpZl9mcmVlKCpyZCk7Ci0KLQkJCQl7Ci0JCQkJCWNoYXIgKiBfZDE7Ci0JCQkJCWNoYXIgKiBfZDI7Ci0KLQkJCQkJX2QyID0gcHRyX3R5cGVfMjsKLQkJCQkJX2QxID0gX2QyOwotCQkJCQl0bXAyID0gKmYyOwotCQkJCQl0bXAxID0gdG1wMjsKLQkJCQkJX2Zkc19za2lwX2RhdGEoJnRtcDEsICZfZDEpOwotCQkJCQlsZW4gPSBfZDEgLSBfZDI7Ci0JCQkJCSpyZCA9IF9haWZfYWxsb2Moc2l6ZW9mKGNoYXIpKmxlbik7Ci0JCQkJCW1lbWNweSgqcmQsIF9kMiwgbGVuKTsKLQkJCQl9Ci0KLQkJCQlfZmRzX2FkdmFuY2UoZjEpOwotCQkJCSgqZjIpKys7Ci0JCQkJX2Zkc19za2lwX2RhdGEoZjIsIGQyKTsKLQotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlpZiAoIHRhcmdldDIgPT0gMCApCS8qIHRhcmdldDIgaXMgbnVsbCwgbWFrZQotCQkJCQkJdGFyZ2V0MSBhcyB0aGUgcmVzdWx0ICovCi0JCQl7Ci0JCQkJaWYgKCAqcmYgPT0gTlVMTCApCi0JCQkJewotCQkJCQl0bXAyID0gKmYxOwotCQkJCQl0bXAxID0gdG1wMjsKLQkJCQkJX2Zkc19hZHZhbmNlKCZ0bXAxKTsKLQkJCQkJbGVuID0gdG1wMSAtIHRtcDI7Ci0JCQkJCSpyZiA9IF9haWZfYWxsb2Moc2l6ZW9mKGNoYXIpKmxlbiArIDEpOwotCQkJCQlzdHJuY3B5KCpyZiwgdG1wMiwgbGVuKTsKLQkJCQkJKCpyZilbbGVuXSA9ICdcMCc7Ci0JCQkJfQotCi0JCQkJaWYgKCAqcmQgIT0gTlVMTCApCi0JCQkJCV9haWZfZnJlZSgqcmQpOwotCi0JCQkJewotCQkJCQljaGFyICogX2QxOwotCQkJCQljaGFyICogX2QyOwotCi0JCQkJCV9kMiA9IHB0cl90eXBlXzE7Ci0JCQkJCV9kMSA9IF9kMjsKLQkJCQkJdG1wMiA9ICpmMTsKLQkJCQkJdG1wMSA9IHRtcDI7Ci0JCQkJCV9mZHNfc2tpcF9kYXRhKCZ0bXAxLCAmX2QxKTsKLQkJCQkJbGVuID0gX2QxIC0gX2QyOwotCQkJCQkqcmQgPSBfYWlmX2FsbG9jKHNpemVvZihjaGFyKSpsZW4pOwotCQkJCQltZW1jcHkoKnJkLCBfZDIsIGxlbik7Ci0JCQkJfQotCi0JCQkJX2Zkc19hZHZhbmNlKGYyKTsKLQkJCQkoKmYxKSsrOwotCQkJCV9mZHNfc2tpcF9kYXRhKGYxLCBkMSk7Ci0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJKCpmMSkrKzsKLQkJCSgqZjIpKys7Ci0KLQkJCWlmICggKnJmID09IE5VTEwgKQotCQkJewotCQkJCSpyZiA9IF9haWZfYWxsb2MoQlVGU0laKTsKLQkJCQkqKnJmID0gJ1wwJzsKLQkJCQlzdHJjYXQoKnJmLCAiXiIpOwotCQkJfQotCi0JCQlpZiAoICpyZCAhPSBOVUxMICkKLQkJCQlfYWlmX2ZyZWUoKnJkKTsKLQkJCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhCVUZTSVopOwotCi0JCQlpZiAoICpwdHJfdHlwZV8xID09IEFJRl9QVFJfTkFNRSApCi0JCQl7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yICggaSA9IDA7IGkgPCA1OyBpKyspICgqcmQpW2ldID0gcHRyX3R5cGVfMVtpXTsKLQkJCX0KLQkJCWVsc2UKLQkJCQkqKnJkID0gKGNoYXIpIEFJRl9QVFJfTk9STUFMOwotCi0JCQlkcmVzID0gTlVMTDsKLQkJCWZyZXMgPSBOVUxMOwotCi0JCQlmZHNfdHlwZSA9IEZEU1R5cGUoKmYxKTsKLQkJCXRtcDEgPSAqZjE7Ci0KLQkJCXJldCA9IF9haWZfZGlmZihkZXB0aCwgJmZyZXMsICZkcmVzLCBmMSwgZDEsIGYyLCBkMik7Ci0KLQkJCXsKLQkJCQljaGFyICogZmYgPSBmcmVzOwotCQkJCWNoYXIgKiBkZCA9IGRyZXM7Ci0KLQkJCQlfZmRzX3NraXBfZGF0YSgmZmYsICZkZCk7Ci0KLQkJCQlpZiAoICpwdHJfdHlwZV8xID09IEFJRl9QVFJfTkFNRSApCi0JCQkJCW1lbWNweSgoKnJkKSs1LCBkcmVzLCBkZC1kcmVzKTsKLQkJCQllbHNlCi0JCQkJCW1lbWNweSgoKnJkKSsxLCBkcmVzLCBkZC1kcmVzKTsKLQotCQkJCWlmICggZmRzX3R5cGUgPT0gQUlGX1JFRkVSRU5DRSApCi0JCQkJewotCQkJCQltZW1jcHkoKCpyZikrMSwgdG1wMSwgKmYxLXRtcDEpOwotCQkJCQkoKnJmKVsxICsgKmYxIC0gdG1wMV0gPSAnXDAnOwotCQkJCX0KLQkJCQllbHNlIGlmICggZmRzX3R5cGUgPT0gQUlGX05BTUUgKQotCQkJCXsKLQkJCQkJdG1wMiA9IHRtcDE7Ci0JCQkJCXRtcDIrKzsKLQkJCQkJdG1wMiA9IF9mZHNfc2tpcG51bSh0bXAyKTsKLQkJCQkJdG1wMisrOwotCi0JCQkJCW1lbWNweSgoKnJmKSsxLCB0bXAxLCB0bXAyLXRtcDEpOwotCQkJCQkoKnJmKVsxICsgdG1wMiAtIHRtcDFdID0gJ1wwJzsKLQotCQkJCQlzdHJuY2F0KCgqcmYpLCBmcmVzLCBmZi1mcmVzKzEpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0cm5jYXQoKCpyZiksIGZyZXMsIGZmLWZyZXMrMSk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXQ7Ci0KLQkJfQotCi0JY2FzZSBBSUZfU1RSSU5HOgotCQlpZiAoIEZEU1R5cGUoKmYyKSAhPSBBSUZfU1RSSU5HICkKLQkJewotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJKCpmMSkrKzsgLyogcGFzdCAicyIgKi8KLQkJKCpmMikrKzsgLyogcGFzdCAicyIgKi8KLQotCQlieXRlczEgPSAoKigqZDEpKysgJiAweGZmKSA8PCA4OwotCQlieXRlczEgKz0gKigqZDEpKysgJiAweGZmOwotCQlieXRlczIgPSAoKigqZDIpKysgJiAweGZmKSA8PCA4OwotCQlieXRlczIgKz0gKigqZDIpKysgJiAweGZmOwotCi0JCWlmICggKnJkICE9IE5VTEwgKQotCQkJX2FpZl9mcmVlKCpyZCk7Ci0KLQkJKnJkID0gX2FpZl9hbGxvYyhieXRlczEgKyBieXRlczIgKyAyKTsKLQotCQlpZiAoIGJ5dGVzMSA9PSBieXRlczIgKQotCQl7Ci0JCQlpbnQgaTsKLQkJCWludCBpc19lcXVhbCA9IDE7Ci0JCQkKLQkJCSgqcmQpWzBdID0gKGJ5dGVzMSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnJkKVsxXSA9IGJ5dGVzMSAmIDB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGJ5dGVzMTsgaSsrKQotCQkJewotCQkJCWlmICggc3RybmNtcCgoKmQxKStpLCAoKmQyKStpLCAxKSApCi0JCQkJewotCQkJCQkoKnJkKVsyK2ldID0gJzEnOwotCQkJCQlpc19lcXVhbCA9IDA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJKCpyZClbMitpXSA9ICcwJzsKLQkJCX0KLQotCQkJaWYgKCBpc19lcXVhbCA9PSAxICkKLQkJCXsKLQkJCQkoKnJkKVswXSA9ICgwID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkoKnJkKVsxXSA9IDAgJiAweGZmOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCBieXRlczEgPiBieXRlczIgKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZClbMF0gPSAoYnl0ZXMxID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcmQpWzFdID0gYnl0ZXMxICYgMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgYnl0ZXMyIDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpyZClbMitpXSA9IHN0cm5jbXAoKCpkMSkraSwgKCpkMikraSwgMSkgPyAnMScgOiAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCBieXRlczEgLSBieXRlczIgOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnJkKVtieXRlczIrMitpXSA9ICcxJzsKLQkJCQotCQl9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIGJ5dGVzMSA8IGJ5dGVzMiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcmQpWzBdID0gKGJ5dGVzMiA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnJkKVsxXSA9IGJ5dGVzMiAmIDB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGJ5dGVzMSA7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcmQpWzIraV0gPSBzdHJuY21wKCgqZDEpK2ksICgqZDIpK2ksIDEpID8gJzEnIDogJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgYnl0ZXMyIC0gYnl0ZXMxIDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpyZClbYnl0ZXMxKzIraV0gPSAnMSc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLQkJKmQxICs9IGJ5dGVzMTsKLQkJKmQyICs9IGJ5dGVzMjsKLQotCQlpZiAoICpyZiA9PSBOVUxMICkKLQkJCSpyZiA9IHN0cmR1cChBSUZfU1RSSU5HX1RZUEUoKSk7Ci0KLQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbXBpbGUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jb21waWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODFlMDAwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbXBpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KLQotc2NyaXB0dmVyc2lvbj0yMDAzLTExLTA5LjAwCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKLSMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bwotIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KLQotY2FzZSAkMSBpbgotICAnJykKLSAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICAgICBleGl0IDE7Ci0gICAgIDs7Ci0gIC1oIHwgLS1oKikKLSAgICBjYXQgPDxcRU9GCi1Vc2FnZTogY29tcGlsZSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQotCi1XcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KLVJlbW92ZSBgLW8gZGVzdC5vJyBmcm9tIEFSR1MsIHJ1biBQUk9HUkFNIHdpdGggdGhlIHJlbWFpbmluZwotYXJndW1lbnRzLCBhbmQgcmVuYW1lIHRoZSBvdXRwdXQgYXMgZXhwZWN0ZWQuCi0KLUlmIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgd2hvbGUgcGFja2FnZSB0aGlzIGlzIG5vdCB0aGUKLXJpZ2h0IHNjcmlwdCB0byBydW46IHBsZWFzZSBzdGFydCBieSByZWFkaW5nIHRoZSBmaWxlIGBJTlNUQUxMJy4KLQotUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KLUVPRgotICAgIGV4aXQgMAotICAgIDs7Ci0gIC12IHwgLS12KikKLSAgICBlY2hvICJjb21waWxlICRzY3JpcHR2ZXJzaW9uIgotICAgIGV4aXQgMAotICAgIDs7Ci1lc2FjCi0KLQotcHJvZz0kMQotc2hpZnQKLQotb2ZpbGU9Ci1jZmlsZT0KLWFyZ3M9Ci13aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbwotICBjYXNlICIkMSIgaW4KLSAgICAtbykKLSAgICAgICMgY29uZmlndXJlIG1pZ2h0IGNob29zZSB0byBydW4gY29tcGlsZSBhcyBgY29tcGlsZSBjYyAtbyBmb28gZm9vLmMnLgotICAgICAgIyBTbyB3ZSBkbyBzb21ldGhpbmcgdWdseSBoZXJlLgotICAgICAgb2ZpbGU9JDIKLSAgICAgIHNoaWZ0Ci0gICAgICBjYXNlICIkb2ZpbGUiIGluCi0JKi5vIHwgKi5vYmopCi0JICA7OwotCSopCi0JICBhcmdzPSIkYXJncyAtbyAkb2ZpbGUiCi0JICBvZmlsZT0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgICAgOzsKLSAgICAqLmMpCi0gICAgICBjZmlsZT0kMQotICAgICAgYXJncz0iJGFyZ3MgJDEiCi0gICAgICA7OwotICAgICopCi0gICAgICBhcmdzPSIkYXJncyAkMSIKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotaWYgdGVzdCAteiAiJG9maWxlIiB8fCB0ZXN0IC16ICIkY2ZpbGUiOyB0aGVuCi0gICMgSWYgbm8gYC1vJyBvcHRpb24gd2FzIHNlZW4gdGhlbiB3ZSBtaWdodCBoYXZlIGJlZW4gaW52b2tlZCBmcm9tIGEKLSAgIyBwYXR0ZXJuIHJ1bGUgd2hlcmUgd2UgZG9uJ3QgbmVlZCBvbmUuICBUaGF0IGlzIG9rIC0tIHRoaXMgaXMgYQotICAjIG5vcm1hbCBjb21waWxhdGlvbiB0aGF0IHRoZSBsb3NpbmcgY29tcGlsZXIgY2FuIGhhbmRsZS4gIElmIG5vCi0gICMgYC5jJyBmaWxlIHdhcyBzZWVuIHRoZW4gd2UgYXJlIHByb2JhYmx5IGxpbmtpbmcuICBUaGF0IGlzIGFsc28KLSAgIyBvay4KLSAgZXhlYyAiJHByb2ciICRhcmdzCi1maQotCi0jIE5hbWUgb2YgZmlsZSB3ZSBleHBlY3QgY29tcGlsZXIgdG8gY3JlYXRlLgotY29maWxlPWBlY2hvICRjZmlsZSB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wuYyQvLm8vJ2AKLQotIyBDcmVhdGUgdGhlIGxvY2sgZGlyZWN0b3J5LgotIyBOb3RlOiB1c2UgYFsvLi1dJyBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgc2FtZSBuYW1lCi0jIHRoYXQgd2UgYXJlIHVzaW5nIGZvciB0aGUgLm8gZmlsZS4gIEFsc28sIGJhc2UgdGhlIG5hbWUgb24gdGhlIGV4cGVjdGVkCi0jIG9iamVjdCBmaWxlIG5hbWUsIHNpbmNlIHRoYXQgaXMgd2hhdCBtYXR0ZXJzIHdpdGggYSBwYXJhbGxlbCBidWlsZC4KLWxvY2tkaXI9YGVjaG8gJGNvZmlsZSB8IHNlZCAtZSAnc3xbLy4tXXxffGcnYC5kCi13aGlsZSB0cnVlOyBkbwotICBpZiBta2RpciAkbG9ja2RpciA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYnJlYWsKLSAgZmkKLSAgc2xlZXAgMQotZG9uZQotIyBGSVhNRTogcmFjZSBjb25kaXRpb24gaGVyZSBpZiB1c2VyIGtpbGxzIGJldHdlZW4gbWtkaXIgYW5kIHRyYXAuCi10cmFwICJybWRpciAkbG9ja2RpcjsgZXhpdCAxIiAxIDIgMTUKLQotIyBSdW4gdGhlIGNvbXBpbGUuCi0iJHByb2ciICRhcmdzCi1zdGF0dXM9JD8KLQotaWYgdGVzdCAtZiAiJGNvZmlsZSI7IHRoZW4KLSAgbXYgIiRjb2ZpbGUiICIkb2ZpbGUiCi1maQotCi1ybWRpciAkbG9ja2RpcgotZXhpdCAkc3RhdHVzCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOiBzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246IDIKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbmZpZy5oLmluIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTRiOWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvY29uZmlnLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogZGVmaW5lIGlmIHN5c3RlbSBoYXMgbG9uZyBsb25nIHR5cGUuICovCi0jdW5kZWYgQ0NfSEFTX0xPTkdfTE9ORwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgZG9uJ3QgaGF2ZSBgdnByaW50ZicgYnV0IGRvIGhhdmUgYF9kb3BybnQuJyAqLwotI3VuZGVmIEhBVkVfRE9QUk5UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9JTlRUWVBFU19ICi0KLS8qIGRlZmluZSBpZiBzeXN0ZW0gaGFzIGxvbmcgZG91YmxlIHR5cGUuICovCi0jdW5kZWYgSEFWRV9MT05HX0RPVUJMRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJEVVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9WUFJJTlRGCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCi0jdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PCi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCi0jdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9TVFJJTkcKLQotLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgotCi0vKiBUaGUgc2l6ZSBvZiBgZG91YmxlJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9ET1VCTEUKLQotLyogVGhlIHNpemUgb2YgYGxvbmcgZG91YmxlJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9MT05HX0RPVUJMRQotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9MT05HX0xPTkcKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLwotI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBgc3RydWN0IHRtJy4gKi8KLSN1bmRlZiBUTV9JTl9TWVNfVElNRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCi0gICBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gKi8KLSN1bmRlZiBXT1JEU19CSUdFTkRJQU4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbmZpZ3VyZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGYzY2U1Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw3OTMyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBsaWJhaWYgMi4xLjAuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLSMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi1pZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCi0gIGlmIChldmFsICI6IikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLQotICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0geWVzICYmIAkgKGV2YWwgIjoKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotKAotICBhc19saW5lbm9fMT1cJExJTkVOTwotICBhc19saW5lbm9fMj1cJExJTkVOTwotICB0ZXN0IFwieFwkYXNfbGluZW5vXzFcIiAhPSBcInhcJGFzX2xpbmVub18yXCIgJiYKLSAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLSIpIDI+IC9kZXYvbnVsbDsgdGhlbgotICA6Ci1lbHNlCi0gIGFzX2NhbmRpZGF0ZV9zaGVsbHM9Ci0gICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBjYXNlICRhc19kaXIgaW4KLQkgLyopCi0JICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKLQkgICBkb25lOzsKLSAgICAgICBlc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KLQkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKLQkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotOgotX0FTRU9GCi19OyB0aGVuCi0gIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKLQkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLQkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0ICQxKQotfQotYXNfZnVuY19zdWNjZXNzICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMAotfQotYXNfZnVuY19mYWlsdXJlICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMQotfQotYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Ci0gIHJldHVybiAwCi19Ci1hc19mdW5jX3JldF9mYWlsdXJlICgpIHsKLSAgcmV0dXJuIDEKLX0KLQotZXhpdGNvZGU9MAotaWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi0KLXRlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotX0FTRU9GCi19OyB0aGVuCi0gIGJyZWFrCi1maQotCi1maQotCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCi0gICAgICAgIGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gICAgICAgIGRvbmUKLSAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci1maQotCi0KLSAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KLSAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQotICAgICAgZWNobyBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgUGxlYXNlIGluc3RhbGwgYQotICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQotICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCi0gICAgICB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLQotZmkKLQotZmkKLQotCi0KLShldmFsICJhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgewotICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgotICBlY2hvIFBsZWFzZSB0ZWxsIGF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCi0gIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKLSAgZWNobyBtZXNzYWdlCi19Ci0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KLS1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gICopICAgRUNIT19DPSdcYyc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyCi1maQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi0KLWV4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKLQotIyBOYW1lIG9mIHRoZSBob3N0LgotIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKLSMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgotYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0KLSMKLSMgSW5pdGlhbGl6YXRpb25zLgotIwotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotYWNfY2xlYW5fZmlsZXM9Ci1hY19jb25maWdfbGlib2JqX2Rpcj0uCi1MSUJPQkpTPQotY3Jvc3NfY29tcGlsaW5nPW5vCi1zdWJkaXJzPQotTUZMQUdTPQotTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCi1QQUNLQUdFX05BTUU9J2xpYmFpZicKLVBBQ0tBR0VfVEFSTkFNRT0nbGliYWlmJwotUEFDS0FHRV9WRVJTSU9OPScyLjEuMCcKLVBBQ0tBR0VfU1RSSU5HPSdsaWJhaWYgMi4xLjAnCi1QQUNLQUdFX0JVR1JFUE9SVD0nJwotCi0jIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCi1hY19pbmNsdWRlc19kZWZhdWx0PSJcCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9TVERMSUJfSAotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKLSMgIGluY2x1ZGUgPG1lbW9yeS5oPgotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERJTlRfSAotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYiCi0KLWFjX3N1YnN0X3ZhcnM9J1NIRUxMCi1QQVRIX1NFUEFSQVRPUgotUEFDS0FHRV9OQU1FCi1QQUNLQUdFX1RBUk5BTUUKLVBBQ0tBR0VfVkVSU0lPTgotUEFDS0FHRV9TVFJJTkcKLVBBQ0tBR0VfQlVHUkVQT1JUCi1leGVjX3ByZWZpeAotcHJlZml4Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1iaW5kaXIKLXNiaW5kaXIKLWxpYmV4ZWNkaXIKLWRhdGFyb290ZGlyCi1kYXRhZGlyCi1zeXNjb25mZGlyCi1zaGFyZWRzdGF0ZWRpcgotbG9jYWxzdGF0ZWRpcgotaW5jbHVkZWRpcgotb2xkaW5jbHVkZWRpcgotZG9jZGlyCi1pbmZvZGlyCi1odG1sZGlyCi1kdmlkaXIKLXBkZmRpcgotcHNkaXIKLWxpYmRpcgotbG9jYWxlZGlyCi1tYW5kaXIKLURFRlMKLUVDSE9fQwotRUNIT19OCi1FQ0hPX1QKLUxJQlMKLWJ1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUlOU1RBTExfUFJPR1JBTQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfREFUQQotYW1fX2lzcmMKLUNZR1BBVEhfVwotUEFDS0FHRQotVkVSU0lPTgotQUNMT0NBTAotQVVUT0NPTkYKLUFVVE9NQUtFCi1BVVRPSEVBREVSCi1NQUtFSU5GTwotaW5zdGFsbF9zaAotU1RSSVAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotbWtkaXJfcAotQVdLCi1TRVRfTUFLRQotYW1fX2xlYWRpbmdfZG90Ci1BTVRBUgotYW1fX3RhcgotYW1fX3VudGFyCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1DUFBGTEFHUwotYWNfY3RfQ0MKLUVYRUVYVAotT0JKRVhUCi1ERVBESVIKLWFtX19pbmNsdWRlCi1hbV9fcXVvdGUKLUFNREVQX1RSVUUKLUFNREVQX0ZBTFNFCi1BTURFUEJBQ0tTTEFTSAotQ0NERVBNT0RFCi1hbV9fZmFzdGRlcENDX1RSVUUKLWFtX19mYXN0ZGVwQ0NfRkFMU0UKLVJBTkxJQgotQ1BQCi1HUkVQCi1FR1JFUAotTElCT0JKUwotWE1MVE8KLUxUTElCT0JKUycKLWFjX3N1YnN0X2ZpbGVzPScnCi0gICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcwotaG9zdF9hbGlhcwotdGFyZ2V0X2FsaWFzCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1MSUJTCi1DUFBGTEFHUwotQ1BQJwotCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLWFjX2luaXRfaGVscD0KLWFjX2luaXRfdmVyc2lvbj1mYWxzZQotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWNhY2hlX2ZpbGU9L2Rldi9udWxsCi1leGVjX3ByZWZpeD1OT05FCi1ub19jcmVhdGU9Ci1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi0KLSMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgotIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCi0jIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAotIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgotIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KLSMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJwotZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1kb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCi1pbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJwotaHRtbGRpcj0nJHtkb2NkaXJ9JwotZHZpZGlyPScke2RvY2Rpcn0nCi1wZGZkaXI9JyR7ZG9jZGlyfScKLXBzZGlyPScke2RvY2Rpcn0nCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWxvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJwotbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCi0KLWFjX3ByZXY9Ci1hY19kYXNoZGFzaD0KLWZvciBhY19vcHRpb24KLWRvCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAqPSopCWFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICopCWFjX29wdGFyZz15ZXMgOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCi0gIC0tKQotICAgIGFjX2Rhc2hkYXNoPXllcyA7OwotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7Ci0KLSAgLS1jb25maWctY2FjaGUgfCAtQykKLSAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQotICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAotICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKLSAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7Ci0gIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKLSAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCi0gICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1ubyA7OwotCi0gIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCi0gICAgYWNfcHJldj1kb2NkaXIgOzsKLSAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCi0gICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQotICAgIGFjX3ByZXY9ZHZpZGlyIDs7Ci0gIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCi0gICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9XCRhY19vcHRhcmcgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKLSAgICBhY19pbml0X2hlbHA9bG9uZyA7OwotICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCi0gICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OwotICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCi0gICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCi0gICAgYWNfcHJldj1odG1sZGlyIDs7Ci0gIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAotICB8IC0taHQ9KikKLSAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQotICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7Ci0gIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCi0gICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKLSAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKLQotICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQotICAgIGFjX3ByZXY9cGRmZGlyIDs7Ci0gIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCi0gICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKLQotICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQotICAgIGFjX3ByZXY9cHNkaXIgOzsKLSAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCi0gICAgcHNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSRhY19vcHRhcmcgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKLSAgICBhY19pbml0X3ZlcnNpb249OiA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9XCRhY19vcHRhcmcgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCi0gICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPW5vIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKLQotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZwotICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7Ci0KLSAgKikKLSAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCi0gICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgotICAgIDogJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0KLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCi1mb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKLQkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCi0JCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKLQkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKLWRvCi0gIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICBjYXNlICRhY192YWwgaW4KLSAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OwotICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKLSAgZXNhYwotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgotICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogV29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci10ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgotICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJDAiIHx8Ci0kYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkMCIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KLSAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLWFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKLWFjX2Fic19jb25mZGlyPWAoCi0JY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCB7IGVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19tc2ciID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBsaWJhaWYgMi4xLjAgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KLQotVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwotVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KLQotRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCi0KLUNvbmZpZ3VyYXRpb246Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKLSAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQotICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJwotICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KLQotSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLQkJCSAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLQkJCSAgW1BSRUZJWF0KLQotQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCi1cYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQotYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKLWZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCi0KLUZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgotCi1GaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotICAtLWJpbmRpcj1ESVIgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQotICAtLWRhdGFyb290ZGlyPURJUiAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQotICAtLWluZm9kaXI9RElSICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KLSAgLS1sb2NhbGVkaXI9RElSICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQotICAtLWRvY2Rpcj1ESVIgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL2xpYmFpZl0KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotX0FDRU9GCi0KLSAgY2F0IDw8XF9BQ0VPRgotCi1Qcm9ncmFtIG5hbWVzOgotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotX0FDRU9GCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIGxpYmFpZiAyLjEuMDoiOzsKLSAgIGVzYWMKLSAgY2F0IDw8XF9BQ0VPRgotCi1PcHRpb25hbCBGZWF0dXJlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKLQotU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCi0gIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQotICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0gIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KLSAgQ1BQRkxBR1MgICAgQy9DKysvT2JqZWN0aXZlIEMgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgotICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKLQotVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKLWl0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KLQotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fCBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0gICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQotICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgotICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KLSAgICAgIGVjaG8gJiYKLSAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCi0gICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLSAgICAgIGVjaG8gJiYKLSAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotbGliYWlmIGNvbmZpZ3VyZSAyLjEuMAotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotX0FDRU9GCi0gIGV4aXQKLWZpCi1jYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotCi1JdCB3YXMgY3JlYXRlZCBieSBsaWJhaWYgJGFzX21lIDIuMS4wLCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gICQgJDAgJEAKLQotX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLWNhdCA8PF9BU1VOQU1FCi0jIyAtLS0tLS0tLS0gIyMKLSMjIFBsYXRmb3JtLiAjIwotIyMgLS0tLS0tLS0tICMjCi0KLWhvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi11bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLQotL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotCi1fQVNVTkFNRQotCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGVjaG8gIlBBVEg6ICRhc19kaXIiCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLX0gPiY1Ci0KLWNhdCA+JjUgPDxfQUNFT0YKLQotCi0jIyAtLS0tLS0tLS0tLSAjIwotIyMgQ29yZSB0ZXN0cy4gIyMKLSMjIC0tLS0tLS0tLS0tICMjCi0KLV9BQ0VPRgotCi0KLSMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgotIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCi1hY19jb25maWd1cmVfYXJncz0KLWFjX2NvbmZpZ3VyZV9hcmdzMD0KLWFjX2NvbmZpZ3VyZV9hcmdzMT0KLWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCi1mb3IgYWNfcGFzcyBpbiAxIDIKLWRvCi0gIGZvciBhY19hcmcKLSAgZG8KLSAgICBjYXNlICRhY19hcmcgaW4KLSAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7Ci0gICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICAgIGNvbnRpbnVlIDs7Ci0gICAgKlwnKikKLSAgICAgIGFjX2FyZz1gZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAkYWNfcGFzcyBpbgotICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7Ci0gICAgMikKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzMT0iJGFjX2NvbmZpZ3VyZV9hcmdzMSAnJGFjX2FyZyciCi0gICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KLQlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCi0gICAgICBlbHNlCi0JY2FzZSAkYWNfYXJnIGluCi0JICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKLQkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKLQkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKLQkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQotCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KLQkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotZG9uZQotJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9Ci0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KLQotIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQotIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKLSMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgotIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCi0jIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCi10cmFwICdleGl0X3N0YXR1cz0kPwotICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KLSAgewotICAgIGVjaG8KLQotICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIENhY2hlIHZhcmlhYmxlcy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAotICAgIGVjaG8KLSAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICBzZWQgLW4gXAotCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOwotCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgotICAgICAgOzsgIygKLSAgICAqKQotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKQotICAgIGVjaG8KLQotICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAotICAgIGVjaG8KLSAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCi0gICAgZG8KLSAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgICAgY2FzZSAkYWNfdmFsIGluCi0gICAgICAqXCdcJycqKSBhY192YWw9YGVjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLSAgICAgIGVzYWMKLSAgICAgIGVjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgotICAgIGRvbmUgfCBzb3J0Ci0gICAgZWNobwotCi0gICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcwotICAgICAgZG8KLQlldmFsIGFjX3ZhbD1cJCRhY192YXIKLQljYXNlICRhY192YWwgaW4KLQkqXCdcJycqKSBhY192YWw9YGVjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLQllc2FjCi0JZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgICBkb25lIHwgc29ydAotICAgICAgZWNobwotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KLSAgICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBjb25mZGVmcy5oLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAotICAgICAgZWNobwotICAgICAgY2F0IGNvbmZkZWZzLmgKLSAgICAgIGVjaG8KLSAgICBmaQotICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKLSAgICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgotICAgIGVjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCi0gIH0gPiY1Ci0gIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgotICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKLSAgICBleGl0ICRleGl0X3N0YXR1cwotJyAwCi1mb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KLSAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgeyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAkYWNfc2lnbmFsCi1kb25lCi1hY19zaWduYWw9MAotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKLQotIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKLV9BQ0VPRgotCi0KLSMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLW4gIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgc2V0IHggIiRDT05GSUdfU0lURSIKLWVsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gIHNldCB4ICIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlIiAiJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi1lbHNlCi0gIHNldCB4ICIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiIFwKLQkiJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWZpCi1zaGlmdAotZm9yIGFjX3NpdGVfZmlsZQotZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9Ci0gICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1Ci0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCi0gICMgZmlsZXMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LgotICBpZiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXNlICRjYWNoZV9maWxlIGluCi0gICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7Ci0gICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Ci0gICAgZXNhYwotICBmaQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICA+JGNhY2hlX2ZpbGUKLWZpCi0KLSMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKLSMgdmFsdWUuCi1hY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQotICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0gICAgc2V0LCkKLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLHNldCkKLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsKTs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQotZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQotZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQotCWFjX2NhY2hlX2NvcnJ1cHRlZD06Ci0gICAgICBmaTs7Ci0gIGVzYWMKLSAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgotICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KLSAgICBjYXNlICRhY19uZXdfdmFsIGluCi0gICAgKlwnKikgYWNfYXJnPSRhY192YXI9YGVjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0gICAgICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgICBlc2FjCi0gIGZpCi1kb25lCi1pZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi1hbV9fYXBpX3ZlcnNpb249JzEuMTAnCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKLSMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KLSMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgotYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCi1zL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCi1fQUNFT0YKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotcm0gLWYgY29uZnRlc3Quc2VkCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9Ci1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ta2RpcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIG1rZGlyIGdta2RpcjsgZG8KLQkgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JICAgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfSB8fCBjb250aW51ZQotCSAgIGNhc2UgYCIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtLXZlcnNpb24gMj4mMWAgaW4gIygKLQkgICAgICdta2RpciAoR05VIGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCi0JICAgICAnbWtkaXIgKGZpbGV1dGlscykgJzQuMSopCi0JICAgICAgIGFjX2N2X3BhdGhfbWtkaXI9JGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dAotCSAgICAgICBicmVhayAzOzsKLQkgICBlc2FjCi0JIGRvbmUKLSAgICAgICBkb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi0KLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCi0gICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KLSAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRNS0RJUl9QIiA+JjY7IH0KLQotbWtkaXJfcD0iJE1LRElSX1AiCi1jYXNlICRta2Rpcl9wIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKikgOzsKLSAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OwotZXNhYwotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BV0s9JGFjX2N2X3Byb2dfQVdLCi1pZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCi1kb25lCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCi0gICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0Ci0gICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKLSAgYW1fX2lzcmM9JyAtSSQoc3JjZGlyKScKLSAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi0gIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi0KLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotIFBBQ0tBR0U9J2xpYmFpZicKLSBWRVJTSU9OPScyLjEuMCcKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLV9BQ0VPRgotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi0KLUFDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KLQotCi1BVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KLQotCi1BVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9Ci0KLQotTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9Ci0KLWluc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci0KLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi0KLSMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCi0jIHNvbWUgcGxhdGZvcm1zLgotIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi1BTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9Ci0KLWFtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJwotCi0KLQotCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCi0KLQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIGRvbmUKLS5QSE9OWTogYW1fX2RvaXQKLUVORAotIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKLSMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KLSMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKLSMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCi0jIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KLWlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgotICAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICAgYW1fX3F1b3RlPQotICAgX2FtX3Jlc3VsdD1HTlUKLWZpCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KLSAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgICBhbV9fcXVvdGU9IlwiIgotICAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgIGZpCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOwotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLSBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZmkKLQotZmkKLQotCi10ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLWFjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC12ID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAtdiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLVYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQotCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0jIG9mIGV4ZWV4dC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLSMKLSMgTGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgZmlsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LgotIyBUaGUgYWxnb3JpdGhtIGlzIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKQotIyBvbmx5IGFzIGEgbGFzdCByZXNvcnQuICBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgotYWNfZmlsZXM9J2Ffb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQnCi0jCi0jIFRoZSBJUklYIDYgbGlua2VyIHdyaXRlcyBpbnRvIGV4aXN0aW5nIGZpbGVzIHdoaWNoIG1heSBub3QgYmUKLSMgZXhlY3V0YWJsZSwgcmV0YWluaW5nIHRoZWlyIHBlcm1pc3Npb25zLiAgUmVtb3ZlIHRoZW0gZmlyc3Qgc28gYQotIyBzdWJzZXF1ZW50IGV4ZWN1dGlvbiB0ZXN0IHdvcmtzLgotYWNfcm1maWxlcz0KLWZvciBhY19maWxlIGluICRhY19maWxlcwotZG8KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSAgZXNhYwotZG9uZQotcm0gLWYgJGFjX3JtZmlsZXMKLQotaWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwotIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKLSMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0jIEF1dG9jb25mLgotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCi1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKLQl0aGVuIDo7IGVsc2UKLQkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQlmaQotCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAotCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgotCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgotCSMgYWN0dWFsbHkgd29ya2luZy4KLQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi10ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLQotZWxzZQotICBhY19maWxlPScnCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbgotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotZmkKLQotYWNfZXhlZXh0PSRhY19jdl9leGVleHQKLQotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQotIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAotIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVzCi0gICAgZWxzZQotCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGZpCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQotcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjY7IH0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSAgYnJlYWs7OwotICAgICogKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mICkgOzsKLSAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKLSAgICAgICBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNjsgfQotT0JKRVhUPSRhY19jdl9vYmpleHQKLWFjX29iamV4dD0kT0JKRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jb21waWxlcl9nbnU9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLUdDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlDRkxBR1M9IiIKLSAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9wcm9nX2NjX2M4OT1ubwotYWNfc2F2ZV9DQz0kQ0MKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KLXN0cnVjdCBidWYgeyBpbnQgeDsgfTsKLUZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqZSAocCwgaSkKLSAgICAgY2hhciAqKnA7Ci0gICAgIGludCBpOwotewotICByZXR1cm4gcFtpXTsKLX0KLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgdmFfbGlzdCB2OwotICB2YV9zdGFydCAodixwKTsKLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKLSAgdmFfZW5kICh2KTsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCi0gICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCi0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKLSAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKLSAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZwotICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLwotaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKLQotLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCi0gICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCi0jZGVmaW5lIEZPTyh4KSAneCcKLWludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOwotCi1pbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKLXN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Owotc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307Ci1pbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKLWludCBhcmdjOwotY2hhciAqKmFyZ3Y7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAotCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCi1kbwotICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAotICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawotZG9uZQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotQ0M9JGFjX3NhdmVfQ0MKLQotZmkKLSMgQUNfQ0FDSEVfVkFMCi1jYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgotICB4KQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNjsgfSA7OwotICB4bm8pCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH11bnN1cHBvcnRlZCIgPiY2OyB9IDs7Ci0gICopCi0gICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKLWVzYWMKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLWRlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAotICBmaQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0gaWYKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1maQotc2V0IGR1bW15ICRDQzsgYWNfY2M9YGVjaG8gJDIgfAotCQkgICAgICBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX287IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLSMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgotIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KLSMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCi1hY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLXJtIC1mIGNvbmZ0ZXN0Mi4qCi1pZiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsKLXRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz15ZXMKLSAgaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gICAgIyBUZXN0IGZpcnN0IHRoYXQgY2MgZXhpc3RzIGF0IGFsbC4KLSAgICBpZiB7IGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JwotICAgICAgcm0gLWYgY29uZnRlc3QyLioKLSAgICAgIGlmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07Ci0gICAgICB0aGVuCi0JIyBjYyB3b3JrcyB0b28uCi0JOgotICAgICAgZWxzZQotCSMgY2MgZXhpc3RzIGJ1dCBkb2Vzbid0IGxpa2UgLW8uCi0JZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotICAgICAgZmkKLSAgICBmaQotICBmaQotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBOT19NSU5VU19DX01JTlVTX08gMQotX0FDRU9GCi0KLWZpCi0KLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkMiB8IHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX2NjXycke2FjX2NjfV9jX29gXCIgIT0geWVzIjsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbgotICAuLyB8IC4vLyB8IC9jQy8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICBicmVhayAzCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgZG9uZQotICAgIDs7Ci1lc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQotZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNjsgfQotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAkRUNIT19DIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCi1TSEVMTCA9IC9iaW4vc2gKLWFsbDoKLQlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwotX0FDRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWNhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgotICAqQEBAJSUlPT8qPUBAQCUlJSopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKLSAgKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci1lc2FjCi1ybSAtZiBjb25mdGVzdC5tYWtlCi1maQotaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLSAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKLWlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KLSAgICBSQU5MSUI9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgotICBmaQotZWxzZQotICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWZpCi0KLQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2OyB9Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KLSAgYnJlYWsKLWZpCi0KLSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotCi1maQotICBDUFA9JGFjX2N2X3Byb2dfQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDUFAiID4mNQotZWNobyAiJHtFQ0hPX1R9JENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuCi0gIDoKLWVsc2UKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJncmVwIGdncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi1zZXQgZHVtbXkgZ3JlcCBnZ3JlcDsgYWNfcHJvZ19uYW1lPSQyCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQotICAgICMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKLWNhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgIGVjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgotICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotCi0gICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gIGRvbmUKLWRvbmUKLQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi1pZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQotIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImVncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotc2V0IGR1bW15IGVncmVwOyBhY19wcm9nX25hbWU9JDIKLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCi0jIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCi0gICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi1jYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYWNfY291bnQ9YGV4cHIgJGFjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0KLSAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gIGRvbmUKLWRvbmUKLQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLWlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1lbHNlCi0gIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCi1maQotCi0KLSAgIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9Ci0gRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci1lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0oIGV4aXQgJGFjX3N0YXR1cyApCi1hY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotX0FDRU9GCi0KLWZpCi0KLSMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi0KLQotCi0KLQotCi0KLQotCi1mb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKLQkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLWludAotbWFpbiAoKQotewotI2lmICAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOICYmIGRlZmluZWQgTElUVExFX0VORElBTiBcCi0JJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOICYmIExJVFRMRV9FTkRJQU4pCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLWludAotbWFpbiAoKQotewotI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgotIG5vdCBiaWcgZW5kaWFuCi0jZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JIyBJdCBkb2VzIG5vdDsgY29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICMgdHJ5IHRvIGd1ZXNzIHRoZSBlbmRpYW5uZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBpbnRvIGFuIG9iamVjdCBmaWxlCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1zaG9ydCBpbnQgYXNjaWlfbW1bXSA9IHsgMHg0MjQ5LCAweDQ3NjUsIDB4NkU0NCwgMHg2OTYxLCAweDZFNTMsIDB4Nzk1MywgMCB9Owotc2hvcnQgaW50IGFzY2lpX2lpW10gPSB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKLXZvaWQgX2FzY2lpICgpIHsgY2hhciAqcyA9IChjaGFyICopIGFzY2lpX21tOyBzID0gKGNoYXIgKikgYXNjaWlfaWk7IH0KLXNob3J0IGludCBlYmNkaWNfaWlbXSA9IHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9Owotc2hvcnQgaW50IGViY2RpY19tbVtdID0geyAweEMyQzksIDB4Qzc4NSwgMHg5NUM0LCAweDg5ODEsIDB4OTVFMiwgMHhBOEUyLCAwIH07Ci12b2lkIF9lYmNkaWMgKCkgeyBjaGFyICpzID0gKGNoYXIgKikgZWJjZGljX21tOyBzID0gKGNoYXIgKikgZWJjZGljX2lpOyB9Ci1pbnQKLW1haW4gKCkKLXsKLSBfYXNjaWkgKCk7IF9lYmNkaWMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWZpCi1pZiBncmVwIExpVFRsZUVuRGlhbiBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCi0gICAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLSAgZWxzZQotICAgICMgZmluZGluZyBib3RoIHN0cmluZ3MgaXMgdW5saWtlbHkgdG8gaGFwcGVuLCBidXQgd2hvIGtub3dzPwotICAgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLSAgZmkKLWZpCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotCi0gIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIGxvbmcgaW50IGw7Ci0gICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2OyB9Ci1jYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbgotICB5ZXMpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCi1fQUNFT0YKLSA7OwotICBubykKLSAgICAgOzsKLSAgKikKLSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKLXByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHVua25vd24gZW5kaWFubmVzcwotcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKLWVzYWMKLQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIGxvbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9uZyBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci10eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9uZXdfOwotaW50Ci1tYWluICgpCi17Ci1pZiAoKGFjX190eXBlX25ld18gKikgMCkKLSAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSAgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfdHlwZV9sb25nX2xvbmc9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX2xvbmdfbG9uZz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZ19sb25nIiA+JjY7IH0KLQotIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKLSMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKLSMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9sb25nX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19sbz0wIGFjX21pZD0wCi0gIHdoaWxlIDo7IGRvCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPSRhY19taWQ7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKLQkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0JCQkgIGFjX2xvPSBhY19oaT0KLQkJCSAgYnJlYWsKLQkJCWZpCi0JCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGk9LTEgYWNfbWlkPS0xCi0gIHdoaWxlIDo7IGRvCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPSRhY19taWQ7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAotCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KLQkJCSAgYWNfbG89IGFjX2hpPQotCQkJICBicmVhawotCQkJZmkKLQkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPSBhY19oaT0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0jIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgotd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwotICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGk9JGFjX21pZAotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZG9uZQotY2FzZSAkYWNfbG8gaW4KLT8qKSBhY19jdl9zaXplb2ZfbG9uZ19sb25nPSRhY19sbzs7Ci0nJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKLSAgIGZpIDs7Ci1lc2FjCi1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87Ci1zdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLWludAotbWFpbiAoKQotewotCi0gIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7Ci0gIGlmICghIGYpCi0gICAgcmV0dXJuIDE7Ci0gIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKLSAgICB7Ci0gICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCi0JcmV0dXJuIDE7Ci0gICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7Ci0gICAgfQotICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZz1gY2F0IGNvbmZ0ZXN0LnZhbGAKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KLSAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZz0wCi0gICBmaQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvbmZ0ZXN0LnZhbAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nX2xvbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9sb25nX2xvbmciID4mNjsgfQotCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HICRhY19jdl9zaXplb2ZfbG9uZ19sb25nCi1fQUNFT0YKLQotCi1pZiB0ZXN0ICRhY19jdl9zaXplb2ZfbG9uZ19sb25nIC1uZSAwOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIENDX0hBU19MT05HX0xPTkcgMQotX0FDRU9GCi0KLWZpCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX2xvbmdfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLXR5cGVkZWYgbG9uZyBkb3VibGUgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfbG9uZ19kb3VibGU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX2xvbmdfZG91YmxlPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfZG91YmxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2xvbmdfZG91YmxlIiA+JjY7IH0KLQotIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKLSMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKLSMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgbG9uZyBkb3VibGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGxvbmcgZG91YmxlLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPTAgYWNfbWlkPTAKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgZG91YmxlIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkOyBicmVhawotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGk9LTEgYWNfbWlkPS0xCi0gIHdoaWxlIDo7IGRvCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfbG89JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89IGFjX2hpPQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi13aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCi0gIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPSRhY19taWQKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLWNhc2UgJGFjX2xvIGluCi0/KikgYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlPSRhY19sbzs7Ci0nJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19kb3VibGUiID0geWVzOyB0aGVuCi0gICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBkb3VibGUpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgZG91YmxlKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfbG9uZ19kb3VibGU9MAotICAgZmkgOzsKLWVzYWMKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOwotc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotICBpZiAoISBmKQotICAgIHJldHVybiAxOwotICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0gICAgewotICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotICAgIH0KLSAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZT1gY2F0IGNvbmZ0ZXN0LnZhbGAKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfZG91YmxlIiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgZG91YmxlKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGRvdWJsZSkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlPTAKLSAgIGZpCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29uZnRlc3QudmFsCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGUiID4mNjsgfQotCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBTSVpFT0ZfTE9OR19ET1VCTEUgJGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZQotX0FDRU9GCi0KLQotaWYgdGVzdCAkYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlIC1uZSAwOyB0aGVuCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZG91YmxlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRvdWJsZS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotdHlwZWRlZiBkb3VibGUgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfZG91YmxlPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfdHlwZV9kb3VibGU9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfZG91YmxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2RvdWJsZSIgPiY2OyB9Ci0KLSMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0jIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCi0jIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KLSMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGRvdWJsZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgZG91YmxlLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfbG89MCBhY19taWQ9MAotICB3aGlsZSA6OyBkbwotICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkOyBicmVhawotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPS0xIGFjX21pZD0tMQotICB3aGlsZSA6OyBkbwotICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19sbz0kYWNfbWlkOyBicmVhawotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgIGFjX2xvPSBhY19oaT0KLQkJCSAgYnJlYWsKLQkJCWZpCi0JCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBkb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19sbz0gYWNfaGk9Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KLXdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KLSAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPSRhY19taWQKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLWNhc2UgJGFjX2xvIGluCi0/KikgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0kYWNfbG87OwotJycpIGlmIHRlc3QgIiRhY19jdl90eXBlX2RvdWJsZSIgPSB5ZXM7IHRoZW4KLSAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0wCi0gICBmaSA7OwotZXNhYwotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOwotc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotICBpZiAoISBmKQotICAgIHJldHVybiAxOwotICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0gICAgewotICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotICAgIH0KLSAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NpemVvZl9kb3VibGU9YGNhdCBjb25mdGVzdC52YWxgCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci1lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0oIGV4aXQgJGFjX3N0YXR1cyApCi1pZiB0ZXN0ICIkYWNfY3ZfdHlwZV9kb3VibGUiID0geWVzOyB0aGVuCi0gICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoZG91YmxlKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9kb3VibGU9MAotICAgZmkKLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb25mdGVzdC52YWwKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfZG91YmxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfZG91YmxlIiA+JjY7IH0KLQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU0laRU9GX0RPVUJMRSAkYWNfY3Zfc2l6ZW9mX2RvdWJsZQotX0FDRU9GCi0KLQotCWlmIHRlc3QgJGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZSAtZ3QgJGFjX2N2X3NpemVvZl9kb3VibGU7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MT05HX0RPVUJMRSAxCi1fQUNFT0YKLQotCWZpCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQotIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2Vsc2UKLSMgZGVmaW5lIElTTE9XRVIoYykgXAotCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAotCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKLQkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCi0jZW5kaWYKLQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludAotbWFpbiAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKLQl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKLSAgICAgIHJldHVybiAyOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLV9BQ0VPRgotCi1maQotCi0KLQotCi1mb3IgYWNfaGVhZGVyIGluIHN0cmluZ3MuaCBzeXMvdGltZS5oIHVuaXN0ZC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWVsc2UKLSAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotICB5ZXM6bm86ICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotb3M9YHVuYW1lIC1zYAotaWYgdGVzdCAieCRvcyIgPSAieEFJWCIgOyB0aGVuCi0gICAgICAgIENGTEFHUz0iJENGTEFHUyAtcWluZm89Z2VuIC1xY3BsdXNjbXQiCi1lbHNlCi0gICAgICAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl90aW1lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLWlmICgoc3RydWN0IHRtICopIDApCi1yZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9oZWFkZXJfdGltZT15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2hlYWRlcl90aW1lPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RpbWUiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zdHJ1Y3RfdG0rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLXN0cnVjdCB0bSB0bTsKLQkJCQkgICAgIGludCAqcCA9ICZ0bS50bV9zZWM7Ci0gCQkJCSAgICAgcmV0dXJuICFwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3N0cnVjdF90bT10aW1lLmgKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3N0cnVjdF90bT1zeXMvdGltZS5oCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdHJ1Y3RfdG0iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3N0cnVjdF90bSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9zdHJ1Y3RfdG0gPSBzeXMvdGltZS5oOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFRNX0lOX1NZU19USU1FIDEKLV9BQ0VPRgotCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPW5vCi1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotCi0gIC8qIFNvbWUgdmVyc2lvbnMgb2YgbWVtY21wIGFyZSBub3QgOC1iaXQgY2xlYW4uICAqLwotICBjaGFyIGMwID0gJ1wxMDAnLCBjMSA9ICdcMjAwJywgYzIgPSAnXDIwMSc7Ci0gIGlmIChtZW1jbXAoJmMwLCAmYzIsIDEpID49IDAgfHwgbWVtY21wKCZjMSwgJmMyLCAxKSA+PSAwKQotICAgIHJldHVybiAxOwotCi0gIC8qIFRoZSBOZXh0IHg4NiBPcGVuU3RlcCBidWcgc2hvd3MgdXAgb25seSB3aGVuIGNvbXBhcmluZyAxNiBieXRlcwotICAgICBvciBtb3JlIGFuZCB3aXRoIGF0IGxlYXN0IG9uZSBidWZmZXIgbm90IHN0YXJ0aW5nIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotICAgICBXaWxsaWFtIExld2lzIHByb3ZpZGVkIHRoaXMgdGVzdCBwcm9ncmFtLiAgICovCi0gIHsKLSAgICBjaGFyIGZvb1syMV07Ci0gICAgY2hhciBiYXJbMjFdOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICB7Ci0JY2hhciAqYSA9IGZvbyArIGk7Ci0JY2hhciAqYiA9IGJhciArIGk7Ci0Jc3RyY3B5IChhLCAiLS0tLS0tLS0wMTExMTExMSIpOwotCXN0cmNweSAoYiwgIi0tLS0tLS0tMTAwMDAwMDAiKTsKLQlpZiAobWVtY21wIChhLCBiLCAxNikgPj0gMCkKLQkgIHJldHVybiAxOwotICAgICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNjsgfQotdGVzdCAkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyA9IG5vICYmIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIG1lbWNtcC4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgbWVtY21wLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotCi0KLWZvciBhY19mdW5jIGluIHZwcmludGYKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfZG9wcm50IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIF9kb3BybnQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfX2RvcHJudCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSBfZG9wcm50IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgX2RvcHJudC4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSBfZG9wcm50IGlubm9jdW91c19fZG9wcm50Ci0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIF9kb3BybnQgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgX2RvcHJudAotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIF9kb3BybnQgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl9fZG9wcm50IHx8IGRlZmluZWQgX19zdHViX19fX2RvcHJudAotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBfZG9wcm50ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfZnVuY19fZG9wcm50PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfZnVuY19fZG9wcm50PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX19kb3BybnQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfX2RvcHJudCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX19kb3BybnQgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ET1BSTlQgMQotX0FDRU9GCi0KLWZpCi0KLWZpCi1kb25lCi0KLQotCi1mb3IgYWNfZnVuYyBpbiBzdHJkdXAKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4bWx0byIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeG1sdG87IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YTUxUTytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXNlICRYTUxUTyBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9YTUxUTz0iJFhNTFRPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfWE1MVE89IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLVhNTFRPPSRhY19jdl9wYXRoX1hNTFRPCi1pZiB0ZXN0IC1uICIkWE1MVE8iOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFhNTFRPIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRYTUxUTyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YTUxUTyI7IHRoZW4KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBZb3UgbXVzdCBoYXZlIFhNTFRPIHRvIGNvbXBpbGUgdGhlIFhNTCBkb2N1bWVudGF0aW9uIGZvciBsaWJhaWYuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogWW91IG11c3QgaGF2ZSBYTUxUTyB0byBjb21waWxlIHRoZSBYTUwgZG9jdW1lbnRhdGlvbiBmb3IgbGliYWlmLiIgPiYyO30KLQlYTUxUTz0iOiIKLWZpCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBkb2MvTWFrZWZpbGUiCi0KLWNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCi0jIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0Ci0jIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Ci0jIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgotIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzLgotCi1fQUNFT0YKLQotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLWZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCi0gICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgotICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCi1kb25lCi1MSUJPQkpTPSRhY19saWJvYmpzCi0KLUxUTElCT0JKUz0kYWNfbHRsaWJvYmpzCi0KLQotaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Ci1jYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jISAkU0hFTEwKLSMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1kZWJ1Zz1mYWxzZQotYWNfY3NfcmVjaGVjaz1mYWxzZQotYWNfY3Nfc2lsZW50PWZhbHNlCi1TSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKLQotICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0gICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCi0gICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0gICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKLSAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAotICAjIGNhc2UgYXQgbGluZSBlbmQuCi0gICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKLSAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgotLW4qKQotICBjYXNlIGBlY2hvICd4XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKLWZpCi1lY2hvID5jb25mJCQuZmlsZQotaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9J2xuIC1zJwotICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgIGFzX2xuX3M9J2NwIC1wJwotZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz1sbgotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD06Ci1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotICAgICAgICB0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluCi0gICAgICAgIC0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4KLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCi0jIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgotYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgbGliYWlmICRhc19tZSAyLjEuMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLWxpYmFpZiBjb25maWcuc3RhdHVzIDIuMS4wCi1jb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEsCi0gIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCi0KLUNvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotYWNfcHdkPSckYWNfcHdkJwotc3JjZGlyPSckc3JjZGlyJwotSU5TVEFMTD0nJElOU1RBTEwnCi1NS0RJUl9QPSckTUtESVJfUCcKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0Ci0jIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotYWNfbmVlZF9kZWZhdWx0cz06Ci13aGlsZSB0ZXN0ICQjICE9IDAKLWRvCi0gIGNhc2UgJDEgaW4KLSAgLS0qPSopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Ci0gIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCi0gICAgZGVidWc9OiA7OwotICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCi0gICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKLQotICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1pZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KLSAgZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMICRTSEVMTCAkMCAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2Ci0gIENPTkZJR19TSEVMTD0kU0hFTEwKLSAgZXhwb3J0IENPTkZJR19TSEVMTAotICBleGVjICRTSEVMTCAiJDAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLSAgZWNobyAiJGFjX2xvZyIKLX0gPiY1Ci0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0KLSMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCi1kbwotICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0gICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKLSAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotICAgICJkb2MvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZG9jL01ha2VmaWxlIiA7OwotCi0gICopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi0gIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0KLSAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgeyB0ZXN0IC16ICIkdG1wIiB8fCB0ZXN0ICEgLWQgIiR0bXAiIHx8IHJtIC1mciAiJHRtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKLScgMAotICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQotfQotIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCi0KLXsKLSAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCi0gIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCi19ICB8fAotewotICB0bXA9Li9jb25mJCQtJFJBTkRPTQotICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKLX0gfHwKLXsKLSAgIGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH0KLX0KLQotIwotIyBTZXQgdXAgdGhlIHNlZCBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KLSMKLQotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCi0jIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0KLV9BQ0VPRgotCi0KLQotYWNfZGVsaW09JyUhXyEjICcKLWZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbwotICBjYXQgPmNvbmYkJHN1YnMuc2VkIDw8X0FDRU9GCi1TSEVMTCEkU0hFTEwkYWNfZGVsaW0KLVBBVEhfU0VQQVJBVE9SISRQQVRIX1NFUEFSQVRPUiRhY19kZWxpbQotUEFDS0FHRV9OQU1FISRQQUNLQUdFX05BTUUkYWNfZGVsaW0KLVBBQ0tBR0VfVEFSTkFNRSEkUEFDS0FHRV9UQVJOQU1FJGFjX2RlbGltCi1QQUNLQUdFX1ZFUlNJT04hJFBBQ0tBR0VfVkVSU0lPTiRhY19kZWxpbQotUEFDS0FHRV9TVFJJTkchJFBBQ0tBR0VfU1RSSU5HJGFjX2RlbGltCi1QQUNLQUdFX0JVR1JFUE9SVCEkUEFDS0FHRV9CVUdSRVBPUlQkYWNfZGVsaW0KLWV4ZWNfcHJlZml4ISRleGVjX3ByZWZpeCRhY19kZWxpbQotcHJlZml4ISRwcmVmaXgkYWNfZGVsaW0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWUhJHByb2dyYW1fdHJhbnNmb3JtX25hbWUkYWNfZGVsaW0KLWJpbmRpciEkYmluZGlyJGFjX2RlbGltCi1zYmluZGlyISRzYmluZGlyJGFjX2RlbGltCi1saWJleGVjZGlyISRsaWJleGVjZGlyJGFjX2RlbGltCi1kYXRhcm9vdGRpciEkZGF0YXJvb3RkaXIkYWNfZGVsaW0KLWRhdGFkaXIhJGRhdGFkaXIkYWNfZGVsaW0KLXN5c2NvbmZkaXIhJHN5c2NvbmZkaXIkYWNfZGVsaW0KLXNoYXJlZHN0YXRlZGlyISRzaGFyZWRzdGF0ZWRpciRhY19kZWxpbQotbG9jYWxzdGF0ZWRpciEkbG9jYWxzdGF0ZWRpciRhY19kZWxpbQotaW5jbHVkZWRpciEkaW5jbHVkZWRpciRhY19kZWxpbQotb2xkaW5jbHVkZWRpciEkb2xkaW5jbHVkZWRpciRhY19kZWxpbQotZG9jZGlyISRkb2NkaXIkYWNfZGVsaW0KLWluZm9kaXIhJGluZm9kaXIkYWNfZGVsaW0KLWh0bWxkaXIhJGh0bWxkaXIkYWNfZGVsaW0KLWR2aWRpciEkZHZpZGlyJGFjX2RlbGltCi1wZGZkaXIhJHBkZmRpciRhY19kZWxpbQotcHNkaXIhJHBzZGlyJGFjX2RlbGltCi1saWJkaXIhJGxpYmRpciRhY19kZWxpbQotbG9jYWxlZGlyISRsb2NhbGVkaXIkYWNfZGVsaW0KLW1hbmRpciEkbWFuZGlyJGFjX2RlbGltCi1ERUZTISRERUZTJGFjX2RlbGltCi1FQ0hPX0MhJEVDSE9fQyRhY19kZWxpbQotRUNIT19OISRFQ0hPX04kYWNfZGVsaW0KLUVDSE9fVCEkRUNIT19UJGFjX2RlbGltCi1MSUJTISRMSUJTJGFjX2RlbGltCi1idWlsZF9hbGlhcyEkYnVpbGRfYWxpYXMkYWNfZGVsaW0KLWhvc3RfYWxpYXMhJGhvc3RfYWxpYXMkYWNfZGVsaW0KLXRhcmdldF9hbGlhcyEkdGFyZ2V0X2FsaWFzJGFjX2RlbGltCi1JTlNUQUxMX1BST0dSQU0hJElOU1RBTExfUFJPR1JBTSRhY19kZWxpbQotSU5TVEFMTF9TQ1JJUFQhJElOU1RBTExfU0NSSVBUJGFjX2RlbGltCi1JTlNUQUxMX0RBVEEhJElOU1RBTExfREFUQSRhY19kZWxpbQotYW1fX2lzcmMhJGFtX19pc3JjJGFjX2RlbGltCi1DWUdQQVRIX1chJENZR1BBVEhfVyRhY19kZWxpbQotUEFDS0FHRSEkUEFDS0FHRSRhY19kZWxpbQotVkVSU0lPTiEkVkVSU0lPTiRhY19kZWxpbQotQUNMT0NBTCEkQUNMT0NBTCRhY19kZWxpbQotQVVUT0NPTkYhJEFVVE9DT05GJGFjX2RlbGltCi1BVVRPTUFLRSEkQVVUT01BS0UkYWNfZGVsaW0KLUFVVE9IRUFERVIhJEFVVE9IRUFERVIkYWNfZGVsaW0KLU1BS0VJTkZPISRNQUtFSU5GTyRhY19kZWxpbQotaW5zdGFsbF9zaCEkaW5zdGFsbF9zaCRhY19kZWxpbQotU1RSSVAhJFNUUklQJGFjX2RlbGltCi1JTlNUQUxMX1NUUklQX1BST0dSQU0hJElOU1RBTExfU1RSSVBfUFJPR1JBTSRhY19kZWxpbQotbWtkaXJfcCEkbWtkaXJfcCRhY19kZWxpbQotQVdLISRBV0skYWNfZGVsaW0KLVNFVF9NQUtFISRTRVRfTUFLRSRhY19kZWxpbQotYW1fX2xlYWRpbmdfZG90ISRhbV9fbGVhZGluZ19kb3QkYWNfZGVsaW0KLUFNVEFSISRBTVRBUiRhY19kZWxpbQotYW1fX3RhciEkYW1fX3RhciRhY19kZWxpbQotYW1fX3VudGFyISRhbV9fdW50YXIkYWNfZGVsaW0KLUNDISRDQyRhY19kZWxpbQotQ0ZMQUdTISRDRkxBR1MkYWNfZGVsaW0KLUxERkxBR1MhJExERkxBR1MkYWNfZGVsaW0KLUNQUEZMQUdTISRDUFBGTEFHUyRhY19kZWxpbQotYWNfY3RfQ0MhJGFjX2N0X0NDJGFjX2RlbGltCi1FWEVFWFQhJEVYRUVYVCRhY19kZWxpbQotT0JKRVhUISRPQkpFWFQkYWNfZGVsaW0KLURFUERJUiEkREVQRElSJGFjX2RlbGltCi1hbV9faW5jbHVkZSEkYW1fX2luY2x1ZGUkYWNfZGVsaW0KLWFtX19xdW90ZSEkYW1fX3F1b3RlJGFjX2RlbGltCi1BTURFUF9UUlVFISRBTURFUF9UUlVFJGFjX2RlbGltCi1BTURFUF9GQUxTRSEkQU1ERVBfRkFMU0UkYWNfZGVsaW0KLUFNREVQQkFDS1NMQVNIISRBTURFUEJBQ0tTTEFTSCRhY19kZWxpbQotQ0NERVBNT0RFISRDQ0RFUE1PREUkYWNfZGVsaW0KLWFtX19mYXN0ZGVwQ0NfVFJVRSEkYW1fX2Zhc3RkZXBDQ19UUlVFJGFjX2RlbGltCi1hbV9fZmFzdGRlcENDX0ZBTFNFISRhbV9fZmFzdGRlcENDX0ZBTFNFJGFjX2RlbGltCi1SQU5MSUIhJFJBTkxJQiRhY19kZWxpbQotQ1BQISRDUFAkYWNfZGVsaW0KLUdSRVAhJEdSRVAkYWNfZGVsaW0KLUVHUkVQISRFR1JFUCRhY19kZWxpbQotTElCT0JKUyEkTElCT0JKUyRhY19kZWxpbQotWE1MVE8hJFhNTFRPJGFjX2RlbGltCi1MVExJQk9CSlMhJExUTElCT0JKUyRhY19kZWxpbQotX0FDRU9GCi0KLSAgaWYgdGVzdCBgc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLnNlZCB8IGdyZXAgLWMgWGAgPSA4MjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLWFjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8wL3AnIGNvbmYkJHN1YnMuc2VkYAotaWYgdGVzdCAtbiAiJGFjX2VvZiI7IHRoZW4KLSAgYWNfZW9mPWBlY2hvICIkYWNfZW9mIiB8IHNvcnQgLW5ydSB8IHNlZCAxcWAKLSAgYWNfZW9mPWBleHByICRhY19lb2YgKyAxYAotZmkKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLWNhdCA+IlwkdG1wL3N1YnMtMS5zZWQiIDw8XENFT0YkYWNfZW9mCi0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiIGVuZAotX0FDRU9GCi1zZWQgJwotcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZwotcy9eL3MsQC87IHMvIS9ALHwjXyEhXyN8LwotOm4KLXQgbgotcy8nIiRhY19kZWxpbSInJC8sZy87IHQKLXMvJC9cXC87IHAKLU47IHMvXi4qXG4vLzsgcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZzsgYiBuCi0nID4+JENPTkZJR19TVEFUVVMgPGNvbmYkJHN1YnMuc2VkCi1ybSAtZiBjb25mJCRzdWJzLnNlZAotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLTplbmQKLXMvfCNfISFfI3wvL2cKLUNFT0YkYWNfZW9mCi1fQUNFT0YKLQotCi0jIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKLSMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97Ci1zLzoqXCQoc3JjZGlyKToqLzovCi1zLzoqXCR7c3JjZGlyfToqLzovCi1zLzoqQHNyY2RpckA6Ki86Lwotcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCi1zLzoqJC8vCi1zL15bXj1dKj1bCSBdKiQvLwotfScKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgotCi0KLWZvciBhY190YWcgaW4gIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICA6QyAkQ09ORklHX0NPTU1BTkRTCi1kbwotICBjYXNlICRhY190YWcgaW4KLSAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7Ci0gIGVzYWMKLSAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KLSAgOltGSExdKjoqKTs7Ci0gIDpMKiB8IDpDKjoqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIDpbRkhdLSkgYWNfdGFnPS06LTs7Ci0gIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7Ci0gIGVzYWMKLSAgYWNfc2F2ZV9JRlM9JElGUwotICBJRlM9OgotICBzZXQgeCAkYWNfdGFnCi0gIElGUz0kYWNfc2F2ZV9JRlMKLSAgc2hpZnQKLSAgYWNfZmlsZT0kMQotICBzaGlmdAotCi0gIGNhc2UgJGFjX21vZGUgaW4KLSAgOkwpIGFjX3NvdXJjZT0kMTs7Ci0gIDpbRkhdKQotICAgIGFjX2ZpbGVfaW5wdXRzPQotICAgIGZvciBhY19mCi0gICAgZG8KLSAgICAgIGNhc2UgJGFjX2YgaW4KLSAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKLSAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCi0JICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAotCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgotCSB0ZXN0IC1mICIkYWNfZiIgfHwKLQkgICBjYXNlICRhY19mIGluCi0JICAgW1xcLyRdKikgZmFsc2U7OwotCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKLQkgICBlc2FjIHx8Ci0JICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICAgICAgZXNhYwotICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAkYWNfZiIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGZyb20gImBJRlM9OgotCSAgZWNobyAkKiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnYCIgYnkgY29uZmlndXJlLiIKLSAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgZmkKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIjs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLQotICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKLSRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgeyBhc19kaXI9IiRhY19kaXIiCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLSAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpGKQotICAjCi0gICMgQ09ORklHX0ZJTEUKLSAgIwotCi0gIGNhc2UgJElOU1RBTEwgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OwotICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKLSAgZXNhYwotICBhY19NS0RJUl9QPSRNS0RJUl9QCi0gIGNhc2UgJE1LRElSX1AgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKLSAgKi8qKSBhY19NS0RJUl9QPSRhY190b3BfYnVpbGRfcHJlZml4JE1LRElSX1AgOzsKLSAgZXNhYwotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgotIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCi1hY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KLQotY2FzZSBgc2VkIC1uICcvZGF0YXJvb3RkaXIvIHsKLSAgcAotICBxCi19Ci0vQGRhdGFkaXJAL3AKLS9AZG9jZGlyQC9wCi0vQGluZm9kaXJAL3AKLS9AbG9jYWxlZGlyQC9wCi0vQG1hbmRpckAvcAotJyAkYWNfZmlsZV9pbnB1dHNgIGluCi0qZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7Ci0qQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICBhY19kYXRhcm9vdGRpcl9oYWNrPScKLSAgcyZAZGF0YWRpckAmJGRhdGFkaXImZwotICBzJkBkb2NkaXJAJiRkb2NkaXImZwotICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCi0gIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCi0gIHMmQG1hbmRpckAmJG1hbmRpciZnCi0gICAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0gIHNlZCAiJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotcyZAY29uZmlndXJlX2lucHV0QCYkY29uZmlndXJlX2lucHV0Jjt0IHQKLXMmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAotcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKLXMmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKLXMmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKLXMmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAotcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0Ci1zJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAotcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAotcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAotcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAotJGFjX2RhdGFyb290ZGlyX2hhY2sKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgc2VkIC1mICIkdG1wL3N1YnMtMS5zZWQiID4kdG1wL291dAotCi10ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQotCi0gIHJtIC1mICIkdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJHRtcC9vdXQiOyBybSAtZiAiJHRtcC9vdXQiOzsKLSAgKikgcm0gLWYgIiRhY19maWxlIjsgbXYgIiR0bXAvb3V0IiAkYWNfZmlsZTs7Ci0gIGVzYWMKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotX0FDRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgYGNvbmZ0ZXN0LmRlZmluZXMnLCB0aGF0Ci0jIHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KLXJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAotIyBGaXJzdCwgYXBwZW5kIGEgc3BhY2UgdG8gZXZlcnkgdW5kZWYvZGVmaW5lIGxpbmUsIHRvIGVhc2UgbWF0Y2hpbmcuCi1lY2hvICdzLyQvIC8nID5jb25mdGVzdC5kZWZpbmVzCi0jIFRoZW4sIHByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCwgb3IgaW4KLSMgYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCwgaW4gY29uZmlnLnN0YXR1cy4gIElmIHNvbWUgbWFjcm9zIHdlcmUKLSMgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCAjZGVmaW5lcyBmb3IgdGhlIHNhbWUKLSMgc3ltYm9sLCB3aGljaCBpcyB1c2VsZXNzLiAgQnV0IGRvIG5vdCBzb3J0IHRoZW0sIHNpbmNlIHRoZSBsYXN0Ci0jIEFDX0RFRklORSBtdXN0IGJlIGhvbm9yZWQuCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIFBBUkFNUyBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCwgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIyBQQVJBTVMgaXMgdGhlIHBhcmFtZXRlciBsaXN0IGluIHRoZSBtYWNybyBkZWZpbml0aW9uLS1pbiBtb3N0IGNhc2VzLCBpdCdzCi0jIGp1c3QgYW4gZW1wdHkgc3RyaW5nLgotYWNfZEE9J3MsXlxcKFsJICNdKlxcKVteCSBdKlxcKFsJIF0qJwotYWNfZEI9J1xcKVsJIChdLiosXFwxZGVmaW5lXFwyJwotYWNfZEM9JyAnCi1hY19kRD0nICwnCi0KLXVuaXEgY29uZmRlZnMuaCB8Ci0gIHNlZCAtbiAnCi0JdCByc2V0Ci0JOnJzZXQKLQlzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8vCi0JdCBvawotCWQKLQk6b2sKLQlzL1tcXCYsXS9cXCYvZwotCXMvXlwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS8gJyIkYWNfZEEiJ1wxJyIkYWNfZEIiJ1wyJyIke2FjX2RDfSInXDMnIiRhY19kRCInL3AKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvJyIkYWNfZEEiJ1wxJyIkYWNfZEIkYWNfZEMiJ1wyJyIkYWNfZEQiJy9wCi0gICcgPj5jb25mdGVzdC5kZWZpbmVzCi0KLSMgUmVtb3ZlIHRoZSBzcGFjZSB0aGF0IHdhcyBhcHBlbmRlZCB0byBlYXNlIG1hdGNoaW5nLgotIyBUaGVuIHJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSMgKFRoZSByZWdleHAgY2FuIGJlIHNob3J0LCBzaW5jZSB0aGUgbGluZSBjb250YWlucyBlaXRoZXIgI2RlZmluZSBvciAjdW5kZWYuKQotZWNobyAncy8gJC8vCi1zLF5bCSAjXSp1LiosLyogJiAqLywnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXM6Ci1hY19tYXhfc2VkX2xpbmVzPTUwCi0KLSMgRmlyc3Qgc2VkIGNvbW1hbmQgaXM6CSBzZWQgLWYgZGVmaW5lcy5zZWQgJGFjX2ZpbGVfaW5wdXRzID4iJHRtcC9vdXQxIgotIyBTZWNvbmQgb25lIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICIkdG1wL291dDEiID4iJHRtcC9vdXQyIgotIyBUaGlyZCBvbmUgd2lsbCBiZToJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQyIiA+IiR0bXAvb3V0MSIKLSMgZXQgY2V0ZXJhLgotYWNfaW49JyRhY19maWxlX2lucHV0cycKLWFjX291dD0nIiR0bXAvb3V0MSInCi1hY19ueHQ9JyIkdG1wL291dDIiJwotCi13aGlsZSA6Ci1kbwotICAjIFdyaXRlIGEgaGVyZSBkb2N1bWVudDoKLSAgICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICAgICMgRmlyc3QsIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGxpbmU6Ci0gICAgY2F0ID4iXCR0bXAvZGVmaW5lcy5zZWQiIDw8XFxDRU9GCi0vXlsJIF0qI1sJIF0qdW5kZWZbCSBdWwkgXSokYWNfd29yZF9yZVsJIF0qXCQvYiBkZWYKLS9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSokYWNfd29yZF9yZVsoCSBdL2IgZGVmCi1iCi06ZGVmCi1fQUNFT0YKLSAgc2VkICR7YWNfbWF4X3NlZF9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gICAgc2VkIC1mICIkdG1wL2RlZmluZXMuc2VkIicgIiRhY19pbiA+JGFjX291dCIgPj4kQ09ORklHX1NUQVRVUwotICBhY19pbj0kYWNfb3V0OyBhY19vdXQ9JGFjX254dDsgYWNfbnh0PSRhY19pbgotICBzZWQgMSwke2FjX21heF9zZWRfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCi0gIGdyZXAgLiBjb25mdGVzdC50YWlsID4vZGV2L251bGwgfHwgYnJlYWsKLSAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAotCi1lY2hvICJhY19yZXN1bHQ9JGFjX2luIiA+PiRDT05GSUdfU1RBVFVTCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiA+IiR0bXAvY29uZmlnLmgiCi0gICAgY2F0ICIkYWNfcmVzdWx0IiA+PiIkdG1wL2NvbmZpZy5oIgotICAgIGlmIGRpZmYgJGFjX2ZpbGUgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLWVjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIHJtIC1mICRhY19maWxlCi0gICAgICBtdiAiJHRtcC9jb25maWcuaCIgJGFjX2ZpbGUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iCi0gICAgY2F0ICIkYWNfcmVzdWx0IgotICBmaQotICBybSAtZiAiJHRtcC9vdXQxMiIKLSMgQ29tcHV0ZSAkYWNfZmlsZSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRhY19maWxlIHwgJGFjX2ZpbGU6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRhY19maWxlIiA+YCRhc19kaXJuYW1lIC0tICRhY19maWxlIHx8Ci0kYXNfZXhwciBYJGFjX2ZpbGUgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCRhY19maWxlIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgkYWNfZmlsZSA6ICdYXCgvL1wpJCcgXHwgXAotCSBYJGFjX2ZpbGUgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgkYWNfZmlsZSB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotCi0gIDpDKSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKLWVjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQotIDs7Ci0gIGVzYWMKLQotCi0gIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgotICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgotICBpZiBzZWQgMTBxICIkbWYiIHwgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8Ci0kYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgZWxzZQotICAgIGNvbnRpbnVlCi0gIGZpCi0gICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICMgZXhwYW5zaW9uLgotICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLSAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8Ci0kYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgeyBhc19kaXI9JGRpcnBhcnQvJGZkaXIKLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7Ci0gICAgYXNfZGlycz0KLSAgICB3aGlsZSA6OyBkbwotICAgICAgY2FzZSAkYXNfZGlyIGluICMoCi0gICAgICAqXCcqKSBhc19xZGlyPWBlY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhc19kaXIiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQotICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gIGRvbmUKLWRvbmUKLSA7OwotCi0gIGVzYWMKLWRvbmUgIyBmb3IgYWNfdGFnCi0KLQoteyAoZXhpdCAwKTsgZXhpdCAwOyB9Ci1fQUNFT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotCi0KLSMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KLSMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgotIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KLSMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cwotIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKLSMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKLSMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQotIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KLWlmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgotICBhY19jc19zdWNjZXNzPToKLSAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQotICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgotICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgotICBleGVjIDU+L2Rldi9udWxsCi0gICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKLSAgZXhlYyA1Pj5jb25maWcubG9nCi0gICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCi0gICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgotICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbmZpZ3VyZS5pbiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZjMxNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1kbmwKLWRubCBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMSBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLWRubAotZG5sIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWRubCBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLWRubCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotZG5sIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi1kbmwKLQotQUNfUFJFUkVRKDIuNTApCi0KLUFDX0lOSVQobGliYWlmLCAyLjEuMCkKLUFNX0lOSVRfQVVUT01BS0UKLUFDX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCi0KLWRubCBDaGVja3MgZm9yIHByb2dyYW1zLgotQU1fUFJPR19DQ19DX08KLUFDX1BST0dfSU5TVEFMTAotQUNfUFJPR19NQUtFX1NFVAotQUNfUFJPR19SQU5MSUIKLQotZG5sIENoZWNrcyBmb3IgbGlicmFyaWVzLgotCi1kbmwgQ2hlY2sgZW5kaWFubmVzcwotQUNfQ19CSUdFTkRJQU4KLQotZG5sIFNlZSBpZiBjb21waWxlciBzdXBwb3J0cyAibG9uZyBsb25nIiB0eXBlLgotCi1BQ19DSEVDS19TSVpFT0YobG9uZyBsb25nKQotaWYgdGVzdCAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyAtbmUgMDsgdGhlbgotCUFDX0RFRklORShDQ19IQVNfTE9OR19MT05HLDEsW2RlZmluZSBpZiBzeXN0ZW0gaGFzIGxvbmcgbG9uZyB0eXBlLl0pCi1maQotCi1kbmwgU2VlIGlmIGNvbXBpbGVyIHN1cHBvcnRzICJsb25nIGRvdWJsZSIgdHlwZS4KLQotQUNfQ0hFQ0tfU0laRU9GKGxvbmcgZG91YmxlKQotaWYgdGVzdCAkYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlIC1uZSAwOyB0aGVuCi0JZG5sIFNlZSBpZiAibG9uZyBkb3VibGUiIGlzIGxvbmdlciB0aGFuICJkb3VibGUiLgotCi0JQUNfQ0hFQ0tfU0laRU9GKGRvdWJsZSkKLQlpZiB0ZXN0ICRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGUgLWd0ICRhY19jdl9zaXplb2ZfZG91YmxlOyB0aGVuCi0JCUFDX0RFRklORShIQVZFX0xPTkdfRE9VQkxFLDEsW2RlZmluZSBpZiBzeXN0ZW0gaGFzIGxvbmcgZG91YmxlIHR5cGUuXSkKLQlmaQotZmkKLQotZG5sIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5ncy5oIHN5cy90aW1lLmggdW5pc3RkLmgpCi0KLW9zPWB1bmFtZSAtc2AKLWlmIHRlc3QgIngkb3MiID0gInhBSVgiIDsgdGhlbgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXFpbmZvPWdlbiAtcWNwbHVzY210IgotZWxzZQotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCi1maQotCi1kbmwgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLUFDX0hFQURFUl9USU1FCi1BQ19TVFJVQ1RfVE0KLQotZG5sIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCi1BQ19GVU5DX01FTUNNUAotQUNfRlVOQ19WUFJJTlRGCi1BQ19DSEVDS19GVU5DUyhzdHJkdXApCi0KLUFDX1BBVEhfUFJPRyhYTUxUTywgeG1sdG8pCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YTUxUTyI7IHRoZW4KLQlBQ19NU0dfV0FSTihbWW91IG11c3QgaGF2ZSBYTUxUTyB0byBjb21waWxlIHRoZSBYTUwgZG9jdW1lbnRhdGlvbiBmb3IgbGliYWlmLl0pCi0JWE1MVE89IjoiCi1maQotCi1BQ19PVVRQVVQoW01ha2VmaWxlIGRvYy9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jb252LmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9jb252LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNGZhYmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvY29udi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg2MyArMCwwIEBACi0vKgotICogUm91dGluZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBuYXRpdmUgZGF0YSBmb3JtYXQgYW5kCi0gKiBBSUYgb3IgZm9yIGNvbnN0cnVjdGluZyBBSUYgb2JqZWN0cy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUJPGNvbmZpZy5oPgotI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KLQotI2luY2x1ZGUJPGFzc2VydC5oPgotI2luY2x1ZGUJPGN0eXBlLmg+Ci0jaW5jbHVkZQk8c3RkaW8uaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLSNpbmNsdWRlCTxzdGRsaWIuaD4KLSNpbmNsdWRlCTxzdGRhcmcuaD4KLQotI2luY2x1ZGUJImFpZi5oIgotI2luY2x1ZGUJImFpZmVyci5oIgotI2luY2x1ZGUJImFpZmludC5oIgotCi0jaWYgZGVmaW5lZChXSU5ET1dTTlQpIHx8IGRlZmluZWQoV0lOMzIpCi0jZGVmaW5lIEJJVFNQRVJCWVRFCTgKLSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQotI2luY2x1ZGUJPHN5cy90eXBlcy5oPgotI2RlZmluZSBCSVRTUEVSQllURQlOQkJZCi0jZWxzZSAvKiBXSU5ET1dTTlQgfHwgV0lOMzIgKi8KLSNpbmNsdWRlCTx2YWx1ZXMuaD4KLSNlbmRpZiAvKiBXSU5ET1dTTlQgfHwgV0lOMzIgKi8KLQotdW5pb24gaWVlZQotewotCWNoYXIJCWM7Ci0JaW50CQlpOwotCUFJRkxPTkdFU1QJbGk7Ci0JZmxvYXQJCWY7Ci0JZG91YmxlCQlkOwotCUFJRkRPVUJMRVNUCWRkOwotCS8qCi0JKiogbG9uZyBlbm91Z2ggZm9yIGFueSBjb25jZWl2YWJsZSBwcmVjaXNpb24KLQkqLwotCWNoYXIJCWJ5dGVzWzI1Ni9CSVRTUEVSQllURV07Ci19OwotCi0vKgotICogRm9yIF9haWZfKl90b19zdHIoKSBmdW5jdGlvbnMKLSAqLwotc3RhdGljIGNoYXIgKl9zdHJfYnVmID0gTlVMTDsKLXN0YXRpYyBjaGFyICpfc3RyX3BvcyA9IE5VTEw7Ci1zdGF0aWMgaW50IF9zdHJfYnVmX2xlbiA9IDA7Ci0KLS8qCi0gKiBDb252ZXJ0IGJhc2UgdHlwZSB0byBzdGFuZGFyZCBieXRlIG9yZGVyaW5nLgotICovCi12b2lkCi1fYWlmX25vcm1hbGlzZShjaGFyICpkc3QsIGludCBkc3RsZW4sIGNoYXIgKnNyYywgaW50IHNyY2xlbikKLXsKLSNpZm5kZWYgV09SRFNfQklHRU5ESUFOCi0JaW50CWk7Ci0jZW5kaWYKLQlpbnQJbGVuOwotCWludAlwYWQgPSAwOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JaWYgKCBzcmNsZW4gPCBkc3RsZW4gKQotCXsKLQkJbGVuID0gc3JjbGVuOwotCQlwYWQgPSBkc3RsZW4gLSBzcmNsZW47Ci0JfSAKLQllbHNlIGlmICggc3JjbGVuID49IGRzdGxlbiApCi0JCWxlbiA9IGRzdGxlbjsKLQotI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCW1lbWNweShkc3QsIHNyYytzcmNsZW4tbGVuLCBsZW4pOwotCi0JaWYgKCBwYWQgPiAwICkKLQkJbWVtc2V0KGRzdCtsZW4sICdcMCcsIHBhZCk7Ci0jZWxzZSAvKiBXT1JEU19CSUdFTkRJQU4gKi8KLQlmb3IgKCBpID0gbGVuIC0gMSA7IGkgPj0gMCA7IGktLSApCi0JCSpkc3QrKyA9IHNyY1tpXTsKLQotCWlmICggcGFkID4gMCApCi0JCW1lbXNldChkc3QsICdcMCcsIHBhZCk7Ci0jZW5kaWYgLyogV09SRFNfQklHRU5ESUFOICovCi19Ci0KLS8qCi0gKiBOb3JtYWxpc2UgYSB2YWx1ZSB0byB0aGUgc3RhbmRhcmQgZm9ybWF0Ci0gKi8KLXZvaWQKLUFJRk5vcm1hbGlzZShjaGFyICpkc3QsIGludCBkc3RsZW4sIGNoYXIgKnNyYywgaW50IHNyY2xlbikKLXsKLQlfYWlmX25vcm1hbGlzZShkc3QsIGRzdGxlbiwgc3JjLCBzcmNsZW4pOwotfQotCi0vKgotICogQ29udmVydCBhIHBvaW50ZXIgdmFsdWUgdG8gQUlGIGRhdGEgZm9ybWF0LiBSZXN1bHQgaXMgcmQuCi0gKi8KLWludAotX3BvaW50ZXJfdG9fYWlmKGNoYXIgKipyZCwgY29uc3QgQUlGICphZGRyLCBjb25zdCBBSUYgKnZhbCkKLXsKLQlpZiAoIHJkID09IE5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlpZiggKnJkID09IE5VTEwgKSB7Ci0JCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhBSUZfTEVOKGFkZHIpICsgQUlGX0xFTih2YWwpICsgMSk7Ci0JfQotCi0JKipyZCA9IChjaGFyKSBBSUZfUFRSX05PUk1BTDsgLyogaW5kaWNhdGVzIG5vcm1hbCBwb2ludGVyIHZhbHVlICovCi0JCi0JbWVtY3B5KCgqcmQpKzEsIEFJRl9EQVRBKGFkZHIpLCBBSUZfTEVOKGFkZHIpKTsKLQltZW1jcHkoKCpyZCkrMStBSUZfTEVOKGFkZHIpLCBBSUZfREFUQSh2YWwpLCBBSUZfTEVOKHZhbCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIGludGVnZXIgdmFsdWUgb2YgYW55IGxlbmd0aCB0byBBSUYgZGF0YSBmb3JtYXQuCi0gKiBSZXN1bHQgaXMgcmQuCi0gKi8KLWludAotX2xvbmdlc3RfdG9fYWlmKGNoYXIgKipyZCwgaW50IGxlbiwgQUlGTE9OR0VTVCB2YWwpCi17Ci0JaW50CQlzcmNsZW47Ci0JdW5pb24gaWVlZQlmOwotCi0JaWYgKCByZCA9PSBOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JaWYoICpyZCA9PSBOVUxMICkKLQkJKnJkID0gKGNoYXIgKilfYWlmX2FsbG9jKGxlbik7Ci0KLQlpZiAoIGxlbiA8PSBzaXplb2YoaW50KSApCi0JewotCQlmLmkgPSAoaW50KXZhbDsKLQkJc3JjbGVuID0gc2l6ZW9mKGludCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWYubGkgPSB2YWw7Ci0JCXNyY2xlbiA9IHNpemVvZihBSUZMT05HRVNUKTsKLQl9Ci0KLQlfYWlmX25vcm1hbGlzZSgqcmQsIGxlbiwgZi5ieXRlcywgc3JjbGVuKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ29udmVydCBhIGNoYXJhY3RlciB2YWx1ZSB0byBBSUYgZGF0YSBmb3JtYXQuIFJlc3VsdCBpcyByZC4KLSAqLwotaW50Ci1fY2hhcl90b19haWYoY2hhciAqKnJkLCBjaGFyIHZhbCkKLXsKLQl1bmlvbiBpZWVlCWY7Ci0KLQlpZiAoIHJkID09IE5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlpZiggKnJkID09IE5VTEwgKQotCQkqcmQgPSAoY2hhciAqKV9haWZfYWxsb2Moc2l6ZW9mKGNoYXIpKTsKLQotCWYuYyA9IHZhbDsKLQotCUFJRk5vcm1hbGlzZSgqcmQsIHNpemVvZihjaGFyKSwgZi5ieXRlcywgc2l6ZW9mKGNoYXIpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ3JlYXRlIGFuIGVtcHR5IG5hbWVkIEFJRiBvYmplY3QuCi0gKi8KLUFJRiAqCi1OYW1lQUlGKEFJRiAqb2xkQUlGLCBpbnQgbmFtZSkKLXsKLQlBSUYgKglhOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JYSA9IE5ld0FJRigwLCAwKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX05BTUVfVFlQRShuYW1lLCBBSUZfRk9STUFUKG9sZEFJRikpKTsKLQlBSUZfREFUQShhKSA9IF9haWZfYWxsb2MoQUlGX0xFTihvbGRBSUYpKTsKLQltZW1jcHkoQUlGX0RBVEEoYSksIEFJRl9EQVRBKG9sZEFJRiksIEFJRl9MRU4ob2xkQUlGKSk7Ci0JQUlGX0xFTihhKSA9IEFJRl9MRU4ob2xkQUlGKTsKLQotCXJldHVybiBhOwotfQotCi1pbnQKLUFJRlNldElkZW50aWZpZXIoQUlGICphLCBjaGFyICppZCkKLXsKLQlyZXR1cm4gRkRTU2V0SWRlbnRpZmllcigmKEFJRl9GT1JNQVQoYSkpLCBpZCk7Ci19Ci0KLWNoYXIgKgotQUlGR2V0SWRlbnRpZmllcihBSUYgKmEpCi17Ci0JcmV0dXJuIEZEU0dldElkZW50aWZpZXIoQUlGX0ZPUk1BVChhKSk7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYW4gZW1wdHkgcmVmZXJlbmNlIHRvIGFuIEFJRiBvYmplY3QKLSAqLwotQUlGICoKLVJlZmVyZW5jZUFJRihpbnQgbmFtZSkKLXsKLQlBSUYgKglhOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JYSA9IE5ld0FJRigwLCAwKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX1JFRkVSRU5DRV9UWVBFKG5hbWUpKTsKLQlBSUZfTEVOKGEpID0gMDsKLQkKLQlyZXR1cm4gYTsKLX0KLQotLyoKLSAqIHRvV2hhdCByZXByZXNlbnRzIHRoZSBzb3J0IG9mIHRoaW5nIHRvIHdoaWNoIGEgbnVsbCBwb2ludGVyIG5lZWRzIHRvIGJlCi0gKiBjcmVhdGVkLiAgSWYgaXQgaXMgbmFtZWQsIHRoYXQgbmFtZSBpcyB1c2VkIGluIHRoZSByZXN1bHRpbmcgQUlGOyBvdGhlcndpc2UsCi0gKiB0aGUgZm9ybWF0IG9mIHRvV2hhdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBmb3JtYXQgb2YgdGhlIG5ldyBBSUYuCi0gKi8KLUFJRiAqCi1BSUZOdWxsKEFJRiAqdG9XaGF0KQotewotCWludAluYW1lOwotCUFJRiAqCWE7Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJb2xkRm9ybWF0ID0gQUlGX0ZPUk1BVCh0b1doYXQpOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JYSA9IE5ld0FJRigwLCAxKTsKLQotCWlmICggKm9sZEZvcm1hdCA9PSAnJScgKQotCXsKLQkJLyoKLQkJKiogYSByZWZlcmVuY2UKLQkJKi8KLQkJc3NjYW5mKG9sZEZvcm1hdCwgIiUlJWQvIiwgJm5hbWUpOwotCQlmbXQgPSBzdHJkdXAoQUlGX1JFRkVSRU5DRV9UWVBFKG5hbWUpKTsKLQkJQUlGX0ZPUk1BVChhKSA9IHN0cmR1cChBSUZfUE9JTlRFUl9UWVBFKE5VTEwsIGZtdCkpOwotCQlfYWlmX2ZyZWUoZm10KTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogCi0JCSoqIHJlcGVhdCB0aGUgZm9ybWF0Ci0JCSovCi0JCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX1BPSU5URVJfVFlQRShOVUxMLCBvbGRGb3JtYXQpKTsKLQl9Ci0KLQlBSUZfREFUQShhKVswXSA9IEFJRl9QVFJfTklMOwotCUFJRl9MRU4oYSkgPSAxOwotCQotCXJldHVybiBhOwotfQotCi1BSUYgKgotUG9pbnRlck5hbWVUb0FJRihBSUYgKmkpCi17Ci0JQUlGICoJYTsKLQlpbnQJbmFtZTsKLQljaGFyICoJZm10ID0gQUlGX0ZPUk1BVChpKTsKLQotCWEgPSBOZXdBSUYoMCwgQUlGX0xFTihpKSsyKTsKLQotCXNzY2FuZihmbXQsICIlJSVkLyIsICZuYW1lKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX1BPSU5URVJfVFlQRShOVUxMLCBBSUZfRk9STUFUKGkpKSk7Ci0KLQkqKEFJRl9EQVRBKGEpKSA9IChjaGFyKSBBSUZfUFRSX05BTUU7Ci0JX2ludF90b19wdHJuYW1lKCAoaW50KSBuYW1lLCBBSUZfREFUQShhKSsxKTsKLQkKLQltZW1jcHkoQUlGX0RBVEEoYSkrNSwgQUlGX0RBVEEoaSksIEFJRl9MRU4oaSkpOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JcmV0dXJuIGE7Ci19Ci0KLUFJRiAqCi1Qb2ludGVyUmVmZXJlbmNlVG9BSUYoQUlGICp0b1doYXQpCi17Ci0JaW50CW5hbWU7Ci0JQUlGICoJYTsKLQljaGFyICoJZm10OwotCWNoYXIgKglvbGRGb3JtYXQgPSBBSUZfRk9STUFUKHRvV2hhdCk7Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlhID0gTmV3QUlGKDAsIDIpOwotCi0JaWYgKCAqb2xkRm9ybWF0ID09ICclJyApCi0JewotCQkvKgotCQkqKiBhIHJlZmVyZW5jZQotCQkqLwotCQlzc2NhbmYob2xkRm9ybWF0LCAiJSUlZC8iLCAmbmFtZSk7Ci0JCWZtdCA9IHN0cmR1cChBSUZfUkVGRVJFTkNFX1RZUEUobmFtZSkpOwotCQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9QT0lOVEVSX1RZUEUoTlVMTCwgZm10KSk7Ci0JCV9haWZfZnJlZShmbXQpOwotCX0KLQotCUFJRl9EQVRBKGEpWzBdID0gQUlGX1BUUl9SRUZFUkVOQ0U7Ci0JX2ludF90b19wdHJuYW1lKCAoaW50KSBuYW1lLCBBSUZfREFUQShhKSsxKTsKLQlBSUZfTEVOKGEpID0gNTsKLQkKLQlyZXR1cm4gYTsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIHBvaW50ZXIgdG8gYW4gQUlGIG9iamVjdC4KLSAqLwotQUlGICoKLVBvaW50ZXJUb0FJRihBSUYgKmFkZHIsIEFJRiAqaSkKLXsKLQlBSUYgKglhOwotCi0JYSA9IE5ld0FJRigwLCBBSUZfTEVOKGFkZHIpK0FJRl9MRU4oaSkrMSk7Ci0JQUlGX0ZPUk1BVChhKSA9IHN0cmR1cChBSUZfUE9JTlRFUl9UWVBFKEFJRl9GT1JNQVQoYWRkciksIEFJRl9GT1JNQVQoaSkpKTsKLQotCWlmICggX3BvaW50ZXJfdG9fYWlmKCZBSUZfREFUQShhKSwgYWRkciwgaSkgPCAwICkKLQl7Ci0JCUFJRkZyZWUoYSk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlyZXR1cm4gYTsKLX0KLQotQUlGICoKLUNoYXJQb2ludGVyVG9BSUYoQUlGICphZGRyLCBjaGFyICp2YWwpCi17Ci0JQUlGICoJYTsKLQlpbnQJbGVuZ3RoID0gc3RybGVuKHZhbCk7Ci0KLQlpZiAoIGxlbmd0aCA+IDEgPDwgKDIgKiBCSVRTUEVSQllURSkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1NUUklORywgTlVMTCk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlhID0gTmV3QUlGKDAsIEFJRl9MRU4oYWRkcikrbGVuZ3RoKzIpOwotCQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX0NIQVJfUE9JTlRFUl9UWVBFKEFJRl9GT1JNQVQoYWRkcikpKTsKLQotCW1lbWNweShBSUZfREFUQShhKSwgQUlGX0RBVEEoYWRkciksIEFJRl9MRU4oYWRkcikpOwotCi0JKEFJRl9EQVRBKGEpKVtBSUZfTEVOKGFkZHIpXSA9IChsZW5ndGggPj4gOCkgJiAweGZmOwotCShBSUZfREFUQShhKSlbQUlGX0xFTihhZGRyKSsxXSA9IGxlbmd0aCAmIDB4ZmY7Ci0KLQlzdHJuY3B5KEFJRl9EQVRBKGEpK0FJRl9MRU4oYWRkcikrMiwgdmFsLCBsZW5ndGgpOwotCi0JcmV0dXJuIGE7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIChkZWZpbmVkIGFzIGEgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBhcnJheQotICogb2YgY2hhcmFjdGVycykgdG8gQUlGIGZvcm1hdC4KLSAqLwotQUlGICoKLVN0cmluZ1RvQUlGKGNoYXIgKmkpCi17Ci0JQUlGICoJYTsKLQlpbnQJbGVuZ3RoID0gc3RybGVuKGkpOwotCi0JaWYgKCBsZW5ndGggPiAxIDw8ICgyICogQklUU1BFUkJZVEUpICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9TVFJJTkcsIE5VTEwpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JYSA9IE5ld0FJRigwLCBsZW5ndGgrMik7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9TVFJJTkdfVFlQRSgpKTsKLQotCShBSUZfREFUQShhKSlbMF0gPSAobGVuZ3RoID4+IDgpICYgMHhmZjsKLQkoQUlGX0RBVEEoYSkpWzFdID0gbGVuZ3RoICYgMHhmZjsKLQotCXN0cm5jcHkoQUlGX0RBVEEoYSkrMiwgaSwgbGVuZ3RoKTsKLQotCXJldHVybiBhOwotfQotCi0vKiBDb252ZXJ0cyBpbnB1dCBidWZmZXIgdG8gaGV4YWRlY2ltYWwgZGlzcGxheSBpbiBvdXRwdXQgc3RyaW5nLgotICogU3RyaW5nIGxlbmd0aCBpcyB1c2VkIHNpbmNlIHplcm8gaXMgbGVnaXRpbWF0ZS4KLSAqLwotc3RhdGljIHZvaWQgCi1CeXRlVG9IZXgoY2hhciAqb3V0X3N0cmluZywgY2hhciAqaW5fc3RyaW5nLCBpbnQgaW5fc2l6ZSkKLXsKLQljaGFyIGhleGNoYXJzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0JY2hhciBjaDsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpPGluX3NpemU7IGkrKykgewotCQljaCA9ICppbl9zdHJpbmcrKzsKLQkJKm91dF9zdHJpbmcrKyA9IGhleGNoYXJzWyhjaCA+PiA0KSAmIDB4Zl07IC8qIFtjLzE2XTsgKi8KLQkJKm91dF9zdHJpbmcrKyA9IGhleGNoYXJzWyBjaCAmIDB4Zl07IC8qIFtjJTE2XTsgKi8KLQl9Ci19Ci0vKiBHZXQgZGVmYXVsdCBhZGRyZXNzIGZvcm1hdCB3aXRoIHNpemUKLSAqIAotICovCi1zdGF0aWMgY2hhciAqIAotR2V0RGVmYXVsdEFkZHJlc3MoaW50IHNpemUpCi17Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqcGF0dGVybiA9ICIwMCI7Ci0JY2hhciAqYWRkciA9IChjaGFyICopbWFsbG9jKHNpemUqMiArIDEpOwotCS8vY2hhciBhZGRyW3NpemUqMl07Ci0JLy9hZGRyWzBdID0gJ1wwJzsKLQotCWZvciAoaT0wOyBpPHNpemU7IGkrKykgewotCQltZW1jcHkoJmFkZHJbaSoyXSwgcGF0dGVybiwgMik7Ci0JCS8vc3RyY2F0KGFkZHIsIHBhdHRlcm4pOwotCX0KLQlhZGRyW3NpemUqMl0gPSAnXDAnOwotCXJldHVybiBzdHJkdXAoYWRkcik7Ci19Ci0vKiBDb252ZXJ0cyBoZXhhZGVjaW1hbCBkaXNwbGF5IHRvIGJpbmFyeS4gU3RyaW5nIGxlbmd0aCBpcyB1c2VkCi0gKiBhbmQgb25seSBoZXhhZGVjaW1hbCBwYWlycyBhcmUgaGFuZGxlZC4KLSAqLwotc3RhdGljIHZvaWQgCi1IZXhUb0J5dGUoY2hhciAqb3V0X3N0cmluZywgY2hhciAqaW5fc3RyaW5nLCBpbnQgaW5fc2l6ZSkKLXsKLQlpbnQgaTsKLQlpbnQgaF92YWx1ZSwgY192YWx1ZTsKLQlpbnQgYnl0ZV92YWwgPSAwOwotCWludCBpbl9sZW4sIGRlZl9sZW4gPSAwOwotCWNoYXIgKmlucHV0OwotCWNoYXIgKmRlZl9pbnB1dDsKLQkKLQlkZWZfaW5wdXQgPSBHZXREZWZhdWx0QWRkcmVzcyhpbl9zaXplKTsKLQlpZiAoaW5fc2l6ZSUyICE9IDApIHsKLQkJb3V0X3N0cmluZyA9IHN0cmR1cChkZWZfaW5wdXQpOwotCQlyZXR1cm47Ci0JfQotCi0JaW5fbGVuID0gc3RybGVuKGluX3N0cmluZyk7Ci0JZGVmX2xlbiA9IHN0cmxlbihkZWZfaW5wdXQpOwotCi0JaWYgKGluX2xlbiA9PSBkZWZfbGVuKSB7Ci0JCXN0cmNweShkZWZfaW5wdXQsIGluX3N0cmluZyk7Ci0JfQotCWVsc2UgewotCQlmb3IgKGk9ZGVmX2xlbi1pbl9sZW47IGk8ZGVmX2xlbjsgaSsrKSB7Ci0JCQlkZWZfaW5wdXRbaV0gPSAqaW5fc3RyaW5nKys7Ci0JCX0KLQl9Ci0KLQlpbnB1dCA9IHN0cmR1cChkZWZfaW5wdXQpOwotCWZvciAoaT0wOyBpPChpbl9zaXplKjIpOyBpKyspIHsKLQkJaWYgKChoX3ZhbHVlID0gKmlucHV0KyspID49ICcwJyAmJiBoX3ZhbHVlIDw9ICc5JykKLQkJCWNfdmFsdWUgPSBoX3ZhbHVlIC0gJzAnOwotCQllbHNlCi0JCQkoY192YWx1ZSA9IDEwICsgKGhfdmFsdWUgJiAweGYpIC0gKCdhJyAmIDB4ZikpOwotCi0JCWlmICghKGklMikpCi0JCQlieXRlX3ZhbCA9IGNfdmFsdWUgKiAxNjsKLQkJZWxzZQotCQkJKm91dF9zdHJpbmcrKyA9IGJ5dGVfdmFsICsgY192YWx1ZTsKLQl9Ci19Ci0vKgotICogQ29udmVydCBhbiBhZGRyZXNzIChkZWZpbmVkIGFzIGEgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBhcnJheQotICogb2YgY2hhcmFjdGVycykgdG8gQUlGIGZvcm1hdC4KLSAqLwotQUlGICoKLUFkZHJlc3NUb0FJRihjaGFyICphZGRyLCBpbnQgbGVuKQotewotCUFJRiAqIGE7Ci0JY2hhciAqIGJ1ZjsKLQkKLQlpZiAoYWRkciA9PSBOVUxMKSB7Ci0JCWFkZHIgPSBHZXREZWZhdWx0QWRkcmVzcyhsZW4pOwotCX0KLQotCWEgPSBOZXdBSUYoMCwgbGVuKTsKLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9BRERSRVNTX1RZUEUobGVuKSk7Ci0KLQkvL21lbWNweShBSUZfREFUQShhKSwgJmFkZHIsIGluX3NpemUpOwotCWJ1ZiA9IF9haWZfYWxsb2MobGVuKTsKLQlIZXhUb0J5dGUoYnVmLCBhZGRyLCBsZW4pOwotLyoKLQljaGFyICpoZXg7Ci0JaGV4ID0gX2FpZl9hbGxvYyhsZW4pOwotCUJ5dGVUb0hleChoZXgsIGJ1ZiwgbGVuKTsKLQlwcmludGYoIi0tLS0gQWRkcmVzcyBoZXg6ICVzLCAlaVxuIiwgaGV4LCBsZW4pOwotCWZyZWUoaGV4KTsKLSovCi0JbWVtY3B5KEFJRl9EQVRBKGEpLCBidWYsIGxlbik7Ci0JZnJlZShidWYpOwotCXJldHVybiBhOwotfQotLyoKLSAqIENvbnZlcnQgYSBib29sZWFuIHZhbHVlIHRvIEFJRi4KLSAqLwotQUlGICoKLUJvb2xUb0FJRihpbnQgYikKLXsKLQlBSUYgICogYTsKLQlpbnQgICAgc2l6ZTsKLQotCXNpemUgPSBzaXplb2YoaW50KTsKLQotCWEgPSBOZXdBSUYoMCwgc2l6ZSk7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9CT09MRUFOX1RZUEUoKSk7Ci0KLQlpZiAoIGIgKQotCQltZW1zZXQoQUlGX0RBVEEoYSksIDB4ZmYsIHNpemUpOwotCWVsc2UKLQkJbWVtc2V0KEFJRl9EQVRBKGEpLCAwLCBzaXplKTsKLQotCXJldHVybiBhOwotfQotCi0vKgotICogQ29udmVydCBhIGNoYXJhY3RlciB0byBBSUYuCi0gKi8KLUFJRiAqCi1DaGFyVG9BSUYoY2hhciBjKQotewotCUFJRiAqCWE7Ci0KLQlhID0gTmV3QUlGKDAsIHNpemVvZihjaGFyKSk7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9DSEFSQUNURVJfVFlQRSgpKTsKLQotCWlmICggX2NoYXJfdG9fYWlmKCZBSUZfREFUQShhKSwgYykgPCAwICkKLQl7Ci0JCUFJRkZyZWUoYSk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlyZXR1cm4gYTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBzaG9ydCBpbnRlZ2VyIHRvIEFJRi4KLSAqLwotQUlGICoKLVNob3J0VG9BSUYoc2hvcnQgaSkKLXsKLQlBSUYgKglhOwotCi0JYSA9IE5ld0FJRigwLCBzaXplb2Yoc2hvcnQpKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX0lOVEVHRVJfVFlQRSgxLCBzaXplb2Yoc2hvcnQpKSk7Ci0KLQlpZiAoIF9sb25nZXN0X3RvX2FpZigmQUlGX0RBVEEoYSksIHNpemVvZihzaG9ydCksIChBSUZMT05HRVNUKWkpIDwgMCApCi0JewotCQlBSUZGcmVlKGEpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JcmV0dXJuIGE7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIHVuc2lnbmVkIHNob3J0IHRvIEFJRi4KLSAqLwotQUlGICoKLVVuc2lnbmVkU2hvcnRUb0FJRih1bnNpZ25lZCBzaG9ydCBpKQotewotCUFJRiAqCWE7Ci0KLQlhID0gTmV3QUlGKDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotCi0JQUlGX0ZPUk1BVChhKSA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpKTsKLQotCWlmICggX2xvbmdlc3RfdG9fYWlmKCZBSUZfREFUQShhKSwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgKEFJRkxPTkdFU1QpaSkgPCAwICkKLQl7Ci0JCUFJRkZyZWUoYSk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlyZXR1cm4gYTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYW4gaW50ZWdlciB0byBBSUYuCi0gKi8KLUFJRiAqCi1JbnRUb0FJRihpbnQgaSkKLXsKLQlBSUYgKglhOwotCi0JYSA9IE5ld0FJRigwLCBzaXplb2YoaW50KSk7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMSwgc2l6ZW9mKGludCkpKTsKLQotCWlmICggX2xvbmdlc3RfdG9fYWlmKCZBSUZfREFUQShhKSwgc2l6ZW9mKGludCksIChBSUZMT05HRVNUKWkpIDwgMCApCi0JewotCQlBSUZGcmVlKGEpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JcmV0dXJuIGE7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIHVuc2lnbmVkIGludGVnZXIgdG8gQUlGLgotICovCi1BSUYgKgotVW5zaWduZWRJbnRUb0FJRih1bnNpZ25lZCBpbnQgaSkKLXsKLQlBSUYgKglhOwotCi0JYSA9IE5ld0FJRigwLCBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpKTsKLQotCWlmICggX2xvbmdlc3RfdG9fYWlmKCZBSUZfREFUQShhKSwgc2l6ZW9mKHVuc2lnbmVkIGludCksIChBSUZMT05HRVNUKWkpIDwgMCApCi0JewotCQlBSUZGcmVlKGEpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JcmV0dXJuIGE7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgbG9uZyBpbnRlZ2VyIHRvIEFJRi4KLSAqLwotQUlGICoKLUxvbmdUb0FJRihsb25nIGkpCi17Ci0JQUlGICoJYTsKLQotCWEgPSBOZXdBSUYoMCwgc2l6ZW9mKGxvbmcpKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX0lOVEVHRVJfVFlQRSgxLCBzaXplb2YobG9uZykpKTsKLQotCWlmICggX2xvbmdlc3RfdG9fYWlmKCZBSUZfREFUQShhKSwgc2l6ZW9mKGxvbmcpLCAoQUlGTE9OR0VTVClpKSA8IDAgKQotCXsKLQkJQUlGRnJlZShhKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCXJldHVybiBhOwotfQotCi0vKgotICogQ29udmVydCBhbiB1bnNpZ25lZCBsb25nIHRvIEFJRi4KLSAqLwotQUlGICoKLVVuc2lnbmVkTG9uZ1RvQUlGKHVuc2lnbmVkIGxvbmcgaSkKLXsKLQlBSUYgKglhOwotCi0JYSA9IE5ld0FJRigwLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCi0JQUlGX0ZPUk1BVChhKSA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSkpOwotCi0JaWYgKCBfbG9uZ2VzdF90b19haWYoJkFJRl9EQVRBKGEpLCBzaXplb2YodW5zaWduZWQgbG9uZyksIChBSUZMT05HRVNUKWkpIDwgMCApCi0JewotCQlBSUZGcmVlKGEpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JcmV0dXJuIGE7Ci19Ci0KLSNpZmRlZiBDQ19IQVNfTE9OR19MT05HCi0vKgotICogQ29udmVydCBhIGxvbmcgbG9uZyBpbnRlZ2VyIHRvIEFJRi4KLSAqLwotQUlGICoKLUxvbmdMb25nVG9BSUYobG9uZyBsb25nIGkpCi17Ci0JQUlGICoJYTsKLQotCWEgPSBOZXdBSUYoMCwgc2l6ZW9mKGxvbmcgbG9uZykpOwotCi0JQUlGX0ZPUk1BVChhKSA9IHN0cmR1cChBSUZfSU5URUdFUl9UWVBFKDEsIHNpemVvZihsb25nIGxvbmcpKSk7Ci0KLQlpZiAoIF9sb25nZXN0X3RvX2FpZigmQUlGX0RBVEEoYSksIHNpemVvZihsb25nIGxvbmcpLCAoQUlGTE9OR0VTVClpKSA8IDAgKQotCXsKLQkJQUlGRnJlZShhKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCXJldHVybiBhOwotfQotCi0vKgotICogQ29udmVydCBhbiB1bnNpZ25lZCBsb25nIGxvbmcgdG8gQUlGLgotICovCi1BSUYgKgotVW5zaWduZWRMb25nTG9uZ1RvQUlGKHVuc2lnbmVkIGxvbmcgbG9uZyBpKQotewotCUFJRiAqCWE7Ci0KLQlhID0gTmV3QUlGKDAsIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX0lOVEVHRVJfVFlQRSgwLCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkpOwotCi0JaWYgKCBfbG9uZ2VzdF90b19haWYoJkFJRl9EQVRBKGEpLCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwgKEFJRkxPTkdFU1QpaSkgPCAwICkKLQl7Ci0JCUFJRkZyZWUoYSk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlyZXR1cm4gYTsKLX0KLSNlbmRpZiAvKiBDQ19IQVNfTE9OR19MT05HICovCi0KLS8qCi0gKiBDb252ZXJ0IGFuIGludGVnZXIgb2YgYW55IGxlbmd0aCB0byBBSUYuCi0gKi8KLUFJRiAqCi1Mb25nZXN0VG9BSUYoQUlGTE9OR0VTVCBpKQotewotCUFJRiAqCWE7Ci0KLQlhID0gTmV3QUlGKDAsIHNpemVvZihBSUZMT05HRVNUKSk7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMSwgc2l6ZW9mKEFJRkxPTkdFU1QpKSk7Ci0KLQlpZiAoIF9sb25nZXN0X3RvX2FpZigmQUlGX0RBVEEoYSksIHNpemVvZihBSUZMT05HRVNUKSwgaSkgPCAwICkKLQl7Ci0JCUFJRkZyZWUoYSk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlyZXR1cm4gYTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBvZiBhbnkgbGVuZ3RoIHRvIEFJRiBkYXRhIGZvcm1hdC4KLSAqIFJlc3VsdCBpbiByZC4KLSAqLwotaW50Ci1fZG91Ymxlc3RfdG9fYWlmKGNoYXIgKipyZCwgaW50IGxlbiwgQUlGRE9VQkxFU1QgdmFsKQotewotCXVuaW9uIGllZWUJdjsKLQotCWlmICggcmQgPT0gTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCWlmKCAqcmQgPT0gTlVMTCApCi0JCSpyZCA9IChjaGFyICopX2FpZl9hbGxvYyhsZW4pOwotCi0JaWYgKCBsZW4gPD0gc2l6ZW9mKGZsb2F0KSApCi0JCXYuZiA9IChmbG9hdCl2YWw7Ci0JZWxzZSBpZiAoIGxlbiA9PSBzaXplb2YoZG91YmxlKSApCi0JCXYuZCA9IChkb3VibGUpdmFsOwotCWVsc2UKLQkJdi5kZCA9IHZhbDsKLQotCUFJRk5vcm1hbGlzZSgqcmQsIGxlbiwgdi5ieXRlcywgbGVuKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ29udmVydCBhIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gQUlGLgotICovCi1BSUYgKgotRmxvYXRUb0FJRihmbG9hdCBmKQotewotCUFJRiAqCWE7Ci0KLQlhID0gTmV3QUlGKDAsIHNpemVvZihmbG9hdCkpOwotCi0JQUlGX0ZPUk1BVChhKSA9IHN0cmR1cChBSUZfRkxPQVRJTkdfVFlQRShzaXplb2YoZmxvYXQpKSk7Ci0KLQlpZiAoIF9kb3VibGVzdF90b19haWYoJkFJRl9EQVRBKGEpLCBzaXplb2YoZmxvYXQpLCAoQUlGRE9VQkxFU1QpZikgPCAwICkKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCi0JcmV0dXJuIGE7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBBSUYuCi0gKi8KLUFJRiAqCi1Eb3VibGVUb0FJRihkb3VibGUgZikKLXsKLQlBSUYgKglhOwotCi0JYSA9IE5ld0FJRigwLCBzaXplb2YoZG91YmxlKSk7Ci0KLQlBSUZfRk9STUFUKGEpID0gc3RyZHVwKEFJRl9GTE9BVElOR19UWVBFKHNpemVvZihkb3VibGUpKSk7Ci0KLQlpZiAoIF9kb3VibGVzdF90b19haWYoJkFJRl9EQVRBKGEpLCBzaXplb2YoZG91YmxlKSwgKEFJRkRPVUJMRVNUKWYpIDwgMCApCi0JCXJldHVybiAoQUlGICopTlVMTDsKLQotCXJldHVybiBhOwotfQotCi0vKgotICogQ29udmVydCBhbiBhcnJheSB0byBBSUYuCi0gKgotICogQUlGICpBcnJheVRvQUlGKGludCByYW5rLCBpbnQgKm1pbiwgaW50ICptYXgsIGNoYXIgKmRhdGEsIGludCBsZW4sIGNoYXIgKmJ0eXBlKQotICoKLSAqIC0gcmFuayBpcyB0aGUgcmFuayBvZiB0aGUgYXJyYXkKLSAqIC0gbWluIGlzIHRoZSBpbmRleCBsb3dlciBib3VuZCwgb3IgYW4gYXJyYXkgb2YgbG93ZXIgYm91bmRzIGlmIHJhbmsgPiAxCi0gKiAtIG1heCBpcyB0aGUgaW5kZXggdXBwZXIgYm91bmQsIG9yIGFuIGFycmF5IG9mIHVwcGVyIGJvdW5kcyBpZiByYW5rID4gMQotICogLSBkYXRhIGlzIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgZGF0YSwgb3IgTlVMTCwgYW5kIG11c3QgYmUgbm9ybWFsaXNlZAotICogLSBsZW4gaXMgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbnRpcmUgYXJyYXkKLSAqIC0gYnR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzCi0gKi8KLUFJRiAqCi1BcnJheVRvQUlGKGludCByYW5rLCBpbnQgKm1pbiwgaW50ICptYXgsIGNoYXIgKmRhdGEsIGludCBsZW4sIGNoYXIgKmJ0eXBlKQotewotCWludAlpOwotCWludAlic2l6ZTsKLQlBSUYgKglhOwotCWNoYXIgKglpdHlwZTsgLyogaW5kZXggdHlwZSAqLwotCWNoYXIgKglydHlwZTsgLyogcmFuZ2UgdHlwZSAqLwotCWNoYXIgKglmZHM9TlVMTDsKLQotCWJzaXplID0gRkRTVHlwZVNpemUoYnR5cGUpOwotCi0JYSA9IE5ld0FJRigwLCBsZW4pOwotCi0JYnR5cGUgPSBzdHJkdXAoYnR5cGUpOwotCWl0eXBlID0gc3RyZHVwKEFJRl9JTlRFR0VSX1RZUEUoMCwgc2l6ZW9mKGludCkpKTsKLQotCWZvciAoIGkgPSByYW5rIC0gMSAgOyBpID49IDAgOyBpLS0gKQotCXsKLQkJcnR5cGUgPSBzdHJkdXAoQUlGX1JBTkdFX1RZUEUobWluW2ldLCBtYXhbaV0sIGl0eXBlKSk7Ci0JCWZkcyA9IHN0cmR1cChBSUZfQVJSQVlfVFlQRShydHlwZSwgYnR5cGUpKTsKLQotCQlfYWlmX2ZyZWUocnR5cGUpOwotCQlfYWlmX2ZyZWUoYnR5cGUpOwotCi0JCWJ0eXBlID0gZmRzOwotCX0KLQotCWFzc2VydChmZHMhPU5VTEwpOwotCUFJRl9GT1JNQVQoYSkgPSBmZHM7Ci0KLQlpZiAoIGxlbiA+IDAgJiYgZGF0YSAhPSBOVUxMICkKLQkJbWVtY3B5KEFJRl9EQVRBKGEpLCBkYXRhLCBsZW4pOwotCi0JX2FpZl9mcmVlKGl0eXBlKTsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCXJldHVybiBhOwotfQotCi0vKgotICogQ3JlYXRlIGFuIGVtcHR5IGFycmF5IGNvbnRhaW5pbmcgZWxlbWVuc3QgbWluLi5tYXggYW5kCi0gKiB3aXRoIGEgYmFzZSB0eXBlIGdpdmVuIGJ5IGJ0eXBlCi0gKi8KLUFJRiAqCi1FbXB0eUFycmF5VG9BSUYoaW50IG1pbiwgaW50IG1heCwgQUlGICpidHlwZSkKLXsKLQlBSUYgKglhOwotCWludCBsZW4gPSAwOwotCi0JaWYgKEFJRl9GT1JNQVQoYnR5cGUpWzBdICE9IEZEU19DSEFSX1BPSU5URVIpIHsKLQkJbGVuID0gKG1heCAtIG1pbiArIDEpICogQUlGVHlwZVNpemUoYnR5cGUpOwotCX0KLQotCWEgPSBOZXdBSUYoMCwgbGVuKTsKLQkKLQlBSUZfRk9STUFUKGEpID0gRkRTQXJyYXlJbml0KG1pbiwgbWF4LCBBSUZfRk9STUFUKGJ0eXBlKSk7Ci0JCi0JUmVzZXRBSUZFcnJvcigpOwotCQotCXJldHVybiBhOwotfQotLyoKLSAqIEFkZCB0aGUgZWxlbWVudCBlbCB0byB0aGUgYXJyYXkgYXQgdGhlIGluZGV4IGdpdmVuIGJ5IGlkeC4KLSAqIFRoaXMgaXMgdXNlZCBmb3IgYXJyYXkgY29uc3RydWN0aW9uLgotICovCi12b2lkCi1BSUZBZGRBcnJheUVsZW1lbnQoQUlGICphLCBpbnQgaWR4LCBBSUYgKmVsKQotewotCWludAltaW47Ci0JaW50CW1heDsKLQlpbnQgbGVuID0gQUlGVHlwZVNpemUoZWwpOwotCi0JLy9pZiAobGVuID09IDAgfHwgQUlGVHlwZVNpemUoYSkgPT0gMCkKLQkJLy9yZXR1cm47Ci0KLQlpZiAoQUlGX0ZPUk1BVChlbClbMF0gPT0gRkRTX0NIQVJfUE9JTlRFUikgewotCQlBSUZBZGRDb21wbGV4QXJyYXlFbGVtZW50KGEsIGVsKTsKLQl9Ci0JZWxzZSB7Ci0JCW1pbiA9IEZEU0FycmF5TWluSW5kZXgoQUlGX0ZPUk1BVChhKSwgMCk7Ci0JCW1heCA9IEZEU0FycmF5TWF4SW5kZXgoQUlGX0ZPUk1BVChhKSwgMCk7Ci0JCQotCQlpZiAoaWR4IDwgbWluIHx8IGlkeCA+IG1heCkKLQkJCXJldHVybjsKLQkJCQkJCi0JCW1lbWNweShBSUZfREFUQShhKSArIGxlbiAqIChpZHggLSBtaW4pLCBBSUZfREFUQShlbCksIGxlbik7Ci0JfQotfQotCi1BSUYgKgotRW1wdHlDb21wbGV4QXJyYXlUb0FJRihpbnQgbWluLCBpbnQgbWF4LCBBSUYgKmJ0eXBlKQotewotCUFJRiAqCWE7Ci0JCi0JYSA9IE5ld0FJRigwLCAwKTsKLQkKLQlBSUZfRk9STUFUKGEpID0gRkRTQXJyYXlJbml0KG1pbiwgbWF4LCBBSUZfRk9STUFUKGJ0eXBlKSk7Ci0JCi0JUmVzZXRBSUZFcnJvcigpOwotCQotCXJldHVybiBhOwotfQotdm9pZAotQUlGQWRkQ29tcGxleEFycmF5RWxlbWVudChBSUYgKmEsIEFJRiAqZWwpCi17Ci0JY2hhciAqbmV3RGF0YTsKLQlpbnQgbGVuID0gQUlGVHlwZVNpemUoZWwpOwotCWludCBjYXAgPSBBSUZUeXBlU2l6ZShhKTsKLQotCUFJRl9MRU4oYSkgKz0gbGVuOwotCW5ld0RhdGEgPSBfYWlmX2FsbG9jKEFJRl9MRU4oYSkpOwotCi0JbWVtY3B5KG5ld0RhdGEsIEFJRl9EQVRBKGEpLCBjYXApOwotCW1lbWNweShuZXdEYXRhK2NhcCwgQUlGX0RBVEEoZWwpLCBsZW4pOwotCi0JaWYgKEFJRl9EQVRBKGEpKQotCQlfYWlmX2ZyZWUoQUlGX0RBVEEoYSkpOwotCi0JQUlGX0RBVEEoYSkgPSBfYWlmX2FsbG9jKEFJRl9MRU4oYSkpOwotCi0JbWVtY3B5KEFJRl9EQVRBKGEpLCBuZXdEYXRhLCBBSUZfTEVOKGEpKTsKLQotCV9haWZfZnJlZShuZXdEYXRhKTsKLX0KLQotLyoKLSAqIENyZWF0ZSBhbiBlbXB0eSBBSUYgZW51bWVyYXRlZCB0eXBlLgotICovCi1BSUYgKgotRW1wdHlFbnVtVG9BSUYoY2hhciAqaWQpIAotewotICAgICAgICBBSUYgKiAgIGE7Ci0KLSAgICAgICAgYSA9IE5ld0FJRigwLCBzaXplb2YoaW50KSk7Ci0KLSAgICAgICAgQUlGX0ZPUk1BVChhKSA9IEZEU0VudW1Jbml0KGlkKTsKLQotICAgICAgICBSZXNldEFJRkVycm9yKCk7Ci0KLSAgICAgICAgcmV0dXJuKGEpOwotfQotCi0vKgotICogQWRkIGEgY29uc3RhbnQgdG8gZW51bWVyYXRlZCB0eXBlLgotICovCi1pbnQKLUFJRkFkZENvbnN0VG9FbnVtKEFJRiAqYSwgY2hhciAqaWQsIEFJRiAqY29udGVudCkKLXsKLQljaGFyICpuZm10OwotCWludCB2YWw7Ci0KLQlpZiAoIEFJRlRvSW50KGNvbnRlbnQsICZ2YWwpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCW5mbXQgPSBGRFNBZGRDb25zdFRvRW51bShBSUZfRk9STUFUKGEpLCBpZCwgdmFsKTsKLQotCWlmICggbmZtdCA9PSBOVUxMICkKLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCXsKLQkJX2FpZl9mcmVlKEFJRl9GT1JNQVQoYSkpOwotCQlBSUZfRk9STUFUKGEpID0gbmZtdDsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotICogU2V0IEFJRiBlbnVtIHR5cGUgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlLgotICovCi1pbnQKLUFJRlNldEVudW0oQUlGICphLCBjaGFyICppZCkKLXsKLQlpbnQgdjsKLQotCWlmICggRkRTRW51bUNvbnN0QnlOYW1lKEFJRl9GT1JNQVQoYSksIGlkLCAmdikgPCAwICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9GSUVMRCwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIF9sb25nZXN0X3RvX2FpZigmQUlGX0RBVEEoYSksIHNpemVvZihpbnQpLCAoQUlGTE9OR0VTVCl2KSA8IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCBjdXJyZW50IHZhbHVlIG9mIGVudW0uCi0gKi8KLUFJRiAqCi1BSUZHZXRFbnVtKEFJRiAqYSkKLXsKLQlBSUYgICogbmV3OwotCWNoYXIgKiBidHlwZTsKLQlpbnQgICAgbGVuOwotCi0KLQlpZiAoIChidHlwZSA9IEZEU0Jhc2VUeXBlKEFJRl9GT1JNQVQoYSkpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIChsZW4gPSBGRFNUeXBlU2l6ZShBSUZfRk9STUFUKGEpKSkgPCAwICkKLQkJcmV0dXJuIE5VTEw7Ci0KLQluZXcgPSBOZXdBSUYoMCwgbGVuKTsKLQotCUFJRl9GT1JNQVQobmV3KSA9IHN0cmR1cChidHlwZSk7Ci0JQUlGX0xFTihuZXcpID0gbGVuOwotCW1lbWNweShBSUZfREFUQShuZXcpLCBBSUZfREFUQShhKSwgbGVuKTsKLQotCXJldHVybiBuZXc7Ci0KLX0KLQotLyoKLSAqIENyZWF0ZSBhbiBlbXB0eSBBSUYgdW5pb24gdHlwZS4KLSAqLwotQUlGICoKLUVtcHR5VW5pb25Ub0FJRihjaGFyICppZCkgCi17Ci0gICAgICAgIEFJRiAqICAgYTsKLQotICAgICAgICBhID0gTmV3QUlGKDAsIDApOwotCi0gICAgICAgIEFJRl9GT1JNQVQoYSkgPSBGRFNVbmlvbkluaXQoaWQpOwotCi0gICAgICAgIFJlc2V0QUlGRXJyb3IoKTsKLQotICAgICAgICByZXR1cm4oYSk7Ci19Ci0KLS8qCi0gKiBBZGQgYSBmaWxlZCB0byBhbiBBSUYgdW5pb24uCi0gKi8KLWludAotQUlGQWRkRmllbGRUb1VuaW9uKEFJRiAqYSwgY2hhciAqZmllbGQsIGNoYXIgKmZtdCkKLXsKLQljaGFyICpuZm10OwotCi0JbmZtdCA9IEZEU0FkZEZpZWxkVG9VbmlvbihBSUZfRk9STUFUKGEpLCBmaWVsZCwgZm10KTsKLQotCWlmICggbmZtdCA9PSBOVUxMICkKLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCXsKLQkJX2FpZl9mcmVlKEFJRl9GT1JNQVQoYSkpOwotCQlBSUZfRk9STUFUKGEpID0gbmZtdDsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotICogU2V0IHRoZSB2YWx1ZSBvZiBhIHVuaW9uLgotICovCi1pbnQKLUFJRlNldFVuaW9uKEFJRiAqYSwgY2hhciAqZmllbGQsIEFJRiAqZGF0YSkKLXsKLQljaGFyICp0eXBlOwotCWludCAgIGxlbjsKLQotCWlmICggRkRTVW5pb25GaWVsZEJ5TmFtZShBSUZfRk9STUFUKGEpLCBmaWVsZCwgJnR5cGUpIDwgMCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfRklFTEQsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBzdHJjbXAodHlwZSwgQUlGX0ZPUk1BVChkYXRhKSkgIT0gMCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWxlbiA9IEZEU1R5cGVTaXplKEFJRl9GT1JNQVQoYSkpOwotCUFJRl9MRU4oYSkgPSBsZW47Ci0KLQlpZiAoIEFJRl9EQVRBKGEpICE9IE5VTEwgKQotCQlfYWlmX2ZyZWUoQUlGX0RBVEEoYSkpOwotCi0JQUlGX0RBVEEoYSkgPSBfYWlmX2FsbG9jKGxlbik7Ci0JbWVtY3B5KEFJRl9EQVRBKGEpLCBBSUZfREFUQShkYXRhKSwgbGVuKTsKLQotICAgICAgICByZXR1cm4gMDsKLQotfQotCi0vKgotICogR2V0IHRoZSB2YWx1ZSBvZiBhIHVuaW9uLgotICovCi1BSUYgKgotQUlGR2V0VW5pb24oQUlGICphLCBjaGFyICpmaWVsZCkKLXsKLQlBSUYgICogbmV3OwotCWNoYXIgKiB0eXBlOwotCWludCAgICBsZW47Ci0KLQlpZiAoIEZEU1VuaW9uRmllbGRCeU5hbWUoQUlGX0ZPUk1BVChhKSwgZmllbGQsICZ0eXBlKSA8IDAgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0ZJRUxELCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKCAobGVuID0gRkRTVHlwZVNpemUodHlwZSkpIDwgMCApCi0JCXJldHVybiBOVUxMOwotCi0JbmV3ID0gTmV3QUlGKDAsIGxlbik7Ci0KLQlBSUZfRk9STUFUKG5ldykgPSB0eXBlOwotCUFJRl9MRU4obmV3KSA9IGxlbjsKLQltZW1jcHkoQUlGX0RBVEEobmV3KSwgQUlGX0RBVEEoYSksIGxlbik7Ci0KLQlyZXR1cm4gbmV3OwotCi19Ci0KLS8qCi0gKiBDcmVhdGUgYW4gZW1wdHkgQUlGIHN0cnVjdHVyZS4KLSAqLwotQUlGICoKLUVtcHR5U3RydWN0VG9BSUYoY2hhciAqaWQpCi17Ci0JQUlGICoJYTsKLQotCWEgPSBOZXdBSUYoMCwgMCk7Ci0KLQlBSUZfRk9STUFUKGEpID0gRkRTU3RydWN0SW5pdChpZCk7Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlyZXR1cm4gYTsKLX0KLQotLyogCi0gKiBBZGQgYSBmaWVsZCB0byB0aGUgcHVibGljIHNlY3Rpb24gb2YgYSBzdHJ1Y3R1cmUKLSAqLwotaW50Ci1BSUZBZGRGaWVsZFRvU3RydWN0KEFJRiAqYSwgY2hhciogZmllbGQsIEFJRiAqY29udGVudCkKLXsKLQlpbnQJcHViTGVuZ3RoOwotCWludAlvbGRMZW5ndGg7Ci0JaW50CW5ld0xlbmd0aDsKLQljaGFyICoJbmV3Rm9ybWF0OwotCWNoYXIgKgluZXdEYXRhOwotCWNoYXIgKglkdW1teVN0cmluZzsKLQotCWlmICggIUZEU1N0cnVjdEZpZWxkQnlOYW1lKEFJRl9GT1JNQVQoYSksIGZpZWxkLCAmZHVtbXlTdHJpbmcpICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlfYWlmX2ZyZWUoZHVtbXlTdHJpbmcpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogV2UgdXNlIEZEU0RhdGFTaXplKCkgaW5zdGVhZCBvZjoKLQkJcHViTGVuZ3RoID0gX2RhdGFfbGVuX3B1YmxpYyhBSUZfRk9STUFUKGEpKTsKLQl0byBjYWxjdWxhdGUgdGhlIGRhdGEgbGVuZ3RoLCBfZGF0YV9sZW5fcHVibGljIGNhbm5vdCBoYW5kbGUgdGhlIGNhc2UKLQl3aGVyZSBhIHN0cmluZyBpcyBvbmUgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIHN0cnVjdCAoc2luY2UgdGhlIGxlbmd0aAotCW9mIHRoZSBzdHJpbmcgaXMgZW5jb2RlZCBpbiB0aGUgZGF0YSBzZWN0aW9uKS4KLQlDdXJyZW50bHkgRkRTRGF0YVNpemUoKSBjYW4gb25seSBoYW5kbGUgcHVibGljIG1lbWJlcnMgb2Ygc3RydWN0cywgc28KLQlpdCBpcyBzYWZlIHRvIHJlcGxhY2UgX2RhdGFfbGVuX3B1YmxpYygpIHdpdGggRkRTRGF0YVNpemUoKS4KLQkqLwotCXB1Ykxlbmd0aCA9IEZEU0RhdGFTaXplKEFJRl9GT1JNQVQoYSksIEFJRl9EQVRBKGEpKTsKLQlvbGRMZW5ndGggPSBBSUZfTEVOKGEpOwotCW5ld0xlbmd0aCA9IG9sZExlbmd0aCArIEFJRl9MRU4oY29udGVudCk7Ci0KLQluZXdEYXRhID0gX2FpZl9hbGxvYyhuZXdMZW5ndGgpOwotCi0JbWVtY3B5KG5ld0RhdGEsIEFJRl9EQVRBKGEpLCBwdWJMZW5ndGgpOwotCW1lbWNweShuZXdEYXRhK3B1Ykxlbmd0aCwgQUlGX0RBVEEoY29udGVudCksIEFJRl9MRU4oY29udGVudCkpOwotCW1lbWNweShuZXdEYXRhK3B1Ykxlbmd0aCtBSUZfTEVOKGNvbnRlbnQpLCBBSUZfREFUQShhKStwdWJMZW5ndGgsIG9sZExlbmd0aC1wdWJMZW5ndGgpOwotCi0JaWYgKCBBSUZfREFUQShhKSApCi0JCV9haWZfZnJlZShBSUZfREFUQShhKSk7Ci0KLQlBSUZfREFUQShhKSA9IF9haWZfYWxsb2MobmV3TGVuZ3RoKTsKLQlBSUZfTEVOKGEpID0gbmV3TGVuZ3RoOwotCi0JbWVtY3B5KEFJRl9EQVRBKGEpLCBuZXdEYXRhLCBuZXdMZW5ndGgpOwotCi0JbmV3Rm9ybWF0ID0gRkRTQWRkRmllbGRUb1N0cnVjdChBSUZfRk9STUFUKGEpLCBmaWVsZCwgQUlGX0ZPUk1BVChjb250ZW50KSk7Ci0KLQlfYWlmX2ZyZWUoQUlGX0ZPUk1BVChhKSk7Ci0JQUlGX0ZPUk1BVChhKSA9IG5ld0Zvcm1hdDsKLQotCV9haWZfZnJlZShuZXdEYXRhKTsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCXJldHVybiAwOwotfQotCi0vKiAKLSAqIFNldCB0aGUgdmFsdWUgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdHVyZQotICovCi1pbnQKLUFJRlNldFN0cnVjdChBSUYgKmEsIGNoYXIqIGZpZWxkLCBBSUYgKmNvbnRlbnQpCi17Ci0JaW50CXByZUxlbmd0aDsKLQljaGFyICoJZHVtbXlTdHJpbmc7Ci0JaW50CWluZGV4OwotCi0JaWYgKCBGRFNTdHJ1Y3RGaWVsZEJ5TmFtZShBSUZfRk9STUFUKGEpLCBmaWVsZCwgJmR1bW15U3RyaW5nKSApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWluZGV4ID0gRkRTU3RydWN0RmllbGRJbmRleChBSUZfRk9STUFUKGEpLCBmaWVsZCk7Ci0JcHJlTGVuZ3RoID0gX2RhdGFfbGVuX2luZGV4KEFJRl9GT1JNQVQoYSksIGluZGV4KTsKLQlwcmVMZW5ndGggLT0gRkRTVHlwZVNpemUoZHVtbXlTdHJpbmcpOwotCV9haWZfZnJlZShkdW1teVN0cmluZyk7Ci0KLQltZW1jcHkoQUlGX0RBVEEoYSkrcHJlTGVuZ3RoLCBBSUZfREFUQShjb250ZW50KSwgQUlGX0xFTihjb250ZW50KSk7Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIHZhbHVlIG9mIGEgZmllbGQgaW4gYSBzdHJ1Y3R1cmUKLSAqLwotQUlGICoKLUFJRkdldFN0cnVjdChBSUYgKmEsIGNoYXIgKmZpZWxkKQotewotCUFJRiAgKiBuZXc7Ci0JY2hhciAqIHR5cGU7Ci0JaW50ICAgIGxlbjsKLQlpbnQgICAgcHJlOwotCWludCAgICBpbmRleDsKLQotCWlmICggRkRTU3RydWN0RmllbGRCeU5hbWUoQUlGX0ZPUk1BVChhKSwgZmllbGQsICZ0eXBlKSA8IDAgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0ZJRUxELCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKCAobGVuID0gRkRTVHlwZVNpemUodHlwZSkpIDwgMCApCi0JewotCQlfYWlmX2ZyZWUodHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCW5ldyA9IE5ld0FJRigwLCBsZW4pOwotCi0JaW5kZXggPSBGRFNTdHJ1Y3RGaWVsZEluZGV4KEFJRl9GT1JNQVQoYSksIGZpZWxkKTsKLQlwcmUgPSBfZGF0YV9sZW5faW5kZXgoQUlGX0ZPUk1BVChhKSwgaW5kZXgpOwotCXByZSAtPSBsZW47Ci0KLQlBSUZfRk9STUFUKG5ldykgPSB0eXBlOwotCUFJRl9MRU4obmV3KSA9IGxlbjsKLQltZW1jcHkoQUlGX0RBVEEobmV3KSwgQUlGX0RBVEEoYSkrcHJlLCBsZW4pOwotCi0JcmV0dXJuIG5ldzsKLX0KLQotLyoKLSAqIENvbnZlcnQgYW4gQUlGIHZhbHVlIHRvIGEgbmF0aXZlIGNoYXJhY3Rlci4KLSAqLwotaW50Ci1fYWlmX3RvX2NoYXIoY2hhciAqZGF0YSwgY2hhciAqdmFsKQotewotCWludAkJczsKLQotCWlmICggZGF0YSA9PSBOVUxMIHx8IHZhbCA9PSAoY2hhciAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlSZXNldEFJRkVycm9yKCk7Ci0KLQlmb3IgKCBzID0gMCA7IHMgPCBzaXplb2YoY2hhcikgOyBzKysgKQotCQl2YWxbc10gPSAgZGF0YVtzXTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ29udmVydCBhbiBBSUYgaW50ZWdlciB0byB0aGUgbG9uZ2VzdCBpbnRlZ2VyIGF2YWlsYWJsZS4KLSAqLwotaW50Ci1fYWlmX3RvX2xvbmdlc3QoY2hhciAqZGF0YSwgaW50IGxlbiwgQUlGTE9OR0VTVCAqdmFsKQotewotCWludAkJCXM7Ci0JQUlGTE9OR0VTVAkJaSA9IDA7Ci0KLQlpZiAoIGRhdGEgPT0gTlVMTCB8fCB2YWwgPT0gKEFJRkxPTkdFU1QgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBsZW4gPiBzaXplb2YoQUlGTE9OR0VTVCkgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JZm9yICggcyA9IDAgOyBzIDwgbGVuIDsgcysrICkKLQkJaSA9IGkgKiAweDEwMCArIChkYXRhW3NdICYgMHhmZik7Ci0KLQkqdmFsID0gaTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ29udmVydCBBSUYgaW50ZWdlciB0byBuYXRpdmUgaW50ZWdlci4gSWYgbmF0aXZlIGludGVnZXIKLSAqIHNpemUgaXMgdG9vIHNtYWxsLCByZXR1cm4gbG93IG9yZGVyIGJ5dGVzLgotICovCi1pbnQKLUFJRlRvSW50KEFJRiAqYSwgaW50ICp2YWwpCi17Ci0JQUlGTE9OR0VTVAlsOwotCi0JaWYgKCBBSUZUb0xvbmdlc3QoYSwgJmwpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCSp2YWwgPSBsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IEFJRiB2YWx1ZSB0byBsb25nZXN0IGludGVnZXIgYXZhaWxhYmxlLiBJbXBsaWNpdGx5IGNvbnZlcnRzCi0gKiBhbiBmbG9hdGluZyB2YWx1ZSB0byBhbiBpbnRlZ2VyLgotICovCi1pbnQKLUFJRlRvTG9uZ2VzdChBSUYgKmEsIEFJRkxPTkdFU1QgKnZhbCkKLXsKLQlpbnQJCXJlcyA9IDA7Ci0JQUlGRE9VQkxFU1QJZDsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCB8fCB2YWwgPT0gKEFJRkxPTkdFU1QgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3dpdGNoICggRkRTVHlwZShBSUZfRk9STUFUKGEpKSApCi0JewotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCXJlcyA9IF9haWZfdG9fbG9uZ2VzdChBSUZfREFUQShhKSwgQUlGX0xFTihhKSwgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9GTE9BVElORzoKLQkJaWYgKCBfYWlmX3RvX2RvdWJsZXN0KEFJRl9EQVRBKGEpLCBBSUZfTEVOKGEpLCAmZCkgPCAwICkKLQkJCXJldHVybiAtMTsKLQotCQkqdmFsID0gKEFJRkxPTkdFU1QpZDsKLQkJcmVzID0gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogQ29udmVydCBhbiBBSUYgZmxvYXRpbmcgZGF0YSB0eXBlIHRvIHRoZSBsYXJnZXN0IG5hdGl2ZQotICogZmxvYXRpbmcgcG9pbmcgcmVwcmVzZW50YXRpb24gYXZhaWxhYmxlLgotICovCi1pbnQKLV9haWZfdG9fZG91Ymxlc3QoY2hhciAqZGF0YSwgaW50IGxlbiwgQUlGRE9VQkxFU1QgKnZhbCkKLXsKLQl1bmlvbiBpZWVlCWY7Ci0KLQlpZiAoIGRhdGEgPT0gTlVMTCB8fCB2YWwgPT0gKEFJRkRPVUJMRVNUICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotICAgICAgICBBSUZOb3JtYWxpc2UoZi5ieXRlcywgbGVuLCBkYXRhLCBsZW4pOwotCi0JaWYgKCBsZW4gPT0gc2l6ZW9mKGZsb2F0KSApCi0JCSp2YWwgPSAoQUlGRE9VQkxFU1QpZi5mOwotCWVsc2UgaWYgKCBsZW4gPT0gc2l6ZW9mKGRvdWJsZSkgKQotCQkqdmFsID0gKEFJRkRPVUJMRVNUKWYuZDsKLQllbHNlIGlmICggbGVuID09IHNpemVvZihBSUZET1VCTEVTVCkgKQotCQkqdmFsID0gZi5kZDsKLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJjb252ZXJzaW9uIHRvIGZsb2F0OiAlZCBkb2VzIG5vdCBtYXRjaCBhbnkgbmF0aXZlIHByZWNpc2lvblxuIiwgbGVuKTsKLQotCQkqdmFsID0gMDsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0NPTlYsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIEFJRiBmbG9hdCB0byBhIG5hdGl2ZSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgotICovCi1pbnQKLUFJRlRvRmxvYXQoQUlGICphLCBmbG9hdCAqdmFsKQotewotCWludAkJcmVzOwotCUFJRkRPVUJMRVNUCWRkOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMIHx8IHZhbCA9PSAoZmxvYXQgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3dpdGNoICggRkRTVHlwZShBSUZfRk9STUFUKGEpKSApCi0JewotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCXJlcyA9IF9haWZfaW50X3RvX2RvdWJsZXN0KEFJRl9EQVRBKGEpLCBBSUZfTEVOKGEpLCAmZGQpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0ZMT0FUSU5HOgotCQlyZXMgPSBfYWlmX3RvX2RvdWJsZXN0KEFJRl9EQVRBKGEpLCBBSUZfTEVOKGEpLCAmZGQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggcmVzIDwgMCApCi0JCXJldHVybiAtMTsKLQotCSp2YWwgPSAoZmxvYXQpZGQ7IC8qIHBvc3NpYmxlIGxvc3Mgb2YgcHJlY2lzaW9uICovCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIEFJRiBmbG9hdCB0byBhIG5hdGl2ZSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgotICovCi1pbnQKLUFJRlRvRG91YmxlKEFJRiAqYSwgZG91YmxlICp2YWwpCi17Ci0JQUlGRE9VQkxFU1QJZDsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCB8fCB2YWwgPT0gKGRvdWJsZSAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAgKCBBSUZUb0RvdWJsZXN0KGEsICZkKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQkqdmFsID0gKGRvdWJsZSlkOyAvKiBwb3NzaWJsZSBsb3NzIG9mIHByZWNpc2lvbiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGFuIEFJRiB2YWx1ZSB0byBhIG5hdGl2ZSBmbG9hdGluZyBwb2ludCB2YWx1ZSB1c2luZyB0aGUKLSAqIGxhcmdlc3QgcHJlY2lzaW9uIGF2YWlsYWJsZS4gSW1wbGljaXRseSBjb252ZXJ0cyBhbiBpbnRlZ2VyIHRvCi0gKiBhIGZsb2F0LgotICovCi1pbnQKLUFJRlRvRG91Ymxlc3QoQUlGICphLCBBSUZET1VCTEVTVCAqdmFsKQotewotCWludAlyZXM7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgfHwgdmFsID09IChBSUZET1VCTEVTVCAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzd2l0Y2ggKCBGRFNUeXBlKEFJRl9GT1JNQVQoYSkpICkKLQl7Ci0JY2FzZSBBSUZfSU5URUdFUjoKLQkJcmVzID0gX2FpZl9pbnRfdG9fZG91Ymxlc3QoQUlGX0RBVEEoYSksIEFJRl9MRU4oYSksIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JCXJlcyA9IF9haWZfdG9fZG91Ymxlc3QoQUlGX0RBVEEoYSksIEFJRl9MRU4oYSksIHZhbCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqIENvbnZlcnQgYW4gQUlGIGludGVnZXIgdG8gYW5kIEFJRiBmbG9hdCB1c2luZyBsYXJnZXN0IHByZWNpc2lvbgotICogYXZhaWxhYmxlLgotICovCi1pbnQKLV9haWZfaW50X3RvX2RvdWJsZXN0KGNoYXIgKmRhdGEsIGludCBsZW4sIEFJRkRPVUJMRVNUICp2YWwpCi17Ci0JQUlGTE9OR0VTVAlsOwotCi0JaWYgKCBfYWlmX3RvX2xvbmdlc3QoZGF0YSwgbGVuLCAmbCkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnZhbCA9IChBSUZET1VCTEVTVClsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IEFJRiBpbnRlZ2VyIHRvIEFJRiBmbG9hdC4gUmVzdWx0IGlzIGFsd2F5cyBmOC4KLSAqLwotaW50Ci1fYWlmX2ludF90b19haWZfZmxvYXQoY2hhciAqKmRhdGEsIGNoYXIgKmQsIGludCBsKQotewotCUFJRkRPVUJMRVNUCXZkOwotCi0JX2FpZl9pbnRfdG9fZG91Ymxlc3QoZCwgbCwgJnZkKTsKLQotCWlmICggX2RvdWJsZXN0X3RvX2FpZihkYXRhLCBzaXplb2YoZG91YmxlKSwgdmQpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBzaXplb2YoZG91YmxlKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgQUlGIGZsb2F0IHRvIEFJRiBpbnRlZ2VyLiBSZXN1bHQgaXMgYWx3YXlzIGlzNCAoZm9yIGNvbnZlbmllbmNlKS4KLSAqLwotaW50Ci1fYWlmX2Zsb2F0X3RvX2FpZl9pbnQoY2hhciAqKmYsIGNoYXIgKmQsIGludCBsKQotewotCWludAkJdmk7Ci0JQUlGRE9VQkxFU1QJdmQ7Ci0KLQlfYWlmX3RvX2RvdWJsZXN0KGQsIGwsICZ2ZCk7Ci0KLQl2aSA9IChpbnQpdmQ7Ci0KLQlpZiAoIF9sb25nZXN0X3RvX2FpZihmLCBzaXplb2YoaW50KSwgdmkpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBzaXplb2YoaW50KTsKLX0KLQotLyoKLSAqIENvbnZlcnQgbnVtYmVyIHRvIGFzY2lpLgotICovCi1jaGFyCi1Ub0FzY2lpKGludCBuLCBpbnQgYmFzZSkKLXsKLQlpZiAoIGJhc2UgPCAxMCB8fCBuIDwgMTAgKQotCQlyZXR1cm4gKG4gJiAweGYpICsgJzAnOwotCi0JcmV0dXJuIChuICYgMHhmKSAtIDEwICsgJ2EnOwotfQotCi0vKgotICogQ3JlYXRlIGEgdm9pZCBBSUYgb2JqZWN0LgotICovCi1BSUYgKgotVm9pZFRvQUlGKGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0JQUlGICoJYTsKLQotCWEgPSBOZXdBSUYoMCwgbGVuKTsKLQotCUFJRl9GT1JNQVQoYSkgPSBzdHJkdXAoQUlGX1ZPSURfVFlQRShsZW4pKTsKLQotCWlmICggZGF0YSAhPSBOVUxMICYmIGxlbiA+IDAgKQotCQltZW1jcHkoQUlGX0RBVEEoYSksIGRhdGEsIGxlbik7Ci0KLQlyZXR1cm4gYTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYW4gQUlGIHZvaWQgb2JqZWN0IHRvIGl0cyBuYXRpdmUgcmVwcmVzZW50YXRpb24uCi0gKi8KLWludAotQUlGVG9Wb2lkKEFJRiAqYSwgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlpbnQJc2l6ZTsKLQotCWlmICggZGF0YSA9PSBOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JaWYgKCBsZW4gPiAwICkKLQl7Ci0JCXNpemUgPSBGRFNUeXBlU2l6ZShBSUZfRk9STUFUKGEpKTsKLQkJbWVtY3B5KGRhdGEsIEFJRl9EQVRBKGEpLCBzaXplID4gbGVuID8gc2l6ZSA6IGxlbik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb2VyY2UgYW4gQUlGIG9iamVjdCBpbnRvIHR5cGUgdCBpZiBwb3NzaWJsZS4KLSAqLwotQUlGICoKLUFJRkNvZXJjZShBSUYgKmEsIGNoYXIgKnQpCi17Ci0JaW50CQl0bGVuOwotCWludAkJYWxlbjsKLQlpbnQJCWF0eXBlOwotCUFJRkRPVUJMRVNUCWR2YWw7Ci0JY2hhciAqCQlyZCA9IE5VTEw7Ci0JQUlGICoJCW5hOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JdGxlbiA9IEZEU1R5cGVTaXplKHQpOwotCWFsZW4gPSBBSUZfTEVOKGEpOwotCi0Jc3dpdGNoICggRkRTVHlwZSh0KSApCi0JewotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCXN3aXRjaCAoIEZEU1R5cGUoQUlGX0ZPUk1BVChhKSkgKQotCQl7Ci0JCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCQlpZiAoIHRsZW4gPiBhbGVuICkKLQkJCXsKLQkJCQlyZCA9IChjaGFyICopX2FpZl9hbGxvYyh0bGVuKTsKLQkJCQltZW1jcHkocmQsIEFJRl9EQVRBKGEpLCB0bGVuKTsKLQkJCQlyZXR1cm4gTWFrZUFJRihzdHJkdXAodCksIHJkKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCB0bGVuIDwgYWxlbiApCi0JCQl7Ci0JCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQkJCXJldHVybiAoQUlGICopTlVMTDsKLQkJCX0KLQotCQkJcmV0dXJuIENvcHlBSUYoYSk7Ci0KLQkJY2FzZSBBSUZfRkxPQVRJTkc6Ci0JCQlpZiAoIF9haWZfZmxvYXRfdG9fYWlmX2ludCgmcmQsIEFJRl9EQVRBKGEpLCBhbGVuKSA8IDAgKQotCQkJCXJldHVybiAoQUlGICopTlVMTDsKLQotCQkJcmV0dXJuIE1ha2VBSUYoc3RyZHVwKCJpczQiKSwgcmQpOwotCi0JCWRlZmF1bHQ6Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9GTE9BVElORzoKLQkJc3dpdGNoICggYXR5cGUgPSBBSUZUeXBlKGEpICkKLQkJewotCQljYXNlIEFJRl9JTlRFR0VSOgotCQljYXNlIEFJRl9GTE9BVElORzoKLQkJCWlmICggYXR5cGUgPT0gQUlGX0lOVEVHRVIgKQotCQkJewotCQkJCS8qCi0JCQkJKiogQ29udmVydCBpbnRlZ2VyIHRvIGRvdWJsZS4KLQkJCQkqLwotCQkJCWlmICggX2FpZl9pbnRfdG9fZG91Ymxlc3QoQUlGX0RBVEEoYSksIEFJRl9MRU4oYSksICZkdmFsKSA8IDAgKQotCQkJCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0KLQkJCQlhbGVuID0gc2l6ZW9mKEFJRkRPVUJMRVNUKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvKgotCQkJCSoqIENvbnZlcnQgQUlGIGZsb2F0IHRvIGRvdWJsZQotCQkJCSovCi0JCQkJaWYgKCBfYWlmX3RvX2RvdWJsZXN0KEFJRl9EQVRBKGEpLCBBSUZfTEVOKGEpLCAmZHZhbCkgPCAwICkKLQkJCQkJcmV0dXJuIChBSUYgKilOVUxMOwotCQkJfQotCi0JCQluYSA9IE5ld0FJRigwLCB0bGVuKTsKLQotCQkJQUlGX0ZPUk1BVChuYSkgPSBzdHJkdXAoQUlGX0ZMT0FUSU5HX1RZUEUodGxlbikpOwotCi0JCQkvKgotCQkJKiogTm93IHRha2UgY2FyZSBvZiBmbG9hdGluZyBwcmVjaXNpb24KLQkJCSovCi0KLQkJCWlmICggX2RvdWJsZXN0X3RvX2FpZigmQUlGX0RBVEEobmEpLCB0bGVuLCBkdmFsKSA8IDAgKQotCQkJCXJldHVybiAoQUlGICopTlVMTDsKLQotCQkJcmV0dXJuIG5hOwotCi0JCWRlZmF1bHQ6Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAoQUlGICopTlVMTDsKLQl9Ci0KLQlyZXR1cm4gbmE7Ci19Ci0KLS8qIAotICogYnVpbGQgYW4gQUlGIGZyb20gdHdvIGFzY2lpIHN0cmluZ3MuIAotICovCi1BSUYgKgotQXNjaWlUb0FJRihjaGFyICpmb3JtYXQsIGNoYXIgKmRhdGEpCi17Ci0JaW50CWZsZW4gPSBzdHJsZW4oZm9ybWF0KTsKLQlpbnQJZGxlbiA9IHN0cmxlbihkYXRhKTsKLQlsb25nCWFjYzsKLQlBSUYgKglhOwotCWNoYXIgKgliZGF0YTsKLQljaGFyICoJYmRwOwotCWNoYXIgKglkcDsKLQljaGFyCWJ1ZlsyXTsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCWlmICggZGxlbiAlIDIgIT0gMCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCX0KLQotCWJkYXRhID0gKGNoYXIgKikgX2FpZl9hbGxvYyhkbGVuLzIpOwotCWJkcCA9IGJkYXRhOwotCi0JYnVmWzFdID0gMDsKLQotCWRwID0gZGF0YTsKLQotCS8qCi0JKiogY29udmVydCB0d28gY2hhcnMgb2YgZGF0YSB0byBvbmUgYnl0ZSBvZiBiZGF0YQotCSovCi0Jd2hpbGUgKCAqZHAgKQotCXsKLQkJYnVmWzBdID0gKmRwKys7Ci0JCWFjYyA9IHN0cnRvbChidWYsIDAsIDE2KSA8PCA0OwotCQlidWZbMF0gPSAqZHArKzsKLQkJYWNjICs9IHN0cnRvbChidWYsIDAsIDE2KTsKLQkJKmJkcCsrID0gKGNoYXIpIChhY2MgJiAweGZmKTsKLQl9Ci0KLQlhID0gTmV3QUlGKGZsZW4gKyAxLCBkbGVuLzIpOwotCi0JbWVtY3B5KEFJRl9EQVRBKGEpLCBiZGF0YSwgQUlGX0xFTihhKSk7Ci0JbWVtY3B5KEFJRl9GT1JNQVQoYSksIGZvcm1hdCwgZmxlbik7Ci0KLQlfYWlmX2ZyZWUoYmRhdGEpOwotCi0JcmV0dXJuIGE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgQUlGVG9TdHIoKS1yZWxhdGVkIGZ1bmN0aW9ucyAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLV9zdHJfaW5pdCgpCi17Ci0JaWYgKCBfc3RyX2J1Zl9sZW4gPT0gMCApCi0JewotCQlfc3RyX2J1ZiA9IF9haWZfYWxsb2MoQlVGU0laKTsKLQkJX3N0cl9idWZfbGVuID0gQlVGU0laOwotCX0KLQotCV9zdHJfcG9zID0gX3N0cl9idWY7Ci19Ci0KLXZvaWQKLV9zdHJfY2F0KGNoYXIgKnN0cikKLXsKLQlpbnQJbGVuID0gc3RybGVuKHN0cik7Ci0KLQl3aGlsZSAoIF9zdHJfcG9zICsgbGVuICsgMSA+IF9zdHJfYnVmICsgX3N0cl9idWZfbGVuICkKLQl7Ci0JCWludCBvZmZzZXQgPSBfc3RyX3BvcyAtIF9zdHJfYnVmOwotCQlfc3RyX2J1Zl9sZW4gKz0gQlVGU0laOwotCQlfc3RyX2J1ZiA9IF9haWZfcmVzaXplKF9zdHJfYnVmLCBfc3RyX2J1Zl9sZW4pOwotCQlfc3RyX3BvcyA9IF9zdHJfYnVmICsgb2Zmc2V0OwotCX0KLQotCW1lbWNweShfc3RyX3Bvcywgc3RyLCBsZW4pOwotCV9zdHJfcG9zICs9IGxlbjsKLQkqX3N0cl9wb3MgPSAnXDAnOwotfQotCi12b2lkCi1fc3RyX2FkZChjaGFyIGNoKQotewotCXdoaWxlICggX3N0cl9wb3MgKyAyID4gX3N0cl9idWYgKyBfc3RyX2J1Zl9sZW4gKQotCXsKLQkJaW50IG9mZnNldCA9IF9zdHJfcG9zIC0gX3N0cl9idWY7Ci0JCV9zdHJfYnVmX2xlbiArPSBCVUZTSVo7Ci0JCV9zdHJfYnVmID0gX2FpZl9yZXNpemUoX3N0cl9idWYsIF9zdHJfYnVmX2xlbik7Ci0JCV9zdHJfcG9zID0gX3N0cl9idWYgKyBvZmZzZXQ7Ci0JfQotCi0JKl9zdHJfcG9zKysgPSBjaDsKLQkqX3N0cl9wb3MgPSAnXDAnOwotfQotCi1jaGFyICoKLV9zdHJfZ2V0KHZvaWQpCi17Ci0JcmV0dXJuIHN0cmR1cChfc3RyX2J1Zik7Ci19Ci0KLWludAotX2FpZl9ib29sX3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWludAkJYnl0ZXMgPSBzaXplb2YoaW50KTsKLQlpbnQJCWk7Ci0JY2hhcgkJYnVmW0JVRlNJWl07Ci0JQUlGTE9OR0VTVAlsbGk7Ci0KLQkoKmZkcykrKzsKLQotCWlmICggX2FpZl90b19sb25nZXN0KCpkYXRhLCBieXRlcywgJmxsaSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JaSA9IChpbnQpbGxpOwotCi0JaWYgKCBpID09IC0xICkKLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgInRydWUiKTsKLQllbHNlIGlmICggaSA9PSAwICkKLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgImZhbHNlIik7Ci0JZWxzZQotCQlzbnByaW50ZihidWYsIEJVRlNJWi0xLCAiJWQiLCBpKTsKLQotCV9zdHJfY2F0KGJ1Zik7Ci0JKmRhdGEgKz0gYnl0ZXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1BSUZCb29sVG9TdHIoY2hhciAqKnN0ciwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfYm9vbF90b19zdHIoZGVwdGgsICZmbXQsICZkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQkqc3RyID0gX3N0cl9nZXQoKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfY2hhcl90b19zdHIoaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyCWM7Ci0JY2hhcglidWZbQlVGU0laXTsKLQotCSgqZmRzKSsrOwotCi0JaWYgKCBfYWlmX3RvX2NoYXIoKmRhdGEsICZjKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIGMgPj0gJyAnICYmIGMgPD0gJ34nICkKLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgIiVkICclYyciLCBjLCBjKTsKLQllbHNlCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsICIlZCAnXFwlMDNvJyIsIGMgJiAweGZmLCBjICYgMHhmZik7Ci0KLQlfc3RyX2NhdChidWYpOwotCSpkYXRhICs9IHNpemVvZihjaGFyKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfaW50X3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWludAkJYnl0ZXMgPSBGRFNUeXBlU2l6ZSgqZmRzKTsKLQlpbnQJCWlzU2lnbmVkID0gRkRTSXNTaWduZWQoKmZkcyk7Ci0JaW50CQlpOwotCUFJRkxPTkdFU1QJbGxpOwotCWNoYXIJYnVmW0JVRlNJWl07Ci0KLQkqZmRzICs9IDI7Ci0JKmZkcyA9IF9mZHNfc2tpcG51bSgqZmRzKTsKLQotCWlmICggX2FpZl90b19sb25nZXN0KCpkYXRhLCBieXRlcywgJmxsaSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCBieXRlcyA8PSBzaXplb2YoaW50KSApCi0JewotCQlpID0gKGludClsbGk7Ci0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsIGlzU2lnbmVkID8gIiVkIiA6ICIldSIsIGkpOwotCX0KLQllbHNlIGlmICggYnl0ZXMgPT0gc2l6ZW9mKGxvbmcpICkKLQl7Ci0jaWZkZWYgQ0NfSEFTX0xPTkdfTE9ORwotCQlsb25nCQlsaTsKLQotCQlsaSA9IChsb25nKWxsaTsKLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgaXNTaWduZWQgPyAiJWxkIiA6ICIlbHUiICwgbGkpOwotI2Vsc2UgLyogQ0NfSEFTX0xPTkdfTE9ORyAqLwotCQlzbnByaW50ZihidWYsIEJVRlNJWi0xLCBpc1NpZ25lZCA/ICIlbGQiIDogIiVsdSIgLCBsbGkpOwotI2VuZGlmIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLQl9Ci0JZWxzZQotCXsKLSNpZmRlZiBDQ19IQVNfTE9OR19MT05HCi0JI2lmZGVmIFdJTjMyCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsIGlzU2lnbmVkID8gIiVJNjRkIiA6ICIlSTY0dSIgLCBsbGkpOwotCSNlbHNlIC8qIFdJTjMyICovCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsIGlzU2lnbmVkID8gIiVsbGQiIDogIiVsbHUiICwgbGxpKTsKLQkjZW5kaWYgLyogV0lOMzIgKi8KLSNlbHNlIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgaXNTaWduZWQgPyAiJWxkIiA6ICIlbHUiICwgbGxpKTsKLSNlbmRpZiAvKiBDQ19IQVNfTE9OR19MT05HICovCi0JfQotCi0JX3N0cl9jYXQoYnVmKTsKLQotCWlmICggYnl0ZXMgPiBzaXplb2YoQUlGTE9OR0VTVCkgKQotCXsKLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgIjx0cnVuY2F0ZWQgZnJvbSAlZCBieXRlcz4iLCBieXRlcyk7Ci0JCV9zdHJfY2F0KGJ1Zik7Ci0JfQotCi0JKmRhdGEgKz0gYnl0ZXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1BSUZJbnRUb1N0cihjaGFyICoqc3RyLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl9pbnRfdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX2Zsb2F0X3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCUFJRkRPVUJMRVNUCWQ7Ci0JaW50CQlieXRlcyA9IEZEU1R5cGVTaXplKCpmZHMpOwotCWNoYXIJCWJ1ZltCVUZTSVpdOwotCi0JKmZkcyArPSAxOwotCSpmZHMgPSBfZmRzX3NraXBudW0oKmZkcyk7Ci0KLQlpZiAoIF9haWZfdG9fZG91Ymxlc3QoKmRhdGEsIGJ5dGVzLCAmZCkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCBieXRlcyA8PSBzaXplb2YoZmxvYXQpICkKLSNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsICIlLjhMZyIsIGQpOwotI2Vsc2UgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotCQlzbnByaW50ZihidWYsIEJVRlNJWi0xLCAiJS44ZyIsIChmbG9hdClkKTsKLSNlbmRpZiAvKiBIQVZFX0xPTkdfRE9VQkxFICovCi0JZWxzZSBpZiAoIGJ5dGVzID09IHNpemVvZihkb3VibGUpICkKLSNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsICIlLjE2TGciLCBkKTsKLQllbHNlCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsICIlLjM0TGciLCBkKTsKLSNlbHNlIC8qIEhBVkVfTE9OR19ET1VCTEUgKi8KLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgIiUuMTZsZyIsIChkb3VibGUpZCk7Ci0jZW5kaWYgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotCi0JX3N0cl9jYXQoYnVmKTsKLQkqZGF0YSArPSBieXRlczsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLUFJRkZsb2F0VG9TdHIoY2hhciAqKnN0ciwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfZmxvYXRfdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3BvaW50ZXJfdG9fc3RyKGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JaW50IAlpbmRleDsKLQljaGFyIAlidWZbQlVGU0laXTsKLQotCSgqZmRzKSsrOyAvKiBwYXN0ICJeIiAqLwotCV9zdHJfY2F0KCJeIik7Ci0KLQlzd2l0Y2ggKCAoaW50KSoqZGF0YSApCi0JewotCWNhc2UgQUlGX1BUUl9OSUw6IC8qIG5pbCB2YWx1ZSAqLwotCQlpZiAoIGRlcHRoID09IDEgKQotCQkJZGVwdGggPSAtMTsKLQkJZWxzZSBpZiAoIGRlcHRoID4gMSApCi0JCQlkZXB0aC0tOwotCi0JCSgqZGF0YSkrKzsKLQkJX3N0cl9jYXQoIm51bGwiKTsKLQkJX2Zkc19hZHZhbmNlKGZkcyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfUFRSX05PUk1BTDogLyogbm9ybWFsIHZhbHVlICovCi0JCSgqZGF0YSkrKzsKLQotCQlpZiAoIGRlcHRoID09IC0xICkKLQkJewotCQkJX3N0cl9jYXQoIjxub3JtYWw+Iik7Ci0JCQlfZmRzX3NraXBfZGF0YShmZHMsIGRhdGEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoIGRlcHRoID09IDEgKQotCQkJZGVwdGggPSAtMTsKLQkJZWxzZSBpZiAoIGRlcHRoID4gMSApCi0JCQlkZXB0aC0tOwotCQkKLQkJX2FpZl90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfUFRSX05BTUU6IC8qIG5vcm1hbCB2YWx1ZSwgYnV0IHJlbWVtYmVyIGl0ICovCi0JCSgqZGF0YSkrKzsKLQkJX3B0cm5hbWVfdG9faW50KCpkYXRhLCAmaW5kZXgpOwotCQkqZGF0YSArPSA0OwotCQlfYWlmX3ZhbHVlc19zZWVuW2luZGV4XSA9ICpkYXRhOwotCQlzbnByaW50ZihidWYsIEJVRlNJWi0xLCAiPCVkOj4iLCBpbmRleCk7Ci0JCV9zdHJfY2F0KGJ1Zik7Ci0KLQkJaWYgKCBkZXB0aCA9PSAtMSApCi0JCXsKLQkJCV9mZHNfc2tpcF9kYXRhKGZkcywgZGF0YSk7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICggZGVwdGggPT0gMSApCi0JCQlkZXB0aCA9IC0xOwotCQllbHNlIGlmICggZGVwdGggPiAxICkKLQkJCWRlcHRoLS07Ci0KLQkJX2FpZl90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfUFRSX1JFRkVSRU5DRTogLyogcmVmZXJlbmNlIHRvIHJlbWVtYmVyZWQgdmFsdWUgKi8KLQkJaWYgKCBkZXB0aCA9PSAxICkKLQkJewotCQkJY2hhciAqIHRhcmdldDsKLQotCQkJZGVwdGggPSAtMTsKLQkJCXRhcmdldCA9IF9maW5kX3RhcmdldChkYXRhLCAwKTsKLQkJCV9haWZfdG9fc3RyKGRlcHRoLCBmZHMsICZ0YXJnZXQpOwotCQl9Ci0JCWVsc2UgaWYgKCBkZXB0aCA+IDEgKQotCQl7Ci0JCQljaGFyICogdGFyZ2V0OwotCi0JCQlkZXB0aC0tOwotCQkJdGFyZ2V0ID0gX2ZpbmRfdGFyZ2V0KGRhdGEsIDApOwotCQkJX2FpZl90b19zdHIoZGVwdGgsIGZkcywgJnRhcmdldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkoKmRhdGEpKys7Ci0JCQlfcHRybmFtZV90b19pbnQoKmRhdGEsICZpbmRleCk7Ci0JCQkqZGF0YSArPSA0OwotCQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgIjw9JWQ+IiwgaW5kZXgpOwotCQkJX3N0cl9jYXQoYnVmKTsKLQkJCV9mZHNfYWR2YW5jZShmZHMpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9QVFJfSU5WQUxJRDogLyogcG9pbnRlciBpcyBpbnZhbGlkICovCi0JCSgqZGF0YSkrKzsKLQkJX3N0cl9jYXQoIjxpbnZhbGlkPiIpOwotCQlfZmRzX2FkdmFuY2UoZmRzKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotQUlGUG9pbnRlclRvU3RyKGNoYXIgKipzdHIsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3BvaW50ZXJfdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgKQotCQlyZXR1cm4gLTE7Ci0JCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3JlZ2lvbl90b19zdHIoaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQlpbnQJCWk7Ci0JaW50CQlyYW5rOwotCWludAkJc2l6ZTsKLQlBSUZMT05HRVNUCW1pbjsKLQlBSUZMT05HRVNUCW1heDsKLQljaGFyCQlidWZbQlVGU0laXTsKLQotCXJhbmsgPSBfZmRzX2dldG51bSgqZmRzICsgMSk7Ci0Jc2l6ZSA9IEZEU1R5cGVTaXplKEZEU0Jhc2VUeXBlKCpmZHMpKTsKLQotCV9zdHJfY2F0KCJbIik7Ci0KLQlmb3IgKCBpID0gMCA7IGkgPCByYW5rIDsgaSsrICkKLQl7Ci0JCWlmICggaSAhPSAwICYmIHJhbmsgPiAxICkKLQkJCV9zdHJfY2F0KCIsICIpOwotCi0JCWlmCi0JCSgKLQkJCV9haWZfdG9fbG9uZ2VzdCgqZGF0YSArIDIgKiBpICogc2l6ZSwgc2l6ZSwgJm1pbikgPCAwCi0JCQl8fAotCQkJX2FpZl90b19sb25nZXN0KCpkYXRhICsgKDIgKiBpICsgMSkgKiBzaXplLCBzaXplLCAmbWF4KSA8IDAKLQkJKQotCQkJcmV0dXJuIC0xOwotCi0jaWZkZWYgQ0NfSEFTX0xPTkdfTE9ORwotCQlzbnByaW50ZihidWYsIEJVRlNJWi0xLCAiJWxsZC4uJWxsZCIsIG1pbiwgbWF4KTsKLSNlbHNlIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgIiVsZC4uJWxkIiwgbWluLCBtYXgpOwotI2VuZGlmIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLQotCQlfc3RyX2NhdChidWYpOwotCX0KLQotCV9zdHJfY2F0KCJdIik7Ci0KLQlfZmRzX2FkdmFuY2UoZmRzKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfYXJyYXlfdG9fc3RyKGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JaW50CQlpOwotCUFJRkluZGV4ICoJaXg7Ci0JY2hhciAqCQlmbXQ7Ci0KLQlpeCA9IEZEU0FycmF5SW5kZXhJbml0KCpmZHMpOwotCi0JX3N0cl9jYXQoIlsiKTsKLQotCWZvciAoIGkgPSAwIDsgaSA8IGl4LT5pX25lbCA7IGkrKyApCi0JewotCQlmbXQgPSBpeC0+aV9idHlwZTsKLQotCQkvKgotICAgICAgICAgICAgICAgIGlmICggaXgtPmlfcmFuayA9PSAxICkKLQkJCXNucHJpbnRmKF9zdHJfYnVmLCBCVUZTSVotMSwgIiglZCkiLCBpICsgaXgtPmlfbWluWzBdKTsKLQkJKi8KLQotCQlfYWlmX3RvX3N0cihkZXB0aCwgJmZtdCwgZGF0YSk7Ci0KLQkJaWYgKCBpIDwgaXgtPmlfbmVsIC0gMSApCi0JCQlfc3RyX2NhdCgiLCAiKTsKLQotCX0KLQotCV9zdHJfY2F0KCJdIik7Ci0KLQlBSUZBcnJheUluZGV4RnJlZShpeCk7Ci0KLQlfZmRzX2FkdmFuY2UoZmRzKTsgLyogc2tpcCBvdmVyIGVudGlyZSBhcnJheSBkZXNjcmlwdG9yICovCi0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1BSUZBcnJheVRvU3RyKGNoYXIgKipzdHIsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIEFJRlR5cGUoYSkgIT0gQUlGX0FSUkFZICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfYXJyYXlfdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1BSUZBcnJheUluZGV4VG9TdHIoY2hhciAqKnN0ciwgQUlGSW5kZXggKml4KQotewotCWludAlpOwotCWNoYXIJYnVmW0JVRlNJWl07Ci0KLQlfc3RyX2luaXQoKTsKLQotCWZvciAoIGkgPSAwIDsgaSA8IGl4LT5pX3JhbmsgOyBpKysgKQotCXsKLQkJc25wcmludGYoYnVmLCBCVUZTSVotMSwgIlslZF0iLCBpeC0+aV9pbmRleFtpXSk7Ci0JCV9zdHJfY2F0KGJ1Zik7Ci0JfQotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3N0cnVjdF90b19zdHIoaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICoJaW5GZHM7CQotCWNoYXIJYnVmW0JVRlNJWl07Ci0JaW50CWlzU3RydWN0ID0gMTsJLyogYXNzdW1lIGl0IGlzIGEgc3RydWN0ICovCi0JCQkJLyogdG8gYXZvaWQgcHJpbnRpbmcgdGhlIHNlbWljb2xvbnMgaWYKLQkJCQkgICBpdCBpcyBhIHN0cnVjdCAqLwotCi0JX3N0cl9jYXQoInsiKTsKLQotCSgqZmRzKSsrOyAvKiBwYXN0IG9wZW4gYnJhY2UgKi8KLQotCS8qCi0JKiogcGFzdCBubm49Ci0JKi8KLQotCV9mZHNfc2tpcGlkKGZkcyk7Ci0KLQl3aGlsZSAoICoqZmRzICE9IEZEU19TVFJVQ1RfRU5EICkKLQl7Ci0JCWlmICggaXNTdHJ1Y3QgCSYmICgqZmRzKVswXSA9PSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAKLQkJCQkmJiAoKmZkcylbMV0gPT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQCi0JCQkJJiYgKCpmZHMpWzJdID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCXsKLQkJCSgqZmRzKSArPSAzOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoICoqZmRzID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCXsKLQkJCWlzU3RydWN0ID0gMDsJLyogaXQgaXMgYSBjbGFzcyAqLwotCQkJCi0JCQkoKmZkcykrKzsKLQkJCV9zdHJfY2F0KCI7ICIpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIChpbkZkcyA9IHN0cmNocigqZmRzLCBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EKSkgPT0gTlVMTCApCi0JCQlicmVhazsKLQotCQkqaW5GZHMgPSAwOyAvKiB0ZW1wb3JhcmlseSAqLwotCi0JCXNucHJpbnRmKGJ1ZiwgQlVGU0laLTEsICIlcyA9ICIsICpmZHMpOwotCQlfc3RyX2NhdChidWYpOwotCi0JCSppbkZkcysrID0gRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORDsKLQotCQkqZmRzID0gaW5GZHM7IC8qIHRvIHN0YXJ0IG9mIGZpZWxkICovCi0KLQkJX2FpZl90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0KLQkJaWYgKCAqKmZkcyA9PSBGRFNfU1RSVUNUX0ZJRUxEX1NFUCApCi0JCXsKLQkJCSgqZmRzKSsrOwotCQkJX3N0cl9jYXQoIiwgIik7Ci0JCX0KLQl9Ci0KLQlfc3RyX2NhdCgifSIpOwotCi0JKCpmZHMpKys7IC8qIHBhc3QgY2xvc2UgYnJhY2UgKi8KLQotCXJldHVybiAwOwotfQotCi1pbnQKLUFJRlN0cnVjdFRvU3RyKGNoYXIgKipzdHIsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3N0cnVjdF90b19zdHIoZGVwdGgsICZmbXQsICZkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQkqc3RyID0gX3N0cl9nZXQoKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfcmVmZXJlbmNlX3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWludAlpbmRleDsKLQljaGFyICoJZWZmZWN0aXZlRmRzOwotCi0JKCpmZHMpKys7IC8qIHBhc3QgIj4iICovCi0JaW5kZXggPSAoaW50KXN0cnRvbCgqZmRzLCBOVUxMLCAxMCk7Ci0JKmZkcyA9IF9mZHNfc2tpcG51bSgqZmRzKTsgLyogcGFzdCBuYW1lICovCi0JKCpmZHMpKys7IC8qIHBhc3QgIi8iICovCi0JZWZmZWN0aXZlRmRzID0gX2FpZl90eXBlc19zZWVuW2luZGV4XTsKLQotCV9haWZfdG9fc3RyKGRlcHRoLCAmZWZmZWN0aXZlRmRzLCBkYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLUFJRlJlZmVyZW5jZVRvU3RyKGNoYXIgKipzdHIsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3JlZmVyZW5jZV90b19zdHIoZGVwdGgsICZmbXQsICZkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQkqc3RyID0gX3N0cl9nZXQoKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfc3RyaW5nX3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWludAlieXRlczsKLQljaGFyICoJYnVmOwotCi0JKCpmZHMpKys7IC8qIHBhc3QgInMiICovCi0JYnl0ZXMgPSAoKigqZGF0YSkrKyAmIDB4ZmYpIDw8IDg7Ci0JYnl0ZXMgKz0gKigqZGF0YSkrKyAmIDB4ZmY7Ci0KLQlidWYgPSBfYWlmX2FsbG9jKGJ5dGVzKzMpOwotCi0JKmJ1ZiA9ICciJzsKLQlzdHJuY3B5KCZidWZbMV0sICpkYXRhLCBieXRlcyk7Ci0JKihidWYgKyBieXRlcyArIDEpID0gJyInOwotCSooYnVmICsgYnl0ZXMgKyAyKSA9IDA7IC8qIHRlcm1pbmF0b3IgKi8KLQotCV9zdHJfY2F0KGJ1Zik7Ci0KLQkqZGF0YSArPSBieXRlczsKLQotCV9haWZfZnJlZShidWYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl92b2lkX3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWludCBieXRlcyA9IEZEU1R5cGVTaXplKCpmZHMpOwotCi0JKmZkcyArPSAxOyAvKiBwYXN0ICJ2IiAqLwotCSpmZHMgPSBfZmRzX3NraXBudW0oKmZkcyk7Ci0KLQkqZGF0YSArPSBieXRlczsKLQotCV9zdHJfY2F0KCJWT0lEIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotQUlGVm9pZFRvU3RyKGNoYXIgKipzdHIsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3ZvaWRfdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3VuaW9uX3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewkKLQljaGFyICoJaW5GZHM7CQotCWNoYXIgKgl0ZW1wOwotCWNoYXIgKglkdDsKLQlpbnQgCXNpemU7Ci0JaW50CXVuaW9uX3NpemU7Ci0JY2hhcglidWZbQlVGU0laXTsKLQotCV9zdHJfY2F0KCJ7Iik7Ci0KLQl1bmlvbl9zaXplID0gRkRTVHlwZVNpemUoKmZkcyk7Ci0KLQkoKmZkcykrKzsgLyogcGFzdCBvcGVuIGJyYWNlICovCi0KLQkvKgotCSoqIHBhc3Qgbm5uPQotCSovCi0KLQlfZmRzX3NraXBpZChmZHMpOwotCi0Jd2hpbGUgKCAqKmZkcyAhPSBGRFNfVU5JT05fRU5EICkKLQl7Ci0JCWlmICggKGluRmRzID0gc3RyY2hyKCpmZHMsIEZEU19VTklPTl9GSUVMRF9OQU1FX0VORCkpID09IE5VTEwgKQotCQkJYnJlYWs7Ci0KLQkJKmluRmRzID0gMDsgLyogdGVtcG9yYXJpbHkgKi8KLQotCQlzbnByaW50ZihidWYsIEJVRlNJWi0xLCAiJXMgPSAiLCAqZmRzKTsKLQkJX3N0cl9jYXQoYnVmKTsKLQotCQkqaW5GZHMrKyA9IEZEU19VTklPTl9GSUVMRF9OQU1FX0VORDsKLQotCQkqZmRzID0gaW5GZHM7IC8qIHRvIHN0YXJ0IG9mIGZpZWxkICovCi0KLQkJc2l6ZSA9IEZEU1R5cGVTaXplKCpmZHMpOwotCQl0ZW1wID0gX2FpZl9hbGxvYyggc2l6ZW9mKGNoYXIpICogc2l6ZSApOwotCQlkdCA9IHRlbXA7Ci0JCW1lbWNweShkdCwgKmRhdGEsIHNpemUpOwotCi0JCV9haWZfdG9fc3RyKGRlcHRoLCBmZHMsICZkdCk7Ci0JCV9haWZfZnJlZSh0ZW1wKTsKLQotCQlpZiAoICoqZmRzID09IEZEU19VTklPTl9GSUVMRF9TRVAgKQotCQl7Ci0JCQkoKmZkcykrKzsKLQkJCV9zdHJfY2F0KCIsICIpOwotCQl9Ci0JfQotCi0JX3N0cl9jYXQoIn0iKTsKLQkqZGF0YSArPSB1bmlvbl9zaXplOwotCi0JKCpmZHMpKys7IC8qIHBhc3QgY2xvc2UgYnJhY2UgKi8KLQotCXJldHVybiAwOwotfQotCi1pbnQKLUFJRlVuaW9uVG9TdHIoY2hhciAqKnN0ciwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfdW5pb25fdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX2Z1bmN0aW9uX3RvX3N0cihpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewkKLQljaGFyICoJcDsKLQljaGFyCWVuZFsyXSA9IHtGRFNfRlVOQ1RJT05fQVJHX0VORCwgMH07Ci0KLQkoKmZkcykrKzsgLyogcGFzdCAiJiIgKi8KLQotCXAgPSBfZmRzX3NraXB0bygqZmRzLCBlbmQpOwotCi0JX3N0cl9jYXQoKytwKTsKLQlfc3RyX2NhdCgiICIpOwotCV9zdHJfY2F0KCpkYXRhKTsKLQlfc3RyX2NhdCgiKCIpOwotCi0Jd2hpbGUgKCAqKmZkcyAhPSBGRFNfRlVOQ1RJT05fQVJHX0VORCApCi0JewotCQlpZiAoICoqZmRzID09IEZEU19VTklPTl9GSUVMRF9TRVAgKQotCQkJX3N0cl9jYXQoIiwgIik7Ci0JCWVsc2UKLQkJCV9zdHJfYWRkKCoqZmRzKTsKLQotCQkoKmZkcykrKzsKLQl9Ci0KLQlfc3RyX2NhdCgiKSIpOwotCi0JKCpmZHMpKys7IC8qIHBhc3QgYXJnIGVuZCAqLwotCi0JX2Zkc19hZHZhbmNlKGZkcyk7Ci0JX2Zkc19za2lwX2RhdGEoZmRzLCBkYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLUFJRkZ1bmN0aW9uVG9TdHIoY2hhciAqKnN0ciwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfZnVuY3Rpb25fdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX2VudW1fdG9fc3RyKGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17CQotCWludAkJYnl0ZXMgPSBGRFNUeXBlU2l6ZSgqZmRzKTsKLQlBSUZMT05HRVNUCWxsaTsKLQlpbnQJCWk7Ci0JY2hhciAqCQlzdHJpbmcgPSBOVUxMOwotCi0JLyogY2hlY2sgd2hldGhlciBpdCBpcyBhbiBlbXB0eSBlbnVtIG9yIG5vdCAqLwotCWNoYXIgKiAJCWYgPSAqZmRzOwotCi0Jd2hpbGUgKCAqZiAhPSBGRFNfSUQgKQotCQlmKys7Ci0KLQlmKys7Ci0JaWYgKCAqZiA9PSBGRFNfRU5VTV9FTkQgKQotCXsJLyogaXQgaXMgYW4gZW1wdHkgZW51bSAqLwotCQlfc3RyX2NhdCgiMCIpOwkKLQkJKmRhdGEgKz0gYnl0ZXM7Ci0JCV9mZHNfYWR2YW5jZShmZHMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIF9haWZfdG9fbG9uZ2VzdCgqZGF0YSwgYnl0ZXMsICZsbGkpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCWkgPSAoaW50KSBsbGk7Ci0KLQlpZiAoIEZEU0VudW1Db25zdEJ5VmFsdWUoKmZkcywgJnN0cmluZywgaSkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JCi0JX3N0cl9jYXQoc3RyaW5nKTsKLQlfYWlmX2ZyZWUoc3RyaW5nKTsKLQotCSpkYXRhICs9IGJ5dGVzOwotCV9mZHNfYWR2YW5jZShmZHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotQUlGRW51bVRvU3RyKGNoYXIgKipzdHIsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX2VudW1fdG9fc3RyKGRlcHRoLCAmZm10LCAmZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX25hbWVfdG9fc3RyKGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17CQotCWludAlpbmRleDsKLQotCSgqZmRzKSsrOyAvKiBwYXN0ICIlIiAqLwotCWluZGV4ID0gKGludClzdHJ0b2woKmZkcywgTlVMTCwgMTApOwotCSpmZHMgPSBfZmRzX3NraXBudW0oKmZkcyk7IC8qIHBhc3QgbmFtZSAqLwotCSgqZmRzKSsrOyAvKiBwYXN0ICIvIiAqLwotCV9haWZfdHlwZXNfc2VlbltpbmRleF0gPSAqZmRzOwotCi0JcmV0dXJuIF9haWZfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpOwotfQotCi0vKiAKLSAqIFByaW50cyB0aGUgb2JqZWN0IGluIGh1bWFuLXJlYWRhYmxlIGZvcm0gdG8gZnAsIGFkdmFuY2VzIGZkcyBhbmQgZGF0YSB0bwotICogdGhlIGZpcnN0IGxvY2F0aW9uIGFmdGVyIHRoZSBwYXJ0IHByaW50ZWQuICBBcml0aG1ldGljIHZhbHVlcyBhcmUgZ2l2ZW4gYXQKLSAqIGxlYXN0IGxlbiBieXRlcyBvZiBzaWduaWZpY2FuY2UsIG1vcmUgaWYgdGhlIGZkcyBpbmRpY2F0ZXMuCi0gKi8KLWludAotX2FpZl90b19zdHIoaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICogdG1wOwotCi0JX2Zkc19yZXNvbHZlKGZkcyk7Ci0KLQlzd2l0Y2ggKCBGRFNUeXBlKCpmZHMpICkKLQl7Ci0JY2FzZSBBSUZfQk9PTEVBTjoKLQkJcmV0dXJuIF9haWZfYm9vbF90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7IAotCi0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQlyZXR1cm4gX2FpZl9jaGFyX3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKTsKLQotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JCXJldHVybiBfYWlmX2ludF90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0KLQljYXNlIEFJRl9GTE9BVElORzoKLQkJcmV0dXJuIF9haWZfZmxvYXRfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpOwotCi0JY2FzZSBBSUZfQVJSQVk6Ci0JCXJldHVybiBfYWlmX2FycmF5X3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKTsKLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0JCXJldHVybiBfYWlmX3BvaW50ZXJfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpOwotCi0JY2FzZSBBSUZfUkVHSU9OOgotCQlyZXR1cm4gX2FpZl9yZWdpb25fdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpOwotCi0JY2FzZSBBSUZfU1RSVUNUOgotCQlyZXR1cm4gX2FpZl9zdHJ1Y3RfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpOwotCi0JY2FzZSBBSUZfTkFNRToKLQkJcmV0dXJuIF9haWZfbmFtZV90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0KLQljYXNlIEFJRl9SRUZFUkVOQ0U6Ci0JCXRtcCA9IF9mZHNfbG9va3VwKGZkcyk7Ci0JCXJldHVybiBfYWlmX3RvX3N0cihkZXB0aCwgJnRtcCwgZGF0YSk7Ci0KLQljYXNlIEFJRl9TVFJJTkc6Ci0JCXJldHVybiBfYWlmX3N0cmluZ190b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0KLQljYXNlIEFJRl9FTlVNOgotCQlyZXR1cm4gX2FpZl9lbnVtX3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKTsKLQotCWNhc2UgQUlGX1VOSU9OOgotCQlyZXR1cm4gX2FpZl91bmlvbl90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0KLQljYXNlIEFJRl9WT0lEOgotCQlyZXR1cm4gX2FpZl92b2lkX3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKTsKLQotCWNhc2UgQUlGX0ZVTkNUSU9OOgotCQlyZXR1cm4gX2FpZl9mdW5jdGlvbl90b19zdHIoZGVwdGgsIGZkcywgZGF0YSk7Ci0KLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotaW50Ci1BSUZUb1N0cihjaGFyICoqc3RyLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl90b19zdHIoZGVwdGgsICZmbXQsICZkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQkqc3RyID0gX3N0cl9nZXQoKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0IGEgcG9pbnRlciBuYW1lIGludG8gYW4gaW50ICg0IGJ5dGVzKSAqLwotdm9pZAotX3B0cm5hbWVfdG9faW50KGNoYXIgKm5hbWUsIGludCAqbnVtYmVyKQotewotCWludAlzOwotCWludCAJaSA9IDA7Ci0KLQlmb3IgKCBzID0gMCA7IHMgPCA0IDsgcysrICkKLQkJaSA9IGkgKiAweDEwMCArIChuYW1lW3NdICYgMHhmZik7Ci0KLQkqbnVtYmVyID0gaTsKLX0KLQotLyogQ29udmVydCBhbiBpbnQgKDQgYnl0ZXMpIGludG8gYSBzdHJpbmcgZm9yIHRoZSBwb2ludGVyIG5hbWUgKi8KLXZvaWQKLV9pbnRfdG9fcHRybmFtZShpbnQgbnVtYmVyLCBjaGFyICpuYW1lKQotewotCXVuaW9uIGllZWUJZjsKLQlmLmkgPSBudW1iZXI7Ci0KLQlfYWlmX25vcm1hbGlzZShuYW1lLCA0LCBmLmJ5dGVzLCA0KTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZGVwY29tcCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2RlcGNvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZTJkM2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA0LTA1LTMxLjIzCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCi1hcyBzaWRlLWVmZmVjdHMuCi0KLUVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgotICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KLSAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KLSAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0IDAKLSAgICA7OwotICAtdiB8IC0tdiopCi0gICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKLSAgICBleGl0IDAKLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAkZGVwZmlsZQotICAgIGVjaG8gPj4gJGRlcGZpbGUKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAotICAgPj4gJGRlcGZpbGUKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKLSAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIERlcGVuZGVuY2llcyBhcmUgb3V0cHV0IGluIC5sby5kIHdpdGggbGlidG9vbCAxLjQuCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhleSBhcmUgb3V0cHV0IGJvdGggaW4gJGRpci5saWJzLyRiYXNlLm8uZAotICAgICAgIyBhbmQgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQgJGRpciRiYXNlLm8uZC4gIFdlIHByb2Nlc3MgdGhlCi0gICAgICAjIGxhdHRlciwgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgYmUgY2xlYW5lZCB3aGVuICRkaXIubGlicyBpcwotICAgICAgIyBlcmFzZWQuCi0gICAgICB0bXBkZXBmaWxlMT0iJGRpci5saWJzLyRiYXNlLmxvLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLm8uZCIKLSAgICAgIHRtcGRlcGZpbGUzPSIkZGlyLmxpYnMvJGJhc2UuZCIKLSAgICAgICIkQCIgLVdjLC1NRAotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZTE9IiRkaXIkYmFzZS5vLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLmQiCi0gICAgICB0bXBkZXBmaWxlMz0iJGRpciRiYXNlLmQiCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUxIjsgdGhlbgotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUxIgotICAgZWxpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTIiOyB0aGVuCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTMiCi0gICBmaQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAotICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCi0gICIkQCIgfHwgZXhpdCAkPwotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgotICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ub25lKQotICBleGVjICIkQCIKLSAgOzsKLQotKikKLSAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZG9jLy5jdnNpZ25vcmUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9kb2MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjN2E3Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9kb2MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9kb2MvTWFrZWZpbGUuaW4gYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9kb2MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDA3ZWIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotc3JjZGlyID0JQHNyY2RpckAKLVZQQVRIID0JCUBzcmNkaXJACi1wcmVmaXggPQlAcHJlZml4QAotZXhlY19wcmVmaXggPQlAZXhlY19wcmVmaXhACi1iaW5kaXIgPQlAYmluZGlyQAotbGliZGlyID0JQGxpYmRpckAKLQotQ0MgPQkJQENDQAotQ1BQRkxBR1MgPQlAQ1BQRkxBR1NACi1DRkxBR1MgPQlAQ0ZMQUdTQAotTERGTEFHUyA9CUBMREZMQUdTQAotREVGUyA9CQlAREVGU0AKLUlOU1RBTEwgPQlASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9CUBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0RBVEEgPQlASU5TVEFMTF9EQVRBQAotUkFOTElCID0JQFJBTkxJQkAKLUFSID0JCWFyCi1SUENHRU4gPQlycGNnZW4KLVJFTU9WRSA9CXJtIC1mCi1YTUxUTyA9CQlAWE1MVE9ACi0KLVRPUCA9CQkkKHNyY2RpcikvLi4vLi4KLUNPTVBBVCA9CSQoc3JjZGlyKS8uLi9jb21wYXQKLURCR1NSViA9CSQoc3JjZGlyKS8uLi9kYmdzcnYKLUdDID0JCSQoc3JjZGlyKS8uLi9nYwotVVRJTCA9CQkkKHNyY2RpcikvLi4vdXRpbAotTElCUyA9CQotSU5TUFJPR1MgPQkKLQotU0hFTEwgPQkJL2Jpbi9zaAotCi1hbGw6IGh0bWwuc3RhbXAgbGliYWlmLnBzIGxpYmFpZi50eHQKLQotY2xlYW46Ci0Jcm0gLWYgbGliYWlmLnBzICouaHRtbCBodG1sLnN0YW1wCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtcmYgTWFrZWZpbGUgTWFrZWZpbGUuYmFrCi0KLWh0bWwuc3RhbXA6IGxpYmFpZi54bWwKLQkkKFhNTFRPKSBodG1sIGxpYmFpZi54bWwKLQotbGliYWlmLnBzOiBsaWJhaWYueG1sCi0JJChYTUxUTykgcHMgbGliYWlmLnhtbAotCi1saWJhaWYudHh0OiBsaWJhaWYueG1sCi0JJChYTUxUTykgdHh0IGxpYmFpZi54bWwKLQotIyBETyBOT1QgUkVNT1ZFIFRISVMgTElORQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZG9jL2xpYmFpZi50eHQgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9kb2MvbGliYWlmLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmMTdjYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9kb2MvbGliYWlmLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0KLUxpYmFpZgotCi1HcmVnIFdhdHNvbgotCi1EYXZpZCBBYnJhbXNvbgotCi1CcmlhbiBNYXkKLQotRG9ubnkgS3Vybmlhd2FuCi0KLSAgIENvcHlyaWdodCCpIDIwMDEgR3VhcmRTb2Z0IFB0eS4gTHRkLgotICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi0gICBUYWJsZSBvZiBDb250ZW50cwotCi0gICAxLiBbMV1RdWljayBTdGFydAotCi0gICAgICAgIFsyXUluc3RhbGxpbmcgbGliYWlmCi0gICAgICAgIFszXUluc3RhbGxpbmcgcGF0Y2hlZCBHREIKLQotQ2hhcHRlciAxLiBRdWljayBTdGFydAotCi0gICBUYWJsZSBvZiBDb250ZW50cwotCi0gICBbNF1JbnN0YWxsaW5nIGxpYmFpZgotICAgWzVdSW5zdGFsbGluZyBwYXRjaGVkIEdEQgotCi0gICBUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byBzdGFydCB1c2luZyBsaWJhaWYgaW4gdGhlIG1pbmltdW0gYW1vdW50Ci0gICBvZiB0aW1lLgotCi1JbnN0YWxsaW5nIGxpYmFpZgotCi0gICAgICogRG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHNvdXJjZSBjb2RlOgotCi0kIHRhciAteHpmIGxpYmFpZi0xLjAuMC50YXIuZ3oKLQotICAgICAqIENvbXBpbGUgYW5kIGluc3RhbGwgbGliYWlmIGJ5IGNoYW5naW5nIHRvIHRoZSBkaXJlY3RvcnksIGFuZCB1c2luZwotICAgICAgIGNvbmZpZ3VyZSBhbmQgbWFrZSwgZm9sbG93ZWQgYnkgbWFrZSBpbnN0YWxsIChhcyByb290KS4KLSAgICAgICBGb3IgZXhhbXBsZToKLQotJCBjZCBsaWJhaWYtMS4wLjAKLSQgY29uZmlndXJlCi0KLS4uLgotCi0kIG1ha2UKLQotLi4uCi0KLSQgbWFrZSBpbnN0YWxsCi0KLS4uLgotCi1JbnN0YWxsaW5nIHBhdGNoZWQgR0RCCi0KLSAgICAgKiBBSUYgIGlzICBjdXJyZW50bHkgIHN1cHBvcnRlZCAgaW4gIHZlcnNpb25zICA1LjAgIGFuZCAgNS4yIG9mIEdEQi4KLSAgICAgICBEb3dubG9hZCAgdGhlICBzb3VyY2UgIGNvZGUgZm9yIHRoZSB2ZXJzaW9uIG9mIEdEQiB0aGF0IHN1aXRzIHlvdXIKLSAgICAgICBzeXN0ZW0uCi0gICAgICogRXh0cmFjdCAgc291cmNlICBjb2RlLCAgYW5kIGFwcGx5IHRoZSBwYXRjaCBmcm9tIGxpYmFpZiwgdXNpbmcgdGhlCi0gICAgICAgc3VwcGxpZWQgcGF0Y2ggc2NyaXB0IGFwcGx5cGF0Y2guCi0gICAgICAgRm9yIGV4YW1wbGU6Ci0KLSQgY2QgL3RtcAotJCB0YXIgLXh6ZiBnZGJfNS4wLnRhci5negotJCBjZCAkKGxpYmFpZikvcGF0Y2hlcwotJCAuL2FwcGx5cGF0Y2ggLWluc3RhbGwtYWxsIC90bXAvZ2RiLTUuMAotcGF0Y2hpbmcgZmlsZSBnZGItNS4wL2dkYi9haWYtdmFscHJpbnQuYwotcGF0Y2hpbmcgZmlsZSBnZGItNS4wL2dkYi9jLXZhbHByaW50LmMKLXBhdGNoaW5nIGZpbGUgZ2RiLTUuMC9nZGIvcHJpbnRjbWQuYwotcGF0Y2hpbmcgZmlsZSBnZGItNS4wL2dkYi90eXBlcHJpbnQuYwotcGF0Y2hpbmcgZmlsZSBnZGItNS4wL2dkYi92YWxwcmludC5jCi1wYXRjaGluZyBmaWxlIGdkYi01LjAvZ2RiL01ha2VmaWxlLmluCi1wYXRjaGluZyBmaWxlIGdkYi01LjAvZ2RiL2xpYmFpZi5tawotCi0gICAgICogQ29tcGlsZSAgYW5kICBpbnN0YWxsICBHREIgYnkgY2hhbmdpbmcgdG8gdGhlIGRpcmVjdG9yeSwgYW5kIHVzaW5nCi0gICAgICAgY29uZmlndXJlIGFuZCBtYWtlLCBmb2xsb3dlZCBieSBtYWtlIGluc3RhbGwgKGFzIHJvb3QpLgotCi1Ob3RlCi0gICAgICAgWW91ICBzaG91bGQgIHVzZSAgdGhlICAtLXdpdGgtYWlmPWRpciAgKG9yICAtLXdpdGgtYWlmLWxpYj1kaXIgYW5kCi0gICAgICAgLS13aXRoLWFpZi1pbmNsdWRlPWRpcikgIG9wdGlvbnMgIGluICBvcmRlciAgdG8gYWxsb3cgY29uZmlndXJlIHRvCi0gICAgICAgbG9jYXRlIHRoZSBsaWJhaWYgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcy4KLSAgICAgICBFeGFtcGxlOgotCi0kIGNkIC90bXAvZ2RiLTUuMAotJCAuL2NvbmZpZ3VyZSAtLXdpdGgtYWlmPSQobGliYWlmLWluc2RpcikgYWxwaGEtcmVkaGF0LWxpbnV4Ci0KLS4uLgotCi0kIG1ha2UKLQotLi4uCi0KLSQgbWFrZSBpbnN0YWxsCi0KLS4uLgotCi1SZWZlcmVuY2VzCi0KLSAgIDEuIGZpbGU6Ly9sb2NhbGhvc3QvdG1wL3htbHRvLjlpWEdwMC9saWJhaWYucHJvYyNpZDI4MTI4MTUKLSAgIDIuIGZpbGU6Ly9sb2NhbGhvc3QvdG1wL3htbHRvLjlpWEdwMC9saWJhaWYucHJvYyNpZDI3OTg3OTYKLSAgIDMuIGZpbGU6Ly9sb2NhbGhvc3QvdG1wL3htbHRvLjlpWEdwMC9saWJhaWYucHJvYyNpZDI3NTEwMzUKLSAgIDQuIGZpbGU6Ly9sb2NhbGhvc3QvdG1wL3htbHRvLjlpWEdwMC9saWJhaWYucHJvYyNpZDI3OTg3OTYKLSAgIDUuIGZpbGU6Ly9sb2NhbGhvc3QvdG1wL3htbHRvLjlpWEdwMC9saWJhaWYucHJvYyNpZDI3NTEwMzUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2RvYy9saWJhaWYueG1sIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZG9jL2xpYmFpZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWY0ZGYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZG9jL2xpYmFpZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiPgotPGJvb2s+PHRpdGxlPkxpYmFpZjwvdGl0bGU+Ci0gIDxib29raW5mbz4KLSAgICA8YXV0aG9yZ3JvdXA+Ci0gICAgICA8YXV0aG9yPgotCTxmaXJzdG5hbWU+R3JlZzwvZmlyc3RuYW1lPgotCTxzdXJuYW1lPldhdHNvbjwvc3VybmFtZT4KLSAgICAgIDwvYXV0aG9yPgotICAgICAgPGF1dGhvcj4KLQk8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+Ci0JPHN1cm5hbWU+QWJyYW1zb248L3N1cm5hbWU+Ci0gICAgICA8L2F1dGhvcj4KLSAgICAgIDxhdXRob3I+Ci0JPGZpcnN0bmFtZT5CcmlhbjwvZmlyc3RuYW1lPgotCTxzdXJuYW1lPk1heTwvc3VybmFtZT4KLSAgICAgIDwvYXV0aG9yPgotICAgICAgPGF1dGhvcj4KLQk8Zmlyc3RuYW1lPkRvbm55PC9maXJzdG5hbWU+Ci0JPHN1cm5hbWU+S3Vybmlhd2FuPC9zdXJuYW1lPgotICAgICAgPC9hdXRob3I+Ci0gICAgPC9hdXRob3Jncm91cD4KLSAgICA8Y29weXJpZ2h0PgotICAgICAgPHllYXI+MjAwMTwveWVhcj4KLSAgICAgIDxob2xkZXI+R3VhcmRTb2Z0IFB0eS4gTHRkLjwvaG9sZGVyPgotICAgIDwvY29weXJpZ2h0PgotICAgIDxhZmZpbGlhdGlvbj4KLSAgICAgIDxvcmduYW1lPk1vbmFzaCBVbml2ZXJzaXR5PC9vcmduYW1lPgotICAgICAgPGFkZHJlc3M+Q2xheXRvbiwgVmljdG9yaWEsIE1lbGJvdXJuZTwvYWRkcmVzcz4KLSAgICA8L2FmZmlsaWF0aW9uPgotICA8L2Jvb2tpbmZvPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08Y2hhcHRlcj48dGl0bGU+UXVpY2sgU3RhcnQ8L3RpdGxlPgotPHBhcmE+Ci1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byBzdGFydCB1c2luZyA8ZW1waGFzaXM+bGliYWlmPC9lbXBoYXNpcz4KLWluIHRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lLgotPC9wYXJhPgotCi08c2VjdGlvbj48dGl0bGU+SW5zdGFsbGluZyA8ZW1waGFzaXM+bGliYWlmPC9lbXBoYXNpcz48L3RpdGxlPgotCi08cGFyYT4KLTxpdGVtaXplZGxpc3Q+Ci0gIDxsaXN0aXRlbT4KLSAgICA8cGFyYT5Eb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgc291cmNlIGNvZGU6PC9wYXJhPgotPHBhcmE+Ci08c2NyZWVuPgotCi0kIHRhciAteHpmIGxpYmFpZi0xLjAuMC50YXIuZ3oKLQotPC9zY3JlZW4+Ci0gICAgPC9wYXJhPgotICA8L2xpc3RpdGVtPgotCi0gIDxsaXN0aXRlbT4KLSAgICA8cGFyYT5Db21waWxlIGFuZCBpbnN0YWxsIDxlbXBoYXNpcz5saWJhaWY8L2VtcGhhc2lzPiBieQotICAgIGNoYW5naW5nIHRvIHRoZQotICAgIGRpcmVjdG9yeSwgYW5kIHVzaW5nIDx1c2VyaW5wdXQ+Y29uZmlndXJlPC91c2VyaW5wdXQ+IGFuZAotICAgIDx1c2VyaW5wdXQ+bWFrZTwvdXNlcmlucHV0PiwgZm9sbG93ZWQgYnkKLSAgICA8dXNlcmlucHV0Pm1ha2UgaW5zdGFsbDwvdXNlcmlucHV0PiAoYXMgcm9vdCkuPC9wYXJhPgotCi0gICAgPHBhcmE+Rm9yIGV4YW1wbGU6Ci08c2NyZWVuPgotCi0kIGNkIGxpYmFpZi0xLjAuMAotJCBjb25maWd1cmUKLQotLi4uCi0KLSQgbWFrZQotCi0uLi4KLQotJCBtYWtlIGluc3RhbGwKLQotLi4uCi0KLTwvc2NyZWVuPjwvcGFyYT4KLSAgPC9saXN0aXRlbT4KLTwvaXRlbWl6ZWRsaXN0PgotPC9wYXJhPgotCi08L3NlY3Rpb24+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPHNlY3Rpb24+PHRpdGxlPkluc3RhbGxpbmcgcGF0Y2hlZCA8ZW1waGFzaXM+R0RCPC9lbXBoYXNpcz48L3RpdGxlPgotCi08cGFyYT4KLTxpdGVtaXplZGxpc3Q+Ci0gIDxsaXN0aXRlbT4KLSAgICA8cGFyYT5BSUYgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBpbiB2ZXJzaW9ucyA1LjAgYW5kIDUuMiBvZiA8ZW1waGFzaXM+R0RCPC9lbXBoYXNpcz4uIAotICAgIERvd25sb2FkIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHZlcnNpb24gb2YgPGVtcGhhc2lzPkdEQjwvZW1waGFzaXM+IHRoYXQgc3VpdHMgeW91ciBzeXN0ZW0uCi0gICAgPC9wYXJhPgotICA8L2xpc3RpdGVtPgotICA8bGlzdGl0ZW0+Ci0gICAgPHBhcmE+RXh0cmFjdCBzb3VyY2UgY29kZSwgYW5kIGFwcGx5IHRoZSBwYXRjaCBmcm9tCi0gICAgPGVtcGhhc2lzPmxpYmFpZjwvZW1waGFzaXM+LCB1c2luZwotICAgIHRoZSBzdXBwbGllZCBwYXRjaCBzY3JpcHQgPHVzZXJpbnB1dD5hcHBseXBhdGNoPC91c2VyaW5wdXQ+LjwvcGFyYT4KLQotICAgIDxwYXJhPiBGb3IgZXhhbXBsZToKLTxzY3JlZW4+Ci0KLSQgY2QgL3RtcAotJCB0YXIgLXh6ZiBnZGJfNS4wLnRhci5neiAKLSQgY2QgJChsaWJhaWYpL3BhdGNoZXMKLSQgLi9hcHBseXBhdGNoIC1pbnN0YWxsLWFsbCAvdG1wL2dkYi01LjAKLXBhdGNoaW5nIGZpbGUgZ2RiLTUuMC9nZGIvYWlmLXZhbHByaW50LmMKLXBhdGNoaW5nIGZpbGUgZ2RiLTUuMC9nZGIvYy12YWxwcmludC5jCi1wYXRjaGluZyBmaWxlIGdkYi01LjAvZ2RiL3ByaW50Y21kLmMKLXBhdGNoaW5nIGZpbGUgZ2RiLTUuMC9nZGIvdHlwZXByaW50LmMKLXBhdGNoaW5nIGZpbGUgZ2RiLTUuMC9nZGIvdmFscHJpbnQuYwotcGF0Y2hpbmcgZmlsZSBnZGItNS4wL2dkYi9NYWtlZmlsZS5pbgotcGF0Y2hpbmcgZmlsZSBnZGItNS4wL2dkYi9saWJhaWYubWsKLQotPC9zY3JlZW4+Ci0gICAgPC9wYXJhPgotICA8L2xpc3RpdGVtPgotCi0gIDxsaXN0aXRlbT4KLSAgICA8cGFyYT5Db21waWxlIGFuZCBpbnN0YWxsIDxlbXBoYXNpcz5HREI8L2VtcGhhc2lzPiBieQotICAgIGNoYW5naW5nIHRvIHRoZQotICAgIGRpcmVjdG9yeSwgYW5kIHVzaW5nIDx1c2VyaW5wdXQ+Y29uZmlndXJlPC91c2VyaW5wdXQ+IGFuZAotICAgIDx1c2VyaW5wdXQ+bWFrZTwvdXNlcmlucHV0PiwgZm9sbG93ZWQgYnkKLSAgICA8dXNlcmlucHV0Pm1ha2UgaW5zdGFsbDwvdXNlcmlucHV0PiAoYXMgcm9vdCkuCi0gICAgPC9wYXJhPgotCi0gICAgPG5vdGU+PHBhcmE+WW91IHNob3VsZCB1c2UgdGhlCi0gICAgICA8dXNlcmlucHV0Pi0td2l0aC1haWY9PHJlcGxhY2VhYmxlPmRpcjwvcmVwbGFjZWFibGU+PC91c2VyaW5wdXQ+IChvciAKLSAgICAgIDx1c2VyaW5wdXQ+LS13aXRoLWFpZi1saWI9PHJlcGxhY2VhYmxlPmRpcjwvcmVwbGFjZWFibGU+PC91c2VyaW5wdXQ+IGFuZAotICAgICAgPHVzZXJpbnB1dD4tLXdpdGgtYWlmLWluY2x1ZGU9PHJlcGxhY2VhYmxlPmRpcjwvcmVwbGFjZWFibGU+PC91c2VyaW5wdXQ+KQotICAgICAgb3B0aW9ucyBpbiBvcmRlciB0byBhbGxvdyA8dXNlcmlucHV0PmNvbmZpZ3VyZTwvdXNlcmlucHV0PiB0byBsb2NhdGUgdGhlCi0gICAgICBsaWJhaWYgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcy4KLSAgICA8L3BhcmE+PC9ub3RlPgotCi0gICAgPHBhcmE+IEV4YW1wbGU6Ci08c2NyZWVuPgotCi0kIGNkIC90bXAvZ2RiLTUuMAotJCAuL2NvbmZpZ3VyZSAtLXdpdGgtYWlmPSQobGliYWlmLWluc2RpcikgYWxwaGEtcmVkaGF0LWxpbnV4Ci0KLS4uLgotCi0kIG1ha2UKLQotLi4uCi0KLSQgbWFrZSBpbnN0YWxsCi0KLS4uLgotCi08L3NjcmVlbj4KLTwvcGFyYT4KLSAgPC9saXN0aXRlbT4KLQotPC9pdGVtaXplZGxpc3Q+Ci08L3BhcmE+Ci0KLTwvc2VjdGlvbj4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08L2NoYXB0ZXI+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPC9ib29rPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZXJyb3IuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2Vycm9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTEyNDAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBSb3V0aW5lcyBmb3IgaGFuZGxpbmcgQUlGIGVycm9ycy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUJPGNvbmZpZy5oPgotI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KLQotI2luY2x1ZGUJPHN0ZGlvLmg+Ci0jaW5jbHVkZQk8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlCSJhaWYuaCIKLSNpbmNsdWRlCSJhaWZpbnQuaCIKLSNpbmNsdWRlCSJhaWZlcnIuaCIKLQotY2hhciAqCWFpZmVycnN0cltdID0KLXsKLQkiTm8gZXJyb3IiLAotCSJBcmd1bWVudHMgYXJlIGRpZmZlcmVudCBzaXplcyIsCi0JIkNhbid0IGNvbnZlcnQgYXJndW1lbnRzIiwKLQkiRnVuY3Rpb24gbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0eXBlIiwKLQkiQmFkIGFyZ3VtZW50IiwKLQkiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIiwKLQkiRXJyb3Igb3BlbmluZyBmaWxlOiAlcyIsCi0JIkVycm9yIHdyaXRpbmcgZmlsZTogJXMiLAotCSJFcnJvciByZWFkaW5nIGZpbGU6ICVzIiwKLQkiRXJyb3Igc2Vla2luZyBmaWxlOiAlcyIsCi0JIkJhZCBmaWxlIGhlYWRlciIsCi0JIkludmFsaWQgbW9kZSBmb3Igb3BlcmF0aW9uIiwKLQkiQmFkIGRlc2NyaXB0b3IiLAotCSJObyBzdWNoIGZpZWxkIiwKLQkiSW52YWxpZCBhcml0aG1ldGljIG9wZXJhdGlvbiIsCi0JIkludmFsaWQgYmFzZSBmb3IgY29udmVyc2lvbiIsCi0JIkluZGV4IG91dCBvZiByYW5nZSIsCi0JIlN0cmluZyB0b28gbG9uZyIsCi0JIlRoaXMgZXJyb3IgY2FuJ3QgaGFwcGVuIgotfTsKLQotc3RhdGljIGFpZmVycglfYWlmX2Vycm5vID0gQUlGRVJSX05PRVJSOwotc3RhdGljIGNoYXIgKglfYWlmX2VycnN0ciA9IE5VTEw7Ci0KLWFpZmVycgotQUlGRXJyb3Iodm9pZCkKLXsKLQlyZXR1cm4gX2FpZl9lcnJubzsKLX0KLQotY2hhciAqCi1BSUZFcnJvclN0cih2b2lkKQotewotCXN0YXRpYyBjaGFyCWJ1ZltCVUZTSVpdOwotCi0JaWYgKCBfYWlmX2Vycm5vID49IEFJRkVSUl9DQU5USEFQUEVOICkKLQkJcmV0dXJuICJVbmtub3duIEFJRiBlcnJvciI7Ci0KLQlpZiAoIF9haWZfZXJyc3RyICE9IE5VTEwgJiYgKl9haWZfZXJyc3RyICE9ICdcMCcgKQotCXsKLQkJc25wcmludGYoYnVmLCBCVUZTSVosIGFpZmVycnN0cltfYWlmX2Vycm5vXSwgX2FpZl9lcnJzdHIpOwotCQlyZXR1cm4gYnVmOwotCX0KLQotCXJldHVybiBhaWZlcnJzdHJbX2FpZl9lcnJub107Ci19Ci0KLXZvaWQKLVNldEFJRkVycm9yKGFpZmVyciBlcnJubywgY2hhciAqZXJyc3RyKQotewotCV9haWZfZXJybm8gPSBlcnJubzsKLQotCWlmICggX2FpZl9lcnJzdHIgIT0gTlVMTCApCi0JewotCQlfYWlmX2ZyZWUoX2FpZl9lcnJzdHIpOwotCQlfYWlmX2VycnN0ciA9IE5VTEw7Ci0JfQotCi0JaWYgKCBlcnJzdHIgIT0gTlVMTCApCi0JCV9haWZfZXJyc3RyID0gc3RyZHVwKGVycnN0cik7Ci19Ci0KLXZvaWQKLVJlc2V0QUlGRXJyb3Iodm9pZCkKLXsKLQlfYWlmX2Vycm5vID0gQUlGRVJSX05PRVJSOwotCi0JaWYgKCBfYWlmX2VycnN0ciAhPSBOVUxMICkKLQl7Ci0JCV9haWZfZnJlZShfYWlmX2VycnN0cik7Ci0JCV9haWZfZXJyc3RyID0gTlVMTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9leGNsdWRlIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZXhjbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzNjQ5Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9leGNsdWRlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0qLmJhawotKn4KLUNWUwotLiMqCi0uKi5zd3AKLWRpc3QKLWxpYmFpZi5zcGVjCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9mZHMuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2Zkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjJiY2JhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2Zkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzNiArMCwwIEBACi0vKgotICogUm91dGluZXMgZGVhbGluZyB3aXRoIGZvcm1hdCBkZXNjcmlwdG9yIHN0cmluZ3MgKEZEUykuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlCTxjb25maWcuaD4KLSNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCi0KLSNpbmNsdWRlCTxzdGRpby5oPgotI2luY2x1ZGUJPHN0ZGFyZy5oPgotI2luY2x1ZGUJPHN0cmluZy5oPgotCi0jaW5jbHVkZQk8Y3R5cGUuaD4KLSNpbmNsdWRlCTxzdGRsaWIuaD4KLQotI2luY2x1ZGUJImFpZi5oIgotI2luY2x1ZGUJImFpZmVyci5oIgotI2luY2x1ZGUJImFpZmludC5oIgotCi1zdGF0aWMgY2hhcglfZmRzX3R5cGVfc3RyW05VTV9BSUZfVFlQRVNdWzEyXSA9IAotewotCXsgRkRTX0lOVkFMSUQsICclJywgJ2QnLCBGRFNfSU5WQUxJRCwgJ1wwJyB9LAotCi0JeyBGRFNfSU5URUdFUiwgJyUnLCAnYycsICclJywgJ2QnLCAnXDAnIH0sCi0KLQl7IEZEU19GTE9BVElORywgJyUnLCAnZCcsICdcMCcgfSwKLQotCXsgRkRTX1BPSU5URVIsICclJywgJ3MnLCAnJScsICdzJywgJ1wwJyB9LAotCi0JeyBGRFNfQVJSQVlfU1RBUlQsICclJywgJ3MnLCBGRFNfQVJSQVlfRU5ELCAnJScsICdzJywgJ1wwJyB9LAotCi0JeyBGRFNfU1RSVUNUX1NUQVJULCAnJScsICdzJywgRkRTX0lELCAnOycsICc7JywgJzsnLCBGRFNfU1RSVUNUX0VORCwgJ1wwJyB9LAotCi0JeyBGRFNfVU5JT05fU1RBUlQsICclJywgJ3MnLCBGRFNfSUQsIEZEU19VTklPTl9FTkQsICdcMCcgfSwKLQotCXsgRkRTX0ZVTkNUSU9OLCBGRFNfRlVOQ1RJT05fQVJHX0VORCwgJyUnLCAncycsICdcMCcgfSwKLQotCXsgRkRTX1ZPSUQsICclJywgJ2QnLCAnXDAnIH0sCi0KLQl7IEZEU19SRUdJT04sICclJywgJ2QnLCAnJScsICdzJywgJ1wwJyB9LAotCi0JeyAnJScsIEZEU19OQU1FLCAnJScsICdkJywgRkRTX05BTUVfRU5ELCAnJScsICdzJywgJ1wwJyB9LAotCi0JeyBGRFNfUkVGRVJFTkNFLCAnJScsICdkJywgRkRTX1JFRkVSRU5DRV9FTkQsICdcMCcgfSwKLQotCXsgRkRTX1NUUklORywgJ1wwJyB9LAotCi0JeyBGRFNfQ0hBUkFDVEVSLCAnXDAnIH0sCi0KLQl7IEZEU19SQU5HRSwgJyUnLCAnZCcsIAotCSAgRkRTX1JBTkdFX1NFUCwgRkRTX1JBTkdFX1NFUCwgCi0JICAnJScsICdkJywgJyUnLCAncycsICdcMCcgfSwKLQotCXsgRkRTX0VOVU1fU1RBUlQsICclJywgJ3MnLCBGRFNfSUQsIEZEU19FTlVNX0VORCwgRkRTX0lOVEVHRVIsICclJywgJ2MnLCAnNCcsICdcMCcgfSwKLQotCXsgRkRTX0JPT0xFQU4sICdcMCcgfSwKLQkKLQl7IEZEU19BRERSRVNTLCAnJScsICdkJywgJ1wwJyB9LAotCi0JeyBGRFNfQ0hBUl9QT0lOVEVSLCAnJScsICdzJywgJ1wwJyB9Ci19OwotCi1zdGF0aWMgY2hhciBfZmRzX2FycmF5X2VuZFtdID0ge0ZEU19BUlJBWV9FTkQsICdcMCd9Owotc3RhdGljIGNoYXIgX2Zkc19mdW5jdGlvbl9hcmdfZW5kW10gPSB7RkRTX0ZVTkNUSU9OX0FSR19FTkQsICdcMCd9Owotc3RhdGljIGNoYXIgX2Zkc19uYW1lX2VuZFtdID0ge0ZEU19OQU1FX0VORCwgJ1wwJ307Ci1zdGF0aWMgY2hhciBfZmRzX2VudW1fZW5kW10gPSB7RkRTX0VOVU1fRU5ELCAnXDAnfTsKLXN0YXRpYyBjaGFyIF9mZHNfZW51bV9jb25zdF9uYW1lX2VuZFtdID0ge0ZEU19FTlVNX1NFUCwgJ1wwJyB9Owotc3RhdGljIGNoYXIgX2Zkc19lbnVtX2NvbnN0X2VuZFtdID0geyBGRFNfRU5VTV9DT05TVF9TRVAsIEZEU19FTlVNX0VORCwgJ1wwJyB9Owotc3RhdGljIGNoYXIgX2Zkc19zdHJ1Y3RfYWNjZXNzX3NlcFtdID0ge0ZEU19TVFJVQ1RfQUNDRVNTX1NFUCwgJ1wwJ307Ci1zdGF0aWMgY2hhciBfZmRzX3N0cnVjdF9maWVsZF9uYW1lX2VuZFtdID0ge0ZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQsICdcMCcgfTsKLXN0YXRpYyBjaGFyIF9mZHNfc3RydWN0X2ZpZWxkX2VuZFtdID0geyBGRFNfU1RSVUNUX0FDQ0VTU19TRVAsIEZEU19TVFJVQ1RfRklFTERfU0VQLCBGRFNfU1RSVUNUX0VORCwgJ1wwJyB9Owotc3RhdGljIGNoYXIgX2Zkc191bmlvbl9maWVsZF9uYW1lX2VuZFtdID0ge0ZEU19VTklPTl9GSUVMRF9OQU1FX0VORCwgJ1wwJyB9Owotc3RhdGljIGNoYXIgX2Zkc191bmlvbl9maWVsZF9lbmRbXSA9IHsgRkRTX1VOSU9OX0ZJRUxEX1NFUCwgRkRTX1VOSU9OX0VORCwgJ1wwJyB9OwotCi1zdGF0aWMgY2hhcglfZmRzX2J1ZltCVUZTSVpdOwotCi1jaGFyICoKLV9mZHNfc2tpcG51bShjaGFyICpzdHIpCi17Ci0JaWYgKCBzdHIgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCi0Jd2hpbGUgKCAqc3RyICE9ICdcMCcgJiYgaXNkaWdpdCgoaW50KSpzdHIpICkKLQkJc3RyKys7Ci0KLQlyZXR1cm4gc3RyOwotfQotCi1jaGFyICoKLV9mZHNfc2tpcHRvKGNoYXIgKnN0ciwgY2hhciAqc2V0KQotewotCWNoYXIgKglzOwotCi0JaWYgKCBzdHIgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCi0JZm9yICggOyAqc3RyICE9ICdcMCcgOyBzdHIrKyApCi0JewotCQlpZgotCQkoCi0JCQkqc3RyID09IEZEU19TVFJVQ1RfU1RBUlQgCi0JCQl8fCAKLQkJCSpzdHIgPT0gRkRTX1VOSU9OX1NUQVJUIAotCQkJfHwgCi0JCQkqc3RyID09IEZEU19BUlJBWV9TVEFSVCAKLQkJCXx8IAotCQkJKnN0ciA9PSBGRFNfRU5VTV9TVEFSVAotCQkpCi0JCXsKLQkJCXN0ciA9IF9mZHNfc2tpcHRvbWF0Y2goc3RyKTsKLQkJCXN0cisrOwotCQl9Ci0KLQkJZm9yICggcyA9IHNldCA7ICpzICE9ICdcMCcgOyBzKysgKQotCQkJaWYgKCAqcyA9PSAqc3RyICkKLQkJCQlyZXR1cm4gc3RyOwotCX0KLQotCXJldHVybiBzdHI7Ci19Ci0KLS8qIAotICogQ29udmVydCBhbiBhc2NpaSBudW1iZXIgdG8gYSBudW1iZXIuIE5PVEU6IHNpbGVudGx5IHRydW5jYXRlcwotICogdGhlIG51bWJlciB0byBmaXQgaW4gc2l6ZW9mIGludC4KLSAqLwotCi1pbnQKLV9mZHNfZ2V0bnVtKGNoYXIgKnN0cikKLXsKLQlpbnQJbjsKLQljaGFyICoJcDsKLQljaGFyICoJdDsKLQotCXAgPSBfZmRzX3NraXBudW0oc3RyKTsKLQotCWlmICggKnAgPT0gJ1wwJyApCi0JCXJldHVybiBzdHJ0b3VsKHN0ciwgTlVMTCwgMTApOwotCi0JbiA9IHAgLSBzdHI7Ci0JdCA9IChjaGFyICopX2FpZl9hbGxvYyhuICsgMSk7Ci0JbWVtY3B5KHQsIHN0ciwgbik7Ci0JdFtuXSA9ICdcMCc7Ci0KLQluID0gc3RydG91bCh0LCBOVUxMLCAxMCk7Ci0KLQlfYWlmX2ZyZWUodCk7Ci0KLQlyZXR1cm4gbjsKLX0KLQotaW50Ci1GRFNUeXBlKGNoYXIgKnN0cikKLXsKLQlpbnQJdHlwZTsKLQotCWlmIAotCSgKLQkJc3RyID09IE5VTEwgCi0JCXx8IAotCQkqc3RyID09ICdcMCcKLQkpCi0JCXJldHVybiBBSUZfSU5WQUxJRDsKLQotCXN3aXRjaCAoICpzdHIgKQotCXsKLQljYXNlIEZEU19CT09MRUFOOiAvKiBib29sZWFuICovCi0JCXR5cGUgPSBBSUZfQk9PTEVBTjsgCQotCQlicmVhazsgCQkKLQotCWNhc2UgRkRTX0NIQVJBQ1RFUjogLyogY2hhcmFjdGVyICovCi0JCXR5cGUgPSBBSUZfQ0hBUkFDVEVSOwotCQlicmVhazsKLQotCWNhc2UgRkRTX0lOVEVHRVI6IC8qIGludGVnZXIgKi8KLQkJdHlwZSA9IEFJRl9JTlRFR0VSOwotCQlicmVhazsKLQotCWNhc2UgRkRTX0ZMT0FUSU5HOiAvKiBmbG9hdGluZyAqLwotCQl0eXBlID0gQUlGX0ZMT0FUSU5HOwotCQlicmVhazsKLQotCWNhc2UgRkRTX1BPSU5URVI6IC8qIHBvaW50ZXIgKi8KLQkJdHlwZSA9IEFJRl9QT0lOVEVSOwotCQlicmVhazsKLQotCWNhc2UgRkRTX0FSUkFZX1NUQVJUOiAvKiBhcnJheSAqLwotCQl0eXBlID0gQUlGX0FSUkFZOwotCQlicmVhazsKLQotCWNhc2UgRkRTX1NUUlVDVF9TVEFSVDogIC8qIHN0cnVjdCAqLwotCQl0eXBlID0gQUlGX1NUUlVDVDsKLQkJYnJlYWs7Ci0KLQljYXNlIEZEU19VTklPTl9TVEFSVDogIC8qIHVuaW9uICovCi0JCXR5cGUgPSBBSUZfVU5JT047Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfRU5VTV9TVEFSVDogLyogZW51bWVyYXRpb24gKi8KLQkJdHlwZSA9IEFJRl9FTlVNOwotCQlicmVhazsKLQotCWNhc2UgRkRTX1JBTkdFOiAvKiByYW5nZSAqLwotCQl0eXBlID0gQUlGX0lOVEVHRVI7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfRlVOQ1RJT046IC8qIGZ1bmN0aW9uICovCi0JCXR5cGUgPSBBSUZfRlVOQ1RJT047Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfU1RSSU5HOiAvKiBzdHJpbmcgKi8KLQkJdHlwZSA9IEFJRl9TVFJJTkc7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfQ0hBUl9QT0lOVEVSOiAvKiBjaGFyIHBvaW50ZXIgKi8KLQkJdHlwZSA9IEFJRl9DSEFSX1BPSU5URVI7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfQUREUkVTUzogLyogYWRkcmVzcyAqLwotCQl0eXBlID0gQUlGX0FERFJFU1M7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfVk9JRDogLyogdm9pZCAqLwotCQl0eXBlID0gQUlGX1ZPSUQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfUkVHSU9OOiAvKiBaUEwgcmVnaW9uICovCi0JCXR5cGUgPSBBSUZfUkVHSU9OOwotCQlicmVhazsKLQotCWNhc2UgRkRTX05BTUU6IC8qIG5hbWVkIGNvbXBvbmVudCAqLwotCQl0eXBlID0gQUlGX05BTUU7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfUkVGRVJFTkNFOiAvKiByZWZlcmVuY2UgdG8gbmFtZWQgY29tcG9uZW50Ki8KLQkJdHlwZSA9IEFJRl9SRUZFUkVOQ0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJdHlwZSA9IEFJRl9JTlZBTElEOwotCX0KLQotCXJldHVybiB0eXBlOwotfQotCi0vKiBleHRyYWN0cyB0aGUgYmFzZSB0eXBlIG9mIGEgcG9pbnRlciBvciBhcnJheSB0eXBlLCBzcGVjaWZpZWQgYnkgdGhlICAgICAqLwotLyogdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotY2hhciAqCi1GRFNCYXNlVHlwZShjaGFyICp0eXBlKQotewotCWRvCi0JewotCQlpZiAoICh0eXBlID0gX2Zkc19iYXNlX3R5cGUodHlwZSkpID09IE5VTEwgKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXdoaWxlICggRkRTVHlwZSh0eXBlKSA9PSBBSUZfQVJSQVkgfHwgRkRTVHlwZSh0eXBlKSA9PSBBSUZfUE9JTlRFUiApOwotCi0JcmV0dXJuIHR5cGU7Ci19Ci0KLWNoYXIgKgotX2Zkc19iYXNlX3R5cGUoY2hhciAqdHlwZSkKLXsKLQljaGFyICoJcDsKLQotCWlmICggdHlwZSA9PSBOVUxMIHx8ICp0eXBlID09ICdcMCcgKQotCQlyZXR1cm4gTlVMTDsKLQotCXN3aXRjaCAoICp0eXBlICkKLQl7Ci0JY2FzZSBGRFNfRlVOQ1RJT046IC8qIGZ1bmN0aW9uICovCi0JCXAgPSBfZmRzX3NraXB0bygrK3R5cGUsIF9mZHNfZnVuY3Rpb25fYXJnX2VuZCk7Ci0JCXArKzsKLQkJYnJlYWs7Ci0KLQljYXNlIEZEU19QT0lOVEVSOiAvKiBwb2ludGVyICovCi0JCXAgPSArK3R5cGU7Ci0JCWJyZWFrOwotCQkKLQljYXNlIEZEU19BUlJBWV9TVEFSVDogLyogYXJyYXkgKi8KLQkJcCA9IF9mZHNfc2tpcHRvKCsrdHlwZSwgX2Zkc19hcnJheV9lbmQpOwotCQlwKys7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfRU5VTV9TVEFSVDogLyogZW51bSAqLwotCQlwID0gX2Zkc19za2lwdG8oKyt0eXBlLCBfZmRzX2VudW1fZW5kKTsKLQkJcCsrOwotCQlicmVhazsKLQotCWNhc2UgRkRTX1JBTkdFOiAvKiByYW5nZSAqLwotCQlwID0gdHlwZSArIDE7ICAgLyogc2tpcCBGRFNfUkFOR0UgKi8KLQkJcCA9IF9mZHNfc2tpcG51bShwKTsgLyogc2tpcCBNaW5WYWx1ZSAqLwotCQlwICs9IDI7ICAgICAgICAgLyogc2tpcCAnLi4nICovCi0JCXAgPSBfZmRzX3NraXBudW0ocCk7IC8qIHNraXAgTWF4VmFsdWUgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIEZEU19SRUdJT046IC8qIHJlZ2lvbiAqLwotCQlwID0gdHlwZSArIDI7CS8qIHNraXAgRkRTX1JFR0lPTiBSYW5rICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHA7Ci19Ci0KLS8qIEluIEFJRiwgd2UgY2FuIGZpbmQgb3V0IGFib3V0IHRoZSBzaXplIG9mIHRoZSBBSUYgb2JqZWN0IGJ5IGxvb2tpbmcgYXQgdGhlCi0gKiBBSUZfTEVOKCksIGJ1dCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBmaW5kIG91dCBhYm91dCB0aGUgc2l6ZQotICogb2YgZWFjaCBpbmRpdmlkdWFsIGVsZW1lbnQgaW4gYSBzdHJ1Y3QuIFRvIG92ZXJjb21lIHRoaXMgcHJvYmxlbSwgd2UgY2FuIHVzZQotICogRkRTVHlwZVNpemUoKSB3aXRoIHRoZSBGRFMgZm9yIGVhY2ggZWxlbWVudC4KLSAqIAotICogSG93ZXZlciwgRkRTVHlwZVNpemUoKSBjYW5ub3QgYmUgdXNlZCB0byBrbm93IHRoZSByZWFsIHNpemUgaWYgdGhlIHN0cnVjdAotICogY29udGFpbnMgcmVmZXJlbmNlcyBvciBzdHJpbmdzIChzaW5jZSB3ZSBhbHNvIG5lZWQgdG8gYWNjZXNzIHRoZSBkYXRhIHRvCi0gKiBrbm93IHRoZSBzaXplIG9mIHRoZXNlIGRhdGEgdHlwZXMpLgotICogCi0gKiBXZSB1c2UgRkRTRGF0YVNpemUoKSB0byBvdmVyY29tZSB0aGUgbGltaXRhdGlvbiBvZiBGRFNUeXBlU2l6ZSgpLiBJdCBjYW4gCi0gKiBhY2Nlc3MgRkRTIGFuZCB0aGUgZGF0YSBvZiBhbiBBSUYgb2JqZWN0IHRvIGNhbGN1bGF0ZSB0aGUgKHJlYWwpIHNpemUgb2YgCi0gKiB0aGUgZGF0YS4KLSAqLwotCi1pbnQKLUZEU0RhdGFTaXplKGNoYXIgKmZkcywgY2hhciAqZGF0YSkKLXsKLSAgICAgICAgY2hhciAqIHRtcDEgPSBmZHM7Ci0gICAgICAgIGNoYXIgKiB0bXAyID0gZGF0YTsKLQotCQlSZXNldEFJRkVycm9yKCk7Ci0KLSAgICAgICAgX2Zkc19za2lwX2RhdGEoJnRtcDEsICZ0bXAyKTsKLQotICAgICAgICBpZiAoIEFJRkVycm9yKCkgPT0gQUlGRVJSX05PRVJSICkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRtcDItZGF0YSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBHZXRzIHRoZSBzaXplIG9mIGEgdHlwZSBpbiBieXRlcywgc3BlY2lmaWVkIGJ5IHRoZSB0eXBlIGRlc2NyaXB0b3IuCi0gKiBJZiB0aGUgc2l6ZSBjYW5ub3QgZml0IGluIGEgaW50LCB0aGVuIGl0IGlzIHNpbGVudGx5IHRydW5jYXRlZC4KLSAqIHJldHVybnMgc2l6ZSBpZiBzdWNjZXNzZnVsLCAtMSBvdGhlcndpc2UuCi0gKgotICogTm90ZTogd2Ugbm8gbG9uZ2VyIGtub3cgdGhlIHNpemUgb2Ygc3RydWN0cyBvciB1bmlvbnMgc28gdGhlc2UgYXJlCi0gKiBhbHdheXMgLTEuCi0gKi8KLWludAotRkRTVHlwZVNpemUoY2hhciAqdHlwZSkKLXsKLQlpbnQJczsKLQlpbnQJbWluOwotCWludAltYXg7Ci0JaW50CXJhbms7Ci0JaW50CXNpemU7Ci0JaW50CXN1YnNpemU7Ci0KLQlpZiAoIHR5cGUgPT0gTlVMTCB8fCAqdHlwZSA9PSAnXDAnICkKLQkJcmV0dXJuIC0xOwotCi0Jc3dpdGNoICggKnR5cGUgKQotCXsKLQljYXNlIEZEU19CT09MRUFOOiAvKiBib29sZWFuICovCi0JCXJldHVybiBzaXplb2YoaW50KTsJCQotCi0JY2FzZSBGRFNfQ0hBUkFDVEVSOiAvKiBjaGFyYWN0ZXIgKi8KLQkJcmV0dXJuIDE7Ci0KLQljYXNlIEZEU19JTlRFR0VSOiAvKiBpbnRlZ2VyICovCi0JCXJldHVybiBfZmRzX2dldG51bSh0eXBlICsgMik7Ci0KLQljYXNlIEZEU19SRUZFUkVOQ0U6IC8qIHJlZmVyZW5jZSB1c2UgKi8KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIEZEU19OQU1FOiAvKiBuYW1lZCBjb21wb25lbnQgKi8KLQkJcmV0dXJuIEZEU1R5cGVTaXplKHN0cmNocih0eXBlLCBGRFNfTkFNRV9FTkQpICsgMSk7Ci0KLQljYXNlIEZEU19GVU5DVElPTjogLyogZnVuY3Rpb24gKi8KLQkJcmV0dXJuIEZEU1R5cGVTaXplKHN0cmNocih0eXBlLCBGRFNfRlVOQ1RJT05fQVJHX0VORCkgKyAxKTsKLQotCWNhc2UgRkRTX1BPSU5URVI6IC8qIHBvaW50ZXIgKi8KLQkJcmV0dXJuIEZEU1R5cGVTaXplKHR5cGUrMSk7Ci0KLQljYXNlIEZEU19GTE9BVElORzogLyogZmxvYXRpbmcgKi8KLQljYXNlIEZEU19WT0lEOiAvKiB2b2lkICovCi0JCXJldHVybiBfZmRzX2dldG51bSh0eXBlICsgMSk7Ci0KLQljYXNlIEZEU19TVFJVQ1RfU1RBUlQ6IC8qIHN0cnVjdCAqLwotCQl0eXBlKys7IC8qIHBhc3Qgb3BlbiBicmFjZSAqLwotCQlzaXplID0gMDsKLQkJc3Vic2l6ZSA9IDA7Ci0KLQkJX2Zkc19za2lwaWQoJnR5cGUpOwotCQkKLQkJd2hpbGUgKCAqdHlwZSAhPSBGRFNfU1RSVUNUX0VORCApCi0JCXsKLQkJCWlmICggKnR5cGUgPT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLQkJCXsKLQkJCQl0eXBlKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXR5cGUgPSBzdHJjaHIodHlwZSwgRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORCkgKyAxOwotCi0JCQkvKiB0byBzdGFydCBvZiBmaWVsZCAqLwotCQkJaWYgKCAoc3Vic2l6ZSA9IEZEU1R5cGVTaXplKHR5cGUpKSA8IDAgKQotCQkJCXJldHVybiAtMTsKLQotCQkJc2l6ZSArPSBzdWJzaXplOwotCi0JCQlfZmRzX2FkdmFuY2UoJnR5cGUpOwotCi0JCQlpZiAoICp0eXBlID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkKLQkJCQl0eXBlKys7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0KLQljYXNlIEZEU19VTklPTl9TVEFSVDoKLQkJdHlwZSsrOyAvKiBwYXN0IG9wZW4gYnJhY2UgKi8KLQkJc2l6ZSA9IDA7Ci0JCXN1YnNpemUgPSAwOwotCQkKLQkJX2Zkc19za2lwaWQoJnR5cGUpOwotCQkKLQkJd2hpbGUgKCAqdHlwZSAhPSBGRFNfVU5JT05fRU5EICkKLQkJewotCQkJdHlwZSA9IHN0cmNocih0eXBlLCBGRFNfVU5JT05fRklFTERfTkFNRV9FTkQpICsgMTsKLQotCQkJLyogdG8gc3RhcnQgb2YgZmllbGQgKi8KLQkJCWlmICggKHN1YnNpemUgPSBGRFNUeXBlU2l6ZSh0eXBlKSkgPCAwICkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCWlmICggc3Vic2l6ZSA+IHNpemUgKQotCQkJCXNpemUgPSBzdWJzaXplOwotCi0JCQlfZmRzX2FkdmFuY2UoJnR5cGUpOwotCi0JCQlpZiAoICp0eXBlID09IEZEU19VTklPTl9GSUVMRF9TRVAgKQotCQkJCXR5cGUrKzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQotCWNhc2UgRkRTX0FSUkFZX1NUQVJUOiAvKiBhcnJheSAqLwotCQlpZiAoIChzID0gRkRTVHlwZVNpemUoX2Zkc19iYXNlX3R5cGUodHlwZSkpKSA8IDAgKQotCQkJcmV0dXJuIC0xOwotCi0JCW1pbiA9IF9mZHNfYXJyYXlfbWluX2luZGV4KHR5cGUpOwotCQltYXggPSBfZmRzX2FycmF5X21heF9pbmRleCh0eXBlKTsKLQkJcmV0dXJuIHMgKiAobWF4IC0gbWluICsgMSk7Ci0KLQljYXNlIEZEU19FTlVNX1NUQVJUOiAvKiBlbnVtZXJhdGlvbiAqLwotCQlyZXR1cm4gNDsgLyogYWxsIGVudW1lcmF0aW9ucyBhcmUgYmFzZWQgb24gNC1ieXRlIGludGVnZXJzICovCi0KLQljYXNlIEZEU19SQU5HRTogLyogcmFuZ2UgKi8KLQkJcmV0dXJuIEZEU1R5cGVTaXplKF9mZHNfYmFzZV90eXBlKHR5cGUpKTsKLQotCWNhc2UgRkRTX1JFR0lPTjogLyogcmVnaW9uICovCi0JCXJhbmsgPSBfZmRzX2dldG51bSh0eXBlICsgMSk7Ci0JCXMgPSBGRFNUeXBlU2l6ZShfZmRzX2Jhc2VfdHlwZSh0eXBlKSk7Ci0JCXJldHVybiByYW5rICogcyAqIDI7Ci0KLQljYXNlIEZEU19DSEFSX1BPSU5URVI6Ci0JY2FzZSBGRFNfU1RSSU5HOgotCWNhc2UgRkRTX0FERFJFU1M6Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIE5PVCBSRUFDSEVEICovCi19Ci0KLWludAotRkRTSXNTaWduZWQoY2hhciAqZmRzKQotewotCWlmICggKmZkcysrID09IEZEU19JTlRFR0VSICkKLQkJcmV0dXJuIChpbnQpKCpmZHMgPT0gRkRTX0lOVEVHRVJfU0lHTkVEKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogV2Ugc3VwcG9ydCBuZXN0ZWQgY2FsbHMgdG8gVHlwZVRvRkRTKCkgYnkgbWFraW5nIGEgY29weSBvZiBhbnkgCi0gKiBzdHJpbmcgYXJndW1lbnRzIGJlZm9yZSBvdmVyd3JpdGluZyB0aGUgc3RhdGljIGJ1ZmZlci4gZS5nLgotICogCi0gKiAgICBUeXBlVG9GRFMoQUlGX0FSUkFZLCAKLSAqICAgICAgVHlwZVRvRkRTKEFJRl9SQU5HRSwgMCwgMTAsIAotICogICAgICAgIFR5cGVUb0ZEUyhBSUZfSU5URUdFUiwgNCkKLSAqICAgICAgKSwKLSAqICAgICAgVHlwZVRvRkRTKEFJRl9JTlRFR0VSLCAxMCkKLSAqICAgKTsKLSAqLwotY2hhciAqCi1UeXBlVG9GRFMoaW50IHR5cGUsIC4uLikKLXsKLSAgICAgICAgdmFfbGlzdCAJYXJnczsKLQlpbnQJCXYxOwotCWludAkJdjI7Ci0JY2hhciAqCQl2MzsKLQljaGFyICoJCXY0OwotCi0JaWYgKCB0eXBlIDwgMCB8fCB0eXBlID49IE5VTV9BSUZfVFlQRVMgKQotCQl0eXBlID0gQUlGX0lOVkFMSUQ7Ci0KLQl2YV9zdGFydChhcmdzLCB0eXBlKTsKLQotCXN3aXRjaCAoIHR5cGUgKQotCXsKLQljYXNlIEFJRl9JTlRFR0VSOgotCQl2MSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQl2MiA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCi0JCXNucHJpbnRmKF9mZHNfYnVmLCBCVUZTSVotMSwgX2Zkc190eXBlX3N0clt0eXBlXSwgdjEgPyBGRFNfSU5URUdFUl9TSUdORUQgOiBGRFNfSU5URUdFUl9VTlNJR05FRCwgdjIpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0ZMT0FUSU5HOgotCWNhc2UgQUlGX1ZPSUQ6Ci0JY2FzZSBBSUZfUkVGRVJFTkNFOgotCQl2MSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCi0JCXNucHJpbnRmKF9mZHNfYnVmLCBCVUZTSVotMSwgX2Zkc190eXBlX3N0clt0eXBlXSwgdjEpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0JCXYzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7Ci0JCWlmICh2MyA9PSBOVUxMKQotCQkJdjMgPSBzdHJkdXAoIngiKTsKLQkJZWxzZQotCQkJdjMgPSBzdHJkdXAodjMpOwotCi0JCXY0ID0gc3RyZHVwKHZhX2FyZyhhcmdzLCBjaGFyICopKTsJCQotCQlzbnByaW50ZihfZmRzX2J1ZiwgQlVGU0laLTEsIF9mZHNfdHlwZV9zdHJbdHlwZV0sIHYzLCB2NCk7Ci0JCV9haWZfZnJlZSh2Myk7Ci0JCV9haWZfZnJlZSh2NCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfRlVOQ1RJT046Ci0JCXYzID0gc3RyZHVwKHZhX2FyZyhhcmdzLCBjaGFyICopKTsKLQkJc25wcmludGYoX2Zkc19idWYsIEJVRlNJWi0xLCBfZmRzX3R5cGVfc3RyW3R5cGVdLCB2Myk7Ci0JCV9haWZfZnJlZSh2Myk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfRU5VTToKLQkJdjMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKLQkJaWYgKHYzID09IE5VTEwpCi0JCQl2MyA9IHN0cmR1cCgiIik7Ci0JCWVsc2UKLQkJCXYzID0gc3RyZHVwKHYzKTsKLQkJdjEgPSB2YV9hcmcoYXJncywgaW50KTsKLQkJc25wcmludGYoX2Zkc19idWYsIEJVRlNJWi0xLCBfZmRzX3R5cGVfc3RyW3R5cGVdLCB2MywgdjEgPyBGRFNfSU5URUdFUl9TSUdORUQgOiBGRFNfSU5URUdFUl9VTlNJR05FRCk7Ci0JCV9haWZfZnJlZSh2Myk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfQ0hBUl9QT0lOVEVSOgotCQl2MyA9IHN0cmR1cCh2YV9hcmcoYXJncywgY2hhciAqKSk7Ci0JCXNucHJpbnRmKF9mZHNfYnVmLCBCVUZTSVotMSwgX2Zkc190eXBlX3N0clt0eXBlXSwgdjMpOwotCQlfYWlmX2ZyZWUodjMpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0FERFJFU1M6Ci0JCXYxID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCXNucHJpbnRmKF9mZHNfYnVmLCBCVUZTSVotMSwgX2Zkc190eXBlX3N0clt0eXBlXSwgdjEpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX1NUUklORzoKLQljYXNlIEFJRl9DSEFSQUNURVI6Ci0JY2FzZSBBSUZfQk9PTEVBTjoKLQkJc3RyY3B5KF9mZHNfYnVmLCBfZmRzX3R5cGVfc3RyW3R5cGVdKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9TVFJVQ1Q6Ci0JY2FzZSBBSUZfVU5JT046Ci0JCXYzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7Ci0JCWlmICh2MyA9PSBOVUxMKQotCQkJdjMgPSBzdHJkdXAoIiIpOwotCQllbHNlCi0JCQl2MyA9IHN0cmR1cCh2Myk7Ci0JCXNucHJpbnRmKF9mZHNfYnVmLCBCVUZTSVotMSwgX2Zkc190eXBlX3N0clt0eXBlXSwgdjMpOwotCQlfYWlmX2ZyZWUodjMpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX1JBTkdFOgotCQl2MSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQl2MiA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQl2MyA9IHN0cmR1cCh2YV9hcmcoYXJncywgY2hhciAqKSk7Ci0KLQkJc25wcmludGYoX2Zkc19idWYsIEJVRlNJWi0xLCBfZmRzX3R5cGVfc3RyW3R5cGVdLCB2MSwgdjIsIHYzKTsKLQotCQlfYWlmX2ZyZWUodjMpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0FSUkFZOgotCQl2MyA9IHN0cmR1cCh2YV9hcmcoYXJncywgY2hhciAqKSk7Ci0JCXY0ID0gc3RyZHVwKHZhX2FyZyhhcmdzLCBjaGFyICopKTsKLQotCQlzbnByaW50ZihfZmRzX2J1ZiwgQlVGU0laLTEsIF9mZHNfdHlwZV9zdHJbdHlwZV0sIHYzLCB2NCk7Ci0KLQkJX2FpZl9mcmVlKHYzKTsKLQkJX2FpZl9mcmVlKHY0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9OQU1FOgotCWNhc2UgQUlGX1JFR0lPTjoKLQkJdjEgPSB2YV9hcmcoYXJncywgaW50KTsKLQkJdjMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKLQotCQlpZiAoIHYzID09IE5VTEwgKQotCQkJdjMgPSBzdHJkdXAoIiIpOwotCQllbHNlCi0JCQl2MyA9IHN0cmR1cCh2Myk7Ci0KLQkJc25wcmludGYoX2Zkc19idWYsIEJVRlNJWi0xLCBfZmRzX3R5cGVfc3RyW3R5cGVdLCB2MSwgdjMpOwotCi0JCV9haWZfZnJlZSh2Myk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfSU5WQUxJRDoKLQlkZWZhdWx0OgotCQlzbnByaW50ZihfZmRzX2J1ZiwgQlVGU0laLTEsIF9mZHNfdHlwZV9zdHJbQUlGX0lOVkFMSURdLCAwKTsKLQl9Ci0KLQl2YV9lbmQoYXJncyk7Ci0KLQlyZXR1cm4gX2Zkc19idWY7Ci19Ci0KLWludAotRkRTVHlwZUNvbXBhcmUoY2hhciAqZjEsIGNoYXIgKmYyKQotewotCWludAkJbjsKLQlpbnQJCXJlczsKLQljaGFyICoJCW4xOwotCWNoYXIgKgkJbjI7Ci0JY2hhciAqCQl0MTsKLQljaGFyICoJCXQyOwotCUFJRkluZGV4ICoJaXgxOwotCUFJRkluZGV4ICoJaXgyOwotCi0JaWYgKCAqZjEgPT0gRkRTX05BTUUgKQotCXsKLQkJZjEgPSBfZmRzX3NraXB0byhmMSwgX2Zkc19uYW1lX2VuZCk7Ci0JCWYxKys7Ci0JfQotCi0JaWYgKCAqZjIgPT0gRkRTX05BTUUgKQotCXsKLQkJZjIgPSBfZmRzX3NraXB0byhmMiwgX2Zkc19uYW1lX2VuZCk7Ci0JCWYyKys7Ci0JfQotCi0JaWYgKCBGRFNUeXBlKGYxKSAhPSBGRFNUeXBlKGYyKSApCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoICggRkRTVHlwZShmMSkgKQotCXsKLQljYXNlIEFJRl9FTlVNOgotCQlyZXMgPSBzdHJjbXAoZjEsIGYyKSA9PSAwOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0lOVEVHRVI6Ci0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JY2FzZSBBSUZfVk9JRDoKLQljYXNlIEFJRl9SRUdJT046Ci0JCXJlcyA9IEZEU1R5cGVTaXplKGYxKSA9PSBGRFNUeXBlU2l6ZShmMik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfUE9JTlRFUjoKLQljYXNlIEFJRl9GVU5DVElPTjoKLQkJcmVzID0gRkRTVHlwZUNvbXBhcmUoRkRTQmFzZVR5cGUoZjEpLCBGRFNCYXNlVHlwZShmMikpOwotCQlicmVhazsKLQotICAgICAgICBjYXNlIEFJRl9SRUZFUkVOQ0U6Ci0JCXJlcyA9IEZEU1R5cGUoZjIpID09IEZEU1R5cGUoZjEpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0FSUkFZOgotCQlpeDEgPSBGRFNBcnJheUluZGV4SW5pdChmMSk7Ci0JCWl4MiA9IEZEU0FycmF5SW5kZXhJbml0KGYxKTsKLQotCQlpZiAoIGl4MS0+aV9yYW5rICE9IGl4Mi0+aV9yYW5rICkKLQkJewotCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQkJCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWZvciAoIG4gPSAwIDsgbiA8IGl4MS0+aV9yYW5rIDsgbisrICkKLQkJewotCQkJaWYgKCBpeDEtPmlfbWF4W25dIC0gaXgxLT5pX21pbltuXSAhPSBpeDItPmlfbWF4W25dIC0gaXgyLT5pX21pbltuXSApCi0JCQl7Ci0JCQkJQUlGQXJyYXlJbmRleEZyZWUoaXgxKTsKLQkJCQlBSUZBcnJheUluZGV4RnJlZShpeDIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0KLQkJcmVzID0gRkRTVHlwZVNpemUoaXgxLT5pX2J0eXBlKSA9PSBGRFNUeXBlU2l6ZShpeDItPmlfYnR5cGUpOwotCi0JCUFJRkFycmF5SW5kZXhGcmVlKGl4MSk7Ci0JCUFJRkFycmF5SW5kZXhGcmVlKGl4Mik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfVU5JT046Ci0JY2FzZSBBSUZfU1RSVUNUOgotCQlpZiAoIEZEU051bUZpZWxkcyhmMSkgIT0gRkRTTnVtRmllbGRzKGYyKSApCi0JCXsKLQkJCXJlcyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZvciAoIG4gPSAwIDsgbiA8IEZEU051bUZpZWxkcyhmMSkgOyBuKysgKQotCQl7Ci0JCQlpZgotCQkJKAotCQkJCUZEU1N0cnVjdEZpZWxkQnlOdW1iZXIoZjEsIG4sICZuMSwgJnQxKSA8IDAgCi0JCQkJfHwKLQkJCQlGRFNTdHJ1Y3RGaWVsZEJ5TnVtYmVyKGYyLCBuLCAmbjIsICZ0MikgPCAwIAotCQkJKQotCQkJCXJldHVybiAwOwotCi0JCQlfYWlmX2ZyZWUobjEpOwotCQkJX2FpZl9mcmVlKG4yKTsKLQotCQkJaWYgKCAhRkRTVHlwZUNvbXBhcmUodDEsIHQyKSApCi0JCQl7Ci0JCQkJX2FpZl9mcmVlKHQxKTsKLQkJCQlfYWlmX2ZyZWUodDIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlfYWlmX2ZyZWUodDEpOwotCQkJX2FpZl9mcmVlKHQyKTsKLQkJfQotCi0JCXJlcyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfQ0hBUl9QT0lOVEVSOgotCWNhc2UgQUlGX1NUUklORzoKLQljYXNlIEFJRl9DSEFSQUNURVI6Ci0JCXJlcyA9IDE7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmVzID0gMDsKLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKiBBUlJBWSBST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBleHRyYWN0cyB0aGUgaW5kZXggdHlwZSBvZiBhbiBhcnJheSB0eXBlLCBzcGVjaWZpZWQgYnkgdGhlICAgICAgICAgICAgICAqLwotLyogdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGluZGV4IHR5cGUgZGVzY3JpcHRvciBpcyByZXR1cm5lZCBpZiBhIHZhbGlkIChub3QgYSBOVUxMKSBwb2ludGVyIHRvICAgICovCi0vKiBjaGFyIGlzIHBhc3NlZCBhcyBwYXJhbWV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC0xIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotY2hhciAqCi1GRFNBcnJheUluZGV4VHlwZShjaGFyICp0eXBlKQotewotCWNoYXIgKglwOwotCWNoYXIgKglwaTsKLQljaGFyICoJaW5kZXg7Ci0KLQlpZgotCSgKLQkJdHlwZSA9PSBOVUxMIAotCQl8fAotCQkqdHlwZSA9PSAnXDAnCi0JCXx8Ci0JCSp0eXBlICE9IEZEU19BUlJBWV9TVEFSVAotCQl8fAotCQkqKyt0eXBlICE9IEZEU19SQU5HRQotCSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwID0gX2Zkc19za2lwbnVtKCsrdHlwZSk7ICAgLyogc2tpcCBNaW5WYWx1ZSAqLwotCXAgKz0gMjsgICAgICAgICAgICAgICAgLyogc2tpcCAnLi4nICovCi0JcCA9IF9mZHNfc2tpcG51bShwKTsgICAgICAgIC8qIHNraXAgTWF4VmFsdWUgKi8KLQotCXBpID0gcDsKLQlwID0gX2Zkc19za2lwdG8ocCwgX2Zkc19hcnJheV9lbmQpOwotCSpwID0gMDsKLQotCWluZGV4ID0gc3RyZHVwKHBpKTsKLQotCSpwID0gRkRTX0FSUkFZX0VORDsKLQotCXJldHVybiBpbmRleDsKLX0KLQotaW50Ci1fZmRzX2FycmF5X21pbl9pbmRleChjaGFyICp0eXBlKQotewotCWlmICggKisrdHlwZSAhPSBGRFNfUkFOR0UgKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gX2Zkc19nZXRudW0oKyt0eXBlKTsKLX0KLQotaW50Ci1GRFNBcnJheU1pbkluZGV4KGNoYXIgKmZkcywgaW50IG4pCi17Ci0Jd2hpbGUgKCBGRFNUeXBlKGZkcykgPT0gQUlGX0FSUkFZICYmIG4gPiAwICkKLQl7Ci0JCWZkcyA9IF9mZHNfYmFzZV90eXBlKGZkcyk7Ci0JCW4tLTsKLQl9Ci0KLQlyZXR1cm4gKG4gPT0gMCkgPyBfZmRzX2FycmF5X21pbl9pbmRleChmZHMpIDogLTE7Ci19Ci0KLWludAotX2Zkc19hcnJheV9tYXhfaW5kZXgoY2hhciAqdHlwZSkKLXsKLQljaGFyICoJcDsKLQotCWlmICggKisrdHlwZSAhPSBGRFNfUkFOR0UgKQotCQlyZXR1cm4gLTE7Ci0KLQlwID0gX2Zkc19za2lwbnVtKCsrdHlwZSk7IC8qIHNraXAgTWluVmFsdWUgKi8KLQlwICs9IDI7ICAgICAgICAgICAgICAgIC8qIHNraXAgJy4uJyAqLwotCi0JcmV0dXJuIF9mZHNfZ2V0bnVtKHApOwotfQotCi1pbnQKLUZEU0FycmF5TWF4SW5kZXgoY2hhciAqZmRzLCBpbnQgbikKLXsKLQl3aGlsZSAoIEZEU1R5cGUoZmRzKSA9PSBBSUZfQVJSQVkgJiYgbiA+IDAgKQotCXsKLQkJZmRzID0gX2Zkc19iYXNlX3R5cGUoZmRzKTsKLQkJbi0tOwotCX0KLQotCXJldHVybiAobiA9PSAwKSA/IF9mZHNfYXJyYXlfbWF4X2luZGV4KGZkcykgOiAtMTsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgYW4gYXJyYXkuCi0gKi8KLWludAotRkRTQXJyYXlSYW5rKGNoYXIgKmZkcykKLXsKLQlpbnQJZCA9IDA7Ci0KLQl3aGlsZSAoIEZEU1R5cGUoZmRzKSA9PSBBSUZfQVJSQVkgKQotCXsKLQkJZmRzID0gX2Zkc19iYXNlX3R5cGUoZmRzKTsKLQkJZCsrOwotCX0KLQotCXJldHVybiBkOwotfQotCi0vKgotICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBzaXplIG9mIGFuIGFycmF5Ci0gKi8KLWludAotRkRTQXJyYXlTaXplKGNoYXIgKmZkcykKLXsKLQlpbnQJbWluOwotCWludAltYXg7Ci0JaW50CXNpemUgPSAxOwotCi0Jd2hpbGUgKCBGRFNUeXBlKGZkcykgPT0gQUlGX0FSUkFZICkKLQl7Ci0JCW1pbiA9IF9mZHNfYXJyYXlfbWluX2luZGV4KGZkcyk7Ci0JCW1heCA9IF9mZHNfYXJyYXlfbWF4X2luZGV4KGZkcyk7Ci0JCWZkcyA9IF9mZHNfYmFzZV90eXBlKGZkcyk7Ci0KLQkJc2l6ZSAqPSBtYXggLSBtaW4gKyAxOwotCX0KLQotCXJldHVybiBzaXplOwotfQotCi1jaGFyICoKLUZEU1JhbmdlSW5pdChpbnQgbWluLCBpbnQgbWF4KQotewotCXJldHVybiBzdHJkdXAoVHlwZVRvRkRTKEFJRl9SQU5HRSwgbWluLCBtYXgsICJpczQiKSk7Ci19Ci0KLWNoYXIgKgotRkRTQXJyYXlJbml0KGludCBtaW4sIGludCBtYXgsIGNoYXIgKmJ0eXBlKQotewotCWNoYXIgKglyZXM7Ci0JY2hhciAqCXJhbmdlID0gRkRTUmFuZ2VJbml0KG1pbiwgbWF4KTsKLQkKLQlyZXMgPSBzdHJkdXAoVHlwZVRvRkRTKEFJRl9BUlJBWSwgcmFuZ2UsIGJ0eXBlKSk7Ci0JX2FpZl9mcmVlKHJhbmdlKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogUGFyc2UgYXJyYXkgdHlwZSBkZXNjcmlwdG9yIGFuZCBleHRyYWN0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCi0gKiBhcnJheSBpbmRleCB2YWx1ZXMgZm9yIGVhY2ggZGltZW5zaW9uLiBBbHNvLCBpZiBzaXplIGlzIG5vdCBOVUxMLAotICogd2lsbCByZXR1cm4gdGhlIHNpemUgb2YgZGltZW5zaW9uLgotICovCi12b2lkCi1GRFNBcnJheUJvdW5kcyhjaGFyICpmZHMsIGludCByYW5rLCBpbnQgKiptaW4sIGludCAqKm1heCwgaW50ICoqc2l6ZSkKLXsKLQlpbnQJCWk7Ci0JaW50ICoJCW1uOwotCWludCAqCQlteDsKLQlpbnQgKgkJcz1OVUxMOwotCi0JKm1pbiA9IChpbnQgKilfYWlmX2FsbG9jKHJhbmsqc2l6ZW9mKGludCkpOwotCi0JKm1heCA9IChpbnQgKilfYWlmX2FsbG9jKHJhbmsqc2l6ZW9mKGludCkpOwotCi0JaWYoIHNpemUgIT0gTlVMTCApCi0JCSpzaXplID0gKGludCAqKV9haWZfYWxsb2MocmFuaypzaXplb2YoaW50KSk7Ci0KLQltbiA9ICptaW47Ci0JbXggPSAqbWF4OwotCi0JaWYgKCBzaXplICE9IE5VTEwgKQotCQlzID0gKnNpemU7Ci0KLQlmb3IgKCBpID0gMCA7IGkgPCByYW5rIDsgaSsrKQotCXsKLQkJKm1uID0gX2Zkc19hcnJheV9taW5faW5kZXgoZmRzKTsKLQkJKm14ID0gX2Zkc19hcnJheV9tYXhfaW5kZXgoZmRzKTsKLQotCQlpZiAoIHNpemUgIT0gTlVMTCApCi0JCXsKLQkJCSpzID0gKm14IC0gKm1uICsgMTsKLQkJCXMrKzsKLQkJfQotCi0JCWZkcyA9IF9mZHNfYmFzZV90eXBlKGZkcyk7Ci0KLQkJbW4rKzsKLQkJbXgrKzsKLQl9Ci19Ci0KLS8qCi0gKiBFeHRyYWN0IGluZm8gYWJvdXQgYW4gYXJyYXkuIFJldHVybnMgdGhlIGluZGV4IHR5cGUgb2YgdGhlCi0gKiBmaXJzdCBkaW1lbnNpb24gKGFzc3VtZXMgYWxsIGRpbWVuc2lvbnMgYXJlIHRoZSBzYW1lIHR5cGUpLAotICogdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJyYXksIGFuZCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKLSAqIG9mIHRoZSBhcnJheS4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZQotICogbWVtb3J5IGFsbG9jYXRlZCB0byBlbC4KLSAqIAotICovCi12b2lkCi1GRFNBcnJheUluZm8oY2hhciAqZmRzLCBpbnQgKnJhbmssIGNoYXIgKiplbCwgY2hhciAqKml4KQotewotCWludAlkOwotCi0JaWYgKCBpeCAhPSBOVUxMICkKLQkJKml4ID0gRkRTQXJyYXlJbmRleFR5cGUoZmRzKTsKLQotCWQgPSAwOwotCi0Jd2hpbGUgKCBGRFNUeXBlKGZkcykgPT0gQUlGX0FSUkFZICkKLQl7Ci0JCWZkcyA9IF9mZHNfYmFzZV90eXBlKGZkcyk7Ci0JCWQrKzsKLQl9Ci0KLQkqZWwgPSBzdHJkdXAoZmRzKTsKLQkqcmFuayA9IGQ7Ci19Ci0KLUFJRkluZGV4ICoKLUZEU0FycmF5SW5kZXhJbml0KGNoYXIgKmZtdCkKLXsKLQlpbnQJCWQ7Ci0JaW50CQluZWwgPSAxOwotCWludAkJcmFuazsKLQljaGFyICoJCWJ0eXBlOwotCUFJRkluZGV4ICoJaXg7Ci0KLQlGRFNBcnJheUluZm8oZm10LCAmcmFuaywgJmJ0eXBlLCBOVUxMKTsKLQotCWlmICggcmFuayA9PSAwICkKLQkJcmV0dXJuIChBSUZJbmRleCAqKU5VTEw7Ci0KLQlpeCA9IChBSUZJbmRleCAqKV9haWZfYWxsb2Moc2l6ZW9mKEFJRkluZGV4KSk7Ci0JaXgtPmlfZmluaXNoZWQgPSAwOwotCWl4LT5pX3JhbmsgPSByYW5rOwotCWl4LT5pX2J0eXBlID0gYnR5cGU7Ci0JaXgtPmlfYnNpemUgPSBGRFNUeXBlU2l6ZShpeC0+aV9idHlwZSk7Ci0JaXgtPmlfaW5kZXggPSAoaW50ICopX2FpZl9hbGxvYyhpeC0+aV9yYW5rICogc2l6ZW9mKGludCkpOwotCi0JRkRTQXJyYXlCb3VuZHMoZm10LCBpeC0+aV9yYW5rLCAmKGl4LT5pX21pbiksICYoaXgtPmlfbWF4KSwgKGludCAqKilOVUxMKTsKLQotCWZvciAoIGQgPSBpeC0+aV9yYW5rIC0gMSA7IGQgPj0gMCA7IGQtLSApCi0JewotCQluZWwgKj0gaXgtPmlfbWF4W2RdIC0gaXgtPmlfbWluW2RdICsgMTsKLQkJaXgtPmlfaW5kZXhbZF0gPSBpeC0+aV9taW5bZF07Ci0JfQotCi0JaXgtPmlfbmVsID0gbmVsOwotCi0JcmV0dXJuIGl4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKiBTVFJVQ1QgUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoZSBmZHMgb2YgYSBzdHJ1Y3QgaGFzIHRoaXMgZm9ybWF0OgotICoKLSAqICB7bmFtZXxlbnRyeSwuLi47ZW50cnksLi4uO2VudHJ5LC4uLjtlbnRyeSwuLi59Ci0gKgotICogIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSwgb3IgZW1wdHkgZm9yIGFuIHVubmFtZWQgdHlwZQotICogIGVhY2ggZW50cnkgaGFzIHRoZSBmb3JtYXQgIm5hbWU9dHlwZSIKLSAqICBhIHN0cnVjdHVyZSBjb21wcmlzZXMgNCBzZWN0aW9ucyBzZXBlcmF0ZWQgYnkgJzsnLCBjb3JyZXNwb25kaW5nCi0gKiAgICB0byBwdWJsaWMsIHByaXZhdGUsIHByb3RlY3RlZCBhbmQgaGlkZGVuIG1lbWJlcnMgCi0gKi8KLQotI2RlZmluZSBTVFJVQ1RfU1RBUlQoZmRzLCByZXMpIFwKLQlpZiAoKihmZHMpID09IEZEU19OQU1FKSB7IFwKLQkJKGZkcykgPSBfZmRzX3NraXB0bygoZmRzKSwgX2Zkc19uYW1lX2VuZCk7IFwKLQkJKGZkcykrKzsgXAotCX0gXAotCWlmICggKihmZHMrKykgIT0gRkRTX1NUUlVDVF9TVEFSVCApIFwKLQkJcmV0dXJuIChyZXMpOyBcCi0Jd2hpbGUgKCAqKGZkcykgIT0gRkRTX0lEICkgXAotCQkoZmRzKSsrOyBcCi0JKGZkcykrKzsgXAotCWlmICggKihmZHMpID09ICdcMCcgKSBcCi0JCXJldHVybiAocmVzKTsgXAotCXdoaWxlICggKihmZHMpID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApIFwKLQkJKGZkcykrKzsgXAotCWlmICggKihmZHMpID09IEZEU19TVFJVQ1RfRU5EICkgXAotCQlyZXR1cm4gKHJlcyk7Ci0KLWNoYXIgKgotX2Zkc19za2lwdG9tYXRjaChjaGFyICpmZHMpCi17Ci0JY2hhcgllbmRlcjsKLQotCS8qCi0JKiogYXNzZXJ0ICpmZHMgPT0gJ3snIG9yICdbJzsgZmluZCB0aGUgbWF0Y2hpbmcgJ30nIG9yICddJwotCSovCi0KLQlzd2l0Y2ggKCAqZmRzICkKLQl7Ci0JY2FzZSBGRFNfU1RSVUNUX1NUQVJUOgotCQllbmRlciA9IEZEU19TVFJVQ1RfRU5EOwotCQlicmVhazsKLQotCWNhc2UgRkRTX0FSUkFZX1NUQVJUOgotCQllbmRlciA9IEZEU19BUlJBWV9FTkQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfRU5VTV9TVEFSVDoKLQkJZW5kZXIgPSBGRFNfRU5VTV9FTkQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfVU5JT05fU1RBUlQ6Ci0JCWVuZGVyID0gRkRTX1VOSU9OX0VORDsKLQkJYnJlYWs7Ci0JfQotCi0JZmRzKys7Ci0KLQlmb3IgKCA7OyApCi0JewotCQlpZiAoICpmZHMgPT0gZW5kZXIgKQotCQkJcmV0dXJuIGZkczsKLQotCQlpZgotCQkoCi0JCQkqZmRzID09IEZEU19TVFJVQ1RfU1RBUlQgCi0JCQl8fCAKLQkJCSpmZHMgPT0gRkRTX1VOSU9OX1NUQVJUIAotCQkJfHwgCi0JCQkqZmRzID09IEZEU19BUlJBWV9TVEFSVCAKLQkJCXx8IAotCQkJKmZkcyA9PSBGRFNfRU5VTV9TVEFSVAotCQkpCi0JCQlmZHMgPSBfZmRzX3NraXB0b21hdGNoKGZkcyk7Ci0KLQkJZmRzKys7Ci0JfQotfQotCi0vKgotICogVGhlIGZ1bmN0aW9uIGlnbm9yZXMgYWNjZXNzIHNwZWNpZmllcnMKLSAqLwotY2hhciAqCi1fZmRzX3NraXB0b2ZpZWxkKGNoYXIgKmZkcywgaW50IG4pCi17Ci0JU1RSVUNUX1NUQVJUKGZkcywgTlVMTCk7Ci0KLQl3aGlsZSAoICpmZHMgIT0gJ1wwJyAmJiAqZmRzICE9IEZEU19TVFJVQ1RfRU5EICYmIG4gPiAwICkKLQl7Ci0JCWlmICggKmZkcyA9PSBGRFNfU1RSVUNUX0ZJRUxEX1NFUCApCi0JCQluLS07Ci0JCWVsc2UgaWYgKCAqZmRzID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCXsKLQkJCWlmIAotCQkJKCAKLQkJCSAJKihmZHMrMSkgIT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQCi0JCQkJJiYKLQkJCQkqKGZkcysxKSAhPSBGRFNfU1RSVUNUX0VORAotCQkJKQotCQkJCW4tLTsKLQkJfQotCQllbHNlIGlmCi0JCSgKLQkJCSpmZHMgPT0gRkRTX1NUUlVDVF9TVEFSVCAKLQkJCXx8IAotCQkJKmZkcyA9PSBGRFNfVU5JT05fU1RBUlQgCi0JCQl8fCAKLQkJCSpmZHMgPT0gRkRTX0FSUkFZX1NUQVJUIAotCQkJfHwgCi0JCQkqZmRzID09IEZEU19FTlVNX1NUQVJUCi0JCSkKLQkJCWZkcyA9IF9mZHNfc2tpcHRvbWF0Y2goZmRzKTsKLQotCQlmZHMrKzsKLQotCX0KLQotCWlmICggKmZkcyA9PSAnXDAnIHx8ICpmZHMgPT0gRkRTX1NUUlVDVF9FTkQgKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBmZHM7Ci19Ci0KLS8qCi0gKiBUaGUgZnVuY3Rpb24gaWdub3JlcyBhY2Nlc3Mgc3BlY2lmaWVycywgaWU6IHRvdGFsIG51bWJlciBvZiBmaWVsZHMKLSAqLwotaW50Ci1GRFNOdW1GaWVsZHMoY2hhciAqZmRzKQotewotCWludAluID0gMDsKLQotCWlmICgqZmRzID09IEZEU19OQU1FKSAKLQl7Ci0JCWZkcyA9IF9mZHNfc2tpcHRvKGZkcywgX2Zkc19uYW1lX2VuZCk7Ci0JCWZkcysrOwotCX0KLQotCWlmICggKihmZHMrKykgIT0gRkRTX1NUUlVDVF9TVEFSVCApCi0JCXJldHVybiAtMTsKLQotCXdoaWxlICggKihmZHMpICE9IEZEU19JRCApCi0JCShmZHMpKys7Ci0JKGZkcykrKzsKLQotCWlmICggKmZkcyA9PSAnXDAnICkKLQkJcmV0dXJuIC0xOwotCi0Jd2hpbGUgKCAqZmRzID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCShmZHMpKys7Ci0KLQlpZiAoICpmZHMgPT0gRkRTX1NUUlVDVF9FTkQgKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlICggKmZkcyAhPSAnXDAnICYmICpmZHMgIT0gRkRTX1NUUlVDVF9FTkQgKQotCXsKLQkJaWYgKCAqZmRzID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkKLQkJCW4rKzsKLQkJZWxzZSBpZiAoICpmZHMgPT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLQkJewotCQkJaWYgCi0JCQkoIAotCQkJIAkqKGZkcysxKSAhPSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAKLQkJCQkmJgotCQkJCSooZmRzKzEpICE9IEZEU19TVFJVQ1RfRU5ECi0JCQkpCi0JCQkJbisrOwotCQl9Ci0JCWVsc2UgaWYKLQkJKAotCQkJKmZkcyA9PSBGRFNfU1RSVUNUX1NUQVJUIAotCQkJfHwgCi0JCQkqZmRzID09IEZEU19VTklPTl9TVEFSVCAKLQkJCXx8IAotCQkJKmZkcyA9PSBGRFNfQVJSQVlfU1RBUlQgCi0JCQl8fCAKLQkJCSpmZHMgPT0gRkRTX0VOVU1fU1RBUlQKLQkJKQotCQkJZmRzID0gX2Zkc19za2lwdG9tYXRjaChmZHMpOwotCi0JCWZkcysrOwotCX0KLQotCXJldHVybiBuICsgMTsKLX0KLQotLyoKLSAqIFJldHVybnMgYSBuZXdseSBhbGxvY2VkIHN0cmluZyBmb3IgbmFtZSBhbmQgdHlwZQotICogVGhlIGZ1bmN0aW9uIGlnbm9yZXMgYWNjZXNzIHNwZWNpZmllcnMKLSAqLwotaW50Ci1GRFNTdHJ1Y3RGaWVsZEJ5TnVtYmVyKGNoYXIgKmZkcywgaW50IG4sIGNoYXIgKipuYW1lLCBjaGFyICoqdHlwZSkKLXsKLQlpZiAoIChmZHMgPSBfZmRzX3NraXB0b2ZpZWxkKGZkcywgbikpID09IE5VTEwgKQotCQlyZXR1cm4gLTE7Ci0KLSAgICAgICAgaWYgKCAoKm5hbWUgPSBfZmllbGRfYXR0cmlidXRlKGZkcywgTlVMTCwgX2Zkc19zdHJ1Y3RfZmllbGRfbmFtZV9lbmQpKSA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCi0gICAgICAgIGlmICggKCp0eXBlID0gX2ZpZWxkX2F0dHJpYnV0ZShmZHMsIF9mZHNfc3RydWN0X2ZpZWxkX25hbWVfZW5kLCBfZmRzX3N0cnVjdF9maWVsZF9lbmQpKSA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIGEgbmV3bHkgYWxsb2NlZCBzdHJpbmcgZm9yIHR5cGUKLSAqIFRoZSBmdW5jdGlvbiBpZ25vcmVzIGFjY2VzcyBzcGVjaWZpZXJzCi0gKi8KLWludAotRkRTU3RydWN0RmllbGRCeU5hbWUoY2hhciAqZmRzLCBjaGFyICpuYW1lLCBjaGFyICoqdHlwZSkKLXsKLQljaGFyICoJbm07Ci0KLQlTVFJVQ1RfU1RBUlQoZmRzLCAtMSk7Ci0KLQl3aGlsZSAoICpmZHMgIT0gJ1wwJyAmJiAqZmRzICE9IEZEU19TVFJVQ1RfRU5EICkKLQl7Ci0JCW5tID0gZmRzOwotCi0JCWZkcyA9IF9mZHNfc2tpcHRvKGZkcywgX2Zkc19zdHJ1Y3RfZmllbGRfbmFtZV9lbmQpOwotCi0JCWlmICggKmZkcyA9PSAnXDAnICkKLQkJCXJldHVybiAtMTsKLQotCQkqZmRzID0gJ1wwJzsgLyogdGVtcG9yYXJpbHkgKi8KLQotCQlpZiAoIHN0cmNtcChubSwgbmFtZSkgPT0gMCApCi0JCXsKLQkJCSpmZHMgPSBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgqdHlwZSA9IF9maWVsZF9hdHRyaWJ1dGUoCi0JCQkJCQlubSwKLQkJCQkJCV9mZHNfc3RydWN0X2ZpZWxkX25hbWVfZW5kLCAKLQkJCQkJCV9mZHNfc3RydWN0X2ZpZWxkX2VuZAotCQkJCQkJKSkgPT0gTlVMTCApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlCi0JCQkqZmRzID0gRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORDsKLQotCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfc3RydWN0X2ZpZWxkX2VuZCk7Ci0JCWZkcysrOwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIEFycmFuZ2UgdGhlIG1lbWJlcnMgb2YgQUlGIHN0cnVjdCBkZWZpbmVkIGJ5IGZkcyBhbmQgZGF0YSBpbnRvIGEgbmV3X2ZkcwotICogYW5kIGEgbmV3X2RhdGEgc28gdGhhdCB0aGUgRkRTIGxvb2tzIGxpa2UgZmRzcmVmCi0gKgotICogSWYgbnVtYmVyX29mX21lbWJlcnMgb2YgZmRzcmVmID4gbnVtYmVyX29mX21lbWJlcnMgb2YgZmRzIAotICoJcmV0dXJucyAtMQotICogRWxzZQotICogCWNyZWF0ZXMgdGhlIG5ld19mZHMgYW5kIG5ld19kYXRhIGFjY29yZGluZ2x5IGFuZCByZXR1cm5zIDAKLSAqCi0gKiBJZiBmZHMgZ290IG1vcmUgbWVtYmVycywgdGhlIHJlc3Qgd2lsbCBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kLCBzbwotICogZmRzcmVmIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgcHJlZml4IG9mIGZkcy4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIHRoZSBwdWJsaWMgc2VjdGlvbi4KLSAqIEl0IGRvZXMgbm90IGNoYW5nZSBmZHNyZWYsIGZkcyBhbmQgZGF0YS4KLSAqIEl0IGFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciBuZXdfZmRzIGFuZCBuZXdfZGF0YQotICovCi1pbnQKLV9mZHNfc3RydWN0X2FycmFuZ2UoY2hhciAqZmRzcmVmLCBjaGFyICpmZHMsIGNoYXIgKmRhdGEsIGNoYXIgKipuZXdfZmRzLCBjaGFyICoqbmV3X2RhdGEpCi17Ci0JY2hhciAqIHB0cl9mZHMgPSBmZHM7Ci0JY2hhciAqIHB0cl9kYXRhID0gZGF0YTsKLQlpbnQgbGVuX25ld19mZHM7Ci0JaW50IGxlbl9uZXdfZGF0YTsKLQlpbnQgbnVtYmVyX2ZkcyA9IDA7CS8qIG51bWJlcl9vZl9tZW1iZXJzIG9mIGZkcyAqLwotCWludCBudW1iZXJfZmRzcmVmID0gMDsJLyogbnVtYmVyX29mX21lbWJlcnMgb2YgZmRzcmVmICovCi0KLQljaGFyICogdG1wOwotCWludCBuOwotCi0JY2hhciAqKiBmZHNfbWVtYmVyczsKLQljaGFyICoqIGRhdGFfbWVtYmVyczsKLQlpbnQgKiBmZHNfbWVtYmVyc19sZW47Ci0JaW50ICogZGF0YV9tZW1iZXJzX2xlbjsKLQlpbnQgKiBmZHNfbWVtYmVyc19mbGFnOyAvKiB0byBmbGFnIHRoYXQgdGhlIG1lbWJlciBoYXMgYmVlbiBjb3BpZWQgKi8KLQotCS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyX29mX21lbWJlcnMgb2YgZmRzIGFuZCBmZHNyZWYKLQkqKiB3ZSBkbyBub3QgdXNlIEZEU051bUZpZWxkcygpIHNpbmNlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlCi0JKiogcHVibGljIHNlY3Rpb24gKi8KLQl0bXAgPSBmZHM7Ci0JU1RSVUNUX1NUQVJUKHRtcCwgLTEpOwotCXdoaWxlICggKnRtcCAhPSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAgKQotCXsKLQkJdG1wID0gc3RyY2hyKHRtcCwgRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORCkgKyAxOwotCQlpZgotCQkoCi0gICAgICAgICAgICAgICAgICAgICAgICAqdG1wID09IEZEU19TVFJVQ1RfU1RBUlQgfHwgKnRtcCA9PSBGRFNfVU5JT05fU1RBUlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICp0bXAgPT0gRkRTX0FSUkFZX1NUQVJUIHx8ICp0bXAgPT0gRkRTX0VOVU1fU1RBUlQKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBfZmRzX3NraXB0b21hdGNoKHRtcCkgKyAxOwotCi0JCXRtcCA9IF9mZHNfc2tpcHRvKHRtcCwgX2Zkc19zdHJ1Y3RfZmllbGRfZW5kKTsKLQkJbnVtYmVyX2ZkcysrOwotCX0KLQotCXRtcCA9IGZkc3JlZjsKLQlTVFJVQ1RfU1RBUlQodG1wLCAtMSk7Ci0Jd2hpbGUgKCAqdG1wICE9IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JewotCQl0bXAgPSBzdHJjaHIodG1wLCBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EKSArIDE7Ci0JCWlmCi0JCSgKLSAgICAgICAgICAgICAgICAgICAgICAgICp0bXAgPT0gRkRTX1NUUlVDVF9TVEFSVCB8fCAqdG1wID09IEZEU19VTklPTl9TVEFSVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKnRtcCA9PSBGRFNfQVJSQVlfU1RBUlQgfHwgKnRtcCA9PSBGRFNfRU5VTV9TVEFSVAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IF9mZHNfc2tpcHRvbWF0Y2godG1wKSArIDE7Ci0KLQkJdG1wID0gX2Zkc19za2lwdG8odG1wLCBfZmRzX3N0cnVjdF9maWVsZF9lbmQpOwotCQludW1iZXJfZmRzcmVmKys7Ci0JfQotCi0JLyogY2hlY2sgZm9yIHRoZSBudW1iZXJfb2ZfbWVtYmVyIHZhcmlhYmxlcyAqLwotCWlmICggbnVtYmVyX2Zkc3JlZiA+IG51bWJlcl9mZHMgKQotCQlyZXR1cm4gLTE7Ci0JCi0JLyogYWxsb2NhdGUgbmV3X2ZkcyBhbmQgbmV3X2RhdGEgKi8KLQlfZmRzX3NraXBfZGF0YSgmcHRyX2ZkcywgJnB0cl9kYXRhKTsKLQlsZW5fbmV3X2ZkcyA9IHB0cl9mZHMgLSBmZHM7Ci0JbGVuX25ld19kYXRhID0gcHRyX2RhdGEgLSBkYXRhOwotCWlmICgqbmV3X2ZkcyA9PSBOVUxMKQotCQkqbmV3X2ZkcyA9IF9haWZfYWxsb2MobGVuX25ld19mZHMpOwotCWlmICgqbmV3X2RhdGEgPT0gTlVMTCkKLQkJKm5ld19kYXRhID0gX2FpZl9hbGxvYyhsZW5fbmV3X2RhdGEpOwotCi0JLyogd2UgZGl2aWRlIGZkcyBhbmQgZGF0YSBpbnRvIHNldmVyYWwgZmllbGRzL21lbWJlcnMKLQkqKiB3ZSBzdG9yZSB0aGUgcG9pbnRlcnMgZm9yIGVhc3kgcmV0cmlldmFsICovCi0JZmRzX21lbWJlcnMgPSAoY2hhciAqKikgX2FpZl9hbGxvYyhzaXplb2YoY2hhciAqKSAqIG51bWJlcl9mZHMpOwotCWZkc19tZW1iZXJzX2xlbiA9IChpbnQgKikgX2FpZl9hbGxvYyhzaXplb2YoaW50KSAqIG51bWJlcl9mZHMpOwotCWRhdGFfbWVtYmVycyA9IChjaGFyICoqKSBfYWlmX2FsbG9jKHNpemVvZihjaGFyICopICogbnVtYmVyX2Zkcyk7Ci0JZGF0YV9tZW1iZXJzX2xlbiA9IChpbnQgKikgX2FpZl9hbGxvYyhzaXplb2YoaW50KSAqIG51bWJlcl9mZHMpOwotCWZkc19tZW1iZXJzX2ZsYWcgPSAoaW50ICopIF9haWZfYWxsb2Moc2l6ZW9mKGludCkgKiBudW1iZXJfZmRzKTsKLQotCXB0cl9mZHMgPSBmZHM7Ci0JcHRyX2RhdGEgPSBkYXRhOwotCVNUUlVDVF9TVEFSVChwdHJfZmRzLCAtMSk7Ci0JZm9yIChuPTA7IG48bnVtYmVyX2ZkczsgbisrKQotCXsKLQkJZmRzX21lbWJlcnNbbl0gPSBwdHJfZmRzOwotCQlkYXRhX21lbWJlcnNbbl0gPSBwdHJfZGF0YTsKLQotCQlwdHJfZmRzID0gc3RyY2hyKHB0cl9mZHMsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsKLQkJX2Zkc19za2lwX2RhdGEoJnB0cl9mZHMsICZwdHJfZGF0YSk7Ci0JCWZkc19tZW1iZXJzX2xlbltuXSA9IHB0cl9mZHMgLSBmZHNfbWVtYmVyc1tuXTsKLQkJZGF0YV9tZW1iZXJzX2xlbltuXSA9IHB0cl9kYXRhIC0gZGF0YV9tZW1iZXJzW25dOwotCi0JCWZkc19tZW1iZXJzX2ZsYWdbbl0gPSAwOwotCi0JCXB0cl9mZHMrKzsJCi0JfQotCi0JLyogd2Ugc3RhcnQgYnVpbGRpbmcgdXAgdGhlIG5ld19mZHMgYW5kIG5ld19kYXRhICovCi0JcHRyX2ZkcyA9IGZkczsKLQlTVFJVQ1RfU1RBUlQocHRyX2ZkcywgLTEpOwotCW1lbWNweSgqbmV3X2ZkcywgZmRzLCBwdHJfZmRzIC0gZmRzKTsgLyogY29weSB0aGUgaWQgdG8gdGhlIG5ld19mZHMgKi8KLQotCXB0cl9mZHMgPSAqbmV3X2ZkcyArIChwdHJfZmRzIC0gZmRzKTsKLQlwdHJfZGF0YSA9ICpuZXdfZGF0YTsKLQotCXRtcCA9IGZkc3JlZjsKLQlTVFJVQ1RfU1RBUlQodG1wLCAtMSk7Ci0Jd2hpbGUgKCAqdG1wICE9IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JewotCQljaGFyIGVuZGNoYXIsICplbmQ7Ci0KLQkJaWYgKCAqdG1wID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkgdG1wKys7Ci0JCWVuZCA9IHRtcDsKLQkJZW5kID0gX2Zkc19za2lwdG8oZW5kLCBfZmRzX3N0cnVjdF9maWVsZF9lbmQpOwotCQllbmRjaGFyID0gKmVuZDsgLyogd2Ugc3RvcmUgKmVuZCBzaW5jZSAqZW5kIGNhbiBiZSAnLCcgb3IgJzsnICovCi0JCSplbmQgPSAnXDAnOyAvKiB0ZW1wb3JhcmlseSAqLwotCi0JCWZvciAobj0wOyBuPG51bWJlcl9mZHM7IG4rKykKLQkJewotCQkJLyogd2UgY2hlY2sgdGhlIGZkc19tZW1iZXJzX2ZsYWcgc28gdGhlIGZ1bmN0aW9uIGNhbgotCQkJKiogcnVuIGZhc3RlciBmb3IgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzICovCi0JCQlpZiAoIGZkc19tZW1iZXJzX2ZsYWdbbl0gPT0gMCApCi0JCQl7Ci0JCQkJLyogdG1wIGFuZCBmZHNfbWVtYmVyc1sqXSBjb250YWluCi0JCQkJKiogJ2ZpZWxkX25hbWU9ZmllbGRfdHlwZScsIGJ1dCB3ZSBvbmx5IHdhbnQKLQkJCQkqKiB0byBjb21wYXJlIGZpZWxkX25hbWUgKi8KLQkJCQljaGFyICogdGVtcF9hID0gc3RyY2hyKHRtcCwgRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORCk7Ci0JCQkJY2hhciAqIHRlbXBfYiA9IHN0cmNocihmZHNfbWVtYmVyc1tuXSwgRkRTX1NUUlVDVF9GSUVMRF9OQU1FX0VORCk7Ci0JCQkJaW50IHN0cmNtcF9yZXM7Ci0JCQkJKnRlbXBfYSA9ICp0ZW1wX2IgPSAnXDAnOyAvKiB0ZW1wb3JhcmlseSAqLwotCQkJCXN0cmNtcF9yZXMgPSBzdHJjbXAodG1wLCBmZHNfbWVtYmVyc1tuXSk7Ci0JCQkJKnRlbXBfYSA9ICp0ZW1wX2IgPSBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EOwotCQkJCWlmIChzdHJjbXBfcmVzID09IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKG4gPT0gbnVtYmVyX2ZkcykgLyogbm90IGZvdW5kLCBhbiBlcnJvciAqLwotCQl7Ci0JCQkqZW5kID0gZW5kY2hhcjsKLQkJCV9haWZfZnJlZShmZHNfbWVtYmVycyk7Ci0JCQlfYWlmX2ZyZWUoZmRzX21lbWJlcnNfbGVuKTsKLQkJCV9haWZfZnJlZShmZHNfbWVtYmVyc19mbGFnKTsKLQkJCV9haWZfZnJlZShkYXRhX21lbWJlcnMpOwotCQkJX2FpZl9mcmVlKGRhdGFfbWVtYmVyc19sZW4pOwotCQkJX2FpZl9mcmVlKCpuZXdfZmRzKTsKLQkJCV9haWZfZnJlZSgqbmV3X2RhdGEpOwotCQkJIHJldHVybiAtMTsKLQkJfQotCi0JCW1lbWNweShwdHJfZGF0YSwgZGF0YV9tZW1iZXJzW25dLCBkYXRhX21lbWJlcnNfbGVuW25dKTsKLQkJbWVtY3B5KHB0cl9mZHMsIGZkc19tZW1iZXJzW25dLCBmZHNfbWVtYmVyc19sZW5bbl0pOwotCQlmZHNfbWVtYmVyc19mbGFnW25dID0gMTsKLQkJcHRyX2RhdGEgKz0gZGF0YV9tZW1iZXJzX2xlbltuXTsKLQkJcHRyX2ZkcyArPSBmZHNfbWVtYmVyc19sZW5bbl07Ci0JCSplbmQgPSBlbmRjaGFyOwotCQkqKHB0cl9mZHMrKykgPSBGRFNfU1RSVUNUX0ZJRUxEX1NFUDsKLQkJdG1wID0gZW5kOwotCX0KLQotCS8qIGNvcHkgbWVtYmVycyB3aGljaCBoYXZlIG5vdCBiZWVuIGNvcGllZCAqLwotCWlmICggbnVtYmVyX2ZkcyA+IG51bWJlcl9mZHNyZWYgKQotCXsKLQkJZm9yIChuPTA7IG48bnVtYmVyX2ZkczsgbisrKQotCQl7Ci0JCQlpZiAoIGZkc19tZW1iZXJzX2ZsYWdbbl0gPT0gMCApCi0JCQl7Ci0JCQkJbWVtY3B5KHB0cl9kYXRhLCBkYXRhX21lbWJlcnNbbl0sIGRhdGFfbWVtYmVyc19sZW5bbl0pOwotCQkJCW1lbWNweShwdHJfZmRzLCBmZHNfbWVtYmVyc1tuXSwgZmRzX21lbWJlcnNfbGVuW25dKTsKLQkJCQlwdHJfZGF0YSArPSBkYXRhX21lbWJlcnNfbGVuW25dOwotCQkJCXB0cl9mZHMgKz0gZmRzX21lbWJlcnNfbGVuW25dOwotCQkJCSoocHRyX2ZkcysrKSA9IEZEU19TVFJVQ1RfRklFTERfU0VQOwotCQkJfQotCQl9Ci0JfQotCi0JLyogY29weSB0aGUgcmVzdCBvZiB0aGUgZmRzIHRvIHRoZSBuZXdfZmRzICovCi0JcHRyX2Zkcy0tOwotCW1lbWNweShwdHJfZmRzLCBmZHNfbWVtYmVyc1tudW1iZXJfZmRzLTFdICsgZmRzX21lbWJlcnNfbGVuW251bWJlcl9mZHMtMV0sIGxlbl9uZXdfZmRzIC0gKHB0cl9mZHMgLSAqbmV3X2ZkcykpOwotCi0JX2FpZl9mcmVlKGZkc19tZW1iZXJzKTsKLQlfYWlmX2ZyZWUoZmRzX21lbWJlcnNfbGVuKTsKLQlfYWlmX2ZyZWUoZmRzX21lbWJlcnNfZmxhZyk7Ci0JX2FpZl9mcmVlKGRhdGFfbWVtYmVycyk7Ci0JX2FpZl9mcmVlKGRhdGFfbWVtYmVyc19sZW4pOwotCXJldHVybiAwOwotfQotCi1pbnQKLUZEU1N0cnVjdEZpZWxkU2l6ZShjaGFyICpmZHMsIGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqdHlwZTsKLQlpbnQgICBzaXplOwotCi0JaWYgKCBGRFNTdHJ1Y3RGaWVsZEJ5TmFtZShmZHMsIG5hbWUsICZ0eXBlKSApCi0JewotICAgICAgICAgICAgICAgIFNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9Ci0KLQlzaXplID0gRkRTVHlwZVNpemUodHlwZSk7Ci0JX2FpZl9mcmVlKHR5cGUpOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLS8qCi0gKiBUaGUgZnVuY3Rpb24gaWdub3JlcyBhY2Nlc3Mgc3BlY2lmaWVycwotICogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpZWxkCi0gKiB0aGUgY291bnRlciBzdGFydHMgYXQgMCwgaWU6IGZpcnN0IGVsZW1lbnQgaXMgYXQgcG9zaXRpb24gMAotICogaWYgdGhlIGZpZWxkIGNhbm5vdCBiZSBmb3VuZCwgaXQgcmV0dXJucyAtMQotICovCi1pbnQKLUZEU1N0cnVjdEZpZWxkSW5kZXgoY2hhciAqZmRzLCBjaGFyICpuYW1lKQotewotCWludAljb3VudGVyID0gMDsKLQlpbnQJbGVuOwotCWNoYXIgKglubTsKLQotCVNUUlVDVF9TVEFSVChmZHMsIC0xKTsKLQotCXdoaWxlICggKmZkcyAhPSAnXDAnICYmICpmZHMgIT0gRkRTX1NUUlVDVF9FTkQgKQotCXsKLQkJbm0gPSBmZHM7Ci0KLQkJZmRzID0gX2Zkc19za2lwdG8oZmRzLCBfZmRzX3N0cnVjdF9maWVsZF9uYW1lX2VuZCk7Ci0KLQkJaWYgKCAqZmRzID09ICdcMCcgKQotCQkJcmV0dXJuIC0xOwotCi0JCWxlbiA9IGZkcyAtIG5tOwotCi0JCWlmICggc3RybmNtcChubSwgbmFtZSwgbGVuKSA9PSAwICkKLQkJCXJldHVybiBjb3VudGVyOwotCi0JCWNvdW50ZXIrKzsKLQkJZmRzID0gX2Zkc19za2lwdG8oZmRzLCBfZmRzX3N0cnVjdF9maWVsZF9lbmQpOwotCQlmZHMrKzsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLWNoYXIgKgotRkRTU3RydWN0SW5pdChjaGFyICppZCkKLXsKLQlyZXR1cm4gc3RyZHVwKFR5cGVUb0ZEUyhBSUZfU1RSVUNULCBpZCkpOwotfQotCi0vKgotICogcHV0cyB0aGUgbmV3IGZpZWxkIGluIHRoZSBwdWJsaWMgc2VjdGlvbiAKLSAqLwotY2hhciAqCi1GRFNBZGRGaWVsZFRvU3RydWN0KGNoYXIgKmZkcywgY2hhciAqbmFtZSwgY2hhciAqdHlwZSkKLXsKLQlyZXR1cm4gRkRTQWRkRmllbGRUb0NsYXNzKGZkcywgQUlGQUNDX1BVQkxJQywgbmFtZSwgdHlwZSk7Ci19Ci0KLWludAotRkRTU3RydWN0QWRkKGNoYXIgKipmZHMsIGNoYXIgKm5hbWUsIGNoYXIgKnR5cGUpCi17Ci0JY2hhciAqIHRlbXA7Ci0KLQl0ZW1wID0gRkRTQWRkRmllbGRUb1N0cnVjdCgqZmRzLCBuYW1lLCB0eXBlKTsKLQotCWlmICggdGVtcCA9PSBOVUxMICkgCi0JCXJldHVybiAtMTsKLQotCV9haWZfZnJlZSgqZmRzKTsKLQkqZmRzID0gdGVtcDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogcmV0dXJucyB0aGUgZGF0YSBsZW5ndGggZnJvbSBmaWVsZCAwIHVudGlsIGZpZWxkIG4gKGluY2x1c2l2ZSkKLSAqLwotaW50Ci1fZGF0YV9sZW5faW5kZXgoY2hhciAqZmRzLCBpbnQgbikKLXsKLQlpbnQgc2l6ZSA9IDA7Ci0JaW50IHN1YnNpemUgPSAwOwotCi0JU1RSVUNUX1NUQVJUKGZkcywgLTEpOwotCQkKLQl3aGlsZSAoICpmZHMgIT0gJ1wwJyAmJiAqZmRzICE9IEZEU19TVFJVQ1RfRU5EICYmIG4gPj0gMCApCi0JewotCQlpZiAoICpmZHMgPT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLQkJewotCQkJZmRzKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWZkcyA9IF9mZHNfc2tpcHRvKGZkcywgX2Zkc19zdHJ1Y3RfZmllbGRfbmFtZV9lbmQpOwotCi0JCWlmICggKmZkcysrID09ICdcMCcgKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogdG8gc3RhcnQgb2YgZmllbGQgKi8KLQkJaWYgKCAoc3Vic2l6ZSA9IEZEU1R5cGVTaXplKGZkcykpIDwgMCApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJc2l6ZSArPSBzdWJzaXplOwotCi0JCW4tLTsKLQotCQlfZmRzX2FkdmFuY2UoJmZkcyk7Ci0KLQkJaWYgKCAqZmRzID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkKLQkJCWZkcysrOwotCX0KLQotCXJldHVybiBzaXplOwotfQotCi1pbnQKLV9kYXRhX2xlbl9wdWJsaWMoY2hhciAqZmRzKQotewotCWludCBzaXplID0gMDsKLQlpbnQgc3Vic2l6ZSA9IDA7Ci0KLQlpZiAoKihmZHMpID09IEZEU19OQU1FKSB7IAotICAgICAgICAJKGZkcykgPSBfZmRzX3NraXB0bygoZmRzKSwgX2Zkc19uYW1lX2VuZCk7IAotICAgICAgICAJKGZkcykrKzsgCi0JfSAKLQlpZiAoICooZmRzKyspICE9IEZEU19TVFJVQ1RfU1RBUlQgKSAKLSAgICAgICAgCXJldHVybiAtMTsKLQotICAgICAgICB3aGlsZSAoICooZmRzKSAhPSBGRFNfSUQgKSAKLSAgICAgICAgICAgICAgIAkoZmRzKSsrOyAKLSAgICAgICAgKGZkcykrKzsgCi0KLQlpZiAoICooZmRzKSA9PSAnXDAnICkgCi0gICAgICAgIAlyZXR1cm4gLTE7Ci0JaWYgKCAqKGZkcykgPT0gRkRTX1NUUlVDVF9BQ0NFU1NfU0VQICkKLSAgICAgICAgCXJldHVybiAwOwotCQkKLQl3aGlsZSAoICpmZHMgIT0gRkRTX1NUUlVDVF9FTkQgKQotCXsKLQkJaWYgKCAqZmRzID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCQlicmVhazsKLQotCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfc3RydWN0X2ZpZWxkX25hbWVfZW5kKTsKLQotCQlpZiAoICpmZHMrKyA9PSAnXDAnICkKLQkJCXJldHVybiAwOwotCi0JCS8qIHRvIHN0YXJ0IG9mIGZpZWxkICovCi0JCWlmICggKHN1YnNpemUgPSBGRFNUeXBlU2l6ZShmZHMpKSA8IDAgKQotCQkJcmV0dXJuIC0xOwotCi0JCXNpemUgKz0gc3Vic2l6ZTsKLQotCQlfZmRzX2FkdmFuY2UoJmZkcyk7Ci0KLQkJaWYgKCAqZmRzID09IEZEU19TVFJVQ1RfRklFTERfU0VQICkKLQkJCWZkcysrOwotCX0KLQotCXJldHVybiBzaXplOwotfQotCi0vKgotICogcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgc3RydWN0dXJlCi0gKi8KLWNoYXIgKgotX2ZpZWxkX2F0dHJpYnV0ZShjaGFyICpzLCBjaGFyICpzdGFydGVyLCBjaGFyICplbmRlcikKLXsKLQlpbnQJbGVuOwotCWNoYXIgKglucDsKLQljaGFyICoJX2Zkc19maWVsZF9hdHRyOyAvKiB3ZSBhbGxvYyBhcyBuZWVkZWQgKi8KLQotCWlmICggc3RhcnRlciAhPSBOVUxMICkKLQl7Ci0JCXMgPSBfZmRzX3NraXB0byhzLCBzdGFydGVyKTsKLQotCQlpZiAoICpzKysgPT0gJ1wwJyApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlucCA9IHM7Ci0JcyA9IF9mZHNfc2tpcHRvKHMsIGVuZGVyKTsKLQotCWlmICggKnMgPT0gJ1wwJyApCi0JCXJldHVybiBOVUxMOwotCi0JbGVuID0gcyAtIG5wOwotCi0JX2Zkc19maWVsZF9hdHRyID0gX2FpZl9hbGxvYyhsZW4rMSk7Ci0KLQltZW1jcHkoX2Zkc19maWVsZF9hdHRyLCBucCwgbGVuKTsKLQlfZmRzX2ZpZWxkX2F0dHJbbGVuXSA9ICdcMCc7Ci0KLQlyZXR1cm4gX2Zkc19maWVsZF9hdHRyOwotfQotCi0jZGVmaW5lIEVOVU1fU1RBUlQoZmRzLCByZXMpIFwKLQlpZiAoKihmZHMpID09IEZEU19OQU1FKSB7IFwKLQkJKGZkcykgPSBfZmRzX3NraXB0bygoZmRzKSwgX2Zkc19uYW1lX2VuZCk7IFwKLQkJKGZkcykrKzsgXAotCX0gXAotCWlmICggKihmZHMrKykgIT0gRkRTX0VOVU1fU1RBUlQgKSBcCi0JCXJldHVybiAocmVzKTsgXAotCXdoaWxlICggKihmZHMpICE9IEZEU19JRCApIFwKLQkJKGZkcykrKzsgXAotCShmZHMpKys7IFwKLQlpZiAoICooZmRzKSA9PSAnXDAnIHx8ICooZmRzKSA9PSBGRFNfRU5VTV9FTkQgKSBcCi0JCXJldHVybiAocmVzKTsKLQotLyogYmFzZWQgb24gdGhlIGZkcyBhbmQgdGhlIGVudW0gdmFsdWUsCi0gKiB0aGUgZnVuY3Rpb24gZ2l2ZXMgdGhlIGVudW0gbmFtZSAoc3RyaW5nKSwKLSAqIGl0IGFsbG9jcyB0aGUgc3RyaW5nIGZvciB0aGUgY2FsbGVyICovCi1pbnQKLUZEU0VudW1Db25zdEJ5VmFsdWUoY2hhciAqZmRzLCBjaGFyICoqbmFtZSwgaW50IHZhbCkKLXsKLQlpbnQJbGVuOwotCWNoYXIgKglubTsKLQotCUVOVU1fU1RBUlQoZmRzLCAtMSk7Ci0KLQl3aGlsZSAoICpmZHMgIT0gJ1wwJyAmJiAqZmRzICE9IEZEU19FTlVNX0VORCApCi0JewotCQlubSA9IGZkczsKLQotCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfZW51bV9jb25zdF9uYW1lX2VuZCk7Ci0KLQkJaWYgKCAqZmRzID09ICdcMCcgKQotCQkJcmV0dXJuIC0xOwotCi0JCWxlbiA9IGZkcyAtIG5tOwotCi0JCWZkcysrOwotCQlpZiAoIHZhbCA9PSBfZmRzX2dldG51bShmZHMpICkKLQkJewotCQkJKm5hbWUgPSBfYWlmX2FsbG9jKGxlbiArIDEpOwotCQkJKipuYW1lID0gJ1wwJzsKLQkJCXN0cm5jYXQoKm5hbWUsIG5tLCBsZW4pOwotCQkJCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWZkcyA9IF9mZHNfc2tpcHRvKGZkcywgX2Zkc19lbnVtX2NvbnN0X2VuZCk7Ci0JCWZkcysrOwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotLyogYmFzZWQgb24gdGhlIGZkcyBhbmQgdGhlIGVudW0gbmFtZSAoc3RyaW5nKSwKLSAqIHRoZSBmdW5jdGlvbiBnaXZlcyB0aGUgZW51bSB2YWx1ZSAqLwotaW50Ci1GRFNFbnVtQ29uc3RCeU5hbWUoY2hhciAqZmRzLCBjaGFyICpuYW1lLCBpbnQgKnZhbCkKLXsKLQlpbnQJbGVuOwotCWNoYXIgKglubTsKLQotCUVOVU1fU1RBUlQoZmRzLCAtMSk7Ci0KLQl3aGlsZSAoICpmZHMgIT0gJ1wwJyAmJiAqZmRzICE9IEZEU19FTlVNX0VORCApCi0JewotCQlubSA9IGZkczsKLQotCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfZW51bV9jb25zdF9uYW1lX2VuZCk7Ci0KLQkJaWYgKCAqZmRzID09ICdcMCcgKQotCQkJcmV0dXJuIC0xOwotCi0JCWxlbiA9IGZkcyAtIG5tOwotCi0JCWlmICggc3RybmNtcChubSwgbmFtZSwgbGVuKSA9PSAwICkKLQkJewotCQkJZmRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdmFsID0gX2Zkc19nZXRudW0oZmRzKTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfZW51bV9jb25zdF9lbmQpOwotCQlmZHMrKzsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLWNoYXIgKgotRkRTRW51bUluaXQoY2hhciAqaWQpCi17Ci0JcmV0dXJuIHN0cmR1cChUeXBlVG9GRFMoQUlGX0VOVU0sIGlkLCAxKSk7Ci19Ci0KLWNoYXIgKgotRkRTQWRkQ29uc3RUb0VudW0oY2hhciAqZmRzLCBjaGFyICpuYW1lLCBpbnQgdmFsKQotewotCWludAl2OwotCWNoYXIgKgluZm10OwotCWNoYXIgKgllbmQ7Ci0JY2hhcglmaWVsZFtCVUZTSVpdOwotCi0JaWYgKCBGRFNFbnVtQ29uc3RCeU5hbWUoZmRzLCBuYW1lLCAmdikgPT0gMCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogWFhYIFRPRE8KLQlpZiAoIEZEU0VudW1GaWVsZEJ5VmFsdWUoZmRzLCBuYW1lLCAmbmZtdCkgPT0gMCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJX2FpZl9mcmVlKG5mbXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKi8KLQotCXNucHJpbnRmKGZpZWxkLCBCVUZTSVosICIlcyVjJWQiLCBuYW1lLCBGRFNfRU5VTV9TRVAsIHZhbCk7Ci0KLQluZm10ID0gKGNoYXIgKilfYWlmX2FsbG9jKHN0cmxlbihmZHMpICsgc3RybGVuKGZpZWxkKSArIDIpOwotCSpuZm10ID0gJ1wwJzsKLQotCXN0cmNweShuZm10LCBmZHMpOwotCi0JaWYKLQkoCi0JCShlbmQgPSBzdHJyY2hyKG5mbXQsIEZEU19FTlVNX0VORCkpID09IE5VTEwKLQkJfHwKLQkJZW5kIC0gbmZtdCA8IDEKLQkpCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKCAqKGVuZC0xKSAhPSBGRFNfSUQgKQotCQkqZW5kKysgPSBGRFNfRU5VTV9DT05TVF9TRVA7Ci0KLQlzcHJpbnRmKGVuZCwgIiVzJXMiLCBmaWVsZCwgc3RycmNocihmZHMsIEZEU19FTlVNX0VORCkpOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JcmV0dXJuIG5mbXQ7Ci19Ci0KLWludAotRkRTRW51bUFkZChjaGFyICoqZmRzLCBjaGFyICpuYW1lLCBpbnQgdmFsKQotewotCWNoYXIgKiB0ZW1wOwotCi0JdGVtcCA9IEZEU0FkZENvbnN0VG9FbnVtKCpmZHMsIG5hbWUsIHZhbCk7Ci0KLQlpZiAoIHRlbXAgPT0gTlVMTCApCi0JCXJldHVybiAtMTsKLQotCV9haWZfZnJlZSgqZmRzKTsKLQkqZmRzID0gdGVtcDsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIFVOSU9OX1NUQVJUKGZkcywgcmVzKSBcCi0JaWYgKCooZmRzKSA9PSBGRFNfTkFNRSkgeyBcCi0JCShmZHMpID0gX2Zkc19za2lwdG8oKGZkcyksIF9mZHNfbmFtZV9lbmQpOyBcCi0JCShmZHMpKys7IFwKLQl9IFwKLQlpZiAoICooZmRzKyspICE9IEZEU19VTklPTl9TVEFSVCApIFwKLQkJcmV0dXJuIChyZXMpOyBcCi0Jd2hpbGUgKCAqKGZkcykgIT0gRkRTX0lEICkgXAotCQkoZmRzKSsrOyBcCi0JKGZkcykrKzsgXAotCWlmICggKihmZHMpID09ICdcMCcgfHwgKihmZHMpID09IEZEU19VTklPTl9FTkQgKSBcCi0JCXJldHVybiAocmVzKTsKLQotaW50Ci1GRFNVbmlvbkZpZWxkQnlOYW1lKGNoYXIgKmZkcywgY2hhciAqbmFtZSwgY2hhciAqKnR5cGUpCi17Ci0JaW50CWxlbjsKLQljaGFyICoJbm07Ci0KLQlVTklPTl9TVEFSVChmZHMsIC0xKTsKLQotCXdoaWxlICggKmZkcyAhPSAnXDAnICYmICpmZHMgIT0gRkRTX1VOSU9OX0VORCApCi0JewotCQlubSA9IGZkczsKLQotCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfdW5pb25fZmllbGRfbmFtZV9lbmQpOwotCi0JCWlmICggKmZkcyA9PSAnXDAnICkKLQkJCXJldHVybiAtMTsKLQotCQlsZW4gPSBmZHMgLSBubTsKLQotCQlpZiAoIHN0cm5jbXAobm0sIG5hbWUsIGxlbikgPT0gMCApCi0JCXsKLQkJCWZkcysrOwotCQkJbm0gPSBmZHM7Ci0JCQlmZHMgPSBfZmRzX3NraXB0byhmZHMsIF9mZHNfdW5pb25fZmllbGRfZW5kKTsKLQotCQkJaWYgKCAqZmRzID09ICdcMCcgKQotCQkJCXJldHVybiAtMTsKLQotCQkJbGVuID0gZmRzIC0gbm07Ci0JCQkqdHlwZSA9IF9haWZfYWxsb2MobGVuKzEpOwotCQkJc3RybmNweSgqdHlwZSwgbm0sIGxlbik7Ci0JCQkoKnR5cGUpW2xlbl0gPSAnXDAnOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWZkcyA9IF9mZHNfc2tpcHRvKGZkcywgX2Zkc191bmlvbl9maWVsZF9lbmQpOwotCQlmZHMrKzsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLWNoYXIgKgotRkRTVW5pb25Jbml0KGNoYXIgKmlkKQotewotCXJldHVybiBzdHJkdXAoVHlwZVRvRkRTKEFJRl9VTklPTiwgaWQpKTsKLX0KLQotY2hhciAqCi1GRFNBZGRGaWVsZFRvVW5pb24oY2hhciAqZmRzLCBjaGFyICpuYW1lLCBjaGFyICp0eXBlKQotewotCWNoYXIgKgluZm10OwotCWNoYXIgKgllbmQ7Ci0JY2hhcglmaWVsZFtCVUZTSVpdOwotCWNoYXIgKiAgZHVtbXk7Ci0KLQlpZiAoIEZEU1VuaW9uRmllbGRCeU5hbWUoZmRzLCBuYW1lLCAmZHVtbXkpID09IDAgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIFhYWCBUT0RPCi0JaWYgKCBGRFNFbnVtRmllbGRCeVZhbHVlKGZkcywgbmFtZSwgJm5mbXQpID09IDAgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCV9haWZfZnJlZShuZm10KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSovCi0KLQlzbnByaW50ZihmaWVsZCwgQlVGU0laLCAiJXMlYyVzIiwgbmFtZSwgRkRTX1VOSU9OX0ZJRUxEX05BTUVfRU5ELCB0eXBlKTsKLQotCW5mbXQgPSAoY2hhciAqKV9haWZfYWxsb2Moc3RybGVuKGZkcykgKyBzdHJsZW4oZmllbGQpICsgMik7Ci0JKm5mbXQgPSAnXDAnOwotCi0Jc3RyY3B5KG5mbXQsIGZkcyk7Ci0KLQlpZgotCSgKLQkJKGVuZCA9IHN0cnJjaHIobmZtdCwgRkRTX1VOSU9OX0VORCkpID09IE5VTEwKLQkJfHwKLQkJZW5kIC0gbmZtdCA8IDEKLQkpCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKCAqKGVuZC0xKSAhPSBGRFNfSUQgKQotCQkqZW5kKysgPSBGRFNfVU5JT05fRklFTERfU0VQOwotCi0Jc3ByaW50ZihlbmQsICIlcyVjIiwgZmllbGQsIEZEU19VTklPTl9FTkQpOwotCi0JUmVzZXRBSUZFcnJvcigpOwotCi0JcmV0dXJuIG5mbXQ7Ci19Ci0KLWludAotRkRTVW5pb25BZGQoY2hhciAqKmZkcywgY2hhciAqbmFtZSwgY2hhciAqdHlwZSkKLXsKLQljaGFyICogdGVtcDsKLQotCXRlbXAgPSBGRFNBZGRGaWVsZFRvVW5pb24oKmZkcywgbmFtZSwgdHlwZSk7Ci0KLQlpZiAoIHRlbXAgPT0gTlVMTCApIAotCQlyZXR1cm4gLTE7Ci0KLQlfYWlmX2ZyZWUoKmZkcyk7Ci0JKmZkcyA9IHRlbXA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotY2hhciAqCi1GRFNDbGFzc0luaXQoY2hhciAqaWQpCi17Ci0JcmV0dXJuIEZEU1N0cnVjdEluaXQoaWQpOwotfQotCi0vKgotICogcmV0dXJucyBhIG5ld2x5IGFsbG9jZWQgc3RyaW5nIGZvciBuYW1lIGFuZCB0eXBlCi0gKi8KLWludAotRkRTQ2xhc3NGaWVsZEJ5TmFtZShjaGFyICpmZHMsIGNoYXIgKm5hbWUsIGNoYXIgKip0eXBlKQotewotCXJldHVybiBGRFNTdHJ1Y3RGaWVsZEJ5TmFtZShmZHMsIG5hbWUsIHR5cGUpOwotfQotCi0vKgotICogcmV0dXJucyBhIG5ld2x5IGFsbG9jZWQgc3RyaW5nIGZvciBuYW1lIGFuZCB0eXBlCi0gKi8KLWludAotRkRTQ2xhc3NGaWVsZEJ5TnVtYmVyKGNoYXIgKmZkcywgaW50IG4sIGNoYXIgKipuYW1lLCBjaGFyICoqdHlwZSkKLXsKLQlyZXR1cm4gRkRTU3RydWN0RmllbGRCeU51bWJlcihmZHMsIG4sIG5hbWUsIHR5cGUpOwotfQotCi0vKgotICogVGhlIGZ1bmN0aW9uIGlnbm9yZXMgYWNjZXNzIHNwZWNpZmllcnMKLSAqIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaWVsZAotICogdGhlIGNvdW50ZXIgc3RhcnRzIGF0IDAsIGllOiBmaXJzdCBlbGVtZW50IGlzIGF0IHBvc2l0aW9uIDAKLSAqIGlmIHRoZSBmaWVsZCBjYW5ub3QgYmUgZm91bmQsIGl0IHJldHVybnMgLTEKLSAqLwotaW50Ci1GRFNDbGFzc0ZpZWxkSW5kZXgoY2hhciAqZmRzLCBjaGFyICpuYW1lKQotewotCXJldHVybiBGRFNTdHJ1Y3RGaWVsZEluZGV4KGZkcywgbmFtZSk7Ci19Ci0KLWludAotRkRTQ2xhc3NGaWVsZFNpemUoY2hhciAqZmRzLCBjaGFyICpuYW1lKQotewotCXJldHVybiBGRFNTdHJ1Y3RGaWVsZFNpemUoZmRzLCBuYW1lKTsKLX0KLQotY2hhciAqCi1GRFNBZGRGaWVsZFRvQ2xhc3MoY2hhciAqZmRzLCBhaWZhY2Nlc3MgYWNjLCBjaGFyICpuYW1lLCBjaGFyICp0eXBlKQotewotCWNoYXIgKiAJdGVtcDsKLQljaGFyICoJbmZtdDsKLQljaGFyICoJZW5kOwotCWNoYXIgKiAgcmVzdDsKLQotCWlmICggRkRTQ2xhc3NGaWVsZEJ5TmFtZShmZHMsIG5hbWUsICZuZm10KSA9PSAwICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlfYWlmX2ZyZWUobmZtdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCW5mbXQgPSAoY2hhciAqKV9haWZfYWxsb2Moc3RybGVuKGZkcykgKyBzdHJsZW4obmFtZSkgKyBzdHJsZW4odHlwZSkgKzMpOwotCSpuZm10ID0gJ1wwJzsKLQotCXN0cmNweShuZm10LCBmZHMpOwotCi0JdGVtcCA9IG5mbXQ7Ci0KLQlpZiAoKihmZHMpID09IEZEU19OQU1FKSB7IAotICAgICAgICAJKGZkcykgPSBfZmRzX3NraXB0bygoZmRzKSwgX2Zkc19uYW1lX2VuZCk7IAotICAgICAgICAJKGZkcykrKzsgCi0JfSAKLQotCWlmICgqKHRlbXApID09IEZEU19OQU1FKSB7Ci0gICAgICAgIAkodGVtcCkgPSBfZmRzX3NraXB0bygodGVtcCksIF9mZHNfbmFtZV9lbmQpOwotICAgICAgICAJKHRlbXApKys7Ci0JfQotCi0JaWYKLQkoCi0JCShlbmQgPSBfZmRzX3NraXB0byh0ZW1wKzEsIF9mZHNfc3RydWN0X2FjY2Vzc19zZXApKSA9PSBOVUxMCi0JCXx8Ci0JCWVuZCAtIHRlbXAgPCAxCi0JKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCV9haWZfZnJlZShuZm10KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmVzdCA9IF9mZHNfc2tpcHRvKGZkcysxLCBfZmRzX3N0cnVjdF9hY2Nlc3Nfc2VwKTsKLQotCXN3aXRjaCAoIGFjYyApCi0JewotCQljYXNlIEFJRkFDQ19QUklWQVRFOgotCQkJZW5kID0gX2Zkc19za2lwdG8oKytlbmQsIF9mZHNfc3RydWN0X2FjY2Vzc19zZXApOwotCQkJaWYgKCBlbmQgPT0gTlVMTCApCi0JCQl7Ci0JCQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCQkJX2FpZl9mcmVlKG5mbXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcmVzdCA9IF9mZHNfc2tpcHRvKCsrcmVzdCwgX2Zkc19zdHJ1Y3RfYWNjZXNzX3NlcCk7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCQljYXNlIEFJRkFDQ19QUk9URUNURUQ6Ci0JCQllbmQgPSBfZmRzX3NraXB0bygrK2VuZCwgX2Zkc19zdHJ1Y3RfYWNjZXNzX3NlcCk7Ci0JCQlpZiAoIGVuZCA9PSBOVUxMICkKLQkJCXsKLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJCQlfYWlmX2ZyZWUobmZtdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlyZXN0ID0gX2Zkc19za2lwdG8oKytyZXN0LCBfZmRzX3N0cnVjdF9hY2Nlc3Nfc2VwKTsKLQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCi0JCWNhc2UgQUlGQUNDX1BVQkxJQzoKLQkJCWJyZWFrOwotCX0KLQotCWlmICggKihlbmQtMSkgIT0gRkRTX0lEICYmICooZW5kLTEpICE9IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCSplbmQrKyA9IEZEU19TVFJVQ1RfRklFTERfU0VQOwotCi0Jc3ByaW50ZihlbmQsICIlcyVjJXMlcyIsCi0JCW5hbWUsCi0JCUZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQsIAotCQl0eXBlLAotCQlyZXN0KTsKLQotCVJlc2V0QUlGRXJyb3IoKTsKLQotCXJldHVybiBuZm10OwotfQotCi1pbnQKLUZEU0NsYXNzQWRkKGNoYXIgKipmZHMsIGFpZmFjY2VzcyBhY2MsIGNoYXIgKm5hbWUsIGNoYXIgKnR5cGUpCi17Ci0JY2hhciAqIHRlbXA7Ci0KLQl0ZW1wID0gRkRTQWRkRmllbGRUb0NsYXNzKCpmZHMsIGFjYywgbmFtZSwgdHlwZSk7Ci0KLQlpZiAoIHRlbXAgPT0gTlVMTCApCi0JCXJldHVybiAtMTsKLQotCV9haWZfZnJlZSgqZmRzKTsKLQkqZmRzID0gdGVtcDsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLUZEU1NldElkZW50aWZpZXIoY2hhciAqKmZkcywgY2hhciAqaWQpCi17Ci0JaW50CWlkX2xlbjsKLQljaGFyICAqCXRlbXA7Ci0JY2hhciAgKgluZXc7Ci0KLQl0ZW1wID0gKmZkczsKLQlpZF9sZW4gPSBzdHJsZW4oaWQpOwotCi0JbmV3ID0gX2FpZl9hbGxvYyggc3RybGVuKCpmZHMpICsgc3RybGVuKGlkKSArIDEgKTsKLQkqbmV3ID0gJ1wwJzsKLQotCWlmICggKnRlbXAgPT0gRkRTX05BTUUgKSAKLQl7Ci0JCXRlbXAgPSBfZmRzX3NraXB0byh0ZW1wLCBfZmRzX25hbWVfZW5kKTsKLQkJdGVtcCsrOwotCQlzdHJuY2F0KG5ldywgKmZkcywgdGVtcCAtICpmZHMpOwotCX0KLQotCWlmICggKnRlbXAgPT0gRkRTX1VOSU9OX1NUQVJUIHx8IAotCSAgICAgKnRlbXAgPT0gRkRTX1NUUlVDVF9TVEFSVCB8fCAKLQkgICAgICp0ZW1wID09IEZEU19FTlVNX1NUQVJUICkKLQl7Ci0JCWlmICggKih0ZW1wKzEpICE9IEZEU19JRCApCi0JCXsKLQkJCV9haWZfZnJlZShuZXcpOwotICAgICAgICAgICAgICAgIAlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXN0cm5jYXQobmV3LCB0ZW1wLCAxKTsKLQkJc3RybmNhdChuZXcsIGlkLCBpZF9sZW4pOwotCQlzdHJjYXQobmV3LCB0ZW1wKzEpOwotCQlfYWlmX2ZyZWUoKmZkcyk7Ci0JCSpmZHMgPSBuZXc7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlCi0JewotCQlfYWlmX2ZyZWUobmV3KTsKLSAgICAgICAgICAgICAgICBTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotY2hhciAqCi1GRFNHZXRJZGVudGlmaWVyKGNoYXIgKmZkcykKLXsKLQljaGFyICp0ZW1wOwotCWNoYXIgKmlkOwotCWludCAgIGlkX2xlbjsKLQotCWlmICggKmZkcyA9PSBGRFNfTkFNRSApIAotCXsKLQkJZmRzID0gX2Zkc19za2lwdG8oZmRzLCBfZmRzX25hbWVfZW5kKTsKLQkJZmRzKys7Ci0JfQotCi0JaWYgKCAqZmRzID09IEZEU19VTklPTl9TVEFSVCB8fCAKLQkgICAgICpmZHMgPT0gRkRTX1NUUlVDVF9TVEFSVCB8fCAKLQkgICAgICpmZHMgPT0gRkRTX0VOVU1fU1RBUlQgKQotCXsKLQkJZmRzKys7Ci0KLQkJaWYgKCAqZmRzID09IEZEU19JRCApCi0JCXsKLSAgICAgICAgICAgICAgICAJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCXRlbXAgPSBmZHM7Ci0JCWZkcyA9IHN0cmNocihmZHMsIEZEU19JRCk7Ci0KLQkJaWRfbGVuID0gZmRzIC0gdGVtcDsKLQkJaWQgPSBfYWlmX2FsbG9jKCBpZF9sZW4gKyAxICk7Ci0JCSppZCA9ICdcMCc7Ci0JCXN0cm5jYXQoaWQsIHRlbXAsIGlkX2xlbik7Ci0JCXJldHVybiBpZDsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgICAgICAgICBTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotCi12b2lkCi1fZmRzX2FkdmFuY2UoY2hhciAqKmZkcykKLXsKLQlzd2l0Y2ggKCBGRFNUeXBlKCgqZmRzKSsrKSApCi0JewotCWNhc2UgQUlGX0JPT0xFQU46Ci0JY2FzZSBBSUZfQ0hBUkFDVEVSOgotCQkvKiBhbHJlYWR5IHNraXBwZWQgYWxsIHdlIHNob3VsZCAqLwotCQlicmVhazsKLQotCWNhc2UgQUlGX0VOVU06Ci0JCV9mZHNfc2tpcGlkKGZkcyk7Ci0KLQkJKmZkcyA9IF9mZHNfc2tpcHRvKCpmZHMsIF9mZHNfZW51bV9lbmQpOwotCQkoKmZkcykgKz0gMjsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIEFJRl9JTlRFR0VSOgotCQkqZmRzICs9IDE7IC8qIHUgb3IgcyAqLwotCQkqZmRzID0gX2Zkc19za2lwbnVtKCpmZHMpOwotCQlicmVhazsKLQotCWNhc2UgQUlGX0ZMT0FUSU5HOgotCWNhc2UgQUlGX1ZPSUQ6Ci0JCSpmZHMgPSBfZmRzX3NraXBudW0oKmZkcyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBSUZfRlVOQ1RJT046Ci0JCXdoaWxlICggKigqZmRzKSsrICE9IEZEU19GVU5DVElPTl9BUkdfRU5EICkKLQkJCTsKLQotCQlfZmRzX2FkdmFuY2UoZmRzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9BUlJBWToKLQkJd2hpbGUgKCAqKCpmZHMpKysgIT0gRkRTX0FSUkFZX0VORCApCi0JCQk7IC8qIHBhc3QgdGhlIGluZGV4IHR5cGUgKi8KLQotCQlfZmRzX2FkdmFuY2UoZmRzKTsgLyogcGFzdCB0aGUgYmFzZSB0eXBlICovCi0JCWJyZWFrOwotCi0JY2FzZSBBSUZfVU5JT046Ci0JY2FzZSBBSUZfU1RSVUNUOgotCQlfZmRzX3NraXBpZChmZHMpOwotCi0JCWZvciAoIDs7ICkgewotCi0JCQlpZiAoICoqZmRzID09IEZEU19TVFJVQ1RfQUNDRVNTX1NFUCApCi0JCQl7Ci0JCQkJKCpmZHMpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICggKipmZHMgPT0gRkRTX1NUUlVDVF9FTkQgKQotCQkJCWJyZWFrOwotCi0JCQl3aGlsZSAoICooKmZkcykrKyAhPSBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5EICkKLQkJCQk7IC8qIHBhc3QgdGhlIGZpZWxkIG5hbWUgKi8KLQotCQkJX2Zkc19hZHZhbmNlKGZkcyk7IC8qIHBhc3QgdGhlIGZpZWxkIHR5cGUgKi8KLQotCQkJaWYgKCAqKmZkcyA9PSBGRFNfU1RSVUNUX0ZJRUxEX1NFUCApIAotCQkJCSgqZmRzKSsrOwotCQl9Ci0JCSgqZmRzKSsrOyAvKiBwYXN0IGNsb3NpbmcgYnJhY2UgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9OQU1FOgotCQkqZmRzID0gX2Zkc19za2lwbnVtKCpmZHMpOwotCQkoKmZkcykrKzsgLyogcGFzdCBjbG9zaW5nICcvJyAqLwotCQlfZmRzX2FkdmFuY2UoZmRzKTsgLyogcGFzdCB0aGUgbmFtZWQgdHlwZSAqLwotCQlicmVhazsKLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0JCV9mZHNfYWR2YW5jZShmZHMpOyAvKiBwYXN0IHRoZSBwb2ludGVkLXRvIHR5cGUgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIEFJRl9SRUZFUkVOQ0U6Ci0JCSpmZHMgPSBfZmRzX3NraXBudW0oKmZkcyk7Ci0JCSgqZmRzKSsrOyAvKiBwYXN0IGNsb3NpbmcgJy8nICovCi0JCWJyZWFrOwotCi0JY2FzZSBBSUZfU1RSSU5HOgotCQlicmVhazsgLyogYWxyZWFkeSBza2lwcGVkIGFsbCB3ZSBzaG91bGQgKi8KLQotCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCAibm8gd2F5IHRvIGFkdmFuY2UgLi4uIFwiJXNcIlxuIiwgKmZkcyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqICoqZmRzIGlzIGludGVnZXIsIGZsb2F0LCBvciBjaGFyYWN0ZXIuICBSZXR1cm4gaG93IG1hbnkgYnl0ZXMgaXQKLSAqIGhhcyBhbmQgYWR2YW5jZSAqZmRzIHRvIGl0cyBlbmQKLSAqLwotaW50Ci1fZmRzX2NvdW50X2J5dGVzKGNoYXIgKipmZHMpCi17Ci0JaW50IGJ5dGVzOwotCQotCXN3aXRjaCAoICoqZmRzICkKLQl7Ci0JY2FzZSBGRFNfRkxPQVRJTkc6Ci0JCSgqZmRzKSsrOyAvKiBwYXN0IGYgKi8KLQkJYnl0ZXMgPSBfZmRzX2dldG51bSgqZmRzKTsKLQkJKmZkcyA9IF9mZHNfc2tpcG51bSgqZmRzKTsgLyogcGFzdCBzaXplIGluZGljYXRvciAqLwotCQlicmVhazsKLQotCWNhc2UgRkRTX0VOVU1fU1RBUlQ6Ci0JCSpmZHMgPSBfZmRzX3NraXB0bygrKygqZmRzKSwgX2Zkc19lbnVtX2VuZCk7Ci0JCSgqZmRzKSsrOwotCQkvKiBmYWxsIHRocm91Z2ggKi8JCi0KLQljYXNlIEZEU19JTlRFR0VSOgotCQkqZmRzICs9IDI7IC8qIHBhc3QgaXUgb3IgaXMgKi8KLQkJYnl0ZXMgPSBfZmRzX2dldG51bSgqZmRzKTsKLQkJKmZkcyA9IF9mZHNfc2tpcG51bSgqZmRzKTsgLyogcGFzdCBzaXplIGluZGljYXRvciAqLwotCQlicmVhazsKLQotCWNhc2UgRkRTX0NIQVJBQ1RFUjoKLQkJKCpmZHMpKys7IC8qIHBhc3QgYyAqLwotCQlieXRlcyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRFNfQk9PTEVBTjoKLQkJKCpmZHMpKys7IC8qIHBhc3QgYiAqLwotCQlieXRlcyA9IHNpemVvZihpbnQpOwotCQlicmVhazsKLQotCWNhc2UgRkRTX1ZPSUQ6Ci0JCSgqZmRzKSsrOyAvKiBwYXN0IHYgKi8KLQkJYnl0ZXMgPSBfZmRzX2dldG51bSgqZmRzKTsKLQkJKmZkcyA9IF9mZHNfc2tpcG51bSgqZmRzKTsgLyogcGFzdCBzaXplIGluZGljYXRvciAqLwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJ5dGVzID0gLTE7IC8qIGludGVybmFsIGVycm9yICovCi0JfQotCi0JcmV0dXJuIGJ5dGVzOwotfQotCi0vKgotICogQ291bnQgYnl0ZXMgYnV0IGRvbid0IGFkdmFuY2UgcG9pbnRlcgotICovCi1pbnQKLV9mZHNfY291bnRfYnl0ZXNfbmEoY2hhciAqKmZkcykKLXsKLQljaGFyICoJZm10ID0gKmZkczsKLQotCXJldHVybiBfZmRzX2NvdW50X2J5dGVzKCZmbXQpOwotfQotCi12b2lkCi1fZmRzX3Jlc29sdmUoY2hhciAqKmZtdCkKLXsKLQlpbnQJaW5kZXg7Ci0KLQl3aGlsZSAoICoqZm10ID09IEZEU19OQU1FICkKLQl7Ci0JCSgqZm10KSsrOwotCQlpbmRleCA9IChpbnQpc3RydG9sKCpmbXQsIE5VTEwsIDEwKTsKLQkJKmZtdCA9IChjaGFyICopX2Zkc19za2lwbnVtKCpmbXQpKzE7IC8qIHBhc3QgbmFtZSwgdHJhaWxpbmcgc2xhc2ggKi8KLQkJX2FpZl90eXBlc19zZWVuW2luZGV4K01BWF9UWVBFU19TRUVOLzJdID0gKmZtdDsKLQl9Ci19Ci0KLWNoYXIgKgotX2Zkc19sb29rdXAoY2hhciAqKmZtdCkKLXsKLQlpbnQJaW5kZXg7Ci0KLQkoKmZtdCkrKzsKLQlpbmRleCA9IChpbnQpc3RydG9sKCpmbXQsIE5VTEwsIDEwKTsKLQkqZm10ID0gKGNoYXIgKilfZmRzX3NraXBudW0oKmZtdCkrMTsgLyogcGFzdCBuYW1lLCB0cmFpbGluZyBzbGFzaCAqLwotCi0JcmV0dXJuIF9haWZfdHlwZXNfc2VlbltpbmRleCtNQVhfVFlQRVNfU0VFTi8yXTsKLX0KLQotLyogCi0gKiBTa2lwIG92ZXIgb25lIGZ1bGwgZGF0YSB1bml0LCBzcGVjaWZpZWQgYnkgdGhlIGZkcywKLSAqIEF0IHJldHVybiwgZmRzIHNob3VsZCBiZSBhdCBpdHMgZW5kLCBhbmQgZGF0YSBpcyBhZHZhbmNlZC4KLSAqLwotCi12b2lkCi1fZmRzX3NraXBfZGF0YShjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQlpbnQJCWk7Ci0JaW50CQlieXRlczsKLQlpbnQJCXJlZzsKLQljaGFyICoJCXRhcmdldDsKLQlBSUZJbmRleCAqCWl4OwotCWNoYXIgKgkJZm10OwotCi0JX2Zkc19yZXNvbHZlKGZkcyk7Ci0KLQlzd2l0Y2ggKCBGRFNUeXBlKCpmZHMpICkKLQl7Ci0JY2FzZSBBSUZfUkVGRVJFTkNFOgotCQlmbXQgPSBfZmRzX2xvb2t1cChmZHMpOyAvLyBuZWVkIGEgdGVtcG9yYXJ5IGNvcHkKLQkJX2Zkc19za2lwX2RhdGEoJmZtdCwgZGF0YSk7Ci0JCXJldHVybjsKLQotCWNhc2UgQUlGX1BPSU5URVI6Ci0JCXJlZyA9ICgqKmRhdGEgPCAoY2hhcikgQUlGX1BUUl9SRUZFUkVOQ0UpOyAvKiBkYXRhIG5vdCBhIHJlZmVyZW5jZSAqLwotCi0JCSgqZmRzKSsrOyAvKiBwYXN0IF4gKi8KLQotCQlpZiAoICoqZGF0YSA9PSBBSUZfUFRSX1JFRkVSRU5DRSkKLQkJewotCQkJKCpkYXRhKSs9NTsKLQkJCV9mZHNfYWR2YW5jZShmZHMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoICh0YXJnZXQgPSBfZmluZF90YXJnZXQoZGF0YSwgMCkpID09IDAgKQotCQl7Ci0JCQkvKgotCQkJKiogbnVsbCBwb2ludGVyLiAgc2tpcCBvdmVyIHRoZSB0YXJnZXQgZmRzCi0JCQkqLwotCQkJX2Zkc19hZHZhbmNlKGZkcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfZmRzX3NraXBfZGF0YShmZHMsICZ0YXJnZXQpOwotCi0JCWlmICggcmVnICkKLQkJCSpkYXRhID0gdGFyZ2V0OyAvKiBvdGhlcndpc2UgX2ZpbmRfdGFyZ2V0IGFkdmFuY2VkIGZvciB1cyAqLwotCQlyZXR1cm47Ci0KLQljYXNlIEFJRl9WT0lEOgotCWNhc2UgQUlGX0NIQVJBQ1RFUjoKLQljYXNlIEFJRl9JTlRFR0VSOgotCWNhc2UgQUlGX0JPT0xFQU46Ci0JY2FzZSBBSUZfRkxPQVRJTkc6Ci0JY2FzZSBBSUZfRU5VTToKLQkJKCpkYXRhKSArPSBfZmRzX2NvdW50X2J5dGVzKGZkcyk7Ci0JCXJldHVybjsKLQotCWNhc2UgQUlGX0FSUkFZOgotCQlpeCA9IEZEU0FycmF5SW5kZXhJbml0KCpmZHMpOwotCi0JCV9mZHNfYWR2YW5jZShmZHMpOyAvKiBza2lwIG92ZXIgdGhlIGVudGlyZSBhcnJheSBmZHMgKi8KLQotCQlmb3IgKCBpID0gMCA7IGkgPCBpeC0+aV9uZWwgOyBpKysgKQotCQl7Ci0JCQlmbXQgPSBpeC0+aV9idHlwZTsKLQkJCV9mZHNfc2tpcF9kYXRhKCZmbXQsIGRhdGEpOwotCQl9Ci0KLQkJQUlGQXJyYXlJbmRleEZyZWUoaXgpOwotCQlyZXR1cm47Ci0KLQljYXNlIEFJRl9TVFJVQ1Q6Ci0JCSgqZmRzKSsrOyAvKiBwYXN0IG9wZW4gYnJhY2UgKi8KLQkJX2Zkc19za2lwaWQoZmRzKTsKLQotCQl3aGlsZSAoICoqZmRzICE9IEZEU19TVFJVQ1RfRU5EICkKLQkJewotCQkJaWYgKCAqKmZkcyA9PSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAgKQotCQkJewotCQkJCSgqZmRzKSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkqZmRzID0gc3RyY2hyKCpmZHMsIEZEU19TVFJVQ1RfRklFTERfTkFNRV9FTkQpICsgMTsKLQkJCQkvKiB0byBzdGFydCBvZiBmaWVsZCAqLwotCQkJX2Zkc19za2lwX2RhdGEoZmRzLCBkYXRhKTsKLQotCQkJaWYgKCAqKmZkcyA9PSBGRFNfU1RSVUNUX0ZJRUxEX1NFUCApCi0JCQkJKCpmZHMpKys7Ci0JCX0KLQotCQkoKmZkcykrKzsgLyogcGFzdCBjbG9zZSBicmFjZSAqLwotCQlyZXR1cm47Ci0KLQljYXNlIEFJRl9TVFJJTkc6Ci0JCSgqZmRzKSsrOyAvKiBwYXN0IHMgKi8KLQkJYnl0ZXMgPSAoKigqZGF0YSkrKyAmIDB4ZmYpIDw8IDg7Ci0JCWJ5dGVzICs9ICooKmRhdGEpKysgJiAweGZmOwotCQkqZGF0YSArPSBieXRlczsKLQkJcmV0dXJuOwotCi0JY2FzZSBBSUZfRlVOQ1RJT046Ci0JCXdoaWxlICggKipkYXRhICE9ICdcMCcgKQotCQkJKCpkYXRhKSsrOwotCQkoKmRhdGEpKys7IC8qIHBhc3QgbnVsbCAqLwotCQlyZXR1cm47Ci0JCQkKLQlkZWZhdWx0OgotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXZvaWQKLV9mZHNfc2tpcGlkKGNoYXIgKipmZHMpCi17Ci0JaWYgKCoqZmRzICE9IEZEU19JRCkKLQkJKmZkcyA9IHN0cmNocigqZmRzLCBGRFNfSUQpOwotCSpmZHMgKz0gMTsKLX0KLQotY2hhciAqCi1fZmRzX2FkZF9mdW5jdGlvbl9hcmcoY2hhciAqZmRzLCBjaGFyICphcmcpCi17Ci0JY2hhciAqIG5mbXQ7Ci0JY2hhciAqIHRlbXA7Ci0JY2hhciAqIHJlc3Q7Ci0KLSAgICAgICAgaWYgKCBGRFNUeXBlKGZkcykgIT0gQUlGX0ZVTkNUSU9OICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIFNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgbmZtdCA9IChjaGFyICopX2FpZl9hbGxvYyhzdHJsZW4oZmRzKSArIHN0cmxlbihhcmcpICsgMik7Ci0gICAgICAgICpuZm10ID0gJ1wwJzsKLQotICAgICAgICBzdHJjcHkobmZtdCwgZmRzKTsKLQotICAgICAgICBpZiAoICh0ZW1wID0gX2Zkc19za2lwdG8obmZtdCwgX2Zkc19mdW5jdGlvbl9hcmdfZW5kKSkgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBfYWlmX2ZyZWUobmZtdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN0ID0gX2Zkc19za2lwdG8oZmRzLCBfZmRzX2Z1bmN0aW9uX2FyZ19lbmQpOwotCi0gICAgICAgIGlmICggdGVtcCAhPSAobmZtdCArIDEpICkKLSAgICAgICAgICAgICAgICAqdGVtcCsrID0gRkRTX0ZVTkNUSU9OX0FSR19TRVA7Ci0KLSAgICAgICAgc3ByaW50Zih0ZW1wLCAiJXMlcyIsCi0gICAgICAgICAgICAgICAgYXJnLAotICAgICAgICAgICAgICAgIHJlc3QpOwotCi0gICAgICAgIFJlc2V0QUlGRXJyb3IoKTsKLQotICAgICAgICByZXR1cm4gbmZtdDsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2Zkcy5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZmRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmVlN2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvZmRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIEhlYWRlciBmaWxlIGZvciBGRFMgcm91dGluZXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKi8KLQotI2lmbmRlZiBfRkRTX0gKLSNkZWZpbmUgX0ZEU19ICi0KLSNkZWZpbmUgRkRTX0FSUkFZX0VORAkJCQknXScKLSNkZWZpbmUgRkRTX0FSUkFZX1NUQVJUCQkJJ1snCi0jZGVmaW5lIEZEU19CT09MRUFOCQkJCSdiJwotI2RlZmluZSBGRFNfQ0hBUkFDVEVSCQkJCSdjJwotI2RlZmluZSBGRFNfRU5VTV9FTkQJCQkJJz4nCi0jZGVmaW5lIEZEU19FTlVNX0NPTlNUX1NFUAkJJywnCi0jZGVmaW5lIEZEU19FTlVNX1NFUAkJCQknPScKLSNkZWZpbmUgRkRTX0VOVU1fU1RBUlQJCQknPCcKLSNkZWZpbmUgRkRTX0ZMT0FUSU5HCQkJCSdmJwotI2RlZmluZSBGRFNfRlVOQ1RJT04JCQkJJyYnCi0jZGVmaW5lIEZEU19GVU5DVElPTl9BUkdfRU5ECQknLycKLSNkZWZpbmUgRkRTX0ZVTkNUSU9OX0FSR19TRVAJCScsJwotI2RlZmluZSBGRFNfSUQJCQkJCSd8JwotI2RlZmluZSBGRFNfSU5URUdFUgkJCQknaScKLSNkZWZpbmUgRkRTX0lOVEVHRVJfU0lHTkVECQkncycKLSNkZWZpbmUgRkRTX0lOVEVHRVJfVU5TSUdORUQJCSd1JwotI2RlZmluZSBGRFNfSU5WQUxJRAkJCQknPycKLSNkZWZpbmUgRkRTX05BTUUJCQkJCSclJwotI2RlZmluZSBGRFNfTkFNRV9FTkQJCQkJJy8nCi0jZGVmaW5lIEZEU19QT0lOVEVSCQkJCSdeJwotI2RlZmluZSBGRFNfUkFOR0UJCQkJJ3InCi0jZGVmaW5lIEZEU19SQU5HRV9TRVAJCQkJJy4nCi0jZGVmaW5lIEZEU19SRUZFUkVOQ0UJCQkJJz4nCi0jZGVmaW5lIEZEU19SRUZFUkVOQ0VfRU5ECQkJJy8nCi0jZGVmaW5lIEZEU19SRUdJT04JCQkJJ3onCi0jZGVmaW5lIEZEU19TVFJJTkcJCQkJJ3MnCi0jZGVmaW5lIEZEU19BRERSRVNTCQkJCSdhJwotI2RlZmluZSBGRFNfU1RSVUNUX0FDQ0VTU19TRVAJCSc7JwotI2RlZmluZSBGRFNfU1RSVUNUX0VORAkJCSd9JwotI2RlZmluZSBGRFNfU1RSVUNUX0ZJRUxEX05BTUVfRU5ECSc9JwotI2RlZmluZSBGRFNfU1RSVUNUX0ZJRUxEX1NFUAkJJywnCi0jZGVmaW5lIEZEU19TVFJVQ1RfU1RBUlQJCQkneycKLSNkZWZpbmUgRkRTX1VOSU9OX0VORAkJCQknKScKLSNkZWZpbmUgRkRTX1VOSU9OX0ZJRUxEX05BTUVfRU5ECSc9JwotI2RlZmluZSBGRFNfVU5JT05fRklFTERfU0VQCQknLCcKLSNkZWZpbmUgRkRTX1VOSU9OX1NUQVJUCQkJJygnCi0jZGVmaW5lIEZEU19WT0lECQkJCSd2JwotI2RlZmluZSBGRFNfQ0hBUl9QT0lOVEVSCQkncCcKLQotCi1leHRlcm4gY2hhciAqCQlGRFNBZGRGaWVsZFRvQ2xhc3MoY2hhciAqLCBhaWZhY2Nlc3MsIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiBjaGFyICoJCUZEU0FkZENvbnN0VG9FbnVtKGNoYXIgKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGNoYXIgKgkJRkRTQWRkRmllbGRUb1N0cnVjdChjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiBjaGFyICoJCUZEU0FkZEZpZWxkVG9VbmlvbihjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiBjaGFyICoJCUZEU1JhbmdlSW5pdChpbnQsIGludCk7Ci1leHRlcm4gY2hhciAqCQlGRFNBcnJheUluaXQoaW50LCBpbnQsIGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTQXJyYXlSYW5rKGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTQXJyYXlTaXplKGNoYXIgKik7Ci1leHRlcm4gY2hhciAqCQlGRFNBcnJheUluZGV4VHlwZShjaGFyICopOwotZXh0ZXJuIGludAkJCUZEU0FycmF5TWluSW5kZXgoY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAkJCUZEU0FycmF5TWF4SW5kZXgoY2hhciAqLCBpbnQpOwotZXh0ZXJuIEFJRkluZGV4ICoJRkRTQXJyYXlJbmRleEluaXQoY2hhciAqKTsKLWV4dGVybiB2b2lkCQkJRkRTQXJyYXlJbmZvKGNoYXIgKiwgaW50ICosIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIHZvaWQJCQlGRFNBcnJheUJvdW5kcyhjaGFyICosIGludCAsIGludCAqKiwgaW50ICoqLCBpbnQgKiopOwotZXh0ZXJuIGNoYXIgKgkJRkRTQmFzZVR5cGUoY2hhciAqKTsKLWV4dGVybiBpbnQJCQlGRFNDbGFzc0FkZChjaGFyICoqLCBhaWZhY2Nlc3MsIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiBpbnQJCQlGRFNDbGFzc0ZpZWxkQnlOYW1lKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqKTsKLWV4dGVybiBpbnQJCQlGRFNDbGFzc0ZpZWxkQnlOdW1iZXIoY2hhciAqLCBpbnQsIGNoYXIgKiosIGNoYXIgKiopOwotZXh0ZXJuIGludAkJCUZEU0NsYXNzRmllbGRJbmRleChjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTQ2xhc3NGaWVsZFNpemUoY2hhciAqLCBjaGFyICopOwotZXh0ZXJuIGNoYXIgKgkJRkRTQ2xhc3NJbml0KGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTRGF0YVNpemUoY2hhciAqLCBjaGFyICopOwotZXh0ZXJuIGludAkJCUZEU0VudW1BZGQoY2hhciAqKiwgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludAkJCUZEU0VudW1Db25zdEJ5TmFtZShjaGFyICosIGNoYXIgKiwgaW50ICopOwotZXh0ZXJuIGludAkJCUZEU0VudW1Db25zdEJ5VmFsdWUoY2hhciAqLCBjaGFyICoqLCBpbnQgdmFsKTsKLWV4dGVybiBjaGFyICoJCUZEU0VudW1Jbml0KGNoYXIgKik7Ci1leHRlcm4gY2hhciAqCQlGRFNHZXRJZGVudGlmaWVyKGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTSXNTaWduZWQoY2hhciAqKTsKLWV4dGVybiBpbnQJCQlGRFNOdW1GaWVsZHMoY2hhciAqKTsKLWV4dGVybiBpbnQJCQlGRFNTZXRJZGVudGlmaWVyKGNoYXIgKiosIGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTU3RydWN0QWRkKGNoYXIgKiosIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiBpbnQJCQlGRFNTdHJ1Y3RGaWVsZEJ5TmFtZShjaGFyICosIGNoYXIgKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CQkJRkRTU3RydWN0RmllbGRCeU51bWJlcihjaGFyICosIGludCwgY2hhciAqKiwgY2hhciAqKik7Ci1leHRlcm4gaW50CQkJRkRTU3RydWN0RmllbGRJbmRleChjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTU3RydWN0RmllbGRTaXplKGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiBjaGFyICoJCUZEU1N0cnVjdEluaXQoY2hhciAqKTsKLWV4dGVybiBpbnQJCQlGRFNUeXBlKGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTVHlwZUNvbXBhcmUoY2hhciAqLCBjaGFyICopOwotZXh0ZXJuIGludAkJCUZEU1R5cGVTaXplKGNoYXIgKik7Ci1leHRlcm4gaW50CQkJRkRTVW5pb25BZGQoY2hhciAqKiwgY2hhciAqLCBjaGFyICopOwotZXh0ZXJuIGludAkJCUZEU1VuaW9uRmllbGRCeU5hbWUoY2hhciAqLCBjaGFyICosIGNoYXIgKiopOwotZXh0ZXJuIGNoYXIgKgkJRkRTVW5pb25Jbml0KGNoYXIgKik7Ci1leHRlcm4gY2hhciAqCQlUeXBlVG9GRFMoaW50LCAuLi4pOwotCi0jZW5kaWYgLyogIV9GRFNfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2luc3RhbGwtc2ggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmM2NjkxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLSMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgotIwotIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0jIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0jIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKLSMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi0jIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0KLSMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAotCi0jIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCi0KLQotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXRyYW5zZm9ybWJhc2VuYW1lPSIiCi10cmFuc2Zvcm1fYXJnPSIiCi1pbnN0Y21kPSIkbXZwcm9nIgotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPSIiCi1jaGdycGNtZD0iIgotc3RyaXBjbWQ9IiIKLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9IiIKLWRzdD0iIgotZGlyX2FyZz0iIgotCi13aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KLSAgICBjYXNlICQxIGluCi0JLWMpIGluc3RjbWQ9IiRjcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1kKSBkaXJfYXJnPXRydWUKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KLQkgICAgdGhlbgotCQlzcmM9JDEKLQkgICAgZWxzZQotCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKLQkJOgotCQlkc3Q9JDEKLQkgICAgZmkKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotICAgIGVzYWMKLWRvbmUKLQotaWYgWyB4IiRzcmMiID0geCBdCi10aGVuCi0JZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCi0JZXhpdCAxCi1lbHNlCi0JdHJ1ZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KLQlkc3Q9JHNyYwotCXNyYz0iIgotCQotCWlmIFsgLWQgJGRzdCBdOyB0aGVuCi0JCWluc3RjbWQ9OgotCWVsc2UKLQkJaW5zdGNtZD1ta2RpcgotCWZpCi1lbHNlCi0KLSMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAotIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKLSMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotCi0JaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQotCXRoZW4KLQkJdHJ1ZQotCWVsc2UKLQkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCi0JCWV4aXQgMQotCWZpCi0JCi0JaWYgWyB4IiRkc3QiID0geCBdCi0JdGhlbgotCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0JCWV4aXQgMQotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCi0jIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLQotCWlmIFsgLWQgJGRzdCBdCi0JdGhlbgotCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAotCWVsc2UKLQkJdHJ1ZQotCWZpCi1maQotCi0jIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKLWRzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KLSMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAotCi0jIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgotaWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCi1kZWZhdWx0SUZTPScJCi0nCi1JRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgotCi1vSUZTPSIke0lGU30iCi0jIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotSUZTPSclJwotc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCi1JRlM9IiR7b0lGU30iCi0KLXBhdGhjb21wPScnCi0KLXdoaWxlIFsgJCMgLW5lIDAgXSA7IGRvCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKLQlzaGlmdAotCi0JaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7Ci0gICAgICAgIHRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCi1kb25lCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXQotdGhlbgotCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKLQotIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCi0KLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKLQkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQotCWZpCi0KLSMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQotCi0JaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0KLQlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0KLQkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKLQotCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgotCi0jIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLQotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQotIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAotCi1maSAmJgotCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvaW8uYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDg1NTQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKgotICogUm91dGluZXMgZm9yIG1hbmFnaW5nIGZpbGUgaW5wdXQvb3V0cHV0IGZvciBBSUYgb2JqZWN0cy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUJPGNvbmZpZy5oPgotI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KLQotI2luY2x1ZGUJPGFzc2VydC5oPgotI2luY2x1ZGUJPHN0ZGlvLmg+Ci0jaW5jbHVkZQk8ZXJybm8uaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLSNpbmNsdWRlCTxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlCTxzeXMvc3RhdC5oPgotI2luY2x1ZGUJPGZjbnRsLmg+Ci0KLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUJPGlvLmg+Ci0jZWxzZSAvKiBXSU4zMiAqLwotI2luY2x1ZGUJPHVuaXN0ZC5oPgotI2VuZGlmIC8qIFdJTjMyICovCi0KLSNpbmNsdWRlCSJhaWYuaCIKLSNpbmNsdWRlCSJhaWZpbnQuaCIKLSNpbmNsdWRlCSJhaWZlcnIuaCIKLQotI2RlZmluZSBBSUZGSUxFX01BR0lDCSJBSUYxLjAiCi0KLSNkZWZpbmUgQUlGRklMRV9EQVRBCSdEJwotI2RlZmluZSBBSUZGSUxFX0VPRgknRScKLQotc3RydWN0IGFpZmhkcgotewotCWNoYXIJaGRyX21hZ2ljWzZdOwotCWNoYXIJaGRyX2ZsYWc7Ci0JY2hhcgloZHJfbmFtZWxlbls2XTsKLQljaGFyCWhkcl9mZHNsZW5bNl07Ci0JY2hhcgloZHJfZGF0YWxlblsxMV07Ci19OwotdHlwZWRlZiBzdHJ1Y3QgYWlmaGRyCWFpZmhkcjsKLQotZXh0ZXJuIGludAllcnJubzsKLQotaW50CXdyaXRlX2RhdGEoRklMRSAqLCBjaGFyICosIGludCk7Ci0KLWludAotVG9OdW0oY2hhciAqc3RyLCBpbnQgbGVuKQotewotCWludAlpOwotCWludAl2YWwgPSAwOwotCi0JZm9yICggaSA9IDAgOyBpIDwgbGVuIDsgaSsrICkKLQkJdmFsID0gdmFsICogMTAgKyBzdHJbaV0gLSAnMCc7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1pbnQKLWFpZl93cml0ZV9zZXQoQUlGRklMRSAqYWYsIGNoYXIgKm5hbWUsIGNoYXIgKmZkcywgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlpbnQJbmxlbjsKLQlpbnQJZmxlbjsKLQlhaWZoZHIJaGRyOwotCWNoYXIJYnVmW0JVRlNJWl07Ci0JY2hhcgluYnVmW0JVRlNJWl07Ci0KLQltZW1jcHkoaGRyLmhkcl9tYWdpYywgQUlGRklMRV9NQUdJQywgc2l6ZW9mKGhkci5oZHJfbWFnaWMpKTsKLQotCWlmICggZmRzID09IE5VTEwgKQotCXsKLQkJaGRyLmhkcl9mbGFnID0gQUlGRklMRV9FT0Y7Ci0JCW5sZW4gPSAwOwotCQlmbGVuID0gMDsKLQkJbGVuID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJaGRyLmhkcl9mbGFnID0gQUlGRklMRV9EQVRBOwotCi0JCWlmICggbmFtZSA9PSBOVUxMICkKLQkJCXNucHJpbnRmKG5idWYsIEJVRlNJWiwgIl9hcl8lZCIsIGFmLT5hZl9jbnQrKyk7Ci0JCWVsc2UKLQkJCXN0cmNweShuYnVmLCBuYW1lKTsKLQotCQlubGVuID0gc3RybGVuKG5idWYpICsgMTsKLQkJZmxlbiA9IHN0cmxlbihmZHMpICsgMTsKLQl9Ci0KLQlzbnByaW50ZihidWYsIEJVRlNJWiwgIiUwNmQiLCBubGVuKTsKLQltZW1jcHkoaGRyLmhkcl9uYW1lbGVuLCBidWYsIHNpemVvZihoZHIuaGRyX25hbWVsZW4pKTsKLQotCXNucHJpbnRmKGJ1ZiwgQlVGU0laLCAiJTA2ZCIsIGZsZW4pOwotCW1lbWNweShoZHIuaGRyX2Zkc2xlbiwgYnVmLCBzaXplb2YoaGRyLmhkcl9mZHNsZW4pKTsKLQotCXNucHJpbnRmKGJ1ZiwgQlVGU0laLCAiJTAxMWQiLCBsZW4pOwotCW1lbWNweShoZHIuaGRyX2RhdGFsZW4sIGJ1Ziwgc2l6ZW9mKGhkci5oZHJfZGF0YWxlbikpOwotCi0JaWYgKCB3cml0ZV9kYXRhKGFmLT5hZl9mcCwgKGNoYXIgKikmaGRyLCBzaXplb2YoYWlmaGRyKSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCBmZHMgPT0gTlVMTCApCi0JCXJldHVybiAwOwotCi0JaWYKLQkoCi0JCXdyaXRlX2RhdGEoYWYtPmFmX2ZwLCBuYnVmLCBubGVuKSA8IDAKLQkJfHwKLQkJd3JpdGVfZGF0YShhZi0+YWZfZnAsIGZkcywgZmxlbikgPCAwCi0JCXx8Ci0JCXdyaXRlX2RhdGEoYWYtPmFmX2ZwLCBkYXRhLCBsZW4pIDwgMAotCSkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotd3JpdGVfZGF0YShGSUxFICpmcCwgY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludAluOwotCi0Jd2hpbGUgKCAobiA9IGZ3cml0ZShidWYsIDEsIGxlbiwgZnApKSA8IGxlbiApCi0JewotCQlpZiAoIG4gPCAwICkKLQkJewotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1dSSVRFLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJbGVuIC09IG47Ci0JCWJ1ZiArPSBuOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQKLUFJRldyaXRlU2V0KEFJRkZJTEUgKmFmLCBBSUYgKmEsIGNoYXIgKm5hbWUpCi17Ci0JaWYgKCBhID09IChBSUYgKilOVUxMIHx8IGFmID09IChBSUZGSUxFICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmCi0JKAotCQlhZi0+YWZfbW9kZSAhPSBBSUZNT0RFX0NSRUFURQotCQkmJgotCQlhZi0+YWZfbW9kZSAhPSBBSUZNT0RFX0FQUEVORAotCSkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9NT0RFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiBhaWZfd3JpdGVfc2V0KGFmLCBuYW1lLCBBSUZfRk9STUFUKGEpLCBBSUZfREFUQShhKSwgQUlGX0xFTihhKSk7Ci19Ci0KLWludAotYWlmX3JlYWRfc2V0KEFJRkZJTEUgKmFmLCBBSUYgKiphLCBjaGFyICoqbmFtZSkKLXsKLQlpbnQJCWw7Ci0JaW50CQlmbGVuOwotCWludAkJbmxlbjsKLQlpbnQJCWRsZW47Ci0JYWlmaGRyCQloZHI7Ci0JY2hhciAqCQlmZHM7Ci0JY2hhciAqCQlkYXRhOwotCXN0YXRpYyBBSUYgKglfYWlmX3JlYWRfYWlmID0gKEFJRiAqKU5VTEw7Ci0Jc3RhdGljIGNoYXIgKglfYWlmX3JlYWRfbmFtZSA9IE5VTEw7Ci0KLQlpZiAoIChsID0gZnJlYWQoKGNoYXIgKikmaGRyLCBzaXplb2YoYWlmaGRyKSwgMSwgYWYtPmFmX2ZwKSkgPCAwICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9SRUFELCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYKLQkoCi0JCWwgPCAxCi0JCXx8Ci0JCXN0cm5jbXAoaGRyLmhkcl9tYWdpYywgQUlGRklMRV9NQUdJQywgc2l6ZW9mKGhkci5oZHJfbWFnaWMpKSAhPSAwICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURIRFIsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBoZHIuaGRyX2ZsYWcgPT0gQUlGRklMRV9FT0YgKQotCQlyZXR1cm4gMDsKLQotCW5sZW4gPSBUb051bShoZHIuaGRyX25hbWVsZW4sIHNpemVvZihoZHIuaGRyX25hbWVsZW4pKTsKLQlmbGVuID0gVG9OdW0oaGRyLmhkcl9mZHNsZW4sIHNpemVvZihoZHIuaGRyX2Zkc2xlbikpOwotCWRsZW4gPSBUb051bShoZHIuaGRyX2RhdGFsZW4sIHNpemVvZihoZHIuaGRyX2RhdGFsZW4pKTsKLQotCWlmICggYSA9PSAoQUlGICoqKU5VTEwgKQotCXsKLQkJLyoKLQkJKiogU2tpcCBvdmVyIGRhdGEuCi0JCSovCi0JCWlmICggZnNlZWsoYWYtPmFmX2ZwLCBubGVuICsgZmxlbiArIGRsZW4sIFNFRUtfQ1VSKSA8IDAgKQotCQl7Ci0JCQlTZXRBSUZFcnJvcihBSUZFUlJfU0VFSywgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXJldHVybiAxOwotCX0KLQotCWlmICggX2FpZl9yZWFkX25hbWUgIT0gTlVMTCApCi0JCV9haWZfZnJlZShfYWlmX3JlYWRfbmFtZSk7Ci0KLQlfYWlmX3JlYWRfbmFtZSA9IChjaGFyICopX2FpZl9hbGxvYyhubGVuKTsKLQotCWZkcyA9IChjaGFyICopX2FpZl9hbGxvYyhmbGVuKTsKLQlkYXRhID0gKGNoYXIgKilfYWlmX2FsbG9jKGRsZW4pOwotCi0JaWYgKCAobCA9IGZyZWFkKF9haWZfcmVhZF9uYW1lLCAxLCBubGVuLCBhZi0+YWZfZnApKSA8IDAgfHwgbCA8IG5sZW4gKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1JFQUQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIChsID0gZnJlYWQoZmRzLCAxLCBmbGVuLCBhZi0+YWZfZnApKSA8IDAgfHwgbCA8IGZsZW4gKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1JFQUQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIChsID0gZnJlYWQoZGF0YSwgMSwgZGxlbiwgYWYtPmFmX2ZwKSkgPCAwIHx8IGwgPCBkbGVuICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9SRUFELCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBfYWlmX3JlYWRfYWlmICE9IChBSUYgKilOVUxMICkKLQkJQUlGRnJlZShfYWlmX3JlYWRfYWlmKTsKLQotCSphID0gX2FpZl9yZWFkX2FpZiA9IE1ha2VBSUYoZmRzLCBkYXRhKTsKLQotCWlmICggbmFtZSAhPSAoY2hhciAqKilOVUxMICkKLQkJKm5hbWUgPSBfYWlmX3JlYWRfbmFtZTsKLQotCXJldHVybiAxOwotfQotCi1BSUYgKgotQUlGUmVhZFNldChBSUZGSUxFICphZiwgY2hhciAqKm5hbWUpCi17Ci0JQUlGICoJYTsKLQotCWlmICggYWYgPT0gKEFJRkZJTEUgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JaWYgKCBhZi0+YWZfbW9kZSAhPSBBSUZNT0RFX1JFQUQgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX01PREUsIE5VTEwpOwotCQlyZXR1cm4gKEFJRiAqKU5VTEw7Ci0JfQotCi0JaWYgKCBhaWZfcmVhZF9zZXQoYWYsICZhLCBuYW1lKSA8PSAwICkKLQkJcmV0dXJuIChBSUYgKilOVUxMOwotCi0JcmV0dXJuIGE7Ci19Ci0KLUFJRkZJTEUgKgotQUlGT3BlblNldChjaGFyICpmaWxlLCBpbnQgbW9kZSkKLXsKLQlpbnQJCW47Ci0JaW50CQljbnQgPSAwOwotCWludAkJZmQ7Ci0JaW50CQljcmVhdGVkID0gMDsKLQljaGFyICoJCWZtb2RlOwotCUZJTEUgKgkJZnA7Ci0JQUlGRklMRSAqCWFmOwotCi0Jc3dpdGNoICggbW9kZSApCi0JewotCWNhc2UgQUlGTU9ERV9SRUFEOgotCQlmbW9kZSA9ICJyIjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk1PREVfQ1JFQVRFOgotCQlmbW9kZSA9ICJ3IjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFJRk1PREVfQVBQRU5EOgotCQlmbW9kZSA9ICJyKyI7Ci0KLQkJaWYgKCBhY2Nlc3MoZmlsZSwgUl9PSykgPCAwICkKLQkJewotCQkJaWYgKCAoZmQgPSBjcmVhdChmaWxlLCAwNjQ0KSkgPCAwICkKLQkJCXsKLQkJCQlTZXRBSUZFcnJvcihBSUZFUlJfT1BFTiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlyZXR1cm4gKEFJRkZJTEUgKilOVUxMOwotCQkJfQotCi0JCQkodm9pZCljbG9zZShmZCk7Ci0JCQljcmVhdGVkID0gMTsKLQkJfQotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCQlmbW9kZSA9ICIiOwotCQlhc3NlcnQoMCk7Ci0JfQotCi0JaWYgKCAoZnAgPSBmb3BlbihmaWxlLCBmbW9kZSkpID09IChGSUxFICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfT1BFTiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIChBSUZGSUxFICopTlVMTDsKLQl9Ci0KLQlhZiA9IChBSUZGSUxFICopX2FpZl9hbGxvYyhzaXplb2YoQUlGRklMRSkpOwotCWFmLT5hZl9mcCA9IGZwOwotCWFmLT5hZl9tb2RlID0gbW9kZTsKLQotCWlmICggbW9kZSA9PSBBSUZNT0RFX0FQUEVORCApCi0JewotCQkvKgotCQkqKiBDb3VudCBlbnRyaWVzLgotCQkqLwotCQl3aGlsZSAoIChuID0gYWlmX3JlYWRfc2V0KGFmLCAoQUlGICoqKU5VTEwsIChjaGFyICoqKU5VTEwpKSA+IDAgKQotCQkJY250Kys7Ci0KLQkJaWYgKCBuIDwgMCAmJiAhY3JlYXRlZCApCi0JCXsKLQkJCWZjbG9zZShhZi0+YWZfZnApOwotCQkJX2FpZl9mcmVlKGFmKTsKLQkJCXJldHVybiAoQUlGRklMRSAqKU5VTEw7Ci0JCX0KLQotCQkvKgotCQkqKiBCYWNrIHVwIG92ZXIgRU9GIGhlYWRlci4KLQkJKi8KLQkJaWYKLQkJKAotCQkJY250ID4gMAotCQkJJiYKLQkJCWZzZWVrKGFmLT5hZl9mcCwgLSgoaW50KXNpemVvZihhaWZoZHIpKSwgU0VFS19DVVIpIDwgMAotCQkpCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9TRUVLLCBzdHJlcnJvcihlcnJubykpOwotCQkJZmNsb3NlKGFmLT5hZl9mcCk7Ci0JCQlfYWlmX2ZyZWUoYWYpOwotCQkJcmV0dXJuIChBSUZGSUxFICopTlVMTDsKLQkJfQotCX0KLQotCWFmLT5hZl9jbnQgPSBjbnQ7Ci0KLQlyZXR1cm4gYWY7Ci19Ci0KLWludAotQUlGQ2xvc2VTZXQoQUlGRklMRSAqYWYpCi17Ci0JaWYgKCBhZiA9PSAoQUlGRklMRSAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZgotCSgKLQkJKAotCQkJYWYtPmFmX21vZGUgPT0gQUlGTU9ERV9DUkVBVEUKLQkJCXx8Ci0JCQlhZi0+YWZfbW9kZSA9PSBBSUZNT0RFX0FQUEVORAotCQkpCi0JCSYmCi0JCWFpZl93cml0ZV9zZXQoYWYsIE5VTEwsIE5VTEwsIE5VTEwsIDApIDwgMAotCSkKLQkJcmV0dXJuIC0xOwotCi0JZmNsb3NlKGFmLT5hZl9mcCk7Ci0JX2FpZl9mcmVlKGFmKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvbGliYWlmLnNwZWMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9saWJhaWYuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMDkyZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9saWJhaWYuc3BlYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0jCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0KLVN1bW1hcnk6IGxpYmFpZjogQXJjaGl0ZWN0dXJlIEluZGVwZW5kZW50IEZvcm1hdCBMaWJyYXJ5Ci1OYW1lOiBsaWJhaWYKLVZlcnNpb246IDEuMC41Ci1SZWxlYXNlOiAxCi1Db3B5cmlnaHQ6IEdQTAotR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9MaWJyYXJpZXMKLVNvdXJjZTogbGliYWlmLSV7dmVyc2lvbn0udGFyLmd6Ci1CdWlsZHJvb3Q6IC92YXIvdG1wL2xpYmFpZgotCi1QYWNrYWdlcjogR3JlZyBXYXRzb24gPGdyZWdAZ3VhcmRzb2Z0Lm5ldD4KLQotJWRlc2NyaXB0aW9uCi1saWJhaWYgaXMgYSBsaWJhcmFyeSBvZiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgZm9ybWF0IHJvdXRpbmVzLiBJdCAKLWlzIHVzZWQgcHJpbWFyaWx5IGZvciB0cmFuc2ZlcnJpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhIHRvL2Zyb20gCi1kaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4KLQotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGEgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcy4KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lcHJlcAotJXNldHVwIC1xCi0KLSVidWlsZAotcm0gLXJmICRSUE1fQlVJTERfUk9PVAotLi9jb25maWd1cmUgLS1wcmVmaXg9JFJQTV9CVUlMRF9ST09UL3VzcgotbWFrZQotCi0laW5zdGFsbAotbWFrZSBpbnN0YWxsCi0KLSVjbGVhbgotcm0gLXJmICRSUE1fQlVJTERfUk9PVAotCi0lcG9zdAotCi0lZmlsZXMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotL3Vzci9saWIvbGliYWlmLmEKLS91c3IvaW5jbHVkZS9haWYuaAotL3Vzci9pbmNsdWRlL2Zkcy5oCi0KLSVjaGFuZ2Vsb2cKLSogRnJpIE5vdiAwOCAyMDAyIEdyZWcgV2F0c29uIDxncmVnQGd1YXJkc29mdC5uZXQ+Ci0tIEluaXRpYWwgdmVyc2lvbgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvbWlzc2luZyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3ZWY4M2EuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvbWlzc2luZworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDMtMDktMDIuMjMKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMgCi0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gIGV4aXQgMQotZmkKLQotcnVuPToKLQotIyBJbiB0aGUgY2FzZXMgd2hlcmUgdGhpcyBtYXR0ZXJzLCBgbWlzc2luZycgaXMgYmVpbmcgcnVuIGluIHRoZQotIyBzcmNkaXIgYWxyZWFkeS4KLWlmIHRlc3QgLWYgY29uZmlndXJlLmFjOyB0aGVuCi0gIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuYWMKLWVsc2UKLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5pbgotZmkKLQotbXNnPSJtaXNzaW5nIG9uIHlvdXIgc3lzdGVtIgotCi1jYXNlICIkMSIgaW4KLS0tcnVuKQotICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCi0gIHJ1bj0KLSAgc2hpZnQKLSAgIiRAIiAmJiBleGl0IDAKLSAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucwotICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCi0gICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKLSAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgotICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KLSAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCi0gICAgcnVuPToKLSAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCi0jIHRyeSB0byBlbXVsYXRlIGl0LgotY2FzZSAiJDEiIGluCi0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCi0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB0YXIgICAgICAgICAgdHJ5IHRhciwgZ251dGFyLCBndGFyLCB0aGVuIHRhciB3aXRob3V0IG5vbi1wb3J0YWJsZSBmbGFncwotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0KLVNlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCi0gICAgOzsKLQotICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCi0gICAgZWNobyAibWlzc2luZyAkc2NyaXB0dmVyc2lvbiAoR05VIEF1dG9tYWtlKSIKLSAgICA7OwotCi0gIC0qKQotICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgotICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gIGFjbG9jYWwqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLSAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8Ci0JCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OwotICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICB0b3VjaCAkdG91Y2hfZmlsZXMKLSAgICA7OwotCi0gIGF1dG9tYWtlKikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgTWFrZWZpbGUuYW0nLCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLgotICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuCi0gICAgICAgICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmluZCAuIC10eXBlIGYgLW5hbWUgTWFrZWZpbGUuYW0gLXByaW50IHwKLQkgICBzZWQgJ3MvXC5hbSQvLmluLycgfAotCSAgIHdoaWxlIHJlYWQgZjsgZG8gdG91Y2ggIiRmIjsgZG9uZQotICAgIDs7Ci0KLSAgYXV0b200dGUpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgotICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotLW91dHB1dFsgPV0qXChbXiBdKlwpLiovXDEvcCdgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vWyBdKlwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIiMhIC9iaW4vc2giCi0JZWNobyAiIyBDcmVhdGVkIGJ5IEdOVSBBdXRvbWFrZSBtaXNzaW5nIGFzIGEgcmVwbGFjZW1lbnQgb2YiCi0JZWNobyAiIyAgJCAkQCIKLQllY2hvICJleGl0IDAiCi0JY2htb2QgK3ggJGZpbGUKLQlleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgYmlzb258eWFjYykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKLQkgICAgZmkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmgKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmggXTsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbGV4fGZsZXgpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLmwpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgbGV4Lnl5LmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKLSAgICBmaQotICAgIDs7Ci0KLSAgaGVscDJtYW4pCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLQkgeW91IG1vZGlmaWVkIGEgZGVwZW5kZW5jeSBvZiBhIG1hbnVhbCBwYWdlLiAgWW91IG1heSBuZWVkIHRoZQotCSBcYEhlbHAybWFuJyBwYWNrYWdlIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UKLQkgZWZmZWN0LiAgWW91IGNhbiBnZXQgXGBIZWxwMm1hbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLQlmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotLW91dHB1dD1cKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBmaQotICAgIGlmIFsgLWYgIiRmaWxlIiBdOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiLmFiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZSIKLQlleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgbWFrZWluZm8pCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBtYWtlaW5mbywgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCi0gICAgICAgICBpbmRpcmVjdGx5IGFmZmVjdGluZyB0aGUgYXNwZWN0IG9mIHRoZSBtYW51YWwuICBUaGUgc3B1cmlvdXMKLSAgICAgICAgIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YgdXNpbmcgYSBidWdneSBcYG1ha2UnIChBSVgsCi0gICAgICAgICBEVSwgSVJJWCkuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYFRleGluZm8nIHBhY2thZ2Ugb3IKLSAgICAgICAgIHRoZSBcYEdOVSBtYWtlJyBwYWNrYWdlLiAgR3JhYiBlaXRoZXIgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgJ3MvLiogXChbXiBdKlwpICokL1wxLydgCi0gICAgICBmaWxlPWBzZWQgLW4gJy9eQHNldGZpbGVuYW1lLyB7IHMvLiogXChbXiBdKlwpICokL1wxLzsgcDsgcTsgfScgJGZpbGVgCi0gICAgZmkKLSAgICB0b3VjaCAkZmlsZQotICAgIDs7Ci0KLSAgdGFyKQotICAgIHNoaWZ0Ci0gICAgaWYgdGVzdCAtbiAiJHJ1biI7IHRoZW4KLSAgICAgIGVjaG8gMT4mMiAiRVJST1I6IFxgdGFyJyByZXF1aXJlcyAtLXJ1biIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KLSAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKLSAgICAjIG1lc3NhZ2VzLgotICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCi0gICAgZmkKLSAgICBmaXJzdGFyZz0iJDEiCi0gICAgaWYgc2hpZnQ7IHRoZW4KLQljYXNlICIkZmlyc3RhcmciIGluCi0JKm8qKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL28vL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotCWNhc2UgIiRmaXJzdGFyZyIgaW4KLQkqaCopCi0JICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvaC8vYAotCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKLQkgICAgOzsKLQllc2FjCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogSSBjYW4ndCBzZWVtIHRvIGJlIGFibGUgdG8gcnVuIFxgdGFyJyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0gICAgICAgICBZb3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBHTlUgdGFyIG9yIEZyZWUgcGF4dXRpbHMsIG9yIGNoZWNrIHRoZQotICAgICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4iCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgaXMgJG1zZy4KLSAgICAgICAgIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4gIENoZWNrIHRoZSBcYFJFQURNRScgZmlsZSwKLSAgICAgICAgIGl0IG9mdGVuIHRlbGxzIHlvdSBhYm91dCB0aGUgbmVlZGVkIHByZXJlcXVpc2l0ZXMgZm9yIGluc3RhbGxpbmcKLSAgICAgICAgIHRoaXMgcGFja2FnZS4gIFlvdSBtYXkgYWxzbyBwZWVrIGF0IGFueSBHTlUgYXJjaGl2ZSBzaXRlLCBpbiBjYXNlCi0gICAgICAgICBzb21lIG90aGVyIHBhY2thZ2Ugd291bGQgY29udGFpbiB0aGlzIG1pc3NpbmcgXGAkMScgcHJvZ3JhbS4iCi0gICAgZXhpdCAxCi0gICAgOzsKLWVzYWMKLQotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvbWtpbnN0YWxsZGlycyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL21raW5zdGFsbGRpcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyNGQ5M2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvbWtpbnN0YWxsZGlycworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5Ci0jIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgotIyBDcmVhdGVkOiAxOTkzLTA1LTE2Ci0jIFB1YmxpYyBkb21haW4KLQotIyAkSWQ6IG1raW5zdGFsbGRpcnMsdiAxLjEgMjAwMS8wNy8xNyAwMDo1MDo0OCBiYW0gRXhwICQKLQotZXJyc3RhdHVzPTAKLQotZm9yIGZpbGUKLWRvCi0gICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAotICAgc2hpZnQKLQotICAgcGF0aGNvbXA9Ci0gICBmb3IgZAotICAgZG8KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgotICAgICBjYXNlICIkcGF0aGNvbXAiIGluCi0gICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OwotICAgICBlc2FjCi0KLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIgMT4mMgotCi0gICAgICAgIG1rZGlyICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KLQotICAgICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLSAgCSAgZXJyc3RhdHVzPSRsYXN0ZXJyCi0gICAgICAgIGZpCi0gICAgIGZpCi0KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCi0gICBkb25lCi1kb25lCi0KLWV4aXQgJGVycnN0YXR1cwotCi0jIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2FwcGx5cGF0Y2ggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2FwcGx5cGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjZDg2ZjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvcGF0Y2hlcy9hcHBseXBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBBcHBseSBwYXRjaGVzIHRvIEdEQi4KLSMKLSMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLUNPTU1FTlQ9IiMgU3VwcG9ydCBmb3IgQUlGIgotSU5TQUlGPW5vCi0KLXdoaWxlIFsgJCMgLW5lIDAgXQotZG8KLQljYXNlICQxIGluCi0JLWluc3RhbGwtYWlmIHwgLS1pbnN0YWxsLWFpZikKLQkJSU5TQUlGPXllcwotCQk7OwotCi0JLWluc3RhbGwtYWxsIHwgLS1pbnN0YWxsLWFsbCkKLQkJSU5TQUlGPXllcwotCQk7OwotCSopCi0JCUlOU0RJUj0kMQotCQlTUkNESVI9JDEvZ2RiCi0JCTs7Ci0JZXNhYwotCi0Jc2hpZnQKLWRvbmUKLQotaWYgWyAkSU5TQUlGID0gbm8gLW8gIngkSU5TRElSIiA9IHggXTsgdGhlbgotCWVjaG8gdXNhZ2U6ICQwICctLWluc3RhbGwtYWlmfC0taW5zdGFsbC1hbGwnIGdkYi1kaXIKLQlleGl0IDEKLWZpCi0KLWlmIFsgISAtZCAkSU5TRElSIC1hICEgLWQgJFNSQ0RJUiBdOyB0aGVuCi0JZWNobyAkMDogY291bGQgbm90IGZpbmQgZ2RiIHNvdXJjZQotCWV4aXQgMQotZmkKLQotaWYgWyAhIC1mICRTUkNESVIvTWFrZWZpbGUuaW4gXTsgdGhlbgotCWVjaG8gJDA6IGNvdWxkIG5vdCBmaW5kIE1ha2VmaWxlLmluCi0JZXhpdCAxCi1maQotCi1WRVJTSU9OPSIiCi0KLWlmIFsgLWYgJFNSQ0RJUi92ZXJzaW9uLmluIF07IHRoZW4KLQlWRVJTSU9OPWBjYXQgJFNSQ0RJUi92ZXJzaW9uLmluYAotZWxzZQotCVZFUlNJT049YGdyZXAgJ15WRVJTSU9OJyAkU1JDRElSL01ha2VmaWxlLmluIHwgc2VkIC1lICdzL1ZFUlNJT04gPSAvLydgCi1maQotCi1pZiBbICJ4JFZFUlNJT04iID0geCBdOyB0aGVuCi0JZWNobyAkMDogY291bGQgbm90IGZpbmQgdmVyc2lvbiBvZiBuZXcgZ2RiCi0JZXhpdCAxCi1maQotCi1pZiBncmVwICIkQ09NTUVOVCIgJFNSQ0RJUi9NYWtlZmlsZS5pbiA+IC9kZXYvbnVsbCA7IHRoZW4KLQllY2hvICQwOiB3YXJuaW5nIC0gZ2RiLSRWRVJTSU9OIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZAotCWV4aXQgMAotZmkKLQotcmh2PWBleHByICIkVkVSU0lPTiIgOiAnUmVkIEhhdCBMaW51eCAoXChbXildKlwpKSdgCi0KLWlmIFsgIngkcmh2IiAhPSB4IF07IHRoZW4KLQlWRVJTSU9OPSJyaCRyaHYiCi1maQotCi1jYXNlICRWRVJTSU9OIGluCi01LjApCi0Jc2VkIC1lICIvXkNMRUFORklMRVMgPS9hXFwKLSRDT01NRU5UXFwKLUlOQ0xVREVfYWlmID0gQElOQ0xVREVfYWlmQFxcCi1MSUJfYWlmID0gQExJQl9haWZAXFwKLS1pbmNsdWRlIGxpYmFpZi5ta1xcCi0iIDwgJFNSQ0RJUi9NYWtlZmlsZS5pbiA+ICRTUkNESVIvTWFrZWZpbGUuaW4ueAotCW12ICRTUkNESVIvTWFrZWZpbGUuaW4ueCAkU1JDRElSL01ha2VmaWxlLmluCi0KLQkoY2QgJElOU0RJUi8uLjsgcGF0Y2ggLXAwKSA8IGdkYi0kVkVSU0lPTi5wYXRjaAotCTs7Ci0KLTUuMnxyaDUuMi4xLTR8MjAwMi0wOC0xMS1jdnMpCi0Jc2VkIC1lICIvXkRJU1RTVFVGRiA9IFwkKFlZRklMRVMpL2FcXAotJENPTU1FTlRcXAotSU5DTFVERV9haWYgPSBASU5DTFVERV9haWZAXFwKLUxJQl9haWYgPSBATElCX2FpZkBcXAotLWluY2x1ZGUgbGliYWlmLm1rXFwKLSIgPCAkU1JDRElSL01ha2VmaWxlLmluID4gJFNSQ0RJUi9NYWtlZmlsZS5pbi54Ci0JbXYgJFNSQ0RJUi9NYWtlZmlsZS5pbi54ICRTUkNESVIvTWFrZWZpbGUuaW4KLQotCShjZCAkSU5TRElSLy4uOyBwYXRjaCAtcDApIDwgZ2RiLSRWRVJTSU9OLnBhdGNoCi0JOzsKLQotKikKLQllY2hvICQwOiB2ZXJzaW9uICRWRVJTSU9OIG5vdCBzdXBwb3J0ZWQKLQlleGl0IDEKLQk7OwotZXNhYwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3BhdGNoZXMvY3JlYXRlcGF0Y2ggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2NyZWF0ZXBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmJmZTJiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3BhdGNoZXMvY3JlYXRlcGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyEvYmluL3NoIC1lCi0jCi0jIENyZWF0ZSBnZGIgcGF0Y2ggZmlsZXMuCi0jCi0jIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIGJ5IEd1YXJkc29mdCBQdHkgTHRkLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIwotCi1GSUxFU181MD0iYWlmLXZhbHByaW50LmMgYy12YWxwcmludC5jIHByaW50Y21kLmMgdHlwZXByaW50LmMgdmFscHJpbnQuYyBsaWJhaWYubWsgY29uZmlndXJlLmluIGFjbG9jYWwubTQgY29uZmlndXJlIgotCi1GSUxFU181Mj0iYWlmLXZhbHByaW50LmMgYy12YWxwcmludC5jIHByaW50Y21kLmMgdHlwZXByaW50LmMgdmFscHJpbnQuYyBsaWJhaWYubWsgY29uZmlndXJlLmluIGNvbmZpZ3VyZSBjb25maWcuaW4iCi0KLUZJTEVTXzIwMDIwODExQ1ZTPSJhaWYtdmFscHJpbnQuYyBjLXZhbHByaW50LmMgcHJpbnRjbWQuYyB0eXBlcHJpbnQuYyB2YWxwcmludC5jIGxpYmFpZi5tayBjb25maWd1cmUuaW4gY29uZmlndXJlIGNvbmZpZy5pbiIKLQotaWYgIFsgJCMgLW5lIDEgXTsgdGhlbgotCWVjaG8gdXNhZ2U6ICQwIG5ldy1nZGItZGlyCi0JZXhpdCAxCi1maQotCi1ORVdJTlNESVI9JDEKLU5FV1NSQ0RJUj0kMS9nZGIKLU9SR0lOU0RJUj0kMS1vbGQKLU9SR1NSQ0RJUj0kMS1vbGQvZ2RiCi0KLWlmIFsgISAtZCAkTkVXSU5TRElSIC1hICEgLWQgJE5FV1NSQ0RJUiBdOyB0aGVuCi0JZWNobyAkMDogY291bGQgbm90IGZpbmQgbmV3IGdkYiBzb3VyY2UKLQlleGl0IDEKLWZpCi0KLWlmIFsgISAtZCAkT1JHSU5TRElSIC1hICEgLWQgJE9SR1NSQ0RJUiBdOyB0aGVuCi0JZWNobyAkMDogY291bGQgbm90IGZpbmQgb3JpZ2luYWwgZ2RiIHNvdXJjZQotCWV4aXQgMQotZmkKLQotaWYgWyAhIC1mICRORVdTUkNESVIvTWFrZWZpbGUuaW4gLW8gISAtZiAkT1JHU1JDRElSL01ha2VmaWxlLmluIF07IHRoZW4KLQllY2hvICQwOiBjb3VsZCBub3QgZmluZCBNYWtlZmlsZS5pbgotCWV4aXQgMQotZmkKLQotVkVSU0lPTj0iIgotCi1pZiBbIC1mICRORVdTUkNESVIvdmVyc2lvbi5pbiBdOyB0aGVuCi0JVkVSU0lPTj1gY2F0ICRORVdTUkNESVIvdmVyc2lvbi5pbmAKLWVsc2UKLQlWRVJTSU9OPWBncmVwICdeVkVSU0lPTicgJE5FV1NSQ0RJUi9NYWtlZmlsZS5pbiB8IHNlZCAtZSAncy9WRVJTSU9OID0gLy8nYAotZmkKLQotaWYgWyAieCRWRVJTSU9OIiA9IHggXTsgdGhlbgotCWVjaG8gJDA6IGNvdWxkIG5vdCBmaW5kIHZlcnNpb24gb2YgbmV3IGdkYgotCWV4aXQgMQotZmkKLQotT1JHVkVSU0lPTj0iIgotCi1pZiBbIC1mICRPUkdTUkNESVIvdmVyc2lvbi5pbiBdOyB0aGVuCi0JT1JHVkVSU0lPTj1gY2F0ICRPUkdTUkNESVIvdmVyc2lvbi5pbmAKLWVsc2UKLQlPUkdWRVJTSU9OPWBncmVwICdeVkVSU0lPTicgJE9SR1NSQ0RJUi9NYWtlZmlsZS5pbiB8IHNlZCAtZSAncy9WRVJTSU9OID0gLy8nYAotZmkKLQotaWYgWyAieCRPUkdWRVJTSU9OIiA9IHggXTsgdGhlbgotCWVjaG8gJDA6IGNvdWxkIG5vdCBmaW5kIHZlcnNpb24gb2Ygb3JpZ2luYWwgZ2RiCi0JZXhpdCAxCi1maQotCi1pZiBbICRPUkdWRVJTSU9OICE9ICRWRVJTSU9OIF07IHRoZW4KLQllY2hvICQwOiBvcmlnaW5hbCBhbmQgbmV3IHZlcnNpb25zIGRvIG5vdCBtYXRjaAotCWV4aXQgMQotZmkKLQotZGY9YGVjaG8gJFZFUlNJT04gfCBzZWQgLWUgJ3MvLS8vZycgLWUgJ3MvXC4vL2cnIHwgdHIgJ2EteicgJ0EtWidgCi1GSUxFUz1gZXZhbCBlY2hvICckJyJGSUxFU18kZGYiYAotCi1ORVdESVI9YGJhc2VuYW1lICRORVdJTlNESVJgCi1QQVJFTlQ9YGRpcm5hbWUgJE5FV0lOU0RJUmAKLU9SR0RJUj0kTkVXRElSLW9sZAotCi1jYXNlICRWRVJTSU9OIGluCi01LlswMl18MjAwMi0wOC0xMS1jdnMpCi0Jcm0gLWYgZ2RiLSRWRVJTSU9OLnBhdGNoCi0JZm9yIGkgaW4gJEZJTEVTCi0JZG8KLQkJT1JHPSRPUkdESVIvZ2RiLyRpCi0JCU5FVz0kTkVXRElSL2dkYi8kaQotCQlpZiBbICEgLWYgJE9SR1NSQ0RJUi8kaSBdOyB0aGVuIE9SRz0vZGV2L251bGw7IGZpCi0JCWlmIFsgISAtZiAkTkVXU1JDRElSLyRpIF07IHRoZW4gTkVXPS9kZXYvbnVsbDsgZmkKLQkJKGNkICRQQVJFTlQ7IGRpZmYgLXVOICRPUkcgJE5FVyB8fCB0cnVlKSA+PiBnZGItJFZFUlNJT04ucGF0Y2gKLQlkb25lCi0JOzsKLQotKikKLQllY2hvICQwOiB2ZXJzaW9uICRWRVJTSU9OIG9mIGdkYiBub3Qgc3VwcG9ydGVkCi0JZXhpdCAxCi0JOzsKLWVzYWMKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2dkYi0yMDAyLTA4LTExLWN2cy5wYXRjaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3BhdGNoZXMvZ2RiLTIwMDItMDgtMTEtY3ZzLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODI4Yzk0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3BhdGNoZXMvZ2RiLTIwMDItMDgtMTEtY3ZzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0OTIgKzAsMCBAQAotLS0tIC9kZXYvbnVsbAlTdW4gTWFyIDMwIDE4OjA3OjMwIDIwMDMKLSsrKyBzcmMvZ2RiL2FpZi12YWxwcmludC5jCVN1biBNYXIgMzAgMTg6Mzc6MzYgMjAwMwotQEAgLTAsMCArMSwxMTM2IEBACi0rLyogU3VwcG9ydCBmb3IgcHJpbnRpbmcgQyBhbmQgQysrIHR5cGVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0rICAgQ29weXJpZ2h0IDE5ODYsIDE5ODgsIDE5ODksIDE5OTEsIDE5OTMtMTk5NiwgMTk5OC0yMDAwCi0rICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rCi0rICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotKwotKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rCi0rICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0rICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsKLSsgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLSsKLSsjaW5jbHVkZSAiZGVmcy5oIgotKyNpbmNsdWRlICJvYnN0YWNrLmgiCi0rI2luY2x1ZGUgImJmZC5oIgkJLyogQmluYXJ5IEZpbGUgRGVzY3JpcHRpb24gKi8KLSsjaW5jbHVkZSAic3ltdGFiLmgiCi0rI2luY2x1ZGUgImdkYnR5cGVzLmgiCi0rI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSsjaW5jbHVkZSAidmFsdWUuaCIKLSsjaW5jbHVkZSAidmFscHJpbnQuaCIKLSsjaW5jbHVkZSAiZ2RiY29yZS5oIgotKyNpbmNsdWRlICJ0YXJnZXQuaCIKLSsjaW5jbHVkZSAiY29tbWFuZC5oIgotKyNpbmNsdWRlICJnZGJjbWQuaCIKLSsjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSsjaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSsjaW5jbHVkZSAiYy1sYW5nLmgiCi0rI2luY2x1ZGUgInR5cGVwcmludC5oIgotKyNpbmNsdWRlICJ1aS1maWxlLmgiCi0rCi0rI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSsjaW5jbHVkZSAiYWlmLmgiCi0rI2luY2x1ZGUgPGVycm5vLmg+Ci0rI2luY2x1ZGUgPGN0eXBlLmg+Ci0rdm9pZCBtZW1fZmlsZV9kZWxldGUgKHN0cnVjdCB1aV9maWxlICpmaWxlKTsKLSsKLStpbnQgY2hlY2tfdmFsdWUoc3RydWN0IHR5cGUgKiwgQ09SRV9BRERSLCBzdHJ1Y3QgdmFsdWUgKiopOwotKwotKy8qIGRlZmluZWQgaW4gdmFscHJpbnQuYzogKi8KLStleHRlcm4gaW50IHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sIGludCAqZXJybm9wdHIpOwotKwotKwwKLSsvKiB0aGUgZm9sbG93aW5nIGNvbWVzIGZyb20gdGhlIGFpZiBsaWJyYXJ5LCBjb252LmMsIHdyaXR0ZW4gYnkgR3JlZy4gKi8KLSsKLSsjaWYgZGVmaW5lZChXSU5ET1dTTlQpCi0rI2RlZmluZSBCSVRTUEVSQllURQk4Ci0rI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCi0rI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotKyNkZWZpbmUgQklUU1BFUkJZVEUgICAgIE5CQlkKLSsjZWxzZSAvKiAhV0lORE9XU05UICYmICFfX0FQUExFXyAqLwotKyNpbmNsdWRlIDx2YWx1ZXMuaD4KLSsjZW5kaWYKLSsKLSt1bmlvbiBpZWVlX2RvdWJsZQotK3sKLSsJRE9VQkxFU1QJZDsKLSsJY2hhcgkJY1tzaXplb2YoRE9VQkxFU1QpXTsKLSt9OwotKwotKwwKLSsvKiBGb3IgbGlua2VkIGRhdGEgc3RydWN0dXJlcywgd2UgY2hlY2sgZm9yIGNpcmN1bGFyaXR5IGJ5IHJlY29yZGluZyB0aGUgdmFsdWVzCi0rICogb2YgYWxsIHBvaW50ZXJzIGFuZCB0eXBlcyB3ZSBzZWUuICBJbiBhIGxhdGVyIHBhc3MsIHdlIGVtaXQgYSBuYW1lIG9uIHRob3NlCi0rICogdHlwZXMgYW5kIGFuIG9mZnNldCBmb3IgdGhvc2UgdmFsdWVzCi0rICogdGhhdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuICovCi0rc3RydWN0IHZhbHVlX2luZm8gewotKyAgQ09SRV9BRERSIGFkZHI7Ci0rICBpbnQgdXNlZDsgLyogMDogYXBwZWFycywgbm90IHBvaW50ZWQgdG8uICAxOiBpcyBwb2ludGVkIHRvLiAgMjogdmFsdWUgaGFzIGJlZW4KLSsgICAgZW1pdHRlZCAqLwotK307Ci0rc3RydWN0IHR5cGVfaW5mbyB7Ci0rICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSsgIGludCB1c2VkOyAvKiAwOiBhcHBlYXJzLCBub3QgcG9pbnRlZCB0by4gIDE6IGlzIHBvaW50ZWQgdG8uICAyOiBuYW1lIGhhcyBiZWVuCi0rICAgIGVtaXR0ZWQgKi8KLSt9OwotKwotKyNkZWZpbmUgTUFYX1ZBTFVFU19TRUVOIDEwMDAKLSsJLyogaG9wZSB0aGF0IHRoZSBzdHJ1Y3R1cmUgZG9lc24ndCBoYXZlIG1vcmUgZGlzdGluY3QgcG9pbnRlciB2YWx1ZXMgKi8KLStzdHJ1Y3QgdmFsdWVfaW5mbyB2YWx1ZXNTZWVuW01BWF9WQUxVRVNfU0VFTisxXTsgLyogZXh0cmEgc3BhY2UgZm9yCi0rICBwc2V1ZG8tZGF0YSAqLwotK2ludCBudW1WYWx1ZXNTZWVuOwotKyNkZWZpbmUgTUFYX1RZUEVTX1NFRU4gMTAwCi0rCS8qIGhvcGUgdGhhdCB0aGUgc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBtb3JlIGRpc3RpbmN0IHR5cGVzIHZhbHVlcyAqLwotK3N0cnVjdCB0eXBlX2luZm8gdHlwZXNTZWVuW01BWF9UWVBFU19TRUVOKzFdOyAvKiBleHRyYSBzcGFjZSBmb3IKLSsgIHBzZXVkby1kYXRhICovCi0raW50IG51bVR5cGVzU2VlbjsKLSsKLSt0eXBlZGVmIGVudW0ge2RvVHlwZSwgZG9WYWx1ZX0gZG9XaGF0OwotKwotK3N0cnVjdCBzdHJfdHlwZQotK3sKLSsJaW50CWJsZW47Ci0rCWludAlzbGVuOwotKwlpbnQJZW5kOwotKwljaGFyICoJYnVmOwotK307Ci0rCi0rdHlwZWRlZiBzdHJ1Y3Qgc3RyX3R5cGUgKglzdHJfcHRyOwotKwotK3N0cl9wdHIgc3RyX2luaXQodm9pZCk7Ci0rdm9pZCBzdHJfYWRkKHN0cl9wdHIsIGNoYXIgKik7Ci0rdm9pZCBzdHJfZnJlZShzdHJfcHRyKTsKLStjaGFyICpzdHJfdmFsKHN0cl9wdHIpOwotK3N0cl9wdHIgc3RyX2R1cChjaGFyICopOwotKwotKy8qIGZpbGwgaW4gdGhlIHZhbHVlc1NlZW4gYXJyYXkgd2l0aCBhbGwgdGhlIHBvaW50ZXIgdmFsdWVzIHdlIHNlZSAqLwotK3ZvaWQKLSthaWZfZGlzY292ZXIoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIGRvV2hhdCB3aGF0KQotK3sKLSsgIGludCB2YWx1ZXNTZWVuSW5kZXg7Ci0rICBzdHJ1Y3QgdHlwZSAqZWx0dHlwZTsKLSsgIHVuc2lnbmVkIGludCBlbHRsZW4sIG9mZnNldDsKLSsgIENPUkVfQUREUiBhZGRyOwotKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQotKyAgICB7Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1RZUEVERUY6Ci0rICAgICAgYWlmX2Rpc2NvdmVyKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCB2YWxhZGRyLCB3aGF0KTsKLSsgICAgICBicmVhazsKLSsKLSsgICAgY2FzZSBUWVBFX0NPREVfUFRSOgotKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6Ci0rICAgICAgaWYgKHdoYXQgPT0gZG9WYWx1ZSkKLSsgICAgICB7IC8qIGxvb2tpbmcgZm9yIHZhbHVlcyAqLwotKwlzdHJ1Y3QgdmFsdWUgKmRlcmVmX3ZhbDsKLSsJYWRkciA9IHVucGFja19wb2ludGVyICh0eXBlLCB2YWxhZGRyKTsKLSsJaWYgKGFkZHIgPT0gMCkgYnJlYWs7Ci0rCWVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rCWlmIChUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1BUUiAmJgotKwkgIFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfUkVGICYmCi0rCSAgVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCi0rCSAgYnJlYWs7IC8qIG5vIG5lZWQgdG8gcmVtZW1iZXIgcG9pbnRlcnMgbm90IGxlYWRpbmcgdG8gY3ljbGVzICovCi0rCWZvciAodmFsdWVzU2VlbkluZGV4ID0gMDsgdmFsdWVzU2VlbkluZGV4IDwgbnVtVmFsdWVzU2VlbjsKLSsJdmFsdWVzU2VlbkluZGV4KyspCi0rCXsKLSsJICBpZiAoYWRkciA9PSB2YWx1ZXNTZWVuW3ZhbHVlc1NlZW5JbmRleF0uYWRkcikKLSsJICB7Ci0rCSAgICB2YWx1ZXNTZWVuW3ZhbHVlc1NlZW5JbmRleF0udXNlZCA9IDE7IC8qIGZvdW5kIGEgY2lyY3VsYXJpdHkgKi8KLSsJICAgIHJldHVybjsKLSsJICB9Ci0rCX0KLSsJaWYgKG51bVZhbHVlc1NlZW4gPCBNQVhfVkFMVUVTX1NFRU4pCi0rCSAgewotKwkgICAgdmFsdWVzU2VlbltudW1WYWx1ZXNTZWVuXS5hZGRyID0gYWRkcjsKLSsJICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0udXNlZCA9IDA7Ci0rCSAgICBudW1WYWx1ZXNTZWVuICs9IDE7Ci0rCSAgfQotKwkvKgotKwkqKiBDaGVjayBhZGRyIGlzIHZhbGlkIQotKwkqLwotKwlpZiAoIGNoZWNrX3ZhbHVlKGVsdHR5cGUsIGFkZHIsICZkZXJlZl92YWwpICkKLSsJCWFpZl9kaXNjb3ZlcihlbHR0eXBlLCBWQUxVRV9DT05URU5UUyAoZGVyZWZfdmFsKSwgd2hhdCk7Ci0rCWJyZWFrOwotKyAgICAgIH0gZWxzZSB7Ci0rCS8qIGxvb2tpbmcgZm9yIHR5cGVzICovCi0rCWludCB0eXBlc1NlZW5JbmRleDsKLSsJZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKLSsJaWYgKFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfUFRSICYmCi0rCSAgVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9SRUYgJiYKLSsJICBUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVCkKLSsJICBicmVhazsgLyogbm8gbmVlZCB0byByZW1lbWJlciBwb2ludGVycyBub3QgbGVhZGluZyB0byBjeWNsZXMgKi8KLSsJZm9yICh0eXBlc1NlZW5JbmRleCA9IDA7IHR5cGVzU2VlbkluZGV4IDwgbnVtVHlwZXNTZWVuOwotKwl0eXBlc1NlZW5JbmRleCsrKQotKwl7Ci0rCSAgaWYgKGVsdHR5cGUgPT0gdHlwZXNTZWVuW3R5cGVzU2VlbkluZGV4XS50eXBlKQotKwkgIHsKLSsJICAgIHR5cGVzU2Vlblt0eXBlc1NlZW5JbmRleF0udXNlZCA9IDE7IC8qIGZvdW5kIGEgY2lyY3VsYXJpdHkgKi8KLSsJICAgIHJldHVybjsKLSsJICB9Ci0rCX0KLSsJaWYgKG51bVR5cGVzU2VlbiA8IE1BWF9UWVBFU19TRUVOKQotKwkgIHsKLSsJICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnR5cGUgPSBlbHR0eXBlOwotKwkgICAgdHlwZXNTZWVuW251bVR5cGVzU2Vlbl0udXNlZCA9IDA7Ci0rCSAgICBudW1UeXBlc1NlZW4gKz0gMTsKLSsJICB9Ci0rCWFpZl9kaXNjb3ZlcihlbHR0eXBlLCAwLCB3aGF0KTsKLSsJYnJlYWs7Ci0rICAgICAgfSAvKiBkaXNjb3ZlciB0eXBlcyAqLwotKwotKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgotKyAgICAgIHsgLyogZGlzY292ZXIgZWl0aGVyIHZhbHVlcyBvciB0eXBlcyAqLwotKwlpbnQgaTsKLSsgICAgICAJc3RydWN0IGZpZWxkICp0aGlzRmllbGQ7Ci0rCXN0cnVjdCB0eXBlICpmdHlwZTsKLSsJc3RydWN0IHZhbHVlICp2OwotKwotKwlmb3IgKCBpID0gMDsgaSA8IFRZUEVfTkZJRUxEUyh0eXBlKTsgaSsrICkKLSsJewotKwkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJY29udGludWU7Ci0rCi0rCQlpZiAoIHdoYXQgPT0gZG9UeXBlICkKLSsJCXsKLSsJCQlhaWZfZGlzY292ZXIoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLCAwLCB3aGF0KTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCWlmIAotKwkJKAotKwkJCSFUWVBFX0ZJRUxEX1NUQVRJQyh0eXBlLCBpKSAKLSsJCQkmJiAKLSsJCQlUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKQotKwkJKQotKwkJewotKwkJCXYgPSB2YWx1ZV9mcm9tX2xvbmdlc3QoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLAotKwkJCQl1bnBhY2tfZmllbGRfYXNfbG9uZyAodHlwZSwgdmFsYWRkciwgaSkpOwotKwotKwkJCWFpZl9kaXNjb3ZlcihUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCBWQUxVRV9DT05URU5UUyh2KSwgd2hhdCk7Ci0rCQl9Ci0rCQllbHNlIGlmICggVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpICkKLSsJCXsKLSsJCQl2ID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpKTsKLSsKLSsJCQlpZiAoIHYgPT0gTlVMTCApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCS8qCi0rCQkJWFhYCi0rCQkJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCB2LAotKwkJCXN0cmVhbSwgZm9ybWF0LCByZWN1cnNlICsgMSwKLSsJCQlwcmV0dHkpOwotKwkJCSovCi0rCQl9Ci0rCQllbHNlCi0rCQl7Ci0rCQkJYWlmX2Rpc2NvdmVyKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpKSwgdmFsYWRkciArIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSAvIDgsIHdoYXQpOwotKwkJfQotKwkgIH0KLSsgICAgICB9Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKyAgICAgIGVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rICAgICAgaWYgKHdoYXQgPT0gZG9WYWx1ZSkKLSsgICAgICB7IC8qIGxvb2tpbmcgZm9yIHZhbHVlcyAqLwotKwl1bnNpZ25lZCBpbnQgdGVtcF9sZW4sIGxlbjsKLSsJZWx0bGVuID0gVFlQRV9MRU5HVEggKGVsdHR5cGUpOwotKwlsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSkgLyBlbHRsZW47Ci0rCW9mZnNldCA9IDA7Ci0rCWZvciAodGVtcF9sZW4gPSAwOyB0ZW1wX2xlbiA8IGxlbjsgdGVtcF9sZW4rKykKLSsJICB7Ci0rCSAgICBhaWZfZGlzY292ZXIoZWx0dHlwZSwgdmFsYWRkcitvZmZzZXQsIHdoYXQpOwotKwkgICAgb2Zmc2V0ICs9IGVsdGxlbjsKLSsJICB9Ci0rICAgICAgfSBlbHNlIHsgLyogbG9va2luZyBmb3IgdHlwZXMgKi8KLSsJYWlmX2Rpc2NvdmVyKGVsdHR5cGUsIDAsIHdoYXQpOwotKyAgICAgIH0gLyogVFlQRV9DT0RFX0FSUkFZICovCi0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKLSsgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgotKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgotKyAgICBjYXNlIFRZUEVfQ09ERV9VTkRFRjoKLSsgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKLSsgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKLSsgICAgY2FzZSBUWVBFX0NPREVfSU5UOgotKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1ZPSUQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgotKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgotKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJJTkc6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKLSsgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKLSsgICAgY2FzZSBUWVBFX0NPREVfVEVNUExBVEU6Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGRlZmF1bHQ6Ci0rICAgICAgZXJyb3IgKCJ0eXBlIG5vdCBoYW5kbGVkIGluIHR5cGVfZGlzY292ZXIiKTsKLSsgICAgICBicmVhazsKLSsgICAgfSAvKiBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpICovCi0rfSAvKiBhaWZfZGlzY292ZXIgKi8KLSsKLSsvKiBzcXVhc2ggdGhlIHZhbHVlc1NlZW4gYW5kIHR5cGVzU2VlbiBhcnJheXMgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGVsZW1lbnRzICovCi0rdm9pZCAKLSthaWZfcmVkdWNlKHZvaWQpCi0rewotKyAgaW50IGZyb250LCBiYWNrOwotKyAgZnJvbnQgPSBiYWNrID0gMDsKLSsgIHdoaWxlIChmcm9udCA8IG51bVZhbHVlc1NlZW4pCi0rICAgIHsKLSsgICAgICAvKiBtb3ZlIGJhY2sgdG8gZmlyc3QgdW51c2VkIGVudHJ5ICovCi0rICAgICAgdmFsdWVzU2VlbltudW1WYWx1ZXNTZWVuXS51c2VkID0gMDsgLyogcHNldWRvLWRhdGEgKi8KLSsgICAgICB3aGlsZSAodmFsdWVzU2VlbltiYWNrXS51c2VkKSBiYWNrICs9IDE7Ci0rICAgICAgaWYgKGJhY2sgPT0gbnVtVmFsdWVzU2VlbikgYnJlYWs7Ci0rICAgICAgLyogbW92ZSBmcm9udCB0byBmaXJzdCB1c2VkIGVudHJ5IGJleW9uZCBiYWNrICovCi0rICAgICAgaWYgKGZyb250IDw9IGJhY2spIGZyb250ID0gYmFjaysxOwotKyAgICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0udXNlZCA9IDE7IC8qIHBzZXVkby1kYXRhICovCi0rICAgICAgd2hpbGUgKCF2YWx1ZXNTZWVuW2Zyb250XS51c2VkKSBmcm9udCArPSAxOwotKyAgICAgIGlmIChmcm9udCA9PSBudW1WYWx1ZXNTZWVuKSBicmVhazsKLSsgICAgICAvKiBjb3B5IGZyb20gZnJvbnQgdG8gYmFjayAqLwotKyAgICAgIHZhbHVlc1NlZW5bYmFja10gPSB2YWx1ZXNTZWVuW2Zyb250XTsKLSsgICAgICB2YWx1ZXNTZWVuW2Zyb250XS51c2VkID0gMDsKLSsgICAgfQotKyAgbnVtVmFsdWVzU2VlbiA9IGJhY2s7Ci0rICBmcm9udCA9IGJhY2sgPSAwOwotKyAgd2hpbGUgKGZyb250IDwgbnVtVHlwZXNTZWVuKQotKyAgICB7Ci0rICAgICAgLyogbW92ZSBiYWNrIHRvIGZpcnN0IHVudXNlZCBlbnRyeSAqLwotKyAgICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnVzZWQgPSAwOyAvKiBwc2V1ZG8tZGF0YSAqLwotKyAgICAgIHdoaWxlICh0eXBlc1NlZW5bYmFja10udXNlZCkgYmFjayArPSAxOwotKyAgICAgIGlmIChiYWNrID09IG51bVR5cGVzU2VlbikgYnJlYWs7Ci0rICAgICAgLyogbW92ZSBmcm9udCB0byBmaXJzdCB1c2VkIGVudHJ5IGJleW9uZCBiYWNrICovCi0rICAgICAgaWYgKGZyb250IDw9IGJhY2spIGZyb250ID0gYmFjaysxOwotKyAgICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnVzZWQgPSAxOyAvKiBwc2V1ZG8tZGF0YSAqLwotKyAgICAgIHdoaWxlICghdHlwZXNTZWVuW2Zyb250XS51c2VkKSBmcm9udCArPSAxOwotKyAgICAgIGlmIChmcm9udCA9PSBudW1UeXBlc1NlZW4pIGJyZWFrOwotKyAgICAgIC8qIGNvcHkgZnJvbSBmcm9udCB0byBiYWNrICovCi0rICAgICAgdHlwZXNTZWVuW2JhY2tdID0gdHlwZXNTZWVuW2Zyb250XTsKLSsgICAgICB0eXBlc1NlZW5bZnJvbnRdLnVzZWQgPSAwOwotKyAgICB9Ci0rICAgIG51bVR5cGVzU2VlbiA9IGJhY2s7Ci0rfSAvKiBhaWZfcmVkdWNlICovCi0rCi0raW50IGRhdGFTdHJlYW1Qb3M7Ci0rCi0rdm9pZCAKLStlbWl0RGF0YShjaGFyIHRvRW1pdCwgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rICBmcHJpbnRmX2ZpbHRlcmVkKHN0cmVhbSwgIiUwMngiLCB0b0VtaXQgJiAweGZmKTsKLSsgIGRhdGFTdHJlYW1Qb3MgKz0gMTsKLSt9IC8qIGVtaXREYXRhICovCi0rICAKLSt2b2lkCi0rYWlmX2VtaXRfc3RyaW5nKENPUkVfQUREUiBhZGRyLCBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtKQotK3sgLyogY29kZSBtb2RpZmllZCBmcm9tIHZhbF9wcmludF9zdHJpbmcgKCkgKi8KLSsgIGludCBlcnJjb2RlOwkJCS8qIEVycm5vIHJldHVybmVkIGZyb20gYmFkIHJlYWRzLiAqLwotKyAgdW5zaWduZWQgaW50IGZldGNobGltaXQ7CS8qIE1heGltdW0gbnVtYmVyIG9mIGNoYXJzIHRvIHByaW50LiAqLwotKyAgdW5zaWduZWQgaW50IG5mZXRjaDsJCS8qIENoYXJzIHRvIGZldGNoIC8gY2hhcnMgZmV0Y2hlZC4gKi8KLSsgIHVuc2lnbmVkIGludCBjaHVua3NpemU7CS8qIFNpemUgb2YgZWFjaCBmZXRjaCwgaW4gY2hhcnMuICovCi0rICBjaGFyICpidWZmZXIgPSBOVUxMOwkJLyogRHluYW1pY2FsbHkgZ3Jvd2FibGUgZmV0Y2ggYnVmZmVyLiAqLwotKyAgY2hhciAqYnVmcHRyOwkJCS8qIFBvaW50ZXIgdG8gbmV4dCBhdmFpbGFibGUgYnl0ZSBpbiBidWZmZXIuICovCi0rICBjaGFyICpsaW1pdDsJCQkvKiBGaXJzdCBsb2NhdGlvbiBwYXN0IGVuZCBvZiBmZXRjaCBidWZmZXIuICovCi0rICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gTlVMTDsJLyogVG9wIG9mIHRoZSBvbGQgY2xlYW51cCBjaGFpbi4gKi8KLSsgIGludCBmb3VuZF9udWw7CQkvKiBOb24temVybyBpZiB3ZSBmb3VuZCB0aGUgbnVsIGNoYXIgKi8KLSsgIHVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IDA7Ci0rICBpbnQgbGVuZ3RoOwkJCS8qIGhvdyBsb25nIHRoZSBzdHJpbmcgdHVybmVkIG91dCB0byBiZSAqLwotKwotKyAgaWYgKGFkZHIgPT0gMCkKLSsgIHsKLSsgICAgICBlbWl0RGF0YSgwLCBzdHJlYW0pOwotKyAgICAgIGVtaXREYXRhKDAsIHN0cmVhbSk7Ci0rICAgICAgcmV0dXJuOwotKyAgfQotKwotKyAgZmV0Y2hsaW1pdCA9IHByaW50X21heDsKLSsgIGNodW5rc2l6ZSA9IG1pbiAoOCwgZmV0Y2hsaW1pdCk7Ci0rICAvKiBMb29wIHVudGlsIHdlIGVpdGhlciBoYXZlIGFsbCB0aGUgY2hhcmFjdGVycyB0byBwcmludCwgb3Igd2UgZW5jb3VudGVyCi0rICAgICBzb21lIGVycm9yLCBzdWNoIGFzIGJ1bXBpbmcgaW50byB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAqLwotKyAgZm91bmRfbnVsID0gMDsKLSsgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAobnVsbF9jbGVhbnVwLCAwKTsKLSsgIGRvCi0rICAgIHsKLSsgICAgICBRVUlUOwotKyAgICAgIG5mZXRjaCA9IG1pbiAoY2h1bmtzaXplLCBmZXRjaGxpbWl0IC0gYnVmc2l6ZSk7Ci0rICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotKwlidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChuZmV0Y2gpOwotKyAgICAgIGVsc2UKLSsJewotKwkgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7Ci0rCSAgYnVmZmVyID0gKGNoYXIgKikgeHJlYWxsb2MgKGJ1ZmZlciwgbmZldGNoICsgYnVmc2l6ZSk7Ci0rCX0KLSsgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGJ1ZmZlcik7Ci0rICAgICAgYnVmcHRyID0gYnVmZmVyICsgYnVmc2l6ZTsKLSsgICAgICBidWZzaXplICs9IG5mZXRjaDsKLSsgICAgICAvKiBSZWFkIGFzIG11Y2ggYXMgd2UgY2FuLiAqLwotKyAgICAgIG5mZXRjaCA9IHBhcnRpYWxfbWVtb3J5X3JlYWQgKGFkZHIsIGJ1ZnB0ciwgbmZldGNoLCAmZXJyY29kZSk7Ci0rICAgICAgLyogU2NhbiB0aGlzIGNodW5rIGZvciB0aGUgbnVsbCBieXRlICovCi0rICAgICAgbGltaXQgPSBidWZwdHIgKyBuZmV0Y2g7Ci0rICAgICAgd2hpbGUgKGJ1ZnB0ciA8IGxpbWl0KQotKwl7Ci0rCSAgdW5zaWduZWQgbG9uZyBjOwotKwkgIGMgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZnB0ciwgMSk7Ci0rCSAgYWRkciArPSAxOwotKwkgIGJ1ZnB0ciArPSAxOwotKwkgIGlmIChjID09IDApCi0rCSAgICB7Ci0rCSAgICAgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgYW55IGVycm9yIHdoaWNoIGhhcHBlbmVkIGFmdGVyCi0rCQkgIHRoZSBOVUxMIHRlcm1pbmF0b3IuICAqLwotKwkgICAgICBlcnJjb2RlID0gMDsKLSsJICAgICAgZm91bmRfbnVsID0gMTsKLSsJICAgICAgYnJlYWs7Ci0rCSAgICB9Ci0rCX0gLyogd2hpbGUgKGJ1ZnB0ciA8IGxpbWl0KSAqLwotKyAgICB9IC8qIGRvICovCi0rICB3aGlsZSAoZXJyY29kZSA9PSAwCS8qIG5vIGVycm9yICovCi0rCSAgJiYgYnVmcHRyIC0gYnVmZmVyIDwgZmV0Y2hsaW1pdAkvKiBubyBvdmVycnVuICovCi0rCSAgJiYgIWZvdW5kX251bCk7CS8qIGhhdmVuJ3QgZm91bmQgbnVsIHlldCAqLwotKyAgUVVJVDsKLSsgIGxlbmd0aCA9IDA7Ci0rICBpZiAoZXJyY29kZSA9PSAwIHx8IGJ1ZnB0ciA+IGJ1ZmZlcikKLSsgICAgewotKyAgICAgIGxlbmd0aCA9IGJ1ZnB0ciAtIGJ1ZmZlciAtIDE7IC8qIGRvbid0IGluY2x1ZGUgbnVsbCAqLwotKyAgICAgIGVtaXREYXRhKChsZW5ndGggPj4gOCkgJiAwNzcsIHN0cmVhbSk7Ci0rICAgICAgZW1pdERhdGEobGVuZ3RoICYgMDc3LCBzdHJlYW0pOwotKyAgICAgIGZvciAoOyBsZW5ndGggPiAwOyBsZW5ndGgtLSkgewotKwllbWl0RGF0YSgqYnVmZmVyKyssIHN0cmVhbSk7IAotKyAgICAgIH0KLSsgICAgfQotKyAgaWYgKGVycmNvZGUgIT0gMCkKLSsgICAgewotKyAgICAgIGlmIChlcnJjb2RlID09IEVJTykKLSsJewotKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiA8QWRkcmVzcyAiKTsKLSsJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7Ci0rCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIG91dCBvZiBib3VuZHM+Iik7Ci0rCX0KLSsgICAgICBlbHNlCi0rCXsKLSsJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPEVycm9yIHJlYWRpbmcgYWRkcmVzcyAiKTsKLSsJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7Ci0rCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiOiAlcz4iLCBzYWZlX3N0cmVycm9yIChlcnJjb2RlKSk7Ci0rCX0KLSsgICAgfQotKyAgZ2RiX2ZsdXNoIChzdHJlYW0pOwotKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Ci0rICByZXR1cm47Ci0rfSAvKiBhaWZfZW1pdF9zdHJpbmcgKi8KLSsKLStzdHJfcHRyCi0rZ2RiX3R5cGVfdG9fZmRzKHN0cnVjdCB0eXBlICp0eXBlKQotK3sKLSsJaW50CQlsZW47Ci0rCWludAkJZWxlbjsKLSsJaW50CQluZmllbGRzOwotKwlpbnQJCWk7Ci0rCWludAkJaXg7Ci0rCXN0cl9wdHIJCXM7Ci0rCXN0cl9wdHIJCXR5cGVfcHRyOwotKwlzdHJfcHRyCQl0eXBlX3N0cjsKLSsJc3RydWN0IHR5cGUgKglldHlwZTsKLSsKLSsJQ0hFQ0tfVFlQRURFRiAodHlwZSk7Ci0rCi0rCXR5cGVfc3RyID0gc3RyX2luaXQoKTsKLSsKLSsJZm9yICggaXggPSAwOyBpeCA8IG51bVR5cGVzU2VlbjsgaXgrKykKLSsJewotKwkJaWYgCi0rCQkoCi0rCQkJdHlwZXNTZWVuW2l4XS50eXBlICE9IHR5cGUKLSsJCQl8fAotKwkJCSF0eXBlc1NlZW5baXhdLnVzZWQKLSsJCSkKLSsJCQljb250aW51ZTsKLSsKLSsJCS8qCi0rCQkqKiBNdWx0aXBsZSB1c2UgdHlwZQotKwkJKi8KLSsKLSsJCWlmICggdHlwZXNTZWVuW2l4XS51c2VkICE9IDEgKQotKwkJewotKwkJCS8qIAotKwkJCSoqIHJlZmVycmluZyB0byBvbmUgYWxyZWFkeSBlbWl0dGVkIAotKwkJCSovCi0rCi0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9SRUZFUkVOQ0UsIGl4KSk7Ci0rCQkJcmV0dXJuIHR5cGVfc3RyOwotKwkJfQotKwotKwkJLyoKLSsJCSoqIGZpcnN0IHRpbWU7IGVtaXQgbmFtZQotKwkJKi8KLSsKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfTkFNRSwgaXgsIE5VTEwpKTsKLSsJCXR5cGVzU2VlbltpeF0udXNlZCA9IDI7Ci0rCQlicmVhazsKLSsJfQotKwotKwlsZW4gPSBUWVBFX0xFTkdUSCh0eXBlKTsKLSsKLSsJc3dpdGNoICggVFlQRV9DT0RFKHR5cGUpICkKLSsJewotKwljYXNlIFRZUEVfQ09ERV9UWVBFREVGOgotKwkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSk7Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBzdHJfdmFsKHR5cGVfcHRyKSk7Ci0rCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQlyZXR1cm4gdHlwZV9zdHI7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKwkJaWYgCi0rCQkoCi0rCQkJbGVuID4gMAotKwkJCSYmCi0rCQkJVFlQRV9MRU5HVEgoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSkgPiAwCi0rCQkpCi0rCQl7Ci0rCQkJZXR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKLSsJCQllbGVuID0gVFlQRV9MRU5HVEgoZXR5cGUpOwotKwkJCWxlbiAvPSBlbGVuOwotKwotKwkJCXR5cGVfcHRyID0gZ2RiX3R5cGVfdG9fZmRzKGV0eXBlKTsKLSsKLSsJCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0FSUkFZLCAKLSsJCQkJVHlwZVRvRkRTKEFJRl9SQU5HRSwgMCwgbGVuLTEsIAotKwkJCQkJVHlwZVRvRkRTKEFJRl9JTlRFR0VSLCAxLCBzaXplb2YoaW50KSkpLAotKwkJCQlzdHJfdmFsKHR5cGVfcHRyKSkpOwotKwotKwkJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBhIHBvaW50ZXIuLi4KLSsJCSovCi0rCi0rCWNhc2UgVFlQRV9DT0RFX1BUUjoKLSsJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsJCWVsZW4gPSBUWVBFX0xFTkdUSChldHlwZSk7Ci0rCi0rCQlpZiAKLSsJCSgKLSsJCQllbGVuID09IDEKLSsJCQkmJgotKwkJCVRZUEVfQ09ERShldHlwZSkgPT0gVFlQRV9DT0RFX0lOVAotKwkJKQotKwkJewotKwkJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfU1RSSU5HKSk7Ci0rCQl9Ci0rCQllbHNlCi0rCQl7Ci0rCQkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCXN0cl9hZGQodHlwZV9zdHIsIAotKwkJCQlUeXBlVG9GRFMoQUlGX1BPSU5URVIsIHN0cl92YWwodHlwZV9wdHIpKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJfQotKwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0lOVDoKLSsJCWlmCi0rCQkoCi0rCQkJbGVuICE9IDEKLSsJCQl8fAotKwkJCXN0cm5jbXAoVFlQRV9OQU1FKHR5cGUpLCAiY2hhciIsIDUpICE9IDAKLSsJCSkgCi0rCQl7Ci0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJCVR5cGVUb0ZEUyhBSUZfSU5URUdFUiwgVFlQRV9VTlNJR05FRCh0eXBlKSA/IDAgOiAxLCBsZW4pKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBjaGFyLi4uCi0rCQkqLwotKwotKwljYXNlIFRZUEVfQ09ERV9DSEFSOgotKwkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9DSEFSQUNURVIpKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0ZMT0FUSU5HLCBsZW4pKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOSU9OOgotKwkJbmZpZWxkcyA9IFRZUEVfTkZJRUxEUyh0eXBlKTsKLSsJCQotKwkJaWYgKCBIQVZFX0NQTFVTX1NUUlVDVCh0eXBlKSApCi0rCQkJaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyh0eXBlKTsKLSsJCWVsc2UKLSsJCQlpID0gMDsKLSsKLSsJCS8qCi0rCQkqKiBGaXJzdCBuZWVkIHRvIGNhbGN1bGF0ZSBzaXplIG9mIHN0cnVjdCwgc2luY2UgaXQKLSsJCSoqIG1heSBub3QgYmUgcGFja2VkLgotKwkJKi8KLSsKLSsJCWZvciAoIGxlbiA9IDAgOyBpIDwgbmZpZWxkcyA7IGkrKyApCi0rCQl7Ci0rCQkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaSkpOwotKwkJCWVsZW4gPSBUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKSA/Ci0rCQkJCQlUWVBFX0ZJRUxEX0JJVFNJWkUodHlwZSwgaSkgLyA4IDoKLSsJCQkJCVRZUEVfTEVOR1RIKGV0eXBlKTsKLSsKLSsJCQlpZiAoIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUICkKLSsJCQkJbGVuICs9IGVsZW47Ci0rCQkJZWxzZSBpZiAoIGVsZW4gPiBsZW4gKQotKwkJCQlsZW4gPSBlbGVuOwotKwkJfQotKwotKwkJdHlwZV9wdHIgPSBzdHJfZHVwKFR5cGVUb0ZEUyhBSUZfU1RSVUNUKSk7Ci0rCi0rCQkvKgotKwkJKiogTmVlZCB0byBjYWxjdWxhdGUgb2Zmc2V0IChsZW4pLgotKwkJKi8KLSsJCWxlbiA9IDA7Ci0rCi0rCQlpZiAoIEhBVkVfQ1BMVVNfU1RSVUNUKHR5cGUpICkKLSsJCQlpID0gVFlQRV9OX0JBU0VDTEFTU0VTKHR5cGUpOwotKwkJZWxzZQotKwkJCWkgPSAwOwotKwotKwkJZm9yICg7IGkgPCBuZmllbGRzIDsgaSsrICkKLSsJCXsKLSsJCQljaGFyICp0OwotKwotKwkJCWlmICggVFlQRV9GSUVMRF9JR05PUkUodHlwZSwgaSkgKQotKwkJCQljb250aW51ZTsKLSsKLSsJCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpKTsKLSsKLSsJCQllbGVuID0gVFlQRV9GSUVMRF9QQUNLRUQodHlwZSwgaSkgPwotKwkJCQlUWVBFX0ZJRUxEX0JJVFNJWkUodHlwZSwgaSkgOgotKwkJCQlUWVBFX0xFTkdUSChldHlwZSkgKiA4OwotKwotKwkJCXMgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCWlmICggSEFWRV9DUExVU19TVFJVQ1QodHlwZSkgKQotKwkJCXsKLSsJCQkJaWYgKCBUWVBFX0ZJRUxEX1BST1RFQ1RFRCh0eXBlLCBpKSApCi0rCQkJCQl0ID0gRkRTQWRkRmllbGRUb0NsYXNzKAotKwkJCQkJCXN0cl92YWwodHlwZV9wdHIpLAotKwkJCQkJICAgIAlBSUZBQ0NfUFJPVEVDVEVELCAKLSsJCQkJCSAgICAJVFlQRV9GSUVMRF9OQU1FKHR5cGUsIGkpLCAKLSsJCQkJCQlzdHJfdmFsKHMpKTsKLSsJCQkJZWxzZSBpZiAoIFRZUEVfRklFTERfUFJJVkFURSh0eXBlLCBpKSApCi0rCQkJCQl0ID0gRkRTQWRkRmllbGRUb0NsYXNzKAotKwkJCQkJCXN0cl92YWwgKHR5cGVfcHRyKSwgCi0rCQkJCQkJQUlGQUNDX1BSSVZBVEUsIAotKwkJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgCi0rCQkJCQkJc3RyX3ZhbChzKSk7Ci0rCQkJCWVsc2UKLSsJCQkJCXQgPSBGRFNBZGRGaWVsZFRvQ2xhc3MoCi0rCQkJCQkJc3RyX3ZhbCAodHlwZV9wdHIpLCAKLSsJCQkJCQlBSUZBQ0NfUFVCTElDLCAKLSsJCQkJCQlUWVBFX0ZJRUxEX05BTUUodHlwZSwgaSksIAotKwkJCQkJCXN0cl92YWwocykpOwotKwotKwkJCX0KLSsJCQllbHNlCi0rCQkJCXQgPSBGRFNBZGRGaWVsZFRvU3RydWN0KHN0cl92YWwodHlwZV9wdHIpLCAKLSsJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgc3RyX3ZhbChzKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJCQotKwkJCXR5cGVfcHRyID0gc3RyX2R1cCh0KTsKLSsKLSsJCQlzdHJfZnJlZShzKTsKLSsKLSsJCQkvKgotKwkJCSoqIENhbGMgb2Zmc2V0LgotKwkJCSovCi0rCQkJaWYgKCBUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCApCi0rCQkJCWxlbiArPSBlbGVuOwotKwkJfQotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgc3RyX3ZhbCh0eXBlX3B0cikpOwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX1ZPSUQ6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX1ZPSUQsIGxlbikpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCQluZmllbGRzID0gVFlQRV9ORklFTERTICh0eXBlKTsKLSsKLSsJCXR5cGVfcHRyID0gc3RyX2R1cChUeXBlVG9GRFMoQUlGX0VOVU0pKTsKLSsKLSsJCWZvciAoIGkgPSAwIDsgaSA8IG5maWVsZHMgOyBpKysgKQotKwkJewotKwkJCWNoYXIgKgl0OwotKwotKwkJCXQgPSBGRFNBZGRDb25zdFRvRW51bShzdHJfdmFsKHR5cGVfcHRyKSwKLSsJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwKLSsJCQkJCVRZUEVfRklFTERfQklUUE9TKHR5cGUsIGkpKTsKLSsKLSsJCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCi0rCQkJdHlwZV9wdHIgPSBzdHJfZHVwKHQpOwotKwkJfQotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgc3RyX3ZhbCh0eXBlX3B0cikpOwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0ZVTkM6Ci0rCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKwotKwkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJVHlwZVRvRkRTKEFJRl9GVU5DVElPTiwgc3RyX3ZhbCh0eXBlX3B0cikpKTsKLSsKLSsJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJJTkc6Ci0rCWNhc2UgVFlQRV9DT0RFX1NFVDoKLSsJY2FzZSBUWVBFX0NPREVfUkFOR0U6Ci0rCWNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKLSsJY2FzZSBUWVBFX0NPREVfTUVNQkVSOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1JFRjoKLSsJY2FzZSBUWVBFX0NPREVfQk9PTDoKLSsJY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfSU5WQUxJRCkpOwotKwkJYnJlYWs7Ci0rCi0rCWRlZmF1bHQ6Ci0rCQllcnJvcigiSW52YWxpZCBDL0MrKyB0eXBlIGNvZGUgJWQgaW4gc3ltYm9sIHRhYmxlLiIsIFRZUEVfQ09ERSh0eXBlKSk7Ci0rCX0KLSsKLSsJcmV0dXJuIHR5cGVfc3RyOwotK30KLSsKLSt2b2lkCi0rYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIENPUkVfQUREUiBhZGRyZXNzLCBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtKQotK3sKLSsJaW50CQkJaXg7Ci0rCWludAkJCXJlczsKLSsJaW50CQkJdmFsaWQ7Ci0rCXVuc2lnbmVkCQlsZW47Ci0rCXVuc2lnbmVkCQllbHRsZW47Ci0rCUxPTkdFU1QJCQl2YWw7Ci0rCWZsb2F0CQkJZnZhbDsKLSsJZG91YmxlCQkJZHZhbDsKLSsjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotKwlsb25nIGRvdWJsZQkJbGR2YWw7Ci0rI2VuZGlmIC8qIEhBVkVfTE9OR19ET1VCTEUgKi8KLSsJQ09SRV9BRERSCQlhZGRyOwotKwlzdHJ1Y3QgdmFsdWUgKgkJdnB0cjsKLSsJdW5pb24gaWVlZV9kb3VibGUJdjsKLSsJc3RydWN0IHR5cGUgKgkJZWx0dHlwZTsKLSsJc3RydWN0IGZpZWxkICoJCXRoaXNGaWVsZDsKLSsKLSsJQ0hFQ0tfVFlQRURFRih0eXBlKTsKLSsKLSsJc3dpdGNoICggVFlQRV9DT0RFKHR5cGUpICkKLSsJewotKwljYXNlIFRZUEVfQ09ERV9UWVBFREVGOgotKwkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSwgdmFsYWRkciwgYWRkcmVzcywgc3RyZWFtKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9BUlJBWToKLSsJCWVsdHR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUodHlwZSkpOwotKwotKwkJaWYgCi0rCQkoCi0rCQkJVFlQRV9MRU5HVEgodHlwZSkgPiAwCi0rCQkJJiYKLSsJCQlUWVBFX0xFTkdUSChUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKSA+IDAKLSsJCSkKLSsJCXsKLSsJCQllbHRsZW4gPSBUWVBFX0xFTkdUSChlbHR0eXBlKTsKLSsJCQlsZW4gPSBUWVBFX0xFTkdUSCh0eXBlKSAvIGVsdGxlbjsKLSsKLSsJCQlmb3IgKCBpeCA9IDA7IGl4IDwgbGVuOyBpeCsrICkKLSsJCQkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoZWx0dHlwZSwgdmFsYWRkciArIGl4ICogZWx0bGVuLCBhZGRyZXNzICsgaXggKiBlbHRsZW4sIHN0cmVhbSk7Ci0rCi0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQkvKgotKwkJKiogVHJlYXQgYXMgYSBwb2ludGVyLi4uCi0rCQkqLwotKwkJYWRkciA9IGFkZHJlc3M7Ci0rCQlnb3RvIGFzUHRyOwotKwotKwljYXNlIFRZUEVfQ09ERV9SRUY6Ci0rCWNhc2UgVFlQRV9DT0RFX1BUUjoKLSsJCWFkZHIgPSB1bnBhY2tfcG9pbnRlcih0eXBlLCB2YWxhZGRyKTsKLSsKLSsJYXNQdHI6Ci0rCQllbHR0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsKLSsJCWlmCi0rCQkoCi0rCQkJVFlQRV9MRU5HVEgoZWx0dHlwZSkgPT0gMQotKwkJCSYmIAotKwkJCVRZUEVfQ09ERShlbHR0eXBlKSA9PSBUWVBFX0NPREVfSU5UCi0rCQkpCi0rCQl7Ci0rCQkJLyoKLSsJCQkqKiBjYWxsIGl0IGEgc3RyaW5nCi0rCQkJKi8KLSsJCQkodm9pZClhaWZfZW1pdF9zdHJpbmcoYWRkciwgc3RyZWFtKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCWlmICggYWRkciA9PSAwICkKLSsJCXsKLSsJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05JTCwgc3RyZWFtKTsgCi0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQlmb3IgKCBpeCA9IDAgOyBpeCA8IG51bVZhbHVlc1NlZW47IGl4KysgKQotKwkJewotKwkJCWlmCi0rCQkJKAotKwkJCQl2YWx1ZXNTZWVuW2l4XS5hZGRyID09IGFkZHIKLSsJCQkJJiYKLSsJCQkJdmFsdWVzU2VlbltpeF0udXNlZAotKwkJCSkKLSsJCQl7Ci0rCi0rCQkJCXVuaW9uIAotKwkJCQl7Ci0rCQkJCQlpbnQJaTsKLSsJCQkJCWNoYXIgCWJ5dGVzWzRdOwotKwkJCQl9IHB0cm5hbWU7Ci0rCi0rCQkJCWlmICggdmFsdWVzU2VlbltpeF0udXNlZCA9PSAxICkKLSsJCQkJewotKwkJCQkJLyogCi0rCQkJCQkqKiBmaXJzdCB0aW1lOyBqdXN0IGVtaXQgYXMgdXN1YWwKLSsJCQkJCSovCi0rCi0rCQkJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05BTUUsIHN0cmVhbSk7IAotKwkJCQkJdmFsdWVzU2VlbltpeF0udXNlZCA9IDI7Ci0rCi0rCQkJCQl7Ci0rCQkJCQkJaW50IGk7Ci0rCi0rCQkJCQkJcHRybmFtZS5pID0gaXg7Ci0rCi0rCQkJCQkJaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJGRF9FTkRJQU5fQklHKQotKwkJCQkJCXsKLSsJCQkJCQkJZm9yICggaSA9IDAgOyBpIDwgNCA7IGkrKyApCi0rCQkJCQkJCQllbWl0RGF0YShwdHJuYW1lLmJ5dGVzW2ldLCBzdHJlYW0pOwotKwkJCQkJCX0KLSsJCQkJCQllbHNlCi0rCQkJCQkJewotKwkJCQkJCQlmb3IgKCBpID0gMyA7IGkgPj0gMCA7IGktLSApCi0rCQkJCQkJCQllbWl0RGF0YShwdHJuYW1lLmJ5dGVzW2ldLCBzdHJlYW0pOwotKwkJCQkJCX0KLSsJCQkJCX0KLSsKLSsJCQkJCWJyZWFrOyAvKiBubyBuZWVkIHRvIGxvb2sgYXQgb3RoZXIgc2VlbiB2YWx1ZXMgKi8KLSsJCQkJfQotKwotKwkJCQkvKiAKLSsJCQkJKiogcmVmZXJyaW5nIHRvIG9uZSBhbHJlYWR5IGVtaXR0ZWQKLSsJCQkJKi8KLSsKLSsJCQkJZW1pdERhdGEoKGNoYXIpQUlGX1BUUl9SRUZFUkVOQ0UsIHN0cmVhbSk7IAotKwotKwkJCQl7Ci0rCQkJCQlpbnQgaTsKLSsKLSsJCQkJCXB0cm5hbWUuaSA9IGl4OwotKwotKwkJCQkJaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJGRF9FTkRJQU5fQklHKQotKwkJCQkJewotKwkJCQkJCWZvciAoIGkgPSAwIDsgaSA8IDQgOyBpKysgKQotKwkJCQkJCQllbWl0RGF0YShwdHJuYW1lLmJ5dGVzW2ldLCBzdHJlYW0pOwotKwkJCQkJfQotKwkJCQkJZWxzZQotKwkJCQkJewotKwkJCQkJCWZvciAoIGkgPSAzIDsgaSA+PSAwIDsgaS0tICkKLSsJCQkJCQkJZW1pdERhdGEocHRybmFtZS5ieXRlc1tpXSwgc3RyZWFtKTsKLSsJCQkJCX0KLSsJCQkJfQotKwotKwkJCQlyZXR1cm47IC8qIGRvbid0IGdvIGFueSBkZWVwZXIgKi8KLSsJCQl9Ci0rCQl9Ci0rCi0rCQlyZXMgPSBjaGVja192YWx1ZShlbHR0eXBlLCBhZGRyLCAmdnB0cik7Ci0rCi0rCQlpZiAoIGl4ID09IG51bVZhbHVlc1NlZW4gKQotKwkJewotKwkJCS8qCi0rCQkJKiogbm90IHNwZWNpYWwgYXQgYWxsIAotKwkJCSovCi0rCQkJaWYgKCAhcmVzICkKLSsJCQl7Ci0rCQkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfSU5WQUxJRCwgc3RyZWFtKTsgCi0rCQkJCWJyZWFrOwotKwkJCX0KLSsKLSsJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05PUk1BTCwgc3RyZWFtKTsgCi0rCQl9Ci0rCi0rCQlhaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZSAoVkFMVUVfVFlQRSh2cHRyKSwKLSsJCQkJCVZBTFVFX0NPTlRFTlRTKHZwdHIpLAotKwkJCQkJVkFMVUVfQUREUkVTUyh2cHRyKSwKLSsJCQkJCXN0cmVhbSk7Ci0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfU1RSVUNUOgotKwljYXNlIFRZUEVfQ09ERV9VTklPTjoKLSsJCS8qCi0rCQkqKiBBIHVuaW9uIGlzIHRyZWF0ZWQganVzdCBsaWtlIGEgc3RydWN0LiBUaGF0IGlzCi0rCQkqKiB3ZSBhdHRlbXB0IHRvIHRyYXZlcnNlIGVhY2ggZmllbGQgaWYgcG9zc2libGUuCi0rCQkqKiBJdCdzIHRoZW4gdXAgdG8gdGhlIHJlY2VpdmVyIHRvIGRlY2lkZSB3aGF0IGlzCi0rCQkqKiBzZW5zaWJsZSBpbmZvcm1hdGlvbi4KLSsJCSoqCi0rCQkqKiBYWFg6IFdoYXQgaGFwcGVucyBpZiBhIHBvaW50ZXIgcG9pbnRzIHRvIHJhbmRvbQotKwkJKiogZGF0YT8KLSsJCSovCi0rCQlmb3IgKCBpeCA9IDAgOyBpeCA8IFRZUEVfTkZJRUxEUyAodHlwZSkgOyBpeCsrICkKLSsJCXsKLSsJCQlpZiAoIFRZUEVfRklFTERfSUdOT1JFKHR5cGUsIGl4KSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWlmIAotKwkJCSgKLSsJCQkJIVRZUEVfRklFTERfU1RBVElDKHR5cGUsIGl4KSAKLSsJCQkJJiYgCi0rCQkJCVRZUEVfRklFTERfUEFDS0VEKHR5cGUsIGl4KQotKwkJCSkKLSsJCQl7Ci0rCQkJCXZwdHIgPSB2YWx1ZV9mcm9tX2xvbmdlc3QoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwKLSsJCQkJCXVucGFja19maWVsZF9hc19sb25nKHR5cGUsIHZhbGFkZHIsIGl4KSk7Ci0rCi0rCQkJCWFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpeCksIFZBTFVFX0NPTlRFTlRTKHZwdHIpLCAwLCBzdHJlYW0pOwotKwkJCX0KLSsJCQllbHNlIGlmICggVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGl4KSApCi0rCQkJewotKwkJCQl2cHRyID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpeCk7Ci0rCi0rCQkJCWlmICggdnB0ciA9PSBOVUxMICkKLSsJCQkJCWNvbnRpbnVlOwotKwotKwkJCQkvKgotKwkJCQlYWFgKLSsJCQkJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCB2LAotKwkJCQlzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSArIDEsCi0rCQkJCXByZXR0eSk7Ci0rCQkJCSovCi0rCQkJfQotKwkJCWVsc2UKLSsJCQkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwgCi0rCQkJCQl2YWxhZGRyICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGl4KSAvIDgsCi0rCQkJCQlhZGRyZXNzICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGl4KSAvIDgsCi0rCQkJCQlzdHJlYW0pOwotKwkJfQotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0NIQVI6Ci0rCWFzQ2hhcjoKLSsJCXZhbCA9IHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKTsKLSsJCWVtaXREYXRhKChjaGFyKSAodmFsICYgMHhmZiksIHN0cmVhbSk7IAotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0lOVDoKLSsJCWxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKLSsKLSsJCWlmCi0rCQkoCi0rCQkJbGVuID09IDEgCi0rCQkJJiYKLSsJCQlzdHJuY21wKFRZUEVfTkFNRSh0eXBlKSwgImNoYXIiLCA1KSA9PSAwCi0rCQkpIAotKwkJCWdvdG8gYXNDaGFyOwotKwotKwkJdmFsID0gdW5wYWNrX2xvbmcodHlwZSwgdmFsYWRkcik7Ci0rCQlBSUZOb3JtYWxpc2UoKGNoYXIgKikgJnYsIGxlbiwgKGNoYXIgKikgJnZhbCwgc2l6ZW9mKExPTkdFU1QpKTsKLSsJCQotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikodi5jW2l4XSAmIDB4ZmYpLCBzdHJlYW0pOyAKLSsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rCQlsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSk7Ci0rCi0rCQlzd2l0Y2ggKCBsZW4gKSB7Ci0rCQljYXNlIDQ6Ci0rCQkJZnZhbCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJQUlGTm9ybWFsaXNlKChjaGFyICopICZ2LCBsZW4sICgoY2hhciAqKSAmZnZhbCksIHNpemVvZihET1VCTEVTVCkpOwotKwotKwkJY2FzZSA4OgotKwkJCWR2YWwgPSB1bnBhY2tfZG91YmxlICh0eXBlLCB2YWxhZGRyLCAmdmFsaWQpOwotKwkJCUFJRk5vcm1hbGlzZSgoY2hhciAqKSAmdiwgbGVuLCAoKGNoYXIgKikgJmR2YWwpLCBzaXplb2YoRE9VQkxFU1QpKTsKLSsJCQlicmVhazsKLSsKLSsjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotKwkJY2FzZSAxNjoKLSsJCQlsZHZhbCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJQUlGTm9ybWFsaXNlKChjaGFyICopICZ2LCBsZW4sICgoY2hhciAqKSAmbGR2YWwpLCBzaXplb2YoRE9VQkxFU1QpKTsKLSsJCQlicmVhazsKLSsjZW5kaWYgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotKwkJZGVmYXVsdDoKLSsJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBoYW5kbGUgZmxvYXQgb2YgbGVuZ3RoICVkXG4iLCBsZW4pOwotKwkJfQotKwotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikgKHYuY1tpeF0gJiAweGZmKSwgc3RyZWFtKTsgCi0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfVk9JRDoKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9NRU1CRVI6Ci0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCWNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKwljYXNlIFRZUEVfQ09ERV9GVU5DOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOREVGOgotKwljYXNlIFRZUEVfQ09ERV9FUlJPUjoKLSsJCWJyZWFrOwotKwotKwlkZWZhdWx0OgotKwkJZXJyb3IgKCJJbnZhbGlkIEMvQysrIHR5cGUgY29kZSAlZCBpbiBzeW1ib2wgdGFibGUuIiwgVFlQRV9DT0RFICh0eXBlKSk7Ci0rCX0KLSt9Ci0rCi0rdm9pZCAKLSthaWZfdmFsX3ByaW50KHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyLCBpbnQgZW1iZWRkZWRfb2Zmc2V0LCBDT1JFX0FERFIgYWRkcmVzcywgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rICBzdHJfcHRyIHM7Ci0rCi0rICAvLyBzdHJ1Y3QgdWlfZmlsZSAqdHlwZVN0cmVhbT1tZW1fZmlsZW9wZW4oKTsKLSsgIG51bVZhbHVlc1NlZW4gPSAwOwotKyAgYWlmX2Rpc2NvdmVyKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBkb1ZhbHVlKTsgLyogdmFsdWVzICovCi0rICBhaWZfZGlzY292ZXIodHlwZSwgMCwgZG9UeXBlKTsgLyogdHlwZXMgKi8KLSsgIGFpZl9yZWR1Y2UoKTsKLSsgIGRhdGFTdHJlYW1Qb3MgPSAwOwotKyAgLy8gZnB1dHNfZmlsdGVyZWQoIigiLCBzdHJlYW0pOwotKyAgcyA9IGdkYl90eXBlX3RvX2Zkcyh0eXBlKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKHN0cl92YWwocyksIHN0cmVhbSk7Ci0rICBzdHJfZnJlZShzKTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKCIpIiwgc3RyZWFtKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKCIgIiwgc3RyZWFtKTsKLSsgIGFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0pOwotKyAgLy8gY29udGVudHMgPSB1aV9maWxlX3hzdHJkdXAodHlwZVN0cmVhbSwgJmR1bW15KTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKGNvbnRlbnRzLCBzdHJlYW0pOwotKyAgLy8gZnJlZShjb250ZW50cyk7Ci0rICAvLyB1aV9maWxlX2RlbGV0ZSh0eXBlU3RyZWFtKTsKLSsgIGdkYl9mbHVzaChzdHJlYW0pOwotK30gLyogYWlmX3ZhbF9wcmludCAqLwotKwotK3ZvaWQKLSthaWZfdHlwZV9wcmludChzdHJ1Y3QgdHlwZSAqdHlwZSwgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rCXN0cl9wdHIJczsKLSsKLSsJbnVtVmFsdWVzU2VlbiA9IDA7Ci0rCWFpZl9kaXNjb3Zlcih0eXBlLCAwLCBkb1R5cGUpOyAvKiB0eXBlcyAqLwotKwlhaWZfcmVkdWNlKCk7Ci0rCWRhdGFTdHJlYW1Qb3MgPSAwOwotKwlzID0gZ2RiX3R5cGVfdG9fZmRzKHR5cGUpOwotKwlmcHV0c19maWx0ZXJlZChzdHJfdmFsKHMpLCBzdHJlYW0pOwotKwlzdHJfZnJlZShzKTsKLSt9Ci0rCi0rI2RlZmluZSBTVFJTSVpFIDEwMAotKwotK3N0cl9wdHIKLStzdHJfaW5pdCh2b2lkKQotK3sKLSsJc3RyX3B0cglzOwotKwotKwlzID0gKHN0cl9wdHIpeG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cl90eXBlKSk7Ci0rCXMtPmJ1ZiA9IChjaGFyICopeG1hbGxvYyhTVFJTSVpFKTsKLSsJcy0+YmxlbiA9IFNUUlNJWkU7Ci0rCXMtPnNsZW4gPSAwOwotKwkqKHMtPmJ1ZikgPSAnXDAnOwotKwotKwlyZXR1cm4gczsKLSt9Ci0rCi0rdm9pZAotK3N0cl9hZGQoc3RyX3B0ciBzMSwgY2hhciAqczIpCi0rewotKwlpbnQJbDIgPSBzdHJsZW4oczIpOwotKwotKwlpZiAoczEtPnNsZW4gKyBsMiA+PSBzMS0+YmxlbikKLSsJewotKwkJczEtPmJsZW4gKz0gbWF4KFNUUlNJWkUsIGwyKTsKLSsJCXMxLT5idWYgPSAoY2hhciAqKSB4cmVhbGxvYyAoczEtPmJ1ZiwgczEtPmJsZW4pOwotKwl9Ci0rCi0rCW1lbWNweSgmKHMxLT5idWZbczEtPnNsZW5dKSwgczIsIGwyKTsKLSsJczEtPnNsZW4gKz0gbDI7Ci0rCXMxLT5idWZbczEtPnNsZW5dID0gJ1wwJzsKLSt9Ci0rCi0rdm9pZAotK3N0cl9mcmVlKHN0cl9wdHIgcykKLSt7Ci0rCWZyZWUocy0+YnVmKTsKLSsJZnJlZShzKTsKLSt9Ci0rCi0rY2hhciAqCi0rc3RyX3ZhbChzdHJfcHRyIHMpCi0rewotKwlyZXR1cm4gcy0+YnVmOwotK30KLSsKLStzdHJfcHRyCi0rc3RyX2R1cChjaGFyICpzMSkKLSt7Ci0rCXN0cl9wdHIgcyA9IHN0cl9pbml0KCk7Ci0rCXN0cl9hZGQocywgczEpOwotKwlyZXR1cm4gczsKLSt9Ci0rCi0raW50Ci0rY2hlY2tfdmFsdWUoc3RydWN0IHR5cGUgKnR5cGUsIENPUkVfQUREUiBhZGRyLCBzdHJ1Y3QgdmFsdWUgKipyZXMpCi0rewotKyAgaW50IHN0YXR1czsKLSsgIHN0cnVjdCB2YWx1ZSAqdmFsOwotKyAgY2hhciBidWZbc2l6ZW9mIChVTE9OR0VTVCldOwotKwotKyAgaWYgKFRZUEVfQ09ERSAoY2hlY2tfdHlwZWRlZiAodHlwZSkpID09IFRZUEVfQ09ERV9WT0lEKQotKyAgCXJldHVybiAwOwotKwotKyAgdmFsID0gYWxsb2NhdGVfdmFsdWUgKHR5cGUpOwotKwotKyAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCBWQUxVRV9DT05URU5UU19BTExfUkFXICh2YWwpLCBUWVBFX0xFTkdUSCAodHlwZSkpOwotKwotKyAgaWYgKHN0YXR1cyAhPSAwKQotKwlyZXR1cm4gMDsKLSsKLSsgIFZBTFVFX0xWQUwgKHZhbCkgPSBsdmFsX21lbW9yeTsKLSsgIFZBTFVFX0FERFJFU1MgKHZhbCkgPSBhZGRyOwotKyAgVkFMVUVfQkZEX1NFQ1RJT04gKHZhbCkgPSBOVUxMOwotKwotKyAgKnJlcyA9IHZhbDsKLSsKLSsgIHJldHVybiAxOwotK30KLSsKLSsKLS0tLSBzcmMtb2xkL2dkYi9jLXZhbHByaW50LmMJTW9uIEFwciAgOCAwMzozODowMyAyMDAyCi0rKysgc3JjL2dkYi9jLXZhbHByaW50LmMJU2F0IE1hciAxNSAwODozMjo1MCAyMDAzCi1AQCAtMzEsNiArMzEsMTAgQEAKLSAjaW5jbHVkZSAiY3AtYWJpLmgiCi0gDAotIAotK2V4dGVybiBpbnQgbWF4X3ByaW50X2RlcHRoOyAvKiBzZXQgYnkgInNldCBwcmludCBkZXB0aCIgKi8KLStleHRlcm4gaW50IGN1cnJlbnRfcHJpbnRfZGVwdGg7Ci0rZXh0ZXJuIGludCB0eXBlcHJpbnQ7IC8qIHNldCBieSAic2V0IHByaW50IHR5cGUiIChCb29sZWFuKSAqLwotKwotIC8qIFByaW50IGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBpbmZlcmlvciBhZGRyZXNzIEFERFJFU1Mgb250byBzdGRpbwotICAgIHN0cmVhbSBTVFJFQU0uICAqLwotIAotQEAgLTc2LDYgKzgwLDEzIEBACi0gICBMT05HRVNUIHZhbDsKLSAgIENPUkVfQUREUiBhZGRyOwotIAotKyAgaWYgKHR5cGVwcmludCAmJiBmb3JtYXQgIT0gJ3MnKQotKyAgewotKyAgICBmcHV0c19maWx0ZXJlZCgiKCIsIHN0cmVhbSk7Ci0rICAgIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKLSsgICAgZnB1dHNfZmlsdGVyZWQoIikgIiwgc3RyZWFtKTsKLSsgIH0KLSsKLSAgIENIRUNLX1RZUEVERUYgKHR5cGUpOwotICAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQotICAgICB7Ci1AQCAtMTU0LDYgKzE2NSw3IEBACi0gCSAgYnJlYWs7Ci0gCX0KLSAgICAgICBlbHR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKyAgICAgIGlmICghZWx0dHlwZSkgZWx0dHlwZSA9IHR5cGU7Ci0gICAgICAgaWYgKFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX01FVEhPRCkKLSAJewotIAkgIGNwX3ByaW50X2NsYXNzX21ldGhvZCAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgdHlwZSwgc3RyZWFtKTsKLUBAIC0xODIsNiArMTk0LDI2IEBACi0gCSAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSAJICAgIH0KLSAKLSsJICBpZiAoY3VycmVudF9wcmludF9kZXB0aCA8IG1heF9wcmludF9kZXB0aAotKwkgICAgICYmIFRZUEVfQ09ERSAoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1VOREVGCi0rCSAgICAgJiYgKFRZUEVfTEVOR1RIIChlbHR0eXBlKSAhPSAxCi0rCSAgICAgfHwgVFlQRV9DT0RFIChlbHR0eXBlKSAhPSBUWVBFX0NPREVfSU5UKQotKwkgICAgICYmIGZvcm1hdCAhPSAncycpCi0rCSAgeyAvKiBwcmludCBjb21wbGV4IG9iamVjdGVkIHBvaW50ZWQgdG8gcmVjdXJzaXZlbHkgKi8KLSsJICAgIGlmIChhZGRyZXNzcHJpbnQpIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiA9PiAiKTsKLSsJICAgIGlmIChhZGRyID09IDApCi0rCSAgICB7Ci0rCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIm5pbCIpOwotKwkgICAgfQotKwkgICAgZWxzZQotKwkgICAgeyAvKiBub24gbmlsICovCi0rCSAgICAgIHN0cnVjdCB2YWx1ZSAqIGRlcmVmX3ZhbCA9IHZhbHVlX2F0KGVsdHR5cGUsIGFkZHIsIE5VTEwpOwotKwkgICAgICBjdXJyZW50X3ByaW50X2RlcHRoICs9IDE7Ci0rCSAgICAgIHZhbF9wcmludCAoVkFMVUVfVFlQRSAoZGVyZWZfdmFsKSwgVkFMVUVfQ09OVEVOVFMgKGRlcmVmX3ZhbCksIDAsIFZBTFVFX0FERFJFU1MgKGRlcmVmX3ZhbCksIHN0cmVhbSwgZm9ybWF0LCBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSk7Ci0rCSAgICAgIGN1cnJlbnRfcHJpbnRfZGVwdGggLT0gMTsKLSsJICAgIH0KLSsJICB9IC8qIHByaW50IHJlY3Vyc2l2ZWx5ICovCi0rCi0gCSAgLyogRm9yIGEgcG9pbnRlciB0byBjaGFyIG9yIHVuc2lnbmVkIGNoYXIsIGFsc28gcHJpbnQgdGhlIHN0cmluZwotIAkgICAgIHBvaW50ZWQgdG8sIHVubGVzcyBwb2ludGVyIGlzIG51bGwuICAqLwotIAkgIC8qIEZJWE1FOiBuZWVkIHRvIGhhbmRsZSB3Y2hhcl90IGhlcmUuLi4gKi8KLUBAIC0zNTYsOSArMzg4LDYgQEAKLSAJfQotICAgICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY29uc2lkZXIsIGF0IGxlYXN0IGZvciBBTlNJIEMgbGFuZ3VhZ2UsIGVsaW1pbmF0aW5nCi0gICAgICAgICAgdGhlIGRpc3RpbmN0aW9uIG1hZGUgYmV0d2VlbiBGVU5DcyBhbmQgUE9JTlRFUnMgdG8gRlVOQ3MuICAqLwotLSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsiKTsKLS0gICAgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgc3RyZWFtLCAtMSk7Ci0tICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAifSAiKTsKLSAgICAgICAvKiBUcnkgdG8gcHJpbnQgd2hhdCBmdW5jdGlvbiBpdCBwb2ludHMgdG8sIGFuZCBpdHMgYWRkcmVzcy4gICovCi0gICAgICAgcHJpbnRfYWRkcmVzc19kZW1hbmdsZSAoYWRkcmVzcywgc3RyZWFtLCBkZW1hbmdsZSk7Ci0gICAgICAgYnJlYWs7Ci1AQCAtNTU5LDkgKzU4OCw5IEBACi0gICAgICAgZWxzZQotIAl7Ci0gCSAgLyogbm9ybWFsIGNhc2UgKi8KLS0JICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIoIik7Ci0tCSAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOwotLQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikgIik7Ci0rCSAgLyogZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOyAqLwotKwkgIC8qIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsgKi8KLSsJICAvKiBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpICIpOyAqLwotIAl9Ci0gICAgIH0KLSAgIGlmIChvYmplY3RwcmludCAmJiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSA9PSBUWVBFX0NPREVfQ0xBU1MpKQotLS0tIHNyYy1vbGQvZ2RiL3ByaW50Y21kLmMJVHVlIEF1ZyAxMyAxNDowMzowMyAyMDAyCi0rKysgc3JjL2dkYi9wcmludGNtZC5jCVNhdCBNYXIgMTUgMDg6MzY6NDggMjAwMwotQEAgLTI3Myw2ICsyNzMsNyBAQAotICAgcmV0dXJuIHZhbDsKLSB9Ci0gDAotK2V4dGVybiBpbnQgY3VycmVudF9wcmludF9kZXB0aDsgLyogZnJvbSB2YWxwcmludC5jICovCi0gLyogUHJpbnQgdmFsdWUgVkFMIG9uIHN0cmVhbSBhY2NvcmRpbmcgdG8gRk9STUFULCBhIGxldHRlciBvciAwLgotICAgIERvIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCi0gICAgMCBtZWFucyBwcmludCBWQUwgYWNjb3JkaW5nIHRvIGl0cyBvd24gdHlwZS4KLUBAIC0zMjEsMTIgKzMyMiwxNSBAQAotIAkgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUklORwotIAkgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVAotIAkgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1VOSU9OKQotKyAgICAgIHsKLSAJLyogSWYgZm9ybWF0IGlzIDAsIHVzZSB0aGUgJ25hdHVyYWwnIGZvcm1hdCBmb3IKLSAJICogdGhhdCB0eXBlIG9mIHZhbHVlLiAgSWYgdGhlIHR5cGUgaXMgbm9uLXNjYWxhciwKLSAJICogd2UgaGF2ZSB0byB1c2UgbGFuZ3VhZ2UgcnVsZXMgdG8gcHJpbnQgaXQgYXMKLSAJICogYSBzZXJpZXMgb2Ygc2NhbGFycy4KLSAJICovCi0rCWN1cnJlbnRfcHJpbnRfZGVwdGggPSAwOwotIAl2YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKLSsgICAgICB9Ci0gICAgICAgZWxzZQotIAkvKiBVc2VyIHNwZWNpZmllZCBmb3JtYXQsIHNvIGRvbid0IGxvb2sgdG8gdGhlCi0gCSAqIHRoZSB0eXBlIHRvIHRlbGwgdXMgd2hhdCB0byBkby4KLS0tLSBzcmMtb2xkL2dkYi90eXBlcHJpbnQuYwlUdWUgQXVnIDEzIDE0OjA0OjE1IDIwMDIKLSsrKyBzcmMvZ2RiL3R5cGVwcmludC5jCVNhdCBNYXIgMTUgMTI6MzE6MTcgMjAwMwotQEAgLTM5LDYgKzM5LDggQEAKLSAvKiBGb3IgcmVhbC10eXBlIHByaW50aW5nIGluIHdoYXRpc19leHAoKSAqLwotIGV4dGVybiBpbnQgb2JqZWN0cHJpbnQ7CQkvKiBDb250cm9scyBsb29raW5nIHVwIGFuIG9iamVjdCdzIGRlcml2ZWQgdHlwZQotIAkJCQkgICB1c2luZyB3aGF0IHdlIGZpbmQgaW4gaXRzIHZ0YWJsZXMuICAqLwotK2V4dGVybiBpbnQgYWlmcHJpbnQ7ICAgLyogcHJpbnQgdHlwZSB1c2luZyBBSUYgKi8KLStleHRlcm4gdm9pZCBhaWZfdHlwZV9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdWlfZmlsZSAqKSk7Ci0gCi0gZXh0ZXJuIHZvaWQgX2luaXRpYWxpemVfdHlwZXByaW50ICh2b2lkKTsKLSAKLUBAIC0xMDEsNiArMTAzLDE3IEBACi0gICAgICAgLyogT0JTT0xFVEUgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgc3RyZWFtLCAwKTsgKi8KLSAgICAgICAvKiBPQlNPTEVURSAgIGJyZWFrOyAqLwotICNlbmRpZgotKyNpZmRlZiBfTEFOR196cGwKLSsgICAgY2FzZSBsYW5ndWFnZV96cGw6Ci0rICAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICJ0eXBlICIpOwotKyAgICAgIGlmKCFUWVBFX05BTUUoU1lNQk9MX1RZUEUobmV3KSkgfHwKLSsgICAgICAgICAhU1RSRVEgKFRZUEVfTkFNRShTWU1CT0xfVFlQRShuZXcpKSwgU1lNQk9MX05BTUUobmV3KSkpCi0rICAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICIlcyA9ICIsIFNZTUJPTF9TT1VSQ0VfTkFNRShuZXcpKTsKLSsgICAgICBlbHNlCi0rICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkKHN0cmVhbSwgIjxidWlsdGluPiA9ICIpOwotKyAgICAgIHR5cGVfcHJpbnQodHlwZSwiIixzdHJlYW0sMCk7Ci0rICAgICAgYnJlYWs7Ci0rI2VuZGlmCi0gICAgIGRlZmF1bHQ6Ci0gICAgICAgZXJyb3IgKCJMYW5ndWFnZSBub3Qgc3VwcG9ydGVkLiIpOwotICAgICB9Ci1AQCAtMTE4LDYgKzEzMSwxMiBAQAotIHR5cGVfcHJpbnQgKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YXJzdHJpbmcsIHN0cnVjdCB1aV9maWxlICpzdHJlYW0sCi0gCSAgICBpbnQgc2hvdykKLSB7Ci0rICBpZiAoYWlmcHJpbnQpCi0rICB7Ci0rICAgIGFpZl90eXBlX3ByaW50ICh0eXBlLCBzdHJlYW0pOwotKyAgICByZXR1cm47Ci0rICB9Ci0rCi0gICBMQV9QUklOVF9UWVBFICh0eXBlLCB2YXJzdHJpbmcsIHN0cmVhbSwgc2hvdywgMCk7Ci0gfQotIAotLS0tIHNyYy1vbGQvZ2RiL3ZhbHByaW50LmMJVHVlIEF1ZyAxMyAxNDowNDoyMiAyMDAyCi0rKysgc3JjL2dkYi92YWxwcmludC5jCVNhdCBNYXIgMTUgMTI6NDA6MjggMjAwMwotQEAgLTM3LDkgKzM3LDEyIEBACi0gCi0gI2luY2x1ZGUgPGVycm5vLmg+Ci0gCi0rZXh0ZXJuIGludCBhaWZwcmludDsgLyogc2V0IGJ5ICJzZXQgcHJpbnQgYWlmIiAoQm9vbGVhbikgKi8KLSt2b2lkIGFpZl92YWxfcHJpbnQoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIGludCBlbWJlZGRlZF9vZmZzZXQsIENPUkVfQUREUiBhZGRyZXNzLCBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtKTsKLSsKLSAvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KLSAKLS1zdGF0aWMgaW50IHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsCi0raW50IHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsCi0gCQkJCWludCBsZW4sIGludCAqZXJybm9wdHIpOwotIAotIHN0YXRpYyB2b2lkIHByaW50X2hleF9jaGFycyAoc3RydWN0IHVpX2ZpbGUgKiwgdW5zaWduZWQgY2hhciAqLAotQEAgLTEwMyw2ICsxMDYsMTcgQEAKLSAvKiBJZiBub256ZXJvLCBjYXVzZXMgbWFjaGluZSBhZGRyZXNzZXMgdG8gYmUgcHJpbnRlZCBpbiBjZXJ0YWluIGNvbnRleHRzLiAqLwotIAotIGludCBhZGRyZXNzcHJpbnQ7CQkvKiBDb250cm9scyBwcmludGluZyBvZiBtYWNoaW5lIGFkZHJlc3NlcyAqLwotKwotKy8qIElmIHBvc2l0aXZlLCBjYXVzZXMgcG9pbnRlcnMgdG8gYmUgZm9sbG93ZWQgaW4gcHJpbnRpbmcsIHRvIGdpdmVuIGRlcHRoICovCi0raW50IG1heF9wcmludF9kZXB0aDsgIAotK2ludCBjdXJyZW50X3ByaW50X2RlcHRoID0gMDsgLyogcmVzZXQgdG8gMCBhdCBlYWNoIGludGVycnVwdCAqLwotKwotKy8qIElmIG5vbnplcm8sIGNhdXNlcyB0eXBlcyB0byBiZSBwcmludGVkLiAqLwotK2ludCB0eXBlcHJpbnQ7ICAgICAgIAotKwotKy8qIElmIG5vbnplcm8sIGNhdXNlcyB0eXBlcyB0byBiZSBwcmludGVkLCBpZiBhdCBhbGwsIGluIEFJRiBmb3JtYXQuICovCi0raW50IGFpZnByaW50OwotKwotIAwKLSAKLSAvKiBQcmludCBkYXRhIG9mIHR5cGUgVFlQRSBsb2NhdGVkIGF0IFZBTEFERFIgKHdpdGhpbiBHREIpLCB3aGljaCBjYW1lIGZyb20KLUBAIC0xNDksNiArMTYzLDEyIEBACi0gICAgICAgcmV0dXJuICgwKTsKLSAgICAgfQotIAotKyAgaWYgKGFpZnByaW50KQotKyAgICB7Ci0rICAgICAgYWlmX3ZhbF9wcmludCh0eXBlLCB2YWxhZGRyLCBlbWJlZGRlZF9vZmZzZXQsIGFkZHJlc3MsIHN0cmVhbSk7Ci0rICAgICAgcmV0dXJuIDA7ICAgICAKLSsgICAgfQotKwotICAgcmV0dXJuIChMQV9WQUxfUFJJTlQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywKLSAJCQlzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpKTsKLSB9Ci1AQCAtOTY5LDcgKzk4OSw3IEBACi0gLyogRklYTUU6IGNhZ25leS8xOTk5LTEwLTE0OiBPbmx5IHVzZWQgYnkgdmFsX3ByaW50X3N0cmluZy4gIENhbiB0aGlzCi0gICAgZnVuY3Rpb24gYmUgZWxpbWluYXRlZC4gICovCi0gCi0tc3RhdGljIGludAotK2ludAotIHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sIGludCAqZXJybm9wdHIpCi0gewotICAgaW50IG5yZWFkOwkJCS8qIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiAqLwotQEAgLTExNTcsNyArMTE3Nyw3IEBACi0gICAgIHsKLSAgICAgICBpZiAoYWRkcmVzc3ByaW50KQotIAl7Ci0tCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgc3RyZWFtKTsKLSsJICBmcHV0c19maWx0ZXJlZCAoIiA9PiAiLCBzdHJlYW0pOwotIAl9Ci0gICAgICAgTEFfUFJJTlRfU1RSSU5HIChzdHJlYW0sIGJ1ZmZlciwgKGJ1ZnB0ciAtIGJ1ZmZlcikgLyB3aWR0aCwgd2lkdGgsIGZvcmNlX2VsbGlwc2lzKTsKLSAgICAgfQotQEAgLTEzOTAsNiArMTQxMCwyNyBAQAotIAkJICAmc2V0cHJpbnRsaXN0KSwKLSAgICAgICZzaG93cHJpbnRsaXN0KTsKLSAKLSsgIGFkZF9zaG93X2Zyb21fc2V0Ci0rICAgIChhZGRfc2V0X2NtZCAoImRlcHRoIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAotKwkJIChjaGFyICopICZtYXhfcHJpbnRfZGVwdGgsCi0rCQkgIlNldCBkZXB0aCBvZiBwb2ludGVyIHJlY3Vyc2lvbi4iLAotKwkJICZzZXRwcmludGxpc3QpLAotKyAgICAgJnNob3dwcmludGxpc3QpOwotKwotKyAgYWRkX3Nob3dfZnJvbV9zZXQKLSsgICAgKGFkZF9zZXRfY21kICgidHlwZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotKwkJIChjaGFyICopICZ0eXBlcHJpbnQsCi0rCQkgIlNldCBwcmludGluZyBvZiB0eXBlcy4iLAotKwkJICZzZXRwcmludGxpc3QpLAotKyAgICAgJnNob3dwcmludGxpc3QpOwotKwotKyAgYWRkX3Nob3dfZnJvbV9zZXQKLSsgICAgKGFkZF9zZXRfY21kICgiYWlmIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0rCQkgKGNoYXIgKikgJmFpZnByaW50LAotKwkJICJTZXQgcHJpbnRpbmcgb2YgdHlwZXMgdG8gYWlmIGZvcm1hdC4iLAotKwkJICZzZXRwcmludGxpc3QpLAotKyAgICAgJnNob3dwcmludGxpc3QpOwotKwotICAgYyA9IGFkZF9zZXRfY21kICgiaW5wdXQtcmFkaXgiLCBjbGFzc19zdXBwb3J0LCB2YXJfdWludGVnZXIsCi0gCQkgICAoY2hhciAqKSAmaW5wdXRfcmFkaXgsCi0gCQkgICAiU2V0IGRlZmF1bHQgaW5wdXQgcmFkaXggZm9yIGVudGVyaW5nIG51bWJlcnMuIiwKLUBAIC0xNDI0LDUgKzE0NjUsOCBAQAotICAgcHJldHR5cHJpbnRfYXJyYXlzID0gMDsKLSAgIHVuaW9ucHJpbnQgPSAxOwotICAgYWRkcmVzc3ByaW50ID0gMTsKLSsgIG1heF9wcmludF9kZXB0aCA9IC0xOwotKyAgdHlwZXByaW50ID0gMDsKLSsgIGFpZnByaW50ID0gMDsgICAgICAKLSAgIHByaW50X21heCA9IFBSSU5UX01BWF9ERUZBVUxUOwotIH0KLS0tLSAvZGV2L251bGwJU3VuIE1hciAzMCAxODowNzozMCAyMDAzCi0rKysgc3JjL2dkYi9saWJhaWYubWsJRnJpIE1hciAxNCAxNzoyODo0OCAyMDAzCi1AQCAtMCwwICsxLDkgQEAKLStJTkNMVURFX0NGTEFHUyArPSAkKElOQ0xVREVfYWlmKQotKwotK0NMSUJTICs9ICQoTElCX2FpZikKLSsKLStTRklMRVMgICAgICs9IGFpZi12YWxwcmludC5jCi0rQ09NTU9OX09CUyArPSBhaWYtdmFscHJpbnQubwotKwotK2FpZi12YWxwcmludC5vOiBhaWYtdmFscHJpbnQuYyAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RidHlwZXNfaCkgXAotKwlsYW5ndWFnZS5oICQoc3ltdGFiX2gpIHZhbHByaW50LmggJCh2YWx1ZV9oKQotLS0tIHNyYy1vbGQvZ2RiL2NvbmZpZ3VyZS5pbglXZWQgQXVnIDI4IDEyOjA3OjU5IDIwMDIKLSsrKyBzcmMvZ2RiL2NvbmZpZ3VyZS5pbglTdW4gTWFyIDE2IDIxOjI1OjI1IDIwMDMKLUBAIC0zMiw2ICszMiw5NSBAQAotIAotIEFNX1BST0dfQ0NfU1REQwotIAotK0FDX0FSR19XSVRIKGFpZiwKLStbICAtLXdpdGgtYWlmPWRpciAgICAgICAgICAgICAgICB1c2UgYWlmIGluIGRpcl0pCi0rQUNfQVJHX1dJVEgoYWlmLWxpYiwKLStbICAtLXdpdGgtYWlmLWxpYj1kaXIgICAgICAgICAgICB1c2UgYWlmIGxpYnJhcmllcyBpbiBkaXJdLAotK1tpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIiAtbyAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotKyAgQUNfTVNHX0VSUk9SKFtObyBhcmd1bWVudCBmb3IgLS13aXRoLWFpZi1saWJdKQotK2VsaWYgdGVzdCAiWCR3aXRoX2FpZiIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfYWlmPXllcwotK2ZpXSkKLStBQ19BUkdfV0lUSChhaWYtaW5jbHVkZSwKLStbICAtLXdpdGgtYWlmLWluY2x1ZGU9ZGlyICAgICAgICB1c2UgYWlmIGhlYWRlcnMgaW4gZGlyXSwKLStbaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyIgLW8gIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSsgIEFDX01TR19FUlJPUihbTm8gYXJndW1lbnQgZm9yIC0td2l0aC1haWYtaW5jbHVkZV0pCi0rZWxpZiB0ZXN0ICJYJHdpdGhfYWlmIiA9ICJYIjsgdGhlbgotKyAgd2l0aF9haWY9eWVzCi0rZmldKQotKwotK0FDX01TR19DSEVDS0lORyhmb3IgYWlmKQotKwotK2Nhc2UgIiR3aXRoX2FpZiIgaW4KLSt5ZXMpCTs7Ci0rbm8pCTs7Ci0rIiIpCTs7Ci0rKikJaWYgdGVzdCAiJHdpdGhfYWlmX2luY2x1ZGUiID0gIiI7IHRoZW4KLSsJCXdpdGhfYWlmX2luY2x1ZGU9IiR3aXRoX2FpZi9pbmNsdWRlIgotKwlmaQotKwlpZiB0ZXN0ICIkd2l0aF9haWZfbGliIiA9ICIiOyB0aGVuCi0rCQl3aXRoX2FpZl9saWI9IiR3aXRoX2FpZi9saWIkYWJpbGliZGlyZXh0IgotKwlmaQotKwk7OwotK2VzYWMKLStoZWFkZXJfZGlycz0KLStsaWJfZGlycz0KLStkPScvdXNyL2xvY2FsJwotK2ZvciBpIGluICRkIC91c3I7IGRvCi0rCWhlYWRlcl9kaXJzPSIkaGVhZGVyX2RpcnMgJGkvaW5jbHVkZSIKLSsJbGliX2RpcnM9IiRsaWJfZGlycyAkaS9saWIkYWJpbGliZGlyZXh0IgotK2RvbmUKLSsKLStjYXNlICIkd2l0aF9haWZfaW5jbHVkZSIgaW4KLSt5ZXMpIDs7Ci0rbm8pICA7OwotKyopICAgaGVhZGVyX2RpcnM9IiR3aXRoX2FpZl9pbmNsdWRlICRoZWFkZXJfZGlycyI7OwotK2VzYWMKLStjYXNlICIkd2l0aF9haWZfbGliIiBpbgotK3llcykgOzsKLStubykgIDs7Ci0rKikgICBsaWJfZGlycz0iJHdpdGhfYWlmX2xpYiAkbGliX2RpcnMiOzsKLStlc2FjCi0rCi0rc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0rc2F2ZV9MSUJTPSIkTElCUyIKLStpcmVzPSBscmVzPQotK2ZvciBpIGluICRoZWFkZXJfZGlyczsgZG8KLSsJQ0ZMQUdTPSItSSRpICRzYXZlX0NGTEFHUyIKLSsJQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxhaWYuaD5dLCxpcmVzPSRpO2JyZWFrKQotK2RvbmUKLStmb3IgaSBpbiAkbGliX2RpcnM7IGRvCi0rCUxJQlM9Ii1MJGkgLWxhaWYgJHNhdmVfTElCUyIKLSsJQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxhaWYuaD5dLCxscmVzPSRpO2JyZWFrKQotK2RvbmUKLStDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLStMSUJTPSIkc2F2ZV9MSUJTIgotKwotK2lmIHRlc3QgIiRpcmVzIiAtYSAiJGxyZXMiIC1hICIkd2l0aF9haWYiICE9ICJubyI7IHRoZW4KLSsJYWlmX2luY2x1ZGVkaXI9IiRpcmVzIgotKwlhaWZfbGliZGlyPSIkbHJlcyIKLSsJRElSX2FpZj0KLSsJSU5DTFVERV9haWY9Ii1JJGFpZl9pbmNsdWRlZGlyIgotKwlMSUJfYWlmPSItTCRhaWZfbGliZGlyIC1sYWlmIgotKwlBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9BSUYsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhaWYgcGFja2FnZS5dKQotKwl3aXRoX2FpZj15ZXMKLSsJQUNfTVNHX1JFU1VMVChbaGVhZGVycyAkaXJlcywgbGlicmFyaWVzICRscmVzXSkKLStlbHNlCi0rCURJUl9haWY9ImFpZiIKLSsJSU5DTFVERV9haWY9Ci0rCUxJQl9haWY9Ci0rCXdpdGhfYWlmPW5vCi0rCUFDX01TR19SRVNVTFQoJHdpdGhfYWlmKQotK2ZpCi0rQUNfU1VCU1QoRElSX2FpZikKLStBQ19TVUJTVChJTkNMVURFX2FpZikKLStBQ19TVUJTVChMSUJfYWlmKQotKwotK2lmIHRlc3QgIiR3aXRoX2FpZiIgPSAibm8iOyB0aGVuCi0rICAgICAgICBBQ19NU0dfRVJST1IoW1lvdSBtdXN0IGhhdmUgbGliYWlmIHRvIGNvbXBpbGUgdGhpcyB2ZXJzaW9uIG9mIEdEQi5dKQotK2ZpCi0rQUNfREVGSU5FKEhBVkVfQUlGLCAxLCBbRW5hYmxlIEFJRiBzdXBwb3J0IGluIGluIEdEQi5dKWRubAotKwotIEFDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4pCi0gQUNfQ0FOT05JQ0FMX1NZU1RFTQotIAotLS0tIHNyYy1vbGQvZ2RiL2NvbmZpZ3VyZQlXZWQgQXVnIDI4IDEyOjA3OjU4IDIwMDIKLSsrKyBzcmMvZ2RiL2NvbmZpZ3VyZQlTdW4gTWFyIDE2IDIxOjI1OjQwIDIwMDMKLUBAIC0xLDI0ICsxLDIyIEBACi0gIyEgL2Jpbi9zaAotICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLS0jIEdlbmVyYXRlZCBieSBBdXRvY29uZiAyLjUyLgotKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjUzLgotICMKLS0jIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi0rIyBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMgotICMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotIAotLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLS1hc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLS1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLS1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLS1hc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi0tYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0raWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgIGFzX2V4cHI9ZXhwcgotK2Vsc2UKLSsgIGFzX2V4cHI9ZmFsc2UKLStmaQotIAotLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotLWFzX3RyX3NoPSJzZWQgeSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyIKLSAKLS0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi0tYXNfdHJfY3BwPSJzZWQgeSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnIgotKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIwotKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIAotICMgQmUgQm91cm5lIGNvbXBhdGlibGUKLSBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLUBAIC0yOCw4ICsyNiwxNjUgQEAKLSAgIHNldCAtbyBwb3NpeAotIGZpCi0gCi0rIyBOTFMgbnVpc2FuY2VzLgotKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotK2lmIChGT089Rk9POyB1bnNldCBGT08pID4vZGV2L251bGwgMj4mMTsgdGhlbgotKyAgYXNfdW5zZXQ9dW5zZXQKLStlbHNlCi0rICBhc191bnNldD1mYWxzZQotK2ZpCi0rCi0rKHNldCAreDsgdGVzdCAtbiAiYChMQU5HPUM7IGV4cG9ydCBMQU5HKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExBTkcgfHwgdGVzdCAiJHtMQU5HK3NldH0iICE9IHNldDsgfSB8fAotKyAgICAgIHsgTEFORz1DOyBleHBvcnQgTEFORzsgfQotKyhzZXQgK3g7IHRlc3QgLW4gImAoTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfQUxMIHx8IHRlc3QgIiR7TENfQUxMK3NldH0iICE9IHNldDsgfSB8fAotKyAgICAgIHsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IH0KLSsoc2V0ICt4OyB0ZXN0IC1uICJgKExDX1RJTUU9QzsgZXhwb3J0IExDX1RJTUUpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQ19USU1FPUM7IGV4cG9ydCBMQ19USU1FOyB9Ci0rKHNldCAreDsgdGVzdCAtbiAiYChMQ19DVFlQRT1DOyBleHBvcnQgTENfQ1RZUEUpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfQ1RZUEUgfHwgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAhPSBzZXQ7IH0gfHwKLSsgICAgICB7IExDX0NUWVBFPUM7IGV4cG9ydCBMQ19DVFlQRTsgfQotKyhzZXQgK3g7IHRlc3QgLW4gImAoTEFOR1VBR0U9QzsgZXhwb3J0IExBTkdVQUdFKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExBTkdVQUdFIHx8IHRlc3QgIiR7TEFOR1VBR0Urc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQU5HVUFHRT1DOyBleHBvcnQgTEFOR1VBR0U7IH0KLSsoc2V0ICt4OyB0ZXN0IC1uICJgKExDX0NPTExBVEU9QzsgZXhwb3J0IExDX0NPTExBVEUpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfQ09MTEFURSB8fCB0ZXN0ICIke0xDX0NPTExBVEUrc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9Ci0rKHNldCAreDsgdGVzdCAtbiAiYChMQ19OVU1FUklDPUM7IGV4cG9ydCBMQ19OVU1FUklDKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExDX05VTUVSSUMgfHwgdGVzdCAiJHtMQ19OVU1FUklDK3NldH0iICE9IHNldDsgfSB8fAotKyAgICAgIHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQotKyhzZXQgK3g7IHRlc3QgLW4gImAoTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExDX01FU1NBR0VTIHx8IHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IH0KLSsKLSsKLSAjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi0tYXNfbWU9YGVjaG8gIiQwIiB8c2VkICdzLC4qW1xcL10sLCdgCi0rYXNfbWU9YChiYXNlbmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAotKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0rCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotKwkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAotKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8Ci0rZWNobyBYLyIkMCIgfAotKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9Ci0rICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotKyAgCSAgL15YXC9cKFwvXCkuKi97IHMvL1wxLzsgcTsgfQotKyAgCSAgcy8uKi8uLzsgcSdgCi0rCi0rIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgotKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLSthc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLSthc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLSthc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLSthc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi0rYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0rCi0rIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi0raWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSsgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mdGVzdC5zaAotKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmZ0ZXN0LnNoCi0rICBjaG1vZCAreCBjb25mdGVzdC5zaAotKyAgaWYgKFBBVEg9Ii47LiI7IGNvbmZ0ZXN0LnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0rICBlbHNlCi0rICAgIFBBVEhfU0VQQVJBVE9SPToKLSsgIGZpCi0rICBybSAtZiBjb25mdGVzdC5zaAotK2ZpCi0rCi0rCi0rICBhc19saW5lbm9fMT0kTElORU5PCi0rICBhc19saW5lbm9fMj0kTElORU5PCi0rICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCi0rICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSsgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgewotKyAgIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gcGF0aCBhdCBhbGwKLSsgICMgcmVsYXRpdmUgb3Igbm90LgotKyAgY2FzZSAkMCBpbgotKyAgICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0rICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotK2RvbmUKLSsKLSsgICAgICAgOzsKLSsgIGVzYWMKLSsgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSsgICMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotKyAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotKyAgICBhc19teXNlbGY9JDAKLSsgIGZpCi0rICBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0rICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKyAgZmkKLSsgIGNhc2UgJENPTkZJR19TSEVMTCBpbgotKyAgJycpCi0rICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCi0rCSBjYXNlICRhc19kaXIgaW4KLSsJIC8qKQotKwkgICBpZiAoIiRhc19kaXIvJGFzX2Jhc2UiIC1jICcKLSsgIGFzX2xpbmVub18xPSRMSU5FTk8KLSsgIGFzX2xpbmVub18yPSRMSU5FTk8KLSsgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKLSsgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCi0rCSAgICAgQ09ORklHX1NIRUxMPSRhc19kaXIvJGFzX2Jhc2UKLSsJICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0rCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KLSsJICAgZmk7OwotKwkgZXNhYwotKyAgICAgICBkb25lCi0rZG9uZQotKzs7Ci0rICBlc2FjCi0rCi0rICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0rICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0rICAjIGxpbmUtbnVtYmVyIGxpbmUgYmVmb3JlIGVhY2ggbGluZTsgdGhlIHNlY29uZCAnc2VkJyBkb2VzIHRoZSByZWFsCi0rICAjIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2ggbGluZS1udW1iZXIgbGluZQotKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCi0rICAjIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbCBjYXNlIGF0IGxpbmUgZW5kLgotKyAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCi0rICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0rICBzZWQgJz0nIDwkYXNfbXlzZWxmIHwKLSsgICAgc2VkICcKLSsgICAgICBOCi0rICAgICAgcywkLC0sCi0rICAgICAgOiBsb29wCi0rICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCi0rICAgICAgdCBsb29wCi0rICAgICAgcywtJCwsCi0rICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAotKyAgICAnID4kYXNfbWUubGluZW5vICYmCi0rICBjaG1vZCAreCAkYXNfbWUubGluZW5vIHx8Ci0rICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKwotKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSsgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgotKyAgLiAuLyRhc19tZS5saW5lbm8KLSsgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotKyAgZXhpdAotK30KLSsKLSsKLStjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgotKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JwotKycgRUNIT19UPScJJyA7OwotKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OwotKyAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7Ci0rZXNhYwotIAotIGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBhc19leHByPWV4cHIKLUBAIC01NywyMiArMjEyLDEyIEBACi0gCi0gYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgotIAotLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotLWlmIChGT089Rk9POyB1bnNldCBGT08pID4vZGV2L251bGwgMj4mMTsgdGhlbgotLSAgYXNfdW5zZXQ9dW5zZXQKLS1lbHNlCi0tICBhc191bnNldD1mYWxzZQotLWZpCi0rIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotK2FzX3RyX2NwcD0ic2VkIHklKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyIKLSsKLSsjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLSthc190cl9zaD0ic2VkIHklKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWciCi0gCi0tIyBOTFMgbnVpc2FuY2VzLgotLSRhc191bnNldCBMQU5HIHx8IHRlc3QgIiR7TEFORytzZXR9IiAhPSBzZXQgfHwgeyBMQU5HPUM7IGV4cG9ydCBMQU5HOyB9Ci0tJGFzX3Vuc2V0IExDX0FMTCB8fCB0ZXN0ICIke0xDX0FMTCtzZXR9IiAhPSBzZXQgfHwgeyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgfQotLSRhc191bnNldCBMQ19USU1FIHx8IHRlc3QgIiR7TENfVElNRStzZXR9IiAhPSBzZXQgfHwgeyBMQ19USU1FPUM7IGV4cG9ydCBMQ19USU1FOyB9Ci0tJGFzX3Vuc2V0IExDX0NUWVBFIHx8IHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgIT0gc2V0IHx8IHsgTENfQ1RZUEU9QzsgZXhwb3J0IExDX0NUWVBFOyB9Ci0tJGFzX3Vuc2V0IExBTkdVQUdFIHx8IHRlc3QgIiR7TEFOR1VBR0Urc2V0fSIgIT0gc2V0IHx8IHsgTEFOR1VBR0U9QzsgZXhwb3J0IExBTkdVQUdFOyB9Ci0tJGFzX3Vuc2V0IExDX0NPTExBVEUgfHwgdGVzdCAiJHtMQ19DT0xMQVRFK3NldH0iICE9IHNldCB8fCB7IExDX0NPTExBVEU9QzsgZXhwb3J0IExDX0NPTExBVEU7IH0KLS0kYXNfdW5zZXQgTENfTlVNRVJJQyB8fCB0ZXN0ICIke0xDX05VTUVSSUMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQotLSRhc191bnNldCBMQ19NRVNTQUdFUyB8fCB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iICE9IHNldCB8fCB7IExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgfQotIAotICMgSUZTCi0gIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4KLUBAIC04MSw3ICsyMjYsOCBAQAotIElGUz0iIAkkYXNfbmwiCi0gCi0gIyBDRFBBVEguCi0tJGFzX3Vuc2V0IENEUEFUSCB8fCB0ZXN0ICIke0NEUEFUSCtzZXR9IiAhPSBzZXQgfHwgeyBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgfQotKyRhc191bnNldCBDRFBBVEggfHwgdGVzdCAiJHtDRFBBVEgrc2V0fSIgIT0gc2V0IHx8IHsgQ0RQQVRIPSRQQVRIX1NFUEFSQVRPUjsgZXhwb3J0IENEUEFUSDsgfQotKwotIAotICMgTmFtZSBvZiB0aGUgaG9zdC4KLSAjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAotQEAgLTk2LDcgKzI0Miw4IEBACi0gYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIGNyb3NzX2NvbXBpbGluZz1ubwotIHN1YmRpcnM9Ci0tTUZMQUdTPSBNQUtFRkxBR1M9Ci0rTUZMQUdTPQotK01BS0VGTEFHUz0KLSBTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIAotICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLUBAIC0xMDQsNiArMjUxLDEzIEBACi0gIyBvbmx5IGFjX21heF9zZWRfbGluZXMgc2hvdWxkIGJlIHVzZWQuCi0gOiAke2FjX21heF9oZXJlX2xpbmVzPTM4fQotIAotKyMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotK1BBQ0tBR0VfTkFNRT0KLStQQUNLQUdFX1RBUk5BTUU9Ci0rUEFDS0FHRV9WRVJTSU9OPQotK1BBQ0tBR0VfU1RSSU5HPQotK1BBQ0tBR0VfQlVHUkVQT1JUPQotKwotIGFjX3VuaXF1ZV9maWxlPSJtYWluLmMiCi0gIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotIGFjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKLUBAIC0xODIsMTMgKzMzNiw2IEBACi0gaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi0gbWFuZGlyPScke3ByZWZpeH0vbWFuJwotIAotLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotLVBBQ0tBR0VfTkFNRT0KLS1QQUNLQUdFX1RBUk5BTUU9Ci0tUEFDS0FHRV9WRVJTSU9OPQotLVBBQ0tBR0VfU1RSSU5HPQotLVBBQ0tBR0VfQlVHUkVQT1JUPQotLQotIGFjX3ByZXY9Ci0gZm9yIGFjX29wdGlvbgotIGRvCi1AQCAtMzIxLDcgKzQ2OCw3IEBACi0gICAgIHdpdGhfZnA9bm8gOzsKLSAKLSAgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0tICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0rICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICAgbm9fY3JlYXRlPXllcyA7OwotIAotICAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi1AQCAtNTAwLDcgKzY0Nyw3IEBACi0gICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKLSAgIGNhc2UgJGFjX3ZhbCBpbgotICAgICBbXFwvJF0qIHwgPzpbXFwvXSogfCBOT05FIHwgJycgKSA7OwotLSAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBwYXRoIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgotKyAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICAgZXNhYwotIGRvbmUKLUBAIC01MTIsMTggKzY1OSwxOSBAQAotICAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCi0gICBjYXNlICRhY192YWwgaW4KLSAgICAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKLS0gICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgcGF0aCBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKLSsgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCi0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgIGVzYWMKLSBkb25lCi0gCi0gIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwotICMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLSBidWlsZD0kYnVpbGRfYWxpYXMKLSBob3N0PSRob3N0X2FsaWFzCi0gdGFyZ2V0PSR0YXJnZXRfYWxpYXMKLSAKLS0jIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCi0rIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgotICAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQotQEAgLTUzOSwxMyArNjg3LDIzIEBACi0gCi0gdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotIAotKwotICMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLSBpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotLSAgYWNfcHJvZz0kMAotLSAgYWNfY29uZmRpcj1gZWNobyAiJGFjX3Byb2ciIHwgc2VkICdzJVtcXC9dW15cXC9dW15cXC9dKiQlJSdgCi0tICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0rICBhY19jb25mZGlyPWAoZGlybmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAotKyRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0rICAgICAgICAgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKLSsgICAgICAgICBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotKyAgICAgICAgIFgiJDAiIDogJ1hcKC9cKScgXHwgXAotKyAgICAgICAgIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAotK2VjaG8gWCIkMCIgfAotKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KLSsgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9Ci0rICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KLSsgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9Ci0rICAJICBzLy4qLy4vOyBxJ2AKLSAgIHNyY2Rpcj0kYWNfY29uZmRpcgotICAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgIHNyY2Rpcj0uLgotQEAgLTU1NSwxMCArNzEzLDEwIEBACi0gZmkKLSBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iID4mMgotKyAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJGFjX2NvbmZkaXIgb3IgLi4iID4mMgotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZWxzZQotLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgPiYyCi0rICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgIGZpCi0gZmkKLUBAIC02MDIsNyArNzYwLDcgQEAKLSBpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgotICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0tICBjYXQgPDxFT0YKLSsgIGNhdCA8PF9BQ0VPRgotIFxgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCi0gCi0gVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCi1AQCAtNjIzLDkgKzc4MSw5IEBACi0gICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCi0gCi0tRU9GCi0rX0FDRU9GCi0gCi0tICBjYXQgPDxFT0YKLSsgIGNhdCA8PF9BQ0VPRgotIEluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLUBAIC02NTIsOSArODEwLDkgQEAKLSAgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtQUkVGSVgvaW5mb10KLSAgIC0tbWFuZGlyPURJUiAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW1BSRUZJWC9tYW5dCi0tRU9GCi0rX0FDRU9GCi0gCi0tICBjYXQgPDxcRU9GCi0rICBjYXQgPDxcX0FDRU9GCi0gCi0gUHJvZ3JhbSBuYW1lczoKLSAgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUBAIC02NjcsMTQgKzgyNSwxNCBAQAotIAotIFN5c3RlbSB0eXBlczoKLSAgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi0tICAtLWhvc3Q9SE9TVCAgICAgICBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCi0rICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KLSAgIC0tdGFyZ2V0PVRBUkdFVCAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgY29tcGlsZXJzIGZvciBUQVJHRVQgW0hPU1RdCi0tRU9GCi0rX0FDRU9GCi0gZmkKLSAKLSBpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotIAotLSAgY2F0IDw8XEVPRgotKyAgY2F0IDw8XF9BQ0VPRgotIAotIE9wdGlvbmFsIEZlYXR1cmVzOgotICAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotQEAgLTY5Niw2ICs4NTQsOSBAQAotIE9wdGlvbmFsIFBhY2thZ2VzOgotICAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0rICAtLXdpdGgtYWlmPWRpciAgICAgICAgICAgICAgICB1c2UgYWlmIGluIGRpcgotKyAgLS13aXRoLWFpZi1saWI9ZGlyICAgICAgICAgICAgdXNlIGFpZiBsaWJyYXJpZXMgaW4gZGlyCi0rICAtLXdpdGgtYWlmLWluY2x1ZGU9ZGlyICAgICAgICB1c2UgYWlmIGhlYWRlcnMgaW4gZGlyCi0gICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZQotICAgLS13aXRoLXVpb3V0ICAgICAgICAgIFVzZSBuZXcgdWlvdXQgZnVuY3Rpb25zIGluc3RlYWQgb2YgKnByaW50ZidzCi0gICAtLXdpdGgtbW1hbGxvYyAgICAgICAgICBVc2UgbWVtb3J5IG1hcHBlZCBtYWxsb2MgcGFja2FnZQotQEAgLTcyMiw0MCArODgzLDYwIEBACi0gVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKLSBpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCi0gCi0tRU9GCi0rX0FDRU9GCi0gZmkKLSAKLSBpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCi0gICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotICAgYWNfcG9wZGlyPWBwd2RgCi0tICBmb3IgYWNfc3ViZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX3N1YmRpciIgPSB4OiAmJiBjb250aW51ZQotLSAgICBjZCAkYWNfc3ViZGlyCi0tICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gLyRhY19zdWJkaXIuCi0tICAgIGFjX2RvdHM9YGVjaG8gJGFjX3N1YmRpciB8Ci0tICAgICAgICAgICAgIHNlZCAncyxeXC4vLCw7cyxbXi9dJCwmLyw7cyxbXi9dKi8sLi4vLGcnYAotLQotLSAgICBjYXNlICRzcmNkaXIgaW4KLS0gICAgLikgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0tICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyIDs7Ci0tICAgIFtcXC9dKiB8ID86W1xcL10qICkgIyBBYnNvbHV0ZSBwYXRoLgotLSAgICAgIGFjX3N1Yl9zcmNkaXI9JHNyY2Rpci8kYWNfc3ViZGlyIDs7Ci0tICAgICopICMgUmVsYXRpdmUgcGF0aC4KLS0gICAgICBhY19zdWJfc3JjZGlyPSRhY19kb3RzJHNyY2Rpci8kYWNfc3ViZGlyIDs7Ci0tICAgIGVzYWMKLSsgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCi0rICAgIHRlc3QgLWQgJGFjX2RpciB8fCBjb250aW51ZQotKyAgICBhY19idWlsZGRpcj0uCi0rCi0raWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSsgIGFjX3RvcF9idWlsZGRpcj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC4uLyxnJ2AKLStlbHNlCi0rICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9Ci0rZmkKLSsKLStjYXNlICRzcmNkaXIgaW4KLSsgIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSsgICAgYWNfc3JjZGlyPS4KLSsgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KLSsgICAgICAgYWNfdG9wX3NyY2Rpcj0uCi0rICAgIGVsc2UKLSsgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAotKyAgICBmaSA7OwotKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBwYXRoLgotKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSsgICopICMgUmVsYXRpdmUgcGF0aC4KLSsgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSsgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OwotK2VzYWMKLSsjIERvbid0IGJsaW5kbHkgcGVyZm9ybSBhIGBjZCAiJGFjX2RpciIvJGFjX2ZvbyAmJiBwd2RgIHNpbmNlICRhY19mb28gY2FuIGJlCi0rIyBhYnNvbHV0ZS4KLSthY19hYnNfYnVpbGRkaXI9YGNkICIkYWNfZGlyIiAmJiBjZCAkYWNfYnVpbGRkaXIgJiYgcHdkYAotK2FjX2Fic190b3BfYnVpbGRkaXI9YGNkICIkYWNfZGlyIiAmJiBjZCAkYWNfdG9wX2J1aWxkZGlyICYmIHB3ZGAKLSthY19hYnNfc3JjZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX3NyY2RpciAmJiBwd2RgCi0rYWNfYWJzX3RvcF9zcmNkaXI9YGNkICIkYWNfZGlyIiAmJiBjZCAkYWNfdG9wX3NyY2RpciAmJiBwd2RgCi0gCi0rICAgIGNkICRhY19kaXIKLSAgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KLS0gICAgaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuZ251OyB0aGVuCi0rICAgIGlmIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmUuZ251OyB0aGVuCi0gICAgICAgZWNobwotLSAgICAgICRTSEVMTCAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuZ251ICAtLWhlbHA9cmVjdXJzaXZlCi0tICAgIGVsaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmU7IHRoZW4KLSsgICAgICAkU0hFTEwgJGFjX3NyY2Rpci9jb25maWd1cmUuZ251ICAtLWhlbHA9cmVjdXJzaXZlCi0rICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgotICAgICAgIGVjaG8KLS0gICAgICAkU0hFTEwgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCi0tICAgIGVsaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuYWMgfHwKLS0gICAgICAgICAgIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlLmluOyB0aGVuCi0rICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCi0rICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5hYyB8fAotKyAgICAgICAgICAgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgotICAgICAgIGVjaG8KLSAgICAgICAkYWNfY29uZmlndXJlIC0taGVscAotICAgICBlbHNlCi0tICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19zdWJkaXIiID4mMgotKyAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKLSAgICAgZmkKLSAgICAgY2QgJGFjX3BvcGRpcgotICAgZG9uZQotQEAgLTc2MywzMSArOTQ0LDMxIEBACi0gCi0gdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAwCi0gaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgotLSAgY2F0IDw8XEVPRgotKyAgY2F0IDw8XF9BQ0VPRgotIAotLUNvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi0rQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIKLSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLS1FT0YKLStfQUNFT0YKLSAgIGV4aXQgMAotIGZpCi0gZXhlYyA1PmNvbmZpZy5sb2cKLS1jYXQgPiY1IDw8RU9GCi0rY2F0ID4mNSA8PF9BQ0VPRgotIFRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi0gcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSAKLSBJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcwotLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41Mi4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41My4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotIAotICAgJCAkMCAkQAotIAotLUVPRgotK19BQ0VPRgotIHsKLSBjYXQgPDxfQVNVTkFNRQotLSMjIC0tLS0tLS0tLS0gIyMKLS0jIyBQbGF0Zm9ybS4gICMjCi0tIyMgLS0tLS0tLS0tLSAjIwotKyMjIC0tLS0tLS0tLSAjIwotKyMjIFBsYXRmb3JtLiAjIwotKyMjIC0tLS0tLS0tLSAjIwotIAotIGhvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0gdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi1AQCAtODA2LDE3ICs5ODcsMjcgQEAKLSAvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0gL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotIAotLVBBVEggPSAkUEFUSAotLQotIF9BU1VOQU1FCi0rCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGVjaG8gIlBBVEg6ICRhc19kaXIiCi0rZG9uZQotKwotIH0gPiY1Ci0gCi0tY2F0ID4mNSA8PEVPRgotLSMjIC0tLS0tLS0tLS0tLSAjIwotLSMjIENvcmUgdGVzdHMuICAjIwotLSMjIC0tLS0tLS0tLS0tLSAjIwotK2NhdCA+JjUgPDxfQUNFT0YKLSsKLSsKLSsjIyAtLS0tLS0tLS0tLSAjIwotKyMjIENvcmUgdGVzdHMuICMjCi0rIyMgLS0tLS0tLS0tLS0gIyMKLSsKLStfQUNFT0YKLSAKLS1FT0YKLSAKLSAjIEtlZXAgYSB0cmFjZSBvZiB0aGUgY29tbWFuZCBsaW5lLgotICMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotQEAgLTgyNywxNSArMTAxOCwxNyBAQAotIGRvCi0gICBjYXNlICRhY19hcmcgaW4KLSAgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0tICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0rICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbiApIGNvbnRpbnVlIDs7Ci0gICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLS0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0rICAgIGNvbnRpbnVlIDs7Ci0gICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKLS0gICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYAotLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzJGFjX3NlcCckYWNfYXJnJyIKLS0gICAgYWNfc2VwPSIgIiA7OwotLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyRhY19zZXAkYWNfYXJnIgotLSAgICAgYWNfc2VwPSIgIiA7OwotKyAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0rICBlc2FjCi0rICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KLSsgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0rICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MkYWNfc2VwJyRhY19hcmcnIgotKyAgICAgICBhY19zZXA9IiAiIDs7Ci0gICBlc2FjCi0gICAjIEdldCByaWQgb2YgdGhlIGxlYWRpbmcgc3BhY2UuCi0gZG9uZQotQEAgLTg0MywxNCArMTAzNiwxOSBAQAotICMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKLSAjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotICMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgotKyMgV0FSTklORzogQmUgc3VyZSBub3QgdG8gdXNlIHNpbmdsZSBxdW90ZXMgaW4gdGhlcmUsIGFzIHNvbWUgc2hlbGxzLAotKyMgc3VjaCBhcyBvdXIgRFUgNS4wIGZyaWVuZCwgd2lsbCB0aGVuIGBjbG9zZScgdGhlIHRyYXAuCi0gdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSAgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotLSAgZWNobyA+JjUKLS0gIGVjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIiA+JjUKLS0gIGVjaG8gIiMjIENhY2hlIHZhcmlhYmxlcy4gICMjIiA+JjUKLS0gIGVjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIiA+JjUKLS0gIGVjaG8gPiY1Ci0tICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotKyAgewotKyAgICBlY2hvCi0rICAgIGNhdCA8PFxfQVNCT1gKLSsjIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0rIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLStfQVNCT1gKLSsgICAgZWNobwotKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIHsKLSAgIChzZXQpIDI+JjEgfAotICAgICBjYXNlIGAoYWNfc3BhY2U9JyInIicgJyInIic7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi1AQCAtODY0LDIxICsxMDYyLDI0IEBACi0gICAgICAgICAicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKLSAgICAgICA7OwotICAgICBlc2FjOwotLX0gPiY1Ci0tICBzZWQgIi9eJC9kIiBjb25mZGVmcy5oID5jb25mdGVzdC5sb2cKLS0gIGlmIHRlc3QgLXMgY29uZnRlc3QubG9nOyB0aGVuCi0tICAgIGVjaG8gPiY1Ci0tICAgIGVjaG8gIiMjIC0tLS0tLS0tLS0tLSAjIyIgPiY1Ci0tICAgIGVjaG8gIiMjIGNvbmZkZWZzLmguICAjIyIgPiY1Ci0tICAgIGVjaG8gIiMjIC0tLS0tLS0tLS0tLSAjIyIgPiY1Ci0tICAgIGVjaG8gPiY1Ci0tICAgIGNhdCBjb25mdGVzdC5sb2cgPiY1Ci0tICBmaQotLSAgKGVjaG87IGVjaG8pID4mNQotLSAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotLSAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIgPiY1Ci0tICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIiA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotK30KLSsgICAgZWNobwotKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KLSsgICAgICBjYXQgPDxcX0FTQk9YCi0rIyMgLS0tLS0tLS0tLS0gIyMKLSsjIyBjb25mZGVmcy5oLiAjIwotKyMjIC0tLS0tLS0tLS0tICMjCi0rX0FTQk9YCi0rICAgICAgZWNobwotKyAgICAgIHNlZCAiL14kL2QiIGNvbmZkZWZzLmgKLSsgICAgICBlY2hvCi0rICAgIGZpCi0rICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKLSsgICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSsgICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSsgIH0gPiY1Ci0rICBybSAtZiBjb3JlIGNvcmUuKiAqLmNvcmUgJiYKLSsgIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCi0gICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0gICAgICAnIDAKLSBmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KLUBAIC04OTEsNiArMTA5MiwzMyBAQAotICMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotIGVjaG8gPmNvbmZkZWZzLmgKLSAKLSsjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLSsKLStjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi0rX0FDRU9GCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgotK19BQ0VPRgotKwotKwotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSsjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKLStfQUNFT0YKLSsKLSsKLStjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotK19BQ0VPRgotKwotKwotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSsjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCi0rX0FDRU9GCi0rCi0rCi0gIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0gIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLSBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi1AQCAtOTAyLDkgKzExMzAsOSBAQAotIGZpCi0gZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotLSAgICB7IGVjaG8gIiRhc19tZTo5MDU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci0gZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9Ci0tICAgIGNhdCAiJGFjX3NpdGVfZmlsZSIgPiY1Ci0rICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQotICAgICAuICIkYWNfc2l0ZV9maWxlIgotICAgZmkKLSBkb25lCi1AQCAtOTEzLDcgKzExNDEsNyBAQAotICAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgICMgZmlsZXMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LgotICAgaWYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0tICAgIHsgZWNobyAiJGFzX21lOjkxNjogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotIGVjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgotICAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAkY2FjaGVfZmlsZTs7Ci1AQCAtOTIxLDcgKzExNDksNyBAQAotICAgICBlc2FjCi0gICBmaQotIGVsc2UKLS0gIHsgZWNobyAiJGFzX21lOjkyNDogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICA+JGNhY2hlX2ZpbGUKLSBmaQotQEAgLTkzNyw0MiArMTE2NSw0MiBAQAotICAgZXZhbCBhY19uZXdfdmFsPSJcJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUiCi0gICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0gICAgIHNldCwpCi0tICAgICAgeyBlY2hvICIkYXNfbWU6OTQwOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAgLHNldCkKLS0gICAgICB7IGVjaG8gIiRhc19tZTo5NDQ6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICAsKTs7Ci0gICAgICopCi0gICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotLSAgICAgICAgeyBlY2hvICIkYXNfbWU6OTUwOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1Ci0rICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KLS0gICAgICAgIHsgZWNobyAiJGFzX21lOjk1MjogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci0rICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjUKLSBlY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0tICAgICAgICB7IGVjaG8gIiRhc19tZTo5NTQ6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQotKyAgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci0gZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQotICAgICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgICBmaTs7Ci0gICBlc2FjCi0tICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuICBJdCBkb2Vzbid0IG1hdHRlciBpZgotLSAgIyB3ZSBwYXNzIHNvbWUgdHdpY2UgKGluIGFkZGl0aW9uIHRvIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzKS4KLSsgICMgUGFzcyBwcmVjaW91cyB2YXJpYWJsZXMgdG8gY29uZmlnLnN0YXR1cy4KLSAgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgICBjYXNlICRhY19uZXdfdmFsIGluCi0gICAgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XCJcJ10qKQotLSAgICAgIGFjX2FyZz0kYWNfdmFyPWBlY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAKLS0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLS0gICAgICA7OwotLSAgICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY192YXI9JGFjX25ld192YWwiCi0tICAgICAgIDs7Ci0rICAgICAgYWNfYXJnPSRhY192YXI9YGVjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OwotKyAgICBlc2FjCi0rICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgotKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgICBlc2FjCi0gICBmaQotIGRvbmUKLSBpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCi0tICB7IGVjaG8gIiRhc19tZTo5NzM6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotLSAgeyB7IGVjaG8gIiRhc19tZTo5NzU6IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKLSsgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLUBAIC05ODMsMzAgKzEyMTEsMjYgQEAKLSBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLSAKLS1jYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgotLSAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JwotLScgRUNIT19UPScJJyA7OwotLSAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OwotLSAgKikgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKLS1lc2FjCi0tZWNobyAiIyEgJFNIRUxMIiA+Y29uZnRlc3Quc2gKLS1lY2hvICAiZXhpdCAwIiAgID4+Y29uZnRlc3Quc2gKLS1jaG1vZCAreCBjb25mdGVzdC5zaAotLWlmIHsgKGVjaG8gIiRhc19tZTo5OTU6IFBBVEg9XCIuOy5cIjsgY29uZnRlc3Quc2giKSA+JjUKLS0gIChQQVRIPSIuOy4iOyBjb25mdGVzdC5zaCkgMj4mNQotLSAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6OTk4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLS0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0tICBhY19wYXRoX3NlcGFyYXRvcj0nOycKLS1lbHNlCi0tICBhY19wYXRoX3NlcGFyYXRvcj06Ci0tZmkKLS1QQVRIX1NFUEFSQVRPUj0iJGFjX3BhdGhfc2VwYXJhdG9yIgotLXJtIC1mIGNvbmZ0ZXN0LnNoCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0gCi0gYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaDpjb25maWcuaW4iCi0gCi0tZWNobyAiJGFzX21lOjEwMDk6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMuLi4gJEVDSE9fQyIgPiY2Ci0gICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi1AQCAtMTAxNSw5ICsxMjM5LDEwIEBACi0gZWxzZQotICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIGZpOwotLSAgZWNobyAiJGFzX21lOjEwMTg6IHJlc3VsdDogJFVTRV9NQUlOVEFJTkVSX01PREUiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFVTRV9NQUlOVEFJTkVSX01PREUiID4mNQotIGVjaG8gIiR7RUNIT19UfSRVU0VfTUFJTlRBSU5FUl9NT0RFIiA+JjYKLSAKLSsKLSBpZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLUBAIC0xMDI4LDYgKzEyNTMsOCBAQAotIAotICAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gCi0rCi0rCi0gYWNfZXh0PWMKLSBhY19jcHA9JyRDUFAgJENQUEZMQUdTJwotIGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLUBAIC0xMDM2LDcgKzEyNjMsNyBAQAotIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZToxMDM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC0xMDQ0LDI1ICsxMjcxLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLS1lY2hvICIkYXNfbWU6MTA1NDogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gZmkKLSBmaQotIENDPSRhY19jdl9wcm9nX0NDCi0gaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjEwNjI6IHJlc3VsdDogJENDIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MTA2NTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtMTA3MSw3ICsxMzAxLDcgQEAKLSAgIGFjX2N0X0NDPSRDQwotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6MTA3NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtMTA3OSwyNSArMTMwOSwyOCBAQAotICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSBlbHNlCi0tICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCi0tYWNfZHVtbXk9IiRQQVRIIgotLWZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotLSAgSUZTPSRhY19zYXZlX0lGUwotLSAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLS0gICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCi0tYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotLWVjaG8gIiRhc19tZToxMDg5OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKLS1icmVhawotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gZmkKLSBmaQotIGFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi0gaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjEwOTc6IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MTEwMDogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtMTExMCw3ICsxMzQzLDcgQEAKLSAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6MTExMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtMTExOCwyNSArMTM1MSwyOCBAQAotICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSBlbHNlCi0tICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCi0tYWNfZHVtbXk9IiRQQVRIIgotLWZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotLSAgSUZTPSRhY19zYXZlX0lGUwotLSAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLS0gICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCi0tYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLS1lY2hvICIkYXNfbWU6MTEyODogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBmaQotIGZpCi0gQ0M9JGFjX2N2X3Byb2dfQ0MKLSBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6MTEzNjogcmVzdWx0OiAkQ0MiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kQ0MiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZToxMTM5OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLUBAIC0xMTQ1LDcgKzEzODEsNyBAQAotICAgYWNfY3RfQ0M9JENDCi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6MTE0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtMTE1MywyNSArMTM4OSwyOCBAQAotICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSBlbHNlCi0tICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCi0tYWNfZHVtbXk9IiRQQVRIIgotLWZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotLSAgSUZTPSRhY19zYXZlX0lGUwotLSAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLS0gICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCi0tYWNfY3ZfcHJvZ19hY19jdF9DQz0iY2MiCi0tZWNobyAiJGFzX21lOjExNjM6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQotLWJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iY2MiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBhY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZToxMTcxOiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjExNzQ6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTExODQsNyArMTQyMyw3IEBACi0gaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi0tZWNobyAiJGFzX21lOjExODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTExOTMsMTkgKzE0MzIsMjIgQEAKLSAgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotICAgYWNfcHJvZ19yZWplY3RlZD1ubwotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotLSAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLS0gIGNvbnRpbnVlCi0tZmkKLS1hY19jdl9wcm9nX0NDPSJjYyIKLS1lY2hvICIkYXNfbWU6MTIwNzogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSsgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLSsgICAgICAgY29udGludWUKLSsgICAgIGZpCi0rICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi1AQCAtMTIxNyw3ICsxNDU5LDcgQEAKLSAgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICAgc2hpZnQKLS0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAkezErIiRAIn0KLSsgICAgc2V0IGR1bW15ICIkYXNfZGlyLyRhY193b3JkIiAkezErIiRAIn0KLSAgICAgc2hpZnQKLSAgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gICBmaQotQEAgLTEyMjYsMTAgKzE0NjgsMTAgQEAKLSBmaQotIENDPSRhY19jdl9wcm9nX0NDCi0gaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjEyMjk6IHJlc3VsdDogJENDIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MTIzMjogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtMTI0MCw3ICsxNDgyLDcgQEAKLSAgIGRvCi0gICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZToxMjQzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC0xMjQ4LDI1ICsxNDkwLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLS1lY2hvICIkYXNfbWU6MTI1ODogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gZmkKLSBmaQotIENDPSRhY19jdl9wcm9nX0NDCi0gaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjEyNjY6IHJlc3VsdDogJENDIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MTI2OTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtMTI3OSw3ICsxNTI0LDcgQEAKLSBkbwotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi0tZWNobyAiJGFzX21lOjEyODI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTEyODcsMjUgKzE1MzIsMjggQEAKLSAgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotLWVjaG8gIiRhc19tZToxMjk3OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKLS1icmVhawotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBmaQotIGZpCi0gYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLSBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6MTMwNTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZToxMzA4OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLUBAIC0xMzE3LDM0ICsxNTY1LDQxIEBACi0gCi0gZmkKLSAKLS10ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6MTMyMDogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiA+JjUKLS1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgPiYyO30KLSsKLSt0ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gCi0gIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotLWVjaG8gIiRhc19tZToxMzI1OiIgXAotK2VjaG8gIiRhc19tZTokTElORU5POiIgXAotICAgICAgImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQotIGFjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKLS17IChldmFsIGVjaG8gIiRhc19tZToxMzI4OiBcIiRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjVcIiIpID4mNQotK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxMzMxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9Ci0teyAoZXZhbCBlY2hvICIkYXNfbWU6MTMzMzogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQotK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MTMzNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfQotLXsgKGV2YWwgZWNobyAiJGFzX21lOjEzMzg6IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKLSt7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjEzNDE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLSAKLSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxMzQ1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0xMzU4LDIyICsxNjEzLDI2IEBACi0gIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotICMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KLSAjIG9mIGV4ZWV4dC4KLS1lY2hvICIkYXNfbWU6MTM2MTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dC4uLiAkRUNIT19DIiA+JjYKLSBhY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTM2NDogXCIkYWNfbGlua19kZWZhdWx0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rX2RlZmF1bHRcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmtfZGVmYXVsdCkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MTM2NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAgIyBGaW5kIHRoZSBvdXRwdXQsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LiAgVGhpcyBzY2hlbWUgaXMKLSAjIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKSBvbmx5IGFzIGEgbGFzdAotICMgcmVzb3J0LgotLWZvciBhY19maWxlIGluIGBscyBhLmV4ZSBjb25mdGVzdC5leGUgMj4vZGV2L251bGw7Ci0rCi0rIyBCZSBjYXJlZnVsIHRvIGluaXRpYWxpemUgdGhpcyB2YXJpYWJsZSwgc2luY2UgaXQgdXNlZCB0byBiZSBjYWNoZWQuCi0rIyBPdGhlcndpc2UgYW4gb2xkIGNhY2hlIHZhbHVlIG9mIGBubycgbGVkIHRvIGBFWEVFWFQgPSBubycgaW4gYSBNYWtlZmlsZS4KLSthY19jdl9leGVleHQ9Ci0rZm9yIGFjX2ZpbGUgaW4gYGxzIGFfb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgMj4vZGV2L251bGw7Ci0gICAgICAgICAgICAgICAgIGxzIGEub3V0IGNvbmZ0ZXN0IDI+L2Rldi9udWxsOwotICAgICAgICAgICAgICAgICBscyBhLiogY29uZnRlc3QuKiAyPi9kZXYvbnVsbGA7IGRvCi0gICBjYXNlICRhY19maWxlIGluCi0tICAgICouJGFjX2V4dCB8ICoubyB8ICoub2JqIHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgKSA7OwotKyAgICAqLiRhY19leHQgfCAqLm8gfCAqLm9iaiB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNICkgOzsKLSAgICAgYS5vdXQgKSAjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotICAgICAgICAgICAgICMgY2VydGFpbmx5IHJpZ2h0LgotICAgICAgICAgICAgIGJyZWFrOzsKLUBAIC0xMzg3LDM0ICsxNjQ2LDM0IEBACi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS17IHsgZWNobyAiJGFzX21lOjEzOTA6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMiID4mNQotK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcyIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzIiA+JjI7fQotICAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0gZmkKLSAKLSBhY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotLWVjaG8gIiRhc19tZToxMzk2OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNgotIAotICMgQ2hlY2sgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotICMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLS1lY2hvICIkYXNfbWU6MTQwMTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKLSAjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCi0gIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KLSBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTQwNzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxNDEwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgIGNyb3NzX2NvbXBpbGluZz1ubwotICAgZWxzZQotICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0gCWNyb3NzX2NvbXBpbGluZz15ZXMKLSAgICAgZWxzZQotLQl7IHsgZWNobyAiJGFzX21lOjE0MTc6IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi0rCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLSBJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4iID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLSBJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4iID4mMjt9Ci1AQCAtMTQyMiwyNCArMTY4MSwyNCBAQAotICAgICBmaQotICAgZmkKLSBmaQotLWVjaG8gIiRhc19tZToxNDI1OiByZXN1bHQ6IHllcyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLSBlY2hvICIke0VDSE9fVH15ZXMiID4mNgotIAotIHJtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAotIGFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0gIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0gIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgotLWVjaG8gIiRhc19tZToxNDMyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNgotLWVjaG8gIiRhc19tZToxNDM0OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotIGVjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNgotIAotLWVjaG8gIiRhc19tZToxNDM3OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4Li4uICRFQ0hPX0MiID4mNgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE0Mzk6IFwiJGFjX2xpbmtcIiIpID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MTQ0MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0gIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi1AQCAtMTQ1NSwyNyArMTcxNCwzMyBAQAotICAgZXNhYwotIGRvbmUKLSBlbHNlCi0tICB7IHsgZWNobyAiJGFzX21lOjE0NTg6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBFWEVFWFQ6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rIiA+JjUKLS1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBFWEVFWFQ6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rIiA+JjI7fQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluayIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluayIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBmaQotIAotIHJtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAotLWVjaG8gIiRhc19tZToxNDY0OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNgotIAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSBFWEVFWFQ9JGFjX2N2X2V4ZWV4dAotIGFjX2V4ZWV4dD0kRVhFRVhUCi0tZWNobyAiJGFzX21lOjE0NzA6IGNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4IiA+JjUKLS1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4Li4uICRFQ0hPX0MiID4mNgotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxNDc2ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0xNDg1LDEwICsxNzUwLDEwIEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTQ4ODogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MTQ5MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAgZm9yIGFjX2ZpbGUgaW4gYChscyBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iajsgbHMgY29uZnRlc3QuKikgMj4vZGV2L251bGxgOyBkbwotICAgY2FzZSAkYWNfZmlsZSBpbgotQEAgLTE1MDAsMjYgKzE3NjUsMzIgQEAKLSBlbHNlCi0gICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLXsgeyBlY2hvICIkYXNfbWU6MTUwMzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIE9CSkVYVDogY2Fubm90IGNvbXBpbGUiID4mNQotLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIE9CSkVYVDogY2Fubm90IGNvbXBpbGUiID4mMjt9Ci0reyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGZpCi0gCi0gcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6MTUxMDogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjYKLSBPQkpFWFQ9JGFjX2N2X29iamV4dAotIGFjX29iamV4dD0kT0JKRVhUCi0tZWNobyAiJGFzX21lOjE1MTQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxNTIwICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0xNTMyLDE2ICsxODAzLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToxNTM1OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxNTM4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjE1NDE6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MTU0NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY29tcGlsZXJfZ251PXllcwotIGVsc2UKLUBAIC0xNTUzLDIxICsxODI0LDI3IEBACi0gYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotIAotIGZpCi0tZWNobyAiJGFzX21lOjE1NTY6IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2Ci0gR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCi0gYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotIGFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLSBDRkxBR1M9Ii1nIgotLWVjaG8gIiRhc19tZToxNTYyOiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDE1NjggImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTE1NzcsMTYgKzE4NTQsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE1ODA6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjE1ODM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTU4NjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxNTg5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9wcm9nX2NjX2c9eWVzCi0gZWxzZQotQEAgLTE1OTYsNyArMTg3Myw3IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZToxNTk5OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNgotIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKLUBAIC0xNjIzLDE2ICsxOTAwLDE2IEBACi0gI2VuZGlmCi0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE2MjY6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjE2Mjk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTYzMjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxNjM1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBmb3IgYWNfZGVjbGFyYXRpb24gaW4gXAotICAgICcnXAotQEAgLTE2NDQsMTAgKzE5MjEsMTYgQEAKLSAgICAndm9pZCBleGl0IChpbnQpOycKLSBkbwotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMTY0NyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gJGFjX2RlY2xhcmF0aW9uCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTE2NTcsMTYgKzE5NDAsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE2NjA6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjE2NjM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTY2NjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxNjY5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICA6Ci0gZWxzZQotQEAgLTE2NzYsOSArMTk1OSwxNSBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxNjc5ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICRhY19kZWNsYXJhdGlvbgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0xNjg4LDE2ICsxOTc3LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToxNjkxOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxNjk0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjE2OTc6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MTcwMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYnJlYWsKLSBlbHNlCi1AQCAtMTcyNCwxMiArMjAxMywxNCBAQAotIGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi0gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotIAotKwotKwotIGFjX2V4dD1jCi0gYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLSBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLSBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0tZWNobyAiJGFzX21lOjE3MzI6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2Ci0gIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLSBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotQEAgLTE3NTAsMTggKzIwNDEsMTggQEAKLSAgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDE3NTMgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFzc2VydC5oPgotICAgICAgICAgICAgICAgICAgICAgIFN5bnRheCBlcnJvcgotIF9BQ0VPRgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE3NTg6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCi0gICBhY19zdGF0dXM9JD8KLSAgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLS0gIGVjaG8gIiRhc19tZToxNzY0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KLSAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKLUBAIC0xNzg0LDE3ICsyMDc1LDE3IEBACi0gICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKLSAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxNzg3ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotIF9BQ0VPRgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE3OTE6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCi0gICBhY19zdGF0dXM9JD8KLSAgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLS0gIGVjaG8gIiRhc19tZToxNzk3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KLSAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKLUBAIC0xODMxLDcgKzIxMjIsNyBAQAotIGVsc2UKLSAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLSBmaQotLWVjaG8gIiRhc19tZToxODM0OiByZXN1bHQ6ICRDUFAiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDUFAiID4mNQotIGVjaG8gIiR7RUNIT19UfSRDUFAiID4mNgotIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLSBmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLUBAIC0xODQxLDE4ICsyMTMyLDE4IEBACi0gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxODQ0ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhc3NlcnQuaD4KLSAgICAgICAgICAgICAgICAgICAgICBTeW50YXggZXJyb3IKLSBfQUNFT0YKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToxODQ5OiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotICAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQotICAgYWNfc3RhdHVzPSQ/Ci0gICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gICBybSAtZiBjb25mdGVzdC5lcjEKLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0tICBlY2hvICIkYXNfbWU6MTg1NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCi0gICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCi1AQCAtMTg3NSwxNyArMjE2NiwxNyBAQAotICAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCi0gICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMTg3OCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLSBfQUNFT0YKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToxODgyOiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotICAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQotICAgYWNfc3RhdHVzPSQ/Ci0gICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gICBybSAtZiBjb25mdGVzdC5lcjEKLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0tICBlY2hvICIkYXNfbWU6MTg4ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCi0gICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCi1AQCAtMTkxMyw3ICsyMjA0LDcgQEAKLSBpZiAkYWNfcHJlcHJvY19vazsgdGhlbgotICAgOgotIGVsc2UKLS0gIHsgeyBlY2hvICIkYXNfbWU6MTkxNjogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjayIgPiY1Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2siID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjayIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBmaQotQEAgLTE5MjQsMTAgKzIyMTUsMTIgQEAKLSBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLSAKLS1lY2hvICIkYXNfbWU6MTkyNzogY2hlY2tpbmcgZm9yIEFJWCIgPiY1Ci0rCi0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBSVgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFJWC4uLiAkRUNIT19DIiA+JjYKLSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxOTMwICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpZmRlZiBfQUlYCi0gICB5ZXMKLUBAIC0xOTM2LDQ2ICsyMjI5LDEzNSBAQAotIF9BQ0VPRgotIGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgIGVncmVwICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgotLSAgZWNobyAiJGFzX21lOjE5Mzk6IHJlc3VsdDogeWVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBfQUxMX1NPVVJDRSAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZWxzZQotLSAgZWNobyAiJGFzX21lOjE5NDY6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0KgotIAotLWVjaG8gIiRhc19tZToxOTUxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci0tZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQy4uLiAkRUNIT19DIiA+JjYKLS1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLS0gICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi0tdGhlbgotLSAgZWNobyAiJGFzX21lOjE5NTY6IHJlc3VsdDogeWVzIiA+JjUKLS1lY2hvICIke0VDSE9fVH15ZXMiID4mNgotLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi0tRU9GCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc3RyZXJyb3IiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzdHJlcnJvci4uLiAkRUNIT19DIiA+JjYKLStpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zdHJlcnJvcitzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLSthY19jdl9zZWFyY2hfc3RyZXJyb3I9bm8KLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0rI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0tICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotLSAgICBDQz0iJENDIC1wb3NpeCIKLS0gIGVsc2UKLS0gICAgQ0M9IiRDQyAtWHAiCi0tICBmaQotKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rZXh0ZXJuICJDIgotKyNlbmRpZgotKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSsgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotK2NoYXIgc3RyZXJyb3IgKCk7Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLStpbnQKLSttYWluICgpCi0rewotK3N0cmVycm9yICgpOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0rICAoZXZhbCAkYWNfbGluaykgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9Im5vbmUgcmVxdWlyZWQiCi0gZWxzZQotLSAgZWNobyAiJGFzX21lOjE5NzA6IHJlc3VsdDogbm8iID4mNQotLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLS0gIElTQz0KLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gZmkKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0raWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPSBubzsgdGhlbgotKyAgZm9yIGFjX2xpYiBpbiBjcG9zaXg7IGRvCi0rICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSsgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotLWVjaG8gIiRhc19tZToxOTc1OiBjaGVja2luZyBmb3IgJHtDQy1jY30gb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQotLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICR7Q0MtY2N9IG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDLi4uICRFQ0hPX0MiID4mNgotLWlmIHRlc3QgIiR7YW1fY3ZfcHJvZ19jY19zdGRjK3NldH0iID0gc2V0OyB0aGVuCi0tICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rZXh0ZXJuICJDIgotKyNlbmRpZgotKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSsgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotK2NoYXIgc3RyZXJyb3IgKCk7Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLStpbnQKLSttYWluICgpCi0rewotK3N0cmVycm9yICgpOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0rICAoZXZhbCAkYWNfbGluaykgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9Ii1sJGFjX2xpYiIKLSticmVhawotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rZmkKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rICBkb25lCi0rZmkKLStMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLStmaQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc3RyZXJyb3IiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfc3RyZXJyb3IiID4mNgotK2lmIHRlc3QgIiRhY19jdl9zZWFyY2hfc3RyZXJyb3IiICE9IG5vOyB0aGVuCi0rICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3N0cmVycm9yIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX3N0cmVycm9yICRMSUJTIgotKwotK2ZpCi0rCi0rCi0rCi0rCi0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJHtDQy1jY30gb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMuLi4gJEVDSE9fQyIgPiY2Ci0raWYgdGVzdCAiJHthbV9jdl9wcm9nX2NjX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgYW1fY3ZfcHJvZ19jY19zdGRjPW5vCi0gYWNfc2F2ZV9DQz0iJENDIgotQEAgLTE5OTAsNyArMjM3Miw3IEBACi0gZG8KLSAgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMTk5MyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkYXJnLmg+Ci0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtMjAyMSw2ICsyNDAzLDEyIEBACi0gaW50IGFyZ2M7Ci0gY2hhciAqKmFyZ3Y7Ci0gCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTIwMzIsMTYgKzI0MjAsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjIwMzU6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjIwMzg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjA0MTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToyMDQ0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhbV9jdl9wcm9nX2NjX3N0ZGM9IiRhY19hcmciOyBicmVhawotIGVsc2UKLUBAIC0yMDU1LDEwICsyNDQzLDEwIEBACi0gZmkKLSAKLSBpZiB0ZXN0IC16ICIkYW1fY3ZfcHJvZ19jY19zdGRjIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjIwNTg6IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotIGVjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MjA2MTogcmVzdWx0OiAkYW1fY3ZfcHJvZ19jY19zdGRjIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhbV9jdl9wcm9nX2NjX3N0ZGMiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhbV9jdl9wcm9nX2NjX3N0ZGMiID4mNgotIGZpCi0gY2FzZSAieCRhbV9jdl9wcm9nX2NjX3N0ZGMiIGluCi1AQCAtMjA2Niw2ICsyNDU0LDE5MiBAQAotICAgKikgQ0M9IiRDQyAkYW1fY3ZfcHJvZ19jY19zdGRjIiA7OwotIGVzYWMKLSAKLSsKLSsKLSsjIENoZWNrIHdoZXRoZXIgLS13aXRoLWFpZiBvciAtLXdpdGhvdXQtYWlmIHdhcyBnaXZlbi4KLStpZiB0ZXN0ICIke3dpdGhfYWlmK3NldH0iID0gc2V0OyB0aGVuCi0rICB3aXRodmFsPSIkd2l0aF9haWYiCi0rCi0rZmk7Ci0rCi0rIyBDaGVjayB3aGV0aGVyIC0td2l0aC1haWYtbGliIG9yIC0td2l0aG91dC1haWYtbGliIHdhcyBnaXZlbi4KLStpZiB0ZXN0ICIke3dpdGhfYWlmX2xpYitzZXR9IiA9IHNldDsgdGhlbgotKyAgd2l0aHZhbD0iJHdpdGhfYWlmX2xpYiIKLSsgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBObyBhcmd1bWVudCBmb3IgLS13aXRoLWFpZi1saWIiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IE5vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWxpYiIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLStlbGlmIHRlc3QgIlgkd2l0aF9haWYiID0gIlgiOyB0aGVuCi0rICB3aXRoX2FpZj15ZXMKLStmaQotK2ZpOwotKwotKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYWlmLWluY2x1ZGUgb3IgLS13aXRob3V0LWFpZi1pbmNsdWRlIHdhcyBnaXZlbi4KLStpZiB0ZXN0ICIke3dpdGhfYWlmX2luY2x1ZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIHdpdGh2YWw9IiR3aXRoX2FpZl9pbmNsdWRlIgotKyAgaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyIgLW8gIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSsgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IE5vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWluY2x1ZGUiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IE5vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWluY2x1ZGUiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0rZWxpZiB0ZXN0ICJYJHdpdGhfYWlmIiA9ICJYIjsgdGhlbgotKyAgd2l0aF9haWY9eWVzCi0rZmkKLStmaTsKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFpZiIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYWlmLi4uICRFQ0hPX0MiID4mNgotKwotK2Nhc2UgIiR3aXRoX2FpZiIgaW4KLSt5ZXMpCTs7Ci0rbm8pCTs7Ci0rIiIpCTs7Ci0rKikJaWYgdGVzdCAiJHdpdGhfYWlmX2luY2x1ZGUiID0gIiI7IHRoZW4KLSsJCXdpdGhfYWlmX2luY2x1ZGU9IiR3aXRoX2FpZi9pbmNsdWRlIgotKwlmaQotKwlpZiB0ZXN0ICIkd2l0aF9haWZfbGliIiA9ICIiOyB0aGVuCi0rCQl3aXRoX2FpZl9saWI9IiR3aXRoX2FpZi9saWIkYWJpbGliZGlyZXh0IgotKwlmaQotKwk7OwotK2VzYWMKLStoZWFkZXJfZGlycz0KLStsaWJfZGlycz0KLStkPScvdXNyL2xvY2FsJwotK2ZvciBpIGluICRkIC91c3I7IGRvCi0rCWhlYWRlcl9kaXJzPSIkaGVhZGVyX2RpcnMgJGkvaW5jbHVkZSIKLSsJbGliX2RpcnM9IiRsaWJfZGlycyAkaS9saWIkYWJpbGliZGlyZXh0IgotK2RvbmUKLSsKLStjYXNlICIkd2l0aF9haWZfaW5jbHVkZSIgaW4KLSt5ZXMpIDs7Ci0rbm8pICA7OwotKyopICAgaGVhZGVyX2RpcnM9IiR3aXRoX2FpZl9pbmNsdWRlICRoZWFkZXJfZGlycyI7OwotK2VzYWMKLStjYXNlICIkd2l0aF9haWZfbGliIiBpbgotK3llcykgOzsKLStubykgIDs7Ci0rKikgICBsaWJfZGlycz0iJHdpdGhfYWlmX2xpYiAkbGliX2RpcnMiOzsKLStlc2FjCi0rCi0rc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0rc2F2ZV9MSUJTPSIkTElCUyIKLStpcmVzPSBscmVzPQotK2ZvciBpIGluICRoZWFkZXJfZGlyczsgZG8KLSsJQ0ZMQUdTPSItSSRpICRzYXZlX0NGTEFHUyIKLSsJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyNpbmNsdWRlIDxhaWYuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotK2ludAotK21haW4gKCkKLSt7Ci0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIChldmFsICRhY190cnkpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGlyZXM9JGk7YnJlYWsKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2ZpCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZG9uZQotK2ZvciBpIGluICRsaWJfZGlyczsgZG8KLSsJTElCUz0iLUwkaSAtbGFpZiAkc2F2ZV9MSUJTIgotKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0rI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rI2luY2x1ZGUgPGFpZi5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0raW50Ci0rbWFpbiAoKQotK3sKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotKyAgbHJlcz0kaTticmVhawotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rZmkKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZG9uZQotK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotK0xJQlM9IiRzYXZlX0xJQlMiCi0rCi0raWYgdGVzdCAiJGlyZXMiIC1hICIkbHJlcyIgLWEgIiR3aXRoX2FpZiIgIT0gIm5vIjsgdGhlbgotKwlhaWZfaW5jbHVkZWRpcj0iJGlyZXMiCi0rCWFpZl9saWJkaXI9IiRscmVzIgotKwlESVJfYWlmPQotKwlJTkNMVURFX2FpZj0iLUkkYWlmX2luY2x1ZGVkaXIiCi0rCUxJQl9haWY9Ii1MJGFpZl9saWJkaXIgLWxhaWYiCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgSEFWRV9BSUYgMQotK19BQ0VPRgotKwotKwl3aXRoX2FpZj15ZXMKLSsJZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogaGVhZGVycyAkaXJlcywgbGlicmFyaWVzICRscmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH1oZWFkZXJzICRpcmVzLCBsaWJyYXJpZXMgJGxyZXMiID4mNgotK2Vsc2UKLSsJRElSX2FpZj0iYWlmIgotKwlJTkNMVURFX2FpZj0KLSsJTElCX2FpZj0KLSsJd2l0aF9haWY9bm8KLSsJZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhfYWlmIiA+JjUKLStlY2hvICIke0VDSE9fVH0kd2l0aF9haWYiID4mNgotK2ZpCi0rCi0rCi0rCi0rCi0raWYgdGVzdCAiJHdpdGhfYWlmIiA9ICJubyI7IHRoZW4KLSsgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFlvdSBtdXN0IGhhdmUgbGliYWlmIHRvIGNvbXBpbGUgdGhpcyB2ZXJzaW9uIG9mIEdEQi4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IFlvdSBtdXN0IGhhdmUgbGliYWlmIHRvIGNvbXBpbGUgdGhpcyB2ZXJzaW9uIG9mIEdEQi4iID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0rZmkKLSsKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotKyNkZWZpbmUgSEFWRV9BSUYgMQotK19BQ0VPRgotKwotIGFjX2F1eF9kaXI9Ci0gZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLjsgZG8KLSAgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi1AQCAtMjA4Myw3ICsyNjU3LDcgQEAKLSAgIGZpCi0gZG9uZQotIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotLSAgeyB7IGVjaG8gIiRhc19tZToyMDg2OiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFxgY2QgJHNyY2Rpcjtwd2RcYC8uLiAkc3JjZGlyL1xgY2QgJHNyY2Rpcjtwd2RcYC8uLiIgPiY1Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXGBjZCAkc3JjZGlyO3B3ZFxgLy4uICRzcmNkaXIvXGBjZCAkc3JjZGlyO3B3ZFxgLy4uIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXGBjZCAkc3JjZGlyO3B3ZFxgLy4uICRzcmNkaXIvXGBjZCAkc3JjZGlyO3B3ZFxgLy4uIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGZpCi1AQCAtMjA5MywxMSArMjY2NywxMSBAQAotIAotICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotLSAgeyB7IGVjaG8gIiRhc19tZToyMDk2OiBlcnJvcjogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgPiY1Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIAotLWVjaG8gIiRhc19tZToyMTAwOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtMjEwNiwyMyArMjY4MCwyNCBAQAotIHRlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKLSAgIGFjX2N2X2J1aWxkX2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYAotIHRlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKLS0gIHsgeyBlY2hvICIkYXNfbWU6MjEwOTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiY1Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBhY19jdl9idWlsZD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzYCB8fAotLSAgeyB7IGVjaG8gIiRhc19tZToyMTEzOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZC4iID4mNQotLWVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhcyBmYWlsZWQuIiA+JjI7fQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAKLSBmaQotLWVjaG8gIiRhc19tZToyMTE4OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfYnVpbGQiID4mNgotIGJ1aWxkPSRhY19jdl9idWlsZAotIGJ1aWxkX2NwdT1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotIGJ1aWxkX3ZlbmRvcj1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotIGJ1aWxkX29zPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0gCi0tZWNobyAiJGFzX21lOjIxMjU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotKwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTIxMzEsMTkgKzI3MDYsMjAgQEAKLSB0ZXN0IC16ICIkYWNfY3ZfaG9zdF9hbGlhcyIgJiYKLSAgIGFjX2N2X2hvc3RfYWxpYXM9JGFjX2N2X2J1aWxkX2FsaWFzCi0gYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgIHx8Ci0tICB7IHsgZWNobyAiJGFzX21lOjIxMzQ6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mNQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXMgZmFpbGVkIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gCi0gZmkKLS1lY2hvICIkYXNfbWU6MjEzOTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjYKLSBob3N0PSRhY19jdl9ob3N0Ci0gaG9zdF9jcHU9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotIGhvc3RfdmVuZG9yPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLSBob3N0X29zPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLSAKLS1lY2hvICIkYXNfbWU6MjE0NjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3RhcmdldCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC0yMTUyLDE4ICsyNzI4LDE5IEBACi0gdGVzdCAieCRhY19jdl90YXJnZXRfYWxpYXMiID0gIngiICYmCi0gICBhY19jdl90YXJnZXRfYWxpYXM9JGFjX2N2X2hvc3RfYWxpYXMKLSBhY19jdl90YXJnZXQ9YCRhY19jb25maWdfc3ViICRhY19jdl90YXJnZXRfYWxpYXNgIHx8Ci0tICB7IHsgZWNobyAiJGFzX21lOjIxNTU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzIGZhaWxlZCIgPiY1Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzIGZhaWxlZCIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X3RhcmdldF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gCi0gZmkKLS1lY2hvICIkYXNfbWU6MjE2MDogcmVzdWx0OiAkYWNfY3ZfdGFyZ2V0IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdGFyZ2V0IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdGFyZ2V0IiA+JjYKLSB0YXJnZXQ9JGFjX2N2X3RhcmdldAotIHRhcmdldF9jcHU9YGVjaG8gJGFjX2N2X3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0gdGFyZ2V0X3ZlbmRvcj1gZWNobyAkYWNfY3ZfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLSB0YXJnZXRfb3M9YGVjaG8gJGFjX2N2X3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0gCi0rCi0gIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotICMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLSB0ZXN0IC1uICIkdGFyZ2V0X2FsaWFzIiAmJgotQEAgLTIxNzIsMTYgKzI3NDksMTYgQEAKLSAgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLSAKLSBBTExfTElOR1VBUz0KLS1lY2hvICIkYXNfbWU6MjE3NTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfS4uLiAkRUNIT19DIiA+JjYKLSBzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3ksLi8rLSxfX3BfLCdgCi0gaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxFT0YKLSsgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLSBhbGw6Ci0gCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi0tRU9GCi0rX0FDRU9GCi0gIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi0gZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotIGlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLUBAIC0yMTkyLDExICsyNzY5LDExIEBACi0gcm0gLWYgY29uZnRlc3QubWFrZQotIGZpCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZToyMTk1OiByZXN1bHQ6IHllcyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotIGVjaG8gIiR7RUNIT19UfXllcyIgPiY2Ci0gICBTRVRfTUFLRT0KLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MjE5OTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotICAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotIGZpCi1AQCAtMjIwNCw3ICsyNzgxLDcgQEAKLSBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6MjIwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTIyMTIsMjUgKzI3ODksMjggQEAKLSAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLS1lY2hvICIkYXNfbWU6MjIyMjogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCi0gaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZToyMjMwOiByZXN1bHQ6ICRSQU5MSUIiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjIyMzM6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTIyMzksNyArMjgxOSw3IEBACi0gICBhY19jdF9SQU5MSUI9JFJBTkxJQgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6MjI0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTIyNDcsMTUgKzI4MjcsMTggQEAKLSAgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0tZWNobyAiJGFzX21lOjIyNTc6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQotLWJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIiICYmIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSI6IgotQEAgLTIyNjMsMTAgKzI4NDYsMTAgQEAKLSBmaQotIGFjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKLSBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjIyNjY6IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MjI2OTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtMjI3NSwxMyArMjg1OCwxMyBAQAotICAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi0gZmkKLSAKLS1lY2hvICIkYXNfbWU6MjI3ODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDIyODQgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdGRhcmcuaD4KLUBAIC0yMjg5LDEzICsyODcyLDEzIEBACi0gI2luY2x1ZGUgPGZsb2F0Lmg+Ci0gCi0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjI5MjogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLSAgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLSAgIGFjX3N0YXR1cz0kPwotICAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICAgcm0gLWYgY29uZnRlc3QuZXIxCi0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotLSAgZWNobyAiJGFzX21lOjIyOTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotQEAgLTIzMTcsNyArMjkwMCw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDIzMjAgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0cmluZy5oPgotIAotQEAgLTIzMzUsNyArMjkxOCw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDIzMzggImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotIAotQEAgLTIzNTYsNyArMjkzOSw3IEBACi0gICA6Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMjM1OSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Y3R5cGUuaD4KLSAjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi1AQCAtMjM4MiwzOCArMjk2NSwzOSBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToyMzg1OiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToyMzg4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjIzOTA6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjM5MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgOgotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0gYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLSBmaQotIHJtIC1mIGNvcmUgY29yZS4qICouY29yZSBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSBmaQotIGZpCi0tZWNobyAiJGFzX21lOjI0MDY6IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBTVERDX0hFQURFUlMgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjI0MTY6IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtMjQyMSw3ICszMDA1LDcgQEAKLSAgIGFjX2N2X3Byb2dfY2Nfc3RkYz1ubwotIGFjX3NhdmVfQ0M9JENDCi0gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMjQyNCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkYXJnLmg+Ci0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtMjQ1MSw2ICszMDM1LDEyIEBACi0gaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci0gaW50IGFyZ2M7Ci0gY2hhciAqKmFyZ3Y7Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTI0NzAsMTYgKzMwNjAsMTYgQEAKLSBkbwotICAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCi0gICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjQ3MzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjQ3NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZToyNDc5OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjI0ODI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfYXJnCi0gYnJlYWsKLUBAIC0yNDk2LDIzICszMDg2LDI5IEBACi0gCi0gY2FzZSAieCRhY19jdl9wcm9nX2NjX3N0ZGMiIGluCi0gICB4fHhubykKLS0gICAgZWNobyAiJGFzX21lOjI0OTk6IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNiA7OwotICAgKikKLS0gICAgZWNobyAiJGFzX21lOjI1MDI6IHJlc3VsdDogJGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNgotICAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX3N0ZGMiIDs7Ci0gZXNhYwotIAotLWVjaG8gIiRhc19tZToyNTA3OiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfY19jb25zdCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAyNTEzICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0yNTY4LDE2ICszMTY0LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToyNTcxOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToyNTc0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjI1Nzc6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjU4MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfY19jb25zdD15ZXMKLSBlbHNlCi1AQCAtMjU4NywxNyArMzE4MywxNyBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6MjU5MDogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBjb25zdAotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjI2MDA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9jX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC0yNjA1LDcgKzMyMDEsNyBAQAotICAgYWNfY3ZfY19pbmxpbmU9bm8KLSBmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAyNjA4ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpZm5kZWYgX19jcGx1c3BsdXMKLSBzdGF0aWMgJGFjX2t3IGludCBzdGF0aWNfZm9vICgpIHtyZXR1cm4gMDsgfQotQEAgLTI2MTQsMTYgKzMyMTAsMTYgQEAKLSAKLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjYxNzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjYyMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZToyNjIzOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjI2MjY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLSBlbHNlCi1AQCAtMjYzNCw0OSArMzIzMCw1OCBAQAotIGRvbmUKLSAKLSBmaQotLWVjaG8gIiRhc19tZToyNjM3OiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19pbmxpbmUiID4mNgotIGNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gICBpbmxpbmUgfCB5ZXMpIDs7Ci0gICBubykKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBpbmxpbmUKLS1FT0YKLStfQUNFT0YKLSAgOzsKLS0gICopICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICAqKSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotLUVPRgotK19BQ0VPRgotICA7OwotIGVzYWMKLSAKLSAjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgotIAotKwotKwotKwotKwotKwotKwotKwotKwotIGZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotICAgICAgICAgICAgICAgICAgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLSBkbwotIGFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotLWVjaG8gIiRhc19tZToyNjU4OiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgotIGlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMjY2NCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAkYWNfaW5jbHVkZXNfZGVmYXVsdAotKwotICNpbmNsdWRlIDwkYWNfaGVhZGVyPgotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZToyNjcwOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToyNjczOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjI2NzY6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjY3OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCi0gZWxzZQotQEAgLTI2ODYsMjUgKzMyOTEsMzMgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjI2ODk6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLSBlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2Ci0gaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSsKLSBkb25lCi0gCi0tZWNobyAiJGFzX21lOjI2OTk6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2ZmX3QuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl90eXBlX29mZl90K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDI3MDUgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtMjcxNywxNiArMzMzMCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjcyMDogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjcyMzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZToyNzI2OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjI3Mjk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi0gZWxzZQotQEAgLTI3MzYsMjcgKzMzNDksMzMgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjI3Mzk6IHJlc3VsdDogJGFjX2N2X3R5cGVfb2ZmX3QiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX29mZl90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9vZmZfdCIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IHllczsgdGhlbgotICAgOgotIGVsc2UKLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgb2ZmX3QgbG9uZwotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjI3NTE6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaXplX3QuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl90eXBlX3NpemVfdCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAyNzU3ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTI3NjksMTYgKzMzODgsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjI3NzI6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjI3NzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6Mjc3ODogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToyNzgxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl90eXBlX3NpemVfdD15ZXMKLSBlbHNlCi1AQCAtMjc4OCwyOSArMzQwNywzNSBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6Mjc5MTogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpemVfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjYKLSBpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IHllczsgdGhlbgotICAgOgotIGVsc2UKLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLSAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotICMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi0tZWNobyAiJGFzX21lOjI4MDU6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl93b3JraW5nX2FsbG9jYV9oK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDI4MTEgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFsbG9jYS5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0yODIwLDE2ICszNDQ1LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjgyMzogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjgyNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjI4Mjk6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MjgzMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3Zfd29ya2luZ19hbGxvY2FfaD15ZXMKLSBlbHNlCi1AQCAtMjgzOSwyMyArMzQ2NCwyMyBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjI4NDI6IHJlc3VsdDogJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2giID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3Zfd29ya2luZ19hbGxvY2FfaCIgPiY2Ci0gaWYgdGVzdCAkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjI4NTI6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhbGxvY2EuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9mdW5jX2FsbG9jYV93b3JrcytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAyODU4ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpZmRlZiBfX0dOVUNfXwotICMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi1AQCAtMjg3OCw2ICszNTAzLDEyIEBACi0gIyBlbmRpZgotICNlbmRpZgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0yODg3LDE2ICszNTE4LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Mjg5MDogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Mjg5MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjI4OTY6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Mjg5OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi0gZWxzZQotQEAgLTI5MDYsMTQgKzM1MzcsMTQgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZToyOTA5OiByZXN1bHQ6ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiID4mNgotIAotIGlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9BTExPQ0EgMQotLUVPRgotK19BQ0VPRgotIAotIGVsc2UKLSAgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi1AQCAtMjkyMywxNyArMzU1NCwxOCBAQAotIAotIEFMTE9DQT1hbGxvY2EuJGFjX29iamV4dAotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIENfQUxMT0NBIDEKLS1FT0YKLStfQUNFT0YKLSAKLS1lY2hvICIkYXNfbWU6MjkzMDogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X29zX2NyYXkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMjkzNiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi0gd2ViZWNyYXkKLUBAIC0yOTUxLDE4ICszNTgzLDE4IEBACi0gcm0gLWYgY29uZnRlc3QqCi0gCi0gZmkKLS1lY2hvICIkYXNfbWU6Mjk1NDogcmVzdWx0OiAkYWNfY3Zfb3NfY3JheSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29zX2NyYXkiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9vc19jcmF5IiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi0gICBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gICAgIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi0tZWNobyAiJGFzX21lOjI5NTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAyOTY1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuICAqLwotQEAgLTI5NzYsNiArMzYwOCwxMiBAQAotIGNoYXIgJGFjX2Z1bmMgKCk7Ci0gY2hhciAoKmYpICgpOwotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0yOTkzLDE2ICszNjMxLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Mjk5NjogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Mjk5OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjMwMDI6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzAwNTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTMwMTIsMTMgKzM2NTAsMTMgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTozMDE1OiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgotIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLS1FT0YKLStfQUNFT0YKLSAKLSAgICAgYnJlYWsKLSBmaQotQEAgLTMwMjYsNyArMzY2NCw3IEBACi0gICBkb25lCi0gZmkKLSAKLS1lY2hvICIkYXNfbWU6MzAyOTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYS4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTMwMzUsNyArMzY3Myw3IEBACi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMzAzOCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSBpbnQKLSBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotQEAgLTMwNTgsNTUgKzM2OTYsOTcgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzA2MTogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzA2NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTozMDY2OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjMwNjk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLSBlbHNlCi0gICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rKCBleGl0ICRhY19zdGF0dXMgKQotIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi0gZmkKLSBybSAtZiBjb3JlIGNvcmUuKiAqLmNvcmUgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gZmkKLS1lY2hvICIkYXNfbWU6MzA4MTogcmVzdWx0OiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjYKLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotLUVPRgotK19BQ0VPRgotKwotIAotIGZpCi0gCi0rCi0rCi0gZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaCB1bmlzdGQuaAotIGRvCi0gYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi0tZWNobyAiJGFzX21lOjMwOTM6IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStmaQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLStlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2Ci0gZWxzZQotLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMzA5OSAiY29uZmlndXJlIgotKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSsjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSsgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0rICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSthY19oZWFkZXJfY29tcGlsZXI9bm8KLStmaQotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgotKwotKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDwkYWNfaGVhZGVyPgotIF9BQ0VPRgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjMxMDM6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCi0gICBhY19zdGF0dXM9JD8KLSAgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLS0gIGVjaG8gIiRhc19tZTozMTA5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KLSAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKLUBAIC0zMTE3LDM0ICszNzk3LDYyIEBACi0gICBhY19jcHBfZXJyPXllcwotIGZpCi0gaWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCi0tICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIGV2YWwgIiRhc19hY19IZWFkZXI9bm8iCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYyBpbgotKyAgeWVzOm5vICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotKyAgbm86eWVzICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9OzsKLStlc2FjCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgotK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj0kYWNfaGVhZGVyX3ByZXByb2MiCi0gZmkKLS1lY2hvICIkYXNfbWU6MzEyODogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKLSsKLStmaQotIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0rCi0gZG9uZQotIAotKwotIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi0gZG8KLSBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotLWVjaG8gIiRhc19tZTozMTQxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotIGlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMzE0NyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LiAgKi8KLUBAIC0zMTU4LDYgKzM4NjYsMTIgQEAKLSBjaGFyICRhY19mdW5jICgpOwotIGNoYXIgKCpmKSAoKTsKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtMzE3NSwxNiArMzg4OSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjMxNzg6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjMxODE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTozMTg0OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjMxODc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLUBAIC0zMTk0LDE3ICszOTA4LDE3IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6MzE5NzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKLSBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSBkb25lCi0gCi0tZWNobyAiJGFzX21lOjMyMDc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTMyMTMsOSArMzkyNywxMiBAQAotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDMyMTYgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsvKiBtYWxsb2MgbWlnaHQgaGF2ZSBiZWVuIHJlbmFtZWQgYXMgcnBsX21hbGxvYy4gKi8KLSsjdW5kZWYgbWFsbG9jCi0rCi0gLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0gCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLUBAIC0zMjMxLDcgKzM5NDgsNyBAQAotICAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBidWZmZXIgY2FjaGUKLSAgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0tICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0rICAgcHJvcGFnYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0gCi0gICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci1AQCAtMzM0MCw5NyArNDA1NywxODMgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzM0MzogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzM0NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTozMzQ4OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjMzNTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotKyggZXhpdCAkYWNfc3RhdHVzICkKLSBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0gZmkKLSBybSAtZiBjb3JlIGNvcmUuKiAqLmNvcmUgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gZmkKLS1lY2hvICIkYXNfbWU6MzM2MzogcmVzdWx0OiAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9NTUFQIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0Lm1tYXAKLSAKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSBmb3IgYWNfaGVhZGVyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLSB1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotIGRvCi0gYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi0tZWNobyAiJGFzX21lOjMzNzg6IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStmaQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLStlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2Ci0gZWxzZQotLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMzM4NCAiY29uZmlndXJlIgotKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotICNpbmNsdWRlIDwkYWNfaGVhZGVyPgotIF9BQ0VPRgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjMzODg6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLS0gIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0tICBybSAtZiBjb25mdGVzdC5lcjEKLS0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0tICBlY2hvICIkYXNfbWU6MzM5NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0tICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCi0tICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotLSAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCi0tICBlbHNlCi0tICAgIGFjX2NwcF9lcnI9Ci0tICBmaQotLWVsc2UKLS0gIGFjX2NwcF9lcnI9eWVzCi0tZmkKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0rICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSthY19oZWFkZXJfY29tcGlsZXI9bm8KLStmaQotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgotKwotKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgotK19BQ0VPRgotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLSsgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSsgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotKyAgZWxzZQotKyAgICBhY19jcHBfZXJyPQotKyAgZmkKLStlbHNlCi0rICBhY19jcHBfZXJyPXllcwotK2ZpCi0gaWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCi0tICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIGV2YWwgIiRhc19hY19IZWFkZXI9bm8iCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYyBpbgotKyAgeWVzOm5vICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotKyAgbm86eWVzICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9OzsKLStlc2FjCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgotK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj0kYWNfaGVhZGVyX3ByZXByb2MiCi0gZmkKLS1lY2hvICIkYXNfbWU6MzQxMzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKLSsKLStmaQotIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0rCi0gZG9uZQotIAotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotIF9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci0gZG8KLSBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotLWVjaG8gIiRhc19tZTozNDI3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotIGlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMzQzMyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LiAgKi8KLUBAIC0zNDQ0LDYgKzQyNDcsMTIgQEAKLSBjaGFyICRhY19mdW5jICgpOwotIGNoYXIgKCpmKSAoKTsKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtMzQ2MSwxNiArNDI3MCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjM0NjQ6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjM0Njc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTozNDcwOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjM0NzM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLUBAIC0zNDgwLDI4ICs0Mjg5LDI5IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6MzQ4MzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKLSBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSBkb25lCi0gCi0rCi0gICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotIAotIGZvciBhY19mdW5jIGluIHN0cGNweQotIGRvCi0gYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLS1lY2hvICIkYXNfbWU6MzQ5ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLSBpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDM1MDQgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4gICovCi1AQCAtMzUxNSw2ICs0MzI1LDEyIEBACi0gY2hhciAkYWNfZnVuYyAoKTsKLSBjaGFyICgqZikgKCk7Ci0gCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTM1MzIsMTYgKzQzNDgsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTozNTM1OiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTozNTM4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzU0MTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTozNTQ0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBldmFsICIkYXNfYWNfdmFyPXllcyIKLSBlbHNlCi1AQCAtMzU1MSwxMiArNDM2NywxMiBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjM1NTQ6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLSBlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2Ci0gaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gZG9uZQotQEAgLTM1NjQsMjIgKzQzODAsMjggQEAKLSAgICBmaQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFBDUFkgMQotLUVPRgotK19BQ0VPRgotIAotICAgIGZpCi0gCi0gICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0tICAgIGVjaG8gIiRhc19tZTozNTc0OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FtX2N2X3ZhbF9MQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAzNTgwICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsb2NhbGUuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtMzU4OSwxNiArNDQxMSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjM1OTI6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjM1OTU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTozNTk4OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjM2MDE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLSBlbHNlCi1AQCAtMzYwOCwxNyArNDQzMCwxNyBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjM2MTE6IHJlc3VsdDogJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgPiY2Ci0gICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotLUVPRgotK19BQ0VPRgotIAotICAgICBmaQotICAgZmkKLS0gICBlY2hvICIkYXNfbWU6MzYyMTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSsgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZC4uLiAkRUNIT19DIiA+JjYKLSAgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi1AQCAtMzYyNywxOCArNDQ0OSwxOSBAQAotIGVsc2UKLSAgIFVTRV9OTFM9eWVzCi0gZmk7Ci0tICAgIGVjaG8gIiRhc19tZTozNjMwOiByZXN1bHQ6ICRVU0VfTkxTIiA+JjUKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFVTRV9OTFMiID4mNQotIGVjaG8gIiR7RUNIT19UfSRVU0VfTkxTIiA+JjYKLSAKLSsKLSAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLSAKLSAgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgRU5BQkxFX05MUyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0tICAgICAgZWNobyAiJGFzX21lOjM2NDE6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQuLi4gJEVDSE9fQyIgPiY2Ci0gCi0gIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLUBAIC0zNjQ4LDcgKzQ0NzEsNyBAQAotIGVsc2UKLSAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLSBmaTsKLS0gICAgICBlY2hvICIkYXNfbWU6MzY1MTogcmVzdWx0OiAkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgPiY1Ci0rICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiA+JjYKLSAKLSAgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLUBAIC0zNjU3LDIzICs0NDgwLDYxIEBACi0gCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0gCUNBVE9CSkVYVD1OT05FCi0gCi0tCWVjaG8gIiRhc19tZTozNjYwOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLSsJaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbGliaW50bF9oK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGliaW50bC5oLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2xpYmludGxfaCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStmaQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfbGliaW50bF9oIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2xpYmludGxfaCIgPiY2Ci0gZWxzZQotLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgMzY2NiAiY29uZmlndXJlIgotKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGxpYmludGwuaCB1c2FiaWxpdHkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgbGliaW50bC5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0rI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsjaW5jbHVkZSA8bGliaW50bC5oPgotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSsgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0rICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSthY19oZWFkZXJfY29tcGlsZXI9bm8KLStmaQotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgotKwotKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBsaWJpbnRsLmggcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgbGliaW50bC5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bGliaW50bC5oPgotIF9BQ0VPRgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjM2NzA6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCi0gICBhY19zdGF0dXM9JD8KLSAgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLS0gIGVjaG8gIiRhc19tZTozNjc2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KLSAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKLUBAIC0zNjg0LDI2ICs0NTQ1LDU4IEBACi0gICBhY19jcHBfZXJyPXllcwotIGZpCi0gaWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCi0tICBhY19jdl9oZWFkZXJfbGliaW50bF9oPXllcwotKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgYWNfY3ZfaGVhZGVyX2xpYmludGxfaD1ubwotKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNgotKwotKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2MgaW4KLSsgIHllczpubyApCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGxpYmludGwuaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiBsaWJpbnRsLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGxpYmludGwuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogbGliaW50bC5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotKyAgbm86eWVzICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGliaW50bC5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogbGliaW50bC5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGxpYmludGwuaDogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxpYmludGwuaDogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBsaWJpbnRsLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxpYmludGwuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9OzsKLStlc2FjCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaC4uLiAkRUNIT19DIiA+JjYKLStpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9saWJpbnRsX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgYWNfY3ZfaGVhZGVyX2xpYmludGxfaD0kYWNfaGVhZGVyX3ByZXByb2MKLSBmaQotLWVjaG8gIiRhc19tZTozNjk1OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfbGliaW50bF9oIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2xpYmludGxfaCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9saWJpbnRsX2giID4mNgotKwotK2ZpCi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xpYmludGxfaCA9IHllczsgdGhlbgotLSAgZWNobyAiJGFzX21lOjM2OTg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDM3MDQgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpYmludGwuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtMzcxMywxNiArNDYwNiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjM3MTY6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjM3MTk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTozNzIyOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjM3MjU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotIGVsc2UKLUBAIC0zNzMyLDExICs0NjI1LDExIEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6MzczNTogcmVzdWx0OiAkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA+JjYKLSAKLSAJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotLQkgICAgIGVjaG8gIiRhc19tZTozNzM5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLSsJICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfbGliX2ludGxfYmluZHRleHRkb21haW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtMzc0NCw3ICs0NjM3LDcgQEAKLSAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLSBMSUJTPSItbGludGwgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDM3NDcgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC0zNzU0LDYgKzQ2NDcsMTIgQEAKLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSBjaGFyIGJpbmR0ZXh0ZG9tYWluICgpOwotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0zNzYzLDE2ICs0NjYyLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Mzc2NjogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Mzc2OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjM3NzI6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Mzc3NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfbGliX2ludGxfYmluZHRleHRkb21haW49eWVzCi0gZWxzZQotQEAgLTM3ODMsMTggKzQ2ODIsMjQgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0tZWNobyAiJGFzX21lOjM3ODY6IHJlc3VsdDogJGFjX2N2X2xpYl9pbnRsX2JpbmR0ZXh0ZG9tYWluIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2ludGxfYmluZHRleHRkb21haW4iID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfaW50bF9iaW5kdGV4dGRvbWFpbiIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfbGliX2ludGxfYmluZHRleHRkb21haW4gPSB5ZXM7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTozNzg5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAzNzk1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0zODA0LDE2ICs0NzA5LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzgwNzogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzgxMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjM4MTM6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzgxNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi0gZWxzZQotQEAgLTM4MjMsNyArNDcyOCw3IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6MzgyNjogcmVzdWx0OiAkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA+JjYKLSBmaQotIAotQEAgLTM4MzIsMTMgKzQ3MzcsMTMgQEAKLSAJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLSAJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6Mzg0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVNHRk1UK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTM4NjUsMTAgKzQ3NzAsMTAgQEAKLSBmaQotIE1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotIGlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6Mzg2ODogcmVzdWx0OiAkTVNHRk1UIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNU0dGTVQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRNU0dGTVQiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTozODcxOiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotQEAgLTM4NzYsMTMgKzQ3ODEsMTMgQEAKLSBmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLSBkbwotIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi0tZWNobyAiJGFzX21lOjM4Nzk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAzODg1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuICAqLwotQEAgLTM4OTYsNiArNDgwMSwxMiBAQAotIGNoYXIgJGFjX2Z1bmMgKCk7Ci0gY2hhciAoKmYpICgpOwotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC0zOTEzLDE2ICs0ODI0LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzkxNjogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzkxOTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjM5MjI6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6MzkyNTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTM5MzIsMTkgKzQ4NDMsMTkgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTozOTM1OiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgotIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIGRvbmUKLSAKLSAJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6Mzk0NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR01TR0ZNVCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC0zOTU0LDE2ICs0ODY1LDE4IEBACi0gICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgIDs7Ci0gICAqKQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIjsgdGhlbgotLSAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLS0gICBlY2hvICIkYXNfbWU6Mzk2NDogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tICAgYnJlYWsKLS1maQotKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSAgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLUBAIC0zOTczLDE2ICs0ODg2LDE2IEBACi0gR01TR0ZNVD0kYWNfY3ZfcGF0aF9HTVNHRk1UCi0gCi0gaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6Mzk3NjogcmVzdWx0OiAkR01TR0ZNVCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkR01TR0ZNVCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JEdNU0dGTVQiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTozOTc5OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLSAJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZTozOTg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00MDA5LDE3ICs0OTIyLDIzIEBACi0gZmkKLSBYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi0gaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjQwMTI6IHJlc3VsdDogJFhHRVRURVhUIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRYR0VUVEVYVCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JFhHRVRURVhUIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6NDAxNTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi0gCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA0MDIwICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC00MDMwLDE2ICs0OTQ5LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDAzMzogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NDAzNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjQwMzk6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NDA0MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgQ0FUT0JKRVhUPS5nbW8KLSAJCSAgIERBVEFESVJOQU1FPXNoYXJlCi1AQCAtNDA1Niw2ICs0OTc1LDkgQEAKLSAKLSBmaQotIAotKwotKwotKwotICAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLSAJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICAgZmkKLUBAIC00MDY1LDcgKzQ5ODcsNyBAQAotICAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDA2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVNHRk1UK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTQwOTIsMTYgKzUwMTQsMTYgQEAKLSBmaQotIE1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotIGlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NDA5NTogcmVzdWx0OiAkTVNHRk1UIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNU0dGTVQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRNU0dGTVQiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo0MDk4OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLSAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDEwNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR01TR0ZNVCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00MTExLDE2ICs1MDMzLDE4IEBACi0gICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgIDs7Ci0gICAqKQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIjsgdGhlbgotLSAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLS0gICBlY2hvICIkYXNfbWU6NDEyMTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tICAgYnJlYWsKLS1maQotKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSAgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLUBAIC00MTMwLDE2ICs1MDU0LDE2IEBACi0gR01TR0ZNVD0kYWNfY3ZfcGF0aF9HTVNHRk1UCi0gCi0gaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NDEzMzogcmVzdWx0OiAkR01TR0ZNVCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkR01TR0ZNVCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JEdNU0dGTVQiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo0MTM2OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLSAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZTo0MTQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00MTY2LDEzICs1MDkwLDE0IEBACi0gZmkKLSBYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi0gaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjQxNjk6IHJlc3VsdDogJFhHRVRURVhUIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRYR0VUVEVYVCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JFhHRVRURVhUIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6NDE3MjogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi0rCi0gCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgIElOU1RPQkpFWFQ9Lm1vCi1AQCAtNDE4OCw3ICs1MTEzLDcgQEAKLSAJCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0gCSAgOiA7Ci0gCWVsc2UKLS0JICBlY2hvICIkYXNfbWU6NDE5MTogcmVzdWx0OiBmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiID4mNQotKwkgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9Zm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiA+JjYKLSAJICBYR0VUVEVYVD0iOiIKLSAJZmkKLUBAIC00MjE0LDExICs1MTM5LDI0IEBACi0gICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgIGRvbmUKLSAKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSAgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgICBMSU5HVUFTPQotICAgICAgZWxzZQotLSAgICAgICBlY2hvICIkYXNfbWU6NDIyMTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0rICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQuLi4gJEVDSE9fQyIgPiY2Ci0gICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLUBAIC00MjI3LDcgKzUxNjUsNyBAQAotICAgICAgICAgIGVzYWMKLSAgICAgICAgZG9uZQotICAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotLSAgICAgICBlY2hvICIkYXNfbWU6NDIzMDogcmVzdWx0OiAkTElOR1VBUyIgPiY1Ci0rICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMSU5HVUFTIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kTElOR1VBUyIgPiY2Ci0gICAgICBmaQotIAotQEAgLTQyNDMsMjUgKzUxODEsNjQgQEAKLSAvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICAgZmkKLSAKLSsKLSAgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0tCSBlY2hvICIkYXNfbWU6NDI0ODogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci0rCSBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9saW51eF92ZXJzaW9uX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmguLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbGludXhfdmVyc2lvbl9oK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2ZpCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9saW51eF92ZXJzaW9uX2giID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfbGludXhfdmVyc2lvbl9oIiA+JjYKLSBlbHNlCi0tICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA0MjU0ICJjb25maWd1cmUiCi0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbGludXgvdmVyc2lvbi5oIHVzYWJpbGl0eSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBsaW51eC92ZXJzaW9uLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSsjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIChldmFsICRhY190cnkpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2FjX2hlYWRlcl9jb21waWxlcj1ubwotK2ZpCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Ci0rCi0rIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGxpbnV4L3ZlcnNpb24uaCBwcmVzZW5jZSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBsaW51eC92ZXJzaW9uLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDI1ODogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLSAgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLSAgIGFjX3N0YXR1cz0kPwotICAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICAgcm0gLWYgY29uZnRlc3QuZXIxCi0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotLSAgZWNobyAiJGFzX21lOjQyNjQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotQEAgLTQyNzIsMjIgKzUyNDksNTAgQEAKLSAgIGFjX2NwcF9lcnI9eWVzCi0gZmkKLSBpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KLS0gIGFjX2N2X2hlYWRlcl9saW51eF92ZXJzaW9uX2g9eWVzCi0rICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSBlbHNlCi0gICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBhY19jdl9oZWFkZXJfbGludXhfdmVyc2lvbl9oPW5vCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYyBpbgotKyAgeWVzOm5vICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGludXgvdmVyc2lvbi5oOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxpbnV4L3ZlcnNpb24uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGludXgvdmVyc2lvbi5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiBsaW51eC92ZXJzaW9uLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fTs7Ci0rICBubzp5ZXMgKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBsaW51eC92ZXJzaW9uLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiBsaW51eC92ZXJzaW9uLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGludXgvdmVyc2lvbi5oOiBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogbGludXgvdmVyc2lvbi5oOiBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGxpbnV4L3ZlcnNpb24uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogbGludXgvdmVyc2lvbi5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotK2VzYWMKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oLi4uICRFQ0hPX0MiID4mNgotK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2xpbnV4X3ZlcnNpb25faCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBhY19jdl9oZWFkZXJfbGludXhfdmVyc2lvbl9oPSRhY19oZWFkZXJfcHJlcHJvYwotIGZpCi0tZWNobyAiJGFzX21lOjQyODM6IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9saW51eF92ZXJzaW9uX2giID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfbGludXhfdmVyc2lvbl9oIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2xpbnV4X3ZlcnNpb25faCIgPiY2Ci0rCi0rZmkKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbGludXhfdmVyc2lvbl9oID0geWVzOyB0aGVuCi0gICBtc2dmb3JtYXQ9bGludXgKLSBlbHNlCi0gICBtc2dmb3JtYXQ9eG9wZW4KLSBmaQotIAotKwotKwotIAkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgICBmaQotICAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotQEAgLTQzMDIsMTAgKzUzMDcsMTQgQEAKLSAgICAgIEdUX1lFUz0iI1lFUyMiCi0gICAgZmkKLSAKLSsKLSsKLSAgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gCi0rCi0gICAgICAgbD0KLSAKLSsKLSAgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8vUE9URklMRVMuaW47IHRoZW4KLSAgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLUBAIC00MzIyLDkgKzUzMzEsMTIgQEAKLSAJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICAgZmkKLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKwotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBQQUNLQUdFICJnZGIiCi0tRU9GCi0rX0FDRU9GCi0rCi0rCi0gCi0gQ09ORklHX09CUz0KLSBDT05GSUdfTElCX09CUz0KLUBAIC00MzQ1LDcgKzUzNTcsNyBAQAotICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICAgICB5ZXMgKSBlbmFibGVfbXVsdGlfaWNlPSJ5ZXMiIDs7Ci0gICAgIG5vKSAgZW5hYmxlX211bHRpX2ljZT0ibm8iIDs7Ci0tICAgICopIHsgeyBlY2hvICIkYXNfbWU6NDM0ODogZXJyb3I6IEJhZCB2YWx1ZSBmb3IgLS1lbmFibGUtbXVsdGktaWNlOiAke2VuYWJsZXZhbH0iID4mNQotKyAgICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBCYWQgdmFsdWUgZm9yIC0tZW5hYmxlLW11bHRpLWljZTogJHtlbmFibGV2YWx9IiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBCYWQgdmFsdWUgZm9yIC0tZW5hYmxlLW11bHRpLWljZTogJHtlbmFibGV2YWx9IiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OwotICAgZXNhYwotQEAgLTQzNTYsMTAgKzUzNjgsMTMgQEAKLSAgIGNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gbXVsdGktaWNlIgotIGZpCi0gCi0rCi0gLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLSAKLSAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0gCi0rCi0rCi0gdGFyZz0ke3RhcmdldH0KLSAuICR7c3JjZGlyfS8uLi9iZmQvY29uZmlnLmJmZAotIAotQEAgLTQzNjcsMjMgKzUzODIsMjMgQEAKLSAKLSBpZiB0ZXN0IHgiJHt0YXJnX2FyY2hzfSIgIT0geCA7IHRoZW4KLSAgICAgdGFyZ19hcmNoc19jPWBlY2hvICR7dGFyZ19hcmNoc30gfCBzZWQgLWUgJ3MvXiAgKi8vZycgLWUgJ3MvICAqJC8vJyAtZSAncy8gICovLCAvZycgLWUgJ3MvLC4qLy8nYAotLSAgICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIERFRkFVTFRfQkZEX0FSQ0ggJHt0YXJnX2FyY2hzX2N9Ci0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSBpZiB0ZXN0IHgiJHt0YXJnX2RlZnZlY30iICE9IHggOyB0aGVuCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgREVGQVVMVF9CRkRfVkVDICR7dGFyZ19kZWZ2ZWN9Ci0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLS1mb3IgYWNfcHJvZyBpbiBtYXdrIGdhd2sgbmF3ayBhd2sKLStmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLSBkbwotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi0tZWNobyAiJGFzX21lOjQzODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9wcm9nX0FXSytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00MzkxLDI1ICs1NDA2LDI4IEBACi0gICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0tZWNobyAiJGFzX21lOjQ0MDE6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQotLWJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBmaQotIGZpCi0gQVdLPSRhY19jdl9wcm9nX0FXSwotIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NDQwOTogcmVzdWx0OiAkQVdLIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotIGVjaG8gIiR7RUNIT19UfSRBV0siID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo0NDEyOiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLUBAIC00NDI4LDQzICs1NDQ2LDQ4IEBACi0gIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0gIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotICMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotLWVjaG8gIiRhc19tZTo0NDMxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLS1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLSBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICAgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0tICAgIElGUz0kYWNfc2F2ZV9JRlMKLS0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0tICAgIGNhc2UgJGFjX2Rpci8gaW4KLS0gICAgLyB8IC4vIHwgLi8vIHwgL2NDLyogXAotLSAgICB8IC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIFwKLS0gICAgfCAvdXNyL3VjYi8qICkgOzsKLS0gICAgKikKLS0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotLSAgICAgICMgYnkgZGVmYXVsdC4KLS0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0tICAgICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0tICAgICAgICAgICAgZ3JlcCBkc3Btc2cgIiRhY19kaXIvJGFjX3Byb2ciID4vZGV2L251bGwgMj4mMTsgdGhlbgotLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotLQkgICAgOgotLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLS0JICAgIGdyZXAgcHdwbHVzICIkYWNfZGlyLyRhY19wcm9nIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLS0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotLQkgICAgOgotLQkgIGVsc2UKLS0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLS0JICAgIGJyZWFrIDIKLS0JICBmaQotLQlmaQotKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotK2Nhc2UgJGFzX2Rpci8gaW4KLSsgIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0rICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSsgIC91c3IvdWNiLyogKSA7OwotKyAgKikKLSsgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSsgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0rICAgICMgYnkgZGVmYXVsdC4KLSsgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgICAgICAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSsgICAgICAgICAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICAgICAgICAgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotKyAgICAgICAgICAgIDoKLSsgICAgICAgICAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotKyAgICAgICAgICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgICAgICAgICAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLSsgICAgICAgICAgICA6Ci0rICAgICAgICAgIGVsc2UKLSsgICAgICAgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0rICAgICAgICAgICAgYnJlYWsgMwotKyAgICAgICAgICBmaQotKyAgICAgICAgZmkKLSAgICAgICBkb25lCi0tICAgICAgOzsKLS0gICAgZXNhYwotLSAgZG9uZQotKyAgICBkb25lCi0rICAgIDs7Ci0rZXNhYwotK2RvbmUKLSsKLSAKLSBmaQotICAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLUBAIC00NDc3LDcgKzU1MDAsNyBAQAotICAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gICBmaQotIGZpCi0tZWNobyAiJGFzX21lOjQ0ODA6IHJlc3VsdDogJElOU1RBTEwiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2Ci0gCi0gIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotQEAgLTQ0OTEsNyArNTUxNCw3IEBACi0gaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZTo0NDk0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BUitzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00NDk5LDI1ICs1NTIyLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotLWVjaG8gIiRhc19tZTo0NTA5OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKLS1icmVhawotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBBUj0kYWNfY3ZfcHJvZ19BUgotIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo0NTE3OiByZXN1bHQ6ICRBUiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVIiID4mNQotIGVjaG8gIiR7RUNIT19UfSRBUiIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjQ1MjA6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTQ1MjYsNyArNTU1Miw3IEBACi0gICBhY19jdF9BUj0kQVIKLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBhcjsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZTo0NTI5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9BUitzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00NTM0LDI1ICs1NTYwLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCi0gICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKLS1lY2hvICIkYXNfbWU6NDU0NDogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gZmkKLSBmaQotIGFjX2N0X0FSPSRhY19jdl9wcm9nX2FjX2N0X0FSCi0gaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjQ1NTI6IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0FSIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6NDU1NTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtNDU2NCw3ICs1NTkzLDcgQEAKLSBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDU2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTQ1NzIsMjUgKzU2MDEsMjggQEAKLSAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLS1lY2hvICIkYXNfbWU6NDU4MjogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCi0gaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo0NTkwOiByZXN1bHQ6ICRSQU5MSUIiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjQ1OTM6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTQ1OTksNyArNTYzMSw3IEBACi0gICBhY19jdF9SQU5MSUI9JFJBTkxJQgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDYwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTQ2MDcsMTUgKzU2MzksMTggQEAKLSAgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0tZWNobyAiJGFzX21lOjQ2MTc6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQotLWJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIiICYmIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSI6IgotQEAgLTQ2MjMsMTAgKzU2NTgsMTAgQEAKLSBmaQotIGFjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKLSBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjQ2MjY6IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6NDYyOTogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtNDYzOCw3ICs1NjczLDcgQEAKLSBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZTo0NjQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19ETExUT09MK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTQ2NDYsMjUgKzU2ODEsMjggQEAKLSAgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotLWVjaG8gIiRhc19tZTo0NjU2OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKLS1icmVhawotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBmaQotIGZpCi0gRExMVE9PTD0kYWNfY3ZfcHJvZ19ETExUT09MCi0gaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NDY2NDogcmVzdWx0OiAkRExMVE9PTCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRExMVE9PTCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JERMTFRPT0wiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo0NjY3OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLUBAIC00NjczLDcgKzU3MTEsNyBAQAotICAgYWNfY3RfRExMVE9PTD0kRExMVE9PTAotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotLWVjaG8gIiRhc19tZTo0Njc2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9ETExUT09MK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTQ2ODEsMjUgKzU3MTksMjggQEAKLSAgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSIkYWNfY3RfRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgotLWFjX2R1bW15PSIkUEFUSCIKLS1mb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gIElGUz0kYWNfc2F2ZV9JRlMKLS0gIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQotLWFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKLS1lY2hvICIkYXNfbWU6NDY5MTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9ImRsbHRvb2wiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBhY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKLSBpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo0Njk5OiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9ETExUT09MIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3RfRExMVE9PTCIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjQ3MDI6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTQ3MTEsNyArNTc1Miw3IEBACi0gaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXdpbmRyZXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXdpbmRyZXM7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDcxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfV0lORFJFUytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00NzE5LDI1ICs1NzYwLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkV0lORFJFUyI7IHRoZW4KLSAgIGFjX2N2X3Byb2dfV0lORFJFUz0iJFdJTkRSRVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX1dJTkRSRVM9IiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIKLS1lY2hvICIkYXNfbWU6NDcyOTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1Ci0tYnJlYWsKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotKyAgICBhY19jdl9wcm9nX1dJTkRSRVM9IiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLSBkb25lCi0gCi0gZmkKLSBmaQotIFdJTkRSRVM9JGFjX2N2X3Byb2dfV0lORFJFUwotIGlmIHRlc3QgLW4gIiRXSU5EUkVTIjsgdGhlbgotLSAgZWNobyAiJGFzX21lOjQ3Mzc6IHJlc3VsdDogJFdJTkRSRVMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFdJTkRSRVMiID4mNQotIGVjaG8gIiR7RUNIT19UfSRXSU5EUkVTIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6NDc0MDogcmVzdWx0OiBubyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotIGZpCi0gCi1AQCAtNDc0Niw3ICs1NzkwLDcgQEAKLSAgIGFjX2N0X1dJTkRSRVM9JFdJTkRSRVMKLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAid2luZHJlcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IHdpbmRyZXM7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDc0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfV0lORFJFUytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00NzU0LDI1ICs1Nzk4LDI4IEBACi0gICBpZiB0ZXN0IC1uICIkYWNfY3RfV0lORFJFUyI7IHRoZW4KLSAgIGFjX2N2X3Byb2dfYWNfY3RfV0lORFJFUz0iJGFjX2N0X1dJTkRSRVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX2FjX2N0X1dJTkRSRVM9IndpbmRyZXMiCi0tZWNobyAiJGFzX21lOjQ3NjQ6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQotLWJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19hY19jdF9XSU5EUkVTPSJ3aW5kcmVzIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBmaQotIGZpCi0gYWNfY3RfV0lORFJFUz0kYWNfY3ZfcHJvZ19hY19jdF9XSU5EUkVTCi0gaWYgdGVzdCAtbiAiJGFjX2N0X1dJTkRSRVMiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NDc3MjogcmVzdWx0OiAkYWNfY3RfV0lORFJFUyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfV0lORFJFUyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1dJTkRSRVMiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo0Nzc1OiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLUBAIC00Nzg1LDcgKzU4MzIsNyBAQAotIGRvCi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLS1lY2hvICIkYXNfbWU6NDc4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfWUFDQytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00NzkzLDI1ICs1ODQwLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotLWVjaG8gIiRhc19tZTo0ODAzOiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKLS1icmVhawotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBZQUNDPSRhY19jdl9wcm9nX1lBQ0MKLSBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo0ODExOiByZXN1bHQ6ICRZQUNDIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRZQUNDIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kWUFDQyIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjQ4MTQ6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTQ4MTksMTAgKzU4NjksMTEgQEAKLSBkb25lCi0gdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0gCi0rCi0gaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW1pZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bWlnOyBhY193b3JkPSQyCi0tZWNobyAiJGFzX21lOjQ4MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9wcm9nX01JRytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00ODMwLDI1ICs1ODgxLDI4IEBACi0gICBpZiB0ZXN0IC1uICIkTUlHIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19NSUc9IiRNSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX01JRz0iJHthY190b29sX3ByZWZpeH1taWciCi0tZWNobyAiJGFzX21lOjQ4NDA6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQotLWJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19NSUc9IiR7YWNfdG9vbF9wcmVmaXh9bWlnIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotIGRvbmUKLSAKLSBmaQotIGZpCi0gTUlHPSRhY19jdl9wcm9nX01JRwotIGlmIHRlc3QgLW4gIiRNSUciOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NDg0ODogcmVzdWx0OiAkTUlHIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNSUciID4mNQotIGVjaG8gIiR7RUNIT19UfSRNSUciID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo0ODUxOiByZXN1bHQ6IG5vIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gZmkKLSAKLUBAIC00ODU3LDcgKzU5MTEsNyBAQAotICAgYWNfY3RfTUlHPSRNSUcKLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibWlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgbWlnOyBhY193b3JkPSQyCi0tZWNobyAiJGFzX21lOjQ4NjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X01JRytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC00ODY1LDI1ICs1OTE5LDI4IEBACi0gICBpZiB0ZXN0IC1uICIkYWNfY3RfTUlHIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19hY19jdF9NSUc9IiRhY19jdF9NSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKLS1hY19kdW1teT0iJFBBVEgiCi0tZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICBJRlM9JGFjX3NhdmVfSUZTCi0tICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKLS1hY19jdl9wcm9nX2FjX2N0X01JRz0ibWlnIgotLWVjaG8gIiRhc19tZTo0ODc1OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKLS1icmVhawotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfYWNfY3RfTUlHPSJtaWciCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0gZG9uZQotIAotIGZpCi0gZmkKLSBhY19jdF9NSUc9JGFjX2N2X3Byb2dfYWNfY3RfTUlHCi0gaWYgdGVzdCAtbiAiJGFjX2N0X01JRyI7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo0ODgzOiByZXN1bHQ6ICRhY19jdF9NSUciID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X01JRyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N0X01JRyIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFzX21lOjQ4ODY6IHJlc3VsdDogbm8iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSBmaQotIAotQEAgLTQ4OTIsNiArNTk0OSw3IEBACi0gICBNSUc9IiRhY19jdl9wcm9nX01JRyIKLSBmaQotIAotKwotIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCRwcm9ncmFtX3ByZWZpeCw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0gIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi1AQCAtNDkwNSwxMyArNTk2MywxNCBAQAotIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotIHJtIGNvbmZ0ZXN0LnNlZAotIAotLWVjaG8gIiRhc19tZTo0OTA4OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotKwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaWduYWwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNDkxNCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHNpZ25hbC5oPgotQEAgLTQ5MjQsNiArNTk4MywxMiBAQAotIHZvaWQgKCpzaWduYWwgKCkpICgpOwotICNlbmRpZgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC00OTMzLDE2ICs1OTk4LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo0OTM2OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo0OTM5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjQ5NDI6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NDk0NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotIGVsc2UKLUBAIC00OTUyLDIwICs2MDE3LDIyIEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTo0OTU1OiByZXN1bHQ6ICRhY19jdl90eXBlX3NpZ25hbCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaWduYWwiID4mNgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAotLUVPRgotK19BQ0VPRgotKwotKwotIAotLWVjaG8gIiRhc19tZTo0OTYyOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNDk2OCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gI2luY2x1ZGUgPHN0ZGFyZy5oPgotQEAgLTQ5NzMsMTMgKzYwNDAsMTMgQEAKLSAjaW5jbHVkZSA8ZmxvYXQuaD4KLSAKLSBfQUNFT0YKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo0OTc2OiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotICAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQotICAgYWNfc3RhdHVzPSQ/Ci0gICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gICBybSAtZiBjb25mdGVzdC5lcjEKLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0tICBlY2hvICIkYXNfbWU6NDk4MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCi0gICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCi1AQCAtNTAwMSw3ICs2MDY4LDcgQEAKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTAwNCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0gCi1AQCAtNTAxOSw3ICs2MDg2LDcgQEAKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTAyMiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gCi1AQCAtNTA0MCw3ICs2MTA3LDcgQEAKLSAgIDoKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1MDQzICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxjdHlwZS5oPgotICNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKLUBAIC01MDY2LDQ0ICs2MTMzLDkwIEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjUwNjk6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjUwNzI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTA3NDogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo1MDc3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICA6Ci0gZWxzZQotICAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotKyggZXhpdCAkYWNfc3RhdHVzICkKLSBhY19jdl9oZWFkZXJfc3RkYz1ubwotIGZpCi0gcm0gLWYgY29yZSBjb3JlLiogKi5jb3JlIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIGZpCi0gZmkKLS1lY2hvICIkYXNfbWU6NTA5MDogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFNURENfSEVBREVSUyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLSsKLSsKLSBjYXNlICRob3N0X29zIGluIHNvbGFyaXMyLjcgfCBzb2xhcmlzMi44KSBjYXNlICIkR0NDIiBpbiB5ZXMpCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBfTVNFX0lOVF9IIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBlc2FjOyBlc2FjCi0gCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0gZm9yIGFjX2hlYWRlciBpbiBjdHlwZS5oIG5saXN0LmggbGluay5oIHRocmVhZF9kYi5oIHByb2Nfc2VydmljZS5oIFwKLSAJbWVtb3J5Lmggb2JqbGlzdC5oIHB0cmFjZS5oIHNndHR5Lmggc3RkZGVmLmggc3RkbGliLmggXAotIAlzdHJpbmcuaCBzeXMvcHJvY2ZzLmggc3lzL3Byb2MuaCBzeXMvcHRyYWNlLmggc3lzL3JlZy5oIHN0ZGludC5oIFwKLUBAIC01MTE1LDIzICs2MjI4LDYxIEBACi0gCXBvbGwuaCBzeXMvcG9sbC5oCi0gZG8KLSBhc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLS1lY2hvICIkYXNfbWU6NTExODogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKLSBpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2ZpCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKLSBlbHNlCi0tICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1MTI0ICJjb25maWd1cmUiCi0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIChldmFsICRhY190cnkpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2FjX2hlYWRlcl9jb21waWxlcj1ubwotK2ZpCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Ci0rCi0rIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTEyODogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLSAgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLSAgIGFjX3N0YXR1cz0kPwotICAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICAgcm0gLWYgY29uZnRlc3QuZXIxCi0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotLSAgZWNobyAiJGFzX21lOjUxMzQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotQEAgLTUxNDIsMzEgKzYyOTMsNTggQEAKLSAgIGFjX2NwcF9lcnI9eWVzCi0gZmkKLSBpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KLS0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi0gZmkKLSBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjYKLSsKLSsjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLStjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jIGluCi0rICB5ZXM6bm8gKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fTs7Ci0rICBubzp5ZXMgKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotK2VzYWMKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci0raWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBldmFsICIkYXNfYWNfSGVhZGVyPSRhY19oZWFkZXJfcHJlcHJvYyIKLSBmaQotLWVjaG8gIiRhc19tZTo1MTUzOiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgotKwotK2ZpCi0gaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSsKLSBkb25lCi0gCi0tZWNobyAiJGFzX21lOjUxNjM6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4uLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RhdF9icm9rZW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTE2OSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci1AQCAtNTIwNSwyNSArNjM4MywzMiBAQAotIHJtIC1mIGNvbmZ0ZXN0KgotIAotIGZpCi0tZWNobyAiJGFzX21lOjUyMDg6IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbiIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbiIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbiIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgU1RBVF9NQUNST1NfQlJPS0VOIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo1MjE4OiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQotKwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfY19jb25zdCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1MjI0ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC01Mjc5LDE2ICs2NDY0LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo1MjgyOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo1Mjg1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjUyODg6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NTI5MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfY19jb25zdD15ZXMKLSBlbHNlCi1AQCAtNTI5OCwxNyArNjQ4MywxNyBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6NTMwMTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBjb25zdAotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjUzMTE6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9jX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC01MzE2LDcgKzY1MDEsNyBAQAotICAgYWNfY3ZfY19pbmxpbmU9bm8KLSBmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1MzE5ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpZm5kZWYgX19jcGx1c3BsdXMKLSBzdGF0aWMgJGFjX2t3IGludCBzdGF0aWNfZm9vICgpIHtyZXR1cm4gMDsgfQotQEAgLTUzMjUsMTYgKzY1MTAsMTYgQEAKLSAKLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTMyODogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NTMzMTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo1MzM0OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjUzMzc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLSBlbHNlCi1AQCAtNTM0NSwzMiArNjUzMCw0NiBAQAotIGRvbmUKLSAKLSBmaQotLWVjaG8gIiRhc19tZTo1MzQ4OiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19pbmxpbmUiID4mNgotIGNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gICBpbmxpbmUgfCB5ZXMpIDs7Ci0gICBubykKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBpbmxpbmUKLS1FT0YKLStfQUNFT0YKLSAgOzsKLS0gICopICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICAqKSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotLUVPRgotK19BQ0VPRgotICA7OwotIGVzYWMKLSAKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSBmb3IgYWNfZnVuYyBpbiBiY29weSBidG93YyBiemVybyBjYW5vbmljYWxpemVfZmlsZV9uYW1lIGlzYXNjaWkgcG9sbCBcCi0gCXJlYWxwYXRoIHNicmsgc2V0cGdpZCBzZXRwZ3JwIHNpZ2FjdGlvbiBzaWdwcm9jbWFzayBzaWdzZXRtYXNrCi0gZG8KLSBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotLWVjaG8gIiRhc19tZTo1MzY3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotIGlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTM3MyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LiAgKi8KLUBAIC01Mzg0LDYgKzY1ODMsMTIgQEAKLSBjaGFyICRhY19mdW5jICgpOwotIGNoYXIgKCpmKSAoKTsKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNTQwMSwxNiArNjYwNiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU0MDQ6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU0MDc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo1NDEwOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU0MTM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLUBAIC01NDIwLDI3ICs2NjI1LDMzIEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6NTQyMzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKLSBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSBkb25lCi0gCi0gIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSAjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotLWVjaG8gIiRhc19tZTo1NDM1OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3Zfd29ya2luZ19hbGxvY2FfaCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1NDQxICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhbGxvY2EuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNTQ1MCwxNiArNjY2MSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU0NTM6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU0NTY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo1NDU5OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU0NjI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X3dvcmtpbmdfYWxsb2NhX2g9eWVzCi0gZWxzZQotQEAgLTU0NjksMjMgKzY2ODAsMjMgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTo1NDcyOiByZXN1bHQ6ICRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3dvcmtpbmdfYWxsb2NhX2giID4mNgotIGlmIHRlc3QgJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo1NDgyOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYWxsb2NhLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTQ4OCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWZkZWYgX19HTlVDX18KLSAjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotQEAgLTU1MDgsNiArNjcxOSwxMiBAQAotICMgZW5kaWYKLSAjZW5kaWYKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNTUxNywxNiArNjczNCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU1MjA6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU1MjM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo1NTI2OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU1Mjk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotIGVsc2UKLUBAIC01NTM2LDE0ICs2NzUzLDE0IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6NTUzOTogcmVzdWx0OiAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjYKLSAKLSBpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfQUxMT0NBIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBlbHNlCi0gICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotQEAgLTU1NTMsMTcgKzY3NzAsMTggQEAKLSAKLSBBTExPQ0E9YWxsb2NhLiRhY19vYmpleHQKLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBDX0FMTE9DQSAxCi0tRU9GCi0rX0FDRU9GCi0gCi0tZWNobyAiJGFzX21lOjU1NjA6IGNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIFxgYWxsb2NhLmMnIG5lZWRzIENyYXkgaG9va3MuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9vc19jcmF5K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDU1NjYgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotIHdlYmVjcmF5Ci1AQCAtNTU4MSwxOCArNjc5OSwxOCBAQAotIHJtIC1mIGNvbmZ0ZXN0KgotIAotIGZpCi0tZWNobyAiJGFzX21lOjU1ODQ6IHJlc3VsdDogJGFjX2N2X29zX2NyYXkiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vc19jcmF5IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3Zfb3NfY3JheSIgPiY2Ci0gaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotICAgZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICAgICBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotLWVjaG8gIiRhc19tZTo1NTg5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotIGlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTU5NSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LiAgKi8KLUBAIC01NjA2LDYgKzY4MjQsMTIgQEAKLSBjaGFyICRhY19mdW5jICgpOwotIGNoYXIgKCpmKSAoKTsKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNTYyMywxNiArNjg0NywxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU2MjY6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU2Mjk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo1NjMyOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU2MzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLUBAIC01NjQyLDEzICs2ODY2LDEzIEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6NTY0NTogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKLSBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi0tRU9GCi0rX0FDRU9GCi0gCi0gICAgIGJyZWFrCi0gZmkKLUBAIC01NjU2LDcgKzY4ODAsNyBAQAotICAgZG9uZQotIGZpCi0gCi0tZWNobyAiJGFzX21lOjU2NTk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbitzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC01NjY1LDcgKzY4ODksNyBAQAotICAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDU2NjggImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gaW50Ci0gZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLUBAIC01Njg4LDQ0ICs2OTEyLDUyIEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU2OTE6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU2OTQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTY5NjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo1Njk5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotKyggZXhpdCAkYWNfc3RhdHVzICkKLSBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotIGZpCi0gcm0gLWYgY29yZSBjb3JlLiogKi5jb3JlIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIGZpCi0tZWNobyAiJGFzX21lOjU3MTE6IHJlc3VsdDogJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY2Ci0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLS1FT0YKLStfQUNFT0YKLSsKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo1NzIwOiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBpZF90Li4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9waWRfdCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1NzI2ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTU3MzgsMTYgKzY5NzAsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU3NDE6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU3NDQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTc0NzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo1NzUwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl90eXBlX3BpZF90PXllcwotIGVsc2UKLUBAIC01NzU3LDM4ICs2OTg5LDc4IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTo1NzYwOiByZXN1bHQ6ICRhY19jdl90eXBlX3BpZF90IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9waWRfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfcGlkX3QiID4mNgotIGlmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSB5ZXM7IHRoZW4KLSAgIDoKLSBlbHNlCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIHBpZF90IGludAotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0rCi0rCi0gZm9yIGFjX2hlYWRlciBpbiB1bmlzdGQuaCB2Zm9yay5oCi0gZG8KLSBhc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLS1lY2hvICIkYXNfbWU6NTc3NTogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKLSBpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2ZpCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKLSBlbHNlCi0tICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA1NzgxICJjb25maWd1cmUiCi0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIChldmFsICRhY190cnkpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2FjX2hlYWRlcl9jb21waWxlcj1ubwotK2ZpCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Ci0rCi0rIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTc4NTogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLSAgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLSAgIGFjX3N0YXR1cz0kPwotICAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICAgcm0gLWYgY29uZnRlc3QuZXIxCi0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotLSAgZWNobyAiJGFzX21lOjU3OTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotQEAgLTU3OTksMzQgKzcwNzEsNjMgQEAKLSAgIGFjX2NwcF9lcnI9eWVzCi0gZmkKLSBpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KLS0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi0gZmkKLSBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjYKLSsKLSsjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLStjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jIGluCi0rICB5ZXM6bm8gKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fTs7Ci0rICBubzp5ZXMgKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotK2VzYWMKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci0raWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBldmFsICIkYXNfYWNfSGVhZGVyPSRhY19oZWFkZXJfcHJlcHJvYyIKLSBmaQotLWVjaG8gIiRhc19tZTo1ODEwOiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgotKwotK2ZpCi0gaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSsKLSBkb25lCi0gCi0rCi0rCi0gZm9yIGFjX2Z1bmMgaW4gZm9yayB2Zm9yawotIGRvCi0gYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLS1lY2hvICIkYXNfbWU6NTgyMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLSBpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDU4MjkgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4gICovCi1AQCAtNTg0MCw2ICs3MTQxLDEyIEBACi0gY2hhciAkYWNfZnVuYyAoKTsKLSBjaGFyICgqZikgKCk7Ci0gCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTU4NTcsMTYgKzcxNjQsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo1ODYwOiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo1ODYzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTg2NjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo1ODY5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBldmFsICIkYXNfYWNfdmFyPXllcyIKLSBlbHNlCi1AQCAtNTg3NiwxOSArNzE4MywxOSBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjU4Nzk6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLSBlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2Ci0gaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gZG9uZQotIAotIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0kYWNfY3ZfZnVuY19mb3JrCi0gaWYgdGVzdCAieCRhY19jdl9mdW5jX2ZvcmsiID0geHllczsgdGhlbgotLSAgZWNobyAiJGFzX21lOjU4OTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yay4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfZm9ya193b3JrcytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC01ODk3LDcgKzcyMDQsNyBAQAotICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPWNyb3NzCi0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tLyogQnkgUvxkaWdlciBLdWhsbWFubi4gKi8KLSsvKiBCeSBSdWVkaWdlciBLdWhsbWFubi4gKi8KLSAgICAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gICAgICAgI2lmIEhBVkVfVU5JU1REX0gKLSAgICAgICAjIGluY2x1ZGUgPHVuaXN0ZC5oPgotQEAgLTU5MTEsMjcgKzcyMTgsMjggQEAKLSAgICAgICB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTkxNDogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NTkxNzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo1OTE5OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjU5MjI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKLSBlbHNlCi0gICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rKCBleGl0ICRhY19zdGF0dXMgKQotIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1ubwotIGZpCi0gcm0gLWYgY29yZSBjb3JlLiogKi5jb3JlIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIGZpCi0tZWNobyAiJGFzX21lOjU5MzQ6IHJlc3VsdDogJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY2Ci0gCi0gZmkKLUBAIC01OTQ1LDEyICs3MjUzLDEyIEBACi0gICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcwotICAgICAgIDs7Ci0gICBlc2FjCi0tICB7IGVjaG8gIiRhc19tZTo1OTQ4OiBXQVJOSU5HOiBDUk9TUzogUmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBkdWUgdG8gY3Jvc3MtY29tcGlsaW5nLiIgPiY1Ci0tZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDUk9TUzogUmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBkdWUgdG8gY3Jvc3MtY29tcGlsaW5nLiIgPiYyO30KLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mMjt9Ci0gZmkKLSBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi0gaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrIiA9IHh5ZXM7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo1OTUzOiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9mdW5jX3Zmb3JrX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTU5NTksNyArNzI2Nyw3IEBACi0gICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPWNyb3NzCi0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNTk2MiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNjA1NiwxMjggKzczNjQsMTQzIEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjYwNTk6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYwNjI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjA2NDogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2MDY3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0gYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotIGZpCi0gcm0gLWYgY29yZSBjb3JlLiogKi5jb3JlIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIGZpCi0tZWNobyAiJGFzX21lOjYwNzk6IHJlc3VsdDogJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY2Ci0gCi0gZmk7Ci0gaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCi0gICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPWFjX2N2X2Z1bmNfdmZvcmsKLS0gIHsgZWNobyAiJGFzX21lOjYwODU6IFdBUk5JTkc6IENST1NTOiBSZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBkdWUgdG8gY3Jvc3MtY29tcGlsaW5nLiIgPiY1Ci0tZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDUk9TUzogUmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgZHVlIHRvIGNyb3NzLWNvbXBpbGluZy4iID4mMjt9Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mMjt9Ci0gZmkKLSAKLSBpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID0geHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfV09SS0lOR19WRk9SSyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZWxzZQotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIHZmb3JrIGZvcmsKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIGlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLSBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG5vOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6NjExMTogY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHNldHBncnAgdGFrZXMgbm8gYXJndW1lbnQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50Li4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLS0gIHsgeyBlY2hvICIkYXNfbWU6NjExNzogZXJyb3I6IGNhbm5vdCBjaGVjayBzZXRwZ3JwIGlmIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci0tZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNoZWNrIHNldHBncnAgaWYgY3Jvc3MgY29tcGlsaW5nIiA+JjI7fQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNoZWNrIHNldHBncnAgd2hlbiBjcm9zcyBjb21waWxpbmciID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjaGVjayBzZXRwZ3JwIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDYxMjIgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2lmIEhBVkVfVU5JU1REX0gKLSAjIGluY2x1ZGUgPHVuaXN0ZC5oPgotICNlbmRpZgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLS0vKiBJZiB0aGlzIHN5c3RlbSBoYXMgYSBCU0Qtc3R5bGUgc2V0cGdycCwgd2hpY2ggdGFrZXMgYXJndW1lbnRzLCBleGl0Ci0tICAgc3VjY2Vzc2Z1bGx5LiAgKi8KLS0gIGV4aXQgKHNldHBncnAgKDEsMSkgPT0gLTEpOwotKy8qIElmIHRoaXMgc3lzdGVtIGhhcyBhIEJTRC1zdHlsZSBzZXRwZ3JwIHdoaWNoIHRha2VzIGFyZ3VtZW50cywKLSsgIHNldHBncnAoMSwgMSkgd2lsbCBmYWlsIHdpdGggRVNSQ0ggYW5kIHJldHVybiAtMSwgaW4gdGhhdCBjYXNlCi0rICBleGl0IHN1Y2Nlc3NmdWxseS4gKi8KLSsgIGV4aXQgKHNldHBncnAgKDEsMSkgPT0gLTEgPyAwIDogMSk7Ci0gICA7Ci0gICByZXR1cm4gMDsKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjEzOTogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjE0MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2MTQ0OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYxNDc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkPW5vCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotKyggZXhpdCAkYWNfc3RhdHVzICkKLSBhY19jdl9mdW5jX3NldHBncnBfdm9pZD15ZXMKLSBmaQotIHJtIC1mIGNvcmUgY29yZS4qICouY29yZSBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSBmaQotLWVjaG8gIiRhc19tZTo2MTU5OiByZXN1bHQ6ICRhY19jdl9mdW5jX3NldHBncnBfdm9pZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQiID4mNgotIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgU0VUUEdSUF9WT0lEIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo2MTcwOiBjaGVja2luZyB3aGV0aGVyIHNldHBncnAgdGFrZXMgbm8gYXJndW1lbnQiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc2V0cGdycCB0YWtlcyBubyBhcmd1bWVudCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHNldHBncnAgdGFrZXMgbm8gYXJndW1lbnQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9mdW5jX3NldHBncnBfdm9pZCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA2MTc2ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjE5MiwxNiArNzUxNSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjE5NTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjE5ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2MjAxOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYyMDQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkPW5vCi0gZWxzZQotQEAgLTYyMTEsMjkgKzc1MzQsMzUgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFzX21lOjYyMTQ6IHJlc3VsdDogJGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX3NldHBncnBfdm9pZCIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgU0VUUEdSUF9WT0lEIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIGZpCi0gCi0gIyBDaGVjayBpZiBzaWdzZXRqbXAgaXMgYXZhaWxhYmxlLiAgVXNpbmcgQUNfQ0hFQ0tfRlVOQ1Mgd29uJ3QgZG8KLSAjIHNpbmNlIHNpZ3NldGptcCBtaWdodCBvbmx5IGJlIGRlZmluZWQgYXMgYSBtYWNyby4KLS1lY2hvICIkYXNfbWU6NjIyNjogY2hlY2tpbmcgZm9yIHNpZ3NldGptcCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaWdzZXRqbXAiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNpZ3NldGptcC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2dkYl9jdl9mdW5jX3NpZ3NldGptcCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA2MjMyICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzZXRqbXAuaD4KLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjI0MywxNiArNzU3MiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjI0NjogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjI0OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2MjUyOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYyNTU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9mdW5jX3NpZ3NldGptcD15ZXMKLSBlbHNlCi1AQCAtNjI2MiwyNyArNzU5MSwzMyBAQAotIGZpCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6NjI2NTogcmVzdWx0OiAkZ2RiX2N2X2Z1bmNfc2lnc2V0am1wIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2Z1bmNfc2lnc2V0am1wIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kZ2RiX2N2X2Z1bmNfc2lnc2V0am1wIiA+JjYKLSBpZiB0ZXN0ICRnZGJfY3ZfZnVuY19zaWdzZXRqbXAgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1NJR1NFVEpNUCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLSAjIFNlZSBpZiA8bWFjaGluZS9yZWcuaD4gc3VwcG9ydHMgdGhlICVmcyBhbmQgJWdzIGkzODYgc2VnbWVudCByZWdpc3RlcnMuCi0gIyBPbGRlciBpMzg2IEJTRCdzIGRvbid0IGhhdmUgdGhlIHJfZnMgYW5kIHJfZ3MgbWVtYmVycyBvZiBgc3RydWN0IHJlZycuCi0tZWNobyAiJGFzX21lOjYyNzc6IGNoZWNraW5nIGZvciByX2ZzIGluIHN0cnVjdCByZWciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igcl9mcyBpbiBzdHJ1Y3QgcmVnIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByX2ZzIGluIHN0cnVjdCByZWcuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDYyODMgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTYyOTIsMTYgKzc2MjcsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjYyOTU6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYyOTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjMwMTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2MzA0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzPXllcwotIGVsc2UKLUBAIC02MzExLDIzICs3NjQ2LDI5IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTo2MzE0OiByZXN1bHQ6ICRnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X3N0cnVjdF9yZWdfcl9mcyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZnMiID4mNgotIGlmIHRlc3QgJGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZnMgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfUkVHX1JfRlMgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0tZWNobyAiJGFzX21lOjYzMjI6IGNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igcl9ncyBpbiBzdHJ1Y3QgcmVnIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWcuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtnZGJfY3Zfc3RydWN0X3JlZ19yX2dzK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDYzMjggImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTYzMzcsMTYgKzc2NzgsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjYzNDA6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYzNDM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjM0NjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2MzQ5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3Zfc3RydWN0X3JlZ19yX2dzPXllcwotIGVsc2UKLUBAIC02MzU2LDI1ICs3Njk3LDMxIEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTo2MzU5OiByZXN1bHQ6ICRnZGJfY3Zfc3RydWN0X3JlZ19yX2dzIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZ3MiID4mNgotIGlmIHRlc3QgJGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZ3MgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfUkVHX1JfR1MgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0gIyBTZWUgaWYgPHN5cy9wdHJhY2UuaD4gcHJvdmlkZXMgdGhlIFBUUkFDRV9HRVRSRUdTIHJlcXVlc3QuCi0tZWNobyAiJGFzX21lOjYzNjk6IGNoZWNraW5nIGZvciBQVFJBQ0VfR0VUUkVHUyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBQVFJBQ0VfR0VUUkVHUyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgUFRSQUNFX0dFVFJFR1MuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0cmVncytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA2Mzc1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTYzODQsMTYgKzc3MzEsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjYzODc6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjYzOTA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjM5MzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2Mzk2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0cmVncz15ZXMKLSBlbHNlCi1AQCAtNjQwNCwyNSArNzc1MSwzMSBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjY0MDc6IHJlc3VsdDogJGdkYl9jdl9oYXZlX3B0cmFjZV9nZXRyZWdzIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfcHRyYWNlX2dldHJlZ3MiID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0cmVncyIgPiY2Ci0gaWYgdGVzdCAkZ2RiX2N2X2hhdmVfcHRyYWNlX2dldHJlZ3MgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QVFJBQ0VfR0VUUkVHUyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLSAjIFNlZSBpZiA8c3lzL3B0cmFjZS5oPiBwcm92aWRlcyB0aGUgUFRSQUNFX0dFVEZQWFJFR1MgcmVxdWVzdC4KLS1lY2hvICIkYXNfbWU6NjQxNzogY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRGUFhSRUdTIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRGUFhSRUdTIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBQVFJBQ0VfR0VURlBYUkVHUy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2dkYl9jdl9oYXZlX3B0cmFjZV9nZXRmcHhyZWdzK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDY0MjMgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjQzMiwxNiArNzc4NSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjQzNTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjQzODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2NDQxOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY0NDQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9oYXZlX3B0cmFjZV9nZXRmcHhyZWdzPXllcwotIGVsc2UKLUBAIC02NDUyLDI2ICs3ODA1LDMyIEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSAKLS1lY2hvICIkYXNfbWU6NjQ1NTogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfcHRyYWNlX2dldGZweHJlZ3MiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0ZnB4cmVncyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9oYXZlX3B0cmFjZV9nZXRmcHhyZWdzIiA+JjYKLSBpZiB0ZXN0ICRnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0ZnB4cmVncyA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1BUUkFDRV9HRVRGUFhSRUdTIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotICMgU2VlIGlmIDxzeXMvcHRyYWNlLmg+IHByb3ZpZGVzIHRoZSBQVF9HRVREQlJFR1MgcmVxdWVzdC4KLS1lY2hvICIkYXNfbWU6NjQ2NTogY2hlY2tpbmcgZm9yIFBUX0dFVERCUkVHUyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBQVF9HRVREQlJFR1MiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIFBUX0dFVERCUkVHUy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2dkYl9jdl9oYXZlX3B0X2dldGRicmVncytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA2NDcxICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC02NDgxLDE2ICs3ODQwLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo2NDg0OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2NDg3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjY0OTA6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjQ5MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZ2RiX2N2X2hhdmVfcHRfZ2V0ZGJyZWdzPXllcwotIGVsc2UKLUBAIC02NTAxLDI2ICs3ODYwLDMyIEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSAKLS1lY2hvICIkYXNfbWU6NjUwNDogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfcHRfZ2V0ZGJyZWdzIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfcHRfZ2V0ZGJyZWdzIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kZ2RiX2N2X2hhdmVfcHRfZ2V0ZGJyZWdzIiA+JjYKLSBpZiB0ZXN0ICRnZGJfY3ZfaGF2ZV9wdF9nZXRkYnJlZ3MgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QVF9HRVREQlJFR1MgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0gIyBTZWUgaWYgPHN5cy9wdHJhY2UuaD4gcHJvdmlkZXMgdGhlIFBUX0dFVFhNTVJFR1MgcmVxdWVzdC4KLS1lY2hvICIkYXNfbWU6NjUxNDogY2hlY2tpbmcgZm9yIFBUX0dFVFhNTVJFR1MiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgUFRfR0VUWE1NUkVHUyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgUFRfR0VUWE1NUkVHUy4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2dkYl9jdl9oYXZlX3B0X2dldHhtbXJlZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNjUyMCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjUzMCwxNiArNzg5NSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjUzMzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjUzNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2NTM5OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY1NDI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9oYXZlX3B0X2dldHhtbXJlZ3M9eWVzCi0gZWxzZQotQEAgLTY1NTAsMTYgKzc5MTUsMTggQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2NTUzOiByZXN1bHQ6ICRnZGJfY3ZfaGF2ZV9wdF9nZXR4bW1yZWdzIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfcHRfZ2V0eG1tcmVncyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9oYXZlX3B0X2dldHhtbXJlZ3MiID4mNgotIGlmIHRlc3QgJGdkYl9jdl9oYXZlX3B0X2dldHhtbXJlZ3MgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QVF9HRVRYTU1SRUdTIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2NTYyOiBjaGVja2luZyBmb3Igc29ja2V0cGFpciBpbiAtbHNvY2tldCIgPiY1Ci0rCi0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzb2NrZXRwYWlyIGluIC1sc29ja2V0IiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrZXRwYWlyIGluIC1sc29ja2V0Li4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXRwYWlyK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTY1NjcsNyArNzkzNCw3IEBACi0gICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi0gTElCUz0iLWxzb2NrZXQgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDY1NzAgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC02NTc3LDYgKzc5NDQsMTIgQEAKLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSBjaGFyIHNvY2tldHBhaXIgKCk7Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTY1ODYsMTYgKzc5NTksMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo2NTg5OiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2NTkyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjU5NTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2NTk4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9saWJfc29ja2V0X3NvY2tldHBhaXI9eWVzCi0gZWxzZQotQEAgLTY2MDYsMjcgKzc5NzksMjggQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0tZWNobyAiJGFzX21lOjY2MDk6IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0cGFpciIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0cGFpciIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0cGFpciIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXRwYWlyID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBIQVZFX0xJQlNPQ0tFVCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICBMSUJTPSItbHNvY2tldCAkTElCUyIKLSAKLSBmaQotIAotKwotIGZvciBhY19mdW5jIGluIHNvY2tldHBhaXIKLSBkbwotIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi0tZWNobyAiJGFzX21lOjY2MjM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA2NjI5ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuICAqLwotQEAgLTY2NDAsNiArODAxNCwxMiBAQAotIGNoYXIgJGFjX2Z1bmMgKCk7Ci0gY2hhciAoKmYpICgpOwotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC02NjU3LDE2ICs4MDM3LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjY2MDogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjY2MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjY2NjY6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjY2OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTY2NzYsMjMgKzgwNTYsMjUgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhc19tZTo2Njc5OiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgotIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIGRvbmUKLSAKLS1lY2hvICIkYXNfbWU6NjY4OTogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rCi0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2JmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNjY5NSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC02NzA5LDYgKzgwOTEsMTIgQEAKLSAjaWZkZWYgSEFWRV9VTklTVERfSAotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAjZW5kaWYKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjcxOCwxNiArODEwNiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjcyMTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NjcyNDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2NzI3OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY3MzA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLSBlbHNlCi1AQCAtNjczOCwyMyArODEyNiwyMyBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjY3NDE6IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2MiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyIgPiY2Ci0gaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fTUFMTE9DIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2NzUxOiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNjc1NyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC02NzcxLDYgKzgxNTksMTIgQEAKLSAjaWZkZWYgSEFWRV9VTklTVERfSAotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAjZW5kaWYKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjc4MCwxNiArODE3NCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Njc4MzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Njc4NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2Nzg5OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY3OTI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jPW5vCi0gZWxzZQotQEAgLTY4MDAsMjMgKzgxOTQsMjMgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2ODAzOiByZXN1bHQ6ICRiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYyIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MiID4mNgotIGlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2ODEzOiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNjgxOSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC02ODMzLDYgKzgyMjcsMTIgQEAKLSAjaWZkZWYgSEFWRV9VTklTVERfSAotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAjZW5kaWYKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjg0MiwxNiArODI0MiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Njg0NTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Njg0ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2ODUxOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY4NTQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi0gZWxzZQotQEAgLTY4NjIsMjMgKzgyNjIsMjMgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2ODY1OiByZXN1bHQ6ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUiID4mNgotIGlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2ODc1OiBjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBzdHJlcnJvciBtdXN0IGJlIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YmZkX2N2X2RlY2xfbmVlZGVkX3N0cmVycm9yK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDY4ODEgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNjg5NSw2ICs4Mjk1LDEyIEBACi0gI2lmZGVmIEhBVkVfVU5JU1REX0gKLSAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0gI2VuZGlmCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTY5MDQsMTYgKzgzMTAsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjY5MDc6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY5MTA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjkxMzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo2OTE2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZXJyb3I9bm8KLSBlbHNlCi1AQCAtNjkyNCwyMyArODMzMCwyMyBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjY5Mjc6IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvciIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvciIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGJmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvciIgPiY2Ci0gaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmVycm9yID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJFUlJPUiAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLS1lY2hvICIkYXNfbWU6NjkzNzogY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyZHVwIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2JmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNjk0MyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC02OTU3LDYgKzgzNjMsMTIgQEAKLSAjaWZkZWYgSEFWRV9VTklTVERfSAotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAjZW5kaWYKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNjk2NiwxNiArODM3OCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Njk2OTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Njk3MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo2OTc1OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjY5Nzg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXA9bm8KLSBlbHNlCi1AQCAtNjk4NiwyMyArODM5OCwyMyBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjY5ODk6IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXAiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZHVwIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cCIgPiY2Ci0gaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSRFVQIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo2OTk5OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0citzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA3MDA1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTcwMTksNiArODQzMSwxMiBAQAotICNpZmRlZiBIQVZFX1VOSVNURF9ICi0gI2luY2x1ZGUgPHVuaXN0ZC5oPgotICNlbmRpZgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03MDI4LDE2ICs4NDQ2LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3MDMxOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3MDM0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjcwMzc6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzA0MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotIGVsc2UKLUBAIC03MDQ4LDIzICs4NDY2LDIzIEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSAKLS1lY2hvICIkYXNfbWU6NzA1MTogcmVzdWx0OiAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiID4mNQotIGVjaG8gIiR7RUNIT19UfSRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiA+JjYKLSBpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjcwNjE6IGNoZWNraW5nIHdoZXRoZXIgY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBjYW5vbmljYWxpemVfZmlsZV9uYW1lIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBjYW5vbmljYWxpemVfZmlsZV9uYW1lIG11c3QgYmUgZGVjbGFyZWQuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtiZmRfY3ZfZGVjbF9uZWVkZWRfY2Fub25pY2FsaXplX2ZpbGVfbmFtZStzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA3MDY3ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTcwODEsNiArODQ5OSwxMiBAQAotICNpZmRlZiBIQVZFX1VOSVNURF9ICi0gI2luY2x1ZGUgPHVuaXN0ZC5oPgotICNlbmRpZgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03MDkwLDE2ICs4NTE0LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3MDkzOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3MDk2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjcwOTk6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzEwMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWU9bm8KLSBlbHNlCi1AQCAtNzExMCwyNCArODUzNCwyNSBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjcxMTM6IHJlc3VsdDogJGJmZF9jdl9kZWNsX25lZWRlZF9jYW5vbmljYWxpemVfZmlsZV9uYW1lIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYmZkX2N2X2RlY2xfbmVlZGVkX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWUiID4mNQotIGVjaG8gIiR7RUNIT19UfSRiZmRfY3ZfZGVjbF9uZWVkZWRfY2Fub25pY2FsaXplX2ZpbGVfbmFtZSIgPiY2Ci0gaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWUgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0NBTk9OSUNBTElaRV9GSUxFX05BTUUgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0rCi0gIyBUaGUgZm9sbG93aW5nIHNhdmVfc3RhdGVfdCBjaGVja2VyeSBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgSFBVWAotICMgdmVyc2lvbnMgZWFybGllciB0aGFuIDEwLjIwLiAgV2hlbiB0aG9zZSBmYWRlIGZyb20gbWVtb3J5LCB0aGlzCi0gIyBjb3VsZCBiZSBleHB1bmdlZC4gLS1qc20gMTk5OS0wMy0yMgotIAotLWVjaG8gIiRhc19tZTo3MTI3OiBjaGVja2luZyBmb3IgSFBVWCBzYXZlX3N0YXRlIHN0cnVjdHVyZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBIUFVYIHNhdmVfc3RhdGUgc3RydWN0dXJlIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBIUFVYIHNhdmVfc3RhdGUgc3RydWN0dXJlLi4uICRFQ0hPX0MiID4mNgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDcxMzAgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvc2F2ZV9zdGF0ZS5oPgotIAotQEAgLTcxNDEsNyArODU2Niw3IEBACi0gcm0gLWYgY29uZnRlc3QqCi0gCi0gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzE0NCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bWFjaGluZS9zYXZlX3N0YXRlLmg+Ci0gCi1AQCAtNzE1NiwyMSArODU4MSwyMiBAQAotIAotIGlmIHRlc3QgJGdkYl9jdl9ocHV4X3NhdmVzdGF0ZSA9IHllcwotIHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfU0FWRV9TVEFURV9UIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIGlmIHRlc3QgJGdkYl9jdl9ocHV4X3Nzd2lkZSA9IHllcwotIHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfTUVNQkVSX1NTX1dJREUgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0tZWNobyAiJGFzX21lOjcxNzE6IHJlc3VsdDogJGdkYl9jdl9ocHV4X3Nzd2lkZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9ocHV4X3Nzd2lkZSIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9ocHV4X3Nzd2lkZSIgPiY2Ci0gCi0rCi0gIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUgb24gR05VL0xpbnV4LCB3b3JrIGFyb3VuZCBwcm9ibGVtcyB3aXRoCi0gIyBzeXMvcHJvY2ZzLmgKLSAjIEFsc28gZGV0ZWN0IHdoaWNoIHR5cGUgb2YgL3Byb2MgaXMgaW4gdXNlLCBzdWNoIGFzIGZvciBVbml4d2FyZSBvciBTb2xhcmlzLgotQEAgLTcxNzgsNDggKzg2MDQsNTQgQEAKLSBpZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gICBjYXNlICIke2hvc3R9IiBpbgotICAgaVszNDU2XTg2LSotbGludXgqKQotLQljYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgMgotLUVPRgotK19BQ0VPRgotIAotLQljYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgc3lzX3F1b3RhY3RsIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAJOzsKLSAgIGlhNjQtKi1haXgqKQotLSAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIE5FV19QUk9DX0FQSSAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICAgICAgOzsKLSAgICotKi11bml4d2FyZSogfCAqLSotc3lzdjQuMiogfCAqLSotc3lzdjUqKQotLSAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIE5FV19QUk9DX0FQSSAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICAgICAgOzsKLSAgICotKi1zb2xhcmlzMi5bNjc4XSkKLS0gICAgICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBORVdfUFJPQ19BUEkgMQotLUVPRgotK19BQ0VPRgotIAotICAgICAgIDs7Ci0gICBlc2FjCi0gZmkKLSAKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLS0gIGVjaG8gIiRhc19tZTo3MjEyOiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmguLi4gJEVDSE9fQyIgPiY2Ci0gIGlmIHRlc3QgIiR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA3MjE4ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotICNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTcyMjksMTYgKzg2NjEsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjcyMzI6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjcyMzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NzIzODogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3MjQxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PXllcwotIGVsc2UKLUBAIC03MjUyLDI1ICs4Njg0LDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1BTVEFUVVNfVCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gIGZpCi0tIGVjaG8gIiRhc19tZTo3MjYwOiByZXN1bHQ6ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QiID4mNQotIGVjaG8gIiR7RUNIT19UfSRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiA+JjYKLSAKLS0gIGVjaG8gIiRhc19tZTo3MjYzOiBjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcnJ1bl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmguLi4gJEVDSE9fQyIgPiY2Ci0gIGlmIHRlc3QgIiR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzI2OSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03MjgwLDE2ICs4NzE4LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3MjgzOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3Mjg2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjcyODk6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzI5MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3Q9eWVzCi0gZWxzZQotQEAgLTczMDMsMjUgKzg3NDEsMzEgQEAKLSAKLSAgaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1BSUlVOX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzMxMTogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QiID4mNQotKyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QiID4mNQotIGVjaG8gIiR7RUNIT19UfSRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJydW5fdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzMxNDogY2hlY2tpbmcgZm9yIGdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzMyMCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03MzMxLDE2ICs4Nzc1LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3MzM0OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3MzM3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjczNDA6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzM0MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdD15ZXMKLSBlbHNlCi1AQCAtNzM1NCwyNSArODc5OCwzMSBAQAotIAotICBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZ3JlZ3NldF90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9HUkVHU0VUX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzM2MjogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdCIgPiY1Ci0rIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZ3JlZ3NldF90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzM2NTogY2hlY2tpbmcgZm9yIGZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDczNzEgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNzM4MiwxNiArODgzMiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NzM4NTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzM4ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo3MzkxOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjczOTQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90PXllcwotIGVsc2UKLUBAIC03NDA1LDI1ICs4ODU1LDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9GUFJFR1NFVF9UIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgZmkKLS0gZWNobyAiJGFzX21lOjc0MTM6IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QiID4mNgotIAotLSAgZWNobyAiJGFzX21lOjc0MTY6IGNoZWNraW5nIGZvciBwcmdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcmdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaC4uLiAkRUNIT19DIiA+JjYKLSAgaWYgdGVzdCAiJHtiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzQyMiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03NDMzLDE2ICs4ODg5LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NDM2OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3NDM5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc0NDI6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzQ0NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldF90PXllcwotIGVsc2UKLUBAIC03NDU2LDI1ICs4OTEyLDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXRfdCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfUFJHUkVHU0VUX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzQ2NDogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXRfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXRfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzQ2NzogY2hlY2tpbmcgZm9yIHByZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcmZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwcmZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzQ3MyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03NDg0LDE2ICs4OTQ2LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NDg3OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3NDkwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc0OTM6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzQ5NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXRfdD15ZXMKLSBlbHNlCi1AQCAtNzUwNywyNSArODk2OSwzMSBAQAotIAotICBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QUkZQUkVHU0VUX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzUxNTogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXRfdCIgPiY1Ci0rIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXRfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzUxODogY2hlY2tpbmcgZm9yIHByZ3JlZ3NldDMyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJncmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByZ3JlZ3NldDMyX3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXQzMl90K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDc1MjQgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNzUzNSwxNiArOTAwMywxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NzUzODogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzU0MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo3NTQ0OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjc1NDc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXQzMl90PXllcwotIGVsc2UKLUBAIC03NTU4LDI1ICs5MDI2LDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXQzMl90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QUkdSRUdTRVQzMl9UIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgZmkKLS0gZWNobyAiJGFzX21lOjc1NjY6IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXQzMl90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXQzMl90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldDMyX3QiID4mNgotIAotLSAgZWNobyAiJGFzX21lOjc1Njk6IGNoZWNraW5nIGZvciBwcmZwcmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcmZwcmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByZnByZWdzZXQzMl90IGluIHN5cy9wcm9jZnMuaC4uLiAkRUNIT19DIiA+JjYKLSAgaWYgdGVzdCAiJHtiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzU3NSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03NTg2LDE2ICs5MDYwLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NTg5OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3NTkyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc1OTU6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzU5ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXQzMl90PXllcwotIGVsc2UKLUBAIC03NjA5LDI1ICs5MDgzLDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0MzJfdCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfUFJGUFJFR1NFVDMyX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzYxNzogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXQzMl90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0MzJfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0MzJfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzYyMDogY2hlY2tpbmcgZm9yIGx3cGlkX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbHdwaWRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGx3cGlkX3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDc2MjYgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNzYzNywxNiArOTExNywxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NzY0MDogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzY0MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo3NjQ2OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjc2NDk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90PXllcwotIGVsc2UKLUBAIC03NjYwLDI1ICs5MTQwLDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9MV1BJRF9UIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgZmkKLS0gZWNobyAiJGFzX21lOjc2Njg6IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cGlkX3QiID4mNgotIAotLSAgZWNobyAiJGFzX21lOjc2NzE6IGNoZWNraW5nIGZvciBwc2FkZHJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwc2FkZHJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBzYWRkcl90IGluIHN5cy9wcm9jZnMuaC4uLiAkRUNIT19DIiA+JjYKLSAgaWYgdGVzdCAiJHtiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNhZGRyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzY3NyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03Njg4LDE2ICs5MTc0LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NjkxOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3Njk0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc2OTc6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzcwMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90PXllcwotIGVsc2UKLUBAIC03NzExLDI1ICs5MTk3LDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2FkZHJfdCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfUFNBRERSX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzcxOTogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2FkZHJfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2FkZHJfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzcyMjogY2hlY2tpbmcgZm9yIHByc3lzZW50X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJzeXNlbnRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByc3lzZW50X3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDc3MjggImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNzczOSwxNiArOTIzMSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Nzc0MjogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Nzc0NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo3NzQ4OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjc3NTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90PXllcwotIGVsc2UKLUBAIC03NzYyLDI1ICs5MjU0LDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QUlNZU0VOVF9UIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgZmkKLS0gZWNobyAiJGFzX21lOjc3NzA6IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3lzZW50X3QiID4mNgotIAotLSAgZWNobyAiJGFzX21lOjc3NzM6IGNoZWNraW5nIGZvciBwcl9zaWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcl9zaWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByX3NpZ3NldF90IGluIHN5cy9wcm9jZnMuaC4uLiAkRUNIT19DIiA+JjYKLSAgaWYgdGVzdCAiJHtiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnc2V0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzc3OSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03NzkwLDE2ICs5Mjg4LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NzkzOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3Nzk2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc3OTk6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzgwMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ3NldF90PXllcwotIGVsc2UKLUBAIC03ODEzLDI1ICs5MzExLDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdzZXRfdCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfUFJfU0lHU0VUX1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzgyMTogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ3NldF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdzZXRfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdzZXRfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzgyNDogY2hlY2tpbmcgZm9yIHByX3NpZ2FjdGlvbjY0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJfc2lnYWN0aW9uNjRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByX3NpZ2FjdGlvbjY0X3QgaW4gc3lzL3Byb2Nmcy5oLi4uICRFQ0hPX0MiID4mNgotICBpZiB0ZXN0ICIke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdhY3Rpb242NF90K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDc4MzAgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtNzg0MSwxNiArOTM0NSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Nzg0NDogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Nzg0NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo3ODUwOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjc4NTM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdhY3Rpb242NF90PXllcwotIGVsc2UKLUBAIC03ODY0LDI1ICs5MzY4LDMxIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdhY3Rpb242NF90ID0geWVzOyB0aGVuCi0gCi0tY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9QUl9TSUdBQ1RJT042NF9UIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgZmkKLS0gZWNobyAiJGFzX21lOjc4NzI6IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdhY3Rpb242NF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdhY3Rpb242NF90IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ2FjdGlvbjY0X3QiID4mNgotIAotLSAgZWNobyAiJGFzX21lOjc4NzU6IGNoZWNraW5nIGZvciBwcl9zaWdpbmZvNjRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcl9zaWdpbmZvNjRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByX3NpZ2luZm82NF90IGluIHN5cy9wcm9jZnMuaC4uLiAkRUNIT19DIiA+JjYKLSAgaWYgdGVzdCAiJHtiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnaW5mbzY0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzg4MSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03ODkyLDE2ICs5NDAyLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3ODk1OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3ODk4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc5MDE6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6NzkwNDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ2luZm82NF90PXllcwotIGVsc2UKLUBAIC03OTE1LDI0ICs5NDI1LDMyIEBACi0gCi0gIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdpbmZvNjRfdCA9IHllczsgdGhlbgotIAotLWNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfUFJfU0lHSU5GTzY0X1QgMQotLUVPRgotK19BQ0VPRgotIAotICBmaQotLSBlY2hvICIkYXNfbWU6NzkyMzogcmVzdWx0OiAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ2luZm82NF90IiA+JjUKLSsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdpbmZvNjRfdCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdpbmZvNjRfdCIgPiY2Ci0gCi0tICBlY2hvICIkYXNfbWU6NzkyNjogY2hlY2tpbmcgZm9yIHN0cnVjdCBsaW5rX21hcDMyIGluIHN5cy9saW5rLmgiID4mNQotKwotKwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHJ1Y3QgbGlua19tYXAzMiBpbiBzeXMvbGluay5oIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHJ1Y3QgbGlua19tYXAzMiBpbiBzeXMvbGluay5oLi4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHtnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXAzMitzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA3OTMyICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNkZWZpbmUgX1NZU0NBTEwzMgotICNpbmNsdWRlIDxzeXMvbGluay5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC03OTQyLDE2ICs5NDYwLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo3OTQ1OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo3OTQ4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjc5NTE6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6Nzk1NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwMzI9eWVzCi0gZWxzZQotQEAgLTc5NjIsMTcgKzk0ODAsMTkgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLSAgZWNobyAiJGFzX21lOjc5NjU6IHJlc3VsdDogJGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcDMyIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXAzMiIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcDMyIiA+JjYKLSAgIGlmIHRlc3QgJGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcDMyID0geWVzOyB0aGVuCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1NUUlVDVF9MSU5LX01BUDMyIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIGZpCi0gCi0rCi0rCi0gICBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90ID0geWVzOyB0aGVuCi0tICAgIGVjaG8gIiRhc19tZTo3OTc1OiBjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbiIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbiIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbi4uLiAkRUNIT19DIiA+JjYKLSAgICAgaWYgdGVzdCAiJHtnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbitzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC03OTgxLDcgKzk1MDEsNyBAQAotICAgZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW49eWVzCi0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgNzk4NCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotICAgICAgICBpbnQgbWFpbiAoKQotQEAgLTc5OTIsNDkgKzk1MTIsNTcgQEAKLSAgICAgICAgfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjc5OTU6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjc5OTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODAwMDogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4MDAzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbj1ubwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0gZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW49eWVzCi0gZmkKLSBybSAtZiBjb3JlIGNvcmUuKiAqLmNvcmUgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gZmkKLSAKLS0gICAgZWNobyAiJGFzX21lOjgwMTY6IHJlc3VsdDogJGdkYl9jdl9wcmZwcmVnc2V0X3RfYnJva2VuIiA+JjUKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9wcmZwcmVnc2V0X3RfYnJva2VuIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW4iID4mNgotICAgICBpZiB0ZXN0ICRnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbiA9IHllczsgdGhlbgotLSAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFBSRlBSRUdTRVRfVF9CUk9LRU4gMQotLUVPRgotK19BQ0VPRgotIAotICAgICBmaQotICAgZmkKLSAKLS0gIGVjaG8gIiRhc19tZTo4MDI2OiBjaGVja2luZyBmb3IgUElPQ1NFVCBpb2N0bCBlbnRyeSBpbiBzeXMvcHJvY2ZzLmgiID4mNQotKwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgUElPQ1NFVCBpb2N0bCBlbnRyeSBpbiBzeXMvcHJvY2ZzLmguLi4gJEVDSE9fQyIgPiY2Ci0gICBpZiB0ZXN0ICIke2dkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDgwMzIgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHVuaXN0ZC5oPgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC04MDQ3LDE2ICs5NTc1LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo4MDUwOiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4MDUzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjgwNTY6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODA1OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQ9eWVzCi0gZWxzZQotQEAgLTgwNjcsMTIgKzk1OTUsMTIgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLSAgZWNobyAiJGFzX21lOjgwNzA6IHJlc3VsdDogJGdkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0IiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0IiA+JjYKLSAgIGlmIHRlc3QgJGdkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0ID0geWVzOyB0aGVuCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1BST0NGU19QSU9DU0VUIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIGZpCi0gZmkKLUBAIC04MDgzLDcgKzk2MTEsNyBAQAotIAk7OwotICopCi0gCi0tZWNobyAiJGFzX21lOjgwODY6IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbWFpbiBpbiAtbG0uLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9saWJfbV9tYWluK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTgwOTEsOSArOTYxOSwxNiBAQAotICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotIExJQlM9Ii1sbSAgJExJQlMiCi0gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgODA5NCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSsKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtODEwMywxNiArOTYzOCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgxMDY6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgxMDk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4MTEyOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgxMTU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2xpYl9tX21haW49eWVzCi0gZWxzZQotQEAgLTgxMjMsMTIgKzk2NTgsMTIgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0tZWNobyAiJGFzX21lOjgxMjY6IHJlc3VsdDogJGFjX2N2X2xpYl9tX21haW4iID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfbV9tYWluIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX21fbWFpbiIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfbGliX21fbWFpbiA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgSEFWRV9MSUJNIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIExJQlM9Ii1sbSAkTElCUyIKLSAKLUBAIC04MTM5LDE1ICs5Njc0LDIxIEBACi0gCi0gaWYgdGVzdCAke2hvc3R9ID0gJHt0YXJnZXR9IDsgdGhlbgotIAotLSAgZWNobyAiJGFzX21lOjgxNDI6IGNoZWNraW5nIGZvciBtZW1iZXIgbF9hZGRyIGluIHN0cnVjdCBsaW5rX21hcCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1lbWJlciBsX2FkZHIgaW4gc3RydWN0IGxpbmtfbWFwIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtZW1iZXIgbF9hZGRyIGluIHN0cnVjdCBsaW5rX21hcC4uLiAkRUNIT19DIiA+JjYKLSAgIGlmIHRlc3QgIiR7Z2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbF9tZW1iZXJzK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDgxNDggImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpbmsuaD4KLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtODE1NywxNiArOTY5OCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODE2MDogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODE2MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4MTY2OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgxNjk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcF93aXRoX2xfbWVtYmVycz15ZXMKLSBlbHNlCi1AQCAtODE3NywyNSArOTcxOCwzMiBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tICBlY2hvICIkYXNfbWU6ODE4MDogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbF9tZW1iZXJzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXBfd2l0aF9sX21lbWJlcnMiID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXBfd2l0aF9sX21lbWJlcnMiID4mNgotICAgaWYgdGVzdCAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbF9tZW1iZXJzID0geWVzOyB0aGVuCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1NUUlVDVF9MSU5LX01BUF9XSVRIX0xfTUVNQkVSUyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICBmaQotIAotLSAgZWNobyAiJGFzX21lOjgxODk6IGNoZWNraW5nIGZvciBtZW1iZXIgbG1fYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiID4mNQotKwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtZW1iZXIgbG1fYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1lbWJlciBsbV9hZGRyIGluIHN0cnVjdCBsaW5rX21hcC4uLiAkRUNIT19DIiA+JjYKLSAgIGlmIHRlc3QgIiR7Z2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbG1fbWVtYmVycytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA4MTk1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaW5jbHVkZSA8bGluay5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC04MjA1LDE2ICs5NzUzLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo4MjA4OiBcIiRhY19jb21waWxlXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSAgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4MjExOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjgyMTQ6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODIxNzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbG1fbWVtYmVycz15ZXMKLSBlbHNlCi1AQCAtODIyNSwyOCArOTc3MywzNSBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tICBlY2hvICIkYXNfbWU6ODIyODogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbG1fbWVtYmVycyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbG1fbWVtYmVycyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcF93aXRoX2xtX21lbWJlcnMiID4mNgotICAgaWYgdGVzdCAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbG1fbWVtYmVycyA9IHllczsgdGhlbgotLSAgICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfTElOS19NQVBfV0lUSF9MTV9NRU1CRVJTIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIGZpCi0gCi0tICBlY2hvICIkYXNfbWU6ODIzNzogY2hlY2tpbmcgZm9yIG1lbWJlciBzb21fYWRkciBpbiBzdHJ1Y3Qgc29fbWFwIiA+JjUKLSsKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbWVtYmVyIHNvbV9hZGRyIGluIHN0cnVjdCBzb19tYXAiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1lbWJlciBzb21fYWRkciBpbiBzdHJ1Y3Qgc29fbWFwLi4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHtnZGJfY3ZfaGF2ZV9zdHJ1Y3Rfc29fbWFwX3dpdGhfc29tX21lbWJlcnMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgODI0MyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2lmZGVmIEhBVkVfTkxJU1RfSAotICNpbmNsdWRlIDxubGlzdC5oPgotICNlbmRpZgotICNpbmNsdWRlIDxsaW5rLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTgyNTYsMTYgKzk4MTEsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgyNTk6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgyNjI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODI2NTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4MjY4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3ZfaGF2ZV9zdHJ1Y3Rfc29fbWFwX3dpdGhfc29tX21lbWJlcnM9eWVzCi0gZWxzZQotQEAgLTgyNzYsMjUgKzk4MzEsMzIgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLSAgZWNobyAiJGFzX21lOjgyNzk6IHJlc3VsdDogJGdkYl9jdl9oYXZlX3N0cnVjdF9zb19tYXBfd2l0aF9zb21fbWVtYmVycyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfc3RydWN0X3NvX21hcF93aXRoX3NvbV9tZW1iZXJzIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kZ2RiX2N2X2hhdmVfc3RydWN0X3NvX21hcF93aXRoX3NvbV9tZW1iZXJzIiA+JjYKLSAgIGlmIHRlc3QgJGdkYl9jdl9oYXZlX3N0cnVjdF9zb19tYXBfd2l0aF9zb21fbWVtYmVycyA9IHllczsgdGhlbgotLSAgICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfU09fTUFQX1dJVEhfU09NX01FTUJFUlMgMQotLUVPRgotK19BQ0VPRgotIAotICAgZmkKLSAKLS0gIGVjaG8gIiRhc19tZTo4Mjg4OiBjaGVja2luZyBmb3Igc3RydWN0IGxpbmtfbWFwMzIgaW4gc3lzL2xpbmsuaCIgPiY1Ci0rCi0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCBsaW5rX21hcDMyIGluIHN5cy9saW5rLmgiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBsaW5rX21hcDMyIGluIHN5cy9saW5rLmguLi4gJEVDSE9fQyIgPiY2Ci0gICBpZiB0ZXN0ICIke2dkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcDMyK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDgyOTQgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi0gI2luY2x1ZGUgPHN5cy9saW5rLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTgzMDQsMTYgKzk4NjYsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgzMDc6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgzMTA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODMxMzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4MzE2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXAzMj15ZXMKLSBlbHNlCi1AQCAtODMyNCwyMSArOTg4NiwyMSBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tICBlY2hvICIkYXNfbWU6ODMyNzogcmVzdWx0OiAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwMzIiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcDMyIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwMzIiID4mNgotICAgaWYgdGVzdCAkZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwMzIgPSB5ZXM7IHRoZW4KLS0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLSsgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfU1RSVUNUX0xJTktfTUFQMzIgMQotLUVPRgotK19BQ0VPRgotIAotLSAgICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgX1NZU0NBTEwzMiAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICBmaQotIGZpCi0gCi0tZWNobyAiJGFzX21lOjgzNDE6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWxjIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9saWJfY193Y3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtODM0Niw3ICs5OTA4LDcgQEAKLSAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLSBMSUJTPSItbGMgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDgzNDkgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC04MzU2LDYgKzk5MTgsMTIgQEAKLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSBjaGFyIHdjdHlwZSAoKTsKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtODM2NSwxNiArOTkzMywxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgzNjg6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgzNzE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4Mzc0OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjgzNzc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2xpYl9jX3djdHlwZT15ZXMKLSBlbHNlCi1AQCAtODM4NSwxMyArOTk1MywxMyBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi0gZmkKLS1lY2hvICIkYXNfbWU6ODM4ODogcmVzdWx0OiAkYWNfY3ZfbGliX2Nfd2N0eXBlIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2Nfd2N0eXBlIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2Nfd2N0eXBlIiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9saWJfY193Y3R5cGUgPSB5ZXM7IHRoZW4KLSAgIDoKLSBlbHNlCi0gCi0tZWNobyAiJGFzX21lOjgzOTQ6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWx3IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHciID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHcuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9saWJfd193Y3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtODM5OSw3ICs5OTY3LDcgQEAKLSAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLSBMSUJTPSItbHcgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDg0MDIgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC04NDA5LDYgKzk5NzcsMTIgQEAKLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSBjaGFyIHdjdHlwZSAoKTsKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtODQxOCwxNiArOTk5MiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjg0MjE6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjg0MjQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4NDI3OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjg0MzA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2xpYl93X3djdHlwZT15ZXMKLSBlbHNlCi1AQCAtODQzOCwxMiArMTAwMTIsMTIgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0tZWNobyAiJGFzX21lOjg0NDE6IHJlc3VsdDogJGFjX2N2X2xpYl93X3djdHlwZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl93X3djdHlwZSIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl93X3djdHlwZSIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfbGliX3dfd2N0eXBlID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBIQVZFX0xJQlcgMQotLUVPRgotK19BQ0VPRgotIAotICAgTElCUz0iLWx3ICRMSUJTIgotIAotQEAgLTg0NTEsMTUgKzEwMDI1LDIzIEBACi0gCi0gZmkKLSAKLS1lY2hvICIkYXNfbWU6ODQ1NDogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKLSsKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2dkYl9jdl9jX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA4NDYwICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC04NDcyLDE2ICsxMDA1NCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODQ3NTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODQ3ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4NDgxOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjg0ODQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9jX2xvbmdfbG9uZz15ZXMKLSBlbHNlCi1AQCAtODQ5MiwxNiArMTAwNzQsMTcgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWVjaG8gIiRhc19tZTo4NDk1OiByZXN1bHQ6ICRnZGJfY3ZfY19sb25nX2xvbmciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRnZGJfY3ZfY19sb25nX2xvbmciID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3ZfY19sb25nX2xvbmciID4mNgotIGlmIHRlc3QgJGdkYl9jdl9jX2xvbmdfbG9uZyA9IHllczsgdGhlbgotLSAgY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBDQ19IQVNfTE9OR19MT05HIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gIiRhc19tZTo4NTA0OiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7Z2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTg1MTAsNyArMTAwOTMsNyBAQAotICAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nPW5vCi0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgODUxMyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbiAoKSB7Ci1AQCAtODUyNSwyMSArMTAxMDgsMjIgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODUyODogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODUzMTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4NTMzOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjg1MzY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz15ZXMKLSBlbHNlCi0gICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rKCBleGl0ICRhY19zdGF0dXMgKQotIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz1ubwotIGZpCi0gcm0gLWYgY29yZSBjb3JlLiogKi5jb3JlIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUBAIC04NTQ3LDEyICsxMDEzMSwxMiBAQAotIGZpCi0gCi0gaWYgdGVzdCAkZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFBSSU5URl9IQVNfTE9OR19MT05HIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotLWVjaG8gIiRhc19tZTo4NTU1OiByZXN1bHQ6ICRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmciID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmciID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmciID4mNgotIAotICMgQVBQTEUgTE9DQUw6IEhhcmQgY29kZSBsb25nIGRvdWJsZSB0byAnbm8nIGJlY2F1c2UgZ2NjIGxpa2VzIHRvIGNvbXBsYWluCi1AQCAtODU3NCw3ICsxMDE1OCw4IEBACi0gIyAgQUNfREVGSU5FKEhBVkVfTE9OR19ET1VCTEUpCi0gI2ZpCi0gCi0tZWNobyAiJGFzX21lOjg1Nzc6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZStzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC04NTgzLDcgKzEwMTY4LDcgQEAKLSAgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlPW5vCi0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgODU4NiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbiAoKSB7Ci1AQCAtODU5NCwyMSArMTAxNzksMjIgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODU5NzogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODYwMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo4NjAyOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjg2MDU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0gZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGU9bm8KLSBmaQotIHJtIC1mIGNvcmUgY29yZS4qICouY29yZSBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1AQCAtODYxNywxNSArMTAyMDMsMTYgQEAKLSAKLSBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT1ubwotIGlmIHRlc3QgJGdkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFBSSU5URl9IQVNfTE9OR19ET1VCTEUgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0tZWNobyAiJGFzX21lOjg2MjU6IHJlc3VsdDogJGdkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGUiID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZSIgPiY2Ci0gCi0tZWNobyAiJGFzX21lOjg2Mjg6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHNjYW5mIiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHtnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTg2MzQsNyArMTAyMjEsNyBAQAotICAgZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZT1ubwotIGVsc2UKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDg2MzcgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4gKCkgewotQEAgLTg2NDUsMjEgKzEwMjMyLDIyIEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjg2NDg6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjg2NTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODY1MzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4NjU2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0gZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZT1ubwotIGZpCi0gcm0gLWYgY29yZSBjb3JlLiogKi5jb3JlIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUBAIC04NjY4LDM0ICsxMDI1Niw3NCBAQAotIAotIGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGU9bm8KLSBpZiB0ZXN0ICRnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFNDQU5GX0hBU19MT05HX0RPVUJMRSAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLS1lY2hvICIkYXNfbWU6ODY3NjogcmVzdWx0OiAkZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZSIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGUiID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlIiA+JjYKLSAKLSsKLSsKLSBmb3IgYWNfaGVhZGVyIGluIHN0ZGxpYi5oIHVuaXN0ZC5oCi0gZG8KLSBhc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLS1lY2hvICIkYXNfbWU6ODY4MjogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKLSBpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2ZpCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKLSBlbHNlCi0tICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA4Njg4ICJjb25maWd1cmUiCi0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIChldmFsICRhY190cnkpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2FjX2hlYWRlcl9jb21waWxlcj1ubwotK2ZpCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Ci0rCi0rIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODY5MjogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLSAgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKLSAgIGFjX3N0YXR1cz0kPwotICAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICAgcm0gLWYgY29uZnRlc3QuZXIxCi0gICBjYXQgY29uZnRlc3QuZXJyID4mNQotLSAgZWNobyAiJGFzX21lOjg2OTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotQEAgLTg3MDYsMzQgKzEwMzM0LDYyIEBACi0gICBhY19jcHBfZXJyPXllcwotIGZpCi0gaWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCi0tICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIGV2YWwgIiRhc19hY19IZWFkZXI9bm8iCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYyBpbgotKyAgeWVzOm5vICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotKyAgbm86eWVzICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9OzsKLStlc2FjCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgotK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj0kYWNfaGVhZGVyX3ByZXByb2MiCi0gZmkKLS1lY2hvICIkYXNfbWU6ODcxNzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKLSsKLStmaQotIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0rCi0gZG9uZQotIAotKwotIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi0gZG8KLSBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotLWVjaG8gIiRhc19tZTo4NzMwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotIGlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgODczNiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LiAgKi8KLUBAIC04NzQ3LDYgKzEwNDAzLDEyIEBACi0gY2hhciAkYWNfZnVuYyAoKTsKLSBjaGFyICgqZikgKCk7Ci0gCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTg3NjQsMTYgKzEwNDI2LDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODc2NzogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODc3MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjg3NzM6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODc3NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTg3ODMsMTcgKzEwNDQ1LDE3IEBACi0gZmkKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYXNfbWU6ODc4NjogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotIGVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKLSBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSBkb25lCi0gCi0tZWNobyAiJGFzX21lOjg3OTY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTg4MDIsOSArMTA0NjQsMTIgQEAKLSAgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLSBlbHNlCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA4ODA1ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICRhY19pbmNsdWRlc19kZWZhdWx0Ci0rLyogbWFsbG9jIG1pZ2h0IGhhdmUgYmVlbiByZW5hbWVkIGFzIHJwbF9tYWxsb2MuICovCi0rI3VuZGVmIG1hbGxvYwotKwotIC8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotIAltbWFwIHByaXZhdGUgbm90IGZpeGVkCi1AQCAtODgyMCw3ICsxMDQ4NSw3IEBACi0gICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGUgc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLS0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLSsgICBwcm9wYWdhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLSAKLSAgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLUBAIC04OTI5LDQwICsxMDU5NCw0MiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo4OTMyOiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo4OTM1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjg5Mzc6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODk0MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLSBlbHNlCi0gICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rKCBleGl0ICRhY19zdGF0dXMgKQotIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLSBmaQotIHJtIC1mIGNvcmUgY29yZS4qICouY29yZSBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSBmaQotLWVjaG8gIiRhc19tZTo4OTUyOiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNgotIGlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAKLS1jYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX01NQVAgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gcm0gLWYgY29uZnRlc3QubW1hcAotIAotKwotIGNhc2UgJHtob3N0X29zfSBpbgotIGFpeCopCi0tICBlY2hvICIkYXNfbWU6ODk2NTogY2hlY2tpbmcgZm9yIC1iYmlndG9jIG9wdGlvbiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC1iYmlndG9jIG9wdGlvbiIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLWJiaWd0b2Mgb3B0aW9uLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7Z2RiX2N2X2JpZ3RvYytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC04OTc3LDkgKzEwNjQ0LDE1IEBACi0gCi0gICAgIExERkxBR1M9JExERkxBR1NcICRnZGJfY3ZfYmlndG9jCi0gICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDg5ODAgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTg5ODksMTYgKzEwNjYyLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODk5MjogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6ODk5NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjg5OTg6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6OTAwMTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgOgotIGVsc2UKLUBAIC05MDA5LDUxICsxMDY4Miw1MyBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAKLSBmaQotLWVjaG8gIiRhc19tZTo5MDEyOiByZXN1bHQ6ICRnZGJfY3ZfYmlndG9jIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ2RiX2N2X2JpZ3RvYyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9iaWd0b2MiID4mNgotICAgQ09ORklHX0xERkxBR1M9IiR7Q09ORklHX0xERkxBR1N9ICR7Z2RiX2N2X2JpZ3RvY30iCi0gICA7OwotIGVzYWMKLSAKLSsKLSsKLSBpZiB0ZXN0ICR7YnVpbGR9ID0gJHtob3N0fSAmJiB0ZXN0ICR7aG9zdH0gPSAke3RhcmdldH0gOyB0aGVuCi0gICAgY2FzZSAke2hvc3Rfb3N9IGluCi0gICAgaHB1eCopCi0tICAgICAgZWNobyAiJGFzX21lOjkwMjE6IGNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIgPiY1Ci0rICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQuLi4gJEVDSE9fQyIgPiY2Ci0gICAgICAgaWYgdGVzdCAtZiAvdXNyL2luY2x1ZGUvZGNlL2NtYV9jb25maWcuaCA7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiIDsgdGhlbgotLSAgICAgICAgICAgIGVjaG8gIiRhc19tZTo5MDI1OiByZXN1bHQ6IHllcyIgPiY1Ci0rICAgICAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLSBlY2hvICIke0VDSE9fVH15ZXMiID4mNgotLSAgICAgICAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgICAgICAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfSFBVWF9USFJFQURfU1VQUE9SVCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICAgICAgICAgICAgQ09ORklHX0xJQl9PQlM9IiR7Q09ORklHX0xJQl9PQlN9IGhwdXgtdGhyZWFkLm8iCi0gICAgICAgICAgICAgQ09ORklHX1NSQ1M9IiR7Q09ORklHX1NSQ1N9IGhwdXgtdGhyZWFkLmMiCi0gCSAgICBDT05GSUdfSU5JVFM9IiR7Q09ORklHX0lOSVRTfSBocHV4LXRocmVhZC5jIgotICAgICAgICAgIGVsc2UKLS0gICAgICAgICAgICBlY2hvICIkYXNfbWU6OTAzNTogcmVzdWx0OiBubyAoc3VwcHJlc3NlZCBiZWNhdXNlIHlvdSBhcmUgbm90IHVzaW5nIEdDQykiID4mNQotKyAgICAgICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIChzdXBwcmVzc2VkIGJlY2F1c2UgeW91IGFyZSBub3QgdXNpbmcgR0NDKSIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8gKHN1cHByZXNzZWQgYmVjYXVzZSB5b3UgYXJlIG5vdCB1c2luZyBHQ0MpIiA+JjYKLSAgICAgICAgICBmaQotICAgICAgIGVsc2UKLS0gICAgICAgICBlY2hvICIkYXNfbWU6OTAzOTogcmVzdWx0OiBubyIgPiY1Ci0rICAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSAgICAgICBmaQotICAgICAgIDs7Ci0gICAgc29sYXJpcyopCi0tICAgICAgZWNobyAiJGFzX21lOjkwNDQ6IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1Ci0rICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgU29sYXJpcyB0aHJlYWQgZGVidWdnaW5nIGxpYnJhcnkuLi4gJEVDSE9fQyIgPiY2Ci0gICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28uMSA7IHRoZW4KLS0gICAgICAgICBlY2hvICIkYXNfbWU6OTA0NzogcmVzdWx0OiB5ZXMiID4mNQotKyAgICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLS0gICAgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgICAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX1RIUkVBRF9EQl9MSUIgMQotLUVPRgotK19BQ0VPRgotIAotICAgICAgICAgIENPTkZJR19MSUJfT0JTPSIke0NPTkZJR19MSUJfT0JTfSBzb2wtdGhyZWFkLm8iCi0gICAgICAgICAgQ09ORklHX1NSQ1M9IiR7Q09ORklHX1NSQ1N9IHNvbC10aHJlYWQuYyIKLSAKLS1lY2hvICIkYXNfbWU6OTA1NjogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtOTA2MSw3ICsxMDczNiw3IEBACi0gICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi0gTElCUz0iLWxkbCAgJExJQlMiCi0gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgOTA2NCAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotQEAgLTkwNzEsNiArMTA3NDYsMTIgQEAKLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSBjaGFyIGRsb3BlbiAoKTsKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtOTA4MCwxNiArMTA3NjEsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo5MDgzOiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5MDg2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTA4OTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5MDkyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9saWJfZGxfZGxvcGVuPXllcwotIGVsc2UKLUBAIC05MTAwLDEyICsxMDc4MSwxMiBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi0gZmkKLS1lY2hvICIkYXNfbWU6OTEwMzogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9saWJfZGxfZGxvcGVuID0geWVzOyB0aGVuCi0tICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBIQVZFX0xJQkRMIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIExJQlM9Ii1sZGwgJExJQlMiCi0gCi1AQCAtOTExNSwxMyArMTA3OTYsMTkgQEAKLSAgICAgICAgICAgICAjIFRoZSBHTlUgbGlua2VyIHJlcXVpcmVzIHRoZSAtZXhwb3J0LWR5bmFtaWMgb3B0aW9uIHRvIG1ha2UKLSAgICAgICAgICAgICAjIGFsbCBzeW1ib2xzIHZpc2libGUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICAgICAgICAgIGhvbGRfbGRmbGFncz0kTERGTEFHUwotLSAgICAgICAgICAgIGVjaG8gIiRhc19tZTo5MTE4OiBjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnIiA+JjUKLSsgICAgICAgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnLi4uICRFQ0hPX0MiID4mNgotICAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLVdsLC1leHBvcnQtZHluYW1pYyIKLSAgICAgICAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA5MTIyICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC05MTMxLDE2ICsxMDgxOCwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjkxMzQ6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjkxMzc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo5MTQwOiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjkxNDM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGZvdW5kPXllcwotIGVsc2UKLUBAIC05MTUwLDcgKzEwODM3LDcgQEAKLSBmaQotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICAgICAgICAgICBMREZMQUdTPSRob2xkX2xkZmxhZ3MKLS0gICAgICAgICAgICBlY2hvICIkYXNfbWU6OTE1MzogcmVzdWx0OiAkZm91bmQiID4mNQotKyAgICAgICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRmb3VuZCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGZvdW5kIiA+JjYKLSAgICAgICAgICAgICBpZiB0ZXN0ICRmb3VuZCA9IHllczsgdGhlbgotICAgICAgICAgICAgICAgIENPTkZJR19MREZMQUdTPSIke0NPTkZJR19MREZMQUdTfSAtV2wsLWV4cG9ydC1keW5hbWljIgotQEAgLTkxNTgsMjAgKzEwODQ1LDI2IEBACi0gICAgICAgICAgZmkKLSAJICMgU3VuIHJhbmRvbWx5IHR3ZWFrZWQgdGhlIHByb3RvdHlwZXMgaW4gPHByb2Nfc2VydmljZS5oPgotIAkgIyBhdCBvbmUgcG9pbnQuCi0tCSBlY2hvICIkYXNfbWU6OTE2MTogY2hlY2tpbmcgaWYgPHByb2Nfc2VydmljZS5oPiBpcyBvbGQiID4mNQotKwkgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIDxwcm9jX3NlcnZpY2UuaD4gaXMgb2xkIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIDxwcm9jX3NlcnZpY2UuaD4gaXMgb2xkLi4uICRFQ0hPX0MiID4mNgotIAkgaWYgdGVzdCAiJHtnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gCi0gCSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA5MTY4ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIAkJI2luY2x1ZGUgPHByb2Nfc2VydmljZS5oPgotIAkJcHNfZXJyX2UgcHNfcGR3cml0ZQotIAkJICAgIChzdHJ1Y3QgcHNfcHJvY2hhbmRsZSosIHBzYWRkcl90LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtOTE4MSwxNiArMTA4NzQsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjkxODQ6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjkxODc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTE5MDogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5MTkzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZD1ubwotIGVsc2UKLUBAIC05MjAyLDE2ICsxMDg5NSwxNiBAQAotIAotIGZpCi0gCi0tCSBlY2hvICIkYXNfbWU6OTIwNTogcmVzdWx0OiAkZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQiID4mNQotKwkgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQiID4mNgotIAkgaWYgdGVzdCAkZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQgPSB5ZXM7IHRoZW4KLS0JICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rCSAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgUFJPQ19TRVJWSUNFX0lTX09MRCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gCSBmaQotICAgICAgIGVsc2UKLS0gICAgICAgICBlY2hvICIkYXNfbWU6OTIxNDogcmVzdWx0OiBubyIgPiY1Ci0rICAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotIGVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLSAgICAgICBmaQotICAgICAgIDs7Ci1AQCAtOTIxOSw2ICsxMDkxMiw3IEBACi0gCi0gZmkKLSAKLSsKLSAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZ2RiY2xpIG9yIC0tZGlzYWJsZS1nZGJjbGkgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX2dkYmNsaStzZXR9IiA9IHNldDsgdGhlbgotICAgZW5hYmxldmFsPSIkZW5hYmxlX2dkYmNsaSIKLUBAIC05MjI3LDEyICsxMDkyMSwxMiBAQAotICAgICB5ZXMpIGVuYWJsZV9nZGJjbGk9eWVzIDs7Ci0gICAgICIiKSBlbmFibGVfZ2RiY2xpPXllcyA7OwotICAgICBubykKLS0gICAgICB7IHsgZWNobyAiJGFzX21lOjkyMzA6IGVycm9yOiBUaGUgQ0xJIGNhbm5vdCBiZSBkaXNhYmxlZCB5ZXQiID4mNQotKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFRoZSBDTEkgY2Fubm90IGJlIGRpc2FibGVkIHlldCIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogVGhlIENMSSBjYW5ub3QgYmUgZGlzYWJsZWQgeWV0IiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICA7OwotICAgICAqKQotLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6OTIzNTogZXJyb3I6IEJhZCB2YWx1ZSBmb3IgLS1lbmFibGUtZ2RiY2xpOiAke2VuYWJsZXZhbH0iID4mNQotKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEJhZCB2YWx1ZSBmb3IgLS1lbmFibGUtZ2RiY2xpOiAke2VuYWJsZXZhbH0iID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IEJhZCB2YWx1ZSBmb3IgLS1lbmFibGUtZ2RiY2xpOiAke2VuYWJsZXZhbH0iID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgIDs7Ci1AQCAtOTI1Nyw2ICsxMDk1MSw3IEBACi0gICAgIDs7Ci0gZXNhYwotIAotKwotICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1nZGJtaSBvciAtLWRpc2FibGUtZ2RibWkgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX2dkYm1pK3NldH0iID0gc2V0OyB0aGVuCi0gICBlbmFibGV2YWw9IiRlbmFibGVfZ2RibWkiCi1AQCAtOTI2NSw3ICsxMDk2MCw3IEBACi0gICAgIHllcyB8IG5vKSA7OwotICAgICAiIikgIGVuYWJsZV9nZGJtaT15ZXMgOzsKLSAgICAgKikKLS0gICAgICB7IHsgZWNobyAiJGFzX21lOjkyNjg6IGVycm9yOiBCYWQgdmFsdWUgZm9yIC0tZW5hYmxlLWdkYm1pOiAke2VuYWJsZXZhbH0iID4mNQotKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEJhZCB2YWx1ZSBmb3IgLS1lbmFibGUtZ2RibWk6ICR7ZW5hYmxldmFsfSIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogQmFkIHZhbHVlIGZvciAtLWVuYWJsZS1nZGJtaTogJHtlbmFibGV2YWx9IiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICA7OwotQEAgLTkyOTUsMTkgKzEwOTkwLDIxIEBACi0gCi0gVUlPVVRfQ0ZMQUdTPQotIAotKwotKwotICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdWlvdXQgb3IgLS13aXRob3V0LXVpb3V0IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfdWlvdXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIHdpdGh2YWw9IiR3aXRoX3Vpb3V0IgotICAgY2FzZSAiJHt3aXRodmFsfSIgaW4KLSAgIHllcykgIHdhbnRfdWlvdXQ9dHJ1ZSA7OwotICAgbm8pICAgaWYgdGVzdCAkZW5hYmxlX2dkYm1pID0geWVzOyB0aGVuCi0tICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6OTMwNDogZXJyb3I6IHVpb3V0IGlzIG5lZWRlZCBmb3IgTUkgYW5kIGNhbm5vdCBiZSBkaXNhYmxlZCIgPiY1Ci0rICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVpb3V0IGlzIG5lZWRlZCBmb3IgTUkgYW5kIGNhbm5vdCBiZSBkaXNhYmxlZCIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogdWlvdXQgaXMgbmVlZGVkIGZvciBNSSBhbmQgY2Fubm90IGJlIGRpc2FibGVkIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgd2FudF91aW91dD1mYWxzZQotICAgICAgICAgZmkgOzsKLS0gICopICAgIHsgeyBlY2hvICIkYXNfbWU6OTMxMDogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBHREIgd2l0aC11aW91dCBvcHRpb24iID4mNQotKyAgKikgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEdEQiB3aXRoLXVpb3V0IG9wdGlvbiIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEdEQiB3aXRoLXVpb3V0IG9wdGlvbiIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKLSBlc2FjCi1AQCAtOTMyNiw3ICsxMTAyMyw3IEBACi0gICAgIHllcyB8IG5vKSA7OwotICAgICAiIikgIGVuYWJsZV90dWk9eWVzIDs7Ci0gICAgICopCi0tICAgICAgeyB7IGVjaG8gIiRhc19tZTo5MzI5OiBlcnJvcjogQmFkIHZhbHVlIGZvciAtLWVuYWJsZS10dWk6ICR7ZW5hYmxldmFsfSIgPiY1Ci0rICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQmFkIHZhbHVlIGZvciAtLWVuYWJsZS10dWk6ICR7ZW5hYmxldmFsfSIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogQmFkIHZhbHVlIGZvciAtLWVuYWJsZS10dWk6ICR7ZW5hYmxldmFsfSIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICAgOzsKLUBAIC05MzU1LDcgKzExMDUyLDcgQEAKLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSB5ZXMpCWVuYWJsZV9uZXRyb209eWVzIDs7Ci0gbm8pCWVuYWJsZV9uZXRyb209bm8gOzsKLS0qKQl7IHsgZWNobyAiJGFzX21lOjkzNTg6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciBuZXRyb20gb3B0aW9uIiA+JjUKLSsqKQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciBuZXRyb20gb3B0aW9uIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciBuZXRyb20gb3B0aW9uIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OwotIGVzYWMKLUBAIC05MzY3LDYgKzExMDY0LDcgQEAKLSAJQ09ORklHX0lOSVRTPSIke0NPTkZJR19JTklUU30gcmVtb3RlLW5yb20uYyIKLSBmaQotIAotKwotICMgTk9URTogRG9uJ3QgYWRkIC1XYWxsIG9yIC1XdW51c2VkLCB0aGV5IGJvdGggaW5jbHVkZQotICMgLVd1bnVzZWQtcGFyYW1ldGVyIHdoaWNoIHJlcG9ydHMgYm9ndXMgd2FybmluZ3MuCi0gIyBOT1RFOiBJZiB5b3UgYWRkIHRvIHRoaXMgbGlzdCwgcmVtZW1iZXIgdG8gdXBkYXRlCi1AQCAtOTQxMyw3ICsxMTExMSw3IEBACi0gV0VSUk9SX0NGTEFHUz0iIgotIGlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcwotIHRoZW4KLS0gICAgZWNobyAiJGFzX21lOjk0MTY6IGNoZWNraW5nIGNvbXBpbGVyIHdhcm5pbmcgZmxhZ3MiID4mNQotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgY29tcGlsZXIgd2FybmluZyBmbGFncyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzLi4uICRFQ0hPX0MiID4mNgotICAgICAjIFNlcGFyYXRlIG91dCB0aGUgLVdlcnJvciBmbGFnIGFzIHNvbWUgZmlsZXMganVzdCBjYW5ub3QgYmUKLSAgICAgIyBjb21waWxlZCB3aXRoIGl0IGVuYWJsZWQuCi1AQCAtOTQyNCw5ICsxMTEyMiwxNSBAQAotIAkgICAgc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotIAkgICAgQ0ZMQUdTPSIkQ0ZMQUdTICR3IgotIAkgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgOTQyNyAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtOTQzNiwxNiArMTExNDAsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjk0Mzk6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk0NDI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTQ0NTogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5NDQ4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBXQVJOX0NGTEFHUz0iJHtXQVJOX0NGTEFHU30gJHciCi0gZWxzZQotQEAgLTk0NTYsMjAgKzExMTYwLDI1IEBACi0gCSAgICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCi0gCWVzYWMKLSAgICAgZG9uZQotLSAgICBlY2hvICIkYXNfbWU6OTQ1OTogcmVzdWx0OiAke1dBUk5fQ0ZMQUdTfSR7V0VSUk9SX0NGTEFHU30iID4mNQotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAke1dBUk5fQ0ZMQUdTfSR7V0VSUk9SX0NGTEFHU30iID4mNQotIGVjaG8gIiR7RUNIT19UfSR7V0FSTl9DRkxBR1N9JHtXRVJST1JfQ0ZMQUdTfSIgPiY2Ci0gZmkKLSAKLSsKLSsKLSBNTUFMTE9DX0NGTEFHUz0KLSBNTUFMTE9DPQotIAotKwotKwotKwotICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbW1hbGxvYyBvciAtLXdpdGhvdXQtbW1hbGxvYyB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHt3aXRoX21tYWxsb2Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIHdpdGh2YWw9IiR3aXRoX21tYWxsb2MiCi0gICBjYXNlICIke3dpdGh2YWx9IiBpbgotICAgeWVzKSAgd2FudF9tbWFsbG9jPXRydWUgOzsKLSAgIG5vKSAgIHdhbnRfbW1hbGxvYz1mYWxzZTs7Ci0tICAqKSAgICB7IHsgZWNobyAiJGFzX21lOjk0NzI6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgR0RCIHdpdGgtbW1hbGxvYyBvcHRpb24iID4mNQotKyAgKikgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEdEQiB3aXRoLW1tYWxsb2Mgb3B0aW9uIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgR0RCIHdpdGgtbW1hbGxvYyBvcHRpb24iID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0gZXNhYwotQEAgLTk0NzcsMjUgKzExMTg2LDI2IEBACi0gICB3YW50X21tYWxsb2M9dHJ1ZQotIGZpOwotIGlmIHRlc3QgeCR3YW50X21tYWxsb2MgPSB4dHJ1ZTsgdGhlbgotLSAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFVTRV9NTUFMTE9DIDEKLS1FT0YKLStfQUNFT0YKLSAKLS0gICBjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgotKyAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBNTUNIRUNLX0ZPUkNFIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgICBNTUFMTE9DX0NGTEFHUz0iLUkkc3JjZGlyLy4uL21tYWxsb2MiCi0gICAgTU1BTExPQz0nLi4vbW1hbGxvYy9saWJtbWFsbG9jLmEnCi0gZmkKLSAKLSsKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLXJlZ2V4IG9yIC0td2l0aG91dC1pbmNsdWRlZC1yZWdleCB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX3JlZ2V4K3NldH0iID0gc2V0OyB0aGVuCi0gICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9yZWdleCIKLSAgIGNhc2UgIiR7d2l0aHZhbH0iIGluCi0gICB5ZXMpICB3YW50X2luY2x1ZGVkX3JlZ2V4PXRydWUgOzsKLSAgIG5vKSAgIHdhbnRfaW5jbHVkZWRfcmVnZXg9ZmFsc2U7OwotLSAgKikgICAgeyB7IGVjaG8gIiRhc19tZTo5NDk4OiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEdEQiB3aXRoLWluY2x1ZGVkLXJlZ2V4IG9wdGlvbiIgPiY1Ci0rICAqKSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgR0RCIHdpdGgtaW5jbHVkZWQtcmVnZXggb3B0aW9uIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgR0RCIHdpdGgtaW5jbHVkZWQtcmVnZXggb3B0aW9uIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OwotIGVzYWMKLUBAIC05NTAzLDE3ICsxMTIxMywyMyBAQAotICAgd2FudF9pbmNsdWRlZF9yZWdleD10cnVlCi0gZmk7Ci0gaWYgdGVzdCAkd2FudF9pbmNsdWRlZF9yZWdleCA9IGZhbHNlOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6OTUwNjogY2hlY2tpbmcgZm9yIEdOVSByZWdleCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEdOVSByZWdleCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgR05VIHJlZ2V4Li4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHtnZGJfY3ZfaGF2ZV9nbnVfcmVnZXgrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgOTUxMiAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxyZWdleC5oPgotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC05NTI2LDE2ICsxMTI0MiwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTUyOTogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6OTUzMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo5NTM1OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk1Mzg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGdkYl9jdl9oYXZlX2dudV9yZWdleD15ZXMKLSBlbHNlCi1AQCAtOTU0Niw3ICsxMTI2Miw3IEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSAKLS0gIGVjaG8gIiRhc19tZTo5NTQ5OiByZXN1bHQ6ICRnZGJfY3ZfaGF2ZV9nbnVfcmVnZXgiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9oYXZlX2dudV9yZWdleCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGdkYl9jdl9oYXZlX2dudV9yZWdleCIgPiY2Ci0gICBpZiB0ZXN0ICRnZGJfY3ZfaGF2ZV9nbnVfcmVnZXggPSBubzsgdGhlbgotIAl3YW50X2luY2x1ZGVkX3JlZ2V4PXRydWUKLUBAIC05NTU1LDIwICsxMTI3MSwyMSBAQAotIAotIGlmIHRlc3QgeCR7d2FudF9pbmNsdWRlZF9yZWdleH0gPSB4dHJ1ZTsgdGhlbgotICAgICBSRUdFWD0iZ251LXJlZ2V4Lm8iCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcRU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBVU0VfSU5DTFVERURfUkVHRVggMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0rCi0gIyBJbiB0aGUgQ3lnd2luIGVudmlyb25tZW50LCB3ZSBuZWVkIHNvbWUgYWRkaXRpb25hbCBmbGFncy4KLS1lY2hvICIkYXNfbWU6OTU2NTogY2hlY2tpbmcgZm9yIGN5Z3dpbiIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjeWd3aW4iID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGN5Z3dpbi4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2dkYl9jdl9vc19jeWd3aW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgOTU3MSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotQEAgLTk1ODQsMTUgKzExMzAxLDE4IEBACi0gcm0gLWYgY29uZnRlc3QqCi0gCi0gZmkKLS1lY2hvICIkYXNfbWU6OTU4NzogcmVzdWx0OiAkZ2RiX2N2X29zX2N5Z3dpbiIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdkYl9jdl9vc19jeWd3aW4iID4mNQotIGVjaG8gIiR7RUNIT19UfSRnZGJfY3Zfb3NfY3lnd2luIiA+JjYKLSAKLSsKLSBTRVJfSEFSRFdJUkU9InNlci11bml4Lm8gc2VyLXBpcGUubyBzZXItdGNwLm8iCi0gY2FzZSAke2hvc3R9IGluCi0gICAqZ28zMiogKSBTRVJfSEFSRFdJUkU9c2VyLWdvMzIubyA7OwotICAgKmRqZ3BwKiApIFNFUl9IQVJEV0lSRT1zZXItZ28zMi5vIDs7Ci0gZXNhYwotIAotKwotKwotIGNhc2UgIiRnZGJfaG9zdCIgaW4KLSAiZ28zMiIpIFRFUk1fTElCPSA7OwotICJyaGFwc29keSIpIFRFUk1fTElCPSA7OwotQEAgLTk2MDIsNyArMTEzMjIsNyBAQAotICAgICBURVJNX0xJQj0nYGlmIHRlc3QgLXIgLi4vbGlidGVybWNhcC9saWJ0ZXJtY2FwLmE7IHRoZW4gZWNobyAuLi9saWJ0ZXJtY2FwL2xpYnRlcm1jYXAuYTsgZWxzZSBlY2hvIC1sdGVybWNhcDsgZmlgJwotICAgZWxzZQotICAgICBURVJNX0xJQj0KLS0gICAgZWNobyAiJGFzX21lOjk2MDU6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sbmN1cnNlcyIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbG5jdXJzZXMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfbGliX25jdXJzZXNfdGdldGVudCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC05NjEwLDcgKzExMzMwLDcgQEAKLSAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLSBMSUJTPSItbG5jdXJzZXMgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDk2MTMgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC05NjIwLDYgKzExMzQwLDEyIEBACi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0gY2hhciB0Z2V0ZW50ICgpOwotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC05NjI5LDE2ICsxMTM1NSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjk2MzI6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk2MzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo5NjM4OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk2NDE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2xpYl9uY3Vyc2VzX3RnZXRlbnQ9eWVzCi0gZWxzZQotQEAgLTk2NDksMTIgKzExMzc1LDEyIEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLSBmaQotLWVjaG8gIiRhc19tZTo5NjUyOiByZXN1bHQ6ICRhY19jdl9saWJfbmN1cnNlc190Z2V0ZW50IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX25jdXJzZXNfdGdldGVudCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9uY3Vyc2VzX3RnZXRlbnQiID4mNgotIGlmIHRlc3QgJGFjX2N2X2xpYl9uY3Vyc2VzX3RnZXRlbnQgPSB5ZXM7IHRoZW4KLSAgIFRFUk1fTElCPS1sbmN1cnNlcwotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo5NjU3OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sSGN1cnNlcyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9saWJfSGN1cnNlc190Z2V0ZW50K3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotQEAgLTk2NjIsNyArMTEzODgsNyBAQAotICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotIExJQlM9Ii1sSGN1cnNlcyAgJExJQlMiCi0gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0tI2xpbmUgOTY2NSAiY29uZmlndXJlIgotKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotQEAgLTk2NzIsNiArMTEzOTgsMTIgQEAKLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSBjaGFyIHRnZXRlbnQgKCk7Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTk2ODEsMTYgKzExNDEzLDE2IEBACi0gfQotIF9BQ0VPRgotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTY4NDogXCIkYWNfbGlua1wiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gICAoZXZhbCAkYWNfbGluaykgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6OTY4NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjk2OTA6IFwiJGFjX3RyeVwiIikgPiY1Ci0rICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICAgYWNfc3RhdHVzPSQ/Ci0tICBlY2hvICIkYXNfbWU6OTY5MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgYWNfY3ZfbGliX0hjdXJzZXNfdGdldGVudD15ZXMKLSBlbHNlCi1AQCAtOTcwMSwxMiArMTE0MzMsMTIgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0tZWNobyAiJGFzX21lOjk3MDQ6IHJlc3VsdDogJGFjX2N2X2xpYl9IY3Vyc2VzX3RnZXRlbnQiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfSGN1cnNlc190Z2V0ZW50IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX0hjdXJzZXNfdGdldGVudCIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfbGliX0hjdXJzZXNfdGdldGVudCA9IHllczsgdGhlbgotICAgVEVSTV9MSUI9LWxIY3Vyc2VzCi0gZWxzZQotLSAgZWNobyAiJGFzX21lOjk3MDk6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWxpYiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtbGliIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWxpYi4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X2xpYl90ZXJtbGliX3RnZXRlbnQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtOTcxNCw3ICsxMTQ0Niw3IEBACi0gICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi0gTElCUz0iLWx0ZXJtbGliICAkTElCUyIKLSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA5NzE3ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi1AQCAtOTcyNCw2ICsxMTQ1NiwxMiBAQAotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotIGNoYXIgdGdldGVudCAoKTsKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtOTczMywxNiArMTE0NzEsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo5NzM2OiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5NzM5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTc0MjogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5NzQ1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9saWJfdGVybWxpYl90Z2V0ZW50PXllcwotIGVsc2UKLUBAIC05NzUzLDEyICsxMTQ5MSwxMiBAQAotIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi0gZmkKLS1lY2hvICIkYXNfbWU6OTc1NjogcmVzdWx0OiAkYWNfY3ZfbGliX3Rlcm1saWJfdGdldGVudCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl90ZXJtbGliX3RnZXRlbnQiID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdGVybWxpYl90Z2V0ZW50IiA+JjYKLSBpZiB0ZXN0ICRhY19jdl9saWJfdGVybWxpYl90Z2V0ZW50ID0geWVzOyB0aGVuCi0gICBURVJNX0xJQj0tbHRlcm1saWIKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6OTc2MTogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwLi4uICRFQ0hPX0MiID4mNgotIGlmIHRlc3QgIiR7YWNfY3ZfbGliX3Rlcm1jYXBfdGdldGVudCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC05NzY2LDcgKzExNTA0LDcgQEAKLSAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLSBMSUJTPSItbHRlcm1jYXAgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDk3NjkgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC05Nzc2LDYgKzExNTE0LDEyIEBACi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0gY2hhciB0Z2V0ZW50ICgpOwotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC05Nzg1LDE2ICsxMTUyOSwxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjk3ODg6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk3OTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo5Nzk0OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk3OTc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2xpYl90ZXJtY2FwX3RnZXRlbnQ9eWVzCi0gZWxzZQotQEAgLTk4MDUsMTIgKzExNTQ5LDEyIEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLSBmaQotLWVjaG8gIiRhc19tZTo5ODA4OiByZXN1bHQ6ICRhY19jdl9saWJfdGVybWNhcF90Z2V0ZW50IiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3Rlcm1jYXBfdGdldGVudCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl90ZXJtY2FwX3RnZXRlbnQiID4mNgotIGlmIHRlc3QgJGFjX2N2X2xpYl90ZXJtY2FwX3RnZXRlbnQgPSB5ZXM7IHRoZW4KLSAgIFRFUk1fTElCPS1sdGVybWNhcAotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo5ODEzOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbGN1cnNlcyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMuLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9saWJfY3Vyc2VzX3RnZXRlbnQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1AQCAtOTgxOCw3ICsxMTU2Miw3IEBACi0gICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi0gTElCUz0iLWxjdXJzZXMgICRMSUJTIgotIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDk4MjEgImNvbmZpZ3VyZSIKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLUBAIC05ODI4LDYgKzExNTcyLDEyIEBACi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0gY2hhciB0Z2V0ZW50ICgpOwotKyNpZmRlZiBGNzdfRFVNTVlfTUFJTgotKyMgIGlmZGVmIF9fY3BsdXNwbHVzCi0rICAgICBleHRlcm4gIkMiCi0rIyAgZW5kaWYKLSsgICBpbnQgRjc3X0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Ci0rI2VuZGlmCi0gaW50Ci0gbWFpbiAoKQotIHsKLUBAIC05ODM3LDE2ICsxMTU4NywxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjk4NDA6IFwiJGFjX2xpbmtcIiIpID4mNQotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk4NDM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0tICB7IChldmFsIGVjaG8gIiRhc19tZTo5ODQ2OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjk4NDk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIGFjX2N2X2xpYl9jdXJzZXNfdGdldGVudD15ZXMKLSBlbHNlCi1AQCAtOTg1NywxMiArMTE2MDcsMTIgQEAKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0tZWNobyAiJGFzX21lOjk4NjA6IHJlc3VsdDogJGFjX2N2X2xpYl9jdXJzZXNfdGdldGVudCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jdXJzZXNfdGdldGVudCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9jdXJzZXNfdGdldGVudCIgPiY2Ci0gaWYgdGVzdCAkYWNfY3ZfbGliX2N1cnNlc190Z2V0ZW50ID0geWVzOyB0aGVuCi0gICBURVJNX0xJQj0tbGN1cnNlcwotIGVsc2UKLS0gIGVjaG8gIiRhc19tZTo5ODY1OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWluZm8uLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9saWJfdGVybWluZm9fdGdldGVudCtzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLUBAIC05ODcwLDcgKzExNjIwLDcgQEAKLSAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLSBMSUJTPSItbHRlcm1pbmZvICAkTElCUyIKLSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSA5ODczICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi1AQCAtOTg4MCw2ICsxMTYzMCwxMiBAQAotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotIGNoYXIgdGdldGVudCAoKTsKLSsjaWZkZWYgRjc3X0RVTU1ZX01BSU4KLSsjICBpZmRlZiBfX2NwbHVzcGx1cwotKyAgICAgZXh0ZXJuICJDIgotKyMgIGVuZGlmCi0rICAgaW50IEY3N19EVU1NWV9NQUlOKCkgeyByZXR1cm4gMTsgfQotKyNlbmRpZgotIGludAotIG1haW4gKCkKLSB7Ci1AQCAtOTg4OSwxNiArMTE2NDUsMTYgQEAKLSB9Ci0gX0FDRU9GCi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLS1pZiB7IChldmFsIGVjaG8gIiRhc19tZTo5ODkyOiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5ODk1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0gICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JwotLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6OTg5ODogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZTo5OTAxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9saWJfdGVybWluZm9fdGdldGVudD15ZXMKLSBlbHNlCi1AQCAtOTkwOSw3ICsxMTY2NSw3IEBACi0gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLSBmaQotLWVjaG8gIiRhc19tZTo5OTEyOiByZXN1bHQ6ICRhY19jdl9saWJfdGVybWluZm9fdGdldGVudCIgPiY1Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl90ZXJtaW5mb190Z2V0ZW50IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3Rlcm1pbmZvX3RnZXRlbnQiID4mNgotIGlmIHRlc3QgJGFjX2N2X2xpYl90ZXJtaW5mb190Z2V0ZW50ID0geWVzOyB0aGVuCi0gICBURVJNX0xJQj0tbHRlcm1pbmZvCi1AQCAtOTkyNiw3ICsxMTY4Miw3IEBACi0gZmkKLSAKLSAgICAgaWYgdGVzdCAieCRURVJNX0xJQiIgPSB4OyB0aGVuCi0tICAgICAgeyB7IGVjaG8gIiRhc19tZTo5OTI5OiBlcnJvcjogQ291bGQgbm90IGZpbmQgYSB0ZXJtIGxpYnJhcnkiID4mNQotKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IENvdWxkIG5vdCBmaW5kIGEgdGVybSBsaWJyYXJ5IiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBDb3VsZCBub3QgZmluZCBhIHRlcm0gbGlicmFyeSIgPiYyO30KLSAgICB7IChleGl0IGUuZy4gdGVybWNhcCBvciB0ZXJtbGliISk7IGV4aXQgZS5nLiB0ZXJtY2FwIG9yIHRlcm1saWIhOyB9OyB9Ci0gICAgIGZpCi1AQCAtOTkzNCw2ICsxMTY5MCw3IEBACi0gICA7OwotIGVzYWMKLSAKLSsKLSAjIGxpYnJlYWRsaW5lIG5lZWRzIGxpYnVzZXIzMi5hIGluIGEgY3lnd2luIGVudmlyb25tZW50Ci0gV0lOMzJMSUJTPQotIGlmIHRlc3QgeCRnZGJfY3Zfb3NfY3lnd2luID0geHllczsgdGhlbgotQEAgLTk5NDQsOSArMTE3MDEsMTMgQEAKLSAgICAgZXNhYwotIGZpCi0gCi0rCi0gTElCR1VJPSIuLi9saWJndWkvc3JjL2xpYmd1aS5hIgotIEdVSV9DRkxBR1NfWD0iLUkke3NyY2Rpcn0vLi4vbGliZ3VpL3NyYyIKLSAKLSsKLSsKLSsKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNwdSBvciAtLXdpdGhvdXQtY3B1IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfY3B1K3NldH0iID0gc2V0OyB0aGVuCi0gICB3aXRodmFsPSIkd2l0aF9jcHUiCi1AQCAtOTk3MCwyMyArMTE3MzEsMjUgQEAKLSAJd2l0aF9jcHU9NjA0Ci0gICAgICAgOzsKLSAgICAgICAqICkKLS0gICAgICAgIHsgZWNobyAiJGFzX21lOjk5NzM6IFdBUk5JTkc6IEdEQjogdW5rbm93biAtLXdpdGgtY3B1IHZhbHVlOiBcYCR7d2l0aF9jcHV9JzsgdXNpbmcgXGBwcGMtdWlzYScuIiA+JjUKLSsgICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEdEQjogdW5rbm93biAtLXdpdGgtY3B1IHZhbHVlOiBcYCR7d2l0aF9jcHV9JzsgdXNpbmcgXGBwcGMtdWlzYScuIiA+JjUKLSBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEdEQjogdW5rbm93biAtLXdpdGgtY3B1IHZhbHVlOiBcYCR7d2l0aF9jcHV9JzsgdXNpbmcgXGBwcGMtdWlzYScuIiA+JjI7fQotIAl3aXRoX2NwdT1wcGMtdWlzYQotICAgICAgIDs7Ci0gICAgIGVzYWMKLSAgIDs7Ci0gICAqICkKLS0gICAgeyBlY2hvICIkYXNfbWU6OTk4MDogV0FSTklORzogR0RCIG1heSBpZ25vcmUgdGhlIC0td2l0aC1jcHUgZmxhZyBmb3IgJHt0YXJnZXR9IHRhcmdldHMiID4mNQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBHREIgbWF5IGlnbm9yZSB0aGUgLS13aXRoLWNwdSBmbGFnIGZvciAke3RhcmdldH0gdGFyZ2V0cyIgPiY1Ci0gZWNobyAiJGFzX21lOiBXQVJOSU5HOiBHREIgbWF5IGlnbm9yZSB0aGUgLS13aXRoLWNwdSBmbGFnIGZvciAke3RhcmdldH0gdGFyZ2V0cyIgPiYyO30KLSAgIDs7Ci0gZXNhYwotLWNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLStjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBUQVJHRVRfQ1BVX0RFRkFVTFQgIiR7d2l0aF9jcHV9IgotLUVPRgotK19BQ0VPRgotKwotIAotIGZpOwotIAotKwotICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1nZGJ0ayBvciAtLWRpc2FibGUtZ2RidGsgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX2dkYnRrK3NldH0iID0gc2V0OyB0aGVuCi0gICBlbmFibGV2YWw9IiRlbmFibGVfZ2RidGsiCi1AQCAtOTk5NCwxMSArMTE3NTcsMTEgQEAKLSAgICAgeWVzKQotIAljYXNlICIkaG9zdCIgaW4KLSAJKmdvMzIqKQotLQkgICAgeyBlY2hvICIkYXNfbWU6OTk5NzogV0FSTklORzogR0RCIGRvZXMgbm90IHN1cHBvcnQgR0RCdGsgb24gaG9zdCAke2hvc3R9LiAgR0RCdGsgd2lsbCBiZSBkaXNhYmxlZC4iID4mNQotKwkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogR0RCIGRvZXMgbm90IHN1cHBvcnQgR0RCdGsgb24gaG9zdCAke2hvc3R9LiAgR0RCdGsgd2lsbCBiZSBkaXNhYmxlZC4iID4mNQotIGVjaG8gIiRhc19tZTogV0FSTklORzogR0RCIGRvZXMgbm90IHN1cHBvcnQgR0RCdGsgb24gaG9zdCAke2hvc3R9LiAgR0RCdGsgd2lsbCBiZSBkaXNhYmxlZC4iID4mMjt9Ci0gCSAgICBlbmFibGVfZ2RidGs9bm8gOzsKLSAJKndpbmRvd3MqKQotLQkgICAgeyBlY2hvICIkYXNfbWU6MTAwMDE6IFdBUk5JTkc6IEdEQiBkb2VzIG5vdCBzdXBwb3J0IEdEQnRrIG9uIGhvc3QgJHtob3N0fS4gIEdEQnRrIHdpbGwgYmUgZGlzYWJsZWQuIiA+JjUKLSsJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEdEQiBkb2VzIG5vdCBzdXBwb3J0IEdEQnRrIG9uIGhvc3QgJHtob3N0fS4gIEdEQnRrIHdpbGwgYmUgZGlzYWJsZWQuIiA+JjUKLSBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEdEQiBkb2VzIG5vdCBzdXBwb3J0IEdEQnRrIG9uIGhvc3QgJHtob3N0fS4gIEdEQnRrIHdpbGwgYmUgZGlzYWJsZWQuIiA+JjI7fQotIAkgICAgZW5hYmxlX2dkYnRrPW5vIDs7Ci0gCSopCi1AQCAtMTAwMDcsNyArMTE3NzAsNyBAQAotICAgICBubykKLSAJZW5hYmxlX2dkYnRrPW5vICA7OwotICAgICAqKQotLQl7IHsgZWNobyAiJGFzX21lOjEwMDEwOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgZ2RidGsgb3B0aW9uIiA+JjUKLSsJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgZ2RidGsgb3B0aW9uIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciBnZGJ0ayBvcHRpb24iID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0gZXNhYwotQEAgLTEwMDI4LDYgKzExNzkxLDggQEAKLSAKLSBXSU4zMkxEQVBQPQotIAotKwotKwotIGNvbmZpZ2Rpcj0idW5peCIKLSAKLSBHREJUS0xJQlM9Ci1AQCAtMTAwNDAsNiArMTE4MDUsNyBAQAotICAgICBHREJUS19TUkNfRElSPWBwd2RgCi0gICAgIGNkICRoZXJlCi0gCi0rCi0gIwotICMgT2ssIGxldHMgZmluZCB0aGUgdGNsIGNvbmZpZ3VyYXRpb24KLSAjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuCi1AQCAtMTAwNTUsMTggKzExODIxLDE5IEBACi0gICB3aXRodmFsPSIkd2l0aF90Y2xjb25maWciCi0gICB3aXRoX3RjbGNvbmZpZz0ke3dpdGh2YWx9Ci0gZmk7Ci0tICBlY2hvICIkYXNfbWU6MTAwNTg6IGNoZWNraW5nIGZvciBUY2wgY29uZmlndXJhdGlvbiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFRjbCBjb25maWd1cmF0aW9uIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBUY2wgY29uZmlndXJhdGlvbi4uLiAkRUNIT19DIiA+JjYKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfY190Y2xjb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotIAotKwotICAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgaWYgdGVzdCB4IiR7d2l0aF90Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGNsY29uZmlnfS90Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHt3aXRoX3RjbGNvbmZpZ307IHB3ZClgCi0gICAgIGVsc2UKLS0gICAgICB7IHsgZWNobyAiJGFzX21lOjEwMDY5OiBlcnJvcjogJHt3aXRoX3RjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0Y2xDb25maWcuc2giID4mNQotKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICR7d2l0aF90Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGNsQ29uZmlnLnNoIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiAke3dpdGhfdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRjbENvbmZpZy5zaCIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICAgZmkKLUBAIC0xMDExMiwxMiArMTE4NzksMTIgQEAKLSAKLSAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICBUQ0xDT05GSUc9IiMgbm8gVGNsIGNvbmZpZ3MgZm91bmQiCi0tICAgIHsgZWNobyAiJGFzX21lOjEwMTE1OiBXQVJOSU5HOiBDYW4ndCBmaW5kIFRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjUKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FuJ3QgZmluZCBUY2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyIgPiY1Ci0gZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYW4ndCBmaW5kIFRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjI7fQotICAgZWxzZQotICAgICBub190Y2w9Ci0gICAgIFRDTENPTkZJRz0ke2FjX2N2X2NfdGNsY29uZmlnfS90Y2xDb25maWcuc2gKLS0gICAgZWNobyAiJGFzX21lOjEwMTIwOiByZXN1bHQ6IGZvdW5kICRUQ0xDT05GSUciID4mNQotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBmb3VuZCAkVENMQ09ORklHIiA+JjUKLSBlY2hvICIke0VDSE9fVH1mb3VuZCAkVENMQ09ORklHIiA+JjYKLSAgIGZpCi0gZmkKLUBAIC0xMDEyNiw2ICsxMTg5MywzMSBAQAotIAotICAgICAuICRUQ0xDT05GSUcKLSAKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSsKLSAjCi0gIyBPaywgbGV0cyBmaW5kIHRoZSB0ayBjb25maWd1cmF0aW9uCi0gIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLgotQEAgLTEwMTQxLDE4ICsxMTkzMywxOSBAQAotICAgd2l0aHZhbD0iJHdpdGhfdGtjb25maWciCi0gICB3aXRoX3RrY29uZmlnPSR7d2l0aHZhbH0KLSBmaTsKLS0gIGVjaG8gIiRhc19tZToxMDE0NDogY2hlY2tpbmcgZm9yIFRrIGNvbmZpZ3VyYXRpb24iID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBUayBjb25maWd1cmF0aW9uIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBUayBjb25maWd1cmF0aW9uLi4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHthY19jdl9jX3RrY29uZmlnK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAKLSsKLSAgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2NvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgaWYgdGVzdCB4IiR7d2l0aF90a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90a2NvbmZpZ30vdGtDb25maWcuc2giIDsgdGhlbgotICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAke3dpdGhfdGtjb25maWd9OyBwd2QpYAotICAgICBlbHNlCi0tICAgICAgeyB7IGVjaG8gIiRhc19tZToxMDE1NTogZXJyb3I6ICR7d2l0aF90a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0a0NvbmZpZy5zaCIgPiY1Ci0rICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJHt3aXRoX3RrY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRrQ29uZmlnLnNoIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiAke3dpdGhfdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGtDb25maWcuc2giID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgIGZpCi1AQCAtMTAxOTgsMTYgKzExOTkxLDE4IEBACi0gCi0gICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICBUS0NPTkZJRz0iIyBubyBUayBjb25maWdzIGZvdW5kIgotLSAgICB7IGVjaG8gIiRhc19tZToxMDIwMTogV0FSTklORzogQ2FuJ3QgZmluZCBUayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjUKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FuJ3QgZmluZCBUayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjUKLSBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbid0IGZpbmQgVGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyIgPiYyO30KLSAgIGVsc2UKLSAgICAgbm9fdGs9Ci0gICAgIFRLQ09ORklHPSR7YWNfY3ZfY190a2NvbmZpZ30vdGtDb25maWcuc2gKLS0gICAgZWNobyAiJGFzX21lOjEwMjA2OiByZXN1bHQ6IGZvdW5kICRUS0NPTkZJRyIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kICRUS0NPTkZJRyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9Zm91bmQgJFRLQ09ORklHIiA+JjYKLSAgIGZpCi0gZmkKLSAKLSsKLSsKLSAJIyBub3cgbG9vayBmb3IgVGNsIGxpYnJhcnkgc3R1ZmYKLSAKLSAJY2FzZSAiJHtob3N0fSIgaW4KLUBAIC0xMDIyOSw2ICsxMjAyNCwxOSBAQAotICAgICAgIC4gJFRLQ09ORklHCi0gICAgIGZpCi0gCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0gIwotICMgT2ssIGxldHMgZmluZCB0aGUgdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi0gIyBXYXJuaW5nOiB0cmFuc2l0aW9uIG9mIHZlcnNpb24gOSB0byAxMCB3aWxsIGJyZWFrIHRoaXMgYWxnb3JpdGhtCi1AQCAtMTAyMzgsNyArMTIwNDYsNyBAQAotICMKLSAKLSBub190Y2w9dHJ1ZQotLWVjaG8gIiRhc19tZToxMDI0MTogY2hlY2tpbmcgZm9yIFRjbCBwcml2YXRlIGhlYWRlcnMuIGRpcj0ke2NvbmZpZ2Rpcn0iID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfSIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfS4uLiAkRUNIT19DIiA+JjYKLSAKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjbGluY2x1ZGUgb3IgLS13aXRob3V0LXRjbGluY2x1ZGUgd2FzIGdpdmVuLgotQEAgLTEwMjU3LDcgKzEyMDY1LDcgQEAKLSAgIGVsaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYy90Y2xJbnQuaCA7IHRoZW4KLSAgICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCi0gICBlbHNlCi0tICAgIHsgeyBlY2hvICIkYXNfbWU6MTAyNjA6IGVycm9yOiAke3dpdGhfdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAke3dpdGhfdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGhlYWRlcnMiID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6ICR7d2l0aF90Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHByaXZhdGUgaGVhZGVycyIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgIGZpCi1AQCAtMTAzMDUsMjMgKzEyMTEzLDYxIEBACi0gZmkKLSAjIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi0gaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotLSAgIGVjaG8gIiRhc19tZToxMDMwODogY2hlY2tpbmcgZm9yIHRjbEludC5oIiA+JjUKLSsgICBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl90Y2xJbnRfaCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0Y2xJbnQuaCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGNsSW50LmguLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfdGNsSW50X2grc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZmkKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RjbEludF9oIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RjbEludF9oIiA+JjYKLSBlbHNlCi0tICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS0jbGluZSAxMDMxNCAiY29uZmlndXJlIgotKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRjbEludC5oIHVzYWJpbGl0eSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB0Y2xJbnQuaCB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPHRjbEludC5oPgotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKLSsgIChldmFsICRhY19jb21waWxlKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0rICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKLSsgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0rICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSthY19oZWFkZXJfY29tcGlsZXI9bm8KLStmaQotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgotKwotKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB0Y2xJbnQuaCBwcmVzZW5jZSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB0Y2xJbnQuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHRjbEludC5oPgotIF9BQ0VPRgotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjEwMzE4OiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0raWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQotICAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQotICAgYWNfc3RhdHVzPSQ/Ci0gICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gICBybSAtZiBjb25mdGVzdC5lcjEKLSAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0tICBlY2hvICIkYXNfbWU6MTAzMjQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgotICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZwotQEAgLTEwMzMyLDQ2ICsxMjE3OCw3NiBAQAotICAgYWNfY3BwX2Vycj15ZXMKLSBmaQotIGlmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgotLSAgYWNfY3ZfaGVhZGVyX3RjbEludF9oPXllcwotKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gZWxzZQotICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgYWNfY3ZfaGVhZGVyX3RjbEludF9oPW5vCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYyBpbgotKyAgeWVzOm5vICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdGNsSW50Lmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogdGNsSW50Lmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHRjbEludC5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0Y2xJbnQuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9OzsKLSsgIG5vOnllcyApCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHRjbEludC5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogdGNsSW50Lmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdGNsSW50Lmg6IGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0Y2xJbnQuaDogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB0Y2xJbnQuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogdGNsSW50Lmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fTs7Ci0rZXNhYwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGNsSW50LmgiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHRjbEludC5oLi4uICRFQ0hPX0MiID4mNgotK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3RjbEludF9oK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2Vsc2UKLSsgIGFjX2N2X2hlYWRlcl90Y2xJbnRfaD0kYWNfaGVhZGVyX3ByZXByb2MKLSBmaQotLWVjaG8gIiRhc19tZToxMDM0MzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RjbEludF9oIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RjbEludF9oIiA+JjUKLSBlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RjbEludF9oIiA+JjYKLSsKLStmaQotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl90Y2xJbnRfaCA9IHllczsgdGhlbgotICAgYWNfY3ZfY190Y2xoPWluc3RhbGxlZAotIGVsc2UKLSAgIGFjX2N2X2NfdGNsaD0iIgotIGZpCi0gCi0rCi0gZmkKLSAKLSBmaQotIAotIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgIFRDTEhESVI9IiMgbm8gVGNsIHByaXZhdGUgaGVhZGVycyBmb3VuZCIKLS0gIHsgeyBlY2hvICIkYXNfbWU6MTAzNTc6IGVycm9yOiBDYW4ndCBmaW5kIFRjbCBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2FuJ3QgZmluZCBUY2wgcHJpdmF0ZSBoZWFkZXJzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBDYW4ndCBmaW5kIFRjbCBwcml2YXRlIGhlYWRlcnMiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLSBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiAhPSB4IDsgdGhlbgotICAgbm9fdGNsPSIiCi0gICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLS0gICAgZWNobyAiJGFzX21lOjEwMzY0OiByZXN1bHQ6IGlzIGluc3RhbGxlZCIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGlzIGluc3RhbGxlZCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9aXMgaW5zdGFsbGVkIiA+JjYKLSAgICAgVENMSERJUj0iIgotICAgZWxzZQotLSAgICBlY2hvICIkYXNfbWU6MTAzNjg6IHJlc3VsdDogZm91bmQgaW4gJHthY19jdl9jX3RjbGh9IiA+JjUKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogZm91bmQgaW4gJHthY19jdl9jX3RjbGh9IiA+JjUKLSBlY2hvICIke0VDSE9fVH1mb3VuZCBpbiAke2FjX2N2X2NfdGNsaH0iID4mNgotICAgICAjIHRoaXMgaGFjayBpcyBjYXVzZSB0aGUgVENMSERJUiB3b24ndCBwcmludCBpZiB0aGVyZSBpcyBhICItSSIgaW4gaXQuCi0gICAgIFRDTEhESVI9Ii1JJHthY19jdl9jX3RjbGh9IgotICAgZmkKLSBmaQotIAotKwotKwotKwotICMKLSAjIE9rLCBsZXRzIGZpbmQgdGhlIHRrIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi0gIyBJZiB0aGUgZGlyZWN0b3J5IChwcmVzdW1hYmx5IHN5bWxpbmspIG5hbWVkICJ0ayIgZXhpc3RzLCB1c2UgdGhhdCBvbmUKLUBAIC0xMDM4Niw3ICsxMjI2Miw3IEBACi0gIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGtpbmNsdWRlCi0gIwotIG5vX3RrPXRydWUKLS1lY2hvICIkYXNfbWU6MTAzODk6IGNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiID4mNQotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgVGsgcHJpdmF0ZSBoZWFkZXJzIiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMuLi4gJEVDSE9fQyIgPiY2Ci0gCi0gIyBDaGVjayB3aGV0aGVyIC0td2l0aC10a2luY2x1ZGUgb3IgLS13aXRob3V0LXRraW5jbHVkZSB3YXMgZ2l2ZW4uCi1AQCAtMTA0MDUsNyArMTIyODEsNyBAQAotICAgZWxpZiB0ZXN0IC1mICR7d2l0aF90a2luY2x1ZGV9L2dlbmVyaWMvdGsuaCA7IHRoZW4KLSAgICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAotICAgZWxzZQotLSAgICB7IHsgZWNobyAiJGFzX21lOjEwNDA4OiBlcnJvcjogJHt3aXRoX3RraW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAke3dpdGhfdGtpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHByaXZhdGUgaGVhZGVycyIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogJHt3aXRoX3RraW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGhlYWRlcnMiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICBmaQotQEAgLTEwNDUzLDIzICsxMjMyOSw2MSBAQAotIGZpCi0gIyBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotLSAgIGVjaG8gIiRhc19tZToxMDQ1NjogY2hlY2tpbmcgZm9yIHRrLmgiID4mNQotKyAgIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3RrX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGsuaCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGsuaC4uLiAkRUNIT19DIiA+JjYKLSBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl90a19oK3NldH0iID0gc2V0OyB0aGVuCi0gICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2ZpCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90a19oIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RrX2giID4mNgotIGVsc2UKLS0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDEwNDYyICJjb25maWd1cmUiCi0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdGsuaCB1c2FiaWxpdHkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGsuaCB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPHRrLmg+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSsgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSsgIChldmFsICRhY190cnkpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2FjX2hlYWRlcl9jb21waWxlcj1ubwotK2ZpCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Ci0rCi0rIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRrLmggcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGsuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsjbGluZSAkTElORU5PICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHRrLmg+Ci0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTA0NjY6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCi0gICBhY19zdGF0dXM9JD8KLSAgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLS0gIGVjaG8gIiRhc19tZToxMDQ3MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCi0gICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCi1AQCAtMTA0ODAsMjIgKzEyMzk0LDQ5IEBACi0gICBhY19jcHBfZXJyPXllcwotIGZpCi0gaWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCi0tICBhY19jdl9oZWFkZXJfdGtfaD15ZXMKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotIGVsc2UKLSAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIGFjX2N2X2hlYWRlcl90a19oPW5vCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYyBpbgotKyAgeWVzOm5vICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdGsuaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0ay5oOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB0ay5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0ay5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO307OwotKyAgbm86eWVzICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdGsuaDogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHRrLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdGsuaDogY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHRrLmg6IGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdGsuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogdGsuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9OzsKLStlc2FjCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0ay5oIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0ay5oLi4uICRFQ0hPX0MiID4mNgotK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3RrX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgYWNfY3ZfaGVhZGVyX3RrX2g9JGFjX2hlYWRlcl9wcmVwcm9jCi0gZmkKLS1lY2hvICIkYXNfbWU6MTA0OTE6IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90a19oIiA+JjUKLStlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RrX2giID4mNQotIGVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfdGtfaCIgPiY2Ci0rCi0rZmkKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGtfaCA9IHllczsgdGhlbgotICAgYWNfY3ZfY190a2g9aW5zdGFsbGVkCi0gZWxzZQotICAgYWNfY3ZfY190a2g9IiIKLSBmaQotIAotKwotIGZpCi0gCi0gZmkKLUBAIC0xMDUwMywyMyArMTI0NDQsMjYgQEAKLSBpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iICE9IHggOyB0aGVuCi0gICBub190az0iIgotICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLS0gICAgZWNobyAiJGFzX21lOjEwNTA2OiByZXN1bHQ6IGlzIGluc3RhbGxlZCIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGlzIGluc3RhbGxlZCIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9aXMgaW5zdGFsbGVkIiA+JjYKLSAgICAgVEtIRElSPSIiCi0gICBlbHNlCi0tICAgIGVjaG8gIiRhc19tZToxMDUxMDogcmVzdWx0OiBmb3VuZCBpbiAke2FjX2N2X2NfdGtofSIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kIGluICR7YWNfY3ZfY190a2h9IiA+JjUKLSBlY2hvICIke0VDSE9fVH1mb3VuZCBpbiAke2FjX2N2X2NfdGtofSIgPiY2Ci0gICAgICMgdGhpcyBoYWNrIGlzIGNhdXNlIHRoZSBUS0hESVIgd29uJ3QgcHJpbnQgaWYgdGhlcmUgaXMgYSAiLUkiIGluIGl0LgotICAgICBUS0hESVI9Ii1JJHthY19jdl9jX3RraH0iCi0gICBmaQotIGVsc2UKLSAgIFRLSERJUj0iIyBubyBUayBkaXJlY3RvcnkgZm91bmQiCi0tICB7IGVjaG8gIiRhc19tZToxMDUxNzogV0FSTklORzogQ2FuJ3QgZmluZCBUayBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FuJ3QgZmluZCBUayBwcml2YXRlIGhlYWRlcnMiID4mNQotIGVjaG8gIiRhc19tZTogV0FSTklORzogQ2FuJ3QgZmluZCBUayBwcml2YXRlIGhlYWRlcnMiID4mMjt9Ci0gICBub190az10cnVlCi0gZmkKLSAKLS1lY2hvICIkYXNfbWU6MTA1MjI6IGNoZWNraW5nIGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0rCi0rCi0rCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgSXRjbCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0uLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgIGZvciBpIGluICR7c3JjZGlyfS8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi9pdGNsL2l0Y2w7IGRvCi1AQCAtMTA1MzEsNyArMTI0NzUsNyBAQAotIGZpCi0gaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgIElUQ0xIRElSPSIjIG5vIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzIGZvdW5kIgotLSAgeyB7IGVjaG8gIiRhc19tZToxMDUzNDogZXJyb3I6IENhbid0IGZpbmQgSXRjbCBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2FuJ3QgZmluZCBJdGNsIHByaXZhdGUgaGVhZGVycyIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogQ2FuJ3QgZmluZCBJdGNsIHByaXZhdGUgaGVhZGVycyIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBmaQotQEAgLTEwNTQzLDcgKzEyNDg3LDggQEAKLSAKLSAjQUNfU1VCU1QoSVRDTExJQikKLSAKLS1lY2hvICIkYXNfbWU6MTA1NDY6IGNoZWNraW5nIGZvciBJdGsgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0uLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtofSIgPSB4IDsgdGhlbgotICAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrOyBkbwotQEAgLTEwNTU1LDcgKzEyNTAwLDcgQEAKLSBmaQotIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRraH0iID0geCA7IHRoZW4KLSAgIElUS0hESVI9IiMgbm8gSXRrIHByaXZhdGUgaGVhZGVycyBmb3VuZCIKLS0gIHsgeyBlY2hvICIkYXNfbWU6MTA1NTg6IGVycm9yOiBDYW4ndCBmaW5kIEl0ayBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2FuJ3QgZmluZCBJdGsgcHJpdmF0ZSBoZWFkZXJzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBDYW4ndCBmaW5kIEl0ayBwcml2YXRlIGhlYWRlcnMiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLUBAIC0xMDU2Nyw3ICsxMjUxMiw4IEBACi0gCi0gI0FDX1NVQlNUKElUS0xJQikKLSAKLS1lY2hvICIkYXNfbWU6MTA1NzA6IGNoZWNraW5nIGZvciBUaXggcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0uLi4gJEVDSE9fQyIgPiY2Ci0gaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL3RpeCAke3NyY2Rpcn0vLi4vLi4vdGl4ICR7c3JjZGlyfS8uLi8uLi8uLi90aXggOyBkbwotQEAgLTEwNTc5LDcgKzEyNTI1LDcgQEAKLSBmaQotIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KLSAgIFRJWEhESVI9IiMgbm8gVGl4IHByaXZhdGUgaGVhZGVycyBmb3VuZCIKLS0gIHsgeyBlY2hvICIkYXNfbWU6MTA1ODI6IGVycm9yOiBDYW4ndCBmaW5kIFRpeCBwcml2YXRlIGhlYWRlcnMiID4mNQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2FuJ3QgZmluZCBUaXggcHJpdmF0ZSBoZWFkZXJzIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBDYW4ndCBmaW5kIFRpeCBwcml2YXRlIGhlYWRlcnMiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLUBAIC0xMDU4Nyw2ICsxMjUzMyw5IEBACi0gICAgICBUSVhIRElSPSItSSR7YWNfY3ZfY190aXhofSIKLSBmaQotIAotKwotKwotKwotIAkgICAjIG5vdyBsb29rIGZvciBUayBsaWJyYXJ5IHN0dWZmCi0gCi0gCSAgIGNhc2UgIiR7aG9zdH0iIGluCi1AQCAtMTA2MDIsNiArMTI1NTEsNyBAQAotIAotIAkgICAjIG5vdyBsb29rIGZvciBJdGNsIGxpYnJhcnkgc3R1ZmYKLSAKLSsKLSAjCi0gIyBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIGNvbmZpZ3VyYXRpb24KLSAjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuCi1AQCAtMTA2MTcsMTggKzEyNTY3LDE5IEBACi0gICB3aXRodmFsPSIkd2l0aF9pdGNsY29uZmlnIgotICAgd2l0aF9pdGNsY29uZmlnPSR7d2l0aHZhbH0KLSBmaTsKLS0gIGVjaG8gIiRhc19tZToxMDYyMDogY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgSXRjbCBjb25maWd1cmF0aW9uLi4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHthY19jdl9jX2l0Y2xjb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotIAotKwotICAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgIGlmIHRlc3QgeCIke3dpdGhfaXRjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAke3dpdGhfaXRjbGNvbmZpZ307IHB3ZClgCi0gICAgIGVsc2UKLS0gICAgICB7IHsgZWNobyAiJGFzX21lOjEwNjMxOiBlcnJvcjogJHt3aXRoX2l0Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbENvbmZpZy5zaCIgPiY1Ci0rICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJHt3aXRoX2l0Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbENvbmZpZy5zaCIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogJHt3aXRoX2l0Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbENvbmZpZy5zaCIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICAgZmkKLUBAIC0xMDY3NCwxMiArMTI2MjUsMTIgQEAKLSAKLSAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgSVRDTENPTkZJRz0iIyBubyBJdGNsIGNvbmZpZ3MgZm91bmQiCi0tICAgIHsgZWNobyAiJGFzX21lOjEwNjc3OiBXQVJOSU5HOiBDYW4ndCBmaW5kIEl0Y2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyIgPiY1Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhbid0IGZpbmQgSXRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjUKLSBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbid0IGZpbmQgSXRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjI7fQotICAgZWxzZQotICAgICBub19pdGNsPQotICAgICBJVENMQ09ORklHPSR7YWNfY3ZfY19pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoCi0tICAgIGVjaG8gIiRhc19tZToxMDY4MjogcmVzdWx0OiBmb3VuZCAkSVRDTENPTkZJRyIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kICRJVENMQ09ORklHIiA+JjUKLSBlY2hvICIke0VDSE9fVH1mb3VuZCAkSVRDTENPTkZJRyIgPiY2Ci0gICBmaQotIGZpCi1AQCAtMTA2OTAsMTAgKzEyNjQxLDIyIEBACi0gICAgICAgLiAkSVRDTENPTkZJRwotICAgICBmaQotIAotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotIAkgICAgIElUQ0xMSUI9IiR7SVRDTF9CVUlMRF9MSUJfU1BFQ30iCi0gCSAgICAgSVRDTF9ERVBTPSIke0lUQ0xfTElCX0ZVTExfUEFUSH0iCi0gICAgICAgICAgICBmaQotIAotKwotIAkgICAjIG5vdyBsb29rIGZvciBJdGsgbGlicmFyeSBzdHVmZgotIAotICMKLUBAIC0xMDcxMSwxOCArMTI2NzQsMTkgQEAKLSAgIHdpdGh2YWw9IiR3aXRoX2l0a2NvbmZpZyIKLSAgIHdpdGhfaXRrY29uZmlnPSR7d2l0aHZhbH0KLSBmaTsKLS0gIGVjaG8gIiRhc19tZToxMDcxNDogY2hlY2tpbmcgZm9yIEl0ayBjb25maWd1cmF0aW9uIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgSXRrIGNvbmZpZ3VyYXRpb24iID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEl0ayBjb25maWd1cmF0aW9uLi4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHthY19jdl9jX2l0a2NvbmZpZytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gCi0rCi0gICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRrY29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gICBpZiB0ZXN0IHgiJHt3aXRoX2l0a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGtjb25maWd9L2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAke3dpdGhfaXRrY29uZmlnfTsgcHdkKWAKLSAgICAgZWxzZQotLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6MTA3MjU6IGVycm9yOiAke3dpdGhfaXRrY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0a0NvbmZpZy5zaCIgPiY1Ci0rICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJHt3aXRoX2l0a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGtDb25maWcuc2giID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6ICR7d2l0aF9pdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRrQ29uZmlnLnNoIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICBmaQotQEAgLTEwNzY4LDIyICsxMjczMiwzNCBAQAotIAotICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgIElUS0NPTkZJRz0iIyBubyBJdGsgY29uZmlncyBmb3VuZCIKLS0gICAgeyBlY2hvICIkYXNfbWU6MTA3NzE6IFdBUk5JTkc6IENhbid0IGZpbmQgSXRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMiID4mNQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYW4ndCBmaW5kIEl0ayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjUKLSBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbid0IGZpbmQgSXRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMiID4mMjt9Ci0gICBlbHNlCi0gICAgIG5vX2l0az0KLSAgICAgSVRLQ09ORklHPSR7YWNfY3ZfY19pdGtjb25maWd9L2l0a0NvbmZpZy5zaAotLSAgICBlY2hvICIkYXNfbWU6MTA3NzY6IHJlc3VsdDogZm91bmQgJElUS0NPTkZJRyIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kICRJVEtDT05GSUciID4mNQotIGVjaG8gIiR7RUNIT19UfWZvdW5kICRJVEtDT05GSUciID4mNgotICAgZmkKLSBmaQotIAotKwotICAgICAgICAgICAgaWYgdGVzdCAteiAiJHtub19pdGNsfSI7IHRoZW4KLSAKLSAgICAgaWYgdGVzdCAtZiAiJElUS0NPTkZJRyIgOyB0aGVuCi0gICAgICAgLiAkSVRLQ09ORklHCi0gICAgIGZpCi0gCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0gCSAgICAgSVRLTElCPSIke0lUS19CVUlMRF9MSUJfU1BFQ30iCi0gCSAgICAgSVRLX0RFUFM9IiR7SVRLX0xJQl9GVUxMX1BBVEh9IgotICAgICAgICAgICAgZmkKLUBAIC0xMDgwNSwxOCArMTI3ODEsMTkgQEAKLSAgIHdpdGh2YWw9IiR3aXRoX3RpeGNvbmZpZyIKLSAgIHdpdGhfdGl4Y29uZmlnPSR7d2l0aHZhbH0KLSBmaTsKLS0gIGVjaG8gIiRhc19tZToxMDgwODogY2hlY2tpbmcgZm9yIFRpeCBjb25maWd1cmF0aW9uIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgVGl4IGNvbmZpZ3VyYXRpb24iID4mNQotIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIFRpeCBjb25maWd1cmF0aW9uLi4uICRFQ0hPX0MiID4mNgotICAgaWYgdGVzdCAiJHthY19jdl9jX3RpeGNvbmZpZytzZXR9IiA9IHNldDsgdGhlbgotICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gCi0rCi0gICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGl4Y29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gICBpZiB0ZXN0IHgiJHt3aXRoX3RpeGNvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90aXhjb25maWd9L3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAke3dpdGhfdGl4Y29uZmlnfTsgcHdkKWAKLSAgICAgZWxzZQotLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6MTA4MTk6IGVycm9yOiAke3dpdGhfdGl4Y29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRpeENvbmZpZy5zaCIgPiY1Ci0rICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJHt3aXRoX3RpeGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0aXhDb25maWcuc2giID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6ICR7d2l0aF90aXhjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGl4Q29uZmlnLnNoIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICBmaQotQEAgLTEwODY2LDIxICsxMjg0MywyOSBAQAotIAotICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCi0gICAgIFRJWENPTkZJRz0iIyBubyBUaXggY29uZmlncyBmb3VuZCIKLS0gICAgeyBlY2hvICIkYXNfbWU6MTA4Njk6IFdBUk5JTkc6IENhbid0IGZpbmQgVGl4IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMiID4mNQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYW4ndCBmaW5kIFRpeCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIiA+JjUKLSBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbid0IGZpbmQgVGl4IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMiID4mMjt9Ci0gICBlbHNlCi0gICAgIG5vX3RpeD0KLSAgICAgVElYQ09ORklHPSR7YWNfY3ZfY190aXhjb25maWd9L3RpeENvbmZpZy5zaAotLSAgICBlY2hvICIkYXNfbWU6MTA4NzQ6IHJlc3VsdDogZm91bmQgJFRJWENPTkZJRyIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kICRUSVhDT05GSUciID4mNQotIGVjaG8gIiR7RUNIT19UfWZvdW5kICRUSVhDT05GSUciID4mNgotICAgZmkKLSBmaQotIAotLSAgICAgICAgICAgaWYgdGVzdCAteiAiJHtub190aXh9IjsgdGhlbgotIAotLSAgICBpZiB0ZXN0IC1mICIkVElYQ09ORklHIiA7IHRoZW4KLS0gICAgICAuICRUSVhDT05GSUcKLS0gICAgZmkKLSsgICAgICAgICAgIGlmIHRlc3QgLXogIiR7bm9fdGl4fSI7IHRoZW4KLSsKLSsgICAgaWYgdGVzdCAtZiAiJFRJWENPTkZJRyIgOyB0aGVuCi0rICAgICAgLiAkVElYQ09ORklHCi0rICAgIGZpCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0gCi0gCSAgICAgVElYTElCPSIke1RJWF9CVUlMRF9MSUJfU1BFQ30iCi0gCSAgICAgVElYX0RFUFM9IiR7VElYX0JVSUxEX0xPQ0FUSU9OfS8ke1RJWF9MSUJfRklMRX0iCi1AQCAtMTA5MjQsOSArMTI5MDksMjUgQEAKLSAgICAgZmkKLSBmaQotIAotLWVjaG8gIiRhc19tZToxMDkyNzogY2hlY2tpbmcgZm9yIFgiID4mNQotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgWCIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgWC4uLiAkRUNIT19DIiA+JjYKLSAKLSsKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXggb3IgLS13aXRob3V0LXggd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCi0gICB3aXRodmFsPSIkd2l0aF94IgotQEAgLTEwOTUwLDEwICsxMjk1MSwxMCBAQAotIGlmIG1rZGlyIGNvbmZ0ZXN0LmRpcjsgdGhlbgotICAgY2QgY29uZnRlc3QuZGlyCi0gICAjIE1ha2Ugc3VyZSB0byBub3QgcHV0ICJtYWtlIiBpbiB0aGUgSW1ha2VmaWxlIHJ1bGVzLCBzaW5jZSB3ZSBncmVwIGl0IG91dC4KLS0gIGNhdCA+SW1ha2VmaWxlIDw8J0VPRicKLSsgIGNhdCA+SW1ha2VmaWxlIDw8J19BQ0VPRicKLSBhY2ZpbmR4OgotIAlAZWNobyAnYWNfaW1faW5jcm9vdD0iJHtJTkNST09UfSI7IGFjX2ltX3VzcmxpYmRpcj0iJHtVU1JMSUJESVJ9IjsgYWNfaW1fbGliZGlyPSIke0xJQkRJUn0iJwotLUVPRgotK19BQ0VPRgotICAgaWYgKHhta21mKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsICYmIHRlc3QgLWYgTWFrZWZpbGU7IHRoZW4KLSAgICAgIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi0gICAgIGV2YWwgYCR7TUFLRS1tYWtlfSBhY2ZpbmR4IDI+L2Rldi9udWxsIHwgZ3JlcCAtdiBtYWtlYAotQEAgLTExMDIxLDE3ICsxMzAyMiwxNyBAQAotICAgIyBHdWVzcyB3aGVyZSB0byBmaW5kIGluY2x1ZGUgZmlsZXMsIGJ5IGxvb2tpbmcgZm9yIEludHJpbnNpYy5oLgotICAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDExMDI0ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+Ci0gX0FDRU9GCi0taWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTEwMjg6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1Ci0gICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCi0gICBhY19zdGF0dXM9JD8KLSAgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLS0gIGVjaG8gIiRhc19tZToxMTAzNDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCi0gICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCi1AQCAtMTEwNjQsOSArMTMwNjUsMTUgQEAKLSAgIGFjX3NhdmVfTElCUz0kTElCUwotICAgTElCUz0iLWxYdCAkTElCUyIKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLSNsaW5lIDExMDY3ICJjb25maWd1cmUiCi0rI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+Ci0rI2lmZGVmIEY3N19EVU1NWV9NQUlOCi0rIyAgaWZkZWYgX19jcGx1c3BsdXMKLSsgICAgIGV4dGVybiAiQyIKLSsjICBlbmRpZgotKyAgIGludCBGNzdfRFVNTVlfTUFJTigpIHsgcmV0dXJuIDE7IH0KLSsjZW5kaWYKLSBpbnQKLSBtYWluICgpCi0gewotQEAgLTExMDc2LDE2ICsxMzA4MywxNiBAQAotIH0KLSBfQUNFT0YKLSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjExMDc5OiBcIiRhY19saW5rXCIiKSA+JjUKLStpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKLSAgIChldmFsICRhY19saW5rKSAyPiY1Ci0gICBhY19zdGF0dXM9JD8KLS0gIGVjaG8gIiRhc19tZToxMTA4MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLS0gIHsgKGV2YWwgZWNobyAiJGFzX21lOjExMDg1OiBcIiRhY190cnlcIiIpID4mNQotKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgIChldmFsICRhY190cnkpIDI+JjUKLSAgIGFjX3N0YXR1cz0kPwotLSAgZWNobyAiJGFzX21lOjExMDg4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBMSUJTPSRhY19zYXZlX0xJQlMKLSAjIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KLUBAIC0xMTEyMyw3ICsxMzEzMCw3IEBACi0gZmkgIyAkd2l0aF94ICE9IG5vCi0gCi0gaWYgdGVzdCAiJGhhdmVfeCIgIT0geWVzOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6MTExMjY6IHJlc3VsdDogJGhhdmVfeCIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV94IiA+JjUKLSBlY2hvICIke0VDSE9fVH0kaGF2ZV94IiA+JjYKLSAgIG5vX3g9eWVzCi0gZWxzZQotQEAgLTExMTMzLDEwICsxMzE0MCwxMiBAQAotICAgIyBVcGRhdGUgdGhlIGNhY2hlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGNvbW1hbmQgbGluZSB2YWx1ZXMuCi0gICBhY19jdl9oYXZlX3g9ImhhdmVfeD15ZXMgXAotIAkJYWNfeF9pbmNsdWRlcz0keF9pbmNsdWRlcyBhY194X2xpYnJhcmllcz0keF9saWJyYXJpZXMiCi0tICBlY2hvICIkYXNfbWU6MTExMzY6IHJlc3VsdDogbGlicmFyaWVzICR4X2xpYnJhcmllcywgaGVhZGVycyAkeF9pbmNsdWRlcyIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBsaWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiA+JjUKLSBlY2hvICIke0VDSE9fVH1saWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiA+JjYKLSBmaQotIAotKwotKwotICMgVW5saWtlIHRoZSBzaW0gZGlyZWN0b3J5LCB3aGV0aGVyIGEgc2ltdWxhdG9yIGlzIGxpbmtlZCBpcyBjb250cm9sbGVkIGJ5Ci0gIyBwcmVzZW5jZSBvZiBhIFNJTT0gYW5kIGEgU0lNX09CUz0gZGVmaW5pdGlvbiBpbiB0aGUgdGFyZ2V0ICcubXQnIGZpbGUuCi0gIyBUaGlzIGNvZGUganVzdCBjaGVja3MgZm9yIGEgZmV3IGNhc2VzIHdoZXJlIHdlJ2QgbGlrZSB0byBpZ25vcmUgdGhvc2UKLUBAIC0xMTE2OCwxMiArMTMxNzcsMjYgQEAKLSBlbHNlCi0gICAgIElHTk9SRV9TSU09IiIKLSAgICAgSUdOT1JFX1NJTV9PQlM9IiIKLS0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxFT0YKLSsgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIFdJVEhfU0lNIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotKwotICMgQmVnaW4gc3R1ZmYgdG8gc3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQKLSAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotQEAgLTExMjMzLDYgKzEzMjU2LDcgQEAKLSAgICAgOzsKLSBlc2FjCi0gCi0rCi0gIyBFbmQgc3R1ZmYgdG8gc3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQKLSAKLSAjIHRhcmdldF9zdWJkaXIgaXMgdXNlZCBieSB0aGUgdGVzdHN1aXRlIHRvIGZpbmQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AQCAtMTEyNDEsNiArMTMyNjUsNyBAQAotICAgICB0YXJnZXRfc3ViZGlyPSIke3RhcmdldF9hbGlhc30vIgotIGZpCi0gCi0rCi0gZnJhZ3M9Ci0gCi0gaG9zdF9tYWtlZmlsZV9mcmFnPSIke3NyY2Rpcn0vY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2dkYl9ob3N0fS5taCIKLUBAIC0xMTI1Niw3ICsxMzI4MSw3IEBACi0gICAgICMgbGlrZSBOQVRERVBGSUxFUyBpcyBuZWVkZWQuICBDcm9zcyBkZWJ1Z2dlcnMgZG9uJ3QgbmVlZCAubWgKLSAgICAgIyBzaW5jZSBpdCBubyBsb25nZXIgY29udGFpbnMgYW55dGhpbmcgdXNlZnVsLgotICAgICBpZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0tCXsgeyBlY2hvICIkYXNfbWU6MTEyNTk6IGVycm9yOiB1bmFibGUgdG8gbG9jYXRlIGhvc3QgY29uZmlndXJhdGlvbiBmaWxlICR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgPiY1Ci0rCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVuYWJsZSB0byBsb2NhdGUgaG9zdCBjb25maWd1cmF0aW9uIGZpbGUgJHtob3N0X21ha2VmaWxlX2ZyYWd9IiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiB1bmFibGUgdG8gbG9jYXRlIGhvc3QgY29uZmlndXJhdGlvbiBmaWxlICR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICAgZWxzZQotQEAgLTExMjY2LDE0ICsxMzI5MSwxNCBAQAotIGZyYWdzPSIkZnJhZ3MgJGhvc3RfbWFrZWZpbGVfZnJhZyIKLSAKLSBpZiB0ZXN0ICEgLWYgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IjsgdGhlbgotLXsgeyBlY2hvICIkYXNfbWU6MTEyNjk6IGVycm9yOiB1bmFibGUgdG8gbG9jYXRlIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iID4mNQotK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVuYWJsZSB0byBsb2NhdGUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZSAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogdW5hYmxlIHRvIGxvY2F0ZSB0YXJnZXQgY29uZmlndXJhdGlvbiBmaWxlICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGZpCi0gZnJhZ3M9IiRmcmFncyAkdGFyZ2V0X21ha2VmaWxlX2ZyYWciCi0gCi0gaWYgdGVzdCAhIC16ICIke25hdGl2ZV9tYWtlZmlsZV9mcmFnfSIgJiYgdGVzdCAhIC1mICIke25hdGl2ZV9tYWtlZmlsZV9mcmFnfSI7IHRoZW4KLS17IHsgZWNobyAiJGFzX21lOjExMjc2OiBlcnJvcjogdW5hYmxlIHRvIGxvY2F0ZSBuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZSAke25hdGl2ZV9tYWtlZmlsZV9mcmFnfSIgPiY1Ci0reyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5hYmxlIHRvIGxvY2F0ZSBuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZSAke25hdGl2ZV9tYWtlZmlsZV9mcmFnfSIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogdW5hYmxlIHRvIGxvY2F0ZSBuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZSAke25hdGl2ZV9tYWtlZmlsZV9mcmFnfSIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBmaQotQEAgLTExMjg0LDYgKzEzMzA5LDcgQEAKLSBjb25maWdkaXJzPWBlY2hvICRjb25maWdkaXJzIHwgc2VkICdzL2dkYnNlcnZlci8vJ2AKLSBmaQotIAotKwotIGhvc3RmaWxlPWBzZWQgLW4gJwotIHMvWE1fRklMRVsgCV0qPVsgCV0qXChbXiAJXSpcKS9cMS9wCi0gJyAke2hvc3RfbWFrZWZpbGVfZnJhZ31gCi1AQCAtMTEzMDIsNiArMTMzMjgsNyBAQAotICcgJHtuYXRpdmVfbWFrZWZpbGVfZnJhZ31gCi0gZmkKLSAKLSsKLSAjIEFDX1NVQlNUX0ZJTEUgd2lsbCBjcmFzaCBpZiBuYXRpdmVfbWFrZWZpbGVfZnJhZyBpcyBudWxsCi0gaWYgdGVzdCAiJHtuYXRpdmVfbWFrZWZpbGVfZnJhZ30iID0gIiI7IHRoZW4KLSBuYXRpdmVfbWFrZWZpbGVfc3Vic3RfZnJhZz0vZGV2L251bGwKLUBAIC0xMTMwOSw2ICsxMzMzNiwxMSBAQAotIG5hdGl2ZV9tYWtlZmlsZV9zdWJzdF9mcmFnPSIke25hdGl2ZV9tYWtlZmlsZV9mcmFnfSIKLSBmaQotIAotKwotKwotKwotKwotKwotICMgTmV3IHRhcmdldHMgc2hvdWxkIGp1c3Qgc2V0IGdkYl9tdWx0aV9hcmNoPXllcyBpbiBjb25maWd1cmUudGd0LgotICMgT2xkIHRhcmdldHMgYmVpbmcgY29udmVydGVkIGNhbiBlaXRoZXIgZG8gdGhhdCBvciBzZXQgR0RCX01VTFRJX0FSQ0gKLSAjIGluIHRoZSB0YXJnZXQgc3BlY2lmaWMgbWFrZWZpbGUgZnJhZy4gIEV2ZW50dWFsbHkgZ2RiX211bHRpX2FyY2g9eWVzCi1AQCAtMTEzMjEsMjQgKzEzMzUzLDI0IEBACi0gICAgIGVzYWMKLSBmaQotIGlmIHRlc3QgeCIke0dEQl9NVUxUSV9BUkNIfSIgIT0geCA7IHRoZW4KLS0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBHREJfTVVMVElfQVJDSCAke0dEQl9NVUxUSV9BUkNIfQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gIyBXYXJuIHRoZSB1c2VyIHdoZW4gdGhleSB1c2UgYW4gb2xkIHByYWN0aWNlCi0gY2FzZSAiJHtHREJfTVVMVElfQVJDSH0iIGluCi0gICAgICIiICkgOzsKLSAgICAgMCB8IEdEQl9NVUxUSV9BUkNIX1BBUlRJQUwgfCAxIHwgR0RCX01VTFRJX0FSQ0hfVE0gfCAyICkKLS0JeyBlY2hvICIkYXNfbWU6MTEzMzM6IFdBUk5JTkc6IFwiR0RCOiBUYXJnZXQgaXMgbm90IHB1cmUgbXVsdGktYXJjaFwiIiA+JjUKLSsJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogXCJHREI6IFRhcmdldCBpcyBub3QgcHVyZSBtdWx0aS1hcmNoXCIiID4mNQotIGVjaG8gIiRhc19tZTogV0FSTklORzogXCJHREI6IFRhcmdldCBpcyBub3QgcHVyZSBtdWx0aS1hcmNoXCIiID4mMjt9IDs7Ci0gICAgIEdEQl9NVUxUSV9BUkNIX1BVUkUgKQotIAlpZiB0ZXN0IHgiJHt0YXJnZXRmaWxlfSIgIT0geCA7IHRoZW4KLS0JICAgIHsgZWNobyAiJGFzX21lOjExMzM3OiBXQVJOSU5HOiBcIkdEQjogSWdub3JpbmcgVE1fRklMRSBpbiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfVwiIiA+JjUKLSsJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFwiR0RCOiBJZ25vcmluZyBUTV9GSUxFIGluICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9XCIiID4mNQotIGVjaG8gIiRhc19tZTogV0FSTklORzogXCJHREI6IElnbm9yaW5nIFRNX0ZJTEUgaW4gJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ31cIiIgPiYyO30KLSAJICAgIHRhcmdldGZpbGU9IiIKLSAJZmkgOzsKLS0gICAgKikgIHsgeyBlY2hvICIkYXNfbWU6MTEzNDE6IGVycm9yOiBcIkdEQjogVW5rbm93biBHREJfTVVMVElfQVJDSCB2YWx1ZSAke0dEQl9NVUxUSV9BUkNIfVwiIiA+JjUKLSsgICAgKikgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFwiR0RCOiBVbmtub3duIEdEQl9NVUxUSV9BUkNIIHZhbHVlICR7R0RCX01VTFRJX0FSQ0h9XCIiID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IFwiR0RCOiBVbmtub3duIEdEQl9NVUxUSV9BUkNIIHZhbHVlICR7R0RCX01VTFRJX0FSQ0h9XCIiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSBlc2FjCi1AQCAtMTEzNTAsMTkgKzEzMzgyLDIxIEBACi0gCi0gIyBgYGdkYnNlcnZlcicnIGNhbiBvbmx5IGJlIGJ1aWx0IGluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24uCi0gaWYgdGVzdCB4IiR7dGFyZ2V0fSIgPSB4IiR7aG9zdH0iOyB0aGVuCi0tICAgIGVjaG8gIiRhc19tZToxMTM1MzogY2hlY2tpbmcgd2hldGhlciBnZGJzZXJ2ZXIgaXMgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdCIgPiY1Ci0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGdkYnNlcnZlciBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0IiA+JjUKLSBlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgZ2Ric2VydmVyIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuLi4gJEVDSE9fQyIgPiY2Ci0gICAgIGlmIHRlc3QgeCIke2J1aWxkX2dkYnNlcnZlcn0iID0geHllcyA7IHRoZW4KLSAJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBnZGJzZXJ2ZXIiCi0gCVNVQkRJUlM9IiR7U1VCRElSU30gZ2Ric2VydmVyIgotLQllY2hvICIkYXNfbWU6MTEzNTg6IHJlc3VsdDogeWVzIiA+JjUKLSsJZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLSBlY2hvICIke0VDSE9fVH15ZXMiID4mNgotICAgICBlbHNlCi0tCWVjaG8gIiRhc19tZToxMTM2MTogcmVzdWx0OiBubyIgPiY1Ci0rCWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLSBlY2hvICIke0VDSE9fVH1ubyIgPiY2Ci0gICAgIGZpCi0gZmkKLSAKLSsKLSsKLSAjIElmIGhvc3RmaWxlIChYTV9GSUxFKSBhbmQvb3IgdGFyZ2V0ZmlsZSAoVE1fRklMRSkgYW5kL29yIG5hdGl2ZWZpbGUKLSAjIChOQVRfRklMRSkgaXMgbm90IHNldCBpbiBjb25maWcvKi8qLm1baHRdIGZpbGVzLCB3ZSBsaW5rIHRvIGFuIGVtcHR5Ci0gIyB2ZXJzaW9uLgotQEAgLTExMzc3LDEyICsxMzQxMSwxMyBAQAotICAgICBHREJfWE1fRklMRT0iY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2hvc3RmaWxlfSIKLSAgICAgZmlsZXM9IiR7ZmlsZXN9ICR7R0RCX1hNX0ZJTEV9IgotICAgICBsaW5rcz0iJHtsaW5rc30geG0uaCIKLS0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBHREJfWE1fRklMRSAke0dEQl9YTV9GSUxFfQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0rCi0gcm0gLWYgdG0uaAotIHRtX2g9IiIKLSBpZiB0ZXN0ICIke3RhcmdldGZpbGV9IiAhPSAiIjsgdGhlbgotQEAgLTExMzkwLDEyICsxMzQyNSwxMyBAQAotICAgICBHREJfVE1fRklMRT0iY29uZmlnLyR7Z2RiX3RhcmdldF9jcHV9LyR7dGFyZ2V0ZmlsZX0iCi0gICAgIGZpbGVzPSIke2ZpbGVzfSAke0dEQl9UTV9GSUxFfSIKLSAgICAgbGlua3M9IiR7bGlua3N9IHRtLmgiCi0tICAgIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKLSsgICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgR0RCX1RNX0ZJTEUgJHtHREJfVE1fRklMRX0KLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotKwotIHJtIC1mIG5tLmgKLSBubV9oPSIiCi0gaWYgdGVzdCAiJHtuYXRpdmVmaWxlfSIgIT0gIiI7IHRoZW4KLUBAIC0xMTQwMywyMyArMTM0MzksMjUgQEAKLSAgICAgR0RCX05NX0ZJTEU9ImNvbmZpZy8ke2dkYl9ob3N0X2NwdX0vJHtuYXRpdmVmaWxlfSIKLSAgICAgZmlsZXM9IiR7ZmlsZXN9ICR7R0RCX05NX0ZJTEV9IgotICAgICBsaW5rcz0iJHtsaW5rc30gbm0uaCIKLS0gICAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBHREJfTk1fRklMRSAke0dEQl9OTV9GSUxFfQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAiJGFzX21lOjExNDEyOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLSsKLStlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0gZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRFQ0hPX0MiID4mNgotIExOX1M9JGFzX2xuX3MKLSBpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0tICBlY2hvICIkYXNfbWU6MTE0MTY6IHJlc3VsdDogeWVzIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYXNfbWU6MTE0MTk6IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1Ci0gZWNobyAiJHtFQ0hPX1R9bm8sIHVzaW5nICRMTl9TIiA+JjYKLSBmaQotIAotKwotIGFjX3NvdXJjZXM9IiRmaWxlcyIKLSBhY19kZXN0cz0iJGxpbmtzIgotIHdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLUBAIC0xMTQyOSw2ICsxMzQ2NywxMSBAQAotIGRvbmUKLSBhY19jb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MgJGFjX2NvbmZpZ19saW5rc18xIgotIAotKwotKwotKwotKwotKwotIHN1YmRpcnM9IiRzdWJkaXJzICRjb25maWdkaXJzIgotIAotIGFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSAuZ2RiaW5pdDpnZGJpbml0LmluIgotQEAgLTExNTEwLDcgKzEzNTUzLDcgQEAKLSBERUZTPS1ESEFWRV9DT05GSUdfSAotIAotIGlmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9GQUxTRX0iOyB0aGVuCi0tICB7IHsgZWNobyAiJGFzX21lOjExNTEzOiBlcnJvcjogY29uZGl0aW9uYWwgXCJNQUlOVEFJTkVSX01PREVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLSsgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiTUFJTlRBSU5FUl9NT0RFXCIgd2FzIG5ldmVyIGRlZmluZWQuCi0gVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIk1BSU5UQUlORVJfTU9ERVwiIHdhcyBuZXZlciBkZWZpbmVkLgotIFVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KLUBAIC0xMTUyMCwyMiArMTM1NjMsMjUgQEAKLSA6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0gYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLSBhY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgotLXsgZWNobyAiJGFzX21lOjExNTIzOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQotIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Ci0gY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICMhICRTSEVMTAotLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KLSAjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSAjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotIAotIGRlYnVnPWZhbHNlCi0gU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLS1hY19jc19pbnZvY2F0aW9uPSJcJDAgXCRAIgotLQotIF9BQ0VPRgotIAotIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotKwotKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIwotKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotKwotICMgQmUgQm91cm5lIGNvbXBhdGlibGUKLSBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIGVtdWxhdGUgc2gKLUBAIC0xMTU0NCw4ICsxMzU5MCwxNjcgQEAKLSAgIHNldCAtbyBwb3NpeAotIGZpCi0gCi0rIyBOTFMgbnVpc2FuY2VzLgotKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotK2lmIChGT089Rk9POyB1bnNldCBGT08pID4vZGV2L251bGwgMj4mMTsgdGhlbgotKyAgYXNfdW5zZXQ9dW5zZXQKLStlbHNlCi0rICBhc191bnNldD1mYWxzZQotK2ZpCi0rCi0rKHNldCAreDsgdGVzdCAtbiAiYChMQU5HPUM7IGV4cG9ydCBMQU5HKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExBTkcgfHwgdGVzdCAiJHtMQU5HK3NldH0iICE9IHNldDsgfSB8fAotKyAgICAgIHsgTEFORz1DOyBleHBvcnQgTEFORzsgfQotKyhzZXQgK3g7IHRlc3QgLW4gImAoTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfQUxMIHx8IHRlc3QgIiR7TENfQUxMK3NldH0iICE9IHNldDsgfSB8fAotKyAgICAgIHsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IH0KLSsoc2V0ICt4OyB0ZXN0IC1uICJgKExDX1RJTUU9QzsgZXhwb3J0IExDX1RJTUUpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQ19USU1FPUM7IGV4cG9ydCBMQ19USU1FOyB9Ci0rKHNldCAreDsgdGVzdCAtbiAiYChMQ19DVFlQRT1DOyBleHBvcnQgTENfQ1RZUEUpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfQ1RZUEUgfHwgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAhPSBzZXQ7IH0gfHwKLSsgICAgICB7IExDX0NUWVBFPUM7IGV4cG9ydCBMQ19DVFlQRTsgfQotKyhzZXQgK3g7IHRlc3QgLW4gImAoTEFOR1VBR0U9QzsgZXhwb3J0IExBTkdVQUdFKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExBTkdVQUdFIHx8IHRlc3QgIiR7TEFOR1VBR0Urc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQU5HVUFHRT1DOyBleHBvcnQgTEFOR1VBR0U7IH0KLSsoc2V0ICt4OyB0ZXN0IC1uICJgKExDX0NPTExBVEU9QzsgZXhwb3J0IExDX0NPTExBVEUpIDI+JjFgIikgJiYKLSsgICAgeyAkYXNfdW5zZXQgTENfQ09MTEFURSB8fCB0ZXN0ICIke0xDX0NPTExBVEUrc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9Ci0rKHNldCAreDsgdGVzdCAtbiAiYChMQ19OVU1FUklDPUM7IGV4cG9ydCBMQ19OVU1FUklDKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExDX05VTUVSSUMgfHwgdGVzdCAiJHtMQ19OVU1FUklDK3NldH0iICE9IHNldDsgfSB8fAotKyAgICAgIHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQotKyhzZXQgK3g7IHRlc3QgLW4gImAoTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTKSAyPiYxYCIpICYmCi0rICAgIHsgJGFzX3Vuc2V0IExDX01FU1NBR0VTIHx8IHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgIT0gc2V0OyB9IHx8Ci0rICAgICAgeyBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IH0KLSsKLSsKLSAjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi0tYXNfbWU9YGVjaG8gIiQwIiB8c2VkICdzLC4qW1xcL10sLCdgCi0rYXNfbWU9YChiYXNlbmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAotKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0rCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotKwkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAotKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8Ci0rZWNobyBYLyIkMCIgfAotKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9Ci0rICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotKyAgCSAgL15YXC9cKFwvXCkuKi97IHMvL1wxLzsgcTsgfQotKyAgCSAgcy8uKi8uLzsgcSdgCi0rCi0rIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgotKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLSthc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLSthc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLSthc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLSthc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCi0rYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0rCi0rIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi0raWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSsgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mdGVzdC5zaAotKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmZ0ZXN0LnNoCi0rICBjaG1vZCAreCBjb25mdGVzdC5zaAotKyAgaWYgKFBBVEg9Ii47LiI7IGNvbmZ0ZXN0LnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0rICBlbHNlCi0rICAgIFBBVEhfU0VQQVJBVE9SPToKLSsgIGZpCi0rICBybSAtZiBjb25mdGVzdC5zaAotK2ZpCi0rCi0rCi0rICBhc19saW5lbm9fMT0kTElORU5PCi0rICBhc19saW5lbm9fMj0kTElORU5PCi0rICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCi0rICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSsgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgewotKyAgIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gcGF0aCBhdCBhbGwKLSsgICMgcmVsYXRpdmUgb3Igbm90LgotKyAgY2FzZSAkMCBpbgotKyAgICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Ci0rICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotK2RvbmUKLSsKLSsgICAgICAgOzsKLSsgIGVzYWMKLSsgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSsgICMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotKyAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotKyAgICBhc19teXNlbGY9JDAKLSsgIGZpCi0rICBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0rICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsgIGZpCi0rICBjYXNlICRDT05GSUdfU0hFTEwgaW4KLSsgICcnKQotKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotKwkgY2FzZSAkYXNfZGlyIGluCi0rCSAvKikKLSsJICAgaWYgKCIkYXNfZGlyLyRhc19iYXNlIiAtYyAnCi0rICBhc19saW5lbm9fMT0kTElORU5PCi0rICBhc19saW5lbm9fMj0kTElORU5PCi0rICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCi0rICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSsgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAnKSAyPi9kZXYvbnVsbDsgdGhlbgotKwkgICAgIENPTkZJR19TSEVMTD0kYXNfZGlyLyRhc19iYXNlCi0rCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotKwkgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgJHsxKyIkQCJ9Ci0rCSAgIGZpOzsKLSsJIGVzYWMKLSsgICAgICAgZG9uZQotK2RvbmUKLSs7OwotKyAgZXNhYwotKwotKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotKyAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQotKyAgIyBsaW5lLW51bWJlciBsaW5lIGJlZm9yZSBlYWNoIGxpbmU7IHRoZSBzZWNvbmQgJ3NlZCcgZG9lcyB0aGUgcmVhbAotKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKLSsgICMgd2l0aCB0aGUgbnVtYmVyZWQgbGluZSwgYW5kIGFwcGVuZHMgdHJhaWxpbmcgJy0nIGR1cmluZwotKyAgIyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhdCBsaW5lIGVuZC4KLSsgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotKyAgIyBzZWNvbmQgJ3NlZCcgc2NyaXB0LiAgQmxhbWUgTGVlIEUuIE1jTWFob24gZm9yIHNlZCdzIHN5bnRheC4gIDotKQotKyAgc2VkICc9JyA8JGFzX215c2VsZiB8Ci0rICAgIHNlZCAnCi0rICAgICAgTgotKyAgICAgIHMsJCwtLAotKyAgICAgIDogbG9vcAotKyAgICAgIHMsXlwoWyckYXNfY3JfZGlnaXRzJ10qXClcKC4qXClbJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXVwpLFwxXDJcMVwzLAotKyAgICAgIHQgbG9vcAotKyAgICAgIHMsLSQsLAotKyAgICAgIHMsXlsnJGFzX2NyX2RpZ2l0cyddKlxuLCwKLSsgICAgJyA+JGFzX21lLmxpbmVubyAmJgotKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAotKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0rCi0rICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0rICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2libGUgdG8gdGhpcykuCi0rICAuIC4vJGFzX21lLmxpbmVubwotKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0rICBleGl0Ci0rfQotKwotKwotK2Nhc2UgYGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDNgLGBlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDNgIGluCi0rICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCi0rJyBFQ0hPX1Q9JwknIDs7Ci0rICAqYyosKiAgKSBFQ0hPX049LW4gRUNIT19DPSBFQ0hPX1Q9IDs7Ci0rICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKLStlc2FjCi0gCi0gaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIGFzX2V4cHI9ZXhwcgotQEAgLTExNTczLDIyICsxMzc3OCwxMiBAQAotIAotIGFzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKLSAKLS0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLS1pZiAoRk9PPUZPTzsgdW5zZXQgRk9PKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLS0gIGFzX3Vuc2V0PXVuc2V0Ci0tZWxzZQotLSAgYXNfdW5zZXQ9ZmFsc2UKLS1maQotKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLSthc190cl9jcHA9InNlZCB5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWciCi0rCi0rIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi0rYXNfdHJfc2g9InNlZCB5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnIgotIAotLSMgTkxTIG51aXNhbmNlcy4KLS0kYXNfdW5zZXQgTEFORyB8fCB0ZXN0ICIke0xBTkcrc2V0fSIgIT0gc2V0IHx8IHsgTEFORz1DOyBleHBvcnQgTEFORzsgfQotLSRhc191bnNldCBMQ19BTEwgfHwgdGVzdCAiJHtMQ19BTEwrc2V0fSIgIT0gc2V0IHx8IHsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IH0KLS0kYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0IHx8IHsgTENfVElNRT1DOyBleHBvcnQgTENfVElNRTsgfQotLSRhc191bnNldCBMQ19DVFlQRSB8fCB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICE9IHNldCB8fCB7IExDX0NUWVBFPUM7IGV4cG9ydCBMQ19DVFlQRTsgfQotLSRhc191bnNldCBMQU5HVUFHRSB8fCB0ZXN0ICIke0xBTkdVQUdFK3NldH0iICE9IHNldCB8fCB7IExBTkdVQUdFPUM7IGV4cG9ydCBMQU5HVUFHRTsgfQotLSRhc191bnNldCBMQ19DT0xMQVRFIHx8IHRlc3QgIiR7TENfQ09MTEFURStzZXR9IiAhPSBzZXQgfHwgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9Ci0tJGFzX3Vuc2V0IExDX05VTUVSSUMgfHwgdGVzdCAiJHtMQ19OVU1FUklDK3NldH0iICE9IHNldCB8fCB7IExDX05VTUVSSUM9QzsgZXhwb3J0IExDX05VTUVSSUM7IH0KLS0kYXNfdW5zZXQgTENfTUVTU0FHRVMgfHwgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiAhPSBzZXQgfHwgeyBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IH0KLSAKLSAjIElGUwotICMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCi1AQCAtMTE1OTcsMTAgKzEzNzkyLDM0IEBACi0gSUZTPSIgCSRhc19ubCIKLSAKLSAjIENEUEFUSC4KLS0kYXNfdW5zZXQgQ0RQQVRIIHx8IHRlc3QgIiR7Q0RQQVRIK3NldH0iICE9IHNldCB8fCB7IENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyB9Ci0rJGFzX3Vuc2V0IENEUEFUSCB8fCB0ZXN0ICIke0NEUEFUSCtzZXR9IiAhPSBzZXQgfHwgeyBDRFBBVEg9JFBBVEhfU0VQQVJBVE9SOyBleHBvcnQgQ0RQQVRIOyB9Ci0gCi0gZXhlYyA2PiYxCi0gCi0rIyBPcGVuIHRoZSBsb2cgcmVhbCBzb29uLCB0byBrZWVwIFwkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KLSsjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKLSsjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLiAgTG9nZ2luZyAtLXZlcnNpb24gZXRjLiBpcyBPSy4KLStleGVjIDU+PmNvbmZpZy5sb2cKLSt7Ci0rICBlY2hvCi0rICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotKyMjIFJ1bm5pbmcgJGFzX21lLiAjIwotK19BU0JPWAotK30gPiY1Ci0rY2F0ID4mNSA8PF9DU0VPRgotKwotK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKLStnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTMuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLSsKLSsgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKLSsgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUwotKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwotKyAgJCAkMCAkQAotKwotK19DU0VPRgotK2VjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1Ci0rZWNobyA+JjUKLSBfQUNFT0YKLSAKLSAjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1AQCAtMTE2MjAsNyArMTM4MzksNyBAQAotICAgZWNobyAiY29uZmlnX2NvbW1hbmRzPVwiJGFjX2NvbmZpZ19jb21tYW5kc1wiIiA+PiRDT05GSUdfU1RBVFVTCi0gZmkKLSAKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAKLSBhY19jc191c2FnZT0iXAotIFxgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQotQEAgLTExNjUwLDEyICsxMzg2OSwxMiBAQAotICRjb25maWdfY29tbWFuZHMKLSAKLSBSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLS1FT0YKLStfQUNFT0YKLSAKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PEVPRgotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0gYWNfY3NfdmVyc2lvbj0iXFwKLSBjb25maWcuc3RhdHVzCi0tY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjUyLAotK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41MywKLSAgIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgotIAotIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1AQCAtMTE2NjQsOSArMTM4ODMsOSBAQAotIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCi0gc3JjZGlyPSRzcmNkaXIKLSBJTlNUQUxMPSIkSU5TVEFMTCIKLS1FT0YKLStfQUNFT0YKLSAKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAjIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAotICMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi0gYWNfbmVlZF9kZWZhdWx0cz06Ci1AQCAtMTE2ODgsMTggKzEzOTA3LDE4IEBACi0gCi0gICBjYXNlICQxIGluCi0gICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgotLUVPRgotLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCi0rX0FDRU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgICBlY2hvICJydW5uaW5nICRTSEVMTCAkMCAiICRhY19jb25maWd1cmVfYXJncyAiIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgICBleGVjICRTSEVMTCAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLS1FT0YKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAgIC0tdmVyc2lvbiB8IC0tdmVycyogfCAtViApCi0gICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCAwIDs7Ci0gICAtLWhlIHwgLS1oKQotICAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgotLSAgICB7IHsgZWNobyAiJGFzX21lOjExNzAyOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLSsgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLSBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLSBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KLUBAIC0xMTcxOCw3ICsxMzkzNyw3IEBACi0gICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotIAotICAgIyBUaGlzIGlzIGFuIGVycm9yLgotLSAgLSopIHsgeyBlY2hvICIkYXNfbWU6MTE3MjE6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQotKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi0gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi0gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9Ci1AQCAtMTE3MzAsMzYgKzEzOTQ5LDI0IEBACi0gICBzaGlmdAotIGRvbmUKLSAKLS1leGVjIDU+PmNvbmZpZy5sb2cKLS1jYXQgPiY1IDw8IF9BQ0VPRgotLQotLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0tIyMgUnVubmluZyBjb25maWcuc3RhdHVzLiAgIyMKLS0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotLQotLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lIDIuNTIsIGV4ZWN1dGVkIHdpdGgKLS0gIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKLS0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotLSAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUwotLSAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwotLSAgPiAkYWNfY3NfaW52b2NhdGlvbgotLW9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotLQotIF9BQ0VPRgotLUVPRgotIAotLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAjCi0gIyBJTklULUNPTU1BTkRTIHNlY3Rpb24uCi0gIwotIAotKwotIGdkYl9ob3N0X2NwdT0kZ2RiX2hvc3RfY3B1Ci0gZ2RiX3RhcmdldF9jcHU9JGdkYl90YXJnZXRfY3B1Ci0gbmF0aXZlZmlsZT0kbmF0aXZlZmlsZQotIAotLUVPRgotIAotLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgotK19BQ0VPRgotKwotKwotKwotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIGZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotIGRvCi0gICBjYXNlICIkYWNfY29uZmlnX3RhcmdldCIgaW4KLUBAIC0xMTc2OSw3ICsxMzk3Niw3IEBACi0gICAiJGFjX2NvbmZpZ19saW5rc18xIiApIENPTkZJR19MSU5LUz0iJENPTkZJR19MSU5LUyAkYWNfY29uZmlnX2xpbmtzXzEiIDs7Ci0gICAiZGVmYXVsdCIgKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVmYXVsdCIgOzsKLSAgICJjb25maWcuaCIgKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oOmNvbmZpZy5pbiIgOzsKLS0gICopIHsgeyBlY2hvICIkYXNfbWU6MTE3NzI6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci0rICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgIGVzYWMKLUBAIC0xMTgwOCw5ICsxNDAxNSw5IEBACi0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0gfQotIAotLUVPRgotK19BQ0VPRgotIAotLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAKLSAjCi0gIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KLUBAIC0xMTgyMyw2ICsxNDAzMCwxMiBAQAotICAgc2VkICdzLyxAL0BALzsgcy9ALC9AQC87IHMvLDt0IHRcJC9AO3QgdC87IC9AO3QgdFwkL3MvW1xcXFwmLF0vXFxcXCYvZzsKLSAgICBzL0BALyxALzsgcy9AQC9ALC87IHMvQDt0IHRcJC8sO3QgdC8nID5cJHRtcC9zdWJzLnNlZCA8PFxcQ0VPRgotIHMsQFNIRUxMQCwkU0hFTEwsO3QgdAotK3MsQFBBVEhfU0VQQVJBVE9SQCwkUEFUSF9TRVBBUkFUT1IsO3QgdAotK3MsQFBBQ0tBR0VfTkFNRUAsJFBBQ0tBR0VfTkFNRSw7dCB0Ci0rcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKLStzLEBQQUNLQUdFX1ZFUlNJT05ALCRQQUNLQUdFX1ZFUlNJT04sO3QgdAotK3MsQFBBQ0tBR0VfU1RSSU5HQCwkUEFDS0FHRV9TVFJJTkcsO3QgdAotK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAotIHMsQGV4ZWNfcHJlZml4QCwkZXhlY19wcmVmaXgsO3QgdAotIHMsQHByZWZpeEAsJHByZWZpeCw7dCB0Ci0gcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAotQEAgLTExODM4LDE5ICsxNDA1MSwxMyBAQAotIHMsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKLSBzLEBpbmZvZGlyQCwkaW5mb2Rpciw7dCB0Ci0gcyxAbWFuZGlyQCwkbWFuZGlyLDt0IHQKLS1zLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAotLXMsQFBBQ0tBR0VfVEFSTkFNRUAsJFBBQ0tBR0VfVEFSTkFNRSw7dCB0Ci0tcyxAUEFDS0FHRV9WRVJTSU9OQCwkUEFDS0FHRV9WRVJTSU9OLDt0IHQKLS1zLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKLS1zLEBQQUNLQUdFX0JVR1JFUE9SVEAsJFBBQ0tBR0VfQlVHUkVQT1JULDt0IHQKLSBzLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKLSBzLEBob3N0X2FsaWFzQCwkaG9zdF9hbGlhcyw7dCB0Ci0gcyxAdGFyZ2V0X2FsaWFzQCwkdGFyZ2V0X2FsaWFzLDt0IHQKLStzLEBERUZTQCwkREVGUyw7dCB0Ci0gcyxARUNIT19DQCwkRUNIT19DLDt0IHQKLSBzLEBFQ0hPX05ALCRFQ0hPX04sO3QgdAotIHMsQEVDSE9fVEAsJEVDSE9fVCw7dCB0Ci0tcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0Ci0tcyxAREVGU0AsJERFRlMsO3QgdAotIHMsQExJQlNALCRMSUJTLDt0IHQKLSBzLEBNQUlOVEFJTkVSX01PREVfVFJVRUAsJE1BSU5UQUlORVJfTU9ERV9UUlVFLDt0IHQKLSBzLEBNQUlOVEFJTkVSX01PREVfRkFMU0VALCRNQUlOVEFJTkVSX01PREVfRkFMU0UsO3QgdAotQEAgLTExODYzLDYgKzE0MDcwLDkgQEAKLSBzLEBFWEVFWFRALCRFWEVFWFQsO3QgdAotIHMsQE9CSkVYVEAsJE9CSkVYVCw7dCB0Ci0gcyxAQ1BQQCwkQ1BQLDt0IHQKLStzLEBESVJfYWlmQCwkRElSX2FpZiw7dCB0Ci0rcyxASU5DTFVERV9haWZALCRJTkNMVURFX2FpZiw7dCB0Ci0rcyxATElCX2FpZkAsJExJQl9haWYsO3QgdAotIHMsQGJ1aWxkQCwkYnVpbGQsO3QgdAotIHMsQGJ1aWxkX2NwdUAsJGJ1aWxkX2NwdSw7dCB0Ci0gcyxAYnVpbGRfdmVuZG9yQCwkYnVpbGRfdmVuZG9yLDt0IHQKLUBAIC0xMjAxMCw5ICsxNDIyMCw5IEBACi0gcyxAc3ViZGlyc0AsJHN1YmRpcnMsO3QgdAotIENFT0YKLSAKLS1FT0YKLStfQUNFT0YKLSAKLS0gIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgotKyAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gICAjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotICAgIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi0gICBhY19tYXhfc2VkX2xpbmVzPTQ4Ci1AQCAtMTIwNTEsOCArMTQyNjEsOCBAQAotICAgZmkKLSBmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0gCi0tRU9GCi0tY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCi0rX0FDRU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKLSAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgIGNhc2UgJGFjX2ZpbGUgaW4KLUBAIC0xMjA2Niw3ICsxNDI3Niw4IEBACi0gICBlc2FjCi0gCi0gICAjIENvbXB1dGUgQHNyY2RpckAsIEB0b3Bfc3JjZGlyQCwgYW5kIEBJTlNUQUxMQCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0tICBhY19kaXI9YCRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0rICBhY19kaXI9YChkaXJuYW1lICIkYWNfZmlsZSIpIDI+L2Rldi9udWxsIHx8Ci0rJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLSAgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotICAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0gICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCi1AQCAtMTIwNzcsOCArMTQyODgsNyBAQAotICAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9Ci0gICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQotICAgCSAgcy8uKi8uLzsgcSdgCi0tICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLS0gICAgeyBjYXNlICIkYWNfZGlyIiBpbgotKyAgeyBjYXNlICIkYWNfZGlyIiBpbgotICAgW1xcL10qIHwgPzpbXFwvXSogKSBhc19pbmNyX2Rpcj07OwotICAgKikgICAgICAgICAgICAgICAgICAgICAgYXNfaW5jcl9kaXI9Ljs7Ci0gZXNhYwotQEAgLTEyMDg5LDQ4ICsxNDI5OSw2OCBAQAotICAgICA/OikgYXNfaW5jcl9kaXI9JGFzX21rZGlyX2RpciA7OwotICAgICAqKQotICAgICAgIGFzX2luY3JfZGlyPSRhc19pbmNyX2Rpci8kYXNfbWtkaXJfZGlyCi0tICAgICAgdGVzdCAtZCAiJGFzX2luY3JfZGlyIiB8fCBta2RpciAiJGFzX2luY3JfZGlyIgotKyAgICAgIHRlc3QgLWQgIiRhc19pbmNyX2RpciIgfHwKLSsgICAgICAgIG1rZGlyICIkYXNfaW5jcl9kaXIiIHx8Ci0rCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgXCIkYWNfZGlyXCIiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgXCIkYWNfZGlyXCIiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgIDs7Ci0gICBlc2FjCi0gZG9uZTsgfQotIAotLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MsXlwuLywsJ2AiCi0tICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0tICAgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW14vXSosLi4vLGcnYAotLSAgZWxzZQotLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotLSAgZmkKLSsgIGFjX2J1aWxkZGlyPS4KLSAKLS0gIGNhc2UgJHNyY2RpciBpbgotLSAgLikgIGFjX3NyY2Rpcj0uCi0tICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuCi0tICAgICAgICAgYWNfdG9wX3NyY2Rpcj0uCi0tICAgICAgZWxzZQotLSAgICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHMgfCBzZWQgJ3MsLyQsLCdgCi0tICAgICAgZmkgOzsKLS0gIFtcXC9dKiB8ID86W1xcL10qICkKLS0gICAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotLSAgICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OwotK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSsgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKLSsgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0rICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCi0rZWxzZQotKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQotK2ZpCi0rCi0rY2FzZSAkc3JjZGlyIGluCi0rICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0rICAgIGFjX3NyY2Rpcj0uCi0rICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCi0rICAgICAgIGFjX3RvcF9zcmNkaXI9LgotKyAgICBlbHNlCi0rICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKLSsgICAgZmkgOzsKLSsgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KLSsgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSsgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICAqKSAjIFJlbGF0aXZlIHBhdGguCi0tICAgIGFjX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotLSAgICBhY190b3Bfc3JjZGlyPSRhY19kb3RzJHNyY2RpciA7OwotLSAgZXNhYwotKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Ci0rZXNhYwotKyMgRG9uJ3QgYmxpbmRseSBwZXJmb3JtIGEgYGNkICIkYWNfZGlyIi8kYWNfZm9vICYmIHB3ZGAgc2luY2UgJGFjX2ZvbyBjYW4gYmUKLSsjIGFic29sdXRlLgotK2FjX2Fic19idWlsZGRpcj1gY2QgIiRhY19kaXIiICYmIGNkICRhY19idWlsZGRpciAmJiBwd2RgCi0rYWNfYWJzX3RvcF9idWlsZGRpcj1gY2QgIiRhY19kaXIiICYmIGNkICRhY190b3BfYnVpbGRkaXIgJiYgcHdkYAotK2FjX2Fic19zcmNkaXI9YGNkICIkYWNfZGlyIiAmJiBjZCAkYWNfc3JjZGlyICYmIHB3ZGAKLSthY19hYnNfdG9wX3NyY2Rpcj1gY2QgIiRhY19kaXIiICYmIGNkICRhY190b3Bfc3JjZGlyICYmIHB3ZGAKLSsKLSAKLSAgIGNhc2UgJElOU1RBTEwgaW4KLSAgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLS0gICopIGFjX0lOU1RBTEw9JGFjX2RvdHMkSU5TVEFMTCA7OwotKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKLSAgIGVzYWMKLSAKLSAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLS0gICAgeyBlY2hvICIkYXNfbWU6MTIxMjU6IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgIHJtIC1mICIkYWNfZmlsZSIKLSAgIGZpCi0gICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgotLSAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkICdzLC4qLywsJ2AgYnkgY29uZmlndXJlLiIKLSsgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCi0rICBpZiB0ZXN0IHgiJGFjX2ZpbGUiID0geC07IHRoZW4KLSsgICAgY29uZmlndXJlX2lucHV0PQotKyAgZWxzZQotKyAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgIgotKyAgZmkKLSsgIGNvbmZpZ3VyZV9pbnB1dD0kY29uZmlndXJlX2lucHV0IkdlbmVyYXRlZCBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkICdzLC4qLywsJ2AgYnkgY29uZmlndXJlLiIKLSAKLSAgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCi0gICAjIHNyYyB0cmVlLgotQEAgLTEyMTQwLDcgKzE0MzcwLDcgQEAKLSAgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKLSAgICAgICBbXFwvJF0qKQotICAgICAgICAgICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCi0tICAgICAgICAgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6MTIxNDM6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci0rICAgICAgICAgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICAgICAgICBlY2hvICRmOzsKLUBAIC0xMjE1MywyMyArMTQzODMsMjkgQEAKLSAgICAgICAgICAgIGVjaG8gJHNyY2Rpci8kZgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICMgL2Rldi9udWxsIHRyZWUKLS0gICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6MTIxNTY6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci0rICAgICAgICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgICAgICAgZmk7OwotICAgICAgIGVzYWMKLSAgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0tRU9GCi0tY2F0ID4+JENPTkZJR19TVEFUVVMgPDxFT0YKLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICAgc2VkICIkYWNfdnBzdWIKLSAkZXh0cmFzdWIKLS1FT0YKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSA6dAotIC9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKLSBzLEBjb25maWd1cmVfaW5wdXRALCRjb25maWd1cmVfaW5wdXQsO3QgdAotIHMsQHNyY2RpckAsJGFjX3NyY2Rpciw7dCB0Ci0rcyxAYWJzX3NyY2RpckAsJGFjX2Fic19zcmNkaXIsO3QgdAotIHMsQHRvcF9zcmNkaXJALCRhY190b3Bfc3JjZGlyLDt0IHQKLStzLEBhYnNfdG9wX3NyY2RpckAsJGFjX2Fic190b3Bfc3JjZGlyLDt0IHQKLStzLEBidWlsZGRpckAsJGFjX2J1aWxkZGlyLDt0IHQKLStzLEBhYnNfYnVpbGRkaXJALCRhY19hYnNfYnVpbGRkaXIsO3QgdAotK3MsQHRvcF9idWlsZGRpckAsJGFjX3RvcF9idWlsZGRpciw7dCB0Ci0rcyxAYWJzX3RvcF9idWlsZGRpckAsJGFjX2Fic190b3BfYnVpbGRkaXIsO3QgdAotIHMsQElOU1RBTExALCRhY19JTlNUQUxMLDt0IHQKLSAiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+JHRtcC9vdXQKLSAgIHJtIC1mICR0bXAvc3RkaW4KLUBAIC0xMjE4MSw4ICsxNDQxNyw4IEBACi0gICBmaQotIAotIGRvbmUKLS1FT0YKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAKLSAjCi0gIyBDT05GSUdfSEVBREVSIHNlY3Rpb24uCi1AQCAtMTIyMTQsNyArMTQ0NTAsNyBAQAotICAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OwotICAgZXNhYwotIAotLSAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZToxMjIxNzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotKyAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci0gZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KLSAKLSAgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCi1AQCAtMTIyMjUsNyArMTQ0NjEsNyBAQAotICAgICAgIC0pIGVjaG8gJHRtcC9zdGRpbiA7OwotICAgICAgIFtcXC8kXSopCi0gICAgICAgICAgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKLS0gICAgICAgICB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZToxMjIyODogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKLSsgICAgICAgICB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQotIGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICAgICAgIGVjaG8gJGY7OwotQEAgLTEyMjM4LDcgKzE0NDc0LDcgQEAKLSAgICAgICAgICAgIGVjaG8gJHNyY2Rpci8kZgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICMgL2Rldi9udWxsIHRyZWUKLS0gICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6MTIyNDE6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci0rICAgICAgICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci0gZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgICAgICAgZmk7OwotQEAgLTEyMjQ3LDcgKzE0NDgzLDcgQEAKLSAgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZXMuCi0gICBzZWQgJ3MvWyAJXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgotIAotLUVPRgotK19BQ0VPRgotIAotICMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byB0d28gc2VkIHNjcmlwdHMsIGBjb25mdGVzdC5kZWZpbmVzJyBhbmQKLSAjIGBjb25mdGVzdC51bmRlZnMnLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KLUBAIC0xMjI2MywxNiArMTQ0OTksMTYgQEAKLSAjIGBlbmQnIGlzIHVzZWQgdG8gYXZvaWQgdGhhdCB0aGUgc2Vjb25kIG1haW4gc2VkIGNvbW1hbmQgKG1lYW50IGZvcgotICMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KLSAjIFNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiBmb3IgYGNsZWFyJy4KLS1jYXQgPmNvbmZkZWYyc2VkLnNlZCA8PFxFT0YKLStjYXQgPmNvbmZkZWYyc2VkLnNlZCA8PFxfQUNFT0YKLSBzL1tcXCYsXS9cXCYvZwotIHMsW1xcJGBdLFxcJixnCi0gdCBjbGVhcgotIDogY2xlYXIKLS1zLF5bIAldKiNbIAldKmRlZmluZVsgCV1bIAldKlwoXChbXiAJKF1bXiAJKF0qXCkoW14pXSopXClbIAldKlwoLipcKSQsJHthY19kQX1cMiR7YWNfZEJ9XDEke2FjX2RDfVwzJHthY19kRH0sZ3AKLStzLF5bIAldKiNbIAldKmRlZmluZVsgCV1bIAldKlwoW14gCShdW14gCShdKlwpXCgoW14pXSopXClbIAldKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDFcMiR7YWNfZEN9XDMke2FjX2REfSxncAotIHQgZW5kCi0gcyxeWyAJXSojWyAJXSpkZWZpbmVbIAldWyAJXSpcKFteIAldW14gCV0qXClbIAldKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0sZ3AKLSA6IGVuZAotLUVPRgotK19BQ0VPRgotICMgSWYgc29tZSBtYWNyb3Mgd2VyZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0aGVyZSBtaWdodCBiZSBzZXZlcmFsIHRpbWVzCi0gIyB0aGUgc2FtZSAjZGVmaW5lcywgd2hpY2ggaXMgdXNlbGVzcy4gIE5ldmVydGhlbGVzcywgd2UgbWF5IG5vdCB3YW50IHRvCi0gIyBzb3J0IHRoZW0sIHNpbmNlIHdlIHdhbnQgdGhlICpsYXN0KiBBQy1ERUZJTkUgdG8gYmUgaG9ub3JlZC4KLUBAIC0xMjI4Myw5ICsxNDUxOSw5IEBACi0gIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotICMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLS1jYXQgPj5jb25mdGVzdC51bmRlZnMgPDxcRU9GCi0rY2F0ID4+Y29uZnRlc3QudW5kZWZzIDw8XF9BQ0VPRgotIHMsXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qLC8qICYgKi8sCi0tRU9GCi0rX0FDRU9GCi0gCi0gIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCi0gIyBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvbyAoMTAwIGNtZHMpLgotQEAgLTEyMzQyLDIzICsxNDU3OCwyNCBAQAotIGRvbmUKLSBybSAtZiBjb25mdGVzdC51bmRlZnMKLSAKLS1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Ci0gICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Ci0tICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlnLnN0YXR1cy4gICovCi0rICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCi0tICAgIGVjaG8gIi8qIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAotKyAgICBlY2hvICIvKiBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCi0gICBlbHNlCi0tICAgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCi0rICAgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAotICAgZmkKLSAgIGNhdCAkdG1wL2luID4+JHRtcC9jb25maWcuaAotICAgcm0gLWYgJHRtcC9pbgotICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICBpZiBjbXAgLXMgJGFjX2ZpbGUgJHRtcC9jb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgotLSAgICAgIHsgZWNobyAiJGFzX21lOjEyMzU4OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQotKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1Ci0gZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9Ci0gICAgIGVsc2UKLS0gICAgICBhY19kaXI9YCRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0rICAgICAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2ZpbGUiKSAyPi9kZXYvbnVsbCB8fAotKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0gICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLSAgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotICAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAotQEAgLTEyMzY5LDggKzE0NjA2LDcgQEAKLSAgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotICAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KLSAgIAkgIHMvLiovLi87IHEnYAotLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotLSAgICAgICAgeyBjYXNlICIkYWNfZGlyIiBpbgotKyAgICAgIHsgY2FzZSAiJGFjX2RpciIgaW4KLSAgIFtcXC9dKiB8ID86W1xcL10qICkgYXNfaW5jcl9kaXI9OzsKLSAgICopICAgICAgICAgICAgICAgICAgICAgIGFzX2luY3JfZGlyPS47OwotIGVzYWMKLUBAIC0xMjM4MSwxMiArMTQ2MTcsMTUgQEAKLSAgICAgPzopIGFzX2luY3JfZGlyPSRhc19ta2Rpcl9kaXIgOzsKLSAgICAgKikKLSAgICAgICBhc19pbmNyX2Rpcj0kYXNfaW5jcl9kaXIvJGFzX21rZGlyX2RpcgotLSAgICAgIHRlc3QgLWQgIiRhc19pbmNyX2RpciIgfHwgbWtkaXIgIiRhc19pbmNyX2RpciIKLSsgICAgICB0ZXN0IC1kICIkYXNfaW5jcl9kaXIiIHx8Ci0rICAgICAgICBta2RpciAiJGFzX2luY3JfZGlyIiB8fAotKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIFwiJGFjX2RpclwiIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIFwiJGFjX2RpclwiIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICA7OwotICAgZXNhYwotIGRvbmU7IH0KLSAKLS0gICAgICBmaQotICAgICAgIHJtIC1mICRhY19maWxlCi0gICAgICAgbXYgJHRtcC9jb25maWcuaCAkYWNfZmlsZQotICAgICBmaQotQEAgLTEyMzk1LDggKzE0NjM0LDggQEAKLSAgICAgcm0gLWYgJHRtcC9jb25maWcuaAotICAgZmkKLSBkb25lCi0tRU9GCi0tY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCi0rX0FDRU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gCi0gIwotICMgQ09ORklHX0xJTktTIHNlY3Rpb24uCi1AQCAtMTI0MDYsMTggKzE0NjQ1LDE5IEBACi0gICBhY19kZXN0PWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYAotICAgYWNfc291cmNlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAotIAotLSAgeyBlY2hvICIkYXNfbWU6MTI0MDk6IGxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IiA+JjUKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IiA+JjUKLSBlY2hvICIkYXNfbWU6IGxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IiA+JjY7fQotIAotICAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotLSAgICB7IHsgZWNobyAiJGFzX21lOjEyNDEzOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgPiY1Ci0tZWNobyAiJGFzX21lOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgPiYyO30KLSsgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBmaWxlIG5vdCBmb3VuZCIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBmaWxlIG5vdCBmb3VuZCIgPiYyO30KLSAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgIGZpCi0gICBybSAtZiAkYWNfZGVzdAotIAotICAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotLSAgYWNfZGVzdF9kaXI9YCRhc19leHByIFgiJGFjX2Rlc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0rICBhY19kZXN0X2Rpcj1gKGRpcm5hbWUgIiRhY19kZXN0IikgMj4vZGV2L251bGwgfHwKLSskYXNfZXhwciBYIiRhY19kZXN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotICAgICAgICAgIFgiJGFjX2Rlc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0gICAgICAgICAgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKSQnIFx8IFwKLSAgICAgICAgICBYIiRhY19kZXN0IiA6ICdYXCgvXCknIFx8IFwKLUBAIC0xMjQyOCw4ICsxNDY2OCw3IEBACi0gICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KLSAgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9Ci0gICAJICBzLy4qLy4vOyBxJ2AKLS0gIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KLS0gICAgeyBjYXNlICIkYWNfZGVzdF9kaXIiIGluCi0rICB7IGNhc2UgIiRhY19kZXN0X2RpciIgaW4KLSAgIFtcXC9dKiB8ID86W1xcL10qICkgYXNfaW5jcl9kaXI9OzsKLSAgICopICAgICAgICAgICAgICAgICAgICAgIGFzX2luY3JfZGlyPS47OwotIGVzYWMKLUBAIC0xMjQ0MCwzMiArMTQ2NzksNjIgQEAKLSAgICAgPzopIGFzX2luY3JfZGlyPSRhc19ta2Rpcl9kaXIgOzsKLSAgICAgKikKLSAgICAgICBhc19pbmNyX2Rpcj0kYXNfaW5jcl9kaXIvJGFzX21rZGlyX2RpcgotLSAgICAgIHRlc3QgLWQgIiRhc19pbmNyX2RpciIgfHwgbWtkaXIgIiRhc19pbmNyX2RpciIKLSsgICAgICB0ZXN0IC1kICIkYXNfaW5jcl9kaXIiIHx8Ci0rICAgICAgICBta2RpciAiJGFzX2luY3JfZGlyIiB8fAotKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIFwiJGFjX2Rlc3RfZGlyXCIiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgXCIkYWNfZGVzdF9kaXJcIiIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICAgOzsKLSAgIGVzYWMKLSBkb25lOyB9Ci0gCi0tICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MsXlwuLywsJ2AiCi0tICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLS0gICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncywvW14vXSosLi4vLGcnYAotLSAgZWxzZQotLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0tICBmaQotKyAgYWNfYnVpbGRkaXI9LgotKwotK2lmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kZXN0X2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0rICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAotK2Vsc2UKLSsgIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KLStmaQotKwotK2Nhc2UgJHNyY2RpciBpbgotKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgotKyAgICBhY19zcmNkaXI9LgotKyAgICBpZiB0ZXN0IC16ICIkYWNfdG9wX2J1aWxkZGlyIjsgdGhlbgotKyAgICAgICBhY190b3Bfc3JjZGlyPS4KLSsgICAgZWxzZQotKyAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY190b3BfYnVpbGRkaXIgfCBzZWQgJ3MsLyQsLCdgCi0rICAgIGZpIDs7Ci0rICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIHBhdGguCi0rICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Ci0rICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OwotKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgotKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Ci0rZXNhYwotKyMgRG9uJ3QgYmxpbmRseSBwZXJmb3JtIGEgYGNkICIkYWNfZGVzdF9kaXIiLyRhY19mb28gJiYgcHdkYCBzaW5jZSAkYWNfZm9vIGNhbiBiZQotKyMgYWJzb2x1dGUuCi0rYWNfYWJzX2J1aWxkZGlyPWBjZCAiJGFjX2Rlc3RfZGlyIiAmJiBjZCAkYWNfYnVpbGRkaXIgJiYgcHdkYAotK2FjX2Fic190b3BfYnVpbGRkaXI9YGNkICIkYWNfZGVzdF9kaXIiICYmIGNkICRhY190b3BfYnVpbGRkaXIgJiYgcHdkYAotK2FjX2Fic19zcmNkaXI9YGNkICIkYWNfZGVzdF9kaXIiICYmIGNkICRhY19zcmNkaXIgJiYgcHdkYAotK2FjX2Fic190b3Bfc3JjZGlyPWBjZCAiJGFjX2Rlc3RfZGlyIiAmJiBjZCAkYWNfdG9wX3NyY2RpciAmJiBwd2RgCi0rCi0gCi0gICBjYXNlICRzcmNkaXIgaW4KLSAgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX3JlbF9zb3VyY2U9JHNyY2Rpci8kYWNfc291cmNlIDs7Ci0tICAgICAgKikgYWNfcmVsX3NvdXJjZT0kYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSA7OwotKyAgICAgICopIGFjX3JlbF9zb3VyY2U9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIvJGFjX3NvdXJjZSA7OwotICAgZXNhYwotIAotICAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KLSAgIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdCB8fAotLSAgICB7IHsgZWNobyAiJGFzX21lOjEyNDYzOiBlcnJvcjogY2Fubm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiA+JjUKLSsgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiA+JjUKLSBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiID4mMjt9Ci0gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZG9uZQotLUVPRgotLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgotK19BQ0VPRgotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIAotICMKLSAjIENPTkZJR19DT01NQU5EUyBzZWN0aW9uLgotQEAgLTEyNDczLDcgKzE0NzQyLDUzIEBACi0gZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0NPTU1BTkRTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKLSAgIGFjX2Rlc3Q9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgCi0gICBhY19zb3VyY2U9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCi0rICBhY19kaXI9YChkaXJuYW1lICIkYWNfZGVzdCIpIDI+L2Rldi9udWxsIHx8Ci0rJGFzX2V4cHIgWCIkYWNfZGVzdCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLSsgICAgICAgICBYIiRhY19kZXN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAotKyAgICAgICAgIFgiJGFjX2Rlc3QiIDogJ1hcKC8vXCkkJyBcfCBcCi0rICAgICAgICAgWCIkYWNfZGVzdCIgOiAnWFwoL1wpJyBcfCBcCi0rICAgICAgICAgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8Ci0rZWNobyBYIiRhY19kZXN0IiB8Ci0rICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQotKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KLSsgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KLSsgIAkgIHMvLiovLi87IHEnYAotKyAgYWNfYnVpbGRkaXI9LgotKwotK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSsgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKLSsgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0rICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCi0rZWxzZQotKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQotK2ZpCi0rCi0rY2FzZSAkc3JjZGlyIGluCi0rICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0rICAgIGFjX3NyY2Rpcj0uCi0rICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCi0rICAgICAgIGFjX3RvcF9zcmNkaXI9LgotKyAgICBlbHNlCi0rICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKLSsgICAgZmkgOzsKLSsgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KLSsgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSsgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0rICAqKSAjIFJlbGF0aXZlIHBhdGguCi0rICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4Ci0rICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKLStlc2FjCi0rIyBEb24ndCBibGluZGx5IHBlcmZvcm0gYSBgY2QgIiRhY19kaXIiLyRhY19mb28gJiYgcHdkYCBzaW5jZSAkYWNfZm9vIGNhbiBiZQotKyMgYWJzb2x1dGUuCi0rYWNfYWJzX2J1aWxkZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX2J1aWxkZGlyICYmIHB3ZGAKLSthY19hYnNfdG9wX2J1aWxkZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX3RvcF9idWlsZGRpciAmJiBwd2RgCi0rYWNfYWJzX3NyY2Rpcj1gY2QgIiRhY19kaXIiICYmIGNkICRhY19zcmNkaXIgJiYgcHdkYAotK2FjX2Fic190b3Bfc3JjZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX3RvcF9zcmNkaXIgJiYgcHdkYAotIAotKwotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjUKLStlY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZGVzdCBjb21tYW5kcyIgPiY2O30KLSAgIGNhc2UgJGFjX2Rlc3QgaW4KLSAgICAgZGVmYXVsdCApCi0gaWYgdGVzdCAiJHtuYXRpdmVmaWxlfSIgPSAiIjsgdGhlbgotQEAgLTEyNDkyLDYgKzE0ODA3LDcgQEAKLSAnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS50bXAKLSBtdiAtZiBNYWtlZmlsZS50bXAgTWFrZWZpbGUKLSAKLSsKLSBjYXNlIHgkQ09ORklHX0hFQURFUlMgaW4KLSB4Y29uZmlnLmg6Y29uZmlnLmluKQotIGVjaG8gPiBzdGFtcC1oIDs7Ci1AQCAtMTI0OTksMTUgKzE0ODE1LDE2IEBACi0gIDs7Ci0gICBlc2FjCi0gZG9uZQotLUVPRgotK19BQ0VPRgotIAotLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIAotIHsgKGV4aXQgMCk7IGV4aXQgMDsgfQotLUVPRgotK19BQ0VPRgotIGNobW9kICt4ICRDT05GSUdfU1RBVFVTCi0gYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLSAKLSsKLSAjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCi0gIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCi0gIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KLUBAIC0xMjU1Myw3MSArMTQ4NzAsOTIgQEAKLSAgICAgICBhY19wcmV2PXNyY2RpciA7OwotICAgICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgICAgIDs7Ci0rICAgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0rICAgICAgYWNfcHJldj1wcmVmaXggOzsKLSsgICAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotKyAgICAgIDs7Ci0gICAgICopIGFjX3N1Yl9jb25maWd1cmVfYXJncz0iJGFjX3N1Yl9jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICAgICBlc2FjCi0gICBkb25lCi0gCi0tICBmb3IgYWNfc3ViZGlyIGluIDogJHN1YmRpcnM7IGRvIHRlc3QgIngkYWNfc3ViZGlyIiA9IHg6ICYmIGNvbnRpbnVlCi0rICAjIEFsd2F5cyBwcmVwZW5kIC0tcHJlZml4IHRvIGVuc3VyZSB1c2luZyB0aGUgc2FtZSBwcmVmaXgKLSsgICMgaW4gc3ViZGlyIGNvbmZpZ3VyYXRpb25zLgotKyAgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPSItLXByZWZpeD0kcHJlZml4ICRhY19zdWJfY29uZmlndXJlX2FyZ3MiCi0rCi0rICBhY19wb3BkaXI9YHB3ZGAKLSsgIGZvciBhY19kaXIgaW4gOiAkc3ViZGlyczsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAKLSAgICAgIyBEbyBub3QgY29tcGxhaW4sIHNvIGEgY29uZmlndXJlIHNjcmlwdCBjYW4gY29uZmlndXJlIHdoaWNoZXZlcgotICAgICAjIHBhcnRzIG9mIGEgbGFyZ2Ugc291cmNlIHRyZWUgYXJlIHByZXNlbnQuCi0tICAgIHRlc3QgLWQgJHNyY2Rpci8kYWNfc3ViZGlyIHx8IGNvbnRpbnVlCi0rICAgIHRlc3QgLWQgJHNyY2Rpci8kYWNfZGlyIHx8IGNvbnRpbnVlCi0gCi0tICAgIHsgZWNobyAiJGFzX21lOjEyNTY2OiBjb25maWd1cmluZyBpbiAkYWNfc3ViZGlyIiA+JjUKLS1lY2hvICIkYXNfbWU6IGNvbmZpZ3VyaW5nIGluICRhY19zdWJkaXIiID4mNjt9Ci0tICAgIGNhc2UgJHNyY2RpciBpbgotLSAgICAuKSA7OwotLSAgICAqKSB7IGNhc2UgIi4vJGFjX3N1YmRpciIgaW4KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY29uZmlndXJpbmcgaW4gJGFjX2RpciIgPiY1Ci0rZWNobyAiJGFzX21lOiBjb25maWd1cmluZyBpbiAkYWNfZGlyIiA+JjY7fQotKyAgICB7IGNhc2UgIiRhY19kaXIiIGluCi0gICBbXFwvXSogfCA/OltcXC9dKiApIGFzX2luY3JfZGlyPTs7Ci0gICAqKSAgICAgICAgICAgICAgICAgICAgICBhc19pbmNyX2Rpcj0uOzsKLSBlc2FjCi0tYXNfZHVtbXk9Ii4vJGFjX3N1YmRpciIKLSthc19kdW1teT0iJGFjX2RpciIKLSBmb3IgYXNfbWtkaXJfZGlyIGluIGBJRlM9Jy9cXCc7IHNldCBYICRhc19kdW1teTsgc2hpZnQ7IGVjaG8gIiRAImA7IGRvCi0gICBjYXNlICRhc19ta2Rpcl9kaXIgaW4KLSAgICAgIyBTa2lwIERPUyBkcml2ZXNwZWMKLSAgICAgPzopIGFzX2luY3JfZGlyPSRhc19ta2Rpcl9kaXIgOzsKLSAgICAgKikKLSAgICAgICBhc19pbmNyX2Rpcj0kYXNfaW5jcl9kaXIvJGFzX21rZGlyX2RpcgotLSAgICAgIHRlc3QgLWQgIiRhc19pbmNyX2RpciIgfHwgbWtkaXIgIiRhc19pbmNyX2RpciIKLSsgICAgICB0ZXN0IC1kICIkYXNfaW5jcl9kaXIiIHx8Ci0rICAgICAgICBta2RpciAiJGFzX2luY3JfZGlyIiB8fAotKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIFwiJGFjX2RpclwiIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIFwiJGFjX2RpclwiIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICA7OwotICAgZXNhYwotIGRvbmU7IH0KLSAKLS0gICAgICAgaWYgdGVzdCAtZCAuLyRhY19zdWJkaXI7IHRoZW4gOjsKLS0gICAgICAgZWxzZQotLSAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6MTI1ODg6IGVycm9yOiBjYW5ub3QgY3JlYXRlIFxgcHdkXGAvJGFjX3N1YmRpciIgPiY1Ci0tZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBcYHB3ZFxgLyRhY19zdWJkaXIiID4mMjt9Ci0tICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0tICAgICAgIGZpCi0tICAgICAgIDs7Ci0tICAgIGVzYWMKLSsgICAgYWNfYnVpbGRkaXI9LgotKwotK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSsgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKLSsgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0rICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCi0rZWxzZQotKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQotK2ZpCi0rCi0rY2FzZSAkc3JjZGlyIGluCi0rICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0rICAgIGFjX3NyY2Rpcj0uCi0rICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCi0rICAgICAgIGFjX3RvcF9zcmNkaXI9LgotKyAgICBlbHNlCi0rICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKLSsgICAgZmkgOzsKLSsgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KLSsgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSsgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0rICAqKSAjIFJlbGF0aXZlIHBhdGguCi0rICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4Ci0rICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKLStlc2FjCi0rIyBEb24ndCBibGluZGx5IHBlcmZvcm0gYSBgY2QgIiRhY19kaXIiLyRhY19mb28gJiYgcHdkYCBzaW5jZSAkYWNfZm9vIGNhbiBiZQotKyMgYWJzb2x1dGUuCi0rYWNfYWJzX2J1aWxkZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX2J1aWxkZGlyICYmIHB3ZGAKLSthY19hYnNfdG9wX2J1aWxkZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX3RvcF9idWlsZGRpciAmJiBwd2RgCi0rYWNfYWJzX3NyY2Rpcj1gY2QgIiRhY19kaXIiICYmIGNkICRhY19zcmNkaXIgJiYgcHdkYAotK2FjX2Fic190b3Bfc3JjZGlyPWBjZCAiJGFjX2RpciIgJiYgY2QgJGFjX3RvcF9zcmNkaXIgJiYgcHdkYAotIAotLSAgICBhY19wb3BkaXI9YHB3ZGAKLS0gICAgY2QgJGFjX3N1YmRpcgotIAotLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluIC8kYWNfc3ViZGlyLgotLSAgICBhY19kb3RzPWBlY2hvICRhY19zdWJkaXIgfAotLSAgICAgICAgICAgICBzZWQgJ3MsXlwuLywsO3MsW14vXSQsJi8sO3MsW14vXSovLC4uLyxnJ2AKLS0KLS0gICAgY2FzZSAkc3JjZGlyIGluCi0tICAgIC4pICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgotLSAgICAgIGFjX3N1Yl9zcmNkaXI9JHNyY2RpciA7OwotLSAgICBbXFwvXSogfCA/OltcXC9dKiApICMgQWJzb2x1dGUgcGF0aC4KLS0gICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIvJGFjX3N1YmRpciA7OwotLSAgICAqKSAjIFJlbGF0aXZlIHBhdGguCi0tICAgICAgYWNfc3ViX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIvJGFjX3N1YmRpciA7OwotLSAgICBlc2FjCi0rICAgIGNkICRhY19kaXIKLSAKLSAgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KLS0gICAgaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuZ251OyB0aGVuCi0tICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0iJFNIRUxMICckYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuZ251JyIKLS0gICAgZWxpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgotLSAgICAgIGFjX3N1Yl9jb25maWd1cmU9IiRTSEVMTCAnJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlJyIKLS0gICAgZWxpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgotKyAgICBpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgotKyAgICAgIGFjX3N1Yl9jb25maWd1cmU9IiRTSEVMTCAnJGFjX3NyY2Rpci9jb25maWd1cmUuZ251JyIKLSsgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlOyB0aGVuCi0rICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0iJFNIRUxMICckYWNfc3JjZGlyL2NvbmZpZ3VyZSciCi0rICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgotICAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX2NvbmZpZ3VyZQotICAgICBlbHNlCi0tICAgICAgeyBlY2hvICIkYXNfbWU6MTI2MTk6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX3N1YmRpciIgPiY1Ci0tZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19zdWJkaXIiID4mMjt9Ci0rICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyO30KLSAgICAgICBhY19zdWJfY29uZmlndXJlPQotICAgICBmaQotIAotQEAgLTEyNjI3LDIxICsxNDk2NSwyMiBAQAotICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgICBbXFwvXSogfCA/OltcXC9dKiApIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7Ci0gICAgICAgKikgIyBSZWxhdGl2ZSBwYXRoLgotLSAgICAgICAgYWNfc3ViX2NhY2hlX2ZpbGU9JGFjX2RvdHMkY2FjaGVfZmlsZSA7OwotKyAgICAgICAgYWNfc3ViX2NhY2hlX2ZpbGU9JGFjX3RvcF9idWlsZGRpciRjYWNoZV9maWxlIDs7Ci0gICAgICAgZXNhYwotIAotLSAgICAgIHsgZWNobyAiJGFzX21lOjEyNjMzOiBydW5uaW5nICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpciIgPiY1Ci0tZWNobyAiJGFzX21lOiBydW5uaW5nICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpciIgPiY2O30KLSsgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBydW5uaW5nICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3JjZGlyIiA+JjUKLStlY2hvICIkYXNfbWU6IHJ1bm5pbmcgJGFjX3N1Yl9jb25maWd1cmUgJGFjX3N1Yl9jb25maWd1cmVfYXJncyAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zcmNkaXIiID4mNjt9Ci0gICAgICAgIyBUaGUgZXZhbCBtYWtlcyBxdW90aW5nIGFyZ3VtZW50cyB3b3JrLgotICAgICAgIGV2YWwgJGFjX3N1Yl9jb25maWd1cmUgJGFjX3N1Yl9jb25maWd1cmVfYXJncyBcCi0tICAgICAgICAgICAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zdWJfc3JjZGlyIHx8Ci0tICAgICAgICB7IHsgZWNobyAiJGFzX21lOjEyNjM4OiBlcnJvcjogJGFjX3N1Yl9jb25maWd1cmUgZmFpbGVkIGZvciAkYWNfc3ViZGlyIiA+JjUKLS1lY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfc3ViX2NvbmZpZ3VyZSBmYWlsZWQgZm9yICRhY19zdWJkaXIiID4mMjt9Ci0rICAgICAgICAgICAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zcmNkaXIgfHwKLSsgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRhY19zdWJfY29uZmlndXJlIGZhaWxlZCBmb3IgJGFjX2RpciIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX3N1Yl9jb25maWd1cmUgZmFpbGVkIGZvciAkYWNfZGlyIiA+JjI7fQotICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICBmaQotIAotICAgICBjZCAkYWNfcG9wZGlyCi0gICBkb25lCi0gZmkKLSsKLSAKLSBleGl0IDAKLS0tLSBzcmMtb2xkL2dkYi9jb25maWcuaW4JV2VkIEF1ZyAyOCAxMjowNzo1NyAyMDAyCi0rKysgc3JjL2dkYi9jb25maWcuaW4JU3VuIE1hciAxNiAyMToyMDoxOSAyMDAzCi1AQCAtNTkzLDMgKzU5Myw2IEBACi0gCi0gLyogRGVmaW5lIGFzIGBmb3JrJyBpZiBgdmZvcmsnIGRvZXMgbm90IHdvcmsuICovCi0gI3VuZGVmIHZmb3JrCi0rCi0rLyogRGVmaW5lIGZvciBBSUYgc3VwcG9ydC4gKi8KLSsjdW5kZWYgSEFWRV9BSUYKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3BhdGNoZXMvZ2RiLTUuMC5wYXRjaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3BhdGNoZXMvZ2RiLTUuMC5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmY2UwOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2dkYi01LjAucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw0Mzk0ICswLDAgQEAKLS0tLSAvZGV2L251bGwJVHVlIE1hciAyNSAxNzowODoxOCAyMDAzCi0rKysgZ2RiLTUuMC9nZGIvYWlmLXZhbHByaW50LmMJVHVlIE1hciAyNSAxNzoxNToyOSAyMDAzCi1AQCAtMCwwICsxLDExMzUgQEAKLSsvKiBTdXBwb3J0IGZvciBwcmludGluZyBDIGFuZCBDKysgdHlwZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSsgICBDb3B5cmlnaHQgMTk4NiwgMTk4OCwgMTk4OSwgMTk5MSwgMTk5My0xOTk2LCAxOTk4LTIwMDAKLSsgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSsKLSsgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0rCi0rICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0rICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSsKLSsgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSsgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSsgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKwotKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0rICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSsgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0rICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotKwotKyNpbmNsdWRlICJkZWZzLmgiCi0rI2luY2x1ZGUgIm9ic3RhY2suaCIKLSsjaW5jbHVkZSAiYmZkLmgiCQkvKiBCaW5hcnkgRmlsZSBEZXNjcmlwdGlvbiAqLwotKyNpbmNsdWRlICJzeW10YWIuaCIKLSsjaW5jbHVkZSAiZ2RidHlwZXMuaCIKLSsjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgotKyNpbmNsdWRlICJ2YWx1ZS5oIgotKyNpbmNsdWRlICJ2YWxwcmludC5oIgotKyNpbmNsdWRlICJnZGJjb3JlLmgiCi0rI2luY2x1ZGUgInRhcmdldC5oIgotKyNpbmNsdWRlICJjb21tYW5kLmgiCi0rI2luY2x1ZGUgImdkYmNtZC5oIgotKyNpbmNsdWRlICJsYW5ndWFnZS5oIgotKyNpbmNsdWRlICJkZW1hbmdsZS5oIgotKyNpbmNsdWRlICJjLWxhbmcuaCIKLSsjaW5jbHVkZSAidHlwZXByaW50LmgiCi0rI2luY2x1ZGUgInVpLWZpbGUuaCIKLSsKLSsjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotKyNpbmNsdWRlICJhaWYuaCIKLSsjaW5jbHVkZSA8ZXJybm8uaD4KLSsjaW5jbHVkZSA8Y3R5cGUuaD4KLSt2b2lkIG1lbV9maWxlX2RlbGV0ZSAoc3RydWN0IHVpX2ZpbGUgKmZpbGUpOwotKwotKwwKLSsvKiB0aGUgZm9sbG93aW5nIGNvbWVzIGZyb20gdGhlIGFpZiBsaWJyYXJ5LCBjb252LmMsIHdyaXR0ZW4gYnkgR3JlZy4gKi8KLSsKLSsjaWZkZWYgV0lORE9XU05UCi0rI2RlZmluZSBCSVRTUEVSQllURQk4Ci0rI2Vsc2UgLyogV0lORE9XU05UICovCi0rI2luY2x1ZGUJPHZhbHVlcy5oPgotKyNlbmRpZiAvKiBXSU5ET1dTTlQgKi8KLSsKLSt1bmlvbiBpZWVlX2RvdWJsZQotK3sKLSsJZmxvYXQJCWY7Ci0rCWRvdWJsZQkJZDsKLSsjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotKwlsb25nIGRvdWJsZQlsOwotKyNlbmRpZiAvKiBIQVZFX0xPTkdfRE9VQkxFICovCi0rCWNoYXIJCWNbc2l6ZW9mKERPVUJMRVNUKV07Ci0rfTsKLSsKLSsMCi0rLyogRm9yIGxpbmtlZCBkYXRhIHN0cnVjdHVyZXMsIHdlIGNoZWNrIGZvciBjaXJjdWxhcml0eSBieSByZWNvcmRpbmcgdGhlIHZhbHVlcwotKyAqIG9mIGFsbCBwb2ludGVycyBhbmQgdHlwZXMgd2Ugc2VlLiAgSW4gYSBsYXRlciBwYXNzLCB3ZSBlbWl0IGEgbmFtZSBvbiB0aG9zZQotKyAqIHR5cGVzIGFuZCBhbiBvZmZzZXQgZm9yIHRob3NlIHZhbHVlcwotKyAqIHRoYXQgYXBwZWFyIG1vcmUgdGhhbiBvbmNlLiAqLwotK3N0cnVjdCB2YWx1ZV9pbmZvIHsKLSsgIENPUkVfQUREUiBhZGRyOwotKyAgaW50IHVzZWQ7IC8qIDA6IGFwcGVhcnMsIG5vdCBwb2ludGVkIHRvLiAgMTogaXMgcG9pbnRlZCB0by4gIDI6IHZhbHVlIGhhcyBiZWVuCi0rICAgIGVtaXR0ZWQgKi8KLSt9OwotK3N0cnVjdCB0eXBlX2luZm8gewotKyAgc3RydWN0IHR5cGUgKnR5cGU7Ci0rICBpbnQgdXNlZDsgLyogMDogYXBwZWFycywgbm90IHBvaW50ZWQgdG8uICAxOiBpcyBwb2ludGVkIHRvLiAgMjogbmFtZSBoYXMgYmVlbgotKyAgICBlbWl0dGVkICovCi0rfTsKLSsKLSsjZGVmaW5lIE1BWF9WQUxVRVNfU0VFTiAxMDAwCi0rCS8qIGhvcGUgdGhhdCB0aGUgc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBtb3JlIGRpc3RpbmN0IHBvaW50ZXIgdmFsdWVzICovCi0rc3RydWN0IHZhbHVlX2luZm8gdmFsdWVzU2VlbltNQVhfVkFMVUVTX1NFRU4rMV07IC8qIGV4dHJhIHNwYWNlIGZvcgotKyAgcHNldWRvLWRhdGEgKi8KLStpbnQgbnVtVmFsdWVzU2VlbjsKLSsjZGVmaW5lIE1BWF9UWVBFU19TRUVOIDEwMAotKwkvKiBob3BlIHRoYXQgdGhlIHN0cnVjdHVyZSBkb2Vzbid0IGhhdmUgbW9yZSBkaXN0aW5jdCB0eXBlcyB2YWx1ZXMgKi8KLStzdHJ1Y3QgdHlwZV9pbmZvIHR5cGVzU2VlbltNQVhfVFlQRVNfU0VFTisxXTsgLyogZXh0cmEgc3BhY2UgZm9yCi0rICBwc2V1ZG8tZGF0YSAqLwotK2ludCBudW1UeXBlc1NlZW47Ci0rCi0rdHlwZWRlZiBlbnVtIHtkb1R5cGUsIGRvVmFsdWV9IGRvV2hhdDsKLSsKLStzdHJ1Y3Qgc3RyX3R5cGUKLSt7Ci0rCWludAlibGVuOwotKwlpbnQJc2xlbjsKLSsJaW50CWVuZDsKLSsJY2hhciAqCWJ1ZjsKLSt9OwotKwotK3R5cGVkZWYgc3RydWN0IHN0cl90eXBlICoJc3RyX3B0cjsKLSsKLStzdHJfcHRyIHN0cl9pbml0KHZvaWQpOwotK3ZvaWQgc3RyX2FkZChzdHJfcHRyLCBjaGFyICopOwotK3ZvaWQgc3RyX2ZyZWUoc3RyX3B0cik7Ci0rY2hhciAqc3RyX3ZhbChzdHJfcHRyKTsKLStzdHJfcHRyIHN0cl9kdXAoY2hhciAqKTsKLSsKLSsvKiBmaWxsIGluIHRoZSB2YWx1ZXNTZWVuIGFycmF5IHdpdGggYWxsIHRoZSBwb2ludGVyIHZhbHVlcyB3ZSBzZWUgKi8KLSt2b2lkIGFpZl9kaXNjb3Zlcih0eXBlLCB2YWxhZGRyLCB3aGF0KQotKyAgc3RydWN0IHR5cGUgKnR5cGU7Ci0rICBjaGFyICp2YWxhZGRyOwotKyAgZG9XaGF0IHdoYXQ7Ci0rewotKyAgaW50IHZhbHVlc1NlZW5JbmRleDsKLSsgIHN0cnVjdCB0eXBlICplbHR0eXBlOwotKyAgdW5zaWduZWQgaW50IGVsdGxlbiwgb2Zmc2V0OwotKyAgQ09SRV9BRERSIGFkZHI7Ci0rICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCi0rICAgIHsKLSsgICAgY2FzZSBUWVBFX0NPREVfVFlQRURFRjoKLSsgICAgICBhaWZfZGlzY292ZXIoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHZhbGFkZHIsIHdoYXQpOwotKyAgICAgIGJyZWFrOwotKwotKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKLSsgICAgICBpZiAod2hhdCA9PSBkb1ZhbHVlKQotKyAgICAgIHsgLyogbG9va2luZyBmb3IgdmFsdWVzICovCi0rCXZhbHVlX3B0ciBkZXJlZl92YWw7Ci0rCWFkZHIgPSB1bnBhY2tfcG9pbnRlciAodHlwZSwgdmFsYWRkcik7Ci0rCWlmIChhZGRyID09IDApIGJyZWFrOwotKwllbHR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKwlpZiAoVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9QVFIgJiYKLSsJICBUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1JFRiAmJgotKwkgIFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUKQotKwkgIGJyZWFrOyAvKiBubyBuZWVkIHRvIHJlbWVtYmVyIHBvaW50ZXJzIG5vdCBsZWFkaW5nIHRvIGN5Y2xlcyAqLwotKwlmb3IgKHZhbHVlc1NlZW5JbmRleCA9IDA7IHZhbHVlc1NlZW5JbmRleCA8IG51bVZhbHVlc1NlZW47Ci0rCXZhbHVlc1NlZW5JbmRleCsrKQotKwl7Ci0rCSAgaWYgKGFkZHIgPT0gdmFsdWVzU2Vlblt2YWx1ZXNTZWVuSW5kZXhdLmFkZHIpCi0rCSAgewotKwkgICAgdmFsdWVzU2Vlblt2YWx1ZXNTZWVuSW5kZXhdLnVzZWQgPSAxOyAvKiBmb3VuZCBhIGNpcmN1bGFyaXR5ICovCi0rCSAgICByZXR1cm47Ci0rCSAgfQotKwl9Ci0rCWlmIChudW1WYWx1ZXNTZWVuIDwgTUFYX1ZBTFVFU19TRUVOKQotKwkgIHsKLSsJICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0uYWRkciA9IGFkZHI7Ci0rCSAgICB2YWx1ZXNTZWVuW251bVZhbHVlc1NlZW5dLnVzZWQgPSAwOwotKwkgICAgbnVtVmFsdWVzU2VlbiArPSAxOwotKwkgIH0KLSsJLyoKLSsJKiogQ2hlY2sgYWRkciBpcyB2YWxpZCEKLSsJKi8KLSsJaWYgKCBjaGVja192YWx1ZShlbHR0eXBlLCBhZGRyLCAmZGVyZWZfdmFsKSApCi0rCQlhaWZfZGlzY292ZXIoZWx0dHlwZSwgVkFMVUVfQ09OVEVOVFMgKGRlcmVmX3ZhbCksIHdoYXQpOwotKwlicmVhazsKLSsgICAgICB9IGVsc2UgewotKwkvKiBsb29raW5nIGZvciB0eXBlcyAqLwotKwlpbnQgdHlwZXNTZWVuSW5kZXg7Ci0rCWVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rCWlmIChUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1BUUiAmJgotKwkgIFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfUkVGICYmCi0rCSAgVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCi0rCSAgYnJlYWs7IC8qIG5vIG5lZWQgdG8gcmVtZW1iZXIgcG9pbnRlcnMgbm90IGxlYWRpbmcgdG8gY3ljbGVzICovCi0rCWZvciAodHlwZXNTZWVuSW5kZXggPSAwOyB0eXBlc1NlZW5JbmRleCA8IG51bVR5cGVzU2VlbjsKLSsJdHlwZXNTZWVuSW5kZXgrKykKLSsJewotKwkgIGlmIChlbHR0eXBlID09IHR5cGVzU2Vlblt0eXBlc1NlZW5JbmRleF0udHlwZSkKLSsJICB7Ci0rCSAgICB0eXBlc1NlZW5bdHlwZXNTZWVuSW5kZXhdLnVzZWQgPSAxOyAvKiBmb3VuZCBhIGNpcmN1bGFyaXR5ICovCi0rCSAgICByZXR1cm47Ci0rCSAgfQotKwl9Ci0rCWlmIChudW1UeXBlc1NlZW4gPCBNQVhfVFlQRVNfU0VFTikKLSsJICB7Ci0rCSAgICB0eXBlc1NlZW5bbnVtVHlwZXNTZWVuXS50eXBlID0gZWx0dHlwZTsKLSsJICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnVzZWQgPSAwOwotKwkgICAgbnVtVHlwZXNTZWVuICs9IDE7Ci0rCSAgfQotKwlhaWZfZGlzY292ZXIoZWx0dHlwZSwgMCwgd2hhdCk7Ci0rCWJyZWFrOwotKyAgICAgIH0gLyogZGlzY292ZXIgdHlwZXMgKi8KLSsKLSsgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgotKyAgICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKLSsgICAgICB7IC8qIGRpc2NvdmVyIGVpdGhlciB2YWx1ZXMgb3IgdHlwZXMgKi8KLSsJaW50IGk7Ci0rICAgICAgCXN0cnVjdCBmaWVsZCAqdGhpc0ZpZWxkOwotKwlzdHJ1Y3QgdHlwZSAqZnR5cGU7Ci0rCXZhbHVlX3B0ciB2OwotKwotKwlmb3IgKCBpID0gMDsgaSA8IFRZUEVfTkZJRUxEUyh0eXBlKTsgaSsrICkKLSsJewotKwkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJY29udGludWU7Ci0rCi0rCQlpZiAoIHdoYXQgPT0gZG9UeXBlICkKLSsJCXsKLSsJCQlhaWZfZGlzY292ZXIoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLCAwLCB3aGF0KTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCWlmIAotKwkJKAotKwkJCSFUWVBFX0ZJRUxEX1NUQVRJQyh0eXBlLCBpKSAKLSsJCQkmJiAKLSsJCQlUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKQotKwkJKQotKwkJewotKwkJCXYgPSB2YWx1ZV9mcm9tX2xvbmdlc3QoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLAotKwkJCQl1bnBhY2tfZmllbGRfYXNfbG9uZyAodHlwZSwgdmFsYWRkciwgaSkpOwotKwotKwkJCWFpZl9kaXNjb3ZlcihUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCBWQUxVRV9DT05URU5UUyh2KSwgd2hhdCk7Ci0rCQl9Ci0rCQllbHNlIGlmICggVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpICkKLSsJCXsKLSsJCQl2ID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpKTsKLSsKLSsJCQlpZiAoIHYgPT0gTlVMTCApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCS8qCi0rCQkJWFhYCi0rCQkJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCB2LAotKwkJCXN0cmVhbSwgZm9ybWF0LCByZWN1cnNlICsgMSwKLSsJCQlwcmV0dHkpOwotKwkJCSovCi0rCQl9Ci0rCQllbHNlCi0rCQl7Ci0rCQkJYWlmX2Rpc2NvdmVyKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpKSwgdmFsYWRkciArIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSAvIDgsIHdoYXQpOwotKwkJfQotKwkgIH0KLSsgICAgICB9Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKyAgICAgIGVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rICAgICAgaWYgKHdoYXQgPT0gZG9WYWx1ZSkKLSsgICAgICB7IC8qIGxvb2tpbmcgZm9yIHZhbHVlcyAqLwotKwl1bnNpZ25lZCBpbnQgdGVtcF9sZW4sIGxlbjsKLSsJZWx0bGVuID0gVFlQRV9MRU5HVEggKGVsdHR5cGUpOwotKwlsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSkgLyBlbHRsZW47Ci0rCW9mZnNldCA9IDA7Ci0rCWZvciAodGVtcF9sZW4gPSAwOyB0ZW1wX2xlbiA8IGxlbjsgdGVtcF9sZW4rKykKLSsJICB7Ci0rCSAgICBhaWZfZGlzY292ZXIoZWx0dHlwZSwgdmFsYWRkcitvZmZzZXQsIHdoYXQpOwotKwkgICAgb2Zmc2V0ICs9IGVsdGxlbjsKLSsJICB9Ci0rICAgICAgfSBlbHNlIHsgLyogbG9va2luZyBmb3IgdHlwZXMgKi8KLSsJYWlmX2Rpc2NvdmVyKGVsdHR5cGUsIDAsIHdoYXQpOwotKyAgICAgIH0gLyogVFlQRV9DT0RFX0FSUkFZICovCi0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKLSsgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgotKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgotKyAgICBjYXNlIFRZUEVfQ09ERV9VTkRFRjoKLSsgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKLSsgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKLSsgICAgY2FzZSBUWVBFX0NPREVfSU5UOgotKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1ZPSUQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgotKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgotKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJJTkc6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKLSsgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKLSsgICAgY2FzZSBUWVBFX0NPREVfVEVNUExBVEU6Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGRlZmF1bHQ6Ci0rICAgICAgZXJyb3IgKCJ0eXBlIG5vdCBoYW5kbGVkIGluIHR5cGVfZGlzY292ZXIiKTsKLSsgICAgICBicmVhazsKLSsgICAgfSAvKiBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpICovCi0rfSAvKiBhaWZfZGlzY292ZXIgKi8KLSsKLSsvKiBzcXVhc2ggdGhlIHZhbHVlc1NlZW4gYW5kIHR5cGVzU2VlbiBhcnJheXMgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGVsZW1lbnRzICovCi0rdm9pZCBhaWZfcmVkdWNlKCkKLSt7Ci0rICBpbnQgZnJvbnQsIGJhY2s7Ci0rICBmcm9udCA9IGJhY2sgPSAwOwotKyAgd2hpbGUgKGZyb250IDwgbnVtVmFsdWVzU2VlbikKLSsgICAgewotKyAgICAgIC8qIG1vdmUgYmFjayB0byBmaXJzdCB1bnVzZWQgZW50cnkgKi8KLSsgICAgICB2YWx1ZXNTZWVuW251bVZhbHVlc1NlZW5dLnVzZWQgPSAwOyAvKiBwc2V1ZG8tZGF0YSAqLwotKyAgICAgIHdoaWxlICh2YWx1ZXNTZWVuW2JhY2tdLnVzZWQpIGJhY2sgKz0gMTsKLSsgICAgICBpZiAoYmFjayA9PSBudW1WYWx1ZXNTZWVuKSBicmVhazsKLSsgICAgICAvKiBtb3ZlIGZyb250IHRvIGZpcnN0IHVzZWQgZW50cnkgYmV5b25kIGJhY2sgKi8KLSsgICAgICBpZiAoZnJvbnQgPD0gYmFjaykgZnJvbnQgPSBiYWNrKzE7Ci0rICAgICAgdmFsdWVzU2VlbltudW1WYWx1ZXNTZWVuXS51c2VkID0gMTsgLyogcHNldWRvLWRhdGEgKi8KLSsgICAgICB3aGlsZSAoIXZhbHVlc1NlZW5bZnJvbnRdLnVzZWQpIGZyb250ICs9IDE7Ci0rICAgICAgaWYgKGZyb250ID09IG51bVZhbHVlc1NlZW4pIGJyZWFrOwotKyAgICAgIC8qIGNvcHkgZnJvbSBmcm9udCB0byBiYWNrICovCi0rICAgICAgdmFsdWVzU2VlbltiYWNrXSA9IHZhbHVlc1NlZW5bZnJvbnRdOwotKyAgICAgIHZhbHVlc1NlZW5bZnJvbnRdLnVzZWQgPSAwOwotKyAgICB9Ci0rICBudW1WYWx1ZXNTZWVuID0gYmFjazsKLSsgIGZyb250ID0gYmFjayA9IDA7Ci0rICB3aGlsZSAoZnJvbnQgPCBudW1UeXBlc1NlZW4pCi0rICAgIHsKLSsgICAgICAvKiBtb3ZlIGJhY2sgdG8gZmlyc3QgdW51c2VkIGVudHJ5ICovCi0rICAgICAgdHlwZXNTZWVuW251bVR5cGVzU2Vlbl0udXNlZCA9IDA7IC8qIHBzZXVkby1kYXRhICovCi0rICAgICAgd2hpbGUgKHR5cGVzU2VlbltiYWNrXS51c2VkKSBiYWNrICs9IDE7Ci0rICAgICAgaWYgKGJhY2sgPT0gbnVtVHlwZXNTZWVuKSBicmVhazsKLSsgICAgICAvKiBtb3ZlIGZyb250IHRvIGZpcnN0IHVzZWQgZW50cnkgYmV5b25kIGJhY2sgKi8KLSsgICAgICBpZiAoZnJvbnQgPD0gYmFjaykgZnJvbnQgPSBiYWNrKzE7Ci0rICAgICAgdHlwZXNTZWVuW251bVR5cGVzU2Vlbl0udXNlZCA9IDE7IC8qIHBzZXVkby1kYXRhICovCi0rICAgICAgd2hpbGUgKCF0eXBlc1NlZW5bZnJvbnRdLnVzZWQpIGZyb250ICs9IDE7Ci0rICAgICAgaWYgKGZyb250ID09IG51bVR5cGVzU2VlbikgYnJlYWs7Ci0rICAgICAgLyogY29weSBmcm9tIGZyb250IHRvIGJhY2sgKi8KLSsgICAgICB0eXBlc1NlZW5bYmFja10gPSB0eXBlc1NlZW5bZnJvbnRdOwotKyAgICAgIHR5cGVzU2Vlbltmcm9udF0udXNlZCA9IDA7Ci0rICAgIH0KLSsgICAgbnVtVHlwZXNTZWVuID0gYmFjazsKLSt9IC8qIGFpZl9yZWR1Y2UgKi8KLSsKLStpbnQgZGF0YVN0cmVhbVBvczsKLSsKLSt2b2lkIGVtaXREYXRhKHRvRW1pdCwgc3RyZWFtKQotKyAgY2hhciB0b0VtaXQ7Ci0rICBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtOwotK3sKLSsgIGZwcmludGZfZmlsdGVyZWQoc3RyZWFtLCAiJTAyeCIsIHRvRW1pdCAmIDB4ZmYpOwotKyAgZGF0YVN0cmVhbVBvcyArPSAxOwotK30gLyogZW1pdERhdGEgKi8KLSsgIAotKy8qIGRlZmluZWQgaW4gdmFscHJpbnQuYzogKi8KLStpbnQKLStwYXJ0aWFsX21lbW9yeV9yZWFkIChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuLCBpbnQgKmVycm5vcHRyKTsKLSsKLSt2b2lkCi0rYWlmX2VtaXRfc3RyaW5nIChhZGRyLCBzdHJlYW0pCi0rICAgICBDT1JFX0FERFIgYWRkcjsKLSsgICAgIHN0cnVjdCB1aV9maWxlICpzdHJlYW07Ci0reyAvKiBjb2RlIG1vZGlmaWVkIGZyb20gdmFsX3ByaW50X3N0cmluZyAoKSAqLwotKyAgaW50IGVycmNvZGU7CQkJLyogRXJybm8gcmV0dXJuZWQgZnJvbSBiYWQgcmVhZHMuICovCi0rICB1bnNpZ25lZCBpbnQgZmV0Y2hsaW1pdDsJLyogTWF4aW11bSBudW1iZXIgb2YgY2hhcnMgdG8gcHJpbnQuICovCi0rICB1bnNpZ25lZCBpbnQgbmZldGNoOwkJLyogQ2hhcnMgdG8gZmV0Y2ggLyBjaGFycyBmZXRjaGVkLiAqLwotKyAgdW5zaWduZWQgaW50IGNodW5rc2l6ZTsJLyogU2l6ZSBvZiBlYWNoIGZldGNoLCBpbiBjaGFycy4gKi8KLSsgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CQkvKiBEeW5hbWljYWxseSBncm93YWJsZSBmZXRjaCBidWZmZXIuICovCi0rICBjaGFyICpidWZwdHI7CQkJLyogUG9pbnRlciB0byBuZXh0IGF2YWlsYWJsZSBieXRlIGluIGJ1ZmZlci4gKi8KLSsgIGNoYXIgKmxpbWl0OwkJCS8qIEZpcnN0IGxvY2F0aW9uIHBhc3QgZW5kIG9mIGZldGNoIGJ1ZmZlci4gKi8KLSsgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSBOVUxMOwkvKiBUb3Agb2YgdGhlIG9sZCBjbGVhbnVwIGNoYWluLiAqLwotKyAgaW50IGZvdW5kX251bDsJCS8qIE5vbi16ZXJvIGlmIHdlIGZvdW5kIHRoZSBudWwgY2hhciAqLwotKyAgdW5zaWduZWQgbG9uZyBidWZzaXplID0gMDsKLSsgIGludCBsZW5ndGg7CQkJLyogaG93IGxvbmcgdGhlIHN0cmluZyB0dXJuZWQgb3V0IHRvIGJlICovCi0rCi0rICBpZiAoYWRkciA9PSAwKQotKyAgewotKyAgICAgIGVtaXREYXRhKDAsIHN0cmVhbSk7Ci0rICAgICAgZW1pdERhdGEoMCwgc3RyZWFtKTsKLSsgICAgICByZXR1cm47Ci0rICB9Ci0rCi0rICBmZXRjaGxpbWl0ID0gcHJpbnRfbWF4OwotKyAgY2h1bmtzaXplID0gbWluICg4LCBmZXRjaGxpbWl0KTsKLSsgIC8qIExvb3AgdW50aWwgd2UgZWl0aGVyIGhhdmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHRvIHByaW50LCBvciB3ZSBlbmNvdW50ZXIKLSsgICAgIHNvbWUgZXJyb3IsIHN1Y2ggYXMgYnVtcGluZyBpbnRvIHRoZSBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuICovCi0rICBmb3VuZF9udWwgPSAwOwotKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChudWxsX2NsZWFudXAsIDApOwotKyAgZG8KLSsgICAgewotKyAgICAgIFFVSVQ7Ci0rICAgICAgbmZldGNoID0gbWluIChjaHVua3NpemUsIGZldGNobGltaXQgLSBidWZzaXplKTsKLSsgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCi0rCWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKG5mZXRjaCk7Ci0rICAgICAgZWxzZQotKwl7Ci0rCSAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKLSsJICBidWZmZXIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYnVmZmVyLCBuZmV0Y2ggKyBidWZzaXplKTsKLSsJfQotKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZSwgYnVmZmVyKTsKLSsgICAgICBidWZwdHIgPSBidWZmZXIgKyBidWZzaXplOwotKyAgICAgIGJ1ZnNpemUgKz0gbmZldGNoOwotKyAgICAgIC8qIFJlYWQgYXMgbXVjaCBhcyB3ZSBjYW4uICovCi0rICAgICAgbmZldGNoID0gcGFydGlhbF9tZW1vcnlfcmVhZCAoYWRkciwgYnVmcHRyLCBuZmV0Y2gsICZlcnJjb2RlKTsKLSsgICAgICAvKiBTY2FuIHRoaXMgY2h1bmsgZm9yIHRoZSBudWxsIGJ5dGUgKi8KLSsgICAgICBsaW1pdCA9IGJ1ZnB0ciArIG5mZXRjaDsKLSsgICAgICB3aGlsZSAoYnVmcHRyIDwgbGltaXQpCi0rCXsKLSsJICB1bnNpZ25lZCBsb25nIGM7Ci0rCSAgYyA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmcHRyLCAxKTsKLSsJICBhZGRyICs9IDE7Ci0rCSAgYnVmcHRyICs9IDE7Ci0rCSAgaWYgKGMgPT0gMCkKLSsJICAgIHsKLSsJICAgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBhbnkgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYWZ0ZXIKLSsJCSAgdGhlIE5VTEwgdGVybWluYXRvci4gICovCi0rCSAgICAgIGVycmNvZGUgPSAwOwotKwkgICAgICBmb3VuZF9udWwgPSAxOwotKwkgICAgICBicmVhazsKLSsJICAgIH0KLSsJfSAvKiB3aGlsZSAoYnVmcHRyIDwgbGltaXQpICovCi0rICAgIH0gLyogZG8gKi8KLSsgIHdoaWxlIChlcnJjb2RlID09IDAJLyogbm8gZXJyb3IgKi8KLSsJICAmJiBidWZwdHIgLSBidWZmZXIgPCBmZXRjaGxpbWl0CS8qIG5vIG92ZXJydW4gKi8KLSsJICAmJiAhZm91bmRfbnVsKTsJLyogaGF2ZW4ndCBmb3VuZCBudWwgeWV0ICovCi0rICBRVUlUOwotKyAgbGVuZ3RoID0gMDsKLSsgIGlmIChlcnJjb2RlID09IDAgfHwgYnVmcHRyID4gYnVmZmVyKQotKyAgICB7Ci0rICAgICAgbGVuZ3RoID0gYnVmcHRyIC0gYnVmZmVyIC0gMTsgLyogZG9uJ3QgaW5jbHVkZSBudWxsICovCi0rICAgICAgZW1pdERhdGEoKGxlbmd0aCA+PiA4KSAmIDA3Nywgc3RyZWFtKTsKLSsgICAgICBlbWl0RGF0YShsZW5ndGggJiAwNzcsIHN0cmVhbSk7Ci0rICAgICAgZm9yICg7IGxlbmd0aCA+IDA7IGxlbmd0aC0tKSB7Ci0rCWVtaXREYXRhKCpidWZmZXIrKywgc3RyZWFtKTsgCi0rICAgICAgfQotKyAgICB9Ci0rICBpZiAoZXJyY29kZSAhPSAwKQotKyAgICB7Ci0rICAgICAgaWYgKGVycmNvZGUgPT0gRUlPKQotKwl7Ci0rCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxBZGRyZXNzICIpOwotKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSsJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgb3V0IG9mIGJvdW5kcz4iKTsKLSsJfQotKyAgICAgIGVsc2UKLSsJewotKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiA8RXJyb3IgcmVhZGluZyBhZGRyZXNzICIpOwotKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSsJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI6ICVzPiIsIHNhZmVfc3RyZXJyb3IgKGVycmNvZGUpKTsKLSsJfQotKyAgICB9Ci0rICBnZGJfZmx1c2ggKHN0cmVhbSk7Ci0rICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKLSsgIHJldHVybjsKLSt9IC8qIGFpZl9lbWl0X3N0cmluZyAqLwotKwotK3N0cl9wdHIKLStnZGJfdHlwZV90b19mZHModHlwZSkKLSsJc3RydWN0IHR5cGUgKgl0eXBlOwotK3sKLSsJaW50CQlsZW47Ci0rCWludAkJZWxlbjsKLSsJaW50CQluZmllbGRzOwotKwlpbnQJCWk7Ci0rCWludAkJaXg7Ci0rCXN0cl9wdHIJCXM7Ci0rCXN0cl9wdHIJCXR5cGVfcHRyOwotKwlzdHJfcHRyCQl0eXBlX3N0cjsKLSsJc3RydWN0IHR5cGUgKglldHlwZTsKLSsKLSsJQ0hFQ0tfVFlQRURFRiAodHlwZSk7Ci0rCi0rCXR5cGVfc3RyID0gc3RyX2luaXQoKTsKLSsKLSsJZm9yICggaXggPSAwOyBpeCA8IG51bVR5cGVzU2VlbjsgaXgrKykKLSsJewotKwkJaWYgCi0rCQkoCi0rCQkJdHlwZXNTZWVuW2l4XS50eXBlICE9IHR5cGUKLSsJCQl8fAotKwkJCSF0eXBlc1NlZW5baXhdLnVzZWQKLSsJCSkKLSsJCQljb250aW51ZTsKLSsKLSsJCS8qCi0rCQkqKiBNdWx0aXBsZSB1c2UgdHlwZQotKwkJKi8KLSsKLSsJCWlmICggdHlwZXNTZWVuW2l4XS51c2VkICE9IDEgKQotKwkJewotKwkJCS8qIAotKwkJCSoqIHJlZmVycmluZyB0byBvbmUgYWxyZWFkeSBlbWl0dGVkIAotKwkJCSovCi0rCi0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9SRUZFUkVOQ0UsIGl4KSk7Ci0rCQkJcmV0dXJuIHR5cGVfc3RyOwotKwkJfQotKwotKwkJLyoKLSsJCSoqIGZpcnN0IHRpbWU7IGVtaXQgbmFtZQotKwkJKi8KLSsKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfTkFNRSwgaXgsIE5VTEwpKTsKLSsJCXR5cGVzU2VlbltpeF0udXNlZCA9IDI7Ci0rCQlicmVhazsKLSsJfQotKwotKwlsZW4gPSBUWVBFX0xFTkdUSCh0eXBlKTsKLSsKLSsJc3dpdGNoICggVFlQRV9DT0RFKHR5cGUpICkKLSsJewotKwljYXNlIFRZUEVfQ09ERV9UWVBFREVGOgotKwkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSk7Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBzdHJfdmFsKHR5cGVfcHRyKSk7Ci0rCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQlyZXR1cm4gdHlwZV9zdHI7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKwkJaWYgCi0rCQkoCi0rCQkJbGVuID4gMAotKwkJCSYmCi0rCQkJVFlQRV9MRU5HVEgoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSkgPiAwCi0rCQkpCi0rCQl7Ci0rCQkJZXR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKLSsJCQllbGVuID0gVFlQRV9MRU5HVEgoZXR5cGUpOwotKwkJCWxlbiAvPSBlbGVuOwotKwotKwkJCXR5cGVfcHRyID0gZ2RiX3R5cGVfdG9fZmRzKGV0eXBlKTsKLSsKLSsJCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0FSUkFZLCAKLSsJCQkJVHlwZVRvRkRTKEFJRl9SQU5HRSwgMCwgbGVuLTEsIAotKwkJCQkJVHlwZVRvRkRTKEFJRl9JTlRFR0VSLCAxLCBzaXplb2YoaW50KSkpLAotKwkJCQlzdHJfdmFsKHR5cGVfcHRyKSkpOwotKwotKwkJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBhIHBvaW50ZXIuLi4KLSsJCSovCi0rCi0rCWNhc2UgVFlQRV9DT0RFX1BUUjoKLSsJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsJCWVsZW4gPSBUWVBFX0xFTkdUSChldHlwZSk7Ci0rCi0rCQlpZiAKLSsJCSgKLSsJCQllbGVuID09IDEKLSsJCQkmJgotKwkJCVRZUEVfQ09ERShldHlwZSkgPT0gVFlQRV9DT0RFX0lOVAotKwkJKQotKwkJewotKwkJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfU1RSSU5HKSk7Ci0rCQl9Ci0rCQllbHNlCi0rCQl7Ci0rCQkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCXN0cl9hZGQodHlwZV9zdHIsIAotKwkJCQlUeXBlVG9GRFMoQUlGX1BPSU5URVIsIHN0cl92YWwodHlwZV9wdHIpKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJfQotKwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0lOVDoKLSsJCWlmCi0rCQkoCi0rCQkJbGVuICE9IDEKLSsJCQl8fAotKwkJCXN0cm5jbXAoVFlQRV9OQU1FKHR5cGUpLCAiY2hhciIsIDUpICE9IDAKLSsJCSkgCi0rCQl7Ci0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJCVR5cGVUb0ZEUyhBSUZfSU5URUdFUiwgVFlQRV9VTlNJR05FRCh0eXBlKSA/IDAgOiAxLCBsZW4pKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBjaGFyLi4uCi0rCQkqLwotKwotKwljYXNlIFRZUEVfQ09ERV9DSEFSOgotKwkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9DSEFSQUNURVIpKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0ZMT0FUSU5HLCBsZW4pKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOSU9OOgotKwkJbmZpZWxkcyA9IFRZUEVfTkZJRUxEUyh0eXBlKTsKLSsJCQotKwkJaWYgKCBIQVZFX0NQTFVTX1NUUlVDVCh0eXBlKSApCi0rCQkJaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyh0eXBlKTsKLSsJCWVsc2UKLSsJCQlpID0gMDsKLSsKLSsJCS8qCi0rCQkqKiBGaXJzdCBuZWVkIHRvIGNhbGN1bGF0ZSBzaXplIG9mIHN0cnVjdCwgc2luY2UgaXQKLSsJCSoqIG1heSBub3QgYmUgcGFja2VkLgotKwkJKi8KLSsKLSsJCWZvciAoIGxlbiA9IDAgOyBpIDwgbmZpZWxkcyA7IGkrKyApCi0rCQl7Ci0rCQkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaSkpOwotKwkJCWVsZW4gPSBUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKSA/Ci0rCQkJCQlUWVBFX0ZJRUxEX0JJVFNJWkUodHlwZSwgaSkgLyA4IDoKLSsJCQkJCVRZUEVfTEVOR1RIKGV0eXBlKTsKLSsKLSsJCQlpZiAoIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUICkKLSsJCQkJbGVuICs9IGVsZW47Ci0rCQkJZWxzZSBpZiAoIGVsZW4gPiBsZW4gKQotKwkJCQlsZW4gPSBlbGVuOwotKwkJfQotKwotKwkJdHlwZV9wdHIgPSBzdHJfZHVwKFR5cGVUb0ZEUyhBSUZfU1RSVUNUKSk7Ci0rCi0rCQkvKgotKwkJKiogTmVlZCB0byBjYWxjdWxhdGUgb2Zmc2V0IChsZW4pLgotKwkJKi8KLSsJCWxlbiA9IDA7Ci0rCi0rCQlpZiAoIEhBVkVfQ1BMVVNfU1RSVUNUKHR5cGUpICkKLSsJCQlpID0gVFlQRV9OX0JBU0VDTEFTU0VTKHR5cGUpOwotKwkJZWxzZQotKwkJCWkgPSAwOwotKwotKwkJZm9yICg7IGkgPCBuZmllbGRzIDsgaSsrICkKLSsJCXsKLSsJCQljaGFyICp0OwotKwotKwkJCWlmICggVFlQRV9GSUVMRF9JR05PUkUodHlwZSwgaSkgKQotKwkJCQljb250aW51ZTsKLSsKLSsJCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpKTsKLSsKLSsJCQllbGVuID0gVFlQRV9GSUVMRF9QQUNLRUQodHlwZSwgaSkgPwotKwkJCQlUWVBFX0ZJRUxEX0JJVFNJWkUodHlwZSwgaSkgOgotKwkJCQlUWVBFX0xFTkdUSChldHlwZSkgKiA4OwotKwotKwkJCXMgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCWlmICggSEFWRV9DUExVU19TVFJVQ1QodHlwZSkgKQotKwkJCXsKLSsJCQkJaWYgKCBUWVBFX0ZJRUxEX1BST1RFQ1RFRCh0eXBlLCBpKSApCi0rCQkJCQl0ID0gRkRTQWRkRmllbGRUb0NsYXNzKAotKwkJCQkJCXN0cl92YWwodHlwZV9wdHIpLAotKwkJCQkJICAgIAlBSUZBQ0NfUFJPVEVDVEVELCAKLSsJCQkJCSAgICAJVFlQRV9GSUVMRF9OQU1FKHR5cGUsIGkpLCAKLSsJCQkJCQlzdHJfdmFsKHMpKTsKLSsJCQkJZWxzZSBpZiAoIFRZUEVfRklFTERfUFJJVkFURSh0eXBlLCBpKSApCi0rCQkJCQl0ID0gRkRTQWRkRmllbGRUb0NsYXNzKAotKwkJCQkJCXN0cl92YWwgKHR5cGVfcHRyKSwgCi0rCQkJCQkJQUlGQUNDX1BSSVZBVEUsIAotKwkJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgCi0rCQkJCQkJc3RyX3ZhbChzKSk7Ci0rCQkJCWVsc2UKLSsJCQkJCXQgPSBGRFNBZGRGaWVsZFRvQ2xhc3MoCi0rCQkJCQkJc3RyX3ZhbCAodHlwZV9wdHIpLCAKLSsJCQkJCQlBSUZBQ0NfUFVCTElDLCAKLSsJCQkJCQlUWVBFX0ZJRUxEX05BTUUodHlwZSwgaSksIAotKwkJCQkJCXN0cl92YWwocykpOwotKwotKwkJCX0KLSsJCQllbHNlCi0rCQkJCXQgPSBGRFNBZGRGaWVsZFRvU3RydWN0KHN0cl92YWwodHlwZV9wdHIpLCAKLSsJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgc3RyX3ZhbChzKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJCQotKwkJCXR5cGVfcHRyID0gc3RyX2R1cCh0KTsKLSsKLSsJCQlzdHJfZnJlZShzKTsKLSsKLSsJCQkvKgotKwkJCSoqIENhbGMgb2Zmc2V0LgotKwkJCSovCi0rCQkJaWYgKCBUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCApCi0rCQkJCWxlbiArPSBlbGVuOwotKwkJfQotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgc3RyX3ZhbCh0eXBlX3B0cikpOwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX1ZPSUQ6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX1ZPSUQsIGxlbikpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCQluZmllbGRzID0gVFlQRV9ORklFTERTICh0eXBlKTsKLSsKLSsJCXR5cGVfcHRyID0gc3RyX2R1cChUeXBlVG9GRFMoQUlGX0VOVU0pKTsKLSsKLSsJCWZvciAoIGkgPSAwIDsgaSA8IG5maWVsZHMgOyBpKysgKQotKwkJewotKwkJCWNoYXIgKgl0OwotKwotKwkJCXQgPSBGRFNBZGRDb25zdFRvRW51bShzdHJfdmFsKHR5cGVfcHRyKSwKLSsJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwKLSsJCQkJCVRZUEVfRklFTERfQklUUE9TKHR5cGUsIGkpKTsKLSsKLSsJCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCi0rCQkJdHlwZV9wdHIgPSBzdHJfZHVwKHQpOwotKwkJfQotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgc3RyX3ZhbCh0eXBlX3B0cikpOwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0ZVTkM6Ci0rCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKwotKwkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJVHlwZVRvRkRTKEFJRl9GVU5DVElPTiwgc3RyX3ZhbCh0eXBlX3B0cikpKTsKLSsKLSsJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJJTkc6Ci0rCWNhc2UgVFlQRV9DT0RFX1NFVDoKLSsJY2FzZSBUWVBFX0NPREVfUkFOR0U6Ci0rCWNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKLSsJY2FzZSBUWVBFX0NPREVfTUVNQkVSOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1JFRjoKLSsJY2FzZSBUWVBFX0NPREVfQk9PTDoKLSsJY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfSU5WQUxJRCkpOwotKwkJYnJlYWs7Ci0rCi0rCWRlZmF1bHQ6Ci0rCQllcnJvcigiSW52YWxpZCBDL0MrKyB0eXBlIGNvZGUgJWQgaW4gc3ltYm9sIHRhYmxlLiIsIFRZUEVfQ09ERSh0eXBlKSk7Ci0rCX0KLSsKLSsJcmV0dXJuIHR5cGVfc3RyOwotK30KLSsKLSt2b2lkCi0rYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUodHlwZSwgdmFsYWRkciwgYWRkcmVzcywgc3RyZWFtKQotKwlzdHJ1Y3QgdHlwZSAqCXR5cGU7Ci0rCWNoYXIgKgkJdmFsYWRkcjsKLSsJQ09SRV9BRERSCWFkZHJlc3M7Ci0rCXN0cnVjdCB1aV9maWxlICpzdHJlYW07Ci0rewotKwlpbnQJCQlpeDsKLSsJaW50CQkJcmVzOwotKwlpbnQJCQl2YWxpZDsKLSsJdW5zaWduZWQJCWxlbjsKLSsJdW5zaWduZWQJCWVsdGxlbjsKLSsJTE9OR0VTVAkJCXZhbDsKLSsJQ09SRV9BRERSCQlhZGRyOwotKwl2YWx1ZV9wdHIJCXZwdHI7Ci0rCXVuaW9uIGllZWVfZG91YmxlCXY7Ci0rCXN0cnVjdCB0eXBlICoJCWVsdHR5cGU7Ci0rCXN0cnVjdCBmaWVsZCAqCQl0aGlzRmllbGQ7Ci0rCi0rCUNIRUNLX1RZUEVERUYodHlwZSk7Ci0rCi0rCXN3aXRjaCAoIFRZUEVfQ09ERSh0eXBlKSApCi0rCXsKLSsJY2FzZSBUWVBFX0NPREVfVFlQRURFRjoKLSsJCWFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKFRZUEVfVEFSR0VUX1RZUEUodHlwZSksIHZhbGFkZHIsIGFkZHJlc3MsIHN0cmVhbSk7Ci0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfQVJSQVk6Ci0rCQllbHR0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsKLSsJCWlmIAotKwkJKAotKwkJCVRZUEVfTEVOR1RIKHR5cGUpID4gMAotKwkJCSYmCi0rCQkJVFlQRV9MRU5HVEgoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSkgPiAwCi0rCQkpCi0rCQl7Ci0rCQkJZWx0bGVuID0gVFlQRV9MRU5HVEgoZWx0dHlwZSk7Ci0rCQkJbGVuID0gVFlQRV9MRU5HVEgodHlwZSkgLyBlbHRsZW47Ci0rCi0rCQkJZm9yICggaXggPSAwOyBpeCA8IGxlbjsgaXgrKyApCi0rCQkJCWFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKGVsdHR5cGUsIHZhbGFkZHIgKyBpeCAqIGVsdGxlbiwgYWRkcmVzcyArIGl4ICogZWx0bGVuLCBzdHJlYW0pOwotKwotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJLyoKLSsJCSoqIFRyZWF0IGFzIGEgcG9pbnRlci4uLgotKwkJKi8KLSsJCWFkZHIgPSBhZGRyZXNzOwotKwkJZ290byBhc1B0cjsKLSsKLSsJY2FzZSBUWVBFX0NPREVfUkVGOgotKwljYXNlIFRZUEVfQ09ERV9QVFI6Ci0rCQlhZGRyID0gdW5wYWNrX3BvaW50ZXIodHlwZSwgdmFsYWRkcik7Ci0rCi0rCWFzUHRyOgotKwkJZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSk7Ci0rCi0rCQlpZgotKwkJKAotKwkJCVRZUEVfTEVOR1RIKGVsdHR5cGUpID09IDEKLSsJCQkmJiAKLSsJCQlUWVBFX0NPREUoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX0lOVAotKwkJKQotKwkJewotKwkJCS8qCi0rCQkJKiogY2FsbCBpdCBhIHN0cmluZwotKwkJCSovCi0rCQkJKHZvaWQpYWlmX2VtaXRfc3RyaW5nKGFkZHIsIHN0cmVhbSk7Ci0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQlpZiAoIGFkZHIgPT0gMCApCi0rCQl7Ci0rCQkJZW1pdERhdGEoKGNoYXIpQUlGX1BUUl9OSUwsIHN0cmVhbSk7IAotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJZm9yICggaXggPSAwIDsgaXggPCBudW1WYWx1ZXNTZWVuOyBpeCsrICkKLSsJCXsKLSsJCQlpZgotKwkJCSgKLSsJCQkJdmFsdWVzU2VlbltpeF0uYWRkciA9PSBhZGRyCi0rCQkJCSYmCi0rCQkJCXZhbHVlc1NlZW5baXhdLnVzZWQKLSsJCQkpCi0rCQkJewotKwkJCQlpZiAoIHZhbHVlc1NlZW5baXhdLnVzZWQgPT0gMSApCi0rCQkJCXsKLSsJCQkJCS8qIAotKwkJCQkJKiogZmlyc3QgdGltZTsganVzdCBlbWl0IGFzIHVzdWFsCi0rCQkJCQkqLwotKwotKwkJCQkJZW1pdERhdGEoKGNoYXIpQUlGX1BUUl9OQU1FLCBzdHJlYW0pOyAKLSsJCQkJCXZhbHVlc1NlZW5baXhdLnVzZWQgPSAyOwotKwkJCQkJZW1pdERhdGEoKGNoYXIpaXgsIHN0cmVhbSk7Ci0rCi0rCQkJCQlicmVhazsgLyogbm8gbmVlZCB0byBsb29rIGF0IG90aGVyIHNlZW4gdmFsdWVzICovCi0rCQkJCX0KLSsKLSsJCQkJLyogCi0rCQkJCSoqIHJlZmVycmluZyB0byBvbmUgYWxyZWFkeSBlbWl0dGVkCi0rCQkJCSovCi0rCi0rCQkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfUkVGRVJFTkNFLCBzdHJlYW0pOyAKLSsJCQkJZW1pdERhdGEoKGNoYXIpaXgsIHN0cmVhbSk7Ci0rCi0rCQkJCXJldHVybjsgLyogZG9uJ3QgZ28gYW55IGRlZXBlciAqLwotKwkJCX0KLSsJCX0KLSsKLSsJCXJlcyA9IGNoZWNrX3ZhbHVlKGVsdHR5cGUsIGFkZHIsICZ2cHRyKTsKLSsKLSsJCWlmICggaXggPT0gbnVtVmFsdWVzU2VlbiApCi0rCQl7Ci0rCQkJLyoKLSsJCQkqKiBub3Qgc3BlY2lhbCBhdCBhbGwgCi0rCQkJKi8KLSsJCQlpZiAoICFyZXMgKQotKwkJCXsKLSsJCQkJZW1pdERhdGEoKGNoYXIpQUlGX1BUUl9JTlZBTElELCBzdHJlYW0pOyAKLSsJCQkJYnJlYWs7Ci0rCQkJfQotKwotKwkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfTk9STUFMLCBzdHJlYW0pOyAKLSsJCX0KLSsKLSsJCWFpZl92YWxfcHJpbnRfcmVjdXJzaXZlIChWQUxVRV9UWVBFKHZwdHIpLAotKwkJCQkJVkFMVUVfQ09OVEVOVFModnB0ciksCi0rCQkJCQlWQUxVRV9BRERSRVNTKHZwdHIpLAotKwkJCQkJc3RyZWFtKTsKLSsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOSU9OOgotKwkJLyoKLSsJCSoqIEEgdW5pb24gaXMgdHJlYXRlZCBqdXN0IGxpa2UgYSBzdHJ1Y3QuIFRoYXQgaXMKLSsJCSoqIHdlIGF0dGVtcHQgdG8gdHJhdmVyc2UgZWFjaCBmaWVsZCBpZiBwb3NzaWJsZS4KLSsJCSoqIEl0J3MgdGhlbiB1cCB0byB0aGUgcmVjZWl2ZXIgdG8gZGVjaWRlIHdoYXQgaXMKLSsJCSoqIHNlbnNpYmxlIGluZm9ybWF0aW9uLgotKwkJKioKLSsJCSoqIFhYWDogV2hhdCBoYXBwZW5zIGlmIGEgcG9pbnRlciBwb2ludHMgdG8gcmFuZG9tCi0rCQkqKiBkYXRhPwotKwkJKi8KLSsJCWZvciAoIGl4ID0gMCA7IGl4IDwgVFlQRV9ORklFTERTICh0eXBlKSA7IGl4KysgKQotKwkJewotKwkJCWlmICggVFlQRV9GSUVMRF9JR05PUkUodHlwZSwgaXgpICkKLSsJCQkJY29udGludWU7Ci0rCi0rCQkJaWYgCi0rCQkJKAotKwkJCQkhVFlQRV9GSUVMRF9TVEFUSUModHlwZSwgaXgpIAotKwkJCQkmJiAKLSsJCQkJVFlQRV9GSUVMRF9QQUNLRUQodHlwZSwgaXgpCi0rCQkJKQotKwkJCXsKLSsJCQkJdnB0ciA9IHZhbHVlX2Zyb21fbG9uZ2VzdChUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaXgpLAotKwkJCQkJdW5wYWNrX2ZpZWxkX2FzX2xvbmcodHlwZSwgdmFsYWRkciwgaXgpKTsKLSsKLSsJCQkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwgVkFMVUVfQ09OVEVOVFModnB0ciksIDAsIHN0cmVhbSk7Ci0rCQkJfQotKwkJCWVsc2UgaWYgKCBUWVBFX0ZJRUxEX1NUQVRJQyAodHlwZSwgaXgpICkKLSsJCQl7Ci0rCQkJCXZwdHIgPSB2YWx1ZV9zdGF0aWNfZmllbGQgKHR5cGUsIGl4KTsKLSsKLSsJCQkJaWYgKCB2cHRyID09IE5VTEwgKQotKwkJCQkJY29udGludWU7Ci0rCi0rCQkJCS8qCi0rCQkJCVhYWAotKwkJCQljcF9wcmludF9zdGF0aWNfZmllbGQgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSksIHYsCi0rCQkJCXN0cmVhbSwgZm9ybWF0LCByZWN1cnNlICsgMSwKLSsJCQkJcHJldHR5KTsKLSsJCQkJKi8KLSsJCQl9Ci0rCQkJZWxzZQotKwkJCQlhaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZShUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaXgpLCAKLSsJCQkJCXZhbGFkZHIgKyBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaXgpIC8gOCwKLSsJCQkJCWFkZHJlc3MgKyBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaXgpIC8gOCwKLSsJCQkJCXN0cmVhbSk7Ci0rCQl9Ci0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfQ0hBUjoKLSsJYXNDaGFyOgotKwkJdmFsID0gdW5wYWNrX2xvbmcgKHR5cGUsIHZhbGFkZHIpOwotKwkJZW1pdERhdGEoKGNoYXIpICh2YWwgJiAweGZmKSwgc3RyZWFtKTsgCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfSU5UOgotKwkJbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOwotKwotKwkJaWYKLSsJCSgKLSsJCQlsZW4gPT0gMSAKLSsJCQkmJgotKwkJCXN0cm5jbXAoVFlQRV9OQU1FKHR5cGUpLCAiY2hhciIsIDUpID09IDAKLSsJCSkgCi0rCQkJZ290byBhc0NoYXI7Ci0rCi0rCQl2YWwgPSB1bnBhY2tfbG9uZyh0eXBlLCB2YWxhZGRyKTsKLSsJCUFJRk5vcm1hbGlzZSgoY2hhciAqKSAmdiwgbGVuLCAoY2hhciAqKSAmdmFsLCBzaXplb2YoTE9OR0VTVCkpOwotKwkJCi0rCQlmb3IgKCBpeCA9IDAgOyBpeCA8IGxlbiA7IGl4KysgKQotKwkJCWVtaXREYXRhKChjaGFyKSh2LmNbaXhdICYgMHhmZiksIHN0cmVhbSk7IAotKwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0ZMVDoKLSsJCWxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKLSsKLSsJCXN3aXRjaCAoIGxlbiApIHsKLSsJCWNhc2UgNDoKLSsJCQl2LmYgPSB1bnBhY2tfZG91YmxlICh0eXBlLCB2YWxhZGRyLCAmdmFsaWQpOwotKwkJCWJyZWFrOwotKwotKwkJY2FzZSA4OgotKwkJCXYuZCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJYnJlYWs7Ci0rCi0rI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKLSsJCWNhc2UgMTY6Ci0rCQkJdi5sID0gdW5wYWNrX2RvdWJsZSAodHlwZSwgdmFsYWRkciwgJnZhbGlkKTsKLSsJCQlicmVhazsKLSsjZW5kaWYgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotKwkJZGVmYXVsdDoKLSsJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBoYW5kbGUgZmxvYXQgb2YgbGVuZ3RoICVkXG4iLCBsZW4pOwotKwkJfQotKwotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikgKHYuY1tpeF0gJiAweGZmKSwgc3RyZWFtKTsgCi0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfVk9JRDoKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9NRU1CRVI6Ci0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCWNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKwljYXNlIFRZUEVfQ09ERV9GVU5DOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOREVGOgotKwljYXNlIFRZUEVfQ09ERV9FUlJPUjoKLSsJCWJyZWFrOwotKwotKwlkZWZhdWx0OgotKwkJZXJyb3IgKCJJbnZhbGlkIEMvQysrIHR5cGUgY29kZSAlZCBpbiBzeW1ib2wgdGFibGUuIiwgVFlQRV9DT0RFICh0eXBlKSk7Ci0rCX0KLSt9Ci0rCi0rdm9pZCBhaWZfdmFsX3ByaW50KHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtKQotKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Ci0rICAgICBjaGFyICp2YWxhZGRyOwotKyAgICAgaW50IGVtYmVkZGVkX29mZnNldDsKLSsgICAgIENPUkVfQUREUiBhZGRyZXNzOwotKyAgICAgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbTsKLSt7Ci0rICBzdHJfcHRyIHM7Ci0rCi0rICAvLyBzdHJ1Y3QgdWlfZmlsZSAqdHlwZVN0cmVhbT1tZW1fZmlsZW9wZW4oKTsKLSsgIG51bVZhbHVlc1NlZW4gPSAwOwotKyAgYWlmX2Rpc2NvdmVyKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBkb1ZhbHVlKTsgLyogdmFsdWVzICovCi0rICBhaWZfZGlzY292ZXIodHlwZSwgMCwgZG9UeXBlKTsgLyogdHlwZXMgKi8KLSsgIGFpZl9yZWR1Y2UoKTsKLSsgIGRhdGFTdHJlYW1Qb3MgPSAwOwotKyAgLy8gZnB1dHNfZmlsdGVyZWQoIigiLCBzdHJlYW0pOwotKyAgcyA9IGdkYl90eXBlX3RvX2Zkcyh0eXBlKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKHN0cl92YWwocyksIHN0cmVhbSk7Ci0rICBzdHJfZnJlZShzKTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKCIpIiwgc3RyZWFtKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKCIgIiwgc3RyZWFtKTsKLSsgIGFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0pOwotKyAgLy8gY29udGVudHMgPSB1aV9maWxlX3hzdHJkdXAodHlwZVN0cmVhbSwgJmR1bW15KTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKGNvbnRlbnRzLCBzdHJlYW0pOwotKyAgLy8gZnJlZShjb250ZW50cyk7Ci0rICAvLyB1aV9maWxlX2RlbGV0ZSh0eXBlU3RyZWFtKTsKLSsgIGdkYl9mbHVzaChzdHJlYW0pOwotK30gLyogYWlmX3ZhbF9wcmludCAqLwotKwotK3ZvaWQKLSthaWZfdHlwZV9wcmludCh0eXBlLCBzdHJlYW0pCi0rCXN0cnVjdCB0eXBlICp0eXBlOwotKwlzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtOwotK3sKLSsJc3RyX3B0cglzOwotKwotKwludW1WYWx1ZXNTZWVuID0gMDsKLSsJYWlmX2Rpc2NvdmVyKHR5cGUsIDAsIGRvVHlwZSk7IC8qIHR5cGVzICovCi0rCWFpZl9yZWR1Y2UoKTsKLSsJZGF0YVN0cmVhbVBvcyA9IDA7Ci0rCXMgPSBnZGJfdHlwZV90b19mZHModHlwZSk7Ci0rCWZwdXRzX2ZpbHRlcmVkKHN0cl92YWwocyksIHN0cmVhbSk7Ci0rCXN0cl9mcmVlKHMpOwotK30KLSsKLSsjZGVmaW5lIFNUUlNJWkUgMTAwCi0rCi0rc3RyX3B0cgotK3N0cl9pbml0KHZvaWQpCi0rewotKwlzdHJfcHRyCXM7Ci0rCi0rCXMgPSAoc3RyX3B0cil4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyX3R5cGUpKTsKLSsJcy0+YnVmID0gKGNoYXIgKil4bWFsbG9jKFNUUlNJWkUpOwotKwlzLT5ibGVuID0gU1RSU0laRTsKLSsJcy0+c2xlbiA9IDA7Ci0rCSoocy0+YnVmKSA9ICdcMCc7Ci0rCi0rCXJldHVybiBzOwotK30KLSsKLSt2b2lkCi0rc3RyX2FkZChzdHJfcHRyIHMxLCBjaGFyICpzMikKLSt7Ci0rCWludAlsMiA9IHN0cmxlbihzMik7Ci0rCi0rCWlmIChzMS0+c2xlbiArIGwyID49IHMxLT5ibGVuKQotKwl7Ci0rCQlzMS0+YmxlbiArPSBtYXgoU1RSU0laRSwgbDIpOwotKwkJczEtPmJ1ZiA9IChjaGFyICopIHhyZWFsbG9jIChzMS0+YnVmLCBzMS0+Ymxlbik7Ci0rCX0KLSsKLSsJbWVtY3B5KCYoczEtPmJ1ZltzMS0+c2xlbl0pLCBzMiwgbDIpOwotKwlzMS0+c2xlbiArPSBsMjsKLSsJczEtPmJ1ZltzMS0+c2xlbl0gPSAnXDAnOwotK30KLSsKLSt2b2lkCi0rc3RyX2ZyZWUoc3RyX3B0ciBzKQotK3sKLSsJZnJlZShzLT5idWYpOwotKwlmcmVlKHMpOwotK30KLSsKLStjaGFyICoKLStzdHJfdmFsKHN0cl9wdHIgcykKLSt7Ci0rCXJldHVybiBzLT5idWY7Ci0rfQotKwotK3N0cl9wdHIKLStzdHJfZHVwKGNoYXIgKnMxKQotK3sKLSsJc3RyX3B0ciBzID0gc3RyX2luaXQoKTsKLSsJc3RyX2FkZChzLCBzMSk7Ci0rCXJldHVybiBzOwotK30KLSsKLStpbnQKLStjaGVja192YWx1ZSh0eXBlLCBhZGRyLCByZXMpCi0rICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSsgICAgIENPUkVfQUREUiBhZGRyOwotKyAgICAgdmFsdWVfcHRyICpyZXM7Ci0rewotKyAgdmFsdWVfcHRyIHZhbDsKLSsgIGNoYXIgYnVmW3NpemVvZiAoVUxPTkdFU1QpXTsKLSsKLSsgIGlmIChUWVBFX0NPREUgKGNoZWNrX3R5cGVkZWYgKHR5cGUpKSA9PSBUWVBFX0NPREVfVk9JRCkKLSsgIAlyZXR1cm4gMDsKLSsKLSsgIHZhbCA9IGFsbG9jYXRlX3ZhbHVlICh0eXBlKTsKLSsKLSsgIGlmIChHREJfVEFSR0VUX0lTX0QxMFYKLSsgICAgICAmJiBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9QVFIKLSsgICAgICAmJiBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKQotKyAgICAgICYmIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSA9PSBUWVBFX0NPREVfRlVOQykpCi0rICAgIHsKLSsgICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uICovCi0rICAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0rICAgICAgdW5zaWduZWQgc2hvcnQgc251bTsKLSsKLSsgICAgICBpZiAoIHRhcmdldF9yZWFkX21lbW9yeShhZGRyLCBidWYsIDIpICE9IDAgKQotKyAgICAgIAlyZXR1cm4gMDsKLSsKLSsgICAgICBzbnVtID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDIpOwotKyAgICAgIG51bSA9IEQxMFZfTUFLRV9JQUREUiAoc251bSk7Ci0rICAgICAgc3RvcmVfYWRkcmVzcyAoVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpLCA0LCBudW0pOwotKyAgICB9Ci0rICBlbHNlIGlmIChHREJfVEFSR0VUX0lTX0QxMFYKLSsJICAgJiYgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUFRSKQotKyAgICB7Ci0rICAgICAgLyogcG9pbnRlciB0byBkYXRhICovCi0rICAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0rICAgICAgdW5zaWduZWQgc2hvcnQgc251bTsKLSsKLSsgICAgICBpZiAoIHRhcmdldF9yZWFkX21lbW9yeShhZGRyLCBidWYsIDIpICE9IDAgKQotKyAgICAgIAlyZXR1cm4gMDsKLSsKLSsgICAgICBzbnVtID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDIpOwotKyAgICAgIG51bSA9IEQxMFZfTUFLRV9EQUREUiAoc251bSk7Ci0rICAgICAgc3RvcmVfYWRkcmVzcyAoVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpLCA0LCBudW0pOwotKyAgICB9Ci0rICBlbHNlCi0rICAgIGlmICggdGFyZ2V0X3JlYWRfbWVtb3J5X3NlY3Rpb24gKGFkZHIsIFZBTFVFX0NPTlRFTlRTX0FMTF9SQVcodmFsKSwgVFlQRV9MRU5HVEgodHlwZSksIE5VTEwpICE9IDAgKQotKyAgICAJcmV0dXJuIDA7Ci0rCi0rICBWQUxVRV9MVkFMKHZhbCkgPSBsdmFsX21lbW9yeTsKLSsgIFZBTFVFX0FERFJFU1ModmFsKSA9IGFkZHI7Ci0rICBWQUxVRV9CRkRfU0VDVElPTih2YWwpID0gTlVMTDsKLSsKLSsgICpyZXMgPSB2YWw7Ci0rCi0rICByZXR1cm4gMTsKLSt9Ci0rCi0tLS0gZ2RiLTUuMC1vbGQvZ2RiL2MtdmFscHJpbnQuYwlNb24gQXByICAzIDIyOjUzOjUwIDIwMDAKLSsrKyBnZGItNS4wL2dkYi9jLXZhbHByaW50LmMJRnJpIEp1bCAxOSAxOTo1OTo0NCAyMDAyCi1AQCAtMzAsNiArMzAsMTEgQEAKLSAjaW5jbHVkZSAiYy1sYW5nLmgiCi0gDAotIAotKy8vIHJhcGhhZWw6Ci0rZXh0ZXJuIGludCBtYXhfcHJpbnRfZGVwdGg7IC8qIHNldCBieSAic2V0IHByaW50IGRlcHRoIiAqLwotK2V4dGVybiBpbnQgY3VycmVudF9wcmludF9kZXB0aDsKLStleHRlcm4gaW50IHR5cGVwcmludDsgLyogc2V0IGJ5ICJzZXQgcHJpbnQgdHlwZSIgKEJvb2xlYW4pICovCi0rCi0gLyogUHJpbnQgZGF0YSBvZiB0eXBlIFRZUEUgbG9jYXRlZCBhdCBWQUxBRERSICh3aXRoaW4gR0RCKSwgd2hpY2ggY2FtZSBmcm9tCi0gICAgdGhlIGluZmVyaW9yIGF0IGFkZHJlc3MgQUREUkVTUywgb250byBzdGRpbyBzdHJlYW0gU1RSRUFNIGFjY29yZGluZyB0bwotICAgIEZPUk1BVCAoYSBsZXR0ZXIgb3IgMCBmb3IgbmF0dXJhbCBmb3JtYXQpLiAgVGhlIGRhdGEgYXQgVkFMQUREUiBpcyBpbgotQEAgLTQ0LDggKzQ5LDggQEAKLSAgICBUaGUgUFJFVFRZIHBhcmFtZXRlciBjb250cm9scyBwcmV0dHlwcmludGluZy4gICovCi0gCi0gaW50Ci0tY192YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwKLS0JICAgICBwcmV0dHkpCi0rY192YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsCi0rICBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSkKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlOwotICAgICAgY2hhciAqdmFsYWRkcjsKLSAgICAgIGludCBlbWJlZGRlZF9vZmZzZXQ7Ci1AQCAtNjMsNiArNjgsMTMgQEAKLSAgIExPTkdFU1QgdmFsOwotICAgQ09SRV9BRERSIGFkZHI7Ci0gCi0rICBpZiAodHlwZXByaW50ICYmIGZvcm1hdCAhPSAncycpCi0rICAgIHsKLSsgICAgICBmcHV0c19maWx0ZXJlZCgiKCIsIHN0cmVhbSk7Ci0rICAgICAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOwotKyAgICAgIGZwdXRzX2ZpbHRlcmVkKCIpICIsIHN0cmVhbSk7Ci0rICAgIH0KLSsKLSAgIENIRUNLX1RZUEVERUYgKHR5cGUpOwotICAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQotICAgICB7Ci1AQCAtMTQwLDYgKzE1Miw3IEBACi0gCSAgYnJlYWs7Ci0gCX0KLSAgICAgICBlbHR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKyAgICAgIGlmICghZWx0dHlwZSkgZWx0dHlwZSA9IHR5cGU7Ci0gICAgICAgaWYgKFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX01FVEhPRCkKLSAJewotIAkgIGNwX3ByaW50X2NsYXNzX21ldGhvZCAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgdHlwZSwgc3RyZWFtKTsKLUBAIC0xNjksNiArMTgyLDM0IEBACi0gCSAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSAJICAgIH0KLSAKLSsJICBpZiAoY3VycmVudF9wcmludF9kZXB0aCA8IG1heF9wcmludF9kZXB0aAotKwkgICAgICAmJiBUWVBFX0NPREUgKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9VTkRFRgotKwkgICAgICAmJiAoVFlQRV9MRU5HVEggKGVsdHR5cGUpICE9IDEKLSsJICAgICAgICAgfHwgVFlQRV9DT0RFIChlbHR0eXBlKSAhPSBUWVBFX0NPREVfSU5UKQotKwkgICAgICAmJiBmb3JtYXQgIT0gJ3MnKQotKwkgICAgeyAvKiBwcmludCBjb21wbGV4IG9iamVjdGVkIHBvaW50ZWQgdG8gcmVjdXJzaXZlbHkgKi8KLSsJICAgICAgaWYgKGFkZHJlc3NwcmludCkgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiID0+ICIpOwotKwkgICAgICBpZiAoYWRkciA9PSAwKQotKwkJewotKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJuaWwiKTsKLSsJCX0KLSsJICAgICAgZWxzZQotKwkJeyAvKiBub24gbmlsICovCi0rCQkgIHZhbHVlX3B0ciBkZXJlZl92YWwgPSB2YWx1ZV9hdChlbHR0eXBlLCBhZGRyLCBOVUxMKTsKLSsJCSAgY3VycmVudF9wcmludF9kZXB0aCArPSAxOwotKwkJICB2YWxfcHJpbnQgKFZBTFVFX1RZUEUgKGRlcmVmX3ZhbCksCi0rCQkJICAgIFZBTFVFX0NPTlRFTlRTIChkZXJlZl92YWwpLAotKwkJCSAgICAwLAotKwkJCSAgICBWQUxVRV9BRERSRVNTIChkZXJlZl92YWwpLAotKwkJCSAgICBzdHJlYW0sCi0rCQkJICAgIGZvcm1hdCwKLSsJCQkgICAgZGVyZWZfcmVmLAotKwkJCSAgICByZWN1cnNlLAotKwkJCSAgICBwcmV0dHkpOwotKwkJICBjdXJyZW50X3ByaW50X2RlcHRoIC09IDE7Ci0rCQl9Ci0rCSAgICB9IC8qIHByaW50IHJlY3Vyc2l2ZWx5ICovCi0rCi0gCSAgLyogRm9yIGEgcG9pbnRlciB0byBjaGFyIG9yIHVuc2lnbmVkIGNoYXIsIGFsc28gcHJpbnQgdGhlIHN0cmluZwotIAkgICAgIHBvaW50ZWQgdG8sIHVubGVzcyBwb2ludGVyIGlzIG51bGwuICAqLwotIAkgIC8qIEZJWE1FOiBuZWVkIHRvIGhhbmRsZSB3Y2hhcl90IGhlcmUuLi4gKi8KLUBAIC0zNDAsOSArMzgxLDYgQEAKLSAJfQotICAgICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY29uc2lkZXIsIGF0IGxlYXN0IGZvciBBTlNJIEMgbGFuZ3VhZ2UsIGVsaW1pbmF0aW5nCi0gICAgICAgICAgdGhlIGRpc3RpbmN0aW9uIG1hZGUgYmV0d2VlbiBGVU5DcyBhbmQgUE9JTlRFUnMgdG8gRlVOQ3MuICAqLwotLSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsiKTsKLS0gICAgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgc3RyZWFtLCAtMSk7Ci0tICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAifSAiKTsKLSAgICAgICAvKiBUcnkgdG8gcHJpbnQgd2hhdCBmdW5jdGlvbiBpdCBwb2ludHMgdG8sIGFuZCBpdHMgYWRkcmVzcy4gICovCi0gICAgICAgcHJpbnRfYWRkcmVzc19kZW1hbmdsZSAoYWRkcmVzcywgc3RyZWFtLCBkZW1hbmdsZSk7Ci0gICAgICAgYnJlYWs7Ci1AQCAtNTIwLDkgKzU1OCw5IEBACi0gICAgICAgZWxzZQotIAl7Ci0gCSAgLyogbm9ybWFsIGNhc2UgKi8KLS0JICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIoIik7Ci0tCSAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOwotLQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikgIik7Ci0rCSAgLy8gZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOwotKwkgIC8vIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKLSsJICAvLyBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpICIpOwotIAl9Ci0gICAgIH0KLSAgIGlmIChvYmplY3RwcmludCAmJiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSA9PSBUWVBFX0NPREVfQ0xBU1MpKQotLS0tIGdkYi01LjAtb2xkL2dkYi9wcmludGNtZC5jCVRodSBBcHIgMjAgMjI6MTA6NDYgMjAwMAotKysrIGdkYi01LjAvZ2RiL3ByaW50Y21kLmMJRnJpIEp1bCAxOSAxOTo1OTo0NCAyMDAyCi1AQCAtMjcyLDYgKzI3Miw3IEBACi0gICByZXR1cm4gdmFsOwotIH0KLSAMCi0rZXh0ZXJuIGludCBjdXJyZW50X3ByaW50X2RlcHRoOyAvKiBmcm9tIHZhbHByaW50LmMgKi8KLSAvKiBQcmludCB2YWx1ZSBWQUwgb24gc3RyZWFtIGFjY29yZGluZyB0byBGT1JNQVQsIGEgbGV0dGVyIG9yIDAuCi0gICAgRG8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KLSAgICAwIG1lYW5zIHByaW50IFZBTCBhY2NvcmRpbmcgdG8gaXRzIG93biB0eXBlLgotQEAgLTMyMywxMiArMzI0LDE0IEBACi0gCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU1RSSU5HCi0gCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUCi0gCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pCi0tCS8qIElmIGZvcm1hdCBpcyAwLCB1c2UgdGhlICduYXR1cmFsJyBmb3JtYXQgZm9yCi0tCSAqIHRoYXQgdHlwZSBvZiB2YWx1ZS4gIElmIHRoZSB0eXBlIGlzIG5vbi1zY2FsYXIsCi0tCSAqIHdlIGhhdmUgdG8gdXNlIGxhbmd1YWdlIHJ1bGVzIHRvIHByaW50IGl0IGFzCi0tCSAqIGEgc2VyaWVzIG9mIHNjYWxhcnMuCi0tCSAqLwotLQl2YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKLSsgICAgCXsgLyogSWYgZm9ybWF0IGlzIDAsIHVzZSB0aGUgJ25hdHVyYWwnIGZvcm1hdCBmb3IKLSsJICAqIHRoYXQgdHlwZSBvZiB2YWx1ZS4gIElmIHRoZSB0eXBlIGlzIG5vbi1zY2FsYXIsCi0rCSAgKiB3ZSBoYXZlIHRvIHVzZSBsYW5ndWFnZSBydWxlcyB0byBwcmludCBpdCBhcwotKwkgICogYSBzZXJpZXMgb2Ygc2NhbGFycy4KLSsJICAqLwotKwkgIGN1cnJlbnRfcHJpbnRfZGVwdGggPSAwOwotKwkgIHZhbHVlX3ByaW50ICh2YWwsIHN0cmVhbSwgZm9ybWF0LCBWYWxfcHJldHR5X2RlZmF1bHQpOwotKwl9Ci0gICAgICAgZWxzZQotIAkvKiBVc2VyIHNwZWNpZmllZCBmb3JtYXQsIHNvIGRvbid0IGxvb2sgdG8gdGhlCi0gCSAqIHRoZSB0eXBlIHRvIHRlbGwgdXMgd2hhdCB0byBkby4KLS0tLSBnZGItNS4wLW9sZC9nZGIvdHlwZXByaW50LmMJTW9uIEFwciAgMyAyMjo1Mzo1MCAyMDAwCi0rKysgZ2RiLTUuMC9nZGIvdHlwZXByaW50LmMJRnJpIEp1bCAxOSAxOTo1OTo0NCAyMDAyCi1AQCAtMzksNiArMzksOSBAQAotIGV4dGVybiBpbnQgb2JqZWN0cHJpbnQ7CQkvKiBDb250cm9scyBsb29raW5nIHVwIGFuIG9iamVjdCdzIGRlcml2ZWQgdHlwZQotIAkJCQkgICB1c2luZyB3aGF0IHdlIGZpbmQgaW4gaXRzIHZ0YWJsZXMuICAqLwotIAotK2V4dGVybiBpbnQgYWlmcHJpbnQ7CS8qIHByaW50IHR5cGUgdXNpbmcgQUlGICovCi0rZXh0ZXJuIHZvaWQgYWlmX3R5cGVfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgc3RydWN0IHVpX2ZpbGUgKikpOwotKwotIGV4dGVybiB2b2lkIF9pbml0aWFsaXplX3R5cGVwcmludCBQQVJBTVMgKCh2b2lkKSk7Ci0gCi0gc3RhdGljIHZvaWQKLUBAIC02Nyw2ICs3MCwxMiBAQAotICAgICAgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbTsKLSAgICAgIGludCBzaG93OwotIHsKLSsgIGlmIChhaWZwcmludCkKLSsgICAgewotKwlhaWZfdHlwZV9wcmludCAodHlwZSwgc3RyZWFtKTsKLSsgICAgCXJldHVybjsKLSsgICAgfQotKyAgICAgIAotICAgTEFfUFJJTlRfVFlQRSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIDApOwotIH0KLSAKLS0tLSBnZGItNS4wLW9sZC9nZGIvdmFscHJpbnQuYwlNb24gRmViICA3IDIxOjM5OjAyIDIwMDAKLSsrKyBnZGItNS4wL2dkYi92YWxwcmludC5jCUZyaSBKdWwgMTkgMTk6NTk6NDQgMjAwMgotQEAgLTM1LDkgKzM1LDEzIEBACi0gCi0gI2luY2x1ZGUgPGVycm5vLmg+Ci0gCi0rZXh0ZXJuIGludCBhaWZwcmludDsgLyogc2V0IGJ5ICJzZXQgcHJpbnQgYWlmIiAoQm9vbGVhbikgKi8KLSt2b2lkIGFpZl92YWxfcHJpbnQoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIGludCBlbWJlZGRlZF9vZmZzZXQsCi0rICBDT1JFX0FERFIgYWRkcmVzcywgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSk7Ci0rCi0gLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0gCi0tc3RhdGljIGludCBwYXJ0aWFsX21lbW9yeV9yZWFkIChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAotK2ludCBwYXJ0aWFsX21lbW9yeV9yZWFkIChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAotIAkJCQlpbnQgbGVuLCBpbnQgKmVycm5vcHRyKTsKLSAKLSBzdGF0aWMgdm9pZCBwcmludF9oZXhfY2hhcnMgKHN0cnVjdCB1aV9maWxlICosIHVuc2lnbmVkIGNoYXIgKiwKLUBAIC0xMDEsNiArMTA1LDE2IEBACi0gLyogSWYgbm9uemVybywgY2F1c2VzIG1hY2hpbmUgYWRkcmVzc2VzIHRvIGJlIHByaW50ZWQgaW4gY2VydGFpbiBjb250ZXh0cy4gKi8KLSAKLSBpbnQgYWRkcmVzc3ByaW50OwkJLyogQ29udHJvbHMgcHJpbnRpbmcgb2YgbWFjaGluZSBhZGRyZXNzZXMgKi8KLSsKLSsvKiBJZiBwb3NpdGl2ZSwgY2F1c2VzIHBvaW50ZXJzIHRvIGJlIGZvbGxvd2VkIGluIHByaW50aW5nLCB0byBnaXZlbiBkZXB0aCAqLwotK2ludCBtYXhfcHJpbnRfZGVwdGg7Ci0raW50IGN1cnJlbnRfcHJpbnRfZGVwdGggPSAwOyAvKiByZXNldCB0byAwIGF0IGVhY2ggaW50ZXJydXB0ICovCi0rCi0rLyogSWYgbm9uemVybywgY2F1c2VzIHR5cGVzIHRvIGJlIHByaW50ZWQuICovCi0raW50IHR5cGVwcmludDsKLSsKLSsvKiBJZiBub256ZXJvLCBjYXVzZXMgdHlwZXMgdG8gYmUgcHJpbnRlZCwgaWYgYXQgYWxsLCBpbiBBSUYgZm9ybWF0LiAqLwotK2ludCBhaWZwcmludDsKLSAMCi0gCi0gLyogUHJpbnQgZGF0YSBvZiB0eXBlIFRZUEUgbG9jYXRlZCBhdCBWQUxBRERSICh3aXRoaW4gR0RCKSwgd2hpY2ggY2FtZSBmcm9tCi1AQCAtMTU1LDYgKzE2OSwxMSBAQAotICAgICAgIHJldHVybiAoMCk7Ci0gICAgIH0KLSAKLSsgIGlmIChhaWZwcmludCkKLSsgICAgewotKyAgICAgIGFpZl92YWxfcHJpbnQodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0pOwotKyAgICAgIHJldHVybiAwOwotKyAgICB9Ci0gICByZXR1cm4gKExBX1ZBTF9QUklOVCAodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLAotIAkJCXN0cmVhbSwgZm9ybWF0LCBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSkpOwotIH0KLUBAIC0xMTYwLDggKzExNzksOSBAQAotIAotIC8qIEZJWE1FOiBjYWduZXkvMTk5OS0xMC0xNDogT25seSB1c2VkIGJ5IHZhbF9wcmludF9zdHJpbmcuICBDYW4gdGhpcwotICAgIGZ1bmN0aW9uIGJlIGVsaW1pbmF0ZWQuICAqLwotKy8qIEl0IGlzIG5vdyB1c2VkIGJ5IGFpZl9wcmludF9zdHJpbmcgYXMgd2VsbC4gcmFwaGFlbC8yMDAwLTAyLTIwICovCi0gCi0tc3RhdGljIGludAotK2ludAotIHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sIGludCAqZXJybm9wdHIpCi0gewotICAgaW50IG5yZWFkOwkJCS8qIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiAqLwotQEAgLTEzNTMsNyArMTM3Myw3IEBACi0gICAgIHsKLSAgICAgICBpZiAoYWRkcmVzc3ByaW50KQotIAl7Ci0tCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgc3RyZWFtKTsKLSsJICBmcHV0c19maWx0ZXJlZCAoIiA9PiAiLCBzdHJlYW0pOwotIAl9Ci0gICAgICAgTEFfUFJJTlRfU1RSSU5HIChzdHJlYW0sIGJ1ZmZlciwgKGJ1ZnB0ciAtIGJ1ZmZlcikgLyB3aWR0aCwgd2lkdGgsIGZvcmNlX2VsbGlwc2lzKTsKLSAgICAgfQotQEAgLTE1OTYsNiArMTYxNiwyNyBAQAotIAkJICAmc2V0cHJpbnRsaXN0KSwKLSAgICAgICZzaG93cHJpbnRsaXN0KTsKLSAKLSsgIGFkZF9zaG93X2Zyb21fc2V0Ci0rICAgIChhZGRfc2V0X2NtZCAoImRlcHRoIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAotKyAgICAJCSAgKGNoYXIgKikgJm1heF9wcmludF9kZXB0aCwKLSsJCSAgIlNldCBkZXB0aCBvZiBwb2ludGVyIHJlY3Vyc2lvbi4iLAotKwkJICAmc2V0cHJpbnRsaXN0KSwKLSsgICAgICZzaG93cHJpbnRsaXN0KTsKLSsKLSsgIGFkZF9zaG93X2Zyb21fc2V0Ci0rICAgIChhZGRfc2V0X2NtZCAoInR5cGUiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLSsgICAgCQkgIChjaGFyICopICZ0eXBlcHJpbnQsCi0rCQkgICJTZXQgcHJpbnRpbmcgb2YgdHlwZXMuIiwKLSsJCSAgJnNldHByaW50bGlzdCksCi0rICAgICAmc2hvd3ByaW50bGlzdCk7Ci0rCi0rICBhZGRfc2hvd19mcm9tX3NldAotKyAgICAoYWRkX3NldF9jbWQgKCJhaWYiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLSsgICAgCQkgIChjaGFyICopICZhaWZwcmludCwKLSsJCSAgIlNldCBwcmludGluZyBvZiB0eXBlcyB0byBhaWYgZm9ybWF0LiIsCi0rCQkgICZzZXRwcmludGxpc3QpLAotKyAgICAgJnNob3dwcmludGxpc3QpOwotKwotICAgYyA9IGFkZF9zZXRfY21kICgiaW5wdXQtcmFkaXgiLCBjbGFzc19zdXBwb3J0LCB2YXJfdWludGVnZXIsCi0gCQkgICAoY2hhciAqKSAmaW5wdXRfcmFkaXgsCi0gCQkgICAiU2V0IGRlZmF1bHQgaW5wdXQgcmFkaXggZm9yIGVudGVyaW5nIG51bWJlcnMuIiwKLUBAIC0xNjMwLDUgKzE2NzEsOCBAQAotICAgcHJldHR5cHJpbnRfYXJyYXlzID0gMDsKLSAgIHVuaW9ucHJpbnQgPSAxOwotICAgYWRkcmVzc3ByaW50ID0gMTsKLSsgIG1heF9wcmludF9kZXB0aCA9IC0xOwotKyAgdHlwZXByaW50ID0gMDsKLSsgIGFpZnByaW50ID0gMDsKLSAgIHByaW50X21heCA9IFBSSU5UX01BWF9ERUZBVUxUOwotIH0KLS0tLSAvZGV2L251bGwJVHVlIE1hciAyNSAxNzowODoxOCAyMDAzCi0rKysgZ2RiLTUuMC9nZGIvbGliYWlmLm1rCUZyaSBKdWwgMTkgMTk6NTk6NDQgMjAwMgotQEAgLTAsMCArMSw5IEBACi0rSU5DTFVERV9DRkxBR1MgKz0gJChJTkNMVURFX2FpZikKLSsKLStDTElCUyArPSAkKExJQl9haWYpCi0rCi0rU0ZJTEVTICAgICArPSBhaWYtdmFscHJpbnQuYwotK0NPTU1PTl9PQlMgKz0gYWlmLXZhbHByaW50Lm8KLSsKLSthaWYtdmFscHJpbnQubzogYWlmLXZhbHByaW50LmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGdkYnR5cGVzX2gpIFwKLSsJbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB2YWxwcmludC5oICQodmFsdWVfaCkKLS0tLSBnZGItNS4wLW9sZC9nZGIvY29uZmlndXJlLmluCVdlZCBNYXkgMTAgMTg6MzI6MTggMjAwMAotKysrIGdkYi01LjAvZ2RiL2NvbmZpZ3VyZS5pbglGcmkgSnVsIDE5IDE5OjU5OjQ0IDIwMDIKLUBAIC0yOSw2ICsyOSwxMiBAQAotIEFDX0lTQ19QT1NJWAotIEFNX1BST0dfQ0NfU1REQwotIAotK0FDX1RFU1RfUEFDS0FHRV9ORVcoYWlmLFsjaW5jbHVkZSA8YWlmLmg+XSwtbGFpZiwsL3Vzci9sb2NhbCxBSUYpCi0raWYgdGVzdCAiJHdpdGhfYWlmIiA9ICJubyI7IHRoZW4KLSsJQUNfTVNHX0VSUk9SKFtZb3UgbXVzdCBoYXZlIGxpYmFpZiB0byBjb21waWxlIHRoaXMgdmVyc2lvbiBvZiBHREIuXSkKLStmaQotK0FDX0RFRklORShBSUYsIDEsIFtFbmFibGUgQUlGIHN1cHBvcnQgaW4gaW4gR0RCLl0pZG5sCi0rCi0gQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLikKLSBBQ19DQU5PTklDQUxfU1lTVEVNCi0gCi0tLS0gZ2RiLTUuMC1vbGQvZ2RiL2FjbG9jYWwubTQJV2VkIEFwciAxMiAyMzoyOTo0MiAyMDAwCi0rKysgZ2RiLTUuMC9nZGIvYWNsb2NhbC5tNAlXZWQgSnVuIDE5IDE1OjEyOjEyIDIwMDIKLUBAIC0xLDMgKzEsMTE0IEBACi0rZG5sIEFDX1RFU1RfUEFDS0FHRV9ORVcocGFja2FnZSxoZWFkZXJzLGxpYnJhcmllcyxleHRyYSBsaWJzLGRlZmF1bHQgbG9jYXRpb25zLCBjb25kaXRpb25hbCkKLSsKLStBQ19ERUZVTihBQ19URVNUX1BBQ0tBR0UsW01ZX1RFU1RfUEFDS0FHRV9ORVcoJDEsWyNpbmNsdWRlIDwkMj5dLCQ0LCwkNSldKQotKwotK0FDX0RFRlVOKEFDX1RFU1RfUEFDS0FHRV9ORVcsWwotK0FDX0FSR19XSVRIKCQxLAotK1sgIC0td2l0aC0kMT1kaXIgICAgICAgICAgICAgICAgdXNlICQxIGluIGRpcl0pCi0rQUNfQVJHX1dJVEgoJDEtbGliLAotK1sgIC0td2l0aC0kMS1saWI9ZGlyICAgICAgICAgICAgdXNlICQxIGxpYnJhcmllcyBpbiBkaXJdLAotK1tpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIiAtbyAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotKyAgQUNfTVNHX0VSUk9SKFtObyBhcmd1bWVudCBmb3IgLS13aXRoLSQxLWxpYl0pCi0rZWxpZiB0ZXN0ICJYJHdpdGhfJDEiID0gIlgiOyB0aGVuCi0rICB3aXRoXyQxPXllcwotK2ZpXSkKLStBQ19BUkdfV0lUSCgkMS1pbmNsdWRlLAotK1sgIC0td2l0aC0kMS1pbmNsdWRlPWRpciAgICAgICAgdXNlICQxIGhlYWRlcnMgaW4gZGlyXSwKLStbaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyIgLW8gIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSsgIEFDX01TR19FUlJPUihbTm8gYXJndW1lbnQgZm9yIC0td2l0aC0kMS1pbmNsdWRlXSkKLStlbGlmIHRlc3QgIlgkd2l0aF8kMSIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfJDE9eWVzCi0rZmldKQotKwotK0FDX01TR19DSEVDS0lORyhmb3IgJDEpCi0rCi0rY2FzZSAiJHdpdGhfJDEiIGluCi0reWVzKQk7OwotK25vKQk7OwotKyIiKQk7OwotKyopCWlmIHRlc3QgIiR3aXRoXyQxX2luY2x1ZGUiID0gIiI7IHRoZW4KLSsJCXdpdGhfJDFfaW5jbHVkZT0iJHdpdGhfJDEvaW5jbHVkZSIKLSsJZmkKLSsJaWYgdGVzdCAiJHdpdGhfJDFfbGliIiA9ICIiOyB0aGVuCi0rCQl3aXRoXyQxX2xpYj0iJHdpdGhfJDEvbGliJGFiaWxpYmRpcmV4dCIKLSsJZmkKLSsJOzsKLStlc2FjCi0raGVhZGVyX2RpcnM9Ci0rbGliX2RpcnM9Ci0rZD0nJDUnCi0rZm9yIGkgaW4gJGQgL3VzcjsgZG8KLSsJaGVhZGVyX2RpcnM9IiRoZWFkZXJfZGlycyAkaS9pbmNsdWRlIgotKwlsaWJfZGlycz0iJGxpYl9kaXJzICRpL2xpYiRhYmlsaWJkaXJleHQiCi0rZG9uZQotKwotK2Nhc2UgIiR3aXRoXyQxX2luY2x1ZGUiIGluCi0reWVzKSA7OwotK25vKSAgOzsKLSsqKSAgIGhlYWRlcl9kaXJzPSIkd2l0aF8kMV9pbmNsdWRlICRoZWFkZXJfZGlycyI7OwotK2VzYWMKLStjYXNlICIkd2l0aF8kMV9saWIiIGluCi0reWVzKSA7OwotK25vKSAgOzsKLSsqKSAgIGxpYl9kaXJzPSIkd2l0aF8kMV9saWIgJGxpYl9kaXJzIjs7Ci0rZXNhYwotKwotK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotK3NhdmVfTElCUz0iJExJQlMiCi0raXJlcz0gbHJlcz0KLStmb3IgaSBpbiAkaGVhZGVyX2RpcnM7IGRvCi0rCUNGTEFHUz0iLUkkaSAkc2F2ZV9DRkxBR1MiCi0rCUFDX1RSWV9DT01QSUxFKFskMl0sLGlyZXM9JGk7YnJlYWspCi0rZG9uZQotK2ZvciBpIGluICRsaWJfZGlyczsgZG8KLSsJTElCUz0iLUwkaSAkMyAkNCAkc2F2ZV9MSUJTIgotKwlBQ19UUllfTElOSyhbJDJdLCxscmVzPSRpO2JyZWFrKQotK2RvbmUKLStDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLStMSUJTPSIkc2F2ZV9MSUJTIgotKwotK2lmIHRlc3QgIiRpcmVzIiAtYSAiJGxyZXMiIC1hICIkd2l0aF8kMSIgIT0gIm5vIjsgdGhlbgotKwkkMV9pbmNsdWRlZGlyPSIkaXJlcyIKLSsJJDFfbGliZGlyPSIkbHJlcyIKLSsJRElSXyQxPQotKwlJTkNMVURFXyQxPSItSSQkMV9pbmNsdWRlZGlyIgotKwlMSUJfJDE9Ii1MJCQxX2xpYmRpciAkMyIKLSsJZG5sIG00X2lmdmFsKFskNl0sCi0rCQlBQ19ERUZJTkVfVU5RVU9URUQoJDYsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAkMSBwYWNrYWdlLl0pCi0rCWRubAksCi0rCWRubCAJQUNfREVGSU5FX1VOUVVPVEVEKHVwY2FzZSgkMSksMSxbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAkMSBwYWNrYWdlLl0pKQotKwl3aXRoXyQxPXllcwotKwlBQ19NU0dfUkVTVUxUKFtoZWFkZXJzICRpcmVzLCBsaWJyYXJpZXMgJGxyZXNdKQotK2Vsc2UKLSsJRElSXyQxPSIkMSIKLSsJSU5DTFVERV8kMT0KLSsJTElCXyQxPQotKwl3aXRoXyQxPW5vCi0rCUFDX01TR19SRVNVTFQoJHdpdGhfJDEpCi0rZmkKLStkbmwgbTRfaWZ2YWwoWyQ2XSwKLStkbmwgCUFNX0NPTkRJVElPTkFMKCQ2LCB0ZXN0ICIkd2l0aF8kMSIgPSB5ZXMpCi0rZG5sIAlBTV9DT05ESVRJT05BTCh1cGNhc2UoJDEpLCB0ZXN0ICIkd2l0aF8kMSIgPSB5ZXMpKQotK0FDX1NVQlNUKERJUl8kMSkKLStBQ19TVUJTVChJTkNMVURFXyQxKQotK0FDX1NVQlNUKExJQl8kMSkKLStdKQotKwotKyMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0rCi0rQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi0rW0FDX1NVQlNUKCQxX1RSVUUpCi0rQUNfU1VCU1QoJDFfRkFMU0UpCi0raWYgJDI7IHRoZW4KLSsgICQxX1RSVUU9Ci0rICAkMV9GQUxTRT0nIycKLStlbHNlCi0rICAkMV9UUlVFPScjJwotKyAgJDFfRkFMU0U9Ci0rZmldKQotKwotK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSsKLSBkbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotIAotIGRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS0tLSBnZGItNS4wLW9sZC9nZGIvY29uZmlndXJlCVdlZCBNYXkgMTAgMTg6MzI6MTggMjAwMAotKysrIGdkYi01LjAvZ2RiL2NvbmZpZ3VyZQlGcmkgSnVsIDE5IDE5OjU5OjU1IDIwMDIKLUBAIC0xLDUgKzEsNjggQEAKLSAjISAvYmluL3NoCi0gCi0rCi0rCi0rCi0rIyBzZXJpYWwgMQotKwotKyMgQGRlZm1hYyBBQ19QUk9HX0NDX1NUREMKLSsjIEBtYWluZGV4IFBST0dfQ0NfU1REQwotKyMgQG92aW5kZXggQ0MKLSsjIElmIHRoZSBDIGNvbXBpbGVyIGluIG5vdCBpbiBBTlNJIEMgbW9kZSBieSBkZWZhdWx0LCB0cnkgdG8gYWRkIGFuIG9wdGlvbgotKyMgdG8gb3V0cHV0IHZhcmlhYmxlIEBjb2Rle0NDfSB0byBtYWtlIGl0IHNvLiAgVGhpcyBtYWNybyB0cmllcyB2YXJpb3VzCi0rIyBvcHRpb25zIHRoYXQgc2VsZWN0IEFOU0kgQyBvbiBzb21lIHN5c3RlbSBvciBhbm90aGVyLiAgSXQgY29uc2lkZXJzIHRoZQotKyMgY29tcGlsZXIgdG8gYmUgaW4gQU5TSSBDIG1vZGUgaWYgaXQgaGFuZGxlcyBmdW5jdGlvbiBwcm90b3R5cGVzIGNvcnJlY3RseS4KLSsjCi0rIyBJZiB5b3UgdXNlIHRoaXMgbWFjcm8sIHlvdSBzaG91bGQgY2hlY2sgYWZ0ZXIgY2FsbGluZyBpdCB3aGV0aGVyIHRoZSBDCi0rIyBjb21waWxlciBoYXMgYmVlbiBzZXQgdG8gYWNjZXB0IEFOU0kgQzsgaWYgbm90LCB0aGUgc2hlbGwgdmFyaWFibGUKLSsjIEBjb2Rle2FtX2N2X3Byb2dfY2Nfc3RkY30gaXMgc2V0IHRvIEBzYW1we25vfS4gIElmIHlvdSB3cm90ZSB5b3VyIHNvdXJjZQotKyMgY29kZSBpbiBBTlNJIEMsIHlvdSBjYW4gbWFrZSBhbiB1bi1BTlNJZmllZCBjb3B5IG9mIGl0IGJ5IHVzaW5nIHRoZQotKyMgcHJvZ3JhbSBAY29kZXthbnNpMmtucn0sIHdoaWNoIGNvbWVzIHdpdGggR2hvc3RzY3JpcHQuCi0rIyBAZW5kIGRlZm1hYwotKwotKwotKwotKyMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLSsKLSsjIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0rIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSsjCi0rIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0rIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSsjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0rIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotKwotKyMgc2VyaWFsIDMKLSsKLSsKLSsKLSsKLSsKLSsjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0rIwotKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0rIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLSsKLSsjIHNlcmlhbCAxCi0rCi0rCi0rCi0rIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0rIwotKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0rIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLSsKLSsjIHNlcmlhbCAxCi0rCi0rCi0rCi0gIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotICMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotICMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBAIC0xNSw2ICs3OCwxMiBAQAotICAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLSBhY19oZWxwPSIkYWNfaGVscAotKyAgLS13aXRoLWFpZj1kaXIgICAgICAgICAgICAgICAgdXNlIGFpZiBpbiBkaXIiCi0rYWNfaGVscD0iJGFjX2hlbHAKLSsgIC0td2l0aC1haWYtbGliPWRpciAgICAgICAgICAgIHVzZSBhaWYgbGlicmFyaWVzIGluIGRpciIKLSthY19oZWxwPSIkYWNfaGVscAotKyAgLS13aXRoLWFpZi1pbmNsdWRlPWRpciAgICAgICAgdXNlIGFpZiBoZWFkZXJzIGluIGRpciIKLSthY19oZWxwPSIkYWNfaGVscAotICAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLSBhY19oZWxwPSIkYWNfaGVscAotICAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1AQCAtNzMsNyArMTQyLDYgQEAKLSBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotIHNpbGVudD0KLSBzaXRlPQotLXNpdGVmaWxlPQotIHNyY2Rpcj0KLSB0YXJnZXQ9Tk9ORQotIHZlcmJvc2U9Ci1AQCAtMTg4LDcgKzI1Niw2IEBACi0gICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLS0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLSBEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLUBAIC0zNTksMTEgKzQyNiw2IEBACi0gICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotIAotLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0tICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLS0KLSAgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotQEAgLTUyOSwxNiArNTkxLDEyIEBACi0gc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0gCi0gIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLS1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0tICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0tICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotLSAgICBlbHNlCi0tICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotLSAgICBmaQotK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSsgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSsgIGVsc2UKLSsgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgZmkKLS1lbHNlCi0tICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotIGZpCi0gZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotQEAgLTU3OSw3ICs2MzcsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTgzOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY0MTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLUBAIC02MDUsNyArNjYzLDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTYzNSw3ICs2OTMsNyBAQAotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNjg2LDcgKzc0NCw3IEBACi0gICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNzE4LDcgKzc3Niw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3MjI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc4MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLSAKLSBhY19leHQ9YwotICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLUBAIC03MjksMTIgKzc4NywxMiBAQAotIAotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0gCi0tI2xpbmUgNzMzICJjb25maWd1cmUiCi0rI2xpbmUgNzkxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gbWFpbigpe3JldHVybigwKTt9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLUBAIC03NjAsMTIgKzgxOCwxMiBAQAotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSBmaQotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzY0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjgyMjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotIGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotIGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzY5OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjgyNzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC03NzQsNyArODMyLDcgQEAKLSAgIHllczsKLSAjZW5kaWYKLSBFT0YKLS1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzc4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLStpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODM2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIGFjX2N2X3Byb2dfZ2NjPXllcwotIGVsc2UKLSAgIGFjX2N2X3Byb2dfZ2NjPW5vCi1AQCAtNzkzLDcgKzg1MSw3IEBACi0gYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gQ0ZMQUdTPQotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc5NzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLStlY2hvICJjb25maWd1cmU6ODU1OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtODI1LDcgKzg4Myw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjgyOTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4ODc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSAjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotIGlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gICBDUFA9Ci1AQCAtODQwLDEzICs4OTgsMTMgQEAKLSAgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDg0NCAiY29uZmlndXJlIgotKyNsaW5lIDkwMiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhc3NlcnQuaD4KLSBTeW50YXggRXJyb3IKLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6OTA4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgOgotQEAgLTg1NywxMyArOTE1LDEzIEBACi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODYxICJjb25maWd1cmUiCi0rI2xpbmUgOTE5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFzc2VydC5oPgotIFN5bnRheCBFcnJvcgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Njc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICA6Ci1AQCAtODc0LDEzICs5MzIsMTMgQEAKLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4NzggImNvbmZpZ3VyZSIKLSsjbGluZSA5MzYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gU3ludGF4IEVycm9yCi0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjg4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjk0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIDoKLUBAIC05MDUsOSArOTYzLDkgQEAKLSBlY2hvICIkYWNfdCIiJENQUCIgMT4mNgotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBSVgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5MDk6IGNoZWNraW5nIGZvciBBSVgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo5Njc6IGNoZWNraW5nIGZvciBBSVgiID4mNQotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA5MTEgImNvbmZpZ3VyZSIKLSsjbGluZSA5NjkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWZkZWYgX0FJWAotICAgeWVzCi1AQCAtOTI5LDcgKzk4Nyw3IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5MzM6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLStlY2hvICJjb25maWd1cmU6OTkxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci0gaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi0gdGhlbgotQEAgLTk1Myw3ICsxMDExLDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtDQy1jY30gb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5NTc6IGNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEwMTU6IGNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3Byb2dfY2Nfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC05NjksNyArMTAyNyw3IEBACi0gZG8KLSAgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDk3MyAiY29uZmlndXJlIgotKyNsaW5lIDEwMzEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkYXJnLmg+Ci0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtMTAwNiw3ICsxMDY0LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDY4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhbV9jdl9wcm9nX2NjX3N0ZGM9IiRhY19hcmciOyBicmVhawotIGVsc2UKLUBAIC0xMDMwLDYgKzEwODgsMTQyIEBACi0gZXNhYwotIAotIAotKwotKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYWlmIG9yIC0td2l0aG91dC1haWYgd2FzIGdpdmVuLgotK2lmIHRlc3QgIiR7d2l0aF9haWYrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIHdpdGh2YWw9IiR3aXRoX2FpZiIKLSsgIDoKLStmaQotKwotKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYWlmLWxpYiBvciAtLXdpdGhvdXQtYWlmLWxpYiB3YXMgZ2l2ZW4uCi0raWYgdGVzdCAiJHt3aXRoX2FpZl9saWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIHdpdGh2YWw9IiR3aXRoX2FpZl9saWIiCi0rICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIiAtbyAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBObyBhcmd1bWVudCBmb3IgLS13aXRoLWFpZi1saWIiIDE+JjI7IGV4aXQgMTsgfQotK2VsaWYgdGVzdCAiWCR3aXRoX2FpZiIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfYWlmPXllcwotK2ZpCi0rZmkKLSsKLSsjIENoZWNrIHdoZXRoZXIgLS13aXRoLWFpZi1pbmNsdWRlIG9yIC0td2l0aG91dC1haWYtaW5jbHVkZSB3YXMgZ2l2ZW4uCi0raWYgdGVzdCAiJHt3aXRoX2FpZl9pbmNsdWRlK3NldH0iID0gc2V0OyB0aGVuCi0rICB3aXRodmFsPSIkd2l0aF9haWZfaW5jbHVkZSIKLSsgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0rICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IE5vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWluY2x1ZGUiIDE+JjI7IGV4aXQgMTsgfQotK2VsaWYgdGVzdCAiWCR3aXRoX2FpZiIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfYWlmPXllcwotK2ZpCi0rZmkKLSsKLSsKLStlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWlmIiIuLi4gJGFjX2MiIDE+JjYKLStlY2hvICJjb25maWd1cmU6MTEyMTogY2hlY2tpbmcgZm9yIGFpZiIgPiY1Ci0rCi0rY2FzZSAiJHdpdGhfYWlmIiBpbgotK3llcykJOzsKLStubykJOzsKLSsiIikJOzsKLSsqKQlpZiB0ZXN0ICIkd2l0aF9haWZfaW5jbHVkZSIgPSAiIjsgdGhlbgotKwkJd2l0aF9haWZfaW5jbHVkZT0iJHdpdGhfYWlmL2luY2x1ZGUiCi0rCWZpCi0rCWlmIHRlc3QgIiR3aXRoX2FpZl9saWIiID0gIiI7IHRoZW4KLSsJCXdpdGhfYWlmX2xpYj0iJHdpdGhfYWlmL2xpYiRhYmlsaWJkaXJleHQiCi0rCWZpCi0rCTs7Ci0rZXNhYwotK2hlYWRlcl9kaXJzPQotK2xpYl9kaXJzPQotK2Q9Jy91c3IvbG9jYWwnCi0rZm9yIGkgaW4gJGQgL3VzcjsgZG8KLSsJaGVhZGVyX2RpcnM9IiRoZWFkZXJfZGlycyAkaS9pbmNsdWRlIgotKwlsaWJfZGlycz0iJGxpYl9kaXJzICRpL2xpYiRhYmlsaWJkaXJleHQiCi0rZG9uZQotKwotK2Nhc2UgIiR3aXRoX2FpZl9pbmNsdWRlIiBpbgotK3llcykgOzsKLStubykgIDs7Ci0rKikgICBoZWFkZXJfZGlycz0iJHdpdGhfYWlmX2luY2x1ZGUgJGhlYWRlcl9kaXJzIjs7Ci0rZXNhYwotK2Nhc2UgIiR3aXRoX2FpZl9saWIiIGluCi0reWVzKSA7OwotK25vKSAgOzsKLSsqKSAgIGxpYl9kaXJzPSIkd2l0aF9haWZfbGliICRsaWJfZGlycyI7OwotK2VzYWMKLSsKLStzYXZlX0NGTEFHUz0iJENGTEFHUyIKLStzYXZlX0xJQlM9IiRMSUJTIgotK2lyZXM9IGxyZXM9Ci0rZm9yIGkgaW4gJGhlYWRlcl9kaXJzOyBkbwotKwlDRkxBR1M9Ii1JJGkgJHNhdmVfQ0ZMQUdTIgotKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0rI2xpbmUgMTE2MCAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyNpbmNsdWRlIDxhaWYuaD4KLStpbnQgbWFpbigpIHsKLSsKLSs7IHJldHVybiAwOyB9Ci0rRU9GCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0rICBybSAtcmYgY29uZnRlc3QqCi0rICBpcmVzPSRpO2JyZWFrCi0rZWxzZQotKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSsgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2ZpCi0rcm0gLWYgY29uZnRlc3QqCi0rZG9uZQotK2ZvciBpIGluICRsaWJfZGlyczsgZG8KLSsJTElCUz0iLUwkaSAtbGFpZiAgJHNhdmVfTElCUyIKLSsJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotKyNsaW5lIDExNzkgImNvbmZpZ3VyZSIKLSsjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsjaW5jbHVkZSA8YWlmLmg+Ci0raW50IG1haW4oKSB7Ci0rCi0rOyByZXR1cm4gMDsgfQotK0VPRgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0rICBybSAtcmYgY29uZnRlc3QqCi0rICBscmVzPSRpO2JyZWFrCi0rZWxzZQotKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSsgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2ZpCi0rcm0gLWYgY29uZnRlc3QqCi0rZG9uZQotK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotK0xJQlM9IiRzYXZlX0xJQlMiCi0rCi0raWYgdGVzdCAiJGlyZXMiIC1hICIkbHJlcyIgLWEgIiR3aXRoX2FpZiIgIT0gIm5vIjsgdGhlbgotKwlhaWZfaW5jbHVkZWRpcj0iJGlyZXMiCi0rCWFpZl9saWJkaXI9IiRscmVzIgotKwlESVJfYWlmPQotKwlJTkNMVURFX2FpZj0iLUkkYWlmX2luY2x1ZGVkaXIiCi0rCUxJQl9haWY9Ii1MJGFpZl9saWJkaXIgLWxhaWYiCi0rCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSsjZGVmaW5lIEFJRiAxCi0rRU9GCi0rCi0rCQkJd2l0aF9haWY9eWVzCi0rCWVjaG8gIiRhY190IiJoZWFkZXJzICRpcmVzLCBsaWJyYXJpZXMgJGxyZXMiIDE+JjYKLStlbHNlCi0rCURJUl9haWY9ImFpZiIKLSsJSU5DTFVERV9haWY9Ci0rCUxJQl9haWY9Ci0rCXdpdGhfYWlmPW5vCi0rCWVjaG8gIiRhY190IiIkd2l0aF9haWYiIDE+JjYKLStmaQotKwotKwotKwotKwotK2lmIHRlc3QgIiR3aXRoX2FpZiIgPSAibm8iOyB0aGVuCi0rCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogWW91IG11c3QgaGF2ZSBsaWJhaWYgdG8gY29tcGlsZSB0aGlzIHZlcnNpb24gb2YgR0RCLiIgMT4mMjsgZXhpdCAxOyB9Ci0rZmkKLStjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSsjZGVmaW5lIEFJRiAxCi0rRU9GCi0rCi0gYWNfYXV4X2Rpcj0KLSBmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uOyBkbwotICAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLUBAIC0xMDc3LDcgKzEyNzEsNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjEwODE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxMjc1OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSAKLSBob3N0X2FsaWFzPSRob3N0Ci0gY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1AQCAtMTA5OCw3ICsxMjkyLDcgQEAKLSBlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMTAyOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxMjk2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotIAotIHRhcmdldF9hbGlhcz0kdGFyZ2V0Ci0gY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLUBAIC0xMTE2LDcgKzEzMTAsNyBAQAotIGVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMTIwOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEzMTQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLSAKLSBidWlsZF9hbGlhcz0kYnVpbGQKLSBjYXNlICIkYnVpbGRfYWxpYXMiIGluCi1AQCAtMTE0MSw3ICsxMzM1LDcgQEAKLSAKLSBBTExfTElOR1VBUz0KLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTE0NTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEzMzk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotIHNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtMTE3MCw3ICsxMzY0LDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjExNzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEzNjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTExOTgsMTIgKzEzOTIsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTIwMjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxMzk2OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEyMDcgImNvbmZpZ3VyZSIKLSsjbGluZSAxNDAxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdGRhcmcuaD4KLUBAIC0xMjExLDcgKzE0MDUsNyBAQAotICNpbmNsdWRlIDxmbG9hdC5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0xMjI4LDcgKzE0MjIsNyBAQAotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEyMzIgImNvbmZpZ3VyZSIKLSsjbGluZSAxNDI2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0cmluZy5oPgotIEVPRgotQEAgLTEyNDYsNyArMTQ0MCw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTI1MCAiY29uZmlndXJlIgotKyNsaW5lIDE0NDQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gRU9GCi1AQCAtMTI2Nyw3ICsxNDYxLDcgQEAKLSAgIDoKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTI3MSAiY29uZmlndXJlIgotKyNsaW5lIDE0NjUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Y3R5cGUuaD4KLSAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLUBAIC0xMjc4LDcgKzE0NzIsNyBAQAotIGV4aXQgKDApOyB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgOgotIGVsc2UKLUBAIC0xMzAyLDEyICsxNDk2LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjEzMDY6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLStlY2hvICJjb25maWd1cmU6MTUwMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEzMTEgImNvbmZpZ3VyZSIKLSsjbGluZSAxNTA1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtMTM1Niw3ICsxNTUwLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzYwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTU0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jX2NvbnN0PXllcwotIGVsc2UKLUBAIC0xMzc3LDIxICsxNTcxLDIxIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTM4MTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE1NzU6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGFjX2N2X2NfaW5saW5lPW5vCi0gZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEzODggImNvbmZpZ3VyZSIKLSsjbGluZSAxNTgyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci0gfSAkYWNfa3cgZm9vKCkgewotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzOTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLSBlbHNlCi1AQCAtMTQxNywxMiArMTYxMSwxMiBAQAotIGVzYWMKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxNjE1OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE0MjYgImNvbmZpZ3VyZSIKLSsjbGluZSAxNjIwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpZiBTVERDX0hFQURFUlMKLUBAIC0xNDUwLDEyICsxNjQ0LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTQ1NDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE2NDg6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNDU5ICJjb25maWd1cmUiCi0rI2xpbmUgMTY1MyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaWYgU1REQ19IRUFERVJTCi1AQCAtMTQ4NSwxOSArMTY3OSwxOSBAQAotICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0gIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE0ODk6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTY4MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTQ5NCAiY29uZmlndXJlIgotKyNsaW5lIDE2ODggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YWxsb2NhLmg+Ci0gaW50IG1haW4oKSB7Ci0gY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY5NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi0gZWxzZQotQEAgLTE1MTgsMTIgKzE3MTIsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNTIyOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTcxNjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE1MjcgImNvbmZpZ3VyZSIKLSsjbGluZSAxNzIxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2lmZGVmIF9fR05VQ19fCi1AQCAtMTU1MSw3ICsxNzQ1LDcgQEAKLSBjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLSBlbHNlCi1AQCAtMTU4MywxMiArMTc3NywxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNTg3OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTc4MTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTU5MiAiY29uZmlndXJlIgotKyNsaW5lIDE3ODYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi0gd2ViZWNyYXkKLUBAIC0xNjEzLDEyICsxODA3LDEyIEBACi0gaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE2MTc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE4MTE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTYyMiAiY29uZmlndXJlIgotKyNsaW5lIDE4MTYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTE2NDEsNyArMTgzNSw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC0xNjY4LDcgKzE4NjIsNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE2NzI6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxODY2OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMTY3Niw3ICsxODcwLDcgQEAKLSAgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTY4MCAiY29uZmlndXJlIgotKyNsaW5lIDE4NzQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotIHsKLUBAIC0xNjk1LDcgKzE4ODksNyBAQAotICAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4OTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi0gZWxzZQotQEAgLTE3MjAsMTcgKzE5MTQsMTcgQEAKLSBkbwotIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTcyNDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxOTE4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNzI5ICJjb25maWd1cmUiCi0rI2xpbmUgMTkyMyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDwkYWNfaGRyPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTkyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0xNzU5LDEyICsxOTUzLDEyIEBACi0gZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLSBkbwotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE3NjM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE5NTc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTc2OCAiY29uZmlndXJlIgotKyNsaW5lIDE5NjIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTE3ODcsNyArMTk4MSw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC0xODEyLDcgKzIwMDYsNyBAQAotIGRvbmUKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTgxNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIwMTA6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTE4MjAsNyArMjAxNCw3IEBACi0gICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE4MjQgImNvbmZpZ3VyZSIKLSsjbGluZSAyMDE4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi1AQCAtMTk2MCw3ICsyMTU0LDcgQEAKLSB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLSBlbHNlCi1AQCAtMTk4OCwxNyArMjE4MiwxNyBAQAotIGRvCi0gYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxOTkyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIxODY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE5OTcgImNvbmZpZ3VyZSIKLSsjbGluZSAyMTkxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZHI+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjIwMDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTIwMjgsMTIgKzIyMjIsMTIgQEAKLSBfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjAzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjIyNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMDM3ICJjb25maWd1cmUiCi0rI2xpbmUgMjIzMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMjA1Niw3ICsyMjUwLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTIwODUsMTIgKzIyNzksMTIgQEAKLSAgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjA4OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjI4MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMDk0ICJjb25maWd1cmUiCi0rI2xpbmUgMjI4OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMjExMyw3ICsyMzA3LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTIxNDcsMTkgKzIzNDEsMTkgQEAKLSAKLSAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjE1MTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjM0NTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIxNTYgImNvbmZpZ3VyZSIKLSsjbGluZSAyMzUwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxvY2FsZS5oPgotIGludCBtYWluKCkgewotIHJldHVybiBMQ19NRVNTQUdFUwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi0gZWxzZQotQEAgLTIxODAsNyArMjM3NCw3IEBACi0gICAgIGZpCi0gICBmaQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIxODQ6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIzNzg6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLUBAIC0yMjAwLDcgKzIzOTQsNyBAQAotIEVPRgotIAotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMjA0OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjM5ODogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLUBAIC0yMjE5LDE3ICsyNDEzLDE3IEBACi0gCi0gCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIyMjM6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNDE3OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIyMjggImNvbmZpZ3VyZSIKLSsjbGluZSAyNDIyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpYmludGwuaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Mjc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMjI0NiwxOSArMjQ0MCwxOSBAQAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjI1MDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI0NDQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMjU1ICJjb25maWd1cmUiCi0rI2xpbmUgMjQ0OSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0gaW50IG1haW4oKSB7Ci0gcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLSBlbHNlCi1AQCAtMjI3NCw3ICsyNDY4LDcgQEAKLSAKLSAJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotIAkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMjc4OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjQ3MjogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTIyODIsNyArMjQ3Niw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1saW50bCAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIyODYgImNvbmZpZ3VyZSIKLSsjbGluZSAyNDgwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtMjI5Myw3ICsyNDg3LDcgQEAKLSBiaW5kdGV4dGRvbWFpbigpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTIzMDksMTkgKzI1MDMsMTkgQEAKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIzMTM6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNTA3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjMxOCAiY29uZmlndXJlIgotKyNsaW5lIDI1MTIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSByZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMyNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotIGVsc2UKLUBAIC0yMzQ5LDcgKzI1NDMsNyBAQAotIAkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIzNTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI1NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTIzODMsMTIgKzI1NzcsMTIgQEAKLSAJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjM4NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjU4MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMzkyICJjb25maWd1cmUiCi0rI2xpbmUgMjU4NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMjQxMSw3ICsyNjA1LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTI0MzgsNyArMjYzMiw3IEBACi0gCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjQ0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjYzNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI0NzQsNyArMjY2OCw3IEBACi0gCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNDc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNjcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI1MDYsNyArMjcwMCw3IEBACi0gZmkKLSAKLSAJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNTEwICJjb25maWd1cmUiCi0rI2xpbmUgMjcwNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotQEAgLTI1MTQsNyArMjcwOCw3IEBACi0gCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzEyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIENBVE9CSkVYVD0uZ21vCi0gCQkgICBEQVRBRElSTkFNRT1zaGFyZQotQEAgLTI1NDYsNyArMjc0MCw3IEBACi0gICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI1NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI3NDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI1ODAsNyArMjc3NCw3IEBACi0gICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjU4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mjc3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI2MTYsNyArMjgxMCw3IEBACi0gICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNjIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyODE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI3MDYsNyArMjkwMCw3IEBACi0gICAgICAgIExJTkdVQVM9Ci0gICAgICBlbHNlCi0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNzEwOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjkwNDogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi1AQCAtMjczNCwxNyArMjkyOCwxNyBAQAotICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0gCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNzM4OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjkzMjogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNzQzICJjb25maWd1cmUiCi0rI2xpbmUgMjkzNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjI3NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTI4NDYsNyArMzA0MCw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mjg1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzA0NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BV0snK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjg4Nyw3ICszMDgxLDcgQEAKLSAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0gIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI4OTE6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMDg1OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLSBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtMjk0OCw3ICszMTQyLDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mjk1MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzE0NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0yOTgwLDcgKzMxNzQsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI5ODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMxNzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMwMTIsNyArMzIwNiw3IEBACi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwMTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMyMTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMwNDksNyArMzI0Myw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzA1MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzI0NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMwODMsNyArMzI3Nyw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW1pZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bWlnOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzI4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19NSUcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMzEzNCwxMiArMzMyOCwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMxMzg6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMzMzI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMxNDMgImNvbmZpZ3VyZSIKLSsjbGluZSAzMzM3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxzaWduYWwuaD4KLUBAIC0zMTU2LDcgKzMzNTAsNyBAQAotIGludCBpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNjA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKLSBlbHNlCi1AQCAtMzE3NiwxMiArMzM3MCwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzE4MDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMzc0OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMxODUgImNvbmZpZ3VyZSIKLSsjbGluZSAzMzc5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdGRhcmcuaD4KLUBAIC0zMTg5LDcgKzMzODMsNyBAQAotICNpbmNsdWRlIDxmbG9hdC5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTkzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzM4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0zMjA2LDcgKzM0MDAsNyBAQAotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMyMTAgImNvbmZpZ3VyZSIKLSsjbGluZSAzNDA0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0cmluZy5oPgotIEVPRgotQEAgLTMyMjQsNyArMzQxOCw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzIyOCAiY29uZmlndXJlIgotKyNsaW5lIDM0MjIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gRU9GCi1AQCAtMzI0NSw3ICszNDM5LDcgQEAKLSAgIDoKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzI0OSAiY29uZmlndXJlIgotKyNsaW5lIDM0NDMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Y3R5cGUuaD4KLSAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLUBAIC0zMjU2LDcgKzM0NTAsNyBAQAotIGV4aXQgKDApOyB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgOgotIGVsc2UKLUBAIC0zMjk3LDE3ICszNDkxLDE3IEBACi0gZG8KLSBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMzMDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzQ5NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzMwNiAiY29uZmlndXJlIgotKyNsaW5lIDM1MDAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8JGFjX2hkcj4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MDU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMzMzNCwxMiArMzUyOCwxMiBAQAotIGRvbmUKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzMzODogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM1MzI6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzM0MyAiY29uZmlndXJlIgotKyNsaW5lIDM1MzcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci1AQCAtMzM5MSwxMiArMzU4NSwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzM5NTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozNTg5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzQwMCAiY29uZmlndXJlIgotKyNsaW5lIDM1OTQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLUBAIC0zNDQ1LDcgKzM2MzksNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2NfY29uc3Q9eWVzCi0gZWxzZQotQEAgLTM0NjksMTIgKzM2NjMsMTIgQEAKLSBmb3IgYWNfZnVuYyBpbiBzZXRwZ2lkIHNicmsgc2lnYWN0aW9uIGlzYXNjaWkgYnplcm8gYmNvcHkgYnRvd2MgcG9sbCBzaWdwcm9jbWFzawotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzQ3MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzY2NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzNDc4ICJjb25maWd1cmUiCi0rI2xpbmUgMzY3MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMzQ5Nyw3ICszNjkxLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2OTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTM1MjQsMTkgKzM3MTgsMTkgQEAKLSAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotICMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNTI4OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM3MjI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM1MzMgImNvbmZpZ3VyZSIKLSsjbGluZSAzNzI3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFsbG9jYS5oPgotIGludCBtYWluKCkgewotIGNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotIGVsc2UKLUBAIC0zNTU3LDEyICszNzUxLDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzU2MTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM3NTU6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzNTY2ICJjb25maWd1cmUiCi0rI2xpbmUgMzc2MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpZmRlZiBfX0dOVUNfXwotQEAgLTM1OTAsNyArMzc4NCw3IEBACi0gY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3ODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi0gZWxzZQotQEAgLTM2MjIsMTIgKzM4MTYsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzYyNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM4MjA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM2MzEgImNvbmZpZ3VyZSIKLSsjbGluZSAzODI1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotIHdlYmVjcmF5Ci1AQCAtMzY1MiwxMiArMzg0NiwxMiBAQAotIGlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLSBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNjU2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozODUwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM2NjEgImNvbmZpZ3VyZSIKLSsjbGluZSAzODU1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0zNjgwLDcgKzM4NzQsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2ODQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMzcwNyw3ICszOTAxLDcgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNzExOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzkwNTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTM3MTUsNyArMzkwOSw3IEBACi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM3MTkgImNvbmZpZ3VyZSIKLSsjbGluZSAzOTEzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLSB7Ci1AQCAtMzczNCw3ICszOTI4LDcgQEAKLSAgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLSB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotIGVsc2UKLUBAIC0zNzU3LDE5ICszOTUxLDE5IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRSRUdTIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mzc2MTogY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRSRUdTIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mzk1NTogY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRSRUdTIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfcHRyYWNlX2dldHJlZ3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzc2NiAiY29uZmlndXJlIgotKyNsaW5lIDM5NjAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotIGludCBtYWluKCkgewotIFBUUkFDRV9HRVRSRUdTOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NzM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX3B0cmFjZV9nZXRyZWdzPXllcwotIGVsc2UKLUBAIC0zNzkwLDE5ICszOTg0LDE5IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgUFRSQUNFX0dFVFhGUFJFR1MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNzk0OiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVFhGUFJFR1MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozOTg4OiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVFhGUFJFR1MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0eGZwcmVncycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzNzk5ICJjb25maWd1cmUiCi0rI2xpbmUgMzk5MyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0gaW50IG1haW4oKSB7Ci0gUFRSQUNFX0dFVFhGUFJFR1M7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgwNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfcHRyYWNlX2dldHhmcHJlZ3M9eWVzCi0gZWxzZQotQEAgLTM4MjMsNyArNDAxNyw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc29ja2V0cGFpciBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM4Mjc6IGNoZWNraW5nIGZvciBzb2NrZXRwYWlyIGluIC1sc29ja2V0IiA+JjUKLStlY2hvICJjb25maWd1cmU6NDAyMTogY2hlY2tpbmcgZm9yIHNvY2tldHBhaXIgaW4gLWxzb2NrZXQiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nc29ja2V0cGFpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtMzgzMSw3ICs0MDI1LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxzb2NrZXQgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzODM1ICJjb25maWd1cmUiCi0rI2xpbmUgNDAyOSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTM4NDIsNyArNDAzNiw3IEBACi0gc29ja2V0cGFpcigpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTM4NzIsMTIgKzQwNjYsMTIgQEAKLSBmb3IgYWNfZnVuYyBpbiBzb2NrZXRwYWlyCi0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozODc2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0MDcwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM4ODEgImNvbmZpZ3VyZSIKLSsjbGluZSA0MDc1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0zOTAwLDcgKzQwOTQsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5MDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMzkyNywxMiArNDEyMSwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozOTMxOiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDEyNTogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzkzNiAiY29uZmlndXJlIgotKyNsaW5lIDQxMzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC0zOTUzLDcgKzQxNDcsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIG1hbGxvYwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLSBlbHNlCi1AQCAtMzk3NCwxMiArNDE2OCwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozOTc4OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQxNzI6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzk4MyAiY29uZmlndXJlIgotKyNsaW5lIDQxNzcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00MDAwLDcgKzQxOTQsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHJlYWxsb2MKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTk4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotIGVsc2UKLUBAIC00MDIxLDEyICs0MjE1LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQwMjU6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDIxOTogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MDMwICJjb25maWd1cmUiCi0rI2xpbmUgNDIyNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQwNDcsNyArNDI0MSw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZnJlZQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi0gZWxzZQotQEAgLTQwNjgsMTIgKzQyNjIsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQwNzI6IGNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQyNjY6IGNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MDc3ICJjb25maWd1cmUiCi0rI2xpbmUgNDI3MSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQwOTQsNyArNDI4OCw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3RyZXJyb3IKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDk4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjkyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZXJyb3I9bm8KLSBlbHNlCi1AQCAtNDExNSwxMiArNDMwOSwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQxMTk6IGNoZWNraW5nIHdoZXRoZXIgc3RyZHVwIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0MzEzOiBjaGVja2luZyB3aGV0aGVyIHN0cmR1cCBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MTI0ICJjb25maWd1cmUiCi0rI2xpbmUgNDMxOCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQxNDEsNyArNDMzNSw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3RyZHVwCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMzOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cD1ubwotIGVsc2UKLUBAIC00MTYyLDEyICs0MzU2LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDE2NjogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQzNjA6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQxNzEgImNvbmZpZ3VyZSIKLSsjbGluZSA0MzY1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNDE4OCw3ICs0MzgyLDcgQEAKLSBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTkyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mzg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi0gZWxzZQotQEAgLTQyMTUsOSArNDQwOSw5IEBACi0gIyBjb3VsZCBiZSBleHB1bmdlZC4gLS1qc20gMTk5OS0wMy0yMgotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBIUFVYIHNhdmVfc3RhdGUgc3RydWN0dXJlIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDIxOTogY2hlY2tpbmcgZm9yIEhQVVggc2F2ZV9zdGF0ZSBzdHJ1Y3R1cmUiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NDEzOiBjaGVja2luZyBmb3IgSFBVWCBzYXZlX3N0YXRlIHN0cnVjdHVyZSIgPiY1Ci0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQyMjEgImNvbmZpZ3VyZSIKLSsjbGluZSA0NDE1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvc2F2ZV9zdGF0ZS5oPgotIEVPRgotQEAgLTQyMzIsNyArNDQyNiw3IEBACi0gcm0gLWYgY29uZnRlc3QqCi0gCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQyMzYgImNvbmZpZ3VyZSIKLSsjbGluZSA0NDMwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvc2F2ZV9zdGF0ZS5oPgotIEVPRgotQEAgLTQyOTYsMTkgKzQ0OTAsMTkgQEAKLSAKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDMwMDogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NDk0OiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQzMDUgImNvbmZpZ3VyZSIKLSsjbGluZSA0NDk5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSBpbnQgbWFpbigpIHsKLSBwc3RhdHVzX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi0gZWxzZQotQEAgLTQzMzAsMTkgKzQ1MjQsMTkgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0MzM0OiBjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NTI4OiBjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDMzOSAiY29uZmlndXJlIgotKyNsaW5lIDQ1MzMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotIGludCBtYWluKCkgewotIHBycnVuX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnJ1bl90PXllcwotIGVsc2UKLUBAIC00MzY0LDE5ICs0NTU4LDE5IEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDM2ODogY2hlY2tpbmcgZm9yIGdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NTYyOiBjaGVja2luZyBmb3IgZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZ3JlZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQzNzMgImNvbmZpZ3VyZSIKLSsjbGluZSA0NTY3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSBpbnQgbWFpbigpIHsKLSBncmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzODA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTQzOTgsMTkgKzQ1OTIsMTkgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZ3JlZ3NldF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NDAyOiBjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NTk2OiBjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDQwNyAiY29uZmlndXJlIgotKyNsaW5lIDQ2MDEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotIGludCBtYWluKCkgewotIGZwcmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2MDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90PXllcwotIGVsc2UKLUBAIC00NDMyLDE5ICs0NjI2LDE5IEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NDM2OiBjaGVja2luZyBmb3IgcHJncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDYzMDogY2hlY2tpbmcgZm9yIHByZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDQ0MSAiY29uZmlndXJlIgotKyNsaW5lIDQ2MzUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotIGludCBtYWluKCkgewotIHByZ3JlZ3NldF90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDQ4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTQ0NjYsMTkgKzQ2NjAsMTkgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDQ3MDogY2hlY2tpbmcgZm9yIHByZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NjY0OiBjaGVja2luZyBmb3IgcHJmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ0NzUgImNvbmZpZ3VyZSIKLSsjbGluZSA0NjY5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSBpbnQgbWFpbigpIHsKLSBwcmZwcmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0ODI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTQ1MDAsMTkgKzQ2OTQsMTkgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwaWRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NTA0OiBjaGVja2luZyBmb3IgbHdwaWRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0Njk4OiBjaGVja2luZyBmb3IgbHdwaWRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDUwOSAiY29uZmlndXJlIgotKyNsaW5lIDQ3MDMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotIGludCBtYWluKCkgewotIGx3cGlkX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90PXllcwotIGVsc2UKLUBAIC00NTM0LDE5ICs0NzI4LDE5IEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cGlkX3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc2FkZHJfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NTM4OiBjaGVja2luZyBmb3IgcHNhZGRyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDczMjogY2hlY2tpbmcgZm9yIHBzYWRkcl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNhZGRyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDU0MyAiY29uZmlndXJlIgotKyNsaW5lIDQ3MzcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotIGludCBtYWluKCkgewotIHBzYWRkcl90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTUwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQ0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNhZGRyX3Q9eWVzCi0gZWxzZQotQEAgLTQ1NzIsNyArNDc2Niw3IEBACi0gICAgICAgICAKLSAgIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QgPSB5ZXM7IHRoZW4KLSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBwcmZwcmVnc2V0X3QgdHlwZSBpcyBicm9rZW4iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NTc2OiBjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ3NzA6IGNoZWNraW5nIHdoZXRoZXIgcHJmcHJlZ3NldF90IHR5cGUgaXMgYnJva2VuIiA+JjUKLSAgICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9wcmZwcmVnc2V0X3RfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTQ1ODAsNyArNDc3NCw3IEBACi0gICBnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbj15ZXMKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDU4NCAiY29uZmlndXJlIgotKyNsaW5lIDQ3NzggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotICAgICAgICBpbnQgbWFpbiAoKQotQEAgLTQ1OTAsNyArNDc4NCw3IEBACi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3ODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbj1ubwotIGVsc2UKLUBAIC00NjE1LDEyICs0ODA5LDEyIEBACi0gCi0gICAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ2MTk6IGNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ4MTM6IGNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDYyNCAiY29uZmlndXJlIgotKyNsaW5lIDQ4MTggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotQEAgLTQ2MzMsNyArNDgyNyw3IEBACi0gICAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODMxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldD15ZXMKLSBlbHNlCi1AQCAtNDY1NSw3ICs0ODQ5LDcgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtYWluIGluIC1sbSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ2NTk6IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ4NTM6IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBtJ18nbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNDY2MywxNCArNDg1NywxNCBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbG0gICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NjY3ICJjb25maWd1cmUiCi0rI2xpbmUgNDg2MSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIG1haW4oKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC00Njk5LDcgKzQ4OTMsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWxjIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDcwMzogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0ODk3OiBjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sYyIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBjJ18nd2N0eXBlIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC00NzA3LDcgKzQ5MDEsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbGMgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NzExICJjb25maWd1cmUiCi0rI2xpbmUgNDkwNSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTQ3MTgsNyArNDkxMiw3IEBACi0gd2N0eXBlKCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNDczNyw3ICs0OTMxLDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sdyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ3NDE6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWx3IiA+JjUKLStlY2hvICJjb25maWd1cmU6NDkzNTogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHciID4mNQotIGFjX2xpYl92YXI9YGVjaG8gdydfJ3djdHlwZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNDc0NSw3ICs0OTM5LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWx3ICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDc0OSAiY29uZmlndXJlIgotKyNsaW5lIDQ5NDMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC00NzU2LDcgKzQ5NTAsNyBAQAotIHdjdHlwZSgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTQ3ODgsMTIgKzQ5ODIsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NzkyOiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0OTg2OiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfY19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDc5NyAiY29uZmlndXJlIgotKyNsaW5lIDQ5OTEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLUBAIC00ODAzLDcgKzQ5OTcsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4MDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9jX2xvbmdfbG9uZz15ZXMKLSBlbHNlCi1AQCAtNDgyNSw3ICs1MDE5LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDgyOTogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUwMjM6IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBwcmludGYiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNDgzMyw3ICs1MDI3LDcgQEAKLSAgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz1ubwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0ODM3ICJjb25maWd1cmUiCi0rI2xpbmUgNTAzMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluICgpIHsKLUBAIC00ODQ3LDcgKzUwNDEsNyBAQAotICAgcmV0dXJuIChzdHJjbXAgKCIweDAxMjM0NTY3ODlhYmNkZWYiLCBidWYpKTsKLSB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nPXllcwotIGVsc2UKLUBAIC00ODcxLDE5ICs1MDY1LDE5IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0ODc1OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBjb21waWxlciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUwNjk6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0ODgwICJjb25maWd1cmUiCi0rI2xpbmUgNTA3NCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIGxvbmcgZG91YmxlIGZvbzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDgxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jX2xvbmdfZG91YmxlPXllcwotIGVsc2UKLUBAIC00OTA1LDcgKzUwOTksNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ5MDk6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUxMDM6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTQ5MTMsNyArNTEwNyw3IEBACi0gICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT1ubwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0OTE3ICJjb25maWd1cmUiCi0rI2xpbmUgNTExMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluICgpIHsKLUBAIC00OTIzLDcgKzUxMTcsNyBAQAotICAgcmV0dXJuIChzdHJuY21wICgiMy4xNDE1OSIsIGJ1ZiwgNykpOwotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT15ZXMKLSBlbHNlCi1AQCAtNDk0Nyw3ICs1MTQxLDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBzY2FuZiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ5NTE6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHNjYW5mIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTE0NTogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTQ5NTUsNyArNTE0OSw3IEBACi0gICBnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPW5vCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ5NTkgImNvbmZpZ3VyZSIKLSsjbGluZSA1MTUzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4gKCkgewotQEAgLTQ5NjUsNyArNTE1OSw3IEBACi0gICByZXR1cm4gIShmID4gMy4xNDE1OSAmJiBmIDwgMy4xNDE2MCk7Ci0gfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGU9eWVzCi0gZWxzZQotQEAgLTQ5OTEsMTcgKzUxODUsMTcgQEAKLSBkbwotIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDk5NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MTg5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MDAwICJjb25maWd1cmUiCi0rI2xpbmUgNTE5NCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDwkYWNfaGRyPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NTE5OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC01MDMwLDEyICs1MjI0LDEyIEBACi0gZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLSBkbwotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUwMzQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUyMjg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTAzOSAiY29uZmlndXJlIgotKyNsaW5lIDUyMzMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTUwNTgsNyArNTI1Miw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC01MDgzLDcgKzUyNzcsNyBAQAotIGRvbmUKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTA4NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUyODE6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTUwOTEsNyArNTI4NSw3IEBACi0gICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUwOTUgImNvbmZpZ3VyZSIKLSsjbGluZSA1Mjg5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi1AQCAtNTIzMSw3ICs1NDI1LDcgQEAKLSB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLSBlbHNlCi1AQCAtNTI2MCw3ICs1NDU0LDcgQEAKLSAgICBjYXNlICR7aG9zdF9vc30gaW4KLSAgICBocHV4KikKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MjY0OiBjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NDU4OiBjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiID4mNQotICAgICAgIGlmIHRlc3QgLWYgL3Vzci9pbmNsdWRlL2RjZS9jbWFfY29uZmlnLmggOyB0aGVuCi0gICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KLSAgICAgICAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1AQCAtNTI3OSw3ICs1NDczLDcgQEAKLSAgICAgICA7OwotICAgIHNvbGFyaXMqKQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUyODM6IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU0Nzc6IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1Ci0gICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28uMSA7IHRoZW4KLSAgICAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi1AQCAtNTI4OSw3ICs1NDgzLDcgQEAKLSAgICAgICAgICBDT05GSUdfT0JTPSIke0NPTkZJR19PQlN9IHNvbC10aHJlYWQubyIKLSAgICAgICAgICBDT05GSUdfU1JDUz0iJHtDT05GSUdfU1JDU30gc29sLXRocmVhZC5jIgotICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUyOTM6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU0ODc6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBkbCdfJ2Rsb3BlbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNTI5Nyw3ICs1NDkxLDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxkbCAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUzMDEgImNvbmZpZ3VyZSIKLSsjbGluZSA1NDk1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNTMwOCw3ICs1NTAyLDcgQEAKLSBkbG9wZW4oKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTUwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC01MzQwLDE3ICs1NTM0LDE3IEBACi0gICAgICAgICAgICAgIyBhbGwgc3ltYm9scyB2aXNpYmxlIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLSAgICAgICAgICAgICBob2xkX2xkZmxhZ3M9JExERkxBR1MKLSAgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTM0NDogY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU1Mzg6IGNoZWNraW5nIGZvciB0aGUgbGQgLWV4cG9ydC1keW5hbWljIGZsYWciID4mNQotICAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLVdsLC1leHBvcnQtZHluYW1pYyIKLSAgICAgICAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTM0NyAiY29uZmlndXJlIgotKyNsaW5lIDU1NDEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSBpbnQgaTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1NDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZm91bmQ9eWVzCi0gZWxzZQotQEAgLTUzNjksMTMgKzU1NjMsMTMgQEAKLSAJICMgU3VuIHJhbmRvbWx5IHR3ZWFrZWQgdGhlIHByb3RvdHlwZXMgaW4gPHByb2Nfc2VydmljZS5oPgotIAkgIyBhdCBvbmUgcG9pbnQuCi0gCSBlY2hvICRhY19uICJjaGVja2luZyBpZiA8cHJvY19zZXJ2aWNlLmg+IGlzIG9sZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUzNzM6IGNoZWNraW5nIGlmIDxwcm9jX3NlcnZpY2UuaD4gaXMgb2xkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTU2NzogY2hlY2tpbmcgaWYgPHByb2Nfc2VydmljZS5oPiBpcyBvbGQiID4mNQotIAkgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgCi0gCSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTM3OSAiY29uZmlndXJlIgotKyNsaW5lIDU1NzMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAJCSNpbmNsdWRlIDxwcm9jX3NlcnZpY2UuaD4KLUBAIC01Mzg2LDcgKzU1ODAsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzOTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1ODQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkPW5vCi0gZWxzZQotQEAgLTU1NzYsMTIgKzU3NzAsMTIgQEAKLSBSRUdFWF9DRkxBR1M9Ii1EVVNFX0lOQ0xVREVEX1JFR0VYIgotIGlmIHRlc3QgJHdhbnRfaW5jbHVkZWRfcmVnZXggPSBmYWxzZTsgdGhlbgotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSByZWdleCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU1ODA6IGNoZWNraW5nIGZvciBHTlUgcmVnZXgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1Nzc0OiBjaGVja2luZyBmb3IgR05VIHJlZ2V4IiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9nbnVfcmVnZXgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTU4NSAiY29uZmlndXJlIgotKyNsaW5lIDU3NzkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotQEAgLTU1OTMsNyArNTc4Nyw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTU5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTc5MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfZ251X3JlZ2V4PXllcwotIGVsc2UKLUBAIC01NjE2LDEyICs1ODEwLDEyIEBACi0gCi0gIyBJbiB0aGUgQ3lnd2luIGVudmlyb25tZW50LCB3ZSBuZWVkIHNvbWUgYWRkaXRpb25hbCBmbGFncy4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY3lnd2luIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTYyMDogY2hlY2tpbmcgZm9yIGN5Z3dpbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU4MTQ6IGNoZWNraW5nIGZvciBjeWd3aW4iID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3Zfb3NfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDU2MjUgImNvbmZpZ3VyZSIKLSsjbGluZSA1ODE5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2lmIGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLUBAIC01NjU1LDcgKzU4NDksNyBAQAotIGVsc2UKLSAgIFRFUk1fTElCPQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTY1OTogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTg1MzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIG5jdXJzZXMnXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC01NjYzLDcgKzU4NTcsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbG5jdXJzZXMgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NjY3ICJjb25maWd1cmUiCi0rI2xpbmUgNTg2MSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTU2NzQsNyArNTg2OCw3IEBACi0gdGdldGVudCgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTU2OTMsNyArNTg4Nyw3IEBACi0gZWxzZQotICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxIY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTY5NzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxIY3Vyc2VzIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTg5MTogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxIY3Vyc2VzIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIEhjdXJzZXMnXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC01NzAxLDcgKzU4OTUsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbEhjdXJzZXMgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NzA1ICJjb25maWd1cmUiCi0rI2xpbmUgNTg5OSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTU3MTIsNyArNTkwNiw3IEBACi0gdGdldGVudCgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTcxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTU3MzEsNyArNTkyNSw3IEBACi0gZWxzZQotICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtbGliIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTczNTogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtbGliIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTkyOTogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtbGliIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIHRlcm1saWInXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC01NzM5LDcgKzU5MzMsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbHRlcm1saWIgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NzQzICJjb25maWd1cmUiCi0rI2xpbmUgNTkzNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTU3NTAsNyArNTk0NCw3IEBACi0gdGdldGVudCgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTc1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTU3NjksNyArNTk2Myw3IEBACi0gZWxzZQotICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTc3MzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTk2NzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIHRlcm1jYXAnXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC01Nzc3LDcgKzU5NzEsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbHRlcm1jYXAgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NzgxICJjb25maWd1cmUiCi0rI2xpbmUgNTk3NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTU3ODgsNyArNTk4Miw3IEBACi0gdGdldGVudCgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTc5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTU4MDcsNyArNjAwMSw3IEBACi0gZWxzZQotICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1ODExOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbGN1cnNlcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYwMDU6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sY3Vyc2VzIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIGN1cnNlcydfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTU4MTUsNyArNjAwOSw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sY3Vyc2VzICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTgxOSAiY29uZmlndXJlIgotKyNsaW5lIDYwMTMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC01ODI2LDcgKzYwMjAsNyBAQAotIHRnZXRlbnQoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjAyNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC01ODQ1LDcgKzYwMzksNyBAQAotIGVsc2UKLSAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWluZm8iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1ODQ5OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjA0MzogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtaW5mbyIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyB0ZXJtaW5mbydfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTU4NTMsNyArNjA0Nyw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sdGVybWluZm8gICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1ODU3ICJjb25maWd1cmUiCi0rI2xpbmUgNjA1MSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTU4NjQsNyArNjA1OCw3IEBACi0gdGdldGVudCgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MDYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTYwMjIsNyArNjIxNiw3IEBACi0gZmkKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUY2wgY29uZmlndXJhdGlvbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYwMjY6IGNoZWNraW5nIGZvciBUY2wgY29uZmlndXJhdGlvbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYyMjA6IGNoZWNraW5nIGZvciBUY2wgY29uZmlndXJhdGlvbiIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY190Y2xjb25maWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNjEzMCw3ICs2MzI0LDcgQEAKLSBmaQotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRrIGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2MTM0OiBjaGVja2luZyBmb3IgVGsgY29uZmlndXJhdGlvbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYzMjg6IGNoZWNraW5nIGZvciBUayBjb25maWd1cmF0aW9uIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3RrY29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTYyMjYsNyArNjQyMCw3IEBACi0gCi0gbm9fdGNsPXRydWUKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYyMzA6IGNoZWNraW5nIGZvciBUY2wgcHJpdmF0ZSBoZWFkZXJzLiBkaXI9JHtjb25maWdkaXJ9IiA+JjUKLStlY2hvICJjb25maWd1cmU6NjQyNDogY2hlY2tpbmcgZm9yIFRjbCBwcml2YXRlIGhlYWRlcnMuIGRpcj0ke2NvbmZpZ2Rpcn0iID4mNQotICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGNsaW5jbHVkZSBvciAtLXdpdGhvdXQtdGNsaW5jbHVkZSB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHt3aXRoX3RjbGluY2x1ZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIHdpdGh2YWw9IiR3aXRoX3RjbGluY2x1ZGUiCi1AQCAtNjI5MiwxNyArNjQ4NiwxNyBAQAotIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgICBhY19zYWZlPWBlY2hvICJ0Y2xJbnQuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRjbEludC5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjI5NjogY2hlY2tpbmcgZm9yIHRjbEludC5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjQ5MDogY2hlY2tpbmcgZm9yIHRjbEludC5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDYzMDEgImNvbmZpZ3VyZSIKLSsjbGluZSA2NDk1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHRjbEludC5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MzA2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjUwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC02MzYyLDcgKzY1NTYsNyBAQAotICMKLSBub190az10cnVlCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRrIHByaXZhdGUgaGVhZGVycyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYzNjY6IGNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NTYwOiBjaGVja2luZyBmb3IgVGsgcHJpdmF0ZSBoZWFkZXJzIiA+JjUKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRraW5jbHVkZSBvciAtLXdpdGhvdXQtdGtpbmNsdWRlIHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfdGtpbmNsdWRlK3NldH0iID0gc2V0OyB0aGVuCi0gICB3aXRodmFsPSIkd2l0aF90a2luY2x1ZGUiCi1AQCAtNjQyOCwxNyArNjYyMiwxNyBAQAotIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotICAgIGFjX3NhZmU9YGVjaG8gInRrLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0ay5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjQzMjogY2hlY2tpbmcgZm9yIHRrLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NjI2OiBjaGVja2luZyBmb3IgdGsuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2NDM3ICJjb25maWd1cmUiCi0rI2xpbmUgNjYzMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDx0ay5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjYzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC02NDg0LDcgKzY2NzgsNyBAQAotIAotIAkgICAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSXRjbCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2NDg4OiBjaGVja2luZyBmb3IgSXRjbCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NjgyOiBjaGVja2luZyBmb3IgSXRjbCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCi0gICBmb3IgaSBpbiAke3NyY2Rpcn0vLi4vaXRjbCAke3NyY2Rpcn0vLi4vLi4vaXRjbCAke3NyY2Rpcn0vLi4vLi4vLi4vaXRjbCAke3NyY2Rpcn0vLi4vaXRjbC9pdGNsOyBkbwotICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvaXRjbC5oIDsgdGhlbgotQEAgLTY1MDcsNyArNjcwMSw3IEBACi0gCi0gCSAgIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJdGsgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjUxMTogY2hlY2tpbmcgZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NzA1OiBjaGVja2luZyBmb3IgSXRrIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0gaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtofSIgPSB4IDsgdGhlbgotICAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrOyBkbwotICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvaXRrLmggOyB0aGVuCi1AQCAtNjUzMCw3ICs2NzI0LDcgQEAKLSAKLSAJICAgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2NTM0OiBjaGVja2luZyBmb3IgVGl4IHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY3Mjg6IGNoZWNraW5nIGZvciBUaXggcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLSBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICBmb3IgaSBpbiAke3NyY2Rpcn0vLi4vdGl4ICR7c3JjZGlyfS8uLi8uLi90aXggJHtzcmNkaXJ9Ly4uLy4uLy4uL3RpeCA7IGRvCi0gICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLUBAIC02NTY4LDcgKzY3NjIsNyBAQAotIGZpCi0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSXRjbCBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjU3MjogY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY3NjY6IGNoZWNraW5nIGZvciBJdGNsIGNvbmZpZ3VyYXRpb24iID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaXRjbGNvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC02NjgwLDcgKzY4NzQsNyBAQAotIGZpCi0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSXRrIGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2Njg0OiBjaGVja2luZyBmb3IgSXRrIGNvbmZpZ3VyYXRpb24iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2ODc4OiBjaGVja2luZyBmb3IgSXRrIGNvbmZpZ3VyYXRpb24iID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaXRrY29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTY3OTIsNyArNjk4Niw3IEBACi0gZmkKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUaXggY29uZmlndXJhdGlvbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY3OTY6IGNoZWNraW5nIGZvciBUaXggY29uZmlndXJhdGlvbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY5OTA6IGNoZWNraW5nIGZvciBUaXggY29uZmlndXJhdGlvbiIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY190aXhjb25maWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNjkzMSw3ICs3MTI1LDcgQEAKLSAjIFVzZXMgYWNfIHZhcnMgYXMgdGVtcHMgdG8gYWxsb3cgY29tbWFuZCBsaW5lIHRvIG92ZXJyaWRlIGNhY2hlIGFuZCBjaGVja3MuCi0gIyAtLXdpdGhvdXQteCBvdmVycmlkZXMgZXZlcnl0aGluZyBlbHNlLCBidXQgZG9lcyBub3QgdG91Y2ggdGhlIGNhY2hlLgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjkzNTogY2hlY2tpbmcgZm9yIFgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MTI5OiBjaGVja2luZyBmb3IgWCIgPiY1Ci0gCi0gIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IG9yIC0td2l0aG91dC14IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbgotQEAgLTY5OTMsMTIgKzcxODcsMTIgQEAKLSAKLSAgICMgRmlyc3QsIHRyeSB1c2luZyB0aGF0IGZpbGUgd2l0aCBubyBzcGVjaWFsIGRpcmVjdG9yeSBzcGVjaWZpZWQuCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY5OTcgImNvbmZpZ3VyZSIKLSsjbGluZSA3MTkxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCR4X2RpcmVjdF90ZXN0X2luY2x1ZGU+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjcwMDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTcwNjcsMTQgKzcyNjEsMTQgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gICBMSUJTPSItbCR4X2RpcmVjdF90ZXN0X2xpYnJhcnkgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDcwNzEgImNvbmZpZ3VyZSIKLSsjbGluZSA3MjY1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci0gJHt4X2RpcmVjdF90ZXN0X2Z1bmN0aW9ufSgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MjcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0gIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCi1AQCAtNzM1Niw3ICs3NTUwLDcgQEAKLSBsaW5rcz0iJHtsaW5rc30gbm0uaCIKLSBmaQotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3MzYwOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLStlY2hvICJjb25maWd1cmU6NzU1NDogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC03MzgwLDEyICs3NTc0LDEyIEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjczODQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NTc4OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDczODkgImNvbmZpZ3VyZSIKLSsjbGluZSA3NTgzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtNzM5Niw3ICs3NTkwLDcgQEAKLSByZXR1cm4gX19DWUdXSU5fXzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NTk0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jeWd3aW49eWVzCi0gZWxzZQotQEAgLTc0MTMsMTkgKzc2MDcsMTkgQEAKLSBDWUdXSU49Ci0gdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzQxNzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NjExOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNzQyMiAiY29uZmlndXJlIgotKyNsaW5lIDc2MTYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSByZXR1cm4gX19NSU5HVzMyX187Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzQyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzYyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfbWluZ3czMj15ZXMKLSBlbHNlCi1AQCAtNzQ0NCw3ICs3NjM4LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3NDQ4OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NjQyOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNzQ1NCwxMCArNzY0OCwxMCBAQAotICAgcm0gLWYgY29uZnRlc3QqCi0gICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2N2X2V4ZWV4dD0KLS0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzQ1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NjUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSsgICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKLSAgICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgIGVzYWMKLSAgICAgZG9uZQotQEAgLTc2MTUsNiArNzgwOSw5IEBACi0gcyVATUFJTlRAJSRNQUlOVCVnCi0gcyVAQ0NAJSRDQyVnCi0gcyVAQ1BQQCUkQ1BQJWcKLStzJUBESVJfYWlmQCUkRElSX2FpZiVnCi0rcyVASU5DTFVERV9haWZAJSRJTkNMVURFX2FpZiVnCi0rcyVATElCX2FpZkAlJExJQl9haWYlZwotIHMlQGhvc3RAJSRob3N0JWcKLSBzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi0gcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2dkYi01LjIucGF0Y2ggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2dkYi01LjIucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTk2YjYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvcGF0Y2hlcy9nZGItNS4yLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNDkyOSArMCwwIEBACi0tLS0gL2Rldi9udWxsCVdlZCBBcHIgIDIgMjA6MzQ6MjggMjAwMwotKysrIGdkYi01LjIvZ2RiL2FpZi12YWxwcmludC5jCVdlZCBBcHIgIDIgMjE6MDI6NTEgMjAwMwotQEAgLTAsMCArMSwxMTM1IEBACi0rLyogU3VwcG9ydCBmb3IgcHJpbnRpbmcgQyBhbmQgQysrIHR5cGVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0rICAgQ29weXJpZ2h0IDE5ODYsIDE5ODgsIDE5ODksIDE5OTEsIDE5OTMtMTk5NiwgMTk5OC0yMDAwCi0rICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rCi0rICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotKwotKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rCi0rICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0rICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsKLSsgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLSsKLSsjaW5jbHVkZSAiZGVmcy5oIgotKyNpbmNsdWRlICJvYnN0YWNrLmgiCi0rI2luY2x1ZGUgImJmZC5oIgkJLyogQmluYXJ5IEZpbGUgRGVzY3JpcHRpb24gKi8KLSsjaW5jbHVkZSAic3ltdGFiLmgiCi0rI2luY2x1ZGUgImdkYnR5cGVzLmgiCi0rI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSsjaW5jbHVkZSAidmFsdWUuaCIKLSsjaW5jbHVkZSAidmFscHJpbnQuaCIKLSsjaW5jbHVkZSAiZ2RiY29yZS5oIgotKyNpbmNsdWRlICJ0YXJnZXQuaCIKLSsjaW5jbHVkZSAiY29tbWFuZC5oIgotKyNpbmNsdWRlICJnZGJjbWQuaCIKLSsjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSsjaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSsjaW5jbHVkZSAiYy1sYW5nLmgiCi0rI2luY2x1ZGUgInR5cGVwcmludC5oIgotKyNpbmNsdWRlICJ1aS1maWxlLmgiCi0rCi0rI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSsjaW5jbHVkZSAiYWlmLmgiCi0rI2luY2x1ZGUgPGVycm5vLmg+Ci0rI2luY2x1ZGUgPGN0eXBlLmg+Ci0rdm9pZCBtZW1fZmlsZV9kZWxldGUgKHN0cnVjdCB1aV9maWxlICpmaWxlKTsKLSsKLStpbnQgY2hlY2tfdmFsdWUoc3RydWN0IHR5cGUgKiwgQ09SRV9BRERSLCBzdHJ1Y3QgdmFsdWUgKiopOwotKwotKy8qIGRlZmluZWQgaW4gdmFscHJpbnQuYzogKi8KLStleHRlcm4gaW50IHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sIGludCAqZXJybm9wdHIpOwotKwotKwwKLSsvKiB0aGUgZm9sbG93aW5nIGNvbWVzIGZyb20gdGhlIGFpZiBsaWJyYXJ5LCBjb252LmMsIHdyaXR0ZW4gYnkgR3JlZy4gKi8KLSsKLSsjaWYgZGVmaW5lZChXSU5ET1dTTlQpCi0rI2RlZmluZSBCSVRTUEVSQllURQk4Ci0rI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCi0rI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotKyNkZWZpbmUgQklUU1BFUkJZVEUgICAgIE5CQlkKLSsjZWxzZSAvKiAhV0lORE9XU05UICYmICFfX0FQUExFXyAqLwotKyNpbmNsdWRlIDx2YWx1ZXMuaD4KLSsjZW5kaWYKLSsKLSt1bmlvbiBpZWVlX2RvdWJsZQotK3sKLSsJRE9VQkxFU1QJZDsKLSsJY2hhcgkJY1tzaXplb2YoRE9VQkxFU1QpXTsKLSt9OwotKwotKwwKLSsvKiBGb3IgbGlua2VkIGRhdGEgc3RydWN0dXJlcywgd2UgY2hlY2sgZm9yIGNpcmN1bGFyaXR5IGJ5IHJlY29yZGluZyB0aGUgdmFsdWVzCi0rICogb2YgYWxsIHBvaW50ZXJzIGFuZCB0eXBlcyB3ZSBzZWUuICBJbiBhIGxhdGVyIHBhc3MsIHdlIGVtaXQgYSBuYW1lIG9uIHRob3NlCi0rICogdHlwZXMgYW5kIGFuIG9mZnNldCBmb3IgdGhvc2UgdmFsdWVzCi0rICogdGhhdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuICovCi0rc3RydWN0IHZhbHVlX2luZm8gewotKyAgQ09SRV9BRERSIGFkZHI7Ci0rICBpbnQgdXNlZDsgLyogMDogYXBwZWFycywgbm90IHBvaW50ZWQgdG8uICAxOiBpcyBwb2ludGVkIHRvLiAgMjogdmFsdWUgaGFzIGJlZW4KLSsgICAgZW1pdHRlZCAqLwotK307Ci0rc3RydWN0IHR5cGVfaW5mbyB7Ci0rICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSsgIGludCB1c2VkOyAvKiAwOiBhcHBlYXJzLCBub3QgcG9pbnRlZCB0by4gIDE6IGlzIHBvaW50ZWQgdG8uICAyOiBuYW1lIGhhcyBiZWVuCi0rICAgIGVtaXR0ZWQgKi8KLSt9OwotKwotKyNkZWZpbmUgTUFYX1ZBTFVFU19TRUVOIDEwMDAKLSsJLyogaG9wZSB0aGF0IHRoZSBzdHJ1Y3R1cmUgZG9lc24ndCBoYXZlIG1vcmUgZGlzdGluY3QgcG9pbnRlciB2YWx1ZXMgKi8KLStzdHJ1Y3QgdmFsdWVfaW5mbyB2YWx1ZXNTZWVuW01BWF9WQUxVRVNfU0VFTisxXTsgLyogZXh0cmEgc3BhY2UgZm9yCi0rICBwc2V1ZG8tZGF0YSAqLwotK2ludCBudW1WYWx1ZXNTZWVuOwotKyNkZWZpbmUgTUFYX1RZUEVTX1NFRU4gMTAwCi0rCS8qIGhvcGUgdGhhdCB0aGUgc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBtb3JlIGRpc3RpbmN0IHR5cGVzIHZhbHVlcyAqLwotK3N0cnVjdCB0eXBlX2luZm8gdHlwZXNTZWVuW01BWF9UWVBFU19TRUVOKzFdOyAvKiBleHRyYSBzcGFjZSBmb3IKLSsgIHBzZXVkby1kYXRhICovCi0raW50IG51bVR5cGVzU2VlbjsKLSsKLSt0eXBlZGVmIGVudW0ge2RvVHlwZSwgZG9WYWx1ZX0gZG9XaGF0OwotKwotK3N0cnVjdCBzdHJfdHlwZQotK3sKLSsJaW50CWJsZW47Ci0rCWludAlzbGVuOwotKwlpbnQJZW5kOwotKwljaGFyICoJYnVmOwotK307Ci0rCi0rdHlwZWRlZiBzdHJ1Y3Qgc3RyX3R5cGUgKglzdHJfcHRyOwotKwotK3N0cl9wdHIgc3RyX2luaXQodm9pZCk7Ci0rdm9pZCBzdHJfYWRkKHN0cl9wdHIsIGNoYXIgKik7Ci0rdm9pZCBzdHJfZnJlZShzdHJfcHRyKTsKLStjaGFyICpzdHJfdmFsKHN0cl9wdHIpOwotK3N0cl9wdHIgc3RyX2R1cChjaGFyICopOwotKwotKy8qIGZpbGwgaW4gdGhlIHZhbHVlc1NlZW4gYXJyYXkgd2l0aCBhbGwgdGhlIHBvaW50ZXIgdmFsdWVzIHdlIHNlZSAqLwotK3ZvaWQKLSthaWZfZGlzY292ZXIoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIGRvV2hhdCB3aGF0KQotK3sKLSsgIGludCB2YWx1ZXNTZWVuSW5kZXg7Ci0rICBzdHJ1Y3QgdHlwZSAqZWx0dHlwZTsKLSsgIHVuc2lnbmVkIGludCBlbHRsZW4sIG9mZnNldDsKLSsgIENPUkVfQUREUiBhZGRyOwotKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQotKyAgICB7Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1RZUEVERUY6Ci0rICAgICAgYWlmX2Rpc2NvdmVyKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCB2YWxhZGRyLCB3aGF0KTsKLSsgICAgICBicmVhazsKLSsKLSsgICAgY2FzZSBUWVBFX0NPREVfUFRSOgotKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6Ci0rICAgICAgaWYgKHdoYXQgPT0gZG9WYWx1ZSkKLSsgICAgICB7IC8qIGxvb2tpbmcgZm9yIHZhbHVlcyAqLwotKwlzdHJ1Y3QgdmFsdWUgKmRlcmVmX3ZhbDsKLSsJYWRkciA9IHVucGFja19wb2ludGVyICh0eXBlLCB2YWxhZGRyKTsKLSsJaWYgKGFkZHIgPT0gMCkgYnJlYWs7Ci0rCWVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rCWlmIChUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1BUUiAmJgotKwkgIFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfUkVGICYmCi0rCSAgVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCi0rCSAgYnJlYWs7IC8qIG5vIG5lZWQgdG8gcmVtZW1iZXIgcG9pbnRlcnMgbm90IGxlYWRpbmcgdG8gY3ljbGVzICovCi0rCWZvciAodmFsdWVzU2VlbkluZGV4ID0gMDsgdmFsdWVzU2VlbkluZGV4IDwgbnVtVmFsdWVzU2VlbjsKLSsJdmFsdWVzU2VlbkluZGV4KyspCi0rCXsKLSsJICBpZiAoYWRkciA9PSB2YWx1ZXNTZWVuW3ZhbHVlc1NlZW5JbmRleF0uYWRkcikKLSsJICB7Ci0rCSAgICB2YWx1ZXNTZWVuW3ZhbHVlc1NlZW5JbmRleF0udXNlZCA9IDE7IC8qIGZvdW5kIGEgY2lyY3VsYXJpdHkgKi8KLSsJICAgIHJldHVybjsKLSsJICB9Ci0rCX0KLSsJaWYgKG51bVZhbHVlc1NlZW4gPCBNQVhfVkFMVUVTX1NFRU4pCi0rCSAgewotKwkgICAgdmFsdWVzU2VlbltudW1WYWx1ZXNTZWVuXS5hZGRyID0gYWRkcjsKLSsJICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0udXNlZCA9IDA7Ci0rCSAgICBudW1WYWx1ZXNTZWVuICs9IDE7Ci0rCSAgfQotKwkvKgotKwkqKiBDaGVjayBhZGRyIGlzIHZhbGlkIQotKwkqLwotKwlpZiAoIGNoZWNrX3ZhbHVlKGVsdHR5cGUsIGFkZHIsICZkZXJlZl92YWwpICkKLSsJCWFpZl9kaXNjb3ZlcihlbHR0eXBlLCBWQUxVRV9DT05URU5UUyAoZGVyZWZfdmFsKSwgd2hhdCk7Ci0rCWJyZWFrOwotKyAgICAgIH0gZWxzZSB7Ci0rCS8qIGxvb2tpbmcgZm9yIHR5cGVzICovCi0rCWludCB0eXBlc1NlZW5JbmRleDsKLSsJZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKLSsJaWYgKFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfUFRSICYmCi0rCSAgVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9SRUYgJiYKLSsJICBUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVCkKLSsJICBicmVhazsgLyogbm8gbmVlZCB0byByZW1lbWJlciBwb2ludGVycyBub3QgbGVhZGluZyB0byBjeWNsZXMgKi8KLSsJZm9yICh0eXBlc1NlZW5JbmRleCA9IDA7IHR5cGVzU2VlbkluZGV4IDwgbnVtVHlwZXNTZWVuOwotKwl0eXBlc1NlZW5JbmRleCsrKQotKwl7Ci0rCSAgaWYgKGVsdHR5cGUgPT0gdHlwZXNTZWVuW3R5cGVzU2VlbkluZGV4XS50eXBlKQotKwkgIHsKLSsJICAgIHR5cGVzU2Vlblt0eXBlc1NlZW5JbmRleF0udXNlZCA9IDE7IC8qIGZvdW5kIGEgY2lyY3VsYXJpdHkgKi8KLSsJICAgIHJldHVybjsKLSsJICB9Ci0rCX0KLSsJaWYgKG51bVR5cGVzU2VlbiA8IE1BWF9UWVBFU19TRUVOKQotKwkgIHsKLSsJICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnR5cGUgPSBlbHR0eXBlOwotKwkgICAgdHlwZXNTZWVuW251bVR5cGVzU2Vlbl0udXNlZCA9IDA7Ci0rCSAgICBudW1UeXBlc1NlZW4gKz0gMTsKLSsJICB9Ci0rCWFpZl9kaXNjb3ZlcihlbHR0eXBlLCAwLCB3aGF0KTsKLSsJYnJlYWs7Ci0rICAgICAgfSAvKiBkaXNjb3ZlciB0eXBlcyAqLwotKwotKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgotKyAgICAgIHsgLyogZGlzY292ZXIgZWl0aGVyIHZhbHVlcyBvciB0eXBlcyAqLwotKwlpbnQgaTsKLSsgICAgICAJc3RydWN0IGZpZWxkICp0aGlzRmllbGQ7Ci0rCXN0cnVjdCB0eXBlICpmdHlwZTsKLSsJc3RydWN0IHZhbHVlICp2OwotKwotKwlmb3IgKCBpID0gMDsgaSA8IFRZUEVfTkZJRUxEUyh0eXBlKTsgaSsrICkKLSsJewotKwkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJY29udGludWU7Ci0rCi0rCQlpZiAoIHdoYXQgPT0gZG9UeXBlICkKLSsJCXsKLSsJCQlhaWZfZGlzY292ZXIoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLCAwLCB3aGF0KTsKLSsJCQljb250aW51ZTsKLSsJCX0KLSsKLSsJCWlmIAotKwkJKAotKwkJCSFUWVBFX0ZJRUxEX1NUQVRJQyh0eXBlLCBpKSAKLSsJCQkmJiAKLSsJCQlUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKQotKwkJKQotKwkJewotKwkJCXYgPSB2YWx1ZV9mcm9tX2xvbmdlc3QoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLAotKwkJCQl1bnBhY2tfZmllbGRfYXNfbG9uZyAodHlwZSwgdmFsYWRkciwgaSkpOwotKwotKwkJCWFpZl9kaXNjb3ZlcihUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCBWQUxVRV9DT05URU5UUyh2KSwgd2hhdCk7Ci0rCQl9Ci0rCQllbHNlIGlmICggVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpICkKLSsJCXsKLSsJCQl2ID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpKTsKLSsKLSsJCQlpZiAoIHYgPT0gTlVMTCApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCS8qCi0rCQkJWFhYCi0rCQkJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCB2LAotKwkJCXN0cmVhbSwgZm9ybWF0LCByZWN1cnNlICsgMSwKLSsJCQlwcmV0dHkpOwotKwkJCSovCi0rCQl9Ci0rCQllbHNlCi0rCQl7Ci0rCQkJYWlmX2Rpc2NvdmVyKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpKSwgdmFsYWRkciArIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSAvIDgsIHdoYXQpOwotKwkJfQotKwkgIH0KLSsgICAgICB9Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKyAgICAgIGVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rICAgICAgaWYgKHdoYXQgPT0gZG9WYWx1ZSkKLSsgICAgICB7IC8qIGxvb2tpbmcgZm9yIHZhbHVlcyAqLwotKwl1bnNpZ25lZCBpbnQgdGVtcF9sZW4sIGxlbjsKLSsJZWx0bGVuID0gVFlQRV9MRU5HVEggKGVsdHR5cGUpOwotKwlsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSkgLyBlbHRsZW47Ci0rCW9mZnNldCA9IDA7Ci0rCWZvciAodGVtcF9sZW4gPSAwOyB0ZW1wX2xlbiA8IGxlbjsgdGVtcF9sZW4rKykKLSsJICB7Ci0rCSAgICBhaWZfZGlzY292ZXIoZWx0dHlwZSwgdmFsYWRkcitvZmZzZXQsIHdoYXQpOwotKwkgICAgb2Zmc2V0ICs9IGVsdGxlbjsKLSsJICB9Ci0rICAgICAgfSBlbHNlIHsgLyogbG9va2luZyBmb3IgdHlwZXMgKi8KLSsJYWlmX2Rpc2NvdmVyKGVsdHR5cGUsIDAsIHdoYXQpOwotKyAgICAgIH0gLyogVFlQRV9DT0RFX0FSUkFZICovCi0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKLSsgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgotKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgotKyAgICBjYXNlIFRZUEVfQ09ERV9VTkRFRjoKLSsgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKLSsgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKLSsgICAgY2FzZSBUWVBFX0NPREVfSU5UOgotKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1ZPSUQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgotKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgotKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJJTkc6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKLSsgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKLSsgICAgY2FzZSBUWVBFX0NPREVfVEVNUExBVEU6Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGRlZmF1bHQ6Ci0rICAgICAgZXJyb3IgKCJ0eXBlIG5vdCBoYW5kbGVkIGluIHR5cGVfZGlzY292ZXIiKTsKLSsgICAgICBicmVhazsKLSsgICAgfSAvKiBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpICovCi0rfSAvKiBhaWZfZGlzY292ZXIgKi8KLSsKLSsvKiBzcXVhc2ggdGhlIHZhbHVlc1NlZW4gYW5kIHR5cGVzU2VlbiBhcnJheXMgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGVsZW1lbnRzICovCi0rdm9pZCAKLSthaWZfcmVkdWNlKHZvaWQpCi0rewotKyAgaW50IGZyb250LCBiYWNrOwotKyAgZnJvbnQgPSBiYWNrID0gMDsKLSsgIHdoaWxlIChmcm9udCA8IG51bVZhbHVlc1NlZW4pCi0rICAgIHsKLSsgICAgICAvKiBtb3ZlIGJhY2sgdG8gZmlyc3QgdW51c2VkIGVudHJ5ICovCi0rICAgICAgdmFsdWVzU2VlbltudW1WYWx1ZXNTZWVuXS51c2VkID0gMDsgLyogcHNldWRvLWRhdGEgKi8KLSsgICAgICB3aGlsZSAodmFsdWVzU2VlbltiYWNrXS51c2VkKSBiYWNrICs9IDE7Ci0rICAgICAgaWYgKGJhY2sgPT0gbnVtVmFsdWVzU2VlbikgYnJlYWs7Ci0rICAgICAgLyogbW92ZSBmcm9udCB0byBmaXJzdCB1c2VkIGVudHJ5IGJleW9uZCBiYWNrICovCi0rICAgICAgaWYgKGZyb250IDw9IGJhY2spIGZyb250ID0gYmFjaysxOwotKyAgICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0udXNlZCA9IDE7IC8qIHBzZXVkby1kYXRhICovCi0rICAgICAgd2hpbGUgKCF2YWx1ZXNTZWVuW2Zyb250XS51c2VkKSBmcm9udCArPSAxOwotKyAgICAgIGlmIChmcm9udCA9PSBudW1WYWx1ZXNTZWVuKSBicmVhazsKLSsgICAgICAvKiBjb3B5IGZyb20gZnJvbnQgdG8gYmFjayAqLwotKyAgICAgIHZhbHVlc1NlZW5bYmFja10gPSB2YWx1ZXNTZWVuW2Zyb250XTsKLSsgICAgICB2YWx1ZXNTZWVuW2Zyb250XS51c2VkID0gMDsKLSsgICAgfQotKyAgbnVtVmFsdWVzU2VlbiA9IGJhY2s7Ci0rICBmcm9udCA9IGJhY2sgPSAwOwotKyAgd2hpbGUgKGZyb250IDwgbnVtVHlwZXNTZWVuKQotKyAgICB7Ci0rICAgICAgLyogbW92ZSBiYWNrIHRvIGZpcnN0IHVudXNlZCBlbnRyeSAqLwotKyAgICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnVzZWQgPSAwOyAvKiBwc2V1ZG8tZGF0YSAqLwotKyAgICAgIHdoaWxlICh0eXBlc1NlZW5bYmFja10udXNlZCkgYmFjayArPSAxOwotKyAgICAgIGlmIChiYWNrID09IG51bVR5cGVzU2VlbikgYnJlYWs7Ci0rICAgICAgLyogbW92ZSBmcm9udCB0byBmaXJzdCB1c2VkIGVudHJ5IGJleW9uZCBiYWNrICovCi0rICAgICAgaWYgKGZyb250IDw9IGJhY2spIGZyb250ID0gYmFjaysxOwotKyAgICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnVzZWQgPSAxOyAvKiBwc2V1ZG8tZGF0YSAqLwotKyAgICAgIHdoaWxlICghdHlwZXNTZWVuW2Zyb250XS51c2VkKSBmcm9udCArPSAxOwotKyAgICAgIGlmIChmcm9udCA9PSBudW1UeXBlc1NlZW4pIGJyZWFrOwotKyAgICAgIC8qIGNvcHkgZnJvbSBmcm9udCB0byBiYWNrICovCi0rICAgICAgdHlwZXNTZWVuW2JhY2tdID0gdHlwZXNTZWVuW2Zyb250XTsKLSsgICAgICB0eXBlc1NlZW5bZnJvbnRdLnVzZWQgPSAwOwotKyAgICB9Ci0rICAgIG51bVR5cGVzU2VlbiA9IGJhY2s7Ci0rfSAvKiBhaWZfcmVkdWNlICovCi0rCi0raW50IGRhdGFTdHJlYW1Qb3M7Ci0rCi0rdm9pZCAKLStlbWl0RGF0YShjaGFyIHRvRW1pdCwgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rICBmcHJpbnRmX2ZpbHRlcmVkKHN0cmVhbSwgIiUwMngiLCB0b0VtaXQgJiAweGZmKTsKLSsgIGRhdGFTdHJlYW1Qb3MgKz0gMTsKLSt9IC8qIGVtaXREYXRhICovCi0rICAKLSt2b2lkCi0rYWlmX2VtaXRfc3RyaW5nKENPUkVfQUREUiBhZGRyLCBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtKQotK3sgLyogY29kZSBtb2RpZmllZCBmcm9tIHZhbF9wcmludF9zdHJpbmcgKCkgKi8KLSsgIGludCBlcnJjb2RlOwkJCS8qIEVycm5vIHJldHVybmVkIGZyb20gYmFkIHJlYWRzLiAqLwotKyAgdW5zaWduZWQgaW50IGZldGNobGltaXQ7CS8qIE1heGltdW0gbnVtYmVyIG9mIGNoYXJzIHRvIHByaW50LiAqLwotKyAgdW5zaWduZWQgaW50IG5mZXRjaDsJCS8qIENoYXJzIHRvIGZldGNoIC8gY2hhcnMgZmV0Y2hlZC4gKi8KLSsgIHVuc2lnbmVkIGludCBjaHVua3NpemU7CS8qIFNpemUgb2YgZWFjaCBmZXRjaCwgaW4gY2hhcnMuICovCi0rICBjaGFyICpidWZmZXIgPSBOVUxMOwkJLyogRHluYW1pY2FsbHkgZ3Jvd2FibGUgZmV0Y2ggYnVmZmVyLiAqLwotKyAgY2hhciAqYnVmcHRyOwkJCS8qIFBvaW50ZXIgdG8gbmV4dCBhdmFpbGFibGUgYnl0ZSBpbiBidWZmZXIuICovCi0rICBjaGFyICpsaW1pdDsJCQkvKiBGaXJzdCBsb2NhdGlvbiBwYXN0IGVuZCBvZiBmZXRjaCBidWZmZXIuICovCi0rICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gTlVMTDsJLyogVG9wIG9mIHRoZSBvbGQgY2xlYW51cCBjaGFpbi4gKi8KLSsgIGludCBmb3VuZF9udWw7CQkvKiBOb24temVybyBpZiB3ZSBmb3VuZCB0aGUgbnVsIGNoYXIgKi8KLSsgIHVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IDA7Ci0rICBpbnQgbGVuZ3RoOwkJCS8qIGhvdyBsb25nIHRoZSBzdHJpbmcgdHVybmVkIG91dCB0byBiZSAqLwotKwotKyAgaWYgKGFkZHIgPT0gMCkKLSsgIHsKLSsgICAgICBlbWl0RGF0YSgwLCBzdHJlYW0pOwotKyAgICAgIGVtaXREYXRhKDAsIHN0cmVhbSk7Ci0rICAgICAgcmV0dXJuOwotKyAgfQotKwotKyAgZmV0Y2hsaW1pdCA9IHByaW50X21heDsKLSsgIGNodW5rc2l6ZSA9IG1pbiAoOCwgZmV0Y2hsaW1pdCk7Ci0rICAvKiBMb29wIHVudGlsIHdlIGVpdGhlciBoYXZlIGFsbCB0aGUgY2hhcmFjdGVycyB0byBwcmludCwgb3Igd2UgZW5jb3VudGVyCi0rICAgICBzb21lIGVycm9yLCBzdWNoIGFzIGJ1bXBpbmcgaW50byB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAqLwotKyAgZm91bmRfbnVsID0gMDsKLSsgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAobnVsbF9jbGVhbnVwLCAwKTsKLSsgIGRvCi0rICAgIHsKLSsgICAgICBRVUlUOwotKyAgICAgIG5mZXRjaCA9IG1pbiAoY2h1bmtzaXplLCBmZXRjaGxpbWl0IC0gYnVmc2l6ZSk7Ci0rICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotKwlidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChuZmV0Y2gpOwotKyAgICAgIGVsc2UKLSsJewotKwkgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7Ci0rCSAgYnVmZmVyID0gKGNoYXIgKikgeHJlYWxsb2MgKGJ1ZmZlciwgbmZldGNoICsgYnVmc2l6ZSk7Ci0rCX0KLSsgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGJ1ZmZlcik7Ci0rICAgICAgYnVmcHRyID0gYnVmZmVyICsgYnVmc2l6ZTsKLSsgICAgICBidWZzaXplICs9IG5mZXRjaDsKLSsgICAgICAvKiBSZWFkIGFzIG11Y2ggYXMgd2UgY2FuLiAqLwotKyAgICAgIG5mZXRjaCA9IHBhcnRpYWxfbWVtb3J5X3JlYWQgKGFkZHIsIGJ1ZnB0ciwgbmZldGNoLCAmZXJyY29kZSk7Ci0rICAgICAgLyogU2NhbiB0aGlzIGNodW5rIGZvciB0aGUgbnVsbCBieXRlICovCi0rICAgICAgbGltaXQgPSBidWZwdHIgKyBuZmV0Y2g7Ci0rICAgICAgd2hpbGUgKGJ1ZnB0ciA8IGxpbWl0KQotKwl7Ci0rCSAgdW5zaWduZWQgbG9uZyBjOwotKwkgIGMgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZnB0ciwgMSk7Ci0rCSAgYWRkciArPSAxOwotKwkgIGJ1ZnB0ciArPSAxOwotKwkgIGlmIChjID09IDApCi0rCSAgICB7Ci0rCSAgICAgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgYW55IGVycm9yIHdoaWNoIGhhcHBlbmVkIGFmdGVyCi0rCQkgIHRoZSBOVUxMIHRlcm1pbmF0b3IuICAqLwotKwkgICAgICBlcnJjb2RlID0gMDsKLSsJICAgICAgZm91bmRfbnVsID0gMTsKLSsJICAgICAgYnJlYWs7Ci0rCSAgICB9Ci0rCX0gLyogd2hpbGUgKGJ1ZnB0ciA8IGxpbWl0KSAqLwotKyAgICB9IC8qIGRvICovCi0rICB3aGlsZSAoZXJyY29kZSA9PSAwCS8qIG5vIGVycm9yICovCi0rCSAgJiYgYnVmcHRyIC0gYnVmZmVyIDwgZmV0Y2hsaW1pdAkvKiBubyBvdmVycnVuICovCi0rCSAgJiYgIWZvdW5kX251bCk7CS8qIGhhdmVuJ3QgZm91bmQgbnVsIHlldCAqLwotKyAgUVVJVDsKLSsgIGxlbmd0aCA9IDA7Ci0rICBpZiAoZXJyY29kZSA9PSAwIHx8IGJ1ZnB0ciA+IGJ1ZmZlcikKLSsgICAgewotKyAgICAgIGxlbmd0aCA9IGJ1ZnB0ciAtIGJ1ZmZlciAtIDE7IC8qIGRvbid0IGluY2x1ZGUgbnVsbCAqLwotKyAgICAgIGVtaXREYXRhKChsZW5ndGggPj4gOCkgJiAwNzcsIHN0cmVhbSk7Ci0rICAgICAgZW1pdERhdGEobGVuZ3RoICYgMDc3LCBzdHJlYW0pOwotKyAgICAgIGZvciAoOyBsZW5ndGggPiAwOyBsZW5ndGgtLSkgewotKwllbWl0RGF0YSgqYnVmZmVyKyssIHN0cmVhbSk7IAotKyAgICAgIH0KLSsgICAgfQotKyAgaWYgKGVycmNvZGUgIT0gMCkKLSsgICAgewotKyAgICAgIGlmIChlcnJjb2RlID09IEVJTykKLSsJewotKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiA8QWRkcmVzcyAiKTsKLSsJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7Ci0rCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIG91dCBvZiBib3VuZHM+Iik7Ci0rCX0KLSsgICAgICBlbHNlCi0rCXsKLSsJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPEVycm9yIHJlYWRpbmcgYWRkcmVzcyAiKTsKLSsJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7Ci0rCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiOiAlcz4iLCBzYWZlX3N0cmVycm9yIChlcnJjb2RlKSk7Ci0rCX0KLSsgICAgfQotKyAgZ2RiX2ZsdXNoIChzdHJlYW0pOwotKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Ci0rICByZXR1cm47Ci0rfSAvKiBhaWZfZW1pdF9zdHJpbmcgKi8KLSsKLStzdHJfcHRyCi0rZ2RiX3R5cGVfdG9fZmRzKHN0cnVjdCB0eXBlICp0eXBlKQotK3sKLSsJaW50CQlsZW47Ci0rCWludAkJZWxlbjsKLSsJaW50CQluZmllbGRzOwotKwlpbnQJCWk7Ci0rCWludAkJaXg7Ci0rCXN0cl9wdHIJCXM7Ci0rCXN0cl9wdHIJCXR5cGVfcHRyOwotKwlzdHJfcHRyCQl0eXBlX3N0cjsKLSsJc3RydWN0IHR5cGUgKglldHlwZTsKLSsKLSsJQ0hFQ0tfVFlQRURFRiAodHlwZSk7Ci0rCi0rCXR5cGVfc3RyID0gc3RyX2luaXQoKTsKLSsKLSsJZm9yICggaXggPSAwOyBpeCA8IG51bVR5cGVzU2VlbjsgaXgrKykKLSsJewotKwkJaWYgCi0rCQkoCi0rCQkJdHlwZXNTZWVuW2l4XS50eXBlICE9IHR5cGUKLSsJCQl8fAotKwkJCSF0eXBlc1NlZW5baXhdLnVzZWQKLSsJCSkKLSsJCQljb250aW51ZTsKLSsKLSsJCS8qCi0rCQkqKiBNdWx0aXBsZSB1c2UgdHlwZQotKwkJKi8KLSsKLSsJCWlmICggdHlwZXNTZWVuW2l4XS51c2VkICE9IDEgKQotKwkJewotKwkJCS8qIAotKwkJCSoqIHJlZmVycmluZyB0byBvbmUgYWxyZWFkeSBlbWl0dGVkIAotKwkJCSovCi0rCi0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9SRUZFUkVOQ0UsIGl4KSk7Ci0rCQkJcmV0dXJuIHR5cGVfc3RyOwotKwkJfQotKwotKwkJLyoKLSsJCSoqIGZpcnN0IHRpbWU7IGVtaXQgbmFtZQotKwkJKi8KLSsKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfTkFNRSwgaXgsIE5VTEwpKTsKLSsJCXR5cGVzU2VlbltpeF0udXNlZCA9IDI7Ci0rCQlicmVhazsKLSsJfQotKwotKwlsZW4gPSBUWVBFX0xFTkdUSCh0eXBlKTsKLSsKLSsJc3dpdGNoICggVFlQRV9DT0RFKHR5cGUpICkKLSsJewotKwljYXNlIFRZUEVfQ09ERV9UWVBFREVGOgotKwkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSk7Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBzdHJfdmFsKHR5cGVfcHRyKSk7Ci0rCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQlyZXR1cm4gdHlwZV9zdHI7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKwkJaWYgCi0rCQkoCi0rCQkJbGVuID4gMAotKwkJCSYmCi0rCQkJVFlQRV9MRU5HVEgoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSkgPiAwCi0rCQkpCi0rCQl7Ci0rCQkJZXR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKLSsJCQllbGVuID0gVFlQRV9MRU5HVEgoZXR5cGUpOwotKwkJCWxlbiAvPSBlbGVuOwotKwotKwkJCXR5cGVfcHRyID0gZ2RiX3R5cGVfdG9fZmRzKGV0eXBlKTsKLSsKLSsJCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0FSUkFZLCAKLSsJCQkJVHlwZVRvRkRTKEFJRl9SQU5HRSwgMCwgbGVuLTEsIAotKwkJCQkJVHlwZVRvRkRTKEFJRl9JTlRFR0VSLCAxLCBzaXplb2YoaW50KSkpLAotKwkJCQlzdHJfdmFsKHR5cGVfcHRyKSkpOwotKwotKwkJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBhIHBvaW50ZXIuLi4KLSsJCSovCi0rCi0rCWNhc2UgVFlQRV9DT0RFX1BUUjoKLSsJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsJCWVsZW4gPSBUWVBFX0xFTkdUSChldHlwZSk7Ci0rCi0rCQlpZiAKLSsJCSgKLSsJCQllbGVuID09IDEKLSsJCQkmJgotKwkJCVRZUEVfQ09ERShldHlwZSkgPT0gVFlQRV9DT0RFX0lOVAotKwkJKQotKwkJewotKwkJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfU1RSSU5HKSk7Ci0rCQl9Ci0rCQllbHNlCi0rCQl7Ci0rCQkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCXN0cl9hZGQodHlwZV9zdHIsIAotKwkJCQlUeXBlVG9GRFMoQUlGX1BPSU5URVIsIHN0cl92YWwodHlwZV9wdHIpKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJfQotKwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0lOVDoKLSsJCWlmCi0rCQkoCi0rCQkJbGVuICE9IDEKLSsJCQl8fAotKwkJCXN0cm5jbXAoVFlQRV9OQU1FKHR5cGUpLCAiY2hhciIsIDUpICE9IDAKLSsJCSkgCi0rCQl7Ci0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJCVR5cGVUb0ZEUyhBSUZfSU5URUdFUiwgVFlQRV9VTlNJR05FRCh0eXBlKSA/IDAgOiAxLCBsZW4pKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBjaGFyLi4uCi0rCQkqLwotKwotKwljYXNlIFRZUEVfQ09ERV9DSEFSOgotKwkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9DSEFSQUNURVIpKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0ZMT0FUSU5HLCBsZW4pKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOSU9OOgotKwkJbmZpZWxkcyA9IFRZUEVfTkZJRUxEUyh0eXBlKTsKLSsJCQotKwkJaWYgKCBIQVZFX0NQTFVTX1NUUlVDVCh0eXBlKSApCi0rCQkJaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyh0eXBlKTsKLSsJCWVsc2UKLSsJCQlpID0gMDsKLSsKLSsJCS8qCi0rCQkqKiBGaXJzdCBuZWVkIHRvIGNhbGN1bGF0ZSBzaXplIG9mIHN0cnVjdCwgc2luY2UgaXQKLSsJCSoqIG1heSBub3QgYmUgcGFja2VkLgotKwkJKi8KLSsKLSsJCWZvciAoIGxlbiA9IDAgOyBpIDwgbmZpZWxkcyA7IGkrKyApCi0rCQl7Ci0rCQkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaSkpOwotKwkJCWVsZW4gPSBUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKSA/Ci0rCQkJCQlUWVBFX0ZJRUxEX0JJVFNJWkUodHlwZSwgaSkgLyA4IDoKLSsJCQkJCVRZUEVfTEVOR1RIKGV0eXBlKTsKLSsKLSsJCQlpZiAoIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUICkKLSsJCQkJbGVuICs9IGVsZW47Ci0rCQkJZWxzZSBpZiAoIGVsZW4gPiBsZW4gKQotKwkJCQlsZW4gPSBlbGVuOwotKwkJfQotKwotKwkJdHlwZV9wdHIgPSBzdHJfZHVwKFR5cGVUb0ZEUyhBSUZfU1RSVUNUKSk7Ci0rCi0rCQkvKgotKwkJKiogTmVlZCB0byBjYWxjdWxhdGUgb2Zmc2V0IChsZW4pLgotKwkJKi8KLSsJCWxlbiA9IDA7Ci0rCi0rCQlpZiAoIEhBVkVfQ1BMVVNfU1RSVUNUKHR5cGUpICkKLSsJCQlpID0gVFlQRV9OX0JBU0VDTEFTU0VTKHR5cGUpOwotKwkJZWxzZQotKwkJCWkgPSAwOwotKwotKwkJZm9yICg7IGkgPCBuZmllbGRzIDsgaSsrICkKLSsJCXsKLSsJCQljaGFyICp0OwotKwotKwkJCWlmICggVFlQRV9GSUVMRF9JR05PUkUodHlwZSwgaSkgKQotKwkJCQljb250aW51ZTsKLSsKLSsJCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpKTsKLSsKLSsJCQllbGVuID0gVFlQRV9GSUVMRF9QQUNLRUQodHlwZSwgaSkgPwotKwkJCQlUWVBFX0ZJRUxEX0JJVFNJWkUodHlwZSwgaSkgOgotKwkJCQlUWVBFX0xFTkdUSChldHlwZSkgKiA4OwotKwotKwkJCXMgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCWlmICggSEFWRV9DUExVU19TVFJVQ1QodHlwZSkgKQotKwkJCXsKLSsJCQkJaWYgKCBUWVBFX0ZJRUxEX1BST1RFQ1RFRCh0eXBlLCBpKSApCi0rCQkJCQl0ID0gRkRTQWRkRmllbGRUb0NsYXNzKAotKwkJCQkJCXN0cl92YWwodHlwZV9wdHIpLAotKwkJCQkJICAgIAlBSUZBQ0NfUFJPVEVDVEVELCAKLSsJCQkJCSAgICAJVFlQRV9GSUVMRF9OQU1FKHR5cGUsIGkpLCAKLSsJCQkJCQlzdHJfdmFsKHMpKTsKLSsJCQkJZWxzZSBpZiAoIFRZUEVfRklFTERfUFJJVkFURSh0eXBlLCBpKSApCi0rCQkJCQl0ID0gRkRTQWRkRmllbGRUb0NsYXNzKAotKwkJCQkJCXN0cl92YWwgKHR5cGVfcHRyKSwgCi0rCQkJCQkJQUlGQUNDX1BSSVZBVEUsIAotKwkJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgCi0rCQkJCQkJc3RyX3ZhbChzKSk7Ci0rCQkJCWVsc2UKLSsJCQkJCXQgPSBGRFNBZGRGaWVsZFRvQ2xhc3MoCi0rCQkJCQkJc3RyX3ZhbCAodHlwZV9wdHIpLCAKLSsJCQkJCQlBSUZBQ0NfUFVCTElDLCAKLSsJCQkJCQlUWVBFX0ZJRUxEX05BTUUodHlwZSwgaSksIAotKwkJCQkJCXN0cl92YWwocykpOwotKwotKwkJCX0KLSsJCQllbHNlCi0rCQkJCXQgPSBGRFNBZGRGaWVsZFRvU3RydWN0KHN0cl92YWwodHlwZV9wdHIpLCAKLSsJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgc3RyX3ZhbChzKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJCQotKwkJCXR5cGVfcHRyID0gc3RyX2R1cCh0KTsKLSsKLSsJCQlzdHJfZnJlZShzKTsKLSsKLSsJCQkvKgotKwkJCSoqIENhbGMgb2Zmc2V0LgotKwkJCSovCi0rCQkJaWYgKCBUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCApCi0rCQkJCWxlbiArPSBlbGVuOwotKwkJfQotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgc3RyX3ZhbCh0eXBlX3B0cikpOwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX1ZPSUQ6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX1ZPSUQsIGxlbikpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCQluZmllbGRzID0gVFlQRV9ORklFTERTICh0eXBlKTsKLSsKLSsJCXR5cGVfcHRyID0gc3RyX2R1cChUeXBlVG9GRFMoQUlGX0VOVU0pKTsKLSsKLSsJCWZvciAoIGkgPSAwIDsgaSA8IG5maWVsZHMgOyBpKysgKQotKwkJewotKwkJCWNoYXIgKgl0OwotKwotKwkJCXQgPSBGRFNBZGRDb25zdFRvRW51bShzdHJfdmFsKHR5cGVfcHRyKSwKLSsJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwKLSsJCQkJCVRZUEVfRklFTERfQklUUE9TKHR5cGUsIGkpKTsKLSsKLSsJCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCi0rCQkJdHlwZV9wdHIgPSBzdHJfZHVwKHQpOwotKwkJfQotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgc3RyX3ZhbCh0eXBlX3B0cikpOwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0ZVTkM6Ci0rCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKwotKwkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJVHlwZVRvRkRTKEFJRl9GVU5DVElPTiwgc3RyX3ZhbCh0eXBlX3B0cikpKTsKLSsKLSsJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9TVFJJTkc6Ci0rCWNhc2UgVFlQRV9DT0RFX1NFVDoKLSsJY2FzZSBUWVBFX0NPREVfUkFOR0U6Ci0rCWNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKLSsJY2FzZSBUWVBFX0NPREVfTUVNQkVSOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1JFRjoKLSsJY2FzZSBUWVBFX0NPREVfQk9PTDoKLSsJY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfSU5WQUxJRCkpOwotKwkJYnJlYWs7Ci0rCi0rCWRlZmF1bHQ6Ci0rCQllcnJvcigiSW52YWxpZCBDL0MrKyB0eXBlIGNvZGUgJWQgaW4gc3ltYm9sIHRhYmxlLiIsIFRZUEVfQ09ERSh0eXBlKSk7Ci0rCX0KLSsKLSsJcmV0dXJuIHR5cGVfc3RyOwotK30KLSsKLSt2b2lkCi0rYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIENPUkVfQUREUiBhZGRyZXNzLCBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtKQotK3sKLSsJaW50CQkJaXg7Ci0rCWludAkJCXJlczsKLSsJaW50CQkJdmFsaWQ7Ci0rCXVuc2lnbmVkCQlsZW47Ci0rCXVuc2lnbmVkCQllbHRsZW47Ci0rCUxPTkdFU1QJCQl2YWw7Ci0rCWZsb2F0CQkJZnZhbDsKLSsJZG91YmxlCQkJZHZhbDsKLSsjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotKwlsb25nIGRvdWJsZQkJbGR2YWw7Ci0rI2VuZGlmIC8qIEhBVkVfTE9OR19ET1VCTEUgKi8KLSsJQ09SRV9BRERSCQlhZGRyOwotKwlzdHJ1Y3QgdmFsdWUgKgkJdnB0cjsKLSsJdW5pb24gaWVlZV9kb3VibGUJdjsKLSsJc3RydWN0IHR5cGUgKgkJZWx0dHlwZTsKLSsJc3RydWN0IGZpZWxkICoJCXRoaXNGaWVsZDsKLSsKLSsJQ0hFQ0tfVFlQRURFRih0eXBlKTsKLSsKLSsJc3dpdGNoICggVFlQRV9DT0RFKHR5cGUpICkKLSsJewotKwljYXNlIFRZUEVfQ09ERV9UWVBFREVGOgotKwkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSwgdmFsYWRkciwgYWRkcmVzcywgc3RyZWFtKTsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9BUlJBWToKLSsJCWVsdHR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUodHlwZSkpOwotKwotKwkJaWYgCi0rCQkoCi0rCQkJVFlQRV9MRU5HVEgodHlwZSkgPiAwCi0rCQkJJiYKLSsJCQlUWVBFX0xFTkdUSChUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKSA+IDAKLSsJCSkKLSsJCXsKLSsJCQllbHRsZW4gPSBUWVBFX0xFTkdUSChlbHR0eXBlKTsKLSsJCQlsZW4gPSBUWVBFX0xFTkdUSCh0eXBlKSAvIGVsdGxlbjsKLSsKLSsJCQlmb3IgKCBpeCA9IDA7IGl4IDwgbGVuOyBpeCsrICkKLSsJCQkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoZWx0dHlwZSwgdmFsYWRkciArIGl4ICogZWx0bGVuLCBhZGRyZXNzICsgaXggKiBlbHRsZW4sIHN0cmVhbSk7Ci0rCi0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQkvKgotKwkJKiogVHJlYXQgYXMgYSBwb2ludGVyLi4uCi0rCQkqLwotKwkJYWRkciA9IGFkZHJlc3M7Ci0rCQlnb3RvIGFzUHRyOwotKwotKwljYXNlIFRZUEVfQ09ERV9SRUY6Ci0rCWNhc2UgVFlQRV9DT0RFX1BUUjoKLSsJCWFkZHIgPSB1bnBhY2tfcG9pbnRlcih0eXBlLCB2YWxhZGRyKTsKLSsKLSsJYXNQdHI6Ci0rCQllbHR0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsKLSsJCWlmCi0rCQkoCi0rCQkJVFlQRV9MRU5HVEgoZWx0dHlwZSkgPT0gMQotKwkJCSYmIAotKwkJCVRZUEVfQ09ERShlbHR0eXBlKSA9PSBUWVBFX0NPREVfSU5UCi0rCQkpCi0rCQl7Ci0rCQkJLyoKLSsJCQkqKiBjYWxsIGl0IGEgc3RyaW5nCi0rCQkJKi8KLSsJCQkodm9pZClhaWZfZW1pdF9zdHJpbmcoYWRkciwgc3RyZWFtKTsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCWlmICggYWRkciA9PSAwICkKLSsJCXsKLSsJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05JTCwgc3RyZWFtKTsgCi0rCQkJYnJlYWs7Ci0rCQl9Ci0rCi0rCQlmb3IgKCBpeCA9IDAgOyBpeCA8IG51bVZhbHVlc1NlZW47IGl4KysgKQotKwkJewotKwkJCWlmCi0rCQkJKAotKwkJCQl2YWx1ZXNTZWVuW2l4XS5hZGRyID09IGFkZHIKLSsJCQkJJiYKLSsJCQkJdmFsdWVzU2VlbltpeF0udXNlZAotKwkJCSkKLSsJCQl7Ci0rCi0rCQkJCXVuaW9uIAotKwkJCQl7Ci0rCQkJCQlpbnQJaTsKLSsJCQkJCWNoYXIgCWJ5dGVzWzRdOwotKwkJCQl9IHB0cm5hbWU7Ci0rCi0rCQkJCWlmICggdmFsdWVzU2VlbltpeF0udXNlZCA9PSAxICkKLSsJCQkJewotKwkJCQkJLyogCi0rCQkJCQkqKiBmaXJzdCB0aW1lOyBqdXN0IGVtaXQgYXMgdXN1YWwKLSsJCQkJCSovCi0rCi0rCQkJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05BTUUsIHN0cmVhbSk7IAotKwkJCQkJdmFsdWVzU2VlbltpeF0udXNlZCA9IDI7Ci0rCi0rCQkJCQl7Ci0rCQkJCQkJaW50IGk7Ci0rCi0rCQkJCQkJcHRybmFtZS5pID0gaXg7Ci0rCi0rCQkJCQkJaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJGRF9FTkRJQU5fQklHKQotKwkJCQkJCXsKLSsJCQkJCQkJZm9yICggaSA9IDAgOyBpIDwgNCA7IGkrKyApCi0rCQkJCQkJCQllbWl0RGF0YShwdHJuYW1lLmJ5dGVzW2ldLCBzdHJlYW0pOwotKwkJCQkJCX0KLSsJCQkJCQllbHNlCi0rCQkJCQkJewotKwkJCQkJCQlmb3IgKCBpID0gMyA7IGkgPj0gMCA7IGktLSApCi0rCQkJCQkJCQllbWl0RGF0YShwdHJuYW1lLmJ5dGVzW2ldLCBzdHJlYW0pOwotKwkJCQkJCX0KLSsJCQkJCX0KLSsKLSsJCQkJCWJyZWFrOyAvKiBubyBuZWVkIHRvIGxvb2sgYXQgb3RoZXIgc2VlbiB2YWx1ZXMgKi8KLSsJCQkJfQotKwotKwkJCQkvKiAKLSsJCQkJKiogcmVmZXJyaW5nIHRvIG9uZSBhbHJlYWR5IGVtaXR0ZWQKLSsJCQkJKi8KLSsKLSsJCQkJZW1pdERhdGEoKGNoYXIpQUlGX1BUUl9SRUZFUkVOQ0UsIHN0cmVhbSk7IAotKwotKwkJCQl7Ci0rCQkJCQlpbnQgaTsKLSsKLSsJCQkJCXB0cm5hbWUuaSA9IGl4OwotKwotKwkJCQkJaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJGRF9FTkRJQU5fQklHKQotKwkJCQkJewotKwkJCQkJCWZvciAoIGkgPSAwIDsgaSA8IDQgOyBpKysgKQotKwkJCQkJCQllbWl0RGF0YShwdHJuYW1lLmJ5dGVzW2ldLCBzdHJlYW0pOwotKwkJCQkJfQotKwkJCQkJZWxzZQotKwkJCQkJewotKwkJCQkJCWZvciAoIGkgPSAzIDsgaSA+PSAwIDsgaS0tICkKLSsJCQkJCQkJZW1pdERhdGEocHRybmFtZS5ieXRlc1tpXSwgc3RyZWFtKTsKLSsJCQkJCX0KLSsJCQkJfQotKwotKwkJCQlyZXR1cm47IC8qIGRvbid0IGdvIGFueSBkZWVwZXIgKi8KLSsJCQl9Ci0rCQl9Ci0rCi0rCQlyZXMgPSBjaGVja192YWx1ZShlbHR0eXBlLCBhZGRyLCAmdnB0cik7Ci0rCi0rCQlpZiAoIGl4ID09IG51bVZhbHVlc1NlZW4gKQotKwkJewotKwkJCS8qCi0rCQkJKiogbm90IHNwZWNpYWwgYXQgYWxsIAotKwkJCSovCi0rCQkJaWYgKCAhcmVzICkKLSsJCQl7Ci0rCQkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfSU5WQUxJRCwgc3RyZWFtKTsgCi0rCQkJCWJyZWFrOwotKwkJCX0KLSsKLSsJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05PUk1BTCwgc3RyZWFtKTsgCi0rCQl9Ci0rCi0rCQlhaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZSAoVkFMVUVfVFlQRSh2cHRyKSwKLSsJCQkJCVZBTFVFX0NPTlRFTlRTKHZwdHIpLAotKwkJCQkJVkFMVUVfQUREUkVTUyh2cHRyKSwKLSsJCQkJCXN0cmVhbSk7Ci0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfU1RSVUNUOgotKwljYXNlIFRZUEVfQ09ERV9VTklPTjoKLSsJCS8qCi0rCQkqKiBBIHVuaW9uIGlzIHRyZWF0ZWQganVzdCBsaWtlIGEgc3RydWN0LiBUaGF0IGlzCi0rCQkqKiB3ZSBhdHRlbXB0IHRvIHRyYXZlcnNlIGVhY2ggZmllbGQgaWYgcG9zc2libGUuCi0rCQkqKiBJdCdzIHRoZW4gdXAgdG8gdGhlIHJlY2VpdmVyIHRvIGRlY2lkZSB3aGF0IGlzCi0rCQkqKiBzZW5zaWJsZSBpbmZvcm1hdGlvbi4KLSsJCSoqCi0rCQkqKiBYWFg6IFdoYXQgaGFwcGVucyBpZiBhIHBvaW50ZXIgcG9pbnRzIHRvIHJhbmRvbQotKwkJKiogZGF0YT8KLSsJCSovCi0rCQlmb3IgKCBpeCA9IDAgOyBpeCA8IFRZUEVfTkZJRUxEUyAodHlwZSkgOyBpeCsrICkKLSsJCXsKLSsJCQlpZiAoIFRZUEVfRklFTERfSUdOT1JFKHR5cGUsIGl4KSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWlmIAotKwkJCSgKLSsJCQkJIVRZUEVfRklFTERfU1RBVElDKHR5cGUsIGl4KSAKLSsJCQkJJiYgCi0rCQkJCVRZUEVfRklFTERfUEFDS0VEKHR5cGUsIGl4KQotKwkJCSkKLSsJCQl7Ci0rCQkJCXZwdHIgPSB2YWx1ZV9mcm9tX2xvbmdlc3QoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwKLSsJCQkJCXVucGFja19maWVsZF9hc19sb25nKHR5cGUsIHZhbGFkZHIsIGl4KSk7Ci0rCi0rCQkJCWFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpeCksIFZBTFVFX0NPTlRFTlRTKHZwdHIpLCAwLCBzdHJlYW0pOwotKwkJCX0KLSsJCQllbHNlIGlmICggVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGl4KSApCi0rCQkJewotKwkJCQl2cHRyID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpeCk7Ci0rCi0rCQkJCWlmICggdnB0ciA9PSBOVUxMICkKLSsJCQkJCWNvbnRpbnVlOwotKwotKwkJCQkvKgotKwkJCQlYWFgKLSsJCQkJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCB2LAotKwkJCQlzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSArIDEsCi0rCQkJCXByZXR0eSk7Ci0rCQkJCSovCi0rCQkJfQotKwkJCWVsc2UKLSsJCQkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwgCi0rCQkJCQl2YWxhZGRyICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGl4KSAvIDgsCi0rCQkJCQlhZGRyZXNzICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGl4KSAvIDgsCi0rCQkJCQlzdHJlYW0pOwotKwkJfQotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0NIQVI6Ci0rCWFzQ2hhcjoKLSsJCXZhbCA9IHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKTsKLSsJCWVtaXREYXRhKChjaGFyKSAodmFsICYgMHhmZiksIHN0cmVhbSk7IAotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0lOVDoKLSsJCWxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKLSsKLSsJCWlmCi0rCQkoCi0rCQkJbGVuID09IDEgCi0rCQkJJiYKLSsJCQlzdHJuY21wKFRZUEVfTkFNRSh0eXBlKSwgImNoYXIiLCA1KSA9PSAwCi0rCQkpIAotKwkJCWdvdG8gYXNDaGFyOwotKwotKwkJdmFsID0gdW5wYWNrX2xvbmcodHlwZSwgdmFsYWRkcik7Ci0rCQlBSUZOb3JtYWxpc2UoKGNoYXIgKikgJnYsIGxlbiwgKGNoYXIgKikgJnZhbCwgc2l6ZW9mKExPTkdFU1QpKTsKLSsJCQotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikodi5jW2l4XSAmIDB4ZmYpLCBzdHJlYW0pOyAKLSsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rCQlsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSk7Ci0rCi0rCQlzd2l0Y2ggKCBsZW4gKSB7Ci0rCQljYXNlIDQ6Ci0rCQkJZnZhbCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJQUlGTm9ybWFsaXNlKChjaGFyICopICZ2LCBsZW4sICgoY2hhciAqKSAmZnZhbCksIHNpemVvZihET1VCTEVTVCkpOwotKwkJCWJyZWFrOwotKwotKwkJY2FzZSA4OgotKwkJCWR2YWwgPSB1bnBhY2tfZG91YmxlICh0eXBlLCB2YWxhZGRyLCAmdmFsaWQpOwotKwkJCUFJRk5vcm1hbGlzZSgoY2hhciAqKSAmdiwgbGVuLCAoKGNoYXIgKikgJmR2YWwpLCBzaXplb2YoRE9VQkxFU1QpKTsKLSsJCQlicmVhazsKLSsKLSsjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotKwkJY2FzZSAxNjoKLSsJCQlsZHZhbCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJQUlGTm9ybWFsaXNlKChjaGFyICopICZ2LCBsZW4sICgoY2hhciAqKSAmbGR2YWwpLCBzaXplb2YoRE9VQkxFU1QpKTsKLSsJCQlicmVhazsKLSsjZW5kaWYgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotKwkJZGVmYXVsdDoKLSsJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBoYW5kbGUgZmxvYXQgb2YgbGVuZ3RoICVkXG4iLCBsZW4pOwotKwkJfQotKwotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikgKHYuY1tpeF0gJiAweGZmKSwgc3RyZWFtKTsgCi0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfVk9JRDoKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9NRU1CRVI6Ci0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCWNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKwljYXNlIFRZUEVfQ09ERV9GVU5DOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOREVGOgotKwljYXNlIFRZUEVfQ09ERV9FUlJPUjoKLSsJCWJyZWFrOwotKwotKwlkZWZhdWx0OgotKwkJZXJyb3IgKCJJbnZhbGlkIEMvQysrIHR5cGUgY29kZSAlZCBpbiBzeW1ib2wgdGFibGUuIiwgVFlQRV9DT0RFICh0eXBlKSk7Ci0rCX0KLSt9Ci0rCi0rdm9pZCAKLSthaWZfdmFsX3ByaW50KHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyLCBpbnQgZW1iZWRkZWRfb2Zmc2V0LCBDT1JFX0FERFIgYWRkcmVzcywgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rICBzdHJfcHRyIHM7Ci0rCi0rICAvLyBzdHJ1Y3QgdWlfZmlsZSAqdHlwZVN0cmVhbT1tZW1fZmlsZW9wZW4oKTsKLSsgIG51bVZhbHVlc1NlZW4gPSAwOwotKyAgYWlmX2Rpc2NvdmVyKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBkb1ZhbHVlKTsgLyogdmFsdWVzICovCi0rICBhaWZfZGlzY292ZXIodHlwZSwgMCwgZG9UeXBlKTsgLyogdHlwZXMgKi8KLSsgIGFpZl9yZWR1Y2UoKTsKLSsgIGRhdGFTdHJlYW1Qb3MgPSAwOwotKyAgLy8gZnB1dHNfZmlsdGVyZWQoIigiLCBzdHJlYW0pOwotKyAgcyA9IGdkYl90eXBlX3RvX2Zkcyh0eXBlKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKHN0cl92YWwocyksIHN0cmVhbSk7Ci0rICBzdHJfZnJlZShzKTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKCIpIiwgc3RyZWFtKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKCIgIiwgc3RyZWFtKTsKLSsgIGFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0pOwotKyAgLy8gY29udGVudHMgPSB1aV9maWxlX3hzdHJkdXAodHlwZVN0cmVhbSwgJmR1bW15KTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKGNvbnRlbnRzLCBzdHJlYW0pOwotKyAgLy8gZnJlZShjb250ZW50cyk7Ci0rICAvLyB1aV9maWxlX2RlbGV0ZSh0eXBlU3RyZWFtKTsKLSsgIGdkYl9mbHVzaChzdHJlYW0pOwotK30gLyogYWlmX3ZhbF9wcmludCAqLwotKwotK3ZvaWQKLSthaWZfdHlwZV9wcmludChzdHJ1Y3QgdHlwZSAqdHlwZSwgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rCXN0cl9wdHIJczsKLSsKLSsJbnVtVmFsdWVzU2VlbiA9IDA7Ci0rCWFpZl9kaXNjb3Zlcih0eXBlLCAwLCBkb1R5cGUpOyAvKiB0eXBlcyAqLwotKwlhaWZfcmVkdWNlKCk7Ci0rCWRhdGFTdHJlYW1Qb3MgPSAwOwotKwlzID0gZ2RiX3R5cGVfdG9fZmRzKHR5cGUpOwotKwlmcHV0c19maWx0ZXJlZChzdHJfdmFsKHMpLCBzdHJlYW0pOwotKwlzdHJfZnJlZShzKTsKLSt9Ci0rCi0rI2RlZmluZSBTVFJTSVpFIDEwMAotKwotK3N0cl9wdHIKLStzdHJfaW5pdCh2b2lkKQotK3sKLSsJc3RyX3B0cglzOwotKwotKwlzID0gKHN0cl9wdHIpeG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cl90eXBlKSk7Ci0rCXMtPmJ1ZiA9IChjaGFyICopeG1hbGxvYyhTVFJTSVpFKTsKLSsJcy0+YmxlbiA9IFNUUlNJWkU7Ci0rCXMtPnNsZW4gPSAwOwotKwkqKHMtPmJ1ZikgPSAnXDAnOwotKwotKwlyZXR1cm4gczsKLSt9Ci0rCi0rdm9pZAotK3N0cl9hZGQoc3RyX3B0ciBzMSwgY2hhciAqczIpCi0rewotKwlpbnQJbDIgPSBzdHJsZW4oczIpOwotKwotKwlpZiAoczEtPnNsZW4gKyBsMiA+PSBzMS0+YmxlbikKLSsJewotKwkJczEtPmJsZW4gKz0gbWF4KFNUUlNJWkUsIGwyKTsKLSsJCXMxLT5idWYgPSAoY2hhciAqKSB4cmVhbGxvYyAoczEtPmJ1ZiwgczEtPmJsZW4pOwotKwl9Ci0rCi0rCW1lbWNweSgmKHMxLT5idWZbczEtPnNsZW5dKSwgczIsIGwyKTsKLSsJczEtPnNsZW4gKz0gbDI7Ci0rCXMxLT5idWZbczEtPnNsZW5dID0gJ1wwJzsKLSt9Ci0rCi0rdm9pZAotK3N0cl9mcmVlKHN0cl9wdHIgcykKLSt7Ci0rCWZyZWUocy0+YnVmKTsKLSsJZnJlZShzKTsKLSt9Ci0rCi0rY2hhciAqCi0rc3RyX3ZhbChzdHJfcHRyIHMpCi0rewotKwlyZXR1cm4gcy0+YnVmOwotK30KLSsKLStzdHJfcHRyCi0rc3RyX2R1cChjaGFyICpzMSkKLSt7Ci0rCXN0cl9wdHIgcyA9IHN0cl9pbml0KCk7Ci0rCXN0cl9hZGQocywgczEpOwotKwlyZXR1cm4gczsKLSt9Ci0rCi0raW50Ci0rY2hlY2tfdmFsdWUoc3RydWN0IHR5cGUgKnR5cGUsIENPUkVfQUREUiBhZGRyLCBzdHJ1Y3QgdmFsdWUgKipyZXMpCi0rewotKyAgaW50IHN0YXR1czsKLSsgIHN0cnVjdCB2YWx1ZSAqdmFsOwotKyAgY2hhciBidWZbc2l6ZW9mIChVTE9OR0VTVCldOyAKLSsKLSsgIGlmIChUWVBFX0NPREUgKGNoZWNrX3R5cGVkZWYgKHR5cGUpKSA9PSBUWVBFX0NPREVfVk9JRCkKLSsgICAgcmV0dXJuIDA7Ci0rCi0rICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7Ci0rCi0rICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIFZBTFVFX0NPTlRFTlRTX0FMTF9SQVcgKHZhbCksIFRZUEVfTEVOR1RIICh0eXBlKSk7Ci0rCi0rICBpZiAoc3RhdHVzICE9IDApCi0rICAgIHJldHVybiAwOwotKwotKyAgVkFMVUVfTFZBTCAodmFsKSA9IGx2YWxfbWVtb3J5OwotKyAgVkFMVUVfQUREUkVTUyAodmFsKSA9IGFkZHI7Ci0rICBWQUxVRV9CRkRfU0VDVElPTiAodmFsKSA9IE5VTEw7Ci0rCi0rICAqcmVzID0gdmFsOwotKwotKyAgcmV0dXJuIDE7Ci0rfQotLS0tIGdkYi01LjItb2xkL2dkYi9jLXZhbHByaW50LmMJVHVlIEZlYiAgNSAxNDo0MToyOSAyMDAyCi0rKysgZ2RiLTUuMi9nZGIvYy12YWxwcmludC5jCVN1biBNYXIgMTYgMjE6MDk6MjQgMjAwMwotQEAgLTMxLDYgKzMxLDEyIEBACi0gI2luY2x1ZGUgImNwLWFiaS5oIgotIAwKLSAKLSsjaWZkZWYgSEFWRV9BSUYKLStleHRlcm4gaW50IG1heF9wcmludF9kZXB0aDsgLyogc2V0IGJ5ICJzZXQgcHJpbnQgZGVwdGgiICovCi0rZXh0ZXJuIGludCBjdXJyZW50X3ByaW50X2RlcHRoOwotK2V4dGVybiBpbnQgdHlwZXByaW50OyAvKiBzZXQgYnkgInNldCBwcmludCB0eXBlIiAoQm9vbGVhbikgKi8KLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSsKLSAvKiBQcmludCBmdW5jdGlvbiBwb2ludGVyIHdpdGggaW5mZXJpb3IgYWRkcmVzcyBBRERSRVNTIG9udG8gc3RkaW8KLSAgICBzdHJlYW0gU1RSRUFNLiAgKi8KLSAKLUBAIC03Niw2ICs4MiwxNSBAQAotICAgTE9OR0VTVCB2YWw7Ci0gICBDT1JFX0FERFIgYWRkcjsKLSAKLSsjaWZkZWYgSEFWRV9BSUYKLSsgIGlmICh0eXBlcHJpbnQgJiYgZm9ybWF0ICE9ICdzJykgCi0rICAgIHsKLSsgICAgICBmcHV0c19maWx0ZXJlZCgiKCIsIHN0cmVhbSk7Ci0rICAgICAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOwotKyAgICAgIGZwdXRzX2ZpbHRlcmVkKCIpICIsIHN0cmVhbSk7Ci0rICAgIH0KLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSsKLSAgIENIRUNLX1RZUEVERUYgKHR5cGUpOwotICAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQotICAgICB7Ci1AQCAtMTU0LDYgKzE2OSw5IEBACi0gCSAgYnJlYWs7Ci0gCX0KLSAgICAgICBlbHR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKyNpZmRlZiBIQVZFX0FJRgotKyAgICAgIGlmICghZWx0dHlwZSkgZWx0dHlwZSA9IHR5cGU7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gICAgICAgaWYgKFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX01FVEhPRCkKLSAJewotIAkgIGNwX3ByaW50X2NsYXNzX21ldGhvZCAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgdHlwZSwgc3RyZWFtKTsKLUBAIC0xODIsNiArMjAwLDM2IEBACi0gCSAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSAJICAgIH0KLSAKLSsjaWZkZWYgSEFWRV9BSUYKLSsJICBpZiAoY3VycmVudF9wcmludF9kZXB0aCA8IG1heF9wcmludF9kZXB0aAotKwkgICAgICAmJiBUWVBFX0NPREUgKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9VTkRFRgotKwkgICAgICAmJiAoVFlQRV9MRU5HVEggKGVsdHR5cGUpICE9IDEKLSsJICAgICAgfHwgVFlQRV9DT0RFIChlbHR0eXBlKSAhPSBUWVBFX0NPREVfSU5UKQotKwkgICAgICAmJiBmb3JtYXQgIT0gJ3MnKQotKwkgICAgeyAvKiBwcmludCBjb21wbGV4IG9iamVjdGVkIHBvaW50ZWQgdG8gcmVjdXJzaXZlbHkgKi8KLSsJICAgICAgaWYgKGFkZHJlc3NwcmludCkgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiID0+ICIpOwotKwkgICAgICBpZiAoYWRkciA9PSAwKQotKwkJewotKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJuaWwiKTsKLSsJCX0KLSsJICAgICAgZWxzZQotKwkgICAgICB7IC8qIG5vbiBuaWwgKi8KLSsJCXN0cnVjdCB2YWx1ZSAqZGVyZWZfdmFsID0gdmFsdWVfYXQoZWx0dHlwZSwgYWRkciwgTlVMTCk7Ci0rCQljdXJyZW50X3ByaW50X2RlcHRoICs9IDE7Ci0rCQl2YWxfcHJpbnQgKFZBTFVFX1RZUEUgKGRlcmVmX3ZhbCksCi0rCQkJICAgIFZBTFVFX0NPTlRFTlRTIChkZXJlZl92YWwpLAotKwkJCSAgICAwLAotKwkJCSAgICBWQUxVRV9BRERSRVNTIChkZXJlZl92YWwpLAotKwkJCSAgICBzdHJlYW0sCi0rCQkJICAgIGZvcm1hdCwKLSsJCQkgICAgZGVyZWZfcmVmLAotKwkJCSAgICByZWN1cnNlLAotKwkJCSAgICBwcmV0dHkpOwotKwkJY3VycmVudF9wcmludF9kZXB0aCAtPSAxOwotKwkgICAgICB9Ci0rCSAgICB9IC8qIHByaW50IHJlY3Vyc2l2ZWx5ICovCi0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0rCi0gCSAgLyogRm9yIGEgcG9pbnRlciB0byBjaGFyIG9yIHVuc2lnbmVkIGNoYXIsIGFsc28gcHJpbnQgdGhlIHN0cmluZwotIAkgICAgIHBvaW50ZWQgdG8sIHVubGVzcyBwb2ludGVyIGlzIG51bGwuICAqLwotIAkgIC8qIEZJWE1FOiBuZWVkIHRvIGhhbmRsZSB3Y2hhcl90IGhlcmUuLi4gKi8KLUBAIC0zNTYsOSArNDA0LDExIEBACi0gCX0KLSAgICAgICAvKiBGSVhNRSwgd2Ugc2hvdWxkIGNvbnNpZGVyLCBhdCBsZWFzdCBmb3IgQU5TSSBDIGxhbmd1YWdlLCBlbGltaW5hdGluZwotICAgICAgICAgIHRoZSBkaXN0aW5jdGlvbiBtYWRlIGJldHdlZW4gRlVOQ3MgYW5kIFBPSU5URVJzIHRvIEZVTkNzLiAgKi8KLSsjaWZuZGVmIEhBVkVfQUlGCi0gICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAieyIpOwotICAgICAgIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKLSAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ9ICIpOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotICAgICAgIC8qIFRyeSB0byBwcmludCB3aGF0IGZ1bmN0aW9uIGl0IHBvaW50cyB0bywgYW5kIGl0cyBhZGRyZXNzLiAgKi8KLSAgICAgICBwcmludF9hZGRyZXNzX2RlbWFuZ2xlIChhZGRyZXNzLCBzdHJlYW0sIGRlbWFuZ2xlKTsKLSAgICAgICBicmVhazsKLUBAIC01NTksOSArNjA5LDExIEBACi0gICAgICAgZWxzZQotIAl7Ci0gCSAgLyogbm9ybWFsIGNhc2UgKi8KLSsjaWZuZGVmIEhBVkVfQUlGCi0gCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOwotIAkgIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKLSAJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpICIpOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotIAl9Ci0gICAgIH0KLSAgIGlmIChvYmplY3RwcmludCAmJiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSA9PSBUWVBFX0NPREVfQ0xBU1MpKQotLS0tIGdkYi01LjItb2xkL2dkYi9wcmludGNtZC5jCVRodSBKYW4gMzEgMTg6NDk6NTQgMjAwMgotKysrIGdkYi01LjIvZ2RiL3ByaW50Y21kLmMJU3VuIE1hciAxNiAyMTowOToyNCAyMDAzCi1AQCAtNDMsNiArNDMsNyBAQAotIAotIGV4dGVybiBpbnQgYXNtX2RlbWFuZ2xlOwkvKiBXaGV0aGVyIHRvIGRlbWFuZ2xlIHN5bXMgaW4gYXNtIHByaW50b3V0cyAqLwotIGV4dGVybiBpbnQgYWRkcmVzc3ByaW50OwkvKiBXaGV0aGVyIHRvIHByaW50IGhleCBhZGRyZXNzZXMgaW4gSExMICIgKi8KLStleHRlcm4gaW50IGN1cnJlbnRfcHJpbnRfZGVwdGg7IC8qIGZyb20gdmFscHJpbnQuYyAqLwotIAotIHN0cnVjdCBmb3JtYXRfZGF0YQotICAgewotQEAgLTMyMCwxMiArMzIxLDIxIEBACi0gCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU1RSSU5HCi0gCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUCi0gCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pCi0rI2lmZGVmIEhBVkVfQUlGCi0rCXsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSAJLyogSWYgZm9ybWF0IGlzIDAsIHVzZSB0aGUgJ25hdHVyYWwnIGZvcm1hdCBmb3IKLSAJICogdGhhdCB0eXBlIG9mIHZhbHVlLiAgSWYgdGhlIHR5cGUgaXMgbm9uLXNjYWxhciwKLSAJICogd2UgaGF2ZSB0byB1c2UgbGFuZ3VhZ2UgcnVsZXMgdG8gcHJpbnQgaXQgYXMKLSAJICogYSBzZXJpZXMgb2Ygc2NhbGFycy4KLSAJICovCi0rI2lmZGVmIEhBVkVfQUlGCi0rCWN1cnJlbnRfcHJpbnRfZGVwdGggPSAwOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotIAl2YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKLSsjaWZkZWYgSEFWRV9BSUYKLSsJfQotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotICAgICAgIGVsc2UKLSAJLyogVXNlciBzcGVjaWZpZWQgZm9ybWF0LCBzbyBkb24ndCBsb29rIHRvIHRoZQotIAkgKiB0aGUgdHlwZSB0byB0ZWxsIHVzIHdoYXQgdG8gZG8uCi0tLS0gZ2RiLTUuMi1vbGQvZ2RiL3R5cGVwcmludC5jCVNhdCBOb3YgMTAgMTQ6MzQ6NTYgMjAwMQotKysrIGdkYi01LjIvZ2RiL3R5cGVwcmludC5jCVN1biBNYXIgMTYgMjE6MDk6MjQgMjAwMwotQEAgLTQyLDYgKzQyLDExIEBACi0gCi0gZXh0ZXJuIHZvaWQgX2luaXRpYWxpemVfdHlwZXByaW50ICh2b2lkKTsKLSAKLSsjaWZkZWYgSEFWRV9BSUYKLStleHRlcm4gaW50IGFpZnByaW50OyAvKiBwcmludCB0eXBlIHVzaW5nIEFJRiAqLwotK2V4dGVybiB2b2lkIGFpZl90eXBlX3ByaW50IChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdWlfZmlsZSAqKTsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSsKLSBzdGF0aWMgdm9pZCBwdHlwZV9jb21tYW5kIChjaGFyICosIGludCk7Ci0gCi0gc3RhdGljIHN0cnVjdCB0eXBlICpwdHlwZV9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqKTsKLUBAIC0xMTYsNiArMTIxLDEzIEBACi0gdHlwZV9wcmludCAoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhcnN0cmluZywgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSwKLSAJICAgIGludCBzaG93KQotIHsKLSsjaWZkZWYgSEFWRV9BSUYKLSsgIGlmIChhaWZwcmludCkKLSsgICAgewotKyAgICAgICAgYWlmX3R5cGVfcHJpbnQgKHR5cGUsIHN0cmVhbSk7Ci0rICAgICAgICByZXR1cm47Ci0rICAgIH0KLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSAgIExBX1BSSU5UX1RZUEUgKHR5cGUsIHZhcnN0cmluZywgc3RyZWFtLCBzaG93LCAwKTsKLSB9Ci0gCi0tLS0gZ2RiLTUuMi1vbGQvZ2RiL3ZhbHByaW50LmMJTW9uIEZlYiAgNCAyMTozNzoyMiAyMDAyCi0rKysgZ2RiLTUuMi9nZGIvdmFscHJpbnQuYwlTdW4gTWFyIDE2IDIxOjA5OjI0IDIwMDMKLUBAIC0zNywxMCArMzcsMjEgQEAKLSAKLSAjaW5jbHVkZSA8ZXJybm8uaD4KLSAKLSsjaWZkZWYgSEFWRV9BSUYKLStleHRlcm4gaW50IGFpZnByaW50OyAvKiBzZXQgYnkgInNldCBwcmludCBhaWYiIChCb29sZWFuKSAqLwotK3ZvaWQgYWlmX3ZhbF9wcmludCAoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsIGludCBlbWJlZGRlZF9vZmZzZXQsCi0rCQkJQ09SRV9BRERSIGFkZHJlc3MsIHN0cnVjdCB1aV9maWxlICpzdHJlYW0pOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotKwotIC8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLwotIAotKyNpZmRlZiBIQVZFX0FJRgotK2ludCBwYXJ0aWFsX21lbW9yeV9yZWFkIChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAotKwkJCQlpbnQgbGVuLCBpbnQgKmVycm5vcHRyKTsKLSsjZWxzZSAvKiBIQVZFX0FJRiAqLwotIHN0YXRpYyBpbnQgcGFydGlhbF9tZW1vcnlfcmVhZCAoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwKLSAJCQkJaW50IGxlbiwgaW50ICplcnJub3B0cik7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gCi0gc3RhdGljIHZvaWQgcHJpbnRfaGV4X2NoYXJzIChzdHJ1Y3QgdWlfZmlsZSAqLCB1bnNpZ25lZCBjaGFyICosCi0gCQkJICAgICB1bnNpZ25lZCBpbnQpOwotQEAgLTEwMyw2ICsxMTQsMTggQEAKLSAvKiBJZiBub256ZXJvLCBjYXVzZXMgbWFjaGluZSBhZGRyZXNzZXMgdG8gYmUgcHJpbnRlZCBpbiBjZXJ0YWluIGNvbnRleHRzLiAqLwotIAotIGludCBhZGRyZXNzcHJpbnQ7CQkvKiBDb250cm9scyBwcmludGluZyBvZiBtYWNoaW5lIGFkZHJlc3NlcyAqLwotKwotKyNpZmRlZiBIQVZFX0FJRgotKy8qIElmIHBvc2l0aXZlLCBjYXVzZXMgcG9pbnRlcnMgdG8gYmUgZm9sbG93ZWQgaW4gcHJpbnRpbmcsIHRvIGdpdmVuIGRlcHRoICovCi0raW50IG1heF9wcmludF9kZXB0aDsKLStpbnQgY3VycmVudF9wcmludF9kZXB0aCA9IDA7IC8qIHJlc2V0IHRvIDAgYXQgZWFjaCBpbnRlcnJ1cHQgKi8KLSsgCi0rLyogSWYgbm9uemVybywgY2F1c2VzIHR5cGVzIHRvIGJlIHByaW50ZWQuICovCi0raW50IHR5cGVwcmludDsKLSsgCi0rLyogSWYgbm9uemVybywgY2F1c2VzIHR5cGVzIHRvIGJlIHByaW50ZWQsIGlmIGF0IGFsbCwgaW4gQUlGIGZvcm1hdC4gKi8KLStpbnQgYWlmcHJpbnQ7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gDAotIAotIC8qIFByaW50IGRhdGEgb2YgdHlwZSBUWVBFIGxvY2F0ZWQgYXQgVkFMQUREUiAod2l0aGluIEdEQiksIHdoaWNoIGNhbWUgZnJvbQotQEAgLTE0OSw2ICsxNzIsMTQgQEAKLSAgICAgICByZXR1cm4gKDApOwotICAgICB9Ci0gCi0rI2lmZGVmIEhBVkVfQUlGCi0rICBpZiAoYWlmcHJpbnQpCi0rICB7Ci0rICAgIGFpZl92YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtKTsKLSsgICAgcmV0dXJuIDA7IAotKyAgfQotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotKwotICAgcmV0dXJuIChMQV9WQUxfUFJJTlQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywKLSAJCQlzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpKTsKLSB9Ci1AQCAtMTA3Miw3ICsxMTAzLDEyIEBACi0gLyogRklYTUU6IGNhZ25leS8xOTk5LTEwLTE0OiBPbmx5IHVzZWQgYnkgdmFsX3ByaW50X3N0cmluZy4gIENhbiB0aGlzCi0gICAgZnVuY3Rpb24gYmUgZWxpbWluYXRlZC4gICovCi0gCi0rI2lmZGVmIEhBVkVfQUlGCi0rLyogSXQgaXMgbm93IHVzZWQgYnkgYWlmX3ByaW50X3N0cmluZyBhcyB3ZWxsLiAqLwotK2ludAotKyNlbHNlIC8qIEhBVkVfQUlGICovCi0gc3RhdGljIGludAotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotIHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sIGludCAqZXJybm9wdHIpCi0gewotICAgaW50IG5yZWFkOwkJCS8qIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiAqLwotQEAgLTEyNjAsNyArMTI5NiwxMSBAQAotICAgICB7Ci0gICAgICAgaWYgKGFkZHJlc3NwcmludCkKLSAJewotKyNpZmRlZiBIQVZFX0FJRgotKwkgIGZwdXRzX2ZpbHRlcmVkICgiPT4iLCBzdHJlYW0pOwotKyNlbHNlIC8qIEhBVkVfQUlGICovCi0gCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgc3RyZWFtKTsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSAJfQotICAgICAgIExBX1BSSU5UX1NUUklORyAoc3RyZWFtLCBidWZmZXIsIChidWZwdHIgLSBidWZmZXIpIC8gd2lkdGgsIHdpZHRoLCBmb3JjZV9lbGxpcHNpcyk7Ci0gICAgIH0KLUBAIC0xNDg1LDYgKzE1MjUsMjkgQEAKLSAJCSAgJnNldHByaW50bGlzdCksCi0gICAgICAmc2hvd3ByaW50bGlzdCk7Ci0gCi0rI2lmZGVmIEhBVkVfQUlGCi0rICBhZGRfc2hvd19mcm9tX3NldAotKyAgICAoYWRkX3NldF9jbWQgKCJkZXB0aCIsIGNsYXNzX3N1cHBvcnQsIHZhcl91aW50ZWdlciwKLSsJCSAgKGNoYXIgKikgJm1heF9wcmludF9kZXB0aCwKLSsJCSAgIlNldCBkZXB0aCBvZiBwb2ludGVyIHJlY3Vyc2lvbi4iLAotKwkJICAmc2V0cHJpbnRsaXN0KSwKLSsgICAgICAmc2hvd3ByaW50bGlzdCk7Ci0rCi0rICBhZGRfc2hvd19mcm9tX3NldAotKyAgICAoYWRkX3NldF9jbWQgKCJ0eXBlIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0rCQkgIChjaGFyICopICZ0eXBlcHJpbnQsCi0rCQkgICJTZXQgcHJpbnRpbmcgb2YgdHlwZXMuIiwKLSsJCSAgJnNldHByaW50bGlzdCksCi0rICAgICAgJnNob3dwcmludGxpc3QpOwotKwotKyAgYWRkX3Nob3dfZnJvbV9zZXQKLSsgICAgKGFkZF9zZXRfY21kICgiYWlmIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0rCQkgIChjaGFyICopICZhaWZwcmludCwKLSsJCSAgIlNldCBwcmludGluZyBvZiB0eXBlcyB0byBhaWYgZm9ybWF0LiIsCi0rCQkgICZzZXRwcmludGxpc3QpLAotKyAgICAgICZzaG93cHJpbnRsaXN0KTsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSsKLSAgIGMgPSBhZGRfc2V0X2NtZCAoImlucHV0LXJhZGl4IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAotIAkJICAgKGNoYXIgKikgJmlucHV0X3JhZGl4LAotIAkJICAgIlNldCBkZWZhdWx0IGlucHV0IHJhZGl4IGZvciBlbnRlcmluZyBudW1iZXJzLiIsCi1AQCAtMTUyMCw0ICsxNTgzLDkgQEAKLSAgIHVuaW9ucHJpbnQgPSAxOwotICAgYWRkcmVzc3ByaW50ID0gMTsKLSAgIHByaW50X21heCA9IFBSSU5UX01BWF9ERUZBVUxUOwotKyNpZmRlZiBIQVZFX0FJRgotKyAgbWF4X3ByaW50X2RlcHRoID0gLTE7Ci0rICB0eXBlcHJpbnQgPSAwOwotKyAgYWlmcHJpbnQgPSAwOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotIH0KLS0tLSAvZGV2L251bGwJV2VkIEFwciAgMiAyMDozNDoyOCAyMDAzCi0rKysgZ2RiLTUuMi9nZGIvbGliYWlmLm1rCVN1biBNYXIgMTYgMjE6MDk6MjQgMjAwMwotQEAgLTAsMCArMSw5IEBACi0rSU5DTFVERV9DRkxBR1MgKz0gJChJTkNMVURFX2FpZikKLSsKLStDTElCUyArPSAkKExJQl9haWYpCi0rCi0rU0ZJTEVTICAgICArPSBhaWYtdmFscHJpbnQuYwotK0NPTU1PTl9PQlMgKz0gYWlmLXZhbHByaW50Lm8KLSsKLSthaWYtdmFscHJpbnQubzogYWlmLXZhbHByaW50LmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGdkYnR5cGVzX2gpIFwKLSsJbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB2YWxwcmludC5oICQodmFsdWVfaCkKLS0tLSBnZGItNS4yLW9sZC9nZGIvY29uZmlndXJlLmluCVdlZCBNYXIgMjcgMjE6Mjg6MDAgMjAwMgotKysrIGdkYi01LjIvZ2RiL2NvbmZpZ3VyZS5pbglTdW4gTWFyIDE2IDIxOjA5OjI0IDIwMDMKLUBAIC0zMCw2ICszMCw5NSBAQAotIEFDX0lTQ19QT1NJWAotIEFNX1BST0dfQ0NfU1REQwotIAotK0FDX0FSR19XSVRIKGFpZiwKLStbICAtLXdpdGgtYWlmPWRpciAgICAgICAgICAgICAgICB1c2UgYWlmIGluIGRpcl0pCi0rQUNfQVJHX1dJVEgoYWlmLWxpYiwKLStbICAtLXdpdGgtYWlmLWxpYj1kaXIgICAgICAgICAgICB1c2UgYWlmIGxpYnJhcmllcyBpbiBkaXJdLAotK1tpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIiAtbyAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotKyAgQUNfTVNHX0VSUk9SKFtObyBhcmd1bWVudCBmb3IgLS13aXRoLWFpZi1saWJdKQotK2VsaWYgdGVzdCAiWCR3aXRoX2FpZiIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfYWlmPXllcwotK2ZpXSkKLStBQ19BUkdfV0lUSChhaWYtaW5jbHVkZSwKLStbICAtLXdpdGgtYWlmLWluY2x1ZGU9ZGlyICAgICAgICB1c2UgYWlmIGhlYWRlcnMgaW4gZGlyXSwKLStbaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyIgLW8gIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSsgIEFDX01TR19FUlJPUihbTm8gYXJndW1lbnQgZm9yIC0td2l0aC1haWYtaW5jbHVkZV0pCi0rZWxpZiB0ZXN0ICJYJHdpdGhfYWlmIiA9ICJYIjsgdGhlbgotKyAgd2l0aF9haWY9eWVzCi0rZmldKQotKwotK0FDX01TR19DSEVDS0lORyhmb3IgYWlmKQotKwotK2Nhc2UgIiR3aXRoX2FpZiIgaW4KLSt5ZXMpCTs7Ci0rbm8pCTs7Ci0rIiIpCTs7Ci0rKikJaWYgdGVzdCAiJHdpdGhfYWlmX2luY2x1ZGUiID0gIiI7IHRoZW4KLSsJCXdpdGhfYWlmX2luY2x1ZGU9IiR3aXRoX2FpZi9pbmNsdWRlIgotKwlmaQotKwlpZiB0ZXN0ICIkd2l0aF9haWZfbGliIiA9ICIiOyB0aGVuCi0rCQl3aXRoX2FpZl9saWI9IiR3aXRoX2FpZi9saWIkYWJpbGliZGlyZXh0IgotKwlmaQotKwk7OwotK2VzYWMKLStoZWFkZXJfZGlycz0KLStsaWJfZGlycz0KLStkPScvdXNyL2xvY2FsJwotK2ZvciBpIGluICRkIC91c3I7IGRvCi0rCWhlYWRlcl9kaXJzPSIkaGVhZGVyX2RpcnMgJGkvaW5jbHVkZSIKLSsJbGliX2RpcnM9IiRsaWJfZGlycyAkaS9saWIkYWJpbGliZGlyZXh0IgotK2RvbmUKLSsKLStjYXNlICIkd2l0aF9haWZfaW5jbHVkZSIgaW4KLSt5ZXMpIDs7Ci0rbm8pICA7OwotKyopICAgaGVhZGVyX2RpcnM9IiR3aXRoX2FpZl9pbmNsdWRlICRoZWFkZXJfZGlycyI7OwotK2VzYWMKLStjYXNlICIkd2l0aF9haWZfbGliIiBpbgotK3llcykgOzsKLStubykgIDs7Ci0rKikgICBsaWJfZGlycz0iJHdpdGhfYWlmX2xpYiAkbGliX2RpcnMiOzsKLStlc2FjCi0rCi0rc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0rc2F2ZV9MSUJTPSIkTElCUyIKLStpcmVzPSBscmVzPQotK2ZvciBpIGluICRoZWFkZXJfZGlyczsgZG8KLSsJQ0ZMQUdTPSItSSRpICRzYXZlX0NGTEFHUyIKLSsJQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxhaWYuaD5dLCxpcmVzPSRpO2JyZWFrKQotK2RvbmUKLStmb3IgaSBpbiAkbGliX2RpcnM7IGRvCi0rCUxJQlM9Ii1MJGkgLWxhaWYgJHNhdmVfTElCUyIKLSsJQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxhaWYuaD5dLCxscmVzPSRpO2JyZWFrKQotK2RvbmUKLStDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLStMSUJTPSIkc2F2ZV9MSUJTIgotKwotK2lmIHRlc3QgIiRpcmVzIiAtYSAiJGxyZXMiIC1hICIkd2l0aF9haWYiICE9ICJubyI7IHRoZW4KLSsJYWlmX2luY2x1ZGVkaXI9IiRpcmVzIgotKwlhaWZfbGliZGlyPSIkbHJlcyIKLSsJRElSX2FpZj0KLSsJSU5DTFVERV9haWY9Ii1JJGFpZl9pbmNsdWRlZGlyIgotKwlMSUJfYWlmPSItTCRhaWZfbGliZGlyIC1sYWlmIgotKwlBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9BSUYsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhaWYgcGFja2FnZS5dKQotKwl3aXRoX2FpZj15ZXMKLSsJQUNfTVNHX1JFU1VMVChbaGVhZGVycyAkaXJlcywgbGlicmFyaWVzICRscmVzXSkKLStlbHNlCi0rCURJUl9haWY9ImFpZiIKLSsJSU5DTFVERV9haWY9Ci0rCUxJQl9haWY9Ci0rCXdpdGhfYWlmPW5vCi0rCUFDX01TR19SRVNVTFQoJHdpdGhfYWlmKQotK2ZpCi0rQUNfU1VCU1QoRElSX2FpZikKLStBQ19TVUJTVChJTkNMVURFX2FpZikKLStBQ19TVUJTVChMSUJfYWlmKQotKwotK2lmIHRlc3QgIiR3aXRoX2FpZiIgPSAibm8iOyB0aGVuCi0rICAgICAgICBBQ19NU0dfRVJST1IoW1lvdSBtdXN0IGhhdmUgbGliYWlmIHRvIGNvbXBpbGUgdGhpcyB2ZXJzaW9uIG9mIEdEQi5dKQotK2ZpCi0rQUNfREVGSU5FKEhBVkVfQUlGLCAxLCBbRW5hYmxlIEFJRiBzdXBwb3J0IGluIGluIEdEQi5dKWRubAotKwotIEFDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4pCi0gQUNfQ0FOT05JQ0FMX1NZU1RFTQotIAotLS0tIGdkYi01LjItb2xkL2dkYi9jb25maWd1cmUJU3VuIEFwciAxNCAyMjoyODo0OSAyMDAyCi0rKysgZ2RiLTUuMi9nZGIvY29uZmlndXJlCVN1biBNYXIgMTYgMjE6MDk6MjQgMjAwMwotQEAgLTE1LDYgKzE1LDEyIEBACi0gICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotIGFjX2hlbHA9IiRhY19oZWxwCi0rICAtLXdpdGgtYWlmPWRpciAgICAgICAgICAgICAgICB1c2UgYWlmIGluIGRpciIKLSthY19oZWxwPSIkYWNfaGVscAotKyAgLS13aXRoLWFpZi1saWI9ZGlyICAgICAgICAgICAgdXNlIGFpZiBsaWJyYXJpZXMgaW4gZGlyIgotK2FjX2hlbHA9IiRhY19oZWxwCi0rICAtLXdpdGgtYWlmLWluY2x1ZGU9ZGlyICAgICAgICB1c2UgYWlmIGhlYWRlcnMgaW4gZGlyIgotK2FjX2hlbHA9IiRhY19oZWxwCi0gICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotIGFjX2hlbHA9IiRhY19oZWxwCi0gICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLUBAIC03OSw3ICs4NSw2IEBACi0gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLSBzaWxlbnQ9Ci0gc2l0ZT0KLS1zaXRlZmlsZT0KLSBzcmNkaXI9Ci0gdGFyZ2V0PU5PTkUKLSB2ZXJib3NlPQotQEAgLTE5NCw3ICsxOTksNiBAQAotICAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0tICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi0gRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi1AQCAtMzY1LDExICszNjksNiBAQAotICAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLSAKLS0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLS0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLS0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0tCi0gICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgICBhY19wcmV2PXNyY2RpciA7OwotICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLUBAIC01MzUsMTYgKzUzNCwxMiBAQAotIHNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotIAotICMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi0taWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLS0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLS0gICAgZWxzZQotLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLS0gICAgZmkKLStpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0rICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSsgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0rICBlbHNlCi0rICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgIGZpCi0tZWxzZQotLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLSBmaQotIGZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLUBAIC01ODUsNyArNTgwLDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU4OTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1ODQ6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi1AQCAtNjExLDcgKzYwNiw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYxMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC02NDEsNyArNjM2LDcgQEAKLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTY5Miw3ICs2ODcsNyBAQAotICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY5NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjkxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTcyNCw3ICs3MTksNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzI4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MjM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0gCi0gYWNfZXh0PWMKLSAjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1AQCAtNzM1LDEyICs3MzAsMTIgQEAKLSAKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotIAotLSNsaW5lIDczOSAiY29uZmlndXJlIgotKyNsaW5lIDczNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIG1haW4oKXtyZXR1cm4oMCk7fQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjczOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi1AQCAtNzY2LDEyICs3NjEsMTIgQEAKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gZmkKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc3MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NjU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLSBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLSBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc3NTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NzA6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNzgwLDcgKzc3NSw3IEBACi0gICB5ZXM7Ci0gI2VuZGlmCi0gRU9GCi0taWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0raWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc3OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBhY19jdl9wcm9nX2djYz15ZXMKLSBlbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotQEAgLTc5OSw3ICs3OTQsNyBAQAotIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotIENGTEFHUz0KLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4MDM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc5ODogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTgzMSw3ICs4MjYsNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4MzU6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLStlY2hvICJjb25maWd1cmU6ODMwOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0gIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLSBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICAgQ1BQPQotQEAgLTg0NiwxMyArODQxLDEzIEBACi0gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4NTAgImNvbmZpZ3VyZSIKLSsjbGluZSA4NDUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gU3ludGF4IEVycm9yCi0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjg1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjg1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIDoKLUBAIC04NjMsMTMgKzg1OCwxMyBAQAotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDg2NyAiY29uZmlndXJlIgotKyNsaW5lIDg2MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhc3NlcnQuaD4KLSBTeW50YXggRXJyb3IKLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODczOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODY4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgOgotQEAgLTg4MCwxMyArODc1LDEzIEBACi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODg0ICJjb25maWd1cmUiCi0rI2xpbmUgODc5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFzc2VydC5oPgotIFN5bnRheCBFcnJvcgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4OTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICA6Ci1AQCAtOTExLDkgKzkwNiw5IEBACi0gZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQUlYIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6OTE1OiBjaGVja2luZyBmb3IgQUlYIiA+JjUKLStlY2hvICJjb25maWd1cmU6OTEwOiBjaGVja2luZyBmb3IgQUlYIiA+JjUKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgOTE3ICJjb25maWd1cmUiCi0rI2xpbmUgOTEyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2lmZGVmIF9BSVgKLSAgIHllcwotQEAgLTkzNSw3ICs5MzAsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6OTM5OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjkzNDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotIGlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotIHRoZW4KLUBAIC05NTksNyArOTU0LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHtDQy1jY30gb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5NjM6IGNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjk1ODogY2hlY2tpbmcgZm9yICR7Q0MtY2N9IG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfcHJvZ19jY19zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTk3Niw3ICs5NzEsNyBAQAotIGRvCi0gICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA5ODAgImNvbmZpZ3VyZSIKLSsjbGluZSA5NzUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkYXJnLmg+Ci0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtMTAxMyw3ICsxMDA4LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDEyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhbV9jdl9wcm9nX2NjX3N0ZGM9IiRhY19hcmciOyBicmVhawotIGVsc2UKLUBAIC0xMDM3LDYgKzEwMzIsMTQxIEBACi0gZXNhYwotIAotIAotKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYWlmIG9yIC0td2l0aG91dC1haWYgd2FzIGdpdmVuLgotK2lmIHRlc3QgIiR7d2l0aF9haWYrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIHdpdGh2YWw9IiR3aXRoX2FpZiIKLSsgIDoKLStmaQotKwotKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYWlmLWxpYiBvciAtLXdpdGhvdXQtYWlmLWxpYiB3YXMgZ2l2ZW4uCi0raWYgdGVzdCAiJHt3aXRoX2FpZl9saWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIHdpdGh2YWw9IiR3aXRoX2FpZl9saWIiCi0rICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIiAtbyAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBObyBhcmd1bWVudCBmb3IgLS13aXRoLWFpZi1saWIiIDE+JjI7IGV4aXQgMTsgfQotK2VsaWYgdGVzdCAiWCR3aXRoX2FpZiIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfYWlmPXllcwotK2ZpCi0rZmkKLSsKLSsjIENoZWNrIHdoZXRoZXIgLS13aXRoLWFpZi1pbmNsdWRlIG9yIC0td2l0aG91dC1haWYtaW5jbHVkZSB3YXMgZ2l2ZW4uCi0raWYgdGVzdCAiJHt3aXRoX2FpZl9pbmNsdWRlK3NldH0iID0gc2V0OyB0aGVuCi0rICB3aXRodmFsPSIkd2l0aF9haWZfaW5jbHVkZSIKLSsgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0rICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IE5vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWluY2x1ZGUiIDE+JjI7IGV4aXQgMTsgfQotK2VsaWYgdGVzdCAiWCR3aXRoX2FpZiIgPSAiWCI7IHRoZW4KLSsgIHdpdGhfYWlmPXllcwotK2ZpCi0rZmkKLSsKLSsKLStlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWlmIiIuLi4gJGFjX2MiIDE+JjYKLStlY2hvICJjb25maWd1cmU6MTA2NDogY2hlY2tpbmcgZm9yIGFpZiIgPiY1Ci0rCi0rY2FzZSAiJHdpdGhfYWlmIiBpbgotK3llcykJOzsKLStubykJOzsKLSsiIikJOzsKLSsqKQlpZiB0ZXN0ICIkd2l0aF9haWZfaW5jbHVkZSIgPSAiIjsgdGhlbgotKwkJd2l0aF9haWZfaW5jbHVkZT0iJHdpdGhfYWlmL2luY2x1ZGUiCi0rCWZpCi0rCWlmIHRlc3QgIiR3aXRoX2FpZl9saWIiID0gIiI7IHRoZW4KLSsJCXdpdGhfYWlmX2xpYj0iJHdpdGhfYWlmL2xpYiRhYmlsaWJkaXJleHQiCi0rCWZpCi0rCTs7Ci0rZXNhYwotK2hlYWRlcl9kaXJzPQotK2xpYl9kaXJzPQotK2Q9Jy91c3IvbG9jYWwnCi0rZm9yIGkgaW4gJGQgL3VzcjsgZG8KLSsJaGVhZGVyX2RpcnM9IiRoZWFkZXJfZGlycyAkaS9pbmNsdWRlIgotKwlsaWJfZGlycz0iJGxpYl9kaXJzICRpL2xpYiRhYmlsaWJkaXJleHQiCi0rZG9uZQotKwotK2Nhc2UgIiR3aXRoX2FpZl9pbmNsdWRlIiBpbgotK3llcykgOzsKLStubykgIDs7Ci0rKikgICBoZWFkZXJfZGlycz0iJHdpdGhfYWlmX2luY2x1ZGUgJGhlYWRlcl9kaXJzIjs7Ci0rZXNhYwotK2Nhc2UgIiR3aXRoX2FpZl9saWIiIGluCi0reWVzKSA7OwotK25vKSAgOzsKLSsqKSAgIGxpYl9kaXJzPSIkd2l0aF9haWZfbGliICRsaWJfZGlycyI7OwotK2VzYWMKLSsKLStzYXZlX0NGTEFHUz0iJENGTEFHUyIKLStzYXZlX0xJQlM9IiRMSUJTIgotK2lyZXM9IGxyZXM9Ci0rZm9yIGkgaW4gJGhlYWRlcl9kaXJzOyBkbwotKwlDRkxBR1M9Ii1JJGkgJHNhdmVfQ0ZMQUdTIgotKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0rI2xpbmUgMTEwMyAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyNpbmNsdWRlIDxhaWYuaD4KLStpbnQgbWFpbigpIHsKLSsKLSs7IHJldHVybiAwOyB9Ci0rRU9GCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0rICBybSAtcmYgY29uZnRlc3QqCi0rICBpcmVzPSRpO2JyZWFrCi0rZWxzZQotKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSsgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotK2ZpCi0rcm0gLWYgY29uZnRlc3QqCi0rZG9uZQotK2ZvciBpIGluICRsaWJfZGlyczsgZG8KLSsJTElCUz0iLUwkaSAtbGFpZiAkc2F2ZV9MSUJTIgotKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0rI2xpbmUgMTEyMiAiY29uZmlndXJlIgotKyNpbmNsdWRlICJjb25mZGVmcy5oIgotKyNpbmNsdWRlIDxhaWYuaD4KLStpbnQgbWFpbigpIHsKLSsKLSs7IHJldHVybiAwOyB9Ci0rRU9GCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSsgIHJtIC1yZiBjb25mdGVzdCoKLSsgIGxyZXM9JGk7YnJlYWsKLStlbHNlCi0rICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rZmkKLStybSAtZiBjb25mdGVzdCoKLStkb25lCi0rQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0rTElCUz0iJHNhdmVfTElCUyIKLSsKLStpZiB0ZXN0ICIkaXJlcyIgLWEgIiRscmVzIiAtYSAiJHdpdGhfYWlmIiAhPSAibm8iOyB0aGVuCi0rCWFpZl9pbmNsdWRlZGlyPSIkaXJlcyIKLSsJYWlmX2xpYmRpcj0iJGxyZXMiCi0rCURJUl9haWY9Ci0rCUlOQ0xVREVfYWlmPSItSSRhaWZfaW5jbHVkZWRpciIKLSsJTElCX2FpZj0iLUwkYWlmX2xpYmRpciAtbGFpZiIKLSsJY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSsjZGVmaW5lIEhBVkVfQUlGIDEKLStFT0YKLSsKLSsJd2l0aF9haWY9eWVzCi0rCWVjaG8gIiRhY190IiJoZWFkZXJzICRpcmVzLCBsaWJyYXJpZXMgJGxyZXMiIDE+JjYKLStlbHNlCi0rCURJUl9haWY9ImFpZiIKLSsJSU5DTFVERV9haWY9Ci0rCUxJQl9haWY9Ci0rCXdpdGhfYWlmPW5vCi0rCWVjaG8gIiRhY190IiIkd2l0aF9haWYiIDE+JjYKLStmaQotKwotKwotKwotKwotK2lmIHRlc3QgIiR3aXRoX2FpZiIgPSAibm8iOyB0aGVuCi0rICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFlvdSBtdXN0IGhhdmUgbGliYWlmIHRvIGNvbXBpbGUgdGhpcyB2ZXJzaW9uIG9mIEdEQi4iIDE+JjI7IGV4aXQgMTsgfQotK2ZpCi0rY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rI2RlZmluZSBIQVZFX0FJRiAxCi0rRU9GCi0rCi0gYWNfYXV4X2Rpcj0KLSBmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uOyBkbwotICAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLUBAIC0xMDg0LDcgKzEyMTQsNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjEwODg6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxMjE4OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSAKLSBob3N0X2FsaWFzPSRob3N0Ci0gY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1AQCAtMTEwNSw3ICsxMjM1LDcgQEAKLSBlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMTA5OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxMjM5OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotIAotIHRhcmdldF9hbGlhcz0kdGFyZ2V0Ci0gY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLUBAIC0xMTIzLDcgKzEyNTMsNyBAQAotIGVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEyNTc6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLSAKLSBidWlsZF9hbGlhcz0kYnVpbGQKLSBjYXNlICIkYnVpbGRfYWxpYXMiIGluCi1AQCAtMTE0OCw3ICsxMjc4LDcgQEAKLSAKLSBBTExfTElOR1VBUz0KLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTE1MjogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEyODI6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotIHNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtMTE3Nyw3ICsxMzA3LDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjExODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEzMTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTEyMDUsMTIgKzEzMzUsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTIwOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxMzM5OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEyMTQgImNvbmZpZ3VyZSIKLSsjbGluZSAxMzQ0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdGRhcmcuaD4KLUBAIC0xMjE4LDcgKzEzNDgsNyBAQAotICNpbmNsdWRlIDxmbG9hdC5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0xMjM1LDcgKzEzNjUsNyBAQAotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEyMzkgImNvbmZpZ3VyZSIKLSsjbGluZSAxMzY5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0cmluZy5oPgotIEVPRgotQEAgLTEyNTMsNyArMTM4Myw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTI1NyAiY29uZmlndXJlIgotKyNsaW5lIDEzODcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gRU9GCi1AQCAtMTI3NCw3ICsxNDA0LDcgQEAKLSAgIDoKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTI3OCAiY29uZmlndXJlIgotKyNsaW5lIDE0MDggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Y3R5cGUuaD4KLSAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLUBAIC0xMjg1LDcgKzE0MTUsNyBAQAotIGV4aXQgKDApOyB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgOgotIGVsc2UKLUBAIC0xMzA5LDEyICsxNDM5LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjEzMTM6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLStlY2hvICJjb25maWd1cmU6MTQ0MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEzMTggImNvbmZpZ3VyZSIKLSsjbGluZSAxNDQ4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtMTM2Myw3ICsxNDkzLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jX2NvbnN0PXllcwotIGVsc2UKLUBAIC0xMzg0LDIxICsxNTE0LDIxIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTM4ODogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE1MTg6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGFjX2N2X2NfaW5saW5lPW5vCi0gZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEzOTUgImNvbmZpZ3VyZSIKLSsjbGluZSAxNTI1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci0gfSAkYWNfa3cgZm9vKCkgewotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLSBlbHNlCi1AQCAtMTQyNCwxMiArMTU1NCwxMiBAQAotIGVzYWMKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNDI4OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxNTU4OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE0MzMgImNvbmZpZ3VyZSIKLSsjbGluZSAxNTYzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpZiBTVERDX0hFQURFUlMKLUBAIC0xNDU3LDEyICsxNTg3LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTQ2MTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE1OTE6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNDY2ICJjb25maWd1cmUiCi0rI2xpbmUgMTU5NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaWYgU1REQ19IRUFERVJTCi1AQCAtMTQ5MiwxOSArMTYyMiwxOSBAQAotICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0gIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE0OTY6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTYyNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTUwMSAiY29uZmlndXJlIgotKyNsaW5lIDE2MzEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YWxsb2NhLmg+Ci0gaW50IG1haW4oKSB7Ci0gY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi0gZWxzZQotQEAgLTE1MjUsMTIgKzE2NTUsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNTI5OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTY1OTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE1MzQgImNvbmZpZ3VyZSIKLSsjbGluZSAxNjY0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2lmZGVmIF9fR05VQ19fCi1AQCAtMTU1OCw3ICsxNjg4LDcgQEAKLSBjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLSBlbHNlCi1AQCAtMTU5MCwxMiArMTcyMCwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNTk0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTcyNDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTU5OSAiY29uZmlndXJlIgotKyNsaW5lIDE3MjkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi0gd2ViZWNyYXkKLUBAIC0xNjIwLDEyICsxNzUwLDEyIEBACi0gaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE2MjQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE3NTQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTYyOSAiY29uZmlndXJlIgotKyNsaW5lIDE3NTkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTE2NDgsNyArMTc3OCw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC0xNjc1LDcgKzE4MDUsNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE2Nzk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxODA5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMTY4Myw3ICsxODEzLDcgQEAKLSAgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTY4NyAiY29uZmlndXJlIgotKyNsaW5lIDE4MTcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotIHsKLUBAIC0xNzAyLDcgKzE4MzIsNyBAQAotICAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi0gZWxzZQotQEAgLTE3MjcsMTcgKzE4NTcsMTcgQEAKLSBkbwotIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTczMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxODYxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNzM2ICJjb25maWd1cmUiCi0rI2xpbmUgMTg2NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDwkYWNfaGRyPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTg3MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0xNzY2LDEyICsxODk2LDEyIEBACi0gZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLSBkbwotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE3NzA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTc3NSAiY29uZmlndXJlIgotKyNsaW5lIDE5MDUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTE3OTQsNyArMTkyNCw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTI4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC0xODE5LDcgKzE5NDksNyBAQAotIGRvbmUKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTgyMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE5NTM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTE4MjcsNyArMTk1Nyw3IEBACi0gICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE4MzEgImNvbmZpZ3VyZSIKLSsjbGluZSAxOTYxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi1AQCAtMTk2Nyw3ICsyMDk3LDcgQEAKLSB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLSBlbHNlCi1AQCAtMTk5NSwxNyArMjEyNSwxNyBAQAotIGRvCi0gYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxOTk5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIxMjk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIwMDQgImNvbmZpZ3VyZSIKLSsjbGluZSAyMTM0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZHI+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjIwMDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTIwMzUsMTIgKzIxNjUsMTIgQEAKLSBfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjAzOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjE2OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMDQ0ICJjb25maWd1cmUiCi0rI2xpbmUgMjE3NCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMjA2Myw3ICsyMTkzLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTIwOTIsMTIgKzIyMjIsMTIgQEAKLSAgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjA5NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjIyNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMTAxICJjb25maWd1cmUiCi0rI2xpbmUgMjIzMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMjEyMCw3ICsyMjUwLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTIxNTQsMTkgKzIyODQsMTkgQEAKLSAKLSAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjE1ODogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjI4ODogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIxNjMgImNvbmZpZ3VyZSIKLSsjbGluZSAyMjkzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxvY2FsZS5oPgotIGludCBtYWluKCkgewotIHJldHVybiBMQ19NRVNTQUdFUwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi0gZWxzZQotQEAgLTIxODcsNyArMjMxNyw3IEBACi0gICAgIGZpCi0gICBmaQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIxOTE6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIzMjE6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLUBAIC0yMjA3LDcgKzIzMzcsNyBAQAotIEVPRgotIAotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMjExOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjM0MTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLUBAIC0yMjI2LDE3ICsyMzU2LDE3IEBACi0gCi0gCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIyMzA6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyMzYwOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIyMzUgImNvbmZpZ3VyZSIKLSsjbGluZSAyMzY1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpYmludGwuaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMjI1MywxOSArMjM4MywxOSBAQAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjI1NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIzODc6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMjYyICJjb25maWd1cmUiCi0rI2xpbmUgMjM5MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0gaW50IG1haW4oKSB7Ci0gcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLSBlbHNlCi1AQCAtMjI4MSw3ICsyNDExLDcgQEAKLSAKLSAJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotIAkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMjg1OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjQxNTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTIyODksNyArMjQxOSw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1saW50bCAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIyOTMgImNvbmZpZ3VyZSIKLSsjbGluZSAyNDIzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtMjMwMCw3ICsyNDMwLDcgQEAKLSBiaW5kdGV4dGRvbWFpbigpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTIzMTYsMTkgKzI0NDYsMTkgQEAKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIzMjA6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNDUwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjMyNSAiY29uZmlndXJlIgotKyNsaW5lIDI0NTUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSByZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotIGVsc2UKLUBAIC0yMzU2LDcgKzI0ODYsNyBAQAotIAkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIzNjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI0OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTIzOTAsMTIgKzI1MjAsMTIgQEAKLSAJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjM5NDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjUyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMzk5ICJjb25maWd1cmUiCi0rI2xpbmUgMjUyOSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMjQxOCw3ICsyNTQ4LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTI0NDUsNyArMjU3NSw3IEBACi0gCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjQ0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjU3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI0ODEsNyArMjYxMSw3IEBACi0gCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNDg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNjE1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI1MTMsNyArMjY0Myw3IEBACi0gZmkKLSAKLSAJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNTE3ICJjb25maWd1cmUiCi0rI2xpbmUgMjY0NyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotQEAgLTI1MjEsNyArMjY1MSw3IEBACi0gCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUyNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIENBVE9CSkVYVD0uZ21vCi0gCQkgICBEQVRBRElSTkFNRT1zaGFyZQotQEAgLTI1NTMsNyArMjY4Myw3IEBACi0gICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI1NTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI2ODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI1ODcsNyArMjcxNyw3IEBACi0gICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjU5MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjcyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI2MjMsNyArMjc1Myw3IEBACi0gICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNjI3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNzU3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTI3MTMsNyArMjg0Myw3IEBACi0gICAgICAgIExJTkdVQVM9Ci0gICAgICBlbHNlCi0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNzE3OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mjg0NzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi1AQCAtMjc0MSwxNyArMjg3MSwxNyBAQAotICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0gCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNzQ1OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mjg3NTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNzUwICJjb25maWd1cmUiCi0rI2xpbmUgMjg4MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjI3NTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODg1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTI4NjksMTIgKzI5OTksMTIgQEAKLSAKLSBmaQotIAotLWZvciBhY19wcm9nIGluIG1hd2sgZ2F3ayBuYXdrIGF3awotK2ZvciBhY19wcm9nIGluIGdhd2sgbWF3ayBuYXdrIGF3awotIGRvCi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mjg3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzAwODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BV0snK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjkxNSw3ICszMDQ1LDcgQEAKLSAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0gIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI5MTk6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMDQ5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLSBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtMjk3Niw3ICszMTA2LDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mjk4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzExMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0zMDA4LDcgKzMxMzgsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwMTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMxNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMwNDAsNyArMzE3MCw3IEBACi0gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwNDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMxNzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMwNzUsNyArMzIwNSw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozMDc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMjA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMzEwNyw3ICszMjM3LDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9d2luZHJlczsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMxMTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMyNDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfV0lORFJFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0zMTQxLDcgKzMyNzEsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMxNDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMyNzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0zMTc1LDcgKzMzMDUsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1taWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW1pZzsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMxNzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMzMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTUlHJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMyMjYsMTIgKzMzNTYsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozMjMwOiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMzYwOiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzMjM1ICJjb25maWd1cmUiCi0rI2xpbmUgMzM2NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaW5jbHVkZSA8c2lnbmFsLmg+Ci1AQCAtMzI0OCw3ICszMzc4LDcgQEAKLSBpbnQgaTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjUyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi0gZWxzZQotQEAgLTMyNjgsMTIgKzMzOTgsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMyNzI6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzQwMjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzMjc3ICJjb25maWd1cmUiCi0rI2xpbmUgMzQwNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAjaW5jbHVkZSA8c3RkYXJnLmg+Ci1AQCAtMzI4MSw3ICszNDExLDcgQEAKLSAjaW5jbHVkZSA8ZmxvYXQuaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI4NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMzI5OCw3ICszNDI4LDcgQEAKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzMzAyICJjb25maWd1cmUiCi0rI2xpbmUgMzQzMiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLSBFT0YKLUBAIC0zMzE2LDcgKzM0NDYsNyBAQAotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMzMjAgImNvbmZpZ3VyZSIKLSsjbGluZSAzNDUwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotIEVPRgotQEAgLTMzMzcsNyArMzQ2Nyw3IEBACi0gICA6Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMzNDEgImNvbmZpZ3VyZSIKLSsjbGluZSAzNDcxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGN0eXBlLmg+Ci0gI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi1AQCAtMzM0OCw3ICszNDc4LDcgQEAKLSBleGl0ICgwKTsgfQotIAotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIDoKLSBlbHNlCi1AQCAtMzM5MiwxNyArMzUyMiwxNyBAQAotIGRvCi0gYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozMzk2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM1MjY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM0MDEgImNvbmZpZ3VyZSIKLSsjbGluZSAzNTMxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZHI+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjM0MDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTM2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTM0MjksMTIgKzM1NTksMTIgQEAKLSBkb25lCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM0MzM6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQotK2VjaG8gImNvbmZpZ3VyZTozNTYzOiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM0MzggImNvbmZpZ3VyZSIKLSsjbGluZSAzNTY4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotQEAgLTM0ODYsMTIgKzM2MTYsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM0OTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLStlY2hvICJjb25maWd1cmU6MzYyMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM0OTUgImNvbmZpZ3VyZSIKLSsjbGluZSAzNjI1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtMzU0MCw3ICszNjcwLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTQ0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjc0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jX2NvbnN0PXllcwotIGVsc2UKLUBAIC0zNTY1LDEyICszNjk1LDEyIEBACi0gCXJlYWxwYXRoIHNicmsgc2V0cGdpZCBzZXRwZ3JwIHNpZ2FjdGlvbiBzaWdwcm9jbWFzayBzaWdzZXRtYXNrIAotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzU2OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzY5OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzNTc0ICJjb25maWd1cmUiCi0rI2xpbmUgMzcwNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMzU5Myw3ICszNzIzLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTM2MjAsMTkgKzM3NTAsMTkgQEAKLSAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotICMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNjI0OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM3NTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM2MjkgImNvbmZpZ3VyZSIKLSsjbGluZSAzNzU5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFsbG9jYS5oPgotIGludCBtYWluKCkgewotIGNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotIGVsc2UKLUBAIC0zNjUzLDEyICszNzgzLDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzY1NzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM3ODc6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzNjYyICJjb25maWd1cmUiCi0rI2xpbmUgMzc5MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpZmRlZiBfX0dOVUNfXwotQEAgLTM2ODYsNyArMzgxNiw3IEBACi0gY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi0gZWxzZQotQEAgLTM3MTgsMTIgKzM4NDgsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzcyMjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM4NTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM3MjcgImNvbmZpZ3VyZSIKLSsjbGluZSAzODU3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotIHdlYmVjcmF5Ci1AQCAtMzc0OCwxMiArMzg3OCwxMiBAQAotIGlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLSBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNzUyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozODgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM3NTcgImNvbmZpZ3VyZSIKLSsjbGluZSAzODg3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0zNzc2LDcgKzM5MDYsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMzgwMyw3ICszOTMzLDcgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozODA3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzkzNzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTM4MTEsNyArMzk0MSw3IEBACi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM4MTUgImNvbmZpZ3VyZSIKLSsjbGluZSAzOTQ1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLSB7Ci1AQCAtMzgzMCw3ICszOTYwLDcgQEAKLSAgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLSB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotIGVsc2UKLUBAIC0zODUyLDEyICszOTgyLDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcGlkX3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozODU2OiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozOTg2OiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3BpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM4NjEgImNvbmZpZ3VyZSIKLSsjbGluZSAzOTkxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpZiBTVERDX0hFQURFUlMKLUBAIC0zODg2LDE3ICs0MDE2LDE3IEBACi0gCi0gYWNfc2FmZT1gZWNobyAidmZvcmsuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozODkwOiBjaGVja2luZyBmb3IgdmZvcmsuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQwMjA6IGNoZWNraW5nIGZvciB2Zm9yay5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM4OTUgImNvbmZpZ3VyZSIKLSsjbGluZSA0MDI1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHZmb3JrLmg+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjM5MDA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDMwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTM5MjEsMTggKzQwNTEsMTggQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzkyNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0MDU1OiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdmZvcmtfd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzkzMTogY2hlY2tpbmcgZm9yIHZmb3JrIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDA2MTogY2hlY2tpbmcgZm9yIHZmb3JrIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9yaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzOTM2ICJjb25maWd1cmUiCi0rI2xpbmUgNDA2NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciB2Zm9yaygpOyBiZWxvdy4gICovCi1AQCAtMzk1NSw3ICs0MDg1LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY192Zm9yaz15ZXMiCi0gZWxzZQotQEAgLTM5NzcsNyArNDEwNyw3IEBACi0gYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yawotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAzOTgxICJjb25maWd1cmUiCi0rI2xpbmUgNDExMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFRoYW5rcyB0byBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LiAgKi8KLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00MDcyLDcgKzQyMDIsNyBAQAotICAgfQotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotIGVsc2UKLUBAIC00MDk2LDcgKzQyMjYsNyBAQAotIAotIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbm87IHRoZW4KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc2V0cGdycCB0YWtlcyBubyBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQxMDA6IGNoZWNraW5nIHdoZXRoZXIgc2V0cGdycCB0YWtlcyBubyBhcmd1bWVudCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQyMzA6IGNoZWNraW5nIHdoZXRoZXIgc2V0cGdycCB0YWtlcyBubyBhcmd1bWVudCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfc2V0cGdycF92b2lkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTQxMDQsNyArNDIzNCw3IEBACi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBjaGVjayBzZXRwZ3JwIGlmIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQxMDggImNvbmZpZ3VyZSIKLSsjbGluZSA0MjM4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2lmZGVmIEhBVkVfVU5JU1REX0gKLUBAIC00MTI0LDcgKzQyNTQsNyBAQAotIH0KLSAKLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBhY19jdl9mdW5jX3NldHBncnBfdm9pZD1ubwotIGVsc2UKLUBAIC00MTQ5LDEyICs0Mjc5LDEyIEBACi0gCi0gZWxzZQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDE1MzogY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiA+JjUKLStlY2hvICJjb25maWd1cmU6NDI4MzogY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDE1OCAiY29uZmlndXJlIgotKyNsaW5lIDQyODggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8dW5pc3RkLmg+Ci1AQCAtNDE2OCw3ICs0Mjk4LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTcyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzAyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9mdW5jX3NldHBncnBfdm9pZD1ubwotIGVsc2UKLUBAIC00MTkyLDEyICs0MzIyLDEyIEBACi0gIyBDaGVjayBpZiBzaWdzZXRqbXAgaXMgYXZhaWxhYmxlLiAgVXNpbmcgQUNfQ0hFQ0tfRlVOQ1Mgd29uJ3QgZG8KLSAjIHNpbmNlIHNpZ3NldGptcCBtaWdodCBvbmx5IGJlIGRlZmluZWQgYXMgYSBtYWNyby4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2lnc2V0am1wIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDE5NjogY2hlY2tpbmcgZm9yIHNpZ3NldGptcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQzMjY6IGNoZWNraW5nIGZvciBzaWdzZXRqbXAiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfZnVuY19zaWdzZXRqbXAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDIwMSAiY29uZmlndXJlIgotKyNsaW5lIDQzMzEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c2V0am1wLmg+Ci1AQCAtNDIwNiw3ICs0MzM2LDcgQEAKLSBzaWdqbXBfYnVmIGVudjsgd2hpbGUgKCEgc2lnc2V0am1wIChlbnYsIDEpKSBzaWdsb25nam1wIChlbnYsIDEpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyMTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9mdW5jX3NpZ3NldGptcD15ZXMKLSBlbHNlCi1AQCAtNDIyOSwxOSArNDM1OSwxOSBAQAotICMgU2VlIGlmIDxtYWNoaW5lL3JlZy5oPiBzdXBwb3J0cyB0aGUgJWZzIGFuZCAlZ3MgaTM4NiBzZWdtZW50IHJlZ2lzdGVycy4KLSAjIE9sZGVyIGkzODYgQlNEJ3MgZG9uJ3QgaGF2ZSB0aGUgcl9mcyBhbmQgcl9ncyBtZW1iZXJzIG9mIGBzdHJ1Y3QgcmVnJy4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igcl9mcyBpbiBzdHJ1Y3QgcmVnIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDIzMzogY2hlY2tpbmcgZm9yIHJfZnMgaW4gc3RydWN0IHJlZyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQzNjM6IGNoZWNraW5nIGZvciByX2ZzIGluIHN0cnVjdCByZWciID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQyMzggImNvbmZpZ3VyZSIKLSsjbGluZSA0MzY4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0gaW50IG1haW4oKSB7Ci0gc3RydWN0IHJlZyByOyByLnJfZnM7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM3NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X3N0cnVjdF9yZWdfcl9mcz15ZXMKLSBlbHNlCi1AQCAtNDI2MSwxOSArNDM5MSwxOSBAQAotIAotIGZpCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJfZ3MgaW4gc3RydWN0IHJlZyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQyNjU6IGNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWciID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0Mzk1OiBjaGVja2luZyBmb3Igcl9ncyBpbiBzdHJ1Y3QgcmVnIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MjcwICJjb25maWd1cmUiCi0rI2xpbmUgNDQwMCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotIGludCBtYWluKCkgewotIHN0cnVjdCByZWcgcjsgci5yX2dzOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZ3M9eWVzCi0gZWxzZQotQEAgLTQyOTUsMTkgKzQ0MjUsMTkgQEAKLSAKLSAjIFNlZSBpZiA8c3lzL3B0cmFjZS5oPiBwcm92aWRlcyB0aGUgUFRSQUNFX0dFVFJFR1MgcmVxdWVzdC4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgUFRSQUNFX0dFVFJFR1MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0Mjk5OiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVFJFR1MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NDI5OiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVFJFR1MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0cmVncycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MzA0ICJjb25maWd1cmUiCi0rI2xpbmUgNDQzNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0gaW50IG1haW4oKSB7Ci0gUFRSQUNFX0dFVFJFR1M7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMxMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ0MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfcHRyYWNlX2dldHJlZ3M9eWVzCi0gZWxzZQotQEAgLTQzMjksMTkgKzQ0NTksMTkgQEAKLSAKLSAjIFNlZSBpZiA8c3lzL3B0cmFjZS5oPiBwcm92aWRlcyB0aGUgUFRSQUNFX0dFVEZQWFJFR1MgcmVxdWVzdC4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgUFRSQUNFX0dFVEZQWFJFR1MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0MzMzOiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVEZQWFJFR1MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NDYzOiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVEZQWFJFR1MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0ZnB4cmVncycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MzM4ICJjb25maWd1cmUiCi0rI2xpbmUgNDQ2OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0gaW50IG1haW4oKSB7Ci0gUFRSQUNFX0dFVEZQWFJFR1M7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ3NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfcHRyYWNlX2dldGZweHJlZ3M9eWVzCi0gZWxzZQotQEAgLTQzNjMsMTIgKzQ0OTMsMTIgQEAKLSAKLSAjIFNlZSBpZiA8c3lzL3B0cmFjZS5oPiBwcm92aWRlcyB0aGUgUFRfR0VUREJSRUdTIHJlcXVlc3QuCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBUX0dFVERCUkVHUyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQzNjc6IGNoZWNraW5nIGZvciBQVF9HRVREQlJFR1MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NDk3OiBjaGVja2luZyBmb3IgUFRfR0VUREJSRUdTIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfcHRfZ2V0ZGJyZWdzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQzNzIgImNvbmZpZ3VyZSIKLSsjbGluZSA0NTAyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci1AQCAtNDM3Niw3ICs0NTA2LDcgQEAKLSBQVF9HRVREQlJFR1M7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM4MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfcHRfZ2V0ZGJyZWdzPXllcwotIGVsc2UKLUBAIC00Mzk4LDEyICs0NTI4LDEyIEBACi0gCi0gIyBTZWUgaWYgPHN5cy9wdHJhY2UuaD4gcHJvdmlkZXMgdGhlIFBUX0dFVFhNTVJFR1MgcmVxdWVzdC4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgUFRfR0VUWE1NUkVHUyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ0MDI6IGNoZWNraW5nIGZvciBQVF9HRVRYTU1SRUdTIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDUzMjogY2hlY2tpbmcgZm9yIFBUX0dFVFhNTVJFR1MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wdF9nZXR4bW1yZWdzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ0MDcgImNvbmZpZ3VyZSIKLSsjbGluZSA0NTM3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci1AQCAtNDQxMSw3ICs0NTQxLDcgQEAKLSBQVF9HRVRYTU1SRUdTOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX3B0X2dldHhtbXJlZ3M9eWVzCi0gZWxzZQotQEAgLTQ0MzMsNyArNDU2Myw3IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNvY2tldHBhaXIgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NDM3OiBjaGVja2luZyBmb3Igc29ja2V0cGFpciBpbiAtbHNvY2tldCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ1Njc6IGNoZWNraW5nIGZvciBzb2NrZXRwYWlyIGluIC1sc29ja2V0IiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ3NvY2tldHBhaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTQ0NDEsNyArNDU3MSw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sc29ja2V0ICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDQ0NSAiY29uZmlndXJlIgotKyNsaW5lIDQ1NzUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC00NDUyLDcgKzQ1ODIsNyBAQAotIHNvY2tldHBhaXIoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC00NDgyLDEyICs0NjEyLDEyIEBACi0gZm9yIGFjX2Z1bmMgaW4gc29ja2V0cGFpcgotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDQ4NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDYxNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NDkxICJjb25maWd1cmUiCi0rI2xpbmUgNDYyMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtNDUxMCw3ICs0NjQwLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTQ1MzcsMTIgKzQ2NjcsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDU0MTogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ2NzE6IGNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ1NDYgImNvbmZpZ3VyZSIKLSsjbGluZSA0Njc2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNDU2Myw3ICs0NjkzLDcgQEAKLSBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBtYWxsb2MKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPW5vCi0gZWxzZQotQEAgLTQ1ODQsMTIgKzQ3MTQsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDU4ODogY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NzE4OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ1OTMgImNvbmZpZ3VyZSIKLSsjbGluZSA0NzIzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNDYxMCw3ICs0NzQwLDcgQEAKLSBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSByZWFsbG9jCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDYxNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc0NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9bm8KLSBlbHNlCi1AQCAtNDYzMSwxMiArNDc2MSwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NjM1OiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ3NjU6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDY0MCAiY29uZmlndXJlIgotKyNsaW5lIDQ3NzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00NjU3LDcgKzQ3ODcsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjYxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzkxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT1ubwotIGVsc2UKLUBAIC00Njc4LDEyICs0ODA4LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NjgyOiBjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0ODEyOiBjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZXJyb3InK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDY4NyAiY29uZmlndXJlIgotKyNsaW5lIDQ4MTcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00NzA0LDcgKzQ4MzQsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cmVycm9yCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcwODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgzODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmVycm9yPW5vCi0gZWxzZQotQEAgLTQ3MjUsMTIgKzQ4NTUsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyZHVwIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NzI5OiBjaGVja2luZyB3aGV0aGVyIHN0cmR1cCBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDg1OTogY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDczNCAiY29uZmlndXJlIgotKyNsaW5lIDQ4NjQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00NzUxLDcgKzQ4ODEsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cmR1cAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4ODU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXA9bm8KLSBlbHNlCi1AQCAtNDc3MiwxMiArNDkwMiwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ3NzY6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0OTA2OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NzgxICJjb25maWd1cmUiCi0rI2xpbmUgNDkxMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQ3OTgsNyArNDkyOCw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3Ryc3RyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgwMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkzMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotIGVsc2UKLUBAIC00ODE5LDEyICs0OTQ5LDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGNhbm9uaWNhbGl6ZV9maWxlX25hbWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ4MjM6IGNoZWNraW5nIHdoZXRoZXIgY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDk1MzogY2hlY2tpbmcgd2hldGhlciBjYW5vbmljYWxpemVfZmlsZV9uYW1lIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfY2Fub25pY2FsaXplX2ZpbGVfbmFtZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0ODI4ICJjb25maWd1cmUiCi0rI2xpbmUgNDk1OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQ4NDUsNyArNDk3NSw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgY2Fub25pY2FsaXplX2ZpbGVfbmFtZQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5Nzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9jYW5vbmljYWxpemVfZmlsZV9uYW1lPW5vCi0gZWxzZQotQEAgLTQ4NzIsOSArNTAwMiw5IEBACi0gIyBjb3VsZCBiZSBleHB1bmdlZC4gLS1qc20gMTk5OS0wMy0yMgotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBIUFVYIHNhdmVfc3RhdGUgc3RydWN0dXJlIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDg3NjogY2hlY2tpbmcgZm9yIEhQVVggc2F2ZV9zdGF0ZSBzdHJ1Y3R1cmUiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MDA2OiBjaGVja2luZyBmb3IgSFBVWCBzYXZlX3N0YXRlIHN0cnVjdHVyZSIgPiY1Ci0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ4NzggImNvbmZpZ3VyZSIKLSsjbGluZSA1MDA4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvc2F2ZV9zdGF0ZS5oPgotIEVPRgotQEAgLTQ4ODksNyArNTAxOSw3IEBACi0gcm0gLWYgY29uZnRlc3QqCi0gCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ4OTMgImNvbmZpZ3VyZSIKLSsjbGluZSA1MDIzICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvc2F2ZV9zdGF0ZS5oPgotIEVPRgotQEAgLTQ5NTksMTIgKzUwODksMTIgQEAKLSAKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDk2MzogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MDkzOiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ5NjggImNvbmZpZ3VyZSIKLSsjbGluZSA1MDk4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNDk3Myw3ICs1MTAzLDcgQEAKLSBwc3RhdHVzX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5Nzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi0gZWxzZQotQEAgLTQ5OTUsMTIgKzUxMjUsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0OTk5OiBjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MTI5OiBjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTAwNCAiY29uZmlndXJlIgotKyNsaW5lIDUxMzQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MDA5LDcgKzUxMzksNyBAQAotIHBycnVuX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnJ1bl90PXllcwotIGVsc2UKLUBAIC01MDMxLDEyICs1MTYxLDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTAzNTogY2hlY2tpbmcgZm9yIGdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MTY1OiBjaGVja2luZyBmb3IgZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZ3JlZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUwNDAgImNvbmZpZ3VyZSIKLSsjbGluZSA1MTcwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNTA0NSw3ICs1MTc1LDcgQEAKLSBncmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwNDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTUwNjcsMTIgKzUxOTcsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZ3JlZ3NldF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MDcxOiBjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MjAxOiBjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTA3NiAiY29uZmlndXJlIgotKyNsaW5lIDUyMDYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MDgxLDcgKzUyMTEsNyBAQAotIGZwcmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwODU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90PXllcwotIGVsc2UKLUBAIC01MTAzLDEyICs1MjMzLDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MTA3OiBjaGVja2luZyBmb3IgcHJncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTIzNzogY2hlY2tpbmcgZm9yIHByZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTExMiAiY29uZmlndXJlIgotKyNsaW5lIDUyNDIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MTE3LDcgKzUyNDcsNyBAQAotIHByZ3JlZ3NldF90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTUxMzksMTIgKzUyNjksMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTE0MzogY2hlY2tpbmcgZm9yIHByZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MjczOiBjaGVja2luZyBmb3IgcHJmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUxNDggImNvbmZpZ3VyZSIKLSsjbGluZSA1Mjc4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNTE1Myw3ICs1MjgzLDcgQEAKLSBwcmZwcmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTUxNzUsMTIgKzUzMDUsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJncmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MTc5OiBjaGVja2luZyBmb3IgcHJncmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MzA5OiBjaGVja2luZyBmb3IgcHJncmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldDMyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTE4NCAiY29uZmlndXJlIgotKyNsaW5lIDUzMTQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MTg5LDcgKzUzMTksNyBAQAotIHByZ3JlZ3NldDMyX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxOTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXQzMl90PXllcwotIGVsc2UKLUBAIC01MjExLDEyICs1MzQxLDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldDMyX3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmZwcmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MjE1OiBjaGVja2luZyBmb3IgcHJmcHJlZ3NldDMyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTM0NTogY2hlY2tpbmcgZm9yIHByZnByZWdzZXQzMl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldDMyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTIyMCAiY29uZmlndXJlIgotKyNsaW5lIDUzNTAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MjI1LDcgKzUzNTUsNyBAQAotIHByZnByZWdzZXQzMl90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjI5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzU5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldDMyX3Q9eWVzCi0gZWxzZQotQEAgLTUyNDcsMTIgKzUzNzcsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJmcHJlZ3NldDMyX3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BpZF90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUyNTE6IGNoZWNraW5nIGZvciBsd3BpZF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUzODE6IGNoZWNraW5nIGZvciBsd3BpZF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwaWRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MjU2ICJjb25maWd1cmUiCi0rI2xpbmUgNTM4NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUyNjEsNyArNTM5MSw3IEBACi0gbHdwaWRfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTI2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTM5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cGlkX3Q9eWVzCi0gZWxzZQotQEAgLTUyODMsMTIgKzU0MTMsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwaWRfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzYWRkcl90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUyODc6IGNoZWNraW5nIGZvciBwc2FkZHJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NDE3OiBjaGVja2luZyBmb3IgcHNhZGRyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2FkZHJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MjkyICJjb25maWd1cmUiCi0rI2xpbmUgNTQyMiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUyOTcsNyArNTQyNyw3IEBACi0gcHNhZGRyX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0MzE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2FkZHJfdD15ZXMKLSBlbHNlCi1AQCAtNTMxOSwxMiArNTQ0OSwxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2FkZHJfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3lzZW50X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTMyMzogY2hlY2tpbmcgZm9yIHByc3lzZW50X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTQ1MzogY2hlY2tpbmcgZm9yIHByc3lzZW50X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUzMjggImNvbmZpZ3VyZSIKLSsjbGluZSA1NDU4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNTMzMyw3ICs1NDYzLDcgQEAKLSBwcnN5c2VudF90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzeXNlbnRfdD15ZXMKLSBlbHNlCi1AQCAtNTM1NSwxMiArNTQ4NSwxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJfc2lnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTM1OTogY2hlY2tpbmcgZm9yIHByX3NpZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU0ODk6IGNoZWNraW5nIGZvciBwcl9zaWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUzNjQgImNvbmZpZ3VyZSIKLSsjbGluZSA1NDk0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNTM2OSw3ICs1NDk5LDcgQEAKLSBwcl9zaWdzZXRfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTM3MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTUwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ3NldF90PXllcwotIGVsc2UKLUBAIC01MzkxLDEyICs1NTIxLDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ3NldF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJfc2lnYWN0aW9uNjRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1Mzk1OiBjaGVja2luZyBmb3IgcHJfc2lnYWN0aW9uNjRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NTI1OiBjaGVja2luZyBmb3IgcHJfc2lnYWN0aW9uNjRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ2FjdGlvbjY0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTQwMCAiY29uZmlndXJlIgotKyNsaW5lIDU1MzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01NDA1LDcgKzU1MzUsNyBAQAotIHByX3NpZ2FjdGlvbjY0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0MDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1Mzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdhY3Rpb242NF90PXllcwotIGVsc2UKLUBAIC01NDI3LDEyICs1NTU3LDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ2FjdGlvbjY0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcl9zaWdpbmZvNjRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NDMxOiBjaGVja2luZyBmb3IgcHJfc2lnaW5mbzY0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTU2MTogY2hlY2tpbmcgZm9yIHByX3NpZ2luZm82NF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnaW5mbzY0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTQzNiAiY29uZmlndXJlIgotKyNsaW5lIDU1NjYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01NDQxLDcgKzU1NzEsNyBAQAotIHByX3NpZ2luZm82NF90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTc1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnaW5mbzY0X3Q9eWVzCi0gZWxzZQotQEAgLTU0NjgsNyArNTU5OCw3IEBACi0gICAgICAgICAKLSAgIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QgPSB5ZXM7IHRoZW4KLSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBwcmZwcmVnc2V0X3QgdHlwZSBpcyBicm9rZW4iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NDcyOiBjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU2MDI6IGNoZWNraW5nIHdoZXRoZXIgcHJmcHJlZ3NldF90IHR5cGUgaXMgYnJva2VuIiA+JjUKLSAgICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9wcmZwcmVnc2V0X3RfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTU0NzYsNyArNTYwNiw3IEBACi0gICBnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbj15ZXMKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTQ4MCAiY29uZmlndXJlIgotKyNsaW5lIDU2MTAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotICAgICAgICBpbnQgbWFpbiAoKQotQEAgLTU0ODYsNyArNTYxNiw3IEBACi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBnZGJfY3ZfcHJmcHJlZ3NldF90X2Jyb2tlbj1ubwotIGVsc2UKLUBAIC01NTExLDEyICs1NjQxLDEyIEBACi0gCi0gICAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU1MTU6IGNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU2NDU6IGNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTUyMCAiY29uZmlndXJlIgotKyNsaW5lIDU2NTAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotQEAgLTU1MjksNyArNTY1OSw3IEBACi0gICAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTMzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjYzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldD15ZXMKLSBlbHNlCi1AQCAtNTU1MywxOSArNTY4MywxOSBAQAotIGlmIHRlc3QgJHtob3N0fSA9ICR7dGFyZ2V0fSA7IHRoZW4KLSAgICAgCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbWVtYmVyIGxfYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NTU3OiBjaGVja2luZyBmb3IgbWVtYmVyIGxfYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1Njg3OiBjaGVja2luZyBmb3IgbWVtYmVyIGxfYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcF93aXRoX2xfbWVtYmVycycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NTYyICJjb25maWd1cmUiCi0rI2xpbmUgNTY5MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxsaW5rLmg+Ci0gaW50IG1haW4oKSB7Ci0gc3RydWN0IGxpbmtfbWFwIGxtOyAodm9pZCkgbG0ubF9hZGRyOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1Njk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2OTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcF93aXRoX2xfbWVtYmVycz15ZXMKLSBlbHNlCi1AQCAtNTU4NywxMiArNTcxNywxMiBAQAotIAotICAgICAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtZW1iZXIgbG1fYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NTkxOiBjaGVja2luZyBmb3IgbWVtYmVyIGxtX2FkZHIgaW4gc3RydWN0IGxpbmtfbWFwIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTcyMTogY2hlY2tpbmcgZm9yIG1lbWJlciBsbV9hZGRyIGluIHN0cnVjdCBsaW5rX21hcCIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbG1fbWVtYmVycycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NTk2ICJjb25maWd1cmUiCi0rI2xpbmUgNTcyNiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaW5jbHVkZSA8bGluay5oPgotQEAgLTU2MDAsNyArNTczMCw3IEBACi0gc3RydWN0IGxpbmtfbWFwIGxtOyAodm9pZCkgbG0ubG1fYWRkcjsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NzM0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXBfd2l0aF9sbV9tZW1iZXJzPXllcwotIGVsc2UKLUBAIC01NjIyLDEyICs1NzUyLDEyIEBACi0gCi0gICAgIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1lbWJlciBzb21fYWRkciBpbiBzdHJ1Y3Qgc29fbWFwIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTYyNjogY2hlY2tpbmcgZm9yIG1lbWJlciBzb21fYWRkciBpbiBzdHJ1Y3Qgc29fbWFwIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTc1NjogY2hlY2tpbmcgZm9yIG1lbWJlciBzb21fYWRkciBpbiBzdHJ1Y3Qgc29fbWFwIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9zdHJ1Y3Rfc29fbWFwX3dpdGhfc29tX21lbWJlcnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTYzMSAiY29uZmlndXJlIgotKyNsaW5lIDU3NjEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2lmZGVmIEhBVkVfTkxJU1RfSAotQEAgLTU2MzgsNyArNTc2OCw3IEBACi0gc3RydWN0IHNvX21hcCBsbTsgKHZvaWQpIGxtLnNvbV9hZGRyOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2NDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3NzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX3N0cnVjdF9zb19tYXBfd2l0aF9zb21fbWVtYmVycz15ZXMKLSBlbHNlCi1AQCAtNTY2MCwxMiArNTc5MCwxMiBAQAotIAotICAgICAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgbGlua19tYXAzMiBpbiBzeXMvbGluay5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTY2NDogY2hlY2tpbmcgZm9yIHN0cnVjdCBsaW5rX21hcDMyIGluIHN5cy9saW5rLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1Nzk0OiBjaGVja2luZyBmb3Igc3RydWN0IGxpbmtfbWFwMzIgaW4gc3lzL2xpbmsuaCIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwMzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTY2OSAiY29uZmlndXJlIgotKyNsaW5lIDU3OTkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLSAjaW5jbHVkZSA8c3lzL2xpbmsuaD4KLUBAIC01NjczLDcgKzU4MDMsNyBAQAotIHN0cnVjdCBsaW5rX21hcDMyIGw7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY3NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTgwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwMzI9eWVzCi0gZWxzZQotQEAgLTU2OTUsNyArNTgyNSw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbWFpbiBpbiAtbG0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1Njk5OiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbG0iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1ODI5OiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbG0iID4mNQotIGFjX2xpYl92YXI9YGVjaG8gbSdfJ21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTU3MDMsMTQgKzU4MzMsMTQgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxtICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTcwNyAiY29uZmlndXJlIgotKyNsaW5lIDU4MzcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSBtYWluKCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NzE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNTczOSw3ICs1ODY5LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU3NDM6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWxjIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTg3MzogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gYydfJ3djdHlwZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNTc0Nyw3ICs1ODc3LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxjICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTc1MSAiY29uZmlndXJlIgotKyNsaW5lIDU4ODEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC01NzU4LDcgKzU4ODgsNyBAQAotIHdjdHlwZSgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTc2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTU3NzcsNyArNTkwNyw3IEBACi0gZWxzZQotICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHciIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NzgxOiBjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sdyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU5MTE6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWx3IiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIHcnXyd3Y3R5cGUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTU3ODUsNyArNTkxNSw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sdyAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDU3ODkgImNvbmZpZ3VyZSIKLSsjbGluZSA1OTE5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNTc5Niw3ICs1OTI2LDcgQEAKLSB3Y3R5cGUoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4MDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTkzMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC01ODI4LDEyICs1OTU4LDEyIEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTgzMjogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTk2MjogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2NfbG9uZ19sb25nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDU4MzcgImNvbmZpZ3VyZSIKLSsjbGluZSA1OTY3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtNTg0Myw3ICs1OTczLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODQ3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfY19sb25nX2xvbmc9eWVzCi0gZWxzZQotQEAgLTU4NjUsNyArNTk5NSw3IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIHByaW50ZiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU4Njk6IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBwcmludGYiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1OTk5OiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTU4NzMsNyArNjAwMyw3IEBACi0gICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmc9bm8KLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTg3NyAiY29uZmlndXJlIgotKyNsaW5lIDYwMDcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbiAoKSB7Ci1AQCAtNTg4Nyw3ICs2MDE3LDcgQEAKLSAgIHJldHVybiAoc3RyY21wICgiMHgwMTIzNDU2Nzg5YWJjZGVmIiwgYnVmKSk7Ci0gfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjAyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz15ZXMKLSBlbHNlCi1AQCAtNTkxMSwxOSArNjA0MSwxOSBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIGNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTkxNTogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gY29tcGlsZXIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2MDQ1OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBjb21waWxlciIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfbG9uZ19kb3VibGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTkyMCAiY29uZmlndXJlIgotKyNsaW5lIDYwNTAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSBsb25nIGRvdWJsZSBmb287Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTkyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjA1NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfY19sb25nX2RvdWJsZT15ZXMKLSBlbHNlCi1AQCAtNTk0NSw3ICs2MDc1LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1OTQ5OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2MDc5OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC01OTUzLDcgKzYwODMsNyBAQAotICAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGU9bm8KLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTk1NyAiY29uZmlndXJlIgotKyNsaW5lIDYwODcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbiAoKSB7Ci1AQCAtNTk2Myw3ICs2MDkzLDcgQEAKLSAgIHJldHVybiAoc3RybmNtcCAoIjMuMTQxNTkiLCBidWYsIDcpKTsKLSB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MDk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGU9eWVzCi0gZWxzZQotQEAgLTU5ODcsNyArNjExNyw3IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1OTkxOiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBzY2FuZiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYxMjE6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHNjYW5mIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC01OTk1LDcgKzYxMjUsNyBAQAotICAgZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZT1ubwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1OTk5ICJjb25maWd1cmUiCi0rI2xpbmUgNjEyOSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluICgpIHsKLUBAIC02MDA1LDcgKzYxMzUsNyBAQAotICAgcmV0dXJuICEoZiA+IDMuMTQxNTkgJiYgZiA8IDMuMTQxNjApOwotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYwMDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYxMzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPXllcwotIGVsc2UKLUBAIC02MDMxLDE3ICs2MTYxLDE3IEBACi0gZG8KLSBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYwMzU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjE2NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjA0MCAiY29uZmlndXJlIgotKyNsaW5lIDYxNzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8JGFjX2hkcj4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NjA0NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjYxNzU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtNjA3MCwxMiArNjIwMCwxMiBAQAotIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2MDc0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2MjA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDYwNzkgImNvbmZpZ3VyZSIKLSsjbGluZSA2MjA5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC02MDk4LDcgKzYyMjgsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYxMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjIzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtNjEyMyw3ICs2MjUzLDcgQEAKLSBkb25lCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYxMjc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2MjU3OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC02MTMxLDcgKzYyNjEsNyBAQAotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2MTM1ICJjb25maWd1cmUiCi0rI2xpbmUgNjI2NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIC8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotQEAgLTYyNzEsNyArNjQwMSw3IEBACi0gfQotIAotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjI3NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi0gZWxzZQotQEAgLTYyOTcsNyArNjQyNyw3IEBACi0gY2FzZSAke2hvc3Rfb3N9IGluCi0gYWl4KikKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtYmJpZ3RvYyBvcHRpb24iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2MzAxOiBjaGVja2luZyBmb3IgLWJiaWd0b2Mgb3B0aW9uIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjQzMTogY2hlY2tpbmcgZm9yIC1iYmlndG9jIG9wdGlvbiIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9iaWd0b2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNjMxMSwxNCArNjQ0MSwxNCBAQAotIAotICAgICBMREZMQUdTPSRMREZMQUdTXCAkZ2RiX2N2X2JpZ3RvYwotICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjMxNSAiY29uZmlndXJlIgotKyNsaW5lIDY0NDUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSBpbnQgaTsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MzIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY0NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgOgotIGVsc2UKLSAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1AQCAtNjM0MSw3ICs2NDcxLDcgQEAKLSAgICBjYXNlICR7aG9zdF9vc30gaW4KLSAgICBocHV4KikKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2MzQ1OiBjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NDc1OiBjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiID4mNQotICAgICAgIGlmIHRlc3QgLWYgL3Vzci9pbmNsdWRlL2RjZS9jbWFfY29uZmlnLmggOyB0aGVuCi0gICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KLSAgICAgICAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1AQCAtNjM2MCw3ICs2NDkwLDcgQEAKLSAgICAgICA7OwotICAgIHNvbGFyaXMqKQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYzNjQ6IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY0OTQ6IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1Ci0gICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28uMSA7IHRoZW4KLSAgICAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi1AQCAtNjM3MCw3ICs2NTAwLDcgQEAKLSAgICAgICAgICBDT05GSUdfTElCX09CUz0iJHtDT05GSUdfTElCX09CU30gc29sLXRocmVhZC5vIgotICAgICAgICAgIENPTkZJR19TUkNTPSIke0NPTkZJR19TUkNTfSBzb2wtdGhyZWFkLmMiCi0gICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjM3NDogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjUwNDogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIGRsJ18nZGxvcGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC02Mzc4LDcgKzY1MDgsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbGRsICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjM4MiAiY29uZmlndXJlIgotKyNsaW5lIDY1MTIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC02Mzg5LDcgKzY1MTksNyBAQAotIGRsb3BlbigpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjM5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTY0MjEsMTcgKzY1NTEsMTcgQEAKLSAgICAgICAgICAgICAjIGFsbCBzeW1ib2xzIHZpc2libGUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICAgICAgICAgIGhvbGRfbGRmbGFncz0kTERGTEFHUwotICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aGUgbGQgLWV4cG9ydC1keW5hbWljIGZsYWciIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2NDI1OiBjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjU1NTogY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIgPiY1Ci0gICAgICAgICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAtV2wsLWV4cG9ydC1keW5hbWljIgotICAgICAgICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2NDI4ICJjb25maWd1cmUiCi0rI2xpbmUgNjU1OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIGludCBpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY0MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjU2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBmb3VuZD15ZXMKLSBlbHNlCi1AQCAtNjQ1MCwxMyArNjU4MCwxMyBAQAotIAkgIyBTdW4gcmFuZG9tbHkgdHdlYWtlZCB0aGUgcHJvdG90eXBlcyBpbiA8cHJvY19zZXJ2aWNlLmg+Ci0gCSAjIGF0IG9uZSBwb2ludC4KLSAJIGVjaG8gJGFjX24gImNoZWNraW5nIGlmIDxwcm9jX3NlcnZpY2UuaD4gaXMgb2xkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjQ1NDogY2hlY2tpbmcgaWYgPHByb2Nfc2VydmljZS5oPiBpcyBvbGQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NTg0OiBjaGVja2luZyBpZiA8cHJvY19zZXJ2aWNlLmg+IGlzIG9sZCIgPiY1Ci0gCSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICAKLSAJICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2NDYwICJjb25maWd1cmUiCi0rI2xpbmUgNjU5MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIAkJI2luY2x1ZGUgPHByb2Nfc2VydmljZS5oPgotQEAgLTY0NjcsNyArNjU5Nyw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQ3MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjYwMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQ9bm8KLSBlbHNlCi1AQCAtNjY4Niw3ICs2ODE2LDcgQEAKLSBpZiB0ZXN0ICJ4JHtidWlsZF93YXJuaW5nc30iICE9IHggLWEgIngkR0NDIiA9IHh5ZXMKLSB0aGVuCi0gICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGNvbXBpbGVyIHdhcm5pbmcgZmxhZ3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2NjkwOiBjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjgyMDogY2hlY2tpbmcgY29tcGlsZXIgd2FybmluZyBmbGFncyIgPiY1Ci0gICAgICMgU2VwYXJhdGUgb3V0IHRoZSAtV2Vycm9yIGZsYWcgYXMgc29tZSBmaWxlcyBqdXN0IGNhbm5vdCBiZQotICAgICAjIGNvbXBpbGVkIHdpdGggaXQgZW5hYmxlZC4KLSAgICAgZm9yIHcgaW4gJHtidWlsZF93YXJuaW5nc307IGRvCi1AQCAtNjY5NiwxNCArNjgyNiwxNCBAQAotIAkgICAgc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotIAkgICAgQ0ZMQUdTPSIkQ0ZMQUdTICR3IgotIAkgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY3MDAgImNvbmZpZ3VyZSIKLSsjbGluZSA2ODMwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjcwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjgzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgV0FSTl9DRkxBR1M9IiR7V0FSTl9DRkxBR1N9ICR3IgotIGVsc2UKLUBAIC02NzYzLDEyICs2ODkzLDEyIEBACi0gCi0gaWYgdGVzdCAkd2FudF9pbmNsdWRlZF9yZWdleCA9IGZhbHNlOyB0aGVuCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIHJlZ2V4IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Njc2NzogY2hlY2tpbmcgZm9yIEdOVSByZWdleCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY4OTc6IGNoZWNraW5nIGZvciBHTlUgcmVnZXgiID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX2dudV9yZWdleCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2NzcyICJjb25maWd1cmUiCi0rI2xpbmUgNjkwMiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1AQCAtNjc4MCw3ICs2OTEwLDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Nzg0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9nbnVfcmVnZXg9eWVzCi0gZWxzZQotQEAgLTY4MDksMTIgKzY5MzksMTIgQEAKLSAKLSAjIEluIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQsIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIGZsYWdzLgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjeWd3aW4iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2ODEzOiBjaGVja2luZyBmb3IgY3lnd2luIiA+JjUKLStlY2hvICJjb25maWd1cmU6Njk0MzogY2hlY2tpbmcgZm9yIGN5Z3dpbiIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9vc19jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjgxOCAiY29uZmlndXJlIgotKyNsaW5lIDY5NDggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotQEAgLTY4NTIsNyArNjk4Miw3IEBACi0gZWxzZQotICAgVEVSTV9MSUI9Ci0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbG5jdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2ODU2OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbG5jdXJzZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2OTg2OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbG5jdXJzZXMiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gbmN1cnNlcydfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTY4NjAsNyArNjk5MCw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sbmN1cnNlcyAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY4NjQgImNvbmZpZ3VyZSIKLSsjbGluZSA2OTk0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNjg3MSw3ICs3MDAxLDcgQEAKLSB0Z2V0ZW50KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2ODc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNjg5MCw3ICs3MDIwLDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2ODk0OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MDI0OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gSGN1cnNlcydfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTY4OTgsNyArNzAyOCw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sSGN1cnNlcyAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY5MDIgImNvbmZpZ3VyZSIKLSsjbGluZSA3MDMyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNjkwOSw3ICs3MDM5LDcgQEAKLSB0Z2V0ZW50KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwNDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNjkyOCw3ICs3MDU4LDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1saWIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2OTMyOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1saWIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MDYyOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1saWIiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gdGVybWxpYidfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTY5MzYsNyArNzA2Niw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sdGVybWxpYiAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY5NDAgImNvbmZpZ3VyZSIKLSsjbGluZSA3MDcwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNjk0Nyw3ICs3MDc3LDcgQEAKLSB0Z2V0ZW50KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNjk2Niw3ICs3MDk2LDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2OTcwOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MTAwOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gdGVybWNhcCdfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTY5NzQsNyArNzEwNCw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sdGVybWNhcCAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY5NzggImNvbmZpZ3VyZSIKLSsjbGluZSA3MTA4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNjk4NSw3ICs3MTE1LDcgQEAKLSB0Z2V0ZW50KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcxMTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNzAwNCw3ICs3MTM0LDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbGN1cnNlcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjcwMDg6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sY3Vyc2VzIiA+JjUKLStlY2hvICJjb25maWd1cmU6NzEzODogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNzAxMiw3ICs3MTQyLDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxjdXJzZXMgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA3MDE2ICJjb25maWd1cmUiCi0rI2xpbmUgNzE0NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTcwMjMsNyArNzE1Myw3IEBACi0gdGdldGVudCgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTcwNDIsNyArNzE3Miw3IEBACi0gZWxzZQotICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtaW5mbyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjcwNDY6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWluZm8iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MTc2OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIHRlcm1pbmZvJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNzA1MCw3ICs3MTgwLDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWx0ZXJtaW5mbyAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDcwNTQgImNvbmZpZ3VyZSIKLSsjbGluZSA3MTg0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNzA2MSw3ICs3MTkxLDcgQEAKLSB0Z2V0ZW50KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MDY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcxOTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNzIyNiw3ICs3MzU2LDcgQEAKLSBmaQotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRjbCBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzIzMDogY2hlY2tpbmcgZm9yIFRjbCBjb25maWd1cmF0aW9uIiA+JjUKLStlY2hvICJjb25maWd1cmU6NzM2MDogY2hlY2tpbmcgZm9yIFRjbCBjb25maWd1cmF0aW9uIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3RjbGNvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC03MzM0LDcgKzc0NjQsNyBAQAotIGZpCi0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGsgY29uZmlndXJhdGlvbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjczMzg6IGNoZWNraW5nIGZvciBUayBjb25maWd1cmF0aW9uIiA+JjUKLStlY2hvICJjb25maWd1cmU6NzQ2ODogY2hlY2tpbmcgZm9yIFRrIGNvbmZpZ3VyYXRpb24iID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfdGtjb25maWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNzQ0Myw3ICs3NTczLDcgQEAKLSAKLSBub190Y2w9dHJ1ZQotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUY2wgcHJpdmF0ZSBoZWFkZXJzLiBkaXI9JHtjb25maWdkaXJ9IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzQ0NzogY2hlY2tpbmcgZm9yIFRjbCBwcml2YXRlIGhlYWRlcnMuIGRpcj0ke2NvbmZpZ2Rpcn0iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NTc3OiBjaGVja2luZyBmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfSIgPiY1Ci0gIyBDaGVjayB3aGV0aGVyIC0td2l0aC10Y2xpbmNsdWRlIG9yIC0td2l0aG91dC10Y2xpbmNsdWRlIHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke3dpdGhfdGNsaW5jbHVkZStzZXR9IiA9IHNldDsgdGhlbgotICAgd2l0aHZhbD0iJHdpdGhfdGNsaW5jbHVkZSIKLUBAIC03NTA5LDE3ICs3NjM5LDE3IEBACi0gaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIGFjX3NhZmU9YGVjaG8gInRjbEludC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGNsSW50LmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3NTEzOiBjaGVja2luZyBmb3IgdGNsSW50LmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NjQzOiBjaGVja2luZyBmb3IgdGNsSW50LmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNzUxOCAiY29uZmlndXJlIgotKyNsaW5lIDc2NDggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8dGNsSW50Lmg+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjc1MjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NjUzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTc1NzksNyArNzcwOSw3IEBACi0gIwotIG5vX3RrPXRydWUKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGsgcHJpdmF0ZSBoZWFkZXJzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzU4MzogY2hlY2tpbmcgZm9yIFRrIHByaXZhdGUgaGVhZGVycyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc3MTM6IGNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiID4mNQotICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGtpbmNsdWRlIG9yIC0td2l0aG91dC10a2luY2x1ZGUgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7d2l0aF90a2luY2x1ZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgIHdpdGh2YWw9IiR3aXRoX3RraW5jbHVkZSIKLUBAIC03NjQ1LDE3ICs3Nzc1LDE3IEBACi0gaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCi0gICAgYWNfc2FmZT1gZWNobyAidGsuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRrLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3NjQ5OiBjaGVja2luZyBmb3IgdGsuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc3Nzk6IGNoZWNraW5nIGZvciB0ay5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDc2NTQgImNvbmZpZ3VyZSIKLSsjbGluZSA3Nzg0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHRrLmg+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjc2NTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Nzg5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTc3MDEsNyArNzgzMSw3IEBACi0gCi0gCSAgIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc3MDU6IGNoZWNraW5nIGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc4MzU6IGNoZWNraW5nIGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0gaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgIGZvciBpIGluICR7c3JjZGlyfS8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi9pdGNsL2l0Y2w7IGRvCi0gICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy9pdGNsLmggOyB0aGVuCi1AQCAtNzcyNCw3ICs3ODU0LDcgQEAKLSAKLSAJICAgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3NzI4OiBjaGVja2luZyBmb3IgSXRrIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc4NTg6IGNoZWNraW5nIGZvciBJdGsgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLSBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2h9IiA9IHggOyB0aGVuCi0gICBmb3IgaSBpbiAke3NyY2Rpcn0vLi4vaXRjbCAke3NyY2Rpcn0vLi4vLi4vaXRjbCAke3NyY2Rpcn0vLi4vLi4vLi4vaXRjbCAke3NyY2Rpcn0vLi4vaXRjbC9pdGs7IGRvCi0gICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy9pdGsuaCA7IHRoZW4KLUBAIC03NzQ3LDcgKzc4NzcsNyBAQAotIAotIAkgICAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGl4IHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc3NTE6IGNoZWNraW5nIGZvciBUaXggcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLStlY2hvICJjb25maWd1cmU6Nzg4MTogY2hlY2tpbmcgZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KLSAgIGZvciBpIGluICR7c3JjZGlyfS8uLi90aXggJHtzcmNkaXJ9Ly4uLy4uL3RpeCAke3NyY2Rpcn0vLi4vLi4vLi4vdGl4IDsgZG8KLSAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RpeC5oIDsgdGhlbgotQEAgLTc3OTksNyArNzkyOSw3IEBACi0gZmkKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJdGNsIGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3ODAzOiBjaGVja2luZyBmb3IgSXRjbCBjb25maWd1cmF0aW9uIiA+JjUKLStlY2hvICJjb25maWd1cmU6NzkzMzogY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pdGNsY29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTc5MDIsNyArODAzMiw3IEBACi0gZmkKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJdGsgY29uZmlndXJhdGlvbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc5MDY6IGNoZWNraW5nIGZvciBJdGsgY29uZmlndXJhdGlvbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjgwMzY6IGNoZWNraW5nIGZvciBJdGsgY29uZmlndXJhdGlvbiIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pdGtjb25maWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtODAwNSw3ICs4MTM1LDcgQEAKLSBmaQotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRpeCBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6ODAwOTogY2hlY2tpbmcgZm9yIFRpeCBjb25maWd1cmF0aW9uIiA+JjUKLStlY2hvICJjb25maWd1cmU6ODEzOTogY2hlY2tpbmcgZm9yIFRpeCBjb25maWd1cmF0aW9uIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3RpeGNvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC04MTQ4LDcgKzgyNzgsNyBAQAotICMgVXNlcyBhY18gdmFycyBhcyB0ZW1wcyB0byBhbGxvdyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgY2FjaGUgYW5kIGNoZWNrcy4KLSAjIC0td2l0aG91dC14IG92ZXJyaWRlcyBldmVyeXRoaW5nIGVsc2UsIGJ1dCBkb2VzIG5vdCB0b3VjaCB0aGUgY2FjaGUuCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4MTUyOiBjaGVja2luZyBmb3IgWCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjgyODI6IGNoZWNraW5nIGZvciBYIiA+JjUKLSAKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXggb3IgLS13aXRob3V0LXggd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCi1AQCAtODIxMCwxMiArODM0MCwxMiBAQAotIAotICAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODIxNCAiY29uZmlndXJlIgotKyNsaW5lIDgzNDQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8JHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODIxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjgzNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtODI4NCwxNCArODQxNCwxNCBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSAgIExJQlM9Ii1sJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODI4OCAiY29uZmlndXJlIgotKyNsaW5lIDg0MTggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSAke3hfZGlyZWN0X3Rlc3RfZnVuY3Rpb259KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Mjk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg0MjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgTElCUz0iJGFjX3NhdmVfTElCUyIKLSAjIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KLUBAIC04NTg0LDcgKzg3MTQsNyBAQAotICMgYGBnZGJzZXJ2ZXInJyBjYW4gb25seSBiZSBidWlsdCBpbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLgotIGlmIHRlc3QgeCIke3RhcmdldH0iID0geCIke2hvc3R9IjsgdGhlbgotICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdkYnNlcnZlciBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6ODU4ODogY2hlY2tpbmcgd2hldGhlciBnZGJzZXJ2ZXIgaXMgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjg3MTg6IGNoZWNraW5nIHdoZXRoZXIgZ2Ric2VydmVyIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QiID4mNQotICAgICBpZiB0ZXN0IHgiJHtidWlsZF9nZGJzZXJ2ZXJ9IiA9IHh5ZXMgOyB0aGVuCi0gCWNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gZ2Ric2VydmVyIgotIAlTVUJESVJTPSIke1NVQkRJUlN9IGdkYnNlcnZlciIKLUBAIC04NjQ2LDcgKzg3NzYsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4NjUwOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLStlY2hvICJjb25maWd1cmU6ODc4MDogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC04NjcwLDEyICs4ODAwLDEyIEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjg2NzQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4ODA0OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDg2NzkgImNvbmZpZ3VyZSIKLSsjbGluZSA4ODA5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtODY4Niw3ICs4ODE2LDcgQEAKLSByZXR1cm4gX19DWUdXSU5fXzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NjkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODIwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jeWd3aW49eWVzCi0gZWxzZQotQEAgLTg3MDMsMTkgKzg4MzMsMTkgQEAKLSBDWUdXSU49Ci0gdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6ODcwNzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4ODM3OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODcxMiAiY29uZmlndXJlIgotKyNsaW5lIDg4NDIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSByZXR1cm4gX19NSU5HVzMyX187Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODcxOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfbWluZ3czMj15ZXMKLSBlbHNlCi1AQCAtODczNCw3ICs4ODY0LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4NzM4OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4ODY4OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtODc0NCwxMCArODg3NCwxMCBAQAotICAgcm0gLWYgY29uZnRlc3QqCi0gICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2N2X2V4ZWV4dD0KLS0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODc0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSsgICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKLSAgICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgIGVzYWMKLSAgICAgZG9uZQotQEAgLTg5MDUsNiArOTAzNSw5IEBACi0gcyVATUFJTlRAJSRNQUlOVCVnCi0gcyVAQ0NAJSRDQyVnCi0gcyVAQ1BQQCUkQ1BQJWcKLStzJUBESVJfYWlmQCUkRElSX2FpZiVnCi0rcyVASU5DTFVERV9haWZAJSRJTkNMVURFX2FpZiVnCi0rcyVATElCX2FpZkAlJExJQl9haWYlZwotIHMlQGhvc3RAJSRob3N0JWcKLSBzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi0gcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi0tLS0gZ2RiLTUuMi1vbGQvZ2RiL2NvbmZpZy5pbglTYXQgRmViIDIzIDE0OjU0OjI1IDIwMDIKLSsrKyBnZGItNS4yL2dkYi9jb25maWcuaW4JU3VuIE1hciAxNiAyMTowOToyNCAyMDAzCi1AQCAtNDk5LDMgKzQ5OSw1IEBACi0gLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcl9zaWdpbmZvNjRfdC4gKi8KLSAjdW5kZWYgSEFWRV9QUl9TSUdJTkZPNjRfVAotIAotKy8qIERlZmluZSBmb3IgQUlGIHN1cHBvcnQuICovCi0rI3VuZGVmIEhBVkVfQUlGCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2dkYi1yaDUuMi4xLTQucGF0Y2ggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wYXRjaGVzL2dkYi1yaDUuMi4xLTQucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTA4YTAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvcGF0Y2hlcy9nZGItcmg1LjIuMS00LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNDg3NiArMCwwIEBACi0tLS0gL2Rldi9udWxsCUZyaSBNYXIgMjMgMjI6MDA6MzMgMjAwMQotKysrIGdkYi01LjIvZ2RiL2FpZi12YWxwcmludC5jCU1vbiBKdWwgMjIgMDk6NTg6MzEgMjAwMgotQEAgLTAsMCArMSwxMDgyIEBACi0rLyogU3VwcG9ydCBmb3IgcHJpbnRpbmcgQyBhbmQgQysrIHR5cGVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0rICAgQ29weXJpZ2h0IDE5ODYsIDE5ODgsIDE5ODksIDE5OTEsIDE5OTMtMTk5NiwgMTk5OC0yMDAwCi0rICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rCi0rICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotKwotKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0rICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0rCi0rICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0rICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSsgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0rICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSsKLSsgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0rICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLSsKLSsjaW5jbHVkZSAiZGVmcy5oIgotKyNpbmNsdWRlICJvYnN0YWNrLmgiCi0rI2luY2x1ZGUgImJmZC5oIgkJLyogQmluYXJ5IEZpbGUgRGVzY3JpcHRpb24gKi8KLSsjaW5jbHVkZSAic3ltdGFiLmgiCi0rI2luY2x1ZGUgImdkYnR5cGVzLmgiCi0rI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSsjaW5jbHVkZSAidmFsdWUuaCIKLSsjaW5jbHVkZSAidmFscHJpbnQuaCIKLSsjaW5jbHVkZSAiZ2RiY29yZS5oIgotKyNpbmNsdWRlICJ0YXJnZXQuaCIKLSsjaW5jbHVkZSAiY29tbWFuZC5oIgotKyNpbmNsdWRlICJnZGJjbWQuaCIKLSsjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSsjaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSsjaW5jbHVkZSAiYy1sYW5nLmgiCi0rI2luY2x1ZGUgInR5cGVwcmludC5oIgotKyNpbmNsdWRlICJ1aS1maWxlLmgiCi0rCi0rI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSsjaW5jbHVkZSAiYWlmLmgiCi0rI2luY2x1ZGUgPGVycm5vLmg+Ci0rI2luY2x1ZGUgPGN0eXBlLmg+Ci0rdm9pZCBtZW1fZmlsZV9kZWxldGUgKHN0cnVjdCB1aV9maWxlICpmaWxlKTsKLSsKLStpbnQgY2hlY2tfdmFsdWUoc3RydWN0IHR5cGUgKiwgQ09SRV9BRERSLCBzdHJ1Y3QgdmFsdWUgKiopOwotKwotKy8qIGRlZmluZWQgaW4gdmFscHJpbnQuYzogKi8KLStleHRlcm4gaW50IHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sIGludCAqZXJybm9wdHIpOwotKwotKwwKLSsvKiB0aGUgZm9sbG93aW5nIGNvbWVzIGZyb20gdGhlIGFpZiBsaWJyYXJ5LCBjb252LmMsIHdyaXR0ZW4gYnkgR3JlZy4gKi8KLSsKLSsjaWZkZWYgV0lORE9XU05UCi0rI2RlZmluZSBCSVRTUEVSQllURQk4Ci0rI2Vsc2UgLyogV0lORE9XU05UICovCi0rI2luY2x1ZGUJPHZhbHVlcy5oPgotKyNlbmRpZiAvKiBXSU5ET1dTTlQgKi8KLSsKLSt1bmlvbiBpZWVlX2RvdWJsZQotK3sKLSsJRE9VQkxFU1QJZDsKLSsJY2hhcgkJY1tzaXplb2YoRE9VQkxFU1QpXTsKLSt9OwotKwotKwwKLSsvKiBGb3IgbGlua2VkIGRhdGEgc3RydWN0dXJlcywgd2UgY2hlY2sgZm9yIGNpcmN1bGFyaXR5IGJ5IHJlY29yZGluZyB0aGUgdmFsdWVzCi0rICogb2YgYWxsIHBvaW50ZXJzIGFuZCB0eXBlcyB3ZSBzZWUuICBJbiBhIGxhdGVyIHBhc3MsIHdlIGVtaXQgYSBuYW1lIG9uIHRob3NlCi0rICogdHlwZXMgYW5kIGFuIG9mZnNldCBmb3IgdGhvc2UgdmFsdWVzCi0rICogdGhhdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuICovCi0rc3RydWN0IHZhbHVlX2luZm8gewotKyAgQ09SRV9BRERSIGFkZHI7Ci0rICBpbnQgdXNlZDsgLyogMDogYXBwZWFycywgbm90IHBvaW50ZWQgdG8uICAxOiBpcyBwb2ludGVkIHRvLiAgMjogdmFsdWUgaGFzIGJlZW4KLSsgICAgZW1pdHRlZCAqLwotK307Ci0rc3RydWN0IHR5cGVfaW5mbyB7Ci0rICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSsgIGludCB1c2VkOyAvKiAwOiBhcHBlYXJzLCBub3QgcG9pbnRlZCB0by4gIDE6IGlzIHBvaW50ZWQgdG8uICAyOiBuYW1lIGhhcyBiZWVuCi0rICAgIGVtaXR0ZWQgKi8KLSt9OwotKwotKyNkZWZpbmUgTUFYX1ZBTFVFU19TRUVOIDEwMDAKLSsJLyogaG9wZSB0aGF0IHRoZSBzdHJ1Y3R1cmUgZG9lc24ndCBoYXZlIG1vcmUgZGlzdGluY3QgcG9pbnRlciB2YWx1ZXMgKi8KLStzdHJ1Y3QgdmFsdWVfaW5mbyB2YWx1ZXNTZWVuW01BWF9WQUxVRVNfU0VFTisxXTsgLyogZXh0cmEgc3BhY2UgZm9yCi0rICBwc2V1ZG8tZGF0YSAqLwotK2ludCBudW1WYWx1ZXNTZWVuOwotKyNkZWZpbmUgTUFYX1RZUEVTX1NFRU4gMTAwCi0rCS8qIGhvcGUgdGhhdCB0aGUgc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBtb3JlIGRpc3RpbmN0IHR5cGVzIHZhbHVlcyAqLwotK3N0cnVjdCB0eXBlX2luZm8gdHlwZXNTZWVuW01BWF9UWVBFU19TRUVOKzFdOyAvKiBleHRyYSBzcGFjZSBmb3IKLSsgIHBzZXVkby1kYXRhICovCi0raW50IG51bVR5cGVzU2VlbjsKLSsKLSt0eXBlZGVmIGVudW0ge2RvVHlwZSwgZG9WYWx1ZX0gZG9XaGF0OwotKwotK3N0cnVjdCBzdHJfdHlwZQotK3sKLSsJaW50CWJsZW47Ci0rCWludAlzbGVuOwotKwlpbnQJZW5kOwotKwljaGFyICoJYnVmOwotK307Ci0rCi0rdHlwZWRlZiBzdHJ1Y3Qgc3RyX3R5cGUgKglzdHJfcHRyOwotKwotK3N0cl9wdHIgc3RyX2luaXQodm9pZCk7Ci0rdm9pZCBzdHJfYWRkKHN0cl9wdHIsIGNoYXIgKik7Ci0rdm9pZCBzdHJfZnJlZShzdHJfcHRyKTsKLStjaGFyICpzdHJfdmFsKHN0cl9wdHIpOwotK3N0cl9wdHIgc3RyX2R1cChjaGFyICopOwotKwotKy8qIGZpbGwgaW4gdGhlIHZhbHVlc1NlZW4gYXJyYXkgd2l0aCBhbGwgdGhlIHBvaW50ZXIgdmFsdWVzIHdlIHNlZSAqLwotK3ZvaWQKLSsgYWlmX2Rpc2NvdmVyKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyLCBkb1doYXQgd2hhdCkKLSt7Ci0rICBpbnQgdmFsdWVzU2VlbkluZGV4OwotKyAgc3RydWN0IHR5cGUgKmVsdHR5cGU7Ci0rICB1bnNpZ25lZCBpbnQgZWx0bGVuLCBvZmZzZXQ7Ci0rICBDT1JFX0FERFIgYWRkcjsKLSsgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKLSsgICAgewotKyAgICBjYXNlIFRZUEVfQ09ERV9UWVBFREVGOgotKyAgICAgIGFpZl9kaXNjb3ZlcihUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgdmFsYWRkciwgd2hhdCk7Ci0rICAgICAgYnJlYWs7Ci0rCi0rICAgIGNhc2UgVFlQRV9DT0RFX1BUUjoKLSsgICAgY2FzZSBUWVBFX0NPREVfUkVGOgotKyAgICAgIGlmICh3aGF0ID09IGRvVmFsdWUpCi0rICAgICAgeyAvKiBsb29raW5nIGZvciB2YWx1ZXMgKi8KLSsJc3RydWN0IHZhbHVlICpkZXJlZl92YWw7Ci0rCWFkZHIgPSB1bnBhY2tfcG9pbnRlciAodHlwZSwgdmFsYWRkcik7Ci0rCWlmIChhZGRyID09IDApIGJyZWFrOwotKwllbHR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKwlpZiAoVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9QVFIgJiYKLSsJICBUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1JFRiAmJgotKwkgIFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUKQotKwkgIGJyZWFrOyAvKiBubyBuZWVkIHRvIHJlbWVtYmVyIHBvaW50ZXJzIG5vdCBsZWFkaW5nIHRvIGN5Y2xlcyAqLwotKwlmb3IgKHZhbHVlc1NlZW5JbmRleCA9IDA7IHZhbHVlc1NlZW5JbmRleCA8IG51bVZhbHVlc1NlZW47Ci0rCXZhbHVlc1NlZW5JbmRleCsrKQotKwl7Ci0rCSAgaWYgKGFkZHIgPT0gdmFsdWVzU2Vlblt2YWx1ZXNTZWVuSW5kZXhdLmFkZHIpCi0rCSAgewotKwkgICAgdmFsdWVzU2Vlblt2YWx1ZXNTZWVuSW5kZXhdLnVzZWQgPSAxOyAvKiBmb3VuZCBhIGNpcmN1bGFyaXR5ICovCi0rCSAgICByZXR1cm47Ci0rCSAgfQotKwl9Ci0rCWlmIChudW1WYWx1ZXNTZWVuIDwgTUFYX1ZBTFVFU19TRUVOKQotKwkgIHsKLSsJICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0uYWRkciA9IGFkZHI7Ci0rCSAgICB2YWx1ZXNTZWVuW251bVZhbHVlc1NlZW5dLnVzZWQgPSAwOwotKwkgICAgbnVtVmFsdWVzU2VlbiArPSAxOwotKwkgIH0KLSsJLyoKLSsJKiogQ2hlY2sgYWRkciBpcyB2YWxpZCEKLSsJKi8KLSsJaWYgKCBjaGVja192YWx1ZShlbHR0eXBlLCBhZGRyLCAmZGVyZWZfdmFsKSApCi0rCQlhaWZfZGlzY292ZXIoZWx0dHlwZSwgVkFMVUVfQ09OVEVOVFMgKGRlcmVmX3ZhbCksIHdoYXQpOwotKwlicmVhazsKLSsgICAgICB9IGVsc2UgewotKwkvKiBsb29raW5nIGZvciB0eXBlcyAqLwotKwlpbnQgdHlwZXNTZWVuSW5kZXg7Ci0rCWVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rCWlmIChUWVBFX0NPREUoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1BUUiAmJgotKwkgIFRZUEVfQ09ERShlbHR0eXBlKSAhPSBUWVBFX0NPREVfUkVGICYmCi0rCSAgVFlQRV9DT0RFKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCi0rCSAgYnJlYWs7IC8qIG5vIG5lZWQgdG8gcmVtZW1iZXIgcG9pbnRlcnMgbm90IGxlYWRpbmcgdG8gY3ljbGVzICovCi0rCWZvciAodHlwZXNTZWVuSW5kZXggPSAwOyB0eXBlc1NlZW5JbmRleCA8IG51bVR5cGVzU2VlbjsKLSsJdHlwZXNTZWVuSW5kZXgrKykKLSsJewotKwkgIGlmIChlbHR0eXBlID09IHR5cGVzU2Vlblt0eXBlc1NlZW5JbmRleF0udHlwZSkKLSsJICB7Ci0rCSAgICB0eXBlc1NlZW5bdHlwZXNTZWVuSW5kZXhdLnVzZWQgPSAxOyAvKiBmb3VuZCBhIGNpcmN1bGFyaXR5ICovCi0rCSAgICByZXR1cm47Ci0rCSAgfQotKwl9Ci0rCWlmIChudW1UeXBlc1NlZW4gPCBNQVhfVFlQRVNfU0VFTikKLSsJICB7Ci0rCSAgICB0eXBlc1NlZW5bbnVtVHlwZXNTZWVuXS50eXBlID0gZWx0dHlwZTsKLSsJICAgIHR5cGVzU2VlbltudW1UeXBlc1NlZW5dLnVzZWQgPSAwOwotKwkgICAgbnVtVHlwZXNTZWVuICs9IDE7Ci0rCSAgfQotKwlhaWZfZGlzY292ZXIoZWx0dHlwZSwgMCwgd2hhdCk7Ci0rCWJyZWFrOwotKyAgICAgIH0gLyogZGlzY292ZXIgdHlwZXMgKi8KLSsKLSsgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgotKyAgICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKLSsgICAgICB7IC8qIGRpc2NvdmVyIGVpdGhlciB2YWx1ZXMgb3IgdHlwZXMgKi8KLSsJaW50IGk7Ci0rICAgICAgCXN0cnVjdCBmaWVsZCAqdGhpc0ZpZWxkOwotKwlzdHJ1Y3QgdHlwZSAqZnR5cGU7Ci0rCXN0cnVjdCB2YWx1ZSAqdjsKLSsKLSsJZm9yICggaSA9IDA7IGkgPCBUWVBFX05GSUVMRFModHlwZSk7IGkrKyApCi0rCXsKLSsJCWlmICggVFlQRV9GSUVMRF9JR05PUkUodHlwZSwgaSkgKQotKwkJCWNvbnRpbnVlOwotKwotKwkJaWYgKCB3aGF0ID09IGRvVHlwZSApCi0rCQl7Ci0rCQkJYWlmX2Rpc2NvdmVyKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpKSwgMCwgd2hhdCk7Ci0rCQkJY29udGludWU7Ci0rCQl9Ci0rCi0rCQlpZiAKLSsJCSgKLSsJCQkhVFlQRV9GSUVMRF9TVEFUSUModHlwZSwgaSkgCi0rCQkJJiYgCi0rCQkJVFlQRV9GSUVMRF9QQUNLRUQodHlwZSwgaSkKLSsJCSkKLSsJCXsKLSsJCQl2ID0gdmFsdWVfZnJvbV9sb25nZXN0KFRZUEVfRklFTERfVFlQRSh0eXBlLCBpKSwKLSsJCQkJdW5wYWNrX2ZpZWxkX2FzX2xvbmcgKHR5cGUsIHZhbGFkZHIsIGkpKTsKLSsKLSsJCQlhaWZfZGlzY292ZXIoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSwgVkFMVUVfQ09OVEVOVFModiksIHdoYXQpOwotKwkJfQotKwkJZWxzZSBpZiAoIFRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSApCi0rCQl7Ci0rCQkJdiA9IHZhbHVlX3N0YXRpY19maWVsZCAodHlwZSwgaSk7Ci0rCi0rCQkJaWYgKCB2ID09IE5VTEwgKQotKwkJCQljb250aW51ZTsKLSsKLSsJCQkvKgotKwkJCVhYWAotKwkJCWNwX3ByaW50X3N0YXRpY19maWVsZCAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSwgdiwKLSsJCQlzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSArIDEsCi0rCQkJcHJldHR5KTsKLSsJCQkqLwotKwkJfQotKwkJZWxzZQotKwkJewotKwkJCWFpZl9kaXNjb3ZlcihUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaSksIHZhbGFkZHIgKyBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkgLyA4LCB3aGF0KTsKLSsJCX0KLSsJICB9Ci0rICAgICAgfQotKyAgICAgIGJyZWFrOwotKwotKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKLSsgICAgICBlbHR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKyAgICAgIGlmICh3aGF0ID09IGRvVmFsdWUpCi0rICAgICAgeyAvKiBsb29raW5nIGZvciB2YWx1ZXMgKi8KLSsJdW5zaWduZWQgaW50IHRlbXBfbGVuLCBsZW47Ci0rCWVsdGxlbiA9IFRZUEVfTEVOR1RIIChlbHR0eXBlKTsKLSsJbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpIC8gZWx0bGVuOwotKwlvZmZzZXQgPSAwOwotKwlmb3IgKHRlbXBfbGVuID0gMDsgdGVtcF9sZW4gPCBsZW47IHRlbXBfbGVuKyspCi0rCSAgewotKwkgICAgYWlmX2Rpc2NvdmVyKGVsdHR5cGUsIHZhbGFkZHIrb2Zmc2V0LCB3aGF0KTsKLSsJICAgIG9mZnNldCArPSBlbHRsZW47Ci0rCSAgfQotKyAgICAgIH0gZWxzZSB7IC8qIGxvb2tpbmcgZm9yIHR5cGVzICovCi0rCWFpZl9kaXNjb3ZlcihlbHR0eXBlLCAwLCB3aGF0KTsKLSsgICAgICB9IC8qIFRZUEVfQ09ERV9BUlJBWSAqLwotKyAgICAgIGJyZWFrOwotKwotKyAgICBjYXNlIFRZUEVfQ09ERV9NRU1CRVI6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKLSsgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKLSsgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKLSsgICAgY2FzZSBUWVBFX0NPREVfRkxUOgotKyAgICBjYXNlIFRZUEVfQ09ERV9WT0lEOgotKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKLSsgICAgY2FzZSBUWVBFX0NPREVfQ0hBUjoKLSsgICAgY2FzZSBUWVBFX0NPREVfU0VUOgotKyAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKLSsgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgotKyAgICBjYXNlIFRZUEVfQ09ERV9CSVRTVFJJTkc6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX0NPTVBMRVg6Ci0rICAgIGNhc2UgVFlQRV9DT0RFX1RFTVBMQVRFOgotKyAgICAgIGJyZWFrOwotKwotKyAgICBkZWZhdWx0OgotKyAgICAgIGVycm9yICgidHlwZSBub3QgaGFuZGxlZCBpbiB0eXBlX2Rpc2NvdmVyIik7Ci0rICAgICAgYnJlYWs7Ci0rICAgIH0gLyogc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKSAqLwotK30gLyogYWlmX2Rpc2NvdmVyICovCi0rCi0rLyogc3F1YXNoIHRoZSB2YWx1ZXNTZWVuIGFuZCB0eXBlc1NlZW4gYXJyYXlzIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBlbGVtZW50cyAqLwotK3ZvaWQgCi0rYWlmX3JlZHVjZSh2b2lkKQotK3sKLSsgIGludCBmcm9udCwgYmFjazsKLSsgIGZyb250ID0gYmFjayA9IDA7Ci0rICB3aGlsZSAoZnJvbnQgPCBudW1WYWx1ZXNTZWVuKQotKyAgICB7Ci0rICAgICAgLyogbW92ZSBiYWNrIHRvIGZpcnN0IHVudXNlZCBlbnRyeSAqLwotKyAgICAgIHZhbHVlc1NlZW5bbnVtVmFsdWVzU2Vlbl0udXNlZCA9IDA7IC8qIHBzZXVkby1kYXRhICovCi0rICAgICAgd2hpbGUgKHZhbHVlc1NlZW5bYmFja10udXNlZCkgYmFjayArPSAxOwotKyAgICAgIGlmIChiYWNrID09IG51bVZhbHVlc1NlZW4pIGJyZWFrOwotKyAgICAgIC8qIG1vdmUgZnJvbnQgdG8gZmlyc3QgdXNlZCBlbnRyeSBiZXlvbmQgYmFjayAqLwotKyAgICAgIGlmIChmcm9udCA8PSBiYWNrKSBmcm9udCA9IGJhY2srMTsKLSsgICAgICB2YWx1ZXNTZWVuW251bVZhbHVlc1NlZW5dLnVzZWQgPSAxOyAvKiBwc2V1ZG8tZGF0YSAqLwotKyAgICAgIHdoaWxlICghdmFsdWVzU2Vlbltmcm9udF0udXNlZCkgZnJvbnQgKz0gMTsKLSsgICAgICBpZiAoZnJvbnQgPT0gbnVtVmFsdWVzU2VlbikgYnJlYWs7Ci0rICAgICAgLyogY29weSBmcm9tIGZyb250IHRvIGJhY2sgKi8KLSsgICAgICB2YWx1ZXNTZWVuW2JhY2tdID0gdmFsdWVzU2Vlbltmcm9udF07Ci0rICAgICAgdmFsdWVzU2Vlbltmcm9udF0udXNlZCA9IDA7Ci0rICAgIH0KLSsgIG51bVZhbHVlc1NlZW4gPSBiYWNrOwotKyAgZnJvbnQgPSBiYWNrID0gMDsKLSsgIHdoaWxlIChmcm9udCA8IG51bVR5cGVzU2VlbikKLSsgICAgewotKyAgICAgIC8qIG1vdmUgYmFjayB0byBmaXJzdCB1bnVzZWQgZW50cnkgKi8KLSsgICAgICB0eXBlc1NlZW5bbnVtVHlwZXNTZWVuXS51c2VkID0gMDsgLyogcHNldWRvLWRhdGEgKi8KLSsgICAgICB3aGlsZSAodHlwZXNTZWVuW2JhY2tdLnVzZWQpIGJhY2sgKz0gMTsKLSsgICAgICBpZiAoYmFjayA9PSBudW1UeXBlc1NlZW4pIGJyZWFrOwotKyAgICAgIC8qIG1vdmUgZnJvbnQgdG8gZmlyc3QgdXNlZCBlbnRyeSBiZXlvbmQgYmFjayAqLwotKyAgICAgIGlmIChmcm9udCA8PSBiYWNrKSBmcm9udCA9IGJhY2srMTsKLSsgICAgICB0eXBlc1NlZW5bbnVtVHlwZXNTZWVuXS51c2VkID0gMTsgLyogcHNldWRvLWRhdGEgKi8KLSsgICAgICB3aGlsZSAoIXR5cGVzU2Vlbltmcm9udF0udXNlZCkgZnJvbnQgKz0gMTsKLSsgICAgICBpZiAoZnJvbnQgPT0gbnVtVHlwZXNTZWVuKSBicmVhazsKLSsgICAgICAvKiBjb3B5IGZyb20gZnJvbnQgdG8gYmFjayAqLwotKyAgICAgIHR5cGVzU2VlbltiYWNrXSA9IHR5cGVzU2Vlbltmcm9udF07Ci0rICAgICAgdHlwZXNTZWVuW2Zyb250XS51c2VkID0gMDsKLSsgICAgfQotKyAgICBudW1UeXBlc1NlZW4gPSBiYWNrOwotK30gLyogYWlmX3JlZHVjZSAqLwotKwotK2ludCBkYXRhU3RyZWFtUG9zOwotKwotK3ZvaWQgCi0rZW1pdERhdGEoY2hhciB0b0VtaXQsIHN0cnVjdCB1aV9maWxlICpzdHJlYW0pCi0rewotKyAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICIlMDJ4IiwgdG9FbWl0ICYgMHhmZik7Ci0rICBkYXRhU3RyZWFtUG9zICs9IDE7Ci0rfSAvKiBlbWl0RGF0YSAqLwotKyAgCi0rdm9pZAotK2FpZl9lbWl0X3N0cmluZyAoQ09SRV9BRERSIGFkZHIsIHN0cnVjdCB1aV9maWxlICpzdHJlYW0pCi0reyAvKiBjb2RlIG1vZGlmaWVkIGZyb20gdmFsX3ByaW50X3N0cmluZyAoKSAqLwotKyAgaW50IGVycmNvZGU7CQkJLyogRXJybm8gcmV0dXJuZWQgZnJvbSBiYWQgcmVhZHMuICovCi0rICB1bnNpZ25lZCBpbnQgZmV0Y2hsaW1pdDsJLyogTWF4aW11bSBudW1iZXIgb2YgY2hhcnMgdG8gcHJpbnQuICovCi0rICB1bnNpZ25lZCBpbnQgbmZldGNoOwkJLyogQ2hhcnMgdG8gZmV0Y2ggLyBjaGFycyBmZXRjaGVkLiAqLwotKyAgdW5zaWduZWQgaW50IGNodW5rc2l6ZTsJLyogU2l6ZSBvZiBlYWNoIGZldGNoLCBpbiBjaGFycy4gKi8KLSsgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CQkvKiBEeW5hbWljYWxseSBncm93YWJsZSBmZXRjaCBidWZmZXIuICovCi0rICBjaGFyICpidWZwdHI7CQkJLyogUG9pbnRlciB0byBuZXh0IGF2YWlsYWJsZSBieXRlIGluIGJ1ZmZlci4gKi8KLSsgIGNoYXIgKmxpbWl0OwkJCS8qIEZpcnN0IGxvY2F0aW9uIHBhc3QgZW5kIG9mIGZldGNoIGJ1ZmZlci4gKi8KLSsgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSBOVUxMOwkvKiBUb3Agb2YgdGhlIG9sZCBjbGVhbnVwIGNoYWluLiAqLwotKyAgaW50IGZvdW5kX251bDsJCS8qIE5vbi16ZXJvIGlmIHdlIGZvdW5kIHRoZSBudWwgY2hhciAqLwotKyAgdW5zaWduZWQgbG9uZyBidWZzaXplID0gMDsKLSsgIGludCBsZW5ndGg7CQkJLyogaG93IGxvbmcgdGhlIHN0cmluZyB0dXJuZWQgb3V0IHRvIGJlICovCi0rCi0rICBpZiAoYWRkciA9PSAwKQotKyAgewotKyAgICAgIGVtaXREYXRhKDAsIHN0cmVhbSk7Ci0rICAgICAgZW1pdERhdGEoMCwgc3RyZWFtKTsKLSsgICAgICByZXR1cm47Ci0rICB9Ci0rCi0rICBmZXRjaGxpbWl0ID0gcHJpbnRfbWF4OwotKyAgY2h1bmtzaXplID0gbWluICg4LCBmZXRjaGxpbWl0KTsKLSsgIC8qIExvb3AgdW50aWwgd2UgZWl0aGVyIGhhdmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHRvIHByaW50LCBvciB3ZSBlbmNvdW50ZXIKLSsgICAgIHNvbWUgZXJyb3IsIHN1Y2ggYXMgYnVtcGluZyBpbnRvIHRoZSBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuICovCi0rICBmb3VuZF9udWwgPSAwOwotKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChudWxsX2NsZWFudXAsIDApOwotKyAgZG8KLSsgICAgewotKyAgICAgIFFVSVQ7Ci0rICAgICAgbmZldGNoID0gbWluIChjaHVua3NpemUsIGZldGNobGltaXQgLSBidWZzaXplKTsKLSsgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCi0rCWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKG5mZXRjaCk7Ci0rICAgICAgZWxzZQotKwl7Ci0rCSAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKLSsJICBidWZmZXIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYnVmZmVyLCBuZmV0Y2ggKyBidWZzaXplKTsKLSsJfQotKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZSwgYnVmZmVyKTsKLSsgICAgICBidWZwdHIgPSBidWZmZXIgKyBidWZzaXplOwotKyAgICAgIGJ1ZnNpemUgKz0gbmZldGNoOwotKyAgICAgIC8qIFJlYWQgYXMgbXVjaCBhcyB3ZSBjYW4uICovCi0rICAgICAgbmZldGNoID0gcGFydGlhbF9tZW1vcnlfcmVhZCAoYWRkciwgYnVmcHRyLCBuZmV0Y2gsICZlcnJjb2RlKTsKLSsgICAgICAvKiBTY2FuIHRoaXMgY2h1bmsgZm9yIHRoZSBudWxsIGJ5dGUgKi8KLSsgICAgICBsaW1pdCA9IGJ1ZnB0ciArIG5mZXRjaDsKLSsgICAgICB3aGlsZSAoYnVmcHRyIDwgbGltaXQpCi0rCXsKLSsJICB1bnNpZ25lZCBsb25nIGM7Ci0rCSAgYyA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmcHRyLCAxKTsKLSsJICBhZGRyICs9IDE7Ci0rCSAgYnVmcHRyICs9IDE7Ci0rCSAgaWYgKGMgPT0gMCkKLSsJICAgIHsKLSsJICAgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBhbnkgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYWZ0ZXIKLSsJCSAgdGhlIE5VTEwgdGVybWluYXRvci4gICovCi0rCSAgICAgIGVycmNvZGUgPSAwOwotKwkgICAgICBmb3VuZF9udWwgPSAxOwotKwkgICAgICBicmVhazsKLSsJICAgIH0KLSsJfSAvKiB3aGlsZSAoYnVmcHRyIDwgbGltaXQpICovCi0rICAgIH0gLyogZG8gKi8KLSsgIHdoaWxlIChlcnJjb2RlID09IDAJLyogbm8gZXJyb3IgKi8KLSsJICAmJiBidWZwdHIgLSBidWZmZXIgPCBmZXRjaGxpbWl0CS8qIG5vIG92ZXJydW4gKi8KLSsJICAmJiAhZm91bmRfbnVsKTsJLyogaGF2ZW4ndCBmb3VuZCBudWwgeWV0ICovCi0rICBRVUlUOwotKyAgbGVuZ3RoID0gMDsKLSsgIGlmIChlcnJjb2RlID09IDAgfHwgYnVmcHRyID4gYnVmZmVyKQotKyAgICB7Ci0rICAgICAgbGVuZ3RoID0gYnVmcHRyIC0gYnVmZmVyIC0gMTsgLyogZG9uJ3QgaW5jbHVkZSBudWxsICovCi0rICAgICAgZW1pdERhdGEoKGxlbmd0aCA+PiA4KSAmIDA3Nywgc3RyZWFtKTsKLSsgICAgICBlbWl0RGF0YShsZW5ndGggJiAwNzcsIHN0cmVhbSk7Ci0rICAgICAgZm9yICg7IGxlbmd0aCA+IDA7IGxlbmd0aC0tKSB7Ci0rCWVtaXREYXRhKCpidWZmZXIrKywgc3RyZWFtKTsgCi0rICAgICAgfQotKyAgICB9Ci0rICBpZiAoZXJyY29kZSAhPSAwKQotKyAgICB7Ci0rICAgICAgaWYgKGVycmNvZGUgPT0gRUlPKQotKwl7Ci0rCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxBZGRyZXNzICIpOwotKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSsJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgb3V0IG9mIGJvdW5kcz4iKTsKLSsJfQotKyAgICAgIGVsc2UKLSsJewotKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiA8RXJyb3IgcmVhZGluZyBhZGRyZXNzICIpOwotKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKLSsJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI6ICVzPiIsIHNhZmVfc3RyZXJyb3IgKGVycmNvZGUpKTsKLSsJfQotKyAgICB9Ci0rICBnZGJfZmx1c2ggKHN0cmVhbSk7Ci0rICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKLSsgIHJldHVybjsKLSt9IC8qIGFpZl9lbWl0X3N0cmluZyAqLwotKwotK3N0cl9wdHIKLStnZGJfdHlwZV90b19mZHMoc3RydWN0IHR5cGUgKnR5cGUpCi0rewotKwlpbnQJCWxlbjsKLSsJaW50CQllbGVuOwotKwlpbnQJCW5maWVsZHM7Ci0rCWludAkJaTsKLSsJaW50CQlpeDsKLSsJc3RyX3B0cgkJczsKLSsJc3RyX3B0cgkJdHlwZV9wdHI7Ci0rCXN0cl9wdHIJCXR5cGVfc3RyOwotKwlzdHJ1Y3QgdHlwZSAqCWV0eXBlOwotKwotKwlDSEVDS19UWVBFREVGICh0eXBlKTsKLSsKLSsJdHlwZV9zdHIgPSBzdHJfaW5pdCgpOwotKwotKwlmb3IgKCBpeCA9IDA7IGl4IDwgbnVtVHlwZXNTZWVuOyBpeCsrKQotKwl7Ci0rCQlpZiAKLSsJCSgKLSsJCQl0eXBlc1NlZW5baXhdLnR5cGUgIT0gdHlwZQotKwkJCXx8Ci0rCQkJIXR5cGVzU2VlbltpeF0udXNlZAotKwkJKQotKwkJCWNvbnRpbnVlOwotKwotKwkJLyoKLSsJCSoqIE11bHRpcGxlIHVzZSB0eXBlCi0rCQkqLwotKwotKwkJaWYgKCB0eXBlc1NlZW5baXhdLnVzZWQgIT0gMSApCi0rCQl7Ci0rCQkJLyogCi0rCQkJKiogcmVmZXJyaW5nIHRvIG9uZSBhbHJlYWR5IGVtaXR0ZWQgCi0rCQkJKi8KLSsKLSsJCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX1JFRkVSRU5DRSwgaXgpKTsKLSsJCQlyZXR1cm4gdHlwZV9zdHI7Ci0rCQl9Ci0rCi0rCQkvKgotKwkJKiogZmlyc3QgdGltZTsgZW1pdCBuYW1lCi0rCQkqLwotKwotKwkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9OQU1FLCBpeCwgTlVMTCkpOwotKwkJdHlwZXNTZWVuW2l4XS51c2VkID0gMjsKLSsJCWJyZWFrOwotKwl9Ci0rCi0rCWxlbiA9IFRZUEVfTEVOR1RIKHR5cGUpOwotKwotKwlzd2l0Y2ggKCBUWVBFX0NPREUodHlwZSkgKQotKwl7Ci0rCWNhc2UgVFlQRV9DT0RFX1RZUEVERUY6Ci0rCQl0eXBlX3B0ciA9IGdkYl90eXBlX3RvX2ZkcyhUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKTsKLSsJCXN0cl9hZGQodHlwZV9zdHIsIHN0cl92YWwodHlwZV9wdHIpKTsKLSsJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsJCXJldHVybiB0eXBlX3N0cjsKLSsKLSsJY2FzZSBUWVBFX0NPREVfQVJSQVk6Ci0rCQlpZiAKLSsJCSgKLSsJCQlsZW4gPiAwCi0rCQkJJiYKLSsJCQlUWVBFX0xFTkdUSChUWVBFX1RBUkdFVF9UWVBFKHR5cGUpKSA+IDAKLSsJCSkKLSsJCXsKLSsJCQlldHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOwotKwkJCWVsZW4gPSBUWVBFX0xFTkdUSChldHlwZSk7Ci0rCQkJbGVuIC89IGVsZW47Ci0rCi0rCQkJdHlwZV9wdHIgPSBnZGJfdHlwZV90b19mZHMoZXR5cGUpOwotKwotKwkJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfQVJSQVksIAotKwkJCQlUeXBlVG9GRFMoQUlGX1JBTkdFLCAwLCBsZW4tMSwgCi0rCQkJCQlUeXBlVG9GRFMoQUlGX0lOVEVHRVIsIDEsIHNpemVvZihpbnQpKSksCi0rCQkJCXN0cl92YWwodHlwZV9wdHIpKSk7Ci0rCi0rCQkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJLyoKLSsJCSoqIFRyZWF0IGFzIGEgcG9pbnRlci4uLgotKwkJKi8KLSsKLSsJY2FzZSBUWVBFX0NPREVfUFRSOgotKwkJZXR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUodHlwZSkpOwotKwkJZWxlbiA9IFRZUEVfTEVOR1RIKGV0eXBlKTsKLSsKLSsJCWlmIAotKwkJKAotKwkJCWVsZW4gPT0gMQotKwkJCSYmCi0rCQkJVFlQRV9DT0RFKGV0eXBlKSA9PSBUWVBFX0NPREVfSU5UCi0rCQkpCi0rCQl7Ci0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9TVFJJTkcpKTsKLSsJCX0KLSsJCWVsc2UKLSsJCXsKLSsJCQl0eXBlX3B0ciA9IGdkYl90eXBlX3RvX2ZkcyhldHlwZSk7Ci0rCi0rCQkJc3RyX2FkZCh0eXBlX3N0ciwgCi0rCQkJCVR5cGVUb0ZEUyhBSUZfUE9JTlRFUiwgc3RyX3ZhbCh0eXBlX3B0cikpKTsKLSsKLSsJCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQl9Ci0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfSU5UOgotKwkJaWYKLSsJCSgKLSsJCQlsZW4gIT0gMQotKwkJCXx8Ci0rCQkJc3RybmNtcChUWVBFX05BTUUodHlwZSksICJjaGFyIiwgNSkgIT0gMAotKwkJKSAKLSsJCXsKLSsJCQlzdHJfYWRkKHR5cGVfc3RyLCAKLSsJCQkJVHlwZVRvRkRTKEFJRl9JTlRFR0VSLCBUWVBFX1VOU0lHTkVEKHR5cGUpID8gMCA6IDEsIGxlbikpOwotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJLyoKLSsJCSoqIFRyZWF0IGFzIGNoYXIuLi4KLSsJCSovCi0rCi0rCWNhc2UgVFlQRV9DT0RFX0NIQVI6Ci0rCQlzdHJfYWRkKHR5cGVfc3RyLCBUeXBlVG9GRFMoQUlGX0NIQVJBQ1RFUikpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0ZMVDoKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfRkxPQVRJTkcsIGxlbikpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX1NUUlVDVDoKLSsJY2FzZSBUWVBFX0NPREVfVU5JT046Ci0rCQluZmllbGRzID0gVFlQRV9ORklFTERTKHR5cGUpOwotKwkJCi0rCQlpZiAoIEhBVkVfQ1BMVVNfU1RSVUNUKHR5cGUpICkKLSsJCQlpID0gVFlQRV9OX0JBU0VDTEFTU0VTKHR5cGUpOwotKwkJZWxzZQotKwkJCWkgPSAwOwotKwotKwkJLyoKLSsJCSoqIEZpcnN0IG5lZWQgdG8gY2FsY3VsYXRlIHNpemUgb2Ygc3RydWN0LCBzaW5jZSBpdAotKwkJKiogbWF5IG5vdCBiZSBwYWNrZWQuCi0rCQkqLwotKwotKwkJZm9yICggbGVuID0gMCA7IGkgPCBuZmllbGRzIDsgaSsrICkKLSsJCXsKLSsJCQlpZiAoIFRZUEVfRklFTERfSUdOT1JFKHR5cGUsIGkpICkKLSsJCQkJY29udGludWU7Ci0rCi0rCQkJZXR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpKSk7Ci0rCQkJZWxlbiA9IFRZUEVfRklFTERfUEFDS0VEKHR5cGUsIGkpID8KLSsJCQkJCVRZUEVfRklFTERfQklUU0laRSh0eXBlLCBpKSAvIDggOgotKwkJCQkJVFlQRV9MRU5HVEgoZXR5cGUpOwotKwotKwkJCWlmICggVFlQRV9DT0RFKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QgKQotKwkJCQlsZW4gKz0gZWxlbjsKLSsJCQllbHNlIGlmICggZWxlbiA+IGxlbiApCi0rCQkJCWxlbiA9IGVsZW47Ci0rCQl9Ci0rCi0rCQl0eXBlX3B0ciA9IHN0cl9kdXAoVHlwZVRvRkRTKEFJRl9TVFJVQ1QpKTsKLSsKLSsJCS8qCi0rCQkqKiBOZWVkIHRvIGNhbGN1bGF0ZSBvZmZzZXQgKGxlbikuCi0rCQkqLwotKwkJbGVuID0gMDsKLSsKLSsJCWlmICggSEFWRV9DUExVU19TVFJVQ1QodHlwZSkgKQotKwkJCWkgPSBUWVBFX05fQkFTRUNMQVNTRVModHlwZSk7Ci0rCQllbHNlCi0rCQkJaSA9IDA7Ci0rCi0rCQlmb3IgKDsgaSA8IG5maWVsZHMgOyBpKysgKQotKwkJewotKwkJCWNoYXIgKnQ7Ci0rCi0rCQkJaWYgKCBUWVBFX0ZJRUxEX0lHTk9SRSh0eXBlLCBpKSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaSkpOwotKwotKwkJCWVsZW4gPSBUWVBFX0ZJRUxEX1BBQ0tFRCh0eXBlLCBpKSA/Ci0rCQkJCVRZUEVfRklFTERfQklUU0laRSh0eXBlLCBpKSA6Ci0rCQkJCVRZUEVfTEVOR1RIKGV0eXBlKSAqIDg7Ci0rCi0rCQkJcyA9IGdkYl90eXBlX3RvX2ZkcyhldHlwZSk7Ci0rCi0rCQkJaWYgKCBIQVZFX0NQTFVTX1NUUlVDVCh0eXBlKSApCi0rCQkJewotKwkJCQlpZiAoIFRZUEVfRklFTERfUFJPVEVDVEVEKHR5cGUsIGkpICkKLSsJCQkJCXQgPSBGRFNBZGRGaWVsZFRvQ2xhc3MoCi0rCQkJCQkJc3RyX3ZhbCh0eXBlX3B0ciksCi0rCQkJCQkgICAgCUFJRkFDQ19QUk9URUNURUQsIAotKwkJCQkJICAgIAlUWVBFX0ZJRUxEX05BTUUodHlwZSwgaSksIAotKwkJCQkJCXN0cl92YWwocykpOwotKwkJCQllbHNlIGlmICggVFlQRV9GSUVMRF9QUklWQVRFKHR5cGUsIGkpICkKLSsJCQkJCXQgPSBGRFNBZGRGaWVsZFRvQ2xhc3MoCi0rCQkJCQkJc3RyX3ZhbCAodHlwZV9wdHIpLCAKLSsJCQkJCQlBSUZBQ0NfUFJJVkFURSwgCi0rCQkJCQkJVFlQRV9GSUVMRF9OQU1FKHR5cGUsIGkpLCAKLSsJCQkJCQlzdHJfdmFsKHMpKTsKLSsJCQkJZWxzZQotKwkJCQkJdCA9IEZEU0FkZEZpZWxkVG9DbGFzcygKLSsJCQkJCQlzdHJfdmFsICh0eXBlX3B0ciksIAotKwkJCQkJCUFJRkFDQ19QVUJMSUMsIAotKwkJCQkJCVRZUEVfRklFTERfTkFNRSh0eXBlLCBpKSwgCi0rCQkJCQkJc3RyX3ZhbChzKSk7Ci0rCi0rCQkJfQotKwkJCWVsc2UKLSsJCQkJdCA9IEZEU0FkZEZpZWxkVG9TdHJ1Y3Qoc3RyX3ZhbCh0eXBlX3B0ciksIAotKwkJCQkJVFlQRV9GSUVMRF9OQU1FKHR5cGUsIGkpLCBzdHJfdmFsKHMpKTsKLSsKLSsJCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQkJCi0rCQkJdHlwZV9wdHIgPSBzdHJfZHVwKHQpOwotKwotKwkJCXN0cl9mcmVlKHMpOwotKwotKwkJCS8qCi0rCQkJKiogQ2FsYyBvZmZzZXQuCi0rCQkJKi8KLSsJCQlpZiAoIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUICkKLSsJCQkJbGVuICs9IGVsZW47Ci0rCQl9Ci0rCi0rCQlzdHJfYWRkKHR5cGVfc3RyLCBzdHJfdmFsKHR5cGVfcHRyKSk7Ci0rCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfVk9JRDoKLSsJCXN0cl9hZGQodHlwZV9zdHIsIFR5cGVUb0ZEUyhBSUZfVk9JRCwgbGVuKSk7Ci0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfRU5VTToKLSsJCW5maWVsZHMgPSBUWVBFX05GSUVMRFMgKHR5cGUpOwotKwotKwkJdHlwZV9wdHIgPSBzdHJfZHVwKFR5cGVUb0ZEUyhBSUZfRU5VTSkpOwotKwotKwkJZm9yICggaSA9IDAgOyBpIDwgbmZpZWxkcyA7IGkrKyApCi0rCQl7Ci0rCQkJY2hhciAqCXQ7Ci0rCi0rCQkJdCA9IEZEU0FkZENvbnN0VG9FbnVtKHN0cl92YWwodHlwZV9wdHIpLAotKwkJCQkJVFlQRV9GSUVMRF9OQU1FKHR5cGUsIGkpLAotKwkJCQkJVFlQRV9GSUVMRF9CSVRQT1ModHlwZSwgaSkpOwotKwotKwkJCXN0cl9mcmVlKHR5cGVfcHRyKTsKLSsKLSsJCQl0eXBlX3B0ciA9IHN0cl9kdXAodCk7Ci0rCQl9Ci0rCi0rCQlzdHJfYWRkKHR5cGVfc3RyLCBzdHJfdmFsKHR5cGVfcHRyKSk7Ci0rCQlzdHJfZnJlZSh0eXBlX3B0cik7Ci0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfRlVOQzoKLSsJCWV0eXBlID0gY2hlY2tfdHlwZWRlZihUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rCi0rCQl0eXBlX3B0ciA9IGdkYl90eXBlX3RvX2ZkcyhldHlwZSk7Ci0rCi0rCQlzdHJfYWRkKHR5cGVfc3RyLCAKLSsJCQlUeXBlVG9GRFMoQUlGX0ZVTkNUSU9OLCBzdHJfdmFsKHR5cGVfcHRyKSkpOwotKwotKwkJc3RyX2ZyZWUodHlwZV9wdHIpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX1NUUklORzoKLSsJY2FzZSBUWVBFX0NPREVfU0VUOgotKwljYXNlIFRZUEVfQ09ERV9SQU5HRToKLSsJY2FzZSBUWVBFX0NPREVfQklUU1RSSU5HOgotKwljYXNlIFRZUEVfQ09ERV9NRU1CRVI6Ci0rCWNhc2UgVFlQRV9DT0RFX01FVEhPRDoKLSsJY2FzZSBUWVBFX0NPREVfUkVGOgotKwljYXNlIFRZUEVfQ09ERV9CT09MOgotKwljYXNlIFRZUEVfQ09ERV9DT01QTEVYOgotKwkJc3RyX2FkZCh0eXBlX3N0ciwgVHlwZVRvRkRTKEFJRl9JTlZBTElEKSk7Ci0rCQlicmVhazsKLSsKLSsJZGVmYXVsdDoKLSsJCWVycm9yKCJJbnZhbGlkIEMvQysrIHR5cGUgY29kZSAlZCBpbiBzeW1ib2wgdGFibGUuIiwgVFlQRV9DT0RFKHR5cGUpKTsKLSsJfQotKwotKwlyZXR1cm4gdHlwZV9zdHI7Ci0rfQotKwotK3ZvaWQKLSthaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZShzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqdmFsYWRkciwgQ09SRV9BRERSIGFkZHJlc3MsIHN0cnVjdCB1aV9maWxlICpzdHJlYW0pCi0rewotKwlpbnQJCQlpeDsKLSsJaW50CQkJcmVzOwotKwlpbnQJCQl2YWxpZDsKLSsJdW5zaWduZWQJCWxlbjsKLSsJdW5zaWduZWQJCWVsdGxlbjsKLSsJTE9OR0VTVAkJCXZhbDsKLSsJZG91YmxlCQkJZHZhbDsKLSsJZmxvYXQJCQlmdmFsOwotKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0rCWxvbmcgZG91YmxlCQlsZHZhbDsKLSsjZW5kaWYgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotKwlDT1JFX0FERFIJCWFkZHI7Ci0rCXN0cnVjdCB2YWx1ZSAqCQl2cHRyOwotKwl1bmlvbiBpZWVlX2RvdWJsZQl2OwotKwlzdHJ1Y3QgdHlwZSAqCQllbHR0eXBlOwotKwlzdHJ1Y3QgZmllbGQgKgkJdGhpc0ZpZWxkOwotKwotKwlDSEVDS19UWVBFREVGKHR5cGUpOwotKwotKwlzd2l0Y2ggKCBUWVBFX0NPREUodHlwZSkgKQotKwl7Ci0rCWNhc2UgVFlQRV9DT0RFX1RZUEVERUY6Ci0rCQlhaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZShUWVBFX1RBUkdFVF9UWVBFKHR5cGUpLCB2YWxhZGRyLCBhZGRyZXNzLCBzdHJlYW0pOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0FSUkFZOgotKwkJZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYoVFlQRV9UQVJHRVRfVFlQRSh0eXBlKSk7Ci0rCi0rCQlpZiAKLSsJCSgKLSsJCQlUWVBFX0xFTkdUSCh0eXBlKSA+IDAKLSsJCQkmJgotKwkJCVRZUEVfTEVOR1RIKFRZUEVfVEFSR0VUX1RZUEUodHlwZSkpID4gMAotKwkJKQotKwkJewotKwkJCWVsdGxlbiA9IFRZUEVfTEVOR1RIKGVsdHR5cGUpOwotKwkJCWxlbiA9IFRZUEVfTEVOR1RIKHR5cGUpIC8gZWx0bGVuOwotKwotKwkJCWZvciAoIGl4ID0gMDsgaXggPCBsZW47IGl4KysgKQotKwkJCQlhaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZShlbHR0eXBlLCB2YWxhZGRyICsgaXggKiBlbHRsZW4sIGFkZHJlc3MgKyBpeCAqIGVsdGxlbiwgc3RyZWFtKTsKLSsKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCS8qCi0rCQkqKiBUcmVhdCBhcyBhIHBvaW50ZXIuLi4KLSsJCSovCi0rCQlhZGRyID0gYWRkcmVzczsKLSsJCWdvdG8gYXNQdHI7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX1JFRjoKLSsJY2FzZSBUWVBFX0NPREVfUFRSOgotKwkJYWRkciA9IHVucGFja19wb2ludGVyKHR5cGUsIHZhbGFkZHIpOwotKwotKwlhc1B0cjoKLSsJCWVsdHR5cGUgPSBjaGVja190eXBlZGVmKFRZUEVfVEFSR0VUX1RZUEUodHlwZSkpOwotKwotKwkJaWYKLSsJCSgKLSsJCQlUWVBFX0xFTkdUSChlbHR0eXBlKSA9PSAxCi0rCQkJJiYgCi0rCQkJVFlQRV9DT0RFKGVsdHR5cGUpID09IFRZUEVfQ09ERV9JTlQKLSsJCSkKLSsJCXsKLSsJCQkvKgotKwkJCSoqIGNhbGwgaXQgYSBzdHJpbmcKLSsJCQkqLwotKwkJCSh2b2lkKWFpZl9lbWl0X3N0cmluZyhhZGRyLCBzdHJlYW0pOwotKwkJCWJyZWFrOwotKwkJfQotKwotKwkJaWYgKCBhZGRyID09IDAgKQotKwkJewotKwkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfTklMLCBzdHJlYW0pOyAKLSsJCQlicmVhazsKLSsJCX0KLSsKLSsJCWZvciAoIGl4ID0gMCA7IGl4IDwgbnVtVmFsdWVzU2VlbjsgaXgrKyApCi0rCQl7Ci0rCQkJaWYKLSsJCQkoCi0rCQkJCXZhbHVlc1NlZW5baXhdLmFkZHIgPT0gYWRkcgotKwkJCQkmJgotKwkJCQl2YWx1ZXNTZWVuW2l4XS51c2VkCi0rCQkJKQotKwkJCXsKLSsJCQkJaWYgKCB2YWx1ZXNTZWVuW2l4XS51c2VkID09IDEgKQotKwkJCQl7Ci0rCQkJCQkvKiAKLSsJCQkJCSoqIGZpcnN0IHRpbWU7IGp1c3QgZW1pdCBhcyB1c3VhbAotKwkJCQkJKi8KLSsKLSsJCQkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfTkFNRSwgc3RyZWFtKTsgCi0rCQkJCQl2YWx1ZXNTZWVuW2l4XS51c2VkID0gMjsKLSsJCQkJCWVtaXREYXRhKChjaGFyKWl4LCBzdHJlYW0pOwotKwotKwkJCQkJYnJlYWs7IC8qIG5vIG5lZWQgdG8gbG9vayBhdCBvdGhlciBzZWVuIHZhbHVlcyAqLwotKwkJCQl9Ci0rCi0rCQkJCS8qIAotKwkJCQkqKiByZWZlcnJpbmcgdG8gb25lIGFscmVhZHkgZW1pdHRlZAotKwkJCQkqLwotKwotKwkJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX1JFRkVSRU5DRSwgc3RyZWFtKTsgCi0rCQkJCWVtaXREYXRhKChjaGFyKWl4LCBzdHJlYW0pOwotKwotKwkJCQlyZXR1cm47IC8qIGRvbid0IGdvIGFueSBkZWVwZXIgKi8KLSsJCQl9Ci0rCQl9Ci0rCi0rCQlyZXMgPSBjaGVja192YWx1ZShlbHR0eXBlLCBhZGRyLCAmdnB0cik7Ci0rCi0rCQlpZiAoIGl4ID09IG51bVZhbHVlc1NlZW4gKQotKwkJewotKwkJCS8qCi0rCQkJKiogbm90IHNwZWNpYWwgYXQgYWxsIAotKwkJCSovCi0rCQkJaWYgKCAhcmVzICkKLSsJCQl7Ci0rCQkJCWVtaXREYXRhKChjaGFyKUFJRl9QVFJfSU5WQUxJRCwgc3RyZWFtKTsgCi0rCQkJCWJyZWFrOwotKwkJCX0KLSsKLSsJCQllbWl0RGF0YSgoY2hhcilBSUZfUFRSX05PUk1BTCwgc3RyZWFtKTsgCi0rCQl9Ci0rCi0rCQlhaWZfdmFsX3ByaW50X3JlY3Vyc2l2ZSAoVkFMVUVfVFlQRSh2cHRyKSwKLSsJCQkJCVZBTFVFX0NPTlRFTlRTKHZwdHIpLAotKwkJCQkJVkFMVUVfQUREUkVTUyh2cHRyKSwKLSsJCQkJCXN0cmVhbSk7Ci0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfU1RSVUNUOgotKwljYXNlIFRZUEVfQ09ERV9VTklPTjoKLSsJCS8qCi0rCQkqKiBBIHVuaW9uIGlzIHRyZWF0ZWQganVzdCBsaWtlIGEgc3RydWN0LiBUaGF0IGlzCi0rCQkqKiB3ZSBhdHRlbXB0IHRvIHRyYXZlcnNlIGVhY2ggZmllbGQgaWYgcG9zc2libGUuCi0rCQkqKiBJdCdzIHRoZW4gdXAgdG8gdGhlIHJlY2VpdmVyIHRvIGRlY2lkZSB3aGF0IGlzCi0rCQkqKiBzZW5zaWJsZSBpbmZvcm1hdGlvbi4KLSsJCSoqCi0rCQkqKiBYWFg6IFdoYXQgaGFwcGVucyBpZiBhIHBvaW50ZXIgcG9pbnRzIHRvIHJhbmRvbQotKwkJKiogZGF0YT8KLSsJCSovCi0rCQlmb3IgKCBpeCA9IDAgOyBpeCA8IFRZUEVfTkZJRUxEUyAodHlwZSkgOyBpeCsrICkKLSsJCXsKLSsJCQlpZiAoIFRZUEVfRklFTERfSUdOT1JFKHR5cGUsIGl4KSApCi0rCQkJCWNvbnRpbnVlOwotKwotKwkJCWlmIAotKwkJCSgKLSsJCQkJIVRZUEVfRklFTERfU1RBVElDKHR5cGUsIGl4KSAKLSsJCQkJJiYgCi0rCQkJCVRZUEVfRklFTERfUEFDS0VEKHR5cGUsIGl4KQotKwkJCSkKLSsJCQl7Ci0rCQkJCXZwdHIgPSB2YWx1ZV9mcm9tX2xvbmdlc3QoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwKLSsJCQkJCXVucGFja19maWVsZF9hc19sb25nKHR5cGUsIHZhbGFkZHIsIGl4KSk7Ci0rCi0rCQkJCWFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKFRZUEVfRklFTERfVFlQRSh0eXBlLCBpeCksIFZBTFVFX0NPTlRFTlRTKHZwdHIpLCAwLCBzdHJlYW0pOwotKwkJCX0KLSsJCQllbHNlIGlmICggVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGl4KSApCi0rCQkJewotKwkJCQl2cHRyID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpeCk7Ci0rCi0rCQkJCWlmICggdnB0ciA9PSBOVUxMICkKLSsJCQkJCWNvbnRpbnVlOwotKwotKwkJCQkvKgotKwkJCQlYWFgKLSsJCQkJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCB2LAotKwkJCQlzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSArIDEsCi0rCQkJCXByZXR0eSk7Ci0rCQkJCSovCi0rCQkJfQotKwkJCWVsc2UKLSsJCQkJYWlmX3ZhbF9wcmludF9yZWN1cnNpdmUoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGl4KSwgCi0rCQkJCQl2YWxhZGRyICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGl4KSAvIDgsCi0rCQkJCQlhZGRyZXNzICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGl4KSAvIDgsCi0rCQkJCQlzdHJlYW0pOwotKwkJfQotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0NIQVI6Ci0rCWFzQ2hhcjoKLSsJCXZhbCA9IHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKTsKLSsJCWVtaXREYXRhKChjaGFyKSAodmFsICYgMHhmZiksIHN0cmVhbSk7IAotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgVFlQRV9DT0RFX0lOVDoKLSsJCWxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKLSsKLSsJCWlmCi0rCQkoCi0rCQkJbGVuID09IDEgCi0rCQkJJiYKLSsJCQlzdHJuY21wKFRZUEVfTkFNRSh0eXBlKSwgImNoYXIiLCA1KSA9PSAwCi0rCQkpIAotKwkJCWdvdG8gYXNDaGFyOwotKwotKwkJdmFsID0gdW5wYWNrX2xvbmcodHlwZSwgdmFsYWRkcik7Ci0rCQlBSUZOb3JtYWxpc2UoKGNoYXIgKikgJnYsIGxlbiwgKGNoYXIgKikgJnZhbCwgc2l6ZW9mKExPTkdFU1QpKTsKLSsJCQotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikodi5jW2l4XSAmIDB4ZmYpLCBzdHJlYW0pOyAKLSsKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9GTFQ6Ci0rCQlsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSk7Ci0rCi0rCQlzd2l0Y2ggKCBsZW4gKSB7Ci0rCQljYXNlIDQ6Ci0rCQkJZnZhbCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJQUlGTm9ybWFsaXNlKChjaGFyICopICZ2LCBsZW4sICgoY2hhciAqKSAmZnZhbCksIHNpemVvZihET1VCTEVTVCkpOwotKwkJCWJyZWFrOwotKwotKwkJY2FzZSA4OgotKwkJCWR2YWwgPSB1bnBhY2tfZG91YmxlICh0eXBlLCB2YWxhZGRyLCAmdmFsaWQpOwotKwkJCUFJRk5vcm1hbGlzZSgoY2hhciAqKSAmdiwgbGVuLCAoKGNoYXIgKikgJmR2YWwpLCBzaXplb2YoRE9VQkxFU1QpKTsKLSsJCQlicmVhazsKLSsKLSsjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotKwkJY2FzZSAxNjoKLSsJCQlsZHZhbCA9IHVucGFja19kb3VibGUgKHR5cGUsIHZhbGFkZHIsICZ2YWxpZCk7Ci0rCQkJQUlGTm9ybWFsaXNlKChjaGFyICopICZ2LCBsZW4sICgoY2hhciAqKSAmbGR2YWwpLCBzaXplb2YoRE9VQkxFU1QpKTsKLSsJCQlicmVhazsKLSsjZW5kaWYgLyogSEFWRV9MT05HX0RPVUJMRSAqLwotKwkJZGVmYXVsdDoKLSsJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBoYW5kbGUgZmxvYXQgb2YgbGVuZ3RoICVkXG4iLCBsZW4pOwotKwkJfQotKwotKwkJZm9yICggaXggPSAwIDsgaXggPCBsZW4gOyBpeCsrICkKLSsJCQllbWl0RGF0YSgoY2hhcikgKHYuY1tpeF0gJiAweGZmKSwgc3RyZWFtKTsgCi0rCi0rCQlicmVhazsKLSsKLSsJY2FzZSBUWVBFX0NPREVfVk9JRDoKLSsJCWJyZWFrOwotKwotKwljYXNlIFRZUEVfQ09ERV9NRU1CRVI6Ci0rCWNhc2UgVFlQRV9DT0RFX0VOVU06Ci0rCWNhc2UgVFlQRV9DT0RFX1JBTkdFOgotKwljYXNlIFRZUEVfQ09ERV9GVU5DOgotKwljYXNlIFRZUEVfQ09ERV9NRVRIT0Q6Ci0rCWNhc2UgVFlQRV9DT0RFX1VOREVGOgotKwljYXNlIFRZUEVfQ09ERV9FUlJPUjoKLSsJCWJyZWFrOwotKwotKwlkZWZhdWx0OgotKwkJZXJyb3IgKCJJbnZhbGlkIEMvQysrIHR5cGUgY29kZSAlZCBpbiBzeW1ib2wgdGFibGUuIiwgVFlQRV9DT0RFICh0eXBlKSk7Ci0rCX0KLSt9Ci0rCi0rdm9pZCAKLSthaWZfdmFsX3ByaW50KHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyLCBpbnQgZW1iZWRkZWRfb2Zmc2V0LCBDT1JFX0FERFIgYWRkcmVzcywgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rICBzdHJfcHRyIHM7Ci0rCi0rICAvLyBzdHJ1Y3QgdWlfZmlsZSAqdHlwZVN0cmVhbT1tZW1fZmlsZW9wZW4oKTsKLSsgIG51bVZhbHVlc1NlZW4gPSAwOwotKyAgYWlmX2Rpc2NvdmVyKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBkb1ZhbHVlKTsgLyogdmFsdWVzICovCi0rICBhaWZfZGlzY292ZXIodHlwZSwgMCwgZG9UeXBlKTsgLyogdHlwZXMgKi8KLSsgIGFpZl9yZWR1Y2UoKTsKLSsgIGRhdGFTdHJlYW1Qb3MgPSAwOwotKyAgLy8gZnB1dHNfZmlsdGVyZWQoIigiLCBzdHJlYW0pOwotKyAgcyA9IGdkYl90eXBlX3RvX2Zkcyh0eXBlKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKHN0cl92YWwocyksIHN0cmVhbSk7Ci0rICBzdHJfZnJlZShzKTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKCIpIiwgc3RyZWFtKTsKLSsgIGZwdXRzX2ZpbHRlcmVkKCIgIiwgc3RyZWFtKTsKLSsgIGFpZl92YWxfcHJpbnRfcmVjdXJzaXZlKHR5cGUsIHZhbGFkZHIrZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0pOwotKyAgLy8gY29udGVudHMgPSB1aV9maWxlX3hzdHJkdXAodHlwZVN0cmVhbSwgJmR1bW15KTsKLSsgIC8vIGZwdXRzX2ZpbHRlcmVkKGNvbnRlbnRzLCBzdHJlYW0pOwotKyAgLy8gZnJlZShjb250ZW50cyk7Ci0rICAvLyB1aV9maWxlX2RlbGV0ZSh0eXBlU3RyZWFtKTsKLSsgIGdkYl9mbHVzaChzdHJlYW0pOwotK30gLyogYWlmX3ZhbF9wcmludCAqLwotKwotK3ZvaWQKLSthaWZfdHlwZV9wcmludChzdHJ1Y3QgdHlwZSAqdHlwZSwgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSkKLSt7Ci0rCXN0cl9wdHIJczsKLSsKLSsJbnVtVmFsdWVzU2VlbiA9IDA7Ci0rCWFpZl9kaXNjb3Zlcih0eXBlLCAwLCBkb1R5cGUpOyAvKiB0eXBlcyAqLwotKwlhaWZfcmVkdWNlKCk7Ci0rCWRhdGFTdHJlYW1Qb3MgPSAwOwotKwlzID0gZ2RiX3R5cGVfdG9fZmRzKHR5cGUpOwotKwlmcHV0c19maWx0ZXJlZChzdHJfdmFsKHMpLCBzdHJlYW0pOwotKwlzdHJfZnJlZShzKTsKLSt9Ci0rCi0rI2RlZmluZSBTVFJTSVpFIDEwMAotKwotK3N0cl9wdHIKLStzdHJfaW5pdCh2b2lkKQotK3sKLSsJc3RyX3B0cglzOwotKwotKwlzID0gKHN0cl9wdHIpeG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cl90eXBlKSk7Ci0rCXMtPmJ1ZiA9IChjaGFyICopeG1hbGxvYyhTVFJTSVpFKTsKLSsJcy0+YmxlbiA9IFNUUlNJWkU7Ci0rCXMtPnNsZW4gPSAwOwotKwkqKHMtPmJ1ZikgPSAnXDAnOwotKwotKwlyZXR1cm4gczsKLSt9Ci0rCi0rdm9pZAotK3N0cl9hZGQoc3RyX3B0ciBzMSwgY2hhciAqczIpCi0rewotKwlpbnQJbDIgPSBzdHJsZW4oczIpOwotKwotKwlpZiAoczEtPnNsZW4gKyBsMiA+PSBzMS0+YmxlbikKLSsJewotKwkJczEtPmJsZW4gKz0gbWF4KFNUUlNJWkUsIGwyKTsKLSsJCXMxLT5idWYgPSAoY2hhciAqKSB4cmVhbGxvYyAoczEtPmJ1ZiwgczEtPmJsZW4pOwotKwl9Ci0rCi0rCW1lbWNweSgmKHMxLT5idWZbczEtPnNsZW5dKSwgczIsIGwyKTsKLSsJczEtPnNsZW4gKz0gbDI7Ci0rCXMxLT5idWZbczEtPnNsZW5dID0gJ1wwJzsKLSt9Ci0rCi0rdm9pZAotK3N0cl9mcmVlKHN0cl9wdHIgcykKLSt7Ci0rCWZyZWUocy0+YnVmKTsKLSsJZnJlZShzKTsKLSt9Ci0rCi0rY2hhciAqCi0rc3RyX3ZhbChzdHJfcHRyIHMpCi0rewotKwlyZXR1cm4gcy0+YnVmOwotK30KLSsKLStzdHJfcHRyCi0rc3RyX2R1cChjaGFyICpzMSkKLSt7Ci0rCXN0cl9wdHIgcyA9IHN0cl9pbml0KCk7Ci0rCXN0cl9hZGQocywgczEpOwotKwlyZXR1cm4gczsKLSt9Ci0rCi0raW50Ci0rY2hlY2tfdmFsdWUoc3RydWN0IHR5cGUgKnR5cGUsIENPUkVfQUREUiBhZGRyLCBzdHJ1Y3QgdmFsdWUgKipyZXMpCi0rewotKyAgc3RydWN0IHZhbHVlICp2YWw7Ci0rICBjaGFyIGJ1ZltzaXplb2YgKFVMT05HRVNUKV07Ci0rCi0rICBpZiAoVFlQRV9DT0RFIChjaGVja190eXBlZGVmICh0eXBlKSkgPT0gVFlQRV9DT0RFX1ZPSUQpCi0rICAJcmV0dXJuIDA7Ci0rCi0rICAqcmVzID0gdmFsdWVfYXQodHlwZSwgYWRkciwgTlVMTCk7Ci0rCi0rICByZXR1cm4gMTsKLSt9Ci0rCi0tLS0gZ2RiLTUuMi1vbGQvZ2RiL2MtdmFscHJpbnQuYwlXZWQgSnVsIDEwIDEyOjQ2OjM1IDIwMDIKLSsrKyBnZGItNS4yL2dkYi9jLXZhbHByaW50LmMJTW9uIEp1bCAyMiAwOTo1ODozMSAyMDAyCi1AQCAtMzEsNiArMzEsMTIgQEAKLSAjaW5jbHVkZSAiY3AtYWJpLmgiCi0gDAotIAotKyNpZmRlZiBIQVZFX0FJRgotK2V4dGVybiBpbnQgbWF4X3ByaW50X2RlcHRoOyAvKiBzZXQgYnkgInNldCBwcmludCBkZXB0aCIgKi8KLStleHRlcm4gaW50IGN1cnJlbnRfcHJpbnRfZGVwdGg7Ci0rZXh0ZXJuIGludCB0eXBlcHJpbnQ7IC8qIHNldCBieSAic2V0IHByaW50IHR5cGUiIChCb29sZWFuKSAqLwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotKwotIC8qIFByaW50IGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBpbmZlcmlvciBhZGRyZXNzIEFERFJFU1Mgb250byBzdGRpbwotICAgIHN0cmVhbSBTVFJFQU0uICAqLwotIAotQEAgLTc2LDYgKzgyLDE1IEBACi0gICBMT05HRVNUIHZhbDsKLSAgIENPUkVfQUREUiBhZGRyOwotIAotKyNpZmRlZiBIQVZFX0FJRgotKyAgaWYgKHR5cGVwcmludCAmJiBmb3JtYXQgIT0gJ3MnKSAKLSsgICAgewotKyAgICAgIGZwdXRzX2ZpbHRlcmVkKCIoIiwgc3RyZWFtKTsKLSsgICAgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgc3RyZWFtLCAtMSk7Ci0rICAgICAgZnB1dHNfZmlsdGVyZWQoIikgIiwgc3RyZWFtKTsKLSsgICAgfQotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotKwotICAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7Ci0gICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCi0gICAgIHsKLUBAIC0xNTQsNiArMTY5LDkgQEAKLSAJICBicmVhazsKLSAJfQotICAgICAgIGVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7Ci0rI2lmZGVmIEhBVkVfQUlGCi0rICAgICAgaWYgKCFlbHR0eXBlKSBlbHR0eXBlID0gdHlwZTsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSAgICAgICBpZiAoVFlQRV9DT0RFIChlbHR0eXBlKSA9PSBUWVBFX0NPREVfTUVUSE9EKQotIAl7Ci0gCSAgY3BfcHJpbnRfY2xhc3NfbWV0aG9kICh2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0LCB0eXBlLCBzdHJlYW0pOwotQEAgLTE4Miw2ICsyMDAsMzYgQEAKLSAJICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChhZGRyLCAxLCBzdHJlYW0pOwotIAkgICAgfQotIAotKyNpZmRlZiBIQVZFX0FJRgotKwkgIGlmIChjdXJyZW50X3ByaW50X2RlcHRoIDwgbWF4X3ByaW50X2RlcHRoCi0rCSAgICAgICYmIFRZUEVfQ09ERSAoZWx0dHlwZSkgIT0gVFlQRV9DT0RFX1VOREVGCi0rCSAgICAgICYmIChUWVBFX0xFTkdUSCAoZWx0dHlwZSkgIT0gMQotKwkgICAgICB8fCBUWVBFX0NPREUgKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9JTlQpCi0rCSAgICAgICYmIGZvcm1hdCAhPSAncycpCi0rCSAgICB7IC8qIHByaW50IGNvbXBsZXggb2JqZWN0ZWQgcG9pbnRlZCB0byByZWN1cnNpdmVseSAqLwotKwkgICAgICBpZiAoYWRkcmVzc3ByaW50KSBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPT4gIik7Ci0rCSAgICAgIGlmIChhZGRyID09IDApCi0rCQl7Ci0rCQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIm5pbCIpOwotKwkJfQotKwkgICAgICBlbHNlCi0rCSAgICAgIHsgLyogbm9uIG5pbCAqLwotKwkJc3RydWN0IHZhbHVlICpkZXJlZl92YWwgPSB2YWx1ZV9hdChlbHR0eXBlLCBhZGRyLCBOVUxMKTsKLSsJCWN1cnJlbnRfcHJpbnRfZGVwdGggKz0gMTsKLSsJCXZhbF9wcmludCAoVkFMVUVfVFlQRSAoZGVyZWZfdmFsKSwKLSsJCQkgICAgVkFMVUVfQ09OVEVOVFMgKGRlcmVmX3ZhbCksCi0rCQkJICAgIDAsCi0rCQkJICAgIFZBTFVFX0FERFJFU1MgKGRlcmVmX3ZhbCksCi0rCQkJICAgIHN0cmVhbSwKLSsJCQkgICAgZm9ybWF0LAotKwkJCSAgICBkZXJlZl9yZWYsCi0rCQkJICAgIHJlY3Vyc2UsCi0rCQkJICAgIHByZXR0eSk7Ci0rCQljdXJyZW50X3ByaW50X2RlcHRoIC09IDE7Ci0rCSAgICAgIH0KLSsJICAgIH0gLyogcHJpbnQgcmVjdXJzaXZlbHkgKi8KLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSsKLSAJICAvKiBGb3IgYSBwb2ludGVyIHRvIGNoYXIgb3IgdW5zaWduZWQgY2hhciwgYWxzbyBwcmludCB0aGUgc3RyaW5nCi0gCSAgICAgcG9pbnRlZCB0bywgdW5sZXNzIHBvaW50ZXIgaXMgbnVsbC4gICovCi0gCSAgLyogRklYTUU6IG5lZWQgdG8gaGFuZGxlIHdjaGFyX3QgaGVyZS4uLiAqLwotQEAgLTM1Niw5ICs0MDQsMTEgQEAKLSAJfQotICAgICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY29uc2lkZXIsIGF0IGxlYXN0IGZvciBBTlNJIEMgbGFuZ3VhZ2UsIGVsaW1pbmF0aW5nCi0gICAgICAgICAgdGhlIGRpc3RpbmN0aW9uIG1hZGUgYmV0d2VlbiBGVU5DcyBhbmQgUE9JTlRFUnMgdG8gRlVOQ3MuICAqLwotKyNpZm5kZWYgSEFWRV9BSUYKLSAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ7Iik7Ci0gICAgICAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOwotICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIn0gIik7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gICAgICAgLyogVHJ5IHRvIHByaW50IHdoYXQgZnVuY3Rpb24gaXQgcG9pbnRzIHRvLCBhbmQgaXRzIGFkZHJlc3MuICAqLwotICAgICAgIHByaW50X2FkZHJlc3NfZGVtYW5nbGUgKGFkZHJlc3MsIHN0cmVhbSwgZGVtYW5nbGUpOwotICAgICAgIGJyZWFrOwotQEAgLTU1OSw5ICs2MDksMTEgQEAKLSAgICAgICBlbHNlCi0gCXsKLSAJICAvKiBub3JtYWwgY2FzZSAqLwotKyNpZm5kZWYgSEFWRV9BSUYKLSAJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIoIik7Ci0gCSAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOwotIAkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikgIik7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gCX0KLSAgICAgfQotICAgaWYgKG9iamVjdHByaW50ICYmIChUWVBFX0NPREUgKFZBTFVFX1RZUEUgKHZhbCkpID09IFRZUEVfQ09ERV9DTEFTUykpCi0tLS0gZ2RiLTUuMi1vbGQvZ2RiL3ByaW50Y21kLmMJV2VkIEp1bCAxMCAxMjo0NjozNyAyMDAyCi0rKysgZ2RiLTUuMi9nZGIvcHJpbnRjbWQuYwlNb24gSnVsIDIyIDA5OjU4OjMxIDIwMDIKLUBAIC00Myw2ICs0Myw3IEBACi0gCi0gZXh0ZXJuIGludCBhc21fZGVtYW5nbGU7CS8qIFdoZXRoZXIgdG8gZGVtYW5nbGUgc3ltcyBpbiBhc20gcHJpbnRvdXRzICovCi0gZXh0ZXJuIGludCBhZGRyZXNzcHJpbnQ7CS8qIFdoZXRoZXIgdG8gcHJpbnQgaGV4IGFkZHJlc3NlcyBpbiBITEwgIiAqLwotK2V4dGVybiBpbnQgY3VycmVudF9wcmludF9kZXB0aDsgLyogZnJvbSB2YWxwcmludC5jICovCi0gCi0gc3RydWN0IGZvcm1hdF9kYXRhCi0gICB7Ci1AQCAtMzIwLDEyICszMjEsMjEgQEAKLSAJICB8fCBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJJTkcKLSAJICB8fCBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QKLSAJICB8fCBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9VTklPTikKLSsjaWZkZWYgSEFWRV9BSUYKLSsJewotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotIAkvKiBJZiBmb3JtYXQgaXMgMCwgdXNlIHRoZSAnbmF0dXJhbCcgZm9ybWF0IGZvcgotIAkgKiB0aGF0IHR5cGUgb2YgdmFsdWUuICBJZiB0aGUgdHlwZSBpcyBub24tc2NhbGFyLAotIAkgKiB3ZSBoYXZlIHRvIHVzZSBsYW5ndWFnZSBydWxlcyB0byBwcmludCBpdCBhcwotIAkgKiBhIHNlcmllcyBvZiBzY2FsYXJzLgotIAkgKi8KLSsjaWZkZWYgSEFWRV9BSUYKLSsJY3VycmVudF9wcmludF9kZXB0aCA9IDA7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gCXZhbHVlX3ByaW50ICh2YWwsIHN0cmVhbSwgZm9ybWF0LCBWYWxfcHJldHR5X2RlZmF1bHQpOwotKyNpZmRlZiBIQVZFX0FJRgotKwl9Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gICAgICAgZWxzZQotIAkvKiBVc2VyIHNwZWNpZmllZCBmb3JtYXQsIHNvIGRvbid0IGxvb2sgdG8gdGhlCi0gCSAqIHRoZSB0eXBlIHRvIHRlbGwgdXMgd2hhdCB0byBkby4KLS0tLSBnZGItNS4yLW9sZC9nZGIvdHlwZXByaW50LmMJV2VkIEp1bCAxMCAxMjo0NjozNyAyMDAyCi0rKysgZ2RiLTUuMi9nZGIvdHlwZXByaW50LmMJV2VkIFNlcCAxOCAxODoyNjowOCAyMDAyCi1AQCAtNDIsNiArNDIsMTEgQEAKLSAKLSBleHRlcm4gdm9pZCBfaW5pdGlhbGl6ZV90eXBlcHJpbnQgKHZvaWQpOwotIAotKyNpZmRlZiBIQVZFX0FJRgotK2V4dGVybiBpbnQgYWlmcHJpbnQ7IC8qIHByaW50IHR5cGUgdXNpbmcgQUlGICovCi0rZXh0ZXJuIHZvaWQgYWlmX3R5cGVfcHJpbnQgKHN0cnVjdCB0eXBlICosIHN0cnVjdCB1aV9maWxlICopOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotKwotIHN0YXRpYyB2b2lkIHB0eXBlX2NvbW1hbmQgKGNoYXIgKiwgaW50KTsKLSAKLSBzdGF0aWMgc3RydWN0IHR5cGUgKnB0eXBlX2V2YWwgKHN0cnVjdCBleHByZXNzaW9uICopOwotQEAgLTExNiw2ICsxMjEsMTMgQEAKLSB0eXBlX3ByaW50IChzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqdmFyc3RyaW5nLCBzdHJ1Y3QgdWlfZmlsZSAqc3RyZWFtLAotIAkgICAgaW50IHNob3cpCi0gewotKyNpZmRlZiBIQVZFX0FJRgotKyAgaWYgKGFpZnByaW50KQotKyAgICB7Ci0rICAgICAgICBhaWZfdHlwZV9wcmludCAodHlwZSwgc3RyZWFtKTsKLSsgICAgICAgIHJldHVybjsKLSsgICAgfQotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotICAgTEFfUFJJTlRfVFlQRSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIDApOwotIH0KLSAKLS0tLSBnZGItNS4yLW9sZC9nZGIvdmFscHJpbnQuYwlXZWQgSnVsIDEwIDEyOjQ2OjM3IDIwMDIKLSsrKyBnZGItNS4yL2dkYi92YWxwcmludC5jCU1vbiBKdWwgMjIgMDk6NTg6MzEgMjAwMgotQEAgLTM3LDEwICszNywyMSBAQAotIAotICNpbmNsdWRlIDxlcnJuby5oPgotIAotKyNpZmRlZiBIQVZFX0FJRgotK2V4dGVybiBpbnQgYWlmcHJpbnQ7IC8qIHNldCBieSAic2V0IHByaW50IGFpZiIgKEJvb2xlYW4pICovCi0rdm9pZCBhaWZfdmFsX3ByaW50IChzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqdmFsYWRkciwgaW50IGVtYmVkZGVkX29mZnNldCwKLSsJCQlDT1JFX0FERFIgYWRkcmVzcywgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbSk7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0rCi0gLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0gCi0rI2lmZGVmIEhBVkVfQUlGCi0raW50IHBhcnRpYWxfbWVtb3J5X3JlYWQgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsCi0rCQkJCWludCBsZW4sIGludCAqZXJybm9wdHIpOwotKyNlbHNlIC8qIEhBVkVfQUlGICovCi0gc3RhdGljIGludCBwYXJ0aWFsX21lbW9yeV9yZWFkIChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAotIAkJCQlpbnQgbGVuLCBpbnQgKmVycm5vcHRyKTsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSAKLSBzdGF0aWMgdm9pZCBwcmludF9oZXhfY2hhcnMgKHN0cnVjdCB1aV9maWxlICosIHVuc2lnbmVkIGNoYXIgKiwKLSAJCQkgICAgIHVuc2lnbmVkIGludCk7Ci1AQCAtMTAzLDYgKzExNCwxOCBAQAotIC8qIElmIG5vbnplcm8sIGNhdXNlcyBtYWNoaW5lIGFkZHJlc3NlcyB0byBiZSBwcmludGVkIGluIGNlcnRhaW4gY29udGV4dHMuICovCi0gCi0gaW50IGFkZHJlc3NwcmludDsJCS8qIENvbnRyb2xzIHByaW50aW5nIG9mIG1hY2hpbmUgYWRkcmVzc2VzICovCi0rCi0rI2lmZGVmIEhBVkVfQUlGCi0rLyogSWYgcG9zaXRpdmUsIGNhdXNlcyBwb2ludGVycyB0byBiZSBmb2xsb3dlZCBpbiBwcmludGluZywgdG8gZ2l2ZW4gZGVwdGggKi8KLStpbnQgbWF4X3ByaW50X2RlcHRoOwotK2ludCBjdXJyZW50X3ByaW50X2RlcHRoID0gMDsgLyogcmVzZXQgdG8gMCBhdCBlYWNoIGludGVycnVwdCAqLwotKyAKLSsvKiBJZiBub256ZXJvLCBjYXVzZXMgdHlwZXMgdG8gYmUgcHJpbnRlZC4gKi8KLStpbnQgdHlwZXByaW50OwotKyAKLSsvKiBJZiBub256ZXJvLCBjYXVzZXMgdHlwZXMgdG8gYmUgcHJpbnRlZCwgaWYgYXQgYWxsLCBpbiBBSUYgZm9ybWF0LiAqLwotK2ludCBhaWZwcmludDsKLSsjZW5kaWYgLyogSEFWRV9BSUYgKi8KLSAMCi0gCi0gLyogUHJpbnQgZGF0YSBvZiB0eXBlIFRZUEUgbG9jYXRlZCBhdCBWQUxBRERSICh3aXRoaW4gR0RCKSwgd2hpY2ggY2FtZSBmcm9tCi1AQCAtMTQ5LDYgKzE3MiwxNCBAQAotICAgICAgIHJldHVybiAoMCk7Ci0gICAgIH0KLSAKLSsjaWZkZWYgSEFWRV9BSUYKLSsgIGlmIChhaWZwcmludCkKLSsgIHsKLSsgICAgYWlmX3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0pOwotKyAgICByZXR1cm4gMDsgCi0rICB9Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0rCi0gICByZXR1cm4gKExBX1ZBTF9QUklOVCAodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLAotIAkJCXN0cmVhbSwgZm9ybWF0LCBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSkpOwotIH0KLUBAIC0xMDcyLDcgKzExMDMsMTIgQEAKLSAvKiBGSVhNRTogY2FnbmV5LzE5OTktMTAtMTQ6IE9ubHkgdXNlZCBieSB2YWxfcHJpbnRfc3RyaW5nLiAgQ2FuIHRoaXMKLSAgICBmdW5jdGlvbiBiZSBlbGltaW5hdGVkLiAgKi8KLSAKLSsjaWZkZWYgSEFWRV9BSUYKLSsvKiBJdCBpcyBub3cgdXNlZCBieSBhaWZfcHJpbnRfc3RyaW5nIGFzIHdlbGwuICovCi0raW50Ci0rI2Vsc2UgLyogSEFWRV9BSUYgKi8KLSBzdGF0aWMgaW50Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gcGFydGlhbF9tZW1vcnlfcmVhZCAoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwgaW50IGxlbiwgaW50ICplcnJub3B0cikKLSB7Ci0gICBpbnQgbnJlYWQ7CQkJLyogTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuICovCi1AQCAtMTI2MCw3ICsxMjk2LDExIEBACi0gICAgIHsKLSAgICAgICBpZiAoYWRkcmVzc3ByaW50KQotIAl7Ci0rI2lmZGVmIEhBVkVfQUlGCi0rCSAgZnB1dHNfZmlsdGVyZWQgKCI9PiIsIHN0cmVhbSk7Ci0rI2Vsc2UgLyogSEFWRV9BSUYgKi8KLSAJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotIAl9Ci0gICAgICAgTEFfUFJJTlRfU1RSSU5HIChzdHJlYW0sIGJ1ZmZlciwgKGJ1ZnB0ciAtIGJ1ZmZlcikgLyB3aWR0aCwgd2lkdGgsIGZvcmNlX2VsbGlwc2lzKTsKLSAgICAgfQotQEAgLTE0ODUsNiArMTUyNSwyOSBAQAotIAkJICAmc2V0cHJpbnRsaXN0KSwKLSAgICAgICZzaG93cHJpbnRsaXN0KTsKLSAKLSsjaWZkZWYgSEFWRV9BSUYKLSsgIGFkZF9zaG93X2Zyb21fc2V0Ci0rICAgIChhZGRfc2V0X2NtZCAoImRlcHRoIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAotKwkJICAoY2hhciAqKSAmbWF4X3ByaW50X2RlcHRoLAotKwkJICAiU2V0IGRlcHRoIG9mIHBvaW50ZXIgcmVjdXJzaW9uLiIsCi0rCQkgICZzZXRwcmludGxpc3QpLAotKyAgICAgICZzaG93cHJpbnRsaXN0KTsKLSsKLSsgIGFkZF9zaG93X2Zyb21fc2V0Ci0rICAgIChhZGRfc2V0X2NtZCAoInR5cGUiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLSsJCSAgKGNoYXIgKikgJnR5cGVwcmludCwKLSsJCSAgIlNldCBwcmludGluZyBvZiB0eXBlcy4iLAotKwkJICAmc2V0cHJpbnRsaXN0KSwKLSsgICAgICAmc2hvd3ByaW50bGlzdCk7Ci0rCi0rICBhZGRfc2hvd19mcm9tX3NldAotKyAgICAoYWRkX3NldF9jbWQgKCJhaWYiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLSsJCSAgKGNoYXIgKikgJmFpZnByaW50LAotKwkJICAiU2V0IHByaW50aW5nIG9mIHR5cGVzIHRvIGFpZiBmb3JtYXQuIiwKLSsJCSAgJnNldHByaW50bGlzdCksCi0rICAgICAgJnNob3dwcmludGxpc3QpOwotKyNlbmRpZiAvKiBIQVZFX0FJRiAqLwotKwotICAgYyA9IGFkZF9zZXRfY21kICgiaW5wdXQtcmFkaXgiLCBjbGFzc19zdXBwb3J0LCB2YXJfdWludGVnZXIsCi0gCQkgICAoY2hhciAqKSAmaW5wdXRfcmFkaXgsCi0gCQkgICAiU2V0IGRlZmF1bHQgaW5wdXQgcmFkaXggZm9yIGVudGVyaW5nIG51bWJlcnMuIiwKLUBAIC0xNTIwLDQgKzE1ODMsOSBAQAotICAgdW5pb25wcmludCA9IDE7Ci0gICBhZGRyZXNzcHJpbnQgPSAxOwotICAgcHJpbnRfbWF4ID0gUFJJTlRfTUFYX0RFRkFVTFQ7Ci0rI2lmZGVmIEhBVkVfQUlGCi0rICBtYXhfcHJpbnRfZGVwdGggPSAtMTsKLSsgIHR5cGVwcmludCA9IDA7Ci0rICBhaWZwcmludCA9IDA7Ci0rI2VuZGlmIC8qIEhBVkVfQUlGICovCi0gfQotLS0tIC9kZXYvbnVsbAlGcmkgTWFyIDIzIDIyOjAwOjMzIDIwMDEKLSsrKyBnZGItNS4yL2dkYi9saWJhaWYubWsJTW9uIEp1bCAyMiAwOTo1ODozMSAyMDAyCi1AQCAtMCwwICsxLDkgQEAKLStJTkNMVURFX0NGTEFHUyArPSAkKElOQ0xVREVfYWlmKQotKwotK0NMSUJTICs9ICQoTElCX2FpZikKLSsKLStTRklMRVMgICAgICs9IGFpZi12YWxwcmludC5jCi0rQ09NTU9OX09CUyArPSBhaWYtdmFscHJpbnQubwotKwotK2FpZi12YWxwcmludC5vOiBhaWYtdmFscHJpbnQuYyAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RidHlwZXNfaCkgXAotKwlsYW5ndWFnZS5oICQoc3ltdGFiX2gpIHZhbHByaW50LmggJCh2YWx1ZV9oKQotLS0tIGdkYi01LjItb2xkL2dkYi9jb25maWd1cmUuaW4JV2VkIEp1bCAxMCAxMjo0NjozNSAyMDAyCi0rKysgZ2RiLTUuMi9nZGIvY29uZmlndXJlLmluCU1vbiBKdWwgMjIgMDk6NTg6MzEgMjAwMgotQEAgLTMwLDYgKzMwLDk1IEBACi0gQUNfSVNDX1BPU0lYCi0gQU1fUFJPR19DQ19TVERDCi0gCi0rQUNfQVJHX1dJVEgoYWlmLAotK1sgIC0td2l0aC1haWY9ZGlyICAgICAgICAgICAgICAgIHVzZSBhaWYgaW4gZGlyXSkKLStBQ19BUkdfV0lUSChhaWYtbGliLAotK1sgIC0td2l0aC1haWYtbGliPWRpciAgICAgICAgICAgIHVzZSBhaWYgbGlicmFyaWVzIGluIGRpcl0sCi0rW2lmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0rICBBQ19NU0dfRVJST1IoW05vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWxpYl0pCi0rZWxpZiB0ZXN0ICJYJHdpdGhfYWlmIiA9ICJYIjsgdGhlbgotKyAgd2l0aF9haWY9eWVzCi0rZmldKQotK0FDX0FSR19XSVRIKGFpZi1pbmNsdWRlLAotK1sgIC0td2l0aC1haWYtaW5jbHVkZT1kaXIgICAgICAgIHVzZSBhaWYgaGVhZGVycyBpbiBkaXJdLAotK1tpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIiAtbyAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotKyAgQUNfTVNHX0VSUk9SKFtObyBhcmd1bWVudCBmb3IgLS13aXRoLWFpZi1pbmNsdWRlXSkKLStlbGlmIHRlc3QgIlgkd2l0aF9haWYiID0gIlgiOyB0aGVuCi0rICB3aXRoX2FpZj15ZXMKLStmaV0pCi0rCi0rQUNfTVNHX0NIRUNLSU5HKGZvciBhaWYpCi0rCi0rY2FzZSAiJHdpdGhfYWlmIiBpbgotK3llcykJOzsKLStubykJOzsKLSsiIikJOzsKLSsqKQlpZiB0ZXN0ICIkd2l0aF9haWZfaW5jbHVkZSIgPSAiIjsgdGhlbgotKwkJd2l0aF9haWZfaW5jbHVkZT0iJHdpdGhfYWlmL2luY2x1ZGUiCi0rCWZpCi0rCWlmIHRlc3QgIiR3aXRoX2FpZl9saWIiID0gIiI7IHRoZW4KLSsJCXdpdGhfYWlmX2xpYj0iJHdpdGhfYWlmL2xpYiRhYmlsaWJkaXJleHQiCi0rCWZpCi0rCTs7Ci0rZXNhYwotK2hlYWRlcl9kaXJzPQotK2xpYl9kaXJzPQotK2Q9Jy91c3IvbG9jYWwnCi0rZm9yIGkgaW4gJGQgL3VzcjsgZG8KLSsJaGVhZGVyX2RpcnM9IiRoZWFkZXJfZGlycyAkaS9pbmNsdWRlIgotKwlsaWJfZGlycz0iJGxpYl9kaXJzICRpL2xpYiRhYmlsaWJkaXJleHQiCi0rZG9uZQotKwotK2Nhc2UgIiR3aXRoX2FpZl9pbmNsdWRlIiBpbgotK3llcykgOzsKLStubykgIDs7Ci0rKikgICBoZWFkZXJfZGlycz0iJHdpdGhfYWlmX2luY2x1ZGUgJGhlYWRlcl9kaXJzIjs7Ci0rZXNhYwotK2Nhc2UgIiR3aXRoX2FpZl9saWIiIGluCi0reWVzKSA7OwotK25vKSAgOzsKLSsqKSAgIGxpYl9kaXJzPSIkd2l0aF9haWZfbGliICRsaWJfZGlycyI7OwotK2VzYWMKLSsKLStzYXZlX0NGTEFHUz0iJENGTEFHUyIKLStzYXZlX0xJQlM9IiRMSUJTIgotK2lyZXM9IGxyZXM9Ci0rZm9yIGkgaW4gJGhlYWRlcl9kaXJzOyBkbwotKwlDRkxBR1M9Ii1JJGkgJHNhdmVfQ0ZMQUdTIgotKwlBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGFpZi5oPl0sLGlyZXM9JGk7YnJlYWspCi0rZG9uZQotK2ZvciBpIGluICRsaWJfZGlyczsgZG8KLSsJTElCUz0iLUwkaSAtbGFpZiAkc2F2ZV9MSUJTIgotKwlBQ19UUllfTElOSyhbI2luY2x1ZGUgPGFpZi5oPl0sLGxyZXM9JGk7YnJlYWspCi0rZG9uZQotK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotK0xJQlM9IiRzYXZlX0xJQlMiCi0rCi0raWYgdGVzdCAiJGlyZXMiIC1hICIkbHJlcyIgLWEgIiR3aXRoX2FpZiIgIT0gIm5vIjsgdGhlbgotKwlhaWZfaW5jbHVkZWRpcj0iJGlyZXMiCi0rCWFpZl9saWJkaXI9IiRscmVzIgotKwlESVJfYWlmPQotKwlJTkNMVURFX2FpZj0iLUkkYWlmX2luY2x1ZGVkaXIiCi0rCUxJQl9haWY9Ii1MJGFpZl9saWJkaXIgLWxhaWYiCi0rCUFDX0RFRklORV9VTlFVT1RFRChIQVZFX0FJRiwxLFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFpZiBwYWNrYWdlLl0pCi0rCXdpdGhfYWlmPXllcwotKwlBQ19NU0dfUkVTVUxUKFtoZWFkZXJzICRpcmVzLCBsaWJyYXJpZXMgJGxyZXNdKQotK2Vsc2UKLSsJRElSX2FpZj0iYWlmIgotKwlJTkNMVURFX2FpZj0KLSsJTElCX2FpZj0KLSsJd2l0aF9haWY9bm8KLSsJQUNfTVNHX1JFU1VMVCgkd2l0aF9haWYpCi0rZmkKLStBQ19TVUJTVChESVJfYWlmKQotK0FDX1NVQlNUKElOQ0xVREVfYWlmKQotK0FDX1NVQlNUKExJQl9haWYpCi0rCi0raWYgdGVzdCAiJHdpdGhfYWlmIiA9ICJubyI7IHRoZW4KLSsgICAgICAgIEFDX01TR19FUlJPUihbWW91IG11c3QgaGF2ZSBsaWJhaWYgdG8gY29tcGlsZSB0aGlzIHZlcnNpb24gb2YgR0RCLl0pCi0rZmkKLStBQ19ERUZJTkUoSEFWRV9BSUYsIDEsIFtFbmFibGUgQUlGIHN1cHBvcnQgaW4gaW4gR0RCLl0pZG5sCi0rCi0gQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLikKLSBBQ19DQU5PTklDQUxfU1lTVEVNCi0gCi0tLS0gZ2RiLTUuMi1vbGQvZ2RiL2NvbmZpZ3VyZQlXZWQgSnVsIDEwIDEyOjQ2OjM1IDIwMDIKLSsrKyBnZGItNS4yL2dkYi9jb25maWd1cmUJTW9uIEp1bCAyMiAwOTo1ODozMSAyMDAyCi1AQCAtMTUsNiArMTUsMTIgQEAKLSAgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0gYWNfaGVscD0iJGFjX2hlbHAKLSsgIC0td2l0aC1haWY9ZGlyICAgICAgICAgICAgICAgIHVzZSBhaWYgaW4gZGlyIgotK2FjX2hlbHA9IiRhY19oZWxwCi0rICAtLXdpdGgtYWlmLWxpYj1kaXIgICAgICAgICAgICB1c2UgYWlmIGxpYnJhcmllcyBpbiBkaXIiCi0rYWNfaGVscD0iJGFjX2hlbHAKLSsgIC0td2l0aC1haWYtaW5jbHVkZT1kaXIgICAgICAgIHVzZSBhaWYgaGVhZGVycyBpbiBkaXIiCi0rYWNfaGVscD0iJGFjX2hlbHAKLSAgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi0gYWNfaGVscD0iJGFjX2hlbHAKLSAgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotQEAgLTc5LDcgKzg1LDYgQEAKLSBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotIHNpbGVudD0KLSBzaXRlPQotLXNpdGVmaWxlPQotIHNyY2Rpcj0KLSB0YXJnZXQ9Tk9ORQotIHZlcmJvc2U9Ci1AQCAtMTk0LDcgKzE5OSw2IEBACi0gICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLS0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLSBEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLUBAIC0zNjUsMTEgKzM2OSw2IEBACi0gICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotIAotLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0tICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLS0KLSAgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotQEAgLTUzNSwxNiArNTM0LDEyIEBACi0gc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0gCi0gIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLS1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0tICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0tICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotLSAgICBlbHNlCi0tICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotLSAgICBmaQotK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSsgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSsgIGVsc2UKLSsgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgZmkKLS1lbHNlCi0tICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotIGZpCi0gZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotQEAgLTU4NSw3ICs1ODAsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTg5OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU4NDogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLUBAIC02MTEsNyArNjA2LDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYxNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjEwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTY0MSw3ICs2MzYsNyBAQAotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNjkyLDcgKzY4Nyw3IEBACi0gICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Njk2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2OTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNzI0LDcgKzcxOSw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3Mjg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjcyMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLSAKLSBhY19leHQ9YwotICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLUBAIC03MzUsMTIgKzczMCwxMiBAQAotIAotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0gCi0tI2xpbmUgNzM5ICJjb25maWd1cmUiCi0rI2xpbmUgNzM0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gbWFpbigpe3JldHVybigwKTt9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLUBAIC03NjYsMTIgKzc2MSwxMiBAQAotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSBmaQotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzcwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc2NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotIGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotIGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Nzc1OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc3MDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC03ODAsNyArNzc1LDcgQEAKLSAgIHllczsKLSAjZW5kaWYKLSBFT0YKLS1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLStpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzc5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIGFjX2N2X3Byb2dfZ2NjPXllcwotIGVsc2UKLSAgIGFjX2N2X3Byb2dfZ2NjPW5vCi1AQCAtNzk5LDcgKzc5NCw3IEBACi0gYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gQ0ZMQUdTPQotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjgwMzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLStlY2hvICJjb25maWd1cmU6Nzk4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtODMxLDcgKzgyNiw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjgzNTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4MzA6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSAjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotIGlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gICBDUFA9Ci1AQCAtODQ2LDEzICs4NDEsMTMgQEAKLSAgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDg1MCAiY29uZmlndXJlIgotKyNsaW5lIDg0NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhc3NlcnQuaD4KLSBTeW50YXggRXJyb3IKLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgOgotQEAgLTg2MywxMyArODU4LDEzIEBACi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODY3ICJjb25maWd1cmUiCi0rI2xpbmUgODYyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGFzc2VydC5oPgotIFN5bnRheCBFcnJvcgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Njg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICA6Ci1AQCAtODgwLDEzICs4NzUsMTMgQEAKLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4ODQgImNvbmZpZ3VyZSIKLSsjbGluZSA4NzkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gU3ludGF4IEVycm9yCi0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjg5MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIDoKLUBAIC05MTEsOSArOTA2LDkgQEAKLSBlY2hvICIkYWNfdCIiJENQUCIgMT4mNgotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBSVgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5MTU6IGNoZWNraW5nIGZvciBBSVgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo5MTA6IGNoZWNraW5nIGZvciBBSVgiID4mNQotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA5MTcgImNvbmZpZ3VyZSIKLSsjbGluZSA5MTIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWZkZWYgX0FJWAotICAgeWVzCi1AQCAtOTM1LDcgKzkzMCw3IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5Mzk6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLStlY2hvICJjb25maWd1cmU6OTM0OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci0gaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi0gdGhlbgotQEAgLTk1OSw3ICs5NTQsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjk2MzogY2hlY2tpbmcgZm9yICR7Q0MtY2N9IG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKLStlY2hvICJjb25maWd1cmU6OTU4OiBjaGVja2luZyBmb3IgJHtDQy1jY30gb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9wcm9nX2NjX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtOTc2LDcgKzk3MSw3IEBACi0gZG8KLSAgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDk4MCAiY29uZmlndXJlIgotKyNsaW5lIDk3NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzdGRhcmcuaD4KLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC0xMDEzLDcgKzEwMDgsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFtX2N2X3Byb2dfY2Nfc3RkYz0iJGFjX2FyZyI7IGJyZWFrCi0gZWxzZQotQEAgLTEwMzcsNiArMTAzMiwxNDEgQEAKLSBlc2FjCi0gCi0gCi0rIyBDaGVjayB3aGV0aGVyIC0td2l0aC1haWYgb3IgLS13aXRob3V0LWFpZiB3YXMgZ2l2ZW4uCi0raWYgdGVzdCAiJHt3aXRoX2FpZitzZXR9IiA9IHNldDsgdGhlbgotKyAgd2l0aHZhbD0iJHdpdGhfYWlmIgotKyAgOgotK2ZpCi0rCi0rIyBDaGVjayB3aGV0aGVyIC0td2l0aC1haWYtbGliIG9yIC0td2l0aG91dC1haWYtbGliIHdhcyBnaXZlbi4KLStpZiB0ZXN0ICIke3dpdGhfYWlmX2xpYitzZXR9IiA9IHNldDsgdGhlbgotKyAgd2l0aHZhbD0iJHdpdGhfYWlmX2xpYiIKLSsgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiIC1vICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0rICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IE5vIGFyZ3VtZW50IGZvciAtLXdpdGgtYWlmLWxpYiIgMT4mMjsgZXhpdCAxOyB9Ci0rZWxpZiB0ZXN0ICJYJHdpdGhfYWlmIiA9ICJYIjsgdGhlbgotKyAgd2l0aF9haWY9eWVzCi0rZmkKLStmaQotKwotKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYWlmLWluY2x1ZGUgb3IgLS13aXRob3V0LWFpZi1pbmNsdWRlIHdhcyBnaXZlbi4KLStpZiB0ZXN0ICIke3dpdGhfYWlmX2luY2x1ZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIHdpdGh2YWw9IiR3aXRoX2FpZl9pbmNsdWRlIgotKyAgaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyIgLW8gIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSsgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogTm8gYXJndW1lbnQgZm9yIC0td2l0aC1haWYtaW5jbHVkZSIgMT4mMjsgZXhpdCAxOyB9Ci0rZWxpZiB0ZXN0ICJYJHdpdGhfYWlmIiA9ICJYIjsgdGhlbgotKyAgd2l0aF9haWY9eWVzCi0rZmkKLStmaQotKwotKwotK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhaWYiIi4uLiAkYWNfYyIgMT4mNgotK2VjaG8gImNvbmZpZ3VyZToxMDY0OiBjaGVja2luZyBmb3IgYWlmIiA+JjUKLSsKLStjYXNlICIkd2l0aF9haWYiIGluCi0reWVzKQk7OwotK25vKQk7OwotKyIiKQk7OwotKyopCWlmIHRlc3QgIiR3aXRoX2FpZl9pbmNsdWRlIiA9ICIiOyB0aGVuCi0rCQl3aXRoX2FpZl9pbmNsdWRlPSIkd2l0aF9haWYvaW5jbHVkZSIKLSsJZmkKLSsJaWYgdGVzdCAiJHdpdGhfYWlmX2xpYiIgPSAiIjsgdGhlbgotKwkJd2l0aF9haWZfbGliPSIkd2l0aF9haWYvbGliJGFiaWxpYmRpcmV4dCIKLSsJZmkKLSsJOzsKLStlc2FjCi0raGVhZGVyX2RpcnM9Ci0rbGliX2RpcnM9Ci0rZD0nL3Vzci9sb2NhbCcKLStmb3IgaSBpbiAkZCAvdXNyOyBkbwotKwloZWFkZXJfZGlycz0iJGhlYWRlcl9kaXJzICRpL2luY2x1ZGUiCi0rCWxpYl9kaXJzPSIkbGliX2RpcnMgJGkvbGliJGFiaWxpYmRpcmV4dCIKLStkb25lCi0rCi0rY2FzZSAiJHdpdGhfYWlmX2luY2x1ZGUiIGluCi0reWVzKSA7OwotK25vKSAgOzsKLSsqKSAgIGhlYWRlcl9kaXJzPSIkd2l0aF9haWZfaW5jbHVkZSAkaGVhZGVyX2RpcnMiOzsKLStlc2FjCi0rY2FzZSAiJHdpdGhfYWlmX2xpYiIgaW4KLSt5ZXMpIDs7Ci0rbm8pICA7OwotKyopICAgbGliX2RpcnM9IiR3aXRoX2FpZl9saWIgJGxpYl9kaXJzIjs7Ci0rZXNhYwotKwotK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotK3NhdmVfTElCUz0iJExJQlMiCi0raXJlcz0gbHJlcz0KLStmb3IgaSBpbiAkaGVhZGVyX2RpcnM7IGRvCi0rCUNGTEFHUz0iLUkkaSAkc2F2ZV9DRkxBR1MiCi0rCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSsjbGluZSAxMTAzICJjb25maWd1cmUiCi0rI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rI2luY2x1ZGUgPGFpZi5oPgotK2ludCBtYWluKCkgewotKwotKzsgcmV0dXJuIDA7IH0KLStFT0YKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSsgIHJtIC1yZiBjb25mdGVzdCoKLSsgIGlyZXM9JGk7YnJlYWsKLStlbHNlCi0rICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rZmkKLStybSAtZiBjb25mdGVzdCoKLStkb25lCi0rZm9yIGkgaW4gJGxpYl9kaXJzOyBkbwotKwlMSUJTPSItTCRpIC1sYWlmICRzYXZlX0xJQlMiCi0rCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSsjbGluZSAxMTIyICJjb25maWd1cmUiCi0rI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rI2luY2x1ZGUgPGFpZi5oPgotK2ludCBtYWluKCkgewotKwotKzsgcmV0dXJuIDA7IH0KLStFT0YKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotKyAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgbHJlcz0kaTticmVhawotK2Vsc2UKLSsgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLStmaQotK3JtIC1mIGNvbmZ0ZXN0KgotK2RvbmUKLStDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLStMSUJTPSIkc2F2ZV9MSUJTIgotKwotK2lmIHRlc3QgIiRpcmVzIiAtYSAiJGxyZXMiIC1hICIkd2l0aF9haWYiICE9ICJubyI7IHRoZW4KLSsJYWlmX2luY2x1ZGVkaXI9IiRpcmVzIgotKwlhaWZfbGliZGlyPSIkbHJlcyIKLSsJRElSX2FpZj0KLSsJSU5DTFVERV9haWY9Ii1JJGFpZl9pbmNsdWRlZGlyIgotKwlMSUJfYWlmPSItTCRhaWZfbGliZGlyIC1sYWlmIgotKwljYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKyNkZWZpbmUgSEFWRV9BSUYgMQotK0VPRgotKwotKwl3aXRoX2FpZj15ZXMKLSsJZWNobyAiJGFjX3QiImhlYWRlcnMgJGlyZXMsIGxpYnJhcmllcyAkbHJlcyIgMT4mNgotK2Vsc2UKLSsJRElSX2FpZj0iYWlmIgotKwlJTkNMVURFX2FpZj0KLSsJTElCX2FpZj0KLSsJd2l0aF9haWY9bm8KLSsJZWNobyAiJGFjX3QiIiR3aXRoX2FpZiIgMT4mNgotK2ZpCi0rCi0rCi0rCi0rCi0raWYgdGVzdCAiJHdpdGhfYWlmIiA9ICJubyI7IHRoZW4KLSsgICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogWW91IG11c3QgaGF2ZSBsaWJhaWYgdG8gY29tcGlsZSB0aGlzIHZlcnNpb24gb2YgR0RCLiIgMT4mMjsgZXhpdCAxOyB9Ci0rZmkKLStjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSsjZGVmaW5lIEhBVkVfQUlGIDEKLStFT0YKLSsKLSBhY19hdXhfZGlyPQotIGZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi47IGRvCi0gICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotQEAgLTEwODQsNyArMTIxNCw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTA4ODogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEyMTg6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotIAotIGhvc3RfYWxpYXM9JGhvc3QKLSBjYXNlICIkaG9zdF9hbGlhcyIgaW4KLUBAIC0xMTA1LDcgKzEyMzUsNyBAQAotIGVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjExMDk6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEyMzk6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0gCi0gdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLSBjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotQEAgLTExMjMsNyArMTI1Myw3IEBACi0gZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjExMjc6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTI1NzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotIAotIGJ1aWxkX2FsaWFzPSRidWlsZAotIGNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLUBAIC0xMTQ4LDcgKzEyNzgsNyBAQAotIAotIEFMTF9MSU5HVUFTPQotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMTUyOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLStlY2hvICJjb25maWd1cmU6MTI4MjogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci0gc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC0xMTc3LDcgKzEzMDcsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTE4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTMxMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMTIwNSwxMiArMTMzNSwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMjA5OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjEzMzk6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTIxNCAiY29uZmlndXJlIgotKyNsaW5lIDEzNDQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gI2luY2x1ZGUgPHN0ZGFyZy5oPgotQEAgLTEyMTgsNyArMTM0OCw3IEBACi0gI2luY2x1ZGUgPGZsb2F0Lmg+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzUyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTEyMzUsNyArMTM2NSw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTIzOSAiY29uZmlndXJlIgotKyNsaW5lIDEzNjkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0gRU9GCi1AQCAtMTI1Myw3ICsxMzgzLDcgQEAKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMjU3ICJjb25maWd1cmUiCi0rI2xpbmUgMTM4NyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzdGRsaWIuaD4KLSBFT0YKLUBAIC0xMjc0LDcgKzE0MDQsNyBAQAotICAgOgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMjc4ICJjb25maWd1cmUiCi0rI2xpbmUgMTQwOCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxjdHlwZS5oPgotICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotQEAgLTEyODUsNyArMTQxNSw3IEBACi0gZXhpdCAoMCk7IH0KLSAKLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICA6Ci0gZWxzZQotQEAgLTEzMDksMTIgKzE0MzksMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTMxMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxNDQzOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTMxOCAiY29uZmlndXJlIgotKyNsaW5lIDE0NDggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLUBAIC0xMzYzLDcgKzE0OTMsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNjc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0OTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2NfY29uc3Q9eWVzCi0gZWxzZQotQEAgLTEzODQsMjEgKzE1MTQsMjEgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMzg4OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTUxODogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgYWNfY3ZfY19pbmxpbmU9bm8KLSBmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTM5NSAiY29uZmlndXJlIgotKyNsaW5lIDE1MjUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSB9ICRhY19rdyBmb28oKSB7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUzMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotIGVsc2UKLUBAIC0xNDI0LDEyICsxNTU0LDEyIEBACi0gZXNhYwotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE0Mjg6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE1NTg6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTQzMyAiY29uZmlndXJlIgotKyNsaW5lIDE1NjMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2lmIFNURENfSEVBREVSUwotQEAgLTE0NTcsMTIgKzE1ODcsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNDYxOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLStlY2hvICJjb25maWd1cmU6MTU5MTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE0NjYgImNvbmZpZ3VyZSIKLSsjbGluZSAxNTk2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpZiBTVERDX0hFQURFUlMKLUBAIC0xNDkyLDE5ICsxNjIyLDE5IEBACi0gIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSAjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTQ5NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxNjI2OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNTAxICJjb25maWd1cmUiCi0rI2xpbmUgMTYzMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxhbGxvY2EuaD4KLSBpbnQgbWFpbigpIHsKLSBjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLSBlbHNlCi1AQCAtMTUyNSwxMiArMTY1NSwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE1Mjk6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxNjU5OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTUzNCAiY29uZmlndXJlIgotKyNsaW5lIDE2NjQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaWZkZWYgX19HTlVDX18KLUBAIC0xNTU4LDcgKzE2ODgsNyBAQAotIGNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotIGVsc2UKLUBAIC0xNTkwLDEyICsxNzIwLDEyIEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE1OTQ6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotK2VjaG8gImNvbmZpZ3VyZToxNzI0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNTk5ICJjb25maWd1cmUiCi0rI2xpbmUgMTcyOSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLSB3ZWJlY3JheQotQEAgLTE2MjAsMTIgKzE3NTAsMTIgQEAKLSBpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi0gZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTYyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTc1NDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNjI5ICJjb25maWd1cmUiCi0rI2xpbmUgMTc1OSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMTY0OCw3ICsxNzc4LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3ODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTE2NzUsNyArMTgwNSw3IEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTY3OTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE4MDk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0xNjgzLDcgKzE4MTMsNyBAQAotICAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNjg3ICJjb25maWd1cmUiCi0rI2xpbmUgMTgxNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi0gewotQEAgLTE3MDIsNyArMTgzMiw3IEBACi0gICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci0gfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLSBlbHNlCi1AQCAtMTcyNywxNyArMTg1NywxNyBAQAotIGRvCi0gYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNzMxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjE4NjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE3MzYgImNvbmZpZ3VyZSIKLSsjbGluZSAxODY2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPCRhY19oZHI+Ci0gRU9GCi0gYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjE3NDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0reyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODcxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLSBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotQEAgLTE3NjYsMTIgKzE4OTYsMTIgQEAKLSBmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotIGRvCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTc3MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTkwMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNzc1ICJjb25maWd1cmUiCi0rI2xpbmUgMTkwNSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi1AQCAtMTc5NCw3ICsxOTI0LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5Mjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0gZWxzZQotQEAgLTE4MTksNyArMTk0OSw3IEBACi0gZG9uZQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxODIzOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLStlY2hvICJjb25maWd1cmU6MTk1MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMTgyNyw3ICsxOTU3LDcgQEAKLSAgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTgzMSAiY29uZmlndXJlIgotKyNsaW5lIDE5NjEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLUBAIC0xOTY3LDcgKzIwOTcsNyBAQAotIH0KLSAKLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotIGVsc2UKLUBAIC0xOTk1LDE3ICsyMTI1LDE3IEBACi0gZG8KLSBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE5OTk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjEyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjAwNCAiY29uZmlndXJlIgotKyNsaW5lIDIxMzQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8JGFjX2hkcj4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMjAzNSwxMiArMjE2NSwxMiBAQAotIF9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMDM5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyMTY5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIwNDQgImNvbmZpZ3VyZSIKLSsjbGluZSAyMTc0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0yMDYzLDcgKzIxOTMsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMjA5MiwxMiArMjIyMiwxMiBAQAotICAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMDk2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyMjI2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIxMDEgImNvbmZpZ3VyZSIKLSsjbGluZSAyMjMxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0yMTIwLDcgKzIyNTAsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMjE1NCwxOSArMjI4NCwxOSBAQAotIAotICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMTU4OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyMjg4OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjE2MyAiY29uZmlndXJlIgotKyNsaW5lIDIyOTMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bG9jYWxlLmg+Ci0gaW50IG1haW4oKSB7Ci0gcmV0dXJuIExDX01FU1NBR0VTCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLSBlbHNlCi1AQCAtMjE4Nyw3ICsyMzE3LDcgQEAKLSAgICAgZmkKLSAgIGZpCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjE5MTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjMyMTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotQEAgLTIyMDcsNyArMjMzNyw3IEBACi0gRU9GCi0gCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIyMTE6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyMzQxOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotQEAgLTIyMjYsMTcgKzIzNTYsMTcgQEAKLSAKLSAJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjIzMDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjIzNjA6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjIzNSAiY29uZmlndXJlIgotKyNsaW5lIDIzNjUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bGliaW50bC5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0yMjUzLDE5ICsyMzgzLDE5IEBACi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMjU3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjM4NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIyNjIgImNvbmZpZ3VyZSIKLSsjbGluZSAyMzkyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpYmludGwuaD4KLSBpbnQgbWFpbigpIHsKLSByZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotIGVsc2UKLUBAIC0yMjgxLDcgKzI0MTEsNyBAQAotIAotIAkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0gCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIyODU6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNDE1OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLSBhY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtMjI4OSw3ICsyNDE5LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxpbnRsICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjI5MyAiY29uZmlndXJlIgotKyNsaW5lIDI0MjMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC0yMzAwLDcgKzI0MzAsNyBAQAotIGJpbmR0ZXh0ZG9tYWluKCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtMjMxNiwxOSArMjQ0NiwxOSBAQAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjMyMDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI0NTA6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMzI1ICJjb25maWd1cmUiCi0rI2xpbmUgMjQ1NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIHJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi0gZWxzZQotQEAgLTIzNTYsNyArMjQ4Niw3IEBACi0gCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjM2MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjQ5MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjM5MCwxMiArMjUyMCwxMiBAQAotIAkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMzk0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNTI0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDIzOTkgImNvbmZpZ3VyZSIKLSsjbGluZSAyNTI5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0yNDE4LDcgKzI1NDgsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMjQ0NSw3ICsyNTc1LDcgQEAKLSAJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNDQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNTc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjQ4MSw3ICsyNjExLDcgQEAKLSAJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI0ODU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI2MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjUxMyw3ICsyNjQzLDcgQEAKLSBmaQotIAotIAkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDI1MTcgImNvbmZpZ3VyZSIKLSsjbGluZSAyNjQ3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci1AQCAtMjUyMSw3ICsyNjUxLDcgQEAKLSAJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgQ0FUT0JKRVhUPS5nbW8KLSAJCSAgIERBVEFESVJOQU1FPXNoYXJlCi1AQCAtMjU1Myw3ICsyNjgzLDcgQEAKLSAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjU1NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MjY4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjU4Nyw3ICsyNzE3LDcgQEAKLSAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNTkxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyNzIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjYyMyw3ICsyNzUzLDcgQEAKLSAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI2Mjc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjI3NTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMjcxMyw3ICsyODQzLDcgQEAKLSAgICAgICAgTElOR1VBUz0KLSAgICAgIGVsc2UKLSAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI3MTc6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyODQ3OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLUBAIC0yNzQxLDE3ICsyODcxLDE3IEBACi0gICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLSAJIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI3NDU6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZToyODc1OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDI3NTAgImNvbmZpZ3VyZSIKLSsjbGluZSAyODgwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjI4ODU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMjg2OSwxMiArMjk5OSwxMiBAQAotIAotIGZpCi0gCi0tZm9yIGFjX3Byb2cgaW4gbWF3ayBnYXdrIG5hd2sgYXdrCi0rZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCi0gZG8KLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyODc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMDA4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FXSycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0yOTE1LDcgKzMwNDUsNyBAQAotICMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSAjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjkxOTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMwNDk6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC0yOTc2LDcgKzMxMDYsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyOTgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozMTEwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMwMDgsNyArMzEzOCw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzAxMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzE0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMzA0MCw3ICszMTcwLDcgQEAKLSAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzA0NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzE3NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMzA3NSw3ICszMjA1LDcgQEAKLSAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwNzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMyMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC0zMTA3LDcgKzMyMzcsNyBAQAotICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH13aW5kcmVzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH13aW5kcmVzOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzExMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzI0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19XSU5EUkVTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMxNDEsNyArMzI3MSw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzE0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzI3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTMxNzUsNyArMzMwNSw3IEBACi0gIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW1pZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bWlnOyBhY193b3JkPSQyCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzE3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzMwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19NSUcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMzIyNiwxMiArMzM1NiwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMyMzA6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjMzNjA6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMyMzUgImNvbmZpZ3VyZSIKLSsjbGluZSAzMzY1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxzaWduYWwuaD4KLUBAIC0zMjQ4LDcgKzMzNzgsNyBAQAotIGludCBpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKLSBlbHNlCi1AQCAtMzI2OCwxMiArMzM5OCwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzI3MjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozNDAyOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMyNzcgImNvbmZpZ3VyZSIKLSsjbGluZSAzNDA3ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdGRhcmcuaD4KLUBAIC0zMjgxLDcgKzM0MTEsNyBAQAotICNpbmNsdWRlIDxmbG9hdC5oPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjg1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzQxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC0zMjk4LDcgKzM0MjgsNyBAQAotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMzMDIgImNvbmZpZ3VyZSIKLSsjbGluZSAzNDMyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN0cmluZy5oPgotIEVPRgotQEAgLTMzMTYsNyArMzQ0Niw3IEBACi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzMyMCAiY29uZmlndXJlIgotKyNsaW5lIDM0NTAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gRU9GCi1AQCAtMzMzNyw3ICszNDY3LDcgQEAKLSAgIDoKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzM0MSAiY29uZmlndXJlIgotKyNsaW5lIDM0NzEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8Y3R5cGUuaD4KLSAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLUBAIC0zMzQ4LDcgKzM0NzgsNyBAQAotIGV4aXQgKDApOyB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgOgotIGVsc2UKLUBAIC0zMzkyLDE3ICszNTIyLDE3IEBACi0gZG8KLSBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMzOTY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLStlY2hvICJjb25maWd1cmU6MzUyNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzQwMSAiY29uZmlndXJlIgotKyNsaW5lIDM1MzEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8JGFjX2hkcj4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQwNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMzQyOSwxMiArMzU1OSwxMiBAQAotIGRvbmUKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzQzMzogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM1NjM6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzQzOCAiY29uZmlndXJlIgotKyNsaW5lIDM1NjggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci1AQCAtMzQ4NiwxMiArMzYxNiwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzQ5MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozNjIwOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzQ5NSAiY29uZmlndXJlIgotKyNsaW5lIDM2MjUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLUBAIC0zNTQwLDcgKzM2NzAsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2NfY29uc3Q9eWVzCi0gZWxzZQotQEAgLTM1NjUsMTIgKzM2OTUsMTIgQEAKLSAJcmVhbHBhdGggc2JyayBzZXRwZ2lkIHNldHBncnAgc2lnYWN0aW9uIHNpZ3Byb2NtYXNrIHNpZ3NldG1hc2sgCi0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNTY5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozNjk5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM1NzQgImNvbmZpZ3VyZSIKLSsjbGluZSAzNzA0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC0zNTkzLDcgKzM3MjMsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtMzYyMCwxOSArMzc1MCwxOSBAQAotICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0gIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM2MjQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mzc1NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzYyOSAiY29uZmlndXJlIgotKyNsaW5lIDM3NTkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8YWxsb2NhLmg+Ci0gaW50IG1haW4oKSB7Ci0gY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi0gZWxzZQotQEAgLTM2NTMsMTIgKzM3ODMsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNjU3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mzc4NzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM2NjIgImNvbmZpZ3VyZSIKLSsjbGluZSAzNzkyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2lmZGVmIF9fR05VQ19fCi1AQCAtMzY4Niw3ICszODE2LDcgQEAKLSBjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLSBlbHNlCi1AQCAtMzcxOCwxMiArMzg0OCwxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozNzIyOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLStlY2hvICJjb25maWd1cmU6Mzg1MjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzcyNyAiY29uZmlndXJlIgotKyNsaW5lIDM4NTcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi0gd2ViZWNyYXkKLUBAIC0zNzQ4LDEyICszODc4LDEyIEBACi0gaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM3NTI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM4ODI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzc1NyAiY29uZmlndXJlIgotKyNsaW5lIDM4ODcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTM3NzYsNyArMzkwNiw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC0zODAzLDcgKzM5MzMsNyBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM4MDc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotK2VjaG8gImNvbmZpZ3VyZTozOTM3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtMzgxMSw3ICszOTQxLDcgQEAKLSAgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzgxNSAiY29uZmlndXJlIgotKyNsaW5lIDM5NDUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotIHsKLUBAIC0zODMwLDcgKzM5NjAsNyBAQAotICAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi0gZWxzZQotQEAgLTM4NTIsMTIgKzM5ODIsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwaWRfdCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM4NTY6IGNoZWNraW5nIGZvciBwaWRfdCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjM5ODY6IGNoZWNraW5nIGZvciBwaWRfdCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfcGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzg2MSAiY29uZmlndXJlIgotKyNsaW5lIDM5OTEgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2lmIFNURENfSEVBREVSUwotQEAgLTM4ODYsMTcgKzQwMTYsMTcgQEAKLSAKLSBhY19zYWZlPWBlY2hvICJ2Zm9yay5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjM4OTA6IGNoZWNraW5nIGZvciB2Zm9yay5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDAyMDogY2hlY2tpbmcgZm9yIHZmb3JrLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMzg5NSAiY29uZmlndXJlIgotKyNsaW5lIDQwMjUgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8dmZvcmsuaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjQwMzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtMzkyMSwxOCArNDA1MSwxOCBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozOTI1OiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQwNTU6IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9ya193b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozOTMxOiBjaGVja2luZyBmb3IgdmZvcmsiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0MDYxOiBjaGVja2luZyBmb3IgdmZvcmsiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM5MzYgImNvbmZpZ3VyZSIKLSsjbGluZSA0MDY2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHZmb3JrKCk7IGJlbG93LiAgKi8KLUBAIC0zOTU1LDcgKzQwODUsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPXllcyIKLSBlbHNlCi1AQCAtMzk3Nyw3ICs0MTA3LDcgQEAKLSBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDM5ODEgImNvbmZpZ3VyZSIKLSsjbGluZSA0MTExICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLwotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQwNzIsNyArNDIwMiw3IEBACi0gICB9Ci0gfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9eWVzCi0gZWxzZQotQEAgLTQwOTYsNyArNDIyNiw3IEBACi0gCi0gaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBubzsgdGhlbgotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDEwMDogY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiA+JjUKLStlY2hvICJjb25maWd1cmU6NDIzMDogY2hlY2tpbmcgd2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50IiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNDEwNCw3ICs0MjM0LDcgQEAKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGNoZWNrIHNldHBncnAgaWYgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDEwOCAiY29uZmlndXJlIgotKyNsaW5lIDQyMzggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaWZkZWYgSEFWRV9VTklTVERfSAotQEAgLTQxMjQsNyArNDI1NCw3IEBACi0gfQotIAotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkPW5vCi0gZWxzZQotQEAgLTQxNDksMTIgKzQyNzksMTIgQEAKLSAKLSBlbHNlCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHNldHBncnAgdGFrZXMgbm8gYXJndW1lbnQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0MTUzOiBjaGVja2luZyB3aGV0aGVyIHNldHBncnAgdGFrZXMgbm8gYXJndW1lbnQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0MjgzOiBjaGVja2luZyB3aGV0aGVyIHNldHBncnAgdGFrZXMgbm8gYXJndW1lbnQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NldHBncnBfdm9pZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MTU4ICJjb25maWd1cmUiCi0rI2xpbmUgNDI4OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDx1bmlzdGQuaD4KLUBAIC00MTY4LDcgKzQyOTgsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkPW5vCi0gZWxzZQotQEAgLTQxOTIsMTIgKzQzMjIsMTIgQEAKLSAjIENoZWNrIGlmIHNpZ3NldGptcCBpcyBhdmFpbGFibGUuICBVc2luZyBBQ19DSEVDS19GVU5DUyB3b24ndCBkbwotICMgc2luY2Ugc2lnc2V0am1wIG1pZ2h0IG9ubHkgYmUgZGVmaW5lZCBhcyBhIG1hY3JvLgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaWdzZXRqbXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0MTk2OiBjaGVja2luZyBmb3Igc2lnc2V0am1wIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDMyNjogY2hlY2tpbmcgZm9yIHNpZ3NldGptcCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9mdW5jX3NpZ3NldGptcCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0MjAxICJjb25maWd1cmUiCi0rI2xpbmUgNDMzMSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzZXRqbXAuaD4KLUBAIC00MjA2LDcgKzQzMzYsNyBAQAotIHNpZ2ptcF9idWYgZW52OyB3aGlsZSAoISBzaWdzZXRqbXAgKGVudiwgMSkpIHNpZ2xvbmdqbXAgKGVudiwgMSk7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2Z1bmNfc2lnc2V0am1wPXllcwotIGVsc2UKLUBAIC00MjI5LDE5ICs0MzU5LDE5IEBACi0gIyBTZWUgaWYgPG1hY2hpbmUvcmVnLmg+IHN1cHBvcnRzIHRoZSAlZnMgYW5kICVncyBpMzg2IHNlZ21lbnQgcmVnaXN0ZXJzLgotICMgT2xkZXIgaTM4NiBCU0QncyBkb24ndCBoYXZlIHRoZSByX2ZzIGFuZCByX2dzIG1lbWJlcnMgb2YgYHN0cnVjdCByZWcnLgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByX2ZzIGluIHN0cnVjdCByZWciIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0MjMzOiBjaGVja2luZyBmb3Igcl9mcyBpbiBzdHJ1Y3QgcmVnIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDM2MzogY2hlY2tpbmcgZm9yIHJfZnMgaW4gc3RydWN0IHJlZyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9zdHJ1Y3RfcmVnX3JfZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDIzOCAiY29uZmlndXJlIgotKyNsaW5lIDQzNjggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KLSBpbnQgbWFpbigpIHsKLSBzdHJ1Y3QgcmVnIHI7IHIucl9mczsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mzc1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzPXllcwotIGVsc2UKLUBAIC00MjYxLDE5ICs0MzkxLDE5IEBACi0gCi0gZmkKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igcl9ncyBpbiBzdHJ1Y3QgcmVnIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDI2NTogY2hlY2tpbmcgZm9yIHJfZ3MgaW4gc3RydWN0IHJlZyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQzOTU6IGNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWciID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3Zfc3RydWN0X3JlZ19yX2dzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQyNzAgImNvbmZpZ3VyZSIKLSsjbGluZSA0NDAwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0gaW50IG1haW4oKSB7Ci0gc3RydWN0IHJlZyByOyByLnJfZ3M7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI3NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncz15ZXMKLSBlbHNlCi1AQCAtNDI5NSwxOSArNDQyNSwxOSBAQAotIAotICMgU2VlIGlmIDxzeXMvcHRyYWNlLmg+IHByb3ZpZGVzIHRoZSBQVFJBQ0VfR0VUUkVHUyByZXF1ZXN0LgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQVFJBQ0VfR0VUUkVHUyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQyOTk6IGNoZWNraW5nIGZvciBQVFJBQ0VfR0VUUkVHUyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ0Mjk6IGNoZWNraW5nIGZvciBQVFJBQ0VfR0VUUkVHUyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3B0cmFjZV9nZXRyZWdzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQzMDQgImNvbmZpZ3VyZSIKLSsjbGluZSA0NDM0ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSBpbnQgbWFpbigpIHsKLSBQVFJBQ0VfR0VUUkVHUzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDQxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0cmVncz15ZXMKLSBlbHNlCi1AQCAtNDMyOSwxOSArNDQ1OSwxOSBAQAotIAotICMgU2VlIGlmIDxzeXMvcHRyYWNlLmg+IHByb3ZpZGVzIHRoZSBQVFJBQ0VfR0VURlBYUkVHUyByZXF1ZXN0LgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQVFJBQ0VfR0VURlBYUkVHUyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQzMzM6IGNoZWNraW5nIGZvciBQVFJBQ0VfR0VURlBYUkVHUyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ0NjM6IGNoZWNraW5nIGZvciBQVFJBQ0VfR0VURlBYUkVHUyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3B0cmFjZV9nZXRmcHhyZWdzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQzMzggImNvbmZpZ3VyZSIKLSsjbGluZSA0NDY4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSBpbnQgbWFpbigpIHsKLSBQVFJBQ0VfR0VURlBYUkVHUzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDc1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0ZnB4cmVncz15ZXMKLSBlbHNlCi1AQCAtNDM2MywxMiArNDQ5MywxMiBAQAotIAotICMgU2VlIGlmIDxzeXMvcHRyYWNlLmg+IHByb3ZpZGVzIHRoZSBQVF9HRVREQlJFR1MgcmVxdWVzdC4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgUFRfR0VUREJSRUdTIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDM2NzogY2hlY2tpbmcgZm9yIFBUX0dFVERCUkVHUyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ0OTc6IGNoZWNraW5nIGZvciBQVF9HRVREQlJFR1MiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wdF9nZXRkYnJlZ3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDM3MiAiY29uZmlndXJlIgotKyNsaW5lIDQ1MDIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLUBAIC00Mzc2LDcgKzQ1MDYsNyBAQAotIFBUX0dFVERCUkVHUzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzgwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9wdF9nZXRkYnJlZ3M9eWVzCi0gZWxzZQotQEAgLTQzOTgsMTIgKzQ1MjgsMTIgQEAKLSAKLSAjIFNlZSBpZiA8c3lzL3B0cmFjZS5oPiBwcm92aWRlcyB0aGUgUFRfR0VUWE1NUkVHUyByZXF1ZXN0LgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQVF9HRVRYTU1SRUdTIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDQwMjogY2hlY2tpbmcgZm9yIFBUX0dFVFhNTVJFR1MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NTMyOiBjaGVja2luZyBmb3IgUFRfR0VUWE1NUkVHUyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3B0X2dldHhtbXJlZ3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDQwNyAiY29uZmlndXJlIgotKyNsaW5lIDQ1MzcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLUBAIC00NDExLDcgKzQ1NDEsNyBAQAotIFBUX0dFVFhNTVJFR1M7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQxNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfcHRfZ2V0eG1tcmVncz15ZXMKLSBlbHNlCi1AQCAtNDQzMyw3ICs0NTYzLDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc29ja2V0cGFpciBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ0Mzc6IGNoZWNraW5nIGZvciBzb2NrZXRwYWlyIGluIC1sc29ja2V0IiA+JjUKLStlY2hvICJjb25maWd1cmU6NDU2NzogY2hlY2tpbmcgZm9yIHNvY2tldHBhaXIgaW4gLWxzb2NrZXQiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nc29ja2V0cGFpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNDQ0MSw3ICs0NTcxLDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxzb2NrZXQgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NDQ1ICJjb25maWd1cmUiCi0rI2xpbmUgNDU3NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTQ0NTIsNyArNDU4Miw3IEBACi0gc29ja2V0cGFpcigpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTQ0ODIsMTIgKzQ2MTIsMTIgQEAKLSBmb3IgYWNfZnVuYyBpbiBzb2NrZXRwYWlyCi0gZG8KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NDg2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0NjE2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ0OTEgImNvbmZpZ3VyZSIKLSsjbGluZSA0NjIxICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLUBAIC00NTEwLDcgKzQ2NDAsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLSBlbHNlCi1AQCAtNDUzNywxMiArNDY2NywxMiBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NTQxOiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDY3MTogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDU0NiAiY29uZmlndXJlIgotKyNsaW5lIDQ2NzYgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00NTYzLDcgKzQ2OTMsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIG1hbGxvYwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2OTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLSBlbHNlCi1AQCAtNDU4NCwxMiArNDcxNCwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0NTg4OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ3MTg6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDU5MyAiY29uZmlndXJlIgotKyNsaW5lIDQ3MjMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLUBAIC00NjEwLDcgKzQ3NDAsNyBAQAotIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHJlYWxsb2MKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQ0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotIGVsc2UKLUBAIC00NjMxLDEyICs0NzYxLDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ2MzU6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLStlY2hvICJjb25maWd1cmU6NDc2NTogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NjQwICJjb25maWd1cmUiCi0rI2xpbmUgNDc3MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQ2NTcsNyArNDc4Nyw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZnJlZQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3OTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi0gZWxzZQotQEAgLTQ2NzgsMTIgKzQ4MDgsMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ2ODI6IGNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ4MTI6IGNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0Njg3ICJjb25maWd1cmUiCi0rI2xpbmUgNDgxNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQ3MDQsNyArNDgzNCw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3RyZXJyb3IKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzA4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODM4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZXJyb3I9bm8KLSBlbHNlCi1AQCAtNDcyNSwxMiArNDg1NSwxMiBAQAotIGZpCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ3Mjk6IGNoZWNraW5nIHdoZXRoZXIgc3RyZHVwIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0ODU5OiBjaGVja2luZyB3aGV0aGVyIHN0cmR1cCBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA0NzM0ICJjb25maWd1cmUiCi0rI2xpbmUgNDg2NCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpbmNsdWRlIDxzdGRpby5oPgotQEAgLTQ3NTEsNyArNDg4MSw3IEBACi0gY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3RyZHVwCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc1NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg4NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cD1ubwotIGVsc2UKLUBAIC00NzcyLDEyICs0OTAyLDEyIEBACi0gZmkKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDc3NjogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjQ5MDY6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ3ODEgImNvbmZpZ3VyZSIKLSsjbGluZSA0OTExICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNDc5OCw3ICs0OTI4LDcgQEAKLSBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODAyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi0gZWxzZQotQEAgLTQ4MTksMTIgKzQ5NDksMTIgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NDgyMzogY2hlY2tpbmcgd2hldGhlciBjYW5vbmljYWxpemVfZmlsZV9uYW1lIG11c3QgYmUgZGVjbGFyZWQiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo0OTUzOiBjaGVja2luZyB3aGV0aGVyIGNhbm9uaWNhbGl6ZV9maWxlX25hbWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9jYW5vbmljYWxpemVfZmlsZV9uYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDQ4MjggImNvbmZpZ3VyZSIKLSsjbGluZSA0OTU4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1AQCAtNDg0NSw3ICs0OTc1LDcgQEAKLSBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBjYW5vbmljYWxpemVfZmlsZV9uYW1lCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk3OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2RlY2xfbmVlZGVkX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWU9bm8KLSBlbHNlCi1AQCAtNDg3Miw5ICs1MDAyLDkgQEAKLSAjIGNvdWxkIGJlIGV4cHVuZ2VkLiAtLWpzbSAxOTk5LTAzLTIyCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEhQVVggc2F2ZV9zdGF0ZSBzdHJ1Y3R1cmUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0ODc2OiBjaGVja2luZyBmb3IgSFBVWCBzYXZlX3N0YXRlIHN0cnVjdHVyZSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUwMDY6IGNoZWNraW5nIGZvciBIUFVYIHNhdmVfc3RhdGUgc3RydWN0dXJlIiA+JjUKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDg3OCAiY29uZmlndXJlIgotKyNsaW5lIDUwMDggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bWFjaGluZS9zYXZlX3N0YXRlLmg+Ci0gRU9GCi1AQCAtNDg4OSw3ICs1MDE5LDcgQEAKLSBybSAtZiBjb25mdGVzdCoKLSAKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDg5MyAiY29uZmlndXJlIgotKyNsaW5lIDUwMjMgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8bWFjaGluZS9zYXZlX3N0YXRlLmg+Ci0gRU9GCi1AQCAtNDk1OSwxMiArNTA4OSwxMiBAQAotIAotIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo0OTYzOiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUwOTM6IGNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNDk2OCAiY29uZmlndXJlIgotKyNsaW5lIDUwOTggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC00OTczLDcgKzUxMDMsNyBAQAotIHBzdGF0dXNfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk3NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTEwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdD15ZXMKLSBlbHNlCi1AQCAtNDk5NSwxMiArNTEyNSwxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcnJ1bl90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjQ5OTk6IGNoZWNraW5nIGZvciBwcnJ1bl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUxMjk6IGNoZWNraW5nIGZvciBwcnJ1bl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJydW5fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MDA0ICJjb25maWd1cmUiCi0rI2xpbmUgNTEzNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUwMDksNyArNTEzOSw3IEBACi0gcHJydW5fdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE0MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3Q9eWVzCi0gZWxzZQotQEAgLTUwMzEsMTIgKzUxNjEsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJydW5fdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MDM1OiBjaGVja2luZyBmb3IgZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUxNjU6IGNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTA0MCAiY29uZmlndXJlIgotKyNsaW5lIDUxNzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MDQ1LDcgKzUxNzUsNyBAQAotIGdyZWdzZXRfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE3OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdD15ZXMKLSBlbHNlCi1AQCAtNTA2NywxMiArNTE5NywxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUwNzE6IGNoZWNraW5nIGZvciBmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUyMDE6IGNoZWNraW5nIGZvciBmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZnByZWdzZXRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MDc2ICJjb25maWd1cmUiCi0rI2xpbmUgNTIwNiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUwODEsNyArNTIxMSw3IEBACi0gZnByZWdzZXRfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA4NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTIxNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTUxMDMsMTIgKzUyMzMsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZnByZWdzZXRfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUxMDc6IGNoZWNraW5nIGZvciBwcmdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MjM3OiBjaGVja2luZyBmb3IgcHJncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MTEyICJjb25maWd1cmUiCi0rI2xpbmUgNTI0MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUxMTcsNyArNTI0Nyw3IEBACi0gcHJncmVnc2V0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXRfdD15ZXMKLSBlbHNlCi1AQCAtNTEzOSwxMiArNTI2OSwxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmdyZWdzZXRfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MTQzOiBjaGVja2luZyBmb3IgcHJmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUyNzM6IGNoZWNraW5nIGZvciBwcmZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTE0OCAiY29uZmlndXJlIgotKyNsaW5lIDUyNzggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MTUzLDcgKzUyODMsNyBAQAotIHByZnByZWdzZXRfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE1NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTI4NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXRfdD15ZXMKLSBlbHNlCi1AQCAtNTE3NSwxMiArNTMwNSwxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmdyZWdzZXQzMl90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUxNzk6IGNoZWNraW5nIGZvciBwcmdyZWdzZXQzMl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjUzMDk6IGNoZWNraW5nIGZvciBwcmdyZWdzZXQzMl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0MzJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MTg0ICJjb25maWd1cmUiCi0rI2xpbmUgNTMxNCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUxODksNyArNTMxOSw3IEBACi0gcHJncmVnc2V0MzJfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE5MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTMyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldDMyX3Q9eWVzCi0gZWxzZQotQEAgLTUyMTEsMTIgKzUzNDEsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJncmVnc2V0MzJfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByZnByZWdzZXQzMl90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUyMTU6IGNoZWNraW5nIGZvciBwcmZwcmVnc2V0MzJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1MzQ1OiBjaGVja2luZyBmb3IgcHJmcHJlZ3NldDMyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0MzJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1MjIwICJjb25maWd1cmUiCi0rI2xpbmUgNTM1MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTUyMjUsNyArNTM1NSw3IEBACi0gcHJmcHJlZ3NldDMyX3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzNTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0MzJfdD15ZXMKLSBlbHNlCi1AQCAtNTI0NywxMiArNTM3NywxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0MzJfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cGlkX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTI1MTogY2hlY2tpbmcgZm9yIGx3cGlkX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTM4MTogY2hlY2tpbmcgZm9yIGx3cGlkX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUyNTYgImNvbmZpZ3VyZSIKLSsjbGluZSA1Mzg2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNTI2MSw3ICs1MzkxLDcgQEAKLSBsd3BpZF90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1Mzk1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwaWRfdD15ZXMKLSBlbHNlCi1AQCAtNTI4MywxMiArNTQxMywxMiBAQAotICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHNhZGRyX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTI4NzogY2hlY2tpbmcgZm9yIHBzYWRkcl90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU0MTc6IGNoZWNraW5nIGZvciBwc2FkZHJfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDUyOTIgImNvbmZpZ3VyZSIKLSsjbGluZSA1NDIyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gI2RlZmluZSBfU1lTQ0FMTDMyCi1AQCAtNTI5Nyw3ICs1NDI3LDcgQEAKLSBwc2FkZHJfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTMwMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQzMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90PXllcwotIGVsc2UKLUBAIC01MzE5LDEyICs1NDQ5LDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90IiAxPiY2Ci0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzeXNlbnRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MzIzOiBjaGVja2luZyBmb3IgcHJzeXNlbnRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NDUzOiBjaGVja2luZyBmb3IgcHJzeXNlbnRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3lzZW50X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTMyOCAiY29uZmlndXJlIgotKyNsaW5lIDU0NTggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MzMzLDcgKzU0NjMsNyBAQAotIHByc3lzZW50X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN5c2VudF90PXllcwotIGVsc2UKLUBAIC01MzU1LDEyICs1NDg1LDEyIEBACi0gIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3lzZW50X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcl9zaWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1MzU5OiBjaGVja2luZyBmb3IgcHJfc2lnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTQ4OTogY2hlY2tpbmcgZm9yIHByX3NpZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTM2NCAiY29uZmlndXJlIgotKyNsaW5lIDU0OTQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSAjZGVmaW5lIF9TWVNDQUxMMzIKLUBAIC01MzY5LDcgKzU0OTksNyBAQAotIHByX3NpZ3NldF90IGF2YXIKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzczOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnc2V0X3Q9eWVzCi0gZWxzZQotQEAgLTUzOTEsMTIgKzU1MjEsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnc2V0X3QiIDE+JjYKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcl9zaWdhY3Rpb242NF90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjUzOTU6IGNoZWNraW5nIGZvciBwcl9zaWdhY3Rpb242NF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU1MjU6IGNoZWNraW5nIGZvciBwcl9zaWdhY3Rpb242NF90IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnYWN0aW9uNjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NDAwICJjb25maWd1cmUiCi0rI2xpbmUgNTUzMCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTU0MDUsNyArNTUzNSw3IEBACi0gcHJfc2lnYWN0aW9uNjRfdCBhdmFyCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQwOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTUzOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByX3NpZ2FjdGlvbjY0X3Q9eWVzCi0gZWxzZQotQEAgLTU0MjcsMTIgKzU1NTcsMTIgQEAKLSAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJfc2lnYWN0aW9uNjRfdCIgMT4mNgotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByX3NpZ2luZm82NF90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU0MzE6IGNoZWNraW5nIGZvciBwcl9zaWdpbmZvNjRfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NTYxOiBjaGVja2luZyBmb3IgcHJfc2lnaW5mbzY0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdpbmZvNjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NDM2ICJjb25maWd1cmUiCi0rI2xpbmUgNTU2NiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNkZWZpbmUgX1NZU0NBTEwzMgotQEAgLTU0NDEsNyArNTU3MSw3IEBACi0gcHJfc2lnaW5mbzY0X3QgYXZhcgotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0NDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1NzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcl9zaWdpbmZvNjRfdD15ZXMKLSBlbHNlCi1AQCAtNTQ2OCw3ICs1NTk4LDcgQEAKLSAgICAgICAgIAotICAgaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXRfdCA9IHllczsgdGhlbgotICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU0NzI6IGNoZWNraW5nIHdoZXRoZXIgcHJmcHJlZ3NldF90IHR5cGUgaXMgYnJva2VuIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTYwMjogY2hlY2tpbmcgd2hldGhlciBwcmZwcmVnc2V0X3QgdHlwZSBpcyBicm9rZW4iID4mNQotICAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNTQ3Niw3ICs1NjA2LDcgQEAKLSAgIGdkYl9jdl9wcmZwcmVnc2V0X3RfYnJva2VuPXllcwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NDgwICJjb25maWd1cmUiCi0rI2xpbmUgNTYxMCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0gICAgICAgIGludCBtYWluICgpCi1AQCAtNTQ4Niw3ICs1NjE2LDcgQEAKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQ5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTYyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGdkYl9jdl9wcmZwcmVnc2V0X3RfYnJva2VuPW5vCi0gZWxzZQotQEAgLTU1MTEsMTIgKzU2NDEsMTIgQEAKLSAKLSAgIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBJT0NTRVQgaW9jdGwgZW50cnkgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTUxNTogY2hlY2tpbmcgZm9yIFBJT0NTRVQgaW9jdGwgZW50cnkgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6NTY0NTogY2hlY2tpbmcgZm9yIFBJT0NTRVQgaW9jdGwgZW50cnkgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NTIwICJjb25maWd1cmUiCi0rI2xpbmUgNTY1MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDx1bmlzdGQuaD4KLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1AQCAtNTUyOSw3ICs1NjU5LDcgQEAKLSAgIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1MzM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2NjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0PXllcwotIGVsc2UKLUBAIC01NTUzLDE5ICs1NjgzLDE5IEBACi0gaWYgdGVzdCAke2hvc3R9ID0gJHt0YXJnZXR9IDsgdGhlbgotICAgICAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtZW1iZXIgbF9hZGRyIGluIHN0cnVjdCBsaW5rX21hcCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU1NTc6IGNoZWNraW5nIGZvciBtZW1iZXIgbF9hZGRyIGluIHN0cnVjdCBsaW5rX21hcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU2ODc6IGNoZWNraW5nIGZvciBtZW1iZXIgbF9hZGRyIGluIHN0cnVjdCBsaW5rX21hcCIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbF9tZW1iZXJzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDU1NjIgImNvbmZpZ3VyZSIKLSsjbGluZSA1NjkyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGxpbmsuaD4KLSBpbnQgbWFpbigpIHsKLSBzdHJ1Y3QgbGlua19tYXAgbG07ICh2b2lkKSBsbS5sX2FkZHI7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTU2OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfc3RydWN0X2xpbmtfbWFwX3dpdGhfbF9tZW1iZXJzPXllcwotIGVsc2UKLUBAIC01NTg3LDEyICs1NzE3LDEyIEBACi0gCi0gICAgIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1lbWJlciBsbV9hZGRyIGluIHN0cnVjdCBsaW5rX21hcCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU1OTE6IGNoZWNraW5nIGZvciBtZW1iZXIgbG1fYWRkciBpbiBzdHJ1Y3QgbGlua19tYXAiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NzIxOiBjaGVja2luZyBmb3IgbWVtYmVyIGxtX2FkZHIgaW4gc3RydWN0IGxpbmtfbWFwIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXBfd2l0aF9sbV9tZW1iZXJzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDU1OTYgImNvbmZpZ3VyZSIKLSsjbGluZSA1NzI2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICNpbmNsdWRlIDxsaW5rLmg+Ci1AQCAtNTYwMCw3ICs1NzMwLDcgQEAKLSBzdHJ1Y3QgbGlua19tYXAgbG07ICh2b2lkKSBsbS5sbV9hZGRyOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2MDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3MzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX3N0cnVjdF9saW5rX21hcF93aXRoX2xtX21lbWJlcnM9eWVzCi0gZWxzZQotQEAgLTU2MjIsMTIgKzU3NTIsMTIgQEAKLSAKLSAgICAgCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbWVtYmVyIHNvbV9hZGRyIGluIHN0cnVjdCBzb19tYXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NjI2OiBjaGVja2luZyBmb3IgbWVtYmVyIHNvbV9hZGRyIGluIHN0cnVjdCBzb19tYXAiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1NzU2OiBjaGVja2luZyBmb3IgbWVtYmVyIHNvbV9hZGRyIGluIHN0cnVjdCBzb19tYXAiID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3N0cnVjdF9zb19tYXBfd2l0aF9zb21fbWVtYmVycycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NjMxICJjb25maWd1cmUiCi0rI2xpbmUgNTc2MSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAjaWZkZWYgSEFWRV9OTElTVF9ICi1AQCAtNTYzOCw3ICs1NzY4LDcgQEAKLSBzdHJ1Y3Qgc29fbWFwIGxtOyAodm9pZCkgbG0uc29tX2FkZHI7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY0MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTc3MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZ2RiX2N2X2hhdmVfc3RydWN0X3NvX21hcF93aXRoX3NvbV9tZW1iZXJzPXllcwotIGVsc2UKLUBAIC01NjYwLDEyICs1NzkwLDEyIEBACi0gCi0gICAgIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBsaW5rX21hcDMyIGluIHN5cy9saW5rLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1NjY0OiBjaGVja2luZyBmb3Igc3RydWN0IGxpbmtfbWFwMzIgaW4gc3lzL2xpbmsuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU3OTQ6IGNoZWNraW5nIGZvciBzdHJ1Y3QgbGlua19tYXAzMiBpbiBzeXMvbGluay5oIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXAzMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NjY5ICJjb25maWd1cmUiCi0rI2xpbmUgNTc5OSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNkZWZpbmUgX1NZU0NBTEwzMgotICNpbmNsdWRlIDxzeXMvbGluay5oPgotQEAgLTU2NzMsNyArNTgwMyw3IEBACi0gc3RydWN0IGxpbmtfbWFwMzIgbDsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1Njc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODA3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfaGF2ZV9zdHJ1Y3RfbGlua19tYXAzMj15ZXMKLSBlbHNlCi1AQCAtNTY5NSw3ICs1ODI1LDcgQEAKLSBmaQotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtYWluIGluIC1sbSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU2OTk6IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU4Mjk6IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBtJ18nbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNTcwMywxNCArNTgzMywxNCBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbG0gICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NzA3ICJjb25maWd1cmUiCi0rI2xpbmUgNTgzNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIG1haW4oKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3MTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC01NzM5LDcgKzU4NjksNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWxjIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTc0MzogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1ODczOiBjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sYyIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBjJ18nd2N0eXBlIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC01NzQ3LDcgKzU4NzcsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbGMgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1NzUxICJjb25maWd1cmUiCi0rI2xpbmUgNTg4MSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTU3NTgsNyArNTg4OCw3IEBACi0gd2N0eXBlKCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NzYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNTc3Nyw3ICs1OTA3LDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sdyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU3ODE6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWx3IiA+JjUKLStlY2hvICJjb25maWd1cmU6NTkxMTogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHciID4mNQotIGFjX2xpYl92YXI9YGVjaG8gdydfJ3djdHlwZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNTc4NSw3ICs1OTE1LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWx3ICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTc4OSAiY29uZmlndXJlIgotKyNsaW5lIDU5MTkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC01Nzk2LDcgKzU5MjYsNyBAQAotIHdjdHlwZSgpCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTgwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTMwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi0gZWxzZQotQEAgLTU4MjgsMTIgKzU5NTgsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1ODMyOiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo1OTYyOiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfY19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNTgzNyAiY29uZmlndXJlIgotKyNsaW5lIDU5NjcgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLUBAIC01ODQzLDcgKzU5NzMsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4NDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU5Nzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9jX2xvbmdfbG9uZz15ZXMKLSBlbHNlCi1AQCAtNTg2NSw3ICs1OTk1LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NTg2OTogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjU5OTk6IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBwcmludGYiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNTg3Myw3ICs2MDAzLDcgQEAKLSAgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz1ubwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1ODc3ICJjb25maWd1cmUiCi0rI2xpbmUgNjAwNyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluICgpIHsKLUBAIC01ODg3LDcgKzYwMTcsNyBAQAotICAgcmV0dXJuIChzdHJjbXAgKCIweDAxMjM0NTY3ODlhYmNkZWYiLCBidWYpKTsKLSB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MDIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nPXllcwotIGVsc2UKLUBAIC01OTExLDE5ICs2MDQxLDE5IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1OTE1OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBjb21waWxlciIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYwNDU6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1OTIwICJjb25maWd1cmUiCi0rI2xpbmUgNjA1MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIGxvbmcgZG91YmxlIGZvbzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTI3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MDU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9jX2xvbmdfZG91YmxlPXllcwotIGVsc2UKLUBAIC01OTQ1LDcgKzYwNzUsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU5NDk6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYwNzk6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTU5NTMsNyArNjA4Myw3IEBACi0gICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT1ubwotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA1OTU3ICJjb25maWd1cmUiCi0rI2xpbmUgNjA4NyAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluICgpIHsKLUBAIC01OTYzLDcgKzYwOTMsNyBAQAotICAgcmV0dXJuIChzdHJuY21wICgiMy4xNDE1OSIsIGJ1ZiwgNykpOwotIH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU5Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYwOTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLSB0aGVuCi0gICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT15ZXMKLSBlbHNlCi1AQCAtNTk4Nyw3ICs2MTE3LDcgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBzY2FuZiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjU5OTE6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHNjYW5mIiA+JjUKLStlY2hvICJjb25maWd1cmU6NjEyMTogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTU5OTUsNyArNjEyNSw3IEBACi0gICBnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPW5vCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDU5OTkgImNvbmZpZ3VyZSIKLSsjbGluZSA2MTI5ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4gKCkgewotQEAgLTYwMDUsNyArNjEzNSw3IEBACi0gICByZXR1cm4gIShmID4gMy4xNDE1OSAmJiBmIDwgMy4xNDE2MCk7Ci0gfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjAwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjEzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotIHRoZW4KLSAgIGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGU9eWVzCi0gZWxzZQotQEAgLTYwMzEsMTcgKzYxNjEsMTcgQEAKLSBkbwotIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjAzNTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2MTY1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2MDQwICJjb25maWd1cmUiCi0rI2xpbmUgNjE3MCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDwkYWNfaGRyPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MDQ1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjE3NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC02MDcwLDEyICs2MjAwLDEyIEBACi0gZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLSBkbwotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYwNzQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYyMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjA3OSAiY29uZmlndXJlIgotKyNsaW5lIDYyMDkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotQEAgLTYwOTgsNyArNjIyOCw3IEBACi0gCi0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjEwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MjMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotIGVsc2UKLUBAIC02MTIzLDcgKzYyNTMsNyBAQAotIGRvbmUKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjEyNzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjYyNTc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTYxMzEsNyArNjI2MSw3IEBACi0gICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDYxMzUgImNvbmZpZ3VyZSIKLSsjbGluZSA2MjY1ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi1AQCAtNjI3MSw3ICs2NDAxLDcgQEAKLSB9Ci0gCi0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Mjc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0gdGhlbgotICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLSBlbHNlCi1AQCAtNjI5Nyw3ICs2NDI3LDcgQEAKLSBjYXNlICR7aG9zdF9vc30gaW4KLSBhaXgqKQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1iYmlndG9jIG9wdGlvbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYzMDE6IGNoZWNraW5nIGZvciAtYmJpZ3RvYyBvcHRpb24iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NDMxOiBjaGVja2luZyBmb3IgLWJiaWd0b2Mgb3B0aW9uIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2JpZ3RvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC02MzExLDE0ICs2NDQxLDE0IEBACi0gCi0gICAgIExERkxBR1M9JExERkxBR1NcICRnZGJfY3ZfYmlndG9jCi0gICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2MzE1ICJjb25maWd1cmUiCi0rI2xpbmUgNjQ0NSAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIGludCBpOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYzMjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQ1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICA6Ci0gZWxzZQotICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLUBAIC02MzQxLDcgKzY0NzEsNyBAQAotICAgIGNhc2UgJHtob3N0X29zfSBpbgotICAgIGhwdXgqKQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjYzNDU6IGNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY0NzU6IGNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIgPiY1Ci0gICAgICAgaWYgdGVzdCAtZiAvdXNyL2luY2x1ZGUvZGNlL2NtYV9jb25maWcuaCA7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiIDsgdGhlbgotICAgICAgICAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLUBAIC02MzYwLDcgKzY0OTAsNyBAQAotICAgICAgIDs7Ci0gICAgc29sYXJpcyopCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFNvbGFyaXMgdGhyZWFkIGRlYnVnZ2luZyBsaWJyYXJ5IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjM2NDogY2hlY2tpbmcgZm9yIFNvbGFyaXMgdGhyZWFkIGRlYnVnZ2luZyBsaWJyYXJ5IiA+JjUKLStlY2hvICJjb25maWd1cmU6NjQ5NDogY2hlY2tpbmcgZm9yIFNvbGFyaXMgdGhyZWFkIGRlYnVnZ2luZyBsaWJyYXJ5IiA+JjUKLSAgICAgICBpZiB0ZXN0IC1mIC91c3IvbGliL2xpYnRocmVhZF9kYi5zby4xIDsgdGhlbgotICAgICAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICAgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLUBAIC02MzcwLDcgKzY1MDAsNyBAQAotICAgICAgICAgIENPTkZJR19MSUJfT0JTPSIke0NPTkZJR19MSUJfT0JTfSBzb2wtdGhyZWFkLm8iCi0gICAgICAgICAgQ09ORklHX1NSQ1M9IiR7Q09ORklHX1NSQ1N9IHNvbC10aHJlYWQuYyIKLSAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2Mzc0OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NTA0OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotIGFjX2xpYl92YXI9YGVjaG8gZGwnXydkbG9wZW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotQEAgLTYzNzgsNyArNjUwOCw3IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotIExJQlM9Ii1sZGwgICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2MzgyICJjb25maWd1cmUiCi0rI2xpbmUgNjUxMiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0gLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotQEAgLTYzODksNyArNjUxOSw3IEBACi0gZGxvcGVuKCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MzkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY1MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNjQyMSwxNyArNjU1MSwxNyBAQAotICAgICAgICAgICAgICMgYWxsIHN5bWJvbHMgdmlzaWJsZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0gICAgICAgICAgICAgaG9sZF9sZGZsYWdzPSRMREZMQUdTCi0gICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY0MjU6IGNoZWNraW5nIGZvciB0aGUgbGQgLWV4cG9ydC1keW5hbWljIGZsYWciID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2NTU1OiBjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnIiA+JjUKLSAgICAgICAgICAgICBMREZMQUdTPSIke0xERkxBR1N9IC1XbCwtZXhwb3J0LWR5bmFtaWMiCi0gICAgICAgICAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY0MjggImNvbmZpZ3VyZSIKLSsjbGluZSA2NTU4ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gaW50IG1haW4oKSB7Ci0gaW50IGk7Ci0gOyByZXR1cm4gMDsgfQotIEVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGZvdW5kPXllcwotIGVsc2UKLUBAIC02NDUwLDEzICs2NTgwLDEzIEBACi0gCSAjIFN1biByYW5kb21seSB0d2Vha2VkIHRoZSBwcm90b3R5cGVzIGluIDxwcm9jX3NlcnZpY2UuaD4KLSAJICMgYXQgb25lIHBvaW50LgotIAkgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgPHByb2Nfc2VydmljZS5oPiBpcyBvbGQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2NDU0OiBjaGVja2luZyBpZiA8cHJvY19zZXJ2aWNlLmg+IGlzIG9sZCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY1ODQ6IGNoZWNraW5nIGlmIDxwcm9jX3NlcnZpY2UuaD4gaXMgb2xkIiA+JjUKLSAJIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIAotIAkgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY0NjAgImNvbmZpZ3VyZSIKLSsjbGluZSA2NTkwICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0gCQkjaW5jbHVkZSA8cHJvY19zZXJ2aWNlLmg+Ci1AQCAtNjQ2Nyw3ICs2NTk3LDcgQEAKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDcxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NjAxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZD1ubwotIGVsc2UKLUBAIC02Njg2LDcgKzY4MTYsNyBAQAotIGlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcwotIHRoZW4KLSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tcGlsZXIgd2FybmluZyBmbGFncyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY2OTA6IGNoZWNraW5nIGNvbXBpbGVyIHdhcm5pbmcgZmxhZ3MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2ODIwOiBjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzIiA+JjUKLSAgICAgIyBTZXBhcmF0ZSBvdXQgdGhlIC1XZXJyb3IgZmxhZyBhcyBzb21lIGZpbGVzIGp1c3QgY2Fubm90IGJlCi0gICAgICMgY29tcGlsZWQgd2l0aCBpdCBlbmFibGVkLgotICAgICBmb3IgdyBpbiAke2J1aWxkX3dhcm5pbmdzfTsgZG8KLUBAIC02Njk2LDE0ICs2ODI2LDE0IEBACi0gCSAgICBzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0gCSAgICBDRkxBR1M9IiRDRkxBR1MgJHciCi0gCSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjcwMCAiY29uZmlndXJlIgotKyNsaW5lIDY4MzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLSAKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NzA3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2ODM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBXQVJOX0NGTEFHUz0iJHtXQVJOX0NGTEFHU30gJHciCi0gZWxzZQotQEAgLTY3NjMsMTIgKzY4OTMsMTIgQEAKLSAKLSBpZiB0ZXN0ICR3YW50X2luY2x1ZGVkX3JlZ2V4ID0gZmFsc2U7IHRoZW4KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgcmVnZXgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo2NzY3OiBjaGVja2luZyBmb3IgR05VIHJlZ2V4IiA+JjUKLStlY2hvICJjb25maWd1cmU6Njg5NzogY2hlY2tpbmcgZm9yIEdOVSByZWdleCIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfZ251X3JlZ2V4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDY3NzIgImNvbmZpZ3VyZSIKLSsjbGluZSA2OTAyICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLUBAIC02NzgwLDcgKzY5MTAsNyBAQAotIAotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY3ODQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY5MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGdkYl9jdl9oYXZlX2dudV9yZWdleD15ZXMKLSBlbHNlCi1AQCAtNjgwOSwxMiArNjkzOSwxMiBAQAotIAotICMgSW4gdGhlIEN5Z3dpbiBlbnZpcm9ubWVudCwgd2UgbmVlZCBzb21lIGFkZGl0aW9uYWwgZmxhZ3MuCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGN5Z3dpbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY4MTM6IGNoZWNraW5nIGZvciBjeWd3aW4iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo2OTQzOiBjaGVja2luZyBmb3IgY3lnd2luIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X29zX2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA2ODE4ICJjb25maWd1cmUiCi0rI2xpbmUgNjk0OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotICNpZiBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi1AQCAtNjg1Miw3ICs2OTgyLDcgQEAKLSBlbHNlCi0gICBURVJNX0xJQj0KLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sbmN1cnNlcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY4NTY6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sbmN1cnNlcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjY5ODY6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sbmN1cnNlcyIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBuY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNjg2MCw3ICs2OTkwLDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjg2NCAiY29uZmlndXJlIgotKyNsaW5lIDY5OTQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC02ODcxLDcgKzcwMDEsNyBAQAotIHRnZXRlbnQoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY4NzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC02ODkwLDcgKzcwMjAsNyBAQAotIGVsc2UKLSAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sSGN1cnNlcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY4OTQ6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sSGN1cnNlcyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjcwMjQ6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sSGN1cnNlcyIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBIY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNjg5OCw3ICs3MDI4LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWxIY3Vyc2VzICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjkwMiAiY29uZmlndXJlIgotKyNsaW5lIDcwMzIgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC02OTA5LDcgKzcwMzksNyBAQAotIHRnZXRlbnQoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY5MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC02OTI4LDcgKzcwNTgsNyBAQAotIGVsc2UKLSAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWxpYiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY5MzI6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWxpYiIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjcwNjI6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWxpYiIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyB0ZXJtbGliJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNjkzNiw3ICs3MDY2LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWx0ZXJtbGliICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjk0MCAiY29uZmlndXJlIgotKyNsaW5lIDcwNzAgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC02OTQ3LDcgKzcwNzcsNyBAQAotIHRnZXRlbnQoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY5NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC02OTY2LDcgKzcwOTYsNyBAQAotIGVsc2UKLSAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWNhcCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY5NzA6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWNhcCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjcxMDA6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWNhcCIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyB0ZXJtY2FwJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1AQCAtNjk3NCw3ICs3MTA0LDcgQEAKLSAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gTElCUz0iLWx0ZXJtY2FwICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNjk3OCAiY29uZmlndXJlIgotKyNsaW5lIDcxMDggImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC02OTg1LDcgKzcxMTUsNyBAQAotIHRnZXRlbnQoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY5ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzExOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC03MDA0LDcgKzcxMzQsNyBAQAotIGVsc2UKLSAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzAwODogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MTM4OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbGN1cnNlcyIgPiY1Ci0gYWNfbGliX3Zhcj1gZWNobyBjdXJzZXMnXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC03MDEyLDcgKzcxNDIsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbGN1cnNlcyAgJExJQlMiCi0gY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDcwMTYgImNvbmZpZ3VyZSIKLSsjbGluZSA3MTQ2ICJjb25maWd1cmUiCi0gI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi1AQCAtNzAyMyw3ICs3MTUzLDcgQEAKLSB0Z2V0ZW50KCkKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MDI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcxNTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSBlbHNlCi1AQCAtNzA0Miw3ICs3MTcyLDcgQEAKLSBlbHNlCi0gICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzA0NjogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtaW5mbyIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjcxNzY6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWluZm8iID4mNQotIGFjX2xpYl92YXI9YGVjaG8gdGVybWluZm8nXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLUBAIC03MDUwLDcgKzcxODAsNyBAQAotICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLSBMSUJTPSItbHRlcm1pbmZvICAkTElCUyIKLSBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNzA1NCAiY29uZmlndXJlIgotKyNsaW5lIDcxODQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLUBAIC03MDYxLDcgKzcxOTEsNyBAQAotIHRnZXRlbnQoKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzE5NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotIGVsc2UKLUBAIC03MjI2LDcgKzczNTYsNyBAQAotIGZpCi0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGNsIGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3MjMwOiBjaGVja2luZyBmb3IgVGNsIGNvbmZpZ3VyYXRpb24iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3MzYwOiBjaGVja2luZyBmb3IgVGNsIGNvbmZpZ3VyYXRpb24iID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfdGNsY29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTczMzQsNyArNzQ2NCw3IEBACi0gZmkKLSAKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUayBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzMzODogY2hlY2tpbmcgZm9yIFRrIGNvbmZpZ3VyYXRpb24iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3NDY4OiBjaGVja2luZyBmb3IgVGsgY29uZmlndXJhdGlvbiIgPiY1Ci0gICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY190a2NvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC03NDQzLDcgKzc1NzMsNyBAQAotIAotIG5vX3RjbD10cnVlCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRjbCBwcml2YXRlIGhlYWRlcnMuIGRpcj0ke2NvbmZpZ2Rpcn0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3NDQ3OiBjaGVja2luZyBmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfSIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc1Nzc6IGNoZWNraW5nIGZvciBUY2wgcHJpdmF0ZSBoZWFkZXJzLiBkaXI9JHtjb25maWdkaXJ9IiA+JjUKLSAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjbGluY2x1ZGUgb3IgLS13aXRob3V0LXRjbGluY2x1ZGUgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7d2l0aF90Y2xpbmNsdWRlK3NldH0iID0gc2V0OyB0aGVuCi0gICB3aXRodmFsPSIkd2l0aF90Y2xpbmNsdWRlIgotQEAgLTc1MDksMTcgKzc2MzksMTcgQEAKLSBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICAgYWNfc2FmZT1gZWNobyAidGNsSW50LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Y2xJbnQuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc1MTM6IGNoZWNraW5nIGZvciB0Y2xJbnQuaCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjc2NDM6IGNoZWNraW5nIGZvciB0Y2xJbnQuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA3NTE4ICJjb25maWd1cmUiCi0rI2xpbmUgNzY0OCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDx0Y2xJbnQuaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzUyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjc2NTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtNzU3OSw3ICs3NzA5LDcgQEAKLSAjCi0gbm9fdGs9dHJ1ZQotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3NTgzOiBjaGVja2luZyBmb3IgVGsgcHJpdmF0ZSBoZWFkZXJzIiA+JjUKLStlY2hvICJjb25maWd1cmU6NzcxMzogY2hlY2tpbmcgZm9yIFRrIHByaXZhdGUgaGVhZGVycyIgPiY1Ci0gIyBDaGVjayB3aGV0aGVyIC0td2l0aC10a2luY2x1ZGUgb3IgLS13aXRob3V0LXRraW5jbHVkZSB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHt3aXRoX3RraW5jbHVkZStzZXR9IiA9IHNldDsgdGhlbgotICAgd2l0aHZhbD0iJHdpdGhfdGtpbmNsdWRlIgotQEAgLTc2NDUsMTcgKzc3NzUsMTcgQEAKLSBpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KLSAgICBhY19zYWZlPWBlY2hvICJ0ay5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGsuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc2NDk6IGNoZWNraW5nIGZvciB0ay5oIiA+JjUKLStlY2hvICJjb25maWd1cmU6Nzc3OTogY2hlY2tpbmcgZm9yIHRrLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgNzY1NCAiY29uZmlndXJlIgotKyNsaW5lIDc3ODQgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaW5jbHVkZSA8dGsuaD4KLSBFT0YKLSBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzY1OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSt7IChldmFsIGVjaG8gY29uZmlndXJlOjc3ODk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0gYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi1AQCAtNzcwMSw3ICs3ODMxLDcgQEAKLSAKLSAJICAgCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzcwNTogY2hlY2tpbmcgZm9yIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLStlY2hvICJjb25maWd1cmU6NzgzNTogY2hlY2tpbmcgZm9yIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLSBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgotICAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbDsgZG8KLSAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL2l0Y2wuaCA7IHRoZW4KLUBAIC03NzI0LDcgKzc4NTQsNyBAQAotIAotIAkgICAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSXRrIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc3Mjg6IGNoZWNraW5nIGZvciBJdGsgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKLStlY2hvICJjb25maWd1cmU6Nzg1ODogY2hlY2tpbmcgZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRraH0iID0geCA7IHRoZW4KLSAgIGZvciBpIGluICR7c3JjZGlyfS8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi9pdGNsL2l0azsgZG8KLSAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL2l0ay5oIDsgdGhlbgotQEAgLTc3NDcsNyArNzg3Nyw3IEBACi0gCi0gCSAgIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUaXggcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Nzc1MTogY2hlY2tpbmcgZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3ODgxOiBjaGVja2luZyBmb3IgVGl4IHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1Ci0gaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL3RpeCAke3NyY2Rpcn0vLi4vLi4vdGl4ICR7c3JjZGlyfS8uLi8uLi8uLi90aXggOyBkbwotICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGl4LmggOyB0aGVuCi1AQCAtNzc5OSw3ICs3OTI5LDcgQEAKLSBmaQotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc4MDM6IGNoZWNraW5nIGZvciBJdGNsIGNvbmZpZ3VyYXRpb24iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo3OTMzOiBjaGVja2luZyBmb3IgSXRjbCBjb25maWd1cmF0aW9uIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2l0Y2xjb25maWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi1AQCAtNzkwMiw3ICs4MDMyLDcgQEAKLSBmaQotIAotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0ayBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzkwNjogY2hlY2tpbmcgZm9yIEl0ayBjb25maWd1cmF0aW9uIiA+JjUKLStlY2hvICJjb25maWd1cmU6ODAzNjogY2hlY2tpbmcgZm9yIEl0ayBjb25maWd1cmF0aW9uIiA+JjUKLSAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2l0a2NvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC04MDA1LDcgKzgxMzUsNyBAQAotIGZpCi0gCi0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGl4IGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4MDA5OiBjaGVja2luZyBmb3IgVGl4IGNvbmZpZ3VyYXRpb24iID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4MTM5OiBjaGVja2luZyBmb3IgVGl4IGNvbmZpZ3VyYXRpb24iID4mNQotICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfdGl4Y29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTgxNDgsNyArODI3OCw3IEBACi0gIyBVc2VzIGFjXyB2YXJzIGFzIHRlbXBzIHRvIGFsbG93IGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSBjYWNoZSBhbmQgY2hlY2tzLgotICMgLS13aXRob3V0LXggb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZSwgYnV0IGRvZXMgbm90IHRvdWNoIHRoZSBjYWNoZS4KLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgWCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjgxNTI6IGNoZWNraW5nIGZvciBYIiA+JjUKLStlY2hvICJjb25maWd1cmU6ODI4MjogY2hlY2tpbmcgZm9yIFgiID4mNQotIAotICMgQ2hlY2sgd2hldGhlciAtLXdpdGgteCBvciAtLXdpdGhvdXQteCB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHt3aXRoX3grc2V0fSIgPSBzZXQ7IHRoZW4KLUBAIC04MjEwLDEyICs4MzQwLDEyIEBACi0gCi0gICAjIEZpcnN0LCB0cnkgdXNpbmcgdGhhdCBmaWxlIHdpdGggbm8gc3BlY2lhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkLgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4MjE0ICJjb25maWd1cmUiCi0rI2xpbmUgODM0NCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotICNpbmNsdWRlIDwkeF9kaXJlY3RfdGVzdF9pbmNsdWRlPgotIEVPRgotIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODM0OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLSBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0gaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLUBAIC04Mjg0LDE0ICs4NDE0LDE0IEBACi0gICBhY19zYXZlX0xJQlM9IiRMSUJTIgotICAgTElCUz0iLWwkeF9kaXJlY3RfdGVzdF9saWJyYXJ5ICRMSUJTIgotIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4Mjg4ICJjb25maWd1cmUiCi0rI2xpbmUgODQxOCAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotICR7eF9kaXJlY3RfdGVzdF9mdW5jdGlvbn0oKQotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjgyOTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODQyNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotICMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgotQEAgLTg1ODQsNyArODcxNCw3IEBACi0gIyBgYGdkYnNlcnZlcicnIGNhbiBvbmx5IGJlIGJ1aWx0IGluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24uCi0gaWYgdGVzdCB4IiR7dGFyZ2V0fSIgPSB4IiR7aG9zdH0iOyB0aGVuCi0gICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2Ric2VydmVyIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4NTg4OiBjaGVja2luZyB3aGV0aGVyIGdkYnNlcnZlciBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0IiA+JjUKLStlY2hvICJjb25maWd1cmU6ODcxODogY2hlY2tpbmcgd2hldGhlciBnZGJzZXJ2ZXIgaXMgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdCIgPiY1Ci0gICAgIGlmIHRlc3QgeCIke2J1aWxkX2dkYnNlcnZlcn0iID0geHllcyA7IHRoZW4KLSAJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBnZGJzZXJ2ZXIiCi0gCVNVQkRJUlM9IiR7U1VCRElSU30gZ2Ric2VydmVyIgotQEAgLTg2NDYsNyArODc3Niw3IEBACi0gCi0gCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjg2NTA6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotK2VjaG8gImNvbmZpZ3VyZTo4NzgwOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0gZWxzZQotQEAgLTg2NzAsMTIgKzg4MDAsMTIgQEAKLSAKLSAKLSBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6ODY3NDogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjg4MDQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSBlbHNlCi0gICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODY3OSAiY29uZmlndXJlIgotKyNsaW5lIDg4MDkgImNvbmZpZ3VyZSIKLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLSBpbnQgbWFpbigpIHsKLUBAIC04Njg2LDcgKzg4MTYsNyBAQAotIHJldHVybiBfX0NZR1dJTl9fOwotIDsgcmV0dXJuIDA7IH0KLSBFT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg2OTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLStpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4MjA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2N5Z3dpbj15ZXMKLSBlbHNlCi1AQCAtODcwMywxOSArODgzMywxOSBAQAotIENZR1dJTj0KLSB0ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi0gZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo4NzA3OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjg4Mzc6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLSAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4NzEyICJjb25maWd1cmUiCi0rI2xpbmUgODg0MiAiY29uZmlndXJlIgotICNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotIGludCBtYWluKCkgewotIHJldHVybiBfX01JTkdXMzJfXzsKLSA7IHJldHVybiAwOyB9Ci0gRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzE5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0raWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICBybSAtcmYgY29uZnRlc3QqCi0gICBhY19jdl9taW5ndzMyPXllcwotIGVsc2UKLUBAIC04NzM0LDcgKzg4NjQsNyBAQAotIAotIAotIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjg3Mzg6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci0rZWNobyAiY29uZmlndXJlOjg4Njg6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotIGVsc2UKLUBAIC04NzQ0LDEwICs4ODc0LDEwIEBACi0gICBybSAtZiBjb25mdGVzdCoKLSAgIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY3ZfZXhlZXh0PQotLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0rICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4Nzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgICBjYXNlICRmaWxlIGluCi0tICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotKyAgICAgICouYyB8ICoubyB8ICoub2JqKSA7OwotICAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICAgZXNhYwotICAgICBkb25lCi1AQCAtODkwNSw2ICs5MDM1LDkgQEAKLSBzJUBNQUlOVEAlJE1BSU5UJWcKLSBzJUBDQ0AlJENDJWcKLSBzJUBDUFBAJSRDUFAlZwotK3MlQERJUl9haWZAJSRESVJfYWlmJWcKLStzJUBJTkNMVURFX2FpZkAlJElOQ0xVREVfYWlmJWcKLStzJUBMSUJfYWlmQCUkTElCX2FpZiVnCi0gcyVAaG9zdEAlJGhvc3QlZwotIHMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLSBzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLS0tLSBnZGItNS4yLW9sZC9nZGIvY29uZmlnLmluCVdlZCBKdWwgMTAgMTI6NDY6MzUgMjAwMgotKysrIGdkYi01LjIvZ2RiL2NvbmZpZy5pbglNb24gSnVsIDIyIDA5OjU4OjMxIDIwMDIKLUBAIC00OTksMyArNDk5LDUgQEAKLSAvKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHByX3NpZ2luZm82NF90LiAqLwotICN1bmRlZiBIQVZFX1BSX1NJR0lORk82NF9UCi0gCi0rLyogRGVmaW5lIGZvciBBSUYgc3VwcG9ydC4gKi8KLSsjdW5kZWYgSEFWRV9BSUYKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3ByaW50LmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9wcmludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzBmYTcyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3ByaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoKLSAqIFJvdXRpbmVzIHRvIHByaW50IEFJRiBvYmplY3RzLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIGJ5IEd1YXJkc29mdCBQdHkgTHRkLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZQk8Y29uZmlnLmg+Ci0jZW5kaWYgLyogSEFWRV9DT05GSUdfSCAqLwotCi0jaW5jbHVkZQk8c3RkaW8uaD4KLSNpbmNsdWRlCTxzdGRsaWIuaD4KLSNpbmNsdWRlCTxzdHJpbmcuaD4KLQotI2luY2x1ZGUJImFpZi5oIgotI2luY2x1ZGUJImFpZmludC5oIgotI2luY2x1ZGUJImFpZmVyci5oIgotCi1pbnQKLUFJRlByaW50KEZJTEUgKmZwLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLSAgICAgICAgY2hhciAqICBmbXQ7Ci0gICAgICAgIGNoYXIgKiAgZGF0YTsKLQotICAgICAgICBpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgICBmbXQgPSBBSUZfRk9STUFUKGEpOwotICAgICAgICBkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLSAgICAgICAgcmV0dXJuIF9haWZfcHJpbnQoZnAsIGRlcHRoLCAmZm10LCAmZGF0YSk7Ci19Ci0KLS8qIAotICogUHJpbnRzIHRoZSBvYmplY3QgaW4gaHVtYW4tcmVhZGFibGUgZm9ybSB0byBmcCwgYWR2YW5jZXMgZmRzIGFuZCBkYXRhIHRvCi0gKiB0aGUgZmlyc3QgbG9jYXRpb24gYWZ0ZXIgdGhlIHBhcnQgcHJpbnRlZC4gIEFyaXRobWV0aWMgdmFsdWVzIGFyZSBnaXZlbiBhdAotICogbGVhc3QgbGVuIGJ5dGVzIG9mIHNpZ25pZmljYW5jZSwgbW9yZSBpZiB0aGUgZmRzIGluZGljYXRlcy4KLSAqLwotaW50Ci1fYWlmX3ByaW50KEZJTEUgKmZwLCBpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotICAgICAgICBjaGFyICogdG1wOwotCi0gICAgICAgIF9mZHNfcmVzb2x2ZShmZHMpOwotCi0gICAgICAgIHN3aXRjaCAoIEZEU1R5cGUoKmZkcykgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgQUlGX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfYm9vbChmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfQ0hBUkFDVEVSOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3ByaW50X2NoYXIoZnAsIGRlcHRoLCBmZHMsIGRhdGEpOwotCi0gICAgICAgIGNhc2UgQUlGX0lOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfaW50KGZwLCBkZXB0aCwgZmRzLCBkYXRhKTsKLQotICAgICAgICBjYXNlIEFJRl9GTE9BVElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gX2FpZl9wcmludF9mbG9hdChmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfQVJSQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfYXJyYXkoZnAsIGRlcHRoLCBmZHMsIGRhdGEpOwotCi0gICAgICAgIGNhc2UgQUlGX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfcG9pbnRlcihmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfUkVHSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3ByaW50X3JlZ2lvbihmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfU1RSVUNUOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3ByaW50X3N0cnVjdChmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gX2FpZl9wcmludF9uYW1lKGZwLCBkZXB0aCwgZmRzLCBkYXRhKTsKLQotICAgICAgICBjYXNlIEFJRl9SRUZFUkVOQ0U6Ci0gICAgICAgICAgICAgICAgdG1wID0gX2Zkc19sb29rdXAoZmRzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2FpZl9wcmludChmcCwgZGVwdGgsICZ0bXAsIGRhdGEpOwotCi0gICAgICAgIGNhc2UgQUlGX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gX2FpZl9wcmludF9zdHJpbmcoZnAsIGRlcHRoLCBmZHMsIGRhdGEpOwotCi0gICAgICAgIGNhc2UgQUlGX0VOVU06Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfZW51bShmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfVU5JT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfdW5pb24oZnAsIGRlcHRoLCBmZHMsIGRhdGEpOwotCi0gICAgICAgIGNhc2UgQUlGX1ZPSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfdm9pZChmcCwgZGVwdGgsIGZkcywgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfRlVOQ1RJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfcHJpbnRfZnVuY3Rpb24oZnAsIGRlcHRoLCBmZHMsIGRhdGEpOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0JcmV0dXJuIC0xOwotfQotCi1pbnQKLV9haWZfcHJpbnRfYm9vbChGSUxFICpmcCwgaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICoJc3RyOwotCQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX2Jvb2xfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X2NoYXIoRklMRSAqZnAsIGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JY2hhciAqCXN0cjsKLQkKLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl9jaGFyX3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQlzdHIgPSBfc3RyX2dldCgpOwotCi0JZnByaW50ZihmcCwgIiVzIiwgc3RyKTsKLQotCV9haWZfZnJlZShzdHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl9wcmludF9pbnQoRklMRSAqZnAsIGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JY2hhciAqCXN0cjsKLQkKLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl9pbnRfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X2Zsb2F0KEZJTEUgKmZwLCBpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWNoYXIgKglzdHI7Ci0JCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfZmxvYXRfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X2FycmF5KEZJTEUgKmZwLCBpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWNoYXIgKglzdHI7Ci0JCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfYXJyYXlfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X3BvaW50ZXIoRklMRSAqZnAsIGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JY2hhciAqCXN0cjsKLQkKLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl9wb2ludGVyX3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQlzdHIgPSBfc3RyX2dldCgpOwotCi0JZnByaW50ZihmcCwgIiVzIiwgc3RyKTsKLQotCV9haWZfZnJlZShzdHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl9wcmludF9yZWdpb24oRklMRSAqZnAsIGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JY2hhciAqCXN0cjsKLQkKLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl9yZWdpb25fdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X3N0cnVjdChGSUxFICpmcCwgaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICoJc3RyOwotCQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3N0cnVjdF90b19zdHIoZGVwdGgsIGZkcywgZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0Jc3RyID0gX3N0cl9nZXQoKTsKLQotCWZwcmludGYoZnAsICIlcyIsIHN0cik7Ci0KLQlfYWlmX2ZyZWUoc3RyKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfcHJpbnRfbmFtZShGSUxFICpmcCwgaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICoJc3RyOwotCQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX25hbWVfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X3JlZmVyZW5jZShGSUxFICpmcCwgaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICoJc3RyOwotCQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3JlZmVyZW5jZV90b19zdHIoZGVwdGgsIGZkcywgZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0Jc3RyID0gX3N0cl9nZXQoKTsKLQotCWZwcmludGYoZnAsICIlcyIsIHN0cik7Ci0KLQlfYWlmX2ZyZWUoc3RyKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfcHJpbnRfc3RyaW5nKEZJTEUgKmZwLCBpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWNoYXIgKglzdHI7Ci0JCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfc3RyaW5nX3RvX3N0cihkZXB0aCwgZmRzLCBkYXRhKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0KLQlzdHIgPSBfc3RyX2dldCgpOwotCi0JZnByaW50ZihmcCwgIiVzIiwgc3RyKTsKLQotCV9haWZfZnJlZShzdHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl9wcmludF9lbnVtKEZJTEUgKmZwLCBpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWNoYXIgKglzdHI7Ci0JCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfZW51bV90b19zdHIoZGVwdGgsIGZkcywgZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0Jc3RyID0gX3N0cl9nZXQoKTsKLQotCWZwcmludGYoZnAsICIlcyIsIHN0cik7Ci0KLQlfYWlmX2ZyZWUoc3RyKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfcHJpbnRfdW5pb24oRklMRSAqZnAsIGludCBkZXB0aCwgY2hhciAqKmZkcywgY2hhciAqKmRhdGEpCi17Ci0JY2hhciAqCXN0cjsKLQkKLQlfc3RyX2luaXQoKTsKLQotCWlmICggX2FpZl91bmlvbl90b19zdHIoZGVwdGgsIGZkcywgZGF0YSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0Jc3RyID0gX3N0cl9nZXQoKTsKLQotCWZwcmludGYoZnAsICIlcyIsIHN0cik7Ci0KLQlfYWlmX2ZyZWUoc3RyKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfcHJpbnRfdm9pZChGSUxFICpmcCwgaW50IGRlcHRoLCBjaGFyICoqZmRzLCBjaGFyICoqZGF0YSkKLXsKLQljaGFyICoJc3RyOwotCQotCV9zdHJfaW5pdCgpOwotCi0JaWYgKCBfYWlmX3ZvaWRfdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3ByaW50X2Z1bmN0aW9uKEZJTEUgKmZwLCBpbnQgZGVwdGgsIGNoYXIgKipmZHMsIGNoYXIgKipkYXRhKQotewotCWNoYXIgKglzdHI7Ci0JCi0JX3N0cl9pbml0KCk7Ci0KLQlpZiAoIF9haWZfZnVuY3Rpb25fdG9fc3RyKGRlcHRoLCBmZHMsIGRhdGEpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCXN0ciA9IF9zdHJfZ2V0KCk7Ci0KLQlmcHJpbnRmKGZwLCAiJXMiLCBzdHIpOwotCi0JX2FpZl9mcmVlKHN0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1BSUZQcmludEJvb2woRklMRSAqZnAsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JcmV0dXJuIF9haWZfcHJpbnRfYm9vbChmcCwgZGVwdGgsICZmbXQsICZkYXRhKTsKLX0KLQotaW50Ci1BSUZQcmludENoYXIoRklMRSAqZnAsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JcmV0dXJuIF9haWZfcHJpbnRfY2hhcihmcCwgZGVwdGgsICZmbXQsICZkYXRhKTsKLX0KLQotaW50Ci1BSUZQcmludEludChGSUxFICpmcCwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlyZXR1cm4gX2FpZl9wcmludF9pbnQoZnAsIGRlcHRoLCAmZm10LCAmZGF0YSk7Ci19Ci0KLWludAotQUlGUHJpbnRGbG9hdChGSUxFICpmcCwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlyZXR1cm4gX2FpZl9wcmludF9mbG9hdChmcCwgZGVwdGgsICZmbXQsICZkYXRhKTsKLX0KLQotaW50Ci1BSUZQcmludEFycmF5KEZJTEUgKmZwLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCXJldHVybiBfYWlmX3ByaW50X2FycmF5KGZwLCBkZXB0aCwgJmZtdCwgJmRhdGEpOwotfQotCi1pbnQKLUFJRlByaW50UG9pbnRlcihGSUxFICpmcCwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlyZXR1cm4gX2FpZl9wcmludF9wb2ludGVyKGZwLCBkZXB0aCwgJmZtdCwgJmRhdGEpOwotfQotCi1pbnQKLUFJRlByaW50UmVnaW9uKEZJTEUgKmZwLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCXJldHVybiBfYWlmX3ByaW50X3JlZ2lvbihmcCwgZGVwdGgsICZmbXQsICZkYXRhKTsKLX0KLQotaW50Ci1BSUZQcmludFN0cnVjdChGSUxFICpmcCwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlyZXR1cm4gX2FpZl9wcmludF9zdHJ1Y3QoZnAsIGRlcHRoLCAmZm10LCAmZGF0YSk7Ci19Ci0KLWludAotQUlGUHJpbnROYW1lKEZJTEUgKmZwLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCXJldHVybiBfYWlmX3ByaW50X25hbWUoZnAsIGRlcHRoLCAmZm10LCAmZGF0YSk7Ci19Ci0KLWludAotQUlGUHJpbnRSZWZlcmVuY2UoRklMRSAqZnAsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JcmV0dXJuIF9haWZfcHJpbnRfcmVmZXJlbmNlKGZwLCBkZXB0aCwgJmZtdCwgJmRhdGEpOwotfQotCi1pbnQKLUFJRlByaW50U3RyaW5nKEZJTEUgKmZwLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCXJldHVybiBfYWlmX3ByaW50X3N0cmluZyhmcCwgZGVwdGgsICZmbXQsICZkYXRhKTsKLX0KLQotaW50Ci1BSUZQcmludEVudW0oRklMRSAqZnAsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JcmV0dXJuIF9haWZfcHJpbnRfZW51bShmcCwgZGVwdGgsICZmbXQsICZkYXRhKTsKLX0KLQotaW50Ci1BSUZQcmludFVuaW9uKEZJTEUgKmZwLCBpbnQgZGVwdGgsIEFJRiAqYSkKLXsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9Ci0KLQlmbXQgPSBBSUZfRk9STUFUKGEpOwotCWRhdGEgPSBBSUZfREFUQShhKTsKLQotCXJldHVybiBfYWlmX3ByaW50X3VuaW9uKGZwLCBkZXB0aCwgJmZtdCwgJmRhdGEpOwotfQotCi1pbnQKLUFJRlByaW50Vm9pZChGSUxFICpmcCwgaW50IGRlcHRoLCBBSUYgKmEpCi17Ci0JY2hhciAqCWZtdDsKLQljaGFyICoJZGF0YTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JfQotCi0JZm10ID0gQUlGX0ZPUk1BVChhKTsKLQlkYXRhID0gQUlGX0RBVEEoYSk7Ci0KLQlyZXR1cm4gX2FpZl9wcmludF92b2lkKGZwLCBkZXB0aCwgJmZtdCwgJmRhdGEpOwotfQotCi1pbnQKLUFJRlByaW50RnVuY3Rpb24oRklMRSAqZnAsIGludCBkZXB0aCwgQUlGICphKQotewotCWNoYXIgKglmbXQ7Ci0JY2hhciAqCWRhdGE7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KLQotCWZtdCA9IEFJRl9GT1JNQVQoYSk7Ci0JZGF0YSA9IEFJRl9EQVRBKGEpOwotCi0JcmV0dXJuIF9haWZfcHJpbnRfZnVuY3Rpb24oZnAsIGRlcHRoLCAmZm10LCAmZGF0YSk7Ci19Ci0KLWludAotQUlGUHJpbnRBcnJheUluZGV4KEZJTEUgKmZwLCBBSUZJbmRleCAqaXgpCi17Ci0JY2hhciAqCXN0cjsKLQotCWlmICggaXggPT0gKEFJRkluZGV4ICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZBcnJheUluZGV4VG9TdHIoJnN0ciwgaXgpIDwgMCApCi0JCXJldHVybiAtMTsKLQotCWZwcmludGYoZnAsICIlcyIsIHN0cik7Ci0KLQlfYWlmX2ZyZWUoc3RyKTsKLQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi9zdHJ1Y3QuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3N0cnVjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWZlMTEzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3N0cnVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBSb3V0aW5lcyBzcGVjaWZpYyB0byBBSUYgc3RydWN0dXJlIG9iamVjdHMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgYnkgR3VhcmRzb2Z0IFB0eSBMdGQuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlCTxjb25maWcuaD4KLSNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCi0KLSNpbmNsdWRlCTxzdGRpby5oPgotI2lmbmRlZiBXSU4zMgotI2luY2x1ZGUJPHVuaXN0ZC5oPgotI2VuZGlmIC8qICFXSU4zMiAqLwotCi0jaW5jbHVkZQkiYWlmLmgiCi0jaW5jbHVkZQkiYWlmaW50LmgiCi0jaW5jbHVkZQkiYWlmZXJyLmgiCi0KLWludAotQUlGTnVtRmllbGRzKEFJRiAqYSkKLXsKLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX0JBREFSRywgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIEFJRlR5cGUoYSkgIT0gQUlGX1NUUlVDVCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfVFlQRSwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gRkRTTnVtRmllbGRzKEFJRl9GT1JNQVQoYSkpOwotfQotCi1pbnQKLUFJRkZpZWxkVHlwZShBSUYgKmEsIGNoYXIgKm5hbWUpCi17Ci0JaW50CXJldDsKLQljaGFyICoJdHlwZTsKLQotCWlmICggYSA9PSAoQUlGICopTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIEFJRl9JTlZBTElEOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfU1RSVUNUICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIEFJRl9JTlZBTElEOwotCX0KLQotCWlmICggRkRTU3RydWN0RmllbGRCeU5hbWUoQUlGX0ZPUk1BVChhKSwgbmFtZSwgJnR5cGUpIDwgMCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfRkRTLCBOVUxMKTsKLQkJcmV0dXJuIEFJRl9JTlZBTElEOwotCX0KLQotCXJldCA9IEZEU1R5cGUodHlwZSk7Ci0JX2FpZl9mcmVlKHR5cGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1BSUZGaWVsZFRvSW50KEFJRiAqYSwgY2hhciAqbmFtZSwgaW50ICp2YWwpCi17Ci0JQUlGTE9OR0VTVAlsOwotCi0JaWYgKCBBSUZGaWVsZFRvTG9uZ2VzdChhLCBuYW1lLCAmbCkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnZhbCA9IChpbnQpbDsgLyogcG90ZW50aWFsIGxvc3Mgb2YgcHJlY2lzaW9uICovCi0KLQlyZXR1cm4gMDsKLX0KLQotLypYWFgKLSAqIEFJRkZpZWxkVG9Mb25nZXN0KCkgYW5kIEFJRkZpZWxkVG9Eb3VibGVzdCgpIGFyZSBicm9rZW4gYmVjYXVzZSBvZiB0aGUKLSAqIG5ldyBzdHJ1Y3R1cmUgZm9ybWF0LiBXZSBuZWVkIHRvIGFkZCBBSUZGaWVsZCgpLgotICovCi1pbnQKLUFJRkZpZWxkVG9Mb25nZXN0KEFJRiAqYSwgY2hhciAqbmFtZSwgQUlGTE9OR0VTVCAqdmFsKQotewotCWNoYXIgKgl0eXBlOwotCi0JaWYgKCBhID09IChBSUYgKilOVUxMIHx8IG5hbWUgPT0gTlVMTCApCi0JewotCQlTZXRBSUZFcnJvcihBSUZFUlJfQkFEQVJHLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggQUlGVHlwZShhKSAhPSBBSUZfU1RSVUNUICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggbmFtZSAhPSBOVUxMICkKLQl7Ci0JCWlmICggRkRTU3RydWN0RmllbGRCeU5hbWUoQUlGX0ZPUk1BVChhKSwgbmFtZSwgJnR5cGUpIDwgMCApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9GRFMsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKCBGRFNUeXBlKHR5cGUpICE9IEFJRl9JTlRFR0VSICkKLQkJewotCQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0vKglyZXR1cm4gX2FpZl90b19sb25nZXN0KEFJRl9EQVRBKGEpICsgb2ZmLCBzaXplLCB2YWwpOyovCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotQUlGRmllbGRUb0RvdWJsZShBSUYgKmEsIGNoYXIgKm5hbWUsIGRvdWJsZSAqdmFsKQotewotCUFJRkRPVUJMRVNUCWQ7Ci0KLQlpZiAoIEFJRkZpZWxkVG9Eb3VibGVzdChhLCBuYW1lLCAmZCkgPCAwICkKLQkJcmV0dXJuIC0xOwotCi0JKnZhbCA9IChkb3VibGUpZDsgLyogcG9zc2libGUgbG9zcyBvZiBwcmVjaXNpb24gKi8KLQotCXJldHVybiAwOwotfQotCi0vKlhYWCovCi1pbnQKLUFJRkZpZWxkVG9Eb3VibGVzdChBSUYgKmEsIGNoYXIgKm5hbWUsIEFJRkRPVUJMRVNUICp2YWwpCi17Ci0JY2hhciAqCXR5cGU7Ci0KLQlpZiAoIGEgPT0gKEFJRiAqKU5VTEwgfHwgbmFtZSA9PSBOVUxMICkKLQl7Ci0JCVNldEFJRkVycm9yKEFJRkVSUl9CQURBUkcsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBBSUZUeXBlKGEpICE9IEFJRl9TVFJVQ1QgKQotCXsKLQkJU2V0QUlGRXJyb3IoQUlGRVJSX1RZUEUsIE5VTEwpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBuYW1lICE9IE5VTEwgKQotCXsKLQkJaWYgKCBGRFNTdHJ1Y3RGaWVsZEJ5TmFtZShBSUZfRk9STUFUKGEpLCBuYW1lLCAmdHlwZSkgPCAwICApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9GRFMsIE5VTEwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKCBGRFNUeXBlKHR5cGUpICE9IEFJRl9GTE9BVElORyApCi0JCXsKLQkJCVNldEFJRkVycm9yKEFJRkVSUl9UWVBFLCBOVUxMKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotLyoJcmV0dXJuIF9haWZfdG9fZG91Ymxlc3QoQUlGX0RBVEEoYSkgKyBvZmYsIHNpemUsIHZhbCk7Ki8KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3Rlc3RhaWYuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3Rlc3RhaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkODAyNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi90ZXN0YWlmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIwICswLDAgQEAKLS8qCi0gKiBUZXN0IGhhcm5lc3MgZm9yIHRoZSBhaWYgbGlicmFyeS4KLSAqCi0gKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUmFwaGFlbCBGaW5rZWwgOC8yMDAwIHJhcGhhZWxAY3MudWt5LmVkdQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIGJ5IEd1YXJkc29mdCBQdHkgTHRkLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYgLyogSEFWRV9DT05GSUdfSCAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gLyogbWVtY3B5ICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+IC8qIGdldG9wdCAqLwotI2lmZGVmIF9fYWxwaGEKLSNpbmNsdWRlIDxzdHJpbmcuaD4gLyogbWVtY3B5ICovCi0jZW5kaWYKLSNpbmNsdWRlICJhaWYuaCIKLSNpbmNsdWRlICJhaWZpbnQuaCIKLSNpbmNsdWRlICJ0ZXN0YWlmLmgiCi0KLSNkZWZpbmUgVEVTVF9TRVJJRVNfMSAweDAxCi0jZGVmaW5lIFRFU1RfU0VSSUVTXzIgMHgwMgotI2RlZmluZSBURVNUX1NFUklFU18zIDB4MDQKLSNkZWZpbmUgVEVTVF9TRVJJRVNfNCAweDA4Ci0jZGVmaW5lIFRFU1RfU0VSSUVTXzUgMHgxMAotI2RlZmluZSBURVNUX1NFUklFU182IDB4MjAKLQotCi0KLVRlc3RGbGFncyBhbGwgPSB7Ci0JMSwxLDEsCi0JMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotCTEsMSwKLQkoQUlGKilTRUxGLCAoQUlGKilOVUxMLCAoQUlGKilOVUxMLAotCShBSUYqKU5VTEwsIChBSUYqKU5VTEwsIChBSUYqKU5VTEwsIChBSUYqKU5VTEwsIChBSUYqKU5VTEwsCi0JTlVMTCwKLQkwfTsKLQotVGVzdEZsYWdzIG5vbmUgPSB7Ci0JMCwwLDAsCi0JMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotCTAsMCwKLQlOVUxMLE5VTEwsCi0JTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLAotCU5VTEwsCi0JMH07Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKiAgICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgCVRlc3RBbGxDb25zdHJ1Y3RvcnMoKTsKLXZvaWQgCVRlc3RBbGxBc2NpaSgpOwotdm9pZCAJVGVzdEFsbEFyaXRobWV0aWMoKTsKLXZvaWQgCVRlc3RBbGxDaXJjdWxhckRhdGEoKTsKLXZvaWQgCVRlc3RBbGxFUFMoKTsKLXZvaWQgCVRlc3RBbGxDb21wYXJlQnlOYW1lKCk7Ci12b2lkIAlfdGVzdEFzY2lpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgVGVzdEZsYWdzKTsKLXZvaWQgCV90ZXN0QXJpdGhtZXRpYyhjaGFyICosIEFJRiAqLCBjaGFyICosIFRlc3RGbGFncywgQUlGICopOwotdm9pZCAJX3Rlc3RDaXJjdWxhckRhdGEoY2hhciAqLCBBSUYgKiwgQUlGICosIFRlc3RGbGFncyk7Ci12b2lkIAlfdGVzdEVQUyhBSUYgKiwgQUlGICosIEFJRiAqKTsKLXZvaWQgCV90ZXN0Q29tcGFyZUJ5TmFtZShpbnQsIEFJRiAqLCBBSUYgKiwgY2hhciAqKTsKLQotaW50IAlBSUZUZXN0KGNoYXIgKiwgQUlGICosIGNoYXIgKiwgVGVzdEZsYWdzKTsKLWludCAJQUlGVGVzdEludChjaGFyICosIEFJRiAqLCBjaGFyICosIFRlc3RGbGFncyk7Ci1pbnQgCV9haWZfdGVzdChBSUYgKiwgVGVzdEZsYWdzKTsKLWludCAJX2FpZl90ZXN0X2dlbmVyYWwoQUlGICosIFRlc3RGbGFncyk7Ci1pbnQgCV9haWZfdGVzdF9ib29sKEFJRiAqLCBUZXN0RmxhZ3MpOwotaW50IAlfYWlmX3Rlc3RfY2hhcihBSUYgKiwgVGVzdEZsYWdzKTsKLWludCAJX2FpZl90ZXN0X2ludChBSUYgKiwgVGVzdEZsYWdzKTsKLWludCAJX2FpZl90ZXN0X2Zsb2F0KEFJRiAqLCBUZXN0RmxhZ3MpOwotaW50IAlfYWlmX3Rlc3RfYXJyYXkoQUlGICosIFRlc3RGbGFncyk7Ci1pbnQgCV9haWZfdGVzdF9wb2ludGVyKEFJRiAqLCBUZXN0RmxhZ3MpOwotaW50IAlfYWlmX3Rlc3RfcmVnaW9uKEFJRiAqLCBUZXN0RmxhZ3MpOwotaW50IAlfYWlmX3Rlc3Rfc3RydWN0KEFJRiAqLCBUZXN0RmxhZ3MpOwotaW50IAlfYWlmX3Rlc3RfbmFtZShBSUYgKiwgVGVzdEZsYWdzKTsKLWludCAJX2FpZl90ZXN0X3JlZmVyZW5jZShBSUYgKiwgVGVzdEZsYWdzKTsKLWludCAJX2FpZl90ZXN0X3N0cmluZyhBSUYgKiwgVGVzdEZsYWdzKTsKLWludCAJX2FpZl90ZXN0X2VudW0oQUlGICosIFRlc3RGbGFncyk7Ci1pbnQgCV9haWZfdGVzdF91bmlvbihBSUYgKiwgVGVzdEZsYWdzKTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKiAgICAgICAgICAgTWFpbiBGdW5jdGlvbiAgICAgICAgICAgKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCAKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQJYzsKLQlpbnQJdGVzdHMgPSAwOwotCi0Jd2hpbGUgKCAoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiMTIzNDU2IikpICE9IEVPRiApCi0JewotCQlzd2l0Y2ggKCBjICkKLQkJewotCQljYXNlICcxJzoKLQkJCXRlc3RzIHw9IFRFU1RfU0VSSUVTXzE7Ci0JCQlicmVhazsKLQotCQljYXNlICcyJzoKLQkJCXRlc3RzIHw9IFRFU1RfU0VSSUVTXzI7Ci0JCQlicmVhazsKLQotCQljYXNlICczJzoKLQkJCXRlc3RzIHw9IFRFU1RfU0VSSUVTXzM7Ci0JCQlicmVhazsKLQkJCi0JCWNhc2UgJzQnOgotCQkJdGVzdHMgfD0gVEVTVF9TRVJJRVNfNDsKLQkJCWJyZWFrOwotCQkKLQkJY2FzZSAnNSc6Ci0JCQl0ZXN0cyB8PSBURVNUX1NFUklFU181OwotCQkJYnJlYWs7Ci0JCQotCQljYXNlICc2JzoKLQkJCXRlc3RzIHw9IFRFU1RfU0VSSUVTXzY7Ci0JCQlicmVhazsKLQkJCi0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiB0ZXN0YWlmIFstMV0gWy0yXSBbLTNdIFstNF0gWy01XSBbLTZdXG4iKTsKLQkJCWV4aXQoMCk7Ci0JCX0KLQl9Ci0KLQlpZiAoIHRlc3RzID09IDAgfHwgdGVzdHMgJiBURVNUX1NFUklFU18xICkKLQkJVGVzdEFsbENvbnN0cnVjdG9ycygpOwotCi0JaWYgKCB0ZXN0cyA9PSAwIHx8IHRlc3RzICYgVEVTVF9TRVJJRVNfMiApCi0JCVRlc3RBbGxBc2NpaSgpOwotCi0JaWYgKCB0ZXN0cyA9PSAwIHx8IHRlc3RzICYgVEVTVF9TRVJJRVNfMyApCi0JCVRlc3RBbGxBcml0aG1ldGljKCk7Ci0KLQlpZiAoIHRlc3RzID09IDAgfHwgdGVzdHMgJiBURVNUX1NFUklFU180ICkKLQkJVGVzdEFsbENpcmN1bGFyRGF0YSgpOwotCi0JaWYgKCB0ZXN0cyA9PSAwIHx8IHRlc3RzICYgVEVTVF9TRVJJRVNfNSApCi0JCVRlc3RBbGxFUFMoKTsKLQotCWlmICggdGVzdHMgPT0gMCB8fCB0ZXN0cyAmIFRFU1RfU0VSSUVTXzYgKQotCQlUZXN0QWxsQ29tcGFyZUJ5TmFtZSgpOwotCi0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG4qKioqKiogRU5EIE9GIFRFU1QgKioqKioqXG4iKTsKLQotCXJldHVybiAwOwotCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKiogICAgICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMgICAgICAgICoqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIAotVGVzdEFsbENvbnN0cnVjdG9ycygpCi17Ci0JQUlGICphU3RyaW5nLCAqYUZsb2F0LCAqYURvdWJsZSwgKmFuSW50LCAqYVBvaW50ZXIsICphU3RydWN0OwotCUFJRiAqYW5BcnJheSwgKmFuRW51bSwgKmFVbmlvbjsKLQlUZXN0RmxhZ3MgZmxhZyA9IGFsbDsKLQlpbnQgbWluLCBtYXg7Ci0KLQotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFxuIik7Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiKioqIFRFU1QgU0VSSUVTIDE6IGNvbnN0cnVjdG9ycyAqKiogXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcblxuIik7Ci0KLQotCWFTdHJpbmcgPSBTdHJpbmdUb0FJRigiaGVsbG8sIHdvcmxkISIpOwotCUFJRlRlc3QoInN1YnRlc3QxIiwgYVN0cmluZywgInN0cmluZzogaGVsbG8sIHdvcmxkISIsIGZsYWcpOwotCi0JYUZsb2F0ID0gRmxvYXRUb0FJRigyKTsKLQlBSUZUZXN0KCJzdWJ0ZXN0MiIsIGFGbG9hdCwgImZsb2F0OiAyIiwgZmxhZyk7Ci0KLQlhRG91YmxlID0gRG91YmxlVG9BSUYoMCk7Ci0JQUlGVGVzdCgic3VidGVzdDMiLCBhRG91YmxlLCAiZG91YmxlOiAwIiwgZmxhZyk7Ci0KLQlhbkludCA9IEludFRvQUlGKDE2KTsKLQlBSUZUZXN0KCJzdWJ0ZXN0NCIsIGFuSW50LCAiaW50ZWdlcjogMTYiLCBmbGFnKTsKLQotCWFQb2ludGVyID0gUG9pbnRlclRvQUlGKE5VTEwsIGFuSW50KTsKLQlBSUZUZXN0KCJzdWJ0ZXN0NSIsIGFQb2ludGVyLCAiYSBwb2ludGVyIiwgZmxhZyk7Ci0KLQlhUG9pbnRlciA9IFBvaW50ZXJUb0FJRihOVUxMLCBhUG9pbnRlcik7Ci0JQUlGVGVzdCgic3VidGVzdDYiLCBhUG9pbnRlciwgImEgZG91YmxlIHBvaW50ZXIiLCBmbGFnKTsKLQotCWFTdHJ1Y3QgPSBFbXB0eVN0cnVjdFRvQUlGKCJ0ZXN0X3N0cnVjdCIpOwotCUFJRlRlc3QoInN1YnRlc3Q3IiwgYVN0cnVjdCwgImVtcHR5IHN0cnVjdCIsIGZsYWcpOwotCi0gICAgICAgIEFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdCwgImZpZWxkMSIsIGFGbG9hdCk7Ci0gICAgICAgIEFJRlRlc3QoInN1YnRlc3Q4IiwgYVN0cnVjdCwgIndpdGggb25lIGZpZWxkIiwgZmxhZyk7Ci0KLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0LCAiZmllbGQyIiwgSW50VG9BSUYoMTYpKTsKLSAgICAgICAgQUlGVGVzdCgic3VidGVzdDkiLCBhU3RydWN0LCAid2l0aCB0d28gZmllbGRzIiwgZmxhZyk7Ci0KLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0LCAiZmllbGQzIiwgYVN0cnVjdCk7Ci0JQUlGVGVzdCgic3VidGVzdDEwIiwgYVN0cnVjdCwgIndpdGggdGhyZWUgZmllbGRzIiwgZmxhZyk7Ci0KLSAgICAgICAgbWluID0gMDsgbWF4ID0gOTsKLSAgICAgICAgYW5BcnJheSA9IEFycmF5VG9BSUYoMSwgJm1pbiwgJm1heCwgImFiY2RlZmdoaWoiLCAxMCwgImMiKTsKLSAgICAgICAgQUlGVGVzdCgic3VidGVzdDExIiwgYW5BcnJheSwgImFycmF5IG9mIDEwIGNoYXJzIiwgZmxhZyk7Ci0KLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0LCAiZmllbGQ0IiwgYW5BcnJheSk7Ci0gICAgICAgIEFJRlRlc3QoInN1YnRlc3QxMiIsIGFTdHJ1Y3QsICJhZnRlciB0aGUgYXJyYXkgaXMgZmllbGQgNCIsIGZsYWcpOwotCi0gICAgICAgIC8qIHRlc3QgYSBsaW5rZWQgbGlzdDogMSAtPiAyIC0+IG5pbCAqLwotICAgICAgICBhU3RydWN0ID0gRW1wdHlTdHJ1Y3RUb0FJRigidGVzdF9zdHJ1Y3QiKTsKLSAgICAgICAgYVN0cnVjdCA9IE5hbWVBSUYoYVN0cnVjdCwgMCk7Ci0gICAgICAgIEFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdCwgInZhbHVlIiwgSW50VG9BSUYoMikpOwotICAgICAgICBBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QsICJuZXh0IiwgQUlGTnVsbChhU3RydWN0KSk7Ci0gICAgICAgIGFQb2ludGVyID0gUG9pbnRlclRvQUlGKE5VTEwsIGFTdHJ1Y3QpOwotICAgICAgICBhU3RydWN0ID0gRW1wdHlTdHJ1Y3RUb0FJRigidGVzdF9zdHJ1Y3QiKTsKLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0LCAidmFsdWUiLCBJbnRUb0FJRigxKSk7Ci0gICAgICAgIEFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdCwgIm5leHQiLCBhUG9pbnRlcik7Ci0gICAgICAgIGFQb2ludGVyID0gUG9pbnRlclRvQUlGKE5VTEwsIGFTdHJ1Y3QpOwotICAgICAgICBBSUZUZXN0KCJzdWJ0ZXN0MTMiLCBhUG9pbnRlciwgImxpbmtlZCBsaXN0IDEgLT4gMiAiLCBmbGFnKTsKLQotCS8qIHRlc3QgYW4gYXJyYXkgb2Ygc3RydWN0cy4gKi8KLQl7Ci0JCWNoYXIgZGF0YVtCVUZTSVpdLCAqZGVzdDsKLQkJaW50IG1pbj0xLCBtYXg9OSwgc3ViTWluID0gMSwgc3ViTWF4ID0gMjsKLQkJaW50IGluZGV4OwotCQlpbnQgc21hbGxBcnJheVsyXSA9IHsxLDJ9OwotCi0JCWFTdHJ1Y3QgPSBFbXB0eVN0cnVjdFRvQUlGKCJ0ZXN0X3N0cnVjdCIpOwotCQlBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QsICJhIiwgRmxvYXRUb0FJRigyLjEpKTsKLQkJZGVzdCA9IGRhdGE7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDI7IGluZGV4KyspIAotCQl7Ci0JCQlBSUZOb3JtYWxpc2UoZGVzdCwgc2l6ZW9mKGludCksIChjaGFyICopKHNtYWxsQXJyYXkraW5kZXgpLCBzaXplb2YoaW50KSk7Ci0JCQlkZXN0ICs9IHNpemVvZihpbnQpOwotCQl9Ci0JCWFuQXJyYXkgPSBBcnJheVRvQUlGKDEsICZzdWJNaW4sICZzdWJNYXgsIGRhdGEsIDIqc2l6ZW9mKGludCksCi0JCQlBSUZfRk9STUFUKEludFRvQUlGKDApKSk7Ci0JCUFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdCwgImIiLCBhbkFycmF5KTsKLQkJQUlGVGVzdCgic3VidGVzdDE0IiwgYVN0cnVjdCwgInVuZGVybHlpbmcgc3RydWN0OiB7YT0yLjEgYj1bMSAyXX0iLCBmbGFnKTsKLQotCi0JCWRlc3QgPSBkYXRhOwotCQlmb3IgKGluZGV4ID0gbWluOyBpbmRleCA8PSBtYXg7IGluZGV4KyspIAotCQl7Ci0JCQltZW1jcHkoZGVzdCwgQUlGX0RBVEEoYVN0cnVjdCksIEFJRl9MRU4oYVN0cnVjdCkpOwotCQkJZGVzdCArPSBBSUZfTEVOKGFTdHJ1Y3QpOwotCQl9Ci0JCWFuQXJyYXkgPSBBcnJheVRvQUlGKDEsICZtaW4sICZtYXgsIGRhdGEsIChtYXgtbWluKzEpKkFJRl9MRU4oYVN0cnVjdCksIEFJRl9GT1JNQVQoYVN0cnVjdCkpOwotCQlBSUZUZXN0KCJzdWJ0ZXN0MTUiLCBhbkFycmF5LCAiYXJyYXkgb2YgOSB1bmRlcmx5aW5nIHN0cnVjdHMiLCBmbGFnKTsKLQl9Ci0KLQotCWFuRW51bSA9IEVtcHR5RW51bVRvQUlGKCJ0ZXN0X2VudW0iKTsKLQlBSUZUZXN0KCJzdWJ0ZXN0MTYiLCBhbkVudW0sICJlbXB0eSBlbnVtIiwgZmxhZyk7Ci0KLQlBSUZBZGRDb25zdFRvRW51bShhbkVudW0sICJjb25zdDEiLCBJbnRUb0FJRigxMCkpOwotCUFJRkFkZENvbnN0VG9FbnVtKGFuRW51bSwgImNvbnN0MiIsIEludFRvQUlGKDIwKSk7Ci0JQUlGQWRkQ29uc3RUb0VudW0oYW5FbnVtLCAiY29uc3QzIiwgSW50VG9BSUYoMCkpOwotCUFJRlNldEVudW0oYW5FbnVtLCAiY29uc3QxIik7Ci0JQUlGVGVzdCgic3VidGVzdDE3IiwgYW5FbnVtLCAiZW51bTogMTAiLCBmbGFnKTsKLQotCWFTdHJ1Y3QgPSBFbXB0eVN0cnVjdFRvQUlGKCJ0ZXN0X2VudW0iKTsKLQlBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QsICJmaWVsZDEiLCBhbkVudW0pOwotCUFJRlRlc3QoInN1YnRlc3QxOCIsIGFTdHJ1Y3QsICJhbiBlbnVtIGluIGEgc3RydWN0IiwgZmxhZyk7Ci0KLQlBSUZTZXRFbnVtKGFuRW51bSwgImNvbnN0MyIpOwotCWFTdHJ1Y3QgPSBFbXB0eVN0cnVjdFRvQUlGKCJ0ZXN0X2VudW0iKTsKLQlBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QsICJmaWVsZDEiLCBhbkVudW0pOwotCUFJRlRlc3QoInN1YnRlc3QxOSIsIGFTdHJ1Y3QsICJzYW1lIHN0cnVjdCBidXQgdGhlIGVudW0gaXMgc2V0IHRvIGFub3RoZXIgdmFsdWUiLCBmbGFnKTsKLQotCUFJRlNldEVudW0oYW5FbnVtLCAiY29uc3QyIik7Ci0JYVBvaW50ZXIgPSBQb2ludGVyVG9BSUYoTlVMTCwgYW5FbnVtKTsKLQlhUG9pbnRlciA9IFBvaW50ZXJUb0FJRihOVUxMLCBhUG9pbnRlcik7Ci0JQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0LCAiZmllbGQyIiwgYVBvaW50ZXIpOwotCUFJRlRlc3QoInN1YnRlc3QyMCIsIGFTdHJ1Y3QsICJmaWVsZDIgaXMgYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byBhbiBlbnVtIiwgZmxhZyk7Ci0KLQotCS8qIHRlc3QgYW4gYXJyYXkgb2YgZW51bXMuICovCi0JewotCQljaGFyIGRhdGFbQlVGU0laXSwgKmRlc3Q7Ci0JCWludCBtaW49MSwgbWF4PTE1LCBpbmRleCwgdmFsOwotICAgICAgICAgICAgICAgIGRlc3QgPSBkYXRhOwotICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBtaW47IGluZGV4IDw9IG1heDsgaW5kZXgrKykKLSAgICAgICAgICAgICAgICB7Ci0JCQl2YWwgPSByYW5kKCkgJSAzOwotCQkJc3dpdGNoICh2YWwpCi0JCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlBSUZTZXRFbnVtKGFuRW51bSwgImNvbnN0MSIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCUFJRlNldEVudW0oYW5FbnVtLCAiY29uc3QyIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJQUlGU2V0RW51bShhbkVudW0sICJjb25zdDMiKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdCwgQUlGX0RBVEEoYW5FbnVtKSwgQUlGX0xFTihhbkVudW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgKz0gQUlGX0xFTihhbkVudW0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFuQXJyYXkgPSBBcnJheVRvQUlGKDEsICZtaW4sICZtYXgsIGRhdGEsIChtYXgtbWluKzEpKkFJRl9MRU4oYW5FbnVtKSwgQUlGX0ZPUk1BVChhbkVudW0pKTsKLSAgICAgICAgICAgICAgICBBSUZUZXN0KCJzdWJ0ZXN0MjEiLCBhbkFycmF5LCAiYXJyYXkgb2YgMTUgdW5kZXJseWluZyBlbnVtcyAocmFuZG9tKSIsIGZsYWcpOwotICAgICAgICB9Ci0KLQotCWFVbmlvbiA9IEVtcHR5VW5pb25Ub0FJRigidGVzdF91bmlvbiIpOwotCUFJRlRlc3QoInN1YnRlc3QyMiIsIGFVbmlvbiwgImVtcHR5IHVuaW9uIiwgZmxhZyk7Ci0KLQlBSUZBZGRGaWVsZFRvVW5pb24oYVVuaW9uLCAiY29uc3QxIiwgImlzNCIpOwotCUFJRkFkZEZpZWxkVG9VbmlvbihhVW5pb24sICJjb25zdDIiLCAiaXM0Iik7Ci0JQUlGU2V0VW5pb24oYVVuaW9uLCAiY29uc3QxIiwgSW50VG9BSUYoMTApKTsKLQlBSUZUZXN0KCJzdWJ0ZXN0MjMiLCBhVW5pb24sICJ1bmlvbjogMTAiLCBmbGFnKTsKLQotCWFTdHJ1Y3QgPSBFbXB0eVN0cnVjdFRvQUlGKCJ0ZXN0X3N0cnVjdCIpOwotICAgICAgICBBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QsICJmaWVsZDEiLCBJbnRUb0FJRigxKSk7Ci0gICAgICAgIEFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdCwgImZpZWxkMiIsIFN0cmluZ1RvQUlGKCJIZWxsbyBXb3JsZCIpKTsKLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0LCAiZmllbGQzIiwgSW50VG9BSUYoMikpOwotCUFJRlRlc3QoInN1YnRlc3QyNCIsIGFTdHJ1Y3QsICJhIHN0cnVjdDogMSwgSGVsbG8gV29ybGQsIDIiLCBmbGFnKTsKLQotCS8qIFRlc3RpbmcgZm9yIGEgbG9uZyBzdHJpbmcgKi8KLQlhU3RyaW5nID0gU3RyaW5nVG9BSUYoIkFJRjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlBSUYiKTsKLQlBSUZUZXN0KCJzdWJ0ZXN0MjUiLCBhU3RyaW5nLCAic3RyaW5nOiBBSUYxMDBkaWdpdHNBSUYiLCBmbGFnKTsKLQotCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKLX0KLQotCi0KLQotdm9pZAotX3Rlc3RBc2NpaShjaGFyICp0c3QsIGNoYXIgKmZkcywgY2hhciAqZGF0YSwgY2hhciAqbXNnLCBUZXN0RmxhZ3MgZmxhZykKLXsKLSAgICAgICAgQUlGICp0b1Rlc3Q7Ci0gICAgICAgIHRvVGVzdCA9IEFzY2lpVG9BSUYoZmRzLCBkYXRhKTsKLQlBSUZUZXN0KHRzdCwgdG9UZXN0LCBtc2csIGZsYWcpOwotCUFJRkZyZWUodG9UZXN0KTsKLX0KLQotdm9pZCAKLVRlc3RBbGxBc2NpaSgpCi17Ci0JVGVzdEZsYWdzIGZsYWcgPSBhbGw7Ci0KLQotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKiogVEVTVCBTRVJJRVMgMjogYXNjaWkgaW5wdXQgKioqIFxuIik7Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcblxuIik7Ci0KLQotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDEiLCAiaXM0IiwgIjAwMDAwMDA0IiwgIjQiLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3QyIiwgImY0IiwgIjNmOGNjY2NkIiwgIjEuMSIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDMiLCAiZjgiLCAiNDAwNWJmMGE4YjE0NTc2OSIsICIyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MiAoZjgpIiwgZmxhZyk7Ci0KLQlfdGVzdEFzY2lpKCJzdWJ0ZXN0NCIsICJmMTYiLCAiNDAwMDViZjBhOGIxNDU3Njk1MzU1ZmI4YWM0MDRlN2EiLCAiMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjI0OTcgKGYxNikiLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3Q1IiwgInt8YT1pczQsYj1pczQ7Ozt9IiwgIjAwMDAwMDAyMDAwMDAwMDMiLCAie2E9MiwgYj0zfSIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDYiLCAiW3IwLi4xaXM0XWlzNCIsICIwMDAwMDAwMjAwMDAwMDAzIiwgIlsyLCAzXSIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDciLCAiJTAve3x2YWw9aXM0LG5leHQ9Xj4wLyxtc2c9XmM7Ozt9IiwgIjAwMDAwMDAzMDAwMTYzIiwgInt2YWw9MywgbmV4dD1uaWwsIG1zZz1eY30iLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3Q4IiwgIiUwL3t8dmFsPWlzNCxuZXh0PV4+MC8sbXNnPV5jOzs7fSIsICIwMDAwMDAwMTAxMDAwMDAwMDIwMjAwMDAwMDAwMDAwMDAwMDMwMzAwMDAwMDAwMDE2MzAxNjIwMTYxIiwgImEtPmItPmMtPnNlbGYiLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3Q5IiwgIltyMC4uMWlzNF0lMC97fHZhbD1pczQsbmV4dD1ePjAvLG1zZz1eYzs7O30iLCAiMDAwMDAwMDEwMTAwMDAwMDAyMDIwMDAwMDAwMDAwMDAwMDAzMDMwMDAwMDAwMDAxNjMwMTYyMDE2MTAwMDAwMDAyMDMwMDAwMDAwMDAxNjIiLCAiYXJyYXkgb2YgdHdvIGxpc3RzIG9mIHBvaW50ZXJzIiwgZmxhZyk7Ci0KLQlfdGVzdEFzY2lpKCJzdWJ0ZXN0MTAiLCAiJTAve3x2YWw9aXM0LG5leHQ9Xj4wLyxtc2c9XmM7Ozt9IiwgIjAwMDAwMDAzMDIwMDAwMDAwMDAwMDAwMDAzMDMwMDAwMDAwMDAxNjMwMTYzIiwgInt2YWw9MywgbmV4dD1zZWxmLCBtc2c9XmN9IiwgZmxhZyk7Ci0KLQlfdGVzdEFzY2lpKCJzdWJ0ZXN0MTEiLCAicyIsICIwMDBiNjEzYTIwNjg2ZjIwNjg2ZjIwNjg2ZiIsICJhOiBobyBobyBobyIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDEyIiwgIltyMC4uMWlzNF0lMC97fHZhbD1pczQsbmV4dD1ePjAvLG1zZz1zOzs7fSIsICIwMDAwMDAwMTAxMDAwMDAwMDIwMjAwMDAwMDAwMDAwMDAwMDMwMzAwMDAwMDAwMDAwYjYzM2EyMDY4NmYyMDY4NmYyMDY4NmYwMDBiNjIzYTIwNjg2ZjIwNjg2ZjIwNjg2ZjAwMGI2MTNhMjA2ODZmMjA2ODZmMjA2ODZmMDAwMDAwMDIwMzAwMDAwMDAwMDAwYjYyM2EyMDY4NmYyMDY4NmYyMDY4NmYiLCAiZFssXSIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDEzIiwgIltyMC4uOTlpczRdXiUwL3t8bmFtZT1zLGRhdGE9aXM0LG5leHQ9Xj4wL30iLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiZW1wdHkgaGFzaCB0YWJsZSIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDE0IiwgIltyMC4uOTlpczRdXiUwL3t8bmFtZT1zLGRhdGE9aXM0LG5leHQ9Xj4wLzs7O30iLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwNTc0Njg2NTcyNjUwMDAwMDAwMTAwMDAwMDAwMDAwMTAwMDU3NDY4NjU3MjY1MDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDI2ODY5MDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiaGFzaCB0YWJsZSBjb250YWluaW5nIGhpLCB0aGVyZSwgdGhlcmUiLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3QxNSIsICJbcjAuLjFpczRdJTAve3x2YWw9aXM0LG5leHQ9Xj4wLyxtc2c9czs7O30iLCAiMDAxMTExMTEwMTAwMDAwMDAyMDIwMDAwMDExMTAwMDAwMDAzMDMwMDAwMDExMTAwMGI2MzNhMjA2ODZmMjA2ODZmMjA2ODZmMDAwYjYyM2EyMDY4NmYyMDY4NmYyMDYxNmYwMDBiNjEzYTIwNjg2ZjIwNjg2ZjIwNjg2ZjAwMDAwMDAyMDMwMDAwMDExMTAwMGI2MjNhMjA2ODZmMjA2ODZmMjA2ODZmIiwgImRbLF0iLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3QxNiIsICIlMC97fHZhbD1pczQsbmV4dD1ePjAvLG1zZz1eYzs7O30iLCAiMDAwMDAwMDEwMTAwMDAwMDAyMDIwMDAwMDEzMzAwMDAwMDAzMDMwMDAwMDEzMzAxNjMwMTYyMDE2MSIsICJhLT5iLT5jLT5zZWxmIiwgZmxhZyk7Ci0KLQlfdGVzdEFzY2lpKCJzdWJ0ZXN0MTciLCAiW3IwLi4xaXM0XSUwL3t8dmFsPWlzNCxuZXh0PV4+MC8sbXNnPV5jOzs7fSIsICIwMDAwMDAwMTAxMDAwMDAwMDIwMjAwMDAwMTMzMDAwMDAwMDMwMzAwMDAwMTMzMDE2MzAxNjIwMTYxMDAwMDAwMDIwMzAwMDAwMTMzMDE2MiIsICJhcnJheSBvZiB0d28gbGlzdHMgb2YgcG9pbnRlcnMiLCBmbGFnKTsKLQotCV90ZXN0QXNjaWkoInN1YnRlc3QxOCIsICJbcjAuLjJpczRdW3IwLi4xaXM0XWlzNCIsICIwMDAwMDAwNjAwMDAwMDA3MDAwMDAwMDIwMDAwMDAwMzAwMDAwMDA0MDAwMDAwMDUiLCAiYXJyYXkgb2YgdHdvIGxpc3RzIG9mIHBvaW50ZXJzIiwgZmxhZyk7Ci0KLQlfdGVzdEFzY2lpKCJzdWJ0ZXN0MTkiLCAidjQiLCAiMDAwMDAwMDYiLCAidm9pZCIsIGZsYWcpOwotCi0JX3Rlc3RBc2NpaSgic3VidGVzdDIwIiwgIiZpczQsXl5jL2lzNCIsICI2RDYxNjk2RTAwIiwgImZ1bmN0aW9uIHdpdGggYXJncyAoaW50LCBjaGFyICoqKSByZXR1cm5pbmcgaW50IiwgZmxhZyk7Ci0KLQlmcHJpbnRmKHN0ZG91dCwgIlxuIik7Ci0KLX0KLQotCi0KLQotdm9pZAotX3Rlc3RBcml0aG1ldGljKGNoYXIgKm1zZzEsIEFJRiAqYSwgY2hhciAqbXNnMiwgVGVzdEZsYWdzIGZsYWcsIEFJRiAqYikKLXsKLQlmbGFnLkFJRkFkZCA9IGI7Ci0JZmxhZy5BSUZTdWIgPSBmbGFnLkFJRk11bCA9IGZsYWcuQUlGRGl2ID0gZmxhZy5BSUZSZW0gPSBmbGFnLkFJRkFkZDsKLQlmbGFnLkFJRkFuZCA9IGZsYWcuQUlGT3IgPSBmbGFnLkFJRkFkZDsKLQlBSUZUZXN0SW50KG1zZzEsIGEsIG1zZzIsIGZsYWcpOwotfQotCi12b2lkIAotVGVzdEFsbEFyaXRobWV0aWMoKQotewotCUFJRiAqYW5FbnVtMSwgKmFuRW51bTIsICphU3RydWN0MSwgKmFTdHJ1Y3QyOwotCVRlc3RGbGFncyBmbGFnID0gbm9uZTsKLQotCWZsYWcuQUlGTmVnID0gMTsKLQlmbGFnLkFJRk5vdCA9IDE7Ci0KLQotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKiBURVNUIFNFUklFUyAzOiBhcml0aG1ldGljICoqKiBcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcblxuIik7Ci0KLQotCi0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0MSIsIEludFRvQUlGKDE2KSwgIjE2IGFuZCAxNyIsIGZsYWcsIEludFRvQUlGKDE3KSk7Ci0KLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QyIiwgSW50VG9BSUYoMTgpLCAiMTggYW5kIDE3IiwgZmxhZywgSW50VG9BSUYoMTcpKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDMiLCBJbnRUb0FJRigwKSwgIjAgYW5kIC0xIiwgZmxhZywgSW50VG9BSUYoLTEpKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDQiLCBJbnRUb0FJRigtMSksICItMSBhbmQgLTEiLCBmbGFnLCBJbnRUb0FJRigtMSkpOwotCi0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0NSIsIEludFRvQUlGKDEwNzM3NDE4MjRMKSwgIjEwNzM3NDE4MjRMIGFuZCAxMDczNzQxODI1TCIsIGZsYWcsIEludFRvQUlGKDEwNzM3NDE4MjVMKSk7Ci0KLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3Q2IiwgTG9uZ2VzdFRvQUlGKDEwNzM3NDE4MjRMKSwgIjEwNzM3NDE4MjRMIGFuZCAxMDczNzQxODI1TCIsIGZsYWcsIExvbmdlc3RUb0FJRigxMDczNzQxODI1TCkpOwotCi0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0NyIsIExvbmdlc3RUb0FJRig3TCksICI3TCBhbmQgMyIsIGZsYWcsIEludFRvQUlGKDMpKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDgiLCBGbG9hdFRvQUlGKDMuMCksICIzLjAgYW5kIDEuNSIsIGZsYWcsIEZsb2F0VG9BSUYoMS41KSk7Ci0KLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3Q5IiwgRmxvYXRUb0FJRig3LjApLCAiNy4wIGFuZCAzIiwgZmxhZywgSW50VG9BSUYoMykpOwotCi0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0MTAiLCBJbnRUb0FJRigzKSwgIjMgYW5kIDcuMCIsIGZsYWcsIEZsb2F0VG9BSUYoNy4wKSk7Ci0KLQotICAgICAgICBhbkVudW0xID0gRW1wdHlFbnVtVG9BSUYoInRlc3RfZW51bTEiKTsKLSAgICAgICAgYW5FbnVtMiA9IEVtcHR5RW51bVRvQUlGKCJ0ZXN0X2VudW0yIik7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGFuRW51bTEsICJjb25zdDEiLCBJbnRUb0FJRigxNikpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShhbkVudW0xLCAiY29uc3QyIiwgSW50VG9BSUYoMTgpKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0oYW5FbnVtMiwgImNvbnN0MSIsIEludFRvQUlGKDE3KSk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGFuRW51bTIsICJjb25zdDIiLCBJbnRUb0FJRigxNykpOwotICAgICAgICBBSUZTZXRFbnVtKGFuRW51bTEsICJjb25zdDEiKTsKLSAgICAgICAgQUlGU2V0RW51bShhbkVudW0yLCAiY29uc3QxIik7Ci0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0MTEiLCBhbkVudW0xLCAiYW5FbnVtMSBhbmQgYW5FbnVtMiIsIGZsYWcsIGFuRW51bTIpOwotCi0gICAgICAgIGFTdHJ1Y3QxID0gRW1wdHlTdHJ1Y3RUb0FJRigidGVzdF9zdHJ1Y3QxIik7Ci0gICAgICAgIGFTdHJ1Y3QyID0gRW1wdHlTdHJ1Y3RUb0FJRigidGVzdF9zdHJ1Y3QyIik7Ci0gICAgICAgIEFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdDEsICJmaWVsZDEiLCBJbnRUb0FJRigxNikpOwotICAgICAgICBBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QxLCAiZmllbGQyIiwgSW50VG9BSUYoMTgpKTsKLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0MiwgImZpZWxkMSIsIEludFRvQUlGKDE3KSk7Ci0gICAgICAgIEFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdDIsICJmaWVsZDIiLCBJbnRUb0FJRigxNykpOwotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDEyIiwgYVN0cnVjdDEsICJhU3RydWN0MSBhbmQgYVN0cnVjdDIiLCBmbGFnLCBhU3RydWN0Mik7Ci0KLQlhU3RydWN0MSA9IEVtcHR5U3RydWN0VG9BSUYoInRlc3Rfc3RydWN0MSIpOwotICAgICAgICBhU3RydWN0MiA9IEVtcHR5U3RydWN0VG9BSUYoInRlc3Rfc3RydWN0MiIpOwotICAgICAgICBBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QxLCAiZmllbGQxIiwgSW50VG9BSUYoMTgpKTsKLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0MSwgImZpZWxkMiIsIGFuRW51bTEpOwotICAgICAgICBBSUZBZGRGaWVsZFRvU3RydWN0KGFTdHJ1Y3QyLCAiZmllbGQxIiwgSW50VG9BSUYoMTcpKTsKLSAgICAgICAgQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0MiwgImZpZWxkMiIsIGFuRW51bTIpOwotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDEzIiwgYVN0cnVjdDEsICJhU3RydWN0MSBhbmQgYVN0cnVjdDIiLCBmbGFnLCBhU3RydWN0Mik7Ci0KLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QxNCIsIGFuRW51bTEsICJhbkVudW0xIGFuZCAxNyIsIGZsYWcsIEludFRvQUlGKDE3KSk7Ci0KLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QxNSIsIGFuRW51bTEsICJhbkVudW0xIGFuZCAxNyIsIGZsYWcsIEZsb2F0VG9BSUYoMTcpKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDE2IiwgSW50VG9BSUYoMTcpLCAiMTcgYW5kIGFuRW51bTEiLCBmbGFnLCBhbkVudW0xKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDE3IiwgRmxvYXRUb0FJRigxNyksICIxNyBhbmQgYW5FbnVtMSIsIGZsYWcsIGFuRW51bTEpOwotCi0KLQl7Ci0JCWNoYXIgZGF0YVtCVUZTSVpdLCAqZGVzdDsKLQkJaW50IG1pbj0xLCBtYXg9MjsKLQkJQUlGICphbkFycmF5MSwgKmFuQXJyYXkyOwotCQlBSUYgKmFuSW50MSA9IEludFRvQUlGKDEwKTsKLQkJQUlGICphbkludDIgPSBJbnRUb0FJRigyMCk7Ci0KLSAgICAgICAgICAgICAgICBkZXN0ID0gZGF0YTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdCwgQUlGX0RBVEEoYW5JbnQxKSwgQUlGX0xFTihhbkludDEpKTsKLSAgICAgICAgICAgICAgICBkZXN0ICs9IEFJRl9MRU4oYW5JbnQxKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdCwgQUlGX0RBVEEoYW5JbnQxKSwgQUlGX0xFTihhbkludDEpKTsKLSAgICAgICAgICAgICAgICBkZXN0ICs9IEFJRl9MRU4oYW5JbnQxKTsKLSAgICAgICAgICAgICAgICBhbkFycmF5MSA9IEFycmF5VG9BSUYoMSwgJm1pbiwgJm1heCwgZGF0YSwgKG1heC1taW4rMSkqQUlGX0xFTihhbkludDEpLCBBSUZfRk9STUFUKGFuSW50MSkpOwotCi0gICAgICAgICAgICAgICAgZGVzdCA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIEFJRl9EQVRBKGFuSW50MiksIEFJRl9MRU4oYW5JbnQyKSk7Ci0gICAgICAgICAgICAgICAgZGVzdCArPSBBSUZfTEVOKGFuSW50Mik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIEFJRl9EQVRBKGFuSW50MiksIEFJRl9MRU4oYW5JbnQyKSk7Ci0gICAgICAgICAgICAgICAgZGVzdCArPSBBSUZfTEVOKGFuSW50Mik7Ci0gICAgICAgICAgICAgICAgYW5BcnJheTIgPSBBcnJheVRvQUlGKDEsICZtaW4sICZtYXgsIGRhdGEsIChtYXgtbWluKzEpKkFJRl9MRU4oYW5JbnQyKSwgQUlGX0ZPUk1BVChhbkludDIpKTsKLQotCQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QxOCIsIGFuQXJyYXkxLCAiYW5BcnJheTEgYW5kIGFuQXJyYXkyIiwgZmxhZywgYW5BcnJheTIpOwotICAgICAgICB9Ci0KLQl7Ci0JCWNoYXIgZGF0YVtCVUZTSVpdLCAqZGVzdDsKLQkJaW50IG1pbj0xLCBtYXg9MjsKLQkJQUlGICphbkFycmF5MSwgKmFuQXJyYXkyOwotCi0gICAgICAgICAgICAgICAgZGVzdCA9IGRhdGE7Ci0JCUFJRlNldEVudW0oYW5FbnVtMSwgImNvbnN0MSIpOwotICAgICAgICAgICAgICAgIG1lbWNweShkZXN0LCBBSUZfREFUQShhbkVudW0xKSwgQUlGX0xFTihhbkVudW0xKSk7Ci0gICAgICAgICAgICAgICAgZGVzdCArPSBBSUZfTEVOKGFuRW51bTEpOwotCQlBSUZTZXRFbnVtKGFuRW51bTEsICJjb25zdDIiKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdCwgQUlGX0RBVEEoYW5FbnVtMSksIEFJRl9MRU4oYW5FbnVtMSkpOwotICAgICAgICAgICAgICAgIGRlc3QgKz0gQUlGX0xFTihhbkVudW0xKTsKLSAgICAgICAgICAgICAgICBhbkFycmF5MSA9IEFycmF5VG9BSUYoMSwgJm1pbiwgJm1heCwgZGF0YSwgKG1heC1taW4rMSkqQUlGX0xFTihhbkVudW0xKSwgQUlGX0ZPUk1BVChhbkVudW0xKSk7Ci0KLSAgICAgICAgICAgICAgICBkZXN0ID0gZGF0YTsKLQkJQUlGU2V0RW51bShhbkVudW0yLCAiY29uc3QxIik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIEFJRl9EQVRBKGFuRW51bTIpLCBBSUZfTEVOKGFuRW51bTIpKTsKLSAgICAgICAgICAgICAgICBkZXN0ICs9IEFJRl9MRU4oYW5FbnVtMik7Ci0JCUFJRlNldEVudW0oYW5FbnVtMiwgImNvbnN0MiIpOwotICAgICAgICAgICAgICAgIG1lbWNweShkZXN0LCBBSUZfREFUQShhbkVudW0yKSwgQUlGX0xFTihhbkVudW0yKSk7Ci0gICAgICAgICAgICAgICAgZGVzdCArPSBBSUZfTEVOKGFuRW51bTIpOwotICAgICAgICAgICAgICAgIGFuQXJyYXkyID0gQXJyYXlUb0FJRigxLCAmbWluLCAmbWF4LCBkYXRhLCAobWF4LW1pbisxKSpBSUZfTEVOKGFuRW51bTIpLCBBSUZfRk9STUFUKGFuRW51bTIpKTsKLQotCQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QxOSIsIGFuQXJyYXkxLCAiYW5BcnJheTEgYW5kIGFuQXJyYXkyIiwgZmxhZywgYW5BcnJheTIpOwotICAgICAgICB9Ci0KLQl7Ci0JCWNoYXIgZGF0YVtCVUZTSVpdLCAqZGVzdDsKLQkJaW50IG1pbj0xLCBtYXg9MjsKLQkJQUlGICphbkFycmF5MSwgKmFuQXJyYXkyOwotCQlBSUYgKmFuSW50ID0gSW50VG9BSUYoMyk7Ci0JCUFJRiAqYUZsb2F0ID0gRmxvYXRUb0FJRig3KTsKLQotICAgICAgICAgICAgICAgIGRlc3QgPSBkYXRhOwotICAgICAgICAgICAgICAgIG1lbWNweShkZXN0LCBBSUZfREFUQShhbkludCksIEFJRl9MRU4oYW5JbnQpKTsKLSAgICAgICAgICAgICAgICBkZXN0ICs9IEFJRl9MRU4oYW5JbnQpOwotICAgICAgICAgICAgICAgIG1lbWNweShkZXN0LCBBSUZfREFUQShhbkludCksIEFJRl9MRU4oYW5JbnQpKTsKLSAgICAgICAgICAgICAgICBkZXN0ICs9IEFJRl9MRU4oYW5JbnQpOwotICAgICAgICAgICAgICAgIGFuQXJyYXkxID0gQXJyYXlUb0FJRigxLCAmbWluLCAmbWF4LCBkYXRhLCAobWF4LW1pbisxKSpBSUZfTEVOKGFuSW50KSwgQUlGX0ZPUk1BVChhbkludCkpOwotCi0gICAgICAgICAgICAgICAgZGVzdCA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIEFJRl9EQVRBKGFGbG9hdCksIEFJRl9MRU4oYUZsb2F0KSk7Ci0gICAgICAgICAgICAgICAgZGVzdCArPSBBSUZfTEVOKGFGbG9hdCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIEFJRl9EQVRBKGFGbG9hdCksIEFJRl9MRU4oYUZsb2F0KSk7Ci0gICAgICAgICAgICAgICAgZGVzdCArPSBBSUZfTEVOKGFGbG9hdCk7Ci0gICAgICAgICAgICAgICAgYW5BcnJheTIgPSBBcnJheVRvQUlGKDEsICZtaW4sICZtYXgsIGRhdGEsIChtYXgtbWluKzEpKkFJRl9MRU4oYUZsb2F0KSwgQUlGX0ZPUk1BVChhRmxvYXQpKTsKLQotCQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QyMCIsIGFuQXJyYXkxLCAiYW5BcnJheTEgYW5kIGFuQXJyYXkyIiwgZmxhZywgYW5BcnJheTIpOwotICAgICAgICB9Ci0KLQlhU3RydWN0MSA9IEVtcHR5U3RydWN0VG9BSUYoInRlc3Rfc3RydWN0MSIpOwotCWFTdHJ1Y3QyID0gRW1wdHlTdHJ1Y3RUb0FJRigidGVzdF9zdHJ1Y3QyIik7Ci0JQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0MSwgImZpZWxkMSIsIEludFRvQUlGKDEwKSk7Ci0JQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0MSwgImZpZWxkMiIsIEludFRvQUlGKDEwKSk7Ci0JQUlGQWRkRmllbGRUb1N0cnVjdChhU3RydWN0MiwgImZpZWxkMSIsIEZsb2F0VG9BSUYoNykpOwotCUFJRkFkZEZpZWxkVG9TdHJ1Y3QoYVN0cnVjdDIsICJmaWVsZDIiLCBGbG9hdFRvQUlGKDcpKTsKLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QyMSIsIGFTdHJ1Y3QxLCAiYVN0cnVjdDEgYW5kIGFTdHJ1Y3QyIiwgZmxhZywgYVN0cnVjdDIpOwotCi0KLQlfdGVzdEFyaXRobWV0aWMoInN1YnRlc3QyMiIsIFVuc2lnbmVkSW50VG9BSUYoMTYpLCAidW5zaWduZWQgMTYgYW5kIHVuc2lnbmVkIDE3IiwgZmxhZywgVW5zaWduZWRJbnRUb0FJRigxNykpOwotCi0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0MjMiLCBVbnNpZ25lZEludFRvQUlGKDE4KSwgInVuc2lnbmVkIDE4IGFuZCB1bnNpZ25lZCAxNyIsIGZsYWcsIFVuc2lnbmVkSW50VG9BSUYoMTcpKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDI0IiwgVW5zaWduZWRJbnRUb0FJRigwKSwgInVuc2lnbmVkIDAgYW5kIHVuc2lnbmVkIC0xIiwgZmxhZywgVW5zaWduZWRJbnRUb0FJRigtMSkpOwotCi0JX3Rlc3RBcml0aG1ldGljKCJzdWJ0ZXN0MjUiLCBVbnNpZ25lZEludFRvQUlGKC0xKSwgInVuc2lnbmVkIC0xIGFuZCB1bnNpZ25lZCAtMSIsIGZsYWcsIFVuc2lnbmVkSW50VG9BSUYoLTEpKTsKLQotCV90ZXN0QXJpdGhtZXRpYygic3VidGVzdDI2IiwgVW5zaWduZWRJbnRUb0FJRigxMDczNzQxODI0TCksICJ1bnNpZ25lZCAxMDczNzQxODI0TCBhbmQgdW5zaWduZWQgMTA3Mzc0MTgyNUwiLCBmbGFnLCBVbnNpZ25lZEludFRvQUlGKDEwNzM3NDE4MjVMKSk7Ci0KLQlmcHJpbnRmKHN0ZG91dCwgIlxuIik7Ci0KLX0KLQotCi0KLQotdm9pZAotX3Rlc3RDaXJjdWxhckRhdGEoY2hhciAqIG1zZywgQUlGICphLCBBSUYgKmIsIFRlc3RGbGFncyBmbGFnKQotewotCVRlc3RGbGFncyBmID0gZmxhZzsKLQljaGFyIHR4dFtCVUZTSVpdOwotCi0JQUlGVGVzdChtc2csIGEsICIoYSkgd2l0aCBkZXB0aCA9IDAiLCBmKTsKLQlBSUZUZXN0KG1zZywgYiwgIihiKSB3aXRoIGRlcHRoID0gMCIsIGYpOwotCi0JZm9yIChmLkRfQUlGUHJpbnQgPSAtMjsgZi5EX0FJRlByaW50IDw9IGZsYWcuRF9BSUZQcmludDsgZi5EX0FJRlByaW50KyspCi0JewotCQlpZiAoZi5EX0FJRlByaW50ID09IDApIGNvbnRpbnVlOwotCi0JCXNwcmludGYodHh0LCAiKGEpIHdpdGggZGVwdGggPSAlZCIsIGYuRF9BSUZQcmludCk7Ci0JCUFJRlRlc3QoIj4+Pj4+Pj4+IiwgYSwgdHh0LCBmKTsKLQotCQlzcHJpbnRmKHR4dCwgIihiKSB3aXRoIGRlcHRoID0gJWQiLCBmLkRfQUlGUHJpbnQpOwotCQlBSUZUZXN0KCI+Pj4+Pj4+PiIsIGIsIHR4dCwgZik7Ci0JfQotCi0JX3Rlc3RBcml0aG1ldGljKCJcblxuYXJpdGhtZXRpYyIsIGEsICIoYSkgYW5kIChiKSIsIGZsYWcsIGIpOwotCi0JZiA9IG5vbmU7Ci0JZi5BSUZEaWZmID0gYjsKLQlBSUZUZXN0KCJcblxuQUlGRGlmZiIsIGEsICJBSUZEaWZmKGEsIGIpIiwgZik7Ci0KLQlwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKLX0KLQotdm9pZCAKLVRlc3RBbGxDaXJjdWxhckRhdGEoKQotewotCUFJRiAqYSwgKmI7Ci0KLQlUZXN0RmxhZ3MgZmxhZyA9IG5vbmU7Ci0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKiogVEVTVCBTRVJJRVMgNDogY2lyY3VsYXIgZGF0YSAqKiogXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXG5cbiIpOwotCi0JYSA9IEFzY2lpVG9BSUYoKGNoYXIgKilzdHJkdXAoIl4lMC97fGE9aXM0LGI9Xj4wLyxjPWlzNDs7O30iKSwgKGNoYXIgKilzdHJkdXAoIjAyMDAwMDAwMDAwMDAwMDAwYTAzMDAwMDAwMDAwMDAwMDAwYSIpKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoKGNoYXIgKilzdHJkdXAoIl4lMC97fGE9aXM0LGI9Xj4wLyxjPWlzNDs7O30iKSwgKGNoYXIgKilzdHJkdXAoIjAyMDAwMDAwMDAwMDAwMDAwYjAzMDAwMDAwMDAwMDAwMDAwYyIpKTsKLQlmbGFnLkRfQUlGUHJpbnQgPSAzOwotICAgICAgICBfdGVzdENpcmN1bGFyRGF0YSgic3VidGVzdDEiLCBhLCBiLCBmbGFnKTsKLQotCi0gICAgICAgIGEgPSBBc2NpaVRvQUlGKChjaGFyICopc3RyZHVwKCJeJTAve3xhPWlzNCxiPV4+MC8sYz1pczQ7Ozt9IiksIChjaGFyICopc3RyZHVwKCIwMjAwMDAwMDAwMDAwMDAwMGEwMTAwMDAwMDE0MDMwMDAwMDAwMDAwMDAwMDE1MDAwMDAwMGIiKSk7Ci0gICAgICAgIGIgPSBBc2NpaVRvQUlGKChjaGFyICopc3RyZHVwKCJeJTAve3xhPWlzNCxiPV4+MC8sYz1pczQ7Ozt9IiksIChjaGFyICopc3RyZHVwKCIwMjAwMDAwMDAwMDAwMDAwMGIwMTAwMDAwMDE2MDMwMDAwMDAwMDAwMDAwMDE4MDAwMDAwMGYiKSk7Ci0JZmxhZy5EX0FJRlByaW50ID0gNDsKLSAgICAgICAgX3Rlc3RDaXJjdWxhckRhdGEoInN1YnRlc3QyIiwgYSwgYiwgZmxhZyk7Ci0KLQotICAgICAgICBhID0gQXNjaWlUb0FJRigoY2hhciAqKXN0cmR1cCgiXiUwL3t8YT1pczQsYj1ePjAvLGM9XiUxL3t8YT1pczQsYj1ePjAvLGM9Xj4xLyxkPWlzNDs7O30sZD1pczQ7Ozt9IiksIChjaGFyICopc3RyZHVwKCIwMjAwMDAwMDAwMDAwMDAwMGEwMTAwMDAwMDE0MDAwMTAwMDAwMDFlMDMwMDAwMDAwMDAwMDAwMDAwMWUwMDAwMDAxNDAwMDAwMDAwMGEiKSk7Ci0gICAgICAgIGIgPSBBc2NpaVRvQUlGKChjaGFyICopc3RyZHVwKCJeJTAve3xhPWlzNCxiPV4+MC8sYz1eJTEve3xhPWlzNCxiPV4+MC8sYz1ePjEvLGQ9aXM0Ozs7fSxkPWlzNDs7O30iKSwgKGNoYXIgKilzdHJkdXAoIjAyMDAwMDAwMDAwMDAwMDAwYjAxMDAwMDAwMTcwMDAxMDAwMDAwMjMwMzAwMDAwMDAwMDAwMDAwMDAyNDAwMDAwMDE4MDAwMDAwMDAwYyIpKTsKLQlmbGFnLkRfQUlGUHJpbnQgPSA1OwotICAgICAgICBfdGVzdENpcmN1bGFyRGF0YSgic3VidGVzdDMiLCBhLCBiLCBmbGFnKTsKLQotCi0gICAgICAgIGEgPSBBc2NpaVRvQUlGKChjaGFyICopc3RyZHVwKCJeJTAve3xhPWlzNCxiPV4+MC8sYz1eJTEve3xhPWlzNCxiPV4+MC8sYz1ePjEvLGQ9aXM0Ozs7fSxkPWlzNDs7O30iKSwgKGNoYXIgKilzdHJkdXAoIjAyMDAwMDAwMDAwMDAwMDAwYTAxMDAwMDAwMTQwMTAwMDAwMDFlMDAwMTAwMDAwMDI4MDAwMTAwMDAwMDMyMDAwMTAwMDAwMDNjMDMwMDAwMDAwMDAwMDAwMDAwM2MwMDAwMDAzMjAwMDAwMDI4MDAwMDAwMWUwMDAwMDAwMDE0MDAwMDAwMDAwYSIpKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoKGNoYXIgKilzdHJkdXAoIl4lMC97fGE9aXM0LGI9Xj4wLyxjPV4lMS97fGE9aXM0LGI9Xj4wLyxjPV4+MS8sZD1pczQ7Ozt9LGQ9aXM0Ozs7fSIpLCAoY2hhciAqKXN0cmR1cCgiMDIwMDAwMDAwMDAwMDAwMDBhMDEwMDAwMDAxNDAxMDAwMDAwMWUwMDAxMDAwMDAwMjgwMDAxMDAwMDAwMzIwMDAxMDAwMDAwM2MwMzAwMDAwMDAwMDAwMDAwMDAzYzAwMDAwMDMyMDAwMDAwMjgwMDAwMDAxZTAwMDAwMDAwMTQwMDAwMDAwMDBhIikpOwotCWZsYWcuRF9BSUZQcmludCA9IDc7Ci0gICAgICAgIF90ZXN0Q2lyY3VsYXJEYXRhKCJzdWJ0ZXN0NCIsIGEsIGIsIGZsYWcpOwotCi0KLX0KLQotCi0KLQotdm9pZAotX3Rlc3RFUFMoQUlGICpsbywgQUlGICpoaSwgQUlGICphKQotewotCWludCB2YWw7Ci0gICAgICAgIGludCByZXQ7Ci0KLSAgICAgICAgcmV0ID0gQUlGRVBTKGxvLCBoaSwgYSwgJnZhbCk7Ci0gICAgICAgIGlmIChyZXQgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiQUlGRVBTKGxvID0gIik7Ci0gICAgICAgICAgICAgICAgQUlGUHJpbnQoc3Rkb3V0LCAwLCBsbyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIsIGhpID0gIik7Ci0gICAgICAgICAgICAgICAgQUlGUHJpbnQoc3Rkb3V0LCAwLCBoaSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIsIGEgPSAiKTsKLSAgICAgICAgICAgICAgICBBSUZQcmludChzdGRvdXQsIDAsIGEpOwotICAgICAgICAgICAgICAgIHByaW50ZigiKTogdmFsID0gJWRcbiIsIHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZigiKioqIEVSUk9SICoqKiA6ICVzXG4iLCBBSUZFcnJvclN0cigpKTsKLX0KLQotdm9pZCAKLVRlc3RBbGxFUFMoKQotewotCUFJRiAqIGE7Ci0JQUlGICogbG87Ci0JQUlGICogaGk7Ci0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFxuIik7Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiKioqIFRFU1QgU0VSSUVTIDU6IEFJRkVQUyAgICAgICoqKiBcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXG5cbiIpOwotCi0JLy9BSUZfQk9PTEVBTgotCXByaW50ZigiXG4+Pj4+Pj4+IEJPT0xFQU5cbiIpOwotCWEgPSBCb29sVG9BSUYoMCk7IGxvID0gQm9vbFRvQUlGKDApOyBoaSA9IEJvb2xUb0FJRigxKTsKLQlfdGVzdEVQUyhsbywgaGksIGEpOwotCV90ZXN0RVBTKGEsIGxvLCBoaSk7Ci0JX3Rlc3RFUFMoaGksIGEsIGxvKTsKLQlBSUZGcmVlKGEpOyBBSUZGcmVlKGxvKTsgQUlGRnJlZShoaSk7Ci0KLQkvL0FJRl9JTlRFR0VSCi0JcHJpbnRmKCJcbj4+Pj4+Pj4gSU5URUdFUlxuIik7Ci0JYSA9IEludFRvQUlGKDUpOyBsbyA9IEludFRvQUlGKDMpOyBoaSA9IEludFRvQUlGKDgpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JX3Rlc3RFUFMoYSwgbG8sIGhpKTsKLQlfdGVzdEVQUyhoaSwgYSwgbG8pOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUobG8pOyBBSUZGcmVlKGhpKTsKLQotCS8vQUlGX0NIQVJBQ1RFUgotCXByaW50ZigiXG4+Pj4+Pj4+IENIQVJBQ1RFUlxuIik7Ci0JYSA9IENoYXJUb0FJRignYycpOyBsbyA9IENoYXJUb0FJRignYicpOyBoaSA9IENoYXJUb0FJRignZCcpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JX3Rlc3RFUFMoYSwgbG8sIGhpKTsKLQlfdGVzdEVQUyhoaSwgYSwgbG8pOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUobG8pOyBBSUZGcmVlKGhpKTsKLQotCS8vQUlGX0VOVU0KLQlwcmludGYoIlxuPj4+Pj4+PiBFTlVNXG4iKTsKLSAgICAgICAgYSA9IEVtcHR5RW51bVRvQUlGKCJ0ZXN0X2VudW0iKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0oYSwgImNvbnN0MSIsIEludFRvQUlGKDEwKSk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGEsICJjb25zdDIiLCBJbnRUb0FJRigyMCkpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShhLCAiY29uc3QzIiwgSW50VG9BSUYoMTUpKTsKLSAgICAgICAgQUlGU2V0RW51bShhLCAiY29uc3QzIik7Ci0gICAgICAgIGxvID0gRW1wdHlFbnVtVG9BSUYoTlVMTCk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGxvLCAiY29uc3QxIiwgSW50VG9BSUYoMTApKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0obG8sICJjb25zdDIiLCBJbnRUb0FJRigyMCkpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShsbywgImNvbnN0MyIsIEludFRvQUlGKDE1KSk7Ci0gICAgICAgIEFJRlNldEVudW0obG8sICJjb25zdDEiKTsKLSAgICAgICAgaGkgPSBFbXB0eUVudW1Ub0FJRihOVUxMKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0oaGksICJjb25zdDEiLCBJbnRUb0FJRigxMCkpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShoaSwgImNvbnN0MiIsIEludFRvQUlGKDIwKSk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGhpLCAiY29uc3QzIiwgSW50VG9BSUYoMTUpKTsKLSAgICAgICAgQUlGU2V0RW51bShoaSwgImNvbnN0MiIpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JX3Rlc3RFUFMoYSwgbG8sIGhpKTsKLQlfdGVzdEVQUyhoaSwgYSwgbG8pOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUobG8pOyBBSUZGcmVlKGhpKTsKLQotICAgICAgICBhID0gRW1wdHlFbnVtVG9BSUYoInRlc3RfZW51bSIpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShhLCAiY29uc3QxYSIsIEludFRvQUlGKDEwKSk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGEsICJjb25zdDJhIiwgSW50VG9BSUYoMjApKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0oYSwgImNvbnN0M2EiLCBJbnRUb0FJRigxNSkpOwotICAgICAgICBBSUZTZXRFbnVtKGEsICJjb25zdDNhIik7Ci0gICAgICAgIGxvID0gRW1wdHlFbnVtVG9BSUYoTlVMTCk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGxvLCAiY29uc3QxbG8iLCBJbnRUb0FJRigxMCkpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShsbywgImNvbnN0MmxvIiwgSW50VG9BSUYoMjApKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0obG8sICJjb25zdDNsbyIsIEludFRvQUlGKDE1KSk7Ci0gICAgICAgIEFJRlNldEVudW0obG8sICJjb25zdDFsbyIpOwotICAgICAgICBoaSA9IEVtcHR5RW51bVRvQUlGKE5VTEwpOwotICAgICAgICBBSUZBZGRDb25zdFRvRW51bShoaSwgImNvbnN0MWhpIiwgSW50VG9BSUYoMTApKTsKLSAgICAgICAgQUlGQWRkQ29uc3RUb0VudW0oaGksICJjb25zdDJoaSIsIEludFRvQUlGKDIwKSk7Ci0gICAgICAgIEFJRkFkZENvbnN0VG9FbnVtKGhpLCAiY29uc3QzaGkiLCBJbnRUb0FJRigxNSkpOwotICAgICAgICBBSUZTZXRFbnVtKGhpLCAiY29uc3QyaGkiKTsKLQlfdGVzdEVQUyhsbywgaGksIGEpOwotCV90ZXN0RVBTKGEsIGxvLCBoaSk7Ci0JX3Rlc3RFUFMoaGksIGEsIGxvKTsKLQlBSUZGcmVlKGEpOyBBSUZGcmVlKGxvKTsgQUlGRnJlZShoaSk7Ci0KLQkvL0FJRl9TVFJJTkcKLQlwcmludGYoIlxuPj4+Pj4+PiBTVFJJTkdcbiIpOwotICAgICAgICBhID0gU3RyaW5nVG9BSUYoImIiKTsKLSAgICAgICAgbG8gPSBTdHJpbmdUb0FJRigiYSIpOwotICAgICAgICBoaSA9IFN0cmluZ1RvQUlGKCJjIik7Ci0JX3Rlc3RFUFMobG8sIGhpLCBhKTsKLQlfdGVzdEVQUyhhLCBsbywgaGkpOwotCV90ZXN0RVBTKGhpLCBhLCBsbyk7Ci0JQUlGRnJlZShhKTsgQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCi0JLy9BSUZfRkxPQVRJTkcKLQlwcmludGYoIlxuPj4+Pj4+PiBGTE9BVFxuIik7Ci0JYSA9IEZsb2F0VG9BSUYoNSk7IGxvID0gRmxvYXRUb0FJRigzKTsgaGkgPSBGbG9hdFRvQUlGKDgpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JX3Rlc3RFUFMoYSwgbG8sIGhpKTsKLQlfdGVzdEVQUyhoaSwgYSwgbG8pOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUobG8pOyBBSUZGcmVlKGhpKTsKLQlhID0gRG91YmxlVG9BSUYoNSk7IGxvID0gRG91YmxlVG9BSUYoMyk7IGhpID0gRG91YmxlVG9BSUYoOCk7Ci0JX3Rlc3RFUFMobG8sIGhpLCBhKTsKLQlfdGVzdEVQUyhhLCBsbywgaGkpOwotCV90ZXN0RVBTKGhpLCBhLCBsbyk7Ci0JQUlGRnJlZShhKTsgQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCi0JLy9BSUZfQVJSQVkKLQlwcmludGYoIlxuPj4+Pj4+PiBBUlJBWVxuIik7Ci0JewotCQljaGFyIGRhdGFbQlVGU0laXSwgKmRlc3Q7Ci0JCWludCBpbmRleCwgc3VibWluLCBzdWJtYXg7Ci0JCWludCBzbWFsbEFycmF5WzVdID0gezMsNCw1LDYsN307Ci0JCWRlc3QgPSBkYXRhOwotCQlzdWJtaW4gPSAxOwotCQlzdWJtYXggPSA1OwotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1OyBpbmRleCsrKQotCQl7Ci0JCQlBSUZOb3JtYWxpc2UoZGVzdCwgc2l6ZW9mKGludCksIChjaGFyICopIChzbWFsbEFycmF5K2luZGV4KSwgc2l6ZW9mKGludCkpOwotCQkJZGVzdCArPSBzaXplb2YoaW50KTsKLQkJfQotCQlhID0gQXJyYXlUb0FJRigxLCAmc3VibWluLCAmc3VibWF4LCBkYXRhLCA1KnNpemVvZihpbnQpLCBBSUZfRk9STUFUKEludFRvQUlGKDApKSk7Ci0KLQl9Ci0JbG8gPSBJbnRUb0FJRigxMCk7Ci0JaGkgPSBJbnRUb0FJRigyMCk7Ci0JX3Rlc3RFUFMobG8sIGhpLCBhKTsKLQlBSUZGcmVlKGxvKTsgQUlGRnJlZShoaSk7Ci0KLQlsbyA9IEludFRvQUlGKDEpOwotCWhpID0gSW50VG9BSUYoMjApOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCi0JbG8gPSBJbnRUb0FJRigxKTsKLQloaSA9IEludFRvQUlGKDIpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCUFJRkZyZWUoYSk7Ci0KLQkvL0FJRl9TVFJVQ1QKLQlwcmludGYoIlxuPj4+Pj4+PiBTVFJVQ1RcbiIpOwotCXsKLQkJYSA9IEVtcHR5U3RydWN0VG9BSUYoInRlc3Rfc3RydWN0Iik7Ci0JCUFJRkFkZEZpZWxkVG9TdHJ1Y3QoYSwgInZhbDEiLCBJbnRUb0FJRigxMSkpOwotCQlBSUZBZGRGaWVsZFRvU3RydWN0KGEsICJ2YWwyIiwgSW50VG9BSUYoMTIpKTsKLQkJQUlGQWRkRmllbGRUb1N0cnVjdChhLCAidmFsMyIsIEludFRvQUlGKDEzKSk7Ci0JfQotCWxvID0gSW50VG9BSUYoMTgpOwotCWhpID0gSW50VG9BSUYoMjApOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCi0JbG8gPSBJbnRUb0FJRigxKTsKLQloaSA9IEludFRvQUlGKDIwKTsKLQlfdGVzdEVQUyhsbywgaGksIGEpOwotCUFJRkZyZWUobG8pOyBBSUZGcmVlKGhpKTsKLQotCWxvID0gSW50VG9BSUYoMSk7Ci0JaGkgPSBJbnRUb0FJRigyKTsKLQlfdGVzdEVQUyhsbywgaGksIGEpOwotCUFJRkZyZWUobG8pOyBBSUZGcmVlKGhpKTsKLQlBSUZGcmVlKGEpOwotCi0JLy9BSUZfUE9JTlRFUgotCXByaW50ZigiXG4+Pj4+Pj4+IFBPSU5URVJcbiIpOwotCWEgPSBJbnRUb0FJRig1KTsgbG8gPSBJbnRUb0FJRigzKTsgaGkgPSBJbnRUb0FJRig4KTsKLQlhID0gUG9pbnRlclRvQUlGKE5VTEwsIGEpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCi0JbG8gPSBJbnRUb0FJRigxKTsKLQloaSA9IEludFRvQUlGKDIpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCi0JbG8gPSBJbnRUb0FJRig2KTsKLQloaSA9IEludFRvQUlGKDcpOwotCV90ZXN0RVBTKGxvLCBoaSwgYSk7Ci0JQUlGRnJlZShsbyk7IEFJRkZyZWUoaGkpOwotCUFJRkZyZWUoYSk7Ci0KLX0KLQotCi0KLQotdm9pZAotX3Rlc3RDb21wYXJlQnlOYW1lKGludCBkZXAsIEFJRiAqYSwgQUlGICpiLCBjaGFyICptZXRob2QpCi17Ci0JQUlGICogYzsKLQlpbnQgcmVzOwotCi0JaWYgKHN0cmNtcChtZXRob2QsICJBSUZEaWZmIikgPT0gMCkKLQl7Ci0JCWMgPSBBSUZEaWZmKGRlcCwgYSwgYik7Ci0JCWlmIChjID09IE5VTEwpCi0JCQlwcmludGYoIioqKiBFUlJPUiAqKiogOiAlc1xuIiwgQUlGRXJyb3JTdHIoKSk7Ci0JCWVsc2UKLQkJewotCQkJcHJpbnRmKCJhID0gIik7Ci0JCQlBSUZQcmludChzdGRvdXQsIDAsIGEpOwotCQkJcHJpbnRmKCJcbmIgPSAiKTsKLQkJCUFJRlByaW50KHN0ZG91dCwgMCwgYik7Ci0JCQlwcmludGYoIlxuQUlGRGlmZihkZXB0aCA9ICVkLCBhLCBiKSA9IGMgPSAiLCBkZXApOwotCQkJQUlGUHJpbnQoc3Rkb3V0LCAwLCBjKTsKLQkJCXByaW50ZigiXG5cbiIpOwotCi0JCQlBSUZGcmVlKGMpOwotCQl9Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJBSUZDb21wYXJlIikgPT0gMCkKLQl7Ci0JCWlmIChBSUZDb21wYXJlKGRlcCwgYSwgYiwgJnJlcykgPCAwKQotCQkJcHJpbnRmKCIqKiogRVJST1IgKioqIDogJXNcbiIsIEFJRkVycm9yU3RyKCkpOwotCQllbHNlCi0JCXsKLQkJCXByaW50ZigiYSA9ICIpOwotCQkJQUlGUHJpbnQoc3Rkb3V0LCAwLCBhKTsKLQkJCXByaW50ZigiXG5iID0gIik7Ci0JCQlBSUZQcmludChzdGRvdXQsIDAsIGIpOwotCQkJcHJpbnRmKCJcbkFJRkNvbXBhcmUoZGVwdGggPSAlZCwgYSwgYikgPSAiLCBkZXApOwotCQkJcHJpbnRmKCIlZFxuXG4iLCByZXMpOwotCQl9Ci0JfQotCWVsc2UKLQkJcmV0dXJuOwotfQotCi12b2lkIAotVGVzdEFsbENvbXBhcmVCeU5hbWUoKQotewotCUFJRiAqIGE7Ci0JQUlGICogYjsKLQotCUFJRlNldE9wdGlvbihBSUZPUFRfQ01QX01FVEhPRCwgQUlGX0NNUF9CWV9OQU1FKTsKLQotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFxuIik7Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiKioqIFRFU1QgU0VSSUVTIDY6IGNvbXBhcmUgYnkgbmFtZSAqKiogXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcblxuIik7Ci0KLQlhID0gQXNjaWlUb0FJRigie3xhPWlzNCxiPXM7Ozt9IiwgIjAwMDAwMDA0MDAwMjYzNjMiKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoInt8Yj1zLGE9aXM0Ozs7fSIsICIwMDAyNjQ2NDAwMDAwMDAyIik7Ci0JX3Rlc3RDb21wYXJlQnlOYW1lKDAsIGEsIGIsICJBSUZEaWZmIik7Ci0JQUlGRnJlZShhKTsgQUlGRnJlZShiKTsKLQotICAgICAgICBhID0gQXNjaWlUb0FJRigiXiUwL3t8Yz1pczQsYj1ePjAvLGE9aXM0Ozs7fSIsICIwMjAwMDAwMDAwMDAwMDAwMGEwMTAwMDAwMDE0MDMwMDAwMDAwMDAwMDAwMDE1MDAwMDAwMGIiKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoIl4lMi97fGE9aXM0LGI9Xj4yLyxjPWlzNDs7O30iLCAiMDIwMDAwMDAwMDAwMDAwMDBiMDEwMDAwMDAxNjAzMDAwMDAwMDAwMDAwMDAxODAwMDAwMDBmIik7Ci0JX3Rlc3RDb21wYXJlQnlOYW1lKDAsIGEsIGIsICJBSUZEaWZmIik7Ci0JX3Rlc3RDb21wYXJlQnlOYW1lKDEsIGEsIGIsICJBSUZEaWZmIik7Ci0JX3Rlc3RDb21wYXJlQnlOYW1lKDIsIGEsIGIsICJBSUZEaWZmIik7Ci0JX3Rlc3RDb21wYXJlQnlOYW1lKDMsIGEsIGIsICJBSUZEaWZmIik7Ci0JQUlGRnJlZShhKTsgQUlGRnJlZShiKTsKLQotICAgICAgICBhID0gQXNjaWlUb0FJRigiXiUwL3t8YT1pczQsYj1ePjAvLGM9XiUxL3t8YT1pczQsYj1ePjAvLGM9Xj4xLyxkPWlzNDs7O30sZD1pczQ7Ozt9IiwgIjAyMDAwMDAwMDAwMDAwMDAwYTAxMDAwMDAwMTQwMDAxMDAwMDAwMWUwMzAwMDAwMDAwMDAwMDAwMDAxZTAwMDAwMDE0MDAwMDAwMDAwYSIpOwotICAgICAgICBiID0gQXNjaWlUb0FJRigiXiUyL3t8ZD1pczQsYj1ePjIvLGM9XiUzL3t8ZD1pczQsYj1ePjIvLGM9Xj4zLyxhPWlzNDs7O30sYT1pczQ7Ozt9IiwgIjAyMDAwMDAwMDAwMDAwMDAwYjAxMDAwMDAwMTcwMDAxMDAwMDAwMjMwMzAwMDAwMDAwMDAwMDAwMDAyNDAwMDAwMDE4MDAwMDAwMDAwYyIpOwotCV90ZXN0Q29tcGFyZUJ5TmFtZSgwLCBhLCBiLCAiQUlGRGlmZiIpOwotCV90ZXN0Q29tcGFyZUJ5TmFtZSgxLCBhLCBiLCAiQUlGRGlmZiIpOwotCV90ZXN0Q29tcGFyZUJ5TmFtZSgyLCBhLCBiLCAiQUlGRGlmZiIpOwotCV90ZXN0Q29tcGFyZUJ5TmFtZSgzLCBhLCBiLCAiQUlGRGlmZiIpOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUoYik7Ci0KLQkvKiBUaGlzIG9uZSB3b3JrcyBldmVuIHRob3VnaCBiIHdpbGwgYmUgcmVhcnJhbmdlZCB0bwotICAgICAgICAqKiAie3xhPWlzNCxjPT4wLyxiPSUwL2lzNDs7O30iIHNpbmNlCi0JKiogX2Zkc19yZXNvbHZlKCkgaW4gX2Zkc19za2lwX2RhdGEoKSBpcyBjYWxsZWQgYmVmb3JlIHRoZQotCSoqIHJlYXJyYW5nZW1lbnQKLQkqLwotCi0gICAgICAgIGEgPSBBc2NpaVRvQUlGKCJ7fGE9aXM0LGM9aXM0LGI9aXM0Ozs7fSIsICIwMDAwMDAwYjAwMDAwMDE1MDAwMDAwMTYiKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoInt8YT1pczQsYj0lMC9pczQsYz0+MC87Ozt9IiwgIjAwMDAwMDBhMDAwMDAwMTQwMDAwMDAxNSIpOwotCV90ZXN0Q29tcGFyZUJ5TmFtZSgwLCBhLCBiLCAiQUlGRGlmZiIpOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUoYik7Ci0KLQlhID0gQXNjaWlUb0FJRigie3xhPWlzNCxiPXM7Ozt9IiwgIjAwMDAwMDA0MDAwMjYzNjMiKTsKLQliID0gQXNjaWlUb0FJRigie3xiPXMsYT1pczQ7Ozt9IiwgIjAwMDI2MzYzMDAwMDAwMDQiKTsKLQlfdGVzdENvbXBhcmVCeU5hbWUoMCwgYSwgYiwgIkFJRkNvbXBhcmUiKTsKLQlBSUZGcmVlKGEpOyBBSUZGcmVlKGIpOwotCi0gICAgICAgIGEgPSBBc2NpaVRvQUlGKCJ7fGE9aXM0LGM9aXM0LGI9aXM0Ozs7fSIsICIwMDAwMDAwYjAwMDAwMDE1MDAwMDAwMTYiKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoInt8YT1pczQsYj0lMC9pczQsYz0+MC87Ozt9IiwgIjAwMDAwMDBiMDAwMDAwMTYwMDAwMDAxNSIpOwotCV90ZXN0Q29tcGFyZUJ5TmFtZSgwLCBhLCBiLCAiQUlGQ29tcGFyZSIpOwotCUFJRkZyZWUoYSk7IEFJRkZyZWUoYik7Ci0KLSAgICAgICAgYSA9IEFzY2lpVG9BSUYoIl4lMC97fGE9aXM0LGI9Xj4wLyxjPV4lMS97fGE9aXM0LGI9Xj4wLyxjPV4+MS8sZD1pczQ7Ozt9LGQ9aXM0Ozs7fSIsICIwMjAwMDAwMDAwMDAwMDAwMGIwMTAwMDAwMDE0MDAwMTAwMDAwMDFlMDMwMDAwMDAwMDAwMDAwMDAwMWUwMDAwMDAxNDAwMDAwMDAwMGEiKTsKLSAgICAgICAgYiA9IEFzY2lpVG9BSUYoIl4lMi97fGQ9aXM0LGI9Xj4yLyxjPV4lMy97fGQ9aXM0LGI9Xj4yLyxjPV4+My8sYT1pczQ7Ozt9LGE9aXM0Ozs7fSIsICIwMjAwMDAwMDAwMDAwMDAwMGEwMTAwMDAwMDE3MDAwMTAwMDAwMDIzMDMwMDAwMDAwMDAwMDAwMDAwMjQwMDAwMDAxODAwMDAwMDAwMGIiKTsKLQlfdGVzdENvbXBhcmVCeU5hbWUoMCwgYSwgYiwgIkFJRkNvbXBhcmUiKTsKLQlfdGVzdENvbXBhcmVCeU5hbWUoMSwgYSwgYiwgIkFJRkNvbXBhcmUiKTsKLQlBSUZGcmVlKGEpOyBBSUZGcmVlKGIpOwotCi0JQUlGU2V0T3B0aW9uKEFJRk9QVF9DTVBfTUVUSE9ELCBBSUZfQ01QX0JZX1BPU0lUSU9OKTsKLX0KLQotCi0KLQotLyoKLSAqIFRoZXJlIGFyZSBzb21lIHRlc3QgY29kZXMgdGhhdCBzaGFyZSB0aGUgc2FtZSBjb2RlIGluIHRoaXMgZmlsZSwKLSAqIHRodXMgcHJvYmFibHkgd2UgY2FuIHJlcGxhY2UgdGhlIHNpbWlsYXJpdGllcyB3aXRoIEMgbWFjcm9zLiBIb3dldmVyLAotICogbWFjcm9zIGNhbiBtYWtlIHRoZSBjb2RlIGhhcmQgdG8gcmVhZCB3aGVyZWFzIHdlIHdhbnQgYSBzaW1wbGUKLSAqIHRlc3QgZnVuY3Rpb25zICh0byBhdm9pZCB0aGUgdGVzdGluZyBvZiB0aGUgdGVzdCBmdW5jdGlvbnMpCi0gKi8KLQotCi1pbnQKLUFJRlRlc3QoY2hhciAqdGl0bGUsIEFJRiAqYSwgY2hhciAqbXNnLCBUZXN0RmxhZ3MgZikKLXsKLQlpbnQgcmV0OwotCi0gICAgICAgCWlmICggdGl0bGUgIT0gTlVMTCApCi0JCWZwcmludGYoc3Rkb3V0LCAiJXMgPiAiLCB0aXRsZSk7Ci0KLSAgICAgICAJaWYgKCBtc2cgIT0gTlVMTCApCi0gICAgICAgIAlmcHJpbnRmKHN0ZG91dCwgIiVzOiIsIG1zZyk7Ci0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQ6ICIpOwotICAgICAgICBpZiAoQUlGUHJpbnQoc3Rkb3V0LCBmLkRfQUlGUHJpbnQsIGEpICE9IDApCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAoJXMpIiwgQUlGX0ZPUk1BVChhKSk7Ci0KLQlyZXQgPSBfYWlmX3Rlc3QoYSwgZik7Ci0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1fYWlmX3Rlc3QoQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLSAgICAgICAgLy9jaGFyICogdG1wOwotICAgICAgICAvL19mZHNfcmVzb2x2ZShmZHMpOwotCi0JX2FpZl90ZXN0X2dlbmVyYWwoYSwgZik7Ci0KLSAgICAgICAgc3dpdGNoICggQUlGVHlwZShhKSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBBSUZfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gX2FpZl90ZXN0X2Jvb2woYSwgZik7Ci0KLSAgICAgICAgY2FzZSBBSUZfQ0hBUkFDVEVSOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3RfY2hhcihhLCBmKTsKLQotICAgICAgICBjYXNlIEFJRl9JTlRFR0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3RfaW50KGEsIGYpOwotCi0gICAgICAgIGNhc2UgQUlGX0ZMT0FUSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3RfZmxvYXQoYSwgZik7Ci0KLSAgICAgICAgY2FzZSBBSUZfQVJSQVk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfdGVzdF9hcnJheShhLCBmKTsKLQotICAgICAgICBjYXNlIEFJRl9QT0lOVEVSOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3RfcG9pbnRlcihhLCBmKTsKLQotICAgICAgICBjYXNlIEFJRl9SRUdJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfdGVzdF9yZWdpb24oYSwgZik7Ci0KLSAgICAgICAgY2FzZSBBSUZfU1RSVUNUOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3Rfc3RydWN0KGEsIGYpOwotCi0gICAgICAgIGNhc2UgQUlGX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfdGVzdF9uYW1lKGEsIGYpOwotCi0gICAgICAgIGNhc2UgQUlGX1JFRkVSRU5DRToKLSAgICAgICAgICAgICAgICAvL3RtcCA9IChjaGFyICopIF9mZHNfbG9va3VwKGZkcyk7Ci0gICAgICAgICAgICAgICAgLy9yZXR1cm4gX2FpZl90ZXN0KGZwLCBkZXB0aCwgJnRtcCwgZGF0YSk7Ci0KLSAgICAgICAgY2FzZSBBSUZfU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3Rfc3RyaW5nKGEsIGYpOwotCi0gICAgICAgIGNhc2UgQUlGX0VOVU06Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9haWZfdGVzdF9lbnVtKGEsIGYpOwotCi0gICAgICAgIGNhc2UgQUlGX1VOSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBfYWlmX3Rlc3RfdW5pb24oYSwgZik7Ci0KLSAgICAgICAgY2FzZSBBSUZfRlVOQ1RJT046Ci0gICAgICAgIGNhc2UgQUlGX1ZPSUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0JCWZwcmludGYoc3Rkb3V0LCAiVW5zdXBwb3J0ZWQgVHlwZVxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCXJldHVybiAtMTsKLX0KLQotaW50Ci1fYWlmX3Rlc3RfZ2VuZXJhbChBSUYgKmEsIFRlc3RGbGFncyBmKQotewotCWludCB6ZXJvVmFsLCBjb21wYXJlVmFsOwotCUFJRiAqIHJlc3VsdDsKLQotCS8vIFRlc3QgQUlGSXNaZXJvCi0JaWYgKGYuQUlGSXNaZXJvID09IDEpewotCi0JaWYgKEFJRklzWmVybyhhLCAmemVyb1ZhbCkpIAotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZJc1plcm8gRVJST1I6IHRyb3VibGUgY2hlY2tpbmcgYWdhaW5zdCB6ZXJvOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCWVsc2UKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGSXNaZXJvOiAlc2VxdWFsIHRvIHplcm8iLCB6ZXJvVmFsID8gIiIgOiAibm90ICIpOwotCi0JfQotCi0JLy8gVGVzdCBBSUZDb21wYXJlCi0JaWYgKGYuQUlGQ29tcGFyZSA9PSAxKXsKLQotCWlmIChBSUZDb21wYXJlKDAsIGEsIGEsICZjb21wYXJlVmFsKSkgIAotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZDb21wYXJlIChhLGEpIEVSUk9SOiB0cm91YmxlIGNvbXBhcmluZyBhZ2FpbnN0IHNlbGY6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0JZWxzZSBpZiAoY29tcGFyZVZhbCkgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkNvbXBhcmUgKGEsYSkgRVJST1I6IG5vdCBlcXVhbCB0byBpdHNlbGYiKTsKLQllbHNlCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkNvbXBhcmUgKGEsYSk6IE9LIik7Ci0KLQl9Ci0KLQkvLyBUZXN0IEFJRlR5cGVDb21wYXJlCi0JaWYgKGYuQUlGVHlwZUNvbXBhcmUgPT0gMSl7Ci0KLQlpZiAoIUFJRlR5cGVDb21wYXJlKGEsIGEpKSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGVHlwZUNvbXBhcmUgKGEsYSkgRVJST1I6IG5vdCB0aGUgc2FtZSB0eXBlIGFzIGl0c2VsZiIpOwotCWVsc2UKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGVHlwZUNvbXBhcmUgKGEsYSk6IE9LIik7Ci0KLQl9Ci0KLQkvLyBUZXN0IEFJRkRpZmYKLQlpZiAoZi5BSUZEaWZmICE9IE5VTEwpewotCi0JaWYgKCBmLkFJRkRpZmYgPT0gKEFJRiopU0VMRiApIAotCQlyZXN1bHQgPSBBSUZEaWZmKDAsIGEsIGEpOyAKLQllbHNlICAKLQkJcmVzdWx0ID0gQUlGRGlmZigwLCBhLCBmLkFJRkRpZmYpOwotCWlmICggcmVzdWx0ICE9IE5VTEwgKSAKLQl7Ci0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkRpZmYgKGEsYSBvciBmLkFJRkRpZmYpOiAiKTsKLSAgICAgICAgCWlmIChBSUZQcmludChzdGRvdXQsIDAsIHJlc3VsdCkgIT0gMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICglcykiLCBBSUZfRk9STUFUKHJlc3VsdCkpOwotCX0KLQllbHNlCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkRpZmYgKGEsYSBvciBmLkFJRkRpZmYpIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl90ZXN0X2Jvb2woQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLQlBSUYgKiByZXN1bHQ7Ci0KLQkvLyBUZXN0IEFJRkFuZAotCWlmIChmLkFJRkFuZCAhPSBOVUxMKXsKLQotCWlmICggZi5BSUZBbmQgPT0gKEFJRiopU0VMRiApIAotCQlyZXN1bHQgPSBBSUZBbmQoYSxhKTsgCi0JZWxzZQotCQlyZXN1bHQgPSBBSUZBbmQoYSwgZi5BSUZBbmQpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAoQUlGICopTlVMTCApCi0JewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFuZCAoYSwgYSBvciBmLkFJRkFuZCk6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgcmVzdWx0KSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQocmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShyZXN1bHQpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQW5kIChhLCBhIG9yIGYuQUlGQW5kKSBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQotICAgICAgICB9Ci0KLQkvLyBUZXN0IEFJRk9yCi0JaWYgKGYuQUlGT3IgIT0gTlVMTCl7Ci0KLQlpZiAoIGYuQUlGT3IgPT0gKEFJRiopU0VMRiApCi0JCXJlc3VsdCA9IEFJRk9yKGEsYSk7Ci0gICAgICAgIGVsc2UKLQkJcmVzdWx0ID0gQUlGT3IoYSwgZi5BSUZPcik7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IChBSUYgKilOVUxMICkKLQl7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblx0QUlGT3IgKGEsIGEgb3IgZi5BSUZPcik6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgcmVzdWx0KSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQocmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShyZXN1bHQpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGT3IgKGEsIGEgb3IgZi5BSUZPcikgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLSAgICAgICAgfQotCi0JLy8gVGVzdCBBSUZOZWcKLQlpZiAoZi5BSUZOZWcgPT0gMSl7Ci0KLQlyZXN1bHQgPSBBSUZOZWcoYSk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IChBSUYgKilOVUxMICkKLQl7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblx0QUlGTmVnOiAiKTsKLSAgICAgICAgCWlmIChBSUZQcmludChzdGRvdXQsIDAsIHJlc3VsdCkgIT0gMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICglcykiLCBBSUZfRk9STUFUKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgIEFJRkZyZWUocmVzdWx0KTsKLSAgICAgICAgfQotCWVsc2UgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRk5lZyBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQotICAgICAgICB9Ci0KLQkvLyBUZXN0IEFJRk5vdAotCWlmIChmLkFJRk5vdCA9PSAxKXsKLQotCXJlc3VsdCA9IEFJRk5vdChhKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gKEFJRiAqKU5VTEwgKQotCXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZOb3Q6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgcmVzdWx0KSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQocmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShyZXN1bHQpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGTm90IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0gICAgICAgIH0KLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfdGVzdF9jaGFyKEFJRiAqYSwgVGVzdEZsYWdzIGYpCi17Ci0JX2FpZl90ZXN0X2Jvb2woYSwgZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3Rlc3RfaW50KEFJRiAqYSwgVGVzdEZsYWdzIGYpCi17Ci0JQUlGICogcmVzdWx0OwotCi0JX2FpZl90ZXN0X2Jvb2woYSwgZik7Ci0KLQkvLyBUZXN0IEFJRkFkZAotCWlmIChmLkFJRkFkZCAhPSBOVUxMKXsKLQotCWlmICggZi5BSUZBZGQgPT0gKEFJRiopU0VMRiApIAotCQlyZXN1bHQgPSBBSUZBZGQoYSxhKTsKLSAgICAgICAgZWxzZQotCQlyZXN1bHQgPSBBSUZBZGQoYSwgZi5BSUZBZGQpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAoQUlGICopTlVMTCApCi0JewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFkZCAoYSwgYSBvciBmLkFJRkFkZCk6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgcmVzdWx0KSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQocmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShyZXN1bHQpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQWRkIChhLCBhIG9yIGYuQUlGQWRkKSBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQotICAgICAgICB9Ci0KLQkvLyBUZXN0IEFJRlN1YgotCWlmIChmLkFJRlN1YiAhPSBOVUxMKXsKLQotCWlmIChmLkFJRlN1YiA9PSAoQUlGKilTRUxGKSAKLQkJcmVzdWx0ID0gQUlGU3ViKGEsYSk7IAotCWVsc2UKLQkJcmVzdWx0ID0gQUlGU3ViKGEsIGYuQUlGU3ViKTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gKEFJRiAqKU5VTEwgKQotCXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZTdWIgKGEsIGEgb3IgZi5BSUZTdWIpOiAiKTsKLSAgICAgICAgCWlmIChBSUZQcmludChzdGRvdXQsIDAsIHJlc3VsdCkgIT0gMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICglcykiLCBBSUZfRk9STUFUKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgIEFJRkZyZWUocmVzdWx0KTsKLSAgICAgICAgfQotCWVsc2UgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlN1YiAoYSwgYSBvciBmLkFJRlN1YikgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLSAgICAgICAgfQotCi0JLy8gVGVzdCBBSUZNdWwKLQlpZiAoZi5BSUZNdWwgIT0gTlVMTCl7Ci0KLQlpZiAoIGYuQUlGTXVsID09IChBSUYqKVNFTEYpIAotCQlyZXN1bHQgPSBBSUZNdWwoYSxhKTsgCi0JZWxzZQotCQlyZXN1bHQgPSBBSUZNdWwoYSwgZi5BSUZNdWwpOwotICAgICAgICBpZiAoIHJlc3VsdCAhPSAoQUlGICopTlVMTCApCi0JewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRk11bCAoYSwgYSBvciBmLkFJRk11bCk6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgcmVzdWx0KSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQocmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShyZXN1bHQpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGTXVsIChhLCBhIG9yIGYuQUlGTXVsKSBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQotICAgICAgICB9Ci0KLQkvLyBUZXN0IEFJRkRpdgotCWlmIChmLkFJRkRpdiAhPSBOVUxMKXsKLQotCWlmIChmLkFJRkRpdiA9PSAoQUlGKilTRUxGKSAKLQkJcmVzdWx0ID0gQUlGRGl2KGEsYSk7Ci0JZWxzZSAKLQkJcmVzdWx0ID0gQUlGRGl2KGEsIGYuQUlGRGl2KTsKLSAgICAgICAgaWYgKCByZXN1bHQgIT0gKEFJRiAqKU5VTEwgKQotCXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZEaXYgKGEsIGEgb3IgZi5BSUZEaXYpOiAiKTsKLSAgICAgICAgCWlmIChBSUZQcmludChzdGRvdXQsIDAsIHJlc3VsdCkgIT0gMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICglcykiLCBBSUZfRk9STUFUKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgIEFJRkZyZWUocmVzdWx0KTsKLSAgICAgICAgfQotCWVsc2UgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkRpdiAoYSwgYSBvciBmLkFJRkRpdikgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLSAgICAgICAgfQotCi0JLy8gVGVzdCBBSUZSZW0KLQlpZiAoZi5BSUZSZW0gIT0gTlVMTCl7Ci0KLQlpZiAoZi5BSUZSZW0gPT0gKEFJRiopU0VMRikgCi0JCXJlc3VsdCA9IEFJRlJlbShhLGEpOwotCWVsc2UgCi0JCXJlc3VsdCA9IEFJRlJlbShhLCBmLkFJRlJlbSk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IChBSUYgKilOVUxMICkKLQl7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblx0QUlGUmVtIChhLCBhIG9yIGYuQUlGUmVtKTogIik7Ci0gICAgICAgIAlpZiAoQUlGUHJpbnQoc3Rkb3V0LCAwLCByZXN1bHQpICE9IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZQcmludCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAoJXMpIiwgQUlGX0ZPUk1BVChyZXN1bHQpKTsKLSAgICAgICAgICAgICAgICBBSUZGcmVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQllbHNlIAotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZSZW0gKGEsIGEgb3IgZi5BSUZSZW0pIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0gICAgICAgIH0KLQotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfdGVzdF9mbG9hdChBSUYgKmEsIFRlc3RGbGFncyBmKQotewotCV9haWZfdGVzdF9pbnQoYSwgZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3Rlc3RfYXJyYXkoQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLQlpbnQgCQl0bXAxOwotCWNoYXIgKiAJCXRtcDI7Ci0JaW50CQl0bXAzOwotCUFJRkluZGV4ICogCXRtcDQ7Ci0KLQlBSUZJbmRleCAqIGl4OwotCUFJRiAqIGF4OwotCi0JaXggPSBBSUZBcnJheUluZGV4SW5pdChhKTsKLSAgICAgICAgaWYgKGl4ID09IE5VTEwpCi0JewotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUluZGV4SW5pdCBGQVRBTCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQkJZXhpdCgxMDApOwotCX0KLQotCi0JLy8gVGVzdCBBSUZBcnJheVJhbmsKLQlpZiAoZi5BSUZBcnJheVJhbmsgPT0gMSl7Ci0KLQlpZiAoICh0bXAxID0gQUlGQXJyYXlSYW5rKGEpKSA8IDApIAotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVJhbmsgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0JZWxzZQotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVJhbms6ICVkIiwgdG1wMSk7Ci0KLQl9Ci0KLQkvLyBUZXN0IEFJRkFycmF5SW5mbwotCWlmIChmLkFJRkFycmF5SW5mbyA9PSAxKXsKLQotCWlmICggQUlGQXJyYXlJbmZvKGEsICZ0bXAxLCAmdG1wMiwgJnRtcDMpICkgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5mbyBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQllbHNlCi0JewotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUluZm86IHJhbmsgKCVkKSwgdHlwZSAoJXMpLCB0eXBlX2lkICglZCkiLCB0bXAxLCB0bXAyLCB0bXAzKTsKLQkJX2FpZl9mcmVlKHRtcDIpOwotCX0KLQotCX0KLQotCS8vIFRlc3QgQUlGQXJyYXlCb3VuZHMKLQlpZiAoZi5BSUZBcnJheUJvdW5kcyA9PSAxKXsKLQotCWludCAqbWluLCAqbWF4LCAqc2l6ZTsKLQotCWlmICggQUlGQXJyYXlCb3VuZHMoYSwgaXgtPmlfcmFuaywgJm1pbiwgJm1heCwgJnNpemUpIDwgMCApCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5Qm91bmRzIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCWVsc2UKLQl7Ci0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5Qm91bmRzOiAiKTsKLQotCQlmb3IgKCB0bXAzID0gMDsgdG1wMyA8IGl4LT5pX3Jhbms7IHRtcDMrKykKLQkJCWZwcmludGYoc3Rkb3V0LCAiW3Jhbms6JWQgbWluOiVkIG1heDolZCBzaXplOiVkXSAiLCAKLQkJCQkJdG1wMywgbWluW3RtcDNdLCBtYXhbdG1wM10sIHNpemVbdG1wM10pOwotCi0JCV9haWZfZnJlZShtaW4pOwotCQlfYWlmX2ZyZWUobWF4KTsKLQkJX2FpZl9mcmVlKHNpemUpOwotCX0KLQotCX0KLQotCS8vIFRlc3QgQUlGQXJyYXlJbmRleFR5cGUKLQlpZiAoZi5BSUZBcnJheUluZGV4VHlwZSA9PSAxKXsKLQotCWlmICggKHRtcDIgPSBBSUZBcnJheUluZGV4VHlwZShhKSkgPT0gTlVMTCApCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5kZXhUeXBlIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCWVsc2UKLQl7Ci0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5kZXhUeXBlOiAlcyIsIHRtcDIpOwotCQlfYWlmX2ZyZWUodG1wMik7Ci0JfQotCi0JfQotCi0JLy8gVGVzdCBBSUZBcnJheU1pbkluZGV4Ci0JaWYgKGYuQUlGQXJyYXlNaW5JbmRleCA9PSAxKXsKLQotCWZvciAoIHRtcDEgPSAwIDsgdG1wMSA8IGl4LT5pX3JhbmsgOyB0bXAxKysgKQotCXsKLQkJaWYgKCAodG1wMyA9IEFJRkFycmF5TWluSW5kZXgoYSwgdG1wMSkpIDwgMCApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheU1pbkluZGV4IEVSUk9SOiAlcyIsIAotCQkJCQlBSUZFcnJvclN0cigpKTsKLQkJZWxzZQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlNaW5JbmRleDogW3JhbmsgJWQ6ICVkXSIsIHRtcDEsIHRtcDMpOwotCX0KLQotCX0KLQotCS8vIFRlc3QgQUlGQXJyYXlNYXhJbmRleAotCWlmIChmLkFJRkFycmF5TWF4SW5kZXggPT0gMSl7Ci0KLQlmb3IgKCB0bXAxID0gMCA7IHRtcDEgPCBpeC0+aV9yYW5rIDsgdG1wMSsrICkKLQl7Ci0JCWlmICggKHRtcDMgPSBBSUZBcnJheU1heEluZGV4KGEsIHRtcDEpKSA8IDAgKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlNYXhJbmRleCBFUlJPUjogJXMiLCAKLQkJCQkJQUlGRXJyb3JTdHIoKSk7Ci0JCWVsc2UKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5TWF4SW5kZXg6IFtyYW5rICVkOiAlZF0iLCB0bXAxLCB0bXAzKTsKLQl9Ci0KLQl9Ci0KLQotCS8vIFRlc3QgQUlGQXJyYXlTaXplCi0JaWYgKGYuQUlGQXJyYXlTaXplID09IDEpewotCi0JaWYgKCAodG1wMSA9IEFJRkFycmF5U2l6ZShhKSkgPCAwKSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlTaXplIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCWVsc2UKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlTaXplOiAlZCIsIHRtcDEpOwotCi0JfQotCi0JLy8gVGVzdCBBSUZBcnJheVNsaWNlCi0JaWYgKGYuQUlGQXJyYXlTbGljZSA9PSAxKXsKLQkKLQlpbnQgKiBtbjsgCi0JaW50ICogbXg7Ci0KLQltbiA9IChpbnQgKilfYWlmX2FsbG9jKHNpemVvZihpbnQpICogaXgtPmlfcmFuayk7Ci0JbXggPSAoaW50ICopX2FpZl9hbGxvYyhzaXplb2YoaW50KSAqIGl4LT5pX3JhbmspOwotCi0JLy8gQUlGQXJyYXlTbGljZSAoZmlyc3QgZWxlbWVudCkKLQlmb3IgKHRtcDMgPSAwOyB0bXAzIDwgaXgtPmlfcmFuazsgdG1wMysrKQotCXsKLQkJbW5bdG1wM10gPSBpeC0+aV9taW5bdG1wM107Ci0JCW14W3RtcDNdID0gaXgtPmlfbWluW3RtcDNdOwotCX0KLQlheCA9IEFJRkFycmF5U2xpY2UoYSwgaXgtPmlfcmFuaywgbW4sIG14KTsKLSAgICAgICAgaWYgKCBheCAhPSAoQUlGICopTlVMTCApCi0JewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5U2xpY2UgKGZpcnN0KTogIik7Ci0gICAgICAgIAlpZiAoQUlGUHJpbnQoc3Rkb3V0LCAwLCBheCkgIT0gMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICglcykiLCBBSUZfRk9STUFUKGF4KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShheCk7Ci0gICAgICAgIH0KLQllbHNlIAotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVNsaWNlIChmaXJzdCkgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLQkvLyBBSUZBcnJheVNsaWNlIChsYXN0IGVsZW1lbnQpCi0JZm9yICh0bXAzID0gMDsgdG1wMyA8IGl4LT5pX3Jhbms7IHRtcDMrKykKLQl7Ci0JCW1uW3RtcDNdID0gaXgtPmlfbWF4W3RtcDNdOwotCQlteFt0bXAzXSA9IGl4LT5pX21heFt0bXAzXTsKLQl9Ci0JYXggPSBBSUZBcnJheVNsaWNlKGEsIGl4LT5pX3JhbmssIG1uLCBteCk7Ci0gICAgICAgIGlmICggYXggIT0gKEFJRiAqKU5VTEwgKQotCXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVNsaWNlIChsYXN0KTogIik7Ci0gICAgICAgIAlpZiAoQUlGUHJpbnQoc3Rkb3V0LCAwLCBheCkgIT0gMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlByaW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICglcykiLCBBSUZfRk9STUFUKGF4KSk7Ci0gICAgICAgICAgICAgICAgQUlGRnJlZShheCk7Ci0gICAgICAgIH0KLQllbHNlIAotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVNsaWNlIChsYXN0KSBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQotCS8vIEFJRkFycmF5U2xpY2UgKDJuZCB0byAybmQgbGFzdCBvciBhbGwpCi0JZm9yICh0bXAzID0gMDsgdG1wMyA8IGl4LT5pX3Jhbms7IHRtcDMrKykKLQl7Ci0JCWlmIChpeC0+aV9taW5bdG1wM10gPCBpeC0+aV9tYXhbdG1wM10gLSAxKQotCQl7Ci0JCQltblt0bXAzXSA9IGl4LT5pX21pblt0bXAzXSArIDE7Ci0JCQlteFt0bXAzXSA9IGl4LT5pX21heFt0bXAzXSAtIDE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQltblt0bXAzXSA9IGl4LT5pX21pblt0bXAzXTsKLQkJCW14W3RtcDNdID0gaXgtPmlfbWF4W3RtcDNdOwotCQl9Ci0JfQotCWF4ID0gQUlGQXJyYXlTbGljZShhLCBpeC0+aV9yYW5rLCBtbiwgbXgpOwotICAgICAgICBpZiAoIGF4ICE9IChBSUYgKilOVUxMICkKLQl7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlTbGljZSAoMm5kIHRvIDJuZCBsYXN0IG9yIGFsbCk6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgYXgpICE9IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZQcmludCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAoJXMpIiwgQUlGX0ZPUk1BVChheCkpOwotICAgICAgICAgICAgICAgIEFJRkZyZWUoYXgpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlTbGljZSAoMm5kIHRvIDJuZCBsYXN0IG9yIGFsbCkgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLQotCV9haWZfZnJlZShtbik7Ci0JX2FpZl9mcmVlKG14KTsKLQotCX0KLQotCi0JLy8gVGVzdCBBSUZBcnJheVBlcm0gKHRoZSByYW5rIG11c3QgYmUgPiAxKQotCWlmIChmLkFJRkFycmF5UGVybSA9PSAxICYmIGl4LT5pX3JhbmsgPiAxKXsKLQotCWludCAqcGVybTsKLQotCXBlcm0gPSAoaW50ICopIF9haWZfYWxsb2Moc2l6ZW9mKGludCkgKiBpeC0+aV9yYW5rKTsKLQotCWZvciAoIHRtcDMgPSBpeC0+aV9yYW5rLTE7IHRtcDMgPj0gMDsgdG1wMy0tICkKLQkJcGVybVt0bXAzXSA9IGl4LT5pX3JhbmsgLSB0bXAzIC0gMTsKLQotCWlmICggKGF4ID0gQUlGQXJyYXlQZXJtKGEsIHBlcm0pKSA9PSBOVUxMICkKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlQZXJtIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCWVsc2UKLQl7Ci0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5UGVybTogIik7IAotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgYXgpICE9IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZQcmludCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAoJXMpIiwgQUlGX0ZPUk1BVChheCkpOwotICAgICAgICAgICAgICAgIEFJRkZyZWUoYXgpOwotCX0KLQotCV9haWZfZnJlZShwZXJtKTsKLQotCX0KLQotCS8vIFRlc3QgQUlGQXJyYXlFbGVtZW50VG9JbnQKLQl0bXA0ID0gQUlGQXJyYXlJbmRleEluaXQoYSk7Ci0gICAgICAgIGlmICh0bXA0ID09IE5VTEwpCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5kZXhJbml0IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JaWYgKGYuQUlGQXJyYXlFbGVtZW50VG9JbnQgPT0gMSAmJiBBSUZCYXNlVHlwZShhKSA9PSBBSUZfSU5URUdFUiApewotCi0Jd2hpbGUgKHRtcDQtPmlfZmluaXNoZWQgIT0gMSkKLQl7Ci0JCWludCB4OwotCQlpZiAoQUlGQXJyYXlFbGVtZW50VG9JbnQoYSwgdG1wNCwgJngpIDwgMCkKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5RWxlbWVudFRvSW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCQllbHNlCi0JCQlwcmludGYoIlxuXHRBSUZBcnJheUVsZW1lbnRUb0ludDogJWQgKGludCkiLCB4KTsKLQotCQlBSUZBcnJheUluZGV4SW5jKHRtcDQpOwotCX0KLQotICAgICAgICBBSUZBcnJheUluZGV4RnJlZSh0bXA0KTsKLQotCX0KLQotCS8vIFRlc3QgQUlGQXJyYXlFbGVtZW50VG9Mb25nZXN0Ci0JdG1wNCA9IEFJRkFycmF5SW5kZXhJbml0KGEpOwotICAgICAgICBpZiAodG1wNCA9PSBOVUxMKQotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUluZGV4SW5pdCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQotCWlmIChmLkFJRkFycmF5RWxlbWVudFRvTG9uZ2VzdCA9PSAxICYmIEFJRkJhc2VUeXBlKGEpID09IEFJRl9JTlRFR0VSICl7Ci0KLQl3aGlsZSAodG1wNC0+aV9maW5pc2hlZCAhPSAxKQotCXsKLQkJQUlGTE9OR0VTVCB4OwotCQlpZiAoQUlGQXJyYXlFbGVtZW50VG9Mb25nZXN0KGEsIHRtcDQsICZ4KSA8IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUVsZW1lbnRUb0xvbmdlc3QgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0JCWVsc2UKLQkJCXByaW50ZigiXG5cdEFJRkFycmF5RWxlbWVudFRvTG9uZ2VzdDogJWxsZCAoQUlGTE9OR0VTVCkiLCB4KTsKLQotCQlBSUZBcnJheUluZGV4SW5jKHRtcDQpOwotCX0KLQotICAgICAgICBBSUZBcnJheUluZGV4RnJlZSh0bXA0KTsKLQotCX0KLQotCS8vIFRlc3QgQUlGQXJyYXlFbGVtZW50VG9Eb3VibGUKLQl0bXA0ID0gQUlGQXJyYXlJbmRleEluaXQoYSk7Ci0gICAgICAgIGlmICh0bXA0ID09IE5VTEwpCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5kZXhJbml0IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JaWYgKGYuQUlGQXJyYXlFbGVtZW50VG9Eb3VibGUgPT0gMSAmJiBBSUZCYXNlVHlwZShhKSA9PSBBSUZfRkxPQVRJTkcgKXsKLQotCXdoaWxlICh0bXA0LT5pX2ZpbmlzaGVkICE9IDEpCi0JewotCQlkb3VibGUgeDsKLQkJaWYgKEFJRkFycmF5RWxlbWVudFRvRG91YmxlKGEsIHRtcDQsICZ4KSA8IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUVsZW1lbnRUb0RvdWJsZSBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQkJZWxzZQotCQkJcHJpbnRmKCJcblx0QUlGQXJyYXlFbGVtZW50VG9Eb3VibGU6ICVmIChkb3VibGUpIiwgeCk7Ci0KLQkJQUlGQXJyYXlJbmRleEluYyh0bXA0KTsKLQl9Ci0KLSAgICAgICAgQUlGQXJyYXlJbmRleEZyZWUodG1wNCk7Ci0KLQl9Ci0KLQkvLyBUZXN0IEFJRkFycmF5RWxlbWVudFRvRG91Ymxlc3QKLQl0bXA0ID0gQUlGQXJyYXlJbmRleEluaXQoYSk7Ci0gICAgICAgIGlmICh0bXA0ID09IE5VTEwpCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5kZXhJbml0IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JaWYgKGYuQUlGQXJyYXlFbGVtZW50VG9Eb3VibGVzdCA9PSAxICYmIEFJRkJhc2VUeXBlKGEpID09IEFJRl9GTE9BVElORyApewotCi0Jd2hpbGUgKHRtcDQtPmlfZmluaXNoZWQgIT0gMSkKLQl7Ci0JCUFJRkRPVUJMRVNUIHg7Ci0JCWlmIChBSUZBcnJheUVsZW1lbnRUb0RvdWJsZXN0KGEsIHRtcDQsICZ4KSA8IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUVsZW1lbnRUb0RvdWJsZXN0IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCQllbHNlCi0JCXsKLSNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0JCQlwcmludGYoIlxuXHRBSUZBcnJheUVsZW1lbnRUb0RvdWJsZXN0OiAlTGYgKEFJRkRPVUJMRVNUKSIsIHgpOwotI2Vsc2UKLQkJCXByaW50ZigiXG5cdEFJRkFycmF5RWxlbWVudFRvRG91Ymxlc3Q6ICVmIChBSUZET1VCTEVTVCkiLCB4KTsKLSNlbmRpZgotCQl9Ci0KLQkJQUlGQXJyYXlJbmRleEluYyh0bXA0KTsKLQl9Ci0KLSAgICAgICAgQUlGQXJyYXlJbmRleEZyZWUodG1wNCk7Ci0KLQl9Ci0KLQotCS8vIFRlc3QgQUlGQXJyYXlSZWYKLQlpZiAoZi5BSUZBcnJheVJlZiA9PSAxKXsKLQotCWludCAqIGxvYzsKLQotCWxvYyA9IChpbnQgKilfYWlmX2FsbG9jKHNpemVvZihpbnQpICogaXgtPmlfcmFuayk7Ci0KLQlmb3IgKHRtcDEgPSAwOyB0bXAxIDwgaXgtPmlfcmFuazsgdG1wMSsrKQotCQlsb2NbdG1wMV0gPSBpeC0+aV9taW5bdG1wMV07Ci0KLQlheCA9IEFJRkFycmF5UmVmKGEsIGl4LT5pX3JhbmssIGxvYyk7Ci0gICAgICAgIGlmICggYXggIT0gKEFJRiAqKU5VTEwgKQotCXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVJlZiAoZmlyc3QpOiAiKTsKLSAgICAgICAgCWlmIChBSUZQcmludChzdGRvdXQsIDAsIGF4KSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQoYXgpKTsKLSAgICAgICAgICAgICAgICBBSUZGcmVlKGF4KTsKLSAgICAgICAgfQotCWVsc2UgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5UmVmIChmaXJzdCkgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLQlmb3IgKHRtcDEgPSAwOyB0bXAxIDwgaXgtPmlfcmFuazsgdG1wMSsrKQotCQlsb2NbdG1wMV0gPSBpeC0+aV9tYXhbdG1wMV07Ci0KLQlheCA9IEFJRkFycmF5UmVmKGEsIGl4LT5pX3JhbmssIGxvYyk7Ci0gICAgICAgIGlmICggYXggIT0gKEFJRiAqKU5VTEwgKQotCXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheVJlZiAobGFzdCk6ICIpOwotICAgICAgICAJaWYgKEFJRlByaW50KHN0ZG91dCwgMCwgYXgpICE9IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZQcmludCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAoJXMpIiwgQUlGX0ZPUk1BVChheCkpOwotICAgICAgICAgICAgICAgIEFJRkZyZWUoYXgpOwotICAgICAgICB9Ci0JZWxzZSAKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlSZWYgKGxhc3QpIEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JX2FpZl9mcmVlKGxvYyk7Ci0JfQotCi0KLQkvLyBUZXN0IEFJRlNldEFycmF5RGF0YQotCWlmIChmLkFJRlNldEFycmF5RGF0YSAhPSBOVUxMKSB7Ci0KLQlBSUYgKiByZXN1bHQ7Ci0KLQl0bXA0ID0gQUlGQXJyYXlJbmRleEluaXQoYSk7Ci0gICAgICAgCWlmICh0bXA0ID09IE5VTEwpCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRkFycmF5SW5kZXhJbml0IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JaWYgKCAocmVzdWx0ID0gQ29weUFJRihhKSkgPT0gTlVMTCkgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdENvcHlBSUYgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0KLQlpZiAoIGYuQUlGU2V0QXJyYXlEYXRhID09IChBSUYgKikgU0VMRiApCi0JCXRtcDEgPSBBSUZTZXRBcnJheURhdGEocmVzdWx0LCB0bXA0LCByZXN1bHQgKTsKLQllbHNlCi0JCXRtcDEgPSBBSUZTZXRBcnJheURhdGEocmVzdWx0LCB0bXA0LCBmLkFJRlNldEFycmF5RGF0YSApOwotCi0JaWYgKCB0bXAxIDwgMCkgCi0JCWZwcmludGYoc3Rkb3V0LCAiXG5cdEFJRlNldEFycmF5RGF0YSBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQllbHNlCi0JewotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZTZXRBcnJheURhdGE6IFNldCBbMF0gdG8gIik7Ci0JCWlmIChBSUZQcmludChzdGRvdXQsIDAsIGYuQUlGU2V0QXJyYXlEYXRhKSAhPSAwKQotCQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQgRVJST1I6ICVzIiwgQUlGRXJyb3JTdHIoKSk7Ci0gICAgICAgICAgICAgICAJZnByaW50ZihzdGRvdXQsICIgKCVzKTogIiwgQUlGX0ZPUk1BVCgoQUlGICopZi5BSUZTZXRBcnJheURhdGEpKTsKLQotCQlpZiAoQUlGUHJpbnQoc3Rkb3V0LCAwLCByZXN1bHQpICE9IDApCi0JCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZQcmludCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLSAgICAgICAgICAgICAgIAlmcHJpbnRmKHN0ZG91dCwgIiAoJXMpIiwgQUlGX0ZPUk1BVChyZXN1bHQpKTsKLQl9Ci0KLSAgICAgICAJQUlGQXJyYXlJbmRleEZyZWUodG1wNCk7Ci0JfQotCi0KLQkvLyBUZXN0IGVhY2ggb2YgdGhlIGFycmF5IGVsZW1lbnRzCi0JcHJpbnRmKCJcbiIpOwotCXRtcDEgPSAwOwotCXRtcDIgPSAoY2hhciAqKSBfYWlmX2FsbG9jKHNpemVvZihjaGFyKSAqIDEwMCk7Ci0JdG1wNCA9IEFJRkFycmF5SW5kZXhJbml0KGEpOwotICAgICAgICBpZiAodG1wNCA9PSBOVUxMKQotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZBcnJheUluZGV4SW5pdCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLQl3aGlsZSAoIChheCA9IEFJRkFycmF5RWxlbWVudChhLCB0bXA0KSkgIT0gTlVMTCApCi0gICAgICAgIHsKLQkJc3ByaW50Zih0bXAyLCAiXHQgLS0+IEVsZW1lbnQgJWQiLCB0bXAxKTsKLQkJQUlGVGVzdChOVUxMLCBheCwgdG1wMiwgZik7Ci0JICAgICAgICBBSUZGcmVlKGF4KTsKLQkJdG1wMSsrOwotCQlBSUZBcnJheUluZGV4SW5jKHRtcDQpOwotCX0gIAotCi0JaWYgKCBheCA9PSBOVUxMICYmIEFJRkVycm9yKCkgIT0gQUlGRVJSX05PRVJSICkKLQkJZnByaW50ZihzdGRvdXQsICJcblx0QUlGQXJyYXlFbGVtZW50IEVSUk9SOiAlcyIsIEFJRkVycm9yU3RyKCkpOwotCi0JX2FpZl9mcmVlKHRtcDIpOwotICAgICAgICBBSUZBcnJheUluZGV4RnJlZSh0bXA0KTsKLQotCi0KLSAgICAgICAgQUlGQXJyYXlJbmRleEZyZWUoaXgpOwotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfdGVzdF9wb2ludGVyKEFJRiAqYSwgVGVzdEZsYWdzIGYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl90ZXN0X3JlZ2lvbihBSUYgKmEsIFRlc3RGbGFncyBmKQotewotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfdGVzdF9zdHJ1Y3QoQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3Rlc3RfbmFtZShBSUYgKmEsIFRlc3RGbGFncyBmKQotewotCXJldHVybiAwOwotfQotCi1pbnQKLV9haWZfdGVzdF9yZWZlcmVuY2UoQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3Rlc3Rfc3RyaW5nKEFJRiAqYSwgVGVzdEZsYWdzIGYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotX2FpZl90ZXN0X2VudW0oQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1fYWlmX3Rlc3RfdW5pb24oQUlGICphLCBUZXN0RmxhZ3MgZikKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQKLUFJRlRlc3RJbnQoY2hhciAqdGl0bGUsIEFJRiAqYSwgY2hhciAqbXNnLCBUZXN0RmxhZ3MgZikKLXsKLQlpbnQgcmV0OwotCi0gICAgICAgCWlmICggdGl0bGUgIT0gTlVMTCApCi0JCWZwcmludGYoc3Rkb3V0LCAiJXMgPiAiLCB0aXRsZSk7Ci0KLSAgICAgICAJaWYgKCBtc2cgIT0gTlVMTCApCi0gICAgICAgIAlmcHJpbnRmKHN0ZG91dCwgIiVzOiIsIG1zZyk7Ci0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblx0QUlGUHJpbnQ6ICIpOwotICAgICAgICBpZiAoQUlGUHJpbnQoc3Rkb3V0LCAwLCBhKSAhPSAwKQotCQlmcHJpbnRmKHN0ZG91dCwgIlxuXHRBSUZQcmludCBFUlJPUjogJXMiLCBBSUZFcnJvclN0cigpKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIgKCVzKSIsIEFJRl9GT1JNQVQoYSkpOwotCi0JcmV0ID0gX2FpZl90ZXN0X2ludChhLCBmKTsKLQotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvdGVzdGFpZi5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvdGVzdGFpZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTllMjBjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3Rlc3RhaWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBUZXN0RmxhZ3MgYXJlIHVzZWQgc28gdGhhdCBlYWNoIHBhcnRpY3VsYXIgdGVzdCBjYW4gYmUgdGFpbG9yZWQKLSAqIHRvIGJlIHRlc3RlZCBvbmx5IHdpdGggc29tZSBBSUYgZnVuY3Rpb25zLgotICoKLSAqIFRoZXNlIGFyZSB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBjYW5ub3QgYmUgInR1cm5lZCBvZmYiIGJ5IFRlc3RGbGFncwotICogc2luY2UgdGhleSBhcmUgdmVyeSBlc3NlbnRpYWwgdG8gdGVzdCBvdGhlciBmdW5jdGlvbnMuCi0gKgotICogQUlGUHJpbnQKLSAqIENvcHlBSUYKLSAqIEFJRkFycmF5SW5kZXhJbml0Ci0gKiBBSUZBcnJheUVsZW1lbnQKLSAqIEFJRkFycmF5SW5kZXhJbmMKLSAqIEFJRkFycmF5SW5kZXhGcmVlCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICovCi0KLQotI2RlZmluZSBTRUxGCTB4MDEgCS8qIHNlZSB0aGUgbm90ZSBiZWxvdyAqLwotCi10eXBlZGVmIHN0cnVjdAotewotCS8qIEZsYWdzCi0JICogSWYgaXQgaXMgMSwgdGhlIHRlc3QgZm9yIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGV4ZWN1dGVkICovCi0KLQlpbnQgCUFJRklzWmVybzsKLQlpbnQgCUFJRkNvbXBhcmU7Ci0JaW50IAlBSUZUeXBlQ29tcGFyZTsKLQotCWludCAJQUlGQXJyYXlSYW5rOwotCWludCAJQUlGQXJyYXlJbmZvOwotCWludCAJQUlGQXJyYXlCb3VuZHM7Ci0JaW50IAlBSUZBcnJheUluZGV4VHlwZTsKLQlpbnQgCUFJRkFycmF5TWluSW5kZXg7Ci0JaW50IAlBSUZBcnJheU1heEluZGV4OwotCWludCAJQUlGQXJyYXlTaXplOwotCWludCAJQUlGQXJyYXlTbGljZTsKLQlpbnQgCUFJRkFycmF5UGVybTsKLQlpbnQgCUFJRkFycmF5RWxlbWVudFRvSW50OwotCWludCAJQUlGQXJyYXlFbGVtZW50VG9Mb25nZXN0OwotCWludCAJQUlGQXJyYXlFbGVtZW50VG9Eb3VibGU7Ci0JaW50IAlBSUZBcnJheUVsZW1lbnRUb0RvdWJsZXN0OwotCWludCAJQUlGQXJyYXlSZWY7Ci0KLQlpbnQgCUFJRk5lZzsKLQlpbnQgCUFJRk5vdDsKLQotCS8qIEZvciBzb21lIGZ1bmN0aW9ucywgd2UgY2FuIHBhc3MgYSBzZWNvbmQgQUlGIHRvIGJlIHRlc3RlZCB3aXRoLgotCSAqIElmIGl0IGlzIE5VTEwsIHRoZSB0ZXN0IGZvciB0aGUgZnVuY3Rpb24gd2lsbCBub3QgYmUgZXhlY3V0ZWQKLQkgKiBJZiBpdCBpcyBTRUxGLCB0aGUgZmlyc3QgQUlGIGlzIHRoZSBzYW1lIHdpdGggdGhlIHNlY29uZCBBSUYgKi8KLQotCUFJRiAqIAlBSUZEaWZmOwotCUFJRiAqIAlBSUZBbmQ7Ci0JQUlGICogCUFJRk9yOwotCi0JQUlGICogCUFJRkFkZDsKLQlBSUYgKiAJQUlGU3ViOwotCUFJRiAqIAlBSUZNdWw7Ci0JQUlGICogCUFJRkRpdjsKLQlBSUYgKiAJQUlGUmVtOwotCi0JQUlGICogCUFJRlNldEFycmF5RGF0YTsKLQotCS8qIEZvciBzb21lIGZ1bmN0aW9ucywgd2UgY2FuIGFsc28gc3BlY2lmeSB0aGUgJ2RlcHRoJwotCSAqIG9mIHRoZSB0cmF2ZXJzYWwgKi8KLQotCWludAlEX0FJRlByaW50OwotCi19IFRlc3RGbGFnczsKLQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi91dGlsLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL2xpYmFpZi91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGQ3ODIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIFV0aWxpdHkgcm91dGluZXMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUJPGNvbmZpZy5oPgotI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KLQotI2luY2x1ZGUJPHN0ZGlvLmg+Ci0jaW5jbHVkZQk8c3RkbGliLmg+Ci0KLXZvaWQgKgotX2FpZl9hbGxvYyhpbnQgc2l6ZSkKLXsKLQl2b2lkICoJbSA9IG1hbGxvYyhzaXplKTsKLQotCWlmICggbSA9PSAodm9pZCAqKU5VTEwgKQotCQlwZXJyb3IoIm1hbGxvYyBlcnJvciIpOwotCi0JcmV0dXJuIG07Ci19Ci0KLXZvaWQgKgotX2FpZl9yZXNpemUodm9pZCAqbSwgaW50IHMpCi17Ci0JaWYgKCBtID09ICh2b2lkICopTlVMTCApCi0JCXJldHVybiBfYWlmX2FsbG9jKHMpOwotCi0JbSA9IHJlYWxsb2MobSwgcyk7Ci0KLQlpZiAoIG0gPT0gKHZvaWQgKilOVUxMICkKLQkJcGVycm9yKCJyZWFsbG9jIGVycm9yIik7Ci0KLQlyZXR1cm4gbTsKLX0KLQotdm9pZAotX2FpZl9mcmVlKHZvaWQgKm0pCi17Ci0JaWYgKCBtID09ICh2b2lkICopTlVMTCApCi0JewotCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGZyZWVpbmcgTlVMTCBwb2ludGVyLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkodm9pZClmcmVlKG0pOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvdmVyc2lvbi5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9saWJhaWYvdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JlOTA4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbGliYWlmL3ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBieSBHdWFyZHNvZnQgUHR5IEx0ZC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqLwotCi0jZGVmaW5lIExJQkFJRl9WRVJTSU9OCSIxLjAuNSIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbHRtYWluLnNoIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzFkMjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9sdG1haW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NTMwICswLDAgQEAKLSMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1iYXNlbmFtZT0icyxeLiovLCxnIgotCi0jIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKLSMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCi0jIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAotIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCi0jIGZ1bmN0aW9uLgotcHJvZ3BhdGg9IiQwIgotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKLXByb2duYW1lPWBlY2hvICIkcHJvZ3BhdGgiIHwgJFNFRCAkYmFzZW5hbWVgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1FWElUX1NVQ0NFU1M9MAotRVhJVF9GQUlMVVJFPTEKLQotUFJPR1JBTT1sdG1haW4uc2gKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjUuMjAKLVRJTUVTVEFNUD0iICgxLjEyMjAuMi4yODcgMjAwNS8wOC8zMSAxODo1NDoxNSkiCi0KLSMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKLSMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWZpCi0KLSMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJGVjaG8gd2lsbCB3b3JrLgotICBleGVjICRTSEVMTCAiJHByb2dwYXRoIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0ICRFWElUX1NVQ0NFU1MKLWZpCi0KLWRlZmF1bHRfbW9kZT0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLW1hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKLW1rZGlyPSJta2RpciIKLW12PSJtdiAtZiIKLXJtPSJybSAtZiIKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQotY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgotIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCi0gICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgotICBTUDJOTD0ndHIgXDA0MCBcMDEyJwotICBOTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCi0gIDs7Ci0gKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCi0gIFNQMk5MPSd0ciBcMTAwIFxuJwotICBOTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKLSAgOzsKLWVzYWMKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKLWx0X25sPScKLScKLUlGUz0iIAkkbHRfbmwiCi0KLWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgotICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gICRlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0ICRFWElUX0ZBSUxVUkUKLWZpCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLW1vZGU9JGRlZmF1bHRfbW9kZQotbm9ub3B0PQotcHJldj0KLXByZXZvcHQ9Ci1ydW49Ci1zaG93PSIkZWNobyIKLXNob3dfaGVscD0KLWV4ZWN1dGVfZGxmaWxlcz0KLWxvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKLW8ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9uczoKLSMgVGhpcyBzZWVtcyB0byBiZSB0aGUgYmVzdCBwbGFjZSBmb3IgdGhlbQotCi0jIGZ1bmNfd2luMzJfbGliaWQgYXJnCi0jIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKLSMKLSMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicwotIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKLSMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgotZnVuY193aW4zMl9saWJpZCAoKQotewotICB3aW4zMl9saWJpZF90eXBlPSJ1bmtub3duIgotICB3aW4zMl9maWxlcmVzPWBmaWxlIC1MICQxIDI+L2Rldi9udWxsYAotICBjYXNlICR3aW4zMl9maWxlcmVzIGluCi0gICphclwgYXJjaGl2ZVwgaW1wb3J0XCBsaWJyYXJ5KikgIyBkZWZpbml0ZWx5IGltcG9ydAotICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCIKLSAgICA7OwotICAqYXJcIGFyY2hpdmUqKSAjIGNvdWxkIGJlIGFuIGltcG9ydCwgb3Igc3RhdGljCi0gICAgaWYgZXZhbCAkT0JKRFVNUCAtZiAkMSB8ICRTRUQgLWUgJzEwcScgMj4vZGV2L251bGwgfCBcCi0gICAgICAkRUdSRVAgLWUgJ2ZpbGUgZm9ybWF0IHBlLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycgPi9kZXYvbnVsbCA7IHRoZW4KLSAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8IFwKLQlzZWQgLW4gLWUgJzEsMTAwey8gSSAve3g7L2ltcG9ydC8he3MvXi9pbXBvcnQvO2g7cDt9O3g7fTt9J2AKLSAgICAgIGlmIHRlc3QgIlgkd2luMzJfbm1yZXMiID0gIlhpbXBvcnQiIDsgdGhlbgotICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCi0gICAgICBlbHNlCi0gICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyIKLSAgICAgIGZpCi0gICAgZmkKLSAgICA7OwotICAqRExMKikKLSAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgotICAgIDs7Ci0gICpleGVjdXRhYmxlKikgIyBidXQgc2hlbGwgc2NyaXB0cyBhcmUgImV4ZWN1dGFibGUiIHRvby4uLgotICAgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgICAqTVNcIFdpbmRvd3NcIFBFXCBJbnRlbCopCi0gICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICAkZWNobyAkd2luMzJfbGliaWRfdHlwZQotfQotCi0KLSMgZnVuY19pbmZlcl90YWcgYXJnCi0jIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKLSMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCi0jIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCi0jIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KLSMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCi1mdW5jX2luZmVyX3RhZyAoKQotewotICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCi0gICAgICBDQ19xdW90ZWQ9Ci0gICAgICBmb3IgYXJnIGluICRDQzsgZG8KLQljYXNlICRhcmcgaW4KLQkgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkYXJnIgotICAgICAgZG9uZQotICAgICAgY2FzZSAkQCBpbgotICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKLSAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgotICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJGVjaG8gJENDYCAiKiB8ICJgJGVjaG8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkZWNobyAkQ0NfcXVvdGVkYCAiKiB8ICJgJGVjaG8gJENDX3F1b3RlZGAgIiopIDs7Ci0gICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAotICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgotICAgICAgKikKLQlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCi0JICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KLQkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKLQkgICAgQ0NfcXVvdGVkPQotCSAgICBmb3IgYXJnIGluICRDQzsgZG8KLQkgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotCSAgICBjYXNlICRhcmcgaW4KLQkgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgICAgICBhcmc9IlwiJGFyZ1wiIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRhcmciCi0JICBkb25lCi0JICAgIGNhc2UgIiRAICIgaW4KLQkgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkZWNobyAkQ0NgICIqIHwgImAkZWNobyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRlY2hvICRDQ19xdW90ZWRgICIqIHwgImAkZWNobyAkQ0NfcXVvdGVkYCAiKikKLQkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcwotCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCi0JICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KLQkgICAgICB0YWduYW1lPSR6Ci0JICAgICAgYnJlYWsKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCWRvbmUKLQkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgotCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKLQkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KLQlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKLQkgICRlY2hvICIkbW9kZW5hbWU6IHNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0jICAgICAgICBlbHNlCi0jICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHVzaW5nICR0YWduYW1lIHRhZ2dlZCBjb25maWd1cmF0aW9uIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotfQotCi0KLSMgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgZGlyIG9sZGxpYgotZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgKCkKLXsKLSAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAotICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKLQotICAgICRzaG93ICIoY2QgJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4ICRmX2V4X2FuX2FyX29sZGxpYikiCi0gICAgJHJ1biBldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcJGZfZXhfYW5fYXJfb2xkbGliKSIgfHwgZXhpdCAkPwotICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgIDoKLSAgICBlbHNlCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBFUlJPUjogb2JqZWN0IG5hbWUgY29uZmxpY3RzOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotfQotCi0jIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyBnZW50b3Agb2xkbGliIC4uLgotZnVuY19leHRyYWN0X2FyY2hpdmVzICgpCi17Ci0gICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0Ci0gICAgbXlfb2xkbGlicz0kezErIiRAIn0KLSAgICBteV9vbGRvYmpzPSIiCi0gICAgbXlfeGxpYj0iIgotICAgIG15X3hhYnM9IiIKLSAgICBteV94ZGlyPSIiCi0gICAgbXlfc3RhdHVzPSIiCi0KLSAgICAkc2hvdyAiJHtybX1yICRteV9nZW50b3AiCi0gICAgJHJ1biAke3JtfXIgIiRteV9nZW50b3AiCi0gICAgJHNob3cgIiRta2RpciAkbXlfZ2VudG9wIgotICAgICRydW4gJG1rZGlyICIkbXlfZ2VudG9wIgotICAgIG15X3N0YXR1cz0kPwotICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG15X2dlbnRvcCI7IHRoZW4KLSAgICAgIGV4aXQgJG15X3N0YXR1cwotICAgIGZpCi0KLSAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KLSAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLSAgICAgIGNhc2UgJG15X3hsaWIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OwotCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OwotICAgICAgZXNhYwotICAgICAgbXlfeGxpYj1gJGVjaG8gIlgkbXlfeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgbXlfeGRpcj0iJG15X2dlbnRvcC8kbXlfeGxpYiIKLQotICAgICAgJHNob3cgIiR7cm19ciAkbXlfeGRpciIKLSAgICAgICRydW4gJHtybX1yICIkbXlfeGRpciIKLSAgICAgICRzaG93ICIkbWtkaXIgJG15X3hkaXIiCi0gICAgICAkcnVuICRta2RpciAiJG15X3hkaXIiCi0gICAgICBzdGF0dXM9JD8KLSAgICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG15X3hkaXIiOyB0aGVuCi0JZXhpdCAkc3RhdHVzCi0gICAgICBmaQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi1kYXJ3aW4qKQotCSRzaG93ICJFeHRyYWN0aW5nICRteV94YWJzIgotCSMgRG8gbm90IGJvdGhlciBkb2luZyBhbnl0aGluZyBpZiBqdXN0IGEgZHJ5IHJ1bgotCWlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICBkYXJ3aW5fb3JpZ19kaXI9YHB3ZGAKLQkgIGNkICRteV94ZGlyIHx8IGV4aXQgJD8KLQkgIGRhcndpbl9hcmNoaXZlPSRteV94YWJzCi0JICBkYXJ3aW5fY3VyZGlyPWBwd2RgCi0JICBkYXJ3aW5fYmFzZV9hcmNoaXZlPWAkZWNobyAiWCRkYXJ3aW5fYXJjaGl2ZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGFyd2luX2FyY2hlcz1gbGlwbyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRFR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsYAotCSAgaWYgdGVzdCAtbiAiJGRhcndpbl9hcmNoZXMiOyB0aGVuIAotCSAgICBkYXJ3aW5fYXJjaGVzPWBlY2hvICIkZGFyd2luX2FyY2hlcyIgfCAkU0VEIC1lICdzLy4qYXJlOi8vJ2AKLQkgICAgZGFyd2luX2FyY2g9Ci0JICAgICRzaG93ICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKLQkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCi0JICAgICAgbWtkaXIgLXAgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCi0JICAgICAgbGlwbyAtdGhpbiAkZGFyd2luX2FyY2ggLW91dHB1dCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IiAiJHtkYXJ3aW5fYXJjaGl2ZX0iCi0JICAgICAgY2QgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCi0JICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgImBwd2RgIiAiJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgICBjZCAiJGRhcndpbl9jdXJkaXIiCi0JICAgICAgJHJtICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCi0JICAgIGRvbmUgIyAkZGFyd2luX2FyY2hlcwotICAgICAgIyMgT2theSBub3cgd2UgaGF2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKLQkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50fCB4YXJncyBiYXNlbmFtZSB8IHNvcnQgLXUgfCAkTkwyU1BgCi0JICAgIGRhcndpbl9maWxlPQotCSAgICBkYXJ3aW5fZmlsZXM9Ci0JICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbwotCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgJE5MMlNQYAotCSAgICAgIGxpcG8gLWNyZWF0ZSAtb3V0cHV0ICIkZGFyd2luX2ZpbGUiICRkYXJ3aW5fZmlsZXMKLQkgICAgZG9uZSAjICRkYXJ3aW5fZmlsZWxpc3QKLQkgICAgJHtybX1yIHVuZmF0LSQkCi0JICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgotCSAgZWxzZQotCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKLSAJICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgotCSAgZmkgIyAkZGFyd2luX2FyY2hlcwotCWZpICMgJHJ1bgotCTs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0gICAgZG9uZQotICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgotfQotIyBFbmQgb2YgU2hlbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEYXJ3aW4gc3Vja3MKLWV2YWwgc3RkX3NocmV4dD1cIiRzaHJleHRfY21kc1wiCi0KLSMgUGFyc2Ugb3VyIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuCi13aGlsZSB0ZXN0ICIkIyIgLWd0IDAKLWRvCi0gIGFyZz0iJDEiCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYXJnIGluCi0gIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGNhc2UgJHByZXYgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJGFyZyIKLSAgICAgIDs7Ci0gICAgdGFnKQotICAgICAgdGFnbmFtZT0iJGFyZyIKLSAgICAgIHByZXNlcnZlX2FyZ3M9IiR7cHJlc2VydmVfYXJnc309JGFyZyIKLQotICAgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCi0gICAgICBjYXNlICR0YWduYW1lIGluCi0gICAgICAqWyEtX0EtWmEtejAtOSwvXSopCi0JJGVjaG8gIiRwcm9nbmFtZTogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiIDE+JjIKLQlleGl0ICRFWElUX0ZBSUxVUkUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICR0YWduYW1lIGluCi0gICAgICBDQykKLQkjIERvbid0IHRlc3QgZm9yIHRoZSAiZGVmYXVsdCIgQyB0YWcsIGFzIHdlIGtub3csIGl0J3MgdGhlcmUsIGJ1dAotCSMgbm90IHNwZWNpYWxseSBtYXJrZWQuCi0JOzsKLSAgICAgICopCi0JaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCi0JICB0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKLQkgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCi0JICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR0YWduYW1lJyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR0YWduYW1lJyQvcCcgPCAkcHJvZ3BhdGhgIgotCWVsc2UKLQkgICRlY2hvICIkcHJvZ25hbWU6IGlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIiAxPiYyCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAiJHByZXY9XCRhcmciCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIHByZXY9Ci0gICAgcHJldm9wdD0KLSAgICBjb250aW51ZQotICBmaQotCi0gICMgSGF2ZSB3ZSBzZWVuIGEgbm9uLW9wdGlvbmFsIGFyZ3VtZW50IHlldD8KLSAgY2FzZSAkYXJnIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgJGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKLSAgICAkZWNobwotICAgICRlY2hvICJDb3B5cmlnaHQgKEMpIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiIKLSAgICAkZWNobyAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8iCi0gICAgJGVjaG8gIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLSAgICBleGl0ICQ/Ci0gICAgOzsKLQotICAtLWNvbmZpZykKLSAgICAke1NFRH0gLWUgJzEsL14jICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRy9kJyAtZSAnL14jICMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkcHJvZ3BhdGgKLSAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgotICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbwotICAgICAgJHtTRUR9IC1uIC1lICIvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC9wIiA8ICIkcHJvZ3BhdGgiCi0gICAgZG9uZQotICAgIGV4aXQgJD8KLSAgICA7OwotCi0gIC0tZGVidWcpCi0gICAgJGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgotICAgIDs7Ci0KLSAgLS1kcnktcnVuIHwgLW4pCi0gICAgcnVuPToKLSAgICA7OwotCi0gIC0tZmVhdHVyZXMpCi0gICAgJGVjaG8gImhvc3Q6ICRob3N0IgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgJGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICRlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICAkZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKLQotICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7Ci0gIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OwotCi0gIC0tcHJlc2VydmUtZHVwLWRlcHMpIGR1cGxpY2F0ZV9kZXBzPSJ5ZXMiIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRhcmciCi0gICAgOzsKLQotICAtLXRhZykgcHJldm9wdD0iLS10YWciIHByZXY9dGFnIDs7Ci0gIC0tdGFnPSopCi0gICAgc2V0IHRhZyAiJG9wdGFyZyIgJHsxKyIkQCJ9Ci0gICAgc2hpZnQKLSAgICBwcmV2PXRhZwotICAgIHByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzIC0tdGFnIgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0ICRFWElUX0ZBSUxVUkUKLWZpCi0KLSMgSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgaW4gYW55IG9mIHRoZSBhY3Rpb25zLCB0aGUgY29tbWFuZCBpbiBpdAotIyB3aWxsIGJlIGV4ZWNlZCBhdCB0aGUgZW5kLiAgVGhpcyBwcmV2ZW50cyBoZXJlLWRvY3VtZW50cyBmcm9tIGJlaW5nCi0jIGxlZnQgb3ZlciBieSBzaGVsbHMuCi1leGVjX2NtZD0KLQotaWYgdGVzdCAteiAiJHNob3dfaGVscCI7IHRoZW4KLQotICAjIEluZmVyIHRoZSBvcGVyYXRpb24gbW9kZS4KLSAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0gICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbmZlcnJpbmcgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGlzIGRlcHJlY2F0ZWQuIiAxPiYyCi0gICAgJGVjaG8gIioqKiBGdXR1cmUgdmVyc2lvbnMgb2YgTGlidG9vbCB3aWxsIHJlcXVpcmUgLS1tb2RlPU1PREUgYmUgc3BlY2lmaWVkLiIgMT4mMgotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgICpjYyB8IGNjKiB8ICorKyB8IGdjYyogfCAqLWdjYyogfCBnKysqIHwgeGxjKikKLSAgICAgIG1vZGU9bGluawotICAgICAgZm9yIGFyZwotICAgICAgZG8KLQljYXNlICRhcmcgaW4KLQktYykKLQkgICBtb2RlPWNvbXBpbGUKLQkgICBicmVhawotCSAgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICAqZGIgfCAqZGJ4IHwgKnN0cmFjZSB8ICp0cnVzcykKLSAgICAgIG1vZGU9ZXhlY3V0ZQotICAgICAgOzsKLSAgICAqaW5zdGFsbCp8Y3B8bXYpCi0gICAgICBtb2RlPWluc3RhbGwKLSAgICAgIDs7Ci0gICAgKnJtKQotICAgICAgbW9kZT11bmluc3RhbGwKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCi0gICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKLQotICAgICAgIyBKdXN0IHVzZSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gbW9kZS4KLSAgICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQotICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgotICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgotICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgotICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICBmaQotCi0gICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KLSAgZ2VuZXJpY19oZWxwPSIkaGVscCIKLSAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KLSAgY2FzZSAkbW9kZSBpbgotICAjIGxpYnRvb2wgY29tcGlsZSBtb2RlCi0gIGNvbXBpbGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogY29tcGlsZSIKLSAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgotICAgIGJhc2VfY29tcGlsZT0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IiAgIyAgYWx3YXlzIGtlZXAgYSBub24tZW1wdHkgdmFsdWUgaW4gInNyY2ZpbGUiCi0gICAgc3VwcHJlc3Nfb3B0PXllcwotICAgIHN1cHByZXNzX291dHB1dD0KLSAgICBhcmdfbW9kZT1ub3JtYWwKLSAgICBsaWJvYmo9Ci0gICAgbGF0ZXI9Ci0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgJGFyZ19tb2RlIGluCi0gICAgICBhcmcgICkKLQkjIGRvIG5vdCAiY29udGludWUiLiAgSW5zdGVhZCwgYWRkIHRoaXMgdG8gYmFzZV9jb21waWxlCi0JbGFzdGFyZz0iJGFyZyIKLQlhcmdfbW9kZT1ub3JtYWwKLQk7OwotCi0gICAgICB0YXJnZXQgKQotCWxpYm9iaj0iJGFyZyIKLQlhcmdfbW9kZT1ub3JtYWwKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIG5vcm1hbCApCi0JIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotCWNhc2UgJGFyZyBpbgotCS1vKQotCSAgaWYgdGVzdCAtbiAiJGxpYm9iaiIgOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBhcmdfbW9kZT10YXJnZXQKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLXN0YXRpYyB8IC1wcmVmZXItcGljIHwgLXByZWZlci1ub24tcGljKQotCSAgbGF0ZXI9IiRsYXRlciAkYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0KLQktbm8tc3VwcHJlc3MpCi0JICBzdXBwcmVzc19vcHQ9bm8KLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JLVhjb21waWxlcikKLQkgIGFyZ19tb2RlPWFyZyAgIyAgdGhlIG5leHQgb25lIGdvZXMgaW50byB0aGUgImJhc2VfY29tcGlsZSIgYXJnIGxpc3QKLQkgIGNvbnRpbnVlICAgICAgIyAgVGhlIGN1cnJlbnQgInNyY2ZpbGUiIHdpbGwgZWl0aGVyIGJlIHJldGFpbmVkIG9yCi0JICA7OyAgICAgICAgICAgICMgIHJlcGxhY2VkIGxhdGVyLiAgSSB3b3VsZCBndWVzcyB0aGF0IHdvdWxkIGJlIGEgYnVnLgotCi0JLVdjLCopCi0JICBhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXi1XYywvLyJgCi0JICBsYXN0YXJnPQotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0gCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLQkgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotCSAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQotCSAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotCSAgICBjYXNlICRhcmcgaW4KLQkgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgICAgICBhcmc9IlwiJGFyZ1wiIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgbGFzdGFyZz0iJGxhc3RhcmcgJGFyZyIKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQotCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCi0JICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCSogKQotCSAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgotCSAgIyBUaGUgcHJldmlvdXMgInNyY2ZpbGUiIGJlY29tZXMgdGhlIGN1cnJlbnQgYXJndW1lbnQuCi0JICAjCi0JICBsYXN0YXJnPSIkc3JjZmlsZSIKLQkgIHNyY2ZpbGU9IiRhcmciCi0JICA7OwotCWVzYWMgICMgIGNhc2UgJGFyZwotCTs7Ci0gICAgICBlc2FjICAgICMgIGNhc2UgJGFyZ19tb2RlCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCi0gICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgY2FzZSAkbGFzdGFyZyBpbgotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKLSAgICAgICMgaW4gc2NhbiBzZXRzLCBhbmQgc29tZSBTdW5PUyBrc2ggbWlzdHJlYXQgYmFja3NsYXNoLWVzY2FwaW5nCi0gICAgICAjIGluIHNjYW4gc2V0cyAod29ya2VkIGFyb3VuZCB3aXRoIHZhcmlhYmxlIGV4cGFuc2lvbiksCi0gICAgICAjIGFuZCBmdXJ0aGVybW9yZSBjYW5ub3QgaGFuZGxlICd8JyAnJicgJygnICcpJyBpbiBzY2FuIHNldHMgCi0gICAgICAjIGF0IGFsbCwgc28gd2Ugc3BlY2lmeSB0aGVtIHNlcGFyYXRlbHkuCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgotICAgIGRvbmUgIyBmb3IgYXJnCi0KLSAgICBjYXNlICRhcmdfbW9kZSBpbgotICAgIGFyZykKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgOzsKLSAgICB0YXJnZXQpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgotICAgICAgWyAteiAiJGxpYm9iaiIgXSAmJiBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KLSAgICAjIElmIHRoZSB1c2VyIHNwZWNpZmllcyAtbyBmaWxlLm8sIGl0IGlzIHJlcGxhY2VkIHdpdGggZmlsZS5sbwotICAgIHhmb3JtPSdbY0NGU2lmbXNvXScKLSAgICBjYXNlICRsaWJvYmogaW4KLSAgICAqLmFkYSkgeGZvcm09YWRhIDs7Ci0gICAgKi5hZGIpIHhmb3JtPWFkYiA7OwotICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKLSAgICAqLmFzbSkgeGZvcm09YXNtIDs7Ci0gICAgKi5jKyspIHhmb3JtPWMrKyA7OwotICAgICouY2MpIHhmb3JtPWNjIDs7Ci0gICAgKi5paSkgeGZvcm09aWkgOzsKLSAgICAqLmNsYXNzKSB4Zm9ybT1jbGFzcyA7OwotICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKLSAgICAqLmN4eCkgeGZvcm09Y3h4IDs7Ci0gICAgKi5mOTApIHhmb3JtPWY5MCA7OwotICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKLSAgICAqLmphdmEpIHhmb3JtPWphdmEgOzsKLSAgICBlc2FjCi0KLSAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCi0KLSAgICBjYXNlICRsaWJvYmogaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQotCi0gICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcHJlZmVyLXBpYykKLQlwaWNfbW9kZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1wcmVmZXItbm9uLXBpYykKLQlwaWNfbW9kZT1ubwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBxbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgJHFsaWJvYmogaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCXFsaWJvYmo9IlwiJHFsaWJvYmpcIiIgOzsKLSAgICBlc2FjCi0gICAgdGVzdCAiWCRsaWJvYmoiICE9ICJYJHFsaWJvYmoiIFwKLQkmJiAkZWNobyAiWCRsaWJvYmoiIHwgZ3JlcCAnW11+I14qe307PD4/IiciJyInIAkmKCl8YCRbXScgXAotCSYmICRlY2hvICIkbW9kZW5hbWU6IGxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCi0gICAgb2JqbmFtZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgeGRpcj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KLSAgICAgIHhkaXI9Ci0gICAgZWxzZQotICAgICAgeGRpcj0keGRpci8KLSAgICBmaQotICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKLQotICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCi0gICAgZmkKLQotICAgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0gICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0KLSAgICAjIE9uIEN5Z3dpbiB0aGVyZSdzIG5vICJyZWFsIiBQSUMgZmxhZyBzbyB3ZSBtdXN0IGJ1aWxkIGJvdGggb2JqZWN0IHR5cGVzCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCi0gICAgICBwaWNfbW9kZT1kZWZhdWx0Ci0gICAgICA7OwotICAgIGVzYWMKLSAgICBpZiB0ZXN0ICIkcGljX21vZGUiID0gbm8gJiYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotICAgICAgIyBub24tUElDIGNvZGUgaW4gc2hhcmVkIGxpYnJhcmllcyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICBwaWNfbW9kZT1kZWZhdWx0Ci0gICAgZmkKLQotICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCi0gICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCi0gICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgotICAgICAgb3V0cHV0X29iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuW14uXSokJSUnYC4ke29iamV4dH0KLSAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgotICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmogJGxvY2tmaWxlIgotICAgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0gICAgZWxzZQotICAgICAgb3V0cHV0X29iaj0KLSAgICAgIG5lZWRfbG9ja3M9bm8KLSAgICAgIGxvY2tmaWxlPQotICAgIGZpCi0KLSAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAotICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KLSAgICAgIHVudGlsICRydW4gbG4gIiRwcm9ncGF0aCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCi0JJHNob3cgIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgotCXNsZWVwIDIKLSAgICAgIGRvbmUKLSAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KLSAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KLQkkZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJHNyY2ZpbGUiID4gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKLSAgICBxc3JjZmlsZT1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAkcXNyY2ZpbGUgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotICAgICAgcXNyY2ZpbGU9IlwiJHFzcmNmaWxlXCIiIDs7Ci0gICAgZXNhYwotCi0gICAgJHJ1biAkcm0gIiRsaWJvYmoiICIke2xpYm9ian1UIgotCi0gICAgIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKLSAgICAjIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgotICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+ICR7bGlib2JqfVQgPDxFT0YKLSMgJGxpYm9iaiAtIGEgbGlidG9vbCBvYmplY3QgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKLSMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgotCi0jIE5hbWUgb2YgdGhlIFBJQyBvYmplY3QuCi1FT0YKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0gbm87IHRoZW4KLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCi0gICAgICBlbHNlCi0JIyBEb24ndCBidWlsZCBQSUMgY29kZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAhIC1kICIke3hkaXJ9JG9iamRpciI7IHRoZW4KLQkkc2hvdyAiJG1rZGlyICR7eGRpcn0kb2JqZGlyIgotCSRydW4gJG1rZGlyICR7eGRpcn0kb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAiJHN0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIke3hkaXJ9JG9iamRpciI7IHRoZW4KLQkgIGV4aXQgJHN0YXR1cwotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KLQkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkbG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICRydW4gJHJtICIkbG9iaiIgIiRvdXRwdXRfb2JqIgotCi0gICAgICAkc2hvdyAiJGNvbW1hbmQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCi0JJGVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKLSAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkbG9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbG9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgUElDIG9iamVjdCB0byB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KLSAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCi1waWNfb2JqZWN0PSckb2JqZGlyLyRvYmpuYW1lJwotCi1FT0YKLQotICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgotICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAjIE5vIFBJQyBvYmplY3Qgc28gaW5kaWNhdGUgaXQgZG9lc24ndCBleGlzdCBpbiB0aGUgbGlidG9vbAotICAgICAgIyBvYmplY3QgZmlsZS4KLSAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCi1waWNfb2JqZWN0PW5vbmUKLQotRU9GCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgotCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKLSAgICAgIGVsc2UKLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgotICAgICAgZmkKLQotICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCi0gICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCi0gICAgICAkcnVuICRybSAiJG9iaiIgIiRvdXRwdXRfb2JqIgotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCi0JJGVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKLSAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCi0gICAgICAjIE9ubHkgYXBwZW5kIGlmIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlIGV4aXN0cy4KLSAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCi0jIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Lgotbm9uX3BpY19vYmplY3Q9JyRvYmpuYW1lJwotCi1FT0YKLSAgICBlbHNlCi0gICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCi0gICAgICAjIE9ubHkgYXBwZW5kIGlmIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlIGV4aXN0cy4KLSAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCi0jIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Lgotbm9uX3BpY19vYmplY3Q9bm9uZQotCi1FT0YKLSAgICBmaQotCi0gICAgJHJ1biAkbXYgIiR7bGlib2JqfVQiICIke2xpYm9ian0iCi0KLSAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICAgICAkcnVuICRybSAiJGxvY2tmaWxlIgotICAgIGZpCi0KLSAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICA7OwotCi0gICMgbGlidG9vbCBsaW5rIG1vZGUKLSAgbGluayB8IHJlbGluaykKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKLSAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKLSAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKLSAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKLSAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZvY2F0aW9uLgotICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KLQotICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCi0gICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAotICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKLSAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgotICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGxpYnRvb2xfYXJncz0iJG5vbm9wdCIKLSAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCi0gICAgY29tcGlsZV9jb21tYW5kPSIkbm9ub3B0IgotICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRub25vcHQiCi0KLSAgICBjb21waWxlX3JwYXRoPQotICAgIGZpbmFsaXplX3JwYXRoPQotICAgIGNvbXBpbGVfc2hsaWJwYXRoPQotICAgIGZpbmFsaXplX3NobGlicGF0aD0KLSAgICBjb252ZW5pZW5jZT0KLSAgICBvbGRfY29udmVuaWVuY2U9Ci0gICAgZGVwbGlicz0KLSAgICBvbGRfZGVwbGlicz0KLSAgICBjb21waWxlcl9mbGFncz0KLSAgICBsaW5rZXJfZmxhZ3M9Ci0gICAgZGxsc2VhcmNocGF0aD0KLSAgICBsaWJfc2VhcmNoX3BhdGg9YHB3ZGAKLSAgICBpbnN0X3ByZWZpeF9kaXI9Ci0KLSAgICBhdm9pZF92ZXJzaW9uPW5vCi0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbHRsaWJzPQotICAgIG1vZHVsZT1ubwotICAgIG5vX2luc3RhbGw9bm8KLSAgICBvYmpzPQotICAgIG5vbl9waWNfb2JqZWN0cz0KLSAgICBwcmVjaW91c19maWxlc19yZWdleD0KLSAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KLSAgICBwcmVsb2FkPW5vCi0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgeHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB0aHJlYWRfc2FmZT1ubwotICAgIHZpbmZvPQotICAgIHZpbmZvX251bWJlcj1ubwotCi0gICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyI7IHRoZW4KLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgotCSAgZmkKLQkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JICBmaQotCWVsc2UKLQkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JZmkKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLQlwcmVmZXJfc3RhdGljX2xpYnM9eWVzCi0JYnJlYWsKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KLSAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCi0KLSAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KLSAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JcWFyZz1cImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYFwiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCTs7Ci0gICAgICAqKSBxYXJnPSRhcmcgOzsKLSAgICAgIGVzYWMKLSAgICAgIGxpYnRvb2xfYXJncz0iJGxpYnRvb2xfYXJncyAkcWFyZyIKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICRwcmV2IGluCi0Jb3V0cHV0KQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHByZXYgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAkYXJnIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JaW5zdF9wcmVmaXgpCi0JICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcHJlY2lvdXNfcmVnZXgpCi0JICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0Jb2JqZWN0bGlzdCkKLQkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCi0JICAgIHNhdmVfYXJnPSRhcmcKLQkgICAgbW9yZWFyZ3M9Ci0JICAgIGZvciBmaWwgaW4gYGNhdCAkc2F2ZV9hcmdgCi0JICAgIGRvCi0jCSAgICAgIG1vcmVhcmdzPSIkbW9yZWFyZ3MgJGZpbCIKLQkgICAgICBhcmc9JGZpbAotCSAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCSAgICAgIGlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJcGljX29iamVjdD0KLQkJbm9uX3BpY19vYmplY3Q9Ci0KLQkJIyBSZWFkIHRoZSAubG8gZmlsZQotCQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkJY2FzZSAkYXJnIGluCi0JCSovKiB8ICpcXCopIC4gJGFyZyA7OwotCQkqKSAuIC4vJGFyZyA7OwotCQllc2FjCi0KLQkJaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKLQkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmIFwKLQkJICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KLQkJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIgMT4mMgotCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCQlmaQotCi0JCSMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCXhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCQlpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCQkgIHhkaXI9Ci0JCWVsc2UKLQkJICB4ZGlyPSIkeGRpci8iCi0JCWZpCi0KLQkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCi0KLQkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQkgICAgICBwcmV2PQotCQkgICAgICBjb250aW51ZQotCQkgICAgZWxzZQotCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgotCQkgICAgICBwcmV2PWRscHJlZmlsZXMKLQkJICAgIGZpCi0JCSAgZmkKLQotCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCi0JCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCi0JCSAgICBwcmV2PQotCQkgIGZpCi0KLQkJICAjIEEgUElDIG9iamVjdC4KLQkJICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKLQkJICBhcmc9IiRwaWNfb2JqZWN0IgotCQlmaQotCi0JCSMgTm9uLVBJQyBvYmplY3QuCi0JCWlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCi0JCSAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgotCi0JCSAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0Ci0JCSAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKLQkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KLQkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCQkgIGZpCi0JCWZpCi0JICAgICAgZWxzZQotCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KLQkJaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCi0JCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JCWVsc2UKLQkJICAjIERyeS1ydW4gY2FzZS4KLQotCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkJICAgIHhkaXI9Ci0JCSAgZWxzZQotCQkgICAgeGRpcj0iJHhkaXIvIgotCQkgIGZpCi0KLQkJICBwaWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke29iamRpcn0vJHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JCSAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaW5rIGlucHV0IGZpbGUgXGAkc2F2ZV9hcmcnIGRvZXMgbm90IGV4aXN0IgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBhcmc9JHNhdmVfYXJnCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcnBhdGggfCB4cnBhdGgpCi0JICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkgIGNhc2UgJGFyZyBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgotCSAgICBjYXNlICIkcnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGVsc2UKLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXhjb21waWxlcikKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQl4bGlua2VyKQotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRxYXJnIgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkcWFyZyIKLQkgIHByZXY9Ci0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHdsJHFhcmciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkd2wkcWFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCXhjY2xpbmtlcikKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCi0JICBwcmV2PQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQlzaHJleHQpCi0gIAkgIHNocmV4dF9jbWRzPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotICAgICAgICBkYXJ3aW5fZnJhbWV3b3JrKQotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCSopCi0JICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkgIyB0ZXN0IC1uICIkcHJldiIKLQotICAgICAgcHJldmFyZz0iJGFyZyIKLQotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtYWxsLXN0YXRpYykKLQlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYWxsb3ctdW5kZWZpbmVkKQotCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYC1hbGxvdy11bmRlZmluZWQnIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWF2b2lkLXZlcnNpb24pCi0JYXZvaWRfdmVyc2lvbj15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbG9wZW4pCi0JcHJldj1kbGZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxwcmVvcGVuKQotCXByZXY9ZGxwcmVmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWV4cG9ydC1keW5hbWljKQotCWV4cG9ydF9keW5hbWljPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtZXhwb3J0LXN5bWJvbHMiOyB0aGVuCi0JICBwcmV2PWV4cHN5bXMKLQllbHNlCi0JICBwcmV2PWV4cHN5bXNfcmVnZXgKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWZyYW1ld29ya3wtYXJjaCkKLSAgICAgICAgcHJldj1kYXJ3aW5fZnJhbWV3b3JrCi0gICAgICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAtaW5zdC1wcmVmaXgtZGlyKQotCXByZXY9aW5zdF9wcmVmaXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKLSAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKLSAgICAgIC1MW0EtWl1bQS1aXSo6KikKLQljYXNlICR3aXRoX2djYy8kaG9zdCBpbgotCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JICA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1MKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgZGlyPSIkYWJzZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAiJGRlcGxpYnMgIiBpbgotCSoiIC1MJGRpciAiKikgOzsKLQkqKQotCSAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIgotCSAgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiCi0JICA7OwotCWVzYWMKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0JICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KLQkgICoiOiRkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1sKikKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICotKi1taW5ndyogfCAqLSotb3MyKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIGxpYnJhcnkgKGFzIHN1Y2gpCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCi0JICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkgICAgIyBSaGFwc29keSBDIGFuZCBtYXRoIGxpYnJhcmllcyBhcmUgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgICAgZGVwbGlicz0iJGRlcGxpYnMgLWZyYW1ld29yayBTeXN0ZW0iCi0JICAgIGNvbnRpbnVlCi0JICBlc2FjCi0JZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgotCSBjYXNlICRob3N0IGluCi0JICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KLQkgICBjb250aW51ZQotCSAgIDs7Ci0JIGVzYWMKLQlmaQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCi0gICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCi0gICAgICAtbW9kZWwpCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0JcHJldj14Y29tcGlsZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZSkKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1tb2R1bGUpCi0JbW9kdWxlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyAtNjQsIC1taXBzWzAtOV0gZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTR0kgY29tcGlsZXIKLSAgICAgICMgLXJbMC05XVswLTldKiBzcGVjaWZpZXMgdGhlIHByb2Nlc3NvciBvbiB0aGUgU0dJIGNvbXBpbGVyCi0gICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU3VuIGNvbXBpbGVyCi0gICAgICAjICtEQSosICtERCogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBIUCBjb21waWxlcgotICAgICAgIyAtcSogcGFzcyB0aHJvdWdoIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKLSAgICAgICMgLW0qIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29tcGlsZXIgYXJncyBmb3IgR0NDCi0gICAgICAtNjR8LW1pcHNbMC05XXwtclswLTldWzAtOV0qfC14YXJjaD0qfC14dGFyZ2V0PSp8K0RBKnwrREQqfC1xKnwtbSopCi0KLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICRhcmcgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLSAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSAieWVzIiA7IHRoZW4KLSAgICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0gICAgICAgIGZpCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgIC1zaHJleHQpCi0JcHJldj1zaHJleHQKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby1mYXN0LWluc3RhbGwpCi0JZmFzdF9pbnN0YWxsPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbm8taW5zdGFsbCkKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCi0JICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKLQkgICMgaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLW5vLWluc3RhbGwnIGlzIGlnbm9yZWQgZm9yICRob3N0IiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBhc3N1bWluZyBcYC1uby1mYXN0LWluc3RhbGwnIGluc3RlYWQiIDE+JjIKLQkgIGZhc3RfaW5zdGFsbD1ubwotCSAgOzsKLQkqKSBub19pbnN0YWxsPXllcyA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtb2JqZWN0bGlzdCkKLQlwcmV2PW9iamVjdGxpc3QKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vKSBwcmV2PW91dHB1dCA7OwotCi0gICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCi0JcHJldj1wcmVjaW91c19yZWdleAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQljYXNlICIkeHJwYXRoICIgaW4KLQkqIiAkZGlyICIqKSA7OwotCSopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KLQkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKLQkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCi0JIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0Ci0JIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC12ZXJzaW9uLW51bWJlcikKLQlwcmV2PXZpbmZvCi0JdmluZm9fbnVtYmVyPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVdjLCopCi0JYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdjLC8vJ2AKLQlhcmc9Ci0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCi0JZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGNhc2UgJGZsYWcgaW4KLQkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0JICAgIGZsYWc9IlwiJGZsYWdcIiIKLQkgICAgOzsKLQkgIGVzYWMKLQkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZsYWciCi0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAotCTs7Ci0KLSAgICAgIC1XbCwqKQotCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XbCwvLydgCi0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBjYXNlICRmbGFnIGluCi0JICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCSAgICBmbGFnPSJcIiRmbGFnXCIiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBhcmc9IiRhcmcgJHdsJGZsYWciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRmbGFnIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKLQk7OwotCi0gICAgICAtWGNvbXBpbGVyKQotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWGxpbmtlcikKLQlwcmV2PXhsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1YQ0NsaW5rZXIpCi0JcHJldj14Y2NsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICRhcmcgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAqLiRvYmpleHQpCi0JIyBBIHN0YW5kYXJkIG9iamVjdC4KLQlvYmpzPSIkb2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgcGljX29iamVjdD0KLQkgIG5vbl9waWNfb2JqZWN0PQotCi0JICAjIFJlYWQgdGhlIC5sbyBmaWxlCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJGFyZyBpbgotCSAgKi8qIHwgKlxcKikgLiAkYXJnIDs7Ci0JICAqKSAuIC4vJGFyZyA7OwotCSAgZXNhYwotCi0JICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAotCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJiBcCi0JICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0KLQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCi0JICAgIHhkaXI9Ci0gCSAgZWxzZQotCSAgICB4ZGlyPSIkeGRpci8iCi0JICBmaQotCi0JICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQlwcmV2PQotCQljb250aW51ZQotCSAgICAgIGVsc2UKLQkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJcHJldj1kbHByZWZpbGVzCi0JICAgICAgZmkKLQkgICAgZmkKLQotCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCSAgICAgIHByZXY9Ci0JICAgIGZpCi0KLQkgICAgIyBBIFBJQyBvYmplY3QuCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCSAgICBhcmc9IiRwaWNfb2JqZWN0IgotCSAgZmkKLQotCSAgIyBOb24tUElDIG9iamVjdC4KLQkgIGlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCSAgICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCi0KLQkgICAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0Ci0JICAgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCi0JICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgotCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCSAgICBmaQotCSAgZmkKLQllbHNlCi0JICAjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBlbHNlCi0JICAgICMgRHJ5LXJ1biBjYXNlLgotCi0JICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JICAgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgotCSAgICAgIHhkaXI9Ci0JICAgIGVsc2UKLQkgICAgICB4ZGlyPSIkeGRpci8iCi0JICAgIGZpCi0KLQkgICAgcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHtvYmpkaXJ9LyR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgICBub25fcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgotCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgICouJGxpYmV4dCkKLQkjIEFuIGFyY2hpdmUuCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQlvbGRfZGVwbGlicz0iJG9sZF9kZXBsaWJzICRhcmciCi0JY29udGludWUKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgbGlicmFyeS4KLQotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIHByZXY9Ci0JZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgotICAgICAgKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICRhcmcgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgZXNhYyAjIGFyZwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgIGZpCi0KLSAgICBvbGRsaWJzPQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCi0gICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCi0gICAgZWxzZQotICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9Ci0gICAgZmkKLSAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKLSAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCi0KLSAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotICAgICAgb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICBlbHNlCi0gICAgICBvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgIGZpCi0gICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCi0gICAgaWYgdGVzdCAhIC1kICIkb3V0cHV0X29iamRpciI7IHRoZW4KLSAgICAgICRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0gICAgICAkcnVuICRta2RpciAkb3V0cHV0X29iamRpcgotICAgICAgc3RhdHVzPSQ/Ci0gICAgICBpZiB0ZXN0ICIkc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRvdXRwdXRfb2JqZGlyIjsgdGhlbgotCWV4aXQgJHN0YXR1cwotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0Ci0gICAgY2FzZSAkb3V0cHV0IGluCi0gICAgIiIpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgOzsKLSAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OwotICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OwotICAgICoubGEpIGxpbmttb2RlPWxpYiA7OwotICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCi0gICAgZXNhYwotCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpwdzMyKikKLSAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCi0gICAgICBkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9eWVzCi0gICAgICA7OwotICAgICopCi0gICAgICBkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JGR1cGxpY2F0ZV9kZXBzCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBzcGVjaWFsZGVwbGlicz0KLQotICAgIGxpYnM9Ci0gICAgIyBGaW5kIGFsbCBpbnRlcmRlcGVuZGVudCBkZXBsaWJzIGJ5IHNlYXJjaGluZyBmb3IgbGlicmFyaWVzCi0gICAgIyB0aGF0IGFyZSBsaW5rZWQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gLWxhIC1sYiAtbGEpCi0gICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KLSAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCWNhc2UgIiRsaWJzICIgaW4KLQkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCi0KLSAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCi0gICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCi0gICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KLSAgICAgIHByZV9wb3N0X2RlcHM9Ci0gICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JZm9yIHByZV9wb3N0X2RlcCBpbiAkcHJlZGVwcyAkcG9zdGRlcHM7IGRvCi0JICBjYXNlICIkcHJlX3Bvc3RfZGVwcyAiIGluCi0JICAqIiAkcHJlX3Bvc3RfZGVwICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRwcmVfcG9zdF9kZXBzIiA7OwotCSAgZXNhYwotCSAgcHJlX3Bvc3RfZGVwcz0iJHByZV9wb3N0X2RlcHMgJHByZV9wb3N0X2RlcCIKLQlkb25lCi0gICAgICBmaQotICAgICAgcHJlX3Bvc3RfZGVwcz0KLSAgICBmaQotCi0gICAgZGVwbGlicz0KLSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9Ci0gICAgbmV3bGliX3NlYXJjaF9wYXRoPQotICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgY2FzZSAkbGlua21vZGUgaW4KLSAgICBsaWIpCi0JcGFzc2VzPSJjb252IGxpbmsiCi0JZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCi0JICBjYXNlICRmaWxlIGluCi0JICAqLmxhKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgIHByb2cpCi0JY29tcGlsZV9kZXBsaWJzPQotCWZpbmFsaXplX2RlcGxpYnM9Ci0JYWxsZGVwbGlicz1ubwotCW5ld2RsZmlsZXM9Ci0JbmV3ZGxwcmVmaWxlcz0KLQlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCi0JOzsKLSAgICAqKSAgcGFzc2VzPSJjb252IgotCTs7Ci0gICAgZXNhYwotICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KLQlsaWJzPSIkZGVwbGlicyIKLQlkZXBsaWJzPQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JY2FzZSAkcGFzcyBpbgotCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7Ci0JZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKLQlsaW5rKSBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUgJGRlcGVuZGVuY3lfbGlicyIgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcwotCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCi0JZGVwbGlicz0KLSAgICAgIGZpCi0gICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbwotCWxpYj0KLQlmb3VuZD1ubwotCWNhc2UgJGRlcGxpYiBpbgotCS1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCi0JICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYiIKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQktbCopCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgotCSAgICBjb250aW51ZQotCSAgZmkKLQkgIG5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLWwvLydgCi0JICBmb3Igc2VhcmNoZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCi0JICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQotCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKLQkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgotCQkgIGZvdW5kPXllcwotCQllbHNlCi0JCSAgZm91bmQ9bm8KLQkJZmkKLQkJYnJlYWsgMgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGRvbmUKLQkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCi0JICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQotCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKLQkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KLQkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopCi0JCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwKLSAgICAgICAgICAgICAgICAgICAgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJICBsaWJyYXJ5X25hbWVzPQotCQkgIG9sZF9saWJyYXJ5PQotCQkgIGNhc2UgJGxpYiBpbgotCQkgICovKiB8ICpcXCopIC4gJGxpYiA7OwotCQkgICopIC4gLi8kbGliIDs7Ci0JCSAgZXNhYwotCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkJICAgIGxsPSIkbCIKLQkJICBkb25lCi0JCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKLQkJICAgIGZvdW5kPW5vCi0JCSAgICBsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JCSAgICB0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCi0JCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQotCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCQkgICAgZWxzZQotCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCQkgICAgZmkKLQkJICAgIGNvbnRpbnVlCi0JCSAgZmkKLQkJZmkKLQkgICAgICAgIDs7Ci0JICAgICAgKikgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBmaQotCSAgOzsgIyAtbAotCS1MKikKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICBjb250aW51ZQotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgIGZpCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JICAgIDs7Ci0JICAqKQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIiAxPiYyCi0JICAgIDs7Ci0JICBlc2FjICMgbGlua21vZGUKLQkgIGNvbnRpbnVlCi0JICA7OyAjIC1MCi0JLVIqKQotCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgotCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBjb250aW51ZQotCSAgOzsKLQkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7Ci0JKi4kbGliZXh0KQotCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBjb250aW51ZQotCSAgZmkKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgIHZhbGlkX2FfbGliPW5vCi0JICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JICAgICAgbWF0Y2hfcGF0dGVybiopCi0JCXNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgICAgICAgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKLQkJaWYgZXZhbCAkZWNobyBcIiRkZXBsaWJcIiAyPi9kZXYvbnVsbCBcCi0JCSAgICB8ICRTRUQgMTBxIFwKLQkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJICB2YWxpZF9hX2xpYj15ZXMKLQkJZmkKLQkJOzsKLQkgICAgICBwYXNzX2FsbCkKLQkJdmFsaWRfYV9saWI9eWVzCi0JCTs7Ci0gICAgICAgICAgICBlc2FjCi0JICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCi0JICAgICAgJGVjaG8KLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgotCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCSAgICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgotCSAgICAgICRlY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlZCBoZXJlLiIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgotCSAgICAgICRlY2hvICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGZpCi0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICBwcm9nKQotCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYyAjIGxpbmttb2RlCi0JICA7OyAjICouJGxpYmV4dAotCSoubG8gfCAqLiRvYmpleHQpCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKLQkgICAgZmkKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQklREVQTElCUyUpCi0JICBhbGxkZXBsaWJzPXllcwotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYyAjIGNhc2UgJGRlcGxpYgotCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYiciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkbGFkaXIiID0gIlgkbGliIiAmJiBsYWRpcj0iLiIKLQotCWRsbmFtZT0KLQlkbG9wZW49Ci0JZGxwcmVvcGVuPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCi0JIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCi0JaW5zdGFsbGVkPXllcwotCXNob3VsZG5vdGxpbms9bm8KLQlhdm9pZHRlbXBycGF0aD0KLQotCi0JIyBSZWFkIHRoZSAubGEgZmlsZQotCWNhc2UgJGxpYiBpbgotCSovKiB8ICpcXCopIC4gJGxpYiA7OwotCSopIC4gLi8kbGliIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKLQkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKLQkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgotCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKLQkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCi0JZmkKLQotCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KLQkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCi0JICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgIGZpCi0JICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KLQkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICAgIHRtcF9saWJzPQotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLSAgICAgICAgICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCi0JICAgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgICAgZXNhYwotICAgICAgICAgICAgICBmaQotCSAgICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgICAgZG9uZQotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IiAxPiYyCi0JICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkgIyAkcGFzcyA9IGNvbnYKLQotCi0JIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgotCWxpbmtsaWI9Ci0JZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgbGlua2xpYj0iJGwiCi0JZG9uZQotCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWZpCi0KLQkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAotCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKLQkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKLQkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKLQkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKLQkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCi0JICBlbHNlCi0JICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCi0JICBmaQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gZGxvcGVuCi0KLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRsYWRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7Ci0JKikKLQkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAotCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciIDE+JjIKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgotCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKLQkgIGZpCi0JICA7OwotCWVzYWMKLQlsYW5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0JaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgotCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIgMT4mMgotCSAgICBkaXI9IiRsYWRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgotCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxpYmRpciIKLQkgICAgYWJzZGlyPSIkbGliZGlyIgotCSAgZmkKLQkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCi0JZWxzZQotCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgotCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKLQkgIGVsc2UKLQkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBmaQotCWZpICMgJGluc3RhbGxlZCA9IHllcwotCW5hbWU9YCRlY2hvICJYJGxhbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCi0JICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0JICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgotCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCi0JICBlbHNlCi0JICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCi0JICBmaQotCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KLQotCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLQkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgZWxzZQotCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIiAjIHVzZWQgZm9yIHByb2csc2NhbiBwYXNzCi0JICBmaQotCSAgY29udGludWUKLQlmaQotCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyAmJiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgotCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsYWRpciIKLQkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCi0KLQkgIGxpbmthbGxkZXBsaWJzPW5vCi0JICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8Ci0JICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgIGxpbmthbGxkZXBsaWJzPXllcwotCSAgZmkKLQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAtTCopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgOzsgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0Ci0JICAgIGVzYWMKLQkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPwotCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocwotCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCi0JICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgotCSAgZG9uZSAjIGZvciBkZXBsaWIKLQkgIGNvbnRpbnVlCi0JZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgotCSAgICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KLQkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKLQkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCi0JICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLQkgICAgICAqIiAkZGlyICIqKSA7OwotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGFic2RpciIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0KLQkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgotCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAgICMgc2VhcmNoIHBhdGguCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgotCi0JICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKLQkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8Ci0JICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKLQkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgotCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKLQkgICAgY29udGludWUKLQkgIGZpCi0JZmkKLQotCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKLQlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgotCSAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKLQkgICAgbmVlZF9yZWxpbms9eWVzCi0JICBmaQotCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKLQotCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uCi0JICAjIHNvbWUgc3lzdGVtcyAoZGFyd2luKQotCSAgaWYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbmsgOyB0aGVuCi0JICAgICRlY2hvCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKLQkgICAgZmkKLQkgICAgJGVjaG8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgotCSAgZmkKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKLQkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCi0JICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KLQkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgICAjIHNlYXJjaCBwYXRoLgotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopCi0JICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgICBlc2FjCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgotCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQotCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQkgICAgcmVhbG5hbWU9IiQyIgotCSAgICBzaGlmdDsgc2hpZnQKLQkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KLQkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgICBzb25hbWU9IiRkbG5hbWUiCi0JICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgICAgICMgYmxlaCB3aW5kb3dzCi0JICAgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqKQotCQltYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JCXZlcnN1ZmZpeD0iLSRtYWpvciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCSAgICBlbHNlCi0JICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCi0JICAgIGZpCi0KLQkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKLQkgICAgc29yb290PSIkc29uYW1lIgotCSAgICBzb25hbWU9YCRlY2hvICRzb3Jvb3QgfCAke1NFRH0gLWUgJ3MvXi4qXC8vLydgCi0JICAgIG5ld2xpYj0ibGliaW1wLWAkZWNobyAkc29uYW1lIHwgJHtTRUR9ICdzL15saWIvLztzL1wuZGxsJC8vJ2AuYSIKLQotCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdwotCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgotCSAgICBlbHNlCi0JICAgICAgJHNob3cgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGNtZHM9JGV4dHJhY3RfZXhwc3ltc19jbWRzCi0JICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkJSUZTPSIkc2F2ZV9pZnMiCi0JCWV2YWwgY21kPVwiJGNtZFwiCi0JCSRzaG93ICIkY21kIgotCQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0KLQkgICAgIyBDcmVhdGUgJG5ld2xpYgotCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCi0JICAgICAgJHNob3cgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKLQkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCQlJRlM9IiRzYXZlX2lmcyIKLQkJZXZhbCBjbWQ9XCIkY21kXCIKLQkJJHNob3cgIiRjbWQiCi0JCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKLQkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCi0JICAgIGxpbmtsaWI9JG5ld2xpYgotCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCi0KLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICBsaWJfbGlua2VkPXllcwotCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KLQkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCi0JCWNhc2UgJGhvc3QgaW4KLQkJICAqLSotc2NvMy4ydjUqICkgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1kYXJ3aW4qICkKLQkJICAgICMgaWYgdGhlIGxpYiBpcyBhIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QgbGluayBhZ2FpbnN0Ci0JCSAgICAjIGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBuZXcgd2FybmluZ3MgSSBhZGRlZAotCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8ICRFR1JFUCAiYnVuZGxlIiA+L2Rldi9udWxsIDsgdGhlbgotCQkgICAgICAkZWNobyAiKiogV2FybmluZywgbGliICRsaW5rbGliIGlzIGEgbW9kdWxlLCBub3QgYSBzaGFyZWQgbGlicmFyeSIKLQkJICAgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IiA7IHRoZW4KLQkJICAgICAgICAkZWNobwotCQkgICAgICAgICRlY2hvICIqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgotCQkgICAgICAgICRlY2hvICIqKiBUaGUgbGluayB3aWxsIHByb2JhYmx5IGZhaWwsIHNvcnJ5IgotCQkgICAgICBlbHNlCi0JCSAgICAgICAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKLQkJICAgICAgZmkKLQkJICAgIGZpCi0JCWVzYWMKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCi0JCWNhc2UgJGhvc3QgaW4KLQkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKLQkJZXNhYwotCQlhZGRfZGlyPSItTCRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCi0JCWFkZF9zaGxpYnBhdGg9IiRkaXIiCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbHNlCi0JCWxpYl9saW5rZWQ9bm8KLQkgICAgICBmaQotCSAgICAgIDs7Ci0JICAgIHJlbGluaykKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkJYWRkX2Rpcj0iLUwkZGlyIgotCQkjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCi0JCWlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JCSAgY2FzZSAkbGliZGlyIGluCi0JCSAgICBbXFwvXSopCi0JCSAgICAgIGFkZF9kaXI9IiRhZGRfZGlyIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCi0JCSAgICAgIDs7Ci0JCSAgZXNhYwotCQlmaQotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkJYWRkX3NobGlicGF0aD0iJGRpciIKLQkJYWRkPSItbCRuYW1lIgotCSAgICAgIGVsc2UKLQkJbGliX2xpbmtlZD1ubwotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgKikgbGliX2xpbmtlZD1ubyA7OwotCSAgICBlc2FjCi0KLQkgICAgaWYgdGVzdCAiJGxpYl9saW5rZWQiICE9IHllczsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNvbmZpZ3VyYXRpb24gZXJyb3I6IHVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCi0JICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCi0JICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgotCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWRkX3NobGlicGF0aDoiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKLQkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYgXAotCQkgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IHllcyAmJiBcCi0JCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkJKiI6JGxpYmRpcjoiKikgOzsKLQkJKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgIGFkZF9zaGxpYnBhdGg9Ci0JICAgIGFkZF9kaXI9Ci0JICAgIGFkZD0KLQkgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgICBhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgotCSAgICAgIGFkZD0iLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgotCSAgICAgICoiOiRsaWJkaXI6IiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIGFkZD0iLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllczsgdGhlbgotCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiICYmCi0JCSB0ZXN0IC1mICIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIgOyB0aGVuCi0JICAgICAgICBhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgotCSAgICAgIGVsc2UKLQkgICAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgotCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JCWNhc2UgJGxpYmRpciBpbgotCQkgIFtcXC9dKikKLQkJICAgIGFkZF9kaXI9IiRhZGRfZGlyIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCi0JCSAgICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZF9kaXIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZCAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgotCSAgICBmaQotCSAgZmkKLQllbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCi0JICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKLQkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgY29tcGlsZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkZmluYWxpemVfZGVwbGlicyIKLQkgIGZpCi0JZWxpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBOb3QgYSBzaGFyZWQgbGlicmFyeQotCSAgaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotCSAgICAjIFdlJ3JlIHRyeWluZyBsaW5rIGEgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBhIHN0YXRpYyBvbmUKLQkgICAgIyBidXQgdGhlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQuCi0KLQkgICAgIyBKdXN0IHByaW50IGEgd2FybmluZyBhbmQgYWRkIHRoZSBsaWJyYXJ5IHRvIGRlcGVuZGVuY3lfbGlicyBzbwotCSAgICAjIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzdGF0aWMgbGlicmFyeS4KLQkgICAgJGVjaG8KLQkgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIHN5c3RlbSBjYW4gbm90IGxpbmsgdG8gc3RhdGljIGxpYiBhcmNoaXZlICRsaWIuIgotCSAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAgICRlY2hvICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCi0JICAgICAgJGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgotCSAgICAgICRlY2hvICIqKiogaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZyB0byByZXNvbHZlIHN5bWJvbHMgYXQgcnVudGltZS4iCi0JICAgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkJJGVjaG8KLQkJJGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCQkkZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkJJGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkJJGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkJYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgICAgZWxzZQotCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgICBmaQotCSAgICBmaQotCSAgZWxzZQotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgICAgbGlua19zdGF0aWM9eWVzCi0JICBmaQotCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/Ci0KLQlpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIiAmJgotCSAgICAgeyB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwKLQkgICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyB8fAotCSAgICAgICB0ZXN0ICIkbGlua19zdGF0aWMiID0geWVzOyB9OyB0aGVuCi0JICAgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicwotCSAgICB0ZW1wX2RlcGxpYnM9Ci0JICAgIGZvciBsaWJkaXIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRsaWJkaXIgaW4KLQkgICAgICAtUiopIHRlbXBfeHJwYXRoPWAkZWNobyAiWCRsaWJkaXIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCQkgICBjYXNlICIgJHhycGF0aCAiIGluCi0JCSAgICoiICR0ZW1wX3hycGF0aCAiKikgOzsKLQkJICAgKikgeHJwYXRoPSIkeHJwYXRoICR0ZW1wX3hycGF0aCI7OwotCQkgICBlc2FjOzsKLQkgICAgICAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGxpYmRpciI7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCi0JICBmaQotCi0JICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGFic2RpciIKLQkgICMgTGluayBhZ2FpbnN0IHRoaXMgbGlicmFyeQotCSAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IG5vICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGFic19sYWRpci8kbGFuYW1lICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAjIC4uLiBhbmQgaXRzIGRlcGVuZGVuY3lfbGlicwotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCi0JICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCi0JICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7Ci0JICAgICAgKi5sYSkKLQkJZGlyPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkJdGVzdCAiWCRkaXIiID0gIlgkZGVwbGliIiAmJiBkaXI9Ii4iCi0JCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCQljYXNlICRkaXIgaW4KLQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7Ci0JCSopCi0JCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkJICAgIGFic2Rpcj0iJGRpciIKLQkJICBmaQotCQkgIDs7Ci0JCWVzYWMKLQkJaWYgZ3JlcCAiXmluc3RhbGxlZD1ubyIgJGRlcGxpYiA+IC9kZXYvbnVsbDsgdGhlbgotCQkgIHBhdGg9IiRhYnNkaXIvJG9iamRpciIKLQkJZWxzZQotCQkgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkJICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkJICBmaQotCQkgIGlmIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIjsgdGhlbgotCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZGVwbGliJyBzZWVtcyB0byBiZSBtb3ZlZCIgMT4mMgotCQkgIGZpCi0JCSAgcGF0aD0iJGFic2RpciIKLQkJZmkKLQkJZGVwZGVwbD0KLQkJY2FzZSAkaG9zdCBpbgotCQkqLSotZGFyd2luKikKLQkJICAjIHdlIGRvIG5vdCB3YW50IHRvIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicywKLQkJICAjIGJ1dCBuZWVkIHRvIGxpbmsgYWdhaW5zdCBzaGFyZWQKLQkJICBldmFsIGRlcGxpYnJhcnlfbmFtZXM9YCR7U0VEfSAtbiAtZSAncy9ebGlicmFyeV9uYW1lcz1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCSAgaWYgdGVzdCAtbiAiJGRlcGxpYnJhcnlfbmFtZXMiIDsgdGhlbgotCQkgICAgZm9yIHRtcCBpbiAkZGVwbGlicmFyeV9uYW1lcyA7IGRvCi0JCSAgICAgIGRlcGRlcGw9JHRtcAotCQkgICAgZG9uZQotCQkgICAgaWYgdGVzdCAtZiAiJHBhdGgvJGRlcGRlcGwiIDsgdGhlbgotCQkgICAgICBkZXBkZXBsPSIkcGF0aC8kZGVwZGVwbCIKLQkJICAgIGZpCi0JCSAgICAjIGRvIG5vdCBhZGQgcGF0aHMgd2hpY2ggYXJlIGFscmVhZHkgdGhlcmUKLQkJICAgIGNhc2UgIiAkbmV3bGliX3NlYXJjaF9wYXRoICIgaW4KLQkJICAgICoiICRwYXRoICIqKSA7OwotCQkgICAgKikgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRwYXRoIjs7Ci0JCSAgICBlc2FjCi0JCSAgZmkKLQkJICBwYXRoPSIiCi0JCSAgOzsKLQkJKikKLQkJICBwYXRoPSItTCRwYXRoIgotCQkgIDs7Ci0JCWVzYWMKLQkJOzsKLQkgICAgICAtbCopCi0JCWNhc2UgJGhvc3QgaW4KLQkJKi0qLWRhcndpbiopCi0JCSAgIyBBZ2Fpbiwgd2Ugb25seSB3YW50IHRvIGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzCi0JCSAgZXZhbCB0bXBfbGlicz1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICJzLF5cLWwsLCJgCi0JCSAgZm9yIHRtcCBpbiAkbmV3bGliX3NlYXJjaF9wYXRoIDsgZG8KLQkJICAgIGlmIHRlc3QgLWYgIiR0bXAvbGliJHRtcF9saWJzLmR5bGliIiA7IHRoZW4KLQkJICAgICAgZXZhbCBkZXBkZXBsPSIkdG1wL2xpYiR0bXBfbGlicy5keWxpYiIKLQkJICAgICAgYnJlYWsKLQkJICAgIGZpCi0JCSAgZG9uZQotCQkgIHBhdGg9IiIKLQkJICA7OwotCQkqKSBjb250aW51ZSA7OwotCQllc2FjCi0JCTs7Ci0JICAgICAgKikgY29udGludWUgOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiICRkZXBsaWJzICIgaW4KLQkgICAgICAqIiAkcGF0aCAiKikgOzsKLQkgICAgICAqKSBkZXBsaWJzPSIkcGF0aCAkZGVwbGlicyIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiICRkZXBsaWJzICIgaW4KLQkgICAgICAqIiAkZGVwZGVwbCAiKikgOzsKLQkgICAgICAqKSBkZXBsaWJzPSIkZGVwZGVwbCAkZGVwbGlicyIgOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgIGZpICMgbGlua19hbGxfZGVwbGlicyAhPSBubwotCWZpICMgbGlua21vZGUgPSBsaWIKLSAgICAgIGRvbmUgIyBmb3IgZGVwbGliIGluICRsaWJzCi0gICAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KLQkjIExpbmsgdGhlIGRscHJlb3BlbmVkIGxpYnJhcmllcyBiZWZvcmUgb3RoZXIgbGlicmFyaWVzCi0JZm9yIGRlcGxpYiBpbiAkc2F2ZV9kZXBsaWJzOyBkbwotCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQlkb25lCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHBhc3MiICE9IGRsb3BlbjsgdGhlbgotCWlmIHRlc3QgIiRwYXNzIiAhPSBjb252OyB0aGVuCi0JICAjIE1ha2Ugc3VyZSBsaWJfc2VhcmNoX3BhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICBsaWJfc2VhcmNoX3BhdGg9Ci0JICBmb3IgZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGg7IGRvCi0JICAgIGNhc2UgIiRsaWJfc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgbmV3bGliX3NlYXJjaF9wYXRoPQotCWZpCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiICE9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICB2YXJzPSJkZXBsaWJzIgotCWVsc2UKLQkgIHZhcnM9ImNvbXBpbGVfZGVwbGlicyBmaW5hbGl6ZV9kZXBsaWJzIgotCWZpCi0JZm9yIHZhciBpbiAkdmFycyBkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAjIEFkZCBsaWJyYXJpZXMgdG8gJHZhciBpbiByZXZlcnNlIG9yZGVyCi0JICBldmFsIHRtcF9saWJzPVwiXCQkdmFyXCIKLQkgIG5ld19saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkdG1wX2xpYnM7IGRvCi0JICAgICMgRklYTUU6IFBlZGFudGljYWxseSwgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHNvCi0JICAgICMgICAgICAgIHRoYXQgc29tZSBuYXN0eSBkZXBlbmRlbmN5IGxvb3AgaXNuJ3QgYWNjaWRlbnRhbGx5Ci0JICAgICMgICAgICAgIGJyb2tlbjoKLQkgICAgI25ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKLQkgICAgIyBQcmFnbWF0aWNhbGx5LCB0aGlzIHNlZW1zIHRvIGNhdXNlIHZlcnkgZmV3IHByb2JsZW1zIGluCi0JICAgICMgcHJhY3RpY2U6Ci0JICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAtTCopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKLQkgICAgLVIqKSA7OwotCSAgICAqKQotCSAgICAgICMgQW5kIGhlcmUgaXMgdGhlIHJlYXNvbjogd2hlbiBhIGxpYnJhcnkgYXBwZWFycyBtb3JlCi0JICAgICAgIyB0aGFuIG9uY2UgYXMgYW4gZXhwbGljaXQgZGVwZW5kZW5jZSBvZiBhIGxpYnJhcnksIG9yCi0JICAgICAgIyBpcyBpbXBsaWNpdGx5IGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZSBieSB0aGUKLQkgICAgICAjIGNvbXBpbGVyLCBpdCBpcyBjb25zaWRlcmVkIHNwZWNpYWwsIGFuZCBtdWx0aXBsZQotCSAgICAgICMgb2NjdXJyZW5jZXMgdGhlcmVvZiBhcmUgbm90IHJlbW92ZWQuICBDb21wYXJlIHRoaXMKLQkgICAgICAjIHdpdGggaGF2aW5nIHRoZSBzYW1lIGxpYnJhcnkgYmVpbmcgbGlzdGVkIGFzIGEKLQkgICAgICAjIGRlcGVuZGVuY3kgb2YgbXVsdGlwbGUgb3RoZXIgbGlicmFyaWVzOiBpbiB0aGlzIGNhc2UsCi0JICAgICAgIyB3ZSBrbm93IChwZWRhbnRpY2FsbHksIHdlIGFzc3VtZSkgdGhlIGxpYnJhcnkgZG9lcyBub3QKLQkgICAgICAjIG5lZWQgdG8gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLCBzbyB3ZSBrZWVwIG9ubHkgdGhlCi0JICAgICAgIyBsYXN0IGNvcHkuICBUaGlzIGlzIG5vdCBhbHdheXMgcmlnaHQsIGJ1dCBpdCBpcyByYXJlCi0JICAgICAgIyBlbm91Z2ggdGhhdCB3ZSByZXF1aXJlIHVzZXJzIHRoYXQgcmVhbGx5IG1lYW4gdG8gcGxheQotCSAgICAgICMgc3VjaCB1bnBvcnRhYmxlIGxpbmtpbmcgdHJpY2tzIHRvIGxpbmsgdGhlIGxpYnJhcnkKLQkgICAgICAjIHVzaW5nIC1XbCwtbG5hbWUsIHNvIHRoYXQgbGlidG9vbCBkb2VzIG5vdCBjb25zaWRlciBpdAotCSAgICAgICMgZm9yIGR1cGxpY2F0ZSByZW1vdmFsLgotCSAgICAgIGNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKLQkgICAgICAqKQotCQljYXNlICIgJG5ld19saWJzICIgaW4KLQkJKiIgJGRlcGxpYiAiKikgOzsKLQkJKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCQllc2FjCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkbmV3X2xpYnM7IGRvCi0JICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAtTCopCi0JICAgICAgY2FzZSAiICR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgZXZhbCAkdmFyPVwiJHRtcF9saWJzXCIKLQlkb25lICMgZm9yIHZhcgotICAgICAgZmkKLSAgICAgICMgTGFzdCBzdGVwOiByZW1vdmUgcnVudGltZSBsaWJzIGZyb20gZGVwZW5kZW5jeV9saWJzCi0gICAgICAjICh0aGV5IHN0YXkgaW4gZGVwbGlicykKLSAgICAgIHRtcF9saWJzPQotICAgICAgZm9yIGkgaW4gJGRlcGVuZGVuY3lfbGlicyA7IGRvCi0JY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICIgaW4KLQkqIiAkaSAiKikKLQkgIGk9IiIKLQkgIDs7Ci0JZXNhYwotCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGkiCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIGRlcGVuZGVuY3lfbGlicz0kdG1wX2xpYnMKLSAgICBkb25lICMgZm9yIHBhc3MKLSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotICAgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCi0gICAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLSAgICBmaQotCi0gICAgY2FzZSAkbGlua21vZGUgaW4KLSAgICBvbGRsaWIpCi0gICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICBvYmpzPSIkb2JqcyRvbGRfZGVwbGlicyIKLSAgICAgIDs7Ci0KLSAgICBsaWIpCi0gICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCi0gICAgICBjYXNlICRvdXRwdXRuYW1lIGluCi0gICAgICBsaWIqKQotCW5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRtb2R1bGUiID0gbm87IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgotCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAotCSAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQkgIGV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQllbHNlCi0JICBsaWJuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCi0JaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyBvbiB0aGlzIGhvc3Q6JG9ianMiIDI+JjEKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCWVsc2UKLQkgICRlY2hvCi0JICAkZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbm9uLWxpYnRvb2wiCi0JICAkZWNobyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKLQkgIGxpYm9ianM9IiRsaWJvYmpzICRvYmpzIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbiBzZWxmJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgc2V0IGR1bW15ICRycGF0aAotICAgICAgaWYgdGVzdCAiJCMiIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiIDE+JjIKLSAgICAgIGZpCi0gICAgICBpbnN0YWxsX2xpYmRpcj0iJDIiCi0KLSAgICAgIG9sZGxpYnM9Ci0gICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0JICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbwotCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCi0JICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCi0JICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCi0JICBidWlsZF9vbGRfbGlicz15ZXMKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIiAxPiYyCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIiAxPiYyCi0JZmkKLSAgICAgIGVsc2UKLQotCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCi0Jc2V0IGR1bW15ICR2aW5mbyAwIDAgMAotCUlGUz0iJHNhdmVfaWZzIgotCi0JaWYgdGVzdCAtbiAiJDgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCSMgY29udmVydCBhYnNvbHV0ZSB2ZXJzaW9uIG51bWJlcnMgdG8gbGlidG9vbCBhZ2VzCi0JIyB0aGlzIHJldGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIC5sYSBmaWxlcyBhbmQgYXR0ZW1wdHMKLQkjIHRvIG1ha2UgdGhlIGNvZGUgYmVsb3cgYSBiaXQgbW9yZSBjb21wcmVoZW5zaWJsZQotCi0JY2FzZSAkdmluZm9fbnVtYmVyIGluCi0JeWVzKQotCSAgbnVtYmVyX21ham9yPSIkMiIKLQkgIG51bWJlcl9taW5vcj0iJDMiCi0JICBudW1iZXJfcmV2aXNpb249IiQ0IgotCSAgIwotCSAgIyBUaGVyZSBhcmUgcmVhbGx5IG9ubHkgdHdvIGtpbmRzIC0tIHRob3NlIHRoYXQKLQkgICMgdXNlIHRoZSBjdXJyZW50IHJldmlzaW9uIGFzIHRoZSBtYWpvciB2ZXJzaW9uCi0JICAjIGFuZCB0aG9zZSB0aGF0IHN1YnRyYWN0IGFnZSBhbmQgdXNlIGFnZSBhcwotCSAgIyBhIG1pbm9yIHZlcnNpb24uICBCdXQsIHRoZW4gdGhlcmUgaXMgaXJpeAotCSAgIyB3aGljaCBoYXMgYW4gZXh0cmEgMSBhZGRlZCBqdXN0IGZvciBmdW4KLQkgICMKLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgZGFyd2lufGxpbnV4fG9zZnx3aW5kb3dzKQotCSAgICBjdXJyZW50PWBleHByICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yYAotCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX3JldmlzaW9uIgotCSAgICA7OwotCSAgZnJlZWJzZC1hb3V0fGZyZWVic2QtZWxmfHN1bm9zKQotCSAgICBjdXJyZW50PSIkbnVtYmVyX21ham9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKLQkgICAgYWdlPSIwIgotCSAgICA7OwotCSAgaXJpeHxub25zdG9wdXgpCi0JICAgIGN1cnJlbnQ9YGV4cHIgJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3IgLSAxYAotCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlubykKLQkgIGN1cnJlbnQ9IiQyIgotCSAgcmV2aXNpb249IiQzIgotCSAgYWdlPSIkNCIKLQkgIDs7Ci0JZXNhYwotCi0JIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KLQljYXNlICRjdXJyZW50IGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0KLQljYXNlICRyZXZpc2lvbiBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0KLQljYXNlICRhZ2UgaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLQltYWpvcj0KLQl2ZXJzdWZmaXg9Ci0JdmVyc3RyaW5nPQotCWNhc2UgJHZlcnNpb25fdHlwZSBpbgotCW5vbmUpIDs7Ci0KLQlkYXJ3aW4pCi0JICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCi0JICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCi0JICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCi0JICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgotCSAgbWlub3JfY3VycmVudD1gZXhwciAkY3VycmVudCArIDFgCi0JICB2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlmcmVlYnNkLWFvdXQpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKLQkgIDs7Ci0KLQlmcmVlYnNkLWVsZikKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7Ci0JICA7OwotCi0JaXJpeCB8IG5vbnN0b3B1eCkKLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZSArIDFgCi0KLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgICBub25zdG9wdXgpIHZlcnN0cmluZ19wcmVmaXg9bm9uc3RvcHV4IDs7Ci0JICAgICopICAgICAgICAgdmVyc3RyaW5nX3ByZWZpeD1zZ2kgOzsKLQkgIGVzYWMKLQkgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgotCSAgZG9uZQotCi0JICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCi0JICBtYWpvcj0uJG1ham9yCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCi0JICA7OwotCi0JbGludXgpCi0JICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCi0JICA7OwotCi0Jb3NmKQotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JGFnZQotCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAotCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCi0JICBkb25lCi0KLQkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KLQkgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCi0JICA7OwotCi0Jc3Vub3MpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCXdpbmRvd3MpCi0JICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCi0JICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSItJG1ham9yIgotCSAgOzsKLQotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKLQkgICRlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICA7OwotCWVzYWMKLQotCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCi0JaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgIG1ham9yPQotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICBkYXJ3aW4pCi0JICAgICMgd2UgY2FuJ3QgY2hlY2sgZm9yICIwLjAiIGluIGFyY2hpdmVfY21kcyBkdWUgdG8gcXVvdGluZwotCSAgICAjIHByb2JsZW1zLCBzbyB3ZSByZXNldCBpdCBjb21wbGV0ZWx5Ci0JICAgIHZlcnN0cmluZz0KLQkgICAgOzsKLQkgICopCi0JICAgIHZlcnN0cmluZz0iMC4wIgotCSAgICA7OwotCSAgZXNhYwotCSAgaWYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgICB2ZXJzdWZmaXg9Ci0JICBlbHNlCi0JICAgIHZlcnN1ZmZpeD0iLjAuMCIKLQkgIGZpCi0JZmkKLQotCSMgUmVtb3ZlIHZlcnNpb24gaW5mbyBmcm9tIG5hbWUgaWYgdmVyc2lvbmluZyBzaG91bGQgYmUgYXZvaWRlZAotCWlmIHRlc3QgIiRhdm9pZF92ZXJzaW9uIiA9IHllcyAmJiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICBtYWpvcj0KLQkgIHZlcnN1ZmZpeD0KLQkgIHZlcnN0cmluZz0iIgotCWZpCi0KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCi0JaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgIGZpCi0JZWxzZQotCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KLQkjIFJlbW92ZSBvdXIgb3V0cHV0cywgYnV0IGRvbid0IHJlbW92ZSBvYmplY3QgZmlsZXMgc2luY2UgdGhleQotCSMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdoZW4gY29tcGlsaW5nIFBJQyBvYmplY3RzLgotCXJlbW92ZWxpc3Q9Ci0JdGVtcHJlbW92ZWxpc3Q9YCRlY2hvICIkb3V0cHV0X29iamRpci8qImAKLQlmb3IgcCBpbiAkdGVtcHJlbW92ZWxpc3Q7IGRvCi0JICBjYXNlICRwIGluCi0JICAgICouJG9iamV4dCkKLQkgICAgICAgOzsKLQkgICAgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgfCAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qIHwgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKikKLQkgICAgICAgaWYgdGVzdCAiWCRwcmVjaW91c19maWxlc19yZWdleCIgIT0gIlgiOyB0aGVuCi0JICAgICAgICAgaWYgZWNobyAkcCB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKLQkgICAgICAgICB0aGVuCi0JCSAgIGNvbnRpbnVlCi0JCSBmaQotCSAgICAgICBmaQotCSAgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkcCIKLQkgICAgICAgOzsKLQkgICAgKikgOzsKLQkgIGVzYWMKLQlkb25lCi0JaWYgdGVzdCAtbiAiJHJlbW92ZWxpc3QiOyB0aGVuCi0JICAkc2hvdyAiJHtybX1yICRyZW1vdmVsaXN0IgotCSAgJHJ1biAke3JtfXIgJHJlbW92ZWxpc3QKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgotCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0KLQkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCi0Jb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCi0gICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotCWxpYl9zZWFyY2hfcGF0aD1gJGVjaG8gIiRsaWJfc2VhcmNoX3BhdGggIiB8ICR7U0VEfSAtZSAncyUgJHBhdGggJSAlZydgCi0JZGVwbGlicz1gJGVjaG8gIiRkZXBsaWJzICIgfCAke1NFRH0gLWUgJ3MlIC1MJHBhdGggJSAlZydgCi0JZGVwZW5kZW5jeV9saWJzPWAkZWNobyAiJGRlcGVuZGVuY3lfbGlicyAiIHwgJHtTRUR9IC1lICdzJSAtTCRwYXRoICUgJWcnYAotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQl0ZW1wX3hycGF0aD0KLQlmb3IgbGliZGlyIGluICR4cnBhdGg7IGRvCi0JICB0ZW1wX3hycGF0aD0iJHRlbXBfeHJwYXRoIC1SJGxpYmRpciIKLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLQlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF94cnBhdGggJGRlcGVuZGVuY3lfbGlicyIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgZGxmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcyB0aGF0IHdvbid0IGJlIGRscHJlb3BlbmVkCi0gICAgICBvbGRfZGxmaWxlcz0iJGRsZmlsZXMiCi0gICAgICBkbGZpbGVzPQotICAgICAgZm9yIGxpYiBpbiAkb2xkX2RsZmlsZXM7IGRvCi0JY2FzZSAiICRkbHByZWZpbGVzICRkbGZpbGVzICIgaW4KLQkqIiAkbGliICIqKSA7OwotCSopIGRsZmlsZXM9IiRkbGZpbGVzICRsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbHByZWZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzCi0gICAgICBvbGRfZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMiCi0gICAgICBkbHByZWZpbGVzPQotICAgICAgZm9yIGxpYiBpbiAkb2xkX2RscHJlZmlsZXM7IGRvCi0JY2FzZSAiJGRscHJlZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotYmVvcyopCi0JICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKLQkgICAgOzsKLQkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgICAgZGVwbGlicz0iJGRlcGxpYnMgLWZyYW1ld29yayBTeXN0ZW0iCi0JICAgIDs7Ci0JICAqLSotbmV0YnNkKikKLQkgICAgIyBEb24ndCBsaW5rIHdpdGggbGliYyB1bnRpbCB0aGUgYS5vdXQgbGQuc28gaXMgZml4ZWQuCi0JICAgIDs7Ci0JICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotIAkgICopCi0JICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCi0JICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JZmkKLQotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCXBhc3NfYWxsKQotCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCi0JICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCi0JICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKLQkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW9yLgotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCSAgOzsKLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRybSBjb25mdGVzdC5jCi0JICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0JICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotCSAgJHJtIGNvbmZ0ZXN0Ci0JICAkTFRDQyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRkZXBsaWJzCi0JICBpZiB0ZXN0ICIkPyIgLWVxIDAgOyB0aGVuCi0JICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgbmFtZT1gZXhwciAkaSA6ICctbFwoLipcKSdgCi0JICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0gICAgICAgICAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiAmJiB0ZXN0ICIkbmFtZSIgLW5lICIwIjsgdGhlbgotCQlpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCSAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSAgKiIgJGkgIiopCi0JCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgIGk9IiIKLQkJICAgIDs7Ci0JCSAgZXNhYwotCSAgICAgICAgZmkKLQkJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgotCQkgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKLQkJICBkZXBsaWJfbWF0Y2g9JDIKLQkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICBlbHNlCi0JCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICRlY2hvCi0JCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCi0JCSAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggSSBiZWxpZXZlIHlvdSBkbyBub3QgaGF2ZSIKLQkJICAgICRlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSBpdCBmb3IiCi0JCSAgICAkZWNobyAiKioqIGl0cyBkeW5hbWljIGRlcGVuZGVuY3kgbGlzdCB0aGF0IHByb2dyYW1zIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgotCQkgIGZpCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBlbHNlCi0JICAgICMgRXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZQotCSAgICAjIHRoZSBzaXR1YXRpb246IENvbXBpbGUgYSBzZXBhcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9YGV4cHIgJGkgOiAnLWxcKC4qXCknYAotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotICAgICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgotCQkkcm0gY29uZnRlc3QKLQkJJExUQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQotCQkjIERpZCBpdCB3b3JrPwotCQlpZiB0ZXN0ICIkPyIgLWVxIDAgOyB0aGVuCi0JCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkgICAgKiIgJGkgIiopCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgICBpPSIiCi0JCSAgICAgIDs7Ci0JCSAgICBlc2FjCi0JCSAgZmkKLQkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCi0JCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQkgICAgZGVwbGliX21hdGNoPSQyCi0JCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgZWxzZQotCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICAgJGVjaG8KLQkJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgotCQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKLQkJICAgICAgJGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKLQkJICAgIGZpCi0JCSAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgICRlY2hvCi0JCSAgJGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKLQkJICAkZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICAkZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICAkZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0JICA7OwotCWZpbGVfbWFnaWMqKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgICIkbmFtZSIgIT0gIjAiOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICBhX2RlcGxpYj0iIgotCQkgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgotCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgXAotCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUKLQkJICAgICAgZmkKLQkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCi0JCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KLQkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluawotCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCi0JCSAgICAgICMgYnV0IHNvIHdoYXQ/Ci0JCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCi0JCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbwotCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAotCQkJY2FzZSAkcG90bGlibGluayBpbgotCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7Ci0JCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7Ci0JCQllc2FjCi0JCSAgICAgIGRvbmUKLQkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIFwKLQkJCSB8ICR7U0VEfSAxMHEgXAotCQkJIHwgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJCWFfZGVwbGliPSIiCi0JCQlicmVhayAyCi0JCSAgICAgIGZpCi0JCSAgZG9uZQotCQlkb25lCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJJGVjaG8KLQkJJGVjaG8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQkkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSRlY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgotCQllbHNlCi0JCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgJGVjaG8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgZmkKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW1hdGNoX3BhdHRlcm4qKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgotCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSoiICRhX2RlcGxpYiAiKikKLQkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCSAgYV9kZXBsaWI9IiIKLQkJICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0Ci0JCSAgICBpZiBldmFsICRlY2hvIFwiJHBvdGVudF9saWJcIiAyPi9kZXYvbnVsbCBcCi0JCSAgICAgICAgfCAke1NFRH0gMTBxIFwKLQkJICAgICAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICAgICAgYV9kZXBsaWI9IiIKLQkJICAgICAgYnJlYWsgMgotCQkgICAgZmkKLQkJICBkb25lCi0JCWRvbmUKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQkkZWNobwotCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCi0JCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKLQkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCi0JCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgotCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCi0JCWVsc2UKLQkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKLQkJICAkZWNobyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0Jbm9uZSB8IHVua25vd24gfCAqKQotCSAgbmV3ZGVwbGlicz0iIgotCSAgdG1wX2RlcGxpYnM9YCRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKLQkgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnYAotCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbwotCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKLQkgICAgICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJHRtcF9kZXBsaWJzIiB8ICR7U0VEfSAtZSAiMXMsXlgsLCIgLWUgInMsJGksLCJgCi0JICAgIGRvbmUKLQkgIGZpCi0JICBpZiAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWyAJXS8vZycgXAotCSAgICB8IGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCi0JICAgICRlY2hvCi0JICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgotCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKLQkgICAgZmkKLQkgICAgJGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgotCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkgIGZpCi0JICA7OwotCWVzYWMKLQl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCi0JbWFqb3I9JG1ham9yX3NhdmUKLQlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKLQlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKLQluYW1lPSRuYW1lX3NhdmUKLQotCWNhc2UgJGhvc3QgaW4KLQkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgbmV3ZGVwbGlicz1gJGVjaG8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAotCSAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAkZWNobwotCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCi0JICAgICRlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgJGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgotCSAgICAkZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgotCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCSAgICAgICRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgotCSAgICAgICRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgJGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgZWxzZQotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBmaQotCSAgZWxzZQotCSAgICAkZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKLQkgICAgJGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgICRlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCi0KLQkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgotCSAgICAgICRlY2hvCi0JICAgICAgJGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCi0JICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgotCSAgICAgICRlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCi0JICAgICAgJGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkJYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgICAgZWxzZQotCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQlmaQotCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQotCWRlcGxpYnM9JG5ld2RlcGxpYnMKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KLSAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIGRsbmFtZT0KLQotICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgotCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotCSAgaGFyZGNvZGVfbGliZGlycz0KLQkgIGRlcF9ycGF0aD0KLQkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCi0JICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKLQkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbwotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkJZWxzZQotCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgotCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJICAgIDs7Ci0JCSAgKikKLQkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQkgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JICAgICAgZWxzZQotCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKLQkgICAgICBmaQotCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGRvbmUKLQkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCI7IHRoZW4KLQkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXCIKLQkgICAgZWxzZQotCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBmaQotCSAgZmkKLQkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICAgIHJwYXRoPQotCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgICAgZG9uZQotCSAgICBldmFsICIkcnVucGF0aF92YXI9JyRycGF0aFwkJHJ1bnBhdGhfdmFyJzsgZXhwb3J0ICRydW5wYXRoX3ZhciIKLQkgIGZpCi0JICB0ZXN0IC1uICIkZGVwX3JwYXRoIiAmJiBkZXBsaWJzPSIkZGVwX3JwYXRoICRkZXBsaWJzIgotCWZpCi0KLQlzaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgiCi0JdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCi0JaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KLQkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLQlmaQotCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlyZWFsbmFtZT0iJDIiCi0Jc2hpZnQ7IHNoaWZ0Ci0KLQlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JZWxzZQotCSAgc29uYW1lPSIkcmVhbG5hbWUiCi0JZmkKLQlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotCSAgZGxuYW1lPSRzb25hbWUKLQlmaQotCi0JbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCi0JZm9yIGxpbmsKLQlkbwotCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgotCWRvbmUKLQotCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCi0JdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0KLQkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcwotCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICBldmFsIGNtZD1cIiRjbWRcIgotCSAgICAgIGlmIGxlbj1gZXhwciAiWCRjbWQiIDogIi4qImAgJiYKLQkgICAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICAgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICAgICAgc2tpcHBlZF9leHBvcnQ9ZmFsc2UKLQkgICAgICBlbHNlCi0JICAgICAgICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KLQkgICAgICAgICRzaG93ICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKLQkgICAgICAgIHNraXBwZWRfZXhwb3J0PToKLQkJIyBCcmVhayBvdXQgZWFybHksIG90aGVyd2lzZSBza2lwcGVkX2V4cG9ydCBtYXkgYmUKLQkJIyBzZXQgdG8gZmFsc2UgYnkgYSBsYXRlciBidXQgc2hvcnRlciBjbWQuCi0JCWJyZWFrCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRzaG93ICIkRUdSRVAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgICRzaG93ICIkbXYgXCIke2V4cG9ydF9zeW1ib2xzfVRcIiBcIiRleHBvcnRfc3ltYm9sc1wiIgotCSAgICAgICRydW4gZXZhbCAnJG12ICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgJHJ1biBldmFsICckZWNobyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkZXhwb3J0X3N5bWJvbHMiJwotCWZpCi0KLQl0bXBfZGVwbGlicz0KLQlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JCWNhc2UgIiAkY29udmVuaWVuY2UgIiBpbgotCQkqIiAkdGVzdF9kZXBsaWIgIiopIDs7Ci0JCSopCi0JCQl0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKLQkJCTs7Ci0JCWVzYWMKLQlkb25lCi0JZGVwbGlicz0iJHRtcF9kZXBsaWJzIgotCi0JaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQkgIGZpCi0JZmkKLQkKLQlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKLQkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKLQlmaQotCi0JIyBNYWtlIGEgYmFja3VwIG9mIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IHdoZW4gcmVsaW5raW5nCi0JaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1VICYmICRtdiAkcmVhbG5hbWUgJHtyZWFsbmFtZX1VKScgfHwgZXhpdCAkPwotCWZpCi0KLQkjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2V4cHN5bV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9jbWRzXCIKLQkgICAgY21kcz0kbW9kdWxlX2NtZHMKLQkgIGZpCi0JZWxzZQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKLQkgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLQllbHNlCi0JICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotCSAgY21kcz0kYXJjaGl2ZV9jbWRzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmCi0JICAgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgotCSAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgOgotCWVsc2UKLQkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZS4KLQkgICRlY2hvICJjcmVhdGluZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4uLiIKLQotCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KLQkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQotCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQotCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKLQkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCi0JICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55Ci0JICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCi0JICAjIHRoZSBzcGVjLgotCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcwotCSAgZmkKLQkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKLQkgIG91dHB1dF9sYT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotCi0JICAjIENsZWFyIHRoZSByZWxvYWRhYmxlIG9iamVjdCBjcmVhdGlvbiBjb21tYW5kIHF1ZXVlIGFuZAotCSAgIyBpbml0aWFsaXplIGsgdG8gb25lLgotCSAgdGVzdF9jbWRzPQotCSAgY29uY2F0X2NtZHM9Ci0JICBvYmpsaXN0PQotCSAgZGVsZmlsZXM9Ci0JICBsYXN0X3JvYmo9Ci0JICBrPTEKLQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgIyBMb29wIG92ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBiZSBsaW5rZWQuCi0JICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKLQkgIGRvCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCSAgICBpZiB0ZXN0ICJYJG9iamxpc3QiID0gWCB8fAotCSAgICAgICB7IGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKLQkJIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgfTsgdGhlbgotCSAgICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCi0JICAgIGVsc2UKLQkgICAgICAjIFRoZSBjb21tYW5kICR0ZXN0X2NtZHMgaXMgYWxtb3N0IHRvbyBsb25nLCBhZGQgYQotCSAgICAgICMgY29tbWFuZCB0byB0aGUgcXVldWUuCi0JICAgICAgaWYgdGVzdCAiJGsiIC1lcSAxIDsgdGhlbgotCQkjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgotCQlldmFsIGNvbmNhdF9jbWRzPVwiJHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCSAgICAgIGVsc2UKLQkJIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KLQkJIyB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkJZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCSAgICAgIGZpCi0JICAgICAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAgICAgaz1gZXhwciAkayArIDFgCi0JICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JICAgICAgb2JqbGlzdD0kb2JqCi0JICAgICAgbGVuPTEKLQkgICAgZmkKLQkgIGRvbmUKLQkgICMgSGFuZGxlIHRoZSByZW1haW5pbmcgb2JqZWN0cyBieSBjcmVhdGluZyBvbmUgbGFzdAotCSAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKLQkgICMgZmlsZXMgd2lsbCBsaW5rIGluIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgotCSAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+Ci0JICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgotCi0JICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICBsaWJvYmpzPSRvdXRwdXQKLQkgICAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBleHBvcnQgZmlsZS4KLQkgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+JGV4cG9ydF9zeW1ib2xzX2NtZHNcIgotICAgICAgICAgIGZpCi0KLQkgICMgU2V0IHVwIGEgY29tbWFuZCB0byByZW1vdmUgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzCi0JICAjIGFmdGVyIHRoZXkgYXJlIHVzZWQuCi0JICBpPTAKLQkgIHdoaWxlIHRlc3QgIiRpIiAtbHQgIiRrIgotCSAgZG8KLQkgICAgaT1gZXhwciAkaSArIDFgCi0JICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2l9LiRvYmpleHQiCi0JICBkb25lCi0KLQkgICRlY2hvICJjcmVhdGluZyBhIHRlbXBvcmFyeSByZWxvYWRhYmxlIG9iamVjdCBmaWxlOiAkb3V0cHV0IgotCi0JICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCi0JICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNvbmNhdF9jbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0KLQkgIGxpYm9ianM9JG91dHB1dAotCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCi0JICBvdXRwdXQ9JHNhdmVfb3V0cHV0Ci0KLQkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGZpCi0JICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQotCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCi0KLQkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKLQkgICAgZWxzZQotCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCi0JICAgIGZpCi0JICBlbHNlCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgICBmaQotCSAgZmkKLQotCSAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcwotCSAgIyB0byB0aGUganVzdC1yZXNldCAkY21kcy4KLQkgIGV2YWwgY21kcz1cIlwkY21kc35cJHJtICRkZWxmaWxlc1wiCi0JZmkKLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICBldmFsIGNtZD1cIiRjbWRcIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IHsKLQkgICAgbHRfZXhpdD0kPwotCi0JICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAotCSAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKLQkgICAgZmkKLQotCSAgICBleGl0ICRsdF9leGl0Ci0JICB9Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCi0JIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0Ci0JaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRtdiAiJHJlYWxuYW1lIlUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPwotCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JICAgIGZpCi0JICBmaQotCi0JICBleGl0ICRFWElUX1NVQ0NFU1MKLQlmaQotCi0JIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KLQlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLQkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KLQkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/Ci0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgJG91dHB1dCBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKLSAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCi0gICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQotICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KLSAgICAgIHJlbG9hZF9jb252X29ianM9Ci0gICAgICBnZW50b3A9Ci0gICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgotICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotICAgICAgd2w9Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIHJlbG9hZF9jb252X29ianM9XCJcJHJlbG9hZF9vYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JZWxzZQotCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke29ian14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQotCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBjbWRzPSRyZWxvYWRfY21kcwotICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCWV2YWwgY21kPVwiJGNtZFwiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAkcnVuICR7cm19ciAkZ2VudG9wCi0JZmkKLQotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICRnZW50b3AKLQlmaQotCi0JIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKLQkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkjICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQljbWRzPSRyZWxvYWRfY21kcwotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCi0JJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSRydW4gJHtybX1yICRnZW50b3AKLSAgICAgIGZpCi0KLSAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgOzsKLQotICAgIHByb2cpCi0gICAgICBjYXNlICRob3N0IGluCi0JKmN5Z3dpbiopIG91dHB1dD1gJGVjaG8gJG91dHB1dCB8ICR7U0VEfSAtZSAncywuZXhlJCwsO3MsJCwuZXhlLCdgIDs7Ci0gICAgICBlc2FjCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IHllczsgdGhlbgotCWlmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCi0JICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgotCWZpCi0gICAgICBmaQotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQljb21waWxlX2RlcGxpYnM9YCRlY2hvICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAotCWZpbmFsaXplX2RlcGxpYnM9YCRlY2hvICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqZGFyd2luKikKLSAgICAgICAgIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycwotICAgICAgICBpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRjb21waWxlX2RlcGxpYnMiCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmluYWxpemVfZGVwbGlicyIKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCi0JICAqIjokbGliZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGxpYmRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBkbHN5bXM9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQljYXNlICRkbHN5bXMgaW4KLQkiIikgOzsKLQkqLmMpCi0JICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgotCSAgbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0ubm0iCi0KLQkgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0JICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCi0JICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgotCSAgJHNob3cgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgIHRlc3QgLXogIiRydW4iICYmICRlY2hvID4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0vKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KLS8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gXCJDXCIgewotI2VuZGlmCi0KLS8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCi0jZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCi0iCi0KLQkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgotCi0JICAgIHRlc3QgLXogIiRydW4iICYmICRlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKLQotCSAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCi0JICAgIHByb2dmaWxlcz1gJGVjaG8gIlgkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCSAgICBmb3IgYXJnIGluICRwcm9nZmlsZXM7IGRvCi0JICAgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICAgIGRvbmUKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0KLQkgICAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQkgICAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCi0JICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgJHJ1biBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZWxzZQotCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1lICdzL1woWyBdWy4qXiRdXCkvXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKLQkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWAkZWNobyAiJGFyZyIgfCAke1NFRH0gLWUgJ3MlXi4qLyUlJ2AKLQkgICAgJHJ1biBldmFsICckZWNobyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJwotCSAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgotCSAgICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwKLQkJaWYgc29ydCAtayAzIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCSAgc29ydCAtayAzCi0JCWVsc2UKLQkJICBzb3J0ICsyCi0JCWZpIHwKLQkJdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCi0JICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0KLSN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHIgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLSIKLQotCSAgICBjYXNlICRob3N0IGluCi0JICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0JICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLS8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY2FuJ3QgYmUgY29uc3QsIGJlY2F1c2UKLSAgIHJ1bnRpbWUgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uCi0gICBvbiBwc2V1ZG8tcmVsb2NzICovCi1zdHJ1Y3QgewotIgotCSAgICAgIDs7Ci0JICAgICogKQotCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi1jb25zdCBzdHJ1Y3QgewotIgotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQotCi0JICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyIGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXtcCi0iCi0KLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyKSAwfQotfTsKLQotLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCi0jaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECi1zdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgewotICByZXR1cm4gbHRfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JICBmaQotCi0JICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9Ci0JICBjYXNlICRob3N0IGluCi0JICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKLQkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcwotCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQotCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCi0JICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7Ci0JICAgIGVzYWM7OwotCSAgKi0qLWhwdXgqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIjs7Ci0JICAgIGVzYWMKLQkgIGVzYWMKLQotCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQkgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJExUQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlICIkZGxzeW1zIiknIHx8IGV4aXQgJD8KLQotCSAgIyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8kZGxzeW1zICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCSAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiCi0KLQkgICMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0JICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0JICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCSMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0JIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQotCSMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLQotCSMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCi0JIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCi0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIgotCXN0YXR1cz0kPwotCi0JIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQlpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgotCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgotCWZpCi0KLQlleGl0ICRzdGF0dXMKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgotCXJwYXRoPQotCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCi0JICBjYXNlICRkaXIgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKLQkgICAgIyBBYnNvbHV0ZSBwYXRoLgotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCi0JICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCXRlbXBfcnBhdGg9IiRycGF0aCIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNvbXBpbGVfdmFyPQotICAgICAgZmluYWxpemVfdmFyPQotICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCSMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCi0JJHJ1biAkcm0gJG91dHB1dAotCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPwotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIgMT4mMgotICAgICAgZWxzZQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCi0JICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCi0JICBlbHNlCi0JICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcwotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgIGZpCi0JZWxzZQotCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgotICAgICAgJHJ1biAkcm0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQotCi0gICAgICAkc2hvdyAiJGxpbmtfY29tbWFuZCIKLSAgICAgICRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCi0JZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCi0JICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgotCSAgZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQkgIGVsc2UKLQkgICAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQkgIGZpCi0JZG9uZQotCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCi0JcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0JY2FzZSAkcHJvZ3BhdGggaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHFlY2hvPSIkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7OwotCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7OwotCWVzYWMKLQlxZWNobz1gJGVjaG8gIlgkcWVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZWxzZQotCXFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKLQkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgotCWNhc2UgJG91dHB1dCBpbgotCSAgKi5leGUpIG91dHB1dD1gJGVjaG8gJG91dHB1dHwke1NFRH0gJ3MsLmV4ZSQsLCdgIDs7Ci0JZXNhYwotCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucwotCWNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qKQotCSAgICBleGVleHQ9LmV4ZQotCSAgICBvdXRwdXRuYW1lPWAkZWNobyAkb3V0cHV0bmFtZXwke1NFRH0gJ3MsLmV4ZSQsLCdgIDs7Ci0JICAqKSBleGVleHQ9IDs7Ci0JZXNhYwotCWNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0JICAgIGN3cmFwcGVyc291cmNlPWAkZWNobyAke29iamRpcn0vbHQtJHtvdXRwdXRuYW1lfS5jYAotCSAgICBjd3JhcHBlcj1gJGVjaG8gJHtvdXRwdXR9LmV4ZWAKLQkgICAgJHJtICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKLQkgICAgdHJhcCAiJHJtICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0KLQkgICAgY2F0ID4gJGN3cmFwcGVyc291cmNlIDw8RU9GCi0KLS8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLQotICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0gICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0KLSAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotICAgQ3VycmVudGx5LCBpdCBzaW1wbHkgZXhlY3MgdGhlIHdyYXBwZXIgKnNjcmlwdCogIi9iaW4vc2ggJG91dHB1dCIsCi0gICBidXQgY291bGQgZXZlbnR1YWxseSBhYnNvcmIgYWxsIG9mIHRoZSBzY3JpcHRzIGZ1bmN0aW9uYWxpdHkgYW5kCi0gICBleGVjICRvYmpkaXIvJG91dHB1dG5hbWUgZGlyZWN0bHkuCi0qLwotRU9GCi0JICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2U8PCJFT0YiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2lmIGRlZmluZWQoUEFUSF9NQVgpCi0jIGRlZmluZSBMVF9QQVRITUFYIFBBVEhfTUFYCi0jZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBMVF9QQVRITUFYIE1BWFBBVEhMRU4KLSNlbHNlCi0jIGRlZmluZSBMVF9QQVRITUFYIDEwMjQKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAotICBkZWZpbmVkIChfX09TMl9fKQotI2RlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQotI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKLSNkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCi0jIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQotI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCi0jIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCi0gICAgICAgICgoKGNoKSA9PSBESVJfU0VQQVJBVE9SKSB8fCAoKGNoKSA9PSBESVJfU0VQQVJBVE9SXzIpKQotI2VuZGlmIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotCi0jZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCi0jZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKLSAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKLX0gd2hpbGUgKDApCi0KLWNvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9IE5VTEw7Ci0KLXZvaWQgKiB4bWFsbG9jIChzaXplX3QgbnVtKTsKLWNoYXIgKiB4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOwotY2hhciAqIGJhc2VuYW1lIChjb25zdCBjaGFyICpuYW1lKTsKLWNoYXIgKiBmbnF1YWxpZnkoY29uc3QgY2hhciAqcGF0aCk7Ci1jaGFyICogc3RyZW5kemFwKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKLXZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgY2hhciAqKm5ld2FyZ3o7Ci0gIGludCBpOwotCi0gIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKChjaGFyICopIGJhc2VuYW1lIChhcmd2WzBdKSk7Ci0gIG5ld2FyZ3ogPSBYTUFMTE9DKGNoYXIgKiwgYXJnYysyKTsKLUVPRgotCi0JICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKLSAgbmV3YXJnelswXSA9ICIkU0hFTEwiOwotRU9GCi0KLQkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PCJFT0YiCi0gIG5ld2FyZ3pbMV0gPSBmbnF1YWxpZnkoYXJndlswXSk7Ci0gIC8qIHdlIGtub3cgdGhlIHNjcmlwdCBoYXMgdGhlIHNhbWUgbmFtZSwgd2l0aG91dCB0aGUgLmV4ZSAqLwotICAvKiBzbyBtYWtlIHN1cmUgbmV3YXJnelsxXSBkb2Vzbid0IGVuZCBpbiAuZXhlICovCi0gIHN0cmVuZHphcChuZXdhcmd6WzFdLCIuZXhlIik7Ci0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgbmV3YXJneltpKzFdID0geHN0cmR1cChhcmd2W2ldKTsKLSAgbmV3YXJnelthcmdjKzFdID0gTlVMTDsKLUVPRgotCi0JICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKLSAgZXhlY3YoIiRTSEVMTCIsbmV3YXJneik7Ci1FT0YKLQotCSAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKLSAgcmV0dXJuIDEyNzsKLX0KLQotdm9pZCAqCi14bWFsbG9jIChzaXplX3QgbnVtKQotewotICB2b2lkICogcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKLSAgaWYgKCFwKQotICAgIGx0X2ZhdGFsICgiTWVtb3J5IGV4aGF1c3RlZCIpOwotCi0gIHJldHVybiBwOwotfQotCi1jaGFyICoKLXhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgcmV0dXJuIHN0cmluZyA/IHN0cmNweSAoKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksIHN0cmluZykgOiBOVUxMCi07Ci19Ci0KLWNoYXIgKgotYmFzZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIGNvbnN0IGNoYXIgKmJhc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKLSAgLyogU2tpcCBvdmVyIHRoZSBkaXNrIG5hbWUgaW4gTVNET1MgcGF0aG5hbWVzLiAqLwotICBpZiAoaXNhbHBoYSAobmFtZVswXSkgJiYgbmFtZVsxXSA9PSAnOicpCi0gICAgbmFtZSArPSAyOwotI2VuZGlmCi0KLSAgZm9yIChiYXNlID0gbmFtZTsgKm5hbWU7IG5hbWUrKykKLSAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAoKm5hbWUpKQotICAgICAgYmFzZSA9IG5hbWUgKyAxOwotICByZXR1cm4gKGNoYXIgKikgYmFzZTsKLX0KLQotY2hhciAqCi1mbnF1YWxpZnkoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgdG1wW0xUX1BBVEhNQVggKyAxXTsKLQotICBhc3NlcnQocGF0aCAhPSBOVUxMKTsKLQotICAvKiBJcyBpdCBxdWFsaWZpZWQgYWxyZWFkeT8gKi8KLSNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKLSAgaWYgKGlzYWxwaGEgKHBhdGhbMF0pICYmIHBhdGhbMV0gPT0gJzonKQotICAgIHJldHVybiB4c3RyZHVwIChwYXRoKTsKLSNlbmRpZgotICBpZiAoSVNfRElSX1NFUEFSQVRPUiAocGF0aFswXSkpCi0gICAgcmV0dXJuIHhzdHJkdXAgKHBhdGgpOwotCi0gIC8qIHByZXBlbmQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ICovCi0gIC8qIGRvZXNuJ3QgaGFuZGxlICd+JyAqLwotICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCi0gICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7Ci0gIHNpemUgPSBzdHJsZW4odG1wKSArIDEgKyBzdHJsZW4ocGF0aCkgKyAxOyAvKiArMiBmb3IgJy8nIGFuZCAnXDAnICovCi0gIHAgPSBYTUFMTE9DKGNoYXIsIHNpemUpOwotICBzcHJpbnRmKHAsICIlcyVjJXMiLCB0bXAsIERJUl9TRVBBUkFUT1IsIHBhdGgpOwotICByZXR1cm4gcDsKLX0KLQotY2hhciAqCi1zdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCi17Ci0gIHNpemVfdCBsZW4sIHBhdGxlbjsKLQotICBhc3NlcnQoc3RyICE9IE5VTEwpOwotICBhc3NlcnQocGF0ICE9IE5VTEwpOwotCi0gIGxlbiA9IHN0cmxlbihzdHIpOwotICBwYXRsZW4gPSBzdHJsZW4ocGF0KTsKLQotICBpZiAocGF0bGVuIDw9IGxlbikKLSAgewotICAgIHN0ciArPSBsZW4gLSBwYXRsZW47Ci0gICAgaWYgKHN0cmNtcChzdHIsIHBhdCkgPT0gMCkKLSAgICAgICpzdHIgPSAnXDAnOwotICB9Ci0gIHJldHVybiBzdHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKiBtb2RlLAotICAgICAgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlLCB2YV9saXN0IGFwKQotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7Ci0KLSAgaWYgKGV4aXRfc3RhdHVzID49IDApCi0gICAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi12b2lkCi1sdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOwotICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci19Ci1FT0YKLQkgICMgd2Ugc2hvdWxkIHJlYWxseSB1c2UgYSBidWlsZC1wbGF0Zm9ybSBzcGVjaWZpYyBjb21waWxlcgotCSAgIyBoZXJlLCBidXQgT1RPSCwgdGhlIHdyYXBwZXJzIChzaGVsbCBzY3JpcHQgYW5kIHRoaXMgQyBvbmUpCi0JICAjIGFyZSBvbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleGVjdXRlIHRoZSAicmVhbCIgYmluYXJ5LgotCSAgIyBTaW5jZSB0aGUgInJlYWwiIGJpbmFyeSBpcyBidWlsdCBmb3IgJGhvc3QsIHRoZW4gdGhpcwotCSAgIyB3cmFwcGVyIG1pZ2h0IGFzIHdlbGwgYmUgYnVpbHQgZm9yICRob3N0LCB0b28uCi0JICAkcnVuICRMVENDIC1zIC1vICRjd3JhcHBlciAkY3dyYXBwZXJzb3VyY2UKLQkgIDs7Ci0JZXNhYwotCSRybSAkb3V0cHV0Ci0JdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0KLQkkZWNobyA+ICRvdXRwdXQgIlwKLSMhICRTSEVMTAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotIwotIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nJHtTRUR9IC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKLQotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgotaWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCi0gICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0gIG5vdGluc3RfZGVwbGlicz0nJG5vdGluc3RfZGVwbGlicycKLWVsc2UKLSAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJGVjaG8gYXJlIGFscmVhZHkgc2V0LgotICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgZWNobz1cIiRxZWNob1wiCi0gICAgZmlsZT1cIlwkMFwiCi0gICAgIyBNYWtlIHN1cmUgZWNobyB3b3Jrcy4KLSAgICBpZiB0ZXN0IFwiWFwkMVwiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICAgICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgICAgIHNoaWZ0Ci0gICAgZWxpZiB0ZXN0IFwiWFxgKFwkZWNobyAnXHQnKSAyPi9kZXYvbnVsbFxgXCIgPSAnWFx0JzsgdGhlbgotICAgICAgIyBZaXBwZWUsIFwkZWNobyB3b3JrcyEKLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlIFwkZWNobyB3aWxsIHdvcmsuCi0gICAgICBleGVjICRTSEVMTCBcIlwkMFwiIC0tbm8tcmVleGVjIFwkezErXCJcJEBcIn0KLSAgICBmaQotICBmaVwKLSIKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KLSAgdGhpc2Rpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKLSAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgotCi0gICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgotICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKLSAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbwotICAgIGRlc3RkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAotCi0gICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgotICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KLSAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgotICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7Ci0gICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLQotICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAotICBkb25lCi0KLSAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KLSAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAotICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgotIgotCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnJGV4ZWV4dAotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotCi0gIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fCBcXAotICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgJHtTRUR9IDFxXGA7IFxcCi0gICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KLQotICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCi0KLSAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgotICAgICAgJG1rZGlyIFwiXCRwcm9nZGlyXCIKLSAgICBlbHNlCi0gICAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgICBmaSIKLQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKLSAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCi0gICAgICBpZiByZWxpbmtfY29tbWFuZF9vdXRwdXQ9XGBldmFsIFwkcmVsaW5rX2NvbW1hbmQgMj4mMVxgOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkZWNobyBcIlwkcmVsaW5rX2NvbW1hbmRfb3V0cHV0XCIgPiYyCi0JJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKLSAgICB7ICRybSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKLSAgICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQotICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICBmaSIKLQllbHNlCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09JyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKLQotCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgotICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKLQotICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgotICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCi0gICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzo6KlwkLy8nXGAKLQotICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgotIgotCWZpCi0KLQkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgotCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICi0gICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKLSIKLQlmaQotCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0iCi0JY2FzZSAkaG9zdCBpbgotCSMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cwotCSotKi1taW5ndyB8ICotKi1vczIqKQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgZXhlYyBcIlwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCi0JKikKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQllc2FjCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgXCRlY2hvIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifVwiCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotICBlbHNlCi0gICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgotICAgIFwkZWNobyBcIlwkMDogZXJyb3I6IFxcXGBcJHByb2dkaXIvXCRwcm9ncmFtJyBkb2VzIG5vdCBleGlzdFwiIDE+JjIKLSAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKLSAgICAkZWNobyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gIGZpCi1maVwKLSIKLQljaG1vZCAreCAkb3V0cHV0Ci0gICAgICBmaQotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgotICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KLQlvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgotCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWVsc2UKLQkgIG9sZG9ianM9IiRvbGRfZGVwbGlicyAkbm9uX3BpY19vYmplY3RzIgotCWZpCi0JYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgotCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQlmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkYWRkbGlicwotCW9sZG9ianM9IiRvbGRvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotICAgICAgZmkKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICBjbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCi0gICAgICBlbHNlCi0JIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCi0JIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKLQkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQotCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCi0JIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKLQkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCi0JaWYgKGZvciBvYmogaW4gJG9sZG9ianMKLQkgICAgZG8KLQkgICAgICAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJwotCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KLQkgIDoKLQllbHNlCi0JICAkZWNobyAiY29weWluZyBzZWxlY3RlZCBvYmplY3QgZmlsZXMgdG8gYXZvaWQgYmFzZW5hbWUgY29uZmxpY3RzLi4uIgotCi0JICBpZiB0ZXN0IC16ICIkZ2VudG9wIjsgdGhlbgotCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgICAkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JICAgICRydW4gJHtybX1yICIkZ2VudG9wIgotCSAgICAkc2hvdyAiJG1rZGlyICRnZW50b3AiCi0JICAgICRydW4gJG1rZGlyICIkZ2VudG9wIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAiJHN0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgICAgIGV4aXQgJHN0YXR1cwotCSAgICBmaQotCSAgZmkKLQotCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCi0JICBvbGRvYmpzPQotCSAgY291bnRlcj0xCi0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIG9iamJhc2U9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgotCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OwotCSAgICAqW1wgL10iJG9iamJhc2UgIiopCi0JICAgICAgd2hpbGUgOjsgZG8KLQkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KLQkJIyBvdmVybGFwcy4KLQkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKLQkJY291bnRlcj1gZXhwciAkY291bnRlciArIDFgCi0JCWNhc2UgIiAkb2xkb2JqcyAiIGluCi0JCSpbXCAvXSIkbmV3b2JqICIqKSA7OwotCQkqKSBpZiB0ZXN0ICEgLWYgIiRnZW50b3AvJG5ld29iaiI7IHRoZW4gYnJlYWs7IGZpIDs7Ci0JCWVzYWMKLQkgICAgICBkb25lCi0JICAgICAgJHNob3cgImxuICRvYmogJGdlbnRvcC8kbmV3b2JqIHx8IGNwICRvYmogJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgICRydW4gbG4gIiRvYmoiICIkZ2VudG9wLyRuZXdvYmoiIHx8Ci0JICAgICAgJHJ1biBjcCAiJG9iaiIgIiRnZW50b3AvJG5ld29iaiIKLQkgICAgICBvbGRvYmpzPSIkb2xkb2JqcyAkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgOzsKLQkgICAgKikgb2xkb2Jqcz0iJG9sZG9ianMgJG9iaiIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0KLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0KLQlpZiBsZW49YGV4cHIgIlgkY21kcyIgOiAiLioiYCAmJgotCSAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCi0JZWxzZQotCSAgIyB0aGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgaW4gcGFydHMKLQkgICRlY2hvICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgotCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgotCSAgUkFOTElCPToKLQkgIG9iamxpc3Q9Ci0JICBjb25jYXRfY21kcz0KLQkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcwotCi0JICAjIElzIHRoZXJlIGEgYmV0dGVyIHdheSBvZiBmaW5kaW5nIHRoZSBsYXN0IG9iamVjdCBpbiB0aGUgbGlzdD8KLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgbGFzdF9vbGRvYmo9JG9iagotCSAgZG9uZQotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBvbGRvYmpzPSIkb2JqbGlzdCAkb2JqIgotCSAgICBvYmpsaXN0PSIkb2JqbGlzdCAkb2JqIgotCSAgICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgICAgaWYgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgotCSAgICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiI7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCi0JICAgICAgb2xkb2Jqcz0kb2JqbGlzdAotCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCi0JICAgICAgICBSQU5MSUI9JHNhdmVfUkFOTElCCi0JICAgICAgZmkKLQkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KLQkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgICAgIG9iamxpc3Q9Ci0JICAgIGZpCi0JICBkb25lCi0JICBSQU5MSUI9JHNhdmVfUkFOTElCCi0JICBvbGRvYmpzPSRvYmpsaXN0Ci0JICBpZiB0ZXN0ICJYJG9sZG9ianMiID0gIlgiIDsgdGhlbgotCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzXCIKLQkgIGVsc2UKLQkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc35cJG9sZF9hcmNoaXZlX2NtZHNcIgotCSAgZmkKLQlmaQotICAgICAgZmkKLSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRnZW5lcmF0ZWQiOyB0aGVuCi0gICAgICAkc2hvdyAiJHtybX1yJGdlbmVyYXRlZCIKLSAgICAgICRydW4gJHtybX1yJGdlbmVyYXRlZAotICAgIGZpCi0KLSAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICBjYXNlICRvdXRwdXQgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLSAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCi0JICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgotCWVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCWVsc2UKLQkgIHZhcl92YWx1ZT1gJGVjaG8gIlgkdmFyX3ZhbHVlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQkgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgotICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgotCXJlbGlua19jb21tYW5kPQotICAgICAgZmkKLQotCi0gICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCi0JICAgICAgYnJlYWsKLQkgICAgZmkKLQkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCi0JICAgICMgUmVwbGFjZSBhbGwgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMgd2l0aCB0aGUgaW5zdGFsbGVkIG9uZXMKLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkZGVwbGliIGluCi0JICAgICAgKi5sYSkKLQkJbmFtZT1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkJICBleGl0ICRFWElUX0ZBSUxVUkUKLQkJZmkKLQkJbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRsaWJkaXIvJG5hbWUiCi0JCTs7Ci0JICAgICAgKikgbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgbmV3ZGxmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KLQkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAotCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCWV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICAgIGZpCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYmRpci8kbmFtZSIKLQkgICAgZG9uZQotCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLQkgICAgbmV3ZGxwcmVmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAotCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JCWV4aXQgJEVYSVRfRkFJTFVSRQotCSAgICAgIGZpCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGxpYmRpci8kbmFtZSIKLQkgICAgZG9uZQotCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLQkgIGVsc2UKLQkgICAgbmV3ZGxmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KLQkgICAgICBjYXNlICRsaWIgaW4KLQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7Ci0JCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGFicyIKLQkgICAgZG9uZQotCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKLQkgICAgbmV3ZGxwcmVmaWxlcz0KLQkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgICBjYXNlICRsaWIgaW4KLQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7Ci0JCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGFicyIKLQkgICAgZG9uZQotCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLQkgIGZpCi0JICAkcm0gJG91dHB1dAotCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCi0JICB0ZGxuYW1lPSRkbG5hbWUKLQkgIGNhc2UgJGhvc3QsJG91dHB1dCwkaW5zdGFsbGVkLCRtb2R1bGUsJGRsbmFtZSBpbgotCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCB8ICptaW5ndyosKmxhaSx5ZXMsbm8sKi5kbGwpIHRkbG5hbWU9Li4vYmluLyRkbG5hbWUgOzsKLQkgIGVzYWMKLQkgICRlY2hvID4gJG91dHB1dCAiXAotIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCi0jIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KLQotIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCi1kbG5hbWU9JyR0ZGxuYW1lJwotCi0jIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KLWxpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJwotCi0jIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KLW9sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCi0KLSMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJwotCi0jIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgotY3VycmVudD0kY3VycmVudAotYWdlPSRhZ2UKLXJldmlzaW9uPSRyZXZpc2lvbgotCi0jIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KLWluc3RhbGxlZD0kaW5zdGFsbGVkCi0KLSMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/Ci1zaG91bGRub3RsaW5rPSRtb2R1bGUKLQotIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCi1kbG9wZW49JyRkbGZpbGVzJwotZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCi0JICAgICRlY2hvID4+ICRvdXRwdXQgIlwKLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCi0JICBmaQotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiCi0gICAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpJyB8fCBleGl0ICQ/Ci0gICAgICA7OwotICAgIGVzYWMKLSAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICA7OwotCi0gICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKLSAgaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgotCi0gICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgotICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoIHx8Ci0gICAgICAgIyBBbGxvdyB0aGUgdXNlIG9mIEdOVSBzaHRvb2wncyBpbnN0YWxsIGNvbW1hbmQuCi0gICAgICAgJGVjaG8gIlgkbm9ub3B0IiB8IGdyZXAgc2h0b29sID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICBpbnN0YWxsX3Byb2c9Ci0gICAgICBhcmc9JG5vbm9wdAotICAgIGZpCi0KLSAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCi0gICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICBjYXNlICRhcmcgaW4KLSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLSAgICAgIGFyZz0iXCIkYXJnXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgotCi0gICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgotICAgIGRlc3Q9Ci0gICAgZmlsZXM9Ci0gICAgb3B0cz0KLSAgICBwcmV2PQotICAgIGluc3RhbGxfdHlwZT0KLSAgICBpc2Rpcj1ubwotICAgIHN0cmlwbWU9Ci0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KLQlmaWxlcz0iJGZpbGVzICRkZXN0IgotCWRlc3Q9JGFyZwotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKLSAgICAgIC1mKSAKLSAgICAgIAljYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCi0JKltcXFwgL11jcFwgKikgOzsKLQkqKSBwcmV2PSRhcmcgOzsKLQllc2FjCi0JOzsKLSAgICAgIC1nIHwgLW0gfCAtbykgcHJldj0kYXJnIDs7Ci0gICAgICAtcykKLQlzdHJpcG1lPSIgLXMiCi0JY29udGludWUKLQk7OwotICAgICAgLSopCi0JOzsKLSAgICAgICopCi0JIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgotCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCSAgcHJldj0KLQllbHNlCi0JICBkZXN0PSRhcmcKLQkgIGNvbnRpbnVlCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgotICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLQlhcmc9IlwiJGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0gICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGFyZyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogbm8gZmlsZSBvciBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiIDE+JjIKLSAgICAgIGVsc2UKLQkkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iIDE+JjIKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQotICAgIGZpCi0KLSAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBkZXN0PWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS8kJSUnYAotCi0gICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCi0gICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcwotICAgIGlmIHRlc3QgIiRpc2RpciIgPSB5ZXM7IHRoZW4KLSAgICAgIGRlc3RkaXI9IiRkZXN0IgotICAgICAgZGVzdG5hbWU9Ci0gICAgZWxzZQotICAgICAgZGVzdGRpcj1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGRlc3QiICYmIGRlc3RkaXI9LgotICAgICAgZGVzdG5hbWU9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgotICAgICAgc2V0IGR1bW15ICRmaWxlcwotICAgICAgaWYgdGVzdCAiJCMiIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotICAgIGZpCi0gICAgY2FzZSAkZGVzdGRpciBpbgotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLSAgICAqKQotICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCWNhc2UgJGZpbGUgaW4KLQkqLmxvKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi4kbGliZXh0KQotCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0Jc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JZmkKLQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JcmVsaW5rX2NvbW1hbmQ9Ci0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAkZmlsZSBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkqKSAuIC4vJGZpbGUgOzsKLQllc2FjCi0KLQkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCi0JaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KLQkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWVsc2UKLQkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KLQkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AvCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KLQlkaXI9IiRkaXIkb2JqZGlyIgotCi0JaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgIyBEZXRlcm1pbmUgdGhlIHByZWZpeCB0aGUgdXNlciBoYXMgYXBwbGllZCB0byBvdXIgZnV0dXJlIGRpci4KLQkgIGluc3RfcHJlZml4X2Rpcj1gJGVjaG8gIiRkZXN0ZGlyIiB8ICRTRUQgInMlJGxpYmRpclwkJSUiYAotCi0JICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCi0JICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0Ci0JICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgotCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKLQkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKLQkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgotCSAgaWYgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgotCSAgICAjIFN0aWNrIHRoZSBpbnN0X3ByZWZpeF9kaXIgZGF0YSBpbnRvIHRoZSBsaW5rIGNvbW1hbmQuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlLWluc3QtcHJlZml4LWRpciAkaW5zdF9wcmVmaXhfZGlyJSJgCi0JICBlbHNlCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlJSJgCi0JICBmaQotCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZSciIDE+JjIKLQkgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCi0JICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgotCSAgZWxzZQotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKLQkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0JICBmaQotCWZpCi0KLQkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCWlmIHRlc3QgLW4gIiQyIjsgdGhlbgotCSAgcmVhbG5hbWU9IiQyIgotCSAgc2hpZnQKLQkgIHNoaWZ0Ci0KLQkgIHNyY25hbWU9IiRyZWFsbmFtZSIKLQkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKLQotCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KLQkgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCi0JICAgICRzaG93ICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgICAkcnVuIGV2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KLQkgIGZpCi0KLQkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgotCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgotCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCi0JICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAotCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIGlmIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSI7IHRoZW4KLSAgICAgICAgICAgICAgICAkc2hvdyAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCi0gICAgICAgICAgICAgICAgJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0JICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgIGNtZHM9JHBvc3RpbnN0YWxsX2NtZHMKLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IHsKLQkgICAgICBsdF9leGl0PSQ/Ci0KLQkgICAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkgICAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkJJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknCi0JICAgICAgZmkKLQotCSAgICAgIGV4aXQgJGx0X2V4aXQKLQkgICAgfQotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQotCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgotCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCi0JJHNob3cgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KLQotCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLQl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCi0KLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQljYXNlICRkZXN0ZmlsZSBpbgotCSoubG8pCi0JICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgOzsKLQkqLiRvYmpleHQpCi0JICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCi0JICBkZXN0ZmlsZT0KLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgJEVYSVRfRkFJTFVSRQotCSAgOzsKLQllc2FjCi0KLQkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KLQlpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JZmkKLQotCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KLQlmaQotCWV4aXQgJEVYSVRfU1VDQ0VTUwotCTs7Ci0KLSAgICAgICopCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAotCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KLQkjIGluc3RhbGwKLQlzdHJpcHBlZF9leHQ9IiIKLQljYXNlICRmaWxlIGluCi0JICAqLmV4ZSkKLQkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkgICAgICBmaWxlPWAkZWNobyAkZmlsZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCi0JICAgICAgc3RyaXBwZWRfZXh0PSIuZXhlIgotCSAgICBmaQotCSAgICA7OwotCWVzYWMKLQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQljYXNlICRob3N0IGluCi0JKmN5Z3dpbip8Km1pbmd3KikKLQkgICAgd3JhcHBlcj1gJGVjaG8gJGZpbGUgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLCdgCi0JICAgIDs7Ci0JKikKLQkgICAgd3JhcHBlcj0kZmlsZQotCSAgICA7OwotCWVzYWMKLQlpZiAoJHtTRUR9IC1lICc0cScgJHdyYXBwZXIgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBub3RpbnN0X2RlcGxpYnM9Ci0JICByZWxpbmtfY29tbWFuZD0KLQotCSAgIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCi0JICAjIGZvbyBldmVuIGlmIGJvdGggZm9vIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCi0JICAjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKLQkgICMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KLQkgICMKLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAkd3JhcHBlciBpbgotCSAgKi8qIHwgKlxcKikgLiAke3dyYXBwZXJ9IDs7Ci0JICAqKSAuIC4vJHt3cmFwcGVyfSA7OwotCSAgZXNhYwotCi0JICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KLQkgIGlmIHRlc3QgLXogIiRub3RpbnN0X2RlcGxpYnMiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCR3cmFwcGVyJyIgMT4mMgotCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLQkgIGZpCi0KLQkgIGZpbmFsaXplPXllcwotCSAgZm9yIGxpYiBpbiAkbm90aW5zdF9kZXBsaWJzOyBkbwotCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCi0JICAgIGxpYmRpcj0KLQkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KLQkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgICAgICBjYXNlICRsaWIgaW4KLQkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkgICAgICAqKSAuIC4vJGxpYiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0Ci0JICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKLQkgICAgICBmaW5hbGl6ZT1ubwotCSAgICBmaQotCSAgZG9uZQotCi0JICByZWxpbmtfY29tbWFuZD0KLQkgICMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bwotCSAgIyBmb28gZXZlbiBpZiBib3RoIGZvbyBhbmQgRklMRS5leGUgZXhpc3Q6IGF1dG9tYXRpYy1hcHBlbmQtLmV4ZQotCSAgIyBiZWhhdmlvciBoYXBwZW5zIG9ubHkgZm9yIGV4ZWMoMyksIG5vdCBmb3Igb3BlbigyKSEgIEFsc28sIHNvdXJjaW5nCi0JICAjIGBGSUxFLicgZG9lcyBub3Qgd29yayBvbiBjeWd3aW4gbWFuYWdlZCBtb3VudHMuCi0JICAjCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgJHdyYXBwZXIgaW4KLQkgICovKiB8ICpcXCopIC4gJHt3cmFwcGVyfSA7OwotCSAgKikgLiAuLyR7d3JhcHBlcn0gOzsKLQkgIGVzYWMKLQotCSAgb3V0cHV0bmFtZT0KLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzICYmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICAgdG1wZGlyPSIvdG1wIgotCSAgICAgIHRlc3QgLW4gIiRUTVBESVIiICYmIHRtcGRpcj0iJFRNUERJUiIKLQkgICAgICB0bXBkaXI9IiR0bXBkaXIvbGlidG9vbC0kJCIKLQkgICAgICBzYXZlX3VtYXNrPWB1bWFza2AKLQkgICAgICB1bWFzayAwMDc3Ci0JICAgICAgaWYgJG1rZGlyICIkdG1wZGlyIjsgdGhlbgotCSAgICAgICAgdW1hc2sgJHNhdmVfdW1hc2sKLQkgICAgICBlbHNlCi0JICAgICAgICB1bWFzayAkc2F2ZV91bWFzawotCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJHRtcGRpciciIDE+JjIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKLQkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCi0JICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICBlbHNlCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCQkke3JtfXIgIiR0bXBkaXIiCi0JCWNvbnRpbnVlCi0JICAgICAgZmkKLQkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZSciIDE+JjIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLQkgIGZpCi0JZmkKLQotCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgotCSMgb25lIGFueXdheSAKLQljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KLQkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCi0JICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgotCSAgKi5leGU6Ki5leGUpCi0JICAgICMgdGhpcyBpcyBvawotCSAgICA7OwotCSAgKi5leGU6KikKLQkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQotCSAgICA7OwotCSAgKjoqLmV4ZSkKLQkgICAgZGVzdGZpbGU9YCRlY2hvICRkZXN0ZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAke3JtfXIgIiR0bXBkaXIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KLQotICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRvbGRfc3RyaXBsaWIiOyB0aGVuCi0JJHNob3cgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIKLQkkcnVuIGV2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgfHwgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQlldmFsIGNtZD1cIiRjbWRcIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgotICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KLSAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKLSAgICBlbHNlCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCi0gIGZpbmlzaCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCi0gICAgbGliZGlycz0iJG5vbm9wdCIKLSAgICBhZG1pbmNtZHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgotICAgICAgZm9yIGRpcgotICAgICAgZG8KLQlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQotCi0gICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCi0JICBjbWRzPSRmaW5pc2hfY21kcwotCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZCIKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWRzIgotCWZpCi0gICAgICBkb25lCi0gICAgZmkKLQotICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgotICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAkRVhJVF9TVUNDRVNTCi0KLSAgICAkZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAkZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICAkZWNobyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgJGVjaG8KLSAgICAkZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgJGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgICRlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgotICAgICRlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgICRlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICAkZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICAkZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KLSAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICAkZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICAkZWNobwotICAgICRlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICAkZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgJGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCi0gICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgJEVYSVRfRkFJTFVSRQotICAgICAgZmkKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICRmaWxlIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0ICRFWElUX0ZBSUxVUkUKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0JOzsKLQotICAgICAgKikKLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICRmaWxlIGluCi0JICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JICAqKSAuIC4vJGZpbGUgOzsKLQkgIGVzYWMKLQotCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KLQkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0JZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotCUxDX0FMTD0iJHNhdmVfTENfQUxMIjsgZXhwb3J0IExDX0FMTAotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQU5HK3NldH0iID0gc2V0OyB0aGVuCi0JTEFORz0iJHNhdmVfTEFORyI7IGV4cG9ydCBMQU5HCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLQkkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLSAgICAgICRlY2hvICIkY21kJGFyZ3MiCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGNsZWFuIGFuZCB1bmluc3RhbGwgbW9kZQotICBjbGVhbiB8IHVuaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiAkbW9kZSIKLSAgICBybT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLSAgICBybWZvcmNlPQotICAgIGV4aXRfc3RhdHVzPTAKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1mKSBybT0iJHJtICRhcmciOyBybWZvcmNlPXllcyA7OwotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgZmkKLQotICAgIHJtZGlycz0KLQotICAgIG9yaWdvYmpkaXI9IiRvYmpkaXIiCi0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIjsgdGhlbgotCWRpcj0uCi0Jb2JqZGlyPSIkb3JpZ29iamRpciIKLSAgICAgIGVsc2UKLQlvYmpkaXI9IiRkaXIvJG9yaWdvYmpkaXIiCi0gICAgICBmaQotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKLQotICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KLQljYXNlICIgJHJtZGlycyAiIGluCi0JICAqIiAkb2JqZGlyICIqKSA7OwotCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KLSAgICAgIGlmICh0ZXN0IC1MICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCi0JfHwgKHRlc3QgLWggIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQk6Ci0gICAgICBlbGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgotCWV4aXRfc3RhdHVzPTEKLQljb250aW51ZQotICAgICAgZWxpZiB0ZXN0ICIkcm1mb3JjZSIgPSB5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgJG5hbWUgaW4KLSAgICAgICoubGEpCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgotCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KLQkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgotCSAgZG9uZQotCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRvbGRfbGlicmFyeSIKLQkgIHRlc3QgIiRtb2RlIiA9IGNsZWFuICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKLQotCSAgaWYgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsOyB0aGVuCi0JICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICAgIGNtZHM9JHBvc3R1bmluc3RhbGxfY21kcwotCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JCUlGUz0iJHNhdmVfaWZzIgotCQlldmFsIGNtZD1cIiRjbWRcIgotCQkkc2hvdyAiJGNtZCIKLQkJJHJ1biBldmFsICIkY21kIgotCQlpZiB0ZXN0ICIkPyIgLW5lIDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgotCQkgIGV4aXRfc3RhdHVzPTEKLQkJZmkKLQkgICAgICBkb25lCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgICBjbWRzPSRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0JICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkJSUZTPSIkc2F2ZV9pZnMiCi0JCWV2YWwgY21kPVwiJGNtZFwiCi0JCSRzaG93ICIkY21kIgotCQkkcnVuIGV2YWwgIiRjbWQiCi0JCWlmIHRlc3QgIiQ/IiAtbmUgMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCi0JCSAgZXhpdF9zdGF0dXM9MQotCQlmaQotCSAgICAgIGRvbmUKLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgZmkKLQkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBvYmplY3QsIHNvIHZlcmlmeSBpdC4KLQlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCi0JICAjIFJlYWQgdGhlIC5sbyBmaWxlCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgXAotCSAgICAgJiYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgQWRkIG5vbi1QSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KLQkgIGlmIHRlc3QgLW4gIiRub25fcGljX29iamVjdCIgXAotCSAgICAgJiYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG5vbl9waWNfb2JqZWN0IgotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZGUiID0gY2xlYW4gOyB0aGVuCi0JICBub2V4ZW5hbWU9JG5hbWUKLQkgIGNhc2UgJGZpbGUgaW4KLQkgICouZXhlKQotCSAgICBmaWxlPWAkZWNobyAkZmlsZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCi0JICAgIG5vZXhlbmFtZT1gJGVjaG8gJG5hbWV8JHtTRUR9ICdzLC5leGUkLCwnYAotCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCi0JICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZmlsZSIKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgotCSAgaWYgKCR7U0VEfSAtZSAnNHEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAgIC4gJGRpci8kbm9leGVuYW1lCi0KLQkgICAgIyBub3RlICRuYW1lIHN0aWxsIGNvbnRhaW5zIC5leGUgaWYgaXQgd2FzIGluICRmaWxlIG9yaWdpbmFsbHkKLQkgICAgIyBhcyBkb2VzIHRoZSB2ZXJzaW9uIG9mICRmaWxlIHRoYXQgd2FzIGFkZGVkIGludG8gJHJtZmlsZXMKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKLQkgICAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJG5hbWUiCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSR7bm9leGVuYW1lfS5jIgotCSAgICBmaQotCSAgZmkKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAkc2hvdyAiJHJtICRybWZpbGVzIgotICAgICAgJHJ1biAkcm0gJHJtZmlsZXMgfHwgZXhpdF9zdGF0dXM9MQotICAgIGRvbmUKLSAgICBvYmpkaXI9IiRvcmlnb2JqZGlyIgotCi0gICAgIyBUcnkgdG8gcmVtb3ZlIHRoZSAke29iamRpcn1zIGluIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB3ZSBkZWxldGVkIGZpbGVzCi0gICAgZm9yIGRpciBpbiAkcm1kaXJzOyBkbwotICAgICAgaWYgdGVzdCAtZCAiJGRpciI7IHRoZW4KLQkkc2hvdyAicm1kaXIgJGRpciIKLQkkcnVuIHJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0gICAgOzsKLQotICAiIikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgLXogIiRleGVjX2NtZCI7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLWZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKLQotaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgotICBldmFsIGV4ZWMgJGV4ZWNfY21kCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCi1jYXNlICRtb2RlIGluCi0iIikgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgotCi1Qcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLQotICAgIC0tY29uZmlnICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCi0gICAgLS1kZWJ1ZyAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCi0gICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCi0gICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQotICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS10YWc9VEFHICAgICAgICAgdXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZyb20gdGFnIFRBRwotICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLQotTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICBjbGVhbiAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQotICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKLSAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQotICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcwotICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQotICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5Ci0KLU1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgotYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4iCi0gIGV4aXQgJEVYSVRfU1VDQ0VTUwotICA7OwotCi1jbGVhbikKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNsZWFuIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgb2JqZWN0IG9yIHByb2dyYW0sIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZAotd2l0aCBpdCBhcmUgZGVsZXRlZC4gT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGRpbmcgUElDIG9iamVjdHMgb25seQotICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGRpbmcgbm9uLVBJQyBvYmplY3RzIG9ubHkKLSAgLXN0YXRpYyAgICAgICAgICAgYWx3YXlzIGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKLQotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gIDs7Ci0KLWV4ZWN1dGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gIDs7Ci0KLWZpbmlzaCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICA7OwotCi1pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgOzsKLQotbGluaykKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKLSAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCi0gIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCi0JCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKLSAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCi0JCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKLSAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcwotICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQotICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKLSAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKLSAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCi0gIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scwotICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLSAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKLSAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCi0gICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKLSAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KLSAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgotICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcwotICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQotCQkgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQotCi1BbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgotCi1FdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQotdHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKLW9iamVjdCBmaWxlcy4KLQotSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCi1vbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCi1yZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKLXVzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQotaXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKLSAgOzsKLQotdW5pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgOzsKLWVzYWMKLQotJGVjaG8KLSRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLWV4aXQgJD8KLQotIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KLSMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCi0jIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAotIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKLSMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0Ci0jIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0Ci0jIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKLSMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KLSMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKLSMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgotCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCi1idWlsZF9saWJ0b29sX2xpYnM9bm8KLWJ1aWxkX29sZF9saWJzPXllcwotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKLQotIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYwotYnVpbGRfb2xkX2xpYnM9YGNhc2UgJGJ1aWxkX2xpYnRvb2xfbGlicyBpbiB5ZXMpICRlY2hvIG5vOzsgKikgJGVjaG8geWVzOzsgZXNhY2AKLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbWlzc2luZyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlZjgzYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL21pc3NpbmcKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KLQotc2NyaXB0dmVyc2lvbj0yMDAzLTA5LTAyLjIzCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzIAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0jIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLWlmIHRlc3QgJCMgLWVxIDA7IHRoZW4KLSAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICBleGl0IDEKLWZpCi0KLXJ1bj06Ci0KLSMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKLSMgc3JjZGlyIGFscmVhZHkuCi1pZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCi1lbHNlCi0gIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KLWZpCi0KLW1zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKLQotY2FzZSAiJDEiIGluCi0tLXJ1bikKLSAgIyBUcnkgdG8gcnVuIHJlcXVlc3RlZCBwcm9ncmFtLCBhbmQganVzdCBleGl0IGlmIGl0IHN1Y2NlZWRzLgotICBydW49Ci0gIHNoaWZ0Ci0gICIkQCIgJiYgZXhpdCAwCi0gICMgRXhpdCBjb2RlIDYzIG1lYW5zIHZlcnNpb24gbWlzbWF0Y2guICBUaGlzIG9mdGVuIGhhcHBlbnMKLSAgIyB3aGVuIHRoZSB1c2VyIHRyeSB0byB1c2UgYW4gYW5jaWVudCB2ZXJzaW9uIG9mIGEgdG9vbCBvbgotICAjIGEgZmlsZSB0aGF0IHJlcXVpcmVzIGEgbWluaW11bSB2ZXJzaW9uLiAgSW4gdGhpcyBjYXNlIHdlCi0gICMgd2Ugc2hvdWxkIHByb2NlZWQgaGFzIGlmIHRoZSBwcm9ncmFtIGhhZCBiZWVuIGFic2VudCwgb3IKLSAgIyBpZiAtLXJ1biBoYWRuJ3QgYmVlbiBwYXNzZWQuCi0gIGlmIHRlc3QgJD8gPSA2MzsgdGhlbgotICAgIHJ1bj06Ci0gICAgbXNnPSJwcm9iYWJseSB0b28gb2xkIgotICBmaQotICA7OwotZXNhYwotCi0jIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBmYWlscyB0byBydW4gKHBvc3NpYmx5IGFuIG91dGRhdGVkIHZlcnNpb24pLAotIyB0cnkgdG8gZW11bGF0ZSBpdC4KLWNhc2UgIiQxIiBpbgotCi0gIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKLSAgICBlY2hvICJcCi0kMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KLQotSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgotZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgotCi1PcHRpb25zOgotICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC0tcnVuICAgICAgICAgICB0cnkgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZW11bGF0ZSBpdCBpZiBpdCBmYWlscwotCi1TdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6Ci0gIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKLSAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCi0gIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCi0gIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKLSAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBoZWxwMm1hbiAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKLSAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotCi1TZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgotICAgIDs7Ci0KLSAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQotICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCi0gICAgOzsKLQotICAtKikKLSAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKLSAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICBhY2xvY2FsKikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQotICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGFjbG9jYWwubTQKLSAgICA7OwotCi0gIGF1dG9jb25mKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUKLSAgICAgICAgIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGNvbmZpZ3VyZQotICAgIDs7Ci0KLSAgYXV0b2hlYWRlcikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KLSAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCi0gICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCi0gICAgdG91Y2hfZmlsZXM9Ci0gICAgZm9yIGYgaW4gJGZpbGVzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0gICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAotCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKLSAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgdG91Y2ggJHRvdWNoX2ZpbGVzCi0gICAgOzsKLQotICBhdXRvbWFrZSopCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KLSAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgotICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8Ci0JICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKLQkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKLSAgICA7OwotCi0gIGF1dG9tNHRlKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBidXQgaXMgJG1zZy4KLSAgICAgICAgIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4KLSAgICAgICAgIFlvdSBjYW4gZ2V0IFxgJDEnIGFzIHBhcnQgb2YgXGBBdXRvY29uZicgZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLS1vdXRwdXRbID1dKlwoW14gXSpcKS4qL1wxL3AnYAotICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotb1sgXSpcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIjISAvYmluL3NoIgotCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgotCWVjaG8gIiMgICQgJEAiCi0JZWNobyAiZXhpdCAwIgotCWNobW9kICt4ICRmaWxlCi0JZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gIGJpc29ufHlhY2MpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLnkpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCi0JICAgIGZpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5oIF07IHRoZW4KLQllY2hvID55LnRhYi5oCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCi0gICAgZmkKLSAgICA7OwotCi0gIGxleHxmbGV4KQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC5sJyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEZsZXgnIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgRmxleCcgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgbGV4Lnl5LmMKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi5sKQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MvbCQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIGxleC55eS5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCi0gICAgZmkKLSAgICA7OwotCi0gIGhlbHAybWFuKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0JIHlvdSBtb2RpZmllZCBhIGRlcGVuZGVuY3kgb2YgYSBtYW51YWwgcGFnZS4gIFlvdSBtYXkgbmVlZCB0aGUKLQkgXGBIZWxwMm1hbicgcGFja2FnZSBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlCi0JIGVmZmVjdC4gIFlvdSBjYW4gZ2V0IFxgSGVscDJtYW4nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0JZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLS1vdXRwdXQ9XChbXiBdKlwpLiovXDEvcCdgCi0gICAgZmkKLSAgICBpZiBbIC1mICIkZmlsZSIgXTsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIi5hYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UiCi0JZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gIG1ha2VpbmZvKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmIChtYWtlaW5mbyAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgbWFrZWluZm8sIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQotICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCi0gICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAotICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCi0gICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotICAgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRmaWxlYAotICAgIGZpCi0gICAgdG91Y2ggJGZpbGUKLSAgICA7OwotCi0gIHRhcikKLSAgICBzaGlmdAotICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCi0gICAgICBlY2hvIDE+JjIgIkVSUk9SOiBcYHRhcicgcmVxdWlyZXMgLS1ydW4iCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBXZSBoYXZlIGFscmVhZHkgdHJpZWQgdGFyIGluIHRoZSBnZW5lcmljIHBhcnQuCi0gICAgIyBMb29rIGZvciBnbnV0YXIvZ3RhciBiZWZvcmUgaW52b2NhdGlvbiB0byBhdm9pZCB1Z2x5IGVycm9yCi0gICAgIyBtZXNzYWdlcy4KLSAgICBpZiAoZ251dGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICAgIGdudXRhciAiJEAiICYmIGV4aXQgMAotICAgIGZpCi0gICAgaWYgKGd0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgICAgZ3RhciAiJEAiICYmIGV4aXQgMAotICAgIGZpCi0gICAgZmlyc3Rhcmc9IiQxIgotICAgIGlmIHNoaWZ0OyB0aGVuCi0JY2FzZSAiJGZpcnN0YXJnIiBpbgotCSpvKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLQljYXNlICIkZmlyc3RhcmciIGluCi0JKmgqKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKLSAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCi0gICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vcGx1Z2luLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4OGJmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFNjYWxhYmxlIERlYnVnIE1hbmFnZXIgKFNETSkKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvLmN2c2lnbm9yZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2NsaWVudC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNkMWE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2NsaWVudC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0uZGlyc3RhbXAKLS5kZXBzCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvY2xpZW50LmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvY2xpZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDVmODYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvY2xpZW50L2NsaWVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDbGllbnQgcnVucyBhcyB0YXNrIGlkIG51bV9wcm9jcywgd2hlcmUgbnVtX3Byb2NzIGFyZSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcwotICogaW4gdGhlIGpvYiBiZWluZyBkZWJ1Z2dlZCwgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjb29yZGluYXRpbmcgcHJvdG9jb2wKLSAqIG1lc3NhZ2VzIGJldHdlZW4gdGhlIGRlYnVnIGNsaWVudCBpbnRlcmZhY2UgKHdoYXRldmVyIHRoYXQgbWF5IGJlKQotICogYW5kIHRoZSBkZWJ1ZyBzZXJ2ZXJzLgotICoKLSAqIE5vdGUgdGhhdCB0aGVyZSB3aWxsIGJlIG51bV9wcm9jcysxIFswLi5udW1fcHJvY3NdIHByb2Nlc3NlcyBpbiBvdXIKLSAqIGNvbW11bmljYXRvciwgd2hlcmUgbnVtX3Byb2NzIGlzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHRoZSBwYXJhbGxlbAotICogam9iIGJlaW5nIGRlYnVnZ2VkLiBUbyBzaW1wbGlmeSB0aGUgYWNjb3VudGluZywgd2UgdXNlIHRoZSB0YXNrIGlkIG9mCi0gKiBudW1fcHJvY3MgYXMgdGhlIGNsaWVudCB0YXNrIGlkIGFuZCBbMC4ubnVtX3Byb2NzLTFdIGZvciB0aGUgc2VydmVyCi0gKiB0YXNrIGlkcy4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJkYmcuaCIKLSNpbmNsdWRlICJkYmdfY2xpZW50LmgiCi0jaW5jbHVkZSAiZGJnX3Byb3h5LmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgInByb3h5LmgiCi0jaW5jbHVkZSAicHJveHlfdGNwLmgiCi0jaW5jbHVkZSAiaGFuZGxlci5oIgotI2luY2x1ZGUgInNkbS5oIgotCi0vKgotICogQ2FsbGVkIGJ5IHByb3h5IHdoZW4gYSBuZXcgY29ubmVjdGlvbgotICogaXMgZXN0YWJsaXNlZC4KLSAqLwotc3RhdGljIGludAotbmV3X2Nvbm5lY3Rpb24odm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2VydmVyX2NvdW50KHZvaWQpCi17Ci0JcmV0dXJuIHNkbV9yb3V0ZV9nZXRfc2l6ZSgpOwotfQotCi1zdGF0aWMgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcyBoZWxwZXJfZnVuY3MgPSB7Ci0JbmV3X2Nvbm5lY3Rpb24sCi0Jc2VydmVyX2NvdW50Ci19OwotCi1zdGF0aWMgcHJveHlfY21kIGNtZHNbXSA9IHsKLQkvKiBEQkdfUVVJVF9DTUQgKi8JCQkJCQlEYmdDbG50UXVpdCwKLQkvKiBEQkdfU1RBUlRTRVNTSU9OX0NNRCAqLwkJCQlEYmdDbG50U3RhcnRTZXNzaW9uLAotCS8qIERCR19TRVRMSU5FQlJFQUtQT0lOVF9DTUQgKi8JCQlEYmdDbG50U2V0TGluZUJyZWFrcG9pbnQsCi0JLyogREJHX1NFVEZVTkNCUkVBS1BPSU5UX0NNRCAqLwkJCURiZ0NsbnRTZXRGdW5jQnJlYWtwb2ludCwKLQkvKiBEQkdfREVMRVRFQlJFQUtQT0lOVF9DTUQgKi8JCQlEYmdDbG50RGVsZXRlQnJlYWtwb2ludCwKLQkvKiBEQkdfRU5BQkxFQlJFQUtQT0lOVF9DTUQgKi8JCQlEYmdDbG50RW5hYmxlQnJlYWtwb2ludCwKLQkvKiBEQkdfRElTQUJMRUJSRUFLUE9JTlRfQ01EICovCQkJRGJnQ2xudERpc2FibGVCcmVha3BvaW50LAotCS8qIERCR19DT05ESVRJT05CUkVBS1BPSU5UX0NNRCAqLwkJRGJnQ2xudENvbmRpdGlvbkJyZWFrcG9pbnQsCi0JLyogREJHX0JSRUFLUE9JTlRBRlRFUl9DTUQgKi8JCQlEYmdDbG50QnJlYWtwb2ludEFmdGVyLAotCS8qIERCR19TRVRXQVRDSFBPSU5UX0NNRCAqLwkJCQlEYmdDbG50U2V0V2F0Y2hwb2ludCwKLQkvKiBEQkdfR09fQ01EICovCQkJCQkJRGJnQ2xudEdvLAotCS8qIERCR19TVEVQX0NNRCAqLwkJCQkJCURiZ0NsbnRTdGVwLAotCS8qIERCR19URVJNSU5BVEVfQ01EICovCQkJCQlEYmdDbG50VGVybWluYXRlLAotCS8qIERCR19TVVNQRU5EX0NNRCAqLwkJCQkJRGJnQ2xudFN1c3BlbmQsCi0JLyogREJHX0xJU1RTVEFDS0ZSQU1FU19DTUQgKi8JCQlEYmdDbG50TGlzdFN0YWNrZnJhbWVzLAotCS8qIERCR19TRVRDVVJSRU5UU1RBQ0tGUkFNRV9DTUQgKi8JCURiZ0NsbnRTZXRDdXJyZW50U3RhY2tmcmFtZSwKLQkvKiBEQkdfRVZBTFVBVEVFWFBSRVNTSU9OX0NNRCAqLwkJRGJnQ2xudEV2YWx1YXRlRXhwcmVzc2lvbiwKLQkvKiBEQkdfR0VUVFlQRV9DTUQgKi8JCQkJCURiZ0NsbnRHZXRUeXBlLAotCS8qIERCR19MSVNUTE9DQUxWQVJJQUJMRVNfQ01EICovCQlEYmdDbG50TGlzdExvY2FsVmFyaWFibGVzLAotCS8qIERCR19MSVNUQVJHVU1FTlRTX0NNRCAqLwkJCQlEYmdDbG50TGlzdEFyZ3VtZW50cywKLQkvKiBEQkdfTElTVEdMT0JBTFZBUklBQkxFU19DTUQgKi8JCURiZ0NsbnRMaXN0R2xvYmFsVmFyaWFibGVzLAotCS8qIERCR19MSVNUSU5GT1RIUkVBRFNfQ01EICovCQkJRGJnQ2xudExpc3RJbmZvVGhyZWFkcywKLQkvKiBEQkdfU0VUVEhSRUFEU0VMRUNUX0NNRCAqLwkJCURiZ0NsbnRTZXRUaHJlYWRTZWxlY3QsCi0JLyogREJHX1NUQUNLSU5GT0RFUFRIX0NNRCAqLwkJCURiZ0NsbnRTdGFja0luZm9EZXB0aCwKLQkvKiBEQkdfREFUQVJFQURNRU1PUllfQ01EICovCQkJRGJnQ2xudERhdGFSZWFkTWVtb3J5LAotCS8qIERCR19EQVRBV1JJVEVNRU1PUllfQ01EICovCQkJRGJnQ2xudERhdGFXcml0ZU1lbW9yeSwKLQkvKiBEQkdfTElTVFNJR05BTFNfQ01EICovCQkJCURiZ0NsbnRMaXN0U2lnbmFscywKLQkvKiBEQkdfU0lHTkFMSU5GT19DTUQgKi8JCQkJRGJnQ2xudFNpZ25hbEluZm8sCi0JLyogREJHX0NMSUhBTkRMRV9DTUQgKi8JCQkJCURiZ0NsbnRDTElIYW5kbGUsCi0JLyogREJHX0RBVEFFVkFMVUFURUVYUFJFU1NJT05fQ01EICovCURiZ0NsbnREYXRhRXZhbHVhdGVFeHByZXNzaW9uLAotCS8qIERCR19HRVRQQVJUSUFMQUlGX0NNRCAqLwkJCQlEYmdDbG50R2V0UGFydGlhbEFJRiwKLQkvKiBEQkdfVkFSSUFCTEVERUxFVEVfQ01EICovCQkJRGJnQ2xudFZhcmlhYmxlRGVsZXRlCi19OwotCi1zdGF0aWMgcHJveHlfY29tbWFuZHMJY29tbWFuZF90YWIgPSB7Ci0JREJHX0NNRF9CQVNFLAotCXNpemVvZihjbWRzKSAvIHNpemVvZihwcm94eV9jbWQpLAotCWNtZHMKLX07Ci0KLXZvaWQKLWNsaWVudChjaGFyICpwcm94eSwgY2hhciAqaG9zdCwgaW50IHBvcnQpCi17Ci0JLyoKLQkgKiBGSVhNRTogc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBiZWluZyBkZWJ1Z2dlZCAqbm90KiB0aGUgbnVtYmVyIG9mIGRlYnVnZ2VyCi0JICogcHJvY2Vzc2VzICh3aGljaCBpbmNsdWRlcyB0aGUgbWFzdGVyKS4gVGhpcyBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGZyb250ZW5kIG9yIG9uCi0JICogdGhlIGNvbW1hbmQgbGluZS4gQXQgdGhlIG1vbWVudCwgd2UganVzdCBleGNsdWRlIHRoZSBtYXN0ZXIuCi0JICovCi0JaW50IHNpemUgPSBzZG1fcm91dGVfZ2V0X3NpemUoKSAtIDE7Ci0KLQlpZiAoRGJnQ2xudEluaXQoc2l6ZSwgc2RtX3JvdXRlX2dldF9pZCgpLCBwcm94eSwgJmhlbHBlcl9mdW5jcywgJmNvbW1hbmRfdGFiKSAhPSBEQkdSRVNfT0sgfHwKLQkJCURiZ0NsbnRDcmVhdGVTZXNzaW9uKHNpemUsIGhvc3QsIHBvcnQpICE9IERCR1JFU19PSykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBEYmdHZXRFcnJvclN0cigpKTsgZmZsdXNoKHN0ZGVycik7Ci0JCURiZ0NsbnRRdWl0KDAsIDAsIE5VTEwpOyAvL1RPRE8gZml4bWUhCi0JCURiZ0NsbnRQcm9ncmVzcygpOwotCQlyZXR1cm47Ci0JfQotCi0Jd2hpbGUgKCFEYmdDbG50SXNTaHV0ZG93bigpKSB7Ci0JCWlmIChEYmdDbG50UHJvZ3Jlc3MoKSAhPSBEQkdSRVNfT0spCi0JCQlicmVhazsKLQl9Ci0KLQlEYmdDbG50RmluaXNoKCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvY2xpZW50X2NtZHMuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2NsaWVudC9jbGllbnRfY21kcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTgyNGMyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2NsaWVudC9jbGllbnRfY21kcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImRiZy5oIgotI2luY2x1ZGUgImRiZ19wcm94eS5oIgotI2luY2x1ZGUgImRiZ19jbGllbnQuaCIKLSNpbmNsdWRlICJwcm94eV9tc2cuaCIKLSNpbmNsdWRlICJiaXRzZXQuaCIKLSNpbmNsdWRlICJoYW5kbGVyLmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgInNkbS5oIgotCi0jZGVmaW5lIFJVTk5JTkcJCQkJMAotI2RlZmluZSBTSFVURE9XTl9TVEFSVEVECTEKLSNkZWZpbmUgU0hVVERPV05fQ09NUExFVEVECTIKLQotc3RhdGljIGludAkJCQlkYmdfc3RhdGU7Ci1zdGF0aWMgc2RtX2lkc2V0CQlkYmdfcHJvY3M7Ci1zdGF0aWMgc2RtX2lkc2V0CQl0bXBfaWRzZXQ7Ci1zdGF0aWMgYml0c2V0ICoJCQl0bXBfYml0c2V0Owotc3RhdGljIHByb3h5X3N2ciAqCQlkYmdfcHJveHk7Ci0KLS8qCi0gKiBUaGUgQ0xJRU5UX1RJTUVPVVQgZGV0ZXJtaW5lcyBob3cgb2Z0ZW4gdGhlIGRlYnVnZ2VyIHBvbGxzIGZvcgotICogY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBmcm9udC1lbmQuIFRoZSBTRVJWRVJfVElNRU9VVCBkZXRlcm1pbmVzCi0gKiBob3cgb2Z0ZW4gdGhlIGRlYnVnIHNlcnZlcnMgYXJlIHBvbGxlZC4KLSAqCi0gKiBUb28gb2Z0ZW4gYW5kIGl0IHVzZXMgdG9vIG11Y2ggQ1BVLCB0b28gZmV3IGFuZCB0aGluZ3Mgd2lsbCBzbG93IGRvd24uLi4KLSAqCi0gKiBWYWx1ZXMgYXJlIGluIG1pY3Jvc2Vjb25kcy4KLSAqLwotI2RlZmluZSBDTElFTlRfVElNRU9VVAkxMDAwMAotI2RlZmluZSBTRVJWRVJfVElNRU9VVAkxMDAwMAotCi1zZG1faWRzZXQKLWJpdHNldF90b19pZHNldChiaXRzZXQgKmIpCi17Ci0JaW50IGJpdDsKLQotCXNkbV9zZXRfY2xlYXIodG1wX2lkc2V0KTsKLQotCWZvciAoYml0ID0gMDsgYml0IDwgYml0c2V0X3NpemUoYik7IGJpdCsrKSB7Ci0JCWlmIChiaXRzZXRfdGVzdChiLCBiaXQpKSB7Ci0JCQlzZG1fc2V0X2FkZF9lbGVtZW50KHRtcF9pZHNldCwgYml0KTsKLQkJfQotCX0KLQotCXJldHVybiB0bXBfaWRzZXQ7Ci19Ci0KLWJpdHNldCAqCi1pZHNldF90b19iaXRzZXQoc2RtX2lkc2V0IGlkcykKLXsKLQlzZG1faWQJCWlkOwotCi0JYml0c2V0X2NsZWFyKHRtcF9iaXRzZXQpOwotCi0JZm9yIChpZCA9IHNkbV9zZXRfZmlyc3QoaWRzKTsgIXNkbV9zZXRfZG9uZShpZHMpOyBpZCA9IHNkbV9zZXRfbmV4dChpZHMpKSB7Ci0JCWJpdHNldF9zZXQodG1wX2JpdHNldCwgaWQpOwotCX0KLQotCXJldHVybiB0bXBfYml0c2V0OwotfQotCi0vKioKLSAqIEEgc2VuZCBjb21tYW5kIGlzIGNvbXBsZXRlZC4gUHJvY2VzcyB0aGUgcmVzdWx0IGFuZAotICogY2FsbCBhbGwgcmVnaXN0ZXJlZCBldmVudCBoYW5kbGVycy4KLSAqLwotc3RhdGljIGludAotZGJnX2NsbnRfY21kX2NvbXBsZXRlZChzZG1fbWVzc2FnZSBtc2cpCi17Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW07Ci0KLQlzZG1fbWVzc2FnZV9nZXRfcGF5bG9hZChtc2csICZidWYsICZsZW4pOwotCi0gCWlmIChwcm94eV9kZXNlcmlhbGl6ZV9tc2coYnVmLCBsZW4sICZtKSA8IDApCi0gCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBjb252ZXJzaW9uIHRvIHByb3h5IGV2ZW50Iik7Ci0gCWVsc2UgewotIAkJLyoKLSAJCSAqIEluc2VydCBhY3R1YWwgYml0c2V0IGFzIGZpcnN0IGFyZy4gVGhlIGRlYnVnIGV2ZW50cyBzZW50IGludGVybmFsbHkKLSAJCSAqIGRvbid0IGluY2x1ZGUgdGhlIGJpdHNldCwgaXQgaXMgb25seSBhZGRlZCBwcmlvciB0byBzZW5kaW5nIGJhY2sKLSAJCSAqIHRvIHRoZSBjbGllbnQuCi0gCQkgKi8KLSAJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGRiZ19jbG50X2NtZF9jb21wbGV0ZWQgc3JjPSVzXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksCi0gCQkJCV9zZXRfdG9fc3RyKHNkbV9tZXNzYWdlX2dldF9zb3VyY2UobXNnKSkpOwotCQlwcm94eV9tc2dfaW5zZXJ0X2JpdHNldChtLCBpZHNldF90b19iaXRzZXQoc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpKSwgMCk7Ci0gCQlwcm94eV9zdnJfcXVldWVfbXNnKGRiZ19wcm94eSwgbSk7Ci0JfQotCi0gCXNkbV9tZXNzYWdlX2ZyZWUobXNnKTsKLQotIAlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2VuZF9jb21tYW5kKHNkbV9pZHNldCBkZXN0LCBpbnQgdGltZW91dCwgY2hhciAqY21kLCBpbnQgbGVuLCB2b2lkICpjYmRhdGEpCi17Ci0Jc2RtX21lc3NhZ2UgCW1zZzsKLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNlbmRfY29tbWFuZCBkZXN0PSVzIGNtZD0lc1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBfc2V0X3RvX3N0cihkZXN0KSwgY21kKTsKLQotCW1zZyA9IHNkbV9tZXNzYWdlX25ldyhjbWQsIGxlbik7Ci0Jc2RtX2FnZ3JlZ2F0ZV9zZXRfdmFsdWUoc2RtX21lc3NhZ2VfZ2V0X2FnZ3JlZ2F0ZShtc2cpLCBTRE1fQUdHUkVHQVRFX1RJTUVPVVQsIHRpbWVvdXQpOwotCXNkbV9zZXRfdW5pb24oc2RtX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uKG1zZyksIGRlc3QpOwotCi0Jc2RtX2FnZ3JlZ2F0ZV9tZXNzYWdlKG1zZywgU0RNX0FHR1JFR0FURV9ET1dOU1RSRUFNKTsKLQotCXNkbV9tZXNzYWdlX3NldF9zZW5kX2NhbGxiYWNrKG1zZywgc2RtX21lc3NhZ2VfZnJlZSk7Ci0Jc2RtX21lc3NhZ2Vfc2VuZChtc2cpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotRGJnQ2xudEluaXQoaW50IG51bV9zdnJzLCBpbnQgbXlfaWQsIGNoYXIgKm5hbWUsIHByb3h5X3N2cl9oZWxwZXJfZnVuY3MgKmZ1bmNzLCBwcm94eV9jb21tYW5kcyAqY21kcykKLXsKLQlzdHJ1Y3QgdGltZXZhbAl0diA9IHsgMCwgQ0xJRU5UX1RJTUVPVVQgfTsKLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIERiZ0NsbnRJbml0IG51bV9zdnJzPSVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIG51bV9zdnJzKTsKLQotCXRtcF9pZHNldCA9IHNkbV9zZXRfbmV3KCk7Ci0JdG1wX2JpdHNldCA9IGJpdHNldF9uZXcobnVtX3N2cnMpOwotCi0JLyoKLQkgKiBSZWdpc3RlciBjYWxsYmFjawotCSAqLwotCXNkbV9hZ2dyZWdhdGVfc2V0X2NvbXBsZXRpb25fY2FsbGJhY2soZGJnX2NsbnRfY21kX2NvbXBsZXRlZCk7Ci0KLQkvKgotCSAqIENyZWF0ZSBhIGJpdHNldCBjb250YWluaW5nIGFsbCBwcm9jZXNzZXMKLQkgKi8KLQlkYmdfcHJvY3MgPSBzZG1fc2V0X25ldygpOwotCXNkbV9zZXRfYWRkX2FsbChkYmdfcHJvY3MsIG51bV9zdnJzLTEpOwotCi0JLyoKLQkgKiBSZXNldCBzdGF0ZQotCSAqLwotCWRiZ19zdGF0ZSA9IFJVTk5JTkc7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgcHJveHkKLQkgKi8KLQlpZiAocHJveHlfc3ZyX2luaXQobmFtZSwgJnR2LCBmdW5jcywgY21kcywgJmRiZ19wcm94eSkgIT0gUFJPWFlfUkVTX09LKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgcHJveHlfZ2V0X2Vycm9yX3N0cigpKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotaW50Ci1EYmdDbG50Q3JlYXRlU2Vzc2lvbihpbnQgbnVtLCBjaGFyICpob3N0LCBpbnQgcG9ydCkKLXsKLQlpbnQJCQlyZXM7Ci0KLQlpZiAoaG9zdCAhPSBOVUxMKQotCQlyZXMgPSBwcm94eV9zdnJfY29ubmVjdChkYmdfcHJveHksIGhvc3QsIHBvcnQpOwotCWVsc2UKLQkJcmVzID0gcHJveHlfc3ZyX2NyZWF0ZShkYmdfcHJveHksIHBvcnQpOwotCi0JaWYgKHJlcyA9PSBQUk9YWV9SRVNfRVJSKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgcHJveHlfZ2V0X2Vycm9yX3N0cigpKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotdm9pZAotRGJnQ2xudEZpbmlzaCh2b2lkKQotewotCXByb3h5X3N2cl9maW5pc2goZGJnX3Byb3h5KTsKLX0KLQotaW50Ci1EYmdDbG50SXNTaHV0ZG93bih2b2lkKQotewotCi0JLyoKLQkgKiBUaGUgbmV4dCBldmVudCByZWNlaXZlZCBhZnRlciBhIHF1aXQgY29tbWFuZAotCSAqIG11c3QgYmUgdGhlIHNlcnZlciBzaHV0dGluZyBkb3duLgotCSAqLwotCWlmIChkYmdfc3RhdGUgPT0gU0hVVERPV05fU1RBUlRFRCkgewotCQlwcmludGYoInNkbTogc2h1dGRvd24gY29tcGxldGVkXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ly9UT0RPCi0JCWRiZ19zdGF0ZSA9IFNIVVRET1dOX0NPTVBMRVRFRDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIChkYmdfc3RhdGUgPT0gU0hVVERPV05fQ09NUExFVEVEKSA/IDEgOiAwOwotfQotCi1pbnQKLURiZ0NsbnRTdGFydFNlc3Npb24oaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NUQVJUU0VTU0lPTl9DTUQsIHRpZCk7Ci0KLQlwcm94eV9tc2dfYWRkX2ludChtc2csIFNFUlZFUl9USU1FT1VUKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgbmFyZ3MsIGFyZ3MpOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChkYmdfcHJvY3MsIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqIEJyZWFrcG9pbnQgb3BlcmF0aW9ucwotICovCi1pbnQKLURiZ0NsbnRTZXRMaW5lQnJlYWtwb2ludChpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JYml0c2V0ICoJc2V0OwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0VUTElORUJSRUFLUE9JTlRfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50U2V0RnVuY0JyZWFrcG9pbnQoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NFVEZVTkNCUkVBS1BPSU5UX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudERlbGV0ZUJyZWFrcG9pbnQoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0RFTEVURUJSRUFLUE9JTlRfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50RW5hYmxlQnJlYWtwb2ludChpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfRU5BQkxFQlJFQUtQT0lOVF9DTUQsIHRpZCk7Ci0JcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShtc2csIC0tbmFyZ3MsICZhcmdzWzFdKTsKLQlwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJmJ1ZiwgJmxlbik7Ci0KLQlyZXMgPSBzZW5kX2NvbW1hbmQoYml0c2V0X3RvX2lkc2V0KHNldCksIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQliaXRzZXRfZnJlZShzZXQpOwotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQKLURiZ0NsbnREaXNhYmxlQnJlYWtwb2ludChpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfRElTQUJMRUJSRUFLUE9JTlRfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50Q29uZGl0aW9uQnJlYWtwb2ludChpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfQ09ORElUSU9OQlJFQUtQT0lOVF9DTUQsIHRpZCk7Ci0JcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShtc2csIC0tbmFyZ3MsICZhcmdzWzFdKTsKLQlwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJmJ1ZiwgJmxlbik7Ci0KLQlyZXMgPSBzZW5kX2NvbW1hbmQoYml0c2V0X3RvX2lkc2V0KHNldCksIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQliaXRzZXRfZnJlZShzZXQpOwotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQKLURiZ0NsbnRCcmVha3BvaW50QWZ0ZXIoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0JSRUFLUE9JTlRBRlRFUl9DTUQsIHRpZCk7Ci0JcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShtc2csIC0tbmFyZ3MsICZhcmdzWzFdKTsKLQlwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJmJ1ZiwgJmxlbik7Ci0KLQlyZXMgPSBzZW5kX2NvbW1hbmQoYml0c2V0X3RvX2lkc2V0KHNldCksIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQliaXRzZXRfZnJlZShzZXQpOwotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQKLURiZ0NsbnRTZXRXYXRjaHBvaW50KGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19TRVRXQVRDSFBPSU5UX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGNvbnRyb2wgb3BlcmF0aW9ucwotICovCi1pbnQKLURiZ0NsbnRHbyhpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfR09fQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVFNPTUUsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFN0ZXAoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NURVBfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVFNPTUUsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFRlcm1pbmF0ZShpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfVEVSTUlOQVRFX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFN1c3BlbmQoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NVU1BFTkRfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBTdGFjayBmcmFtZSBvcGVyYXRpb25zCi0gKi8KLWludAotRGJnQ2xudExpc3RTdGFja2ZyYW1lcyhpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfTElTVFNUQUNLRlJBTUVTX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFNldEN1cnJlbnRTdGFja2ZyYW1lKGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19TRVRDVVJSRU5UU1RBQ0tGUkFNRV9DTUQsIHRpZCk7Ci0JcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShtc2csIC0tbmFyZ3MsICZhcmdzWzFdKTsKLQlwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJmJ1ZiwgJmxlbik7Ci0KLQlyZXMgPSBzZW5kX2NvbW1hbmQoYml0c2V0X3RvX2lkc2V0KHNldCksIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQliaXRzZXRfZnJlZShzZXQpOwotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogRXhwcmVzc2lvbi92YXJpYWJsZSBvcGVyYXRpb25zCi0gKi8KLWludAotRGJnQ2xudEV2YWx1YXRlRXhwcmVzc2lvbihpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfRVZBTFVBVEVFWFBSRVNTSU9OX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudEdldFR5cGUoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0dFVFRZUEVfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50TGlzdExvY2FsVmFyaWFibGVzKGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19MSVNUTE9DQUxWQVJJQUJMRVNfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50TGlzdEFyZ3VtZW50cyhpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfTElTVEFSR1VNRU5UU19DTUQsIHRpZCk7Ci0JcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShtc2csIC0tbmFyZ3MsICZhcmdzWzFdKTsKLQlwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJmJ1ZiwgJmxlbik7Ci0KLQlyZXMgPSBzZW5kX2NvbW1hbmQoYml0c2V0X3RvX2lkc2V0KHNldCksIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQliaXRzZXRfZnJlZShzZXQpOwotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQKLURiZ0NsbnRMaXN0R2xvYmFsVmFyaWFibGVzKGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19MSVNUR0xPQkFMVkFSSUFCTEVTX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudExpc3RJbmZvVGhyZWFkcyhpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfTElTVElORk9USFJFQURTX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFNldFRocmVhZFNlbGVjdChpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0VUVEhSRUFEU0VMRUNUX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFN0YWNrSW5mb0RlcHRoKGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19TVEFDS0lORk9ERVBUSF9DTUQsIHRpZCk7Ci0JcHJveHlfbXNnX2FkZF9hcmdzX25vY29weShtc2csIC0tbmFyZ3MsICZhcmdzWzFdKTsKLQlwcm94eV9zZXJpYWxpemVfbXNnKG1zZywgJmJ1ZiwgJmxlbik7Ci0KLQlyZXMgPSBzZW5kX2NvbW1hbmQoYml0c2V0X3RvX2lkc2V0KHNldCksIERCR19FVl9XQUlUQUxMLCBidWYsIGxlbiwgTlVMTCk7Ci0KLQliaXRzZXRfZnJlZShzZXQpOwotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQKLURiZ0NsbnREYXRhUmVhZE1lbW9yeShpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfREFUQVJFQURNRU1PUllfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50RGF0YVdyaXRlTWVtb3J5KGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19EQVRBV1JJVEVNRU1PUllfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50TGlzdFNpZ25hbHMoaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0xJU1RTSUdOQUxTX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLWludAotRGJnQ2xudFNpZ25hbEluZm8oaW50IHRpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlyZXM7Ci0JaW50CQkJbGVuOwotCWNoYXIgKgkJYnVmOwotCXByb3h5X21zZyAqCW1zZzsKLQliaXRzZXQgKglzZXQ7Ci0KLQlzZXQgPSBzdHJfdG9fYml0c2V0KGFyZ3NbMF0sIE5VTEwpOwotCWlmIChzZXQgPT0gTlVMTCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfUFJPQ1NFVCwgTlVMTCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NJR05BTElORk9fQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50Q0xJSGFuZGxlKGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19DTElIQU5ETEVfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50Ci1EYmdDbG50UXVpdChpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCi0JZGJnX3N0YXRlID0gU0hVVERPV05fU1RBUlRFRDsKLQotCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1FVSVRfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCBuYXJncywgYXJncyk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGRiZ19wcm9jcywgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogRXZlbnQgaGFuZGxpbmcKLSAqLwotaW50Ci1EYmdDbG50UHJvZ3Jlc3Modm9pZCkKLXsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENoZWNrIGZvciBhbnkgc2VydmVyIGV2ZW50cwotCSAqLwotCi0Jc2RtX3Byb2dyZXNzKCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBDaGVjayBmb3IgcHJveHkgZXZlbnRzCi0JICovCi0KLQlyZXR1cm4gcHJveHlfc3ZyX3Byb2dyZXNzKGRiZ19wcm94eSkgPT0gUFJPWFlfUkVTX09LID8gREJHUkVTX09LIDogREJHUkVTX0VSUjsKLX0KLQotI2lmIDAKLXZvaWQKLURiZ0NsbnRSZWdpc3RlckV2ZW50SGFuZGxlcih2b2lkICgqZXZlbnRfY2FsbGJhY2spKGRiZ19ldmVudCAqLCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCVJlZ2lzdGVyRXZlbnRIYW5kbGVyKGV2ZW50X2NhbGxiYWNrLCBkYXRhKTsKLX0KLQotLyoqCi0gKiBVbnJlZ2lzdGVyIGZpbGUgZGVzY3JpcHRvciBoYW5kbGVyCi0gKi8KLXZvaWQKLURiZ0NsbnRVbnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHZvaWQgKCpldmVudF9jYWxsYmFjaykoZGJnX2V2ZW50ICosIHZvaWQgKikpCi17Ci0JVW5yZWdpc3RlckV2ZW50SGFuZGxlcihldmVudF9jYWxsYmFjayk7Ci19Ci0jZW5kaWYKLQotLyoqCi0gKiBSZWdpc3RlciBhIGhhbmRsZXIgZm9yIGZpbGUgZGVzY3JpcHRvciBldmVudHMuCi0gKgotICogVE9ETzogU2hvdWxkIHRoZSBoYW5kbGVyIHJldHVybiBhIHZhbHVlPwotICovCi12b2lkCi1EYmdDbG50UmVnaXN0ZXJSZWFkRmlsZUhhbmRsZXIoaW50IGZkLCBpbnQgKCpmaWxlX2hhbmRsZXIpKGludCwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQlSZWdpc3RlckZpbGVIYW5kbGVyKGZkLCBSRUFEX0ZJTEVfSEFORExFUiwgZmlsZV9oYW5kbGVyLCBkYXRhKTsKLX0KLQotdm9pZAotRGJnQ2xudFJlZ2lzdGVyV3JpdGVGaWxlSGFuZGxlcihpbnQgZmQsIGludCAoKmZpbGVfaGFuZGxlcikoaW50LCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCVJlZ2lzdGVyRmlsZUhhbmRsZXIoZmQsIFdSSVRFX0ZJTEVfSEFORExFUiwgZmlsZV9oYW5kbGVyLCBkYXRhKTsKLX0KLQotdm9pZAotRGJnQ2xudFJlZ2lzdGVyRXhjZXB0RmlsZUhhbmRsZXIoaW50IGZkLCBpbnQgKCpmaWxlX2hhbmRsZXIpKGludCwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQlSZWdpc3RlckZpbGVIYW5kbGVyKGZkLCBFWENFUFRfRklMRV9IQU5ETEVSLCBmaWxlX2hhbmRsZXIsIGRhdGEpOwotfQotCi0vKioKLSAqIFVucmVnaXN0ZXIgZmlsZSBkZXNjcmlwdG9yIGhhbmRsZXIKLSAqLwotdm9pZAotRGJnQ2xudFVucmVnaXN0ZXJGaWxlSGFuZGxlcihpbnQgZmQpCi17Ci0JVW5yZWdpc3RlckZpbGVIYW5kbGVyKGZkKTsKLX0KLQotaW50Ci1EYmdDbG50RGF0YUV2YWx1YXRlRXhwcmVzc2lvbihpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfRVZBTFVBVEVFWFBSRVNTSU9OX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci1pbnQKLURiZ0NsbnRHZXRQYXJ0aWFsQUlGKGludCB0aWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQkJcmVzOwotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlwcm94eV9tc2cgKgltc2c7Ci0JYml0c2V0ICoJc2V0OwotCi0Jc2V0ID0gc3RyX3RvX2JpdHNldChhcmdzWzBdLCBOVUxMKTsKLQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1BST0NTRVQsIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQltc2cgPSBuZXdfcHJveHlfbXNnKERCR19HRVRQQVJUSUFMQUlGX0NNRCwgdGlkKTsKLQlwcm94eV9tc2dfYWRkX2FyZ3Nfbm9jb3B5KG1zZywgLS1uYXJncywgJmFyZ3NbMV0pOwotCXByb3h5X3NlcmlhbGl6ZV9tc2cobXNnLCAmYnVmLCAmbGVuKTsKLQotCXJlcyA9IHNlbmRfY29tbWFuZChiaXRzZXRfdG9faWRzZXQoc2V0KSwgREJHX0VWX1dBSVRBTEwsIGJ1ZiwgbGVuLCBOVUxMKTsKLQotCWJpdHNldF9mcmVlKHNldCk7Ci0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiByZXM7Ci19Ci1pbnQKLURiZ0NsbnRWYXJpYWJsZURlbGV0ZShpbnQgdGlkLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWludAkJCXJlczsKLQlpbnQJCQlsZW47Ci0JY2hhciAqCQlidWY7Ci0JcHJveHlfbXNnICoJbXNnOwotCWJpdHNldCAqCXNldDsKLQotCXNldCA9IHN0cl90b19iaXRzZXQoYXJnc1swXSwgTlVMTCk7Ci0JaWYgKHNldCA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9QUk9DU0VULCBOVUxMKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfVkFSSUFCTEVERUxFVEVfQ01ELCB0aWQpOwotCXByb3h5X21zZ19hZGRfYXJnc19ub2NvcHkobXNnLCAtLW5hcmdzLCAmYXJnc1sxXSk7Ci0JcHJveHlfc2VyaWFsaXplX21zZyhtc2csICZidWYsICZsZW4pOwotCi0JcmVzID0gc2VuZF9jb21tYW5kKGJpdHNldF90b19pZHNldChzZXQpLCBEQkdfRVZfV0FJVEFMTCwgYnVmLCBsZW4sIE5VTEwpOwotCi0JYml0c2V0X2ZyZWUoc2V0KTsKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCi0JcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2NsaWVudC9jbGllbnRfaW50ZXJmYWNlLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvY2xpZW50X2ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ3ZTU4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2NsaWVudC9jbGllbnRfaW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiZGJnLmgiCi0jaW5jbHVkZSAiZGJnX3Byb3h5LmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgInByb3h5LmgiCi0jaW5jbHVkZSAicHJveHlfZXZlbnQuaCIKLSNpbmNsdWRlICJiaXRzZXQuaCIKLSNpbmNsdWRlICJoYW5kbGVyLmgiCi0KLS8qCi0gKiBUaGUgVElNRU9VVCBkZXRlcm1pbmVzIGhvdyBvZnRlbiB0aGUgZGVidWdnZXIgcG9sbHMgcHJvZ3Jlc3Mgcm91dGluZXMuCi0gKiBUb28gb2Z0ZW4gYW5kIGl0IHVzZXMgdG9vIG11Y2ggQ1BVLCB0b28gZmV3IGFuZCB0aGluZ3Mgd2lsbCBzbG93IGRvd24uLi4KLSAqLwotI2RlZmluZSBDTElFTlRfVElNRU9VVAk1MDAwMAotI2RlZmluZSBTRVJWRVJfVElNRU9VVAk1MDAwMAotCi1zdGF0aWMgdm9pZCBzZXNzaW9uX2V2ZW50X2hhbmRsZXIodm9pZCAqLCB2b2lkICopOwotCi1zdGF0aWMgcHJveHlfY2xudF9oZWxwZXJfZnVuY3MgY2xudF9oZWxwZXJfZnVuY3MgPSB7Ci0Jc2Vzc2lvbl9ldmVudF9oYW5kbGVyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyB2b2lkCi1zZXNzaW9uX2V2ZW50X2hhbmRsZXIodm9pZCAqZXZlbnQsIHZvaWQgKmRhdGEpCi17Ci0JZGJnX2V2ZW50ICoJZXY7Ci0JcHJveHlfbXNnICoJbXNnID0gKHByb3h5X21zZyAqKWV2ZW50OwotCXNlc3Npb24gKglzID0gKHNlc3Npb24gKilkYXRhOwotCQotCWlmIChEYmdEZXNlcmlhbGl6ZUV2ZW50KG1zZy0+bXNnX2lkLCBtc2ctPm51bV9hcmdzLCBtc2ctPmFyZ3MsICZldikgPCAwKQotCQlyZXR1cm47Ci0JCi0JaWYgKHMtPnNlc3NfZXZlbnRfaGFuZGxlciAhPSBOVUxMKQotCQlzLT5zZXNzX2V2ZW50X2hhbmRsZXIoZXYsIHMtPnNlc3NfZXZlbnRfZGF0YSk7Ci19Ci0KLS8qCi0gKiBTZXNzaW9uIGluaXRpYWxpemF0aW9uCi0gKi8KLWludAotRGJnSW5pdChzZXNzaW9uICoqc2VzcywgY2hhciAqbmFtZSwgY2hhciAqYXR0ciwgLi4uKQotewotCXZhX2xpc3QJCQlhcDsKLQlpbnQJCQkJcmVzOwotCXNlc3Npb24gKgkJczsKLQlzdHJ1Y3QgdGltZXZhbAl0diA9IHswLCBDTElFTlRfVElNRU9VVH07Ci0JCi0JcyA9IChzZXNzaW9uICopbWFsbG9jKHNpemVvZihzZXNzaW9uKSk7Ci0JCi0JY2xudF9oZWxwZXJfZnVuY3MuZXZlbnRkYXRhID0gKHZvaWQgKilzOwotCQotCXZhX3N0YXJ0KGFwLCBhdHRyKTsKLQlyZXMgPSBwcm94eV9jbG50X2luaXQobmFtZSwgJnR2LCAmY2xudF9oZWxwZXJfZnVuY3MsICZzLT5zZXNzX3Byb3h5LCBhdHRyLCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQkKLQlpZiAocmVzIDwgMCkgewotCQlmcmVlKHMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXMtPnNlc3NfZXZlbnRfaGFuZGxlciA9IE5VTEw7Ci0JKnNlc3MgPSBzOwotCQotCXJldHVybiAwOwotfQotCi1pbnQKLURiZ0Nvbm5lY3Qoc2Vzc2lvbiAqcykKLXsKLQlyZXR1cm4gcHJveHlfY2xudF9jb25uZWN0KHMtPnNlc3NfcHJveHkpOwotfQotCi1pbnQKLURiZ0NyZWF0ZShzZXNzaW9uICpzKQotewotCXJldHVybiBwcm94eV9jbG50X2NyZWF0ZShzLT5zZXNzX3Byb3h5KTsKLX0KLQotaW50Ci1EYmdTdGFydFNlc3Npb24oc2Vzc2lvbiAqcywgY2hhciAqZGlyLCBjaGFyICpwcm9nLCBjaGFyICphcmdzKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NUQVJUU0VTU0lPTl9DTUQsIDApOwotCQotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZGlyKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIHByb2cpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYXJncyk7Ci0JCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi0vKgotICogQnJlYWtwb2ludCBvcGVyYXRpb25zCi0gKi8KLWludCAKLURiZ1NldExpbmVCcmVha3BvaW50KHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBpbnQgYnBpZCwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0VUTElORUJSRUFLUE9JTlRfQ01ELCAwKTsKLQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQlwcm94eV9tc2dfYWRkX2ludChtc2csIGJwaWQpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZmlsZSk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBsaW5lKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IAotRGJnU2V0RnVuY0JyZWFrcG9pbnQoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGludCBicGlkLCBjaGFyICpmaWxlLCBjaGFyICpmdW5jKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NFVEZVTkNCUkVBS1BPSU5UX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBicGlkKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGZpbGUpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZnVuYyk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ0RlbGV0ZUJyZWFrcG9pbnQoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGludCBicGlkKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0RFTEVURUJSRUFLUE9JTlRfQ01ELCAwKTsKLQkKLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBicGlkKTsKLQkKLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ0VuYWJsZUJyZWFrcG9pbnQoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGludCBicGlkKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0VOQUJMRUJSRUFLUE9JTlRfQ01ELCAwKTsKLQkKLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBicGlkKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IAotRGJnRGlzYWJsZUJyZWFrcG9pbnQoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGludCBicGlkKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0RJU0FCTEVCUkVBS1BPSU5UX0NNRCwgMCk7Ci0JCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgYnBpZCk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ0NvbmRpdGlvbkJyZWFrcG9pbnQoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGludCBicGlkLCBjaGFyICpleHByKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0NPTkRJVElPTkJSRUFLUE9JTlRfQ01ELCAwKTsKLQkKLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBicGlkKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGV4cHIpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQgCi1EYmdCcmVha3BvaW50QWZ0ZXIoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGludCBicGlkLCBpbnQgaWNvdW50KQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0JSRUFLUE9JTlRBRlRFUl9DTUQsIDApOwotCQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQlwcm94eV9tc2dfYWRkX2ludChtc2csIGJwaWQpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgaWNvdW50KTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IAotRGJnU2V0V2F0Y2hwb2ludChzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IGJwaWQsIGNoYXIgKmV4cHIsIGludCBhY2Nlc3MsIGludCByZWFkLCBjaGFyICpjb25kaXRpb24sIGludCBpY291bnQpCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0VUV0FUQ0hQT0lOVF9DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgYnBpZCk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBleHByKTsKLQlwcm94eV9tc2dfYWRkX2ludChtc2csIGFjY2Vzcyk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCByZWFkKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGNvbmRpdGlvbik7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBpY291bnQpOwotCQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLS8qCi0gKiBQcm9jZXNzIGNvbnRyb2wgb3BlcmF0aW9ucwotICovCi1pbnQgCi1EYmdHbyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCkKLXsKLQlwcm94eV9tc2cgKgltc2cgPSBuZXdfcHJveHlfbXNnKERCR19HT19DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQgCi1EYmdTdGVwKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBpbnQgY291bnQsIGludCB0eXBlKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NURVBfQ01ELCAwKTsKLQkKLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBjb3VudCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCB0eXBlKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IAotRGJnVGVybWluYXRlKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0KQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1RFUk1JTkFURV9DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQgCi1EYmdTdXNwZW5kKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0KQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1NVU1BFTkRfQ01ELCAwKTsKLQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLS8qCi0gKiBTdGFjayBmcmFtZSBvcGVyYXRpb25zCi0gKi8KLWludCAKLURiZ0xpc3RTdGFja2ZyYW1lcyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IGxvdywgaW50IGRlcHRoKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0xJU1RTVEFDS0ZSQU1FU19DTUQsIDApOwotCQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQlwcm94eV9tc2dfYWRkX2ludChtc2csIGxvdyk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBkZXB0aCk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ1NldEN1cnJlbnRTdGFja2ZyYW1lKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBpbnQgbGV2ZWwpCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0VUQ1VSUkVOVFNUQUNLRlJBTUVfQ01ELCAwKTsKLQkKLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBsZXZlbCk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFeHByZXNzaW9uL3ZhcmlhYmxlIG9wZXJhdGlvbnMKLSAqLwotaW50IAotRGJnRXZhbHVhdGVFeHByZXNzaW9uKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBjaGFyICpleHApCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfRVZBTFVBVEVFWFBSRVNTSU9OX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBleHApOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQgCi1EYmdHZXRUeXBlKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBjaGFyICpleHApCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfR0VUVFlQRV9DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZXhwKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IAotRGJnTGlzdExvY2FsVmFyaWFibGVzKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0KQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0xJU1RMT0NBTFZBUklBQkxFU19DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQgCi1EYmdMaXN0QXJndW1lbnRzKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLQlwcm94eV9tc2cgKgltc2cgPSBuZXdfcHJveHlfbXNnKERCR19MSVNUQVJHVU1FTlRTX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBsb3cpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgaGlnaCk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ0xpc3RHbG9iYWxWYXJpYWJsZXMoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQpCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfTElTVEdMT0JBTFZBUklBQkxFU19DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQKLURiZ0xpc3RJbmZvVGhyZWFkcyhzZXNzaW9uICpzLCBiaXRzZXQgKnNldCkgCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfTElTVElORk9USFJFQURTX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ1NldFRocmVhZFNlbGVjdChzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgaW50IHRocmVhZE51bSkgCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0VUVEhSRUFEU0VMRUNUX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCB0aHJlYWROdW0pOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQgCi1EYmdTdGFja0luZm9EZXB0aChzZXNzaW9uICpzLCBiaXRzZXQgKnNldCkgCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU1RBQ0tJTkZPREVQVEhfQ01ELCAwKTsKLQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IAotRGJnRGF0YVJlYWRNZW1vcnkoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGxvbmcgb2Zmc2V0LCBjaGFyICphZGRyZXNzLCBjaGFyICpmb3JtYXQsIGludCB3b3JkU2l6ZSwgaW50IHJvd3MsIGludCBjb2xzLCBjaGFyICphc0NoYXIpIAotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0RBVEFSRUFETUVNT1JZX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBvZmZzZXQpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYWRkcmVzcyk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBmb3JtYXQpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgd29yZFNpemUpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgcm93cyk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBjb2xzKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGFzQ2hhcik7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCAKLURiZ0RhdGFXcml0ZU1lbW9yeShzZXNzaW9uICpzLCBiaXRzZXQgKnNldCwgbG9uZyBvZmZzZXQsIGNoYXIgKmFkZHJlc3MsIGNoYXIgKmZvcm1hdCwgaW50IHdvcmRTaXplLCBjaGFyICp2YWx1ZSkgCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfREFUQVdSSVRFTUVNT1JZX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBvZmZzZXQpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYWRkcmVzcyk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBmb3JtYXQpOwotCXByb3h5X21zZ19hZGRfaW50KG1zZywgd29yZFNpemUpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgdmFsdWUpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotCi1pbnQKLURiZ0xpc3RTaWduYWxzKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBjaGFyICpuYW1lKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0xJU1RTSUdOQUxTX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBuYW1lKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1EYmdTaWduYWxJbmZvKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBjaGFyICphcmcpCi17Ci0JcHJveHlfbXNnICoJbXNnID0gbmV3X3Byb3h5X21zZyhEQkdfU0lHTkFMSU5GT19DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYXJnKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1EYmdDTElIYW5kbGUoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIgKmFyZykKLXsKLQlwcm94eV9tc2cgKgltc2cgPSBuZXdfcHJveHlfbXNnKERCR19DTElIQU5ETEVfQ01ELCAwKTsKLQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGFyZyk7Ci0KLQlwcm94eV9jbG50X3F1ZXVlX21zZyhzLT5zZXNzX3Byb3h5LCBtc2cpOwotCQotCWZyZWVfcHJveHlfbXNnKG1zZyk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotRGJnUXVpdChzZXNzaW9uICpzKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX1FVSVRfQ01ELCAwKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLQotfQotCi1pbnQKLURiZ0RhdGFFdmFsdWF0ZUV4cHJlc3Npb24oc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIgKmFyZykKLXsKLQlwcm94eV9tc2cgKgltc2cgPSBuZXdfcHJveHlfbXNnKERCR19EQVRBRVZBTFVBVEVFWFBSRVNTSU9OX0NNRCwgMCk7Ci0KLQlwcm94eV9tc2dfYWRkX2JpdHNldChtc2csIHNldCk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBhcmcpOwotCi0JcHJveHlfY2xudF9xdWV1ZV9tc2cocy0+c2Vzc19wcm94eSwgbXNnKTsKLQkKLQlmcmVlX3Byb3h5X21zZyhtc2cpOwotCQotCXJldHVybiAwOwotfQotaW50Ci1EYmdHZXRQYXJ0aWFsQUlGKHNlc3Npb24gKnMsIGJpdHNldCAqc2V0LCBjaGFyICpuYW1lLCBjaGFyICprZXksIGludCBsaXN0Q2hpbGRyZW4sIGludCBleHByZXNzKQotewotCXByb3h5X21zZyAqCW1zZyA9IG5ld19wcm94eV9tc2coREJHX0dFVFBBUlRJQUxBSUZfQ01ELCAwKTsKLQotCXByb3h5X21zZ19hZGRfYml0c2V0KG1zZywgc2V0KTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIG5hbWUpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywga2V5KTsKLQlwcm94eV9tc2dfYWRkX2ludChtc2csIGxpc3RDaGlsZHJlbik7Ci0JcHJveHlfbXNnX2FkZF9pbnQobXNnLCBleHByZXNzKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLWludAotRGJnVmFyaWFibGVEZWxldGUoc2Vzc2lvbiAqcywgYml0c2V0ICpzZXQsIGNoYXIgKmFyZykKLXsKLQlwcm94eV9tc2cgKgltc2cgPSBuZXdfcHJveHlfbXNnKERCR19WQVJJQUJMRURFTEVURV9DTUQsIDApOwotCi0JcHJveHlfbXNnX2FkZF9iaXRzZXQobXNnLCBzZXQpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYXJnKTsKLQotCXByb3h5X2NsbnRfcXVldWVfbXNnKHMtPnNlc3NfcHJveHksIG1zZyk7Ci0JCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEV2ZW50IGhhbmRsaW5nCi0gKi8KLWludAotRGJnUHJvZ3Jlc3Moc2Vzc2lvbiAqcykKLXsKLQlyZXR1cm4gcHJveHlfY2xudF9wcm9ncmVzcyhzLT5zZXNzX3Byb3h5KTsKLX0KLQotdm9pZAotRGJnUmVnaXN0ZXJFdmVudEhhbmRsZXIoc2Vzc2lvbiAqcywgdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShkYmdfZXZlbnQgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQlzLT5zZXNzX2V2ZW50X2hhbmRsZXIgPSBldmVudF9jYWxsYmFjazsKLQlzLT5zZXNzX2V2ZW50X2RhdGEgPSBkYXRhOwotCVJlZ2lzdGVyRXZlbnRIYW5kbGVyKFBST1hZX0VWRU5UX0hBTkRMRVIsIHNlc3Npb25fZXZlbnRfaGFuZGxlciwgKHZvaWQgKilzKTsKLQkvL3MtPnNlc3NfcHJveHktPmNsbnRfZnVuY3MtPnJlZ2V2ZW50aGFuZGxlcihzLT5zZXNzX3Byb3h5X2RhdGEsIHNlc3Npb25fZXZlbnRfaGFuZGxlciwgKHZvaWQgKilzKTsKLX0KLQotLyoqCi0gKiBVbnJlZ2lzdGVyIGZpbGUgZGVzY3JpcHRvciBoYW5kbGVyCi0gKi8KLXZvaWQKLURiZ1VucmVnaXN0ZXJFdmVudEhhbmRsZXIoc2Vzc2lvbiAqcywgdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShkYmdfZXZlbnQgKiwgdm9pZCAqKSkKLXsKLQlzLT5zZXNzX2V2ZW50X2hhbmRsZXIgPSBOVUxMOwotCVVucmVnaXN0ZXJFdmVudEhhbmRsZXIoUFJPWFlfRVZFTlRfSEFORExFUiwgc2Vzc2lvbl9ldmVudF9oYW5kbGVyKTsKLX0KLQotLyoqCi0gKiBSZWdpc3RlciBhIGhhbmRsZXIgZm9yIGZpbGUgZGVzY3JpcHRvciBldmVudHMuCi0gKi8KLXZvaWQKLURiZ1JlZ2lzdGVyUmVhZEZpbGVIYW5kbGVyKHNlc3Npb24gKnMsIGludCBmZCwgaW50ICgqZmlsZV9oYW5kbGVyKShpbnQsIHZvaWQgKiksIHZvaWQgKmRhdGEpCi17Ci0JUmVnaXN0ZXJGaWxlSGFuZGxlcihmZCwgUkVBRF9GSUxFX0hBTkRMRVIsIGZpbGVfaGFuZGxlciwgZGF0YSk7Ci19Ci0KLXZvaWQKLURiZ1JlZ2lzdGVyV3JpdGVGaWxlSGFuZGxlcihzZXNzaW9uICpzLCBpbnQgZmQsIGludCAoKmZpbGVfaGFuZGxlcikoaW50LCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCVJlZ2lzdGVyRmlsZUhhbmRsZXIoZmQsIFdSSVRFX0ZJTEVfSEFORExFUiwgZmlsZV9oYW5kbGVyLCBkYXRhKTsKLX0KLQotdm9pZAotRGJnUmVnaXN0ZXJFeGNlcHRGaWxlSGFuZGxlcihzZXNzaW9uICpzLCBpbnQgZmQsIGludCAoKmZpbGVfaGFuZGxlcikoaW50LCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCVJlZ2lzdGVyRmlsZUhhbmRsZXIoZmQsIEVYQ0VQVF9GSUxFX0hBTkRMRVIsIGZpbGVfaGFuZGxlciwgZGF0YSk7Ci19Ci0KLS8qKgotICogVW5yZWdpc3RlciBmaWxlIGRlc2NyaXB0b3IgaGFuZGxlcgotICovCi12b2lkCi1EYmdVbnJlZ2lzdGVyRmlsZUhhbmRsZXIoc2Vzc2lvbiAqcywgaW50IGZkKQotewotCVVucmVnaXN0ZXJGaWxlSGFuZGxlcihmZCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvc3RhcnR1cC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvY2xpZW50L3N0YXJ0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxOGI1Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9jbGllbnQvc3RhcnR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZm5kZWYgX0FJWAotI2luY2x1ZGUgPGdldG9wdC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJiYWNrZW5kLmgiCi0jaW5jbHVkZSAicHJveHkuaCIKLSNpbmNsdWRlICJwcm94eV90Y3AuaCIKLSNpbmNsdWRlICJzZG0uaCIKLQotI2RlZmluZSBERUZBVUxUX0JBQ0tFTkQJImdkYi1taSIKLSNkZWZpbmUgREVGQVVMVF9QUk9YWQkidGNwIgotCi1leHRlcm4gdm9pZCBjbGllbnQoY2hhciAqcHJveHksIGNoYXIgKmhvc3QsIGludCBwb3J0KTsKLWV4dGVybiB2b2lkIHNlcnZlcihkYmdfYmFja2VuZCAqZGJncik7Ci0KLSNpZm5kZWYgX0FJWAotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLQl7ImRlYnVnZ2VyIiwJCXJlcXVpcmVkX2FyZ3VtZW50LAlOVUxMLAknYid9LAotCXsiZGVidWdnZXJfcGF0aCIsCXJlcXVpcmVkX2FyZ3VtZW50LAlOVUxMLCAJJ2UnfSwKLQl7InByb3h5IiwJCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwgCSdQJ30sCi0JeyJwb3J0IiwJCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwgCSdwJ30sCi0JeyJob3N0IiwJCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwgCSdoJ30sCi0JeyJtYXN0ZXIiLAkJCW5vX2FyZ3VtZW50LAkgCU5VTEwsCSdtJ30sCi0jaWZkZWYgREVCVUcKLQl7ImRlYnVnIiwJCQlvcHRpb25hbF9hcmd1bWVudCwJTlVMTCwgCSdkJ30sCi0jZW5kaWYgLyogREVCVUcgKi8KLQl7TlVMTCwJCQkJMCwJCQkJCU5VTEwsCTB9Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotc3RhdGljIGNoYXIgKiBzaG9ydG9wdHMgPSAiYjplOlA6cDpoOmQ6bSI7Ci0jZWxzZSAvKiBERUJVRyAqLwotc3RhdGljIGNoYXIgKiBzaG9ydG9wdHMgPSAiYjplOlA6cDpoOm0iOwotI2VuZGlmIC8qIERFQlVHICovCi0KLXN0YXRpYyBpbnQJZmF0YWxfZXJyb3IgPSAwOwotc3RhdGljIGNoYXIgKmVycm9yX3N0ciA9IE5VTEw7Ci0KLXZvaWQKLWVycm9yX21zZyhjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0CWFwOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JdmFzcHJpbnRmKCZlcnJvcl9zdHIsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlmYXRhbF9lcnJvciA9IDE7Ci19Ci0KLXZvaWQKLXByaW50X2Vycm9yX21zZygpCi17Ci0JaWYgKGVycm9yX3N0ciAhPSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXMiLCBlcnJvcl9zdHIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQl9Ci19Ci0KLS8qCi0gKiBNYWluIGVudHJ5IHBvaW50IGZvciBNUEkgcGFyYWxsZWwgZGVidWdnZXIuCi0gKgotICogQGFyZwktYiBkZWJ1Z2dlcglzZWxlY3QgYmFja2VuZCBkZWJ1Z2dlcgotICogQGFyZwktZSBwYXRoCQlzZXQgYmFja2VuZCBkZWJ1Z2dlciBwYXRoCi0gKiBAYXJnCS1wIHBvcnQJCXBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbi9jb25uZWN0IHRvCi0gKiBAYXJnCS1oIGhvc3QJCWhvc3QgdG8gY29ubmVjdCB0bwotICogQGFyZwktUCBwcm94eQkJdHlwZSBvZiBwcm94eSBjb25uZWN0aW9uIHRvIHVzZQotICogQGFyZwktaiBqb2JpZAkJam9iaWQgb2YgYXBwbGljYXRpb24gYmVpbmcgZGVidWdnZWQKLSAqLwotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaW50IAkJCWNoOwotCWludAkJCQlwb3J0ID0gUFJPWFlfVENQX1BPUlQ7Ci0JY2hhciAqCQkJaG9zdCA9IE5VTEw7Ci0JY2hhciAqCQkJZGVidWdnZXJfc3RyID0gREVGQVVMVF9CQUNLRU5EOwotCWNoYXIgKgkJCXByb3h5X3N0ciA9IERFRkFVTFRfUFJPWFk7Ci0JY2hhciAqCQkJcGF0aCA9IE5VTEw7Ci0JcHJveHkgKgkJCXA7Ci0JZGJnX2JhY2tlbmQgKglkOwotI2lmZGVmIF9BSVgKLQlpbnQJCQkJbjsKLQljaGFyICoJCQljcDsKLSNlbmRpZgotCi0jaWZuZGVmIF9BSVgKLQl3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywgTlVMTCkpICE9IC0xKSB7Ci0JCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnYic6Ci0JCQlkZWJ1Z2dlcl9zdHIgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnZSc6Ci0JCQlwYXRoID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1AnOgotCQkJcHJveHlfc3RyID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJcG9ydCA9IChpbnQpc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2gnOgotCQkJaG9zdCA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdtJzoKLQkJCWJyZWFrOwotCSNpZmRlZiBERUJVRwotCQljYXNlICdkJzoKLQkJCWlmIChvcHRhcmcgPT0gTlVMTCkKLQkJCQlkZWJ1Z19sZXZlbCA9IERFQlVHX0xFVkVMX0FMTDsKLQkJCWVsc2UKLQkJCQlkZWJ1Z19sZXZlbCA9IChpbnQpc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOwotCQkJYnJlYWs7Ci0JI2VuZGlmIC8qIERFQlVHICovCi0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkic2RtIFstLWRlYnVnZ2VyPXZhbHVlXSBbLS1kZWJ1Z2dlcl9wYXRoPXBhdGhdXG4iCi0JCQkJIiAgICBbLS1wcm94eT1wcm94eV1cbiIKLQkJCQkiICAgIFstLWhvc3Q9aG9zdF9uYW1lXSBbLS1wb3J0PXBvcnRdXG4iCi0JCQkJIgkgWy0tbWFzdGVyXVxuIgotCSNpZmRlZiBERUJVRwotCQkJCSIgICAgWy0tZGVidWdbPWxldmVsXV1cbiIKLQkjZW5kaWYgLyogREVCVUcgKi8KLQkJCSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLSNlbHNlCi0JCS8qCi0JCSAqIEFJWCBkb2VzIG5vdCBzdXBwb3J0IEdOVSBzdHlsZSBnZXRvcHQgd2l0aCBsb25nIG9wdGlvbnMuCi0JCSAqIFBhcnNlIG9wdGlvbnMgYnkgc3RyaW5nIGNvbXBhcmlzb24gaW5zdGVhZC4KLQkJICovCi0JbiA9IDE7Ci0Jd2hpbGUgKG4gPCBhcmdjKSB7Ci0JCWNwID0gc3RyY2hyKGFyZ3Zbbl0sICc9Jyk7Ci0JCWlmIChjcCA9PSBOVUxMKSB7Ci0JCQlpZiAoc3RyY21wKGFyZ3Zbbl0sICItLW1hc3RlciIpID09IDApIHsKLQkJCQkvKiBObyBhY3Rpb24gcmVxdWlyZWQgKi8KLSNpZmRlZiBERUJVRwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltuXSwgIi0tZGVidWciKSA9PSAwKSB7Ci0JCQkJZGVidWdfbGV2ZWwgPSBERUJVR19MRVZFTF9BTEw7Ci0jZW5kaWYKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkic2RtIFstLWRlYnVnZ2VyPXZhbHVlXSBbLS1kZWJ1Z2dlcl9wYXRoPXBhdGhdXG4iCi0JCQkJCSIgICAgWy0tcHJveHk9cHJveHldXG4iCi0JCQkJCSIgICAgWy0taG9zdD1ob3N0X25hbWVdIFstLXBvcnQ9cG9ydF1cbiIKLQkJCQkJIgkgWy0tbWFzdGVyXVxuIgotI2lmZGVmIERFQlVHCi0JCQkJCSIgICAgWy0tZGVidWdbPWxldmVsXV1cbiIKLSNlbmRpZiAvKiBERUJVRyAqLwotCQkJCSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkqY3AgPSAnXDAnOwotCQkJaWYgKHN0cmNtcChhcmd2W25dLCAiLS1kZWJ1Z2dlciIpID09IDApIHsKLQkJCQlkZWJ1Z2dlcl9zdHIgPSBzdHJkdXAoY3AgKyAxKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1kZWJ1Z2dlcl9wYXRoIikgPT0gMCkgewotCQkJCXBhdGggPSBzdHJkdXAoY3AgKyAxKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1wcm94eSIpID09IDApIHsKLQkJCQlwcm94eV9zdHIgPSBzdHJkdXAoY3AgKyAxKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1wb3J0IikgPT0gMCkgewotCQkJCXBvcnQgPSAoaW50KSBzdHJ0b2woY3AgKyAxLCBOVUxMLCAxMCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjbXAoYXJndltuXSwgIi0taG9zdCIpID09IDApIHsKLQkJCQlob3N0ID0gc3RyZHVwKGNwICsgMSk7Ci0JCQl9Ci0jaWZkZWYgREVCVUcKLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1kZWJ1ZyIpID09IDApIHsKLQkJCQlkZWJ1Z19sZXZlbCA9IChpbnQpIHN0cnRvbChjcCArIDEsIE5VTEwsIDEwKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCSJzZG0gWy0tZGVidWdnZXI9dmFsdWVdIFstLWRlYnVnZ2VyX3BhdGg9cGF0aF1cbiIKLQkJCQkJIiAgICBbLS1wcm94eT1wcm94eV1cbiIKLQkJCQkJIiAgICBbLS1ob3N0PWhvc3RfbmFtZV0gWy0tcG9ydD1wb3J0XVxuIgotCQkJCQkiCSBbLS1tYXN0ZXJdXG4iCi0jaWZkZWYgREVCVUcKLQkJCQkJIiAgICBbLS1kZWJ1Z1s9bGV2ZWxdXVxuIgotI2VuZGlmIC8qIERFQlVHICovCi0JCQkJKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCQluID0gbiArIDE7Ci0JfQotI2VuZGlmCi0KLQlpZiAoZmluZF9kYmdfYmFja2VuZChkZWJ1Z2dlcl9zdHIsICZkKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJObyBzdWNoIGJhY2tlbmQ6IFwiJXNcIlxuIiwgZGVidWdnZXJfc3RyKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHBhdGggIT0gTlVMTCkgewotCQliYWNrZW5kX3NldF9wYXRoKGQsIHBhdGgpOwotCX0KLQotCWlmIChmaW5kX3Byb3h5KHByb3h5X3N0ciwgJnApIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwiTm8gc3VjaCBwcm94eTogXCIlc1wiXG4iLCBwcm94eV9zdHIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoc2RtX2luaXQoYXJnYywgYXJndikgPCAwKSB7Ci0JCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9TVEFSVFVQLCAic2RtX2luaXQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHNkbV9yb3V0ZV9nZXRfaWQoKSA9PSBTRE1fTUFTVEVSKSB7Ci0JCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9TVEFSVFVQLCAic3RhcnRpbmcgY2xpZW50XG4iKTsKLQkJY2xpZW50KHByb3h5X3N0ciwgaG9zdCwgcG9ydCk7Ci0JfSBlbHNlIHsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX1NUQVJUVVAsICJzdGFydGluZyB0YXNrICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQlzZXJ2ZXIoZCk7Ci0JfQotCi0JREVCVUdfUFJJTlRTKERFQlVHX0xFVkVMX1NUQVJUVVAsICJhbGwgZmluaXNoZWRcbiIpOwotCi0Jc2RtX2ZpbmFsaXplKCk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvLmN2c2lnbm9yZSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzZDFhNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLS5kaXJzdGFtcAotLmRlcHMKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmE1MWNhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJzZG0uaCIKLQotc3RhdGljIGludAlzaHV0dGluZ19kb3duID0gMDsKLQotc3RhdGljIHZvaWQJcmVjdl9jYWxsYmFjayhzZG1fbWVzc2FnZSBtc2cpOwotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgYWJzdHJhY3Rpb24gbGF5ZXJzLiBPUkRFUiBJUyBJTVBPUlRBTlQhCi0gKi8KLWludAotc2RtX2luaXQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpZiAoc2RtX3JvdXRpbmdfdGFibGVfaW5pdChhcmdjLCBhcmd2KSA8IDApIHsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gc2RtX3JvdXRpbmdfdGFibGVfaW5pdCBmYWlsZWRcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoc2RtX21lc3NhZ2VfaW5pdChhcmdjLCBhcmd2KSA8IDApIHsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gc2RtX21lc3NhZ2VfaW5pdCBmYWlsZWRcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoc2RtX2FnZ3JlZ2F0ZV9pbml0KGFyZ2MsIGFyZ3YpIDwgMCkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fYWdncmVnYXRlX2luaXQgZmFpbGVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gSW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQotCXNkbV9tZXNzYWdlX3NldF9yZWN2X2NhbGxiYWNrKHJlY3ZfY2FsbGJhY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogRmluYWxpemUgdGhlIGFic3RyYWN0aW9uIGxheWVycwotICovCi12b2lkCi1zZG1fZmluYWxpemUodm9pZCkKLXsKLQlzaHV0dGluZ19kb3duID0gMTsKLQotCXNkbV9hZ2dyZWdhdGVfZmluYWxpemUoKTsKLQlzZG1fcm91dGVfZmluYWxpemUoKTsKLQlzZG1fbWVzc2FnZV9maW5hbGl6ZSgpOwotfQotCi0vKgotICogUHJvZ3Jlc3MgbWVzc2FnZXMgYW5kIHRoZSBhZ2dyZWdhdGlvbiBsYXllcgotICovCi12b2lkCi1zZG1fcHJvZ3Jlc3Modm9pZCkKLXsKLQlzZG1fbWVzc2FnZV9wcm9ncmVzcygpOwotCXNkbV9hZ2dyZWdhdGVfcHJvZ3Jlc3MoKTsKLX0KLQotLyoKLSAqIFByb2Nlc3MgYSByZWNlaXZlZCBtZXNzYWdlLiBUaGlzIGltcGxlbWVudHMgdGhlIG1haW4gY29tbXVuaWNhdGlvbiBlbmdpbmUKLSAqIG1lc3NhZ2UgcHJvY2Vzc2luZyBhbGdvcml0aG0uCi0gKi8KLXN0YXRpYyB2b2lkCi1yZWN2X2NhbGxiYWNrKHNkbV9tZXNzYWdlIG1zZykKLXsKLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBFbnRlciByZWN2X2NhbGxiYWNrXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCi0JaWYgKHNkbV9zZXRfY29udGFpbnMoc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpLCBTRE1fTUFTVEVSKSkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBnb3QgZG93bnN0cmVhbSBtZXNzYWdlIHNyYz0lcywgZGVzdD0lc1xuIiwKLQkJCQlzZG1fcm91dGVfZ2V0X2lkKCksCi0JCQkJX3NldF90b19zdHIoc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpKSwKLQkJCQlfc2V0X3RvX3N0cihzZG1fbWVzc2FnZV9nZXRfZGVzdGluYXRpb24obXNnKSkpOwotCi0JCWlmIChzaHV0dGluZ19kb3duKSB7Ci0JCQkvKgotCQkJICogU3RvcCBwcm9jZXNzaW5nIGRvd25zdHJlYW0gbWVzc2FnZXMKLQkJCSAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyoKLQkJICogU3RhcnQgYWdncmVnYXRpbmcgbWVzc2FnZXMKLQkJICovCi0JCXNkbV9hZ2dyZWdhdGVfbWVzc2FnZShtc2csIFNETV9BR0dSRUdBVEVfRE9XTlNUUkVBTSk7Ci0KLQkJLyoKLQkJICogSWYgd2UgYXJlIHRoZSBkZXN0aW5hdGlvbiwgdGhlbiBkZWxpdmVyIHRoZSBwYXlsb2FkCi0JCSAqLwotCQlpZiAoc2RtX3NldF9jb250YWlucyhzZG1fbWVzc2FnZV9nZXRfZGVzdGluYXRpb24obXNnKSwgc2RtX3JvdXRlX2dldF9pZCgpKSkgewotCQkJc2RtX21lc3NhZ2VfZGVsaXZlcihtc2cpOwotCQl9Ci0KLQkJLyoKLQkJICogRnJlZSB0aGUgbWVzc2FnZSBvbmNlIGl0J3MgYmVlbiBmb3J3YXJkZWQKLQkJICovCi0JCXNkbV9tZXNzYWdlX3NldF9zZW5kX2NhbGxiYWNrKG1zZywgc2RtX21lc3NhZ2VfZnJlZSk7Ci0KLQkJLyoKLQkJICogTm93IGZvcndhcmQgdGhlIG1lc3NhZ2UKLQkJICovCi0JCXNkbV9tZXNzYWdlX3NlbmQobXNnKTsKLQl9IGVsc2UgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBnb3QgdXBzdHJlYW0gbWVzc2FnZSBzcmM9JXMsIGRlc3Q9JXNcbiIsCi0JCQkJc2RtX3JvdXRlX2dldF9pZCgpLAotCQkJCV9zZXRfdG9fc3RyKHNkbV9tZXNzYWdlX2dldF9zb3VyY2UobXNnKSksCi0JCQkJX3NldF90b19zdHIoc2RtX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uKG1zZykpKTsKLQotCQkvKgotCQkgKiBVcHN0cmVhbSBtZXNzYWdlcyBhcmUgYWx3YXlzIGFnZ3JlZ2F0ZWQKLQkJICovCi0JCXNkbV9hZ2dyZWdhdGVfbWVzc2FnZShtc2csIFNETV9BR0dSRUdBVEVfVVBTVFJFQU0pOwotCX0KLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIExlYXZpbmcgcmVjdl9jYWxsYmFja1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9hZ2dyZWdhdGVfaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmUxY2UzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX2FnZ3JlZ2F0ZV9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBNZXNzYWdlIGFnZ3JlZ2F0aW9uIGJhc2VkIG9uIGhhc2hpbmcgdGhlIG1lc3NhZ2UgY29udGVudHMuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJzZXJkZXMuaCIKLSNpbmNsdWRlICJzZG0uaCIKLQotI2RlZmluZSBTRE1fRVZFTlRfV0FJVF9USU1FIDEwMDAwMAotI2RlZmluZSBBR0dSRUdBVEVfVkFMVUVfTEVOCTgKLQotc3RydWN0IHNkbV9hZ2dyZWdhdGUgewotCXVuc2lnbmVkIGludAl2YWx1ZTsJLyogVGltZW91dCBvciBoYXNoIHZhbHVlICovCi19OwotCi0vKgotICogQSByZXF1ZXN0IHJlcHJlc2VudHMgYW4gYXN5bmNocm9ub3VzIHNlbmQvcmVjZWl2ZSB0cmFuc2FjdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQKLSAqIGFuZCBhbGwgc2VydmVycy4gVGhlIGNvbXBsZXRpb25fY2FsbGJhY2soKSBpcyBjYWxsZWQgb25jZSBhbGwgcmVwbGllcyBoYXZlIGJlZW4gcmVjZWl2ZWQKLSAqIGZvciBhIHBhcnRpY3VsYXIgcmVxdWVzdC4KLSAqLwotc3RydWN0IHJlcXVlc3QgewotCWludAkJCQlpZDsJCQkJLyogcmVxdWVzdCBJRCAoc2FtZSBhcyBtZXNzYWdlIElEKSAqLwotCXNkbV9pZHNldAkJb3V0c3RhbmRpbmc7CS8qIGNvbnRyb2xsZXJzIHJlbWFpbmluZyB0byBzZW5kIHJlcGxpZXMgKi8KLQlpbnQJCQkJdGltZW91dDsJCS8qIHdhaXQgdGltZW91dCBmb3IgdGhpcyByZXF1ZXN0IChtaWNyb3NlY29uZHMpICovCi0JSGFzaCAqCQkJcmVwbHlzOwkJCS8qIGhhc2ggb2YgcmVwbGllcyB3ZSd2ZSByZWNlaXZlZCAqLwotCXN0cnVjdCB0aW1ldmFsCXN0YXJ0X3RpbWU7CQkvKiB0aW1lIHRoYXQgdGltZXIgd2FzIHN0YXJ0ZWQgKi8KLQlpbnQJCQkJdGltZXJfc3RhdGU7CS8qIHN0YXRlIG9mIHRpbWVyICovCi19OwotdHlwZWRlZiBzdHJ1Y3QgcmVxdWVzdAlyZXF1ZXN0OwotCi1zdGF0aWMgTGlzdCAqCQkJYWxsX3JlcXVlc3RzOwotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoJY3VycmVudF9yZXF1ZXN0Owotc3RhdGljIHNkbV9pZHNldAkJZW1wdHlfc2V0OwotCi1zdGF0aWMgcmVxdWVzdCAqCW5ld19yZXF1ZXN0KHNkbV9pZHNldCBkZXN0LCBpbnQgaWQsIGludCB0aW1lb3V0KTsKLXN0YXRpYyB2b2lkCQkJZnJlZV9yZXF1ZXN0KHJlcXVlc3QgKik7Ci1zdGF0aWMgdm9pZAkJCXVwZGF0ZV9yZXBseShyZXF1ZXN0ICpyZXEsIHNkbV9tZXNzYWdlIG1zZywgaW50IGhhc2gpOwotc3RhdGljIHZvaWQJCQlzdGFydF90aW1lcihyZXF1ZXN0ICpyKTsKLXN0YXRpYyBpbnQJCQljaGVja190aW1lcihyZXF1ZXN0ICpyKTsKLXN0YXRpYyB2b2lkCQkJZGlzYWJsZV90aW1lcihyZXF1ZXN0ICpyKTsKLXN0YXRpYyB2b2lkCQkJcmVxdWVzdF9jb21wbGV0ZWQocmVxdWVzdCAqcmVxKTsKLXN0YXRpYyBpbnQJIAkJKCpjb21wbGV0aW9uX2NhbGxiYWNrKShjb25zdCBzZG1fbWVzc2FnZSBtc2cpOwotCi0jZGVmaW5lIEVMQVBTRURfVElNRSh0MSwgdDIpCSgoKHQxLnR2X3NlYyAtIHQyLnR2X3NlYykgKiAxMDAwMDAwKSArICh0MS50dl91c2VjIC0gdDIudHZfdXNlYykpCi0jZGVmaW5lIFRJTUVSX1JVTk5JTkcJCQkwCi0jZGVmaW5lIFRJTUVSX0VYUElSRUQJCQkxCi0jZGVmaW5lIFRJTUVSX0RJU0FCTEVECQkJMgotCi1pbnQKLXNkbV9hZ2dyZWdhdGVfaW5pdChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCWFsbF9yZXF1ZXN0cyA9IE5ld0xpc3QoKTsKLQljdXJyZW50X3JlcXVlc3QgPSBOVUxMOwotCWNvbXBsZXRpb25fY2FsbGJhY2sgPSBOVUxMOwotCWVtcHR5X3NldCA9IHNkbV9zZXRfbmV3KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotc2RtX2FnZ3JlZ2F0ZV9zZXJpYWxpemUoY29uc3Qgc2RtX2FnZ3JlZ2F0ZSBhLCBjaGFyICpidWYsIGNoYXIgKiplbmQpCi17Ci0JY2hhciAqCWU7Ci0KLQlpbnRfdG9faGV4X3N0cihhLT52YWx1ZSwgYnVmLCBBR0dSRUdBVEVfVkFMVUVfTEVOLCAmZSk7Ci0JaWYgKGVuZCAhPSBOVUxMKSB7Ci0JCSplbmQgPSBlOwotCX0KLQlyZXR1cm4gZSAtIGJ1ZjsKLX0KLQotaW50Ci1zZG1fYWdncmVnYXRlX3NlcmlhbGl6ZWRfbGVuZ3RoKGNvbnN0IHNkbV9hZ2dyZWdhdGUgYSkKLXsKLQlyZXR1cm4gQUdHUkVHQVRFX1ZBTFVFX0xFTjsKLX0KLQotaW50Ci1zZG1fYWdncmVnYXRlX2Rlc2VyaWFsaXplKHNkbV9hZ2dyZWdhdGUgYSwgY2hhciAqc3RyLCBjaGFyICoqZW5kKQotewotCWNoYXIgKgllOwotCi0JYS0+dmFsdWUgPSBoZXhfc3RyX3RvX2ludChzdHIsIEFHR1JFR0FURV9WQUxVRV9MRU4sICZlKTsKLQlpZiAoZW5kICE9IE5VTEwpIHsKLQkJKmVuZCA9IGU7Ci0JfQotCXJldHVybiBlIC0gc3RyOwotfQotCi12b2lkCi1zZG1fYWdncmVnYXRlX3NldF9jb21wbGV0aW9uX2NhbGxiYWNrKGludCAoKmNhbGxiYWNrKShjb25zdCBzZG1fbWVzc2FnZSBtc2cpKQotewotCWNvbXBsZXRpb25fY2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotLyoKLSAqIEFnZ3JlZ2F0ZSBhIHJlY2VpdmVkIG1lc3NhZ2UKLSAqLwotdm9pZAotc2RtX2FnZ3JlZ2F0ZV9tZXNzYWdlKHNkbV9tZXNzYWdlIG1zZywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCWludCAJCQlpZDsKLQlzZG1fYWdncmVnYXRlCWE7Ci0KLQlhID0gc2RtX21lc3NhZ2VfZ2V0X2FnZ3JlZ2F0ZShtc2cpOwotCi0JaWYgKGZsYWdzICYgU0RNX0FHR1JFR0FURV9VUFNUUkVBTSkgewotCQlyZXF1ZXN0ICoJCXJlcTsKLQotCQlpZiAoZmxhZ3MgJiBTRE1fQUdHUkVHQVRFX0lOSVQpIHsKLQkJCWludAkJbGVuOwotCQkJY2hhciAqCWJ1ZjsKLQotCQkJc2RtX21lc3NhZ2VfZ2V0X3BheWxvYWQobXNnLCAmYnVmLCAmbGVuKTsKLQkJCWEtPnZhbHVlID0gSGFzaENvbXB1dGUoYnVmLCBsZW4pOwotCQl9Ci0KLQkJaWQgPSBzZG1fbWVzc2FnZV9nZXRfaWQobXNnKTsKLQotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fYWdncmVnYXRlX21lc3NhZ2U6IHVwc3RyZWFtIG1lc3NhZ2UgIyVkIGZyb20gJXNcbiIsCi0JCQkJc2RtX3JvdXRlX2dldF9pZCgpLCBpZCwgX3NldF90b19zdHIoc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpKSk7Ci0KLQkJLyoKLQkJICogRmluZCB0aGUgcmVxdWVzdCB0aGlzIHJlcGx5IGlzIGZvci4KLQkJICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgY29tcGxldGVkLgotCQkgKi8KLQkJZm9yIChTZXRMaXN0KGFsbF9yZXF1ZXN0cyk7IChyZXEgPSAocmVxdWVzdCAqKUdldExpc3RFbGVtZW50KGFsbF9yZXF1ZXN0cykpICE9IE5VTEw7ICkgewotCQkJaWYgKHJlcS0+aWQgPT0gaWQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXEgIT0gTlVMTCAmJiBzZG1fc2V0X2NvbXBhcmUocmVxLT5vdXRzdGFuZGluZywgc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpKSkgewotCQkJdXBkYXRlX3JlcGx5KHJlcSwgbXNnLCBhLT52YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVGhpcyBtdXN0IGJlIGFuIHVuc29saWNpdGVkIGV2ZW50LiBDcmVhdGUgYSBuZXcgZmFrZSByZXF1ZXN0IHRoYXQgd2lsbCBqdXN0Ci0JCQkgKiB3YWl0IGZvciBhIHByZS1kZXRlcm1pbmVkIHRpbWVvdXQsIHRoZW4gZm9yd2FyZCB3aGF0ZXZlciBpdCBoYXMuIEFuCi0JCQkgKiBhbHRlcm5hdGl2ZSB0byB0aGlzIHdvdWxkIGJlIHRvIHBlZWsgaW50byB0aGUgcGF5bG9hZCB0byBzZWUgd2hhdCB0aGUKLQkJCSAqIGNvbW1hbmQgaXMsIHRoZW4gbWFrZSBhIGRlY2lzaW9uIGFib3V0IGV4cGVjdGVkIHJlcGxpZXMuCi0JCQkgKgotCQkJICogVGhpcyByZXF1ZXN0IGNhbiBoYXZlIHRoZSBzYW1lIElEIGFzIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBzaW5jZSB3ZSdyZQotCQkJICogZ3VhcmFudGVlZCB0byByZWNlaXZlIGV2ZW50cyBpbiBvcmRlciBmcm9tIGEgcGFydGljdWxhciBzb3VyY2UuCi0JCQkgKgotCQkJICogSXQgYWxzbyBkZXBlbmRzIG9uIG9ubHkgcHJvY2Vzc2luZyByZXF1ZXN0cyBpbiBvcmRlciwgc2luY2UgaXQncyBwb3NzaWJsZQotCQkJICogZm9yIHRoaXMgZXZlbnQgdG8gYmUgcmVjZWl2ZWQgYmVmb3JlIHdlIGhhdmUgYWdncmVnYXRlZCByZXBsaWVzIGZvcgotCQkJICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuCi0JCQkgKgotCQkJICovCi0JCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fYWdncmVnYXRlX21lc3NhZ2U6IG1lc3NhZ2UgaXMgdW5zb2xpY2l0ZWRcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0KLQkJCXJlcSA9IG5ld19yZXF1ZXN0KHNkbV9yb3V0ZV9yZWFjaGFibGUoZW1wdHlfc2V0KSwgaWQsIFNETV9FVkVOVF9XQUlUX1RJTUUpOwotCQkJdXBkYXRlX3JlcGx5KHJlcSwgbXNnLCBhLT52YWx1ZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKGZsYWdzICYgU0RNX0FHR1JFR0FURV9ET1dOU1RSRUFNKSB7Ci0JCW5ld19yZXF1ZXN0KHNkbV9tZXNzYWdlX2dldF9kZXN0aW5hdGlvbihtc2cpLCBzZG1fbWVzc2FnZV9nZXRfaWQobXNnKSwgYS0+dmFsdWUpOwotCX0KLX0KLQotLyoKLSAqIENoZWNrIGZvciBjb21wbGV0ZWQgb3IgdGltZWQgb3V0IGNvbW1hbmRzCi0gKi8KLXZvaWQKLXNkbV9hZ2dyZWdhdGVfcHJvZ3Jlc3Modm9pZCkKLXsKLQlyZXF1ZXN0ICoJcmVxOwotCi0JLyoKLQkgKiBQcm9jZXNzIGNvbW1hbmQgcmVxdWVzdHMuIE9ubHkgcHJvY2VzcyByZXF1ZXN0cyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUKLQkgKiByZWNlaXZlZC4gVGhpcyBpcyB0byBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgcmVwbGllcy4gTm90ZTogdGhpcyBjb3VsZCBjYXVzZQotCSAqIGEgYmFja2xvZyBvZiByZXF1ZXN0cy4KLQkgKi8KLQlpZiAoKHJlcSA9IChyZXF1ZXN0ICopR2V0Rmlyc3RFbGVtZW50KGFsbF9yZXF1ZXN0cykpICE9IE5VTEwpIHsKLQkJaWYgKHNkbV9zZXRfaXNfZW1wdHkocmVxLT5vdXRzdGFuZGluZykgfHwKLQkJCQkocmVxLT50aW1lb3V0ID4gMCAmJiBjaGVja190aW1lcihyZXEpID09IFRJTUVSX0VYUElSRUQpKSB7Ci0JCQlyZXF1ZXN0X2NvbXBsZXRlZChyZXEpOwotCQkJZnJlZV9yZXF1ZXN0KHJlcSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQKLXNkbV9hZ2dyZWdhdGVfZmluYWxpemUodm9pZCkKLXsKLQkvKgotCSAqIFByb2Nlc3MgcmVtYWluaW5nIHJlcXVlc3RzLgotCSAqLwotCXdoaWxlICghRW1wdHlMaXN0KGFsbF9yZXF1ZXN0cykpIHsKLQkJaWYgKHNkbV9tZXNzYWdlX3Byb2dyZXNzKCkgPCAwKSB7Ci0JCQlicmVhazsKLQkJfQotCQlzZG1fYWdncmVnYXRlX3Byb2dyZXNzKCk7Ci0JfQotfQotCi1zZG1fYWdncmVnYXRlCi1zZG1fYWdncmVnYXRlX25ldyh2b2lkKQotewotCXNkbV9hZ2dyZWdhdGUJYSA9IChzZG1fYWdncmVnYXRlKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNkbV9hZ2dyZWdhdGUpKTsKLQotCWEtPnZhbHVlID0gMDsKLQotCXJldHVybiBhOwotfQotCi12b2lkCi1zZG1fYWdncmVnYXRlX3NldF92YWx1ZShzZG1fYWdncmVnYXRlIGEsIGludCB0eXBlLCAuLi4pCi17Ci0gICAgdmFfbGlzdAlhcDsKLQotICAgIHZhX3N0YXJ0KGFwLCB0eXBlKTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgU0RNX0FHR1JFR0FURV9USU1FT1VUOgotICAgIAlhLT52YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKLSAgICAJYnJlYWs7Ci0gICAgfQotCi0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZAotc2RtX2FnZ3JlZ2F0ZV9mcmVlKGNvbnN0IHNkbV9hZ2dyZWdhdGUgYSkKLXsKLQlmcmVlKGEpOwotfQotCi12b2lkCi1zZG1fYWdncmVnYXRlX2NvcHkoY29uc3Qgc2RtX2FnZ3JlZ2F0ZSBhMSwgY29uc3Qgc2RtX2FnZ3JlZ2F0ZSBhMikKLXsKLQlhMS0+dmFsdWUgPSBhMi0+dmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciAqCi1fYWdncmVnYXRlX3RvX3N0cihzZG1fYWdncmVnYXRlIGEpCi17Ci0Jc3RhdGljIGNoYXIgcmVzW0FHR1JFR0FURV9WQUxVRV9MRU4rMV07Ci0KLQlpbnRfdG9faGV4X3N0cihhLT52YWx1ZSwgcmVzLCBBR0dSRUdBVEVfVkFMVUVfTEVOLCBOVUxMKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IGFnZ3JlZ3JhdGlvbiByZXF1ZXN0LgotICoKLSAqIEBwYXJhbSBkZXN0IGlzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbWVzc2FnZQotICogQHBhcmFtIHRpbWVvdXQgaXMgdGhlIHRpbWUgdG8gd2FpdCBiZWZvcmUgZm9yd2FyZGluZyBhbnkgcmVwbGllcy4gMCBtZWFucyBpbmZpbml0ZS4KLSAqCi0gKiBUaGUgb3V0c3RhbmRpbmcgc2V0IGlzIGFsbCBjb250cm9sbGVycyB0aGF0IHdpbGwgcmVzcG9uZCB0byB0aGlzIHJlcXVlc3QgYW5kIG9uY2UKLSAqIHdlIGhhdmUgcmVjZWl2ZWQgcmVwbGllcyBmcm9tIGFsbCBjb250cm9sbGVycyBpbiB0aGlzIHNldCwgdGhlIHJlcXVlc3QgaXMgY29tcGxldGUuCi0gKi8KLXN0YXRpYyByZXF1ZXN0ICoKLW5ld19yZXF1ZXN0KHNkbV9pZHNldCBkZXN0LCBpbnQgaWQsIGludCB0aW1lb3V0KQotewotCXJlcXVlc3QgKglyOwotCi0JciA9IChyZXF1ZXN0ICopbWFsbG9jKHNpemVvZihyZXF1ZXN0KSk7Ci0Jci0+aWQgPSBpZDsKLQlyLT50aW1lb3V0ID0gdGltZW91dDsKLQlyLT50aW1lcl9zdGF0ZSA9IFRJTUVSX0RJU0FCTEVEOwotCXItPnJlcGx5cyA9IEhhc2hDcmVhdGUoc2RtX3JvdXRlX2dldF9zaXplKCkpOwotCXItPm91dHN0YW5kaW5nID0gc2RtX3NldF9uZXcoKTsKLQlzZG1fc2V0X3VuaW9uKHItPm91dHN0YW5kaW5nLCBzZG1fcm91dGVfcmVhY2hhYmxlKGRlc3QpKTsKLQotCUFkZFRvTGlzdChhbGxfcmVxdWVzdHMsICh2b2lkICopcik7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBDcmVhdGluZyBuZXcgcmVxdWVzdCAjJWQgZXhwZWN0ZWQgcmVwbGllcyAlc1xuIiwKLQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgci0+aWQsIF9zZXRfdG9fc3RyKHItPm91dHN0YW5kaW5nKSk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotLyoKLSAqIEZyZWUgdGhlIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1mcmVlX3JlcXVlc3QocmVxdWVzdCAqcikKLXsKLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBFbnRlciBmcmVlX3JlcXVlc3RcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0KLQlSZW1vdmVGcm9tTGlzdChhbGxfcmVxdWVzdHMsICh2b2lkICopcik7Ci0Jc2RtX3NldF9mcmVlKHItPm91dHN0YW5kaW5nKTsKLQlIYXNoRGVzdHJveShyLT5yZXBseXMsIE5VTEwpOwotCWZyZWUocik7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBMZWF2aW5nIGZyZWVfcmVxdWVzdFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQotfQotCi0vKgotICogQ2FsbGJhY2sgd2hlbiBhIHJlcXVlc3QgaXMgY29tcGxldGVkLgotICovCi1zdGF0aWMgdm9pZAotcmVxdWVzdF9jb21wbGV0ZWQocmVxdWVzdCAqcmVxKQotewotCUhhc2hFbnRyeSAqCWhlOwotCXNkbV9tZXNzYWdlIG1zZzsKLQotCWZvciAoSGFzaFNldChyZXEtPnJlcGx5cyk7IChoZSA9IEhhc2hHZXQocmVxLT5yZXBseXMpKSAhPSBOVUxMOyApIHsKLQkJbXNnID0gKHNkbV9tZXNzYWdlKWhlLT5oX2RhdGE7Ci0KLQkJaWYgKGNvbXBsZXRpb25fY2FsbGJhY2sgIT0gTlVMTCkgewotCQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gcmVxdWVzdCAlZCBjb21wbGV0ZWQgZm9yICMleFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpLAotCQkJCQlyZXEtPmlkLAotCQkJCQloZS0+aF9odmFsKTsKLQkJCWNvbXBsZXRpb25fY2FsbGJhY2sobXNnKTsKLQkJfQotCi0JCUhhc2hSZW1vdmUocmVxLT5yZXBseXMsIGhlLT5oX2h2YWwpOwotCX0KLX0KLQotLyoKLSAqIFN0YXJ0IGEgdGltZXIKLSAqLwotc3RhdGljIHZvaWQKLXN0YXJ0X3RpbWVyKHJlcXVlc3QgKnIpCi17Ci0JKHZvaWQpZ2V0dGltZW9mZGF5KCZyLT5zdGFydF90aW1lLCBOVUxMKTsKLQlyLT50aW1lcl9zdGF0ZSA9IFRJTUVSX1JVTk5JTkc7Ci19Ci0KLS8qCi0gKiBDaGVjayBpZiB0aGUgdGltZXIgaGFzIGV4cGlyZWQuCi0gKi8KLXN0YXRpYyBpbnQKLWNoZWNrX3RpbWVyKHJlcXVlc3QgKnIpCi17Ci0Jc3RydWN0IHRpbWV2YWwJdGltZTsKLQotCWlmIChyLT50aW1lcl9zdGF0ZSA9PSBUSU1FUl9SVU5OSU5HKSB7Ci0JCSh2b2lkKWdldHRpbWVvZmRheSgmdGltZSwgTlVMTCk7Ci0KLQkJaWYgKEVMQVBTRURfVElNRSh0aW1lLCByLT5zdGFydF90aW1lKSA+PSByLT50aW1lb3V0KSB7Ci0JCQlyLT50aW1lcl9zdGF0ZSA9IFRJTUVSX0VYUElSRUQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gci0+dGltZXJfc3RhdGU7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlIHRoZSB0aW1lcgotICovCi1zdGF0aWMgdm9pZAotZGlzYWJsZV90aW1lcihyZXF1ZXN0ICpyKQotewotCXItPnRpbWVyX3N0YXRlID0gVElNRVJfRElTQUJMRUQ7Ci19Ci0KLS8qCi0gKiBHaXZlbiBhIG5ldyBtZXNzYWdlLCB0cnkgdG8gYWdncmVnYXRlIGl0IHdpdGggYW55IG91dHN0YW5kaW5nIG1lc3NhZ2VzLgotICovCi1zdGF0aWMgdm9pZAotdXBkYXRlX3JlcGx5KHJlcXVlc3QgKnJlcSwgc2RtX21lc3NhZ2UgbXNnLCBpbnQgaGFzaCkKLXsKLQlzZG1fbWVzc2FnZQkJcmVwbHlfbXNnOwotCXNkbV9hZ2dyZWdhdGUJbmEgPSBzZG1fbWVzc2FnZV9nZXRfYWdncmVnYXRlKG1zZyk7Ci0KLQkvKgotCSAqIFJlbW92ZSBzb3VyY2VzIHdlIGhhdmUgcmVjZWl2ZWQgcmVwbGllcyBmcm9tOgotCSAqLwotCXNkbV9zZXRfZGlmZihyZXEtPm91dHN0YW5kaW5nLCBzZG1fbWVzc2FnZV9nZXRfc291cmNlKG1zZykpOwotCi0JREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gcmVwbHkgdXBkYXRlZDogc3JjPSVzIHJlcGxpZXMgb3V0c3RhbmRpbmc6ICVzXG4iLAotCQkJc2RtX3JvdXRlX2dldF9pZCgpLAotCQkJX3NldF90b19zdHIoc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpKSwKLQkJCV9zZXRfdG9fc3RyKHJlcS0+b3V0c3RhbmRpbmcpKTsKLQotCS8qCi0JICogU2F2ZSByZXBseSBpZiBpdCBpcyBuZXcsIG90aGVyd2lzZSBqdXN0IHVwZGF0ZSB0aGUgcmVwbHkgc2V0Ci0JICovCi0JaWYgKChyZXBseV9tc2cgPSAoc2RtX21lc3NhZ2UpSGFzaFNlYXJjaChyZXEtPnJlcGx5cywgbmEtPnZhbHVlKSkgPT0gTlVMTCkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBjcmVhdGluZyBuZXcgcmVwbHkgIyV4IGZvciByZXF1ZXN0ICVkXG4iLAotCQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgbmEtPnZhbHVlLCByZXEtPmlkKTsKLQkJSGFzaEluc2VydChyZXEtPnJlcGx5cywgbmEtPnZhbHVlLCAodm9pZCAqKW1zZyk7Ci0JfSBlbHNlIHsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gdXBkYXRpbmcgcmVwbHkgIyV4IHdpdGggc3JjICVzIGZvciByZXF1ZXN0ICVkXG4iLAotCQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwKLQkJCQluYS0+dmFsdWUsCi0JCQkJX3NldF90b19zdHIoc2RtX21lc3NhZ2VfZ2V0X3NvdXJjZShtc2cpKSwKLQkJCQlyZXEtPmlkKTsKLQkJc2RtX3NldF91bmlvbihzZG1fbWVzc2FnZV9nZXRfc291cmNlKHJlcGx5X21zZyksIHNkbV9tZXNzYWdlX2dldF9zb3VyY2UobXNnKSk7Ci0JCXNkbV9tZXNzYWdlX2ZyZWUobXNnKTsKLQl9Ci0KLQkvKgotCSAqIFN0YXJ0IHRpbWVyIGlmIG5lY2Vzc2FyeQotCSAqLwotCWlmIChyZXEtPnRpbWVvdXQgPiAwICYmIGNoZWNrX3RpbWVyKHJlcSkgIT0gVElNRVJfUlVOTklORyAmJiAhc2RtX3NldF9pc19lbXB0eShyZXEtPm91dHN0YW5kaW5nKSkgewotCQlzdGFydF90aW1lcihyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9oZWxsb19wcm90by5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdhMjdlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX2hlbGxvX3Byb3RvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiaGVsbG9wcm90by5oIgotCi0vKioKLSAqIFNlbmQgYW5kIHJlY2VpdmUgYSBtZXNzYWdlCi0gKi8KLWludAotaXNfc2VydmVyX3BlZXJfdmFsaWQoaW50IHNvY2tmZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotaW50Ci1pc19jbGllbnRfcGVlcl92YWxpZChpbnQgc29ja2ZkKQotewotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvaW1wbC9zZG1fbWVzc2FnZV9vbXBpLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9tZXNzYWdlX29tcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNzRhNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9tZXNzYWdlX29tcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIE1lc3NhZ2UgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLiBUaGlzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gKiBTRE0gbWVzc2FnZXMgdXNpbmcgTVBJLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPG1waS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgInNlcmRlcy5oIgotI2luY2x1ZGUgInNkbS5oIgotCi1zdHJ1Y3Qgc2RtX21lc3NhZ2UgewotCXVuc2lnbmVkIGludAlpZDsJCQkJLyogSUQgb2YgdGhlIG1lc3NhZ2UgKi8KLQlzZG1faWRzZXQJCWRlc3Q7IAkJCS8qIERlc3RpbmF0aW9ucyBvZiB0aGUgbWVzc2FnZSAqLwotCXNkbV9pZHNldAkJc3JjOyAJCQkvKiBTb3VyY2VzIG9mIHRoZSBtZXNzYWdlICovCi0Jc2RtX2FnZ3JlZ2F0ZQlhZ2dyZWdhdGU7CQkvKiBNZXNzYWdlIGFnZ3JlZ2F0aW9uICovCi0JY2hhciAqCQkJcGF5bG9hZDsJCS8qIFBheWxvYWQgKi8KLQlpbnQJCQkJcGF5bG9hZF9sZW47CS8qIFBheWxvYWQgbGVuZ3RoICovCi0JY2hhciAqCQkJYnVmOwkJCS8qIFJlY2VpdmUgYnVmZmVyICovCi0JaW50CQkJCWJ1Zl9sZW47CQkvKiBSZWNlaXZlIGJ1ZmZlciBsZW5ndGggKi8KLQl2b2lkIAkJCSgqc2VuZF9jb21wbGV0ZSkoc2RtX21lc3NhZ2UgbXNnKTsKLX07Ci0KLXN0YXRpYyB2b2lkICgqc2RtX3JlY3ZfY2FsbGJhY2spKGNvbnN0IHNkbV9tZXNzYWdlIG1zZykgPSBOVUxMOwotc3RhdGljIHZvaWQJKCpkZWxpdmVyX2NhbGxiYWNrKShjb25zdCBzZG1fbWVzc2FnZSBtc2cpID0gTlVMTDsKLQotc3RhdGljIHZvaWQJc2V0ZW52aXJvbihjaGFyICpzdHIsIGludCB2YWwpOwotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIHJ1bnRpbWUgYWJzdHJhY3Rpb24uIFRoZSBqb2JpZCBpcyB0aGUgam9iIElECi0gKiB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIE9wZW5NUEkgcnVudGltZSBzeXN0ZW0uIFRoaXMgaXMgdXNlZAotICogdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgd2lsbCBlbmFibGUgTVBJX0luaXQgdG8KLSAqIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uLgotICoKLSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0gKi8KLWludAotc2RtX21lc3NhZ2VfaW5pdChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCWludAkJY2g7Ci0JaW50CQlzaXplOwotCWludAkJcmFuazsKLQlpbnQJCWpvYmlkID0gLTE7Ci0KLQlmb3IgKGNoID0gMDsgY2ggPCBhcmdjOyBjaCsrKSB7Ci0JCWNoYXIgKiBhcmcgPSBhcmd2W2NoXTsKLQkJaWYgKHN0cm5jbXAoYXJnLCAiLS1qb2JpZCIsIDcpID09IDApIHsKLQkJCWpvYmlkID0gKGludClzdHJ0b2woYXJnKzgsIE5VTEwsIDEwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JTVBJX0luaXQoJmFyZ2MsIChjaGFyICoqKikmYXJndik7Ci0JTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnNpemUpOwotCU1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKLQotCXNkbV9yb3V0ZV9zZXRfc2l6ZShzaXplKTsKLQlzZG1fcm91dGVfc2V0X2lkKHJhbmspOwotCi0JU0RNX01BU1RFUiA9IHNpemUgLSAxOwotCi0jaWZkZWYgT01QSQotCWlmIChyYW5rICE9IFNETV9NQVNURVIpIHsKLQkJc2V0ZW52aXJvbigiT01QSV9NQ0FfbnNfbmRzX2pvYmlkIiwgam9iaWQpOwotCQlzZXRlbnZpcm9uKCJPTVBJX01DQV9uc19uZHNfdnBpZCIsIHJhbmspOwotCQlzZXRlbnZpcm9uKCJPTVBJX01DQV9uc19uZHNfbnVtX3Byb2NzIiwgc2l6ZS0xKTsKLQl9Ci0jZWxzZSAvKiBPTVBJICovCi0jd2FybmluZyBEZWJ1Z2dpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZQotI2VuZGlmIC8qIE9NUEkgKi8KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIEZpbmFsaXplIHRoZSBtZXNzYWdlIGFic3RyYWN0aW9uLgotICovCi12b2lkCi1zZG1fbWVzc2FnZV9maW5hbGl6ZSgpCi17Ci0JTVBJX0ZpbmFsaXplKCk7Ci19Ci0KLS8qKgotICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGRlc3RpbmF0aW9ucy4KLSAqCi0gKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotICovCi1pbnQKLXNkbV9tZXNzYWdlX3NlbmQoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKQotewotCWludAkJCWxlbjsKLQljaGFyICoJCXA7Ci0JY2hhciAqCQlidWY7Ci0Jc2RtX2lkCQlkZXN0X2lkOwotCXNkbV9pZHNldAlyb3V0ZTsKLQotCS8qCi0JICogUmVtb3ZlIG91ciBpZCBmcm9tIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbWVzc2FnZSBiZWZvcmUgZm9yd2FyZGluZy4KLQkgKi8KLQlpZiAoc2RtX3NldF9jb250YWlucyhtc2ctPmRlc3QsIHNkbV9yb3V0ZV9nZXRfaWQoKSkpIHsKLQkJc2RtX3NldF9yZW1vdmVfZWxlbWVudChtc2ctPmRlc3QsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNkbV9tZXNzYWdlX3NlbmQgcmVtb3ZpbmcgbWUgZnJvbSBkZXN0XG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgaW1tZWRpYXRlIGRlc3RpbmF0aW9ucyBmb3IgdGhlIG1lc3NhZ2UKLQkgKi8KLQlyb3V0ZSA9IHNkbV9yb3V0ZV9nZXRfcm91dGUobXNnLT5kZXN0KTsKLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNkbV9tZXNzYWdlX3NlbmQgc3JjICVzIGRlc3QgJXMgcm91dGUgJXNcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSwKLQkJX3NldF90b19zdHIobXNnLT5zcmMpLAotCQlfc2V0X3RvX3N0cihtc2ctPmRlc3QpLAotCQlfc2V0X3RvX3N0cihyb3V0ZSkpOwotCi0JaWYgKCFzZG1fc2V0X2lzX2VtcHR5KHJvdXRlKSkgewotCQkvKgotCQkgKiBDcmVhdGUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UKLQkJICovCi0KLQkJbGVuID0gSEVYX0xFTiAvKiBzaXplb2YoaWQpICovCi0JCQkrIHNkbV9hZ2dyZWdhdGVfc2VyaWFsaXplZF9sZW5ndGgobXNnLT5hZ2dyZWdhdGUpCi0JCQkrIHNkbV9zZXRfc2VyaWFsaXplZF9sZW5ndGgobXNnLT5zcmMpCi0JCQkrIHNkbV9zZXRfc2VyaWFsaXplZF9sZW5ndGgobXNnLT5kZXN0KQotCQkJKyBtc2ctPnBheWxvYWRfbGVuOwotCi0JCXAgPSBidWYgPSAoY2hhciAqKW1hbGxvYyhsZW4pOwotCi0JCS8qCi0JCSAqIE5vdGU6IGxlbiB3YXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzZXJpYWxpemVkIGJ1ZmZlciwgd2UKLQkJICogbm93IGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGxlbmd0aCBmb3IgdGhlIHNlbmQuCi0JCSAqLwotCi0JCWxlbiA9IEhFWF9MRU47Ci0JCWludF90b19oZXhfc3RyKG1zZy0+aWQsIHAsICZwKTsKLQkJbGVuICs9IHNkbV9hZ2dyZWdhdGVfc2VyaWFsaXplKG1zZy0+YWdncmVnYXRlLCBwLCAmcCk7Ci0JCWxlbiArPSBzZG1fc2V0X3NlcmlhbGl6ZShtc2ctPnNyYywgcCwgJnApOwotCQlsZW4gKz0gc2RtX3NldF9zZXJpYWxpemUobXNnLT5kZXN0LCBwLCAmcCk7Ci0JCW1lbWNweShwLCBtc2ctPnBheWxvYWQsIG1zZy0+cGF5bG9hZF9sZW4pOwotCQlsZW4gKz0gbXNnLT5wYXlsb2FkX2xlbjsKLQotCQkvKgotCQkgKiBTZW5kIHRoZSBtZXNzYWdlIHRvIGVhY2ggZGVzdGluYXRpb24uIFRoaXMgY291bGQgYmUgcmVwbGFjZWQgd2l0aCBJU2VuZCB0byBwYXJhbGxlbGl6ZSB0aGUKLQkJICogc2VuZHMsIGJ1dCBzaW5jZSB3ZSdyZSBwaGFzaW5nIG91dCBNUEkgd2UgZG9uJ3Qgd29ycnkuCi0JCSAqLwotCi0JCWZvciAoZGVzdF9pZCA9IHNkbV9zZXRfZmlyc3Qocm91dGUpOyAhc2RtX3NldF9kb25lKHJvdXRlKTsgZGVzdF9pZCA9IHNkbV9zZXRfbmV4dChyb3V0ZSkpIHsKLQkJCWludCBlcnI7Ci0KLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIFNlbmRpbmcgbGVuICVkIHRvICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIGxlbiwgZGVzdF9pZCk7Ci0KLQkJCWVyciA9IE1QSV9TZW5kKGJ1ZiwgbGVuLCBNUElfQ0hBUiwgZGVzdF9pZCwgMCwgTVBJX0NPTU1fV09STEQpOwotCQkJaWYgKGVyciAhPSBNUElfU1VDQ0VTUykgewotCQkJCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJNUElfU2VuZCBmYWlsZWQhXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBGcmVlIHJlc291cmNlcy4KLQkJICovCi0JCWZyZWUoYnVmKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmeSB0aGF0IHRoZSBzZW5kIGlzIGNvbXBsZXRlLgotCSAqLwotCWlmIChtc2ctPnNlbmRfY29tcGxldGUgIT0gTlVMTCkgewotCQltc2ctPnNlbmRfY29tcGxldGUobXNnKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBNZXNzYWdlIHByb2dyZXNzLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgYWxsb2NhdGVkIG1lc3NhZ2UgcmVzb3VyY2VzLgotICoKLSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0gKi8KLWludAotc2RtX21lc3NhZ2VfcHJvZ3Jlc3Modm9pZCkKLXsKLQlpbnQJCQkJZXJyOwotCWludAkJCQlhdmFpbDsKLQlpbnQJCQkJbjsKLQlpbnQJCQkJbGVuOwotCWNoYXIgKgkJCWJ1ZjsKLQlNUElfU3RhdHVzCQlzdGF0OwotCi0JZXJyID0gTVBJX0lwcm9iZShNUElfQU5ZX1NPVVJDRSwgMCwgTVBJX0NPTU1fV09STEQsICZhdmFpbCwgJnN0YXQpOwotCi0JaWYgKGVyciAhPSBNUElfU1VDQ0VTUykgewotCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQ0xJRU5ULCAiTVBJX0lwcm9iZSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChhdmFpbCkgewotCQlNUElfR2V0X2NvdW50KCZzdGF0LCBNUElfQ0hBUiwgJmxlbik7Ci0KLQkJYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKLQotCQlzZG1fbWVzc2FnZSBtc2cgPSBzZG1fbWVzc2FnZV9uZXcoYnVmLCBsZW4pOwotCi0JCWVyciA9IE1QSV9SZWN2KGJ1ZiwgbGVuLCBNUElfQ0hBUiwgc3RhdC5NUElfU09VUkNFLCAwLCBNUElfQ09NTV9XT1JMRCwgJnN0YXQpOwotCi0JCWlmIChlcnIgIT0gTVBJX1NVQ0NFU1MpIHsKLQkJCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJNUElfUmVjdiBmYWlsZWQhXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNkbV9tZXNzYWdlX3Byb2dyZXNzIHJlY2VpdmVkIGxlbiAlZCBmcm9tICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIGxlbiwgc3RhdC5NUElfU09VUkNFKTsKLQotCQltc2ctPmlkID0gaGV4X3N0cl90b19pbnQoYnVmLCAmYnVmKTsKLQkJbGVuIC09IEhFWF9MRU47Ci0KLQkJaWYgKChuID0gc2RtX2FnZ3JlZ2F0ZV9kZXNlcmlhbGl6ZShtc2ctPmFnZ3JlZ2F0ZSwgYnVmLCAmYnVmKSkgPCAwKSB7Ci0JCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQ0xJRU5ULCAiTVBJX1JlY3YgaW52YWxpZCBoZWFkZXJcbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWxlbiAtPSBuOwotCi0JCWlmICgobiA9IHNkbV9zZXRfZGVzZXJpYWxpemUobXNnLT5zcmMsIGJ1ZiwgJmJ1ZikpIDwgMCkgewotCQkJREVCVUdfUFJJTlRTKERFQlVHX0xFVkVMX0NMSUVOVCwgIk1QSV9SZWN2IGludmFsaWQgaGVhZGVyXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlsZW4gLT0gbjsKLQotCQlpZiAoKG4gPSBzZG1fc2V0X2Rlc2VyaWFsaXplKG1zZy0+ZGVzdCwgYnVmLCAmYnVmKSkgPCAwKSB7Ci0JCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQ0xJRU5ULCAiTVBJX1JlY3YgaW52YWxpZCBoZWFkZXJcbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWxlbiAtPSBuOwotCi0JCW1zZy0+cGF5bG9hZCA9IGJ1ZjsKLQkJbXNnLT5wYXlsb2FkX2xlbiA9IGxlbjsKLQotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fbWVzc2FnZV9wcm9ncmVzcyBhZ2c9JXMgc3JjPSVzIGRlc3Q9JXNcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSwKLQkJCQlfYWdncmVnYXRlX3RvX3N0cihtc2ctPmFnZ3JlZ2F0ZSksCi0JCQkJX3NldF90b19zdHIobXNnLT5zcmMpLAotCQkJCV9zZXRfdG9fc3RyKG1zZy0+ZGVzdCkpOwotCi0JCWlmIChzZG1fcmVjdl9jYWxsYmFjayAgIT0gTlVMTCkgewotCQkJc2RtX3JlY3ZfY2FsbGJhY2sobXNnKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkCi1zZG1fbWVzc2FnZV9zZXRfc2VuZF9jYWxsYmFjayhzZG1fbWVzc2FnZSBtc2csIHZvaWQgKCpjYWxsYmFjaykoc2RtX21lc3NhZ2UgbXNnKSkKLXsKLQltc2ctPnNlbmRfY29tcGxldGUgPSBjYWxsYmFjazsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2Vfc2V0X3JlY3ZfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKShzZG1fbWVzc2FnZSBtc2cpKQotewotCXNkbV9yZWN2X2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXNkbV9tZXNzYWdlCi1zZG1fbWVzc2FnZV9uZXcoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgaWRzID0gMDsKLQlzZG1fbWVzc2FnZQltc2cgPSAoc2RtX21lc3NhZ2UpbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2RtX21lc3NhZ2UpKTsKLQotCW1zZy0+aWQgPSBpZHMrKzsKLQltc2ctPmRlc3QgPSBzZG1fc2V0X25ldygpOwotCW1zZy0+c3JjID0gc2RtX3NldF9uZXcoKTsKLQlzZG1fc2V0X2FkZF9lbGVtZW50KG1zZy0+c3JjLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCW1zZy0+YnVmID0gYnVmOwotCW1zZy0+YnVmX2xlbiA9IGxlbjsKLQltc2ctPnBheWxvYWQgPSBtc2ctPmJ1ZjsKLQltc2ctPnBheWxvYWRfbGVuID0gbXNnLT5idWZfbGVuOwotCW1zZy0+YWdncmVnYXRlID0gc2RtX2FnZ3JlZ2F0ZV9uZXcoKTsKLQltc2ctPnNlbmRfY29tcGxldGUgPSBOVUxMOwotCi0JcmV0dXJuIG1zZzsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2VfZnJlZShzZG1fbWVzc2FnZSBtc2cpCi17Ci0JREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gRW50ZXIgc2RtX21lc3NhZ2VfZnJlZVxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQotCWZyZWUobXNnLT5idWYpOwotCXNkbV9zZXRfZnJlZShtc2ctPnNyYyk7Ci0Jc2RtX3NldF9mcmVlKG1zZy0+ZGVzdCk7Ci0Jc2RtX2FnZ3JlZ2F0ZV9mcmVlKG1zZy0+YWdncmVnYXRlKTsKLQlmcmVlKG1zZyk7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBMZWF2aW5nIHNkbV9tZXNzYWdlX2ZyZWVcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci19Ci0KLXVuc2lnbmVkIGludAotc2RtX21lc3NhZ2VfZ2V0X2lkKGNvbnN0IHNkbV9tZXNzYWdlIG1zZykKLXsKLQlyZXR1cm4gbXNnLT5pZDsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2Vfc2V0X2lkKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgdW5zaWduZWQgaW50IGlkKQotewotCW1zZy0+aWQgPSBpZDsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgY29uc3Qgc2RtX2lkc2V0IGRlc3RfaWRzKQotewotCXNkbV9zZXRfdW5pb24obXNnLT5kZXN0LCBkZXN0X2lkcyk7Ci19Ci0KLXNkbV9pZHNldAotc2RtX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uKGNvbnN0IHNkbV9tZXNzYWdlIG1zZykKLXsKLQlyZXR1cm4gbXNnLT5kZXN0OwotfQotCi12b2lkCi1zZG1fbWVzc2FnZV9zZXRfc291cmNlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgY29uc3Qgc2RtX2lkc2V0IHNvdXJjZSkKLXsKLQlzZG1fc2V0X3VuaW9uKG1zZy0+c3JjLCBzb3VyY2UpOwotfQotCi1zZG1faWRzZXQKLXNkbV9tZXNzYWdlX2dldF9zb3VyY2UoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKQotewotCXJldHVybiBtc2ctPnNyYzsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2VfZ2V0X3BheWxvYWQoY29uc3Qgc2RtX21lc3NhZ2UgbXNnLCBjaGFyICoqYnVmLCBpbnQgKmxlbikKLXsKLQkqYnVmID0gbXNnLT5wYXlsb2FkOwotCSpsZW4gPSBtc2ctPnBheWxvYWRfbGVuOwotfQotCi1zZG1fYWdncmVnYXRlCi1zZG1fbWVzc2FnZV9nZXRfYWdncmVnYXRlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZykKLXsKLQlyZXR1cm4gbXNnLT5hZ2dyZWdhdGU7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX3NldF9hZ2dyZWdhdGUoY29uc3Qgc2RtX21lc3NhZ2UgbXNnLCBjb25zdCBzZG1fYWdncmVnYXRlIGEpCi17Ci0Jc2RtX2FnZ3JlZ2F0ZV9jb3B5KG1zZy0+YWdncmVnYXRlLCBhKTsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2Vfc2V0X2RlbGl2ZXJfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKShjb25zdCBzZG1fbWVzc2FnZSBtc2cpKQotewotCWRlbGl2ZXJfY2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2VfZGVsaXZlcihjb25zdCBzZG1fbWVzc2FnZSBtc2cpCi17Ci0JaWYgKGRlbGl2ZXJfY2FsbGJhY2sgIT0gTlVMTCkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fbWVzc2FnZV9kZWxpdmVyIFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQkJZGVsaXZlcl9jYWxsYmFjayhtc2cpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXNldGVudmlyb24oY2hhciAqc3RyLCBpbnQgdmFsKQotewotCWNoYXIgKglidWY7Ci0KLQlhc3ByaW50ZigmYnVmLCAiJWQiLCB2YWwpOwotCXNldGVudihzdHIsIGJ1ZiwgMSk7Ci0JZnJlZShidWYpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvaW1wbC9zZG1fbWVzc2FnZV90Y3BpcC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvaW1wbC9zZG1fbWVzc2FnZV90Y3BpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmY3MzNjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX21lc3NhZ2VfdGNwaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIE1lc3NhZ2UgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLiBUaGlzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gKiBTRE0gbWVzc2FnZXMgdXNpbmcgVENQL0lQLgotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgInNlcmRlcy5oIgotI2luY2x1ZGUgInNkbS5oIgotI2luY2x1ZGUgImhlbGxvcHJvdG8uaCIKLQotI2RlZmluZSBNRVNTQUdFX0xFTkdUSF9TSVpFCTgKLSNkZWZpbmUgTUVTU0FHRV9JRF9TSVpFCQk4Ci0KLXN0cnVjdCBzZG1fbWVzc2FnZSB7Ci0JdW5zaWduZWQgaW50CWlkOwkJCQkvKiBJRCBvZiB0aGUgbWVzc2FnZSAqLwotCXNkbV9pZHNldAkJZGVzdDsgCQkJLyogRGVzdGluYXRpb25zIG9mIHRoZSBtZXNzYWdlICovCi0Jc2RtX2lkc2V0CQlzcmM7IAkJCS8qIFNvdXJjZXMgb2YgdGhlIG1lc3NhZ2UgKi8KLQlzZG1fYWdncmVnYXRlCWFnZ3JlZ2F0ZTsJCS8qIE1lc3NhZ2UgYWdncmVnYXRpb24gKi8KLQljaGFyICoJCQlwYXlsb2FkOwkJLyogUGF5bG9hZCAqLwotCWludAkJCQlwYXlsb2FkX2xlbjsJLyogUGF5bG9hZCBsZW5ndGggKi8KLQljaGFyICoJCQlidWY7CQkJLyogUmVjZWl2ZSBidWZmZXIgKi8KLQlpbnQJCQkJYnVmX2xlbjsJCS8qIFJlY2VpdmUgYnVmZmVyIGxlbmd0aCAqLwotCXZvaWQgCQkJKCpzZW5kX2NvbXBsZXRlKShzZG1fbWVzc2FnZSBtc2cpOwotfTsKLQotLyoqCi0gKiBCYXNlIHR5cGUgZm9yIGEgbGlua2VkIGxpc3Qgb2YgaWRzIGFuZCByZXNwZWN0aXZlCi0gKiBzb2NrZXQgZGVzY3JpcHRvcnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaWRfc29ja2RfbWFwIHsKLQlzZG1faWQgaWQ7Ci0JaW50IHNvY2tkOwotCXN0cnVjdCBpZF9zb2NrZF9tYXAgKm5leHQ7Ci19IHNkbV9pZF9zb2NrZF9tYXAsICpzZG1faWRfc29ja2RfbWFwX3A7Ci0KLXN0YXRpYyB2b2lkICgqc2RtX3JlY3ZfY2FsbGJhY2spKHNkbV9tZXNzYWdlIG1zZykgPSBOVUxMOwotc3RhdGljIHZvaWQJKCpkZWxpdmVyX2NhbGxiYWNrKShjb25zdCBzZG1fbWVzc2FnZSBtc2cpID0gTlVMTDsKLQotI2RlZmluZSBNQVhfUE9SVF9JTkNSRU1FTlQJMTAwMAkvKiBNYXggcG9ydCBpbmNyZW1lbnQgYmVmb3JlIGZhaWxpbmcgKi8KLSNkZWZpbmUgQ0hJTERfQ09OTkVDVF9UUklFUwk1CQkvKiBOdW1iZXIgb2YgdGltZXMgdG8gdHJ5IGVhY2ggcG9ydCAqLwotI2RlZmluZSBDSElMRF9DT05ORUNUX1NMRUVQCTEJCS8qIFNlY29uZHMgdG8gc2xlZXAgYmV0d2VlbiBlYWNoIGNvbm5lY3Rpb24gYXR0ZW1wdCAqLwotCi1zZG1faWRfc29ja2RfbWFwX3AgY2hpbGRyZW5fc29ja2RfbWFwLCBwYXJlbnRfc29ja2RfbWFwOyAvKiBMZWFmIGNhc2UsIGNoaWxkcmVuID0gTlVMTAotCQkJCQkJCQkJIAkJCQkJCVJvb3QgY2FzZSwgcGFyZW50ID0gTlVMTCAqLwotLyoqIEJlZ2luIG9mIGZ1bmN0aW9ucyBjcmVhdGVkIGJ5IFJpY2hhcmQgKiovCi0KLS8qKgotICogQ3JlYXRlIHRoZSBtYXBzIGFuZCBmaWxsIHdpdGggdGhlIGlkcyBvZiB0aGUgY2hpbGRyZW4gYW5kIHBhcmVudAotICovCi12b2lkCi1zZG1fY3JlYXRlX3NvY2tkX21hcCgpCi17Ci0Jc2RtX2lkc2V0IGFsbF9ub2RlczsKLQlzZG1faWRzZXQgYWRqYWNlbnRfbm9kZXM7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBpbiBzZG1fY3JlYXRlX3NvY2tkX21hcFxuIiwKLQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0KLQkvLyBTZXQgcGFyZW50IG1hcAotCWlmIChzZG1fcm91dGVfZ2V0X2lkKCkgPT0gU0RNX01BU1RFUikgewotCQlwYXJlbnRfc29ja2RfbWFwID0gTlVMTDsgLy8gUm9vdAotCX0gZWxzZSB7Ci0JCXBhcmVudF9zb2NrZF9tYXAgPSAoc2RtX2lkX3NvY2tkX21hcF9wKW1hbGxvYyhzaXplb2Yoc2RtX2lkX3NvY2tkX21hcCkpOwotCQlwYXJlbnRfc29ja2RfbWFwLT5pZCA9IHNkbV9yb3V0ZV9nZXRfcGFyZW50KCk7Ci0JfQotCi0JLy8gR2V0IGFsbCBhZGphY2VudCBub2RlcwotCWFsbF9ub2RlcyA9IHNkbV9zZXRfbmV3KCk7Ci0JYWxsX25vZGVzID0gc2RtX3NldF9hZGRfYWxsKGFsbF9ub2Rlcywgc2RtX3JvdXRlX2dldF9zaXplKCktMSk7Ci0KLQkvLyBGaWx0ZXIgdGhlIHBhcmVudCBub2RlIGFuZCBtYXN0ZXIKLQlpZiAocGFyZW50X3NvY2tkX21hcCAhPSBOVUxMKSB7Ci0JCXNkbV9zZXRfcmVtb3ZlX2VsZW1lbnQoYWxsX25vZGVzLCBwYXJlbnRfc29ja2RfbWFwLT5pZCk7Ci0JCXNkbV9zZXRfcmVtb3ZlX2VsZW1lbnQoYWxsX25vZGVzLCBTRE1fTUFTVEVSKTsKLQl9Ci0KLQlhZGphY2VudF9ub2RlcyA9IHNkbV9yb3V0ZV9nZXRfcm91dGUoYWxsX25vZGVzKTsKLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGFkamFjZW50IG5vZGVzOiAlc1xuIiwKLQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgX3NldF90b19zdHIoYWRqYWNlbnRfbm9kZXMpKTsKLQotCWNoaWxkcmVuX3NvY2tkX21hcCA9IE5VTEw7Ci0KLQlpZiAoIXNkbV9zZXRfaXNfZW1wdHkoYWRqYWNlbnRfbm9kZXMpKSB7Ci0JCS8vIFRyYXZlcnNlIGFkamFjZW50IG5vZGVzIGFkZGluZyB0aGVtIHRvIHRoZSBjaGlsZHJlbiBsaW5rZWQgbGlzdAotCQlzZG1faWQgY2hpbGQ7Ci0JCXNkbV9pZF9zb2NrZF9tYXBfcCBwOwotCi0JCWZvciAoY2hpbGQgPSBzZG1fc2V0X2ZpcnN0KGFkamFjZW50X25vZGVzKTsgIXNkbV9zZXRfZG9uZShhZGphY2VudF9ub2Rlcyk7Ci0JCSBjaGlsZCA9IHNkbV9zZXRfbmV4dChhZGphY2VudF9ub2RlcykpIHsKLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGFkZGluZyAlZCB0byBteSBtYXBcbiIsCi0JCQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgY2hpbGQpOwotCQkJcCA9IChzZG1faWRfc29ja2RfbWFwX3ApbWFsbG9jKHNpemVvZihzZG1faWRfc29ja2RfbWFwKSk7Ci0JCQlwLT5uZXh0ID0gY2hpbGRyZW5fc29ja2RfbWFwOwotCQkJcC0+aWQgPSBjaGlsZDsKLQkJCWNoaWxkcmVuX3NvY2tkX21hcCA9IHA7Ci0JCX0KLQl9Ci0Jc2RtX3NldF9mcmVlKGFsbF9ub2Rlcyk7Ci19Ci0KLS8qKgotICogQmluZHMgYW5kIGxpc3RlbiB0byBhIHBvcnQuIEFmdGVyIGFjY2VwdGluZyBjb25uZWN0aW9uLCB1cGRhdGVzIHRoZQotICoKLSAqIEByZXR1cm4gc29ja2V0IGRlc2NyaXB0b3IgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgZXJyb3IKLSAqLwotaW50Ci1zZG1fcGFyZW50X3BvcnRfYmluZChpbnQgcGFyZW50YmFzZXBvcnQpCi17Ci0JaW50IHNvY2tmZCwgcGVlcnNvY2tmZDsKLQlpbnQgcGFyZW50cG9ydCA9IHBhcmVudGJhc2Vwb3J0OwotCi0Jc3RydWN0IHNvY2thZGRyX2luIHNvY2thZGRyX2luZm87Ci0Jc3RydWN0IHNvY2thZGRyX2luIHBlZXJzb2NrYWRkcl9pbmZvOwotCXN0cnVjdCBpbl9hZGRyIGFkZHIgPSB7SU5BRERSX0FOWX07Ci0JdW5zaWduZWQgcGVlcmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQotCS8vLkNyZWF0ZSBhIHNvY2tldCBhbmQgYmluZCB0byB0aGUgcG9ydAotCXNvY2tmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBbQUNDRVBUXSBzb2NrZmQ6ICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIHNvY2tmZCk7Ci0KLQltZW1zZXQoJnNvY2thZGRyX2luZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLQlzb2NrYWRkcl9pbmZvLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCXNvY2thZGRyX2luZm8uc2luX3BvcnQgPSBodG9ucyhwYXJlbnRwb3J0KTsKLQlzb2NrYWRkcl9pbmZvLnNpbl9hZGRyID0gYWRkcjsKLQotCS8vIFRyeSB0byBiaW5kIHBvcnQgdW50aWwgTUFYX1BPUlRfSU5DUkVNRU5ULCBleGNlcHQgaWYgYmluZCBlcnJvciBpcyBub3QgRUFERFJJTlVTRQotCWZvcig7cGFyZW50cG9ydCA8IHBhcmVudGJhc2Vwb3J0ICsgTUFYX1BPUlRfSU5DUkVNRU5UOyBwYXJlbnRwb3J0KyspIHsKLQkJaWYoYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmKHNvY2thZGRyX2luZm8pLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkgPCAwKSB7Ci0JCQlpZihlcnJubyAhPSBFQUREUklOVVNFKSB7Ci0JCQkJLy8gRXJyb3IhCi0JCQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gRXJyb3IgYmluZGluZyB0byB0aGUgcG9ydCEgLSBlcnJubyAlZFxuIiwKLQkJCQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgZXJybm8pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gQm91bmQgc3VjY2Vzc2Z1bGx5Ci0JCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBwb3J0IGJvdW5kOiAlZFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBwYXJlbnRwb3J0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8vIEluY3JlbWVudCBwb3J0IG51bWJlciBhbmQgdHJ5IGFnYWluCi0JfQotCi0JaWYgKHBhcmVudHBvcnQgPCBwYXJlbnRiYXNlcG9ydCArIE1BWF9QT1JUX0lOQ1JFTUVOVCkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBib3VuZCB0byBwb3J0ICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIHBhcmVudHBvcnQpOwotCX0gZWxzZSB7Ci0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGNvdWxkIG5vdCBmaW5kIHBvcnQgdG8gYmluZCB0b1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQkJY2xvc2Uoc29ja2ZkKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmKGxpc3Rlbihzb2NrZmQsIDUpIDwgMCkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBFcnJvciBsaXN0ZW5pbmcgdG8gdGhlIHBvcnQgJWQhXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIHBhcmVudHBvcnQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLy8gV2FpdCBmb3IgYSB2YWxpZCBjbGllbnQgdG8gY29ubmVjdAotCXdoaWxlKDEpIHsKLQkJbWVtc2V0KCZwZWVyc29ja2FkZHJfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotCQlwZWVyc29ja2ZkID0gYWNjZXB0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSYocGVlcnNvY2thZGRyX2luZm8pLCAmcGVlcmFkZHJfbGVuKTsKLQotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBwZWVyc29ja2ZkOiAlZFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBwZWVyc29ja2ZkKTsKLQotCQlpZihwZWVyc29ja2ZkIDwgMCkgewotCQkJcGVycm9yKCJTdGF0dXMgb2YgYWNjZXB0aW5nIGRhdGEgZnJvbSBwYXJlbnQiKTsKLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIENvdWxkIG5vdCBhY2NlcHQgcG9ydCBjb25uZWN0aW9uIG9uIHBvcnQgJWQgLSBlcnJubyAlZCFcbiIsCi0JCQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgcGFyZW50cG9ydCwgZXJybm8pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaWYgaXQgaXMgY29ubmVjdGVkIHRvIGFub3RoZXIgc2RtIHByb2Nlc3MgYmVmb3JlIHJldHVybmluZyBzb2NrZmQKLQkJaWYoaXNfY2xpZW50X3BlZXJfdmFsaWQocGVlcnNvY2tmZCkpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWNsb3NlKHBlZXJzb2NrZmQpOwotCX0KLQotCS8vIFdlIGRvbid0IG5lZWQgdG8gd2FpdCBmb3IgY29ubmVjdGlvbnMgYW55bW9yZQotCWNsb3NlKHNvY2tmZCk7Ci0KLQlyZXR1cm4gcGVlcnNvY2tmZDsKLX0KLQotLyoqCi0gKiBDb25uZWN0IHRvIHRoZSBjaGlsZCBub2RlIHVzaW5nIGhvc3RuYW1lLiBQb3J0IGlzIHRoZSBmaXJzdCB0aGF0IGNvbm5lY3RzIGJldHdlZW4KLSAqIGNoaWxkYmFzZXBvcnQgYW5kIGNoaWxkYmFzZXBvcnQgKyBNQVhfUE9SVF9JTkNSRU1FTlQKLSAqCi0gKiBUcnkgQ0hJTERfQ09OTkVDVF9UUklFUyB0byBjb25uZWN0IHRvIGVhY2ggcG9ydCwgZGVsYXlpbmcgQ0hJTERfQ09OTkVDVF9TTEVFUCBiZXR3ZWVuIGVhY2ggYXR0ZW1wdC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsc28gY2hlY2tzIGlmIHRoZSBwcm90b2NvbCBpcyB0aGUgc2RtIG9uZS4KLSAqLwotaW50Ci1zZG1fY29ubmVjdF90b19jaGlsZChjaGFyICpob3N0bmFtZSwgaW50IGNoaWxkYmFzZXBvcnQpCi17Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzdWx0OwotCWludCBzb2NrZmQ7Ci0JaW50IGNoaWxkcG9ydDsKLQlpbnQgbnVtX3RyaWVzOwotCi0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IFBGX0lORVQ7Ci0JaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLQotCWZvcihjaGlsZHBvcnQgPSBjaGlsZGJhc2Vwb3J0O2NoaWxkcG9ydCA8IGNoaWxkYmFzZXBvcnQgKyBNQVhfUE9SVF9JTkNSRU1FTlQ7IGNoaWxkcG9ydCsrKSB7Ci0JCWNoYXIgcG9ydF9zdHJbMTBdOwotCi0JCS8vIEdldCBmaXJzdCByZXN1bHQgZnJvbSB0aGUgbGlua2VkIGxpc3QKLQkJc29ja2ZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLQkJaWYoc29ja2ZkIDwgMCkgewotCQkJcGVycm9yKCJTb2NrZXQiKTsKLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNvY2tldCBzeXNjYWxsIGVycm9yXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLy8gQ29ubmVjdCB0byB0aGUgcHJvdmlkZWQgYWRkcmVzcyAmIHBvcnQKLQkJc3ByaW50Zihwb3J0X3N0ciwgIiVkIiwgY2hpbGRwb3J0KTsKLQkJaWYoZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHBvcnRfc3RyLCAmaGludHMsICZyZXN1bHQpKSB7Ci0JCQlwZXJyb3IoImdldGFkZHJpbmZvIik7Ci0JCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBnZXRhZGRyaW5mbyBlcnJvci4gaG9zdG5hbWU6ICVzLCBwb3J0OiAlc1xuIiwKLQkJCQkJc2RtX3JvdXRlX2dldF9pZCgpLCBob3N0bmFtZSwgcG9ydF9zdHIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJZm9yIChudW1fdHJpZXMgPSAwOyBudW1fdHJpZXMgPCBDSElMRF9DT05ORUNUX1RSSUVTOyBudW1fdHJpZXMrKykgewotCQkJaWYgKGNvbm5lY3Qoc29ja2ZkLCByZXN1bHQtPmFpX2FkZHIsIHJlc3VsdC0+YWlfYWRkcmxlbikgPj0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiggKGVycm5vICE9IEVDT05OUkVGVVNFRCkgJiYgKGVycm5vICE9IEVORVRVTlJFQUNIKSAmJgotCQkJCShlcnJubyAhPSBFVElNRURPVVQpICkgewotCQkJCXBlcnJvcigiY29ubmVjdCIpOwotCQkJCWZyZWVhZGRyaW5mbyhyZXN1bHQpOwotCQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGNvbm5lY3QgZXJyb3IuIGhvc3RuYW1lOiAlcywgcG9ydDogJXNcbiIsCi0JCQkJCQlzZG1fcm91dGVfZ2V0X2lkKCksIGhvc3RuYW1lLCBwb3J0X3N0cik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlzbGVlcChDSElMRF9DT05ORUNUX1NMRUVQKTsKLQkJfQotCi0JCWlmIChudW1fdHJpZXMgPCBDSElMRF9DT05ORUNUX1RSSUVTKXsKLQkJCWZyZWVhZGRyaW5mbyhyZXN1bHQpOwotCi0JCQkvLyBDaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdG8gYW5vdGhlciBzZG0gcHJvY2VzcyBiZWZvcmUgcmV0dXJuaW5nIHNvY2tmZAotCQkJaWYgKGlzX3NlcnZlcl9wZWVyX3ZhbGlkKHNvY2tmZCkpIHsKLQkJCQlyZXR1cm4gc29ja2ZkOwotCQkJfQotCi0JCQljbG9zZShzb2NrZmQpOwotCQl9Ci0JfQotCS8vIE5vIHZhbGlkIHBlZXIgZm91bmQhCi0JREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gTm8gcG9ydCBmb3VuZCBmb3IgdGhlIHNkbSBjaGlsZC4gaG9zdG5hbWU6ICVzXG4iLAotCQkJc2RtX3JvdXRlX2dldF9pZCgpLCBob3N0bmFtZSk7Ci0JcmV0dXJuIC0xOwotfQotCi0vKioKLSAqIEluaXRpYWxpemVzIHRoZSBtZXNzYWdlIGxheWVyIHVzaW5nIHRjcC9pcCB0byB0cmFuc3BvcnQgZGF0YQotICovCi1pbnQKLXNkbV90Y3BpcF9pbml0KCkKLXsKLQlyb3V0aW5nX3RhYmxlX2VudHJ5ICoJZW50cnk7Ci0Jc2RtX2lkX3NvY2tkX21hcF9wCQltYXBwOwotCi0Jc2RtX2NyZWF0ZV9zb2NrZF9tYXAoKTsKLQotCS8vIElmIGl0IGlzbid0IHRoZSBtYXN0ZXIgbm9kZSBiaW5kIHRvIHRoZSBwb3J0IHByb3ZpZGVkCi0JaWYoc2RtX3JvdXRlX2dldF9pZCgpICE9IFNETV9NQVNURVIpIHsKLQkJaW50IHBhcmVudHNvY2tkID0gLTE7Ci0KLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gVGhpcyBub2RlIGlzIGEgc2VydmVyIVxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQotCQlmb3IgKHNkbV9yb3V0aW5nX3RhYmxlX3NldCgpOyAoZW50cnkgPSBzZG1fcm91dGluZ190YWJsZV9uZXh0KCkpICE9IE5VTEw7ICkgewotCQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gZm91bmQgZW50cnkgZm9yIG5vZGUgJWRcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSwgZW50cnktPm5vZGVJRCk7Ci0JCQlpZihlbnRyeS0+bm9kZUlEID09IHNkbV9yb3V0ZV9nZXRfaWQoKSkgewotCQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGZvdW5kIG15IGVudHJ5XG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQkJCXBhcmVudHNvY2tkID0gc2RtX3BhcmVudF9wb3J0X2JpbmQoZW50cnktPnBvcnQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYocGFyZW50c29ja2QgPCAwKSB7Ci0JCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBmYWlsZWQgdG8gYmluZCB0byBwb3J0XG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gUGFyZW50ICVkIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWRcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSwgcGFyZW50X3NvY2tkX21hcC0+aWQpOwotCi0JCS8vIFVwZGF0ZSB0aGUgcGFyZW50IHNvY2tldCBkZXNjcmlwdG9yCi0JCXBhcmVudF9zb2NrZF9tYXAtPnNvY2tkID0gcGFyZW50c29ja2Q7Ci0JfQotCi0JLy8gSWYgbm9kZSBpcyBsZWFmLCBpbml0aWFsaXphdGlvbiBpcyBkb25lCi0JaWYoY2hpbGRyZW5fc29ja2RfbWFwID09IE5VTEwpIHsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gVGhpcyBub2RlIGlzIGEgbGVhZlxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLy8gT3RoZXJ3aXNlLCBvcGVuIGNvbm5lY3Rpb25zIHRvIHRoZSBjaGlsZHJlbgotCi0JZm9yIChzZG1fcm91dGluZ190YWJsZV9zZXQoKTsgKGVudHJ5ID0gc2RtX3JvdXRpbmdfdGFibGVfbmV4dCgpKSAhPSBOVUxMOyApIHsKLQkJaW50IGNoaWxkc29ja2Q7Ci0KLQkJbWFwcCA9IGNoaWxkcmVuX3NvY2tkX21hcDsKLQkJd2hpbGUobWFwcCAhPSBOVUxMKSB7Ci0JCQlpZihtYXBwLT5pZCA9PSBlbnRyeS0+bm9kZUlEKSB7Ci0JCQkJLy8gSUQgZm91bmQhIENvbm5lY3QgdG8gdGhlIGNoaWxkcmVuIGFuZCBnZW5lcmF0ZSBhIHNvY2tldCBkZXNjcmlwdG9yCi0JCQkJY2hpbGRzb2NrZCA9IHNkbV9jb25uZWN0X3RvX2NoaWxkKGVudHJ5LT5ob3N0bmFtZSwgZW50cnktPnBvcnQpOwotCi0JCQkJaWYoY2hpbGRzb2NrZCA8IDApIHsKLQkJCQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gZmFpbGVkIHRvIGJpbmQgdG8gY29ubmVjdCB0byBjaGlsZCAlczolZFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBlbnRyeS0+aG9zdG5hbWUsIGVudHJ5LT5wb3J0KTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBDb25uZWN0aW9uIHRvIGNoaWxkICVkIHN1Y2Nlc3NmdWxcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSwgbWFwcC0+aWQpOwotCi0JCQkJLy8gU2V0IHRoZSBjaGlsZHJlbiBzb2NrZXQgZGVzY3JpcHRvcgotCQkJCW1hcHAtPnNvY2tkID0gY2hpbGRzb2NrZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1hcHAgPSBtYXBwLT5uZXh0OwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogQ2xvc2Ugc29ja2V0cyBhbmQgZnJlZSBhbGwgbWFwIHN0cnVjdHVyZXMKLSAqLwotdm9pZAotc2RtX2NsZWFuX21hcHMoKQotewotCWlmKHBhcmVudF9zb2NrZF9tYXAgIT0gTlVMTCkgewotCQljbG9zZShwYXJlbnRfc29ja2RfbWFwLT5zb2NrZCk7Ci0JCWZyZWUocGFyZW50X3NvY2tkX21hcCk7Ci0JfQotCi0Jd2hpbGUoY2hpbGRyZW5fc29ja2RfbWFwICE9IE5VTEwpIHsKLQkJc2RtX2lkX3NvY2tkX21hcF9wIHAgPSBjaGlsZHJlbl9zb2NrZF9tYXAtPm5leHQ7Ci0JCWNsb3NlKGNoaWxkcmVuX3NvY2tkX21hcC0+c29ja2QpOwotCQlmcmVlKGNoaWxkcmVuX3NvY2tkX21hcCk7Ci0JCWNoaWxkcmVuX3NvY2tkX21hcCA9IHA7Ci0JfQotfQotCi0vKioKLSAqIEdpdmVuIGEgbm9kZWlkLCByZXR1cm4gYW4gYXNzb2NpYXRlZCBzb2NrZXQgZGVzY3JpcHRvcgotICoKLSAqIEByZXR1cm4gc29ja2V0IGRlc2NyaXB0b3Igb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAqLwotaW50Ci1zZG1fZmV0Y2hfc29ja2QoaW50IG5vZGVpZCkKLXsKLQlzZG1faWRfc29ja2RfbWFwX3AgcDsKLQotCS8vIExvb2sgZm9yIG5vZGVpZCBvbiB0aGUgY2hpbGRyZW4gbGlzdCBmaXJzdAotCXAgPSBjaGlsZHJlbl9zb2NrZF9tYXA7Ci0Jd2hpbGUocCAhPSBOVUxMKSB7Ci0JCWlmKHAtPmlkID09IG5vZGVpZCkgewotCQkJcmV0dXJuIHAtPnNvY2tkOwotCQl9Ci0JCXAgPSBwLT5uZXh0OwotCX0KLQotCS8vIFRoZW4sIG11c3QgYmUgdGhlIHBhcmVudAotCXAgPSBwYXJlbnRfc29ja2RfbWFwOwotCWlmKHAtPmlkID09IG5vZGVpZCkgewotCQlyZXR1cm4gcC0+c29ja2Q7Ci0JfQotCi0JLy8gTm90IG1hcHBlZCEgUmV0dXJuIGFuIGVycm9yIGNvZGUhCi0JcmV0dXJuIC0xOwotfQotCi0vKioKLSAqIEdpdmVuIGEgc29ja2lkLCByZXR1cm4gYW4gYXNzb2NpYXRlZCBpZAotICoKLSAqIEByZXR1cm4gaWQgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAqLwotaW50Ci1zZG1fZmV0Y2hfbm9kZWlkKGludCBzb2NrZCkKLXsKLQlzZG1faWRfc29ja2RfbWFwX3AgcDsKLQotCS8vIExvb2sgZm9yIG5vZGVpZCBvbiB0aGUgY2hpbGRyZW4gbGlzdCBmaXJzdAotCXAgPSBjaGlsZHJlbl9zb2NrZF9tYXA7Ci0Jd2hpbGUocCAhPSBOVUxMKSB7Ci0JCWlmKHAtPnNvY2tkID09IHNvY2tkKSB7Ci0JCQlyZXR1cm4gcC0+aWQ7Ci0JCX0KLQkJcCA9IHAtPm5leHQ7Ci0JfQotCi0JLy8gVGhlbiwgbXVzdCBiZSB0aGUgcGFyZW50Ci0JcCA9IHBhcmVudF9zb2NrZF9tYXA7Ci0JaWYocC0+c29ja2QgPT0gc29ja2QpIHsKLQkJcmV0dXJuIHAtPmlkOwotCX0KLQotCS8vIE5vdCBtYXBwZWQhIFJldHVybiBhbiBlcnJvciBjb2RlIQotCXJldHVybiAtMTsKLX0KLQotLyoqCi0gKiBJbnNwZWN0IGFsbCBub2RlJ3Mgc29ja2V0cyBmb3IgZGF0YSwgcmV0dXJuaW5nIHRoZSBzb2NrZXQgZGVzY3JpcHRvcgotICogb2YgYSBzb2NrZXQgd2hpY2ggY29udGFpbnMgZGF0YS4KLSAqCi0gKiBAcmV0dXJuIHNvY2tldCBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLCAtMiBpZiBubyBzb2NrZXQgaGFzIGRhdGEKLSAqLwotaW50Ci1zZG1fZ2V0X2FjdGl2ZV9zb2NrX2Rlc2MoKQotewotCWZkX3NldCByZmRzZXQ7Ci0JaW50IGZkbWF4ID0gLTE7Ci0JaW50IHNlbHJ2OwotCXNkbV9pZF9zb2NrZF9tYXBfcCBwOwotCi0Jc3RydWN0IHRpbWV2YWwgdGltZSA9IHswLCAwfTsKLQotCS8vIEFkZCBhbGwgdmFsaWQgc29ja2V0cyB0byB0aGUgRkRfU0VUCi0JRkRfWkVSTygmcmZkc2V0KTsKLQlpZihwYXJlbnRfc29ja2RfbWFwICE9IE5VTEwpIHsKLQkJRkRfU0VUKHBhcmVudF9zb2NrZF9tYXAtPnNvY2tkLCAmcmZkc2V0KTsKLQkJZmRtYXggPSBwYXJlbnRfc29ja2RfbWFwLT5zb2NrZDsKLQl9Ci0JcCA9IGNoaWxkcmVuX3NvY2tkX21hcDsKLQl3aGlsZShwICE9IE5VTEwpIHsKLQkJRkRfU0VUKHAtPnNvY2tkLCAmcmZkc2V0KTsKLQotCQlpZihwLT5zb2NrZCA+IGZkbWF4KSB7Ci0JCQlmZG1heCA9IHAtPnNvY2tkOwotCQl9Ci0KLQkJcCA9IHAtPm5leHQ7Ci0JfQotCi0JaWYoZmRtYXggPCAwKSB7Ci0JCS8vIE5vIGNoaWxkcmVuIHNvY2tldCBvcGVuZWQKLQkJcmV0dXJuIC0yOwotCX0KLQotCS8vIENoZWNrIGlmIGFueSBvZiB0aGUgc29ja2V0cyBjb25uZWN0ZWQKLQkvLyBidXQgZG9uJ3QgYmxvY2sKLQlzZWxydiA9IHNlbGVjdChmZG1heCArIDEsICZyZmRzZXQsIE5VTEwsIE5VTEwsICZ0aW1lKTsKLQotCWlmKHNlbHJ2IDwgMCkgewotCQlwZXJyb3IoInNlbGVjdCBzeXNjYWxsIHN0YXR1cyIpOwotCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQ0xJRU5ULCAic2VsZWN0IHN5c2NhbGwgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYoc2VscnYgPT0gMCkgeyAvLyBObyBzb2NrZXQgaGFzIGRhdGEuIFJldHVybiBhcHByb3ByaWF0ZWQgY29kZQotLy8JCXByaW50ZigiVGhlIHNvY2tldHMgbGlzdGVuZWQgZG9udCBoYXZlIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC0yOwotCX0KLQotCS8vIHJldHVybiB0aGUgZmlyc3QgYWN0aXZlIHNvY2tldCBkZXNjcmlwdG9yCi0JcCA9IGNoaWxkcmVuX3NvY2tkX21hcDsKLQl3aGlsZShwICE9IE5VTEwpIHsKLQkJaWYoRkRfSVNTRVQocC0+c29ja2QsICZyZmRzZXQpKSB7Ci0JCQlyZXR1cm4gcC0+c29ja2Q7Ci0JCX0KLQotCQlwID0gcC0+bmV4dDsKLQl9Ci0JaWYocGFyZW50X3NvY2tkX21hcCAhPSBOVUxMKSB7Ci0JCWlmKEZEX0lTU0VUKHBhcmVudF9zb2NrZF9tYXAtPnNvY2tkLCAmcmZkc2V0KSkgewotCQkJcmV0dXJuIHBhcmVudF9zb2NrZF9tYXAtPnNvY2tkOwotCQl9Ci0JfQotCi0JLy8gU2hvdWxkIG5vdCByZWFjaCB0aGlzIHBvaW50Ci0JcmV0dXJuIC0xOwotfQotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBvZiB0aGUgbWVzc2FnZQotICogKHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBzdWJ0cmFjdGVkKQotICovCi1pbnQKLXNkbV90Y3BpcF9tc2doZWFkZXJfcmVjZWl2ZShpbnQgc29ja2ZkLCBpbnQgKmxlbmd0aCkKLXsKLQlpbnQJCW47Ci0JaW50CQlsZW47Ci0JY2hhciAqCXA7Ci0JY2hhcglsZW5ndGhfc3RyW01FU1NBR0VfTEVOR1RIX1NJWkVdOwotCi0JcCA9IGxlbmd0aF9zdHI7Ci0JbGVuID0gTUVTU0FHRV9MRU5HVEhfU0laRTsKLQotCXdoaWxlICgobiA9IHJlYWQoc29ja2ZkLCBwLCBsZW4pKSA8IGxlbikgewotCQlpZiAobiA8PSAwKSB7Ci0JCQlpZiAobiA8IDApIHsKLQkJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXBlcnJvcigiU3RhdHVzIG9uIHJlYWQgc3lzY2FsbCIpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcCArPSBuOwotCQlsZW4gLT0gbjsKLQl9Ci0KLQkqbGVuZ3RoID0gaGV4X3N0cl90b19pbnQobGVuZ3RoX3N0ciwgTUVTU0FHRV9MRU5HVEhfU0laRSwgTlVMTCkgLSBNRVNTQUdFX0xFTkdUSF9TSVpFOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotc2RtX3RjcGlwX21zZ2JvZHlfcmVjZWl2ZShpbnQgc29ja2ZkLCBjaGFyICpidWYsIGludCBsZW5ndGgpCi17Ci0JaW50IG47Ci0KLQl3aGlsZSAoKG4gPSByZWFkKHNvY2tmZCwgYnVmLCBsZW5ndGgpKSA8IGxlbmd0aCkgewotCQlpZiAobiA8PSAwKSB7Ci0JCQlpZiAobiA8IDApIHsKLQkJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXBlcnJvcigiU3RhdHVzIG9uIHJlYWQgc3lzY2FsbCIpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJ1ZiArPSBuOwotCQlsZW5ndGggLT0gbjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1zZG1fdGNwaXBfc2VuZChpbnQgc29ja2QsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKLXsKLQlpbnQgd2NvdW50OwotCi0JLy8gV3JpdGUgYWxsIG1lc3NhZ2UgdG8gdGhlIHNvY2tldAotCWRvIHsKLQkJd2NvdW50ID0gd3JpdGUoc29ja2QsICh2b2lkICopYnVmLCBsZW5ndGgpOwotCi0JCWlmICh3Y291bnQgPD0gMCkgewotCQkJaWYgKHdjb3VudCA8IDApIHsKLQkJCQlwZXJyb3IoIndyaXRlIHN5c2NhbGwgc3RhdHVzIik7Ci0JCQl9Ci0JCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQ0xJRU5ULCAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSBkYXRhIC0gd3JpdGUgc3lzY2FsbCBmYWlsZWQhXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWJ1ZiArPSB3Y291bnQ7Ci0JCWxlbmd0aCAtPSB3Y291bnQ7Ci0JfSB3aGlsZShsZW5ndGggPiAwKTsKLQotCXJldHVybiAwOwotfQotCi0vKiogRW5kIG9mIGZ1bmN0aW9ucyBjcmVhdGVkIGJ5IFJpY2hhcmQgKiovCi0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgcnVudGltZSBhYnN0cmFjdGlvbi4gVGhlIGpvYmlkIGlzIHRoZSBqb2IgSUQKLSAqIHRoYXQgd2FzIGFsbG9jYXRlZCBieSB0aGUgT3Blbk1QSSBydW50aW1lIHN5c3RlbS4gVGhpcyBpcyB1c2VkCi0gKiB0byBzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdCB3aWxsIGVuYWJsZSBNUElfSW5pdCB0bwotICogZXN0YWJsaXNoIGNvbW11bmljYXRpb24uCi0gKgotICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLSAqLwotaW50Ci1zZG1fbWVzc2FnZV9pbml0KGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JLyoKLQkgKiBJbml0aWFsaXplcyB0aGUgY29tbXVuaWNhdGlvbiBsYXllcgotCSAqLwotCWlmIChzZG1fdGNwaXBfaW5pdCgpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogRmluYWxpemUgdGhlIG1lc3NhZ2UgYWJzdHJhY3Rpb24uCi0gKi8KLXZvaWQKLXNkbV9tZXNzYWdlX2ZpbmFsaXplKCkKLXsKLQkvLyBDbGVhbiB0aGUgbWFwcwotCXNkbV9jbGVhbl9tYXBzKCk7Ci19Ci0KLQotLyoqCi0gKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgZGVzdGluYXRpb25zLgotICoKLSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0gKi8KLWludAotc2RtX21lc3NhZ2Vfc2VuZChjb25zdCBzZG1fbWVzc2FnZSBtc2cpCi17Ci0JaW50CQkJbGVuOwotCWludAkJCW1heGxlbjsgLy8gZWZmZWN0aXZlIGFuZCBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQotCQkJCQkJCSAvLyB0aGVzZSB0d28gdmFycyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSEKLQljaGFyICoJCXA7Ci0JY2hhciAqCQloZWFkZXJfYWRkcjsgLy8gUG9pbnRlciB0byB0aGUgaGVhZGVyIG9mIHRoZSBtZXNzYWdlCi0JY2hhciAqCQlidWY7Ci0Jc2RtX2lkCQlkZXN0X2lkOwotCXNkbV9pZHNldAlyb3V0ZTsKLQotCS8qCi0JICogUmVtb3ZlIG91ciBpZCBmcm9tIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbWVzc2FnZSBiZWZvcmUgZm9yd2FyZGluZy4KLQkgKi8KLQlpZiAoc2RtX3NldF9jb250YWlucyhtc2ctPmRlc3QsIHNkbV9yb3V0ZV9nZXRfaWQoKSkpIHsKLQkJc2RtX3NldF9yZW1vdmVfZWxlbWVudChtc2ctPmRlc3QsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNkbV9tZXNzYWdlX3NlbmQgcmVtb3ZpbmcgbWUgZnJvbSBkZXN0XG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgaW1tZWRpYXRlIGRlc3RpbmF0aW9ucyBmb3IgdGhlIG1lc3NhZ2UKLQkgKi8KLQlyb3V0ZSA9IHNkbV9yb3V0ZV9nZXRfcm91dGUobXNnLT5kZXN0KTsKLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNkbV9tZXNzYWdlX3NlbmQgc3JjICVzIGRlc3QgJXMgcm91dGUgJXNcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSwKLQkJX3NldF90b19zdHIobXNnLT5zcmMpLAotCQlfc2V0X3RvX3N0cihtc2ctPmRlc3QpLAotCQlfc2V0X3RvX3N0cihyb3V0ZSkpOwotCi0JaWYgKCFzZG1fc2V0X2lzX2VtcHR5KHJvdXRlKSkgewotCQkvKgotCQkgKiBDcmVhdGUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UKLQkJICogVGhpcyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGF0IHRoZSBiZWdpbm5pbmcKLQkJICovCi0KLQkJbWF4bGVuID0gTUVTU0FHRV9MRU5HVEhfU0laRQotCQkJKyBNRVNTQUdFX0lEX1NJWkUKLQkJCSsgc2RtX2FnZ3JlZ2F0ZV9zZXJpYWxpemVkX2xlbmd0aChtc2ctPmFnZ3JlZ2F0ZSkKLQkJCSsgc2RtX3NldF9zZXJpYWxpemVkX2xlbmd0aChtc2ctPnNyYykKLQkJCSsgc2RtX3NldF9zZXJpYWxpemVkX2xlbmd0aChtc2ctPmRlc3QpCi0JCQkrIG1zZy0+cGF5bG9hZF9sZW47Ci0KLQkJcCA9IGJ1ZiA9IChjaGFyICopbWFsbG9jKG1heGxlbik7Ci0KLQkJLy8gU2F2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhlYWRlcgotCQloZWFkZXJfYWRkciA9IHA7Ci0KLQkJcCArPSBNRVNTQUdFX0xFTkdUSF9TSVpFOyAvLyBQb2ludHMgdG8gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UKLQotCQkvKgotCQkgKiBOb3RlOiBtYXhsZW4gd2FzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2VyaWFsaXplZCBidWZmZXIsIHdlCi0JCSAqIG5vdyBjYWxjdWxhdGUgdGhlIGFjdHVhbCBsZW5ndGggZm9yIHRoZSBzZW5kLgotCQkgKi8KLQkJbGVuID0gTUVTU0FHRV9MRU5HVEhfU0laRTsKLQkJbGVuICs9IE1FU1NBR0VfSURfU0laRTsKLQkJaW50X3RvX2hleF9zdHIobXNnLT5pZCwgcCwgTUVTU0FHRV9JRF9TSVpFLCAmcCk7Ci0JCWxlbiArPSBzZG1fYWdncmVnYXRlX3NlcmlhbGl6ZShtc2ctPmFnZ3JlZ2F0ZSwgcCwgJnApOwotCQlsZW4gKz0gc2RtX3NldF9zZXJpYWxpemUobXNnLT5zcmMsIHAsICZwKTsKLQkJbGVuICs9IHNkbV9zZXRfc2VyaWFsaXplKG1zZy0+ZGVzdCwgcCwgJnApOwotCQltZW1jcHkocCwgbXNnLT5wYXlsb2FkLCBtc2ctPnBheWxvYWRfbGVuKTsKLQkJbGVuICs9IG1zZy0+cGF5bG9hZF9sZW47Ci0KLQkJLy8gQ29waWVzIHRoZSBhY3R1YWwgbGVuZ3RoIHRvIHRoZSBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UKLQkJaW50X3RvX2hleF9zdHIobGVuLCBoZWFkZXJfYWRkciwgTUVTU0FHRV9MRU5HVEhfU0laRSwgTlVMTCk7Ci0KLQkJLyoKLQkJICogU2VuZCB0aGUgbWVzc2FnZSB0byBlYWNoIGRlc3RpbmF0aW9uLCBjb252ZXJ0aW5nIHRoZQotCQkgKiBub2RlIElEIHRvIGEgcHJvcGVyIGFkZHJlc3MgYmVmb3JlIHRoZSB0cmFuc21pc3Npb24KLQkJICovCi0KLQkJZm9yIChkZXN0X2lkID0gc2RtX3NldF9maXJzdChyb3V0ZSk7ICFzZG1fc2V0X2RvbmUocm91dGUpOyBkZXN0X2lkID0gc2RtX3NldF9uZXh0KHJvdXRlKSkgewotCQkJaW50IHNvY2tkOwotCi0JCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBTZW5kaW5nIGxlbiAlZCB0byAlZFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBsZW4sIGRlc3RfaWQpOwotCi0JCQkvLyBHZXQgc29ja2V0IGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSB3aGVyZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQKLQkJCXNvY2tkID0gc2RtX2ZldGNoX3NvY2tkKGRlc3RfaWQpOwotCQkJaWYgKHNvY2tkIDwgMCkgewotCQkJCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJTb2NrZXQgZGVzY3JpcHRvciBub3QgZm91bmQhXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCS8vIFdyaXRlIGFsbCBtZXNzYWdlIHRvIHRoZSBzb2NrZXQKLQkJCWlmIChzZG1fdGNwaXBfc2VuZChzb2NrZCwgYnVmLCBsZW4pIDwgMCkgewotCQkJCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJFcnJvciBzZW5kaW5nIG1lc3NhZ2UhXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBGcmVlIHJlc291cmNlcy4KLQkJICovCi0JCWZyZWUoYnVmKTsKLQl9Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBBYm91dCB0byBjYWxsIHNlbmRfY29tcGxldGVcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0KLQkvKgotCSAqIE5vdGlmeSB0aGF0IHRoZSBzZW5kIGlzIGNvbXBsZXRlLgotCSAqLwotCWlmIChtc2ctPnNlbmRfY29tcGxldGUgIT0gTlVMTCkgewotCQltc2ctPnNlbmRfY29tcGxldGUobXNnKTsKLQl9Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBMZWF2aW5nIHNkbV9tZXNzYWdlX3NlbmRcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBSZXR1cm4gb25lIHNvY2tldCBkZXNjcmlwdGlvbiByZWxhdGVkIHRvIGEgc29ja2V0IHRoYXQgaXMKLSAqIHJlYWR5IHRvIHJlYWQuCi0gKgotICogQHJldHVybiB0aGUgc29ja2V0IGRlc2NyaXB0b3IsIC0yIGlmIG5vIHNvY2tldCBhdmFpbGFibGUgZm9yIHJlYWRpbmcsIC0xIG9uIGZhaWx1cmUKLSAqCi0gKiBHZXQgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaW4gYnl0ZXMKLSAqIEByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBzb2NrZXQgY2xvc2VkIG9yIGVycm9yCi0gKgotICogR2V0IGEgbWVzc2FnZSBmcm9tIGEgc29ja2V0LiBTaW5jZSBtZXNzYWdlIGxlbmd0aCBjb21lcwotICogYmVmb3JlIHRoZSBtZXNzYWdlLCB0aGUgc2RtX2dldF9jb3VudCBmdW5jdGlvbiBtdXN0Ci0gKiBiZSBleGVjdXRlZCBmaXJzdAotICoKLSAqIEByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBlcnJvcgotICoKLSAqIE1lc3NhZ2UgcHJvZ3Jlc3MuIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBhbGxvY2F0ZWQgbWVzc2FnZSByZXNvdXJjZXMuCi0gKgotICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLSAqLwotaW50Ci1zZG1fbWVzc2FnZV9wcm9ncmVzcyh2b2lkKQotewotCWludAkJbjsKLQlpbnQJCWVycjsKLQlpbnQJCWxlbjsKLQljaGFyICoJYnVmOwotCi0JLy8gUmV0cmlldmUgdGhlIGFjdGl2ZSBzb2NrZXQgZGVzY3JpcHRvcgotCWludCBzb2NrZmQgPSBzZG1fZ2V0X2FjdGl2ZV9zb2NrX2Rlc2MoKTsKLQotCWlmKHNvY2tmZCA9PSAtMSkgewotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBFcnJvciByZXRyaWV2aW5nIHNvY2tldCBkZXNjcmlwdG9yXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHNvY2tmZCA+PSAwKSB7Ci0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHJlY2VpdmluZyBoZWFkZXJcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0KLQkJZXJyID0gc2RtX3RjcGlwX21zZ2hlYWRlcl9yZWNlaXZlKHNvY2tmZCwgJmxlbik7Ci0KLQkJaWYoZXJyICE9IDApIHsKLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIEVycm9yIHJldHJpZXZpbmcgbWVzc2FnZSBzaXplIVxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWJ1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7Ci0KLQkJc2RtX21lc3NhZ2UgbXNnID0gc2RtX21lc3NhZ2VfbmV3KGJ1ZiwgbGVuKTsKLQotCQlpZihzZG1fdGNwaXBfbXNnYm9keV9yZWNlaXZlKHNvY2tmZCwgYnVmLCBsZW4pIDwgMCkgewotCQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gRXJyb3IgcmV0cmlldmluZyBtZXNzYWdlIVxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIHNkbV9tZXNzYWdlX3Byb2dyZXNzIHJlY2VpdmVkIGxlbiAlZCBmcm9tICVkXG4iLAotCQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwgbGVuLCBzZG1fZmV0Y2hfbm9kZWlkKHNvY2tmZCkpOwotCi0JCW1zZy0+aWQgPSBoZXhfc3RyX3RvX2ludChidWYsIE1FU1NBR0VfSURfU0laRSwgJmJ1Zik7Ci0JCWxlbiAtPSBNRVNTQUdFX0lEX1NJWkU7Ci0KLQkJaWYgKChuID0gc2RtX2FnZ3JlZ2F0ZV9kZXNlcmlhbGl6ZShtc2ctPmFnZ3JlZ2F0ZSwgYnVmLCAmYnVmKSkgPCAwKSB7Ci0JCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBpbnZhbGlkIGhlYWRlclxuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlsZW4gLT0gbjsKLQotCQlpZiAoKG4gPSBzZG1fc2V0X2Rlc2VyaWFsaXplKG1zZy0+c3JjLCBidWYsICZidWYpKSA8IDApIHsKLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGludmFsaWQgaGVhZGVyXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWxlbiAtPSBuOwotCi0JCWlmICgobiA9IHNkbV9zZXRfZGVzZXJpYWxpemUobXNnLT5kZXN0LCBidWYsICZidWYpKSA8IDApIHsKLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGludmFsaWQgaGVhZGVyXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWxlbiAtPSBuOwotCi0JCW1zZy0+cGF5bG9hZCA9IGJ1ZjsKLQkJbXNnLT5wYXlsb2FkX2xlbiA9IGxlbjsKLQotCQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fbWVzc2FnZV9wcm9ncmVzcyBhZ2c9JXMgc3JjPSVzIGRlc3Q9JXNcbiIsCi0JCQkJc2RtX3JvdXRlX2dldF9pZCgpLAotCQkJCV9hZ2dyZWdhdGVfdG9fc3RyKG1zZy0+YWdncmVnYXRlKSwKLQkJCQlfc2V0X3RvX3N0cihtc2ctPnNyYyksCi0JCQkJX3NldF90b19zdHIobXNnLT5kZXN0KSk7Ci0KLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gQWJvdXQgdG8gY2FsbCByZWN2X2NhbGxiYWNrXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCi0JCWlmIChzZG1fcmVjdl9jYWxsYmFjayAgIT0gTlVMTCkgewotCQkJc2RtX3JlY3ZfY2FsbGJhY2sobXNnKTsKLQkJfQotCi0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIEZpbmlzaGVkIHJlY3ZfY2FsbGJhY2tcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX3NldF9zZW5kX2NhbGxiYWNrKHNkbV9tZXNzYWdlIG1zZywgdm9pZCAoKmNhbGxiYWNrKShzZG1fbWVzc2FnZSBtc2cpKQotewotCW1zZy0+c2VuZF9jb21wbGV0ZSA9IGNhbGxiYWNrOwotfQotCi12b2lkCi1zZG1fbWVzc2FnZV9zZXRfcmVjdl9jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHNkbV9tZXNzYWdlIG1zZykpCi17Ci0Jc2RtX3JlY3ZfY2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotc2RtX21lc3NhZ2UKLXNkbV9tZXNzYWdlX25ldyhjaGFyICpidWYsIGludCBsZW4pCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBpZHMgPSAwOwotCXNkbV9tZXNzYWdlCW1zZyA9IChzZG1fbWVzc2FnZSltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZG1fbWVzc2FnZSkpOwotCi0JbXNnLT5pZCA9IGlkcysrOwotCW1zZy0+ZGVzdCA9IHNkbV9zZXRfbmV3KCk7Ci0JbXNnLT5zcmMgPSBzZG1fc2V0X25ldygpOwotCXNkbV9zZXRfYWRkX2VsZW1lbnQobXNnLT5zcmMsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JbXNnLT5idWYgPSBidWY7Ci0JbXNnLT5idWZfbGVuID0gbGVuOwotCW1zZy0+cGF5bG9hZCA9IG1zZy0+YnVmOwotCW1zZy0+cGF5bG9hZF9sZW4gPSBtc2ctPmJ1Zl9sZW47Ci0JbXNnLT5hZ2dyZWdhdGUgPSBzZG1fYWdncmVnYXRlX25ldygpOwotCW1zZy0+c2VuZF9jb21wbGV0ZSA9IE5VTEw7Ci0KLQlyZXR1cm4gbXNnOwotfQotCi12b2lkCi1zZG1fbWVzc2FnZV9mcmVlKHNkbV9tZXNzYWdlIG1zZykKLXsKLQlmcmVlKG1zZy0+YnVmKTsKLQlzZG1fc2V0X2ZyZWUobXNnLT5zcmMpOwotCXNkbV9zZXRfZnJlZShtc2ctPmRlc3QpOwotCXNkbV9hZ2dyZWdhdGVfZnJlZShtc2ctPmFnZ3JlZ2F0ZSk7Ci0JZnJlZShtc2cpOwotfQotCi11bnNpZ25lZCBpbnQKLXNkbV9tZXNzYWdlX2dldF9pZChjb25zdCBzZG1fbWVzc2FnZSBtc2cpCi17Ci0JcmV0dXJuIG1zZy0+aWQ7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX3NldF9pZChjb25zdCBzZG1fbWVzc2FnZSBtc2csIHVuc2lnbmVkIGludCBpZCkKLXsKLQltc2ctPmlkID0gaWQ7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX3NldF9kZXN0aW5hdGlvbihjb25zdCBzZG1fbWVzc2FnZSBtc2csIGNvbnN0IHNkbV9pZHNldCBkZXN0X2lkcykKLXsKLQlzZG1fc2V0X3VuaW9uKG1zZy0+ZGVzdCwgZGVzdF9pZHMpOwotfQotCi1zZG1faWRzZXQKLXNkbV9tZXNzYWdlX2dldF9kZXN0aW5hdGlvbihjb25zdCBzZG1fbWVzc2FnZSBtc2cpCi17Ci0JcmV0dXJuIG1zZy0+ZGVzdDsKLX0KLQotdm9pZAotc2RtX21lc3NhZ2Vfc2V0X3NvdXJjZShjb25zdCBzZG1fbWVzc2FnZSBtc2csIGNvbnN0IHNkbV9pZHNldCBzb3VyY2UpCi17Ci0Jc2RtX3NldF91bmlvbihtc2ctPnNyYywgc291cmNlKTsKLX0KLQotc2RtX2lkc2V0Ci1zZG1fbWVzc2FnZV9nZXRfc291cmNlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZykKLXsKLQlyZXR1cm4gbXNnLT5zcmM7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX2dldF9wYXlsb2FkKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgY2hhciAqKmJ1ZiwgaW50ICpsZW4pCi17Ci0JKmJ1ZiA9IG1zZy0+cGF5bG9hZDsKLQkqbGVuID0gbXNnLT5wYXlsb2FkX2xlbjsKLX0KLQotc2RtX2FnZ3JlZ2F0ZQotc2RtX21lc3NhZ2VfZ2V0X2FnZ3JlZ2F0ZShjb25zdCBzZG1fbWVzc2FnZSBtc2cpCi17Ci0JcmV0dXJuIG1zZy0+YWdncmVnYXRlOwotfQotCi12b2lkCi1zZG1fbWVzc2FnZV9zZXRfYWdncmVnYXRlKGNvbnN0IHNkbV9tZXNzYWdlIG1zZywgY29uc3Qgc2RtX2FnZ3JlZ2F0ZSBhKQotewotCXNkbV9hZ2dyZWdhdGVfY29weShtc2ctPmFnZ3JlZ2F0ZSwgYSk7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX3NldF9kZWxpdmVyX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKSkKLXsKLQlkZWxpdmVyX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQKLXNkbV9tZXNzYWdlX2RlbGl2ZXIoY29uc3Qgc2RtX21lc3NhZ2UgbXNnKQotewotCWlmIChkZWxpdmVyX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gc2RtX21lc3NhZ2VfZGVsaXZlciBcbiIsIHNkbV9yb3V0ZV9nZXRfaWQoKSk7Ci0JCWRlbGl2ZXJfY2FsbGJhY2sobXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9yb3V0ZV90cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGIzZWEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvaW1wbC9zZG1fcm91dGVfdHJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogUm91dGluZyBsYXllciBpbXBsZW1lbnRhdGlvbi4gVGhlc2Ugcm91dGluZXMgaW1wbGVtZW50IGEgdHJlZS1iYXNlZCByb3V0ZXIuIFRoZSB0cmVlIGNhbgotICogYmUgZWl0aGVyIGJpbm9taWFsIG9yIGJhbGFuY2VkLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgInNkbS5oIgotCi0jZGVmaW5lIFJPVVRFX0JJTk9NSUFMCTAKLSNkZWZpbmUgUk9VVEVfQkFMQU5DRUQJMQotCi1zdGF0aWMgaW50CQkJc2l6ZTsJCQkJLyogbnVtYmVyIG9mIHNlcnZlcnMgKi8KLXN0YXRpYyBzZG1faWQJCW15X2lkOwkJCQkvKiBvdXIgSUQgKi8KLXN0YXRpYyBzZG1faWQJCXBhcmVudDsJCQkJLyogSUQgb2Ygb3VyIHBhcmVudCAqLwotc3RhdGljIEhhc2ggKgkJY2hpbGRfZGVzY2VuZGFudHM7CS8qIGhhc2ggY29udGFpbmluZyBhbGwgZGVzY2VuZGFudHMgb2YgZWFjaCBvZiBvdXIgY2hpbGRyZW4gKi8KLXN0YXRpYyBzZG1faWRzZXQJY2hpbGRyZW47CQkJLyogY29udGFpbnMgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiAqLwotc3RhdGljIHNkbV9pZHNldAlkZXNjZW5kYW50czsJCS8qIGNvbnRhaW5zIGFsbCBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiAqLwotc3RhdGljIHNkbV9pZHNldAlyb3V0ZTsJCQkJLyogbGFzdCBjb21wdXRlZCByb3V0ZSAqLwotc3RhdGljIHNkbV9pZHNldAlyZWFjaGFibGU7CQkJLyogbGFzdCBzZXQgb2YgcmVhY2hhYmxlIHNlcnZlcnMgKi8KLQotaW50IFNETV9NQVNURVI7Ci0KLWV4dGVybiBjaGFyICoJX3NldF90b19zdHIoc2RtX2lkc2V0KTsKLQotc3RhdGljIGludAloaWdoX2JpdChpbnQgdmFsdWUpOwotc3RhdGljIHZvaWQJZmluZF9kZXNjZW5kZW50cyhzZG1faWRzZXQgc2V0LCBpbnQgaWRfcCwgaW50IHJvb3QsIGludCBzaXplLCBpbnQgcDIsIGludCBkZXNjZW5kKTsKLQotI2RlZmluZSBOT1JNQUxJWkUodGhpcywgc2l6ZSwgcm9vdCkgKHRoaXMgKyBzaXplIC0gcm9vdCkgJSBzaXplCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSByb3V0aW5nIGxheWVyLgotICovCi1pbnQKLXNkbV9yb3V0ZV9pbml0KGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLQlpbnQJCXAyOwotCWludAkgCXRoaXNfcDsKLQlpbnQJCWhpZ2g7Ci0JaW50IAlzaXplOwotCWludAkJdGhpczsKLQlpbnQJCXJvb3Q7Ci0Jc2RtX2lkCWNoaWxkOwotCi0JY2hpbGRyZW4gPSBzZG1fc2V0X25ldygpOwotCWRlc2NlbmRhbnRzID0gc2RtX3NldF9uZXcoKTsKLQlyb3V0ZSA9IHNkbV9zZXRfbmV3KCk7Ci0JcmVhY2hhYmxlID0gc2RtX3NldF9uZXcoKTsKLQotCXNpemUgPSBzZG1fcm91dGVfZ2V0X3NpemUoKTsKLQl0aGlzID0gc2RtX3JvdXRlX2dldF9pZCgpOwotCXJvb3QgPSBTRE1fTUFTVEVSOwotCXAyID0gaGlnaF9iaXQoc2l6ZSkgPDwgMTsKLQl0aGlzX3AgPSBOT1JNQUxJWkUodGhpcywgc2l6ZSwgcm9vdCk7Ci0JaGlnaCA9IGhpZ2hfYml0KHRoaXNfcCk7Ci0KLQlpZiAodGhpcyAhPSByb290KQotICAgICAgICBwYXJlbnQgPSAoKHRoaXNfcCAmIH4oMSA8PCBoaWdoKSkgKyByb290KSAlIHNpemU7Ci0gICAgZWxzZQotICAgIAlwYXJlbnQgPSBTRE1fTUFTVEVSOwotCi0gICAgZmluZF9kZXNjZW5kZW50cyhjaGlsZHJlbiwgdGhpc19wLCByb290LCBzaXplLCBwMiwgMCk7Ci0gICAgZmluZF9kZXNjZW5kZW50cyhkZXNjZW5kYW50cywgdGhpc19wLCByb290LCBzaXplLCBwMiwgMSk7Ci0KLSAgICBjaGlsZF9kZXNjZW5kYW50cyA9IEhhc2hDcmVhdGUoc2RtX3NldF9zaXplKGNoaWxkcmVuKSsxKTsKLQotCWZvciAoY2hpbGQgPSBzZG1fc2V0X2ZpcnN0KGNoaWxkcmVuKTsgIXNkbV9zZXRfZG9uZShjaGlsZHJlbik7IGNoaWxkID0gc2RtX3NldF9uZXh0KGNoaWxkcmVuKSkgewotCQlzZG1faWRzZXQgZGVzYyA9IHNkbV9zZXRfbmV3KCk7Ci0JCWZpbmRfZGVzY2VuZGVudHMoZGVzYywgTk9STUFMSVpFKGNoaWxkLCBzaXplLCByb290KSwgcm9vdCwgc2l6ZSwgcDIsIDEpOwotCQlIYXNoSW5zZXJ0KGNoaWxkX2Rlc2NlbmRhbnRzLCBjaGlsZCwgKHZvaWQgKilkZXNjKTsKLQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gcm91dGUgZm9yICVkIGlzICVzIFxuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBjaGlsZCwgX3NldF90b19zdHIoZGVzYykpOwotCX0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2ZyZWUodm9pZCAqdmFsKQotewotCXNkbV9zZXRfZnJlZSgoc2RtX2lkc2V0KXZhbCk7Ci19Ci0KLXZvaWQKLXNkbV9yb3V0ZV9maW5hbGl6ZSh2b2lkKQotewotCXNkbV9zZXRfZnJlZShjaGlsZHJlbik7Ci0Jc2RtX3NldF9mcmVlKGRlc2NlbmRhbnRzKTsKLQlzZG1fc2V0X2ZyZWUocm91dGUpOwotCXNkbV9zZXRfZnJlZShyZWFjaGFibGUpOwotCUhhc2hEZXN0cm95KGNoaWxkX2Rlc2NlbmRhbnRzLCBzZXRfZnJlZSk7Ci19Ci0KLS8qCi0gKiBHaXZlbiBhIGRlc3RpbmF0aW9uIHNldCwgY29tcHV0ZSB0aGUgcm91dGUgZm9yIHRoZSBtZXNzYWdlLgotICovCi1zZG1faWRzZXQKLXNkbV9yb3V0ZV9nZXRfcm91dGUoY29uc3Qgc2RtX2lkc2V0IGRlc3QpCi17Ci0Jc2RtX2lkIGNoaWxkOwotCi0Jc2RtX3NldF9jbGVhcihyb3V0ZSk7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzZG1fcm91dGVfZ2V0X3JvdXRlIGRlc3QgJXMsIHBhcmVudCAlZFxuIiwKLQkJCXNkbV9yb3V0ZV9nZXRfaWQoKSwKLQkJCV9zZXRfdG9fc3RyKGRlc3QpLAotCQkJcGFyZW50KTsKLQotCWlmIChteV9pZCAhPSBTRE1fTUFTVEVSICYmCi0JCQkoc2RtX3NldF9jb250YWlucyhkZXN0LCBwYXJlbnQpIHx8Ci0JCQkJCXNkbV9zZXRfY29udGFpbnMoZGVzdCwgU0RNX01BU1RFUikpKSB7Ci0JCXNkbV9zZXRfYWRkX2VsZW1lbnQocm91dGUsIHBhcmVudCk7Ci0JCXJldHVybiByb3V0ZTsKLQl9Ci0KLQlmb3IgKGNoaWxkID0gc2RtX3NldF9maXJzdChjaGlsZHJlbik7ICFzZG1fc2V0X2RvbmUoY2hpbGRyZW4pOyBjaGlsZCA9IHNkbV9zZXRfbmV4dChjaGlsZHJlbikpIHsKLQkJc2RtX2lkc2V0IGRlc2MgPSAoc2RtX2lkc2V0KUhhc2hTZWFyY2goY2hpbGRfZGVzY2VuZGFudHMsIGNoaWxkKTsKLQkJaWYgKHNkbV9zZXRfY29udGFpbnMoZGVzdCwgY2hpbGQpIHx8IHNkbV9zZXRfY29tcGFyZShkZXN0LCBkZXNjKSkgewotCQkJc2RtX3NldF9hZGRfZWxlbWVudChyb3V0ZSwgY2hpbGQpOwotCQl9Ci0JfQotCXJldHVybiByb3V0ZTsKLX0KLQotLyoKLSAqIEdpdmVuIGEgZGVzdGluYXRpb24gc2V0LCBjb21wdXRlIHRoZSBzZXQgb2YgYWxsIGRlc3RpbmF0aW9ucwotICogcmVhY2hhYmxlIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBlbXB0eSwKLSAqIHRoZSByZXN1bHQgaXMgYWxsIHBvc3NpYmxlIGRlc3RpbmF0aW9ucy4KLSAqLwotc2RtX2lkc2V0Ci1zZG1fcm91dGVfcmVhY2hhYmxlKGNvbnN0IHNkbV9pZHNldCBkZXN0KQotewotCXNkbV9zZXRfY2xlYXIocmVhY2hhYmxlKTsKLQlzZG1fc2V0X3VuaW9uKHJlYWNoYWJsZSwgZGVzY2VuZGFudHMpOwotCWlmIChteV9pZCAhPSBTRE1fTUFTVEVSKSB7Ci0JCXNkbV9zZXRfYWRkX2VsZW1lbnQocmVhY2hhYmxlLCBteV9pZCk7Ci0JfQotCXNkbV9zZXRfaW50ZXJzZWN0KHJlYWNoYWJsZSwgZGVzdCk7Ci0JcmV0dXJuIHJlYWNoYWJsZTsKLX0KLQotc2RtX2lkCi1zZG1fcm91dGVfZ2V0X2lkKHZvaWQpCi17Ci0JcmV0dXJuIG15X2lkOwotfQotCi12b2lkCi1zZG1fcm91dGVfc2V0X2lkKHNkbV9pZCBpZCkKLXsKLQlteV9pZCA9IGlkOwotfQotCi1zZG1faWQKLXNkbV9yb3V0ZV9nZXRfcGFyZW50KHZvaWQpCi17Ci0JcmV0dXJuIHBhcmVudDsKLX0KLQotaW50Ci1zZG1fcm91dGVfZ2V0X3NpemUodm9pZCkKLXsKLQlyZXR1cm4gc2l6ZTsKLX0KLQotdm9pZAotc2RtX3JvdXRlX3NldF9zaXplKGludCBzKQotewotCXNpemUgPSBzOwotfQotCi0vKgotICogQ3JlYXRlIGEgc2V0IGNvbnRhaW5pbmcgb3VyIGRlc2NlbmRhbnRzLiBJZiBkZXNjZW5kIGlzIDAsIG9ubHkgZmluZCBpbW1lZGlhdGUKLSAqIGNoaWxkcmVuLiBBc3N1bWVzIHRoYXQgdGhlIHNpemUgb2YgdGhlIHNldCB3aWxsIGZpdCBpbnRvIGFuIGludGVnZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1maW5kX2Rlc2NlbmRlbnRzKHNkbV9pZHNldCBzZXQsIGludCBpZF9wLCBpbnQgcm9vdCwgaW50IHNpemUsIGludCBwMiwgaW50IGRlc2NlbmQpCi17Ci0JaW50CQkJCWk7Ci0JaW50IAkJCWhpZ2g7Ci0JaW50IAkJCWNoaWxkOwotCWludCAJCQljaGlsZF9wOwotCXVuc2lnbmVkIGludAltYXNrOwotCi0JaGlnaCA9IGhpZ2hfYml0KGlkX3ApOwotCi0JZm9yIChpID0gaGlnaCArIDEsIG1hc2sgPSAxIDw8IGk7IGkgPD0gcDI7ICsraSwgbWFzayA8PD0gMSkgewotICAgICAgICBjaGlsZF9wID0gaWRfcCB8IG1hc2s7Ci0gICAgICAgIGlmIChjaGlsZF9wIDwgc2l6ZSkgewotICAgICAgICAgICAgY2hpbGQgPSAoY2hpbGRfcCArIHJvb3QpICUgc2l6ZTsKLSAgICAgICAgICAgIHNkbV9zZXRfYWRkX2VsZW1lbnQoc2V0LCBjaGlsZCk7Ci0gICAgICAgICAgICBpZiAoZGVzY2VuZCkgewotICAgICAgICAgICAgCWZpbmRfZGVzY2VuZGVudHMoc2V0LCBjaGlsZF9wLCByb290LCBzaXplLCBwMiwgZGVzY2VuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBGaW5kIE1TQiBvZiB2YWx1ZS4KLSAqLwotc3RhdGljIGludAotaGlnaF9iaXQoaW50IHZhbHVlKQotewotCWludCAJCQlwb3MgPSAoc2l6ZW9mKGludCkgPDwgMykgLSAxOwotCXVuc2lnbmVkIGludAltYXNrOwotCi0JbWFzayA9IDEgPDwgcG9zOwotCi0JZm9yICg7IHBvcyA+PSAwOyBwb3MtLSkgewotCQlpZiAodmFsdWUgJiBtYXNrKSB7Ci0JCQlicmVhazsKLQkJfQotCQltYXNrID4+PSAxOwotCX0KLQotCXJldHVybiBwb3M7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9pbXBsL3NkbV9yb3V0aW5nX3RhYmxlX2ZpbGUuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQwZmNkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX3JvdXRpbmdfdGFibGVfZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAic2RtLmgiCi0KLXN0YXRpYyBjaGFyICogTVBJUmFua1ZhcnNbXSA9IHsKLQkiT01QSV9NQ0Ffb3J0ZV9lc3NfdnBpZCIsIAkJLyogT3BlbiBNUEkgMS4zICovCi0JIk9NUElfTUNBX25zX25kc192cGlkIiwgCQkvKiBPcGVuIE1QSSAxLjIgKi8KLQkiUE1JX1JBTksiLCAJCQkJCS8qIE1QSUNIMiAqLwotCSJNUF9DSElMRCIsCQkJCQkJLyogSUJNIFBFICovCi0JTlVMTAotfTsKLQotI2RlZmluZSBCVUZGRVJfU0laRQkJCQkyNTUKLSNkZWZpbmUgUk9VVElOR19UQUJMRV9USU1FT1VUCTEwMDAgLyogbnVtYmVyIG9mIHRyaWVzICovCi0jZGVmaW5lIFJPVVRJTkdfVEFCTEVfV0FJVAkJMTAwMCoxMDAwIC8qIHVzZWMgKi8KLQotc3RhdGljIGludCB3YWl0X2Zvcl9yb3V0aW5nX2ZpbGUoY2hhciAqZmlsZW5hbWUsIEZJTEUgKipyb3V0aW5nX2ZpbGUsIGludCAqcm91dGVfc2l6ZSwgdW5zaWduZWQgc2VjKTsKLXN0YXRpYyBpbnQgcmVhZF9yb3V0aW5nX3RhYmxlX2VudHJ5KEZJTEUgKnJvdXRpbmdfZmlsZSwgcm91dGluZ190YWJsZV9lbnRyeSAqZW50cnkpOwotc3RhdGljIGludCBjbG9zZV9yb3V0aW5nX2ZpbGUoRklMRSAqcm91dGluZ19maWxlKTsKLQotc3RhdGljIEZJTEUgKglyb3V0aW5nX2ZpbGUgPSBOVUxMOwotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIHJvdXRldGFibGUgYWJzdHJhY3Rpb24uIFRoZSByb3V0ZXRhYmxlIHdpbGwgcHJvdmlkZQotICogdGhlIHRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgYW5kIHRoZSBJRCB0byBob3N0bmFtZSBtYXBwaW5nLgotICoKLSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0gKi8KLWludAotc2RtX3JvdXRpbmdfdGFibGVfaW5pdChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCUZJTEUgKgkJCQlydF9maWxlOwotCWludAkJCQkJcnY7Ci0JaW50CQkJCQl0Ymxfc2l6ZTsKLQlpbnQJCQkJCW1hc3RlciA9IDA7Ci0JaW50CQkJCQljaDsKLQljaGFyICoJCQkJZW52dmFsID0gTlVMTDsKLQljaGFyICoqCQkJCXZhcjsKLQotCWZvciAoY2ggPSAwOyBjaCA8IGFyZ2M7IGNoKyspIHsKLQkJY2hhciAqIGFyZyA9IGFyZ3ZbY2hdOwotCQlpZiAoc3RybmNtcChhcmcsICItLW1hc3RlciIsIDgpID09IDApIHsKLQkJCW1hc3RlciA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qCi0JICogTWFzdGVyIGFuZCBzZXJ2ZXJzIHdhaXQgZm9yIHRoZSByb3V0aW5nIGZpbGUgdG8gYXBwZWFyCi0JICovCi0JcnYgPSB3YWl0X2Zvcl9yb3V0aW5nX2ZpbGUoInJvdXRpbmdfZmlsZSIsICZydF9maWxlLCAmdGJsX3NpemUsIFJPVVRJTkdfVEFCTEVfVElNRU9VVCk7IC8vVE9ETzogR2V0IGZpbGVuYW1lIGZyb20gdGhlIGVudmlyb25tZW50Ci0JaWYocnYgPT0gLTEpIHsgLy8gTm8gbmVlZCB0byBjbG9zZSwgc2luY2Ugd2FpdF9mb3Jfcm91dGluZ19maWxlIGRvZXMgaXQgd2hlbiBlcnJvcgotCQkvLyBFcnJvciEKLQkJREVCVUdfUFJJTlRTKERFQlVHX0xFVkVMX0NMSUVOVCwgIkVycm9yIG9wZW5pbmcgdGhlIHJvdXRpbmcgZmlsZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYocnYgPT0gLTIpewotCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQ0xJRU5ULCAiVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciByb3V0aW5nIGZpbGVcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWNsb3NlX3JvdXRpbmdfZmlsZShydF9maWxlKTsKLQotCWlmICh0Ymxfc2l6ZSA9PSAwKSB7Ci0JCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJJbnZhbGlkIHJvdXRpbmcgZmlsZSBzaXplXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXNkbV9yb3V0ZV9zZXRfc2l6ZSh0Ymxfc2l6ZSsxKTsKLQlTRE1fTUFTVEVSID0gdGJsX3NpemU7Ci0KLQkvKgotCSAqIFNpbmNlIHRoZSBTRE0gc2VydmVycyB3aWxsIGJlIHN0YXJ0ZWQgYnkgdGhlIG1waXJ1biwgZ2V0Ci0JICogdGhlIElEIGZyb20gdGhlIGVudmlyb25tZW50LgotCSAqIEltcG9ydGFudCEgSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCwgdGhlbgotCSAqIHRoaXMgc2RtIGlzIHRoZSBtYXN0ZXIuCi0JICovCi0KLQlmb3IgKHZhciA9IE1QSVJhbmtWYXJzOyAqdmFyICE9IE5VTEw7IHZhcisrKSB7Ci0JCWVudnZhbCA9IGdldGVudigqdmFyKTsKLQkJaWYgKGVudnZhbCAhPSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghbWFzdGVyICYmIGVudnZhbCA9PSBOVUxMKSB7Ci0JCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJDb3VsZCBub3QgZmluZCBteSBJRCFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGVudnZhbCAhPSBOVUxMKSB7Ci0JCWludCBpZCA9IHN0cnRvbChlbnZ2YWwsIE5VTEwsIDEwKTsKLQkJc2RtX3JvdXRlX3NldF9pZChpZCk7Ci0JfSBlbHNlIHsKLQkJc2RtX3JvdXRlX3NldF9pZChTRE1fTUFTVEVSKTsKLQl9Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBzaXplICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIHNkbV9yb3V0ZV9nZXRfc2l6ZSgpKTsKLQotCS8qCi0JICogT25jZSB3ZSBoYXZlIHNpemUgYW5kIElEIHdlIGNhbiBpbml0aWFsaXplIGNoaWxkL3BhcmVudCByZWxhdGlvbnNoaXBzLiBUaGlzIG1heSBuZWVkCi0JICogdG8gaGFwcGVuIGF0IGEgZGlmZmVyZW50IHRpbWUgaWYgd2UgYXJlIHJlY2VpdmluZyB0aGUgcm91dGluZyB0YWJsZSBmcm9tIGEgcGFyZW50LgotCSAqLwotCWlmIChzZG1fcm91dGVfaW5pdChhcmdjLCBhcmd2KSA8IDApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkCi1zZG1fcm91dGluZ190YWJsZV9zZXQodm9pZCkKLXsKLQlpbnQJcnY7Ci0JaW50CXRibF9zaXplOwotCi0JaWYgKHJvdXRpbmdfZmlsZSAhPSBOVUxMKSB7Ci0JCWNsb3NlX3JvdXRpbmdfZmlsZShyb3V0aW5nX2ZpbGUpOwotCQlyb3V0aW5nX2ZpbGUgPSBOVUxMOwotCX0KLQotCXJ2ID0gd2FpdF9mb3Jfcm91dGluZ19maWxlKCJyb3V0aW5nX2ZpbGUiLCAmcm91dGluZ19maWxlLCAmdGJsX3NpemUsIFJPVVRJTkdfVEFCTEVfVElNRU9VVCk7IC8vVE9ETzogR2V0IGZpbGVuYW1lIGZyb20gdGhlIGVudmlyb25tZW50Ci0JaWYgKHJ2ID09IC0xKSB7IC8vIE5vIG5lZWQgdG8gY2xvc2UsIHNpbmNlIHdhaXRfZm9yX3JvdXRpbmdfZmlsZSBkb2VzIGl0IHdoZW4gZXJyb3IKLQkJLy8gRXJyb3IhCi0JCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9DTElFTlQsICJFcnJvciBvcGVuaW5nIHRoZSByb3V0aW5nIGZpbGVcbiIpOwotCX0gZWxzZSBpZiAocnYgPT0gLTIpIHsKLQkJREVCVUdfUFJJTlRTKERFQlVHX0xFVkVMX0NMSUVOVCwgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3Igcm91dGluZyBmaWxlXG4iKTsKLQl9Ci19Ci0KLXJvdXRpbmdfdGFibGVfZW50cnkgKgotc2RtX3JvdXRpbmdfdGFibGVfbmV4dCh2b2lkKQotewotCWludAlydjsKLQlzdGF0aWMgcm91dGluZ190YWJsZV9lbnRyeQllbnRyeTsKLQotCWlmIChyb3V0aW5nX2ZpbGUgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlydiA9IHJlYWRfcm91dGluZ190YWJsZV9lbnRyeShyb3V0aW5nX2ZpbGUsICZlbnRyeSk7Ci0KLQlpZiAocnYgPCAwKSB7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX0NMSUVOVCwgIlslZF0gRXJyb3IgcmVhZGluZyByb3V0aW5nIHRhYmxlIGVudHJ5XG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCQl9Ci0JCWNsb3NlX3JvdXRpbmdfZmlsZShyb3V0aW5nX2ZpbGUpOwotCQlyb3V0aW5nX2ZpbGUgPSBOVUxMOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gJmVudHJ5OwotfQotCi0vKgotICogR2V0IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gYSBmaWxlLgotICogRmlsZSBwb2ludGVyIGlzIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCi0gKgotICogQHJldHVybiBudW1iZXIgb2YgbGluZXMKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLWxpbmVfY291bnQoRklMRSAqZmlsZSkKLXsKLQlpbnQgbnVtX2xpbmVzID0gMDsKLQotCWludCByZXRfdmFsOwotCWNoYXIgcmV0X2NoYXI7Ci0KLQlmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7Ci0KLQl3aGlsZSgxKSB7Ci0JCXJldF92YWwgPSBmZ2V0YyhmaWxlKTsKLQotCQlpZihyZXRfdmFsID09IEVPRikgewotCQkJaWYoZmVycm9yKGZpbGUpKQotCQkJCXJldHVybiAtMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0X2NoYXIgPSAoY2hhcilyZXRfdmFsOwotCi0JCWlmKHJldF9jaGFyID09ICdcbicpCi0JCQludW1fbGluZXMrKzsKLQl9Ci0JZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOwotCi0JcmV0dXJuIG51bV9saW5lczsKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGVudHJ5IG9mIGFuIG9wZW5lZCByb3V0aW5nX2ZpbGUgb24gdGhlIHRhYmxlIHBvaW50ZXIuCi0gKiBBc3N1bWVzIGZpbGUgcG9pbnRlciBtdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGFmdGVyIHRoZSBoZWFkZXIKLSAqCi0gKiBAcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTIgaWYgRU9GLCAtMSBpZiBlcnJvcgotICovCi1zdGF0aWMgaW50Ci1yZWFkX3JvdXRpbmdfdGFibGVfZW50cnkoRklMRSAqcm91dGluZ19maWxlLCByb3V0aW5nX3RhYmxlX2VudHJ5ICplbnRyeSkKLXsKLQlpbnQgcnY7Ci0JcnYgPSBmc2NhbmYocm91dGluZ19maWxlLCAiJWQgJTI1NXMgJWRcbiIsCi0JCQkmKGVudHJ5LT5ub2RlSUQpLCBlbnRyeS0+aG9zdG5hbWUsCi0JCQkmKGVudHJ5LT5wb3J0KSk7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQ0xJRU5ULCAiWyVkXSBub2RlSUQ6ICVkLCBob3N0bmFtZTogJXMsIHBvcnQ6ICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksCi0JCQllbnRyeS0+bm9kZUlELCBlbnRyeS0+aG9zdG5hbWUsIGVudHJ5LT5wb3J0KTsKLQotCWlmIChydiA9PSBFT0YpCi0JCXJldHVybiAtMjsKLQkvLyBFcnJvciByZWFkaW5nIGZpbGUKLQlpZihmZXJyb3Iocm91dGluZ19maWxlKSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSByb3V0aW5nIHRhYmxlIHRvIHRoZSBwYXNzZWQgc3RydWN0dXJlLgotICovCi0vKmludCByZWFkX3JvdXRpbmdfdGFibGUoRklMRSAqcm91dGluZ19maWxlLCBpbnQgbnVtX2VudHJpZXMsIHN0cnVjdCByb3V0aW5nX3RibF9zdHJ1Y3QgKnRhYmxlKQotewotCWludCBpLCBydjsKLQotCS8vIEdldCB0aGUgZmlsZSBzaXplIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQotCi0KLQlmb3IoaT0wOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgewotCQlydiA9IGZzY2FuZihyb3V0aW5nX2ZpbGUsICIlMjU1czslMjU1czslZFxuIiwKLQkJCQl0YWJsZVtpXS5ub2RlSUQsIHRhYmxlW2ldLmhvc3RuYW1lLAotCQkJCSYodGFibGVbaV0ucG9ydCkpOwotCi0JCS8vIEVycm9yIHJlYWRpbmcgZmlsZQotCQlpZihmZXJyb3Iocm91dGluZ19maWxlKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLX0qLwotCi0vKioKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGxpbmVzIGZyb20gdGhlIGhlYWRlciBvZiB0aGUgZmlsZQotICogSXQgd2lsbCBzZXQgdGhlIGZpbGUgcG9pbnRlciB0byBqdXN0IGFmdGVyIHRoZSBoZWFkZXIgb2YgdGhlIGZpbGUKLSAqCi0gKiBAcmV0dXJuIC0yIGlmIGZpbGUgYXQgRU9GLCAtMSBpZiBlcnJvciwgMCBpZiBzdWNjZXNzZnVsCi0gKi8KLXN0YXRpYyBpbnQKLXJlYWRfcm91dGluZ190YWJsZV9zaXplKEZJTEUgKnJvdXRpbmdfZmlsZSwgaW50ICpzaXplKQotewotCWludCBydjsKLQotCWZzZWVrKHJvdXRpbmdfZmlsZSwgMCwgU0VFS19TRVQpOwotCXJ2ID0gZnNjYW5mKHJvdXRpbmdfZmlsZSwgIiVkXG4iLCBzaXplKTsKLQotCWlmKGZlcnJvcihyb3V0aW5nX2ZpbGUpICE9IDApCi0JCXJldHVybiAtMTsKLQlpZihydiAhPSAxKQotCQlyZXR1cm4gLTI7IC8vIEp1c3QgRU9GCi0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBDbG9zZSBhIHJvdXRpbmcgdGFibGUgcG9pbnRlZCBieSB0aCByb3V0aW5nX2ZpbGUgcGFyYW1ldGVyCi0gKgotICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLSAqLwotc3RhdGljIGludAotY2xvc2Vfcm91dGluZ19maWxlKEZJTEUgKnJvdXRpbmdfZmlsZSkKLXsKLQlyZXR1cm4gZmNsb3NlKHJvdXRpbmdfZmlsZSk7Ci19Ci0KLS8qKgotICogV2FpdCBmb3Igc2VjIHNlY29uZHMgZm9yIGEgcm91dGluZyBmaWxlIGZpbGVuYW1lLCByZXR1cm5pbmcgaXRzIGZpbGUgcG9pbnRlciBpbgotICogdGhlIHJvdXRpbmdfZmlsZSBwYXJhbWV0ZXIuCi0gKgotICogQHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGlmIGVycm9yLCAtMiBpZiBmaWxlIG5vdCByZWFkeSBpbiBzZWMgc2Vjb25kcwotICovCi1zdGF0aWMgaW50Ci13YWl0X2Zvcl9yb3V0aW5nX2ZpbGUoY2hhciAqZmlsZW5hbWUsIEZJTEUgKipyb3V0aW5nX2ZpbGUsIGludCAqcm91dGVfc2l6ZSwgdW5zaWduZWQgc2VjKQotewotCUZJTEUgKglmcDsKLQljaGFyCXdkW01BWFBBVEhMRU5dOwotCi0JZ2V0Y3dkKHdkLCBNQVhQQVRITEVOKTsKLQotCS8vIFdhaXQgZm9yIGZpbGUgdG8gYmUgY3JlYXRlZAotCXdoaWxlIChzZWMtLSA+IDApIHsKLQkJLyoKLQkJICogTGlzdCBmaWxlcyB0byBmb3JjZSBhbiB1cGRhdGVkIHZpZXcgb2YgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZQotCQkgKiBvcGVuaW5nIHRoZSByb3VudGluZ19maWxlLiBPbiBORlMgZmlsZSBzeXN0ZW1zLCBmb3BlbiBuZXZlciBzZWVzCi0JCSAqIHJlY2VudGx5IGNyZWF0ZWQgZmlsZXMgd2l0aG91dCB0aGUgdXBkYXRlLgotCQkgKi8KLQkJRElSICogZGlyID0gb3BlbmRpcih3ZCk7Ci0JCWNsb3NlZGlyKGRpcik7Ci0KLQkJZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQotCQlpZiAoZnAgPT0gTlVMTCkgewotCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgewotCQkJCXBlcnJvcigiZm9wZW4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkvLyBGaWxlIG5vdCBjcmVhdGVkIHlldC4gV2FpdC4uLgotCQl9IGVsc2UgewotCQkJaW50IGVmZl9zaXplLCBzaXplOwotCQkJaW50IHJ2OwotCi0JCQkvLyBDb21wYXJlIHRoZSBmaWxlc2l6ZSB3aXRoIHRoZSBzaXplIG9uIHRoZSBoZWFkZXIgb2YgdGhlIGZpbGUKLQkJCWVmZl9zaXplID0gbGluZV9jb3VudChmcCk7IC8vIFJldHVybnMgRklMRSBwb2ludGVyIHRvIDAKLQkJCXJ2ID0gcmVhZF9yb3V0aW5nX3RhYmxlX3NpemUoZnAsICZzaXplKTsgLy8gUmV0dXJucyBGSUxFIHBvaW50ZXIgdG8KLQkJCQkJCQkJCQkJCQkJCS8vIHRoZSBhZnRlciB0aGUgaGVhZGVyCi0KLQkJCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9DTElFTlQsICJbJWRdIGVmZnNpemU6ICVkLCBzaXplOiAlZCwgcnY6ICVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksCi0JCQkJCWVmZl9zaXplLCBzaXplLCBydik7Ci0KLQkJCXN3aXRjaCAocnYpIHsKLQkJCWNhc2UgLTE6Ci0JCQkJLy8gZXJyb3IKLQkJCQlyZXR1cm4gLTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIC0yOgotCQkJCS8vIFNpemUgbm90IGF2YWlsYWJsZSB5ZXQuIENsb3NlIGZpbGUgYW5kIHdhaXQKLQkJCQlmY2xvc2UoZnApOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBXZSBoYXZlIGZpbGUgc2l6ZS4gTm93IHdhaXQgdW50aWwgZWZmZWN0aXZlIGZpbGUgc2l6ZSBlcXVhbHMKLQkJCQkvLyBmaWxlIHNpemUKLQkJCQlpZiAoKGVmZl9zaXplIC0gMSkgPT0gc2l6ZSkgewotCQkJCQkqcm91dGluZ19maWxlID0gZnA7Ci0JCQkJCSpyb3V0ZV9zaXplID0gc2l6ZTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJZmNsb3NlKGZwKTsKLQkJCX0KLQkJfQotCi0JCXVzbGVlcChST1VUSU5HX1RBQkxFX1dBSVQpOwotCX0KLQotCXJldHVybiAtMjsKLX0KLQotCi0vKmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaW50IHJ2LCBpOwotCi0JRklMRSAqIHJvdXRpbmdfZmlsZSA9IGZvcGVuKCJyb3V0aW5nX2ZpbGUiLCAiciIpOwotCi0Jc3RydWN0IHJvdXRpbmdfdGJsX3N0cnVjdCAqIHJvdXRlX3RibDsKLQlpbnQgbnVtX2xpbmVzOwotCi0JLy8gQWxsb2NzIHN0cnVjdHVyZSBzaXplIGJhc2VkIG9uIHRoZSBmaWxlIHNpemUKLQlpZigobnVtX2xpbmVzID0gbGluZV9jb3VudChyb3V0aW5nX2ZpbGUpKSA8PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlyb3V0ZV90YmwgPSAoc3RydWN0IHJvdXRpbmdfdGJsX3N0cnVjdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHJvdXRpbmdfdGJsX3N0cnVjdCkgKiBudW1fbGluZXMpOwotCi0JLy8gUmVhZCBlbnRyaWVzIHRvIHRoZSBzdHJ1Y3R1cmUKLQlydiA9IHJlYWRfcm91dGluZ190YWJsZShyb3V0aW5nX2ZpbGUsIG51bV9saW5lcywgcm91dGVfdGJsKTsKLQotCWlmKHJ2IDw9IDApCi0JCXJldHVybiAtMTsKLQotCS8vCi0KLX0qLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvaW1wbC9zZG1fc2V0X2JpdHNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjRiNGEwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL2ltcGwvc2RtX3NldF9iaXRzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIElEIHNldCBpbXBsZW1lbnRhdGlvbi4gVGhlc2Ugcm91dGluZXMgaW1wbGVtZW50IGEgc2V0IGFic3RyYWN0aW9uIHVzaW5nIGJpdHNldHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0jaW5jbHVkZSAic2RtLmgiCi0KLXN0cnVjdCBzZG1faWRzZXQgewotCWJpdHNldCAqCXNldDsKLQlpbnQJCQlpdGVyYXRvcjsKLX07Ci0KLXNkbV9pZHNldAotc2RtX3NldF9uZXcodm9pZCkKLXsKLQlzZG1faWRzZXQgc2V0ID0gKHNkbV9pZHNldCltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZG1faWRzZXQpKTsKLQlzZXQtPnNldCA9IGJpdHNldF9uZXcoc2RtX3JvdXRlX2dldF9zaXplKCkpOwotCXNldC0+aXRlcmF0b3IgPSAwOwotCXJldHVybiBzZXQ7Ci19Ci0KLXZvaWQKLXNkbV9zZXRfZnJlZShzZG1faWRzZXQgc2V0KQotewotCWJpdHNldF9mcmVlKHNldC0+c2V0KTsKLQlmcmVlKHNldCk7Ci19Ci0KLXNkbV9pZHNldAotc2RtX3NldF9jbGVhcihzZG1faWRzZXQgc2V0KQotewotCWJpdHNldF9jbGVhcihzZXQtPnNldCk7Ci0JcmV0dXJuIHNldDsKLX0KLQotaW50Ci1zZG1fc2V0X3NpemUoY29uc3Qgc2RtX2lkc2V0IHNldCkKLXsKLQlyZXR1cm4gYml0c2V0X2NvdW50KHNldC0+c2V0KTsKLX0KLQotaW50Ci1zZG1fc2V0X2lzX3N1YnNldChjb25zdCBzZG1faWRzZXQgc2V0MSwgY29uc3Qgc2RtX2lkc2V0IHNldDIpCi17Ci0JcmV0dXJuIGJpdHNldF9lcShzZXQxLT5zZXQsIHNldDItPnNldCk7Ci19Ci0KLWludAotc2RtX3NldF9jb21wYXJlKGNvbnN0IHNkbV9pZHNldCBzZXQxLCBjb25zdCBzZG1faWRzZXQgc2V0MikKLXsKLQlyZXR1cm4gYml0c2V0X2NvbXBhcmUoc2V0MS0+c2V0LCBzZXQyLT5zZXQpOwotfQotCi1pbnQKLXNkbV9zZXRfY29udGFpbnMoY29uc3Qgc2RtX2lkc2V0IHNldCwgY29uc3Qgc2RtX2lkIGlkKQotewotCXJldHVybiBiaXRzZXRfdGVzdChzZXQtPnNldCwgaWQpID09IDE7Ci19Ci0KLXNkbV9pZAotc2RtX3NldF9maXJzdChjb25zdCBzZG1faWRzZXQgc2V0KQotewotCXNldC0+aXRlcmF0b3IgPSBiaXRzZXRfZmlyc3RzZXQoc2V0LT5zZXQpOwotCXJldHVybiBzZXQtPml0ZXJhdG9yOwotfQotCi1zZG1faWQKLXNkbV9zZXRfbmV4dChjb25zdCBzZG1faWRzZXQgc2V0KQotewotCXdoaWxlIChzZXQtPml0ZXJhdG9yIDwgYml0c2V0X3NpemUoc2V0LT5zZXQpKSB7Ci0JCXNldC0+aXRlcmF0b3IrKzsKLQkJaWYgKGJpdHNldF90ZXN0KHNldC0+c2V0LCBzZXQtPml0ZXJhdG9yKSkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc2V0LT5pdGVyYXRvcjsKLX0KLQotaW50Ci1zZG1fc2V0X2RvbmUoY29uc3Qgc2RtX2lkc2V0IHNldCkKLXsKLQlyZXR1cm4gc2V0LT5pdGVyYXRvciA8IDAgfHwgc2V0LT5pdGVyYXRvciA+PSBiaXRzZXRfc2l6ZShzZXQtPnNldCk7Ci19Ci0KLWludAotc2RtX3NldF9pc19lbXB0eShjb25zdCBzZG1faWRzZXQgc2V0KQotewotCXJldHVybiBiaXRzZXRfaXNlbXB0eShzZXQtPnNldCk7Ci19Ci0KLXNkbV9pZHNldAotc2RtX3NldF9hZGRfZWxlbWVudChjb25zdCBzZG1faWRzZXQgc2V0LCBjb25zdCBzZG1faWQgaWQpCi17Ci0JYml0c2V0X3NldChzZXQtPnNldCwgaWQpOwotCXJldHVybiBzZXQ7Ci19Ci0KLXNkbV9pZHNldAotc2RtX3NldF9yZW1vdmVfZWxlbWVudChjb25zdCBzZG1faWRzZXQgc2V0LCBjb25zdCBzZG1faWQgaWQpCi17Ci0JYml0c2V0X3Vuc2V0KHNldC0+c2V0LCBpZCk7Ci0JcmV0dXJuIHNldDsKLX0KLQotc2RtX2lkc2V0Ci1zZG1fc2V0X2FkZF9hbGwoY29uc3Qgc2RtX2lkc2V0IHNldCwgY29uc3Qgc2RtX2lkIGlkKQotewotCWJpdHNldCAqYiA9IGJpdHNldF9uZXcoaWQrMSk7Ci0JYml0c2V0X2ludmVydChiKTsKLQliaXRzZXRfb3JlcShzZXQtPnNldCwgYik7Ci0JYml0c2V0X2ZyZWUoYik7Ci0JcmV0dXJuIHNldDsKLX0KLQotc2RtX2lkc2V0Ci1zZG1fc2V0X3VuaW9uKGNvbnN0IHNkbV9pZHNldCBzZXQxLCBjb25zdCBzZG1faWRzZXQgc2V0MikKLXsKLQliaXRzZXRfb3JlcShzZXQxLT5zZXQsIHNldDItPnNldCk7Ci0JcmV0dXJuIHNldDE7Ci19Ci0KLXNkbV9pZHNldAotc2RtX3NldF9pbnRlcnNlY3QoY29uc3Qgc2RtX2lkc2V0IHNldDEsIGNvbnN0IHNkbV9pZHNldCBzZXQyKQotewotCS8qCi0JICogSWYgZWl0aGVyIHNldCBpcyBlbXB0eSwgdGhlIHJlc3VsdCBpcyBVICh0aGUgdW5pdmVyc2UpCi0JICovCi0JaWYgKGJpdHNldF9pc2VtcHR5KHNldDEtPnNldCkgfHwgYml0c2V0X2lzZW1wdHkoc2V0Mi0+c2V0KSkgewotCQliaXRzZXRfY2xlYXIoc2V0MS0+c2V0KTsKLQkJYml0c2V0X2ludmVydChzZXQxLT5zZXQpOwotCX0gZWxzZSB7Ci0JCWJpdHNldF9hbmRlcShzZXQxLT5zZXQsIHNldDItPnNldCk7Ci0JfQotCXJldHVybiBzZXQxOwotfQotCi1zZG1faWRzZXQKLXNkbV9zZXRfZGlmZihjb25zdCBzZG1faWRzZXQgc2V0MSwgY29uc3Qgc2RtX2lkc2V0IHNldDIpCi17Ci0JYml0c2V0X2FuZGVxbm90KHNldDEtPnNldCwgc2V0Mi0+c2V0KTsKLQlyZXR1cm4gc2V0MTsKLX0KLQotc2RtX2lkCi1zZG1fc2V0X21heChjb25zdCBzZG1faWRzZXQgc2V0KQotewotCXJldHVybiBiaXRzZXRfc2l6ZShzZXQtPnNldCkgLSAxOwotfQotCi1pbnQKLXNkbV9zZXRfc2VyaWFsaXplKGNvbnN0IHNkbV9pZHNldCBzZXQsIGNoYXIgKmJ1ZiwgY2hhciAqKmVuZCkKLXsKLQljaGFyICoJc3RyID0gYml0c2V0X3RvX3N0cihzZXQtPnNldCk7Ci0JaW50CQlsZW4gPSBzdHJsZW4oc3RyKTsKLQotCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQlmcmVlKHN0cik7Ci0JaWYgKGVuZCAhPSBOVUxMKSB7Ci0JCSplbmQgPSBidWYgKyBsZW47Ci0JfQotCXJldHVybiBsZW47Ci19Ci0KLWludAotc2RtX3NldF9zZXJpYWxpemVkX2xlbmd0aChjb25zdCBzZG1faWRzZXQgc2V0KQotewotCXJldHVybiBzaXplb2YoaW50KSAqIDIgKyAxICsgYml0c2V0X3NpemUoc2V0LT5zZXQpIC8gNDsKLX0KLQotaW50Ci1zZG1fc2V0X2Rlc2VyaWFsaXplKHNkbV9pZHNldCBzZXQsIGNoYXIgKmJ1ZiwgY2hhciAqKmVuZCkKLXsKLQljaGFyICoJCWU7Ci0JYml0c2V0ICoJYiA9IHN0cl90b19iaXRzZXQoYnVmLCAmZSk7Ci0KLQliaXRzZXRfY29weShzZXQtPnNldCwgYik7Ci0JYml0c2V0X2ZyZWUoYik7Ci0JaWYgKGVuZCAhPSBOVUxMKSB7Ci0JCSplbmQgPSBlOwotCX0KLQlyZXR1cm4gZSAtIGJ1ZjsKLX0KLQotY2hhciAqCi1fc2V0X3RvX3N0cihzZG1faWRzZXQgc2V0KQotewotCXJldHVybiBiaXRzZXRfdG9fc2V0KHNldC0+c2V0KTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pLy5jdnNpZ25vcmUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNkMWE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLS5kaXJzdGFtcAotLmRlcHMKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL0NMSUNvbW1hbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL0NMSUNvbW1hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4OTJkNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9DTElDb21tYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotCi1NSUNvbW1hbmQgKgotTUlHREJWZXJzaW9uKHZvaWQpCi17Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiLWdkYi12ZXJzaW9uIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotQ0xJSGFuZGxlKGNoYXIgKmFyZykgewotCU1JQ29tbWFuZCAqIGNtZDsKLQljbWQgPSBNSUNvbW1hbmROZXcoImhhbmRsZSIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgYXJnLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotQ0xJSW5mb1RocmVhZHModm9pZCkgewotCU1JQ29tbWFuZCAqIGNtZDsKLQljbWQgPSBNSUNvbW1hbmROZXcoImluZm8gdGhyZWFkcyIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLUNMSVBUeXBlKGNoYXIgKm5hbWUpIHsKLQlNSUNvbW1hbmQgKiBjbWQ7Ci0JY21kID0gTUlDb21tYW5kTmV3KCJwdHlwZSIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgbmFtZSwgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICogCi1DTElMaXN0U2lnbmFscyhjaGFyICpuYW1lKSB7Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiaW5mbyBzaWduYWxzIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIG5hbWUsIE5VTEwpOwotCX0JCi0JcmV0dXJuIGNtZDsKLX0KLQkKLU1JQ29tbWFuZCAqIAotQ0xJU2lnbmFsSW5mbyhjaGFyICphcmcpIHsKLQlNSUNvbW1hbmQgKiBjbWQ7Ci0JY21kID0gTUlDb21tYW5kTmV3KCJzaWduYWwiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIGFyZywgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0JCi0KLU1JQ29tbWFuZCAqIAotQ0xJRnJhbWUodm9pZCkgewotCU1JQ29tbWFuZCAqIGNtZDsKLQljbWQgPSBNSUNvbW1hbmROZXcoImZyYW1lIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlyZXR1cm4gY21kOwotfQkKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL0NMSU91dHB1dC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvQ0xJT3V0cHV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGVmMWQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvQ0xJT3V0cHV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgIk1JT09CUmVjb3JkLmgiCi0jaW5jbHVkZSAiQ0xJT3V0cHV0LmgiCi0KLSNpbmNsdWRlICJzaWduYWxpbmZvLmgiCi0KLXN0YXRpYyBpbnQgCi1nZXRCb29sZWFuKGNoYXIqIHZhbHVlKSAKLXsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiBzdHJuY21wKHZhbHVlLCAiWWVzIiwgMykgPT0gMCkgewotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgCi1DTElHZXRTaWdIYW5kbGVMaXN0KE1JQ29tbWFuZCAqY21kLCBMaXN0Kiogc2lnbmFscykgCi17Ci0JTGlzdCAqb29iczsKLQlNSU9PQlJlY29yZCAqb29iOwotCWNoYXIgKnRleHQgPSBOVUxMOwotCQotCWNvbnN0IGNoYXIqIGRlbGltc1tdID0geyAiICIsICJcXCIgfTsKLQljaGFyICp0b2tlbiwgKnBjaDsKLQlpbnQgaTsKLQkKLQlzaWduYWxpbmZvICpzaWc7Ci0JKnNpZ25hbHMgPSBOZXdMaXN0KCk7Ci0KLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPm9vYnMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jb29icyA9IGNtZC0+b3V0cHV0LT5vb2JzOwotCWZvciAoU2V0TGlzdChvb2JzKTsgKG9vYiA9IChNSU9PQlJlY29yZCAqKUdldExpc3RFbGVtZW50KG9vYnMpKSAhPSBOVUxMOyApIHsKLQkJdGV4dCA9IG9vYi0+Y3N0cmluZzsKLQkJaWYgKCp0ZXh0ID09ICdcMCcgfHwgKnRleHQgPT0gJ1xcJykgewotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCWlmIChzdHJuY21wKHRleHQsICJTaWduYWwiLCA2KSAhPSAwICYmIHN0cm5jbXAodGV4dCwgIlVzZSIsIDMpICE9IDAgJiYgc3RybmNtcCh0ZXh0LCAiaW5mbyIsIDQpICE9IDApIHsKLQkJCXRva2VuID0gc3RyZHVwKHRleHQpOwotCQkJcGNoID0gc3Ryc3RyKHRva2VuLCBkZWxpbXNbMF0pOwotCQkJaWYgKHBjaCA9PSBOVUxMKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzaWcgPSBOZXdTaWduYWxJbmZvKCk7Ci0JCQlmb3IgKGk9MDsgcGNoICE9IE5VTEw7IGkrKyxwY2g9c3Ryc3RyKHRva2VuLCBkZWxpbXNbMV0pKSB7Ci0JCQkJaWYgKCpwY2ggPT0gJ1wwJykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJKnBjaCA9ICdcMCc7Ci0JCQkJcGNoKys7Ci0JCQkJd2hpbGUgKCpwY2ggPT0gJyAnIHx8ICpwY2ggPT0ndCcpIHsgLy9yZW1vdmUgd2hpdGVzcGFjZSBvciB0IGNoYXJhY3RlcgotCQkJCQlwY2grKzsKLQkJCQl9Ci0JCQkJaWYgKCpwY2ggPT0gJ1xcJykgeyAvL2lnbm9yZSAnXFx0JyBhZ2FpbgotCQkJCQlwY2ggKz0gMjsKLQkJCQl9Ci0KLS8vcHJpbnRmKCItLS10b2tlbiglZCk6ICVzXG4iLCBpLCBzdHJkdXAodG9rZW4pKTsKLQkJCQlzd2l0Y2goaSkgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlzaWctPm5hbWUgPSBzdHJkdXAodG9rZW4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXNpZy0+c3RvcCA9IGdldEJvb2xlYW4odG9rZW4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXNpZy0+cHJpbnQgPSBnZXRCb29sZWFuKHRva2VuKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDM6Ci0JCQkJCQlzaWctPnBhc3MgPSBnZXRCb29sZWFuKHRva2VuKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlzaWctPmRlc2MgPSBzdHJkdXAodG9rZW4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXRva2VuID0gc3RyZHVwKHBjaCk7Ci0JCQl9Ci0JCQlmcmVlKHRva2VuKTsKLQkJCWZyZWUocGNoKTsKLQkJCUFkZFRvTGlzdCgqc2lnbmFscywgKHZvaWQgKilzaWcpOwkJCQotCQl9Ci0JfQotfQotCi1kb3VibGUgCi1DTElHZXRHREJWZXJzaW9uKE1JQ29tbWFuZCAqY21kKQotewotCUxpc3QgKgkJCW9vYnM7Ci0JTUlPT0JSZWNvcmQgKglvb2I7Ci0JY2hhciAqCQkJdGV4dDsKLQkKLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPm9vYnMgPT0gTlVMTCkgewotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlpZiAoY21kLT5vdXRwdXQtPnJyICE9IE5VTEwgJiYgY21kLT5vdXRwdXQtPnJyLT5yZXN1bHRDbGFzcyA9PSBNSVJlc3VsdFJlY29yZEVSUk9SKSB7Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCW9vYnMgPSBjbWQtPm91dHB1dC0+b29iczsKLQlmb3IgKFNldExpc3Qob29icyk7IChvb2IgPSAoTUlPT0JSZWNvcmQgKilHZXRMaXN0RWxlbWVudChvb2JzKSkgIT0gTlVMTDsgKSB7Ci0JCXRleHQgPSBvb2ItPmNzdHJpbmc7Ci0JCWlmICgqdGV4dCA9PSAnXDAnKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQl3aGlsZSAoKnRleHQgPT0gJyAnKSB7Ci0JCQl0ZXh0Kys7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIGxpbnV4IHNlbGY6IEdVTiBnZGIgNi41LjAKLQkJICogZmVkb3JlOiBHTlUgZ2RiIFJlZCBIYXQgTGludXggKDYuNS04LmZjNnJoKQotCQkgKiBNYWMgT1MgWDogR05VIGdkYiA2LjEtMjAwNDAzMDMgKEFwcGxlIHZlcnNpb24gZ2RiLTM4NCkgKE1vbiBNYXIgMjEgMDA6MDU6MjYgR01UIDIwMDUpCi0JCSAqLwotCQlpZiAoc3RybmNtcCh0ZXh0LCAiR05VIGdkYiIsIDcpID09IDApIHsKLQkJCS8qCi0JCQkgKiBieXBhc3MgIkdOVSBnZGIiCi0JCQkgKi8KLQkJCXRleHQgKz0gODsKLQkJCQotCQkJLyoKLQkJCSAqIGZpbmQgZmlyc3QgZGlnaXQKLQkJCSAqLwotCQkJd2hpbGUgKCp0ZXh0ICE9ICdcMCcgJiYgIWlzZGlnaXQoKnRleHQpKQotCQkJCXRleHQrKzsKLQkJCQkKLQkJCS8qCi0JCQkgKiBDb252ZXJ0IHdoYXRldmVyIGlzIGhlcmUgdG8gYSBkb3VibGUKLQkJCSAqLwotCQkJaWYgKCp0ZXh0ICE9ICdcMCcpCi0JCQkJcmV0dXJuIHN0cnRvZCh0ZXh0LCBOVUxMKTsKLQkJfQotCX0KLQlyZXR1cm4gLTEuMDsKLX0KLQotY2hhciAqCi1DTElHZXRQVHlwZUluZm8oTUlDb21tYW5kICpjbWQpIHsKLQlMaXN0ICpvb2JzOwotCU1JT09CUmVjb3JkICpvb2I7Ci0JY2hhciAqdGV4dCA9IE5VTEw7Ci0JY2hhciAqcCA9IE5VTEw7Ci0KLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPm9vYnMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlvb2JzID0gY21kLT5vdXRwdXQtPm9vYnM7Ci0JZm9yIChTZXRMaXN0KG9vYnMpOyAob29iID0gKE1JT09CUmVjb3JkICopR2V0TGlzdEVsZW1lbnQob29icykpICE9IE5VTEw7ICkgewotCQl0ZXh0ID0gb29iLT5jc3RyaW5nOwotCQlpZiAoKnRleHQgPT0gJ1wwJykgewotCQkJY29udGludWU7Ci0JCX0KLQkJd2hpbGUgKCp0ZXh0ID09ICcgJykgewotCQkJdGV4dCsrOwotCQl9Ci0KLQkJaWYgKHN0cm5jbXAodGV4dCwgInR5cGUiLCA0KSA9PSAwKSB7Ci0JCQl0ZXh0ICs9IDc7IC8vYnlwYXNzICIgPSAiCi0JCQlwID0gc3RyY2hyKHRleHQsICd7Jyk7Ci0JCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJKigtLXApID0gJ1wwJzsvL3JlbW92ZSB0aGUgd2hpdGVzcGFjZSBiZWZvcmUgewotCQkJCXJldHVybiBzdHJkdXAodGV4dCk7Ci0JCQl9Ci0JCQlwID0gc3RyY2hyKHRleHQsICdcXCcpOwotCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCSpwID0gJ1wwJzsKLQkJCQlyZXR1cm4gc3RyZHVwKHRleHQpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1DTElJbmZvVGhyZWFkc0luZm8gKgotQ0xJSW5mb1RocmVhZHNJbmZvTmV3KHZvaWQpIAotewotCUNMSUluZm9UaHJlYWRzSW5mbyAqIGluZm87Ci0JaW5mbyA9IChDTElJbmZvVGhyZWFkc0luZm8gKiltYWxsb2Moc2l6ZW9mKENMSUluZm9UaHJlYWRzSW5mbykpOwotCWluZm8tPmN1cnJlbnRfdGhyZWFkX2lkID0gMTsKLQlpbmZvLT50aHJlYWRfaWRzID0gTlVMTDsKLQlyZXR1cm4gaW5mbzsKLX0KLQotQ0xJSW5mb1RocmVhZHNJbmZvICoKLUNMSUdldEluZm9UaHJlYWRzSW5mbyhNSUNvbW1hbmQgKmNtZCkgCi17Ci0JTGlzdCAqb29iczsKLQlNSU9PQlJlY29yZCAqb29iOwotCUNMSUluZm9UaHJlYWRzSW5mbyAqIGluZm8gPSBDTElJbmZvVGhyZWFkc0luZm9OZXcoKTsKLQljaGFyICogdGV4dCA9IE5VTEw7Ci0JY2hhciAqIGlkID0gTlVMTDsKLQotCWlmICghY21kLT5jb21wbGV0ZWQgfHwgY21kLT5vdXRwdXQgPT0gTlVMTCB8fCBjbWQtPm91dHB1dC0+b29icyA9PSBOVUxMKSB7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCWlmIChjbWQtPm91dHB1dC0+cnIgIT0gTlVMTCAmJiBjbWQtPm91dHB1dC0+cnItPnJlc3VsdENsYXNzID09IE1JUmVzdWx0UmVjb3JkRVJST1IpIHsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0Jb29icyA9IGNtZC0+b3V0cHV0LT5vb2JzOwotCWluZm8tPnRocmVhZF9pZHMgPSBOZXdMaXN0KCk7Ci0JZm9yIChTZXRMaXN0KG9vYnMpOyAob29iID0gKE1JT09CUmVjb3JkICopR2V0TGlzdEVsZW1lbnQob29icykpICE9IE5VTEw7ICkgewotCQl0ZXh0ID0gb29iLT5jc3RyaW5nOwotCQkKLQkJaWYgKCp0ZXh0ID09ICdcMCcpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXdoaWxlICgqdGV4dCA9PSAnICcpIHsKLQkJCXRleHQrKzsKLQkJfQotCQlpZiAoc3RybmNtcCh0ZXh0LCAiKiIsIDEpID09IDApIHsKLQkJCXRleHQgKz0gMjsvL2VzY2FwZSAiKiAiOwotCQkJaWYgKGlzZGlnaXQoKnRleHQpKSB7Ci0JCQkJaW5mby0+Y3VycmVudF90aHJlYWRfaWQgPSBzdHJ0b2wodGV4dCwgJnRleHQsIDEwKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpc2RpZ2l0KCp0ZXh0KSkgewotCQkJaWYgKGluZm8tPnRocmVhZF9pZHMgPT0gTlVMTCkKLQkJCQlpbmZvLT50aHJlYWRfaWRzID0gTmV3TGlzdCgpOwotCi0JCQlpZCA9IHN0cmNocih0ZXh0LCAnICcpOwotCQkJaWYgKGlkICE9IE5VTEwpIHsKLQkJCQkqaWQgPSAnXDAnOwotCQkJCUFkZFRvTGlzdChpbmZvLT50aHJlYWRfaWRzLCAodm9pZCAqKXN0cmR1cCh0ZXh0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGluZm87Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9DTElPdXRwdXQuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL0NMSU91dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmI3NDhmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL0NMSU91dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotIAotI2lmbmRlZiBfQ0xJU0lHSEFORExFX0hfCi0jZGVmaW5lIF9DTElTSUdIQU5ETEVfSF8KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSUNvbW1hbmQuaCIKLQotc3RydWN0IENMSUluZm9UaHJlYWRzSW5mbyB7Ci0JaW50IGN1cnJlbnRfdGhyZWFkX2lkOwotCUxpc3QgKiB0aHJlYWRfaWRzOwotfTsKLXR5cGVkZWYgc3RydWN0IENMSUluZm9UaHJlYWRzSW5mbyBDTElJbmZvVGhyZWFkc0luZm87Ci0KLWV4dGVybiB2b2lkIENMSUdldFNpZ0hhbmRsZUxpc3QoTUlDb21tYW5kICpjbWQsIExpc3QgKipzaWduYWxzKTsKLWV4dGVybiBkb3VibGUgQ0xJR2V0R0RCVmVyc2lvbihNSUNvbW1hbmQgKmNtZCk7Ci1leHRlcm4gY2hhciAqQ0xJR2V0UFR5cGVJbmZvKE1JQ29tbWFuZCAqY21kKTsKLWV4dGVybiBDTElJbmZvVGhyZWFkc0luZm8gKkNMSUluZm9UaHJlYWRzSW5mb05ldyh2b2lkKTsKLWV4dGVybiBDTElJbmZvVGhyZWFkc0luZm8gKkNMSUdldEluZm9UaHJlYWRzSW5mbyhNSUNvbW1hbmQgKmNtZCk7Ci0KLSNlbmRpZiAvKiBfQ0xJU0lHSEFORExFX0hfICovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSS5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmMjE3NS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfTUlfSF8KLSNkZWZpbmUgX01JX0hfCi0KLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLSNpbmNsdWRlICJNSVNlc3Npb24uaCIKLSNpbmNsdWRlICJNSUNvbW1hbmQuaCIKLSNpbmNsdWRlICJNSUJyZWFrcG9pbnQuaCIKLSNpbmNsdWRlICJNSUZyYW1lLmgiCi0jaW5jbHVkZSAiTUlUaHJlYWQuaCIKLSNpbmNsdWRlICJNSVZhci5oIgotI2luY2x1ZGUgIk1JQXJnLmgiCi0jaW5jbHVkZSAiTUlFcnJvci5oIgotI2luY2x1ZGUgIk1JTWVtb3J5LmgiCi0jaW5jbHVkZSAiQ0xJT3V0cHV0LmgiCi0KLSNlbmRpZiAvKiBfTUlfSF8gKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQXJnLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUFyZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjYyYzY1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQXJnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLSNpbmNsdWRlICJNSVJlc3VsdC5oIgotI2luY2x1ZGUgIk1JQXJnLmgiCi0KLU1JQXJnICoKLU1JQXJnTmV3KHZvaWQpCi17Ci0JTUlBcmcgKglhcmcgPSAoTUlBcmcgKiltYWxsb2Moc2l6ZW9mKE1JQXJnKSk7Ci0JYXJnLT5uYW1lID0gTlVMTDsKLQlhcmctPnZhbHVlID0gTlVMTDsKLQlyZXR1cm4gYXJnOwotfQotCi12b2lkCi1NSUFyZ0ZyZWUoTUlBcmcgKmFyZykKLXsKLQlpZiAoYXJnLT5uYW1lICE9IE5VTEwpCi0JCWZyZWUoYXJnLT5uYW1lKTsKLQlpZiAoYXJnLT52YWx1ZSAhPSBOVUxMKQotCQlmcmVlKGFyZy0+dmFsdWUpOwotCWZyZWUoYXJnKTsKLX0KLQotLyoqCi0gKiBQYXJzaW5nIGEgTUlMaXN0IG9mIHRoZSBmb3JtOgotICogW3tuYW1lPSJ4eHgiLHZhbHVlPSJ5eXkifSx7bmFtZT0ieHh4Iix2YWx1ZT0ieXl5In0sLi5dCi0gKiBbbmFtZT0ieHh4IixuYW1lPSJ4eHgiLC4uXQotICogW3tuYW1lPSJ4eHgifSx7bmFtZT0ieHh4In1dCi0gKiAKLSAqIFBhcnNpbmcgYSBNSVR1cGxlIG9mIHRoZSBmb3JtOgotICoge3tuYW1lPSJ4eHgiLHZhbHVlPSJ5eXkifSx7bmFtZT0ieHh4Iix2YWx1ZT0ieXl5In0sLi59Ci0gKiB7bmFtZT0ieHh4IixuYW1lPSJ4eHgiLC4ufQotICoge3tuYW1lPSJ4eHgifSx7bmFtZT0ieHh4In19Ci0gKi8KLUxpc3QgKgotTUlBcmdzUGFyc2UoTUlWYWx1ZSAqbWlWYWx1ZSkgCi17Ci0JTGlzdCAqCQlhTGlzdCA9IE5ld0xpc3QoKTsKLQlMaXN0ICoJCXZhbHVlcyA9IG1pVmFsdWUtPnZhbHVlczsKLQlMaXN0ICoJCXJlc3VsdHMgPSBtaVZhbHVlLT5yZXN1bHRzOwotCU1JVmFsdWUgKgl2YWx1ZTsKLQlNSVJlc3VsdCAqCXJlc3VsdDsKLQkKLQlpZiAodmFsdWVzICE9IE5VTEwpIHsKLQkJZm9yIChTZXRMaXN0KHZhbHVlcyk7ICh2YWx1ZSA9IChNSVZhbHVlICopR2V0TGlzdEVsZW1lbnQodmFsdWVzKSkgIT0gTlVMTDsgKSB7Ci0JCQlpZiAodmFsdWUtPnR5cGUgPT0gTUlWYWx1ZVR5cGVUdXBsZSkgewotCQkJCU1JQXJnICphcmcgPSBNSUFyZ1BhcnNlKHZhbHVlKTsKLQkJCQlpZiAoYXJnICE9IE5VTEwpIHsKLQkJCQkJQWRkVG9MaXN0KGFMaXN0LCAodm9pZCAqKWFyZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCWlmIChyZXN1bHRzICE9IE5VTEwpIHsKLQkJZm9yIChTZXRMaXN0KHJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocmVzdWx0cykpICE9IE5VTEw7ICkgewotCQkJdmFsdWUgPSByZXN1bHQtPnZhbHVlOwotCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCQlNSUFyZyAqYXJnID0gTUlBcmdOZXcoKTsKLQkJCQlhcmctPm5hbWUgPSBzdHJkdXAodmFsdWUtPmNzdHJpbmcpOwotCQkJCUFkZFRvTGlzdChhTGlzdCwgKHZvaWQgKilhcmcpOwotCQkJfQotCQl9Ci0JfQotCQotCXJldHVybiBhTGlzdDsKLX0KLQotLyoqCi0gKiBQYXJzaW5nIGEgTUlUdXBsZSBvZiB0aGUgZm9ybToKLSAqIHtuYW1lPSJ4eHgiLHZhbHVlPSJ5eXkifQotICoge25hbWU9Inh4eCJ9Ci0gKi8KLU1JQXJnICoKLU1JQXJnUGFyc2UoTUlWYWx1ZSAqdHVwbGUpCi17Ci0JTUlWYWx1ZSAqCXZhbHVlOwotCU1JUmVzdWx0ICoJcmVzdWx0OwotCWNoYXIgKgkJc3RyOwotCU1JQXJnICoJCWFyZyA9IE1JQXJnTmV3KCk7Ci0JCi0JZm9yIChTZXRMaXN0KHR1cGxlLT5yZXN1bHRzKTsgKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHR1cGxlLT5yZXN1bHRzKSkgIT0gTlVMTDsgKSB7Ci0JCXZhbHVlID0gcmVzdWx0LT52YWx1ZTsKLQkJaWYgKHZhbHVlICE9IE5VTEwgJiYgdmFsdWUtPnR5cGUgPT0gTUlWYWx1ZVR5cGVDb25zdCkgewotCQkJc3RyID0gdmFsdWUtPmNzdHJpbmc7Ci0JCX0gZWxzZSB7Ci0JCQlzdHIgPSAiIjsKLQkJfQotCi0JCWlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgIm5hbWUiKSA9PSAwKSB7Ci0JCQlhcmctPm5hbWUgPSBzdHJkdXAoc3RyKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgInZhbHVlIikgPT0gMCkgewotCQkJYXJnLT52YWx1ZSA9IHN0cmR1cChzdHIpOwotCQl9Ci0JfQotCQotCXJldHVybiBhcmc7Ci19Ci0KLU1JU3RyaW5nICoKLU1JQXJnVG9TdHJpbmcoTUlBcmcgKmFyZykKLXsKLQlyZXR1cm4gTUlTdHJpbmdOZXcoIiVzPSVzIiwgYXJnLT5uYW1lLCBhcmctPnZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQXJnLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUFyZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Y2Mzg1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQXJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLQotI2lmbmRlZiBfTUlBUkdfSF8KLSNkZWZpbmUgX01JQVJHX0hfCi0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlTdHJpbmcuaCIKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2V0IG5hbWU9dmFsdWUuCi0gKi8KLXN0cnVjdCBNSUFyZyB7Ci0JY2hhciAqIG5hbWU7Ci0JY2hhciAqIHZhbHVlOwotfTsKLXR5cGVkZWYgc3RydWN0IE1JQXJnCU1JQXJnOwotCi1leHRlcm4gTUlBcmcgKk1JQXJnTmV3KHZvaWQpOwotZXh0ZXJuIHZvaWQgTUlBcmdGcmVlKE1JQXJnICphcmcpOwotZXh0ZXJuIExpc3QgKk1JQXJnc1BhcnNlKE1JVmFsdWUgKm1pVmFsdWUpOwotZXh0ZXJuIE1JQXJnICpNSUFyZ1BhcnNlKE1JVmFsdWUgKnR1cGxlKTsKLWV4dGVybiBNSVN0cmluZyAqTUlBcmdUb1N0cmluZyhNSUFyZyAqYXJnKTsKLSNlbmRpZiAvKiBfTUlBUkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQnJlYWtDb21tYW5kLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUJyZWFrQ29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTAwOWI2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQnJlYWtDb21tYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0gCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSUJyZWFrcG9pbnQuaCIKLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLSNpbmNsdWRlICJNSVN0cmluZy5oIgotCi1NSUNvbW1hbmQgKgotTUlCcmVha0luc2VydChpbnQgaXNUZW1wb3JhcnksIGludCBpc0hhcmR3YXJlLCBjaGFyICpjb25kaXRpb24sIGludCBpZ25vcmVDb3VudCwgY2hhciAqd2hlcmUsIGludCB0aWQpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCQotCWNtZCA9IE1JQ29tbWFuZE5ldygiLWJyZWFrLWluc2VydCIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0KLQlpZiAoaXNUZW1wb3JhcnkpIHsKLQkJTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgIi10IiwgTlVMTCk7Ci0JfSBlbHNlIGlmIChpc0hhcmR3YXJlKSB7Ci0JCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsICItaCIsIE5VTEwpOwotCX0KLQlpZiAoY29uZGl0aW9uICE9IE5VTEwpIHsKLQkJTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgIi1jIiwgY29uZGl0aW9uKTsKLQl9Ci0JaWYgKGlnbm9yZUNvdW50ID4gMCkgewotCQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCAiLWkiLCBNSUludFRvQ1N0cmluZyhpZ25vcmVDb3VudCkpOwotCX0KLQlpZiAodGlkID4gMCkgewotCQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCAiLXAiLCBNSUludFRvQ1N0cmluZyh0aWQpKTsKLQl9Ci0JCi0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgd2hlcmUsIE5VTEwpOwotCQotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSUJyZWFrRGVsZXRlKGludCBuYnBzLCBpbnQgKmJwaWRzKQotewotCWludCAJCQlpOwotCU1JQ29tbWFuZCAqCWNtZDsKLQkKLQljbWQgPSBNSUNvbW1hbmROZXcoIi1icmVhay1kZWxldGUiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCQotCWZvciAoaSA9IDA7IGkgPCBuYnBzOyBpKyspIHsKLQkJTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgTUlJbnRUb0NTdHJpbmcoYnBpZHNbaV0pLCBOVUxMKTsKLQl9Ci0JCi0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JQnJlYWtEaXNhYmxlKGludCBuYnBzLCBpbnQgKmJwaWRzKQotewotCWludCAJCWk7Ci0JTUlDb21tYW5kICoJY21kOwotCQotCWNtZCA9IE1JQ29tbWFuZE5ldygiLWJyZWFrLWRpc2FibGUiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCQotCWZvciAoaSA9IDA7IGkgPCBuYnBzOyBpKyspIHsKLQkJTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgTUlJbnRUb0NTdHJpbmcoYnBpZHNbaV0pLCBOVUxMKTsKLQl9Ci0JCi0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JQnJlYWtFbmFibGUoaW50IG5icHMsIGludCAqYnBpZHMpCi17Ci0JaW50IAkJaTsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItYnJlYWstZW5hYmxlIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbmJwczsgaSsrKSB7Ci0JCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKGJwaWRzW2ldKSwgTlVMTCk7Ci0JfQotCQotCXJldHVybiBjbWQ7Ci19Ci0KLS8vLWJyZWFrLWNvbmRpdGlvbiBOVU1CRVIgRVhQUgotTUlDb21tYW5kICoKLU1JQnJlYWtDb25kaXRpb24oaW50IG5icHMsIGludCAqYnBpZHMsIGNoYXIgKmV4cHIpCi17Ci0JaW50IAkJaTsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItYnJlYWstY29uZGl0aW9uIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbmJwczsgaSsrKSB7Ci0JCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKGJwaWRzW2ldKSwgZXhwcik7Ci0JfQkKLQlyZXR1cm4gY21kOwotfQotCi0vLy1icmVhay13YXRjaCBbIC1hIHwgLXIgXQotTUlDb21tYW5kICoKLU1JQnJlYWtXYXRjaChjaGFyICpleHByLCBpbnQgYWNjZXNzLCBpbnQgcmVhZCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItYnJlYWstd2F0Y2giLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCi0JaWYgKGFjY2VzcykgewotCQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCAiLWEiLCBOVUxMKTsKLQl9IGVsc2UgaWYgKHJlYWQpIHsKLQkJTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgIi1yIiwgTlVMTCk7Ci0JfQotCi0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgZXhwciwgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotLy8tYnJlYWstYWZ0ZXIgTlVNQkVSIENPVU5UCi1NSUNvbW1hbmQgKgotTUlCcmVha0FmdGVyKGludCBuYnBzLCBpbnQgKmJwaWRzLCBpbnQgaWdub3JlQ291bnQpCi17Ci0JaW50IGk7Ci0JTUlDb21tYW5kICoJY21kOwotCQotCWNtZCA9IE1JQ29tbWFuZE5ldygiLWJyZWFrLWFmdGVyIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuYnBzOyBpKyspIHsKLQkJTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgTUlJbnRUb0NTdHJpbmcoYnBpZHNbaV0pLCBNSUludFRvQ1N0cmluZyhpZ25vcmVDb3VudCkpOwotCX0JCi0JcmV0dXJuIGNtZDsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQnJlYWtwb2ludC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlCcmVha3BvaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MWFmNDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlCcmVha3BvaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0gCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSUJyZWFrcG9pbnQuaCIKLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLSNpbmNsdWRlICJNSVN0cmluZy5oIgotCi1NSUJyZWFrcG9pbnQgKgotTUlCcmVha3BvaW50TmV3KHZvaWQpCi17Ci0JTUlCcmVha3BvaW50ICoJYnA7Ci0JCi0JYnAgPSAoTUlCcmVha3BvaW50ICopbWFsbG9jKHNpemVvZihNSUJyZWFrcG9pbnQpKTsKLQlicC0+bnVtYmVyID0gMDsKLQlicC0+ZW5hYmxlZCA9IDA7Ci0JYnAtPmxpbmUgPSAwOwotCWJwLT50aW1lcyA9IDA7Ci0JYnAtPmlnbm9yZSA9IDA7Ci0JYnAtPmlzV3B0ID0gMDsKLQlicC0+aXNBV3B0ID0gMDsKLQlicC0+aXNSV3B0ID0gMDsKLQlicC0+aXNXV3B0ID0gMDsKLQlicC0+aXNIZHcgPSAwOwotCWJwLT50eXBlID0gTlVMTDsKLQlicC0+ZGlzcCA9IE5VTEw7Ci0JYnAtPmFkZHJlc3MgPSBOVUxMOwotCWJwLT5mdW5jID0gTlVMTDsKLQlicC0+ZmlsZSA9IE5VTEw7Ci0JYnAtPmNvbmQgPSBOVUxMOwotCWJwLT53aGF0ID0gTlVMTDsKLQlicC0+dGhyZWFkSWQgPSBOVUxMOwotCXJldHVybiBicDsKLX0KLQotdm9pZAotTUlCcmVha3BvaW50RnJlZShNSUJyZWFrcG9pbnQgKmJwKQotewotCWlmIChicC0+dHlwZSAhPSBOVUxMKQotCQlmcmVlKGJwLT50eXBlKTsKLQlpZiAoYnAtPmRpc3AgIT0gTlVMTCkKLQkJZnJlZShicC0+ZGlzcCk7Ci0JaWYgKGJwLT5hZGRyZXNzICE9IE5VTEwpCi0JCWZyZWUoYnAtPmFkZHJlc3MpOwotCWlmIChicC0+ZnVuYyAhPSBOVUxMKQotCQlmcmVlKGJwLT5mdW5jKTsKLQlpZiAoYnAtPmZpbGUgIT0gTlVMTCkKLQkJZnJlZShicC0+ZmlsZSk7Ci0JaWYgKGJwLT5jb25kICE9IE5VTEwpCi0JCWZyZWUoYnAtPmNvbmQpOwotCWlmIChicC0+d2hhdCAhPSBOVUxMKQotCQlmcmVlKGJwLT53aGF0KTsKLQlpZiAoYnAtPnRocmVhZElkICE9IE5VTEwpCi0JCWZyZWUoYnAtPnRocmVhZElkKTsKLQlmcmVlKGJwKTsKLX0KLQotTUlCcmVha3BvaW50ICoKLU1JQnJlYWtwb2ludFBhcnNlKE1JVmFsdWUgKnR1cGxlKSAKLXsKLQljaGFyICoJCQlzdHI7Ci0JY2hhciAqCQkJdmFyOwotCU1JVmFsdWUgKgkJdmFsdWU7Ci0JTUlSZXN1bHQgKgkJcmVzdWx0OwotCUxpc3QgKgkJCXJlc3VsdHMgPSB0dXBsZS0+cmVzdWx0czsKLQlNSUJyZWFrcG9pbnQgKglicCA9IE1JQnJlYWtwb2ludE5ldygpOwotCQotCWZvciAoU2V0TGlzdChyZXN1bHRzKTsgKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJlc3VsdHMpKSAhPSBOVUxMOykgewotCQl2YXIgPSByZXN1bHQtPnZhcmlhYmxlOwotCQl2YWx1ZSA9IHJlc3VsdC0+dmFsdWU7Ci0KLQkJaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUtPnR5cGUgIT0gTUlWYWx1ZVR5cGVDb25zdCkKLQkJCWNvbnRpbnVlOwotCi0JCXN0ciA9IHZhbHVlLT5jc3RyaW5nOwotCQkKLQkJaWYgKHN0cmNtcCh2YXIsICJudW1iZXIiKSA9PSAwKSB7Ci0JCQlicC0+bnVtYmVyID0gKGludClzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgInR5cGUiKSA9PSAwKSB7Ci0JCQlicC0+dHlwZSA9IHN0cmR1cChzdHIpOwotCQkJLy90eXBlPSJodyB3YXRjaHBvaW50IgotCQkJaWYgKHN0cm5jbXAoc3RyLCAiaHciLCAyKSA9PSAwKSB7Ci0JCQkJYnAtPmlzSGR3ID0gMTsKLQkJCQlicC0+aXNXV3B0ID0gMTsKLQkJCQlicC0+aXNXcHQgPSAxOwotCQkJfQotCQkJLy90eXBlPSJhY2Mgd2F0Y2hwb2ludCIKLQkJCWlmIChzdHJuY21wKHN0ciwgImFjYyIsIDMpID09IDApIHsKLQkJCQlicC0+aXNXV3B0ID0gMTsKLQkJCQlicC0+aXNSV3B0ID0gMTsKLQkJCQlicC0+aXNXcHQgPSAxOwotCQkJfQotCQkJLy90eXBlPSJyZWFkIHdhdGNocG9pbnQiCi0JCQlpZiAoc3RybmNtcChzdHIsICJyZWFkIiwgNCkgPT0gMCkgewotCQkJCWJwLT5pc1JXcHQgPSAxOwotCQkJCWJwLT5pc1dwdCA9IDE7Ci0JCQl9Ci0JCQkvLyA/PwotCQkJaWYgKHN0cmNtcChzdHIsICJ3YXRjaHBvaW50IikgPT0gMCkgewotCQkJCWJwLT5pc1dwdCA9IDE7Ci0JCQl9Ci0JCQkvLyB0eXBlPSJicmVha3BvaW50IgotCQkJLy8gZGVmYXVsdCBvay4KLQkJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAiZGlzcCIpID09IDApIHsKLQkJCWJwLT5kaXNwID0gc3RyZHVwKHN0cik7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImVuYWJsZWQiKSA9PSAwKSB7Ci0JCQlicC0+ZW5hYmxlZCA9IHN0cmNtcChzdHIsICJ5IikgPT0gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAiYWRkciIpID09IDApIHsKLQkJCWJwLT5hZGRyZXNzID0gc3RyZHVwKHN0cik7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImZ1bmMiKSA9PSAwKSB7Ci0JCQlicC0+ZnVuYyA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJmaWxlIikgPT0gMCkgewotCQkJYnAtPmZpbGUgPSBzdHJkdXAoc3RyKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAidGhyZWFkIikgPT0gMCkgewotCQkJYnAtPnRocmVhZElkID0gc3RyZHVwKHN0cik7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImxpbmUiKSA9PSAwKSB7Ci0JCQlicC0+bGluZSA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJ0aW1lcyIpID09IDApIHsKLQkJCWJwLT50aW1lcyA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJ3aGF0IikgPT0gMCB8fCBzdHJjbXAodmFyLCAiZXhwIikgPT0gMCkgeyAvLyROT04tTkxTLTIkCi0JCQlicC0+d2hhdCA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJpZ25vcmUiKSA9PSAwKSB7Ci0JCQlicC0+aWdub3JlID0gKGludClzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImNvbmQiKSA9PSAwKSB7Ci0JCQlicC0+Y29uZCA9IHN0cmR1cChzdHIpOwotCQl9Ci0JfQotCQotCXJldHVybiBicDsKLX0KLQotTGlzdCAqCi1NSUJyZWFrcG9pbnRHZXRCcmVha0luc2VydEluZm8oTUlDb21tYW5kICpjbWQpCi17Ci0JY2hhciAqCQkJdmFyOwotCU1JVmFsdWUgKgkJdmFsOwotCU1JUmVzdWx0ICoJCXJlc3VsdDsKLQlNSUJyZWFrcG9pbnQgKglicHQ7Ci0JTUlSZXN1bHRSZWNvcmQgKglycjsKLQlMaXN0ICoJCQlicmVha3BvaW50cyA9IE5VTEw7Ci0JCi0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JcnIgPSBjbWQtPm91dHB1dC0+cnI7Ci0JZm9yIChTZXRMaXN0KHJyLT5yZXN1bHRzKTsgKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJyLT5yZXN1bHRzKSkgIT0gTlVMTDsgKSB7Ci0JCXZhciA9IHJlc3VsdC0+dmFyaWFibGU7Ci0JCXZhbCA9IHJlc3VsdC0+dmFsdWU7Ci0JCQotCQlicHQgPSBOVUxMOwotCQlpZiAoc3RyY21wKHZhciwgIndwdCIpID09IDApIHsKLQkJCWlmICh2YWwtPnR5cGUgPT0gTUlWYWx1ZVR5cGVUdXBsZSkgewotCQkJCWJwdCA9IE1JQnJlYWtwb2ludFBhcnNlKHZhbCk7Ci0JCQkJYnB0LT5lbmFibGVkID0gMTsKLQkJCQlicHQtPmlzV3B0ID0gMTsKLQkJCQlicHQtPmlzV1dwdCA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImJrcHQiKSA9PSAwKSB7Ci0JCQlpZiAodmFsLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsKLQkJCQlicHQgPSBNSUJyZWFrcG9pbnRQYXJzZSh2YWwpOwotCQkJCWJwdC0+ZW5hYmxlZCA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImh3LWF3cHQiKSA9PSAwKSB7Ci0JCQlpZiAodmFsLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsKLQkJCQlicHQgPSBNSUJyZWFrcG9pbnRQYXJzZSh2YWwpOwotCQkJCWJwdC0+ZW5hYmxlZCA9IDE7Ci0JCQkJYnB0LT5pc1dwdCA9IDE7Ci0JCQkJYnB0LT5pc0FXcHQgPSAxOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJody1yd3B0IikgPT0gMCkgewotCQkJaWYgKHZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZVR1cGxlKSB7Ci0JCQkJYnB0ID0gTUlCcmVha3BvaW50UGFyc2UodmFsKTsKLQkJCQlicHQtPmVuYWJsZWQgPSAxOwotCQkJCWJwdC0+aXNXcHQgPSAxOwotCQkJCWJwdC0+aXNSV3B0ID0gMTsKLQkJCX0KLQkJfQotCQlpZiAoYnB0ICE9IE5VTEwpIHsKLQkJCWlmIChicmVha3BvaW50cyA9PSBOVUxMKQotCQkJCWJyZWFrcG9pbnRzID0gTmV3TGlzdCgpOwotCi0JCQlBZGRUb0xpc3QoYnJlYWtwb2ludHMsICh2b2lkICopYnB0KTsKLQkJfQotCX0KLQkJCi0JcmV0dXJuIGJyZWFrcG9pbnRzOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlCcmVha3BvaW50LmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUJyZWFrcG9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1ZGExNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUJyZWFrcG9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotICAKLS8qKgotICogQ29udGFpbiBpbmZvIGFib3V0IHRoZSBHREIvTUkgYnJlYWtwb2ludCBpbmZvLgotICo8dWw+Ci0gKiA8bGk+Ci0gKiAtYnJlYWstaW5zZXJ0IG1haW4KLSAqIF5kb25lLGJrcHQ9e251bWJlcj0iMSIsdHlwZT0iYnJlYWtwb2ludCIsZGlzcD0ia2VlcCIsZW5hYmxlZD0ieSIsYWRkcj0iMHgwODA0ODQ2YiIsZnVuYz0ibWFpbiIsZmlsZT0iaGVsbG8uYyIsbGluZT0iNCIsdGltZXM9IjAifQotICogKGdkYikKLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiAtYnJlYWstaW5zZXJ0IC10IG1haW4KLSAqIF5kb25lLGJrcHQ9e251bWJlcj0iMiIsdHlwZT0iYnJlYWtwb2ludCIsZGlzcD0iZGVsIixlbmFibGVkPSJ5IixhZGRyPSIweDA4MDQ4NDZiIixmdW5jPSJtYWluIixmaWxlPSJoZWxsby5jIixsaW5lPSI0Iix0aW1lcz0iMCJ9Ci0gKiA8L2xpPgotICogPGxpPgotICogLWJyZWFrLWluc2VydCAtYyAxIG1haW4KLV5kb25lLGJrcHQ9e251bWJlcj0iMyIsdHlwZT0iYnJlYWtwb2ludCIsZGlzcD0ia2VlcCIsZW5hYmxlZD0ieSIsYWRkcj0iMHgwODA0ODQ2YiIsZnVuYz0ibWFpbiIsZmlsZT0iaGVsbG8uYyIsbGluZT0iNCIsY29uZD0iMSIsdGltZXM9IjAifQotICogPC9saT4KLSAqIDxsaT4KLSAqIC1icmVhay1pbnNlcnQgLWggbWFpbgotICogXmRvbmUsYmtwdD17bnVtYmVyPSI0Iix0eXBlPSJodyBicmVha3BvaW50IixkaXNwPSJrZWVwIixlbmFibGVkPSJ5IixhZGRyPSIweDA4MDQ4NDZiIixmdW5jPSJtYWluIixmaWxlPSJoZWxsby5jIixsaW5lPSI0Iix0aW1lcz0iMCJ9Ci0gKiA8bGk+Ci0gKiAtYnJlYWstaW5zZXJ0IC1wIDAgbWFpbgotICogXmRvbmUsYmtwdD17bnVtYmVyPSI1Iix0eXBlPSJicmVha3BvaW50IixkaXNwPSJrZWVwIixlbmFibGVkPSJ5IixhZGRyPSIweDA4MDQ4NDZiIixmdW5jPSJtYWluIixmaWxlPSJoZWxsby5jIixsaW5lPSI0Iix0aHJlYWQ9IjAiLHRocmVhZD0iMCIsdGltZXM9IjAifQotICogPC9saT4KLSAqIDxsaT4KLSAqIC1icmVhay1pbnNlcnQgLWEgcAotICogXmRvbmUsaHctYXdwdD17bnVtYmVyPSIyIixleHA9InAifQotICogPC9saT4KLSAqIDxsaT4KLSAqIC1icmVhay13YXRjaCAtciBwCi0gKiBeZG9uZSxody1yd3B0PXtudW1iZXI9IjQiLGV4cD0icCJ9Ci0gKiA8L2xpPgotICogPGxpPgotICogLWJyZWFrLXdhdGNoIHAKLSAqIF5kb25lLHdwdD17bnVtYmVyPSI2IixleHA9InAifQotICogPC9saT4KLSAqPC91bD4KLSAqLwotI2lmbmRlZiBfTUlCUkVBS1BPSU5UX0hfCi0jZGVmaW5lIF9NSUJSRUFLUE9JTlRfSF8KLQotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLQotc3RydWN0IE1JQnJlYWtwb2ludCB7Ci0JaW50CQludW1iZXI7Ci0JY2hhciAqCXR5cGU7Ci0JY2hhciAqCWRpc3A7Ci0JaW50CQllbmFibGVkOwotCWNoYXIgKglhZGRyZXNzOwotCWNoYXIgKglmdW5jOwotCWNoYXIgKglmaWxlOwotCWludAkJbGluZTsKLQljaGFyICoJY29uZDsKLQlpbnQJCXRpbWVzOwotCWNoYXIgKgl3aGF0OwotCWNoYXIgKgl0aHJlYWRJZDsKLQlpbnQJCWlnbm9yZTsKLQotCWludAkJaXNXcHQ7Ci0JaW50CQlpc0FXcHQ7Ci0JaW50CQlpc1JXcHQ7Ci0JaW50CQlpc1dXcHQ7Ci0JaW50CQlpc0hkdzsKLX07Ci10eXBlZGVmIHN0cnVjdCBNSUJyZWFrcG9pbnQJTUlCcmVha3BvaW50OwotCi1leHRlcm4gTUlCcmVha3BvaW50ICpNSUJyZWFrcG9pbnROZXcodm9pZCk7Ci1leHRlcm4gdm9pZCBNSUJyZWFrcG9pbnRGcmVlKE1JQnJlYWtwb2ludCAqYnApOwotZXh0ZXJuIE1JQnJlYWtwb2ludCAqTUlCcmVha3BvaW50UGFyc2UoTUlWYWx1ZSAqdHVwbGUpOwotZXh0ZXJuIExpc3QgKk1JQnJlYWtwb2ludEdldEJyZWFrSW5zZXJ0SW5mbyhNSUNvbW1hbmQgKmNtZCk7Ci0jZW5kaWYgLyogX01JQlJFQUtQT0lOVF9IXyAqLwotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUNvbW1hbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQ29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTkwZWY0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQ29tbWFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIE1JQ09NTUFORF9PUFRfU0laRQkxMAotCi0jaW5jbHVkZSAiTUlDb21tYW5kLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLQotTUlDb21tYW5kICoKLU1JQ29tbWFuZE5ldyhjaGFyICpjb21tYW5kLCBpbnQgY2xhc3MpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCi0JY21kID0gKE1JQ29tbWFuZCAqKW1hbGxvYyhzaXplb2YoTUlDb21tYW5kKSk7Ci0JY21kLT5jb21tYW5kID0gc3RyZHVwKGNvbW1hbmQpOwotCWNtZC0+b3B0aW9ucyA9IChjaGFyICoqKW1hbGxvYyhNSUNPTU1BTkRfT1BUX1NJWkUgKiBzaXplb2YoY2hhciAqKSk7Ci0JY21kLT5vcHRfc2l6ZSA9IE1JQ09NTUFORF9PUFRfU0laRTsKLQljbWQtPm51bV9vcHRpb25zID0gMDsKLQljbWQtPmNvbXBsZXRlZCA9IDA7Ci0JY21kLT5leHBlY3RlZF9jbGFzcyA9IGNsYXNzOwotCWNtZC0+b3V0cHV0ID0gTlVMTDsKLQljbWQtPmNhbGxiYWNrID0gTlVMTDsKLQlyZXR1cm4gY21kOwotfQotCi12b2lkCi1NSUNvbW1hbmRGcmVlKE1JQ29tbWFuZCAqY21kKQotewotCWludCBpOwotCi0JaWYgKGNtZC0+Y29tbWFuZCAhPSBOVUxMKQotCQlmcmVlKGNtZC0+Y29tbWFuZCk7Ci0JaWYgKGNtZC0+bnVtX29wdGlvbnMgPiAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjbWQtPm51bV9vcHRpb25zOyBpKyspCi0JCQlmcmVlKGNtZC0+b3B0aW9uc1tpXSk7Ci0JCWZyZWUoY21kLT5vcHRpb25zKTsKLQl9Ci0JaWYgKGNtZC0+b3V0cHV0ICE9IE5VTEwpCi0JCU1JT3V0cHV0RnJlZShjbWQtPm91dHB1dCk7Ci0JZnJlZShjbWQpOwotfQotCi12b2lkCi1NSUNvbW1hbmRBZGRPcHRpb24oTUlDb21tYW5kICpjbWQsIGNoYXIgKm9wdCwgY2hhciAqYXJnKQotewotCWludCBhZGQgPSAxOwotCi0JaWYgKGFyZyAhPSBOVUxMKQotCQlhZGQrKzsKLQotCWlmIChjbWQtPm51bV9vcHRpb25zICsgYWRkID4gY21kLT5vcHRfc2l6ZSkgewotCQljbWQtPm9wdF9zaXplICs9IE1JQ09NTUFORF9PUFRfU0laRTsKLQkJY21kLT5vcHRpb25zID0gKGNoYXIgKiopcmVhbGxvYyhjbWQtPm9wdGlvbnMsIGNtZC0+b3B0X3NpemUgKiBzaXplb2YoY2hhciAqKSk7Ci0JfQotCi0JY21kLT5vcHRpb25zW2NtZC0+bnVtX29wdGlvbnMrK10gPSBzdHJkdXAob3B0KTsKLQotCWlmIChhcmcgIT0gTlVMTCkKLQkJY21kLT5vcHRpb25zW2NtZC0+bnVtX29wdGlvbnMrK10gPSBzdHJkdXAoYXJnKTsKLX0KLQotdm9pZAotTUlDb21tYW5kUmVnaXN0ZXJDYWxsYmFjayhNSUNvbW1hbmQgKmNtZCwgdm9pZCAoKmNhbGxiYWNrKShNSVJlc3VsdFJlY29yZCAqLCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCWNtZC0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKLQljbWQtPmNiX2RhdGEgPSBkYXRhOwotfQotCi1pbnQKLU1JQ29tbWFuZENvbXBsZXRlZChNSUNvbW1hbmQgKmNtZCkKLXsKLQlyZXR1cm4gY21kLT5jb21wbGV0ZWQ7Ci19Ci0KLU1JUmVzdWx0UmVjb3JkICoKLU1JQ29tbWFuZFJlc3VsdChNSUNvbW1hbmQgKmNtZCkKLXsKLQlpZiAoY21kLT5vdXRwdXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGNtZC0+b3V0cHV0LT5ycjsKLX0KLQotaW50Ci1NSUNvbW1hbmRSZXN1bHRPSyhNSUNvbW1hbmQgKmNtZCkKLXsKLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNtZC0+b3V0cHV0LT5yci0+cmVzdWx0Q2xhc3MgPT0gY21kLT5leHBlY3RlZF9jbGFzczsKLX0KLQotaW50Ci1NSUNvbW1hbmRSZXN1bHRDbGFzcyhNSUNvbW1hbmQgKmNtZCkKLXsKLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybiBNSVJlc3VsdFJlY29yZElOVkFMSUQ7Ci0KLQlyZXR1cm4gY21kLT5vdXRwdXQtPnJyLT5yZXN1bHRDbGFzczsKLX0KLQotY2hhciAqCi1NSUNvbW1hbmRSZXN1bHRFcnJvck1lc3NhZ2UoTUlDb21tYW5kICpjbWQpCi17Ci0JTUlSZXN1bHQgKglyOwotCU1JU3RyaW5nICoJczsKLQljaGFyICoJCXJlcyA9IE5VTEw7Ci0KLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKE1JQ29tbWFuZFJlc3VsdENsYXNzKGNtZCkgIT0gTUlSZXN1bHRSZWNvcmRFUlJPUikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlmb3IgKFNldExpc3QoY21kLT5vdXRwdXQtPnJyLT5yZXN1bHRzKTsgKHIgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChjbWQtPm91dHB1dC0+cnItPnJlc3VsdHMpKSAhPSBOVUxMOykgewotCQlpZiAoci0+dmFsdWUgIT0gTlVMTCkgewotCQkJcyA9IE1JVmFsdWVUb1N0cmluZyhyLT52YWx1ZSk7Ci0JCQlyZXMgPSBzdHJkdXAoTUlTdHJpbmdUb0NTdHJpbmcocykpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1jaGFyICoKLU1JQ29tbWFuZFRvU3RyaW5nKE1JQ29tbWFuZCAqY21kKQotewotCWludAkJCQlpOwotCWludAkJCQljbWRfbGVuID0gc3RybGVuKGNtZC0+Y29tbWFuZCk7Ci0JaW50CQkJCXNpemU7Ci0JY2hhciAqCQkJczsKLQlzdGF0aWMgaW50CQlzdHJfc2l6ZSA9IDA7Ci0Jc3RhdGljIGNoYXIgKglzdHJfcmVzID0gTlVMTDsKLQotCXNpemUgPSBjbWRfbGVuICsgMzsKLQotCWZvciAoaSA9IDA7IGkgPCBjbWQtPm51bV9vcHRpb25zOyBpKyspCi0JCXNpemUgKz0gc3RybGVuKGNtZC0+b3B0aW9uc1tpXSkgKyAxOwotCi0JaWYgKHNpemUgPiBzdHJfc2l6ZSkgewotCQlpZiAoc3RyX3JlcyAhPSBOVUxMKQotCQkJZnJlZShzdHJfcmVzKTsKLQkJc3RyX3JlcyA9IChjaGFyICopbWFsbG9jKHNpemUpOwotCQlzdHJfc2l6ZSA9IHNpemU7Ci0KLQl9Ci0KLQotCXMgPSBzdHJfcmVzOwotCW1lbWNweShzLCBjbWQtPmNvbW1hbmQsIGNtZF9sZW4pOwotCXMgKz0gY21kX2xlbjsKLQotCWZvciAoaSA9IDA7IGkgPCBjbWQtPm51bV9vcHRpb25zOyBpKyspIHsKLQkJaW50IGxlbiA9IHN0cmxlbihjbWQtPm9wdGlvbnNbaV0pOwotCQkqcysrID0gJyAnOwotCQltZW1jcHkocywgY21kLT5vcHRpb25zW2ldLCBsZW4pOwotCQlzICs9IGxlbjsKLQl9Ci0KLQkqcysrID0gJ1xuJzsKLQkqcysrID0gJ1wwJzsKLQotCXJldHVybiBzdHJfcmVzOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUNvbW1hbmQuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQ29tbWFuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTUwNjU2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JQ29tbWFuZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSNpZm5kZWYgX01JQ09NTUFORF9IXwotI2RlZmluZSBfTUlDT01NQU5EX0hfCi0KLSNpbmNsdWRlICJNSVJlc3VsdFJlY29yZC5oIgotI2luY2x1ZGUgIk1JT3V0cHV0LmgiCi0KLXN0cnVjdCBNSVNlc3Npb247Ci0KLXN0cnVjdCBNSUNvbW1hbmQgewotCWNoYXIgKgkJCWNvbW1hbmQ7CQkJCQkJCQkvKiBjb21tYW5kIHRvIGV4ZWN1dGUgKi8KLQljaGFyICoqCQkJb3B0aW9uczsJCQkJCQkJCS8qIGNvbW1hbmQgb3B0aW9ucyAqLwotCWludAkJCQludW1fb3B0aW9uczsJCQkJCQkJLyogbnVtYmVyIG9mIG9wdGlvbnMgZm9yIGNvbW1hbmQgKi8KLQlpbnQJCQkJb3B0X3NpemU7CQkJCQkJCQkvKiBhbGxvY2F0ZWQgc2l6ZSBvZiBvcHRpb25zICovCi0JaW50CQkJCWNvbXBsZXRlZDsJCQkJCQkJCS8qIGNvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkICovCi0JaW50CQkJCWV4cGVjdGVkX2NsYXNzOwotCU1JT3V0cHV0ICoJCW91dHB1dDsJCQkJCQkJCQkvKiByZXN1bHQgZnJvbSBjb21wbGV0ZWQgY29tbWFuZCAqLwotCXZvaWQJCQkoKmNhbGxiYWNrKShNSVJlc3VsdFJlY29yZCAqLCB2b2lkICopOwkvKiBjb21tYW5kIGNvbXBsZXRlZCBjYWxsYmFjayAqLwotCXZvaWQgKgkJCWNiX2RhdGE7CQkJCQkJCQkvKiBjYWxsYmFjayBkYXRhICovCi19OwotdHlwZWRlZiBzdHJ1Y3QgTUlDb21tYW5kCU1JQ29tbWFuZDsKLQotZXh0ZXJuIE1JQ29tbWFuZCAqTUlDb21tYW5kTmV3KGNoYXIgKiwgaW50KTsKLWV4dGVybiB2b2lkIE1JQ29tbWFuZEZyZWUoTUlDb21tYW5kICpjbWQpOwotZXh0ZXJuIHZvaWQgTUlDb21tYW5kQWRkT3B0aW9uKE1JQ29tbWFuZCAqY21kLCBjaGFyICpvcHQsIGNoYXIgKmFyZyk7Ci1leHRlcm4gaW50IE1JQ29tbWFuZENvbXBsZXRlZChNSUNvbW1hbmQgKmNtZCk7Ci1leHRlcm4gaW50IE1JQ29tbWFuZFJlc3VsdE9LKE1JQ29tbWFuZCAqY21kKTsKLWV4dGVybiBNSVJlc3VsdFJlY29yZCAqTUlDb21tYW5kUmVzdWx0KE1JQ29tbWFuZCAqY21kKTsKLWV4dGVybiBpbnQgTUlDb21tYW5kUmVzdWx0Q2xhc3MoTUlDb21tYW5kICpjbWQpOwotZXh0ZXJuIGNoYXIgKk1JQ29tbWFuZFJlc3VsdEVycm9yTWVzc2FnZShNSUNvbW1hbmQgKmNtZCk7Ci1leHRlcm4gdm9pZCBNSUNvbW1hbmRSZWdpc3RlckNhbGxiYWNrKE1JQ29tbWFuZCAqY21kLCB2b2lkICgqY2FsbGJhY2spKE1JUmVzdWx0UmVjb3JkICosIHZvaWQgKiksIHZvaWQgKmRhdGEpOwotZXh0ZXJuIGNoYXIgKk1JQ29tbWFuZFRvU3RyaW5nKE1JQ29tbWFuZCAqY21kKTsKLQotLyoKLSAqIC1nZGItKiBjb21tYW5kcwotICovCi1leHRlcm4gTUlDb21tYW5kICpNSUdEQlNldChjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gTUlDb21tYW5kICpNSUdEQkV4aXQodm9pZCk7Ci1leHRlcm4gTUlDb21tYW5kICpNSUdEQlNob3dFbmRpYW4odm9pZCk7Ci1leHRlcm4gTUlDb21tYW5kICpNSUdEQlZlcnNpb24odm9pZCk7Ci0KLS8qCi0gKiAtZXhlYy0qIGNvbW1hbmRzCi0gKi8KLWV4dGVybiBNSUNvbW1hbmQgKk1JRXhlY0FyZ3VtZW50cyhjaGFyICoqKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JRXhlY0NvbnRpbnVlKHZvaWQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlFeGVjUnVuKHZvaWQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlFeGVjU3RlcChpbnQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlFeGVjTmV4dChpbnQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlFeGVjRmluaXNoKHZvaWQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlFeGVjSW50ZXJydXB0KHZvaWQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlFeGVjVXRpbChjaGFyKik7Ci0KLS8qCi0gKiAtYnJlYWstKiBjb21tYW5kcwotICovCi1leHRlcm4gTUlDb21tYW5kICpNSUJyZWFrSW5zZXJ0KGludCBpc1RlbXBvcmFyeSwgaW50IGlzSGFyZHdhcmUsIGNoYXIgKmNvbmRpdGlvbiwgaW50IGlnbm9yZUNvdW50LCBjaGFyICpsaW5lLCBpbnQgdGlkKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JQnJlYWtEZWxldGUoaW50IG5icHMsIGludCAqYnBpZHMpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlCcmVha0Rpc2FibGUoaW50IG5icHMsIGludCAqYnBpZHMpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlCcmVha0VuYWJsZShpbnQgbmJwcywgaW50ICpicGlkcyk7Ci1leHRlcm4gTUlDb21tYW5kICpNSUJyZWFrQ29uZGl0aW9uKGludCBuYnBzLCBpbnQgKmJwaWRzLCBjaGFyICpleHByKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JQnJlYWtXYXRjaChjaGFyICpleHByLCBpbnQgYWNjZXNzLCBpbnQgcmVhZCk7Ci1leHRlcm4gTUlDb21tYW5kICpNSUJyZWFrQWZ0ZXIoaW50IG5icHMsIGludCAqYnBpZHMsIGludCBpZ25vcmVDb3VudCk7Ci0KLS8qCi0gKiAtc3RhY2stKiBjb21tYW5kcwotICovCi1leHRlcm4gTUlDb21tYW5kICpNSVN0YWNrU2VsZWN0RnJhbWUoaW50IGxldmVsKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JU3RhY2tMaXN0RnJhbWVzKGludCBsb3csIGludCBoaWdoKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JU3RhY2tMaXN0QWxsRnJhbWVzKHZvaWQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlTdGFja0xpc3RMb2NhbHMoaW50IHZhbHMpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlTdGFja0xpc3RBcmd1bWVudHMoaW50IHZhbHMsIGludCBsb3csIGludCBoaWdoKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JU3RhY2tMaXN0QWxsQXJndW1lbnRzKGludCB2YWxzKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JU3RhY2tJbmZvRnJhbWUodm9pZCk7Ci1leHRlcm4gTUlDb21tYW5kICpNSVN0YWNrSW5mb0RlcHRoKHZvaWQpOwotZXh0ZXJuIE1JQ29tbWFuZCAqQ0xJRnJhbWUodm9pZCk7Ci0KLS8qCi0gKiAtdmFyLSogY29tbWFuZHMKLSAqLwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlWYXJDcmVhdGUoY2hhciAqbmFtZSwgY2hhciAqZnJhbWUsIGNoYXIgKmV4cHIpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlWYXJEZWxldGUoY2hhciAqbmFtZSk7Ci1leHRlcm4gTUlDb21tYW5kICpNSVZhckxpc3RDaGlsZHJlbihjaGFyICpuYW1lKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JVmFyRXZhbHVhdGVFeHByZXNzaW9uKGNoYXIgKm5hbWUpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlEYXRhRXZhbHVhdGVFeHByZXNzaW9uKGNoYXIgKm5hbWUpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlWYXJVcGRhdGUoY2hhciAqbmFtZSk7Ci1leHRlcm4gTUlDb21tYW5kICpNSVZhckluZm9UeXBlKGNoYXIgKm5hbWUpOwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlWYXJJbmZvTnVtQ2hpbGRyZW4oY2hhciAqbmFtZSk7Ci0KLS8qCi0gKiAtdGhyZWFkLSogY29tbWFuZHMKLSAqLwotZXh0ZXJuIE1JQ29tbWFuZCAqQ0xJSW5mb1RocmVhZHModm9pZCk7Ci1leHRlcm4gTUlDb21tYW5kICpNSVRocmVhZFNlbGVjdChpbnQgdGhyZWFkTnVtKTsKLQotLyoKLSAqIC1kYXRhLSogY29tbWFuZHMKLSAqLwotZXh0ZXJuIE1JQ29tbWFuZCAqTUlEYXRhUmVhZE1lbW9yeShsb25nLCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIGludCwgY2hhciAqKTsKLWV4dGVybiBNSUNvbW1hbmQgKk1JRGF0YVdyaXRlTWVtb3J5KGxvbmcgb2Zmc2V0LCBjaGFyICogYWRkcmVzcywgY2hhciAqIGZvcm1hdCwgaW50IHdvcmRTaXplLCBjaGFyICogdmFsdWUpOwotCi0jaWZkZWYgX19BUFBMRV9fCi1leHRlcm4gTUlDb21tYW5kICpNSVBpZEluZm8odm9pZCk7Ci0jZW5kaWYgLyogX19BUFBMRV9fICovCi0KLS8qCi0gKiBOb24tTUkgY29tbWFuZHMKLSAqLwotZXh0ZXJuIE1JQ29tbWFuZCAqQ0xJUFR5cGUoY2hhciAqbmFtZSk7Ci0KLS8qCi0gKiBzaWduYWwgY29tbWFuZHMKLSAqLwotZXh0ZXJuIE1JQ29tbWFuZCAqQ0xJTGlzdFNpZ25hbHMoY2hhciAqKTsKLWV4dGVybiBNSUNvbW1hbmQgKkNMSVNpZ25hbEluZm8oY2hhciAqKTsKLWV4dGVybiBNSUNvbW1hbmQgKkNMSUhhbmRsZShjaGFyICopOwotCi0jZW5kaWYgLyogX01JQ09NTUFORF9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFcnJvci5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGEzY2IxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYgLyogX19nbnVfbGludXhfXyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIk1JRXJyb3IuaCIKLQotc3RhdGljIGludCAJCU1JRXJyb3JOdW0gPSAwOwotc3RhdGljIGNoYXIgKglNSUVycm9yU3RyID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKiBNSUVycm9yVGFiW10gPQotewotCSJOT19FUlJPUiIsCi0JIlN5c3RlbSBlcnJvcjogJXMiLAotCSJHREIgc2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBvciB3YXMgdGVybWluYXRlZCIsCi19OwotCi0vKgotICogRXJyb3IgaGFuZGxpbmcKLSAqLwotdm9pZAotTUlTZXRFcnJvcihpbnQgZXJybnVtLCBjaGFyICptc2cpCi17Ci0JTUlFcnJvck51bSA9IGVycm51bTsKLQkKLQlpZiAoTUlFcnJvclN0ciAhPSBOVUxMKSB7Ci0JCWZyZWUoTUlFcnJvclN0cik7Ci0JCU1JRXJyb3JTdHIgPSBOVUxMOwotCX0KLQkKLQlpZiAoTUlFcnJvck51bSA+PSBzaXplb2YoTUlFcnJvclRhYikvc2l6ZW9mKGNoYXIgKikpIHsKLQkJaWYgKG1zZyAhPSBOVUxMKSB7Ci0JCQlNSUVycm9yU3RyID0gc3RyZHVwKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3ByaW50ZigmTUlFcnJvclN0ciwgIkVycm9yICVkIG9jY3VycmVkLiIsIE1JRXJyb3JOdW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKG1zZyA9PSBOVUxMKQotCQkJbXNnID0gIjxudWxsPiI7Ci0JCQkKLQkJYXNwcmludGYoJk1JRXJyb3JTdHIsIE1JRXJyb3JUYWJbTUlFcnJvck51bV0sIG1zZyk7Ci0JfQotfQotCi1pbnQKLU1JR2V0RXJyb3Iodm9pZCkKLXsKLQlyZXR1cm4gTUlFcnJvck51bTsKLX0KLQotY2hhciAqCi1NSUdldEVycm9yU3RyKHZvaWQpCi17Ci0JaWYgKE1JRXJyb3JTdHIgPT0gTlVMTCkKLQkJcmV0dXJuICIiOwotCQkKLQlyZXR1cm4gTUlFcnJvclN0cjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRXJyb3IuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMzQ3Ny4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUVycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9NSUVSUk9SX0hfCi0jZGVmaW5lIF9NSUVSUk9SX0hfCi0KLSNkZWZpbmUgTUlfRVJST1JfU1lTVEVNCTEKLSNkZWZpbmUgTUlfRVJST1JfU0VTU0lPTgkyCi0KLWV4dGVybiB2b2lkIE1JU2V0RXJyb3IoaW50IGVycm51bSwgY2hhciAqbXNnKTsKLWV4dGVybiBpbnQgTUlHZXRFcnJvcih2b2lkKTsKLWV4dGVybiBjaGFyICpNSUdldEVycm9yU3RyKHZvaWQpOwotI2VuZGlmIC8qIF9NSUVSUk9SX0hfICovCi0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFdmVudC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFdmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNkZjQ4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JRXZlbnQuaCIKLSNpbmNsdWRlICJNSVJlc3VsdC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLQotc3RhdGljIHZvaWQgTUlFdmVudFBhcnNlU3RvcHBlZChNSUV2ZW50ICpldmVudCwgTGlzdCAqcmVzdWx0cyk7Ci1zdGF0aWMgdm9pZCBNSUV2ZW50UGFyc2VWYWx1ZShNSUV2ZW50ICpldmVudCwgTGlzdCAqcmVzdWx0cyk7Ci1zdGF0aWMgdm9pZCBNSUV2ZW50UGFyc2VXUFQoTUlFdmVudCAqZXZlbnQsIExpc3QgKnJlc3VsdHMpOwotCi1NSUV2ZW50ICoKLU1JRXZlbnROZXcoaW50IGNsYXNzLCBpbnQgdHlwZSkKLXsKLQlNSUV2ZW50ICogZXZlbnQgPSAoTUlFdmVudCAqKW1hbGxvYyhzaXplb2YoTUlFdmVudCkpOwotCWV2ZW50LT5jbGFzcyA9IGNsYXNzOwotCWV2ZW50LT50eXBlID0gdHlwZTsKLQkKLQlldmVudC0+dGhyZWFkSWQgPSAwOwotCWV2ZW50LT5ia3B0bm8gPSAwOwotCWV2ZW50LT5udW1iZXIgPSAwOwotCWV2ZW50LT5jb2RlID0gMDsKLQlldmVudC0+ZnJhbWUgPSBOVUxMOwotCWV2ZW50LT5zaWdOYW1lID0gTlVMTDsKLQlldmVudC0+c2lnTWVhbmluZyA9IE5VTEw7Ci0JZXZlbnQtPmdkYlJlc3VsdCA9IE5VTEw7Ci0JZXZlbnQtPnJldHVyblZhbHVlID0gTlVMTDsKLQlldmVudC0+cmV0dXJuVHlwZSA9IE5VTEw7Ci0JZXZlbnQtPmV4cCA9IE5VTEw7Ci0JZXZlbnQtPm9sZFZhbHVlID0gTlVMTDsKLQlldmVudC0+bmV3VmFsdWUgPSBOVUxMOwotCQotCXJldHVybiBldmVudDsKLX0KLQotdm9pZAotTUlFdmVudEZyZWUoTUlFdmVudCAqZXZlbnQpCi17Ci0JaWYgKGV2ZW50LT5mcmFtZSAhPSBOVUxMKQotCQlNSUZyYW1lRnJlZShldmVudC0+ZnJhbWUpOwotCWlmIChldmVudC0+c2lnTmFtZSAhPSBOVUxMKQotCQlmcmVlKGV2ZW50LT5zaWdOYW1lKTsKLQlpZiAoZXZlbnQtPnNpZ01lYW5pbmcgIT0gTlVMTCkKLQkJZnJlZShldmVudC0+c2lnTWVhbmluZyk7Ci0JaWYgKGV2ZW50LT5nZGJSZXN1bHQgIT0gTlVMTCkKLQkJZnJlZShldmVudC0+Z2RiUmVzdWx0KTsKLQlpZiAoZXZlbnQtPnJldHVyblZhbHVlICE9IE5VTEwpCi0JCWZyZWUoZXZlbnQtPnJldHVyblZhbHVlKTsKLQlpZiAoZXZlbnQtPnJldHVyblR5cGUgIT0gTlVMTCkKLQkJZnJlZShldmVudC0+cmV0dXJuVHlwZSk7Ci0JaWYgKGV2ZW50LT5leHAgIT0gTlVMTCkKLQkJZnJlZShldmVudC0+ZXhwKTsKLQlpZiAoZXZlbnQtPm9sZFZhbHVlICE9IE5VTEwpCi0JCWZyZWUoZXZlbnQtPm9sZFZhbHVlKTsKLQlpZiAoZXZlbnQtPm5ld1ZhbHVlICE9IE5VTEwpCi0JCWZyZWUoZXZlbnQtPm5ld1ZhbHVlKTsKLQlmcmVlKGV2ZW50KTsKLX0KLQotTUlFdmVudCAqCi1NSUV2ZW50Q3JlYXRlU3RvcHBlZEV2ZW50KGNoYXIgKnJlYXNvbiwgTGlzdCAqcmVzdWx0cykKLXsKLQlNSUV2ZW50ICoJZXZlbnQgPSBOVUxMOwotCQotCWlmIChzdHJjbXAocmVhc29uLCAiYnJlYWtwb2ludC1oaXQiKSA9PSAwKSB7Ci0JCWV2ZW50ID0gTUlFdmVudE5ldyhNSUV2ZW50Q2xhc3NTdG9wcGVkLCBNSUV2ZW50VHlwZUJyZWFrcG9pbnRIaXQpOwotCX0gZWxzZSBpZiAoCi0JCXN0cmNtcChyZWFzb24sICJ3YXRjaHBvaW50LXRyaWdnZXIiKSA9PSAwCi0JCQl8fCBzdHJjbXAocmVhc29uLCAicmVhZC13YXRjaHBvaW50LXRyaWdnZXIiKSA9PSAwCi0JCQl8fCBzdHJjbXAocmVhc29uLCAiYWNjZXNzLXdhdGNocG9pbnQtdHJpZ2dlciIpID09IDApIHsKLQkJZXZlbnQgPSBNSUV2ZW50TmV3KE1JRXZlbnRDbGFzc1N0b3BwZWQsIE1JRXZlbnRUeXBlV2F0Y2hwb2ludFRyaWdnZXIpOwotCX0gZWxzZSBpZiAoc3RyY21wKHJlYXNvbiwgIndhdGNocG9pbnQtc2NvcGUiKSA9PSAwKSB7Ci0JCWV2ZW50ID0gTUlFdmVudE5ldyhNSUV2ZW50Q2xhc3NTdG9wcGVkLCBNSUV2ZW50VHlwZVdhdGNocG9pbnRTY29wZSk7Ci0JfSBlbHNlIGlmIChzdHJjbXAocmVhc29uLCAiZW5kLXN0ZXBwaW5nLXJhbmdlIikgPT0gMCkgewotCQlldmVudCA9IE1JRXZlbnROZXcoTUlFdmVudENsYXNzU3RvcHBlZCwgTUlFdmVudFR5cGVTdGVwcGluZ1JhbmdlKTsKLQl9IGVsc2UgaWYgKHN0cmNtcChyZWFzb24sICJzaWduYWwtcmVjZWl2ZWQiKSA9PSAwKSB7Ci0JCWV2ZW50ID0gTUlFdmVudE5ldyhNSUV2ZW50Q2xhc3NTdG9wcGVkLCBNSUV2ZW50VHlwZVNpZ25hbCk7Ci0JfSBlbHNlIGlmIChzdHJjbXAocmVhc29uLCAibG9jYXRpb24tcmVhY2hlZCIpID09IDApIHsKLQkJZXZlbnQgPSBNSUV2ZW50TmV3KE1JRXZlbnRDbGFzc1N0b3BwZWQsIE1JRXZlbnRUeXBlTG9jYXRpb25SZWFjaGVkKTsKLQl9IGVsc2UgaWYgKHN0cmNtcChyZWFzb24sICJmdW5jdGlvbi1maW5pc2hlZCIpID09IDApIHsKLQkJZXZlbnQgPSBNSUV2ZW50TmV3KE1JRXZlbnRDbGFzc1N0b3BwZWQsIE1JRXZlbnRUeXBlRnVuY3Rpb25GaW5pc2hlZCk7Ci0JfSBlbHNlIGlmIChzdHJjbXAocmVhc29uLCAiZXhpdGVkLW5vcm1hbGx5IikgPT0gMCB8fCBzdHJjbXAocmVhc29uLCAiZXhpdGVkIikgPT0gMCkgewotCQlldmVudCA9IE1JRXZlbnROZXcoTUlFdmVudENsYXNzU3RvcHBlZCwgTUlFdmVudFR5cGVJbmZlcmlvckV4aXQpOwotCX0gZWxzZSBpZiAoc3RyY21wKHJlYXNvbiwgImV4aXRlZC1zaWduYWxsZWQiKSA9PSAwKSB7Ci0JCWV2ZW50ID0gTUlFdmVudE5ldyhNSUV2ZW50Q2xhc3NTdG9wcGVkLCBNSUV2ZW50VHlwZUluZmVyaW9yU2lnbmFsRXhpdCk7Ci0JfSBlbHNlIGlmIChzdHJjbXAocmVhc29uLCAidGVtcG9yYXJ5LWJyZWFrcG9pbnQtaGl0IikgPT0gMCkgewotCQkvKgotCQkgKiB0ZW1wb3JhcnktYnJlYWtwb2ludC1oaXQgaXMgYSBmYWtlIHJlYXNvbiB3ZSB1c2UgYmVjYXVzZSBMaW51eAotCQkgKiBzdXBwb3J0IGZvciB0ZW1wb3JhcnkgYnJlYWtwb2ludHMgaXMgYnJva2VuLgotCQkgKi8gCi0JCWV2ZW50ID0gTUlFdmVudE5ldyhNSUV2ZW50Q2xhc3NTdG9wcGVkLCBNSUV2ZW50VHlwZVN1c3BlbmRlZCk7Ci0JfQotCQotCU1JRXZlbnRQYXJzZVN0b3BwZWQoZXZlbnQsIHJlc3VsdHMpOwotCXJldHVybiBldmVudDsKLX0KLQotc3RhdGljIHZvaWQKLU1JRXZlbnRQYXJzZVN0b3BwZWQoTUlFdmVudCAqZXZlbnQsIExpc3QgKnJlc3VsdHMpCi17Ci0JY2hhciAqCQlzdHIgPSAiIjsKLQlNSVJlc3VsdCAqCXJlczsKLQlNSVZhbHVlICoJdmFsdWU7Ci0JCi0JaWYgKHJlc3VsdHMgIT0gTlVMTCkgewotCQlmb3IgKFNldExpc3QocmVzdWx0cyk7IChyZXMgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyZXN1bHRzKSkgIT0gTlVMTDsgKSB7Ci0JCQl2YWx1ZSA9IHJlcy0+dmFsdWU7Ci0JCQlpZiAodmFsdWUgIT0gTlVMTCAmJiB2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQkJc3RyID0gdmFsdWUtPmNzdHJpbmc7Ci0JCQl9Ci0JCi0JCQlpZiAoc3RyY21wKHJlcy0+dmFyaWFibGUsICJia3B0bm8iKSA9PSAwKSB7Ci0JCQkJZXZlbnQtPmJrcHRubyA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQkJfSBlbHNlIGlmIChzdHJjbXAocmVzLT52YXJpYWJsZSwgIndwdCIpID09IDAgfHwgc3RyY21wKHJlcy0+dmFyaWFibGUsICJody1hd3B0IikgPT0gMHx8IHN0cmNtcChyZXMtPnZhcmlhYmxlLCAiaHctcndwdCIpID09IDApIHsKLQkJCQlpZiAodmFsdWUtPnR5cGUgPT0gTUlWYWx1ZVR5cGVUdXBsZSkgewotCQkJCQlNSUV2ZW50UGFyc2VXUFQoZXZlbnQsIHZhbHVlLT5yZXN1bHRzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAidmFsdWUiKSA9PSAwKSB7Ci0JCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsKLQkJCQkJTUlFdmVudFBhcnNlVmFsdWUoZXZlbnQsIHZhbHVlLT5yZXN1bHRzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAid3BudW0iKSA9PSAwKSB7Ci0JCQkJZXZlbnQtPm51bWJlciA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQkJfSBlbHNlIGlmIChzdHJjbXAocmVzLT52YXJpYWJsZSwgInNpZ25hbC1uYW1lIikgPT0gMCkgewotCQkJCWV2ZW50LT5zaWdOYW1lID0gc3RyZHVwKHN0cik7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAic2lnbmFsLW1lYW5pbmciKSA9PSAwKSB7Ci0JCQkJZXZlbnQtPnNpZ01lYW5pbmcgPSBzdHJkdXAoc3RyKTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKHJlcy0+dmFyaWFibGUsICJnZGItcmVzdWx0LXZhciIpID09IDApIHsKLQkJCQlldmVudC0+Z2RiUmVzdWx0ID0gc3RyZHVwKHN0cik7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAicmV0dXJuLXZhbHVlIikgPT0gMCkgewotCQkJCWV2ZW50LT5yZXR1cm5WYWx1ZSA9IHN0cmR1cChzdHIpOwotCQkJfSBlbHNlIGlmIChzdHJjbXAocmVzLT52YXJpYWJsZSwgInJldHVybi10eXBlIikgPT0gMCkgewotCQkJCWV2ZW50LT5yZXR1cm5UeXBlID0gc3RyZHVwKHN0cik7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAiZXhpdC1jb2RlIikgPT0gMCkgewotCQkJCWV2ZW50LT5jb2RlID0gKGludClzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAidGhyZWFkLWlkIikgPT0gMCkgewotCQkJCWV2ZW50LT50aHJlYWRJZCA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQkJfSBlbHNlIGlmIChzdHJjbXAocmVzLT52YXJpYWJsZSwgImZyYW1lIikgPT0gMCkgewotCQkJCWlmICh2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZVR1cGxlKSB7Ci0JCQkJCWV2ZW50LT5mcmFtZSA9IE1JRnJhbWVQYXJzZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotTUlFdmVudFBhcnNlV1BUKE1JRXZlbnQgKmV2ZW50LCBMaXN0ICpyZXN1bHRzKQotewotCWNoYXIgKgkJc3RyID0gIiI7Ci0JTUlSZXN1bHQgKglyZXM7Ci0JTUlWYWx1ZSAqCXZhbHVlOwotCQotCWZvciAoU2V0TGlzdChyZXN1bHRzKTsgKHJlcyA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJdmFsdWUgPSByZXMtPnZhbHVlOwotCQlpZiAodmFsdWUtPnR5cGUgPT0gTUlWYWx1ZVR5cGVDb25zdCkgewotCQkJc3RyID0gdmFsdWUtPmNzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAibnVtYmVyIikgPT0gMCkgewotCQkJZXZlbnQtPm51bWJlciA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcChyZXMtPnZhcmlhYmxlLCAiZXhwIikgPT0gMCkgeyAKLQkJCWV2ZW50LT5leHAgPSBzdHJkdXAodmFsdWUtPmNzdHJpbmcpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotTUlFdmVudFBhcnNlVmFsdWUoTUlFdmVudCAqZXZlbnQsIExpc3QgKnJlc3VsdHMpCi17Ci0JY2hhciAqCQlzdHIgPSAiIjsKLQlNSVJlc3VsdCAqCXJlczsKLQlNSVZhbHVlICoJdmFsdWU7Ci0JCi0JZm9yIChTZXRMaXN0KHJlc3VsdHMpOyAocmVzID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocmVzdWx0cykpICE9IE5VTEw7ICkgewotCQl2YWx1ZSA9IHJlcy0+dmFsdWU7Ci0JCWlmICh2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQlzdHIgPSB2YWx1ZS0+Y3N0cmluZzsKLQkJfQotCQlpZiAoc3RyY21wKHJlcy0+dmFyaWFibGUsICJvbGQiKSA9PSAwKSB7Ci0JCQlldmVudC0+b2xkVmFsdWUgPSBzdHJkdXAoc3RyKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAocmVzLT52YXJpYWJsZSwgIm5ldyIpID09IDApIHsgCi0JCQlldmVudC0+bmV3VmFsdWUgPSBzdHJkdXAoc3RyKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAocmVzLT52YXJpYWJsZSwgInZhbHVlIikgPT0gMCkgeyAKLQkJCWV2ZW50LT5vbGRWYWx1ZSA9IHN0cmR1cChzdHIpOwotCQkJZXZlbnQtPm5ld1ZhbHVlID0gc3RyZHVwKHN0cik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUV2ZW50LmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUV2ZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOTY2YTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFdmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9NSUVWRU5UX0hfCi0jZGVmaW5lIF9NSUVWRU5UX0hfCi0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlGcmFtZS5oIgotCi0jZGVmaW5lIE1JRXZlbnRDbGFzc1N0b3BwZWQJCQkxCi0jZGVmaW5lIE1JRXZlbnRDbGFzc1J1bm5pbmcJCQkyCi0KLSNkZWZpbmUgTUlFdmVudFR5cGVCcmVha3BvaW50SGl0CQkxCi0jZGVmaW5lIE1JRXZlbnRUeXBlV2F0Y2hwb2ludFRyaWdnZXIJMgotI2RlZmluZSBNSUV2ZW50VHlwZVdhdGNocG9pbnRTY29wZQkJMwotI2RlZmluZSBNSUV2ZW50VHlwZVN0ZXBwaW5nUmFuZ2UJCTQKLSNkZWZpbmUgTUlFdmVudFR5cGVTaWduYWwJCQkJNQotI2RlZmluZSBNSUV2ZW50VHlwZUxvY2F0aW9uUmVhY2hlZAkJNgotI2RlZmluZSBNSUV2ZW50VHlwZUZ1bmN0aW9uRmluaXNoZWQJCTcKLSNkZWZpbmUgTUlFdmVudFR5cGVJbmZlcmlvckV4aXQJCQk4Ci0jZGVmaW5lIE1JRXZlbnRUeXBlSW5mZXJpb3JTaWduYWxFeGl0CTkKLSNkZWZpbmUgTUlFdmVudFR5cGVTdXNwZW5kZWQJCQkxMAotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXN5bmNocm9ub3VzIGV2ZW50LgotICovCi1zdHJ1Y3QgTUlFdmVudCB7Ci0JaW50CQkJY2xhc3M7Ci0JaW50CQkJdHlwZTsKLQlpbnQgCQkJdGhyZWFkSWQ7Ci0JTUlGcmFtZSAqCWZyYW1lOwotCWludAkJCWJrcHRubzsKLQlpbnQJCQludW1iZXI7Ci0JY2hhciAqCQlzaWdOYW1lOwotCWNoYXIgKgkJc2lnTWVhbmluZzsKLQljaGFyICoJCWdkYlJlc3VsdDsKLQljaGFyICoJCXJldHVyblZhbHVlOwotCWNoYXIgKgkJcmV0dXJuVHlwZTsKLQlpbnQJCQljb2RlOwotCWNoYXIgKgkJZXhwOwotCWNoYXIgKgkJb2xkVmFsdWU7Ci0JY2hhciAqCQluZXdWYWx1ZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBNSUV2ZW50CU1JRXZlbnQ7Ci0KLWV4dGVybiBNSUV2ZW50ICpNSUV2ZW50TmV3KGludCwgaW50KTsKLWV4dGVybiB2b2lkIE1JRXZlbnRGcmVlKE1JRXZlbnQgKnZhcik7Ci1leHRlcm4gTUlFdmVudCAqTUlFdmVudENyZWF0ZVN0b3BwZWRFdmVudChjaGFyICpyZWFzb24sIExpc3QgKnJlc3VsdHMpOwotI2VuZGlmIC8qIF9NSUVWRU5UX0hfICovCi0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFeGVjQ29tbWFuZC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlFeGVjQ29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhkNTg2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRXhlY0NvbW1hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotI2luY2x1ZGUgIk1JU3RyaW5nLmgiCi0KLU1JQ29tbWFuZCAqCi1NSUV4ZWNBcmd1bWVudHMoY2hhciAqKmFyZ3YpCi17Ci0JaW50CQkJaTsKLQlpbnQgCQlsZW4gPSAwOwotCWNoYXIgKgkJYXJnX3N0cjsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JZm9yIChpID0gMDsgYXJndltpXSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlsZW4gKz0gMTsKLQkJfQotCQlsZW4gKz0gc3RybGVuKGFyZ3ZbaV0pOwotCX0KLQkKLQlhcmdfc3RyID0gKGNoYXIgKiltYWxsb2MobGVuICogc2l6ZW9mKGNoYXIpKTsKLQkqYXJnX3N0ciA9ICdcMCc7Ci0JCi0JZm9yIChpID0gMDsgYXJndltpXSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlzdHJjYXQoYXJnX3N0ciwgIiAiKTsKLQkJfQotCQlzdHJjYXQoYXJnX3N0ciwgYXJndltpXSk7Ci0JfQotCQotCWNtZCA9IE1JQ29tbWFuZE5ldygiLWV4ZWMtYXJndW1lbnRzIiwgTUlSZXN1bHRSZWNvcmRSVU5OSU5HKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBhcmdfc3RyLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotTUlFeGVjQ29udGludWUodm9pZCkKLXsKLQlyZXR1cm4gTUlDb21tYW5kTmV3KCItZXhlYy1jb250aW51ZSIsIE1JUmVzdWx0UmVjb3JkUlVOTklORyk7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSUV4ZWNSdW4odm9pZCkKLXsKLQlyZXR1cm4gTUlDb21tYW5kTmV3KCItZXhlYy1ydW4iLCBNSVJlc3VsdFJlY29yZFJVTk5JTkcpOwotfQotCi1NSUNvbW1hbmQgKgotTUlFeGVjU3RlcChpbnQgY291bnQpCi17Ci0JTUlDb21tYW5kICoJY21kID0gTUlDb21tYW5kTmV3KCItZXhlYy1zdGVwIiwgTUlSZXN1bHRSZWNvcmRSVU5OSU5HKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBNSUludFRvQ1N0cmluZyhjb3VudCksIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSUV4ZWNOZXh0KGludCBjb3VudCkKLXsKLQlNSUNvbW1hbmQgKgljbWQgPSBNSUNvbW1hbmROZXcoIi1leGVjLW5leHQiLCBNSVJlc3VsdFJlY29yZFJVTk5JTkcpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKGNvdW50KSwgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JRXhlY0ZpbmlzaCh2b2lkKQotewotCXJldHVybiBNSUNvbW1hbmROZXcoIi1leGVjLWZpbmlzaCIsIE1JUmVzdWx0UmVjb3JkUlVOTklORyk7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSUV4ZWNVdGlsKGNoYXIqIGxvYykKLXsKLQlNSUNvbW1hbmQgKgljbWQgPSBNSUNvbW1hbmROZXcoIi1leGVjLXV0aWwiLCBNSVJlc3VsdFJlY29yZFJVTk5JTkcpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIGxvYywgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JRXhlY0ludGVycnVwdCh2b2lkKQotewotCXJldHVybiBNSUNvbW1hbmROZXcoIi1leGVjLWludGVycnVwdCIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci19Ci0KLSNpZmRlZiBfX0FQUExFX18KLU1JQ29tbWFuZCAqCi1NSVBpZEluZm8odm9pZCkKLXsKLQlyZXR1cm4gTUlDb21tYW5kTmV3KCItcGlkLWluZm8iLCBNSVJlc3VsdFJlY29yZERPTkUpOwotfQotI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRnJhbWUuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRnJhbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1M2M5Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSUZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseQotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLSNpbmNsdWRlICJNSUFyZy5oIgotI2luY2x1ZGUgIk1JRnJhbWUuaCIKLSNpbmNsdWRlICJNSU9PQlJlY29yZC5oIgotCi1zdGF0aWMgTGlzdCAqTUlGcmFtZUluZm9QYXJzZShMaXN0ICpyZXN1bHRzKTsKLQotTUlGcmFtZSAqCi1NSUZyYW1lTmV3KHZvaWQpCi17Ci0JTUlGcmFtZSAqCWZyYW1lOwotCi0JZnJhbWUgPSAoTUlGcmFtZSAqKW1hbGxvYyhzaXplb2YoTUlGcmFtZSkpOwotCWZyYW1lLT5sZXZlbCA9IDA7Ci0JZnJhbWUtPmxpbmUgPSAwOwotCWZyYW1lLT5hZGRyID0gTlVMTDsKLQlmcmFtZS0+ZnVuYyA9IE5VTEw7Ci0JZnJhbWUtPmZpbGUgPSBOVUxMOwotCWZyYW1lLT5hcmdzID0gTlVMTDsKLQlyZXR1cm4gZnJhbWU7Ci19Ci0KLXZvaWQKLU1JRnJhbWVGcmVlKE1JRnJhbWUgKmZyYW1lKQotewotCWlmIChmcmFtZS0+YWRkciAhPSBOVUxMKQotCQlmcmVlKGZyYW1lLT5hZGRyKTsKLQlpZiAoZnJhbWUtPmZ1bmMgIT0gTlVMTCkKLQkJZnJlZShmcmFtZS0+ZnVuYyk7Ci0JaWYgKGZyYW1lLT5maWxlICE9IE5VTEwpCi0JCWZyZWUoZnJhbWUtPmZpbGUpOwotCWlmIChmcmFtZS0+YXJncyAhPSBOVUxMKQotCQlEZXN0cm95TGlzdChmcmFtZS0+YXJncywgTUlBcmdGcmVlKTsKLQlmcmVlKGZyYW1lKTsKLX0KLQotTUlGcmFtZSAqCi1NSUZyYW1lUGFyc2UoTUlWYWx1ZSAqdHVwbGUpCi17Ci0JY2hhciAqCQlzdHIgPSBOVUxMOwotCWNoYXIgKgkJdmFyOwotCU1JVmFsdWUgKgl2YWx1ZTsKLQlNSVJlc3VsdCAqCXJlc3VsdDsKLQlMaXN0ICoJCXJlc3VsdHMgPSB0dXBsZS0+cmVzdWx0czsKLQlNSUZyYW1lICoJZnJhbWUgPSBNSUZyYW1lTmV3KCk7Ci0KLQlmb3IgKFNldExpc3QocmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyZXN1bHRzKSkgIT0gTlVMTDsgKSB7Ci0JCXZhciA9IHJlc3VsdC0+dmFyaWFibGU7Ci0JCXZhbHVlID0gcmVzdWx0LT52YWx1ZTsKLQotCQlpZiAodmFsdWUgIT0gTlVMTCB8fCB2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQlzdHIgPSB2YWx1ZS0+Y3N0cmluZzsKLQkJfQotCi0JCWlmIChzdHJjbXAodmFyLCAibGV2ZWwiKSA9PSAwICYmIHN0ciAhPSBOVUxMKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZyYW1lLT5sZXZlbCA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJhZGRyIikgPT0gMCAmJiBzdHIgIT0gTlVMTCkgeyAvLyROT04tTkxTLTEkCi0JCQlmcmFtZS0+YWRkciA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJmdW5jIikgPT0gMCkgeyAvLyROT04tTkxTLTEkCi0JCQlmcmFtZS0+ZnVuYyA9IE5VTEw7Ci0JCQlpZiAoIHN0ciAhPSBOVUxMICkgewotCQkJCWlmIChzdHJjbXAoc3RyLCAiPz8iKSA9PSAwKSAvLyROT04tTkxTLTEkCi0JCQkJCWZyYW1lLT5mdW5jID0gc3RyZHVwKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIEluIHNvbWUgc2l0dWF0aW9ucyBnZGIgcmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMgdGhhdCBpbmNsdWRlIHBhcmFtZXRlciB0eXBlcy4KLQkJCQkJLy8gVG8gbWFrZSB0aGUgcHJlc2VudGF0aW9uIGNvbnNpc3RlbnQgdHJ1bmNhdGUgdGhlIHBhcmFtZXRlcnMuIFBSIDQ2NTkyCi0JCQkJCWNoYXIgKiBzID0gc3RyY2hyKHN0ciwgJygnKTsKLQkJCQkJaWYgKHMgIT0gTlVMTCkKLQkJCQkJCSpzID0gJ1wwJzsKLQkJCQkJZnJhbWUtPmZ1bmMgPSBzdHJkdXAoc3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImZpbGUiKSA9PSAwICYmIHN0ciAhPSBOVUxMKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZyYW1lLT5maWxlID0gc3RyZHVwKHN0cik7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImxpbmUiKSA9PSAwICYmIHN0ciAhPSBOVUxMKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZyYW1lLT5saW5lID0gKGludClzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImFyZ3MiKSA9PSAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZyYW1lLT5hcmdzID0gTUlBcmdzUGFyc2UodmFsdWUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGZyYW1lOwotfQotCi1MaXN0ICoKLU1JR2V0U3RhY2tMaXN0RnJhbWVzSW5mbyhNSUNvbW1hbmQgKmNtZCkKLXsKLQlNSVZhbHVlICoJCXZhbDsKLQlNSVJlc3VsdFJlY29yZCAqCXJyOwotCU1JUmVzdWx0ICoJCXJlc3VsdDsKLQlMaXN0ICoJCQlmcmFtZXMgPSBOVUxMOwotCU1JVmFsdWUgKiBmcmFtZVZhbDsKLQotCWlmICghY21kLT5jb21wbGV0ZWQgfHwgY21kLT5vdXRwdXQgPT0gTlVMTCB8fCBjbWQtPm91dHB1dC0+cnIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyciA9IGNtZC0+b3V0cHV0LT5ycjsKLQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocnItPnJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAic3RhY2siKSA9PSAwKSB7Ci0JCQl2YWwgPSByZXN1bHQtPnZhbHVlOwotCQkJaWYgKHZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZUxpc3QgfHwgdmFsLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsvL1RPRE8gY29ycmVjdD8/PwotCQkJCWZvciAoU2V0TGlzdCh2YWwtPnJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQodmFsLT5yZXN1bHRzKSkgIT0gTlVMTDsgKSB7Ci0JCQkJCWlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgImZyYW1lIikgPT0gMCkgewotCQkJCQkJLy92YWwgPSByZXN1bHQtPnZhbHVlOyAvKiBlcnJvcjogb3ZlcndyaXRlIHByaW9yIE1JVmFsdWUKLQkJCQkJCWZyYW1lVmFsID0gcmVzdWx0LT52YWx1ZTsKLQkJCQkJCWlmIChmcmFtZVZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZVR1cGxlKSB7Ci0JCQkJCQkJaWYgKGZyYW1lcyA9PSBOVUxMKQotCQkJCQkJCQlmcmFtZXMgPSBOZXdMaXN0KCk7Ci0JCQkJCQkJQWRkVG9MaXN0KGZyYW1lcywgTUlGcmFtZVBhcnNlKGZyYW1lVmFsKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGZyYW1lcyA9PSBOVUxMKQotCQlmcmFtZXMgPSBOZXdMaXN0KCk7Ci0JcmV0dXJuIGZyYW1lczsKLX0KLQotc3RhdGljIExpc3QgKgotTUlGcmFtZUluZm9QYXJzZShMaXN0ICpyZXN1bHRzKQotewotCU1JVmFsdWUgKgl2YWw7Ci0JTUlSZXN1bHQgKglyZXN1bHQ7Ci0JTGlzdCAqCQlmcmFtZXMgPSBOVUxMOwotCi0JLy9TZXRMaXN0KHJlc3VsdHMpOwotCS8vaWYgKChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyZXN1bHRzKSkgIT0gTlVMTCkgewotCWZvciAoU2V0TGlzdChyZXN1bHRzKTsgKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJlc3VsdHMpKSAhPSBOVUxMOykgewotCQlpZiAoc3RyY21wKHJlc3VsdC0+dmFyaWFibGUsICJmcmFtZSIpID09IDApIHsKLQkJCXZhbCA9IHJlc3VsdC0+dmFsdWU7Ci0JCQlpZiAodmFsLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsKLQkJCQlpZiAoZnJhbWVzID09IE5VTEwpCi0JCQkJCWZyYW1lcyA9IE5ld0xpc3QoKTsKLQkJCQlBZGRUb0xpc3QoZnJhbWVzLCAodm9pZCAqKU1JRnJhbWVQYXJzZSh2YWwpKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoZnJhbWVzID09IE5VTEwpCi0JCWZyYW1lcyA9IE5ld0xpc3QoKTsKLQlyZXR1cm4gZnJhbWVzOwotfQotCi1MaXN0ICoKLU1JR2V0RnJhbWVJbmZvKE1JQ29tbWFuZCAqY21kKQotewotCU1JUmVzdWx0UmVjb3JkICoJcnI7Ci0KLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcnIgPSBjbWQtPm91dHB1dC0+cnI7Ci0JcmV0dXJuIE1JRnJhbWVJbmZvUGFyc2UocnItPnJlc3VsdHMpOwotfQotCi1MaXN0ICoKLU1JR2V0U3RhY2tMaXN0TG9jYWxzSW5mbyhNSUNvbW1hbmQgKmNtZCkKLXsKLQlNSVZhbHVlICoJCXZhbDsKLQlNSVJlc3VsdFJlY29yZCAqCXJyOwotCU1JUmVzdWx0ICoJCXJlc3VsdDsKLQlMaXN0ICoJCQlsb2NhbHMgPSBOVUxMOwotCi0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJyID0gY21kLT5vdXRwdXQtPnJyOwotCWZvciAoU2V0TGlzdChyci0+cmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyci0+cmVzdWx0cykpICE9IE5VTEw7ICkgewotCQlpZiAoc3RyY21wKHJlc3VsdC0+dmFyaWFibGUsICJsb2NhbHMiKSA9PSAwKSB7Ci0JCQl2YWwgPSByZXN1bHQtPnZhbHVlOwotCQkJaWYgKHZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZUxpc3QgfHwgdmFsLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsKLQkJCQlsb2NhbHMgPSBNSUFyZ3NQYXJzZSh2YWwpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBsb2NhbHM7Ci19Ci0KLUxpc3QgKgotTUlHZXRTdGFja0xpc3RBcmd1bWVudHNJbmZvKE1JQ29tbWFuZCAqY21kKQotewotCU1JVmFsdWUgKgkJdmFsOwotCU1JUmVzdWx0UmVjb3JkICoJcnI7Ci0JTUlSZXN1bHQgKgkJcmVzdWx0OwotCUxpc3QgKgkJCWZyYW1lcyA9IE5VTEw7Ci0KLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcnIgPSBjbWQtPm91dHB1dC0+cnI7Ci0JU2V0TGlzdChyci0+cmVzdWx0cyk7Ci0JaWYgKChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyci0+cmVzdWx0cykpICE9IE5VTEwpIHsKLQkJaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAic3RhY2stYXJncyIpID09IDApIHsKLQkJCXZhbCA9IHJlc3VsdC0+dmFsdWU7Ci0JCQlpZiAodmFsLT50eXBlID09IE1JVmFsdWVUeXBlTGlzdCB8fCB2YWwtPnR5cGUgPT0gTUlWYWx1ZVR5cGVUdXBsZSkgewotCQkJCWZyYW1lcyA9IE1JRnJhbWVJbmZvUGFyc2UodmFsLT5yZXN1bHRzKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZnJhbWVzOwotfQotCi1NSVN0cmluZyAqCi1NSUZyYW1lVG9TdHJpbmcoTUlGcmFtZSAqZikKLXsKLQlpbnQJCQlmaXJzdCA9IDE7Ci0JTUlBcmcgKgkJYXJnOwotCU1JU3RyaW5nICoJc3RyID0gTUlTdHJpbmdOZXcoImxldmVsPVwiJWRcIiIsIGYtPmxldmVsKTsKLQotCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIixhZGRyPVwiJXNcIiIsIGYtPmFkZHIpKTsKLQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCIsZnVuYz1cIiVzXCIiLCBmLT5mdW5jKSk7Ci0JTUlTdHJpbmdBcHBlbmQoc3RyLCBNSVN0cmluZ05ldygiLGZpbGU9XCIlc1wiIiwgZi0+ZmlsZSkpOwotCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIixsaW5lPVwiJWRcIiIsIGYtPmxpbmUpKTsKLQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCIsYXJncz1bIikpOwotCi0JZm9yIChTZXRMaXN0KGYtPmFyZ3MpOyAoYXJnID0gKE1JQXJnICopR2V0TGlzdEVsZW1lbnQoZi0+YXJncykpICE9IE5VTEw7ICkgewotCQlpZiAoIWZpcnN0KSB7Ci0JCQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCIsIikpOwotCQl9Ci0JCWZpcnN0ID0gMDsKLQkJTUlTdHJpbmdBcHBlbmQoc3RyLCBNSVN0cmluZ05ldygie25hbWU9XCIlc1wiIiwgYXJnLT5uYW1lKSk7Ci0JCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIix2YWx1ZT1cIiVzXCIiLCBhcmctPnZhbHVlKSk7Ci0JfQotCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIl0iKSk7Ci0KLQlyZXR1cm4gc3RyOwotfQotCi1pbnQKLU1JR2V0U3RhY2tJbmZvRGVwdGgoTUlDb21tYW5kICpjbWQpCi17Ci0JTUlWYWx1ZSAqIHZhbDsKLQlNSVJlc3VsdFJlY29yZCAqIHJyOwotCU1JUmVzdWx0ICogcmVzdWx0OwotCi0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlyciA9IGNtZC0+b3V0cHV0LT5ycjsKLQlTZXRMaXN0KHJyLT5yZXN1bHRzKTsKLQlpZiAoKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJyLT5yZXN1bHRzKSkgIT0gTlVMTCkgewotCQlpZiAoc3RyY21wKHJlc3VsdC0+dmFyaWFibGUsICJkZXB0aCIpID09IDApIHsKLQkJCXZhbCA9IHJlc3VsdC0+dmFsdWU7Ci0JCQlyZXR1cm4gKGludClzdHJ0b2wodmFsLT5jc3RyaW5nLCBOVUxMLCAxMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlGcmFtZS5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlGcmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhkOTE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JRnJhbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotCi0jaWZuZGVmIF9NSUZSQU1FX0hfCi0jZGVmaW5lIF9NSUZSQU1FX0hfCi0KLSNpbmNsdWRlICJNSUNvbW1hbmQuaCIKLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0KLQotc3RydWN0IE1JRnJhbWUgewotCWludAkJbGV2ZWw7Ci0JY2hhciAqCWFkZHI7Ci0JY2hhciAqCWZ1bmM7Ci0JY2hhciAqCWZpbGU7Ci0JaW50CQlsaW5lOwotCUxpc3QgKglhcmdzOwotfTsKLXR5cGVkZWYgc3RydWN0IE1JRnJhbWUJTUlGcmFtZTsKLQotZXh0ZXJuIE1JRnJhbWUgKk1JRnJhbWVOZXcodm9pZCk7Ci1leHRlcm4gdm9pZCBNSUZyYW1lRnJlZShNSUZyYW1lICpmKTsKLWV4dGVybiBNSUZyYW1lICpNSUZyYW1lUGFyc2UoTUlWYWx1ZSAqdHVwbGUpOwotZXh0ZXJuIExpc3QgKk1JR2V0U3RhY2tMaXN0RnJhbWVzSW5mbyhNSUNvbW1hbmQgKmNtZCk7Ci1leHRlcm4gTGlzdCAqTUlHZXRGcmFtZUluZm8oTUlDb21tYW5kICpjbWQpOwotZXh0ZXJuIExpc3QgKk1JR2V0U3RhY2tMaXN0TG9jYWxzSW5mbyhNSUNvbW1hbmQgKmNtZCk7Ci1leHRlcm4gTGlzdCAqTUlHZXRTdGFja0xpc3RBcmd1bWVudHNJbmZvKE1JQ29tbWFuZCAqY21kKTsKLWV4dGVybiBNSVN0cmluZyAqTUlGcmFtZVRvU3RyaW5nKE1JRnJhbWUgKmYpOwotZXh0ZXJuIGludCBNSUdldFN0YWNrSW5mb0RlcHRoKE1JQ29tbWFuZCAqY21kKTsKLQotI2VuZGlmIC8qIF9NSUZSQU1FX0hfICovCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JR0RCQ29tbWFuZC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlHREJDb21tYW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDIxNjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlHREJDb21tYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZQkibGlzdC5oIgotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotCi1NSUNvbW1hbmQgKgotTUlHREJTZXQoY2hhciAqdmFyLCBjaGFyICp2YWwpCi17Ci0JTUlDb21tYW5kICoJY21kID0gTUlDb21tYW5kTmV3KCItZ2RiLXNldCIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JCi0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgdmFyLCB2YWwpOwotCQotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSUdEQkV4aXQodm9pZCkKLXsKLQlyZXR1cm4gTUlDb21tYW5kTmV3KCItZ2RiLWV4aXQiLCBNSVJlc3VsdFJlY29yZEVYSVQpOwotfQotCi1NSUNvbW1hbmQgKgotTUlHREJTaG93RW5kaWFuKHZvaWQpCi17Ci0JTUlDb21tYW5kICogY21kID0gTUlDb21tYW5kTmV3KCItZ2RiLXNob3ciLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsICJlbmRpYW4iLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlNZW1vcnkuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JTWVtb3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MjZiN2EuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlNZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi0gCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLSNpbmNsdWRlICJNSVJlc3VsdC5oIgotI2luY2x1ZGUgIk1JTWVtb3J5LmgiCi0KLU1JTWVtb3J5ICogCi1NSU1lbW9yeU5ldyh2b2lkKQotewotCU1JTWVtb3J5ICoJbWVtb3J5OwotCW1lbW9yeSA9IChNSU1lbW9yeSAqKW1hbGxvYyhzaXplb2YoTUlNZW1vcnkpKTsKLQltZW1vcnktPmFkZHIgPSBOVUxMOwotCW1lbW9yeS0+YXNjaWkgPSBOVUxMOwotCW1lbW9yeS0+ZGF0YSA9IE5VTEw7Ci0JcmV0dXJuIG1lbW9yeTsJCi19Ci0KLXZvaWQgCi1NSU1lbW9yeUZyZWUoTUlNZW1vcnkgKm1lbW9yeSkKLXsKLQlpZiAobWVtb3J5LT5hZGRyICE9IE5VTEwpCi0JCWZyZWUobWVtb3J5LT5hZGRyKTsKLQlpZiAobWVtb3J5LT5hc2NpaSAhPSBOVUxMKQotCQlmcmVlKG1lbW9yeS0+YXNjaWkpOwotCWlmIChtZW1vcnktPmRhdGEgIT0gTlVMTCkKLQkJRGVzdHJveUxpc3QobWVtb3J5LT5kYXRhLCBmcmVlKTsKLQlmcmVlKG1lbW9yeSk7Ci19Ci0KLU1JTWVtb3J5ICoKLU1JTWVtb3J5UGFyc2UoTUlWYWx1ZSAqdHVwbGUpCi17Ci0JY2hhciAqCQlzdHI7Ci0JY2hhciAqCQl2YXI7Ci0JTUlWYWx1ZSAqCXZhbHVlOwotCU1JUmVzdWx0ICoJcmVzdWx0OwotCUxpc3QgKgkJcmVzdWx0cyA9IHR1cGxlLT5yZXN1bHRzOwotCU1JTWVtb3J5ICoJbWVtb3J5ID0gTUlNZW1vcnlOZXcoKTsKLQkKLQlmb3IgKFNldExpc3QocmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyZXN1bHRzKSkgIT0gTlVMTDspIHsKLQkJdmFyID0gcmVzdWx0LT52YXJpYWJsZTsKLQkJdmFsdWUgPSByZXN1bHQtPnZhbHVlOwotCQotCQlpZiAodmFsdWUgIT0gTlVMTCAmJiB2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQlzdHIgPSB2YWx1ZS0+Y3N0cmluZzsKLQkJfQotCQotCQlpZiAoc3RyY21wKHZhciwgImFkZHIiKSA9PSAwKSB7Ci0JCQltZW1vcnktPmFkZHIgPSBzdHJkdXAoc3RyKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAiYXNjaWkiKSA9PSAwKSB7Ci0JCQltZW1vcnktPmFzY2lpID0gc3RyZHVwKHN0cik7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImRhdGEiKSA9PSAwKSB7Ci0JCQlpZiAodmFsdWUgIT0gTlVMTCkgewotCQkJCW1lbW9yeS0+ZGF0YSA9IE1JTWVtb3J5RGF0YVBhcnNlKHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbWVtb3J5OwotfQotCi1MaXN0ICoKLU1JTWVtb3J5RGF0YVBhcnNlKE1JVmFsdWUqIG1pVmFsdWUpCi17Ci0JTGlzdCAqIGRhdGEgPSBOZXdMaXN0KCk7Ci0JTGlzdCAqIHZhbHVlcyA9IG1pVmFsdWUtPnZhbHVlczsKLQlNSVZhbHVlICogdmFsdWU7Ci0JCi0JaWYgKHZhbHVlcyAhPSBOVUxMKSB7Ci0JCWZvciAoU2V0TGlzdCh2YWx1ZXMpOyAodmFsdWUgPSAoTUlWYWx1ZSAqKUdldExpc3RFbGVtZW50KHZhbHVlcykpICE9IE5VTEw7ICkgewotCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCQlBZGRUb0xpc3QoZGF0YSwgKHZvaWQgKikgc3RyZHVwKHZhbHVlLT5jc3RyaW5nKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLU1JRGF0YVJlYWRNZW1vcnlJbmZvICoKLU1JRGF0YVJlYWRNZW1vcnlJbmZvTmV3KHZvaWQpCi17Ci0JTUlEYXRhUmVhZE1lbW9yeUluZm8gKgltZW1vcnlJbmZvOwotCW1lbW9yeUluZm8gPSAoTUlEYXRhUmVhZE1lbW9yeUluZm8gKiltYWxsb2Moc2l6ZW9mKE1JRGF0YVJlYWRNZW1vcnlJbmZvKSk7Ci0JbWVtb3J5SW5mby0+YWRkciA9IE5VTEw7Ci0JbWVtb3J5SW5mby0+bWVtb3JpZXMgPSBOVUxMOwotCXJldHVybiBtZW1vcnlJbmZvOwkKLX0KLQotdm9pZAotTUlEYXRhUmVhZE1lbW9yeUluZm9GcmVlKE1JRGF0YVJlYWRNZW1vcnlJbmZvICptZW1vcnlJbmZvKQotewotCWlmIChtZW1vcnlJbmZvLT5hZGRyICE9IE5VTEwpCi0JCWZyZWUobWVtb3J5SW5mby0+YWRkcik7Ci0JaWYgKG1lbW9yeUluZm8tPm1lbW9yaWVzICE9IE5VTEwpCi0JCURlc3Ryb3lMaXN0KG1lbW9yeUluZm8tPm1lbW9yaWVzLCBNSU1lbW9yeUZyZWUpOwotCWZyZWUobWVtb3J5SW5mbyk7Ci19Ci0KLU1JRGF0YVJlYWRNZW1vcnlJbmZvICoKLU1JR2V0RGF0YVJlYWRNZW1vcnlJbmZvKE1JQ29tbWFuZCAqY21kKQotewotCWNoYXIgKiB2YXI7Ci0JY2hhciAqIHN0cjsKLQlNSVZhbHVlICogdmFsdWU7Ci0JTUlSZXN1bHRSZWNvcmQgKiBycjsKLQlNSVJlc3VsdCAqIHJlc3VsdDsKLQlNSURhdGFSZWFkTWVtb3J5SW5mbyAqIGluZm8gPSBNSURhdGFSZWFkTWVtb3J5SW5mb05ldygpOwotCi0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlyciA9IGNtZC0+b3V0cHV0LT5ycjsKLQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocnItPnJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJdmFyID0gcmVzdWx0LT52YXJpYWJsZTsKLQkJdmFsdWUgPSByZXN1bHQtPnZhbHVlOwotCi0JCWlmICh2YWx1ZSAhPSBOVUxMIHx8IHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCXN0ciA9IHZhbHVlLT5jc3RyaW5nOwotCQl9Ci0KLQkJaWYgKHN0cmNtcCh2YXIsICJhZGRyIikgPT0gMCkgewotCQkJaW5mby0+YWRkciA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJuci1ieXRlcyIpID09IDApIHsKLQkJCWluZm8tPm51bUJ5dGVzID0gc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJ0b3RhbC1ieXRlcyIpID09IDApIHsKLQkJCWluZm8tPnRvdGFsQnl0ZXMgPSBzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgIm5leHQtcm93IikgPT0gMCkgewotCQkJaW5mby0+bmV4dFJvdyA9IHN0cnRvbChzdHIsIE5VTEwsIDEwKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAicHJldi1yb3ciKSA9PSAwKSB7Ci0JCQlpbmZvLT5wcmV2Um93ID0gc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJuZXh0LXBhZ2UiKSA9PSAwKSB7Ci0JCQlpbmZvLT5uZXh0UGFnZSA9IHN0cnRvbChzdHIsIE5VTEwsIDEwKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAicHJldi1wYWdlIikgPT0gMCkgewotCQkJaW5mby0+cHJldlBhZ2UgPSBzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgIm1lbW9yeSIpID09IDApIHsKLQkJCWlmICh2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUxpc3QpIHsKLQkJCQlpbmZvLT5tZW1vcmllcyA9IE1JR2V0TWVtb3J5TGlzdCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9CQotCXJldHVybiBpbmZvOwotfQotCi1MaXN0ICoKLU1JR2V0TWVtb3J5TGlzdChNSVZhbHVlICptaVZhbHVlKQotewotCUxpc3QgKm1lbW9yaWVzID0gTmV3TGlzdCgpOwotCUxpc3QgKnZhbHVlcyA9IG1pVmFsdWUtPnZhbHVlczsKLQlNSVZhbHVlICp2YWx1ZTsKLQkKLQlpZiAodmFsdWVzICE9IE5VTEwpIHsKLQkJZm9yIChTZXRMaXN0KHZhbHVlcyk7ICh2YWx1ZSA9IChNSVZhbHVlICopR2V0TGlzdEVsZW1lbnQodmFsdWVzKSkgIT0gTlVMTDspIHsKLQkJCWlmICh2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZVR1cGxlKSB7Ci0JCQkJQWRkVG9MaXN0KG1lbW9yaWVzLCAodm9pZCAqKU1JTWVtb3J5UGFyc2UodmFsdWUpKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbWVtb3JpZXM7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU1lbW9yeS5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlNZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2OWEzMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU1lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotIAotI2lmbmRlZiBfTUlNRU1PUllfSF8KLSNkZWZpbmUgX01JTUVNT1JZX0hfCi0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlDb21tYW5kLmgiCi0jaW5jbHVkZSAiTUlWYWx1ZS5oIgotCi1zdHJ1Y3QgTUlNZW1vcnkgewotCWNoYXIgKmFkZHI7Ci0JY2hhciAqYXNjaWk7Ci0JTGlzdCAqZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBNSU1lbW9yeQlNSU1lbW9yeTsKLQotc3RydWN0IE1JRGF0YVJlYWRNZW1vcnlJbmZvIHsKLQljaGFyICphZGRyOwotCWxvbmcgbmV4dFJvdzsKLQlsb25nIHByZXZSb3c7Ci0JbG9uZyBuZXh0UGFnZTsKLQlsb25nIHByZXZQYWdlOwotCWxvbmcgbnVtQnl0ZXM7Ci0JbG9uZyB0b3RhbEJ5dGVzOwotCUxpc3QgKm1lbW9yaWVzOwotfTsKLXR5cGVkZWYgc3RydWN0IE1JRGF0YVJlYWRNZW1vcnlJbmZvCU1JRGF0YVJlYWRNZW1vcnlJbmZvOwotCi1leHRlcm4gTUlNZW1vcnkgKk1JTWVtb3J5TmV3KHZvaWQpOwotZXh0ZXJuIE1JRGF0YVJlYWRNZW1vcnlJbmZvICpNSURhdGFSZWFkTWVtb3J5SW5mb05ldyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgTUlNZW1vcnlGcmVlKE1JTWVtb3J5ICptZW1vcnkpOwotZXh0ZXJuIHZvaWQgTUlEYXRhUmVhZE1lbW9yeUluZm9GcmVlKE1JRGF0YVJlYWRNZW1vcnlJbmZvICptZW1vcnlJbmZvKTsKLQotZXh0ZXJuIE1JTWVtb3J5ICpNSU1lbW9yeVBhcnNlKE1JVmFsdWUgKnR1cGxlKTsKLWV4dGVybiBMaXN0ICpNSU1lbW9yeURhdGFQYXJzZShNSVZhbHVlICptaVZhbHVlKTsKLQotZXh0ZXJuIE1JRGF0YVJlYWRNZW1vcnlJbmZvICogTUlHZXREYXRhUmVhZE1lbW9yeUluZm8oTUlDb21tYW5kICpjbWQpOwotZXh0ZXJuIExpc3QgKiBNSUdldE1lbW9yeUxpc3QoTUlWYWx1ZSAqbWlWYWx1ZSk7Ci0jZW5kaWYgLyogX01JTUVNT1JZX0hfICovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU1lbW9yeUNvbW1hbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzU4MGJhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JTWVtb3J5Q29tbWFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIk1JU3RyaW5nLmgiCi0jaW5jbHVkZSAiTUlDb21tYW5kLmgiCi0KLU1JQ29tbWFuZCAqCi1NSURhdGFSZWFkTWVtb3J5KGxvbmcgb2Zmc2V0LCBjaGFyKiBhZGRyZXNzLCBjaGFyKiBmb3JtYXQsIGludCB3b3JkU2l6ZSwgaW50IHJvd3MsIGludCBjb2xzLCBjaGFyKiBhc0NoYXIpCi17Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiLWRhdGEtcmVhZC1tZW1vcnkiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCQotCWlmIChvZmZzZXQgIT0gMCkgewotCQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCAiLW8iLCBNSUludFRvQ1N0cmluZyhvZmZzZXQpKTsKLQl9Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgYWRkcmVzcywgTlVMTCk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgZm9ybWF0LCBOVUxMKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBNSUludFRvQ1N0cmluZyh3b3JkU2l6ZSksIE5VTEwpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKHJvd3MpLCBOVUxMKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBNSUludFRvQ1N0cmluZyhjb2xzKSwgTlVMTCk7Ci0JaWYgKGFzQ2hhciAhPSBOVUxMKSB7Ci0JCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIGFzQ2hhciwgTlVMTCk7Ci0JfQotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSURhdGFXcml0ZU1lbW9yeShsb25nIG9mZnNldCwgY2hhciogYWRkcmVzcywgY2hhciogZm9ybWF0LCBpbnQgd29yZFNpemUsIGNoYXIqIHZhbHVlKQotewotCU1JQ29tbWFuZCAqIGNtZDsKLQljbWQgPSBNSUNvbW1hbmROZXcoIi1kYXRhLXdyaXRlLW1lbW9yeSIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JCi0JaWYgKG9mZnNldCAhPSAwKSB7Ci0JCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsICItbyIsIE1JSW50VG9DU3RyaW5nKG9mZnNldCkpOwotCX0KLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBhZGRyZXNzLCBOVUxMKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBmb3JtYXQsIE5VTEwpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKHdvcmRTaXplKSwgTlVMTCk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgdmFsdWUsIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU9PQlJlY29yZC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlPT0JSZWNvcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0ZWRhOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU9PQlJlY29yZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlWYWx1ZS5oIgotI2luY2x1ZGUgIk1JUmVzdWx0LmgiCi0jaW5jbHVkZSAiTUlPT0JSZWNvcmQuaCIKLQotTUlPT0JSZWNvcmQgKiAKLU5ld01JTUlPT0JSZWNvcmQodm9pZCkKLXsKLQlNSU9PQlJlY29yZCAqCW9vYjsKLQkKLQlvb2IgPSAoTUlPT0JSZWNvcmQgKiltYWxsb2Moc2l6ZW9mKE1JT09CUmVjb3JkKSk7Ci0Jb29iLT50b2tlbiA9IC0xOwotCW9vYi0+cmVzdWx0cyA9IE5VTEw7Ci0Jb29iLT5jbGFzcyA9IE5VTEw7Ci0Jb29iLT5jc3RyaW5nID0gTlVMTDsKLQlyZXR1cm4gb29iOwotfQotCi1NSU9PQlJlY29yZCAqIAotTmV3TUlFeGVjQXN5bmNPdXRwdXQodm9pZCkKLXsKLQlNSU9PQlJlY29yZCAqCW9vYiA9IE5ld01JTUlPT0JSZWNvcmQoKTsKLQlvb2ItPnR5cGUgPSBNSU9PQlJlY29yZFR5cGVBc3luYzsKLQlvb2ItPnN1Yl90eXBlID0gTUlPT0JSZWNvcmRFeGVjQXN5bmM7Ci0JcmV0dXJuIG9vYjsKLX0KLQotTUlPT0JSZWNvcmQgKgotTmV3TUlTdGF0dXNBc3luY091dHB1dCh2b2lkKQotewotCU1JT09CUmVjb3JkICoJb29iID0gTmV3TUlNSU9PQlJlY29yZCgpOwotCW9vYi0+dHlwZSA9IE1JT09CUmVjb3JkVHlwZUFzeW5jOwotCW9vYi0+c3ViX3R5cGUgPSBNSU9PQlJlY29yZFN0YXR1c0FzeW5jOwotCXJldHVybiBvb2I7Ci19Ci0KLU1JT09CUmVjb3JkICoKLU5ld01JTm90aWZ5QXN5bmNPdXRwdXQodm9pZCkKLXsKLQlNSU9PQlJlY29yZCAqCW9vYiA9IE5ld01JTUlPT0JSZWNvcmQoKTsKLQlvb2ItPnR5cGUgPSBNSU9PQlJlY29yZFR5cGVBc3luYzsKLQlvb2ItPnN1Yl90eXBlID0gTUlPT0JSZWNvcmROb3RpZnlBc3luYzsKLQlyZXR1cm4gb29iOwotfQotCi1NSU9PQlJlY29yZCAqCi1OZXdNSUNvbnNvbGVTdHJlYW1PdXRwdXQodm9pZCkKLXsKLQlNSU9PQlJlY29yZCAqCW9vYiA9IE5ld01JTUlPT0JSZWNvcmQoKTsKLQlvb2ItPnR5cGUgPSBNSU9PQlJlY29yZFR5cGVTdHJlYW07Ci0Jb29iLT5zdWJfdHlwZSA9IE1JT09CUmVjb3JkQ29uc29sZVN0cmVhbTsKLQlyZXR1cm4gb29iOwotfQotCi1NSU9PQlJlY29yZCAqCi1OZXdNSVRhcmdldFN0cmVhbU91dHB1dCh2b2lkKQotewotCU1JT09CUmVjb3JkICoJb29iID0gTmV3TUlNSU9PQlJlY29yZCgpOwotCW9vYi0+dHlwZSA9IE1JT09CUmVjb3JkVHlwZVN0cmVhbTsKLQlvb2ItPnN1Yl90eXBlID0gTUlPT0JSZWNvcmRUYXJnZXRTdHJlYW07Ci0JcmV0dXJuIG9vYjsKLX0KLQotTUlPT0JSZWNvcmQgKgotTmV3TUlMb2dTdHJlYW1PdXRwdXQodm9pZCkKLXsKLQlNSU9PQlJlY29yZCAqCW9vYiA9IE5ld01JTUlPT0JSZWNvcmQoKTsKLQlvb2ItPnR5cGUgPSBNSU9PQlJlY29yZFR5cGVTdHJlYW07Ci0Jb29iLT5zdWJfdHlwZSA9IE1JT09CUmVjb3JkTG9nU3RyZWFtOwotCXJldHVybiBvb2I7Ci19Ci0KLXZvaWQgCi1NSU9PQlJlY29yZEZyZWUoTUlPT0JSZWNvcmQgKm9vYikKLXsKLQlpZiAob29iLT5yZXN1bHRzICE9IE5VTEwpCi0JCURlc3Ryb3lMaXN0KG9vYi0+cmVzdWx0cywgTUlSZXN1bHRGcmVlKTsKLQlpZiAob29iLT5jbGFzcyAhPSBOVUxMKQotCQlmcmVlKG9vYi0+Y2xhc3MpOwotCWlmIChvb2ItPmNzdHJpbmcgIT0gTlVMTCkKLQkJZnJlZShvb2ItPmNzdHJpbmcpOwotCWZyZWUob29iKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JT09CUmVjb3JkLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU9PQlJlY29yZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQxODU5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JT09CUmVjb3JkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLSAgCi0jaWZuZGVmIF9NSU9PQlJFQ09SRF9IXwotI2RlZmluZSBfTUlPT0JSRUNPUkRfSF8KLSNpbmNsdWRlICJsaXN0LmgiCi0KLSNkZWZpbmUgTUlPT0JSZWNvcmRUeXBlQXN5bmMJMQotI2RlZmluZSBNSU9PQlJlY29yZFR5cGVTdHJlYW0JMgotCi0jZGVmaW5lIE1JT09CUmVjb3JkRXhlY0FzeW5jCQkxCi0jZGVmaW5lIE1JT09CUmVjb3JkU3RhdHVzQXN5bmMJMgotI2RlZmluZSBNSU9PQlJlY29yZE5vdGlmeUFzeW5jCTMKLQotI2RlZmluZSBNSU9PQlJlY29yZENvbnNvbGVTdHJlYW0JMQotI2RlZmluZSBNSU9PQlJlY29yZExvZ1N0cmVhbQkJMgotI2RlZmluZSBNSU9PQlJlY29yZFRhcmdldFN0cmVhbQkzCi0KLS8qKgotICogQHNlZSBNSU9PQlJlY29yZAotICovCi1zdHJ1Y3QgTUlPT0JSZWNvcmQgewotCWludCB0eXBlOwotCWludCBzdWJfdHlwZTsKLQlMaXN0ICpyZXN1bHRzOwotCWNoYXIgKmNsYXNzOwotCWludCB0b2tlbjsKLQljaGFyICpjc3RyaW5nOwotfTsKLXR5cGVkZWYgc3RydWN0IE1JT09CUmVjb3JkIE1JT09CUmVjb3JkOwotCi1leHRlcm4gTUlPT0JSZWNvcmQgKk5ld01JRXhlY0FzeW5jT3V0cHV0KHZvaWQpOwotZXh0ZXJuIE1JT09CUmVjb3JkICpOZXdNSVN0YXR1c0FzeW5jT3V0cHV0KHZvaWQpOwotZXh0ZXJuIE1JT09CUmVjb3JkICpOZXdNSU5vdGlmeUFzeW5jT3V0cHV0KHZvaWQpOwotZXh0ZXJuIE1JT09CUmVjb3JkICpOZXdNSUNvbnNvbGVTdHJlYW1PdXRwdXQodm9pZCk7Ci1leHRlcm4gTUlPT0JSZWNvcmQgKk5ld01JVGFyZ2V0U3RyZWFtT3V0cHV0KHZvaWQpOwotZXh0ZXJuIE1JT09CUmVjb3JkICpOZXdNSUxvZ1N0cmVhbU91dHB1dCh2b2lkKTsKLWV4dGVybiB2b2lkIE1JT09CUmVjb3JkRnJlZShNSU9PQlJlY29yZCAqKTsKLSNlbmRpZiAvKiBfTUlPT0JSRUNPUkRfSF8gKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JT3V0cHV0LmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSU91dHB1dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODZjMzI0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JT3V0cHV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JT09CUmVjb3JkLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHRSZWNvcmQuaCIKLSNpbmNsdWRlICJNSU91dHB1dC5oIgotCi1NSU91dHB1dCAqCi1NSU91dHB1dE5ldyh2b2lkKQotewotCU1JT3V0cHV0ICoJb3A7Ci0JCi0Jb3AgPSAoTUlPdXRwdXQgKiltYWxsb2Moc2l6ZW9mKE1JT3V0cHV0KSk7Ci0Jb3AtPnJyID0gTlVMTDsKLQlvcC0+b29icyA9IE5VTEw7Ci0JcmV0dXJuIG9wOwotfQotCi12b2lkCi1NSU91dHB1dEZyZWUoTUlPdXRwdXQgKm9wKQotewotCWlmIChvcC0+cnIgIT0gTlVMTCkKLQkJTUlSZXN1bHRSZWNvcmRGcmVlKG9wLT5ycik7Ci0JaWYgKG9wLT5vb2JzICE9IE5VTEwpCi0JCURlc3Ryb3lMaXN0KG9wLT5vb2JzLCBNSU9PQlJlY29yZEZyZWUpOwotCWZyZWUob3ApOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlPdXRwdXQuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JT3V0cHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTRjYWMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlPdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotCi0jaWZuZGVmIF9NSU9VVFBVVF9IXwotI2RlZmluZSBfTUlPVVRQVVRfSF8KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSVJlc3VsdFJlY29yZC5oIgotCi0vKioKLSAqIEdEQi9NSSByZXNwb25zZS4KLSAqLwotc3RydWN0IE1JT3V0cHV0IHsKLQlNSVJlc3VsdFJlY29yZCAqCXJyOwotCUxpc3QgKgkJCW9vYnM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgTUlPdXRwdXQgTUlPdXRwdXQ7Ci0KLWV4dGVybiBNSU91dHB1dCAqTUlPdXRwdXROZXcodm9pZCk7Ci1leHRlcm4gdm9pZCBNSVBhcnNlKGNoYXIgKmJ1ZmZlciwgTUlPdXRwdXQgKm9wKTsKLWV4dGVybiB2b2lkIE1JT3V0cHV0RnJlZShNSU91dHB1dCAqb3ApOwotI2VuZGlmIC8qIF9NSU9VVFBVVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlQYXJzZXIuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JUGFyc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTU4ZjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlQYXJzZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLQotLyoqCi08cHJlPgotYE9VVFBVVCA6JwotICAgICBgKCBPVVQtT0YtQkFORC1SRUNPUkQgKSogWyBSRVNVTFQtUkVDT1JEIF0gIihnZGIpIiBOTCcKLQotYFJFU1VMVC1SRUNPUkQgOicKLSAgICAgYCBbIFRPS0VOIF0gIl4iIFJFU1VMVC1DTEFTUyAoICIsIiBSRVNVTFQgKSogTkwnCi0KLWBPVVQtT0YtQkFORC1SRUNPUkQgOicKLSAgICAgYEFTWU5DLVJFQ09SRCB8IFNUUkVBTS1SRUNPUkQnCi0KLWBBU1lOQy1SRUNPUkQgOicKLSAgICAgYEVYRUMtQVNZTkMtT1VUUFVUIHwgU1RBVFVTLUFTWU5DLU9VVFBVVCB8IE5PVElGWS1BU1lOQy1PVVRQVVQnCi0KLWBFWEVDLUFTWU5DLU9VVFBVVCA6JwotICAgICBgWyBUT0tFTiBdICIqIiBBU1lOQy1PVVRQVVQnCi0KLWBTVEFUVVMtQVNZTkMtT1VUUFVUIDonCi0gICAgIGBbIFRPS0VOIF0gIisiIEFTWU5DLU9VVFBVVCcKLQotYE5PVElGWS1BU1lOQy1PVVRQVVQgOicKLSAgICAgYFsgVE9LRU4gXSAiPSIgQVNZTkMtT1VUUFVUJwotCi1gQVNZTkMtT1VUUFVUIDonCi0gICAgIGBBU1lOQy1DTEFTUyAoICIsIiBSRVNVTFQgKSogTkwnCi0KLWBSRVNVTFQtQ0xBU1MgOicKLSAgICAgYCJkb25lIiB8ICJydW5uaW5nIiB8ICJjb25uZWN0ZWQiIHwgImVycm9yIiB8ICJleGl0IicKLQotYEFTWU5DLUNMQVNTIDonCi0gICAgIGAic3RvcHBlZCIgfCBPVEhFUlMnICh3aGVyZSBPVEhFUlMgd2lsbCBiZSBhZGRlZCBkZXBlbmRpbmcgb24gdGhlCi0gICAgIG5lZWRzLS10aGlzIGlzIHN0aWxsIGluIGRldmVsb3BtZW50KS4KLQotYFJFU1VMVCA6JwotICAgICBgIFZBUklBQkxFICI9IiBWQUxVRScKLQotYFZBUklBQkxFIDonCi0gICAgIGAgU1RSSU5HICcKLQotYFZBTFVFIDonCi0gICAgIGAgQ09OU1QgfCBUVVBMRSB8IExJU1QgJwotCi1gQ09OU1QgOicKLSAgICAgYEMtU1RSSU5HJwotCi1gVFVQTEUgOicKLSAgICAgYCAie30iIHwgInsiIFJFU1VMVCAoICIsIiBSRVNVTFQgKSogIn0iICcKLQotYExJU1QgOicKLSAgICAgYCAiW10iIHwgIlsiIFZBTFVFICggIiwiIFZBTFVFICkqICJdIiB8ICJbIiBSRVNVTFQgKCAiLCIgUkVTVUxUICkqCi0gICAgICJdIiAnCi0KLWBTVFJFQU0tUkVDT1JEIDonCi0gICAgIGBDT05TT0xFLVNUUkVBTS1PVVRQVVQgfCBUQVJHRVQtU1RSRUFNLU9VVFBVVCB8IExPRy1TVFJFQU0tT1VUUFVUJwotCi1gQ09OU09MRS1TVFJFQU0tT1VUUFVUIDonCi0gICAgIGAifiIgQy1TVFJJTkcnCi0KLWBUQVJHRVQtU1RSRUFNLU9VVFBVVCA6JwotICAgICBgIkAiIEMtU1RSSU5HJwotCi1gTE9HLVNUUkVBTS1PVVRQVVQgOicKLSAgICAgYCImIiBDLVNUUklORycKLQotYE5MIDonCi0gICAgIGBDUiB8IENSLUxGJwotCi1gVE9LRU4gOicKLSAgICAgX2FueSBzZXF1ZW5jZSBvZiBkaWdpdHNfLgotCi1gQy1TVFJJTkcgOicKLSAgICAgYCIiIiBTRVZFTi1CSVQtSVNPLUMtU1RSSU5HLUNPTlRFTlQgIiIiJwotPC9wcmU+Ci0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSU9PQlJlY29yZC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLSNpbmNsdWRlICJNSVJlc3VsdC5oIgotI2luY2x1ZGUgIk1JUmVzdWx0UmVjb3JkLmgiCi0jaW5jbHVkZSAiTUlPdXRwdXQuaCIKLQotc3RhdGljIE1JUmVzdWx0UmVjb3JkICpwcm9jZXNzTUlSZXN1bHRSZWNvcmQoY2hhciAqYnVmZmVyLCBpbnQgaWQpOwotc3RhdGljIE1JT09CUmVjb3JkICpwcm9jZXNzTUlPT0JSZWNvcmQoY2hhciAqYnVmZmVyLCBpbnQgaWQpOwotc3RhdGljIExpc3QgKnByb2Nlc3NNSVJlc3VsdHMoY2hhciAqKmJ1ZmZlcik7Ci1zdGF0aWMgTUlSZXN1bHQgKnByb2Nlc3NNSVJlc3VsdChjaGFyICoqYnVmZmVyKTsKLXN0YXRpYyBNSVZhbHVlICpwcm9jZXNzTUlWYWx1ZShjaGFyICoqYnVmZmVyKTsKLXN0YXRpYyBNSVZhbHVlICpwcm9jZXNzTUlUdXBsZShjaGFyICoqYnVmZmVyKTsKLXN0YXRpYyBNSVZhbHVlICpwcm9jZXNzTUlMaXN0KGNoYXIgKipidWZmZXIpOwotc3RhdGljIGNoYXIgKnRyYW5zbGF0ZUNTdHJpbmcoY2hhciAqKmJ1ZmZlcik7Ci0KLWNoYXIgKnByaW1hcnlQcm9tcHQgPSAiKGdkYikiOyAvLyROT04tTkxTLTEkCi1jaGFyICpzZWNvbmRhcnlQcm9tcHQgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQotLyoqCi0gKiBQb2ludCBvZiBlbnRyeSB0byBjcmVhdGUgYW4gQVNUIGZvciBNSS4KLSAqCi0gKiBAcGFyYW0gYnVmZmVyIE91dHB1dCBmcm9tIE1JIENoYW5uZWwuCi0gKiBAcGFyYW0gbWkgTUlPdXRwdXQKLSAqIEBzZWUgTUlPdXRwdXQKLSAqLwotIHZvaWQKLSBNSVBhcnNlKGNoYXIgKmJ1ZmZlciwgTUlPdXRwdXQgKm1pKSAKLSB7Ci0JaW50IGlkID0gLTE7Ci0JY2hhciAqczsKLQljaGFyICp0b2tlbjsKLQotCXdoaWxlIChidWZmZXIgIT0gTlVMTCAmJiAqYnVmZmVyICE9ICdcMCcpIHsKLQkJcyA9IHN0cmNocihidWZmZXIsICdcbicpOwotCQlpZiAocyAhPSBOVUxMKQotCQkJKnMrKyA9ICdcMCc7Ci0KLQkJdG9rZW4gPSBidWZmZXI7Ci0JCWJ1ZmZlciA9IHM7Ci0JCQotCQkvLyBGZXRjaCB0aGUgVG9rZW4vSWQKLQkJaWYgKCp0b2tlbiAhPSAnXDAnICYmIGlzZGlnaXQoKnRva2VuKSkgewotCQkJaWQgPSBzdHJ0b2wodG9rZW4sICZ0b2tlbiwgMTApOwotCQl9Ci0KLQkJLy8gUmVzdWx0UmVjb3JkIHx8fCBPdXQtT2YtQmFuZCBSZWNvcmRzCi0JCWlmICgqdG9rZW4gIT0gJ1wwJykgewotCQkJaWYgKCp0b2tlbiA9PSAnXicpIHsKLQkJCQl0b2tlbisrOwotCQkJCW1pLT5yciA9IHByb2Nlc3NNSVJlc3VsdFJlY29yZCh0b2tlbiwgaWQpOwotCQkJfSBlbHNlIGlmIChzdHJuY21wKHRva2VuLCBwcmltYXJ5UHJvbXB0LCBzdHJsZW4ocHJpbWFyeVByb21wdCkpID09IDApIHsKLQkJCQkvL2JyZWFrOyAvLyBEbyBub3RoaW5nLgotCQkJfSBlbHNlIHsKLQkJCQlNSU9PQlJlY29yZCAqYmFuZCA9IHByb2Nlc3NNSU9PQlJlY29yZCh0b2tlbiwgaWQpOwotCQkJCWlmIChiYW5kICE9IE5VTEwpIHsKLQkJCQkJaWYgKG1pLT5vb2JzID09IE5VTEwpCi0JCQkJCQltaS0+b29icyA9IE5ld0xpc3QoKTsKLQkJCQkJQWRkVG9MaXN0KG1pLT5vb2JzLCAodm9pZCAqKWJhbmQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqCi0gKiBBc3N1bWluZyAnXicgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgUmVzdWx0IFJlY29yZC4KLSAqLwotc3RhdGljIE1JUmVzdWx0UmVjb3JkICoKLXByb2Nlc3NNSVJlc3VsdFJlY29yZChjaGFyICpidWZmZXIsIGludCBpZCkKLXsKLQlNSVJlc3VsdFJlY29yZCAqcnIgPSBNSVJlc3VsdFJlY29yZE5ldygpOwotCXJyLT50b2tlbiA9IGlkOwotCWlmIChzdHJuY21wKGJ1ZmZlciwgImRvbmUiLCA0KSA9PSAwKSB7Ci0JCXJyLT5yZXN1bHRDbGFzcyA9IE1JUmVzdWx0UmVjb3JkRE9ORTsKLQkJYnVmZmVyICs9IDQ7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGJ1ZmZlciwgImVycm9yIiwgNSkgPT0gMCkgewotCQlyci0+cmVzdWx0Q2xhc3MgPSBNSVJlc3VsdFJlY29yZEVSUk9SOwotCQlidWZmZXIgKz0gNTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmZmVyLCAiZXhpdCIsIDQpID09IDApIHsKLQkJcnItPnJlc3VsdENsYXNzID0gTUlSZXN1bHRSZWNvcmRFWElUOwotCQlidWZmZXIgKz0gNDsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmZmVyLCAicnVubmluZyIsIDcpID09IDApIHsKLQkJcnItPnJlc3VsdENsYXNzID0gTUlSZXN1bHRSZWNvcmRSVU5OSU5HOwotCQlidWZmZXIgKz0gNzsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmZmVyLCAiY29ubmVjdGVkIiwgOSkgPT0gMCkgewotCQlyci0+cmVzdWx0Q2xhc3MgPSBNSVJlc3VsdFJlY29yZENPTk5FQ1RFRDsKLQkJYnVmZmVyICs9IDk7Ci0JfSBlbHNlIHsKLQkJLy8gRklYTUU6Ci0JCS8vIEVycm9yIHRocm93IGFuIGV4Y2VwdGlvbj8KLQl9Ci0KLQkvLyBSZXN1bHRzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgotCWlmICgqYnVmZmVyICE9ICdcMCcgJiYgKmJ1ZmZlciA9PSAnLCcpIHsKLQkJYnVmZmVyKys7Ci0JCUxpc3QgKnJlcyA9IHByb2Nlc3NNSVJlc3VsdHMoJmJ1ZmZlcik7Ci0JCXJyLT5yZXN1bHRzID0gcmVzOwotCX0KLQlyZXR1cm4gcnI7Ci19Ci0KLS8qKgotICogRmluZCBPdXRPZkJhbmQgUmVjb3JkcyBkZXBlbmRpbmcgb24gdGhlIHN0YXJ0aW5nIHRva2VuLgotICovCi1zdGF0aWMgTUlPT0JSZWNvcmQgKgotcHJvY2Vzc01JT09CUmVjb3JkKGNoYXIgKmJ1ZmZlciwgaW50IGlkKQotewotCU1JT09CUmVjb3JkICpvb2IgPSBOVUxMOwotCWNoYXIgYyA9ICpidWZmZXI7Ci0JaWYgKGMgPT0gJyonIHx8IGMgPT0gJysnIHx8IGMgPT0gJz0nKSB7Ci0JCS8vIENvbnN1bWUgdGhlIGZpcnN0IGNoYXIKLQkJYnVmZmVyKys7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnKicgOgotCQkJCW9vYiA9IE5ld01JRXhlY0FzeW5jT3V0cHV0KCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgJysnIDoKLQkJCQlvb2IgPSBOZXdNSVN0YXR1c0FzeW5jT3V0cHV0KCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgJz0nIDoKLQkJCQlvb2IgPSBOZXdNSU5vdGlmeUFzeW5jT3V0cHV0KCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJb29iLT50b2tlbiA9IGlkOwotCQkvLyBFeHRyYWN0IHRoZSBBc3luYy1DbGFzcwotCQljaGFyICpzID0gc3RyY2hyKGJ1ZmZlciwgJywnKTsKLQkJaWYgKHMgIT0gTlVMTCkgewotCQkJKnMrKyA9ICdcMCc7Ci0JCQlvb2ItPmNsYXNzID0gc3RyZHVwKGJ1ZmZlcik7Ci0JCQkvLyBDb25zdW1lIHRoZSBhc3luYy1jbGFzcyBhbmQgdGhlIGNvbW1hCi0JCQlidWZmZXIgPSBzOwotCQl9IGVsc2UgewotCQkJb29iLT5jbGFzcyA9IHN0cmR1cChidWZmZXIpOwotCQkJYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOwotCQl9Ci0JCUxpc3QgKnJlcyA9IHByb2Nlc3NNSVJlc3VsdHMoJmJ1ZmZlcik7Ci0JCW9vYi0+cmVzdWx0cyA9IHJlczsKLQl9IGVsc2UgaWYgKGMgPT0gJ34nIHx8IGMgPT0gJ0AnIHx8IGMgPT0gJyYnKSB7Ci0JCS8vIENvbnN1bWUgdGhlIGZpcnN0IGNoYXIKLQkJYnVmZmVyKys7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnficgOgotCQkJCW9vYiA9IE5ld01JQ29uc29sZVN0cmVhbU91dHB1dCgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlICdAJyA6Ci0JCQkJb29iID0gTmV3TUlUYXJnZXRTdHJlYW1PdXRwdXQoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAnJicgOgotCQkJCW9vYiA9IE5ld01JTG9nU3RyZWFtT3V0cHV0KCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gdHJhbnNsYXRlQ1N0cmluZygpIGFzc3VtZXMgdGhhdCB0aGUgbGVhZGluZyAiIGlzIGRlbGV0ZWQKLQkJaWYgKCpidWZmZXIgIT0gJ1wwJyAmJiAqYnVmZmVyID09ICciJykgewotCQkJYnVmZmVyKys7Ci0JCX0KLQkJb29iLT5jc3RyaW5nID0gdHJhbnNsYXRlQ1N0cmluZygmYnVmZmVyKTsKLQl9IGVsc2UgewotCQkvLyBCYWRseSBmb3JtYXQgTUkgbGluZSwganVzdCBwYXNzIGl0IHRvIHRoZSB1c2VyIGFzIHRhcmdldCBzdHJlYW0KLQkJb29iID0gTmV3TUlUYXJnZXRTdHJlYW1PdXRwdXQoKTsKLQkJb29iLT5jc3RyaW5nID0gc3RyZHVwKGJ1ZmZlcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIG9vYjsKLX0KLQotLyoqCi0gKiBBc3N1bWluZyB0aGF0IHRoZSB1c3VhbCBsZWFkaW5nIGNvbW1hIHdhcyBjb25zdW1lZC4KLSAqIEV4dHJhY3QgdGhlIE1JIFJlc3VsdCBjb21tYSBzZXBlcmF0ZWQgcmVzcG9uc2VzLgotICovCi1zdGF0aWMgTGlzdCAqIAotcHJvY2Vzc01JUmVzdWx0cyhjaGFyICoqYnVmZmVyKQotewotCUxpc3QgKmFMaXN0ID0gTmV3TGlzdCgpOwotCU1JUmVzdWx0ICpyZXN1bHQgPSBwcm9jZXNzTUlSZXN1bHQoYnVmZmVyKTsKLQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQkJQWRkVG9MaXN0KGFMaXN0LCAodm9pZCAqKXJlc3VsdCk7Ci0JfQotCXdoaWxlICgqKCpidWZmZXIpICE9ICdcMCcgJiYgKigqYnVmZmVyKSA9PSAnLCcpIHsKLQkJKCpidWZmZXIpKys7Ci0JCXJlc3VsdCA9IHByb2Nlc3NNSVJlc3VsdChidWZmZXIpOwotCQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQkJCUFkZFRvTGlzdChhTGlzdCwgKHZvaWQgKilyZXN1bHQpOwotCQl9Ci0JfQotCXJldHVybiBhTGlzdDsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3QgdGhlIE1JUmVzdWx0LiAgQ2hhcmFjdGVycyB3aWxsIGJlIGNvbnN1bWUvZGVsZXRlCi0gKiBtb3ZpbmcgZm9yd2FyZCBjb25zdHJ1Y3RpbmcgdGhlIEFTVC4KLSAqLwotc3RhdGljIE1JUmVzdWx0ICoKLXByb2Nlc3NNSVJlc3VsdChjaGFyICoqYnVmZmVyKQotewotCU1JUmVzdWx0ICpyZXN1bHQgPSBNSVJlc3VsdE5ldygpOwotCU1JVmFsdWUgKnZhbHVlOwotCWNoYXIgKmVxdWFsOwotCWlmICgqKCpidWZmZXIpICE9ICdcMCcgJiYgaXNhbHBoYSgqKCpidWZmZXIpKSAmJiAoZXF1YWwgPSBzdHJjaHIoKmJ1ZmZlciwgJz0nKSkgIT0gTlVMTCkgewotCQljaGFyICp2YXJpYWJsZSA9ICpidWZmZXI7Ci0JCSplcXVhbCsrID0gJ1wwJzsKLQkJCi0JCXJlc3VsdC0+dmFyaWFibGUgPSBzdHJkdXAodmFyaWFibGUpOyAvLyBUT0RPIHN0cmR1cD8KLQkJKmJ1ZmZlciA9IGVxdWFsOwotCQl2YWx1ZSA9IHByb2Nlc3NNSVZhbHVlKGJ1ZmZlcik7Ci0JCXJlc3VsdC0+dmFsdWUgPSB2YWx1ZTsKLQl9IGVsc2UgaWYoKigqYnVmZmVyKSAhPSAnXDAnICYmICooKmJ1ZmZlcikgPT0gJyInKSB7Ci0JCS8vIFRoaXMgYW4gZXJyb3IgYnV0IHdlIGp1c3Qgc3dhbGxvdyBpdCBhbmQgbW92ZSBvbi4KLQkJdmFsdWUgPSBwcm9jZXNzTUlWYWx1ZShidWZmZXIpOwotCQlyZXN1bHQtPnZhbHVlID0gdmFsdWU7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0LT52YXJpYWJsZSA9IHN0cmR1cCgqYnVmZmVyKTsKLQkJcmVzdWx0LT52YWx1ZSA9IE5ld01JQ29uc3QoKTsgLy8gRW1wdHkgc3RyaW5nOj8/PwotCQkqKCpidWZmZXIpID0gJ1wwJzsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGaW5kIGEgTUlWYWx1ZSBpbXBsZW1lbnRhdGlvbiBvciByZXR1cm4gbnVsbC4KLSAqLwotc3RhdGljIE1JVmFsdWUgKgotcHJvY2Vzc01JVmFsdWUoY2hhciAqKmJ1ZmZlcikKLXsKLQlNSVZhbHVlICp2YWx1ZSA9IE5VTEw7Ci0JaWYgKCooKmJ1ZmZlcikgIT0gJ1wwJykgewotCQlpZiAoKigqYnVmZmVyKSA9PSAneycpIHsKLQkJCSgqYnVmZmVyKSsrOwotCQkJdmFsdWUgPSBwcm9jZXNzTUlUdXBsZShidWZmZXIpOwotCQl9IGVsc2UgaWYgKCooKmJ1ZmZlcikgPT0gJ1snKSB7Ci0JCQkoKmJ1ZmZlcikrKzsKLQkJCXZhbHVlID0gcHJvY2Vzc01JTGlzdChidWZmZXIpOwotCQl9IGVsc2UgaWYgKCooKmJ1ZmZlcikgPT0gJyInKSB7Ci0JCQkoKmJ1ZmZlcikrKzsKLQkJCXZhbHVlID0gTmV3TUlDb25zdCgpOwotCQkJdmFsdWUtPmNzdHJpbmcgPSB0cmFuc2xhdGVDU3RyaW5nKGJ1ZmZlcik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIEFzc3VtaW5nIHRoZSBzdGFydGluZyAneycgd2FzIGRlbGV0ZWQgZm9ybSB0aGUgU3RyaW5nQnVmZmVyLAotICogZ28gdG8gdGhlIGNsb3NpbmcgJ30nIGNvbnN1bWluZy9kZWxldGluZyBhbGwgdGhlIGNoYXJhY3RlcnMuCi0gKiBUaGlzIGlzIHVzdWFsbHkgY2FsbCBieSBwcm9jZXNzTUl2YWx1ZSgpOwotICovCi1zdGF0aWMgTUlWYWx1ZSAqCi1wcm9jZXNzTUlUdXBsZShjaGFyICoqYnVmZmVyKQotewotCU1JVmFsdWUgKnR1cGxlID0gTmV3TUlUdXBsZSgpOwotI2lmZGVmIF9fQVBQTEVfXwotCUxpc3QgKnZhbHVlcyA9IE5ld0xpc3QoKTsKLQlNSVZhbHVlICp2YWx1ZTsKLQlNSVJlc3VsdCAqcmVzdWx0OwotI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCUxpc3QgKnJlc3VsdHMgPSBOVUxMOwotCS8vIENhdGNoIGNsb3NpbmcgJ30nCi0Jd2hpbGUgKCooKmJ1ZmZlcikgIT0gJ1wwJyAmJiAqKCpidWZmZXIpICE9ICd9JykgewotI2lmZGVmIF9fQVBQTEVfXwotCQkvLyBUcnkgZm9yIHRoZSBNSVZhbHVlIGZpcnN0Ci0JCXZhbHVlID0gcHJvY2Vzc01JVmFsdWUoYnVmZmVyKTsKLQkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCUFkZFRvTGlzdCh2YWx1ZXMsICh2b2lkICopdmFsdWUpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gcHJvY2Vzc01JUmVzdWx0KGJ1ZmZlcik7Ci0JCQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQkJCQlpZiAocmVzdWx0cyA9PSBOVUxMKSB7Ci0JCQkJCXJlc3VsdHMgPSBOZXdMaXN0KCk7Ci0JCQkJfQkJCQkKLQkJCQlBZGRUb0xpc3QocmVzdWx0cywgKHZvaWQgKilyZXN1bHQpOwotCQkJfQotCQl9Ci0JCWlmICgqKCpidWZmZXIpICE9ICdcMCcgJiYgKigqYnVmZmVyKSA9PSAnLCcpIHsKLQkJCSgqYnVmZmVyKSsrOwotCQl9Ci0jZWxzZSAvKiBfX0FQUExFX18gKi8KLQkJcmVzdWx0cyA9IHByb2Nlc3NNSVJlc3VsdHMoYnVmZmVyKTsKLSNlbmRpZiAvKiBfX0FQUExFX18gKi8KLQl9Ci0JaWYgKCooKmJ1ZmZlcikgIT0gJ1wwJyAmJiAqKCpidWZmZXIpID09ICd9JykgewotCQkoKmJ1ZmZlcikrKzsKLQl9Ci0JdHVwbGUtPnJlc3VsdHMgPSByZXN1bHRzOwotI2lmZGVmIF9fQVBQTEVfXwotCXR1cGxlLT52YWx1ZXMgPSB2YWx1ZXM7Ci0jZW5kaWYgLyogX19BUFBMRV9fICovCi0JcmV0dXJuIHR1cGxlOwotfQotCi0vKioKLSAqIEFzc3VtaW5nIHRoZSBsZWFkaW5nICdbJyB3YXMgZGVsZXRlZCwgZmluZCB0aGUgY2xvc2luZwotICogJ10nIGNvbnN1bWluZy9kZWxldGUgY2hhcnMgZnJvbSB0aGUgU3RyaW5nQnVmZmVyLgotICovCi1zdGF0aWMgTUlWYWx1ZSAqCi1wcm9jZXNzTUlMaXN0KGNoYXIgKipidWZmZXIpCi17Ci0JTUlWYWx1ZSAqbGlzdCA9IE5ld01JTGlzdCgpOwotCUxpc3QgKnZhbHVlTGlzdCA9IE5ld0xpc3QoKTsKLQlMaXN0ICpyZXN1bHRMaXN0ID0gTmV3TGlzdCgpOwotCU1JVmFsdWUgKnZhbHVlOwotCU1JUmVzdWx0ICpyZXN1bHQ7Ci0JLy8gY2F0Y2ggY2xvc2luZyAnXScKLQl3aGlsZSAoKigqYnVmZmVyKSAhPSAnXDAnICYmICooKmJ1ZmZlcikgIT0gJ10nKSB7Ci0JCS8vIFRyeSBmb3IgdGhlIE1JVmFsdWUgZmlyc3QKLQkJdmFsdWUgPSBwcm9jZXNzTUlWYWx1ZShidWZmZXIpOwotCQlpZiAodmFsdWUgIT0gTlVMTCkgewotCQkJQWRkVG9MaXN0KHZhbHVlTGlzdCwgKHZvaWQgKil2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBwcm9jZXNzTUlSZXN1bHQoYnVmZmVyKTsKLQkJCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQkJCUFkZFRvTGlzdChyZXN1bHRMaXN0LCAodm9pZCAqKXJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCooKmJ1ZmZlcikgIT0gJ1wwJyAmJiAqKCpidWZmZXIpID09ICcsJykgewotCQkJKCpidWZmZXIpKys7Ci0JCX0KLQl9Ci0JaWYgKCooKmJ1ZmZlcikgIT0gJ1wwJyAmJiAqKCpidWZmZXIpID09ICddJykgewotCQkoKmJ1ZmZlcikrKzsKLQl9Ci0JbGlzdC0+dmFsdWVzID0gdmFsdWVMaXN0OwotCWxpc3QtPnJlc3VsdHMgPSByZXN1bHRMaXN0OwotCXJldHVybiBsaXN0OwotfQotCi0vKgotICogTUkgQy1TdHJpbmcgcmF0aGVyIE1JQ09uc3QgdmFsdWVzIGFyZSBlbmNsb3NlIGluIGRvdWJsZSBxdW90ZXMKLSAqIGFuZCBhbnkgZG91YmxlIHF1b3RlcyBvciBiYWNrc2xhc2ggaW4gdGhlIHN0cmluZyBhcmUgZXNjYXBlZC4KLSAqIEFzc3VtaW5nIHRoZSBzdGFydGluZyBkb3VibGUgcXVvdGUgd2FzIHJlbW92ZWQuCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgYXQgdGhlIGNsb3NpbmcgZG91YmxlIHF1b3RlIHJlbW92ZSB0aGUgZXh0cmEKLSAqIGJhY2tzbGFjaCBlc2NhcGluZyBhbmQgcmV0dXJuIHRoZSBzdHJpbmcgX193aXRob3V0X18gdGhlIGVuY2xvc2luZyBkb3VibGUgcXVvdGVzCi0gKiBUaGUgb3JpZ25hbCBTdHJpbmdCdWZmZXIgd2lsbCBtb3ZlIGZvcndhcmQuCi0gKi8KLXN0YXRpYyBjaGFyICoKLXRyYW5zbGF0ZUNTdHJpbmcoY2hhciAqKmJ1ZmZlcikKLXsKLQlpbnQgZXNjYXBlID0gMDsKLQlpbnQgY2xvc2luZ1F1b3RlcyA9IDA7Ci0JY2hhciAqcyA9ICpidWZmZXI7Ci0JY2hhciAqc2IgPSBzdHJkdXAocyk7Ci0JY2hhciAqcCA9IHNiOwotCi0JZm9yICg7ICpzICE9ICdcMCcgJiYgIWNsb3NpbmdRdW90ZXM7IHMrKykgewotCQlpZiAoKnMgPT0gJ1xcJykgewotCQkJaWYgKGVzY2FwZSkgewotCQkJCSpwKysgPSAqczsKLQkJCQllc2NhcGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQllc2NhcGUgPSAxOwotCQkJfQotCQl9IGVsc2UgaWYgKCpzID09ICciJykgewotCQkJaWYgKGVzY2FwZSkgewotCQkJCSpwKysgPSAqczsKLQkJCQllc2NhcGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBCYWlsIG91dC4KLQkJCQljbG9zaW5nUXVvdGVzID0gMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlc2NhcGUpIHsKLQkJCQkqcCsrID0gJ1xcJzsKLQkJCX0KLQkJCSpwKysgPSAqczsKLQkJCWVzY2FwZSA9IDA7Ci0JCX0KLQl9Ci0JKmJ1ZmZlciA9IHM7Ci0JKnArKyA9ICdcMCc7Ci0JcmV0dXJuIHNiOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlSZXN1bHQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JUmVzdWx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDEwODEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlSZXN1bHQuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLQotTUlSZXN1bHQgKgotTUlSZXN1bHROZXcodm9pZCkKLXsKLQlNSVJlc3VsdCAqCXJlczsKLQkKLQlyZXMgPSAoTUlSZXN1bHQgKiltYWxsb2Moc2l6ZW9mKE1JUmVzdWx0KSk7Ci0JcmV0dXJuIHJlczsKLX0KLQotTUlTdHJpbmcgKgotTUlSZXN1bHRUb1N0cmluZyhNSVJlc3VsdCAqcikKLXsKLQlNSVN0cmluZyAqCXN0ciA9IE1JU3RyaW5nTmV3KHItPnZhcmlhYmxlKTsKLQlNSVN0cmluZyAqCXN0cjI7Ci0JY2hhciAqCQlwOwotCQotCWlmIChyLT52YWx1ZSAhPSBOVUxMKSB7Ci0JCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIj0iKSk7Ci0JCXN0cjIgPSBNSVZhbHVlVG9TdHJpbmcoci0+dmFsdWUpOwotCQlwID0gTUlTdHJpbmdUb0NTdHJpbmcoc3RyMik7Ci0JCWlmICgqcCA9PSAnWycgfHwgKnAgPT0neycpIHsKLQkJCU1JU3RyaW5nQXBwZW5kKHN0ciwgc3RyMik7Ci0JCX0gZWxzZSB7Ci0JCQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCJcIiVzXCIiLCBwKSk7Ci0JCQlNSVN0cmluZ0ZyZWUoc3RyMik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHN0cjsKLX0KLQotdm9pZAotTUlSZXN1bHRGcmVlKE1JUmVzdWx0ICpyKQotewotCWlmIChyLT52YXJpYWJsZSAhPSBOVUxMKQotCQlmcmVlKHItPnZhcmlhYmxlKTsKLQlpZiAoci0+dmFsdWUgIT0gTlVMTCkKLQkJTUlWYWx1ZUZyZWUoci0+dmFsdWUpOwotCWZyZWUocik7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVJlc3VsdC5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlSZXN1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlMmIxMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVJlc3VsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0gIAotI2lmbmRlZiBfTUlSRVNVTFRfSF8KLSNkZWZpbmUgX01JUkVTVUxUX0hfCi0KLSNpbmNsdWRlICJNSVN0cmluZy5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLQotLyoqCi0gKiBHREIvTUkgcmVzdWx0IHNlbWF0aWMgKFZhcmlhYmxlPVZhbHVlKQotICovCi1zdHJ1Y3QgTUlSZXN1bHQgewotCWNoYXIgKnZhcmlhYmxlOwotCU1JVmFsdWUgKnZhbHVlOwotfTsKLXR5cGVkZWYgc3RydWN0IE1JUmVzdWx0IE1JUmVzdWx0OwotCi1leHRlcm4gTUlSZXN1bHQgKk1JUmVzdWx0TmV3KHZvaWQpOwotZXh0ZXJuIE1JU3RyaW5nICpNSVJlc3VsdFRvU3RyaW5nKE1JUmVzdWx0ICpyKTsKLWV4dGVybiB2b2lkIE1JUmVzdWx0RnJlZShNSVJlc3VsdCAqcik7Ci0jZW5kaWYgLyogX01JUkVTVUxUX0hfICovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVJlc3VsdFJlY29yZC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlSZXN1bHRSZWNvcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1MmM5Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVJlc3VsdFJlY29yZC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSVZhbHVlLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHQuaCIKLSNpbmNsdWRlICJNSVJlc3VsdFJlY29yZC5oIgotCi1NSVJlc3VsdFJlY29yZCAqCi1NSVJlc3VsdFJlY29yZE5ldyh2b2lkKQotewotCU1JUmVzdWx0UmVjb3JkICoJcnI7Ci0JCi0JcnIgPSAoTUlSZXN1bHRSZWNvcmQgKiltYWxsb2Moc2l6ZW9mKE1JUmVzdWx0UmVjb3JkKSk7Ci0JcnItPnJlc3VsdHMgPSBOZXdMaXN0KCk7Ci0JcnItPnJlc3VsdENsYXNzID0gTUlSZXN1bHRSZWNvcmRJTlZBTElEOwotCXJyLT50b2tlbiA9IC0xOwotCXJldHVybiBycjsKLX0KLQotTUlTdHJpbmcgKgotTUlSZXN1bHRSZWNvcmRUb1N0cmluZyhNSVJlc3VsdFJlY29yZCAqcnIpCi17Ci0JY2hhciAqCQljbGFzczsKLQlNSVN0cmluZyAqCXN0cjsKLQlNSVJlc3VsdCAqCXI7Ci0JCi0Jc3dpdGNoIChyci0+cmVzdWx0Q2xhc3MpIHsKLQljYXNlIE1JUmVzdWx0UmVjb3JkRE9ORToKLQkJY2xhc3MgPSAiZG9uZSI7Ci0JCWJyZWFrOwotCWNhc2UgTUlSZXN1bHRSZWNvcmRSVU5OSU5HOgotCQljbGFzcyA9ICJydW5uaW5nIjsKLQkJYnJlYWs7Ci0JY2FzZSBNSVJlc3VsdFJlY29yZENPTk5FQ1RFRDoKLQkJY2xhc3MgPSAiY29ubmVjdGVkIjsKLQkJYnJlYWs7Ci0JY2FzZSBNSVJlc3VsdFJlY29yZEVSUk9SOgotCQljbGFzcyA9ICJlcnJvciI7Ci0JCWJyZWFrOwotCWNhc2UgTUlSZXN1bHRSZWNvcmRFWElUOgotCQljbGFzcyA9ICJleGl0IjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY2xhc3MgPSAiPGludmFsaWQ+IjsKLQkJYnJlYWs7Ci0JfQotCQotCWlmIChyci0+dG9rZW4gIT0gLTEpCi0JCXN0ciA9IE1JU3RyaW5nTmV3KCIlZF4lcyIsIHJyLT50b2tlbiwgY2xhc3MpOwotCWVsc2UKLQkJc3RyID0gTUlTdHJpbmdOZXcoIl4lcyIsIGNsYXNzKTsKLQkKLQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAociA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJyLT5yZXN1bHRzKSkgIT0gTlVMTDspIHsKLQkJCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIiwiKSk7Ci0JCQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JUmVzdWx0VG9TdHJpbmcocikpOwotCX0KLQkKLQlyZXR1cm4gc3RyOwotfQotCi12b2lkCi1NSVJlc3VsdFJlY29yZEZyZWUoTUlSZXN1bHRSZWNvcmQgKnJyKQotewotCWlmIChyci0+cmVzdWx0cyAhPSBOVUxMKQotCQlEZXN0cm95TGlzdChyci0+cmVzdWx0cywgTUlSZXN1bHRGcmVlKTsKLQlmcmVlKHJyKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JUmVzdWx0UmVjb3JkLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVJlc3VsdFJlY29yZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDI4ZTI0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JUmVzdWx0UmVjb3JkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLSAgCi0jaWZuZGVmIF9NSVJFU1VMVFJFQ09SRF9IXwotI2RlZmluZSBfTUlSRVNVTFRSRUNPUkRfSF8KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSVN0cmluZy5oIgotCi0jZGVmaW5lIE1JUmVzdWx0UmVjb3JkSU5WQUxJRAkwCi0jZGVmaW5lIE1JUmVzdWx0UmVjb3JkRE9ORQkJMQotI2RlZmluZSBNSVJlc3VsdFJlY29yZFJVTk5JTkcJMgotI2RlZmluZSBNSVJlc3VsdFJlY29yZENPTk5FQ1RFRAkzCi0jZGVmaW5lIE1JUmVzdWx0UmVjb3JkRVJST1IJCTQKLSNkZWZpbmUgTUlSZXN1bHRSZWNvcmRFWElUCQk1Ci0KLS8qKgotICogR0RCL01JIFJlc3VsdFJlY29yZC4KLSAqLwotc3RydWN0IE1JUmVzdWx0UmVjb3JkIHsKLQlMaXN0ICoJcmVzdWx0czsKLQlpbnQJCXJlc3VsdENsYXNzOwotCWludAkJdG9rZW47Ci19OwotdHlwZWRlZiBzdHJ1Y3QgTUlSZXN1bHRSZWNvcmQgTUlSZXN1bHRSZWNvcmQ7Ci0KLWV4dGVybiBNSVJlc3VsdFJlY29yZCAqTUlSZXN1bHRSZWNvcmROZXcodm9pZCk7Ci1leHRlcm4gTUlTdHJpbmcgKk1JUmVzdWx0UmVjb3JkVG9TdHJpbmcoTUlSZXN1bHRSZWNvcmQgKnJyKTsKLWV4dGVybiB2b2lkIE1JUmVzdWx0UmVjb3JkRnJlZShNSVJlc3VsdFJlY29yZCAqcnIpOwotI2VuZGlmIC8qIF9NSVJFU1VMVFJFQ09SRF9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlTZXNzaW9uLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVNlc3Npb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhMTU2NS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVNlc3Npb24uYworKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy9lcnJuby5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JU2Vzc2lvbi5oIgotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotI2luY2x1ZGUgIk1JRXJyb3IuaCIKLSNpbmNsdWRlICJNSU9PQlJlY29yZC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLSNpbmNsdWRlICJNSVJlc3VsdC5oIgotCi1zdGF0aWMgTGlzdCAqCQkJTUlTZXNzaW9uTGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwJTUlTZXNzaW9uRGVmYXVsdFNlbGVjdFRpbWVvdXQgPSB7MCwgMTAwMH07Ci1zdGF0aWMgaW50CQkJCU1JU2Vzc2lvbkRlYnVnID0gMDsKLQotc3RhdGljIHZvaWQgRG9PT0JBc3luY0NhbGxiYWNrcyhNSVNlc3Npb24gKnNlc3MsIExpc3QgKm9vYnMpOwotc3RhdGljIHZvaWQgRG9PT0JTdHJlYW1DYWxsYmFja3MoTUlTZXNzaW9uICpzZXNzLCBMaXN0ICpvb2JzKTsKLXN0YXRpYyB2b2lkIEhhbmRsZUNoaWxkKGludCBzaWcpOwotc3RhdGljIGludCBXcml0ZUNvbW1hbmQoaW50IGZkLCBjaGFyICpjbWQpOwotc3RhdGljIGNoYXIgKlJlYWRSZXNwb25zZShpbnQgZmQpOwotCi1NSVNlc3Npb24gKgotTUlTZXNzaW9uTmV3KHZvaWQpCi17Ci0JTUlTZXNzaW9uICoJc2VzcyA9IChNSVNlc3Npb24gKiltYWxsb2Moc2l6ZW9mKE1JU2Vzc2lvbikpOwotCQotCXNlc3MtPmluX2ZkID0gLTE7Ci0Jc2Vzcy0+b3V0X2ZkID0gLTE7Ci0Jc2Vzcy0+cGlkID0gLTE7Ci0Jc2Vzcy0+ZXhpdGVkID0gMTsKLQlzZXNzLT5leGl0X3N0YXR1cyA9IDA7Ci0Jc2Vzcy0+Y29tbWFuZCA9IE5VTEw7Ci0Jc2Vzcy0+c2VuZF9xdWV1ZSA9IE5ld0xpc3QoKTsKLQlzZXNzLT5nZGJfcGF0aCA9IHN0cmR1cCgiZ2RiIik7Ci0Jc2Vzcy0+ZXZlbnRfY2FsbGJhY2sgPSBOVUxMOwotCXNlc3MtPmNtZF9jYWxsYmFjayA9IE5VTEw7Ci0Jc2Vzcy0+ZXhlY19jYWxsYmFjayA9IE5VTEw7Ci0Jc2Vzcy0+c3RhdHVzX2NhbGxiYWNrID0gTlVMTDsKLQlzZXNzLT5ub3RpZnlfY2FsbGJhY2sgPSBOVUxMOwotCXNlc3MtPmNvbnNvbGVfY2FsbGJhY2sgPSBOVUxMOwotCXNlc3MtPmxvZ19jYWxsYmFjayA9IE5VTEw7Ci0Jc2Vzcy0+dGFyZ2V0X2NhbGxiYWNrID0gTlVMTDsKLQlzZXNzLT5zZWxlY3RfdGltZW91dCA9IE1JU2Vzc2lvbkRlZmF1bHRTZWxlY3RUaW1lb3V0OwotCi0JaWYgKE1JU2Vzc2lvbkxpc3QgPT0gTlVMTCkKLQkJTUlTZXNzaW9uTGlzdCA9IE5ld0xpc3QoKTsKLQlBZGRUb0xpc3QoTUlTZXNzaW9uTGlzdCwgKHZvaWQgKilzZXNzKTsKLQkKLQlyZXR1cm4gc2VzczsKLX0KLQotdm9pZAotTUlTZXNzaW9uRnJlZShNSVNlc3Npb24gKnNlc3MpCi17Ci0JUmVtb3ZlRnJvbUxpc3QoTUlTZXNzaW9uTGlzdCwgKHZvaWQgKilzZXNzKTsKLQlmcmVlKHNlc3MpOwotfQotCi1zdGF0aWMgdm9pZAotSGFuZGxlQ2hpbGQoaW50IHNpZykKLXsKLQlpbnQJCQlzdGF0OwotCXBpZF90CQlwaWQ7Ci0JTUlTZXNzaW9uICoJc2VzczsKLQkKLQlwaWQgPSB3YWl0KCZzdGF0KTsKLQkKLQlpZiAoTUlTZXNzaW9uTGlzdCAhPSBOVUxMKSB7Ci0JCWZvciAoU2V0TGlzdChNSVNlc3Npb25MaXN0KTsgKHNlc3MgPSAoTUlTZXNzaW9uICopR2V0TGlzdEVsZW1lbnQoTUlTZXNzaW9uTGlzdCkpICE9IE5VTEw7ICkgewotCQkJaWYgKHNlc3MtPnBpZCA9PSBwaWQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdkYiBwaWQgJWQgaGFzIGV4aXRlZFxuIiwgcGlkKTsKLQkJCQlzZXNzLT5leGl0ZWQgPSAxOwotCQkJCXNlc3MtPmV4aXRfc3RhdHVzID0gc3RhdDsKLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZAotTUlTZXNzaW9uU2V0VGltZW91dChNSVNlc3Npb24gKnNlc3MsIGxvbmcgc2VjLCBsb25nIHVzZWMpCi17Ci0Jc2Vzcy0+c2VsZWN0X3RpbWVvdXQudHZfc2VjID0gc2VjOwotCXNlc3MtPnNlbGVjdF90aW1lb3V0LnR2X3VzZWMgPSB1c2VjOwotfQotCi12b2lkCi1NSVNlc3Npb25TZXREZWJ1ZyhpbnQgZGVidWcpCi17Ci0JTUlTZXNzaW9uRGVidWcgPSBkZWJ1ZzsKLS8vCU1JU2Vzc2lvbkRlYnVnID0gMTsKLX0KLQotaW50Ci1NSVNlc3Npb25TdGFydExvY2FsKE1JU2Vzc2lvbiAqc2VzcywgY2hhciAqcHJvZykKLXsKLQlpbnQJCQlwMVsyXTsKLQlpbnQJCQlwMlsyXTsKLQkKLQlpZiAocGlwZShwMSkgPCAwIHx8IHBpcGUocDIpIDwgMCkgewotCQlNSVNldEVycm9yKE1JX0VSUk9SX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlzZXNzLT5pbl9mZCA9IHAyWzFdOwotCXNlc3MtPm91dF9mZCA9IHAxWzBdOwotCXNlc3MtPmV4aXRlZCA9IDA7Ci0JCi0Jc2lnbmFsKFNJR0NITEQsIEhhbmRsZUNoaWxkKTsKLQlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7Ci0JCi0Jc3dpdGNoIChzZXNzLT5waWQgPSBmb3JrKCkpCi0JewotCWNhc2UgMDoKLQkJZHVwMihwMlswXSwgMCk7Ci0JCWR1cDIocDFbMV0sIDEpOwotCQljbG9zZShwMVswXSk7Ci0JCWNsb3NlKHAxWzFdKTsKLQkJY2xvc2UocDJbMF0pOwotCQljbG9zZShwMlsxXSk7Ci0JCQotCQlpZiAocHJvZyA9PSBOVUxMKQotCQkJZXhlY2xwKHNlc3MtPmdkYl9wYXRoLCAiZ2RiIiwgIi1xIiwgIi10dHkiLCAiL2Rldi9udWxsIiwgIi1pIiwgIm1pIiwgTlVMTCk7Ci0JCWVsc2UKLQkJCWV4ZWNscChzZXNzLT5nZGJfcGF0aCwgImdkYiIsICItcSIsICItdHR5IiwgIi9kZXYvbnVsbCIsICItaSIsICJtaSIsIHByb2csIE5VTEwpOwotCQkKLQkJZXhpdCgxKTsKLQkKLQljYXNlIC0xOgotCQlNSVNldEVycm9yKE1JX0VSUk9SX1NZU1RFTSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCSAgICAgICAgCi0JZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0JfQotCi0JY2xvc2UocDFbMV0pOwotCWNsb3NlKHAyWzBdKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotTUlTZXNzaW9uUmVnaXN0ZXJFdmVudENhbGxiYWNrKE1JU2Vzc2lvbiAqc2Vzcywgdm9pZCAoKmNhbGxiYWNrKShNSUV2ZW50ICopKQotewotCXNlc3MtPmV2ZW50X2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQKLU1JU2Vzc2lvblJlZ2lzdGVyQ29tbWFuZENhbGxiYWNrKE1JU2Vzc2lvbiAqc2Vzcywgdm9pZCAoKmNhbGxiYWNrKShNSVJlc3VsdFJlY29yZCAqKSkKLXsKLQlzZXNzLT5jbWRfY2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotdm9pZAotTUlTZXNzaW9uUmVnaXN0ZXJFeGVjQ2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKiwgTGlzdCAqKSkKLXsKLQlzZXNzLT5leGVjX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQKLU1JU2Vzc2lvblJlZ2lzdGVyU3RhdHVzQ2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKiwgTGlzdCAqKSkKLXsKLQlzZXNzLT5zdGF0dXNfY2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotdm9pZAotTUlTZXNzaW9uUmVnaXN0ZXJOb3RpZnlDYWxsYmFjayhNSVNlc3Npb24gKnNlc3MsIHZvaWQgKCpjYWxsYmFjaykoY2hhciAqLCBMaXN0ICopKQotewotCXNlc3MtPm5vdGlmeV9jYWxsYmFjayA9IGNhbGxiYWNrOwotfQotCi12b2lkCi1NSVNlc3Npb25SZWdpc3RlckNvbnNvbGVDYWxsYmFjayhNSVNlc3Npb24gKnNlc3MsIHZvaWQgKCpjYWxsYmFjaykoY2hhciAqKSkKLXsKLQlzZXNzLT5jb25zb2xlX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQKLU1JU2Vzc2lvblJlZ2lzdGVyTG9nQ2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKikpCi17Ci0Jc2Vzcy0+bG9nX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQKLU1JU2Vzc2lvblJlZ2lzdGVyVGFyZ2V0Q2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKikpCi17Ci0Jc2Vzcy0+dGFyZ2V0X2NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQKLU1JU2Vzc2lvblNldEdEQlBhdGgoTUlTZXNzaW9uICpzZXNzLCBjaGFyICpwYXRoKQotewotCWlmIChzZXNzLT5nZGJfcGF0aCAhPSBOVUxMKQotCQlmcmVlKHNlc3MtPmdkYl9wYXRoKTsKLQlzZXNzLT5nZGJfcGF0aCA9IHN0cmR1cChwYXRoKTsKLX0KLQotaW50Ci1NSVNlc3Npb25TZW5kQ29tbWFuZChNSVNlc3Npb24gKnNlc3MsIE1JQ29tbWFuZCAqY21kKQotewotCWlmIChzZXNzLT5waWQgPT0gLTEpIHsKLQkJTUlTZXRFcnJvcihNSV9FUlJPUl9TRVNTSU9OLCAiIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlBZGRUb0xpc3Qoc2Vzcy0+c2VuZF9xdWV1ZSwgKHZvaWQgKiljbWQpOwotCQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VuZCBjb21tYW5kIHRvIEdEQi4gV2Uga2VlcCB3cml0aW5nCi0gKiB1bnRpbCB0aGUgd2hvbGUgY29tbWFuZCBoYXMgYmVlbiBzZW50LgotICogCi0gKiBUaGVyZSBpcyBhIGNoYW5jZSB0aGlzIGNvdWxkIGJsb2NrLgotICovCi1zdGF0aWMgaW50Ci1Xcml0ZUNvbW1hbmQoaW50IGZkLCBjaGFyICpjbWQpCi17Ci0JaW50CW47Ci0JaW50CWxlbiA9IHN0cmxlbihjbWQpOwotCi0JaWYgKE1JU2Vzc2lvbkRlYnVnKSB7Ci0JCXByaW50ZigiTUk6IFNFTkQgJXMiLCBjbWQpOwotCQlpZiAoY21kW2xlbi0xXSAhPSAnXG4nKQotCQkJcHJpbnRmKCJcbiIpOwotCQlmZmx1c2goc3Rkb3V0KTsKLQl9Ci0JCQotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCW4gPSB3cml0ZShmZCwgY21kLCBsZW4pOwotCQlpZiAobiA8PSAwKSB7Ci0JCQlpZiAobiA8IDApIHsKLQkJCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQkJCWNvbnRpbnVlOwotCQkJCU1JU2V0RXJyb3IoTUlfRVJST1JfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCQotCQljbWQgKz0gbjsKLQkJbGVuIC09IG47Ci0JfQotCQkKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlYWQgQlVGU0laIGNodW5rcyBvZiBkYXRhIHVudGlsIHdlIGhhdmUgcmVhZAotICogZXZlcnl0aGluZyBhdmFpbGFibGUuCi0gKiAKLSAqIEV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVhZCBpZjoKLSAqIDEpIHRoZSByZWFkIHJldHVybnMgbGVzcyB0aGFuIEJVRlNJWgotICogMikgdGhlIHJlYWQgd291bGQgYmxvY2sgKGVycm5vID09IEVBR0FJTikKLSAqIAotICogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBPX05PTkJMT0NLIGhhcyBiZWVuIHNldCAKLSAqIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKiAKLSAqIFRoZSBidWZmZXIgaXMgc3RhdGljLCBzbyB3ZSBqdXN0IHJldXNlIGl0IGZvciBlYWNoCi0gKiBjYWxsIGFuZCBpbmNyZWFzZSB0aGUgc2l6ZSBpZiBuZWNlc3NhcnkuCi0gKi8KLSNkZWZpbmUgTUlfQlVGU0laIDEwMjQgLy9CVUZTSVoKLXN0YXRpYyBjaGFyICoKLVJlYWRSZXNwb25zZShpbnQgZmQpCi17Ci0JaW50CQkJCW47Ci0JaW50CQkJCWxlbiA9IDA7Ci0JY2hhciAqCQkJcDsKLQlzdGF0aWMgaW50CQlyZXNfYnVmX2xlbiA9IE1JX0JVRlNJWjsKLQlzdGF0aWMgY2hhciAqCXJlc19idWYgPSBOVUxMOwotCQotCS8vaWYgKHJlc19idWYgIT0gTlVMTCkgewotCQkvL2ZyZWUocmVzX2J1Zik7Ci0JLy99Ci0JCi0JaWYgKHJlc19idWYgPT0gTlVMTCkKLQkJcmVzX2J1ZiA9IChjaGFyICopbWFsbG9jKE1JX0JVRlNJWik7Ci0KLQlwID0gcmVzX2J1ZjsKLQlmb3IgKDs7KSB7Ci0JCW4gPSByZWFkKGZkLCBwLCBNSV9CVUZTSVopOwotCQlpZiAobiA8PSAwKSB7Ci0JCQlpZiAobiA8IDApIHsKLQkJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQotCQkJCQlicmVhazsKLQkJCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQkJCWNvbnRpbnVlOwotCQkJCU1JU2V0RXJyb3IoTUlfRVJST1JfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQkJfQotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQlpZiAobiA8IE1JX0JVRlNJWikKLQkJCWJyZWFrOwotCQkJCi0JCWxlbiArPSBNSV9CVUZTSVo7Ci0KLQkJaWYgKGxlbiA9PSByZXNfYnVmX2xlbikgewotCQkJcmVzX2J1Zl9sZW4gKz0gTUlfQlVGU0laOwotCQkJcmVzX2J1ZiA9IChjaGFyICopcmVhbGxvYyhyZXNfYnVmLCByZXNfYnVmX2xlbik7Ci0JCX0KLQkJCi0JCXAgPSAmcmVzX2J1ZltsZW5dOwotCX0KLQkKLQlpZiAobiA+IDApCi0JCXBbbl0gPSAnXDAnOwotCi0JaWYgKE1JU2Vzc2lvbkRlYnVnKSB7Ci0JCXByaW50ZigiTUk6IFJFQ1YgJXMiLCByZXNfYnVmKTsgCi0JCWlmIChyZXNfYnVmW3N0cmxlbihyZXNfYnVmKS0xXSAhPSAnXG4nKQotCQkJcHJpbnRmKCJcbiIpOwotCQlmZmx1c2goc3Rkb3V0KTsKLQl9Ci0KLQlyZXR1cm4gcmVzX2J1ZjsKLX0KLQotLyoKLSAqIFNlbmQgZmlyc3QgcGVuZGluZyBjb21tYW5kIHRvIEdEQiBmb3IgZWFjaCBzZXNzaW9uLgotICogCi0gKiBGb3IgZWFjaCBzZXNzaW9uLCByZWFkIHJlc3BvbnNlIGZyb20gR0RCIGFuZCAKLSAqIHBhcnNlIHRoZSByZXN1bHQuCi0gKiAKLSAqIEFzc3VtZXMgdGhhdCBmZHMgY29udGFpbnMgZmlsZSBkZXNjcmlwdG9ycyByZWFkeQotICogZm9yIHdyaXRpbmcuCi0gKi8KLXZvaWQKLU1JU2Vzc2lvblByb2Nlc3NDb21tYW5kc0FuZFJlc3BvbnNlcyhNSVNlc3Npb24gKnNlc3MsIGZkX3NldCAqcmZkcywgZmRfc2V0ICp3ZmRzLCBNSU91dHB1dCAqb3V0cHV0KQotewotCWNoYXIgKgkJc3RyOwotCQotCWlmIChzZXNzLT5waWQgPT0gLTEpCi0JCXJldHVybjsKLQkJCi0JaWYgKHNlc3MtPmluX2ZkICE9IC0xCi0JCSYmICFFbXB0eUxpc3Qoc2Vzcy0+c2VuZF9xdWV1ZSkKLQkJJiYgc2Vzcy0+Y29tbWFuZCA9PSBOVUxMCi0JCSYmICh3ZmRzID09IE5VTEwgfHwgRkRfSVNTRVQoc2Vzcy0+aW5fZmQsIHdmZHMpKQotCSkKLQl7CQotCQlzZXNzLT5jb21tYW5kID0gKE1JQ29tbWFuZCAqKVJlbW92ZUZpcnN0KHNlc3MtPnNlbmRfcXVldWUpOwotCi0jaWZkZWYgX19nbnVfbGludXhfXwotCQkvKgotCQkgKiBOT1RFOiB0aGlzIGhhY2sgb25seSB3b3JrcyBpZiBnZGIgaXMgc3RhcnRlZCB3aXRoIHRoZSAnLXR0eScgYXJndW1lbnQgKG9yCi0JCSAqIHByZXN1bWFibHkgaWYgdGhlICd0dHknIGNvbW1hbmQgaXMgaXNzdWVkLikgV2l0aG91dCB0aGlzLCB0aGUgb25seSB3YXkgdG8KLQkJICogaW50ZXJydXB0IGEgcnVubmluZyBwcm9jZXNzIHNlZW1zIHRvIGJlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLQkJICovCi0JCWlmIChzdHJjbXAoc2Vzcy0+Y29tbWFuZC0+Y29tbWFuZCwgIi1leGVjLWludGVycnVwdCIpID09IDApIHsKLQkJCWlmIChNSVNlc3Npb25EZWJ1ZykgewotCQkJCXByaW50ZigiTUk6IHNlbmRpbmcgU0lHSU5UIHRvICVkXG4iLCBzZXNzLT5waWQpOyAKLQkJCQlmZmx1c2goc3Rkb3V0KTsKLQkJCX0JCQotCQkJa2lsbChzZXNzLT5waWQsIFNJR0lOVCk7Ci0JCX0gZWxzZSBpZiAoV3JpdGVDb21tYW5kKHNlc3MtPmluX2ZkLCBNSUNvbW1hbmRUb1N0cmluZyhzZXNzLT5jb21tYW5kKSkgPCAwKSB7Ci0JCQlzZXNzLT5pbl9mZCA9IC0xOwotCQl9Ci0jZWxzZSAvKiBfX2dudV9saW51eF9fICovCi0JCWlmIChXcml0ZUNvbW1hbmQoc2Vzcy0+aW5fZmQsIE1JQ29tbWFuZFRvU3RyaW5nKHNlc3MtPmNvbW1hbmQpKSA8IDApIHsKLQkJCXNlc3MtPmluX2ZkID0gLTE7Ci0JCX0KLSNlbmRpZiAvKiBfX2dudV9saW51eCAqLwotCX0KLQotCWlmIChzZXNzLT5vdXRfZmQgIT0gLTEgJiYgRkRfSVNTRVQoc2Vzcy0+b3V0X2ZkLCByZmRzKSkgewotCQlpZiAoKHN0ciA9IFJlYWRSZXNwb25zZShzZXNzLT5vdXRfZmQpKSA9PSBOVUxMKSB7Ci0JCQlzZXNzLT5vdXRfZmQgPSAtMTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTUlQYXJzZShzdHIsIG91dHB1dCk7Ci0JCQkKLQkJLyoKLQkJICogVGhlIG91dHB1dCBjYW4gY29uc2lzdCBvZjoKLQkJICogCWFzeW5jIG9vYiByZWNvcmRzIHRoYXQgYXJlIG5vdCBuZWNlc3NhcmlseSB0aGUgcmVzdWx0IG9mIGEgY29tbWFuZAotCQkgKiAJc3RyZWFtIG9vYiByZWNvcmRzIHRoYXQgYWx3YXlzIHJlc3VsdCBmcm9tIGEgY29tbWFuZAotCQkgKglyZXN1bHQgcmVjb3JkcyBmcm9tIGEgY29tbWFuZAotCQkgKiAKLQkJICogQXN5bmMgb29iIHJlY29yZHMgYXJlIHByb2Nlc3NlZCBpbW1lZGlhdGVseSBhbmQgcmVtb3ZlZC4KLQkJICogCi0JCSAqIFN0cmVhbSBvb2IgcmVjb3JkcyBhcmUgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5IGJ1dCBhIHJldGFpbmVkIHdpdGggdGhlCi0JCSAqIGNvbW1hbmQgaW4gY2FzZSB0aGV5IGFyZSBuZWVkZWQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCi0JCSAqIAotCQkgKiBJZiB0aGVyZSBhcmUgcmVzdWx0IHJlY29yZHMsIHRoZW4gdGhlIG91dHB1dCAqc2hvdWxkKiBoYXZlIHJlc3VsdGVkCi0JCSAqIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbW1hbmQuIE1hcmsgdGhlIGNvbW1hbmQgYXMgY29tcGxldGVkIGFuCi0JCSAqIGludm9rZSBpdHMgY2FsbGJhY2suCi0JCSAqIAotCQkgKiBUaGUgc3RyZWFtIG9vYiBhbmQgcmVzdWx0IHJlY29yZHMgYXJlIGZyZWVkIHdoZW4gdGhlIGNvbW1hbmQgaXMgZnJlZWQuCi0JCSAqLwotCQkgCi0JCWlmIChvdXRwdXQtPm9vYnMgIT0gTlVMTCkgewotI2lmZGVmIF9fZ251X2xpbnV4X18KLQkJCWlmIChzZXNzLT5jb21tYW5kICE9IE5VTEwgJiYgc3RyY21wKHNlc3MtPmNvbW1hbmQtPmNvbW1hbmQsICItZXhlYy1pbnRlcnJ1cHQiKSA9PSAwKSB7Ci0JCQkJc2Vzcy0+Y29tbWFuZC0+Y29tcGxldGVkID0gMTsKLQkJCX0KLSNlbmRpZiAvKiBfX2dudV9saW51eF9fICovCQotCQkJRG9PT0JBc3luY0NhbGxiYWNrcyhzZXNzLCBvdXRwdXQtPm9vYnMpOwotCQkJRG9PT0JTdHJlYW1DYWxsYmFja3Moc2Vzcywgb3V0cHV0LT5vb2JzKTsKLQkJfQotCi0JCWlmIChvdXRwdXQtPnJyICE9IE5VTEwgJiYgc2Vzcy0+Y29tbWFuZCAhPSBOVUxMKSB7Ci0JCQlzZXNzLT5jb21tYW5kLT5jb21wbGV0ZWQgPSAxOwotCQkJc2Vzcy0+Y29tbWFuZC0+b3V0cHV0ID0gb3V0cHV0OwotCQkJaWYgKHNlc3MtPmNvbW1hbmQtPmNhbGxiYWNrICE9IE5VTEwpCi0JCQkJc2Vzcy0+Y29tbWFuZC0+Y2FsbGJhY2sob3V0cHV0LT5yciwgc2Vzcy0+Y29tbWFuZC0+Y2JfZGF0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2Vzcy0+Y29tbWFuZCA9PSBOVUxMKSB7Ci0JCQkJTUlPdXRwdXRGcmVlKG91dHB1dCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2Vzcy0+Y29tbWFuZCAhPSBOVUxMICYmIHNlc3MtPmNvbW1hbmQtPmNvbXBsZXRlZCkKLQkJCXNlc3MtPmNvbW1hbmQgPSBOVUxMOwotCX0KLX0KLQotaW50Ci1NSVNlc3Npb25Db21tYW5kQ29tcGxldGVkKE1JU2Vzc2lvbiAqc2VzcykKLXsKLQlyZXR1cm4gc2Vzcy0+Y29tbWFuZCA9PSBOVUxMOwotfQotCi0vKgotICogVXNlZCB0byBwcm9jZXNzIGEgcmVzdWx0IHJlY29yZCBhZnRlciBhIENMSSBjb21tYW5kIGhhcyBiZWVuCi0gKiBpc3N1ZWQgaWYgYW4gTUlFdmVudCBuZWVkcyB0byBiZSBnZW5lcmF0ZWQuIAotICogCi0gKiBJbiBNSSBtb2RlLCBHREIgQ0xJIGNvbW1hbmRzIGFwcGVuZCByZXN1bHQgaW5mb3JtYXRpb24gKGFmdGVyCi0gKiB0aGUgImRvbmUiIHJlc3VsdCBjbGFzcykgdG8gdGhlIHJlc3VsdCByZWNvcmQuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIAotICogcGFzc2VkIHRvIE1JQ29tbWFuZFJlZ2lzdGVyQ2FsbGJhY2soKSBpbiBvcmRlciB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIAotICogYW4gTUlFdmVudCB3aGVuIHRoZSBDTEkgY29tbWFuZCBjb21wbGV0ZXMuCi0gKiAKLSAqIE5PVEU6IENMSSBjb21tYW5kcyBETyBOT1Qgb3BlcmF0ZSBhc3ljaHJvbm91c2x5LCBzbyBzb21lIGNvbW1hbmRzIHdpbGwgCi0gKiBibG9jayB1bnRpbCB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZSAoZS5nLiAicnVuIikuIFRoaXMgbWF5IGNhdXNlIGEgdXNlcgotICogaW50ZXJmYWNlIHRvIGJsb2NrLgotICovCi12b2lkIAotUHJvY2Vzc0NMSVJlc3VsdFJlY29yZChNSVJlc3VsdFJlY29yZCAqcnIsIHZvaWQgKmRhdGEpCi17Ci0JTUlTZXNzaW9uICpzZXNzID0gKE1JU2Vzc2lvbiAqKWRhdGE7Ci0JTUlSZXN1bHQgKnJlczsKLQlNSVZhbHVlICp2YWw7Ci0KLQlpZiAocnItPnJlc3VsdENsYXNzID09IE1JUmVzdWx0UmVjb3JkRE9ORSkgewotCQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAocmVzID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocnItPnJlc3VsdHMpKTsgKSB7Ci0JCQlpZiAoc3RyY21wKHJlcy0+dmFyaWFibGUsICJyZWFzb24iKSA9PSAwKSB7Ci0JCQkJdmFsID0gcmVzLT52YWx1ZTsKLQkJCQlpZiAodmFsLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCQkJaWYgKHNlc3MtPmV2ZW50X2NhbGxiYWNrKSB7Ci0JCQkJCQlzZXNzLT5ldmVudF9jYWxsYmFjayhNSUV2ZW50Q3JlYXRlU3RvcHBlZEV2ZW50KHZhbC0+Y3N0cmluZywgcnItPnJlc3VsdHMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0gCi19Ci0KLS8qCi0gKiBQcm9jZXNzIGFzeW5jIGNhbGxiYWNrcy4gUmVtb3ZlcyByZWNvcmRzIGZyb20gb29icyBsaXN0LgotICovCi1zdGF0aWMgdm9pZAotRG9PT0JBc3luY0NhbGxiYWNrcyhNSVNlc3Npb24gKnNlc3MsIExpc3QgKm9vYnMpCi17Ci0JTUlPT0JSZWNvcmQgKglvb2I7Ci0JTUlSZXN1bHQgKgkJcmVzOwotCU1JVmFsdWUgKgkJdmFsOwotCQotCWZvciAoU2V0TGlzdChvb2JzKTsgKG9vYiA9IChNSU9PQlJlY29yZCAqKUdldExpc3RFbGVtZW50KG9vYnMpKSAhPSBOVUxMOyApIHsKLQkJaWYgKG9vYi0+dHlwZSA9PSBNSU9PQlJlY29yZFR5cGVBc3luYykgewotCQkJc3dpdGNoIChvb2ItPnN1Yl90eXBlKSB7Ci0JCQljYXNlIE1JT09CUmVjb3JkRXhlY0FzeW5jOgotCQkJCWlmIChzZXNzLT5leGVjX2NhbGxiYWNrICE9IE5VTEwpCi0JCQkJCXNlc3MtPmV4ZWNfY2FsbGJhY2sob29iLT5jbGFzcywgb29iLT5yZXN1bHRzKTsKLQkJCQkJCi0JCQkJaWYgKHN0cmNtcChvb2ItPmNsYXNzLCAic3RvcHBlZCIpID09IDApIHsKLQkJCQkJaW50IHNlZW5fcmVhc29uID0gMDsKLQkJCQkJZm9yIChTZXRMaXN0KG9vYi0+cmVzdWx0cyk7IChyZXMgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChvb2ItPnJlc3VsdHMpKTsgKSB7Ci0JCQkJCQlpZiAoc3RyY21wKHJlcy0+dmFyaWFibGUsICJyZWFzb24iKSA9PSAwKSB7Ci0JCQkJCQkJc2Vlbl9yZWFzb24gPSAxOwotCQkJCQkJCXZhbCA9IHJlcy0+dmFsdWU7Ci0JCQkJCQkJaWYgKHZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQkJCQkJCWlmIChzZXNzLT5ldmVudF9jYWxsYmFjaykgewotCQkJCQkJCQkJc2Vzcy0+ZXZlbnRfY2FsbGJhY2soTUlFdmVudENyZWF0ZVN0b3BwZWRFdmVudCh2YWwtPmNzdHJpbmcsIG9vYi0+cmVzdWx0cykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQkvKgotCQkJCQkgKiBUZW1wb3JhcnkgYnJlYWtwb2ludHMgdW5kZXIgTGludXggZG9uJ3QgaGF2ZSBhICJyZWFzb24iLiBJZiB3ZSByZWNlaXZlCi0JCQkJCSAqIGEgc3RvcHBlZCBldmVudCB3aXRoIG5vIHJlYXNvbiwgdGhlbiB3ZSBjcmVhdGVkIGEgU3RvcHBlZEV2ZW50IGFueXdheQotCQkJCQkgKi8KLQkJCQkJaWYgKHNlZW5fcmVhc29uID09IDApIHsKLQkJCQkJCWlmIChzZXNzLT5ldmVudF9jYWxsYmFjaykgewotCQkJCQkJCXNlc3MtPmV2ZW50X2NhbGxiYWNrKE1JRXZlbnRDcmVhdGVTdG9wcGVkRXZlbnQoInRlbXBvcmFyeS1icmVha3BvaW50LWhpdCIsIG9vYi0+cmVzdWx0cykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBNSU9PQlJlY29yZFN0YXR1c0FzeW5jOgotCQkJCWlmIChzZXNzLT5zdGF0dXNfY2FsbGJhY2sgIT0gTlVMTCkKLQkJCQkJc2Vzcy0+c3RhdHVzX2NhbGxiYWNrKG9vYi0+Y2xhc3MsIG9vYi0+cmVzdWx0cyk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIE1JT09CUmVjb3JkTm90aWZ5QXN5bmM6Ci0JCQkJaWYgKHNlc3MtPm5vdGlmeV9jYWxsYmFjayAhPSBOVUxMKQotCQkJCQlzZXNzLT5ub3RpZnlfY2FsbGJhY2sob29iLT5jbGFzcywgb29iLT5yZXN1bHRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJUmVtb3ZlRnJvbUxpc3Qob29icywgKHZvaWQgKilvb2IpOwotCQkJTUlPT0JSZWNvcmRGcmVlKG9vYik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIHN0cmVhbSBjYWxsYmFja3MuIFdlIGxlYXZlIHRoZSByZWNvcmRzIG9uIHRoZSBvb2JzIGxpc3QKLSAqIGJlY2F1c2UgdGhleSBtYXkgYmUgbmVlZGVkIGJ5IGxhdGVyIGNvbW1hbmQgcHJvY2Vzc2luZy4KLSAqLwotc3RhdGljIHZvaWQKLURvT09CU3RyZWFtQ2FsbGJhY2tzKE1JU2Vzc2lvbiAqc2VzcywgTGlzdCAqb29icykKLXsKLQlNSU9PQlJlY29yZCAqCW9vYjsKLQkKLQlmb3IgKFNldExpc3Qob29icyk7IChvb2IgPSAoTUlPT0JSZWNvcmQgKilHZXRMaXN0RWxlbWVudChvb2JzKSkgIT0gTlVMTDsgKSB7Ci0JCWlmIChvb2ItPnR5cGUgPT0gTUlPT0JSZWNvcmRUeXBlU3RyZWFtKSB7Ci0JCQlzd2l0Y2ggKG9vYi0+c3ViX3R5cGUpIHsKLQkJCWNhc2UgTUlPT0JSZWNvcmRDb25zb2xlU3RyZWFtOgotCQkJCWlmIChzZXNzLT5jb25zb2xlX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJCQkJc2Vzcy0+Y29uc29sZV9jYWxsYmFjayhvb2ItPmNzdHJpbmcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgTUlPT0JSZWNvcmRMb2dTdHJlYW06Ci0JCQkJaWYgKHNlc3MtPmxvZ19jYWxsYmFjayAhPSBOVUxMKQotCQkJCQlzZXNzLT5sb2dfY2FsbGJhY2sob29iLT5jc3RyaW5nKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgTUlPT0JSZWNvcmRUYXJnZXRTdHJlYW06Ci0JCQkJaWYgKHNlc3MtPnRhcmdldF9jYWxsYmFjayAhPSBOVUxMKQotCQkJCQlzZXNzLT50YXJnZXRfY2FsbGJhY2sob29iLT5jc3RyaW5nKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZAotTUlTZXNzaW9uR2V0RmRzKE1JU2Vzc2lvbiAqc2VzcywgaW50ICpuZmRzLCBmZF9zZXQgKnJmZHMsIGZkX3NldCAqd2ZkcywgZmRfc2V0ICplZmRzKQotewotCWludAkJCW4gPSAwOwotCQotCWlmIChyZmRzICE9IE5VTEwpCi0JCUZEX1pFUk8ocmZkcyk7Ci0JCQotCWlmICh3ZmRzICE9IE5VTEwpCi0JCUZEX1pFUk8od2Zkcyk7Ci0JCi0JaWYgKGVmZHMgIT0gTlVMTCkKLQkJRkRfWkVSTyhlZmRzKTsKLQkKLQlpZiAoc2Vzcy0+cGlkICE9IC0xKSB7Ci0JCWlmICh3ZmRzICE9IE5VTEwgJiYgc2Vzcy0+aW5fZmQgIT0gLTEpIHsKLQkJCUZEX1NFVChzZXNzLT5pbl9mZCwgd2Zkcyk7Ci0JCQlpZiAoc2Vzcy0+aW5fZmQgPiBuKQotCQkJCW4gPSBzZXNzLT5pbl9mZDsKLQkJfQotCQlpZiAocmZkcyAhPSBOVUxMICYmIHNlc3MtPm91dF9mZCAhPSAtMSkgewotCQkJRkRfU0VUKHNlc3MtPm91dF9mZCwgcmZkcyk7Ci0JCQlpZiAoc2Vzcy0+b3V0X2ZkID4gbikKLQkJCQluID0gc2Vzcy0+b3V0X2ZkOwotCQl9Ci0JfQotCQotCWlmIChuZmRzICE9IE5VTEwpCi0JCSpuZmRzID0gbiArIDE7Ci19Ci0KLS8qCi0gKiBEZWZhdWx0IHByb2dyZXNzIGNvbW1hbmQgaWYgbm9uZSBzdXBwbGllZC4KLSAqIAotICogRG9uJ3Qgc2VsZWN0IG9uIHdyaXRlIGZkcy4gVGhpcyB3aWxsIGFsbW9zdCBhbHdheXMgcmV0dXJuIGltbWVkaWF0ZWx5LAotICogc28gdGhlIHRpbWVvdXQgaXMgbmV2ZXIgdXNlZC4gVGhlIGVuZCByZXN1bHQgaXMgYSBidXN5IHdhaXQgdGhhdAotICogY29uc3VtZXMgZ29icyBvZiBDUFUuCi0gKiAKLSAqIEFsc28sIHdlIG1ha2UgYSBjb3B5IG9mIHNlc3MtPnNlbGVjdF90aW1lb3V0IGFzIHNvbWUgc2VsZWN0KCkKLSAqIGZ1bmN0aW9ucyB3aWxsIG1vZGlmeSBpdC4KLSAqLwotaW50Ci1NSVNlc3Npb25Qcm9ncmVzcyhNSVNlc3Npb24gKnNlc3MsIE1JT3V0cHV0ICpvdXRwdXQpCi17Ci0JaW50CQkJCW47Ci0JaW50CQkJCW5mZHM7Ci0JZmRfc2V0CQkJcmZkczsKLQlzdHJ1Y3QgdGltZXZhbAl0diA9IHNlc3MtPnNlbGVjdF90aW1lb3V0OwotCQotCU1JU2Vzc2lvbkdldEZkcyhzZXNzLCAmbmZkcywgJnJmZHMsIE5VTEwsIE5VTEwpOwotCi0JZm9yICggOzsgKSB7Ci0JCW4gPSBzZWxlY3QobmZkcywgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0JCQotCQlpZiAobiA8IDApIHsKLQkJCWlmIChlcnJubyA9PSBFSU5UUikKLQkJCQljb250aW51ZTsKLQkJCQkKLQkJCU1JU2V0RXJyb3IoTUlfRVJST1JfU1lTVEVNLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIC0xOwotCQl9CQkKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkbwotCSAqLwotCWlmIChuID09IDAgJiYgRW1wdHlMaXN0KHNlc3MtPnNlbmRfcXVldWUpKSB7Ci0JCXJldHVybiAwOwotCX0KLQlNSVNlc3Npb25Qcm9jZXNzQ29tbWFuZHNBbmRSZXNwb25zZXMoc2VzcywgJnJmZHMsIE5VTEwsIG91dHB1dCk7Ci0JCi0JcmV0dXJuIG47Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVNlc3Npb24uaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzBhZjQ2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfTUlTRVNTSU9OX0hfCi0jZGVmaW5lIF9NSVNFU1NJT05fSF8KLQotI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSU91dHB1dC5oIgotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotI2luY2x1ZGUgIk1JRXZlbnQuaCIKLQotc3RydWN0IE1JU2Vzc2lvbiB7Ci0JaW50CQkJCWluX2ZkOyAvKiBHREIgaW5wdXQgKi8KLQlpbnQJCQkJb3V0X2ZkOyAvKiBHREIgb3V0cHV0ICovCi0JaW50CQkJCXBpZDsKLQlpbnQJCQkJZXhpdGVkOwotCWludAkJCQlleGl0X3N0YXR1czsKLQlNSUNvbW1hbmQgKgkJY29tbWFuZDsKLQlMaXN0ICoJCQlzZW5kX3F1ZXVlOwotCWNoYXIgKgkJCWdkYl9wYXRoOwotCXN0cnVjdCB0aW1ldmFsCXNlbGVjdF90aW1lb3V0OwotCXZvaWQJCQkoKmV2ZW50X2NhbGxiYWNrKShNSUV2ZW50ICopOwotCXZvaWQJCQkoKmNtZF9jYWxsYmFjaykoTUlSZXN1bHRSZWNvcmQgKik7Ci0Jdm9pZAkJCSgqZXhlY19jYWxsYmFjaykoY2hhciAqLCBMaXN0ICopOwotCXZvaWQJCQkoKnN0YXR1c19jYWxsYmFjaykoY2hhciAqLCBMaXN0ICopOwotCXZvaWQJCQkoKm5vdGlmeV9jYWxsYmFjaykoY2hhciAqLCBMaXN0ICopOwotCXZvaWQJCQkoKmNvbnNvbGVfY2FsbGJhY2spKGNoYXIgKik7Ci0Jdm9pZAkJCSgqbG9nX2NhbGxiYWNrKShjaGFyICopOwotCXZvaWQJCQkoKnRhcmdldF9jYWxsYmFjaykoY2hhciAqKTsJCi19OwotdHlwZWRlZiBzdHJ1Y3QgTUlTZXNzaW9uCU1JU2Vzc2lvbjsKLQotZXh0ZXJuIE1JU2Vzc2lvbiAqTUlTZXNzaW9uTmV3KHZvaWQpOwotZXh0ZXJuIHZvaWQgTUlTZXNzaW9uRnJlZShNSVNlc3Npb24gKnNlc3MpOwotZXh0ZXJuIHZvaWQgTUlTZXNzaW9uU2V0VGltZW91dChNSVNlc3Npb24gKnNlc3MsIGxvbmcgc2VjLCBsb25nIHVzZWMpOwotZXh0ZXJuIHZvaWQgTUlTZXNzaW9uU2V0RGVidWcoaW50IGRlYnVnKTsKLWV4dGVybiBpbnQgTUlTZXNzaW9uU3RhcnRMb2NhbChNSVNlc3Npb24gKnNlc3MsIGNoYXIgKik7Ci1leHRlcm4gdm9pZCBNSVNlc3Npb25SZWdpc3RlckV2ZW50Q2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKE1JRXZlbnQgKikpOwotZXh0ZXJuIHZvaWQgTUlTZXNzaW9uUmVnaXN0ZXJDb21tYW5kQ2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKE1JUmVzdWx0UmVjb3JkICopKTsKLWV4dGVybiB2b2lkIE1JU2Vzc2lvblJlZ2lzdGVyRXhlY0NhbGxiYWNrKE1JU2Vzc2lvbiAqc2Vzcywgdm9pZCAoKmNhbGxiYWNrKShjaGFyICosIExpc3QgKikpOwotZXh0ZXJuIHZvaWQgTUlTZXNzaW9uUmVnaXN0ZXJTdGF0dXNDYWxsYmFjayhNSVNlc3Npb24gKnNlc3MsIHZvaWQgKCpjYWxsYmFjaykoY2hhciAqLCBMaXN0ICopKTsKLWV4dGVybiB2b2lkIE1JU2Vzc2lvblJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKiwgTGlzdCAqKSk7Ci1leHRlcm4gdm9pZCBNSVNlc3Npb25SZWdpc3RlckNvbnNvbGVDYWxsYmFjayhNSVNlc3Npb24gKnNlc3MsIHZvaWQgKCpjYWxsYmFjaykoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBNSVNlc3Npb25SZWdpc3RlckxvZ0NhbGxiYWNrKE1JU2Vzc2lvbiAqc2Vzcywgdm9pZCAoKmNhbGxiYWNrKShjaGFyICopKTsKLWV4dGVybiB2b2lkIE1JU2Vzc2lvblJlZ2lzdGVyVGFyZ2V0Q2FsbGJhY2soTUlTZXNzaW9uICpzZXNzLCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgTUlTZXNzaW9uU2V0R0RCUGF0aChNSVNlc3Npb24gKnNlc3MsIGNoYXIgKnBhdGgpOwotZXh0ZXJuIGludCBNSVNlc3Npb25TZW5kQ29tbWFuZChNSVNlc3Npb24gKnNlc3MsIE1JQ29tbWFuZCAqY21kKTsKLWV4dGVybiBpbnQgTUlTZXNzaW9uQ29tbWFuZENvbXBsZXRlZChNSVNlc3Npb24gKnNlc3MpOwotLy9leHRlcm4gdm9pZCBNSVNlc3Npb25Qcm9jZXNzQ29tbWFuZHNBbmRSZXNwb25zZXMoTUlTZXNzaW9uICpzZXNzLCBmZF9zZXQgKnJmZHMsIGZkX3NldCAqd2Zkcyk7Ci1leHRlcm4gdm9pZCBNSVNlc3Npb25Qcm9jZXNzQ29tbWFuZHNBbmRSZXNwb25zZXMoTUlTZXNzaW9uICpzZXNzLCBmZF9zZXQgKnJmZHMsIGZkX3NldCAqd2ZkcywgTUlPdXRwdXQgKm91dHB1dCk7Ci1leHRlcm4gdm9pZCBNSVNlc3Npb25HZXRGZHMoTUlTZXNzaW9uICpzZXNzLCBpbnQgKm5mZHMsIGZkX3NldCAqcmZkcywgZmRfc2V0ICp3ZmRzLCBmZF9zZXQgKmVmZHMpOwotLy9leHRlcm4gaW50IE1JU2Vzc2lvblByb2dyZXNzKE1JU2Vzc2lvbiAqc2Vzcyk7Ci1leHRlcm4gaW50IE1JU2Vzc2lvblByb2dyZXNzKE1JU2Vzc2lvbiAqc2VzcywgTUlPdXRwdXQgKm91dHB1dCk7Ci1leHRlcm4gdm9pZCBQcm9jZXNzQ0xJUmVzdWx0UmVjb3JkKE1JUmVzdWx0UmVjb3JkICosIHZvaWQgKik7Ci0jZW5kaWYgLyogX01JU0VTU0lPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlTdGFja0NvbW1hbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JU3RhY2tDb21tYW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTk2NzkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlTdGFja0NvbW1hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpc3QuaCIKLSNpbmNsdWRlICJNSVN0cmluZy5oIgotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotCi1NSUNvbW1hbmQgKgotTUlTdGFja1NlbGVjdEZyYW1lKGludCBsZXZlbCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItc3RhY2stc2VsZWN0LWZyYW1lIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBNSUludFRvQ1N0cmluZyhsZXZlbCksIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSVN0YWNrTGlzdEZyYW1lcyhpbnQgbG93LCBpbnQgaGlnaCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItc3RhY2stbGlzdC1mcmFtZXMiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCS8vTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgTUlJbnRUb0NTdHJpbmcobG93KSwgTUlJbnRUb0NTdHJpbmcoaGlnaCkpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKGxvdyksIE5VTEwpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKGhpZ2gpLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotTUlTdGFja0xpc3RBbGxGcmFtZXModm9pZCkKLXsKLQlyZXR1cm4gTUlDb21tYW5kTmV3KCItc3RhY2stbGlzdC1mcmFtZXMiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotfQotCi1NSUNvbW1hbmQgKgotTUlTdGFja0xpc3RMb2NhbHMoaW50IHZhbHMpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCQotCWNtZCA9IE1JQ29tbWFuZE5ldygiLXN0YWNrLWxpc3QtbG9jYWxzIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBNSUludFRvQ1N0cmluZyh2YWxzKSwgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JU3RhY2tMaXN0QXJndW1lbnRzKGludCB2YWxzLCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItc3RhY2stbGlzdC1hcmd1bWVudHMiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKHZhbHMpLCBOVUxMKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBNSUludFRvQ1N0cmluZyhsb3cpLCBNSUludFRvQ1N0cmluZyhoaWdoKSk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JU3RhY2tMaXN0QWxsQXJndW1lbnRzKGludCB2YWxzKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQkKLQljbWQgPSBNSUNvbW1hbmROZXcoIi1zdGFjay1saXN0LWFyZ3VtZW50cyIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgTUlJbnRUb0NTdHJpbmcodmFscyksIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSVN0YWNrSW5mb0ZyYW1lKHZvaWQpCi17Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiLXN0YWNrLWluZm8tZnJhbWUiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSVN0YWNrSW5mb0RlcHRoKHZvaWQpCi17Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiLXN0YWNrLWluZm8tZGVwdGgiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCXJldHVybiBjbWQ7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVN0cmluZy5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlTdHJpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjY2RhMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYgLyogX19nbnVfbGludXhfXyAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIk1JU3RyaW5nLmgiCi0KLS8qCi0gKiBOdW1iZXIgb2Ygc3RyaW5ncyB0byBrZWVwIGJlZm9yZSByZWN5Y2xpbmcuIFRoaXMgYWxsb3dzCi0gKiBNSUludFRvQ1N0cmluZyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gYW4gYXJndW1lbnQKLSAqIGxpc3QuCi0gKi8KLSNkZWZpbmUgTlVNX1NUUklOR1MJCTUKLQotc3RhdGljIGludAkJc3RyX3B0ciA9IC0xOwotc3RhdGljIGNoYXIgKglzdHJpbmdzW05VTV9TVFJJTkdTXTsKLQotTUlTdHJpbmcgKgotTUlTdHJpbmdOZXcoY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQlNSVN0cmluZyAqczsKLQotCXMgPSAoTUlTdHJpbmcgKiltYWxsb2Moc2l6ZW9mKE1JU3RyaW5nKSk7Ci0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JdmFzcHJpbnRmKCZzLT5idWYsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0Jcy0+c2xlbiA9IHN0cmxlbihzLT5idWYpOwotCi0JcmV0dXJuIHM7Ci19Ci0KLXZvaWQKLU1JU3RyaW5nRnJlZShNSVN0cmluZyAqc3RyKQotewotCWZyZWUoc3RyLT5idWYpOwotCWZyZWUoc3RyKTsKLX0KLQotdm9pZAotTUlTdHJpbmdBcHBlbmQoTUlTdHJpbmcgKnN0ciwgTUlTdHJpbmcgKnN0cjIpCi17Ci0JaW50IGxlbiA9IHN0ci0+c2xlbiArIHN0cjItPnNsZW47Ci0JY2hhciAqYnVmID0gKGNoYXIgKiltYWxsb2MobGVuICsgMSk7Ci0KLQltZW1jcHkoYnVmLCBzdHItPmJ1Ziwgc3RyLT5zbGVuKTsKLQltZW1jcHkoJmJ1ZltzdHItPnNsZW5dLCBzdHIyLT5idWYsIHN0cjItPnNsZW4pOwotCWJ1ZltsZW5dID0gJ1wwJzsKLQotCWZyZWUoc3RyLT5idWYpOwotCi0Jc3RyLT5idWYgPSBidWY7Ci0Jc3RyLT5zbGVuID0gbGVuOwotCi0JTUlTdHJpbmdGcmVlKHN0cjIpOwotfQotCi1jaGFyICoKLU1JU3RyaW5nVG9DU3RyaW5nKE1JU3RyaW5nICpzdHIpCi17Ci0JcmV0dXJuIHN0ci0+YnVmOwotfQotCi1jaGFyICoKLU1JSW50VG9DU3RyaW5nKGludCB2YWwpCi17Ci0JY2hhciAqKglzOwotCi0JaWYgKHN0cl9wdHIgPCAwKSB7Ci0JCW1lbXNldChzdHJpbmdzLCAwLCBOVU1fU1RSSU5HUyk7Ci0JCXN0cl9wdHIgPSAwOwotCX0KLQotCWlmICgrK3N0cl9wdHIgPT0gTlVNX1NUUklOR1MpIHsKLQkJc3RyX3B0ciA9IDA7Ci0JfQotCi0JcyA9ICZzdHJpbmdzW3N0cl9wdHJdOwotCi0JaWYgKCpzICE9IE5VTEwpIHsKLQkJZnJlZSgqcyk7Ci0JfQotCi0JYXNwcmludGYocywgIiVkIiwgdmFsKTsKLQotCXJldHVybiAqczsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JU3RyaW5nLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZhYzcyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JU3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2lmbmRlZiBfTUlTVFJJTkdfSF8KLSNkZWZpbmUgX01JU1RSSU5HX0hfCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLXN0cnVjdCBNSVN0cmluZyB7Ci0JaW50ICAgICBzbGVuOwotCWNoYXIgKiAgYnVmOwotfTsKLXR5cGVkZWYgc3RydWN0IE1JU3RyaW5nIE1JU3RyaW5nOwotCi1leHRlcm4gTUlTdHJpbmcgKk1JU3RyaW5nTmV3KGNoYXIgKmZtdCwgLi4uKTsKLWV4dGVybiB2b2lkIE1JU3RyaW5nRnJlZShNSVN0cmluZyAqc3RyKTsKLWV4dGVybiB2b2lkIE1JU3RyaW5nQXBwZW5kKE1JU3RyaW5nICpzdHIsIE1JU3RyaW5nICpzdHIyKTsKLWV4dGVybiBjaGFyICpNSVN0cmluZ1RvQ1N0cmluZyhNSVN0cmluZyAqc3RyKTsKLWV4dGVybiBjaGFyICpNSUludFRvQ1N0cmluZyhpbnQgdmFsKTsKLSNlbmRpZiAvKiBfTUlTVFJJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JVGhyZWFkLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVRocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmZjZDNmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JVGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLSAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlWYWx1ZS5oIgotI2luY2x1ZGUgIk1JUmVzdWx0LmgiCi0jaW5jbHVkZSAiTUlBcmcuaCIKLSNpbmNsdWRlICJNSVRocmVhZC5oIgotI2luY2x1ZGUgIk1JT09CUmVjb3JkLmgiCi0KLU1JVGhyZWFkU2VsZWN0SW5mbyAqCi1NSVRocmVhZFNlbGVjdEluZm9OZXcodm9pZCkgCi17Ci0JTUlUaHJlYWRTZWxlY3RJbmZvICogaW5mbzsKLQlpbmZvID0gKE1JVGhyZWFkU2VsZWN0SW5mbyAqKW1hbGxvYyhzaXplb2YoTUlUaHJlYWRTZWxlY3RJbmZvKSk7Ci0JaW5mby0+Y3VycmVudF90aHJlYWRfaWQgPSAwOwotCWluZm8tPmZyYW1lID0gTlVMTDsKLQlyZXR1cm4gaW5mbzsKLX0KLQotTUlUaHJlYWRTZWxlY3RJbmZvICoKLU1JU2V0VGhyZWFkU2VsZWN0SW5mbyhNSUNvbW1hbmQgKmNtZCkgCi17Ci0JTUlUaHJlYWRTZWxlY3RJbmZvICogaW5mbyA9IE1JVGhyZWFkU2VsZWN0SW5mb05ldygpOwotCU1JVmFsdWUgKiB2YWw7Ci0JTUlSZXN1bHRSZWNvcmQgKiBycjsKLQlNSVJlc3VsdCAqIHJlc3VsdDsKLQotCWlmICghY21kLT5jb21wbGV0ZWQgfHwgY21kLT5vdXRwdXQgPT0gTlVMTCB8fCBjbWQtPm91dHB1dC0+cnIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyciA9IGNtZC0+b3V0cHV0LT5ycjsKLQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocnItPnJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAibmV3LXRocmVhZC1pZCIpID09IDApIHsKLQkJCXZhbCA9IHJlc3VsdC0+dmFsdWU7Ci0JCQlpbmZvLT5jdXJyZW50X3RocmVhZF9pZCA9IChpbnQpc3RydG9sKHZhbC0+Y3N0cmluZywgTlVMTCwgMTApOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAiZnJhbWUiKSA9PSAwKSB7Ci0JCQl2YWwgPSByZXN1bHQtPnZhbHVlOwotCQkJaWYgKHZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZVR1cGxlKSB7Ci0JCQkJaW5mby0+ZnJhbWUgPSBNSUZyYW1lUGFyc2UodmFsKTsKLQkJCX0KLQkJfQotCX0JCi0JcmV0dXJuIGluZm87CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlUaHJlYWQuaCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmM4N2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlUaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotCi0jaWZuZGVmIF9NSVRIUkVBRF9IXwotI2RlZmluZSBfTUlUSFJFQURfSF8KLQotI2luY2x1ZGUgIk1JQ29tbWFuZC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLSNpbmNsdWRlICJNSUZyYW1lLmgiCi0KLXN0cnVjdCBNSVRocmVhZFNlbGVjdEluZm8gewotCWludCBjdXJyZW50X3RocmVhZF9pZDsKLQlNSUZyYW1lICogZnJhbWU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgTUlUaHJlYWRTZWxlY3RJbmZvIE1JVGhyZWFkU2VsZWN0SW5mbzsKLQotZXh0ZXJuIE1JVGhyZWFkU2VsZWN0SW5mbyAqTUlUaHJlYWRTZWxlY3RJbmZvTmV3KHZvaWQpOwotZXh0ZXJuIE1JVGhyZWFkU2VsZWN0SW5mbyAqTUlTZXRUaHJlYWRTZWxlY3RJbmZvKE1JQ29tbWFuZCAqY21kKTsKLQotI2VuZGlmIC8qIF9NSVRIUkVBRF9IXyAqLwotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVRocmVhZENvbW1hbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM0ODYxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL01JVGhyZWFkQ29tbWFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJNSUNvbW1hbmQuaCIKLQotLyoKLU1JQ29tbWFuZCAqCi1NSUluZm9UaHJlYWRzKHZvaWQpCi17Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiaW5mbyB0aHJlYWRzIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlyZXR1cm4gY21kOwotfQotKi8KLQotTUlDb21tYW5kICoKLU1JVGhyZWFkU2VsZWN0KGludCB0aHJlYWROdW0pCi17Ci0JTUlDb21tYW5kICogY21kOwotCWNtZCA9IE1JQ29tbWFuZE5ldygiLXRocmVhZC1zZWxlY3QiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIE1JSW50VG9DU3RyaW5nKHRocmVhZE51bSksIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhbHVlLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhbHVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzY2N2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlWYWx1ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0gLyoKLSAgKiBCYXNlZCBvbiB0aGUgUU5YIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JIGludGVyZmFjZQotICAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlWYWx1ZS5oIgotI2luY2x1ZGUgIk1JUmVzdWx0LmgiCi0KLU1JVmFsdWUgKgotTUlWYWx1ZU5ldyh2b2lkKQotewotCU1JVmFsdWUgKgl2YWw7Ci0JCi0JdmFsID0gKE1JVmFsdWUgKiltYWxsb2Moc2l6ZW9mKE1JVmFsdWUpKTsKLQl2YWwtPnR5cGUgPSBNSVZhbHVlVHlwZUludmFsaWQ7Ci0JdmFsLT5jc3RyaW5nID0gTlVMTDsKLQl2YWwtPnZhbHVlcyA9IE5VTEw7Ci0JdmFsLT5yZXN1bHRzID0gTlVMTDsKLQlyZXR1cm4gdmFsOwkKLX0KLQotTUlWYWx1ZSAqCi1OZXdNSUNvbnN0KHZvaWQpCi17Ci0JTUlWYWx1ZSAqCXZhbCA9IE1JVmFsdWVOZXcoKTsKLQl2YWwtPnR5cGUgPSBNSVZhbHVlVHlwZUNvbnN0OwotCXJldHVybiB2YWw7Ci19Ci0KLU1JVmFsdWUgKgotTmV3TUlUdXBsZSh2b2lkKQotewotCU1JVmFsdWUgKgl2YWwgPSBNSVZhbHVlTmV3KCk7Ci0JdmFsLT50eXBlID0gTUlWYWx1ZVR5cGVUdXBsZTsKLQlyZXR1cm4gdmFsOwotfQotCi1NSVZhbHVlICoKLU5ld01JTGlzdCh2b2lkKQotewotCU1JVmFsdWUgKgl2YWwgPSBNSVZhbHVlTmV3KCk7Ci0JdmFsLT50eXBlID0gTUlWYWx1ZVR5cGVMaXN0OwotCXJldHVybiB2YWw7Ci19Ci0KLU1JU3RyaW5nICoKLU1JQ29uc3RUb1N0cmluZyhNSVZhbHVlICp2KQotewotCXJldHVybiBNSVN0cmluZ05ldyh2LT5jc3RyaW5nKTsKLX0KLQotTUlTdHJpbmcgKgotTUlMaXN0VG9TdHJpbmcoTUlWYWx1ZSAqdikKLXsKLQlpbnQJCQlmaXJzdCA9IDE7Ci0JTUlTdHJpbmcgKglzdHIgPSBNSVN0cmluZ05ldygiWyIpOwotCU1JUmVzdWx0ICoJcjsKLQlNSVZhbHVlICoJdmFsOwotCi0JZm9yIChTZXRMaXN0KHYtPnJlc3VsdHMpOyAociA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHYtPnJlc3VsdHMpKSAhPSBOVUxMOykgewotCQlpZiAoIWZpcnN0KQotCQkJTUlTdHJpbmdBcHBlbmQoc3RyLCBNSVN0cmluZ05ldygiLCIpKTsKLQkJZmlyc3QgPSAwOwotCQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JUmVzdWx0VG9TdHJpbmcocikpOwotCX0KLQlmaXJzdCA9IDE7Ci0JZm9yIChTZXRMaXN0KHYtPnZhbHVlcyk7ICh2YWwgPSAoTUlWYWx1ZSAqKUdldExpc3RFbGVtZW50KHYtPnZhbHVlcykpICE9IE5VTEw7KSB7Ci0JCWlmICghZmlyc3QpCi0JCQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCIsIikpOwotCQlmaXJzdCA9IDA7Ci0JCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlWYWx1ZVRvU3RyaW5nKHZhbCkpOwotCX0KLQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCJdIikpOwotCXJldHVybiBzdHI7Ci19Ci0KLU1JU3RyaW5nICoKLU1JVHVwbGVUb1N0cmluZyhNSVZhbHVlICp2KQotewotCWludAkJCWZpcnN0ID0gMTsKLQlNSVN0cmluZyAqCXN0ciA9IE1JU3RyaW5nTmV3KCJ7Iik7Ci0JTUlSZXN1bHQgKglyOwotI2lmZGVmIF9fQVBQTEVfXwotCU1JVmFsdWUgKgl2YWw7Ci0jZW5kaWYgLyogX19BUFBMRV9fICovCi0KLQlmb3IgKFNldExpc3Qodi0+cmVzdWx0cyk7IChyID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQodi0+cmVzdWx0cykpICE9IE5VTEw7KSB7Ci0JCWlmICghZmlyc3QpCi0JCQlNSVN0cmluZ0FwcGVuZChzdHIsIE1JU3RyaW5nTmV3KCIsIikpOwotCQlmaXJzdCA9IDA7Ci0JCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlSZXN1bHRUb1N0cmluZyhyKSk7Ci0JfQotI2lmZGVmIF9fQVBQTEVfXwotCWZpcnN0ID0gMTsKLQlmb3IgKFNldExpc3Qodi0+dmFsdWVzKTsgKHZhbCA9IChNSVZhbHVlICopR2V0TGlzdEVsZW1lbnQodi0+dmFsdWVzKSkgIT0gTlVMTDspIHsKLQkJaWYgKCFmaXJzdCkKLQkJCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIiwiKSk7Ci0JCWZpcnN0ID0gMDsKLQkJTUlTdHJpbmdBcHBlbmQoc3RyLCBNSVZhbHVlVG9TdHJpbmcodmFsKSk7Ci0JfQotI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCU1JU3RyaW5nQXBwZW5kKHN0ciwgTUlTdHJpbmdOZXcoIn0iKSk7Ci0JcmV0dXJuIHN0cjsKLX0KLQotTUlTdHJpbmcgKgotTUlWYWx1ZVRvU3RyaW5nKE1JVmFsdWUgKnYpCi17Ci0JTUlTdHJpbmcgKglzdHIgPSBOVUxMOwotCQotCXN3aXRjaCAodi0+dHlwZSkgewotCWNhc2UgTUlWYWx1ZVR5cGVDb25zdDoKLQkJc3RyID0gTUlDb25zdFRvU3RyaW5nKHYpOwotCQlicmVhazsKLQkJCi0JY2FzZSBNSVZhbHVlVHlwZUxpc3Q6Ci0JCXN0ciA9IE1JTGlzdFRvU3RyaW5nKHYpOwotCQlicmVhazsKLQkJCi0JY2FzZSBNSVZhbHVlVHlwZVR1cGxlOgotCQlzdHIgPSBNSVR1cGxlVG9TdHJpbmcodik7Ci0JCWJyZWFrOwotCX0KLQkKLQlyZXR1cm4gc3RyOwotfQotCi12b2lkCi1NSVZhbHVlRnJlZShNSVZhbHVlICp2KQotewotCWlmICh2LT5jc3RyaW5nICE9IE5VTEwpCi0JCWZyZWUodi0+Y3N0cmluZyk7Ci0JaWYgKHYtPnJlc3VsdHMgIT0gTlVMTCkKLQkJRGVzdHJveUxpc3Qodi0+cmVzdWx0cywgTUlSZXN1bHRGcmVlKTsKLQlpZiAodi0+dmFsdWVzICE9IE5VTEwpCi0JCURlc3Ryb3lMaXN0KHYtPnZhbHVlcywgTUlWYWx1ZUZyZWUpOwotCWZyZWUodik7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhbHVlLmggYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYWYwNjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlWYWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0gIAotI2lmbmRlZiBfTUlWQUxVRV9IXwotI2RlZmluZSBfTUlWQUxVRV9IXwotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JU3RyaW5nLmgiCi0KLSNkZWZpbmUgTUlWYWx1ZVR5cGVJbnZhbGlkCTAKLSNkZWZpbmUgTUlWYWx1ZVR5cGVDb25zdAkJMQotI2RlZmluZSBNSVZhbHVlVHlwZUxpc3QJCTIKLSNkZWZpbmUgTUlWYWx1ZVR5cGVUdXBsZQkJMwotCi0vKioKLSAqIEdEQi9NSSB2YWx1ZS4KLSAqLwotc3RydWN0IE1JVmFsdWUgewotCWludCB0eXBlOwotCWNoYXIgKmNzdHJpbmc7Ci0JTGlzdCAqdmFsdWVzOwotCUxpc3QgKnJlc3VsdHM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgTUlWYWx1ZSBNSVZhbHVlOwotCi1leHRlcm4gTUlWYWx1ZSAqTmV3TUlDb25zdCh2b2lkKTsKLWV4dGVybiBNSVZhbHVlICpOZXdNSVR1cGxlKHZvaWQpOwotZXh0ZXJuIE1JVmFsdWUgKk5ld01JTGlzdCh2b2lkKTsKLWV4dGVybiBNSVN0cmluZyAqTUlDb25zdFRvU3RyaW5nKE1JVmFsdWUgKik7Ci1leHRlcm4gTUlTdHJpbmcgKk1JTGlzdFRvU3RyaW5nKE1JVmFsdWUgKik7Ci1leHRlcm4gTUlTdHJpbmcgKk1JVHVwbGVUb1N0cmluZyhNSVZhbHVlICopOwotZXh0ZXJuIE1JU3RyaW5nICpNSVZhbHVlVG9TdHJpbmcoTUlWYWx1ZSAqKTsKLWV4dGVybiB2b2lkIE1JVmFsdWVGcmVlKE1JVmFsdWUgKnYpOwotI2VuZGlmIC8qIF9NSVZBTFVFX0hfICovCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhci5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlWYXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljMWMxZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JVmFsdWUuaCIKLSNpbmNsdWRlICJNSVJlc3VsdC5oIgotI2luY2x1ZGUgIk1JVmFyLmgiCi0jaW5jbHVkZSAiTUlPT0JSZWNvcmQuaCIKLQotTUlWYXIgKgotTUlWYXJOZXcodm9pZCkKLXsKLQlNSVZhciAqCXZhciA9IChNSVZhciAqKW1hbGxvYyhzaXplb2YoTUlWYXIpKTsKLQl2YXItPm5hbWUgPSBOVUxMOwotCXZhci0+dHlwZSA9IE5VTEw7Ci0JdmFyLT5leHAgPSBOVUxMOwotCXZhci0+bnVtY2hpbGQgPSAwOwotCXZhci0+Y2hpbGRyZW4gPSBOVUxMOwotCXJldHVybiB2YXI7Ci19Ci0KLXZvaWQKLU1JVmFyRnJlZShNSVZhciAqdmFyKQotewotCWludCBpOwotCi0JaWYgKHZhci0+bmFtZSAhPSBOVUxMKQotCQlmcmVlKHZhci0+bmFtZSk7Ci0JaWYgKHZhci0+dHlwZSAhPSBOVUxMKQotCQlmcmVlKHZhci0+dHlwZSk7Ci0JaWYgKHZhci0+ZXhwICE9IE5VTEwpCi0JCWZyZWUodmFyLT5leHApOwotCWlmICh2YXItPmNoaWxkcmVuICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IHZhci0+bnVtY2hpbGQ7IGkrKykKLQkJCU1JVmFyRnJlZSh2YXItPmNoaWxkcmVuW2ldKTsKLQkJZnJlZSh2YXItPmNoaWxkcmVuKTsKLQl9Ci0JZnJlZSh2YXIpOwotfQotCi1NSVZhckNoYW5nZSAqCi1NSVZhckNoYW5nZU5ldyh2b2lkKSB7Ci0JTUlWYXJDaGFuZ2UgKnZhcmNoYW5nZSA9IChNSVZhckNoYW5nZSAqKW1hbGxvYyhzaXplb2YoTUlWYXJDaGFuZ2UpKTsKLQotCXZhcmNoYW5nZS0+bmFtZSA9IE5VTEw7Ci0JdmFyY2hhbmdlLT5pbl9zY29wZSA9IDA7Ci0JdmFyY2hhbmdlLT50eXBlX2NoYW5nZWQgPSAwOwotCXJldHVybiB2YXJjaGFuZ2U7Ci19Ci0KLXZvaWQKLU1JVmFyQ2hhbmdlRnJlZShNSVZhckNoYW5nZSAqdmFyY2hhbmdlKSB7Ci0JaWYgKHZhcmNoYW5nZS0+bmFtZSAhPSBOVUxMKQotCQlmcmVlKHZhcmNoYW5nZS0+bmFtZSk7Ci0JZnJlZSh2YXJjaGFuZ2UpOwotfQotCi1NSVZhciAqCi1NSVZhclBhcnNlKExpc3QgKnJlc3VsdHMpCi17Ci0JTUlWYWx1ZSAqCXZhbHVlOwotCU1JUmVzdWx0ICoJcmVzdWx0OwotCU1JVmFyICoJCXZhciA9IE1JVmFyTmV3KCk7Ci0JY2hhciAqCQlzdHI7Ci0KLQlmb3IgKFNldExpc3QocmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyZXN1bHRzKSkgIT0gTlVMTDsgKSB7Ci0JCXZhbHVlID0gcmVzdWx0LT52YWx1ZTsKLQkJaWYgKHZhbHVlICE9IE5VTEwgJiYgdmFsdWUtPnR5cGUgPT0gTUlWYWx1ZVR5cGVDb25zdCkgewotCQkJc3RyID0gdmFsdWUtPmNzdHJpbmc7Ci0JCX0gZWxzZSB7Ci0JCQlzdHIgPSAiIjsKLQkJfQotCi0JCWlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgIm51bWNoaWxkIikgPT0gMCkgewotCQkJdmFyLT5udW1jaGlsZCA9IChpbnQpc3RydG9sKHN0ciwgTlVMTCwgMTApOwotCQl9IGVsc2UgaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAibmFtZSIpID09IDApIHsKLQkJCXZhci0+bmFtZSA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAidHlwZSIpID09IDApIHsKLQkJCXZhci0+dHlwZSA9IHN0cmR1cChzdHIpOwotCQl9IGVsc2UgaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAiZXhwIikgPT0gMCkgewotCQkJdmFyLT5leHAgPSBzdHJkdXAoc3RyKTsKLQkJfQotCX0KLQotCXJldHVybiB2YXI7Ci19Ci0KLU1JVmFyICoKLU1JR2V0VmFyQ3JlYXRlSW5mbyhNSUNvbW1hbmQgKmNtZCkKLXsKLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIE1JVmFyUGFyc2UoY21kLT5vdXRwdXQtPnJyLT5yZXN1bHRzKTsKLX0KLQotLyoKLSAqIFNvbWUgZ2RiIE1hY09TWCBkbyBub3QgcmV0dXJuIGEgTUlUdXBsZSBzbyB3ZSBoYXZlCi0gKiB0byBjaGVjayBmb3IgZGlmZmVyZW50IGZvcm1hdC4KLSAqIFNlZSBQUiA4MTAxOQotICovCi12b2lkCi1wYXJzZUNoaWxkcmVuKE1JVmFsdWUgKnZhbCwgTGlzdCAqKnJlcykKLXsKLQlNSVZhbHVlICoJdmFsdWU7Ci0JTUlSZXN1bHQgKglyZXN1bHQ7Ci0JTGlzdCAqCQljaGlsZHJlbiA9IE5VTEw7Ci0JTGlzdCAqIAkJcmVzdWx0cyA9IHZhbC0+cmVzdWx0czsKLQotCWlmIChyZXN1bHRzICE9IE5VTEwpIHsKLQkJZm9yIChTZXRMaXN0KHJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocmVzdWx0cykpICE9IE5VTEw7ICkgewotCQkJaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAiY2hpbGQiKSA9PSAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IHJlc3VsdC0+dmFsdWU7Ci0JCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlVHVwbGUpIHsKLQkJCQkJaWYgKGNoaWxkcmVuID09IE5VTEwpCi0JCQkJCQljaGlsZHJlbiA9IE5ld0xpc3QoKTsKLQkJCQkJQWRkVG9MaXN0KGNoaWxkcmVuLCBNSVZhclBhcnNlKHZhbHVlLT5yZXN1bHRzKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCSpyZXMgPSBjaGlsZHJlbjsKLX0KLQotdm9pZAotTUlHZXRWYXJMaXN0Q2hpbGRyZW5JbmZvKE1JVmFyICp2YXIsIE1JQ29tbWFuZCAqY21kKQotewotCWludAkJCQludW07Ci0JTUlWYXIgKgkJCWNoaWxkOwotCU1JVmFsdWUgKgkJdmFsdWU7Ci0JTUlSZXN1bHQgKgkJcmVzdWx0OwotCU1JUmVzdWx0UmVjb3JkICoJcnI7Ci0JTGlzdCAqCQkJY2hpbGRyZW4gPSBOVUxMOwotCi0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlyciA9IGNtZC0+b3V0cHV0LT5ycjsKLQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocnItPnJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJdmFsdWUgPSByZXN1bHQtPnZhbHVlOwotCi0JCWlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgIm51bWNoaWxkIikgPT0gMCkgewotCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCQl2YXItPm51bWNoaWxkID0gKGludClzdHJ0b2wodmFsdWUtPmNzdHJpbmcsIE5VTEwsIDEwKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgImNoaWxkcmVuIikgPT0gMCkgewotCQkJcGFyc2VDaGlsZHJlbih2YWx1ZSwgJmNoaWxkcmVuKTsKLQkJfQotCX0KLQotCWlmIChjaGlsZHJlbiAhPSBOVUxMKSB7Ci0JCW51bSA9IFNpemVPZkxpc3QoY2hpbGRyZW4pOwotCQlpZiAodmFyLT5udW1jaGlsZCAhPSBudW0pCi0JCQl2YXItPm51bWNoaWxkID0gbnVtOwotCQl2YXItPmNoaWxkcmVuID0gKE1JVmFyICoqKW1hbGxvYyhzaXplb2YoTUlWYXIgKikgKiB2YXItPm51bWNoaWxkKTsKLQkJZm9yIChudW0gPSAwLCBTZXRMaXN0KGNoaWxkcmVuKTsgKGNoaWxkID0gKE1JVmFyICopR2V0TGlzdEVsZW1lbnQoY2hpbGRyZW4pKSAhPSBOVUxMOyApCi0JCQl2YXItPmNoaWxkcmVuW251bSsrXSA9IGNoaWxkOwotCX0KLX0KLQotY2hhciAqCi1NSUdldFZhckV2YWx1YXRlRXhwcmVzc2lvbkluZm8oTUlDb21tYW5kICpjbWQpCi17Ci0JTUlWYWx1ZSAqCQl2YWx1ZTsKLQlNSVJlc3VsdCAqCQlyZXN1bHQ7Ci0JTUlSZXN1bHRSZWNvcmQgKglycjsKLQljaGFyICoJCQlleHByID0gTlVMTDsKLQotCWlmICghY21kLT5jb21wbGV0ZWQgfHwgY21kLT5vdXRwdXQgPT0gTlVMTCB8fCBjbWQtPm91dHB1dC0+cnIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyciA9IGNtZC0+b3V0cHV0LT5ycjsKLQlmb3IgKFNldExpc3QocnItPnJlc3VsdHMpOyAocmVzdWx0ID0gKE1JUmVzdWx0ICopR2V0TGlzdEVsZW1lbnQocnItPnJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJdmFsdWUgPSByZXN1bHQtPnZhbHVlOwotCQlpZiAoc3RyY21wKHJlc3VsdC0+dmFyaWFibGUsICJ2YWx1ZSIpID09IDApIHsKLQkJCWlmICh2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQkJZXhwciA9IHN0cmR1cCh2YWx1ZS0+Y3N0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGV4cHI7Ci19Ci0KLWNoYXIgKgotTUlHZXREYXRhRXZhbHVhdGVFeHByZXNzaW9uSW5mbyhNSUNvbW1hbmQgKmNtZCkKLXsKLQlNSVZhbHVlICoJCXZhbHVlOwotCU1JUmVzdWx0ICoJCXJlc3VsdDsKLQlNSVJlc3VsdFJlY29yZCAqCXJyOwotCWNoYXIgKgkJCWV4cHIgPSBOVUxMOwotCi0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJyID0gY21kLT5vdXRwdXQtPnJyOwotCWZvciAoU2V0TGlzdChyci0+cmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyci0+cmVzdWx0cykpICE9IE5VTEw7ICkgewotCQl2YWx1ZSA9IHJlc3VsdC0+dmFsdWU7Ci0JCWlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgInZhbHVlIikgPT0gMCkgewotCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCQlleHByID0gc3RyZHVwKHZhbHVlLT5jc3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZXhwcjsKLX0KLQotdm9pZAotTUlHZXRWYXJVcGRhdGVQYXJzZVZhbHVlKE1JVmFsdWUqIHR1cGxlLCBMaXN0KiB2YXJjaGFuZ2VzKQotewotCU1JUmVzdWx0ICogcmVzdWx0OwotCWNoYXIgKiBzdHIgPSBOVUxMOwotCWNoYXIgKiB2YXI7Ci0JTUlWYWx1ZSAqIHZhbHVlOwotCU1JVmFyQ2hhbmdlICogdmFyY2hhbmdlID0gTlVMTDsKLQlMaXN0ICogcmVzdWx0cyA9IHR1cGxlLT5yZXN1bHRzOwotCi0JaWYgKHJlc3VsdHMgIT0gTlVMTCkgewotCQlmb3IgKFNldExpc3QocmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyZXN1bHRzKSkgIT0gTlVMTDspIHsKLQkJCXZhciA9IHJlc3VsdC0+dmFyaWFibGU7Ci0JCQl2YWx1ZSA9IHJlc3VsdC0+dmFsdWU7Ci0KLQkJCS8vdGhpcyBjb2RlIGlzIGZvciBtYWMKLQkJCWlmICh2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZVR1cGxlKSB7Ci0JCQkJTUlHZXRWYXJVcGRhdGVQYXJzZVZhbHVlKHZhbHVlLCB2YXJjaGFuZ2VzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHZhbHVlLT50eXBlID09IE1JVmFsdWVUeXBlQ29uc3QpIHsKLQkJCQlzdHIgPSB2YWx1ZS0+Y3N0cmluZzsKLQkJCX0KLQotCQkJaWYgKHN0cmNtcCh2YXIsICJuYW1lIikgPT0gMCAmJiBzdHIgIT0gTlVMTCkgewotCQkJCXZhcmNoYW5nZSA9IE1JVmFyQ2hhbmdlTmV3KCk7Ci0JCQkJdmFyY2hhbmdlLT5uYW1lID0gc3RyZHVwKHN0cik7Ci0JCQkJQWRkVG9MaXN0KHZhcmNoYW5nZXMsICh2b2lkICopdmFyY2hhbmdlKTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKHZhciwgImluX3Njb3BlIikgPT0gMCkgewotCQkJCWlmICh2YXJjaGFuZ2UgIT0gTlVMTCkgewotCQkJCQl2YXJjaGFuZ2UtPmluX3Njb3BlID0gKHN0cmNtcChzdHIsICJ0cnVlIik9PTApPzE6MDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcCh2YXIsICJ0eXBlX2NoYW5nZWQiKSA9PSAwKSB7Ci0JCQkJaWYgKHZhcmNoYW5nZSAhPSBOVUxMKSB7Ci0JCQkJCXZhcmNoYW5nZS0+dHlwZV9jaGFuZ2VkID0gKHN0cmNtcChzdHIsICJ0cnVlIik9PTApPzE6MDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQKLU1JR2V0VmFyVXBkYXRlUGFyc2VyKE1JVmFsdWUqIG1pVmFsLCBMaXN0ICp2YXJjaGFuZ2VzKQotewotCU1JVmFsdWUqIHZhbHVlOwotCU1JUmVzdWx0KiByZXN1bHQ7Ci0KLQlpZiAobWlWYWwtPnR5cGUgPT0gTUlWYWx1ZVR5cGVUdXBsZSkgewotCQlNSUdldFZhclVwZGF0ZVBhcnNlVmFsdWUobWlWYWwsIHZhcmNoYW5nZXMpOwotCX0KLQllbHNlIGlmIChtaVZhbC0+dHlwZSA9PSBNSVZhbHVlVHlwZUxpc3QpIHsKLQkJaWYgKEVtcHR5TGlzdChtaVZhbC0+dmFsdWVzKSkgewotCQkJZm9yIChTZXRMaXN0KG1pVmFsLT5yZXN1bHRzKTsgKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KG1pVmFsLT5yZXN1bHRzKSkgIT0gTlVMTDspIHsKLQkJCQlNSUdldFZhclVwZGF0ZVBhcnNlcihyZXN1bHQtPnZhbHVlLCB2YXJjaGFuZ2VzKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZvciAoU2V0TGlzdChtaVZhbC0+dmFsdWVzKTsgKHZhbHVlID0gKE1JVmFsdWUgKilHZXRMaXN0RWxlbWVudChtaVZhbC0+dmFsdWVzKSkgIT0gTlVMTDspIHsKLQkJCQlNSUdldFZhclVwZGF0ZVBhcnNlcih2YWx1ZSwgdmFyY2hhbmdlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQKLU1JR2V0VmFyVXBkYXRlSW5mbyhNSUNvbW1hbmQgKmNtZCwgTGlzdCoqIHZhcmNoYW5nZXMpCi17Ci0JTUlSZXN1bHQgKgkJcmVzdWx0OwotCU1JUmVzdWx0UmVjb3JkICoJcnI7Ci0JKnZhcmNoYW5nZXMgPSBOZXdMaXN0KCk7Ci0KLQlpZiAoIWNtZC0+Y29tcGxldGVkIHx8IGNtZC0+b3V0cHV0ID09IE5VTEwgfHwgY21kLT5vdXRwdXQtPnJyID09IE5VTEwpCi0JCXJldHVybjsKLQotCXJyID0gY21kLT5vdXRwdXQtPnJyOwotCWZvciAoU2V0TGlzdChyci0+cmVzdWx0cyk7IChyZXN1bHQgPSAoTUlSZXN1bHQgKilHZXRMaXN0RWxlbWVudChyci0+cmVzdWx0cykpICE9IE5VTEw7KSB7Ci0JCWlmIChzdHJjbXAocmVzdWx0LT52YXJpYWJsZSwgImNoYW5nZWxpc3QiKSA9PSAwKSB7Ci0JCQlNSUdldFZhclVwZGF0ZVBhcnNlcihyZXN1bHQtPnZhbHVlLCAqdmFyY2hhbmdlcyk7Ci0JCX0KLQl9Ci19Ci0KLU1JVmFyICoKLU1JR2V0VmFySW5mb1R5cGUoTUlDb21tYW5kICpjbWQpCi17Ci0JaWYgKCFjbWQtPmNvbXBsZXRlZCB8fCBjbWQtPm91dHB1dCA9PSBOVUxMIHx8IGNtZC0+b3V0cHV0LT5yciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBNSVZhclBhcnNlKGNtZC0+b3V0cHV0LT5yci0+cmVzdWx0cyk7Ci19Ci0KLXZvaWQKLU1JR2V0VmFySW5mb051bUNoaWxkcmVuKE1JQ29tbWFuZCAqY21kLCBNSVZhciAqdmFyKQotewotCWlmICghY21kLT5jb21wbGV0ZWQgfHwgY21kLT5vdXRwdXQgPT0gTlVMTCB8fCBjbWQtPm91dHB1dC0+cnIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JTGlzdCAqcmVzdWx0czsKLQlNSVZhbHVlICoJdmFsdWU7Ci0JTUlSZXN1bHQgKglyZXN1bHQ7Ci0JY2hhciAqCQlzdHI7Ci0KLQlpZiAodmFyID09IE5VTEwpCi0JCXZhciA9IE1JVmFyTmV3KCk7Ci0KLQlyZXN1bHRzID0gY21kLT5vdXRwdXQtPnJyLT5yZXN1bHRzOwotCWZvciAoU2V0TGlzdChyZXN1bHRzKTsgKHJlc3VsdCA9IChNSVJlc3VsdCAqKUdldExpc3RFbGVtZW50KHJlc3VsdHMpKSAhPSBOVUxMOyApIHsKLQkJdmFsdWUgPSByZXN1bHQtPnZhbHVlOwotCQlpZiAodmFsdWUgIT0gTlVMTCAmJiB2YWx1ZS0+dHlwZSA9PSBNSVZhbHVlVHlwZUNvbnN0KSB7Ci0JCQlzdHIgPSB2YWx1ZS0+Y3N0cmluZzsKLQkJfSBlbHNlIHsKLQkJCXN0ciA9ICIiOwotCQl9Ci0KLQkJaWYgKHN0cmNtcChyZXN1bHQtPnZhcmlhYmxlLCAibnVtY2hpbGQiKSA9PSAwKSB7Ci0JCQl2YXItPm51bWNoaWxkID0gKGludClzdHJ0b2woc3RyLCBOVUxMLCAxMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhci5oIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlWYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxNGU3YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKgotICAqIEJhc2VkIG9uIHRoZSBRTlggSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUkgaW50ZXJmYWNlCi0gICovCi0KLSNpZm5kZWYgX01JVkFSX0hfCi0jZGVmaW5lIF9NSVZBUl9IXwotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JU3RyaW5nLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHRSZWNvcmQuaCIKLSNpbmNsdWRlICJNSUNvbW1hbmQuaCIKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2V0IHZhcmlhYmxlIG9iamVjdC4KLSAqLwotc3RydWN0IE1JVmFyIHsKLQljaGFyICoJCQluYW1lOwotCWNoYXIgKgkJCXR5cGU7Ci0JY2hhciAqCQkJZXhwOwotCWludAkJCQludW1jaGlsZDsKLQlzdHJ1Y3QgTUlWYXIgKioJY2hpbGRyZW47Ci19OwotdHlwZWRlZiBzdHJ1Y3QgTUlWYXIJTUlWYXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNldCB2YXJpYWJsZSBvYmplY3QuCi0gKi8KLXN0cnVjdCBNSVZhckNoYW5nZSB7Ci0JY2hhciAqCW5hbWU7Ci0JaW50CQlpbl9zY29wZTsKLQlpbnQJCXR5cGVfY2hhbmdlZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBNSVZhckNoYW5nZQlNSVZhckNoYW5nZTsKLQotZXh0ZXJuIE1JVmFyICpNSVZhck5ldyh2b2lkKTsKLWV4dGVybiB2b2lkIE1JVmFyRnJlZShNSVZhciAqdmFyKTsKLQotZXh0ZXJuIE1JVmFyQ2hhbmdlICpNSVZhckNoYW5nZU5ldyh2b2lkKTsKLWV4dGVybiB2b2lkIE1JVmFyQ2hhbmdlRnJlZShNSVZhckNoYW5nZSAqdmFyKTsKLQotZXh0ZXJuIE1JVmFyICpNSVZhclBhcnNlKExpc3QgKnJlc3VsdHMpOwotZXh0ZXJuIE1JVmFyICpNSUdldFZhckNyZWF0ZUluZm8oTUlDb21tYW5kICpjbWQpOwotZXh0ZXJuIHZvaWQgTUlHZXRWYXJMaXN0Q2hpbGRyZW5JbmZvKE1JVmFyICp2YXIsIE1JQ29tbWFuZCAqY21kKTsKLWV4dGVybiBjaGFyICpNSUdldFZhckV2YWx1YXRlRXhwcmVzc2lvbkluZm8oTUlDb21tYW5kICpjbWQpOwotZXh0ZXJuIGNoYXIgKk1JR2V0RGF0YUV2YWx1YXRlRXhwcmVzc2lvbkluZm8oTUlDb21tYW5kICpjbWQpOwotCi1leHRlcm4gdm9pZCBNSUdldFZhclVwZGF0ZUluZm8oTUlDb21tYW5kICpjbWQsIExpc3QgKip2YXJjaGFuZ2VzKTsKLWV4dGVybiBNSVZhciAqTUlHZXRWYXJJbmZvVHlwZShNSUNvbW1hbmQgKmNtZCk7Ci1leHRlcm4gdm9pZCBNSUdldFZhckluZm9OdW1DaGlsZHJlbihNSUNvbW1hbmQgKmNtZCwgTUlWYXIgKnZhcik7Ci0jZW5kaWYgLyogX01JVkFSX0hfICovCi0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvTUlWYXJDb21tYW5kLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhckNvbW1hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5MzZhYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS9NSVZhckNvbW1hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5ICAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotIC8qCi0gICogQmFzZWQgb24gdGhlIFFOWCBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSSBpbnRlcmZhY2UKLSAgKi8KLSAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgIk1JU3RyaW5nLmgiCi0jaW5jbHVkZSAiTUlDb21tYW5kLmgiCi0KLU1JQ29tbWFuZCAqCi1NSVZhckNyZWF0ZShjaGFyICpuYW1lLCBjaGFyICpmcmFtZSwgY2hhciAqZXhwcikKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItdmFyLWNyZWF0ZSIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgbmFtZSwgZnJhbWUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIGV4cHIsIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSVZhckRlbGV0ZShjaGFyICpuYW1lKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQkKLQljbWQgPSBNSUNvbW1hbmROZXcoIi12YXItZGVsZXRlIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBuYW1lLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotTUlWYXJMaXN0Q2hpbGRyZW4oY2hhciAqbmFtZSkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItdmFyLWxpc3QtY2hpbGRyZW4iLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIG5hbWUsIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSVZhckV2YWx1YXRlRXhwcmVzc2lvbihjaGFyICpuYW1lKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQkKLQljbWQgPSBNSUNvbW1hbmROZXcoIi12YXItZXZhbHVhdGUtZXhwcmVzc2lvbiIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0JTUlDb21tYW5kQWRkT3B0aW9uKGNtZCwgbmFtZSwgTlVMTCk7Ci0JcmV0dXJuIGNtZDsKLX0KLQotTUlDb21tYW5kICoKLU1JVmFyVXBkYXRlKGNoYXIgKm5hbWUpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCQotCWNtZCA9IE1JQ29tbWFuZE5ldygiLXZhci11cGRhdGUiLCBNSVJlc3VsdFJlY29yZERPTkUpOwotCU1JQ29tbWFuZEFkZE9wdGlvbihjbWQsIG5hbWUsIE5VTEwpOwotCXJldHVybiBjbWQ7Ci19Ci0KLU1JQ29tbWFuZCAqCi1NSURhdGFFdmFsdWF0ZUV4cHJlc3Npb24oY2hhciAqbmFtZSkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItZGF0YS1ldmFsdWF0ZS1leHByZXNzaW9uIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBuYW1lLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotTUlWYXJJbmZvVHlwZShjaGFyICpuYW1lKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQkKLQljbWQgPSBNSUNvbW1hbmROZXcoIi12YXItaW5mby10eXBlIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBuYW1lLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQotCi1NSUNvbW1hbmQgKgotTUlWYXJJbmZvTnVtQ2hpbGRyZW4oY2hhciAqbmFtZSkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JCi0JY21kID0gTUlDb21tYW5kTmV3KCItdmFyLWluZm8tbnVtLWNoaWxkcmVuIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBuYW1lLCBOVUxMKTsKLQlyZXR1cm4gY21kOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvdGVzdC5pbnB1dCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL21pL3Rlc3QuaW5wdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTM3ZWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvdGVzdC5pbnB1dAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLV5kb25lLGJrcHQ9e251bWJlcj0iMSIsYWRkcj0iMHgwMDAxMDBkMCIsZmlsZT0iaGVsbG8uYyIsbGluZT0iNSJ9Ci0oZ2RiKQotXmRvbmUsQnJlYWtwb2ludFRhYmxlPXtucl9yb3dzPSIxIixucl9jb2xzPSI2IixoZHI9W3t3aWR0aD0iMyIsYWxpZ25tZW50PSItMSIsY29sX25hbWU9Im51bWJlciIsY29saGRyPSJOdW0ifSx7d2lkdGg9IjE0IixhbGlnbm1lbnQ9Ii0xIixjb2xfbmFtZT0idHlwZSIsY29saGRyPSJUeXBlIn0se3dpZHRoPSI0IixhbGlnbm1lbnQ9Ii0xIixjb2xfbmFtZT0iZGlzcCIsY29saGRyPSJEaXNwIn0se3dpZHRoPSIzIixhbGlnbm1lbnQ9Ii0xIixjb2xfbmFtZT0iZW5hYmxlZCIsY29saGRyPSJFbmIifSx7d2lkdGg9IjEwIixhbGlnbm1lbnQ9Ii0xIixjb2xfbmFtZT0iYWRkciIsY29saGRyPSJBZGRyZXNzIn0se3dpZHRoPSI0MCIsYWxpZ25tZW50PSIyIixjb2xfbmFtZT0id2hhdCIsY29saGRyPSJXaGF0In1dLGJvZHk9W2JrcHQ9e251bWJlcj0iMSIsdHlwZT0iYnJlYWtwb2ludCIsZGlzcD0ia2VlcCIsZW5hYmxlZD0ieSIsYWRkcj0iMHgwMDAxMDBkMCIsZnVuYz0ibWFpbiIsZmlsZT0iaGVsbG8uYyIsbGluZT0iNSIsdGltZXM9IjAiLGlnbm9yZT0iMyJ9XX0KLShnZGIpCi1ecnVubmluZwotXmRvbmUscmVhc29uPSJ3YXRjaHBvaW50LXRyaWdnZXIiLHdwdD17bnVtYmVyPSIyIixleHA9IngifSx2YWx1ZT17b2xkPSItMjY4NDM5MjEyIixuZXc9IjU1In0sZnJhbWU9e2Z1bmM9Im1haW4iLGFyZ3M9W10sZmlsZT0icmVjdXJzaXZlMi5jIixmdWxsbmFtZT0iL2hvbWUvZm9vL2Jhci9kZXZvL215cHJvamVjdC9yZWN1cnNpdmUyLmMiLGxpbmU9IjUifQotKGdkYikKLV5kb25lLGFzbV9pbnNucz1be2FkZHJlc3M9IjB4MDAwMTA3YzAiLGZ1bmMtbmFtZT0ibWFpbiIsb2Zmc2V0PSI0IixpbnN0PSJtb3YgIDIsICVvMCJ9LHthZGRyZXNzPSIweDAwMDEwN2M0IixmdW5jLW5hbWU9Im1haW4iLG9mZnNldD0iOCIsaW5zdD0ic2V0aGkgICVoaSgweDExODAwKSwgJW8yIn0se2FkZHJlc3M9IjB4MDAwMTA3YzgiLGZ1bmMtbmFtZT0ibWFpbiIsb2Zmc2V0PSIxMiIsaW5zdD0ib3IgICVvMiwgMHgxNDAsICVvMVx0ISAweDExOTQwIDxfbGliX3ZlcnNpb24rOD4ifSx7YWRkcmVzcz0iMHgwMDAxMDdjYyIsZnVuYy1uYW1lPSJtYWluIixvZmZzZXQ9IjE2IixpbnN0PSJzZXRoaSAgJWhpKDB4MTE4MDApLCAlbzIifSx7YWRkcmVzcz0iMHgwMDAxMDdkMCIsZnVuYy1uYW1lPSJtYWluIixvZmZzZXQ9IjIwIixpbnN0PSJvciAgJW8yLCAweDE2OCwgJW80XHQhIDB4MTE5NjggPF9saWJfdmVyc2lvbis0OD4ifV0KLShnZGIpCi1eZG9uZSxyZWdpc3Rlci1uYW1lcz1bInIwIiwicjEiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiwicjciLCJyOCIsInI5IiwicjEwIiwicjExIiwicjEyIiwicjEzIiwicjE0IiwicjE1IiwicjE2IiwicjE3IiwicjE4IiwicjE5IiwicjIwIiwicjIxIiwicjIyIiwicjIzIiwicjI0IiwicjI1IiwicjI2IiwicjI3IiwicjI4IiwicjI5IiwicjMwIiwicjMxIiwiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsImY4IiwiZjkiLCJmMTAiLCJmMTEiLCJmMTIiLCJmMTMiLCJmMTQiLCJmMTUiLCJmMTYiLCJmMTciLCJmMTgiLCJmMTkiLCJmMjAiLCJmMjEiLCJmMjIiLCJmMjMiLCJmMjQiLCJmMjUiLCJmMjYiLCJmMjciLCJmMjgiLCJmMjkiLCJmMzAiLCJmMzEiLCIiLCJwYyIsInBzIiwiY3IiLCJsciIsImN0ciIsInhlciJdCi0oZ2RiKQotXnJ1bm5pbmcKLShnZGIpCi1ASGVsbG8gd29ybGQKLSpzdG9wcGVkLHJlYXNvbj0iYnJlYWtwb2ludC1oaXQiLGJrcHRubz0iMiIsZnJhbWU9e2Z1bmM9ImZvbyIsYXJncz1bXSxmaWxlPSJoZWxsby5jIixmdWxsbmFtZT0iL2hvbWUvZm9vL2Jhci9kZXZvL215cHJvamVjdC9oZWxsby5jIixsaW5lPSIxMyJ9Ci0oZ2RiKQotMjIyXmRvbmUKLShnZGIpCi0xMTEqc3RvcHBlZCxzaWduYWwtbmFtZT0iU0lHSU5UIixzaWduYWwtbWVhbmluZz0iSW50ZXJydXB0IixmcmFtZT17YWRkcj0iMHgwMDAxMDE0MCIsZnVuYz0iZm9vIixhcmdzPVtdLGZpbGU9InRyeS5jIixmdWxsbmFtZT0iL2hvbWUvZm9vL2Jhci9kZXZvL215cHJvamVjdC90cnkuYyIsbGluZT0iMTMifQotKGdkYikKLV5kb25lLHN0YWNrPVtmcmFtZT17bGV2ZWw9IjAiLGFkZHI9IjB4MDAwMTA3MzQiLGZ1bmM9ImNhbGxlZTQiLGZpbGU9Ii4uLy4uLy4uL2Rldm8vZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvYmFzaWNzLmMiLGZ1bGxuYW1lPSIvaG9tZS9mb28vYmFyL2Rldm8vZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvYmFzaWNzLmMiLGxpbmU9IjgifSxmcmFtZT17bGV2ZWw9IjEiLGFkZHI9IjB4MDAwMTA3NmMiLGZ1bmM9ImNhbGxlZTMiLGZpbGU9Ii4uLy4uLy4uL2Rldm8vZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvYmFzaWNzLmMiLGZ1bGxuYW1lPSIvaG9tZS9mb28vYmFyL2Rldm8vZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvYmFzaWNzLmMiLGxpbmU9IjE3In0sZnJhbWU9e2xldmVsPSIyIixhZGRyPSIweDAwMDEwNzhjIixmdW5jPSJjYWxsZWUyIixmaWxlPSIuLi8uLi8uLi9kZXZvL2dkYi90ZXN0c3VpdGUvZ2RiLm1pL2Jhc2ljcy5jIixmdWxsbmFtZT0iL2hvbWUvZm9vL2Jhci9kZXZvL2dkYi90ZXN0c3VpdGUvZ2RiLm1pL2Jhc2ljcy5jIixsaW5lPSIyMiJ9LGZyYW1lPXtsZXZlbD0iMyIsYWRkcj0iMHgwMDAxMDdiNCIsZnVuYz0iY2FsbGVlMSIsZmlsZT0iLi4vLi4vLi4vZGV2by9nZGIvdGVzdHN1aXRlL2dkYi5taS9iYXNpY3MuYyIsZnVsbG5hbWU9Ii9ob21lL2Zvby9iYXIvZGV2by9nZGIvdGVzdHN1aXRlL2dkYi5taS9iYXNpY3MuYyIsbGluZT0iMjcifSxmcmFtZT17bGV2ZWw9IjQiLGFkZHI9IjB4MDAwMTA3ZTAiLGZ1bmM9Im1haW4iLGZpbGU9Ii4uLy4uLy4uL2Rldm8vZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvYmFzaWNzLmMiLGZ1bGxuYW1lPSIvaG9tZS9mb28vYmFyL2Rldm8vZ2RiL3Rlc3RzdWl0ZS9nZGIubWkvYmFzaWNzLmMiLGxpbmU9IjMyIn1dCi0oZ2RiKQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS90ZXN0X21pLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9taS90ZXN0X21pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDQzMTIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvbWkvdGVzdF9taS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaXN0LmgiCi0jaW5jbHVkZSAiTUlTdHJpbmcuaCIKLSNpbmNsdWRlICJNSVNlc3Npb24uaCIKLSNpbmNsdWRlICJNSUVycm9yLmgiCi0jaW5jbHVkZSAiTUlSZXN1bHRSZWNvcmQuaCIKLSNpbmNsdWRlICJNSUJyZWFrcG9pbnQuaCIKLQotdm9pZAotY21kX2NhbGxiYWNrKE1JUmVzdWx0UmVjb3JkICpyciwgdm9pZCAqc2VzcykKLXsKLQlNSVN0cmluZyAqc3RyID0gTUlSZXN1bHRSZWNvcmRUb1N0cmluZyhycik7Ci0JcHJpbnRmKCJyZXM+ICVzXG4iLCBNSVN0cmluZ1RvQ1N0cmluZyhzdHIpKTsKLQlNSVN0cmluZ0ZyZWUoc3RyKTsKLX0KLQotdm9pZAotY29uc29sZV9jYWxsYmFjayhjaGFyICpzdHIpCi17Ci0JcHJpbnRmKCJjb25zPiAlc1xuIiwgc3RyKTsKLX0KLQotdm9pZAotbG9nX2NhbGxiYWNrKGNoYXIgKnN0cikKLXsKLQlwcmludGYoImxvZz4gJXNcbiIsIHN0cik7Ci19Ci0KLXZvaWQKLXNlbmRjbWRfd2FpdChNSVNlc3Npb24gKnNlc3MsIE1JQ29tbWFuZCAqY21kKQotewotCU1JU2Vzc2lvblNlbmRDb21tYW5kKHNlc3MsIGNtZCk7Ci0JTUlPdXRwdXQgKm91dHB1dCA9IE1JT3V0cHV0TmV3KCk7Ci0JZG8gewotCQlNSVNlc3Npb25Qcm9ncmVzcyhzZXNzLCBvdXRwdXQpOwotCX0gd2hpbGUgKCFNSVNlc3Npb25Db21tYW5kQ29tcGxldGVkKHNlc3MpKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlNSVNlc3Npb24gKnNlc3M7Ci0JTUlDb21tYW5kICpjbWQ7Ci0JTGlzdCAqYnB0czsKLQlNSUJyZWFrcG9pbnQgKmJwdDsKLQkKLQlzZXNzID0gTUlTZXNzaW9uTmV3KCk7Ci0JaWYgKE1JU2Vzc2lvblN0YXJ0TG9jYWwoc2VzcywgIi9Wb2x1bWVzL0hvbWUvZ3JlZy94IikgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXMiLCBNSUdldEVycm9yU3RyKCkpOwotCQlyZXR1cm4gMTsKLQl9Ci0JCi0JTUlTZXNzaW9uUmVnaXN0ZXJDb25zb2xlQ2FsbGJhY2soc2VzcywgY29uc29sZV9jYWxsYmFjayk7Ci0JTUlTZXNzaW9uUmVnaXN0ZXJMb2dDYWxsYmFjayhzZXNzLCBsb2dfY2FsbGJhY2spOwotCi1wcmludGYoImhlbHAgY29tbWFuZFxuIik7Ci0JY21kID0gTUlDb21tYW5kTmV3KCJoZWxwIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRSZWdpc3RlckNhbGxiYWNrKGNtZCwgY21kX2NhbGxiYWNrLCBzZXNzKTsKLQlzZW5kY21kX3dhaXQoc2VzcywgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpCi0JCWZwcmludGYoc3RkZXJyLCAiY29tbWFuZCBmYWlsZWRcbiIpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLXByaW50Zigic2V0IGNvbW1hbmRcbiIpOwkKLQljbWQgPSBNSUdEQlNldCgiY29uZmlybSIsICJvZmYiKTsKLQlNSUNvbW1hbmRSZWdpc3RlckNhbGxiYWNrKGNtZCwgY21kX2NhbGxiYWNrLCBzZXNzKTsKLQlzZW5kY21kX3dhaXQoc2VzcywgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpCi0JCWZwcmludGYoc3RkZXJyLCAiY29tbWFuZCBmYWlsZWRcbiIpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLXByaW50ZigiYnJlYWsgY29tbWFuZFxuIik7CQotCWNtZCA9IE1JQnJlYWtJbnNlcnQoMCwgMCwgTlVMTCwgMCwgIjQiLCAwKTsKLQlNSUNvbW1hbmRSZWdpc3RlckNhbGxiYWNrKGNtZCwgY21kX2NhbGxiYWNrLCBzZXNzKTsKLQlzZW5kY21kX3dhaXQoc2VzcywgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpCi0JCWZwcmludGYoc3RkZXJyLCAiY29tbWFuZCBmYWlsZWRcbiIpOwotCWJwdHMgPSBNSUJyZWFrcG9pbnRHZXRCcmVha0luc2VydEluZm8oY21kKTsKLQlpZiAoYnB0cyAhPSBOVUxMKQotCQlmb3IgKFNldExpc3QoYnB0cyk7IChicHQgPSAoTUlCcmVha3BvaW50ICopR2V0TGlzdEVsZW1lbnQoYnB0cykpICE9IE5VTEw7ICkKLQkJCXByaW50ZigiYnB0IGlkID0gJWRcbiIsIGJwdC0+bnVtYmVyKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci1wcmludGYoInF1aXQgY29tbWFuZFxuIik7CQkKLQljbWQgPSBNSUdEQkV4aXQoKTsKLQlNSUNvbW1hbmRSZWdpc3RlckNhbGxiYWNrKGNtZCwgY21kX2NhbGxiYWNrLCBzZXNzKTsKLQlzZW5kY21kX3dhaXQoc2VzcywgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpCi0JCWZwcmludGYoc3RkZXJyLCAiY29tbWFuZCBmYWlsZWRcbiIpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvc2VydmVyLy5jdnNpZ25vcmUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzZDFhNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLmRpcnN0YW1wCi0uZGVwcwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvc2VydmVyL2JhY2tlbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3NlcnZlci9iYWNrZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzUwMjAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvc2VydmVyL2JhY2tlbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgIAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYmFja2VuZC5oIgotCi1leHRlcm4gZGJnX2JhY2tlbmRfZnVuY3MJR0RCTUlCYWNrZW5kOwotZXh0ZXJuIGRiZ19iYWNrZW5kX2Z1bmNzCVRlc3RCYWNrZW5kOwotCi1kYmdfYmFja2VuZAlkYmdfYmFja2VuZHNbXSA9IHsKLQl7ImdkYi1taSIsICZHREJNSUJhY2tlbmQsICJnZGIifSwKLQl7InRlc3QiLCAmVGVzdEJhY2tlbmQsIE5VTEx9Ci19OwotCi1pbnQKLWZpbmRfZGJnX2JhY2tlbmQoY2hhciAqbmFtZSwgZGJnX2JhY2tlbmQgKipkcCkKLXsKLQlpbnQJCQkJaTsKLQlkYmdfYmFja2VuZCAqCWQ7Ci0JCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihkYmdfYmFja2VuZHMpIC8gc2l6ZW9mKGRiZ19iYWNrZW5kKTsgaSsrKSB7Ci0JCWQgPSAmZGJnX2JhY2tlbmRzW2ldOwotCQlpZiAoc3RyY21wKG5hbWUsIGQtPmRiX25hbWUpID09IDApIHsKLQkJCSpkcCA9IGQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtMTsKLX0KLQotdm9pZAotYmFja2VuZF9zZXRfcGF0aChkYmdfYmFja2VuZCAqZCwgY2hhciAqcGF0aCkKLXsKLQlkLT5kYl9leGVfcGF0aCA9IHBhdGg7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvc2VydmVyL2dkYm1pX2JhY2tlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhMjA3Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvZ2RibWlfYmFja2VuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSA8YWlmLmg+Ci0KLSNpbmNsdWRlICJkYmcuaCIKLSNpbmNsdWRlICJkYmdfZXZlbnQuaCIKLSNpbmNsdWRlICJiYWNrZW5kLmgiCi0jaW5jbHVkZSAibGlzdC5oIgotCi0jaW5jbHVkZSAiTUkuaCIKLQotc3RydWN0IGJwZW50cnkgewotCWludCBsb2NhbDsKLQlpbnQgcmVtb3RlOwotCWludCB0ZW1wOwotfTsKLXR5cGVkZWYgc3RydWN0IGJwZW50cnkJYnBlbnRyeTsKLQotc3RydWN0IGJwbWFwIHsKLQlpbnQJCQkJbmVsczsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGN1cnJlbnRseSBpbiBtYXAKLQlpbnQJCQkJc2l6ZTsgLy8gdG90YWwgc2l6ZSBvZiBtYXAKLQlzdHJ1Y3QgYnBlbnRyeSAqCW1hcHM7Ci19OwotCi1zdHJ1Y3QgdmFyaW5mbyB7Ci0JY2hhciAqIG5hbWU7IC8vdmFyaWFibGUgbmFtZQotCU1JVmFyICptaXZhcjsKLX07Ci10eXBlZGVmIHN0cnVjdCB2YXJpbmZvCXZhcmluZm87Ci0KLXN0cnVjdCB2YXJtYXAgewotCWludCBuZWxzOyAvLyBudW1iZXIgb2YgZWxlbWVudHMgY3VycmVudGx5IGluIG1hcAotCWludCBzaXplOyAvLyB0b3RhbCBzaXplIG9mIG1hcAotCXN0cnVjdCB2YXJpbmZvICogbWFwczsKLX07Ci0KLXN0YXRpYyBkb3VibGUJCUdEQl9WZXJzaW9uOwotc3RhdGljIGludAkJCUFERFJFU1NfTEVOR1RIID0gMDsKLXN0YXRpYyBNSVNlc3Npb24gKglEZWJ1Z1Nlc3Npb247Ci1zdGF0aWMgZGJnX2V2ZW50ICoJTGFzdEV2ZW50Owotc3RhdGljIHZvaWQJCQkoKkV2ZW50Q2FsbGJhY2spKGRiZ19ldmVudCAqKTsKLXN0YXRpYyBpbnQJCQlTZXJ2ZXJFeGl0Owotc3RhdGljIGludAkJCVN0YXJ0ZWQ7Ci1zdGF0aWMgc3RydWN0IGJwbWFwCUJQTWFwID0geyAwLCAwLCBOVUxMIH07Ci0jaWYgMAotc3RhdGljIHN0cnVjdCB2YXJtYXAgVkFSTWFwID0geyAwLCAwLCBOVUxMIH07Ci0jZW5kaWYKLXN0YXRpYyBpbnQJCQkoKkFzeW5jRnVuYykodm9pZCAqKSA9IE5VTEw7Ci1zdGF0aWMgdm9pZCAqCQlBc3luY0Z1bmNEYXRhOwotCi1zdGF0aWMgaW50CUdEQk1JSW5pdCh2b2lkICgqKShkYmdfZXZlbnQgKikpOwotc3RhdGljIGludAlHREJNSVByb2dyZXNzKHZvaWQpOwotc3RhdGljIGludAlHREJNSUludGVycnVwdCh2b2lkKTsKLXN0YXRpYyBpbnQJR0RCTUlTdGFydFNlc3Npb24oY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICoqLCBjaGFyICoqLCBsb25nKTsKLXN0YXRpYyBpbnQJR0RCTUlTZXRMaW5lQnJlYWtwb2ludChpbnQsIGludCwgaW50LCBjaGFyICosIGludCwgY2hhciosIGludCwgaW50KTsKLXN0YXRpYyBpbnQJR0RCTUlTZXRGdW5jQnJlYWtwb2ludChpbnQsIGludCwgaW50LCBjaGFyICosIGNoYXIgKiwgY2hhciosIGludCwgaW50KTsKLXN0YXRpYyBpbnQJR0RCTUlEZWxldGVCcmVha3BvaW50KGludCk7Ci1zdGF0aWMgaW50CUdEQk1JRW5hYmxlQnJlYWtwb2ludChpbnQpOwotc3RhdGljIGludAlHREJNSURpc2FibGVCcmVha3BvaW50KGludCk7Ci1zdGF0aWMgaW50CUdEQk1JQ29uZGl0aW9uQnJlYWtwb2ludChpbnQsIGNoYXIgKmV4cHIpOwotc3RhdGljIGludAlHREJNSUJyZWFrcG9pbnRBZnRlcihpbnQsIGludCBpY291bnQpOwotc3RhdGljIGludAlHREJNSVdhdGNocG9pbnQoaW50LCBjaGFyICosIGludCwgaW50LCBjaGFyICosIGludCk7Ci1zdGF0aWMgaW50CUdEQk1JR28odm9pZCk7Ci1zdGF0aWMgaW50CUdEQk1JU3RlcChpbnQsIGludCk7Ci1zdGF0aWMgaW50CUdEQk1JVGVybWluYXRlKHZvaWQpOwotc3RhdGljIGludAlHREJNSUxpc3RTdGFja2ZyYW1lcyhpbnQsIGludCk7Ci1zdGF0aWMgaW50CUdEQk1JU2V0Q3VycmVudFN0YWNrZnJhbWUoaW50KTsKLXN0YXRpYyBpbnQJR0RCTUlFdmFsdWF0ZUV4cHJlc3Npb24oY2hhciAqKTsKLXN0YXRpYyBpbnQJR0RCTUlHZXROYXRpdmVUeXBlKGNoYXIgKik7Ci1zdGF0aWMgaW50CUdEQk1JR2V0TG9jYWxWYXJpYWJsZXModm9pZCk7Ci1zdGF0aWMgaW50CUdEQk1JTGlzdEFyZ3VtZW50cyhpbnQsIGludCk7Ci1zdGF0aWMgaW50CUdEQk1JR2V0SW5mb1RocmVhZCh2b2lkKTsKLXN0YXRpYyBpbnQJR0RCTUlTZXRUaHJlYWRTZWxlY3QoaW50KTsKLXN0YXRpYyBpbnQJR0RCTUlTdGFja0luZm9EZXB0aCh2b2lkKTsKLXN0YXRpYyBpbnQJR0RCTUlEYXRhUmVhZE1lbW9yeShsb25nLCBjaGFyKiwgY2hhciosIGludCwgaW50LCBpbnQsIGNoYXIqKTsKLXN0YXRpYyBpbnQJR0RCTUlEYXRhV3JpdGVNZW1vcnkobG9uZywgY2hhciosIGNoYXIqLCBpbnQsIGNoYXIqKTsKLXN0YXRpYyBpbnQJR0RCTUlHZXRHbG9iYWxWYXJpYWJsZXModm9pZCk7Ci1zdGF0aWMgaW50CUdEQkNMSUxpc3RTaWduYWxzKGNoYXIqKTsKLXN0YXRpYyBpbnQJR0RCQ0xJU2lnbmFsSW5mbyhjaGFyKik7Ci1zdGF0aWMgaW50CUdEQkNMSUhhbmRsZShjaGFyKik7Ci1zdGF0aWMgaW50CUdEQk1JUXVpdCh2b2lkKTsKLXN0YXRpYyBpbnQJR0RCTUlEYXRhRXZhbHVhdGVFeHByZXNzaW9uKGNoYXIqKTsKLXN0YXRpYyBpbnQJR0RCR2V0UGFydGlhbEFJRihjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpOwotc3RhdGljIGludAlHREJNSVZhckRlbGV0ZShjaGFyKik7Ci0KLXN0YXRpYyB2b2lkIFNlbmRDb21tYW5kV2FpdChNSVNlc3Npb24gKiwgTUlDb21tYW5kICopOwotc3RhdGljIGludAlTZXRBbmRDaGVja0JyZWFrKGludCwgaW50LCBpbnQsIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCk7Ci1zdGF0aWMgaW50CUdldFN0YWNrZnJhbWVzKGludCwgaW50LCBpbnQsIExpc3QgKiopOwotc3RhdGljIGludAlHZXRBSUZWYXIoY2hhciAqLCBBSUYgKiosIGNoYXIgKiopOwotCi1zdGF0aWMgQUlGICogR2V0QUlGKE1JVmFyICosIGNoYXIgKiwgaW50KTsKLXN0YXRpYyBBSUYgKiBHZXRQYXJ0aWFsQUlGKE1JVmFyICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBSZW1vdmVBbGxNYXBzKCk7Ci0KLWRiZ19iYWNrZW5kX2Z1bmNzCUdEQk1JQmFja2VuZCA9Ci17Ci0JR0RCTUlJbml0LAotCUdEQk1JUHJvZ3Jlc3MsCi0JR0RCTUlJbnRlcnJ1cHQsCi0JR0RCTUlTdGFydFNlc3Npb24sCi0JR0RCTUlTZXRMaW5lQnJlYWtwb2ludCwKLQlHREJNSVNldEZ1bmNCcmVha3BvaW50LAotCUdEQk1JRGVsZXRlQnJlYWtwb2ludCwKLQlHREJNSUVuYWJsZUJyZWFrcG9pbnQsCi0JR0RCTUlEaXNhYmxlQnJlYWtwb2ludCwKLQlHREJNSUNvbmRpdGlvbkJyZWFrcG9pbnQsCi0JR0RCTUlCcmVha3BvaW50QWZ0ZXIsCi0JR0RCTUlXYXRjaHBvaW50LAotCUdEQk1JR28sCi0JR0RCTUlTdGVwLAotCUdEQk1JVGVybWluYXRlLAotCUdEQk1JTGlzdFN0YWNrZnJhbWVzLAotCUdEQk1JU2V0Q3VycmVudFN0YWNrZnJhbWUsCi0JR0RCTUlFdmFsdWF0ZUV4cHJlc3Npb24sCi0JR0RCTUlHZXROYXRpdmVUeXBlLAotCUdEQk1JR2V0TG9jYWxWYXJpYWJsZXMsCi0JR0RCTUlMaXN0QXJndW1lbnRzLAotCUdEQk1JR2V0R2xvYmFsVmFyaWFibGVzLAotCUdEQk1JR2V0SW5mb1RocmVhZCwKLQlHREJNSVNldFRocmVhZFNlbGVjdCwKLQlHREJNSVN0YWNrSW5mb0RlcHRoLAotCUdEQk1JRGF0YVJlYWRNZW1vcnksCi0JR0RCTUlEYXRhV3JpdGVNZW1vcnksCi0JR0RCQ0xJTGlzdFNpZ25hbHMsCi0JR0RCQ0xJU2lnbmFsSW5mbywKLQlHREJDTElIYW5kbGUsCi0JR0RCTUlEYXRhRXZhbHVhdGVFeHByZXNzaW9uLAotCUdEQkdldFBhcnRpYWxBSUYsCi0JR0RCTUlWYXJEZWxldGUsCi0JR0RCTUlRdWl0Ci19OwotCi0jZGVmaW5lIENIRUNLX1NFU1NJT04oKSBcCi0JaWYgKERlYnVnU2Vzc2lvbiA9PSBOVUxMKSB7IFwKLQkJRGJnU2V0RXJyb3IoREJHRVJSX05PU0VTU0lPTiwgTlVMTCk7IFwKLQkJcmV0dXJuIERCR1JFU19FUlI7IFwKLQl9Ci0KLSNkZWZpbmUgRVJST1JfVE9fRVZFTlQoZSkgXAotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9FUlJPUik7IFwKLQllLT5kYmdfZXZlbnRfdS5lcnJvcl9ldmVudC5lcnJvcl9jb2RlID0gRGJnR2V0RXJyb3IoKTsgXAotCWUtPmRiZ19ldmVudF91LmVycm9yX2V2ZW50LmVycm9yX21zZyA9IHN0cmR1cChEYmdHZXRFcnJvclN0cigpKQotCi1zdGF0aWMgY2hhciAqCi1HZXRMYXN0RXJyb3JTdHIodm9pZCkKLXsKLQlyZXR1cm4gTUlHZXRFcnJvclN0cigpOwotfQotCi1zdGF0aWMgdm9pZAotU2F2ZUV2ZW50KGRiZ19ldmVudCAqZSkKLXsKLQlpZiAoTGFzdEV2ZW50ICE9IE5VTEwpCi0JCUZyZWVEYmdFdmVudChMYXN0RXZlbnQpOwotCi0JTGFzdEV2ZW50ID0gZTsKLX0KLQotLyoqKiogVmFyaWFibGUgKioqKi8KLXN0YXRpYyBNSVZhcioKLUNyZWF0ZU1JVmFyKGNoYXIgKm5hbWUpCi17Ci0JTUlDb21tYW5kICpjbWQ7Ci0JTUlWYXIgKm1pdmFyOwotCi0JY21kID0gTUlWYXJDcmVhdGUoIi0iLCAiKiIsIG5hbWUpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCS8vRGJnU2V0RXJyb3IoREJHRVJSX1VOS05PV05fVkFSSUFCTEUsIEdldExhc3RFcnJvclN0cigpKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWl2YXIgPSBNSUdldFZhckNyZWF0ZUluZm8oY21kKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JcmV0dXJuIG1pdmFyOwotfQotCi1zdGF0aWMgdm9pZAotRGVsZXRlTUlWYXIoY2hhciAqbWlfbmFtZSkKLXsKLQlNSUNvbW1hbmQgKmNtZDsKLQljbWQgPSBNSVZhckRlbGV0ZShtaV9uYW1lKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLX0KLQotc3RhdGljIHZvaWQKLUFkZEJQTWFwKGludCBsb2NhbCwgaW50IHJlbW90ZSwgaW50IHRlbXApCi17Ci0JaW50CQkJCWk7Ci0Jc3RydWN0IGJwZW50cnkgKgltYXA7Ci0KLQlpZiAoQlBNYXAuc2l6ZSA9PSAwKSB7Ci0JCUJQTWFwLm1hcHMgPSAoc3RydWN0IGJwZW50cnkgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGVudHJ5KSAqIDEwMCk7Ci0JCUJQTWFwLnNpemUgPSAxMDA7Ci0KLQkJZm9yIChpID0gMDsgaSA8IEJQTWFwLnNpemU7IGkrKykgewotCQkJbWFwID0gJkJQTWFwLm1hcHNbaV07Ci0JCQltYXAtPnJlbW90ZSA9IG1hcC0+bG9jYWwgPSAtMTsKLQkJCW1hcC0+dGVtcCA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAoQlBNYXAubmVscyA9PSBCUE1hcC5zaXplKSB7Ci0JCWkgPSBCUE1hcC5zaXplOwotCQlCUE1hcC5zaXplICo9IDI7Ci0JCUJQTWFwLm1hcHMgPSAoc3RydWN0IGJwZW50cnkgKilyZWFsbG9jKEJQTWFwLm1hcHMsIHNpemVvZihzdHJ1Y3QgYnBlbnRyeSkgKiBCUE1hcC5zaXplKTsKLQotCQlmb3IgKDsgaSA8IEJQTWFwLnNpemU7IGkrKykgewotCQkJbWFwID0gJkJQTWFwLm1hcHNbaV07Ci0JCQltYXAtPnJlbW90ZSA9IG1hcC0+bG9jYWwgPSAtMTsKLQkJCW1hcC0+dGVtcCA9IDA7Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQlBNYXAuc2l6ZTsgaSsrKSB7Ci0JCW1hcCA9ICZCUE1hcC5tYXBzW2ldOwotCQlpZiAobWFwLT5yZW1vdGUgPT0gLTEpIHsKLQkJCW1hcC0+cmVtb3RlID0gcmVtb3RlOwotCQkJbWFwLT5sb2NhbCA9IGxvY2FsOwotCQkJbWFwLT50ZW1wID0gdGVtcDsKLQkJCUJQTWFwLm5lbHMrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotUmVtb3ZlQlBNYXAoYnBlbnRyeSAqYnApCi17Ci0JaW50CQkJCWk7Ci0Jc3RydWN0IGJwZW50cnkgKgltYXA7Ci0JZm9yIChpID0gMDsgaSA8IEJQTWFwLnNpemU7IGkrKykgewotCQltYXAgPSAmQlBNYXAubWFwc1tpXTsKLQkJaWYgKG1hcCA9PSBicCkgewotCQkJbWFwLT5yZW1vdGUgPSAtMTsKLQkJCW1hcC0+bG9jYWwgPSAtMTsKLQkJCW1hcC0+dGVtcCA9IDA7Ci0JCQlCUE1hcC5uZWxzLS07Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIGJwZW50cnkgKgotRmluZExvY2FsQlAoaW50IGxvY2FsKQotewotCWludAkJCQlpOwotCXN0cnVjdCBicGVudHJ5ICoJbWFwOwotCWZvciAoaSA9IDA7IGkgPCBCUE1hcC5zaXplOyBpKyspIHsKLQkJbWFwID0gJkJQTWFwLm1hcHNbaV07Ci0JCWlmIChtYXAtPmxvY2FsID09IGxvY2FsKSB7Ci0JCQlyZXR1cm4gbWFwOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYnBlbnRyeSAqCi1GaW5kUmVtb3RlQlAoaW50IHJlbW90ZSkKLXsKLQlpbnQJCQkJaTsKLQlzdHJ1Y3QgYnBlbnRyeSAqCW1hcDsKLQlmb3IgKGkgPSAwOyBpIDwgQlBNYXAuc2l6ZTsgaSsrKSB7Ci0JCW1hcCA9ICZCUE1hcC5tYXBzW2ldOwotCQlpZiAobWFwLT5yZW1vdGUgPT0gcmVtb3RlKSB7Ci0JCQlyZXR1cm4gbWFwOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotUmVtb3ZlQWxsQlBNYXAoKQotewotCWludAkJCQlpOwotCXN0cnVjdCBicGVudHJ5ICoJbWFwOwotCWludCBsZW5ndGggPSBCUE1hcC5zaXplOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQltYXAgPSAmQlBNYXAubWFwc1tpXTsKLQkJaWYgKG1hcCA9PSBOVUxMKQotCQkJcmV0dXJuOwotCi0JCW1hcC0+cmVtb3RlID0gLTE7Ci0JCW1hcC0+bG9jYWwgPSAtMTsKLQkJbWFwLT50ZW1wID0gMDsKLQkJQlBNYXAubmVscy0tOwotCX0KLX0KLQotc3RhdGljIHN0YWNrZnJhbWUgKgotZ2V0X2N1cnJlbnRfZnJhbWUoKQotewotCXN0YWNrZnJhbWUgKmY7Ci0JTGlzdCAqCWZyYW1lczsKLQotCWlmIChHZXRTdGFja2ZyYW1lcygxLCAwLCAwLCAmZnJhbWVzKSAhPSBEQkdSRVNfT0spCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKEVtcHR5TGlzdChmcmFtZXMpKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIkNvdWxkIG5vdCBnZXQgY3VycmVudCBzdGFjayBmcmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlTZXRMaXN0KGZyYW1lcyk7Ci0JZiA9IChzdGFja2ZyYW1lICopR2V0TGlzdEVsZW1lbnQoZnJhbWVzKTsKLQlEZXN0cm95TGlzdChmcmFtZXMsIE5VTEwpOwotCXJldHVybiBmOwotfQotCi1zdGF0aWMgc3RhY2tmcmFtZSAqCi1Db252ZXJ0TUlGcmFtZVRvU3RhY2tmcmFtZShNSUZyYW1lICpmKQotewotCXN0YWNrZnJhbWUgKglzOwotCWlmIChmID09IE5VTEwpIHsvL2J5IGRlZmF1bHQgcmV0dXJuIGN1cnJlbnQgZnJhbWUKLQkJcmV0dXJuIGdldF9jdXJyZW50X2ZyYW1lKCk7Ci0JfQotCXMgPSBOZXdTdGFja2ZyYW1lKGYtPmxldmVsKTsKLQlpZiAoIGYtPmFkZHIgIT0gTlVMTCApCi0JCXMtPmxvYy5hZGRyID0gc3RyZHVwKGYtPmFkZHIpOwotCWlmICggZi0+ZnVuYyAhPSBOVUxMICkKLQkJcy0+bG9jLmZ1bmMgPSBzdHJkdXAoZi0+ZnVuYyk7Ci0JaWYgKCBmLT5maWxlICE9IE5VTEwgKQotCQlzLT5sb2MuZmlsZSA9IHN0cmR1cChmLT5maWxlKTsKLQlzLT5sb2MubGluZSA9IGYtPmxpbmU7Ci0JcmV0dXJuIHM7Ci19Ci0KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1BZGRWQVJNYXAoY2hhciAqbmFtZSwgTUlWYXIgKm1pdmFyKQotewotCWludCBpOwotCXN0cnVjdCB2YXJpbmZvICptYXA7Ci0KLQlpZiAoVkFSTWFwLnNpemUgPT0gMCkgewotCQlWQVJNYXAubWFwcyA9IChzdHJ1Y3QgdmFyaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHZhcmluZm8pICogMTAwKTsKLQkJVkFSTWFwLnNpemUgPSAxMDA7Ci0KLQkJZm9yIChpPTA7IGk8VkFSTWFwLnNpemU7IGkrKykgewotCQkJbWFwID0gJlZBUk1hcC5tYXBzW2ldOwotCQkJbWFwLT5uYW1lID0gTlVMTDsKLQkJCW1hcC0+bWl2YXIgPSBOVUxMOwotCQl9Ci0JfQotCWlmIChWQVJNYXAubmVscyA9PSBWQVJNYXAuc2l6ZSkgewotCQlpID0gVkFSTWFwLnNpemU7Ci0JCVZBUk1hcC5zaXplICo9IDI7Ci0JCVZBUk1hcC5tYXBzID0gKHN0cnVjdCB2YXJpbmZvICopcmVhbGxvYyhWQVJNYXAubWFwcywgc2l6ZW9mKHN0cnVjdCB2YXJpbmZvKSAqIFZBUk1hcC5zaXplKTsKLQotCQlmb3IgKDsgaTxWQVJNYXAuc2l6ZTsgaSsrKSB7Ci0JCQltYXAgPSAmVkFSTWFwLm1hcHNbaV07Ci0JCQltYXAtPm5hbWUgPSBOVUxMOwotCQkJbWFwLT5taXZhciA9IE5VTEw7Ci0JCX0KLQl9Ci0JZm9yIChpPTA7IGk8VkFSTWFwLnNpemU7IGkrKykgewotCQltYXAgPSAmVkFSTWFwLm1hcHNbaV07Ci0JCWlmIChtYXAtPm5hbWUgPT0gTlVMTCkgewotCQkJbWFwLT5uYW1lID0gc3RyZHVwKG5hbWUpOwotCQkJbWFwLT5taXZhciA9IG1pdmFyOwotCQkJVkFSTWFwLm5lbHMrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdmFyaW5mbyAqCi1GaW5kVkFSQnlOYW1lKGNoYXIgKm5hbWUpCi17Ci0JaW50CWk7Ci0Jc3RydWN0IHZhcmluZm8gKm1hcDsKLQlmb3IgKGk9MDsgaTxWQVJNYXAuc2l6ZTsgaSsrKSB7Ci0JCW1hcCA9ICZWQVJNYXAubWFwc1tpXTsKLQkJaWYgKG1hcCAhPSBOVUxMICYmIHN0cmNtcChtYXAtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCXJldHVybiBtYXA7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2YXJpbmZvICoKLUZpbmRWQVJCeU1JTmFtZShjaGFyICptaV9uYW1lKQotewotCWludCBpOwotCXN0cnVjdCB2YXJpbmZvICptYXA7Ci0JZm9yIChpPTA7IGk8VkFSTWFwLnNpemU7IGkrKykgewotCQltYXAgPSAmVkFSTWFwLm1hcHNbaV07Ci0JCWlmIChtYXAgIT0gTlVMTCAmJiBzdHJjbXAobWFwLT5taXZhci0+bmFtZSwgbWlfbmFtZSkgPT0gMCkgewotCQkJcmV0dXJuIG1hcDsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLVJlbW92ZVZBUk1hcCh2YXJpbmZvICptYXApCi17Ci0JaWYgKG1hcCAhPSBOVUxMKSB7Ci0JCWlmIChtYXAtPm5hbWUgIT0gTlVMTCkgewotCQkJZnJlZShtYXAtPm5hbWUpOwotCQkJbWFwLT5uYW1lID0gTlVMTDsKLQkJfQotCQlpZiAobWFwLT5taXZhciAhPSBOVUxMKSB7Ci0JCQlEZWxldGVNSVZhcihtYXAtPm1pdmFyLT5uYW1lKTsKLQkJCU1JVmFyRnJlZShtYXAtPm1pdmFyKTsKLQkJCW1hcC0+bWl2YXIgPSBOVUxMOwotCQl9Ci0JCVZBUk1hcC5uZWxzLS07Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotUmVtb3ZlVkFSTWFwQnlOYW1lKGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHZhcmluZm8gKm1hcDsKLQltYXAgPSBGaW5kVkFSQnlOYW1lKG5hbWUpOwotCVJlbW92ZVZBUk1hcChtYXApOwotfQotCi1zdGF0aWMgdm9pZAotUmVtb3ZlVkFSTWFwQnlNSU5hbWUoY2hhciAqbWlfbmFtZSkKLXsKLQlzdHJ1Y3QgdmFyaW5mbyAqbWFwOwotCW1hcCA9IEZpbmRWQVJCeU1JTmFtZShtaV9uYW1lKTsKLQlSZW1vdmVWQVJNYXAobWFwKTsKLX0KLQotc3RhdGljIHZvaWQKLVJlbW92ZUFsbFZBUk1hcCgpCi17Ci0JaW50CQkJCWk7Ci0Jc3RydWN0IHZhcmluZm8gKm1hcDsKLQlpbnQgbGVuZ3RoID0gVkFSTWFwLnNpemU7Ci0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCW1hcCA9ICZWQVJNYXAubWFwc1tpXTsKLQkJaWYgKG1hcCA9PSBOVUxMKQotCQkJcmV0dXJuOwotCi0JCVJlbW92ZVZBUk1hcChtYXApOwotCX0KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotUmVtb3ZlQWxsTWFwcygpCi17Ci0JUmVtb3ZlQWxsQlBNYXAoKTsKLSNpZiAwCi0JUmVtb3ZlQWxsVkFSTWFwKCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLVNldERlYnVnRXJyb3IoTUlDb21tYW5kICogY21kKQotewotCWlmIChNSUNvbW1hbmRSZXN1bHRDbGFzcyhjbWQpID09IE1JUmVzdWx0UmVjb3JkRVJST1IpIHsKLQkJY2hhciAqZXJyID0gTUlDb21tYW5kUmVzdWx0RXJyb3JNZXNzYWdlKGNtZCk7Ci0JCWlmIChlcnIgIT0gTlVMTCkgewotCQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCBlcnIpOwotCQkJZnJlZShlcnIpOwotCQl9IGVsc2UgewotCQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAiZ290IGVycm9yIGZyb20gZ2RiLCBidXQgbm8gbWVzc2FnZSIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAiYmFkIHJlc3BvbnNlIGZyb20gZ2RiIik7Ci0JfQotfQotc3RhdGljIExpc3QgKgotR2V0Q2hhbmdlZFZhcmlhYmxlcygpCi17Ci0JTUlDb21tYW5kICpjbWQ7Ci0JTGlzdCAqY2hhbmdlczsKLQlMaXN0ICpjaGFuZ2VkVmFyczsKLQlNSVZhckNoYW5nZSAqdmFyOwotCi0JY21kID0gTUlWYXJVcGRhdGUoIioiKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQkFDS0VORCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0gR2V0Q2hhbmdlZFZhcmlhYmxlcyBlcnJvclxuIik7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JTUlHZXRWYXJVcGRhdGVJbmZvKGNtZCwgJmNoYW5nZXMpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCWNoYW5nZWRWYXJzID0gTmV3TGlzdCgpOwotCWZvciAoU2V0TGlzdChjaGFuZ2VzKTsgKHZhciA9IChNSVZhckNoYW5nZSAqKUdldExpc3RFbGVtZW50KGNoYW5nZXMpKSAhPSBOVUxMOykgewotCQlpZiAodmFyLT5pbl9zY29wZSA9PSAxKSB7Ci0JCQlBZGRUb0xpc3QoY2hhbmdlZFZhcnMsICh2b2lkICopc3RyZHVwKHZhci0+bmFtZSkpOwotCQl9Ci0JCWVsc2UgewotCQkJRGVsZXRlTUlWYXIodmFyLT5uYW1lKTsKLQkJfQotCX0KLQlEZXN0cm95TGlzdChjaGFuZ2VzLCBNSVZhckNoYW5nZUZyZWUpOwotCXJldHVybiBjaGFuZ2VkVmFyczsKLX0KLQotc3RhdGljIGludAotZ2V0X2luZm9fZGVwdGgoKQotewotCU1JQ29tbWFuZCAqY21kOwotCWludCBkZXB0aDsKLQotCWNtZCA9IE1JU3RhY2tJbmZvRGVwdGgoKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQkFDS0VORCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0gR0RCTUlTdGFja0luZm9EZXB0aCBlcnJvclxuIik7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWRlcHRoID0gTUlHZXRTdGFja0luZm9EZXB0aChjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQlyZXR1cm4gZGVwdGg7Ci19Ci0vKioKLSAqIG5vdCB1c2VkCi0gKgotc3RhdGljIHZvaWQKLXNldF9mcmFtZV93aXRoX2xpbmUoc3RhY2tmcmFtZSAqY3VycmVudF9mLCBpbnQgZGVwdGgpCi17Ci0Jc3RhY2tmcmFtZSAqZjsKLQlMaXN0ICogZnJhbWVzOwotCi0JaWYgKEdldFN0YWNrZnJhbWVzKDAsIDEsIGRlcHRoLCAmZnJhbWVzKSAhPSBEQkdSRVNfT0spIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZm9yIChTZXRMaXN0KGZyYW1lcyk7IChmID0gKHN0YWNrZnJhbWUgKilHZXRMaXN0RWxlbWVudChmcmFtZXMpKSAhPSBOVUxMOykgewotCQlpZiAoZi0+bG9jLmxpbmUgPiAwKSB7Ci0JCQljdXJyZW50X2YtPmxldmVsID0gZi0+bGV2ZWw7Ci0JCQljdXJyZW50X2YtPmxvYy5maWxlID0gc3RyZHVwKGYtPmxvYy5maWxlKTsKLQkJCWN1cnJlbnRfZi0+bG9jLmZ1bmMgPSBzdHJkdXAoZi0+bG9jLmZ1bmMpOwotCQkJY3VycmVudF9mLT5sb2MuYWRkciA9IHN0cmR1cChmLT5sb2MuYWRkcik7Ci0JCQljdXJyZW50X2YtPmxvYy5saW5lID0gZi0+bG9jLmxpbmU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlEZXN0cm95TGlzdChmcmFtZXMsIEZyZWVTdGFja2ZyYW1lKTsKLX0KLSovCi0KLS8qKioqIGF5c24gc3RvcCAqKioqLwotc3RhdGljIGludAotQXN5bmNTdG9wKHZvaWQgKmRhdGEpCi17Ci0JZGJnX2V2ZW50ICoJZTsKLQlzdGFja2ZyYW1lICoJZnJhbWU7Ci0JYnBlbnRyeSAqIGJwbWFwOwotCU1JRXZlbnQgKglldnQgPSAoTUlFdmVudCAqKWRhdGE7Ci0KLQlzd2l0Y2ggKGV2dC0+dHlwZSkKLQl7Ci0JY2FzZSBNSUV2ZW50VHlwZUJyZWFrcG9pbnRIaXQ6Ci0JCWJwbWFwID0gRmluZExvY2FsQlAoZXZ0LT5ia3B0bm8pOwotCQlpZiAoIWJwbWFwLT50ZW1wKSB7Ci0JCQllID0gTmV3RGJnRXZlbnQoREJHRVZfU1VTUEVORCk7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnJlYXNvbiA9IERCR0VWX1NVU1BFTkRfQlBISVQ7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmV2X3UuYnBpZCA9IGJwbWFwLT5yZW1vdGU7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCA9IGV2dC0+dGhyZWFkSWQ7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lID0gTlVMTDsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZGVwdGggPSBnZXRfaW5mb19kZXB0aCgpOwotCQkJZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5jaGFuZ2VkX3ZhcnMgPSBHZXRDaGFuZ2VkVmFyaWFibGVzKCk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBlbHNlIG11c3QgYmUgYSB0ZW1wb3JhcnkgYnJlYWtwb2ludCBkcm9wIHRocm91Z2guLi4gKi8KLQkJUmVtb3ZlQlBNYXAoYnBtYXApOwotCi0JY2FzZSBNSUV2ZW50VHlwZVN1c3BlbmRlZDoKLQkJZnJhbWUgPSBDb252ZXJ0TUlGcmFtZVRvU3RhY2tmcmFtZShldnQtPmZyYW1lKTsKLQkJaWYgKGZyYW1lID09IE5VTEwpIHsKLQkJCUVSUk9SX1RPX0VWRU5UKGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZSA9IE5ld0RiZ0V2ZW50KERCR0VWX1NVU1BFTkQpOwotCQkJZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24gPSBEQkdFVl9TVVNQRU5EX0lOVDsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQudGhyZWFkX2lkID0gZXZ0LT50aHJlYWRJZDsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZnJhbWUgPSBmcmFtZTsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZGVwdGggPSBnZXRfaW5mb19kZXB0aCgpOwotCQkJZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5jaGFuZ2VkX3ZhcnMgPSBHZXRDaGFuZ2VkVmFyaWFibGVzKCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE1JRXZlbnRUeXBlRnVuY3Rpb25GaW5pc2hlZDoKLQljYXNlIE1JRXZlbnRUeXBlU3RlcHBpbmdSYW5nZToKLQkJZnJhbWUgPSBDb252ZXJ0TUlGcmFtZVRvU3RhY2tmcmFtZShldnQtPmZyYW1lKTsKLQkJaWYgKGZyYW1lID09IE5VTEwpIHsKLQkJCUVSUk9SX1RPX0VWRU5UKGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZSA9IE5ld0RiZ0V2ZW50KERCR0VWX1NVU1BFTkQpOwotCQkJZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24gPSBEQkdFVl9TVVNQRU5EX1NURVA7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCA9IGV2dC0+dGhyZWFkSWQ7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lID0gZnJhbWU7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmRlcHRoID0gZ2V0X2luZm9fZGVwdGgoKTsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzID0gR2V0Q2hhbmdlZFZhcmlhYmxlcygpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBNSUV2ZW50VHlwZVNpZ25hbDoKLQkJZnJhbWUgPSBDb252ZXJ0TUlGcmFtZVRvU3RhY2tmcmFtZShldnQtPmZyYW1lKTsKLQkJaWYgKGZyYW1lID09IE5VTEwpIHsKLQkJCUVSUk9SX1RPX0VWRU5UKGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZSA9IE5ld0RiZ0V2ZW50KERCR0VWX1NVU1BFTkQpOwotCQkJZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24gPSBEQkdFVl9TVVNQRU5EX1NJR05BTDsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZXZfdS5zaWcgPSBOZXdTaWduYWxJbmZvKCk7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmV2X3Uuc2lnLT5uYW1lID0gc3RyZHVwKGV2dC0+c2lnTmFtZSk7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmV2X3Uuc2lnLT5kZXNjID0gc3RyZHVwKGV2dC0+c2lnTWVhbmluZyk7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCA9IGV2dC0+dGhyZWFkSWQ7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lID0gZnJhbWU7Ci0JCQllLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmRlcHRoID0gZ2V0X2luZm9fZGVwdGgoKTsKLQkJCWUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzID0gR2V0Q2hhbmdlZFZhcmlhYmxlcygpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBNSUV2ZW50VHlwZUluZmVyaW9yU2lnbmFsRXhpdDoKLQkJZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0VYSVQpOwotCQllLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LnJlYXNvbiA9IERCR0VWX0VYSVRfU0lHTkFMOwotCQllLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LmV2X3Uuc2lnID0gTmV3U2lnbmFsSW5mbygpOwotCQllLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LmV2X3Uuc2lnLT5uYW1lID0gc3RyZHVwKGV2dC0+c2lnTmFtZSk7Ci0JCWUtPmRiZ19ldmVudF91LmV4aXRfZXZlbnQuZXZfdS5zaWctPmRlc2MgPSBzdHJkdXAoZXZ0LT5zaWdNZWFuaW5nKTsKLQkJLy9SZW1vdmVBbGxNYXBzKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNSUV2ZW50VHlwZUluZmVyaW9yRXhpdDoKLQkJZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0VYSVQpOwotCQllLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LnJlYXNvbiA9IERCR0VWX0VYSVRfTk9STUFMOwotCQllLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LmV2X3UuZXhpdF9zdGF0dXMgPSBldnQtPmNvZGU7Ci0JCS8vUmVtb3ZlQWxsTWFwcygpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIlVua25vd24gcmVhc29uIGZvciBzdG9wcGluZyIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JTUlFdmVudEZyZWUoZXZ0KTsKLQotCWlmIChFdmVudENhbGxiYWNrICE9IE5VTEwpCi0JCUV2ZW50Q2FsbGJhY2soZSk7Ci0KLQlGcmVlRGJnRXZlbnQoZSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIEFzeW5jQ2FsbGJhY2sgaXMgY2FsbGVkIGJ5IG1pX2dldF9yZXNwb25zZSgpIHdoZW4gYW4gYXN5bmMgcmVzcG9uc2UgaXMKLSoqIGRldGVjdGVkLiBJdCBjYW4ndCBpc3N1ZSBhbnkgZ2RiIGNvbW1hbmRzIG9yIHRoZXJlJ3MgYSBwb3RlbnRpYWwKLSoqIGZvciBkZWFkbG9jay4gSWYgY29tbWFuZHMgbmVlZCB0byBiZSBpc3N1ZXMgKGUuZy4gdG8gb2J0YWluCi0qKiBjdXJyZW50IHN0YWNrIGZyYW1lLCB0aGV5IG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gc2VsZWN0Ci0qKiBsb29wIHVzaW5nIHRoZSBBc3luY0Z1bmMoKSBtZWNoYW5pc20uCi0qLwotc3RhdGljIHZvaWQKLUFzeW5jQ2FsbGJhY2soTUlFdmVudCAqZXZ0KQotewotCUFzeW5jRnVuYyA9IEFzeW5jU3RvcDsKLQlBc3luY0Z1bmNEYXRhID0gKHZvaWQgKilldnQ7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIEdEQgotICovCi1zdGF0aWMgaW50Ci1HREJNSUluaXQodm9pZCAoKmV2ZW50X2NhbGxiYWNrKShkYmdfZXZlbnQgKikpCi17Ci0JRXZlbnRDYWxsYmFjayA9IGV2ZW50X2NhbGxiYWNrOwotCURlYnVnU2Vzc2lvbiA9IE5VTEw7Ci0JTGFzdEV2ZW50ID0gTlVMTDsKLQlHREJfVmVyc2lvbiA9IC0xLjA7Ci0JU2VydmVyRXhpdCA9IDA7Ci0KLQlzaWduYWwoU0lHVEVSTSwgU0lHX0lHTik7Ci0Jc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0Jc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0jaWYgMAotc3RhdGljIGludAotdGltZW91dF9jYih2b2lkICpkYXRhKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qCi0gKiBTZW5kIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGltbWVkaWF0ZSByZXNwb25zZS4KLSAqLwotc3RhdGljIHZvaWQKLVNlbmRDb21tYW5kV2FpdChNSVNlc3Npb24gKnNlc3MsIE1JQ29tbWFuZCAqY21kKQotewotCU1JU2Vzc2lvblNlbmRDb21tYW5kKHNlc3MsIGNtZCk7Ci0JTUlPdXRwdXQgKm91dHB1dCA9IE1JT3V0cHV0TmV3KCk7Ci0JZG8gewotCQlNSVNlc3Npb25Qcm9ncmVzcyhzZXNzLCBvdXRwdXQpOwotCQlpZiAoc2Vzcy0+b3V0X2ZkID09IC0xKSB7Ci0JCQlERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQkFDS0VORCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0gU2VuZENvbW1hbmRXYWl0IHNlc3MtPm91dF9mZCA9IC0xXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoIU1JU2Vzc2lvbkNvbW1hbmRDb21wbGV0ZWQoc2VzcykpOwotfQotCi0vKgotICogU3RhcnQgR0RCIHNlc3Npb24KLSAqLwotc3RhdGljIGludAotR0RCTUlTdGFydFNlc3Npb24oY2hhciAqZ2RiX3BhdGgsIGNoYXIgKnByb2csIGNoYXIgKnBhdGgsIGNoYXIgKndvcmtfZGlyLCBjaGFyICoqYXJncywgY2hhciAqKmVudiwgbG9uZyB0aW1lb3V0KQotewotCWNoYXIgKgkJcHJvZ19wYXRoOwotCWNoYXIgKioJCWU7Ci0Jc3RydWN0IHN0YXQJc3Q7Ci0JTUlDb21tYW5kICoJY21kOwotCU1JU2Vzc2lvbiAqCXNlc3M7Ci0KLQlpZiAoRGVidWdTZXNzaW9uICE9IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1NFU1NJT04sIE5VTEwpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQkvKgotCSAqIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgZ2RiIGV4ZWN1dGFibGUKLQkgKi8KLQlpZiAoKmdkYl9wYXRoID09ICcvJykgewotCSAJaWYgKHN0YXQoZ2RiX3BhdGgsICZzdCkgPCAwIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpKSB7Ci0JIAkJRGJnU2V0RXJyb3IoREJHRVJSX05PQkFDS0VORCwgZ2RiX3BhdGgpOwotCSAJCXJldHVybiBEQkdSRVNfRVJSOwotCSAJfQotCX0KLQotCWlmICgqd29ya19kaXIgIT0gJ1wwJyAmJiBjaGRpcih3b3JrX2RpcikgPCAwKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9DSERJUiwgd29ya19kaXIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlpZiAocGF0aCAhPSBOVUxMKQotCQlhc3ByaW50ZigmcHJvZ19wYXRoLCAiJXMvJXMiLCBwYXRoLCBwcm9nKTsKLQllbHNlCi0JCXByb2dfcGF0aCA9IHN0cmR1cChwcm9nKTsKLQotCWlmIChhY2Nlc3MocHJvZ19wYXRoLCBSX09LKSA8IDApIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX05PRklMRURJUiwgcHJvZ19wYXRoKTsKLQkJZnJlZShwcm9nX3BhdGgpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlzZXNzID0gTUlTZXNzaW9uTmV3KCk7Ci0KLSNpZmRlZiBERUJVRwotCU1JU2Vzc2lvblNldERlYnVnKFRFU1RfREVCVUdfTEVWRUwoREVCVUdfTEVWRUxfQkFDS0VORCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLQlNSVNlc3Npb25TZXRUaW1lb3V0KHNlc3MsIDAsIHRpbWVvdXQpOwotCi0JTUlTZXNzaW9uU2V0R0RCUGF0aChzZXNzLCBnZGJfcGF0aCk7Ci0KLQlpZiAoTUlTZXNzaW9uU3RhcnRMb2NhbChzZXNzLCBwcm9nX3BhdGgpIDwgMCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsIEdldExhc3RFcnJvclN0cigpKTsKLQkJTUlTZXNzaW9uRnJlZShzZXNzKTsKLQkJZnJlZShwcm9nX3BhdGgpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlmcmVlKHByb2dfcGF0aCk7Ci0KLQlpZiAoKmFyZ3MgIT0gTlVMTCkgewotCQljbWQgPSBNSUV4ZWNBcmd1bWVudHMoYXJncyk7Ci0JCVNlbmRDb21tYW5kV2FpdChzZXNzLCBjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JfQotCi0JZm9yIChlID0gZW52OyBlICE9IE5VTEwgJiYgKmUgIT0gTlVMTDsgZSsrKSB7Ci0JCWNtZCA9IE1JR0RCU2V0KCJlbnZpcm9ubWVudCIsICplKTsKLQkJU2VuZENvbW1hbmRXYWl0KHNlc3MsIGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQl9Ci0KLQljbWQgPSBNSUdEQlNldCgiY29uZmlybSIsICJvZmYiKTsKLQlTZW5kQ29tbWFuZFdhaXQoc2VzcywgY21kKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQlNSVNlc3Npb25SZWdpc3RlckV2ZW50Q2FsbGJhY2soc2VzcywgQXN5bmNDYWxsYmFjayk7Ci0KLQlEZWJ1Z1Nlc3Npb24gPSBzZXNzOwotCi0JY21kID0gTUlHREJWZXJzaW9uKCk7Ci0JU2VuZENvbW1hbmRXYWl0KHNlc3MsIGNtZCk7Ci0JaWYgKE1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJR0RCX1ZlcnNpb24gPSBDTElHZXRHREJWZXJzaW9uKGNtZCk7Ci0JCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9CQUNLRU5ELCAiLS0tLS0tLS0tLS0tLS0tLS0tLSBnZGIgdmVyc2lvbjogJWZcbiIsIEdEQl9WZXJzaW9uKTsKLQl9Ci0JTUlDb21tYW5kRnJlZShjbWQpOwotCi0JU3RhcnRlZCA9IDA7Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotICogUHJvZ3Jlc3MgZ2RiIGNvbW1hbmRzLgotICovCi1zdGF0aWMgaW50Ci1HREJNSVByb2dyZXNzKHZvaWQpCi17Ci0JZGJnX2V2ZW50ICoJZTsKLQotCS8qCi0JICogQ2hlY2sgZm9yIGV4aXN0aW5nIGV2ZW50cwotCSAqLwotCWlmIChMYXN0RXZlbnQgIT0gTlVMTCkgewotCQlpZiAoRXZlbnRDYWxsYmFjayAhPSBOVUxMKSB7Ci0JCQlFdmVudENhbGxiYWNrKExhc3RFdmVudCk7Ci0JCX0KLQotCQlpZiAoU2VydmVyRXhpdCAmJiBMYXN0RXZlbnQtPmV2ZW50X2lkID09IERCR0VWX09LKSB7Ci0JCQlpZiAoRGVidWdTZXNzaW9uICE9IE5VTEwpIHsKLQkJCQlNSVNlc3Npb25GcmVlKERlYnVnU2Vzc2lvbik7Ci0JCQkJRGVidWdTZXNzaW9uID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JCUZyZWVEYmdFdmVudChMYXN0RXZlbnQpOwotCQlMYXN0RXZlbnQgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoRGVidWdTZXNzaW9uICE9IE5VTEwpIHsKLQkJaWYgKE1JU2Vzc2lvblByb2dyZXNzKERlYnVnU2Vzc2lvbiwgTUlPdXRwdXROZXcoKSkgPCAwKSB7Ci0JCQlNSVNlc3Npb25GcmVlKERlYnVnU2Vzc2lvbik7Ci0JCQlEZWJ1Z1Nlc3Npb24gPSBOVUxMOwotCQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCBHZXRMYXN0RXJyb3JTdHIoKSk7Ci0JCQlFUlJPUl9UT19FVkVOVChlKTsKLQkJCVNhdmVFdmVudChlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLyoKLQkJICogRG8gYW55IGV4dHJhIGFzeW5jIGZ1bmN0aW9ucy4gV2UgY2FuIGNhbGwgZ2RibWkgc2FmZWx5IGhlcmUKLQkJICovCi0JCWlmIChBc3luY0Z1bmMgIT0gTlVMTCkgewotCQkJQXN5bmNGdW5jKEFzeW5jRnVuY0RhdGEpOwotCQkJQXN5bmNGdW5jID0gTlVMTDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0qKiBTZXQgYnJlYWtwb2ludCBhdCBzcGVjaWZpZWQgbGluZS4KLSovCi1zdGF0aWMgaW50Ci1HREJNSVNldExpbmVCcmVha3BvaW50KGludCBicGlkLCBpbnQgaXNUZW1wLCBpbnQgaXNIYXJkLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqY29uZGl0aW9uLCBpbnQgaWdub3JlQ291bnQsIGludCB0aWQpCi17Ci0JaW50CQlyZXM7Ci0JY2hhciAqCXdoZXJlOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JaWYgKGZpbGUgPT0gTlVMTCB8fCAqZmlsZSA9PSAnXDAnKQotCQlhc3ByaW50Zigmd2hlcmUsICIlZCIsIGxpbmUpOwotCWVsc2UKLQkJYXNwcmludGYoJndoZXJlLCAiJXM6JWQiLCBmaWxlLCBsaW5lKTsKLQotCXJlcyA9IFNldEFuZENoZWNrQnJlYWsoYnBpZCwgaXNUZW1wLCBpc0hhcmQsIHdoZXJlLCBjb25kaXRpb24sIGlnbm9yZUNvdW50LCB0aWQpOwotCi0JZnJlZSh3aGVyZSk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotKiogU2V0IGJyZWFrcG9pbnQgYXQgc3RhcnQgb2Ygc3BlY2lmaWVkIGZ1bmN0aW9uLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JU2V0RnVuY0JyZWFrcG9pbnQoaW50IGJwaWQsIGludCBpc1RlbXAsIGludCBpc0hhcmQsIGNoYXIgKmZpbGUsIGNoYXIgKmZ1bmMsIGNoYXIgKmNvbmRpdGlvbiwgaW50IGlnbm9yZUNvdW50LCBpbnQgdGlkKQotewotCWludAkJcmVzOwotCWNoYXIgKgl3aGVyZTsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWlmIChmaWxlID09IE5VTEwgfHwgKmZpbGUgPT0gJ1wwJykKLQkJYXNwcmludGYoJndoZXJlLCAiJXMiLCBmdW5jKTsKLQllbHNlCi0JCWFzcHJpbnRmKCZ3aGVyZSwgIiVzOiVzIiwgZmlsZSwgZnVuYyk7Ci0KLQlyZXMgPSBTZXRBbmRDaGVja0JyZWFrKGJwaWQsIGlzVGVtcCwgaXNIYXJkLCB3aGVyZSwgY29uZGl0aW9uLCBpZ25vcmVDb3VudCwgdGlkKTsKLQotCWZyZWUod2hlcmUpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLSoqIENoZWNrIHRoYXQgYnJlYWtwb2ludCBjb21tYW5kIGhhcyBzdWNjZWRlZCBhbmQKLSoqIGV4dHJhY3QgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIFJldHVybnMgYnJlYWtwb2ludAotKiogaWQgaW4gYmlkLiBBZGRzIHRvIGJyZWFrcG9pbnQgbGlzdCBpZiBuZWNlc3NhcnkuCi0qLwotc3RhdGljIGludAotU2V0QW5kQ2hlY2tCcmVhayhpbnQgYnBpZCwgaW50IGlzVGVtcCwgaW50IGlzSGFyZCwgY2hhciAqd2hlcmUsIGNoYXIgKmNvbmRpdGlvbiwgaW50IGlnbm9yZUNvdW50LCBpbnQgdGlkKQotewotCWRiZ19ldmVudCAqCQllOwotCU1JQnJlYWtwb2ludCAqCWJwdDsKLQlNSUNvbW1hbmQgKgkJY21kOwotCUxpc3QgKgkJCWJwdHM7Ci0JYnJlYWtwb2ludCAqCWJwOwotCi0JaWYgKGNvbmRpdGlvbiAhPSBOVUxMICYmIHN0cmxlbihjb25kaXRpb24pID09IDApCi0JCWNvbmRpdGlvbiA9IE5VTEw7Ci0KLQljbWQgPSBNSUJyZWFrSW5zZXJ0KGlzVGVtcCwgaXNIYXJkLCBjb25kaXRpb24sIGlnbm9yZUNvdW50LCB3aGVyZSwgdGlkKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCi0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9OT0ZJTEUsIEdldExhc3RFcnJvclN0cigpKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JYnB0cyA9IE1JQnJlYWtwb2ludEdldEJyZWFrSW5zZXJ0SW5mbyhjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCWlmIChicHRzID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX05PRklMRSwgd2hlcmUpOwotCQkvL0RiZ1NldEVycm9yKERCR0VSUl9OT0ZJTEUsICJlcnJvciBnZXR0aW5nIGJyZWFrcG9pbnQgaW5mb3JtYXRpb24iKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JU2V0TGlzdChicHRzKTsKLQlicHQgPSAoTUlCcmVha3BvaW50ICopR2V0TGlzdEVsZW1lbnQoYnB0cyk7Ci0KLQlBZGRCUE1hcChicHQtPm51bWJlciwgYnBpZCwgaXNUZW1wKTsKLQotCS8vaWYgdGhlIHR5cGUgaXMgdGVtcG9yYXJ5LCBubyBuZWVkIHRvIHNlbmQgYnB0IHNldCBldmVudAotCWlmIChpc1RlbXApIHsKLQkJU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JCURlc3Ryb3lMaXN0KGJwdHMsIE1JQnJlYWtwb2ludEZyZWUpOwotCQlyZXR1cm4gREJHUkVTX09LOwotCX0KLQotCWJwID0gTmV3QnJlYWtwb2ludChicHQtPm51bWJlcik7Ci0KLQlicC0+aWdub3JlID0gYnB0LT5pZ25vcmU7Ci0JYnAtPnR5cGUgPSBzdHJkdXAoYnB0LT50eXBlKTsKLQlicC0+aGl0cyA9IGJwdC0+dGltZXM7Ci0KLQlpZiAoIGJwdC0+ZmlsZSAhPSBOVUxMICkKLQkJYnAtPmxvYy5maWxlID0gc3RyZHVwKGJwdC0+ZmlsZSk7Ci0JaWYgKCBicHQtPmZ1bmMgIT0gTlVMTCApCi0JCWJwLT5sb2MuZnVuYyA9IHN0cmR1cChicHQtPmZ1bmMpOwotCWlmICggYnB0LT5hZGRyZXNzICE9IE5VTEwgKQotCQlicC0+bG9jLmFkZHIgPSBzdHJkdXAoYnB0LT5hZGRyZXNzKTsKLQlicC0+bG9jLmxpbmUgPSBicHQtPmxpbmU7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfQlBTRVQpOwotCWUtPmRiZ19ldmVudF91LmJwc2V0X2V2ZW50LmJwaWQgPSBicGlkOwotCWUtPmRiZ19ldmVudF91LmJwc2V0X2V2ZW50LmJwID0gYnA7Ci0JU2F2ZUV2ZW50KGUpOwotCi0JRGVzdHJveUxpc3QoYnB0cywgTUlCcmVha3BvaW50RnJlZSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIERlbGV0ZSBhIGJyZWFrcG9pbnQuCi0qLwotc3RhdGljIGludAotR0RCTUlEZWxldGVCcmVha3BvaW50KGludCBicGlkKQotewotCWJwZW50cnkgKglicDsKLQljaGFyICoJCWJwc3RyOwotCU1JQ29tbWFuZCAqCWNtZDsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWlmICgoYnAgPSBGaW5kUmVtb3RlQlAoYnBpZCkpID09IE5VTEwpIHsKLQkJYXNwcmludGYoJmJwc3RyLCAiJWQiLCBicGlkKTsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX05PQlAsIGJwc3RyKTsKLQkJZnJlZShicHN0cik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCWNtZCA9IE1JQnJlYWtEZWxldGUoMSwgJmJwLT5sb2NhbCk7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JUmVtb3ZlQlBNYXAoYnApOwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIEVuYWJsZSBhIGJyZWFrcG9pbnQuCi0qLwotc3RhdGljIGludAotR0RCTUlFbmFibGVCcmVha3BvaW50KGludCBicGlkKQotewotCWJwZW50cnkgKglicDsKLQljaGFyICoJCWJwc3RyOwotCU1JQ29tbWFuZCAqCWNtZDsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWlmICgoYnAgPSBGaW5kUmVtb3RlQlAoYnBpZCkpID09IE5VTEwpIHsKLQkJYXNwcmludGYoJmJwc3RyLCAiJWQiLCBicGlkKTsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX05PQlAsIGJwc3RyKTsKLQkJZnJlZShicHN0cik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCWNtZCA9IE1JQnJlYWtFbmFibGUoMSwgJmJwLT5sb2NhbCk7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBEaXNhYmxlIGEgYnJlYWtwb2ludC4KLSovCi1zdGF0aWMgaW50Ci1HREJNSURpc2FibGVCcmVha3BvaW50KGludCBicGlkKQotewotCWJwZW50cnkgKglicDsKLQljaGFyICoJCWJwc3RyOwotCU1JQ29tbWFuZCAqCWNtZDsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWlmICgoYnAgPSBGaW5kUmVtb3RlQlAoYnBpZCkpID09IE5VTEwpIHsKLQkJYXNwcmludGYoJmJwc3RyLCAiJWQiLCBicGlkKTsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX05PQlAsIGJwc3RyKTsKLQkJZnJlZShicHN0cik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCWNtZCA9IE1JQnJlYWtEaXNhYmxlKDEsICZicC0+bG9jYWwpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0KLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJU2V0RGVidWdFcnJvcihjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogQ29uZGl0aW9uIGEgYnJlYWtwb2ludC4KLSovCi1zdGF0aWMgaW50Ci1HREJNSUNvbmRpdGlvbkJyZWFrcG9pbnQoaW50IGJwaWQsIGNoYXIgKmV4cHIpCi17Ci0JYnBlbnRyeSAqCWJwOwotCWNoYXIgKgkJYnBzdHI7Ci0JTUlDb21tYW5kICoJY21kOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JaWYgKChicCA9IEZpbmRSZW1vdGVCUChicGlkKSkgPT0gTlVMTCkgewotCQlhc3ByaW50ZigmYnBzdHIsICIlZCIsIGJwaWQpOwotCQlEYmdTZXRFcnJvcihEQkdFUlJfTk9CUCwgYnBzdHIpOwotCQlmcmVlKGJwc3RyKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JY21kID0gTUlCcmVha0NvbmRpdGlvbigxLCAmYnAtPmxvY2FsLCBleHByKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCi0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIGJyZWFrcG9pbnQgYWZ0ZXIuCi0qLwotc3RhdGljIGludAotR0RCTUlCcmVha3BvaW50QWZ0ZXIoaW50IGJwaWQsIGludCBpY291bnQpCi17Ci0JYnBlbnRyeSAqCWJwOwotCWNoYXIgKgkJYnBzdHI7Ci0JTUlDb21tYW5kICoJY21kOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JaWYgKChicCA9IEZpbmRSZW1vdGVCUChicGlkKSkgPT0gTlVMTCkgewotCQlhc3ByaW50ZigmYnBzdHIsICIlZCIsIGJwaWQpOwotCQlEYmdTZXRFcnJvcihEQkdFUlJfTk9CUCwgYnBzdHIpOwotCQlmcmVlKGJwc3RyKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JY21kID0gTUlCcmVha0FmdGVyKDEsICZicC0+bG9jYWwsIGljb3VudCk7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0gKiBTZXQgd2F0Y2ggcG9pbnQKLSAqLwotc3RhdGljIGludAotR0RCTUlXYXRjaHBvaW50KGludCBicGlkLCBjaGFyICpleHByLCBpbnQgaXNBY2Nlc3MsIGludCBpc1JlYWQsIGNoYXIgKmNvbmRpdGlvbiwgaW50IGlnbm9yZUNvdW50KQotewotCWRiZ19ldmVudCAqCQllOwotCU1JQnJlYWtwb2ludCAqCWJwdDsKLQlNSUNvbW1hbmQgKgkJY21kOwotCUxpc3QgKgkJCWJwdHM7Ci0JYnJlYWtwb2ludCAqCWJwOwotCi0JaWYgKGNvbmRpdGlvbiAhPSBOVUxMICYmIHN0cmxlbihjb25kaXRpb24pID09IDApCi0JCWNvbmRpdGlvbiA9IE5VTEw7Ci0KLQljbWQgPSBNSUJyZWFrV2F0Y2goZXhwciwgaXNBY2Nlc3MsIGlzUmVhZCk7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JYnB0cyA9IE1JQnJlYWtwb2ludEdldEJyZWFrSW5zZXJ0SW5mbyhjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCWlmIChicHRzID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAiZXJyb3IgZ2V0dGluZyBicmVha3BvaW50IGluZm9ybWF0aW9uIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCVNldExpc3QoYnB0cyk7Ci0JYnB0ID0gKE1JQnJlYWtwb2ludCAqKUdldExpc3RFbGVtZW50KGJwdHMpOwotCi0JQWRkQlBNYXAoYnB0LT5udW1iZXIsIGJwaWQsIDApOyAvLzAgaXMgbm90IHRlbXA/PwotCi0JYnAgPSBOZXdCcmVha3BvaW50KGJwdC0+bnVtYmVyKTsKLQotCWJwLT5pZ25vcmUgPSBicHQtPmlnbm9yZTsKLQlicC0+dHlwZSA9IHN0cmR1cChicHQtPnR5cGUpOwotCWJwLT5oaXRzID0gYnB0LT50aW1lczsKLQotCWlmIChjb25kaXRpb24gIT0gTlVMTCkgewotCQlHREJNSUNvbmRpdGlvbkJyZWFrcG9pbnQoYnBpZCwgY29uZGl0aW9uKTsKLQl9Ci0JaWYgKGlnbm9yZUNvdW50ID4gMCkgewotCQlHREJNSUJyZWFrcG9pbnRBZnRlcihicGlkLCBpZ25vcmVDb3VudCk7Ci0JfQotCi0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0JQU0VUKTsKLQllLT5kYmdfZXZlbnRfdS5icHNldF9ldmVudC5icGlkID0gYnBpZDsKLQllLT5kYmdfZXZlbnRfdS5icHNldF9ldmVudC5icCA9IGJwOwotCVNhdmVFdmVudChlKTsKLQotCURlc3Ryb3lMaXN0KGJwdHMsIE1JQnJlYWtwb2ludEZyZWUpOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIFN0YXJ0L2NvbnRpbnVlIGV4ZWN1dGluZyBwcm9ncmFtLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JR28odm9pZCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQlpZiAoU3RhcnRlZCkKLQkJY21kID0gTUlFeGVjQ29udGludWUoKTsKLQllbHNlIHsKLQkJY21kID0gTUlFeGVjUnVuKCk7Ci0JCVN0YXJ0ZWQgPSAxOwotCX0KLQotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0gKiBFeGVjdXRlIGNvdW50IHN0YXRlbWVudHMuCi0gKgotICogdHlwZQlzdGVwIGtpbmQKLSAqIDAJCWVudGVyIGZ1bmN0aW9uIGNhbGxzCi0gKiAxCQlkbyBub3QgZW50ZXIgZnVuY3Rpb24gY2FsbHMKLSAqIDIJCXN0ZXAgb3V0IG9mIGZ1bmN0aW9uIChjb3VudCBpZ25vcmVkKQotICovCi1zdGF0aWMgaW50Ci1HREJNSVN0ZXAoaW50IGNvdW50LCBpbnQgdHlwZSkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQlzd2l0Y2ggKCB0eXBlICkgewotCWNhc2UgMDoKLQkJY21kID0gTUlFeGVjU3RlcChjb3VudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAxOgotCQljbWQgPSBNSUV4ZWNOZXh0KGNvdW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIDI6Ci0JCWNtZCA9IE1JRXhlY0ZpbmlzaCgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIlVua25vd24gc3RlcCB0eXBlIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0KLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJU2V0RGVidWdFcnJvcihjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIFRlcm1pbmF0ZSBwcm9ncmFtIGV4ZWN1dGlvbi4KLSovCi1zdGF0aWMgaW50Ci1HREJNSVRlcm1pbmF0ZSh2b2lkKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWNtZCA9IE1JQ29tbWFuZE5ldygia2lsbCIsIE1JUmVzdWx0UmVjb3JkRE9ORSk7Ci0KLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCi0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBJbnRlcnJ1cHQgYW4gZXhlY3V0aW5nIHByb2dyYW0uCi0qLwotc3RhdGljIGludAotR0RCTUlJbnRlcnJ1cHQodm9pZCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQkvKgotCSAqIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlJ3MgYW4gZXZlbnQgcGVuZGluZyBvciB0aGUKLQkgKiB0YXJnZXQgaXMgbm90IHJ1bm5pbmcuCi0JICoKLQlpZiAoTGFzdEV2ZW50ICE9IE5VTEwgfHwgIWdtaV9leGVjX2ludGVycnVwdChNSUhhbmRsZSkpCi0JCXJldHVybiBEQkdSRVNfT0s7Ki8KLQotCS8qCi0JICogTXVzdCBjaGVjayBhc3luYyBoZXJlIGR1ZSB0byBicm9rZW4gTUkgaW1wbGVtZW50YXRpb24uIEFzeW5jQ2FsbGJhY2sgd2lsbAotCSAqIGJlIGNhbGxlZCBpbnNpZGUgZ21pX2V4ZWNfaW50ZXJydXB0KCkuCi0JICoKLQlpZiAoQXN5bmNGdW5jICE9IE5VTEwpIHsKLQkJQXN5bmNGdW5jKEFzeW5jRnVuY0RhdGEpOwotCQlBc3luY0Z1bmMgPSBOVUxMOwotCX0qLwotCi0JLyoKLQkgKiBJZ25vcmUgZXJyb3IgaWYgdGFyZ2V0IGlzIG5vdCBydW5uaW5nCi0JICovCi0KLQljbWQgPSBNSUV4ZWNJbnRlcnJ1cHQoKTsKLQotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogTW92ZSB1cCBvciBkb3duIGNvdW50IHN0YWNrIGZyYW1lcy4KLSovCi1zdGF0aWMgaW50Ci1HREJNSVNldEN1cnJlbnRTdGFja2ZyYW1lKGludCBsZXZlbCkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQljbWQgPSBNSVN0YWNrU2VsZWN0RnJhbWUobGV2ZWwpOwotCi0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JTUlDb21tYW5kRnJlZShjbWQpOwotCi0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi1zdGF0aWMgaW50Ci1HZXRTdGFja2ZyYW1lcyhpbnQgY3VycmVudCwgaW50IGxvdywgaW50IGhpZ2gsIExpc3QgKipmbGlzdCkKLXsKLQlMaXN0ICoJCWZyYW1lczsKLQlNSUZyYW1lICoJZjsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0Jc3RhY2tmcmFtZSAqCXM7Ci0KLQkvL2NoZWNraW5nIGdkYiB2ZXJzaW9uCi0JaWYgKGN1cnJlbnQpIHsKLQkJaWYgKEdEQl9WZXJzaW9uID4gNi4zKSB7Ci0JCQljbWQgPSBNSVN0YWNrSW5mb0ZyYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljbWQgPSBDTElGcmFtZSgpOwotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAobG93ID09IDAgJiYgaGlnaCA9PSAwKSB7Ci0JCQljbWQgPSBNSVN0YWNrTGlzdEFsbEZyYW1lcygpOwotCQl9Ci0JCWVsc2UgewotCQkJY21kID0gTUlTdGFja0xpc3RGcmFtZXMobG93LCBoaWdoKTsKLQkJfQotCX0KLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCi0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCURFQlVHX1BSSU5UUyhERUJVR19MRVZFTF9CQUNLRU5ELCAiLS0tLS0tLS0tLS0tLS0tLS0tLSBHZXRTdGFja2ZyYW1lcyBlcnJvclxuIik7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlpZiAoY3VycmVudCkKLQkJZnJhbWVzID0gTUlHZXRGcmFtZUluZm8oY21kKTsKLQllbHNlCi0JCWZyYW1lcyA9IE1JR2V0U3RhY2tMaXN0RnJhbWVzSW5mbyhjbWQpOwotCi0JTUlDb21tYW5kRnJlZShjbWQpOwotCi0JaWYgKCBmcmFtZXMgPT0gTlVMTCApCi0JewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJGYWlsZWQgdG8gZ2V0IHN0YWNrIGZyYW1lcyBmcm9tIGJhY2tlbmQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JKmZsaXN0ID0gTmV3TGlzdCgpOwotCWZvciAoU2V0TGlzdChmcmFtZXMpOyAoZiA9IChNSUZyYW1lICopR2V0TGlzdEVsZW1lbnQoZnJhbWVzKSkgIT0gTlVMTDsgKSB7Ci0JCXMgPSBDb252ZXJ0TUlGcmFtZVRvU3RhY2tmcmFtZShmKTsKLQkJQWRkVG9MaXN0KCpmbGlzdCwgKHZvaWQgKilzKTsKLQl9Ci0JRGVzdHJveUxpc3QoZnJhbWVzLCBNSUZyYW1lRnJlZSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIExpc3QgY3VycmVudCBvciBhbGwgc3RhY2sgZnJhbWVzLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JTGlzdFN0YWNrZnJhbWVzKGludCBsb3csIGludCBoaWdoKQotewotCWRiZ19ldmVudCAqCWU7Ci0JTGlzdCAqCQlmcmFtZXM7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQlpZiAoR2V0U3RhY2tmcmFtZXMoMCwgbG93LCBoaWdoLCAmZnJhbWVzKSAhPSBEQkdSRVNfT0spCi0JCXJldHVybiBEQkdSRVNfRVJSOwotCi0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0ZSQU1FUyk7Ci0JZS0+ZGJnX2V2ZW50X3UubGlzdCA9IGZyYW1lczsKLQlTYXZlRXZlbnQoZSk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0jaWZkZWYgbm90ZGVmCi1zdHJ1Y3QgbWlfYWlmX3N0cnVjdAotewotCWNoYXIgKmZkczsKLQljaGFyICpkYXRhOwotfTsKLXR5cGVkZWYgc3RydWN0IG1pX2FpZl9zdHJ1Y3QgbWlfYWlmOwotCi1taV9haWYgKgotbWlfYWxsb2NfYWlmKHZvaWQpCi17Ci0JcmV0dXJuIChtaV9haWYgKiltaV9jYWxsb2MxKHNpemVvZihtaV9haWYpKTsKLX0KLQotbWlfYWlmICoKLW1pX3BhcnNlX2FpZihtaV9yZXN1bHRzICpjKQotewotCW1pX2FpZiAqcmVzID0gbWlfYWxsb2NfYWlmKCk7Ci0KLQlpZiAoIHJlcyApCi0JewotCQl3aGlsZSAoIGMgKQotCQl7Ci0JCQlpZiAoIGMtPnR5cGUgPT0gdF9jb25zdCApCi0JCQl7Ci0JCQkJaWYgKCBzdHJjbXAoYy0+dmFyLCAiZmRzIikgPT0gMCApCi0JCQkJCXJlcy0+ZmRzID0gYy0+di5jc3RyOwotCQkJCWVsc2UgaWYgKCBzdHJjbXAoYy0+dmFyLCAiZGF0YSIpID09IDAgKQotCQkJCQlyZXMtPmRhdGEgPSBjLT52LmNzdHI7Ci0JCQl9Ci0JCQljID0gYy0+bmV4dDsKLQkJfQotCX0KLQotCXJldHVybiByZXM7Ci19Ci0KLW1pX2FpZiAqCi1taV9yZXNfYWlmKG1pX2ggKmgpCi17Ci0JbWlfcmVzdWx0cyAqciA9IG1pX3Jlc19kb25lX3ZhcihNSUhhbmRsZSwgImFpZiIpOwotCW1pX2FpZiAqYSA9IE5VTEw7Ci0KLQlpZiAociAmJiByLT50eXBlID09IHRfdHVwbGUpCi0JCWEgPSBtaV9wYXJzZV9haWYoci0+di5ycyk7Ci0JbWlfZnJlZV9yZXN1bHRzKHIpOwotCXJldHVybiBhOwotfQotCi1taV9haWYgKgotZ21pX2FpZl9ldmFsdWF0ZV9leHByZXNzaW9uKG1pX2ggKmgsIGNoYXIgKmV4cCkKLXsKLQltaV9zZW5kKGgsICItYWlmLWV2YWx1YXRlLWV4cHJlc3Npb24gXCIlc1wiXG4iLCBleHApOwotCXJldHVybiBtaV9yZXNfYWlmKGgpOwotfQotCi1pbnQKLUR1bXBCaW5hcnlWYWx1ZShNSVNlc3Npb24gKnNlc3MsIGNoYXIgKmV4cCwgY2hhciAqZmlsZSkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0KLQljbWQgPSBNSUNvbW1hbmROZXcoImR1bXAgYmluYXJ5IHZhbHVlIiwgTUlSZXN1bHRSZWNvcmRET05FKTsKLQlNSUNvbW1hbmRBZGRPcHRpb24oY21kLCBmaWxlLCBleHApOwotCi0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyoKLSoqIExpc3QgbG9jYWwgdmFyaWFibGVzLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JR2V0TG9jYWxWYXJpYWJsZXModm9pZCkKLXsKLQlkYmdfZXZlbnQgKgllOwotCU1JQ29tbWFuZCAqCWNtZDsKLQlNSUFyZyAqCQlhcmc7Ci0JTGlzdCAqCQlhcmdzOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JY21kID0gTUlTdGFja0xpc3RMb2NhbHMoMCk7Ci0KLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCi0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlhcmdzID0gTUlHZXRTdGFja0xpc3RMb2NhbHNJbmZvKGNtZCk7Ci0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfVkFSUyk7Ci0JZS0+ZGJnX2V2ZW50X3UubGlzdCA9IE5ld0xpc3QoKTsKLQotCWZvciAoU2V0TGlzdChhcmdzKTsgKGFyZyA9IChNSUFyZyAqKUdldExpc3RFbGVtZW50KGFyZ3MpKSAhPSBOVUxMOyApIHsKLQkJQWRkVG9MaXN0KGUtPmRiZ19ldmVudF91Lmxpc3QsICh2b2lkICopc3RyZHVwKGFyZy0+bmFtZSkpOwotCX0KLQotCURlc3Ryb3lMaXN0KGFyZ3MsIE1JQXJnRnJlZSk7Ci0KLQlTYXZlRXZlbnQoZSk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotICogVGhpcyBpcyBuZWVkZWQgdG8gY2hlY2sgZm9yIGEgYnVnIGluIHRoZSBMaW51eCB4ODYgR0NDIDQuMSBjb21waWxlcgotICogdGhhdCBjYXVzZXMgZ2RiIDYuNCBhbmQgNi41IHRvIGNyYXNoIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KLSAqLwotI2RlZmluZSBHREJfQlVHXzIxODgJX19nbnVfbGludXhfXyAmJiBfX2kzODZfXyAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDEKLQotI2lmIEdEQl9CVUdfMjE4OAotc3RhdGljIGludAotQ3VycmVudEZyYW1lKGludCBsZXZlbCwgY2hhciAqbmFtZSkKLXsKLQlNSUNvbW1hbmQgKgljbWQ7Ci0JTUlGcmFtZSAqCWZyYW1lOwotCUxpc3QgKgkJZnJhbWVzOwotCWludCB2YWwgPSAwOwotCi0JaWYgKEdEQl9WZXJzaW9uID4gNi4zICYmIEdEQl9WZXJzaW9uIDwgNi43KSB7Ci0JCWNtZCA9IE1JU3RhY2tMaXN0RnJhbWVzKGxldmVsLCBsZXZlbCk7Ci0JCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQkJcmV0dXJuIHZhbDsKLQkJfQotCQlmcmFtZXMgPSBNSUdldFN0YWNrTGlzdEZyYW1lc0luZm8oY21kKTsKLQotCQkvL29ubHkgb25lIGZyYW1lCi0JCVNldExpc3QoZnJhbWVzKTsKLQkJaWYgKChmcmFtZSA9IChNSUZyYW1lICopR2V0TGlzdEVsZW1lbnQoZnJhbWVzKSkgIT0gTlVMTCkgewotCQkJaWYgKGZyYW1lLT5mdW5jICE9IE5VTEwgJiYgc3RybmNtcChmcmFtZS0+ZnVuYywgbmFtZSwgNCkgPT0gMCkgewotCQkJCXZhbCA9IDE7Ci0JCQl9Ci0JCX0KLQkJRGVzdHJveUxpc3QoZnJhbWVzLCBNSUZyYW1lRnJlZSk7Ci0JfQotCi0JcmV0dXJuIHZhbDsKLX0KLSNlbmRpZiAvKiBHREJfQlVHXzIxODggKi8KLQotLyoKLSoqIExpc3QgYXJndW1lbnRzLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JTGlzdEFyZ3VtZW50cyhpbnQgbG93LCBpbnQgaGlnaCkKLXsKLQlkYmdfZXZlbnQgKgllOwotCU1JQ29tbWFuZCAqCWNtZDsKLQlNSUFyZyAqCQlhcmc7Ci0JTUlGcmFtZSAqCWZyYW1lOwotCUxpc3QgKgkJZnJhbWVzOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JY21kID0gTUlTdGFja0xpc3RBcmd1bWVudHMoMCwgbG93LCBoaWdoKTsKLQotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0KLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJU2V0RGVidWdFcnJvcihjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCWZyYW1lcyA9IE1JR2V0U3RhY2tMaXN0QXJndW1lbnRzSW5mbyhjbWQpOwotCi0JTUlDb21tYW5kRnJlZShjbWQpOwotCi0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0FSR1MpOwotCWUtPmRiZ19ldmVudF91Lmxpc3QgPSBOZXdMaXN0KCk7Ci0KLQkvKgotIAkgKiBKdXN0IGxvb2sgYXQgZmlyc3QgZnJhbWUgLSB3ZSBzaG91bGQgb25seSBnZXQKLSAJICogb25lIGFueXdheS4uLgotIAkgKiAqKioqKiogSWYgZnJhbWUgaXMgbW9yZSB0aGFuIG9uZSwgbm8gYXJnIG5lZWRzICoqKioqCi0gCSAqLwotCVNldExpc3QoZnJhbWVzKTsKLQlpZiAoKGZyYW1lID0gKE1JRnJhbWUgKilHZXRMaXN0RWxlbWVudChmcmFtZXMpKSAhPSBOVUxMKSB7Ci0jaWYgR0RCX0JVR18yMTg4Ci0JCWlmICghQ3VycmVudEZyYW1lKGZyYW1lLT5sZXZlbCwgIm1haW4iKSkgewotI2VuZGlmIC8qIEdEQl9CVUdfMjE4OCAqLwotCQkJZm9yIChTZXRMaXN0KGZyYW1lLT5hcmdzKTsgKGFyZyA9IChNSUFyZyAqKUdldExpc3RFbGVtZW50KGZyYW1lLT5hcmdzKSkgIT0gTlVMTDsgKQotCQkJCUFkZFRvTGlzdChlLT5kYmdfZXZlbnRfdS5saXN0LCAodm9pZCAqKXN0cmR1cChhcmctPm5hbWUpKTsKLSNpZiBHREJfQlVHXzIxODgKLQkJfQotI2VuZGlmIC8qIEdEQl9CVUdfMjE4OCAqLwotCX0KLQlEZXN0cm95TGlzdChmcmFtZXMsIE1JRnJhbWVGcmVlKTsKLQlTYXZlRXZlbnQoZSk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogTGlzdCBnbG9iYWwgdmFyaWFibGVzLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JR2V0R2xvYmFsVmFyaWFibGVzKHZvaWQpCi17Ci0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JRGJnU2V0RXJyb3IoREJHRVJSX05PVElNUCwgTlVMTCk7Ci0JcmV0dXJuIERCR1JFU19FUlI7Ci19Ci0KLS8qCi0qKiBRdWl0IGRlYnVnZ2VyLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JUXVpdCh2b2lkKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQotCWlmIChEZWJ1Z1Nlc3Npb24gIT0gTlVMTCkgewotCQljbWQgPSBNSUdEQkV4aXQoKTsKLQkJU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCX0KLQlSZW1vdmVBbGxNYXBzKCk7Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JU2VydmVyRXhpdCsrOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotc3RhdGljIGludAotR0RCTUlHZXRJbmZvVGhyZWFkKHZvaWQpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCWRiZ19ldmVudCAqCWU7Ci0JY2hhciAqCQl0aWQ7Ci0JQ0xJSW5mb1RocmVhZHNJbmZvICoJaW5mbzsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWNtZCA9IENMSUluZm9UaHJlYWRzKCk7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJREVCVUdfUFJJTlRTKERFQlVHX0xFVkVMX0JBQ0tFTkQsICItLS0tLS0tLS0tLS0tLS0tLS0tIEdEQk1JR2V0SW5mb1RocmVhZCBlcnJvclxuIik7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JaW5mbyA9IENMSUdldEluZm9UaHJlYWRzSW5mbyhjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9USFJFQURTKTsKLQllLT5kYmdfZXZlbnRfdS50aHJlYWRzX2V2ZW50LnRocmVhZF9pZCA9IGluZm8tPmN1cnJlbnRfdGhyZWFkX2lkOwotCWUtPmRiZ19ldmVudF91LnRocmVhZHNfZXZlbnQubGlzdCA9IE5ld0xpc3QoKTsKLQlmb3IgKFNldExpc3QoaW5mby0+dGhyZWFkX2lkcyk7ICh0aWQgPSAoY2hhciAqKUdldExpc3RFbGVtZW50KGluZm8tPnRocmVhZF9pZHMpKSAhPSBOVUxMOykgewotCQlBZGRUb0xpc3QoZS0+ZGJnX2V2ZW50X3UudGhyZWFkc19ldmVudC5saXN0LCAodm9pZCAqKXN0cmR1cCh0aWQpKTsKLQl9Ci0KLQlEZXN0cm95TGlzdChpbmZvLT50aHJlYWRfaWRzLCBmcmVlKTsKLQlmcmVlKGluZm8pOwotCVNhdmVFdmVudChlKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLUdEQk1JU2V0VGhyZWFkU2VsZWN0KGludCB0aHJlYWROdW0pCi17Ci0JTUlDb21tYW5kICoJY21kOwotCWRiZ19ldmVudCAqCWU7Ci0JTUlUaHJlYWRTZWxlY3RJbmZvICogaW5mbzsKLQkvL01JRnJhbWUgKmY7Ci0Jc3RhY2tmcmFtZSAqcyA9IE5VTEw7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQljbWQgPSBNSVRocmVhZFNlbGVjdCh0aHJlYWROdW0pOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JaW5mbyA9IE1JU2V0VGhyZWFkU2VsZWN0SW5mbyhjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCWlmIChpbmZvLT5mcmFtZSAhPSBOVUxMKSB7Ci0JCXMgPSBDb252ZXJ0TUlGcmFtZVRvU3RhY2tmcmFtZShpbmZvLT5mcmFtZSk7Ci0JfQotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9USFJFQURfU0VMRUNUKTsKLQllLT5kYmdfZXZlbnRfdS50aHJlYWRfc2VsZWN0X2V2ZW50LnRocmVhZF9pZCA9IGluZm8tPmN1cnJlbnRfdGhyZWFkX2lkOwotCWUtPmRiZ19ldmVudF91LnRocmVhZF9zZWxlY3RfZXZlbnQuZnJhbWUgPSBzOwotCi0JTUlGcmFtZUZyZWUoaW5mby0+ZnJhbWUpOwotCWZyZWUoaW5mbyk7Ci0JU2F2ZUV2ZW50KGUpOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotc3RhdGljIGludAotR0RCTUlTdGFja0luZm9EZXB0aCgpCi17Ci0JaW50IGRlcHRoOwotCWRiZ19ldmVudCAqCWU7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQlpZiAoKGRlcHRoID0gZ2V0X2luZm9fZGVwdGgoKSkgPT0gLTEpIHsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9TVEFDS19ERVBUSCk7Ci0JZS0+ZGJnX2V2ZW50X3Uuc3RhY2tfZGVwdGggPSBkZXB0aDsKLQlTYXZlRXZlbnQoZSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotc3RhdGljIGludAotR0RCTUlEYXRhUmVhZE1lbW9yeShsb25nIG9mZnNldCwgY2hhciogYWRkcmVzcywgY2hhciogZm9ybWF0LCBpbnQgd29yZFNpemUsIGludCByb3dzLCBpbnQgY29scywgY2hhciogYXNDaGFyKQotewotCU1JQ29tbWFuZCAqCWNtZDsKLQlkYmdfZXZlbnQgKgllOwotCU1JRGF0YVJlYWRNZW1vcnlJbmZvICogaW5mbzsKLQlNSU1lbW9yeSAqIG1lbTsKLQltZW1vcnlpbmZvICptZW1pbmZvID0gTlVMTDsKLQltZW1vcnkgKiBtOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JY21kID0gTUlEYXRhUmVhZE1lbW9yeShvZmZzZXQsIGFkZHJlc3MsIGZvcm1hdCwgd29yZFNpemUsIHJvd3MsIGNvbHMsIGFzQ2hhcik7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJU2V0RGVidWdFcnJvcihjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQlpbmZvID0gTUlHZXREYXRhUmVhZE1lbW9yeUluZm8oY21kKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfREFUQVJfTUVNKTsKLQlpZiAoaW5mbyAhPSBOVUxMKSB7Ci0JCW1lbWluZm8gPSBOZXdNZW1vcnlJbmZvKCk7Ci0JCWlmIChpbmZvLT5hZGRyICE9IE5VTEwpIHsKLQkJCW1lbWluZm8tPmFkZHIgPSBzdHJkdXAoaW5mby0+YWRkcik7Ci0JCX0KLQkJbWVtaW5mby0+bmV4dFJvdyA9IGluZm8tPm5leHRSb3c7Ci0JCW1lbWluZm8tPnByZXZSb3cgPSBpbmZvLT5wcmV2Um93OwotCQltZW1pbmZvLT5uZXh0UGFnZSA9IGluZm8tPm5leHRQYWdlOwotCQltZW1pbmZvLT5wcmV2UGFnZSA9IGluZm8tPnByZXZQYWdlOwotCQltZW1pbmZvLT5udW1CeXRlcyA9IGluZm8tPm51bUJ5dGVzOwotCQltZW1pbmZvLT50b3RhbEJ5dGVzID0gaW5mby0+dG90YWxCeXRlczsKLQkJaWYgKGluZm8tPm1lbW9yaWVzICE9IE5VTEwgKSB7Ci0JCQltZW1pbmZvLT5tZW1vcmllcyA9IE5ld0xpc3QoKTsKLQkJCWZvciAoU2V0TGlzdChpbmZvLT5tZW1vcmllcyk7IChtZW0gPSAoTUlNZW1vcnkgKilHZXRMaXN0RWxlbWVudChpbmZvLT5tZW1vcmllcykpICE9IE5VTEw7KSB7Ci0JCQkJbSA9IE5ld01lbW9yeSgpOwotCQkJCWlmIChtZW0tPmFkZHIgIT0gTlVMTCkgewotCQkJCQltLT5hZGRyID0gc3RyZHVwKG1lbS0+YWRkcik7Ci0JCQkJfQotCQkJCWlmIChtZW0tPmFzY2lpICE9IE5VTEwpIHsKLQkJCQkJbS0+YXNjaWkgPSBzdHJkdXAobWVtLT5hc2NpaSk7Ci0JCQkJfQotCQkJCWlmIChtZW0tPmRhdGEgIT0gTlVMTCkgewotCQkJCQljaGFyKiBkOwotCQkJCQltLT5kYXRhID0gTmV3TGlzdCgpOwotCQkJCQlmb3IgKFNldExpc3QobWVtLT5kYXRhKTsgKGQgPSAoY2hhciAqKUdldExpc3RFbGVtZW50KG1lbS0+ZGF0YSkpICE9IE5VTEw7KSB7Ci0JCQkJCQlBZGRUb0xpc3QobS0+ZGF0YSwgKHZvaWQgKikgc3RyZHVwKGQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlBZGRUb0xpc3QobWVtaW5mby0+bWVtb3JpZXMsICh2b2lkICopbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZS0+ZGJnX2V2ZW50X3UubWVtaW5mbyA9IG1lbWluZm87Ci0JTUlEYXRhUmVhZE1lbW9yeUluZm9GcmVlKGluZm8pOwotCi0JU2F2ZUV2ZW50KGUpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLUdEQk1JRGF0YVdyaXRlTWVtb3J5KGxvbmcgb2Zmc2V0LCBjaGFyKiBhZGRyZXNzLCBjaGFyKiBmb3JtYXQsIGludCB3b3JkU2l6ZSwgY2hhciogdmFsdWUpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JLy9ERUJVR19QUklOVFMoREVCVUdfTEVWRUxfQkFDS0VORCwgIi0tLS0tIGdkYm1pX3NldnJlcjogR0RCTUlEYXRhV3JpdGVNZW1vcnkgY2FsbGVkIC0tLS0tLS0tLVxuIik7Ci0JY21kID0gTUlEYXRhV3JpdGVNZW1vcnkob2Zmc2V0LCBhZGRyZXNzLCBmb3JtYXQsIHdvcmRTaXplLCB2YWx1ZSk7Ci0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJU2V0RGVidWdFcnJvcihjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0vL1RPRE8KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLUdEQkNMSUxpc3RTaWduYWxzKGNoYXIqIG5hbWUpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCUxpc3QgKnNpZ25hbHM7Ci0JZGJnX2V2ZW50ICoJZTsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWNtZCA9IENMSUxpc3RTaWduYWxzKG5hbWUpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JQ0xJR2V0U2lnSGFuZGxlTGlzdChjbWQsICZzaWduYWxzKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfU0lHTkFMUyk7Ci0JZS0+ZGJnX2V2ZW50X3UubGlzdCA9IHNpZ25hbHM7Ci0JU2F2ZUV2ZW50KGUpOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotc3RhdGljIGludAotR0RCQ0xJU2lnbmFsSW5mbyhjaGFyKiBhcmcpCi17Ci0JTUlDb21tYW5kICoJY21kOwotCi0JQ0hFQ0tfU0VTU0lPTigpOwotCi0JY21kID0gQ0xJU2lnbmFsSW5mbyhhcmcpOwotCU1JQ29tbWFuZFJlZ2lzdGVyQ2FsbGJhY2soY21kLCBQcm9jZXNzQ0xJUmVzdWx0UmVjb3JkLCBEZWJ1Z1Nlc3Npb24pOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JTUlDb21tYW5kRnJlZShjbWQpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLUdEQkNMSUhhbmRsZShjaGFyICphcmcpCi17Ci0JTUlDb21tYW5kICpjbWQ7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQljbWQgPSBDTElIYW5kbGUoYXJnKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlTZXREZWJ1Z0Vycm9yKGNtZCk7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi1zdGF0aWMgaW50Ci1HREJNSURhdGFFdmFsdWF0ZUV4cHJlc3Npb24oY2hhciAqYXJnKQotewotCU1JQ29tbWFuZCAqY21kOwotCWRiZ19ldmVudCAqCWU7Ci0JY2hhciAqcmVzID0gTlVMTDsKLQotCUNIRUNLX1NFU1NJT04oKTsKLQotCWNtZCA9IE1JRGF0YUV2YWx1YXRlRXhwcmVzc2lvbihhcmcpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0KLQlpZiAoTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlyZXMgPSBNSUdldERhdGFFdmFsdWF0ZUV4cHJlc3Npb25JbmZvKGNtZCk7Ci0JfQotCWlmIChyZXMgPT0gTlVMTCkgewotCQlyZXMgPSBzdHJkdXAoIk5vIHZhbHVlIGZvdW5kLiIpOwotCX0KLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfREFUQV9FVkFfRVgpOwotCWUtPmRiZ19ldmVudF91LmRhdGFfZXhwcmVzc2lvbiA9IHJlczsKLQlTYXZlRXZlbnQoZSk7Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gZXhwLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JRXZhbHVhdGVFeHByZXNzaW9uKGNoYXIgKmV4cCkKLXsKLQljaGFyICoJCXR5cGU7Ci0JQUlGICoJCWE7Ci0JZGJnX2V2ZW50ICoJZTsKLQotCWlmIChHZXRBSUZWYXIoZXhwLCAmYSwgJnR5cGUpICE9IERCR1JFU19PSykKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfREFUQSk7Ci0JZS0+ZGJnX2V2ZW50X3UuZGF0YV9ldmVudC5kYXRhID0gYTsKLQllLT5kYmdfZXZlbnRfdS5kYXRhX2V2ZW50LnR5cGVfZGVzYyA9IHR5cGU7Ci0JU2F2ZUV2ZW50KGUpOwotCi0JcmV0dXJuIERCR1JFU19PSzsKLX0KLS8qCi0qKiBGaW5kIG5hdGl2ZSB0eXBlIG9mIHZhcmlhYmxlLgotKi8KLXN0YXRpYyBpbnQKLUdEQk1JR2V0TmF0aXZlVHlwZShjaGFyICp2YXIpCi17Ci0JZGJnX2V2ZW50ICoJZTsKLQlBSUYgKgkJYTsKLQljaGFyICoJCXR5cGU7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQlpZiAoR2V0QUlGVmFyKHZhciwgJmEsICZ0eXBlKSAhPSBEQkdSRVNfT0spCi0JCXJldHVybiBEQkdSRVNfRVJSOwotCi0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX1RZUEUpOwotCWUtPmRiZ19ldmVudF91LnR5cGVfZGVzYyA9IHR5cGU7Ci0KLQlTYXZlRXZlbnQoZSk7Ci0JQUlGRnJlZShhKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi1zdGF0aWMgaW50Ci1HZXRBSUZWYXIoY2hhciAqdmFyLCBBSUYgKip2YWwsIGNoYXIgKip0eXBlKQotewotCUFJRiAqIHJlczsKLQlNSVZhciAqbWl2YXI7Ci0KLQltaXZhciA9IENyZWF0ZU1JVmFyKHZhcik7Ci0JaWYgKG1pdmFyID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1VOS05PV05fVkFSSUFCTEUsIHZhcik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCWlmICgocmVzID0gR2V0QUlGKG1pdmFyLCB2YXIsIDApKSA9PSBOVUxMKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9VTktOT1dOX1RZUEUsIG1pdmFyLT50eXBlKTsKLQkJRGVsZXRlTUlWYXIobWl2YXItPm5hbWUpOwotCQlNSVZhckZyZWUobWl2YXIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0JKnR5cGUgPSBzdHJkdXAobWl2YXItPnR5cGUpOwotCSp2YWwgPSByZXM7Ci0KLQlEZWxldGVNSVZhcihtaXZhci0+bmFtZSk7Ci0JTUlWYXJGcmVlKG1pdmFyKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLUdldFZhclZhbHVlKGNoYXIgKnZhcikKLXsKLQljaGFyICoJCXJlczsKLQlNSUNvbW1hbmQgKgljbWQgPSBNSVZhckV2YWx1YXRlRXhwcmVzc2lvbih2YXIpOwotCi0JU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQlpZiAoIU1JQ29tbWFuZFJlc3VsdE9LKGNtZCkpIHsKLQkJU2V0RGVidWdFcnJvcihjbWQpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiAiIjsKLQl9Ci0JcmVzID0gTUlHZXRWYXJFdmFsdWF0ZUV4cHJlc3Npb25JbmZvKGNtZCk7Ci0JTUlDb21tYW5kRnJlZShjbWQpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLUdldEFkZHJlc3NMZW5ndGgoKQotewotCWlmIChBRERSRVNTX0xFTkdUSCAhPSAwKSB7Ci0JCXJldHVybiBBRERSRVNTX0xFTkdUSDsKLQl9Ci0JY2hhciAqIHJlczsKLQlNSUNvbW1hbmQgKiBjbWQgPSBNSURhdGFFdmFsdWF0ZUV4cHJlc3Npb24oIlwic2l6ZW9mKGNoYXIgKilcIiIpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCVNldERlYnVnRXJyb3IoY21kKTsKLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmVzID0gTUlHZXREYXRhRXZhbHVhdGVFeHByZXNzaW9uSW5mbyhjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQotCUFERFJFU1NfTEVOR1RIID0gKGludClzdHJ0b2wocmVzLCBOVUxMLCAxMCk7Ci0JcmV0dXJuIEFERFJFU1NfTEVOR1RIOwotfQotCi1zdGF0aWMgY2hhciAqCi1HZXRQdHlwZVZhbHVlKGNoYXIgKmV4cCkKLXsKLQljaGFyICogdHlwZSA9IE5VTEw7Ci0JTUlDb21tYW5kKiBjbWQgPSBDTElQVHlwZShleHApOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JdHlwZSA9IENMSUdldFBUeXBlSW5mbyhjbWQpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQlyZXR1cm4gdHlwZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUWVBFIENPTlZFUlNJT04KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVF9PVEhFUgkJCTAKLSNkZWZpbmUgVF9DSEFSCQkJMQotI2RlZmluZSBUX1NIT1JUCQkJMgotI2RlZmluZSBUX1VTSE9SVAkJMwotI2RlZmluZSBUX0lOVAkJCTQKLSNkZWZpbmUgVF9VSU5UCQkJNQotI2RlZmluZSBUX0xPTkcJCQk2Ci0jZGVmaW5lIFRfVUxPTkcJCQk3Ci0jZGVmaW5lIFRfTE9OR0xPTkcJCTgKLSNkZWZpbmUgVF9VTE9OR0xPTkcJCTkKLSNkZWZpbmUgVF9GTE9BVAkJCTEwCi0jZGVmaW5lIFRfRE9VQkxFCQkxMQotI2RlZmluZSBUX1NUUklORwkJMTIKLSNkZWZpbmUgVF9CT09MRUFOCQkxMwotCi0jZGVmaW5lIFRfQ0hBUl9QVFIJCTE0Ci0jZGVmaW5lIFRfRlVOQ1RJT04JCTE1Ci0jZGVmaW5lIFRfVk9JRF9QVFIJCTE2Ci0jZGVmaW5lIFRfVU5JT04JCQkxNwotI2RlZmluZSBUX0VOVU0JCQkxOAotI2RlZmluZSBUX0FSUkFZCQkJMTkKLSNkZWZpbmUgVF9TVFJVQ1QJCTIwCi0jZGVmaW5lIFRfUE9JTlRFUgkJMjEKLQotc3RhdGljIGludAotZ2V0X3NpbXBsZV90eXBlKGNoYXIgKnR5cGUpCi17Ci0JY2hhciAqdCA9IE5VTEw7Ci0JaW50IGlkOwotCWludCBsZW4gPSBzdHJsZW4odHlwZSk7Ci0KLQlpZiAodHlwZVtsZW4gLSAxXSA9PSAnKScpIHsgLy8gZnVuY3Rpb24KLQkJcmV0dXJuIFRfRlVOQ1RJT047Ci0JfQotCWlmIChzdHJuY21wKHR5cGUsICJ2b2lkICoiLCA2KSA9PSAwKSB7IC8vIHZvaWQgcG9pbnRlcgotCQlyZXR1cm4gVF9WT0lEX1BUUjsKLQl9Ci0JaWYgKHN0cm5jbXAodHlwZSwgImVudW0iLCA0KSA9PSAwKSB7IC8vIGVudW0KLQkJcmV0dXJuIFRfRU5VTTsKLQl9Ci0KLQkvL2NoZWNrIG1vZGlmaWVycwotCWlmIChzdHJuY21wKHR5cGUsICJjb25zdCB2b2xhdGlsZSIsIDE0KSA9PSAwKQotCQl0ID0gc3RyZHVwKCZ0eXBlWzE1XSk7IC8vKyAxIHJlbW92ZSB3aGl0ZXNwZWFjZQotCWVsc2UgaWYgKHN0cm5jbXAodHlwZSwgInZvbGF0aWxlIiwgOCkgPT0gMCkKLQkJdCA9IHN0cmR1cCgmdHlwZVs5XSk7IC8vKyAxIHJlbW92ZSB3aGl0ZXNwZWFjZQotCWVsc2UgaWYgKHN0cm5jbXAodHlwZSwgImNvbnN0IiwgNSkgPT0gMCkKLQkJdCA9IHN0cmR1cCgmdHlwZVs2XSk7IC8vKyAxIHJlbW92ZSB3aGl0ZXNwZWFjZQotCWVsc2UKLQkJdCA9IHN0cmR1cCh0eXBlKTsKLQotCWlmIChzdHJuY21wKHQsICJjaGFyICoiLCA2KSA9PSAwKQotCQlpZCA9IFRfQ0hBUl9QVFI7Ci0JZWxzZSBpZiAoc3RybmNtcCh0LCAiY2hhciIsIDQpID09IDApCi0JCWlkID0gVF9DSEFSOwotCWVsc2UgaWYgKHN0cm5jbXAodCwgInVuc2lnbmVkIGNoYXIiLCAxMykgPT0gMCkKLQkJaWQgPSBUX0NIQVI7Ci0JZWxzZSBpZiAoc3RybmNtcCh0LCAic2hvcnQgaW50IiwgOSkgPT0gMCB8fCBzdHJuY21wKHQsICJpbnQyIiwgNCkgPT0gMCkKLQkJaWQgPSBUX1NIT1JUOwotCWVsc2UgaWYgKHN0cm5jbXAodCwgInNob3J0IHVuc2lnbmVkIGludCIsIDE4KSA9PSAwKQotCQlpZCA9IFRfVVNIT1JUOwotCWVsc2UgaWYgKHN0cm5jbXAodCwgImludCIsIDMpID09IDAgfHwgc3RybmNtcCh0LCAiaW50NCIsIDQpID09IDApCi0JCWlkID0gVF9JTlQ7Ci0JZWxzZSBpZiAoc3RybmNtcCh0LCAidW5zaWduZWQgaW50IiwgMTIpID09IDApCi0JCWlkID0gVF9VSU5UOwotCWVsc2UgaWYgKHN0cm5jbXAodCwgImxvbmcgaW50IiwgOCkgPT0gMCB8fCBzdHJuY21wKHQsICJpbnQ4IiwgNCkgPT0gMCkKLQkJaWQgPSBUX0xPTkc7Ci0JZWxzZSBpZiAoc3RybmNtcCh0LCAibG9uZyB1bnNpZ25lZCBpbnQiLCAxNykgPT0gMCkKLQkJaWQgPSBUX1VMT05HOwotI2lmZGVmIENDX0hBU19MT05HX0xPTkcKLQllbHNlIGlmIChzdHJuY21wKHQsICJsb25nIGxvbmcgaW50IiwgMTMpID09IDAgfHwgc3RybmNtcCh0LCAicmVhbCoxNiIsIDcpID09IDApCi0JCWlkID0gVF9MT05HTE9ORzsKLQllbHNlIGlmIChzdHJuY21wKHQsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IiwgMjIpID09IDApCi0JCWlkID0gVF9VTE9OR0xPTkc7Ci0jZW5kaWYgLyogQ0NfSEFTX0xPTkdfTE9ORyAqLwotCWVsc2UgaWYgKHN0cm5jbXAodCwgImxvbmciLCA0KSA9PSAwIHx8IHN0cm5jbXAodCwgInJlYWwqNCIsIDYpID09IDApCi0JCWlkID0gVF9MT05HOwotCWVsc2UgaWYgKHN0cm5jbXAodCwgImZsb2F0IiwgNSkgPT0gMCB8fCBzdHJuY21wKHQsICJyZWFsKjgiLCA2KSA9PSAwKQotCQlpZCA9IFRfRkxPQVQ7Ci0JZWxzZSBpZiAoc3RybmNtcCh0LCAiZG91YmxlIiwgNikgPT0gMCkKLQkJaWQgPSBUX0RPVUJMRTsKLQllbHNlIGlmIChzdHJuY21wKHQsICJzdHJpbmciLCA2KSA9PSAwKQotCQlpZCA9IFRfU1RSSU5HOwotIAllbHNlIGlmIChzdHJuY21wKHQsICJsb2dpY2FsNCIsIDgpID09IDApCi0gCQlpZCA9IFRfQk9PTEVBTjsKLQllbHNlCi0JCWlkID0gIFRfT1RIRVI7Ci0KLQlmcmVlKHQpOwotCXJldHVybiBpZDsKLX0KLQotc3RhdGljIGludAotZ2V0X2NvbXBsZXhfdHlwZShjaGFyICp0eXBlKQotewotCWludCBsZW4gPSBzdHJsZW4odHlwZSk7Ci0Jc3dpdGNoICh0eXBlW2xlbiAtIDFdKSB7Ci0JY2FzZSAnXSc6Ci0JCXJldHVybiBUX0FSUkFZOwotCWNhc2UgJyonOgotCQlpZiAodHlwZVtsZW4gLSAyXSA9PSAnKicpIC8vcG9pbnRlciBwb2ludGVyCi0JCQlyZXR1cm4gVF9QT0lOVEVSOwotCQlpZiAoc3RybmNtcCh0eXBlLCAiY2hhciIsIDQpID09IDApIC8vY2hhciBwb2ludGVyCi0JCQlyZXR1cm4gVF9DSEFSX1BUUjsKLQkJcmV0dXJuIFRfUE9JTlRFUjsgLy9ub3JtYWwgcG9pbnRlcgotCWRlZmF1bHQ6Ci0JCWlmIChzdHJuY21wKHR5cGUsICJ1bmlvbiIsIDUpID09IDApCi0JCQlyZXR1cm4gVF9VTklPTjsKLQotCQlpZiAoc3RybmNtcCh0eXBlLCAic3RydWN0IiwgNikgPT0gMCkKLQkJCXJldHVybiBUX1NUUlVDVDsKLQotCQlyZXR1cm4gVF9PVEhFUjsKLQl9Ci19Ci0KLXN0YXRpYyBBSUYqCi1HZXRQcmltaXRpdmVBSUYoaW50IGlkLCBjaGFyICpyZXMpCi17Ci0JY2hhciAqcGNoOwotCi0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgVF9TVFJJTkc6Ci0JCWNhc2UgVF9DSEFSOgotCQkJaWYgKChwY2ggPSBzdHJjaHIocmVzLCAnICcpKSAhPSBOVUxMKSB7Ci0JCQkJcGNoKys7Ci0JCQkJaWYgKCpwY2ggPT0gJ1wnJykgeyAvL2NoYXJhY3RlcgotCQkJCQlwY2gtLTsKLQkJCQkJKnBjaCA9ICdcMCc7Ci0JCQkJCXJldHVybiBDaGFyVG9BSUYoKGNoYXIpc3RydG9sKHJlcywgTlVMTCwgMTApKTsKLQkJCQl9Ci0JCQkJZWxzZSB7IC8vc3RyaW5nCi0JCQkJCXJldHVybiBTdHJpbmdUb0FJRihwY2gpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBDaGFyVG9BSUYoKGNoYXIpc3RydG9sKHJlcywgTlVMTCwgMTApKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFRfU0hPUlQ6Ci0JCQlyZXR1cm4gU2hvcnRUb0FJRigoc2hvcnQpc3RydG9sKHJlcywgTlVMTCwgMTApKTsKLQkJY2FzZSBUX1VTSE9SVDoKLQkJCXJldHVybiBVbnNpZ25lZFNob3J0VG9BSUYoKHVuc2lnbmVkIHNob3J0KXN0cnRvdWwocmVzLCBOVUxMLCAxMCkpOwotCQljYXNlIFRfSU5UOgotCQkJcmV0dXJuIEludFRvQUlGKChpbnQpc3RydG9sKHJlcywgTlVMTCwgMTApKTsKLQkJY2FzZSBUX1VJTlQ6Ci0JCQlyZXR1cm4gVW5zaWduZWRJbnRUb0FJRigodW5zaWduZWQgaW50KXN0cnRvdWwocmVzLCBOVUxMLCAxMCkpOwotCQljYXNlIFRfTE9ORzoKLQkJCXJldHVybiBMb25nVG9BSUYoc3RydG9sKHJlcywgTlVMTCwgMTApKTsKLQkJY2FzZSBUX1VMT05HOgotCQkJcmV0dXJuIFVuc2lnbmVkTG9uZ1RvQUlGKCh1bnNpZ25lZCBsb25nKXN0cnRvdWwocmVzLCBOVUxMLCAxMCkpOwotCQkjaWZkZWYgQ0NfSEFTX0xPTkdfTE9ORwotCQkJY2FzZSBUX0xPTkdMT05HOgotCQkJCXJldHVybiBMb25nTG9uZ1RvQUlGKHN0cnRvbGwocmVzLCBOVUxMKSk7Ci0JCQljYXNlIFRfVUxPTkdMT05HOgotCQkJCXJldHVybiBVbnNpZ25lZExvbmdMb25nVG9BSUYoKHVuc2lnbmVkIGxvbmcgbG9uZylzdHJ0b3VsbChyZXMsIE5VTEwpKTsKLQkJI2VuZGlmIC8qIENDX0hBU19MT05HX0xPTkcgKi8KLQkJY2FzZSBUX0ZMT0FUOgotCQkJcmV0dXJuIEZsb2F0VG9BSUYoKGZsb2F0KXN0cnRvZChyZXMsIE5VTEwpKTsKLQkJY2FzZSBUX0RPVUJMRToKLQkJCXJldHVybiBEb3VibGVUb0FJRihzdHJ0b2QocmVzLCBOVUxMKSk7Ci0JCWRlZmF1bHQ6Ly9vdGhlciB0eXBlCi0JCQlyZXR1cm4gVm9pZFRvQUlGKDAsIDApOwotCX0KLX0KLQotc3RhdGljIEFJRiAqCi1HZXRBSUZQb2ludGVyKGNoYXIgKmFkZHIsIEFJRiAqaSkKLXsKLQlBSUYgKmFjOwotCUFJRiAqYTsKLQljaGFyICpwY2g7Ci0KLQlpZiAoYWRkciA9PSBOVUxMKSB7Ci0JCWFjID0gVm9pZFRvQUlGKDAsIDApOwotCX0KLQllbHNlIHsKLQkJaWYgKChwY2ggPSBzdHJjaHIoYWRkciwgJyAnKSkgIT0gTlVMTCkgewotCQkJKnBjaCA9ICdcMCc7Ci0JCX0KLQkJYWRkciArPSAyOyAvL3NraXAgMHgKLQkJYWMgPSBBZGRyZXNzVG9BSUYoYWRkciwgR2V0QWRkcmVzc0xlbmd0aCgpKTsKLQl9Ci0JYSA9IFBvaW50ZXJUb0FJRihhYywgaSk7Ci0JQUlGRnJlZShhYyk7Ci0JcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyBBSUYgKgotR2V0Q2hhclBvaW50ZXJBSUYoY2hhciAqcmVzKQotewotCWNoYXIgKnBjaDsKLQljaGFyICp2YWw7Ci0JQUlGICphOwotCUFJRiAqYWM7Ci0KLQlpZiAoKHBjaCA9IHN0cmNocihyZXMsICcgJykpICE9IE5VTEwpIHsKLQkJdmFsID0gc3RyZHVwKHBjaCsxKTsKLQkJKnBjaCA9ICdcMCc7Ci0KLQkJcmVzICs9IDI7ICAvL3NraXAgMHgKLQkJYWMgPSBBZGRyZXNzVG9BSUYocmVzLCBHZXRBZGRyZXNzTGVuZ3RoKCkpOwotCQlhID0gQ2hhclBvaW50ZXJUb0FJRihhYywgdmFsKTsKLQkJZnJlZSh2YWwpOwotCQlBSUZGcmVlKGFjKTsKLQkJcmV0dXJuIGE7Ci0JfQotCXJldHVybiBWb2lkVG9BSUYoMCwgMCk7Ci19Ci0KLXN0YXRpYyBBSUYgKgotR2V0U2ltcGxlQUlGKE1JVmFyICp2YXIsIGNoYXIgKmV4cCkKLXsKLQlBSUYJCSphID0gTlVMTDsKLQlBSUYJCSphYzsKLQljaGFyCSpwdDsKLQotCWludCBpZCA9IGdldF9zaW1wbGVfdHlwZSh2YXItPnR5cGUpOwotCWlmIChpZCA9PSBUX09USEVSKSB7Ci0JCXB0ID0gR2V0UHR5cGVWYWx1ZSh2YXItPnR5cGUpOwotCQlpZiAocHQgIT0gTlVMTCkgewotCQkJdmFyLT50eXBlID0gc3RyZHVwKHB0KTsKLQkJCWlkID0gZ2V0X3NpbXBsZV90eXBlKHZhci0+dHlwZSk7Ci0JCQlmcmVlKHB0KTsKLQkJfQotCX0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBUX0ZVTkNUSU9OOgotCQlyZXR1cm4gTWFrZUFJRigiJi9pczQiLCBleHApOwotCWNhc2UgVF9WT0lEX1BUUjoKLQkJYWMgPSBWb2lkVG9BSUYoMCwgMCk7Ci0JCWEgPSBHZXRBSUZQb2ludGVyKEdldFZhclZhbHVlKHZhci0+bmFtZSksIGFjKTsKLQkJQUlGRnJlZShhYyk7Ci0JCXJldHVybiBhOwotCWNhc2UgVF9FTlVNOgotCQlyZXR1cm4gKHZhci0+dHlwZVs0XSA9PSAnICcpID8gRW1wdHlFbnVtVG9BSUYoJnZhci0+dHlwZVs1XSkgOiBFbXB0eUVudW1Ub0FJRihOVUxMKTsKLQljYXNlIFRfT1RIRVI6Ci0JCWlmIChleHAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCi0JCXJldHVybiBHZXRTaW1wbGVBSUYodmFyLCBOVUxMKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gR2V0UHJpbWl0aXZlQUlGKGlkLCBHZXRWYXJWYWx1ZSh2YXItPm5hbWUpKTsKLQl9Ci19Ci0KLXN0YXRpYyBBSUYqCi1HZXROYW1lZEFJRihBSUYgKmEsIGludCBuYW1lZCkKLXsKLQlpZiAoRkRTVHlwZShBSUZfRk9STUFUKGEpKSAhPSBBSUZfTkFNRSkgewotCQlyZXR1cm4gTmFtZUFJRihhLCBuYW1lZCk7Ci0JfQotCXJldHVybiBhOwotfQotCi1zdGF0aWMgQUlGICoKLUdldFN0cnVjdEFJRihNSVZhciAqdmFyLCBpbnQgbmFtZWQpCi17Ci0JaW50CQlpOwotCU1JVmFyICoJdjsKLQlBSUYgKglhOwotCUFJRiAqCWFjOwotCWNoYXIgKnBjaDsKLQljaGFyICpzdHJ1Y3RfbmFtZSA9IHN0cmR1cCh2YXItPnR5cGUpOwotCW5hbWVkKys7Ci0KLQlpZiAoKHBjaCA9IHN0cmNocihzdHJ1Y3RfbmFtZSwgJyAnKSkgIT0gTlVMTCkgewotCQlwY2grKzsKLQkJYSA9IEVtcHR5U3RydWN0VG9BSUYocGNoKTsKLQl9Ci0JZWxzZSB7Ci0JCWEgPSBFbXB0eVN0cnVjdFRvQUlGKHN0cnVjdF9uYW1lKTsKLQl9Ci0JZnJlZShzdHJ1Y3RfbmFtZSk7Ci0KLQlmb3IgKGk9MDsgaTx2YXItPm51bWNoaWxkOyBpKyspIHsKLQkJdiA9IHZhci0+Y2hpbGRyZW5baV07Ci0JCS8vY2hlY2sgd2hldGhlciBjaGlsZCBjb250YWlucyBwYXJlbnQKLQkJaWYgKHN0cmNtcCh2YXItPnR5cGUsIHYtPnR5cGUpID09IDAgJiYgc3RyY21wKHZhci0+bmFtZSwgdi0+bmFtZSkpIHsKLQkJCWEgPSBHZXROYW1lZEFJRihhLCBuYW1lZCk7Ci0JCQlhYyA9IEFJRk51bGwoYSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKGFjID0gR2V0QUlGKHYsIHYtPmV4cCwgbmFtZWQpKSA9PSBOVUxMKSB7Ci0JCQkJQUlGRnJlZShhKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlBSUZBZGRGaWVsZFRvU3RydWN0KGEsIHYtPmV4cCwgYWMpOwotCX0KLQlyZXR1cm4gYTsKLX0KLQotc3RhdGljIEFJRiAqCi1HZXRVbmlvbkFJRihNSVZhciAqdmFyLCBpbnQgbmFtZWQpCi17Ci0JaW50CQlpOwotCU1JVmFyICoJdjsKLQlBSUYgKglhOwotCUFJRiAqCWFjOwotCWNoYXIgKnVuaW9uX25hbWUgPSBOVUxMOwotCW5hbWVkKys7Ci0KLQlpZiAodmFyLT50eXBlWzVdID09ICcgJykgewotCQl1bmlvbl9uYW1lID0gc3RyZHVwKCZ2YXItPnR5cGVbNl0pOwotCX0KLQlhID0gRW1wdHlVbmlvblRvQUlGKHVuaW9uX25hbWUpOwotCWlmICh1bmlvbl9uYW1lICE9IE5VTEwpCi0JCWZyZWUodW5pb25fbmFtZSk7Ci0KLQlmb3IgKGk9MDsgaTx2YXItPm51bWNoaWxkOyBpKyspIHsKLQkJdiA9IHZhci0+Y2hpbGRyZW5baV07Ci0JCS8vY2hlY2sgd2hldGhlciBjaGlsZCBjb250YWlucyBwYXJlbnQKLQkJaWYgKHN0cmNtcCh2YXItPnR5cGUsIHYtPnR5cGUpID09IDAgJiYgc3RyY21wKHZhci0+bmFtZSwgdi0+bmFtZSkpIHsKLQkJCWEgPSBHZXROYW1lZEFJRihhLCBuYW1lZCk7Ci0JCQlhYyA9IEFJRk51bGwoYSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKGFjID0gR2V0QUlGKHYsIHYtPmV4cCwgbmFtZWQpKSA9PSBOVUxMKSB7Ci0JCQkJQUlGRnJlZShhKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlBSUZBZGRGaWVsZFRvVW5pb24oYSwgdi0+ZXhwLCBBSUZfRk9STUFUKGFjKSk7Ci0KLQkJLy9TZXQgdGhlIHVuaW9uIHZhbHVlCi0JCWlmIChpID09IHZhci0+bnVtY2hpbGQgLSAxKQotCQkJQUlGU2V0VW5pb24oYSwgdi0+ZXhwLCBhYyk7Ci0KLQkJQUlGRnJlZShhYyk7Ci0JfQotCXJldHVybiBhOwotfQotCi1zdGF0aWMgQUlGICoKLUdldEFycmF5QUlGKE1JVmFyICp2YXIsIGludCBuYW1lZCkKLXsKLQlpbnQJCWk7Ci0JTUlWYXIgKgl2OwotCUFJRiAqCWEgPSBOVUxMOwotCUFJRiAqCWFjOwotCi0JZm9yIChpID0gMDsgaSA8IHZhci0+bnVtY2hpbGQ7IGkrKykgewotCQl2ID0gdmFyLT5jaGlsZHJlbltpXTsKLQkJaWYgKChhYyA9IEdldEFJRih2LCB2LT5leHAsIG5hbWVkKSkgPT0gTlVMTCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGEgPT0gTlVMTCkKLQkJCWEgPSBFbXB0eUFycmF5VG9BSUYoMCwgdmFyLT5udW1jaGlsZC0xLCBhYyk7Ci0JCUFJRkFkZEFycmF5RWxlbWVudChhLCBpLCBhYyk7Ci0JCUFJRkZyZWUoYWMpOwotCX0KLQlyZXR1cm4gYTsKLX0KLQotc3RhdGljIEFJRiAqCi1HZXRQb2ludGVyQUlGKE1JVmFyICp2YXIsIGludCBuYW1lZCkKLXsKLQlBSUYgKmFjOwotCUFJRiAqYTsKLQlpbnQgaWQ7Ci0KLQl2YXItPnR5cGVbc3RybGVuKHZhci0+dHlwZSkgLSAxXSA9ICdcMCc7IC8vcmVtb3ZlIHBvaW50ZXIKLQl3aGlsZSAodmFyLT50eXBlW3N0cmxlbih2YXItPnR5cGUpIC0gMV0gPT0gJyAnKSB7Ly9yZW1vdmUgd2hpbGVzcGFjZQotCQl2YXItPnR5cGVbc3RybGVuKHZhci0+dHlwZSkgLSAxXSA9ICdcMCc7Ci0JfQotCi0JaWQgPSBnZXRfY29tcGxleF90eXBlKHZhci0+dHlwZSk7Ci0Jc3dpdGNoIChpZCkgewotCQljYXNlIFRfUE9JTlRFUjoKLQkJCWFjID0gR2V0QUlGKHZhci0+Y2hpbGRyZW5bMF0sIHZhci0+Y2hpbGRyZW5bMF0tPmV4cCwgbmFtZWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVF9DSEFSX1BUUjoKLQkJCXJldHVybiBHZXRDaGFyUG9pbnRlckFJRihHZXRWYXJWYWx1ZSh2YXItPmNoaWxkcmVuWzBdLT5uYW1lKSk7Ci0JCWNhc2UgVF9VTklPTjoKLQkJCWFjID0gR2V0VW5pb25BSUYodmFyLCBuYW1lZCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmICh2YXItPm51bWNoaWxkID09IDEpIHsKLQkJCQlhYyA9IEdldEFJRih2YXItPmNoaWxkcmVuWzBdLCB2YXItPmNoaWxkcmVuWzBdLT5leHAsIG5hbWVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjID0gR2V0U3RydWN0QUlGKHZhciwgbmFtZWQpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJYWMgPSBWb2lkVG9BSUYoMCwgMCk7Ci0JfQotCWEgPSBHZXRBSUZQb2ludGVyKEdldFZhclZhbHVlKHZhci0+bmFtZSksIGFjKTsKLQlBSUZGcmVlKGFjKTsKLQlyZXR1cm4gYTsKLX0KLQotc3RhdGljIEFJRiAqCi1HZXRDb21wbGV4QUlGKE1JVmFyICp2YXIsIGNoYXIgKmV4cCwgaW50IG5hbWVkKQotewotCWludCBpZCA9IGdldF9jb21wbGV4X3R5cGUodmFyLT50eXBlKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBUX0FSUkFZOgotCQlyZXR1cm4gR2V0QXJyYXlBSUYodmFyLCBuYW1lZCk7Ci0JY2FzZSBUX0NIQVJfUFRSOgotCQlyZXR1cm4gR2V0Q2hhclBvaW50ZXJBSUYoR2V0VmFyVmFsdWUodmFyLT5uYW1lKSk7Ci0JY2FzZSBUX1BPSU5URVI6Ci0JCXJldHVybiBHZXRQb2ludGVyQUlGKHZhciwgbmFtZWQpOwotCWNhc2UgVF9VTklPTjoKLQkJcmV0dXJuIEdldFVuaW9uQUlGKHZhciwgbmFtZWQpOwotCWRlZmF1bHQ6Ly9zdHJ1Y3QKLQkJcmV0dXJuIEdldFN0cnVjdEFJRih2YXIsIG5hbWVkKTsKLQl9Ci19Ci0KLXN0YXRpYyBBSUYgKgotR2V0QUlGKE1JVmFyICp2YXIsIGNoYXIgKmV4cCwgaW50IG5hbWVkKQotewotCU1JQ29tbWFuZAkqY21kOwotCi0JaWYgKHN0cmNtcCh2YXItPnR5cGUsICI8dGV4dCB2YXJpYWJsZSwgbm8gZGVidWcgaW5mbz4iKSA9PSAwKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9OT1NZTVMsICIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh2YXItPm51bWNoaWxkID09IDApIHsgLy9zaW1wbGUgdHlwZQotCQlyZXR1cm4gR2V0U2ltcGxlQUlGKHZhciwgZXhwKTsKLQl9Ci0JLy9jb21wbGV4IHR5cGUKLQljbWQgPSBNSVZhckxpc3RDaGlsZHJlbih2YXItPm5hbWUpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCWlmIChNSUNvbW1hbmRSZXN1bHRDbGFzcyhjbWQpID09IE1JUmVzdWx0UmVjb3JkRVJST1IpIHsKLQkJCWNoYXIgKmVyciA9IE1JQ29tbWFuZFJlc3VsdEVycm9yTWVzc2FnZShjbWQpOwotCQkJaWYgKGVyciAhPSBOVUxMKSB7Ci0JCQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCBlcnIpOwotCQkJCWZyZWUoZXJyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAiZ290IGVycm9yIGZyb20gZ2RiLCBidXQgbm8gbWVzc2FnZSIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAiYmFkIHJlc3BvbnNlIGZyb20gZ2RiIik7Ci0JCX0KLQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JTUlHZXRWYXJMaXN0Q2hpbGRyZW5JbmZvKHZhciwgY21kKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQlyZXR1cm4gR2V0Q29tcGxleEFJRih2YXIsIGV4cCwgbmFtZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBBUlRJQUwgQUlGICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBBSUYgKgotR2V0UGFydGlhbEFycmF5QUlGKE1JVmFyICp2YXIpCi17Ci0JQUlGICphID0gTlVMTDsKLQlBSUYgKmFjOwotCWludCBpOwotCWNoYXIgKnBjaDsKLQljaGFyICpwdDsKLQlpbnQgaWQ7Ci0KLQlpZiAodmFyLT5jaGlsZHJlbiA9PSBOVUxMKSB7Ci0JCXBjaCA9IHN0cmNocih2YXItPnR5cGUsICdbJyk7Ci0JCSpwY2ggPSAnXDAnOwotCQl3aGlsZSAodmFyLT50eXBlW3N0cmxlbih2YXItPnR5cGUpIC0gMV0gPT0gJyAnKSB7Ly9yZW1vdmUgd2hpbGVzcGFjZQotCQkJdmFyLT50eXBlW3N0cmxlbih2YXItPnR5cGUpIC0gMV0gPSAnXDAnOwotCQl9Ci0JCWlkID0gZ2V0X3NpbXBsZV90eXBlKHZhci0+dHlwZSk7Ci0JCWlmIChpZCA9PSBUX09USEVSKSB7Ci0JCQlwdCA9IEdldFB0eXBlVmFsdWUodmFyLT50eXBlKTsKLQkJCWlmIChwdCAhPSBOVUxMKSB7Ci0JCQkJdmFyLT50eXBlID0gc3RyZHVwKHB0KTsKLQkJCQlpZCA9IGdldF9zaW1wbGVfdHlwZSh2YXItPnR5cGUpOwotCQkJCWZyZWUocHQpOwotCQkJfQotCQl9Ci0JCWFjID0gR2V0UHJpbWl0aXZlQUlGKGlkLCAiIik7Ci0JCWEgPSBFbXB0eUFycmF5VG9BSUYoMCwgdmFyLT5udW1jaGlsZC0xLCBhYyk7Ci0JCUFJRkZyZWUoYWMpOwotCX0KLQllbHNlIHsKLQkJZm9yIChpPTA7IGk8dmFyLT5udW1jaGlsZDsgaSsrKSB7Ci0JCQlhYyA9IEdldFBhcnRpYWxBSUYodmFyLT5jaGlsZHJlbltpXSwgTlVMTCk7Ci0JCQlpZiAoYSA9PSBOVUxMKSB7Ci0JCQkJYSA9IEVtcHR5QXJyYXlUb0FJRigwLCB2YXItPm51bWNoaWxkLTEsIGFjKTsKLQkJCX0KLQkJCUFJRkFkZEFycmF5RWxlbWVudChhLCBpLCBhYyk7Ci0JCQlBSUZGcmVlKGFjKTsKLQkJfQotCX0KLQlyZXR1cm4gYTsKLX0KLQotc3RhdGljIEFJRiAqCi1HZXRQYXJ0aWFsU3RydWN0QUlGKE1JVmFyICp2YXIpCi17Ci0JQUlGICphYzsKLQlBSUYgKmE7Ci0JaW50IGk7Ci0JY2hhciAqcGNoOwotCWNoYXIgKnN0cnVjdF9uYW1lID0gc3RyZHVwKHZhci0+dHlwZSk7Ci0KLQlpZiAoKHBjaCA9IHN0cmNocihzdHJ1Y3RfbmFtZSwgJyAnKSkgIT0gTlVMTCkgewotCQlwY2grKzsKLQkJYSA9IEVtcHR5U3RydWN0VG9BSUYocGNoKTsKLQl9Ci0JZWxzZSB7Ci0JCWEgPSBFbXB0eVN0cnVjdFRvQUlGKHN0cnVjdF9uYW1lKTsKLQl9Ci0JZnJlZShzdHJ1Y3RfbmFtZSk7Ci0KLQlpZiAodmFyLT5jaGlsZHJlbiAhPSBOVUxMKSB7Ci0JCWZvciAoaT0wOyBpPHZhci0+bnVtY2hpbGQ7IGkrKykgewotCQkJYWMgPSBHZXRQYXJ0aWFsQUlGKHZhci0+Y2hpbGRyZW5baV0sIHZhci0+Y2hpbGRyZW5baV0tPmV4cCk7Ci0JCQlBSUZBZGRGaWVsZFRvU3RydWN0KGEsIHZhci0+Y2hpbGRyZW5baV0tPmV4cCwgYWMpOwotCQkJQUlGRnJlZShhYyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyBBSUYgKgotR2V0UGFydGlhbFVuaW9uQUlGKE1JVmFyICp2YXIpCi17Ci0JQUlGICphYzsKLQlBSUYgKmE7Ci0JaW50IGk7Ci0JY2hhciAqdW5pb25fbmFtZSA9IE5VTEw7Ci0KLQlpZiAodmFyLT50eXBlWzVdID09ICcgJykgewotCQl1bmlvbl9uYW1lID0gc3RyZHVwKCZ2YXItPnR5cGVbNl0pOwotCX0KLQlhID0gRW1wdHlVbmlvblRvQUlGKHVuaW9uX25hbWUpOwotCWlmICh1bmlvbl9uYW1lICE9IE5VTEwpCi0JCWZyZWUodW5pb25fbmFtZSk7Ci0KLQlpZiAodmFyLT5jaGlsZHJlbiAhPSBOVUxMKSB7Ci0JCWZvciAoaT0wOyBpPHZhci0+bnVtY2hpbGQ7IGkrKykgewotCQkJYWMgPSBHZXRQYXJ0aWFsQUlGKHZhci0+Y2hpbGRyZW5baV0sIHZhci0+Y2hpbGRyZW5baV0tPmV4cCk7Ci0JCQlBSUZBZGRGaWVsZFRvVW5pb24oYSwgdmFyLT5jaGlsZHJlbltpXS0+ZXhwLCBBSUZfRk9STUFUKGFjKSk7Ci0JCQlpZiAoaSA9PSB2YXItPm51bWNoaWxkIC0gMSkgewotCQkJCUFJRlNldFVuaW9uKGEsIHZhci0+Y2hpbGRyZW5baV0tPmV4cCwgYWMpOwotCQkJfQotCQkJQUlGRnJlZShhYyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyBBSUYgKgotR2V0UGFydGlhbFBvaW50ZXJBSUYoTUlWYXIgKnZhcikKLXsKLQlBSUYgKmFjOwotCUFJRiAqYTsKLQlpbnQgaWQ7Ci0KLQlpZiAodmFyLT5jaGlsZHJlbiAhPSBOVUxMKSB7Ci0JCXZhci0+dHlwZVtzdHJsZW4odmFyLT50eXBlKSAtIDFdID0gJ1wwJzsgLy9yZW1vdmUgcG9pbnRlcgotCQl3aGlsZSAodmFyLT50eXBlW3N0cmxlbih2YXItPnR5cGUpIC0gMV0gPT0gJyAnKSB7Ly9yZW1vdmUgd2hpbGVzcGFjZQotCQkJdmFyLT50eXBlW3N0cmxlbih2YXItPnR5cGUpIC0gMV0gPSAnXDAnOwotCQl9Ci0KLQkJaWQgPSBnZXRfY29tcGxleF90eXBlKHZhci0+dHlwZSk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgVF9DSEFSX1BUUjoKLQkJCQkvL3JlcGxhY2UgbWluYW1lCi0JCQkJdmFyLT5uYW1lID0gc3RyZHVwKHZhci0+Y2hpbGRyZW5bMF0tPmV4cCk7Ci0JCQkJYSA9IEdldENoYXJQb2ludGVyQUlGKEdldFZhclZhbHVlKHZhci0+Y2hpbGRyZW5bMF0tPm5hbWUpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9QT0lOVEVSOgotCQkJCS8vcmVwbGFjZSBtaW5hbWUKLQkJCQl2YXItPm5hbWUgPSBzdHJkdXAodmFyLT5jaGlsZHJlblswXS0+ZXhwKTsKLQkJCQlhYyA9IFZvaWRUb0FJRigwLCAwKTsKLQkJCQlhID0gR2V0QUlGUG9pbnRlcihHZXRWYXJWYWx1ZSh2YXItPmNoaWxkcmVuWzBdLT5uYW1lKSwgYWMpOwotCQkJCUFJRkZyZWUoYWMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUX1VOSU9OOgotCQkJCWEgPSBHZXRQYXJ0aWFsVW5pb25BSUYodmFyKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKHZhci0+bnVtY2hpbGQgPT0gMSkgewotCQkJCQkvL3JlcGxhY2UgbWluYW1lCi0JCQkJCXZhci0+bmFtZSA9IHN0cmR1cCh2YXItPmNoaWxkcmVuWzBdLT5leHApOwotCQkJCQlhID0gR2V0UGFydGlhbEFJRih2YXItPmNoaWxkcmVuWzBdLCB2YXItPmNoaWxkcmVuWzBdLT5leHApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYSA9IEdldFBhcnRpYWxTdHJ1Y3RBSUYodmFyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlkID0gZ2V0X2NvbXBsZXhfdHlwZSh2YXItPnR5cGUpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIFRfQ0hBUl9QVFI6Ci0JCQkJYSA9IEdldENoYXJQb2ludGVyQUlGKEdldFZhclZhbHVlKHZhci0+bmFtZSkpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlhYyA9IFZvaWRUb0FJRigwLCAwKTsKLQkJCQlhID0gR2V0QUlGUG9pbnRlcihHZXRWYXJWYWx1ZSh2YXItPm5hbWUpLCBhYyk7Ci0JCQkJQUlGRnJlZShhYyk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyBBSUYgKgotR2V0UGFydGlhbENvbXBsZXhBSUYoTUlWYXIgKnZhciwgY2hhciAqZXhwKQotewotCWNoYXIgKnB0OwotCWludCBpZCA9IGdldF9jb21wbGV4X3R5cGUodmFyLT50eXBlKTsKLQlpZiAoaWQgPT0gVF9PVEhFUikgewotCQlwdCA9IEdldFB0eXBlVmFsdWUodmFyLT50eXBlKTsKLQkJaWYgKHB0ICE9IE5VTEwpIHsKLQkJCXZhci0+dHlwZSA9IHB0OwotCQkJaWQgPSBnZXRfY29tcGxleF90eXBlKHZhci0+dHlwZSk7Ci0JCX0KLQl9Ci0Jc3dpdGNoIChpZCkgewotCWNhc2UgVF9BUlJBWToKLQkJcmV0dXJuIEdldFBhcnRpYWxBcnJheUFJRih2YXIpOwotCWNhc2UgVF9DSEFSX1BUUjoKLQkJcmV0dXJuIEdldENoYXJQb2ludGVyQUlGKEdldFZhclZhbHVlKHZhci0+bmFtZSkpOwotCWNhc2UgVF9QT0lOVEVSOgotCQlyZXR1cm4gR2V0UGFydGlhbFBvaW50ZXJBSUYodmFyKTsKLQljYXNlIFRfVU5JT046Ci0JCXJldHVybiBHZXRQYXJ0aWFsVW5pb25BSUYodmFyKTsKLQlkZWZhdWx0Oi8vc3RydWN0Ci0JCXJldHVybiBHZXRQYXJ0aWFsU3RydWN0QUlGKHZhcik7Ci0JfQotfQotCi1zdGF0aWMgQUlGICoKLUdldFBhcnRpYWxBSUYoTUlWYXIgKnZhciwgY2hhciAqZXhwKQotewotCWlmIChzdHJjbXAodmFyLT50eXBlLCAiPHRleHQgdmFyaWFibGUsIG5vIGRlYnVnIGluZm8+IikgPT0gMCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfTk9TWU1TLCAiIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAodmFyLT5udW1jaGlsZCA9PSAwKSB7Ci0JCXJldHVybiBHZXRTaW1wbGVBSUYodmFyLCBleHApOwotCX0KLQlyZXR1cm4gR2V0UGFydGlhbENvbXBsZXhBSUYodmFyLCBleHApOwotfQotCi1zdGF0aWMgTUlWYXIgKgotR2V0Q2hpbGRyZW5NSVZhcihjaGFyICptaXZhcl9uYW1lLCBNSVZhciAqbWl2YXIsIGludCBzaG93UGFyZW50VHlwZSkKLXsKLQlNSUNvbW1hbmQgKmNtZDsKLQotCWlmIChzaG93UGFyZW50VHlwZSB8fCBtaXZhciA9PSBOVUxMKSB7Ci0JCWNtZCA9IE1JVmFySW5mb1R5cGUobWl2YXJfbmFtZSk7Ci0JCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQkJTUlDb21tYW5kRnJlZShjbWQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWl2YXIgPSBNSUdldFZhckluZm9UeXBlKGNtZCk7Ci0JCW1pdmFyLT5uYW1lID0gc3RyZHVwKG1pdmFyX25hbWUpOwotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JfQotCWNtZCA9IE1JVmFyTGlzdENoaWxkcmVuKG1pdmFyX25hbWUpOwotCVNlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JaWYgKCFNSUNvbW1hbmRSZXN1bHRPSyhjbWQpKSB7Ci0JCU1JQ29tbWFuZEZyZWUoY21kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCU1JR2V0VmFyTGlzdENoaWxkcmVuSW5mbyhtaXZhciwgY21kKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JcmV0dXJuIG1pdmFyOwotfQotCi1zdGF0aWMgTUlWYXIgKgotR2V0TUlWYXJEZXRhaWxzKGNoYXIgKm5hbWUpCi17Ci0JTUlDb21tYW5kICpjbWQ7Ci0JTUlWYXIgKm1pdmFyOwotCi0JY21kID0gTUlWYXJJbmZvVHlwZShuYW1lKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCWlmICghTUlDb21tYW5kUmVzdWx0T0soY21kKSkgewotCQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltaXZhciA9IE1JR2V0VmFySW5mb1R5cGUoY21kKTsKLQltaXZhci0+bmFtZSA9IHN0cmR1cChuYW1lKTsKLQlNSUNvbW1hbmRGcmVlKGNtZCk7Ci0KLQljbWQgPSBNSVZhckluZm9OdW1DaGlsZHJlbihuYW1lKTsKLQlTZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCU1JR2V0VmFySW5mb051bUNoaWxkcmVuKGNtZCwgbWl2YXIpOwotCU1JQ29tbWFuZEZyZWUoY21kKTsKLQlyZXR1cm4gbWl2YXI7Ci19Ci0KLXN0YXRpYyBpbnQKLUdEQkdldFBhcnRpYWxBSUYoY2hhciogbmFtZSwgY2hhcioga2V5LCBpbnQgbGlzdENoaWxkcmVuLCBpbnQgZXhwcmVzcykKLXsKLQlNSVZhciAqbWl2YXI7Ci0JQUlGICphOwotCWRiZ19ldmVudCAqCWU7Ci0JY2hhciogdmFyX25hbWU7Ci0KLQlDSEVDS19TRVNTSU9OKCk7Ci0KLQkvL2tleSBpcyBmaXJzdCBwZXJmZXJlbmNlIGlmIGl0IGV4aXN0cwotCXZhcl9uYW1lID0gKGtleSA9PSBOVUxMIHx8IHN0cmxlbihrZXkpID09IDApP25hbWU6a2V5OwotCi0JaWYgKGV4cHJlc3MpIHsKLQkJbWl2YXIgPSBHZXRNSVZhckRldGFpbHModmFyX25hbWUpOwotCX0KLQllbHNlIHsKLQkJLy9AIC0gZm9yIHBhcnRpYWwgYXJyYXkKLQkJaWYgKCFsaXN0Q2hpbGRyZW4gfHwgc3RyY2hyKHZhcl9uYW1lLCAnQCcpICE9IE5VTEwpIHsKLQkJCW1pdmFyID0gQ3JlYXRlTUlWYXIodmFyX25hbWUpOwotCQkJaWYgKGxpc3RDaGlsZHJlbikgewotCQkJCW1pdmFyID0gR2V0Q2hpbGRyZW5NSVZhcihtaXZhci0+bmFtZSwgbWl2YXIsIDApOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJbWl2YXIgPSBHZXRDaGlsZHJlbk1JVmFyKHZhcl9uYW1lLCBOVUxMLCAxKTsKLQkJfQotCX0KLQotCWlmIChtaXZhciA9PSBOVUxMKSB7Ci0JCS8vdHJ5IGFnYWluIHdpdGggb3JpZ2luYWwgdmFyaWFibGUgbmFtZQotCQl2YXJfbmFtZSA9IG5hbWU7Ci0JCWlmICgobWl2YXIgPSBDcmVhdGVNSVZhcih2YXJfbmFtZSkpID09IE5VTEwpIHsKLQkJCURiZ1NldEVycm9yKERCR0VSUl9VTktOT1dOX1ZBUklBQkxFLCB2YXJfbmFtZSk7Ci0JCQlyZXR1cm4gREJHUkVTX0VSUjsKLQkJfQotCX0KLQlpZiAoKGEgPSBHZXRQYXJ0aWFsQUlGKG1pdmFyLCB2YXJfbmFtZSkpID09IE5VTEwpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX1VOS05PV05fVFlQRSwgbWl2YXItPnR5cGUpOwotCQlNSVZhckZyZWUobWl2YXIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfQkFDS0VORCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR0RCR2V0UGFydGlhbEFJRiBmb3VuZCBrZXk6ICVzLCBmb3JtYXQ6ICVzXG4iLCBtaXZhci0+bmFtZSwgQUlGX0ZPUk1BVChhKSk7Ci0KLQllID0gTmV3RGJnRXZlbnQoREJHRVZfUEFSVElBTF9BSUYpOwotCWUtPmRiZ19ldmVudF91LnBhcnRpYWxfYWlmX2V2ZW50LmRhdGEgPSBhOwotCWUtPmRiZ19ldmVudF91LnBhcnRpYWxfYWlmX2V2ZW50LnR5cGVfZGVzYyA9IHN0cmR1cChtaXZhci0+dHlwZSk7Ci0JZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQubmFtZSA9IHN0cmR1cChtaXZhci0+bmFtZSk7Ci0KLQlNSVZhckZyZWUobWl2YXIpOwotCVNhdmVFdmVudChlKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLUdEQk1JVmFyRGVsZXRlKGNoYXIgKm5hbWUpCi17Ci0JQ0hFQ0tfU0VTU0lPTigpOwotCURlbGV0ZU1JVmFyKG5hbWUpOwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLSNpZiAwCi1jaGFyIHRvaGV4W10gPQl7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0JCQkJICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnfTsKLQotc3RhdGljIGludAotR0RCTUlCdWlsZEFJRlZhcihjaGFyICp2YXIsIGNoYXIgKnR5cGUsIGNoYXIgKmZpbGUsIEFJRiAqKmFpZikKLXsKLQlpbnQJCQluOwotCWludAkJCWZkOwotCWNoYXIgKgkJZGF0YTsKLQljaGFyICoJCWFwOwotCWNoYXIgKgkJYnA7Ci0JY2hhcgkJCWJ1ZltCVUZTSVpdOwotCXN0cnVjdCBzdGF0CXNiOwotCi0JaWYgKCBzdGF0KGZpbGUsICZzYikgPCAwICkKLQl7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgKGNoYXIgKilzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlpZiAoIEZEU1R5cGUodHlwZSkgPT0gQUlGX0ZVTkNUSU9OICkKLQl7Ci0JCS8qCi0JCSoqIERhdGEgaXMgZnVuY3Rpb24gbmFtZQotCQkqLwotCQlhcCA9IGRhdGEgPSBtYWxsb2Moc3RybGVuKHZhcikgKiAyICsgMSk7Ci0KLQkJZm9yICggYnAgPSB2YXIgOyAqYnAgIT0gJ1wwJyA7IGJwKysgKQotCQl7Ci0JCQkqYXArKyA9IHRvaGV4WygqYnAgPj4gNCkgJiAweGZdOwotCQkJKmFwKysgPSB0b2hleFsqYnAgJiAweGZdOwotCQl9Ci0KLQkJKmFwKysgPSAnXDAnOwotCX0KLQllbHNlCi0JewotCQlpZiAoIChmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpKSA8IDAgKQotCQl7Ci0JCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsIChjaGFyICopc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybiBEQkdSRVNfRVJSOwotCQl9Ci0KLQkJYXAgPSBkYXRhID0gbWFsbG9jKHNiLnN0X3NpemUgKiAyICsgMSk7Ci0KLQkJd2hpbGUgKChuID0gcmVhZChmZCwgYnVmLCBCVUZTSVopKSA+IDApCi0JCXsKLQkJCWJwID0gYnVmOwotCi0JCQl3aGlsZSAoIG4tLSA+IDAgKQotCQkJewotCQkJCSphcCsrID0gdG9oZXhbKCpicCA+PiA0KSAmIDB4Zl07Ci0JCQkJKmFwKysgPSB0b2hleFsqYnArKyAmIDB4Zl07Ci0JCQl9Ci0JCX0KLQotCQkqYXArKyA9ICdcMCc7Ci0KLQkJKHZvaWQpY2xvc2UoZmQpOwotCX0KLQotCWlmICggRkRTVHlwZSh0eXBlKSA9PSBBSUZfUE9JTlRFUiApCi0JewotCQkvKgotCQkgKiBOZWVkIHRvIGFkZCBtYXJrZXIgdG8gZGF0YQotCQkgKi8KLQkJYXAgPSBtYWxsb2Moc2Iuc3Rfc2l6ZSAqIDIgKyAzKTsKLQkJKmFwKysgPSAnMCc7Ci0JCSphcCsrID0gJzEnOyAvLyBub3JtYWwgcG9pbnRlcgotCQltZW1jcHkoYXAsIGRhdGEsIHNiLnN0X3NpemUgKiAyICsgMSk7Ci0JCWRhdGEgPSBhcDsKLQl9Ci0KLQlpZiAoICgqYWlmID0gQXNjaWlUb0FJRih0eXBlLCBkYXRhKSkgPT0gTlVMTCApCi0JewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsIEFJRkVycm9yU3RyKCkpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvc2VydmVyLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvc2VydmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyN2VkN2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvc2VydmVyL3NlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBzZXJ2ZXIoKSBoYXMgdHdvIHJvbGVzLiBUaGUgZmlyc3QgaXMgdG8gbGF1bmNoIHRoZSBwcm9jZXNzIGJlaW5nIGRlYnVnZ2VkCi0gKiAoZGVidWdnZWUpIHVuZGVyIHRoZSBjb250cm9sIG9mIGEgZGVidWdnZXIgKHVzKS4gVGhlIHNlY29uZCBpcyB0byBtYW5hZ2UKLSAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgY2xpZW50IHByb2Nlc3MuCi0gKgotICogTm90ZSB0aGF0IHRoZXJlIHdpbGwgYmUgbnVtX3Byb2NzKzEgWzAuLm51bV9wcm9jc10gcHJvY2Vzc2VzIGluIG91cgotICogY29tbXVuaWNhdG9yLCB3aGVyZSBudW1fcHJvY3MgaXMgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgaW4gdGhlIHBhcmFsbGVsCi0gKiBqb2IgYmVpbmcgZGVidWdnZWQuIFRvIHNpbXBsaWZ5IHRoZSBhY2NvdW50aW5nLCB3ZSB1c2UgdGhlIHRhc2sgaWQgb2YKLSAqIG51bV9wcm9jcyBhcyB0aGUgY2xpZW50IHRhc2sgaWQgYW5kIFswLi5udW1fcHJvY3MtMV0gZm9yIHRoZSBzZXJ2ZXIKLSAqIHRhc2sgaWRzLgotICovCi0KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYgLyogX19nbnVfbGludXhfXyAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJiYWNrZW5kLmgiCi0jaW5jbHVkZSAicHJveHkuaCIKLSNpbmNsdWRlICJwcm94eV90Y3AuaCIKLSNpbmNsdWRlICJzZG0uaCIKLQotZXh0ZXJuIGludAlzdnJfaW5pdChkYmdfYmFja2VuZCAqLCB2b2lkICgqKShkYmdfZXZlbnQgKiwgaW50KSk7Ci1leHRlcm4gaW50CXN2cl9kaXNwYXRjaChkYmdfYmFja2VuZCAqLCBjaGFyICosIGludCwgaW50KTsKLWV4dGVybiBpbnQJc3ZyX3Byb2dyZXNzKGRiZ19iYWNrZW5kICopOwotZXh0ZXJuIGludAlzdnJfaXNzaHV0ZG93bih2b2lkKTsKLQotc3RhdGljIGRiZ19iYWNrZW5kICoJYmFja2VuZDsKLQotY2hhciAqCi1zdHJpbmdpZnkoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCXN0YXRpYyBjaGFyICoJc3RyX2J1ZiA9IE5VTEw7Ci0KLQlpZiAoc3RyX2J1ZiAhPSBOVUxMKSB7Ci0JCWZyZWUoc3RyX2J1Zik7Ci0JfQotCi0Jc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOwotCi0JbWVtY3B5KHN0cl9idWYsIGJ1ZiwgbGVuKTsKLQlzdHJfYnVmW2xlbl0gPSAnXDAnOwotCi0JcmV0dXJuIHN0cl9idWY7Ci19Ci0KLS8qCi0gKiBBZ2dyZWdhdGUgZGVidWdnZXIgcmVzcG9uc2UuCi0gKi8KLXN0YXRpYyB2b2lkCi1ldmVudF9jYWxsYmFjayhkYmdfZXZlbnQgKmUsIGludCBkYXRhKQotewotCWludAkJCWxlbjsKLQljaGFyICoJCWJ1ZjsKLQlzZG1fbWVzc2FnZQltc2c7Ci0KLQlpZiAoRGJnU2VyaWFsaXplRXZlbnQoZSwgJmJ1ZiwgJmxlbikgPCAwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfU0VSVkVSLCAiWyVkXSBzZXJ2ZXIgZXZlbnRfY2FsbGJhY2sgJyVzJ1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpLCBzdHJpbmdpZnkoYnVmLCBsZW4pKTsKLQotCW1zZyA9IHNkbV9tZXNzYWdlX25ldyhidWYsIGxlbik7Ci0Jc2RtX21lc3NhZ2Vfc2V0X2lkKG1zZywgZGF0YSk7Ci0Jc2RtX3NldF9hZGRfZWxlbWVudChzZG1fbWVzc2FnZV9nZXRfZGVzdGluYXRpb24obXNnKSwgU0RNX01BU1RFUik7Ci0Jc2RtX2FnZ3JlZ2F0ZV9tZXNzYWdlKG1zZywgU0RNX0FHR1JFR0FURV9VUFNUUkVBTSB8IFNETV9BR0dSRUdBVEVfSU5JVCk7Ci19Ci0KLS8qCi0gKiBEaXNwYXRjaCBwYXlsb2FkIHRvIGRlYnVnZ2VyLgotICovCi1zdGF0aWMgdm9pZAotZGVsaXZlcl9jYWxsYmFjayhjb25zdCBzZG1fbWVzc2FnZSBtc2cpCi17Ci0JaW50CQlpZDsKLQlpbnQJCWxlbjsKLQljaGFyICoJYnVmOwotCi0JREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX1NFUlZFUiwgIlslZF0gRW50ZXIgZGVsaXZlcl9jYWxsYmFja1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQotCXNkbV9tZXNzYWdlX2dldF9wYXlsb2FkKG1zZywgJmJ1ZiwgJmxlbik7Ci0JaWQgPSBzZG1fbWVzc2FnZV9nZXRfaWQobXNnKTsKLQkodm9pZClzdnJfZGlzcGF0Y2goYmFja2VuZCwgYnVmLCBsZW4sIGlkKTsKLQotCURFQlVHX1BSSU5URihERUJVR19MRVZFTF9TRVJWRVIsICJbJWRdIExlYXZpbmcgZGVsaXZlcl9jYWxsYmFja1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLX0KLQotLyoKLSAqIEp1c3QgZm9yd2FyZCBhZ2dyZWdhdGVkIG1lc3NhZ2UgdG8gcGFyZW50LgotICovCi1zdGF0aWMgaW50Ci1hZ2dyZWdhdGVfY2FsbGJhY2soc2RtX21lc3NhZ2UgbXNnKSB7Ci0JREVCVUdfUFJJTlRGKERFQlVHX0xFVkVMX1NFUlZFUiwgIlslZF0gRW50ZXIgYWdncmVnYXRlX2NhbGxiYWNrXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCkpOwotCi0Jc2RtX21lc3NhZ2Vfc2V0X3NlbmRfY2FsbGJhY2sobXNnLCBzZG1fbWVzc2FnZV9mcmVlKTsKLQlzZG1fbWVzc2FnZV9zZW5kKG1zZyk7Ci0KLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfU0VSVkVSLCAiWyVkXSBMZWF2aW5nIGFnZ3JlZ2F0ZV9jYWxsYmFja1xuIiwgc2RtX3JvdXRlX2dldF9pZCgpKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERlYnVnIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICoKLSAqIE5PVEU6IGN1cnJlbnRseSB0aGUgZGVidWcgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgc2ltdWx1dGFuZW91cyBjb21tYW5kIGV4ZWN1dGlvbi4gVGhhdCBpcywgaXQKLSAqIHdpbGwgb25seSBwcm9jZXNzIG9uZSBjb21tYW5kIGF0IGF0IHRpbWUsIGFuZCB3aWxsIG5vdCBhY2NlcHQgYW5vdGhlciBjb21tYW5kIHVudGlsIGEgcmVwbHkKLSAqIGhhcyBiZWVuIHNlbnQuIFRoZSBjbGllbnQgbWF5IHNlbmQgbXVsdGlwbGUgY29tbWFuZHMsIGJ1dCBpdCBpcyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAqIHRoYXQgaXMgcHJvdmlkaW5nIHRoZSBjb21tYW5kIGJ1ZmZlcmluZy4KLSAqCi0gKiBUaGlzIGFwcHJvYWNoIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBhbGwgZGVidWdnaW5nIHRhc2tzIGlmIHdlIGFzc3VtZSB0aGF0IHRoZSBkZWJ1Z2dlciBvcGVyYXRlcwotICogaW4gb25lIG9mIHR3byBzdGF0ZXM6IEFDQ0VQVElOR19DT01NQU5EUyBhbmQgUFJPQ0VTU0lOR19DT01NQU5EIGFuZCB3aWxsIG9ubHkgYWNjZXB0IGFkZGl0aW9uYWwgY29tbWFuZHMKLSAqIHdoZW4gaXQgaXMgaW4gdGhlIEFDQ0VQVElOR19DT01NQU5EUyBzdGF0ZS4gRS5nLgotICoKLSAqIENvbW1hbmQJCURlYnVnZ2VyIFN0YXRlCQlHREIgU3RhdGUKLSAqCi0gKiAtLVNMQi0tPgkJQUNDRVBUSU5HX0NPTU1BTkRTCVNVU1BFTkRFRAotICogCQkJCVBST0NFU1NJTkdfQ09NTUFORAlTVVNQRU5ERUQKLSAqIDwtLU9LLS0tCQlBQ0NFUFRJTkdfQ09NTUFORFMJU1VTUEVOREVECi0gKgotICogLS1HT1AtLT4JCUFDQ0VQVElOR19DT01NQU5EUwlTVVNQRU5ERUQKLSAqIAkJCQlQUk9DRVNTSU5HX0NPTU1BTkQJUlVOTklORwotICogCQkJCVBST0NFU1NJTkdfQ09NTUFORAlTVVNQRU5ERUQKLSAqIDwtLU9LLS0tCQlBQ0NFUFRJTkdfQ09NTUFORFMJU1VTUEVOREVECi0gKgotICogVGhlIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHRoZSBJTlQgY29tbWFuZCB3aGljaCBjYW4gYmUgc2VudCBhdCBhbnkgdGltZS4gVGhpcyB3b3JrcyBieSBzZW5kaW5nCi0gKiB3aXRoIGEgc3BlY2lhbCBNUEkgdGFnIHVzZWQgb2YgT09CIGNvbW11bmljYXRpb24uIEl0IHdpbGwgYmUgaW1wbGVtZW50ZWQgbGF0ZXIuLi4KLSAqCi0gKi8KLXZvaWQKLXNlcnZlcihkYmdfYmFja2VuZCAqZGJncikKLXsKLQlERUJVR19QUklOVEYoREVCVUdfTEVWRUxfU0VSVkVSLCAic3RhcnRpbmcgc2VydmVyIG9uICVkLCBzaXplPSVkXG4iLCBzZG1fcm91dGVfZ2V0X2lkKCksIHNkbV9yb3V0ZV9nZXRfc2l6ZSgpKTsKLQotCWJhY2tlbmQgPSBkYmdyOwotCi0Jc2RtX21lc3NhZ2Vfc2V0X2RlbGl2ZXJfY2FsbGJhY2soZGVsaXZlcl9jYWxsYmFjayk7Ci0Jc2RtX2FnZ3JlZ2F0ZV9zZXRfY29tcGxldGlvbl9jYWxsYmFjayhhZ2dyZWdhdGVfY2FsbGJhY2spOwotCi0Jc3ZyX2luaXQoZGJnciwgZXZlbnRfY2FsbGJhY2spOwotCi0Jd2hpbGUgKCFzdnJfaXNzaHV0ZG93bigpKSB7Ci0JCXNkbV9wcm9ncmVzcygpOwotCQlzdnJfcHJvZ3Jlc3MoZGJncik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvc2VydmVyX2NtZHMuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3NlcnZlci9zZXJ2ZXJfY21kcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY0YmExLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3NlcnZlci9zZXJ2ZXJfY21kcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJhcmdzLmgiCi0jaW5jbHVkZSAiZGJnLmgiCi0jaW5jbHVkZSAiZGJnX2V2ZW50LmgiCi0jaW5jbHVkZSAiZGJnX3Byb3h5LmgiCi0jaW5jbHVkZSAiYmFja2VuZC5oIgotCi0jZGVmaW5lIFNWUl9SVU5OSU5HCQkJCTAKLSNkZWZpbmUgU1ZSX1NIVVRET1dOX1NUQVJURUQJMQotI2RlZmluZSBTVlJfU0hVVERPV05fQ09NUExFVEVECTIKLQotdHlwZWRlZiBpbnQgKCpzdnJfY21kKShkYmdfYmFja2VuZCAqLCBpbnQsIGNoYXIgKiopOwotCi1zdGF0aWMgaW50IHN2cl9zdGFydF9zZXNzaW9uKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9zZXRsaW5lYnJlYWtwb2ludChkYmdfYmFja2VuZCAqLCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBzdnJfc2V0ZnVuY2JyZWFrcG9pbnQoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2RlbGV0ZWJyZWFrcG9pbnQoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2VuYWJsZWJyZWFrcG9pbnQoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2Rpc2FibGVicmVha3BvaW50KGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9jb25kaXRpb25icmVha3BvaW50KGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9icmVha3BvaW50YWZ0ZXIoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX3NldHdhdGNocG9pbnQoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2dvKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9zdGVwKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl90ZXJtaW5hdGUoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX3N1c3BlbmQoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2xpc3RzdGFja2ZyYW1lcyhkYmdfYmFja2VuZCAqLCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBzdnJfc2V0Y3VycmVudHN0YWNrZnJhbWUoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2V2YWx1YXRlZXhwcmVzc2lvbihkYmdfYmFja2VuZCAqLCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBzdnJfZ2V0dHlwZShkYmdfYmFja2VuZCAqLCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBzdnJfbGlzdGxvY2FsdmFyaWFibGVzKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9saXN0YXJndW1lbnRzKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9saXN0Z2xvYmFsdmFyaWFibGVzKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9saXN0aW5mb3RocmVhZHMoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX3NldHRocmVhZHNlbGVjdChkYmdfYmFja2VuZCAqLCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBzdnJfc3RhY2tpbmZvZGVwdGgoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2RhdGFyZWFkbWVtb3J5KGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9kYXRhd3JpdGVtZW1vcnkoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2xpc3RzaWduYWxzKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9zaWduYWxpbmZvKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHN2cl9jbGloYW5kbGUoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX3F1aXQoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2RhdGFldmFsdWF0ZWV4cHJlc3Npb24oZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX2dldHBhcnRpYWxhaWYoZGJnX2JhY2tlbmQgKiwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgc3ZyX3ZhcmlhYmxlZGVsZXRlKGRiZ19iYWNrZW5kICosIGludCwgY2hhciAqKik7Ci0KLXN0YXRpYyBzdnJfY21kIHN2cl9jbWRfdGFiW10gPQotewotCS8qIERCR19RVUlUX0NNRCAqLwkJCQkJc3ZyX3F1aXQsCi0JLyogREJHX1NUQVJUU0VTU0lPTl9DTUQgKi8JCQlzdnJfc3RhcnRfc2Vzc2lvbiwKLQkvKiBEQkdfU0VUTElORUJSRUFLUE9JTlRfQ01EICovCQlzdnJfc2V0bGluZWJyZWFrcG9pbnQsCi0JLyogREJHX1NFVEZVTkNCUkVBS1BPSU5UX0NNRCAqLwkJc3ZyX3NldGZ1bmNicmVha3BvaW50LAotCS8qIERCR19ERUxFVEVCUkVBS1BPSU5UX0NNRCAqLwkJc3ZyX2RlbGV0ZWJyZWFrcG9pbnQsCi0JLyogREJHX0VOQUJMRUJSRUFLUE9JTlRfQ01EICovCQlzdnJfZW5hYmxlYnJlYWtwb2ludCwKLQkvKiBEQkdfRElTQUJMRUJSRUFLUE9JTlRfQ01EICovCQlzdnJfZGlzYWJsZWJyZWFrcG9pbnQsCi0JLyogREJHX0NPTkRJVElPTkJSRUFLUE9JTlRfQ01EICovCXN2cl9jb25kaXRpb25icmVha3BvaW50LAotCS8qIERCR19CUkVBS1BPSU5UQUZURVJfQ01EICovCQlzdnJfYnJlYWtwb2ludGFmdGVyLAotCS8qIERCR19TRVRXQVRDSFBPSU5UX0NNRCAqLwkJCXN2cl9zZXR3YXRjaHBvaW50LAotCS8qIERCR19HT19DTUQgKi8JCQkJCXN2cl9nbywKLQkvKiBEQkdfU1RFUF9DTUQgKi8JCQkJCXN2cl9zdGVwLAotCS8qIERCR19URVJNSU5BVEVfQ01EICovCQkJCXN2cl90ZXJtaW5hdGUsCi0JLyogREJHX1NVU1BFTkRfQ01EICovCQkJCXN2cl9zdXNwZW5kLAotCS8qIERCR19MSVNUU1RBQ0tGUkFNRVNfQ01EICovCQlzdnJfbGlzdHN0YWNrZnJhbWVzLAotCS8qIERCR19TRVRDVVJSRU5UU1RBQ0tGUkFNRV9DTUQgKi8Jc3ZyX3NldGN1cnJlbnRzdGFja2ZyYW1lLAotCS8qIERCR19FVkFMVUFURUVYUFJFU1NJT05fQ01EICovCXN2cl9ldmFsdWF0ZWV4cHJlc3Npb24sCi0JLyogREJHX0dFVFRZUEVfQ01EICovCQkJCXN2cl9nZXR0eXBlLAotCS8qIERCR19MSVNUTE9DQUxWQVJJQUJMRVNfQ01EICovCXN2cl9saXN0bG9jYWx2YXJpYWJsZXMsCi0JLyogREJHX0xJU1RBUkdVTUVOVFNfQ01EICovCQkJc3ZyX2xpc3Rhcmd1bWVudHMsCi0JLyogREJHX0xJU1RHTE9CQUxWQVJJQUJMRVNfQ01EICovCXN2cl9saXN0Z2xvYmFsdmFyaWFibGVzLAotCS8qIERCR19MSVNUSU5GT1RIUkVBRFNfQ01EICovCQlzdnJfbGlzdGluZm90aHJlYWRzLAotCS8qIERCR19TRVRUSFJFQURTRUxFQ1RfQ01EICovCQlzdnJfc2V0dGhyZWFkc2VsZWN0LAotCS8qIERCR19TVEFDS0lORk9ERVBUSF9DTUQgKi8JCXN2cl9zdGFja2luZm9kZXB0aCwKLQkvKiBEQkdfREFUQVJFQURNRU1PUllfQ01EICovCQlzdnJfZGF0YXJlYWRtZW1vcnksCi0JLyogREJHX0RBVEFXUklURU1FTU9SWV9DTUQgKi8JCXN2cl9kYXRhd3JpdGVtZW1vcnksCi0JLyogREJHX0xJU1RTSUdOQUxTX0NNRCAqLwkJCXN2cl9saXN0c2lnbmFscywKLQkvKiBEQkdfU0lHTkFMSU5GT19DTUQgKi8JCQlzdnJfc2lnbmFsaW5mbywKLQkvKiBEQkdfQ0xJSEFORExFX0NNRCAqLwkJCQlzdnJfY2xpaGFuZGxlLAotCS8qIERCR19EQVRBRVZBTFVBVEVFWFBSRVNTSU9OX0NNRCAqL3N2cl9kYXRhZXZhbHVhdGVleHByZXNzaW9uLAotCS8qIERCR19HRVRQQVJUSUFMQUlGX0NNRCAqLwkJCXN2cl9nZXRwYXJ0aWFsYWlmLAotCS8qIERCR19WQVJJQUJMRURFTEVURV9DTUQgKi8JCXN2cl92YXJpYWJsZWRlbGV0ZSwKLX07Ci0KLXN0YXRpYyBpbnQJCQlzdnJfcmVzOwotc3RhdGljIHZvaWQJCQkoKmV2ZW50X2NhbGxiYWNrKShkYmdfZXZlbnQgKiwgaW50KTsKLXN0YXRpYyBpbnQJCQlldmVudF9kYXRhOwotc3RhdGljIGNoYXIgKioJCXN2cl9lbnY7Ci1zdGF0aWMgaW50CQkJc3ZyX2xhc3RfdGlkOwotc3RhdGljIGludAkJCXN2cl9zdGF0ZTsKLQotc3RhdGljIHZvaWQKLXN2cl9ldmVudF9jYWxsYmFjayhkYmdfZXZlbnQgKmUpCi17Ci0JZS0+dHJhbnNfaWQgPSBzdnJfbGFzdF90aWQ7Ci0JZXZlbnRfY2FsbGJhY2soZSwgZXZlbnRfZGF0YSk7Ci19Ci0KLWludAotc3ZyX2lzc2h1dGRvd24odm9pZCkKLXsKLQlpZiAoc3ZyX3N0YXRlID09IFNWUl9TSFVURE9XTl9TVEFSVEVEKSB7Ci0JCXN2cl9zdGF0ZSA9IFNWUl9TSFVURE9XTl9DT01QTEVURUQ7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAoc3ZyX3N0YXRlID09IFNWUl9TSFVURE9XTl9DT01QTEVURUQpID8gMSA6IDA7Ci19Ci0KLWludAotc3ZyX2luaXQoZGJnX2JhY2tlbmQgKmRiLCB2b2lkICgqY2IpKGRiZ19ldmVudCAqLCBpbnQpKQotewotCWV2ZW50X2NhbGxiYWNrID0gY2I7Ci0Jc3ZyX2VudiA9IE5VTEw7Ci0Jc3ZyX2xhc3RfdGlkID0gMDsKLQlzdnJfc3RhdGUgPSBTVlJfUlVOTklORzsKLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5pbml0KHN2cl9ldmVudF9jYWxsYmFjayk7Ci19Ci0KLWludAotc3ZyX2Rpc3BhdGNoKGRiZ19iYWNrZW5kICpkYiwgY2hhciAqY21kX3N0ciwgaW50IGxlbiwgaW50IGRhdGEpCi17Ci0JaW50CQkJaWR4OwotCXByb3h5X21zZyAqCW1zZzsKLQlzdnJfY21kCQljbWQ7Ci0KLQlldmVudF9kYXRhID0gZGF0YTsKLQotCWlmIChwcm94eV9kZXNlcmlhbGl6ZV9tc2coY21kX3N0ciwgbGVuLCAmbXNnKSA8IDApIHsKLQkJc3ZyX3JlcyA9IERCR1JFU19FUlI7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgImJhZCBkZWJ1ZyBtZXNzYWdlIGZvcm1hdCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZHggPSBtc2ctPm1zZ19pZCAtIERCR19DTURfQkFTRTsKLQotCWlmIChpZHggPj0gMCAmJiBpZHggPCBzaXplb2Yoc3ZyX2NtZF90YWIpL3NpemVvZihzdnJfY21kKSkgewotCQlzdnJfbGFzdF90aWQgPSBtc2ctPnRyYW5zX2lkOwotCQljbWQgPSBzdnJfY21kX3RhYltpZHhdOwotCQlpZiAoY21kICE9IE5VTEwpIHsKLQkJCXN2cl9yZXMgPSBjbWQoZGIsIG1zZy0+bnVtX2FyZ3MsIG1zZy0+YXJncyk7Ci0JCX0KLQl9IGVsc2UgewotCQlzdnJfcmVzID0gREJHUkVTX0VSUjsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAiVW5rbm93biBjb21tYW5kIik7Ci0JfQotCi0JZnJlZV9wcm94eV9tc2cobXNnKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLXN2cl9wcm9ncmVzcyhkYmdfYmFja2VuZCAqZGIpCi17Ci0JZGJnX2V2ZW50ICoJZTsKLQotCWlmIChzdnJfcmVzICE9IERCR1JFU19PSykgewotCQllID0gTmV3RGJnRXZlbnQoREJHRVZfRVJST1IpOwotCQllLT5kYmdfZXZlbnRfdS5lcnJvcl9ldmVudC5lcnJvcl9jb2RlID0gRGJnR2V0RXJyb3IoKTsKLQkJZS0+ZGJnX2V2ZW50X3UuZXJyb3JfZXZlbnQuZXJyb3JfbXNnID0gc3RyZHVwKERiZ0dldEVycm9yU3RyKCkpOwotCQlzdnJfZXZlbnRfY2FsbGJhY2soZSk7Ci0JCUZyZWVEYmdFdmVudChlKTsKLQkJc3ZyX3JlcyA9IERCR1JFU19PSzsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZGItPmRiX2Z1bmNzLT5wcm9ncmVzcygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotc3ZyX3N1c3BlbmQoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmludGVycnVwdCgpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfc3RhcnRfc2Vzc2lvbihkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgNCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPnN0YXJ0X3Nlc3Npb24oZGItPmRiX2V4ZV9wYXRoLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCAmYXJnc1s0XSwgc3ZyX2Vudiwgc3RydG9sKGFyZ3NbMF0sIE5VTEwsIDEwKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9zZXRsaW5lYnJlYWtwb2ludChkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgOCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPnNldGxpbmVicmVha3BvaW50KChpbnQpc3RydG9sKGFyZ3NbMF0sIE5VTEwsIDEwKSwgKGludClzdHJ0b2woYXJnc1sxXSwgTlVMTCwgMTApLCAoaW50KXN0cnRvbChhcmdzWzJdLCBOVUxMLCAxMCksIGFyZ3NbM10sIChpbnQpc3RydG9sKGFyZ3NbNF0sIE5VTEwsIDEwKSwgYXJnc1s1XSwgKGludClzdHJ0b2woYXJnc1s2XSwgTlVMTCwgMTApLCAoaW50KXN0cnRvbChhcmdzWzddLCBOVUxMLCAxMCkpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfc2V0ZnVuY2JyZWFrcG9pbnQoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChuYXJncyA8IDgpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5zZXRmdW5jYnJlYWtwb2ludCgoaW50KXN0cnRvbChhcmdzWzBdLCBOVUxMLCAxMCksIChpbnQpc3RydG9sKGFyZ3NbMV0sIE5VTEwsIDEwKSwgKGludClzdHJ0b2woYXJnc1syXSwgTlVMTCwgMTApLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCAoaW50KXN0cnRvbChhcmdzWzZdLCBOVUxMLCAxMCksIChpbnQpc3RydG9sKGFyZ3NbN10sIE5VTEwsIDEwKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9kZWxldGVicmVha3BvaW50KGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpZiAobmFyZ3MgPCAxKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBkZWJ1ZyBjbWQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+ZGVsZXRlYnJlYWtwb2ludCgoaW50KXN0cnRvbChhcmdzWzBdLCBOVUxMLCAxMCkpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfZW5hYmxlYnJlYWtwb2ludChkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgMSkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmVuYWJsZWJyZWFrcG9pbnQoKGludClzdHJ0b2woYXJnc1swXSwgTlVMTCwgMTApKTsKLX0KLQotc3RhdGljIGludAotc3ZyX2Rpc2FibGVicmVha3BvaW50KGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpZiAobmFyZ3MgPCAxKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBkZWJ1ZyBjbWQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+ZGlzYWJsZWJyZWFrcG9pbnQoKGludClzdHJ0b2woYXJnc1swXSwgTlVMTCwgMTApKTsKLX0KLQotc3RhdGljIGludAotc3ZyX2NvbmRpdGlvbmJyZWFrcG9pbnQoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChuYXJncyA8IDIpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5jb25kaXRpb25icmVha3BvaW50KChpbnQpc3RydG9sKGFyZ3NbMF0sIE5VTEwsIDEwKSwgYXJnc1sxXSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9icmVha3BvaW50YWZ0ZXIoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChuYXJncyA8IDIpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5icmVha3BvaW50YWZ0ZXIoKGludClzdHJ0b2woYXJnc1swXSwgTlVMTCwgMTApLCAoaW50KXN0cnRvbChhcmdzWzFdLCBOVUxMLCAxMCkpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfc2V0d2F0Y2hwb2ludChkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgNikgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPnNldHdhdGNocG9pbnQoKGludClzdHJ0b2woYXJnc1swXSwgTlVMTCwgMTApLCBhcmdzWzFdLCAoaW50KXN0cnRvbChhcmdzWzJdLCBOVUxMLCAxMCksIChpbnQpc3RydG9sKGFyZ3NbM10sIE5VTEwsIDEwKSwgYXJnc1s0XSwgKGludClzdHJ0b2woYXJnc1s1XSwgTlVMTCwgMTApKTsKLX0KLQotc3RhdGljIGludAotc3ZyX2dvKGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5nbygpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfc3RlcChkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgMikgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPnN0ZXAoKGludClzdHJ0b2woYXJnc1swXSwgTlVMTCwgMTApLCAoaW50KXN0cnRvbChhcmdzWzFdLCBOVUxMLCAxMCkpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfdGVybWluYXRlKGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT50ZXJtaW5hdGUoKTsKLX0KLQotc3RhdGljIGludAotc3ZyX2xpc3RzdGFja2ZyYW1lcyhkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgMikgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmxpc3RzdGFja2ZyYW1lcygoaW50KXN0cnRvbChhcmdzWzBdLCBOVUxMLCAxMCksIChpbnQpc3RydG9sKGFyZ3NbMV0sIE5VTEwsIDEwKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9zZXRjdXJyZW50c3RhY2tmcmFtZShkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgMSkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPnNldGN1cnJlbnRzdGFja2ZyYW1lKChpbnQpc3RydG9sKGFyZ3NbMF0sIE5VTEwsIDEwKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9ldmFsdWF0ZWV4cHJlc3Npb24oZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChuYXJncyA8IDEpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5ldmFsdWF0ZWV4cHJlc3Npb24oYXJnc1swXSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9nZXR0eXBlKGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpZiAobmFyZ3MgPCAxKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBkZWJ1ZyBjbWQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+Z2V0dHlwZShhcmdzWzBdKTsKLX0KLQotc3RhdGljIGludAotc3ZyX2xpc3Rsb2NhbHZhcmlhYmxlcyhkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+bGlzdGxvY2FsdmFyaWFibGVzKCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9saXN0YXJndW1lbnRzKGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpZiAobmFyZ3MgPCAyKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBkZWJ1ZyBjbWQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+bGlzdGFyZ3VtZW50cygoaW50KXN0cnRvbChhcmdzWzBdLCBOVUxMLCAxMCksIChpbnQpc3RydG9sKGFyZ3NbMV0sIE5VTEwsIDEwKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9saXN0Z2xvYmFsdmFyaWFibGVzKGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5saXN0Z2xvYmFsdmFyaWFibGVzKCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9saXN0aW5mb3RocmVhZHMoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmxpc3RpbmZvdGhyZWFkcygpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfc2V0dGhyZWFkc2VsZWN0KGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpZiAobmFyZ3MgPCAxKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBkZWJ1ZyBjbWQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+c2V0dGhyZWFkc2VsZWN0KChpbnQpc3RydG9sKGFyZ3NbMF0sIE5VTEwsIDEwKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9zdGFja2luZm9kZXB0aChkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpIHsKLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5zdGFja2luZm9kZXB0aCgpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfZGF0YXJlYWRtZW1vcnkoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKSAgewotCWlmIChuYXJncyA8IDcpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5kYXRhcmVhZG1lbW9yeShzdHJ0b2woYXJnc1swXSwgTlVMTCwgMTApLCBhcmdzWzFdLCBhcmdzWzJdLCAoaW50KXN0cnRvbChhcmdzWzNdLCBOVUxMLCAxMCksIChpbnQpc3RydG9sKGFyZ3NbNF0sIE5VTEwsIDEwKSwgKGludClzdHJ0b2woYXJnc1s1XSwgTlVMTCwgMTApLCBhcmdzWzZdKTsKLX0KLQotc3RhdGljIGludAotc3ZyX2RhdGF3cml0ZW1lbW9yeShkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpIHsKLQlpZiAobmFyZ3MgPCA1KSB7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+ZGF0YXdyaXRlbWVtb3J5KHN0cnRvbChhcmdzWzBdLCBOVUxMLCAxMCksIGFyZ3NbMV0sIGFyZ3NbMl0sIChpbnQpc3RydG9sKGFyZ3NbM10sIE5VTEwsIDEwKSwgYXJnc1s0XSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN2cl9saXN0c2lnbmFscyhkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgMSkgewotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmxpc3RzaWduYWxzKGFyZ3NbMF0pOwotfQotc3RhdGljIGludAotc3ZyX3NpZ25hbGluZm8oZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChuYXJncyA8IDEpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT5zaWduYWxpbmZvKGFyZ3NbMF0pOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfY2xpaGFuZGxlKGRiZ19iYWNrZW5kICpkYiwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpZiAobmFyZ3MgPCAxKSB7Ci0JCURiZ1NldEVycm9yKERCR0VSUl9ERUJVR0dFUiwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBkZWJ1ZyBjbWQiKTsKLQkJcmV0dXJuIERCR1JFU19FUlI7Ci0JfQotCi0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+Y2xpaGFuZGxlKGFyZ3NbMF0pOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfcXVpdChkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0Jc3ZyX3N0YXRlID0gU1ZSX1NIVVRET1dOX1NUQVJURUQ7Ci0JcmV0dXJuIGRiLT5kYl9mdW5jcy0+cXVpdCgpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfZGF0YWV2YWx1YXRlZXhwcmVzc2lvbihkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgMSkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmRhdGFldmFsdWF0ZWV4cHJlc3Npb24oYXJnc1swXSk7Ci19Ci1zdGF0aWMgaW50Ci1zdnJfZ2V0cGFydGlhbGFpZihkYmdfYmFja2VuZCAqZGIsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaWYgKG5hcmdzIDwgNCkgewotCQlEYmdTZXRFcnJvcihEQkdFUlJfREVCVUdHRVIsICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZGVidWcgY21kIik7Ci0JCXJldHVybiBEQkdSRVNfRVJSOwotCX0KLQotCXJldHVybiBkYi0+ZGJfZnVuY3MtPmdldHBhcnRpYWxhaWYoYXJnc1swXSwgYXJnc1sxXSwgKGludClzdHJ0b2woYXJnc1syXSwgTlVMTCwgMTApLCAoaW50KXN0cnRvbChhcmdzWzNdLCBOVUxMLCAxMCkpOwotfQotCi1zdGF0aWMgaW50Ci1zdnJfdmFyaWFibGVkZWxldGUoZGJnX2JhY2tlbmQgKmRiLCBpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQotewotCWlmIChuYXJncyA8IDEpIHsKLQkJRGJnU2V0RXJyb3IoREJHRVJSX0RFQlVHR0VSLCAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGRlYnVnIGNtZCIpOwotCQlyZXR1cm4gREJHUkVTX0VSUjsKLQl9Ci0KLQlyZXR1cm4gZGItPmRiX2Z1bmNzLT52YXJpYWJsZWRlbGV0ZShhcmdzWzBdKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3NlcnZlci90ZXN0X2JhY2tlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2OTk1NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy9zZXJ2ZXIvdGVzdF9iYWNrZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSAiZGJnLmgiCi0jaW5jbHVkZSAiZGJnX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFja2VuZC5oIgotI2luY2x1ZGUgImxpc3QuaCIKLQotc3RhdGljIGRiZ19ldmVudCAqCUxhc3RFdmVudDsKLXN0YXRpYyB2b2lkCQkJKCpFdmVudENhbGxiYWNrKShkYmdfZXZlbnQgKik7Ci1zdGF0aWMgaW50CQkJU2VydmVyRXhpdDsKLXN0YXRpYyBpbnQJCQlTdGFydGVkOwotCi1zdGF0aWMgaW50CVRlc3RJbml0KHZvaWQgKCopKGRiZ19ldmVudCAqKSk7Ci1zdGF0aWMgaW50CVRlc3RQcm9ncmVzcyh2b2lkKTsKLXN0YXRpYyBpbnQJVGVzdEludGVycnVwdCh2b2lkKTsKLXN0YXRpYyBpbnQJVGVzdFN0YXJ0U2Vzc2lvbihjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiosIGNoYXIgKiosIGxvbmcpOwotc3RhdGljIGludAlUZXN0U2V0TGluZUJyZWFrcG9pbnQoaW50LCBpbnQsIGludCwgY2hhciAqLCBpbnQsIGNoYXIqLCBpbnQsIGludCk7Ci1zdGF0aWMgaW50CVRlc3RTZXRGdW5jQnJlYWtwb2ludChpbnQsIGludCwgaW50LCBjaGFyICosIGNoYXIgKiwgY2hhciosIGludCwgaW50KTsKLXN0YXRpYyBpbnQJVGVzdERlbGV0ZUJyZWFrcG9pbnQoaW50KTsKLXN0YXRpYyBpbnQJVGVzdEVuYWJsZUJyZWFrcG9pbnQoaW50KTsKLXN0YXRpYyBpbnQJVGVzdERpc2FibGVCcmVha3BvaW50KGludCk7Ci1zdGF0aWMgaW50CVRlc3RDb25kaXRpb25CcmVha3BvaW50KGludCwgY2hhciAqZXhwcik7Ci1zdGF0aWMgaW50CVRlc3RCcmVha3BvaW50QWZ0ZXIoaW50LCBpbnQgaWNvdW50KTsKLXN0YXRpYyBpbnQJVGVzdFdhdGNocG9pbnQoaW50LCBjaGFyICosIGludCwgaW50LCBjaGFyICosIGludCk7Ci1zdGF0aWMgaW50CVRlc3RHbyh2b2lkKTsKLXN0YXRpYyBpbnQJVGVzdFN0ZXAoaW50LCBpbnQpOwotc3RhdGljIGludAlUZXN0VGVybWluYXRlKHZvaWQpOwotc3RhdGljIGludAlUZXN0TGlzdFN0YWNrZnJhbWVzKGludCwgaW50KTsKLXN0YXRpYyBpbnQJVGVzdFNldEN1cnJlbnRTdGFja2ZyYW1lKGludCk7Ci1zdGF0aWMgaW50CVRlc3RFdmFsdWF0ZUV4cHJlc3Npb24oY2hhciAqKTsKLXN0YXRpYyBpbnQJVGVzdEdldE5hdGl2ZVR5cGUoY2hhciAqKTsKLXN0YXRpYyBpbnQJVGVzdEdldExvY2FsVmFyaWFibGVzKHZvaWQpOwotc3RhdGljIGludAlUZXN0TGlzdEFyZ3VtZW50cyhpbnQsIGludCk7Ci1zdGF0aWMgaW50CVRlc3RHZXRJbmZvVGhyZWFkKHZvaWQpOwotc3RhdGljIGludAlUZXN0U2V0VGhyZWFkU2VsZWN0KGludCk7Ci1zdGF0aWMgaW50CVRlc3RTdGFja0luZm9EZXB0aCh2b2lkKTsKLXN0YXRpYyBpbnQJVGVzdERhdGFSZWFkTWVtb3J5KGxvbmcsIGNoYXIqLCBjaGFyKiwgaW50LCBpbnQsIGludCwgY2hhciopOwotc3RhdGljIGludAlUZXN0RGF0YVdyaXRlTWVtb3J5KGxvbmcsIGNoYXIqLCBjaGFyKiwgaW50LCBjaGFyKik7Ci1zdGF0aWMgaW50CVRlc3RHZXRHbG9iYWxWYXJpYWJsZXModm9pZCk7Ci1zdGF0aWMgaW50CVRlc3RMaXN0U2lnbmFscyhjaGFyKik7Ci1zdGF0aWMgaW50CVRlc3RTaWduYWxJbmZvKGNoYXIqKTsKLXN0YXRpYyBpbnQJVGVzdEhhbmRsZShjaGFyKik7Ci1zdGF0aWMgaW50CVRlc3RRdWl0KHZvaWQpOwotc3RhdGljIGludAlUZXN0RGF0YUV2YWx1YXRlRXhwcmVzc2lvbihjaGFyKik7Ci1zdGF0aWMgaW50CVRlc3RHZXRQYXJ0aWFsQUlGKGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCk7Ci1zdGF0aWMgaW50CVRlc3RWYXJEZWxldGUoY2hhciopOwotCi1zdGF0aWMgaW50CVNldEFuZENoZWNrQnJlYWsoaW50LCBpbnQsIGludCwgY2hhciAqLCBjaGFyICosIGludCwgaW50KTsKLQotZGJnX2JhY2tlbmRfZnVuY3MJVGVzdEJhY2tlbmQgPQotewotCVRlc3RJbml0LAotCVRlc3RQcm9ncmVzcywKLQlUZXN0SW50ZXJydXB0LAotCVRlc3RTdGFydFNlc3Npb24sCi0JVGVzdFNldExpbmVCcmVha3BvaW50LAotCVRlc3RTZXRGdW5jQnJlYWtwb2ludCwKLQlUZXN0RGVsZXRlQnJlYWtwb2ludCwKLQlUZXN0RW5hYmxlQnJlYWtwb2ludCwKLQlUZXN0RGlzYWJsZUJyZWFrcG9pbnQsCi0JVGVzdENvbmRpdGlvbkJyZWFrcG9pbnQsCi0JVGVzdEJyZWFrcG9pbnRBZnRlciwKLQlUZXN0V2F0Y2hwb2ludCwKLQlUZXN0R28sCi0JVGVzdFN0ZXAsCi0JVGVzdFRlcm1pbmF0ZSwKLQlUZXN0TGlzdFN0YWNrZnJhbWVzLAotCVRlc3RTZXRDdXJyZW50U3RhY2tmcmFtZSwKLQlUZXN0RXZhbHVhdGVFeHByZXNzaW9uLAotCVRlc3RHZXROYXRpdmVUeXBlLAotCVRlc3RHZXRMb2NhbFZhcmlhYmxlcywKLQlUZXN0TGlzdEFyZ3VtZW50cywKLQlUZXN0R2V0R2xvYmFsVmFyaWFibGVzLAotCVRlc3RHZXRJbmZvVGhyZWFkLAotCVRlc3RTZXRUaHJlYWRTZWxlY3QsCi0JVGVzdFN0YWNrSW5mb0RlcHRoLAotCVRlc3REYXRhUmVhZE1lbW9yeSwKLQlUZXN0RGF0YVdyaXRlTWVtb3J5LAotCVRlc3RMaXN0U2lnbmFscywKLQlUZXN0U2lnbmFsSW5mbywKLQlUZXN0SGFuZGxlLAotCVRlc3REYXRhRXZhbHVhdGVFeHByZXNzaW9uLAotCVRlc3RHZXRQYXJ0aWFsQUlGLAotCVRlc3RWYXJEZWxldGUsCi0JVGVzdFF1aXQKLX07Ci0KLXN0YXRpYyB2b2lkCi1TYXZlRXZlbnQoZGJnX2V2ZW50ICplKQotewotCWlmIChMYXN0RXZlbnQgIT0gTlVMTCkKLQkJRnJlZURiZ0V2ZW50KExhc3RFdmVudCk7Ci0JCQotCUxhc3RFdmVudCA9IGU7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIFRlc3QKLSAqLwotc3RhdGljIGludAotVGVzdEluaXQodm9pZCAoKmV2ZW50X2NhbGxiYWNrKShkYmdfZXZlbnQgKikpCi17Ci0JRXZlbnRDYWxsYmFjayA9IGV2ZW50X2NhbGxiYWNrOwotCUxhc3RFdmVudCA9IE5VTEw7Ci0JU2VydmVyRXhpdCA9IDA7Ci0JCQotCXNpZ25hbChTSUdURVJNLCBTSUdfSUdOKTsKLQlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLQlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKLQotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0gKiBTdGFydCBUZXN0IHNlc3Npb24KLSAqLwkKLXN0YXRpYyBpbnQKLVRlc3RTdGFydFNlc3Npb24oY2hhciAqdGVzdF9wYXRoLCBjaGFyICpwcm9nLCBjaGFyICpwYXRoLCBjaGFyICp3b3JrX2RpciwgY2hhciAqKmFyZ3MsIGNoYXIgKiplbnYsIGxvbmcgdGltZW91dCkKLXsKLQlTdGFydGVkID0gMDsKLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotICogUHJvZ3Jlc3MgdGVzdCBjb21tYW5kcy4KLSAqIAotICogVE9ETzogRGVhbCB3aXRoIGVycm9ycwotICogCi0gKiBAcmV0dXJuCS0xCXNlcnZlciBzaHV0ZG93bgotICogCQkJMQlldmVudCBjYWxsYmFjawotICogCQkJMAljb21wbGV0ZWQgb3BlcmF0aW9uCi0gKi8KLXN0YXRpYyBpbnQJCi1UZXN0UHJvZ3Jlc3Modm9pZCkKLXsKLQlpbnQJCQkJcmVzID0gMDsKLQkKLQkvKgotCSAqIENoZWNrIGZvciBleGlzdGluZyBldmVudHMKLQkgKi8KLQlpZiAoTGFzdEV2ZW50ICE9IE5VTEwpIHsKLQkJaWYgKEV2ZW50Q2FsbGJhY2sgIT0gTlVMTCkgewotCQkJRXZlbnRDYWxsYmFjayhMYXN0RXZlbnQpOwotCQkJcmVzID0gMTsKLQkJfQotCQkJCi0JCWlmIChTZXJ2ZXJFeGl0ICYmIExhc3RFdmVudC0+ZXZlbnRfaWQgPT0gREJHRVZfT0spIHsKLQkJCXJlcyA9IC0xOwotCQl9Ci0JCQkKLQkJRnJlZURiZ0V2ZW50KExhc3RFdmVudCk7Ci0JCUxhc3RFdmVudCA9IE5VTEw7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXJldHVybiAwOwotfQotCi0vKgotKiogU2V0IGJyZWFrcG9pbnQgYXQgc3BlY2lmaWVkIGxpbmUuCi0qLwotc3RhdGljIGludAotVGVzdFNldExpbmVCcmVha3BvaW50KGludCBicGlkLCBpbnQgaXNUZW1wLCBpbnQgaXNIYXJkLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqY29uZGl0aW9uLCBpbnQgaWdub3JlQ291bnQsIGludCB0aWQpCi17Ci0JaW50CQlyZXM7Ci0JY2hhcioJd2hlcmU7Ci0JcmVzID0gU2V0QW5kQ2hlY2tCcmVhayhicGlkLCBpc1RlbXAsIGlzSGFyZCwgd2hlcmUsIGNvbmRpdGlvbiwgaWdub3JlQ291bnQsIHRpZCk7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoKLSoqIFNldCBicmVha3BvaW50IGF0IHN0YXJ0IG9mIHNwZWNpZmllZCBmdW5jdGlvbi4KLSovCi1zdGF0aWMgaW50Ci1UZXN0U2V0RnVuY0JyZWFrcG9pbnQoaW50IGJwaWQsIGludCBpc1RlbXAsIGludCBpc0hhcmQsIGNoYXIgKmZpbGUsIGNoYXIgKmZ1bmMsIGNoYXIgKmNvbmRpdGlvbiwgaW50IGlnbm9yZUNvdW50LCBpbnQgdGlkKQotewotCWludAkJcmVzOwotCWNoYXIqCXdoZXJlOwotCXJlcyA9IFNldEFuZENoZWNrQnJlYWsoYnBpZCwgaXNUZW1wLCBpc0hhcmQsIHdoZXJlLCBjb25kaXRpb24sIGlnbm9yZUNvdW50LCB0aWQpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0qKiBDaGVjayB0aGF0IGJyZWFrcG9pbnQgY29tbWFuZCBoYXMgc3VjY2VkZWQgYW5kCi0qKiBleHRyYWN0IGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uLiBSZXR1cm5zIGJyZWFrcG9pbnQKLSoqIGlkIGluIGJpZC4gQWRkcyB0byBicmVha3BvaW50IGxpc3QgaWYgbmVjZXNzYXJ5LgotKi8KLXN0YXRpYyBpbnQKLVNldEFuZENoZWNrQnJlYWsoaW50IGJwaWQsIGludCBpc1RlbXAsIGludCBpc0hhcmQsIGNoYXIgKndoZXJlLCBjaGFyICpjb25kaXRpb24sIGludCBpZ25vcmVDb3VudCwgaW50IHRpZCkKLXsKLQkvKgotCWRiZ19ldmVudCAqCQllOwotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9CUFNFVCk7Ci0JZS0+ZGJnX2V2ZW50X3UuYnBzZXRfZXZlbnQuYnBpZCA9IGJwaWQ7Ci0JZS0+ZGJnX2V2ZW50X3UuYnBzZXRfZXZlbnQuYnAgPSBNSUJyZWFrcG9pbnROZXcoKTsKLQlTYXZlRXZlbnQoZSk7Ci0JKi8KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogRGVsZXRlIGEgYnJlYWtwb2ludC4KLSovCi1zdGF0aWMgaW50Ci1UZXN0RGVsZXRlQnJlYWtwb2ludChpbnQgYnBpZCkKLXsKLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogRW5hYmxlIGEgYnJlYWtwb2ludC4KLSovCi1zdGF0aWMgaW50Ci1UZXN0RW5hYmxlQnJlYWtwb2ludChpbnQgYnBpZCkKLXsKLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogRGlzYWJsZSBhIGJyZWFrcG9pbnQuCi0qLwotc3RhdGljIGludAotVGVzdERpc2FibGVCcmVha3BvaW50KGludCBicGlkKQotewotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBDb25kaXRpb24gYSBicmVha3BvaW50LgotKi8KLXN0YXRpYyBpbnQKLVRlc3RDb25kaXRpb25CcmVha3BvaW50KGludCBicGlkLCBjaGFyICpleHByKQotewotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBicmVha3BvaW50IGFmdGVyLgotKi8KLXN0YXRpYyBpbnQKLVRlc3RCcmVha3BvaW50QWZ0ZXIoaW50IGJwaWQsIGludCBpY291bnQpCi17Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSAqIFNldCB3YXRjaCBwb2ludAotICovCi1zdGF0aWMgaW50IAotVGVzdFdhdGNocG9pbnQoaW50IGJwaWQsIGNoYXIgKmV4cHIsIGludCBpc0FjY2VzcywgaW50IGlzUmVhZCwgY2hhciAqY29uZGl0aW9uLCBpbnQgaWdub3JlQ291bnQpIAotewotCS8qCi0JZGJnX2V2ZW50ICoJCWU7Ci0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0JQU0VUKTsKLQllLT5kYmdfZXZlbnRfdS5icHNldF9ldmVudC5icGlkID0gYnBpZDsKLQllLT5kYmdfZXZlbnRfdS5icHNldF9ldmVudC5icCA9IE1JQnJlYWtwb2ludE5ldygpOwotCVNhdmVFdmVudChlKTsKLQkqLwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBTdGFydC9jb250aW51ZSBleGVjdXRpbmcgcHJvZ3JhbS4gCi0qLwotc3RhdGljIGludAotVGVzdEdvKHZvaWQpCi17Ci0JLy9TZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0gKiBFeGVjdXRlIGNvdW50IHN0YXRlbWVudHMuIAotICogCi0gKiB0eXBlCXN0ZXAga2luZAotICogMAkJZW50ZXIgZnVuY3Rpb24gY2FsbHMKLSAqIDEJCWRvIG5vdCBlbnRlciBmdW5jdGlvbiBjYWxscwotICogMgkJc3RlcCBvdXQgb2YgZnVuY3Rpb24gKGNvdW50IGlnbm9yZWQpCi0gKi8KLXN0YXRpYyBpbnQKLVRlc3RTdGVwKGludCBjb3VudCwgaW50IHR5cGUpCi17Ci0JLy9TZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBUZXJtaW5hdGUgcHJvZ3JhbSBleGVjdXRpb24uCi0qLwotc3RhdGljIGludAotVGVzdFRlcm1pbmF0ZSh2b2lkKQotewotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBJbnRlcnJ1cHQgYW4gZXhlY3V0aW5nIHByb2dyYW0uCi0qLwotc3RhdGljIGludAotVGVzdEludGVycnVwdCh2b2lkKQotewotCS8vU2VuZENvbW1hbmRXYWl0KERlYnVnU2Vzc2lvbiwgY21kKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogTW92ZSB1cCBvciBkb3duIGNvdW50IHN0YWNrIGZyYW1lcy4KLSovCi1zdGF0aWMgaW50Ci1UZXN0U2V0Q3VycmVudFN0YWNrZnJhbWUoaW50IGxldmVsKQotewotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLUdldFN0YWNrZnJhbWVzKGludCBjdXJyZW50LCBpbnQgbG93LCBpbnQgaGlnaCwgTGlzdCAqKmZsaXN0KQotewotCS8vcGFzcyBmbGlzdCBwb2ludGVyCi0JLy9TZW5kQ29tbWFuZFdhaXQoRGVidWdTZXNzaW9uLCBjbWQpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBMaXN0IGN1cnJlbnQgb3IgYWxsIHN0YWNrIGZyYW1lcy4KLSovCi1zdGF0aWMgaW50Ci1UZXN0TGlzdFN0YWNrZnJhbWVzKGludCBsb3csIGludCBoaWdoKQotewotCS8qCi0JZGJnX2V2ZW50ICoJZTsKLQllID0gTmV3RGJnRXZlbnQoREJHRVZfRlJBTUVTKTsKLQllLT5kYmdfZXZlbnRfdS5saXN0ID0gZnJhbWVzOwkKLQlTYXZlRXZlbnQoZSk7Ci0JKi8KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKgotKiogTGlzdCBsb2NhbCB2YXJpYWJsZXMuCi0qLwotc3RhdGljIGludAotVGVzdEdldExvY2FsVmFyaWFibGVzKHZvaWQpCi17Ci0JLyoKLQlkYmdfZXZlbnQgKgllOwotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9WQVJTKTsKLQllLT5kYmdfZXZlbnRfdS5saXN0ID0gTmV3TGlzdCgpOwotCVNhdmVFdmVudChlKTsKLQkqLwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLS8qCi0qKiBMaXN0IGFyZ3VtZW50cy4KLSovCi1zdGF0aWMgaW50Ci1UZXN0TGlzdEFyZ3VtZW50cyhpbnQgbG93LCBpbnQgaGlnaCkKLXsKLQkvKgotCWRiZ19ldmVudCAqCWU7Ci0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0FSR1MpOwotCWUtPmRiZ19ldmVudF91Lmxpc3QgPSBOZXdMaXN0KCk7Ci0JU2F2ZUV2ZW50KGUpOwotCSovCi0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIExpc3QgZ2xvYmFsIHZhcmlhYmxlcy4KLSovCi1zdGF0aWMgaW50Ci1UZXN0R2V0R2xvYmFsVmFyaWFibGVzKHZvaWQpCi17Ci0JRGJnU2V0RXJyb3IoREJHRVJSX05PVElNUCwgTlVMTCk7Ci0JcmV0dXJuIERCR1JFU19FUlI7Ci19Ci0KLS8qCi0qKiBRdWl0IGRlYnVnZ2VyLgotKi8KLXN0YXRpYyBpbnQKLVRlc3RRdWl0KHZvaWQpCi17Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JU2VydmVyRXhpdCsrOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLVRlc3RHZXRJbmZvVGhyZWFkKHZvaWQpIAotewotCS8qCi0JZGJnX2V2ZW50ICoJZTsKLQllID0gTmV3RGJnRXZlbnQoREJHRVZfVEhSRUFEUyk7Ci0JZS0+ZGJnX2V2ZW50X3UudGhyZWFkc19ldmVudC50aHJlYWRfaWQgPSBpbmZvLT5jdXJyZW50X3RocmVhZF9pZDsKLQllLT5kYmdfZXZlbnRfdS50aHJlYWRzX2V2ZW50Lmxpc3QgPSBOZXdMaXN0KCk7Ci0JU2F2ZUV2ZW50KGUpOwotCSovCi0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotc3RhdGljIGludCAKLVRlc3RTZXRUaHJlYWRTZWxlY3QoaW50IHRocmVhZE51bSkgCi17Ci0JLyoKLQlkYmdfZXZlbnQgKgllOwotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9USFJFQURfU0VMRUNUKTsKLQllLT5kYmdfZXZlbnRfdS50aHJlYWRfc2VsZWN0X2V2ZW50LnRocmVhZF9pZCA9IGluZm8tPmN1cnJlbnRfdGhyZWFkX2lkOwotCWUtPmRiZ19ldmVudF91LnRocmVhZF9zZWxlY3RfZXZlbnQuZnJhbWUgPSBzOwotCVNhdmVFdmVudChlKTsKLQkqLwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgCi1UZXN0U3RhY2tJbmZvRGVwdGgoKSAKLXsKLQkvKgotCWRiZ19ldmVudCAqCWU7Ci0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX1NUQUNLX0RFUFRIKTsKLQllLT5kYmdfZXZlbnRfdS5zdGFja19kZXB0aCA9IGRlcHRoOwotCVNhdmVFdmVudChlKTsKLQkqLwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgCi1UZXN0RGF0YVJlYWRNZW1vcnkobG9uZyBvZmZzZXQsIGNoYXIqIGFkZHJlc3MsIGNoYXIqIGZvcm1hdCwgaW50IHdvcmRTaXplLCBpbnQgcm93cywgaW50IGNvbHMsIGNoYXIqIGFzQ2hhcikgCi17Ci0JLyoKLQlkYmdfZXZlbnQgKgllOwotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9EQVRBUl9NRU0pOwotCWUtPmRiZ19ldmVudF91Lm1lbWluZm8gPSBtZW1pbmZvOwotCVNhdmVFdmVudChlKTsKLQkqLwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwkKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi1zdGF0aWMgaW50IAotVGVzdERhdGFXcml0ZU1lbW9yeShsb25nIG9mZnNldCwgY2hhciogYWRkcmVzcywgY2hhciogZm9ybWF0LCBpbnQgd29yZFNpemUsIGNoYXIqIHZhbHVlKSAKLXsKLS8vVE9ETwotCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCXJldHVybiBEQkdSRVNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgCi1UZXN0TGlzdFNpZ25hbHMoY2hhciogbmFtZSkgCi17Ci0JLyoKLQlkYmdfZXZlbnQgKgllOwotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9TSUdOQUxTKTsKLQllLT5kYmdfZXZlbnRfdS5saXN0ID0gc2lnbmFsczsKLQlTYXZlRXZlbnQoZSk7Ci0JKi8KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi1zdGF0aWMgaW50IAotVGVzdFNpZ25hbEluZm8oY2hhciogYXJnKSAKLXsKLQkvL1NlbmRDb21tYW5kV2FpdChEZWJ1Z1Nlc3Npb24sIGNtZCk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotc3RhdGljIGludAotVGVzdEhhbmRsZShjaGFyICphcmcpCi17Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0gCi0KLXN0YXRpYyBpbnQKLVRlc3REYXRhRXZhbHVhdGVFeHByZXNzaW9uKGNoYXIgKmFyZykKLXsKLQkvKgotCWRiZ19ldmVudCAqCWU7Ci0JZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0RBVEFfRVZBX0VYKTsKLQllLT5kYmdfZXZlbnRfdS5kYXRhX2V4cHJlc3Npb24gPSByZXM7Ci0JU2F2ZUV2ZW50KGUpOwotCSovCi0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0KLQotLyoKLSoqIEV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGV4cC4KLSovCi1zdGF0aWMgaW50Ci1UZXN0RXZhbHVhdGVFeHByZXNzaW9uKGNoYXIgKmV4cCkKLXsKLQlBSUYgKmE7Ci0JaWYgKHN0cmNtcChleHAsICJsb25nX3N0cmluZyIpID09IDApIHsKLQkJYSA9IFN0cmluZ1RvQUlGKCJ0ZXN0aW5nIHN0YXJ0IGZyb20gMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkgZW5kIDIwMCIpOwotCQlkYmdfZXZlbnQgKgllOwotCQllID0gTmV3RGJnRXZlbnQoREJHRVZfREFUQSk7Ci0JCWUtPmRiZ19ldmVudF91LmRhdGFfZXZlbnQuZGF0YSA9IGE7Ci0JCWUtPmRiZ19ldmVudF91LmRhdGFfZXZlbnQudHlwZV9kZXNjID0gInN0cmluZyI7Ci0JCVNhdmVFdmVudChlKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGV4cCwgImxvbmdfbG9uZ19zdHJpbmciKSA9PSAwKSB7Ci0JCWEgPSBTdHJpbmdUb0FJRigidGVzdGluZyBzdGFydCBmcm9tIFwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XAotCQkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVwKLQkJMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcCi0JCWVuZCA1MDAwIik7Ci0JCWRiZ19ldmVudCAqCWU7Ci0JCWUgPSBOZXdEYmdFdmVudChEQkdFVl9EQVRBKTsKLQkJZS0+ZGJnX2V2ZW50X3UuZGF0YV9ldmVudC5kYXRhID0gYTsKLQkJZS0+ZGJnX2V2ZW50X3UuZGF0YV9ldmVudC50eXBlX2Rlc2MgPSAic3RyaW5nIjsKLQkJU2F2ZUV2ZW50KGUpOwotCX0KLQllbHNlIHsgCi0JCVNhdmVFdmVudChOZXdEYmdFdmVudChEQkdFVl9PSykpOwotCX0KLQlyZXR1cm4gREJHUkVTX09LOwotfQotLyoKLSoqIEZpbmQgbmF0aXZlIHR5cGUgb2YgdmFyaWFibGUuCi0qLwotc3RhdGljIGludAotVGVzdEdldE5hdGl2ZVR5cGUoY2hhciAqdmFyKQotewotCS8qCi0JZGJnX2V2ZW50ICoJZTsKLQllID0gTmV3RGJnRXZlbnQoREJHRVZfVFlQRSk7Ci0JZS0+ZGJnX2V2ZW50X3UudHlwZV9kZXNjID0gdHlwZTsKLQlTYXZlRXZlbnQoZSk7Ci0JKi8KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBBUlRJQUwgQUlGICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLVRlc3RHZXRQYXJ0aWFsQUlGKGNoYXIqIG5hbWUsIGNoYXIqIGtleSwgaW50IGxpc3RDaGlsZHJlbiwgaW50IGV4cHJlc3MpCi17Ci0JLyoKLQlkYmdfZXZlbnQgKgllOwotCWUgPSBOZXdEYmdFdmVudChEQkdFVl9QQVJUSUFMX0FJRik7Ci0JZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQuZGF0YSA9IGE7Ci0JZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQudHlwZV9kZXNjID0gc3RyZHVwKG1pdmFyLT50eXBlKTsKLQllLT5kYmdfZXZlbnRfdS5wYXJ0aWFsX2FpZl9ldmVudC5uYW1lID0gc3RyZHVwKG1pdmFyLT5uYW1lKTsKLQlTYXZlRXZlbnQoZSk7Ci0JKi8KLQlTYXZlRXZlbnQoTmV3RGJnRXZlbnQoREJHRVZfT0spKTsKLQlyZXR1cm4gREJHUkVTX09LOwotfQotCi1zdGF0aWMgaW50Ci1UZXN0VmFyRGVsZXRlKGNoYXIgKm5hbWUpCi17Ci0JU2F2ZUV2ZW50KE5ld0RiZ0V2ZW50KERCR0VWX09LKSk7Ci0JcmV0dXJuIERCR1JFU19PSzsKLX0gCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy90ZXN0Ly5jdnNpZ25vcmUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy90ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2QxYTUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdGVzdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0uZGlyc3RhbXAKLS5kZXBzCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy90ZXN0L3Rlc3RfcHJveHkuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3Rlc3QvdGVzdF9wcm94eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTNkNzdiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3Rlc3QvdGVzdF9wcm94eS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgCi0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImRiZy5oIgotI2luY2x1ZGUgInByb3h5LmgiCi0jaW5jbHVkZSAicHJveHlfdGNwLmgiCi0jaW5jbHVkZSAiYml0c2V0LmgiCi0KLWV4dGVybiBpbnQgZG9fdGVzdChzZXNzaW9uICosIGNoYXIgKiwgY2hhciAqKTsKLWV4dGVybiB2b2lkCWV2ZW50X2NhbGxiYWNrKGRiZ19ldmVudCAqLCB2b2lkICopOwotZXh0ZXJuIGludAl3YWl0X2Zvcl9ldmVudChzZXNzaW9uICosIGJpdHNldCAqKTsKLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0Jc2Vzc2lvbiAqCXM7Ci0JY2hhciAqCQlkaXI7Ci0JY2hhciAqCQlleGU7Ci0JY2hhciAqCQlob3N0ID0gImxvY2FsaG9zdCI7Ci0JCi0JaWYgKGFyZ2MgPCAyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHRlc3RfcHJveHlfY2xudCBleGUgW2hvc3RdXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCWRpciA9IGdldGN3ZChOVUxMLCAwKTsKLQlleGUgPSBhcmd2WzFdOwotCQotCWlmIChhcmdjID4gMikKLQkJaG9zdCA9IGFyZ3ZbMl07Ci0JCQotCWlmIChEYmdJbml0KCZzLCAidGNwIiwgImhvc3QiLCBob3N0LCAicG9ydCIsIFBST1hZX1RDUF9QT1JULCBOVUxMKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJEYmdJbml0IGZhaWxlZFxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCQotCURiZ1JlZ2lzdGVyRXZlbnRIYW5kbGVyKHMsIGV2ZW50X2NhbGxiYWNrLCBOVUxMKTsKLQotCWlmIChEYmdDb25uZWN0KHMpIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlc1xuIiwgRGJnR2V0RXJyb3JTdHIoKSk7Ci0JCXJldHVybiAxOwotCX0KLQotCXdhaXRfZm9yX2V2ZW50KHMsIE5VTEwpOwotCi0JcmV0dXJuIGRvX3Rlc3QocywgZGlyLCBleGUpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdGVzdC90ZXN0X3Byb3h5X2NsbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhOWZjYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy90ZXN0L3Rlc3RfcHJveHlfY2xudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJkYmcuaCIKLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X3RjcC5oIgotI2luY2x1ZGUgImJpdHNldC5oIgotI2luY2x1ZGUgIml0aW1lci5oIgotCi1pbnQgCQkJY29tcGxldGVkOwotaW50CQkJZmF0YWw7Ci1iaXRzZXQgKgkJcHJvY3Nfb3V0c3RhbmRpbmcgPSBOVUxMOwotYml0c2V0ICoJCXNlc3NfcHJvY3MgPSBOVUxMOwotCi12b2lkCi1ldmVudF9jYWxsYmFjayhkYmdfZXZlbnQgKmUsIHZvaWQgKmRhdGEpCi17Ci0Jc3RhY2tmcmFtZSAqCWY7Ci0JY2hhciAqCQlzOwotCQotCXByaW50ZigiaW4gZXZlbnQgY2FsbGJhY2tcbiIpOwotCQotCWlmIChlID09IE5VTEwpIHsKLQkJcHJpbnRmKCJnb3QgbnVsbCBldmVudCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCQotCWlmIChlLT5wcm9jcyAhPSBOVUxMKSB7Ci0JCWlmIChzZXNzX3Byb2NzID09IE5VTEwpCi0JCQlzZXNzX3Byb2NzID0gYml0c2V0X2R1cChlLT5wcm9jcyk7Ci0JCXMgPSBiaXRzZXRfdG9fc2V0KGUtPnByb2NzKTsKLQkJcHJpbnRmKCIlcyAiLCBzKTsKLQkJZnJlZShzKTsKLQl9Ci0JCQotCXByaW50ZigiLT4gIik7Ci0JCi0Jc3dpdGNoIChlLT5ldmVudF9pZCkgewotCWNhc2UgREJHRVZfRVJST1I6Ci0JCXByaW50ZigiZXJyb3I6ICVzXG4iLCBlLT5kYmdfZXZlbnRfdS5lcnJvcl9ldmVudC5lcnJvcl9tc2cpOwotCQlzd2l0Y2ggKGUtPmRiZ19ldmVudF91LmVycm9yX2V2ZW50LmVycm9yX2NvZGUpIHsKLQkJY2FzZSBEQkdFUlJfTk9CQUNLRU5EOgotCQkJZmF0YWwrKzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBEQkdFVl9PSzoKLQkJcHJpbnRmKCJjb21tYW5kIG9rXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBEQkdFVl9JTklUOgotCQlwcmludGYoImRlYnVnZ2VyIGluaXRpbGl6ZWRcbiIpOwotCQlicmVhazsKLQljYXNlIERCR0VWX1NVU1BFTkQ6Ci0JCXN3aXRjaCAoZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24pIHsKLQkJY2FzZSBEQkdFVl9TVVNQRU5EX0JQSElUOgotCQkJcHJpbnRmKCJoaXQgYnJlYWtwb2ludCAlZFxuIiwgZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5ldl91LmJwaWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgREJHRVZfU1VTUEVORF9JTlQ6Ci0JCQlwcmludGYoInN1c3BlbmQgY29tcGxldGVkXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIERCR0VWX1NVU1BFTkRfU1RFUDoKLQkJCXByaW50Zigic3RlcCBjb21wbGV0ZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgREJHRVZfU1VTUEVORF9TSUdOQUw6Ci0JCQlwcmludGYoInJlY2VpdmVkIHNpZ25hbCAlc1xuIiwgZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5ldl91LnNpZy0+bmFtZSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIERCR0VWX0JQU0VUOgotCQlwcmludGYoImJyZWFrcG9pbnQgc2V0XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBEQkdFVl9FWElUOgotCQlzd2l0Y2ggKGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQucmVhc29uKSB7Ci0JCWNhc2UgREJHRVZfRVhJVF9OT1JNQUw6Ci0JCQlwcmludGYoImV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwgZS0+ZGJnX2V2ZW50X3UuZXhpdF9ldmVudC5ldl91LmV4aXRfc3RhdHVzKTsKLQkJCWJyZWFrOwotCQljYXNlIERCR0VWX0VYSVRfU0lHTkFMOgotCQkJcHJpbnRmKCJleGl0ZWQgd2l0aCBzaWduYWwgJXNcbiIsIGUtPmRiZ19ldmVudF91LmV4aXRfZXZlbnQuZXZfdS5zaWctPm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIERCR0VWX0RBVEE6Ci0JCXByaW50ZigiZGF0YSBpcyAiKTsgQUlGUHJpbnQoc3Rkb3V0LCAwLCBlLT5kYmdfZXZlbnRfdS5kYXRhX2V2ZW50LmRhdGEpOyBwcmludGYoIlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgREJHRVZfRlJBTUVTOgotCQlwcmludGYoImdvdCBmcmFtZXM6XG4iKTsKLQkJZm9yIChTZXRMaXN0KGUtPmRiZ19ldmVudF91Lmxpc3QpOyAoZiA9IChzdGFja2ZyYW1lICopR2V0TGlzdEVsZW1lbnQoZS0+ZGJnX2V2ZW50X3UubGlzdCkpICE9IE5VTEw7ICkgewotCQkJcHJpbnRmKCIgIyVkICVzKCkgYXQgJXM6JWRcbiIsIGYtPmxldmVsLCBmLT5sb2MuZnVuYywgZi0+bG9jLmZpbGUsIGYtPmxvYy5saW5lKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoImdvdCBldmVudCAlZFxuIiwgZS0+ZXZlbnRfaWQpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoZS0+cHJvY3MgIT0gTlVMTCAmJiBwcm9jc19vdXRzdGFuZGluZyAhPSBOVUxMKSB7Ci0JCWJpdHNldF9pbnZlcnQoZS0+cHJvY3MpOwotCQliaXRzZXRfYW5kZXEocHJvY3Nfb3V0c3RhbmRpbmcsIGUtPnByb2NzKTsKLQkJaWYgKCFiaXRzZXRfaXNlbXB0eShwcm9jc19vdXRzdGFuZGluZykpCi0JCQlyZXR1cm47Ci0JfQotCQotCWNvbXBsZXRlZCsrOwotfQotCi1pbnQKLXdhaXRfZm9yX2V2ZW50KHNlc3Npb24gKnMsIGJpdHNldCAqcCkKLXsKLQljb21wbGV0ZWQgPSAwOwotCWZhdGFsID0gMDsKLQotCXByaW50ZigiZW50ZXJpbmcgd2FpdF9mb3JfZXZlbnQuLi5cbiIpOwotCQotCWlmIChwICE9IE5VTEwpCi0JCXByb2NzX291dHN0YW5kaW5nID0gYml0c2V0X2R1cChwKTsKLQkJCi0Jd2hpbGUgKCFjb21wbGV0ZWQpIHsKLQkJaWYgKERiZ1Byb2dyZXNzKHMpIDwgMCkgewotCQkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIERiZ0dldEVycm9yU3RyKCkpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQkKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCWJpdHNldF9mcmVlKHByb2NzX291dHN0YW5kaW5nKTsKLQkJcHJvY3Nfb3V0c3RhbmRpbmcgPSBOVUxMOwotCX0KLQkJCi0JLyoKLQkgKiBDaGVjayBhIGZhdGFsIGVycm9yIGhhc24ndCBvY3VycmVkCi0JICovCi0JcmV0dXJuIGZhdGFsID8gLTEgOiAwOwotfQotCi0vKgotICogVGVsbCBzZXJ2ZXIgdG8gcXVpdAotICovCi12b2lkCi1jbGVhbnVwX2FuZF9leGl0KHNlc3Npb24gKnMsIGJpdHNldCAqcCkKLXsKLQlEYmdRdWl0KHMpOwotCXdhaXRfZm9yX2V2ZW50KHMsIHApOwotCWV4aXQoMCk7Ci19Ci0KLWludAotZG9fdGVzdChzZXNzaW9uICpzLCBjaGFyICpkaXIsIGNoYXIgKmV4ZSkKLXsKLQliaXRzZXQgKgkJcDE7Ci0JaW50CQkJYnBpZCA9IDU0OwotCWl0aW1lciAqCQl0OwotCQotCXQgPSBpdGltZXJfbmV3KCJkZWJ1ZyIpOwotCWl0aW1lcl9zdGFydCh0KTsKLQkKLQlpZiAoRGJnU3RhcnRTZXNzaW9uKHMsIGRpciwgZXhlLCBOVUxMKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIERiZ0dldEVycm9yU3RyKCkpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHdhaXRfZm9yX2V2ZW50KHMsIE5VTEwpIDwgMCkgewotCQljbGVhbnVwX2FuZF9leGl0KHMsIE5VTEwpOwotCX0KLQkKLQlpdGltZXJfbWFyayh0LCAibGF1bmNoIik7Ci0JCi0JcDEgPSBzZXNzX3Byb2NzOwotCQkKLQlpZiAoRGJnU2V0TGluZUJyZWFrcG9pbnQocywgcDEsIGJwaWQrKywgInh4eC5jIiwgMTcpIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlc1xuIiwgRGJnR2V0RXJyb3JTdHIoKSk7Ci0JCXJldHVybiAxOwotCX0KLQl3YWl0X2Zvcl9ldmVudChzLCBwMSk7Ci0JCi0JaXRpbWVyX21hcmsodCwgImJyZWFrcG9pbnQiKTsKLQkKLQlpZiAoRGJnR28ocywgcDEpIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlc1xuIiwgRGJnR2V0RXJyb3JTdHIoKSk7Ci0JCXJldHVybiAxOwotCX0KLQl3YWl0X2Zvcl9ldmVudChzLCBwMSk7Ci0JCi0JaXRpbWVyX21hcmsodCwgInN1c3BlbmQiKTsKLQkJCi0JaWYgKERiZ0xpc3RTdGFja2ZyYW1lcyhzLCBwMSwgMCwgMSkgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICVzXG4iLCBEYmdHZXRFcnJvclN0cigpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXdhaXRfZm9yX2V2ZW50KHMsIHAxKTsKLQotCWl0aW1lcl9tYXJrKHQsICJ3aGVyZSIpOwotCQotCWlmIChEYmdTdGVwKHMsIHAxLCAxLCAwKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIERiZ0dldEVycm9yU3RyKCkpOwotCQlyZXR1cm4gMTsKLQl9Ci0Jd2FpdF9mb3JfZXZlbnQocywgcDEpOwotCQotCWl0aW1lcl9tYXJrKHQsICJzdGVwIik7Ci0KLQlpZiAoRGJnU3RlcChzLCBwMSwgMSwgMCkgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICVzXG4iLCBEYmdHZXRFcnJvclN0cigpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXdhaXRfZm9yX2V2ZW50KHMsIHAxKTsKLQkKLQlpdGltZXJfbWFyayh0LCAic3RlcCIpOwotCi0JaWYgKERiZ0V2YWx1YXRlRXhwcmVzc2lvbihzLCBwMSwgImEiKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIERiZ0dldEVycm9yU3RyKCkpOwotCQlyZXR1cm4gMTsKLQl9Ci0Jd2FpdF9mb3JfZXZlbnQocywgcDEpOwotCQotCWl0aW1lcl9tYXJrKHQsICJldmFsdWF0ZSIpOwotCi0JaWYgKERiZ0xpc3RTdGFja2ZyYW1lcyhzLCBwMSwgMSwgMSkgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICVzXG4iLCBEYmdHZXRFcnJvclN0cigpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXdhaXRfZm9yX2V2ZW50KHMsIHAxKTsKLQkKLQlpdGltZXJfbWFyayh0LCAid2hlcmUiKTsKLQotCWlmIChEYmdRdWl0KHMpIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlc1xuIiwgRGJnR2V0RXJyb3JTdHIoKSk7Ci0JCXJldHVybiAxOwotCX0KLQl3YWl0X2Zvcl9ldmVudChzLCBwMSk7Ci0KLQlpdGltZXJfc3RvcCh0KTsKLQlpdGltZXJfcHJpbnQodCk7Ci0JaXRpbWVyX2ZyZWUodCk7Ci0JCi0JZXhpdCgwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdGVzdC90ZXN0X3Byb3h5X3Jldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWMxM2RlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3Rlc3QvdGVzdF9wcm94eV9yZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJkYmcuaCIKLSNpbmNsdWRlICJwcm94eS5oIgotI2luY2x1ZGUgInByb3h5X3RjcC5oIgotI2luY2x1ZGUgImJpdHNldC5oIgotCi1leHRlcm4gaW50CWRvX3Rlc3Qoc2Vzc2lvbiAqLCBjaGFyICosIGNoYXIgKik7Ci1leHRlcm4gdm9pZAlldmVudF9jYWxsYmFjayhkYmdfZXZlbnQgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQJd2FpdF9mb3JfZXZlbnQoc2Vzc2lvbiAqLCBiaXRzZXQgKik7Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXNlc3Npb24gKglzOwotCWNoYXIgKgkJZGlyOwotCWNoYXIgKgkJZXhlOwotCQotCWlmIChhcmdjIDwgMikgewotCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiB0ZXN0X3Byb3h5X2NsbnQgW2Rpcl0gZXhlXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCWlmIChhcmdjID4gMikgewotCQlkaXIgPSBhcmd2WzFdOwotCQlleGUgPSBhcmd2WzJdOwotCX0gZWxzZSB7Ci0JCWRpciA9IGdldGN3ZChOVUxMLCAwKTsKLQkJZXhlID0gYXJndlsxXTsKLQl9Ci0JCi0JaWYgKERiZ0luaXQoJnMsICJ0Y3AiLCAicG9ydCIsIFBST1hZX1RDUF9QT1JULCBOVUxMKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJEYmdJbml0IGZhaWxlZFxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCQotCURiZ1JlZ2lzdGVyRXZlbnRIYW5kbGVyKHMsIGV2ZW50X2NhbGxiYWNrLCBOVUxMKTsKLQotCWlmIChEYmdDcmVhdGUocykgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICVzXG4iLCBEYmdHZXRFcnJvclN0cigpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0Jd2FpdF9mb3JfZXZlbnQocywgTlVMTCk7Ci0KLQlyZXR1cm4gZG9fdGVzdChzLCBkaXIsIGV4ZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3Rlc3QvdGVzdF9wcm94eV9zdnIuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3Rlc3QvdGVzdF9wcm94eV9zdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5YWMwYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy90ZXN0L3Rlc3RfcHJveHlfc3ZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgInByb3h5LmgiCi0jaW5jbHVkZSAicHJveHlfdGNwLmgiCi0KLWludCBzaHV0ZG93bjsKLQotdm9pZAotc2h1dGRvd25fc2VydmVyKHZvaWQpCi17Ci0Jc2h1dGRvd24rKzsKLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaW50IHN0YXQ7Ci0Jdm9pZCAqY29ubjsKLQkKLQlzaHV0ZG93biA9IDA7Ci0JCi0JaWYgKHByb3h5X3RjcF9zdnJfZnVuY3MuY3JlYXRlKCZjb25uLCBzaHV0ZG93bl9zZXJ2ZXIpIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInByb3h5X3RjcF9zdnJfY3JlYXRlIGZhaWxlZFxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCQotCXdoaWxlICghc2h1dGRvd24pIHsKLQkJaWYgKChzdGF0ID0gcHJveHlfdGNwX3N2cl9mdW5jcy5wcm9ncmVzcyhjb25uKSkgPCAwKQotCQkJYnJlYWs7Ci0JfQotCQkKLQlpZiAoIXNodXRkb3duICYmIHN0YXQgPCAwKQotCQlmcHJpbnRmKHN0ZGVyciwgInByb2dyZXNzIGZhaWxlZFxuIik7Ci0JCi0JcHJveHlfdGNwX3N2cl9mdW5jcy5maW5pc2goY29ubik7Ci0JCi0JcHJpbnRmKCJwcm94eSBzZXJ2ZXIgc2h1dHRpbmcgZG93blxuIik7Ci0JZXhpdCgwKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy8uY3ZzaWdub3JlIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzZDFhNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0uZGlyc3RhbXAKLS5kZXBzCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9icmVha3BvaW50LmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9icmVha3BvaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTNjZWQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvYnJlYWtwb2ludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IAotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKLSNpbmNsdWRlICJsaXN0LmgiCi0KLWJyZWFrcG9pbnQgKgkKLU5ld0JyZWFrcG9pbnQoaW50IGJwaWQpIHsKLQlicmVha3BvaW50ICoJYnAgPSAoYnJlYWtwb2ludCAqKW1hbGxvYyhzaXplb2YoYnJlYWtwb2ludCkpOwotCQotCWJwLT5pZCA9IGJwaWQ7Ci0JYnAtPmlnbm9yZSA9IDA7Ci0JYnAtPnNwZWNpYWwgPSAwOwotCWJwLT5kZWxldGVkID0gMDsKLQlicC0+dHlwZSA9IE5VTEw7Ci0JYnAtPmxvYy5maWxlID0gTlVMTDsKLQlicC0+bG9jLmZ1bmMgPSBOVUxMOwotCWJwLT5sb2MuYWRkciA9IE5VTEw7Ci0JYnAtPmxvYy5saW5lID0gMDsKLQlicC0+aGl0cyA9IDA7Ci0JCi0JcmV0dXJuIGJwOwotfQotCi12b2lkCQotRnJlZUJyZWFrcG9pbnQoYnJlYWtwb2ludCAqYnApIHsKLQlpZiAoYnAtPnR5cGUgIT0gTlVMTCkKLQkJZnJlZShicC0+dHlwZSk7Ci0JaWYgKGJwLT5sb2MuZmlsZSAhPSBOVUxMKQotCQlmcmVlKGJwLT5sb2MuZmlsZSk7Ci0JaWYgKGJwLT5sb2MuZnVuYyAhPSBOVUxMKQotCQlmcmVlKGJwLT5sb2MuZnVuYyk7Ci0JaWYgKGJwLT5sb2MuYWRkciAhPSBOVUxMKQotCQlmcmVlKGJwLT5sb2MuYWRkcik7Ci0JCQotCWZyZWUoYnApOwotfQotCi1icmVha3BvaW50ICoJCi1Db3B5QnJlYWtwb2ludChicmVha3BvaW50ICpicCkgewotCWJyZWFrcG9pbnQgKgluYiA9IE5ld0JyZWFrcG9pbnQoYnAtPmlkKTsKLQotCW5iLT5pZ25vcmUgPSBicC0+aWdub3JlOwotCW5iLT5zcGVjaWFsID0gYnAtPnNwZWNpYWw7Ci0JbmItPmRlbGV0ZWQgPSBicC0+ZGVsZXRlZDsKLQluYi0+dHlwZSA9IHN0cmR1cChicC0+dHlwZSk7Ci0JbmItPmxvYy5maWxlID0gc3RyZHVwKGJwLT5sb2MuZmlsZSk7Ci0JbmItPmxvYy5mdW5jID0gc3RyZHVwKGJwLT5sb2MuZnVuYyk7Ci0JbmItPmxvYy5hZGRyID0gc3RyZHVwKGJwLT5sb2MuYWRkcik7Ci0JbmItPmxvYy5saW5lID0gYnAtPmxvYy5saW5lOwotCW5iLT5oaXRzID0gYnAtPmhpdHM7Ci0KLQlyZXR1cm4gbmI7Ci19Ci0KLXZvaWQJCi1BZGRCcmVha3BvaW50KExpc3QgKmwsIGJyZWFrcG9pbnQgKmJwKSB7Ci0JQWRkVG9MaXN0KGwsICh2b2lkICopYnApOwotfQotCi12b2lkCQotUmVtb3ZlQnJlYWtwb2ludChMaXN0ICpsLCBpbnQgYnBpZCkgewotCWJyZWFrcG9pbnQgKglicCA9IEZpbmRCcmVha3BvaW50KGwsIGJwaWQpOwotCQotCWlmIChicCAhPSBOVUxMKQotCQlSZW1vdmVGcm9tTGlzdChsLCAodm9pZCAqKWJwKTsKLX0KLQotYnJlYWtwb2ludCAqCi1GaW5kQnJlYWtwb2ludChMaXN0ICpsLCBpbnQgYnBpZCkgewotCWJyZWFrcG9pbnQgKglicDsKLQkKLQlTZXRMaXN0KGwpOwotCQotCXdoaWxlICgoYnAgPSAoYnJlYWtwb2ludCAqKUdldExpc3RFbGVtZW50KGwpKSAhPSBOVUxMKSB7Ci0JCWlmIChicC0+aWQgPT0gYnBpZCkKLQkJCXJldHVybiBicDsKLQl9Ci0JCQotCXJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvZGVidWcuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjU3N2UuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5Ci0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2dudV9saW51eF9fCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYgLyogX19nbnVfbGludXhfXyAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBERUJVRwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLWludAkJZGVidWdfbGV2ZWwgPSBERUJVR19MRVZFTF9OT05FOwotCi0jZGVmaW5lIGRlYnVnX291dAlzdGRvdXQKLQotdm9pZAotZGVidWdfcHJpbnRmKGludCBsZXZlbCwgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdAlhcDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCi0JaWYgKChsZXZlbCAmIGRlYnVnX2xldmVsKSA9PSBsZXZlbCkgewotCQlmcHJpbnRmKGRlYnVnX291dCwgIlNETVslZF06ICIsIGxldmVsKTsKLQkJdmZwcmludGYoZGVidWdfb3V0LCBmbXQsIGFwKTsKLQkJZmZsdXNoKGRlYnVnX291dCk7Ci0JfQotCi0JdmFfZW5kKGFwKTsKLX0KLSNlbmRpZiAvKiBERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvZXJyb3IuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL2Vycm9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDE4Y2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJkYmcuaCIKLQotc3RhdGljIGludCAJCQlkYmdfZXJybm8gPSBEQkdSRVNfT0s7Ci1zdGF0aWMgY2hhciAqCQlkYmdfZXJyc3RyID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKiBkYmdfZXJyb3JfdGFiW10gPQotewotCS8qIDAgKi8JCQkJCQkiTk9fRVJST1IiLAotCS8qIERCR0VSUl9OT1RJTVAgKi8JCQkiUHJvdG9jb2wgbm90IGltcGxlbWVudGVkIiwKLQkvKiBEQkdFUlJfUFJPWFlfVEVSTSAqLwkJIlByb3h5IGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQiLAotCS8qIERCR0VSUl9QUk9YWV9QUk9UTyAqLwkiQmFkIG1lc3NhZ2UgcmVjZWl2ZWQgYnkgcHJveHkiLAotCS8qIERCR0VSUl9ERUJVR0dFUiAqLyAJCSJEZWJ1Z2dlciBlcnJvcjogJXMiLAotCS8qIERCR0VSUl9OT0JBQ0tFTkQgKi8gCQkiQmFja2VuZCBkZWJ1Z2dlciBleGVjdXRhYmxlIFwiJXNcIiBub3QgZm91bmQiLAotCS8qIERCR0VSUl9JTlBST0dSRVNTICovCQkiQ2FsbGJhY2sgaW4gcHJvZ3Jlc3MiLAotCS8qIERCR0VSUl9DQkNSRUFURSAqLwkJIk5vIHNlcnZlciB0byByZWdpc3RlciBjYWxsYmFjayIsCi0JLyogREJHRVJSX05PU0VTU0lPTiAqLwkJIk11c3Qgc3RhcnQgc2Vzc2lvbiBmaXJzdCIsCi0JLyogREJHRVJSX1NFU1NJT04gKi8JCSJTZXNzaW9uIGFscmVhZHkgZXN0YWJsaXNoZWQiLAotCS8qIERCR0VSUl9OT0xJTkUgKi8JCQkiTm8gbGluZSAlcyBpbiBmaWxlICIsCi0JLyogREJHRVJSX05PRlVOQyAqLwkJCSJGdW5jdGlvbiBcIiVzXCIgbm90IGRlZmluZWQiLAotCS8qIERCR0VSUl9OT0ZJTEUgKi8JCQkiTm8gc291cmNlIGZpbGUgbmFtZWQgXCIlc1wiIiwKLQkvKiBEQkdFUlJfTk9CUCAqLwkJCSJObyBicmVha3BvaW50IG51bWJlciAlcyIsCi0JLyogREJHRVJSX05PU1lNICovCQkJIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0IiwKLQkvKiBEQkdFUlJfTk9NRU0gKi8JCQkiQ2FuJ3QgYWNjZXNzIG1lbW9yeSIsCi0JLyogREJHRVJSX0NBTlRSVU4gKi8JCSJDYW4ndCBydW4gdGhlIHByb2dyYW0iLAotCS8qIERCR0VSUl9JTlZPS0UgKi8JCQkiQ291bGQgbm90IGludm9rZSB0aGUgcHJvZ3JhbSIsCi0JLyogREJHRVJSX0lTUlVOTklORyAqLwkJIlByb2dyYW0gaXMgcnVubmluZyIsCi0JLyogREJHRVJSX05PVFJVTiAqLwkJCSJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuIiwKLQkvKiBEQkdFUlJfRklSU1RGUkFNRSAqLwkJIkluaXRpYWwgZnJhbWUgc2VsZWN0ZWQ7IHlvdSBjYW5ub3QgZ28gdXAiLAotCS8qIERCR0VSUl9MQVNURlJBTUUgKi8JCSJCb3R0b20gKGkuZS4sIGlubmVybW9zdCkgZnJhbWUgc2VsZWN0ZWQ7IHlvdSBjYW5ub3QgZ28gZG93biIsCi0JLyogREJHRVJSX0JBREJQQVJHICovCQkiQXJndW1lbnQgcmVxdWlyZWQgKGJyZWFrcG9pbnQgbnVtYmVyKSIsCi0JLyogREJHRVJSX1JFR0VYICovCQkJIkVycm9yIGluIHJlZ3VsYXIgZXhwcmVzc2lvbiIsCi0JLyogREJHRVJSX05PU1RBQ0sgKi8JCSJObyBzdGFjay4iLAotCS8qIERCR0VSUl9PVVRPRlJBTkdFICovCQkiTGluZSBudW1iZXIgJXMgaXMgb3V0IG9mIHJhbmdlIGZvciAiLAotCS8qIERCR0VSUl9OT0ZJTEVESVIgKi8JCSIlczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIsCi0JLyogREJHRVJSX05PU1lNUyAqLwkJCSJObyBkZWJ1Z2dpbmcgc3ltYm9scyIsCi0JLyogREJHRVJSX1RFTVAgKi8JCQkiQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSIsCi0JLyogREJHRVJSX1BJUEUgKi8JCQkicGlwZTogJXMiLAotCS8qIERCR0VSUl9GT1JLICovCQkJImZvcms6ICVzIiwKLQkvKiBEQkdFUlJfU1lTVEVNICovCQkJInN5c3RlbSBlcnJvcjogJXMiLAotCS8qIERCR0VSUl9OT1RFWEVDICovCQkiJXM6IG5vdCBpbiBleGVjdXRhYmxlIGZvcm1hdCIsCi0JLyogREJHRVJSX0NIRElSICovCQkJIiVzIiwKLQkvKiBEQkdFUlJfU09VUkNFICovCQkJIlNvdXJjZSBmaWxlIGlzIG1vcmUgcmVjZW50IHRoYW4gZXhlY3V0YWJsZSIsCi0JLyogREJHRVJSX1NFVFZBUiAqLwkJCSJDYW4ndCBzZXQgdmFyaWFibGUuIiwKLQkvKiBEQkdFUlJfUFJPQ1NFVCAqLwkJIkludmFsaWQgcHJvY2VzcyBzZXQiLAotCS8qIERCR0VSUl9VTktOT1dOICovCQkiVW5rbm93biBlcnJvcjogXCIlc1wiIiwKLQkvKiBEQkdFUlJfVU5LTk9XTl9UWVBFICovCSJVbmtub3duIHR5cGU6IFwiJXNcIiIsCi0JLyogREJHRVJSX1VOS05PV05fVkFSSUFCTEUgKi8iVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgotfTsKLQotLyoKLSAqIEVycm9yIGhhbmRsaW5nCi0gKi8KLXZvaWQKLURiZ1NldEVycm9yKGludCBlcnJudW0sIGNoYXIgKm1zZykKLXsKLQlkYmdfZXJybm8gPSBlcnJudW07Ci0JCi0JaWYgKGRiZ19lcnJzdHIgIT0gTlVMTCkgewotCQlmcmVlKGRiZ19lcnJzdHIpOwotCQlkYmdfZXJyc3RyID0gTlVMTDsKLQl9Ci0JCi0JaWYgKGRiZ19lcnJubyA+PSBzaXplb2YoZGJnX2Vycm9yX3RhYikvc2l6ZW9mKGNoYXIgKikpIHsKLQkJaWYgKG1zZyAhPSBOVUxMKSB7Ci0JCQlkYmdfZXJyc3RyID0gc3RyZHVwKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3ByaW50ZigmZGJnX2VycnN0ciwgIkVycm9yICVkIG9jY3VycmVkLiIsIGRiZ19lcnJubyk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAobXNnID09IE5VTEwpCi0JCQltc2cgPSAiPG51bGw+IjsKLQkJCQotCQlhc3ByaW50ZigmZGJnX2VycnN0ciwgZGJnX2Vycm9yX3RhYltkYmdfZXJybm9dLCBtc2cpOwotCX0KLX0KLQotaW50Ci1EYmdHZXRFcnJvcih2b2lkKQotewotCXJldHVybiBkYmdfZXJybm87Ci19Ci0KLWNoYXIgKgotRGJnR2V0RXJyb3JTdHIodm9pZCkKLXsKLQlpZiAoZGJnX2VycnN0ciA9PSBOVUxMKQotCQlyZXR1cm4gIiI7Ci0JCQotCXJldHVybiBkYmdfZXJyc3RyOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvZXZlbnQuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMjIwNGMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5Ci0gKiBtYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIF9fZ251X2xpbnV4X18KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZiAvKiBfX2dudV9saW51eF9fICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImRiZ19ldmVudC5oIgotI2luY2x1ZGUgImFyZ3MuaCIKLSNpbmNsdWRlICJwcm94eV9tc2cuaCIKLQotI2RlZmluZSBFTVBUWQkiKiIKLQotc3RhdGljIHZvaWQKLWRiZ19hZGRfbG9jYXRpb24ocHJveHlfbXNnICptLCBsb2NhdGlvbiAqbG9jKQotewotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIGxvYy0+ZmlsZSk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgbG9jLT5mdW5jKTsKLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBsb2MtPmFkZHIpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIGxvYy0+bGluZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kYmdfYWRkX2JyZWFrcG9pbnQocHJveHlfbXNnICptLCBicmVha3BvaW50ICpicCkKLXsKLQlwcm94eV9tc2dfYWRkX2ludChtLCBicC0+aWQpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIGJwLT5pZ25vcmUpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIGJwLT5zcGVjaWFsKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCBicC0+ZGVsZXRlZCk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgYnAtPnR5cGUpOwotCWRiZ19hZGRfbG9jYXRpb24obSwgJmJwLT5sb2MpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIGJwLT5oaXRzKTsKLX0KLQotc3RhdGljIHZvaWQKLWRiZ19hZGRfc2lnbmFsaW5mbyhwcm94eV9tc2cgKm0sIHNpZ25hbGluZm8gKnNpZykKLXsKLQlpZiAoc2lnID09IE5VTEwpIHsKLQkJcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgRU1QVFkpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgc2lnLT5uYW1lKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCBzaWctPnN0b3ApOwotCXByb3h5X21zZ19hZGRfaW50KG0sIHNpZy0+cHJpbnQpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIHNpZy0+cGFzcyk7Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgc2lnLT5kZXNjKTsKLX0KLQotc3RhdGljIHZvaWQKLWRiZ19hZGRfc3RhY2tmcmFtZShwcm94eV9tc2cgKm0sIHN0YWNrZnJhbWUgKnNmKQotewotCWlmIChzZiA9PSBOVUxMKSB7Ci0JCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIEVNUFRZKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb3h5X21zZ19hZGRfaW50KG0sIHNmLT5sZXZlbCk7Ci0JZGJnX2FkZF9sb2NhdGlvbihtLCAmc2YtPmxvYyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kYmdfYWRkX3N0cmluZ3MocHJveHlfbXNnICptLCBMaXN0ICpsc3QpCi17Ci0JY2hhciAqCXM7Ci0KLQlwcm94eV9tc2dfYWRkX2ludChtLCBTaXplT2ZMaXN0KGxzdCkpOwotCi0JZm9yIChTZXRMaXN0KGxzdCk7IChzID0gKGNoYXIgKilHZXRMaXN0RWxlbWVudChsc3QpKSAhPSBOVUxMOyApIHsKLQkJcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZGJnX2FkZF9zdGFja2ZyYW1lcyhwcm94eV9tc2cgKm0sIExpc3QgKmxzdCkKLXsKLQlzdGFja2ZyYW1lICoJczsKLQotCXByb3h5X21zZ19hZGRfaW50KG0sIFNpemVPZkxpc3QobHN0KSk7Ci0KLQlmb3IgKFNldExpc3QobHN0KTsgKHMgPSAoc3RhY2tmcmFtZSAqKUdldExpc3RFbGVtZW50KGxzdCkpICE9IE5VTEw7ICkgewotCQlkYmdfYWRkX3N0YWNrZnJhbWUobSwgcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZGJnX2FkZF9zaWduYWxzKHByb3h5X21zZyAqbSwgTGlzdCAqbHN0KQotewotCXNpZ25hbGluZm8gKglzOwotCi0JcHJveHlfbXNnX2FkZF9pbnQobSwgU2l6ZU9mTGlzdChsc3QpKTsKLQotCWZvciAoU2V0TGlzdChsc3QpOyAocyA9IChzaWduYWxpbmZvICopR2V0TGlzdEVsZW1lbnQobHN0KSkgIT0gTlVMTDsgKSB7Ci0JCWRiZ19hZGRfc2lnbmFsaW5mbyhtLCBzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kYmdfYWRkX21lbW9yeShwcm94eV9tc2cgKm0sIG1lbW9yeSAqbWVtKQotewotCWlmIChtZW0gPT0gTlVMTCkgewotCQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBFTVBUWSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm94eV9tc2dfYWRkX3N0cmluZyhtLCBtZW0tPmFkZHIpOwotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIG1lbS0+YXNjaWkpOwotCWRiZ19hZGRfc3RyaW5ncyhtLCBtZW0tPmRhdGEpOwotfQotCi1zdGF0aWMgdm9pZAotZGJnX2FkZF9tZW1vcmllcyhwcm94eV9tc2cgKm0sIExpc3QgKmxzdCkKLXsKLQltZW1vcnkgKgltZW07Ci0KLQlwcm94eV9tc2dfYWRkX2ludChtLCBTaXplT2ZMaXN0KGxzdCkpOwotCi0JZm9yIChTZXRMaXN0KGxzdCk7IChtZW0gPSAobWVtb3J5ICopR2V0TGlzdEVsZW1lbnQobHN0KSkgIT0gTlVMTDsgKSB7Ci0JCWRiZ19hZGRfbWVtb3J5KG0sIG1lbSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZGJnX2FkZF9tZW1vcnlpbmZvKHByb3h5X21zZyAqbSwgbWVtb3J5aW5mbyAqbWVuaW5mbykKLXsKLQlpZiAobWVuaW5mbyA9PSBOVUxMKSB7Ci0JCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIEVNUFRZKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb3h5X21zZ19hZGRfc3RyaW5nKG0sIG1lbmluZm8tPmFkZHIpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG1lbmluZm8tPm5leHRSb3cpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG1lbmluZm8tPnByZXZSb3cpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG1lbmluZm8tPm5leHRQYWdlKTsKLQlwcm94eV9tc2dfYWRkX2ludChtLCBtZW5pbmZvLT5wcmV2UGFnZSk7Ci0JcHJveHlfbXNnX2FkZF9pbnQobSwgbWVuaW5mby0+bnVtQnl0ZXMpOwotCXByb3h5X21zZ19hZGRfaW50KG0sIG1lbmluZm8tPnRvdGFsQnl0ZXMpOwotCWRiZ19hZGRfbWVtb3JpZXMobSwgbWVuaW5mby0+bWVtb3JpZXMpOwotfQotCi1zdGF0aWMgdm9pZAotZGJnX2FkZF9haWYocHJveHlfbXNnICptLCBBSUYgKmEpCi17Ci0JcHJveHlfbXNnX2FkZF9zdHJpbmcobSwgQUlGX0ZPUk1BVChhKSk7Ci0JcHJveHlfbXNnX2FkZF9kYXRhKG0sIEFJRl9EQVRBKGEpLCBBSUZfTEVOKGEpKTsKLX0KLQotLyoKLSAqIFNlcmlhbGl6ZSBhIGRlYnVnIGV2ZW50IGZvciBzZW5kaW5nIGJldHdlZW4gZGVidWcgc2VydmVycy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZXZlbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUgYml0c2V0LCBzaW5jZSBpdCBpcwotICogb25seSByZWxldmFudCB0byBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGNsaWVudC4gVGhlIGJpdHNldCBpcwotICogYWRkZWQganVzdCBwcmlvciB0byBzZW5kaW5nIGJhY2sgdG8gdGhlIGNsaWVudC4KLSAqLwotaW50Ci1EYmdTZXJpYWxpemVFdmVudChkYmdfZXZlbnQgKmUsIGNoYXIgKipyZXN1bHQsIGludCAqbGVuKQotewotCWludAkJCXJlcyA9IDA7Ci0JcHJveHlfbXNnICoJcCA9IE5VTEw7Ci0KLQlpZiAoZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlwID0gbmV3X3Byb3h5X21zZyhlLT5ldmVudF9pZCwgZS0+dHJhbnNfaWQpOwotCi0Jc3dpdGNoIChlLT5ldmVudF9pZCkKLQl7Ci0JY2FzZSBEQkdFVl9PSzoKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0VSUk9SOgotCQlwcm94eV9tc2dfYWRkX2ludChwLCBlLT5kYmdfZXZlbnRfdS5lcnJvcl9ldmVudC5lcnJvcl9jb2RlKTsKLQkJcHJveHlfbXNnX2FkZF9zdHJpbmcocCwgZS0+ZGJnX2V2ZW50X3UuZXJyb3JfZXZlbnQuZXJyb3JfbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0lOSVQ6Ci0JCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91Lm51bV9zZXJ2ZXJzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1NVU1BFTkQ6Ci0JCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQucmVhc29uKTsKLQotCQlzd2l0Y2ggKGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQucmVhc29uKSB7Ci0JCWNhc2UgREJHRVZfU1VTUEVORF9CUEhJVDoKLQkJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZXZfdS5icGlkKTsKLQkJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQudGhyZWFkX2lkKTsKLQkJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZGVwdGgpOwotCQkJZGJnX2FkZF9zdHJpbmdzKHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgREJHRVZfU1VTUEVORF9TSUdOQUw6Ci0JCQlkYmdfYWRkX3NpZ25hbGluZm8ocCwgZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5ldl91LnNpZyk7Ci0JCQlkYmdfYWRkX3N0YWNrZnJhbWUocCwgZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5mcmFtZSk7Ci0JCQlwcm94eV9tc2dfYWRkX2ludChwLCBlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCk7Ci0JCQlwcm94eV9tc2dfYWRkX2ludChwLCBlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmRlcHRoKTsKLQkJCWRiZ19hZGRfc3RyaW5ncyhwLCBlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmNoYW5nZWRfdmFycyk7Ci0JCQlicmVhazsKLQotCQljYXNlIERCR0VWX1NVU1BFTkRfU1RFUDoKLQkJY2FzZSBEQkdFVl9TVVNQRU5EX0lOVDoKLQkJCWRiZ19hZGRfc3RhY2tmcmFtZShwLCBlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lKTsKLQkJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQudGhyZWFkX2lkKTsKLQkJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZGVwdGgpOwotCQkJZGJnX2FkZF9zdHJpbmdzKHAsIGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9CUFNFVDoKLSAJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LmJwc2V0X2V2ZW50LmJwaWQpOwotCQlkYmdfYWRkX2JyZWFrcG9pbnQocCwgZS0+ZGJnX2V2ZW50X3UuYnBzZXRfZXZlbnQuYnApOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfU0lHTkFMUzoKLSAJCWRiZ19hZGRfc2lnbmFscyhwLCBlLT5kYmdfZXZlbnRfdS5saXN0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0VYSVQ6Ci0JCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LmV4aXRfZXZlbnQucmVhc29uKTsKLQotCQlzd2l0Y2ggKGUtPmRiZ19ldmVudF91LmV4aXRfZXZlbnQucmVhc29uKSB7Ci0JCWNhc2UgREJHRVZfRVhJVF9OT1JNQUw6Ci0JCQlwcm94eV9tc2dfYWRkX2ludChwLCBlLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LmV2X3UuZXhpdF9zdGF0dXMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBEQkdFVl9FWElUX1NJR05BTDoKLQkJCWRiZ19hZGRfc2lnbmFsaW5mbyhwLCBlLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LmV2X3Uuc2lnKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9GUkFNRVM6Ci0gCQlkYmdfYWRkX3N0YWNrZnJhbWVzKHAsIGUtPmRiZ19ldmVudF91Lmxpc3QpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfVEhSRUFEX1NFTEVDVDoKLSAJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnRocmVhZF9zZWxlY3RfZXZlbnQudGhyZWFkX2lkKTsKLQkJZGJnX2FkZF9zdGFja2ZyYW1lKHAsIGUtPmRiZ19ldmVudF91LnRocmVhZF9zZWxlY3RfZXZlbnQuZnJhbWUpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfVEhSRUFEUzoKLSAJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnRocmVhZHNfZXZlbnQudGhyZWFkX2lkKTsKLQkJZGJnX2FkZF9zdHJpbmdzKHAsIGUtPmRiZ19ldmVudF91LnRocmVhZHNfZXZlbnQubGlzdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9TVEFDS19ERVBUSDoKLSAJCXByb3h5X21zZ19hZGRfaW50KHAsIGUtPmRiZ19ldmVudF91LnN0YWNrX2RlcHRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0RBVEFSX01FTToKLSAJCWRiZ19hZGRfbWVtb3J5aW5mbyhwLCBlLT5kYmdfZXZlbnRfdS5tZW1pbmZvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1ZBUlM6Ci0gCQlkYmdfYWRkX3N0cmluZ3MocCwgZS0+ZGJnX2V2ZW50X3UubGlzdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9BUkdTOgotCQlkYmdfYWRkX3N0cmluZ3MocCwgZS0+ZGJnX2V2ZW50X3UubGlzdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9UWVBFOgotCQlwcm94eV9tc2dfYWRkX3N0cmluZyhwLCBlLT5kYmdfZXZlbnRfdS50eXBlX2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfREFUQToKLSAJCWRiZ19hZGRfYWlmKHAsIGUtPmRiZ19ldmVudF91LmRhdGFfZXZlbnQuZGF0YSk7Ci0JCXByb3h5X21zZ19hZGRfc3RyaW5nKHAsIGUtPmRiZ19ldmVudF91LmRhdGFfZXZlbnQudHlwZV9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0RBVEFfRVZBX0VYOgotIAkJcHJveHlfbXNnX2FkZF9zdHJpbmcocCwgZS0+ZGJnX2V2ZW50X3UuZGF0YV9leHByZXNzaW9uKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1BBUlRJQUxfQUlGOgotIAkJZGJnX2FkZF9haWYocCwgZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQuZGF0YSk7Ci0JCXByb3h5X21zZ19hZGRfc3RyaW5nKHAsIGUtPmRiZ19ldmVudF91LnBhcnRpYWxfYWlmX2V2ZW50LnR5cGVfZGVzYyk7Ci0JCXByb3h5X21zZ19hZGRfc3RyaW5nKHAsIGUtPmRiZ19ldmVudF91LnBhcnRpYWxfYWlmX2V2ZW50Lm5hbWUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJlcyA9IC0xOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcHJveHlfc2VyaWFsaXplX21zZyhwLCByZXN1bHQsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9faW50KGNoYXIgKioqYXJncywgaW50ICpuYXJncywgaW50ICp2YWwpCi17Ci0JaWYgKCpuYXJncyA8IDEpCi0JCXJldHVybiAtMTsKLQotCXByb3h5X2dldF9pbnQoKigqYXJncykrKywgdmFsKTsKLQkqbmFyZ3MtLTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kYmdfY29weV9zdHIoY2hhciAqKiphcmdzLCBpbnQgKm5hcmdzLCBjaGFyICoqc3RyKQotewotCWlmICgqbmFyZ3MgPCAxKQotCQlyZXR1cm4gLTE7Ci0KLQkqc3RyID0gc3RyZHVwKCooKmFyZ3MpKyspOwotCSpuYXJncy0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fZGF0YShjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIGNoYXIgKipkYXRhLCBpbnQgKmxlbikKLXsKLQlpZiAoKm5hcmdzIDwgMSkKLQkJcmV0dXJuIC0xOwotCi0JcHJveHlfZ2V0X2RhdGEoKigqYXJncykrKywgZGF0YSwgbGVuKTsKLQkqbmFyZ3MtLTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kYmdfc3RyX3RvX2xvY2F0aW9uKGNoYXIgKioqYXJncywgaW50ICpuYXJncywgbG9jYXRpb24gKmxvYykKLXsKLQlpZiAoZGJnX2NvcHlfc3RyKGFyZ3MsIG5hcmdzLCAmbG9jLT5maWxlKSA8IDAgfHwKLQkJZGJnX2NvcHlfc3RyKGFyZ3MsIG5hcmdzLCAmbG9jLT5mdW5jKSA8IDAgfHwKLQkJZGJnX2NvcHlfc3RyKGFyZ3MsIG5hcmdzLCAmbG9jLT5hZGRyKSA8IDAgfHwKLQkJZGJnX3N0cl90b19pbnQoYXJncywgbmFyZ3MsICZsb2MtPmxpbmUpIDwgMCkgewotCQkJRnJlZUxvY2F0aW9uKGxvYyk7Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fYnJlYWtwb2ludChjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIGJyZWFrcG9pbnQgKipicCkKLXsKLQlpbnQJCQkJaWQ7Ci0JYnJlYWtwb2ludCAqCWI7Ci0KLQlpZiAoZGJnX3N0cl90b19pbnQoYXJncywgbmFyZ3MsICZpZCkgPCAwKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQliID0gTmV3QnJlYWtwb2ludChpZCk7Ci0KLQlpZiAoZGJnX3N0cl90b19pbnQoYXJncywgbmFyZ3MsICZiLT5pZ25vcmUpIDwgMCB8fAotCQlkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgJmItPnNwZWNpYWwpIDwgMCB8fAotCQlkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgJmItPmRlbGV0ZWQpIDwgMCB8fAotCQlkYmdfY29weV9zdHIoYXJncywgbmFyZ3MsICZiLT50eXBlKSA8IDAgfHwKLQkJZGJnX3N0cl90b19sb2NhdGlvbihhcmdzLCBuYXJncywgJmItPmxvYykgPCAwIHx8Ci0JCWRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAmYi0+aGl0cykgPCAwKSB7Ci0JCQlGcmVlQnJlYWtwb2ludChiKTsKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQkqYnAgPSBiOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fc3RhY2tmcmFtZShjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIHN0YWNrZnJhbWUgKipmcmFtZSkKLXsKLQlpbnQJCQkJbGV2ZWw7Ci0Jc3RhY2tmcmFtZSAqCXNmOwotCi0JaWYgKHN0cmNtcCgqKCphcmdzKSwgRU1QVFkpID09IDApIHsKLQkJKCphcmdzKSsrOwotCQkqbmFyZ3MtLTsKLQkJKmZyYW1lID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAmbGV2ZWwpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc2YgPSBOZXdTdGFja2ZyYW1lKGxldmVsKTsKLQotCWlmIChkYmdfc3RyX3RvX2xvY2F0aW9uKGFyZ3MsIG5hcmdzLCAmc2YtPmxvYykgPCAwKSB7Ci0JCUZyZWVTdGFja2ZyYW1lKHNmKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCSpmcmFtZSA9IHNmOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fc2lnbmFsaW5mbyhjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIHNpZ25hbGluZm8gKipzaWcpCi17Ci0Jc2lnbmFsaW5mbyAqczsKLQotCWlmIChzdHJjbXAoKigqYXJncyksIEVNUFRZKSA9PSAwKSB7Ci0JCSgqYXJncykrKzsKLQkJKm5hcmdzLS07Ci0JCSpzaWcgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzID0gTmV3U2lnbmFsSW5mbygpOwotCi0JaWYgKGRiZ19jb3B5X3N0cihhcmdzLCBuYXJncywgJnMtPm5hbWUpIDwgMCB8fAotCQlkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgJnMtPnN0b3ApIDwgMCB8fAotCQlkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgJnMtPnByaW50KSA8IDAgfHwKLQkJZGJnX3N0cl90b19pbnQoYXJncywgbmFyZ3MsICZzLT5wYXNzKSA8IDAgfHwKLQkJZGJnX2NvcHlfc3RyKGFyZ3MsIG5hcmdzLCAmcy0+ZGVzYykgPCAwKSB7Ci0JCQlGcmVlU2lnbmFsSW5mbyhzKTsKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQkqc2lnID0gczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kYmdfc3RyX3RvX3N0YWNrZnJhbWVzKGNoYXIgKioqYXJncywgaW50ICpuYXJncywgTGlzdCAqKmxzdCkKLXsKLQlpbnQJCQkJaTsKLQlpbnQJCQkJY291bnQ7Ci0Jc3RhY2tmcmFtZSAqCXNmOwotCi0JaWYgKGRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAmY291bnQpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JKmxzdCA9IE5ld0xpc3QoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmIChkYmdfc3RyX3RvX3N0YWNrZnJhbWUoYXJncywgbmFyZ3MsICZzZikgPCAwKSB7Ci0JCQlEZXN0cm95TGlzdCgqbHN0LCBGcmVlU3RhY2tmcmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJQWRkVG9MaXN0KCpsc3QsICh2b2lkICopc2YpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kYmdfc3RyX3RvX3NpZ25hbHMoY2hhciAqKiphcmdzLCBpbnQgKm5hcmdzLCBMaXN0ICoqbHN0KQotewotCWludAkJCQlpOwotCWludAkJCQljb3VudDsKLQlzaWduYWxpbmZvICoJc2lnOwotCi0JaWYgKGRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAmY291bnQpIDwgMCkgewotCX0KLQotCSpsc3QgPSBOZXdMaXN0KCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAoZGJnX3N0cl90b19zaWduYWxpbmZvKGFyZ3MsIG5hcmdzLCAmc2lnKSA8IDApIHsKLQkJCURlc3Ryb3lMaXN0KCpsc3QsIEZyZWVNZW1vcnkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUFkZFRvTGlzdCgqbHN0LCAodm9pZCAqKXNpZyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fbGlzdChjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIExpc3QgKipsc3QpCi17Ci0JaW50CQlpOwotCWludAkJY291bnQ7Ci0JY2hhciAqCXN0cjsKLQotCWlmIChkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgJmNvdW50KSA8IDApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCSpsc3QgPSBOZXdMaXN0KCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAoZGJnX2NvcHlfc3RyKGFyZ3MsIG5hcmdzLCAmc3RyKSA8IDApIHsKLQkJCURlc3Ryb3lMaXN0KCpsc3QsIGZyZWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUFkZFRvTGlzdCgqbHN0LCAodm9pZCAqKXN0cik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fYWlmKGNoYXIgKioqYXJncywgaW50ICpuYXJncywgQUlGICoqcmVzKQotewotCWludAkJZGF0YV9sZW47Ci0JQUlGICoJYTsKLQljaGFyICoJZm10OwotCWNoYXIgKglkYXRhOwotCi0JaWYgKGRiZ19jb3B5X3N0cihhcmdzLCBuYXJncywgJmZtdCkgPCAwIHx8Ci0JCWRiZ19zdHJfdG9fZGF0YShhcmdzLCBuYXJncywgJmRhdGEsICZkYXRhX2xlbikgPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JYSA9IE5ld0FJRigwLCAwKTsKLQlBSUZfRk9STUFUKGEpID0gZm10OwotCUFJRl9EQVRBKGEpID0gZGF0YTsKLQlBSUZfTEVOKGEpID0gZGF0YV9sZW47Ci0KLQkqcmVzID0gYTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kYmdfc3RyX3RvX21lbW9yeV9kYXRhKGNoYXIgKioqYXJncywgaW50ICpuYXJncywgTGlzdCAqKmxzdCkKLXsKLQlpbnQJCWk7Ci0JaW50CQljb3VudDsKLQljaGFyICoJc3RyOwotCi0JaWYgKGRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAmY291bnQpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JKmxzdCA9IE5ld0xpc3QoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmIChkYmdfY29weV9zdHIoYXJncywgbmFyZ3MsICZzdHIpIDwgMCkgewotCQkJRGVzdHJveUxpc3QoKmxzdCwgZnJlZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJQWRkVG9MaXN0KCpsc3QsICh2b2lkICopc3RyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1kYmdfc3RyX3RvX21lbW9yeShjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIExpc3QgKipsc3QpCi17Ci0JaW50CQkJaTsKLQlpbnQJCQljb3VudDsKLQltZW1vcnkgKgltOwotCi0JaWYgKGRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAmY291bnQpIDwgMCkgewotCX0KLQotCSpsc3QgPSBOZXdMaXN0KCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQltID0gTmV3TWVtb3J5KCk7Ci0JCWlmIChkYmdfY29weV9zdHIoYXJncywgbmFyZ3MsICZtLT5hZGRyKSA8IDAgfHwKLQkJCWRiZ19jb3B5X3N0cihhcmdzLCBuYXJncywgJm0tPmFzY2lpKSA8IDAgfHwKLQkJCWRiZ19zdHJfdG9fbWVtb3J5X2RhdGEoYXJncywgbmFyZ3MsICZtLT5kYXRhKSA8IDApIHsKLQkJCQlEZXN0cm95TGlzdCgqbHN0LCBGcmVlTWVtb3J5KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJQWRkVG9MaXN0KCpsc3QsICh2b2lkICopbSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRiZ19zdHJfdG9fbWVtb3J5aW5mbyhjaGFyICoqKmFyZ3MsIGludCAqbmFyZ3MsIG1lbW9yeWluZm8gKippbmZvKQotewotCW1lbW9yeWluZm8gKiBtZW1pbmZvOwotCi0JaWYgKCpuYXJncyA8IDEpCi0JCXJldHVybiAtMTsKLQotCWlmIChzdHJjbXAoKigqYXJncyksIEVNUFRZKSA9PSAwKSB7Ci0JCSgqYXJncykrKzsKLQkJKm5hcmdzLS07Ci0JCSppbmZvID0gTlVMTDsKLQl9Ci0KLQltZW1pbmZvID0gTmV3TWVtb3J5SW5mbygpOwotCi0JaWYgKGRiZ19jb3B5X3N0cihhcmdzLCBuYXJncywgJm1lbWluZm8tPmFkZHIpIDwgMCB8fAotCQlkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgKGludCAqKSZtZW1pbmZvLT5uZXh0Um93KSA8IDAgfHwKLQkJZGJnX3N0cl90b19pbnQoYXJncywgbmFyZ3MsIChpbnQgKikmbWVtaW5mby0+cHJldlJvdykgPCAwIHx8Ci0JCWRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAoaW50ICopJm1lbWluZm8tPm5leHRQYWdlKSA8IDAgfHwKLQkJZGJnX3N0cl90b19pbnQoYXJncywgbmFyZ3MsIChpbnQgKikmbWVtaW5mby0+cHJldlBhZ2UpIDwgMCB8fAotCQlkYmdfc3RyX3RvX2ludChhcmdzLCBuYXJncywgKGludCAqKSZtZW1pbmZvLT5udW1CeXRlcykgPCAwIHx8Ci0JCWRiZ19zdHJfdG9faW50KGFyZ3MsIG5hcmdzLCAoaW50ICopJm1lbWluZm8tPnRvdGFsQnl0ZXMpIDwgMCB8fAotCQlkYmdfc3RyX3RvX21lbW9yeShhcmdzLCBuYXJncywgJm1lbWluZm8tPm1lbW9yaWVzKSA8IDApIHsKLQkJCUZyZWVNZW1vcnlJbmZvKG1lbWluZm8pOwotCQkJcmV0dXJuIC0xOwotCX0KLQotCSppbmZvID0gbWVtaW5mbzsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ29udmVydCBhbiBhcnJheSBvZiBzdHJpbmdzIChhcyBhIHJlc3VsdCBvZiBkZXNlcmlhbGl6aW5nIGEgcHJveHkgbWVzc2FnZSkKLSAqIGludG8gYSBkZWJ1ZyBldmVudC4gVGhpcyBpcyB1c2VkIG9uIHRoZSBjbGllbnQgZW5kLCBzbyB0aGUgZXZlbnQgd2lsbCBpbmNsdWRlCi0gKiBhIGJpdHNldC4KLSAqLwotaW50Ci1EYmdEZXNlcmlhbGl6ZUV2ZW50KGludCBpZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncywgZGJnX2V2ZW50ICoqZXYpCi17Ci0JZGJnX2V2ZW50ICoJZSA9IE5VTEw7Ci0JYml0c2V0ICoJcHJvY3MgPSBOVUxMOwotCi0JcHJveHlfZ2V0X2JpdHNldCgqYXJncysrLCAmcHJvY3MpOwotCW5hcmdzLS07Ci0KLQllID0gTmV3RGJnRXZlbnQoaWQpOwotCi0Jc3dpdGNoIChpZCkKLQl7Ci0JY2FzZSBEQkdFVl9PSzoKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0VSUk9SOgotCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UuZXJyb3JfZXZlbnQuZXJyb3JfY29kZSk7Ci0JCWRiZ19jb3B5X3N0cigmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UuZXJyb3JfZXZlbnQuZXJyb3JfbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0lOSVQ6Ci0JCWRiZ19zdHJfdG9faW50KCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5udW1fc2VydmVycyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9TVVNQRU5EOgotCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24pOwotCi0JCXN3aXRjaCAoZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24pIHsKLQkJY2FzZSBEQkdFVl9TVVNQRU5EX0JQSElUOgotCQkJZGJnX3N0cl90b19pbnQoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZXZfdS5icGlkKTsKLQkJCWRiZ19zdHJfdG9faW50KCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCk7Ci0JCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5kZXB0aCk7Ci0JCQlkYmdfc3RyX3RvX2xpc3QoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgREJHRVZfU1VTUEVORF9TSUdOQUw6Ci0JCQlkYmdfc3RyX3RvX3NpZ25hbGluZm8oJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZXZfdS5zaWcpOwotCQkJZGJnX3N0cl90b19zdGFja2ZyYW1lKCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lKTsKLQkJCWRiZ19zdHJfdG9faW50KCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCk7Ci0JCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5kZXB0aCk7Ci0JCQlkYmdfc3RyX3RvX2xpc3QoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgREJHRVZfU1VTUEVORF9TVEVQOgotCQljYXNlIERCR0VWX1NVU1BFTkRfSU5UOgotCQkJZGJnX3N0cl90b19zdGFja2ZyYW1lKCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lKTsKLQkJCWRiZ19zdHJfdG9faW50KCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LnRocmVhZF9pZCk7Ci0JCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5kZXB0aCk7Ci0JCQlkYmdfc3RyX3RvX2xpc3QoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlnb3RvIGVycm9yX291dDsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9CUFNFVDoKLQkJZGJnX3N0cl90b19pbnQoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LmJwc2V0X2V2ZW50LmJwaWQpOwotCQlkYmdfc3RyX3RvX2JyZWFrcG9pbnQoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LmJwc2V0X2V2ZW50LmJwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1NJR05BTFM6Ci0JCWRiZ19zdHJfdG9fc2lnbmFscygmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UubGlzdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9FWElUOgotCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UuZXhpdF9ldmVudC5yZWFzb24pOwotCi0JCXN3aXRjaCAoZS0+ZGJnX2V2ZW50X3UuZXhpdF9ldmVudC5yZWFzb24pIHsKLQkJY2FzZSBEQkdFVl9FWElUX05PUk1BTDoKLQkJCWRiZ19zdHJfdG9faW50KCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5leGl0X2V2ZW50LmV2X3UuZXhpdF9zdGF0dXMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBEQkdFVl9FWElUX1NJR05BTDoKLQkJCWRiZ19zdHJfdG9fc2lnbmFsaW5mbygmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UuZXhpdF9ldmVudC5ldl91LnNpZyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZ290byBlcnJvcl9vdXQ7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgREJHRVZfRlJBTUVTOgotCQlkYmdfc3RyX3RvX3N0YWNrZnJhbWVzKCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5saXN0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1RIUkVBRF9TRUxFQ1Q6Ci0JCWRiZ19zdHJfdG9faW50KCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS50aHJlYWRfc2VsZWN0X2V2ZW50LnRocmVhZF9pZCk7Ci0JCWRiZ19zdHJfdG9fc3RhY2tmcmFtZSgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UudGhyZWFkX3NlbGVjdF9ldmVudC5mcmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9USFJFQURTOgotCQlkYmdfc3RyX3RvX2ludCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UudGhyZWFkc19ldmVudC50aHJlYWRfaWQpOwotCQlkYmdfc3RyX3RvX2xpc3QoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnRocmVhZHNfZXZlbnQubGlzdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9TVEFDS19ERVBUSDoKLQkJZGJnX3N0cl90b19pbnQoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LnN0YWNrX2RlcHRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0RBVEFSX01FTToKLQkJZGJnX3N0cl90b19tZW1vcnlpbmZvKCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5tZW1pbmZvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1ZBUlM6Ci0JCWRiZ19zdHJfdG9fbGlzdCgmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UubGlzdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9BUkdTOgotCQlkYmdfc3RyX3RvX2xpc3QoJmFyZ3MsJm5hcmdzLCAgJmUtPmRiZ19ldmVudF91Lmxpc3QpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfVFlQRToKLQkJZGJnX2NvcHlfc3RyKCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS50eXBlX2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfREFUQToKLQkJZGJnX3N0cl90b19haWYoJmFyZ3MsICZuYXJncywgJmUtPmRiZ19ldmVudF91LmRhdGFfZXZlbnQuZGF0YSk7Ci0JCWRiZ19jb3B5X3N0cigmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UuZGF0YV9ldmVudC50eXBlX2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfREFUQV9FVkFfRVg6Ci0JCWRiZ19jb3B5X3N0cigmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UuZGF0YV9leHByZXNzaW9uKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1BBUlRJQUxfQUlGOgotCQlkYmdfc3RyX3RvX2FpZigmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQuZGF0YSk7Ci0JCWRiZ19jb3B5X3N0cigmYXJncywgJm5hcmdzLCAmZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQudHlwZV9kZXNjKTsKLQkJZGJnX2NvcHlfc3RyKCZhcmdzLCAmbmFyZ3MsICZlLT5kYmdfZXZlbnRfdS5wYXJ0aWFsX2FpZl9ldmVudC5uYW1lKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlnb3RvIGVycm9yX291dDsKLQl9Ci0KLQllLT5wcm9jcyA9IHByb2NzOwotCSpldiA9IGU7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3Jfb3V0OgotCi0JaWYgKHByb2NzICE9IE5VTEwpCi0JCWJpdHNldF9mcmVlKHByb2NzKTsKLQotCWlmIChlICE9IE5VTEwpCi0JCUZyZWVEYmdFdmVudChlKTsKLQotCXJldHVybiAtMTsKLX0KLQotZGJnX2V2ZW50ICoKLU5ld0RiZ0V2ZW50KGludCBldmVudCkgewotCWRiZ19ldmVudCAqCWUgPSAoZGJnX2V2ZW50ICopbWFsbG9jKHNpemVvZihkYmdfZXZlbnQpKTsKLQotCW1lbXNldCgodm9pZCAqKWUsIDAsIHNpemVvZihkYmdfZXZlbnQpKTsKLQotCWUtPmV2ZW50X2lkID0gZXZlbnQ7Ci0KLQlyZXR1cm4gZTsKLX0KLQotdm9pZAotRnJlZURiZ0V2ZW50KGRiZ19ldmVudCAqZSkgewotCXN3aXRjaCAoZS0+ZXZlbnRfaWQpIHsKLQljYXNlIERCR0VWX09LOgotCWNhc2UgREJHRVZfSU5JVDoKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX1NVU1BFTkQ6Ci0JCXN3aXRjaCAoZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24pIHsKLQkJY2FzZSBEQkdFVl9TVVNQRU5EX1NJR05BTDoKLQkJCWlmIChlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmV2X3Uuc2lnICE9IE5VTEwpCi0JCQkJRnJlZVNpZ25hbEluZm8oZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5ldl91LnNpZyk7Ci0JCQlicmVhazsKLQkJY2FzZSBEQkdFVl9TVVNQRU5EX0lOVDoKLQkJY2FzZSBEQkdFVl9TVVNQRU5EX1NURVA6Ci0JCQlicmVhazsKLQotCQljYXNlIERCR0VWX1NVU1BFTkRfQlBISVQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lICE9IE5VTEwpCi0JCQlGcmVlU3RhY2tmcmFtZShlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmZyYW1lKTsKLQkJaWYgKGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuY2hhbmdlZF92YXJzICE9IE5VTEwpCi0JCQlEZXN0cm95TGlzdChlLT5kYmdfZXZlbnRfdS5zdXNwZW5kX2V2ZW50LmNoYW5nZWRfdmFycywgZnJlZSk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0VYSVQ6Ci0JCXN3aXRjaCAoZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5yZWFzb24pIHsKLQkJCWNhc2UgREJHRVZfRVhJVF9TSUdOQUw6Ci0JCQkJaWYgKGUtPmRiZ19ldmVudF91LnN1c3BlbmRfZXZlbnQuZXZfdS5zaWcgIT0gTlVMTCkKLQkJCQkJRnJlZVNpZ25hbEluZm8oZS0+ZGJnX2V2ZW50X3Uuc3VzcGVuZF9ldmVudC5ldl91LnNpZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERCR0VWX0VYSVRfTk9STUFMOgotCQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9GUkFNRVM6Ci0JCWlmIChlLT5kYmdfZXZlbnRfdS5saXN0ICE9IE5VTEwpCi0JCQlEZXN0cm95TGlzdChlLT5kYmdfZXZlbnRfdS5saXN0LCBGcmVlU3RhY2tmcmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9EQVRBOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UuZGF0YV9ldmVudC5kYXRhICE9IE5VTEwpCi0JCQlBSUZGcmVlKGUtPmRiZ19ldmVudF91LmRhdGFfZXZlbnQuZGF0YSk7Ci0JCWlmIChlLT5kYmdfZXZlbnRfdS5kYXRhX2V2ZW50LnR5cGVfZGVzYyAhPSBOVUxMKQotCQkJZnJlZShlLT5kYmdfZXZlbnRfdS5kYXRhX2V2ZW50LnR5cGVfZGVzYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9UWVBFOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UudHlwZV9kZXNjICE9IE5VTEwpCi0JCQlmcmVlKGUtPmRiZ19ldmVudF91LnR5cGVfZGVzYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9USFJFQURfU0VMRUNUOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UudGhyZWFkX3NlbGVjdF9ldmVudC5mcmFtZSAhPSBOVUxMKQotCQkJRnJlZVN0YWNrZnJhbWUoZS0+ZGJnX2V2ZW50X3UudGhyZWFkX3NlbGVjdF9ldmVudC5mcmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9USFJFQURTOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UudGhyZWFkc19ldmVudC5saXN0ICE9IE5VTEwpCi0JCQlEZXN0cm95TGlzdChlLT5kYmdfZXZlbnRfdS50aHJlYWRzX2V2ZW50Lmxpc3QsIGZyZWUpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfREFUQVJfTUVNOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UubWVtaW5mbyAhPSBOVUxMKQotCQkJRnJlZU1lbW9yeUluZm8oZS0+ZGJnX2V2ZW50X3UubWVtaW5mbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9BUkdTOgotCWNhc2UgREJHRVZfVkFSUzoKLQkJaWYgKGUtPmRiZ19ldmVudF91Lmxpc3QgIT0gTlVMTCkKLQkJCURlc3Ryb3lMaXN0KGUtPmRiZ19ldmVudF91Lmxpc3QsIGZyZWUpOwotCQlicmVhazsKLQotCWNhc2UgREJHRVZfU0lHTkFMUzoKLQkJaWYgKGUtPmRiZ19ldmVudF91Lmxpc3QgIT0gTlVMTCkKLQkJCURlc3Ryb3lMaXN0KGUtPmRiZ19ldmVudF91Lmxpc3QsIEZyZWVTaWduYWxJbmZvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0JQU0VUOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UuYnBzZXRfZXZlbnQuYnAgIT0gTlVMTCkKLQkJCUZyZWVCcmVha3BvaW50KGUtPmRiZ19ldmVudF91LmJwc2V0X2V2ZW50LmJwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERCR0VWX0RBVEFfRVZBX0VYOgotCQlpZiAoZS0+ZGJnX2V2ZW50X3UuZGF0YV9leHByZXNzaW9uICE9IE5VTEwpCi0JCQlmcmVlKGUtPmRiZ19ldmVudF91LmRhdGFfZXhwcmVzc2lvbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBEQkdFVl9QQVJUSUFMX0FJRjoKLQkJaWYgKGUtPmRiZ19ldmVudF91LnBhcnRpYWxfYWlmX2V2ZW50LmRhdGEgIT0gTlVMTCkKLQkJCUFJRkZyZWUoZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQuZGF0YSk7Ci0JCWlmIChlLT5kYmdfZXZlbnRfdS5wYXJ0aWFsX2FpZl9ldmVudC50eXBlX2Rlc2MgIT0gTlVMTCkKLQkJCWZyZWUoZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQudHlwZV9kZXNjKTsKLQkJaWYgKGUtPmRiZ19ldmVudF91LnBhcnRpYWxfYWlmX2V2ZW50Lm5hbWUgIT0gTlVMTCkKLQkJCWZyZWUoZS0+ZGJnX2V2ZW50X3UucGFydGlhbF9haWZfZXZlbnQubmFtZSk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChlLT5wcm9jcyAhPSBOVUxMKQotCQliaXRzZXRfZnJlZShlLT5wcm9jcyk7Ci0KLQlmcmVlKGUpOwotfQotCi1kYmdfZXZlbnQgKgotRGJnRXJyb3JFdmVudChpbnQgZXJyLCBjaGFyICptc2cpCi17Ci0JZGJnX2V2ZW50ICoJZSA9IE5ld0RiZ0V2ZW50KERCR0VWX0VSUk9SKTsKLQotCWUtPmRiZ19ldmVudF91LmVycm9yX2V2ZW50LmVycm9yX2NvZGUgPSBlcnI7Ci0JaWYgKG1zZyAhPSBOVUxMKQotCQllLT5kYmdfZXZlbnRfdS5lcnJvcl9ldmVudC5lcnJvcl9tc2cgPSBzdHJkdXAobXNnKTsKLQotCXJldHVybiBlOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS9zcmMvdXRpbHMvaXRpbWVyLmMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9pdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhMTdkZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9pdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgX19nbnVfbGludXhfXwotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmIC8qIF9fZ251X2xpbnV4X18gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpdGltZXIuaCIKLQotaXRpbWVyICoJCi1pdGltZXJfbmV3KGNoYXIgKmxhYmVsKSAKLXsKLQlzdGF0aWMgaW50CWlkID0gMDsKLQlpdGltZXIgKgkJdCA9IChpdGltZXIgKiltYWxsb2Moc2l6ZW9mKGl0aW1lcikpOwotCQotCWlmIChsYWJlbCAhPSBOVUxMKQotCQl0LT5sYWJlbCA9IHN0cmR1cChsYWJlbCk7Ci0JZWxzZQotCQlhc3ByaW50ZigmdC0+bGFiZWwsICJ0aW1lcl8lZFxuIiwgaWQrKyk7Ci0KLQl0LT5ydW5uaW5nID0gMDsKLQl0LT50b3RhbF9lbGFwc2VkID0gMDsKLQl0LT5tYXJrX2NudCA9IDA7Ci0JcmV0dXJuIHQ7Ci19Ci0KLXZvaWQKLWl0aW1lcl9zdGFydChpdGltZXIgKnQpCi17Ci0JaWYgKHQtPnJ1bm5pbmcpIHsKLQkJcHJpbnRmKCJ3YXJuaW5nOiBhdHRlbXB0IHRvIHN0YXJ0IGEgcnVubmluZyB0aW1lclxuIik7IGZmbHVzaChzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCQkKLQkodm9pZClnZXR0aW1lb2ZkYXkoJnQtPnN0YXJ0LCBOVUxMKTsKLQotCXQtPmxhc3RfbWFyay50dl9zZWMgPSB0LT5zdGFydC50dl9zZWM7Ci0JdC0+bGFzdF9tYXJrLnR2X3VzZWMgPSB0LT5zdGFydC50dl91c2VjOwotCXQtPnJ1bm5pbmcgPSAxOwotCXQtPmVsYXBzZWQgPSAwOwotfQotCi12b2lkCi1pdGltZXJfcmVzZXQoaXRpbWVyICp0KQotewotCXQtPnJ1bm5pbmcgPSAwOwotCXQtPmVsYXBzZWQgPSAwOwotCXQtPnRvdGFsX2VsYXBzZWQgPSAwOwotfQotCi12b2lkCi1pdGltZXJfcHJpbnQoaXRpbWVyICp0KQotewotCWludCBpOwotCQotCXByaW50ZigiKysrKyAlczogc3RhcnRlZCBhdCAlbGQrJWxkXG4iLCB0LT5sYWJlbCwgKGxvbmcpdC0+c3RhcnQudHZfc2VjLCAobG9uZyl0LT5zdGFydC50dl91c2VjKTsgZmZsdXNoKHN0ZG91dCk7Ci0JZm9yIChpID0gMDsgaSA8IHQtPm1hcmtfY250OyBpKyspCi0JCXByaW50ZigiKysrKyAlczogXCIlc1wiIG1hcmsgdGltZSBpcyAlbGQgbXNcbiIsIHQtPmxhYmVsLCB0LT5tYXJrc1tpXS5sYWJlbCwgdC0+bWFya3NbaV0uZWxhcHNlZCk7IGZmbHVzaChzdGRvdXQpOwkKLQlpZiAodC0+ZWxhcHNlZCA+IDApCi0JCXByaW50ZigiKysrKyAlczogbGFzdCBlbGFwc2VkIHRpbWUgaXMgJWxkIG1zXG4iLCB0LT5sYWJlbCwgdC0+ZWxhcHNlZCk7IGZmbHVzaChzdGRvdXQpOwotCWlmICh0LT50b3RhbF9lbGFwc2VkID4gMCkKLQkJcHJpbnRmKCIrKysrICVzOiB0b3RhbCBlbGFwc2VkIHRpbWUgaXMgJWxkIG1zXG4iLCB0LT5sYWJlbCwgdC0+dG90YWxfZWxhcHNlZCk7IGZmbHVzaChzdGRvdXQpOwotfQotCi12b2lkCQotaXRpbWVyX21hcmsoaXRpbWVyICp0LCBjaGFyICptc2cpIAotewotCXN0cnVjdCB0aW1ldmFsCW1hcms7Ci0JCi0JaWYgKHQtPm1hcmtfY250ID09IE1BWF9NQVJLUykKLQkJcmV0dXJuOwotCQkKLQkodm9pZClnZXR0aW1lb2ZkYXkoJm1hcmssIE5VTEwpOwotCQotCXQtPm1hcmtzW3QtPm1hcmtfY250XS5lbGFwc2VkID0gKChsb25nKW1hcmsudHZfc2VjICogMTAwMCArIChsb25nKW1hcmsudHZfdXNlYyAvIDEwMDApIAotCQktICgobG9uZyl0LT5sYXN0X21hcmsudHZfc2VjICogMTAwMCArIChsb25nKXQtPmxhc3RfbWFyay50dl91c2VjIC8gMTAwMCk7Ci0JCi0JdC0+bWFya3NbdC0+bWFya19jbnRdLmxhYmVsID0gc3RyZHVwKG1zZyk7Ci0JCi0JdC0+bGFzdF9tYXJrLnR2X3NlYyA9IG1hcmsudHZfc2VjOwotCXQtPmxhc3RfbWFyay50dl91c2VjID0gbWFyay50dl91c2VjOwotCXQtPm1hcmtfY250Kys7Ci19Ci0KLXZvaWQKLWl0aW1lcl9zdG9wKGl0aW1lciAqdCkKLXsKLQlpZiAoIXQtPnJ1bm5pbmcpIHsKLQkJcHJpbnRmKCJ3YXJuaW5nOiBhdHRlbXB0IHRvIHN0b3AgYSBzdG9wcGVkIHRpbWVyXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0JCXJldHVybjsKLQl9Ci0JCQotCSh2b2lkKWdldHRpbWVvZmRheSgmdC0+c3RvcCwgTlVMTCk7Ci0JCi0JdC0+ZWxhcHNlZCA9ICgobG9uZyl0LT5zdG9wLnR2X3NlYyAqIDEwMDAgKyAobG9uZyl0LT5zdG9wLnR2X3VzZWMgLyAxMDAwKSAKLQkJLSAoKGxvbmcpdC0+c3RhcnQudHZfc2VjICogMTAwMCArIChsb25nKXQtPnN0YXJ0LnR2X3VzZWMgLyAxMDAwKTsKLQl0LT50b3RhbF9lbGFwc2VkICs9IHQtPmVsYXBzZWQ7Ci0JdC0+cnVubmluZyA9IDA7Ci19Ci0KLXZvaWQKLWl0aW1lcl9mcmVlKGl0aW1lciAqdCkgCi17Ci0JaW50IGk7Ci0JaWYgKHQtPmxhYmVsICE9IE5VTEwpCi0JCWZyZWUodC0+bGFiZWwpOwotCWZvciAoaSA9IDA7IGkgPCB0LT5tYXJrX2NudDsgaSsrKQotCQlmcmVlKHQtPm1hcmtzW2ldLmxhYmVsKTsJCi0JZnJlZSh0KTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL21lbW9yeWluZm8uYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL21lbW9yeWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlNjM0OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9tZW1vcnlpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLSAvKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibWVtb3J5aW5mby5oIgotCi1tZW1vcnlpbmZvICogTmV3TWVtb3J5SW5mbyh2b2lkKSB7Ci0JbWVtb3J5aW5mbyAqIG1lbWluZm8gPSAobWVtb3J5aW5mbyAqKW1hbGxvYyhzaXplb2YobWVtb3J5aW5mbykpOwkKLQltZW1pbmZvLT5hZGRyID0gTlVMTDsKLQltZW1pbmZvLT5tZW1vcmllcyA9IE5VTEw7Ci0JcmV0dXJuIG1lbWluZm87Ci19Ci0KLW1lbW9yeSAqIE5ld01lbW9yeSh2b2lkKSB7Ci0JbWVtb3J5ICogbWVtID0gKG1lbW9yeSAqKW1hbGxvYyhzaXplb2YobWVtb3J5KSk7CQotCW1lbS0+YWRkciA9IE5VTEw7Ci0JbWVtLT5kYXRhID0gTlVMTDsKLQltZW0tPmFzY2lpID0gTlVMTDsKLQlyZXR1cm4gbWVtOwotfQotCi12b2lkIEZyZWVNZW1vcnlJbmZvKG1lbW9yeWluZm8gKm1lbWluZm8pICB7Ci0JaWYgKG1lbWluZm8tPmFkZHIgIT0gTlVMTCkKLQkJZnJlZShtZW1pbmZvLT5hZGRyKTsKLQlpZiAobWVtaW5mby0+bWVtb3JpZXMgIT0gTlVMTCkKLQkJRGVzdHJveUxpc3QobWVtaW5mby0+bWVtb3JpZXMsIEZyZWVNZW1vcnkpOwotCWZyZWUobWVtaW5mbyk7Ci19Ci0KLXZvaWQgRnJlZU1lbW9yeShtZW1vcnkgKm1lbSkgewotCWlmIChtZW0tPmFkZHIgIT0gTlVMTCkKLQkJZnJlZShtZW0tPmFkZHIpOwotCWlmIChtZW0tPmFzY2lpICE9IE5VTEwpCi0JCWZyZWUobWVtLT5hc2NpaSk7Ci0JaWYgKG1lbS0+ZGF0YSAhPSBOVUxMKQotCQlEZXN0cm95TGlzdChtZW0tPmRhdGEsIGZyZWUpOwotCWZyZWUobWVtKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL3NpZ25hbGluZm8uYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL3NpZ25hbGluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxZTliZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9zaWduYWxpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNpZ25hbGluZm8uaCIKLQotc2lnbmFsaW5mbyAqIE5ld1NpZ25hbEluZm8odm9pZCkgewotCXNpZ25hbGluZm8gKnNpZyA9IChzaWduYWxpbmZvICopbWFsbG9jKHNpemVvZihzaWduYWxpbmZvKSk7Ci0JCi0Jc2lnLT5uYW1lID0gTlVMTDsKLQlzaWctPnN0b3AgPSAwOwotCXNpZy0+cHJpbnQgPSAwOwotCXNpZy0+cGFzcyA9IDA7Ci0Jc2lnLT5kZXNjID0gTlVMTDsKLQlyZXR1cm4gc2lnOwotfQotCi12b2lkIEZyZWVTaWduYWxJbmZvKHNpZ25hbGluZm8gKnNpZykgewotCWlmIChzaWctPm5hbWUgIT0gTlVMTCkKLQkJZnJlZShzaWctPm5hbWUpOwotCWlmIChzaWctPmRlc2MgIT0gTlVMTCkKLQkJZnJlZShzaWctPmRlc2MpOwotCWZyZWUoc2lnKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL3N0YWNrZnJhbWUuYyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0vc3JjL3V0aWxzL3N0YWNrZnJhbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNzY5Yy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtL3NyYy91dGlscy9zdGFja2ZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLQotc3RhY2tmcmFtZSAqCQotTmV3U3RhY2tmcmFtZShpbnQgbGV2ZWwpCi17Ci0Jc3RhY2tmcmFtZSAqCXNmID0gKHN0YWNrZnJhbWUgKiltYWxsb2Moc2l6ZW9mKHN0YWNrZnJhbWUpKTsKLQkKLQlzZi0+bGV2ZWwgPSBsZXZlbDsKLQlzZi0+bG9jLmZpbGUgPSBOVUxMOwotCXNmLT5sb2MuZnVuYyA9IE5VTEw7Ci0Jc2YtPmxvYy5hZGRyID0gTlVMTDsKLQlzZi0+bG9jLmxpbmUgPSAwOwotCQotCXJldHVybiBzZjsKLX0KLQotdm9pZAotRnJlZUxvY2F0aW9uKGxvY2F0aW9uICpsb2MpIAotewotCWlmIChsb2MtPmZpbGUgIT0gTlVMTCkgewotCQlmcmVlKGxvYy0+ZmlsZSk7Ci0JCWxvYy0+ZmlsZSA9IE5VTEw7Ci0JfQotCWlmIChsb2MtPmZ1bmMgIT0gTlVMTCkgewotCQlmcmVlKGxvYy0+ZnVuYyk7Ci0JCWxvYy0+ZnVuYyA9IE5VTEw7Ci0JfQotCWlmIChsb2MtPmFkZHIgIT0gTlVMTCkgewotCQlmcmVlKGxvYy0+YWRkcik7Ci0JCWxvYy0+YWRkciA9IE5VTEw7Ci0JfQotfQotCi12b2lkCQotRnJlZVN0YWNrZnJhbWUoc3RhY2tmcmFtZSAqc2YpCi17Ci0JRnJlZUxvY2F0aW9uKCZzZi0+bG9jKTsJCi0JZnJlZShzZik7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvLmNsYXNzcGF0aCBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLy5jdnNpZ25vcmUgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNjkxZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1kb2MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvLnByb2plY3QgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzJlMDcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmE1OTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXVnIDA5IDExOjQ2OjQ2IE1EVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZlM2UyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5jZHQuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wsCi0gb3JnLmVjbGlwc2UucHRwLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5ldmVudHMsCi0gb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmxpc3RlbmVycywKLSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkudmlld3MKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9hYm91dC5odG1sIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWYxY2EuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYWRkcmVzc19vdnIuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2FkZHJlc3Nfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNmQxYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYWRkcmVzc19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2FkZHJlc3Nfb3ZyX2Rpc2FibGVkLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9hZGRyZXNzX292cl9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDY2NTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2FkZHJlc3Nfb3ZyX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHQuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOGE1MzkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X2N1cnJfc2V0X2Rpc2FibGUuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9jdXJyX3NldF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkNzc5OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X2N1cnJfc2V0X2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9jdXJyX3NldF9kaXNhYmxlLnBuZyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfY3Vycl9zZXRfZGlzYWJsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzI1YzYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9jdXJyX3NldF9kaXNhYmxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfY3Vycl9zZXRfZW5hYmxlLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfY3Vycl9zZXRfZW5hYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZmUzMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X2N1cnJfc2V0X2VuYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X2N1cnJfc2V0X2VuYWJsZS5wbmcgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X2N1cnJfc2V0X2VuYWJsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjBhNzQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9jdXJyX3NldF9lbmFibGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9tdWx0aV9zZXRfZGlzYWJsZS5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X211bHRpX3NldF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiZmNhMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X211bHRpX3NldF9kaXNhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbXVsdGlfc2V0X2Rpc2FibGUucG5nIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9tdWx0aV9zZXRfZGlzYWJsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODQ4OGQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9tdWx0aV9zZXRfZGlzYWJsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X211bHRpX3NldF9lbmFibGUuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9tdWx0aV9zZXRfZW5hYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkYjIyNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X211bHRpX3NldF9lbmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9tdWx0aV9zZXRfZW5hYmxlLnBuZyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbXVsdGlfc2V0X2VuYWJsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTEzYzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9tdWx0aV9zZXRfZW5hYmxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbm9fc2V0X2Rpc2FibGUuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9ub19zZXRfZGlzYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2I5MWMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9ub19zZXRfZGlzYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X25vX3NldF9kaXNhYmxlLnBuZyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbm9fc2V0X2Rpc2FibGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVjZWFlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbm9fc2V0X2Rpc2FibGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9ub19zZXRfZW5hYmxlLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbm9fc2V0X2VuYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmM2MmQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2JwdF9ub19zZXRfZW5hYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbm9fc2V0X2VuYWJsZS5wbmcgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvYnB0X25vX3NldF9lbmFibGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTgzNmZhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9icHRfbm9fc2V0X2VuYWJsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvY29uZGl0aW9uYWxfb3ZyLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9jb25kaXRpb25hbF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTc0OWE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9jb25kaXRpb25hbF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2NvbmRpdGlvbmFsX292cl9kaXNhYmxlZC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvY29uZGl0aW9uYWxfb3ZyX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NWExMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvY29uZGl0aW9uYWxfb3ZyX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9jdXJfc2V0X2lwLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9jdXJfc2V0X2lwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxODczZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvY3VyX3NldF9pcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvZnVuY3Rpb25fb3ZyLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9mdW5jdGlvbl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RkMjQ5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9mdW5jdGlvbl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2Z1bmN0aW9uX292cl9kaXNhYmxlZC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvZnVuY3Rpb25fb3ZyX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1ZDczYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvZnVuY3Rpb25fb3ZyX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9nbG9iYWxfb3ZyLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9nbG9iYWxfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhZjJiZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvZ2xvYmFsX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvZ2xvYmFsX292cl9kaXNhYmxlZC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvZ2xvYmFsX292cl9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWYyYmYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2dsb2JhbF9vdnJfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2luc3RhbGxlZF9vdnIuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL2luc3RhbGxlZF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk2MTBhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9pbnN0YWxsZWRfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9pbnN0YWxsZWRfb3ZyX2Rpc2FibGVkLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9pbnN0YWxsZWRfb3ZyX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjZjg0Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvaW5zdGFsbGVkX292cl9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvcHRwX2JwdF9zZXQuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL3B0cF9icHRfc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2M2E1NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvcHRwX2JwdF9zZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL3B0cF9icHRfc2V0LnBuZyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9wdHBfYnB0X3NldC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjQ1MWEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL3B0cF9icHRfc2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9yZWdfY3VyX2lwLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9kZWJ1Zy9yZWdfY3VyX2lwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYzhhYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvcmVnX2N1cl9pcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvcmVnX3NlY19pcC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvcmVnX3NlY19pcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OGJmODkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL3JlZ19zZWNfaXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL2RlYnVnL3NldF9pcC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvc2V0X2lwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzMTMyOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvZGVidWcvc2V0X2lwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL2Vycm9yLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwY2MwNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9lcnJvcl9zZWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3MvZXJyb3Jfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzM2RiYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9lcnJvcl9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3MvcnVubmluZy5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9ydW5uaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NDliMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9ydW5uaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3J1bm5pbmdfc2VsLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3J1bm5pbmdfc2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2MWZiZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9ydW5uaW5nX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9zdGFydGVkLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3N0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM2MWYxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3N0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3RhcnRlZF9zZWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3RhcnRlZF9zZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDc4MmE3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3N0YXJ0ZWRfc2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3N0b3BwZWQuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3RvcHBlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYWY2YjkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3RvcHBlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9zdG9wcGVkX3NlbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHJvY2Vzcy9zdG9wcGVkX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNGYwZmEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3RvcHBlZF9zZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3VzcGVuZGVkLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3N1c3BlbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzYxZjEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3VzcGVuZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wcm9jZXNzL3N1c3BlbmRlZF9zZWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3VzcGVuZGVkX3NlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzgyYTcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Byb2Nlc3Mvc3VzcGVuZGVkX3NlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHRwYXJyYXl2aWV3LmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHBhcnJheXZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE4NjA2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHBhcnJheXZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3B0cGRlYnVnLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHBkZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTg2MDYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3B0cGRlYnVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHBkZWJ1Zy5wbmcgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHRwZGVidWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTRhZmQ4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHBkZWJ1Zy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvcHRwdmFyaWFibGV2aWV3LmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHB2YXJpYWJsZXZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFhODJkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy9wdHB2YXJpYWJsZXZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3NpZ25hbHNfdmlldy5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvc2lnbmFsc192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhODYwNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvc2lnbmFsc192aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL2FkZF92YXJpYWJsZV9ub3JtYWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvYWRkX3ZhcmlhYmxlX25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMjE4NzQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvYWRkX3ZhcmlhYmxlX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9qdW1wX2NvX2Rpc2FibGUuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvanVtcF9jb19kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMDYxNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9qdW1wX2NvX2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvanVtcF9jb19ub3JtYWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvanVtcF9jb19ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDUzZjE5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL2p1bXBfY29fbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3JlZ2lzdGVyX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZWdpc3Rlcl9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI1ZWE4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3JlZ2lzdGVyX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZWdpc3Rlcl9ub3JtYWwucG5nIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvcmVnaXN0ZXJfbm9ybWFsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3MDdmYi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZWdpc3Rlcl9ub3JtYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvcmVzdGFydF9kaXNhYmxlLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Jlc3RhcnRfZGlzYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmIyYzMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvcmVzdGFydF9kaXNhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Jlc3RhcnRfbm9ybWFsLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Jlc3RhcnRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhMDY4My4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZXN0YXJ0X25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZXN1bWVfZGlzYWJsZS5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZXN1bWVfZGlzYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTI3OTcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvcmVzdW1lX2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvcmVzdW1lX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZXN1bWVfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNGUyNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9yZXN1bWVfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3NpZ25hbDBfY29fZGlzYWJsZS5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zaWduYWwwX2NvX2Rpc2FibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2MwYjEyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3NpZ25hbDBfY29fZGlzYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zaWduYWwwX2NvX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zaWduYWwwX2NvX25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjU1MDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc2lnbmFsMF9jb19ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc3RlcGludG9fZGlzYWJsZS5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwaW50b19kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNWFkNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwaW50b19kaXNhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXBpbnRvX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwaW50b19ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQxNjViLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXBpbnRvX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwb3Zlcl9kaXNhYmxlLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXBvdmVyX2Rpc2FibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk0ZGVmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXBvdmVyX2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc3RlcG92ZXJfbm9ybWFsLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXBvdmVyX25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzM2YWUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc3RlcG92ZXJfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXByZXR1cm5fZGlzYWJsZS5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwcmV0dXJuX2Rpc2FibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZhMzM1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N0ZXByZXR1cm5fZGlzYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwcmV0dXJuX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdGVwcmV0dXJuX25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMmYyMTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc3RlcHJldHVybl9ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc3VzcGVuZF9kaXNhYmxlLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N1c3BlbmRfZGlzYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Nzc3N2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvc3VzcGVuZF9kaXNhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N1c3BlbmRfbm9ybWFsLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3N1c3BlbmRfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxZTNmNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC9zdXNwZW5kX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC90ZXJtaW5hdGVfYWxsX2Rpc2FibGUuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2FsbF9kaXNhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzM2FjOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC90ZXJtaW5hdGVfYWxsX2Rpc2FibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2FsbF9ub3JtYWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdGVybWluYXRlX2FsbF9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQ3Mjc2Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Rlcm1pbmF0ZV9hbGxfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3VucmVnaXN0ZXJfbm9ybWFsLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3VucmVnaXN0ZXJfbm9ybWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhNzAzMC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC91bnJlZ2lzdGVyX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC91bnJlZ2lzdGVyX25vcm1hbC5wbmcgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC91bnJlZ2lzdGVyX25vcm1hbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDdlNWQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdW5yZWdpc3Rlcl9ub3JtYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdmFyX2FkZF9ub3JtYWwuZ2lmIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdmFyX2FkZF9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZkZTBjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Zhcl9hZGRfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Zhcl9jb21wYXJlX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC92YXJfY29tcGFyZV9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZkZTBjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Zhcl9jb21wYXJlX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC92YXJfZGVsZXRlX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC92YXJfZGVsZXRlX25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2ZiN2EuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdmFyX2RlbGV0ZV9ub3JtYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdmFyX2VkaXRfbm9ybWFsLmdpZiBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Zhcl9lZGl0X25vcm1hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWExNDkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL2ljb25zL3Rvb2wvdmFyX2VkaXRfbm9ybWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Zhcl9yZWZyZXNoX25vcm1hbC5naWYgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvaWNvbnMvdG9vbC92YXJfcmVmcmVzaF9ub3JtYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFjNTBiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9pY29ucy90b29sL3Zhcl9yZWZyZXNoX25vcm1hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWUwM2MuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0jIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0jIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0jIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSMgCi0jIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBMQS1DQyAwNC0xMTUKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgQ2xlbWVudCBDaHUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBEZWJ1ZyBVSQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKLQotUGFyYWxsZWxEZWJ1Z1BlcnNwZWN0aXZlLm5hbWU9UFRQIERlYnVnCi1QYXJhbGxlbERlYnVnUGVyc3BlY3RpdmUuZGVzY3JpcHRpb249VGhpcyBEZWJ1ZyBwZXJzcGVjdGl2ZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9uIGRlYnVnZ2luZy4gIEl0IGluY29ycG9yYXRlcyB2aWV3cyBmb3IgZGlzcGxheWluZyB0aGUgZGVidWcgc3RhY2ssIHZhcmlhYmxlcyBhbmQgYnJlYWtwb2ludCBtYW5hZ2VtZW50LgotUGFyYWxsZWxEZWJ1Z1ZpZXdDYXRlZ29yeS5uYW1lPVBUUCBEZWJ1ZwotUGFyYWxsZWxEZWJ1Z1ZpZXcubmFtZT1QYXJhbGxlbCBEZWJ1ZwotCi1BcnJheVZpZXcubmFtZT1BcnJheQotCi1QVmFyaWFibGVWaWV3Lm5hbWU9UFRQIFZhcmlhYmxlCi0KLVBEZWJ1Z2dlclBhZ2UubmFtZT1QVFAgRGVidWdnZXIgVUkgUGFnZQotUERlYnVnUHJlZmVyZW5jZVBhZ2UubmFtZT1EZWJ1ZwotCi1EZWZhdWx0U291cmNlTG9jYXRvci5uYW1lPURlZmF1bHQgUFRQIFNvdXJjZSBMb2NhdG9yCi0KLVNob3dGdWxsUGF0aHNBY3Rpb24ubGFiZWw9U2hvdyBGdWxsICZQYXRocwotU2hvd0Z1bGxQYXRoc0FjdGlvbi50b29sdGlwPVNob3cgRnVsbCBQYXRocwotCi1QQnJlYWtwb2ludFNldC5sYWJlbD1QYXJhbGxlbCBCcmVha3BvaW50IFNldAotUEJyZWFrcG9pbnRTZXQub3RoZXJzPVVua25vd24gU2V0Ci0KLVBCcmVha3BvaW50QW5ub3RhdGlvbi5sYWJlbD1QYXJhbGxlbCBCcmVha3BvaW50Ci1DdXJyZW50UmVnSVBBbm5vdGF0aW9uLmxhYmVsPUN1cnJlbnQgUmVnaXN0ZXJlZCBJbnN0cnVjdGlvbiBQb2ludGVyCi1SZWdJUEFubm90YXRpb24ubGFiZWw9UmVnaXN0ZXJlZCBJbnN0cnVjdGlvbiBQb2ludGVyCi1DdXJyZW50U2V0SVBBbm5vdGF0aW9uLmxhYmVsPUN1cnJlbnQgU2V0IEluc3RydWN0aW9uIFBvaW50ZXIKLVNldElQQW5ub3RhdGlvbi5sYWJlbD1TZXQgSW5zdHJ1Y3Rpb24gUG9pbnRlcgotCi1FZGl0b3JSdWxlckFjdGlvbi5sYWJlbD1QYXJhbGxlbCBCcmVha3BvaW50Ci1QQnJlYWtwb2ludFByb3BlcnRpZXMubGFiZWw9QnJlYWtwb2ludCBwcm9wZXJ0aWVzCi1FbmFibGVEaXNhYmxlQnJlYWtwb2ludC5sYWJlbD1FbmFibGUgRGlzYWJsZSBicmVha3BvaW50Ci1Ub2dnbGVCcmVha3BvaW50LmxhYmVsPVRvZ2dsZSBicmVha3BvaW50Ci0KLUNvbW1vbkJyZWFrcG9pbnRQYWdlLmxhYmVsPUNvbW1vbgotQ29tbW9uU2lnbmFsUGFnZS5sYWJlbD1Db21tb24KLUJyZWFrcG9pbnRQcm9wZXJ0aWVzQWN0aW9uLmxhYmVsPVAmcm9wZXJ0aWVzLi4uCi0KLUdvdG9TZXQubGFiZWw9R290byBzZXQKLQotRGVidWdUZXh0SG92ZXIubGFiZWw9RGVidWdnZXIKLURlYnVnVGV4dEhvdmVyLmRlc2NyaXB0aW9uPVNob3dzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBzZWxlY3RlZCBpbiB0aGUgcHRwIGRlYnVnIHBlcnNwZWN0aXZlLgotCi0KLVBWYXJpYWJsZU1lbnUubGFiZWw9UFRQIFZhcmlhYmxlCi1BZGRQVmFyaWFibGVBY3Rpb24ubGFiZWw9QWRkIFBUUCB2YXJpYWJsZQotQWRkUFZhcmlhYmxlQWN0aW9uLnRvb2x0aXA9QWRkIFBUUCB2YXJpYWJsZQotUmVtb3ZlQWxsUFZhcmlhYmxlQWN0aW9uLmxhYmVsPVJlbW92ZSBhbGwgUFRQIHZhcmlhYmxlcwotUmVtb3ZlQWxsUFZhcmlhYmxlQWN0aW9uLnRvb2x0aXA9UmVtb3ZlIGFsbCBQVFAgdmFyaWFibGVzCi1PcGVuUFZhcmlhYmxlRGlhbG9nQWN0aW9uLmxhYmVsPU9wZW4gUFRQIFZhcmlhYmxlIERpYWxvZwotT3BlblBWYXJpYWJsZURpYWxvZ0FjdGlvbi50b29sdGlwPU9wZW4gUFRQIFZhcmlhYmxlIERpYWxvZwotVXBkYXRlQWxsUFZhcmlhYmxlQWN0aW9uLmxhYmVsPVJlZnJlc2ggYWxsIFBUUCB2YXJpYWJsZXMKLVVwZGF0ZUFsbFBWYXJpYWJsZUFjdGlvbi50b29sdGlwPVJlZnJlc2ggYWxsIFBUUCB2YXJpYWJsZXMKLQotCi1TaWduYWxzVmlldy5uYW1lPVNpZ25hbHMKLVNpZ25hbEFjdGlvbi5sYWJlbD1SZXN1bWUgV2l0aCBTaWduYWwKLVNpZ25hbEFjdGlvbi50b29sdGlwPVJlc3VtZSBXaXRoIFNpZ25hbAotU2lnbmFsWmVyb0FjdGlvbi5sYWJlbD1SZXN1bWUgV2l0aG91dCBTaWduYWwKLVNpZ25hbFplcm9BY3Rpb24udG9vbHRpcD1SZXN1bWUgSWdub3JpbmcgU2lnbmFsCi1TaWduYWxQcm9wZXJ0aWVzQWN0aW9uLmxhYmVsPVNpZ25hbCBQcm9wZXJ0aWVzLi4uCi1TaWduYWxQcm9wZXJ0aWVzQWN0aW9uLnRvb2x0aXA9T3BlbiBTaWduYWwgUHJvcGVydGllcyBEaWFsb2cKLQotCi1SdW5NZW51LmxhYmVsPSZSdW4KLURlYnVnQWN0aW9uU2V0LmxhYmVsPVBUUCBEZWJ1ZwotCi1SZXN0YXJ0QWN0aW9uLmxhYmVsPVJlc3RhcnQKLVJlc3RhcnRBY3Rpb24udG9vbHRpcD1SZXN0YXJ0Ci0KLUp1bXBUb0xpbmVBY3Rpb24ubGFiZWw9UmVzdW1lIEF0IExpJm5lCi1HbG9iYWxKdW1wVG9MaW5lQWN0aW9uLmxhYmVsPVJlc3VtZSBBdCBMaSZuZSBQVFAKLUFkZFdhdGNocG9pbnQubGFiZWw9QWRkIFdhdGNocG9pbnQgUFRQLi4uCi1BZGRXYXRjaHBvaW50LnRvb2x0aXA9QWRkIFdhdGNocG9pbnQgUFRQCi1BZGRFeHByZXNzaW9uQWN0aW9uLmxhYmVsPUFkZCBXYXRjaCBFeHByZXNzaW9uLi4uCi1SdW5Ub0xpbmVBY3Rpb24ubGFiZWw9UnVuIFRvICZMaW5lCi0KLVRvZ2dsZUluc3RydWN0aW9uU3RlcE1vZGVBY3Rpb24ubGFiZWw9SW5zdHJ1Y3Rpb24gU3RlcHBpbmcgTW9kZQotVG9nZ2xlSW5zdHJ1Y3Rpb25TdGVwTW9kZUFjdGlvbi50b29sdGlwPUluc3RydWN0aW9uIFN0ZXBwaW5nIE1vZGUKLQotRW5hYmxlVmFyaWFibGVzQWN0aW9uLmxhYmVsPUVuYWJsZQotRW5hYmxlVmFyaWFibGVzQWN0aW9uLnRvb2x0aXA9RW5hYmxlIFNlbGVjdGVkIFZhcmlhYmxlcwotCi1EaXNhYmxlVmFyaWFibGVzQWN0aW9uLmxhYmVsPURpc2FibGUKLURpc2FibGVWYXJpYWJsZXNBY3Rpb24udG9vbHRpcD1EaXNhYmxlIFNlbGVjdGVkIFZhcmlhYmxlcwotCi1EZWJ1Z2dpbmdQQ29udGV4dC5uYW1lPURlYnVnZ2luZyBQYXJhbGxlbAotRGVidWdnaW5nUENvbnRleHQuZGVzY3JpcHRpb249RGVidWdnaW5nIFBhcmFsbGVsIFByb2dyYW1zCi0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9wbHVnaW4ueG1sIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWI2ZDMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZWJ1Z2dlckNvbmZpZ3VyYXRpb25zIiBuYW1lPSJQYXJhbGxlbCBEZWJ1Z2dlciBDb25maWd1cmF0aW9ucyIgc2NoZW1hPSJzY2hlbWEvZGVidWdnZXJDb25maWd1cmF0aW9ucy5leHNkIi8+Ci0JCi0JPCEtLSBkZWJ1ZyBtb2RlbCBwcmVzZW50YXRpb24gLy8tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5kZWJ1Z01vZGVsUHJlc2VudGF0aW9ucyI+Ci0JCTxkZWJ1Z01vZGVsUHJlc2VudGF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlIj4KLQkJPC9kZWJ1Z01vZGVsUHJlc2VudGF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gdmlldyAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLQkJPGNhdGVnb3J5Ci0JCQluYW1lPSIlUGFyYWxsZWxEZWJ1Z1ZpZXdDYXRlZ29yeS5uYW1lIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cyI+Ci0JCTwvY2F0ZWdvcnk+Ci0JCTx2aWV3Ci0JCQluYW1lPSIlU2lnbmFsc1ZpZXcubmFtZSIKLQkJCWljb249Imljb25zL3NpZ25hbHNfdmlldy5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnZpZXdzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5zaWduYWxzLlNpZ25hbHNWaWV3IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5TaWduYWxzVmlldyI+Ci0JCTwvdmlldz4KLQkJPHZpZXcKLQkJCW5hbWU9IiVQYXJhbGxlbERlYnVnVmlldy5uYW1lIgotCQkJaWNvbj0iaWNvbnMvcHRwZGVidWcuZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkudmlld3MuUGFyYWxsZWxEZWJ1Z1ZpZXciCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnZpZXdzLnBhcmFsbGVsRGVidWdWaWV3Ij4KLQkJPC92aWV3PgotCQk8dmlldwotCQkJbmFtZT0iJUFycmF5Vmlldy5uYW1lIgotCQkJaWNvbj0iaWNvbnMvcHRwYXJyYXl2aWV3LmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuYXJyYXkuQXJyYXlWaWV3IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5BcnJheVZpZXciPgotCQk8L3ZpZXc+Ci0JCTx2aWV3Ci0JCQluYW1lPSIlUFZhcmlhYmxlVmlldy5uYW1lIgotCQkJaWNvbj0iaWNvbnMvcHRwdmFyaWFibGV2aWV3LmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MudmFyaWFibGUuUFZhcmlhYmxlVmlldyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkudmlld3MuUFZhcmlhYmxlVmlldyI+Ci0JCTwvdmlldz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIHBlcnNwZWN0aXZlIGV4dGVuc2lvbnMgLy8tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotCQk8cGVyc3BlY3RpdmVFeHRlbnNpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1BlcnNwZWN0aXZlIj4KLQkJCTwvcGVyc3BlY3RpdmVTaG9ydGN1dD4KLQkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLQkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSI+Ci0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dAotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdQZXJzcGVjdGl2ZSI+Ci0JCQk8L3BlcnNwZWN0aXZlU2hvcnRjdXQ+Ci0JCTwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0JCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1BlcnNwZWN0aXZlIj4KLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC51aS5QVFBSdW5QZXJzcGVjdGl2ZSI+Ci0JCQk8L3BlcnNwZWN0aXZlU2hvcnRjdXQ+Ci0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dAotCQkJCWlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIj4KLQkJCTwvcGVyc3BlY3RpdmVTaG9ydGN1dD4KLQkJCTx2aWV3Ci0JCQkJdmlzaWJsZT0idHJ1ZSIKLQkJCQlyZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuY29uc29sZS5Db25zb2xlVmlldyIKLQkJCQlyZWxhdGlvbnNoaXA9InN0YWNrIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyI+Ci0JCQk8L3ZpZXc+ICAgICAgCi0JCQk8dmlld1Nob3J0Y3V0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3Ij4KLQkJCTwvdmlld1Nob3J0Y3V0PgotCQkJPGFjdGlvblNldAotCQkJCWlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hBY3Rpb25TZXQiPgotCQkJPC9hY3Rpb25TZXQ+Ci0JCQk8YWN0aW9uU2V0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25TZXRzIj4KLQkJCTwvYWN0aW9uU2V0PgotCQkJPGFjdGlvblNldAotCQkJCWlkPSJvcmcuZWNsaXBzZS5jZHQuZGVidWcudWkuZGVidWdBY3Rpb25TZXQiPgotCQkJPC9hY3Rpb25TZXQ+Ci0JCTwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0JPC9leHRlbnNpb24+ICAgCQotCTwhLS0gcHJlZmVyZW5jZXMgLy8tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJVBEZWJ1Z1ByZWZlcmVuY2VQYWdlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnB0cFByZWZlcmVuY2VzUGFnZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUERlYnVnUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBEZWJ1Z1ByZWZlcmVuY2VQYWdlIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0gICAJPCEtLSBwZXJzcGVjdGl2ZSAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0JCTxwZXJzcGVjdGl2ZQotCQkJbmFtZT0iJVBhcmFsbGVsRGVidWdQZXJzcGVjdGl2ZS5uYW1lIgotCQkJaWNvbj0iaWNvbnMvcHRwZGVidWcuZ2lmIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QVFBEZWJ1Z1BlcnNwZWN0aXZlRmFjdG9yeSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdQZXJzcGVjdGl2ZSI+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJJVBhcmFsbGVsRGVidWdQZXJzcGVjdGl2ZS5kZXNjcmlwdGlvbgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJPC9wZXJzcGVjdGl2ZT4KLQk8L2V4dGVuc2lvbj4gICAKLQotCTwhLS0gYW5ub3RhdGlvbiAvLy0tPgkJICAgICAgCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkuYnJlYWtwb2ludE9yZ2FuaXplcnMiPgotCQk8YnJlYWtwb2ludE9yZ2FuaXplcgotCQkJb3RoZXJzTGFiZWw9IiVQQnJlYWtwb2ludFNldC5vdGhlcnMiCi0JCQlsYWJlbD0iJVBCcmVha3BvaW50U2V0LmxhYmVsIgotCQkJaWNvbj0iaWNvbnMvZGVidWcvcHRwX2JwdF9zZXQuZ2lmIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5icmVha3BvaW50cy5QQnJlYWtwb2ludFNldE9yZ2FuaXplciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkucEJyZWFrcG9pbnRTZXRPcmdhbml6ZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRXh0ZW5zaW9uIC8vLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLQkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnUGVyc3BlY3RpdmUiPgotCQkJPHZpZXcKLQkJCQlyZWxhdGl2ZT0ib3JnLmVjbGlwc2UuZGVidWcudWkuVmFyaWFibGVWaWV3IgotCQkJCXZpc2libGU9ImZhbHNlIgotCQkJCXJlbGF0aW9uc2hpcD0ic3RhY2siCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5TaWduYWxzVmlldyI+Ci0JCQk8L3ZpZXc+Ci0JCQk8dmlld1Nob3J0Y3V0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5TaWduYWxzVmlldyI+Ci0JCQk8L3ZpZXdTaG9ydGN1dD4KLQkJCTx2aWV3U2hvcnRjdXQKLQkJCQlpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuTWVtb3J5VmlldyI+Ci0JCQk8L3ZpZXdTaG9ydGN1dD4KLQkJCTx2aWV3U2hvcnRjdXQKLQkJCQlpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRXhwcmVzc2lvblZpZXciPgotCQkJPC92aWV3U2hvcnRjdXQ+Ci0JCTwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFjdGlvbiBzZXRzIC8vLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0JCTxhY3Rpb25TZXQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5kZWJ1Z0FjdGlvblNldCIKLSAgICAgICAgbGFiZWw9IiVEZWJ1Z0FjdGlvblNldC5sYWJlbCIKLSAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0JCQk8bWVudQotCQkJCWxhYmVsPSIlUnVuTWVudS5sYWJlbCIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnJ1biI+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5hY3Rpb25zLlJlc3VtZUF0TGluZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmV0YXJnZXRSZXN1bWVBdExpbmVBY3Rpb24iCi0JCQkJZGlzYWJsZWRJY29uPSJpY29ucy90b29sL2p1bXBfY29fZGlzYWJsZS5naWYiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpY29uPSJpY29ucy90b29sL2p1bXBfY29fbm9ybWFsLmdpZiIKLQkJCQloZWxwQ29udGV4dElkPSJqdW1wX3RvX2xpbmVfYWN0aW9uX2NvbnRleHQiCi0JCQkJbGFiZWw9IiVHbG9iYWxKdW1wVG9MaW5lQWN0aW9uLmxhYmVsIgotCQkJCW1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS5ydW4vc3RlcEdyb3VwIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPHBsdWdpblN0YXRlCi0JCQkJCQl2YWx1ZT0iYWN0aXZhdGVkIgotCQkJCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSI+Ci0JCQkJCTwvcGx1Z2luU3RhdGU+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlNpZ25hbFplcm9Xb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuU2lnbmFsWmVyb1dvcmtiZW5jaEFjdGlvbkRlbGVnYXRlIgotCQkJCWRpc2FibGVkSWNvbj0iaWNvbnMvdG9vbC9zaWduYWwwX2NvX2Rpc2FibGUuZ2lmIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWNvbj0iaWNvbnMvdG9vbC9zaWduYWwwX2NvX25vcm1hbC5naWYiCi0JCQkJaGVscENvbnRleHRJZD0icmVzdW1lX3dpdGhvdXRfc2lnbmFsX2FjdGlvbl9jb250ZXh0IgotCQkJCWxhYmVsPSIlU2lnbmFsWmVyb0FjdGlvbi5sYWJlbCIKLQkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucnVuL3N0ZXBHcm91cCIKLQkJCQl0b29sdGlwPSIlU2lnbmFsWmVyb0FjdGlvbi50b29sdGlwIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPHBsdWdpblN0YXRlCi0JCQkJCQl2YWx1ZT0iYWN0aXZhdGVkIgotCQkJCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSI+Ci0JCQkJCTwvcGx1Z2luU3RhdGU+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5pbnRlcm5hbC5hY3Rpb25zLlJlc3RhcnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVzdGFydEFjdGlvbkRlbGVnYXRlIgotCQkJCWRpc2FibGVkSWNvbj0iaWNvbnMvdG9vbC9yZXN0YXJ0X2Rpc2FibGUuZ2lmIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWNvbj0iaWNvbnMvdG9vbC9yZXN0YXJ0X25vcm1hbC5naWYiCi0JCQkJaGVscENvbnRleHRJZD0icmVzdGFydF9hY3Rpb25fY29udGV4dCIKLQkJCQlsYWJlbD0iJVJlc3RhcnRBY3Rpb24ubGFiZWwiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnJ1bi9zdGVwR3JvdXAiPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8cGx1Z2luU3RhdGUKLQkJCQkJCXZhbHVlPSJhY3RpdmF0ZWQiCi0JCQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpIj4KLQkJCQkJPC9wbHVnaW5TdGF0ZT4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvbj4KLQkJPC9hY3Rpb25TZXQ+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBwb3VwdXAgbWVudXMgLy8tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9IiNDRWRpdG9yUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5DRWRpdG9yUnVsZXJBY3Rpb25zIj4KLQkJCTxtZW51Ci0JCQkJbGFiZWw9IiVFZGl0b3JSdWxlckFjdGlvbi5sYWJlbCIKLQkJCQlwYXRoPSJkZWJ1ZyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnBvcHVwbWVudS5zdWJtZW51Ij4KLQkJCQk8Z3JvdXBNYXJrZXIKLQkJCQkJbmFtZT0icHRwR3JvdXAiPgotCQkJCTwvZ3JvdXBNYXJrZXI+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVQQnJlYWtwb2ludFByb3BlcnRpZXMubGFiZWwiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlBCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5wb3B1cG1lbnUuc3VibWVudS9wdHBHcm91cCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUEJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUVuYWJsZURpc2FibGVCcmVha3BvaW50LmxhYmVsIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5FbmFibGVEaXNhYmxlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5wb3B1cG1lbnUuc3VibWVudS9wdHBHcm91cCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRSdWxlckFjdGlvbkRlbGVnYXRlIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlVG9nZ2xlQnJlYWtwb2ludC5sYWJlbCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuTWFuYWdlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5wb3B1cG1lbnUuc3VibWVudS9wdHBHcm91cCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuTWFuYWdlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUiPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCQk8IS0tLy8KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9IiNDRWRpdG9yQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5jZHQuZGVidWcudWkuQ0VkaXRvclBvcHVwQWN0aW9ucyI+Ci0JCQk8dmlzaWJpbGl0eT4KLQkJCQk8YW5kPgotCQkJCQk8c3lzdGVtUHJvcGVydHkKLQkJCQkJCXZhbHVlPSJ0cnVlIgotCQkJCQkJbmFtZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmRlYnVnZ2VyQWN0aXZlIi8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uIi8+Ci0JCQkJPC9hbmQ+Ci0JCQk8L3Zpc2liaWxpdHk+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRFeHByZXNzaW9uQWN0aW9uLmxhYmVsIgotCQkJCWljb249Imljb25zL2RlYnVnL3B0cF9icHRfc2V0LmdpZiIKLQkJCQloZWxwQ29udGV4dElkPSJhZGRfZXhwcmVzc2lvbl9hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuQWRkRXhwcmVzc2lvbkVkaXRvckFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFkZEV4cHJlc3Npb25BY3Rpb25EZWxlZ2F0ZSI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUp1bXBUb0xpbmVBY3Rpb24ubGFiZWwiCi0JCQkJaWNvbj0iaWNvbnMvZGVidWcvcHRwX2JwdF9zZXQuZ2lmIgotCQkJCWhlbHBDb250ZXh0SWQ9Imp1bXBfdG9fbGluZV9hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVzdW1lQXRMaW5lQWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5KdW1wVG9MaW5lQWN0aW9uRGVsZWdhdGUiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaGVscENvbnRleHRJZD0icnVuX3RvX2xpbmVfYWN0aW9uX2NvbnRleHQiCi0JCQkJbGFiZWw9IiVSdW5Ub0xpbmVBY3Rpb24ubGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb21tYW5kcy5SdW5Ub0xpbmUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVuVG9MaW5lQWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmFjdGlvbnMucG9wdXAuUnVuVG9MaW5lIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQkJLy8tLT4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkJyZWFrcG9pbnRWaWV3IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5icmVha3BvaW50dmlldy5wb3B1cE1lbnUiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlR290b1NldC5sYWJlbCIKLQkJCQlpY29uPSJpY29ucy9kZWJ1Zy9wdHBfYnB0X3NldC5naWYiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkdvdG9TZXQiCi0JCQkJbWVudWJhclBhdGg9Im5hdmlnYXRpb25Hcm91cCIKLQkJCQllbmFibGVzRm9yPSIxKyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuR290b1NldCI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBCcmVha3BvaW50QWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVCcmVha3BvaW50UHJvcGVydGllc0FjdGlvbi5sYWJlbCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUEJyZWFrcG9pbnRQcm9wZXJ0aWVzQWN0aW9uIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUEJyZWFrcG9pbnRQcm9wZXJ0aWVzQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAKLQkJPCEtLSB2YXJpYWJsZSBzdGFydCAtLT4KLQkJPCEtLQotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYXJpYWJsZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFZhcmlhYmxlQWN0aW9ucyI+Ci0JCQk8bWVudQotCQkJCWxhYmVsPSJQVmFyaWFibGVNZW51IgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFZhcmlhYmxlTWVudSI+Ci0JCQkJPHNlcGFyYXRvcgotCQkJCQluYW1lPSJwVmFyR3JvdXAiPgotCQkJCTwvc2VwYXJhdG9yPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWhlbHBDb250ZXh0SWQ9InB0cF9hZGRfdmFyaWFibGVfYWN0aW9uX2NvbnRleHQiCi0JCQkJbGFiZWw9IiVBZGRQVmFyaWFibGVBY3Rpb24ubGFiZWwiCi0JCQkJdG9vbHRpcD0iJUFkZFBWYXJpYWJsZUFjdGlvbi50b29sdGlwIgotCQkJCWljb249Imljb25zL2RlYnVnL3B0cF9icHRfc2V0LmdpZiIKLQkJCQltZW51YmFyUGF0aD0icFZhckdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFkZFBWYXJpYWJsZUFjdGlvbkRlbGVnYXRlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5BZGRQVmFyaWFibGVBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCS8vLS0+Ci0JCTwhLS0gdmFyaWFibGUgZW5kIC0tPgotCQk8IS0tIHNpZ25hbCBzdGFydCAtLT4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5TaWduYWxBY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJVNpZ25hbEFjdGlvbi5sYWJlbCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuU2lnbmFsQWN0aW9uRGVsZWdhdGUiCi0JCQkJdG9vbHRpcD0iJVNpZ25hbEFjdGlvbi50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuU2lnbmFsQWN0aW9uRGVsZWdhdGUiPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8cGx1Z2luU3RhdGUKLQkJCQkJCXZhbHVlPSJhY3RpdmF0ZWQiCi0JCQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpIj4KLQkJCQkJPC9wbHVnaW5TdGF0ZT4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJVNpZ25hbFByb3BlcnRpZXNBY3Rpb24ubGFiZWwiCi0JCQkJc3R5bGU9InB1bGxkb3duIgotCQkJCWhlbHBDb250ZXh0SWQ9InNpZ25hbF9wcm9wZXJ0aWVzX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5TaWduYWxQcm9wZXJ0aWVzQWN0aW9uRGVsZWdhdGUiCi0JCQkJdG9vbHRpcD0iJVNpZ25hbFByb3BlcnRpZXNBY3Rpb24udG9vbHRpcCIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuU2lnbmFsUHJvcGVydGllc0FjdGlvbiI+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxwbHVnaW5TdGF0ZQotCQkJCQkJdmFsdWU9ImFjdGl2YXRlZCIKLQkJCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkiPgotCQkJCQk8L3BsdWdpblN0YXRlPgotCQkJCTwvZW5hYmxlbWVudD4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN1bWVXaXRob3V0U2lnbmFsIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5EZWJ1Z1RhcmdldEFjdGlvbnMiPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQkJPCEtLSBzaWduYWwgZW5kIC0tPgotCQk8IS0tIGRlYnVnIHZpZXcgc3RhcnQgLS0+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1ZpZXciCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmRlYnVndmlldy5wb3B1cE1lbnUiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlUmVzdGFydEFjdGlvbi5sYWJlbCIKLQkJCQlpY29uPSJpY29ucy90b29sL3Jlc3RhcnRfbm9ybWFsLmdpZiIKLQkJCQloZWxwQ29udGV4dElkPSJyZXN0YXJ0X2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5SZXN0YXJ0QWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9InN0ZXBHcm91cCIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5SZXN0YXJ0QWN0aW9uRGVsZWdhdGUiPgotCQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN0YXJ0Ii8+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlzdGF0ZT0iZmFsc2UiCi0JCQkJc3R5bGU9InRvZ2dsZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuVG9nZ2xlSW5zdHJ1Y3Rpb25TdGVwTW9kZUFjdGlvbkRlbGVnYXRlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5Ub2dnbGVJbnN0cnVjdGlvblN0ZXBNb2RlQWN0aW9uRGVsZWdhdGUiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpY29uPSJpY29ucy90b29sL3N0ZXBpbnRvX25vcm1hbC5naWYiCi0JCQkJaGVscENvbnRleHRJZD0idG9nZ2xlX2luc3RydWN0aW9uX3N0ZXBfbW9kZV9hY3Rpb25fY29udGV4dCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUluc3RydWN0aW9uU3RlcE1vZGVBY3Rpb24ubGFiZWwiCi0JCQkJbWVudWJhclBhdGg9InJlbmRlckdyb3VwIgotCQkJCXRvb2x0aXA9IiVUb2dnbGVJbnN0cnVjdGlvblN0ZXBNb2RlQWN0aW9uLnRvb2x0aXAiPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8cGx1Z2luU3RhdGUKLQkJCQkJCXZhbHVlPSJhY3RpdmF0ZWQiCi0JCQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpIj4KLQkJCQkJPC9wbHVnaW5TdGF0ZT4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQloZWxwQ29udGV4dElkPSJzaWduYWxfemVyb19hY3Rpb25fY29udGV4dCIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWxhYmVsPSIlU2lnbmFsWmVyb0FjdGlvbi5sYWJlbCIKLQkJCQl0b29sdGlwPSIlU2lnbmFsWmVyb0FjdGlvbi50b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5TaWduYWxaZXJvV29ya2JlbmNoQWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9InRocmVhZEdyb3VwIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5TaWduYWxaZXJvV29ya2JlbmNoQWN0aW9uRGVsZWdhdGUiPgotCQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN1bWVXaXRob3V0U2lnbmFsIi8+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTwhLS0gZGVidWcgdmlldyBlbmQgLS0+Ci0JCTwhLS0gdmFyaWFibGUgdmlldyBzdGFydCAtLT4KLQkJPCEtLS8vCi0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5WYXJpYWJsZVZpZXciCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnZhcmlhYmxlc1ZpZXcucG9wdXBNZW51Ij4KLQkJCTxhY3Rpb24KLQkJCQloZWxwQ29udGV4dElkPSJyZW1vdmVfYWxsX2dsb2JhbHNfYWN0aW9uX2NvbnRleHQiCi0JCQkJZW5hYmxlc0Zvcj0iKiIKLQkJCQlsYWJlbD0iJVJlbW92ZUFsbEdsb2JhbHNBY3Rpb24ubGFiZWwiCi0JCQkJdG9vbHRpcD0iJVJlbW92ZUFsbEdsb2JhbHNBY3Rpb24udG9vbHRpcCIKLQkJCQlpY29uPSJpY29ucy9yZW1fYWxsX2NvLmdpZiIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVtb3ZlQWxsR2xvYmFsc0FjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMib3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUubW9kZWwuSUNhc3RUb1R5cGUKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVtb3ZlQWxsR2xvYmFsc0FjdGlvbkRlbGVnYXRlIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPHBsdWdpblN0YXRlCi0JCQkJCQl2YWx1ZT0iYWN0aXZhdGVkIgotCQkJCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSIvPgotCQkJCTwvZW5hYmxlbWVudD4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWhlbHBDb250ZXh0SWQ9InJlbW92ZV9nbG9iYWxzX2FjdGlvbl9jb250ZXh0IgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJbGFiZWw9IiVSZW1vdmVHbG9iYWxzQWN0aW9uLmxhYmVsIgotCQkJCXRvb2x0aXA9IiVSZW1vdmVHbG9iYWxzQWN0aW9uLnRvb2x0aXAiCi0JCQkJaWNvbj0iaWNvbnMvcmVtX2NvLmdpZiIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVtb3ZlR2xvYmFsc0FjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlJlbW92ZUdsb2JhbHNBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxwbHVnaW5TdGF0ZQotCQkJCQkJdmFsdWU9ImFjdGl2YXRlZCIKLQkJCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkiLz4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQloZWxwQ29udGV4dElkPSJhZGRfZ2xvYmFsc19hY3Rpb25fY29udGV4dCIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWxhYmVsPSIlQWRkR2xvYmFsc0FjdGlvbi5sYWJlbCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuQWRkR2xvYmFsc0FjdGlvbkRlbGVnYXRlIgotCQkJCWljb249Imljb25zL3dhdGNoX2dsb2JhbHMuZ2lmIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFkZEdsb2JhbHNBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxwbHVnaW5TdGF0ZQotCQkJCQkJdmFsdWU9ImFjdGl2YXRlZCIKLQkJCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkiLz4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJURpc2FibGVWYXJpYWJsZXNBY3Rpb24ubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0iZGlzYWJsZV92YXJpYWJsZXNfYWN0aW9uX2NvbnRleHQiCi0JCQkJdG9vbHRpcD0iJURpc2FibGVWYXJpYWJsZXNBY3Rpb24udG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuRGlzYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJ2YXJpYWJsZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IjIrIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5EaXNhYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUiPgotCQkJCTxzZWxlY3Rpb24KLQkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFyaWFibGUiPgotCQkJCTwvc2VsZWN0aW9uPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVFbmFibGVWYXJpYWJsZXNBY3Rpb24ubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0iZW5hYmxlX3ZhcmlhYmxlc19hY3Rpb25fY29udGV4dCIKLQkJCQl0b29sdGlwPSIlRW5hYmxlVmFyaWFibGVzQWN0aW9uLnRvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkVuYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJ2YXJpYWJsZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IjIrIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5FbmFibGVWYXJpYWJsZXNBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQkJPHNlbGVjdGlvbgotCQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYXJpYWJsZSI+Ci0JCQkJPC9zZWxlY3Rpb24+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCS8vLS0+Ci0JCTwhLS0gdmFyaWFibGUgdmlldyBlbmQgLS0+ICAgICAgCi0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zIj4KLQkvLy0tPgotCQk8IS0tIHZhcmlhYmxlIHRvb2xiYXIgc3RhcnQgLy8tLT4KLQkJPCEtLQotCQk8dmlld0NvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLlZhcmlhYmxlVmlldyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS52YXJpYWJsZXNWaWV3LnRvb2xiYXIiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iUFZhcmlhYmxlTWVudSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBWYXJpYWJsZU1lbnUiCi0JCQkJcGF0aD0iYWRkaXRpb25zIj4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9InBWYXJHcm91cCIgLz4KLQkJCTwvbWVudT4KLQkJCTxhY3Rpb24KLQkJCQloZWxwQ29udGV4dElkPSJwdHBfdmFyaWFibGVzX2RpYWxvZ19hY3Rpb25fY29udGV4dCIKLQkJCQlsYWJlbD0iJU9wZW5QVmFyaWFibGVEaWFsb2dBY3Rpb24ubGFiZWwiCi0JCQkJdG9vbHRpcD0iJU9wZW5QVmFyaWFibGVEaWFsb2dBY3Rpb24udG9vbHRpcCIKLQkJCQlpY29uPSJpY29ucy9kZWJ1Zy9wdHBfYnB0X3NldC5naWYiCi0JCQkJdG9vbGJhclBhdGg9Ik5vcm1hbC9wVmFyR3JvdXAiCi0JCQkJc3RhdGU9InRydWUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLk9wZW5QVmFyaWFibGVEaWFsb2dBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuT3BlblBWYXJpYWJsZURpYWxvZ0FjdGlvbkRlbGVnYXRlIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPHBsdWdpblN0YXRlCi0JCQkJCQl2YWx1ZT0iYWN0aXZhdGVkIgotCQkJCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSIvPgotCQkJCTwvZW5hYmxlbWVudD4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWhlbHBDb250ZXh0SWQ9InB0cF91cGRhdGVfYWxsX3ZhcmlhYmxlc19hY3Rpb25fY29udGV4dCIKLQkJCQlsYWJlbD0iJVVwZGF0ZUFsbFBWYXJpYWJsZUFjdGlvbi5sYWJlbCIKLQkJCQl0b29sdGlwPSIlVXBkYXRlQWxsUFZhcmlhYmxlQWN0aW9uLnRvb2x0aXAiCi0JCQkJaWNvbj0iaWNvbnMvZGVidWcvcHRwX2JwdF9zZXQuZ2lmIgotCQkJCXRvb2xiYXJQYXRoPSJOb3JtYWwvcFZhckdyb3VwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5VcGRhdGVWYXJpYWJsZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuVXBkYXRlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaGVscENvbnRleHRJZD0icHRwX3JlbW92ZV9hbGxfdmFyaWFibGVzX2FjdGlvbl9jb250ZXh0IgotCQkJCWxhYmVsPSIlUmVtb3ZlQWxsUFZhcmlhYmxlQWN0aW9uLmxhYmVsIgotCQkJCXRvb2x0aXA9IiVSZW1vdmVBbGxQVmFyaWFibGVBY3Rpb24udG9vbHRpcCIKLQkJCQlpY29uPSJpY29ucy9kZWJ1Zy9wdHBfYnB0X3NldC5naWYiCi0JCQkJdG9vbGJhclBhdGg9Ik5vcm1hbC9wVmFyR3JvdXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlJlbW92ZUFsbFBWYXJpYWJsZUFjdGlvbkRlbGVnYXRlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5SZW1vdmVBbGxQVmFyaWFibGVBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQloZWxwQ29udGV4dElkPSJwdHBfYWRkX3ZhcmlhYmxlX2FjdGlvbl9jb250ZXh0IgotCQkJCWxhYmVsPSIlQWRkUFZhcmlhYmxlQWN0aW9uLmxhYmVsIgotCQkJCXRvb2x0aXA9IiVBZGRQVmFyaWFibGVBY3Rpb24udG9vbHRpcCIKLQkJCQlpY29uPSJpY29ucy9kZWJ1Zy9wdHBfYnB0X3NldC5naWYiCi0JCQkJdG9vbGJhclBhdGg9Ik5vcm1hbC9wVmFyR3JvdXAiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuQWRkUFZhcmlhYmxlQWN0aW9uRGVsZWdhdGUiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFkZFBWYXJpYWJsZUFjdGlvbkRlbGVnYXRlIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdDb250cmlidXRpb24+Ci0JCS8vLS0+Ci0JCTwhLS0gdmFyaWFibGUgdG9vbGJhciBlbmQgLy8tLT4KLQkJPCEtLQotCQk8dmlld0NvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkJyZWFrcG9pbnRWaWV3IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5icmVha3BvaW50Vmlldy5tZW51Ij4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJVNob3dGdWxsUGF0aHNBY3Rpb24ubGFiZWwiCi0JCQkJaWNvbj0iaWNvbnMvdG9vbC9zaG93X3BhdGhzLmdpZiIKLQkJCQlzdHlsZT0idG9nZ2xlIgotCQkJCXRvb2x0aXA9IiVTaG93RnVsbFBhdGhzQWN0aW9uLnRvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlNob3dGdWxsUGF0aHNBY3Rpb24iCi0JCQkJbWVudWJhclBhdGg9InBEZWJ1Z0FjdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlNob3dGdWxsUGF0aHNBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld0NvbnRyaWJ1dGlvbj4KLQkJLy8tLT4KLQk8IS0tCi0JPC9leHRlbnNpb24+Ci0JLy8tLT4KLQkKLQk8IS0tIGVkaXRvciBhY3Rpb25zIC8vLS0+Ci0JPCEtLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0LnVpLmVkaXRvci5DRWRpdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5DRWRpdG9yLkJyZWFrcG9pbnRSdWxlckFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlVG9nZ2xlQnJlYWtwb2ludC5sYWJlbCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuTWFuYWdlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5DRWRpdG9yLk1hbmFnZUJyZWFrcG9pbnRSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JLy8tLT4KLQk8IS0tIHRleHQgaG92ZXJzIC8vLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY2R0LnVpLnRleHRIb3ZlcnMiPgotCQk8aG92ZXIKLQkJCWxhYmVsPSIlRGVidWdUZXh0SG92ZXIubGFiZWwiCi0JCQlkZXNjcmlwdGlvbj0iJURlYnVnVGV4dEhvdmVyLmRlc2NyaXB0aW9uIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5lZGl0b3JzLlBEZWJ1Z1RleHRIb3ZlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuZWRpdG9ycy5QRGVidWdUZXh0SG92ZXIiPgotCQk8L2hvdmVyPgotCTwvZXh0ZW5zaW9uPgkJCi0JCi0JPCEtLSBwcm9wZXJ0eSBwYWdlcyAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQk8cGFnZQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5wcm9wZXJ0eXBhZ2VzLlBCcmVha3BvaW50UHJvcGVydHlQYWdlIgotCQkJbmFtZT0iJUNvbW1vbkJyZWFrcG9pbnRQYWdlLmxhYmVsIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5wcm9wZXJ0eXBhZ2VzLmJyZWFrcG9pbnQuY29tbW9uIj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8YWRhcHQKLQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50Ij4KLQkJCQk8L2FkYXB0PgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCQk8IS0tCi0JCTxwYWdlCi0JCQlhZGFwdGFibGU9InRydWUiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5wcm9wZXJ0eXBhZ2VzLlBCcmVha3BvaW50RmlsdGVyaW5nUGFnZSIKLQkJCW5hbWU9IiVGaWx0ZXJpbmdCcmVha3BvaW50UGFnZS5sYWJlbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkucHJvcGVydHlwYWdlcy5icmVha3BvaW50LmZpbHRlcmluZyIvPgotCQkvLy0tPgotCQk8cGFnZQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5wcm9wZXJ0eXBhZ2VzLlNpZ25hbFByb3BlcnR5UGFnZSIKLQkJCW5hbWU9IiVDb21tb25TaWduYWxQYWdlLmxhYmVsIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5wcm9wZXJ0eXBhZ2VzLnNpZ25hbC5jb21tb24iPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxhZGFwdAotCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbCI+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIHNvdXJjZSBsb2NhdG9ycyAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlTG9jYXRvcnMiPgotCQk8c291cmNlTG9jYXRvcgotCQkJbmFtZT0iJURlZmF1bHRTb3VyY2VMb2NhdG9yLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5EZWZhdWx0U291cmNlTG9jYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuRGVmYXVsdFNvdXJjZUxvY2F0b3IiPgotCQk8L3NvdXJjZUxvY2F0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIG5ldyAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVEZWJ1Z2dpbmdQQ29udGV4dC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVEZWJ1Z2dpbmdQQ29udGV4dC5kZXNjcmlwdGlvbiIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5kZWJ1Z2dpbmciCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmRlYnVnZ2luZyI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5kZWJ1Z01vZGVsQ29udGV4dEJpbmRpbmdzIj4KLQkJPG1vZGVsQ29udGV4dEJpbmRpbmcKLQkJCWRlYnVnTW9kZWxJZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5kZWJ1Z2dpbmciPgotCQk8L21vZGVsQ29udGV4dEJpbmRpbmc+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkuY29udGV4dFZpZXdCaW5kaW5ncyI+Ci0JCTxjb250ZXh0Vmlld0JpbmRpbmcKLQkJCXZpZXdJZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuTWVtb3J5VmlldyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmRlYnVnZ2luZyI+Ci0JCTwvY29udGV4dFZpZXdCaW5kaW5nPgotCQk8Y29udGV4dFZpZXdCaW5kaW5nCi0JCQlhdXRvT3Blbj0iZmFsc2UiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5kZWJ1Z2dpbmciCi0JCQl2aWV3SWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5TaWduYWxzVmlldyI+Ci0JCTwvY29udGV4dFZpZXdCaW5kaW5nPgotCQk8Y29udGV4dFZpZXdCaW5kaW5nCi0JCQl2aWV3SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLlJlZ2lzdGVyVmlldyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmRlYnVnZ2luZyI+Ci0JCTwvY29udGV4dFZpZXdCaW5kaW5nPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBhbm5vdGF0aW9uIC8vLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5hbm5vdGF0aW9uVHlwZXMiPgotCQk8dHlwZQotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucEJyZWFrcG9pbnRNYXJrZXIiCi0JCQlzdXBlcj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5icmVha3BvaW50IgotCQkJbmFtZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuYnJlYWtwb2ludCI+Ci0JCTwvdHlwZT4KLQkJPHR5cGUKLQkJCW1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5yZWdDdXJyZW50SVAiCi0JCQluYW1lPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkucmVnQ3VycmVudElQIj4KLQkJPC90eXBlPgotCQk8dHlwZQotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnJlZ1NlY29uZGFyeUlQIgotCQkJbmFtZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnJlZ1NlY29uZGFyeUlQIj4KLQkJPC90eXBlPiAgICAgIAotCQk8dHlwZQotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmN1cnJlbnRTZXRJUCIKLQkJCW5hbWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5jdXJyZW50U2V0SVAiPgotCQk8L3R5cGU+ICAgICAgCi0JCTx0eXBlCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuc2V0SVAiCi0JCQluYW1lPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuc2V0SVAiPgotCQk8L3R5cGU+ICAgICAgCi0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0JCTxzcGVjaWZpY2F0aW9uCi0gICAgICAgIGFubm90YXRpb25JbWFnZVByb3ZpZGVyPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuQnJlYWtwb2ludEltYWdlUHJvdmlkZXIiCi0gICAgICAgIGFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5icmVha3BvaW50IgotICAgICAgICBsYWJlbD0iJVBCcmVha3BvaW50QW5ub3RhdGlvbi5sYWJlbCIKLSAgICAgICAgcHJlc2VudGF0aW9uTGF5ZXI9IjQiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0gICAgICAgIGFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkucmVnQ3VycmVudElQIgotICAgICAgICBjb2xvclByZWZlcmVuY2VLZXk9InB0cFJlZ0N1cnJlbnRJUENvbG9yIgotICAgICAgICBjb2xvclByZWZlcmVuY2VWYWx1ZT0iMTAyLDIwNCwyNTUiCi0gICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VLZXk9InB0cFJlZ0N1cnJlbnRJUEhpZ2hsaWdodCIKLSAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICBpY29uPSJpY29ucy9kZWJ1Zy9yZWdfY3VyX2lwLmdpZiIKLSAgICAgICAgbGFiZWw9IiVDdXJyZW50UmVnSVBBbm5vdGF0aW9uLmxhYmVsIgotICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZUtleT0icHRwUmVnQ3VjdXJyZW50SVBPdmVydmlld1J1bGVyIgotICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICBwcmVzZW50YXRpb25MYXllcj0iNyIKLSAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9InB0cFJlZ0N1cnJlbnRJUEluZGljYXRpb24iCi0gICAgICAgIHRleHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0icHRwUmVnQ3VycmVudElQVmVydGljYWxSdWxlciIKLSAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSI+Ci0JCTwvc3BlY2lmaWNhdGlvbj4KLQkJPHNwZWNpZmljYXRpb24KLSAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5yZWdTZWNvbmRhcnlJUCIKLSAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJwdHBSZWdTZWNvbmRhcnlJUENvbG9yIgotICAgICAgICBjb2xvclByZWZlcmVuY2VWYWx1ZT0iMjA0LDI1NSwxMDIiCi0gICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VLZXk9InB0cFJlZ1NlY29uZGFyeUlQSGlnaGxpZ2h0IgotICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgIGljb249Imljb25zL2RlYnVnL3JlZ19zZWNfaXAuZ2lmIgotICAgICAgICBsYWJlbD0iJVJlZ0lQQW5ub3RhdGlvbi5sYWJlbCIKLSAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VLZXk9InB0cFJlZ1NlY29uZGFyeUlQT3ZlcnZpZXdSdWxlciIKLSAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgcHJlc2VudGF0aW9uTGF5ZXI9IjciCi0gICAgICAgIHRleHRQcmVmZXJlbmNlS2V5PSJwdHBSZWdTZWNvbmRhcnlJUEluZGljYXRpb24iCi0gICAgICAgIHRleHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0icHRwUmVnU2Vjb25kYXJ5SVBWZXJ0aWNhbFJ1bGVyIgotICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCQk8c3BlY2lmaWNhdGlvbgotICAgICAgICBhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmN1cnJlbnRTZXRJUCIKLSAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJwdHBDdXJyZW50SVBDb2xvciIKLSAgICAgICAgY29sb3JQcmVmZXJlbmNlVmFsdWU9IjI1NSwyMDQsMTAyIgotICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlS2V5PSJwdHBDdXJyZW50U2V0SVBIaWdobGlnaHQiCi0gICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgaWNvbj0iaWNvbnMvZGVidWcvY3VyX3NldF9pcC5naWYiCi0gICAgICAgIGxhYmVsPSIlQ3VycmVudFNldElQQW5ub3RhdGlvbi5sYWJlbCIKLSAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VLZXk9InB0cEN1cnJlbnRTZXRJUE92ZXJ2aWV3UnVsZXIiCi0gICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSI2IgotICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0icHRwQ3VycmVudFNldElQSW5kaWNhdGlvbiIKLSAgICAgICAgdGV4dFByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJwdHBDdXJyZW50U2V0SVBWZXJ0aWNhbFJ1bGVyIgotICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCQk8c3BlY2lmaWNhdGlvbgotICAgICAgICBhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnNldElQIgotICAgICAgICBjb2xvclByZWZlcmVuY2VLZXk9InB0cFNlY29uZGFyeUlQQ29sb3IiCi0gICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIyMDQsMjU1LDEwMiIKLSAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0icHRwU2V0SVBIaWdobGlnaHQiCi0gICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgaWNvbj0iaWNvbnMvZGVidWcvc2V0X2lwLmdpZiIKLSAgICAgICAgbGFiZWw9IiVTZXRJUEFubm90YXRpb24ubGFiZWwiCi0gICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJwdHBTZXRJUE92ZXJ2aWV3UnVsZXIiCi0gICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSI2IgotICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0icHRwU2V0SVBJbmRpY2F0aW9uIgotICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJmYWxzZSIKLSAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VLZXk9InB0cFNldElQVmVydGljYWxSdWxlciIKLSAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSI+Ci0JCTwvc3BlY2lmaWNhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gcnVudGltZSBhZGFwdGVycyAvLy0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCTxmYWN0b3J5IAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlJldGFyZ2V0dGFibGVBY3Rpb25BZGFwdGVyRmFjdG9yeSIgCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwudWkuZWRpdG9yLkNFZGl0b3IiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCI+Ci0JCQk8L2FkYXB0ZXI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVJ1blRvTGluZVRhcmdldCI+Ci0JCQk8L2FkYXB0ZXI+Ci0JCTwvZmFjdG9yeT4KLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5SZXRhcmdldHRhYmxlQWN0aW9uQWRhcHRlckZhY3RvcnkiCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0Ij4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QQnJlYWtwb2ludFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5IgotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50Ij4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyIi8+Ci0JCTwvZmFjdG9yeT4KLQkJPGZhY3RvcnkKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5NYXBwaW5nU291cmNlQ29udGFpbmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5zb3VyY2Vsb29rdXAuU291cmNlQ29udGFpbmVyQWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiLz4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY2R0LmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLk1hcEVudHJ5U291cmNlQ29udGFpbmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5zb3VyY2Vsb29rdXAuU291cmNlQ29udGFpbmVyQWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiLz4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Qcm9qZWN0U291cmNlQ29udGFpbmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5zb3VyY2Vsb29rdXAuU291cmNlQ29udGFpbmVyQWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiLz4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBXYXRjaCBFeHByZXNzaW9uIC8vLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS53YXRjaEV4cHJlc3Npb25EZWxlZ2F0ZXMiPgotCQk8d2F0Y2hFeHByZXNzaW9uRGVsZWdhdGUKLQkJCWRlYnVnTW9kZWw9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlIgotCQkJZGVsZWdhdGVDbGFzcz0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBXYXRjaEV4cHJlc3Npb25EZWxlZ2F0ZSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gTWVtb3J5IC8vLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubWVtb3J5UmVuZGVyaW5ncyI+Ci0JCTxyZW5kZXJpbmdCaW5kaW5ncwotCQkJZGVmYXVsdElkcz0ib3JnLmVjbGlwc2UuZGVidWcudWkucmVuZGVyaW5nLnJhd19tZW1vcnkiCi0JCQlwcmltYXJ5SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLnJlbmRlcmluZy5yYXdfbWVtb3J5IgotCQkJcmVuZGVyaW5nSWRzPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5yZW5kZXJpbmcucmF3X21lbW9yeSxvcmcuZWNsaXBzZS5kZWJ1Zy51aS5yZW5kZXJpbmcuYXNjaWksb3JnLmVjbGlwc2UuZGVidWcudWkucmVuZGVyaW5nLnNpZ25lZGludCxvcmcuZWNsaXBzZS5kZWJ1Zy51aS5yZW5kZXJpbmcudW5zaWduZWRpbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLm1vZGVsLlBNZW1vcnlCbG9ja0V4dGVuc2lvbiIvPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmRlcmluZ0JpbmRpbmdzPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gc291cmNlIGNvbnRhaW5lciAvLy0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZUNvbnRhaW5lclByZXNlbnRhdGlvbnMiPgotCQk8c291cmNlQ29udGFpbmVyUHJlc2VudGF0aW9uCi0JCQlicm93c2VyQ2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5zb3VyY2Vsb29rdXAuTWFwcGluZ1NvdXJjZUNvbnRhaW5lckJyb3dzZXIiCi0JCQljb250YWluZXJUeXBlSUQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmNvbnRhaW5lclR5cGUubWFwcGluZyIKLQkJCWljb249Imljb25zL29iajE2L21hcHBpbmdfb2JqLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuc291cmNlQ29udGFpbmVyUHJlc2VudGF0aW9uLm1hcHBpbmciLz4KLQkJPHNvdXJjZUNvbnRhaW5lclByZXNlbnRhdGlvbgotCQkJY29udGFpbmVyVHlwZUlEPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5jb250YWluZXJUeXBlLm1hcEVudHJ5IgotCQkJaWNvbj0iaWNvbnMvb2JqMTYvbWFwZW50cnlfb2JqLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5wcHQuZGVidWcudWkuc291cmNlQ29udGFpbmVyUHJlc2VudGF0aW9uLm1hcEVudHJ5Ii8+Ci0JCTxzb3VyY2VDb250YWluZXJQcmVzZW50YXRpb24KLQkJCWNvbnRhaW5lclR5cGVJRD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuY29udGFpbmVyVHlwZS5hYnNvbHV0ZVBhdGgiCi0JCQlpY29uPSJpY29ucy9vYmoxNi9hYnNwYXRoX29iai5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnNvdXJjZUNvbnRhaW5lclByZXNlbnRhdGlvbi5hYnNvbHV0ZVBhdGgiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gdGVzdGluZwotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5EZWJ1Z01hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5wdHQuY29yZS5wU291cmNlIi8+Ci0JPC9leHRlbnNpb24+Ci0JLy8tLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NjaGVtYS9kZWJ1Z2dlckNvbmZpZ3VyYXRpb25zLmV4c2QgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc2NoZW1hL2RlYnVnZ2VyQ29uZmlndXJhdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1NDJlNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc2NoZW1hL2RlYnVnZ2VyQ29uZmlndXJhdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSIgaWQ9ImRlYnVnZ2VyQ29uZmlndXJhdGlvbnMiIG5hbWU9IkRlYnVnZ2VyIENvbmZpZ3VyYXRpb24gUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGNvbnRyaWJ1dGluZyBVSSBmb3Igb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLklQRGVidWdnZXJDb25maWd1cmF0aW9uUGFnZSBleHRlbnNpb25zLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZWJ1Z2dlckNvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlYnVnZ2VyQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGRlYnVnZ2VyIHBhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWdnZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlYnVnZ2VyIHRoaXMgcGFnZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmYW1wO2x0O2NvZGUmYW1wO2d0O0lQRGVidWdnZXJDb25maWd1cmF0aW9uUGFnZSZhbXA7bHQ7L2NvZGUmYW1wO2d0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QRGVidWdnZXJQYWdlJnF1b3Q7Jmd0OwotICAgICAgJmx0O2RlYnVnUGFnZQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UucHRwLmRlYnVnLmV4dGVybmFsLnVpLlNETVBhZ2UmcXVvdDsKLSAgICAgICAgICAgIGRlYnVnZ2VySUQ9JnF1b3Q7b3JnLmVjbGlwc2UucHRwLmRlYnVnLmV4dGVybmFsLnNkbSZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UucHRwLmRlYnVnLmV4dGVybmFsLnVpLlNETVBhZ2UmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2RlYnVnUGFnZSZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBjb250cmlidXRlZCBVSSBjb21wb25lbnQgKG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5leHRlcm5hbC51aS5TRE1QYWdlKSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkZWJ1Z2dlcnMgd2l0aCB0aGUgJnF1b3Q7b3JnLmVjbGlwc2UucHRwLmRlYnVnLmV4dGVybmFsLnNkbSZxdW90OyBkZWJ1Z2dlciBpZC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIGNsYXNzIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLklQRGVidWdnZXJQYWdlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBRTlggU29mdHdhcmUgU3lzdGVtcyBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9Bbm5vdGF0aW9uR3JvdXAuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL0Fubm90YXRpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2I1YzEwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL0Fubm90YXRpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25Hcm91cCB7Ci0JcHJpdmF0ZSBMaXN0PFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMj4gYW5ub3RhdGlvbkxpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8UEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yPigpKTsKLQotCS8qKiBDaGVjayB0aGUgYW5ub3RhdGlvbiB3aGV0aGVyIGl0IGNvbnRhaW5zIGluIHRoZSBsaXN0Ci0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgY29udGFpbnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgYW5ub3RhdGlvbikgewotCQlzeW5jaHJvbml6ZWQgKGFubm90YXRpb25MaXN0KSB7Ci0JCQlyZXR1cm4gYW5ub3RhdGlvbkxpc3QuY29udGFpbnMoYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JLyoqIEFkZCBhIG5ldyBhbm5vdGF0aW9uIHRvIHRoZSBsaXN0Ci0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMiBhbm5vdGF0aW9uKSB7Ci0JCXN5bmNocm9uaXplZCAoYW5ub3RhdGlvbkxpc3QpIHsKLQkJCWlmICghY29udGFpbnMoYW5ub3RhdGlvbikpCi0JCQkJYW5ub3RhdGlvbkxpc3QuYWRkKGFubm90YXRpb24pOwotCQl9Ci0JfQotCS8qKiBSZW1vdmUgYW5ub3RhdGlvbnMgZnJvbSB0aGUgbGlzdAotCSAqIEBwYXJhbSByZW1vdmVkQW5ub3RhdGlvbnMgbGlzdCBvZiBhbm5vdGF0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKENvbGxlY3Rpb248UEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yPiByZW1vdmVkQW5ub3RhdGlvbnMpIHsKLQkJc3luY2hyb25pemVkIChhbm5vdGF0aW9uTGlzdCkgewotCQkJYW5ub3RhdGlvbkxpc3QucmVtb3ZlQWxsKHJlbW92ZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQl9Ci0JLyoqIFJlbW92ZSBhbm5vdGF0aW9uIGZyb20gdGhlIGxpc3QKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24pIHsKLQkJc3luY2hyb25pemVkIChhbm5vdGF0aW9uTGlzdCkgewotCQkJaWYgKGNvbnRhaW5zKGFubm90YXRpb24pKQotCQkJCWFubm90YXRpb25MaXN0LnJlbW92ZShhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQlwdWJsaWMgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yW10gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JCXN5bmNocm9uaXplZCAoYW5ub3RhdGlvbkxpc3QpIHsKLQkJCXJldHVybiBhbm5vdGF0aW9uTGlzdC50b0FycmF5KG5ldyBQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjJbMF0pOwotCQl9Ci0JfQotCS8qKiBSZW1vdmUgYWxsIGFubm90YXRpb25zCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbnMoKSB7Ci0JCXN5bmNocm9uaXplZCAoYW5ub3RhdGlvbkxpc3QpIHsKLQkJCXRocm93QWxsQW5ub3RhdGlvbnMoKTsKLQkJCWFubm90YXRpb25MaXN0LmNsZWFyKCk7Ci0JCX0KLQl9Ci0JLyoqIFRvdGFsIGFubm90YXRpb25zCi0JICogQHJldHVybiB0b3RhbCBhbm5vdGF0aW9ucwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGFubm90YXRpb25MaXN0LnNpemUoKTsKLQl9Ci0JLyoqIElzIGFubm90YXRpb24gbGlzdCBlbXB0eQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBubyBhbm5vdGF0aW9uIHN0b3JlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBhbm5vdGF0aW9uTGlzdC5pc0VtcHR5KCk7Ci0JfQotCS8qKiBSZW1vdmUgYWxsIGFubm90YXRpb24gbWFya2VycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRocm93QWxsQW5ub3RhdGlvbnMoKSB7Ci0JCXN5bmNocm9uaXplZCAoYW5ub3RhdGlvbkxpc3QpIHsKLQkJCWZvciAoUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQkJYW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqIFJldHJpZXZlIGFsbCBtYXJrZXJzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmV0cmlldmVBbGxBbm5vbnRhdGlvbnMoKSB7Ci0JCXN5bmNocm9uaXplZCAoYW5ub3RhdGlvbkxpc3QpIHsKLQkJCWZvciAoUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBhbm5vdGF0aW9uLmdldFR5cGUoKTsKLQkJCQlpZiAodHlwZS5lcXVhbHMoSVBUUERlYnVnVUlDb25zdGFudHMuU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpKQotCQkJCQl0eXBlID0gSVBUUERlYnVnVUlDb25zdGFudHMuQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQ7Ci0JCQkJCi0JCQkJaWYgKGFubm90YXRpb24uaXNNYXJrRGVsZXRlZCgpKSB7Ci0JCQkJCWFubm90YXRpb24uYWRkQW5ub3RhdGlvblRvTW9kZWwoKTsKLQkJCQkJYW5ub3RhdGlvbi5zZXRNZXNzYWdlKCF0eXBlLmVxdWFscyhJUFRQRGVidWdVSUNvbnN0YW50cy5DVVJTRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL0JyZWFrcG9pbnRJbWFnZVByb3ZpZGVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9CcmVha3BvaW50SW1hZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGYxMTdjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL0JyZWFrcG9pbnRJbWFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtwb2ludEltYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIgewotCXByaXZhdGUgSURlYnVnTW9kZWxQcmVzZW50YXRpb24gZGVidWdNb2RlbFByZXNlbnRhdGlvbiA9IG51bGw7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0TWFuYWdlZEltYWdlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24pCi0JICovCi0JcHVibGljIEltYWdlIGdldE1hbmFnZWRJbWFnZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQlNYXJrZXJBbm5vdGF0aW9uIG1hcmtlckFubm90YXRpb24gPSAoTWFya2VyQW5ub3RhdGlvbilhbm5vdGF0aW9uOwotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJBbm5vdGF0aW9uLmdldE1hcmtlcigpOwotCQkJaWYgKG1hcmtlciAhPSBudWxsICYmIG1hcmtlci5leGlzdHMoKSkKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCkuZ2V0SW1hZ2UobWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0SW1hZ2VEZXNjcmlwdG9ySWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltYWdlRGVzY3JpcHRvcklkKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRGVzY3JpdHBvcklkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiogR2V0IElEZWJ1Z01vZGVsUHJlc2VudGF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSURlYnVnTW9kZWxQcmVzZW50YXRpb24gZ2V0UHJlc2VudGF0aW9uKCkgewotCQlpZiAoZGVidWdNb2RlbFByZXNlbnRhdGlvbiA9PSBudWxsKQotCQkJZGVidWdNb2RlbFByZXNlbnRhdGlvbiA9IERlYnVnVUlUb29scy5uZXdEZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCk7Ci0JCQotCQlyZXR1cm4gZGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9PdmVybGF5SW1hZ2VDYWNoZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvT3ZlcmxheUltYWdlQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwMWFiOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9PdmVybGF5SW1hZ2VDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUltYWdlQ2FjaGUgewotCXByaXZhdGUgTWFwPE92ZXJsYXlJbWFnZURlc2NyaXB0b3IsIEltYWdlPiBjYWNoZSA9IG5ldyBIYXNoTWFwPE92ZXJsYXlJbWFnZURlc2NyaXB0b3IsIEltYWdlPigpOwotCi0JLyoqIEdldCBpbWFnZSAKLQkgKiBAcGFyYW0gaW1hZ2VEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZUZvcihPdmVybGF5SW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcikgewotCQlJbWFnZSBpbWFnZSA9IChJbWFnZSlnZXRDYWNoZSgpLmdldChpbWFnZURlc2NyaXB0b3IpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCWdldENhY2hlKCkucHV0KGltYWdlRGVzY3JpcHRvciwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKiogRGlzcG9zZSBhbGwgc3RvcmVkIGltYWdlcwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2VBbGwoKSB7Ci0JCWZvciAoSXRlcmF0b3I8SW1hZ2U+IGl0ID0gZ2V0Q2FjaGUoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJbWFnZSBpbWFnZSA9IGl0Lm5leHQoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlnZXRDYWNoZSgpLmNsZWFyKCk7Ci0JfQotCi0JLyoqIEdldCBzdG9yZWQgaW1hZ2VzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTWFwPE92ZXJsYXlJbWFnZURlc2NyaXB0b3IsIEltYWdlPiBnZXRDYWNoZSgpIHsKLQkJcmV0dXJuIGNhY2hlOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZGQwMDIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvT3ZlcmxheUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAxNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfTEVGVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX1JJR0hUID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fTEVGVCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX1JJR0hUID0gMzsKLQkvLyB0aGUgYmFzZSBpbWFnZQotCXByaXZhdGUgSW1hZ2UgYmFzZTsKLQkvLyB0aGUgb3ZlcmxheSBpbWFnZXMKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzOwotCS8vIHRoZSBzaXplCi0JcHJpdmF0ZSBQb2ludCBzaXplOwotCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gb3ZlcmxheXMKLQkgKi8KLQlwdWJsaWMgT3ZlcmxheUltYWdlRGVzY3JpcHRvcihJbWFnZSBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQl0aGlzKGJhc2UsIG92ZXJsYXlzLCBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpKTsKLQl9Ci0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gb3ZlcmxheXMKLQkgKiBAcGFyYW0gc2l6ZQotCSAqLwotCXB1YmxpYyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7Ci0JCXNldEJhc2UoYmFzZSk7Ci0JCXNldE92ZXJsYXlzKG92ZXJsYXlzKTsKLQkJc2V0U2l6ZShzaXplKTsKLQl9Ci0JLyoqIERyYXcgb3ZlcmxheXMKLQkgKiBAcGFyYW0gb3ZlcmxheXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdmVybGF5cy5sZW5ndGg7IGkrKykgewotCQkJSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBvdmVybGF5c1tpXTsKLQkJCWlmIChvdmVybGF5ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlJbWFnZURhdGEgb3ZlcmxheURhdGEgPSBvdmVybGF5LmdldEltYWdlRGF0YSgpOwotCQkJLy8gVXNlIHRoZSBtaXNzaW5nIGRlc2NyaXB0b3IgaWYgaXQgaXMgbm90IHRoZXJlLgotCQkJaWYgKG92ZXJsYXlEYXRhID09IG51bGwpCi0JCQkJb3ZlcmxheURhdGEgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmdldEltYWdlRGF0YSgpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIFRPUF9MRUZUOgotCQkJCWRyYXdJbWFnZShvdmVybGF5RGF0YSwgMCwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRPUF9SSUdIVDoKLQkJCQlkcmF3SW1hZ2Uob3ZlcmxheURhdGEsIHNpemUueCAtIG92ZXJsYXlEYXRhLndpZHRoLCAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQk9UVE9NX0xFRlQ6Ci0JCQkJZHJhd0ltYWdlKG92ZXJsYXlEYXRhLCAwLCBzaXplLnkgLSBvdmVybGF5RGF0YS5oZWlnaHQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCT1RUT01fUklHSFQ6Ci0JCQkJZHJhd0ltYWdlKG92ZXJsYXlEYXRhLCBzaXplLnggLSBvdmVybGF5RGF0YS53aWR0aCwgc2l6ZS55IC0gb3ZlcmxheURhdGEuaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgT3ZlcmxheUltYWdlRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU92ZXJsYXlJbWFnZURlc2NyaXB0b3Igb3RoZXIgPSAoT3ZlcmxheUltYWdlRGVzY3JpcHRvcikgbzsKLQkJcmV0dXJuIGdldEJhc2UoKS5lcXVhbHMob3RoZXIuZ2V0QmFzZSgpKSAmJiBBcnJheXMuZXF1YWxzKGdldE92ZXJsYXlzKCksIG90aGVyLmdldE92ZXJsYXlzKCkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgY29kZSA9IGdldEJhc2UoKS5oYXNoQ29kZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldE92ZXJsYXlzKCkubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChnZXRPdmVybGF5cygpW2ldICE9IG51bGwpCi0JCQkJY29kZSBePSBnZXRPdmVybGF5cygpW2ldLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNkcmF3Q29tcG9zaXRlSW1hZ2UoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlkcmF3SW1hZ2UoZ2V0QmFzZSgpLmdldEltYWdlRGF0YSgpLCAwLCAwKTsKLQkJZHJhd092ZXJsYXlzKGdldE92ZXJsYXlzKCkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQkvKiogR2V0IGJhc2UgaW1hZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRCYXNlKCkgewotCQlyZXR1cm4gYmFzZTsKLQl9Ci0JLyoqIFNldCBiYXNlIGltYWdlCi0JICogQHBhcmFtIGJhc2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QmFzZShJbWFnZSBiYXNlKSB7Ci0JCXRoaXMuYmFzZSA9IGJhc2U7Ci0JfQotCS8qKiBHZXQgb3ZlcmxheXMgaW1hZ2VzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0T3ZlcmxheXMoKSB7Ci0JCXJldHVybiB0aGlzLm92ZXJsYXlzOwotCX0KLQkvKiogU2V0IG92ZXJsYXlzIGltYWdlcwotCSAqIEBwYXJhbSBvdmVybGF5cwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRPdmVybGF5cyhJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQl0aGlzLm92ZXJsYXlzID0gb3ZlcmxheXM7Ci0JfQotCS8qKiBTZXQgc2l6ZQotCSAqIEBwYXJhbSBzaXplCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BBbm5vdGF0aW9uTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUEFubm90YXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2YzZTQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUEFubm90YXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuTG9jYWxGaWxlU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnJlc291cmNlcy5GaWxlU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0V2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5JUERlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z1N1c3BlbmRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUxpc3RTdGFja0ZyYW1lc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLlBTb3VyY2VMb29rdXBEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuSVBUUERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LmRlYnVnLmNsaWVudC5Qcm94eURlYnVnTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuZGVidWcuY2xpZW50LlByb3h5RGVidWdTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubGlzdGVuZXJzLklKb2JDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBBbm5vdGF0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElKb2JDaGFuZ2VkTGlzdGVuZXIsIElQRGVidWdFdmVudExpc3RlbmVyIHsKLQlwcml2YXRlIHN0YXRpYyBQQW5ub3RhdGlvbk1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgZmluYWwgT2JqZWN0IExPQ0sgPSBuZXcgT2JqZWN0KCk7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25Hcm91cD4gYW5ub3RhdGlvbk1hcCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25Hcm91cD4oKSk7Ci0JcHJvdGVjdGVkIFVJRGVidWdNYW5hZ2VyIHVpRGVidWdNYW5hZ2VyID0gbnVsbDsKLQotCS8qIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHVpRGVidWdNYW5hZ2VyCi0JICovCi0JcHVibGljIFBBbm5vdGF0aW9uTWFuYWdlcihVSURlYnVnTWFuYWdlciB1aURlYnVnTWFuYWdlcikgewotCQl0aGlzLnVpRGVidWdNYW5hZ2VyID0gdWlEZWJ1Z01hbmFnZXI7Ci0JCS8vIG1ha2Ugc3VyZSBldmVyeSB0aW1lIGNyZWF0ZWQgdGhlIHNhbWUgb2JqZWN0IHJlZmVyZW5jZQotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJdWlEZWJ1Z01hbmFnZXIuYWRkSm9iQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCX0KLQl9Ci0JLyogR2V0IGluc3RhbmNlIG9mIFBBbm5vdGF0aW9uTWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBBbm5vdGF0aW9uTWFuYWdlciBnZXREZWZhdWx0KCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFBBbm5vdGF0aW9uTWFuYWdlcihQVFBEZWJ1Z1VJUGx1Z2luLmdldFVJRGVidWdNYW5hZ2VyKCkpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCS8qIENsZWFuIGFsbCBzZXR0aW5ncyBhbmQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWNsZWFyQWxsQW5ub3RhdGlvbnMoKTsKLQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCXVpRGVidWdNYW5hZ2VyLnJlbW92ZUpvYkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJYW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0JfQotCS8qIENsZWFuIGFsbCBzdG9yZWQgYW5ub3RhdGlvbnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckFsbEFubm90YXRpb25zKCkgewotCQlzeW5jaHJvbml6ZWQgKExPQ0spIHsKLQkJCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbkdyb3VwPiBpID0gYW5ub3RhdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlpLm5leHQoKS5yZW1vdmVBbm5vdGF0aW9ucygpOwotCQkJfQotCQkJYW5ub3RhdGlvbk1hcC5jbGVhcigpOwotCQl9Ci0JfQotCS8qIFJlbW92ZSBhbm5vdGF0aW9uIGdyb3VwIGJ5IGdpdmVuIGpvYgotCSAqIEBwYXJhbSBqb2JfaWQgam9iIElECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFN0cmluZyBqb2JfaWQpIHsKLQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQlBbm5vdGF0aW9uR3JvdXAgYW5ub3RhdGlvbkdyb3VwID0gKEFubm90YXRpb25Hcm91cCkgYW5ub3RhdGlvbk1hcC5yZW1vdmUoam9iX2lkKTsKLQkJCWlmIChhbm5vdGF0aW9uR3JvdXAgIT0gbnVsbCkgewotCQkJCWFubm90YXRpb25Hcm91cC5yZW1vdmVBbm5vdGF0aW9ucygpOwotCQkJfQotCQl9Ci0JfQotCS8qIEFkZCBhbm5vdGF0aW9uIHRvIGdpdmVuIGpvYgotCSAqIEBwYXJhbSBqb2JfaWQgSm9iIElECi0JICogQHBhcmFtIGFubm90YXRpb25Hcm91cAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEFubm90YXRpb25Hcm91cChTdHJpbmcgam9iX2lkLCBBbm5vdGF0aW9uR3JvdXAgYW5ub3RhdGlvbkdyb3VwKSB7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJYW5ub3RhdGlvbk1hcC5wdXQoam9iX2lkLCBhbm5vdGF0aW9uR3JvdXApOwotCQl9Ci0JfQotCS8qIEdldCBhbm5vdGF0aW9uIGJ5IGdpdmVuIGhvYiBJRAotCSAqIEBwYXJhbSBqb2JfaWQgam9iIElECi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uR3JvdXAgZ2V0QW5ub3RhdGlvbkdyb3VwKFN0cmluZyBqb2JfaWQpIHsKLQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQlyZXR1cm4gKEFubm90YXRpb25Hcm91cCkgYW5ub3RhdGlvbk1hcC5nZXQoam9iX2lkKTsKLQkJfQotCX0KLQotCS8qIEdldCBlZGl0b3IgYW5kIG9wZW4gZWRpdG9yIGlmIGl0IGlzIG5vdCBvcGVuZWQgb3IgZm9jdXMgb24gaXQgaWYgaXQgaXMgYWxyZWFkeSBvcGVuZWQKLQkgKiBAcGFyYW0gcGFnZQotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihmaW5hbCBJV29ya2JlbmNoUGFnZSBwYWdlLCBmaW5hbCBJRWRpdG9ySW5wdXQgaW5wdXQsIGZpbmFsIFN0cmluZyBpZCkgewotCQlmaW5hbCBJRWRpdG9yUGFydFtdIGVkaXRvciA9IG5ldyBJRWRpdG9yUGFydFtdIHsgbnVsbCB9OwotCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWVkaXRvclswXSA9IHBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgaWQsIGZhbHNlKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBUUERlYnVnVUlQbHVnaW4uZXJyb3JEaWFsb2coUFRQRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCAiRXJyb3IiLCAiQ2Fubm90IG9wZW4gZWRpdG9yIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldERlZmF1bHQoKSwgcik7Ci0JCXJldHVybiBlZGl0b3JbMF07Ci0JfQotCS8qIEdldCBlZGl0b3IgcGFydAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJZmluYWwgSUVkaXRvclBhcnRbXSBlZGl0b3IgPSBuZXcgSUVkaXRvclBhcnRbXSB7IG51bGwgfTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsKSB7Ci0JCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJaWYgKCgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKLQkJCQkJCQlwYWdlLmJyaW5nVG9Ub3AoZWRpdG9yUGFydCk7Ci0JCQkJCQkJZWRpdG9yWzBdID0gZWRpdG9yUGFydDsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVkaXRvclswXSA9PSBudWxsKSB7Ci0JCQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSByZWZzIDogcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkpIHsKLQkJCQkJCUlFZGl0b3JQYXJ0IHJlZkVkaXRvciA9IHJlZnMuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJCWlmIChyZWZFZGl0b3IgPT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IHJlZkVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJCWlmICgoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJCQkJCXBhZ2UuYnJpbmdUb1RvcChyZWZFZGl0b3IpOwotCQkJCQkJCQllZGl0b3JbMF0gPSByZWZFZGl0b3I7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJZWRpdG9yWzBdID0gcGFnZS5vcGVuRWRpdG9yKFBEZWJ1Z1VJVXRpbHMuZ2V0RWRpdG9ySW5wdXQoZmlsZSksIFBEZWJ1Z1VJVXRpbHMuZ2V0RWRpdG9ySWQoZmlsZSksIGZhbHNlKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vUFRQRGVidWdVSVBsdWdpbi5lcnJvckRpYWxvZyhQVFBEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksICJFcnJvciIsICJDYW5ub3Qgb3BlbiBlZGl0b3IiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZWRpdG9yWzBdOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5U291cmNlKGZpbmFsIElTb3VyY2VMb29rdXBSZXN1bHQgcmVzdWx0KSB7Ci0JCVVJSm9iIHVpSm9iID0gbmV3IFVJSm9iKCJEaXNwbGF5IHNvdXJjZSBlZGl0b3IuLi4iKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIHJlc3VsdCAhPSBudWxsICYmIHBhZ2UgIT0gbnVsbCkgewotCQkJCQlEZWJ1Z1VJVG9vbHMuZGlzcGxheVNvdXJjZShyZXN1bHQsIHBhZ2UpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JLyogRmluZCBmaWxlCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBmaW5kRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuIGZpbmRGaWxlKG5ldyBQYXRoKGZpbGVuYW1lKSk7Ci0JfQotCXByb3RlY3RlZCBJRmlsZSBmaW5kRmlsZShJUGF0aCBsb2NhdGlvbikgewotCQlJUGF0aCBub3JtYWxpemVkID0gRmlsZUJ1ZmZlcnMubm9ybWFsaXplTG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAobm9ybWFsaXplZC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5vcm1hbGl6ZWQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCQkvKgotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZT0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBmaWxlOwotCQkKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAyKQotCQkJcmV0dXJuIHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShwYXRoLm1ha2VBYnNvbHV0ZSgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JCSovCi0JfQotCS8qIEdldCB0ZXh0IGVkaXRvcgotCSAqIEBwYXJhbSBlZGl0b3JQYXJ0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXJldHVybiAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQ7Ci0JCXJldHVybiAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JfQotCS8qIEdldCBmaWxlCi0JICogQHBhcmFtIGVkaXRvcklucHV0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotCQkJcmV0dXJuICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmluZEZpbGUoKChJU3RvcmFnZUVkaXRvcklucHV0KWVkaXRvcklucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZSkgewotCQkJcmV0dXJuIGZpbmRGaWxlKCgoSVN0b3JhZ2UpZWRpdG9ySW5wdXQpLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIENyZWF0ZSBwb3NpdGlvbiBpbiB0aGUgc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gbGluZU51bWJlcgotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBsaW5lTnVtYmVyLCBJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVOdW1iZXIgLSAxKTsKLQkJCWludCBjaGFyU3RhcnQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGNoYXJTdGFydCA8IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uKGNoYXJTdGFydCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvKiBHZXQgdGFza3MgZnJvbSBkZWJ1ZyB0YXJnZXQKLQkgKiBAcGFyYW0gZGVidWdUYXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEJpdExpc3QgZ2V0VGFza3MoSURlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0KSB7Ci0JCWlmIChkZWJ1Z1RhcmdldCBpbnN0YW5jZW9mIElQRGVidWdUYXJnZXQpIHsKLQkJCXJldHVybiAoKElQRGVidWdUYXJnZXQpIGRlYnVnVGFyZ2V0KS5nZXRUYXNrcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiBHZXQgdGFza3MgZnJvbSB0aHJlYWQKLQkgKiBAcGFyYW0gdGhyZWFkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBCaXRMaXN0IGdldFRhc2tzKElUaHJlYWQgdGhyZWFkKSB7Ci0JCXJldHVybiBnZXRUYXNrcyh0aHJlYWQuZ2V0RGVidWdUYXJnZXQoKSk7Ci0JfQotCS8qIElzIGdpdmVuIHR5cGUgcmVnaXN0ZXIgdHlwZQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVnaXN0ZXJUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZS5lcXVhbHMoSVBUUERlYnVnVUlDb25zdGFudHMuUkVHX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpIHx8IHR5cGUuZXF1YWxzKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlJFR19BTk5fSU5TVFJfUE9JTlRFUl9TRUNPTkRBUlkpKTsKLQl9Ci0JLyogRm9jdXMgdG8gYW5ub3RhdGlvbiBpbiBzb3VyY2UgZWRpdG9yCi0JICogQHBhcmFtIGVkaXRvclBhcnQKLQkgKiBAcGFyYW0gc3RhY2tGcmFtZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvY3VzQW5ub3RhdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBJU3RhY2tGcmFtZSBzdGFja0ZyYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGVkaXRvclBhcnQpOwotCQlpbnQgY2hhclN0YXJ0ID0gc3RhY2tGcmFtZS5nZXRDaGFyU3RhcnQoKTsKLQkJaWYgKGNoYXJTdGFydCA+IDApIHsKLQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKGNoYXJTdGFydCwgMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGxpbmVOdW1iZXIgPSBzdGFja0ZyYW1lLmdldExpbmVOdW1iZXIoKTsKLQkJbGluZU51bWJlci0tOwotCQlJUmVnaW9uIHJlZ2lvbj0gZ2V0TGluZUluZm9ybWF0aW9uKHRleHRFZGl0b3IsIGxpbmVOdW1iZXIpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHJlZ2lvbi5nZXRPZmZzZXQoKSwgMCk7Ci0JCX0KLQl9Ci0JLyogR2V0IGxpbmUgcmVnaW9uIGluIHNvdXJjZSBlZGl0b3IKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgaW50IGxpbmVOdW1iZXIpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXI9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCXRyeSB7Ci0JCQlwcm92aWRlci5jb25uZWN0KGlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJSURvY3VtZW50IGRvY3VtZW50PSBwcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVOdW1iZXIpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm92aWRlci5kaXNjb25uZWN0KGlucHV0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLy8gY2FsbGVkIGJ5IGRlYnVnIHZpZXcgLSBQRGVidWdNb2RlbFByZXNlbnRhdGlvbgotCS8qIEFkZCBhbm5vdGF0aW9uIGNhbGxlZCBmcm9tIERlYnVnIFZpZXcKLQkgKiBAcGFyYW0gZWRpdG9yUGFydAotCSAqIEBwYXJhbSBzdGFja0ZyYW1lCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBJUFN0YWNrRnJhbWUgc3RhY2tGcmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUFN0YWNrRnJhbWUgc2VsZWN0ZWRGcmFtZSA9IHN0YWNrRnJhbWU7Ci0JCQotCQlCaXRMaXN0IHRhc2tzID0gZ2V0VGFza3Moc3RhY2tGcmFtZS5nZXREZWJ1Z1RhcmdldCgpKTsKLQkJaWYgKHRhc2tzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGVkaXRvclBhcnQpOwotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCQkKLQkJLy90cnkgdG8gZmluZCB0aGUgc3RhY2sgZnJhbWUgd2l0aCBsaW5lIG51bWJlcgotCQlpZiAoc2VsZWN0ZWRGcmFtZS5nZXRMaW5lTnVtYmVyKCkgPT0gMCkgewotCQkJSVN0YWNrRnJhbWVbXSBmcmFtZXMgPSBzZWxlY3RlZEZyYW1lLmdldFRocmVhZCgpLmdldFN0YWNrRnJhbWVzKCk7Ci0JCQlmb3IgKElTdGFja0ZyYW1lIGZyYW1lIDogZnJhbWVzKSB7Ci0JCQkJaWYgKGZyYW1lLmdldExpbmVOdW1iZXIoKSA+IDApIHsKLQkJCQkJc2VsZWN0ZWRGcmFtZSA9IChJUFN0YWNrRnJhbWUpZnJhbWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWRGcmFtZS5nZXRMaW5lTnVtYmVyKCkgPiAwKSB7Ci0JCQlTdHJpbmcgam9iX2lkID0gdWlEZWJ1Z01hbmFnZXIuZ2V0Q3VycmVudEpvYklkKCk7Ci0JCQlzeW5jaHJvbml6ZWQgKExPQ0spIHsKLQkJCQlBbm5vdGF0aW9uR3JvdXAgYW5ub3RhdGlvbkdyb3VwID0gZ2V0QW5ub3RhdGlvbkdyb3VwKGpvYl9pZCk7Ci0JCQkJaWYgKGFubm90YXRpb25Hcm91cCA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb25Hcm91cCA9IG5ldyBBbm5vdGF0aW9uR3JvdXAoKTsKLQkJCQkJcHV0QW5ub3RhdGlvbkdyb3VwKGpvYl9pZCwgYW5ub3RhdGlvbkdyb3VwKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uR3JvdXAsIHRhc2tzKTsKLQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25Hcm91cCwgdGV4dEVkaXRvciwgZmlsZSwgc2VsZWN0ZWRGcmFtZS5nZXRMaW5lTnVtYmVyKCksIHRhc2tzLCAoc2VsZWN0ZWRGcmFtZS5nZXRMZXZlbCgpID4gMSkgPyBJUFRQRGVidWdVSUNvbnN0YW50cy5SRUdfQU5OX0lOU1RSX1BPSU5URVJfU0VDT05EQVJZIDogSVBUUERlYnVnVUlDb25zdGFudHMuUkVHX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgUFNvdXJjZUxvb2t1cERpcmVjdG9yIGdldFNvdXJjZUxvY2F0b3IoU3RyaW5nIGpvYl9pZCkgewotCQlJUFNlc3Npb24gc2Vzc2lvbiA9IHVpRGVidWdNYW5hZ2VyLmdldERlYnVnU2Vzc2lvbihqb2JfaWQpOwotCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQlJU291cmNlTG9jYXRvciBsb2NhdG9yID0gc2Vzc2lvbi5nZXRMYXVuY2goKS5nZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCQlpZiAobG9jYXRvciBpbnN0YW5jZW9mIFBTb3VyY2VMb29rdXBEaXJlY3RvcikgewotCQkJCXJldHVybiAoUFNvdXJjZUxvb2t1cERpcmVjdG9yKWxvY2F0b3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSVBhdGggZ2V0RmlsZVBhdGgoU3RyaW5nIGpvYl9pZCwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVBTb3VyY2VMb29rdXBEaXJlY3RvciBsb2NhdG9yID0gZ2V0U291cmNlTG9jYXRvcihqb2JfaWQpOwotCQlpZiAobG9jYXRvciAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gbG9jYXRvci5nZXRTb3VyY2VFbGVtZW50KGZpbGVuYW1lKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiAoKElGaWxlKW9iamVjdCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMb2NhbEZpbGVTdG9yYWdlKSB7Ci0JCQkJcmV0dXJuICgoTG9jYWxGaWxlU3RvcmFnZSlvYmplY3QpLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRmlsZVN0b3JhZ2UpIHsKLQkJCQlyZXR1cm4gKChGaWxlU3RvcmFnZSlvYmplY3QpLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKGZpbGVuYW1lKTsKLQl9Ci0JLy8gY2FsbGVkIGJ5IGV2ZW50Ci0JLyoKLQkgKiBBZGQgYW5ub3RhdGlvbiBjYWxsZWQgZnJvbSBkZWJ1ZyBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVnaXN0ZXJBbm5vdGF0aW9uKFN0cmluZyBqb2JfaWQsIGludCBsZXZlbCwgU3RyaW5nIGZpbGVuYW1lLCBpbnQgbGluZU51bWJlciwgQml0TGlzdCB0YXNrcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGFza3MuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCUlGaWxlIGZpbGUgPSBmaW5kRmlsZShnZXRGaWxlUGF0aChqb2JfaWQsIGZpbGVuYW1lKSk7Ci0JCS8vSUZpbGUgZmlsZSA9IGZpbmRGaWxlKGZ1bGxQYXRoRmlsZU5hbWUpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBnZXRFZGl0b3JQYXJ0KGZpbGUpOwotCQlpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcihlZGl0b3JQYXJ0KTsKLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCi0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cChqb2JfaWQpOwotCQkJaWYgKGFubm90YXRpb25Hcm91cCA9PSBudWxsKSB7Ci0JCQkJYW5ub3RhdGlvbkdyb3VwID0gbmV3IEFubm90YXRpb25Hcm91cCgpOwotCQkJCXB1dEFubm90YXRpb25Hcm91cChqb2JfaWQsIGFubm90YXRpb25Hcm91cCk7Ci0JCQl9Ci0JCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25Hcm91cCwgdGV4dEVkaXRvciwgZmlsZSwgbGluZU51bWJlciwgdGFza3MsICgobGV2ZWwgPiAxKT9JUFRQRGVidWdVSUNvbnN0YW50cy5TRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVDooKGNvbnRhaW5zQ3VycmVudFNldCh0YXNrcykpID8gSVBUUERlYnVnVUlDb25zdGFudHMuQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQgOiBJUFRQRGVidWdVSUNvbnN0YW50cy5TRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCkpKTsJCQkJCi0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihTdHJpbmcgam9iX2lkLCBpbnQgbGV2ZWwsIFN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmVOdW1iZXIsIEJpdExpc3QgclRhc2tzLCBCaXRMaXN0IHVUYXNrcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZmluZEZpbGUoZ2V0RmlsZVBhdGgoam9iX2lkLCBmaWxlbmFtZSkpOwotCQkvL0lGaWxlIGZpbGUgPSBmaW5kRmlsZShmdWxsUGF0aEZpbGVOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0RWRpdG9yUGFydChmaWxlKTsKLQkJaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoZWRpdG9yUGFydCk7Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKExPQ0spIHsKLQkJCUFubm90YXRpb25Hcm91cCBhbm5vdGF0aW9uR3JvdXAgPSBnZXRBbm5vdGF0aW9uR3JvdXAoam9iX2lkKTsKLQkJCWlmIChhbm5vdGF0aW9uR3JvdXAgPT0gbnVsbCkgewotCQkJCWFubm90YXRpb25Hcm91cCA9IG5ldyBBbm5vdGF0aW9uR3JvdXAoKTsKLQkJCQlwdXRBbm5vdGF0aW9uR3JvdXAoam9iX2lkLCBhbm5vdGF0aW9uR3JvdXApOwotCQkJfQotCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uR3JvdXAsIHRleHRFZGl0b3IsIGZpbGUsIGxpbmVOdW1iZXIsIHJUYXNrcywgKChsZXZlbCA+IDEpP0lQVFBEZWJ1Z1VJQ29uc3RhbnRzLlJFR19BTk5fSU5TVFJfUE9JTlRFUl9TRUNPTkRBUlk6IElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlJFR19BTk5fSU5TVFJfUE9JTlRFUl9DVVJSRU5UKSk7CQkJCQotCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uR3JvdXAsIHRleHRFZGl0b3IsIGZpbGUsIGxpbmVOdW1iZXIsIHVUYXNrcywgKChsZXZlbCA+IDEpP0lQVFBEZWJ1Z1VJQ29uc3RhbnRzLlNFVF9BTk5fSU5TVFJfUE9JTlRFUl9DVVJSRU5UOigoY29udGFpbnNDdXJyZW50U2V0KHVUYXNrcykpID8gSVBUUERlYnVnVUlDb25zdGFudHMuQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQgOiBJUFRQRGVidWdVSUNvbnN0YW50cy5TRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCkpKTsJCQkJCi0JCX0KLQl9Ci0JLyogSXMgZ2l2ZW4gdGFza3MgaW4gdGhlIGN1cnJlbnQgc2V0Ci0JICogQHBhcmFtIGFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0N1cnJlbnRTZXQoQml0TGlzdCBhVGFza3MpIHsKLQkJU3RyaW5nIHNldF9pZCA9IHVpRGVidWdNYW5hZ2VyLmdldEN1cnJlbnRTZXRJZCgpOwotCQlpZiAoc2V0X2lkLmVxdWFscyhJRWxlbWVudEhhbmRsZXIuU0VUX1JPT1RfSUQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlCaXRMaXN0IHRhc2tzID0gdWlEZWJ1Z01hbmFnZXIuZ2V0VGFza3Moc2V0X2lkKTsKLQkJCXJldHVybiAodGFza3MgIT0gbnVsbCAmJiB0YXNrcy5pbnRlcnNlY3RzKGFUYXNrcykpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkvLyBnZW5lcmljCi0JLyogQWRkIGFubm90YXRpb24KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbkdyb3VwCi0JICogQHBhcmFtIHRleHRFZGl0b3IKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKEFubm90YXRpb25Hcm91cCBhbm5vdGF0aW9uR3JvdXAsIGZpbmFsIElUZXh0RWRpdG9yIHRleHRFZGl0b3IsIGZpbmFsIElGaWxlIGZpbGUsIGZpbmFsIGludCBsaW5lTnVtYmVyLCBmaW5hbCBCaXRMaXN0IHRhc2tzLCBmaW5hbCBTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXRhc2tzLmlzRW1wdHkoKSkgewotCQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZG9jUHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoYW5ub3RhdGlvbk1vZGVsID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCQkJZmluYWwgUG9zaXRpb24gcG9zaXRpb24gPSBjcmVhdGVQb3NpdGlvbihsaW5lTnVtYmVyLCBkb2NQcm92aWRlci5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCWlmIChwb3NpdGlvbiA9PSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQotCQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQkJUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24gPSBmaW5kQW5ub3RhdGlvbihhbm5vdGF0aW9uR3JvdXAsIHBvc2l0aW9uLCB0eXBlKTsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb24gPSBuZXcgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yKGZpbGUsIHR5cGUsIHBvc2l0aW9uLCBhbm5vdGF0aW9uTW9kZWwpOwotCQkJCQlhbm5vdGF0aW9uR3JvdXAuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLQkJCQl9Ci0JCQkJYW5ub3RhdGlvbi5hZGRUYXNrcyh0YXNrcyk7Ci0JCQkJYW5ub3RhdGlvbi5zZXRNZXNzYWdlKGlzUmVnaXN0ZXJUeXBlKHR5cGUpKTsKLQkJCX0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbChwb3NpdGlvbi5nZXRPZmZzZXQoKSwgMCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JLyogRmluZCBhbm5vdGF0aW9uCi0JICogQHBhcmFtIGFubm90YXRpb25Hcm91cAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgZmluZEFubm90YXRpb24oQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCwgUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyB0eXBlKSB7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJZm9yIChQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgYW5ub3RhdGlvbiA6IGFubm90YXRpb25Hcm91cC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQkJaWYgKGFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5lcXVhbHMocG9zaXRpb24pKSB7Ci0JCQkJCWlmIChhbm5vdGF0aW9uLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKLQkJCQkJCXJldHVybiBhbm5vdGF0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLy8gY2FsbGVkIGJ5IGRlYnVnIHZpZXcKLQkvKiBSZW1vdmUgYW5ub3RhdGlvbiBjYWxsZWQgZnJvbSBEZWJ1ZyBWaWV3Ci0JICogQHBhcmFtIGVkaXRvclBhcnQKLQkgKiBAcGFyYW0gdGhyZWFkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBJUFRocmVhZCB0aHJlYWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQW5ub3RhdGlvbih1aURlYnVnTWFuYWdlci5nZXRDdXJyZW50Sm9iSWQoKSwgZ2V0VGFza3ModGhyZWFkKSk7Ci0JfQotCS8vIGNhbGxlZCBieSBldmVudAotCS8qIFJlbW92ZSBhbm5vdGF0aW9uIGNhbGxlZCBmcm9tIGRlYnVnIGV2ZW50Ci0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb24oU3RyaW5nIGpvYl9pZCwgQml0TGlzdCB0YXNrcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5pc0VtcHR5KCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cChqb2JfaWQpOwotCQkJaWYgKGFubm90YXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uR3JvdXAsIHRhc2tzKTsKLQkJCQlpZiAoYW5ub3RhdGlvbkdyb3VwLmlzRW1wdHkoKSkKLQkJCQkJcmVtb3ZlQW5ub3RhdGlvbkdyb3VwKGpvYl9pZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gZ2VuZXJpYwotCS8qIFJlbW92ZSBhbm5vdGF0aW9uCi0JICogQHBhcmFtIGFubm90YXRpb25Hcm91cAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb24oQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCwgQml0TGlzdCB0YXNrcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKExPQ0spIHsKLQkJCUxpc3Q8UEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yPiByZW1vdmVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yPigwKTsKLQkJCWZvciAoUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24gOiBhbm5vdGF0aW9uR3JvdXAuZ2V0QW5ub3RhdGlvbnMoKSkgewotCQkJCWFubm90YXRpb24ucmVtb3ZlVGFza3ModGFza3MpOwotCQkJCWlmIChhbm5vdGF0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlhbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCQkJcmVtb3ZlZExpc3QuYWRkKGFubm90YXRpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFubm90YXRpb24uc2V0TWVzc2FnZShpc1JlZ2lzdGVyVHlwZShhbm5vdGF0aW9uLmdldFR5cGUoKSkpOwotCQkJCX0KLQkJCX0KLQkJCWFubm90YXRpb25Hcm91cC5yZW1vdmVBbm5vdGF0aW9ucyhyZW1vdmVkTGlzdCk7Ci0JCX0KLQl9Ci0JLyogR2V0IGl0ZXJhdG9yIG9mIHN0b3JlZCBhbm5vdGF0aW9ucwotCSAqIEBwYXJhbSBhbm5vdGF0aW9uR3JvdXAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yW10gZmluZEFubm90YXRpb25zKEFubm90YXRpb25Hcm91cCBhbm5vdGF0aW9uR3JvdXAsIFN0cmluZyB0eXBlKSB7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJTGlzdDxQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjI+IGZvdW5kQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMj4oKTsKLQkJCWZvciAoUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24gOiBhbm5vdGF0aW9uR3JvdXAuZ2V0QW5ub3RhdGlvbnMoKSkgewotCQkJCWlmIChhbm5vdGF0aW9uLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKLQkJCQkJZm91bmRBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZvdW5kQW5ub3RhdGlvbnMudG9BcnJheShuZXcgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yWzBdKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yW10gZmluZEFubm90YXRpb25zKEFubm90YXRpb25Hcm91cCBhbm5vdGF0aW9uR3JvdXAsIEJpdExpc3QgdGFza3MpIHsKLQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQlMaXN0PFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMj4gZm91bmRBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yPigpOwotCQkJaWYgKHRhc2tzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gbmV3IFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMlswXTsKLQotCQkJZm9yIChQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgYW5ub3RhdGlvbiA6IGFubm90YXRpb25Hcm91cC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQkJaWYgKCFhbm5vdGF0aW9uLmlzTWFya0RlbGV0ZWQoKSAmJiBhbm5vdGF0aW9uLmNvbnRhaW5zKHRhc2tzKSkgewotCQkJCQlpZiAoIWZvdW5kQW5ub3RhdGlvbnMuY29udGFpbnMoYW5ub3RhdGlvbikpCi0JCQkJCQlmb3VuZEFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZm91bmRBbm5vdGF0aW9ucy50b0FycmF5KG5ldyBQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjJbMF0pOwotCQl9Ci0JfQotCS8qIEZpbmQgb3RoZXIgYW5ub3RhdGlvbgotCSAqIEBwYXJhbSBhbm5vdGF0aW9uR3JvdXAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiBAcGFyYW0gaXNSZWdpc3RlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGZpbmRPdGhlclR5cGVBbm5vdGF0aW9uKEFubm90YXRpb25Hcm91cCBhbm5vdGF0aW9uR3JvdXAsIFBvc2l0aW9uIHBvc2l0aW9uLCBib29sZWFuIGlzUmVnaXN0ZXIpIHsKLQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQlmb3IgKFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbkdyb3VwLmdldEFubm90YXRpb25zKCkpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmVxdWFscyhwb3NpdGlvbikpIHsKLQkJCQkJU3RyaW5nIGFubm90YXRpb25UeXBlID0gYW5ub3RhdGlvbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc1JlZ2lzdGVyKSB7Ci0JCQkJCQlpZiAoYW5ub3RhdGlvblR5cGUuZXF1YWxzKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLkNVUlNFVF9BTk5fSU5TVFJfUE9JTlRFUl9DVVJSRU5UKSB8fCBhbm5vdGF0aW9uVHlwZS5lcXVhbHMoSVBUUERlYnVnVUlDb25zdGFudHMuU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpKQotCQkJCQkJCXJldHVybiBhbm5vdGF0aW9uOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGFubm90YXRpb25UeXBlLmVxdWFscyhJUFRQRGVidWdVSUNvbnN0YW50cy5SRUdfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCkgfHwgYW5ub3RhdGlvblR5cGUuZXF1YWxzKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlJFR19BTk5fSU5TVFJfUE9JTlRFUl9TRUNPTkRBUlkpKQotCQkJCQkJCXJldHVybiBhbm5vdGF0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyogQ2hhbmdlIGFubm90YXRpb24gdHlwZQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBbm5vdGF0aW9uVHlwZShQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgYW5ub3RhdGlvbiwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKCFhbm5vdGF0aW9uLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsJCQkKLQkJCWFubm90YXRpb24uc2V0VHlwZSh0eXBlKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihTdHJpbmcgam9iX2lkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cChqb2JfaWQpOwotCQkJaWYgKGFubm90YXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZm9yIChQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgYW5ub3RhdGlvbiA6IGZpbmRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uR3JvdXAsIHRhc2tzKSkgewotCQkJCQlCaXRMaXN0IGNwVGFza3MgPSB0YXNrcy5jb3B5KCk7Ci0JCQkJCWNwVGFza3MuYW5kKGFubm90YXRpb24uZ2V0VGFza3MoKSk7Ci0JCQkJCWlmIChjcFRhc2tzLmlzRW1wdHkoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJdXBkYXRlRXhpc3RlZEFubm90YXRpb24oYW5ub3RhdGlvbkdyb3VwLCBhbm5vdGF0aW9uLCBjcFRhc2tzLCBmYWxzZSk7Ci0JCQkJCS8qCi0JCQkJCWJvb2xlYW4gaXNSZWdpc3RlciA9IGlzUmVnaXN0ZXJUeXBlKGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJCQkJaWYgKCFpc1JlZ2lzdGVyKS8vIHVucmVnaXN0ZXIgYW5ub3RhdGlvbgotCQkJCQkJdXBkYXRlRXhpc3RlZEFubm90YXRpb24oYW5ub3RhdGlvbkdyb3VwLCBhbm5vdGF0aW9uLCBjcFRhc2tzLCBpc1JlZ2lzdGVyKTsKLQkJCQkJKi8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlcihTdHJpbmcgam9iX2lkLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cChqb2JfaWQpOwotCQkJaWYgKGFubm90YXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZm9yIChQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIgYW5ub3RhdGlvbiA6IGZpbmRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uR3JvdXAsIHRhc2tzKSkgewotCQkJCQlCaXRMaXN0IGNwVGFza3MgPSB0YXNrcy5jb3B5KCk7Ci0JCQkJCWNwVGFza3MuYW5kKGFubm90YXRpb24uZ2V0VGFza3MoKSk7Ci0JCQkJCWlmIChjcFRhc2tzLmlzRW1wdHkoKSkKLQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCXVwZGF0ZUV4aXN0ZWRBbm5vdGF0aW9uKGFubm90YXRpb25Hcm91cCwgYW5ub3RhdGlvbiwgY3BUYXNrcywgdHJ1ZSk7Ci0JCQkJCS8qCi0JCQkJCWJvb2xlYW4gaXNSZWdpc3RlciA9IGlzUmVnaXN0ZXJUeXBlKGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJCQkJaWYgKGlzUmVnaXN0ZXIpLy8gcmVnaXN0ZXIgYW5ub3RhdGlvbgotCQkJCQkJdXBkYXRlRXhpc3RlZEFubm90YXRpb24oYW5ub3RhdGlvbkdyb3VwLCBhbm5vdGF0aW9uLCBjcFRhc2tzLCBpc1JlZ2lzdGVyKTsKLQkJCQkJKi8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogUmVtb3ZlIHRhc2tzIGZyb20gZXhpc3RlZCBhbm5vdGF0aW9uCi0JICogQHBhcmFtIGFubm90YXRpb25Hcm91cAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogQHBhcmFtIHRhc2tzIFRhc2tzIGJlaW5nIHJlbW92ZWQKLQkgKiBAcGFyYW0gaXNSZWdpc3RlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUV4aXN0ZWRBbm5vdGF0aW9uKEFubm90YXRpb25Hcm91cCBhbm5vdGF0aW9uR3JvdXAsIFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMiBhbm5vdGF0aW9uLCBCaXRMaXN0IHRhc2tzLCBib29sZWFuIGlzUmVnaXN0ZXIpIHsKLQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQlJUmVzb3VyY2UgZmlsZSA9IGFubm90YXRpb24uZ2V0TWFrZXJSZXNvdXJjZSgpOwotCQkJUG9zaXRpb24gcG9zaXRpb24gPSBhbm5vdGF0aW9uLmdldFBvc2l0aW9uKCk7Ci0JCQlhbm5vdGF0aW9uLnJlbW92ZVRhc2tzKHRhc2tzKTsKLQkJCWlmIChhbm5vdGF0aW9uLmlzRW1wdHkoKSkgewotCQkJCWFubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOwotCQkJCWFubm90YXRpb25Hcm91cC5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYW5ub3RhdGlvbi5zZXRNZXNzYWdlKGlzUmVnaXN0ZXIpOwotCQkJfQotCQotCQkJUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIG9Bbm5vdGF0aW9uID0gZmluZE90aGVyVHlwZUFubm90YXRpb24oYW5ub3RhdGlvbkdyb3VwLCBwb3NpdGlvbiwgaXNSZWdpc3Rlcik7Ci0JCQlpZiAob0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJCW9Bbm5vdGF0aW9uLmFkZFRhc2tzKHRhc2tzKTsKLQkJCQlvQW5ub3RhdGlvbi5zZXRNZXNzYWdlKCFpc1JlZ2lzdGVyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vU3RyaW5nIHR5cGUgPSBpc1JlZ2lzdGVyID8gKChjb250YWluc0N1cnJlbnRTZXQodGFza3MpID8gSVBUUERlYnVnVUlDb25zdGFudHMuQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQgOiBJUFRQRGVidWdVSUNvbnN0YW50cy5TRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCkpIDogSVBUUERlYnVnVUlDb25zdGFudHMuUkVHX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQ7Ci0JCQkJU3RyaW5nIHR5cGUgPSBJUFRQRGVidWdVSUNvbnN0YW50cy5DVVJTRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVDsKLQkJCQlvQW5ub3RhdGlvbiA9IG5ldyBQSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIoZmlsZSwgdHlwZSwgcG9zaXRpb24sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk1vZGVsKCkpOwotCQkJCWFubm90YXRpb25Hcm91cC5hZGRBbm5vdGF0aW9uKG9Bbm5vdGF0aW9uKTsKLQkJCQlvQW5ub3RhdGlvbi5hZGRUYXNrcyh0YXNrcyk7Ci0JCQkJb0Fubm90YXRpb24uc2V0TWVzc2FnZSghaXNSZWdpc3Rlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFNldCBDaGFuZ2UgRXZlbnQKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogVXBkYXRlIGFubm90YXRpb24KLQkgKiBAcGFyYW0gY3VycmVudFNldCBjdXJyZW50IHNldAotCSAqIEBwYXJhbSBwcmVTZXQgcHJldmlvdXMgc2V0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQW5ub3RhdGlvbihmaW5hbCBJRWxlbWVudFNldCBjdXJyZW50U2V0LCBmaW5hbCBJRWxlbWVudFNldCBwcmVTZXQpIHsKLQkJV29ya2JlbmNoSm9iIHVpSm9iID0gbmV3IFdvcmtiZW5jaEpvYigiVXBkYXRpbmcgYW5ub3RhdGlvbi4uLiIpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJQW5ub3RhdGlvbkdyb3VwIGFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cCh1aURlYnVnTWFuYWdlci5nZXRDdXJyZW50Sm9iSWQoKSk7Ci0JCQkJaWYgKGFubm90YXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlCaXRMaXN0IHRhc2tzID0gdWlEZWJ1Z01hbmFnZXIuZ2V0VGFza3MoY3VycmVudFNldC5nZXRJRCgpKTsKLQkJCQkJCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJCQkJCWZvciAoUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIGFubm90YXRpb24gOiBhbm5vdGF0aW9uR3JvdXAuZ2V0QW5ub3RhdGlvbnMoKSkgewotCQkJCQkJCQkvLyBjaGFuZ2UgaWNvbiBmb3IgdW5yZWdpc3RlcmVkIHByb2Nlc3NlcyBvbmx5IGlmIHRoZSBzZXQgaXMgY2hhbmdlZAotCQkJCQkJCQlpZiAoIWlzUmVnaXN0ZXJUeXBlKGFubm90YXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJCQkJLy8gaWYgYWxsIHRoZSB0YXNrcyBpbiBjdXJyZW50IGlzIG5vdCBtYXRjaCB0aGUgdW5yZWdpc3RlcmVkIHRhc2tzLCBkaXNwbGF5IFNFVF9BTk4KLQkJCQkJCQkJCS8vIHNpbXBseSBvbmx5IGRpc3BsYXkgU0VUX0FOTiB3aGVuIHRoZSBjdXJyZW50IHNldCBvbmx5IGNvbnRhaW4gcmVnaXN0ZXJlZCB0YXNrcwotCQkJCQkJCQkJaWYgKGN1cnJlbnRTZXQuaXNSb290U2V0KCkpCi0JCQkJCQkJCQkJY2hhbmdlQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvbiwgSVBUUERlYnVnVUlDb25zdGFudHMuQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpOwotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJCWNoYW5nZUFubm90YXRpb25UeXBlKGFubm90YXRpb24sIGFubm90YXRpb24uY29udGFpbnModGFza3MpID8gSVBUUERlYnVnVUlDb25zdGFudHMuQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQgOiBJUFRQRGVidWdVSUNvbnN0YW50cy5TRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXVpSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJdWlKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIEpvYiBDaGFuZ2UgTGlzdGVuZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVycy5JSm9iQ2hhbmdlZExpc3RlbmVyI2pvYkNoYW5nZWRFdmVudChpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgam9iQ2hhbmdlZEV2ZW50KGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgY3VyX2pvYl9pZCwgZmluYWwgU3RyaW5nIHByZV9qb2JfaWQpIHsKLQkJV29ya2JlbmNoSm9iIHVpSm9iID0gbmV3IFdvcmtiZW5jaEpvYigiVXBkYXRpbmcgYW5ub3RhdGlvbi4uLiIpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJZG9Kb2JDaGFuZ2VkRXZlbnQodHlwZSwgY3VyX2pvYl9pZCwgcHJlX2pvYl9pZCwgbW9uaXRvcik7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXVpSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJdWlKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRvSm9iQ2hhbmdlZEV2ZW50KGludCB0eXBlLCBTdHJpbmcgY3VyX2pvYl9pZCwgU3RyaW5nIHByZV9qb2JfaWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAodHlwZSA9PSBJSm9iQ2hhbmdlZExpc3RlbmVyLlJFTU9WRUQgfHwgKHByZV9qb2JfaWQgIT0gbnVsbCAmJiAhcHJlX2pvYl9pZC5lcXVhbHMoSU1hbmFnZXIuRU1QVFlfSUQpKSkgewotCQkJQW5ub3RhdGlvbkdyb3VwIHByZUFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cChwcmVfam9iX2lkKTsKLQkJCWlmIChwcmVBbm5vdGF0aW9uR3JvdXAgIT0gbnVsbCkgewotCQkJCXByZUFubm90YXRpb25Hcm91cC50aHJvd0FsbEFubm90YXRpb25zKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cl9qb2JfaWQgIT0gbnVsbCkgewotCQkJQW5ub3RhdGlvbkdyb3VwIGN1ckFubm90YXRpb25Hcm91cCA9IGdldEFubm90YXRpb25Hcm91cChjdXJfam9iX2lkKTsKLQkJCWlmIChjdXJBbm5vdGF0aW9uR3JvdXAgIT0gbnVsbCkgewotCQkJCWN1ckFubm90YXRpb25Hcm91cC5yZXRyaWV2ZUFsbEFubm9udGF0aW9ucygpOwotCQkJfQotCQl9CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0V2ZW50TGlzdGVuZXIjaGFuZGxlRGVidWdFdmVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudHMuSVBEZWJ1Z0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnQoZmluYWwgSVBEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCVdvcmtiZW5jaEpvYiB1aUpvYiA9IG5ldyBXb3JrYmVuY2hKb2IoIlVwZGF0aW5nIGFubm90YXRpb24uLi4iKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWRvSGFuZGxlRGVidWdFdmVudChldmVudCwgbW9uaXRvcik7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXVpSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJdWlKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRvSGFuZGxlRGVidWdFdmVudChJUERlYnVnRXZlbnQgZXZlbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUERlYnVnSW5mbyBpbmZvID0gZXZlbnQuZ2V0SW5mbygpOwotCQlJUEpvYiBqb2IgPSBpbmZvLmdldEpvYigpOwotCQlzd2l0Y2goZXZlbnQuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElQRGVidWdFdmVudC5DUkVBVEU6Ci0JCQkJc3dpdGNoIChldmVudC5nZXREZXRhaWwoKSkgewotCQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LlJFR0lTVEVSOgotCQkJCQlyZWdpc3Rlcihqb2IuZ2V0SUQoKSwgaW5mby5nZXRBbGxUYXNrcygpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUERlYnVnRXZlbnQuQlJFQUtQT0lOVDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUERlYnVnRXZlbnQuVEVSTUlOQVRFOgotCQkJCXN3aXRjaCAoZXZlbnQuZ2V0RGV0YWlsKCkpIHsKLQkJCQljYXNlIElQRGVidWdFdmVudC5ERUJVR0dFUjoKLQkJCQkJcmVtb3ZlQW5ub3RhdGlvbkdyb3VwKGpvYi5nZXRJRCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUERlYnVnRXZlbnQuUkVHSVNURVI6Ci0JCQkJCXVucmVnaXN0ZXIoam9iLmdldElEKCksIGluZm8uZ2V0QWxsVGFza3MoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQ6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJlbW92ZUFubm90YXRpb25BY3Rpb24oam9iLCBpbmZvLmdldEFsbFRhc2tzKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElQRGVidWdFdmVudC5SRVNVTUU6Ci0JCQkJcmVtb3ZlQW5ub3RhdGlvbkFjdGlvbihqb2IsIGluZm8uZ2V0QWxsVGFza3MoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElQRGVidWdFdmVudC5TVVNQRU5EOgotCQkJCUlQRGVidWdTdXNwZW5kSW5mbyBzdXNJbmZvID0gKElQRGVidWdTdXNwZW5kSW5mbylpbmZvOwotCQkJCXRyeSB7Ci0JCQkJCWFkZEFubm90YXRpb24oam9iLCBzdXNJbmZvKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQVFBEZWJ1Z1VJUGx1Z2luLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCVBUUERlYnVnVUlQbHVnaW4uZXJyb3JEaWFsb2coIkVycm9yIiwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LkNIQU5HRToKLQkJCQlicmVhazsKLQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LkVSUk9SOgotCQkJCS8vcmVtb3ZlQW5ub3RhdGlvbkFjdGlvbihqb2IsIGluZm8uZ2V0QWxsVGFza3MoKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEFubm90YXRpb24oSVBKb2Igam9iLCBJUERlYnVnU3VzcGVuZEluZm8gaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGluZm8uZ2V0TGluZU51bWJlcigpOwotCQlpZiAobGluZSA9PSAwKSB7Ci0JCQkvL0ZJWE1FOiB0aGlzIG1ldGhvZCBpcyBvbmx5IGZvciB1bnJlZyB0YXNrcywgcmVnIHRhc2tzIGRlcGVuZHMgb24gc2VsZWN0aW9uIG9uIHN0YWNrIGZyYW1lIG9uIGRlYnVnIHZpZXcKLQkJCWFkZEFubm90YXRpb25XaXRoU291cmNlRm91bmQoam9iLCBpbmZvLmdldEFsbFVucmVnaXN0ZXJlZFRhc2tzKCksIGluZm8uZ2V0TGV2ZWwoKSsxLCBpbmZvLmdldERlcHRoKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkQW5ub3RhdGlvbihqb2IuZ2V0SUQoKSwgaW5mby5nZXRMZXZlbCgpLCBpbmZvLmdldEZpbGVuYW1lKCksIGxpbmUsIGluZm8uZ2V0QWxsUmVnaXN0ZXJlZFRhc2tzKCksIGluZm8uZ2V0QWxsVW5yZWdpc3RlcmVkVGFza3MoKSk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEFubm90YXRpb25XaXRoU291cmNlRm91bmQoSVBKb2Igam9iLCBCaXRMaXN0IHRhc2tzLCBpbnQgbG93LCBpbnQgaGlnaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGFza3MuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCUlQU2Vzc2lvbiBzZXNzaW9uID0gdWlEZWJ1Z01hbmFnZXIuZ2V0RGVidWdTZXNzaW9uKGpvYik7Ci0JCWlmIChzZXNzaW9uICE9IG51bGwpIHsKLQkJCWlmICghc2Vzc2lvbi5pc1JlYWR5KCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJUERJTGlzdFN0YWNrRnJhbWVzUmVxdWVzdCByZXF1ZXN0ID0gc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuZ2V0UmVxdWVzdEZhY3RvcnkoKS5nZXRMaXN0U3RhY2tGcmFtZXNSZXF1ZXN0KHNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLCAKLQkJCQkJdGFza3MsIGxvdywgaGlnaCk7Ci0JCQl0cnkgewotCQkJCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldEV2ZW50UmVxdWVzdE1hbmFnZXIoKS5hZGRFdmVudFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkJTWFwPEJpdExpc3QsIE9iamVjdD4gbWFwID0gcmVxdWVzdC5nZXRSZXN1bHRNYXAodGFza3MpOwotCQkJCWZvciAoSXRlcmF0b3I8Qml0TGlzdD4gaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJQml0TGlzdCBzVGFza3MgPSBpLm5leHQoKTsKLQkJCQkJT2JqZWN0IHZhbHVlID0gbWFwLmdldChzVGFza3MpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm94eURlYnVnU3RhY2tGcmFtZVtdKSB7Ci0JCQkJCQlQcm94eURlYnVnU3RhY2tGcmFtZVtdIGZyYW1lcyA9IChQcm94eURlYnVnU3RhY2tGcmFtZVtdKXZhbHVlOwotCQkJCQkJZm9yIChQcm94eURlYnVnU3RhY2tGcmFtZSBmcmFtZSA6IGZyYW1lcykgewotCQkJCQkJCVByb3h5RGVidWdMb2NhdG9yIGxvY2F0b3IgPSBmcmFtZS5nZXRMb2NhdG9yKCk7Ci0JCQkJCQkJaWYgKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpID4gMCkgewotCQkJCQkJCQlhZGRVbnJlZ2lzdGVyQW5ub3RhdGlvbihqb2IuZ2V0SUQoKSwgZnJhbWUuZ2V0TGV2ZWwoKSwgbG9jYXRvci5nZXRGaWxlKCksIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBzVGFza3MpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3Rocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFubm90YXRpb25BY3Rpb24oSVBKb2Igam9iLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVBbm5vdGF0aW9uKGpvYi5nZXRJRCgpLCB0YXNrcyk7Ci0JCX0KLQkJY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkgewotCQkJUFRQRGVidWdVSVBsdWdpbi5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVBUUERlYnVnVUlQbHVnaW4uZXJyb3JEaWFsb2coIkVycm9yIiwgZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QQnJlYWtwb2ludFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QQnJlYWtwb2ludFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjllNjYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUEJyZWFrcG9pbnRXb3JrYmVuY2hBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQQnJlYWtwb2ludFdvcmtiZW5jaEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgIT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgfHwgIShhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUEJyZWFrcG9pbnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQkJLy8gZm9yIG5vdwotCQkJCWlmIChvIGluc3RhbmNlb2YgSVBMaW5lQnJlYWtwb2ludCkgewotCQkJCQlyZXR1cm4gUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50V29ya2JlbmNoQWRhcHRlckZhY3RvcnkuMCIpOwotCQkJCX0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQV2F0Y2hwb2ludCkgewotCQkJCQlyZXR1cm4gUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50V29ya2JlbmNoQWRhcHRlckZhY3RvcnkuMSIpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWwobyk7IAotCQkJfQotCQl9OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgfTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUERlYnVnSW1hZ2UuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BEZWJ1Z0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjcyOTEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUERlYnVnSW1hZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUERlYnVnSW1hZ2UgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05QQVRIID0gImljb25zLyI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9PTElDT05QQVRIID0gSUNPTlBBVEggKyAidG9vbC8iOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0NFU1NJQ09OUEFUSCA9IElDT05QQVRIICsgInByb2Nlc3MvIjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUJVR0lDT05QQVRIID0gSUNPTlBBVEggKyAiZGVidWcvIjsKLQkKLQkvKgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVVJMIElDT05VUkwgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShJQ09OUEFUSCk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBVUkwgVE9PTElDT05VUkwgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShUT09MSUNPTlBBVEgpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVVJMIFBST0NFU1NJQ09OVVJMID0gUFRQRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoUFJPQ0VTU0lDT05QQVRIKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFVSTCBERUJVR0lDT05VUkwgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShERUJVR0lDT05QQVRIKTsKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBudWxsOwotICAgICovCi0gICAgCi0gICAgLy9hcnJheSB2aWV3Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BRERfVkFSX05PUk1BTCA9ICJhZGRfdmFyaWFibGVfbm9ybWFsLmdpZiI7Ci0JCi0JLy9leHByZXNzaW9uIHZpZXcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1ZBUl9BRERfTk9STUFMID0gInZhcl9hZGRfbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9WQVJfREVMRVRFX05PUk1BTCA9ICJ2YXJfZGVsZXRlX25vcm1hbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVkFSX0VESVRfTk9STUFMID0gInZhcl9lZGl0X25vcm1hbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVkFSX1JFRlJFU0hfTk9STUFMID0gInZhcl9yZWZyZXNoX25vcm1hbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVkFSX0NPTVBBUkVfTk9STUFMID0gInZhcl9jb21wYXJlX25vcm1hbC5naWYiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SRVNVTUVfRElTQUJMRSA9ICJyZXN1bWVfZGlzYWJsZS5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUkVTVU1FX05PUk1BTCA9ICJyZXN1bWVfbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TVVNQRU5EX0RJU0FCTEUgPSAic3VzcGVuZF9kaXNhYmxlLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TVVNQRU5EX05PUk1BTCA9ICJzdXNwZW5kX25vcm1hbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVEVSTUlOQVRFQUxMX0RJU0FCTEUgPSAidGVybWluYXRlX2FsbF9kaXNhYmxlLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9URVJNSU5BVEVBTExfTk9STUFMID0gInRlcm1pbmF0ZV9hbGxfbm9ybWFsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TVEVQSU5UT19ESVNBQkxFID0gInN0ZXBpbnRvX2Rpc2FibGUuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NURVBJTlRPX05PUk1BTCA9ICJzdGVwaW50b19ub3JtYWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NURVBPVkVSX0RJU0FCTEUgPSAic3RlcG92ZXJfZGlzYWJsZS5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU1RFUE9WRVJfTk9STUFMID0gInN0ZXBvdmVyX25vcm1hbC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU1RFUFJFVFVSTl9ESVNBQkxFID0gInN0ZXByZXR1cm5fZGlzYWJsZS5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU1RFUFJFVFVSTl9OT1JNQUwgPSAic3RlcHJldHVybl9ub3JtYWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JFR0lTVEVSX05PUk1BTCA9ICJyZWdpc3Rlcl9ub3JtYWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1VOUkVHSVNURVJfTk9STUFMID0gInVucmVnaXN0ZXJfbm9ybWFsLmdpZiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST19FUlJPUl9TRUwgPSAiZXJyb3Jfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST19FUlJPUiA9ICJlcnJvci5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9fUlVOTklOR19TRUwgPSAicnVubmluZ19zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPX1JVTk5JTkcgPSAicnVubmluZy5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9fU1RBUlRFRF9TRUwgPSAic3RhcnRlZF9zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPX1NUQVJURUQgPSAic3RhcnRlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9fU1RPUFBFRF9TRUwgPSAic3RvcHBlZF9zZWwuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPX1NUT1BQRUQgPSAic3RvcHBlZC5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QUk9fU1VTUEVOREVEX1NFTCA9ICJzdXNwZW5kZWRfc2VsLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST19TVVNQRU5ERUQgPSAic3VzcGVuZGVkLmdpZiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfUFRQQlBUU0VUID0gInB0cF9icHRfc2V0LmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX0JQVENVUlNFVF9FTiA9ICJicHRfY3Vycl9zZXRfZW5hYmxlLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX0JQVE1VTFRJU0VUX0VOID0gImJwdF9tdWx0aV9zZXRfZW5hYmxlLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX0JQVE5PU0VUX0VOID0gImJwdF9ub19zZXRfZW5hYmxlLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX0JQVENVUlNFVF9ESSA9ICJicHRfY3Vycl9zZXRfZGlzYWJsZS5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19CUFRNVUxUSVNFVF9ESSA9ICJicHRfbXVsdGlfc2V0X2Rpc2FibGUuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfQlBUTk9TRVRfREkgPSAiYnB0X25vX3NldF9kaXNhYmxlLmdpZiI7Ci0JCi0JLy9UT0RPCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WUlNfV0FSTklORyA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19PVlJTX0VSUk9SID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WUlNfQVJHVU1FTlQgPSAibm8uZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfT1ZSU19HTE9CQUwgPSAibm8uZ2lmIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfU0lHTkFMID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1JFR0lTVEVSX0dST1VQX0RJU0FCTEVEID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1JFR0lTVEVSX0dST1VQID0gIm5vLmdpZiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfUkVBRF9XQVRDSFBPSU5UX0VOQUJMRUQgPSAibm8uZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfV1JJVEVfV0FUQ0hQT0lOVF9FTkFCTEVEID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1JFQURfV0FUQ0hQT0lOVF9ESVNBQkxFRCA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19XUklURV9XQVRDSFBPSU5UX0RJU0FCTEVEID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1dBVENIUE9JTlRfRU5BQkxFRCA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19XQVRDSFBPSU5UX0RJU0FCTEVEID0gIm5vLmdpZiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfVkFSSUFCTEVfUE9JTlRFUiA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19WQVJJQUJMRV9QT0lOVEVSX0RJU0FCTEVEID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1ZBUklBQkxFX0FHR1JFR0FURSA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19WQVJJQUJMRV9BR0dSRUdBVEVfRElTQUJMRUQgPSAibm8uZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfVkFSSUFCTEVfU0lNUExFID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1ZBUklBQkxFX1NJTVBMRV9ESVNBQkxFRCA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19SRUdJU1RFUiA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19SRUdJU1RFUl9ESVNBQkxFRCA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19FWEVDVVRBQkxFX1dJVEhfU1lNQk9MUyA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19FWEVDVVRBQkxFID0gIm5vLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX1NIQVJFRF9MSUJSQVJZX1dJVEhfU1lNQk9MUyA9ICJuby5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19TSEFSRURfTElCUkFSWSA9ICJuby5naWYiOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHXyA9ICJuby5naWYiOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHXyA9ICJuby5naWYiOwotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19PVkVSX0JQVF9HTE9CX0VOID0gImdsb2JhbF9vdnIuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfT1ZFUl9CUFRfR0xPQl9ESSA9ICJnbG9iYWxfb3ZyX2Rpc2FibGVkLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WRVJfQlBUX0NPTkRfRU4gPSAiY29uZGl0aW9uYWxfb3ZyLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WRVJfQlBUX0NPTkRfREkgPSAiY29uZGl0aW9uYWxfb3ZyX2Rpc2FibGVkLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WRVJfQlBUX0lOU1RfRU4gPSAiaW5zdGFsbGVkX292ci5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19PVkVSX0JQVF9JTlNUX0RJID0gImluc3RhbGxlZF9vdnJfZGlzYWJsZWQuZ2lmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfREVCVUdfT1ZFUl9CUFRfQUREUl9FTiA9ICJhZGRyZXNzX292ci5naWYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUJVR19PVkVSX0JQVF9BRERSX0RJID0gImFkZHJlc3Nfb3ZyX2Rpc2FibGVkLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WRVJfQlBUX0ZVTkNfRU4gPSAiZnVuY3Rpb25fb3ZyLmdpZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RFQlVHX09WRVJfQlBUX0ZVTkNfREkgPSAiZnVuY3Rpb25fb3ZyX2Rpc2FibGVkLmdpZiI7Ci0JCi0JLyoKLQkvL2FycmF5IHZpZXcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JQ09OX0FERF9WQVJfTk9STUFMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX0FERF9WQVJfTk9STUFMLCBJQ09OX0FERF9WQVJfTk9STUFMKTsKLQotCS8vZXhwcmVzc2lvbiB2aWV3Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9WQVJfQUREX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9WQVJfQUREX05PUk1BTCwgSUNPTl9WQVJfQUREX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9WQVJfREVMRVRFX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9WQVJfREVMRVRFX05PUk1BTCwgSUNPTl9WQVJfREVMRVRFX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9WQVJfRURJVF9OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fVkFSX0VESVRfTk9STUFMLCBJQ09OX1ZBUl9FRElUX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9WQVJfUkVGUkVTSF9OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fVkFSX1JFRlJFU0hfTk9STUFMLCBJQ09OX1ZBUl9SRUZSRVNIX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9WQVJfQ09NUEFSRV9OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fVkFSX0NPTVBBUkVfTk9STUFMLCBJQ09OX1ZBUl9DT01QQVJFX05PUk1BTCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9SRVNVTUVfRElTQUJMRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9SRVNVTUVfRElTQUJMRSwgSUNPTl9SRVNVTUVfRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9SRVNVTUVfTk9STUFMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX1JFU1VNRV9OT1JNQUwsIElDT05fUkVTVU1FX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVVNQRU5EX0RJU0FCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fU1VTUEVORF9ESVNBQkxFLCBJQ09OX1NVU1BFTkRfRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVVNQRU5EX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9TVVNQRU5EX05PUk1BTCwgSUNPTl9TVVNQRU5EX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9URVJNSU5BVEVBTExfRElTQUJMRSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9URVJNSU5BVEVBTExfRElTQUJMRSwgSUNPTl9URVJNSU5BVEVBTExfRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9URVJNSU5BVEVBTExfTk9STUFMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX1RFUk1JTkFURUFMTF9OT1JNQUwsIElDT05fVEVSTUlOQVRFQUxMX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVEVQSU5UT19ESVNBQkxFID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX1NURVBJTlRPX0RJU0FCTEUsIElDT05fU1RFUElOVE9fRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVEVQSU5UT19OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fU1RFUElOVE9fTk9STUFMLCBJQ09OX1NURVBJTlRPX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVEVQT1ZFUl9ESVNBQkxFID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFRPT0xJQ09OVVJMLCBJQ09OX1NURVBPVkVSX0RJU0FCTEUsIElDT05fU1RFUE9WRVJfRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVEVQT1ZFUl9OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fU1RFUE9WRVJfTk9STUFMLCBJQ09OX1NURVBPVkVSX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVEVQUkVUVVJOX0RJU0FCTEUgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fU1RFUFJFVFVSTl9ESVNBQkxFLCBJQ09OX1NURVBSRVRVUk5fRElTQUJMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9TVEVQUkVUVVJOX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9TVEVQUkVUVVJOX05PUk1BTCwgSUNPTl9TVEVQUkVUVVJOX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9SRUdJU1RFUl9OT1JNQUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVE9PTElDT05VUkwsIElDT05fUkVHSVNURVJfTk9STUFMLCBJQ09OX1JFR0lTVEVSX05PUk1BTCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSUNPTl9VTlJFR0lTVEVSX05PUk1BTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihUT09MSUNPTlVSTCwgSUNPTl9VTlJFR0lTVEVSX05PUk1BTCwgSUNPTl9VTlJFR0lTVEVSX05PUk1BTCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX0VSUk9SX1NFTCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST19FUlJPUl9TRUwsIElNR19QUk9fRVJST1JfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX0VSUk9SID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPX0VSUk9SLCBJTUdfUFJPX0VSUk9SKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1JVTk5JTkdfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPX1JVTk5JTkdfU0VMLCBJTUdfUFJPX1JVTk5JTkdfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1JVTk5JTkcgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9fUlVOTklORywgSU1HX1BST19SVU5OSU5HKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1NUQVJURURfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPX1NUQVJURURfU0VMLCBJTUdfUFJPX1NUQVJURURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1NUQVJURUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9fU1RBUlRFRCwgSU1HX1BST19TVEFSVEVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1NUT1BQRURfU0VMID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFBST0NFU1NJQ09OVVJMLCBJTUdfUFJPX1NUT1BQRURfU0VMLCBJTUdfUFJPX1NUT1BQRURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1NUT1BQRUQgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9fU1RPUFBFRCwgSU1HX1BST19TVE9QUEVEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1NVU1BFTkRFRF9TRUwgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoUFJPQ0VTU0lDT05VUkwsIElNR19QUk9fU1VTUEVOREVEX1NFTCwgSU1HX1BST19TVVNQRU5ERURfU0VMKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfUFJPX1NVU1BFTkRFRCA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihQUk9DRVNTSUNPTlVSTCwgSU1HX1BST19TVVNQRU5ERUQsIElNR19QUk9fU1VTUEVOREVEKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfUFRQQlBUU0VUID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKERFQlVHSUNPTlVSTCwgSU1HX0RFQlVHX1BUUEJQVFNFVCwgSU1HX0RFQlVHX1BUUEJQVFNFVCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX0JQVENVUlNFVF9FTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19CUFRDVVJTRVRfRU4sIElNR19ERUJVR19CUFRDVVJTRVRfRU4pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19CUFRNVUxUSVNFVF9FTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19CUFRNVUxUSVNFVF9FTiwgSU1HX0RFQlVHX0JQVE1VTFRJU0VUX0VOKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfQlBUTk9TRVRfRU4gPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoREVCVUdJQ09OVVJMLCBJTUdfREVCVUdfQlBUTk9TRVRfRU4sIElNR19ERUJVR19CUFROT1NFVF9FTik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX0JQVENVUlNFVF9ESSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19CUFRDVVJTRVRfREksIElNR19ERUJVR19CUFRDVVJTRVRfREkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19CUFRNVUxUSVNFVF9ESSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19CUFRNVUxUSVNFVF9ESSwgSU1HX0RFQlVHX0JQVE1VTFRJU0VUX0RJKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfQlBUTk9TRVRfREkgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoREVCVUdJQ09OVVJMLCBJTUdfREVCVUdfQlBUTk9TRVRfREksIElNR19ERUJVR19CUFROT1NFVF9ESSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfT1ZFUl9CUFRfR0xPQl9FTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19PVkVSX0JQVF9HTE9CX0VOLCBJTUdfREVCVUdfT1ZFUl9CUFRfR0xPQl9FTik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX09WRVJfQlBUX0dMT0JfREkgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoREVCVUdJQ09OVVJMLCBJTUdfREVCVUdfT1ZFUl9CUFRfR0xPQl9ESSwgSU1HX0RFQlVHX09WRVJfQlBUX0dMT0JfREkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19PVkVSX0JQVF9DT05EX0VOID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKERFQlVHSUNPTlVSTCwgSU1HX0RFQlVHX09WRVJfQlBUX0NPTkRfRU4sIElNR19ERUJVR19PVkVSX0JQVF9DT05EX0VOKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfT1ZFUl9CUFRfQ09ORF9ESSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19PVkVSX0JQVF9DT05EX0RJLCBJTUdfREVCVUdfT1ZFUl9CUFRfQ09ORF9ESSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX09WRVJfQlBUX0lOU1RfRU4gPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoREVCVUdJQ09OVVJMLCBJTUdfREVCVUdfT1ZFUl9CUFRfSU5TVF9FTiwgSU1HX0RFQlVHX09WRVJfQlBUX0lOU1RfRU4pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19PVkVSX0JQVF9JTlNUX0RJID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKERFQlVHSUNPTlVSTCwgSU1HX0RFQlVHX09WRVJfQlBUX0lOU1RfREksIElNR19ERUJVR19PVkVSX0JQVF9JTlNUX0RJKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfT1ZFUl9CUFRfQUREUl9FTiA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19PVkVSX0JQVF9BRERSX0VOLCBJTUdfREVCVUdfT1ZFUl9CUFRfQUREUl9FTik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSURfSU1HX0RFQlVHX09WRVJfQlBUX0FERFJfREkgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IoREVCVUdJQ09OVVJMLCBJTUdfREVCVUdfT1ZFUl9CUFRfQUREUl9ESSwgSU1HX0RFQlVHX09WRVJfQlBUX0FERFJfREkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElEX0lNR19ERUJVR19PVkVSX0JQVF9GVU5DX0VOID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKERFQlVHSUNPTlVSTCwgSU1HX0RFQlVHX09WRVJfQlBUX0ZVTkNfRU4sIElNR19ERUJVR19PVkVSX0JQVF9GVU5DX0VOKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJRF9JTUdfREVCVUdfT1ZFUl9CUFRfRlVOQ19ESSA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihERUJVR0lDT05VUkwsIElNR19ERUJVR19PVkVSX0JQVF9GVU5DX0RJLCBJTUdfREVCVUdfT1ZFUl9CUFRfRlVOQ19ESSk7Ci0JKi8KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeShJbWFnZVJlZ2lzdHJ5IHJlZykgewotCQlCdW5kbGUgYnVuZGxlID0gUFRQRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0KLQkJLy9hcnJheSB2aWV3Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9BRERfVkFSX05PUk1BTCk7Ci0JCQotCQkvL2V4cHJlc3Npb24gdmlldwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBUT09MSUNPTlBBVEgsIElDT05fVkFSX0FERF9OT1JNQUwpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBUT09MSUNPTlBBVEgsIElDT05fVkFSX0RFTEVURV9OT1JNQUwpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBUT09MSUNPTlBBVEgsIElDT05fVkFSX0VESVRfTk9STUFMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgVE9PTElDT05QQVRILCBJQ09OX1ZBUl9SRUZSRVNIX05PUk1BTCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9WQVJfQ09NUEFSRV9OT1JNQUwpOwotCi0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9SRVNVTUVfRElTQUJMRSk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9SRVNVTUVfTk9STUFMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgVE9PTElDT05QQVRILCBJQ09OX1NVU1BFTkRfRElTQUJMRSk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9TVVNQRU5EX05PUk1BTCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9URVJNSU5BVEVBTExfRElTQUJMRSk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9URVJNSU5BVEVBTExfTk9STUFMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgVE9PTElDT05QQVRILCBJQ09OX1NURVBJTlRPX0RJU0FCTEUpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBUT09MSUNPTlBBVEgsIElDT05fU1RFUElOVE9fTk9STUFMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgVE9PTElDT05QQVRILCBJQ09OX1NURVBPVkVSX0RJU0FCTEUpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBUT09MSUNPTlBBVEgsIElDT05fU1RFUE9WRVJfTk9STUFMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgVE9PTElDT05QQVRILCBJQ09OX1NURVBSRVRVUk5fRElTQUJMRSk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9TVEVQUkVUVVJOX05PUk1BTCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFRPT0xJQ09OUEFUSCwgSUNPTl9SRUdJU1RFUl9OT1JNQUwpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBUT09MSUNPTlBBVEgsIElDT05fVU5SRUdJU1RFUl9OT1JNQUwpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgUFJPQ0VTU0lDT05QQVRILCBJTUdfUFJPX0VSUk9SX1NFTCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFBST0NFU1NJQ09OUEFUSCwgSU1HX1BST19FUlJPUik7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFBST0NFU1NJQ09OUEFUSCwgSU1HX1BST19SVU5OSU5HX1NFTCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFBST0NFU1NJQ09OUEFUSCwgSU1HX1BST19SVU5OSU5HKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgUFJPQ0VTU0lDT05QQVRILCBJTUdfUFJPX1NUQVJURURfU0VMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgUFJPQ0VTU0lDT05QQVRILCBJTUdfUFJPX1NUQVJURUQpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBQUk9DRVNTSUNPTlBBVEgsIElNR19QUk9fU1RPUFBFRF9TRUwpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBQUk9DRVNTSUNPTlBBVEgsIElNR19QUk9fU1RPUFBFRCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIFBST0NFU1NJQ09OUEFUSCwgSU1HX1BST19TVVNQRU5ERURfU0VMKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgUFJPQ0VTU0lDT05QQVRILCBJTUdfUFJPX1NVU1BFTkRFRCk7Ci0KLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgREVCVUdJQ09OUEFUSCwgSU1HX0RFQlVHX1BUUEJQVFNFVCk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIERFQlVHSUNPTlBBVEgsIElNR19ERUJVR19CUFRDVVJTRVRfRU4pOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfQlBUTVVMVElTRVRfRU4pOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfQlBUTk9TRVRfRU4pOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfQlBUQ1VSU0VUX0RJKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgREVCVUdJQ09OUEFUSCwgSU1HX0RFQlVHX0JQVE1VTFRJU0VUX0RJKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgREVCVUdJQ09OUEFUSCwgSU1HX0RFQlVHX0JQVE5PU0VUX0RJKTsKLQotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfT1ZFUl9CUFRfR0xPQl9FTik7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIERFQlVHSUNPTlBBVEgsIElNR19ERUJVR19PVkVSX0JQVF9HTE9CX0RJKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgREVCVUdJQ09OUEFUSCwgSU1HX0RFQlVHX09WRVJfQlBUX0NPTkRfRU4pOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfT1ZFUl9CUFRfQ09ORF9ESSk7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIERFQlVHSUNPTlBBVEgsIElNR19ERUJVR19PVkVSX0JQVF9JTlNUX0VOKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgREVCVUdJQ09OUEFUSCwgSU1HX0RFQlVHX09WRVJfQlBUX0lOU1RfREkpOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfT1ZFUl9CUFRfQUREUl9FTik7Ci0JCXJlZ2lzdGVySW1hZ2UoYnVuZGxlLCByZWcsIERFQlVHSUNPTlBBVEgsIElNR19ERUJVR19PVkVSX0JQVF9BRERSX0RJKTsKLQkJcmVnaXN0ZXJJbWFnZShidW5kbGUsIHJlZywgREVCVUdJQ09OUEFUSCwgSU1HX0RFQlVHX09WRVJfQlBUX0ZVTkNfRU4pOwotCQlyZWdpc3RlckltYWdlKGJ1bmRsZSwgcmVnLCBERUJVR0lDT05QQVRILCBJTUdfREVCVUdfT1ZFUl9CUFRfRlVOQ19ESSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJJbWFnZShCdW5kbGUgYnVuZGxlLCBJbWFnZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgYmFzZVBhdGgsIFN0cmluZyBmaWxlKSB7Ci0JCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoYmFzZVBhdGggKyBmaWxlKSwgbnVsbCk7Ci0JCWlmICh1cmwhPW51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJCWlmIChkZXNjID09IG51bGwpCi0JCQkJZGVzYyA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlyZWdpc3RyeS5wdXQoZmlsZSwgZGVzYyk7Ci0JCX0KLQl9Ci0JLyoqIEdldCBpbWFnZQotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCS8qKiBHZXQgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJUFRQRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmRpc3Bvc2UoKTsKLQl9Ci0JLyoKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSW1hZ2UoU3RyaW5nIGtleSwgSW1hZ2UgaW1hZ2UpIHsKLQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCX0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoVVJMIGljb25VUkwsIFN0cmluZyBrZXksIFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2V0SWNvblVSTChpY29uVVJMLCBuYW1lKSk7Ci0JCQlhZGRJbWFnZURlc2NyaXB0b3Ioa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIFVSTCBnZXRJY29uVVJMKFVSTCBpY29uVVJMLCBTdHJpbmcgbmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCWlmIChpY29uVVJMID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCk7Ci0JCQkKLQkJcmV0dXJuIG5ldyBVUkwoaWNvblVSTCwgbmFtZSk7Ci0JfQotCSovCQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUERlYnVnTW9kZWxQcmVzZW50YXRpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTYyZWYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUERlYnVnTW9kZWxQcmVzZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURpc2Nvbm5lY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3Rlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklXYXRjaEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdVSVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z0VkaXRvclByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JVmFsdWVEZXRhaWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklFbmFibGVEaXNhYmxlVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQQWRkcmVzc0JyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdFbGVtZW50U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEdW1teVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBGdW5jdGlvbkJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBHbG9iYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUExpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBXYXRjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLlBEZWJ1Z0VsZW1lbnRTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESUJyZWFrcG9pbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJRXhpdEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElTaGFyZWRMaWJyYXJ5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkuZXZlbnQuSVBESVNpZ25hbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLmV2ZW50LklQRElXYXRjaHBvaW50U2NvcGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5ldmVudC5JUERJV2F0Y2hwb2ludFRyaWdnZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlUG9pbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRlR5cGVTdHJ1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLmNvcmUuc291cmNlbG9va3VwLlBTb3VyY2VOb3RGb3VuZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLCBJRGVidWdFZGl0b3JQcmVzZW50YXRpb24gewotCXByaXZhdGUgc3RhdGljIFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uIGluc3RhbmNlID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVNQTEFZX0ZVTExfUEFUSFMgPSAiRElTUExBWV9GVUxMX1BBVEhTIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfU1RBQ0tGUkFNRV9MQUJFTCA9ICIuLi4iOwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMyk7Ci0JcHJpdmF0ZSBPdmVybGF5SW1hZ2VDYWNoZSBpbWFnZUNhY2hlID0gbmV3IE92ZXJsYXlJbWFnZUNhY2hlKCk7Ci0JcHJvdGVjdGVkIFVJRGVidWdNYW5hZ2VyIHVpRGVidWdNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCkgewotCQkvLyBtYWtlIHN1cmUgdXNpbmcgdGhlIG9uZSBjcmVhdGVkIGJ5IHN0YXJ0IHVwCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQlwdWJsaWMgc3RhdGljIFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uIGdldERlZmF1bHQoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUERlYnVnTW9kZWxQcmVzZW50YXRpb24oKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEdldCBVSURlYnVnTWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVJRGVidWdNYW5hZ2VyIGdldFVJRGVidWdNYW5hZ2VyKCkgewotCQlpZiAodWlEZWJ1Z01hbmFnZXIgPT0gbnVsbCkgewotCQkJdWlEZWJ1Z01hbmFnZXIgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVJRGVidWdNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHVpRGVidWdNYW5hZ2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb24jc2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0QXR0cmlidXRlcygpLnB1dChhdHRyaWJ1dGUsIHZhbHVlKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdNb2RlbFByZXNlbnRhdGlvbiNjb21wdXRlRGV0YWlsKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlLCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JVmFsdWVEZXRhaWxMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlRGV0YWlsKElWYWx1ZSB2YWx1ZSwgSVZhbHVlRGV0YWlsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJUFZhbHVlRGV0YWlsUHJvdmlkZXIuZ2V0RGVmYXVsdCgpLmNvbXB1dGVEZXRhaWwodmFsdWUsIGxpc3RlbmVyKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JU291cmNlUHJlc2VudGF0aW9uI2dldEVkaXRvcklucHV0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gUERlYnVnVUlVdGlscy5nZXRFZGl0b3JJbnB1dChlbGVtZW50KTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JU291cmNlUHJlc2VudGF0aW9uI2dldEVkaXRvcklkKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRvcklkKElFZGl0b3JJbnB1dCBpbnB1dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIFBEZWJ1Z1VJVXRpbHMuZ2V0RWRpdG9ySWQoaW5wdXQsIGVsZW1lbnQpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgYmFzZUltYWdlID0gZ2V0QmFzZUltYWdlKGVsZW1lbnQpOwotCQlpZiAoYmFzZUltYWdlICE9IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzID0gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCB9OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUERlYnVnRWxlbWVudFN0YXR1cyAmJiAhKChJUERlYnVnRWxlbWVudFN0YXR1cyllbGVtZW50KS5pc09LKCkpIHsKLQkJCQlzd2l0Y2goKChJUERlYnVnRWxlbWVudFN0YXR1cyllbGVtZW50KS5nZXRTZXZlcml0eSgpKSB7IAotCQkJCQljYXNlIElQRGVidWdFbGVtZW50U3RhdHVzLldBUk5JTkc6IAotCQkJCQkJb3ZlcmxheXNbT3ZlcmxheUltYWdlRGVzY3JpcHRvci5CT1RUT01fTEVGVF0gPSBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19PVlJTX1dBUk5JTkcpOyAKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElQRGVidWdFbGVtZW50U3RhdHVzLkVSUk9SOiAKLQkJCQkJCW92ZXJsYXlzW092ZXJsYXlJbWFnZURlc2NyaXB0b3IuQk9UVE9NX0xFRlRdID0gUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JTUdfREVCVUdfT1ZSU19FUlJPUik7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXYXRjaEV4cHJlc3Npb24gJiYgKChJV2F0Y2hFeHByZXNzaW9uKWVsZW1lbnQpLmhhc0Vycm9ycygpKQotCQkJCW92ZXJsYXlzW092ZXJsYXlJbWFnZURlc2NyaXB0b3IuQk9UVE9NX0xFRlRdID0gUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JTUdfREVCVUdfT1ZSU19FUlJPUik7IAotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFZhcmlhYmxlICYmICgoSVBWYXJpYWJsZSllbGVtZW50KS5pc0FyZ3VtZW50KCkpIAotCQkJCW92ZXJsYXlzW092ZXJsYXlJbWFnZURlc2NyaXB0b3IuVE9QX1JJR0hUXSA9IFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX09WUlNfQVJHVU1FTlQpOyAKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBHbG9iYWxWYXJpYWJsZSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVnaXN0ZXIpKSAKLQkJCQlvdmVybGF5c1tPdmVybGF5SW1hZ2VEZXNjcmlwdG9yLlRPUF9SSUdIVF0gPSBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19PVlJTX0dMT0JBTCk7Ci0KLQkJCXJldHVybiBnZXRJbWFnZUNhY2hlKCkuZ2V0SW1hZ2VGb3IobmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IoYmFzZUltYWdlLCBvdmVybGF5cykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCBiYXNlIGltYWdlCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRCYXNlSW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUERlYnVnVGFyZ2V0KSB7Ci0JCQlJUERlYnVnVGFyZ2V0IHRhcmdldCA9IChJUERlYnVnVGFyZ2V0KWVsZW1lbnQ7Ci0JCQlpZiAodGFyZ2V0LmlzUG9zdE1vcnRlbSgpKSB7Ci0JCQkJcmV0dXJuIERlYnVnVUlUb29scy5nZXRJbWFnZShJRGVidWdVSUNvbnN0YW50cy5JTUdfT0JKU19ERUJVR19UQVJHRVRfVEVSTUlOQVRFRCk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0LmlzVGVybWluYXRlZCgpIHx8IHRhcmdldC5pc0Rpc2Nvbm5lY3RlZCgpKSB7Ci0JCQkJcmV0dXJuIERlYnVnVUlUb29scy5nZXRJbWFnZShJRGVidWdVSUNvbnN0YW50cy5JTUdfT0JKU19ERUJVR19UQVJHRVRfVEVSTUlOQVRFRCk7Ci0JCQl9Ci0JCQlyZXR1cm4gRGVidWdVSVRvb2xzLmdldEltYWdlKElEZWJ1Z1VJQ29uc3RhbnRzLklNR19PQkpTX0RFQlVHX1RBUkdFVCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFRocmVhZCkgewotCQkJSVBUaHJlYWQgdGhyZWFkID0gKElQVGhyZWFkKWVsZW1lbnQ7Ci0JCQlJUERlYnVnVGFyZ2V0IHRhcmdldCA9IChJUERlYnVnVGFyZ2V0KXRocmVhZC5nZXREZWJ1Z1RhcmdldCgpOwotCQkJaWYgKHRhcmdldC5pc1Bvc3RNb3J0ZW0oKSkgewotCQkJCXJldHVybiBEZWJ1Z1VJVG9vbHMuZ2V0SW1hZ2UoSURlYnVnVUlDb25zdGFudHMuSU1HX09CSlNfVEhSRUFEX1RFUk1JTkFURUQpOwotCQkJfQotCQkJaWYgKHRocmVhZC5pc1N1c3BlbmRlZCgpKSB7Ci0JCQkJcmV0dXJuIERlYnVnVUlUb29scy5nZXRJbWFnZShJRGVidWdVSUNvbnN0YW50cy5JTUdfT0JKU19USFJFQURfU1VTUEVOREVEKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRocmVhZC5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJCXJldHVybiBEZWJ1Z1VJVG9vbHMuZ2V0SW1hZ2UoSURlYnVnVUlDb25zdGFudHMuSU1HX09CSlNfVEhSRUFEX1RFUk1JTkFURUQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIERlYnVnVUlUb29scy5nZXRJbWFnZShJRGVidWdVSUNvbnN0YW50cy5JTUdfT0JKU19USFJFQURfUlVOTklORyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQlJQnJlYWtwb2ludCBicCA9IGdldEJyZWFrcG9pbnQoKElNYXJrZXIpIGVsZW1lbnQpOwotCQkJaWYgKGJwICE9IG51bGwgJiYgYnAgaW5zdGFuY2VvZiBJUEJyZWFrcG9pbnQpIHsKLQkJCQlyZXR1cm4gZ2V0QnJlYWtwb2ludEltYWdlKChJUEJyZWFrcG9pbnQpIGJwKTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQQnJlYWtwb2ludCkgewotCQkJcmV0dXJuIGdldEJyZWFrcG9pbnRJbWFnZSgoSVBCcmVha3BvaW50KSBlbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZWdpc3Rlckdyb3VwKSB7Ci0JCQlyZXR1cm4gZ2V0UmVnaXN0ZXJHcm91cEltYWdlKChJUmVnaXN0ZXJHcm91cCllbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFeHByZXNzaW9uKSB7Ci0JCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbkltYWdlKChJRXhwcmVzc2lvbillbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZWdpc3RlcikgewotCQkJcmV0dXJuIGdldFJlZ2lzdGVySW1hZ2UoKElSZWdpc3RlcillbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWYXJpYWJsZSkgewotCQkJcmV0dXJuIGdldFZhcmlhYmxlSW1hZ2UoKElWYXJpYWJsZSllbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQTW9kdWxlKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kdWxlSW1hZ2UoKElQTW9kdWxlKWVsZW1lbnQpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBTaWduYWwpIHsgCi0JCQlyZXR1cm4gZ2V0U2lnbmFsSW1hZ2UoKElQU2lnbmFsKWVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0JcHJvdGVjdGVkIEltYWdlIGdldFNpZ25hbEltYWdlKElQU2lnbmFsIHNpZ25hbCkgewotCQlyZXR1cm4gUERlYnVnSW1hZ2UuZ2V0SW1hZ2UoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1NJR05BTCk7Ci0JfQotCXByb3RlY3RlZCBJbWFnZSBnZXRSZWdpc3Rlckdyb3VwSW1hZ2UoSVJlZ2lzdGVyR3JvdXAgZWxlbWVudCkgewotCQlJRW5hYmxlRGlzYWJsZVRhcmdldCB0YXJnZXQgPSAoSUVuYWJsZURpc2FibGVUYXJnZXQpZWxlbWVudC5nZXRBZGFwdGVyKElFbmFibGVEaXNhYmxlVGFyZ2V0LmNsYXNzKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmICF0YXJnZXQuaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gUERlYnVnSW1hZ2UuZ2V0SW1hZ2UoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1JFR0lTVEVSX0dST1VQX0RJU0FCTEVEKTsKLQkJcmV0dXJuIFBEZWJ1Z0ltYWdlLmdldEltYWdlKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19SRUdJU1RFUl9HUk9VUCk7Ci0JfQotCXByb3RlY3RlZCBJbWFnZSBnZXRCcmVha3BvaW50SW1hZ2UoSVBCcmVha3BvaW50IGJyZWFrcG9pbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSVBMaW5lQnJlYWtwb2ludCkKLQkJCQlyZXR1cm4gZ2V0TGluZUJyZWFrcG9pbnRJbWFnZSgoSVBMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludCk7Ci0JCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQV2F0Y2hwb2ludCkgewotCQkJCXJldHVybiBnZXRXYXRjaHBvaW50SW1hZ2UoKElQV2F0Y2hwb2ludClicmVha3BvaW50KTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIEltYWdlIGdldExpbmVCcmVha3BvaW50SW1hZ2UoSVBMaW5lQnJlYWtwb2ludCBicmVha3BvaW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBqb2JfaWQgPSBicmVha3BvaW50LmdldEpvYklkKCk7Ci0JCVN0cmluZyBjdXJfam9iX2lkID0gZ2V0VUlEZWJ1Z01hbmFnZXIoKS5nZXRDdXJyZW50Sm9iSWQoKTsKLQkJLy8gRGlzcGxheSBub3RoaW5nIGlmIHRoZSBicmVha3BvaW50IGlzIG5vdCBpbiBjdXJyZW50IGpvYgotCQlpZiAoIWpvYl9pZC5lcXVhbHMoSVBCcmVha3BvaW50LkdMT0JBTCkgJiYgIWpvYl9pZC5lcXVhbHMoY3VyX2pvYl9pZCkpCi0JCQlyZXR1cm4gbmV3IEltYWdlKG51bGwsIDEsIDEpOwotCQlTdHJpbmcgZGVzY3JpcHRvciA9IG51bGw7Ci0JCUlFbGVtZW50SGFuZGxlciBzZXRNYW5hZ2VyID0gZ2V0VUlEZWJ1Z01hbmFnZXIoKS5nZXRFbGVtZW50SGFuZGxlcihqb2JfaWQpOwotCQlpZiAoc2V0TWFuYWdlciA9PSBudWxsKSAvLyBubyBqb2IgcnVubmluZwotCQkJZGVzY3JpcHRvciA9IGJyZWFrcG9pbnQuaXNFbmFibGVkKCkgPyBQRGVidWdJbWFnZS5JTUdfREVCVUdfQlBUQ1VSU0VUX0VOIDogUERlYnVnSW1hZ2UuSU1HX0RFQlVHX0JQVENVUlNFVF9ESTsKLQkJZWxzZSB7IC8vIGNyZWF0ZWQgam9iCi0JCQlTdHJpbmcgY3VyX3NldF9pZCA9IGdldFVJRGVidWdNYW5hZ2VyKCkuZ2V0Q3VycmVudFNldElkKCk7Ci0JCQlTdHJpbmcgYnB0X3NldF9pZCA9IGJyZWFrcG9pbnQuZ2V0U2V0SWQoKTsKLQkJCWlmIChicHRfc2V0X2lkLmVxdWFscyhjdXJfc2V0X2lkKSkgewotCQkJCWRlc2NyaXB0b3IgPSBicmVha3BvaW50LmlzRW5hYmxlZCgpID8gUERlYnVnSW1hZ2UuSU1HX0RFQlVHX0JQVENVUlNFVF9FTiA6IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19CUFRDVVJTRVRfREk7Ci0JCQl9IGVsc2UgewotCQkJCUlFbGVtZW50U2V0IHNldCA9IChJRWxlbWVudFNldClzZXRNYW5hZ2VyLmdldEVsZW1lbnRCeUlEKGJwdF9zZXRfaWQpOwotCQkJCWlmIChzZXQgPT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRvciA9IGJyZWFrcG9pbnQuaXNFbmFibGVkKCkgPyBQRGVidWdJbWFnZS5JTUdfREVCVUdfQlBUQ1VSU0VUX0VOIDogUERlYnVnSW1hZ2UuSU1HX0RFQlVHX0JQVENVUlNFVF9ESTsKLQkJCQllbHNlIHsKLQkJCQkJaWYgKHNldC5jb250YWluc01hdGNoU2V0KGN1cl9zZXRfaWQpKQotCQkJCQkJZGVzY3JpcHRvciA9IGJyZWFrcG9pbnQuaXNFbmFibGVkKCkgPyBQRGVidWdJbWFnZS5JTUdfREVCVUdfQlBUTVVMVElTRVRfRU4gOiBQRGVidWdJbWFnZS5JTUdfREVCVUdfQlBUTVVMVElTRVRfREk7Ci0JCQkJCWVsc2UKLQkJCQkJCWRlc2NyaXB0b3IgPSBicmVha3BvaW50LmlzRW5hYmxlZCgpID8gUERlYnVnSW1hZ2UuSU1HX0RFQlVHX0JQVE5PU0VUX0VOIDogUERlYnVnSW1hZ2UuSU1HX0RFQlVHX0JQVE5PU0VUX0RJOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2VDYWNoZSgpLmdldEltYWdlRm9yKG5ldyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldEltYWdlKGRlc2NyaXB0b3IpLCBjb21wdXRlQnJlYWtwb2ludE92ZXJsYXlzKGJyZWFrcG9pbnQpKSk7Ci0JfQotCXByb3RlY3RlZCBJbWFnZSBnZXRXYXRjaHBvaW50SW1hZ2UoSVBXYXRjaHBvaW50IHdhdGNocG9pbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGRlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAod2F0Y2hwb2ludC5pc0VuYWJsZWQoKSkgewotCQkJaWYgKHdhdGNocG9pbnQuaXNSZWFkVHlwZSgpICYmICF3YXRjaHBvaW50LmlzV3JpdGVUeXBlKCkpCi0JCQkJZGVzY3JpcHRvciA9IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19SRUFEX1dBVENIUE9JTlRfRU5BQkxFRDsKLQkJCWVsc2UgaWYgKCF3YXRjaHBvaW50LmlzUmVhZFR5cGUoKSAmJiB3YXRjaHBvaW50LmlzV3JpdGVUeXBlKCkpCi0JCQkJZGVzY3JpcHRvciA9IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19XUklURV9XQVRDSFBPSU5UX0VOQUJMRUQ7Ci0JCQllbHNlCi0JCQkJZGVzY3JpcHRvciA9IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19XQVRDSFBPSU5UX0VOQUJMRUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAod2F0Y2hwb2ludC5pc1JlYWRUeXBlKCkgJiYgIXdhdGNocG9pbnQuaXNXcml0ZVR5cGUoKSkKLQkJCQlkZXNjcmlwdG9yID0gUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1JFQURfV0FUQ0hQT0lOVF9ESVNBQkxFRDsKLQkJCWVsc2UgaWYgKCF3YXRjaHBvaW50LmlzUmVhZFR5cGUoKSAmJiB3YXRjaHBvaW50LmlzV3JpdGVUeXBlKCkpCi0JCQkJZGVzY3JpcHRvciA9IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19XUklURV9XQVRDSFBPSU5UX0RJU0FCTEVEOwotCQkJZWxzZQotCQkJCWRlc2NyaXB0b3IgPSBQRGVidWdJbWFnZS5JTUdfREVCVUdfV0FUQ0hQT0lOVF9ESVNBQkxFRDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2VDYWNoZSgpLmdldEltYWdlRm9yKG5ldyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldEltYWdlKGRlc2NyaXB0b3IpLCBjb21wdXRlQnJlYWtwb2ludE92ZXJsYXlzKHdhdGNocG9pbnQpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGJ0ID0gZ2V0QmFzZVRleHQoZWxlbWVudCk7Ci0JCWlmIChidCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBiYXNlVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoYnQpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQRGVidWdFbGVtZW50U3RhdHVzICYmICEoKElQRGVidWdFbGVtZW50U3RhdHVzKSBlbGVtZW50KS5pc09LKCkpIHsKLQkJCWJhc2VUZXh0LmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdCgiIDx7MH0+IiwgbmV3IE9iamVjdFtdIHsgKChJUERlYnVnRWxlbWVudFN0YXR1cyllbGVtZW50KS5nZXRNZXNzYWdlKCkgfSkpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSUVuYWJsZURpc2FibGVUYXJnZXQgdGFyZ2V0ID0gKElFbmFibGVEaXNhYmxlVGFyZ2V0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSUVuYWJsZURpc2FibGVUYXJnZXQuY2xhc3MpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJaWYgKCF0YXJnZXQuaXNFbmFibGVkKCkpIHsKLQkJCQkJYmFzZVRleHQuYXBwZW5kKCcgJyk7Ci0JCQkJCWJhc2VUZXh0LmFwcGVuZChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5kaXNhYmxlZDEiKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlVGV4dC50b1N0cmluZygpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlVGV4dChPYmplY3QgZWxlbWVudCkgewotCQlib29sZWFuIHNob3dRdWFsaWZpZWQgPSBpc1Nob3dRdWFsaWZpZWROYW1lcygpOwotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQTW9kdWxlKSB7IAotCQkJCWxhYmVsLmFwcGVuZChnZXRNb2R1bGVUZXh0KChJUE1vZHVsZSllbGVtZW50LCBzaG93UXVhbGlmaWVkKSk7IAotCQkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFNpZ25hbCkgewotCQkJCWxhYmVsLmFwcGVuZChnZXRTaWduYWxUZXh0KChJUFNpZ25hbCkgZWxlbWVudCkpOwotCQkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVnaXN0ZXJHcm91cCkgeyAKLQkJCQlsYWJlbC5hcHBlbmQoKChJUmVnaXN0ZXJHcm91cCllbGVtZW50KS5nZXROYW1lKCkpOwotCQkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2F0Y2hFeHByZXNzaW9uKSB7Ci0JCQkJcmV0dXJuIGdldFdhdGNoRXhwcmVzc2lvblRleHQoKElXYXRjaEV4cHJlc3Npb24pIGVsZW1lbnQpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmFyaWFibGUpIHsKLQkJCQlsYWJlbC5hcHBlbmQoZ2V0VmFyaWFibGVUZXh0KChJVmFyaWFibGUpIGVsZW1lbnQpKTsKLQkJCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZhbHVlKSB7Ci0JCQkJbGFiZWwuYXBwZW5kKGdldFZhbHVlVGV4dCgoSVZhbHVlKSBlbGVtZW50KSk7Ci0JCQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdGFja0ZyYW1lKSB7Ci0JCQkJbGFiZWwuYXBwZW5kKGdldFN0YWNrRnJhbWVUZXh0KChJU3RhY2tGcmFtZSkgZWxlbWVudCwgc2hvd1F1YWxpZmllZCkpOwotCQkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQU291cmNlTm90Rm91bmRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldEJhc2VUZXh0KCgoUFNvdXJjZU5vdEZvdW5kRWxlbWVudCllbGVtZW50KS5nZXRFbGVtZW50KCkpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJSUJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IGdldEJyZWFrcG9pbnQoKElNYXJrZXIpIGVsZW1lbnQpOwotCQkJCWlmIChicmVha3BvaW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGdldEJyZWFrcG9pbnRUZXh0KGJyZWFrcG9pbnQsIHNob3dRdWFsaWZpZWQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUJyZWFrcG9pbnQpIHsKLQkJCQlyZXR1cm4gZ2V0QnJlYWtwb2ludFRleHQoKElCcmVha3BvaW50KSBlbGVtZW50LCBzaG93UXVhbGlmaWVkKTsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURlYnVnVGFyZ2V0KQotCQkJCWxhYmVsLmFwcGVuZChnZXRUYXJnZXRUZXh0KChJRGVidWdUYXJnZXQpIGVsZW1lbnQsIHNob3dRdWFsaWZpZWQpKTsKLQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVGhyZWFkKQotCQkJCWxhYmVsLmFwcGVuZChnZXRUaHJlYWRUZXh0KChJVGhyZWFkKSBlbGVtZW50LCBzaG93UXVhbGlmaWVkKSk7Ci0JCQlpZiAobGFiZWwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUZXJtaW5hdGUpIHsKLQkJCQlpZiAoKChJVGVybWluYXRlKSBlbGVtZW50KS5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJCQlsYWJlbC5pbnNlcnQoMCwgUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGVybWluYXRlZDEiKSk7Ci0JCQkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURpc2Nvbm5lY3QpIHsKLQkJCQlpZiAoKChJRGlzY29ubmVjdCkgZWxlbWVudCkuaXNEaXNjb25uZWN0ZWQoKSkgewotCQkJCQlsYWJlbC5pbnNlcnQoMCwgUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uZGlzY29ubmVjdGVkMSIpKTsKLQkJCQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxhYmVsLmxlbmd0aCgpID4gMCkgewotCQkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCQkJfQotCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uMiIpLCBuZXcgT2JqZWN0W10geyBlLmdldE1lc3NhZ2UoKSB9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVUZXh0KElQTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBxdWFsaWZpZWQpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJUGF0aCBwYXRoID0gbW9kdWxlLmdldEltYWdlTmFtZSgpOwotCQlpZiAoIXBhdGguaXNFbXB0eSgpKSB7Ci0JCQlzYi5hcHBlbmQocGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNiLmFwcGVuZChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi51bmtub3duXzEiKSk7CQkKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWdpc3Rlckdyb3VwVGV4dChJUmVnaXN0ZXJHcm91cCBncm91cCkgewotCQlTdHJpbmcgbmFtZSA9IFBEZWJ1Z1VJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLm5vdF9hdmFpbGFibGVfMSIpOwotCQl0cnkgewotCQkJbmFtZSA9IGdyb3VwLmdldE5hbWUoKTsKLQkJfQotCQljYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z1VJUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93UXVhbGlmaWVkTmFtZXMoKSB7Ci0JCUJvb2xlYW4gc2hvd1F1YWxpZmllZCA9IChCb29sZWFuKSBnZXRBdHRyaWJ1dGVzKCkuZ2V0KERJU1BMQVlfRlVMTF9QQVRIUyk7Ci0JCXNob3dRdWFsaWZpZWQgPSAoc2hvd1F1YWxpZmllZCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOiBzaG93UXVhbGlmaWVkOwotCQlyZXR1cm4gc2hvd1F1YWxpZmllZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQlwcml2YXRlIE92ZXJsYXlJbWFnZUNhY2hlIGdldEltYWdlQ2FjaGUoKSB7Ci0JCXJldHVybiBpbWFnZUNhY2hlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci0JcHJvdGVjdGVkIElCcmVha3BvaW50IGdldEJyZWFrcG9pbnQoSU1hcmtlciBtYXJrZXIpIHsKLQkJcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmdldEJyZWFrcG9pbnQobWFya2VyKTsKLQl9Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JbXSBjb21wdXRlQnJlYWtwb2ludE92ZXJsYXlzKElQQnJlYWtwb2ludCBicmVha3BvaW50KSB7Ci0JCUltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzID0gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCB9OwotCQl0cnkgewotCQkJaWYgKGJyZWFrcG9pbnQuaXNHbG9iYWwoKSkgewotCQkJCW92ZXJsYXlzW092ZXJsYXlJbWFnZURlc2NyaXB0b3IuVE9QX0xFRlRdID0gKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpID8gUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JTUdfREVCVUdfT1ZFUl9CUFRfR0xPQl9FTikgOiBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19PVkVSX0JQVF9HTE9CX0RJKTsKLQkJCX0KLQkJCWlmIChicmVha3BvaW50LmlzQ29uZGl0aW9uYWwoKSkgewotCQkJCW92ZXJsYXlzW092ZXJsYXlJbWFnZURlc2NyaXB0b3IuQk9UVE9NX0xFRlRdID0gKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpID8gUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JTUdfREVCVUdfT1ZFUl9CUFRfQ09ORF9FTikgOiBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19PVkVSX0JQVF9DT05EX0RJKTsKLQkJCX0KLQkJCWlmIChicmVha3BvaW50LmlzSW5zdGFsbGVkKCkpIHsKLQkJCQlvdmVybGF5c1tPdmVybGF5SW1hZ2VEZXNjcmlwdG9yLkJPVFRPTV9MRUZUXSA9IChicmVha3BvaW50LmlzRW5hYmxlZCgpKSA/IFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX09WRVJfQlBUX0lOU1RfRU4pIDogUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JTUdfREVCVUdfT1ZFUl9CUFRfSU5TVF9ESSk7Ci0JCQl9Ci0JCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQQWRkcmVzc0JyZWFrcG9pbnQpIHsKLQkJCQlvdmVybGF5c1tPdmVybGF5SW1hZ2VEZXNjcmlwdG9yLlRPUF9SSUdIVF0gPSAoYnJlYWtwb2ludC5pc0VuYWJsZWQoKSkgPyBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19PVkVSX0JQVF9BRERSX0VOKSA6IFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX09WRVJfQlBUX0FERFJfREkpOwotCQkJfQotCQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUEZ1bmN0aW9uQnJlYWtwb2ludCkgewotCQkJCW92ZXJsYXlzW092ZXJsYXlJbWFnZURlc2NyaXB0b3IuQk9UVE9NX1JJR0hUXSA9IChicmVha3BvaW50LmlzRW5hYmxlZCgpKSA/IFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX09WRVJfQlBUX0ZVTkNfRU4pIDogUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JTUdfREVCVUdfT1ZFUl9CUFRfRlVOQ19ESSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJUFRQRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG92ZXJsYXlzOwotCX0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0VmFyaWFibGVJbWFnZShJVmFyaWFibGUgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQVmFyaWFibGUpIHsKLQkJCUlBSUYgYWlmID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYWlmID0gKChJUFZhcmlhYmxlKWVsZW1lbnQpLmdldEFJRigpOwotCQkJfQotCQkJY2F0Y2goRGVidWdFeGNlcHRpb24gZSkgewotCQkJCS8vIHVzZSBkZWZhdWx0IGltYWdlCi0JCQl9Ci0JCQlpZiAoYWlmID09IG51bGwpCi0JCQkJcmV0dXJuIFBEZWJ1Z0ltYWdlLmdldEltYWdlKCgoKElQVmFyaWFibGUpZWxlbWVudCkuaXNFbmFibGVkKCkpID8gUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1ZBUklBQkxFX1NJTVBMRSA6IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19WQVJJQUJMRV9TSU1QTEVfRElTQUJMRUQpOwotCQkJSUFJRlR5cGUgdHlwZSA9IGFpZi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSBpbnN0YW5jZW9mIElBSUZUeXBlUG9pbnRlciB8fCB0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVSZWZlcmVuY2UpCi0JCQkJcmV0dXJuIFBEZWJ1Z0ltYWdlLmdldEltYWdlKCgoKElQVmFyaWFibGUpZWxlbWVudCkuaXNFbmFibGVkKCkpID8gUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1ZBUklBQkxFX1BPSU5URVIgOiBQRGVidWdJbWFnZS5JTUdfREVCVUdfVkFSSUFCTEVfUE9JTlRFUl9ESVNBQkxFRCk7Ci0JCQllbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVBcnJheSB8fCB0eXBlIGluc3RhbmNlb2YgSUFJRlR5cGVTdHJ1Y3QpCi0JCQkJcmV0dXJuIFBEZWJ1Z0ltYWdlLmdldEltYWdlKCgoKElQVmFyaWFibGUpZWxlbWVudCkuaXNFbmFibGVkKCkpID8gUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1ZBUklBQkxFX0FHR1JFR0FURSA6IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19WQVJJQUJMRV9BR0dSRUdBVEVfRElTQUJMRUQpOwotCQkJZWxzZQotCQkJCXJldHVybiBQRGVidWdJbWFnZS5nZXRJbWFnZSgoKChJUFZhcmlhYmxlKWVsZW1lbnQpLmlzRW5hYmxlZCgpKSA/IFBEZWJ1Z0ltYWdlLklNR19ERUJVR19WQVJJQUJMRV9TSU1QTEUgOiBQRGVidWdJbWFnZS5JTUdfREVCVUdfVkFSSUFCTEVfU0lNUExFX0RJU0FCTEVEKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIEltYWdlIGdldFJlZ2lzdGVySW1hZ2UoSVJlZ2lzdGVyIGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoZWxlbWVudCBpbnN0YW5jZW9mIElQVmFyaWFibGUgJiYgKChJUFZhcmlhYmxlKWVsZW1lbnQpLmlzRW5hYmxlZCgpKSkgPyBQRGVidWdJbWFnZS5nZXRJbWFnZShQRGVidWdJbWFnZS5JTUdfREVCVUdfUkVHSVNURVIpIDogUERlYnVnSW1hZ2UuZ2V0SW1hZ2UoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1JFR0lTVEVSX0RJU0FCTEVEKTsKLQl9Ci0JcHJvdGVjdGVkIEltYWdlIGdldEV4cHJlc3Npb25JbWFnZShJRXhwcmVzc2lvbiBlbGVtZW50KSB7Ci0JCXJldHVybiBEZWJ1Z1VJVG9vbHMuZ2V0SW1hZ2UoSURlYnVnVUlDb25zdGFudHMuSU1HX09CSlNfRVhQUkVTU0lPTik7Ci0JfQotCXByb3RlY3RlZCBJbWFnZSBnZXRNb2R1bGVJbWFnZShJUE1vZHVsZSBlbGVtZW50KSB7Ci0JCXN3aXRjaChlbGVtZW50LmdldFR5cGUoKSkgewotCQkJY2FzZSBJUE1vZHVsZS5FWEVDVVRBQkxFOgotCQkJCWlmIChlbGVtZW50LmFyZVN5bWJvbHNMb2FkZWQoKSkgewotCQkJCQlyZXR1cm4gUERlYnVnSW1hZ2UuZ2V0SW1hZ2UoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX0VYRUNVVEFCTEVfV0lUSF9TWU1CT0xTKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFBEZWJ1Z0ltYWdlLmdldEltYWdlKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19FWEVDVVRBQkxFKTsKLQkJCWNhc2UgSVBNb2R1bGUuU0hBUkVEX0xJQlJBUlk6Ci0JCQkJaWYgKCBlbGVtZW50LmFyZVN5bWJvbHNMb2FkZWQoKSApIHsKLQkJCQkJcmV0dXJuIFBEZWJ1Z0ltYWdlLmdldEltYWdlKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19TSEFSRURfTElCUkFSWV9XSVRIX1NZTUJPTFMpOwotCQkJCX0KLQkJCQlyZXR1cm4gUERlYnVnSW1hZ2UuZ2V0SW1hZ2UoUERlYnVnSW1hZ2UuSU1HX0RFQlVHX1NIQVJFRF9MSUJSQVJZKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYXJpYWJsZVRleHQoSVZhcmlhYmxlIHZhcikgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGxhYmVsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodmFyIGluc3RhbmNlb2YgSVBWYXJpYWJsZSkgewotCQkJSUFJRiBhaWYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhaWYgPSAoKElQVmFyaWFibGUpIHZhcikuZ2V0QUlGKCk7Ci0JCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG9uJ3QgZGlzcGxheSB0eXBlCi0JCQl9Ci0JCQlpZiAoYWlmICE9IG51bGwgJiYgaXNTaG93VmFyaWFibGVUeXBlTmFtZXMoKSkgewotCQkJCVN0cmluZyB0eXBlTmFtZSA9IGdldFZhcmlhYmxlVHlwZU5hbWUoYWlmKTsKLQkJCQlpZiAodHlwZU5hbWUgIT0gbnVsbCAmJiB0eXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbGFiZWwuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgbmFtZSA9IHZhci5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCWxhYmVsLmFwcGVuZChuYW1lLnRyaW0oKSk7Ci0JCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSBnZXRWYWx1ZVRleHQodmFyLmdldFZhbHVlKCkpOwotCQkJaWYgKCFpc0VtcHR5KHZhbHVlU3RyaW5nKSkgewotCQkJCWxhYmVsLmFwcGVuZCgiID0gIik7Ci0JCQkJbGFiZWwuYXBwZW5kKHZhbHVlU3RyaW5nKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZVRleHQoSVZhbHVlIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSVBEZWJ1Z0VsZW1lbnRTdGF0dXMgJiYgISgoSVBEZWJ1Z0VsZW1lbnRTdGF0dXMpIHZhbHVlKS5pc09LKCkpIHsKLQkJCWxhYmVsLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5lcnJvcjEiKSwgbmV3IE9iamVjdFtdIHsgKChJUERlYnVnRWxlbWVudFN0YXR1cyl2YWx1ZSkuZ2V0TWVzc2FnZSgpIH0pKTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElQVmFsdWUpIHsKLQkJCUlBSUYgYWlmID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYWlmID0gKChJUFZhbHVlKSB2YWx1ZSkuZ2V0QUlGKCk7Ci0JCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG9uJ3QgZGlzcGxheSB0eXBlCi0JCQl9Ci0JCQl0cnkgewotCQkJCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JCQkJaWYgKHZhbHVlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZy50cmltKCk7Ci0JCQkJCWlmIChhaWYgIT0gbnVsbCAmJiBhaWYgaW5zdGFuY2VvZiBJQUlGVHlwZUNoYXIpIHsKLQkJCQkJCWlmICh2YWx1ZVN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCXZhbHVlU3RyaW5nID0gIi4iOwotCQkJCQkJbGFiZWwuYXBwZW5kKHZhbHVlU3RyaW5nKTsKLQkJCQkJfSBlbHNlIGlmIChhaWYgPT0gbnVsbCB8fCAoIShhaWYuZ2V0VHlwZSgpIGluc3RhbmNlb2YgSUFJRlR5cGVBcnJheSkgJiYgIShhaWYuZ2V0VHlwZSgpIGluc3RhbmNlb2YgSUFJRlR5cGVTdHJ1Y3QpKSkgewotCQkJCQkJaWYgKHZhbHVlU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWxhYmVsLmFwcGVuZCh2YWx1ZVN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlMSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpZ25hbFRleHQoSVBTaWduYWwgc2lnbmFsKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uc2lnbmFsIikpOwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSBzaWduYWwuZ2V0TmFtZSgpOwotCQkJc2IuYXBwZW5kKCIgXCciKS5hcHBlbmQobmFtZSkuYXBwZW5kKCdcJycpOwotCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2F0Y2hFeHByZXNzaW9uVGV4dChJV2F0Y2hFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcmVzdWx0LmFwcGVuZCgnIicpLmFwcGVuZChleHByZXNzaW9uLmdldEV4cHJlc3Npb25UZXh0KCkpLmFwcGVuZCgnIicpOwotCQlpZiAoZXhwcmVzc2lvbi5pc1BlbmRpbmcoKSkgewotCQkJcmVzdWx0LmFwcGVuZCgiID0gIikuYXBwZW5kKCIuLi4iKTsKLQkJfSBlbHNlIHsKLQkJCUlWYWx1ZSB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElQVmFsdWUpIHsKLQkJCQlJQUlGIGFpZiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJYWlmID0gKChJUFZhbHVlKXZhbHVlKS5nZXRBSUYoKTsKLQkJCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlMSkgewotCQkJCX0KLQkJCQlpZiAoYWlmICE9IG51bGwgJiYgaXNTaG93VmFyaWFibGVUeXBlTmFtZXMoKSkgewotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRWYXJpYWJsZVR5cGVOYW1lKGFpZik7Ci0JCQkJCWlmICghaXNFbXB0eSh0eXBlTmFtZSkpIHsKLQkJCQkJCXJlc3VsdC5pbnNlcnQoMCwgdHlwZU5hbWUgKyAnICcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChleHByZXNzaW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZVN0cmluZyA9IGdldFZhbHVlVGV4dCh2YWx1ZSk7Ci0JCQkJCWlmICh2YWx1ZVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiA9ICIpLmFwcGVuZCh2YWx1ZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFleHByZXNzaW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQlyZXN1bHQuYXBwZW5kKFBEZWJ1Z1VJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmRpc2FibGVkMSIpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0VGV4dChJRGVidWdUYXJnZXQgdGFyZ2V0LCBib29sZWFuIHF1YWxpZmllZCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJSVBEZWJ1Z1RhcmdldCB0ID0gKElQRGVidWdUYXJnZXQpIHRhcmdldC5nZXRBZGFwdGVyKElQRGVidWdUYXJnZXQuY2xhc3MpOwotCQlpZiAodCAhPSBudWxsKSB7Ci0JCQlpZiAoIXQuaXNQb3N0TW9ydGVtKCkpIHsKLQkJCQlQRGVidWdFbGVtZW50U3RhdGUgc3RhdGUgPSB0LmdldFN0YXRlKCk7Ci0JCQkJaWYgKHN0YXRlLmVxdWFscyhQRGVidWdFbGVtZW50U3RhdGUuRVhJVEVEKSkgewotCQkJCQlPYmplY3QgaW5mbyA9IHQuZ2V0Q3VycmVudFN0YXRlSW5mbygpOwotCQkJCQlTdHJpbmcgbGFiZWwgPSBQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50YXJnZXQxIik7Ci0JCQkJCVN0cmluZyByZWFzb24gPSAiIjsKLQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvIGluc3RhbmNlb2YgSVBESVNpZ25hbEluZm8pIHsKLQkJCQkJCUlQRElTaWduYWxJbmZvIHNpZ0luZm8gPSAoSVBESVNpZ25hbEluZm8pIGluZm87Ci0JCQkJCQlyZWFzb24gPSAnICcgKyBNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50YXJnZXQyIiksIG5ldyBPYmplY3RbXSB7IHNpZ0luZm8uZ2V0TmFtZSgpLCBzaWdJbmZvLmdldERlc2NyaXB0aW9uKCkgfSk7Ci0JCQkJCX0gZWxzZSBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8gaW5zdGFuY2VvZiBJUERJRXhpdEluZm8pIHsKLQkJCQkJCXJlYXNvbiA9ICcgJyArIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFBEZWJ1Z1VJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnRhcmdldDMiKSwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoKChJUERJRXhpdEluZm8pIGluZm8pLmdldENvZGUoKSkgfSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxhYmVsLCBuZXcgT2JqZWN0W10geyB0YXJnZXQuZ2V0TmFtZSgpLCByZWFzb24gfSk7Ci0JCQkJfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoUERlYnVnRWxlbWVudFN0YXRlLlNVU1BFTkRFRCkpIHsKLQkJCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFBEZWJ1Z1VJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnRhcmdldDQiKSwgbmV3IE9iamVjdFtdIHsgdGFyZ2V0LmdldE5hbWUoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhcmdldC5nZXROYW1lKCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGhyZWFkVGV4dChJVGhyZWFkIHRocmVhZCwgYm9vbGVhbiBxdWFsaWZpZWQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUlQRGVidWdUYXJnZXQgdGFyZ2V0ID0gKElQRGVidWdUYXJnZXQpIHRocmVhZC5nZXREZWJ1Z1RhcmdldCgpLmdldEFkYXB0ZXIoSVBEZWJ1Z1RhcmdldC5jbGFzcyk7Ci0JCWlmICh0YXJnZXQuaXNQb3N0TW9ydGVtKCkpIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQiKSwgbmV3IE9iamVjdFtdIHsgdGhyZWFkLmdldE5hbWUoKSB9KTsKLQkJfQotCQlpZiAodGhyZWFkLmlzVGVybWluYXRlZCgpKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkMiIpLCBuZXcgT2JqZWN0W10geyB0aHJlYWQuZ2V0TmFtZSgpIH0pOwotCQl9Ci0JCWlmICh0aHJlYWQuaXNTdGVwcGluZygpKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkMyIpLCBuZXcgT2JqZWN0W10geyB0aHJlYWQuZ2V0TmFtZSgpIH0pOwotCQl9Ci0JCWlmICghdGhyZWFkLmlzU3VzcGVuZGVkKCkpIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ0IiksIG5ldyBPYmplY3RbXSB7IHRocmVhZC5nZXROYW1lKCkgfSk7Ci0JCX0KLQkJaWYgKHRocmVhZC5pc1N1c3BlbmRlZCgpKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gIiI7Ci0JCQlJUERlYnVnRWxlbWVudCBlbGVtZW50ID0gKElQRGVidWdFbGVtZW50KSB0aHJlYWQuZ2V0QWRhcHRlcihJUERlYnVnRWxlbWVudC5jbGFzcyk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGluZm8gPSBlbGVtZW50LmdldEN1cnJlbnRTdGF0ZUluZm8oKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8gaW5zdGFuY2VvZiBJUERJU2lnbmFsSW5mbykgewotCQkJCQlyZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ1IiksIG5ldyBPYmplY3RbXSB7ICgoSVBESVNpZ25hbEluZm8pIGluZm8pLmdldE5hbWUoKSwgKChJUERJU2lnbmFsSW5mbykgaW5mbykuZ2V0RGVzY3JpcHRpb24oKSB9KTsKLQkJCQl9IGVsc2UgaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvIGluc3RhbmNlb2YgSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mbykgewotCQkJCQlyZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ2IiksIG5ldyBPYmplY3RbXSB7ICgoSVBESVdhdGNocG9pbnRUcmlnZ2VySW5mbykgaW5mbykuZ2V0T2xkVmFsdWUoKSwgKChJUERJV2F0Y2hwb2ludFRyaWdnZXJJbmZvKSBpbmZvKS5nZXROZXdWYWx1ZSgpIH0pOwotCQkJCX0gZWxzZSBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8gaW5zdGFuY2VvZiBJUERJV2F0Y2hwb2ludFNjb3BlSW5mbykgewotCQkJCQlyZWFzb24gPSBQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ3Iik7Ci0JCQkJfSBlbHNlIGlmIChpbmZvICE9IG51bGwgJiYgaW5mbyBpbnN0YW5jZW9mIElQRElCcmVha3BvaW50SW5mbykgewotCQkJCQlyZWFzb24gPSBQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ4Iik7Ci0JCQkJfSBlbHNlIGlmIChpbmZvICE9IG51bGwgJiYgaW5mbyBpbnN0YW5jZW9mIElQRElTaGFyZWRMaWJyYXJ5SW5mbykgewotCQkJCQlyZWFzb24gPSBQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ5Iik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFBEZWJ1Z1VJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnRocmVhZDEwIiksIG5ldyBPYmplY3RbXSB7IHRocmVhZC5nZXROYW1lKCksIHJlYXNvbiB9KTsKLQkJfQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkMTEiKSwgbmV3IE9iamVjdFtdIHsgdGhyZWFkLmdldE5hbWUoKSB9KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdGFja0ZyYW1lVGV4dChJU3RhY2tGcmFtZSBmLCBib29sZWFuIHF1YWxpZmllZCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGYgaW5zdGFuY2VvZiBJUFN0YWNrRnJhbWUpIHsKLQkJCUlQU3RhY2tGcmFtZSBmcmFtZSA9IChJUFN0YWNrRnJhbWUpIGY7Ci0JCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlsYWJlbC5hcHBlbmQoZnJhbWUuZ2V0TGV2ZWwoKSk7Ci0JCQlsYWJlbC5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBmdW5jdGlvbiA9IGZyYW1lLmdldEZ1bmN0aW9uKCk7Ci0JCQlpZiAoaXNFbXB0eShmdW5jdGlvbikpIHsKLQkJCQlsYWJlbC5hcHBlbmQoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uZnJhbWUyIikpOwotCQkJfSBlbHNlIHsKLQkJCQlmdW5jdGlvbiA9IGZ1bmN0aW9uLnRyaW0oKTsKLQkJCQlpZiAoZnVuY3Rpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWxhYmVsLmFwcGVuZChmdW5jdGlvbik7Ci0JCQkJCWxhYmVsLmFwcGVuZCgiKCkgIik7Ci0JCQkJCWlmIChmcmFtZS5nZXRGaWxlKCkgIT0gbnVsbCkgewotCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZyYW1lLmdldEZpbGUoKSk7Ci0JCQkJCQlpZiAoIXBhdGguaXNFbXB0eSgpKSB7Ci0JCQkJCQkJLy9sYWJlbC5hcHBlbmQoUERlYnVnVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uZnJhbWUxIikpOwotCQkJCQkJCS8vbGFiZWwuYXBwZW5kKCcgJyk7Ci0JCQkJCQkJbGFiZWwuYXBwZW5kKChxdWFsaWZpZWQgPyBwYXRoLnRvT1NTdHJpbmcoKSA6IHBhdGgubGFzdFNlZ21lbnQoKSkpOwotCQkJCQkJCWxhYmVsLmFwcGVuZCgnOicpOwotCQkJCQkJCWlmIChmcmFtZS5nZXRGcmFtZUxpbmVOdW1iZXIoKSAhPSAwKQotCQkJCQkJCQlsYWJlbC5hcHBlbmQoZnJhbWUuZ2V0RnJhbWVMaW5lTnVtYmVyKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJQmlnSW50ZWdlciBhZGRyZXNzID0gZnJhbWUuZ2V0QWRkcmVzcygpOwotCQkJaWYgKGFkZHJlc3MgIT0gbnVsbCkgewotCQkJCWxhYmVsLmFwcGVuZCgnICcpOwotCQkJCWxhYmVsLmFwcGVuZChhZGRyZXNzLnRvU3RyaW5nKDE2KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gKGYuZ2V0QWRhcHRlcihJUER1bW15U3RhY2tGcmFtZS5jbGFzcykgIT0gbnVsbCkgPyBnZXREdW1teVN0YWNrRnJhbWVMYWJlbChmKSA6IGYuZ2V0TmFtZSgpOwotCX0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RHVtbXlTdGFja0ZyYW1lTGFiZWwoSVN0YWNrRnJhbWUgc3RhY2tGcmFtZSkgewotCQlyZXR1cm4gRFVNTVlfU1RBQ0tGUkFNRV9MQUJFTDsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93VmFyaWFibGVUeXBlTmFtZXMoKSB7Ci0JCUJvb2xlYW4gc2hvdyA9IChCb29sZWFuKSBnZXRBdHRyaWJ1dGVzKCkuZ2V0KERJU1BMQVlfVkFSSUFCTEVfVFlQRV9OQU1FUyk7Ci0JCXNob3cgPSBzaG93ID09IG51bGwgPyBCb29sZWFuLkZBTFNFIDogc2hvdzsKLQkJcmV0dXJuIHNob3cuYm9vbGVhblZhbHVlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldEltYWdlQ2FjaGUoKS5kaXNwb3NlQWxsKCk7Ci0JCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QnJlYWtwb2ludFRleHQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgYm9vbGVhbiBxdWFsaWZpZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUExpbmVCcmVha3BvaW50KSB7Ci0JCQlyZXR1cm4gZ2V0TGluZUJyZWFrcG9pbnRUZXh0KChJUExpbmVCcmVha3BvaW50KSBicmVha3BvaW50LCBxdWFsaWZpZWQpOwotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lQnJlYWtwb2ludFRleHQoSVBMaW5lQnJlYWtwb2ludCBicmVha3BvaW50LCBib29sZWFuIHF1YWxpZmllZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWFwcGVuZFNvdXJjZU5hbWUoYnJlYWtwb2ludCwgbGFiZWwsIHF1YWxpZmllZCk7Ci0JCWFwcGVuZExpbmVOdW1iZXIoYnJlYWtwb2ludCwgbGFiZWwpOwotCQlhcHBlbmRCcmVha3BvaW50U3RhdHVzKGJyZWFrcG9pbnQsIGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgYXBwZW5kU291cmNlTmFtZShJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCwgU3RyaW5nQnVmZmVyIGxhYmVsLCBib29sZWFuIHF1YWxpZmllZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgaGFuZGxlID0gYnJlYWtwb2ludC5nZXRTb3VyY2VIYW5kbGUoKTsKLQkJaWYgKCFpc0VtcHR5KGhhbmRsZSkpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChoYW5kbGUpOwotCQkJaWYgKHBhdGguaXNWYWxpZFBhdGgoaGFuZGxlKSkgewotCQkJCWxhYmVsLmFwcGVuZChxdWFsaWZpZWQgPyBwYXRoLnRvT1NTdHJpbmcoKSA6IHBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGFwcGVuZExpbmVOdW1iZXIoSVBMaW5lQnJlYWtwb2ludCBicmVha3BvaW50LCBTdHJpbmdCdWZmZXIgbGFiZWwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IGxpbmVOdW1iZXIgPSBicmVha3BvaW50LmdldExpbmVOdW1iZXIoKTsKLQkJaWYgKGxpbmVOdW1iZXIgPiAwKSB7Ci0JCQlsYWJlbC5hcHBlbmQoIiAiKTsKLQkJCWxhYmVsLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChQRGVidWdVSU1lc3NhZ2VzLmdldFN0cmluZygiUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5saW5lMSIpLCBuZXcgT2JqZWN0W10geyBJbnRlZ2VyLnRvU3RyaW5nKGxpbmVOdW1iZXIpIH0pKTsKLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgYXBwZW5kQnJlYWtwb2ludFN0YXR1cyhJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCwgU3RyaW5nQnVmZmVyIGxhYmVsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxhYmVsLmFwcGVuZCgiICIpOwotCQlsYWJlbC5hcHBlbmQoInsiKTsKLQkJbGFiZWwuYXBwZW5kKGJyZWFrcG9pbnQuZ2V0Sm9iTmFtZSgpKTsKLQkJbGFiZWwuYXBwZW5kKCI6Iik7Ci0JCWxhYmVsLmFwcGVuZChicmVha3BvaW50LmdldFNldElkKCkpOwotCQlsYWJlbC5hcHBlbmQoIn0iKTsKLQkJLy8gbGFiZWwuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFBEZWJ1Z1VJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmRldGFpbHMxIiksIG5ldyBTdHJpbmdbXSB7IGpvYk5hbWUsIGJyZWFrcG9pbnQuZ2V0U2V0SWQoKSB9KSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFyaWFibGVUeXBlTmFtZShJQUlGIGFpZikgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoYWlmICE9IG51bGwpIHsKLQkJCUlBSUZUeXBlIHR5cGUgPSBhaWYuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hcHBlbmQodHlwZS50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQkJCWludFtdIGRpbXMgPSAoKElBSUZUeXBlQXJyYXkpdHlwZSkuZ2V0RGltZW5zaW9uRGV0YWlscygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbXMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoJ1snKTsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoZGltc1tpXSk7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCddJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbm5vdGF0aW9ucyhJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBJU3RhY2tGcmFtZSBmcmFtZSkgewotCQl0cnkgewotCQkJaWYgKGZyYW1lIGluc3RhbmNlb2YgSVBTdGFja0ZyYW1lKSB7Ci0JCQkJUEFubm90YXRpb25NYW5hZ2VyLmdldERlZmF1bHQoKS5hZGRBbm5vdGF0aW9uKGVkaXRvclBhcnQsIChJUFN0YWNrRnJhbWUpZnJhbWUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIElUaHJlYWQgdGhyZWFkKSB7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BEZWJ1Z1VJTWVzc2FnZXMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BEZWJ1Z1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0MTBmNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QRGVidWdVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z1VJTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnVUlNZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXByaXZhdGUgUERlYnVnVUlNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKiogR2V0IHN0cmluZwotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QRGVidWdVSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QRGVidWdVSU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWQ3M2YuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUERlYnVnVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAjIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAjIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAjIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAjIAotICMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAjIAotICMgTEEtQ0MgMDQtMTE1Ci0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSAjIEBhdXRob3IgQ2xlbWVudAotICMKLSAjIwotCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnVua25vd25fMT11bmtub3duCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLjI9PG5vdCBhdmFpbGFibGU6IHswfT4KLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uND0oZGlzYWJsZWQpCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnNpZ25hbD1zaWduYWwKLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24ubm90X2F2YWlsYWJsZV8xPTxub3QgYXZhaWxhYmxlPgotCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmVycm9yMT08RXJyb3IuIHswfT4KLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uZGlzYWJsZWQxPShkaXNhYmxlZCkKLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGVybWluYXRlZDE9PHRlcm1pbmF0ZWQ+Ci1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmRpc2Nvbm5lY3RlZDE9PGRpc2Nvbm5lY3RlZD4KLQotCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnRhcmdldDE9ezB9IChFeGl0ZWQuezF9KQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50YXJnZXQyPVNpZ25hbCAnJ3swfScnIHJlY2VpdmVkLiBEZXNjcmlwdGlvbjogezF9LgotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50YXJnZXQzPUV4aXQgY29kZSA9IHswfS4KLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGFyZ2V0ND17MH0gKFN1c3BlbmRlZCkKLQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQxPVRocmVhZCBbezB9XQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQyPVRocmVhZCBbezB9XSAoVGVybWluYXRlZCkKLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkMz1UaHJlYWQgW3swfV0gKFN0ZXBwaW5nKQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ0PVRocmVhZCBbezB9XSAoUnVubmluZykKLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkNT06IFNpZ25hbCAnJ3swfScnIHJlY2VpdmVkLiBEZXNjcmlwdGlvbjogezF9LgotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ2PTogV2F0Y2hwb2ludCB0cmlnZ2VyZWQuIE9sZCB2YWx1ZTogJyd7MH0nJy4gTmV3IHZhbHVlOiAnJ3sxfScnLgotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQ3PTogV2F0Y2hwb2ludCBpcyBvdXQgb2Ygc2NvcGUuCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLnRocmVhZDg9OiBCcmVha3BvaW50IGhpdC4KLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkOT06IFNoYXJlZCBsaWJyYXJ5IGV2ZW50LgotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi50aHJlYWQxMD1UaHJlYWQgW3swfV0gKFN1c3BlbmRlZHsxfSkKLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24udGhyZWFkMTE9VGhyZWFkIFt7MH1dCi0KLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uZnJhbWUxPWF0Ci1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmZyYW1lMj08c3ltYm9sIGlzIG5vdCBhdmFpbGFibGU+Ci0KLQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5saW5lMT1bbGluZTogezB9XQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5hZGRyZXNzMT1bYWRkcmVzczogezB9XQotUFRQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5mdW5jdGlvbjE9W2Z1bmN0aW9uOiB7MH1dCi1QVFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmlnbm9yZWNvdW50MT1baWdub3JlIGNvdW50OiB7MH1dCi0KLVBUUERlYnVnTW9kZWxQcmVzZW50YXRpb24uZGV0YWlsczE9PEpvYjogezB9IC0gU2V0OiB7MX0+Ci0KLVBCcmVha3BvaW50V29ya2JlbmNoQWRhcHRlckZhY3RvcnkuMD1QVFAgYnJlYWtwb2ludAotUEJyZWFrcG9pbnRXb3JrYmVuY2hBZGFwdGVyRmFjdG9yeS4xPVBUUCB3YXRjaHBvaW50CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QRGVidWdVSVV0aWxzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QRGVidWdVSVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NWMzNDQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUERlYnVnVUlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwudWkudXRpbC5FeHRlcm5hbEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5DVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkxvY2FsRmlsZVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdVSVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Db21tb25Tb3VyY2VOb3RGb3VuZEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnJlc291cmNlcy5GaWxlU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuUFNvdXJjZU5vdEZvdW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQRGVidWdVSVV0aWxzIHsKLQkvKiogRmluZCByZWdpb24gYnkgZ2l2ZW4gb2Zmc2V0IGluIGdpdmVuIGRvY3VtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgcHVibGljIElSZWdpb24gZmluZFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBzdGFydCA9IC0xOwotCQlpbnQgZW5kID0gLTE7Ci0JCXRyeSB7Ci0JCQlpbnQgcG9zID0gb2Zmc2V0OwotCQkJY2hhciBjOwotCQkJd2hpbGUocG9zID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCS8vVE9ETyBjaGVjayBqYXZhIGNoYXI/Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCS0tcG9zOwotCQkJfQotCQkJc3RhcnQgPSBwb3M7Ci0JCQlwb3MgPSBvZmZzZXQ7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCQl3aGlsZShwb3MgPCBsZW5ndGgpIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCS8vVE9ETyBjaGVjayBqYXZhIGNoYXI/Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCSsrcG9zOwotCQkJfQotCQkJZW5kID0gcG9zOwotCQl9Ci0JCWNhdGNoKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiAtMSkgewotCQkJaWYgKHN0YXJ0ID09IG9mZnNldCAmJiBlbmQgPT0gb2Zmc2V0KQotCQkJCXJldHVybiBuZXcgUmVnaW9uKG9mZnNldCwgMCk7Ci0JCQllbHNlIGlmIChzdGFydCA9PSBvZmZzZXQpCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCArIDEsIGVuZCAtIHN0YXJ0IC0gMSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIEdldCBjdXJyZW50IHN0YWNrIGZyYW1lCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSVBTdGFja0ZyYW1lIGdldEN1cnJlbnRTdGFja0ZyYW1lKCkgewotCQlJQWRhcHRhYmxlIGNvbnRleHQgPSBEZWJ1Z1VJVG9vbHMuZ2V0RGVidWdDb250ZXh0KCk7Ci0JCXJldHVybiAoIGNvbnRleHQgIT0gbnVsbCApID8gKElQU3RhY2tGcmFtZSljb250ZXh0LmdldEFkYXB0ZXIoIElQU3RhY2tGcmFtZS5jbGFzcyApIDogbnVsbDsKLQl9Ci0JCi0JLyoqIFNob3cgdGFza3Mgd2l0aCBzdGFuZGFyZCBmb3JtYXQKLQkgKiBAcGFyYW0gYXJyYXkKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgYXJyYXlUb1N0cmluZyhpbnRbXSBhcnJheSkgewotCQlpZiAoYXJyYXkubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlTdHJpbmcgbXNnID0gIiI7Ci0JCWludCBwcmVUYXNrID0gYXJyYXlbMF07Ci0JCW1zZyArPSBwcmVUYXNrOwotCQlib29sZWFuIGlzQ29udGludWUgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKHByZVRhc2sgPT0gKGFycmF5W2ldIC0gMSkpIHsKLQkJCQlwcmVUYXNrID0gYXJyYXlbaV07Ci0JCQkJaXNDb250aW51ZSA9IHRydWU7Ci0JCQkJaWYgKGkgPT0gKGFycmF5Lmxlbmd0aCAtIDEpKSB7Ci0JCQkJCW1zZyArPSAiLSIgKyBhcnJheVtpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGlzQ29udGludWUpCi0JCQkJbXNnICs9ICItIiArIHByZVRhc2s7Ci0JCQltc2cgKz0gIiwiICsgYXJyYXlbaV07Ci0JCQlpc0NvbnRpbnVlID0gZmFsc2U7Ci0JCQlwcmVUYXNrID0gYXJyYXlbaV07Ci0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0Jc3RhdGljIHB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKElNYXJrZXIpIGVsZW1lbnQpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQlyZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIHJlc291cmNlKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJRmlsZSBmID0gKElGaWxlKWVsZW1lbnQ7Ci0JCQlpZiAgKGYuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoZik7Ci0JCQkKLQkJCXJldHVybiBuZXcgRXh0ZXJuYWxFZGl0b3JJbnB1dChuZXcgTG9jYWxGaWxlU3RvcmFnZShmLmdldEZ1bGxQYXRoKCkudG9GaWxlKCkpKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQQnJlYWtwb2ludCkgewotCQkJSVBCcmVha3BvaW50IHBiayA9IChJUEJyZWFrcG9pbnQpIGVsZW1lbnQ7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGhhbmRsZSA9IHBiay5nZXRTb3VyY2VIYW5kbGUoKTsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoaGFuZGxlKTsKLQkJCQlpZiAocGF0aC5pc1ZhbGlkUGF0aChoYW5kbGUpKSB7Ci0JCQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKHBhdGgpOwotCQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJZmlsZSA9IGZpbGVzWzBdOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJRmlsZSBmc2ZpbGUgPSBuZXcgRmlsZShoYW5kbGUpOwotCQkJCQkJaWYgKGZzZmlsZS5pc0ZpbGUoKSAmJiBmc2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IEV4dGVybmFsRWRpdG9ySW5wdXQobmV3IExvY2FsRmlsZVN0b3JhZ2UoZnNmaWxlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChmaWxlID09IG51bGwpCi0JCQkJZmlsZSA9IChJRmlsZSkgcGJrLmdldE1hcmtlcigpLmdldFJlc291cmNlKCkuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZVN0b3JhZ2UgfHwgZWxlbWVudCBpbnN0YW5jZW9mIExvY2FsRmlsZVN0b3JhZ2UpIHsKLQkJCXJldHVybiBuZXcgRXh0ZXJuYWxFZGl0b3JJbnB1dCgoSVN0b3JhZ2UpIGVsZW1lbnQpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUFNvdXJjZU5vdEZvdW5kRWxlbWVudCkgewotCQkJcmV0dXJuIG5ldyBDb21tb25Tb3VyY2VOb3RGb3VuZEVkaXRvcklucHV0KChQU291cmNlTm90Rm91bmRFbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RWRpdG9ySWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQluYW1lID0gKChJRmlsZSllbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9ySW5wdXQpIHsKLQkJCW5hbWUgPSAoKElFZGl0b3JJbnB1dCllbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJLy9pZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBTb3VyY2VOb3RGb3VuZEVsZW1lbnQpCi0JCQkvL3JldHVybiBJRGVidWdVSUNvbnN0YW50cy5JRF9DT01NT05fU09VUkNFX05PVF9GT1VORF9FRElUT1I7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gSURlYnVnVUlDb25zdGFudHMuSURfQ09NTU9OX1NPVVJDRV9OT1RfRk9VTkRfRURJVE9SOwotCQkKLQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihuYW1lKTsKLQkJcmV0dXJuIChkZXNjcmlwdG9yICE9IG51bGwpID8gZGVzY3JpcHRvci5nZXRJZCgpIDogQ1VJUGx1Z2luLkVESVRPUl9JRDsKLQl9Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RWRpdG9ySWQoSUVkaXRvcklucHV0IGlucHV0LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVkaXRvcklkKGlucHV0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqIFNob3cgdGFza3Mgd2l0aCBzdGFuZGFyZCBmb3JtYXQKLQkgKiBAcGFyYW0gdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgc2hvd0JpdExpc3QoQml0TGlzdCB0YXNrcykgewotCQlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlyZXR1cm4gYXJyYXlUb1N0cmluZyh0YXNrcy50b0FycmF5KCkpOwotCX0KLQkvL3NlbGYgdGVzdGluZwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJQml0TGlzdCB0YXNrcyA9IG5ldyBCaXRMaXN0KDApOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oc2hvd0JpdExpc3QodGFza3MpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczZjAyMy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24gZXh0ZW5kcyBNYXJrZXJBbm5vdGF0aW9uIHsKLQlwcml2YXRlIElBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEJpdExpc3QgdGFza3MgPSBudWxsOwotCXByaXZhdGUgUG9zaXRpb24gcG9zaXRpb24gPSBudWxsOwotCXByaXZhdGUgSU1hcmtlciBtYXJrZXIgPSBudWxsOwotCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTW9kZWwKLQkgKi8KLQlwdWJsaWMgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24oSU1hcmtlciBtYXJrZXIsIFBvc2l0aW9uIHBvc2l0aW9uLCBJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCkgewotCQlzdXBlcihtYXJrZXIpOwotCQl0aGlzLm1hcmtlciA9IG1hcmtlcjsKLQkJdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwotCQl0aGlzLmFubm90YXRpb25Nb2RlbCA9IGFubm90YXRpb25Nb2RlbDsKLQl9Ci0JLyoqIEdldCBhbm5vdGF0aW9uIG1vZGVsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIGFubm90YXRpb25Nb2RlbDsKLQl9Ci0JLyoqIFNldCBwb3NpdGlvbgotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKLQl9Ci0JLyoqIEdldCBwb3NpdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0JLyoqIFNldCBtYXJrZXIKLQkgKiBAcGFyYW0gbWFya2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRoaXMubWFya2VyID0gbWFya2VyOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNpbXBsZU1hcmtlckFubm90YXRpb24jZ2V0TWFya2VyKCkKLQkgKi8KLQlwdWJsaWMgSU1hcmtlciBnZXRNYXJrZXIoKSB7Ci0JCXJldHVybiBtYXJrZXI7Ci0JfQotCS8qKiBTZXQgbWVzc2FnZSBmb3IgYW5ub3RhdGlvbgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQl0cnkgewotCQkJZ2V0TWFya2VyKCkuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXNldFRleHQobWVzc2FnZSk7Ci0JfQotCS8qKiBTZXQgTWVzc2FnZSAKLQkgKiBAcGFyYW0gaXNSZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoYm9vbGVhbiBpc1JlZ2lzdGVyKSB7Ci0JCWludFtdIHRhc2tzID0gZ2V0VGFza3MoKS50b0FycmF5KCk7Ci0JCWlmICh0YXNrcy5sZW5ndGggPT0gMCkgewotCQkJc2V0TWVzc2FnZSgiIik7Ci0JCQlkZWxldGVNYXJrZXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbXNnID0gIlN1c3BlbmRlZCBvbiAiICsgKGlzUmVnaXN0ZXIgPyAicmVnaXN0ZXJlZCIgOiAidW5yZWdpc3RlcmVkIikgKyAiICIgKyAodGFza3MubGVuZ3RoID09IDEgPyAicHJvY2VzcyIgOiAicHJvY2Vzc2VzIikgKyAiOiAiOwotCQltc2cgKz0gUERlYnVnVUlVdGlscy5hcnJheVRvU3RyaW5nKHRhc2tzKTsKLQkJc2V0TWVzc2FnZShtc2cpOwotCX0KLQkvKiogR2V0IG1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQkvKiogU2V0IHRhc2tzCi0JICogQHBhcmFtIHRhc2tzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza3MoQml0TGlzdCB0YXNrcykgewotCQl0aGlzLnRhc2tzID0gdGFza3M7Ci0JfQotCS8qKiBHZXQgdGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0JLyoqIEFkZCB0YXNrcwotCSAqIEBwYXJhbSBhVGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrcyhCaXRMaXN0IGFUYXNrcykgewotCQlpZiAodGFza3MgPT0gbnVsbCkgewotCQkJdGFza3MgPSBhVGFza3MuY29weSgpOwotCQl9Ci0JCWlmICh0YXNrcy5zaXplKCkgPCBhVGFza3Muc2l6ZSgpKSB7Ci0JCQlhVGFza3Mub3IodGFza3MpOwotCQkJdGFza3MgPSBhVGFza3MuY29weSgpOwotCQl9IGVsc2UKLQkJCXRhc2tzLm9yKGFUYXNrcyk7Ci0JfQotCS8qKiBSZW1vdmUgdGFza3MKLQkgKiBAcGFyYW0gYVRhc2tzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFza3MoQml0TGlzdCBhVGFza3MpIHsKLQkJdGFza3MuYW5kTm90KGFUYXNrcyk7Ci0JfQotCS8qKiBJcyBubyB0YXNrcwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBubyB0YXNrcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0YXNrcy5pc0VtcHR5KCk7Ci0JfQotCS8qKiBDb250YWlucyB0YXNrcwotCSAqIEBwYXJhbSBhVGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoQml0TGlzdCBhVGFza3MpIHsKLQkJcmV0dXJuIHRhc2tzLmludGVyc2VjdHMoYVRhc2tzKTsKLQl9Ci0JLyoqIEdldCBjb250YWlucyB0YXNrcwotCSAqIEBwYXJhbSBhVGFza3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludFtdIGNvbnRhaW5UYXNrcyhCaXRMaXN0IGFUYXNrcykgewotCQlhVGFza3MuYW5kKHRhc2tzKTsKLQkJcmV0dXJuIGFUYXNrcy50b0FycmF5KCk7Ci0JfQotCS8qKiBEZWxldGUgbWFya2VyCi0JICogQHJldHVybiB0cnVlIGlmIGRlbGV0ZSBzdWNjdXNzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlTWFya2VyKCkgewotCQlJTWFya2VyIG1hcmtlciA9IGdldE1hcmtlcigpOwotCQlpZiAobWFya2VyLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QSW5zdHJ1Y3Rpb25Qb2ludGVyQW5ub3RhdGlvbjIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE1MzdlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS51dGlsLkJpdExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUEluc3RydWN0aW9uUG9pbnRlckFubm90YXRpb24yIHsKLQlwcml2YXRlIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBCaXRMaXN0IHRhc2tzID0gbnVsbDsKLQlwcml2YXRlIFBvc2l0aW9uIHBvc2l0aW9uID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk1vZGVsCi0JICovCi0JcHVibGljIFBJbnN0cnVjdGlvblBvaW50ZXJBbm5vdGF0aW9uMihJUmVzb3VyY2UgZmlsZSwgU3RyaW5nIHR5cGUsIFBvc2l0aW9uIHBvc2l0aW9uLCBJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCkgewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247Ci0JCXRoaXMuYW5ub3RhdGlvbk1vZGVsID0gYW5ub3RhdGlvbk1vZGVsOwotCQlhZGRBbm5vdGF0aW9uVG9Nb2RlbCgpOwotCX0KLQlwcml2YXRlIElNYXJrZXIgY3JlYXRlTWFya2VyKCkgewotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZpbGUuY3JlYXRlTWFya2VyKHR5cGUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgSVJlc291cmNlIGdldE1ha2VyUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkvKiogR2V0IGFubm90YXRpb24gbW9kZWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElBbm5vdGF0aW9uTW9kZWwgZ2V0QW5ub3RhdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gYW5ub3RhdGlvbk1vZGVsOwotCX0KLQkvKiogR2V0IHBvc2l0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbiBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBvc2l0aW9uOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCWFubm90YXRpb24uc2V0VHlwZSh0eXBlKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJaWYgKGlzTWFya2VyRXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCW1hcmtlciA9IG51bGw7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQkJYW5ub3RhdGlvbi5zZXRUZXh0KCIiKTsKLQkJYW5ub3RhdGlvbi5tYXJrRGVsZXRlZCh0cnVlKTsKLQkJYW5ub3RhdGlvbk1vZGVsLnJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlckV4aXN0cygpIHsKLQkJcmV0dXJuIChtYXJrZXIgIT0gbnVsbCAmJiBtYXJrZXIuZXhpc3RzKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcmtEZWxldGVkKCkgewotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCB8fCBhbm5vdGF0aW9uLmlzTWFya2VkRGVsZXRlZCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvblRvTW9kZWwoKSB7Ci0JCW1hcmtlciA9IGNyZWF0ZU1hcmtlcigpOwotCQlpZiAoaXNNYXJrZXJFeGlzdHMoKSkgewotCQkJYW5ub3RhdGlvbiA9IG5ldyBNYXJrZXJBbm5vdGF0aW9uKG1hcmtlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24odHlwZSwgZmFsc2UsICIiKTsKLQkJfQotCQlhbm5vdGF0aW9uLm1hcmtEZWxldGVkKGZhbHNlKTsKLQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbiwgcG9zaXRpb24pOwotCX0KLQkvKiogU2V0IG1lc3NhZ2UgZm9yIGFubm90YXRpb24KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChpc01hcmtlckV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkge30KLQkJfQotCQlhbm5vdGF0aW9uLnNldFRleHQobWVzc2FnZSk7Ci0JfQotCS8qKiBTZXQgTWVzc2FnZSAKLQkgKiBAcGFyYW0gaXNSZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoYm9vbGVhbiBpc1JlZ2lzdGVyKSB7Ci0JCWludFtdIHRhc2tzID0gZ2V0VGFza3MoKS50b0FycmF5KCk7Ci0JCWlmICh0YXNrcy5sZW5ndGggPT0gMCkgewotCQkJcmVtb3ZlQW5ub3RhdGlvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBtc2cgPSAiU3VzcGVuZGVkIG9uICIgKyAoaXNSZWdpc3RlciA/ICJyZWdpc3RlcmVkIiA6ICJ1bnJlZ2lzdGVyZWQiKSArICIgIiArICh0YXNrcy5sZW5ndGggPT0gMSA/ICJwcm9jZXNzIiA6ICJwcm9jZXNzZXMiKSArICI6ICI7Ci0JCW1zZyArPSBQRGVidWdVSVV0aWxzLmFycmF5VG9TdHJpbmcodGFza3MpOwotCQlzZXRNZXNzYWdlKG1zZyk7Ci0JfQotCS8qKiBTZXQgdGFza3MKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrcyhCaXRMaXN0IHRhc2tzKSB7Ci0JCXRoaXMudGFza3MgPSB0YXNrczsKLQl9Ci0JLyoqIEdldCB0YXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQkvKiogQWRkIHRhc2tzCi0JICogQHBhcmFtIGFUYXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tzKEJpdExpc3QgYVRhc2tzKSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQl0YXNrcyA9IGFUYXNrcy5jb3B5KCk7Ci0JCX0KLQkJaWYgKHRhc2tzLnNpemUoKSA8IGFUYXNrcy5zaXplKCkpIHsKLQkJCWFUYXNrcy5vcih0YXNrcyk7Ci0JCQl0YXNrcyA9IGFUYXNrcy5jb3B5KCk7Ci0JCX0gZWxzZQotCQkJdGFza3Mub3IoYVRhc2tzKTsKLQl9Ci0JLyoqIFJlbW92ZSB0YXNrcwotCSAqIEBwYXJhbSBhVGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrcyhCaXRMaXN0IGFUYXNrcykgewotCQl0YXNrcy5hbmROb3QoYVRhc2tzKTsKLQl9Ci0JLyoqIElzIG5vIHRhc2tzCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIHRhc2tzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRhc2tzLmlzRW1wdHkoKTsKLQl9Ci0JLyoqIENvbnRhaW5zIHRhc2tzCi0JICogQHBhcmFtIGFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhCaXRMaXN0IGFUYXNrcykgewotCQlyZXR1cm4gdGFza3MuaW50ZXJzZWN0cyhhVGFza3MpOwotCX0KLQkvKiogR2V0IGNvbnRhaW5zIHRhc2tzCi0JICogQHBhcmFtIGFUYXNrcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50W10gY29udGFpblRhc2tzKEJpdExpc3QgYVRhc2tzKSB7Ci0JCWFUYXNrcy5hbmQodGFza3MpOwotCQlyZXR1cm4gYVRhc2tzLnRvQXJyYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QSm9iVmFyaWFibGVNYW5hZ2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QSm9iVmFyaWFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDUzN2EuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUEpvYlZhcmlhYmxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLkRlYnVnSm9iU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLlBESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLkFJRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLnJlcXVlc3QuSVBESUdldEFJRlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgcmVwbGFjZSB3aXRoIFBWYXJpYWJsZU1hbmFnZXIKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBKb2JWYXJpYWJsZU1hbmFnZXIgewotCXByaXZhdGUgRGVidWdKb2JTdG9yYWdlIHZhcmlhYmxlU3RvcmFnZSA9IG5ldyBEZWJ1Z0pvYlN0b3JhZ2UoIlZhcmlhYmxlIik7Ci0JcHJpdmF0ZSBEZWJ1Z0pvYlN0b3JhZ2UgdmFyUHJvY1N0b3JhZ2UgPSBuZXcgRGVidWdKb2JTdG9yYWdlKCJWYXJpYWJsZV9Qcm9jZXNzIik7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJPQ0VTU19LRVkgPSAicHJvY2Vzc19rZXkiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFZBTFVFX1VOS05PV04gPSAiVW5rd25vbiI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMVUVfRVJST1IgPSAiRXJyb3IgaW4gZ2V0dGluZyB2YWx1ZSI7Ci0JCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWNsZWFudXBKb2JWYXJpYWJsZVZhbHVlcygpOwotCQl2YXJQcm9jU3RvcmFnZS5jbG9zZURlYnVnSm9iU3RvcmFnZSgpOwotCQl2YXJpYWJsZVN0b3JhZ2UuY2xvc2VEZWJ1Z0pvYlN0b3JhZ2UoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZXN1bHREaXNwbGF5KFN0cmluZyBqb2JfaWQsIGludCB0YXNrX2lkKSB7Ci0JCVByb2Nlc3NWYWx1ZSBwcm9jVmFsID0gKFByb2Nlc3NWYWx1ZSl2YXJQcm9jU3RvcmFnZS5nZXRWYWx1ZShqb2JfaWQsIFBST0NFU1NfS0VZKTsKLQkJaWYgKHByb2NWYWwgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgZGlzcGxheSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChWYXJpYWJsZVZhbHVlIHZhbHVlIDogcHJvY1ZhbC5nZXRWYWx1ZXModGFza19pZCkpIHsKLQkJCWRpc3BsYXkuYXBwZW5kKCI8aT4iKTsKLQkJCWRpc3BsYXkuYXBwZW5kKHZhbHVlLmdldFZhcigpKTsKLQkJCWRpc3BsYXkuYXBwZW5kKCI8L2k+Iik7Ci0JCQlkaXNwbGF5LmFwcGVuZCgiID0gIik7Ci0JCQlkaXNwbGF5LmFwcGVuZCh2YWx1ZS5nZXRWYWwoKSk7Ci0JCQlkaXNwbGF5LmFwcGVuZCgiPGJyPiIpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5LnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBEZWJ1Z0pvYlN0b3JhZ2UgZ2V0VmFyaWFibGVTdG9yYWdlKCkgewotCQlyZXR1cm4gdmFyaWFibGVTdG9yYWdlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5WYXJpYWJsZShJUEpvYiBqb2IsIFN0cmluZyB2YXIpIHsKLQkJcmV0dXJuICh2YXJpYWJsZVN0b3JhZ2UuZ2V0VmFsdWUoam9iLmdldElEKCksIHZhcikgIT0gbnVsbCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZEpvYlZhcmlhYmxlKElQSm9iIGpvYiwgU3RyaW5nIHZhciwgU3RyaW5nW10gc2V0cykgewotCQlhZGRKb2JWYXJpYWJsZShqb2IsIHZhciwgc2V0cywgdHJ1ZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZEpvYlZhcmlhYmxlKElQSm9iIGpvYiwgU3RyaW5nIHZhciwgU3RyaW5nW10gc2V0cywgYm9vbGVhbiBlbmFibGUpIHsKLQkJSm9iVmFyaWFibGUgalZhciA9IChKb2JWYXJpYWJsZSl2YXJpYWJsZVN0b3JhZ2UuZ2V0VmFsdWUoam9iLmdldElEKCksIHZhcik7Ci0JCWlmIChqVmFyID09IG51bGwpIHsKLQkJCWpWYXIgPSBuZXcgSm9iVmFyaWFibGUoam9iLCB2YXIsIHNldHMsIGVuYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlqVmFyLnNldFNldHMoc2V0cyk7Ci0JCQlqVmFyLnNldEVuYWJsZShlbmFibGUpOwotCQl9Ci0JCXZhcmlhYmxlU3RvcmFnZS5hZGRWYWx1ZShqb2IuZ2V0SUQoKSwgdmFyLCBqVmFyKTsKLQkJY3JlYXRlUHJvY2Vzc1ZhbHVlKGpvYik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9jZXNzVmFsdWUoSVBKb2Igam9iKSB7Ci0JCVByb2Nlc3NWYWx1ZSBwcm9jVmFsID0gKFByb2Nlc3NWYWx1ZSl2YXJQcm9jU3RvcmFnZS5nZXRWYWx1ZShqb2IuZ2V0SUQoKSwgUFJPQ0VTU19LRVkpOwotCQlpZiAocHJvY1ZhbCA9PSBudWxsKSB7Ci0JCQlwcm9jVmFsID0gbmV3IFByb2Nlc3NWYWx1ZShqb2Iuc2l6ZSgpKTsKLQkJCXZhclByb2NTdG9yYWdlLmFkZFZhbHVlKGpvYi5nZXRJRCgpLCBQUk9DRVNTX0tFWSwgcHJvY1ZhbCk7Ci0JCX0JCQotCX0KLQlwdWJsaWMgSm9iVmFyaWFibGVbXSBnZXRKb2JWYXJpYWJsZXMoU3RyaW5nIGpvYl9pZCkgewotCQlyZXR1cm4gdmFyaWFibGVTdG9yYWdlLmdldFZhbHVlQ29sbGVjdGlvbihqb2JfaWQpLnRvQXJyYXkobmV3IEpvYlZhcmlhYmxlWzBdKTsKLQl9Ci0JcHVibGljIHZvaWQgY2hhbmdlSm9iVmFyaWFibGUoSVBKb2Igam9iLCBJUEpvYiBuZXdKb2IsIFN0cmluZ1tdIHNldHMsIFN0cmluZyB2YXIsIFN0cmluZyBuZXdWYXIsIGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXJlbW92ZUpvYlZhcmlhYmxlKGpvYi5nZXRJRCgpLCB2YXIpOwotCQlhZGRKb2JWYXJpYWJsZShuZXdKb2IsIG5ld1Zhciwgc2V0cywgZW5hYmxlKTsKLQl9Ci0JcHVibGljIHZvaWQgZGVsZXRlU2V0KFN0cmluZyBqb2JfaWQsIFN0cmluZyBzZXRfaWQpIHsKLQkJZm9yIChKb2JWYXJpYWJsZSBqVmFyIDogZ2V0Sm9iVmFyaWFibGVzKGpvYl9pZCkpIHsKLQkJCWlmIChqVmFyLmNvbnRhaW5TZXQoc2V0X2lkKSkgewotCQkJCWpWYXIucmVtb3ZlU2V0KHNldF9pZCk7Ci0JCQkJaWYgKGpWYXIuZ2V0U2V0U2l6ZSgpID09IDApIHsKLQkJCQkJdmFyaWFibGVTdG9yYWdlLnJlbW92ZVZhbHVlKGpvYl9pZCwgalZhci5nZXRWYXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZVNldChTdHJpbmcgam9iX2lkLCBTdHJpbmcgdmFyLCBTdHJpbmcgc2V0X2lkKSB7Ci0JCUpvYlZhcmlhYmxlIGpWYXIgPSAoSm9iVmFyaWFibGUpdmFyaWFibGVTdG9yYWdlLmdldFZhbHVlKGpvYl9pZCwgdmFyKTsKLQkJaWYgKGpWYXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghalZhci5jb250YWluU2V0KHNldF9pZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlqVmFyLnJlbW92ZVNldChzZXRfaWQpOwotCQlpZiAoalZhci5nZXRTZXRTaXplKCkgPT0gMCkgewotCQkJdmFyaWFibGVTdG9yYWdlLnJlbW92ZVZhbHVlKGpvYl9pZCwgalZhci5nZXRWYXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvYlZhcmlhYmxlKFN0cmluZyBqb2JfaWQsIFN0cmluZyB2YXIpIHsKLQkJdmFyaWFibGVTdG9yYWdlLnJlbW92ZVZhbHVlKGpvYl9pZCwgdmFyKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlSm9iVmFyaWFibGVzKFN0cmluZyBqb2JfaWQpIHsKLQkJdmFyaWFibGVTdG9yYWdlLnJlbW92ZUpvYlN0b3JhZ2Uoam9iX2lkKTsKLQl9Ci0JcHVibGljIHZvaWQgY2xlYW51cEpvYlZhcmlhYmxlVmFsdWVzKCkgewotCQlmb3IgKFByb2Nlc3NWYWx1ZSBwcm9jVmFsIDogdmFyUHJvY1N0b3JhZ2UuZ2V0Sm9iVmFsdWVDb2xsZWN0aW9uKCkudG9BcnJheShuZXcgUHJvY2Vzc1ZhbHVlWzBdKSkgewotCQkJaWYgKHByb2NWYWwgIT0gbnVsbCkgewotCQkJCSgoUHJvY2Vzc1ZhbHVlKXByb2NWYWwpLmNsZWFuQWxsVmFsdWVzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgY2xlYW51cEpvYlZhcmlhYmxlVmFsdWVzKFN0cmluZyBqb2JfaWQsIEJpdExpc3QgdGFza3MpIHsKLQkJUHJvY2Vzc1ZhbHVlIHByb2NWYWwgPSAoUHJvY2Vzc1ZhbHVlKXZhclByb2NTdG9yYWdlLmdldFZhbHVlKGpvYl9pZCwgUFJPQ0VTU19LRVkpOwotCQlpZiAocHJvY1ZhbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB0YXNrX2lkIDogdGFza3MudG9BcnJheSgpKSB7Ci0JCQkJcHJvY1ZhbC5jbGVhblZhbHVlcyh0YXNrX2lkKTsKLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFyaWFibGVzKFN0cmluZyBqb2JfaWQsIFN0cmluZyBzZXRfaWQsIGJvb2xlYW4gZW5hYmxlKSB7Ci0JCUxpc3Q8U3RyaW5nPiB2YXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSm9iVmFyaWFibGUgalZhciA6IGdldEpvYlZhcmlhYmxlcyhqb2JfaWQpKSB7Ci0JCQlpZiAoalZhci5pc0VuYWJsZSgpID09IGVuYWJsZSAmJiBqVmFyLmNvbnRhaW5TZXQoc2V0X2lkKSkgewotCQkJCXZhcnMuYWRkKGpWYXIuZ2V0VmFyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCXB1YmxpYyB2b2lkIHN0b3JlUHJvY2Vzc1ZhbHVlKFByb2Nlc3NWYWx1ZSBwcm9jVmFsLCBCaXRMaXN0IHRhc2tzLCBTdHJpbmcgdmFyLCBTdHJpbmcgdmFsKSB7Ci0JCWZvciAoaW50IHRhc2tfaWQgOiB0YXNrcy50b0FycmF5KCkpIHsKLQkJCXByb2NWYWwuYWRkVmFsdWUodGFza19pZCwgbmV3IFZhcmlhYmxlVmFsdWUodmFyLCB2YWwpKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGVKb2JWYXJpYWJsZVZhbHVlcyhTdHJpbmcgam9iX2lkLCBTdHJpbmcgc2V0X2lkLCBCaXRMaXN0IHRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc1ZhbHVlIHByb2NWYWwgPSAoUHJvY2Vzc1ZhbHVlKXZhclByb2NTdG9yYWdlLmdldFZhbHVlKGpvYl9pZCwgUFJPQ0VTU19LRVkpOwotCQlpZiAocHJvY1ZhbCAhPSBudWxsKSB7Ci0JCQkvL29ubHkgdXBkYXRlIHdoZW4gY3VycmVudCBzZXQgaWQgY29udGFpbiBpbiBWYXJpYWJsZUluZm8KLQkJCVN0cmluZ1tdIHZhcnMgPSBnZXRWYXJpYWJsZXMoam9iX2lkLCBzZXRfaWQsIHRydWUpOwotCQkJaWYgKHZhcnMubGVuZ3RoID4gMCkgewotCQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gUFRQRGVidWdVSVBsdWdpbi5nZXRVSURlYnVnTWFuYWdlcigpLmdldERlYnVnU2Vzc2lvbihqb2JfaWQpOwkJCQkKLQkJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCS8vZ2V0IHN1c3BlbmRlZCB0YXNrcyBvbmx5IGluIGdpdmVuIGpvYiBhbmQgZ2l2ZW4gc2V0Ci0JCQkJCUJpdExpc3Qgc3VzcGVuZF90YXNrcyA9IHNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuZ2V0U3VzcGVuZGVkVGFza3ModGFza3MpOwotCQkJCQltb25pdG9yLmJlZ2luVGFzaygiVXBkYXRpbmcgdmFyaWFibGVzIHZhbHVlLi4uIiwgKHN1c3BlbmRfdGFza3MuY2FyZGluYWxpdHkoKSAqIHZhcnMubGVuZ3RoICsgMSkpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZm9yIChpbnQgaT0wOyBpPHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQkJSVBESUdldEFJRlJlcXVlc3QgcmVxdWVzdCA9IHNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldFJlcXVlc3RGYWN0b3J5KCkuZ2V0QUlGUmVxdWVzdChzdXNwZW5kX3Rhc2tzLCB2YXJzW2ldKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuZ2V0RXZlbnRSZXF1ZXN0TWFuYWdlcigpLmFkZEV2ZW50UmVxdWVzdChyZXF1ZXN0KTsKLQkJCQkJCQlNYXA8Qml0TGlzdCwgT2JqZWN0PiBtYXAgPSByZXF1ZXN0LmdldFJlc3VsdE1hcChzdXNwZW5kX3Rhc2tzKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yPEJpdExpc3Q+IGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCQkJQml0TGlzdCBzVGFza3MgPSBpdC5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IG1hcC5nZXQoc1Rhc2tzKTsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUFJRikgewotCQkJCQkJCQkJc3RvcmVQcm9jZXNzVmFsdWUocHJvY1ZhbCwgc1Rhc2tzLCB2YXJzW2ldLCAoKElBSUYpdmFsdWUpLmdldFZhbHVlKCkuZ2V0VmFsdWVTdHJpbmcoKSk7Ci0JCQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQkJCXN0b3JlUHJvY2Vzc1ZhbHVlKHByb2NWYWwsIHN1c3BlbmRfdGFza3MsIHZhcnNbaV0sIFZBTFVFX0VSUk9SKTsKLQkJCQkJCX0gY2F0Y2ggKEFJRkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJc3RvcmVQcm9jZXNzVmFsdWUocHJvY1ZhbCwgc3VzcGVuZF90YXNrcywgdmFyc1tpXSwgVkFMVUVfRVJST1IpOwotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSUNvbW1hbmRSZXN1bHQgcmVzdWx0ID0gc2Vzc2lvbi5nZXRFeHByZXNzaW9uVmFsdWUoc3VzcGVuZF90YXNrcywgdmFyc1tpXSk7Ci0JCQkJCQkJQml0TGlzdFtdIHJUYXNrcyA9IHJlc3VsdC5nZXRUYXNrc0FycmF5KCk7Ci0JCQkJCQkJT2JqZWN0W10gclZhbHVlcyA9IHJlc3VsdC5nZXRSZXN1bHRzQXJyYXkoKTsKLQkJCQkJCQkKLQkJCQkJCQlmb3IgKGludCBqPTA7IGo8clRhc2tzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChyVmFsdWVzW2pdIGluc3RhbmNlb2YgSUFJRikgewotCQkJCQkJCQkJc3RvcmVQcm9jZXNzVmFsdWUocHJvY1ZhbCwgclRhc2tzW2pdLCB2YXJzW2ldLCAoKElBSUYpclZhbHVlc1tqXSkuZ2V0VmFsdWUoKS5nZXRWYWx1ZVN0cmluZygpKTsKLQkJCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlzdG9yZVByb2Nlc3NWYWx1ZShwcm9jVmFsLCBzdXNwZW5kX3Rhc2tzLCB2YXJzW2ldLCBWQUxVRV9FUlJPUik7Ci0JCQkJCQl9IGNhdGNoIChBSUZFeGNlcHRpb24gZSkgewotCQkJCQkJCXN0b3JlUHJvY2Vzc1ZhbHVlKHByb2NWYWwsIHN1c3BlbmRfdGFza3MsIHZhcnNbaV0sIFZBTFVFX0VSUk9SKTsKLQkJCQkJCX0KLQkJCQkJCSovCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBKb2JWYXJpYWJsZSB7Ci0JCUlQSm9iIGpvYjsKLQkJU3RyaW5nIHZhcjsKLQkJU3RyaW5nW10gc2V0cyA9IG5ldyBTdHJpbmdbMF07Ci0JCWJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgSm9iVmFyaWFibGUoSVBKb2Igam9iLCBTdHJpbmcgdmFyLCBTdHJpbmdbXSBzZXRzLCBib29sZWFuIGVuYWJsZSkgewotCQkJdGhpcy5qb2IgPSBqb2I7Ci0JCQl0aGlzLnZhciA9IHZhcjsKLQkJCXRoaXMuc2V0cyA9IHNldHM7Ci0JCQl0aGlzLmVuYWJsZSA9IGVuYWJsZTsKLQkJfQotCQlwdWJsaWMgSVBKb2IgZ2V0Sm9iKCkgewotCQkJcmV0dXJuIGpvYjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFZhcigpIHsKLQkJCXJldHVybiB2YXI7Ci0JCX0KLQkJcHVibGljIFN0cmluZ1tdIGdldFNldHMoKSB7Ci0JCQlyZXR1cm4gc2V0czsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZSgpIHsKLQkJCXJldHVybiBlbmFibGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpblNldChTdHJpbmcgc2V0X2lkKSB7Ci0JCQlmb3IgKFN0cmluZyBzZXQgOiBzZXRzKSB7Ci0JCQkJaWYgKHNldC5lcXVhbHMoc2V0X2lkKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkU2V0KFN0cmluZyBzZXRfaWQpIHsKLQkJCVN0cmluZ1tdIG5ld1NldHMgPSBuZXcgU3RyaW5nW3NldHMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNldHMsIDAsIG5ld1NldHMsIDAsIHNldHMubGVuZ3RoKTsKLQkJCW5ld1NldHNbc2V0cy5sZW5ndGhdID0gc2V0X2lkOwotCQkJc2V0U2V0cyhuZXdTZXRzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVTZXQoU3RyaW5nIHNldF9pZCkgewotCQkJU3RyaW5nW10gbmV3U2V0cyA9IG5ldyBTdHJpbmdbc2V0cy5sZW5ndGggLSAxXTsKLQkJCWZvciAoaW50IGk9MCxqPTA7IGk8c2V0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghc2V0c1tpXS5lcXVhbHMoc2V0X2lkKSkgewotCQkJCQluZXdTZXRzW2pdID0gc2V0c1tpXTsKLQkJCQkJaisrOwotCQkJCX0KLQkJCX0KLQkJCXNldFNldHMobmV3U2V0cyk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRTZXRTaXplKCkgewotCQkJcmV0dXJuIHNldHMubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0JCQl0aGlzLnZhciA9IHZhcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRTZXRzKFN0cmluZ1tdIHNldHMpIHsKLQkJCXRoaXMuc2V0cyA9IHNldHM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCQl0aGlzLmVuYWJsZSA9IGVuYWJsZTsKLQkJfQotCX0KLQljbGFzcyBWYXJpYWJsZVZhbHVlIHsKLQkJU3RyaW5nIHZhcjsKLQkJU3RyaW5nIHZhbCA9IFZBTFVFX1VOS05PV047Ci0JCQotCQlWYXJpYWJsZVZhbHVlKFN0cmluZyB2YXIsIFN0cmluZyB2YWwpIHsKLQkJCXRoaXMudmFyID0gdmFyOwotCQkJaWYgKHZhbCAhPSBudWxsKQotCQkJCXRoaXMudmFsID0gdmFsOwotCQl9Ci0JCVN0cmluZyBnZXRWYXIoKSB7Ci0JCQlyZXR1cm4gdmFyOwotCQl9Ci0JCVN0cmluZyBnZXRWYWwoKSB7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCXZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLQkJCXRoaXMudmFyID0gdmFyOwotCQl9Ci0JCXZvaWQgc2V0VmFsKFN0cmluZyB2YWwpIHsKLQkJCXRoaXMudmFsID0gdmFsOwotCQl9Ci0JfQotCWNsYXNzIFByb2Nlc3NWYWx1ZSB7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCU9iamVjdFtdIHByb2Nlc3NWYWx1ZXMgPSBuZXcgT2JqZWN0WzBdOwotCQkKLQkJUHJvY2Vzc1ZhbHVlKGludCB0b3RhbCkgewotCQkJdGhpcy50b3RhbCA9IHRvdGFsOwotCQkJcHJvY2Vzc1ZhbHVlcyA9IG5ldyBPYmplY3RbdG90YWxdOwotCQl9Ci0JCXZvaWQgY2hlY2tWYWxpZFRhc2soaW50IHRhc2tfaWQpIHsKLQkJCWlmICh0YXNrX2lkID4gcHJvY2Vzc1ZhbHVlcy5sZW5ndGgpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0YXNrIGlkIik7IAotCQl9Ci0JCXZvaWQgc2V0VmFsdWVzKGludCB0YXNrX2lkLCBWYXJpYWJsZVZhbHVlW10gdmFsdWVzKSB7Ci0JCQljaGVja1ZhbGlkVGFzayh0YXNrX2lkKTsKLQkJCXByb2Nlc3NWYWx1ZXNbdGFza19pZF0gPSB2YWx1ZXM7Ci0JCX0KLQkJVmFyaWFibGVWYWx1ZVtdIGdldFZhbHVlcyhpbnQgdGFza19pZCkgewotCQkJY2hlY2tWYWxpZFRhc2sodGFza19pZCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gcHJvY2Vzc1ZhbHVlc1t0YXNrX2lkXTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJsZVZhbHVlW10pIHsKLQkJCQlyZXR1cm4gKFZhcmlhYmxlVmFsdWVbXSlvYmplY3Q7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFZhcmlhYmxlVmFsdWVbMF07Ci0JCX0KLQkJdm9pZCBhZGRWYWx1ZShpbnQgdGFza19pZCwgVmFyaWFibGVWYWx1ZSB2YWx1ZSkgewotCQkJVmFyaWFibGVWYWx1ZVtdIHZhbHVlcyA9IGdldFZhbHVlcyh0YXNrX2lkKTsKLQkJCVZhcmlhYmxlVmFsdWVbXSBuZXdWYWx1ZXMgPSBuZXcgVmFyaWFibGVWYWx1ZVt2YWx1ZXMubGVuZ3RoICsgMV07Ci0JCQlpZiAodmFsdWVzLmxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywgMCwgbmV3VmFsdWVzLCAwLCB2YWx1ZXMubGVuZ3RoKTsKLQkJCX0KLQkJCW5ld1ZhbHVlc1t2YWx1ZXMubGVuZ3RoXSA9IHZhbHVlOwotCQkJc2V0VmFsdWVzKHRhc2tfaWQsIG5ld1ZhbHVlcyk7Ci0JCX0KLQkJdm9pZCB1cGRhdGVWYWx1ZShpbnQgdGFza19pZCwgVmFyaWFibGVWYWx1ZSB2YWx1ZSkgewotCQkJZm9yIChWYXJpYWJsZVZhbHVlIHYgOiBnZXRWYWx1ZXModGFza19pZCkpIHsKLQkJCQlpZiAodi5nZXRWYXIoKS5lcXVhbHModmFsdWUuZ2V0VmFyKCkpKSB7Ci0JCQkJCXYuc2V0VmFsKHZhbHVlLmdldFZhbCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdm9pZCBjbGVhblZhbHVlcyhpbnQgdGFza19pZCkgewotCQkJcHJvY2Vzc1ZhbHVlc1t0YXNrX2lkXSA9IG51bGw7Ci0JCX0KLQkJdm9pZCBjbGVhbkFsbFZhbHVlcygpIHsKLQkJCXByb2Nlc3NWYWx1ZXMgPSBuZXcgT2JqZWN0W3RvdGFsXTsgCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QVFBEZWJ1Z1BlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUFRQRGVidWdQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhNmRjMi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QVFBEZWJ1Z1BlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFBEZWJ1Z1BlcnNwZWN0aXZlRmFjdG9yeSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLSAJCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQotCQlJRm9sZGVyTGF5b3V0IGZvbGRlcjE9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbSIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KTAuOCwgZWRpdG9yQXJlYSk7Ci0JCWZvbGRlcjEuYWRkVmlldyhJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQlmb2xkZXIxLmFkZFZpZXcoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLk1lbW9yeVZpZXciKTsKLQkJZm9sZGVyMS5hZGRWaWV3KCJvcmcuZWNsaXBzZS5wZGUucnVudGltZS5Mb2dWaWV3Iik7Ci0JCQotCQlJRm9sZGVyTGF5b3V0IGZvbGRlcjI9IGxheW91dC5jcmVhdGVGb2xkZXIoInRvcExlZnRVcCIsIElQYWdlTGF5b3V0LlRPUCwgKGZsb2F0KTAuNSwgZWRpdG9yQXJlYSk7Ci0JCWZvbGRlcjIuYWRkVmlldyhJUFRQRGVidWdVSUNvbnN0YW50cy5JRF9WSUVXX1BBUkFMTEVMREVCVUcpOwotCi0JCUlGb2xkZXJMYXlvdXQgZm9sZGVyND0gbGF5b3V0LmNyZWF0ZUZvbGRlcigidG9wUmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KTAuNiwgInRvcExlZnRVcCIpOwotCQlmb2xkZXI0LmFkZFZpZXcoSURlYnVnVUlDb25zdGFudHMuSURfQlJFQUtQT0lOVF9WSUVXKTsKLQkJZm9sZGVyNC5hZGRWaWV3KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0VYUFJFU1NJT05fVklFVyk7Ci0JCWZvbGRlcjQuYWRkVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9WQVJJQUJMRV9WSUVXKTsKLQkJZm9sZGVyNC5hZGRWaWV3KElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZJRVdfU0lHTkFMKTsKLQkJZm9sZGVyNC5hZGRWaWV3KElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZJRVdfQVJSQVkpOwotCQlmb2xkZXI0LmFkZFZpZXcoSVBUUERlYnVnVUlDb25zdGFudHMuSURfVklFV19WQVJJQUJMRSk7Ci0KLQkJSUZvbGRlckxheW91dCBmb2xkZXIzPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BMZWZ0RG93biIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KTAuNiwgInRvcExlZnRVcCIpOwotCQlmb2xkZXIzLmFkZFZpZXcoSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVyk7Ci0KLQkJSUZvbGRlckxheW91dCBmb2xkZXI1PSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJyaWdodCIsIElQYWdlTGF5b3V0LlJJR0hULChmbG9hdCkwLjgsIGVkaXRvckFyZWEpOwotCQlmb2xkZXI1LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCQotCQkvLyBzZXQgdG9vbGJhciBvciBtZW51IGljb24KLQkJLy9sYXlvdXQuYWRkQWN0aW9uU2V0KElEZWJ1Z1VJQ29uc3RhbnRzLkxBVU5DSF9BQ1RJT05fU0VUKTsKLQkJLy9sYXlvdXQuYWRkQWN0aW9uU2V0KElQVFBVSUNvbnN0YW50cy5BQ1RJT05fU0VUKTsKLQkJCi0JCS8vIHZpZXdzIC0gc2hvcnQgY3V0Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElDb25zb2xlQ29uc3RhbnRzLklEX0NPTlNPTEVfVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5NZW1vcnlWaWV3Iik7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KE5ld1NlYXJjaFVJLlNFQVJDSF9WSUVXX0lEKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBUUERlYnVnVUlDb25zdGFudHMuSURfVklFV19QQVJBTExFTERFQlVHKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBUUERlYnVnVUlDb25zdGFudHMuSURfVklFV19BUlJBWSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZJRVdfU0lHTkFMKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBUUERlYnVnVUlDb25zdGFudHMuSURfVklFV19WQVJJQUJMRSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0JSRUFLUE9JTlRfVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZBUklBQkxFX1ZJRVcpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCS8vbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUuTG9nVmlldyIpOwotCi0JCS8vIGxpbmsgLSB0aGluZ3Mgd2Ugc2hvdWxkIGRvCi0JCWxheW91dC5hZGRTaG93SW5QYXJ0KElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZJRVdfUEFSQUxMRUxERUJVRyk7Ci0JCWxheW91dC5hZGRTaG93SW5QYXJ0KElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZJRVdfQVJSQVkpOwotCQlsYXlvdXQuYWRkU2hvd0luUGFydChJUFRQRGVidWdVSUNvbnN0YW50cy5JRF9WSUVXX1NJR05BTCk7Ci0JCWxheW91dC5hZGRTaG93SW5QYXJ0KElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1ZJRVdfVkFSSUFCTEUpOwotCQlsYXlvdXQuYWRkU2hvd0luUGFydChJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJLy9sYXlvdXQuYWRkU2hvd0luUGFydChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QVmFsdWVEZXRhaWxQcm92aWRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUFZhbHVlRGV0YWlsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiYWY2OC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QVmFsdWVEZXRhaWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSVZhbHVlRGV0YWlsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQVmFsdWU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQVmFsdWVEZXRhaWxQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUFZhbHVlRGV0YWlsUHJvdmlkZXIgZkluc3RhbmNlID0gbnVsbDsKLQotCS8qKiBHZXQgaW5zdGFuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQVmFsdWVEZXRhaWxQcm92aWRlciBnZXREZWZhdWx0KCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBQVmFsdWVEZXRhaWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCS8qKiBDb21wdXRlIGRldGFpbAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXB1dGVEZXRhaWwoZmluYWwgSVZhbHVlIHZhbHVlLCBmaW5hbCBJVmFsdWVEZXRhaWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJUFZhbHVlKSB7Ci0JCQlmaW5hbCBJUFN0YWNrRnJhbWUgZnJhbWUgPSBQRGVidWdVSVV0aWxzLmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7Ci0JCQlpZiAoZnJhbWUgIT0gbnVsbCkgewotCQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0ZW5lci5kZXRhaWxDb21wdXRlZCh2YWx1ZSwgKChJUFZhbHVlKSB2YWx1ZSkuZXZhbHVhdGVBc0V4cHJlc3Npb24oZnJhbWUpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUFZhcmlhYmxlTWFuYWdlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUFZhcmlhYmxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTUzNDc4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1BWYXJpYWJsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5QVFBEZWJ1Z0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLklQRElTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUucGRpLm1vZGVsLklQRElFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuQUlGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuSVRvb2xUaXBQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQVmFyaWFibGVNYW5hZ2VyIHsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8UFZhcmlhYmxlSW5mbz4+IGpvYlZhcmlhYmxlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8UFZhcmlhYmxlSW5mbz4+KCk7Ci0JcHJpdmF0ZSBVcGRhdGVWYXJpYWJsZUpvYiB1cFZhcmlhYmxlSm9iID0gbmV3IFVwZGF0ZVZhcmlhYmxlSm9iKCk7Ci0JCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWpvYlZhcmlhYmxlTWFwLmNsZWFyKCk7Ci0JCXVwVmFyaWFibGVKb2IuY2FuY2VsQWxsKCk7Ci0JfQotCXB1YmxpYyBQVmFyaWFibGVJbmZvW10gZ2V0UFZhcmlhYmxlSW5mbygpIHsKLQkJTGlzdDxQVmFyaWFibGVJbmZvPiBhTGlzdCA9IG5ldyBBcnJheUxpc3Q8UFZhcmlhYmxlSW5mbz4oKTsKLQkJZm9yIChJdGVyYXRvcjxMaXN0PFBWYXJpYWJsZUluZm8+PiBpPWpvYlZhcmlhYmxlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJYUxpc3QuYWRkQWxsKGkubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gYUxpc3QudG9BcnJheShuZXcgUFZhcmlhYmxlSW5mb1swXSk7Ci0JfQotCXB1YmxpYyBQVmFyaWFibGVJbmZvW10gZ2V0UFZhcmlhYmxlSW5mbyhJUEpvYiBqb2IpIHsKLQkJTGlzdDxQVmFyaWFibGVJbmZvPiBpbmZvTGlzdCA9IGpvYlZhcmlhYmxlTWFwLmdldChqb2IuZ2V0SUQoKSk7Ci0JCWlmIChpbmZvTGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBQVmFyaWFibGVJbmZvWzBdOwotCi0JCXJldHVybiBpbmZvTGlzdC50b0FycmF5KG5ldyBQVmFyaWFibGVJbmZvWzBdKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNQVmFyaWFibGVFbmFibGUoSVBKb2Igam9iLCBTdHJpbmcgdmFybmFtZSkgewotCQlMaXN0PFBWYXJpYWJsZUluZm8+IGluZm9MaXN0ID0gam9iVmFyaWFibGVNYXAuZ2V0KGpvYi5nZXRJRCgpKTsKLQkJaWYgKGluZm9MaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoUFZhcmlhYmxlSW5mbyBpbmZvIDogaW5mb0xpc3QudG9BcnJheShuZXcgUFZhcmlhYmxlSW5mb1swXSkpIHsKLQkJCQlpZiAoaW5mby5nZXROYW1lKCkuZXF1YWxzKHZhcm5hbWUpKQotCQkJCQlyZXR1cm4gaW5mby5pc0VuYWJsZWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyB2b2lkIHVwZGF0ZVZhcmlhYmxlU3RhdHVzKFBWYXJpYWJsZUluZm8gaW5mbywgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWluZm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZ2V0U2Vzc2lvbihpbmZvLmdldEpvYigpKS5nZXRQRElTZXNzaW9uKCkuZ2V0RXhwcmVzc2lvbk1hbmFnZXIoKS51cGRhdGVTdGF0dXNNdWx0aUV4cHJlc3Npb25zKGluZm8uZ2V0TmFtZSgpLCBlbmFibGVkKTsKLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlVmFyaWFibGVTdGF0dXMoSVBKb2Igam9iLCBTdHJpbmcgdmFybmFtZSwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBWYXJpYWJsZUluZm8gaW5mbyA9IGZpbmRWYXJpYWJsZUluZm8oam9iLCB2YXJuYW1lKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsICJWYXJpYWJsZSAiICsgdmFybmFtZSArICIgaXMgbm90IGV4aXN0ZWQuIiwgbnVsbCkpOwotCi0JCXVwZGF0ZVZhcmlhYmxlU3RhdHVzKGluZm8sIGVuYWJsZWQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZShJUEpvYiBqb2IsIFN0cmluZyB2YXJuYW1lLCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbmRWYXJpYWJsZUluZm8oam9iLCB2YXJuYW1lKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIlZhcmlhYmxlICIgKyB2YXJuYW1lICsgIiBpcyBhbHJlYWR5IGV4aXN0ZWQuIiwgbnVsbCkpOwotCQkKLQkJTGlzdDxQVmFyaWFibGVJbmZvPiBpbmZvTGlzdCA9IGpvYlZhcmlhYmxlTWFwLmdldChqb2IuZ2V0SUQoKSk7Ci0JCWlmIChpbmZvTGlzdCA9PSBudWxsKSB7Ci0JCQlpbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8UFZhcmlhYmxlSW5mbz4oKTsKLQkJCWpvYlZhcmlhYmxlTWFwLnB1dChqb2IuZ2V0SUQoKSwgaW5mb0xpc3QpOwotCQl9Ci0JCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbihqb2IpOwotCQlzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRFeHByZXNzaW9uTWFuYWdlcigpLmNyZWF0ZU11dGxpRXhwcmVzc2lvbnMoc2Vzc2lvbi5nZXRUYXNrcygpLCB2YXJuYW1lLCBlbmFibGVkKTsKLQkJaW5mb0xpc3QuYWRkKG5ldyBQVmFyaWFibGVJbmZvKGpvYiwgdmFybmFtZSwgZW5hYmxlZCkpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVWYXJpYWJsZShJUEpvYiBqb2IpIHsKLQkJcmVtb3ZlVmFyaWFibGUoam9iLmdldElEKCkpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVWYXJpYWJsZShTdHJpbmcgam9iX2lkKSB7Ci0JCWpvYlZhcmlhYmxlTWFwLnJlbW92ZShqb2JfaWQpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVWYXJpYWJsZShJUEpvYiBqb2IsIFN0cmluZyB2YXJuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBWYXJpYWJsZUluZm8gaW5mbyA9IGZpbmRWYXJpYWJsZUluZm8oam9iLCB2YXJuYW1lKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsICJWYXJpYWJsZSAiICsgdmFybmFtZSArICIgaXMgbm90IGV4aXN0ZWQuIiwgbnVsbCkpOwotCi0JCWpvYlZhcmlhYmxlTWFwLmdldChqb2IuZ2V0SUQoKSkucmVtb3ZlKGluZm8pOwotCQlnZXRTZXNzaW9uKGpvYikuZ2V0UERJU2Vzc2lvbigpLmdldEV4cHJlc3Npb25NYW5hZ2VyKCkucmVtb3ZlTXV0bGlFeHByZXNzaW9ucyh2YXJuYW1lKTsKLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlVmFyaWFibGUoSVBKb2Igam9iLCBTdHJpbmcgdmFybmFtZSwgU3RyaW5nIG5ld3Zhcm5hbWUsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobmV3dmFybmFtZSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVWYXJpYWJsZShqb2IsIHZhcm5hbWUpOwotCQkJYWRkVmFyaWFibGUoam9iLCBuZXd2YXJuYW1lLCBlbmFibGVkKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVZhcmlhYmxlU3RhdHVzKGpvYiwgdmFybmFtZSwgZW5hYmxlZCk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlVmFsdWVzKElQSm9iIGpvYikgewotCQl0cnkgewotCQkJdXBkYXRlVmFsdWVzKGpvYiwgZ2V0U2Vzc2lvbihqb2IpLmdldFRhc2tzKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGVWYWx1ZXMoZmluYWwgSVBKb2Igam9iLCBmaW5hbCBCaXRMaXN0IHRhc2tzKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJICB0cnkgewotCQkJCQkgIElQRElTZXNzaW9uIHNlc3Npb24gPSBnZXRTZXNzaW9uKGpvYikuZ2V0UERJU2Vzc2lvbigpOwotCQkJCQkgIEJpdExpc3QgdGFyZ2V0VGFza3MgPSBzZXNzaW9uLmdldFRhc2tNYW5hZ2VyKCkuZ2V0U3VzcGVuZGVkVGFza3ModGFza3MpOwotCQkJCQkgIGlmICh0YXJnZXRUYXNrcy5pc0VtcHR5KCkpCi0JCQkJCQkgIG1vbml0b3IuZG9uZSgpOwotCQkJCQkgIGVsc2UKLQkJCQkJCSAgc2Vzc2lvbi5nZXRFeHByZXNzaW9uTWFuYWdlcigpLnVwZGF0ZU11bHRpRXhwcmVzc2lvbnModGFyZ2V0VGFza3MsIG1vbml0b3IpOwotCQkJCSAgfQotCQkJCSAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oY2UuZ2V0TWVzc2FnZSgpKTsKLQkJCQkgIH0KLQkJCQkgIGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQkgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJICB9Ci0JCQkgIH0KLQkJfTsKLQkJdHJ5IHsKLQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coUFRQRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGllKSB7Ci0JCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKGZpbmFsIElQSm9iIGpvYiwgZmluYWwgaW50IHRhc2ssIGZpbmFsIElUb29sVGlwUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJdHJ5IHsKLQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbihqb2IpOwotCQkJSVBESUV4cHJlc3Npb25bXSBleHByZXNzaW9ucyA9IHNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldEV4cHJlc3Npb25NYW5hZ2VyKCkuZ2V0TXVsdGlFeHByZXNzaW9ucyh0YXNrKTsKLQkJCWlmIChleHByZXNzaW9ucyA9PSBudWxsIHx8IGV4cHJlc3Npb25zLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiAiIjsKLQotCQkJSVBQcm9jZXNzIHAgPSBqb2IuZ2V0UHJvY2Vzc0J5SW5kZXgodGFzayk7Ci0JCQlpZiAocCA9PSBudWxsIHx8IHAuZ2V0U3RhdGUoKSAhPSBQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5TVVNQRU5ERUQpCi0JCQkJcmV0dXJuICIiOwotCQkJCi0JCQlTdHJpbmdCdWZmZXIgZGlzcGxheSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoSVBESUV4cHJlc3Npb24gZXhwcmVzc2lvbiA6IGV4cHJlc3Npb25zKSB7Ci0JCQkJZGlzcGxheS5hcHBlbmQoIjxpPiIpOwotCQkJCWRpc3BsYXkuYXBwZW5kKGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblRleHQoKSk7Ci0JCQkJZGlzcGxheS5hcHBlbmQoIjwvaT4iKTsKLQkJCQlkaXNwbGF5LmFwcGVuZCgiID0gIik7Ci0JCQkJdHJ5IHsKLQkJCQkJSUFJRiBhaWYgPSBleHByZXNzaW9uLmdldEFJRigpOwotCQkJCQlpZiAoYWlmID09IG51bGwpIHsKLQkJCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJCQkgIHRyeSB7Ci0JCQkJCQkJCQkgIElQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbihqb2IpOwotCQkJCQkJCQkJICBzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRFeHByZXNzaW9uTWFuYWdlcigpLnVwZGF0ZU11bHRpRXhwcmVzc2lvbnMoc2Vzc2lvbi5nZXRUYXNrcyh0YXNrKSwgbW9uaXRvcik7Ci0JCQkJCQkJCSAgfQotCQkJCQkJCQkgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCQkgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihjZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkgIH0KLQkJCQkJCQkJICBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCSAgLy90aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkgIH0KLQkJCQkJCQkJICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJCQkJCQkJCSAgcHJvdmlkZXIudXBkYXRlKG51bGwsIGdldFZhbHVlKGpvYiwgdGFzaywgbnVsbCkpOwotCQkJCQkJCSAgfQotCQkJCQkJfTsKLQkJCQkJCXF1ZXVlUnVubmFibGUocnVubmFibGUpOwotCQkJCQkJZGlzcGxheS5hcHBlbmQoIlBlbmRpbmcuLi4iKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWRpc3BsYXkuYXBwZW5kKGFpZi5nZXRWYWx1ZSgpLmdldFZhbHVlU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJCQlkaXNwbGF5LmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChBSUZFeGNlcHRpb24gYWUpIHsKLQkJCQkJZGlzcGxheS5hcHBlbmQoYWUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJZGlzcGxheS5hcHBlbmQoIjxicj4iKTsKLQkJCX0KLQkJCXJldHVybiBkaXNwbGF5LnRvU3RyaW5nKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCByZXNldFZhbHVlcyhmaW5hbCBJUEpvYiBqb2IpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCSAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkgIHRyeSB7Ci0JCQkJCSAgSVBTZXNzaW9uIHNlc3Npb24gPSBnZXRTZXNzaW9uKGpvYik7Ci0JCQkJCSAgc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuZ2V0RXhwcmVzc2lvbk1hbmFnZXIoKS5jbGVhbk11bHRpRXhwcmVzc2lvbnMoc2Vzc2lvbi5nZXRUYXNrcygpLCBtb25pdG9yKTsKLQkJCQkgIH0KLQkJCQkgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCSAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGNlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJICB9Ci0JCQkJICBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCQkJICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCSAgfQotCQkJICB9Ci0JCX07Ci0JCXF1ZXVlUnVubmFibGUocnVubmFibGUpOwotCX0KLQlwdWJsaWMgdm9pZCByZXNldFZhbHVlKGZpbmFsIElQSm9iIGpvYiwgZmluYWwgQml0TGlzdCB0YXNrcykgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCSAgdHJ5IHsKLQkJCQkJICBJUFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oam9iKTsKLQkJCQkJICBzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRFeHByZXNzaW9uTWFuYWdlcigpLmNsZWFuTXVsdGlFeHByZXNzaW9ucyh0YXNrcywgbW9uaXRvcik7Ci0JCQkJICB9Ci0JCQkJICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihjZS5nZXRNZXNzYWdlKCkpOwotCQkJCSAgfQotCQkJCSAgY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCSAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkgIH0KLQkJCSAgfQotCQl9OwotCQlxdWV1ZVJ1bm5hYmxlKHJ1bm5hYmxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQVmFyaWFibGVJbmZvIGZpbmRWYXJpYWJsZUluZm8oSVBKb2Igam9iLCBTdHJpbmcgdmFybmFtZSkgewotCQlMaXN0PFBWYXJpYWJsZUluZm8+IGluZm9MaXN0ID0gam9iVmFyaWFibGVNYXAuZ2V0KGpvYi5nZXRJRCgpKTsKLQkJaWYgKGluZm9MaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoUFZhcmlhYmxlSW5mbyBpbmZvIDogaW5mb0xpc3QudG9BcnJheShuZXcgUFZhcmlhYmxlSW5mb1swXSkpIHsKLQkJCQlpZiAoaW5mby5nZXROYW1lKCkuZXF1YWxzKHZhcm5hbWUpKSB7Ci0JCQkJCXJldHVybiBpbmZvOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBJUFNlc3Npb24gZ2V0U2Vzc2lvbihJUEpvYiBqb2IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBTZXNzaW9uIHNlc3Npb24gPSBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVidWdNb2RlbCgpLmdldFNlc3Npb24oam9iKTsKLQkJaWYgKHNlc3Npb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsICJObyBzZXNzaW9uIGZvdW5kLiIsIG51bGwpKTsKLQkJCi0JCXJldHVybiBzZXNzaW9uOwotCX0KLQlwdWJsaWMgY2xhc3MgUFZhcmlhYmxlSW5mbyB7Ci0JCXByaXZhdGUgSVBKb2Igam9iOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQkJCi0JCXB1YmxpYyBQVmFyaWFibGVJbmZvKElQSm9iIGpvYiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gZW5hYmxlZCkgewotCQkJdGhpcy5qb2IgPSBqb2I7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQkJfQotCQlwdWJsaWMgSVBKb2IgZ2V0Sm9iKCkgewotCQkJcmV0dXJuIGpvYjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gZW5hYmxlZDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQkJfQotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIE5vdGlmeSBKb2IKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZVJ1bm5hYmxlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgewotCQl1cFZhcmlhYmxlSm9iLmFkZFJ1bm5hYmxlKHJ1bm5hYmxlKTsKLQl9Ci0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVWYXJpYWJsZUpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgVmVjdG9yPElSdW5uYWJsZVdpdGhQcm9ncmVzcz4gZlJ1bm5hYmxlczsKLQkJcHVibGljIFVwZGF0ZVZhcmlhYmxlSm9iKCkgewotCQkJc3VwZXIoIlBUUCBWYXJpYWJsZSBKb2IiKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCWZSdW5uYWJsZXMgPSBuZXcgVmVjdG9yPElSdW5uYWJsZVdpdGhQcm9ncmVzcz4oMTApOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNhbmNlbEFsbCgpIHsKLQkJCWZSdW5uYWJsZXMuY2xlYXIoKTsKLQkJCXN1cGVyLmNhbmNlbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFJ1bm5hYmxlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgewotCQkJc3luY2hyb25pemVkIChmUnVubmFibGVzKSB7Ci0JCQkJZlJ1bm5hYmxlcy5hZGQocnVubmFibGUpOwotCQkJfQotCQkJc2NoZWR1bGUoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlyZXR1cm4gIWZSdW5uYWJsZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzc1tdIHJ1bm5hYmxlczsKLQkJCXN5bmNocm9uaXplZCAoZlJ1bm5hYmxlcykgewotCQkJCXJ1bm5hYmxlcyA9IGZSdW5uYWJsZXMudG9BcnJheShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzWzBdKTsKLQkJCQlmUnVubmFibGVzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlNdWx0aVN0YXR1cyBmYWlsZWQgPSBudWxsOwotCQkJbW9uaXRvci5iZWdpblRhc2soZ2V0TmFtZSgpLCBydW5uYWJsZXMubGVuZ3RoKTsKLQkJCWZvciAoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlIDogcnVubmFibGVzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKGZhaWxlZCA9PSBudWxsKQotCQkJCQkJZmFpbGVkID0gbmV3IE11bHRpU3RhdHVzKFBUUERlYnVnQ29yZVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBUUERlYnVnQ29yZVBsdWdpbi5JTlRFUk5BTF9FUlJPUiwgIkV2ZW50IG5vdGlmeSBlcnJvciIsIG51bGwpOwotCQkJCQlmYWlsZWQuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgUFRQRGVidWdDb3JlUGx1Z2luLklOVEVSTkFMX0VSUk9SLCAiRXZlbnQgbm90aWZ5IGVycm9yIiwgZSkpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJaWYgKGZhaWxlZCA9PSBudWxsKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCi0JCQlyZXR1cm4gZmFpbGVkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUFdhdGNoRXhwcmVzc2lvbkRlbGVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QV2F0Y2hFeHByZXNzaW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4M2QwNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QV2F0Y2hFeHByZXNzaW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVdhdGNoRXhwcmVzc2lvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVdhdGNoRXhwcmVzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVdhdGNoRXhwcmVzc2lvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgUFdhdGNoRXhwcmVzc2lvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdhdGNoRXhwcmVzc2lvbkRlbGVnYXRlIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVdhdGNoRXhwcmVzc2lvbkRlbGVnYXRlI2V2YWx1YXRlRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z0VsZW1lbnQsIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVdhdGNoRXhwcmVzc2lvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGV2YWx1YXRlRXhwcmVzc2lvbihmaW5hbCBTdHJpbmcgZXhwcmVzc2lvbiwgSURlYnVnRWxlbWVudCBjb250ZXh0LCBmaW5hbCBJV2F0Y2hFeHByZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIElQU3RhY2tGcmFtZSkpIHsKLQkJCWxpc3RlbmVyLndhdGNoRXZhbHVhdGlvbkZpbmlzaGVkKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIElQU3RhY2tGcmFtZSBmcmFtZSA9IChJUFN0YWNrRnJhbWUpIGNvbnRleHQ7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlWYWx1ZSB2YWx1ZSA9IG51bGw7Ci0JCQkJRGVidWdFeGNlcHRpb24gZGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXZhbHVlID0gZnJhbWUuZXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQkJCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJZGUgPSBlOwotCQkJCX0KLQkJCQlJV2F0Y2hFeHByZXNzaW9uUmVzdWx0IHJlc3VsdCA9IGV2YWx1YXRpb25Db21wbGV0ZShleHByZXNzaW9uLCB2YWx1ZSwgZGUpOwotCQkJCWxpc3RlbmVyLndhdGNoRXZhbHVhdGlvbkZpbmlzaGVkKHJlc3VsdCk7Ci0JCQl9Ci0JCX07Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCS8qKiBHZXQgd2F0Y2ggZXhwcmVzc2lvbiByZXN1bHQKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBkZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdhdGNoRXhwcmVzc2lvblJlc3VsdCBldmFsdWF0aW9uQ29tcGxldGUoZmluYWwgU3RyaW5nIGV4cHJlc3Npb24sIGZpbmFsIElWYWx1ZSB2YWx1ZSwgZmluYWwgRGVidWdFeGNlcHRpb24gZGUpIHsKLQkJcmV0dXJuIG5ldyBJV2F0Y2hFeHByZXNzaW9uUmVzdWx0KCkgewotCQkJcHVibGljIElWYWx1ZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0JCQkJcmV0dXJuIChkZSAhPSBudWxsKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblRleHQoKSB7Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JV2F0Y2hFeHByZXNzaW9uUmVzdWx0I2dldEV4Y2VwdGlvbigpCi0JCQkgKi8KLQkJCXB1YmxpYyBEZWJ1Z0V4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCQkJcmV0dXJuIGRlOwotCQkJfQotCQkJcHVibGljIFN0cmluZ1tdIGdldEVycm9yTWVzc2FnZXMoKSB7Ci0JCQkJcmV0dXJuIChkZSAhPSBudWxsKSA/IG5ldyBTdHJpbmdbXSB7IGRlLmdldE1lc3NhZ2UoKSB9IDogbmV3IFN0cmluZ1swXTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QaXhlbENvbnZlcnRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvUGl4ZWxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwZDMwZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9QaXhlbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQaXhlbENvbnZlcnRlciB7Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJc2V0Rm9udE1ldHJpY3MoZ2MuZ2V0Rm9udE1ldHJpY3MoKSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhnZXRGb250TWV0cmljcygpLCBjaGFycyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhnZXRGb250TWV0cmljcygpLCBkbHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoaW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGdldEZvbnRNZXRyaWNzKCksIGRsdXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2NvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpbnQpCi0JICovCi0JcHVibGljIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGdldEZvbnRNZXRyaWNzKCksIGNoYXJzKTsKLQl9Ci0KLQlwcml2YXRlIEZvbnRNZXRyaWNzIGdldEZvbnRNZXRyaWNzKCkgewotCQlyZXR1cm4gdGhpcy5mRm9udE1ldHJpY3M7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZvbnRNZXRyaWNzKEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzKSB7Ci0JCXRoaXMuZkZvbnRNZXRyaWNzID0gZm9udE1ldHJpY3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvU1dUVXRpbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc5MDc5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhcmV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlzcGxheSB0byBiZSB1c2VkLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcywgaWYgdGhlCi0JICogdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaGFzIGFuIGFzc29jaWF0ZWQgZGlzYXBseS4gSWYgc28sIHRoaXMKLQkgKiBkaXNwbGF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoZWxsIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0LiBJZiB0aGUgd2lkZ2V0IGRvZXNuJ3QgcmVwcmVzZW50Ci0JICogYSBTV1Qgb2JqZWN0IHRoYXQgbWFuYWdlIGEgc2hlbGwsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoZWxsIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbChXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKQotCQkJcmV0dXJuICgoQ29udHJvbCl3aWRnZXQpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDYXJldCkKLQkJCXJldHVybiAoKENhcmV0KXdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIERyYWdTb3VyY2UpCi0JCQlyZXR1cm4gKChEcmFnU291cmNlKXdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBEcm9wVGFyZ2V0KQotCQkJcmV0dXJuICgoRHJvcFRhcmdldCl3aWRnZXQpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgTWVudSkKLQkJCXJldHVybiAoKE1lbnUpd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgU2Nyb2xsQmFyKQotCQkJcmV0dXJuICgoU2Nyb2xsQmFyKXdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJUGl4ZWxDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKGJ1dHRvbik7Ci0JCWludCB3aWR0aEhpbnQgPSBjb252ZXJ0ZXIuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGVpZ2h0IGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIGludCBnZXRCdXR0b25IZWlndGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLS8vCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoYnV0dG9uKTsKLS8vCQlyZXR1cm4gY29udmVydGVyLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9IRUlHSFQpOwotLy8JfQotCi0JLyoqCi0JICogU2V0cyB3aWR0aCBhbmQgaGVpZ2h0IGhpbnQgZm9yIHRoZSBidXR0b24gY29udHJvbC4gPGI+Tm90ZTo8L2I+IFRoaXMKLQkgKiBpcyBhIE5PUCBpZiB0aGUgYnV0dG9uJ3MgbGF5b3V0IGRhdGEgaXMgbm90IGFuIGluc3RhbmNlIG9mIDxjb2RlPkdyaWREYXRhPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlIGJ1dHRvbiBmb3Igd2hpY2ggdG8gc2V0IHRoZSBkaW1lbnNpb24gaGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCdXR0b25EaW1lbnNpb25IaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChidXR0b24pOwotCQlPYmplY3QgZ2QgPSBidXR0b24uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZ2QgaW5zdGFuY2VvZiBHcmlkRGF0YSkgewotCQkJKChHcmlkRGF0YSlnZCkud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGJ1dHRvbik7Ci0JCQkoKEdyaWREYXRhKWdkKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsJIAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvVUlEZWJ1Z01hbmFnZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL1VJRGVidWdNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjAzZjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvVUlEZWJ1Z01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUubW9kZWwuSUNMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5EZWJ1Z0pvYlN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBEZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlByb2Nlc3NJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5QRElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5PdXRwdXRDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2Vycy5Kb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuSVRvb2xUaXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVJRGVidWdNYW5hZ2VyIGV4dGVuZHMgSm9iTWFuYWdlciBpbXBsZW1lbnRzIElCcmVha3BvaW50TGlzdGVuZXIgewotCXByaXZhdGUgaW50ZXJmYWNlIElEZWJ1Z1Byb2dyZXNzTW9uaXRvciB7Ci0JCUlTdGF0dXMgcnVuRGVidWdKb2IoSVBKb2Igam9iLCBJUFNlc3Npb24gc2Vzc2lvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBVSURlYnVnV29ya2JlbmNoSm9iIGV4dGVuZHMgV29ya2JlbmNoSm9iIHsKLQkJcHJpdmF0ZSBJUEpvYiBqb2IgPSBudWxsOwotCQlwcml2YXRlIElQU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBJRGVidWdQcm9ncmVzc01vbml0b3IgZGVidWdNb25pdG9yID0gbnVsbDsKLQkJcHVibGljIFVJRGVidWdXb3JrYmVuY2hKb2IoYm9vbGVhbiBydW5JbkRpYWxvZywgU3RyaW5nIG5hbWUsIElQSm9iIGpvYiwgSURlYnVnUHJvZ3Jlc3NNb25pdG9yIGRlYnVnTW9uaXRvcikgewotCQkJc3VwZXIobmFtZSk7Ci0JCQl0aGlzLmpvYiA9IGpvYjsKLQkJCXRoaXMuZGVidWdNb25pdG9yID0gZGVidWdNb25pdG9yOwotCQkJaWYgKHJ1bkluRGlhbG9nKQotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuc2hvd0luRGlhbG9nKG51bGwsIHRoaXMpOwotCQkJc2NoZWR1bGUoKTsKLQkJfQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIGRlYnVnTW9uaXRvci5ydW5EZWJ1Z0pvYihqb2IsIHNlc3Npb24sIG1vbml0b3IpOwotCQl9Ci0JICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkgICAgCXNlc3Npb24gPSBnZXREZWJ1Z1Nlc3Npb24oam9iKTsKLQkgICAgCWlmIChzZXNzaW9uID09IG51bGwpCi0JICAgIAkJcmV0dXJuIGZhbHNlOwotCSAgICAJaWYgKCFzZXNzaW9uLmlzUmVhZHkoKSkKLQkgICAgCQlyZXR1cm4gZmFsc2U7Ci0JICAgIAlyZXR1cm4gc3VwZXIuc2hvdWxkUnVuKCk7Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSBEZWJ1Z0pvYlN0b3JhZ2UgY29uc29sZVN0b3JhZ2UgPSBuZXcgRGVidWdKb2JTdG9yYWdlKCJDb25zb2xlIik7Ci0JcHJpdmF0ZSBQVmFyaWFibGVNYW5hZ2VyIGpvYlZhck1nciA9IG5ldyBQVmFyaWFibGVNYW5hZ2VyKCk7Ci0JcHJpdmF0ZSBQQW5ub3RhdGlvbk1hbmFnZXIgYW5ub3RhdGlvbk1nciA9IG51bGw7Ci0KLQlwcml2YXRlIFBEZWJ1Z01vZGVsIGRlYnVnTW9kZWwgPSBudWxsOwotCXByaXZhdGUgSVBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcHJlZkF1dG9VcGRhdGVWYXJPblN1c3BlbmQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHJlZkF1dG9VcGRhdGVWYXJPbkNoYW5nZSA9IGZhbHNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwcmVmUmVnaXN0ZXJQcm9jMCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgcHJlZmVyZW5jZVR5cGUgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKHByZWZlcmVuY2VUeXBlLmVxdWFscyhJUERlYnVnQ29uc3RhbnRzLlBSRUZfUFRQX0RFQlVHX1JFR0lTVEVSX1BST0NfMCkpIHsKLQkJCQlwcmVmUmVnaXN0ZXJQcm9jMCA9IG5ldyBCb29sZWFuKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByZWZlcmVuY2VUeXBlLmVxdWFscyhJUERlYnVnQ29uc3RhbnRzLlBSRUZfVVBEQVRFX1ZBUklBQkxFU19PTl9TVVNQRU5EKSkgewotCQkJCXByZWZBdXRvVXBkYXRlVmFyT25TdXNwZW5kID0gbmV3IEJvb2xlYW4odmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJlZmVyZW5jZVR5cGUuZXF1YWxzKElQRGVidWdDb25zdGFudHMuUFJFRl9VUERBVEVfVkFSSUFCTEVTX09OX0NIQU5HRSkpIHsKLQkJCQlwcmVmQXV0b1VwZGF0ZVZhck9uQ2hhbmdlID0gbmV3IEJvb2xlYW4odmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJlZmVyZW5jZVR5cGUuZXF1YWxzKElQRGVidWdDb25zdGFudHMuUFJFRl9QVFBfREVCVUdfQ09NTV9USU1FT1VUKSkgewotCQkJCWZvciAoSVBKb2Igam9iIDogZ2V0Sm9icygpKSB7Ci0JCQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RGVidWdTZXNzaW9uKGpvYik7Ci0JCQkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKLQkJCQkJCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLnNldFJlcXVlc3RUaW1lb3V0KG5ldyBJbnRlZ2VyKHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBVSURlYnVnTWFuYWdlcigpIHsKLQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKLQkJZGVidWdNb2RlbCA9IFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWJ1Z01vZGVsKCk7Ci0JCWFubm90YXRpb25NZ3IgPSBuZXcgUEFubm90YXRpb25NYW5hZ2VyKHRoaXMpOwotCQlpbml0aWFsaXplUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHByb2Nlc3MgdG8gY29uc29sZSB3aW5kb3cgaWYgaXQgaXMgcmVnaXN0ZXIgaW50byBEZWJ1ZyBWaWV3Ci0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25zb2xlV2luZG93KElQSm9iIGpvYiwgSVBQcm9jZXNzIHByb2MpIHsKLQkJaWYgKGNvbnNvbGVTdG9yYWdlLmdldFZhbHVlKGpvYi5nZXRJRCgpLCBwcm9jLmdldElEKCkpID09IG51bGwpIHsKLQkJCU91dHB1dENvbnNvbGUgb3V0cHV0Q29uc29sZSA9IG5ldyBPdXRwdXRDb25zb2xlKHByb2MuZ2V0TmFtZSgpLCBuZXcgUHJvY2Vzc0lucHV0U3RyZWFtKHByb2MpKTsKLQkJCWNvbnNvbGVTdG9yYWdlLmFkZFZhbHVlKGpvYi5nZXRJRCgpLCBwcm9jLmdldElEKCksIG91dHB1dENvbnNvbGUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRMaXN0ZW5lciNicmVha3BvaW50QWRkZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50QWRkZWQoZmluYWwgSUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQlpZiAoUFRQRGVidWdVSVBsdWdpbi5pc1BUUERlYnVnUGVyc3BlY3RpdmUoKSkgewotCQkJaWYgKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJQ0xpbmVCcmVha3BvaW50KSB7Ci0JCQkJLy9kZWxldGUgYyBicmVha3BvaW50IGlmIHRoZSBwdHAgZGVidWcgcGVyc3BlY3RpdmUgaXMgYWN0aXZlCi0JCQkJV29ya2JlbmNoSm9iIHVpSm9iID0gbmV3IFdvcmtiZW5jaEpvYigiUmVtb3ZpbmcgQy1MaW5lIGJyZWFrcG9pbnQuLi4iKSB7Ci0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludCwgdHJ1ZSk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl1aUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TGlzdGVuZXIjYnJlYWtwb2ludENoYW5nZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludCwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGJyZWFrcG9pbnRDaGFuZ2VkKElCcmVha3BvaW50IGJyZWFrcG9pbnQsIElNYXJrZXJEZWx0YSBkZWx0YSkge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TGlzdGVuZXIjYnJlYWtwb2ludFJlbW92ZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludCwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGJyZWFrcG9pbnRSZW1vdmVkKElCcmVha3BvaW50IGJyZWFrcG9pbnQsIElNYXJrZXJEZWx0YSBkZWx0YSkge30KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHN0cmluZyB0byBpbnRlZ2VyCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydFRvSW50KFN0cmluZyBpZCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5tYW5hZ2Vycy5BYnN0cmFjdFVJTWFuYWdlciNmaXJlSm9iQ2hhbmdlZEV2ZW50KGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSm9iQ2hhbmdlZEV2ZW50KGludCB0eXBlLCBTdHJpbmcgY3VyX2ppZCwgU3RyaW5nIHByZV9qaWQpIHsKLQkJLy9UT0RPID8/IHVwZGF0ZUJyZWFrcG9pbnRNYXJrZXIKLQkJdXBkYXRlQnJlYWtwb2ludE1hcmtlcihJRWxlbWVudEhhbmRsZXIuU0VUX1JPT1RfSUQpOwotCQlyZW1vdmVBbGxSZWdpc3RlckVsZW1lbnRzKHByZV9qaWQpOwotCQlzdXBlci5maXJlSm9iQ2hhbmdlZEV2ZW50KHR5cGUsIGN1cl9qaWQsIHByZV9qaWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwudWkuQWJzdHJhY3RVSU1hbmFnZXIjZmlyZVNldEV2ZW50KGludCwgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10sIG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFNldCwgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmaXJlU2V0RXZlbnQoaW50IGV2ZW50VHlwZSwgSUVsZW1lbnRbXSBlbGVtZW50cywgSUVsZW1lbnRTZXQgY3VyX3NldCwgSUVsZW1lbnRTZXQgcHJlX3NldCkgewotCQlJUFNlc3Npb24gc2Vzc2lvbiA9IGdldERlYnVnU2Vzc2lvbihnZXRKb2IoKSk7Ci0JCWlmIChzZXNzaW9uICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQljYXNlIENSRUFURV9TRVRfVFlQRToKLQkJCQlCaXRMaXN0IGNUYXNrcyA9IGNvbnZlcnRFbGVtZW50c1RvQml0TGlzdChzZXNzaW9uLCBlbGVtZW50cyk7Ci0JCQkJZGVidWdNb2RlbC5jcmVhdGVTZXQoc2Vzc2lvbiwgY3VyX3NldC5nZXROYW1lKCksIGNUYXNrcyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFTEVURV9TRVRfVFlQRToKLQkJCQlkZWJ1Z01vZGVsLmRlbGV0ZVNldChzZXNzaW9uLCBjdXJfc2V0LmdldE5hbWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENIQU5HRV9TRVRfVFlQRToKLQkJCQlpZiAoY3VyX3NldCAhPSBudWxsKSB7Ci0JCQkJCS8vYW5ub3RhdGlvbk1nci51cGRhdGVBbm5vdGF0aW9uKGN1cl9zZXQsIHByZV9zZXQpOwotCQkJCQl1cGRhdGVCcmVha3BvaW50TWFya2VyKGN1cl9zZXQuZ2V0TmFtZSgpKTsKLQkJCQkJdXBkYXRlUmVnaXN0ZXJVblJlZ2lzdGVyRWxlbWVudHMoY3VyX3NldCwgcHJlX3NldCwgZ2V0Q3VycmVudEpvYklkKCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQUREX0VMRU1FTlRfVFlQRToKLQkJCQlCaXRMaXN0IGFUYXNrcyA9IGNvbnZlcnRFbGVtZW50c1RvQml0TGlzdChzZXNzaW9uLCBlbGVtZW50cyk7Ci0JCQkJZGVidWdNb2RlbC5hZGRUYXNrcyhzZXNzaW9uLCBjdXJfc2V0LmdldE5hbWUoKSwgYVRhc2tzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVNT1ZFX0VMRU1FTlRfVFlQRToKLQkJCQlCaXRMaXN0IHJUYXNrcyA9IGNvbnZlcnRFbGVtZW50c1RvQml0TGlzdChzZXNzaW9uLCBlbGVtZW50cyk7Ci0JCQkJZGVidWdNb2RlbC5yZW1vdmVUYXNrcyhzZXNzaW9uLCBjdXJfc2V0LmdldE5hbWUoKSwgclRhc2tzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN1cGVyLmZpcmVTZXRFdmVudChldmVudFR5cGUsIGVsZW1lbnRzLCBjdXJfc2V0LCBwcmVfc2V0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50Sm9iSWQoKSB7Ci0JCUlQSm9iIGpvYiA9IGdldEpvYigpOwotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2IuZ2V0SUQoKTsKLQkJfQotCQlyZXR1cm4gSU1hbmFnZXIuRU1QVFlfSUQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBTZXNzaW9uIGdldEN1cnJlbnRTZXNzaW9uKCkgewotCQlpZiAoY3VycmVudFNlc3Npb24gPT0gbnVsbCkKLQkJCWN1cnJlbnRTZXNzaW9uID0gZ2V0RGVidWdTZXNzaW9uKGdldEpvYigpKTsKLQkJcmV0dXJuIGN1cnJlbnRTZXNzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgZGVidWcgc2Vzc2lvbgotCSAqIEBwYXJhbSBqb2IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQU2Vzc2lvbiBnZXREZWJ1Z1Nlc3Npb24oSVBKb2Igam9iKSB7Ci0JCWlmIChqb2IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZGVidWdNb2RlbC5nZXRTZXNzaW9uKGpvYik7Ci0JfQotCQotCS8qKgotCSAqIEdldCBkZWJ1ZyBzZXNzaW9uCi0JICogQHBhcmFtIGpvYl9pZCBKb2IgSUQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQU2Vzc2lvbiBnZXREZWJ1Z1Nlc3Npb24oU3RyaW5nIGpvYl9pZCkgewotCQlpZiAoaXNOb0pvYihqb2JfaWQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXREZWJ1Z1Nlc3Npb24oZmluZEpvYkJ5SWQoam9iX2lkKSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUFZhcmlhYmxlTWFuYWdlciBnZXRKb2JWYXJpYWJsZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBqb2JWYXJNZ3I7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0U2VsZWN0ZWRSZWdpc3RlcmVkVGFza3MoT2JqZWN0IG9iaikgewotCQlJRGVidWdUYXJnZXQgdGFyZ2V0ID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTdGFja0ZyYW1lKSB7Ci0JCQl0YXJnZXQgPSAoKElTdGFja0ZyYW1lKW9iaikuZ2V0RGVidWdUYXJnZXQoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJVGhyZWFkKSB7Ci0JCQl0YXJnZXQgPSAoKElUaHJlYWQpb2JqKS5nZXREZWJ1Z1RhcmdldCgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElEZWJ1Z1RhcmdldCkgewotCQkJdGFyZ2V0ID0gKElEZWJ1Z1RhcmdldClvYmo7Ci0JCX0KLQkJCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUERlYnVnVGFyZ2V0KSB7Ci0JCQkgcmV0dXJuICgoSVBEZWJ1Z1RhcmdldCl0YXJnZXQpLmdldFRhc2tzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKiAKLQkgKiBHZXQgdGFza3MgZnJvbSBnaXZlbiBzZXQKLQkgKiBAcGFyYW0gam9iX2lkIGpvYiBJRAotCSAqIEBwYXJhbSBzZXRfaWQgc2V0IElECi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBCaXRMaXN0IGdldFRhc2tzKElQU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc2V0X2lkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkZWJ1Z01vZGVsLmdldFRhc2tzKHNlc3Npb24sIHNldF9pZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNldF9pZAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQml0TGlzdCBnZXRUYXNrcyhTdHJpbmcgc2V0X2lkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUYXNrcyhnZXRDdXJyZW50Sm9iSWQoKSwgc2V0X2lkKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEJpdExpc3QgZ2V0VGFza3MoU3RyaW5nIGpvYl9pZCwgU3RyaW5nIHNldF9pZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUFNlc3Npb24gc2Vzc2lvbiA9IGdldERlYnVnU2Vzc2lvbihqb2JfaWQpOwotCQlpZiAoc2Vzc2lvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIk5vIHNlc3Npb24gZm91bmQiLCBudWxsKSk7Ci0JCXJldHVybiBnZXRUYXNrcyhzZXNzaW9uLCBzZXRfaWQpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdmFsdWUgdGV4dCBmb3IgdG9vbHRpcAotCSAqIEBwYXJhbSB0YXNrSUQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVRleHQoaW50IHRhc2tJRCwgSVRvb2xUaXBQcm92aWRlciBwcm92aWRlcikgewotCQlJUEpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJaWYgKGpvYiA9PSBudWxsKQotCQkJcmV0dXJuICJObyBqb2IgZm91bmQiOwotCQkKLQkJcmV0dXJuIGdldEpvYlZhcmlhYmxlTWFuYWdlcigpLmdldFZhbHVlKGdldEpvYigpLCB0YXNrSUQsIHByb3ZpZGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1VwZGF0ZVZhck9uQ2hhbmdlKCkgewotCQlyZXR1cm4gcHJlZkF1dG9VcGRhdGVWYXJPbkNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1VwZGF0ZVZhck9uU3VzcGVuZCgpIHsKLQkJcmV0dXJuIHByZWZBdXRvVXBkYXRlVmFyT25TdXNwZW5kOwotCX0KLQkKLQkvKioKLQkgKiBJcyBqb2IgaW4gZGVidWcgbW9kZQotCSAqIEBwYXJhbSBqb2IKLQkgKiBAcmV0dXJuIHRydWUgaWYgZ2l2ZW4gam9iIGluIGRlYnVnIG1vZGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnTW9kZShJUEpvYiBqb2IpIHsKLQkJaWYgKGpvYiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gam9iLmlzRGVidWcoKTsKLQl9Ci0JCi0JLyoqCi0JICogSXMgSm9iIGluIGRlYnVnIG1vZGUKLQkgKiBAcGFyYW0gam9iX2lkIEpvYiBJRAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBqb2IgaW4gZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVidWdNb2RlKFN0cmluZyBqb2JfaWQpIHsKLQkJaWYgKGlzTm9Kb2Ioam9iX2lkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzRGVidWdNb2RlKGZpbmRKb2JCeUlkKGpvYl9pZCkpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRGVmYXVsdFJlZ2lzdGVyKCkgewotCQlyZXR1cm4gcHJlZlJlZ2lzdGVyUHJvYzA7Ci0JfQotCQotCS8qKgotCSAqIElzIGpvYiBydW5uaW5nCi0JICogQHBhcmFtIGpvYgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBqb2IgaXMgcnVubmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZyhJUEpvYiBqb2IpIHsKLQkJcmV0dXJuIChqb2IgIT0gbnVsbCAmJiAham9iLmlzVGVybWluYXRlZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogSXMgam9iIHJ1bm5pbmcKLQkgKiBAcGFyYW0gam9iX2lkIGpvYiBJRAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBqb2IgaXMgcnVubmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZyhTdHJpbmcgam9iX2lkKSB7Ci0JCWlmIChpc05vSm9iKGpvYl9pZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc1J1bm5pbmcoZmluZEpvYkJ5SWQoam9iX2lkKSk7Ci0JfQotCQotCS8qKiAKLQkgKiBSZWdpc3RlciBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudHMoZmluYWwgSUVsZW1lbnRbXSBlbGVtZW50cykgewotCQluZXcgVUlEZWJ1Z1dvcmtiZW5jaEpvYihmYWxzZSwgIlJlZ2lzdGVyZWQgZWxlbWVudHMiLCBnZXRKb2IoKSwgbmV3IElEZWJ1Z1Byb2dyZXNzTW9uaXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkRlYnVnSm9iKElQSm9iIGpvYiwgSVBTZXNzaW9uIHNlc3Npb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChqb2IgPT0gbnVsbCB8fCBzZXNzaW9uID09IG51bGwpCi0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotCQkJCUJpdExpc3QgdGFza3MgPSBzZXNzaW9uLmdldFRhc2tzKC0xKTsKLQkJCQlmb3IgKElFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJCQkvLyBvbmx5IHJlZ2lzdGVyIHNvbWUgdW5yZWdpc3RlcmVkIGVsZW1lbnRzCi0JCQkJCWlmICghZWxlbWVudC5pc1JlZ2lzdGVyZWQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl0YXNrcy5zZXQoSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldE5hbWUoKSkpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUaGUgZWxlbWVudCBuYW1lIGhhZCBiZXR0ZXIgYmUgdGhlIHByb2Nlc3MgbnVtYmVyCi0JCQkJCQkJUFRQRGVidWdDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZWdpc3RlclRhc2tzKHNlc3Npb24sIHRhc2tzKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJUYXNrcyhJUFNlc3Npb24gc2Vzc2lvbiwgQml0TGlzdCB0YXNrcykgewotCQlzZXNzaW9uLmNyZWF0ZURlYnVnVGFyZ2V0KHRhc2tzLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJlbW92ZSBhbGwgcmVnaXN0ZXIgZWxlbWVudHMKLQkgKiBAcGFyYW0gam9iX2lkIGpvYiBJRAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZ2lzdGVyRWxlbWVudHMoZmluYWwgU3RyaW5nIGpvYl9pZCl7Ci0JCW5ldyBVSURlYnVnV29ya2JlbmNoSm9iKGZhbHNlLCAiUmVtb3ZpbmcgcmVnaXN0ZXJlZCBwcm9jZXNzZXMiLCBmaW5kSm9iQnlJZChqb2JfaWQpLCBuZXcgSURlYnVnUHJvZ3Jlc3NNb25pdG9yKCkgewotCQkJcHVibGljIElTdGF0dXMgcnVuRGVidWdKb2IoSVBKb2Igam9iLCBJUFNlc3Npb24gc2Vzc2lvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJaWYgKGpvYiA9PSBudWxsIHx8IHNlc3Npb24gPT0gbnVsbCkKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQotCQkJCXNlc3Npb24uZGVsZXRlRGVidWdUYXJnZXRzKGZhbHNlKTsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBwcm9jZXNzIGZyb20gY29uc29sZSBsaXN0IGFuZCBjbG9zZSBpdHMgb3V0cHV0Ci0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25zb2xlV2luZG93KElQSm9iIGpvYiwgSVBQcm9jZXNzIHByb2MpIHsKLQkJT3V0cHV0Q29uc29sZSBvdXRwdXRDb25zb2xlID0gKE91dHB1dENvbnNvbGUpIGNvbnNvbGVTdG9yYWdlLnJlbW92ZVZhbHVlKGpvYi5nZXRJRCgpLCBwcm9jLmdldElEKCkpOwotCQlpZiAob3V0cHV0Q29uc29sZSAhPSBudWxsKSB7Ci0JCQlvdXRwdXRDb25zb2xlLmtpbGwoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXIjcmVtb3ZlSm9iKG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQSm9iKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUpvYihJUEpvYiBqb2IpIHsKLQkJaWYgKGpvYi5pc0RlYnVnKCkpIHsKLQkJCWRlYnVnTW9kZWwuc2h1dGRvd25TZXNzaW9uKGpvYik7Ci0JCQlyZW1vdmVDb25zb2xlV2luZG93cyhqb2IpOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUpvYihqb2IpOwotCX0KLQkKLQkvKiogCi0JICogUmVzdW1lIGRlYnVnZ2VyCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXN1bWUoZ2V0Q3VycmVudEpvYklkKCksIGdldEN1cnJlbnRTZXRJZCgpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJlc3VtZSBkZWJ1Z2dlcgotCSAqIEBwYXJhbSBqb2JfaWQgam9iIElECi0JICogQHBhcmFtIHNldF9pZCBzZXQgSUQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWUoZmluYWwgU3RyaW5nIGpvYl9pZCwgZmluYWwgU3RyaW5nIHNldF9pZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUFNlc3Npb24gc2Vzc2lvbiA9IGdldERlYnVnU2Vzc2lvbihqb2JfaWQpOwotCQlpZiAoc2Vzc2lvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIk5vIHNlc3Npb24gZm91bmQiLCBudWxsKSk7Ci0JCXRyeSB7Ci0JCQlzZXNzaW9uLmdldFBESVNlc3Npb24oKS5yZXN1bWUoZ2V0VGFza3Moc2Vzc2lvbiwgc2V0X2lkKSwgZmFsc2UpOwotCQl9IGNhdGNoIChQRElFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkubWFuYWdlcnMuSm9iTWFuYWdlciNzZXRKb2Iob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9iKElQSm9iIGpvYikgewotCQljdXJyZW50U2Vzc2lvbiA9IGdldERlYnVnU2Vzc2lvbihqb2IpOwotCQlzdXBlci5zZXRKb2Ioam9iKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLm1hbmFnZXJzLkpvYk1hbmFnZXIjc2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkucmVtb3ZlQnJlYWtwb2ludExpc3RlbmVyKHRoaXMpOwotCQlhbm5vdGF0aW9uTWdyLnNodXRkb3duKCk7Ci0JCWpvYlZhck1nci5zaHV0ZG93bigpOwotCQlzdXBlci5zaHV0ZG93bigpOwotCX0KLQkKLQkvKiogCi0JICogU3RlcCBpbnRvIGRlYnVnZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc3RlcEludG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN0ZXBJbnRvKGdldEN1cnJlbnRKb2JJZCgpLCBnZXRDdXJyZW50U2V0SWQoKSk7Ci0JfQotCQotCS8qKiAKLQkgKiBTdGVwIGludG8gZGVidWdnZXIKLQkgKiBAcGFyYW0gam9iX2lkCi0JICogQHBhcmFtIHNldF9pZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKGZpbmFsIFN0cmluZyBqb2JfaWQsIGZpbmFsIFN0cmluZyBzZXRfaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBTZXNzaW9uIHNlc3Npb24gPSBnZXREZWJ1Z1Nlc3Npb24oam9iX2lkKTsKLQkJaWYgKHNlc3Npb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsICJObyBzZXNzaW9uIGZvdW5kIiwgbnVsbCkpOwotCQl0cnkgewotCQkJQml0TGlzdCB0YXNrcyA9IGdldFRhc2tzKHNlc3Npb24sIHNldF9pZCk7Ci0JCQkvL2ZpbHRlclJ1bm5pbmdUYXNrcyh0YXNrcywgU1RFUF9JTlRPKTsKLQkJCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLnN0ZXBJbnRvKHRhc2tzLCAxKTsKLQkJfSBjYXRjaCAoUERJRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBudWxsKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIFN0ZXAgb3ZlciBkZWJ1Z2dlcgotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdGVwT3ZlcihnZXRDdXJyZW50Sm9iSWQoKSwgZ2V0Q3VycmVudFNldElkKCkpOwotCX0KLQkKLQkvKiogCi0JICogU3RlcCBvdmVyIGRlYnVnZ2VyCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwT3ZlcihmaW5hbCBTdHJpbmcgam9iX2lkLCBmaW5hbCBTdHJpbmcgc2V0X2lkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RGVidWdTZXNzaW9uKGpvYl9pZCk7Ci0JCWlmIChzZXNzaW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCAiTm8gc2Vzc2lvbiBmb3VuZCIsIG51bGwpKTsKLQkJdHJ5IHsKLQkJCUJpdExpc3QgdGFza3MgPSBnZXRUYXNrcyhzZXNzaW9uLCBzZXRfaWQpOwotCQkJLy9maWx0ZXJSdW5uaW5nVGFza3ModGFza3MsIFNURVBfT1ZFUik7Ci0JCQlzZXNzaW9uLmdldFBESVNlc3Npb24oKS5zdGVwT3Zlcih0YXNrcywgMSk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgbnVsbCkpOwotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBTdGVwIHJldHVybiBkZWJ1Z2dlcgotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN0ZXBSZXR1cm4oZ2V0Q3VycmVudEpvYklkKCksIGdldEN1cnJlbnRTZXRJZCgpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFN0ZXAgcmV0dXJuIGRlYnVnZ2VyCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKGZpbmFsIFN0cmluZyBqb2JfaWQsIGZpbmFsIFN0cmluZyBzZXRfaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBTZXNzaW9uIHNlc3Npb24gPSBnZXREZWJ1Z1Nlc3Npb24oam9iX2lkKTsKLQkJaWYgKHNlc3Npb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsICJObyBzZXNzaW9uIGZvdW5kIiwgbnVsbCkpOwotCQl0cnkgewotCQkJQml0TGlzdCB0YXNrcyA9IGdldFRhc2tzKHNlc3Npb24sIHNldF9pZCk7Ci0JCQkvL2ZpbHRlclJ1bm5pbmdUYXNrcyh0YXNrcywgU1RFUF9SRVRVUk4pOwotCQkJc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuc3RlcFJldHVybih0YXNrcywgMCk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgbnVsbCkpOwotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBTdXNwZW5kIGRlYnVnZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VzcGVuZChnZXRDdXJyZW50Sm9iSWQoKSwgZ2V0Q3VycmVudFNldElkKCkpOwotCX0KLQkKLQkvKiogCi0JICogU3VzcGVuZCBkZWJ1Z2dlcgotCSAqIEBwYXJhbSBqb2JfaWQKLQkgKiBAcGFyYW0gc2V0X2lkCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZChmaW5hbCBTdHJpbmcgam9iX2lkLCBmaW5hbCBTdHJpbmcgc2V0X2lkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RGVidWdTZXNzaW9uKGpvYl9pZCk7Ci0JCWlmIChzZXNzaW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCAiTm8gc2Vzc2lvbiBmb3VuZCIsIG51bGwpKTsKLQkJdHJ5IHsKLQkJCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLnN1c3BlbmQoZ2V0VGFza3Moc2Vzc2lvbiwgc2V0X2lkKSk7Ci0JCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgbnVsbCkpOwotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBUZXJtaW5hdGUgZGVidWdnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRlcm1pbmF0ZShnZXRDdXJyZW50Sm9iSWQoKSwgZ2V0Q3VycmVudFNldElkKCkpOwotCX0KLQkKLQkvKiogCi0JICogVGVybWluYXRlIGRlYnVnZ2VyCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzZXRfaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoZmluYWwgU3RyaW5nIGpvYl9pZCwgZmluYWwgU3RyaW5nIHNldF9pZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUEpvYiBqb2IgPSBmaW5kSm9iQnlJZChqb2JfaWQpOwotCQlpZiAoaXNEZWJ1Z01vZGUoam9iKSkgewotCQkJSVBTZXNzaW9uIHNlc3Npb24gPSBnZXREZWJ1Z1Nlc3Npb24oam9iKTsKLQkJCWlmIChzZXNzaW9uID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIk5vIHNlc3Npb24gZm91bmQiLCBudWxsKSk7Ci0JCQl0cnkgewotCQkJCXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLnRlcm1pbmF0ZShnZXRUYXNrcyhzZXNzaW9uLCBzZXRfaWQpKTsKLQkJCX0gY2F0Y2ggKFBESUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIG51bGwpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVbnJlZ2lzdGVyIGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlckVsZW1lbnRzKGZpbmFsIElFbGVtZW50W10gZWxlbWVudHMpIHsKLQkJbmV3IFVJRGVidWdXb3JrYmVuY2hKb2IoZmFsc2UsICJVbnJlZ2lzdGVyZWQgZWxlbWVudHMiLCBnZXRKb2IoKSwgbmV3IElEZWJ1Z1Byb2dyZXNzTW9uaXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkRlYnVnSm9iKElQSm9iIGpvYiwgSVBTZXNzaW9uIHNlc3Npb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChqb2IgPT0gbnVsbCB8fCBzZXNzaW9uID09IG51bGwpCi0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkKLQkJCQlCaXRMaXN0IHRhc2tzID0gc2Vzc2lvbi5nZXRUYXNrcygtMSk7Ci0JCQkJZm9yIChJRWxlbWVudCBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCQkJaWYgKGVsZW1lbnQuaXNSZWdpc3RlcmVkKCkpIHsKLQkJCQkJCS8vIG9ubHkgdW5yZWdpc3RlciBzb21lIHJlZ2lzdGVyZWQgZWxlbWVudHMKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdGFza3Muc2V0KEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXROYW1lKCkpKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVGhlIGVsZW1lbnQgbmFtZSBoYWQgYmV0dGVyIGJlIHRoZSBwcm9jZXNzIG51bWJlcgotCQkJCQkJCVBUUERlYnVnQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdW5yZWdpc3RlclRhc2tzKHNlc3Npb24sIHRhc2tzKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIHRhc2tzCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlclRhc2tzKElQU2Vzc2lvbiBzZXNzaW9uLCBCaXRMaXN0IHRhc2tzKSB7Ci0JCXNlc3Npb24uZGVsZXRlRGVidWdUYXJnZXQodGFza3MsIHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgYnJlYWtwb2ludCBtYXJrZXIKLQkgKiBAcGFyYW0gY3VyX3NpZCBjdXJyZW50IHNldCBJRAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUJyZWFrcG9pbnRNYXJrZXIoZmluYWwgU3RyaW5nIGN1cl9zaWQpIHsKLQkJV29ya2JlbmNoSm9iIHVpSm9iID0gbmV3IFdvcmtiZW5jaEpvYigiVXBkYXRpbmcgYnJlYWtwb2ludCBtYXJrZXIuLi4iKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCVBEZWJ1Z01vZGVsLnVwZGF0ZVBCcmVha3BvaW50cyhjdXJfc2lkLCAgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJdWlKb2Iuc2V0U3lzdGVtKHRydWUpOwotCQl1aUpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDdXJyZW50Sm9iVmFyaWFibGVWYWx1ZXMoKSB7Ci0JCWdldEpvYlZhcmlhYmxlTWFuYWdlcigpLnVwZGF0ZVZhbHVlcyhnZXRKb2IoKSk7Ci0JfQotCQotCS8qKiAKLQkgKiBVcGRhdGUgcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgZWxlbWVudHMKLQkgKiBAcGFyYW0gY3VyU2V0Ci0JICogQHBhcmFtIHByZVNldAotCSAqIEBwYXJhbSBqb2JfaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZWdpc3RlclVuUmVnaXN0ZXJFbGVtZW50cyhmaW5hbCBJRWxlbWVudFNldCBjdXJTZXQsIGZpbmFsIElFbGVtZW50U2V0IHByZVNldCwgZmluYWwgU3RyaW5nIGpvYl9pZCkgewotCQluZXcgVUlEZWJ1Z1dvcmtiZW5jaEpvYihmYWxzZSwgIlVwZGF0aW5nIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIHByb2Nlc3NlcyIsIGZpbmRKb2JCeUlkKGpvYl9pZCksIG5ldyBJRGVidWdQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5EZWJ1Z0pvYihJUEpvYiBqb2IsIElQU2Vzc2lvbiBzZXNzaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlpZiAoam9iID09IG51bGwgfHwgc2Vzc2lvbiA9PSBudWxsKQotCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCi0JCQkJc2Vzc2lvbi5yZWxvYWREZWJ1Z1RhcmdldHMoZGVidWdNb2RlbC5nZXRUYXNrcyhzZXNzaW9uLCBjdXJTZXQuZ2V0SUQoKSksIHRydWUsIGZhbHNlKTsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQml0TGlzdCBjb252ZXJ0RWxlbWVudHNUb0JpdExpc3QoSVBTZXNzaW9uIHNlc3Npb24sIElFbGVtZW50W10gZWxlbWVudHMpIHsKLQkJQml0TGlzdCB0YXNrcyA9IHNlc3Npb24uZ2V0VGFza3MoLTEpOwotCQlmb3IgKElFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJdGFza3Muc2V0KGNvbnZlcnRUb0ludChlbGVtZW50LmdldE5hbWUoKSkpOwotCQl9Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gam9iCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnNvbGVXaW5kb3dzKElQSm9iIGpvYikgewotCQlmb3IgKE91dHB1dENvbnNvbGUgb3V0cHV0Q29uc29sZSA6IGNvbnNvbGVTdG9yYWdlLmdldFZhbHVlQ29sbGVjdGlvbihqb2IuZ2V0SUQoKSkudG9BcnJheShuZXcgT3V0cHV0Q29uc29sZVswXSkpIHsKLQkJCWlmIChvdXRwdXRDb25zb2xlICE9IG51bGwpIHsKLQkJCQlvdXRwdXRDb25zb2xlLmtpbGwoKTsKLQkJCX0KLQkJfQotCQljb25zb2xlU3RvcmFnZS5yZW1vdmVKb2JTdG9yYWdlKGpvYi5nZXRJRCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHByZWZlcmVuY2Ugc2V0dGluZ3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmU3RvcmUgPSBQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZSZWdpc3RlclByb2MwID0gcHJlZlN0b3JlLmdldEJvb2xlYW4oSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1BUUF9ERUJVR19SRUdJU1RFUl9QUk9DXzApOwotCQlwcmVmQXV0b1VwZGF0ZVZhck9uU3VzcGVuZCA9IHByZWZTdG9yZS5nZXRCb29sZWFuKElQRGVidWdDb25zdGFudHMuUFJFRl9VUERBVEVfVkFSSUFCTEVTX09OX1NVU1BFTkQpOwotCQlwcmVmQXV0b1VwZGF0ZVZhck9uQ2hhbmdlID0gcHJlZlN0b3JlLmdldEJvb2xlYW4oSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1VQREFURV9WQVJJQUJMRVNfT05fQ0hBTkdFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWJzdHJhY3RCcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWJzdHJhY3RCcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMjFlMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0Fic3RyYWN0QnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCcmVha3BvaW50UnVsZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQlwcml2YXRlIElWZXJ0aWNhbFJ1bGVySW5mbyBpbmZvOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQlwcml2YXRlIElCcmVha3BvaW50IGJyZWFrcG9pbnQ7Ci0KLQkvKiogR2V0IGxpbmUgYnJlYWtwb2ludAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBsaW5lIGJyZWFrcG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgSUJyZWFrcG9pbnQgZGV0ZXJtaW5lQnJlYWtwb2ludCgpIHsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IFBEZWJ1Z01vZGVsLmdldFBCcmVha3BvaW50cygpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCUlCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBicmVha3BvaW50c1tpXTsKLQkJCWlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSUxpbmVCcmVha3BvaW50KSB7Ci0JCQkJSUxpbmVCcmVha3BvaW50IGxpbmVCcmVha3BvaW50ID0gKElMaW5lQnJlYWtwb2ludClicmVha3BvaW50OwotCQkJCWlmIChicmVha3BvaW50QXRSdWxlckxpbmUobGluZUJyZWFrcG9pbnQpKSB7Ci0JCQkJCXJldHVybiBsaW5lQnJlYWtwb2ludDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIEdldCB2ZXJ0aWNhbCBydWxlciBpbmZvCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVmVydGljYWxSdWxlckluZm8gZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqIFNldCB2ZXJ0aWNhbCBydWxlciBpbmZvCi0JICogQHBhcmFtIGluZm8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbmZvKElWZXJ0aWNhbFJ1bGVySW5mbyBpbmZvKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotCi0JLyoqIEdldCB0YXJnZXQgd29ya2JlbmNoIHBhcnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGdldFRhcmdldFBhcnQoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0OwotCX0KLQkvKiogU2V0IHRhcmdldCB3b3JrYmVuY2ggcGFydAotCSAqIEBwYXJhbSB0YXJnZXRQYXJ0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0UGFydChJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqIEdldCBicmVha3BvaW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJQnJlYWtwb2ludCBnZXRCcmVha3BvaW50KCkgewotCQlyZXR1cm4gYnJlYWtwb2ludDsKLQl9Ci0KLQkvKiogU2V0IGJyZWFrcG9pbnQKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJyZWFrcG9pbnQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQl0aGlzLmJyZWFrcG9pbnQgPSBicmVha3BvaW50OwotCX0KLQotCS8qKiBDaGVjayBnaXZlbiBicmVha3BvaW50IGxpbmUgbnVtYmVyIHNhbWUgYXMgY3VycmVudCBydWxlciBsaW5lIG51bWJlcgotCSAqIEBwYXJhbSBwQnJlYWtwb2ludAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVpciBsaW5lIG51bWJlcnMgYXJlIHRoZSBzYW1lCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnJlYWtwb2ludEF0UnVsZXJMaW5lKElMaW5lQnJlYWtwb2ludCBwQnJlYWtwb2ludCkgewotCQlpbnQgbGluZU51bWJlciA9IGdldEJyZWFrcG9pbnRMaW5lKHBCcmVha3BvaW50KTsKLQkJaW50IHJ1bGVyTGluZSA9IGdldEluZm8oKS5nZXRMaW5lT2ZMYXN0TW91c2VCdXR0b25BY3Rpdml0eSgpOwotCQlyZXR1cm4gKHJ1bGVyTGluZSA9PSBsaW5lTnVtYmVyKTsKLQl9Ci0KLQkvKiogR2V0IGJyZWFrcG9pbnQgbGluZSBudW1iZXIKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gbGluZSBudW1iZXIKLQkgKi8KLQlwcml2YXRlIGludCBnZXRCcmVha3BvaW50TGluZShJTGluZUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQlpZiAoZ2V0VGFyZ2V0UGFydCgpIGluc3RhbmNlb2YgSVNhdmVhYmxlUGFydCAmJiAoKElTYXZlYWJsZVBhcnQpZ2V0VGFyZ2V0UGFydCgpKS5pc0RpcnR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGJyZWFrcG9pbnQuZ2V0TGluZU51bWJlcigpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGVidWdQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJUG9zaXRpb24gcG9zaXRpb24gPSBnZXRCcmVha3BvaW50UG9zaXRpb24oYnJlYWtwb2ludCk7Ci0JCQlpZiAocG9zaXRpb24gIT0gbnVsbCkgewotCQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIGRvYy5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCQlEZWJ1Z1BsdWdpbi5sb2coeCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKiBHZXQgYnJlYWtwb2ludCBwb3NpdGlvbgotCSAqIEBwYXJhbSBicmVha3BvaW50Ci0JICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHBvc2l0aW9uIGZvdW5kIGluIGdpdmVuIGJyZWFrcG9pbnQKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGdldEJyZWFrcG9pbnRQb3NpdGlvbihJTGluZUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjw/PiBpdCA9IG1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJQW5ub3RhdGlvbiBhbm4gPSAoQW5ub3RhdGlvbilpdC5uZXh0KCk7Ci0JCQkJaWYgKGFubiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24gJiYgKChNYXJrZXJBbm5vdGF0aW9uKWFubikuZ2V0TWFya2VyKCkuZXF1YWxzKCBicmVha3BvaW50LmdldE1hcmtlcigpKSkgewotCQkJCQlyZXR1cm4gbW9kZWwuZ2V0UG9zaXRpb24oYW5uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIEdldCBkb2N1bWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCA9IGdldFRhcmdldFBhcnQoKTsKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcil0YXJnZXRQYXJ0OyAKLQkJCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogR2V0IElBbm5vdGF0aW9uTW9kZWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCA9IGdldFRhcmdldFBhcnQoKTsKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcil0YXJnZXRQYXJ0OyAKLQkJCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWJzdHJhY3REZWJ1Z0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Y2U2YTguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTnVsbFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUsIElWaWV3QWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElTZWxlY3Rpb25MaXN0ZW5lciwgSU51bGxTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgYWN0aW9uIGZvciB0aGlzIGRlbGVnYXRlCi0JICovCi0JcHJpdmF0ZSBJQWN0aW9uIGZBY3Rpb247Ci0KLQkvKioKLQkgKiBUaGlzIGFjdGlvbidzIHZpZXcgcGFydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGluc3RhbGxlZCBpbiBhIHZpZXcuCi0JICovCi0JcHJpdmF0ZSBJVmlld1BhcnQgZlZpZXdQYXJ0OwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIG1vc3QgcmVjZW50IHNlbGV0aW9uCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCS8qKgotCSAqIFdoZXRoZXIgdGhpcyBkZWxlZ2F0ZSBoYXMgYmVlbiBpbml0aWFsaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWN0aW9uIGRlbGVnYXRlIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IGZXaW5kb3c7Ci0KLQkvKioKLQkgKiBCYWNrZ3JvdW5kIGpvYiBmb3IgdGhpcyBhY3Rpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBEZWJ1Z1JlcXVlc3RKb2IgZkJhY2tncm91bmRKb2IgPSBudWxsOwotCi0JY2xhc3MgRGVidWdSZXF1ZXN0Sm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBPYmplY3RbXSBmRWxlbWVudHMgPSBudWxsOwotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBqb2IgdG8gcGVyZm9ybSBhIGRlYnVnIHJlcXVlc3QgKGZvciBleGFtcGxlLCBzdGVwKSBpbiB0aGUgYmFja2dyb3VuZC4KLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqICAgICAgICAgICAgam9iIG5hbWUKLQkJICovCi0JCXB1YmxpYyBEZWJ1Z1JlcXVlc3RKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJICovCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgRGVidWdFeGNlcHRpb24uUkVRVUVTVF9GQUlMRUQsIGdldFN0YXR1c01lc3NhZ2UoKSwgbnVsbCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZkVsZW1lbnRzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWRvQWN0aW9uKGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJc3RhdHVzLm1lcmdlKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgc2VsZWN0aW9uIHRvIG9wZXJhdGUgb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudHMKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFRhcmdldHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJCWZFbGVtZW50cyA9IGVsZW1lbnRzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBJdCdzIGNydWNpYWwgdGhhdCBkZWxlZ2F0ZSBhY3Rpb25zIGhhdmUgYSB6ZXJvLWFyZyBjb25zdHJ1Y3RvciBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlZmxlY3RlZCBpbnRvIGV4aXN0ZW5jZSB3aGVuIHJlZmVyZW5jZWQgaW4gYW4gYWN0aW9uIHNldCBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnhtbCBmaWxlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdldFdpbmRvdygpICE9IG51bGwpIHsKLQkJCWdldFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXLCB0aGlzKTsKLQkJfQotCQlmQmFja2dyb3VuZEpvYiA9IG51bGw7Ci0JCWZTZWxlY3Rpb24gPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vIGxpc3RlbiB0byBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUgZGVidWcgdmlldwotCQlzZXRXaW5kb3cod2luZG93KTsKLQkJd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXLCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJLy8gZGlzYWJsZSB0aGUgYWN0aW9uIHNvIGl0IGNhbm5vdCBiZSBydW4gYWdhaW4gdW50aWwgYW4gZXZlbnQgb3Igc2VsZWN0aW9uIGNoYW5nZQotCQkJLy8gdXBkYXRlcyB0aGUgZW5hYmxlbWVudAotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGlzUnVuSW5CYWNrZ3JvdW5kKCkpIHsKLQkJCQlydW5JbkJhY2tncm91bmQoYWN0aW9uLCBzZWxlY3Rpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlydW5JbkZvcmVncm91bmQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhpcyBhY3Rpb24gaW4gYSBiYWNrZ3JvdW5kIGpvYi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcnVuSW5CYWNrZ3JvdW5kKElBY3Rpb24gYWN0aW9uLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZCYWNrZ3JvdW5kSm9iID09IG51bGwpIHsKLQkJCWZCYWNrZ3JvdW5kSm9iID0gbmV3IERlYnVnUmVxdWVzdEpvYihhY3Rpb24uZ2V0VGV4dCgpKTsKLQkJfQotCQlmQmFja2dyb3VuZEpvYi5zZXRUYXJnZXRzKHNlbGVjdGlvbi50b0FycmF5KCkpOwotCQlmQmFja2dyb3VuZEpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhpcyBhY3Rpb24gaW4gdGhlIFVJIHRocmVhZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcnVuSW5Gb3JlZ3JvdW5kKGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmaW5hbCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIERlYnVnRXhjZXB0aW9uLlJFUVVFU1RfRkFJTEVELCBnZXRTdGF0dXNNZXNzYWdlKCksIG51bGwpOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUl0ZXJhdG9yPD8+IHNlbGVjdGlvbkl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoc2VsZWN0aW9uSXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb25JdGVyLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRvQWN0aW9uKGVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlzdGF0dXMubWVyZ2UoZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXBvcnRFcnJvcnMoc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwb3J0RXJyb3JzKGZpbmFsIE11bHRpU3RhdHVzIG1zKSB7Ci0JCWlmICghbXMuaXNPSygpKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBUUERlYnVnVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Iod2luZG93LmdldFNoZWxsKCksIGdldEVycm9yRGlhbG9nVGl0bGUoKSwgZ2V0RXJyb3JEaWFsb2dNZXNzYWdlKCksIG1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUFRQRGVidWdVSVBsdWdpbi5sb2cobXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGFjdGlvbiBzaG91bGQgYmUgcnVuIGluIHRoZSBiYWNrZ3JvdW5kLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgYWN0aW9uIHNob3VsZCBiZSBydW4gaW4gdGhlIGJhY2tncm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1J1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZXMgY29tZSBpbiAyIGZsYXZvcnM6IElWaWV3QWN0aW9uRGVsZWdhdGUsIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZXMuCi0JICogPC9wPgotCSAqIDx1bD4KLQkgKiA8bGk+SVZpZXdBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTogZ2V0VmlldygpICE9IG51bGw8L2xpPgotCSAqIDxsaT5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU6IGdldFZpZXcgPT0gbnVsbDwvbGk+Ci0JICogPC91bD4KLQkgKiA8cD4KLQkgKiBPbmx5IHdhbnQgdG8gY2FsbCB1cGRhdGUoYWN0aW9uLCBzZWxlY3Rpb24pIGZvciBJVmlld0FjdGlvbkRlbGVnYXRlcy4gQW4gaW5pdGlhbGl6ZSBjYWxsIHRvIHVwZGF0ZShhY3Rpb24sIHNlbGVjdGlvbikgaXMgbWFkZSBmb3IgYWxsIGZsYXZvcnMgdG8gc2V0IHRoZSBpbml0aWFsIGVuYWJsZWQgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgYWN0aW9uLiBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUncyBsaXN0ZW4gdG8gc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlIGRlYnVnIHZpZXcgb25seS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gcykgewotCQlib29sZWFuIHdhc0luaXRpYWxpemVkID0gaW5pdGlhbGl6ZShhY3Rpb24sIHMpOwotCQlpZiAoIXdhc0luaXRpYWxpemVkKSB7Ci0JCQlpZiAoZ2V0VmlldygpICE9IG51bGwpIHsKLQkJCQl1cGRhdGUoYWN0aW9uLCBzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzKSB7Ci0JCWlmIChzIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzOwotCQkJYWN0aW9uLnNldEVuYWJsZWQoZ2V0RW5hYmxlU3RhdGVGb3JTZWxlY3Rpb24oc3MpKTsKLQkJCXNldFNlbGVjdGlvbihzcyk7Ci0JCX0gZWxzZSB7Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgc3BlY2lmaWMgYWN0aW9uIG9uIHRoaXMgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0FjdGlvbihPYmplY3QgZWxlbWVudCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nIHRvIHVzZSBhcyBhbiBlcnJvciBkaWFsb2cgdGl0bGUgZm9yIGEgZmFpbGVkIGFjdGlvbi4gRGVmYXVsdCBpcyB0byByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yRGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyB0byB1c2UgYXMgYW4gZXJyb3IgZGlhbG9nIG1lc3NhZ2UgZm9yIGEgZmFpbGVkIGFjdGlvbi4gVGhpcyBtZXNzYWdlIGFwcGVhcnMgYXMgdGhlICJNZXNzYWdlOiIgaW4gdGhlIGVycm9yIGRpYWxvZyBmb3IgdGhpcyBhY3Rpb24uIERlZmF1bHQgaXMgdG8gcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvckRpYWxvZ01lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyB0byB1c2UgYXMgYSBzdGF0dXMgbWVzc2FnZSBmb3IgYSBmYWlsZWQgYWN0aW9uLiBUaGlzIG1lc3NhZ2UgYXBwZWFycyBhcyB0aGUgIlJlYXNvbjoiIGluIHRoZSBlcnJvciBkaWFsb2cgZm9yIHRoaXMgYWN0aW9uLiBEZWZhdWx0IGlzIHRvIHJldHVybiB0aGUgZW1wdHkgU3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCWZWaWV3UGFydCA9IHZpZXc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGFjdGlvbidzIHZpZXcgcGFydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGluc3RhbGxlZCBpbiBhIHZpZXcuCi0JICogCi0JICogQHJldHVybiB2aWV3IHBhcnQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgSVZpZXdQYXJ0IGdldFZpZXcoKSB7Ci0JCXJldHVybiBmVmlld1BhcnQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGlzIGRlbGVnYXRlLCB1cGRhdGluZyB0aGlzIGRlbGVnYXRlJ3MgcHJlc2VudGF0aW9uLiBBcyB3ZWxsLCBhbGwgb2YgdGhlIGZsYXZvcnMgb2YgQWJzdHJhY3REZWJ1Z0FjdGlvbkRlbGVnYXRlcyBuZWVkIHRvIGhhdmUgdGhlIGluaXRpYWwgZW5hYmxlZCBzdGF0ZSBzZXQgd2l0aCBhIGNhbGwgdG8gdXBkYXRlKElBY3Rpb24sIElTZWxlY3Rpb24pLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBwcmVzZW50YXRpb24gZm9yIHRoaXMgYWN0aW9uCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBhY3Rpb24gd2FzIGluaXRpYWxpemVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLQkJCXNldEFjdGlvbihhY3Rpb24pOwotCQkJaWYgKGdldFZpZXcoKSA9PSBudWxsKSB7Ci0JCQkJLy8gdXBkYXRlIG9uIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGRlYnVnIHZpZXcKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCAmJiB3aW5kb3cuZ2V0U2hlbGwoKSAhPSBudWxsICYmICF3aW5kb3cuZ2V0U2hlbGwoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCXNlbGVjdGlvbiA9IHBhZ2UuZ2V0U2VsZWN0aW9uKElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJCXNldEluaXRpYWxpemVkKHRydWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHNlbGVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gc3RydWN0dXJlZCBzZWxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb3N0IHJlY2VudCBzZWxlY3Rpb24KLQkgKiAKLQkgKiBAcGFybSBzZWxlY3Rpb24gc3RydWN0dXJlZCBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXVwZGF0ZShnZXRBY3Rpb24oKSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJZkFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0JCXJldHVybiBmQWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZpZXcoSVZpZXdQYXJ0IHZpZXdQYXJ0KSB7Ci0JCWZWaWV3UGFydCA9IHZpZXdQYXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBmSW5pdGlhbGl6ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5pdGlhbGl6ZWQoYm9vbGVhbiBpbml0aWFsaXplZCkgewotCQlmSW5pdGlhbGl6ZWQgPSBpbml0aWFsaXplZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBnZXRXaW5kb3coKSB7Ci0JCXJldHVybiBmV2luZG93OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpbmRvdyhJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlmV2luZG93ID0gd2luZG93OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90IGJhc2VkIG9uIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RW5hYmxlU3RhdGVGb3JTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJdGVyYXRvcjw/PiBpdHIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRyLm5leHQoKTsKLQkJCWlmICghaXNFbmFibGVkRm9yKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZEZvcihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNpbml0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0Fic3RyYWN0TGlzdGVuZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BYnN0cmFjdExpc3RlbmVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3NjljOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0Fic3RyYWN0TGlzdGVuZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlzdGVuZXJBY3Rpb25EZWxlZ2F0ZSAgZXh0ZW5kcyBBYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVidWdFdmVudFNldExpc3RlbmVyLCBJQWN0aW9uRGVsZWdhdGUyIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIjaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKGZpbmFsIERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJaWYgKGdldFdpbmRvdygpID09IG51bGwgfHwgZ2V0QWN0aW9uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVNoZWxsIHNoZWxsPSBnZXRXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlSdW5uYWJsZSByPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGV2ZW50c1tpXS5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlkb0hhbmRsZURlYnVnRXZlbnQoZXZlbnRzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocik7Ci0JfQotCQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gdXBkYXRlIG9uIHNwZWNpZmljIGRlYnVnIGV2ZW50cy4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBoYW5kbGUgZXZlbnRzIGRpZmZlcmVudGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRGVidWdFdmVudChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCXN3aXRjaCAoZXZlbnQuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIERlYnVnRXZlbnQuVEVSTUlOQVRFIDoKLQkJCQl1cGRhdGUoZ2V0QWN0aW9uKCksIGdldFNlbGVjdGlvbigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRGVidWdFdmVudC5SRVNVTUUgOgotCQkJCWlmICghZXZlbnQuaXNFdmFsdWF0aW9uKCkgfHwgISgoZXZlbnQuZ2V0RGV0YWlsKCkgJiBEZWJ1Z0V2ZW50LkVWQUxVQVRJT05fSU1QTElDSVQpICE9IDApKSB7Ci0JCQkJCXVwZGF0ZShnZXRBY3Rpb24oKSwgZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRGVidWdFdmVudC5TVVNQRU5EIDoKLQkJCQkvLyBVcGRhdGUgb24gc3VzcGVuZCBldmVudHMgKGV2ZW4gZm9yIGV2YWx1YXRpb25zKSwgaW4gY2FzZSB0aGUgdXNlciBjaGFuZ2VkCi0JCQkJLy8gdGhlIHNlbGVjdGlvbiBkdXJpbmcgYW4gaW1wbGljaXQgZXZhbHVhdGlvbi4KLQkJCQl1cGRhdGUoZ2V0QWN0aW9uKCksIGdldFNlbGVjdGlvbigpKTsKLQkJCQlicmVhazsKLQkJfQotCX0JCQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChJV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpewotCQlzdXBlci5pbml0KHdpbmRvdyk7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmlld0FjdGlvbkRlbGVnYXRlI2luaXQoSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJc3VwZXIuaW5pdCh2aWV3KTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZERlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQkJc2V0V2luZG93KHZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BY3Rpb25NZXNzYWdlcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BY3Rpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJmNjc5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWN0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25NZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFjdGlvbk1lc3NhZ2VzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JLyoqIENvbnN0cnVjdG9yCi0JICogCi0JICovCi0JcHVibGljIEFjdGlvbk1lc3NhZ2VzKCkge30KLQkvKiogR2V0IHN0cmluZwotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWN0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWN0aW9uTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2YjhiNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0FjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAjIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAjIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAjIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAjIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICMgCi0gIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICMgCi0gIyBMQS1DQyAwNC0xMTUKLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotICMgQGF1dGhvciBDbGVtZW50Ci0gIwotICMjCi0KLVRvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5Ub2dnbGVfQnJlYWtwb2ludD1TZXQgQnJlYWtwb2ludAotVG9nZ2xlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLkVycm9yXzE9RXJyb3IKLVRvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5PcGVyYXRpb25fZmFpbGVkXzE9T3BlcmF0aW9uIGZhaWxlZC4KLVRvZ2dsZUJyZWFrcG9pbnRBZGFwdGVyLkVtcHR5X2VkaXRvcl8xPUVtcHR5IGVkaXRvcgotVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIuTWlzc2luZ19kb2N1bWVudF8xPU1pc3NpbmcgZG9jdW1lbnQKLVRvZ2dsZUJyZWFrcG9pbnRBZGFwdGVyLk1pc3NpbmdfcmVzb3VyY2VfMT1NaXNzaW5nIHJlc291cmNlCi1Ub2dnbGVCcmVha3BvaW50QWRhcHRlci5JbnZhbGlkX2xpbmVfMT1JbnZhbGlkIGxpbmUKLVRvZ2dsZUJyZWFrcG9pbnRBZGFwdGVyLkVtcHR5X2VkaXRvcl8yPUVtcHR5IGVkaXRvcgotVG9nZ2xlV2F0Y2hwb2ludEFjdGlvbkRlbGVnYXRlLkVycm9yXzE9RXJyb3IKLVRvZ2dsZUJyZWFrcG9pbnRBZGFwdGVyLk1pc3NpbmdfZG9jdW1lbnRfMj1NaXNzaW5nIGRvY3VtZW50Ci1Ub2dnbGVCcmVha3BvaW50QWRhcHRlci5NaXNzaW5nX3Jlc291cmNlXzI9TWlzc2luZyByZXNvdXJjZQotVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIuSW52YWxpZF9leHByZXNzaW9uXzE9SW52YWxpZCBleHByZXNzaW9uOiAKLQotUnVuVG9MaW5lQWN0aW9uRGVsZWdhdGUuRXJyb3JfMT1FcnJvcgotUnVuVG9MaW5lQWN0aW9uRGVsZWdhdGUuT3BlcmF0aW9uX2ZhaWxlZF8xPU9wZXJhdGlvbiBmYWlsZWQuCi1SdW5Ub0xpbmVBZGFwdGVyLkVtcHR5X2VkaXRvcl8xPUVtcHR5IGVkaXRvcgotUnVuVG9MaW5lQWRhcHRlci4wPVJ1biBUbyBMaW5lIGZhaWxlZC4KLVJ1blRvTGluZUFkYXB0ZXIuTWlzc2luZ19kb2N1bWVudF8xPU1pc3NpbmcgZG9jdW1lbnQKLVJ1blRvTGluZUFkYXB0ZXIuT3BlcmF0aW9uX2lzX25vdF9zdXBwb3J0ZWRfMT1PcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLQotUmVzdW1lQXRMaW5lQWN0aW9uRGVsZWdhdGUuRXJyb3JfMT1FcnJvcgotUmVzdW1lQXRMaW5lQWRhcHRlci4wPUVtcHR5IGVkaXRvcgotUmVzdW1lQXRMaW5lQWRhcHRlci4xPU1pc3NpbmcgZG9jdW1lbnQKLVJlc3VtZUF0TGluZUFkYXB0ZXIuMj1FbXB0eSBlZGl0b3IKLVJlc3VtZUF0TGluZUFkYXB0ZXIuMz1PcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLVJlc3VtZUF0TGluZUFkYXB0ZXIuND1SZXN1bWUgQXQgTGluZSBmYWlsZWQuCi0KLVBCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uLkJyZWFrcG9pbnRfUHJvcGVydGllcz1CcmVha3BvaW50ICZQcm9wZXJ0aWVzLi4uCi0KLUVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb24uRW5hYmxlX0JyZWFrcG9pbnRfMT0mRW5hYmxlIEJyZWFrcG9pbnQKLUVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb24uRW5hYmxpbmdfZGlzYWJsaW5nX2JyZWFrcG9pbnRzXzE9RW5hYmxpbmcvZGlzYWJsaW5nIGJyZWFrcG9pbnRzCi1FbmFibGVEaXNhYmxlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLkV4Y2VwdGlvbnNfb2NjdXJyZWRfZW5hYmxpbmdfb3JfZGlzYWJsaW5nX2JyZWFrcG9pbnRfMT1FeGNlcHRpb25zIG9jY3VycmVkIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGUgYnJlYWtwb2ludAotRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5EaXNhYmxlX0JyZWFrcG9pbnRfMT0mRGlzYWJsZSBCcmVha3BvaW50Ci0KLVNpZ25hbFplcm9Xb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS4wPUV4Y2VwdGlvbnMgb2NjdXJyZWQgYXR0ZW1wdGluZyB0byByZXN1bWUgd2l0aG91dCBzaWduYWwuCi1TaWduYWxaZXJvV29ya2JlbmNoQWN0aW9uRGVsZWdhdGUuMT1SZXN1bWUgd2l0aG91dCBzaWduYWwgZmFpbGVkLgotU2lnbmFsWmVyb1dvcmtiZW5jaEFjdGlvbkRlbGVnYXRlLjI9UmVzdW1lIFdpdGhvdXQgU2lnbmFsCi1TaWduYWxaZXJvT2JqZWN0QWN0aW9uRGVsZWdhdGUuMD1VbmFibGUgdG8gcmVzdW1lIGlnbm9yaW5nIHRoZSBzaWduYWwuCi1TaWduYWxaZXJvT2JqZWN0QWN0aW9uRGVsZWdhdGUuMT1PcGVyYXRpb24gZmFpbGVkLgotU2lnbmFsQWN0aW9uRGVsZWdhdGUuMD1VbmFibGUgdG8gZGVsaXZlciB0aGUgc2lnbmFsIHRvIHRoZSB0YXJnZXQuCi1TaWduYWxBY3Rpb25EZWxlZ2F0ZS4xPU9wZXJhdGlvbiBmYWlsZWQuCi0KLVJlc3RhcnRBY3Rpb25EZWxlZ2F0ZS4wPUV4Y2VwdGlvbihzKSBvY2N1cnJlZCBhdHRlbXB0aW5nIHRvIHJlc3RhcnQuCi1SZXN0YXJ0QWN0aW9uRGVsZWdhdGUuMT1SZXN0YXJ0IGZhaWxlZC4KLVJlc3RhcnRBY3Rpb25EZWxlZ2F0ZS4yPVJlc3RhcnQKLQotRW5hYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUuMD1FeGNlcHRpb25zIG9jY3VycmVkIGVuYWJsaW5nIHRoZSB2YXJpYWJsZShzKS4KLUVuYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlLjE9RW5hYmxlIHZhcmlhYmxlKHMpIGZhaWxlZC4KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWRkUEV4cHJlc3Npb25BY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWRkUEV4cHJlc3Npb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjJhNS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0FkZFBFeHByZXNzaW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z0ltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZS5QVmFyaWFibGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlLlBWYXJpYWJsZVZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgQWRkUEV4cHJlc3Npb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiQWRkIjsKLQlwcml2YXRlIFBWYXJpYWJsZVZpZXcgdmlldyA9IG51bGw7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBBZGRQRXhwcmVzc2lvbkFjdGlvbihQVmFyaWFibGVWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fVkFSX0FERF9OT1JNQUwpKTsKLQkgICAgLy9zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5JRF9JQ09OX1ZBUl9BRERfRElTQUJMRSk7Ci0JICAgIHNldFRvb2xUaXBUZXh0KG5hbWUpOwotCSAgICBzZXRJZChuYW1lKTsKLQkgICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgIHRoaXMudmlldyA9IHZpZXc7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChuZXcgUFZhcmlhYmxlRGlhbG9nKHZpZXcpLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXZpZXcucmVmcmVzaCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BZGRWYXJpYWJsZUFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9BZGRWYXJpYWJsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDgxMTRjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvQWRkVmFyaWFibGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ3MuQXJyYXlWYXJpYWJsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuUFRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRkVmFyaWFibGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBQVGFiRm9sZGVyIGZvbGRlciA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJBZGQgVmFyaWFibGUiOyAKLQotCS8qKiAKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgQWRkVmFyaWFibGVBY3Rpb24oUFRhYkZvbGRlciBmb2xkZXIpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fQUREX1ZBUl9OT1JNQUwpKTsKLQkJc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0JCXRoaXMuZm9sZGVyID0gZm9sZGVyOwotCX0KLSAgICAvKioKLSAgICAgKiBHZXQgc2hlbGwKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotICAgICAgICByZXR1cm4gZm9sZGVyLmdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKTsKLSAgICB9Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlvcGVuRGlhbG9nKGZvbGRlci5nZXRTdGFja0ZyYW1lKCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQVFBEZWJ1Z1VJUGx1Z2luLmVycm9yRGlhbG9nKGdldFNoZWxsKCksICJFcnJvciIsIGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfSApOwotCX0KLQkKLQkvKioKLQkgKiBPcGVuIGFycmF5IHZhcmlhYmxlIGRpYWxvZwotCSAqIEBwYXJhbSBmcmFtZQotCSAqIEB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRGlhbG9nKElQU3RhY2tGcmFtZSBmcmFtZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGZyYW1lICE9IG51bGwpIHsKLQkJCUFycmF5VmFyaWFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFycmF5VmFyaWFibGVEaWFsb2coZ2V0U2hlbGwoKSwgZnJhbWUpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJSVZhcmlhYmxlIHZhcmlhYmxlID0gZGlhbG9nLmdldFNlbGVjdGVkVmFyaWFibGUoKTsKLQkJCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgewotCQkJCQlmb2xkZXIuY3JlYXRlVGFiSXRlbSh2YXJpYWJsZS5nZXROYW1lKCksIHZhcmlhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0NvbXBhcmVWYWx1ZUFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9Db21wYXJlVmFsdWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiMDk5NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0NvbXBhcmVWYWx1ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlLlBWYXJpYWJsZVZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZVZhbHVlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIkNvbXBhcmUgdmFsdWUiOwotCXByaXZhdGUgUFZhcmlhYmxlVmlldyB2aWV3ID0gbnVsbDsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIENvbXBhcmVWYWx1ZUFjdGlvbihQVmFyaWFibGVWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fVkFSX0NPTVBBUkVfTk9STUFMKSk7Ci0JICAgIC8vc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSURfSUNPTl9WQVJfUkVGUkVTSF9ESVNBQkxFKTsKLQkgICAgc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0JICAgIHNldElkKG5hbWUpOwotCSAgICBzZXRFbmFibGVkKGZhbHNlKTsKLQkgICAgdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy92aWV3LmdldFVJTWFuYWdlcigpLnVwZGF0ZVZhcmlhYmxlVmFsdWUodHJ1ZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9EZWJ1Z0FjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9EZWJ1Z0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDMxMDNjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvRGVidWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5QYXJhbGxlbERlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWJ1Z0FjdGlvbiBleHRlbmRzIFBhcmFsbGVsQWN0aW9uIHsKLQlwcm90ZWN0ZWQgUGFyYWxsZWxEZWJ1Z1ZpZXcgdmlldyA9IG51bGw7Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBEZWJ1Z0FjdGlvbihTdHJpbmcgdGV4dCwgUGFyYWxsZWxEZWJ1Z1ZpZXcgdmlldykgewotCQlzdXBlcih0ZXh0LCB2aWV3KTsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0RlbGV0ZVBFeHByZXNzaW9uQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0RlbGV0ZVBFeHByZXNzaW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmVmNTYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9EZWxldGVQRXhwcmVzc2lvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBWYXJpYWJsZU1hbmFnZXIuUFZhcmlhYmxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MudmFyaWFibGUuUFZhcmlhYmxlVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVQRXhwcmVzc2lvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJEZWxldGUiOwotCXByaXZhdGUgUFZhcmlhYmxlVmlldyB2aWV3ID0gbnVsbDsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIERlbGV0ZVBFeHByZXNzaW9uQWN0aW9uKFBWYXJpYWJsZVZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSUNPTl9WQVJfREVMRVRFX05PUk1BTCkpOwotCSAgICAvL3NldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklEX0lDT05fVkFSX0RFTEVURV9ESVNBQkxFKTsKLQkgICAgc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0JICAgIHNldElkKG5hbWUpOwotCSAgICBzZXRFbmFibGVkKGZhbHNlKTsKLQkgICAgdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3LmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGk9c3RydWN0U2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVBWYXJpYWJsZUluZm8galZhciA9IChQVmFyaWFibGVJbmZvKWkubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXZpZXcuZ2V0VUlNYW5hZ2VyKCkuZ2V0Sm9iVmFyaWFibGVNYW5hZ2VyKCkucmVtb3ZlVmFyaWFibGUoalZhci5nZXRKb2IoKSwgalZhci5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCXZpZXcucmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9EaXNhYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvRGlzYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDdhOGYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9EaXNhYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgRGlzYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgRW5hYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkVuYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlI2lzRW5hYmxlQWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZUFjdGlvbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvRWRpdFBFeHByZXNzaW9uQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0VkaXRQRXhwcmVzc2lvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ5MmE1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvRWRpdFBFeHByZXNzaW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QRGVidWdJbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUFZhcmlhYmxlTWFuYWdlci5QVmFyaWFibGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZS5QVmFyaWFibGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlLlBWYXJpYWJsZVZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgRWRpdFBFeHByZXNzaW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIkVkaXQiOwotCXByaXZhdGUgUFZhcmlhYmxlVmlldyB2aWV3ID0gbnVsbDsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIEVkaXRQRXhwcmVzc2lvbkFjdGlvbihQVmFyaWFibGVWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fVkFSX0VESVRfTk9STUFMKSk7Ci0JICAgIC8vc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSURfSUNPTl9WQVJfRURJVF9ESVNBQkxFKTsKLQkgICAgc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0JICAgIHNldElkKG5hbWUpOwotCSAgICBzZXRFbmFibGVkKGZhbHNlKTsKLQkgICAgdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3LmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCVBWYXJpYWJsZUluZm8galZhciA9IChQVmFyaWFibGVJbmZvKSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmICghalZhci5nZXRKb2IoKS5nZXRJRCgpLmVxdWFscyh2aWV3LmdldFVJTWFuYWdlcigpLmdldEN1cnJlbnRKb2JJZCgpKSkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpLCAiTm90IGFsbG93IGVkaXRpbmciLCAiU2VsZWN0ZWQgaXRlbSBkb2VzIG5vdCBiZWxvbmcgdG8gY3VycmVudCBKb2IiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobmV3IFBWYXJpYWJsZURpYWxvZyh2aWV3LCBQVmFyaWFibGVEaWFsb2cuRURJVF9NT0RFKS5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJdmlldy5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9FbmFibGVEaXNhYmxlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Y2FkYjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9FbmFibGVEaXNhYmxlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRSdWxlckFjdGlvbiBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFJ1bGVyQWN0aW9uIHsKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHVibGljIEVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVZlcnRpY2FsUnVsZXJJbmZvIGluZm8pIHsKLQkJc2V0SW5mbyhpbmZvKTsKLQkJc2V0VGFyZ2V0UGFydChwYXJ0KTsKLQkJc2V0VGV4dChBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIkVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb24uRW5hYmxlX0JyZWFrcG9pbnRfMSIpKTsKLQkJc2V0SWQoSVBUUERlYnVnVUlDb25zdGFudHMuQUNUSU9OX0VOQUJMRV9ESVNBQkxFX0JSRUFLUE9JTlQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldEJyZWFrcG9pbnQoKSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWdldEJyZWFrcG9pbnQoKS5zZXRFbmFibGVkKCFnZXRCcmVha3BvaW50KCkuaXNFbmFibGVkKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFRhcmdldFBhcnQoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJFbmFibGVEaXNhYmxlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLkVuYWJsaW5nX2Rpc2FibGluZ19icmVha3BvaW50c18xIiksIEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5FeGNlcHRpb25zX29jY3VycmVkX2VuYWJsaW5nX29yX2Rpc2FibGluZ19icmVha3BvaW50XzEiKSwgZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzZXRCcmVha3BvaW50KGRldGVybWluZUJyZWFrcG9pbnQoKSk7Ci0JCWlmIChnZXRCcmVha3BvaW50KCkgPT0gbnVsbCkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IGdldEJyZWFrcG9pbnQoKS5pc0VuYWJsZWQoKTsKLQkJCXNldFRleHQoZW5hYmxlZD9BY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIkVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb24uRGlzYWJsZV9CcmVha3BvaW50XzEiKTpBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIkVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb24uRW5hYmxlX0JyZWFrcG9pbnRfMSIpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0VuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9FbmFibGVEaXNhYmxlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhNmQ1MC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0VuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIEVuYWJsZURpc2FibGVCcmVha3BvaW50UnVsZXJBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0UnVsZXJBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFJ1bGVyQWN0aW9uRGVsZWdhdGUjY3JlYXRlQWN0aW9uKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVySW5mbykKLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvKSB7Ci0JCXJldHVybiBuZXcgRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRSdWxlckFjdGlvbihlZGl0b3IsIHJ1bGVySW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9FbmFibGVWYXJpYWJsZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9FbmFibGVWYXJpYWJsZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVkY2I5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvRW5hYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JRW5hYmxlRGlzYWJsZVRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVWYXJpYWJsZXNBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVZpZXdQYXJ0IGZWaWV3OwotCi0JcHJpdmF0ZSBJQWN0aW9uIGZBY3Rpb247Ci0KLQlwdWJsaWMgRW5hYmxlVmFyaWFibGVzQWN0aW9uRGVsZWdhdGUoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIElWaWV3UGFydCBnZXRWaWV3KCkgewotCQlyZXR1cm4gZlZpZXc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmlldyhJVmlld1BhcnQgdmlldykgewotCQlmVmlldyA9IHZpZXc7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotCQlyZXR1cm4gZkFjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJZkFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjdGlvbiBlbmFibGVzIHZhcmlhYmxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZUFjdGlvbigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJc2V0Vmlldyh2aWV3KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlmaW5hbCBpbnQgc2l6ZSA9IHNlbGVjdGlvbi5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm47Ci0JCWZpbmFsIEl0ZXJhdG9yPD8+IGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCWZpbmFsIE11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBEZWJ1Z0V4Y2VwdGlvbi5SRVFVRVNUX0ZBSUxFRCwgQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJFbmFibGVWYXJpYWJsZXNBY3Rpb25EZWxlZ2F0ZS4wIiksIG51bGwpOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJCQlJRW5hYmxlRGlzYWJsZVRhcmdldCB0YXJnZXQgPSBnZXRFbmFibGVEaXNhYmxlVGFyZ2V0KGl0Lm5leHQoKSk7Ci0JCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAoc2l6ZSA+IDEpIHsKLQkJCQkJCQkJdGFyZ2V0LnNldEVuYWJsZWQoaXNFbmFibGVBY3Rpb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQkJdGFyZ2V0LnNldEVuYWJsZWQoIXRhcmdldC5pc0VuYWJsZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJbXMubWVyZ2UoZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAoIW1zLmlzT0soKSkgewotCQkJUFRQRGVidWdVSVBsdWdpbi5lcnJvckRpYWxvZyhBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIkVuYWJsZVZhcmlhYmxlc0FjdGlvbkRlbGVnYXRlLjEiKSwgbXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEFjdGlvbihhY3Rpb24pOwotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCU9iamVjdCBvID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoZ2V0RW5hYmxlRGlzYWJsZVRhcmdldChvKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjw/PiBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQlib29sZWFuIGFsbEVuYWJsZWQgPSB0cnVlOwotCQlib29sZWFuIGFsbERpc2FibGVkID0gdHJ1ZTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJRW5hYmxlRGlzYWJsZVRhcmdldCB0YXJnZXQgPSBnZXRFbmFibGVEaXNhYmxlVGFyZ2V0KGl0Lm5leHQoKSk7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgIXRhcmdldC5jYW5FbmFibGVEaXNhYmxlKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFyZ2V0LmlzRW5hYmxlZCgpKQotCQkJCWFsbERpc2FibGVkID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJYWxsRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChpc0VuYWJsZUFjdGlvbigpKQotCQkJYWN0aW9uLnNldEVuYWJsZWQoIWFsbEVuYWJsZWQpOwotCQllbHNlCi0JCQlhY3Rpb24uc2V0RW5hYmxlZCghYWxsRGlzYWJsZWQpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWdldFZpZXcoKS5nZXRWaWV3U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlnZXRWaWV3KCkuZ2V0Vmlld1NpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihnZXRWaWV3KCkuZ2V0Vmlld1NpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVuYWJsZURpc2FibGVUYXJnZXQgZ2V0RW5hYmxlRGlzYWJsZVRhcmdldChPYmplY3Qgb2JqKSB7Ci0JCUlFbmFibGVEaXNhYmxlVGFyZ2V0IHRhcmdldCA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQl0YXJnZXQgPSAoSUVuYWJsZURpc2FibGVUYXJnZXQpKChJQWRhcHRhYmxlKW9iaikuZ2V0QWRhcHRlcihJRW5hYmxlRGlzYWJsZVRhcmdldC5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0dvdG9TZXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvR290b1NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDMwMWUzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvR290b1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkudmlld3MuUGFyYWxsZWxEZWJ1Z1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHb3RvU2V0IGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IGdldFBCcmVha3BvaW50KCk7Ci0JCWlmIChicmVha3BvaW50ICE9IG51bGwpIHsKLQkJCUlWaWV3UGFydCB2aWV3ID0gUFRQRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoSVBUUERlYnVnVUlDb25zdGFudHMuSURfVklFV19QQVJBTExFTERFQlVHKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgUGFyYWxsZWxEZWJ1Z1ZpZXcpIHsKLQkJCQlQYXJhbGxlbERlYnVnVmlldyBwdmlldyA9IChQYXJhbGxlbERlYnVnVmlldyl2aWV3OwotCQkJCXRyeSB7CQkJCQotCQkJCQlTdHJpbmcgamlkID0gYnJlYWtwb2ludC5nZXRKb2JJZCgpOwotCQkJCQlpZiAoamlkLmVxdWFscyhJUEJyZWFrcG9pbnQuR0xPQkFMKSkKLQkJCQkJCWppZCA9IElNYW5hZ2VyLkVNUFRZX0lEOwotCQkJCQkKLQkJCQkJcHZpZXcuZG9DaGFuZ2VKb2IoamlkKTsKLQkJCQkJSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyID0gcHZpZXcuZ2V0Q3VycmVudEVsZW1lbnRIYW5kbGVyKCk7Ci0JCQkJCWlmIChlbGVtZW50SGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlwdmlldy5zZWxlY3RTZXQoKElFbGVtZW50U2V0KWVsZW1lbnRIYW5kbGVyLmdldEVsZW1lbnRCeUlEKGJyZWFrcG9pbnQuZ2V0U2V0SWQoKSkpOwotCQkJCQl9Ci0JCQkJCXB2aWV3LnJlZnJlc2godHJ1ZSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBUUERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogR2V0IFBUUCBicmVha3BvaW50Ci0JICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHB0cCBicmVha3BvaW50Ci0JICovCi0JcHJpdmF0ZSBJUEJyZWFrcG9pbnQgZ2V0UEJyZWFrcG9pbnQoKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVBCcmVha3BvaW50KQotCQkJcmV0dXJuIChJUEJyZWFrcG9pbnQpb2JqOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZCh0aGlzLnNlbGVjdGlvbi5zaXplKCk9PTEgJiYgZ2V0UEJyZWFrcG9pbnQoKSE9bnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL0lSZXN1bWVBdExpbmVUYXJnZXQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvSVJlc3VtZUF0TGluZVRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjEyOTg0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvSVJlc3VtZUF0TGluZVRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZXN1bWVBdExpbmVUYXJnZXQgewkKLQkvKiogUmVzdW1lIGF0IGxpbmUKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lQXRMaW5lKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU3VzcGVuZFJlc3VtZSB0YXJnZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCS8qKiBDYW4gcmVzdW1lIGF0IGxpbmUKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlc3VtZUF0TGluZShJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVN1c3BlbmRSZXN1bWUgdGFyZ2V0KTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvTWFuYWdlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvTWFuYWdlQnJlYWtwb2ludFJ1bGVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZmIyOS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL01hbmFnZUJyZWFrcG9pbnRSdWxlckFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZUJyZWFrcG9pbnRSdWxlckFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcjsKLQlwcml2YXRlIFRvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbiB0YXJnZXRBY3Rpb24gPSBudWxsOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlI2NyZWF0ZUFjdGlvbihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm8pCi0JICovCi0JcHVibGljIElBY3Rpb24gY3JlYXRlQWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgewotCQl0YXJnZXRBY3Rpb24gPSBuZXcgVG9nZ2xlQnJlYWtwb2ludFJ1bGVyQWN0aW9uKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJcmV0dXJuIHRhcmdldEFjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlRWRpdG9yKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBjYWxsZXJBY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmICh0YXJnZXRBY3Rpb24gIT0gbnVsbCkgewotCQkJCXRhcmdldEFjdGlvbi5kaXNwb3NlKCk7Ci0JCQkJdGFyZ2V0QWN0aW9uID0gbnVsbDsKLQkJCX0KLQkJfQotCQlhY3RpdmVFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihjYWxsZXJBY3Rpb24sIHRhcmdldEVkaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJaWYgKFBUUERlYnVnVUlQbHVnaW4uaXNQVFBQZXJzcGVjdGl2ZSgpKQotCQkJdGFyZ2V0QWN0aW9uLnJ1bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUEJyZWFrcG9pbnRQcm9wZXJ0aWVzQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1BCcmVha3BvaW50UHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM0MTJmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUEJyZWFrcG9pbnRQcm9wZXJ0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFBCcmVha3BvaW50UHJvcGVydGllc0FjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OwotCXByaXZhdGUgSVBCcmVha3BvaW50IGJyZWFrcG9pbnQ7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUEJyZWFrcG9pbnRQcm9wZXJ0aWVzQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVByb3BlcnR5RGlhbG9nQWN0aW9uIHByb3BlcnR5QWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKGdldEFjdGl2ZVBhcnQoKS5nZXRTaXRlKCksIG5ldyBJU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEJyZWFrcG9pbnQoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQl9Ci0JCX0gKTsKLQkJcHJvcGVydHlBY3Rpb24ucnVuKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCWlmIChzcy5pc0VtcHR5KCkgfHwgc3Muc2l6ZSgpID4gMSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCU9iamVjdCBlbGVtZW50ID0gc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQQnJlYWtwb2ludCkgewotCQkJCXNldEJyZWFrcG9pbnQoKElQQnJlYWtwb2ludCllbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBHZXQgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBnZXRBY3RpdmVQYXJ0KCkgewotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKiogR2V0IHB0cCBicmVha3BvaW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUEJyZWFrcG9pbnQgZ2V0QnJlYWtwb2ludCgpIHsKLQkJcmV0dXJuIGJyZWFrcG9pbnQ7Ci0JfQotCi0JLyoqIFNldCBwdHAgYnJlYWtwb2ludAotCSAqIEBwYXJhbSBicmVha3BvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QnJlYWtwb2ludChJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQl0aGlzLmJyZWFrcG9pbnQgPSBicmVha3BvaW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUEJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUEJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjNmEwMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1BCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQnJlYWtwb2ludFByb3BlcnRpZXNSdWxlckFjdGlvbiBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFJ1bGVyQWN0aW9uIHsKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHVibGljIFBCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElWZXJ0aWNhbFJ1bGVySW5mbyBpbmZvKSB7Ci0JCXNldEluZm8oaW5mbyk7Ci0JCXNldFRhcmdldFBhcnQocGFydCk7Ci0JCXNldFRleHQoQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJQQnJlYWtwb2ludFByb3BlcnRpZXNSdWxlckFjdGlvbi5CcmVha3BvaW50X1Byb3BlcnRpZXMiKSk7Ci0JCXNldElkKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLkFDVElPTl9CUkVBS1BPSU5UX1BST1BFUlRJRVMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldEJyZWFrcG9pbnQoKSAhPSBudWxsKSB7Ci0JCQlQcm9wZXJ0eURpYWxvZ0FjdGlvbiBhY3Rpb24gPSBuZXcgUHJvcGVydHlEaWFsb2dBY3Rpb24oZ2V0VGFyZ2V0UGFydCgpLmdldFNpdGUoKSwgbmV3IElTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQkJCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRCcmVha3BvaW50KCkpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewkJCQkJCi0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJYWN0aW9uLnJ1bigpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0QnJlYWtwb2ludChkZXRlcm1pbmVCcmVha3BvaW50KCkpOwotCQlpZiAoZ2V0QnJlYWtwb2ludCgpID09IG51bGwgfHwgIShnZXRCcmVha3BvaW50KCkgaW5zdGFuY2VvZiBJUEJyZWFrcG9pbnQpKSB7Ci0JCQlzZXRCcmVha3BvaW50KG51bGwpOwotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1BCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUEJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzEwZDkwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUEJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFBCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdFJ1bGVyQWN0aW9uRGVsZWdhdGUgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlI2NyZWF0ZUFjdGlvbihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm8pCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgewotCQlyZXR1cm4gbmV3IFBCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uKGVkaXRvciwgcnVsZXJJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1JlZ2lzdGVyQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1JlZ2lzdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDMzZTAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZWdpc3RlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z0ltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5QYXJhbGxlbERlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpc3RlckFjdGlvbiBleHRlbmRzIERlYnVnQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIlJlZ2lzdGVyIFNlbGVjdGVkIEVsZW1lbnRzIjsKLQlwcml2YXRlIGludCBOVU1fUFJPQ0VTU19XQVJOSU5HID0gMTA7Ci0JCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgUmVnaXN0ZXJBY3Rpb24oUGFyYWxsZWxEZWJ1Z1ZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSUNPTl9SRUdJU1RFUl9OT1JNQUwpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMpIHsKLQkJaWYgKHZhbGlkYXRpb24oZWxlbWVudHMpKSB7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gTlVNX1BST0NFU1NfV0FSTklORykgewotCQkJCWlmICghVUlVdGlscy5zaG93UXVlc3Rpb25EaWFsb2coIlJlZ2lzdGVyIENvbmZpcm1hdGlvbiIsICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVnaXN0ZXIgKCIgKyBlbGVtZW50cy5sZW5ndGggKyAiKSBwcm9jZXNzZXM/IikpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdmlldy5yZWdpc3RlclNlbGVjdGVkRWxlbWVudHMoKTsKLQkJCQl2aWV3LnJlZnJlc2goZmFsc2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUFRQRGVidWdVSVBsdWdpbi5lcnJvckRpYWxvZyhnZXRTaGVsbCgpLCAiRXJyb3IiLCBlLmdldFN0YXR1cygpKTsJCQkJCi0JCQl9Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZXN0YXJ0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdGFydEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTg0ZDguLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZXN0YXJ0QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN0YXJ0OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFJlc3RhcnRBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0TGlzdGVuZXJBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuQWJzdHJhY3REZWJ1Z0FjdGlvbkRlbGVnYXRlI2RvQWN0aW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9BY3Rpb24oT2JqZWN0IGVsZW1lbnQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCUlSZXN0YXJ0IHJlc3RhcnRUYXJnZXQgPSBnZXRSZXN0YXJ0VGFyZ2V0KGVsZW1lbnQpOwotCQlpZiAocmVzdGFydFRhcmdldCAhPSBudWxsKSB7Ci0JCQlyZXN0YXJ0VGFyZ2V0LnJlc3RhcnQoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZSNpc0VuYWJsZWRGb3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWRGb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVJlc3RhcnQgcmVzdGFydFRhcmdldCA9IGdldFJlc3RhcnRUYXJnZXQoZWxlbWVudCk7Ci0JCWlmIChyZXN0YXJ0VGFyZ2V0ICE9IG51bGwpIHsKLQkJCXJldHVybiBjaGVja0NhcGFiaWxpdHkocmVzdGFydFRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQ2FwYWJpbGl0eShJUmVzdGFydCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmNhblJlc3RhcnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5BYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUjZ2V0U3RhdHVzTWVzc2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKCkgewotCQlyZXR1cm4gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXN0YXJ0QWN0aW9uRGVsZWdhdGUuMCIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZSNnZXRFcnJvckRpYWxvZ01lc3NhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JEaWFsb2dNZXNzYWdlKCkgewotCQlyZXR1cm4gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXN0YXJ0QWN0aW9uRGVsZWdhdGUuMSIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZSNnZXRFcnJvckRpYWxvZ1RpdGxlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yRGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJlc3RhcnRBY3Rpb25EZWxlZ2F0ZS4yIik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuQWJzdHJhY3REZWJ1Z0FjdGlvbkRlbGVnYXRlI2lzUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1J1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElSZXN0YXJ0IGdldFJlc3RhcnRUYXJnZXQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmV0dXJuIChJUmVzdGFydCkoKElBZGFwdGFibGUpZWxlbWVudCkuZ2V0QWRhcHRlcihJUmVzdGFydC5jbGFzcyk7Ci0JCXJldHVybiBnZXREZWZhdWx0UmVzdGFydFRhcmdldChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIElSZXN0YXJ0IGdldERlZmF1bHRSZXN0YXJ0VGFyZ2V0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURlYnVnRWxlbWVudCkgewotCQkJSURlYnVnVGFyZ2V0IHRhcmdldCA9ICgoSURlYnVnRWxlbWVudCllbGVtZW50KS5nZXREZWJ1Z1RhcmdldCgpOwotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXN0YXJ0KQotCQkJCXJldHVybiAoSVJlc3RhcnQpdGFyZ2V0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdW1lQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1Jlc3VtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ3NWFiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlVJRGVidWdNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5QYXJhbGxlbERlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzdW1lQWN0aW9uIGV4dGVuZHMgRGVidWdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiUmVzdW1lIjsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIFJlc3VtZUFjdGlvbihQYXJhbGxlbERlYnVnVmlldyB2aWV3KSB7Ci0JCXN1cGVyKG5hbWUsIHZpZXcpOwotCSAgICBzZXRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1JFU1VNRV9OT1JNQUwpKTsKLQkgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1JFU1VNRV9ESVNBQkxFKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb24jcnVuKG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJRWxlbWVudFtdIGVsZW1lbnRzKSB7fQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJTWFuYWdlciBtYW5hZ2VyID0gdmlldy5nZXRVSU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgaW5zdGFuY2VvZiBVSURlYnVnTWFuYWdlcikgewotCQkJdHJ5IHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkoKFVJRGVidWdNYW5hZ2VyKW1hbmFnZXIpLnJlc3VtZSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdW1lQXRMaW5lQWN0aW9uRGVsZWdhdGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdW1lQXRMaW5lQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhZjgwOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1Jlc3VtZUF0TGluZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3VtZUF0TGluZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJVmlld0FjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyIHsKLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0ID0gbnVsbDsKLQlwcml2YXRlIElSZXN1bWVBdExpbmVUYXJnZXQgZlBhcnRUYXJnZXQgPSBudWxsOwotCXByaXZhdGUgSUFjdGlvbiBmQWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIElTZWxlY3Rpb25MaXN0ZW5lciBmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgRGVidWdTZWxlY3Rpb25MaXN0ZW5lcigpOwotCXByb3RlY3RlZCBJU3VzcGVuZFJlc3VtZSBmVGFyZ2V0RWxlbWVudCA9IG51bGw7Ci0KLQljbGFzcyBEZWJ1Z1NlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZlRhcmdldEVsZW1lbnQgPSBudWxsOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJCWlmIChzcy5zaXplKCkgPT0gMSkgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3VzcGVuZFJlc3VtZSkgewotCQkJCQkJZlRhcmdldEVsZW1lbnQgPSAoSVN1c3BlbmRSZXN1bWUpb2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlKCk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaW5pdChhY3Rpb24pOwotCQliaW5kVG8odGFyZ2V0RWRpdG9yKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQl0aGlzLmZBY3Rpb24gPSBhY3Rpb247Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXN1bWVBdExpbmVBY3Rpb25EZWxlZ2F0ZS4wIikpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZBY3RpdmVQYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVywgZlNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQlmUGFydFRhcmdldCA9IG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZlBhcnRUYXJnZXQgIT0gbnVsbCAmJiBmVGFyZ2V0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZQYXJ0VGFyZ2V0LnJlc3VtZUF0TGluZShmQWN0aXZlUGFydCwgZkFjdGl2ZVBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCksIGZUYXJnZXRFbGVtZW50KTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihmQWN0aXZlUGFydC5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXN1bWVBdExpbmVBY3Rpb25EZWxlZ2F0ZS4xIiksIEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiUmVzdW1lQXRMaW5lQWN0aW9uRGVsZWdhdGUuMiIpLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5mQWN0aW9uID0gYWN0aW9uOwotCQl1cGRhdGUoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoZkFjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCWlmIChmUGFydFRhcmdldCAhPSBudWxsICYmIGZUYXJnZXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gZkFjdGl2ZVBhcnQuZ2V0U2l0ZSgpOwotCQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCQllbmFibGVkID0gZlRhcmdldEVsZW1lbnQuaXNTdXNwZW5kZWQoKSAmJiBmUGFydFRhcmdldC5jYW5SZXN1bWVBdExpbmUoZkFjdGl2ZVBhcnQsIHNlbGVjdGlvbiwgZlRhcmdldEVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJYmluZFRvKHZpZXcpOwotCX0KLQlwcml2YXRlIHZvaWQgYmluZFRvKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OwotCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQlwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVywgZlNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCWZQYXJ0VGFyZ2V0ID0gKElSZXN1bWVBdExpbmVUYXJnZXQpcGFydC5nZXRBZGFwdGVyKElSZXN1bWVBdExpbmVUYXJnZXQuY2xhc3MpOwotCQkJaWYgKGZQYXJ0VGFyZ2V0ID09IG51bGwpIHsKLQkJCQlJQWRhcHRlck1hbmFnZXIgYWRhcHRlck1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotCQkJCS8vIFRPRE86IHdlIGNvdWxkIHJlc3RyaWN0IGxvYWRpbmcgdG8gY2FzZXMgd2hlbiB0aGUgZGVidWdnaW5nIGNvbnRleHQgaXMgb24KLQkJCQlpZiAoYWRhcHRlck1hbmFnZXIuaGFzQWRhcHRlcihwYXJ0LCBJUmVzdW1lQXRMaW5lVGFyZ2V0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQkJZlBhcnRUYXJnZXQgPSAoSVJlc3VtZUF0TGluZVRhcmdldClhZGFwdGVyTWFuYWdlci5sb2FkQWRhcHRlcihwYXJ0LCBJUmVzdW1lQXRMaW5lVGFyZ2V0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gRm9yY2UgdGhlIHNlbGVjdGlvbiB1cGRhdGUKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcGFydC5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbihJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCWZTZWxlY3Rpb25MaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0JCX0KLQkJdXBkYXRlKCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1Jlc3VtZUF0TGluZUFkYXB0ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdW1lQXRMaW5lQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgxM2RhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmVzdW1lQXRMaW5lQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSUp1bXBUb0xpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3VtZUF0TGluZUFkYXB0ZXIgaW1wbGVtZW50cyBJUmVzdW1lQXRMaW5lVGFyZ2V0IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5JUmVzdW1lQXRMaW5lVGFyZ2V0I3Jlc3VtZUF0TGluZShvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZUF0TGluZShJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVN1c3BlbmRSZXN1bWUgdGFyZ2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKXBhcnQ7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSB0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiUmVzdW1lQXRMaW5lQWRhcHRlci4wIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCggaW5wdXQgKTsKLQkJCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCQllcnJvck1lc3NhZ2UgPSBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJlc3VtZUF0TGluZUFkYXB0ZXIuMSIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoaW5wdXQpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQkJZmluYWwgaW50IGxpbmVOdW1iZXIgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpICsgMTsKLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkJCWZpbmFsIElKdW1wVG9MaW5lIGp1bXBUb0xpbmUgPSAoSUp1bXBUb0xpbmUpKChJQWRhcHRhYmxlKXRhcmdldCkuZ2V0QWRhcHRlcihJSnVtcFRvTGluZS5jbGFzcyk7Ci0JCQkJCQlpZiAoanVtcFRvTGluZSAhPSBudWxsICYmIGp1bXBUb0xpbmUuY2FuSnVtcFRvTGluZShmaWxlTmFtZSwgbGluZU51bWJlcikpIHsKLQkJCQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWp1bXBUb0xpbmUuanVtcFRvTGluZShmaWxlTmFtZSwgbGluZU51bWJlcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJZmFpbGVkKGUpOwotCQkJCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCXJ1bkluQmFja2dyb3VuZChyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIFRPRE8gRGlzYXNzZW1ibHlWaWV3Ci0JCWVsc2UgaWYgKHBhcnQgaW5zdGFuY2VvZiBEaXNhc3NlbWJseVZpZXcpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoRGlzYXNzZW1ibHlWaWV3KXBhcnQpLmdldElucHV0KCk7Ci0JCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIERpc2Fzc2VtYmx5RWRpdG9ySW5wdXQpKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXN1bWVBdExpbmVBZGFwdGVyLjIiKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJCWludCBsaW5lTnVtYmVyID0gdGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKSArIDE7Ci0JCQkJZmluYWwgSUFkZHJlc3MgYWRkcmVzcyA9ICgoRGlzYXNzZW1ibHlFZGl0b3JJbnB1dClpbnB1dCkuZ2V0QWRkcmVzcyhsaW5lTnVtYmVyKTsKLQkJCQlpZiAoYWRkcmVzcyAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkJZmluYWwgSUp1bXBUb0FkZHJlc3MganVtcFRvQWRkcmVzcyA9IChJSnVtcFRvQWRkcmVzcykoKElBZGFwdGFibGUpdGFyZ2V0KS5nZXRBZGFwdGVyKElKdW1wVG9BZGRyZXNzLmNsYXNzKTsKLQkJCQkJaWYgKGp1bXBUb0FkZHJlc3MgIT0gbnVsbCAmJiBqdW1wVG9BZGRyZXNzLmNhbkp1bXBUb0FkZHJlc3MoYWRkcmVzcykpIHsKLQkJCQkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJanVtcFRvQWRkcmVzcy5qdW1wVG9BZGRyZXNzKGFkZHJlc3MpOwotCQkJCQkJCQl9IGNhdGNoKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCWZhaWxlZChlKTsKLQkJCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJCXJ1bkluQmFja2dyb3VuZChyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2UgPSBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJlc3VtZUF0TGluZUFkYXB0ZXIuMyIpOwotCQl9Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElQVFBVSUNvbnN0YW50cy5JTlRFUk5BTF9FUlJPUiwgZXJyb3JNZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuSVJlc3VtZUF0TGluZVRhcmdldCNjYW5SZXN1bWVBdExpbmUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWVBdExpbmUoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdXNwZW5kUmVzdW1lIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewkJCQotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCUlKdW1wVG9MaW5lIGp1bXBUb0xpbmUgPSAoSUp1bXBUb0xpbmUpKChJQWRhcHRhYmxlKXRhcmdldCkuZ2V0QWRhcHRlcihJSnVtcFRvTGluZS5jbGFzcyk7Ci0JCQkJaWYgKGp1bXBUb0xpbmUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSAoSUVkaXRvclBhcnQpcGFydDsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoIShlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3JQYXJ0OwotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCVN0cmluZyBmaWxlTmFtZTsKLQkJCQl0cnkgewotCQkJCQlmaWxlTmFtZSA9IGdldEZpbGVOYW1lKGlucHV0KTsKLQkJCQl9Ci0JCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQkJaW50IGxpbmVOdW1iZXIgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpICsgMTsKLQkJCQlyZXR1cm4ganVtcFRvTGluZS5jYW5KdW1wVG9MaW5lKGZpbGVOYW1lLCBsaW5lTnVtYmVyKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBUT0RPIERpc2Fzc2VtYmx5VmlldwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBEaXNhc3NlbWJseVZpZXcpIHsKLQkJCQlJSnVtcFRvQWRkcmVzcyBqdW1wVG9BZGRyZXNzID0gKElKdW1wVG9BZGRyZXNzKSgoSUFkYXB0YWJsZSl0YXJnZXQpLmdldEFkYXB0ZXIoSUp1bXBUb0FkZHJlc3MuY2xhc3MpOwotCQkJCWlmIChqdW1wVG9BZGRyZXNzID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSAoKERpc2Fzc2VtYmx5VmlldylwYXJ0KS5nZXRJbnB1dCgpOwotCQkJCWlmICghKGlucHV0IGluc3RhbmNlb2YgRGlzYXNzZW1ibHlFZGl0b3JJbnB1dCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQlpbnQgbGluZU51bWJlciA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCkgKyAxOwotCQkJCUlBZGRyZXNzIGFkZHJlc3MgPSAoKERpc2Fzc2VtYmx5RWRpdG9ySW5wdXQpaW5wdXQpLmdldEFkZHJlc3MobGluZU51bWJlcik7Ci0JCQkJcmV0dXJuIGp1bXBUb0FkZHJlc3MuY2FuSnVtcFRvQWRkcmVzcyhhZGRyZXNzKTsKLQkJCX0KLQkJCSovCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKiBHZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChJRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKElTdG9yYWdlRWRpdG9ySW5wdXQpaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIFJ1biBhIGpvYiBpbiBiYWNrZ3JvdW5kCi0JICogQHBhcmFtIHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcnVuSW5CYWNrZ3JvdW5kKFJ1bm5hYmxlIHIpIHsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLQl9Ci0KLQkvKiogRmFpbGVkIHRvIHN0b3JlIHN0YXR1cyBoYW5kbGVyCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIGUpIHsKLQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElQVFBVSUNvbnN0YW50cy5TVEFUVVNfQ09ERV9FUlJPUiwgQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXN1bWVBdExpbmVBZGFwdGVyLjQiKSwgbnVsbCk7Ci0JCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuU1RBVFVTX0NPREVfRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCUlTdGF0dXNIYW5kbGVyIGhhbmRsZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdHVzSGFuZGxlcihtcyk7Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaGFuZGxlci5oYW5kbGVTdGF0dXMobXMsIHRoaXMpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZXRhcmdldEFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZXRhcmdldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczY2FmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUmV0YXJnZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJldGFyZ2V0QWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLCBJUGFydExpc3RlbmVyLCBJVXBkYXRlIHsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93ID0gbnVsbDsKLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0ID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBmVGFyZ2V0QWRhcHRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJQWN0aW9uIGZBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTZWxlY3Rpb24gRU1QVFlfU0VMRUNUSU9OID0gbmV3IEVtcHR5U2VsZWN0aW9uKCk7ICAKLQkKLQlzdGF0aWMgY2xhc3MgRW1wdHlTZWxlY3Rpb24gaW1wbGVtZW50cyBJU2VsZWN0aW9uIHsKLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uI2lzRW1wdHkoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgYWN0aXZlIHBhcnQsIHBvc3NpYmx5Ci0JICogYW5kIGVtcHR5IHNlbGVjdGlvbiwgYnV0IG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBpbiB0aGUgYWN0aXZlIHBhcnQsIHBvc3NpYmx5IGVtcHR5Ci0JICovCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGdldFRhcmdldFNlbGVjdGlvbigpIHsKLQkJaWYgKGZBY3RpdmVQYXJ0ICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGZBY3RpdmVQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX1NFTEVDVElPTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZXaW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCWZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkJZlRhcmdldEFkYXB0ZXIgPSBudWxsOwotCQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMuZldpbmRvdyA9IHdpbmRvdzsKLQkJSVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlID0gd2luZG93LmdldFBhcnRTZXJ2aWNlKCk7Ci0JCXBhcnRTZXJ2aWNlLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRTZXJ2aWNlLmdldEFjdGl2ZVBhcnQoKTsKLQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJcGFydEFjdGl2YXRlZChwYXJ0KTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZlRhcmdldEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwZXJmb3JtQWN0aW9uKGZUYXJnZXRBZGFwdGVyLCBnZXRUYXJnZXRTZWxlY3Rpb24oKSwgZkFjdGl2ZVBhcnQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGZXaW5kb3cuZ2V0U2hlbGwoKSwgQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXRhcmdldEFjdGlvbi4yIiksIEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiUmV0YXJnZXRBY3Rpb24uMyIpLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIHNwZWNpZmljIGJyZWFrcG9pbnQgdG9nZ2xpbmcuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiBzZWxlY3Rpb24gaW4gdGhlIGFjdGl2ZSBwYXJ0IAotCSAqIEBwYXJhbSBwYXJ0IGFjdGl2ZSBwYXJ0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybUFjdGlvbihPYmplY3QgdGFyZ2V0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVdvcmtiZW5jaFBhcnQgcGFydCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmZBY3Rpb24gPSBhY3Rpb247Ci0JCS8vIGlmIHRoZSBhY3RpdmUgcGFydCBkaWQgbm90IHByb3ZpZGUgYW4gYWRhcHRlciwgc2VlIGlmIHRoZSBzZWxlY3RvaW4gZG9lcwotCQlpZiAoZlRhcmdldEFkYXB0ZXIgPT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmICghc3MuaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IHNzLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCWZUYXJnZXRBZGFwdGVyID0gZ2V0QWRhcHRlcigoSUFkYXB0YWJsZSkgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdXBkYXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBwYXJ0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwgJiYgcGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUVkaXRvclBhcnQpcGFydCkuZ2V0RWRpdG9ySW5wdXQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCX0KLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWZUYXJnZXRBZGFwdGVyID0gZ2V0QWRhcHRlcihyZXNvdXJjZSk7Ci0JCX0KLQkJaWYgKGZUYXJnZXRBZGFwdGVyID09IG51bGwpIHsKLQkJCWZUYXJnZXRBZGFwdGVyID0gZ2V0QWRhcHRlcihwYXJ0KTsKLQkJfQotCQl1cGRhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRBZGFwdGVyKElBZGFwdGFibGUgYWRhcHRhYmxlKSB7Ci0JCU9iamVjdCBhZGFwdGVyICA9IGFkYXB0YWJsZS5nZXRBZGFwdGVyKGdldEFkYXB0ZXJDbGFzcygpKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJSUFkYXB0ZXJNYW5hZ2VyIGFkYXB0ZXJNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLQkJCWlmIChhZGFwdGVyTWFuYWdlci5oYXNBZGFwdGVyKGFkYXB0YWJsZSwgZ2V0QWRhcHRlckNsYXNzKCkuZ2V0TmFtZSgpKSkgeyAKLQkJCQlmVGFyZ2V0QWRhcHRlciA9IGFkYXB0ZXJNYW5hZ2VyLmxvYWRBZGFwdGVyKGFkYXB0YWJsZSwgZ2V0QWRhcHRlckNsYXNzKCkuZ2V0TmFtZSgpKTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgYWRhcHRlciAodGFyZ2V0KSB0aGlzIGFjdGlvbiB3b3JrcyBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGFkYXB0ZXIgdGhpcyBhY3Rpb24gd29ya3Mgb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3MgZ2V0QWRhcHRlckNsYXNzKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJY2xlYXJQYXJ0KHBhcnQpOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhcnMgcmVmZXJlbmNlIHRvIGFjdGl2ZSBwYXJ0IGFuZCBhZGFwdGVyIHdoZW4gYSByZWxldmFudCBwYXJ0Ci0JICogaXMgY2xvc2VkIG9yIGRlYWN0aXZhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0IHdvcmtiZW5jaCBwYXJ0IHRoYXQgaGFzIGJlZW4gY2xvc2VkIG9yIGRlYWN0aXZhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJQYXJ0KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQuZXF1YWxzKGZBY3RpdmVQYXJ0KSkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQkJZlRhcmdldEFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWNsZWFyUGFydChwYXJ0KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGZBY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmVGFyZ2V0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQlmQWN0aW9uLnNldEVuYWJsZWQoY2FuUGVyZm9ybUFjdGlvbihmVGFyZ2V0QWRhcHRlciwgZ2V0VGFyZ2V0U2VsZWN0aW9uKCksIGZBY3RpdmVQYXJ0KSk7Ci0JCX0gZWxzZSB7Ci0JCQlmQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWMgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgYWRhcHRlciAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gdG8gdmVyaWZ5IHRoZSBvcGVyYXRpb24gb24KLQkgKiBAcGFyYW0gcGFydCB0aGUgcGFydCB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZCBvbgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjYW5QZXJmb3JtQWN0aW9uKE9iamVjdCB0YXJnZXQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJV29ya2JlbmNoUGFydCBwYXJ0KTsgCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1JldGFyZ2V0UmVzdW1lQXRMaW5lQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1JldGFyZ2V0UmVzdW1lQXRMaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMzk4ZDAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZXRhcmdldFJlc3VtZUF0TGluZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmV0YXJnZXRSZXN1bWVBdExpbmVBY3Rpb24gZXh0ZW5kcyBSZXRhcmdldEFjdGlvbiB7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IERlYnVnU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQlwcml2YXRlIElTdXNwZW5kUmVzdW1lIGZUYXJnZXRFbGVtZW50ID0gbnVsbDsKLQotCWNsYXNzIERlYnVnU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJc2V0VGFyZ2V0RWxlbWVudChudWxsKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQlpZiAoc3Muc2l6ZSgpID09IDEpIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IHNzLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN1c3BlbmRSZXN1bWUpIHsKLQkJCQkJCXNldFRhcmdldEVsZW1lbnQoKElTdXNwZW5kUmVzdW1lKW9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl1cGRhdGUoKTsKLQkJfQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcsIGZTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIuaW5pdCh3aW5kb3cpOwotCQl3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcsIGZTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmV0YXJnZXRBY3Rpb24jcGVyZm9ybUFjdGlvbihqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BY3Rpb24oT2JqZWN0IHRhcmdldCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHBhcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJKChJUmVzdW1lQXRMaW5lVGFyZ2V0KXRhcmdldCkucmVzdW1lQXRMaW5lKHBhcnQsIHNlbGVjdGlvbiwgZ2V0VGFyZ2V0RWxlbWVudCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbiNnZXRBZGFwdGVyQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRBZGFwdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBJUmVzdW1lQXRMaW5lVGFyZ2V0LmNsYXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlJldGFyZ2V0QWN0aW9uI2NhblBlcmZvcm1BY3Rpb24oamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5QZXJmb3JtQWN0aW9uKE9iamVjdCB0YXJnZXQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJldHVybiBnZXRUYXJnZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAoKElSZXN1bWVBdExpbmVUYXJnZXQpdGFyZ2V0KS5jYW5SZXN1bWVBdExpbmUocGFydCwgc2VsZWN0aW9uLCBnZXRUYXJnZXRFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBJU3VzcGVuZFJlc3VtZSBnZXRUYXJnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZlRhcmdldEVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0RWxlbWVudChJU3VzcGVuZFJlc3VtZSB0YXJnZXRFbGVtZW50KSB7Ci0JCWZUYXJnZXRFbGVtZW50ID0gdGFyZ2V0RWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1JldGFyZ2V0dGFibGVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZXRhcmdldHRhYmxlQWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1ZmVkYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1JldGFyZ2V0dGFibGVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklSdW5Ub0xpbmVUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFJldGFyZ2V0dGFibGVBY3Rpb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBJVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuY2xhc3MpIHsKLQkJCXJldHVybiBuZXcgVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIoKTsKLQkJfQotCQlpZiAoYWRhcHRlclR5cGUgPT0gSVJ1blRvTGluZVRhcmdldC5jbGFzcykgewotCQkJcmV0dXJuIG5ldyBSdW5Ub0xpbmVBZGFwdGVyKCk7Ci0JCX0gCi0JCWlmIChhZGFwdGVyVHlwZSA9PSBJUmVzdW1lQXRMaW5lVGFyZ2V0LmNsYXNzKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc3VtZUF0TGluZUFkYXB0ZXIoKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJUnVuVG9MaW5lVGFyZ2V0LmNsYXNzLCBJVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuY2xhc3MsIElSZXN1bWVBdExpbmVUYXJnZXQuY2xhc3N9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvUnVuVG9MaW5lQWRhcHRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SdW5Ub0xpbmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2E3YzAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9SdW5Ub0xpbmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JUnVuVG9MaW5lVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSdW5Ub0xpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFJ1blRvTGluZUFkYXB0ZXIgaW1wbGVtZW50cyBJUnVuVG9MaW5lVGFyZ2V0IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklSdW5Ub0xpbmVUYXJnZXQjcnVuVG9MaW5lKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUpCi0JICovCi0JcHVibGljIHZvaWQgcnVuVG9MaW5lKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU3VzcGVuZFJlc3VtZSB0YXJnZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpcGFydDsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLkVtcHR5X2VkaXRvcl8xIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLk1pc3NpbmdfZG9jdW1lbnRfMSIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoaW5wdXQpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQkJZmluYWwgaW50IGxpbmVOdW1iZXIgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpICsgMTsKLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkJCWZpbmFsIElSdW5Ub0xpbmUgcnVuVG9MaW5lID0gKElSdW5Ub0xpbmUpKChJQWRhcHRhYmxlKXRhcmdldCkuZ2V0QWRhcHRlcihJUnVuVG9MaW5lLmNsYXNzKTsKLQkJCQkJCWlmIChydW5Ub0xpbmUgIT0gbnVsbCAmJiBydW5Ub0xpbmUuY2FuUnVuVG9MaW5lKGZpbGVOYW1lLCBsaW5lTnVtYmVyKSkgewotCQkJCQkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJcnVuVG9MaW5lLnJ1blRvTGluZShmaWxlTmFtZSwgbGluZU51bWJlciwgRGVidWdVSVRvb2xzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oSURlYnVnVUlDb25zdGFudHMuUFJFRl9TS0lQX0JSRUFLUE9JTlRTX0RVUklOR19SVU5fVE9fTElORSkpOwotCQkJCQkJCQkJfSBjYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJZmFpbGVkKGUpOwotCQkJCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCXJ1bkluQmFja2dyb3VuZCggciApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogVE9ETyBEaXNhc3NlbWJseVZpZXcKLQkJZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIERpc2Fzc2VtYmx5VmlldykgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gKChEaXNhc3NlbWJseVZpZXcpcGFydCkuZ2V0SW5wdXQoKTsKLQkJCWlmICghKGlucHV0IGluc3RhbmNlb2YgRGlzYXNzZW1ibHlFZGl0b3JJbnB1dCkpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJ1blRvTGluZUFkYXB0ZXIuRW1wdHlfZWRpdG9yXzEiKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJCWludCBsaW5lTnVtYmVyID0gdGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKSArIDE7Ci0JCQkJZmluYWwgSUFkZHJlc3MgYWRkcmVzcyA9ICgoRGlzYXNzZW1ibHlFZGl0b3JJbnB1dClpbnB1dCkuZ2V0QWRkcmVzcyhsaW5lTnVtYmVyKTsKLQkJCQlpZiAoYWRkcmVzcyAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkJZmluYWwgSVJ1blRvQWRkcmVzcyBydW5Ub0FkZHJlc3MgPSAoSVJ1blRvQWRkcmVzcykoKElBZGFwdGFibGUpdGFyZ2V0KS5nZXRBZGFwdGVyKElSdW5Ub0FkZHJlc3MuY2xhc3MpOwotCQkJCQlpZiAocnVuVG9BZGRyZXNzICE9IG51bGwgJiYgcnVuVG9BZGRyZXNzLmNhblJ1blRvQWRkcmVzcyhhZGRyZXNzKSkgewotCQkJCQkJUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlydW5Ub0FkZHJlc3MucnVuVG9BZGRyZXNzKGFkZHJlc3MsIERlYnVnVUlUb29scy5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKElEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfU0tJUF9CUkVBS1BPSU5UU19EVVJJTkdfUlVOX1RPX0xJTkUpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlmYWlsZWQoZSk7Ci0JCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQlydW5JbkJhY2tncm91bmQocik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCSovCi0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLk9wZXJhdGlvbl9pc19ub3Rfc3VwcG9ydGVkXzEiKTsKLQkJfQotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsIGVycm9yTWVzc2FnZSwgbnVsbCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVJ1blRvTGluZVRhcmdldCNjYW5SdW5Ub0xpbmUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5Ub0xpbmUoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdXNwZW5kUmVzdW1lIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewkJCQotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCUlSdW5Ub0xpbmUgcnVuVG9MaW5lID0gKElSdW5Ub0xpbmUpKChJQWRhcHRhYmxlKXRhcmdldCkuZ2V0QWRhcHRlcihJUnVuVG9MaW5lLmNsYXNzKTsKLQkJCQlpZiAocnVuVG9MaW5lID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gKElFZGl0b3JQYXJ0KXBhcnQ7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpZWRpdG9yUGFydDsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQkJdHJ5IHsKLQkJCQkJZmlsZU5hbWUgPSBnZXRGaWxlTmFtZShpbnB1dCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQlpbnQgbGluZU51bWJlciA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCkgKyAxOwotCQkJCXJldHVybiBydW5Ub0xpbmUuY2FuUnVuVG9MaW5lKGZpbGVOYW1lLCBsaW5lTnVtYmVyKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBUT0RPIERpc2Fzc2VtYmx5VmlldwkJCQotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBEaXNhc3NlbWJseVZpZXcpIHsKLQkJCQlJUnVuVG9BZGRyZXNzIHJ1blRvQWRkcmVzcyA9IChJUnVuVG9BZGRyZXNzKSgoSUFkYXB0YWJsZSl0YXJnZXQpLmdldEFkYXB0ZXIoSVJ1blRvQWRkcmVzcy5jbGFzcyk7Ci0JCQkJaWYgKHJ1blRvQWRkcmVzcyA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gKChEaXNhc3NlbWJseVZpZXcpcGFydCkuZ2V0SW5wdXQoKTsKLQkJCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIERpc2Fzc2VtYmx5RWRpdG9ySW5wdXQpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQkJaW50IGxpbmVOdW1iZXIgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpICsgMTsKLQkJCQlJQWRkcmVzcyBhZGRyZXNzID0gKChEaXNhc3NlbWJseUVkaXRvcklucHV0KWlucHV0KS5nZXRBZGRyZXNzKGxpbmVOdW1iZXIpOwotCQkJCXJldHVybiBydW5Ub0FkZHJlc3MuY2FuUnVuVG9BZGRyZXNzKGFkZHJlc3MpOwotCQkJfQotCQkJKi8KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqIEdldCBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKElGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoSVN0b3JhZ2VFZGl0b3JJbnB1dClpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogUnVuIGEgam9iIGluIGJhY2tncm91bmQKLQkgKiBAcGFyYW0gcgotCSAqLwotCXByaXZhdGUgdm9pZCBydW5JbkJhY2tncm91bmQoUnVubmFibGUgcikgewotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotCX0KLQotCS8qKiBGYWlsZWQgdG8gc3RvcmUgc3RhdHVzIGhhbmRsZXIKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZhaWxlZChUaHJvd2FibGUgZSkgewotCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVBUUFVJQ29uc3RhbnRzLlNUQVRVU19DT0RFX0VSUk9SLCBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJlc3VtZUF0TGluZUFkYXB0ZXIuNCIpLCBudWxsKTsKLQkJbXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElQVFBVSUNvbnN0YW50cy5TVEFUVVNfQ09ERV9FUlJPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJSVN0YXR1c0hhbmRsZXIgaGFuZGxlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0dXNIYW5kbGVyKG1zKTsKLQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQloYW5kbGVyLmhhbmRsZVN0YXR1cyhtcywgdGhpcyk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1Nob3dGdWxsUGF0aHNBY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU2hvd0Z1bGxQYXRoc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTIyOGY5Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU2hvd0Z1bGxQYXRoc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z01vZGVsUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU2hvd0Z1bGxQYXRoc0FjdGlvbiBleHRlbmRzIFZpZXdGaWx0ZXJBY3Rpb24gewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gZ2V0U3RydWN0dXJlZFZpZXdlcigpOwotCQlJRGVidWdWaWV3IHZpZXcgPSAoSURlYnVnVmlldylnZXRWaWV3KCkuZ2V0QWRhcHRlcihJRGVidWdWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJSURlYnVnTW9kZWxQcmVzZW50YXRpb24gcHJlcyA9IHZpZXcuZ2V0UHJlc2VudGF0aW9uKFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJCWlmIChwcmVzICE9IG51bGwpIHsKLQkJCQlwcmVzLnNldEF0dHJpYnV0ZShQRGVidWdNb2RlbFByZXNlbnRhdGlvbi5ESVNQTEFZX0ZVTExfUEFUSFMsIChnZXRWYWx1ZSgpP0Jvb2xlYW4uVFJVRTpCb29sZWFuLkZBTFNFKSk7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUodmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCVByZWZlcmVuY2VzIHN0b3JlID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCQkJCVN0cmluZyBrZXkgPSBnZXRWaWV3KCkuZ2V0U2l0ZSgpLmdldElkKCkgKyAiLiIgKyBnZXRQcmVmZXJlbmNlS2V5KCk7Ci0JCQkJCQlzdG9yZS5zZXRWYWx1ZShrZXksIGdldFZhbHVlKCkpOwotCQkJCQkJUFRQRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9ICk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlZpZXdGaWx0ZXJBY3Rpb24jZ2V0UHJlZmVyZW5jZUtleSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlS2V5KCkgewotCQlyZXR1cm4gSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1NIT1dfRlVMTF9QQVRIUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1NpZ25hbEFjdGlvbkRlbGVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1NpZ25hbEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzc5NjMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TaWduYWxBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJUFNpZ25hbCBmU2lnbmFsID0gbnVsbDsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQoSUFjdGlvbiwgSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZ2V0U2lnbmFsKCkgIT0gbnVsbCkgewotCQkJZmluYWwgTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIERlYnVnRXhjZXB0aW9uLlJFUVVFU1RfRkFJTEVELCBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbEFjdGlvbkRlbGVnYXRlLjAiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJZG9BY3Rpb24oZ2V0U2lnbmFsKCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJCW1zLm1lcmdlKGUuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoIW1zLmlzT0soKSkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUFRQRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJUFRQRGVidWdVSVBsdWdpbi5lcnJvckRpYWxvZyhBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbEFjdGlvbkRlbGVnYXRlLjEiKSwgbXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlQVFBEZWJ1Z1VJUGx1Z2luLmxvZyhtcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQU2lnbmFsKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkID0gZW5hYmxlc0ZvcigoSVBTaWduYWwpZWxlbWVudCk7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJaWYgKGVuYWJsZWQpIHsKLQkJCQkJc2V0U2lnbmFsKChJUFNpZ25hbCllbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNldFNpZ25hbChudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0FjdGlvbihJUFNpZ25hbCBzaWduYWwpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXNpZ25hbC5zaWduYWwoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlc0ZvcihJUFNpZ25hbCBzaWduYWwpIHsKLQkJcmV0dXJuIChzaWduYWwgIT0gbnVsbCAmJiBzaWduYWwuZ2V0RGVidWdUYXJnZXQoKS5pc1N1c3BlbmRlZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2lnbmFsKElQU2lnbmFsIHNpZ25hbCkgewotCQlmU2lnbmFsID0gc2lnbmFsOwotCX0KLQotCXByb3RlY3RlZCBJUFNpZ25hbCBnZXRTaWduYWwoKSB7Ci0JCXJldHVybiBmU2lnbmFsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU2lnbmFsUHJvcGVydGllc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1NpZ25hbFByb3BlcnRpZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjMxZGVjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU2lnbmFsUHJvcGVydGllc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFNpZ25hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFNpZ25hbFByb3BlcnRpZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElQU2lnbmFsIGZTaWduYWw7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmVGFyZ2V0UGFydDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBTaWduYWxQcm9wZXJ0aWVzQWN0aW9uRGVsZWdhdGUuCi0JICogCi0JICovCi0JcHVibGljIFNpZ25hbFByb3BlcnRpZXNBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlmVGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFNpZ25hbCkgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCXNldFNpZ25hbCgoSVBTaWduYWwpZWxlbWVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2V0U2lnbmFsKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBJUFNpZ25hbCBnZXRTaWduYWwoKSB7Ci0JCXJldHVybiB0aGlzLmZTaWduYWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNpZ25hbChJUFNpZ25hbCBzaWduYWwpIHsKLQkJdGhpcy5mU2lnbmFsID0gc2lnbmFsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVByb3BlcnR5RGlhbG9nQWN0aW9uIHByb3BlcnR5QWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKGdldEFjdGl2ZVBhcnQoKS5nZXRTaXRlKCksIG5ldyBJU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJfQotCi0JCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFNpZ25hbCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQl9Ci0JCX0pOwotCQlwcm9wZXJ0eUFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZ2V0QWN0aXZlUGFydCgpIHsKLQkJcmV0dXJuIGZUYXJnZXRQYXJ0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU2lnbmFsWmVyb1dvcmtiZW5jaEFjdGlvbkRlbGVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1NpZ25hbFplcm9Xb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZhOWY0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU2lnbmFsWmVyb1dvcmtiZW5jaEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklSZXN1bWVXaXRob3V0U2lnbmFsOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFNpZ25hbFplcm9Xb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0TGlzdGVuZXJBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5BYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUjZG9BY3Rpb24oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0FjdGlvbihPYmplY3QgZWxlbWVudCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzdW1lV2l0aG91dFNpZ25hbCkgewotCQkJKChJUmVzdW1lV2l0aG91dFNpZ25hbCllbGVtZW50KS5yZXN1bWVXaXRob3V0U2lnbmFsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZSNpc0VuYWJsZWRGb3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWRGb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzdW1lV2l0aG91dFNpZ25hbCkgewotCQkJcmV0dXJuICgoSVJlc3VtZVdpdGhvdXRTaWduYWwpZWxlbWVudCkuY2FuUmVzdW1lV2l0aG91dFNpZ25hbCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZSNnZXRTdGF0dXNNZXNzYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKSB7Ci0JCXJldHVybiBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbFplcm9Xb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS4wIik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdERlYnVnQWN0aW9uRGVsZWdhdGUjZ2V0RXJyb3JEaWFsb2dNZXNzYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yRGlhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiU2lnbmFsWmVyb1dvcmtiZW5jaEFjdGlvbkRlbGVnYXRlLjEiKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0RGVidWdBY3Rpb25EZWxlZ2F0ZSNnZXRFcnJvckRpYWxvZ1RpdGxlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yRGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbFplcm9Xb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS4yIik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuQWJzdHJhY3REZWJ1Z0FjdGlvbkRlbGVnYXRlI2lzUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1J1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdGVwQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1N0ZXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjZDYwMS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1N0ZXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5QYXJhbGxlbERlYnVnVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RlcEFjdGlvbiBleHRlbmRzIERlYnVnQWN0aW9uIHsKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSB2aWV3Ci0JICovCi0JcHVibGljIFN0ZXBBY3Rpb24oU3RyaW5nIHRleHQsIFBhcmFsbGVsRGVidWdWaWV3IHZpZXcpIHsKLQkJc3VwZXIodGV4dCwgdmlldyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdGVwSW50b0FjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdGVwSW50b0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY3ZmNiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU3RlcEludG9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QRGVidWdJbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuVUlEZWJ1Z01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnZpZXdzLlBhcmFsbGVsRGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBJbnRvQWN0aW9uIGV4dGVuZHMgU3RlcEFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTdGVwIEludG8iOwotCi0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHZpZXcKLQkgKi8KLQlwdWJsaWMgU3RlcEludG9BY3Rpb24oUGFyYWxsZWxEZWJ1Z1ZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSUNPTl9TVEVQSU5UT19OT1JNQUwpKTsKLQkgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1NURVBJTlRPX0RJU0FCTEUpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMpIHt9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlNYW5hZ2VyIG1hbmFnZXIgPSB2aWV3LmdldFVJTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciBpbnN0YW5jZW9mIFVJRGVidWdNYW5hZ2VyKSB7Ci0JCQl0cnkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCSgoVUlEZWJ1Z01hbmFnZXIpbWFuYWdlcikuc3RlcEludG8oKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1N0ZXBPdmVyQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1N0ZXBPdmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Y2Y0YzcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdGVwT3ZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z0ltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5VSURlYnVnTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkudmlld3MuUGFyYWxsZWxEZWJ1Z1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RlcE92ZXJBY3Rpb24gZXh0ZW5kcyBTdGVwQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIlN0ZXAgT3ZlciI7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBTdGVwT3ZlckFjdGlvbihQYXJhbGxlbERlYnVnVmlldyB2aWV3KSB7Ci0JCXN1cGVyKG5hbWUsIHZpZXcpOwotCSAgICBzZXRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1NURVBPVkVSX05PUk1BTCkpOwotCSAgICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fU1RFUE9WRVJfRElTQUJMRSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSU1hbmFnZXIgbWFuYWdlciA9IHZpZXcuZ2V0VUlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyIGluc3RhbmNlb2YgVUlEZWJ1Z01hbmFnZXIpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJKChVSURlYnVnTWFuYWdlciltYW5hZ2VyKS5zdGVwT3ZlcigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU3RlcFJldHVybkFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdGVwUmV0dXJuQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzdmZGUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdGVwUmV0dXJuQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlVJRGVidWdNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5QYXJhbGxlbERlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwUmV0dXJuQWN0aW9uIGV4dGVuZHMgU3RlcEFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTdGVwIFJldHVybiI7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBTdGVwUmV0dXJuQWN0aW9uKFBhcmFsbGVsRGVidWdWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgdmlldyk7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fU1RFUFJFVFVSTl9OT1JNQUwpKTsKLQkgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1NURVBSRVRVUk5fRElTQUJMRSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMpIHt9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlNYW5hZ2VyIG1hbmFnZXIgPSB2aWV3LmdldFVJTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciBpbnN0YW5jZW9mIFVJRGVidWdNYW5hZ2VyKSB7Ci0JCQl0cnkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCSgoVUlEZWJ1Z01hbmFnZXIpbWFuYWdlcikuc3RlcFJldHVybigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvU3VzcGVuZEFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdXNwZW5kQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTk5MDYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9TdXNwZW5kQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlVJRGVidWdNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3cy5QYXJhbGxlbERlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXNwZW5kQWN0aW9uIGV4dGVuZHMgRGVidWdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3VzcGVuZCI7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBTdXNwZW5kQWN0aW9uKFBhcmFsbGVsRGVidWdWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgdmlldyk7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fU1VTUEVORF9OT1JNQUwpKTsKLQkgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1NVU1BFTkRfRElTQUJMRSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5hY3Rpb25zLlBhcmFsbGVsQWN0aW9uI3J1bihvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUVsZW1lbnRbXSBlbGVtZW50cykge30KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSU1hbmFnZXIgbWFuYWdlciA9IHZpZXcuZ2V0VUlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyIGluc3RhbmNlb2YgVUlEZWJ1Z01hbmFnZXIpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJKChVSURlYnVnTWFuYWdlciltYW5hZ2VyKS5zdXNwZW5kKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlzZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9UZXJtaW5hdGVBY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVGVybWluYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODNhNjEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9UZXJtaW5hdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QRGVidWdJbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuVUlEZWJ1Z01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnZpZXdzLlBhcmFsbGVsRGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5JTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFRlcm1pbmF0ZUFjdGlvbiBleHRlbmRzIERlYnVnQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIlRlcm1pbmF0ZSI7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBUZXJtaW5hdGVBY3Rpb24oUGFyYWxsZWxEZWJ1Z1ZpZXcgdmlldykgewotCQlzdXBlcihuYW1lLCB2aWV3KTsKLQkgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSUNPTl9URVJNSU5BVEVBTExfTk9STUFMKSk7Ci0JICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLmdldERlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSUNPTl9URVJNSU5BVEVBTExfRElTQUJMRSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMpIHt9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlNYW5hZ2VyIG1hbmFnZXIgPSB2aWV3LmdldFVJTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciBpbnN0YW5jZW9mIFVJRGVidWdNYW5hZ2VyKSB7Ci0JCQl0cnkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCSgoVUlEZWJ1Z01hbmFnZXIpbWFuYWdlcikudGVybWluYXRlKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlzZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9Ub2dnbGVCcmVha3BvaW50QWRhcHRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9Ub2dnbGVCcmVha3BvaW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjllMDljLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuVUlEZWJ1Z01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkubW9kZWwuSUVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVkaXRvclN0YXR1c0xpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIgaW1wbGVtZW50cyBJVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQgewotCXByaXZhdGUgVUlEZWJ1Z01hbmFnZXIgdWlEZWJ1Z01hbmFnZXIgPSBudWxsOwotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXB1YmxpYyBUb2dnbGVCcmVha3BvaW50QWRhcHRlcigpIHsKLQkJdWlEZWJ1Z01hbmFnZXIgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVJRGVidWdNYW5hZ2VyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I3RvZ2dsZUxpbmVCcmVha3BvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZUxpbmVCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIVBUUERlYnVnVUlQbHVnaW4uaXNQVFBQZXJzcGVjdGl2ZSgpKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpcGFydDsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVCcmVha3BvaW50QWRhcHRlci5FbXB0eV9lZGl0b3JfMSIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoIGlucHV0ICk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVCcmVha3BvaW50QWRhcHRlci5NaXNzaW5nX2RvY3VtZW50XzEiKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHRleHRFZGl0b3IpOwotCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVCcmVha3BvaW50QWRhcHRlci5NaXNzaW5nX3Jlc291cmNlXzEiKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUJyZWFrcG9pbnRMb2NhdGlvblZlcmlmaWVyIGJ2ID0gbmV3IEJyZWFrcG9pbnRMb2NhdGlvblZlcmlmaWVyKCk7Ci0JCQkJCQlpbnQgbGluZU51bWJlciA9IGJ2LmdldFZhbGlkTGluZUJyZWFrcG9pbnRMb2NhdGlvbihkb2N1bWVudCwgKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldFN0YXJ0TGluZSgpKTsKLQkJCQkJCWlmIChsaW5lTnVtYmVyID09IC0xKSB7Ci0JCQkJCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVCcmVha3BvaW50QWRhcHRlci5JbnZhbGlkX2xpbmVfMSIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVBKb2Igam9iID0gdWlEZWJ1Z01hbmFnZXIuZ2V0Sm9iKCk7Ci0JCQkJCQkJU3RyaW5nIHNpZCA9IHVpRGVidWdNYW5hZ2VyLmdldEN1cnJlbnRTZXRJZCgpOwotCQkJCQkJCXNpZCA9IChzaWQgPT0gbnVsbCB8fCBzaWQubGVuZ3RoKCkgPT0gMCk/SUVsZW1lbnRIYW5kbGVyLlNFVF9ST09UX0lEOnNpZDsKLQkJCQkJCQlTdHJpbmcgc291cmNlSGFuZGxlID0gZ2V0U291cmNlSGFuZGxlKGlucHV0KTsKLQkJCQkJCQlJUExpbmVCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBQRGVidWdNb2RlbC5saW5lQnJlYWtwb2ludHNFeGlzdHMoc291cmNlSGFuZGxlLCByZXNvdXJjZSwgbGluZU51bWJlcik7Ci0JCQkJCQkJaWYgKGJyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHsvLyByZW1vdmUgYnJlYWtwb2ludCBpZiBmb3VuZCBhbnkgYnJlYWtwb2ludCBpbiBjdXJyZW50IGpvYgotCQkJCQkJCQlJUExpbmVCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBQRGVidWdNb2RlbC5saW5lQnJlYWtwb2ludEV4aXN0cyhicmVha3BvaW50cywgam9iKTsKLQkJCQkJCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGJyZWFrcG9pbnQuaXNHbG9iYWwoKSkgewotCQkJCQkJCQkJCWlmIChqb2IgPT0gbnVsbCkgewotCQkJCQkJCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnQsIHRydWUpOwkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludCwgdHJ1ZSk7CQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgLy8gY3JlYXRlIGEgbmV3IGJyZWFrcG9pbnQKLQkJCQkJCQkJCVBEZWJ1Z01vZGVsLmNyZWF0ZUxpbmVCcmVha3BvaW50KHNvdXJjZUhhbmRsZSwgcmVzb3VyY2UsIGxpbmVOdW1iZXIsIHRydWUsIDAsICIiLCB0cnVlLCBzaWQsIGpvYik7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgLy8gbm8gYnJlYWtwb2ludCBmb3VuZCBhbmQgY3JlYXRlIGEgbmV3IG9uZQotCQkJCQkJCQlQRGVidWdNb2RlbC5jcmVhdGVMaW5lQnJlYWtwb2ludChzb3VyY2VIYW5kbGUsIHJlc291cmNlLCBsaW5lTnVtYmVyLCB0cnVlLCAwLCAiIiwgdHJ1ZSwgc2lkLCBqb2IpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvKgotCQkgKiBUT0RPIERpc2Fzc2VtYmx5VmlldwotCQllbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgRGlzYXNzZW1ibHlWaWV3KSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSAoKERpc2Fzc2VtYmx5VmlldylwYXJ0KS5nZXRJbnB1dCgpOwotCQkJaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBEaXNhc3NlbWJseUVkaXRvcklucHV0KSkgewotCQkJCWVycm9yTWVzc2FnZSA9IEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIuRW1wdHlfZWRpdG9yXzEiKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUJyZWFrcG9pbnRMb2NhdGlvblZlcmlmaWVyIGJ2ID0gbmV3IEJyZWFrcG9pbnRMb2NhdGlvblZlcmlmaWVyKCk7Ci0JCQkJaW50IGxpbmVOdW1iZXIgPSBidi5nZXRWYWxpZEFkZHJlc3NCcmVha3BvaW50TG9jYXRpb24oIG51bGwsICgoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRTdGFydExpbmUoKSApOwotCQkJCWlmIChsaW5lTnVtYmVyID09IC0xKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIuSW52YWxpZF9saW5lXzEiKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlBZGRyZXNzIGFkZHJlc3MgPSAoKERpc2Fzc2VtYmx5RWRpdG9ySW5wdXQpaW5wdXQpLmdldEFkZHJlc3MobGluZU51bWJlcik7Ci0JCQkJCWlmIChhZGRyZXNzID09IG51bGwpIHsKLQkJCQkJCWVycm9yTWVzc2FnZSA9IEFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIuSW52YWxpZF9saW5lXzEiKTsJCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlDTGluZUJyZWFrcG9pbnQgYnJlYWtwb2ludCA9ICgoRGlzYXNzZW1ibHlFZGl0b3JJbnB1dClpbnB1dCkuYnJlYWtwb2ludEV4aXN0cyhhZGRyZXNzKTsKLQkJCQkJCWlmIChicmVha3BvaW50ICE9IG51bGwpIHsKLQkJCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnQsIHRydWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIG1vZHVsZSA9ICgoRGlzYXNzZW1ibHlFZGl0b3JJbnB1dClpbnB1dCkuZ2V0TW9kdWxlRmlsZSgpOwotCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEFkZHJlc3NCcmVha3BvaW50UmVzb3VyY2UoKChEaXNhc3NlbWJseUVkaXRvcklucHV0KWlucHV0KS5nZXRTb3VyY2VGaWxlKCkpOwotCQkJCQkJCVN0cmluZyBzb3VyY2VIYW5kbGUgPSBnZXRTb3VyY2VIYW5kbGUoIGlucHV0ICk7Ci0JCQkJCQkJQ0RJRGVidWdNb2RlbC5jcmVhdGVBZGRyZXNzQnJlYWtwb2ludChtb2R1bGUsIHNvdXJjZUhhbmRsZSwgcmVzb3VyY2UsICgoRGlzYXNzZW1ibHlFZGl0b3JJbnB1dClpbnB1dCkuZ2V0U291cmNlTGluZShsaW5lTnVtYmVyKSwgYWRkcmVzcywgdHJ1ZSwgMCwgIiIsIHRydWUpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCSovCi0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlID0gQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLk9wZXJhdGlvbl9pc19ub3Rfc3VwcG9ydGVkXzEiKTsKLQkJfQotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsIGVycm9yTWVzc2FnZSwgbnVsbCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I2NhblRvZ2dsZUxpbmVCcmVha3BvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZUxpbmVCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvKgotCQkgKiBUT0RPIERpc2Fzc2VtYmx5VmlldwotCQlpZiAocGFydCBpbnN0YW5jZW9mIERpc2Fzc2VtYmx5VmlldykgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gKChEaXNhc3NlbWJseVZpZXcpcGFydCkuZ2V0SW5wdXQoKTsKLQkJCWlmICghKGlucHV0IGluc3RhbmNlb2YgRGlzYXNzZW1ibHlFZGl0b3JJbnB1dCkgfHwgKChEaXNhc3NlbWJseUVkaXRvcklucHV0KWlucHV0KS5lcXVhbHMoRGlzYXNzZW1ibHlFZGl0b3JJbnB1dC5FTVBUWV9FRElUT1JfSU5QVVQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCSovCi0JCXJldHVybiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I3RvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgdG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUERlYnVnVXRpbHMucHJpbnRsbigiKioqIE5vdCBJbXBsZW1lbnRlZCBZRVQgKioqIik7Ci0JCS8qCi0JCSAqIEZJWE1FIGRvZXNuJ3QgaW1wbGVtZW5ldCB5ZXQuLgotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCVN0cmluZyB0ZXh0ID0gKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocGFydCk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJSVRyYW5zbGF0aW9uVW5pdCB0dSA9IGdldFRyYW5zbGF0aW9uVW5pdCgoSUZpbGUpcmVzb3VyY2UpOwotCQkJCQlpZiAodHUgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJQ0VsZW1lbnQgZWxlbWVudCA9IHR1LmdldEVsZW1lbnQodGV4dC50cmltKCkpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZ1bmN0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0JCQkJCQkJCXRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzMCgoSURlY2xhcmF0aW9uKWVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKENNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJaWYgKHNzLnNpemUoKSA9PSAxICYmIChzcy5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElGdW5jdGlvbiB8fCBzcy5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElNZXRob2QpKSB7Ci0JCQkJdG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMwKChJRGVjbGFyYXRpb24pc3MuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCSovCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Ub2dnbGVNZXRob2RCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvKgotCQkgKiBGSVhNRSBkb2Vzbid0IGltcGxlbWVuZXQgeWV0Li4KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlTdHJpbmcgdGV4dCA9ICgoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocGFydCk7Ci0JCQkJaWYgKCByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICkgewotCQkJCQlJVHJhbnNsYXRpb25Vbml0IHR1ID0gZ2V0VHJhbnNsYXRpb25Vbml0KChJRmlsZSlyZXNvdXJjZSk7Ci0JCQkJCWlmICh0dSAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlDRWxlbWVudCBlbGVtZW50ID0gdHUuZ2V0RWxlbWVudCggdGV4dC50cmltKCkgKTsKLQkJCQkJCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJRnVuY3Rpb24gfHwgZWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2goQ01vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJaWYgKHNzLnNpemUoKSA9PSAxKSB7Ci0JCQkJcmV0dXJuIChzcy5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElGdW5jdGlvbiB8fCBzcy5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElNZXRob2QpOwotCQkJfQotCQl9Ci0JCSovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCN0b2dnbGVXYXRjaHBvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZVdhdGNocG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIEZJWE1FIGRvZXNuJ3QgaW1wbGVtZW5ldCB5ZXQuLgotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCVN0cmluZyB0ZXh0ID0gKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShwYXJ0KTsKLQkJCQlpZiAoIHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgKSB7Ci0JCQkJCUlUcmFuc2xhdGlvblVuaXQgdHUgPSBnZXRUcmFuc2xhdGlvblVuaXQoKElGaWxlKXJlc291cmNlKTsKLQkJCQkJaWYgKHR1ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSUNFbGVtZW50IGVsZW1lbnQgPSB0dS5nZXRFbGVtZW50KHRleHQudHJpbSgpKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWYXJpYWJsZSkgewotCQkJCQkJCQl0b2dnbGVWYXJpYWJsZVdhdGNocG9pbnQocGFydCwgKElWYXJpYWJsZSllbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChDTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlpZiAoc3Muc2l6ZSgpID09IDEgJiYgc3MuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJVmFyaWFibGUpIHsKLQkJCQl0b2dnbGVWYXJpYWJsZVdhdGNocG9pbnQocGFydCwgKElWYXJpYWJsZSlzcy5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCNjYW5Ub2dnbGVXYXRjaHBvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZVdhdGNocG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8qCi0JCSAqIEZJWE1FIGRvZXNuJ3QgaW1wbGVtZW5ldCB5ZXQuLgotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCVN0cmluZyB0ZXh0ID0gKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldFRleHQoKTsKLQkJCWlmICggdGV4dCAhPSBudWxsICkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHBhcnQpOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCUlUcmFuc2xhdGlvblVuaXQgdHUgPSBnZXRUcmFuc2xhdGlvblVuaXQoKElGaWxlKXJlc291cmNlKTsKLQkJCQkJaWYgKHR1ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmV0dXJuICh0dS5nZXRFbGVtZW50KHRleHQudHJpbSgpKSBpbnN0YW5jZW9mIElWYXJpYWJsZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChDTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlpZiAoc3Muc2l6ZSgpID09IDEpIHsKLQkJCQlyZXR1cm4gKHNzLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSVZhcmlhYmxlKTsKLQkJCX0KLQkJfQotCQkqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqIHJlcG9ydAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBvcnQoU3RyaW5nIG1lc3NhZ2UsIElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJSUVkaXRvclN0YXR1c0xpbmUgc3RhdHVzTGluZSA9IChJRWRpdG9yU3RhdHVzTGluZSlwYXJ0LmdldEFkYXB0ZXIoSUVkaXRvclN0YXR1c0xpbmUuY2xhc3MpOwotCQlpZiAoc3RhdHVzTGluZSAhPSBudWxsKSB7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJCXN0YXR1c0xpbmUuc2V0TWVzc2FnZSh0cnVlLCBtZXNzYWdlLCBudWxsKTsKLQkJCWVsc2UKLQkJCQlzdGF0dXNMaW5lLnNldE1lc3NhZ2UodHJ1ZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBQVFBEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgIT0gbnVsbCkgewotCQkJUFRQRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JCX0KLQl9Ci0JLyoqIEdldCByZXNvdXJjZQotCSAqIEBwYXJhbSBwYXJ0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWlmICggcGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0ICkgewotCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKChJRWRpdG9yUGFydClwYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgKSB7Ci0JCQkJcmV0dXJuICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQkJfQotCQkJSUxvY2F0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2F0aW9uUHJvdmlkZXIpZWRpdG9ySW5wdXQuZ2V0QWRhcHRlciggSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MgKTsKLQkJCWlmICggcHJvdmlkZXIgIT0gbnVsbCApIHsKLQkJCQlJUGF0aCBsb2NhdGlvbiA9IHByb3ZpZGVyLmdldFBhdGgoIGVkaXRvcklucHV0ICk7Ci0JCQkJSUZpbGVbXSBmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24oIGxvY2F0aW9uICk7Ci0JCQkJaWYgKCBmaWxlcy5sZW5ndGggPiAwICkKLQkJCQkJcmV0dXJuIGZpbGVzWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKiBHZXQgc291cmNlIGhhbmRsZQotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VIYW5kbGUoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKElGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJfQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChJU3RvcmFnZUVkaXRvcklucHV0KWlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJLyoKLQkJICogVE9ETyBEaXNhc3NlbWJseVZpZXcKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlzYXNzZW1ibHlFZGl0b3JJbnB1dCkgewotCQkJU3RyaW5nIHNvdXJjZUZpbGUgPSAoKERpc2Fzc2VtYmx5RWRpdG9ySW5wdXQpaW5wdXQpLmdldFNvdXJjZUZpbGUoKTsKLQkJCWlmIChzb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc291cmNlRmlsZTsKLQkJCX0KLQkJCXJldHVybiAoKERpc2Fzc2VtYmx5RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1vZHVsZUZpbGUoKTsKLQkJfQotCQkqLwotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoKLQkgKiBGSVhNRSBkb2Vzbid0IGltcGxlbWVuZXQgeWV0Li4KLQlwcml2YXRlIHZvaWQgdG9nZ2xlVmFyaWFibGVXYXRjaHBvaW50KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElWYXJpYWJsZSB2YXJpYWJsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgc291cmNlSGFuZGxlID0gZ2V0U291cmNlSGFuZGxlKHZhcmlhYmxlKTsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RWxlbWVudFJlc291cmNlKHZhcmlhYmxlKTsKLQkJU3RyaW5nIGV4cHJlc3Npb24gPSBnZXRWYXJpYWJsZU5hbWUoIHZhcmlhYmxlICk7Ci0JCUlQV2F0Y2hwb2ludCB3YXRjaHBvaW50ID0gQ0RJRGVidWdNb2RlbC53YXRjaHBvaW50RXhpc3RzKHNvdXJjZUhhbmRsZSwgcmVzb3VyY2UsIGV4cHJlc3Npb24pOwotCQlpZiAod2F0Y2hwb2ludCAhPSBudWxsKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5yZW1vdmVCcmVha3BvaW50KHdhdGNocG9pbnQsIHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJQWRkV2F0Y2hwb2ludERpYWxvZyBkbGcgPSBuZXcgQWRkV2F0Y2hwb2ludERpYWxvZyhwYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCB0cnVlLCBmYWxzZSwgZXhwcmVzc2lvbiwgZmFsc2UpOwotCQkJaWYgKGRsZy5vcGVuKCkgIT0gV2luZG93Lk9LKQotCQkJCXJldHVybjsKLQkJCWV4cHJlc3Npb24gPSBkbGcuZ2V0RXhwcmVzc2lvbigpOwotCQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJCWludCBjaGFyU3RhcnQgPSAtMTsKLQkJCWludCBjaGFyRW5kID0gLTE7Ci0JCQl0cnkgewotCQkJCUlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSA9IHZhcmlhYmxlLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJaWYgKCBzb3VyY2VSYW5nZSAhPSBudWxsICkgewotCQkJCQljaGFyU3RhcnQgPSBzb3VyY2VSYW5nZS5nZXRTdGFydFBvcygpOwotCQkJCQljaGFyRW5kID0gY2hhclN0YXJ0ICsgc291cmNlUmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWlmICggY2hhckVuZCA8PSAwICkgewotCQkJCQkJY2hhclN0YXJ0ID0gLTE7Ci0JCQkJCQljaGFyRW5kID0gLTE7Ci0JCQkJCX0KLQkJCQkJbGluZU51bWJlciA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0TGluZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKENNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGVidWdQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJQ0RJRGVidWdNb2RlbC5jcmVhdGVXYXRjaHBvaW50KHNvdXJjZUhhbmRsZSwgcmVzb3VyY2UsIGNoYXJTdGFydCwgY2hhckVuZCwgbGluZU51bWJlciwgZGxnLmdldFdyaXRlQWNjZXNzKCksIGRsZy5nZXRSZWFkQWNjZXNzKCksIGV4cHJlc3Npb24sIHRydWUsIDAsICIiLCB0cnVlICk7Ci0JCX0KLQl9Ci0JKi8KLQotCS8qCi0JICogRklYTUUgZG9lc24ndCBpbXBsZW1lbmV0IHlldC4uCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlSGFuZGxlKElEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlJVHJhbnNsYXRpb25Vbml0IHR1ID0gZGVjbGFyYXRpb24uZ2V0VHJhbnNsYXRpb25Vbml0KCk7Ci0JCWlmICh0dSAhPSBudWxsKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0dS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJcmV0dXJuIHR1LmdldFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQkqLwotCi0JLyoKLQkgKiBGSVhNRSBkb2Vzbid0IGltcGxlbWVuZXQgeWV0Li4KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRFbGVtZW50UmVzb3VyY2UoSURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQl9Ci0JKi8KLQotCS8qCi0JICogRklYTUUgZG9lc24ndCBpbXBsZW1lbmV0IHlldC4uCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKElGdW5jdGlvbiBmdW5jdGlvbikgewotCQlTdHJpbmcgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb24uZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCBmdW5jdGlvbk5hbWUgKTsKLQkJSVRyYW5zbGF0aW9uVW5pdCB0dSA9IGZ1bmN0aW9uLmdldFRyYW5zbGF0aW9uVW5pdCgpOwotCQlpZiAodHUgIT0gbnVsbCAmJiB0dS5pc0NYWExhbmd1YWdlKCkpIHsKLQkJCWFwcGVuZFBhcmFtZXRlcnMobmFtZSwgZnVuY3Rpb24pOwotCQl9Ci0JCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0JfQotCSovCi0KLQkvKgotCSAqIEZJWE1FIGRvZXNuJ3QgaW1wbGVtZW5ldCB5ZXQuLgotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZE5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCUlDRWxlbWVudCBwYXJlbnQgPSBtZXRob2QuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAoIHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElDRWxlbWVudC5DX05BTUVTUEFDRSB8fCBwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJQ0VsZW1lbnQuQ19DTEFTUykpIHsKLQkJCW5hbWUuYXBwZW5kKHBhcmVudC5nZXRFbGVtZW50TmFtZSgpICkuYXBwZW5kKCAiOjoiKTsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQluYW1lLmFwcGVuZChtZXRob2ROYW1lKTsKLQkJYXBwZW5kUGFyYW1ldGVycyhuYW1lLCBtZXRob2QpOwotCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwotCX0KLQkqLwotCi0JLyoKLQkgKiBGSVhNRSBkb2Vzbid0IGltcGxlbWVuZXQgeWV0Li4KLQlwcml2YXRlIHZvaWQgYXBwZW5kUGFyYW1ldGVycyhTdHJpbmdCdWZmZXIgc2IsIElGdW5jdGlvbkRlY2xhcmF0aW9uIGZkKSB7Ci0JCVN0cmluZ1tdIHBhcmFtcyA9IGZkLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7Ci0JCQlzYi5hcHBlbmQocGFyYW1zW2ldKTsKLQkJCWlmIChpICE9IHBhcmFtcy5sZW5ndGggLSAxKQotCQkJCXNiLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCX0KLQkqLwotCi0JLyoKLQkgKiBGSVhNRSBkb2Vzbid0IGltcGxlbWVuZXQgeWV0Li4KLQlwcml2YXRlIFN0cmluZyBnZXRWYXJpYWJsZU5hbWUoSVZhcmlhYmxlIHZhcmlhYmxlKSB7Ci0JCXJldHVybiB2YXJpYWJsZS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkqLwotCi0JLyoKLQkgKiBGSVhNRSBkb2Vzbid0IGltcGxlbWVuZXQgeWV0Li4KLQlwcml2YXRlIElUcmFuc2xhdGlvblVuaXQgZ2V0VHJhbnNsYXRpb25Vbml0KElGaWxlIGZpbGUpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBDb3JlTW9kZWwuZ2V0RGVmYXVsdCgpLmNyZWF0ZShmaWxlKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJhbnNsYXRpb25Vbml0KSB7Ci0JCQlyZXR1cm4gKElUcmFuc2xhdGlvblVuaXQpZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8KLQkKLQkvKgotCSAqIEZJWE1FIGRvZXNuJ3QgaW1wbGVtZW5ldCB5ZXQuLgotCXByaXZhdGUgdm9pZCB0b2dnbGVNZXRob2RCcmVha3BvaW50czAoSURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzb3VyY2VIYW5kbGUgPSBnZXRTb3VyY2VIYW5kbGUoZGVjbGFyYXRpb24pOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRFbGVtZW50UmVzb3VyY2UoZGVjbGFyYXRpb24pOwotCQlTdHJpbmcgZnVuY3Rpb25OYW1lID0gKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgSUZ1bmN0aW9uKSA/IGdldEZ1bmN0aW9uTmFtZSgoSUZ1bmN0aW9uKWRlY2xhcmF0aW9uKSA6IGdldE1ldGhvZE5hbWUoKElNZXRob2QpZGVjbGFyYXRpb24pOwotCQlJQ0Z1bmN0aW9uQnJlYWtwb2ludCBicmVha3BvaW50ID0gQ0RJRGVidWdNb2RlbC5mdW5jdGlvbkJyZWFrcG9pbnRFeGlzdHMoc291cmNlSGFuZGxlLCByZXNvdXJjZSwgZnVuY3Rpb25OYW1lKTsKLQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkucmVtb3ZlQnJlYWtwb2ludChicmVha3BvaW50LCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQlpbnQgY2hhclN0YXJ0ID0gLTE7Ci0JCQlpbnQgY2hhckVuZCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJU291cmNlUmFuZ2Ugc291cmNlUmFuZ2UgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCWlmIChzb3VyY2VSYW5nZSAhPSBudWxsKSB7Ci0JCQkJCWNoYXJTdGFydCA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0UG9zKCk7Ci0JCQkJCWNoYXJFbmQgPSBjaGFyU3RhcnQgKyBzb3VyY2VSYW5nZS5nZXRMZW5ndGgoKTsKLQkJCQkJaWYgKGNoYXJFbmQgPD0gMCkgewotCQkJCQkJY2hhclN0YXJ0ID0gLTE7Ci0JCQkJCQljaGFyRW5kID0gLTE7Ci0JCQkJCX0KLQkJCQkJbGluZU51bWJlciA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0TGluZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCURlYnVnUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJCUNESURlYnVnTW9kZWwuY3JlYXRlRnVuY3Rpb25CcmVha3BvaW50KHNvdXJjZUhhbmRsZSwgcmVzb3VyY2UsIGZ1bmN0aW9uTmFtZSwgY2hhclN0YXJ0LCBjaGFyRW5kLCBsaW5lTnVtYmVyLCB0cnVlLCAgMCwgIiIsIHRydWUgKTsKLQkJfQotCX0KLQkqLwotCi0JLyoKLQlwcml2YXRlIElSZXNvdXJjZSBnZXRBZGRyZXNzQnJlYWtwb2ludFJlc291cmNlKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVOYW1lKTsKLQkJCWlmIChwYXRoLmlzVmFsaWRQYXRoKGZpbGVOYW1lKSApIHsKLQkJCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihwYXRoKTsKLQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQkJcmV0dXJuIGZpbGVzWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQkqLwotCQotCXByaXZhdGUgY2xhc3MgQnJlYWtwb2ludExvY2F0aW9uVmVyaWZpZXIgewotCQkvKiogR2V0IHZhbGlkIGxpbmUgYnJlYWtwb2ludCBsb2NhdGlvbgotCQkgKiBAcGFyYW0gZG9jCi0JCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0VmFsaWRMaW5lQnJlYWtwb2ludExvY2F0aW9uKElEb2N1bWVudCBkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCQlyZXR1cm4gbGluZU51bWJlciArIDE7Ci0JCX0KLQkJLyoqIEdldCB2YWxpZCBhZGRyZXNzIGJyZWFrcG9pbnQgbG9jYXRpb24KLQkJICogQHBhcmFtIGRvYwotCQkgKiBAcGFyYW0gbGluZU51bWJlcgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFZhbGlkQWRkcmVzc0JyZWFrcG9pbnRMb2NhdGlvbihJRG9jdW1lbnQgZG9jLCBpbnQgbGluZU51bWJlcikgewotCQkJcmV0dXJuIGxpbmVOdW1iZXIgKyAxOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVG9nZ2xlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1RvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2YxOGI4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVG9nZ2xlQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLklQVFBEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQnJlYWtwb2ludFJ1bGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIElWZXJ0aWNhbFJ1bGVySW5mbyBydWxlciA9IG51bGw7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0ID0gbnVsbDsKLQlwcml2YXRlIFRvZ2dsZUJyZWFrcG9pbnRBZGFwdGVyIGJyZWFrcG9pbnRBZGFwdGVyID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU2VsZWN0aW9uIEVNUFRZX1NFTEVDVElPTiA9IG5ldyBJU2VsZWN0aW9uKCkgewotCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9OwotICAgIAotCS8qKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBwYXJ0Ci0gICAgICogQHBhcmFtIHJ1bGVyCi0gICAgICovCi0gICAgcHVibGljIFRvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBJVmVydGljYWxSdWxlckluZm8gcnVsZXIpIHsKLQkJc3VwZXIoQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVCcmVha3BvaW50UnVsZXJBY3Rpb24uVG9nZ2xlX0JyZWFrcG9pbnQiKSk7Ci0gICAJCXRoaXMucnVsZXIgPSBydWxlcjsKLSAgIAkJc2V0VGFyZ2V0UGFydChwYXJ0KTsKLSAgIAkJYnJlYWtwb2ludEFkYXB0ZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFkYXB0ZXIoKTsKLSAgIAkJc2V0SWQoSVBUUERlYnVnVUlDb25zdGFudHMuQUNUSU9OX1NFVF9CUkVBS1BPSU5UKTsKLSAgICB9Ci0JCi0gICAgLyoqIERpc3Bvc2UgdGhpcyBhY3Rpb24KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAlzZXRUYXJnZXRQYXJ0KG51bGwpOwotICAgIAlydWxlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJYnJlYWtwb2ludEFkYXB0ZXIudG9nZ2xlTGluZUJyZWFrcG9pbnRzKGdldFRhcmdldFBhcnQoKSwgZ2V0VGFyZ2V0U2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFRhcmdldFBhcnQoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVCcmVha3BvaW50UnVsZXJBY3Rpb24uRXJyb3JfMSIpLCBBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlRvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbi5PcGVyYXRpb25fZmFpbGVkXzEiKSwgZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLSAgICB9Ci0KLQkvKiogR2V0IHZlcnRpY2FsIHJ1bGVyIGluZm8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElWZXJ0aWNhbFJ1bGVySW5mbyBnZXRWZXJ0aWNhbFJ1bGVySW5mbygpIHsKLQkJcmV0dXJuIHJ1bGVyOwotCX0KLQotCS8qKiBHZXQgdGFyZ2V0IHdvcmtiZW5jaCBwYXJ0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZ2V0VGFyZ2V0UGFydCgpIHsKLQkJcmV0dXJuIHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqIFNldCB0YXJnZXQgd29ya2JlbmNoIHBhcnQKLQkgKiBAcGFyYW0gdGFyZ2V0UGFydAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRQYXJ0KElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiogR2V0IHRhcmdldCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGdldFRhcmdldFNlbGVjdGlvbigpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaW50IGxpbmUgPSBnZXRWZXJ0aWNhbFJ1bGVySW5mbygpLmdldExpbmVPZkxhc3RNb3VzZUJ1dHRvbkFjdGl2aXR5KCk7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gcmVnaW9uID0gZG9jLmdldExpbmVJbmZvcm1hdGlvbihsaW5lKTsKLQkJCQlyZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGVidWdQbHVnaW4ubG9nKGUpOwotCQkJfSAKLQkJfQotCQlyZXR1cm4gRU1QVFlfU0VMRUNUSU9OOwotCX0KLQkKLQkvKiogR2V0IGRvY3VtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0ID0gZ2V0VGFyZ2V0UGFydCgpOwotCQlpZiAodGFyZ2V0UGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKXRhcmdldFBhcnQ7IAotCQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKQotCQkJCXJldHVybiBwcm92aWRlci5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JCS8vVE9ETyBEaXNhc3NlbWJseVZpZXcKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVG9nZ2xlSW5zdHJ1Y3Rpb25TdGVwTW9kZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1RvZ2dsZUluc3RydWN0aW9uU3RlcE1vZGVBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGVhODM1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVG9nZ2xlSW5zdHJ1Y3Rpb25TdGVwTW9kZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlSW5zdHJ1Y3Rpb25TdGVwTW9kZUFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBJUERlYnVnVGFyZ2V0IGZUYXJnZXQgPSBudWxsOwotCXByaXZhdGUgSUFjdGlvbiBmQWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIElWaWV3UGFydCBmVmlldzsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uKCk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50LmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJYm9vbGVhbiB2YWx1ZSA9ICgoQm9vbGVhbilldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlpZiAodmFsdWUgIT0gYWN0aW9uLmlzQ2hlY2tlZCgpKQotCQkJCQlhY3Rpb24uc2V0Q2hlY2tlZCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJZlZpZXcgPSB2aWV3OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJSVBEZWJ1Z1RhcmdldCB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJdGFyZ2V0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXNldFRhcmdldChudWxsKTsKLQkJc2V0QWN0aW9uKG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjaW5pdChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCXNldEFjdGlvbihhY3Rpb24pOwotCQlhY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvKgotCQlib29sZWFuIGVuYWJsZWQgPSBnZXRBY3Rpb24oKS5pc0NoZWNrZWQoKTsKLQkJSVBEZWJ1Z1RhcmdldCB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQl0YXJnZXQuZW5hYmxlSW5zdHJ1Y3Rpb25TdGVwcGluZyhlbmFibGVkKTsKLQkJCWlmIChlbmFibGVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0VmlldygpLmdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoSVBUUERlYnVnVUlDb25zdGFudHMuSURfRElTQVNTRU1CTFlfVklFVyk7Ci0JCQkJfQotCQkJCWNhdGNoKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJUFRQRGVidWdVSVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCSovCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJUERlYnVnVGFyZ2V0IG5ld1RhcmdldCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJbmV3VGFyZ2V0ID0gZ2V0VGFyZ2V0RnJvbVNlbGVjdGlvbigoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JCUlQRGVidWdUYXJnZXQgb2xkVGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7Ci0JCWlmIChvbGRUYXJnZXQgIT0gbnVsbCAmJiAhb2xkVGFyZ2V0LmVxdWFscyhuZXdUYXJnZXQpKSB7Ci0JCQlvbGRUYXJnZXQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXNldFRhcmdldChudWxsKTsKLQkJCWFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLQkJfQotCQlpZiAobmV3VGFyZ2V0ICE9IG51bGwgJiYgIW5ld1RhcmdldC5pc1Rlcm1pbmF0ZWQoKSAmJiAhbmV3VGFyZ2V0LmlzRGlzY29ubmVjdGVkKCkpIHsKLQkJCXNldFRhcmdldChuZXdUYXJnZXQpOwotCQkJbmV3VGFyZ2V0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlhY3Rpb24uc2V0Q2hlY2tlZChuZXdUYXJnZXQuaXNJbnN0cnVjdGlvblN0ZXBwaW5nRW5hYmxlZCgpKTsKLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChuZXdUYXJnZXQgIT0gbnVsbCAmJiBuZXdUYXJnZXQuc3VwcG9ydHNJbnN0cnVjdGlvblN0ZXBwaW5nKCkgCi0JCQkJCQkgICAmJiAhbmV3VGFyZ2V0LmlzVGVybWluYXRlZCgpICYmICFuZXdUYXJnZXQuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUERlYnVnVGFyZ2V0IGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRoaXMuZlRhcmdldDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGFyZ2V0KElQRGVidWdUYXJnZXQgdGFyZ2V0KSB7Ci0JCXRoaXMuZlRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQlwcml2YXRlIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5mQWN0aW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdGhpcy5mQWN0aW9uID0gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSVBEZWJ1Z1RhcmdldCBnZXRUYXJnZXRGcm9tU2VsZWN0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURlYnVnRWxlbWVudCkgewotCQkJSURlYnVnVGFyZ2V0IHRhcmdldCA9ICgoSURlYnVnRWxlbWVudCllbGVtZW50KS5nZXREZWJ1Z1RhcmdldCgpOwotCQkJcmV0dXJuICh0YXJnZXQgaW5zdGFuY2VvZiBJUERlYnVnVGFyZ2V0KSA/IChJUERlYnVnVGFyZ2V0KXRhcmdldCA6IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBJVmlld1BhcnQgZ2V0VmlldygpIHsKLQkJcmV0dXJuIGZWaWV3OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVW5yZWdpc3RlckFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9VbnJlZ2lzdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2QyZjYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9VbnJlZ2lzdGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnZpZXdzLlBhcmFsbGVsRGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudDsKLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFVucmVnaXN0ZXJBY3Rpb24gZXh0ZW5kcyBEZWJ1Z0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJVbnJlZ2lzdGVyIFNlbGVjdGVkIEVsZW1lbnRzIjsKLQkKLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBVbnJlZ2lzdGVyQWN0aW9uKFBhcmFsbGVsRGVidWdWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgdmlldyk7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fVU5SRUdJU1RFUl9OT1JNQUwpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkuYWN0aW9ucy5QYXJhbGxlbEFjdGlvbiNydW4ob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50W10pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElFbGVtZW50W10gZWxlbWVudHMpIHsKLQkJaWYgKHZhbGlkYXRpb24oZWxlbWVudHMpKSB7Ci0JCQl0cnkgewotCQkJCXZpZXcudW5yZWdpc3RlclNlbGVjdGVkRWxlbWVudHMoKTsKLQkJCQl2aWV3LnJlZnJlc2goZmFsc2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUFRQRGVidWdVSVBsdWdpbi5lcnJvckRpYWxvZyhnZXRTaGVsbCgpLCAiRXJyb3IiLCBlLmdldFN0YXR1cygpKTsJCQkJCi0JCQl9Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9VcGRhdGVQRXhwcmVzc2lvbkFjdGlvbi5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvYWN0aW9ucy9VcGRhdGVQRXhwcmVzc2lvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGYwMzNhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVXBkYXRlUEV4cHJlc3Npb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z0ltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZS5QVmFyaWFibGVWaWV3OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVBFeHByZXNzaW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIlJlZnJlc2ggdmFyaWFibGVzIjsKLQlwcml2YXRlIFBWYXJpYWJsZVZpZXcgdmlldyA9IG51bGw7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gdmlldwotCSAqLwotCXB1YmxpYyBVcGRhdGVQRXhwcmVzc2lvbkFjdGlvbihQVmFyaWFibGVWaWV3IHZpZXcpIHsKLQkJc3VwZXIobmFtZSwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JICAgIHNldEltYWdlRGVzY3JpcHRvcihQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fVkFSX1JFRlJFU0hfTk9STUFMKSk7Ci0JICAgIC8vc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERlYnVnSW1hZ2UuSURfSUNPTl9WQVJfUkVGUkVTSF9ESVNBQkxFKTsKLQkgICAgc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0JICAgIHNldElkKG5hbWUpOwotCSAgICBzZXRFbmFibGVkKGZhbHNlKTsKLQkgICAgdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdmlldy5nZXRVSU1hbmFnZXIoKS51cGRhdGVDdXJyZW50Sm9iVmFyaWFibGVWYWx1ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9hY3Rpb25zL1ZpZXdGaWx0ZXJBY3Rpb24uamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVmlld0ZpbHRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTJiZTM3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2FjdGlvbnMvVmlld0ZpbHRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyIHsKLQlwcml2YXRlIElWaWV3UGFydCB2aWV3ID0gbnVsbDsKLQlwcml2YXRlIElBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXB1YmxpYyBWaWV3RmlsdGVyQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJYWN0aW9uLnNldENoZWNrZWQoZ2V0UHJlZmVyZW5jZVZhbHVlKHZpZXcpKTsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSBnZXRTdHJ1Y3R1cmVkVmlld2VyKCk7Ci0JCVZpZXdlckZpbHRlcltdIGZpbHRlcnMgPSB2aWV3ZXIuZ2V0RmlsdGVycygpOwotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsdGVyc1tpXSA9PSB0aGlzKSB7Ci0JCQkJZmlsdGVyID0gZmlsdGVyc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCXZpZXdlci5hZGRGaWx0ZXIodGhpcyk7Ci0JCX0KLQkJdmlld2VyLnJlZnJlc2goKTsKLQkJUHJlZmVyZW5jZXMgc3RvcmUgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlTdHJpbmcga2V5ID0gZ2V0VmlldygpLmdldFNpdGUoKS5nZXRJZCgpICsgIi4iICsgZ2V0UHJlZmVyZW5jZUtleSgpOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldFZhbHVlKGtleSwgYWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJUFRQRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikge30KLQotCS8qKiAKLQkgKiBHZXQgcHJlZmVyZW5jZSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlS2V5KCk7Ci0JCi0JLyoqIAotCSAqIEdldCBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBwcmVmZXJlbmNlIHZhbHVlCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHJlZmVyZW5jZVZhbHVlKElWaWV3UGFydCBwYXJ0KSB7Ci0JCVN0cmluZyBiYXNlS2V5ID0gZ2V0UHJlZmVyZW5jZUtleSgpOwotCQlTdHJpbmcgdmlld0tleSA9IHBhcnQuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCVN0cmluZyBjb21wb3NpdGVLZXkgPSB2aWV3S2V5ICsgIi4iICsgYmFzZUtleTsgLy8kTk9OLU5MUy0xJAotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCWJvb2xlYW4gdmFsdWUgPSBmYWxzZTsKLQkJaWYgKHN0b3JlLmNvbnRhaW5zKGNvbXBvc2l0ZUtleSkpIHsKLQkJCXZhbHVlID0gc3RvcmUuZ2V0Qm9vbGVhbihjb21wb3NpdGVLZXkpOwotCQl9IGVsc2UgewotCQkJdmFsdWUgPSBzdG9yZS5nZXRCb29sZWFuKGJhc2VLZXkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsJCQotCX0gCi0KLQkvKiogCi0JICogR2V0IHN0cnVjdHVyZWQgdmlld2VyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVmlld2VyIGdldFN0cnVjdHVyZWRWaWV3ZXIoKSB7Ci0JCUlEZWJ1Z1ZpZXcgdmlldyA9IChJRGVidWdWaWV3KWdldFZpZXcoKS5nZXRBZGFwdGVyKElEZWJ1Z1ZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gdmlldy5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJcmV0dXJuIChTdHJ1Y3R1cmVkVmlld2VyKXZpZXdlcjsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiogCi0JICogQ2hlY2sgaWYgYWN0aW9uIGlzIGNoZWNrZWQKLQkgKiBAcmV0dXJuIHRydWUgaXMgYWN0aW9uIGlzIGNoZWNrZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGFjdGlvbi5pc0NoZWNrZWQoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVmlld1BhcnQgZ2V0VmlldygpIHsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9nZmllbGRzL0RpYWxvZ0ZpZWxkLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dmaWVsZHMvRGlhbG9nRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwMTg1NC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dmaWVsZHMvRGlhbG9nRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ2ZpZWxkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgRGlhbG9nRmllbGQgewotCXByaXZhdGUgTGFiZWwgZkxhYmVsOwotCXByb3RlY3RlZCBTdHJpbmcgZkxhYmVsVGV4dDsKLQkKLQlwcml2YXRlIElEaWFsb2dGaWVsZExpc3RlbmVyIGZEaWFsb2dGaWVsZExpc3RlbmVyOwotCQotCXByaXZhdGUgYm9vbGVhbiBmRW5hYmxlZDsKLQotCXB1YmxpYyBEaWFsb2dGaWVsZCgpIHsKLQkJZkVuYWJsZWQ9IHRydWU7Ci0JCWZMYWJlbD0gbnVsbDsKLQkJZkxhYmVsVGV4dD0gIiI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsIG9mIHRoZSBkaWFsb2cgZmllbGQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbHRleHQpIHsKLQkJZkxhYmVsVGV4dD0gbGFiZWx0ZXh0OwotCX0KLQkJCi0JLy8gLS0tLS0tIGNoYW5nZSBsaXN0ZW5lcgotCQotCS8qKgotCSAqIERlZmluZXMgdGhlIGxpc3RlbmVyIGZvciB0aGlzIGRpYWxvZyBmaWVsZC4KLQkgKi8JCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RGlhbG9nRmllbGRMaXN0ZW5lcihJRGlhbG9nRmllbGRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmRGlhbG9nRmllbGRMaXN0ZW5lcj0gbGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogUHJvZ3JhbWF0aWNhbCBpbnZvY2F0aW9uIG9mIGEgZGlhbG9nIGZpZWxkIGNoYW5nZS4KLQkgKi8JCQotCXB1YmxpYyB2b2lkIGRpYWxvZ0ZpZWxkQ2hhbmdlZCgpIHsKLQkJaWYgKGZEaWFsb2dGaWVsZExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZEaWFsb2dGaWVsZExpc3RlbmVyLmRpYWxvZ0ZpZWxkQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0JCi0JCi0JLy8gLS0tLS0tLSBmb2N1cyBtYW5hZ2VtZW50Ci0JLyoqCi0JICogVHJpZXMgdG8gc2V0IHRoZSBmb2N1cyB0byB0aGUgZGlhbG9nIGZpZWxkLgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpYWxvZyBmaWVsZCBjYW4gdGFrZSBmb2N1cy4KLQkgKiAJVG8gYmUgcmVpbXBsZW1lbnRlZCBieSBkaWFsb2cgZmllbGQgaW1wbGVtZW50b3JzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUG9zdHMgPGNvZGU+c2V0Rm9jdXM8L2NvZGU+IHRvIHRoZSBkaXNwbGF5IGV2ZW50IHF1ZXVlLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBwb3N0U2V0Rm9jdXNPbkRpYWxvZ0ZpZWxkKERpc3BsYXkgZGlzcGxheSkgewotCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JfQkJCi0JCi0JLy8gLS0tLS0tLSBsYXlvdXQgaGVscGVycwotCS8qKgotCSAqIENyZWF0ZXMgYWxsIGNvbnRyb2xzIG9mIHRoZSBkaWFsb2cgZmllbGQgYW5kIGZpbGxzIGl0IHRvIGEgY29tcG9zaXRlLgotCSAqIFRoZSBjb21wb3NpdGUgaXMgYXNzdW1lZCB0byBoYXZlIDxjb2RlPk1HcmlkTGF5b3V0PC9jb2RlPiBhcwotCSAqIGxheW91dC4KLQkgKiBUaGUgZGlhbG9nIGZpZWxkIHdpbGwgYWRqdXN0IGl0cyBjb250cm9scycgc3BhbnMgdG8gdGhlIG51bWJlciBvZiBjb2x1bW5zIGdpdmVuLgotCSAqIAlUbyBiZSByZWltcGxlbWVudGVkIGJ5IGRpYWxvZyBmaWVsZCBpbXBsZW1lbnRvcnMuCi0JICovCi0JcHVibGljIENvbnRyb2xbXSBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbkNvbHVtbnMpIHsKLQkJYXNzZXJ0RW5vdWdoQ29sdW1ucyhuQ29sdW1ucyk7Ci0JCQotCQlMYWJlbCBsYWJlbD0gZ2V0TGFiZWxDb250cm9sKHBhcmVudCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGFGb3JMYWJlbChuQ29sdW1ucykpOwotCQkKLQkJcmV0dXJuIG5ldyBDb250cm9sW10geyBsYWJlbCB9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgZGlhbG9nIGZpZWxkLgotCSAqIAlUbyBiZSByZWltcGxlbWVudGVkIGJ5IGRpYWxvZyBmaWVsZCBpbXBsZW1lbnRvcnMuCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgewotCQlyZXR1cm4gMTsJCi0JfQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEdyaWREYXRhIGdyaWREYXRhRm9yTGFiZWwoaW50IHNwYW4pIHsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3Bhbj0gc3BhbjsKLQkJcmV0dXJuIGdkOwotCX0KLQkKLQkvLyAtLS0tLS0tIHVpIGNyZWF0aW9uCi0JLyoqCi0JICogQ3JlYXRlcyBvciByZXR1cm5zIHRoZSBjcmVhdGVkIGxhYmVsIHdpZGdldC4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB3aWRnZXQgaGFzCi0JICogYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCi0JICovCQkJCi0JcHVibGljIExhYmVsIGdldExhYmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmTGFiZWwgPT0gbnVsbCkgewotCQkJYXNzZXJ0Q29tcG9zaXRlTm90TnVsbChwYXJlbnQpOwotCQkJCi0JCQlmTGFiZWw9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUIHwgU1dULldSQVApOwotCQkJZkxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQlmTGFiZWwuc2V0RW5hYmxlZChmRW5hYmxlZCk7CQkKLQkJCWlmIChmTGFiZWxUZXh0ICE9IG51bGwgJiYgISIiLmVxdWFscyhmTGFiZWxUZXh0KSkgewotCQkJCWZMYWJlbC5zZXRUZXh0KGZMYWJlbFRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBYWFg6IHRvIGF2b2lkIGEgMTYgcGl4ZWwgd2lkZSBlbXB0eSBsYWJlbCAtIHJldmlzaXQKLQkJCQlmTGFiZWwuc2V0VGV4dCgiLiIpOwotCQkJCWZMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZkxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzcGFjZXIgY29udHJvbC4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCQkKLQlwdWJsaWMgc3RhdGljIENvbnRyb2wgY3JlYXRlRW1wdHlTcGFjZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVFbXB0eVNwYWNlKHBhcmVudCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNwYWNlciBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNwYW4uCi0JICogVGhlIGNvbXBvc2l0ZSBpcyBhc3N1bWVkIHRvIGhhdmUgPGNvZGU+TUdyaWRMYXlvdXQ8L2NvZGU+IGFzCi0JICogbGF5b3V0LgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8JCQkKLQlwdWJsaWMgc3RhdGljIENvbnRyb2wgY3JlYXRlRW1wdHlTcGFjZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gZmFsc2U7Ci0JCWdkLmhvcml6b250YWxTcGFuPSBzcGFuOwotCQlnZC5ob3Jpem9udGFsSW5kZW50PSAwOwotCQlnZC53aWR0aEhpbnQ9IDA7Ci0JCWdkLmhlaWdodEhpbnQ9IDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIGlzIHRoZSBjb250cm9sIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgbm90IGRpc3Bvc2VkLgotCSovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNPa1RvVXNlKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gKGNvbnRyb2wgIT0gbnVsbCkgJiYgIShjb250cm9sLmlzRGlzcG9zZWQoKSk7Ci0JfQotCQotCS8vIC0tLS0tLS0tLSBlbmFibGUgLyBkaXNhYmxlIG1hbmFnZW1lbnQJCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBkaWFsb2cgZmllbGQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKGVuYWJsZWQgIT0gZkVuYWJsZWQpIHsKLQkJCWZFbmFibGVkPSBlbmFibGVkOwotCQkJdXBkYXRlRW5hYmxlU3RhdGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgZW5hYmxlIHN0YXRlIGNoYW5nZWQuCi0JICogVG8gYmUgZXh0ZW5kZWQgYnkgZGlhbG9nIGZpZWxkIGltcGxlbWVudG9ycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVTdGF0ZSgpIHsKLQkJaWYgKGZMYWJlbCAhPSBudWxsKSB7Ci0JCQlmTGFiZWwuc2V0RW5hYmxlZChmRW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIGRpYWxvZyBmaWVsZC4KLQkgKi8JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYXNzZXJ0Q29tcG9zaXRlTm90TnVsbChDb21wb3NpdGUgY29tcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbXAsICJ1bmNyZWF0ZWQgY29udHJvbCByZXF1ZXN0ZWQgd2l0aCBjb21wb3NpdGUgbnVsbCIpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFzc2VydEVub3VnaENvbHVtbnMoaW50IG5Db2x1bW5zKSB7Ci0JCUFzc2VydC5pc1RydWUobkNvbHVtbnMgPj0gZ2V0TnVtYmVyT2ZDb250cm9scygpLCAiZ2l2ZW4gbnVtYmVyIG9mIGNvbHVtbnMgaXMgdG9vIHNtYWxsIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9nZmllbGRzL0lEaWFsb2dGaWVsZExpc3RlbmVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dmaWVsZHMvSURpYWxvZ0ZpZWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3ZTFmNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dmaWVsZHMvSURpYWxvZ0ZpZWxkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuZGlhbG9nZmllbGRzOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFsb2dGaWVsZExpc3RlbmVyIHsKLQkvKioKLQkgKiBUaGUgZGlhbG9nIGZpZWxkIGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgZGlhbG9nRmllbGRDaGFuZ2VkKERpYWxvZ0ZpZWxkIGZpZWxkKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9nZmllbGRzL1NlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dmaWVsZHMvU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkYmQ4ZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dmaWVsZHMvU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ2ZpZWxkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkIGV4dGVuZHMgRGlhbG9nRmllbGQgewotCXByaXZhdGUgQnV0dG9uIGZCdXR0b247Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1NlbGVjdGVkOwotCXByaXZhdGUgRGlhbG9nRmllbGRbXSBmQXR0YWNoZWREaWFsb2dGaWVsZHM7Ci0JcHJpdmF0ZSBpbnQgZkJ1dHRvblN0eWxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlbGVjdGlvbiBidXR0b24uCi0JICogQWxsb3dlZCBidXR0b24gc3R5bGVzOiBTV1QuUkFESU8sIFNXVC5DSEVDSywgU1dULlRPR0dMRSwgU1dULlBVU0gKLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoaW50IGJ1dHRvblN0eWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJc1NlbGVjdGVkPSBmYWxzZTsKLQkJZkF0dGFjaGVkRGlhbG9nRmllbGRzPSBudWxsOwotCQlmQnV0dG9uU3R5bGU9IGJ1dHRvblN0eWxlOwotCX0KLQkKLQkvKioKLQkgKiBBdHRhY2hlcyBhIGZpZWxkIHRvIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIHNlbGVjdGlvbiBidXR0b24uCi0JICogVGhlIGF0dGFjaGVkIGZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdGhlIHNlbGVjdGlvbiBidXR0b24gaXMgbm90IHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaERpYWxvZ0ZpZWxkKERpYWxvZ0ZpZWxkIGRpYWxvZ0ZpZWxkKSB7Ci0JCWF0dGFjaERpYWxvZ0ZpZWxkcyhuZXcgRGlhbG9nRmllbGRbXSB7IGRpYWxvZ0ZpZWxkIH0pOwotCX0KLQotCS8qKgotCSAqIEF0dGFjaGVzIGZpZWxkcyB0byB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24gYnV0dG9uLgotCSAqIFRoZSBhdHRhY2hlZCBmaWVsZHMgd2lsbCBiZSBkaXNhYmxlZCBpZiB0aGUgc2VsZWN0aW9uIGJ1dHRvbiBpcyBub3Qgc2VsZWN0ZWQuCi0JICovCQotCXB1YmxpYyB2b2lkIGF0dGFjaERpYWxvZ0ZpZWxkcyhEaWFsb2dGaWVsZFtdIGRpYWxvZ0ZpZWxkcykgewotCQlmQXR0YWNoZWREaWFsb2dGaWVsZHM9IGRpYWxvZ0ZpZWxkczsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpYWxvZ0ZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJZGlhbG9nRmllbGRzW2ldLnNldEVuYWJsZWQoZklzU2VsZWN0ZWQpOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlzICB0ZWggZ2l2ZWQgZmllbGQgaXMgYXR0YWNoZWQgdG8gdGhlIHNlbGVjdGlvbiBidXR0b24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdHRhY2hlZChEaWFsb2dGaWVsZCBlZGl0b3IpIHsKLQkJaWYgKGZBdHRhY2hlZERpYWxvZ0ZpZWxkcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBmQXR0YWNoZWREaWFsb2dGaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZkF0dGFjaGVkRGlhbG9nRmllbGRzW2ldID09IGVkaXRvcikgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIC0tLS0tLS0gbGF5b3V0IGhlbHBlcnMKLQkvKgotCSAqIEBzZWUgRGlhbG9nRmllbGQjZG9GaWxsSW50b0dyaWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbFtdIGRvRmlsbEludG9HcmlkKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuQ29sdW1ucykgewotCQlhc3NlcnRFbm91Z2hDb2x1bW5zKG5Db2x1bW5zKTsKLQkJCi0JCUJ1dHRvbiBidXR0b249IGdldFNlbGVjdGlvbkJ1dHRvbihwYXJlbnQpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuPSBuQ29sdW1uczsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkJaWYgKGZCdXR0b25TdHlsZSA9PSBTV1QuUFVTSCkgewotCQkJZ2Qud2lkdGhIaW50ID0gU1dUVXRpbC5nZXRCdXR0b25XaWR0aEhpbnQoYnV0dG9uKTsKLQkJfQkJCQotCQkKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbmV3IENvbnRyb2xbXSB7IGJ1dHRvbiB9OwotCX0JCi0KLQkvKgotCSAqIEBzZWUgRGlhbG9nRmllbGQjZ2V0TnVtYmVyT2ZDb250cm9scwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZDb250cm9scygpIHsKLQkJcmV0dXJuIDE7CQotCX0KLQotCS8vIC0tLS0tLS0gdWkgY3JlYXRpb24KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gYnV0dG9uIHdpZGdldC4gV2hlbiBjYWxsZWQgdGhlIGZpcnN0IHRpbWUsIHRoZSB3aWRnZXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBUaGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVuIGNhbGxlZCB0aGUgZmlyc3QgdGltZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBhZnRlci4KLQkgKi8JCQotCXB1YmxpYyBCdXR0b24gZ2V0U2VsZWN0aW9uQnV0dG9uKENvbXBvc2l0ZSBncm91cCkgewotCQlpZiAoZkJ1dHRvbiA9PSBudWxsKSB7Ci0JCQlhc3NlcnRDb21wb3NpdGVOb3ROdWxsKGdyb3VwKTsKLQkJCQotCQkJZkJ1dHRvbj0gbmV3IEJ1dHRvbihncm91cCwgZkJ1dHRvblN0eWxlKTsKLQkJCWZCdXR0b24uc2V0Rm9udChncm91cC5nZXRGb250KCkpOwkJCQotCQkJZkJ1dHRvbi5zZXRUZXh0KGZMYWJlbFRleHQpOwotCQkJZkJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQkJCWZCdXR0b24uc2V0U2VsZWN0aW9uKGZJc1NlbGVjdGVkKTsKLQkJCWZCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJCQl9Ci0JCQl9KTsJCQkJCi0JCX0KLQkJcmV0dXJuIGZCdXR0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoaXNPa1RvVXNlKGZCdXR0b24pKSB7Ci0JCQljaGFuZ2VWYWx1ZShmQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVZhbHVlKGJvb2xlYW4gbmV3U3RhdGUpIHsKLQkJaWYgKGZJc1NlbGVjdGVkICE9IG5ld1N0YXRlKSB7Ci0JCQlmSXNTZWxlY3RlZD0gbmV3U3RhdGU7CQkJCi0JCQlpZiAoZkF0dGFjaGVkRGlhbG9nRmllbGRzICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGZvY3VzU2V0PSBmYWxzZTsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgZkF0dGFjaGVkRGlhbG9nRmllbGRzLmxlbmd0aDsgaSsrKSB7CQkKLQkJCQkJZkF0dGFjaGVkRGlhbG9nRmllbGRzW2ldLnNldEVuYWJsZWQoZklzU2VsZWN0ZWQpOwotCQkJCQlpZiAoZklzU2VsZWN0ZWQgJiYgIWZvY3VzU2V0KSB7Ci0JCQkJCQlmb2N1c1NldD0gZkF0dGFjaGVkRGlhbG9nRmllbGRzW2ldLnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkaWFsb2dGaWVsZENoYW5nZWQoKTsKLQkJfSBlbHNlIGlmIChmQnV0dG9uU3R5bGUgPT0gU1dULlBVU0gpIHsKLQkJCWRpYWxvZ0ZpZWxkQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLy8gLS0tLS0tIG1vZGVsIGFjY2VzcwkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotCQlyZXR1cm4gZklzU2VsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoZSBidXR0b24uCi0JICovCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihib29sZWFuIHNlbGVjdGVkKSB7Ci0JCWNoYW5nZVZhbHVlKHNlbGVjdGVkKTsKLQkJaWYgKGlzT2tUb1VzZShmQnV0dG9uKSkgewotCQkJZkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JLy8gLS0tLS0tIGVuYWJsZSAvIGRpc2FibGUgbWFuYWdlbWVudAotCS8qCi0JICogQHNlZSBEaWFsb2dGaWVsZCN1cGRhdGVFbmFibGVTdGF0ZQotCSAqLwkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmFibGVTdGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlRW5hYmxlU3RhdGUoKTsKLQkJaWYgKGlzT2tUb1VzZShmQnV0dG9uKSkgewotCQkJZkJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvQXJyYXlWYXJpYWJsZURpYWxvZy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9ncy9BcnJheVZhcmlhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzE0NjIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9ncy9BcnJheVZhcmlhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnBkaS5tb2RlbC5haWYuSUFJRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5wZGkubW9kZWwuYWlmLklBSUZUeXBlQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIEFycmF5VmFyaWFibGVEaWFsb2cgZXh0ZW5kcyBWYXJpYWJsZURpYWxvZyB7Ci0JcHVibGljIEFycmF5VmFyaWFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBJUFN0YWNrRnJhbWUgZnJhbWUpIHsKLQkJc3VwZXIocGFyZW50LCBmcmFtZSk7Ci0JfQotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgZ2V0Vmlld0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUZpbHRlcigpOwotCX0KLQlwcml2YXRlIGNsYXNzIEFycmF5RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFZhcmlhYmxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUFJRiBhaWYgPSAoKElQVmFyaWFibGUpZWxlbWVudCkuZ2V0QUlGKCk7Ci0JCQkJCWlmIChhaWYgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKGFpZi5nZXRUeXBlKCkgaW5zdGFuY2VvZiBJQUlGVHlwZUFycmF5KSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvRGlhbG9nTWVzc2FnZXMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvRGlhbG9nTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkZGUzZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dzL0RpYWxvZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhbG9nTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuZGlhbG9ncy5EaWFsb2dNZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXByaXZhdGUgRGlhbG9nTWVzc2FnZXMoKSB7fQotCi0JLyoqIEdldCBzdHJpbmcKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9ncy9EaWFsb2dNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9ncy9EaWFsb2dNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDUzNzQ1Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvRGlhbG9nTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAjIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAjIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gIyAKLSAjIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gIyAKLSAjIExBLUNDIDA0LTExNQotICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0gIyBAYXV0aG9yIENsZW1lbnQKLSAjCi0gIyMKLVZhcmlhYmxlRGlhbG9nLm5hbWU9QWRkIFZhcmlhYmxlCi1WYXJpYWJsZURpYWxvZy5sYWJlbD1WYXJpYWJsZXMKLQotUmFuZ2VEaWFsb2cuZnJvbT1Gcm9tCi1SYW5nZURpYWxvZy50bz1UbwotUmFuZ2VEaWFsb2cuZ3JvdXA9UmFuZ2Ugc2V0dGluZwotUmFuZ2VEaWFsb2cucm93PVJvdwotUmFuZ2VEaWFsb2cuY29sdW1uPUNvbHVtbgotCi1QVFBWYXJpYWJsZXNEaWFsb2cudGl0bGU9UFRQIFZhcmlhYmxlCi1QVFBWYXJpYWJsZXNEaWFsb2cubmFtZT1OYW1lOgotUFRQVmFyaWFibGVzRGlhbG9nLnNldD1TZXQ6Ci1QVFBWYXJpYWJsZXNEaWFsb2cubmV3U2VjdGlvbj1OZXcKLVBUUFZhcmlhYmxlc0RpYWxvZy52YXJTZWN0aW9uPUF2YWlhYmxlIHZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9ncy9SYW5nZURpYWxvZy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZGlhbG9ncy9SYW5nZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYzYzU3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvUmFuZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIEdyb3VwIHJvd0dyb3VwID0gbnVsbDsKLQlwcml2YXRlIEdyb3VwIGNvbEdyb3VwID0gbnVsbDsKLQlwcml2YXRlIEludGVnZXJGaWVsZEVkaXRvciByb3dGcm9tRmllbGQgPSBudWxsOwotCXByaXZhdGUgSW50ZWdlckZpZWxkRWRpdG9yIHJvd1RvRmllbGQgPSBudWxsOwotCXByaXZhdGUgSW50ZWdlckZpZWxkRWRpdG9yIGNvbEZyb21GaWVsZCA9IG51bGw7Ci0JcHJpdmF0ZSBJbnRlZ2VyRmllbGRFZGl0b3IgY29sVG9GaWVsZCA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0IGVycm9yTWVzc2FnZVRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IG1heFJvdyA9IDA7Ci0JcHJpdmF0ZSBpbnQgbWF4Q29sID0gMDsKLQlwcml2YXRlIGludCBmcm9tUm93ID0gMDsKLQlwcml2YXRlIGludCB0b1JvdyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZnJvbUNvbCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdG9Db2wgPSAwOwotCQotICAgIHB1YmxpYyBSYW5nZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgaW50IG1heENvbCwgaW50IG1heFJvdykgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIHRoaXMubWF4Q29sID0gbWF4Q29sOwotICAgICAgICB0aGlzLnRvQ29sID0gbWF4Q29sOwotICAgICAgICB0aGlzLm1heFJvdyA9IG1heFJvdzsKLSAgICAgICAgdGhpcy50b1JvdyA9IG1heFJvdzsKLSAgICB9Ci0gICAgcHVibGljIGludCBnZXRGcm9tUm93KCkgewotICAgIAlyZXR1cm4gZnJvbVJvdzsKLSAgICB9Ci0gICAgcHVibGljIGludCBnZXRUb1JvdygpIHsKLSAgICAJcmV0dXJuIHRvUm93OwotICAgIH0KLSAgICBwdWJsaWMgaW50IGdldEZyb21Db2woKSB7Ci0gICAgCXJldHVybiBmcm9tQ29sOwotICAgIH0KLSAgICBwdWJsaWMgaW50IGdldFRvQ29sKCkgewotICAgIAlyZXR1cm4gdG9Db2w7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0gICAgICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0gICAgICAgIAlmcm9tUm93ID0gcm93RnJvbUZpZWxkLmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICB0b1JvdyA9IHJvd1RvRmllbGQuZ2V0SW50VmFsdWUoKTsKLSAgICAgICAgCWZyb21Db2wgPSBjb2xGcm9tRmllbGQuZ2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgIHRvQ29sID0gY29sVG9GaWVsZC5nZXRJbnRWYWx1ZSgpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dChEaWFsb2dNZXNzYWdlcy5nZXRTdHJpbmcoIlJhbmdlRGlhbG9nLmdyb3VwIikpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotICAgIAlnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgQnV0dG9uIGdldE9rQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgCWNvbEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjb2xHcm91cC5zZXRUZXh0KERpYWxvZ01lc3NhZ2VzLmdldFN0cmluZygiUmFuZ2VEaWFsb2cuY29sdW1uIikpOwotICAgICAgICBjb2xHcm91cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIGNvbEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgIAljb2xGcm9tRmllbGQgPSBuZXcgUmFuZ2VJbnRlZ2VyRmllbGRFZGl0b3IoImNvbEZyb21GaWVsZCIsIERpYWxvZ01lc3NhZ2VzLmdldFN0cmluZygiUmFuZ2VEaWFsb2cuZnJvbSIpLCBjb2xHcm91cCk7Ci0gICAgICAgCWNvbEZyb21GaWVsZC5zZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAJY29sVG9GaWVsZCA9IG5ldyBSYW5nZUludGVnZXJGaWVsZEVkaXRvcigiY29sVG9GaWVsZCIsIERpYWxvZ01lc3NhZ2VzLmdldFN0cmluZygiUmFuZ2VEaWFsb2cudG8iKSwgY29sR3JvdXApOwotICAgICAgIAljb2xUb0ZpZWxkLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgIAkKLSAgICAJcm93R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHJvd0dyb3VwLnNldFRleHQoRGlhbG9nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSYW5nZURpYWxvZy5yb3ciKSk7Ci0gICAgICAgIHJvd0dyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICAgICAgcm93R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgCXJvd0Zyb21GaWVsZCA9IG5ldyBSYW5nZUludGVnZXJGaWVsZEVkaXRvcigicm93RnJvbUZpZWxkIiwgRGlhbG9nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSYW5nZURpYWxvZy5mcm9tIiksIHJvd0dyb3VwKTsKLSAgICAgICAJcm93RnJvbUZpZWxkLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgIAlyb3dUb0ZpZWxkID0gbmV3IFJhbmdlSW50ZWdlckZpZWxkRWRpdG9yKCJyb3dUb0ZpZWxkIiwgRGlhbG9nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSYW5nZURpYWxvZy50byIpLCByb3dHcm91cCk7Ci0gICAgICAgCXJvd1RvRmllbGQuc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgCQotICAgICAgICBlcnJvck1lc3NhZ2VUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZXJyb3JNZXNzYWdlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgZXJyb3JNZXNzYWdlVGV4dC5zZXRCYWNrZ3JvdW5kKGVycm9yTWVzc2FnZVRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgb3Blbihib29sZWFuIHNob3dDb2wsIGJvb2xlYW4gc2hvd1JvdywgaW50IGZyb21Db2wsIGludCB0b0NvbCwgaW50IGZyb21Sb3csIGludCB0b1JvdykgewotICAgIAl0aGlzLmZyb21Db2wgPSBmcm9tQ29sOwotICAgIAl0aGlzLnRvQ29sID0gKHRvQ29sPT0wP21heENvbDp0b0NvbCk7Ci0gICAgCXRoaXMuZnJvbVJvdyA9IGZyb21Sb3c7Ci0gICAgCXRoaXMudG9Sb3cgPSB0b1Jvdz09MD9tYXhSb3c6dG9Sb3c7Ci0gICAgCXJldHVybiBvcGVuKHNob3dDb2wsIHNob3dSb3cpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IG9wZW4oYm9vbGVhbiBzaG93Q29sLCBib29sZWFuIHNob3dSb3cpIHsKLSAgICAJY3JlYXRlKCk7Ci0gICAgCWNvbEdyb3VwLnNldEVuYWJsZWQoc2hvd0NvbCk7Ci0gICAgICAgCWNvbEZyb21GaWVsZC5zZXRFbmFibGVkKHNob3dDb2wsIGNvbEdyb3VwKTsKLSAgICAgICAJY29sVG9GaWVsZC5zZXRFbmFibGVkKHNob3dDb2wsIGNvbEdyb3VwKTsKLSAgICAJcm93R3JvdXAuc2V0RW5hYmxlZChzaG93Um93KTsKLSAgICAJcm93RnJvbUZpZWxkLnNldEVuYWJsZWQoc2hvd1Jvdywgcm93R3JvdXApOwotICAgIAlyb3dUb0ZpZWxkLnNldEVuYWJsZWQoc2hvd1Jvdywgcm93R3JvdXApOwotICAgICAgIAljb2xGcm9tRmllbGQuc2V0U3RyaW5nVmFsdWUoIiIrZnJvbUNvbCk7Ci0gICAgICAgCWNvbFRvRmllbGQuc2V0U3RyaW5nVmFsdWUoIiIrdG9Db2wpOwotICAgICAgIAlyb3dGcm9tRmllbGQuc2V0U3RyaW5nVmFsdWUoIiIrZnJvbVJvdyk7Ci0gICAgICAgCXJvd1RvRmllbGQuc2V0U3RyaW5nVmFsdWUoIiIrdG9Sb3cpOwotICAgIAlyZXR1cm4gb3BlbigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgIAlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgCQlib29sZWFuIGhhc0Vycm9yID0gZmFsc2U7Ci0gICAgCQlpZiAoY29sR3JvdXAuaXNFbmFibGVkKCkpIHsKLQkgICAgCQloYXNFcnJvciA9ICghY29sRnJvbUZpZWxkLmlzVmFsaWQoKSB8fCAhY29sVG9GaWVsZC5pc1ZhbGlkKCkpOwotCSAgICAJCWlmICghaGFzRXJyb3IpIHsKLQkgICAgCQkJaW50IGZyb21WYWx1ZSA9IGNvbEZyb21GaWVsZC5nZXRJbnRWYWx1ZSgpOwotCSAgICAJCQlpbnQgdG9WYWx1ZSA9IGNvbFRvRmllbGQuZ2V0SW50VmFsdWUoKTsKLQkgICAgCQkJaGFzRXJyb3IgPSAoZnJvbVZhbHVlIDwgMCB8fCBmcm9tVmFsdWUgPj0gdG9WYWx1ZSB8fCB0b1ZhbHVlID4gbWF4Q29sKTsKLQkgICAgCQl9Ci0gICAgCQl9Ci0gICAgCQlpZiAocm93R3JvdXAuaXNFbmFibGVkKCkgJiYgIWhhc0Vycm9yKSB7Ci0JICAgIAkJaGFzRXJyb3IgPSAoIXJvd0Zyb21GaWVsZC5pc1ZhbGlkKCkgfHwgIXJvd1RvRmllbGQuaXNWYWxpZCgpKTsKLQkgICAgCQlpZiAoIWhhc0Vycm9yKSB7Ci0JICAgIAkJCWludCBmcm9tVmFsdWUgPSByb3dGcm9tRmllbGQuZ2V0SW50VmFsdWUoKTsKLQkgICAgCQkJaW50IHRvVmFsdWUgPSByb3dUb0ZpZWxkLmdldEludFZhbHVlKCk7Ci0JICAgIAkJCWhhc0Vycm9yID0gKGZyb21WYWx1ZSA8IDAgfHwgZnJvbVZhbHVlID49IHRvVmFsdWUgfHwgdG9WYWx1ZSA+IG1heFJvdyk7Ci0JICAgIAkJfQotICAgIAkJfQotICAgIAkJZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKCFoYXNFcnJvcik7Ci0gICAgCQllcnJvck1lc3NhZ2VUZXh0LnNldFRleHQoaGFzRXJyb3I/IkludmFsaWQgaW5wdXQiOiIiKTsKLSAgICAJfQotICAgIH07Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBSYW5nZUludGVnZXJGaWVsZEVkaXRvciBleHRlbmRzIEludGVnZXJGaWVsZEVkaXRvciB7Ci0gICAgCXByaXZhdGUgUmFuZ2VJbnRlZ2VyRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAkJc3VwZXIobmFtZSwgbGFiZWwsIHBhcmVudCk7Ci0gICAgCX0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IGdldE51bWJlck9mQ29udHJvbHMoKTsKLSAgICAgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0gICAgICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLSAgICAgICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IEhPUklaT05UQUxfR0FQOwotICAgICAgICAgICAgcGFyZW50LnNldExheW91dChsYXlvdXQpOwotICAgICAgICAgICAgZG9GaWxsSW50b0dyaWQocGFyZW50LCBsYXlvdXQubnVtQ29sdW1ucyk7Ci0gICAgICAgIH0gICAgCQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvVmFyaWFibGVEaWFsb2cuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL2RpYWxvZ3MvVmFyaWFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkZTEwOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9kaWFsb2dzL1ZhcmlhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgSVBTdGFja0ZyYW1lIGZyYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdFZpZXdlciBsaXN0Vmlld2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVBWYXJpYWJsZSBzZWxlY3RlZFZhcmlhYmxlID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElQU3RhY2tGcmFtZSBmcmFtZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmZyYW1lID0gZnJhbWU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChEaWFsb2dNZXNzYWdlcy5nZXRTdHJpbmcoIlZhcmlhYmxlRGlhbG9nLm5hbWUiKSk7Ci0JfQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlDb21wb3NpdGUgcmVzdWx0ID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyZXN1bHQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlc3VsdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJbmV3IExhYmVsKHJlc3VsdCwgU1dULk5PTkUpLnNldFRleHQoRGlhbG9nTWVzc2FnZXMuZ2V0U3RyaW5nKCJWYXJpYWJsZURpYWxvZy5sYWJlbCIpKTsKLQkJbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHJlc3VsdCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbGlzdFZpZXdlci5nZXRMaXN0KCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmFyaWFibGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiAoKElWYXJpYWJsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gIiI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9KTsKLQkJbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkKLQkJCQkJcmV0dXJuIChPYmplY3RbXSkgaW5wdXRFbGVtZW50OwotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQl9KTsKLQkJbGlzdFZpZXdlci5hZGRGaWx0ZXIoZ2V0Vmlld0ZpbHRlcigpKTsKLQkJdHJ5IHsKLQkJCWxpc3RWaWV3ZXIuc2V0SW5wdXQoZnJhbWUuZ2V0VmFyaWFibGVzKCkpOwotCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQlsaXN0Vmlld2VyLnNldElucHV0KG51bGwpOwotCQl9Ci0JCWxpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRPa0J1dHRvbigpLnNldEVuYWJsZWQoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0Vmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWJ1dHRvblByZXNzZWQoSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCQl9Ci0JCX0pOwotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJZ2V0T2tCdXR0b24oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IFZpZXdlckZpbHRlciBnZXRWaWV3RmlsdGVyKCk7Ci0JcHVibGljIEJ1dHRvbiBnZXRPa0J1dHRvbigpIHsKLQkJcmV0dXJuIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQl9Ci0JcHVibGljIElQVmFyaWFibGUgZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkVmFyaWFibGU7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCXNlbGVjdGVkVmFyaWFibGUgPSBudWxsOwotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBsaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCU9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVBWYXJpYWJsZSkKLQkJCQkJCXNlbGVjdGVkVmFyaWFibGUgPSAoSVBWYXJpYWJsZSkgb2JqOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9lZGl0b3JzL1BEZWJ1Z1RleHRIb3Zlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvZWRpdG9ycy9QRGVidWdUZXh0SG92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxMjFlNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9lZGl0b3JzL1BEZWJ1Z1RleHRIb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZXh0LmMuaG92ZXIuSUNFZGl0b3JUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBEZWJ1Z1RleHRIb3ZlciBpbXBsZW1lbnRzIElDRWRpdG9yVGV4dEhvdmVyLCBJVGV4dEhvdmVyRXh0ZW5zaW9uLCBJU2VsZWN0aW9uTGlzdGVuZXIsIElQYXJ0TGlzdGVuZXIgewotCXN0YXRpYyBmaW5hbCBwcml2YXRlIGludCBNQVhfSE9WRVJfSU5GT19TSVpFID0gMTAwOwotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGZTZWxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBmRWRpdG9yOwotCi0JLyoqIENvbnN0cnVjdG9yCi0JICogCi0JICovCi0JcHVibGljIFBEZWJ1Z1RleHRIb3ZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCUlQU3RhY2tGcmFtZSBmcmFtZSA9IGdldEZyYW1lKCk7Ci0JCWlmIChmcmFtZSAhPSBudWxsICYmIGZyYW1lLmNhbkV2YWx1YXRlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlTdHJpbmcgZXhwcmVzc2lvbiA9IGRvY3VtZW50LmdldChob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwgaG92ZXJSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChleHByZXNzaW9uID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWV4cHJlc3Npb24gPSBleHByZXNzaW9uLnRyaW0oKTsKLQkJCQlpZiAoZXhwcmVzc2lvbi5sZW5ndGgoKSA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCVN0cmluZyByZXN1bHQgPSBldmFsdWF0ZUV4cHJlc3Npb24oZnJhbWUsIGV4cHJlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQkJYXBwZW5kVmFyaWFibGUoYnVmZmVyLCBmcmFtZS5nZXRJRCgpLCBtYWtlSFRNTFNhZmUoZXhwcmVzc2lvbiksIG1ha2VIVE1MU2FmZShyZXN1bHQudHJpbSgpKSk7Ci0JCQkJfQotCQkJCWNhdGNoKERlYnVnRXhjZXB0aW9uIHgpIHsKLQkJCQkJUFRQRGVidWdVSVBsdWdpbi5sb2coeCk7Ci0JCQkJfQotCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJUFRQRGVidWdVSVBsdWdpbi5sb2coeCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJcmV0dXJuIFBEZWJ1Z1VJVXRpbHMuZmluZFdvcmQodmlld2VyLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKiBHZXQgZXZhbHV0ZSBleHByZXNzaW9uIHJlc3VsdAotCSAqIEBwYXJhbSBmcmFtZQotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV2YWx1YXRlRXhwcmVzc2lvbihJUFN0YWNrRnJhbWUgZnJhbWUsIFN0cmluZyBleHByZXNzaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZnJhbWUuZXZhbHVhdGVFeHByZXNzaW9uVG9TdHJpbmcoZXhwcmVzc2lvbik7Ci0JCX0KLQkJY2F0Y2goRGVidWdFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKiogQXBwZW5kIGZvcm1hdHRlZCB2YXJpYWJsZSB0ZXh0IAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gdGFza0lECi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRWYXJpYWJsZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgdGFza0lELCBTdHJpbmcgZXhwcmVzc2lvbiwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAodmFsdWUubGVuZ3RoKCkgPiBNQVhfSE9WRVJfSU5GT19TSVpFKQotCQkJdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgTUFYX0hPVkVSX0lORk9fU0laRSkgKyAiIC4uLiI7Ci0JCWJ1ZmZlci5hcHBlbmQoIjxwPiIpOwotCQlidWZmZXIuYXBwZW5kKCI8cHJlPiIpLmFwcGVuZCh0YXNrSUQgKyAiOiAiKS5hcHBlbmQoZXhwcmVzc2lvbikuYXBwZW5kKCI8L3ByZT4iKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7Ci0JCWJ1ZmZlci5hcHBlbmQoIjxiPjxwcmU+IikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoIjwvcHJlPjwvYj4iKTsKLQkJYnVmZmVyLmFwcGVuZCgiPC9wPiIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC51aS50ZXh0LmMuaG92ZXIuSUNFZGl0b3JUZXh0SG92ZXIjc2V0RWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlmRWRpdG9yID0gZWRpdG9yOwotCQkJLy8gaW5pdGlhbGl6ZSBzZWxlY3Rpb24KLQkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZkVkaXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJCQlwYWdlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcsIFBEZWJ1Z1RleHRIb3Zlci50aGlzKTsKLQkJCQkJcGFnZS5hZGRQYXJ0TGlzdGVuZXIoUERlYnVnVGV4dEhvdmVyLnRoaXMpOwotCQkJCQlmU2VsZWN0aW9uID0gcGFnZS5nZXRTZWxlY3Rpb24oSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVyk7Ci0JCQkJfQotCQkJfTsKLQkJCVBUUERlYnVnVUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKHIpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7fQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHt9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0LmVxdWFscyhmRWRpdG9yKSkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGZFZGl0b3IuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCXBhZ2UucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVywgdGhpcyk7Ci0JCQlwYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCWZTZWxlY3Rpb24gPSBudWxsOwotCQkJZkVkaXRvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7fQotCi0JLyoqIEdldCBzdGFjayBmcmFtZSBmcm9tIHNlbGVjdGVkIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQU3RhY2tGcmFtZSBnZXRGcmFtZSgpIHsKLQkJaWYgKGZTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWZTZWxlY3Rpb247Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IGVsID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChlbCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkJcmV0dXJuIChJUFN0YWNrRnJhbWUpKChJQWRhcHRhYmxlKWVsKS5nZXRBZGFwdGVyKElQU3RhY2tGcmFtZS5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbiNnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIENvbnZlcnQgc3ltYm9sIHRvIHN1cHBvcnQgaHRtbCBmb3JtYXQKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlSFRNTFNhZmUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcubGVuZ3RoKCkpOwotCQlmb3IoaW50IGkgPSAwOyBpICE9IHN0cmluZy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyaW5nLmNoYXJBdChpKTsKLQkJCXN3aXRjaChjaCkgewotCQkJCWNhc2UgJyYnOgotCQkJCQlidWZmZXIuYXBwZW5kKCImYW1wOyIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc8JzoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiJmx0OyIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JzoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiJmd0OyIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlidWZmZXIuYXBwZW5kKGNoKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1BEZWJ1Z1ByZWZlcmVuY2VQYWdlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9QRGVidWdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVjMjllLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1BEZWJ1Z1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSW50ZWdlckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUFRQRGVidWdDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QRGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUHJlZmVyZW5jZXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQRGVidWdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgQnV0dG9uIGZQYXRoc0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZlJlZ2lzdGVyZWRQcm9jZXNzQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEludGVnZXJGaWVsZEVkaXRvciBjb21tYW5kVGltZW91dEZpZWxkID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiB1cGRhdGVWYXJpYWJsZU9uU3VzcGVuZEJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gdXBkYXRlVmFyaWFibGVPbkNoYW5nZUJ1dHRvbiA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFdpZGdldExpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlzZXRWYWxpZChpc1ZhbGlkKCkpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBXaWRnZXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBXaWRnZXRMaXN0ZW5lcigpOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFBEZWJ1Z1ByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGVidWdQcmVmZXJlbmNlUGFnZS5kZXNjIikpOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUobmV3IFByZWZlcmVuY2VzQWRhcHRlcihQVFBEZWJ1Z0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gaWdub3JlZCBoZWxwCi0JCS8vIGdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwgSVBEZWJ1Z0hlbHBDb250ZXh0SWRzLlBfREVCVUdfUFJFRkVSRU5DRV9QQUdFKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVTcGFjZXIoY29tcG9zaXRlLCAxKTsKLQkJY3JlYXRlVmlld1NldHRpbmdQcmVmZXJlbmNlcyhjb21wb3NpdGUpOwotCQljcmVhdGVTcGFjZXIoY29tcG9zaXRlLCAxKTsKLQkJY3JlYXRlQ29tbXVuaWNhdGlvblByZWZlcmVuY2VzKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVNwYWNlcihjb21wb3NpdGUsIDEpOwotCQljcmVhdGVWYXJpYWJsZXNQcmVmZXJlbmNlcyhjb21wb3NpdGUpOwotCQlzZXRWYWx1ZXMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlIG90aGVyIGRlYnVnIHNldHRpbmdzCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU90aGVyRGVidWdTZXR0aW5nKENvbXBvc2l0ZSBwYXJlbnQpIHt9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHZpZXcgcHJlZmVyZW5jZSBzZXR0aW5ncwotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWaWV3U2V0dGluZ1ByZWZlcmVuY2VzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXAgPSBjcmVhdGVHcm91cENvbXBvc2l0ZShwYXJlbnQsIDEsIGZhbHNlLCBQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGVidWdQcmVmZXJlbmNlUGFnZS5kZWZhdWx0MSIpKTsKLQkJZlBhdGhzQnV0dG9uID0gY3JlYXRlQ2hlY2tCdXR0b24oY29tcCwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiUERlYnVnUHJlZmVyZW5jZVBhZ2UuZGVmYXVsdDIiKSk7Ci0JCWZSZWdpc3RlcmVkUHJvY2Vzc0J1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGNvbXAsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBEZWJ1Z1ByZWZlcmVuY2VQYWdlLnJlZ2lzdGVyUHJvY2VzcyIpKTsKLQkJZlJlZ2lzdGVyZWRQcm9jZXNzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0gZlJlZ2lzdGVyZWRQcm9jZXNzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICghaXNDaGVja2VkKSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoZ2V0U2hlbGwoKSwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiUERlYnVnUHJlZmVyZW5jZVBhZ2Uud2FybmluZ1RpdGxlMSIpLCBQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGVidWdQcmVmZXJlbmNlUGFnZS53YXJuaW5nMSIpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgY29tbXVuaWNhdGlvbiBwcmVmZXJlbmNlIHNldHRpbmdzCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbW11bmljYXRpb25QcmVmZXJlbmNlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wID0gY3JlYXRlR3JvdXBDb21wb3NpdGUocGFyZW50LCAxLCBmYWxzZSwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiUERlYnVnUHJlZmVyZW5jZVBhZ2UuY29tbXVuaWNhdGlvbl9ncm91cCIpKTsKLQkJQ29tcG9zaXRlIHNwYWNpbmdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FKTsKLQkJc3BhY2luZ0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNwYWNpbmdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29tbWFuZFRpbWVvdXRGaWVsZCA9IG5ldyBJbnRlZ2VyRmllbGRFZGl0b3IoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1BUUF9ERUJVR19DT01NX1RJTUVPVVQsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBEZWJ1Z1ByZWZlcmVuY2VQYWdlLmNvbW1hbmRfdGltZW91dCIpLCBzcGFjaW5nQ29tcG9zaXRlKTsKLQkJY29tbWFuZFRpbWVvdXRGaWVsZC5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQljb21tYW5kVGltZW91dEZpZWxkLnNldFZhbGlkYXRlU3RyYXRlZ3koU3RyaW5nRmllbGRFZGl0b3IuVkFMSURBVEVfT05fS0VZX1NUUk9LRSk7Ci0JCWNvbW1hbmRUaW1lb3V0RmllbGQuc2V0VmFsaWRSYW5nZShJUERlYnVnQ29uc3RhbnRzLk1JTl9SRVFVRVNUX1RJTUVPVVQsIElQRGVidWdDb25zdGFudHMuTUFYX1JFUVVFU1RfVElNRU9VVCk7Ci0JCVN0cmluZyBtaW5WYWx1ZSA9IEludGVnZXIudG9TdHJpbmcoSVBEZWJ1Z0NvbnN0YW50cy5NSU5fUkVRVUVTVF9USU1FT1VUKTsKLQkJU3RyaW5nIG1heFZhbHVlID0gSW50ZWdlci50b1N0cmluZyhJUERlYnVnQ29uc3RhbnRzLk1BWF9SRVFVRVNUX1RJTUVPVVQpOwotCQljb21tYW5kVGltZW91dEZpZWxkLnNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChQcmVmZXJlbmNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRGVidWdQcmVmZXJlbmNlUGFnZS50aW1lb3V0RXJyb3IiKSwgbmV3IE9iamVjdFtdIHsgbWluVmFsdWUsIG1heFZhbHVlIH0pKTsKLQkJY29tbWFuZFRpbWVvdXRGaWVsZC5zZXRFbXB0eVN0cmluZ0FsbG93ZWQoZmFsc2UpOwotCQljb21tYW5kVGltZW91dEZpZWxkLnNldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQljb21tYW5kVGltZW91dEZpZWxkLmxvYWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHZhcmlhYmxlIHByZWZlcmVuY2Ugc2V0dGluZ3MKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFyaWFibGVzUHJlZmVyZW5jZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IGNyZWF0ZUdyb3VwQ29tcG9zaXRlKHBhcmVudCwgMSwgZmFsc2UsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBEZWJ1Z1ByZWZlcmVuY2VQYWdlLnZhcmlhYmxlX2dyb3VwIikpOwotCQl1cGRhdGVWYXJpYWJsZU9uU3VzcGVuZEJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGNvbXAsIFByZWZlcmVuY2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBEZWJ1Z1ByZWZlcmVuY2VQYWdlLnVwZGF0ZVZhcmlhYmxlT25TdXNwZW5kIikpOwotCQl1cGRhdGVWYXJpYWJsZU9uQ2hhbmdlQnV0dG9uID0gY3JlYXRlQ2hlY2tCdXR0b24oY29tcCwgUHJlZmVyZW5jZU1lc3NhZ2VzLmdldFN0cmluZygiUERlYnVnUHJlZmVyZW5jZVBhZ2UudXBkYXRlVmFyaWFibGVPbkNoYW5nZSIpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWZQYXRoc0J1dHRvbi5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0RGVmYXVsdEJvb2xlYW4oSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1NIT1dfRlVMTF9QQVRIUykpOwotCQlmUmVnaXN0ZXJlZFByb2Nlc3NCdXR0b24uc2V0U2VsZWN0aW9uKHN0b3JlLmdldERlZmF1bHRCb29sZWFuKElQRGVidWdDb25zdGFudHMuUFJFRl9QVFBfREVCVUdfUkVHSVNURVJfUFJPQ18wKSk7Ci0JCWNvbW1hbmRUaW1lb3V0RmllbGQuc2V0U3RyaW5nVmFsdWUoU3RyaW5nLnZhbHVlT2Yoc3RvcmUuZ2V0RGVmYXVsdEludChJUERlYnVnQ29uc3RhbnRzLlBSRUZfUFRQX0RFQlVHX0NPTU1fVElNRU9VVCkpKTsKLQkJdXBkYXRlVmFyaWFibGVPblN1c3BlbmRCdXR0b24uc2V0U2VsZWN0aW9uKHN0b3JlLmdldERlZmF1bHRCb29sZWFuKElQRGVidWdDb25zdGFudHMuUFJFRl9VUERBVEVfVkFSSUFCTEVTX09OX1NVU1BFTkQpKTsKLQkJdXBkYXRlVmFyaWFibGVPbkNoYW5nZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0RGVmYXVsdEJvb2xlYW4oSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1VQREFURV9WQVJJQUJMRVNfT05fQ0hBTkdFKSk7Ci0JCWNvbW1hbmRUaW1lb3V0RmllbGQubG9hZERlZmF1bHQoKTsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJlZnJlc2hWaWV3KCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI3NldFZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWZQYXRoc0J1dHRvbi5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihJUERlYnVnQ29uc3RhbnRzLlBSRUZfU0hPV19GVUxMX1BBVEhTKSk7Ci0JCWZSZWdpc3RlcmVkUHJvY2Vzc0J1dHRvbi5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihJUERlYnVnQ29uc3RhbnRzLlBSRUZfUFRQX0RFQlVHX1JFR0lTVEVSX1BST0NfMCkpOwotCQljb21tYW5kVGltZW91dEZpZWxkLnNldFN0cmluZ1ZhbHVlKFN0cmluZy52YWx1ZU9mKHN0b3JlLmdldEludChJUERlYnVnQ29uc3RhbnRzLlBSRUZfUFRQX0RFQlVHX0NPTU1fVElNRU9VVCkpKTsKLQkJdXBkYXRlVmFyaWFibGVPblN1c3BlbmRCdXR0b24uc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1VQREFURV9WQVJJQUJMRVNfT05fU1VTUEVORCkpOwotCQl1cGRhdGVWYXJpYWJsZU9uQ2hhbmdlQnV0dG9uLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKElQRGVidWdDb25zdGFudHMuUFJFRl9VUERBVEVfVkFSSUFCTEVTX09OX0NIQU5HRSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29tbWFuZFRpbWVvdXRGaWVsZC5kaXNwb3NlKCk7Ci0JCWZQYXRoc0J1dHRvbi5kaXNwb3NlKCk7Ci0JCWZSZWdpc3RlcmVkUHJvY2Vzc0J1dHRvbi5kaXNwb3NlKCk7Ci0JCXVwZGF0ZVZhcmlhYmxlT25TdXNwZW5kQnV0dG9uLmRpc3Bvc2UoKTsKLQkJdXBkYXRlVmFyaWFibGVPbkNoYW5nZUJ1dHRvbi5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9CQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2Ujc3RvcmVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldFZhbHVlKElQRGVidWdDb25zdGFudHMuUFJFRl9TSE9XX0ZVTExfUEFUSFMsIGZQYXRoc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCXN0b3JlLnNldFZhbHVlKElQRGVidWdDb25zdGFudHMuUFJFRl9QVFBfREVCVUdfUkVHSVNURVJfUFJPQ18wLCBmUmVnaXN0ZXJlZFByb2Nlc3NCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlzdG9yZS5zZXRWYWx1ZShJUERlYnVnQ29uc3RhbnRzLlBSRUZfUFRQX0RFQlVHX0NPTU1fVElNRU9VVCwgY29tbWFuZFRpbWVvdXRGaWVsZC5nZXRJbnRWYWx1ZSgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoSVBEZWJ1Z0NvbnN0YW50cy5QUkVGX1VQREFURV9WQVJJQUJMRVNfT05fU1VTUEVORCwgdXBkYXRlVmFyaWFibGVPblN1c3BlbmRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlzdG9yZS5zZXRWYWx1ZShJUERlYnVnQ29uc3RhbnRzLlBSRUZfVVBEQVRFX1ZBUklBQkxFU19PTl9DSEFOR0UsIHVwZGF0ZVZhcmlhYmxlT25DaGFuZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb21tYW5kVGltZW91dEZpZWxkLnN0b3JlKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlpZiAoIWNvbW1hbmRUaW1lb3V0RmllbGQuaXNWYWxpZCgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoY29tbWFuZFRpbWVvdXRGaWVsZC5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2ggZGVidWcgYnJlYWtwb2ludCB2aWV3Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXcoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlld1BhcnQgcGFydCA9IHBhZ2VzW2ldLmZpbmRWaWV3KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0JSRUFLUE9JTlRfVklFVyk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJSURlYnVnVmlldyBhZGFwdGVyID0gKElEZWJ1Z1ZpZXcpIHBhcnQuZ2V0QWRhcHRlcihJRGVidWdWaWV3LmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCVZpZXdlciB2aWV3ZXIgPSBhZGFwdGVyLmdldFZpZXdlcigpOwotCQkJCQlJRGVidWdNb2RlbFByZXNlbnRhdGlvbiBwcmVzID0gYWRhcHRlci5nZXRQcmVzZW50YXRpb24oUFRQRGVidWdDb3JlUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7Ci0JCQkJCWlmIChwcmVzICE9IG51bGwpIHsKLQkJCQkJCXByZXMuc2V0QXR0cmlidXRlKFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLkRJU1BMQVlfRlVMTF9QQVRIUywgZlBhdGhzQnV0dG9uLmdldFNlbGVjdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQkJCWZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0Vmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHN0cnVjdFZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlzdHJ1Y3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZU1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkNTg5ZS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZU1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VNZXNzYWdlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqLwotCXByaXZhdGUgUHJlZmVyZW5jZU1lc3NhZ2VzKCkge30KLQotCS8qKiBHZXQgc3RyaW5nCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzcyNDIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAjIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAjIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAjIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAjIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICMgCi0gIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICMgCi0gIyBMQS1DQyAwNC0xMTUKLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotICMgQGF1dGhvciBDbGVtZW50Ci0gIwotICMjCi0gCi1QRGVidWdQcmVmZXJlbmNlUGFnZS5kZXNjPUdlbmVyYWwgc2V0dGluZyBmb3IgcGFyYWxsZWwgZGVidWdnaW5nCi0KLVBEZWJ1Z1ByZWZlcmVuY2VQYWdlLmRlZmF1bHQxPURlZmF1bHQgc2V0dGluZwotUERlYnVnUHJlZmVyZW5jZVBhZ2UuZGVmYXVsdDI9U2hvdyBmdWxsIHBhdGhzIG9uIGJyZWFrcG9pbnQKLVBEZWJ1Z1ByZWZlcmVuY2VQYWdlLmRlZmF1bHQzPURpc3BsYXkgYnJlYWtwb2ludCBzZXQKLVBEZWJ1Z1ByZWZlcmVuY2VQYWdlLnJlZ2lzdGVyUHJvY2Vzcz1SZWdpc3RlciBwcm9jZXNzIDAgYnkgZGVmYXVsdAotUERlYnVnUHJlZmVyZW5jZVBhZ2Uud2FybmluZ1RpdGxlMT1XYXJuaW5nCi1QRGVidWdQcmVmZXJlbmNlUGFnZS53YXJuaW5nMT1BdXRvbWF0aWMgc3dpdGNoaW5nIHRvIHRoZSBQVFAgRGVidWcgUHJlc3BlY3RpdmUgd2lsbCBiZSBkaXNhYmxlZCBpZiB0aGlzIG9wdGlvbiBpcyB1bmNoZWNrZWQgCi0KLVBEZWJ1Z1ByZWZlcmVuY2VQYWdlLmNvbW11bmljYXRpb25fZ3JvdXA9Q29tbXVuaWNhdGlvbgotUERlYnVnUHJlZmVyZW5jZVBhZ2UuY29tbWFuZF90aW1lb3V0PSZDb21tYW5kIHRpbWVvdXQgKG1zKToKLVBEZWJ1Z1ByZWZlcmVuY2VQYWdlLnRpbWVvdXRFcnJvcj1UaGUgdmFsaWQgdmFsdWUgcmFuZ2UgaXMgW3swfSx7MX1dLgotCi1QRGVidWdQcmVmZXJlbmNlUGFnZS52YXJpYWJsZV9ncm91cD1WYXJpYWJsZQotCi1QRGVidWdQcmVmZXJlbmNlUGFnZS51cGRhdGVWYXJpYWJsZU9uU3VzcGVuZD1UaGUgZGVidWdnZXIgaXMgc3VzcGVuZGVkCi1QRGVidWdQcmVmZXJlbmNlUGFnZS51cGRhdGVWYXJpYWJsZU9uQ2hhbmdlPUpvYiBvciBTZXQgaXMgY2hhbmdlZApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJvcGVydHlwYWdlcy9QQnJlYWtwb2ludFByZWZlcmVuY2VTdG9yZS5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJvcGVydHlwYWdlcy9QQnJlYWtwb2ludFByZWZlcmVuY2VTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGY3NWUxLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3Byb3BlcnR5cGFnZXMvUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnByb3BlcnR5cGFnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVN0b3JlIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFTkFCTEVEID0gIkVOQUJMRUQiOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkRJVElPTiA9ICJDT05ESVRJT04iOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRV9DT1VOVCA9ICJJR05PUkVfQ09VTlQiOwotCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGlydHkgPSBmYWxzZTsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnM7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMyk7Ci0JCWxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI2NvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI2ZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWlmIChsaXN0ZW5lckFycmF5Lmxlbmd0aCA+IDAgJiYgKG9sZFZhbHVlID09IG51bGwgfHwgIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHBlID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgbmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckFycmF5Lmxlbmd0aDsgKytpKSB7Ci0JCQkJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCA9IChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcilsaXN0ZW5lckFycmF5W2ldOwotCQkJCWwucHJvcGVydHlDaGFuZ2UocGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI2dldEJvb2xlYW4oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0JCU9iamVjdCBiID0gcHJvcGVydGllcy5nZXQobmFtZSk7Ci0JCWlmIChiIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJcmV0dXJuICgoQm9vbGVhbiliKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRCb29sZWFuKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0RG91YmxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXREZWZhdWx0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0RmxvYXQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0SW50KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0TG9uZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXREb3VibGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjZ2V0RmxvYXQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI2dldEludChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7Ci0JCU9iamVjdCBpID0gcHJvcGVydGllcy5nZXQobmFtZSk7Ci0JCWlmIChpIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJcmV0dXJuICgoSW50ZWdlcilpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNnZXRMb25nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjZ2V0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJT2JqZWN0IHN0ciA9IHByb3BlcnRpZXMuZ2V0KG5hbWUpOwotCQlpZiAoc3RyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZXR1cm4gKFN0cmluZylzdHI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI2lzRGVmYXVsdChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI25lZWRzU2F2aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1NhdmluZygpIHsKLQkJcmV0dXJuIGlzRGlydHk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3B1dFZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChuYW1lKTsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXByb3BlcnRpZXMucHV0KG5hbWUsIG5ld1ZhbHVlKTsKLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KGphdmEubGFuZy5TdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHt9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoamF2YS5sYW5nLlN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHt9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChqYXZhLmxhbmcuU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHt9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE9iamVjdCkge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHt9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3NldFRvRGVmYXVsdChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZywgZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHt9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkge30KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgbmV3VmFsdWUpIHsKLQkJaW50IG9sZFZhbHVlID0gZ2V0SW50KG5hbWUpOwotCQlpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCXByb3BlcnRpZXMucHV0KG5hbWUsIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSApOwotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBuZXcgSW50ZWdlcihvbGRWYWx1ZSksIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkge30KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJT2JqZWN0IG9sZFZhbHVlID0gcHJvcGVydGllcy5nZXQobmFtZSk7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsIHx8ICFvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQlwcm9wZXJ0aWVzLnB1dChuYW1lLCBuZXdWYWx1ZSk7Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlib29sZWFuIG9sZFZhbHVlID0gZ2V0Qm9vbGVhbihuYW1lKTsKLQkJaWYgKG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQlwcm9wZXJ0aWVzLnB1dChuYW1lLCBuZXcgQm9vbGVhbihuZXdWYWx1ZSkpOwotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBuZXcgQm9vbGVhbihvbGRWYWx1ZSksIG5ldyBCb29sZWFuKG5ld1ZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQkvKiogU2V0IERpcnR5Ci0JICogQHBhcmFtIGlzRGlydHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREaXJ0eShib29sZWFuIGlzRGlydHkpIHsKLQkJdGhpcy5pc0RpcnR5ID0gaXNEaXJ0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcm9wZXJ0eXBhZ2VzL1BCcmVha3BvaW50UHJvcGVydHlQYWdlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcm9wZXJ0eXBhZ2VzL1BCcmVha3BvaW50UHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGJiMzQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJvcGVydHlwYWdlcy9QQnJlYWtwb2ludFByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkucHJvcGVydHlwYWdlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEFkZHJlc3NCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEZ1bmN0aW9uQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFdhdGNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlVJRGVidWdNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQgY2h1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBCcmVha3BvaW50UHJvcGVydHlQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCWNsYXNzIEJyZWFrcG9pbnRJbnRlZ2VyRmllbGRFZGl0b3IgZXh0ZW5kcyBJbnRlZ2VyRmllbGRFZGl0b3IgewotCQkvKiogQ29uc3RydWN0b3IKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHBhcmFtIGxhYmVsVGV4dAotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqLwotCQlwdWJsaWMgQnJlYWtwb2ludEludGVnZXJGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOwotCQkJc2V0RXJyb3JNZXNzYWdlKFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMCIpKTsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvciNjaGVja1N0YXRlKCkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RhdGUoKSB7Ci0JCQlUZXh0IGNvbnRyb2wgPSBnZXRUZXh0Q29udHJvbCgpOwotCQkJaWYgKCFjb250cm9sLmlzRW5hYmxlZCgpKSB7Ci0JCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jaGVja1N0YXRlKCk7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjcmVmcmVzaFZhbGlkU3RhdGUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZhbGlkU3RhdGUoKSB7Ci0JCQlzdXBlci5yZWZyZXNoVmFsaWRTdGF0ZSgpOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2RvU3RvcmUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsKLQkJCVRleHQgdGV4dCA9IGdldFRleHRDb250cm9sKCk7Ci0JCQlpZiAodGV4dC5pc0VuYWJsZWQoKSkgewotCQkJCXN1cGVyLmRvU3RvcmUoKTsKLQkJCX0KLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNjbGVhckVycm9yTWVzc2FnZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpIHsKLQkJCWlmIChnZXRQYWdlKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0UGFnZSgpLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJaWYgKGdldEVycm9yTWVzc2FnZSgpLmVxdWFscyhtZXNzYWdlKSkgewotCQkJCQkJc3VwZXIuY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1cGVyLmNsZWFyRXJyb3JNZXNzYWdlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWNsYXNzIEJyZWFrcG9pbnRTdHJpbmdGaWVsZEVkaXRvciBleHRlbmRzIFN0cmluZ0ZpZWxkRWRpdG9yIHsKLQkJLyoqIENvbnN0cnVjdG9yCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIEJyZWFrcG9pbnRTdHJpbmdGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yI2NoZWNrU3RhdGUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTdGF0ZSgpIHsKLQkJCVRleHQgY29udHJvbCA9IGdldFRleHRDb250cm9sKCk7Ci0JCQlpZiAoIWNvbnRyb2wuaXNFbmFibGVkKCkpIHsKLQkJCQljbGVhckVycm9yTWVzc2FnZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNoZWNrU3RhdGUoKTsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvciNkb1N0b3JlKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRvU3RvcmUoKSB7Ci0JCQlUZXh0IHRleHQgPSBnZXRUZXh0Q29udHJvbCgpOwotCQkJaWYgKHRleHQuaXNFbmFibGVkKCkpIHsKLQkJCQlzdXBlci5kb1N0b3JlKCk7Ci0JCQl9Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjcmVmcmVzaFZhbGlkU3RhdGUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZhbGlkU3RhdGUoKSB7Ci0JCQlzdXBlci5yZWZyZXNoVmFsaWRTdGF0ZSgpOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2NsZWFyRXJyb3JNZXNzYWdlKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNsZWFyRXJyb3JNZXNzYWdlKCkgewotCQkJaWYgKGdldFBhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRQYWdlKCkuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkuZXF1YWxzKG1lc3NhZ2UpKSB7Ci0JCQkJCQlzdXBlci5jbGVhckVycm9yTWVzc2FnZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3VwZXIuY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JY2xhc3MgTGFiZWxGaWVsZEVkaXRvciBleHRlbmRzIEZpZWxkRWRpdG9yIHsKLQkJcHJpdmF0ZSBMYWJlbCB0aXRsZUxhYmVsOwotCQlwcml2YXRlIExhYmVsIHZhbHVlTGFiZWw7Ci0JCXByaXZhdGUgQ29tcG9zaXRlIGJhc2ljQ29tcG9zaXRlOwotCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkJcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQkJLyoqIENvbnN0cnVjdG9yCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSB2YWx1ZQotCQkgKi8KLQkJcHVibGljIExhYmVsRmllbGRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgdmFsdWUpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJCXRoaXMuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2FkanVzdEZvck51bUNvbHVtbnMoaW50KQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgYWRqdXN0Rm9yTnVtQ29sdW1ucyhpbnQgbnVtQ29sdW1ucykgewotCQkJKChHcmlkRGF0YSkgYmFzaWNDb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZG9GaWxsSW50b0dyaWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkb0ZpbGxJbnRvR3JpZChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQkJYmFzaWNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJYmFzaWNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQliYXNpY0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJdGl0bGVMYWJlbCA9IG5ldyBMYWJlbChiYXNpY0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJdGl0bGVMYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCQl0aXRsZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJdmFsdWVMYWJlbCA9IG5ldyBMYWJlbChiYXNpY0NvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJdmFsdWVMYWJlbC5zZXRUZXh0KHZhbHVlKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2dldE51bWJlck9mQ29udHJvbHMoKQotCQkgKi8KLQkJcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3IjZG9Mb2FkKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRvTG9hZCgpIHt9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2RvTG9hZERlZmF1bHQoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9Mb2FkRGVmYXVsdCgpIHt9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yI2RvU3RvcmUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHt9Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuRmllbGRFZGl0b3IgZW5hYmxlZDsKLQlwcml2YXRlIEJyZWFrcG9pbnRTdHJpbmdGaWVsZEVkaXRvciBjb25kaXRpb247Ci0JcHJpdmF0ZSBUZXh0IGlnbm9yZUNvdW50VGV4dENvbnRyb2w7Ci0JcHJpdmF0ZSBCcmVha3BvaW50SW50ZWdlckZpZWxkRWRpdG9yIGlnbm9yZUNvdW50OwotCXByaXZhdGUgSUFkYXB0YWJsZSBlbGVtZW50OwotCXByaXZhdGUgUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUgcEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmU7Ci0JcHJpdmF0ZSBVSURlYnVnTWFuYWdlciB1aURlYnVnTWFuYWdlciA9IG51bGw7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQl1aURlYnVnTWFuYWdlciA9IFBUUERlYnVnVUlQbHVnaW4uZ2V0VUlEZWJ1Z01hbmFnZXIoKTsKLQkJcEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUgPSBuZXcgUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlI2NyZWF0ZUZpZWxkRWRpdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotCQlJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IGdldEJyZWFrcG9pbnQoKTsKLQkJdHJ5IHsKLQkJCWNyZWF0ZVR5cGVTcGVjaWZpY0xhYmVsRmllbGRFZGl0b3JzKGJyZWFrcG9pbnQpOwotCQkJY3JlYXRlRW5hYmxlZEZpZWxkKGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJU3RyaW5nIGNvbmRpdGlvbiA9IGJyZWFrcG9pbnQuZ2V0Q29uZGl0aW9uKCk7Ci0JCQlpZiAoY29uZGl0aW9uID09IG51bGwpIHsKLQkJCQljb25kaXRpb24gPSAiIjsKLQkJCX0KLQkJCXN0b3JlLnNldFZhbHVlKFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLkNPTkRJVElPTiwgY29uZGl0aW9uKTsKLQkJCWNyZWF0ZUNvbmRpdGlvbkVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJCXN0b3JlLnNldFZhbHVlKFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLkVOQUJMRUQsIGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpOwotCQkJaW50IGlnbm9yZUNvdW50ID0gYnJlYWtwb2ludC5nZXRJZ25vcmVDb3VudCgpOwotCQkJc3RvcmUuc2V0VmFsdWUoUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUuSUdOT1JFX0NPVU5ULCAoaWdub3JlQ291bnQgPj0gMCkgPyBpZ25vcmVDb3VudCA6IDApOwotCQkJY3JlYXRlSWdub3JlQ291bnRFZGl0b3IoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVBUUERlYnVnVUlQbHVnaW4uZXJyb3JEaWFsb2coZ2V0U2hlbGwoKSwgIkJyZWFrcG9pbnQgUHJvcGVydHkgUGFnZSIsICIiLCBjZSk7Ci0JCX0KLQl9Ci0JLyoqIENyZWF0ZSB0eXBlIHNwZWNpZmljIGxhYmxlIGZpZWxkIGVkaXRvcnMKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlU3BlY2lmaWNMYWJlbEZpZWxkRWRpdG9ycyhJUEJyZWFrcG9pbnQgYnJlYWtwb2ludCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQRnVuY3Rpb25CcmVha3BvaW50KSB7Ci0JCQlJUEZ1bmN0aW9uQnJlYWtwb2ludCBmdW5jQnB0ID0gKElQRnVuY3Rpb25CcmVha3BvaW50KSBicmVha3BvaW50OwotCQkJYWRkRmllbGQoY3JlYXRlTGFiZWxFZGl0b3IoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgUHJvcGVydHlQYWdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQQnJlYWtwb2ludFByb3BlcnR5UGFnZS4xOCIpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjMiKSkpOwotCQkJU3RyaW5nIGZ1bmN0aW9uID0gZnVuY0JwdC5nZXRGdW5jdGlvbigpOwotCQkJaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKLQkJCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjIiKSwgZnVuY3Rpb24pKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSVBBZGRyZXNzQnJlYWtwb2ludCkgewotCQkJSVBBZGRyZXNzQnJlYWtwb2ludCBhZGRyQnB0ID0gKElQQWRkcmVzc0JyZWFrcG9pbnQpIGJyZWFrcG9pbnQ7Ci0JCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE4IiksIFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuNiIpKSk7Ci0JCQlTdHJpbmcgYWRkcmVzcyA9IGFkZHJCcHQuZ2V0QWRkcmVzcygpOwotCQkJaWYgKGFkZHJlc3MgIT0gbnVsbCkgewotCQkJCWFkZEZpZWxkKGNyZWF0ZUxhYmVsRWRpdG9yKGdldEZpZWxkRWRpdG9yUGFyZW50KCksIFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuNSIpLCBhZGRyZXNzKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElQV2F0Y2hwb2ludCkgewotCQkJSVBXYXRjaHBvaW50IHdhdGNocG9pbnQgPSAoSVBXYXRjaHBvaW50KSBicmVha3BvaW50OwotCQkJU3RyaW5nIHR5cGUgPSAiIjsKLQkJCWlmICh3YXRjaHBvaW50LmlzUmVhZFR5cGUoKSAmJiAhd2F0Y2hwb2ludC5pc1dyaXRlVHlwZSgpKQotCQkJCXR5cGUgPSBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjExIik7Ci0JCQllbHNlIGlmICghd2F0Y2hwb2ludC5pc1JlYWRUeXBlKCkgJiYgd2F0Y2hwb2ludC5pc1dyaXRlVHlwZSgpKQotCQkJCXR5cGUgPSBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjEyIik7Ci0JCQllbHNlCi0JCQkJdHlwZSA9IFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTMiKTsKLQotCQkJU3RyaW5nIGV4cHJlc3Npb24gPSB3YXRjaHBvaW50LmdldEV4cHJlc3Npb24oKTsKLQkJCWFkZEZpZWxkKGNyZWF0ZUxhYmVsRWRpdG9yKGdldEZpZWxkRWRpdG9yUGFyZW50KCksIFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTgiKSwgdHlwZSkpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gYnJlYWtwb2ludC5nZXRNYXJrZXIoKS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwpIHsKLQkJCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjEwIiksIHByb2plY3ROYW1lKSk7Ci0JCQl9Ci0JCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE0IiksIGV4cHJlc3Npb24pKTsKLQkJfSBlbHNlIGlmIChicmVha3BvaW50IGluc3RhbmNlb2YgSUxpbmVCcmVha3BvaW50KSB7Ci0JCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE4IiksIFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuOCIpKSk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBicmVha3BvaW50LmdldFNvdXJjZUhhbmRsZSgpOwotCQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjciKSwgZmlsZU5hbWUpKTsKLQkJCX0KLQkJCUlMaW5lQnJlYWtwb2ludCBsaW5lQnB0ID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCWludCBsaW5lTnVtYmVyID0gbGluZUJwdC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQlpZiAobGluZU51bWJlciA+IDApIHsKLQkJCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjkiKSwgU3RyaW5nLnZhbHVlT2YobGluZU51bWJlcikpKTsKLQkJCX0KLQkJfQotCQkvLyBTZXQKLQkJU3RyaW5nIGpvYl9pZCA9IGJyZWFrcG9pbnQuZ2V0Sm9iSWQoKTsKLQkJU3RyaW5nIGpvYk5hbWUgPSBicmVha3BvaW50LmdldEpvYk5hbWUoKTsKLQkJYWRkRmllbGQoY3JlYXRlTGFiZWxFZGl0b3IoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgUHJvcGVydHlQYWdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQQnJlYWtwb2ludFByb3BlcnR5UGFnZS4yMCIpLCBqb2JOYW1lKSk7Ci0JCVN0cmluZyBzZXRfaWQgPSBicmVha3BvaW50LmdldFNldElkKCk7Ci0JCWFkZEZpZWxkKGNyZWF0ZUxhYmVsRWRpdG9yKGdldEZpZWxkRWRpdG9yUGFyZW50KCksIFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMjEiKSwgc2V0X2lkKSk7Ci0JCS8vc2hvdyB0b3RhbCBudW1iZXIgb2YgcHJvY2Vzc2VzCi0JCWlmICgham9iX2lkLmVxdWFscyhJUEJyZWFrcG9pbnQuR0xPQkFMKSkgewotCQkJSUVsZW1lbnRIYW5kbGVyIHNldE1hbmFnZXIgPSB1aURlYnVnTWFuYWdlci5nZXRFbGVtZW50SGFuZGxlcihqb2JfaWQpOwotCQkJSUVsZW1lbnRTZXQgZWxlbWVudFNldCA9IChJRWxlbWVudFNldClzZXRNYW5hZ2VyLmdldEVsZW1lbnRCeUlEKHNldF9pZCk7Ci0JCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjIyIiksIFN0cmluZy52YWx1ZU9mKGVsZW1lbnRTZXQuc2l6ZSgpKSkpOwotCQkJU3RyaW5nW10gc2V0TmFtZXMgPSBlbGVtZW50U2V0LmdldE1hdGNoU2V0SURzKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNldE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChzZXROYW1lc1tpXSk7Ci0JCQkJaWYgKGkgPCBzZXROYW1lcy5sZW5ndGggLSAxKQotCQkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ci0JCQl9Ci0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkKLQkJCQlhZGRGaWVsZChjcmVhdGVMYWJlbEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjIzIiksIGJ1ZmZlci50b1N0cmluZygpKSk7Ci0JCX0KLQl9Ci0JLyoqIENyZWF0ZSBlbmFibGVkIGZpZWxkCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuYWJsZWRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWVuYWJsZWQgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLkVOQUJMRUQsIFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTkiKSwgcGFyZW50KTsKLQkJYWRkRmllbGQoZW5hYmxlZCk7Ci0JfQotCS8qKiBDcmVhdGUgY29uZGl0aW9uIGZpZWxkCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbmRpdGlvbkVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbmRpdGlvbiA9IG5ldyBCcmVha3BvaW50U3RyaW5nRmllbGRFZGl0b3IoUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUuQ09ORElUSU9OLCBQcm9wZXJ0eVBhZ2VNZXNzYWdlcy5nZXRTdHJpbmcoIlBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE1IiksIHBhcmVudCk7Ci0JCWNvbmRpdGlvbi5zZXRFbXB0eVN0cmluZ0FsbG93ZWQodHJ1ZSk7Ci0JCWNvbmRpdGlvbi5zZXRFcnJvck1lc3NhZ2UoUHJvcGVydHlQYWdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQQnJlYWtwb2ludFByb3BlcnR5UGFnZS4xNiIpKTsKLQkJYWRkRmllbGQoY29uZGl0aW9uKTsKLQl9Ci0JLyoqIENyZWF0ZSBpZ25vcmUgY291bnQgZmllbGQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSWdub3JlQ291bnRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZ25vcmVDb3VudCA9IG5ldyBCcmVha3BvaW50SW50ZWdlckZpZWxkRWRpdG9yKFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLklHTk9SRV9DT1VOVCwgUHJvcGVydHlQYWdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQQnJlYWtwb2ludFByb3BlcnR5UGFnZS4xNyIpLCBwYXJlbnQpOwotCQlpZ25vcmVDb3VudC5zZXRWYWxpZFJhbmdlKDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJaWdub3JlQ291bnRUZXh0Q29udHJvbCA9IGlnbm9yZUNvdW50LmdldFRleHRDb250cm9sKHBhcmVudCk7Ci0JCXRyeSB7Ci0JCQlpZ25vcmVDb3VudFRleHRDb250cm9sLnNldEVuYWJsZWQoZ2V0QnJlYWtwb2ludCgpLmdldElnbm9yZUNvdW50KCkgPj0gMCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVBUUERlYnVnVUlQbHVnaW4ubG9nKGNlKTsKLQkJfQotCQlhZGRGaWVsZChpZ25vcmVDb3VudCk7Ci0JfQotCS8qKiBDcmVhdGUgbGFiZWwgZmllbGQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBGaWVsZEVkaXRvciBjcmVhdGVMYWJlbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IExhYmVsRmllbGRFZGl0b3IocGFyZW50LCB0aXRsZSwgdmFsdWUpOwotCX0KLQkvKiogR2V0IGJyZWFrcG9pbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQQnJlYWtwb2ludCBnZXRCcmVha3BvaW50KCkgewotCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIElQQnJlYWtwb2ludCkgPyAoSVBCcmVha3BvaW50KSBlbGVtZW50IDogbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZSNnZXRFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZSNzZXRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBwQnJlYWtwb2ludFByZWZlcmVuY2VTdG9yZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjaGFuZ2VkUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPig1KTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJY2hhbmdlZFByb3BlcnRpZXMuYWRkKGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJfQotCQl9KTsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJc2V0QnJlYWtwb2ludFByb3BlcnRpZXMoY2hhbmdlZFByb3BlcnRpZXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKiogU2V0IGJyZWFrcG9pbnQgcHJvcGVydGllcwotCSAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJyZWFrcG9pbnRQcm9wZXJ0aWVzKGZpbmFsIExpc3Q8U3RyaW5nPiBjaGFuZ2VkUHJvcGVydGllcykgewotCQlJV29ya3NwYWNlUnVubmFibGUgd3IgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUlQQnJlYWtwb2ludCBicmVha3BvaW50ID0gZ2V0QnJlYWtwb2ludCgpOwotCQkJCUl0ZXJhdG9yPFN0cmluZz4gY2hhbmdlZCA9IGNoYW5nZWRQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGNoYW5nZWQuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIGNoYW5nZWQubmV4dCgpOwotCQkJCQlpZiAocHJvcGVydHkuZXF1YWxzKFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLkVOQUJMRUQpKSB7Ci0JCQkJCQlicmVha3BvaW50LnNldEVuYWJsZWQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihQQnJlYWtwb2ludFByZWZlcmVuY2VTdG9yZS5FTkFCTEVEKSk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLklHTk9SRV9DT1VOVCkpIHsKLQkJCQkJCWJyZWFrcG9pbnQuc2V0SWdub3JlQ291bnQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KFBCcmVha3BvaW50UHJlZmVyZW5jZVN0b3JlLklHTk9SRV9DT1VOVCkpOwotCQkJCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhQQnJlYWtwb2ludFByZWZlcmVuY2VTdG9yZS5DT05ESVRJT04pKSB7Ci0JCQkJCQlicmVha3BvaW50LnNldENvbmRpdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoUEJyZWFrcG9pbnRQcmVmZXJlbmNlU3RvcmUuQ09ORElUSU9OKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdyLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJUFRQRGVidWdVSVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJvcGVydHlwYWdlcy9Qcm9wZXJ0eVBhZ2VNZXNzYWdlcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvcHJvcGVydHlwYWdlcy9Qcm9wZXJ0eVBhZ2VNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjczNzE3Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3Byb3BlcnR5cGFnZXMvUHJvcGVydHlQYWdlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnByb3BlcnR5cGFnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5UGFnZU1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnByb3BlcnR5cGFnZXMuUHJvcGVydHlQYWdlTWVzc2FnZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQkvKiogQ29uc3RydWN0b3IKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5UGFnZU1lc3NhZ2VzKCkge30KLQotCS8qKiBHZXQgc3RyaW5nCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3Byb3BlcnR5cGFnZXMvUHJvcGVydHlQYWdlTWVzc2FnZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3Byb3BlcnR5cGFnZXMvUHJvcGVydHlQYWdlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0MDAyNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcm9wZXJ0eXBhZ2VzL1Byb3BlcnR5UGFnZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAjIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAjIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAjIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAjIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICMgCi0gIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICMgCi0gIyBMQS1DQyAwNC0xMTUKLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotICMgQGF1dGhvciBDbGVtZW50Ci0gIwotICMjCi1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS4wPUlnbm9yZSBjb3VudCBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlcgotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMT1Ob3QgYXZhaWxhYmxlCi1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS4yPUZ1bmN0aW9uIG5hbWU6IAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMz1QVFAgZnVuY3Rpb24gYnJlYWtwb2ludAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuND1Ob3QgYXZhaWxhYmxlCi1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS41PUFkZHJlc3M6IAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuNj1QVFAgYWRkcmVzcyBicmVha3BvaW50Ci1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS43PUZpbGU6IAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuOD1QVFAgbGluZSBicmVha3BvaW50Ci1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS45PUxpbmUgbnVtYmVyOiAKLVBCcmVha3BvaW50UHJvcGVydHlQYWdlLjEwPVByb2plY3Q6IAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTE9UFRQIHJlYWQgd2F0Y2hwb2ludAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTI9UFRQIHdhdGNocG9pbnQKLVBCcmVha3BvaW50UHJvcGVydHlQYWdlLjEzPVBUUCBhY2Nlc3Mgd2F0Y2hwb2ludAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTQ9RXhwcmVzc2lvbiB0byB3YXRjaDoKLVBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE1PSZDb25kaXRpb246Ci1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS4xNj1JbnZhbGlkIGNvbmRpdGlvbi4KLVBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE3PSZJZ25vcmUgY291bnQ6IAotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMTg9VHlwZToKLVBCcmVha3BvaW50UHJvcGVydHlQYWdlLjE5PUVuYWJsZWQKLVBCcmVha3BvaW50UHJvcGVydHlQYWdlLjIwPUpvYiBuYW1lOgotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMjE9Q3JlYXRlZCBpbiBzZXQ6Ci1QQnJlYWtwb2ludFByb3BlcnR5UGFnZS4yMj1Ub3RhbCBudW1iZXIgb2YgcHJvY2Vzc2VzOgotUEJyZWFrcG9pbnRQcm9wZXJ0eVBhZ2UuMjM9UmVsYXRlZCBzZXRzOgotCi1UaHJlYWRGaWx0ZXJFZGl0b3IuMD0mUmVzdHJpY3QgdG8gU2VsZWN0ZWQgVGFyZ2V0cyBhbmQgVGhyZWFkczoKLQotU2lnbmFsUHJvcGVydHlQYWdlLjA9RGVzY3JpcHRpb246IHswfS4KLVNpZ25hbFByb3BlcnR5UGFnZS4xPVBhc3MgdGhpcyBzaWduYWwgdG8gdGhlIHByb2dyYW0uCi1TaWduYWxQcm9wZXJ0eVBhZ2UuMj1TdXNwZW5kIHRoZSBwcm9ncmFtIHdoZW4gdGhpcyBzaWduYWwgaGFwcGVucy4KLVNpZ25hbFByb3BlcnR5UGFnZS40PU9wZXJhdGlvbiBmYWlsZWQuCi1TaWduYWxQcm9wZXJ0eVBhZ2UuNT1VbmFibGUgdG8gY2hhbmdlIHNpZ25hbCdzIHByb3BlcnRpZXMuCi0KLU1vZHVsZVByb3BlcnR5UGFnZS4wPVR5cGU6Ci1Nb2R1bGVQcm9wZXJ0eVBhZ2UuMT1leGVjdXRhYmxlCi1Nb2R1bGVQcm9wZXJ0eVBhZ2UuMj1zaGFyZWQgbGlicmFyeQotTW9kdWxlUHJvcGVydHlQYWdlLjM9Y29yZSBmaWxlCi1Nb2R1bGVQcm9wZXJ0eVBhZ2UuMz1Ccm93c2UuLi4KLU1vZHVsZVByb3BlcnR5UGFnZS40PUNQVToKLU1vZHVsZVByb3BlcnR5UGFnZS41PW5vdCBhdmFpbGFibGUKLU1vZHVsZVByb3BlcnR5UGFnZS42PUJhc2UgYWRkcmVzczoKLU1vZHVsZVByb3BlcnR5UGFnZS43PW5vdCBhdmFpbGFibGUKLU1vZHVsZVByb3BlcnR5UGFnZS44PVNpemU6Ci1Nb2R1bGVQcm9wZXJ0eVBhZ2UuOT1ub3QgYXZhaWxhYmxlCi1Nb2R1bGVQcm9wZXJ0eVBhZ2UuMTA9U3ltYm9sczoKLU1vZHVsZVByb3BlcnR5UGFnZS4xMT1sb2FkZWQKLU1vZHVsZVByb3BlcnR5UGFnZS4xMj1ub3QgbG9hZGVkCi1Nb2R1bGVQcm9wZXJ0eVBhZ2UuMTM9U3ltYm9scyBmaWxlOgotTW9kdWxlUHJvcGVydHlQYWdlLjE0PW5vdCBmb3VuZAotTW9kdWxlUHJvcGVydHlQYWdlLjE1PUVycm9yCi1Nb2R1bGVQcm9wZXJ0eVBhZ2UuMTU9VW5hYmxlIHRvIGxvYWQgc3ltYm9scy4KLU1vZHVsZVByb3BlcnR5UGFnZS4xNj1VbmFibGUgdG8gbG9hZCBzeW1ib2xzLgotTW9kdWxlUHJvcGVydHlQYWdlLjE2PW5vdCBhdmFpbGFibGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3Byb3BlcnR5cGFnZXMvU2lnbmFsUHJvcGVydHlQYWdlLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9wcm9wZXJ0eXBhZ2VzL1NpZ25hbFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNhNjBiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3Byb3BlcnR5cGFnZXMvU2lnbmFsUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5wcm9wZXJ0eXBhZ2VzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuUERlYnVnVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmRpYWxvZ2ZpZWxkcy5TZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudAotICovCi0KLXB1YmxpYyBjbGFzcyBTaWduYWxQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQgZlBhc3NCdXR0b247Ci0JcHJpdmF0ZSBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZCBmU3RvcEJ1dHRvbjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gQ3JlYXRlIGRlc2NyaXB0aW9uIGZpZWxkCi0JCXRyeSB7Ci0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRTaWduYWwoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiU2lnbmFsUHJvcGVydHlQYWdlLjAiKSwgbmV3IE9iamVjdFtdIHsgZGVzY3JpcHRpb24gfSkpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsYWJlbC5zZXRGb250KGZvbnQpOwotCQl9Ci0JCWNhdGNoKERlYnVnRXhjZXB0aW9uIGUxKSB7Ci0JCX0KLQotCQkvLyBDcmVhdGUgcGFzcyBidXR0b24KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gcGFzcyA9IGdldFNpZ25hbCgpLmlzUGFzc0VuYWJsZWQoKTsKLQkJCWZQYXNzQnV0dG9uID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5DSEVDSyk7Ci0JCQlmUGFzc0J1dHRvbi5zZXRMYWJlbFRleHQoUHJvcGVydHlQYWdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaWduYWxQcm9wZXJ0eVBhZ2UuMSIpKTsKLQkJCWZQYXNzQnV0dG9uLnNldFNlbGVjdGlvbihwYXNzKTsKLQkJCWZQYXNzQnV0dG9uLnNldEVuYWJsZWQoZ2V0U2lnbmFsKCkuY2FuTW9kaWZ5KCkpOwotCQkJZlBhc3NCdXR0b24uZG9GaWxsSW50b0dyaWQoY29tcG9zaXRlLCAxKTsKLQkJfQotCQljYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQkvLyBDcmVhdGUgc3RvcCBidXR0b24KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gc3RvcCA9IGdldFNpZ25hbCgpLmlzU3RvcEVuYWJsZWQoKTsKLQkJCWZTdG9wQnV0dG9uID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5DSEVDSyk7Ci0JCQlmU3RvcEJ1dHRvbi5zZXRMYWJlbFRleHQoUHJvcGVydHlQYWdlTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaWduYWxQcm9wZXJ0eVBhZ2UuMiIpKTsKLQkJCWZTdG9wQnV0dG9uLnNldFNlbGVjdGlvbihzdG9wKTsKLQkJCWZTdG9wQnV0dG9uLnNldEVuYWJsZWQoZ2V0U2lnbmFsKCkuY2FuTW9kaWZ5KCkpOwotCQkJZlN0b3BCdXR0b24uZG9GaWxsSW50b0dyaWQoY29tcG9zaXRlLCAxKTsKLQkJfQotCQljYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlzZXRWYWxpZCh0cnVlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQgZ2V0UGFzc0J1dHRvbigpIHsKLQkJcmV0dXJuIGZQYXNzQnV0dG9uOwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZCBnZXRTdG9wQnV0dG9uKCkgewotCQlyZXR1cm4gZlN0b3BCdXR0b247Ci0JfQotCi0JcHVibGljIElQU2lnbmFsIGdldFNpZ25hbCgpIHsKLQkJcmV0dXJuIChJUFNpZ25hbClnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIWdldFNpZ25hbCgpLmNhbk1vZGlmeSgpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJaWYgKGdldFBhc3NCdXR0b24oKSAhPSBudWxsKSB7IAotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZ2V0U2lnbmFsKCkuc2V0UGFzc0VuYWJsZWQoZ2V0UGFzc0J1dHRvbigpLmlzU2VsZWN0ZWQoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2goRGVidWdFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJZmFpbGVkKFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiU2lnbmFsUHJvcGVydHlQYWdlLjUiKSwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGdldFN0b3BCdXR0b24oKSAhPSBudWxsKSB7IAotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZ2V0U2lnbmFsKCkuc2V0U3RvcEVuYWJsZWQoZ2V0U3RvcEJ1dHRvbigpLmlzU2VsZWN0ZWQoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2goRGVidWdFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJZmFpbGVkKFByb3BlcnR5UGFnZU1lc3NhZ2VzLmdldFN0cmluZygiU2lnbmFsUHJvcGVydHlQYWdlLjUiKSwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmFpbGVkKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhQRGVidWdNb2RlbC5nZXRQbHVnaW5JZGVudGlmaWVyKCksIElQRGVidWdDb25zdGFudHMuU1RBVFVTX0NPREVfRVJST1IsIG1lc3NhZ2UsIG51bGwpOwotCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQRGVidWdNb2RlbC5nZXRQbHVnaW5JZGVudGlmaWVyKCksIElQRGVidWdDb25zdGFudHMuU1RBVFVTX0NPREVfRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBudWxsKSk7Ci0JCVBEZWJ1Z1V0aWxzLmVycm9yKG1zLCBnZXRTaWduYWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvc291cmNlbG9va3VwL01hcHBpbmdTb3VyY2VDb250YWluZXJCcm93c2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9zb3VyY2Vsb29rdXAvTWFwcGluZ1NvdXJjZUNvbnRhaW5lckJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzYTg5YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9zb3VyY2Vsb29rdXAvTWFwcGluZ1NvdXJjZUNvbnRhaW5lckJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cERpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5BYnN0cmFjdFNvdXJjZUNvbnRhaW5lckJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuTWFwcGluZ1NvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwaW5nU291cmNlQ29udGFpbmVyQnJvd3NlciBleHRlbmRzIEFic3RyYWN0U291cmNlQ29udGFpbmVyQnJvd3NlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkcgPSBTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiTWFwcGluZ1NvdXJjZUNvbnRhaW5lckJyb3dzZXIuMCIpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLkFic3RyYWN0U291cmNlQ29udGFpbmVyQnJvd3NlciNhZGRTb3VyY2VDb250YWluZXJzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwRGlyZWN0b3IpCi0JICovCi0JcHVibGljIElTb3VyY2VDb250YWluZXJbXSBhZGRTb3VyY2VDb250YWluZXJzKFNoZWxsIHNoZWxsLCBJU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IpIHsKLQkJcmV0dXJuIG5ldyBJU291cmNlQ29udGFpbmVyW10geyBuZXcgTWFwcGluZ1NvdXJjZUNvbnRhaW5lcihnZW5lcmF0ZU5hbWUoZGlyZWN0b3IpKSB9OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5BYnN0cmFjdFNvdXJjZUNvbnRhaW5lckJyb3dzZXIjY2FuQWRkU291cmNlQ29udGFpbmVycyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwRGlyZWN0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkU291cmNlQ29udGFpbmVycyhJU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLkFic3RyYWN0U291cmNlQ29udGFpbmVyQnJvd3NlciNjYW5FZGl0U291cmNlQ29udGFpbmVycyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwRGlyZWN0b3IsIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXJbXSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FZGl0U291cmNlQ29udGFpbmVycyhJU291cmNlTG9va3VwRGlyZWN0b3IgZGlyZWN0b3IsIElTb3VyY2VDb250YWluZXJbXSBjb250YWluZXJzKSB7Ci0JCXJldHVybiAoY29udGFpbmVycy5sZW5ndGggPT0gMSAmJiBjb250YWluZXJzWzBdIGluc3RhbmNlb2YgTWFwcGluZ1NvdXJjZUNvbnRhaW5lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLkFic3RyYWN0U291cmNlQ29udGFpbmVyQnJvd3NlciNlZGl0U291cmNlQ29udGFpbmVycyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUxvb2t1cERpcmVjdG9yLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyW10pCi0JICovCi0JcHVibGljIElTb3VyY2VDb250YWluZXJbXSBlZGl0U291cmNlQ29udGFpbmVycyhTaGVsbCBzaGVsbCwgSVNvdXJjZUxvb2t1cERpcmVjdG9yIGRpcmVjdG9yLCBJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVycykgewotCQlpZiAoY29udGFpbmVycy5sZW5ndGggPT0gMSAmJiBjb250YWluZXJzWzBdIGluc3RhbmNlb2YgTWFwcGluZ1NvdXJjZUNvbnRhaW5lcikgewotCQkJUGF0aE1hcHBpbmdEaWFsb2cgZGlhbG9nID0gbmV3IFBhdGhNYXBwaW5nRGlhbG9nKHNoZWxsLCAoTWFwcGluZ1NvdXJjZUNvbnRhaW5lciljb250YWluZXJzWzBdKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCXJldHVybiBuZXcgSVNvdXJjZUNvbnRhaW5lcltdIHsgZGlhbG9nLmdldE1hcHBpbmcoKSB9OwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSVNvdXJjZUNvbnRhaW5lclswXTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZW5lcmF0ZU5hbWUoSVNvdXJjZUxvb2t1cERpcmVjdG9yIGRpcmVjdG9yKSB7Ci0vLwkJaW50IGNvdW50ZXIgPSAxOwotLy8JCUlTb3VyY2VDb250YWluZXJbXSBjb250YWluZXJzID0gZGlyZWN0b3IuZ2V0U291cmNlQ29udGFpbmVycygpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7ICsraSkgewotLy8JCQlpZiAoTWFwcGluZ1NvdXJjZUNvbnRhaW5lci5UWVBFX0lELmVxdWFscyhjb250YWluZXJzW2ldLmdldFR5cGUoKS5nZXRJZCgpKSkgewotLy8JCQkJU3RyaW5nIG5hbWUgPSBjb250YWluZXJzW2ldLmdldE5hbWUoKTsgCi0vLwkJCQlpZiAobmFtZS5zdGFydHNXaXRoKE1BUFBJTkcpKSB7Ci0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJaW50IG51bWJlciA9IEludGVnZXIudmFsdWVPZihuYW1lLnN1YnN0cmluZyhNQVBQSU5HLmxlbmd0aCgpKSkuaW50VmFsdWUoKTsKLS8vCQkJCQkJaWYgKG51bWJlciA9PSBjb3VudGVyKQotLy8JCQkJCQkJKytjb3VudGVyOwotLy8JCQkJCX0KLS8vCQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gTUFQUElORyArIGNvdW50ZXI7Ci0JCXJldHVybiBNQVBQSU5HOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3NvdXJjZWxvb2t1cC9QYXRoTWFwcGluZ0RpYWxvZy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvc291cmNlbG9va3VwL1BhdGhNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjYzMmUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvc291cmNlbG9va3VwL1BhdGhNYXBwaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuc291cmNlbG9va3VwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuTWFwcGluZ1NvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwuY29yZS5zb3VyY2Vsb29rdXAuTWFwRW50cnlTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z0ltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGF0aE1hcHBpbmdEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCWNsYXNzIE1hcEVudHJ5RGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQkJcHJpdmF0ZSBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBmRW50cnk7Ci0JCXByb3RlY3RlZCBUZXh0IGZCYWNrZW5kUGF0aFRleHQ7Ci0JCXByb3RlY3RlZCBUZXh0IGZMb2NhbFBhdGhUZXh0OwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFwRW50cnlEaWFsb2cuCi0JCSAqLwotCQlwdWJsaWMgTWFwRW50cnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJCWZFbnRyeSA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0b3IgZm9yIE1hcEVudHJ5RGlhbG9nLgotCQkgKi8KLQkJcHVibGljIE1hcEVudHJ5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lciBlbnRyeSkgewotCQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQkJZkVudHJ5ID0gZW50cnk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJICovCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc2V0VGl0bGUoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjAiKSk7Ci0JCQkvL1RPRE8gY2hhbmdlIGltYWdlCi0JCQlzZXRUaXRsZUltYWdlKFBEZWJ1Z0ltYWdlLmdldEltYWdlKFBEZWJ1Z0ltYWdlLklDT05fUkVHSVNURVJfTk9STUFMKSk7Ci0KLQkJCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQkvL1BsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0U2hlbGwoKSwgSVBUUERlYnVnSGVscENvbnRleHRJZHMuU09VUkNFX1BBVEhfTUFQX0VOVFJZX0RJQUxPRyk7Ci0KLQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJbGFiZWwuc2V0VGV4dChTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiUGF0aE1hcHBpbmdEaWFsb2cuMSIpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxhYmVsLnNldEZvbnQoZm9udCk7Ci0JCQkKLQkJCWZCYWNrZW5kUGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZkJhY2tlbmRQYXRoVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJZkJhY2tlbmRQYXRoVGV4dC5zZXRGb250KGZvbnQpOwotCQkJZkJhY2tlbmRQYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCXVwZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJCWxhYmVsLnNldFRleHQoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjIiKSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsYWJlbC5zZXRGb250KGZvbnQpOwotCQkJCi0JCQlmTG9jYWxQYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZkxvY2FsUGF0aFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWZMb2NhbFBhdGhUZXh0LnNldEZvbnQoZm9udCk7Ci0JCQlmTG9jYWxQYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCXVwZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCWJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQkJYnV0dG9uLnNldFRleHQoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjMiKSk7Ci0JCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeyAKLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coTWFwRW50cnlEaWFsb2cudGhpcy5nZXRTaGVsbCgpKTsKLQkJCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQlmTG9jYWxQYXRoVGV4dC5zZXRUZXh0KHBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCQlpbml0aWFsaXplKCk7Ci0JCQl1cGRhdGUoKTsKLQkJCXJldHVybiBjb250cm9sOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCW5ld1NoZWxsLnNldFRleHQoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjQiKSk7Ci0JCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCWlmIChmRW50cnkgIT0gbnVsbCkgewotCQkJCWZCYWNrZW5kUGF0aFRleHQuc2V0VGV4dChmRW50cnkuZ2V0QmFja2VuZFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkJCWZMb2NhbFBhdGhUZXh0LnNldFRleHQoZkVudHJ5LmdldExvY2FsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCQlib29sZWFuIGlzT2sgPSB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJCUJ1dHRvbiBvayA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkJCWlmIChvayAhPSBudWxsKQotCQkJCW9rLnNldEVuYWJsZWQoaXNPayk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlTdHJpbmcgYmFja2VuZFRleHQgPSBmQmFja2VuZFBhdGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAoYmFja2VuZFRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNldEVycm9yTWVzc2FnZShTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiUGF0aE1hcHBpbmdEaWFsb2cuNSIpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIW5ldyBQYXRoKGJhY2tlbmRUZXh0KS5pc1ZhbGlkUGF0aChiYWNrZW5kVGV4dCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjYiKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJU3RyaW5nIGxvY2FsVGV4dCA9IGZMb2NhbFBhdGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAobG9jYWxUZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjciKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJRmlsZSBsb2NhbFBhdGggPSBuZXcgRmlsZShsb2NhbFRleHQpOwotCQkJaWYgKCFsb2NhbFBhdGguZXhpc3RzKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjgiKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFsb2NhbFBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiUGF0aE1hcHBpbmdEaWFsb2cuOSIpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWxvY2FsUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjEwIikpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElQYXRoIGdldEJhY2tlbmRQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZCYWNrZW5kUGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZMb2NhbFBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJaWYgKGZFbnRyeSA9PSBudWxsKSB7Ci0JCQkJZkVudHJ5ID0gbmV3IE1hcEVudHJ5U291cmNlQ29udGFpbmVyKCk7Ci0JCQkJZk1hcHBpbmcuYWRkTWFwRW50cnkoZkVudHJ5KTsKLQkJCX0KLQkJCWZFbnRyeS5zZXRCYWNrZW5kUGF0aChnZXRCYWNrZW5kUGF0aCgpKTsKLQkJCWZFbnRyeS5zZXRMb2NhbFBhdGgoZ2V0TG9jYWxQYXRoKCkpOwotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBQYXRoTWFwcGluZ0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJbWFnZSBpbWFnZSA9IGdldFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShlbGVtZW50KTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSBnZXRXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChlbGVtZW50KTsKLQkJCWlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDApIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTb3VyY2VDb250YWluZXIpIHsKLQkJCQkJcmV0dXJuICgoSVNvdXJjZUNvbnRhaW5lcillbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGxhYmVsOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQotCQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGdldFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJCX0KLQkJCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCWlmIChmTGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJZkxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNYXBwaW5nU291cmNlQ29udGFpbmVyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuICgoTWFwcGluZ1NvdXJjZUNvbnRhaW5lcilpbnB1dCkuZ2V0U291cmNlQ29udGFpbmVycygpOwotCQkJCX0KLQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgTWFwcGluZ1NvdXJjZUNvbnRhaW5lciBmT3JpZ2luYWxNYXBwaW5nOwotCi0JcHJvdGVjdGVkIE1hcHBpbmdTb3VyY2VDb250YWluZXIgZk1hcHBpbmc7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgZk5hbWVUZXh0OwotCXByaXZhdGUgQnV0dG9uIGZBZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZkVkaXRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZlJlbW92ZUJ1dHRvbjsKLQotCXB1YmxpYyBQYXRoTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTWFwcGluZ1NvdXJjZUNvbnRhaW5lciBtYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJZk9yaWdpbmFsTWFwcGluZyA9IG1hcHBpbmc7Ci0JCWZNYXBwaW5nID0gZk9yaWdpbmFsTWFwcGluZy5jb3B5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRUaXRsZShTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiUGF0aE1hcHBpbmdEaWFsb2cuMTEiKSk7Ci0JCS8vVE9ETyBjaGFuZ2UgaW1hZ2UKLQkJc2V0VGl0bGVJbWFnZShQRGVidWdJbWFnZS5nZXRJbWFnZShQRGVidWdJbWFnZS5JQ09OX1JFR0lTVEVSX05PUk1BTCkpOwotCQkKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJLy9QbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldFNoZWxsKCksIElQVFBEZWJ1Z0hlbHBDb250ZXh0SWRzLlNPVVJDRV9QQVRIX01BUFBJTkdfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgbmFtZUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCW5hbWVDb21wLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQluYW1lQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKG5hbWVDb21wLCBTV1QuTEVGVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRGb250KGZvbnQpOwotCQlsYWJlbC5zZXRUZXh0KFNvdXJjZUxvb2t1cFVJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRoTWFwcGluZ0RpYWxvZy4xMiIpKTsKLQkJZk5hbWVUZXh0ID0gbmV3IFRleHQobmFtZUNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlmTmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZk5hbWVUZXh0LnNldEZvbnQoZm9udCk7Ci0JCWZOYW1lVGV4dC5zZXRUZXh0KGdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlmTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZlZpZXdlciA9IGNyZWF0ZVZpZXdlcihjb21wb3NpdGUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWZWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvbnQoZm9udCk7Ci0JCWZWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeyAKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlidXR0b25Db21wLnNldEZvbnQoZm9udCk7Ci0KLQkJR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsKLQkJZ2Muc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJRm9udE1ldHJpY3MgZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0KLQkJZkFkZEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcCwgU291cmNlTG9va3VwVUlNZXNzYWdlcy5nZXRTdHJpbmcoIlBhdGhNYXBwaW5nRGlhbG9nLjEzIiksIGZvbnRNZXRyaWNzKTsKLQkJZkFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJCQkJTWFwRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IE1hcEVudHJ5RGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCWZFZGl0QnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCBTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiUGF0aE1hcHBpbmdEaWFsb2cuMTQiKSwgZm9udE1ldHJpY3MpOwotCQlmRWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJCQkJTWFwRW50cnlTb3VyY2VDb250YWluZXJbXSBlbnRyaWVzID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCU1hcEVudHJ5RGlhbG9nIGRpYWxvZyA9IG5ldyBNYXBFbnRyeURpYWxvZyhnZXRTaGVsbCgpLCBlbnRyaWVzWzBdKTsKLQkJCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCWZSZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXAsIFNvdXJjZUxvb2t1cFVJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRoTWFwcGluZ0RpYWxvZy4xNSIpLCBmb250TWV0cmljcyk7Ci0JCWZSZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0JCQkJCU1hcEVudHJ5U291cmNlQ29udGFpbmVyW10gZW50cmllcyA9IGdldFNlbGVjdGlvbigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQkJZk1hcHBpbmcucmVtb3ZlTWFwRW50cnkoZW50cmllc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJc2V0TWVzc2FnZShudWxsKTsKLQotCQlmVmlld2VyLnNldElucHV0KGZNYXBwaW5nKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFBhdGhNYXBwaW5nTGFiZWxQcm92aWRlcigpKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGluZ1NvdXJjZUNvbnRhaW5lciBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gZk9yaWdpbmFsTWFwcGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBGb250TWV0cmljcyBmb250TWV0cmljcykgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZ2QgPSBnZXRCdXR0b25HcmlkRGF0YShidXR0b24sIGZvbnRNZXRyaWNzKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByaXZhdGUgR3JpZERhdGEgZ2V0QnV0dG9uR3JpZERhdGEoQnV0dG9uIGJ1dHRvbiwgRm9udE1ldHJpY3MgZm9udE1ldHJpY3MpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJaW50IHdpZHRoSGludCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlnZC53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQluZXdTaGVsbC5zZXRUZXh0KFNvdXJjZUxvb2t1cFVJTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXRoTWFwcGluZ0RpYWxvZy4xNiIpKTsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gZlZpZXdlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJZk9yaWdpbmFsTWFwcGluZy5jbGVhcigpOwotCQlmT3JpZ2luYWxNYXBwaW5nLnNldE5hbWUoZk5hbWVUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQl0cnkgewotCQkJZk9yaWdpbmFsTWFwcGluZy5hZGRNYXBFbnRyaWVzKChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcltdKWZNYXBwaW5nLmdldFNvdXJjZUNvbnRhaW5lcnMoKSk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZk1hcHBpbmcuZGlzcG9zZSgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9CQotCi0JcHJvdGVjdGVkIE1hcEVudHJ5U291cmNlQ29udGFpbmVyW10gZ2V0U2VsZWN0aW9uKCkgewotCQlNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcltdIHJlc3VsdCA9IG5ldyBNYXBFbnRyeVNvdXJjZUNvbnRhaW5lclswXTsKLQkJSVNlbGVjdGlvbiBzID0gZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWludCBzaXplID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzKS5zaXplKCk7Ci0JCQlyZXN1bHQgPSAoTWFwRW50cnlTb3VyY2VDb250YWluZXJbXSkoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXMpLnRvTGlzdCgpLnRvQXJyYXkobmV3IE1hcEVudHJ5U291cmNlQ29udGFpbmVyW3NpemVdKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcltdIGVudHJpZXMgPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGZFZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCWZFZGl0QnV0dG9uLnNldEVuYWJsZWQoZW50cmllcy5sZW5ndGggPT0gMSk7Ci0JCX0KLQkJaWYgKGZSZW1vdmVCdXR0b24gIT0gbnVsbCkgewotCQkJZlJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVudHJpZXMubGVuZ3RoID4gMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9zb3VyY2Vsb29rdXAvU291cmNlQ29udGFpbmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3NvdXJjZWxvb2t1cC9Tb3VyY2VDb250YWluZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNjNTE0Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3NvdXJjZWxvb2t1cC9Tb3VyY2VDb250YWluZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuc291cmNlbG9va3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VDb250YWluZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlLmVxdWFscyhJV29ya2JlbmNoQWRhcHRlci5jbGFzcykpIHsKLQkJCXJldHVybiBuZXcgU291cmNlQ29udGFpbmVyV29ya2JlbmNoQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzIH07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvc291cmNlbG9va3VwL1NvdXJjZUNvbnRhaW5lcldvcmtiZW5jaEFkYXB0ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3NvdXJjZWxvb2t1cC9Tb3VyY2VDb250YWluZXJXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2EyYTIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvc291cmNlbG9va3VwL1NvdXJjZUNvbnRhaW5lcldvcmtiZW5jaEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLlByb2plY3RTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5NYXBwaW5nU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC5jb3JlLnNvdXJjZWxvb2t1cC5NYXBFbnRyeVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlQ29udGFpbmVyV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIE1hcHBpbmdTb3VyY2VDb250YWluZXIpIHsKLQkJCS8vVE9ETyBjaGFuZ2UgaW1hZ2UKLQkJCXJldHVybiBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklDT05fUkVHSVNURVJfTk9STUFMKTsKLQkJfQotCQlpZiAobyBpbnN0YW5jZW9mIE1hcEVudHJ5U291cmNlQ29udGFpbmVyKSB7Ci0JCQkvL1RPRE8gY2hhbmdlIGltYWdlCi0JCQlyZXR1cm4gUERlYnVnSW1hZ2UuZ2V0RGVzY3JpcHRvcihQRGVidWdJbWFnZS5JQ09OX1JFR0lTVEVSX05PUk1BTCk7Ci0JCX0KLQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9qZWN0U291cmNlQ29udGFpbmVyKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKChQcm9qZWN0U291cmNlQ29udGFpbmVyKW8pLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvcihwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlXb3JrYmVuY2hBZGFwdGVyIGFkYXB0ZXIgPSAoSVdvcmtiZW5jaEFkYXB0ZXIpcHJvamVjdC5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIE1hcHBpbmdTb3VyY2VDb250YWluZXIpIHsKLQkJCXJldHVybiBTb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmdldFN0cmluZygiU291cmNlQ29udGFpbmVyV29ya2JlbmNoQWRhcHRlci4wIikgKyAoKE1hcHBpbmdTb3VyY2VDb250YWluZXIpbykuZ2V0TmFtZSgpOyAKLQkJfQotCQlpZiAobyBpbnN0YW5jZW9mIE1hcEVudHJ5U291cmNlQ29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gKChNYXBFbnRyeVNvdXJjZUNvbnRhaW5lcilvKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKElQYXRoIHBhdGgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nW10gc2VnbWVudHMgPSBwYXRoLnNlZ21lbnRzKCk7Ci0JCWlmIChzZWdtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIiAtICIpOyAKLQkJCQlpZiAocGF0aC5nZXREZXZpY2UoKSAhPSBudWxsKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocGF0aC5nZXREZXZpY2UoKSk7Ci0JCQkJfQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJCQlidWZmZXIuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3NvdXJjZWxvb2t1cC9Tb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9zb3VyY2Vsb29rdXAvU291cmNlTG9va3VwVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGEwYjUwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3NvdXJjZWxvb2t1cC9Tb3VyY2VMb29rdXBVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5zb3VyY2Vsb29rdXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VMb29rdXBVSU1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBVSU1lc3NhZ2VzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBTb3VyY2VMb29rdXBVSU1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9zb3VyY2Vsb29rdXAvU291cmNlTG9va3VwVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvc291cmNlbG9va3VwL1NvdXJjZUxvb2t1cFVJTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1MWRkZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS9zb3VyY2Vsb29rdXAvU291cmNlTG9va3VwVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgUU5YIFNvZnR3YXJlIFN5c3RlbXMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgUU5YIFNvZnR3YXJlIFN5c3RlbXMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIE5va2lhIC0gQWRkZWQgc3VwcG9ydCBmb3IgQ1NvdXJjZU5vdEZvdW5kRWxlbWVudCAoIDE2NzMwNSApCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRDb250YWluZXJBY3Rpb24uMD0mQWRkLi4uCi1BZGRTb3VyY2VDb250YWluZXJEaWFsb2cuMD1BZGQgU291cmNlCi1BZGRTb3VyY2VDb250YWluZXJEaWFsb2cuMT1TZWxlY3QgdGhlIHR5cGUgb2Ygc291cmNlIHRvIGFkZCB0byB0aGUgc291cmNlIGxvb2t1cCBwYXRoCi1Eb3duQWN0aW9uLjA9JkRvd24KLUVkaXRDb250YWluZXJBY3Rpb24uMD0mRWRpdC4uLgotTWFwcGluZ1NvdXJjZUNvbnRhaW5lckJyb3dzZXIuMD1OZXcgTWFwcGluZwotUGF0aE1hcHBpbmdEaWFsb2cuMD1TcGVjaWZ5IHRoZSBtYXBwaW5nIHBhdGhzCi1QYXRoTWFwcGluZ0RpYWxvZy4xPUNvbXBpbGF0aW9uIHBhdGg6Ci1QYXRoTWFwcGluZ0RpYWxvZy4yPUxvY2FsIGZpbGUgc3lzdGVtIHBhdGg6Ci1QYXRoTWFwcGluZ0RpYWxvZy4zPSZCcm93c2UuLi4KLVBhdGhNYXBwaW5nRGlhbG9nLjQ9UGF0aCBNYXBwaW5nCi1QYXRoTWFwcGluZ0RpYWxvZy41PVRoZSBjb21waWxhdGlvbiBwYXRoIG11c3Qgbm90IGJlIGVtcHR5Ci1QYXRoTWFwcGluZ0RpYWxvZy42PUludmFsaWQgY29tcGlsYXRpb24gcGF0aC4KLVBhdGhNYXBwaW5nRGlhbG9nLjc9VGhlIGxvY2FsIGZpbGUgc3lzdGVtcyBwYXRoIG11c3Qgbm90IGJlIGVtcHR5Ci1QYXRoTWFwcGluZ0RpYWxvZy44PVRoZSBzcGVjaWZpZWQgbG9jYWwgZmlsZSBzeXN0ZW0gcGF0aCBkb2Vzbid0IGV4aXN0Ci1QYXRoTWFwcGluZ0RpYWxvZy45PVRoZSBsb2NhbCBmaWxlIHN5c3RlbSBwYXRoIG11c3QgYmUgYSBkaXJlY3RvcnkKLVBhdGhNYXBwaW5nRGlhbG9nLjEwPVRoZSBsb2NhbCBmaWxlIHN5c3RlbSBwYXRoIG11c3QgYmUgYWJzb2x1dGUKLVBhdGhNYXBwaW5nRGlhbG9nLjExPU1vZGlmeSB0aGUgcGF0aCBtYXBwaW5ncwotUGF0aE1hcHBpbmdEaWFsb2cuMTI9TmFtZToKLVBhdGhNYXBwaW5nRGlhbG9nLjEzPSZBZGQuLi4KLVBhdGhNYXBwaW5nRGlhbG9nLjE0PSZFZGl0Li4uCi1QYXRoTWFwcGluZ0RpYWxvZy4xNT1SZSZtb3ZlCi1QYXRoTWFwcGluZ0RpYWxvZy4xNj1QYXRoIE1hcHBpbmdzCi1SZW1vdmVBY3Rpb24uMD1SZSZtb3ZlCi1Tb3VyY2VDb250YWluZXJXb3JrYmVuY2hBZGFwdGVyLjA9UGF0aCBNYXBwaW5nOiAKLVVwQWN0aW9uLjA9VSZwCi1QU291cmNlTm90Rm91bmRFZGl0b3IuMD1DYW4nJ3QgZmluZCBhIHNvdXJjZSBmaWxlIGF0IFwiezB9XCIgXG5Mb2NhdGUgdGhlIGZpbGUgb3IgZWRpdCB0aGUgc291cmNlIGxvb2t1cCBwYXRoIHRvIGluY2x1ZGUgaXRzIGxvY2F0aW9uLgotUFNvdXJjZU5vdEZvdW5kRWRpdG9yLjE9TG9jYXRlIEZpbGUuLi4KLVBTb3VyY2VOb3RGb3VuZEVkaXRvci4yPU1pc3NpbmcgU291cmNlIEZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0Fic3RyYWN0Q1RhYmxlQ2VsbEVkaXRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3RDVGFibGVDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDk0N2IuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3RDVGFibGVDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDVGFibGVDZWxsRWRpdG9yIHsKLQlwcm90ZWN0ZWQgQ1RhYmxlIG1fVGFibGU7Ci0JcHJvdGVjdGVkIFJlY3RhbmdsZSBtX1JlY3Q7Ci0JcHJvdGVjdGVkIGludCBtX1JvdzsKLQlwcm90ZWN0ZWQgaW50IG1fQ29sOwotCXByb3RlY3RlZCBDb250cm9sIG1fQ29udHJvbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2xUaXA7Ci0JcHJvdGVjdGVkIElDVGFibGVNb2RlbCBtX01vZGVsOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChtX0NvbnRyb2wgIT0gbnVsbCkgewotCQkJbV9Db250cm9sLmRpc3Bvc2UoKTsKLQkJCW1fQ29udHJvbCA9IG51bGw7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgb3BlbihDVGFibGUgdGFibGUsIGludCBjb2wsIGludCByb3csIFJlY3RhbmdsZSByZWN0KSB7Ci0JCW1fVGFibGUgPSB0YWJsZTsKLQkJbV9Nb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk7Ci0JCW1fUmVjdCA9IHJlY3Q7Ci0JCW1fUm93ID0gcm93OwotCQltX0NvbCA9IGNvbDsKLQkJaWYgKG1fQ29udHJvbCA9PSBudWxsKSB7Ci0JCQltX0NvbnRyb2wgPSBjcmVhdGVDb250cm9sKCk7Ci0JCQltX0NvbnRyb2wuc2V0VG9vbFRpcFRleHQodG9vbFRpcCk7Ci0JCQltX0NvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGFyZzApIHsKLQkJCQkJY2xvc2UodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJc2V0Qm91bmRzKG1fUmVjdCk7Ci0JCUdDIGdjID0gbmV3IEdDKG1fVGFibGUpOwotCQltX1RhYmxlLmRyYXdDZWxsKGdjLCBtX0NvbCwgbV9Sb3cpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNsb3NlKGJvb2xlYW4gc2F2ZSkgewotCQltX1RhYmxlLm1fQ2VsbEVkaXRvciA9IG51bGw7Ci0JCS8vIG1fQ29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJR0MgZ2MgPSBuZXcgR0MobV9UYWJsZSk7Ci0JCW1fVGFibGUuZHJhd0NlbGwoZ2MsIG1fQ29sLCBtX1Jvdyk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJdGhpcy5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKLQkJaWYgKG1fQ29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbV9Db250cm9sLmlzRm9jdXNDb250cm9sKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgcmVjdCkgewotCQlpZiAobV9Db250cm9sICE9IG51bGwpCi0JCQltX0NvbnRyb2wuc2V0Qm91bmRzKHJlY3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBvbktleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQlpZiAoKGUuY2hhcmFjdGVyID09ICdccicpICYmICgoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpID09IDApKSB7Ci0JCQljbG9zZSh0cnVlKTsKLQkJfSBlbHNlIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQljbG9zZShmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQltX1RhYmxlLnNjcm9sbFRvRm9jdXMoKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBvblRyYXZlcnNlKFRyYXZlcnNlRXZlbnQgZSkgewotCQljbG9zZSh0cnVlKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXApIHsKLQkJdGhpcy50b29sVGlwID0gdG9vbFRpcDsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbCgpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3REZWJ1Z0V2ZW50SGFuZGxlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3REZWJ1Z0V2ZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2VmODVmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0Fic3RyYWN0RGVidWdFdmVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JRGVidWdFdmVudFNldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0RGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2ljUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IENodQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWJ1Z0V2ZW50SGFuZGxlciBpbXBsZW1lbnRzIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgewotCS8qKgotCSAqIFRoaXMgZXZlbnQgaGFuZGxlcidzIHZpZXcKLQkgKi8KLQlwcml2YXRlIEFic3RyYWN0RGVidWdWaWV3IGZWaWV3OwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIHZpZXcuCi0JICogCi0JICogQHBhcmFtIHZpZXcgZGVidWcgdmlldwotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERlYnVnRXZlbnRIYW5kbGVyKEFic3RyYWN0RGVidWdWaWV3IHZpZXcpIHsKLQkJc2V0Vmlldyh2aWV3KTsKLQkJRGVidWdQbHVnaW4gcGx1Z2luPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXBsdWdpbi5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIjaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKGZpbmFsIERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJaWYgKCFpc0F2YWlsYWJsZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUnVubmFibGUgcj0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChpc0F2YWlsYWJsZSgpKSB7Ci0JCQkJCWlmIChpc1ZpZXdWaXNpYmxlKCkpIHsKLQkJCQkJCWRvSGFuZGxlRGVidWdFdmVudHMoZXZlbnRzKTsKLQkJCQkJfQotCQkJCQl1cGRhdGVGb3JEZWJ1Z0V2ZW50cyhldmVudHMpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0VmlldygpLmFzeW5jRXhlYyhyKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIHZpZXcgZm9yIHRoZSBnaXZlbiBkZWJ1ZyBldmVudHMuIFVubGlrZQotCSAqIGRvSGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdKSB3aGljaCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgdmlldyBpcwotCSAqIHZpc2libGUsIHRoaXMgbWV0aG9kIGlzIGFsd2F5cyBjYWxsZWQuIFRoaXMgYWxsb3dzIHRoZSB2aWV3IHRvIHBlcmZvcm0KLQkgKiB1cGRhdGluZyB0aGF0IG11c3QgYWx3YXlzIGJlIHBlcmZvcm1lZCwgZXZlbiB3aGVuIHRoZSB2aWV3IGlzIG5vdAotCSAqIHZpc2libGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRm9yRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotCX0KLQkKLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBoYW5kbGluZyBvZiBkZWJ1ZyBldmVudHMuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9IYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKTsJCi0JCQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgZm9yIGluc2VydGluZyB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgdHJlZSB2aWV3ZXIgLSAKLQkgKiBtdXN0IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJVHJlZVZpZXdlciB2aWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7Ci0JCWlmIChpc0F2YWlsYWJsZSgpICYmIHZpZXdlciAhPSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyZW50PSAoKElUcmVlQ29udGVudFByb3ZpZGVyKXZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJLy8gYSBwYXJlbnQgY2FuIGJlIG51bGwgZm9yIGEgZGVidWcgdGFyZ2V0IG9yIHByb2Nlc3MgdGhhdCBoYXMgbm90IHlldCBiZWVuIGFzc29jaWF0ZWQKLQkJCS8vIHdpdGggYSBsYXVuY2gKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWdldFZpZXcoKS5zaG93Vmlld2VyKCk7Ci0JCQkJdmlld2VyLmFkZChwYXJlbnQsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSB0aGUgdHJlZSB2aWV3ZXIgLSAKLQkgKiBtdXN0IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOwotCQlpZiAoaXNBdmFpbGFibGUoKSAmJiB2aWV3ZXIgIT0gbnVsbCkgewotCQkJZ2V0VmlldygpLnNob3dWaWV3ZXIoKTsKLQkJCXZpZXdlci5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQgLSBtdXN0IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYWJlbENoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGlzQXZhaWxhYmxlKCkpIHsKLQkJCWdldFZpZXcoKS5zaG93Vmlld2VyKCk7Ci0JCQlnZXRTdHJ1Y3R1cmVkVmlld2VyKCkudXBkYXRlKGVsZW1lbnQsIG5ldyBTdHJpbmdbXSB7SUJhc2ljUHJvcGVydHlDb25zdGFudHMuUF9URVhUfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSB2aWV3ZXIgLSBtdXN0IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaXNBdmFpbGFibGUoKSkgewotCQkJIGdldFZpZXcoKS5zaG93Vmlld2VyKCk7Ci0JCQkgZ2V0U3RydWN0dXJlZFZpZXdlcigpLnJlZnJlc2goZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlld2VyIC0gbXVzdCBiZSBjYWxsZWQgaW4gVUkgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmIChpc0F2YWlsYWJsZSgpKSB7Ci0JCQkgZ2V0VmlldygpLnNob3dWaWV3ZXIoKTsKLQkJCSBnZXRTdHJ1Y3R1cmVkVmlld2VyKCkucmVmcmVzaCgpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gc2VsZWN0IGFuZCByZXZlYWwgdGhlIGdpdmVuIGVsZW1lbnQgLSBtdXN0IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RBbmRSZXZlYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGlzQXZhaWxhYmxlKCkpIHsKLQkJCWdldFZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGUtcmVnaXN0ZXJzIHRoaXMgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBkZWJ1ZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlEZWJ1Z1BsdWdpbiBwbHVnaW49IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcGx1Z2luLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmlldyB0aGlzIGV2ZW50IGhhbmRsZXIgaXMKLQkgKiB1cGRhdGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGRlYnVnIHZpZXcKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REZWJ1Z1ZpZXcgZ2V0VmlldygpIHsKLQkJcmV0dXJuIHRoaXMuZlZpZXc7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHZpZXcgdGhpcyBldmVudCBoYW5kbGVyIGlzIHVwZGF0aW5nLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3IGRlYnVnIHZpZXcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmlldyhBYnN0cmFjdERlYnVnVmlldyB2aWV3KSB7Ci0JCXRoaXMuZlZpZXcgPSB2aWV3OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpZXdlciB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgCi0JICogdXBkYXRpbmcuCi0JICogCi0JICogQHJldHVybiB2aWV3ZXIKLQkgKi8JCi0JcHJvdGVjdGVkIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiBnZXRWaWV3KCkuZ2V0Vmlld2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBldmVudCBoYW5kbGVyJ3Mgdmlld2VyIGFzIGEgdHJlZQotCSAqIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBldmVudCBoYW5kbGVyJ3Mgdmlld2VyIGFzIGEgdHJlZQotCSAqIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJcmV0dXJuIChUcmVlVmlld2VyKWdldFZpZXdlcigpOwotCQl9IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBldmVudCBoYW5kbGVyJ3Mgdmlld2VyIGFzIGEgc3RydWN0dXJlZAotCSAqIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBldmVudCBoYW5kbGVyJ3Mgdmlld2VyIGFzIGEgc3RydWN0dXJlZAotCSAqIHZpZXdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRWaWV3ZXIgZ2V0U3RydWN0dXJlZFZpZXdlcigpIHsKLQkJaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJcmV0dXJuIChTdHJ1Y3R1cmVkVmlld2VyKWdldFZpZXdlcigpOwotCQl9IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXZlbnQgaGFuZGxlcidzIHZpZXdlciBpcwotCSAqIGN1cnJlbnRseSBhdmFpbGFibGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZXZlbnQgaGFuZGxlcidzIHZpZXdlciBpcwotCSAqIGN1cnJlbnRseSBhdmFpbGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIGdldFZpZXcoKS5pc0F2YWlsYWJsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBldmVudCBoYW5kbGVyJ3MgdmlldyBpcyBjdXJyZW50bHkgdmlzaWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBldmVudCBoYW5kbGVyJ3MgdmlldyBpcyBjdXJyZW50bHkgdmlzaWJsZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmlld1Zpc2libGUoKSB7Ci0JCXJldHVybiBnZXRWaWV3KCkuaXNWaXNpYmxlKCk7Ci0JfQkKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGlzIGV2ZW50IGhhbmRsZXIncyB2aWV3IGJlY29tZXMgdmlzaWJsZS4gRGVmYXVsdCBiZWhhdmlvcgotCSAqIGlzIHRvIHJlZnJlc2ggdGhlIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlld0JlY29tZXNWaXNpYmxlKCkgewotCQlyZWZyZXNoKCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoaXMgZXZlbnQgaGFuZGxlcidzIHZpZXcgYmVjb21lcyBoaWRkZW4uIERlZmF1bHQgYmVoYXZpb3IgaXMKLQkgKiB0byBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aWV3QmVjb21lc0hpZGRlbigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9BYnN0cmFjdERlYnVnRXZlbnRIYW5kbGVyVmlldy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3REZWJ1Z0V2ZW50SGFuZGxlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmNmNiZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9BYnN0cmFjdERlYnVnRXZlbnRIYW5kbGVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0RGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGVidWdFdmVudEhhbmRsZXJWaWV3IGV4dGVuZHMgQWJzdHJhY3REZWJ1Z1ZpZXcgewotCS8qKgotCSAqIEV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgdmlldwotCSAqLwotCXByaXZhdGUgQWJzdHJhY3REZWJ1Z0V2ZW50SGFuZGxlciBmRXZlbnRIYW5kbGVyOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyB2aWV3Ci0JICogCi0JICogQHBhcmFtIGV2ZW50SGFuZGxlciBldmVudCBoYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXZlbnRIYW5kbGVyKEFic3RyYWN0RGVidWdFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKSB7Ci0JCXRoaXMuZkV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyB2aWV3Ci0JICogCi0JICogQHJldHVybiBUaGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyB2aWV3Ci0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGVidWdFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkgewotCQlyZXR1cm4gdGhpcy5mRXZlbnRIYW5kbGVyOwotCX0JCi0JCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChnZXRFdmVudEhhbmRsZXIoKSAhPSBudWxsKSB7Ci0JCQlnZXRFdmVudEhhbmRsZXIoKS5kaXNwb3NlKCk7Ci0JCX0JCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjYmVjb21lc0hpZGRlbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVjb21lc0hpZGRlbigpIHsKLQkJc3VwZXIuYmVjb21lc0hpZGRlbigpOwotCQlnZXRFdmVudEhhbmRsZXIoKS52aWV3QmVjb21lc0hpZGRlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjYmVjb21lc1Zpc2libGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlY29tZXNWaXNpYmxlKCkgewotCQlzdXBlci5iZWNvbWVzVmlzaWJsZSgpOwotCQlnZXRFdmVudEhhbmRsZXIoKS52aWV3QmVjb21lc1Zpc2libGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdGF0dXNMaW5lKCkgewotCQlJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlciA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7IAotCQltYW5hZ2VyLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJbWFuYWdlci5zZXRNZXNzYWdlKG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0Fic3RyYWN0UERlYnVnVmlld0V2ZW50SGFuZGxlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDAxMjYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLklQRGVidWdFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5JUERlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5Xb3JrYmVuY2hKb2I7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IENodQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyIGltcGxlbWVudHMgSVBEZWJ1Z0V2ZW50TGlzdGVuZXIgewotCS8qKgotCSAqIFRoaXMgZXZlbnQgaGFuZGxlcidzIHZpZXcKLQkgKi8KLQlwcml2YXRlIElWaWV3UGFydCBmVmlldzsKLQkKLQlwcm90ZWN0ZWQgUERlYnVnRXZlbnRXb3JrYmVuY2hKb2IgZXZlbnRXb3JrYmVuY2hKb2IgPSBuZXcgUERlYnVnRXZlbnRXb3JrYmVuY2hKb2IoKTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB2aWV3LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3IGRlYnVnIHZpZXcKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyKElWaWV3UGFydCB2aWV3KSB7Ci0JCXNldFZpZXcodmlldyk7Ci0JCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQkvKioKLQkgKiBEZS1yZWdpc3RlcnMgdGhpcyBldmVudCBoYW5kbGVyIGZyb20gdGhlIGRlYnVnIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnQoZmluYWwgSVBEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50V29ya2JlbmNoSm9iLmFkZEV2ZW50KGV2ZW50KTsKLQkJLyoKLQkJV29ya2JlbmNoSm9iIHVpSm9iID0gbmV3IFdvcmtiZW5jaEpvYigiSGFuZGxpbmcgRGVidWcgRXZlbnQiKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWRvSGFuZGxlRGVidWdFdmVudChldmVudCwgbW9uaXRvcik7Ci0JCQkJLy91cGRhdGVGb3JEZWJ1Z0V2ZW50KGV2ZW50LCBtb25pdG9yKTsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJdWlKb2Iuc2V0U3lzdGVtKGZhbHNlKTsKLQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQkJKi8KLQl9Ci0JLyoqCi0JICogVXBkYXRlcyB0aGlzIHZpZXcgZm9yIHRoZSBnaXZlbiBkZWJ1ZyBldmVudHMuIFVubGlrZQotCSAqIGRvSGFuZGxlRGVidWdFdmVudChJUERlYnVnRXZlbnQpIHdoaWNoIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSB2aWV3IGlzCi0JICogdmlzaWJsZSwgdGhpcyBtZXRob2QgaXMgYWx3YXlzIGNhbGxlZC4gVGhpcyBhbGxvd3MgdGhlIHZpZXcgdG8gcGVyZm9ybQotCSAqIHVwZGF0aW5nIHRoYXQgbXVzdCBhbHdheXMgYmUgcGVyZm9ybWVkLCBldmVuIHdoZW4gdGhlIHZpZXcgaXMgbm90Ci0JICogdmlzaWJsZS4KLQkgKi8KLQkvL3Byb3RlY3RlZCB2b2lkIHVwZGF0ZUZvckRlYnVnRXZlbnQoSVBEZWJ1Z0V2ZW50IGV2ZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHt9Ci0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaGFuZGxpbmcgb2YgZGVidWcgZXZlbnRzLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvSGFuZGxlRGVidWdFdmVudChJUERlYnVnRXZlbnQgZXZlbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7CQkKLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSB2aWV3ZXIgLSBtdXN0IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVmcmVzaChib29sZWFuIGFsbCk7Ci0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlld2VyIC0gbXVzdCBiZSBjYWxsZWQgaW4gVUkgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCSByZWZyZXNoKGZhbHNlKTsKLQl9CQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpZXcgdGhpcyBldmVudCBoYW5kbGVyIGlzIHVwZGF0aW5nLgotCSAqIEByZXR1cm4gZGVidWcgdmlldwotCSAqLwotCXByb3RlY3RlZCBJVmlld1BhcnQgZ2V0VmlldygpIHsKLQkJcmV0dXJuIHRoaXMuZlZpZXc7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpZXcgdGhpcyBldmVudCBoYW5kbGVyIGlzIHVwZGF0aW5nLgotCSAqIEBwYXJhbSB2aWV3IGRlYnVnIHZpZXcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmlldyhJVmlld1BhcnQgdmlldykgewotCQl0aGlzLmZWaWV3ID0gdmlldzsKLQl9Ci0JY2xhc3MgUERlYnVnRXZlbnRXb3JrYmVuY2hKb2IgZXh0ZW5kcyBXb3JrYmVuY2hKb2IgewotCQlWZWN0b3I8SVBEZWJ1Z0V2ZW50PiBldmVudHMgPSBuZXcgVmVjdG9yPElQRGVidWdFdmVudD4oMTApOwotCQlQRGVidWdFdmVudFdvcmtiZW5jaEpvYigpIHsKLQkJCXN1cGVyKCJIYW5kbGluZyBEZWJ1ZyBFdmVudCIpOwotCQl9Ci0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJUERlYnVnRXZlbnRbXSBwRXZlbnRzOwotCQkJc3luY2hyb25pemVkIChldmVudHMpIHsKLQkJCQlwRXZlbnRzID0gZXZlbnRzLnRvQXJyYXkobmV3IElQRGVidWdFdmVudFswXSk7Ci0JCQkJZXZlbnRzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlmb3IgKElQRGVidWdFdmVudCBlIDogcEV2ZW50cykgewotCQkJCWRvSGFuZGxlRGVidWdFdmVudChlLCBtb25pdG9yKTsKLQkJCX0KLQkJCS8vdXBkYXRlRm9yRGVidWdFdmVudChldmVudCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZEV2ZW50KElQRGVidWdFdmVudCBldmVudCkgewotCQkJc3luY2hyb25pemVkIChldmVudHMpIHsKLQkJCQlldmVudHMuYWRkKGV2ZW50KTsKLQkJCX0KLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9DVGFibGUuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmEwNWQyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIENUYWJsZSBleHRlbmRzIENhbnZhcyB7Ci0JcHJvdGVjdGVkIEdDIG1fR0M7Ci0JcHJvdGVjdGVkIERpc3BsYXkgbV9EaXNwbGF5OwotCXByb3RlY3RlZCBMaXN0PFBvaW50PiBtX1NlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDVGFibGVDZWxsRWRpdG9yIG1fQ2VsbEVkaXRvcjsKLQlwcm90ZWN0ZWQgSUNUYWJsZU1vZGVsIG1fTW9kZWw7Ci0JcHJvdGVjdGVkIGludCBtX0xlZnRDb2x1bW47Ci0JcHJvdGVjdGVkIGludCBtX1RvcFJvdzsKLQkvLyB2aXNpYWJsZQotCXByb3RlY3RlZCBpbnQgbV9Sb3dzVmlzaWJsZTsKLQlwcm90ZWN0ZWQgaW50IG1fUm93c0Z1bGx5VmlzaWJsZTsKLQlwcm90ZWN0ZWQgaW50IG1fQ29sdW1uc1Zpc2libGU7Ci0JcHJvdGVjdGVkIGludCBtX0NvbHVtbnNGdWxseVZpc2libGU7Ci0JLy8gc2VsZWN0aW9uCi0JcHJvdGVjdGVkIGJvb2xlYW4gbV9Sb3dTZWxlY3Rpb25Nb2RlOwotCXByb3RlY3RlZCBib29sZWFuIG1fTXVsdGlTZWxlY3RNb2RlOwotCXByb3RlY3RlZCBpbnQgbV9Gb2N1c1JvdzsKLQlwcm90ZWN0ZWQgaW50IG1fRm9jdXNDb2w7Ci0JcHJvdGVjdGVkIGludCBtX0NsaWNrQ29sdW1uSW5kZXg7Ci0JcHJvdGVjdGVkIGludCBtX0NsaWNrUm93SW5kZXg7Ci0JLy8gcmVzaXplCi0JcHJvdGVjdGVkIGludCBtX1Jlc2l6ZUNvbHVtbkluZGV4OwotCXByb3RlY3RlZCBpbnQgbV9SZXNpemVDb2x1bW5MZWZ0OwotCXByb3RlY3RlZCBpbnQgbV9SZXNpemVSb3dJbmRleDsKLQlwcm90ZWN0ZWQgaW50IG1fUmVzaXplUm93VG9wOwotCXByb3RlY3RlZCBpbnQgbV9OZXdSb3dTaXplOwotCS8vIExpc3RlbmVyCi0JcHJvdGVjdGVkIExpc3Q8SUNUYWJsZUNlbGxTZWxlY3Rpb25MaXN0ZW5lcj4gY2VsbFNlbGVjdGlvbkxpc3RlbmVyczsKLQlwcm90ZWN0ZWQgTGlzdDxJQ1RhYmxlQ2VsbFJlc2l6ZUxpc3RlbmVyPiBjZWxsUmVzaXplTGlzdGVuZXJzOwotCXB1YmxpYyBDVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBzdHlsZSk7Ci0JCWluaXQoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCW1fR0MgPSBuZXcgR0ModGhpcyk7Ci0JCW1fRGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQltX1NlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8UG9pbnQ+KCk7Ci0JCW1fQ2VsbEVkaXRvciA9IG51bGw7Ci0JCW1fUm93U2VsZWN0aW9uTW9kZSA9IGZhbHNlOwotCQltX011bHRpU2VsZWN0TW9kZSA9IGZhbHNlOwotCQltX1RvcFJvdyA9IDA7Ci0JCW1fTGVmdENvbHVtbiA9IDA7Ci0JCW1fRm9jdXNSb3cgPSAwOwotCQltX0ZvY3VzQ29sID0gMDsKLQkJbV9Sb3dzVmlzaWJsZSA9IDA7Ci0JCW1fUm93c0Z1bGx5VmlzaWJsZSA9IDA7Ci0JCW1fQ29sdW1uc1Zpc2libGUgPSAwOwotCQltX0NvbHVtbnNGdWxseVZpc2libGUgPSAwOwotCQltX1Jlc2l6ZUNvbHVtbkluZGV4ID0gLTE7Ci0JCW1fUmVzaXplUm93SW5kZXggPSAtMTsKLQkJbV9SZXNpemVSb3dUb3AgPSAtMTsKLQkJbV9OZXdSb3dTaXplID0gLTE7Ci0JCW1fUmVzaXplQ29sdW1uTGVmdCA9IC0xOwotCQltX0NsaWNrQ29sdW1uSW5kZXggPSAtMTsKLQkJbV9DbGlja1Jvd0luZGV4ID0gLTE7Ci0JCWNlbGxTZWxlY3Rpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDVGFibGVDZWxsU2VsZWN0aW9uTGlzdGVuZXI+KCk7Ci0JCWNlbGxSZXNpemVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDVGFibGVDZWxsUmVzaXplTGlzdGVuZXI+KCk7Ci0JCWNyZWF0ZUxpc3RlbmVycygpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0ZW5lcnMoKSB7Ci0JCWFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCW9uUGFpbnQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJcmVkcmF3KCk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJb25Nb3VzZURvd24oZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCW9uTW91c2VVcChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkJb25Nb3VzZURvdWJsZUNsaWNrKGUpOwotCQkJfQotCQl9KTsKLQkJYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJCW9uTW91c2VNb3ZlKGUpOwotCQkJfQotCQl9KTsKLQkJaWYgKGdldFZlcnRpY2FsQmFyKCkgIT0gbnVsbCkgewotCQkJZ2V0VmVydGljYWxCYXIoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCW1fVG9wUm93ID0gZ2V0VmVydGljYWxCYXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJcmVkcmF3KCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGdldEhvcml6b250YWxCYXIoKSAhPSBudWxsKSB7Ci0JCQlnZXRIb3Jpem9udGFsQmFyKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQltX0xlZnRDb2x1bW4gPSBnZXRIb3Jpem9udGFsQmFyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXJlZHJhdygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJb25LZXlEb3duKGUpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHVibGljIElDVGFibGVNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1fTW9kZWw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElDVGFibGVNb2RlbCBtb2RlbCkgewotCQltX01vZGVsID0gbW9kZWw7Ci0JCXJlc2V0KCk7Ci0JfQotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0VmlzaWJsZUFyZWEoKSB7Ci0JCWRvQ2FsY3VsYXRpb25zKCk7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKG1fTGVmdENvbHVtbiwgbV9Ub3BSb3csIG1fQ29sdW1uc0Z1bGx5VmlzaWJsZSwgbV9Sb3dzRnVsbHlWaXNpYmxlKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCW1fRm9jdXNDb2wgPSAtMTsKLQkJbV9Gb2N1c1JvdyA9IC0xOwotCQljbGVhclNlbGVjdGlvbldpdGhvdXRSZWRyYXcoKTsKLQl9Ci0JcHJvdGVjdGVkIGludCBnZXRGaXhlZFdpZHRoKCkgewotCQlpbnQgd2lkdGggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOyBpKyspCi0JCQl3aWR0aCArPSBtX01vZGVsLmdldENvbHVtbldpZHRoKGkpOwotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uTGVmdChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgbV9Nb2RlbC5nZXRGaXhlZENvbHVtbkNvdW50KCkpIHsKLQkJCWludCB4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotCQkJCXggKz0gbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChpKTsKLQkJCX0KLQkJCXJldHVybiB4OwotCQl9Ci0JCWlmIChpbmRleCA8IG1fTGVmdENvbHVtbikKLQkJCXJldHVybiAtMTsKLQkJaW50IHggPSBnZXRGaXhlZFdpZHRoKCk7Ci0JCWZvciAoaW50IGkgPSBtX0xlZnRDb2x1bW47IGkgPCBpbmRleDsgaSsrKSB7Ci0JCQl4ICs9IG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGgoaSk7Ci0JCX0KLQkJcmV0dXJuIHg7Ci0JfQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uUmlnaHQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGdldENvbHVtbkxlZnQoaW5kZXgpICsgbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChpbmRleCk7Ci0JfQotCXByb3RlY3RlZCBpbnQgZ2V0TGFzdENvbHVtblJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0Q29sdW1uUmlnaHQobV9Nb2RlbC5nZXRDb2x1bW5Db3VudCgpIC0gMSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRvQ2FsY3VsYXRpb25zKCkgewotCQlpZiAobV9Nb2RlbCA9PSBudWxsKSB7Ci0JCQlTY3JvbGxCYXIgc2IgPSBnZXRIb3Jpem9udGFsQmFyKCk7Ci0JCQlpZiAoc2IgIT0gbnVsbCkgewotCQkJCXNiLnNldFZpc2libGUoZmFsc2UpOwotCQkJCXNiLnNldE1pbmltdW0oMCk7Ci0JCQkJc2Iuc2V0TWF4aW11bSgxKTsKLQkJCQlzYi5zZXRQYWdlSW5jcmVtZW50KDEpOwotCQkJCXNiLnNldFRodW1iKDEpOwotCQkJCXNiLnNldFNlbGVjdGlvbigxKTsKLQkJCX0KLQkJCXNiID0gZ2V0VmVydGljYWxCYXIoKTsKLQkJCWlmIChzYiAhPSBudWxsKSB7Ci0JCQkJc2Iuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJc2Iuc2V0TWluaW11bSgwKTsKLQkJCQlzYi5zZXRNYXhpbXVtKDEpOwotCQkJCXNiLnNldFBhZ2VJbmNyZW1lbnQoMSk7Ci0JCQkJc2Iuc2V0VGh1bWIoMSk7Ci0JCQkJc2Iuc2V0U2VsZWN0aW9uKDEpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBtX1Jvd0hlaWdodCA9IG1fTW9kZWwuZ2V0Um93SGVpZ2h0KCk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlpZiAobV9MZWZ0Q29sdW1uIDwgbV9Nb2RlbC5nZXRGaXhlZENvbHVtbkNvdW50KCkpIHsKLQkJCW1fTGVmdENvbHVtbiA9IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOwotCQl9Ci0JCWlmIChtX1RvcFJvdyA8IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpKSB7Ci0JCQltX1RvcFJvdyA9IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpOwotCQl9Ci0JCWludCBmaXhlZEhlaWdodCA9IG1fUm93SGVpZ2h0ICsgKG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpIC0gMSkgKiBtX01vZGVsLmdldFJvd0hlaWdodCgpOwotCQltX0NvbHVtbnNWaXNpYmxlID0gMDsKLQkJbV9Db2x1bW5zRnVsbHlWaXNpYmxlID0gMDsKLQkJaWYgKG1fTW9kZWwuZ2V0Q29sdW1uQ291bnQoKSA+IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpKSB7Ci0JCQlpbnQgcnVubmluZ1dpZHRoID0gZ2V0Q29sdW1uTGVmdChtX0xlZnRDb2x1bW4pOwotCQkJZm9yIChpbnQgY29sID0gbV9MZWZ0Q29sdW1uOyBjb2wgPCBtX01vZGVsLmdldENvbHVtbkNvdW50KCk7IGNvbCsrKSB7Ci0JCQkJaWYgKHJ1bm5pbmdXaWR0aCA8IHJlY3Qud2lkdGggKyByZWN0LngpCi0JCQkJCW1fQ29sdW1uc1Zpc2libGUrKzsKLQkJCQlydW5uaW5nV2lkdGggKz0gbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChjb2wpOwotCQkJCWlmIChydW5uaW5nV2lkdGggPCByZWN0LndpZHRoICsgcmVjdC54KQotCQkJCQltX0NvbHVtbnNGdWxseVZpc2libGUrKzsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVNjcm9sbEJhciBzYiA9IGdldEhvcml6b250YWxCYXIoKTsKLQkJaWYgKHNiICE9IG51bGwpIHsKLQkJCS8vVE9ETzogYXNzdW1lIGFsbCBjb2x1bW5zIGhhcyB0aGUgc2FtZSB3aWR0aAotCQkJYm9vbGVhbiB2aXNpYWJsZSA9ICEoKG1fTW9kZWwuZ2V0Q29sdW1uQ291bnQoKSptX01vZGVsLmdldENvbHVtbldpZHRoKDApKzUgPCByZWN0LndpZHRoKSAmJiAobV9MZWZ0Q29sdW1uID09IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpKSk7Ci0JCQlzYi5zZXRWaXNpYmxlKHZpc2lhYmxlKTsKLQkJCWlmICh2aXNpYWJsZSkgewotCQkJCWlmIChtX01vZGVsLmdldENvbHVtbkNvdW50KCkgPD0gbV9Nb2RlbC5nZXRGaXhlZENvbHVtbkNvdW50KCkpIHsKLQkJCQkJc2Iuc2V0TWluaW11bSgwKTsKLQkJCQkJc2Iuc2V0TWF4aW11bSgxKTsKLQkJCQkJc2Iuc2V0UGFnZUluY3JlbWVudCgxKTsKLQkJCQkJc2Iuc2V0VGh1bWIoMSk7Ci0JCQkJCXNiLnNldFNlbGVjdGlvbigxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5zZXRNaW5pbXVtKG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpKTsKLQkJCQkJc2Iuc2V0TWF4aW11bShtX01vZGVsLmdldENvbHVtbkNvdW50KCkpOwotCQkJCQlzYi5zZXRJbmNyZW1lbnQoMSk7Ci0JCQkJCXNiLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCQkJCXNiLnNldFRodW1iKG1fQ29sdW1uc0Z1bGx5VmlzaWJsZSk7Ci0JCQkJCXNiLnNldFNlbGVjdGlvbihtX0xlZnRDb2x1bW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQltX1Jvd3NGdWxseVZpc2libGUgPSBNYXRoLm1heCgwLCAocmVjdC5oZWlnaHQgLSBmaXhlZEhlaWdodCkgLyBtX1Jvd0hlaWdodCk7Ci0JCW1fUm93c0Z1bGx5VmlzaWJsZSA9IE1hdGgubWluKG1fUm93c0Z1bGx5VmlzaWJsZSwgbV9Nb2RlbC5nZXRSb3dDb3VudCgpIC0gbV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCkpOwotCQltX1Jvd3NGdWxseVZpc2libGUgPSBNYXRoLm1heCgwLCBtX1Jvd3NGdWxseVZpc2libGUpOwotCQltX1Jvd3NWaXNpYmxlID0gbV9Sb3dzRnVsbHlWaXNpYmxlICsgMTsKLQkJaWYgKG1fVG9wUm93ICsgbV9Sb3dzRnVsbHlWaXNpYmxlID4gbV9Nb2RlbC5nZXRSb3dDb3VudCgpKSB7Ci0JCQltX1RvcFJvdyA9IE1hdGgubWF4KG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpLCBtX01vZGVsLmdldFJvd0NvdW50KCkgLSBtX1Jvd3NGdWxseVZpc2libGUpOwotCQl9Ci0JCWlmIChtX1RvcFJvdyArIG1fUm93c0Z1bGx5VmlzaWJsZSA+PSBtX01vZGVsLmdldFJvd0NvdW50KCkpIHsKLQkJCW1fUm93c1Zpc2libGUtLTsKLQkJfQotCQlzYiA9IGdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChzYiAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHZpc2lhYmxlID0gISgobV9Nb2RlbC5nZXRSb3dDb3VudCgpKm1fTW9kZWwuZ2V0Um93SGVpZ2h0KCkrNSA8IHJlY3QuaGVpZ2h0KSAmJiAobV9Ub3BSb3cgPT0gbV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCkpKTsKLQkJCXNiLnNldFZpc2libGUodmlzaWFibGUpOwotCQkJaWYgKHZpc2lhYmxlKSB7Ci0JCQkJaWYgKG1fTW9kZWwuZ2V0Um93Q291bnQoKSA8PSBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSkgewotCQkJCQlzYi5zZXRNaW5pbXVtKDApOwotCQkJCQlzYi5zZXRNYXhpbXVtKDEpOwotCQkJCQlzYi5zZXRQYWdlSW5jcmVtZW50KDEpOwotCQkJCQlzYi5zZXRUaHVtYigxKTsKLQkJCQkJc2Iuc2V0U2VsZWN0aW9uKDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLnNldE1pbmltdW0obV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCkpOwotCQkJCQlzYi5zZXRNYXhpbXVtKG1fTW9kZWwuZ2V0Um93Q291bnQoKSk7Ci0JCQkJCXNiLnNldFBhZ2VJbmNyZW1lbnQobV9Sb3dzVmlzaWJsZSk7Ci0JCQkJCXNiLnNldEluY3JlbWVudCgxKTsKLQkJCQkJc2Iuc2V0VGh1bWIobV9Sb3dzRnVsbHlWaXNpYmxlKTsKLQkJCQkJc2Iuc2V0U2VsZWN0aW9uKG1fVG9wUm93KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIFJlY3RhbmdsZSBnZXRDZWxsUmVjdChpbnQgY29sLCBpbnQgcm93KSB7Ci0JCWludCBtX1Jvd0hlaWdodCA9IG1fTW9kZWwuZ2V0Um93SGVpZ2h0KCk7Ci0JCWlmICgoY29sIDwgMCkgfHwgKGNvbCA+PSBtX01vZGVsLmdldENvbHVtbkNvdW50KCkpKQotCQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoLTEsIC0xLCAwLCAwKTsKLQkJaW50IHggPSBnZXRDb2x1bW5MZWZ0KGNvbCkgKyAxOwotCQlpbnQgeTsKLQkJaWYgKHJvdyA9PSAwKQotCQkJeSA9IDA7Ci0JCWVsc2UgaWYgKHJvdyA8IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpKQotCQkJeSA9IHJvdyAqIG1fUm93SGVpZ2h0OwotCQllbHNlCi0JCQl5ID0gKG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpICsgcm93IC0gbV9Ub3BSb3cpICogbV9Sb3dIZWlnaHQ7Ci0JCWludCB3aWR0aCA9IG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGgoY29sKSAtIDE7Ci0JCWludCBoZWlnaHQgPSBtX1Jvd0hlaWdodCAtIDE7Ci0JCWlmIChyb3cgPT0gMCkKLQkJCWhlaWdodCA9IG1fUm93SGVpZ2h0IC0gMTsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGNhbkRyYXdDZWxsKGludCBjb2wsIGludCByb3csIFJlY3RhbmdsZSBjbGlwUmVjdCkgewotCQlSZWN0YW5nbGUgciA9IGdldENlbGxSZWN0KGNvbCwgcm93KTsKLQkJcmV0dXJuIGNhbkRyYXdDZWxsKHIsIGNsaXBSZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRHJhd0NlbGwoUmVjdGFuZ2xlIHIsIFJlY3RhbmdsZSBjbGlwUmVjdCkgewotCQlpZiAoci55ICsgci5oZWlnaHQgPCBjbGlwUmVjdC55KQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoci55ID4gY2xpcFJlY3QueSArIGNsaXBSZWN0LmhlaWdodCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHIueCArIHIud2lkdGggPCBjbGlwUmVjdC54KQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoci54ID4gY2xpcFJlY3QueCArIGNsaXBSZWN0LndpZHRoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIHZvaWQgcmVkcmF3KCkgewotCQlkb0NhbGN1bGF0aW9ucygpOwotCQlzdXBlci5yZWRyYXcoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgb25QYWludChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlpZiAobV9Nb2RlbCAhPSBudWxsKSB7Ci0JCQlkcmF3Q2VsbHMoZ2MsIGdjLmdldENsaXBwaW5nKCksIDAsIG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpLCAwLCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSk7Ci0JCQlkcmF3Q2VsbHMoZ2MsIGdjLmdldENsaXBwaW5nKCksIG1fTGVmdENvbHVtbiwgbV9Nb2RlbC5nZXRDb2x1bW5Db3VudCgpLCAwLCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSk7Ci0JCQlkcmF3Q2VsbHMoZ2MsIGdjLmdldENsaXBwaW5nKCksIDAsIG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpLCBtX1RvcFJvdywgbV9Ub3BSb3cgKyBtX1Jvd3NWaXNpYmxlKTsKLQkJCWRyYXdDZWxscyhnYywgZ2MuZ2V0Q2xpcHBpbmcoKSwgbV9MZWZ0Q29sdW1uLCBtX01vZGVsLmdldENvbHVtbkNvdW50KCksIG1fVG9wUm93LCBtX1RvcFJvdyArIG1fUm93c1Zpc2libGUpOwotCQkJZHJhd0JvdHRvbVNwYWNlKGdjKTsKLQkJfSBlbHNlIHsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JCX0KLQl9Ci0JLy8gQm90dG9tLVNwYWNlCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbVNwYWNlKEdDIGdjKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlpZiAobV9Nb2RlbC5nZXRSb3dDb3VudCgpID4gMCkgewotCQkJci55ID0gKG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpICsgbV9Sb3dzVmlzaWJsZSkgKiBtX01vZGVsLmdldFJvd0hlaWdodCgpICsgMTsKLQkJfQotCQlnYy5zZXRGb3JlZ3JvdW5kKG1fRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpKTsKLQkJZ2MuZHJhd0xpbmUoMCwgci55IC0gMiwgZ2V0TGFzdENvbHVtblJpZ2h0KCksIHIueSAtIDIpOwotCQlnYy5kcmF3TGluZShnZXRMYXN0Q29sdW1uUmlnaHQoKSwgMCwgZ2V0TGFzdENvbHVtblJpZ2h0KCksIHIueSAtIDIpOwotCX0KLQlwdWJsaWMgdm9pZCByZWRyYXcoUmVjdGFuZ2xlIGNlbGxzVG9SZWRyYXcpIHsKLQkJcmVkcmF3KGNlbGxzVG9SZWRyYXcueCwgY2VsbHNUb1JlZHJhdy55LCBjZWxsc1RvUmVkcmF3LndpZHRoLCBjZWxsc1RvUmVkcmF3LmhlaWdodCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlZHJhdyhpbnQgZmlyc3RDb2wsIGludCBmaXJzdFJvdywgaW50IG51bU9mQ29scywgaW50IG51bU9mUm93cykgewotCQlSZWN0YW5nbGUgY2xpcFJlY3QgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOwotCQlkcmF3Q2VsbHMoZ2MsIGNsaXBSZWN0LCBmaXJzdENvbCwgZmlyc3RDb2wgKyBudW1PZkNvbHMsIGZpcnN0Um93LCBmaXJzdFJvdyArIG51bU9mUm93cyk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd0NlbGxzKEdDIGdjLCBSZWN0YW5nbGUgY2xpcFJlY3QsIGludCBmcm9tQ29sLCBpbnQgdG9Db2wsIGludCBmcm9tUm93LCBpbnQgdG9Sb3cpIHsKLQkJaW50IGNudCA9IDA7Ci0JCVJlY3RhbmdsZSByOwotCQlpZiAobV9DZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmICghaXNDZWxsVmlzaWJsZShtX0NlbGxFZGl0b3IubV9Db2wsIG1fQ2VsbEVkaXRvci5tX1JvdykpIHsKLQkJCQlSZWN0YW5nbGUgaGlkZSA9IG5ldyBSZWN0YW5nbGUoLTEwMSwgLTEwMSwgMTAwLCAxMDApOwotCQkJCW1fQ2VsbEVkaXRvci5zZXRCb3VuZHMoaGlkZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1fQ2VsbEVkaXRvci5zZXRCb3VuZHMoZ2V0Q2VsbFJlY3QobV9DZWxsRWRpdG9yLm1fQ29sLCBtX0NlbGxFZGl0b3IubV9Sb3cpKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCByb3cgPSBmcm9tUm93OyByb3cgPCB0b1Jvdzsgcm93KyspIHsKLQkJCXIgPSBnZXRDZWxsUmVjdCgwLCByb3cpOwotCQkJaWYgKHIueSArIHIuaGVpZ2h0IDwgY2xpcFJlY3QueSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHIueSA+IGNsaXBSZWN0LnkgKyBjbGlwUmVjdC5oZWlnaHQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAoaW50IGNvbCA9IGZyb21Db2w7IGNvbCA8IHRvQ29sOyBjb2wrKykgewotCQkJCXIgPSBnZXRDZWxsUmVjdChjb2wsIHJvdyk7Ci0JCQkJaWYgKHIueCA+IGNsaXBSZWN0LnggKyBjbGlwUmVjdC53aWR0aCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNhbkRyYXdDZWxsKGNvbCwgcm93LCBjbGlwUmVjdCkpIHsKLQkJCQkJZHJhd0NlbGwoZ2MsIGNvbCwgcm93KTsKLQkJCQkJY250Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRyYXdDZWxsKEdDIGdjLCBpbnQgY29sLCBpbnQgcm93KSB7Ci0JCWlmICgocm93IDwgMCkgfHwgKHJvdyA+PSBtX01vZGVsLmdldFJvd0NvdW50KCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRDZWxsUmVjdChjb2wsIHJvdyk7Ci0JCW1fTW9kZWwuZ2V0Q2VsbFJlbmRlcmVyKGNvbCwgcm93KS5kcmF3Q2VsbChnYywgcmVjdCwgY29sLCByb3csIG1fTW9kZWwuZ2V0Q29udGVudEF0KGNvbCwgcm93KSwgc2hvd0FzU2VsZWN0ZWQoY29sLCByb3cpLCBjb2wgPCBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSB8fCByb3cgPCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSwgY29sID09IG1fQ2xpY2tDb2x1bW5JbmRleCAmJiByb3cgPT0gbV9DbGlja1Jvd0luZGV4KTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0FzU2VsZWN0ZWQoaW50IGNvbCwgaW50IHJvdykgewotCQkvLyBBIGNlbGwgd2l0aCBhbiBvcGVuIGVkaXRvciBzaG91bGQgYmUgZHJhd24gd2l0aG91dCBmb2N1cwotCQlpZiAobV9DZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChjb2wgPT0gbV9DZWxsRWRpdG9yLm1fQ29sICYmIHJvdyA9PSBtX0NlbGxFZGl0b3IubV9Sb3cpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBpc0NlbGxTZWxlY3RlZChjb2wsIHJvdyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRyYXdSb3coR0MgZ2MsIGludCByb3cpIHsKLQkJUmVjdGFuZ2xlIGNsaXBSZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlkcmF3Q2VsbHMoZ2MsIGNsaXBSZWN0LCAwLCBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSwgcm93LCByb3cgKyAxKTsKLQkJZHJhd0NlbGxzKGdjLCBjbGlwUmVjdCwgbV9MZWZ0Q29sdW1uLCBtX01vZGVsLmdldENvbHVtbkNvdW50KCksIHJvdywgcm93ICsgMSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRyYXdDb2woR0MgZ2MsIGludCBjb2wpIHsKLQkJUmVjdGFuZ2xlIGNsaXBSZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlkcmF3Q2VsbHMoZ2MsIGNsaXBSZWN0LCBjb2wsIGNvbCArIDEsIDAsIG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpKTsKLQkJZHJhd0NlbGxzKGdjLCBjbGlwUmVjdCwgY29sLCBjb2wgKyAxLCBtX1RvcFJvdywgbV9Ub3BSb3cgKyBtX1Jvd3NWaXNpYmxlKTsKLQl9Ci0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5Gb3JSZXNpemUoaW50IHgsIGludCB5KSB7Ci0JCWlmIChtX01vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCQotCQlpZiAoKHkgPD0gMCkgfHwgKHkgPj0gbV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCkgKiBtX01vZGVsLmdldFJvd0hlaWdodCgpKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHggPCBnZXRGaXhlZFdpZHRoKCkgKyAzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOyBpKyspCi0JCQkJaWYgKE1hdGguYWJzKHggLSBnZXRDb2x1bW5SaWdodChpKSkgPCAzKSB7Ci0JCQkJCWlmIChtX01vZGVsLmlzQ29sdW1uUmVzaXphYmxlKGkpKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IG1fTGVmdENvbHVtbjsgaSA8IG1fTW9kZWwuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQlpbnQgbGVmdCA9IGdldENvbHVtbkxlZnQoaSk7Ci0JCQlpbnQgcmlnaHQgPSBsZWZ0ICsgbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChpKTsKLQkJCWlmIChNYXRoLmFicyh4IC0gcmlnaHQpIDwgMykgewotCQkJCWlmIChtX01vZGVsLmlzQ29sdW1uUmVzaXphYmxlKGkpKQotCQkJCQlyZXR1cm4gaTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAoKHggPj0gbGVmdCArIDMpICYmICh4IDw9IHJpZ2h0IC0gMykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQlwcm90ZWN0ZWQgaW50IGdldFJvd0ZvclJlc2l6ZShpbnQgeCwgaW50IHkpIHsKLQkJaWYgKG1fTW9kZWwgPT0gbnVsbCB8fCAhbV9Nb2RlbC5pc1Jvd1Jlc2l6YWJsZSgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoKHggPD0gMCkgfHwgKHggPj0gZ2V0Rml4ZWRXaWR0aCgpKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHkgPCBtX01vZGVsLmdldFJvd0hlaWdodCgpKQotCQkJcmV0dXJuIC0xOwotCQlpbnQgcm93ID0gKHkgLyBtX01vZGVsLmdldFJvd0hlaWdodCgpKTsKLQkJaW50IHJvd1kgPSAocm93ICsgMSkgKiBtX01vZGVsLmdldFJvd0hlaWdodCgpOwotCQlpZiAoTWF0aC5hYnMocm93WSAtIHkpIDwgMykKLQkJCXJldHVybiByb3c7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSByb3cgdGhhdCBpcyBwcmVzZW50IGF0IHBvc2l0aW9uIHkgb3IgLTEsIGlmIG91dAotCSAqIG9mIGFyZWEuCi0JICogCi0JICogQHBhcmFtIHkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgY2FsY1Jvd051bShpbnQgeSkgewotCQlpZiAobV9Nb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoeSA8IG1fTW9kZWwuZ2V0Um93SGVpZ2h0KCkpCi0JCQlyZXR1cm4gKG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpID09IDAgPyBtX1RvcFJvdyA6IDApOwotCQl5IC09IG1fTW9kZWwuZ2V0Um93SGVpZ2h0KCk7Ci0JCWludCByb3cgPSAxICsgKHkgLyBtX01vZGVsLmdldFJvd0hlaWdodCgpKTsKLQkJaWYgKChyb3cgPCAwKSB8fCAocm93ID49IG1fTW9kZWwuZ2V0Um93Q291bnQoKSkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChyb3cgPj0gbV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCkpCi0JCQlyZXR1cm4gbV9Ub3BSb3cgKyByb3cgLSBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKTsKLQkJcmV0dXJuIHJvdzsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gdGhhdCBpcyBwcmVzZW50IGF0IHBvc2l0aW9uIHggb3IgLTEsIGlmCi0JICogb3V0IG9mIGFyZWEuCi0JICogCi0JICogQHBhcmFtIHkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgY2FsY0NvbHVtbk51bShpbnQgeCkgewotCQlpZiAobV9Nb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpbnQgY29sID0gMDsKLQkJaW50IHogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCWlmICgoeCA+PSB6KSAmJiAoeCA8PSB6ICsgbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChpKSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJCXogKz0gbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChpKTsKLQkJfQotCQljb2wgPSAtMTsKLQkJeiA9IGdldEZpeGVkV2lkdGgoKTsKLQkJZm9yIChpbnQgaSA9IG1fTGVmdENvbHVtbjsgaSA8IG1fTW9kZWwuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQlpZiAoKHggPj0geikgJiYgKHggPD0geiArIG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGgoaSkpKSB7Ci0JCQkJY29sID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXogKz0gbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aChpKTsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxWaXNpYmxlKGludCBjb2wsIGludCByb3cpIHsKLQkJaWYgKG1fTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoY29sID49IG1fTGVmdENvbHVtbiAmJiBjb2wgPCBtX0xlZnRDb2x1bW4gKyBtX0NvbHVtbnNWaXNpYmxlICYmIHJvdyA+PSBtX1RvcFJvdyAmJiByb3cgPCBtX1RvcFJvdyArIG1fUm93c1Zpc2libGUpIHx8IChjb2wgPCBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSAmJiByb3cgPCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxGdWxseVZpc2libGUoaW50IGNvbCwgaW50IHJvdykgewotCQlpZiAobV9Nb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChjb2wgPj0gbV9MZWZ0Q29sdW1uICYmIGNvbCA8IG1fTGVmdENvbHVtbiArIG1fQ29sdW1uc0Z1bGx5VmlzaWJsZSAmJiByb3cgPj0gbV9Ub3BSb3cgJiYgcm93IDwgbV9Ub3BSb3cgKyBtX1Jvd3NGdWxseVZpc2libGUpIHx8IChjb2wgPCBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSAmJiByb3cgPCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvd1Zpc2libGUoaW50IHJvdykgewotCQlpZiAobV9Nb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChyb3cgPj0gbV9Ub3BSb3cgJiYgcm93IDwgbV9Ub3BSb3cgKyBtX1Jvd3NWaXNpYmxlKSB8fCByb3cgPCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzUm93RnVsbHlWaXNpYmxlKGludCByb3cpIHsKLQkJaWYgKG1fTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgocm93ID49IG1fVG9wUm93ICYmIHJvdyA8IG1fVG9wUm93ICsgbV9Sb3dzRnVsbHlWaXNpYmxlKSB8fCByb3cgPCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGZvY3VzQ2VsbChpbnQgY29sLCBpbnQgcm93LCBpbnQgc3RhdGVNYXNrKSB7Ci0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOwotCQlpZiAobV9DZWxsRWRpdG9yICE9IG51bGwpCi0JCQltX0NlbGxFZGl0b3IuY2xvc2UodHJ1ZSk7Ci0KLQkJaWYgKHJvdyA+PSBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSAmJiAoY29sID49IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpIHx8IG1fUm93U2VsZWN0aW9uTW9kZSkpIHsKLQkJCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpID09IDAgJiYgKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgPT0gMCkgewotCQkJCS8vIGNhc2U6IG5vIG1vZGlmaWVyIGtleQotCQkJCWJvb2xlYW4gcmVkcmF3QWxsID0gKG1fU2VsZWN0aW9uLnNpemUoKSA+IDEpOwotCQkJCWludCBvbGRGb2N1c1JvdyA9IG1fRm9jdXNSb3c7Ci0JCQkJaW50IG9sZEZvY3VzQ29sID0gbV9Gb2N1c0NvbDsKLQkJCQljbGVhclNlbGVjdGlvbldpdGhvdXRSZWRyYXcoKTsKLQkJCQlhZGRUb1NlbGVjdGlvbihjb2wsIHJvdyk7Ci0JCQkJbV9Gb2N1c1JvdyA9IHJvdzsKLQkJCQltX0ZvY3VzQ29sID0gY29sOwotCQkJCWlmIChyZWRyYXdBbGwpIHsKLQkJCQkJcmVkcmF3KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG1fUm93U2VsZWN0aW9uTW9kZSkgewotCQkJCQlpZiAoaXNSb3dWaXNpYmxlKG9sZEZvY3VzUm93KSkKLQkJCQkJCWRyYXdSb3coZ2MsIG9sZEZvY3VzUm93KTsKLQkJCQkJaWYgKGlzUm93VmlzaWJsZShtX0ZvY3VzUm93KSkKLQkJCQkJCWRyYXdSb3coZ2MsIG1fRm9jdXNSb3cpOwotCQkJCQkKLQkJCQkJZHJhd0JvdHRvbVNwYWNlKGdjKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChpc0NlbGxWaXNpYmxlKG9sZEZvY3VzQ29sLCBvbGRGb2N1c1JvdykpCi0JCQkJCQlkcmF3Q2VsbChnYywgb2xkRm9jdXNDb2wsIG9sZEZvY3VzUm93KTsKLQkJCQkJaWYgKGlzQ2VsbFZpc2libGUobV9Gb2N1c0NvbCwgbV9Gb2N1c1JvdykpCi0JCQkJCQlkcmF3Q2VsbChnYywgbV9Gb2N1c0NvbCwgbV9Gb2N1c1Jvdyk7Ci0KLQkJCQkJZHJhd0JvdHRvbVNwYWNlKGdjKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHsKLQkJCQkvLyBjYXNlOiBDVFJMIGtleSBwcmVzc2VkCi0JCQkJaWYgKHRvZ2dsZVNlbGVjdGlvbihjb2wsIHJvdykpIHsKLQkJCQkJbV9Gb2N1c0NvbCA9IGNvbDsKLQkJCQkJbV9Gb2N1c1JvdyA9IHJvdzsKLQkJCQl9Ci0JCQkJaWYgKG1fUm93U2VsZWN0aW9uTW9kZSkgewotCQkJCQlkcmF3Um93KGdjLCByb3cpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZHJhd0NlbGwoZ2MsIGNvbCwgcm93KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICgoc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSB7Ci0JCQkJLy8gY2FzZTogU0hJRlQga2V5IHByZXNzZWQKLQkJCQlpZiAobV9Sb3dTZWxlY3Rpb25Nb2RlKSB7Ci0JCQkJCWlmIChyb3cgPCBtX0ZvY3VzUm93KSB7Ci0JCQkJCQkvLyBiYWNrd2FyZCBzZWxlY3Rpb24KLQkJCQkJCXdoaWxlIChyb3cgIT0gbV9Gb2N1c1JvdykgewotCQkJCQkJCWFkZFRvU2VsZWN0aW9uKDAsIC0tbV9Gb2N1c1Jvdyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBmb3J3YXJkIHNlbGVjdGlvbgotCQkJCQkJd2hpbGUgKHJvdyAhPSBtX0ZvY3VzUm93KSB7Ci0JCQkJCQkJYWRkVG9TZWxlY3Rpb24oMCwgKyttX0ZvY3VzUm93KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlICB7Ly8gY2VsbCBzZWxlY3Rpb24gbW9kZQotCQkJCQlpZiAocm93IDwgbV9Gb2N1c1JvdyB8fCAocm93ID09IG1fRm9jdXNSb3cgJiYgY29sIDwgbV9Gb2N1c0NvbCkpIHsKLQkJCQkJCS8vIGJhY2t3YXJkIHNlbGVjdGlvbgotCQkJCQkJd2hpbGUgKHJvdyAhPSBtX0ZvY3VzUm93IHx8IGNvbCAhPSBtX0ZvY3VzQ29sKSB7Ci0JCQkJCQkJbV9Gb2N1c0NvbC0tOwotCQkJCQkJCWlmIChtX0ZvY3VzQ29sIDwgbV9Nb2RlbC5nZXRGaXhlZENvbHVtbkNvdW50KCkpIHsKLQkJCQkJCQkJbV9Gb2N1c0NvbCA9IG1fTW9kZWwuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQkJCQkJbV9Gb2N1c1Jvdy0tOwotCQkJCQkJCX0KLQkJCQkJCQlhZGRUb1NlbGVjdGlvbihtX0ZvY3VzQ29sLCBtX0ZvY3VzUm93KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGZvcndhcmQgc2VsZWN0aW9uCi0JCQkJCQl3aGlsZSAocm93ICE9IG1fRm9jdXNSb3cgfHwgY29sICE9IG1fRm9jdXNDb2wpIHsKLQkJCQkJCQltX0ZvY3VzQ29sKys7Ci0JCQkJCQkJaWYgKG1fRm9jdXNDb2wgPT0gbV9Nb2RlbC5nZXRDb2x1bW5Db3VudCgpKSB7Ci0JCQkJCQkJCW1fRm9jdXNDb2wgPSBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKTsKLQkJCQkJCQkJbV9Gb2N1c1JvdysrOwotCQkJCQkJCX0KLQkJCQkJCQlhZGRUb1NlbGVjdGlvbihtX0ZvY3VzQ29sLCBtX0ZvY3VzUm93KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZWRyYXcoKTsKLQkJCX0KLQkJCS8vIG5vdGlmeSBub24tZml4ZWQgY2VsbCBsaXN0ZW5lcnMKLQkJCWZpcmVDZWxsU2VsZWN0aW9uKGNvbCwgcm93LCBzdGF0ZU1hc2spOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYSBmaXhlZCBjZWxsIHdhcyBmb2N1c2VkCi0JCQlkcmF3Q2VsbChnYywgY29sLCByb3cpOwotCQkJLy8gbm90aWZ5IGZpeGVkIGNlbGwgbGlzdGVuZXJzCi0JCQlmaXJlRml4ZWRDZWxsU2VsZWN0aW9uKGNvbCwgcm93LCBzdGF0ZU1hc2spOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgb25Nb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCWlmIChlLmJ1dHRvbiA9PSAxKSB7Ci0JCQkvLyBkZWFjdGl2YXRlRWRpdG9yKHRydWUpOwotCQkJc2V0Q2FwdHVyZSh0cnVlKTsKLQkJCS8vIFJlc2l6ZSBjb2x1bW4/Ci0JCQlpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5Gb3JSZXNpemUoZS54LCBlLnkpOwotCQkJaWYgKGNvbHVtbkluZGV4ID49IDApIHsKLQkJCQltX1Jlc2l6ZUNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JCQkJbV9SZXNpemVDb2x1bW5MZWZ0ID0gZ2V0Q29sdW1uTGVmdChjb2x1bW5JbmRleCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gUmVzaXplIHJvdz8KLQkJCWludCByb3dJbmRleCA9IGdldFJvd0ZvclJlc2l6ZShlLngsIGUueSk7Ci0JCQlpZiAocm93SW5kZXggPj0gMCkgewotCQkJCW1fUmVzaXplUm93SW5kZXggPSByb3dJbmRleDsKLQkJCQltX1Jlc2l6ZVJvd1RvcCA9IHJvd0luZGV4ICogbV9Nb2RlbC5nZXRSb3dIZWlnaHQoKTsKLQkJCQltX05ld1Jvd1NpemUgPSBtX01vZGVsLmdldFJvd0hlaWdodCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBmb2N1cyBjaGFuZ2UKLQkJaW50IGNvbCA9IGNhbGNDb2x1bW5OdW0oZS54KTsKLQkJaW50IHJvdyA9IGNhbGNSb3dOdW0oZS55KTsKLQkJaWYgKGNvbCA9PSAtMSB8fCByb3cgPT0gLTEpCi0JCQlyZXR1cm47Ci0JCW1fQ2xpY2tDb2x1bW5JbmRleCA9IGNvbDsKLQkJbV9DbGlja1Jvd0luZGV4ID0gcm93OwotCQlmb2N1c0NlbGwoY29sLCByb3csIGUuc3RhdGVNYXNrKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgb25Nb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCWlmIChtX01vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHNob3cgcmVzaXplIGN1cnNvcj8KLQkJaWYgKChtX1Jlc2l6ZUNvbHVtbkluZGV4ICE9IC0xKSB8fCAoZ2V0Q29sdW1uRm9yUmVzaXplKGUueCwgZS55KSA+PSAwKSkKLQkJCXNldEN1cnNvcihuZXcgQ3Vyc29yKG1fRGlzcGxheSwgU1dULkNVUlNPUl9TSVpFV0UpKTsKLQkJZWxzZSBpZiAoKG1fUmVzaXplUm93SW5kZXggIT0gLTEpIHx8IChnZXRSb3dGb3JSZXNpemUoZS54LCBlLnkpID49IDApKQotCQkJc2V0Q3Vyc29yKG5ldyBDdXJzb3IobV9EaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOUykpOwotCQllbHNlCi0JCQlzZXRDdXJzb3IobnVsbCk7Ci0JCWlmIChlLmJ1dHRvbiA9PSAxKSB7Ci0JCQkvLyBleHRlbmQgc2VsZWN0aW9uPwotCQkJaWYgKG1fQ2xpY2tDb2x1bW5JbmRleCAhPSAtMSAmJiBtX011bHRpU2VsZWN0TW9kZSkgewotCQkJCWludCByb3cgPSBjYWxjUm93TnVtKGUueSk7Ci0JCQkJaW50IGNvbCA9IGNhbGNDb2x1bW5OdW0oZS54KTsKLQkJCQlpZiAocm93ID49IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpICYmIGNvbCA+PSBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSkgewotCQkJCQltX0NsaWNrQ29sdW1uSW5kZXggPSBjb2w7Ci0JCQkJCW1fQ2xpY2tSb3dJbmRleCA9IHJvdzsKLQkJCQkJZm9jdXNDZWxsKGNvbCwgcm93LCAoZS5zdGF0ZU1hc2sgfCBTV1QuU0hJRlQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gY29sdW1uIHJlc2l6ZT8KLQkJaWYgKG1fUmVzaXplQ29sdW1uSW5kZXggIT0gLTEpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJaW50IG9sZFNpemUgPSBtX01vZGVsLmdldENvbHVtbldpZHRoKG1fUmVzaXplQ29sdW1uSW5kZXgpOwotCQkJaWYgKGUueCA+IHJlY3QueCArIHJlY3Qud2lkdGggLSAxKQotCQkJCWUueCA9IHJlY3QueCArIHJlY3Qud2lkdGggLSAxOwotCQkJaW50IG5ld1NpemUgPSBlLnggLSBtX1Jlc2l6ZUNvbHVtbkxlZnQ7Ci0JCQlpZiAobmV3U2l6ZSA8IG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGhNaW5pbXVtKCkpCi0JCQkJbmV3U2l6ZSA9IG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGhNaW5pbXVtKCk7Ci0KLQkJCWludCBsZWZ0WCA9IGdldENvbHVtbkxlZnQobV9SZXNpemVDb2x1bW5JbmRleCk7Ci0JCQlpbnQgcmlnaHRYID0gZ2V0Q29sdW1uUmlnaHQobV9SZXNpemVDb2x1bW5JbmRleCk7Ci0JCQltX01vZGVsLnNldENvbHVtbldpZHRoKG1fUmVzaXplQ29sdW1uSW5kZXgsIG5ld1NpemUpOwotCQkJbmV3U2l6ZSA9IG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGgobV9SZXNpemVDb2x1bW5JbmRleCk7Ci0JCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLQkJCWdjLmNvcHlBcmVhKHJpZ2h0WCwgMCwgcmVjdC53aWR0aCAtIHJpZ2h0WCwgcmVjdC5oZWlnaHQsIGxlZnRYICsgbmV3U2l6ZSwgMCk7Ci0JCQlkcmF3Q29sKGdjLCBtX1Jlc2l6ZUNvbHVtbkluZGV4KTsKLQkJCWlmIChuZXdTaXplIDwgb2xkU2l6ZSkgewotCQkJCWludCBkZWx0YSA9IG9sZFNpemUgLSBuZXdTaXplOwotCQkJCXJlZHJhdyhyZWN0LndpZHRoIC0gZGVsdGEsIDAsIGRlbHRhLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJfQotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JCS8vIHJvdyByZXNpemU/Ci0JCWlmIChtX1Jlc2l6ZVJvd0luZGV4ICE9IC0xKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldENsaWVudEFyZWEoKTsKLQkJCUdDIGdjID0gbmV3IEdDKHRoaXMpOwotCQkJLy8gY2FsY3VsYXRlIG5ldyBzaXplCi0JCQlpZiAoZS55ID4gcmVjdC55ICsgcmVjdC5oZWlnaHQgLSAxKQotCQkJCWUueSA9IHJlY3QueSArIHJlY3QuaGVpZ2h0IC0gMTsKLQkJCW1fTmV3Um93U2l6ZSA9IGUueSAtIG1fUmVzaXplUm93VG9wOwotCQkJaWYgKG1fTmV3Um93U2l6ZSA8IG1fTW9kZWwuZ2V0Um93SGVpZ2h0TWluaW11bSgpKQotCQkJCW1fTmV3Um93U2l6ZSA9IG1fTW9kZWwuZ2V0Um93SGVpZ2h0TWluaW11bSgpOwotCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQkJaW50IGxpbmVFbmQgPSBnZXRDb2x1bW5SaWdodChtX0xlZnRDb2x1bW4gKyBtX0NvbHVtbnNWaXNpYmxlIC0gMSk7Ci0JCQlpbnQgbV9MaW5lWCA9IHJlY3QueCArIDE7Ci0JCQlpbnQgbV9MaW5lWSA9IG1fUmVzaXplUm93VG9wICsgbV9OZXdSb3dTaXplIC0gMTsKLQkJCWdjLmRyYXdMaW5lKG1fTGluZVgsIG1fTGluZVksIHJlY3QueCArIGxpbmVFbmQsIG1fTGluZVkpOwotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIG9uTW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJaWYgKG1fTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc2V0Q2FwdHVyZShmYWxzZSk7Ci0JCWlmIChtX1Jlc2l6ZUNvbHVtbkluZGV4ICE9IC0xKSB7Ci0JCQlmaXJlQ29sdW1uUmVzaXplKG1fUmVzaXplQ29sdW1uSW5kZXgsIG1fTW9kZWwuZ2V0Q29sdW1uV2lkdGgobV9SZXNpemVDb2x1bW5JbmRleCkpOwotCQkJbV9SZXNpemVDb2x1bW5JbmRleCA9IC0xOwotCQkJcmVkcmF3KCk7Ci0JCX0KLQkJaWYgKG1fUmVzaXplUm93SW5kZXggIT0gLTEpIHsKLQkJCW1fUmVzaXplUm93SW5kZXggPSAtMTsKLQkJCW1fTW9kZWwuc2V0Um93SGVpZ2h0KG1fTmV3Um93U2l6ZSk7Ci0JCQlmaXJlUm93UmVzaXplKG1fTmV3Um93U2l6ZSk7Ci0JCQlyZWRyYXcoKTsKLQkJfQotCQlpZiAobV9DbGlja0NvbHVtbkluZGV4ICE9IC0xKSB7Ci0JCQlpbnQgY29sID0gbV9DbGlja0NvbHVtbkluZGV4OwotCQkJaW50IHJvdyA9IG1fQ2xpY2tSb3dJbmRleDsKLQkJCW1fQ2xpY2tDb2x1bW5JbmRleCA9IC0xOwotCQkJbV9DbGlja1Jvd0luZGV4ID0gLTE7Ci0JCQlpZiAobV9DZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQlkcmF3Q2VsbChuZXcgR0ModGhpcyksIGNvbCwgcm93KTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBvbktleURvd24oS2V5RXZlbnQgZSkgewotCQlib29sZWFuIGZvY3VzQ2hhbmdlZCA9IGZhbHNlOwotCQlpbnQgbmV3Rm9jdXNSb3cgPSBtX0ZvY3VzUm93OwotCQlpbnQgbmV3Rm9jdXNDb2wgPSBtX0ZvY3VzQ29sOwotCQlpZiAobV9Nb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoKGUuY2hhcmFjdGVyID09ICcgJykgfHwgKGUuY2hhcmFjdGVyID09ICdccicpKSB7Ci0JCQlvcGVuRWRpdG9ySW5Gb2N1cygpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSBTV1QuSE9NRSkgewotCQkJbmV3Rm9jdXNDb2wgPSBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKTsKLQkJCWlmIChuZXdGb2N1c1JvdyA9PSAtMSkKLQkJCQluZXdGb2N1c1JvdyA9IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpOwotCQkJZm9jdXNDaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gU1dULkVORCkgewotCQkJbmV3Rm9jdXNDb2wgPSBtX01vZGVsLmdldENvbHVtbkNvdW50KCkgLSAxOwotCQkJaWYgKG5ld0ZvY3VzUm93ID09IC0xKQotCQkJCW5ld0ZvY3VzUm93ID0gbV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCk7Ci0JCQlmb2N1c0NoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSBTV1QuQVJST1dfTEVGVCkgewotCQkJaWYgKCFtX1Jvd1NlbGVjdGlvbk1vZGUpIHsKLQkJCQlpZiAobmV3Rm9jdXNDb2wgPiBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSkKLQkJCQkJbmV3Rm9jdXNDb2wtLTsKLQkJCX0KLQkJCWZvY3VzQ2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZS5rZXlDb2RlID09IFNXVC5BUlJPV19SSUdIVCkgewotCQkJaWYgKCFtX1Jvd1NlbGVjdGlvbk1vZGUpIHsKLQkJCQlpZiAobmV3Rm9jdXNDb2wgPT0gLTEpIHsKLQkJCQkJbmV3Rm9jdXNDb2wgPSBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKTsKLQkJCQkJbmV3Rm9jdXNSb3cgPSBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKTsKLQkJCQl9IGVsc2UgaWYgKG5ld0ZvY3VzQ29sIDwgbV9Nb2RlbC5nZXRDb2x1bW5Db3VudCgpIC0gMSkKLQkJCQkJbmV3Rm9jdXNDb2wrKzsKLQkJCX0KLQkJCWZvY3VzQ2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZS5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7Ci0JCQlpZiAobmV3Rm9jdXNSb3cgPT0gLTEpIHsKLQkJCQluZXdGb2N1c1JvdyA9IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpOwotCQkJCW5ld0ZvY3VzQ29sID0gbV9Nb2RlbC5nZXRGaXhlZENvbHVtbkNvdW50KCk7Ci0JCQl9IGVsc2UgaWYgKG5ld0ZvY3VzUm93IDwgbV9Nb2RlbC5nZXRSb3dDb3VudCgpIC0gMSkKLQkJCQluZXdGb2N1c1JvdysrOwotCQkJZm9jdXNDaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gU1dULkFSUk9XX1VQKSB7Ci0JCQlpZiAobmV3Rm9jdXNSb3cgPiBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSkKLQkJCQluZXdGb2N1c1Jvdy0tOwotCQkJZm9jdXNDaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gU1dULlBBR0VfRE9XTikgewotCQkJbmV3Rm9jdXNSb3cgKz0gbV9Sb3dzVmlzaWJsZSAtIDE7Ci0JCQlpZiAobmV3Rm9jdXNSb3cgPj0gbV9Nb2RlbC5nZXRSb3dDb3VudCgpKQotCQkJCW5ld0ZvY3VzUm93ID0gbV9Nb2RlbC5nZXRSb3dDb3VudCgpIC0gMTsKLQkJCWlmIChuZXdGb2N1c0NvbCA9PSAtMSkKLQkJCQluZXdGb2N1c0NvbCA9IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOwotCQkJZm9jdXNDaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gU1dULlBBR0VfVVApIHsKLQkJCW5ld0ZvY3VzUm93IC09IG1fUm93c1Zpc2libGUgLSAxOwotCQkJaWYgKG5ld0ZvY3VzUm93IDwgbV9Nb2RlbC5nZXRGaXhlZFJvd0NvdW50KCkpCi0JCQkJbmV3Rm9jdXNSb3cgPSBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKTsKLQkJCWlmIChuZXdGb2N1c0NvbCA9PSAtMSkKLQkJCQluZXdGb2N1c0NvbCA9IG1fTW9kZWwuZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOwotCQkJZm9jdXNDaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAoZm9jdXNDaGFuZ2VkKSB7Ci0JCQlmb2N1c0NlbGwobmV3Rm9jdXNDb2wsIG5ld0ZvY3VzUm93LCBlLnN0YXRlTWFzayk7Ci0JCQlpZiAoIWlzQ2VsbEZ1bGx5VmlzaWJsZShtX0ZvY3VzQ29sLCBtX0ZvY3VzUm93KSkKLQkJCQlzY3JvbGxUb0ZvY3VzKCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgb25Nb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQlpZiAobV9Nb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZS5idXR0b24gPT0gMSkgewotCQkJaWYgKGUueSA8IChtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKSAqIG1fTW9kZWwuZ2V0Um93SGVpZ2h0KCkpKSB7Ci0JCQkJLy8gZG91YmxlIGNsaWNrIGluIGhlYWRlciBhcmVhCi0JCQkJaW50IGNvbHVtbkluZGV4ID0gZ2V0Q29sdW1uRm9yUmVzaXplKGUueCwgZS55KTsKLQkJCQlyZXNpemVDb2x1bW5PcHRpbWFsKGNvbHVtbkluZGV4KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvL0ZJWE1FOiBhc3N1bWUgY29sdW1uIDAgaXMgZml4ZWQgY29sdW1uLCBwcm9ibGVtIG1heSBvY2N1ciBvbiAyIGZpeGVkIGNvbHVtbnMgCi0JCQllbHNlIGlmIChlLnggPCBtX01vZGVsLmdldENvbHVtbldpZHRoKDApICsgKChtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSAtIDEpICogbV9Nb2RlbC5nZXRDb2x1bW5XaWR0aCgwKSkpIHsKLQkJCQkvLyBkb3VibGUgY2xpY2sgaW4gaGVhZGVyIGFyZWEKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlCi0JCQkJb3BlbkVkaXRvckluRm9jdXMoKTsKLQkJfQotCX0KLQlwdWJsaWMgaW50IHJlc2l6ZUNvbHVtbk9wdGltYWwoaW50IGNvbHVtbikgewotCQlpZiAoY29sdW1uID49IDAgJiYgY29sdW1uIDwgbV9Nb2RlbC5nZXRDb2x1bW5Db3VudCgpKSB7Ci0JCQlpbnQgb3B0V2lkdGggPSA1OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtX01vZGVsLmdldEZpeGVkUm93Q291bnQoKTsgaSsrKSB7Ci0JCQkJaW50IHdpZHRoID0gbV9Nb2RlbC5nZXRDZWxsUmVuZGVyZXIoY29sdW1uLCBpKS5nZXRPcHRpbWFsV2lkdGgobV9HQywgY29sdW1uLCBpLCBtX01vZGVsLmdldENvbnRlbnRBdChjb2x1bW4sIGkpLCB0cnVlKTsKLQkJCQlpZiAod2lkdGggPiBvcHRXaWR0aCkKLQkJCQkJb3B0V2lkdGggPSB3aWR0aDsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSBtX1RvcFJvdzsgaSA8IG1fVG9wUm93ICsgbV9Sb3dzVmlzaWJsZTsgaSsrKSB7Ci0JCQkJaW50IHdpZHRoID0gbV9Nb2RlbC5nZXRDZWxsUmVuZGVyZXIoY29sdW1uLCBpKS5nZXRPcHRpbWFsV2lkdGgobV9HQywgY29sdW1uLCBpLCBtX01vZGVsLmdldENvbnRlbnRBdChjb2x1bW4sIGkpLCB0cnVlKTsKLQkJCQlpZiAod2lkdGggPiBvcHRXaWR0aCkKLQkJCQkJb3B0V2lkdGggPSB3aWR0aDsKLQkJCX0KLQkJCW1fTW9kZWwuc2V0Q29sdW1uV2lkdGgoY29sdW1uLCBvcHRXaWR0aCk7Ci0JCQlyZWRyYXcoKTsKLQkJCXJldHVybiBvcHRXaWR0aDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3JJbkZvY3VzKCkgewotCQltX0NlbGxFZGl0b3IgPSBtX01vZGVsLmdldENlbGxFZGl0b3IobV9Gb2N1c0NvbCwgbV9Gb2N1c1Jvdyk7Ci0JCWlmIChtX0NlbGxFZGl0b3IgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHIgPSBnZXRDZWxsUmVjdChtX0ZvY3VzQ29sLCBtX0ZvY3VzUm93KTsKLQkJCW1fQ2VsbEVkaXRvci5vcGVuKHRoaXMsIG1fRm9jdXNDb2wsIG1fRm9jdXNSb3csIHIpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNjcm9sbFRvRm9jdXMoKSB7Ci0JCWJvb2xlYW4gY2hhbmdlID0gZmFsc2U7Ci0JCWlmIChnZXRWZXJ0aWNhbEJhcigpICE9IG51bGwpIHsKLQkJCWlmIChtX0ZvY3VzUm93IDwgbV9Ub3BSb3cpIHsKLQkJCQltX1RvcFJvdyA9IG1fRm9jdXNSb3c7Ci0JCQkJY2hhbmdlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChtX0ZvY3VzUm93ID49IG1fVG9wUm93ICsgbV9Sb3dzRnVsbHlWaXNpYmxlKSB7Ci0JCQkJbV9Ub3BSb3cgPSBtX0ZvY3VzUm93IC0gbV9Sb3dzRnVsbHlWaXNpYmxlICsgMTsKLQkJCQljaGFuZ2UgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChnZXRIb3Jpem9udGFsQmFyKCkgIT0gbnVsbCkgewotCQkJaWYgKG1fRm9jdXNDb2wgPCBtX0xlZnRDb2x1bW4pIHsKLQkJCQltX0xlZnRDb2x1bW4gPSBtX0ZvY3VzQ29sOwotCQkJCWNoYW5nZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAobV9Gb2N1c0NvbCA+PSBtX0xlZnRDb2x1bW4gKyBtX0NvbHVtbnNGdWxseVZpc2libGUpIHsKLQkJCQlpbnQgb2xkTGVmdENvbCA9IG1fTGVmdENvbHVtbjsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGdldENsaWVudEFyZWEoKTsKLQkJCQl3aGlsZSAobV9MZWZ0Q29sdW1uIDwgbV9Gb2N1c0NvbCAmJiBnZXRDb2x1bW5SaWdodChtX0ZvY3VzQ29sKSA+IHJlY3Qud2lkdGggKyByZWN0LngpIHsKLQkJCQkJbV9MZWZ0Q29sdW1uKys7Ci0JCQkJfQotCQkJCWNoYW5nZSA9IChvbGRMZWZ0Q29sICE9IG1fTGVmdENvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoYW5nZSkKLQkJCXJlZHJhdygpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ2VsbFNlbGVjdGlvbihpbnQgY29sLCBpbnQgcm93LCBpbnQgc3RhdGVtYXNrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2VsbFNlbGVjdGlvbkxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJKChJQ1RhYmxlQ2VsbFNlbGVjdGlvbkxpc3RlbmVyKSBjZWxsU2VsZWN0aW9uTGlzdGVuZXJzLmdldChpKSkuY2VsbFNlbGVjdGVkKGNvbCwgcm93LCBzdGF0ZW1hc2spOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGZpcmVGaXhlZENlbGxTZWxlY3Rpb24oaW50IGNvbCwgaW50IHJvdywgaW50IHN0YXRlbWFzaykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNlbGxTZWxlY3Rpb25MaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCSgoSUNUYWJsZUNlbGxTZWxlY3Rpb25MaXN0ZW5lcikgY2VsbFNlbGVjdGlvbkxpc3RlbmVycy5nZXQoaSkpLmZpeGVkQ2VsbFNlbGVjdGVkKGNvbCwgcm93LCBzdGF0ZW1hc2spOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGZpcmVDb2x1bW5SZXNpemUoaW50IGNvbCwgaW50IG5ld1NpemUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZWxsUmVzaXplTGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkoKElDVGFibGVDZWxsUmVzaXplTGlzdGVuZXIpIGNlbGxSZXNpemVMaXN0ZW5lcnMuZ2V0KGkpKS5jb2x1bW5SZXNpemVkKGNvbCwgbmV3U2l6ZSk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmlyZVJvd1Jlc2l6ZShpbnQgbmV3U2l6ZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNlbGxSZXNpemVMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCSgoSUNUYWJsZUNlbGxSZXNpemVMaXN0ZW5lcikgY2VsbFJlc2l6ZUxpc3RlbmVycy5nZXQoaSkpLnJvd1Jlc2l6ZWQobmV3U2l6ZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgYWRkQ2VsbFNlbGVjdGlvbkxpc3RlbmVyKElDVGFibGVDZWxsU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY2VsbFNlbGVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDZWxsU2VsZWN0aW9uTGlzdGVuZXIoSUNUYWJsZUNlbGxTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gY2VsbFNlbGVjdGlvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDZWxsUmVzaXplTGlzdGVuZXIoSUNUYWJsZUNlbGxSZXNpemVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gY2VsbFJlc2l6ZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRSb3dTZWxlY3Rpb25Nb2RlKGJvb2xlYW4gcm93U2VsZWN0TW9kZSkgewotCQltX1Jvd1NlbGVjdGlvbk1vZGUgPSByb3dTZWxlY3RNb2RlOwotCQljbGVhclNlbGVjdGlvbigpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRNdWx0aVNlbGVjdGlvbk1vZGUoYm9vbGVhbiBtdWx0aVNlbGVjdE1vZGUpIHsKLQkJbV9NdWx0aVNlbGVjdE1vZGUgPSBtdWx0aVNlbGVjdE1vZGU7Ci0JCWNsZWFyU2VsZWN0aW9uKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzUm93U2VsZWN0TW9kZSgpIHsKLQkJcmV0dXJuIG1fUm93U2VsZWN0aW9uTW9kZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVNlbGVjdE1vZGUoKSB7Ci0JCXJldHVybiBtX011bHRpU2VsZWN0TW9kZTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTZWxlY3Rpb25XaXRob3V0UmVkcmF3KCkgewotCQltX1NlbGVjdGlvbi5jbGVhcigpOwotCX0KLQlwdWJsaWMgdm9pZCBjbGVhclNlbGVjdGlvbigpIHsKLQkJY2xlYXJTZWxlY3Rpb25XaXRob3V0UmVkcmF3KCk7Ci0JCW1fRm9jdXNDb2wgPSAtMTsKLQkJbV9Gb2N1c1JvdyA9IC0xOwotCQlpZiAobV9NdWx0aVNlbGVjdE1vZGUpCi0JCQlyZWRyYXcoKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdG9nZ2xlU2VsZWN0aW9uKGludCBjb2wsIGludCByb3cpIHsKLQkJaWYgKG1fTXVsdGlTZWxlY3RNb2RlKSB7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludChjb2wsIHJvdyk7Ci0JCQlpZiAobV9TZWxlY3Rpb24uY29udGFpbnMocHQpKSB7Ci0JCQkJbV9TZWxlY3Rpb24ucmVtb3ZlKHB0KTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCW1fU2VsZWN0aW9uLmFkZChwdCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1NlbGVjdGlvbihpbnQgY29sLCBpbnQgcm93KSB7Ci0JCWlmIChtX011bHRpU2VsZWN0TW9kZSkgewotCQkJaWYgKG1fUm93U2VsZWN0aW9uTW9kZSkKLQkJCQljb2wgPSAwOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoY29sLCByb3cpOwotCQkJaWYgKCFtX1NlbGVjdGlvbi5jb250YWlucyhwdCkpIHsKLQkJCQltX1NlbGVjdGlvbi5hZGQocHQpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgY29sLCBpbnQgcm93LCBib29sZWFuIHNjcm9sbCkgewotCQlpZiAoY29sIDwgbV9Nb2RlbC5nZXRDb2x1bW5Db3VudCgpICYmIGNvbCA+PSBtX01vZGVsLmdldEZpeGVkQ29sdW1uQ291bnQoKSAmJiByb3cgPCBtX01vZGVsLmdldFJvd0NvdW50KCkgJiYgcm93ID49IG1fTW9kZWwuZ2V0Rml4ZWRSb3dDb3VudCgpKSB7Ci0JCQlmb2N1c0NlbGwoY29sLCByb3csIFNXVC5Ob25lKTsKLQkJCWlmIChzY3JvbGwpIHsKLQkJCQlzY3JvbGxUb0ZvY3VzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNDZWxsU2VsZWN0ZWQoaW50IGNvbCwgaW50IHJvdykgewotCQlpZiAoIW1fTXVsdGlTZWxlY3RNb2RlKSB7Ci0JCQlpZiAobV9Sb3dTZWxlY3Rpb25Nb2RlKQotCQkJCXJldHVybiAocm93ID09IG1fRm9jdXNSb3cpOwotCQkJcmV0dXJuIChjb2wgPT0gbV9Gb2N1c0NvbCAmJiByb3cgPT0gbV9Gb2N1c1Jvdyk7Ci0JCX0KLQkJaWYgKG1fUm93U2VsZWN0aW9uTW9kZSkKLQkJCWNvbCA9IDA7Ci0JCXJldHVybiBtX1NlbGVjdGlvbi5jb250YWlucyhuZXcgUG9pbnQoY29sLCByb3cpKTsKLQl9Ci0JcHVibGljIGludFtdIGdldFJvd1NlbGVjdGlvbigpIHsKLQkJaWYgKCFtX1Jvd1NlbGVjdGlvbk1vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFtX011bHRpU2VsZWN0TW9kZSkgewotCQkJaWYgKG1fRm9jdXNSb3cgPCAwKQotCQkJCXJldHVybiBuZXcgaW50WzBdOwotCQkJaW50W10gdG1wID0gbmV3IGludFsxXTsKLQkJCXRtcFswXSA9IG1fRm9jdXNSb3c7Ci0JCQlyZXR1cm4gdG1wOwotCQl9Ci0JCVBvaW50W10gcHRzID0gbV9TZWxlY3Rpb24udG9BcnJheShuZXcgUG9pbnRbMF0pOwotCQlpbnRbXSBlcmcgPSBuZXcgaW50W3B0cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVyZy5sZW5ndGg7IGkrKykgewotCQkJZXJnW2ldID0gcHRzW2ldLnk7Ci0JCX0KLQkJcmV0dXJuIGVyZzsKLQl9Ci0JcHVibGljIFBvaW50W10gZ2V0Q2VsbFNlbGVjdGlvbigpIHsKLQkJaWYgKG1fUm93U2VsZWN0aW9uTW9kZSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIW1fTXVsdGlTZWxlY3RNb2RlKSB7Ci0JCQlpZiAobV9Gb2N1c1JvdyA8IDAgfHwgbV9Gb2N1c0NvbCA8IDApCi0JCQkJcmV0dXJuIG5ldyBQb2ludFswXTsKLQkJCVBvaW50W10gdG1wID0gbmV3IFBvaW50WzFdOwotCQkJdG1wWzBdID0gbmV3IFBvaW50KG1fRm9jdXNDb2wsIG1fRm9jdXNSb3cpOwotCQkJcmV0dXJuIHRtcDsKLQkJfQotCQlyZXR1cm4gKFBvaW50W10pIG1fU2VsZWN0aW9uLnRvQXJyYXkobmV3IFBvaW50WzBdKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9DVGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZUNlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDlmNGIzLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGNsYXNzIENUYWJsZUNlbGxSZW5kZXJlciB7Ci0JcHVibGljIHN0YXRpYyBDVGFibGVDZWxsUmVuZGVyZXIgZGVmYXVsdFJlbmRlcmVyID0gbmV3IENUYWJsZUNlbGxSZW5kZXJlcigpOwotCXByb3RlY3RlZCBEaXNwbGF5IG1fRGlzcGxheSA9IG51bGw7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFBvaW50PiBzdHJpbmdFeHRlbnRDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgUG9pbnQ+KCk7Ci0KLQlwdWJsaWMgQ1RhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQltX0Rpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RyaW5nRXh0ZW50Q2FjaGUuY2xlYXIoKTsKLQl9Ci0JcHJpdmF0ZSBQb2ludCBnZXRTdHJpbmdFeHRlbnRDYWNoZShHQyBnYywgU3RyaW5nIHRleHQpIHsKLQkJUG9pbnQgcHQgPSBzdHJpbmdFeHRlbnRDYWNoZS5nZXQodGV4dCk7Ci0JCWlmIChwdCA9PSBudWxsKSB7Ci0JCQlwdCA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJCXN0cmluZ0V4dGVudENhY2hlLnB1dCh0ZXh0LCBwdCk7Ci0JCX0KLQkJcmV0dXJuIHB0OwotCX0KLQlwdWJsaWMgaW50IGdldE9wdGltYWxXaWR0aChHQyBnYywgaW50IGNvbCwgaW50IHJvdywgT2JqZWN0IGNvbnRlbnQsIGJvb2xlYW4gZml4ZWQpIHsKLQkJcmV0dXJuIGdjLnN0cmluZ0V4dGVudChjb250ZW50LnRvU3RyaW5nKCkpLnggKyA4OwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3Q2VsbChHQyBnYywgUmVjdGFuZ2xlIHJlY3QsIGludCBjb2wsIGludCByb3csIE9iamVjdCBjb250ZW50LCBib29sZWFuIGZvY3VzLCBib29sZWFuIGZpeGVkLCBib29sZWFuIGNsaWNrZWQpIHsKLQkJU3RyaW5nIHRleHQgPSBjb250ZW50LnRvU3RyaW5nKCk7Ci0JCWlmIChmaXhlZCkgewotCQkJaWYgKGNvbCA9PSAwICYmIHJvdyA9PSAwKQotCQkJCXRleHQgPSAiIjsKLQotCQkJcmVjdC5oZWlnaHQgKz0gMTsKLQkJCXJlY3Qud2lkdGggKz0gMTsKLQkJCWdjLnNldEZvcmVncm91bmQobV9EaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJCWlmIChjbGlja2VkKSB7Ci0JCQkJZHJhd1RleHQoZ2MsIHRleHQsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMSwgMSwgbV9EaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCksIG1fRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1cpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhd1RleHQoZ2MsIHRleHQsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMSwgMSwgbV9EaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCksIG1fRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1cpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUNvbG9yIHRleHRDb2xvcjsKLQkJCUNvbG9yIGJhY2tDb2xvcjsKLQkJCUNvbG9yIHZCb3JkZXJDb2xvcjsKLQkJCUNvbG9yIGhCb3JkZXJDb2xvcjsKLQkJCWlmIChmb2N1cykgewotCQkJCXRleHRDb2xvciA9IG1fRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCk7Ci0JCQkJYmFja0NvbG9yID0gKG1fRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pKTsKLQkJCQl2Qm9yZGVyQ29sb3IgPSBtX0Rpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OKTsKLQkJCQloQm9yZGVyQ29sb3IgPSBtX0Rpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dENvbG9yID0gbV9EaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQkJCWJhY2tDb2xvciA9IG1fRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJCQl2Qm9yZGVyQ29sb3IgPSBtX0Rpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKTsKLQkJCQloQm9yZGVyQ29sb3IgPSBtX0Rpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKTsKLQkJCX0KLQkJCWdjLnNldEZvcmVncm91bmQoaEJvcmRlckNvbG9yKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QueCwgcmVjdC55ICsgcmVjdC5oZWlnaHQsIHJlY3QueCArIHJlY3Qud2lkdGgsIHJlY3QueSArIHJlY3QuaGVpZ2h0KTsKLQkJCWdjLnNldEZvcmVncm91bmQodkJvcmRlckNvbG9yKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QueCArIHJlY3Qud2lkdGgsIHJlY3QueSwgcmVjdC54ICsgcmVjdC53aWR0aCwgcmVjdC55ICsgcmVjdC5oZWlnaHQpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrQ29sb3IpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCh0ZXh0Q29sb3IpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLQkJCWRyYXdUZXh0KGdjLCB0ZXh0LCByZWN0LnggKyAzLCByZWN0LnksIHJlY3Qud2lkdGggLSAzLCByZWN0LmhlaWdodCwgMCwgMCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KEdDIGdjLCBTdHJpbmcgdGV4dCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBsZWZ0TWFyZ2luLCBpbnQgdG9wTWFyZ2luLCBDb2xvciBmYWNlLCBDb2xvciBzaGFkb3cpIHsKLQkJQ29sb3IgcHJldkZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCUNvbG9yIHByZXZCYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQl0cnkgewotCQkJZ2Muc2V0QmFja2dyb3VuZChmYWNlKTsKLQkJCWdjLnNldEZvcmVncm91bmQoc2hhZG93KTsKLQkJCWdjLmRyYXdSZWN0YW5nbGUoeC0xLCB5LTEsIHcsIGgpOwotCQkJLy9nYy5maWxsUmVjdGFuZ2xlKHggKyAxLCB5ICsgMSwgMSArIGxlZnRNYXJnaW4sIGgpOwotCQkJLy9nYy5maWxsUmVjdGFuZ2xlKHggKyAxLCB5ICsgMSwgdyAtIDIsIHRvcE1hcmdpbiArIDEpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChwcmV2Rm9yZWdyb3VuZCk7Ci0JCQlkcmF3VGV4dChnYywgdGV4dCwgeCwgeSwgdywgaCwgbGVmdE1hcmdpbiwgdG9wTWFyZ2luKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdjLnNldEZvcmVncm91bmQocHJldkZvcmVncm91bmQpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChwcmV2QmFja2dyb3VuZCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KEdDIGdjLCBTdHJpbmcgdGV4dCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBsZWZ0TWFyZ2luLCBpbnQgdG9wTWFyZ2luKSB7Ci0JCVBvaW50IHB0ID0gZ2V0U3RyaW5nRXh0ZW50Q2FjaGUoZ2MsIHRleHQpOwotCQlpZiAocHQueCA+IHctbGVmdE1hcmdpbikgewotCQkJdGV4dCA9ICIuLi4iOwotCQkJcHQgPSBnZXRTdHJpbmdFeHRlbnRDYWNoZShnYywgdGV4dCk7Ci0JCX0KLQkJZ2MuZHJhd1RleHQodGV4dCwgeCsody1wdC54KS8yK2xlZnRNYXJnaW4sIHkrKGgtcHQueSkvMit0b3BNYXJnaW4pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZUNvbWJvQ2VsbEVkaXRvci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQ1RhYmxlQ29tYm9DZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzYwNDkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvQ1RhYmxlQ29tYm9DZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ1RhYmxlQ29tYm9DZWxsRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3RDVGFibGVDZWxsRWRpdG9yIHsKLQlwcml2YXRlIENDb21ibyBtX0NvbWJvOwotCXByaXZhdGUgU3RyaW5nIG1fSXRlbXNbXTsKLQlwdWJsaWMgdm9pZCBvcGVuKENUYWJsZSB0YWJsZSwgaW50IHJvdywgaW50IGNvbCwgUmVjdGFuZ2xlIHJlY3QpIHsKLQkJc3VwZXIub3Blbih0YWJsZSwgcm93LCBjb2wsIHJlY3QpOwotCQltX0NvbWJvLnNldEZvY3VzKCk7Ci0JCW1fQ29tYm8uc2V0VGV4dCgoU3RyaW5nKSBtX01vZGVsLmdldENvbnRlbnRBdChtX0NvbCwgbV9Sb3cpKTsKLQl9Ci0JcHVibGljIHZvaWQgY2xvc2UoYm9vbGVhbiBzYXZlKSB7Ci0JCWlmIChzYXZlKQotCQkJbV9Nb2RlbC5zZXRDb250ZW50QXQobV9Db2wsIG1fUm93LCBtX0NvbWJvLmdldFRleHQoKSk7Ci0JCXN1cGVyLmNsb3NlKHNhdmUpOwotCQltX0NvbWJvID0gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbCgpIHsKLQkJbV9Db21ibyA9IG5ldyBDQ29tYm8obV9UYWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCW1fQ29tYm8uc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWlmIChtX0l0ZW1zICE9IG51bGwpCi0JCQltX0NvbWJvLnNldEl0ZW1zKG1fSXRlbXMpOwotCQltX0NvbWJvLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb25LZXlQcmVzc2VkKGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBtX0NvbWJvOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdGFuZ2xlIHJlY3QpIHsKLQkJc3VwZXIuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUocmVjdC54LCByZWN0LnkgKyAxLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCAtIDIpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nIGl0ZW1zW10pIHsKLQkJbV9JdGVtcyA9IGl0ZW1zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZVRleHRDZWxsRWRpdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9DVGFibGVUZXh0Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQwM2JhLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0NUYWJsZVRleHRDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDVGFibGVUZXh0Q2VsbEVkaXRvciBleHRlbmRzIEFic3RyYWN0Q1RhYmxlQ2VsbEVkaXRvciB7Ci0JcHJpdmF0ZSBUZXh0IG1fVGV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZWRpdGFibGU7Ci0JcHVibGljIENUYWJsZVRleHRDZWxsRWRpdG9yKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCX0KLQlwdWJsaWMgdm9pZCBvcGVuKENUYWJsZSB0YWJsZSwgaW50IGNvbCwgaW50IHJvdywgUmVjdGFuZ2xlIHJlY3QpIHsKLQkJc3VwZXIub3Blbih0YWJsZSwgY29sLCByb3csIHJlY3QpOwotCQltX1RleHQuc2V0VGV4dChtX01vZGVsLmdldENvbnRlbnRBdChtX0NvbCwgbV9Sb3cpLnRvU3RyaW5nKCkpOwotCQltX1RleHQuc2VsZWN0QWxsKCk7Ci0JCW1fVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQltX1RleHQuc2V0Rm9jdXMoKTsKLQl9Ci0JcHVibGljIHZvaWQgY2xvc2UoYm9vbGVhbiBzYXZlKSB7Ci0JCWlmIChzYXZlKQotCQkJbV9Nb2RlbC5zZXRDb250ZW50QXQobV9Db2wsIG1fUm93LCBtX1RleHQuZ2V0VGV4dCgpKTsKLQkJc3VwZXIuY2xvc2Uoc2F2ZSk7Ci0JCW1fVGV4dCA9IG51bGw7Ci0JfQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCW1fVGV4dCA9IG5ldyBUZXh0KG1fVGFibGUsIFNXVC5OT05FKTsKLQkJbV9UZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJbV9UZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb25LZXlQcmVzc2VkKGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLQkJCX0KLQkJfSk7Ci0JCW1fVGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgYXJnMCkgewotCQkJCW9uVHJhdmVyc2UoYXJnMCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbV9UZXh0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdGFuZ2xlIHJlY3QpIHsKLQkJc3VwZXIuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUocmVjdC54LCByZWN0LnkgKyAocmVjdC5oZWlnaHQgLSAxNSkgLyAyICsgMSwgcmVjdC53aWR0aCwgMTUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9JQ1RhYmxlQ2VsbFJlc2l6ZUxpc3RlbmVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9JQ1RhYmxlQ2VsbFJlc2l6ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjcwZmIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvSUNUYWJsZUNlbGxSZXNpemVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3M7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDVGFibGVDZWxsUmVzaXplTGlzdGVuZXIgewotCXZvaWQgcm93UmVzaXplZChpbnQgbmV3SGVpZ2h0KTsKLQl2b2lkIGNvbHVtblJlc2l6ZWQoaW50IGNvbCwgaW50IG5ld1dpZHRoKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0lDVGFibGVDZWxsU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0lDVGFibGVDZWxsU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxZDgwZC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9JQ1RhYmxlQ2VsbFNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNUYWJsZUNlbGxTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCBjZWxsU2VsZWN0ZWQoaW50IGNvbCwgaW50IHJvdywgaW50IHN0YXRlbWFzayk7Ci0Jdm9pZCBmaXhlZENlbGxTZWxlY3RlZChpbnQgY29sLCBpbnQgcm93LCBpbnQgc3RhdGVtYXNrKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL0lDVGFibGVNb2RlbC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvSUNUYWJsZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmZhZTkuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvSUNUYWJsZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNUYWJsZU1vZGVsIHsKLQlPYmplY3QgZ2V0Q29udGVudEF0KGludCBjb2wsIGludCByb3cpOwotCUFic3RyYWN0Q1RhYmxlQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKGludCBjb2wsIGludCByb3cpOwotCWludCBnZXRSb3dDb3VudCgpOwotCWludCBnZXRGaXhlZFJvd0NvdW50KCk7Ci0JaW50IGdldENvbHVtbkNvdW50KCk7Ci0JaW50IGdldEZpeGVkQ29sdW1uQ291bnQoKTsKLQlpbnQgZ2V0Q29sdW1uV2lkdGgoaW50IGNvbCk7Ci0JYm9vbGVhbiBpc0NvbHVtblJlc2l6YWJsZShpbnQgY29sKTsKLQl2b2lkIHNldENvbHVtbldpZHRoKGludCBjb2wsIGludCB2YWx1ZSk7Ci0JaW50IGdldFJvd0hlaWdodCgpOwotCWJvb2xlYW4gaXNSb3dSZXNpemFibGUoKTsKLQlpbnQgZ2V0Um93SGVpZ2h0TWluaW11bSgpOwotCWludCBnZXRDb2x1bW5XaWR0aE1pbmltdW0oKTsKLQl2b2lkIHNldFJvd0hlaWdodChpbnQgdmFsdWUpOwotCUNUYWJsZUNlbGxSZW5kZXJlciBnZXRDZWxsUmVuZGVyZXIoaW50IGNvbCwgaW50IHJvdyk7Ci0Jdm9pZCBzZXRDb250ZW50QXQoaW50IGNvbCwgaW50IHJvdywgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL1BUYWJGb2xkZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL1BUYWJGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0NmViYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9QVGFiRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSVBUUFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXIyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUFRhYkZvbGRlciBleHRlbmRzIEFic3RyYWN0UGFyYWxsZWxWaWV3IHsKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgUFRhYkl0ZW0+IGl0ZW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQVGFiSXRlbT4oKTsKLQlwcm90ZWN0ZWQgQ1RhYkZvbGRlciBmb2xkZXIgPSBudWxsOwotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgU1dULlRPUCk7Ci0JCWZvbGRlci5zZXRCb3JkZXJWaXNpYmxlKHRydWUpOwotCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZvbGRlci5zZXRTaW1wbGUoZmFsc2UpOwotCSAgICBmb2xkZXIuc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZShmYWxzZSk7Ci0JICAgIGZvbGRlci5zZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKGZhbHNlKTsKLQkgICAgCi0JICAgIGZvbGRlci5zZXRNaW5pbWl6ZVZpc2libGUodHJ1ZSk7Ci0JICAgIGZvbGRlci5zZXRNYXhpbWl6ZVZpc2libGUodHJ1ZSk7Ci0JICAgIGZvbGRlci5hZGRDVGFiRm9sZGVyMkxpc3RlbmVyKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7Ci0JICAgIAlwdWJsaWMgdm9pZCBtaW5pbWl6ZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkgICAgCQlmb2xkZXIuc2V0TWluaW1pemVkKHRydWUpOwotCSAgICAJfQotCSAgICAJcHVibGljIHZvaWQgbWF4aW1pemUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JICAgIAkJZm9sZGVyLnNldE1heGltaXplZCh0cnVlKTsKLQkgICAgCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JICAgIAl9Ci0JICAgIAlwdWJsaWMgdm9pZCByZXN0b3JlKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCSAgICAJCWZvbGRlci5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotCSAgICAJCWZvbGRlci5zZXRNYXhpbWl6ZWQoZmFsc2UpOwotCSAgICAJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JICAgIAl9Ci0JICAgIH0pOwotCSAgICBjcmVhdGVUb29sQmFyTWVudShnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlVG9vbEJhck1lbnUoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IpIHsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQRGVidWdVSUNvbnN0YW50cy5JVUlUQUJWQVJJQUJMRUdST1VQKSk7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUERlYnVnVUlDb25zdGFudHMuSVVJVEFCRU1QVFlHUk9VUCkpOwotCQljb25maWd1cmVUb29sQmFyKHRvb2xCYXJNZ3IpOwotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVUb29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJZm9sZGVyLnNldEZvY3VzKCk7Ci0JfQotCQotCXB1YmxpYyBDVGFiRm9sZGVyIGdldFRhYkZvbGRlcigpIHsKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2xvc2VBbGxUYWJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JcHVibGljIHZvaWQgY2xvc2VUYWIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpCi0JCQlpdGVtcy5yZW1vdmUobmFtZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGNsb3NlQWxsVGFicygpIHsKLQkJZm9yIChQVGFiSXRlbSBpdGVtIDogZ2V0SXRlbXMoKSkgewotCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCX0KLQkJaXRlbXMuY2xlYXIoKTsKLQl9Ci0JcHVibGljIFBUYWJJdGVtW10gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBpdGVtcy52YWx1ZXMoKS50b0FycmF5KG5ldyBQVGFiSXRlbVswXSk7Ci0JfQotCXB1YmxpYyBQVGFiSXRlbSBnZXRUYWIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGl0ZW1zLmdldChuYW1lKTsKLQl9Ci0JcHVibGljIElQU3RhY2tGcmFtZSBnZXRTdGFja0ZyYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmdldFNlbGVjdGlvbihJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUFN0YWNrRnJhbWUpIHsKLQkJCQlyZXR1cm4gKElQU3RhY2tGcmFtZSlvYmo7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV2luZG93ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsICJObyBhY3RpdmUgd2luZG93IGZvdW5kIiwgbnVsbCkpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGFjdGl2ZVdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChwYWdlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsICJObyBhY3RpdmUgcGFnZSBmb3VuZCIsIG51bGwpKTsJCi0KLQkJSVZpZXdQYXJ0IHBhcnQgPSBwYWdlLmZpbmRWaWV3KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcpOwotCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQlJRGVidWdWaWV3IGFkYXB0ZXIgPSAoSURlYnVnVmlldylwYXJ0LmdldEFkYXB0ZXIoSURlYnVnVmlldy5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7CQkJCQotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gYWRhcHRlci5nZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlPYmplY3Qgb2JqID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUFN0YWNrRnJhbWUpIHsKLQkJCQkJCXJldHVybiAoSVBTdGFja0ZyYW1lKW9iajsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkqLwotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBUUERlYnVnVUlQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsICJObyBzdGFjayBmcmFtZSBmb3VuZCIsIG51bGwpKTsKLQl9CQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZVRhYkl0ZW0oU3RyaW5nIHRhYk5hbWUsIE9iamVjdCBzZWxlY3Rpb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL1BUYWJJdGVtLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9QVGFiSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNmOWYwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL1BUYWJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQVGFiSXRlbSBpbXBsZW1lbnRzIElSdW5uYWJsZUNvbnRleHQgewotCXByb3RlY3RlZCBDVGFiSXRlbSB0YWJJdGVtID0gbnVsbDsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgZlBhZ2VCb29rID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dFZpZXdlciBmVGV4dFZpZXdlciA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUVycm9yID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFBUYWJGb2xkZXIgdmlldyA9IG51bGw7Ci0JCi0JcHVibGljIFBUYWJJdGVtKFBUYWJGb2xkZXIgdmlldykgewotCQl0aGlzKHZpZXcsICIiKTsKLQl9Ci0JcHVibGljIFBUYWJJdGVtKFBUYWJGb2xkZXIgdmlldywgU3RyaW5nIHRhYk5hbWUpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJdGFiSXRlbSA9IG5ldyBDVGFiSXRlbSh2aWV3LmdldFRhYkZvbGRlcigpLCBTV1QuQ0xPU0UpOwotCQl0YWJJdGVtLnNldFRleHQodGFiTmFtZSk7Ci0JCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQodGFiTmFtZSk7Ci0JCXRhYkl0ZW0uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwdWJsaWMgQ1RhYkl0ZW0gZ2V0VGFiSXRlbSgpIHsKLQkJcmV0dXJuIHRhYkl0ZW07Ci0JfQotCXB1YmxpYyB2b2lkIHNldENvbnRyb2woKSB7Ci0JICAgIHRhYkl0ZW0uc2V0Q29udHJvbChjcmVhdGVDb250cm9sKHRhYkl0ZW0uZ2V0UGFyZW50KCkpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYWJOYW1lKFN0cmluZyB0YWJOYW1lKSB7Ci0JCXRhYkl0ZW0uc2V0VGV4dCh0YWJOYW1lKTsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzcG9zZSgpOwotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CQotCQlmUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUVycm9yUGFnZShmUGFnZUJvb2spOwotCQljcmVhdGVUYWJQYWdlKGZQYWdlQm9vayk7Ci0JCXJldHVybiBmUGFnZUJvb2s7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVycm9yUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmVGV4dFZpZXdlciA9PSBudWxsKSB7Ci0JCQlmVGV4dFZpZXdlciA9IG5ldyBUZXh0Vmlld2VyKHBhcmVudCwgU1dULldSQVApOwkKLQkJCWZUZXh0Vmlld2VyLnNldERvY3VtZW50KG5ldyBEb2N1bWVudCgpKTsKLQkJCVN0eWxlZFRleHQgc3R5bGVUZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJc3R5bGVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXN0eWxlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoRXhjZXB0aW9uIGUpIHsKLQkJZGlzcGxheUVycm9yID0gdHJ1ZTsKLQkJU3R5bGVkVGV4dCBzdHlsZVRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmIChzdHlsZVRleHQgIT0gbnVsbCkKLQkJCXN0eWxlVGV4dC5zZXRUZXh0KCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQotCQlmUGFnZUJvb2suc2hvd1BhZ2UoZlRleHRWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJY2xlYXJDb250ZXh0KCk7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZVRhYlBhZ2UoQ29tcG9zaXRlIHBhcmVudCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xlYXJDb250ZXh0KCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzcGxheVRhYigpOwotCQotCXB1YmxpYyBQb2ludCBnZXRUZXh0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEdDKGNvbXBvc2l0ZSkudGV4dEV4dGVudCh0ZXh0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZlBhZ2VCb29rLmdldFNoZWxsKCkpLnJ1bihmb3JrLCBjYW5jZWxhYmxlLCBydW5uYWJsZSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL2FycmF5L0Fic3RyYWN0QXJyYXlUYWJsZU1vZGVsLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BYnN0cmFjdEFycmF5VGFibGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc1OTFkLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL2FycmF5L0Fic3RyYWN0QXJyYXlUYWJsZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5hcnJheTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5BYnN0cmFjdENUYWJsZUNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLkNUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuSUNUYWJsZU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXJyYXlUYWJsZU1vZGVsIGltcGxlbWVudHMgSUNUYWJsZU1vZGVsIHsKLQlwcm90ZWN0ZWQgaW50IGNvbFdpZHRoID0gMzA7Ci0JcHJvdGVjdGVkIGludCByb3dIZWlnaHQgPSAyMDsKLQlwcm90ZWN0ZWQgaW50IHJvd3MgPSAxOwotCXByb3RlY3RlZCBpbnQgY29scyA9IDE7Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEF0KGludCBjb2wsIGludCByb3csIE9iamVjdCB2YWx1ZSkge30KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5XaWR0aChpbnQgY29sLCBpbnQgdmFsdWUpIHsKLQkJY29sV2lkdGggPSB2YWx1ZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Um93SGVpZ2h0KGludCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPCBnZXRSb3dIZWlnaHRNaW5pbXVtKCkpIHsKLQkJCXZhbHVlID0gZ2V0Um93SGVpZ2h0TWluaW11bSgpOwotCQl9Ci0JCXJvd0hlaWdodCA9IHZhbHVlOwotCX0KLQlwdWJsaWMgQWJzdHJhY3RDVGFibGVDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoaW50IGNvbCwgaW50IHJvdykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIGludCBnZXRGaXhlZFJvd0NvdW50KCkgewotCQlyZXR1cm4gMTsKLQl9Ci0JcHVibGljIGludCBnZXRGaXhlZENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gMTsKLQl9Ci0JcHVibGljIGludCBnZXRDb2x1bW5XaWR0aChpbnQgY29sKSB7Ci0JCXJldHVybiBjb2xXaWR0aDsKLQl9Ci0JcHVibGljIGludCBnZXRSb3dIZWlnaHQoKSB7Ci0JCXJldHVybiByb3dIZWlnaHQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQ29sdW1uUmVzaXphYmxlKGludCBjb2wpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0Rmlyc3RSb3dIZWlnaHQoKSB7Ci0JCXJldHVybiAyMDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNSb3dSZXNpemFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGludCBnZXRSb3dIZWlnaHRNaW5pbXVtKCkgewotCQlyZXR1cm4gMTg7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uV2lkdGhNaW5pbXVtKCkgewotCQlyZXR1cm4gMjA7Ci0JfQotCXB1YmxpYyBDVGFibGVDZWxsUmVuZGVyZXIgZ2V0Q2VsbFJlbmRlcmVyKGludCBjb2wsIGludCByb3cpIHsKLQkJcmV0dXJuIENUYWJsZUNlbGxSZW5kZXJlci5kZWZhdWx0UmVuZGVyZXI7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0JCXJldHVybiByb3dzOwotCX0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gY29sczsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheU1lc3NhZ2VzLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjgwMGMuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvYXJyYXkvQXJyYXlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5hcnJheTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheU1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmFycmF5LkFycmF5TWVzc2FnZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEFycmF5TWVzc2FnZXMoKSB7fQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNjE2ODQuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvYXJyYXkvQXJyYXlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAjIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAjIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAjIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAjIAotICMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAjIAotICMgTEEtQ0MgMDQtMTE1Ci0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSAjIEBhdXRob3IgQ2xlbWVudAotICMKLSAjIwotQXJyYXlUYWJJdGVtLmluaXRSb3c9SW5pdGlhbGluZyByb3cgaGVhZGVycy4uLgotQXJyYXlUYWJJdGVtLmluaXRDb2w9SW5pdGlhbGluZyBjb2x1bW4gaGVhZGVycy4uLgotQXJyYXlUYWJJdGVtLnVwZGF0ZVRhYmxlPVVwZGF0aW5nIHRoZSBhcnJheSB0YWJsZS4uLgotQXJyYXlUYWJJdGVtLmluaXRWYXJpYWJsZT1Jbml0aWFsaW5nIHZhcmlhYmxlcy4uLgotQXJyYXlUYWJJdGVtLmluaXRDb21ib2JveD1Jbml0aWFsaW5nIGNvbWJvIGJveGVzLi4uCi1BcnJheVRhYkl0ZW0uY3JlYXRpbmdDb21ib2JveD1DcmVhdGluZyBjb21ibyBib3hlcy4uLgotQXJyYXlUYWJJdGVtLmRvbmU9RG9uZQotQXJyYXlUYWJJdGVtLmNhbmNlbD1DYW5jZWxsZWQgYnkgdXNlcgotQXJyYXlUYWJJdGVtLnJlc2V0UmFuZ2U9UmVzZXQgcmFuZ2UgCi1BcnJheVRhYkl0ZW0uY29sSGVhZD1Db2wKLUFycmF5VGFiSXRlbS5yb3dIZWFkPVJvdwotQXJyYXlUYWJJdGVtLnNob3dUYWJsZT1TaG93IHRhYmxlCi1BcnJheVRhYkl0ZW0ubm9JbmRleEVyclRpdGxlPUVycm9yCi1BcnJheVRhYkl0ZW0ubm9JbmRleEVyck1zZz1QbGVhc2UgY2hlY2sgdGhlIGJ1dHRvbiBmaXJzdApkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvYXJyYXkvQXJyYXlUYWJJdGVtLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheVRhYkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiMDBhZi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheVRhYkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmFycmF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5DVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLklDVGFibGVDZWxsU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLlBUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLlBUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheVRhYkl0ZW0gZXh0ZW5kcyBQVGFiSXRlbSB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09MX1RZUEUgPSAiY29sIjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBST1dfVFlQRSA9ICJyb3ciOwotCXByaXZhdGUgU2FzaEZvcm0gc2FzaEZvcm0gPSBudWxsOwotCXByaXZhdGUgQ1RhYmxlIGNUYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgbGVmdENvbnRlbnQgPSBudWxsOwotCXByaXZhdGUgQXJyYXlUYWJsZU1vZGVsIGFycmF5TW9kZWwgPSBudWxsOwotCXByaXZhdGUgSVBWYXJpYWJsZSB2YXJpYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHJlbG9hZFZhcmlhYmxlID0gZmFsc2U7Ci0JU3RyaW5nIHR5cGU7Ci0JU3RyaW5nIG5hbWU7Ci0KLQlwdWJsaWMgQXJyYXlUYWJJdGVtKFBUYWJGb2xkZXIgdmlldywgU3RyaW5nIHRhYlRleHQsIElQVmFyaWFibGUgdmFyaWFibGUpIHsKLQkJc3VwZXIodmlldywgdGFiVGV4dCk7Ci0JCXRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKLQkJcmVsb2FkVmFyaWFibGUgPSBmYWxzZTsKLQkJc2V0Q29udHJvbCgpOwotCQkvL3ZpZXcuZ2V0VGFiRm9sZGVyKCkuc2V0TWVudShjcmVhdGVQb3B1cE1lbnUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgSVBWYXJpYWJsZSB2YXJpYWJsZSkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCWlmIChtb25pdG9yID09IG51bGwpCi0JCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0JCQkJaW50IGRpbSA9IDA7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSIsIG5ldyBPYmplY3RbXXsgQXJyYXlNZXNzYWdlcy5nZXRTdHJpbmcoIkFycmF5VGFiSXRlbS5pbml0VmFyaWFibGUiKX0pLCAxMCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbmFtZSA9IHZhcmlhYmxlLmdldE5hbWUoKTsKLQkJCQkJdHlwZSA9IHZhcmlhYmxlLmdldFJlZmVyZW5jZVR5cGVOYW1lKCk7Ci0KLQkJCQkJSVZhbHVlIHZhbHVlID0gdmFyaWFibGUuZ2V0VmFsdWUoKTsKLQkJCQkJd2hpbGUgKHZhbHVlLmhhc1ZhcmlhYmxlcygpKSB7Ci0JCQkJCQlJVmFyaWFibGVbXSB2YXJzID0gdmFsdWUuZ2V0VmFyaWFibGVzKCk7Ci0JCQkJCQlmb3IgKElWYXJpYWJsZSB2YXIgOiB2YXJzKSB7Ci0JCQkJCQkJdmFsdWUgPSB2YXIuZ2V0VmFsdWUoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWZpbGxEaW1lbnNpb25QYW5lbCh2YXJzLmxlbmd0aC0xKTsKLQkJCQkJCWRpbSsrOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlhcnJheU1vZGVsID0gbmV3IEFycmF5VGFibGVNb2RlbChkaW0pOwotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlydW4oZmFsc2UsIGZhbHNlLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZGlzcGxheUVycm9yKGUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQlkaXNwbGF5RXJyb3IoZTEpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXZpZXcuY2xvc2VUYWIoZ2V0VGFiSXRlbSgpLmdldFRleHQoKSk7Ci0JCXJlc2V0VGFibGUoKTsKLQkJdmFyaWFibGUgPSBudWxsOwotCQlnZXRUYWJJdGVtKCkuZGlzcG9zZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBjbGVhckNvbnRleHQoKSB7Ci0JCWZvciAoQ29udHJvbCBjb250cm9sIDogbGVmdENvbnRlbnQuZ2V0Q2hpbGRyZW4oKSkgewotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkoKEJ1dHRvbiljb250cm9sKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNwaW5uZXIpIHsKLQkJCQkoKFNwaW5uZXIpY29udHJvbCkuc2V0U2VsZWN0aW9uKDApOwotCQkJfQotCQl9Ci0JCXJlc2V0VGFibGUoKTsKLQkJY1RhYmxlLnJlZHJhdygpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRSZWxvYWRWYXJpYWJsZShib29sZWFuIHJlbG9hZCkgewotCQl0aGlzLnJlbG9hZFZhcmlhYmxlID0gcmVsb2FkOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5VGFiKCkgewotCQlpZiAoIWRpc3BsYXlFcnJvcikJCQotCQkJZlBhZ2VCb29rLnNob3dQYWdlKHNhc2hGb3JtKTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlVGFiUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULkhPUklaT05UQUwgfCBTV1QuQk9SREVSKTsKLQkJc2FzaEZvcm0uc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCXNhc2hGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzYXNoRm9ybS5TQVNIX1dJRFRIID0gMjsKLQkJc2FzaEZvcm0uc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVykpOwotCQlsZWZ0UGFuZWwoc2FzaEZvcm0pOwotCQlyaWdodFBhbmVsKHNhc2hGb3JtKTsKLQkJLy9zYXNoRm9ybS5zZXRNYXhpbWl6ZWRDb250cm9sKGNUYWJsZSk7Ci0JCXNhc2hGb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsgMSwgMyB9KTsKLQl9Ci0JcHJvdGVjdGVkIE1lbnUgY3JlYXRlUG9wdXBNZW51KCkgewotCQlNZW51IG1lbnUgPSBuZXcgTWVudShjVGFibGUpOwotCQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCW1JdGVtLnNldFRleHQoQXJyYXlNZXNzYWdlcy5nZXRTdHJpbmcoIkFycmF5VGFiSXRlbS5yZXNldFJhbmdlIikpOwotCQltSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkgICAgCX0KLQkgICAgfSk7Ci0JCXJldHVybiBtZW51OwotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUYWJsZShpbnQgY29sSW5kZXgsIGludCByb3dJbmRleCkgewotCQlpZiAoY29sSW5kZXggPT0gLTEgJiYgcm93SW5kZXggPT0gLTEpIHsKLQkJCVBUUERlYnVnVUlQbHVnaW4uZXJyb3JEaWFsb2coZlBhZ2VCb29rLmdldFNoZWxsKCksIEFycmF5TWVzc2FnZXMuZ2V0U3RyaW5nKCJBcnJheVRhYkl0ZW0ubm9JbmRleEVyclRpdGxlIiksIG5ldyBFeGNlcHRpb24oQXJyYXlNZXNzYWdlcy5nZXRTdHJpbmcoIkFycmF5VGFiSXRlbS5ub0luZGV4RXJyTXNnIikpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlwcml2YXRlIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dChpbnQgY29sdW1uLCBib29sZWFuIGJhbGFuY2UsIGludCBtYXJnaW5XaWR0aCwgaW50IG1hcmdpbkhlaWdodCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KGNvbHVtbiwgYmFsYW5jZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQlwcml2YXRlIEdyaWREYXRhIGNyZWF0ZUhvcml6b250YUdyaWREYXRhKGludCBob3pBbGlnbiwgaW50IHdpZHRoKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGhvekFsaWduLCBTV1QuQkVHSU5OSU5HLCAoaG96QWxpZ249PVNXVC5GSUxMKSwgZmFsc2UpOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aDsKLQkJcmV0dXJuIGdkOwotCX0KLQlwcml2YXRlIHZvaWQgbGVmdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuVl9TQ1JPTEx8IFNXVC5IX1NDUk9MTCk7Ci0JCWxlZnRDb250ZW50ID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCQlsZWZ0Q29udGVudC5zZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgzLCBmYWxzZSwgMywgMykpOwotCQlsZWZ0Q29udGVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UpKTsKLQkJc2Muc2V0Q29udGVudChsZWZ0Q29udGVudCk7Ci0JCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCi0JCW5ldyBMYWJlbChsZWZ0Q29udGVudCwgU1dULlJFQURfT05MWSkuc2V0VGV4dCgiY29sIik7Ci0JCW5ldyBMYWJlbChsZWZ0Q29udGVudCwgU1dULlJFQURfT05MWSkuc2V0VGV4dCgicm93Iik7Ci0JCUxhYmVsIHNsaWNlTGFiZWwgPSBuZXcgTGFiZWwobGVmdENvbnRlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlzbGljZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0JCXNsaWNlTGFiZWwuc2V0VGV4dCgiU2xpY2UiKTsKLQkJLyoKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29udGVudCwgU1dULk5PTkUpOwkJCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgzLCBmYWxzZSwgMCwgMCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjcmVhdGVIb3Jpem9udGFHcmlkRGF0YShTV1QuRklMTCwgMTUwKSk7Ci0JCUxhYmVsIG1pbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCW1pbkxhYmVsLnNldFRleHQoIk1pbiIpOwotCQltaW5MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKS5zZXRUZXh0KCIiKTsKLQkJTGFiZWwgbWF4TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbWF4TGFiZWwuc2V0VGV4dCgiTWF4Iik7Ci0JCW1heExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0JCSovCi0JCXNjLnNldE1pblNpemUoMTIwLCBTV1QuREVGQVVMVCk7Ci0JfQotCXByaXZhdGUgdm9pZCBjbGVhckFsbENoZWNrYm94ZXMoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBsZWZ0Q29udGVudC5nZXRDaGlsZHJlbigpKSB7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIEJ1dHRvbikgewotCQkJCWlmIChjb250cm9sLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCSgoQnV0dG9uKWNvbnRyb2wpLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCByZWxvYWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQU3RhY2tGcmFtZSBmcmFtZSA9IHZpZXcuZ2V0U3RhY2tGcmFtZSgpOwotCQlmb3IgKElWYXJpYWJsZSB2YXIgOiBmcmFtZS5nZXRWYXJpYWJsZXMoKSkgewotCQkJaWYgKHZhciBpbnN0YW5jZW9mIElQVmFyaWFibGUpIHsKLQkJCQlJUFZhcmlhYmxlIHB2YXIgPSAoSVBWYXJpYWJsZSl2YXI7Ci0JCQkJU3RyaW5nIHBuYW1lID0gdmFyLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgcHR5cGUgPSB2YXIuZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKTsKLQkJCQlpZiAocG5hbWUuZXF1YWxzKG5hbWUpICYmIHB0eXBlLmVxdWFscyh0eXBlKSkgewotCQkJCQl2YXJpYWJsZSA9IHB2YXI7Ci0JCQkJCW5hbWUgPSBwbmFtZTsKLQkJCQkJdHlwZSA9IHB0eXBlOwotCQkJCQlyZWxvYWRWYXJpYWJsZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlbG9hZFZhcmlhYmxlKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIk5vIHZhcmlhYmxlIGZvdW5kIiwgbnVsbCkpOwotCX0KLQlwdWJsaWMgdm9pZCByZWZyZXNoVGFibGUoKSB7Ci0JCWlmIChyZWxvYWRWYXJpYWJsZSkgewotCQkJdHJ5IHsKLQkJCQlyZWxvYWQoKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQVFBEZWJ1Z1VJUGx1Z2luLmVycm9yRGlhbG9nKGZQYWdlQm9vay5nZXRTaGVsbCgpLCAiRXJyb3IiLCBlLmdldFN0YXR1cygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKGFycmF5TW9kZWwgIT0gbnVsbCkgewotCQkJc2V0RGltZW5zaW9uVmFsdWVzKCk7Ci0JCQlpZiAoYXJyYXlNb2RlbC5pc0F2YWlsYWJsZSgpKSB7Ci0JCQkJY1RhYmxlLnNldE1vZGVsKGFycmF5TW9kZWwpOwotCQkJCWFycmF5TW9kZWwuaW5pdGlhbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzZXRUYWJsZSgpOwotCQkJCWNUYWJsZS5yZWRyYXcoKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgcmVzZXRUYWJsZSgpIHsKLQkJYXJyYXlNb2RlbC5yZXNldCgpOwotCQljVGFibGUuc2V0TW9kZWwobnVsbCk7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXREaW1lbnNpb25WYWx1ZXMoKSB7Ci0JCWludFtdW10gdmFsdWVzID0gbmV3IGludFthcnJheU1vZGVsLmdldERpbWVuc2lvbigpXVszXTsKLQkJaW50IGZDb2wgPSAxOwotCQlpbnQgZlJvdyA9IDE7Ci0JCWludCBwb3MgPSAwOwotCQlhcnJheU1vZGVsLnNldENvbHVtbkNvdW50KDEpOwotCQlhcnJheU1vZGVsLnNldFJvd0NvdW50KDEpOwotCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IGxlZnRDb250ZW50LmdldENoaWxkcmVuKCkpIHsKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQkJaWYgKGNvbnRyb2wuZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoQ09MX1RZUEUpKSB7Ci0JCQkJCXZhbHVlc1twb3NdWzBdID0gKChCdXR0b24pY29udHJvbCkuZ2V0U2VsZWN0aW9uKCk/MTowOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRyb2wuZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoUk9XX1RZUEUpKSB7Ci0JCQkJCXZhbHVlc1twb3NdWzFdID0gKChCdXR0b24pY29udHJvbCkuZ2V0U2VsZWN0aW9uKCk/MTowOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNwaW5uZXIpIHsKLQkJCQlpZiAodmFsdWVzW3Bvc11bMF0gPT0gMSkgewotCQkJCQl2YWx1ZXNbcG9zXVsyXSA9ICgoU3Bpbm5lciljb250cm9sKS5nZXRNYXhpbXVtKCk7Ci0JCQkJCWZDb2wgPSAoKFNwaW5uZXIpY29udHJvbCkuZ2V0U2VsZWN0aW9uKCkrMTsKLQkJCQkJYXJyYXlNb2RlbC5zZXRDb2x1bW5Db3VudCh2YWx1ZXNbcG9zXVsyXSsxKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWVzW3Bvc11bMV0gPT0gMSkgewotCQkJCQl2YWx1ZXNbcG9zXVsyXSA9ICgoU3Bpbm5lciljb250cm9sKS5nZXRNYXhpbXVtKCk7Ci0JCQkJCWZSb3cgPSAoKFNwaW5uZXIpY29udHJvbCkuZ2V0U2VsZWN0aW9uKCkrMTsKLQkJCQkJYXJyYXlNb2RlbC5zZXRSb3dDb3VudCh2YWx1ZXNbcG9zXVsyXSsxKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlc1twb3NdWzJdID0gKChTcGlubmVyKWNvbnRyb2wpLmdldFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCQlwb3MrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlhcnJheU1vZGVsLnNldFNlbGVjdGlvbihmQ29sLCBmUm93KTsKLQkJYXJyYXlNb2RlbC5zZXRWYWx1ZXModmFsdWVzKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGZpbGxEaW1lbnNpb25QYW5lbChpbnQgc2l6ZSkgewotCQkvL1NsaWRlciBzbGlkZXIgPSBuZXcgU2xpZGVyKHBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCQlmaW5hbCBCdXR0b24gY29sQnRuID0gbmV3IEJ1dHRvbihsZWZ0Q29udGVudCwgU1dULkNIRUNLKTsKLQkJY29sQnRuLnNldFRvb2xUaXBUZXh0KENPTF9UWVBFKTsKLQkJY29sQnRuLnNldExheW91dERhdGEoY3JlYXRlSG9yaXpvbnRhR3JpZERhdGEoU1dULkNFTlRFUiwgMjApKTsKLQkJZmluYWwgQnV0dG9uIHJvd0J0biA9IG5ldyBCdXR0b24obGVmdENvbnRlbnQsIFNXVC5DSEVDSyk7Ci0JCXJvd0J0bi5zZXRMYXlvdXREYXRhKGNyZWF0ZUhvcml6b250YUdyaWREYXRhKFNXVC5DRU5URVIsIDIwKSk7Ci0JCXJvd0J0bi5zZXRUb29sVGlwVGV4dChST1dfVFlQRSk7Ci0KLQkJY29sQnRuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBjb2xCdG4uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJY2xlYXJBbGxDaGVja2JveGVzKENPTF9UWVBFKTsKLQkJCQljb2xCdG4uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJCQkKLQkJCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQkJaWYgKHJvd0J0bi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJYXJyYXlNb2RlbC5yZXNldCgpOwotCQkJCQkJcm93QnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVmcmVzaFRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQlyb3dCdG4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBzZWxlY3RlZCA9IHJvd0J0bi5nZXRTZWxlY3Rpb24oKTsKLQkJCQljbGVhckFsbENoZWNrYm94ZXMoUk9XX1RZUEUpOwotCQkJCXJvd0J0bi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQkJCQotCQkJCWlmIChzZWxlY3RlZCkgewotCQkJCQlpZiAoY29sQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlhcnJheU1vZGVsLnJlc2V0KCk7Ci0JCQkJCQljb2xCdG4uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZWZyZXNoVGFibGUoKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIFNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKGxlZnRDb250ZW50LCBTV1QuTk9ORSB8IFNXVC5CT1JERVIpOwotCQlzcGlubmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCQlzcGlubmVyLnNldE1pbmltdW0oMCk7Ci0JCXNwaW5uZXIuc2V0TWF4aW11bShzaXplKTsKLQkJc3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoIWNvbEJ0bi5nZXRTZWxlY3Rpb24oKSAmJiAhcm93QnRuLmdldFNlbGVjdGlvbigpKQotCQkJCQlhcnJheU1vZGVsLnJlc2V0KCk7Ci0JCQkJcmVmcmVzaFRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQlsZWZ0Q29udGVudC5wYWNrKHRydWUpOwotCi0JCS8qCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMywgZmFsc2UsIDAsIDApKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoY3JlYXRlSG9yaXpvbnRhR3JpZERhdGEoU1dULkZJTEwsIDE1MCkpOwotCQlmaW5hbCBTcGlubmVyIG1pblNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5OT05FIHwgU1dULkJPUkRFUik7Ci0JCW1pblNwaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpLnNldFRleHQoIi8iKTsKLQkJZmluYWwgU3Bpbm5lciBtYXhTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcG9zaXRlLCBTV1QuTk9ORSB8IFNXVC5CT1JERVIpOwotCQltYXhTcGlubmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCQkKLQkJbWluU3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgdmFsdWUgPSBtaW5TcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICh2YWx1ZSA+PSBtYXhTcGlubmVyLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCW1pblNwaW5uZXIuc2V0U2VsZWN0aW9uKG1heFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCktMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJbWF4U3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgdmFsdWUgPSBtYXhTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICh2YWx1ZSA8PSBtaW5TcGlubmVyLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCW1heFNwaW5uZXIuc2V0U2VsZWN0aW9uKG1pblNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkrMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJbWluU3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQltaW5TcGlubmVyLnNldE1heGltdW0odG90YWwvMik7Ci0JCW1heFNwaW5uZXIuc2V0TWluaW11bSh0b3RhbC8yKzEpOwotCQltYXhTcGlubmVyLnNldE1heGltdW0odG90YWwpOwotCQltaW5TcGlubmVyLnNldFNlbGVjdGlvbigwKTsKLQkJbWF4U3Bpbm5lci5zZXRTZWxlY3Rpb24odG90YWwvMisxKTsKLQkJKi8KLQl9Ci0JcHJpdmF0ZSB2b2lkIHJpZ2h0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQljVGFibGUgPSBuZXcgQ1RhYmxlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJY1RhYmxlLmFkZENlbGxTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNUYWJsZUNlbGxTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNlbGxTZWxlY3RlZChpbnQgY29sLCBpbnQgcm93LCBpbnQgc3RhdGVtYXNrKSB7Ci0JCQkJaWYgKGxlZnRDb250ZW50ICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBpc0NvbCA9IGZhbHNlOwotCQkJCQlib29sZWFuIGlzUm93ID0gZmFsc2U7Ci0JCQkJCWZvciAoQ29udHJvbCBjb250cm9sIDogbGVmdENvbnRlbnQuZ2V0Q2hpbGRyZW4oKSkgewotCQkJCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCQlpZiAoY29udHJvbC5nZXRUb29sVGlwVGV4dCgpLmVxdWFscyhDT0xfVFlQRSkpIHsKLQkJCQkJCQkJaXNDb2wgPSAoKEJ1dHRvbiljb250cm9sKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChjb250cm9sLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKFJPV19UWVBFKSkgewotCQkJCQkJCQlpc1JvdyA9ICgoQnV0dG9uKWNvbnRyb2wpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNwaW5uZXIpIHsKLQkJCQkJCQlpZiAoaXNDb2wgfHwgaXNSb3cpIHsKLQkJCQkJCQkJKChTcGlubmVyKWNvbnRyb2wpLnNldFNlbGVjdGlvbigoaXNDb2w/Y29sOnJvdyktMSk7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBmaXhlZENlbGxTZWxlY3RlZChpbnQgY29sLCBpbnQgcm93LCBpbnQgc3RhdGVtYXNrKSB7fQotCQl9KTsKLQkJLy9jVGFibGUuc2V0Um93U2VsZWN0aW9uTW9kZSh0cnVlKTsKLQkJLy9jVGFibGUuc2V0TXVsdGlTZWxlY3Rpb25Nb2RlKHRydWUpOwotCX0KLQlwcml2YXRlIHZvaWQgc2hvd1RhYmxlKCkgewotCQljVGFibGUucmVkcmF3KCk7Ci0JCWNUYWJsZS5zZXRTZWxlY3Rpb24oYXJyYXlNb2RlbC5nZXRTZWxlY3RlZENvbHVtbigpLCBhcnJheU1vZGVsLmdldFNlbGVjdGVkUm93KCksIHRydWUpOwotCX0KLQljbGFzcyBBcnJheVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdEFycmF5VGFibGVNb2RlbCB7Ci0JCXByaXZhdGUgaW50W11bXSB2YWx1ZXM7Ci0JCXByaXZhdGUgaW50IGZDb2wgPSAxOwotCQlwcml2YXRlIGludCBmUm93ID0gMTsKLQkJcHJpdmF0ZSBpbnQgZGltZW5zaW9uOwotCQlwcml2YXRlIE9iamVjdFtdW10gZGF0YSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgQXJyYXlUYWJsZU1vZGVsKGludCBkaW1lbnNpb24pIHsKLQkJCXRoaXMuZGltZW5zaW9uID0gZGltZW5zaW9uOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0Q29udGVudEF0KGludCBjb2wsIGludCByb3cpIHsKLQkJCWlmIChjb2wgPT0gZ2V0Rml4ZWRDb2x1bW5Db3VudCgpLTEpCi0JCQkJcmV0dXJuICIiICsgKHJvdy0xKTsKLQkJCWlmIChyb3cgPT0gZ2V0Rml4ZWRSb3dDb3VudCgpLTEpCi0JCQkJcmV0dXJuICIiICsgKGNvbC0xKTsKLQotCQkJaWYgKGRhdGFbY29sXVtyb3ddID09IG51bGwpCi0JCQkJcmV0dXJuICIiOwotCQkJcmV0dXJuIGRhdGFbY29sXVtyb3ddOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFJvd0NvdW50KGludCByb3dzKSB7Ci0JCQl0aGlzLnJvd3MgPSByb3dzICsgZ2V0Rml4ZWRSb3dDb3VudCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbHVtbkNvdW50KGludCBjb2xzKSB7Ci0JCQl0aGlzLmNvbHMgPSBjb2xzICsgZ2V0Rml4ZWRDb2x1bW5Db3VudCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJZkNvbCA9IGdldEZpeGVkQ29sdW1uQ291bnQoKTsKLQkJCWZSb3cgPSBnZXRGaXhlZFJvd0NvdW50KCk7Ci0JCQl0aGlzLnZhbHVlcyA9IG51bGw7Ci0JCQl0aGlzLmRhdGEgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhpbnRbXVtdIHZhbHVlcykgewotCQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0JCX0KLQkJcHVibGljIGludCBnZXREaW1lbnNpb24oKSB7Ci0JCQlyZXR1cm4gZGltZW5zaW9uOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgewotCQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJYm9vbGVhbiBpc0NvbCA9IGZhbHNlOwotCQkJYm9vbGVhbiBpc1JvdyA9IGZhbHNlOwotCQkJZm9yIChpbnQgaT0wOyBpPGRpbWVuc2lvbjsgaSsrKSB7Ci0JCQkJaXNDb2wgPSBpc0NvbD90cnVlOih2YWx1ZXNbaV1bMF0gPT0gMSk7Ci0JCQkJaXNSb3cgPSBpc1Jvdz90cnVlOih2YWx1ZXNbaV1bMV0gPT0gMSk7Ci0JCQl9Ci0JCQlpZiAoZGltZW5zaW9uID09IDEpIHsKLQkJCQlyZXR1cm4gISghaXNDb2wgJiYgIWlzUm93KTsKLQkJCX0KLQkJCXJldHVybiAoaXNDb2wgJiYgaXNSb3cpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgY29sLCBpbnQgcm93KSB7Ci0JCQl0aGlzLmZDb2wgPSBjb2w7Ci0JCQl0aGlzLmZSb3cgPSByb3c7Ci0JCX0KLQkJcHVibGljIGludCBnZXRTZWxlY3RlZENvbHVtbigpIHsKLQkJCXJldHVybiBmQ29sOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRSb3coKSB7Ci0JCQlyZXR1cm4gZlJvdzsKLQkJfQotCQlwcml2YXRlIFN0cmluZyBnZXRWYWx1ZVN0cmluZyhpbnQgY29sLCBpbnQgcm93KSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkJSVZhcmlhYmxlIHZhciA9IHZhcmlhYmxlOwotCQkJZm9yIChpbnQgaT0wOyBpPGRpbWVuc2lvbjsgaSsrKSB7Ci0JCQkJSVZhcmlhYmxlW10gdmFycyA9IHZhci5nZXRWYWx1ZSgpLmdldFZhcmlhYmxlcygpOwotCQkJCWlmICh2YXJzLmxlbmd0aCA9PSAwKQotCQkJCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIk5vIFZhbHVlIGZvdW5kIiwgbnVsbCkpOwotCi0JCQkJaWYgKHZhbHVlc1tpXVswXSA9PSAxKSB7Ci0JCQkJCXZhciA9IHZhcnNbY29sLTFdOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZXNbaV1bMV0gPT0gMSkgewotCQkJCQl2YXIgPSB2YXJzW3Jvdy0xXTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhciA9IHZhcnNbdmFsdWVzW2ldWzJdXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFyLmdldFZhbHVlKCkuZ2V0VmFsdWVTdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbml0aWFsKCkgewotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCXNob3dUYWJsZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCS8vV29ya2JlbmNoSm9iIHVpSm9iID0gbmV3IFdvcmtiZW5jaEpvYigiUmV0cmlldmluZyB2YWx1ZXMuLi4iKSB7Ci0JCQkJLy9wdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCJSZXRyaWV2aW5nIHZhbHVlcy4uLiIsIChjb2xzKnJvd3MpKTsKLQkJCQkJZGF0YSA9IG5ldyBPYmplY3RbY29sc11bcm93c107Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBjPWdldEZpeGVkQ29sdW1uQ291bnQoKTsgYzxjb2xzOyBjKyspIHsKLQkJCQkJCQlmb3IgKGludCByPWdldEZpeGVkUm93Q291bnQoKTsgcjxyb3dzOyByKyspIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWRhdGFbY11bcl0gPSBnZXRWYWx1ZVN0cmluZyhjLCByKTsKLQkJCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQkJCQkJCQkJLy9yZXR1cm4gZXguZ2V0U3RhdHVzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCQlzaG93VGFibGUoKTsKLQkJCQkJLy9yZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQkJLyoKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuc2hvd0luRGlhbG9nKGZQYWdlQm9vay5nZXRTaGVsbCgpLCB1aUpvYik7Ci0JCQl1aUpvYi5zZXRTeXN0ZW0oZmFsc2UpOwotCQkJdWlKb2Iuc2NoZWR1bGUoKTsKLQkJCSovCi0JCQl0cnkgewotCQkJCXJ1bihmYWxzZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLQkJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCWRpc3BsYXlFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKLQkJCQlkaXNwbGF5RXJyb3IoZTEpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvYXJyYXkvQXJyYXlWaWV3LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwYzNiNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuYXJyYXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLkFkZFZhcmlhYmxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5BYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLlBUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLlBUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGNsYXNzIEFycmF5VmlldyBleHRlbmRzIFBUYWJGb2xkZXIgewotCXByb3RlY3RlZCBBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgZkV2ZW50SGFuZGxlciA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQlzZXRFdmVudEhhbmRsZXIobmV3IEFycmF5Vmlld0V2ZW50SGFuZGxlcih0aGlzKSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldEV2ZW50SGFuZGxlcihBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKSB7Ci0JCXRoaXMuZkV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjsKLQl9Ci0JcHJvdGVjdGVkIEFic3RyYWN0UERlYnVnVmlld0V2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSB7Ci0JCXJldHVybiB0aGlzLmZFdmVudEhhbmRsZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChnZXRFdmVudEhhbmRsZXIoKSAhPSBudWxsKQotCQkJZ2V0RXZlbnRIYW5kbGVyKCkuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlcGFpbnQoYm9vbGVhbiBhbGwpIHsKLQkJZm9yIChQVGFiSXRlbSBpdGVtIDogZ2V0SXRlbXMoKSkgewotCQkJKChBcnJheVRhYkl0ZW0paXRlbSkuY2xlYXJDb250ZXh0KCk7Ci0JCQkoKEFycmF5VGFiSXRlbSlpdGVtKS5zZXRSZWxvYWRWYXJpYWJsZShhbGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IpIHsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklVSVRBQlZBUklBQkxFR1JPVVAsIG5ldyBBZGRWYXJpYWJsZUFjdGlvbih0aGlzKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYkl0ZW0oU3RyaW5nIHRhYk5hbWUsIE9iamVjdCBzZWxlY3Rpb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJUFZhcmlhYmxlKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnNLZXkodGFiTmFtZSkpIHsKLQkJCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQVFBEZWJ1Z1VJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgIkFscmVhZHkgZXhpc3RlZCB2YXJpYWJsZSIsIG51bGwpKTsKLQkJCX0KLQkJCUFycmF5VGFiSXRlbSBpdGVtID0gbmV3IEFycmF5VGFiSXRlbSh0aGlzLCB0YWJOYW1lLCAoSVBWYXJpYWJsZSlzZWxlY3Rpb24pOwotCQkJaXRlbS5pbml0KChJUFZhcmlhYmxlKXNlbGVjdGlvbik7Ci0JCQlpdGVtLmRpc3BsYXlUYWIoKTsKLSAJCQlmb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW0uZ2V0VGFiSXRlbSgpKTsKLSAJCQlpdGVtcy5wdXQodGFiTmFtZSwgaXRlbSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9hcnJheS9BcnJheVZpZXdFdmVudEhhbmRsZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL2FycmF5L0FycmF5Vmlld0V2ZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlkMmQyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL2FycmF5L0FycmF5Vmlld0V2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuYXJyYXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5JUERlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLkFic3RyYWN0UERlYnVnVmlld0V2ZW50SGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNsZW1lbnQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheVZpZXdFdmVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV2ZW50IGhhbmRsZXIgb24gdGhlIGdpdmVuIHZpZXcKLQkgKi8KLQlwdWJsaWMgQXJyYXlWaWV3RXZlbnRIYW5kbGVyKEFycmF5VmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQlwdWJsaWMgQXJyYXlWaWV3IGdldEFycmF5VmlldygpIHsKLQkJcmV0dXJuIChBcnJheVZpZXcpZ2V0VmlldygpOwotCX0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gYWxsKSB7Ci0JCWdldEFycmF5VmlldygpLnJlcGFpbnQoYWxsKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZG9IYW5kbGVEZWJ1Z0V2ZW50KElQRGVidWdFdmVudCBldmVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN3aXRjaChldmVudC5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LlRFUk1JTkFURToKLQkJCQlzd2l0Y2ggKGV2ZW50LmdldERldGFpbCgpKSB7Ci0JCQkJY2FzZSBJUERlYnVnRXZlbnQuREVCVUdHRVI6Ci0JCQkJCWdldEFycmF5VmlldygpLmNsb3NlQWxsVGFicygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElQRGVidWdFdmVudC5SRUdJU1RFUjoKLQkJCQkJcmVmcmVzaCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElQRGVidWdFdmVudC5SRVNVTUU6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElQRGVidWdFdmVudC5TVVNQRU5EOgotCQkJCXJlZnJlc2goKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL2JyZWFrcG9pbnRzL1BCcmVha3BvaW50U2V0T3JnYW5pemVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9icmVha3BvaW50cy9QQnJlYWtwb2ludFNldE9yZ2FuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkxODk4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL2JyZWFrcG9pbnRzL1BCcmVha3BvaW50U2V0T3JnYW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmJyZWFrcG9pbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RCcmVha3BvaW50T3JnYW5pemVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQnJlYWtwb2ludFR5cGVDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JQnJlYWtwb2ludFR5cGVDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUEJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z0ltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUEJyZWFrcG9pbnRTZXRPcmdhbml6ZXIgZXh0ZW5kcyBBYnN0cmFjdEJyZWFrcG9pbnRPcmdhbml6ZXJEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQWRhcHRhYmxlW10+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQWRhcHRhYmxlW10+KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklCcmVha3BvaW50T3JnYW5pemVyRGVsZWdhdGUjZ2V0Q2F0ZWdvcmllcyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50KQotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlW10gZ2V0Q2F0ZWdvcmllcyhJQnJlYWtwb2ludCBicmVha3BvaW50KSB7Ci0JCWlmICghKGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJUEJyZWFrcG9pbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUJyZWFrcG9pbnRUeXBlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoSUJyZWFrcG9pbnRUeXBlQ2F0ZWdvcnkpIGJyZWFrcG9pbnQuZ2V0QWRhcHRlcihJQnJlYWtwb2ludFR5cGVDYXRlZ29yeS5jbGFzcyk7Ci0JCWlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElBZGFwdGFibGVbXSB7IGNhdGVnb3J5IH07Ci0JCX0KLQotCQlJUEJyZWFrcG9pbnQgcEJwdCA9IChJUEJyZWFrcG9pbnQpIGJyZWFrcG9pbnQ7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc2lkID0gcEJwdC5nZXRTZXRJZCgpOwotCQkJaWYgKHNpZC5sZW5ndGgoKSA+IDApIHsKLQkJCQlJQWRhcHRhYmxlW10gY2F0ZWdvcmllcyA9IChJQWRhcHRhYmxlW10pIHR5cGVzLmdldChzaWQpOwotCQkJCWlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQkJCWNhdGVnb3JpZXMgPSBuZXcgSUFkYXB0YWJsZVtdIHsgbmV3IEJyZWFrcG9pbnRUeXBlQ2F0ZWdvcnkoc2lkLCBQRGVidWdJbWFnZS5nZXREZXNjcmlwdG9yKFBEZWJ1Z0ltYWdlLklNR19ERUJVR19QVFBCUFRTRVQpKSB9OwotCQkJCQl0eXBlcy5wdXQoc2lkLCBjYXRlZ29yaWVzKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JQnJlYWtwb2ludE9yZ2FuaXplckRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXR5cGVzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzTWVzc2FnZXMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MWUyOGUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3Muc2lnbmFsczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFNpZ25hbHNNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5zaWduYWxzLlNpZ25hbHNNZXNzYWdlcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBTaWduYWxzTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzTWVzc2FnZXMucHJvcGVydGllcyBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZTk4YmUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAjIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAjIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gIyAKLSAjIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gIyAKLSAjIExBLUNDIDA0LTExNQotICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0gIyBAYXV0aG9yIENsZW1lbnQKLSAjCi0gIyMKLQotU2lnbmFsc1ZpZXdlci40PU5hbWUKLVNpZ25hbHNWaWV3ZXIuNT1QYXNzCi1TaWduYWxzVmlld2VyLjY9U3VzcGVuZAotU2lnbmFsc1ZpZXdlci43PURlc2NyaXB0aW9uCi1TaWduYWxzVmlld2VyLjg9eWVzCi1TaWduYWxzVmlld2VyLjk9bm8KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc1ZpZXcuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYTM4Zi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9zaWduYWxzL1NpZ25hbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5zaWduYWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLklEZWJ1Z0V4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLlBUUERlYnVnQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQU2lnbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5BYnN0cmFjdERlYnVnRXZlbnRIYW5kbGVyVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU51bGxTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IENodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsc1ZpZXcgZXh0ZW5kcyBBYnN0cmFjdERlYnVnRXZlbnRIYW5kbGVyVmlldyBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciwgSU51bGxTZWxlY3Rpb25MaXN0ZW5lciwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIElEZWJ1Z0V4Y2VwdGlvbkhhbmRsZXIgewotCXB1YmxpYyBjbGFzcyBTaWduYWxzVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQkJcmV0dXJuIGdldE1vZGVsUHJlc2VudGF0aW9uKCkuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUFNpZ25hbCkgewotCQkJCXRyeSB7Ci0JCQkJCXN3aXRjaChjb2x1bW5JbmRleCkgewotCQkJCQkJY2FzZSAwOgotCQkJCQkJCXJldHVybiAoKElQU2lnbmFsKWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQlyZXR1cm4gKCgoSVBTaWduYWwpZWxlbWVudCkuaXNQYXNzRW5hYmxlZCgpKSA/IFNpZ25hbHNWaWV3ZXIuWUVTX1ZBTFVFIDogU2lnbmFsc1ZpZXdlci5OT19WQUxVRTsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlyZXR1cm4gKCgoSVBTaWduYWwpZWxlbWVudCkuaXNTdG9wRW5hYmxlZCgpKSA/IFNpZ25hbHNWaWV3ZXIuWUVTX1ZBTFVFIDogU2lnbmFsc1ZpZXdlci5OT19WQUxVRTsKLQkJCQkJCWNhc2UgMzoKLQkJCQkJCQlyZXR1cm4gKChJUFNpZ25hbCllbGVtZW50KS5nZXREZXNjcmlwdGlvbigpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSURlYnVnTW9kZWxQcmVzZW50YXRpb24gZ2V0TW9kZWxQcmVzZW50YXRpb24oKSB7Ci0JCQlyZXR1cm4gUFRQRGVidWdVSVBsdWdpbi5nZXREZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdERlYnVnVmlldyNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUFRQRGVidWdDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQotCQkvLyBhZGQgdHJlZSB2aWV3ZXIKLQkJZmluYWwgU2lnbmFsc1ZpZXdlciB2diA9IG5ldyBTaWduYWxzVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdnYuc2V0Q29udGVudFByb3ZpZGVyKGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdnYuc2V0TGFiZWxQcm92aWRlcihuZXcgU2lnbmFsc1ZpZXdMYWJlbFByb3ZpZGVyKCkpOwotCQl2di5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0JCS8vIGxpc3RlbiB0byBzZWxlY3Rpb24gaW4gZGVidWcgdmlldwotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcsIHRoaXMpOwotCQlzZXRFdmVudEhhbmRsZXIobmV3IFNpZ25hbHNWaWV3RXZlbnRIYW5kbGVyKHRoaXMpKTsKLQotCQlyZXR1cm4gdnY7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjY3JlYXRlQWN0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdERlYnVnVmlldyNnZXRIZWxwQ29udGV4dElkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBDb250ZXh0SWQoKSB7Ci0JCS8vcmV0dXJuIElQRGVidWdIZWxwQ29udGV4dElkcy5TSUdOQUxTX1ZJRVc7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0RGVidWdWaWV3I2ZpbGxDb250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCXVwZGF0ZU9iamVjdHMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdERlYnVnVmlldyNjb25maWd1cmVUb29sQmFyKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdGJtKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICghaXNBdmFpbGFibGUoKSB8fCAhaXNWaXNpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXNldFZpZXdlcklucHV0KG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQllbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNldFZpZXdlcklucHV0KChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuSURlYnVnRXhjZXB0aW9uSGFuZGxlciNoYW5kbGVFeGNlcHRpb24ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oRGVidWdFeGNlcHRpb24gZSkgewotCQlzaG93TWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGlzIHZpZXcncyBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJU2lnbmFsc1ZpZXdDb250ZW50UHJvdmlkZXIgY3AgPSBuZXcgU2lnbmFsc1ZpZXdDb250ZW50UHJvdmlkZXIoKTsKLQkJY3Auc2V0RXhjZXB0aW9uSGFuZGxlcih0aGlzKTsKLQkJcmV0dXJuIGNwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZpZXdlcklucHV0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwpIHsKLQkJSVBEZWJ1Z1RhcmdldCB0YXJnZXQgPSBudWxsOwotCQlpZiAoc3NlbCAhPSBudWxsICYmIHNzZWwuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBpbnB1dCA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRGVidWdFbGVtZW50ICYmICgoSURlYnVnRWxlbWVudClpbnB1dCkuZ2V0RGVidWdUYXJnZXQoKSBpbnN0YW5jZW9mIElQRGVidWdUYXJnZXQpCi0JCQkJdGFyZ2V0ID0gKElQRGVidWdUYXJnZXQpKChJRGVidWdFbGVtZW50KWlucHV0KS5nZXREZWJ1Z1RhcmdldCgpOwotCQl9Ci0KLQkJaWYgKGdldFZpZXdlcigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0IGN1cnJlbnQgPSBnZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQlpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZXF1YWxzKHRhcmdldCkpIHsKLQkJCXVwZGF0ZU9iamVjdHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc2hvd1ZpZXdlcigpOwotCQlnZXRWaWV3ZXIoKS5zZXRJbnB1dCh0YXJnZXQpOwotCQl1cGRhdGVPYmplY3RzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjYmVjb21lc0hpZGRlbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVjb21lc0hpZGRlbigpIHsKLQkJc2V0Vmlld2VySW5wdXQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCXN1cGVyLmJlY29tZXNIaWRkZW4oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdERlYnVnVmlldyNiZWNvbWVzVmlzaWJsZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVjb21lc1Zpc2libGUoKSB7Ci0JCXN1cGVyLmJlY29tZXNWaXNpYmxlKCk7Ci0JCUlWaWV3UGFydCBwYXJ0ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5maW5kVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldFNlbGVjdGlvbihJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVywgdGhpcyk7Ci0JCVBUUERlYnVnQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzVmlld0NvbnRlbnRQcm92aWRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzVmlld0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA1YjQ4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc1ZpZXdDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3Muc2lnbmFsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkudmlld3MuSURlYnVnRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLm1vZGVsLklQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsc1ZpZXdDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogSGFuZGxlciBmb3IgZXhjZXB0aW9ucyBhcyBjb250ZW50IGlzIHJldHJpZXZlZAotCSAqLwotCXByaXZhdGUgSURlYnVnRXhjZXB0aW9uSGFuZGxlciBmRXhjZXB0aW9uSGFuZGxlciA9IG51bGw7Ci0KLQlwdWJsaWMgU2lnbmFsc1ZpZXdDb250ZW50UHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElQRGVidWdUYXJnZXQpIHsKLQkJCUlQRGVidWdUYXJnZXQgdGFyZ2V0ID0gKElQRGVidWdUYXJnZXQpIGlucHV0RWxlbWVudDsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdFtdIHNpZ25hbHMgPSB0YXJnZXQuZ2V0U2lnbmFscygpOwotCQkJCQlpZiAoc2lnbmFscyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHNpZ25hbHM7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJCWlmIChnZXRFeGNlcHRpb25IYW5kbGVyKCkgIT0gbnVsbCkKLQkJCQkJZ2V0RXhjZXB0aW9uSGFuZGxlcigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQllbHNlCi0JCQkJCVBUUERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHRoaXMgY29udGVudCBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgZGVidWcgZXhjZXB0aW9uIGhhbmRsZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeGNlcHRpb25IYW5kbGVyKElEZWJ1Z0V4Y2VwdGlvbkhhbmRsZXIgaGFuZGxlcikgewotCQlmRXhjZXB0aW9uSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHRoaXMgY29udGVudCBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGRlYnVnIGV4Y2VwdGlvbiBoYW5kbGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElEZWJ1Z0V4Y2VwdGlvbkhhbmRsZXIgZ2V0RXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIGZFeGNlcHRpb25IYW5kbGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc1ZpZXdFdmVudEhhbmRsZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3NpZ25hbHMvU2lnbmFsc1ZpZXdFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZGExYy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9zaWduYWxzL1NpZ25hbHNWaWV3RXZlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnNpZ25hbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBTaWduYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLkFic3RyYWN0RGVidWdFdmVudEhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsc1ZpZXdFdmVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdERlYnVnRXZlbnRIYW5kbGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV2ZW50IGhhbmRsZXIgb24gdGhlIGdpdmVuIHZpZXcKLQkgKiAKLQkgKiBAcGFyYW0gdmlldyBzaWduYWxzIHZpZXcKLQkgKi8KLQlwdWJsaWMgU2lnbmFsc1ZpZXdFdmVudEhhbmRsZXIoQWJzdHJhY3REZWJ1Z1ZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQuZGVidWcuaW50ZXJuYWwudWkudmlld3MuQWJzdHJhY3REZWJ1Z0V2ZW50SGFuZGxlciNkb0hhbmRsZURlYnVnRXZlbnRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotCQlmb3IoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEZWJ1Z0V2ZW50IGV2ZW50ID0gZXZlbnRzW2ldOwotCQkJc3dpdGNoKGV2ZW50LmdldEtpbmQoKSkgewotCQkJCWNhc2UgRGVidWdFdmVudC5DUkVBVEU6Ci0JCQkJY2FzZSBEZWJ1Z0V2ZW50LlRFUk1JTkFURToKLQkJCQkJaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSURlYnVnVGFyZ2V0IHx8IGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVBTaWduYWwpCi0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRGVidWdFdmVudC5TVVNQRU5EOgotCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRGVidWdFdmVudC5DSEFOR0U6Ci0JCQkJCWlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElQU2lnbmFsKQotCQkJCQkJcmVmcmVzaChldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3Mvc2lnbmFscy9TaWduYWxzVmlld2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9zaWduYWxzL1NpZ25hbHNWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlMjRiYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy9zaWduYWxzL1NpZ25hbHNWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3Muc2lnbmFsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBpeGVsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgU2lnbmFsc1ZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCS8vIFN0cmluZyBjb25zdGFudHMKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfVkFMVUUgPSBTaWduYWxzTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaWduYWxzVmlld2VyLjgiKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT19WQUxVRSA9IFNpZ25hbHNNZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbHNWaWV3ZXIuOSIpOwotCi0JLy8gQ29sdW1uIHByb3BlcnRpZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1BfTkFNRSA9ICJuYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1BfUEFTUyA9ICJwYXNzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1BfU1VTUEVORCA9ICJzdXNwZW5kIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1BfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0JLy8gQ29sdW1uIGxhYmVscwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTF9OQU1FID0gU2lnbmFsc01lc3NhZ2VzLmdldFN0cmluZygiU2lnbmFsc1ZpZXdlci40Iik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMX1BBU1MgPSBTaWduYWxzTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaWduYWxzVmlld2VyLjUiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xfU1VTUEVORCA9IFNpZ25hbHNNZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbHNWaWV3ZXIuNiIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTF9ERVNDUklQVElPTiA9IFNpZ25hbHNNZXNzYWdlcy5nZXRTdHJpbmcoIlNpZ25hbHNWaWV3ZXIuNyIpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNpZ25hbHNWaWV3ZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFNpZ25hbHNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsJCQotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBDcmVhdGUgdGhlIHRhYmxlIGNvbHVtbnMKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwpOwotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJY29sdW1uc1swXS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbnNbMV0uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQkJY29sdW1uc1syXS5zZXRSZXNpemFibGUoZmFsc2UpOwotCQljb2x1bW5zWzNdLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQljb2x1bW5zWzBdLnNldFRleHQoQ0xfTkFNRSk7Ci0JCWNvbHVtbnNbMV0uc2V0VGV4dChDTF9QQVNTKTsKLQkJY29sdW1uc1syXS5zZXRUZXh0KENMX1NVU1BFTkQpOwotCQljb2x1bW5zWzNdLnNldFRleHQoQ0xfREVTQ1JJUFRJT04pOwotCi0JCVBpeGVsQ29udmVydGVyIHBjID0gbmV3IFBpeGVsQ29udmVydGVyKHBhcmVudCk7Ci0JCWNvbHVtbnNbMF0uc2V0V2lkdGgocGMuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIwKSk7Ci0JCWNvbHVtbnNbMV0uc2V0V2lkdGgocGMuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDE1KSk7Ci0JCWNvbHVtbnNbMl0uc2V0V2lkdGgocGMuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDE1KSk7Ci0JCWNvbHVtbnNbM10uc2V0V2lkdGgocGMuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKSk7Ci0KLQkJc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW117IENQX05BTUUsIENQX1BBU1MsIENQX1NVU1BFTkQsIENQX0RFU0NSSVBUSU9OIH0pOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9JQ2hlY2tQcm92aWRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvSUNoZWNrUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0MmFhYS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9JQ2hlY2tQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoZWNrUHJvdmlkZXIgewotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2soT2JqZWN0IGVsZW1lbnQpOwotfQotCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVDaGVja2JveFRhYmxlVmlld2VyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVDaGVja2JveFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjVhNmEuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvUFZhcmlhYmxlQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MudmFyaWFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUGl4ZWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFBWYXJpYWJsZUNoZWNrYm94VGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDaGVja2FibGUgewotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGNoZWNrU3RhdGVMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JcHJpdmF0ZSBJQ2hlY2tQcm92aWRlciBjaGVja1Byb3ZpZGVyID0gbnVsbDsKLQkKLQkvLyBTdHJpbmcgY29uc3RhbnRzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1ZBTFVFID0gUFZhcmlhYmxlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRXhwcmVzc2lvblZpZXdlci55ZXMiKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT19WQUxVRSA9IFBWYXJpYWJsZU1lc3NhZ2VzLmdldFN0cmluZygiUEV4cHJlc3Npb25WaWV3ZXIubm8iKTsKLQotCS8vIENvbHVtbiBwcm9wZXJ0aWVzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENQX05BTUUgPSAibmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENQX0pPQiA9ICJqb2IiOwotCi0JLy8gQ29sdW1uIGxhYmVscwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTF9OQU1FID0gUFZhcmlhYmxlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRXhwcmVzc2lvblZpZXdlci5uYW1lIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMX0pPQiA9IFBWYXJpYWJsZU1lc3NhZ2VzLmdldFN0cmluZygiUEV4cHJlc3Npb25WaWV3ZXIuam9iIik7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUEV4cHJlc3Npb25WaWV3ZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFBWYXJpYWJsZUNoZWNrYm94VGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkNIRUNLIHwgc3R5bGUpOwotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB0YWJsZSBjb2x1bW5zCi0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwpOwotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJY29sdW1uc1swXS5zZXRSZXNpemFibGUoZmFsc2UpOwotCQljb2x1bW5zWzFdLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sdW1uc1syXS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJY29sdW1uc1swXS5zZXRUZXh0KCIiKTsKLQkJY29sdW1uc1sxXS5zZXRUZXh0KENMX05BTUUpOwotCQljb2x1bW5zWzJdLnNldFRleHQoQ0xfSk9CKTsKLQotCQljb2x1bW5zWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkoKFBWYXJpYWJsZVZpZXdlclNvcnRlcilnZXRTb3J0ZXIoKSkuc2V0Q29sdW1uKDApOwotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbHVtbnNbMV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCSgoUFZhcmlhYmxlVmlld2VyU29ydGVyKWdldFNvcnRlcigpKS5zZXRDb2x1bW4oMSk7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQkJY29sdW1uc1syXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJKChQVmFyaWFibGVWaWV3ZXJTb3J0ZXIpZ2V0U29ydGVyKCkpLnNldENvbHVtbigyKTsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCVBpeGVsQ29udmVydGVyIHBjID0gbmV3IFBpeGVsQ29udmVydGVyKHBhcmVudCk7Ci0JCWNvbHVtbnNbMF0uc2V0V2lkdGgocGMuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDMpKTsKLQkJY29sdW1uc1sxXS5zZXRXaWR0aChwYy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMjApKTsKLQkJY29sdW1uc1syXS5zZXRXaWR0aChwYy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMjApKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXXsgIiIsIENQX05BTUUsIENQX0pPQiB9KTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgY2hlY2tTdGF0ZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGVja1N0YXRlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrUHJvdmlkZXIoSUNoZWNrUHJvdmlkZXIgY2hlY2tQcm92aWRlcikgewotICAgIAl0aGlzLmNoZWNrUHJvdmlkZXIgPSBjaGVja1Byb3ZpZGVyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZmlyZUNoZWNrU3RhdGVDaGFuZ2VkKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBjaGVja1N0YXRlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2hlY2tTdGF0ZUxpc3RlbmVyIGwgPSAoSUNoZWNrU3RhdGVMaXN0ZW5lcikgYXJyYXlbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBsLmNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVTZWxlY3QoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVNlbGVjdChldmVudCk7IC8vIHRoaXMgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0KLSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlyZUNoZWNrU3RhdGVDaGFuZ2VkKG5ldyBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KHRoaXMsIGRhdGEsIGl0ZW0uZ2V0Q2hlY2tlZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0JCQlzdXBlci5oYW5kbGVTZWxlY3QoZXZlbnQpOwotCQl9Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGdldENoZWNrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgV2lkZ2V0IHdpZGdldCA9IGZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYWJsZUl0ZW0pIHdpZGdldCkuZ2V0Q2hlY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gc2V0Q2hlY2tlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBzdGF0ZSkgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGVsZW1lbnQpOwotICAgICAgICBXaWRnZXQgd2lkZ2V0ID0gZmluZEl0ZW0oZWxlbWVudCk7Ci0gICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLSAgICAgICAgICAgICgoVGFibGVJdGVtKSB3aWRnZXQpLnNldENoZWNrZWQoc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0JCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCWlmIChjaGVja1Byb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkoKFRhYmxlSXRlbSl3aWRnZXQpLnNldENoZWNrZWQoY2hlY2tQcm92aWRlci5pc0NoZWNrKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvUFZhcmlhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTE1ZjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvUFZhcmlhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUFZhcmlhYmxlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQVmFyaWFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFBWYXJpYWJsZU1hbmFnZXIpIHsKLQkJCXJldHVybiAoKFBWYXJpYWJsZU1hbmFnZXIpaW5wdXRFbGVtZW50KS5nZXRQVmFyaWFibGVJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZURpYWxvZy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvUFZhcmlhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGI2YWYuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvUFZhcmlhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5tb2RlbC5JUERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QVmFyaWFibGVNYW5hZ2VyLlBWYXJpYWJsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgUFZhcmlhYmxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdfTU9ERSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFID0gMTsKLQlwcm90ZWN0ZWQgVGV4dCB2YXJUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGFibGUgdmFyVGFibGUgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tCdG4gPSBudWxsOwotCXByb3RlY3RlZCBQVmFyaWFibGVWaWV3IHZpZXcgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgbW9kZSA9IE5FV19NT0RFOwotCi0JcHVibGljIFBWYXJpYWJsZURpYWxvZyhQVmFyaWFibGVWaWV3IHZpZXcpIHsKLQkJdGhpcyh2aWV3LCBORVdfTU9ERSk7Ci0JfQotCXB1YmxpYyBQVmFyaWFibGVEaWFsb2coUFZhcmlhYmxlVmlldyB2aWV3LCBpbnQgbW9kZSkgewotCQlzdXBlcih2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJdGhpcy5tb2RlID0gbW9kZTsKLQl9Ci0JcHVibGljIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJbmV3U2hlbGwuc2V0VGV4dChQVmFyaWFibGVNZXNzYWdlcy5nZXRTdHJpbmcoIlBWYXJpYWJsZXNEaWFsb2cudGl0bGUiKSk7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQl9Ci0JLyoqIEdldCBPSyBCdXR0b24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEJ1dHRvbiBnZXRPa0J1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLSAgICB9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU90aGVyc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDI1OwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQljb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkKLQkJY2hlY2tCdG4gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQnRuLnNldFRleHQoUFZhcmlhYmxlTWVzc2FnZXMuZ2V0U3RyaW5nKCJQVmFyaWFibGVzRGlhbG9nLmNoZWNrQnRuIikpOwotCQljaGVja0J0bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0gICAgLyoqIERpc3BsYXkgdGhlIGF2YWlsYWJsZSB2YXJpYWJsZSBpbiBkZWJ1Z2dlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmFyU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGFHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlhR3JvdXAuc2V0VGV4dChQVmFyaWFibGVNZXNzYWdlcy5nZXRTdHJpbmcoIlBWYXJpYWJsZXNEaWFsb2cudmFyU2VjdGlvbiIpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlhR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWFHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJCi0JCUxhYmVsIGF2YWlsTGFiZWwgPSBuZXcgTGFiZWwoYUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWF2YWlsTGFiZWwuc2V0VGV4dChQVmFyaWFibGVNZXNzYWdlcy5nZXRTdHJpbmcoIlBWYXJpYWJsZXNEaWFsb2cuYXZhaWxWYXIiKSk7Ci0JCWF2YWlsTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCQotCQl2YXJUYWJsZSA9IG5ldyBUYWJsZShhR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gMzAwOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMTUwOwotCQkvL2dkLnZlcnRpY2FsU3BhbiA9IDMwOwotCQl2YXJUYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdmFyVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBpdGVtLmdldENoZWNrZWQoKTsKLQkJCQlpZiAoY2hlY2tlZCkgewotCQkJCQl2YXJUZXh0LnNldFRleHQoIiIpOwotCQkJCX0KLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQkJaXRlbS5zZXRDaGVja2VkKGNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQotCQlMYWJlbCBjdXN0TGFiZWwgPSBuZXcgTGFiZWwoYUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWN1c3RMYWJlbC5zZXRUZXh0KFBWYXJpYWJsZU1lc3NhZ2VzLmdldFN0cmluZygiUFZhcmlhYmxlc0RpYWxvZy5jdXN0VmFyIikpOwotCQljdXN0TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCXZhclRleHQgPSBuZXcgVGV4dChhR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTk9ORSk7Ci0JCXZhclRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXZhclRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKHZhclRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhclRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQkJdmFyVGV4dC5zZXRGb2N1cygpOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gYW55VGFibGVJdGVtQ2hlY2tlZChUYWJsZSB0YWJsZSkgewotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGl0ZW1zW2ldLmdldENoZWNrZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQlpZiAoZ2V0U2VsZWN0ZWRWYXJpYWJsZXMoKS5sZW5ndGggPT0gMCkgewotCQkJZW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWdldE9rQnV0dG9uKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0JLyoqIEluaXRpYWxpemUgdGhlIGNvbnRlbnQgaW4gbmV3IHNlY3Rpb24gYW5kIHZhcmlhYmxlIHNlY3Rpb24KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudCgpIHsKLQkJUFZhcmlhYmxlSW5mbyBqVmFyID0gbnVsbDsKLQkJaWYgKG1vZGUgPT0gRURJVF9NT0RFKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXcuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlqVmFyID0gKFBWYXJpYWJsZUluZm8pKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXZhclRleHQuc2V0VGV4dChqVmFyLmdldE5hbWUoKSk7Ci0JCQkJY2hlY2tCdG4uc2V0U2VsZWN0aW9uKGpWYXIuaXNFbmFibGVkKCkpOwotCQkJfQotCQl9Ci0KLQkJVGFibGVJdGVtIGl0ZW0gPSBudWxsOwkJCi0JCWZvciAoU3RyaW5nIHZhciA6IGdldEF2YWlsYWJsZVZhcmlhYmxlcygpKSB7Ci0JCQlpdGVtID0gbmV3IFRhYmxlSXRlbSh2YXJUYWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KHZhcik7Ci0JCQlpZiAoalZhciAhPSBudWxsKSB7Ci0JCQkJaXRlbS5zZXRDaGVja2VkKGpWYXIuZ2V0TmFtZSgpLmVxdWFscyh2YXIpKTsKLQkJCX0KLQkJfQkJCi0JfQotCS8qKiBHZXQgdmFyaWFibGVzIGZyb20gRGVidWcgVmlldwotCSAqIEByZXR1cm4gdmFyaWFibGUgbmFtZXMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QXZhaWxhYmxlVmFyaWFibGVzKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXcuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRTZWxlY3Rpb24oSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVyk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCB0YXJnZXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl0cnkgewotCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU3RhY2tGcmFtZSkgewotCQkJCQlyZXR1cm4gZ2V0VmFyaWFibGVzKChJU3RhY2tGcmFtZSl0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJVGhyZWFkKSB7Ci0JCQkJCXJldHVybiBnZXRWYXJpYWJsZXMoKChJVGhyZWFkKXRhcmdldCkuZ2V0VG9wU3RhY2tGcmFtZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVBEZWJ1Z1RhcmdldCkgewotCQkJCQlJVGhyZWFkW10gdGhyZWFkcyA9ICgoSVBEZWJ1Z1RhcmdldCl0YXJnZXQpLmdldFRocmVhZHMoKTsKLQkJCQkJaWYgKHRocmVhZHMubGVuZ3RoID4gMCkgewotCQkJCQkJcmV0dXJuIGdldFZhcmlhYmxlcyh0aHJlYWRzWzBdLmdldFRvcFN0YWNrRnJhbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VmFyaWFibGVzKElTdGFja0ZyYW1lIGZyYW1lKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoZnJhbWUgPT0gbnVsbCkgCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCi0JCUlWYXJpYWJsZVtdIHZhcnMgPSBmcmFtZS5nZXRWYXJpYWJsZXMoKTsKLQkJU3RyaW5nW10gdmFyVGV4dHMgPSBuZXcgU3RyaW5nW3ZhcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaj0wOyBqPHZhcnMubGVuZ3RoOyBqKyspIHsKLQkJCXZhclRleHRzW2pdID0gdmFyc1tqXS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHZhclRleHRzOwotCX0KLQkvKiogQ3JlYXRlIHZlcnRpY2FsIHNwYWNlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzcGFjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnRpY2FsU3BhbihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3BhY2UpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IHNwYWNlOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJc3dpdGNoKG1vZGUpIHsKLQkJY2FzZSBORVdfTU9ERToKLQkJCWdldE9rQnV0dG9uKCkuc2V0VGV4dCgiQ3JlYXRlIik7Ci0JCQlicmVhazsKLQkJY2FzZSBFRElUX01PREU6Ci0JCQlnZXRPa0J1dHRvbigpLnNldFRleHQoIkVkaXQiKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJY3JlYXRlVmFyU2VjdGlvbihjb21wb3NpdGUpOwotCQljcmVhdGVWZXJ0aWNhbFNwYW4oY29tcG9zaXRlLCAyKTsKLQkJY3JlYXRlT3RoZXJzU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCWluaXRDb250ZW50KCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRTZWxlY3RlZFZhcmlhYmxlcygpIHsKLQkJTGlzdDxTdHJpbmc+IHZhcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSB2YXJUYWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpdGVtc1tpXS5nZXRDaGVja2VkKCkpIHsKLQkJCQl2YXJzLmFkZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQobW9kZT09TkVXX01PREUpOwotCQkJfQotCQl9Ci0JCWlmICh2YXJzLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodmFyVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdmFycy5hZGQodmFyVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pdmFycy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJUFZhcmlhYmxlTWFuYWdlciBqb2JNZ3IgPSB2aWV3LmdldFVJTWFuYWdlcigpLmdldEpvYlZhcmlhYmxlTWFuYWdlcigpOwotCQlJUEpvYiBqb2IgPSB2aWV3LmdldFVJTWFuYWdlcigpLmdldEpvYigpOwotCQlTdHJpbmdbXSB2YXJzID0gZ2V0U2VsZWN0ZWRWYXJpYWJsZXMoKTsKLQkJYm9vbGVhbiBjaGVja2VkID0gY2hlY2tCdG4uZ2V0U2VsZWN0aW9uKCk7Ci0JCXN3aXRjaChtb2RlKSB7Ci0JCWNhc2UgTkVXX01PREU6Ci0JCQkvL2NoZWNrIGR1cGxpY2F0ZSB2YXJpYWJsZQotCQkJZm9yIChpbnQgaT0wOyBpPHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlqb2JNZ3IuYWRkVmFyaWFibGUoam9iLCB2YXJzW2ldLCBjaGVja2VkKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQVFBEZWJ1Z1VJUGx1Z2luLmVycm9yRGlhbG9nKCJEdXBsaWNhdGUgdmFyaWFibGUiLCBlLmdldFN0YXR1cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFRElUX01PREU6Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXcuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlQVmFyaWFibGVJbmZvIGpWYXIgPSAoUFZhcmlhYmxlSW5mbykoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJZm9yIChTdHJpbmcgdmFyIDogdmFycykgewotCQkJCQlTdHJpbmcgbmV3dmFyID0galZhci5nZXROYW1lKCkuZXF1YWxzKHZhcik/bnVsbDp2YXI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlqb2JNZ3IudXBkYXRlVmFyaWFibGUoam9iLCBqVmFyLmdldE5hbWUoKSwgbmV3dmFyLCBjaGVja2VkKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5MDRkNy4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUFZhcmlhYmxlTWFuYWdlci5QVmFyaWFibGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQVmFyaWFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElDaGVja1Byb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUFZhcmlhYmxlSW5mbykgewotCQkJcmV0dXJuICgoUFZhcmlhYmxlSW5mbyllbGVtZW50KS5pc0VuYWJsZWQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBWYXJpYWJsZUluZm8pIHsKLQkJCVBWYXJpYWJsZUluZm8galZhciA9IChQVmFyaWFibGVJbmZvKWVsZW1lbnQ7Ci0JCQlzd2l0Y2goY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4galZhci5nZXROYW1lKCk7Ci0JCQljYXNlIDI6Ci0JCQkJcmV0dXJuIGpWYXIuZ2V0Sm9iKCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVNZXNzYWdlcy5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvaW50ZXJuYWwvdWkvdmlld3MvdmFyaWFibGUvUFZhcmlhYmxlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmODFkOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFBWYXJpYWJsZU1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlLlBWYXJpYWJsZU1lc3NhZ2VzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIFBWYXJpYWJsZU1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNjZDNjLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAjIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAjIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAjIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAjIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICMgCi0gIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICMgCi0gIyBMQS1DQyAwNC0xMTUKLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotICMgQGF1dGhvciBDbGVtZW50Ci0gIwotICMjCi0KLVBFeHByZXNzaW9uVmlld2VyLm5hbWU9TmFtZQotUEV4cHJlc3Npb25WaWV3ZXIuc2V0PVNldAotUEV4cHJlc3Npb25WaWV3ZXIuam9iPUpvYgotUEV4cHJlc3Npb25WaWV3ZXIueWVzPXllcwotUEV4cHJlc3Npb25WaWV3ZXIubm89bm8KLQotUFZhcmlhYmxlc0RpYWxvZy50aXRsZT1QVFAgVmFyaWFibGUKLVBWYXJpYWJsZXNEaWFsb2cuYXZhaWxWYXI9QXZhaWxhYmxlIHZhcmlhYmxlIGZyb20gZGVidWdnZXI6Ci1QVmFyaWFibGVzRGlhbG9nLmN1c3RWYXI9RXhwcmVzc2lvbjoKLVBWYXJpYWJsZXNEaWFsb2cuc2V0U2VjdGlvbj1TZXRzCi1QVmFyaWFibGVzRGlhbG9nLnZhclNlY3Rpb249VmFyaWFibGUKLVBWYXJpYWJsZXNEaWFsb2cuY2hlY2tCdG49RW5hYmxlL0Rpc2FibGUgdmFyaWFibGUKZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZVZpZXcuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczM2M3Mi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0RGVidWdWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuVUlEZWJ1Z01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBWYXJpYWJsZU1hbmFnZXIuUFZhcmlhYmxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5BZGRQRXhwcmVzc2lvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5Db21wYXJlVmFsdWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuRGVsZXRlUEV4cHJlc3Npb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuRWRpdFBFeHByZXNzaW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlVwZGF0ZVBFeHByZXNzaW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5BYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLklQVFBEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5QVFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgUFZhcmlhYmxlVmlldyBleHRlbmRzIEFic3RyYWN0RGVidWdWaWV3IGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgZkV2ZW50SGFuZGxlcjsKLQlwcml2YXRlIFVJRGVidWdNYW5hZ2VyIHVpTWFuYWdlciA9IG51bGw7Ci0JcHJpdmF0ZSBQVmFyaWFibGVDaGVja2JveFRhYmxlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXVpTWFuYWdlciA9IFBUUERlYnVnVUlQbHVnaW4uZ2V0VUlEZWJ1Z01hbmFnZXIoKTsKLQkJCi0JCS8vIGFkZCB0cmVlIHZpZXdlcgotCQl2aWV3ZXIgPSBuZXcgUFZhcmlhYmxlQ2hlY2tib3hUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCVBWYXJpYWJsZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgUFZhcmlhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCVBWYXJpYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBQVmFyaWFibGVMYWJlbFByb3ZpZGVyKCk7Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldENoZWNrUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IFBWYXJpYWJsZVZpZXdlclNvcnRlcigpKTsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCXZpZXdlci5zZXRJbnB1dCh1aU1hbmFnZXIuZ2V0Sm9iVmFyaWFibGVNYW5hZ2VyKCkpOwotCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQotCQl2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCSAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCSAgICAJaWYgKCFnZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJICAgIAkJZ2V0QWN0aW9uKEVkaXRQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKS5ydW4oKTsKLQkJICAgIAl9Ci0JCSAgICB9Ci0JCX0pOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJICAgIAl1cGRhdGVBY3Rpb25zRW5hYmxlKCk7Ci0JCSAgICB9Ci0JCX0pOwotCQlzZXRFdmVudEhhbmRsZXIobmV3IFBWYXJpYWJsZVZpZXdFdmVudEhhbmRsZXIodGhpcykpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQlwdWJsaWMgVUlEZWJ1Z01hbmFnZXIgZ2V0VUlNYW5hZ2VyKCkgewotCQlyZXR1cm4gdWlNYW5hZ2VyOwotCX0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl2aWV3ZXIucmVmcmVzaCgpOwotCQl1cGRhdGVBY3Rpb25zRW5hYmxlKCk7Ci0JfQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyB2aWV3Ci0JICogCi0JICogQHBhcmFtIGV2ZW50SGFuZGxlciBldmVudCBoYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXZlbnRIYW5kbGVyKEFic3RyYWN0UERlYnVnVmlld0V2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpIHsKLQkJdGhpcy5mRXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGlzIHZpZXcKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBldmVudCBoYW5kbGVyIGZvciB0aGlzIHZpZXcKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpIHsKLQkJcmV0dXJuIHRoaXMuZkV2ZW50SGFuZGxlcjsKLQl9CQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0RGVidWdWaWV3I2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXNldEFjdGlvbihBZGRQRXhwcmVzc2lvbkFjdGlvbi5uYW1lLCBuZXcgQWRkUEV4cHJlc3Npb25BY3Rpb24odGhpcykpOwotCQlzZXRBY3Rpb24oRWRpdFBFeHByZXNzaW9uQWN0aW9uLm5hbWUsIG5ldyBFZGl0UEV4cHJlc3Npb25BY3Rpb24odGhpcykpOwotCQlzZXRBY3Rpb24oRGVsZXRlUEV4cHJlc3Npb25BY3Rpb24ubmFtZSwgbmV3IERlbGV0ZVBFeHByZXNzaW9uQWN0aW9uKHRoaXMpKTsKLQkJc2V0QWN0aW9uKFVwZGF0ZVBFeHByZXNzaW9uQWN0aW9uLm5hbWUsIG5ldyBVcGRhdGVQRXhwcmVzc2lvbkFjdGlvbih0aGlzKSk7Ci0JCXNldEFjdGlvbihDb21wYXJlVmFsdWVBY3Rpb24ubmFtZSwgbmV3IENvbXBhcmVWYWx1ZUFjdGlvbih0aGlzKSk7Ci0KLQkJdXBkYXRlQWN0aW9uc0VuYWJsZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdERlYnVnVmlldyNjb25maWd1cmVUb29sQmFyKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1ncikgewotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlZBUl9HUk9VUCkpOwotCi0JCXRvb2xCYXJNZ3IuYXBwZW5kVG9Hcm91cChJUFRQRGVidWdVSUNvbnN0YW50cy5WQVJfR1JPVVAsIGdldEFjdGlvbihBZGRQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKSk7CQkKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlZBUl9HUk9VUCwgZ2V0QWN0aW9uKEVkaXRQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKSk7CQkKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlZBUl9HUk9VUCwgZ2V0QWN0aW9uKERlbGV0ZVBFeHByZXNzaW9uQWN0aW9uLm5hbWUpKTsJCQotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUERlYnVnVUlDb25zdGFudHMuVkFSX0dST1VQLCBnZXRBY3Rpb24oVXBkYXRlUEV4cHJlc3Npb25BY3Rpb24ubmFtZSkpOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUERlYnVnVUlDb25zdGFudHMuVkFSX0dST1VQLCBnZXRBY3Rpb24oQ29tcGFyZVZhbHVlQWN0aW9uLm5hbWUpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjZ2V0SGVscENvbnRleHRJZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwQ29udGV4dElkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXcjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudS5hZGQoZ2V0QWN0aW9uKEFkZFBFeHByZXNzaW9uQWN0aW9uLm5hbWUpKTsKLQkJbWVudS5hZGQoZ2V0QWN0aW9uKEVkaXRQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKSk7Ci0JCW1lbnUuYWRkKGdldEFjdGlvbihEZWxldGVQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKSk7Ci0JCW1lbnUuYWRkKGdldEFjdGlvbihVcGRhdGVQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW1lbnUuYWRkKGdldEFjdGlvbihDb21wYXJlVmFsdWVBY3Rpb24ubmFtZSkpOwotCQl1cGRhdGVPYmplY3RzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXZpZXdlci5yZW1vdmVDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGdldEV2ZW50SGFuZGxlcigpICE9IG51bGwpIHsKLQkJCWdldEV2ZW50SGFuZGxlcigpLmRpc3Bvc2UoKTsKLQkJfQkKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKT09MCk7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc0N1cnJlbnRKb2JBdmFpbGFibGUoKSB7Ci0JCVN0cmluZyBjdXJfamlkID0gdWlNYW5hZ2VyLmdldEN1cnJlbnRKb2JJZCgpOwotCQlyZXR1cm4gKGN1cl9qaWQgIT0gbnVsbCAmJiBjdXJfamlkLmxlbmd0aCgpID4gMCk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uc0VuYWJsZSgpIHsKLQkJZ2V0QWN0aW9uKEFkZFBFeHByZXNzaW9uQWN0aW9uLm5hbWUpLnNldEVuYWJsZWQoaXNDdXJyZW50Sm9iQXZhaWxhYmxlKCkpOwotCQlnZXRBY3Rpb24oRWRpdFBFeHByZXNzaW9uQWN0aW9uLm5hbWUpLnNldEVuYWJsZWQoIWdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0JCWdldEFjdGlvbihEZWxldGVQRXhwcmVzc2lvbkFjdGlvbi5uYW1lKS5zZXRFbmFibGVkKCFnZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotCQlnZXRBY3Rpb24oVXBkYXRlUEV4cHJlc3Npb25BY3Rpb24ubmFtZSkuc2V0RW5hYmxlZCghaXNFbXB0eSgpKTsKLQkJZ2V0QWN0aW9uKENvbXBhcmVWYWx1ZUFjdGlvbi5uYW1lKS5zZXRFbmFibGVkKCFnZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3QgZGF0YSA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBQVmFyaWFibGVJbmZvKSB7Ci0JCQl0cnkgewotCQkJCWdldFVJTWFuYWdlcigpLmdldEpvYlZhcmlhYmxlTWFuYWdlcigpLnVwZGF0ZVZhcmlhYmxlU3RhdHVzKChQVmFyaWFibGVJbmZvKWRhdGEsIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZVZpZXdFdmVudEhhbmRsZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZVZpZXdFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1MzhkOC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVWaWV3RXZlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLnZhcmlhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LklQRGVidWdJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5BYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmxpc3RlbmVycy5JSm9iQ2hhbmdlZExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqLwotcHVibGljIGNsYXNzIFBWYXJpYWJsZVZpZXdFdmVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgaW1wbGVtZW50cyBJSm9iQ2hhbmdlZExpc3RlbmVyIHsKLQlwcml2YXRlIFBWYXJpYWJsZU1hbmFnZXIgdmFyTWdyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXZlbnQgaGFuZGxlciBvbiB0aGUgZ2l2ZW4gdmlldwotCSAqIEBwYXJhbSB2aWV3IHZhcmlhYmxlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBQVmFyaWFibGVWaWV3RXZlbnRIYW5kbGVyKFBWYXJpYWJsZVZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQkJdmFyTWdyID0gUFRQRGVidWdVSVBsdWdpbi5nZXRVSURlYnVnTWFuYWdlcigpLmdldEpvYlZhcmlhYmxlTWFuYWdlcigpOwotCQlQVFBEZWJ1Z1VJUGx1Z2luLmdldFVJRGVidWdNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlQVFBEZWJ1Z1VJUGx1Z2luLmdldFVJRGVidWdNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyBQVmFyaWFibGVWaWV3IGdldFBWYXJpYWJsZVZpZXcoKSB7Ci0JCXJldHVybiAoUFZhcmlhYmxlVmlldylnZXRWaWV3KCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlZnJlc2goYm9vbGVhbiBhbGwpIHsKLQkJaWYgKGdldFBWYXJpYWJsZVZpZXcoKS5pc1Zpc2libGUoKSkgewotCQkJZ2V0UFZhcmlhYmxlVmlldygpLnJlZnJlc2goKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyI2RvSGFuZGxlRGVidWdFdmVudChvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5ldmVudC5JUERlYnVnRXZlbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRGVidWdFdmVudChJUERlYnVnRXZlbnQgZXZlbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzd2l0Y2goZXZlbnQuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElQRGVidWdFdmVudC5SRVNVTUU6Ci0JCQkJSVBEZWJ1Z0luZm8gaW5mbyA9IGV2ZW50LmdldEluZm8oKTsKLQkJCQl2YXJNZ3IucmVzZXRWYWx1ZShpbmZvLmdldEpvYigpLCBpbmZvLmdldEFsbFRhc2tzKCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS5saXN0ZW5lcnMuSUpvYkNoYW5nZWRMaXN0ZW5lciNqb2JDaGFuZ2VkRXZlbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBqb2JDaGFuZ2VkRXZlbnQoaW50IHR5cGUsIFN0cmluZyBjdXJfam9iX2lkLCBTdHJpbmcgcHJlX2pvYl9pZCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBJSm9iQ2hhbmdlZExpc3RlbmVyLkNIQU5HRUQ6Ci0JCQkvL3JlZnJlc2goKTsKLQkJCWJyZWFrOwotCQljYXNlIElKb2JDaGFuZ2VkTGlzdGVuZXIuUkVNT1ZFRDoKLQkJCWlmIChwcmVfam9iX2lkICE9IG51bGwpIHsKLQkJCQl2YXJNZ3IucmVtb3ZlVmFyaWFibGUocHJlX2pvYl9pZCk7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJZ2V0UFZhcmlhYmxlVmlldygpLnVwZGF0ZUFjdGlvbnNFbmFibGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy9pbnRlcm5hbC91aS92aWV3cy92YXJpYWJsZS9QVmFyaWFibGVWaWV3ZXJTb3J0ZXIuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZVZpZXdlclNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU4ZjJiLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL2ludGVybmFsL3VpL3ZpZXdzL3ZhcmlhYmxlL1BWYXJpYWJsZVZpZXdlclNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy52YXJpYWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBWYXJpYWJsZU1hbmFnZXIuUFZhcmlhYmxlSW5mbzsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQVmFyaWFibGVWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCXByaXZhdGUgYm9vbGVhbltdIHNvcnRPcmRlciA9IG5ldyBib29sZWFuW10geyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OwotCXByaXZhdGUgaW50IGNvbHVtbiA9IDA7Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKGludCBjb2x1bW4pIHsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXNvcnRPcmRlcltjb2x1bW5dID0gIXNvcnRPcmRlcltjb2x1bW5dOwotCX0KLQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0gICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0gICAgCWlmICghKGUxIGluc3RhbmNlb2YgUFZhcmlhYmxlSW5mbykpIHsKLSAgICAJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLSAgICAJfQotICAgIAkKLSAgIAkJYm9vbGVhbiBpc0FjY2VuZGluZyA9IHNvcnRPcmRlcltjb2x1bW5dOwotCQlzd2l0Y2ggKGNvbHVtbikgewotCQljYXNlIDA6Ci0JCQlpZiAoaXNBY2NlbmRpbmcpIHsKLQkJCQlyZXR1cm4gKChQVmFyaWFibGVJbmZvKWUxKS5pc0VuYWJsZWQoKT8xOi0xOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuICgoUFZhcmlhYmxlSW5mbyllMikuaXNFbmFibGVkKCk/MTotMTsKLQkJCX0KLQkJZGVmYXVsdDoKLQkgICAgCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JICAgIAkJSVRhYmxlTGFiZWxQcm92aWRlciBscHJvdiA9IChJVGFibGVMYWJlbFByb3ZpZGVyKSAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlld2VyKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJU3RyaW5nIG5hbWUxPSBscHJvdi5nZXRDb2x1bW5UZXh0KGUxLCBjb2x1bW4pOwotCQkJCVN0cmluZyBuYW1lMj0gbHByb3YuZ2V0Q29sdW1uVGV4dChlMiwgY29sdW1uKTsKLQkJCQlpZiAoaXNBY2NlbmRpbmcpIHsKLQkJCQkJcmV0dXJuIG5hbWUxLmNvbXBhcmVUbyhuYW1lMik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbmFtZTIuY29tcGFyZVRvKG5hbWUxKTsKLQkJCQl9Ci0JICAgIAl9Ci0JCX0KLSAgICAJcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvSVBUUERlYnVnVUlDb25zdGFudHMuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL0lQVFBEZWJ1Z1VJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDFmYjUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvSVBUUERlYnVnVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWk7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUFRQRGVidWdVSUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gUExVR0lOX0lEICsgIi4iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BFUlNQRUNUSVZFX0RFQlVHID0gUFJFRklYICsgIlBUUERlYnVnUGVyc3BlY3RpdmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1ZJRVdfUEFSQUxMRUxERUJVRyA9IFBSRUZJWCArICJ2aWV3cy5wYXJhbGxlbERlYnVnVmlldyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVklFV19BUlJBWSA9IFBSRUZJWCArICJ2aWV3cy5BcnJheVZpZXciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1ZJRVdfU0lHTkFMID0gUFJFRklYICsgInZpZXdzLlNpZ25hbHNWaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9WSUVXX1ZBUklBQkxFID0gUFJFRklYICsgInZpZXdzLlBWYXJpYWJsZVZpZXciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0JSRUFLUE9JTlRfT1JHQU5JWkVSID0gUFJFRklYICsgInBCcmVha3BvaW50U2V0T3JnYW5pemVyIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQlJFQUtQT0lOVF9QUk9QRVJUSUVTID0gUFJFRklYICsgImJyZWFrcG9pbnRQcm9wZXJ0aWVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5BQkxFX0RJU0FCTEVfQlJFQUtQT0lOVCA9IFBSRUZJWCArICJlbmFibGVEaXNhYmxlQnJlYWtwb2ludCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFVF9CUkVBS1BPSU5UID0gUFJFRklYICsgInRvZ2dsZUJyZWFrcG9pbnRSdWxlckFjdGlvbiI7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR19BTk5fSU5TVFJfUE9JTlRFUl9DVVJSRU5UID0gUFJFRklYICsgInJlZ0N1cnJlbnRJUCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHX0FOTl9JTlNUUl9QT0lOVEVSX1NFQ09OREFSWSA9IFBSRUZJWCArICJyZWdTZWNvbmRhcnlJUCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSU0VUX0FOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQgPSBQUkVGSVggKyAiY3VycmVudFNldElQIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfQU5OX0lOU1RSX1BPSU5URVJfQ1VSUkVOVCA9IFBSRUZJWCArICJzZXRJUCI7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX0dST1VQID0gInRocmVhZEdyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQX0dST1VQID0gInN0ZXBHcm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9JTlRPX0dST1VQID0gInN0ZXBJbnRvR3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBfT1ZFUl9HUk9VUCA9ICJzdGVwT3Zlckdyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQX1JFVFVSTl9HUk9VUCA9ICJzdGVwUmV0dXJuR3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NURVBfR1JPVVAgPSAiZW1wdHlTdGVwR3JvdXAiOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdfR1JPVVAgPSAicmVnR3JvdXAiOwkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9HUk9VUCA9ICJWYXJHcm91cCI7CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVSVRBQkVNUFRZR1JPVVAgPSAiZW1wdHlncm91cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVJVEFCVkFSSUFCTEVHUk9VUCA9ICJ2YXJpYWJsZWdyb3VwIjsJCi19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9QVFBEZWJ1Z1VJUGx1Z2luLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9QVFBEZWJ1Z1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTUwNzIuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvUFRQRGVidWdVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVBlcnNpc3RhYmxlU291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5QRGVidWdJbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuUERlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlVJRGVidWdNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuRGVmYXVsdFNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLklQVFBVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBjbGVtZW50IGNodQotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFBEZWJ1Z1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBQVFBEZWJ1Z1VJUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIHN0YXRpYyBVSURlYnVnTWFuYWdlciB1aURlYnVnTWFuYWdlciA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZGVmYXVsdCBzb3VyY2UgbG9jYXRvcgotCSAqIAotCSAqIEByZXR1cm4gZGVmYXVsdCBzb3VyY2UgbG9jYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBlcnNpc3RhYmxlU291cmNlTG9jYXRvciBjcmVhdGVEZWZhdWx0U291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U291cmNlTG9jYXRvcigpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdyBlcnJvciBkaWFsb2cKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvckRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHMpIHsKLQkJZXJyb3JEaWFsb2coc2hlbGwsIHRpdGxlLCBzLmdldE1lc3NhZ2UoKSwgcyk7Ci0JfQotCi0JLyoqIAotCSAqIFNob3cgZXJyb3IgZGlhbG9nCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvckRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzKSB7Ci0JCWlmIChzICE9IG51bGwgJiYgbWVzc2FnZS5lcXVhbHMocy5nZXRNZXNzYWdlKCkpKQotCQkJbWVzc2FnZSA9IG51bGw7Ci0KLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgcyk7Ci0JfQotCQotICAgIC8qKiAKLQkgKiBTaG93IGVycm9yIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3JEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCUlTdGF0dXMgc3RhdHVzOwotCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbil0KS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsICJFcnJvciB3aXRoaW4gRGVidWcgVUk6ICIsIHQpOwotCQkJbG9nKHN0YXR1cyk7CQotCQl9Ci0JCWVycm9yRGlhbG9nKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQl9CQotCi0JLyoqIAotCSAqIFNob3cgZXJyb3IgZGlhbG9nCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3JEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgVGhyb3dhYmxlIHQpIHsKLQkJZXJyb3JEaWFsb2coc2hlbGwsIHRpdGxlLCB0LmdldE1lc3NhZ2UoKSwgdCk7Ci0JfQotCQotCS8qKiAKLQkgKiBTaG93IGVycm9yIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yRGlhbG9nKFN0cmluZyB0aXRsZSwgSVN0YXR1cyBzKSB7Ci0JCWVycm9yRGlhbG9nKGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIHRpdGxlLCBzLmdldE1lc3NhZ2UoKSwgcyk7Ci0JfQotCQotCS8qKiAKLQkgKiBTaG93IGVycm9yIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yRGlhbG9nKFN0cmluZyB0aXRsZSwgVGhyb3dhYmxlIHQpIHsKLQkJZXJyb3JEaWFsb2coZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgdGl0bGUsIHQuZ2V0TWVzc2FnZSgpLCB0KTsKLQl9Ci0KLQkvKiogCi0JICogR2V0IGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCXJldHVybiB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogCi0JICogR2V0IGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93Ci0JICogCi0JICogQHJldHVybiBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUERlYnVnTW9kZWxQcmVzZW50YXRpb24gZ2V0RGVidWdNb2RlbFByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIFBEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQVFBEZWJ1Z1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqIAotCSAqIEdldCBkaXNwbGF5Ci0JICogCi0JICogQHJldHVybiBkaXNwbGF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCWRpc3BsYXk9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5OwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBQVFBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQkKLQkKLQkvKiogCi0JICogR2V0IHNoZWxsCi0JICogCi0JICogQHJldHVybiBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCWlmIChnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBzdGFuZGFyZCBkaXNwbGF5Ci0JICogCi0JICogQHJldHVybiBkaXNwbGF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVJRGVidWdNYW5hZ2VyIGdldFVJRGVidWdNYW5hZ2VyKCkgewotCQlyZXR1cm4gdWlEZWJ1Z01hbmFnZXI7Ci0JfQotCQotCS8qKiBHZXQgdW5pcXVlIGlkZW50aWZpZXIgb2YgcGx1Z2luCi0JICogCi0JICogQHJldHVybiBwbHVnaW4gaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkZW50aWZpZXIoKSB7Ci0JCWlmIChnZXREZWZhdWx0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0KLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFRlc3QgaWYgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgdGhlIFBUUCBkZWJ1ZyBwZXJzcGVjdGl2ZQotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZSBpcyB0aGUgUFRQIGRlYnVnIHBlcnNwZWN0aXZlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUFRQRGVidWdQZXJzcGVjdGl2ZSgpIHsKLQkJcmV0dXJuIGdldEN1cnJlbnRQZXJzcGVjdGl2ZUlEKCkuZXF1YWxzKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLklEX1BFUlNQRUNUSVZFX0RFQlVHKTsJCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIG9uZSBzdXBwbGllZCBieSBQVFAKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgc3VwcGxpZWQgYnkgUFRQCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUFRQUGVyc3BlY3RpdmUoKSB7Ci0JCVN0cmluZyBjdXJJRCA9IGdldEN1cnJlbnRQZXJzcGVjdGl2ZUlEKCk7Ci0JCWlmIChjdXJJRCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGN1cklELmVxdWFscyhJUFRQVUlDb25zdGFudHMuUEVSU1BFQ1RJVkVfUlVOKSB8fCBjdXJJRC5lcXVhbHMoSVBUUERlYnVnVUlDb25zdGFudHMuSURfUEVSU1BFQ1RJVkVfREVCVUcpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIExvZwotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JCi0JLyoqIAotCSAqIExvZyAKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKSk7Ci0JfQotCQotCS8qKiAKLQkgKiBMb2cKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJUFRQVUlDb25zdGFudHMuSU5URVJOQUxfRVJST1IsICJJbnRlcm5hbCBFcnJvciIsIGUpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBjdXJyZW50IHBlcnNwZWN0aXZlIElECi0JICogCi0JICogQHJldHVybiBjdXJyZW50IHBlcnNwZWN0aXZlIElECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbnRQZXJzcGVjdGl2ZUlEKCkgewotCQlyZXR1cm4gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldFBlcnNwZWN0aXZlKCkuZ2V0SWQoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUERFQlVHR0VSQ09ORklHVVJBVElPTl9FWFRFTlNJT05fUE9JTlRfSUQgPSAiZGVidWdnZXJDb25maWd1cmF0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdHRVJJRF9FTEVNRU5UID0gImRlYnVnZ2VySUQiOwotCi0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBmRGVidWdnZXJQYWdlTWFwOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQVFBEZWJ1Z1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKiogCi0JICogR2V0IGxhdW5jaCBkZWJ1Z2dlciB0YWIKLQkgKiAKLQkgKiBAcGFyYW0gZGVidWdnZXJJRAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZ2V0RGVidWdnZXJQYWdlKFN0cmluZyBkZWJ1Z2dlcklEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmRGVidWdnZXJQYWdlTWFwID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVEZWJ1Z2dlclBhZ2VNYXAoKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpZkRlYnVnZ2VyUGFnZU1hcC5nZXQoZGVidWdnZXJJRCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiIHRhYiA9IG51bGw7Ci0JCWlmIChjb25maWdFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRhYiA9IChJTGF1bmNoQ29uZmlndXJhdGlvblRhYiljb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCX0KLQkJcmV0dXJuIHRhYjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuVWlQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQl1aURlYnVnTWFuYWdlciA9IG5ldyBVSURlYnVnTWFuYWdlcigpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl1aURlYnVnTWFuYWdlci5zaHV0ZG93bigpOwotCQl1aURlYnVnTWFuYWdlciA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0JCi0JLyoqIAotCSAqIEluaXRpYWxpemUgbGF1bmNoIGRlYnVnZ2VyIHBhZ2UgIAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWJ1Z2dlclBhZ2VNYXAoKSB7Ci0JCWZEZWJ1Z2dlclBhZ2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oMTApOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgUERFQlVHR0VSQ09ORklHVVJBVElPTl9FWFRFTlNJT05fUE9JTlRfSUQpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpbmZvcyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBpZCA9IGluZm9zW2ldLmdldEF0dHJpYnV0ZShERUJVR0dFUklEX0VMRU1FTlQpOwotCQkJZkRlYnVnZ2VyUGFnZU1hcC5wdXQoaWQsIGluZm9zW2ldKTsKLQkJfQotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeShJbWFnZVJlZ2lzdHJ5IHJlZykgewotICAgIAlQRGVidWdJbWFnZS5pbml0aWFsaXplSW1hZ2VSZWdpc3RyeShyZWcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL1ByZWZlcmVuY2VzQWRhcHRlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvUHJlZmVyZW5jZXNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWMxMzAuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvUHJlZmVyZW5jZXNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEFkYXB0cyB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzfSB0bwotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZX0KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNBZGFwdGVyIGltcGxlbWVudHMgSVByZWZlcmVuY2VTdG9yZSB7Ci0KLQkvKioKLQkgKiBQcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuIExpc3RlbnMgZm9yIGV2ZW50cyBvZiB0eXBlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50fSBhbmQgZmlyZXMKLQkgKiBhIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnR9IG9uIHRoZQotCSAqIGFkYXB0ZXIgd2l0aCBhcmd1bWVudHMgZnJvbSB0aGUgcmVjZWl2ZWQgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoZXZlbnQuZ2V0UHJvcGVydHkoKSwgZXZlbnQuZ2V0T2xkVmFsdWUoKSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIExpc3RlbmVycyBvbiB0aGUgYWRhcHRlciAqLwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKLQkKLQkvKiogTGlzdGVuZXIgb24gdGhlIGFkYXB0ZWQgUHJlZmVyZW5jZXMgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZkxpc3RlbmVyPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQotCS8qKiBBZGFwdGVkIFByZWZlcmVuY2VzICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXM7Ci0KLQkvKiogVHJ1ZSBpZmYgbm8gZXZlbnRzIHNob3VsZCBiZSBmb3J3YXJkZWQgKi8KLQlwcml2YXRlIGJvb2xlYW4gZlNpbGVudDsKLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHdpdGggZW1wdHkgUHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VzQWRhcHRlcigpIHsKLQkJdGhpcyhuZXcgUHJlZmVyZW5jZXMoKSk7Ci0JfQotCS8qKgotCSAqIEluaXRpYWxpemUgd2l0aCB0aGUgZ2l2ZW4gUHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIHByZWZlcmVuY2VzIFRoZSBwcmVmZXJlbmNlcyB0byB3cmFwLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0FkYXB0ZXIoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJZlByZWZlcmVuY2VzPSBwcmVmZXJlbmNlczsKLQl9Ci0JCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lcnMuc2l6ZSgpID09IDApCi0JCQlmUHJlZmVyZW5jZXMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmTGlzdGVuZXIpOwotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlpZiAoZkxpc3RlbmVycy5zaXplKCkgPT0gMCkKLQkJCWZQcmVmZXJlbmNlcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXMuY29udGFpbnMobmFtZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAoIWZTaWxlbnQpIHsKLQkJCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQotCQkJCSgoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlcy5nZXRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VzLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlcy5nZXREZWZhdWx0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlcy5nZXREZWZhdWx0SW50KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TG9uZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VzLmdldERlZmF1bHRMb25nKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlcy5nZXREZWZhdWx0U3RyaW5nKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VzLmdldERvdWJsZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXMuZ2V0RmxvYXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXMuZ2V0SW50KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXMuZ2V0TG9uZyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlcy5nZXRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VzLmlzRGVmYXVsdChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXMubmVlZHNTYXZpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0cnkgewotCQkJZlNpbGVudD0gdHJ1ZTsKLQkJCWZQcmVmZXJlbmNlcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmU2lsZW50PSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJZlByZWZlcmVuY2VzLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotCQlmUHJlZmVyZW5jZXMuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlmUHJlZmVyZW5jZXMuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJZlByZWZlcmVuY2VzLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE9iamVjdCkgewotCQlmUHJlZmVyZW5jZXMuc2V0RGVmYXVsdChuYW1lLCBkZWZhdWx0T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlmUHJlZmVyZW5jZXMuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlmUHJlZmVyZW5jZXMuc2V0VG9EZWZhdWx0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWZQcmVmZXJlbmNlcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotCQlmUHJlZmVyZW5jZXMuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0JCWZQcmVmZXJlbmNlcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWZQcmVmZXJlbmNlcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJZlByZWZlcmVuY2VzLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJZlByZWZlcmVuY2VzLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvRGVidWdBY3Rpb25FdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0RlYnVnQWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4MDRmNi4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvRGVidWdBY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5ldmVudHM7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlYnVnQWN0aW9uRXZlbnQgaW1wbGVtZW50cyBJRGVidWdBY3Rpb25FdmVudCB7Ci0JcHJpdmF0ZSBPYmplY3Qgc291cmNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBqb2JfaWQgPSAiIjsKLQlwcml2YXRlIE9iamVjdCB0YXJnZXQgPSBudWxsOwotCQotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBqb2JfaWQKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXB1YmxpYyBEZWJ1Z0FjdGlvbkV2ZW50KFN0cmluZyBqb2JfaWQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkJdGhpcy5qb2JfaWQgPSBqb2JfaWQ7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmV2ZW50cy5JRGVidWdBY3Rpb25FdmVudCNnZXRKb2JJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2JJZCgpIHsKLQkJcmV0dXJuIGpvYl9pZDsKLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5ldmVudHMuSURlYnVnQWN0aW9uRXZlbnQjZ2V0U291cmNlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmV2ZW50cy5JRGVidWdBY3Rpb25FdmVudCNnZXRUYXJnZXQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9JRGVidWdBY3Rpb25FdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lEZWJ1Z0FjdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWJjMDUuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lEZWJ1Z0FjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmV2ZW50czsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVidWdBY3Rpb25FdmVudCB7Ci0JLyoqIEdldCBqb2IgSUQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2JJZCgpOwotCS8qKiBHZXQgc291cmNlIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpOwotCS8qKiBHZXQgZGVidWcgdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvSVJlc3VtZWREZWJ1Z0V2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvSVJlc3VtZWREZWJ1Z0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTk3ZjcuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lSZXN1bWVkRGVidWdFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5ldmVudHM7Ci0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc3VtZWREZWJ1Z0V2ZW50IGV4dGVuZHMgSURlYnVnQWN0aW9uRXZlbnQge30KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9JU3VzcGVuZGVkRGVidWdFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lTdXNwZW5kZWREZWJ1Z0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNGRiM2QuLjAwMDAwMDAKLS0tIGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lTdXNwZW5kZWREZWJ1Z0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmV2ZW50czsKLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3VzcGVuZGVkRGVidWdFdmVudCAgZXh0ZW5kcyBJRGVidWdBY3Rpb25FdmVudCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lUZXJtaW5hdGVkRGVidWdFdmVudC5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL0lUZXJtaW5hdGVkRGVidWdFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzEyY2FmLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9JVGVybWluYXRlZERlYnVnRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuZXZlbnRzOwotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXJtaW5hdGVkRGVidWdFdmVudCAgZXh0ZW5kcyBJRGVidWdBY3Rpb25FdmVudCB7fQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvZXZlbnRzL1Jlc3VtZWREZWJ1Z0V2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvUmVzdW1lZERlYnVnRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiM2M0NS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvUmVzdW1lZERlYnVnRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuZXZlbnRzOwotCi0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc3VtZWREZWJ1Z0V2ZW50IGV4dGVuZHMgRGVidWdBY3Rpb25FdmVudCBpbXBsZW1lbnRzIElSZXN1bWVkRGVidWdFdmVudCB7IAotCS8qKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBqb2JfaWQKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXB1YmxpYyBSZXN1bWVkRGVidWdFdmVudChTdHJpbmcgam9iX2lkLCBPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCXN1cGVyKGpvYl9pZCwgc291cmNlLCB0YXJnZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9TdXNwZW5kZWREZWJ1Z0V2ZW50LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvU3VzcGVuZGVkRGVidWdFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM3MjQ4Li4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9TdXNwZW5kZWREZWJ1Z0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmV2ZW50czsKLQotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXNwZW5kZWREZWJ1Z0V2ZW50IGV4dGVuZHMgRGVidWdBY3Rpb25FdmVudCBpbXBsZW1lbnRzIElSZXN1bWVkRGVidWdFdmVudCB7Ci0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIFN1c3BlbmRlZERlYnVnRXZlbnQoU3RyaW5nIGpvYl9pZCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCkgewotCQlzdXBlcihqb2JfaWQsIHNvdXJjZSwgdGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9ldmVudHMvVGVybWluYXRlZERlYnVnRXZlbnQuamF2YSBiL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9UZXJtaW5hdGVkRGVidWdFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY5MDFlLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2V2ZW50cy9UZXJtaW5hdGVkRGVidWdFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5ldmVudHM7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1pbmF0ZWREZWJ1Z0V2ZW50IGV4dGVuZHMgRGVidWdBY3Rpb25FdmVudCBpbXBsZW1lbnRzIElUZXJtaW5hdGVkRGVidWdFdmVudCB7Ci0JLyoqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGpvYl9pZAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIFRlcm1pbmF0ZWREZWJ1Z0V2ZW50KFN0cmluZyBqb2JfaWQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkJc3VwZXIoam9iX2lkLCBzb3VyY2UsIHRhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvbGlzdGVuZXJzL0lEZWJ1Z0FjdGlvblVwZGF0ZUxpc3RlbmVyLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9saXN0ZW5lcnMvSURlYnVnQWN0aW9uVXBkYXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzN2UzNC4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9saXN0ZW5lcnMvSURlYnVnQWN0aW9uVXBkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLmV2ZW50cy5JRGVidWdBY3Rpb25FdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIENsZW1lbnQgY2h1Ci0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z0FjdGlvblVwZGF0ZUxpc3RlbmVyIHsKLQkvKiogSGFuZGxlIGRlYnVnIGFjdGlvbiBldmVudAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnQWN0aW9uRXZlbnQoSURlYnVnQWN0aW9uRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvbGlzdGVuZXJzL0lSZWdMaXN0ZW5lci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvbGlzdGVuZXJzL0lSZWdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzM2ODMyLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL2xpc3RlbmVycy9JUmVnTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUudXRpbC5CaXRMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgQ2xlbWVudCBjaHUKLSAqIEBkZXByZWNhdGVkCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWdMaXN0ZW5lciB7Ci0JLyoqIFJlZ2lzdGVyIHRhc2tzCi0JICogQHBhcmFtIHRhc2tzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoQml0TGlzdCB0YXNrcyk7Ci0JLyoqIFVucmVnaXN0ZXIgdGFza3MKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKEJpdExpc3QgdGFza3MpOwotfQpkaWZmIC0tZ2l0IGEvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvc291cmNlbG9va3VwL0RlZmF1bHRTb3VyY2VMb2NhdG9yLmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9zb3VyY2Vsb29rdXAvRGVmYXVsdFNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzYzk5OS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS9zb3VyY2Vsb29rdXAvRGVmYXVsdFNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLnNvdXJjZWxvb2t1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5QU291cmNlTG9va3VwRGlyZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U291cmNlTG9jYXRvciBleHRlbmRzIFBTb3VyY2VMb29rdXBEaXJlY3RvciB7Ci0JLyoKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU1lbWVudG8oU3RyaW5nIG1lbWVudG8sIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IERlYnVnUGx1Z2luLnBhcnNlRG9jdW1lbnQobWVtZW50byk7Ci0JCWlmIChyb290RWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoT2xkRGVmYXVsdFNvdXJjZUxvY2F0b3IuRUxFTUVOVF9OQU1FKSkgewotCQkJaW5pdGlhbGl6ZUZyb21PbGRNZW1lbnRvKG1lbWVudG8sIGNvbmZpZ3VyYXRpb24pOwotCQl9IGVsc2UgewotCQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21NZW1lbnRvKG1lbWVudG8sIGNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRnJvbU9sZE1lbWVudG8oU3RyaW5nIG1lbWVudG8sIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZGlzcG9zZSgpOwotCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotCQlPbGREZWZhdWx0U291cmNlTG9jYXRvciBvbGQgPSBuZXcgT2xkRGVmYXVsdFNvdXJjZUxvY2F0b3IoKTsKLQkJb2xkLmluaXRpYWxpemVGcm9tTWVtZW50byhtZW1lbnRvKTsKLQkJSVBTb3VyY2VMb2NhdG9yIGNzbCA9IChJUFNvdXJjZUxvY2F0b3IpIG9sZC5nZXRBZGFwdGVyKElQU291cmNlTG9jYXRvci5jbGFzcyk7Ci0JCXNldEZpbmREdXBsaWNhdGVzKGNzbC5zZWFyY2hGb3JEdXBsaWNhdGVGaWxlcygpKTsKLQkJSVBTb3VyY2VMb2NhdGlvbltdIGxvY2F0aW9ucyA9IGNzbC5nZXRTb3VyY2VMb2NhdGlvbnMoKTsKLQotCQkvLyBDaGVjayBpZiB0aGUgb2xkIHNvdXJjZSBsb2NhdG9yIGluY2x1ZGVzIGFsbCByZWZlcmVuY2VkIHByb2plY3RzLgotCQkvLyBJZiBzbywgRGVmYXVsdFNwb3VyY2VDb250YWluZXIgc2hvdWxkIGJlIHVzZWQuCi0JCUlQcm9qZWN0IHByb2plY3QgPSBjc2wuZ2V0UHJvamVjdCgpOwotCQlMaXN0PElQcm9qZWN0PiBsaXN0ID0gUERlYnVnVXRpbHMuZ2V0UmVmZXJlbmNlZFByb2plY3RzKHByb2plY3QpOwotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KGxpc3Quc2l6ZSgpICsgMSk7Ci0JCW5hbWVzLmFkZChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCUl0ZXJhdG9yPElQcm9qZWN0PiBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmFtZXMuYWRkKCgoSVByb2plY3QpIGl0Lm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJfQotCQlib29sZWFuIGluY2x1ZGVzRGVmYXVsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAobG9jYXRpb25zW2ldIGluc3RhbmNlb2YgSVByb2plY3RTb3VyY2VMb2NhdGlvbiAmJiAoKElQcm9qZWN0U291cmNlTG9jYXRpb24pIGxvY2F0aW9uc1tpXSkuaXNHZW5lcmljKCkpIHsKLQkJCQlpZiAoIW5hbWVzLmNvbnRhaW5zKCgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkgewotCQkJCQlpbmNsdWRlc0RlZmF1bHQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIEdlbmVyYXRlIGFuIGFycmF5IG9mIG5ldyBzb3VyY2UgY29udGFpbmVycyBpbmNsdWRpbmcgRGVmYXVsdFNvdXJjZUNvbnRhaW5lcgotCQlMaXN0PElQU291cmNlTG9jYXRpb24+IGxvY3MgPSBuZXcgQXJyYXlMaXN0PElQU291cmNlTG9jYXRpb24+KGxvY2F0aW9ucy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJaWYgKCFpbmNsdWRlc0RlZmF1bHQgfHwgIShsb2NhdGlvbnNbaV0gaW5zdGFuY2VvZiBJUHJvamVjdFNvdXJjZUxvY2F0aW9uICYmIG5hbWVzLmNvbnRhaW5zKCgoSVByb2plY3RTb3VyY2VMb2NhdGlvbikgbG9jYXRpb25zW2ldKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkpCi0JCQkJbG9jcy5hZGQobG9jYXRpb25zW2ldKTsKLQkJfQotCQlJU291cmNlQ29udGFpbmVyW10gY29udGFpbmVycyA9IFNvdXJjZVV0aWxzLmNvbnZlcnRTb3VyY2VMb2NhdGlvbnMoKElQU291cmNlTG9jYXRpb25bXSkgbG9jcy50b0FycmF5KG5ldyBJUFNvdXJjZUxvY2F0aW9uW2xvY3Muc2l6ZSgpXSkpOwotCQlMaXN0PElTb3VyY2VDb250YWluZXI+IGNvbnMgPSBuZXcgQXJyYXlMaXN0PElTb3VyY2VDb250YWluZXI+KEFycmF5cy5hc0xpc3QoY29udGFpbmVycykpOwotCQlpZiAoaW5jbHVkZXNEZWZhdWx0KSB7Ci0JCQlEZWZhdWx0U291cmNlQ29udGFpbmVyIGRlZmF1bHRDb250YWluZXIgPSBuZXcgRGVmYXVsdFNvdXJjZUNvbnRhaW5lcigpOwotCQkJZGVmYXVsdENvbnRhaW5lci5pbml0KHRoaXMpOwotCQkJY29ucy5hZGQoMCwgZGVmYXVsdENvbnRhaW5lcik7Ci0JCX0KLQkJc2V0U291cmNlQ29udGFpbmVycygoSVNvdXJjZUNvbnRhaW5lcltdKSBjb25zLnRvQXJyYXkobmV3IElTb3VyY2VDb250YWluZXJbY29ucy5zaXplKCldKSk7Ci0JCWluaXRpYWxpemVQYXJ0aWNpcGFudHMoKTsKLQl9Ci0JKi8KLX0KZGlmZiAtLWdpdCBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL3ZpZXdzL1BhcmFsbGVsRGVidWdWaWV3LmphdmEgYi9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS92aWV3cy9QYXJhbGxlbERlYnVnVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE2OTQwLi4wMDAwMDAwCi0tLSBhL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL2RlYnVnL3VpL3ZpZXdzL1BhcmFsbGVsRGVidWdWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLnZpZXdlcnMubW9kZWwuSW50ZXJuYWxUcmVlTW9kZWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3REZWJ1Z1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLnV0aWwuQml0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZS5JUFNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUubW9kZWwuSVBEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuVUlEZWJ1Z01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVnaXN0ZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuUmVzdW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlN0ZXBJbnRvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlN0ZXBPdmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS5hY3Rpb25zLlN0ZXBSZXR1cm5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuU3VzcGVuZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkuYWN0aW9ucy5UZXJtaW5hdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLmFjdGlvbnMuVW5yZWdpc3RlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcuaW50ZXJuYWwudWkudmlld3MuQWJzdHJhY3RQRGVidWdWaWV3RXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aS5JUFRQRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkuUFRQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkuSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLmFjdGlvbnMuUGFyYWxsZWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5JSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5QYXJhbGxlbEpvYnNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuV29ya2JlbmNoSm9iOwotCi0vKioKLSAqIEBhdXRob3IgY2xlbWVudCBjaHUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGFyYWxsZWxEZWJ1Z1ZpZXcgZXh0ZW5kcyBQYXJhbGxlbEpvYnNWaWV3IHsKLQkvLyBhY3Rpb25zCi0JcHJvdGVjdGVkIFBhcmFsbGVsQWN0aW9uIHJlc3VtZUFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFBhcmFsbGVsQWN0aW9uIHN1c3BlbmRBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBQYXJhbGxlbEFjdGlvbiB0ZXJtaW5hdGVBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBQYXJhbGxlbEFjdGlvbiBzdGVwSW50b0FjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFBhcmFsbGVsQWN0aW9uIHN0ZXBPdmVyQWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUGFyYWxsZWxBY3Rpb24gc3RlcFJldHVybkFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFBhcmFsbGVsQWN0aW9uIHJlZ2lzdGVyQWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgUGFyYWxsZWxBY3Rpb24gdW5yZWdpc3RlckFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEFic3RyYWN0UERlYnVnVmlld0V2ZW50SGFuZGxlciBmRXZlbnRIYW5kbGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgVmlld2VyIGxhdW5jaFZpZXdlciA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZGVidWdWaWV3U2VsZWN0Q2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQRGVidWdFbGVtZW50KSB7Ci0JCQkJCQlpZiAoY2FudmFzICE9IG51bGwgJiYgIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlpZiAoZ2V0Q3VycmVudFNldCgpICE9IG51bGwpIHsKLQkJCQkJCQkJaW50IGluZGV4ID0gZ2V0Q3VycmVudFNldCgpLmZpbmRJbmRleEJ5TmFtZShTdHJpbmcudmFsdWVPZigoKElQRGVidWdFbGVtZW50KWVsZW1lbnQpLmdldElEKCkpKTsKLQkJCQkJCQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCQkJCQkJCWNhbnZhcy51bnNlbGVjdEFsbEVsZW1lbnRzKCk7Ci0JCQkJCQkJCQljYW52YXMuc2VsZWN0RWxlbWVudChpbmRleCk7Ci0JCQkJCQkJCQljYW52YXMuc2V0Q3VycmVudFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCQkJCQlyZWZyZXNoKGZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JLyoKLQlwcml2YXRlIE1vdXNlQWRhcHRlciBkZWJ1Z1ZpZXdNb3VzZUFkYXB0ZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCU9iamVjdCB0ZXN0ID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAodGVzdCBpbnN0YW5jZW9mIFRyZWUpIHsKLQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gKChUcmVlKXRlc3QpLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdFtdIHRhcmdldHMgPSBuZXcgT2JqZWN0W2l0ZW1zLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRhcmdldHNbaV0gPSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0JCQkJfQotCQkJCXNlbGVjdEVsZW1lbnRzKHRhcmdldHMpOwotCQkJfQotCQl9Ci0JfTsKLQkqLwotCXB1YmxpYyBQYXJhbGxlbERlYnVnVmlldyhJTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKG1hbmFnZXIpOwotCX0KLQlwdWJsaWMgUGFyYWxsZWxEZWJ1Z1ZpZXcoKSB7Ci0JCXRoaXMoUFRQRGVidWdVSVBsdWdpbi5nZXRVSURlYnVnTWFuYWdlcigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlWaWV3ZXIgdmlld2VyID0gZ2V0RGVidWdWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJdmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihkZWJ1Z1ZpZXdTZWxlY3RDaGFuZ2VkTGlzdGVuZXIpOwotCQlpZiAoZ2V0RXZlbnRIYW5kbGVyKCkgIT0gbnVsbCkKLQkJCWdldEV2ZW50SGFuZGxlcigpLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlciBnZXREZWJ1Z1ZpZXdlcigpIHsKLQkJaWYgKGxhdW5jaFZpZXdlciA9PSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCk7Ci0JCQlpZiAocGFnZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJSVZpZXdQYXJ0IHBhcnQgPSBwYWdlLmZpbmRWaWV3KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcpOwotCQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJCWlmIChwYWdlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXBhcnQgPSBwYWdlLnNob3dWaWV3KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcpOwotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBhcnQgIT0gbnVsbCAmJiBwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REZWJ1Z1ZpZXcpIHsKLQkJCQlsYXVuY2hWaWV3ZXIgPSAoKEFic3RyYWN0RGVidWdWaWV3KXBhcnQpLmdldFZpZXdlcigpOwotCQkJCWlmIChsYXVuY2hWaWV3ZXIgIT0gbnVsbCkKLQkJCQkJbGF1bmNoVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihkZWJ1Z1ZpZXdTZWxlY3RDaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBsYXVuY2hWaWV3ZXI7Ci0JfQotCQotCS8qCi0JICogRklYTUUgZG9lcyBub3Qgd29yayBpZiBjcmVhdGUgYSBuZXcgc2V0LiAgQ3VycmVudGx5IHdlIGNhbiB0YXNrIGlkIHRvIGlkZW50aWZ5IGljb24sIGJ1dCB2aWV3ZXIgaXMgdXNpbmcgb3JkZXIgCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEVsZW1lbnRzKGZpbmFsIE9iamVjdFtdIG9iamVjdHMpIHsKLSAgICAgICAgU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMudW5zZWxlY3RBbGxFbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IG9iamVjdHNbaV07Ci0JCQkJCQlpbnQgaWQgPSAoKFVJRGVidWdNYW5hZ2VyKSBtYW5hZ2VyKS5nZXRTZWxlY3RlZFJlZ2lzdGVyZWRUYXNrcyhvYmopOwotCQkJCQkJaWYgKGlkID4gLTEpIHsKLQkJCQkJCQlpZiAoIWNhbnZhcy5pc1NlbGVjdGVkKGlkKSkKLQkJCQkJCQkJY2FudmFzLnNlbGVjdEVsZW1lbnQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCSovCi0JCQotCS8qKgotCSAqIFNldHMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgdmlldwotCSAqIAotCSAqIEBwYXJhbSBldmVudEhhbmRsZXIgZXZlbnQgaGFuZGxlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV2ZW50SGFuZGxlcihBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKSB7Ci0JCXRoaXMuZkV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyB2aWV3Ci0JICogCi0JICogQHJldHVybiBUaGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyB2aWV3Ci0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0UERlYnVnVmlld0V2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSB7Ci0JCXJldHVybiB0aGlzLmZFdmVudEhhbmRsZXI7Ci0JfQkKLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLlBhcmFsbGVsSm9iVmlldyNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlVmlldyhwYXJlbnQpOwotCQlzZXRFdmVudEhhbmRsZXIobmV3IFBhcmFsbGVsRGVidWdWaWV3RXZlbnRIYW5kbGVyKHRoaXMpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxTZXRWaWV3I2ZpbGxDb250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUERlYnVnVUlDb25zdGFudHMuVEhSRUFEX0dST1VQKSk7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUERlYnVnVUlDb25zdGFudHMuU1RFUF9HUk9VUCkpOwotCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVBUUERlYnVnVUlDb25zdGFudHMuU1RFUF9JTlRPX0dST1VQKSk7Ci0JCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJUFRQRGVidWdVSUNvbnN0YW50cy5TVEVQX09WRVJfR1JPVVApKTsKLQkJbWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlNURVBfUkVUVVJOX0dST1VQKSk7Ci0JCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJUFRQRGVidWdVSUNvbnN0YW50cy5FTVBUWV9TVEVQX0dST1VQKSk7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVBUUERlYnVnVUlDb25zdGFudHMuUkVHX0dST1VQKSk7Ci0KLQkJbWFuYWdlci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlRIUkVBRF9HUk9VUCwgcmVzdW1lQWN0aW9uKTsKLQkJbWFuYWdlci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlRIUkVBRF9HUk9VUCwgc3VzcGVuZEFjdGlvbik7Ci0JCW1hbmFnZXIuYXBwZW5kVG9Hcm91cChJUFRQRGVidWdVSUNvbnN0YW50cy5USFJFQURfR1JPVVAsIHRlcm1pbmF0ZUFjdGlvbik7Ci0JCW1hbmFnZXIuYXBwZW5kVG9Hcm91cChJUFRQRGVidWdVSUNvbnN0YW50cy5TVEVQX0lOVE9fR1JPVVAsIHN0ZXBJbnRvQWN0aW9uKTsKLQkJbWFuYWdlci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlNURVBfT1ZFUl9HUk9VUCwgc3RlcE92ZXJBY3Rpb24pOwotCQltYW5hZ2VyLmFwcGVuZFRvR3JvdXAoSVBUUERlYnVnVUlDb25zdGFudHMuRU1QVFlfU1RFUF9HUk9VUCwgc3RlcFJldHVybkFjdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsU2V0VmlldyNjcmVhdGVUb29sQmFyQWN0aW9uR3JvdXAob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sQmFyQWN0aW9uR3JvdXAoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IpIHsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQRGVidWdVSUNvbnN0YW50cy5USFJFQURfR1JPVVApKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQRGVidWdVSUNvbnN0YW50cy5TVEVQX0dST1VQKSk7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBHcm91cE1hcmtlcihJUFRQRGVidWdVSUNvbnN0YW50cy5TVEVQX0lOVE9fR1JPVVApKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IEdyb3VwTWFya2VyKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlNURVBfT1ZFUl9HUk9VUCkpOwotCQl0b29sQmFyTWdyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVBUUERlYnVnVUlDb25zdGFudHMuU1RFUF9SRVRVUk5fR1JPVVApKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IEdyb3VwTWFya2VyKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLkVNUFRZX1NURVBfR1JPVVApKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcihJUFRQRGVidWdVSUNvbnN0YW50cy5SRUdfR1JPVVApKTsKLQkJc3VwZXIuY3JlYXRlVG9vbEJhckFjdGlvbkdyb3VwKHRvb2xCYXJNZ3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuQWJzdHJhY3RQYXJhbGxlbFNldFZpZXcjY3JlYXRlVG9vbEJhckFjdGlvbnMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUb29sQmFyQWN0aW9ucyhJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1ncikgewotCQlyZXN1bWVBY3Rpb24gPSBuZXcgUmVzdW1lQWN0aW9uKHRoaXMpOwotCQlzdXNwZW5kQWN0aW9uID0gbmV3IFN1c3BlbmRBY3Rpb24odGhpcyk7Ci0JCXRlcm1pbmF0ZUFjdGlvbiA9IG5ldyBUZXJtaW5hdGVBY3Rpb24odGhpcyk7Ci0JCXN0ZXBJbnRvQWN0aW9uID0gbmV3IFN0ZXBJbnRvQWN0aW9uKHRoaXMpOwotCQlzdGVwT3ZlckFjdGlvbiA9IG5ldyBTdGVwT3ZlckFjdGlvbih0aGlzKTsKLQkJc3RlcFJldHVybkFjdGlvbiA9IG5ldyBTdGVwUmV0dXJuQWN0aW9uKHRoaXMpOwotCQlyZWdpc3RlckFjdGlvbiA9IG5ldyBSZWdpc3RlckFjdGlvbih0aGlzKTsKLQkJdW5yZWdpc3RlckFjdGlvbiA9IG5ldyBVbnJlZ2lzdGVyQWN0aW9uKHRoaXMpOwotCQkJCQotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUERlYnVnVUlDb25zdGFudHMuVEhSRUFEX0dST1VQLCByZXN1bWVBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUERlYnVnVUlDb25zdGFudHMuVEhSRUFEX0dST1VQLCBzdXNwZW5kQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlRIUkVBRF9HUk9VUCwgdGVybWluYXRlQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlNURVBfSU5UT19HUk9VUCwgc3RlcEludG9BY3Rpb24pOwotCQl0b29sQmFyTWdyLmFwcGVuZFRvR3JvdXAoSVBUUERlYnVnVUlDb25zdGFudHMuU1RFUF9PVkVSX0dST1VQLCBzdGVwT3ZlckFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYXBwZW5kVG9Hcm91cChJUFRQRGVidWdVSUNvbnN0YW50cy5TVEVQX1JFVFVSTl9HUk9VUCwgc3RlcFJldHVybkFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYXBwZW5kVG9Hcm91cChJUFRQRGVidWdVSUNvbnN0YW50cy5SRUdfR1JPVVAsIHJlZ2lzdGVyQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hcHBlbmRUb0dyb3VwKElQVFBEZWJ1Z1VJQ29uc3RhbnRzLlJFR19HUk9VUCwgdW5yZWdpc3RlckFjdGlvbik7Ci0JCQotCQlzdXBlci5idWlsZEluVG9vbEJhckFjdGlvbnModG9vbEJhck1ncik7Ci0JCS8vY3JlYXRlT3JpZW50YXRpb25BY3Rpb25zKCk7Ci0JfQotCQotCS8qKiBDcmVhdGUgb3JpZW50YXRpb24gYWN0aW9ucwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9yaWVudGF0aW9uQWN0aW9ucygpIHsKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlJTWVudU1hbmFnZXIgdmlld01lbnUgPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIElJY29uQ2FudmFzQWN0aW9uTGlzdGVuZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5JSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyI2hhbmRsZUFjdGlvbihpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVBY3Rpb24oaW50IHR5cGUsIGludCBpbmRleCkgewotCQlJRWxlbWVudCBlbGVtZW50ID0gY2FudmFzLmdldEVsZW1lbnQoaW5kZXgpOwotCQlpZiAodHlwZSA9PSBJSWNvbkNhbnZhc0FjdGlvbkxpc3RlbmVyLkRPVUJMRV9DTElDS19BQ1RJT04pIHsKLQkJCWRvdWJsZUNsaWNrKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsRWxlbWVudFZpZXcjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKElFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCXJlZ2lzdGVyRWxlbWVudChlbGVtZW50KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQVFBEZWJ1Z1VJUGx1Z2luLmVycm9yRGlhbG9nKGdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKSwgIkVycm9yIiwgZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNnZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRUb29sVGlwVGV4dChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyIiLCAiIn07Ci0JCVN0cmluZ1tdIGhlYWRlciA9IHN1cGVyLmdldFRvb2xUaXBUZXh0KG9iaik7Ci0JCVN0cmluZyB2YXJpYWJsZVRleHQgPSAoKFVJRGVidWdNYW5hZ2VyKSBtYW5hZ2VyKS5nZXRWYWx1ZVRleHQobmV3IEludGVnZXIoKChJUFByb2Nlc3Mpb2JqKS5nZXRQcm9jZXNzSW5kZXgoKSkuaW50VmFsdWUoKSwgdGhpcyk7Ci0JCWlmICh2YXJpYWJsZVRleHQgIT0gbnVsbCAmJiB2YXJpYWJsZVRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgaGVhZGVyWzBdLCB2YXJpYWJsZVRleHQgfTsKLQkJfQotCQlyZXR1cm4gaGVhZGVyOwotCX0KLQkKLQkvKiogUmVnaXN0ZXIgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFbGVtZW50KElFbGVtZW50IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQuaXNSZWdpc3RlcmVkKCkpCi0JCQkoKFVJRGVidWdNYW5hZ2VyKSBtYW5hZ2VyKS51bnJlZ2lzdGVyRWxlbWVudHMobmV3IElFbGVtZW50W10geyBlbGVtZW50IH0pOwotCQllbHNlCi0JCQkoKFVJRGVidWdNYW5hZ2VyKSBtYW5hZ2VyKS5yZWdpc3RlckVsZW1lbnRzKG5ldyBJRWxlbWVudFtdIHsgZWxlbWVudCB9KTsKLQl9Ci0JCi0JLyoqIFJlZ2lzdGVyIHNlbGVjdGVkIGVsZW1lbnRzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJTZWxlY3RlZEVsZW1lbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY3VyX2VsZW1lbnRfc2V0ICE9IG51bGwpIHsKLQkJCSgoVUlEZWJ1Z01hbmFnZXIpIG1hbmFnZXIpLnJlZ2lzdGVyRWxlbWVudHMoY2FudmFzLmdldFNlbGVjdGVkRWxlbWVudHMoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIFVucmVnaXN0ZXIgc2VsZWN0ZWQgZWxlbWVudHMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyU2VsZWN0ZWRFbGVtZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGN1cl9lbGVtZW50X3NldCAhPSBudWxsKSB7Ci0JCQkoKFVJRGVidWdNYW5hZ2VyKSBtYW5hZ2VyKS51bnJlZ2lzdGVyRWxlbWVudHMoY2FudmFzLmdldFNlbGVjdGVkRWxlbWVudHMoKSk7Ci0JCX0KLQl9Ci0JLy8gVXBkYXRlIGJ1dHRvbgotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS52aWV3cy5BYnN0cmFjdFBhcmFsbGVsU2V0VmlldyN1cGRhdGVBY3Rpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIudXBkYXRlQWN0aW9uKCk7Ci0JCUlQSm9iIGpvYiA9ICgoVUlEZWJ1Z01hbmFnZXIpIG1hbmFnZXIpLmZpbmRKb2JCeUlkKGdldEN1cnJlbnRJRCgpKTsKLQkJYm9vbGVhbiBpc0RlYnVnTW9kZSA9ICgoVUlEZWJ1Z01hbmFnZXIpIG1hbmFnZXIpLmlzRGVidWdNb2RlKGpvYik7Ci0JCWJvb2xlYW4gaXNSdW5uaW5nID0gKChVSURlYnVnTWFuYWdlcikgbWFuYWdlcikuaXNSdW5uaW5nKGpvYik7Ci0JCXJlZ2lzdGVyQWN0aW9uLnNldEVuYWJsZWQoaXNSdW5uaW5nICYmIGlzRGVidWdNb2RlKTsKLQkJdW5yZWdpc3RlckFjdGlvbi5zZXRFbmFibGVkKGlzUnVubmluZyAmJiBpc0RlYnVnTW9kZSk7Ci0JCXN1c3BlbmRBY3Rpb24uc2V0RW5hYmxlZChpc1J1bm5pbmcgJiYgaXNEZWJ1Z01vZGUpOwotCQl0ZXJtaW5hdGVBY3Rpb24uc2V0RW5hYmxlZChpc1J1bm5pbmcpOwotCQlpZiAoaXNSdW5uaW5nICYmIGlzRGVidWdNb2RlKSB7Ci0JCQlJRWxlbWVudEhhbmRsZXIgZWxlbWVudEhhbmRsZXIgPSBnZXRDdXJyZW50RWxlbWVudEhhbmRsZXIoKTsKLQkJCWlmIChlbGVtZW50SGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJdXBkYXRlRGVidWdCdXR0b25zKGpvYik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bWVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzdGVwSW50b0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN0ZXBPdmVyQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3RlcFJldHVybkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN1c3BlbmRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogVXBkYXRlIGRlYnVnIGJ1dHRvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURlYnVnQnV0dG9ucyhJUEpvYiBqb2IpIHsKLQkJSVBTZXNzaW9uIHNlc3Npb24gPSAoKFVJRGVidWdNYW5hZ2VyKSBtYW5hZ2VyKS5nZXREZWJ1Z1Nlc3Npb24oam9iKTsKLQkJaWYgKHNlc3Npb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUVsZW1lbnRTZXQgc2V0ID0gZ2V0Q3VycmVudFNldCgpOwotCQlpZiAoc2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQml0TGlzdCB0ZXJtaW5hdGVkVGFza3MgPSBzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRUYXNrTWFuYWdlcigpLmdldFRlcm1pbmF0ZWRUYXNrcygpOwotCQlCaXRMaXN0IHN1c3BlbmRlZFRhc2tzID0gc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuZ2V0VGFza01hbmFnZXIoKS5nZXRTdXNwZW5kZWRUYXNrcygpOwotCQlCaXRMaXN0IHN0ZXBSZXR1cm5UYXNrcyA9IHNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuZ2V0Q2FuU3RlcFJldHVyblRhc2tzKCk7Ci0JCWlmICh0ZXJtaW5hdGVkVGFza3MgPT0gbnVsbCB8fCBzdXNwZW5kZWRUYXNrcyA9PSBudWxsIHx8IHN0ZXBSZXR1cm5UYXNrcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBzZXRTaXplID0gc2V0LnNpemUoKTsKLQkJaW50IHRvdGFsVGVybWluYXRlZFNpemUgPSAwOwotCQlpbnQgdG90YWxTdXNwZW5kZWRTaXplID0gMDsKLQkJaW50IHRvdGFsU3RlcFJldHVyblNpemUgPSAwOwotCQlpZiAoc2V0LmlzUm9vdFNldCgpKSB7Ci0JCQl0b3RhbFRlcm1pbmF0ZWRTaXplID0gdGVybWluYXRlZFRhc2tzLmNhcmRpbmFsaXR5KCk7Ci0JCQl0b3RhbFN1c3BlbmRlZFNpemUgPSBzdXNwZW5kZWRUYXNrcy5pc0VtcHR5KCkgPyAwIDogc3VzcGVuZGVkVGFza3MuY2FyZGluYWxpdHkoKTsKLQkJCXRvdGFsU3RlcFJldHVyblNpemUgPSBzdGVwUmV0dXJuVGFza3MuaXNFbXB0eSgpID8gMCA6IHN0ZXBSZXR1cm5UYXNrcy5jYXJkaW5hbGl0eSgpOwotCQl9Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlCaXRMaXN0IHNldFRhc2tzID0gKChVSURlYnVnTWFuYWdlcikgbWFuYWdlcikuZ2V0VGFza3Moc2V0LmdldElEKCkpOwotCQkJCWlmIChzZXRUYXNrcyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJc2V0U2l6ZSA9IHNldFRhc2tzLmNhcmRpbmFsaXR5KCk7Ci0JCQkJQml0TGlzdCBzZXRUZXJtaW5hdGVkVGFza3MgPSBzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRUYXNrTWFuYWdlcigpLmdldFRlcm1pbmF0ZWRUYXNrcyhzZXRUYXNrcy5jb3B5KCkpOwotCQkJCXRvdGFsVGVybWluYXRlZFNpemUgPSBzZXRUZXJtaW5hdGVkVGFza3MuY2FyZGluYWxpdHkoKTsKLQkJCQkvLyBzaXplIGVxdWFsczogdGhlIHNldCBjb250YWlucyBhbGwgdGVybWluYXRlZCBwcm9jZXNzZXMKLQkJCQlpZiAoc2V0U2l6ZSAhPSB0b3RhbFRlcm1pbmF0ZWRTaXplKSB7Ci0JCQkJCUJpdExpc3Qgc2V0U3VzcGVuZGVkVGFza3MgPSBzZXNzaW9uLmdldFBESVNlc3Npb24oKS5nZXRUYXNrTWFuYWdlcigpLmdldFN1c3BlbmRlZFRhc2tzKHNldFRhc2tzLmNvcHkoKSk7Ci0JCQkJCXRvdGFsU3VzcGVuZGVkU2l6ZSA9IHNldFN1c3BlbmRlZFRhc2tzLmNhcmRpbmFsaXR5KCk7Ci0JCQkJCUJpdExpc3Qgc2V0Q2FuU3RlcFJldHVyblRhc2tzID0gc2Vzc2lvbi5nZXRQRElTZXNzaW9uKCkuZ2V0VGFza01hbmFnZXIoKS5nZXRDYW5TdGVwUmV0dXJuVGFza3Moc2V0VGFza3MuY29weSgpKTsKLQkJCQkJdG90YWxTdGVwUmV0dXJuU2l6ZSA9IHNldENhblN0ZXBSZXR1cm5UYXNrcy5jYXJkaW5hbGl0eSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVBUUERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0vL1N5c3RlbS5lcnIucHJpbnRsbigiU2V0IHNpemU6ICIgKyBzZXRTaXplICsgIiwgVDogIiArIHRvdGFsVGVybWluYXRlZFNpemUgKyAiLCBTOiAiKyB0b3RhbFN1c3BlbmRlZFNpemUgKyAiLCBSZXR1cm46ICIgKyB0b3RhbFN0ZXBSZXR1cm5TaXplKTsKLQkJYm9vbGVhbiBlbmFibGVkVGVybWluYXRlZEJ1dHRvbiA9IChzZXRTaXplICE9IHRvdGFsVGVybWluYXRlZFNpemUpOwotCQl0ZXJtaW5hdGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkVGVybWluYXRlZEJ1dHRvbik7Ci0JCWlmIChlbmFibGVkVGVybWluYXRlZEJ1dHRvbikgey8vIG5vdCBhbGwgcHJvY2Vzc2VzIHRlcm1pbmF0ZWQKLQkJCXJlc3VtZUFjdGlvbi5zZXRFbmFibGVkKHRvdGFsU3VzcGVuZGVkU2l6ZSA+IDApOwotCQkJYm9vbGVhbiBlbmFibGVTdGVwQnV0dG9ucyA9IChzZXRTaXplID09IHRvdGFsU3VzcGVuZGVkU2l6ZSArIHRvdGFsVGVybWluYXRlZFNpemUpOwotCQkJc3RlcEludG9BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVTdGVwQnV0dG9ucyk7Ci0JCQlzdGVwT3ZlckFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZVN0ZXBCdXR0b25zKTsKLQkJCXN1c3BlbmRBY3Rpb24uc2V0RW5hYmxlZCghZW5hYmxlU3RlcEJ1dHRvbnMpOwotCQkJc3RlcFJldHVybkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZVN0ZXBCdXR0b25zICYmIHRvdGFsU3RlcFJldHVyblNpemUgPiAwKTsKLQkJfSBlbHNlIHsvLyBhbGwgcHJvY2VzcyB0ZXJtaW5hdGVkCi0JCQlyZXN1bWVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzdGVwSW50b0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN0ZXBPdmVyQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3RlcFJldHVybkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN1c3BlbmRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnVpLnZpZXdzLkFic3RyYWN0UGFyYWxsZWxFbGVtZW50VmlldyNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIAlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgIAlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgCQlpZiAoc3RydWN0U2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIHN0cnVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElFbGVtZW50KSB7Ci0JICAgIAkJSUVsZW1lbnQgZWxlbWVudCA9IChJRWxlbWVudClzdHJ1Y3RTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JICAgIAkJaWYgKGVsZW1lbnQuaXNSZWdpc3RlcmVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJICAgIAkJCWZvY3VzT25EZWJ1Z1RhcmdldChnZXRKb2JNYW5hZ2VyKCkuZ2V0Sm9iKCksIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXROYW1lKCkpKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRoZSBlbGVtZW50IG5hbWUgaGFkIGJldHRlciBiZSB0aGUgcHJvY2VzcyBudW1iZXIKLQkJCQkJfQotCSAgICAJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKgotCXB1YmxpYyB2b2lkIGRyYXdTcGVjaWFsKE9iamVjdCBvYmosIEdDIGdjLCBpbnQgeF9sb2MsIGludCB5X2xvYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyLmRyYXdTcGVjaWFsKG9iaiwgZ2MsIHhfbG9jLCB5X2xvYywgd2lkdGgsIGhlaWdodCk7Ci0JCWlmIChjdXJfZWxlbWVudF9zZXQgIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQpIHsKLQkJCURlYnVnRWxlbWVudCBlbGVtZW50ID0gIChEZWJ1Z0VsZW1lbnQpb2JqOwotCQkJc3dpdGNoKGVsZW1lbnQuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIERlYnVnRWxlbWVudC5WQUxVRV9ESUZGOgotCQkJCWdjLnNldEZvcmVncm91bmQoZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQkJZ2MuZHJhd0xpbmUoeF9sb2MsIHlfbG9jLCB4X2xvYyt3aWR0aCwgeV9sb2MraGVpZ2h0KTsKLQkJCQlnYy5kcmF3TGluZSh4X2xvYywgeV9sb2MraGVpZ2h0LCB4X2xvYyt3aWR0aCwgeV9sb2MpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCSovCi0JCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIGZvY3VzIG9uIGRlYnVnIHRhcmdldCBvbiBkZWJ1ZyB2aWV3IAotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdmF0ZSBJRGVidWdFbGVtZW50IGdldERlYnVnRWxlbWVudChJUEpvYiBqb2IsIGludCB0YXNrX2lkKSB7Ci0JCUlQU2Vzc2lvbiBzZXNzaW9uID0gKChVSURlYnVnTWFuYWdlciltYW5hZ2VyKS5nZXREZWJ1Z1Nlc3Npb24oam9iKTsKLQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHNlc3Npb24uZ2V0TGF1bmNoKCkuZ2V0RGVidWdUYXJnZXQodGFza19pZCk7Ci0JCQkvKgotCQkJSVBEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCA9IHNlc3Npb24uZ2V0TGF1bmNoKCkuZ2V0RGVidWdUYXJnZXQodGFza19pZCk7Ci0JCQlpZiAoZGVidWdUYXJnZXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlUaHJlYWRbXSB0aHJlYWRzID0gZGVidWdUYXJnZXQuZ2V0VGhyZWFkcygpOwotCQkJCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkcy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVN0YWNrRnJhbWUgZnJhbWUgPSB0aHJlYWRzW2ldLmdldFRvcFN0YWNrRnJhbWUoKTsKLQkJCQkJCWlmIChmcmFtZSAhPSBudWxsKQotCQkJCQkJCXJldHVybiBmcmFtZTsKLQkJCQkJfQotCQkJCQlpZiAodGhyZWFkcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlyZXR1cm4gdGhyZWFkc1swXTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZGVidWdUYXJnZXQ7Ci0JCQkJfQotCQkJCXJldHVybiBkZWJ1Z1RhcmdldDsKLQkJCX0KLQkJCSovCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIGZvY3VzT25EZWJ1Z1RhcmdldChmaW5hbCBJUEpvYiBqb2IsIGZpbmFsIGludCB0YXNrX2lkKSB7Ci0JCVdvcmtiZW5jaEpvYiB3am9iID0gbmV3IFdvcmtiZW5jaEpvYigiRm9jdXNpbmcgb24gZGVidWcgZWxlbWVudC4uLiIpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJVmlld2VyIHZpZXdlciA9IGdldERlYnVnVmlld2VyKCk7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQkvL0lTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuZ2V0U2VsZWN0aW9uKElEZWJ1Z1VJQ29uc3RhbnRzLklEX0RFQlVHX1ZJRVcpOwotCQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUERlYnVnRWxlbWVudCkgewotCQkJCQkJCWlmICgoKElQRGVidWdFbGVtZW50KWVsZW1lbnQpLmdldElEKCkgIT0gdGFza19pZCkgewotCQkJCQkJCQkvL0ZJWE1FOiBvbmx5IHdvcmsgaWYgYWxsIGVsZW1lbnRzIGFyZSBjb2xsYXBzZQotCQkJCQkJCQkvLygoVHJlZVZpZXdlcil2aWV3ZXIpLmNvbGxhcHNlQWxsKCk7Ci0KLQkJCQkJCQkJSURlYnVnRWxlbWVudCBmb2N1c0VsZW1lbnQgPSBnZXREZWJ1Z0VsZW1lbnQoam9iLCB0YXNrX2lkKTsgCi0JCQkJCQkJCWlmIChmb2N1c0VsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJCQkJLy9kbyBub3RoaW5nIGlmIGNhbm5vdCBmaW5kIGRlYnVnIHRhcmdldAotCQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXNlbGVjdE9uVmlld2VyKHZpZXdlciwgKElQRGVidWdFbGVtZW50KWZvY3VzRWxlbWVudCk7Ci0JCQkJCQkJCS8vIHNldCBmb2N1cyBlbGVtZW50IHRvIHNlbGVjdGVkIGVsZW1lbnQKLQkJCQkJCQkJZWxlbWVudCA9IGZvY3VzRWxlbWVudDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJRGVidWdFbGVtZW50IGZvY3VzRWxlbWVudCA9IGdldERlYnVnRWxlbWVudChqb2IsIHRhc2tfaWQpOyAKLQkJCQkJCQlpZiAoZm9jdXNFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCQkJLy9kbyBub3RoaW5nIGlmIGNhbm5vdCBmaW5kIGRlYnVnIHRhcmdldAotCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJCXNlbGVjdE9uVmlld2VyKHZpZXdlciwgKElEZWJ1Z0VsZW1lbnQpZm9jdXNFbGVtZW50KTsKLQkJCQkJCQkvLyBzZXQgZm9jdXMgZWxlbWVudCB0byBzZWxlY3RlZCBlbGVtZW50Ci0JCQkJCQkJZWxlbWVudCA9IGZvY3VzRWxlbWVudDsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RhY2tGcmFtZSkgewotCQkJCQkJCS8vZG8gbm90aGluZyBpZiBzZWxlY3RlZCBlbGVtZW50IGlzIHN0YWNrIGZyYW1lCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVGhyZWFkKSB7Ci0JCQkJCQkJLy9leHBhbmQgdGhyZWFkIHRoaXMgdGhyZWFkCi0JCQkJCQkJZXhwYW5kT25WaWV3ZXIodmlld2VyLCAoSVRocmVhZCllbGVtZW50KTsKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURlYnVnVGFyZ2V0KSB7Ci0JCQkJCQkJLy9leHBhbmQgZGVidWcgdGFyZ2V0IHRoaXMgdGhyZWFkCi0JCQkJCQkJZXhwYW5kT25WaWV3ZXIodmlld2VyLCAoSURlYnVnVGFyZ2V0KWVsZW1lbnQpOwotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQkJLy9pZiAoISgoVHJlZVZpZXdlcil2aWV3ZXIpLmdldEV4cGFuZGVkU3RhdGUoZWxlbWVudCkpIHsKLQkJCQkJCQkvLygoVHJlZVZpZXdlcil2aWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCQkvL30KLQkJCQkJfQotCQkJCQkvL3ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZm9jdXNFbGVtZW50KSwgdHJ1ZSk7Ci0JCQkJCS8vdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmb2N1c0VsZW1lbnQuZ2V0RGVidWdUYXJnZXQoKSksIHRydWUpOwotCQkJCQkvLygoVHJlZVZpZXdlcil2aWV3ZXIpLmV4cGFuZEFsbCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0gICAgICAgIH07Ci0gICAgICAgIC8vc2V0IGpvYiBwcmlvcml0eSB2ZXJ5IGxvdyB0byBtYWtlIHN1cmUgaXQgaXMgZXhlY3V0ZWQgYXQgbGFzdAotICAgICAgICB3am9iLnNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0gICAgICAgIHdqb2Iuc2NoZWR1bGUoNTAwKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGV4cGFuZE9uVmlld2VyKGZpbmFsIFZpZXdlciB2aWV3ZXIsIGZpbmFsIElEZWJ1Z0VsZW1lbnQgZWxlbWVudCkgewotCQlXb3JrYmVuY2hKb2Igd2pvYiA9IG5ldyBXb3JrYmVuY2hKb2IoIkV4cGFuZGluZyBvbiB2aWV3ZXIuLi4iKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCSgoVHJlZVZpZXdlcil2aWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVGhyZWFkKSB7Ci0JCQkJCQlzZWxlY3RPblZpZXdlcih2aWV3ZXIsICgoSVRocmVhZCllbGVtZW50KS5nZXRUb3BTdGFja0ZyYW1lKCkpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRGVidWdUYXJnZXQpIHsKLQkJCQkJCUlUaHJlYWRbXSB0aHJlYWRzID0gKChJUERlYnVnVGFyZ2V0KWVsZW1lbnQpLmdldFRocmVhZHMoKTsKLQkJCQkJCWlmICh0aHJlYWRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQlleHBhbmRPblZpZXdlcih2aWV3ZXIsIHRocmVhZHNbMF0pOwotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0gICAgICAgIH07Ci0gICAgICAgIC8vc2V0IGpvYiBwcmlvcml0eSB2ZXJ5IGxvdyB0byBtYWtlIHN1cmUgaXQgaXMgZXhlY3V0ZWQgYXQgbGFzdAotICAgICAgICB3am9iLnNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0gICAgICAgIHdqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNlbGVjdE9uVmlld2VyKGZpbmFsIFZpZXdlciB2aWV3ZXIsIGZpbmFsIElEZWJ1Z0VsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlXb3JrYmVuY2hKb2Igd2pvYiA9IG5ldyBXb3JrYmVuY2hKb2IoIlNlbGVjdGluZyBkZWJ1ZyBlbGVtZW50Li4uIikgewotCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCS8qIEZJWE1FIAotCQkJCQkgKiBJbiBEZWJ1ZyBWaWV3LCB0aGVyZSBpcyBhIFNlbGVjdGlvbiBQb2xpY3kuICBJZiBjdXJyZW50IHNlbGVjdGVkIGVsZW1lbnQgaXMgc3RhY2sgZnJhbWUgYW5kIGl0cyBzdGF0dXMgaXMgc3VzcGVuZGVkLCB0aGVuIGl0IGNhbm5vdCBhbGxvdyB0byBjaGFuZ2Ugc2VsZWN0aW9uIHRvIG90aGVycy4KLQkJCQkJICogTm93IEkgdXNlZCBpbnRlcm5hbCBjbGFzcyB0byBhdm9pZCBwb2xpY3kgY2hlY2tpbmcKLQkJCQkJICovCi0JCQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJbnRlcm5hbFRyZWVNb2RlbFZpZXdlcikgewotCQkJCQkJKChJbnRlcm5hbFRyZWVNb2RlbFZpZXdlcikgdmlld2VyKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCksIHRydWUsIHRydWUpOwotCQkJCQl9IAotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCksIHRydWUpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkgICAgICAgIH07Ci0JICAgICAgICAvL3NldCBqb2IgcHJpb3JpdHkgdmVyeSBsb3cgdG8gbWFrZSBzdXJlIGl0IGlzIGV4ZWN1dGVkIGF0IGxhc3QKLQkgICAgICAgIHdqb2Iuc2V0UHJpb3JpdHkoSm9iLkRFQ09SQVRFKTsKLQkgICAgICAgIHdqb2Iuc2NoZWR1bGUoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAudWkudmlld3MuUGFyYWxsZWxKb2JzVmlldyNjaGFuZ2VKb2JSZWZyZXNoKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZUpvYlJlZnJlc2goSVBKb2Igam9iLCBib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChqb2IgIT0gbnVsbCAmJiBqb2IuaXNUZXJtaW5hdGVkKCkpIHsKLQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gKChVSURlYnVnTWFuYWdlcikgbWFuYWdlcikuZ2V0RGVidWdTZXNzaW9uKGpvYik7Ci0JCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJQml0TGlzdCB0YXNrcyA9IHNlc3Npb24uZ2V0VGFza3MoKTsKLQkJCQlpZiAoIXNlc3Npb24uZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuaXNBbGxUZXJtaW5hdGVkKHRhc2tzKSkgewotCQkJCQlzZXNzaW9uLmZvcmNlU3RvcHBlZERlYnVnZ2VyKFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2hhbmdlSm9iUmVmcmVzaChqb2IsIGZvcmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS92aWV3cy9QYXJhbGxlbERlYnVnVmlld0V2ZW50SGFuZGxlci5qYXZhIGIvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvZGVidWcvdWkvdmlld3MvUGFyYWxsZWxEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyYzQ2YS4uMDAwMDAwMAotLS0gYS9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9kZWJ1Zy91aS92aWV3cy9QYXJhbGxlbERlYnVnVmlld0V2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuSVBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LklQRGVidWdFcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUuZXZlbnQuSVBEZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LklQRGVidWdJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlLmV2ZW50LklQRGVidWdSZWdpc3RlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlBEZWJ1Z1VJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLmludGVybmFsLnVpLlVJRGVidWdNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5BYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpLlBUUERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLm1vZGVsLklFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS5tb2RlbC5JRWxlbWVudEhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBDbGVtZW50IGNodQotICovCi1wdWJsaWMgY2xhc3MgUGFyYWxsZWxEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFBEZWJ1Z1ZpZXdFdmVudEhhbmRsZXIgIHsKLQlwcml2YXRlIGxvbmcgdGltZV9yZWNvcmQgPSAwOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXZlbnQgaGFuZGxlciBvbiB0aGUgZ2l2ZW4gdmlldwotCSAqLwotCXB1YmxpYyBQYXJhbGxlbERlYnVnVmlld0V2ZW50SGFuZGxlcihQYXJhbGxlbERlYnVnVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQlwdWJsaWMgUGFyYWxsZWxEZWJ1Z1ZpZXcgZ2V0UFZpZXcoKSB7Ci0JCXJldHVybiAoUGFyYWxsZWxEZWJ1Z1ZpZXcpZ2V0VmlldygpOwotCX0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gYWxsKSB7Ci0JCWlmIChnZXRQVmlldygpLmlzVmlzaWJsZSgpKQotCQkJZ2V0UFZpZXcoKS5yZWZyZXNoKGFsbCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRGVidWdFdmVudChJUERlYnVnRXZlbnQgZXZlbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUERlYnVnSW5mbyBpbmZvID0gZXZlbnQuZ2V0SW5mbygpOwotCQlmaW5hbCBJUEpvYiBqb2IgPSBpbmZvLmdldEpvYigpOwotCQlzd2l0Y2goZXZlbnQuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElQRGVidWdFdmVudC5DUkVBVEU6Ci0JCQkJc3dpdGNoIChldmVudC5nZXREZXRhaWwoKSkgewotCQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LlJFR0lTVEVSOgotCQkJCQlib29sZWFuIHJlZnJlc2ggPSB0cnVlOwotCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIElQRGVidWdSZWdpc3RlckluZm8pIHsKLQkJCQkJCXJlZnJlc2ggPSAoKElQRGVidWdSZWdpc3RlckluZm8paW5mbykuaXNSZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJaW50W10gY19yZWdUYXNrX2FycmF5ID0gaW5mby5nZXRBbGxUYXNrcygpLnRvQXJyYXkoKTsKLQkJCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkJCUlFbGVtZW50SGFuZGxlciBlbGVtZW50SGFuZGxlciA9IGdldFBWaWV3KCkuZ2V0RWxlbWVudEhhbmRsZXIoam9iLmdldElEKCkpOwotCQkJCQkJaWYgKGVsZW1lbnRIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCQlBcnJheUxpc3Q8SUVsZW1lbnQ+IHJlZ0VsZW1lbnRBcnJheSA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnQ+KCk7Ci0JCQkJCQkJZm9yIChpbnQgaj0wOyBqPGNfcmVnVGFza19hcnJheS5sZW5ndGg7IGorKykgewotCQkJCQkJCQlJUFByb2Nlc3MgcHJvYyA9IGpvYi5nZXRQcm9jZXNzQnlJbmRleChjX3JlZ1Rhc2tfYXJyYXlbal0pOwotCQkJCQkJCQkoKFVJRGVidWdNYW5hZ2VyKSBnZXRQVmlldygpLmdldFVJTWFuYWdlcigpKS5hZGRDb25zb2xlV2luZG93KGpvYiwgcHJvYyk7Ci0JCQkJCQkJCUlFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50SGFuZGxlci5nZXRTZXRSb290KCkuZ2V0RWxlbWVudEJ5SUQocHJvYy5nZXRJRCgpKTsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJcmVnRWxlbWVudEFycmF5LmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbGVtZW50SGFuZGxlci5hZGRUb1JlZ2lzdGVyKHJlZ0VsZW1lbnRBcnJheS50b0FycmF5KG5ldyBJRWxlbWVudFtyZWdFbGVtZW50QXJyYXkuc2l6ZSgpXSkpOwotCQkJCQkJfQotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWlmIChjX3JlZ1Rhc2tfYXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJZ2V0UFZpZXcoKS5mb2N1c09uRGVidWdUYXJnZXQoam9iLCBjX3JlZ1Rhc2tfYXJyYXlbMF0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LkRFQlVHR0VSOgotCQkJCQlicmVhazsKLQkJCQljYXNlIElQRGVidWdFdmVudC5CUkVBS1BPSU5UOgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElQRGVidWdFdmVudC5URVJNSU5BVEU6Ci0JCQkJSUVsZW1lbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyID0gZ2V0UFZpZXcoKS5nZXRFbGVtZW50SGFuZGxlcihqb2IuZ2V0SUQoKSk7Ci0JCQkJc3dpdGNoIChldmVudC5nZXREZXRhaWwoKSkgewotCQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LkRFQlVHR0VSOgotCQkJCQlpZiAoZWxlbWVudEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudEhhbmRsZXIucmVtb3ZlRWxlbWVudHMoZWxlbWVudEhhbmRsZXIuZ2V0UmVnaXN0ZXJlZCgpKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElQRGVidWdFdmVudC5SRUdJU1RFUjoKLQkJCQkJYm9vbGVhbiByZWZyZXNoID0gdHJ1ZTsKLQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBJUERlYnVnUmVnaXN0ZXJJbmZvKSB7Ci0JCQkJCQlyZWZyZXNoID0gKChJUERlYnVnUmVnaXN0ZXJJbmZvKWluZm8pLmlzUmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJCQlpZiAoZWxlbWVudEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJCWludFtdIHRfcmVnVGFza19hcnJheSA9IGluZm8uZ2V0QWxsVGFza3MoKS50b0FycmF5KCk7Ci0JCQkJCQkJSUVsZW1lbnRbXSByZWdFbGVtZW50QXJyYXkgPSBuZXcgSUVsZW1lbnRbdF9yZWdUYXNrX2FycmF5Lmxlbmd0aF07Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0X3JlZ1Rhc2tfYXJyYXkubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJSVBQcm9jZXNzIHByb2MgPSBqb2IuZ2V0UHJvY2Vzc0J5SW5kZXgodF9yZWdUYXNrX2FycmF5W2pdKTsKLQkJCQkJCQkJKChVSURlYnVnTWFuYWdlcikgZ2V0UFZpZXcoKS5nZXRVSU1hbmFnZXIoKSkucmVtb3ZlQ29uc29sZVdpbmRvdyhqb2IsIHByb2MpOwotCQkJCQkJCQlyZWdFbGVtZW50QXJyYXlbal0gPSBlbGVtZW50SGFuZGxlci5nZXRTZXRSb290KCkuZ2V0RWxlbWVudEJ5SUQocHJvYy5nZXRJRCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxlbWVudEhhbmRsZXIucmVtb3ZlRnJvbVJlZ2lzdGVyKHJlZ0VsZW1lbnRBcnJheSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUERlYnVnRXZlbnQuQlJFQUtQT0lOVDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUERlYnVnRXZlbnQuUFJPQ0VTU19TUEVDSUZJQzoKLQkJCQkJVUlEZWJ1Z01hbmFnZXIgdWlNZ3IgPSAoVUlEZWJ1Z01hbmFnZXIpZ2V0UFZpZXcoKS5nZXRVSU1hbmFnZXIoKTsKLQkJCQkJSVBTZXNzaW9uIHNlc3Npb24gPSB1aU1nci5nZXREZWJ1Z1Nlc3Npb24oam9iKTsKLQkJCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgewotCQkJCQkJdWlNZ3IudW5yZWdpc3RlclRhc2tzKHNlc3Npb24sIGluZm8uZ2V0QWxsUmVnaXN0ZXJlZFRhc2tzKCkpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LlJFU1VNRToKLQkJCQl0aW1lX3JlY29yZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiPT09PT09PT09PT09PT09PT0gVElNRSBSRVNVTUU6ICIgKyB0aW1lX3JlY29yZCk7Ci0JCQkJLy8oKFVJRGVidWdNYW5hZ2VyKSBnZXRQVmlldygpLmdldFVJTWFuYWdlcigpKS51cGRhdGVWYXJpYWJsZVZhbHVlKGZhbHNlLCBpbmZvLmdldEFsbFJlZ2lzdGVyZWRUYXNrcygpKTsKLQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUERlYnVnRXZlbnQuU1VTUEVORDoKLQkJCQlJUFNlc3Npb24gcyA9ICgoVUlEZWJ1Z01hbmFnZXIpIGdldFBWaWV3KCkuZ2V0VUlNYW5hZ2VyKCkpLmdldERlYnVnU2Vzc2lvbihqb2IpOwotCQkJCWlmIChzICE9IG51bGwpIHsKLQkJCQkJaWYgKHMuZ2V0VGFza3MoKS5jYXJkaW5hbGl0eSgpID09IHMuZ2V0UERJU2Vzc2lvbigpLmdldFRhc2tNYW5hZ2VyKCkuZ2V0U3VzcGVuZGVkVGFza3MoKS5jYXJkaW5hbGl0eSgpKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIj09PT09PT09PT09PT09PT09IFRJTUUgQUxMIFNVU1BFTkRFRDogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWVfcmVjb3JkKSk7Ci0JCQkJCQl0aW1lX3JlY29yZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaW50W10gcHJvY2Vzc2VzID0gaW5mby5nZXRBbGxSZWdpc3RlcmVkVGFza3MoKS50b0FycmF5KCk7Ci0JCQkJaWYgKHByb2Nlc3Nlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWdldFBWaWV3KCkuZm9jdXNPbkRlYnVnVGFyZ2V0KGpvYiwgcHJvY2Vzc2VzWzBdKTsKLQkJCQl9Ci0JCQkJLy9pZiAoam9iLmdldElEKCkuZXF1YWxzKGdldFBWaWV3KCkuZ2V0Q3VycmVudElEKCkpKSB7Ci0JCQkJCS8vUFRQRGVidWdVSVBsdWdpbi5nZXRVSURlYnVnTWFuYWdlcigpLnVwZGF0ZVZhcmlhYmxlVmFsdWVPblN1c3BlbmQoaW5mby5nZXRBbGxUYXNrcygpKTsKLQkJCQkvL30KLQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUERlYnVnRXZlbnQuQ0hBTkdFOgotCQkJCXN3aXRjaCAoZXZlbnQuZ2V0RGV0YWlsKCkpIHsKLQkJCQljYXNlIElQRGVidWdFdmVudC5QUk9DRVNTX1NQRUNJRklDOgotCQkJCQlVSURlYnVnTWFuYWdlciB1aU1nciA9IChVSURlYnVnTWFuYWdlcilnZXRQVmlldygpLmdldFVJTWFuYWdlcigpOwotCQkJCQlpZiAodWlNZ3IuaXNFbmFibGVkRGVmYXVsdFJlZ2lzdGVyKCkpIHsKLQkJCQkJCUlQU2Vzc2lvbiBzZXNzaW9uID0gdWlNZ3IuZ2V0RGVidWdTZXNzaW9uKGpvYik7Ci0JCQkJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJdWlNZ3IucmVnaXN0ZXJUYXNrcyhzZXNzaW9uLCBzZXNzaW9uLmdldFRhc2tzKDApKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElQRGVidWdFdmVudC5FVkFMVUFUSU9OOgotCQkJCWNhc2UgSVBEZWJ1Z0V2ZW50LkNPTlRFTlQ6Ci0JCQkJCS8qCi0JCQkJCWludFtdIGRpZmZUYXNrcyA9IGluZm8uZ2V0QWxsUHJvY2Vzc2VzKCkudG9BcnJheSgpOwotCQkJCQlJRWxlbWVudEhhbmRsZXIgZWxlbWVudEhhbmRsZXIgPSBnZXRQVmlldygpLmdldEVsZW1lbnRIYW5kbGVyKGpvYi5nZXRJRCgpKTsKLQkJCQkJZm9yIChpbnQgaj0wOyBqPGRpZmZUYXNrcy5sZW5ndGg7IGorKykgewotCQkJCQkJSUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRIYW5kbGVyLmdldFNldFJvb3QoKS5nZXQoU3RyaW5nLnZhbHVlT2YoZGlmZlRhc2tzW2pdKSk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudCkgewotCQkJCQkJCWlmIChkZXRhaWwgPT0gSVBEZWJ1Z0V2ZW50LkVWQUxVQVRJT04pIHsKLQkJCQkJCQkJKChEZWJ1Z0VsZW1lbnQpZWxlbWVudCkuc2V0VHlwZShEZWJ1Z0VsZW1lbnQuVkFMVUVfRElGRik7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkoKERlYnVnRWxlbWVudCllbGVtZW50KS5yZXNldFR5cGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJKi8KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUERlYnVnRXZlbnQuRVJST1I6Ci0JCQkJZmluYWwgSVBEZWJ1Z0Vycm9ySW5mbyBlcnJJbmZvID0gKElQRGVidWdFcnJvckluZm8paW5mbzsKLQkJCQlpZiAoZXZlbnQuZ2V0RGV0YWlsKCkgIT0gSVBEZWJ1Z0V2ZW50LkVSUl9OT1JNQUwpIHsKLQkJCQkJUFRQRGVidWdVSVBsdWdpbi5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gIkVycm9yIG9uIHRhc2tzOiAiKyBQRGVidWdVSVV0aWxzLnNob3dCaXRMaXN0KGVyckluZm8uZ2V0QWxsVGFza3MoKSkgKyAiIC0gIiArIGVyckluZm8uZ2V0TXNnKCkgKyAiXG5SZWFzb246ICIgKyBlcnJJbmZvLmdldERldGFpbHNNc2coKTsKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUFRQRGVidWdVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCk7Ci0JCQkJCQkJUFRQRGVidWdVSVBsdWdpbi5lcnJvckRpYWxvZygiRXJyb3IiLCBzdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJLy9vbmx5IGNoYW5nZSBwcm9jZXNzIGljb24gYW5kIHVucmVnaXN0ZXIgZm9yIGZhdGFsIGVycm9yCi0JCQkJCWlmIChldmVudC5nZXREZXRhaWwoKSA9PSBJUERlYnVnRXZlbnQuRVJSX0ZBVEFMKSB7IAotCQkJCQkJSUVsZW1lbnRIYW5kbGVyIGVIYW5kbGVyID0gZ2V0UFZpZXcoKS5nZXRFbGVtZW50SGFuZGxlcihqb2IuZ2V0SUQoKSk7Ci0JCQkJCQlpZiAoZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJCWludFtdIGVfcmVnVGFza19hcnJheSA9IGluZm8uZ2V0QWxsUmVnaXN0ZXJlZFRhc2tzKCkudG9BcnJheSgpOwotCQkJCQkJCWlmIChlX3JlZ1Rhc2tfYXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCQlJRWxlbWVudFtdIHJlZ0VsZW1lbnRBcnJheSA9IG5ldyBJRWxlbWVudFtlX3JlZ1Rhc2tfYXJyYXkubGVuZ3RoXTsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlX3JlZ1Rhc2tfYXJyYXkubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCUlQUHJvY2VzcyBwcm9jID0gam9iLmdldFByb2Nlc3NCeUluZGV4KGVfcmVnVGFza19hcnJheVtqXSk7Ci0JCQkJCQkJCQkoKFVJRGVidWdNYW5hZ2VyKSBnZXRQVmlldygpLmdldFVJTWFuYWdlcigpKS5yZW1vdmVDb25zb2xlV2luZG93KGpvYiwgcHJvYyk7Ci0JCQkJCQkJCQlyZWdFbGVtZW50QXJyYXlbal0gPSBlSGFuZGxlci5nZXRTZXRSb290KCkuZ2V0RWxlbWVudEJ5SUQocHJvYy5nZXRJRCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllSGFuZGxlci5yZW1vdmVGcm9tUmVnaXN0ZXIocmVnRWxlbWVudEFycmF5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLmNsYXNzcGF0aCBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYWVlYTguLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzdWl0ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8ucHJvamVjdCBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODllZTUxLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ODJmMi4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgTm92IDE5IDEzOjUwOjU5IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTAxNTAuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IjMuOC4xIiwKLSBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuY2R0LnVpLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSI1LjAuMiIsCi0gb3JnLmVjbGlwc2UuY2R0LnVpO2J1bmRsZS12ZXJzaW9uPSI1LjAuMiIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmU7YnVuZGxlLXZlcnNpb249IjUuMC4yIiwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iNS4wLjEiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjIiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLm5hdmlnYXRpb24sCi0gb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5zdWl0ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5SRFRVSVRlc3RQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWkucGFydApkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNTZhY2MuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSB0ZXN0LyxcCi0gICAgICAgICAgIHN1aXRlLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5jIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNiNTNkLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI2ltcG9ydCAidGVzdC5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotfQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5oIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvZml4dHVyZXMvbmF2aWdhdGlvbl90ZXN0X3Byb2plY3QvdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuaAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9zdWl0ZS9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL1JEVFVJVGVzdFBsdWdpbi5qYXZhIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9SRFRVSVRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNzdjNi4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9zdWl0ZS9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL1JEVFVJVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBSRFRVSVRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCQotCXByaXZhdGUgc3RhdGljIFJEVFVJVGVzdFBsdWdpbiBwbHVnaW47Ci0JCi0JcHVibGljIFJEVFVJVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJEVFVJVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLX0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlCYXNpY1Rlc3RTdWl0ZS5qYXZhIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUJhc2ljVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzYyNjAuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUJhc2ljVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5zdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLS8qKgotICogVGVzdHMgdGhhdCBkbyBub3QgcmVxdWlyZSBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgVUlCYXNpY1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVUlCYXNpY1Rlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCQkvLyBUT0RPIGFkZCBzb21lIHRlc3RzCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUNvbm5lY3Rpb25UZXN0U3VpdGUuamF2YSBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlDb25uZWN0aW9uVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDY4YjcuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9zdWl0ZS9VSUNvbm5lY3Rpb25UZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLnN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLm5hdmlnYXRpb24uTmF2aWdhdGlvblRlc3RzOwotCi0KLS8qKgotICogVGVzdHMgdGhhdCByZXF1aXJlIGEgY29ubmVjdGlvbiB0byBiZSBydW4sCi0gKiB0aGlzIHN1aXRlIG11c3QgYmUgbGF1bmNoZWQgZnJvbSBhIENvbm5lY3Rpb25TdWl0ZS4KLSAqLwotcHVibGljIGNsYXNzIFVJQ29ubmVjdGlvblRlc3RTdWl0ZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVUlDb25uZWN0aW9uVGVzdFN1aXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KE5hdmlnYXRpb25UZXN0cy5zdWl0ZSgpKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvdGVzdC9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL25hdmlnYXRpb24vTmF2aWdhdGlvblRlc3RzLmphdmEgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy90ZXN0L29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmYzE3OC4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy90ZXN0L29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMubmF2aWdhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5DQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmluZGV4LklJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSVRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5tb2RlbC5BU1RDYWNoZS5BU1RSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5wYXJzZXIuUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS5lZGl0b3IuQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLnVpLmVkaXRvci5DRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZXN0cy50ZXh0LkVkaXRvclRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnVpLnRlc3RzLnRleHQuc2VsZWN0aW9uLkNQUFNlbGVjdGlvblRlc3RzQW55SW5kZXhlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaW50ZXJuYWwucmR0LmNvcmUuaW5kZXguUmVtb3RlRmFzdEluZGV4ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJkdC51aS5zZWFyY2guYWN0aW9ucy5PcGVuRGVjbGFyYXRpb25zQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cy5Db25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHMuUmVtb3RlVGVzdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uVGVzdHMgZXh0ZW5kcyBDUFBTZWxlY3Rpb25UZXN0c0FueUluZGV4ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XQUlUX1RJTUUgPSAxMjAwMDA7Ci0KLQkvKiBJIHRoaW5rIGEgbG90IG9mIHRoZSB0ZXN0cyB0aGF0IGZhaWwgZG8gc28gYmVjYXVzZSBvZiB0d28gcmVhc29uczoKLQkgKiAtIEhlYWRlcnMgYXJlIG5vdCBiZWluZyBza2lwcGVkIGFzIHRoZXkgc2hvdWxkIGJlLCAKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVFNfVE9fUlVOID0gewotCQkidGVzdEJ1ZzkzMjgxIiwKLQkJInRlc3RCdWcyMDczMjAiLAotCQkidGVzdFRlbXBsYXRlQ2xhc3NNZXRob2RfMjA3MzIwIiwKLQkJLy8idGVzdEJhc2ljRGVmaW5pdGlvbiIsIC8vIEZBSUwgY2Fubm90IHJlcHJvZHVjZSBmYWlsdXJlCi0JCSJ0ZXN0QmFzaWNUZW1wbGF0ZUluc3RhbmNlXzIwNzMyMCIsCi0JCSJ0ZXN0QnVnODY4MjlBIiwKLQkJLy8idGVzdENQUFNwZWNEZWNsc0RlZnMiLCAvLyBGQUlMIGNhbm5vdCByZXByb2R1Y2UgZmFpbHVyZQotCQkidGVzdEJ1ZzE2ODUzMyIsCi0JCSJ0ZXN0QnVnOTUyMjUiLAotCQkvLyJ0ZXN0QnVnOTUyMDIiLCAvLyBGQUlMLCBzaG91bGQgbm90IGZhaWwgd2hlbiBoZWFkZXJzIGFyZSBza2lwcGVkIHByb3Blcmx5Ci0JCSJ0ZXN0QnVnMTAxMjg3IiwKLQkJInRlc3RCdWcxMDIyNTgiLAotCQkidGVzdEJ1ZzEwMzMyMyIsCi0JCSJ0ZXN0QnVnNzgzNTQiLAotCQkvLyJ0ZXN0QnVnMTAzNjk3IiwgLy8gRkFJTCB0cnlpbmcgdG8gdXNlIGxvY2FsIHBhdGggd2hpY2ggZmFpbHMKLQkJLy8idGVzdEJ1ZzEwODIwMiIsIC8vIEZBSUwKLQkJLy8idGVzdENOYXZpZ2F0aW9uSW5DcHBQcm9qZWN0X2J1ZzE4Mzk3MyIsIC8vIEZBSUwKLQkJLy8idGVzdEZ1bmNXaXRoVHlwZWRlZkZvckFub255bW91c1N0cnVjdF8xOTA3MzAiLCAvLyBGQUlMCi0JCS8vInRlc3RGdW5jV2l0aFR5cGVkZWZGb3JBbm9ueW1vdXNFbnVtXzE5MDczMCIsIC8vIEZBSUwKLQkJInRlc3RNYWNyb05hdmlnYXRpb24iLAotCQkidGVzdE1hY3JvTmF2aWdhdGlvbl9CdWcyMDgzMDAiLAotCQkidGVzdEluY2x1ZGVOYXZpZ2F0aW9uIiwKLQkJLy8idGVzdE5hdmlnYXRpb25DcHBDYWxsc0MiLCAvLyBGQUlMCi0JCS8vInRlc3ROYXZpZ2F0aW9uQ0NhbGxzQ3BwIiwgLy8gRkFJTAotCQkidGVzdE5hdmlnYXRpb25JbkRlZmluZWRFeHByZXNzaW9uXzIxNTkwNiIsCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCS8vcmV0dXJuIHN1aXRlKE5hdmlnYXRpb25UZXN0cy5jbGFzcyk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJZm9yKFN0cmluZyB0ZXN0TmFtZSA6IFRFU1RTX1RPX1JVTikKLQkJCXN1aXRlLmFkZFRlc3QobmV3IE5hdmlnYXRpb25UZXN0cyh0ZXN0TmFtZSkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAibmF2aWdhdGlvbl90ZXN0X3Byb2plY3QiOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UucHRwLnJkdC51aS5lZGl0b3IuQ0VkaXRvciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgd2FpdFVudGlsRmlsZUlzSW5kZXhlZChJSW5kZXggaW5kZXgsIElGaWxlIGZpbGUsIGludCBtYXhtaWxsaXMpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWQuc2xlZXAoMTAwMDApOwotICAgICAgICBDQ29yZVBsdWdpbi5nZXRJbmRleE1hbmFnZXIoKS5qb2luSW5kZXhlcihNQVhfV0FJVF9USU1FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTmF2aWdhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUsIFJlbW90ZUZhc3RJbmRleGVyLklEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBU1ROb2RlIHRlc3RGMyhJRmlsZSBmaWxlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQl0aHJvdyBuZXcgUGFyc2VyRXhjZXB0aW9uKCJvZmZzZXQgY2FuIG5vdCBiZSBsZXNzIHRoYW4gMCBhbmQgd2FzICIgKyBvZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFydCA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBnZXRFZGl0b3JJRCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBDRWRpdG9yKSB7Ci0gICAgICAgIAlDRWRpdG9yIGVkaXRvcj0gKENFZGl0b3IpIHBhcnQ7Ci0gICAgCQlFZGl0b3JUZXN0SGVscGVyLmpvaW5SZWNvbmNpbGVyKEVkaXRvclRlc3RIZWxwZXIuZ2V0U291cmNlVmlld2VyKGVkaXRvciksIDEwMCwgNTAwLCAxMCk7Ci0gICAgICAgICAgICAoKEFic3RyYWN0VGV4dEVkaXRvcilwYXJ0KS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbihvZmZzZXQsbGVuZ3RoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIE9wZW5EZWNsYXJhdGlvbnNBY3Rpb24gYWN0aW9uID0gKE9wZW5EZWNsYXJhdGlvbnNBY3Rpb24pIGVkaXRvci5nZXRBY3Rpb24oIk9wZW5EZWNsYXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYWN0aW9uLnJ1blN5bmMoKTsKLQkJCQotICAgICAgICAJLy8gdXBkYXRlIHRoZSBmaWxlL3BhcnQgdG8gcG9pbnQgdG8gdGhlIG5ld2x5IG9wZW5lZCBJRmlsZS9JRWRpdG9yUGFydAotICAgICAgICAgICAgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOyAKLSAgICAgICAgICAgIGFzc2VydFRydWUgKHBhcnQgaW5zdGFuY2VvZiBDRWRpdG9yKTsKLSAgICAgICAgICAgIGVkaXRvcj0gKENFZGl0b3IpIHBhcnQ7Ci0gICAgCQlFZGl0b3JUZXN0SGVscGVyLmpvaW5SZWNvbmNpbGVyKEVkaXRvclRlc3RIZWxwZXIuZ2V0U291cmNlVmlld2VyKGVkaXRvciksIDEwMCwgNTAwLCAxMCk7Ci0KLSAgICAJCS8vIHRoZSBhY3Rpb24gYWJvdmUgc2hvdWxkIGhpZ2hsaWdodCB0aGUgZGVjbGFyYXRpb24sIHNvIG5vdyByZXRyaWV2ZSBpdCBhbmQgdXNlIHRoYXQgc2VsZWN0aW9uIHRvIGdldCB0aGUgSUFTVE5hbWUgc2VsZWN0ZWQgb24gdGhlIFRVCi0gICAgICAgICAgICBJU2VsZWN0aW9uIHNlbD0gZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElBU1ROYW1lW10gcmVzdWx0PSB7bnVsbH07Ci0gICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIAlmaW5hbCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsID0gKElUZXh0U2VsZWN0aW9uKXNlbDsKLSAgICAgICAgICAgIAlJVHJhbnNsYXRpb25Vbml0IHR1ID0gKElUcmFuc2xhdGlvblVuaXQpZWRpdG9yLmdldElucHV0Q0VsZW1lbnQoKTsKLSAgICAgICAgCQlJU3RhdHVzIG9rPSBBU1RQcm92aWRlci5nZXRBU1RQcm92aWRlcigpLnJ1bk9uQVNUKHR1LCBBU1RQcm92aWRlci5XQUlUX0lGX09QRU4sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG5ldyBBU1RSdW5uYWJsZSgpIHsKLSAgICAgICAgCQkJcHVibGljIElTdGF0dXMgcnVuT25BU1QoSUxhbmd1YWdlIGxhbmd1YWdlLCBJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAJCQkJcmVzdWx0WzBdPSBhc3QuZ2V0Tm9kZVNlbGVjdG9yKG51bGwpLmZpbmROYW1lKHRleHRTZWwuZ2V0T2Zmc2V0KCksIHRleHRTZWwuZ2V0TGVuZ3RoKCkpOwotICAgICAgICAJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9KTsKLSAgICAgICAgCQlhc3NlcnRUcnVlKG9rLmlzT0soKSk7Ci0JCQkJcmV0dXJuIHJlc3VsdFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9zdXBlci5zZXRVcCgpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZT0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UmVmZXJlbmNlW10gcmVmcz0gcGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaWV3UmVmZXJlbmNlIHZpZXdSZWZlcmVuY2UgPSByZWZzW2ldOwotCQkJcGFnZS5zZXRQYXJ0U3RhdGUodmlld1JlZmVyZW5jZSwgSVdvcmtiZW5jaFBhZ2UuU1RBVEVfUkVTVE9SRUQpOwotCQl9Ci0JCQotCQlVUkkgcHJvamVjdFJvb3RVUkkgPSBDb25uZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFdvcmtzcGFjZVVSSShQUk9KRUNUX05BTUUpOwotCQlSZW1vdGVUZXN0UHJvamVjdCByZW1vdGVQcm9qZWN0ID0gbmV3IFJlbW90ZVRlc3RQcm9qZWN0KFBST0pFQ1RfTkFNRSwgcHJvamVjdFJvb3RVUkkpOwotCQkKLQkJQ29ubmVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZXNldFNlcnZpY2VNb2RlbChyZW1vdGVQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCVNlcnZpY2VNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcmludFNlcnZpY2VNb2RlbCgpOwotCQkKLQkJZkNQcm9qZWN0ID0gcmVtb3RlUHJvamVjdC5nZXRDUHJvamVjdCgpOwotCQotCQlDQ29yZVBsdWdpbi5nZXRJbmRleE1hbmFnZXIoKS5zZXRJbmRleGVySWQoZkNQcm9qZWN0LCBSZW1vdGVGYXN0SW5kZXhlci5JRCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQzYzJiLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MDI2MC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmZmOTEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0jIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0jIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0jIAotIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgTEEtQ0MgMDQtMTE1Ci0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QYXJhbGxlbCBUb29scyBQbGF0Zm9ybSBFbmQtVXNlciBSdW50aW1lCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QW4gaW50ZWdyYXRlZCBlbnZpcm9ubWVudCBmb3IgdGhlIGRldmVsb3BtZW50IG9mIFwKLXBhcmFsbGVsIGFwcGxpY2F0aW9ucy4KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gVXBkYXRlcwotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzZcblwKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5XG5cCi1vZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXNcblwKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEVcblwKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUlxuXAotQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkXG5cCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLFxuXAotc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLlxuXAotXG5cCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUxBLUNDIDA0LTExNVxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzFjZWYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL3B0cC9yZWxlYXNlcy8yLjAiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhY2U4NjMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5haXgucHBjLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9CVUlMRCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkwMjQ4Ny4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvQlVJTEQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBidWlsZCBwcm94eSBwbHVnaW5zIGluIHRoZSB3b3Jrc3BhY2UKLSMKLQotIyBUaGlzIHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgYnVpbGQgc2NyaXB0IHdpdGggdGhlIGFjdHVhbAotIyBQVFAgYnVpbGQgdmVyc2lvbiBudW1iZXIuIFRoZSBzY3JpcHQgY2FuIGFsc28gYmUgcnVuIG91dCBvZiBDVlMsCi0jIGluIHdoaWNoIGNhc2UgdGhlcmUgaXMgbm8gdmVyc2lvbi4KLVZFUlNJT049Il9AYnVpbGRWZXJzaW9uQCIKLWlmIFsgYGV4cHIgIiRWRVJTSU9OIiA6ICJfQFteQF0qQCJgIC1ndCAwIF07IHRoZW4KLQlWRVJTSU9OPQotZmkKLQotUk1TPSJtcGljaDIgaWJtLnBlIGlibS5sbCIKLQotS05PV05fUExVR0lOUz0iXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscyRWRVJTSU9OXAotCW9yZy5lY2xpcHNlLnB0cC5wcm94eSRWRVJTSU9OXAotCW9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0kVkVSU0lPTiIKLQkJCi1QQVJFTlQ9YGRpcm5hbWUgJFBXRGAKLVBMVUdJTj1gYmFzZW5hbWUgJFBXRGAKLVBSRUZJWD0kUEFSRU5ULyRQTFVHSU4KLQotaWYgWyAhIC1kIGJpbiBdOyB0aGVuCi0JbWtkaXIgYmluCi1maQotCi1mb3Igcm1zIGluICRSTVMKLWRvCi0JS05PV05fUExVR0lOUz0iJEtOT1dOX1BMVUdJTlMgb3JnLmVjbGlwc2UucHRwLnJtLiRybXMucHJveHkkVkVSU0lPTiIKLWRvbmUKLQotY2QgJFBBUkVOVAotCi1mb3IgcGx1Z2luIGluIGBlY2hvICRLTk9XTl9QTFVHSU5TYAotZG8KLQlpZiBbIC1lICRwbHVnaW4vY29uZmlndXJlIF07IHRoZW4KLQkJZWNobyAiQnVpbGRpbmcgJHBsdWdpbi4uLiIKLQkJKGNkICRwbHVnaW47IFwKLQkJa3NoOTMgY29uZmlndXJlIC0tcHJlZml4PSRQUkVGSVggJiYgXAotCQljaG1vZCAreCBpbnN0YWxsLXNoICYmIFwKLQkJbWFrZSBpbnN0YWxsKQotCQllY2hvOyBlY2hvCi0JZmkKLWRvbmUKLQotZXhpdCAwCi0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNTFiYy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUuYWl4LnBwYwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvYWJvdXQuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvYmluL1JFQURNRSBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9iaW4vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg5OGI3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9iaW4vUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotT1JURV9TRVJWRVIgYmluYXJ5IHdpbGwgZ28gaGVyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQxY2Y2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBCVUlMRCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9mcmFnbWVudC54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRjNzJhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQ+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E4ODg1Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUwMjYwLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5jb3JlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5jb3JlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJmOWNiLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0jIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0jIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0jIAotIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgTEEtQ0MgMDQtMTE1Ci0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QYXJhbGxlbCBUb29scyBQbGF0Zm9ybSBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gY29yZSBjb21wb25lbnRzCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIFVwZGF0ZXMKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKLVRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2XG5cCi1mb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eVxuXAotb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzXG5cCi1yaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFXG5cCi1HT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1JcblwKLUFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZFxuXAotdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCxcblwKLXNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC5cblwKLVxuXAotQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1MQS1DQyAwNC0xMTVcbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5jb3JlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxNzlmZi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjEuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmludHJvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5oZWxwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuY29yZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNmY2RiLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnBlcmYtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDg4N2Q1Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1OTgzNS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIEV4dGVybmFsIFRvb2xzIEZyYW1ld29yawotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUV4dGVybmFsIFRvb2xzIEZyYW1ld29yayBjb21wb25lbnRzLiAgVGhlc2UgcHJvdmlkZSB0aGVcblwKLWFiaWxpdHkgdG8gYnVpbGQgYW5kIGxhdW5jaCBhcHBsaWNhdGlvbnMgd2l0aCBjb21tYW5kIGxpbmUgYmFzZWRcblwKLXRvb2xzIChzdWNoIGFzIHBlcmZvcm1hbmNlIGFuYWx5c2lzIHRvb2xzKSwgd2hpY2ggbWF5IGJlIGNvbmZpZ3VyZWQgZnJvbSB3aXRoaW5cblwKLXRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBzeXN0ZW0uXG5cCi1vcmcuZWNsaXBzZS5wdHAucGVyZjogIFRoZSBjb3JlIG9mIHRoZSBmcmFtZXdvcmssbWFuYWdlcyBleHRlcm5hbCB0b29sIGFjdGl2aXR5XG5cCi10aG91Z2ggdGhlIGFwcGxpY2F0aW9uIGxhdW5jaCBwcm9jZXNzLlxuXAotb3JnLmVjbGlwc2UucHRwLnBlcmYucGFyYWxsZWw6ICBBZGRzIGV4dGVybmFsIGZyYW1ld29yayBmdW5jdGlvbmFsaXR5XG5cCi10byB0aGUgUFRQJ3MgcGFyYWxsZWwgbGF1bmNoIHN5c3RlbS5cblwKLW9yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzOiAgUHJvdmlkZXMgZmVhdHVyZXMgZm9yIGNyZWF0aW5nXG5cCi1hbmQgbWFuaXB1bGF0aW5nIGV4dGVybmFsIHRvb2wgd29ya2Zsb3dzIGFuZCBjdXN0b20gdXNlciBpbnRlcmZhY2VzXG5cCi1mb3IgZXh0ZXJuYWwgdG9vbHMuXG4KLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDE5OTctMjAwOFxuXAotICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBhbmQgSW5mb3JtYXRpb24gU2NpZW5jZSwgVW5pdmVyc2l0eSBvZiBPcmVnb25cblwKLSAgIEFkdmFuY2VkIENvbXB1dGluZyBMYWJvcmF0b3J5LCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnlcblwKLSAgIFJlc2VhcmNoIENlbnRlciBKdWVsaWNoLCBaQU0gR2VybWFueQlcblwKLVxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlNDQ5MS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wZXJmIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzLzIuMSIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5sYXVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBlcmYucGFyYWxsZWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZnctZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjExYTA2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4ODdkNS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDQ5YjUuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QVFAgUGVyZm9ybWFuY2UgVG9vbHMgRnJhbWV3b3JrIFRBVSBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RXh0ZW5kcyB0aGUgcGVyZm9ybWFuY2UgdG9vbHMgZnJhbWV3b3JrIHdpdGggY2FwYWJpbGl0aWVzIHNwZWNpZmljXG5cCi10byB0aGUgVEFVIHBlcmZvcm1hbmNlIGFuYWx5c2lzIHN5c3RlbS5cblwKLW9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdTogQWRkcyB0aGUgY29yZSBHVUkgYW5kIG9wZXJhdGlvbmFsIGZlYXR1cmVzXG5cCi1yZXF1aXJlZCBieSBUQVUgdG8gdGhlIHBlcmZvcm1hbmNlIGZyYW1ld29yay5cblwKLW9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5qYXJzOiBDb250YWlucyB0aGUgamFyIGZpbGVzIHJlcXVpcmVkXG5cCi1ieSB0aGUgcGVyZmRtZiBwbHVnaW4uXG5cCi1vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGFwaXNlbGVjdDogUHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvclxuXAotc2VsZWN0aW5nIFBBUEkgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlcnMuXG5cCi1vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGFwaXRlc3Q6IEEgc2ltcGxlIHRlc3QgcGx1Z2luIGZvciB0aGVcblwKLXBhcGlzZWxlY3RvclxuXAotb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBlcmZkbWY6IFByb3ZpZGVzIHBlcmZkbWYgcGVyZm9ybWFuY2VcblwKLWRhdGFiYXNlIGludGVncmF0aW9uIHdpdGggRWNsaXBzZSwgaW5jbHVkaW5nIHRoZSBhYmlsaXR5IHRvIGxhdW5jaFxuXAotUGFyYVByb2YgZnJvbSBFY2xpcHNlIGFuZCBjYWxsIGJhY2sgZnJvbSBQYXJhUHJvZiB0byBzb3VyY2UgY29kZVxuXAotaW4gRWNsaXBzZS5cblwKLW9yZy5lY2xpcHNlLnB0cC50YXUuc2VsaW5zdDogU2VsZWN0aXZlIGluc3RydW1lbnRhdGlvbiBmdW5jdGlvbmFsaXR5XG5cCi1mb3IgQy9DKytcbgotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMTk5Ny0yMDA4XG5cCi0gICBEZXBhcnRtZW50IG9mIENvbXB1dGVyIGFuZCBJbmZvcm1hdGlvbiBTY2llbmNlLCBVbml2ZXJzaXR5IG9mIE9yZWdvblxuXAotICAgQWR2YW5jZWQgQ29tcHV0aW5nIExhYm9yYXRvcnksIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeVxuXAotICAgUmVzZWFyY2ggQ2VudGVyIEp1ZWxpY2gsIFpBTSBHZXJtYW55CVxuXAotXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YWM1NGYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBlcmYudGF1IgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdSI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuY3MudW9yZWdvbi5lZHUvcmVzZWFyY2gvdGF1L2hvbWUucGhwIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL3B0cC9yZWxlYXNlcy8yLjEiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnBlcmYudG9vbG9wdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucGVyZiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jZHQudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuamFycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGFwaXRlc3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGVyZmRtZiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS5mb3J0cmFuLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NTY1Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5mb3J0cmFuLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS5mb3J0cmFuLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4ODdkNS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS5mb3J0cmFuLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS5mb3J0cmFuLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUuZm9ydHJhbi1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZWMxY2IuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS5mb3J0cmFuLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBQZXJmb3JtYW5jZSBUb29scyBGcmFtZXdvcms6IFRBVSBGb3J0cmFuIEVuYWJsZXIKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPVVuaXZlcnNpdHkgb2YgT3JlZ29uCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIHNlbGVjdGl2ZSBpbnN0cnVtZW50YXRpb24gZnVuY3Rpb25hbGl0eSBmb3IgRm9ydHJhbiB2aWEgdGhlXG5cCi1QaG90cmFuIHByb2plY3QuXG4KLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDE5OTctMjAwOFxuXAotICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBhbmQgSW5mb3JtYXRpb24gU2NpZW5jZSwgVW5pdmVyc2l0eSBvZiBPcmVnb25cblwKLSAgIEFkdmFuY2VkIENvbXB1dGluZyBMYWJvcmF0b3J5LCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnlcblwKLSAgIFJlc2VhcmNoIENlbnRlciBKdWVsaWNoLCBaQU0gR2VybWFueQlcblwKLVxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ldGZ3LnRhdS5mb3J0cmFuLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2M2IxMi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5mb3J0cmFuIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Zm9ydCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL3B0cC9yZWxlYXNlcy8yLjEiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jZHQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucGhvdHJhbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuc2VsaW5zdGZvcnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUuZm9ydHJhbi1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXRmdy50YXUuZm9ydHJhbi1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV0ZncudGF1LmZvcnRyYW4tZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzQ1OTcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlkZjhmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0NWFiYS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0jIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0jIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0jIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSMgCi0jIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBMQS1DQyAwNC0xMTUKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBDb21tb24gRXh0ZXJuYWwgQ29tcG9uZW50cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVBUUCBjb21wb25lbnRzIGZvciBzdXBwb3J0aW5nIHZhcmlvdXMgcGxhdGZvcm1zCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG5cCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNlxuXAotZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHlcblwKLW9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhc1xuXAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRVxuXAotR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SXG5cCi1BU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWRcblwKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsXG5cCi1zbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuXG5cCi1cblwKLUFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotTEEtQ0MgMDQtMTE1XG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiYzVlNC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4xLjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmFpeC5wcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAubGludXgueDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnByb3h5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5leHRlcm5hbC1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhY2U4NjMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAubGludXgucHBjPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvQlVJTEQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRhODljMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9CVUlMRAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGJ1aWxkIHByb3h5IHBsdWdpbnMgaW4gdGhlIHdvcmtzcGFjZQotIwotCi0jIFRoaXMgc2hvdWxkIGdldCByZXBsYWNlZCBieSBidWlsZCBzY3JpcHQgd2l0aCB0aGUgYWN0dWFsCi0jIFBUUCBidWlsZCB2ZXJzaW9uIG51bWJlci4gVGhlIHNjcmlwdCBjYW4gYWxzbyBiZSBydW4gb3V0IG9mIENWUywKLSMgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBubyB2ZXJzaW9uLgotVkVSU0lPTj0iX0BidWlsZFZlcnNpb25AIgotaWYgWyBgZXhwciAiJFZFUlNJT04iIDogIl9AW15AXSpAImAgLWd0IDAgXTsgdGhlbgotCVZFUlNJT049Ci1maQotCi1STVM9Im1waWNoMiBpYm0ucGUgaWJtLmxsIgotCi1LTk9XTl9QTFVHSU5TPSJcCi0Jb3JnLmVjbGlwc2UucHRwLnV0aWxzJFZFUlNJT05cCi0Jb3JnLmVjbGlwc2UucHRwLnByb3h5JFZFUlNJT05cCi0Jb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSRWRVJTSU9OIgotCQkKLVBBUkVOVD1gZGlybmFtZSAkUFdEYAotUExVR0lOPWBiYXNlbmFtZSAkUFdEYAotUFJFRklYPSRQQVJFTlQvJFBMVUdJTgotCi1pZiBbICEgLWQgYmluIF07IHRoZW4KLQlta2RpciBiaW4KLWZpCi0KLWZvciBybXMgaW4gJFJNUwotZG8KLQlLTk9XTl9QTFVHSU5TPSIkS05PV05fUExVR0lOUyBvcmcuZWNsaXBzZS5wdHAucm0uJHJtcy5wcm94eSRWRVJTSU9OIgotZG9uZQotCi1jZCAkUEFSRU5UCi0KLWZvciBwbHVnaW4gaW4gYGVjaG8gJEtOT1dOX1BMVUdJTlNgCi1kbwotCWlmIFsgLWUgJHBsdWdpbi9jb25maWd1cmUgXTsgdGhlbgotCQllY2hvICJCdWlsZGluZyAkcGx1Z2luLi4uIgotCQkoY2QgJHBsdWdpbjsgXAotCQlzaCBjb25maWd1cmUgLS1wcmVmaXg9JFBSRUZJWCAmJiBcCi0JCWNobW9kICt4IGluc3RhbGwtc2ggJiYgXAotCQltYWtlIGluc3RhbGwpCi0JCWVjaG87IGVjaG8KLQlmaQotZG9uZQotCi1leGl0IDAKLQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4NGQzNi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZS5saW51eC5wcGMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9hYm91dC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9iaW4vLmN2c2lnbm9yZSBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2Jpbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFkZjU2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2Jpbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZG0KLSpfcHJveHkKLSoucHkKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2Jpbi9SRUFETUUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9iaW4vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg5OGI3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2Jpbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1PUlRFX1NFUlZFUiBiaW5hcnkgd2lsbCBnbyBoZXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQxY2Y2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEJVSUxELFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvZnJhZ21lbnQueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRjNzJhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudD4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2Ly5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTZhZWIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAubGludXgueDg2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvQlVJTEQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRhODljMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9CVUlMRAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGJ1aWxkIHByb3h5IHBsdWdpbnMgaW4gdGhlIHdvcmtzcGFjZQotIwotCi0jIFRoaXMgc2hvdWxkIGdldCByZXBsYWNlZCBieSBidWlsZCBzY3JpcHQgd2l0aCB0aGUgYWN0dWFsCi0jIFBUUCBidWlsZCB2ZXJzaW9uIG51bWJlci4gVGhlIHNjcmlwdCBjYW4gYWxzbyBiZSBydW4gb3V0IG9mIENWUywKLSMgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBubyB2ZXJzaW9uLgotVkVSU0lPTj0iX0BidWlsZFZlcnNpb25AIgotaWYgWyBgZXhwciAiJFZFUlNJT04iIDogIl9AW15AXSpAImAgLWd0IDAgXTsgdGhlbgotCVZFUlNJT049Ci1maQotCi1STVM9Im1waWNoMiBpYm0ucGUgaWJtLmxsIgotCi1LTk9XTl9QTFVHSU5TPSJcCi0Jb3JnLmVjbGlwc2UucHRwLnV0aWxzJFZFUlNJT05cCi0Jb3JnLmVjbGlwc2UucHRwLnByb3h5JFZFUlNJT05cCi0Jb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSRWRVJTSU9OIgotCQkKLVBBUkVOVD1gZGlybmFtZSAkUFdEYAotUExVR0lOPWBiYXNlbmFtZSAkUFdEYAotUFJFRklYPSRQQVJFTlQvJFBMVUdJTgotCi1pZiBbICEgLWQgYmluIF07IHRoZW4KLQlta2RpciBiaW4KLWZpCi0KLWZvciBybXMgaW4gJFJNUwotZG8KLQlLTk9XTl9QTFVHSU5TPSIkS05PV05fUExVR0lOUyBvcmcuZWNsaXBzZS5wdHAucm0uJHJtcy5wcm94eSRWRVJTSU9OIgotZG9uZQotCi1jZCAkUEFSRU5UCi0KLWZvciBwbHVnaW4gaW4gYGVjaG8gJEtOT1dOX1BMVUdJTlNgCi1kbwotCWlmIFsgLWUgJHBsdWdpbi9jb25maWd1cmUgXTsgdGhlbgotCQllY2hvICJCdWlsZGluZyAkcGx1Z2luLi4uIgotCQkoY2QgJHBsdWdpbjsgXAotCQlzaCBjb25maWd1cmUgLS1wcmVmaXg9JFBSRUZJWCAmJiBcCi0JCWNobW9kICt4IGluc3RhbGwtc2ggJiYgXAotCQltYWtlIGluc3RhbGwpCi0JCWVjaG87IGVjaG8KLQlmaQotZG9uZQotCi1leGl0IDAKLQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyNjAxZi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZS5saW51eC54ODYKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5saW51eC54ODYKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9hYm91dC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9iaW4vLmN2c2lnbm9yZSBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2Jpbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFkZjU2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2Jpbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZG0KLSpfcHJveHkKLSoucHkKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2Jpbi9SRUFETUUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9iaW4vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg5OGI3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2Jpbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1PUlRFX1NFUlZFUiBiaW5hcnkgd2lsbCBnbyBoZXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ5MGZmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBCVUlMRApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvZnJhZ21lbnQueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRjNzJhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2L2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudD4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0Ly5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzY3MjEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvQlVJTEQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRhODljMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9CVUlMRAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGJ1aWxkIHByb3h5IHBsdWdpbnMgaW4gdGhlIHdvcmtzcGFjZQotIwotCi0jIFRoaXMgc2hvdWxkIGdldCByZXBsYWNlZCBieSBidWlsZCBzY3JpcHQgd2l0aCB0aGUgYWN0dWFsCi0jIFBUUCBidWlsZCB2ZXJzaW9uIG51bWJlci4gVGhlIHNjcmlwdCBjYW4gYWxzbyBiZSBydW4gb3V0IG9mIENWUywKLSMgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBubyB2ZXJzaW9uLgotVkVSU0lPTj0iX0BidWlsZFZlcnNpb25AIgotaWYgWyBgZXhwciAiJFZFUlNJT04iIDogIl9AW15AXSpAImAgLWd0IDAgXTsgdGhlbgotCVZFUlNJT049Ci1maQotCi1STVM9Im1waWNoMiBpYm0ucGUgaWJtLmxsIgotCi1LTk9XTl9QTFVHSU5TPSJcCi0Jb3JnLmVjbGlwc2UucHRwLnV0aWxzJFZFUlNJT05cCi0Jb3JnLmVjbGlwc2UucHRwLnByb3h5JFZFUlNJT05cCi0Jb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSRWRVJTSU9OIgotCQkKLVBBUkVOVD1gZGlybmFtZSAkUFdEYAotUExVR0lOPWBiYXNlbmFtZSAkUFdEYAotUFJFRklYPSRQQVJFTlQvJFBMVUdJTgotCi1pZiBbICEgLWQgYmluIF07IHRoZW4KLQlta2RpciBiaW4KLWZpCi0KLWZvciBybXMgaW4gJFJNUwotZG8KLQlLTk9XTl9QTFVHSU5TPSIkS05PV05fUExVR0lOUyBvcmcuZWNsaXBzZS5wdHAucm0uJHJtcy5wcm94eSRWRVJTSU9OIgotZG9uZQotCi1jZCAkUEFSRU5UCi0KLWZvciBwbHVnaW4gaW4gYGVjaG8gJEtOT1dOX1BMVUdJTlNgCi1kbwotCWlmIFsgLWUgJHBsdWdpbi9jb25maWd1cmUgXTsgdGhlbgotCQllY2hvICJCdWlsZGluZyAkcGx1Z2luLi4uIgotCQkoY2QgJHBsdWdpbjsgXAotCQlzaCBjb25maWd1cmUgLS1wcmVmaXg9JFBSRUZJWCAmJiBcCi0JCWNobW9kICt4IGluc3RhbGwtc2ggJiYgXAotCQltYWtlIGluc3RhbGwpCi0JCWVjaG87IGVjaG8KLQlmaQotZG9uZQotCi1leGl0IDAKLQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MzE3Yy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZyYWdtZW50TmFtZS5saW51eC54ODZfNjQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9hYm91dC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9iaW4vLmN2c2lnbm9yZSBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2Jpbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFkZjU2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2Jpbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZG0KLSpfcHJveHkKLSoucHkKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2Jpbi9SRUFETUUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9iaW4vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg5OGI3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2Jpbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1PUlRFX1NFUlZFUiBiaW5hcnkgd2lsbCBnbyBoZXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ5MGZmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBCVUlMRApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvZnJhZ21lbnQueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRjNzJhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0L2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudD4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZjJlNy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9CVUlMRCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRhODljMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvQlVJTEQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBidWlsZCBwcm94eSBwbHVnaW5zIGluIHRoZSB3b3Jrc3BhY2UKLSMKLQotIyBUaGlzIHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgYnVpbGQgc2NyaXB0IHdpdGggdGhlIGFjdHVhbAotIyBQVFAgYnVpbGQgdmVyc2lvbiBudW1iZXIuIFRoZSBzY3JpcHQgY2FuIGFsc28gYmUgcnVuIG91dCBvZiBDVlMsCi0jIGluIHdoaWNoIGNhc2UgdGhlcmUgaXMgbm8gdmVyc2lvbi4KLVZFUlNJT049Il9AYnVpbGRWZXJzaW9uQCIKLWlmIFsgYGV4cHIgIiRWRVJTSU9OIiA6ICJfQFteQF0qQCJgIC1ndCAwIF07IHRoZW4KLQlWRVJTSU9OPQotZmkKLQotUk1TPSJtcGljaDIgaWJtLnBlIGlibS5sbCIKLQotS05PV05fUExVR0lOUz0iXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscyRWRVJTSU9OXAotCW9yZy5lY2xpcHNlLnB0cC5wcm94eSRWRVJTSU9OXAotCW9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0kVkVSU0lPTiIKLQkJCi1QQVJFTlQ9YGRpcm5hbWUgJFBXRGAKLVBMVUdJTj1gYmFzZW5hbWUgJFBXRGAKLVBSRUZJWD0kUEFSRU5ULyRQTFVHSU4KLQotaWYgWyAhIC1kIGJpbiBdOyB0aGVuCi0JbWtkaXIgYmluCi1maQotCi1mb3Igcm1zIGluICRSTVMKLWRvCi0JS05PV05fUExVR0lOUz0iJEtOT1dOX1BMVUdJTlMgb3JnLmVjbGlwc2UucHRwLnJtLiRybXMucHJveHkkVkVSU0lPTiIKLWRvbmUKLQotY2QgJFBBUkVOVAotCi1mb3IgcGx1Z2luIGluIGBlY2hvICRLTk9XTl9QTFVHSU5TYAotZG8KLQlpZiBbIC1lICRwbHVnaW4vY29uZmlndXJlIF07IHRoZW4KLQkJZWNobyAiQnVpbGRpbmcgJHBsdWdpbi4uLiIKLQkJKGNkICRwbHVnaW47IFwKLQkJc2ggY29uZmlndXJlIC0tcHJlZml4PSRQUkVGSVggJiYgXAotCQljaG1vZCAreCBpbnN0YWxsLXNoICYmIFwKLQkJbWFrZSBpbnN0YWxsKQotCQllY2hvOyBlY2hvCi0JZmkKLWRvbmUKLQotZXhpdCAwCi0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiYTY3Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUubWFjb3N4LnBwYwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvYWJvdXQuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvYmluLy5jdnNpZ25vcmUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvYmluLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWRmNTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2Jpbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZG0KLSpfcHJveHkKLSoucHkKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9iaW4vUkVBRE1FIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2Jpbi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODk4YjcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2Jpbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1PUlRFX1NFUlZFUiBiaW5hcnkgd2lsbCBnbyBoZXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDkwZmYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBCVUlMRApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2ZyYWdtZW50LnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYy9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGM3MmEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudD4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkYzgxYy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4NjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9CVUlMRCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRhODljMC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvQlVJTEQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBidWlsZCBwcm94eSBwbHVnaW5zIGluIHRoZSB3b3Jrc3BhY2UKLSMKLQotIyBUaGlzIHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgYnVpbGQgc2NyaXB0IHdpdGggdGhlIGFjdHVhbAotIyBQVFAgYnVpbGQgdmVyc2lvbiBudW1iZXIuIFRoZSBzY3JpcHQgY2FuIGFsc28gYmUgcnVuIG91dCBvZiBDVlMsCi0jIGluIHdoaWNoIGNhc2UgdGhlcmUgaXMgbm8gdmVyc2lvbi4KLVZFUlNJT049Il9AYnVpbGRWZXJzaW9uQCIKLWlmIFsgYGV4cHIgIiRWRVJTSU9OIiA6ICJfQFteQF0qQCJgIC1ndCAwIF07IHRoZW4KLQlWRVJTSU9OPQotZmkKLQotUk1TPSJtcGljaDIgaWJtLnBlIGlibS5sbCIKLQotS05PV05fUExVR0lOUz0iXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscyRWRVJTSU9OXAotCW9yZy5lY2xpcHNlLnB0cC5wcm94eSRWRVJTSU9OXAotCW9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0kVkVSU0lPTiIKLQkJCi1QQVJFTlQ9YGRpcm5hbWUgJFBXRGAKLVBMVUdJTj1gYmFzZW5hbWUgJFBXRGAKLVBSRUZJWD0kUEFSRU5ULyRQTFVHSU4KLQotaWYgWyAhIC1kIGJpbiBdOyB0aGVuCi0JbWtkaXIgYmluCi1maQotCi1mb3Igcm1zIGluICRSTVMKLWRvCi0JS05PV05fUExVR0lOUz0iJEtOT1dOX1BMVUdJTlMgb3JnLmVjbGlwc2UucHRwLnJtLiRybXMucHJveHkkVkVSU0lPTiIKLWRvbmUKLQotY2QgJFBBUkVOVAotCi1mb3IgcGx1Z2luIGluIGBlY2hvICRLTk9XTl9QTFVHSU5TYAotZG8KLQlpZiBbIC1lICRwbHVnaW4vY29uZmlndXJlIF07IHRoZW4KLQkJZWNobyAiQnVpbGRpbmcgJHBsdWdpbi4uLiIKLQkJKGNkICRwbHVnaW47IFwKLQkJc2ggY29uZmlndXJlIC0tcHJlZml4PSRQUkVGSVggJiYgXAotCQljaG1vZCAreCBpbnN0YWxsLXNoICYmIFwKLQkJbWFrZSBpbnN0YWxsKQotCQllY2hvOyBlY2hvCi0JZmkKLWRvbmUKLQotZXhpdCAwCi0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyYTJmMi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmcmFnbWVudE5hbWUubWFjb3N4Lng4NgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnB0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvYWJvdXQuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvYmluLy5jdnNpZ25vcmUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvYmluLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDdjNjMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2L2Jpbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZG0KLSpfcHJveHkKLSoucHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvYmluL1JFQURNRSBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9iaW4vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg5OGI3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9iaW4vUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotT1JURV9TRVJWRVIgYmluYXJ5IHdpbGwgZ28gaGVyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ5MGZmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgQlVJTEQKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9mcmFnbWVudC54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRjNzJhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQ+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM4YWIxLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI2ZTk4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCi1nZW5lcmF0ZUZlYXR1cmVWZXJzaW9uU3VmZml4PXRydWUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2J1aWxkTm90ZXMudHh0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvYnVpbGROb3Rlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NzhhZTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvYnVpbGROb3Rlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1UbyBidWlsZCBmZWF0dXJlOgotQlJUIDcvMTgvMjAwNgotCi1Hb2FsOiBwYWNrYWdlIGFsbCBwbHVnaW5zIGFzIGphcnMsIHBhY2thZ2UgZmVhdHVyZSBhcyBhIGZvbGRlci4KLQotKDEpIHBsdWdpbiBidWlsZCBzZXR1cAotKDIpIGZlYXR1cmUgc2V0dXAKLSgzKSBmZWF0dXJlIGV4cG9ydAotCi0oMSkgcGx1Z2luIGJ1aWxkIHNldHVwCi1JbiBFQUNIIHBsdWdpbiBtYW5pZmVzdCwgYmUgc3VyZSB0bzoKLQotKGEpIGFzc3VyZSB0aGVyZSBJUyBhIE1BTklGRVNULk1GLiAgSWYgbm90LCBnbyB0byBvdmVydmlldyBwYWdlIGZvciBwbHVnaW4ueG1sCi1hbmQgY2xpY2sgb24gdGhlIGxpbmsgdG8gYnVpbGQgYW4gT1NHaSBidW5kbGUgbWFuaWZlc3QodGhpcyBpcyB0aGUgTUFOSUZFU1QuTUYgZmlsZSkKLShOb3RlOiB0aGlzIGxpbmsgZG9lc24ndCBhcHBlYXIgaWYgdGhlIHByb2plY3QgYWxyZWFkeSBoYXMgYSBNQU5JRkVTVC5NRikKLQotKGIpIEJ1aWxkIHBhZ2U6IGRvbid0IGJ1aWxkIGEgamFyIChzaW5jZSB3ZSB3aWxsIGphciB0aGUgd2hvbGUgcGx1Z2luKTogCi1VbmRlciBydW50aW1lIGluZm9ybWF0aW9uLCBkZWxldGUgYSBqYXIgaWYgaXQncyB0aGVyZSwgYW5kIEFkZCBMaWJyYXJ5IG9mICcuJwotdGhlbiBvbiByaWdodCBzaWRlIHdoaWxlICcuJyBpcyBzZWxlY3RlZCwgQWRkIGZvbGRlciBvZiAnc3JjLycgCi1VbmRlciBCaW5hcnkgQnVpbGQsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHNlbGVjdGVkOgotTUVUQS1JTkYsIGljb25zIChpZiBhbnkpLCBwbHVnaW4ueG1sCi0oTm90ZTogdGhlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2Ugb2YgdGhlICcuJyBhdCB0aGUgdG9wIHVuZGVyCi1ydW50aW1lIGluZm9ybWF0aW9uKQotQW5kLCBhbnkgb3RoZXIgcmVzb3VyY2VzIHRoZSBwbHVnaW5zIG5lZWRzIHN1Y2ggYXMgaHRtbCBmaWxlcywgZXRjLgotCi0oYylUbyBnZXQgdGhlIGNsYXNzZXMgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkOgotb24gMy4xIGJ1aWxkIHBhZ2UgdGhlcmUgaXMgYSBjaGVja2JveCBmb3IgImluY2x1ZGUgc2VsZWN0ZWQgbGlicmFyeSBpbiBiaW5hcnkgYnVpbGQiIAotd2hpY2ggbW9kaWZpZXMgYnVpbGQucHJvcGVydGllcyB0byBwdXQgJy4nIGluIGJpbi5pbmNsdWRlcyAgIC4uLiAKLXRoZXJlIGlzIG5vIGNoZWNrYm94IG9uIDMuMiBidWlsZCBwYWdlLiAgIAotWW91IG1heSBoYXZlIHRvIG1hbnVhbGx5IGVkaXQgYnVpbGQucHJvcGVydGllcyB0byBkbyB0aGlzIGluIDMuMgotPT09PT09PT09PT09PT09PT09PT09Ci1QYXJ0IG9mIGJ1aWxkLnByb3BlcnRpZXM6Ci1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLiAgICAgICAgICA8PT09PSBtYWtlIHN1cmUgdGhpcyBsaW5lIGlzIHRoZXJlCi09PT09PT09PT09PT09PT09PT09PT0KLQotKGQpYW5kIG9uIHJ1bnRpbWUgdGFiIG9mIG1hbmlmZXN0IGVkaXRvciwgdW5kZXIgY2xhc3NwYXRoIChsb3dlciByaWdodCksCi1zcGVjaWZ5IGNsYXNzcGF0aD0nLicgIG9ubHkuICBEZWxldGUgYSBqYXIgZmlsZSBpZiB0aGVyZSwgYW5kIGRvICJOZXcuLi4iIHRvCi1hZGQgICcuJyBhcyB0aGUgbmV3IGxpYnJhcnkgbmFtZS4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0oMikgZmVhdHVyZSBzZXR1cAotSW4gdGhpcyBmZWF0dXJlIHByb2plY3QsIGVkaXQgdGhlIG1hbmlmZXN0IChmZWF0dXJlLnhtbCkKLWFuZCBvbiB0aGUgcGx1Zy1pbnMgdGFiLCBzZWxlY3QgIGVhY2ggcGx1Zy1pbiBhbmQgYmUgc3VyZSB0byAKLXVuY2hlY2sKLSJVbnBhY2sgdGhlIHBsdWdpbiBhcmNoaXZlIGFmdGVyIHRoZSBwbHVnaW4gaW5zdGFsbGF0aW9uIgotCi1UaGlzIG1ha2VzIHN1cmUgdGhlIHBsdWdpbnMgZ2V0IHBhY2thZ2VkIGFzIGphcnMsIG5vdCBmb2xkZXJzLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLQotKDMpIGZlYXR1cmUgZXhwb3J0Ci1Vc2UgZXhwb3J0LiBBbnQgYnVpbGQgc2VlbXMgdG8gd29yayBCVVQgSSBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0byBnZXQgYW50IGJ1aWxkIAotdG8gamFyIHRoZSBwbHVnaW5zIGFuZCBub3QgamFyIHRoZSBmZWF0dXJlLgotCi1Db250ZXh0IG1lbnUgb24gZmVhdHVyZSAob3JnLmVjbGlwc2UucHRwLnBsZHQpIHByb2plY3QuCi1FeHBvcnQsIGRlcGxveWFibGUgZmVhdHVyZXMKLQotSW4gdGFiYmVkIHNlY3Rpb24gYXQgYm90dG9tIG9mIGV4cG9ydCBXaXphcmQgZmlyc3QgcGFnZSwKLWNoZWNrICJBcmNoaXZlIGZpbGUiIGFuZCBzZXQgaXQgdG8gc29tZXRoaW5nIGxpa2UKLTx3b3Jrc3BhY2UtbG9jYXRpb24+L29yZy5lY2xpcHNlLnB0cC5wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LTEuMC4wLVlZWVlNTURESEhNTS56aXAKLQotT24gdGhlIG9wdGlvbnMgdGFiLCBkbyBOT1Qgc2VsZWN0ICJwYWNrYWdlIGFzIGluZGl2aWR1YWwgamFyIGFyY2hpdmVzLiIKLVRoaXMgamFycyB0aGUgZmVhdHVyZSB0b28sIHdoaWNoIGRvZXNuJ3Qgd29yay4KLVRoZSBmZWF0dXJlIHNldHVwIGl0ZW0gYWJvdmUgc2V0cyB0aGUgamFycmluZyBvZiB0aGUgaW5kaXZpZHVhbCBwbHVnLWlucy4KLQotCi09PT09IHRoZSB6aXAgdGhhdCBpcyBidWlsdCB3aWxsIG5vdCBoYXZlIGVjbGlwc2UgYXMgaXRzIHJvb3QKLXVuemlwIHRvIGM6XHRlbXBcZWNsaXBzZSwgCi1yZW5hbWUgb3JpZy4gYXJjaGl2ZSAoc28gZW1wdHkgZGlycyBkb24ndCBnZXQgY3JlYXRlZCkgCi10aGVuIHJlLXppcCB3aXRoIGVjbGlwc2UgYXMgaXRzIHJvb3QgaW50byB0aGUgZmluYWwgemlwIGZpbGUgbmFtZS4KLU9SIHVzZSByZXppcC5iYXQgIHdoaWNoIGF1dG9tYXRlcyB0aGlzIFticnRdCi09PT09PT09PT09PQotVXBsb2FkIG5vdGVzCi1PbmNlIHlvdSd2ZSBleHBvcnRlZCB0aGUgZmVhdHVyZSBhbmQgIAotemlwcGVkIGl0IHVwLCB0cnkgdGhpcyBjb21tYW5kOgotCi0JCSBzY3AgemlwX2ZpbGUuemlwIHVzZXJAZGV2LmVjbGlwc2Uub3JnOmRvd25sb2Fkcy90b29scy9wdHAvYnVpbGRzCi0KLXdoZXJlICdidGliYml0dHMnIGlzIHlvdXIgY29tbWl0dGVyIHVzZXJuYW1lIGFuZCB6aXBfZmlsZS56aXAgaXM6Ci0KLQkJIG9yZy5lY2xpcHNlLnB0cC5wbGR0LTEuMS1JWVlZWU1NRERISE1NLnppcAotCi13aGVyZSBJIGlzIGEgY2FwaXRhbCBpIChmb3IgaW50ZWdyYXRpb24pIGFuZCBZWVlZTU1EREhITU0gaXMgIAotdGhlIHllYXIsIG1vbnRoLCBkYXksIGhvdXIgYW5kIG1pbnV0ZSBvZiB0aGUgYnVpbGQuCi0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2Rldi5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvZGV2LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTliMzkuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvZGV2LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jCi0jVGh1IEp1biAyOCAxMDoxMjoxOSBFRFQgMjAwNwotb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzPWJpbgotb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uPWJpbgotb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaT1iaW4KLW9yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHA9YmluCi1vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0PWJpbgotb3JnLmVjbGlwc2UuY2R0LmRvYy51c2VyLndlbGNvbWU9YmluCi1vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzPWJpbgotQGlnbm9yZWRvdEA9dHJ1ZQotb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmU9YmluCi1vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpPWJpbgotb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmU9YmluCi1vcmcuZWNsaXBzZS5wdHAucGxkdC53ZWxjb21lPWJpbgotb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2PWJpbgotY29tLmlibS5qZGcyZS5qZHQ9YmluCi1vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXM9YmluCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMDc3NS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwOCBJQk0gQ29ycG9yYXRpb24KLSMKLSMgZmVhdHVyZXMucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QWRkcyBhIHJhbmdlIG9mIHN0YXRpYyBhbmFseXNpcyBhbmQgcHJvZ3JhbW1pbmcgYXNzaXN0YW5jZSB0b29scy4KLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsMjAwOCBJQk1cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi0KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTgxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4xLjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzLzIuMSIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5jb3JlIiB2ZXJzaW9uPSI0LjAuMiIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5kb2MudXNlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uaWJtLmljdSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzYWRlYi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGJiODgzLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvYnVpbGROb3Rlcy50eHQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlL2J1aWxkTm90ZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjZTVhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvYnVpbGROb3Rlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1UbyBidWlsZCBmZWF0dXJlOgotQlJUIDcvMTgvMjAwNgotCi1Hb2FsOiBwYWNrYWdlIGFsbCBwbHVnaW5zIGFzIGphcnMsIHBhY2thZ2UgZmVhdHVyZSBhcyBhIGZvbGRlci4KLQotKDEpIHBsdWdpbiBidWlsZCBzZXR1cAotKDIpIGZlYXR1cmUgc2V0dXAKLSgzKSBmZWF0dXJlIGV4cG9ydAotCi0oMSkgcGx1Z2luIGJ1aWxkIHNldHVwCi1JbiBFQUNIIHBsdWdpbiBtYW5pZmVzdCwgYmUgc3VyZSB0bzoKLQotKGEpIGFzc3VyZSB0aGVyZSBJUyBhIE1BTklGRVNULk1GLiAgSWYgbm90LCBnbyB0byBvdmVydmlldyBwYWdlIGZvciBwbHVnaW4ueG1sCi1hbmQgY2xpY2sgb24gdGhlIGxpbmsgdG8gYnVpbGQgYW4gT1NHaSBidW5kbGUgbWFuaWZlc3QodGhpcyBpcyB0aGUgTUFOSUZFU1QuTUYgZmlsZSkKLShOb3RlOiB0aGlzIGxpbmsgZG9lc24ndCBhcHBlYXIgaWYgdGhlIHByb2plY3QgYWxyZWFkeSBoYXMgYSBNQU5JRkVTVC5NRikKLQotKGIpIAotTm90ZTogRG9uJ3QgamFyIHRoaXMgZmVhdHVyZSBhbmQgaXRzIHBsdWdpbiwgc28gdGhhdCB0aGUgSUJNIHVzZXIKLWNhbiByZXBsYWNlIHRoZSBIVE1MIGZpbGVzIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbnMgZnJvbSBJQk0uCi1CdWlsZCBwYWdlOiBkb24ndCBidWlsZCBhIGphciAoc2luY2Ugd2Ugd2lsbCBqYXIgdGhlIHdob2xlIHBsdWdpbik6IAotVW5kZXIgcnVudGltZSBpbmZvcm1hdGlvbiwgZGVsZXRlIGEgamFyIGlmIGl0J3MgdGhlcmUsIGFuZCBBZGQgTGlicmFyeSBvZiAnLicKLXRoZW4gb24gcmlnaHQgc2lkZSB3aGlsZSAnLicgaXMgc2VsZWN0ZWQsIEFkZCBmb2xkZXIgb2YgJ3NyYy8nIAotVW5kZXIgQmluYXJ5IEJ1aWxkLCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBzZWxlY3RlZDoKLU1FVEEtSU5GLCBpY29ucyAoaWYgYW55KSwgcGx1Z2luLnhtbAotKE5vdGU6IHRoZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgYXV0b21hdGljYWxseSBiZWNhdXNlIG9mIHRoZSAnLicgYXQgdGhlIHRvcCB1bmRlcgotcnVudGltZSBpbmZvcm1hdGlvbikKLUFuZCwgYW55IG90aGVyIHJlc291cmNlcyB0aGUgcGx1Z2lucyBuZWVkcyBzdWNoIGFzIGh0bWwgZmlsZXMsIGV0Yy4KLQotKGMpVG8gZ2V0IHRoZSBjbGFzc2VzIGluY2x1ZGVkIGluIHRoZSBidWlsZDoKLW9uIDMuMSBidWlsZCBwYWdlIHRoZXJlIGlzIGEgY2hlY2tib3ggZm9yICJpbmNsdWRlIHNlbGVjdGVkIGxpYnJhcnkgaW4gYmluYXJ5IGJ1aWxkIiAKLXdoaWNoIG1vZGlmaWVzIGJ1aWxkLnByb3BlcnRpZXMgdG8gcHV0ICcuJyBpbiBiaW4uaW5jbHVkZXMgICAuLi4gCi10aGVyZSBpcyBubyBjaGVja2JveCBvbiAzLjIgYnVpbGQgcGFnZS4gICAKLVlvdSBtYXkgaGF2ZSB0byBtYW51YWxseSBlZGl0IGJ1aWxkLnByb3BlcnRpZXMgdG8gZG8gdGhpcyBpbiAzLjIKLT09PT09PT09PT09PT09PT09PT09PQotUGFydCBvZiBidWlsZC5wcm9wZXJ0aWVzOgotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4gICAgICAgICAgPD09PT0gbWFrZSBzdXJlIHRoaXMgbGluZSBpcyB0aGVyZQotPT09PT09PT09PT09PT09PT09PT09Ci0KLShkKWFuZCBvbiBydW50aW1lIHRhYiBvZiBtYW5pZmVzdCBlZGl0b3IsIHVuZGVyIGNsYXNzcGF0aCAobG93ZXIgcmlnaHQpLAotc3BlY2lmeSBjbGFzc3BhdGg9Jy4nICBvbmx5LiAgRGVsZXRlIGEgamFyIGZpbGUgaWYgdGhlcmUsIGFuZCBkbyAiTmV3Li4uIiB0bwotYWRkICAnLicgYXMgdGhlIG5ldyBsaWJyYXJ5IG5hbWUuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0KLQotKDIpIGZlYXR1cmUgc2V0dXAKLUluIHRoaXMgZmVhdHVyZSBwcm9qZWN0LCBlZGl0IHRoZSBtYW5pZmVzdCAoZmVhdHVyZS54bWwpCi1hbmQgb24gdGhlIHBsdWctaW5zIHRhYiwgc2VsZWN0ICBlYWNoIHBsdWctaW4gYW5kIGJlIHN1cmUgdG8gCi1DSEVDSwotIlVucGFjayB0aGUgcGx1Z2luIGFyY2hpdmUgYWZ0ZXIgdGhlIHBsdWdpbiBpbnN0YWxsYXRpb24iCi0KLVRoaXMgbWFrZXMgc3VyZSB0aGUgcGx1Z2lucyBnZXQgcGFja2FnZWQgYXMgamFycywgbm90IGZvbGRlcnMuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tCi0oMykgZmVhdHVyZSBleHBvcnQKLVVzZSBleHBvcnQuIEFudCBidWlsZCBzZWVtcyB0byB3b3JrIEJVVCBJIGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIGdldCBhbnQgYnVpbGQgCi10byBqYXIgdGhlIHBsdWdpbnMgYW5kIG5vdCBqYXIgdGhlIGZlYXR1cmUuCi0KLUNvbnRleHQgbWVudSBvbiBmZWF0dXJlIChvcmcuZWNsaXBzZS5wdHAucGxkdCkgcHJvamVjdC4KLUV4cG9ydCwgZGVwbG95YWJsZSBmZWF0dXJlcwotCi1JbiB0YWJiZWQgc2VjdGlvbiBhdCBib3R0b20gb2YgZXhwb3J0IFdpemFyZCBmaXJzdCBwYWdlLAotY2hlY2sgIkFyY2hpdmUgZmlsZSIgYW5kIHNldCBpdCB0byBzb21ldGhpbmcgbGlrZQotPHdvcmtzcGFjZS1sb2NhdGlvbj4vb3JnLmVjbGlwc2UucHRwLnBsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQtMS4wLjAtWVlZWU1NRERISE1NLnppcAotCi1PbiB0aGUgb3B0aW9ucyB0YWIsIGRvIE5PVCBzZWxlY3QgInBhY2thZ2UgYXMgaW5kaXZpZHVhbCBqYXIgYXJjaGl2ZXMuIgotVGhpcyBqYXJzIHRoZSBmZWF0dXJlIHRvbywgd2hpY2ggZG9lc24ndCB3b3JrLgotVGhlIGZlYXR1cmUgc2V0dXAgaXRlbSBhYm92ZSBzZXRzIHRoZSBqYXJyaW5nIG9mIHRoZSBpbmRpdmlkdWFsIHBsdWctaW5zLgotCi0KLT09PT09PT09PT09Ci1VcGxvYWQgbm90ZXMKLU9uY2UgeW91J3ZlIGV4cG9ydGVkIHRoZSBmZWF0dXJlIGFuZCAgCi16aXBwZWQgaXQgdXAsIHRyeSB0aGlzIGNvbW1hbmQ6Ci0KLQkJIHNjcCB6aXBfZmlsZS56aXAgdXNlckBkZXYuZWNsaXBzZS5vcmc6ZG93bmxvYWRzL3Rvb2xzL3B0cC9idWlsZHMKLQotd2hlcmUgJ2J0aWJiaXR0cycgaXMgeW91ciBjb21taXR0ZXIgdXNlcm5hbWUgYW5kIHppcF9maWxlLnppcCBpczoKLQotCQkgb3JnLmVjbGlwc2UucHRwLnBsZHQtMS4xLUlZWVlZTU1EREhITU0uemlwCi0KLXdoZXJlIEkgaXMgYSBjYXBpdGFsIGkgKGZvciBpbnRlZ3JhdGlvbiBJIHRoaW5rKSBhbmQgWVlZWU1NRERISE1NIGlzICAKLXRoZSB5ZWFyLCBtb250aCwgZGF5LCBob3VyIGFuZCBtaW51dGUgb2YgdGhlIGJ1aWxkLgotCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjQxMGEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotIyBmZWF0dXJlcy5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgTEFQSSBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIHN1cHBvcnQgZm9yIElCTSBMQVBJIGxpYnJhcnkuCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LDIwMDggSUJNXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzL24vCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAvbi8KLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0L24vCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC9uLwotCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vbi8KLUphbnVhcnkgMjgsIDIwMDUvbi8KLVVzYWdlIE9mIENvbnRlbnQvbi8KLS9uLwotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULi9uLwotL24vQXBwbGljYWJsZSBMaWNlbnNlcy9uLwotL24vCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuL24vCi0vbi8KLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuL24vCi0vbi8KLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuL24vCi0vbi8KLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy4vbi8KLS9uLwotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOi9uLwotL24vCi0gICAgKiBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnkvbi8KLSAgICAqIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzL24vCi0gICAgKiBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMvbi8KLSAgICAqIEZlYXR1cmUgZGlyZWN0b3JpZXMvbi8KLS9uLwotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuL24vCi0vbi8KLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOi9uLwotL24vCi0gICAgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpL24vCi0gICAgKiBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSkvbi8KLSAgICAqIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCkvbi8KLSAgICAqIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGlicmFyeS9vcy1pcGwuaHRtbCkvbi8KLSAgICAqIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKS9uLwotICAgICogTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCkvbi8KLS9uLwotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50Li9uLwotL24vCi1DcnlwdG9ncmFwaHkvbi8KLS9uLwotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC4vbi8KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzQ0ZDAuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4xLjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZT4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL3B0cC9yZWxlYXNlcy8yLjEiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0IiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5kb2MudXNlciIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5jdnNpZ25vcmUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk0MjllLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXJlc3VsdHMKLXRvb2xzCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAxZGU3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbGVuZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnNoIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTA3MTcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBleHBvcnQgZGlzcGxheSBmb3IgcnVubmluZyB0aGUgdGVzdHMKLWV4cG9ydCBESVNQTEFZPToxCi0KLSMgc2V0IHVwIHRvIHVzZSB0aGUgSmF2YSA1IEpSRQotZXhwb3J0IFBBVEg9L29wdC9wdWJsaWMvY29tbW9uL2libS1qYXZhMi1wcGMtNTAvYmluOiRQQVRICi0KLSMgbWFrZSBzdXJlIHdlJ3JlIGluIHRoZSByZWxlbmcgcHJvamVjdCBkaXIgCi1jZCBgZGlybmFtZSAkMGAKLQotdW1hc2sgMDAyMgotCi0jIENoZWNrb3V0IGJhc2VidWlsZGVyIHRvIHJ1biB0aGUgYnVpbGQKLW1rZGlyIC1wIHRvb2xzCi1jZCB0b29scwotY3ZzIC1kOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlIFwKLQljaGVja291dCAtciByMzQyX3YyMDA5MDIxMCBvcmcuZWNsaXBzZS5yZWxlbmcuYmFzZWJ1aWxkZXIKLWNkIC4uCi0KLSMgTGV0J3MgZ28hCi1qYXZhIC1qYXIgdG9vbHMvb3JnLmVjbGlwc2UucmVsZW5nLmJhc2VidWlsZGVyL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5qYXIgXAotCS13cyBndGsgLWFyY2ggcHBjIC1vcyBsaW51eCAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyICQqCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQzMGM2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQVFAiIGRlZmF1bHQ9Im5pZ2h0bHkiPgotCTx0YXJnZXQgbmFtZT0iaGkiPgotCQk8ZWNobyBtZXNzYWdlPSIke2VjbGlwc2UuaG9tZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJ6aXBzLHRlc3QiLz4KLQk8dGFyZ2V0IG5hbWU9Im5pZ2h0bHkiIGRlcGVuZHM9InRhZyx6aXBzLHNpZ24sdGVzdCxjb3B5Ii8+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0YnVpbGQiIGRlcGVuZHM9InppcHMsdGVzdCxjb3B5Ii8+Ci0JPHRhcmdldCBuYW1lPSJidWlsZGNvcHkiIGRlcGVuZHM9InppcHMsY29weSIvPgotCQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0b3VjaCBmaWxlPSIke3VzZXIuaG9tZX0vLmN2c3Bhc3MiIC8+Ci0JCTx0c3RhbXAvPgotCQk8cHJvcGVydHkgbmFtZT0iZWNsaXBzZURpc3QiIHZhbHVlPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzL2Ryb3BzL1ItMy40LTIwMDgwNjE3MjAwMC9lY2xpcHNlLVNESy0zLjQtbGludXgtZ3RrLXBwYy50YXIuZ3oiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNkdERpc3QiIHZhbHVlPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2NkdC9idWlsZHMvNS4wLjMvSS5JMjAwOTExMTYxMjE0L2NkdC1tYXN0ZXItNS4wLjMtSTIwMDkxMTE2MTIxNC56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im15bHluRGlzdCIgdmFsdWU9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvbXlseW4vdXBkYXRlL2dhbnltZWRlL215bHluLTMuMC4xLnYyMDA4MDcyMS0yMTAwLWUzLjQuemlwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyc2VEaXN0IiB2YWx1ZT0iL2hvbWUvZGF0YS9odHRwZC9kb3dubG9hZC5lY2xpcHNlLm9yZy9kc2RwL3RtL2Rvd25sb2Fkcy9kcm9wcy9NMjAwOTA5MjItMDMwMC9SU0UtU0RLLU0yMDA5MDkyMi0wMzAwLnppcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGF1SmFycyIgdmFsdWU9IiR7dXNlci5ob21lfS90YXVfamFycy56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJyYW5jaFZlcnNpb24iIHZhbHVlPSIyLjEuNCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGltZXN0YW1wIiB2YWx1ZT0iJHtEU1RBTVB9JHtUU1RBTVB9IiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9yY2VDb250ZXh0UXVhbGlmaWVyIiB2YWx1ZT0iJHt0aW1lc3RhbXB9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZGluZ09TR2kiIHZhbHVlPSJ0cnVlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZERpcmVjdG9yeSIgdmFsdWU9IiR7YmFzZWRpcn0vcmVzdWx0cyIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29weVRvRGlyIiB2YWx1ZT0iL2hvbWUvd3d3L3Rvb2xzL3B0cC9idWlsZHMvJHticmFuY2hWZXJzaW9ufSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVzdERpcmVjdG9yeSIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L3Rlc3QiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhc2VMb2NhdGlvbiIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L2VjbGlwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBkZS5idWlsZC5zY3JpcHRzIiB2YWx1ZT0iJHtlY2xpcHNlLnBkZWJ1aWxkLnNjcmlwdHN9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb2xsZWN0aW5nRm9sZGVyIiB2YWx1ZT0iZWNsaXBzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYXJjaGl2ZVByZWZpeCIgdmFsdWU9ImVjbGlwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkVHlwZSIgdmFsdWU9IkkiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZElkIiB2YWx1ZT0iJHtidWlsZFR5cGV9JHt0aW1lc3RhbXB9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ6aXBzZGlyIiB2YWx1ZT0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZFR5cGV9LiR7YnVpbGRJZH0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hc3RlckZpbGUiIHZhbHVlPSJwdHAtbWFzdGVyLSR7YnJhbmNoVmVyc2lvbn0tJHtidWlsZElkfS56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VUZXN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UudGVzdF8zLjIuMCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFpbHRvIiB2YWx1ZT0iZy53YXRzb25AY29tcHV0ZXIub3JnIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlUm9vdCIgdmFsdWU9Ijpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFzZW9zIiB2YWx1ZT0iJHtvc2dpLm9zfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFzZXdzIiB2YWx1ZT0iJHtvc2dpLndzfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFzZWFyY2giIHZhbHVlPSIke29zZ2kuYXJjaH0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhZ2JyYW5jaCIgdmFsdWU9Ii1yIHB0cF8yXzEiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhZ25hbWUiIHZhbHVlPSJ2JHt0aW1lc3RhbXB9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0UmVwb3J0cyIgdmFsdWU9IiR7emlwc2Rpcn0vdGVzdFJlcG9ydHMiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imp1bml0LXJlcG9ydC1vdXRwdXQiIHZhbHVlPSIke3Rlc3RSZXBvcnRzfSIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJvbldpbmRvd3MiPgotCQkJPG9zIGZhbWlseT0id2luZG93cyIvPgotCQk8L2NvbmRpdGlvbj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZXN0UmVwb3J0c30iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImZldGNoIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGRpcj0iJHtwZGUuYnVpbGQuc2NyaXB0c30iIHRhcmdldD0icHJlQnVpbGQiPgotCQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L21hc3RlciIvPgotCQk8L2FudD4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGRpcj0iJHtwZGUuYnVpbGQuc2NyaXB0c30iIHRhcmdldD0iZmV0Y2giPgotCQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L21hc3RlciIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InVuemlwIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImRvbnRVbnppcCI+Ci0JCTx1bnRhciBzcmM9IiR7ZWNsaXBzZURpc3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fSIgY29tcHJlc3Npb249Imd6aXAiLz4KLQkJPHVuemlwIHNyYz0iJHtyc2VEaXN0fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJPHVuemlwIHNyYz0iJHtjZHREaXN0fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZSIvPgotCQk8dW56aXAgc3JjPSIke215bHluRGlzdH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L2VjbGlwc2UiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InppcHMiIGRlcGVuZHM9ImluaXQsdW56aXAiPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgZGlyPSIke3BkZS5idWlsZC5zY3JpcHRzfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vbWFzdGVyIiAvPgotCQk8L2FudD4KLQkJPGNvbmNhdCBkZXN0ZmlsZT0iJHt6aXBzZGlyfS9jb21waWxlbG9nLnR4dCI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiIGluY2x1ZGVzPSIqKi8qLmJpbi5sb2ciLz4KLQkJPC9jb25jYXQ+Ci0JCTxsb2FkZmlsZSBwcm9wZXJ0eT0iY29tcGlsZUxvZyIgc3JjRmlsZT0iJHt6aXBzZGlyfS9jb21waWxlbG9nLnR4dCIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJoYXNFcnJvcnMiPgotCQkJPGNvbnRhaW5zIHN0cmluZz0iJHtjb21waWxlTG9nfSIgc3Vic3RyaW5nPSIgRVJST1IiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxtb3ZlIGZpbGU9IiR7emlwc2Rpcn0vJHttYXN0ZXJGaWxlfSIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ii8+Ci0JCTx1bnppcCBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9LyR7bWFzdGVyRmlsZX0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUiLz4KLQkJPG1vdmUgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9lcGwtdjEwLmh0bWwiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2UiLz4KLQkJPG1vdmUgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9ub3RpY2UuaHRtbCIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUvZWNsaXBzZSIvPgotCQk8Y29weSBmaWxlPSJidWlsZHNpdGUueG1sIiB0b2ZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUvZWNsaXBzZS9zaXRlLnhtbCIvPgotCQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2Uvc2l0ZS54bWwiPgotCQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBidWlsZFZlcnNpb25AIiB2YWx1ZT0iJHticmFuY2hWZXJzaW9ufS4ke3RpbWVzdGFtcH0iLz4KLQkJPC9yZXBsYWNlPgotCQk8Y29weSBmaWxlPSJwYWNrLnByb3BlcnRpZXMiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2UiLz4KLQotCQk8emlwIGRlc3RmaWxlPSIke3ppcHNkaXJ9LyR7bWFzdGVyRmlsZX0iCi0JCQliYXNlZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2UiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0ic2lnbiIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJoYXNFcnJvcnMiPgotCQk8ZXhlYyBleGVjdXRhYmxlPSJzaWduIj4KLQkJCTxhcmcgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9LyR7bWFzdGVyRmlsZX0iLz4KLQkJCTxhcmcgdmFsdWU9Im5vbWFpbCIvPgotCQkJPGFyZyB2YWx1ZT0iJHtidWlsZERpcmVjdG9yeX0vc2lnbmVkIi8+Ci0JCTwvZXhlYz4KLQkJPHdhaXRmb3IgbWF4d2FpdD0iMzAiIG1heHdhaXR1bml0PSJtaW51dGUiPgotCQkJPGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9zaWduZWQvJHttYXN0ZXJGaWxlfSIvPgotCQk8L3dhaXRmb3I+Ci0JCTxtb3ZlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpZ25lZC8ke21hc3RlckZpbGV9IiB0b2Rpcj0iJHt6aXBzZGlyfSIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJoYXNFcnJvcnMiLz4KLQk8dGFyZ2V0IG5hbWU9ImNvcHkiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iaGFzRXJyb3JzIj4KLQkJPG1rZGlyIGRpcj0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2NvcHlUb0Rpcn0vJHtidWlsZFR5cGV9LiR7YnVpbGRJZH0iPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfSIvPgotCQk8L2NvcHk+Ci0JCTwhLS0gQ3JlYXRlIHN5bWxpbmsgdG8gbGF0ZXN0IGJ1aWxkIC0tPgotCQk8c3ltbGluayBhY3Rpb249ImRlbGV0ZSIgbGluaz0iJHtjb3B5VG9EaXJ9L2xhdGVzdCIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0JCTxzeW1saW5rIGxpbms9IiR7Y29weVRvRGlyfS9sYXRlc3QiIHJlc291cmNlPSIke2NvcHlUb0Rpcn0vJHtidWlsZFR5cGV9LiR7YnVpbGRJZH0iIG92ZXJ3cml0ZT0idHJ1ZSIvPgotCQk8c3ltbGluayBhY3Rpb249ImRlbGV0ZSIgbGluaz0iJHtjb3B5VG9EaXJ9L3B0cC1tYXN0ZXItJHticmFuY2hWZXJzaW9ufS1sYXRlc3QuemlwIiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KLQkJPHN5bWxpbmsgbGluaz0iJHtjb3B5VG9EaXJ9L3B0cC1tYXN0ZXItJHticmFuY2hWZXJzaW9ufS1sYXRlc3QuemlwIiByZXNvdXJjZT0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9LyR7bWFzdGVyRmlsZX0iIG92ZXJ3cml0ZT0idHJ1ZSIvPgotCQk8c3ltbGluayBhY3Rpb249ImRlbGV0ZSIgbGluaz0iJHtjb3B5VG9EaXJ9L3JkdC1zZXJ2ZXItdW5peC0ke2JyYW5jaFZlcnNpb259LWxhdGVzdC50YXIiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgotCQk8c3ltbGluayBsaW5rPSIke2NvcHlUb0Rpcn0vcmR0LXNlcnZlci11bml4LSR7YnJhbmNoVmVyc2lvbn0tbGF0ZXN0LnRhciIgcmVzb3VyY2U9IiR7Y29weVRvRGlyfS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfS9yZHQtc2VydmVyLXVuaXgtJHticmFuY2hWZXJzaW9ufS50YXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idGFnb25lIj4KLQkJPGN2cyBjdnNyb290PSIvY3Zzcm9vdC90b29scyIgY29tbWFuZD0icnRhZyAke3RhZ2JyYW5jaH0gJHt0YWduYW1lfSAke3RhZ21vZHVsZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InRhZyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYXN0ZXIiLz4KLQkJPC9hbnRjYWxsPgotCQkKLQkJPCEtLUZlYXR1cmVzLS0+Ci0JCTwhLS0KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAudXRpbHMtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5jb3JlLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkKLQkJLS0+CQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8IS0tCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCS0tPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8IS0tCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGVyZi1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5mb3J0cmFuLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCS0tPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmR0LWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJkdC54bGMtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQotCQk8IS0tCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQktLT4KLQkJCi0JCTwhLS1QbHVnaW5zLS0+Ci0JCTwhLS0KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotCQk8L2FudGNhbGw+Ci0JCS0tPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8IS0tCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJLS0+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPCEtLQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkiLz4KLQkJPC9hbnRjYWxsPgkJCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIucHJveHkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0iLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0iLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscyIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdCIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZG9jL29yZy5lY2xpcHNlLnB0cC5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzIi8+Ci0JCTwvYW50Y2FsbD4JCQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmphcnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBlcmZkbWYiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnNlbGluc3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnNlbGluc3Rmb3J0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJLS0+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnN0dWJzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5zZXJ2aWNlcyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmRvYy51c2VyIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC54bGMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFrZS51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXMudGVzdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdCIvPgotCQk8L2FudGNhbGw+Ci0JCTwhLS0KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgucHBjIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4NiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnBhcmFsbGVsIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpdGVzdCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5hbGYudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5kZWJ1Zy5iZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmRlYnVnLmJlLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmRlYnVnLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZGVidWcudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZW52aXJvbm1lbnQuY2VsbHNpbXVsYXRvciIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5lbnZpcm9ubWVudC5sYXVuY2hlci5jZWxsYmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZW52aXJvbm1lbnQubGF1bmNoZXIucGR0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmVudmlyb25tZW50LnJlbW90ZXNpbXVsYXRvciIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5lbnZpcm9ubWVudC51aS5kZXBsb3kiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZXhhbXBsZXMudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuaGVscCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5tYWtlLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci5nbnUuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci5nbnUudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIueGwuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci54bC51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5wZHQueG1sIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnByZWZlcmVuY2VzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvciIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5zaW11bGF0b3IuYXJjaGl0ZWN0dXJlLmR1YWxjZWxsIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvci5hcmNoaXRlY3R1cmUuZHVhbHNvbWEiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuc2ltdWxhdG9yLmFyY2hpdGVjdHVyZS5zaW5nbGVjZWxsIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvci5hcmNoaXRlY3R1cmUuc2luZ2xlc29tYSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5zaW11bGF0b3IucHJvZmlsZS5kZWZhdWx0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnNwdXRpbWluZyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5zcHV0aW1pbmcudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwudXRpbHMiLz4KLQkJPC9hbnRjYWxsPgotCQktLT4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkc2l0ZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9idWlsZHNpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDIxM2E1Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL3B0cC9yZWxlYXNlcy8yLjEiPgotCQlQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSB1cGRhdGUgc2l0ZSAtIFJlbGVhc2UgMi4xCi0JPC9kZXNjcmlwdGlvbj4KLQk8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cF9AYnVpbGRWZXJzaW9uQC5qYXIiIGlkPSJvcmcuZWNsaXBzZS5wdHAiIHZlcnNpb249IkBidWlsZFZlcnNpb25AIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDIuMSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5jb3JlX0BidWlsZFZlcnNpb25ALmphciIgaWQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAudXRpbHNfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHNfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsX0BidWlsZFZlcnNpb25ALmphciIgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwiIHZlcnNpb249IkBidWlsZFZlcnNpb25AIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDIuMSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGVfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZSIgdmVyc2lvbj0iQGJ1aWxkVmVyc2lvbkAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMi4xIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29sc19AYnVpbGRWZXJzaW9uQC5qYXIiIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZV9AYnVpbGRWZXJzaW9uQC5qYXIiIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZSIgdmVyc2lvbj0iQGJ1aWxkVmVyc2lvbkAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMi4xIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbV9AYnVpbGRWZXJzaW9uQC5qYXIiIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWxfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLmV4dGVybmFsIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlX0BidWlsZFZlcnNpb25ALmphciIgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUiIHZlcnNpb249IkBidWlsZFZlcnNpb25AIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDIuMSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDJfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMiIgdmVyc2lvbj0iQGJ1aWxkVmVyc2lvbkAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMi4xIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGlfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkiIHZlcnNpb249IkBidWlsZFZlcnNpb25AIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDIuMSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wbGR0X0BidWlsZFZlcnNpb25ALmphciIgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0IiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpX0BidWlsZFZlcnNpb25ALmphciIgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkiIHZlcnNpb249IkBidWlsZFZlcnNpb25AIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDIuMSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wZXJmX0BidWlsZFZlcnNpb25ALmphciIgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wZXJmIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXVfQGJ1aWxkVmVyc2lvbkAuamFyIiBpZD0ib3JnLmVjbGlwc2UucHRwLnBlcmYudGF1IiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAyLjEiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuY2VsbF9AYnVpbGRWZXJzaW9uQC5qYXIiIGlkPSJvcmcuZWNsaXBzZS5wdHAuY2VsbCIgdmVyc2lvbj0iQGJ1aWxkVmVyc2lvbkAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMi4xIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZHRfQGJ1aWxkVmVyc2lvbkAuamFyIiB2ZXJzaW9uPSJAYnVpbGRWZXJzaW9uQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgRGV2ZWxvcG1lbnQgVG9vbHMiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZHQueGxjIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZHQueGxjX0BidWlsZFZlcnNpb25ALmphciIgdmVyc2lvbj0iQGJ1aWxkVmVyc2lvbkAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUmVtb3RlIERldmVsb3BtZW50IFRvb2xzIi8+Ci0JPC9mZWF0dXJlPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMi4xIiBsYWJlbD0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMi4xIi8+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJSZW1vdGUgRGV2ZWxvcG1lbnQgVG9vbHMiIGxhYmVsPSJSZW1vdGUgRGV2ZWxvcG1lbnQgVG9vbHMiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcHRwLm1hcCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcHRwLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhOTliOC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXBzL3B0cC5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotISBUaGUgbWFzdGVyCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5tYXN0ZXI9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFzdGVyCi0KLSEgUFRQIGZlYXR1cmVzCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucmVtb3RlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2U9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlCi0KLSEgUExEVCBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGxkdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZQotCi0hIFBURiBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGVyZj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wZXJmLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmZvcnRyYW49QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuZm9ydHJhbi1mZWF0dXJlCi0KLSEgUkRUIGZlYXR1cmVzCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZHQ9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmR0LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJkdC54bGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmR0LnhsYy1mZWF0dXJlCi0KLSEgQ2VsbCBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuY2VsbD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC1mZWF0dXJlCi0KLSEgUFRQIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHA9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHA9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnByb3h5PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudXRpbHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAubGF1bmNoPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5sYXVuY2gKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuaGVscD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvZG9jL29yZy5lY2xpcHNlLnB0cC5oZWxwCi0KLSEgUmVtb3RlIFRvb2xzIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Q9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlcj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzCi0KLSEgUExEVCBQbHVnaW5zCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24KLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMKLQotISBQVEYgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5qYXJzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5qYXJzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3Q9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3QKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGVyZmRtZj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGVyZmRtZgotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnNlbGluc3Rmb3J0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Zm9ydAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzCi0KLSEgUkRUIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJkdC5kb2MudXNlcj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuZG9jLnVzZXIKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LnhsYz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQueGxjCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJkdC5tYW5hZ2VkYnVpbGRlci54bGMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZHQubWFrZS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFrZS51aQotCi0hIENlbGwgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuYWxmLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmFsZi51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLmRlYnVnLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZGVidWcuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLmRlYnVnLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmRlYnVnLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuZGVidWcuYmUuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5kZWJ1Zy5iZS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuZGVidWcuYmUudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZGVidWcuYmUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5lbnZpcm9ubWVudC5jZWxsc2ltdWxhdG9yPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmVudmlyb25tZW50LmNlbGxzaW11bGF0b3IKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5lbnZpcm9ubWVudC5sYXVuY2hlci5jZWxsYmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZW52aXJvbm1lbnQubGF1bmNoZXIuY2VsbGJlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuZW52aXJvbm1lbnQubGF1bmNoZXIucGR0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmVudmlyb25tZW50LmxhdW5jaGVyLnBkdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLmVudmlyb25tZW50LnJlbW90ZXNpbXVsYXRvcj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5lbnZpcm9ubWVudC5yZW1vdGVzaW11bGF0b3IKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5lbnZpcm9ubWVudC51aS5kZXBsb3k9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZW52aXJvbm1lbnQudWkuZGVwbG95Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuZXhhbXBsZXMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuZXhhbXBsZXMudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5oZWxwPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLmhlbHAKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5tYWtlLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFrZS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIuZ251LmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIuZ251LmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci5nbnUudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIuZ251LnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwubWFuYWdlZGJ1aWxkZXIudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci54bC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLm1hbmFnZWRidWlsZGVyLnhsLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci54bC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5tYW5hZ2VkYnVpbGRlci54bC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnBkdC54bWw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwucGR0LnhtbAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnByZWZlcmVuY2VzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnByZWZlcmVuY2VzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuc2ltdWxhdG9yPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvcgotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvci5hcmNoaXRlY3R1cmUuZHVhbGNlbGw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuc2ltdWxhdG9yLmFyY2hpdGVjdHVyZS5kdWFsY2VsbAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvci5hcmNoaXRlY3R1cmUuZHVhbHNvbWE9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuc2ltdWxhdG9yLmFyY2hpdGVjdHVyZS5kdWFsc29tYQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnNpbXVsYXRvci5hcmNoaXRlY3R1cmUuc2luZ2xlY2VsbD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5zaW11bGF0b3IuYXJjaGl0ZWN0dXJlLnNpbmdsZWNlbGwKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC5zaW11bGF0b3IuYXJjaGl0ZWN0dXJlLnNpbmdsZXNvbWE9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL2NlbGwvb3JnLmVjbGlwc2UucHRwLmNlbGwuc2ltdWxhdG9yLmFyY2hpdGVjdHVyZS5zaW5nbGVzb21hCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuc2ltdWxhdG9yLnByb2ZpbGUuZGVmYXVsdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5zaW11bGF0b3IucHJvZmlsZS5kZWZhdWx0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLmNlbGwuc3B1dGltaW5nPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnNwdXRpbWluZwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnNwdXRpbWluZy51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC5zcHV0aW1pbmcudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuY2VsbC51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvY2VsbC9vcmcuZWNsaXBzZS5wdHAuY2VsbC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jZWxsLnV0aWxzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9jZWxsL29yZy5lY2xpcHNlLnB0cC5jZWxsLnV0aWxzCi0KLSEgRnJhZ21lbnRzCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAuYWl4LnBwYz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5haXgucHBjCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubGludXgucHBjPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYwotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYKLWZyYWdtZW50QG9yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQ9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0Ci1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Nj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2Ci1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAucGVyZi5wYXJhbGxlbD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi5wYXJhbGxlbAotCi0hIFRlc3RzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGl0ZXN0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpdGVzdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cwotCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXN0ZXIvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhiYmVmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBhcmFtZXRlcnMgZGVzY3JpYmluZyBob3cgYW5kIHdoZXJlIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkLgotIyBUeXBpY2FsIHVzZXJzIG5lZWQgb25seSB1cGRhdGUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotIyAgICBiYXNlTG9jYXRpb24gLSB3aGVyZSB0aGluZ3MgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGFyZSBpbnN0YWxsZWQKLSMgICAgYm9vdGNsYXNzcGF0aCAtIFRoZSBiYXNlIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0ICh0eXBpY2FseSBydC5qYXIpCi0jICAgIGNvbmZpZ3MgLSB0aGUgbGlzdCBvZiB7b3MsIHdzLCBhcmNofSBjb25maWd1cmF0aW9ucyB0byBidWlsZC4gIAotIwotIyBPZiBjb3Vyc2UgYW55IG9mIHRoZSBzZXR0aW5ncyBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNwZWMnaW5nIAotIyB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgKGUuZy4sIC1EYmFzZUxvY2F0aW9uPWQ6L2VjbGlwc2UKLQotIyMjIyMjIyMjIyMjIyBDVlMgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBDVlMgdGFnIHRvIHVzZSB3aGVuIGZldGNoaW5nIHRoZSBtYXAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeQotbWFwVmVyc2lvblRhZz1wdHBfMl8xCi0KLSMgVGhlIENWUyB0YWcgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZWxlbWVudHMgdG8gYnVpbGQuICBCeSBkZWZhdWx0IHRoZQotIyBidWlsZGVyIHdpbGwgdXNlIHdoYXRldmVyIGlzIGluIHRoZSBtYXBzLiAgVXNlIHRoaXMgdmFsdWUgdG8gb3ZlcnJpZGUKLSMgZm9yIGV4YW1wbGUsIHdoZW4gZG9pbmcgYSBuaWdodGx5IGJ1aWxkIG91dCBvZiBIRUFECi0jIGZldGNoVGFnPUhFQUQKLQotcHRwVGFnPXB0cF8yXzEKLQotIyMjIyMjIyMjIyMjIyMgQlVJTEQgLyBHRU5FUkFUSU9OIENPTlRST0wgIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGJ1aWxkIGVsZW1lbnRzIHdpbGwgYmUgZmV0Y2hlZCBhbmQgd2hlcmUKLSMgdGhlIGJ1aWxkIHdpbGwgdGFrZSBwbGFjZS4gIGJ1aWxkRGlyZWN0b3J5IGFuZCBpbnN0YWxsIHNob3VsZCBiZSB0aGUgc2FtZQotIyB2YWx1ZS4KLWJ1aWxkRGlyZWN0b3J5PWJ1aWxkCi0KLSMgVHlwZSBvZiBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuICBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBpcwotIyBvbmUgb2YgSSwgTiwgTSwgUywgLi4uCi1idWlsZFR5cGU9SQotCi0jIElEIG9mIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuCi1idWlsZElkPVRlc3RCdWlsZAotCi0jIExhYmVsIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci1idWlsZExhYmVsPSR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ci0KLSMgVGltZXN0YW1wIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci10aW1lc3RhbXA9MDA3Ci0KLSMgQmFzZSBsb2NhdGlvbiBmb3IgYW55dGhpbmcgdGhlIGJ1aWxkIG5lZWRzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIEZvciBleGFtcGxlLAotIyB3aGVuIGJ1aWxkaW5nIEdFRiwgdGhlIGJhc2VMb2NhdGlvbiBzaG91bGQgYmUgdGhlIGxvY2F0aW9uIG9mIGEgcHJldmlvdXNseQotIyBpbnN0YWxsZWQgRWNsaXBzZSBhZ2FpbnN0IHdoaWNoIHRoZSBHRUYgY29kZSB3aWxsIGJlIGNvbXBpbGVkLgotYmFzZUxvY2F0aW9uPQotCi0jT3MvV3MvQXJjaC9ubCBvZiB0aGUgZWNsaXBzZSBzcGVjaWZpZWQgYnkgYmFzZUxvY2F0aW9uCi0jYmFzZW9zCi0jYmFzZXdzCi0jYmFzZWFyY2gKLSNiYXNlbmwKLQotIyBUaGUgbG9jYXRpb24gdW5kZXJ3aGljaCBhbGwgb2YgdGhlIGJ1aWxkIG91dHB1dCB3aWxsIGJlIGNvbGxlY3RlZC4gIFRoaXMgd2lsbCBiZQotIyB0aGUgcm9vdCBwYXRoIGluIHRoZSByZXN1bHRhbnQgemlwIGZpbGUuCi1jb2xsUGxhY2U9ZWNsaXBzZQotCi0jIFRoZSBkaXJlY3RvcnkgIGluIHdoaWNoIHRvIGV4ZWN1dGUgemlwIG9mIHRoZSAke2NvbGxQbGFjZX0gZGlyZWN0b3J5Ci1jb2xsQmFzZT0uCi0KLSMgVGhlIGxpc3Qgb2Yge29zLCB3cywgYXJjaH0gY29uZmlndXJhdGlvbnMgdG8gYnVpbGQuICBUaGlzIAotIyB2YWx1ZSBpcyBhICcmJyBzZXBhcmF0ZWQgbGlzdCBvZiAnLCcgc2VwYXJhdGUgdHJpcGxlcy4gIEZvciBleGFtcGxlLCAKLSMgICAgIGNvbmZpZ3M9d2luMzIsd2luMzIseDg2ICYgbGludXgsbW90aWYseDg2Ci0jIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzICosKiwqCi1jb25maWdzPSBcCi0JICBhaXgsbW90aWYscHBjIFwKLSAgICAmIGxpbnV4LGd0ayx4ODYgXAotICAgICYgbGludXgsZ3RrLHg4Nl82NCBcCi0gICAgJiBsaW51eCxndGsscHBjIFwKLSAgICAmIG1hY29zeCxjYXJib24scHBjIFwKLSAgICAmIHdpbjMyLHdpbjMyLHg4NgotCi1vdXRwdXRVcGRhdGVKYXJzPXRydWUKLWdyb3VwQ29uZmlndXJhdGlvbnM9dHJ1ZQotCi0jQXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIHppcCBleGVjdXRhYmxlCi16aXBhcmdzPQotCi0jIyMjIyMjIyMjIyMjIEpBVkEgQ09NUElMRVIgT1BUSU9OUyAjIyMjIyMjIyMjIyMjIwotIyBUaGUgbG9jYXRpb24gb2YgdGhlIEphdmEgamFycyB0byBjb21waWxlIGFnYWluc3QuICBUeXBpY2FsbHkgdGhlIHJ0LmphciBmb3IgeW91ciBKREsvSlJFCi0jYm9vdGNsYXNzcGF0aD1kOi9pYm0xLjMuMS9qcmUvbGliL3J0LmphcgotCi1qYXZhY0RlYnVnSW5mbz1vbgotamF2YWNWZXJib3NlPXRydWUKLWphdmFjRmFpbE9uRXJyb3I9ZmFsc2UKLQotIyBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUKLWphdmFjU291cmNlPTEuNQotCi0jIFRoZSB2ZXJzaW9uIG9mIHRoZSBieXRlIGNvZGUgdGFyZ2V0ZWQKLWphdmFjVGFyZ2V0PTEuNQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvbWFzdGVyL2N1c3RvbVRhcmdldHMueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvbWFzdGVyL2N1c3RvbVRhcmdldHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTdkYTZhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9jdXN0b21UYXJnZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiID4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFJ1biBhIGdpdmVuICR7dGFyZ2V0fSBvbiBhbGwgZWxlbWVudHMgYmVpbmcgYnVpbHQgLS0+Ci08IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50cyI+Ci0JPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImZlYXR1cmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwLm1hc3RlciIvPgotCTwvYW50PgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUYXJnZXRzIHRvIGFzc2VtYmxlIHRoZSBidWlsdCBlbGVtZW50cyBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9ucyAgLS0+Ci08IS0tIFRoZXNlIGdlbmVyYWxseSBjYWxsIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibGUgc2NyaXB0cyAobmFtZWQgaW4gLS0+Ci08IS0tICR7YXNzZW1ibGVTY3JpcHROYW1lfSkgYnV0IG1heSBhbHNvIGFkZCBwcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyAtLT4KLTwhLS0gQWRkIG9uZSB0YXJnZXQgZm9yIGVhY2ggcm9vdCBlbGVtZW50IGFuZCBlYWNoIGNvbmZpZ3VyYXRpb24gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5wdHAubWFzdGVyLmdyb3VwLmdyb3VwLmdyb3VwIj4KLQk8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhcmNoaXZlTmFtZSIgdmFsdWU9InB0cC1tYXN0ZXItJHticmFuY2hWZXJzaW9ufS0ke2J1aWxkSWR9LnppcCIvPgotCTwvYW50PgotPC90YXJnZXQ+Ci0JCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ2hlY2sgb3V0IG1hcCBmaWxlcyBmcm9tIGNvcnJlY3QgcmVwb3NpdG9yeSAtLT4KLTwhLS0gUmVwbGFjZSB2YWx1ZXMgZm9yIGN2c1Jvb3QsIHBhY2thZ2UgYW5kIG1hcFZlcnNpb25UYWcgYXMgZGVzaXJlZC4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0iZ2V0TWFwRmlsZXMiPgotCTxjb3B5IGZpbGU9IiR7YnVpbGRlcn0vLi4vbWFwcy9wdHAubWFwIiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIvPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMvcHRwLm1hcCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAcHRwVGFnQCIgdmFsdWU9IiR7cHRwVGFnfSIvPgotCTwvcmVwbGFjZT4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHNldHVwIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InByZVNldHVwIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgc2V0dXAgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgYnVpbGQgcHJvcGVyIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RTZXR1cCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlRmV0Y2giPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icG9zdEZldGNoIj4KLQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwYXRjaGVzQXZhaWxhYmxlIj4KLQkJPGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkZXJ9L3BhdGNoLnhtbCIvPgotCTwvY29uZGl0aW9uPgotCTxhbnRjYWxsIHRhcmdldD0iYXBwbHlQYXRjaGVzIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJhcHBseVBhdGNoZXMiIGlmPSJwYXRjaGVzQXZhaWxhYmxlIj4KLQk8YW50IGFudGZpbGU9IiR7YnVpbGRlcn0vcGF0Y2gueG1sIi8+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwcmVHZW5lcmF0ZSI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RHZW5lcmF0ZSI+Ci08L3RhcmdldD4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlUHJvY2VzcyI+Ci0JPHJlcGxhY2UgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIiB2YWx1ZT0iJHt0aW1lc3RhbXB9IiB0b2tlbj0iQGJ1aWxkQCI+Ci0JCTxpbmNsdWRlIG5hbWU9IioqL2Fib3V0Lm1hcHBpbmdzIiAvPgotCTwvcmVwbGFjZT4KLQk8IS0tCi0JPHVuemlwIHNyYz0iJHt0YXVKYXJzfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuamFycyIvPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke2JyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke2JyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke2JyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke2JyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjL0JVSUxEIj4KLQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBidWlsZFZlcnNpb25AIiB2YWx1ZT0iJHticmFuY2hWZXJzaW9ufS4ke3RpbWVzdGFtcH0iLz4KLQk8L3JlcGxhY2U+Ci0JPHJlcGxhY2UgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Ni9CVUlMRCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAYnVpbGRWZXJzaW9uQCIgdmFsdWU9IiR7YnJhbmNoVmVyc2lvbn0uJHt0aW1lc3RhbXB9Ii8+Ci0JPC9yZXBsYWNlPgotCS0tPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RQcm9jZXNzIj4KLTwvdGFyZ2V0PgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlQXNzZW1ibGUiPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icG9zdEFzc2VtYmxlIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIGJ1aWxkIGlzIGRvbmUuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RCdWlsZCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIHRvIHRlc3QgdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0idGVzdCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIHRvIHB1Ymxpc2ggdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHVibGlzaCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCTxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiIC8+Ci08L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGFjay5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGFjay5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2I1YTVlLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3BhY2sucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBhY2syMDAuZGVmYXVsdC5hcmdzPS1FNApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcHRwYnVpbGQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9wdHBidWlsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5OTA5Mi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9wdHBidWlsZAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBwdHBidWlsZCB3cmFwcGVyIHNjcmlwdAotIwotIyBVc2FnZTogcHRwYnVpbGQgWy10IHRhZ10gWy1kIGJ1aWxkX2Rpcl0gW2J1aWxkX2FyZ3NdCi0jCi0jIHdoZXJlCi0jCi0jIHRhZyBpcyB0aGUgQ1ZTIHRhZyB1c2VkIHRvIGNoZWNrIG91dCB0aGUgcmVsZW5nIHByb2plY3QgKGRlZmF1bHQgSEVBRCkKLSMgYnVpbGRfZGlyIGlzIHRoZSBsb2NhdGlvbiB0aGF0IHRoZSBidWlsZCB3aWxsIHRha2UgcGxhY2UKLSMgYnVpbGRfYXJncyBhcmUgYW55IGFyZ3VtZW50cyB5b3Ugd2FudCB0byBwYXNzIHRvIHRoZSBidWlsZCBzY3JpcHQKLSMKLSMgc2V0IHVwIGFueXRoaW5nIGVudmlyb25tZW50IHNwZWNpZmljIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUKLSMgbGF1bmNoaW5nIHRoZSBidWlsZCBzY3JpcHQgaW4gdGhlIHJlbGVuZyBwcm9qZWN0Ci0KLVRBRz1IRUFECi1DRFRfVEFHPUhFQUQKLQotIyBtYWluIHN0YWdpbmcgZGlyZWN0b3J5Ci1CVUlMRF9ESVI9L29wdC9wdWJsaWMvZG93bmxvYWQtc3RhZ2luZy5wcml2L3Rvb2xzL3B0cC9yZWxlbmcKLQotYXJncz1gZ2V0b3B0IGQ6dDogJCpgCi0KLWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JZWNobyAidXNhZ2U6IHB0cGJ1aWxkIFstdCB0YWddIFstYyBjZHRfdGFnXSBbLWQgYnVpbGRfZGlyXSBbYnVpbGRfYXJnc10iCi0JZXhpdCAxCi1maQotCi1zZXQgLS0gJGFyZ3MKLWZvciBpCi1kbwotCWNhc2UgIiRpIgotCWluCi0JLWMpIENEVF9UQUc9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKLQktZCkgQlVJTERfRElSPSIkMiI7IHNoaWZ0OyBzaGlmdDs7Ci0JLXQpIFRBRz0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotCS0tKSBzaGlmdDsgYnJlYWs7OwotCWVzYWMKLWRvbmUKLQotQlVJTERfTE9HPSRCVUlMRF9ESVIvcHRwYnVpbGRfJHtUQUd9X2BkYXRlICslWSVtJWQlSCVNYC5sb2cKLQotewotIyBjcmVhdGUgdGhlIHJlbGVuZyBzdGFnaW5nIGRpcmVjdG9yeSBhbmQgZ28gdGhlcmUKLW1rZGlyIC1wICRCVUlMRF9ESVIgJiYgY2QgJEJVSUxEX0RJUgotCi0jIHJlbW92ZSB0aGUgb2xkIGJ1aWxkCi1ybSAtZnIgb3JnLmVjbGlwc2UucHRwCi0KLSMgQ2hlY2sgb3V0IHRoZSByZWxlbmcgcHJvamVjdAotZXhwb3J0IENWU1JPT1Q9OnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scwotY3ZzIGNvIC1yICRUQUcgLWQgb3JnLmVjbGlwc2UucHRwIG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZwotCi0jIHJ1biB0aGUgbWFpbiBzY3JpcHQKLWNkIG9yZy5lY2xpcHNlLnB0cAotc2ggYnVpbGQuc2ggJCoKLQotIyBCdWlsZCBSRFQgc2VydmVyIHBhY2thZ2VzCi1jZCByZXN1bHRzL3BsdWdpbnMKLQotIyBDaGVjayBvdXQgcmR0LmNvcmUucmVtb3RlamFycywgcmR0LmNvcmUuc3R1YnMsIGNkdC5jb3JlLCBjZHQuY29yZS5scnBhcnNlciwgY2R0LmNvcmUubHJwYXJzZXIueGxjIGZvciBzb3VyY2UKLWV4cG9ydCBDVlNST09UPTpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMKLWN2cyBjbyAtciAkVEFHIC1kIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzIG9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMKLWN2cyBjbyAtciAkVEFHIC1kIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zdHVicyBvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zdHVicwotY3ZzIGNvIC1yICRDRFRfVEFHIC1kIG9yZy5lY2xpcHNlLmNkdC5jb3JlIG9yZy5lY2xpcHNlLmNkdC9hbGwvb3JnLmVjbGlwc2UuY2R0LmNvcmUKLWN2cyBjbyAtciAkQ0RUX1RBRyAtZCBvcmcuZWNsaXBzZS5jZHQuY29yZS5scnBhcnNlciBvcmcuZWNsaXBzZS5jZHQvbHJwYXJzZXIvb3JnLmVjbGlwc2UuY2R0LmNvcmUubHJwYXJzZXIKLWN2cyBjbyAtciAkQ0RUX1RBRyAtZCBvcmcuZWNsaXBzZS5jZHQuY29yZS5scnBhcnNlci54bGMgb3JnLmVjbGlwc2UuY2R0L3hsYy9vcmcuZWNsaXBzZS5jZHQuY29yZS5scnBhcnNlci54bGMKLQotY2Qgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMKLQotIyBydW4gdGhlIHNjcmlwdCBpbiByZW1vdGVqYXJzCi1leHBvcnQgUEFUSD0vb3B0L3B1YmxpYy9jb21tb24vaWJtLWphdmEyLXBwYy01MC9iaW46JFBBVEgKLWVjaG8gYGphdmEgLXZlcnNpb25gCi1qYXZhIC1qYXIgLi4vLi4vLi4vdG9vbHMvb3JnLmVjbGlwc2UucmVsZW5nLmJhc2VidWlsZGVyL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5qYXIgXAotCS13cyBndGsgLWFyY2ggcHBjIC1vcyBsaW51eCAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyCi0KLX0gPiRCVUlMRF9MT0cgMj4mMQotCi1pZiBncmVwIC1xICdCVUlMRCBGQUlMRUQnICRCVUlMRF9MT0c7IHRoZW4KLQllY2hvICJCVUlMRCBGQUlMRUQuIFNlZSAkQlVJTERfTE9HIGZvciBkZXRhaWxzLiIKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvdXBkYXRlX3ZlcnNpb25zIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvdXBkYXRlX3ZlcnNpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGIyZGFkLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3VwZGF0ZV92ZXJzaW9ucworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBzY3JpcHQgdG8gdXBkYXRlIFBUUCB2ZXJzaW9ucwotIwotIyBVc2FnZTogdXBkYXRlX3ZlcnNpb25zIHZlcnNpb24KLSMKLSMgdmVyc2lvbiAtIG5ldyB2ZXJzaW9uIHN0cmluZyAoZS5nLiAiMi4xLjQiKQotIwotIyBOb3RlOiBhICJxdWFsaWZpZXIiIHN1ZmZpeCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gdGhlIHZlcnNpb24gd2hlcmUgYXBwcm9wcmlhdGUKLSMKLQotVE1QX0RJUj0vdG1wCi0KLWlmIFsgJCMgLWx0IDEgXTsgdGhlbgotCWVjaG8gInVzYWdlOiB1cGRhdGVfdmVyc2lvbnMgdmVyc2lvbiIKLQlleGl0IDEKLWZpCi0KLXZlcnNpb249JDEKLQotRkVBVFVSRVM9IlwKLQlvcmcuZWNsaXBzZS5wdHAtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLmNlbGwtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5tYXN0ZXIgXAotCW9yZy5lY2xpcHNlLnB0cC5wZXJmLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuZm9ydHJhbi1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5yZHQtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJlbW90ZS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlIgotCQotUExVR0lOUz0iXAotCW9yZy5lY2xpcHNlLnB0cC5haXgucHBjIFwKLQlvcmcuZWNsaXBzZS5wdHAubGludXgucHBjIFwKLQlvcmcuZWNsaXBzZS5wdHAubGludXgueDg2IFwKLQlvcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0IFwKLQlvcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYyBcCi0Jb3JnLmVjbGlwc2UucHRwLm1hY29zeC54ODYgXAotCW9yZy5lY2xpcHNlLnB0cCIKLQkKLUNfUFJPSkVDVFM9IlwKLQlvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIFwKLQlvcmcuZWNsaXBzZS5wdHAucHJveHkgXAotCW9yZy5lY2xpcHNlLnB0cC51dGlscyIKLQkKLXVwZGF0ZV9mZWF0dXJlKCkgewotCXNlZCAtZSAicy92ZXJzaW9uPVwiWzAtOV1cLlswLTldXC5bMC05XVwucXVhbGlmaWVyXCIvdmVyc2lvbj1cIiQyXC5xdWFsaWZpZXJcIi8iIDwgJDEvZmVhdHVyZS54bWwgPiAkVE1QX0RJUi8kezF9X2ZlYXR1cmUueG1sCi0JbXYgJFRNUF9ESVIvJHsxfV9mZWF0dXJlLnhtbCAkMS9mZWF0dXJlLnhtbAotfQotCi11cGRhdGVfbWFuaWZlc3QoKSB7Ci0Jc2VkIC1lICJzL0J1bmRsZS1WZXJzaW9uOiAqWzAtOV1cLlswLTldXC5bMC05XVwucXVhbGlmaWVyL0J1bmRsZS1WZXJzaW9uOiAkMi5xdWFsaWZpZXIvIiA8ICQxL01FVEEtSU5GL01BTklGRVNULk1GID4gJFRNUF9ESVIvJHsxfV9NQU5JRkVTVC5NRgotCW12ICRUTVBfRElSLyR7MX1fTUFOSUZFU1QuTUYgJDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKLX0KLQotdXBkYXRlX2NvbmZpZ3VyZSgpIHsKLQlzZWQgLWUgInMvQUNfSU5JVChcKFteLF0qXCksICpbMC05XVwuWzAtOV1cLlswLTldKS9BQ19JTklUKFwxLCAkMikvIiA8ICQxL2NvbmZpZ3VyZS5pbiA+ICRUTVBfRElSLyR7MX1fY29uZmlndXJlLmluCi0JbXYgJFRNUF9ESVIvJHsxfV9jb25maWd1cmUuaW4gJDEvY29uZmlndXJlLmluCi0JKGNkICQxOyBhdXRvY29uZikKLX0KLQotZm9yIGZlYXR1cmUgaW4gJEZFQVRVUkVTOyBkbwotCWVjaG8gIlVwZGF0aW5nICRmZWF0dXJlLi4uIgotCXVwZGF0ZV9mZWF0dXJlICRmZWF0dXJlICR2ZXJzaW9uCi1kb25lCi0KLWZvciBwbHVnaW4gaW4gJFBMVUdJTlM7IGRvCi0JZWNobyAiVXBkYXRpbmcgJHBsdWdpbi4uLiIKLQl1cGRhdGVfbWFuaWZlc3QgJHBsdWdpbiAkdmVyc2lvbgotZG9uZQotCi1mb3IgcHJvamVjdCBpbiAkQ19QUk9KRUNUUzsgZG8KLQllY2hvICJVcGRhdGluZyAkcHJvamVjdC4uLiIKLQl1cGRhdGVfbWFuaWZlc3QgJHByb2plY3QgJHZlcnNpb24KLQl1cGRhdGVfY29uZmlndXJlICRwcm9qZWN0ICR2ZXJzaW9uCi1kb25lCi0KLWVjaG8gIlVwZGF0aW5nIG9yZy5lY2xpcHNlLnB0cC5yZWxlbmcuLi4iCi1zZWQgLWUgInMvPHByb3BlcnR5IG5hbWU9XCJicmFuY2hWZXJzaW9uXCIgdmFsdWU9XCJbMC05XVwuWzAtOV1cLlswLTldXCJcLz4vPHByb3BlcnR5IG5hbWU9XCJicmFuY2hWZXJzaW9uXCIgdmFsdWU9XCIkdmVyc2lvblwiXC8+LyIgPCBvcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnhtbCA+ICRUTVBfRElSL29yZy5lY2xpcHNlLnB0cC5yZWxlbmdfYnVpbGQueG1sCi1tdiAkVE1QX0RJUi9vcmcuZWNsaXBzZS5wdHAucmVsZW5nX2J1aWxkLnhtbCBvcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnhtbAotCi1lY2hvICJVcGRhdGluZyBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlamFycy4uLiIKLXNlZCAtZSAicy88cHJvcGVydHkgbmFtZT1cInB0cFZlcnNpb25cIiB2YWx1ZT1cIlswLTldXC5bMC05XVwuWzAtOV1cIlwvPi88cHJvcGVydHkgbmFtZT1cInB0cFZlcnNpb25cIiB2YWx1ZT1cIiR2ZXJzaW9uXCJcLz4vIiA8IG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzL2J1aWxkLnhtbCA+ICRUTVBfRElSL29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzX2J1aWxkLnhtbAotbXYgJFRNUF9ESVIvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnNfYnVpbGQueG1sIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzL2J1aWxkLnhtbAotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM0NTZhLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY3NGJmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFJlbW90ZSBUb29scyBFbmFibGVyCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249UHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVtb3RlIHNlcnZpY2VzIHVzaW5nIFJlbW90ZSBUb29scwotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJiYzc5Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMuY29yZSIgdmVyc2lvbj0iMi4wLjEiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlIiB2ZXJzaW9uPSIyLjEuOCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUiIHZlcnNpb249IjEuMy4zIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMiIHZlcnNpb249IjEuMy4xIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiIHZlcnNpb249IjIuMC4xIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiB2ZXJzaW9uPSIzLjQuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0YzcxZC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjQ0ODcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QVFAgUmVtb3RlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gUmVtb3RlIFRvb2xzIGNvbXBvbmVudHMKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk2YTA4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scyIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjEuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5qY3JhZnQuanNjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LmxhdW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFlYjdiLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWRmOGYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIwOTkzLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0jIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0jIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0jIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSMgCi0jIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBMQS1DQyAwNC0xMTUKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBCbHVlIEdlbmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIHN1cHBvcnQgZm9yIHRoZSBCbHVlIEdlbmUgc3lzdGVtCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODA2OTU5Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLnByb3h5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDhiYjQ2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTU5MDEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4MTdiNC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBJQk0gTG9hZExldmVsZXIKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIHN1cHBvcnQgZm9yIHRoZSBJQk0gTG9hZExldmVsZXIKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1YzRmNC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjEuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzLzIuMSIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aSIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51dGlscy51aSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5OGIzOS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk1OTAxLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDljZDguLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgdGhlIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudAotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzUwYmQ4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51dGlscyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvLnByb2plY3QgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTU2ZGZmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWRmOGYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI2MjY3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0jIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotIyBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSMgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotIyByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotIyBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0jIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSMgdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0jIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSMgCi0jIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBMQS1DQyAwNC0xMTUKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBMU0YKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIHN1cHBvcnQgZm9yIHRoZSBMU0Ygam9iIHNjaGVkdWxlcgotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzZcblwKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5XG5cCi1vZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXNcblwKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEVcblwKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUlxuXAotQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkXG5cCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLFxuXAotc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLlxuXAotXG5cCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUxBLUNDIDA0LTExNVxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4NTUxZi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmxzZiIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvcHRwIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubHNmLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubHNmLnByb3h5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubHNmLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjQ3NmYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZGY4Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWNkNWIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIE1QSUNIMgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgTVBJQ0gyCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG5cCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNlxuXAotZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHlcblwKLW9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhc1xuXAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRVxuXAotR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SXG5cCi1BU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWRcblwKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsXG5cCi1zbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuXG5cCi1cblwKLUFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotTEEtQ0MgMDQtMTE1XG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4ZmMxLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzdkMGUuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWRmOGYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTA1M2UwLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBTdXBwb3J0IEZvciBPcGVuIE1QSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgT3BlbiBNUEkKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhjNGVkLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4xLjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvMi4xIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg0ZGVkLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlkZjhmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjODg3Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIE9wZW4gTVBJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QWRkcyBzdXBwb3J0IGZvciBPcGVuIE1QSQotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzZcblwKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5XG5cCi1vZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXNcblwKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEVcblwKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUlxuXAotQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkXG5cCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLFxuXAotc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLlxuXAotXG5cCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUxBLUNDIDA0LTExNVxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWIyNTMyLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9ydGUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9ydGUucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZGI4MDIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MDI2MC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViNmJhNy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotIyBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSMgZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0jIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSMgcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSMgR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotIyBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0jIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotIyBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0jIAotIyBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgTEEtQ0MgMDQtMTE1Ci0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QVFAgU2NhbGFibGUgRGVidWcgTWFuYWdlcgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIFNjYWxhYmxlIERlYnVnIE1hbmFnZXIgKFNETSkKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gVXBkYXRlcwotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzZcblwKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5XG5cCi1vZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXNcblwKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEVcblwKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUlxuXAotQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkXG5cCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLFxuXAotc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLlxuXAotXG5cCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUxBLUNDIDA0LTExNVxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwMDcwMS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjEuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzLzIuMSIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIiB2ZXJzaW9uPSIxLjIuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuc2RtLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk1ZDc2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAudXRpbHMtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4ODdkNS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAudXRpbHMtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAudXRpbHMtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAudXRpbHMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDc4NjQuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVBUUCBDb21tb24gVXRpbGl0aWVzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249UGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gY29tcG9uZW50cyB0aGF0IHByb3ZpZGUgY29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIFVwZGF0ZXMKLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YmRjNzIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS40LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzLzIuMSIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC8uY2xhc3NwYXRoIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzJlZTI5Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4NjQ0MS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYmVkMTcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jV2VkIE5vdiAwNyAxMDoxMDoyNSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcm90ZWN0ZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWU1MzQ5Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuNC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL2Fib3V0Lmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2M2OTMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvYWJvdXQuaW5pIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNjc2MmEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvYWJvdXQubWFwcGluZ3MgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9hYm91dC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjY3MmE0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QYXJhbGxlbCBUb29scyBQbGF0Zm9ybSBFbmQtVXNlciBSdW50aW1lXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDFlMDMwLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmkKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvZWNsaXBzZTMyLnBuZyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlOWQ5NS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE5MU19NRVNTQUdFRk9STUFUX05PTkUKLSMgTkxTX0VOQ09ESU5HPVVURi04Ci0KLXBsdWdpbk5hbWUgPSBQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSBFbmQtVXNlciBSdW50aW1lCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvc3JjL3JlYWRtZS50eHQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwL3NyYy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBiNWY4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAvc3JjL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMgcHJlc2VudCBvbmx5IGZvciBidWlsZCBwdXJwb3Nlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvLmNsYXNzcGF0aCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLy5vcHRpb25zIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjE0MzgxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgVHJhY2luZwotb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFRyYWNlIGpvYnMgdGhhdCBleGVjdXRlIHJlbW90ZSBjb21tYW5kcyAoZGlzY292ZXIsIG1vbml0b3IsIGV0YykKLW9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL2NvbW1hbmQ9dHJ1ZQotCi0jIFRyYWNlIG1vcmUgZGV0YWlscyBhYm91dCBqb2JzIHRoYXQgZXhlY3V0ZSByZW1vdGUgY29tbWFuZHMgKGRpc2NvdmVyLCBtb25pdG9yLCBldGMpCi1vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9jb21tYW5kL21vcmU9dHJ1ZQotCi0jIFRyYWNlIGpvYiBzdWJtaXNzaW9uIG9uIHRoZSBSdW50aW1lIFN5c3RlbQotb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvZGVidWcvam9iPXRydWUKLQotIyBUcmFjZSBzdGF0dXMgb2YgdGhlIFJ1bnRpbWUgU3lzdGVtCi1vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9ydHM9dHJ1ZQotCi0jIFRyYWNlIGRpc2NvdmVyIHByb2NlZHVyZSBvbiB0aGUgUnVudGltZSBTeXN0ZW0gCi1vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9ydHMvZGlzY292ZXI9dHJ1ZQotCi0jIFRyYWNlIG1vbml0b3IgcHJvY2VkdXJlIG9uIHRoZSBSdW50aW1lIFN5c3RlbSAKLW9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL3J0cy9tb25pdG9yPXRydWUKLQotIyBUcmFjZSBzdGF0dXMgb2YgSVBKb2JzIG9uIHRoZSBSdW50aW1lIFN5c3RlbQotb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvZGVidWcvcnRzL2pvYj10cnVlCi0KLSMgVHJhY2UgbW9yZSBkZXRhaWxzIG9mIElQSm9icyBvbiB0aGUgUnVudGltZSBTeXN0ZW0KLW9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL3J0cy9qb2IvbW9yZT10cnVlCi0KLSMgUmVkaXJlY3Qgb3V0cHV0IG9mIHBhcmFsbGVsIGFwcGxpY2F0aW9uIHRvIHRlcm1pbmFsIHRoYXQgaXMgcnVubmluZyBlY2xpcHNlIAotb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvZGVidWcvcnRzL2pvYi9vdXRwdXQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLy5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ2NDgxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFlMzU0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jTW9uIE9jdCAwNiAxNDozNjo0NCBHTVQtMDM6MDAgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFjZTg1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0uY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlRvb2xzUk1QbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0sCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLm1lc3NhZ2VzLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9hYm91dC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9hYm91dC5pbmkgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY3NjJhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9hYm91dC5tYXBwaW5ncyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2Fib3V0LnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyNzJhZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QYXJhbGxlbCBUb29scyBQbGF0Zm9ybSBSZW1vdGUgU2VydmljZXNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wdHBcbgotCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU1MzFkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2VjbGlwc2UzMi5wbmcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyYmY0Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFJlc291cmNlIE1hbmFnZXIgQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvQWJzdHJhY3RUb29sc0F0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvQWJzdHJhY3RUb29sc0F0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmMzAxMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL0Fic3RyYWN0VG9vbHNBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUb29sc0F0dHJpYnV0ZXMgewotCi0JLyoKLQkgKiBJIGhhdmUgZGlzYWJsZWQgZ2V0TGF1bmNoQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbiBzaW5jZQotCSAqIHRoZSBsYXVuY2ggY29tbWFuZCB3aWxsIGNvbnRhaW4gYWxsIGFyZ3VtZW50cyBhbmQgYSB2YXJpYWJsZSBzdWJzdGl0dXRpb24KLQkgKiB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBwcm9ncmFtIGV4ZWN1dGFibGUgcGF0aC4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW10ge307Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZWE0MjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmU7Ci0KLS8qKgotICogRGVmaW5lcyBjb25zdGFudHMgdXNlZCB0byBzdG9yZSBwcmVmZXJlbmNlcyBmb3IgYSB0b29sLiBUaGlzIHByZWZlcmVuY2UKLSAqIG1hbmFnZXIgb25seSBkZWZpbmVzIGNvbnN0YW50cy4gSXQgZG9lcyBub3QgcHJvdmlkZSBzdGF0aWMgbWV0aG9kcyB0bwotICogcmVhZC93cml0ZS9pbml0aWFsaXplIHByZWZlcmVuY2VzLCBhcyB1c2VkIGJ5IHRoZSBQVFAgcGx1Z2lucy4gVGhlCi0gKiByZWFkL3dyaXRlL2luaXRpYWxpemUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGFzIHN0YXRpYyBtZXRob2RzIGluCi0gKiBjbGFzc2VzIGV4dGVuZGluZyB0aGlzIHJlc291cmNlIG1hbmFnZXIsIHNpbmNlIG9ubHkgdGhlIGV4dGVuZGluZyBjbGFzcyBoYXMKLSAqIGtub3dsZWRnZSBob3cgdG8gcmVhZC93cml0ZS9pbml0aWFsaXplIGEgc3Vic2V0IG9mIHRoZSBwcmVmZXJlbmNlcyB0aGF0IGFyZQotICogYXBwbGljYWJsZSB0byB0aGUgdG9vbC4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0xBVU5DSF9DTUQgPSAibGF1bmNoQ21kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0RFQlVHX0NNRCA9ICJkZWJ1Z0NtZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19ESVNDT1ZFUl9DTUQgPSAiZGlzY292ZXJDbWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9DTUQgPSAicGVyaW9kaWNNb25pdG9yQ21kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1BFUklPRElDX01PTklUT1JfVElNRSA9ICJwZXJpb2RpY01vbml0b3JUaW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0NPTlRJTlVPVVNfTU9OSVRPUl9DTUQgPSAiY29udGludW91c01vbml0b3JDbWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCA9ICJyZW1vdGVJbnN0YWxsUEF0aCI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19VU0VfREVGQVVMVFMgPSAidXNlRGVmYXVsdHMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL1Rvb2xzUk1QbHVnaW4uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvVG9vbHNSTVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk5ZTQ1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvVG9vbHNSTVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlLgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sc1JNUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFRvb2xzUk1QbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFRvb2xzUk1QbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJRGVidWdVdGlsLmNvbmZpZ3VyZVBsdWdpbkRlYnVnT3B0aW9ucygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVG9vbHNSTVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSYWlzZSBjb3JlIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSB0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlLCB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGFuIElTdGF0dXMKLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGEgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhIFRocm93YWJsZQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLlRvb2xzUk1QbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3IsIGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyCi0JICogCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzEwYTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5tZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UmVtb3RlQ29tbWFuZEpvYl9FeGNlcHRpb25fQ29tbWFuZEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2JfRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbV9FeGNlcHRpb25fTm9Db25uZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1fRXhjZXB0aW9uX05vUmVtb3RlU2VydmljZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbV9FeGNlcHRpb25fUmVzb3VyY2VNYW5hZ2VyTm90SW5pdGlhbGl6ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbV9Kb2JRdWV1ZU1hbmFnZXJUaHJlYWRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9CZWZvcmVFeGVjdXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fQ3JlYXRlQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9EZWZhdWx0QXR0cmlidXRlVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0ZUNvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmluaXNoZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uU3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9MYXVuY2hBcHBsaWNhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9QcmVwYXJlRXhlY3V0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX1dhaXRFeGVjdXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9TdWNjZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfVXNlckNhbmNlbGVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvb2xzUk1QbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIFByZXZlbnQgaW5zdGFuY2VzLgotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MjZiZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQ9Q29tbWFuZCBmYWlsZWQuCi1BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2JfRXhjZXB0aW9uX0ludGVybmFsRXJyb3I9SW50ZXJuYWwgZXJyb3IKLUFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1fRXhjZXB0aW9uX05vQ29ubmVjdGlvbj1Db3VsZCBub3QgZmluZCBjb25uZWN0aW9uIGZvciByZXNvdXJjZSBtYW5hZ2VyCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtX0V4Y2VwdGlvbl9Ob1JlbW90ZVNlcnZpY2VzPUNvdWxkIG5vdCBmaW5kIHJlbW90ZSBzZXJ2aWNlcyBmb3IgcmVzb3VyY2UgbWFuYWdlcgotQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbV9FeGNlcHRpb25fUmVzb3VyY2VNYW5hZ2VyTm90SW5pdGlhbGl6ZWQ9UmVzb3VyY2UgbWFuYWdlciBoYXMgbm90IGJlIGluaXRpYWxpemVkCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtX0pvYlF1ZXVlTWFuYWdlclRocmVhZFRpdGxlPUpvYiBRdWV1ZSBNYW5hZ2VyCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9CZWZvcmVFeGVjdXRpb249RmFpbGVkIGJlZm9yZSBleGVjdXRpbmcgY29tbWFuZCB0byBsYXVuY2ggcGFyYWxsZWwgYXBwbGljYXRpb24uCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9DcmVhdGVDb21tYW5kPUZhaWxlZCB0byBjYWN1bGF0ZSB3b3JrIGRpcmVjdG9yeSwgZW52aXJvbm1lbnQgb3IgY29tbWFuZCBsaW5lIHRvIGxhdW5jaCBwYXJhbGxlbCBhcHBsaWNhdGlvbi4KLUFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0RlZmF1bHRBdHRyaWJ1dGVWYWx1ZT1GYWlsZWQgdG8gY3JlYXRlIGRlZmF1bHQgYXR0cmlidXRlIGZvciB7MH0uCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRlQ29tbWFuZD1GYWlsZWQgdG8gZXhlY3V0ZSBjb21tYW5kIHRvICBsYXVuY2ggcGFyYWxsZWwgYXBwbGljYXRpb24uCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GaW5pc2hlZD1GYWlsZWQgYWZ0ZXIgZmluaXNoaW5nIGV4ZWN1dGlvbiBvZiBwYXJhbGxlbCBhcHBsaWNhdGlvbi4KLUFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0V4ZWN1dGlvblN0YXJ0ZWQ9RmFpbGVkIGFmdGVyIGV4ZWN1dGluZyBjb21tYW5kIHRvIGxhdW5jaCBwYXJhbGxlbCBhcHBsaWNhdGlvbi4KLUFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0xhdW5jaEFwcGxpY2F0aW9uPUZhaWxlZCB0byBydW4gY29tbWFuZCB0byBsYXVuY2ggcGFyYWxsZWwgYXBwbGljYXRpb24sIHJldHVybiBleGl0IHZhbHVlIHswfS4KLUFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX1ByZXBhcmVFeGVjdXRpb249RmFpbGVkIGJlZm9yZSBleGVjdXRpbmcgY29tbWFuZCB0byBsYXVuY2ggcGFyYWxsZWwgYXBwbGljYXRpb24uCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9XYWl0RXhlY3V0aW9uPUZhaWxlZCB3aGlsZSBleGVjdXRpbmcgcGFyYWxsZWwgYXBwbGljYXRpb24uCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX1N1Y2Nlc3M9Q29tbWFuZCBzdWNjZXNzZnVsLCByZXR1cm4gZXhpdCB2YWx1ZSB7MH0uCi1BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX1VzZXJDYW5jZWxlZD1Kb2Igd2FzIGNhbmNlbGVkIGJ5IHVzZXIuCi0KLVRvb2xzUk1QbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I9SW50ZXJuYWwgRXJyb3IKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcm1zeXN0ZW0vQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3Jtc3lzdGVtL0Fic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEzYTE3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcm1zeXN0ZW0vQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbTsKLQotLyoqCi0gKiBTdG9yZXMgdGhlIHRvb2wgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIHRoYXQgc2hhbGwgYmUgdXNlZCwgYWNjb3JkaW5nIHRoZQotICogdGhlICJ1c2VEZWZhdWx0IiBhdHRyaWJ1dGUgZnJvbSB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9uLCBhbmQKLSAqIGFwcGVuZHMgdGhlIHJlbW90ZUluc3RhbGxQYXRoIHRvIHRoZSBjb21tYW5kLCBpZiBhcHBsaWNhYmxlLgotICogPHA+Ci0gKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgZm9yIHRoZSBjb25maWd1cmF0aW9uIE1VU1QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlCi0gKiBjb25zdHJ1Y3Rvci4gVHlwaWNhbGx5LCBpZiAidXNlRGVmYXVsdHMiIGlzIG9mLCB0aGVuIGNvbmZpZ3VyYXRpb24gaXMgY29waWVkCi0gKiBmcm9tIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24uIEVsc2UsIGlmICJ1c2VEZWZhdWx0cyIgaXMgdHJ1ZSwgdGhlbgotICogdGhlIGNvbnN0cnVjdG9yIHVzdWFsbHkgY29waWVzIHRoZSBjb25maWd1cmF0aW9uIGZyb20gZGVmYXVsdCB2YWx1ZXMgb3IgZnJvbQotICogdGhlIHByZWZlcmVuY2VzLiBUaGUgY29uc3RydWN0b3IgbWF5IHVzZQotICoge0BsaW5rICNhcHBseVZhbHVlcyhTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGludCwgU3RyaW5nLCBTdHJpbmcpfSB0bwotICogc2V0IGFsbCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMuCi0gKiA8cD4KLSAqIEFsbCBjb21tYW5kIGF0dHJpYnV0ZXMgZG8gYXV0b21hdGljYWxseSBhZGQgdGhlIHJlbW90ZUluc3RhbGxQYXRoIGluIGZyb250IHRvCi0gKiB0aGUgY29tbWFuZCBzdHJpbmcsIGlmIHJlbW90ZUluc3RhbGxQYXRoIGlzIG5vdCBudWxsIGFuZCBub3QgZW1wdHkuCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBwcm92aWRlcyBnZXR0ZXJzIHRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcy4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGxhdW5jaENtZDsKLQlwcml2YXRlIFN0cmluZyBkZWJ1Z0NtZDsKLQlwcml2YXRlIFN0cmluZyBkaXNjb3ZlckNtZDsKLQlwcml2YXRlIFN0cmluZyBwZXJpb2RpY01vbml0b3JDbWQ7Ci0JcHJpdmF0ZSBpbnQgcGVyaW9kaWNNb25pdG9yVGltZTsKLQlwcml2YXRlIFN0cmluZyBjb250aW51b3VzTW9uaXRvckNtZDsKLQlwcml2YXRlIFN0cmluZyByZW1vdGVJbnN0YWxsUGF0aDsKLQlpbnQgY2FwYWJpbGl0aWVzOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBBYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb24oCi0JCQlBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2FwYWJpbGl0aWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXBwbHlWYWx1ZXMoU3RyaW5nIGxhdW5jaENtZCwgU3RyaW5nIGRlYnVnQ21kLAotCQkJU3RyaW5nIGRpc2NvdmVyQ21kLCBTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kLAotCQkJaW50IHBlcmlvZGljTW9uaXRvclRpbWUsIFN0cmluZyBjb250aW51b3VzTW9uaXRvckNtZCwKLQkJCVN0cmluZyByZW1vdGVJbnN0YWxsUGF0aCkgewotCQl0aGlzLmxhdW5jaENtZCA9IGxhdW5jaENtZDsKLQkJdGhpcy5kZWJ1Z0NtZCA9IGRlYnVnQ21kOwotCQl0aGlzLmRpc2NvdmVyQ21kID0gZGlzY292ZXJDbWQ7Ci0JCXRoaXMucGVyaW9kaWNNb25pdG9yQ21kID0gcGVyaW9kaWNNb25pdG9yQ21kOwotCQl0aGlzLnBlcmlvZGljTW9uaXRvclRpbWUgPSBwZXJpb2RpY01vbml0b3JUaW1lOwotCQl0aGlzLmNvbnRpbnVvdXNNb25pdG9yQ21kID0gY29udGludW91c01vbml0b3JDbWQ7Ci0JCXRoaXMucmVtb3RlSW5zdGFsbFBhdGggPSByZW1vdGVJbnN0YWxsUGF0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBsZXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlpZiAocmVtb3RlSW5zdGFsbFBhdGggPT0gbnVsbCkgcmV0dXJuIGNvbW1hbmQ7Ci0JCWlmIChyZW1vdGVJbnN0YWxsUGF0aC5sZW5ndGgoKSA9PSAwKSByZXR1cm4gY29tbWFuZDsKLQkJLy8gVE9ETzogUmVtb3ZlIHRoaXMgaGFyZC1jb2RlZCBwYXRoIGNhbGN1bGF0aW9uIQotCQlyZXR1cm4gcmVtb3RlSW5zdGFsbFBhdGgrIi8iK2NvbW1hbmQudHJpbSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hDbWQoKSB7Ci0JCXJldHVybiBjb21wbGV0ZUNvbW1hbmQobGF1bmNoQ21kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnQ21kKCkgewotCQlyZXR1cm4gY29tcGxldGVDb21tYW5kKGRlYnVnQ21kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc2NvdmVyQ21kKCkgewotCQlyZXR1cm4gY29tcGxldGVDb21tYW5kKGRpc2NvdmVyQ21kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBlcmlvZGljTW9uaXRvckNtZCgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlQ29tbWFuZChwZXJpb2RpY01vbml0b3JDbWQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UGVyaW9kaWNNb25pdG9yVGltZSgpIHsKLQkJcmV0dXJuIHBlcmlvZGljTW9uaXRvclRpbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250aW51b3VzTW9uaXRvckNtZCgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlQ29tbWFuZChjb250aW51b3VzTW9uaXRvckNtZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVJbnN0YWxsUGF0aCgpIHsKLQkJcmV0dXJuIHJlbW90ZUluc3RhbGxQYXRoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0Rpc2NvdmVyQ21kKCkgewotCQlyZXR1cm4gKGNhcGFiaWxpdGllcyAmIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbi5DQVBfRElTQ09WRVIpICE9IDAKLQkJJiYgZGlzY292ZXJDbWQgIT0gbnVsbAotCQkmJiAhZGlzY292ZXJDbWQudHJpbSgpLmVxdWFscyhFTVBUWV9TVFJJTkcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0xhdW5jaENtZCgpIHsKLQkJcmV0dXJuIChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX0xBVU5DSCkgIT0gMAotCQkmJiBsYXVuY2hDbWQgIT0gbnVsbCAmJiAhbGF1bmNoQ21kLnRyaW0oKS5lcXVhbHMoRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNEZWJ1Z0NtZCgpIHsKLQkJcmV0dXJuIChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX0xBVU5DSCkgIT0gMAotCQkmJiBkZWJ1Z0NtZCAhPSBudWxsICYmICFkZWJ1Z0NtZC50cmltKCkuZXF1YWxzKEVNUFRZX1NUUklORyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29udGludW91c01vbml0b3JDbWQoKSB7Ci0JCXJldHVybiAoY2FwYWJpbGl0aWVzICYgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uLkNBUF9DT05USU5VT1VTX01PTklUT1IpICE9IDAKLQkJJiYgY29udGludW91c01vbml0b3JDbWQgIT0gbnVsbAotCQkmJiAhY29udGludW91c01vbml0b3JDbWQudHJpbSgpLmVxdWFscyhFTVBUWV9TVFJJTkcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1BlcmlvZGljTW9uaXRvckNtZCgpIHsKLQkJcmV0dXJuIChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX1BFUklPRElDX01PTklUT1IpICE9IDAKLQkJJiYgcGVyaW9kaWNNb25pdG9yQ21kICE9IG51bGwKLQkJJiYgIXBlcmlvZGljTW9uaXRvckNtZC50cmltKCkuZXF1YWxzKEVNUFRZX1NUUklORyk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDYXBhYmlsaXRpZXMoKSB7Ci0JCXJldHVybiBjYXBhYmlsaXRpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ybXN5c3RlbS9BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcm1zeXN0ZW0vQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzEzODEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ybXN5c3RlbS9BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotLyoKLSAqIFRPRE86IE1ha2UgdGhpcyBjbGFzcyBub3QgZXh0ZW5kIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi8gLQotICogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gUmVtb3RlQ29uZmlnIC0gQ3JlYXRlIG5ldyBhdHRyaWJ1dGUocykgdG8gc3RvcmUgcmVtb3RlCi0gKiB0YXJnZXQsIGFzIGRvbmUgb24gQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLCBidXQgd2l0aG91dAotICogcHJveHkgc2V0dGluZ3MuCi0gKi8KLS8qKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24gZXh0ZW5kcwotQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19MQVVOQ0hfQ01EID0gImxhdW5jaENtZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFQlVHX0NNRCA9ICJkZWJ1Z0NtZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RJU0NPVkVSX0NNRCA9ICJkaXNjb3ZlckNtZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BFUklPRElDX01PTklUT1JfQ01EID0gInBlcmlvZGljTW9uaXRvckNtZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BFUklPRElDX01PTklUT1JfVElNRSA9ICJwZXJpb2RpY01vbml0b3JUaW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVElOVU9VU19NT05JVE9SX0NNRCA9ICJjb250aW51b3VzTW9uaXRvckNtZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTU9URV9JTlNUQUxMX1BBVEggPSAicmVtb3RlSW5zdGFsbFBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VU0VfREVGQVVMVFMgPSAidXNlVG9vbERlZmF1bHRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX0xBVU5DSCA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfRElTQ09WRVIgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX1BFUklPRElDX01PTklUT1IgPSAxIDw8IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX0NPTlRJTlVPVVNfTU9OSVRPUiA9IDEgPDwgMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfUkVNT1RFX0lOU1RBTExfUEFUSCA9IDEgPDwgNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NBUF9TRVQgPSAwOwotCi0JLyoqCi0JICogU3RhdGljIGNsYXNzIHRvIGhvbGQgdG9vbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0JICoKLQkgKiBAYXV0aG9yIGRmZmVyYmVyCi0JICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBUb29sc0NvbmZpZyB7Ci0JCXByaXZhdGUgUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZzsKLQkJcHJpdmF0ZSBTdHJpbmcgbGF1bmNoQ21kOwotCQlwcml2YXRlIFN0cmluZyBkZWJ1Z0NtZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZGlzY292ZXJDbWQ7Ci0JCXByaXZhdGUgU3RyaW5nIHBlcmlvZGljTW9uaXRvckNtZDsKLQkJcHJpdmF0ZSBpbnQgcGVyaW9kaWNNb25pdG9yVGltZTsKLQkJcHJpdmF0ZSBTdHJpbmcgY29udGludW91c01vbml0b3JDbWQ7Ci0JCXByaXZhdGUgU3RyaW5nIHJlbW90ZUluc3RhbGxQYXRoOwotCQlwcml2YXRlIGJvb2xlYW4gdXNlVG9vbERlZmF1bHRzOwotCi0JCXB1YmxpYyBUb29sc0NvbmZpZygpIHsKLQkJCXRoaXMobmV3IFJlbW90ZUNvbmZpZygpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyBUb29sc0NvbmZpZyhSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnLCBTdHJpbmcgbGF1bmNoQ21kLCBTdHJpbmcgZGVidWdDbWQsCi0JCQkJU3RyaW5nIGRpc2NvdmVyQ21kLCBTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kLAotCQkJCWludCBwZXJpb2RpY01vbml0b3JUaW1lLCBTdHJpbmcgY29udGludW91c01vbml0b3JDbWQsCi0JCQkJU3RyaW5nIHJlbW90ZUluc3RhbGxQYXRoLCBib29sZWFuIHVzZVRvb2xEZWZhdWx0cykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucmVtb3RlQ29uZmlnID0gcmVtb3RlQ29uZmlnOwotCQkJdGhpcy5sYXVuY2hDbWQgPSBsYXVuY2hDbWQ7Ci0JCQl0aGlzLmRlYnVnQ21kID0gZGVidWdDbWQ7Ci0JCQl0aGlzLmRpc2NvdmVyQ21kID0gZGlzY292ZXJDbWQ7Ci0JCQl0aGlzLnBlcmlvZGljTW9uaXRvckNtZCA9IHBlcmlvZGljTW9uaXRvckNtZDsKLQkJCXRoaXMucGVyaW9kaWNNb25pdG9yVGltZSA9IHBlcmlvZGljTW9uaXRvclRpbWU7Ci0JCQl0aGlzLmNvbnRpbnVvdXNNb25pdG9yQ21kID0gY29udGludW91c01vbml0b3JDbWQ7Ci0JCQl0aGlzLnJlbW90ZUluc3RhbGxQYXRoID0gcmVtb3RlSW5zdGFsbFBhdGg7Ci0JCQl0aGlzLnVzZVRvb2xEZWZhdWx0cyA9IHVzZVRvb2xEZWZhdWx0czsKLQkJfQotCi0JCXB1YmxpYyBSZW1vdGVDb25maWcgZ2V0UmVtb3RlQ29uZmlnKCkgewotCQkJcmV0dXJuIHJlbW90ZUNvbmZpZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFJlbW90ZUNvbmZpZyhSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnKSB7Ci0JCQl0aGlzLnJlbW90ZUNvbmZpZyA9IHJlbW90ZUNvbmZpZzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoQ21kKCkgewotCQkJcmV0dXJuIGxhdW5jaENtZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldExhdW5jaENtZChTdHJpbmcgbGF1bmNoQ21kKSB7Ci0JCQl0aGlzLmxhdW5jaENtZCA9IGxhdW5jaENtZDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWdDbWQoKSB7Ci0JCQlyZXR1cm4gZGVidWdDbWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREZWJ1Z0NtZChTdHJpbmcgZGVidWdDbWQpIHsKLQkJCXRoaXMuZGVidWdDbWQgPSBkZWJ1Z0NtZDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzY292ZXJDbWQoKSB7Ci0JCQlyZXR1cm4gZGlzY292ZXJDbWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREaXNjb3ZlckNtZChTdHJpbmcgZGlzY292ZXJDbWQpIHsKLQkJCXRoaXMuZGlzY292ZXJDbWQgPSBkaXNjb3ZlckNtZDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGVyaW9kaWNNb25pdG9yQ21kKCkgewotCQkJcmV0dXJuIHBlcmlvZGljTW9uaXRvckNtZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBlcmlvZGljTW9uaXRvckNtZChTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kKSB7Ci0JCQl0aGlzLnBlcmlvZGljTW9uaXRvckNtZCA9IHBlcmlvZGljTW9uaXRvckNtZDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UGVyaW9kaWNNb25pdG9yVGltZSgpIHsKLQkJCXJldHVybiBwZXJpb2RpY01vbml0b3JUaW1lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UGVyaW9kaWNNb25pdG9yVGltZShpbnQgcGVyaW9kaWNNb25pdG9yVGltZSkgewotCQkJdGhpcy5wZXJpb2RpY01vbml0b3JUaW1lID0gcGVyaW9kaWNNb25pdG9yVGltZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGludW91c01vbml0b3JDbWQoKSB7Ci0JCQlyZXR1cm4gY29udGludW91c01vbml0b3JDbWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250aW51b3VzTW9uaXRvckNtZChTdHJpbmcgY29udGludW91c01vbml0b3JDbWQpIHsKLQkJCXRoaXMuY29udGludW91c01vbml0b3JDbWQgPSBjb250aW51b3VzTW9uaXRvckNtZDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKSB7Ci0JCQlyZXR1cm4gcmVtb3RlSW5zdGFsbFBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVJbnN0YWxsUGF0aChTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGgpIHsKLQkJCXRoaXMucmVtb3RlSW5zdGFsbFBhdGggPSByZW1vdGVJbnN0YWxsUGF0aDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHVzZVRvb2xEZWZhdWx0cygpIHsKLQkJCXJldHVybiB1c2VUb29sRGVmYXVsdHM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRVc2VUb29sRGVmYXVsdHMoYm9vbGVhbiB1c2VUb29sRGVmYXVsdHMpIHsKLQkJCXRoaXMudXNlVG9vbERlZmF1bHRzID0gdXNlVG9vbERlZmF1bHRzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoQ21kOwotCXByaXZhdGUgU3RyaW5nIGRlYnVnQ21kOwotCXByaXZhdGUgU3RyaW5nIGRpc2NvdmVyQ21kOwotCXByaXZhdGUgU3RyaW5nIHBlcmlvZGljTW9uaXRvckNtZDsKLQlwcml2YXRlIGludCBwZXJpb2RpY01vbml0b3JUaW1lOwotCXByaXZhdGUgU3RyaW5nIGNvbnRpbnVvdXNNb25pdG9yQ21kOwotCXByaXZhdGUgU3RyaW5nIHJlbW90ZUluc3RhbGxQYXRoOwotCXByaXZhdGUgYm9vbGVhbiB1c2VUb29sRGVmYXVsdHM7Ci0JcHJpdmF0ZSBpbnQgY2FwYWJpbGl0aWVzOwotCi0JcHVibGljIHN0YXRpYyBUb29sc0NvbmZpZyBsb2FkVG9vbChJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LAotCQkJSU1lbWVudG8gbWVtZW50bykgewotCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbG9hZFJlbW90ZShmYWN0b3J5LCBtZW1lbnRvKTsKLQotCQlTdHJpbmcgbGF1bmNoQ21kID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0xBVU5DSF9DTUQpOwotCQlTdHJpbmcgZGVidWdDbWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfREVCVUdfQ01EKTsKLQkJU3RyaW5nIGRpc2NvdmVyQ21kID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0RJU0NPVkVSX0NNRCk7Ci0JCVN0cmluZyBwZXJpb2RpY01vbml0b3JDbWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfUEVSSU9ESUNfTU9OSVRPUl9DTUQpOwotCQlJbnRlZ2VyIHBlcmlvZGljTW9uaXRvclRpbWUgPSBtZW1lbnRvCi0JCS5nZXRJbnRlZ2VyKFRBR19QRVJJT0RJQ19NT05JVE9SX1RJTUUpOwotCQlTdHJpbmcgY29udGludW91c01vbml0b3JDbWQgPSBtZW1lbnRvCi0JCS5nZXRTdHJpbmcoVEFHX0NPTlRJTlVPVVNfTU9OSVRPUl9DTUQpOwotCQlTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfUkVNT1RFX0lOU1RBTExfUEFUSCk7Ci0JCWJvb2xlYW4gdXNlVG9vbERlZmF1bHRzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4obWVtZW50bwotCQkJCS5nZXRTdHJpbmcoVEFHX1VTRV9ERUZBVUxUUykpOwotCi0JCVRvb2xzQ29uZmlnIGNvbmZpZyA9IG5ldyBUb29sc0NvbmZpZyhyZW1vdGVDb25maWcsIGxhdW5jaENtZCwgZGVidWdDbWQsCi0JCQkJZGlzY292ZXJDbWQsIHBlcmlvZGljTW9uaXRvckNtZCwgcGVyaW9kaWNNb25pdG9yVGltZSwKLQkJCQljb250aW51b3VzTW9uaXRvckNtZCwgcmVtb3RlSW5zdGFsbFBhdGgsIHVzZVRvb2xEZWZhdWx0cyk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbihpbnQgY2FwYWJpbGl0aWVzLAotCQkJVG9vbHNDb25maWcgdG9vbHNDb25maWcsIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIodG9vbHNDb25maWcuZ2V0UmVtb3RlQ29uZmlnKCksIGZhY3RvcnkpOwotCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKLQkJdGhpcy5sYXVuY2hDbWQgPSB0b29sc0NvbmZpZy5nZXRMYXVuY2hDbWQoKTsKLQkJdGhpcy5kZWJ1Z0NtZCA9IHRvb2xzQ29uZmlnLmdldERlYnVnQ21kKCk7Ci0JCXRoaXMuZGlzY292ZXJDbWQgPSB0b29sc0NvbmZpZy5nZXREaXNjb3ZlckNtZCgpOwotCQl0aGlzLnBlcmlvZGljTW9uaXRvckNtZCA9IHRvb2xzQ29uZmlnLmdldFBlcmlvZGljTW9uaXRvckNtZCgpOwotCQl0aGlzLnBlcmlvZGljTW9uaXRvclRpbWUgPSB0b29sc0NvbmZpZy5nZXRQZXJpb2RpY01vbml0b3JUaW1lKCk7Ci0JCXRoaXMuY29udGludW91c01vbml0b3JDbWQgPSB0b29sc0NvbmZpZy5nZXRDb250aW51b3VzTW9uaXRvckNtZCgpOwotCQl0aGlzLnJlbW90ZUluc3RhbGxQYXRoID0gdG9vbHNDb25maWcuZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKTsKLQkJdGhpcy51c2VUb29sRGVmYXVsdHMgPSB0b29sc0NvbmZpZy51c2VUb29sRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uKGludCBjYXBhYmlsaXRpZXMsCi0JCQlBYnN0cmFjdFRvb2xSTUZhY3RvcnkgZmFjdG9yeSwgUmVtb3RlQ29uZmlnIGNvbmZpZywgU3RyaW5nIHRvb2xJZCwKLQkJCVN0cmluZyBsYXVuY2hDbWQsIFN0cmluZyBkZWJ1Z0NtZCwgU3RyaW5nIGRpc2NvdmVyQ21kLCBTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kLAotCQkJaW50IHBlcmlvZGljTW9uaXRvclRpbWUsIFN0cmluZyBjb250aW51b3VzTW9uaXRvckNtZCwKLQkJCVN0cmluZyByZW1vdGVJbnN0YWxsUGF0aCwgYm9vbGVhbiB1c2VUb29sRGVmYXVsdHMpIHsKLQkJc3VwZXIoY29uZmlnLCBmYWN0b3J5KTsKLQkJdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7Ci0JCXNldExhdW5jaENtZChsYXVuY2hDbWQpOwotCQlzZXREZWJ1Z0NtZChkZWJ1Z0NtZCk7Ci0JCXNldERpc2NvdmVyQ21kKGRpc2NvdmVyQ21kKTsKLQkJc2V0UGVyaW9kaWNNb25pdG9yQ21kKHBlcmlvZGljTW9uaXRvckNtZCk7Ci0JCXNldFBlcmlvZGljTW9uaXRvclRpbWUocGVyaW9kaWNNb25pdG9yVGltZSk7Ci0JCXNldENvbnRpbnVvdXNNb25pdG9yQ21kKGNvbnRpbnVvdXNNb25pdG9yQ21kKTsKLQkJc2V0UmVtb3RlSW5zdGFsbFBhdGgocmVtb3RlSW5zdGFsbFBhdGgpOwotCQlzZXRVc2VUb29sRGVmYXVsdHModXNlVG9vbERlZmF1bHRzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGNsb25lKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIuc2F2ZShtZW1lbnRvKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX0xBVU5DSF9DTUQsIGxhdW5jaENtZCk7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKFRBR19ERUJVR19DTUQsIGRlYnVnQ21kKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX0RJU0NPVkVSX0NNRCwgZGlzY292ZXJDbWQpOwotCQltZW1lbnRvLnB1dFN0cmluZyhUQUdfUEVSSU9ESUNfTU9OSVRPUl9DTUQsIHBlcmlvZGljTW9uaXRvckNtZCk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihUQUdfUEVSSU9ESUNfTU9OSVRPUl9USU1FLCBwZXJpb2RpY01vbml0b3JUaW1lKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX0NPTlRJTlVPVVNfTU9OSVRPUl9DTUQsIGNvbnRpbnVvdXNNb25pdG9yQ21kKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX1JFTU9URV9JTlNUQUxMX1BBVEgsIHJlbW90ZUluc3RhbGxQYXRoKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX1VTRV9ERUZBVUxUUywgQm9vbGVhbi50b1N0cmluZyh1c2VUb29sRGVmYXVsdHMpKTsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZUFuZERlc2MoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoQ21kKCkgewotCQlyZXR1cm4gbGF1bmNoQ21kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaENtZChTdHJpbmcgbGF1bmNoQ21kKSB7Ci0JCXRoaXMubGF1bmNoQ21kID0gbGF1bmNoQ21kOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWdDbWQoKSB7Ci0JCXJldHVybiBkZWJ1Z0NtZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z0NtZChTdHJpbmcgZGVidWdDbWQpIHsKLQkJdGhpcy5kZWJ1Z0NtZCA9IGRlYnVnQ21kOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzY292ZXJDbWQoKSB7Ci0JCXJldHVybiBkaXNjb3ZlckNtZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNjb3ZlckNtZChTdHJpbmcgZGlzY292ZXJDbWQpIHsKLQkJdGhpcy5kaXNjb3ZlckNtZCA9IGRpc2NvdmVyQ21kOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyaW9kaWNNb25pdG9yQ21kKCkgewotCQlyZXR1cm4gcGVyaW9kaWNNb25pdG9yQ21kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBlcmlvZGljTW9uaXRvckNtZChTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kKSB7Ci0JCXRoaXMucGVyaW9kaWNNb25pdG9yQ21kID0gcGVyaW9kaWNNb25pdG9yQ21kOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UGVyaW9kaWNNb25pdG9yVGltZSgpIHsKLQkJcmV0dXJuIHBlcmlvZGljTW9uaXRvclRpbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGVyaW9kaWNNb25pdG9yVGltZShpbnQgcGVyaW9kaWNNb25pdG9yVGltZSkgewotCQl0aGlzLnBlcmlvZGljTW9uaXRvclRpbWUgPSBwZXJpb2RpY01vbml0b3JUaW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGludW91c01vbml0b3JDbWQoKSB7Ci0JCXJldHVybiBjb250aW51b3VzTW9uaXRvckNtZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250aW51b3VzTW9uaXRvckNtZChTdHJpbmcgY29udGludW91c01vbml0b3JDbWQpIHsKLQkJdGhpcy5jb250aW51b3VzTW9uaXRvckNtZCA9IGNvbnRpbnVvdXNNb25pdG9yQ21kOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKSB7Ci0JCXJldHVybiByZW1vdGVJbnN0YWxsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVJbnN0YWxsUGF0aChTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGgpIHsKLQkJdGhpcy5yZW1vdGVJbnN0YWxsUGF0aCA9IHJlbW90ZUluc3RhbGxQYXRoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZVRvb2xEZWZhdWx0cygpIHsKLQkJcmV0dXJuIHVzZVRvb2xEZWZhdWx0czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VUb29sRGVmYXVsdHMoYm9vbGVhbiB1c2VUb29sRGVmYXVsdHMpIHsKLQkJdGhpcy51c2VUb29sRGVmYXVsdHMgPSB1c2VUb29sRGVmYXVsdHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRGlzY292ZXJDbWQoKSB7Ci0JCXJldHVybiAoY2FwYWJpbGl0aWVzICYgQ0FQX0RJU0NPVkVSKSAhPSAwICYmIGRpc2NvdmVyQ21kICE9IG51bGwKLQkJJiYgIWRpc2NvdmVyQ21kLnRyaW0oKS5lcXVhbHMoRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNMYXVuY2hDbWQoKSB7Ci0JCXJldHVybiAoY2FwYWJpbGl0aWVzICYgQ0FQX0xBVU5DSCkgIT0gMCAmJiBsYXVuY2hDbWQgIT0gbnVsbAotCQkmJiAhbGF1bmNoQ21kLnRyaW0oKS5lcXVhbHMoRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNEZWJ1Z0NtZCgpIHsKLQkJcmV0dXJuIChjYXBhYmlsaXRpZXMgJiBDQVBfTEFVTkNIKSAhPSAwICYmIGRlYnVnQ21kICE9IG51bGwKLQkJJiYgIWRlYnVnQ21kLnRyaW0oKS5lcXVhbHMoRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb250aW51b3VzTW9uaXRvckNtZCgpIHsKLQkJcmV0dXJuIChjYXBhYmlsaXRpZXMgJiBDQVBfQ09OVElOVU9VU19NT05JVE9SKSAhPSAwCi0JCSYmIGNvbnRpbnVvdXNNb25pdG9yQ21kICE9IG51bGwKLQkJJiYgIWNvbnRpbnVvdXNNb25pdG9yQ21kLnRyaW0oKS5lcXVhbHMoRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQZXJpb2RpY01vbml0b3JDbWQoKSB7Ci0JCXJldHVybiAoY2FwYWJpbGl0aWVzICYgQ0FQX1BFUklPRElDX01PTklUT1IpICE9IDAKLQkJJiYgcGVyaW9kaWNNb25pdG9yQ21kICE9IG51bGwKLQkJJiYgIXBlcmlvZGljTW9uaXRvckNtZC50cmltKCkuZXF1YWxzKEVNUFRZX1NUUklORyk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDYXBhYmlsaXRpZXMoKSB7Ci0JCXJldHVybiBjYXBhYmlsaXRpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ybXN5c3RlbS9BYnN0cmFjdFRvb2xSTUZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcm1zeXN0ZW0vQWJzdHJhY3RUb29sUk1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDBjOWMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ybXN5c3RlbS9BYnN0cmFjdFRvb2xSTUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRvb2xSTUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkgewotCi0JcHVibGljIEFic3RyYWN0VG9vbFJNRmFjdG9yeShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29weUNvbmZpZ3VyYXRpb24oCi0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXJldHVybiAoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24uY2xvbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlhYnN0cmFjdCBwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpOwotCi0JYWJzdHJhY3QgcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWRDb25maWd1cmF0aW9uKElNZW1lbnRvIG1lbWVudG8pOwotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3Jtc3lzdGVtL0Fic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ybXN5c3RlbS9BYnN0cmFjdFRvb2xSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxYzU2Ni4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3Jtc3lzdGVtL0Fic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBQcm9jZXNzQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRvb2xSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIgewotCi0JcHVibGljIEFic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlcihTdHJpbmcgaWQsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlLAotCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGlkLCB1bml2ZXJzZSwgY29uZmlnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlciNnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyIGdldEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9CZWZvcmVDbG9zZUNvbm5lY3Rpb24oKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvQmVmb3JlQ2xvc2VDb25uZWN0aW9uKCkgewotCQkvKgotCQkgKiBEZWZhdWx0cyB0byBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCQkgKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpIHsKLQkJLyoKLQkJICogRGVmYXVsdHMgdG8gZW1wdHkgaW1wbGVtZW50YXRpb24KLQkJICovCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQWZ0ZXJPcGVuQ29ubmVjdGlvbigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9BZnRlck9wZW5Db25uZWN0aW9uKCkgewotCQkvKgotCQkgKiBEZWZhdWx0cyB0byBlbXB0eSBpbXBsZW1lbnRhdGlvbgotCQkgKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpIHsKLQkJLyoKLQkJICogRGVmYXVsdHMgdG8gZW1wdHkgaW1wbGVtZW50YXRpb24KLQkJICovCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlSm9iKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUEpvYkNvbnRyb2wgZG9DcmVhdGVKb2IoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIFN0cmluZyBqb2JJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3Sm9iKHF1ZXVlLCBqb2JJZCwgYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZU1hY2hpbmUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUE1hY2hpbmVDb250cm9sIGRvQ3JlYXRlTWFjaGluZShTdHJpbmcgbWFjaGluZUlkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXdNYWNoaW5lKG1hY2hpbmVJZCwgYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZU5vZGUob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTWFjaGluZUNvbnRyb2wsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVBOb2RlQ29udHJvbCBkb0NyZWF0ZU5vZGUoSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lLCBTdHJpbmcgbm9kZUlkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXdOb2RlKG1hY2hpbmUsIG5vZGVJZCwgYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVByb2Nlc3Mob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUFByb2Nlc3NDb250cm9sIGRvQ3JlYXRlUHJvY2VzcyhJUEpvYkNvbnRyb2wgam9iLCBTdHJpbmcgcHJvY2Vzc0lkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXdQcm9jZXNzKGpvYiwgcHJvY2Vzc0lkLCBhdHRycyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlUXVldWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUFF1ZXVlQ29udHJvbCBkb0NyZWF0ZVF1ZXVlKFN0cmluZyBxdWV1ZUlkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXdRdWV1ZShxdWV1ZUlkLCBhdHRycyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlSm9icyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2wsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVKb2JzKElQUXVldWVDb250cm9sIHF1ZXVlLCBDb2xsZWN0aW9uPElQSm9iQ29udHJvbD4gam9icywgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gdXBkYXRlSm9icyhxdWV1ZSwgam9icywgYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZU1hY2hpbmVzKGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVNYWNoaW5lcyhDb2xsZWN0aW9uPElQTWFjaGluZUNvbnRyb2w+IG1hY2hpbmVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiB1cGRhdGVNYWNoaW5lcyhtYWNoaW5lcywgYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZU5vZGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlTm9kZXMoSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lLCBDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiB1cGRhdGVOb2RlcyhtYWNoaW5lLCBub2RlcywgYXR0cnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZVByb2Nlc3NlcyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlUHJvY2Vzc2VzKElQSm9iQ29udHJvbCBqb2IsIENvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gcHJvY2Vzc2VzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiB1cGRhdGVQcm9jZXNzZXMoam9iLCBwcm9jZXNzZXMsIGF0dHJzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVRdWV1ZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZVF1ZXVlcyhDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBxdWV1ZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIHVwZGF0ZVF1ZXVlcyhxdWV1ZXMsIGF0dHJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIb3N0TGlzdChPdXRwdXRTdHJlYW0gb3MsIFN0cmluZyBxdWV1ZUlELCBTdHJpbmcgam9iSUQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJtSUQgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0UmVzb3VyY2VNYW5hZ2VySWQoKTsKLQkJSVJlc291cmNlTWFuYWdlciBybSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJtSUQpOwotCQlJUFF1ZXVlIHF1ZXVlID0gcm0uZ2V0UXVldWVCeUlkKHF1ZXVlSUQpOwotCQlJUEpvYiBqb2IgPSBxdWV1ZS5nZXRKb2JCeUlkKGpvYklEKTsKLQkJSVBQcm9jZXNzIHByb2Nlc3NlcyBbXSA9IGpvYi5nZXRQcm9jZXNzZXMoKTsKLQkJcHJvY2Vzc2VzWzBdLmdldE5vZGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcnRzeXN0ZW0vQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3J0c3lzdGVtL0Fic3RyYWN0UmVtb3RlQ29tbWFuZEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjBmNmI1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcnRzeXN0ZW0vQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb2Nlc3NCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlRvb2xzUk1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmxpbnV4LkFyZ3VtZW50UGFyc2VyOwotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgam9iIHRoYXQgZXhlY3V0ZXMgYSBjb21tYW5kIG9uIHRoZSByZW1vdGUgaG9zdCBhbmQgcGFyc2VzIGl0cyBvdXRwdXQuCi0gKiBUaGUgam9iIG1pZ2h0IGJlIGF1dG9tYXRpY2FsbHkgcmVzY2hlZHVsZWQgaWYgY3JlYXRlZCB3aXRoIHRoZSBwcm9wZXIgY29uc3RydWN0b3IuCi0gKiBVc2UgdGhpcyBjbGFzcyBhIHVzZWZ1bCBzdGFydGluZyBwb2ludCB0byBpbXBsZW1lbnQgZGlzY292ZXIgYW5kIG1vbml0b3Igam9icy4KLSAqCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0UmVtb3RlQ29tbWFuZEpvYiBleHRlbmRzIEpvYiB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBjb21tYW5kOwotCVN0cmluZyBpbnRlcnJ1cHRlZEVycm9yTWVzc2FnZTsKLQlTdHJpbmcgcHJvY2Vzc0Vycm9yTWVzc2FnZTsKLQlTdHJpbmcgcGFyc2luZ0Vycm9yTWVzc2FnZTsKLQlpbnQgcmVzY2hlZHVsZSA9IDA7Ci0JSVJlbW90ZVByb2Nlc3Mgam9iUHJvY2VzczsKLQlBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHJ0U3lzdGVtOwotCi0JLyoqCi0JICogQSBqb2IgZm9yIGEgcmVtb3RlIGNvbW1hbmQgdGhhdCBpcyBydW4gb25seSBvbmNlLgotCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGpvYgotCSAqIEBwYXJhbSBjb21tYW5kIENvbW1hbmQgZXhlY3V0ZWQgcmVtb3RlbHkKLQkgKiBAcGFyYW0gaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2UgRXJyb3IgbWVzc2FnZSBpZiB0aGUgam9iIGlzIGludGVycnVwdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwcm9jZXNzRXJyb3JNZXNzYWdlIEVycm9yIG1lc3NhZ2UgcmVtb3RlIGNvbW1hbmQgZmFpbHMgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHBhcnNpbmdFcnJvck1lc3NhZ2UgRXJyb3IgbWVzc2FnZSBpZiB0aGUgb3V0cHV0IG9mIHRoZSByZW1vdGUgY29tbWFuZCBjYW5ub3QgYmUgcGFyc2VkIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2IoQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSBydFN5c3RlbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb21tYW5kLCBTdHJpbmcgaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2UsIFN0cmluZyBwcm9jZXNzRXJyb3JNZXNzYWdlLAotCQkJU3RyaW5nIHBhcnNpbmdFcnJvck1lc3NhZ2UpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMucnRTeXN0ZW0gPSBydFN5c3RlbTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJdGhpcy5pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSA9IGludGVycnVwdGVkRXJyb3JNZXNzYWdlOwotCQl0aGlzLnByb2Nlc3NFcnJvck1lc3NhZ2UgPSBwcm9jZXNzRXJyb3JNZXNzYWdlOwotCQl0aGlzLnBhcnNpbmdFcnJvck1lc3NhZ2UgPSBwYXJzaW5nRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEEgam9iIGZvciBhIHJlbW90ZSBjb21tYW5kIHRoYXQgaXMgcnVuIHBlcmlvZGljYWxseS4KLQkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBqb2IKLQkgKiBAcGFyYW0gY29tbWFuZCBDb21tYW5kIGV4ZWN1dGVkIHJlbW90ZWx5Ci0JICogQHBhcmFtIGludGVycnVwdGVkRXJyb3JNZXNzYWdlIEVycm9yIG1lc3NhZ2UgaWYgdGhlIGpvYiBpcyBpbnRlcnJ1cHRlZCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcHJvY2Vzc0Vycm9yTWVzc2FnZSBFcnJvciBtZXNzYWdlIHJlbW90ZSBjb21tYW5kIGZhaWxzIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwYXJzaW5nRXJyb3JNZXNzYWdlIEVycm9yIG1lc3NhZ2UgaWYgdGhlIG91dHB1dCBvZiB0aGUgcmVtb3RlIGNvbW1hbmQgY2Fubm90IGJlIHBhcnNlZCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcmVzY2hlZHVsZSBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGV4ZWN1dGlvbnMgb2YgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVtb3RlQ29tbWFuZEpvYihBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHJ0U3lzdGVtLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBpbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSwgU3RyaW5nIHByb2Nlc3NFcnJvck1lc3NhZ2UsCi0JCQlTdHJpbmcgcGFyc2luZ0Vycm9yTWVzc2FnZSwgaW50IHJlc2NoZWR1bGUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMucnRTeXN0ZW0gPSBydFN5c3RlbTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJdGhpcy5pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSA9IGludGVycnVwdGVkRXJyb3JNZXNzYWdlOwotCQl0aGlzLnByb2Nlc3NFcnJvck1lc3NhZ2UgPSBwcm9jZXNzRXJyb3JNZXNzYWdlOwotCQl0aGlzLnBhcnNpbmdFcnJvck1lc3NhZ2UgPSBwYXJzaW5nRXJyb3JNZXNzYWdlOwotCQl0aGlzLnJlc2NoZWR1bGUgPSByZXNjaGVkdWxlOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuCi0JICogQHBhcmFtIG91dHB1dCBSZWFkZXIgd2l0aCBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gUGFyc2luZyBmYWlsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwYXJzZShCdWZmZXJlZFJlYWRlciBvdXRwdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgam9iLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUFzc2VydC5pc05vdE51bGwocnRTeXN0ZW0pOwotCQkJQXNzZXJ0LmlzTm90TnVsbChjb21tYW5kKTsKLQkJCUFzc2VydC5pc1RydWUoISBjb21tYW5kLnRyaW0oKS5lcXVhbHMoRU1QVFlfU1RSSU5HKSk7Ci0KLQkJCS8qCi0JCQkgKiBQcm9wb3NlZCBlbmhhbmNlbWVudHMKLQkJCSAqIFRPRE86IFN1YnN0aXR1dGlvbiBvZiB2YXJpYWJsZXMgaW4gdGhlIGNvbW1hbmQgc3RyaW5nCi0JCQkgKiBUT0RPOiBTdWJzdGl0dXRpb24gb2YgYXR0cmlidXRlcyBpbiB0aGUgY29tbWFuZCBzdHJuZwotCQkJICogVE9ETzogQXBwZW5kIHJlbW90ZSBpbnN0YWxsYXRpb24gcGF0aCB0byBsYXVuY2ggY29tbWFuZC4KLQkJCSAqIFRPRE86IEV4dGVuZCBjbGFzcyB0byBwcm92aWRlIFhNTCBTQVggcGFyc2VyLgotCQkJICovCi0JCQlBcmd1bWVudFBhcnNlciBhcmd1bWVudFBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihjb21tYW5kKTsKLQkJCUxpc3Q8U3RyaW5nPiBhcmd1bWVudHMgPSBhcmd1bWVudFBhcnNlci5nZXRUb2tlbkxpc3QoKTsKLQotCQkJY2hlY2tDYW5jZWwobW9uaXRvcik7Ci0KLQkJCXRyeSB7Ci0JCQkJSVJlbW90ZVByb2Nlc3NCdWlsZGVyIGNtZEJ1aWxkZXIgPSBydFN5c3RlbS5jcmVhdGVQcm9jZXNzQnVpbGRlcihhcmd1bWVudHMpOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLkNPTU1BTkRfVFJBQ0lORywgIlJ1biBjb21tYW5kOiB7MH0iLCBjb21tYW5kKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlqb2JQcm9jZXNzID0gY21kQnVpbGRlci5zdGFydCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uUExVR0lOX0lELCBwcm9jZXNzRXJyb3JNZXNzYWdlLCBlKSk7Ci0JCQl9Ci0KLQkJCWNoZWNrQ2FuY2VsKG1vbml0b3IpOwotCi0JCQlCdWZmZXJlZFJlYWRlciBzdGRvdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGpvYlByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpOwotCQkJSVN0YXR1cyBwYXJzZVN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl0cnkgewotCQkJCXBhcnNlKHN0ZG91dCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlEZWJ1Z1V0aWwuZXJyb3IoRGVidWdVdGlsLkNPTU1BTkRfVFJBQ0lOR19NT1JFLCAiQ29tbWFuZCBwYXJzaW5nIGZhaWxlZDogezB9IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXJzZVN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQkJaWYgKHBhcnNlU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJdGhyb3cgZTsKLQkJCX0KLQotCQkJY2hlY2tDYW5jZWwobW9uaXRvcik7Ci0KLQkJCXRyeSB7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5DT01NQU5EX1RSQUNJTkdfTU9SRSwgIkNvbW1hbmQ6IHdhaXRpbmcgdG8gZmluaXNoLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJam9iUHJvY2Vzcy53YWl0Rm9yKCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFRvb2xzUk1QbHVnaW4uUExVR0lOX0lELCBpbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSwgZSkpOwotCQkJfQotCi0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLkNPTU1BTkRfVFJBQ0lOR19NT1JFLCAiQ29tbWFuZDogZXhpdCB2YWx1ZSB7MH0uIiwgam9iUHJvY2Vzcy5leGl0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKHJlc2NoZWR1bGUgPiAwKSB7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5DT01NQU5EX1RSQUNJTkdfTU9SRSwgIkNvbW1hbmQ6IHJlc2NoZWR1bGUgaW4gezB9IG1pbGlzZWNvbmRzLiIsIHJlc2NoZWR1bGUpOyAvLyROT04tTkxTLTEkCi0JCQkJc2NoZWR1bGUocmVzY2hlZHVsZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwYXJzZVN0YXR1czsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlEZWJ1Z1V0aWwuZXJyb3IoRGVidWdVdGlsLkNPTU1BTkRfVFJBQ0lOR19NT1JFLCAiQ29tbWFuZCBmYWlsZWQ6IHswfSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb29sc1JNUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgTWVzc2FnZXMuQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iX0V4Y2VwdGlvbl9Db21tYW5kRmFpbGVkLCBlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuQ09NTUFORF9UUkFDSU5HX01PUkUsICJDb21tYW5kIGZhaWxlZDogezB9IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2JfRXhjZXB0aW9uX0ludGVybmFsRXJyb3IsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKGpvYlByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQlqb2JQcm9jZXNzLmRlc3Ryb3koKTsKLQkJCQl9Ci0JCQkJam9iUHJvY2VzcyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDYW5jZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBUb29sc1JNUGx1Z2luLlBMVUdJTl9JRCwgaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGpvYlByb2Nlc3MgIT0gbnVsbCkgewotCQkJCWpvYlByb2Nlc3MuZGVzdHJveSgpOwotCQkJCWpvYlByb2Nlc3MgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3J0c3lzdGVtL0Fic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcnRzeXN0ZW0vQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE4ZTc4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcnRzeXN0ZW0vQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQm9vbGVhbkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5FbGVtZW50QXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLk1hY2hpbmVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTm9kZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlF1ZXVlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJvY2Vzc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuVG9vbHNSTVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uQWJzdHJhY3RSdW50aW1lU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLmV2ZW50cy5JUnVudGltZU5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uZXZlbnRzLklSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5ldmVudHMuUnVudGltZUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5SYW5nZVNldDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBSdW50aW1lIFN5c3RlbSB0byBzdXBwb3J0IGNhbGxpbmcgY29tbWFuZCBsaW5lIHRvb2xzIHRvIGRpc2NvdmVyLCBtb25pdG9yIGFuZCBsYXVuY2ggcGFyYWxsZWwgYXBwbGljYXRpb25zLgotICogVE9ETzogU3luY2hyb25pemUgbWV0aG9kcyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMKLSAqIFRPRE86IFNwbGl0IHRoaXMgY2xhc3MgaW50byB0d286IHRoZSB0b29scyBSVFMgYW5kIGEgY29tbWFuZCB0b29scyBSVFMuCi0gKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lU3lzdGVtIHsKLQkvKioKLQkgKiBFeGVjdXRlcyBqb2JzIGZyb20gdGhlIHF1ZXVlLgotCSAqIEBhdXRob3IgZGZmZXJiZXIKLQkgKiBUT0RPOiBJcyB0aGlzIEpvYlJ1bm5lciByZWFsbHkgcmVxdWlyZWQ/IFdoeSBub3QgZGlzcGF0Y2hpbmcgdGhlIGpvYnMgaW1tZWRpYXRlbHk/Ci0JICovCi0JY2xhc3MgSm9iUnVubmVyIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLkpPQl9UUkFDSU5HLCAiUlRTIHswfTogc3RhcnRlZCBqb2IgdGhyZWFkIiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCQlKb2Igam9iID0gcGVuZGluZ0pvYlF1ZXVlLnRha2UoKTsKLQkJCQkJaWYgKGpvYiBpbnN0YW5jZW9mIElUb29sUnVudGltZVN5c3RlbUpvYikgewotCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5KT0JfVFJBQ0lORywgIlJUUyB7MH06IHNjaGVkdWxlIGpvYiAjezF9Iiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSwgKChJVG9vbFJ1bnRpbWVTeXN0ZW1Kb2Ipam9iKS5nZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5KT0JfVFJBQ0lORywgIlJUUyB7MH06IHNjaGVkdWxlIGpvYiAjezF9Iiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSwgam9iLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuSk9CX1RSQUNJTkcsICJSVFMgezB9OiB7MX0iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCVRvb2xzUk1QbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5KT0JfVFJBQ0lORywgIlJUUyB7MH06IHRlcm1pbmF0ZWQgam9iIHRocmVhZCIsIHJtQ29uZmlndXJhdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiogVGhlIFJNIGlkIG9mIHRoZSBSTSBtYW5hZ2VyIHRoYXQgY3JlYXRlZCB0aGUgUlRTLiAqLwotCXByaXZhdGUgU3RyaW5nIHJtSUQ7Ci0KLQkvKiogSWQgZ2VuZXJhdG9yIGZvciBtYWNoaW5lcywgcXVldWVzIGFuZCBub2Rlcy4gKi8KLQlwcml2YXRlIEludGVnZXIgbmV4dElEOwotCi0JLyoqIElkIGdlbmVyYXRvciBmb3Igam9icy4gKi8KLQlwcml2YXRlIEludGVnZXIgam9iTnVtYmVyOwotCi0JLyoqIEEgbG9jYWwgcmVmZXJlbmNlIG9mIHRoZSBSTSBjb25maWd1cmF0aW9uIHVzZWQgYnkgdGhlIFJNIG1hbmFnZXIgdGhhdCBjcmVhdGVkIHRoZSBSVFMuICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbiBybUNvbmZpZ3VyYXRpb247Ci0KLQkvKiogQXR0cmlidXRlIGRlZmluaXRpb25zIGZvciB0aGUgUlRTLiAqLwotCXByb3RlY3RlZCBBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBhdHRyTWdyOwotCi0JLyoqIFJlbW90ZSBTZXJ2aWNlIHVzZWQgdG8gcnVuIGNvbW1hbmRzIG9uIHRoZSByZW1vdGUgaG9zdC4gKi8KLQlwcm90ZWN0ZWQgSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzID0gbnVsbDsKLQotCS8qKiBUcmFjayBpZiBldmVudHMgYXJlIGVuYWJsZWQuICovCi0JcHJpdmF0ZSBib29sZWFuIGV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKLQotCi0JcHJvdGVjdGVkIElSZW1vdGVDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBUaHJlYWQgam9iUXVldWVUaHJlYWQgPSBudWxsOwotCi0JLyoqIEpvYiB0byBtb25pdG9yIHJlbW90ZSBzeXN0ZW0gYW5kIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseS4gKi8KLQlwcml2YXRlIEpvYiBwZXJpb2RpY01vbml0b3JKb2I7Ci0KLQkvKiogSm9iIHRvIG1vbml0b3IgcmVtb3RlIHN5c3RlbSBhbmQgaXMgZXhlY3V0ZWQgY29udGludW91c2x5LiAqLwotCXByaXZhdGUgSm9iIGNvbnRpbm91c01vbml0b3JKb2I7Ci0KLQkvKiogSm9icyBjcmVhdGVkIGJ5IHRoaXMgUlRTLiAqLwotCU1hcDxTdHJpbmcsIEpvYj4gam9icyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIEpvYj4oKSk7Ci0KLQkvKiogSm9icyBjcmVhdGVkLCBidXQgbm90IHlldCBzdGFydGVkLiAqLwotCUxpbmtlZEJsb2NraW5nUXVldWU8Sm9iPiBwZW5kaW5nSm9iUXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxKb2I+KCk7Ci0KLQkvKiogSm9icyBjcmVhdGVkIGFuZCBzdGFydGVkLiAqLwotCS8vCUNvbmN1cnJlbnRMaW5rZWRRdWV1ZTxJVG9vbFJ1bnRpbWVTeXN0ZW1Kb2I+IHJ1bm5pbmdKb2JRdWV1ZSA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8SVRvb2xSdW50aW1lU3lzdGVtSm9iPigpOwotCi0JLyoqIEhlbHBlciBvYmplY3QgdG8gY3JlYXRlIGV2ZW50cyBmb3IgdGhlIFJNLiAqLwotCXByaXZhdGUgSVJ1bnRpbWVFdmVudEZhY3RvcnkgZXZlbnRGYWN0b3J5ID0gbmV3IFJ1bnRpbWVFdmVudEZhY3RvcnkoKTsKLQotCXB1YmxpYyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtKEludGVnZXIgaWQsIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbiBjb25maWcsIEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5ybUlEID0gaWQudG9TdHJpbmcoKTsKLQkJdGhpcy5uZXh0SUQgPSBpZCArIDE7Ci0JCXRoaXMuam9iTnVtYmVyID0gMDsKLQkJdGhpcy5ybUNvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCXRoaXMuYXR0ck1nciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbSNzdGFydHVwKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX1RSQUNJTkcsICJSVFMgezB9OiBzdGFydHVwIiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVtb3RlU2VydmljZXMgPSBQVFBSZW1vdGVDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVTZXJ2aWNlcyhybUNvbmZpZ3VyYXRpb24uZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJaWYgKHJlbW90ZVNlcnZpY2VzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1fRXhjZXB0aW9uX05vUmVtb3RlU2VydmljZXMpKTsKLQkJfQotCQlJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSByZW1vdGVTZXJ2aWNlcy5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbm5lY3Rpb25NYW5hZ2VyKTsKLQotCQljb25uZWN0aW9uID0gY29ubmVjdGlvbk1hbmFnZXIuZ2V0Q29ubmVjdGlvbihybUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCWlmIChjb25uZWN0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1fRXhjZXB0aW9uX05vQ29ubmVjdGlvbikpOwotCQl9Ci0KLQkJaWYgKCFjb25uZWN0aW9uLmlzT3BlbigpKSB7Ci0JCQl0cnkgewotCQkJCWNvbm5lY3Rpb24ub3Blbihtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UobW9uaXRvcik7Ci0JCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlkb1N0YXJ0dXAobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZShtb25pdG9yKTsKLQkJCWNvbm5lY3Rpb24gPSBudWxsOwotCQkJdGhyb3cgZTsKLQkJfQotCi0JCUpvYiBkaXNjb3ZlckpvYiA9IGNyZWF0ZURpc2NvdmVySm9iKCk7Ci0JCWlmIChkaXNjb3ZlckpvYiAhPSBudWxsKSB7Ci0JCQlkaXNjb3ZlckpvYi5zY2hlZHVsZSgpOwotCQl9Ci0KLQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJZmlyZVJ1bnRpbWVSdW5uaW5nU3RhdGVFdmVudChldmVudEZhY3RvcnkubmV3UnVudGltZVJ1bm5pbmdTdGF0ZUV2ZW50KCkpOwotCQkJaWYgKGpvYlF1ZXVlVGhyZWFkID09IG51bGwpIHsKLQkJCQlqb2JRdWV1ZVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IEpvYlJ1bm5lcigpLCBNZXNzYWdlcy5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtX0pvYlF1ZXVlTWFuYWdlclRocmVhZFRpdGxlKTsKLQkJCQlqb2JRdWV1ZVRocmVhZC5zdGFydCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY29ubmVjdGlvbi5jbG9zZShtb25pdG9yKTsKLQkJCWNvbm5lY3Rpb24gPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVtcGxhdGUgbWV0aG9kIHRvIGV4dGVuZCB0aGUgc3RhcnR1cCBwcm9jZWR1cmUuCi0JICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TdGFydHVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbSNzaHV0ZG93bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfVFJBQ0lORywgIlJUUyB7MH06IHNodXRkb3duIiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZG9TaHV0ZG93bihtb25pdG9yKTsKLQotCQlzdG9wRXZlbnRzKCk7Ci0KLQkJLyoKLQkJICogU3RvcCBqb2JzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIHBlbmRpbmcgcXVldWUuCi0JCSAqIEFsc28gc3RvcCB0aGUgdGhyZWFkIHRoYXQgZGlzcGF0Y2hlcyBwZW5kaW5nIGpvYnMuCi0JCSAqLwotCQlqb2JRdWV1ZVRocmVhZC5pbnRlcnJ1cHQoKTsKLQkJZm9yIChKb2Igam9iIDogcGVuZGluZ0pvYlF1ZXVlKSB7Ci0JCQlqb2IuY2FuY2VsKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBTdG9wIGpvYnMgdGhhdCBhcmUgcnVubmluZyBvciB0aGF0IGFscmVhZHkgZmluaXNoZWQuCi0JCSAqLwotCQlJdGVyYXRvcjxKb2I+IGl0ZXJhdG9yID0gam9icy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKb2Igam9iID0gaXRlcmF0b3IubmV4dCgpOwotCQkJam9iLmNhbmNlbCgpOwotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBDbG9zZSB0aGUgdGhlIGNvbm5lY3Rpb24uCi0JCSAqLwotCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKG1vbml0b3IpOwotCQl9Ci0KLQkJY29ubmVjdGlvbiA9IG51bGw7Ci0JCWpvYlF1ZXVlVGhyZWFkID0gbnVsbDsKLQkJZmlyZVJ1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQoZXZlbnRGYWN0b3J5Lm5ld1J1bnRpbWVTaHV0ZG93blN0YXRlRXZlbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVtcGxhdGUgbWV0aG9kIHRvIGV4dGVuZCB0aGUgc2h1dGRvd24gcHJvY2VkdXJlLgotCSAqIEBwYXJhbSBtb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU2h1dGRvd24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklNb25pdG9yaW5nU3lzdGVtI3N0YXJ0RXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfVFJBQ0lORywgIlJUUyB7MH06IHN0YXJ0IGV2ZW50cyIsIHJtQ29uZmlndXJhdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIENyZWF0ZSBtb25pdG9yIGpvYnMsIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QuIFRoZXkgbWF5IGV4aXN0IGJ1dCBiZSBzdXNwZW5kZWQuCi0JCSAqIElmIHRoZSBqb2IgaXMgbm90IGFwcGxpY2F0ZSwgdGhlbiBubyBqb2Igd2lsbCBiZSBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gY2FwYWJpbGl0aWVzIGZvciB0aGUgUk0uCi0JCSAqLwotCQlpZiAocGVyaW9kaWNNb25pdG9ySm9iID09IG51bGwpIHsKLQkJCXBlcmlvZGljTW9uaXRvckpvYiA9IGNyZWF0ZVBlcmlvZGljTW9uaXRvckpvYigpOwotCQl9Ci0JCWlmIChjb250aW5vdXNNb25pdG9ySm9iID09IG51bGwpIHsKLQkJCWNvbnRpbm91c01vbml0b3JKb2IgPSBjcmVhdGVDb250aW51b3VzTW9uaXRvckpvYigpOwotCQl9Ci0JCS8qCi0JCSAqIE9ubHkgc2NoZWR1bGUgdGhlIGpvYiBpZiB0aGV5IGFyZSBhdmFpbGFibGUuIElmIHRoZSBqb2IgZG9lcyBub3QgZXhpc3RzLCB0aGVuIGl0IHdhcwotCQkgKiBub3QgY3JlYXRlZCBiZWNhdXNlIHRoZSBjYXBhYmlsaXR5IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBSTS4KLQkJICovCi0JCWlmIChwZXJpb2RpY01vbml0b3JKb2IgIT0gbnVsbCkgewotCQkJcGVyaW9kaWNNb25pdG9ySm9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJaWYgKGNvbnRpbm91c01vbml0b3JKb2IgIT0gbnVsbCkgewotCQkJY29udGlub3VzTW9uaXRvckpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JCWRvU3RhcnRFdmVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wbGF0ZSBtZXRob2QgdG8gZXh0ZW5kIHRoZSBzdGFydEV2ZW50cyBwcm9jZWR1cmUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TdGFydEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSU1vbml0b3JpbmdTeXN0ZW0jc3RvcEV2ZW50cygpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfVFJBQ0lORywgIlJUUyB7MH06IHN0b3AgZXZlbnRzIiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBlcmlvZGljTW9uaXRvckpvYiAhPSBudWxsKSB7Ci0JCQlwZXJpb2RpY01vbml0b3JKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJaWYgKGNvbnRpbm91c01vbml0b3JKb2IgIT0gbnVsbCkgewotCQkJY29udGlub3VzTW9uaXRvckpvYi5jYW5jZWwoKTsKLQkJfQotCQlkb1N0b3BFdmVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wbGF0ZSBtZXRob2QgdG8gZXh0ZW5kIHRoZSBzdG9wRXZlbnRzIHByb2NlZHVyZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1N0b3BFdmVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBqb2IgdGhhdCBkaXNjb3ZlcnMgdGhlIHJlbW90ZSBtYWNoaW5lLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBydW5zIHRoZSBkaXNjb3ZlcgotCSAqIGNvbW1hbmQgaWYgZGVmaW5lZCBpbiB0aGUgUk0gY2FwYWJpbGl0eS4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpvYiBjcmVhdGVEaXNjb3ZlckpvYigpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGpvYiB0aGF0IHBlcmlvZGljYWxseSBtb25pdG9ycyB0aGUgcmVtb3RlIG1hY2hpbmUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJ1bnMgdGhlIHBlcmlvZGljIG1vbml0b3IKLQkgKiBjb21tYW5kIGlmIGRlZmluZWQgaW4gdGhlIFJNIGNhcGFiaWxpdHkuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBKb2IgY3JlYXRlUGVyaW9kaWNNb25pdG9ySm9iKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgam9iIHRoYXQga2VlcHMgbW9uaXRvcmluZyB0aGUgcmVtb3RlIG1hY2hpbmUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJ1bnMgdGhlIGNvbnRpbnVvdXMgbW9uaXRvcgotCSAqIGNvbW1hbmQgaWYgZGVmaW5lZCBpbiB0aGUgUk0gY2FwYWJpbGl0eS4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpvYiBjcmVhdGVDb250aW51b3VzTW9uaXRvckpvYigpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucnRzeXN0ZW0uSUNvbnRyb2xTeXN0ZW0jc3VibWl0Sm9iKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdWJtaXRKb2IoU3RyaW5nIHN1YklkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlbW90ZVNlcnZpY2VzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1fRXhjZXB0aW9uX1Jlc291cmNlTWFuYWdlck5vdEluaXRpYWxpemVkKSk7Ci0JCX0KLQotCQkvKgotCQkgKiBBZGQgc29tZSBtb3JlIGF0dHJpYnV0ZXMgdG8gdGhlIGxhdW5jaCBpbmZvcm1hdGlvbi4KLQkJICovCi0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0U3ViSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHN1YklkKSk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBJUEpvYi4KLQkJICovCi0JCVN0cmluZyBxdWV1ZUlEID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRRdWV1ZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgam9iSUQgPSBjcmVhdGVKb2IocXVldWVJRCwgYXR0ck1ncik7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0Sm9iSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGpvYklEKSk7Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5KT0JfVFJBQ0lORywgIlJUUyB7MH06IGpvYiBzdWJtaXNzaW9uICN7MH0sIGpvYiBpZCAjezF9LCBxdWV1ZSBpZCBAezJ9Iiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSwgc3ViSWQsIGpvYklELCBxdWV1ZUlEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgam9iIHRoYXQgcnVucyB0aGUgYXBwbGljYXRpb24uCi0JCSAqLwotCQlKb2Igam9iID0gY3JlYXRlUnVudGltZVN5c3RlbUpvYihqb2JJRCwgcXVldWVJRCwgYXR0ck1ncik7Ci0JCWpvYnMucHV0KGpvYklELCBqb2IpOwotCQl0cnkgewotCQkJcGVuZGluZ0pvYlF1ZXVlLnB1dChqb2IpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIEpvYiBjcmVhdGVSdW50aW1lU3lzdGVtSm9iKFN0cmluZyBqb2JJRCwgU3RyaW5nIHF1ZXVlSUQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1ncikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JQ29udHJvbFN5c3RlbSN0ZXJtaW5hdGVKb2Iob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2IpCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlSm9iKElQSm9iIGlwSm9iKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuSk9CX1RSQUNJTkcsICJSVFMgezB9OiB0ZXJtaW5hdGUgam9iICN7MX0iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBpcEpvYi5nZXRJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQlKb2Igam9iID0gam9icy5nZXQoaXBKb2IuZ2V0SUQoKSk7Ci0JCXBlbmRpbmdKb2JRdWV1ZS5yZW1vdmUoam9iKTsKLQkJam9iLmNhbmNlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBSTSB0byBjaGFuZ2Ugam9iIGF0dHJpYnV0ZXMuCi0JICoKLQkgKiBAcGFyYW0gaWQgam9iIElECi0JICogQHBhcmFtIGF0dHJzIG5ldyBhdHRyaWJ1dGVzCi0JICovCi0JLy8JcHJvdGVjdGVkIHZvaWQgY2hhbmdlSm9iQXR0cmlidXRlcyhTdHJpbmcgaWQsIElBdHRyaWJ1dGU8PywgPywgPz4uLi4gYXR0cnMpIHsKLQkvLwkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgbWdyID0gbmV3IEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JLy8JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JLy8JCWZvciAoSUF0dHJpYnV0ZTw/LCA/LCA/PiBhdHRyIDogYXR0cnMpIHsKLQkvLwkJCWF0dHJNZ3IuYWRkQXR0cmlidXRlKGF0dHIpOwotCS8vCQl9Ci0JLy8JCW1nci5zZXRBdHRyaWJ1dGVNYW5hZ2VyKG5ldyBSYW5nZVNldChpZCksIGF0dHJNZ3IpOwotCS8vCQlmaXJlUnVudGltZUpvYkNoYW5nZUV2ZW50KGV2ZW50RmFjdG9yeS5uZXdSdW50aW1lSm9iQ2hhbmdlRXZlbnQobWdyKSk7Ci0JLy8JfQotCi0JLy8JLyoqCi0JLy8JICogTm90aWZ5IFJNIHRvIGNoYW5nZSBqb2Igc3RhdGUuCi0JLy8JICoKLQkvLwkgKiBAcGFyYW0gaWQgam9iIElECi0JLy8JICogQHBhcmFtIHN0YXRlIG5ldyBzdGF0ZQotCS8vCSAqLwotCS8vCXByb3RlY3RlZCB2b2lkIGNoYW5nZUpvYlN0YXRlKFN0cmluZyBpZCwgSm9iQXR0cmlidXRlcy5TdGF0ZSBzdGF0ZSkgewotCS8vCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBtZ3IgPSBuZXcgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkvLwkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkvLwkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoc3RhdGUpKTsKLQkvLwkJbWdyLnNldEF0dHJpYnV0ZU1hbmFnZXIobmV3IFJhbmdlU2V0KGlkKSwgYXR0ck1ncik7Ci0JLy8JCWZpcmVSdW50aW1lSm9iQ2hhbmdlRXZlbnQoZXZlbnRGYWN0b3J5Lm5ld1J1bnRpbWVKb2JDaGFuZ2VFdmVudChtZ3IpKTsKLQkvLwl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgUk0gdG8gY3JlYXRlIGEgbmV3IGpvYi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRJRCBwYXJlbnQgZWxlbWVudCBJRAotCSAqIEBwYXJhbSBqb2JJRCB0aGUgSUQgb2YgdGhlIGpvYgotCSAqIEBwYXJhbSBhdHRyTWdyIGF0dHJpYnV0ZXMgZnJvbSB0aGUgam9iIHRocmVhZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSm9iKFN0cmluZyBwYXJlbnRJRCwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB7Ci0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IG5ldyBFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQlBdHRyaWJ1dGVNYW5hZ2VyIGpvYkF0dHJNZ3IgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCi0JCS8qCi0JCSAqIEFkZCBnZW5lcmF0ZWQgYXR0cmlidXRlcy4KLQkJICovCi0JCVN0cmluZyBqb2JJRCA9IGdlbmVyYXRlSUQoKS50b1N0cmluZygpOwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldEpvYklkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShqb2JJRCkpOwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFF1ZXVlSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHBhcmVudElEKSk7Ci0JCWpvYkF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuUEVORElORykpOwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFVzZXJJZEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoU3lzdGVtLmdldGVudigiVVNFUiIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJam9iQXR0ck1nci5hZGRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0TmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoZ2VuZXJhdGVKb2JOYW1lKCkpKTsKLQotCQkvKgotCQkgKiBHZXQgcmVsZXZhbnQgYXR0cmlidXRlcyBmcm9tIGxhdW5jaCBhdHRyaWJ1dGVzLgotCQkgKi8KLQkJU3RyaW5nIHN1YklkID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRTdWJJZEF0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIGV4ZWNOYW1lICA9IGF0dHJNZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RXhlY3V0YWJsZU5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBleGVjUGF0aCA9IGF0dHJNZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RXhlY3V0YWJsZVBhdGhBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyB3b3JrRGlyID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRXb3JraW5nRGlyZWN0b3J5QXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpOwotCQlJbnRlZ2VyIG51bVByb2NzID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXROdW1iZXJPZlByb2Nlc3Nlc0F0dHJpYnV0ZURlZmluaXRpb24oKSkuZ2V0VmFsdWUoKTsKLQkJTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRQcm9ncmFtQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuQXR0cmlidXRlIGRlYnVnQXR0ciA9IGF0dHJNZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RGVidWdGbGFnQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQotCQkvKgotCQkgKiBDb3B5IHRoZXNlIHJlbGV2YW50IGF0dHJpYnV0ZXMgdG8gSVBKb2IuCi0JCSAqLwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFN1YklkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShzdWJJZCkpOwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldEV4ZWN1dGFibGVOYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShleGVjTmFtZSkpOwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldEV4ZWN1dGFibGVQYXRoQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShleGVjUGF0aCkpOwotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFdvcmtpbmdEaXJlY3RvcnlBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHdvcmtEaXIpKTsKLQkJdHJ5IHsKLQkJCWpvYkF0dHJNZ3IuYWRkQXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG51bVByb2NzKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUb29sc1JNUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFByb2dyYW1Bcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKTsKLQkJaWYgKGRlYnVnQXR0ciAhPSBudWxsKSB7Ci0JCQlqb2JBdHRyTWdyLmFkZEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldERlYnVnRmxhZ0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoZGVidWdBdHRyLmdldFZhbHVlKCkpKTsKLQkJfQotCi0JCS8qCi0JCSAqIE5vdGlmeSBSTS4KLQkJICovCi0JCW1nci5zZXRBdHRyaWJ1dGVNYW5hZ2VyKG5ldyBSYW5nZVNldChqb2JJRCksIGpvYkF0dHJNZ3IpOwotCQlmaXJlUnVudGltZU5ld0pvYkV2ZW50KGV2ZW50RmFjdG9yeS5uZXdSdW50aW1lTmV3Sm9iRXZlbnQocGFyZW50SUQsIG1ncikpOwotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX1RSQUNJTkcsICJSVFMgezB9OiBuZXcgam9iICN7MX0iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gam9iSUQ7Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgUk0gdG8gY3JlYXRlIGEgbmV3IG1hY2hpbmUuCi0JICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgbWFjaGluZQotCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBuZXcgbWFjaGluZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWFjaGluZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgaWQgPSBnZW5lcmF0ZUlEKCkudG9TdHJpbmcoKTsKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgbWdyID0gbmV3IEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNYWNoaW5lQXR0cmlidXRlcy5TdGF0ZS5VUCkpOwotCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShFbGVtZW50QXR0cmlidXRlcy5nZXROYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShuYW1lKSk7Ci0JCW1nci5zZXRBdHRyaWJ1dGVNYW5hZ2VyKG5ldyBSYW5nZVNldChpZCksIGF0dHJNZ3IpOwotCQlmaXJlUnVudGltZU5ld01hY2hpbmVFdmVudChldmVudEZhY3RvcnkubmV3UnVudGltZU5ld01hY2hpbmVFdmVudChybUlELCBtZ3IpKTsKLQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19UUkFDSU5HLCAiUlRTIHswfTogbmV3IG1hY2hpbmUgI3sxfSIsIHJtQ29uZmlndXJhdGlvbi5nZXROYW1lKCksIGlkKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgUk0gdG8gY3JlYXRlIGEgbmV3IG5vZGUuCi0JICogQHBhcmFtIHBhcmVudElEIFRoZSBJRCBvZiB0aGUgbWFjaGluZSB0aGUgbm9kZSBiZWxvbmdzIHRvCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG5vZGUKLQkgKiBAcGFyYW0gbnVtYmVyIHRoZSBudW1iZXIgb2YgdGhlIG5vZGUgKHJhbmspCi0JICogQHJldHVybiB0aGUgaWQgb2YgdGhlIG5ldyBub2RlCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOb2RlKFN0cmluZyBwYXJlbnRJRCwgU3RyaW5nIG5hbWUsIGludCBudW1iZXIpIHsKLQkJU3RyaW5nIGlkID0gZ2VuZXJhdGVJRCgpOwotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBtZ3IgPSBuZXcgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoTm9kZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE5vZGVBdHRyaWJ1dGVzLlN0YXRlLlVQKSk7Ci0JCXRyeSB7Ci0JCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShOb2RlQXR0cmlidXRlcy5nZXROdW1iZXJBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG51bWJlcikpOwotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFRoaXMgZXhjZXB0aW9uIGlzIG5vdCBwb3NzaWJsZSwgc2luY2UgbnVtYmVyIGlzIGFsd2F5cyB2YWxpZC4KLQkJCSAqLwotCQkJVG9vbHNSTVBsdWdpbi5sb2coZSk7Ci0JCQlhc3NlcnQgZmFsc2U7Ci0JCX0KLQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0TmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobmFtZSkpOwotCQltZ3Iuc2V0QXR0cmlidXRlTWFuYWdlcihuZXcgUmFuZ2VTZXQoaWQpLCBhdHRyTWdyKTsKLQkJZmlyZVJ1bnRpbWVOZXdOb2RlRXZlbnQoZXZlbnRGYWN0b3J5Lm5ld1J1bnRpbWVOZXdOb2RlRXZlbnQocGFyZW50SUQsIG1ncikpOwotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX1RSQUNJTkcsICJSVFMgezB9OiBuZXcgbm9kZSAjezF9Iiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSwgaWQpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBSTSB0byBjcmVhdGUgYSBuZXcgcXVldWUuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcXVldWUKLQkgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgbmV3IHF1ZXVlCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVRdWV1ZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgaWQgPSBnZW5lcmF0ZUlEKCk7Ci0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IG5ldyBFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShRdWV1ZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKFF1ZXVlQXR0cmlidXRlcy5TdGF0ZS5OT1JNQUwpKTsKLQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0TmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobmFtZSkpOwotCQltZ3Iuc2V0QXR0cmlidXRlTWFuYWdlcihuZXcgUmFuZ2VTZXQoaWQpLCBhdHRyTWdyKTsKLQkJZmlyZVJ1bnRpbWVOZXdRdWV1ZUV2ZW50KGV2ZW50RmFjdG9yeS5uZXdSdW50aW1lTmV3UXVldWVFdmVudChybUlELCBtZ3IpKTsKLQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19UUkFDSU5HLCAiUlRTIHswfTogbmV3IHF1ZXVlICN7MX0iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IFJNIHRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzLgotCSAqCi0JICogQHBhcmFtIHBhcmVudElEIHRoZSBpZCBvZiB0aGUgam9iIHRoZSBwcm9jZXNzIGJlbG9uZ3MgdG8KLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggKHJhbmspIG9mIHRoZSBwcm9jZXNzCi0JICogQHJldHVybiB0aGUgaWQgb2YgdGhlIG5ldyBwcm9jZXNzCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQcm9jZXNzKFN0cmluZyBwYXJlbnRJRCwgU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewotCQlTdHJpbmcgaWQgPSBnZW5lcmF0ZUlEKCk7Ci0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIG1nciA9IG5ldyBFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCi0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5TVEFSVElORykpOwotCQl0cnkgewotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0SW5kZXhBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGluZGV4KSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIG5vdCBwb3NzaWJsZQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCX0KLQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0Tm9kZUlkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShwYXJlbnRJRCkpOwotCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShFbGVtZW50QXR0cmlidXRlcy5nZXROYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShuYW1lKSk7Ci0JCW1nci5zZXRBdHRyaWJ1dGVNYW5hZ2VyKG5ldyBSYW5nZVNldChpZCksIGF0dHJNZ3IpOwotCQlmaXJlUnVudGltZU5ld1Byb2Nlc3NFdmVudChldmVudEZhY3RvcnkubmV3UnVudGltZU5ld1Byb2Nlc3NFdmVudChwYXJlbnRJRCwgbWdyKSk7Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfVFJBQ0lORywgIlJUUyB7MH06IG5ldyBwcm9jZXNzICN7MX0iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhbmdlUHJvY2VzcyhTdHJpbmcgcHJvY2Vzc0lELCBBdHRyaWJ1dGVNYW5hZ2VyIGNoYW5nZWRBdHRyTWdyKSB7Ci0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlcyhjaGFuZ2VkQXR0ck1nci5nZXRBdHRyaWJ1dGVzKCkpOwotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlbGVtZW50QXR0cnMgPSBuZXcgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJZWxlbWVudEF0dHJzLnNldEF0dHJpYnV0ZU1hbmFnZXIobmV3IFJhbmdlU2V0KHByb2Nlc3NJRCksIGF0dHJNZ3IpOwotCQlJUnVudGltZVByb2Nlc3NDaGFuZ2VFdmVudCBldmVudCA9IGV2ZW50RmFjdG9yeS5uZXdSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KGVsZW1lbnRBdHRycyk7Ci0JCWZpcmVSdW50aW1lUHJvY2Vzc0NoYW5nZUV2ZW50KGV2ZW50KTsKLQotCQlmb3IgKElBdHRyaWJ1dGU8PywgPywgPz4gYXR0ciA6IGNoYW5nZWRBdHRyTWdyLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfVFJBQ0lORywgIlJUUyB7MH0sIHByb2Nlc3MgI3sxfTogezJ9PXszfSIsIHJtQ29uZmlndXJhdGlvbi5nZXROYW1lKCksIHByb2Nlc3NJRCwgYXR0ci5nZXREZWZpbml0aW9uKCkuZ2V0SWQoKSwgYXR0ci5nZXRWYWx1ZUFzU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFuZ2VKb2IoU3RyaW5nIGpvYklELCBBdHRyaWJ1dGVNYW5hZ2VyIGNoYW5nZWRBdHRyTWdyKSB7Ci0JCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1nciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCWF0dHJNZ3IuYWRkQXR0cmlidXRlcyhjaGFuZ2VkQXR0ck1nci5nZXRBdHRyaWJ1dGVzKCkpOwotCQlFbGVtZW50QXR0cmlidXRlTWFuYWdlciBlbGVtZW50QXR0cnMgPSBuZXcgRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJZWxlbWVudEF0dHJzLnNldEF0dHJpYnV0ZU1hbmFnZXIobmV3IFJhbmdlU2V0KGpvYklEKSwgYXR0ck1ncik7Ci0JCUlSdW50aW1lSm9iQ2hhbmdlRXZlbnQgZXZlbnQgPSBldmVudEZhY3RvcnkubmV3UnVudGltZUpvYkNoYW5nZUV2ZW50KGVsZW1lbnRBdHRycyk7Ci0JCWZpcmVSdW50aW1lSm9iQ2hhbmdlRXZlbnQoZXZlbnQpOwotCi0JCWZvciAoSUF0dHJpYnV0ZTw/LCA/LCA/PiBhdHRyIDogY2hhbmdlZEF0dHJNZ3IuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19UUkFDSU5HLCAiUlRTIHswfSwgam9iICN7MX06IHsyfT17M30iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBqb2JJRCwgYXR0ci5nZXREZWZpbml0aW9uKCkuZ2V0SWQoKSwgYXR0ci5nZXRWYWx1ZUFzU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFuZ2VOb2RlKFN0cmluZyBub2RlSUQsIEF0dHJpYnV0ZU1hbmFnZXIgY2hhbmdlZEF0dHJNZ3IpIHsKLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJYXR0ck1nci5hZGRBdHRyaWJ1dGVzKGNoYW5nZWRBdHRyTWdyLmdldEF0dHJpYnV0ZXMoKSk7Ci0JCUVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyIGVsZW1lbnRBdHRycyA9IG5ldyBFbGVtZW50QXR0cmlidXRlTWFuYWdlcigpOwotCQllbGVtZW50QXR0cnMuc2V0QXR0cmlidXRlTWFuYWdlcihuZXcgUmFuZ2VTZXQobm9kZUlEKSwgYXR0ck1ncik7Ci0JCUlSdW50aW1lTm9kZUNoYW5nZUV2ZW50IGV2ZW50ID0gZXZlbnRGYWN0b3J5Lm5ld1J1bnRpbWVOb2RlQ2hhbmdlRXZlbnQoZWxlbWVudEF0dHJzKTsKLQkJZmlyZVJ1bnRpbWVOb2RlQ2hhbmdlRXZlbnQoZXZlbnQpOwotCi0JCWZvciAoSUF0dHJpYnV0ZTw/LCA/LCA/PiBhdHRyIDogY2hhbmdlZEF0dHJNZ3IuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19UUkFDSU5HLCAiUlRTIHswfSwgbm9kZSAjezF9OiB7Mn09ezN9Iiwgcm1Db25maWd1cmF0aW9uLmdldE5hbWUoKSwgbm9kZUlELCBhdHRyLmdldERlZmluaXRpb24oKS5nZXRJZCgpLCBhdHRyLmdldFZhbHVlQXNTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNoYW5nZU1hY2hpbmUoU3RyaW5nIG1hY2hpbmVJRCwgQXR0cmlidXRlTWFuYWdlciBjaGFuZ2VkQXR0ck1ncikgewotCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZXMoY2hhbmdlZEF0dHJNZ3IuZ2V0QXR0cmlidXRlcygpKTsKLQkJRWxlbWVudEF0dHJpYnV0ZU1hbmFnZXIgZWxlbWVudEF0dHJzID0gbmV3IEVsZW1lbnRBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCWVsZW1lbnRBdHRycy5zZXRBdHRyaWJ1dGVNYW5hZ2VyKG5ldyBSYW5nZVNldChtYWNoaW5lSUQpLCBhdHRyTWdyKTsKLQkJSVJ1bnRpbWVNYWNoaW5lQ2hhbmdlRXZlbnQgZXZlbnQgPSBldmVudEZhY3RvcnkubmV3UnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChlbGVtZW50QXR0cnMpOwotCQlmaXJlUnVudGltZU1hY2hpbmVDaGFuZ2VFdmVudChldmVudCk7Ci0KLQkJZm9yIChJQXR0cmlidXRlPD8sID8sID8+IGF0dHIgOiBjaGFuZ2VkQXR0ck1nci5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX1RSQUNJTkcsICJSVFMgezB9LCBtYWNoaW5lICN7MX06IHsyfT17M30iLCBybUNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLCBtYWNoaW5lSUQsIGF0dHIuZ2V0RGVmaW5pdGlvbigpLmdldElkKCksIGF0dHIuZ2V0VmFsdWVBc1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSBuZXcgZWxlbWVudCBJRAotCSAqCi0JICogQHJldHVybiBuZXcgZWxlbWVudCBJRAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVJRCgpIHsKLQkJLy8gVE9ETzogQWRkIFJNIGlkPwotCQlTdHJpbmcgaWQgPSBuZXh0SUQudG9TdHJpbmcoKTsKLQkJbmV4dElEKys7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIGpvYiBuYW1lCi0JICoKLQkgKiBAcmV0dXJuIGpvYiBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZUpvYk5hbWUoKSB7Ci0JCXJldHVybiAiam9iIiArIGpvYk51bWJlcisrOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElSZW1vdGVQcm9jZXNzQnVpbGRlciBjcmVhdGVQcm9jZXNzQnVpbGRlcihMaXN0PFN0cmluZz4gY29tbWFuZCkgewotCQlyZXR1cm4gcmVtb3RlU2VydmljZXMuZ2V0UHJvY2Vzc0J1aWxkZXIoY29ubmVjdGlvbiwgY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIElSZW1vdGVQcm9jZXNzQnVpbGRlciBjcmVhdGVQcm9jZXNzQnVpbGRlcihMaXN0PFN0cmluZz4gY29tbWFuZCwgU3RyaW5nIHdvcmtkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlGaWxlU3RvcmUgZGlyZWN0b3J5ID0gbnVsbDsKLQkJIC8qIAotCQkgICogSWdub3JlIHdvcmtkaXIgaWYgd2UncmUgdXNpbmcgUlNFIHRvIGF2b2lkIHRyaWdnZXJpbmcgYnVnICMyNTg0ODEKLQkJICAqLwotCQlpZiAoIWdldFJlbW90ZVNlcnZpY2VzKCkuZ2V0SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuUlNFUmVtb3RlU2VydmljZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJUmVtb3RlRmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSByZW1vdGVTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcihjb25uZWN0aW9uKTsKLQkJCWlmIChmaWxlTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZGlyZWN0b3J5ID0gZmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2UobmV3IFBhdGgod29ya2RpciksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9Ci0JCUlSZW1vdGVQcm9jZXNzQnVpbGRlciBwcm9jZXNzQnVpbGRlciA9IHJlbW90ZVNlcnZpY2VzLmdldFByb2Nlc3NCdWlsZGVyKGNvbm5lY3Rpb24sIGNvbW1hbmQpOwotCQlwcm9jZXNzQnVpbGRlci5kaXJlY3RvcnkoZGlyZWN0b3J5KTsKLQkJcmV0dXJuIHByb2Nlc3NCdWlsZGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um1JRCgpIHsKLQkJcmV0dXJuIHJtSUQ7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbiBnZXRSbUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBybUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIElSZW1vdGVDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uOwotCX0KLQotCXB1YmxpYyBJUmVtb3RlU2VydmljZXMgZ2V0UmVtb3RlU2VydmljZXMoKSB7Ci0JCXJldHVybiByZW1vdGVTZXJ2aWNlczsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uIHJldHJpZXZlRWZmZWN0aXZlVG9vbFJtQ29uZmlndXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ydHN5c3RlbS9BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3J0c3lzdGVtL0Fic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlYmQ3Ny4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3J0c3lzdGVtL0Fic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXJyYXlBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQm9vbGVhbkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5Ub29sc1JNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLkFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUubGludXguQXJndW1lbnRQYXJzZXI7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIGpvYiB0aGF0IGNvbnRyb2xzIHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBsYXVuY2hlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHRvb2wuCi0gKiBUaGlzIGNsYXNzIGlzIGRpZmZlcmVudCBmcm9tIHtAbGluayBBYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2J9IGJlY2F1c2UgaXQgaXMgbm90IGFpbWVkIHRvd2FyZHMgcGFyc2luZyBvdXRwdXQgb2YgdGhlCi0gKiB0b29sIGNhbGxlZCBieSBjb21tYW5kIGxpbmUsIGJ1dCB0byBwcmVwYXJlIGEgd2hvbGUgbGF1bmNoIGVudmlyb25tZW50IGZvciB0aGUgY29tbWFuZCBsaW5lIHRvb2wsIGFsc28gc3VwcG9ydGluZwotICogc2VtYW50aWNzIG9mIHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBsYXVuY2hlci4KLSAqCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJVG9vbFJ1bnRpbWVTeXN0ZW1Kb2IgewotCi0JcHJvdGVjdGVkIFN0cmluZyBqb2JJRDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXVlSUQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSVJlbW90ZVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1ncjsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSBydFN5c3RlbTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRlcm1pbmF0ZUpvYkZsYWcgPSBmYWxzZTsKLQotCXB1YmxpYyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iKFN0cmluZyBqb2JJRCwgU3RyaW5nIHF1ZXVlSUQsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHJ0U3lzdGVtLAotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLmF0dHJNZ3IgPSBhdHRyTWdyOwotCQl0aGlzLnJ0U3lzdGVtID0gcnRTeXN0ZW07Ci0JCXRoaXMuam9iSUQgPSBqb2JJRDsKLQkJdGhpcy5xdWV1ZUlEID0gcXVldWVJRDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciA9PSBJVG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVldWVJRCgpIHsKLQkJcmV0dXJuIHF1ZXVlSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2JJRCgpIHsKLQkJcmV0dXJuIGpvYklEOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIGdldFJ0U3lzdGVtKCkgewotCQlyZXR1cm4gcnRTeXN0ZW07Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0ck1ncigpIHsKLQkJcmV0dXJuIGF0dHJNZ3I7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7Ci0JCXJldHVybiBkZWJ1ZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUJvb2xlYW5BdHRyaWJ1dGUgZGVidWdBdHRyID0gYXR0ck1nci5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXREZWJ1Z0ZsYWdBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAoZGVidWdBdHRyICE9IG51bGwpIHsKLQkJCWRlYnVnID0gZGVidWdBdHRyLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJCi0JCWNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuU1RBUlRFRCk7Ci0KLQkJaWYgKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXVuY2ggYXR0cmlidXRlczoiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFycmF5W10gPSBnZXRBdHRyTWdyKCkudG9TdHJpbmdBcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihhcnJheVtpXSk7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogaGFuZGxlIHByZXBhcmUiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvUHJlcGFyZUV4ZWN1dGlvbihtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQljaGFuZ2VKb2JTdGF0ZShKb2JBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9QcmVwYXJlRXhlY3V0aW9uLCBlKTsKLQkJfQotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQljaGFuZ2VKb2JTdGF0ZShKb2JBdHRyaWJ1dGVzLlN0YXRlLlRFUk1JTkFURUQpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfVXNlckNhbmNlbGVkKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvKgotCQkJICogQ2FsY3VsYXRlIGNvbW1hbmQgYW5kIGVudmlyb25tZW50LgotCQkJICovCi0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiQWJvdXQgdG8gcnVuIFJUUyBqb2IgI3swfS4iLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3Q8U3RyaW5nPiBjb21tYW5kID0gbnVsbDsKLQkJCU1hcDxTdHJpbmcsU3RyaW5nPiBlbnZpcm9ubWVudCA9IG51bGw7Ci0JCQlTdHJpbmcgZGlyZWN0b3J5ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJQXR0cmlidXRlTWFuYWdlciBiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlciA9IHJldHJpZXZlQmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoKTsKLQkJCQllbnZpcm9ubWVudCA9IHJldHJpZXZlRW52aXJvbm1lbnQoYmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIpOwotCQkJCWRpcmVjdG9yeSA9IHJldHJpZXZlV29ya2luZ0RpcmVjdG9yeShiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcik7Ci0KLQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGNvbW1hbmRTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyID0gcmV0cmlldmVDb21tYW5kU3Vic3RpdHV0aW9uQXR0cmlidXRlcyhiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlciwgZGlyZWN0b3J5LCBlbnZpcm9ubWVudCk7Ci0JCQkJaWYgKGlzRGVidWcoKSkgewotCQkJCQljb21tYW5kID0gcmV0cmlldmVDcmVhdGVEZWJ1Z0NvbW1hbmQoY29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbW1hbmQgPSByZXRyaWV2ZUNyZWF0ZUxhdW5jaENvbW1hbmQoY29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIpOwotCQkJCX0KLQkJCQlpZiAoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lORykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF2YWlsYWJsZSBtYWNyb3MgZm9yIGVudmlyb25tZW50IGFuZCB3b3JrIGRpcmVjdG9yeToiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKElBdHRyaWJ1dGU8PywgPywgPz4gYXR0ciA6IGJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCIgIHswfT17MX0iLCBhdHRyLmdldERlZmluaXRpb24oKS5nZXRJZCgpLCBhdHRyLmdldFZhbHVlQXNTdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBdmFpbGFibGUgbWFjcm9zIGZvciBjb21tYW5kOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoSUF0dHJpYnV0ZTw/LCA/LCA/PiBhdHRyIDogY29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIiAgezB9PXsxfSIsIGF0dHIuZ2V0RGVmaW5pdGlvbigpLmdldElkKCksIGF0dHIuZ2V0VmFsdWVBc1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVudmlyb25tZW50IHZhcmlhYmxlczoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnYgOiBlbnZpcm9ubWVudC5lbnRyeVNldCgpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIiAgZXhwb3J0IHswfT17MX0iLCBlbnYuZ2V0S2V5KCksIGVudi5nZXRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIldvcmsgZGlyZWN0b3J5OiB7MH0iLCBkaXJlY3RvcnkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlBcmd1bWVudFBhcnNlciBhcmd1bWVudFBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihjb21tYW5kKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDb21tYW5kOiB7MH0iLCBhcmd1bWVudFBhcnNlci5nZXRDb21tYW5kTGluZShmYWxzZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9DcmVhdGVDb21tYW5kLCBlKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBoYW5kbGUgYmVmb3JlIGV4ZWN1dGlvbiIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRvQmVmb3JlRXhlY3V0aW9uKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2hhbmdlSm9iU3RhdGUoSm9iQXR0cmlidXRlcy5TdGF0ZS5FUlJPUik7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0JlZm9yZUV4ZWN1dGlvbiwgZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuVEVSTUlOQVRFRCk7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfVXNlckNhbmNlbGVkKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEV4ZWN1dGUgcmVtb3RlIGNvbW1hbmQgZm9yIHRoZSBqb2IuCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJSVJlbW90ZVByb2Nlc3NCdWlsZGVyIHByb2Nlc3NCdWlsZGVyID0gcnRTeXN0ZW0uY3JlYXRlUHJvY2Vzc0J1aWxkZXIoY29tbWFuZCwgZGlyZWN0b3J5KTsKLQkJCQlwcm9jZXNzQnVpbGRlci5lbnZpcm9ubWVudCgpLnB1dEFsbChlbnZpcm9ubWVudCk7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3RhcnQiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9jZXNzID0gcHJvY2Vzc0J1aWxkZXIuc3RhcnQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljaGFuZ2VKb2JTdGF0ZShKb2JBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb29sc1JNUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgTWVzc2FnZXMuQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0ZUNvbW1hbmQsIGUpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IGhhbmRsZSBzdGFydCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRvRXhlY3V0aW9uU3RhcnRlZChtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25TdGFydGVkLCBlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJY2hhbmdlSm9iU3RhdGUoSm9iQXR0cmlidXRlcy5TdGF0ZS5URVJNSU5BVEVEKTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBUb29sc1JNUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgTWVzc2FnZXMuQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYl9Vc2VyQ2FuY2VsZWQpOwotCQkJfQotCi0JCQljaGFuZ2VKb2JTdGF0ZShKb2JBdHRyaWJ1dGVzLlN0YXRlLlJVTk5JTkcpOwotCi0JCQl0cnkgewotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXQgdG8gZmluaXNoIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQkJZG9XYWl0RXhlY3V0aW9uKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2hhbmdlSm9iU3RhdGUoSm9iQXR0cmlidXRlcy5TdGF0ZS5FUlJPUik7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX1dhaXRFeGVjdXRpb24sIGUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQljaGFuZ2VKb2JTdGF0ZShKb2JBdHRyaWJ1dGVzLlN0YXRlLlRFUk1JTkFURUQpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX1VzZXJDYW5jZWxlZCk7Ci0JCQl9Ci0KLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HLCAiUlRTIGpvYiAjezB9OiBleGl0IHZhbHVlIHsxfSIsIGpvYklELCBwcm9jZXNzLmV4aXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCS8vCQkJdHJ5IHsKLQkJCS8vCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuQ09NTUFORF9UUkFDSU5HLCAiUlRTIGpvYiAjezB9OiB3YWl0IHRvIGZpbmlzaCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8JCQkJcHJvY2Vzcy53YWl0Rm9yKCk7Ci0JCQkvLwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vCQkJCWNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpOwotCQkJLy8JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIkZhaWxlZCB3aGlsZSB0ZXJtaW5hdGluZyB0aGUgY29tbWFuZC4iLCBlKTsKLQkJCS8vCQkJfQotCi0JCQl0cnkgewotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IGhhbmRsZSBmaW5pc2giLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkb0V4ZWN1dGlvbkZpbmlzaGVkKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2hhbmdlSm9iU3RhdGUoSm9iQXR0cmlidXRlcy5TdGF0ZS5FUlJPUik7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0V4ZWN1dGlvbkZpbmlzaGVkLCBlKTsKLQkJCX0KLQotCQkJY2hhbmdlSm9iU3RhdGUoSm9iQXR0cmlidXRlcy5TdGF0ZS5URVJNSU5BVEVEKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2JfU3VjY2VzcywgcHJvY2Vzcy5leGl0VmFsdWUoKSkpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBjbGVhbnVwIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQlmaW5hbCBJUmVzb3VyY2VNYW5hZ2VyIHJtID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRTeXN0ZW0uZ2V0Um1JRCgpKTsKLQkJCWlmIChybSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgSVBRdWV1ZSBxdWV1ZSA9IHJtLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpOwotCQkJCWlmIChxdWV1ZSAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIElQSm9iIGlwSm9iID0gcXVldWUuZ2V0Sm9iQnlJZChnZXRKb2JJRCgpKTsKLQkJCQkJaWYgKGlwSm9iICE9IG51bGwpIHsKLQkJCQkJCXN3aXRjaCAoaXBKb2IuZ2V0U3RhdGUoKSkgewotCQkJCQkJY2FzZSBURVJNSU5BVEVEOgotCQkJCQkJY2FzZSBFUlJPUjoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgUEVORElORzoKLQkJCQkJCWNhc2UgUlVOTklORzoKLQkJCQkJCWNhc2UgU1RBUlRFRDoKLQkJCQkJCWNhc2UgU1VTUEVOREVEOgotCQkJCQkJY2FzZSBVTktOT1dOOgotCQkJCQkJCWNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUuVEVSTUlOQVRFRCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkb0V4ZWN1dGlvbkNsZWFuVXAobW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb1ByZXBhcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0aW9uQ2xlYW5VcChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9XYWl0RXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvbkZpbmlzaGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvblN0YXJ0ZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGRvQmVmb3JlRXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb1Rlcm1pbmF0ZUpvYigpOwotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgam9iIHN0YXRlLgotCSAqIEBwYXJhbSBuZXdTdGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoYW5nZUpvYlN0YXRlKEpvYkF0dHJpYnV0ZXMuU3RhdGUgbmV3U3RhdGUpIHsKLQkJRW51bWVyYXRlZEF0dHJpYnV0ZTxKb2JBdHRyaWJ1dGVzLlN0YXRlPiBzdGF0ZSA9IEpvYkF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG5ld1N0YXRlKTsKLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShzdGF0ZSk7Ci0JCXJ0U3lzdGVtLmNoYW5nZUpvYihqb2JJRCwgYXR0ck1hbmFnZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGxhdW5jaC4KLQkgKiBAcGFyYW0gYmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXRyaWV2ZVdvcmtpbmdEaXJlY3RvcnkoQXR0cmlidXRlTWFuYWdlciBiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcikgewotCQkvKgotCQkgKiBUT0RPIFJldHVybiBJUGF0aCBpbnN0ZWFkIG9mIHN0cmluZwotCQkgKi8KLQkJU3RyaW5nIHdvcmtkaXIgPSBhdHRyTWdyLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldFdvcmtpbmdEaXJlY3RvcnlBdHRyaWJ1dGVEZWZpbml0aW9uKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBuZXdXb3JrZGlyID0gcmVwbGFjZVZhcmlhYmxlcyh3b3JrZGlyLCBiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcik7Ci0JCWlmICghIHdvcmtkaXIuZXF1YWxzKG5ld1dvcmtkaXIpKSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiQ2hhbmdlZCB3b3JrIGRpcmVjdG9yeSBmcm9tIHswfSB0byB7MX0iLCB3b3JrZGlyLCBuZXdXb3JrZGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJd29ya2RpciA9IG5ld1dvcmtkaXI7Ci0JCX0KLQkJcmV0dXJuIHdvcmtkaXI7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQkgKiBAcGFyYW0gYmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZyxTdHJpbmc+IHJldHJpZXZlRW52aXJvbm1lbnQoQXR0cmlidXRlTWFuYWdlciBiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JCS8qCi0JCSAqIEZpcnN0LCBnZXQgZW52aXJvbm1lbnQgZnJvbSB0aGUgYXR0cmlidXRlIG1hbmFnZXIuCi0JCSAqLwotCQlyZXRyaWV2ZUVudmlyb25tZW50RnJvbUF0dHJNcmcoZW52aXJvbm1lbnRNYXApOwotCi0JCS8qCi0JCSAqIFRoZW4sIGdldCBleHRyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIHRoZSB0b29sLgotCQkgKi8KLQkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0cmFFbnZpcm9ubWVudE1hcCA9IGRvUmV0cmlldmVUb29sRW52aXJvbm1lbnQoKTsKLQkJaWYgKGV4dHJhRW52aXJvbm1lbnRNYXAgIT0gbnVsbCkgewotCQkJZW52aXJvbm1lbnRNYXAucHV0QWxsKGV4dHJhRW52aXJvbm1lbnRNYXApOwotCQl9Ci0KLQkJLyoKLQkJICogRG8gc3Vic3RpdHV0aW9uIG9uIGVhY2ggZW52aXJvbm1lbnQgdmFyaWFibGUuCi0JCSAqLwotCQlmb3IgKEl0ZXJhdG9yPEVudHJ5PFN0cmluZywgU3RyaW5nPj4gaXRlcmF0b3IgPSBlbnZpcm9ubWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnYgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbnYuZ2V0VmFsdWUoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHJlcGxhY2VWYXJpYWJsZXModmFsdWUsIGJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyKTsKLQkJCWlmICghIHZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiQ2hhbmdlZCBlbnZpcm9ubWVudCAnezB9PXsxfScgdG8gJ3swfT17Mn0iLCBlbnYuZ2V0S2V5KCksIHZhbHVlLCBuZXdWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnYuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVudmlyb25tZW50TWFwOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgYXJlIHNwZWNpZmljIGZvciB0aGUgdG9vbC4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZG9SZXRyaWV2ZVRvb2xFbnZpcm9ubWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHJpdmF0ZSB2b2lkIHJldHJpZXZlRW52aXJvbm1lbnRGcm9tQXR0ck1yZygKLQkJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50TWFwKSB7Ci0JCUFycmF5QXR0cmlidXRlPFN0cmluZz4gZW52aXJvbm1lbnRBdHRyaWJ1dGUgPSBnZXRBdHRyTWdyKCkuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0RW52aXJvbm1lbnRBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAoZW52aXJvbm1lbnRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJTGlzdDxTdHJpbmc+IGVudmlyb25tZW50ID0gZW52aXJvbm1lbnRBdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKLQkJCWZvciAoU3RyaW5nIGVudHJ5IDogZW52aXJvbm1lbnQpIHsKLQkJCQlpbnQgaSA9IGVudHJ5LmluZGV4T2YoJz0nKTsKLQkJCQlTdHJpbmcga2V5ID0gZW50cnkuc3Vic3RyaW5nKDAsIGkpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGVudHJ5LnN1YnN0cmluZyhpKzEpOwotCQkJCWVudmlyb25tZW50TWFwLnB1dChrZXksIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIGF0dHJpYnV0ZXMgdXNlZCB0byBleHBhbmQgbWFjcm9zLgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFuYWdlciByZXRyaWV2ZUJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBdHRyaWJ1dGVNYW5hZ2VyIG5ld0F0dHJpYnV0ZU1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcihnZXRBdHRyTWdyKCkuZ2V0QXR0cmlidXRlcygpKTsKLQotCQkvKgotCQkgKiBGaXJzdCwgYWRkIGFsbCBkZWZhdWx0IGF0dHJpYnV0ZXMgdGhhdCBhcmUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgbGF1bmNoLgotCQkgKiBJZiB0aGV5IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgbGF1bmNoIGF0dHJpYnV0ZXMsIHRoZW4gdXNlIGRlZmF1bHQgdmFsdWUuCi0JCSAqLwotCQlmb3IgKElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHJpYnV0ZURlZmluaXRpb24gOiBnZXREZWZhdWx0U3Vic3RpdHV0aW9uQXR0cmlidXRlcygpKSB7Ci0JCQlJQXR0cmlidXRlPD8sID8sID8+IGF0dHJpYnV0ZSA9IG5ld0F0dHJpYnV0ZU1hbmFnZXIuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0SWQoKSk7Ci0JCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJCQkvLyBDcmVhdGUgb25lIHdpdGggZGVmYXVsdCB2YWx1ZS4KLQkJCQl0cnkgewotCQkJCQluZXdBdHRyaWJ1dGVNYW5hZ2VyLmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVEZWZpbml0aW9uLmNyZWF0ZSgpKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9EZWZhdWx0QXR0cmlidXRlVmFsdWUsIGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0TmFtZSgpKSwgZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFRoZW4sIGFkZCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNwZWNpZmljIGZvciB0aGUgdG9vbC4KLQkJICovCi0JCUlBdHRyaWJ1dGU8Pyw/LD8+IGV4dHJhQXR0cmlidXRlc1tdID0gZG9SZXRyaWV2ZVRvb2xCYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlcygpOwotCQlpZiAoZXh0cmFBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCW5ld0F0dHJpYnV0ZU1hbmFnZXIuYWRkQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld0F0dHJpYnV0ZU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGV4cGFuZCBtYWNyb3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIHRoZSB0b29sLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBJQXR0cmlidXRlPD8sID8sID8+W10gZG9SZXRyaWV2ZVRvb2xCYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQSBsaXN0IG9mIGFsbCBhdHRyaWJ1dGVzIGRlZmluaXRpb25zIGZyb20gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwYW5kIG1hY3Jvcy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+W10gZ2V0RGVmYXVsdFN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXsKLQkJCQlKb2JBdHRyaWJ1dGVzLmdldEVudmlyb25tZW50QXR0cmlidXRlRGVmaW5pdGlvbigpLAotCQkJCUpvYkF0dHJpYnV0ZXMuZ2V0RXhlY3V0YWJsZU5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCksCi0JCQkJSm9iQXR0cmlidXRlcy5nZXRFeGVjdXRhYmxlUGF0aEF0dHJpYnV0ZURlZmluaXRpb24oKSwKLQkJCQlKb2JBdHRyaWJ1dGVzLmdldEpvYklkQXR0cmlidXRlRGVmaW5pdGlvbigpLAotCQkJCUpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCksCi0JCQkJSm9iQXR0cmlidXRlcy5nZXRQcm9ncmFtQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpLAotCQkJCUpvYkF0dHJpYnV0ZXMuZ2V0UXVldWVJZEF0dHJpYnV0ZURlZmluaXRpb24oKSwKLQkJCQlKb2JBdHRyaWJ1dGVzLmdldFN1YklkQXR0cmlidXRlRGVmaW5pdGlvbigpLAotCQkJCUpvYkF0dHJpYnV0ZXMuZ2V0VXNlcklkQXR0cmlidXRlRGVmaW5pdGlvbigpLAotCQkJCUpvYkF0dHJpYnV0ZXMuZ2V0V29ya2luZ0RpcmVjdG9yeUF0dHJpYnV0ZURlZmluaXRpb24oKQotCQl9OwotCX0KLQotCWZpbmFsIHByb3RlY3RlZCBBdHRyaWJ1dGVNYW5hZ2VyIHJldHJpZXZlQ29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyLAotCQkJU3RyaW5nIGRpcmVjdG9yeSwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkgewotCQlBdHRyaWJ1dGVNYW5hZ2VyIG5ld0F0dHJpYnV0ZU1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcihiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlci5nZXRBdHRyaWJ1dGVzKCkpOwotCi0JCS8qCi0JCSAqIEFkZCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNwZWNpZmljIGZvciB0aGUgdG9vbC4KLQkJICovCi0JCUlBdHRyaWJ1dGU8Pyw/LD8+IGV4dHJhQXR0cmlidXRlc1tdID0gZG9SZXRyaWV2ZVRvb2xDb21tYW5kU3Vic3RpdHV0aW9uQXR0cmlidXRlcyhiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlciwgZGlyZWN0b3J5LCBlbnZpcm9ubWVudCk7Ci0JCWlmIChleHRyYUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJbmV3QXR0cmlidXRlTWFuYWdlci5hZGRBdHRyaWJ1dGVzKGV4dHJhQXR0cmlidXRlcyk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3QXR0cmlidXRlTWFuYWdlcjsKLQl9Ci0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJQXR0cmlidXRlPD8sID8sID8+W10gZG9SZXRyaWV2ZVRvb2xDb21tYW5kU3Vic3RpdHV0aW9uQXR0cmlidXRlcygKLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIsCi0JCQlTdHJpbmcgZGlyZWN0b3J5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KTsKLQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gcmV0cmlldmVDcmVhdGVMYXVuY2hDb21tYW5kKEF0dHJpYnV0ZU1hbmFnZXIgc3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBDcmVhdGUgbGF1bmNoIGNvbW1hbmQuIElmIHRoZXJlIGlzIG5vIGxhdW5jaCBjb21tYW5kLCBzaW1wbHkgbGF1bmNoIHRoZSBleGVjdXRhYmxlLgotCQkgKi8KLQkJQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uIGVmZmVjdGl2ZUNvbmZpZ3VyYXRpb24gPSBnZXRSdFN5c3RlbSgpLnJldHJpZXZlRWZmZWN0aXZlVG9vbFJtQ29uZmlndXJhdGlvbigpOwotCQlMaXN0PFN0cmluZz4gY29tbWFuZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAoISBlZmZlY3RpdmVDb25maWd1cmF0aW9uLmhhc0xhdW5jaENtZCgpKSB7Ci0JCQkvLyBGYWxsIGJhY2sgdG8gY2FsbGluZyB0aGUgZXhlY3V0YWJsZS4KLQkJCVN0cmluZ0F0dHJpYnV0ZSBleGVjUGF0aCA9IGdldEF0dHJNZ3IoKS5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRFeGVjdXRhYmxlUGF0aEF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCQlBcnJheUF0dHJpYnV0ZTxTdHJpbmc+IGFyZ3VtZW50cyA9IGdldEF0dHJNZ3IoKS5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRQcm9ncmFtQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCWNvbW1hbmQuYWRkKGV4ZWNQYXRoLmdldFZhbHVlKCkpOwotCQkJY29tbWFuZC5hZGRBbGwoYXJndW1lbnRzLmdldFZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJLy8gVXNlIHRoZSB0b29sIHRvIGxhdW5jaCBleGVjdXRhYmxlCi0JCQlTdHJpbmcgbGF1bmNoQ29tbWFuZCA9IGVmZmVjdGl2ZUNvbmZpZ3VyYXRpb24uZ2V0TGF1bmNoQ21kKCk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGxhdW5jaENvbW1hbmQpOwotCQkJQXNzZXJ0LmlzVHJ1ZShsYXVuY2hDb21tYW5kLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJbGF1bmNoQ29tbWFuZCA9IHJlcGxhY2VWYXJpYWJsZXMobGF1bmNoQ29tbWFuZCwgc3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcik7Ci0JCQlBcmd1bWVudFBhcnNlciBhcmd1bWVudFBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihsYXVuY2hDb21tYW5kKTsKLQkJCWNvbW1hbmQgPSBhcmd1bWVudFBhcnNlci5nZXRUb2tlbkxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHJldHJpZXZlQ3JlYXRlRGVidWdDb21tYW5kKEF0dHJpYnV0ZU1hbmFnZXIgc3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBDcmVhdGUgZGVidWcgY29tbWFuZC4gSWYgdGhlcmUgaXMgbm8gZGVidWcgY29tbWFuZCwgc2ltcGx5IGxhdW5jaCB0aGUgZXhlY3V0YWJsZS4KLQkJICovCi0JCUFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiBlZmZlY3RpdmVDb25maWd1cmF0aW9uID0gZ2V0UnRTeXN0ZW0oKS5yZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKTsKLQkJTGlzdDxTdHJpbmc+IGNvbW1hbmQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKCEgZWZmZWN0aXZlQ29uZmlndXJhdGlvbi5oYXNEZWJ1Z0NtZCgpKSB7Ci0JCQkvLyBGYWxsIGJhY2sgdG8gY2FsbGluZyB0aGUgZXhlY3V0YWJsZS4KLQkJCVN0cmluZ0F0dHJpYnV0ZSBleGVjUGF0aCA9IGdldEF0dHJNZ3IoKS5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRFeGVjdXRhYmxlUGF0aEF0dHJpYnV0ZURlZmluaXRpb24oKSk7Ci0JCQlBcnJheUF0dHJpYnV0ZTxTdHJpbmc+IGFyZ3VtZW50cyA9IGdldEF0dHJNZ3IoKS5nZXRBdHRyaWJ1dGUoSm9iQXR0cmlidXRlcy5nZXRQcm9ncmFtQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJCWNvbW1hbmQuYWRkKGV4ZWNQYXRoLmdldFZhbHVlKCkpOwotCQkJY29tbWFuZC5hZGRBbGwoYXJndW1lbnRzLmdldFZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJLy8gVXNlIHRoZSB0b29sIHRvIGxhdW5jaCBleGVjdXRhYmxlCi0JCQlTdHJpbmcgZGVidWdDb21tYW5kID0gZWZmZWN0aXZlQ29uZmlndXJhdGlvbi5nZXREZWJ1Z0NtZCgpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChkZWJ1Z0NvbW1hbmQpOwotCQkJQXNzZXJ0LmlzVHJ1ZShkZWJ1Z0NvbW1hbmQudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQlkZWJ1Z0NvbW1hbmQgPSByZXBsYWNlVmFyaWFibGVzKGRlYnVnQ29tbWFuZCwgc3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcik7Ci0JCQlBcmd1bWVudFBhcnNlciBhcmd1bWVudFBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcihkZWJ1Z0NvbW1hbmQpOwotCQkJY29tbWFuZCA9IGFyZ3VtZW50UGFyc2VyLmdldFRva2VuTGlzdCgpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qCi0JICogUGF0dGVybiB0byBmaW5lZCB2YXJpYWJsZXMgYWNjb3JkaW5nIHRoZXNlIHJ1bGVzOgotCSAqIFN0YXJ0cyB3aXRoICIkeyIgYW5kIGVuZHMgd2l0aCAifSIKLQkgKiBUaGUgY29udGVudCBpcyBhIG5hbWUgYW5kIGEgc2V0IG9mIHBhcmFtZXRlcnMgc2VwYXJhdGVkIGJ5ICI6IgotCSAqIEluIHRoZSBwYXJhbWV0ZXJzLCAiXCIgbWF5IGJlIHVzZWQgdG8gcXVvdGUgZm9sbG93aW5nIGNoYXJzOiAnXCcsICd9JyBhbmQgJzonCi0JICoKLQkgKiBUT0RPIG1vdmUgdGhpcyBwYXR0ZXIgc3Vic3RpdHV0aW9uIGNvZGUgaW50byB0aGUgYXR0cmlidXRlIG1hbmFnZXIKLQkgKiBUT0RPIGVuYWJsZSB0aGUgYXR0cmlidXRlIG1hbmFnZXIgdG8gZG8gc3Vic3RpdHV0aW9uIC0+IGhhdmUgdGhpcyBmZWF0dXJlIGF2YWlsYWJsZSBvbiBlbnRpcmUgUFRQLgotCSAqLwotCXN0YXRpYyBmaW5hbCBQYXR0ZXJuIHZhcmlhYmxlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgoIi8kL3soL3crKSgiKyIoPzooPzovLy8vKXwoPzovLy99KXxbXi99XSkqIisiKS99IikucmVwbGFjZSgnLycsJ1xcJykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBhcmFtZXRlclBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIjooKD86KD86Ly8vLyl8KD86Ly8vOil8KD86Ly8vfSl8W146XSkqKSIucmVwbGFjZSgnLycsICdcXCcpKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGVyZm9ybXMgc3Vic3RpdHV0aW9uIG9mIHZhcmlhYmxlcyB1c2luZyBhdHRyaWJ1dGVzIGZyb20gdGhlIGF0dHJpYnV0ZSBtYW5hZ2VyIGFzIHZhcmlhYmxlcy4KLQkgKiBAcGFyYW0gaW5wdXQgdGhlIHN0cmluZyB3aXRoIHZhcmlhYmxlcy4KLQkgKiBAcGFyYW0gc3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcgotCSAqIEByZXR1cm4gVGhlIHN0cmluZyBhZnRlciBzdWJzdGl0dXRpb24gb2YgdmFyaWFibGVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVwbGFjZVZhcmlhYmxlcyhTdHJpbmcgaW5wdXQsIEF0dHJpYnV0ZU1hbmFnZXIgc3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlcikgewotCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG1hdGNoZXIgPSB2YXJpYWJsZVBhdHRlcm4ubWF0Y2hlcihpbnB1dCk7Ci0KLQkJaW50IGxhc3RQb3MgPSAwOwotCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLQkJCWludCBzdGFydFBvcyA9IG1hdGNoZXIuc3RhcnQoKTsKLQkJCWludCBlbmRQb3MgPSBtYXRjaGVyLmVuZCgpOwotCQkJU3RyaW5nIG5hbWUgPSBtYXRjaGVyLmdyb3VwKDEpOwotCQkJU3RyaW5nIHBhcmFtZXRlckxpc3QgPSBtYXRjaGVyLmdyb3VwKDIpOwotCQkJU3RyaW5nIHZhcmlhYmxlID0gbWF0Y2hlci5ncm91cCgpOwotCQkJb3V0cHV0LmFwcGVuZChpbnB1dC5zdWJzdHJpbmcobGFzdFBvcywgc3RhcnRQb3MpKTsKLQotCQkJLyoKLQkJCSAqIFJlc29sdmUgdmFyaWFibGUuCi0JCQkgKi8KLQkJCVN0cmluZyByZXNvbHZlZFZhbHVlID0gbnVsbDsKLQkJCUlBdHRyaWJ1dGU8Pyw/LD8+IGF0dHJpYnV0ZSA9IHN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIuZ2V0QXR0cmlidXRlKG5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIEFycmF5QXR0cmlidXRlPD8+KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFJldHJpZXZlIHBhcmFtZXRlcnMgb3IgdXNlIGRlZmF1bHRzLgotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIG9wdFN0YXJ0U3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIG9wdEVuZFN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBzdGFydFN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBlbmRTdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgc2VwYXJhdG9yU3RyID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCU1hdGNoZXIgcGFyYW1NYXRjaGVyID0gcGFyYW1ldGVyUGF0dGVybi5tYXRjaGVyKHBhcmFtZXRlckxpc3QpOwotCQkJCQlpZiAocGFyYW1NYXRjaGVyLmZpbmQoKSkgewotCQkJCQkJc3RhcnRTdHIgPSBwYXJhbU1hdGNoZXIuZ3JvdXAoMSk7Ci0JCQkJCQlpZiAocGFyYW1NYXRjaGVyLmZpbmQoKSkgewotCQkJCQkJCXNlcGFyYXRvclN0ciA9IHBhcmFtTWF0Y2hlci5ncm91cCgxKTsKLQkJCQkJCQlpZiAocGFyYW1NYXRjaGVyLmZpbmQoKSkgewotCQkJCQkJCQllbmRTdHIgPSBwYXJhbU1hdGNoZXIuZ3JvdXAoMSk7Ci0JCQkJCQkJCWlmIChwYXJhbU1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJCQlvcHRTdGFydFN0ciA9IHBhcmFtTWF0Y2hlci5ncm91cCgxKTsKLQkJCQkJCQkJCWlmIChwYXJhbU1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJCQkJb3B0RW5kU3RyID0gcGFyYW1NYXRjaGVyLmdyb3VwKDEpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogQnVpbGQgY29udGVudC4KLQkJCQkJICovCi0JCQkJCUFycmF5QXR0cmlidXRlPD8+IGFycmF5X2F0dHIgPSAoQXJyYXlBdHRyaWJ1dGU8Pz4pIGF0dHJpYnV0ZTsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQkJCUxpc3Q8Pz4gYXJyYXkgPSBhcnJheV9hdHRyLmdldFZhbHVlKCk7Ci0JCQkJCWlmIChhcnJheS5zaXplKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKG9wdFN0YXJ0U3RyKTsKLQkJCQkJfQotCQkJCQlidWZmZXIuYXBwZW5kKHN0YXJ0U3RyKTsKLQkJCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGFycmF5KSB7Ci0JCQkJCQlpZiAoZmlyc3QpIHsKLQkJCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHNlcGFyYXRvclN0cik7Ci0JCQkJCQl9Ci0JCQkJCQlhc3NlcnQgZWxlbWVudCAhPSBudWxsOwotCQkJCQkJYnVmZmVyLmFwcGVuZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCQlidWZmZXIuYXBwZW5kKGVuZFN0cik7Ci0JCQkJCWlmIChhcnJheS5zaXplKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKG9wdEVuZFN0cik7Ci0JCQkJCX0KLQkJCQkJcmVzb2x2ZWRWYWx1ZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc29sdmVkVmFsdWUgPSBhdHRyaWJ1dGUuZ2V0VmFsdWVBc1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIElmIGZhaWxlZCB0byByZXNvbHZlIHZhcmlhYmxlLCBrZWVwIGl0IG9uIHRoZSBzdHJpbmcuIEVsc2UgcmVwbGFjZSBieSBpdHMgdmFsdWUuCi0JCQkgKi8KLQkJCWlmIChyZXNvbHZlZFZhbHVlID09IG51bGwpIHsKLQkJCQlvdXRwdXQuYXBwZW5kKHZhcmlhYmxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gUmVjdXJzaXZlIG1hY3JvIHN1YnN0aXR1dGlvbgotCQkJCXJlc29sdmVkVmFsdWUgPSByZXBsYWNlVmFyaWFibGVzKHJlc29sdmVkVmFsdWUsIHN1YnN0aXR1dGlvbkF0dHJpYnV0ZU1hbmFnZXIpOwotCQkJCW91dHB1dC5hcHBlbmQocmVzb2x2ZWRWYWx1ZSk7Ci0JCQl9Ci0JCQlsYXN0UG9zID0gZW5kUG9zOwotCQl9Ci0JCW91dHB1dC5hcHBlbmQoaW5wdXQuc3Vic3RyaW5nKGxhc3RQb3MpKTsKLQkJU3RyaW5nIHJlc3VsdCA9IG91dHB1dC50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLQkJdGVybWluYXRlSm9iRmxhZyA9IHRydWU7Ci0JCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCXByb2Nlc3MuZGVzdHJveSgpOwotCQl9Ci0JCWRvVGVybWluYXRlSm9iKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsaW5nKCkgewotCQl0ZXJtaW5hdGUoKTsKLQkJc3VwZXIuY2FuY2VsaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ydHN5c3RlbS9EZWZhdWx0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcnRzeXN0ZW0vRGVmYXVsdFRvb2xSdW50aW1lU3lzdGVtSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGJiNTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ydHN5c3RlbS9EZWZhdWx0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuSVRleHRJbnB1dFN0cmVhbUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLlRleHRJbnB1dFN0cmVhbU9ic2VydmVyOwotCi0vKioKLSAqIFNhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYn0uIE5vdCB1c2VkIGFueW1vcmUuCi0gKiBAZGVwcmVjYXRlZAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRvb2xSdW50aW1lU3lzdGVtSm9iIGV4dGVuZHMgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYiB7Ci0KLQlwcml2YXRlIFRleHRJbnB1dFN0cmVhbU9ic2VydmVyIHN0ZGVyck9ic2VydmVyOwotCXByaXZhdGUgVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIgc3Rkb3V0T2JzZXJ2ZXI7Ci0KLQlwdWJsaWMgRGVmYXVsdFRvb2xSdW50aW1lU3lzdGVtSm9iKFN0cmluZyBqb2JJRCwgU3RyaW5nIHF1ZXVlSUQsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHJ0U3lzdGVtLAotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB7Ci0JCXN1cGVyKGpvYklELCBxdWV1ZUlELCBuYW1lLCBydFN5c3RlbSwgYXR0ck1ncik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvbkZpbmlzaGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25TdGFydGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25DbGVhblVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBOb3RoaW5nCi0JfQotCi0JLyoqCi0JICogT25seSBjb25zdW1lcyBhcHBsaWNhdGlvbiBvdXRwdXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9XYWl0RXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlCdWZmZXJlZFJlYWRlciBpblJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGVyclJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKSk7Ci0KLQkJc3Rkb3V0T2JzZXJ2ZXIgPSBuZXcgVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIoCi0JCQkJaW5SZWFkZXIsCi0JCQkJbmV3IElUZXh0SW5wdXRTdHJlYW1MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbmV3TGluZShTdHJpbmcgbGluZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgc3RyZWFtQ2xvc2VkKCkgewotCQkJCQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBzdHJlYW1FcnJvcihFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JCQkJCX0KLQkJCQl9Ci0JCSk7Ci0JCXN0ZG91dE9ic2VydmVyLnN0YXJ0KCk7Ci0KLQkJc3RkZXJyT2JzZXJ2ZXIgPSBuZXcgVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIoCi0JCQkJZXJyUmVhZGVyLAotCQkJCW5ldyBJVGV4dElucHV0U3RyZWFtTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG5ld0xpbmUoU3RyaW5nIGxpbmUpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHN0cmVhbUNsb3NlZCgpIHsKLQkJCQkJCS8vIEVtcHR5IGltcGxlbWVudGF0aW9uLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgc3RyZWFtRXJyb3IoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIEVtcHR5IGltcGxlbWVudGF0aW9uLgotCQkJCQl9Ci0JCQkJfQotCQkpOwotCQlzdGRlcnJPYnNlcnZlci5zdGFydCgpOwotCi0JCXRyeSB7Ci0JCQlzdGRlcnJPYnNlcnZlci5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQl0cnkgewotCQkJc3Rkb3V0T2JzZXJ2ZXIuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1Rlcm1pbmF0ZUpvYigpIHsKLQkJaWYgKHN0ZGVyck9ic2VydmVyICE9IG51bGwpIHsKLQkJCXN0ZGVyck9ic2VydmVyLmtpbGwoKTsKLQkJCXN0ZGVyck9ic2VydmVyID0gbnVsbDsKLQkJfQotCQlpZiAoc3Rkb3V0T2JzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc3Rkb3V0T2JzZXJ2ZXIua2lsbCgpOwotCQkJc3Rkb3V0T2JzZXJ2ZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGU8PywgPywgPz5bXSBkb1JldHJpZXZlVG9vbEJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGU8PywgPywgPz5bMF07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRvUmV0cmlldmVUb29sRW52aXJvbm1lbnQoKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGRvUmV0cmlldmVUb29sQ29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyLAotCQkJU3RyaW5nIGRpcmVjdG9yeSwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUHJlcGFyZUV4ZWN1dGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ydHN5c3RlbS9JVG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvcnRzeXN0ZW0vSVRvb2xSdW50aW1lU3lzdGVtSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjQxNWEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS9ydHN5c3RlbS9JVG9vbFJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW07Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvb2xSdW50aW1lU3lzdGVtSm9iIHsKLQotCVN0cmluZyBnZXRKb2JJRCgpOwotCi0JQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSBnZXRSdFN5c3RlbSgpOwotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3V0aWxzL0RlYnVnVXRpbC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9EZWJ1Z1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2NTZkOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3V0aWxzL0RlYnVnVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlRvb2xzUk1QbHVnaW47Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z1V0aWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1RSQUNJTkdfT1BUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL2NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfVFJBQ0lOR19PUFRJT05fTU9SRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9jb21tYW5kL21vcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9UUkFDSU5HX09QVElPTiA9ICJvcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9qb2IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJUU19UUkFDSU5HX09QVElPTiA9ICJvcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9ydHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJUU19ESVNDT1ZFUl9UUkFDSU5HX09QVElPTiA9ICJvcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9ydHMvZGlzY292ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJUU19NT05JVE9SX1RSQUNJTkdfT1BUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL3J0cy9tb25pdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVFNfSk9CX1RSQUNJTkdfT1BUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL3J0cy9qb2IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJUU19KT0JfVFJBQ0lOR19PUFRJT05fTU9SRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy9ydHMvam9iL21vcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJUU19KT0JfT1VUUFVUX1RSQUNJTkdfT1BUSU9OID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL2RlYnVnL3J0cy9qb2Ivb3V0cHV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIENPTU1BTkRfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBDT01NQU5EX1RSQUNJTkdfTU9SRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBKT0JfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSVFNfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSVFNfRElTQ09WRVJfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSVFNfTU9OSVRPUl9UUkFDSU5HID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFJUU19KT0JfVFJBQ0lORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSVFNfSk9CX1RSQUNJTkdfTU9SRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBSVFNfSk9CX09VVFBVVF9UUkFDSU5HID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlUGx1Z2luRGVidWdPcHRpb25zKCkgewotCQlpZiAoVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSkgewotCQkJU3RyaW5nIG9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKENPTU1BTkRfVFJBQ0lOR19PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJQ09NTUFORF9UUkFDSU5HID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKENPTU1BTkRfVFJBQ0lOR19PUFRJT05fTU9SRSk7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlDT01NQU5EX1RSQUNJTkdfTU9SRSA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKT0JfVFJBQ0lOR19PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJSk9CX1RSQUNJTkcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUlRTX1RSQUNJTkdfT1BUSU9OKTsKLQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJCVJUU19UUkFDSU5HID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFJUU19ESVNDT1ZFUl9UUkFDSU5HX09QVElPTik7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlSVFNfRElTQ09WRVJfVFJBQ0lORyA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihSVFNfTU9OSVRPUl9UUkFDSU5HX09QVElPTik7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlSVFNfTU9OSVRPUl9UUkFDSU5HID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFJUU19KT0JfVFJBQ0lOR19PUFRJT04pOwotCQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQkJUlRTX0pPQl9UUkFDSU5HID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFJUU19KT0JfVFJBQ0lOR19PUFRJT05fTU9SRSk7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlSVFNfSk9CX1RSQUNJTkdfTU9SRSA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihSVFNfSk9CX09VVFBVVF9UUkFDSU5HX09QVElPTik7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlSVFNfSk9CX09VVFBVVF9UUkFDSU5HID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShib29sZWFuIG9wdGlvbiwgU3RyaW5nIHBhdHRlcm4sIE9iamVjdCAuLi4gYXJndW1lbnRzKSB7Ci0JCXRyYWNlKG9wdGlvbiwgTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJndW1lbnRzKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJvb2xlYW4gb3B0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob3B0aW9uKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0JCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoYm9vbGVhbiBvcHRpb24sIFN0cmluZyBwYXR0ZXJuLCBPYmplY3QgLi4uIGFyZ3VtZW50cykgewotCQllcnJvcihvcHRpb24sIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIGFyZ3VtZW50cykpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihib29sZWFuIG9wdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9wdGlvbikgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9JSW5wdXRTdHJlYW1MaXN0ZW5lci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9JSW5wdXRTdHJlYW1MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RiNzYwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvSUlucHV0U3RyZWFtTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHM7Ci0KLQotLyoqCi0gKiBBIGxpc3RlbmVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gc29tZSBjaHVuayBvZiBkYXRhIGlzIHJlY2VpdmVkIGZyb20gYSBzdHJlYW0uCi0gKiBBIElTdHJlYW1MaXN0ZW5lciBpcyBhbiBlbnRpdHkgdGhhdCBjYW4gcmVjZWl2ZSBvbmUgY2h1bmsgYXQgdGltZS4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUlucHV0U3RyZWFtTGlzdGVuZXIgewotCXZvaWQgbmV3Qnl0ZXMoYnl0ZSBieXRlc1tdLCBpbnQgbGVuZ3RoKTsKLQl2b2lkIHN0cmVhbUNsb3NlZCgpOwotCXZvaWQgc3RyZWFtRXJyb3IoRXhjZXB0aW9uIGUpOwotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9JVGV4dElucHV0U3RyZWFtTGlzdGVuZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvSVRleHRJbnB1dFN0cmVhbUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDk3OWMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9JVGV4dElucHV0U3RyZWFtTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHM7Ci0KLS8qKgotICogQSBsaXN0ZW5lciB0aGF0IGlzIGNhbGxlZCB3aGVuIGFuIGVudGlyZSBsaW5lIGlzIHJlYWQgZnJvbSBhIHN0cmVhbS4KLSAqIEEgSUxpbmVTdHJlYW1MaXN0ZW5lciBpcyBhbiBlbnRpdHkgdGhhdCBjYW4gcmVjZWl2ZSBvbmUgbGluZSBvZiB0ZXh0IGF0IHRpbWUuCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0SW5wdXRTdHJlYW1MaXN0ZW5lciB7Ci0Jdm9pZCBuZXdMaW5lKFN0cmluZyBsaW5lKTsKLQl2b2lkIHN0cmVhbUNsb3NlZCgpOwotCXZvaWQgc3RyZWFtRXJyb3IoRXhjZXB0aW9uIGUpOwotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9JbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTEzNTYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vY29yZS91dGlscy9JbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotCi0vKioKLSAqIEFuIHtAbGluayBJSW5wdXRTdHJlYW1MaXN0ZW5lcn0gdGhhdCBmb3J3YXJkcyBvdXRwdXQgdG8gYSBwaXBlZCBzdHJlYW0uCi0gKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBJSW5wdXRTdHJlYW1MaXN0ZW5lciB7Ci0KLQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKLQkJdGhpcy5vdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3Qnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbGVuZ3RoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMsIDAsIGxlbmd0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWRpc2FibGUoKTsKLQkJCWxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0cmVhbUNsb3NlZCgpIHsKLQkJdHJ5IHsKLQkJCWRpc2FibGUoKTsKLQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdHJlYW1FcnJvcihFeGNlcHRpb24gZSkgewotCQlkaXNhYmxlKCk7Ci0JCWxvZyhlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2coRXhjZXB0aW9uIGUpIHsKLQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRpc2FibGUoKSB7Ci0JCWVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3V0aWxzL0lucHV0U3RyZWFtT2JzZXJ2ZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvSW5wdXRTdHJlYW1PYnNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjcxYWEzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvSW5wdXRTdHJlYW1PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBIHRocmVhZCB0aGF0IGZvcndhcmRzIGRhdGEgZnJvbSBhbiBpbnB1dHN0cmVhbSB0byBhIHtAbGluayBJSW5wdXRTdHJlYW1MaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSBnZW5lcmFsIGZhY2lsaXR5IHRoYXQgYWxsb3dzIHRvIGZvcndhcmQgZGF0YSByZWNlaXZlZCBmcm9tIGFuCi0gKiBpbnB1dHN0cmVhbSB0byBhIGxpc3RlbmVyIG9iamVjdC4KLSAqCi0gKiBDb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSByZW1vdGUgdG9vbHMuIE11bHRpcGxlIGxpc3RlbmVycyBhcmUgbm93IHN1cHBvcnRlZC4KLSAqCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIElucHV0U3RyZWFtT2JzZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgewotCWJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0JLyoKLQkgKiBUT0RPOiBPcGVuIGlzc3VlcwotCSAqIC0gRG9lcyBhY2Nlc3MgdG8gJ2tpbGxlZCcgYXR0cmlidXRlIG5lZWQgc3luY2hyb25pemVkIGFjY2Vzcz8KLQkgKiAtIE9uIHNvY2tldHMsIG9mdGVuIG9uZSBieXRlIGlzIHJlYWQgb25lIGFmdGVyIHRoZSBvdGhlciwgaW5zdGVhZCBvZgotCSAqICAgYmxvY2tzIG9mIGJ5dGVzLiBNYXliZSBhZGRpbmcgc29tZSBkZWxheSBtaWdodCBmb3JjZSB0byByZWFkCi0JICogICBtb3JlIHRoYW4gb25lIGJ5dGUuCi0JICovCi0JLyoqCi0JICogU3RyZWFtIHRoYXQgaXMgYmVlbiBvYnNlcnZlZCBhbmQgcmVhZC4KLQkgKi8KLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0OwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IG9ic2VydmVyIHNob3VsZCBzdG9wIHJ1bm5pbmcuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGtpbGxlZDsKLQotCS8qKgotCSAqIExpc3RlbmVycyB0aGF0IGFyZSBjYWxsZWQgd2hlbiBkYXRhIGlzIHJlY2VpdmVkLgotCSAqLwotCUxpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxMDA7Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW1PYnNlcnZlcihJbnB1dFN0cmVhbSBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCXNldE5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtT2JzZXJ2ZXIoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW1PYnNlcnZlcihJbnB1dFN0cmVhbSBpbnB1dCwgSUlucHV0U3RyZWFtTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW1PYnNlcnZlcihJbnB1dFN0cmVhbSBpbnB1dCwgSUlucHV0U3RyZWFtTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQlzZXROYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFN0b3Agb2JzZXJ2aW5nIGRhdGEgYW5kIHRlcm1pbmF0ZSB0aHJlYWQuCi0JICogU2luY2UgSW5wdXRTdHJlYW0gY2Fubm90IGJlIGludGVycnVwdGVkLCBpdCB3aWxsIG5vdCBpbnRlcnJ1cHQgaW1tZWRpYXRlbHksIGJ1dCBvbmx5IHdoZW4gbmV4dCBpbnB1dCBpcyByZWNlaXZlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQga2lsbCgpIHsKLQkJa2lsbGVkID0gdHJ1ZTsKLQkJaW50ZXJydXB0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBzKSB7Ci0JCS8vCQlQVFBDb3JlUGx1Z2luLmxvZyhzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JfQotCi0Jdm9pZCBzdHJlYW1DbG9zZWQoKSB7Ci0JCWlmIChjbG9zZWQpIHJldHVybjsKLQkJbG9nKCJTdHJlYW0gY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJY2xvc2VkID0gdHJ1ZTsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJKChJSW5wdXRTdHJlYW1MaXN0ZW5lcilsaXN0ZW5lcikuc3RyZWFtQ2xvc2VkKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxvZyhlKTsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgc3RyZWFtRXJyb3IoRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGNsb3NlZCkgcmV0dXJuOwotCQlsb2coIlJlY292ZXJlZCBmcm9tIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJdHJ5IHsKLQkJCQkoKElJbnB1dFN0cmVhbUxpc3RlbmVyKWxpc3RlbmVyKS5zdHJlYW1FcnJvcihlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotCQkJCWxvZyhlZSk7Ci0JCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld0J5dGVzKGJ5dGUgYnVmZmVyW10sIGludCBsZW5ndGgpIHsKLQkJaWYgKGNsb3NlZCkgcmV0dXJuOwotCQlsb2coIlJlY2VpdmVkOiAiICsgSW50ZWdlci50b1N0cmluZyhsZW5ndGgpICsgIiBieXRlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJKChJSW5wdXRTdHJlYW1MaXN0ZW5lcilsaXN0ZW5lcikubmV3Qnl0ZXMoYnVmZmVyLCBsZW5ndGgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coZSk7Ci0JCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW4gc3RyZWFtIG9ic2VydmVyLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLQkJbG9nKCJTdGFydGVkIG9ic2VydmluZyIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICgha2lsbGVkKSB7Ci0JCQl0cnkgewotCQkJCWludCBieXRlcyA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQkJCQlpZiAoYnl0ZXMgPiAwKSB7Ci0JCQkJCW5ld0J5dGVzKGJ1ZmZlciwgYnl0ZXMpOwotCQkJCX0gZWxzZSBpZiAoYnl0ZXMgPT0gLTEpIHsKLQkJCQkJc3RyZWFtQ2xvc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoa2lsbGVkKSB7Ci0JCQkJCXN0cmVhbUNsb3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFT0ZFeGNlcHRpb24pIHsKLQkJCQkJc3RyZWFtQ2xvc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0cmVhbUVycm9yKGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyoKLQkJCQkgKiBXaGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLCBKYXZhIG1heSByYWlzZSBhCi0JCQkJICogTnVsbFBvaW50ZXJFeGNlcHRpb24uIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGxpa2UgYQotCQkJCSAqIElPRXhjZXB0aW9uLCBhcyBhYm92ZS4KLQkJCQkgKi8KLQkJCQlpZiAoa2lsbGVkKSB7Ci0JCQkJCXN0cmVhbUNsb3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJlYW1FcnJvcihlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvZygiRmluaXNoZWQgb2JzZXJ2aW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJSW5wdXRTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJSW5wdXRTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2NvcmUvdXRpbHMvVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMTFmOC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9jb3JlL3V0aWxzL1RleHRJbnB1dFN0cmVhbU9ic2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb25uZWN0cyBhbiBCdWZmZXJlZFJlYWRlciBhIHRleHQgbGlzdGVuZXIuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSBnZW5lcmFsIGZhY2lsaXR5IHRoYXQgYWxsb3dzIHRvIGZvcndhcmQgZGF0YSByZWNlaXZlZCBmcm9tIGFuCi0gKiBidWZmZXJlZCByZWFkZXIgdG8gYSBsaXN0ZW5lciBvYmplY3QuIE5vdGUgdGhhdCBvbmx5IG9uZSBsaXN0ZW5lciBpcwotICogY29ubmVjdGVkIHRvIHRoZSBvYnNlcnZlci4KLSAqCi0gKiBDb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSByZW1vdGUgdG9vbHMuCi0gKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgewotCS8qKgotCSAqIFN0cmVhbSB0aGF0IGlzIGJlZW4gb2JzZXJ2ZWQgYW5kIHJlYWQuCi0JICovCi0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciByZWFkZXI7Ci0KLQkvKioKLQkgKiBTaWduYWxzIHRoYXQgYnJpZGdlIHNob3VsZCBzdG9wLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBraWxsZWQ7Ci0KLQkvKioKLQkgKiBMaXN0ZW5lciB0aGF0IGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQuCi0JICovCi0JcHJpdmF0ZSBJVGV4dElucHV0U3RyZWFtTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIoQnVmZmVyZWRSZWFkZXIgaW5wdXQsIElUZXh0SW5wdXRTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lciwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCXRoaXMucmVhZGVyID0gaW5wdXQ7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dElucHV0U3RyZWFtT2JzZXJ2ZXIoQnVmZmVyZWRSZWFkZXIgaW5wdXQsIElUZXh0SW5wdXRTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlYWRlciA9IGlucHV0OwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCXNldE5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBvYnNlcnZpbmcgZGF0YSBhbmQgdGVybWluYXRlIHRocmVhZC4KLQkgKiBTaW5jZSBJbnB1dFN0cmVhbSBjYW5ub3QgYmUgaW50ZXJydXB0ZWQsIGl0IHdpbGwgbm90IGludGVycnVwdCBpbW1lZGlhdGVseSwgYnV0IG9ubHkgd2hlbiBuZXh0IGlucHV0IGlzIHJlY2VpdmVkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBraWxsKCkgewotCQlraWxsZWQgPSB0cnVlOwotCQlpbnRlcnJ1cHQoKTsKLQl9Ci0KLQl2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCS8vCQlTeXN0ZW0uZXJyLnByaW50bG4obmFtZSArICI6ICIgKyBzKTsKLQl9Ci0KLQl2b2lkIG5ld0xpbmUoU3RyaW5nIGxpbmUpIHsKLQkJbG9nKCJSZWNlaXZlZDogIiArIEludGVnZXIudG9TdHJpbmcobGluZS5sZW5ndGgoKSkgKyAiIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlsaXN0ZW5lci5uZXdMaW5lKGxpbmUpOwotCX0KLQotCXZvaWQgc3RyZWFtQ2xvc2VkKCkgewotCQlsb2coIlN0cmVhbSBjbG9zZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0ZW5lci5zdHJlYW1DbG9zZWQoKTsKLQl9Ci0KLQl2b2lkIHN0cmVhbUVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0JCWxvZygiUmVjb3ZlcmVkIGZyb20gZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWxpc3RlbmVyLnN0cmVhbUVycm9yKGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3RyaW5nIGxpbmU7Ci0KLQkJd2hpbGUgKCFraWxsZWQpIHsKLQkJCXRyeSB7Ci0JCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lID09IG51bGwpIHsKLQkJCQkJc3RyZWFtQ2xvc2VkKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdMaW5lKGxpbmUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPRkV4Y2VwdGlvbikgewotCQkJCQlzdHJlYW1DbG9zZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyZWFtRXJyb3IoZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoa2lsbGVkKSB7Ci0JCQkJCXN0cmVhbUNsb3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJlYW1FcnJvcihlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjEyZDQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWM1Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCwKLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlLnJtc3lzdGVtCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2Fib3V0LmluaSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY3NjJhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ZDZkYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTkxTX01FU1NBR0VGT1JNQVRfTk9ORQotIyBOTFNfRU5DT0RJTkc9VVRGLTgKLQotYmx1cmI9UFRQIElCTSBMb2FkTGV2ZWxlciBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3B0cFxuCi0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3OWIxMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvZWNsaXBzZTMyLnBuZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxNmFmNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBJQk0gTG9hZExldmVsZXIgU3VwcG9ydAotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvcGx1Z2luLnhtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MjNjMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPCEtLSBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgLS0+Ci08IS0tIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgIC0tPgotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAtLT4KLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlLnJlc291cmNlTWFuYWdlcnMiPgotICAgICAgPHJlc291cmNlTWFuYWdlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS5ybXN5c3RlbS5JQk1MTFJlc291cmNlTWFuYWdlckZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmlibWxsLmNvcmUucmVzb3VyY2VtYW5hZ2VyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvQWN0aXZhdG9yLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYmYzMzEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC9jb3JlL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvSUJNTExBdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvSUJNTExBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOGZiZTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC9jb3JlL0lCTUxMQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlOwotCi0KLQotLyoqCi0gKiBJQk1MTCBzcGVjaWZpYyBhdHRyaWJ1dGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBJQk1MTEF0dHJpYnV0ZXMgewotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvcm1zeXN0ZW0vSUJNTExSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ybXN5c3RlbS9JQk1MTFJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODA5ZDJhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ybXN5c3RlbS9JQk1MTFJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAgKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAgKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAgKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAgKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAgKiAKLSAgKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAqIAotICAqIExBLUNDIDA0LTExNQotICAqICAKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUucm1zeXN0ZW07Ci0KLSBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLSBpbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotIGltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOwotIGltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbDsKLSBpbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTm9kZUNvbnRyb2w7Ci0gaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotIGltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2w7Ci0gaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUucnRzeXN0ZW0uSUJNTExQcm94eVJ1bnRpbWVDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlLnJ0c3lzdGVtLklCTUxMUnVudGltZVN5c3RlbTsKLSBpbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlcjsKLSBpbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbTsKLQotIHB1YmxpYyBjbGFzcyBJQk1MTFJlc291cmNlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciB7Ci0KLSAJcHJpdmF0ZSBJbnRlZ2VyIElCTUxMUk1JRDsKLSAJCi0gCXB1YmxpYyBJQk1MTFJlc291cmNlTWFuYWdlcihJbnRlZ2VyIGlkLCBJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSwgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gCQlzdXBlcihpZC50b1N0cmluZygpLCB1bml2ZXJzZSwgY29uZmlnKTsKLSAJCUlCTUxMUk1JRCA9IGlkOwotIAl9Ci0KLSAJLyogKG5vbi1KYXZhZG9jKQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQWZ0ZXJDbG9zZUNvbm5lY3Rpb24oKQotIAkgKi8KLSAJcHJvdGVjdGVkIHZvaWQgZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpIHsKLSAJfQotCi0gCS8qIChub24tSmF2YWRvYykKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RQcm94eVJlc291cmNlTWFuYWdlciNkb0FmdGVyT3BlbkNvbm5lY3Rpb24oKQotIAkgKi8KLSAJcHJvdGVjdGVkIHZvaWQgZG9BZnRlck9wZW5Db25uZWN0aW9uKCkgewotIAl9Ci0KLSAJLyogKG5vbi1KYXZhZG9jKQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQmVmb3JlQ2xvc2VDb25uZWN0aW9uKCkKLSAJICovCi0gCXByb3RlY3RlZCB2b2lkIGRvQmVmb3JlQ2xvc2VDb25uZWN0aW9uKCkgewotIAl9Ci0KLSAJLyogKG5vbi1KYXZhZG9jKQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQmVmb3JlT3BlbkNvbm5lY3Rpb24oKQotIAkgKi8KLSAJcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpIHsKLSAJfQotCi0gCS8qIChub24tSmF2YWRvYykKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlSm9iKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotIAkgKi8KLSAJQE92ZXJyaWRlCi0gCXByb3RlY3RlZCBJUEpvYkNvbnRyb2wgZG9DcmVhdGVKb2IoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIFN0cmluZyBqb2JJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotIAkJcmV0dXJuIG5ld0pvYihxdWV1ZSwgam9iSWQsIGF0dHJzKTsKLSAJfQotCi0gCS8qIChub24tSmF2YWRvYykKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlTWFjaGluZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0gCSAqLwotIAlAT3ZlcnJpZGUKLSAJcHJvdGVjdGVkIElQTWFjaGluZUNvbnRyb2wgZG9DcmVhdGVNYWNoaW5lKFN0cmluZyBtYWNoaW5lSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLSAJCXJldHVybiBuZXdNYWNoaW5lKG1hY2hpbmVJZCwgYXR0cnMpOwotIAl9Ci0KLSAJLyogKG5vbi1KYXZhZG9jKQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVOb2RlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0gCSAqLwotIAlAT3ZlcnJpZGUKLSAJcHJvdGVjdGVkIElQTm9kZUNvbnRyb2wgZG9DcmVhdGVOb2RlKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSwgU3RyaW5nIG5vZGVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotIAkJcmV0dXJuIG5ld05vZGUobWFjaGluZSwgbm9kZUlkLCBhdHRycyk7Ci0gCX0KLQotIAkvKiAobm9uLUphdmFkb2MpCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVByb2Nlc3Mob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotIAkgKi8KLSAJQE92ZXJyaWRlCi0gCXByb3RlY3RlZCBJUFByb2Nlc3NDb250cm9sIGRvQ3JlYXRlUHJvY2VzcyhJUEpvYkNvbnRyb2wgam9iLCBTdHJpbmcgcHJvY2Vzc0lkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0gCQlyZXR1cm4gbmV3UHJvY2Vzcyhqb2IsIHByb2Nlc3NJZCwgYXR0cnMpOwotIAl9Ci0KLSAJLyogKG5vbi1KYXZhZG9jKQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVRdWV1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0gCSAqLwotIAlAT3ZlcnJpZGUKLSAJcHJvdGVjdGVkIElQUXVldWVDb250cm9sIGRvQ3JlYXRlUXVldWUoU3RyaW5nIHF1ZXVlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLSAJCXJldHVybiBuZXdRdWV1ZShxdWV1ZUlkLCBhdHRycyk7Ci0gCX0KLQotIAkvKiAobm9uLUphdmFkb2MpCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKQotIAkgKi8KLSAJQE92ZXJyaWRlCi0gCXByb3RlY3RlZCBJUnVudGltZVN5c3RlbSBkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKSB7Ci0gCQlJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gKElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOwotIAkJLyogbG9hZCB1cCB0aGUgY29udHJvbCBhbmQgbW9uaXRvcmluZyBzeXN0ZW1zIGZvciBPTVBJICovCi0gCQlJQk1MTFByb3h5UnVudGltZUNsaWVudCBydW50aW1lUHJveHkgPSBuZXcgSUJNTExQcm94eVJ1bnRpbWVDbGllbnQoY29uZmlnLCBJQk1MTFJNSUQpOwotIAkJcmV0dXJuIG5ldyBJQk1MTFJ1bnRpbWVTeXN0ZW0ocnVudGltZVByb3h5LCBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpKTsKLSAJfQotCi0gCS8qIChub24tSmF2YWRvYykKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlSm9icyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotIAkgKi8KLSAJQE92ZXJyaWRlCi0gCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlSm9icyhJUFF1ZXVlQ29udHJvbCBxdWV1ZSwgQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYnMsCi0gCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotIAkJcmV0dXJuIHVwZGF0ZUpvYnMocXVldWUsIGpvYnMsIGF0dHJzKTsKLSAJfQotCi0gCS8qIChub24tSmF2YWRvYykKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlTWFjaGluZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLSAJICovCi0gCUBPdmVycmlkZQotIAlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZU1hY2hpbmVzKENvbGxlY3Rpb248SVBNYWNoaW5lQ29udHJvbD4gbWFjaGluZXMsCi0gCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotIAkJcmV0dXJuIHVwZGF0ZU1hY2hpbmVzKG1hY2hpbmVzLCBhdHRycyk7Ci0gCX0KLQotIAkvKiAobm9uLUphdmFkb2MpCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZU5vZGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotIAkgKi8KLSAJQE92ZXJyaWRlCi0gCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlTm9kZXMoSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lLCAKLSAJCQlDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0gCQlyZXR1cm4gdXBkYXRlTm9kZXMobWFjaGluZSwgbm9kZXMsIGF0dHJzKTsKLSAJfQotCi0gCS8qIChub24tSmF2YWRvYykKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlUHJvY2Vzc2VzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2wsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0gCSAqLwotIAlAT3ZlcnJpZGUKLSAJcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVQcm9jZXNzZXMoSVBKb2JDb250cm9sIGpvYiwKLSAJCQlDb2xsZWN0aW9uPElQUHJvY2Vzc0NvbnRyb2w+IHByb2Nlc3NlcywgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotIAkJcmV0dXJuIHVwZGF0ZVByb2Nlc3Nlcyhqb2IsIHByb2Nlc3NlcywgYXR0cnMpOwotIAl9Ci0KLSAJLyogKG5vbi1KYXZhZG9jKQotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVRdWV1ZXMoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLSAJICovCi0gCUBPdmVycmlkZQotIAlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZVF1ZXVlcyhDb2xsZWN0aW9uPElQUXVldWVDb250cm9sPiBxdWV1ZXMsCi0gCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotIAkJcmV0dXJuIHVwZGF0ZVF1ZXVlcyhxdWV1ZXMsIGF0dHJzKTsKLSAJfQotCi0gfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ybXN5c3RlbS9JQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ybXN5c3RlbS9JQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3ODQ0ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvcm1zeXN0ZW0vSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotZmluYWwgcHVibGljIGNsYXNzIElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWQoSUJNTExSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnksCi0JCQlJTWVtZW50byBtZW1lbnRvKSB7Ci0KLQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IGxvYWRSZW1vdGUoZmFjdG9yeSwgbWVtZW50byk7Ci0JCQotCQlJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gCi0JCQluZXcgSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKGZhY3RvcnksIHJlbW90ZUNvbmZpZyk7Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihJQk1MTFJlc291cmNlTWFuYWdlckZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzKGZhY3RvcnksIG5ldyBSZW1vdGVDb25maWcoKSk7Ci0JCXNldERlZmF1bHROYW1lQW5kRGVzYygpOwotCX0KLQkKLQlwdWJsaWMgSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKElCTUxMUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LAotCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZykgewotCQlzdXBlcihyZW1vdGVDb25maWcsIGZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJQ29tbW9uQ29uZmlnIGNvbW1vbkNvbmYgPSBuZXcgQ29tbW9uQ29uZmlnKGdldE5hbWUoKSwKLQkJCQlnZXREZXNjcmlwdGlvbigpLCBnZXRVbmlxdWVOYW1lKCkpOwotCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZiA9IG5ldyBSZW1vdGVDb25maWcoY29tbW9uQ29uZiwKLQkJCQlnZXRSZW1vdGVTZXJ2aWNlc0lkKCksIGdldENvbm5lY3Rpb25OYW1lKCksCi0JCQkJZ2V0UHJveHlTZXJ2ZXJQYXRoKCksIGdldExvY2FsQWRkcmVzcygpLAotCQkJCWdldEludm9jYXRpb25PcHRpb25zU3RyKCksIGdldE9wdGlvbnMoKSk7Ci0JCXJldHVybiBuZXcgSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKAotCQkJCShJQk1MTFJlc291cmNlTWFuYWdlckZhY3RvcnkpIGdldEZhY3RvcnkoKSwgcmVtb3RlQ29uZik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXREZWZhdWx0TmFtZUFuZERlc2MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lQW5kRGVzYygpIHsKLQkJU3RyaW5nIG5hbWUgPSAiSUJNTEwiOwotCQlTdHJpbmcgY29ubiA9IGdldENvbm5lY3Rpb25OYW1lKCk7Ci0JCWlmIChjb25uICE9IG51bGwgJiYgIWNvbm4uZXF1YWxzKCIiKSkgewotCQkJbmFtZSArPSAiQCIgKyBjb25uOwotCQl9Ci0JCXNldE5hbWUobmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKCJJQk1MTCBSZXNvdXJjZSBNYW5hZ2VyIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ybXN5c3RlbS9JQk1MTFJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ybXN5c3RlbS9JQk1MTFJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmYjBjZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvcm1zeXN0ZW0vSUJNTExSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotcHVibGljIGNsYXNzIElCTUxMUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSUJNTExSZXNvdXJjZU1hbmFnZXJGYWN0b3J5KCkgewotCQlzdXBlcigiSUJNIExvYWRMZXZlbGVyIik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2NvcHlDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29weUNvbmZpZ3VyYXRpb24oCi0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXJldHVybiAoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pY29uZmlndXJhdGlvbi5jbG9uZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGNyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25mSW4pIHsKLQkJSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mSW47Ci0JCWZpbmFsIFBUUENvcmVQbHVnaW4gcGx1Z2luID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWZpbmFsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlID0gKElQVW5pdmVyc2VDb250cm9sKSBwbHVnaW4uZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBJQk1MTFJlc291cmNlTWFuYWdlcih1bml2ZXJzZS5nZXROZXh0UmVzb3VyY2VNYW5hZ2VySWQoKSwgdW5pdmVyc2UsIGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSNjcmVhdGVDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24odGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2xvYWRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBsb2FkQ29uZmlndXJhdGlvbihJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXJldHVybiBJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24ubG9hZCh0aGlzLCBtZW1lbnRvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvY29yZS9ydHN5c3RlbS9JQk1MTFByb3h5UnVudGltZUNsaWVudC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC9jb3JlL3J0c3lzdGVtL0lCTUxMUHJveHlSdW50aW1lQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOTlmZDUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC9jb3JlL3J0c3lzdGVtL0lCTUxMUHJveHlSdW50aW1lQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUucm1zeXN0ZW0uSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZUNsaWVudDsKLQotcHVibGljIGNsYXNzIElCTUxMUHJveHlSdW50aW1lQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVDbGllbnQgewotCXB1YmxpYyBJQk1MTFByb3h5UnVudGltZUNsaWVudChJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnLCAKLQkJCWludCBiYXNlTW9kZWxJZCkgewotCQlzdXBlcihjb25maWcsIGJhc2VNb2RlbElkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvcnRzeXN0ZW0vSUJNTExSdW50aW1lU3lzdGVtLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2NvcmUvcnRzeXN0ZW0vSUJNTExSdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTg0ZDIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC9jb3JlL3J0c3lzdGVtL0lCTUxMUnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZVN5c3RlbTsKLQotcHVibGljIGNsYXNzIElCTUxMUnVudGltZVN5c3RlbSBleHRlbmRzIEFic3RyYWN0UmVtb3RlUHJveHlSdW50aW1lU3lzdGVtIHsKLQlwdWJsaWMgSUJNTExSdW50aW1lU3lzdGVtKElCTUxMUHJveHlSdW50aW1lQ2xpZW50IHByb3h5LCBBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKHByb3h5LCBtYW5hZ2VyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODM1MWVjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHA8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1NzY0NTEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHA7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAuQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTgzNjFiZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgICoueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9JQk1MTE1haW5IZWxwLmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvSUJNTExNYWluSGVscC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzU3ZjhlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9JQk1MTE1haW5IZWxwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPCEtLSBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgLS0+Ci08IS0tIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgIC0tPgotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAtLT4KLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlJ1bm5pbmcgSUJNIExvYWRMZXZlbGVyIEJhdGNoIEpvYnM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5SdW5uaW5nIElCTSBMb2FkTGV2ZWxlciBCYXRjaCBKb2JzPC9oMT4KLTxoMj48QSBuYW1lPWludHJvZHVjdGlvbj48L0E+SW50cm9kdWN0aW9uPC9oMj4KLTxwPlRoaXMgcGx1Z2luIGFsbG93cyB5b3UgdG8gcnVuIGEgcGFyYWxsZWwgb3Igc2VyaWFsIGFwcGxpY2F0aW9uIChqb2IpIHVzaW5nIHRoZSBUaXZvbGkgCi1Xb3JrbG9hZCBTY2hlZHVsZXIgTG9hZExldmVsZXIgZnJvbSB3aXRoaW4gdGhlIFBUUCBmcmFtZXdvcmsuIEluIGFkZGl0aW9uIHRvIHJ1bm5pbmcgcGFyYWxsZWwgCi1hbmQgc2VyaWFsIGpvYnMsIHlvdSBjYW4gbW9uaXRvciB0aGVpciBzdGF0dXMgYW5kIGNvbnRyb2wgdGhlaXIgZXhlY3V0aW9uIGZyb20gd2l0aGluIFBUUC48L3A+Ci08aDI+PEEgbmFtZT1yZXF1aXJlbWVudHM+PC9BPlJlcXVpcmVtZW50czwvaDI+Ci08cD5JbiBhZGRpdGlvbiB0byBoYXZpbmcgRWNsaXBzZSBhbmQgUFRQIGluc3RhbGxlZCwgeW91IG5lZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHNvZnR3YXJlIHBhY2thZ2VzIGluc3RhbGxlZC48L3A+Ci08dWw+Ci08bGk+SUJNIFRpdm9saSBXb3JrbG9hZCBTY2hlZHVsZXIgTG9hZExldmVsZXIgMy40IG9yIGxhdGVyPC9saT4KLTwvdWw+Ci08cD5TZWUgdGhlIGZvbGxvd2luZyBJQk0gVGl2b2xpIFdvcmtsb2FkIFNjaGVkdWxlciBMb2FkTGV2ZWxlciBWMy40IGd1aWRlcyBmb3Igc3BlY2lmaWMgTG9hZExldmVsZXIgCi1pbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzOjwvcD4KLTx1bD4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWIuYm91bGRlci5pYm0uY29tL2VwdWJzL3BkZi9hbTJpbjIwNi5wZGYiPgotVGl2b2xpIFdvcmtsb2FkIFNjaGVkdWxlciBMb2FkTGV2ZWxlciBWMy40IEluc3RhbGxhdGlvbiBHdWlkZQotPC9saT4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWIuYm91bGRlci5pYm0uY29tL2VwdWJzL3BkZi9hbTJ1ZzMwNS5wZGYiPgotVGl2b2xpIFdvcmtsb2FkIFNjaGVkdWxlciBMb2FkTGV2ZWxlciBWMy40IFVzaW5nIGFuZCBBZG1pbmlzdGVyaW5nIEd1aWRlCi08L2xpPgotPGxpPgotPGEgaHJlZj0iaHR0cDovL3B1YmxpYi5ib3VsZGVyLmlibS5jb20vZXB1YnMvcGRmL2FtMm1nMTA1LnBkZiI+Ci1UaXZvbGkgV29ya2xvYWQgU2NoZWR1bGVyIExvYWRMZXZlbGVyIFYzLjQgRGlhZ25vc2lzIGFuZCBNZXNzYWdlcyBHdWlkZQotPC9saT4KLTwvdWw+Ci0KLTxoMj48QSBuYW1lPXN0YXJ0aW5nPjwvQT5HZXR0aW5nIFN0YXJ0ZWQ8L2gyPgotPHA+RGVmaW5lIGFuIGFwcHJvcHJpYXRlIHByb2plY3QsIGVpdGhlciBhIEMvQysrIHByb2plY3QgdXNpbmcgQ0RUIG9yIGEgRk9SVFJBTiBwcm9qZWN0IHVzaW5nIFBob3RyYW4uIFlvdSBjYW4gZGVmaW5lIAotZWl0aGVyIGEgc3RhbmRhcmQgbWFrZSBwcm9qZWN0IG9yIGEgbWFuYWdlZCBtYWtlIHByb2plY3QuPC9wPgotPHA+WW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyBjb21waWxlciBpbnZvY2F0aW9uIGNvbW1hbmRzCi10byBpbnZva2UgdGhlIGNvbXBpbGVyIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgcGFyYWxsZWwgcHJvZ3JhbSB0byBydW4gd2l0aCB0aGUgTG9hZExldmVsZXIgcHJveHksIGVpdGhlciBpbiB5b3VyIG1ha2VmaWxlLCBvciB3aGVuIHNwZWNpZnlpbmcgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIgaW4gYSBtYW5hZ2VkIG1ha2UgcHJvamVjdC48L3A+Ci08dWw+Ci08bGk+QUlYPC9saT4KLTx1bD4KLTxsaT5tcGNjX3IgZm9yIEMgcHJvZ3JhbXM8L2xpPgotPGxpPm1wQ0NfciBmb3IgQysrIHByb2dyYW1zPC9saT4KLTxsaT5tcHhsZl9yIGZvciBGT1JUUkFOIHByb2dyYW1zPC9saT4KLTwvdWw+Ci08bGk+TGludXg8L2xpPgotPHVsPgotPGxpPm1wY2MgZm9yIEMgcHJvZ3JhbXM8L2xpPgotPGxpPm1wQ0MgZm9yIEMrKyBwcm9ncmFtczwvbGk+Ci08bGk+bXBmb3J0IGZvciBGT1JUUkFOIHByb2dyYW1zPC9saT4KLTwvdWw+Ci08L3VsPiAKLTxwPlRoZSBmb2xsb3dpbmcgaW1hZ2Ugc2hvd3MgaG93IHRoZSBjb21waWxlciBpcyBzcGVjaWZpZWQgZm9yIGEgbWFuYWdlZCBtYWtlIHByb2plY3QuIFRoZSBjb3JyZWN0IGxpbmtlciBzaG91bGQgYWxzbwotYmUgc3BlY2lmaWVkIGJ5IGNsaWNraW5nIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGxpbmtlci48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL3Byb2plY3RfY3JlYXRlLmpwZyI+Ci08aDI+PEEgbmFtZT1wcmVmZXJlbmNlcz48L0E+U2V0dGluZyBVcCBQcmVmZXJlbmNlczwvaDI+Ci08cD5PbmNlIHlvdSBoYXZlIGNyZWF0ZWQgeW91ciBwcm9qZWN0LCB5b3Ugc2hvdWxkIHN3aXRjaCB0byB0aGUgUFRQIHJ1bnRpbWUgcGVyc3BlY3RpdmUsIGFuZCBzZXQgdXAgdGhlIGRlZmF1bHQgCi1wcmVmZXJlbmNlcyBmb3IgTG9hZExldmVsZXIgYW5kIHNwZWNpZnkgdGhlIHJlcXVpcmVkIHJlc291cmNlIG1hbmFnZXIuIFRoaXMgc2V0dXAgbmVlZHMgdG8gb25seSBiZSBkb25lIG9uY2UuPC9wPgotPHA+VG8gc2V0dXAgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXM6IFdpbmRvdy0+UHJlZmVyZW5jZXMtPlBUUC0+UmVzb3VyY2UgTWFuYWdlcnMtPkxvYWRMZXZlbGVyLiBUaGUgSUJNTEwgcHJlZmVyZW5jZXMgCi1wYW5lbCBpcyBkaXNwbGF5ZWQuIEhlcmUsIHlvdSBzcGVjaWZ5IHRoZSBkZWZhdWx0IHBhdGggZm9yIGEgcmVzb3VyY2UgbWFuYWdlciB0byBiZSB1c2VkIGZvciBMb2FkTGV2ZWxlci48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3ByZWZlcmVuY2VzLmpwZyI+Ci08UD5JbiBhZGRpdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHByb3h5LCB5b3UgbWF5IHNwZWNpZnkgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgCi1wcm94eSBhbmQgdGhlIGZyb250IGVuZCBndWkuPC9wPgotPHVsPgotPGxpPjxiPkxpYnJhcnkgUHJveHkgUHJvdmF0ZSBMaWJyYXJ5IFBhdGg8L2I+IC0gSWYgeW91IGhhdmUgYSBub24gc3RhbmRhcmQgTG9hZExldmVsZXIgaW5zdGFsbGF0aW9uIHRoZW4geW91IGNhbiBzcGVjaWZ5IHRoZSAKLWRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSBsaWJsbGFwaS5hIChBSVgpIG9yIGxpYmxsYXBpLnNvIChMaW51eCkuPC9saT4KLTxsaT48Yj5Mb2FkTGV2ZWxlciBQcm94eSBNZXNzYWdlIE9wdGlvbnM8L2I+IC0gY2FuIGJlIHVzZWQgdG8gdHVybiBvbiBvciBvZmYgZGlmZmVyZW50IGNhdGFnb3JpZXMgb2YgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IAotdGhlIExvYWRMZXZlbGVyIHByb3h5LjwvbGk+Ci08bGk+PGI+TG9hZExldmVsZXIgUHJveHkgRGVidWcgT3B0aW9uczwvYj4gLSBJZiB5b3UgYXJlIGRlYnVnZ2luZyB0aGUgcHJveHksIHlvdSBjYW4gZm9yY2UgdGhlIHByb3h5IGludG8gYSBzcGluIGxvb3AgCi1pbiB0aGUgbWFpbiBlbnRyeSBwb2ludCBhbGxvd2luZyBhIGRlYnVnZ2VyIHRvIGJlIGF0dGFjaGVkLiBPbmNlIGEgZGVidWdnZXIgaGFzIGJlZW4gYXR0YWNoZWQgdGhlbiBicmVha3BvaW50cyBjYW4gCi1iZSBhc3NpZ25lZCBhbmQgdGhlIGxvb3AgY2FuY2VsZWQgYnkgc2V0dGluZyB0aGUgImRlYnVnX2xvb3AiIHZhcmlhYmxlIHRvIDAgaW4gdGhlIGRlYnVnZ2VyIGFuZCBjb250aW51aW5nIGV4ZWN1dGlvbi48L2xpPgotPGxpPjxiPkxvYWRMZXZlbGVyIEd1aSBNZXNzYWdlIE9wdGlvbnM8L2I+IC0gY2FuIGJlIHVzZWQgdG8gdHVybiBvbiBvciBvZmYgZGlmZmVyZW50IGNhdGFnb3JpZXMgb2YgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IAotdGhlIExvYWRMZXZlbGVyIFJlc291cmNlIE1hbmFnZXIgTGF1bmNoLjwvbGk+Ci08bGk+PGI+TG9hZExldmVsZXIgTXVsdGljbHVzdGVyIE9wdGlvbnM8L2I+IC0gV2hlbiBydW5uaW5nIExvYWRMZXZlbGVyIHZlcnNpb24gMy40LjEuMiBvciBsYXRlciB0aGVuIExvYWRMZXZlbGVyIHdpbGwgCi1pbmZvcm0gdGhlIHByb3h5IG9mIHdoZXRoZXIgb3Igbm90IGl0IGlzIGNvbmZpZ3VyZWQgdG8gcnVuIE11bHRpY2x1c3Rlci4gSWYgcnVubmluZyBhbiBlYXJsaWVyIHZlcnNpb24gb2YgTG9hZExldmVsZXIgCi10aGVuIHlvdSBtdXN0IHRlbGwgdGhlIHByb3h5IGJ5IGZvcmNpbmcgdGhlIExvY2FsIG9yIE11bHRpY2x1c3RlciBtb2RlLjwvbGk+Ci08bGk+PGI+TG9hZExldmVsZXIgSm9iIENvbW1hbmQgRmlsZSBUZW1wbGF0ZSBPdmVycmlkZTwvYj4gLSBXaGVuIHN1Ym1pdHRpbmcgam9icyB1c2luZyB0aGUgYmFzaWMgbW9kZSwgcGFyYW1ldGVycyBhcmUgCi1zdWJzdGl0dXRlZCBpbnRvIGEgdGVtcGxhdGUgZmlsZSBiZWZvcmUgdGhlIGpvYiBpcyBzdWJtaXR0ZWQgdG8gTG9hZExldmVsZXIuIFlvdSBjYW4gc3BlY2lmeSB5b3VyIG93biB0ZW1wbGF0ZSBmaWxlIAotY29udGFpbmluZyBhIG1peCBvZiB0aGUga2V5d29yZHMgdG8gYmUgc3Vic3RpdHV0ZWQgYW5kIHNwZWNpZmljIGpvYiBjb21tYW5kIGZpbGUgcGFyYW1ldGVycyBvZiB5b3VyIGNob2ljZS48L2xpPgotPGxpPjxiPkxvYWRMZXZlbGVyIEJhc2ljIFRlbXBsYXRlIE9wdGlvbnM8L2I+IC0gWW91IGNhbiBpbnN0cnVjdCB0aGUgcHJveHkgdG8gd3JpdGUgdGhlIHRlbXBsYXRlIGZpbGUgaXQgaXMgdXNpbmcgdG8gL3RtcCBlYWNoIHRpbWUKLXRoZSBwcm94eSBpcyBzdGFydGVkIGFuZCB0aGUgbWFpbiBlbnRyeSBwb2ludCBpcyBlbnRlcmVkLCBvciBuZXZlciB3cml0ZSB0aGUgdGVtcGxhdGUgZmlsZSBmb3IgdGhvc2UgY2FzZXMgd2hlcmUgeW91IGFyZSAKLXVzaW5nIG9ubHkgYWR2YW5jZWQgbW9kZSBvciBhcmUgc3BlY2lmeWluZyB5b3VyIG93biB0ZW1wbGF0ZSBmaWxlIHRvIGJlIHVzZWQuPC9saT4KLTxsaT48Yj5Mb2FkTGV2ZWxlciBQcm94eSBQb2xsaW5nIE9wdGlvbnM8L2I+IC0gSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBub2RlcyBhbmQgam9icyBzdGF0dXMgdGhlIHByb3h5IG11c3QgcG9sbAotTG9hZExldmVsZXIuIFRoZSBwb2xsaW5nIG9wdGlvbnMgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBxdWVyeXMuIFRoZSBOb2RlIHBvbGxpbmcgYWxsb3dzIGEgbWluaW11bSBhbmQgbWF4aW11bSBwb2xsLgotRWFjaCB0aW1lIHRoZSBwcm94eSBwb2xscyBMb2FkTGV2ZWxlciBmb3Igbm9kZSBzdGF0dXMgYW5kIHRoZXJlIGhhdmUgbm90IGJlZW4gYW55IGNoYW5nZXMgc2luY2UgdGhlIGxhc3QgcG9sbCB0aGVuIHRoZSB0aW1lIAotaXMgaW5jcmVtZW50YWxseSBpbmNyZWFzZWQgdW50aWwgdGhlIG1heGltdW0gdGltZSBpcyByZWFjaGVkLiBUaGlzIGhlbHBzIHRvIG1pbmltaXplIHRoZSBpbXBhY3Qgb24gTG9hZExldmVsZXIgb2YgCi1jb250aW51b3VzbHkgcG9vbGluZyBmb3IgZGF0YS48L2xpPgotPC91bD4gCi08aDI+PEEgbmFtZT1jcmVhdGVtYW5hZ2VyPjwvQT5DcmVhdGluZyBhIFJlc291cmNlIE1hbmFnZXI8L2gyPgotPHA+T25jZSB5b3UgaGF2ZSBzZXQgdXAgcHJlZmVyZW5jZXMsIHlvdSBzaG91bGQgY3JlYXRlIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciBMb2FkTGV2ZWxlcjogVG8gZG8gdGhpcywgcmlnaHQtY2xpY2sgaW4gdGhlCi1yZXNvdXJjZSBtYW5hZ2VycyB2aWV3IGFuZCBzZWxlY3RpbmcgPGI+QWRkIFJlc291cmNlIE1hbmFnZXI8L2I+IGZyb20gdGhlIG1lbnUuIEEgcmVzb3VyY2UgbWFuYWdlciB3aXphcmQgd2lsbCBiZSAKLWRpc3BsYXllZC4gU2VsZWN0IDxiPklCTUxMPC9iPiBmcm9tIHRoZSBsaXN0IG9mIHJlc291cmNlIG1hbmFnZXIgdHlwZXMgYW5kIGNsaWNrIG5leHQuIFRoZSBuZXh0IHBhbmVsIGRpc3BsYXllZCBjb25maWd1cmVzCi10aGUgSUJNTEwgcmVzb3VyY2UgbWFuYWdlci4gU2VsZWN0IHRoZSBSZW1vdGUgc2VydmljZSBwcm92aWRlciBhbmQgcHJveHkgc2VydmVyIGxvY2F0aW9uIGZyb20gdGhlIGRyb3Bkb3duIGxpc3RzLiBZb3UgY2FuCi1hbHNvIGNyZWF0ZSBhIG5ldyBwcm94eSBzZXJ2ZXIgbG9jYXRpb24gYnkgY2xpY2tpbmcgdGhlIDxiPk5ldzwvYj4gYnV0dG9uIGluIHRoaXMgcGFuZS4gU3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgcHJveHkgCi1zZXJ2ZXIgZXhlY3V0YWJsZSwgb3IganVzdCBhY2NlcHQgdGhlIHZhbHVlIGZpbGxlZCBpbiBhcyBkZWZhdWx0IGZyb20gdGhlIHByZWZlcmVuY2VzIHBhbmVsLiBVbmNoZWNrIHRoZSA8Yj5MYXVuY2ggc2VydmVyIAotbWFudWFsbHk8L2I+IGFuZCBjbGljayBuZXh0IGFnYWluLiBPbiB0aGUgZmluYWwgcGFnZSBvZiB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBtYW5hZ2VyIHdpemFyZCwgZWl0aGVyIGFjY2VwdCB0aGUgCi1kZWZhdWx0IHJlc291cmNlIG1hbmFnZXIgbmFtZSwgb3IgdW5jaGVjayB0aGUgY2hlY2tib3ggYW5kIGVudGVyIGEgbmFtZSBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyLiAKLVRoZW4gY2xpY2sgZmluaXNoIHRvIGNyZWF0ZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBlbnRyeS48L3A+Ci08cD5UaGUgaW1hZ2UgYmVsb3cgc2hvd3MgdGhlIHNlcmllcyBvZiBJQk1MTCBwcm94eSBjb25maWd1cmF0aW9uIHBhbmVscyBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciB3aXphcmQuPC9wPgotPHA+Q29uZmlndXJlIHRoZSByZXNvdXJjZSBtYW5hZ2VyLjwvUD4KLTxpbWcgc3JjPSJpbWFnZXMvaWJtbGxfcHJveHlfY29uZmlnXzEuanBnIj4KLTxwPk92ZXJyaWRlIHByZWZlcmVuY2VzIHNldGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIG9jY3VyYW5jZSBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlci48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3Byb3h5X2NvbmZpZ18yLmpwZyI+Ci08cD5OYW1lIHRoaXMgb2NjdXJhbmNlIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyLjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvaWJtbGxfcHJveHlfY29uZmlnXzMuanBnIj4KLTxwPllvdSBtYXkgaGF2ZSBhcyBtYW55IHJlc291cmNlIG1hbmFnZXJzIGRlZmluZWQgYXMgeW91IHJlcXVpcmUgZm9yIHlvdXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24uPC9wPgotPGgyPjxBIG5hbWU9c3RhcnRtYW5hZ2VyPjwvQT5TdGFydGluZyBhIFJlc291cmNlIE1hbmFnZXI8L2gyPgotPHA+T25jZSB5b3UgaGF2ZSBkZWZpbmVkIGEgcmVzb3VyY2UgbWFuYWdlciwgeW91IG11c3Qgc3RhcnQgaXQgYmVmb3JlIGl0IGNhbiBydW4gYSBwYXJhbGxlbCBhcHBsaWNhdGlvbiB1c2luZyB0aGF0Ci1yZXNvdXJjZSBtYW5hZ2VyLiBUbyBzdGFydCBhIHJlc291cmNlIG1hbmFnZXIsIHJpZ2h0LWNsaWNrIG92ZXIgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIG1hbmFnZXIgaW4gdGhlIHJlc291cmNlIG1hbmFnZXIgCi12aWV3IHRoZW4gc2VsZWN0IDxiPlN0YXJ0IHJlc291cmNlIG1hbmFnZXI8L2I+IGZyb20gdGhlIHBvcHVwIG1lbnUuIE9uY2Ugc3RhcnRlZCwgdGhlIGljb24gZm9yIHRoZSBzZWxlY3RlZCByZXNvdXJjZSAKLW1hbmFnZXIgd2lsbCB0dXJuIGdyZWVuLjwvcD4gCi08cD5JZiBuZWNlc3NhcnksIHlvdSBjYW4gc3RvcCBhIHJlc291cmNlIG1hbmFnZXIgYnkgcmlnaHQtY2xpY2tpbmcgb3ZlciBpdHMgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlciBhbmQgc2VsZWN0aW5nIAotPGI+U3RvcCByZXNvdXJjZSBtYW5hZ2VyPC9iPiBmcm9tIHRoZSBwb3B1cCBtZW51LiBOb3JtYWxseSwgYSByZXNvdXJjZSBtYW5nZXIgd2lsbCBzaHV0ZG93biBhdXRvbWF0aWNhbGx5IHdoZW4gUFRQIGlzCi1zaHV0ZG93biwgYW5kIGlmIGl0IHdhcyBydW5uaW5nIHdoZW4gUFRQIHdhcyBzaHV0ZG93biwgdGhlbiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhcnQgd2hlbiBQVFAgaXMgc3RhcnRlZCBhZ2Fpbi48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3N0YXJ0X3Jlc291cmNlX21hbmFnZXIuanBnIj4KLTxoMj48QSBuYW1lPXJ1bm5pbmc+PC9BPlJ1bm5pbmcgYSBQYXJhbGxlbCBBcHBsaWNhdGlvbjwvaDI+Ci08cD5PbmNlIGFuIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGNvbXBpbGVkLCB0aGUgZmlyc3Qgc3RlcCBpbiBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbiBpcyB0byBiZSBzdXJlIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciAKLUxvYWRMZXZlbGVyIGlzIHJ1bm5pbmcgb24gYSBub2RlIGluIHRoZSBMb2FkTGV2ZWxlciBjbHVzdGVyIHdoZXJlIHlvdSBpbnRlbmQgdG8gc3RhcnQgdGhlIGFwcGxpY2F0aW9uLiBUbyBkbyB0aGlzLCBjaGVjayB0aGUgcmVzb3VyY2UgCi1tYW5hZ2VyJ3MgZW50cnkgaW4gdGhlIHJlc291cmNlIG1hbmFnZXIgdmlldy4gVGhlIGljb24gZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHNob3VsZCBiZSBncmVlbi4gSWYgaXQgaXMgbm90IGdyZWVuLCB0aGVuIAotcmlnaHQgY2xpY2sgb3ZlciB0aGUgcmVzb3VyY2UgbWFuYWdlcidzIG5hbWUgYW5kIHNlbGVjdCA8Yj5TdGFydCByZXNvdXJjZSBtYW5hZ2VyPC9iPiBmcm9tIHRoZSBwb3B1cCBtZW51IHRvIHN0YXJ0IHRoZQotcmVzb3VyY2UgbWFuYWdlci48L3A+Ci08cD5CZWZvcmUgcnVubmluZyBhbiBhcHBsaWNhdGlvbiwgaXQgbXVzdCBoYXZlIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBmb3IgaXQuIEEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgCi1hbGwgb2YgdGhlIHNldHRpbmdzIHJlcXVpcmVkIHRvIHJ1biB0aGUgYXBwbGljYXRpb24uIFRoZSB2YWx1ZXMgZW50ZXJlZCBpbiBhIGxhdW5jaCBjb25maWd1cmF0aW9uIGFyZSBzYXZlZCBzbyB0aGF0IHRoZQotbmV4dCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBpcyBydW4gdXNpbmcgdGhlIHNhbWUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIHRob3NlIHZhbHVlcyBkbyBub3QgbmVlZCB0byBiZSBlbnRlcmVkIGFnYWluLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIGxhdW5jaCBjb25maWd1cmF0aW9uLCBjbGljayB0aGUgPGI+UnVuPC9iPiBtZW51IGluIHRoZSBFY2xpcHNlIG1lbnViYXIgYW5kIHNlbGVjdCA8Yj5PcGVuIFJ1biBEaWFsb2c8L2I+LiAKLUFsdGVybmF0aXZlbHksIGNsaWNrIHRoZSBkcm9wZG93biBuZXh0IHRvIHRoZSBydW4gaWNvbiBpbiB0aGUgRWNsaXBzZSB0b29sYmFyIGFuZCBzZWxlY3QgT3BlbiBSdW4gRGlhbG9nLiAKLVdoZW4gdGhlIHJ1biBkaWFsb2cgaXMgZGlzcGxheWVkLCByaWdodCBjbGljayBvdmVyIDxiPlBhcmFsbGVsIEFwcGxpY2F0aW9uPC9iPiBhbmQgY2xpY2sgPGI+TmV3PC9iPiBmcm9tIHRoZSBtZW51LiAKLVRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgbGF1bmNoIGNvbmZpZ3VyYXRpb24uIFNldCBpdHMgbmFtZSB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gU2VsZWN0IHRoZSA8Yj5NYWluPC9iPiB0YWIgYW5kIGZpbGwgaW4KLXRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbS48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3J1bl9hcHBsaWNhdGlvbl8xLmpwZyI+Ci08cD5NYWtlIHN1cmUgdGhhdCB0aGUgZGVidWdnZXIgdGFiIGhhcyBhbiBhcHByb3ByaWF0ZSBkZWJ1Z2dlciBzZWxlY3RlZC4KLUZpbGwgaW4gdGhlIEFyZ3VtZW50cyB0YWIgd2l0aCBhbnkgYXBwbGljYXRpb24gcHJvZ3JhbSBhcmd1bWVudHMuIEZpbGwgaW4gdGhlIEVudmlyb25tZW50IHRhYiB3aXRoIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZQotc2V0dGluZ3MgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uLjwvcD4KLTxwPlRoZSA8Yj5SZXNvdXJjZXM8L2I+IHRhYiBpcyB0aGUgdGFiIHdoZXJlIGludm9jYXRpb24gb3B0aW9ucyB1bmlxdWUgdG8gTG9hZExldmVsZXIuIFdoZW4gaXQgaXMgaW5pdGlhbGx5IGRpc3BsYXllZCwKLWl0IHdpbGwgYXBwZWFyIHdpdGggdGhlIDxiPmFkdmFuY2VkPC9iPiBvcHRpb24gc2VsZWN0ZWQgYWxsb3dpbmcgc3BlY2lmaWNhdGlvbiBvZiBhbiBleGlzdGluZyBjb21wbGV0ZSBMb2FkTGV2ZWxlciBqb2IgY29tbWFuZAotZmlsZSAobm8gc3Vic3RpdHV0aW9ucyBwZXJtaXR0ZWQpLiBUaGlzIGlzIGludGVuZGVkIGZvciB0aGUgZXhwZXJpZW5jZWQgTG9hZExldmVsZXIgdXNlciB3aG8gaGFzIGNvbnN0cnVjdGVkIGhpcy9oZXIgb3duIAotY29tcGxleCBqb2IgY29tbWFuZCBmaWxlIHRvIHJ1biBwYXJhbGxlbCBvciBzZXJpYWwgam9icy48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3J1bl9hZHZhbmNlZF9hcHBsaWNhdGlvbl8yLmpwZyI+Ci08cD5XaGVuIDxiPlJ1bjwvYj4gaXMgc2VsZWN0ZWQgdGhlIGpvYiBjb21tYW5kIGZpbGUgaXMgcGFzc2VkIHRvIHRoZSBMb2FkTGV2ZWxlciBSZXNvdXJjZSBtYW5hZ2VyIHByb3h5IGFuZCBpcyBzdWJtaXR0ZWQgCi10byBMb2FkTGV2ZWxlciBmb3IgZXhlY3V0aW9uLiBXaGVuIHRoZSBqb2Igc3RhcnRzIGl0IHdpbGwgYXBwZWFyIGluIHRoZSBQVFAgdmlldy48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3J1bl9hZHZhbmNlZF9hcHBsaWNhdGlvbl8zLmpwZyI+Ci08cD5JZiB0aGUgPGI+QmFzaWM8L2I+IG9wdGlvbiBpcyBzZWxlY3RlZCB0aGVuIHlvdSB3aWxsIGJlIHBlcm1pdHRlZCB0byBzcGVjaWZ5IGEgdGVtcGxhdGUKLWZpbGUgZm9yIHBhcmFtZXRlciB2YWx1ZSBzdWJzdGl0dXRpb24uIE11bHRpcGxlIHRhYmJlZCBwYW5lbHMgd2lsbCBiZSBhY3RpdmF0ZWQgdG8gYWxsb3cgc3BlY2lmaWNhdGlvbiAKLW9mIGEgc3Vic2V0IG9mIExvYWRMZXZlbGVyIEpvYiBDb21tYW5kIGZpbGUgcGFyYW1ldGVycy4gSWYgeW91IG5lZWQgdG8gc3BlY2lmeSBhIHBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0YWJiZWQgcGFuZWxzCi0gdGhlbiB5b3UgbXVzdCBvdmVycmlkZSB0aGUgdGVtcGxhdGUgZmlsZSBiZWluZyB1c2VkIGFuZCBhZGQgdGhlIHBhcmFtZXRlciB0byB5b3VyIG93biB0ZW1wbGF0ZS48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3J1bl9iYXNpY19hcHBsaWNhdGlvbl8yLmpwZyI+Ci08cD5FeGFtcGxlIG9mIHRoZSA8Yj5Ob2Rlcy9OZXR3b3JrPC9iPiBUYWI8L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL2libWxsX3J1bl9iYXNpY19hcHBsaWNhdGlvbl8zLmpwZyI+Ci08aDI+PEEgbmFtZT10ZW1wbGF0ZT48L0E+VGVtcGxhdGUgRmlsZSBGb3IgQmFzaWMgTW9kZTwvaDI+Ci08cD5DdXJyZW50bHksIG9ubHkgYSBzdWJzZXQgb2YgTG9hZExldmVsZXIgSm9iIENvbW1hbmQgRmlsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIFRhYmJlZCBQYW5lbHMuIFRoZSBmb2xsb3dpbmcgCi1pcyBhbiBleGFtcGxlIG9mIHRoZSB0ZW1wbGF0ZSBmaWxlIHVzZWQgYnkgdGhlIExvYWRMZXZlbGVyIFJlc291cmNlIG1hbmFnZXIgYW5kIGFsbCBvZiB0aGUgcG9zc2libGUgcGFyYW1ldGVycy4gQWRkaXRpb25hbGx5LAotdGhpcyB0ZW1wbGF0ZSBsaXN0cyB0aG9zZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFJlc291cmNlIE1hbmFnZXIuIElmIAoteW91IHdhbnQgdG8gdXNlIGFueSBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRhYmJlZCBwYW5lbHMgdGhlbiBjb3B5IHRoZSB0ZW1wbGF0ZSBmaWxlIHRvIHlvdXIgb3duIGZpbGUgCi1hbmQgY3VzdG9taXplIHlvdXIgb3duIHRlbXBsYXRlIGZpbGUuPGJyPjxicj4gCi08c21hbGw+Ci0jIS9iaW4vc2g8YnI+Ci0jIEAgYWNjb3VudF9ubyA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9BQ0NPVU5UX05PJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGFyZ3VtZW50cyA9ICZsdDsmbHQ7Jmx0O3Byb2dBcmdzJmd0OyZndDsmZ3Q7PGJyPgotIyhOT1QgU1VQUE9SVEVEKSMgQCBiZ19jb25uZWN0aW9uPGJyPgotIyhOT1QgU1VQUE9SVEVEKSMgQCBiZ19wYXJ0aXRpb248YnI+Ci0jKE5PVCBTVVBQT1JURUQpIyBAIGJnX3JlcXVpcmVtZW50czxicj4KLSMoTk9UIFNVUFBPUlRFRCkjIEAgYmdfcm91dGU8YnI+Ci0jKE5PVCBTVVBQT1JURUQpIyBAIGJnX3NoYXBlPGJyPgotIyhOT1QgU1VQUE9SVEVEKSMgQCBiZ19zaXplPGJyPgotIyBAIGJsb2NraW5nID0gJmx0OyZsdDsmbHQ7TExfUFRQX0JMT0NLSU5HJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGJ1bGt4ZmVyID0gJmx0OyZsdDsmbHQ7TExfUFRQX0JVTEtYRkVSJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGNoZWNrcG9pbnQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfQ0hFQ0tQT0lOVCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBja3B0X2RpciA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DS1BUX0RJUiZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBja3B0X2V4ZWN1dGVfZGlyID0gJmx0OyZsdDsmbHQ7TExfUFRQX0NLUFRfRVhFQ1VURV9ESVImZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgY2twdF9maWxlID0gJmx0OyZsdDsmbHQ7TExfUFRQX0NLUFRfRklMRSZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBja3B0X3RpbWVfbGltaXQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfQ0tQVF9USU1FX0xJTUlUX0hBUkQmZ3Q7Jmd0OyZndDssJmx0OyZsdDsmbHQ7TExfUFRQX0NLUFRfVElNRV9MSU1JVF9TT0ZUJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGNsYXNzID0gJmx0OyZsdDsmbHQ7TExfUFRQX0NMQVNTJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGNsdXN0ZXJfaW5wdXRfZmlsZSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DTFVTVEVSX0lOUFVUX0ZJTEVfMSZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBjbHVzdGVyX2lucHV0X2ZpbGUgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfQ0xVU1RFUl9JTlBVVF9GSUxFXzImZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgY2x1c3Rlcl9pbnB1dF9maWxlID0gJmx0OyZsdDsmbHQ7TExfUFRQX0NMVVNURVJfSU5QVVRfRklMRV8zJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGNsdXN0ZXJfbGlzdCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DTFVTVEVSX0xJU1QmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgY2x1c3Rlcl9vdXRwdXRfZmlsZSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DTFVTVEVSX09VVFBVVF9GSUxFXzEmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgY2x1c3Rlcl9vdXRwdXRfZmlsZSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DTFVTVEVSX09VVFBVVF9GSUxFXzImZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgY2x1c3Rlcl9vdXRwdXRfZmlsZSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DTFVTVEVSX09VVFBVVF9GSUxFXzMmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgY29tbWVudCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9DT01NRU5UJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGNvcmVfbGltaXQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfQ09SRV9MSU1JVF9IQVJEJmd0OyZndDsmZ3Q7LCZsdDsmbHQ7Jmx0O0xMX1BUUF9DT1JFX0xJTUlUX1NPRlQmZ3Q7Jmd0OyZndDs8YnI+Ci0jKE5PVCBTVVBQT1JURUQpIyBAIGNvc2NoZWR1bGU8YnI+Ci0jIEAgY3B1X2xpbWl0ID0gJmx0OyZsdDsmbHQ7TExfUFRQX0NQVV9MSU1JVF9IQVJEJmd0OyZndDsmZ3Q7LCZsdDsmbHQ7Jmx0O0xMX1BUUF9DUFVfTElNSVRfU09GVCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBkYXRhX2xpbWl0ID0gJmx0OyZsdDsmbHQ7TExfUFRQX0RBVEFfTElNSVRfSEFSRCZndDsmZ3Q7Jmd0OywmbHQ7Jmx0OyZsdDtMTF9QVFBfREFUQV9MSU1JVF9TT0ZUJmd0OyZndDsmZ3Q7PGJyPgotIyhOT1QgU1VQUE9SVEVEKSMgQCBkZXBlbmRlbmN5PGJyPgotIyBAIGVudl9jb3B5ID0gJmx0OyZsdDsmbHQ7TExfUFRQX0VOVl9DT1BZJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGVudmlyb25tZW50ID0gJmx0OyZsdDsmbHQ7TExfUFRQX0VOVklST05NRU5UJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGVycm9yID0gJmx0OyZsdDsmbHQ7TExfUFRQX0VSUk9SJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGV4ZWN1dGFibGUgPSAmbHQ7Jmx0OyZsdDtleGVjUGF0aCZndDsmZ3Q7Jmd0Oy8mbHQ7Jmx0OyZsdDtleGVjTmFtZSZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBleGVjdXRhYmxlID0gJmx0OyZsdDsmbHQ7TExfUFRQX0VYRUNVVEFCTEUmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgZmlsZV9saW1pdCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9GSUxFX0xJTUlUX0hBUkQmZ3Q7Jmd0OyZndDssJmx0OyZsdDsmbHQ7TExfUFRQX0ZJTEVfTElNSVRfU09GVCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBncm91cCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9HUk9VUCZndDsmZ3Q7Jmd0Ozxicj4KLSMoTk9UIFNVUFBPUlRFRCkjIEAgaG9sZDxicj4KLSMgQCBpbWFnZV9zaXplID0gJmx0OyZsdDsmbHQ7TExfUFRQX0lNQUdFX1NJWkUmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgaW5pdGlhbGRpciA9ICZsdDsmbHQ7Jmx0O3dvcmtpbmdEaXImZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgaW5pdGlhbGRpciA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9JTklUSUFMRElSJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGlucHV0ID0gJmx0OyZsdDsmbHQ7TExfUFRQX0lOUFVUJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGpvYl9jcHVfbGltaXQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfSk9CX0NQVV9MSU1JVF9IQVJEJmd0OyZndDsmZ3Q7LCAmbHQ7Jmx0OyZsdDtMTF9QVFBfSk9CX0NQVV9MSU1JVF9TT0ZUJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGpvYl9uYW1lID0gJmx0OyZsdDsmbHQ7TExfUFRQX0pPQl9OQU1FJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGpvYl90eXBlID0gJmx0OyZsdDsmbHQ7TExfUFRQX0pPQl9UWVBFJmd0OyZndDsmZ3Q7PGJyPgotIyBAIGxhcmdlX3BhZ2UgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfTEFSR0VfUEFHRSZndDsmZ3Q7Jmd0Ozxicj4KLSMoTk9UIFNVUFBPUlRFRCkjIEAgbWF4X3Byb2Nlc3NvcnM8YnI+Ci0jIEAgbWNtX2FmZmluaXR5X29wdGlvbnMgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfTUNNX0FGRklOSVRZX09QVElPTlMmZ3Q7Jmd0OyZndDs8YnI+Ci0jKE5PVCBTVVBQT1JURUQpIyBAIG1pbl9wcm9jZXNzb3JzPGJyPgotIyBAIG5ldHdvcmsuTVBJID0gJmx0OyZsdDsmbHQ7TExfUFRQX05FVFdPUktfTVBJJmd0OyZndDsmZ3Q7PGJyPgotIyBAIG5ldHdvcmsuTEFQSSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9ORVRXT1JLX0xBUEkmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgbmV0d29yay5NUElfTEFQSSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9ORVRXT1JLX01QSV9MQVBJJmd0OyZndDsmZ3Q7PGJyPgotIyBAIG5vZGUgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfTk9ERV9NSU4mZ3Q7Jmd0OyZndDssJmx0OyZsdDsmbHQ7TExfUFRQX05PREVfTUFYJmd0OyZndDsmZ3Q7PGJyPgotIyBAIG5vZGVfdXNhZ2UgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfTk9ERV9VU0FHRSZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBub3RpZmljYXRpb24gPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfTk9USUZJQ0FUSU9OJmd0OyZndDsmZ3Q7PGJyPgotIyBAIG5vdGlmeV91c2VyID0gJmx0OyZsdDsmbHQ7TExfUFRQX05PVElGWV9VU0VSJmd0OyZndDsmZ3Q7PGJyPgotIyBAIG91dHB1dCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9PVVRQVVQmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgcHJlZmVyZW5jZXMgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfUFJFRkVSRU5DRVMmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgcmVxdWlyZW1lbnRzID0gJmx0OyZsdDsmbHQ7TExfUFRQX1JFUVVJUkVNRU5UUyZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCByZXNvdXJjZXMgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfUkVTT1VSQ0VTJmd0OyZndDsmZ3Q7PGJyPgotIyBAIHJlc3RhcnQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfUkVTVEFSVCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCByZXN0YXJ0X2Zyb21fY2twdCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9SRVNUQVJUX0ZST01fQ0tQVCZndDsmZ3Q7Jmd0Ozxicj4KLSMoTk9UIFNVUFBPUlRFRCkjIEAgcmVzdGFydF9vbl9zYW1lX25vZGVzPGJyPgotIyBAIHJzZXQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfUlNFVCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBzaGVsbCA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9TSEVMTCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBzbXQgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfU01UJmd0OyZndDsmZ3Q7PGJyPgotIyBAIHN0YWNrX2xpbWl0ID0gJmx0OyZsdDsmbHQ7TExfUFRQX1NUQUNLX0xJTUlUX0hBUkQmZ3Q7Jmd0OyZndDssJmx0OyZsdDsmbHQ7TExfUFRQX1NUQUNLX0xJTUlUX1NPRlQmZ3Q7Jmd0OyZndDs8YnI+Ci0jIEAgc3RhcnRfZGF0ZSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9TVEFSVF9EQVRFJmd0OyZndDsmZ3Q7PGJyPgotIyhOT1QgU1VQUE9SVEVEKSMgQCBzdGVwX25hbWU8YnI+Ci0jIEAgdGFza19nZW9tZXRyeSA9ICZsdDsmbHQ7Jmx0O0xMX1BUUF9UQVNLX0dFT01FVFJZJmd0OyZndDsmZ3Q7PGJyPgotIyBAIHRhc2tzX3Blcl9ub2RlID0gJmx0OyZsdDsmbHQ7TExfUFRQX1RBU0tTX1BFUl9OT0RFJmd0OyZndDsmZ3Q7PGJyPgotIyBAIHRvdGFsX3Rhc2tzID0gJmx0OyZsdDsmbHQ7TExfUFRQX1RPVEFMX1RBU0tTJmd0OyZndDsmZ3Q7PGJyPgotIyBAIHVzZXJfcHJpb3JpdHkgPSAmbHQ7Jmx0OyZsdDtMTF9QVFBfVVNFUl9QUklPUklUWSZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCB3YWxsX2Nsb2NrX2xpbWl0ID0gJmx0OyZsdDsmbHQ7TExfUFRQX1dBTExDTE9DS19IQVJEJmd0OyZndDsmZ3Q7LCZsdDsmbHQ7Jmx0O0xMX1BUUF9XQUxMQ0xPQ0tfU09GVCZndDsmZ3Q7Jmd0Ozxicj4KLSMgQCBxdWV1ZTxicj4KLTwvc21hbGw+Ci08L3A+Ci08aDI+PEEgbmFtZT1yZXN0cmljdGlvbnM+PC9BPlJlc3RyaWN0aW9uczwvaDI+Ci08dWw+Ci08bGk+QWxsIHBhdGhuYW1lcyBzcGVjaWZpZWQgaW4gdGhlIFJlc291cmNlcyB0YWIgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIG11c3QgYmUgYWJzb2x1dGUgcGF0aG5hbWVzPC9saT4KLTwvdWw+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcHJlZmVyZW5jZXMuanBnIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9wcmVmZXJlbmNlcy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OGY3NTUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9wcmVmZXJlbmNlcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3Byb3h5X2NvbmZpZ18xLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcHJveHlfY29uZmlnXzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjZkOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcHJveHlfY29uZmlnXzEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9wcm94eV9jb25maWdfMi5qcGcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3Byb3h5X2NvbmZpZ18yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzN2UwNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3Byb3h5X2NvbmZpZ18yLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcHJveHlfY29uZmlnXzMuanBnIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9wcm94eV9jb25maWdfMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGEzMjYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9wcm94eV9jb25maWdfMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3J1bl9hZHZhbmNlZF9hcHBsaWNhdGlvbl8yLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcnVuX2FkdmFuY2VkX2FwcGxpY2F0aW9uXzIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVlNTY5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcnVuX2FkdmFuY2VkX2FwcGxpY2F0aW9uXzIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9ydW5fYWR2YW5jZWRfYXBwbGljYXRpb25fMy5qcGcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3J1bl9hZHZhbmNlZF9hcHBsaWNhdGlvbl8zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwN2JlZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3J1bl9hZHZhbmNlZF9hcHBsaWNhdGlvbl8zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcnVuX2FwcGxpY2F0aW9uXzEuanBnIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9ydW5fYXBwbGljYXRpb25fMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzkxMjcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9ydW5fYXBwbGljYXRpb25fMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3J1bl9iYXNpY19hcHBsaWNhdGlvbl8yLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcnVuX2Jhc2ljX2FwcGxpY2F0aW9uXzIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjUyZTVlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfcnVuX2Jhc2ljX2FwcGxpY2F0aW9uXzIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9odG1sL2ltYWdlcy9pYm1sbF9ydW5fYmFzaWNfYXBwbGljYXRpb25fMy5qcGcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3J1bl9iYXNpY19hcHBsaWNhdGlvbl8zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5NDEzZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3J1bl9iYXNpY19hcHBsaWNhdGlvbl8zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfc3RhcnRfcmVzb3VyY2VfbWFuYWdlci5qcGcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL2libWxsX3N0YXJ0X3Jlc291cmNlX21hbmFnZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRjZWQwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvaWJtbGxfc3RhcnRfcmVzb3VyY2VfbWFuYWdlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL2h0bWwvaW1hZ2VzL3Byb2plY3RfY3JlYXRlLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvcHJvamVjdF9jcmVhdGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODEzMjk2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvaHRtbC9pbWFnZXMvcHJvamVjdF9jcmVhdGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzdhMWUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgSUJNIExvYWRMZXZlbGVyIFVzZXIgR3VpZGUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2JkMWIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLQotPCEtLSBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgLS0+Ci08IS0tIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgIC0tPgotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAtLT4KLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jCi0gICAgICAgICAgICBmaWxlPSJ0b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvaGVscC9BY3RpdmF0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvaGVscC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYwYjJhYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL2hlbHAvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscCI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC90b2MueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuaGVscC90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTU4Njg3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgIC0tPgotPCEtLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAtLT4KLTwhLS0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgLS0+Ci08IS0tIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJSdW5uaW5nIElCTSBMb2FkTGV2ZWxlciBCYXRjaCBKb2JzIj4KLQk8dG9waWMgbGFiZWw9IkludHJvZHVjdGlvbiIgIGhyZWY9Imh0bWwvSUJNTExNYWluSGVscC5odG1sI2ludHJvZHVjdGlvbiI+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJSZXF1aXJlbWVudHMiIGhyZWY9Imh0bWwvSUJNTExNYWluSGVscC5odG1sI3JlcXVpcmVtZW50cyI+PC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCIgaHJlZj0iaHRtbC9JQk1MTE1haW5IZWxwLmh0bWwjc3RhcnRpbmciPjwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJTZXR0aW5nIFVwIFByZWZlcmVuY2VzIiBocmVmPSJodG1sL0lCTUxMTWFpbkhlbHAuaHRtbCNwcmVmZXJlbmNlcyI+PC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgUmVzb3VyY2UgTWFuYWdlciIgaHJlZj0iaHRtbC9JQk1MTE1haW5IZWxwLmh0bWwjY3JlYXRlbWFuYWdlciI+PC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlN0YXJ0aW5nIGEgUmVzb3VyY2UgTWFuYWdlciIgaHJlZj0iaHRtbC9JQk1MTE1haW5IZWxwLmh0bWwjc3RhcnRtYW5hZ2VyIj48L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iUnVubmluZyBhbiBhcHBsaWNhdGlvbiIgaHJlZj0iaHRtbC9JQk1MTE1haW5IZWxwLmh0bWwjcnVubmluZyI+PC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlRlbXBsYXRlIEZpbGUgRm9yIEJhc2ljIE1vZGUiIGhyZWY9Imh0bWwvSUJNTExNYWluSGVscC5odG1sI3RlbXBsYXRlIj48L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iUmVzdHJpY3Rpb25zIiBocmVmPSJodG1sL0lCTUxMTWFpbkhlbHAuaHRtbCNyZXN0cmljdGlvbnMiPjwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5Ly5jZHRwcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvLmNkdHByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTZiODUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4KLQotPGNkdHByb2plY3QgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZSI+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiLz4KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIgaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLk1hY2hPIj4KLTxhdHRyaWJ1dGUga2V5PSJjKytmaWx0IiB2YWx1ZT0iYysrZmlsdCIvPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5DSW5kZXhlciIgaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbXNvdXJjZWluZGV4ZXIiLz4KLTxkYXRhPgotPGl0ZW0gaWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiB1c2VEZWZhdWx0PSJ0cnVlIiBjb21tYW5kPSJnY2MiIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9Ii8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gdXNlRGVmYXVsdD0idHJ1ZSIgY29tbWFuZD0ibWFrZSIgYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiB1c2VEZWZhdWx0PSJ0cnVlIiBjb21tYW5kPSJnY2MiIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9Ii8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiB1c2VEZWZhdWx0PSJ0cnVlIiBjb21tYW5kPSJnY2MiIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9Ii8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08L2l0ZW0+Ci08aXRlbSBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUucGF0aGVudHJ5Ij4KLTxwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0ib3V0IiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkRJU0NPVkVSRURfU0NBTk5FUl9JTkZPIi8+Ci08L2l0ZW0+Ci08aXRlbSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZHRhcmdldHMiPgotPGJ1aWxkVGFyZ2V0cz4KLTx0YXJnZXQgbmFtZT0iYWxsIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiIHBhdGg9IiI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+YWxsPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+dHJ1ZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iY2xlYW4iIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciIgcGF0aD0iIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzLz4KLTxidWlsZFRhcmdldD5jbGVhbjwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9Imluc3RhbGwiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciIgcGF0aD0iIj4KLTxidWlsZENvbW1hbmQ+bWFrZTwvYnVpbGRDb21tYW5kPgotPGJ1aWxkQXJndW1lbnRzLz4KLTxidWlsZFRhcmdldD5pbnN0YWxsPC9idWlsZFRhcmdldD4KLTxzdG9wT25FcnJvcj5mYWxzZTwvc3RvcE9uRXJyb3I+Ci08dXNlRGVmYXVsdENvbW1hbmQ+dHJ1ZTwvdXNlRGVmYXVsdENvbW1hbmQ+Ci08L3RhcmdldD4KLTwvYnVpbGRUYXJnZXRzPgotPC9pdGVtPgotPC9kYXRhPgotPC9jZHRwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvLmNwcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvLmNwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcwY2Q3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5Ly5jcHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2ZpbGVWZXJzaW9uIDQuMC4wPz4KLQotPGNwcm9qZWN0PgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KLTxjY29uZmlndXJhdGlvbiBpZD0iY29udmVydGVkLmNvbmZpZy4xMzA5MDk2MjEwIj4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9ImZhbHNlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJmYWxzZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJmYWxzZSIvPgotPC9zY2FubmVySW5mb1Byb3ZpZGVyPgotPC9wcm9maWxlPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGR0YXJnZXRzIj4KLTxidWlsZFRhcmdldHM+Ci08dGFyZ2V0IG5hbWU9ImFsbCIgcGF0aD0iIiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuTWFrZVRhcmdldEJ1aWxkZXIiPgotPGJ1aWxkQ29tbWFuZD5tYWtlPC9idWlsZENvbW1hbmQ+Ci08YnVpbGRBcmd1bWVudHMvPgotPGJ1aWxkVGFyZ2V0PmFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08dGFyZ2V0IG5hbWU9ImNsZWFuIiBwYXRoPSIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+Y2xlYW48L2J1aWxkVGFyZ2V0PgotPHN0b3BPbkVycm9yPmZhbHNlPC9zdG9wT25FcnJvcj4KLTx1c2VEZWZhdWx0Q29tbWFuZD50cnVlPC91c2VEZWZhdWx0Q29tbWFuZD4KLTwvdGFyZ2V0PgotPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBwYXRoPSIiIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5NYWtlVGFyZ2V0QnVpbGRlciI+Ci08YnVpbGRDb21tYW5kPm1ha2U8L2J1aWxkQ29tbWFuZD4KLTxidWlsZEFyZ3VtZW50cy8+Ci08YnVpbGRUYXJnZXQ+aW5zdGFsbDwvYnVpbGRUYXJnZXQ+Ci08c3RvcE9uRXJyb3I+ZmFsc2U8L3N0b3BPbkVycm9yPgotPHVzZURlZmF1bHRDb21tYW5kPnRydWU8L3VzZURlZmF1bHRDb21tYW5kPgotPC90YXJnZXQ+Ci08L2J1aWxkVGFyZ2V0cz4KLTwvc3RvcmFnZU1vZHVsZT4KLTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmRlZmF1bHRDb25maWdEYXRhUHJvdmlkZXIiIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjEzMDkwOTYyMTAiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iY29udmVydGVkQ29uZmlnIj4KLTxleHRlcm5hbFNldHRpbmdzLz4KLTxleHRlbnNpb25zPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tc291cmNlaW5kZXhlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNJbmRleGVyIi8+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLk1hY2hPIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIj4KLTxhdHRyaWJ1dGUga2V5PSJjKytmaWx0IiB2YWx1ZT0iYysrZmlsdCIvPgotPC9leHRlbnNpb24+Ci08L2V4dGVuc2lvbnM+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIvPgotPC9jY29uZmlndXJhdGlvbj4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS8uY3ZzaWdub3JlIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwNWJhNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0uc2V0dGluZ3MKLWF1dG9tNHRlLmNhY2hlCi1zdGFtcC1oMQotTWFrZWZpbGUKLWNvbmZpZy5zdGF0dXMKLWNvbmZpZy5oCi0uZGVwcwotYS5vdXQuZFNZTQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliZjdkZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLm1ha2VCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmNsZWFuLGZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC5hcmd1bWVudHM8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5jb3JlLmVycm9yT3V0cHV0UGFyc2VyPC9rZXk+Ci0JCQkJCTx2YWx1ZT5vcmcuZWNsaXBzZS5jZHQuY29yZS5NYWtlRXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuR0FTRXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuR0xERXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuVkNFcnJvclBhcnNlcjs8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVudmlyb25tZW50PC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUF1dG9CdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+ZmFsc2U8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkLnRhcmdldC5pbmM8L2tleT4KLQkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlRnVsbEJ1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVkSW5jcmVtZW50YWxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmNsZWFuPC9rZXk+Ci0JCQkJCTx2YWx1ZT5jbGVhbjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQuY29tbWFuZDwva2V5PgotCQkJCQk8dmFsdWU+bWFrZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQ2xlYW5CdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYXBwZW5kX2Vudmlyb25tZW50PC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZC50YXJnZXQuZnVsbDwva2V5PgotCQkJCQk8dmFsdWU+Y2xlYW4gYWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS51c2VEZWZhdWx0QnVpbGRDbWQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnN0b3BPbkVycm9yPC9rZXk+Ci0JCQkJCTx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmF1dG88L2tleT4KLQkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5TY2FubmVyQ29uZmlnQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZU5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuU2Nhbm5lckNvbmZpZ05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvQVVUSE9SUyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L0FVVEhPUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjMyMjUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvQVVUSE9SUworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLURhdmUgV29vdHRvbiA8ZHdvb3R0b25AdXMuaWJtLmNvbT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9DT1BZSU5HIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3ZTEwNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi1mb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLW9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi1HT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi1BU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgCi1tYXJrZWQsIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLQotQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAKLUxBLUNDIDA0LTExNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L0NoYW5nZUxvZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvSU5TVEFMTCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L0lOU1RBTEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMGM0MmYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVNlZSBSRUFETUUgZm9yIGJ1aWxkL2luc3RhbGwgaW5zdHJ1Y3Rpb25zLgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNjY3Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UucHRwLnByb3h5LAotIG9yZy5lY2xpcHNlLnB0cC51dGlscwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvTWFrZWZpbGUuYW0gYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyOTM0NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQotCi1iaW5fUFJPR1JBTVMgPQkJCXB0cF9pYm1sbF9wcm94eQotCi1wdHBfaWJtbGxfcHJveHlfU09VUkNFUyA9CQlzcmMvcHRwX2libWxsX3Byb3h5LmMKLXB0cF9pYm1sbF9wcm94eV9DRkxBR1MgPQkJLWcgLUkvb3B0L2libWxsL0xvYWRML2Z1bGwvaW5jbHVkZS8gLUkvdXNyL2xwcC9Mb2FkTC9mdWxsL2luY2x1ZGUvIC1JJChQUk9YWSkvaW5jbHVkZSAtSSQoVVRJTFMpL2luY2x1ZGUgJChBTV9DRkxBR1MpIAotCi1wdHBfaWJtbGxfcHJveHlfTERGTEFHUyA9IC1nIC1sZGwKLXB0cF9pYm1sbF9wcm94eV9MREFERCA9CQktbHB0aHJlYWQgCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9NYWtlZmlsZS5pbiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkzOTYxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuOS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLXRvcF9idWlsZGRpciA9IC4KLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLUlOU1RBTEwgPSBASU5TVEFMTEAKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1iaW5fUFJPR1JBTVMgPSBwdHBfaWJtbGxfcHJveHkkKEVYRUVYVCkKLURJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAotCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlIEFVVEhPUlMgQ09QWUlORyBDaGFuZ2VMb2cgSU5TVEFMTCBORVdTIFwKLQljb21waWxlIGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGRlcGNvbXAgaW5zdGFsbC1zaCBtaXNzaW5nCi1zdWJkaXIgPSAuCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1hbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KLWFtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCi0JJChBQ0xPQ0FMX000KQotYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKLSBjb25maWd1cmUubGluZW5vIGNvbmZpZ3VyZS5zdGF0dXMubGluZW5vCi1ta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGJpbmRpcikiCi1iaW5QUk9HUkFNU19JTlNUQUxMID0gJChJTlNUQUxMX1BST0dSQU0pCi1QUk9HUkFNUyA9ICQoYmluX1BST0dSQU1TKQotYW1fcHRwX2libWxsX3Byb3h5X09CSkVDVFMgPSAgXAotCXB0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkuJChPQkpFWFQpCi1wdHBfaWJtbGxfcHJveHlfT0JKRUNUUyA9ICQoYW1fcHRwX2libWxsX3Byb3h5X09CSkVDVFMpCi1wdHBfaWJtbGxfcHJveHlfREVQRU5ERU5DSUVTID0KLURFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkuCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotU09VUkNFUyA9ICQocHRwX2libWxsX3Byb3h5X1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKHB0cF9pYm1sbF9wcm94eV9TT1VSQ0VTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAotICB7IHRlc3QgISAtZCAkKGRpc3RkaXIpIFwKLSAgICB8fCB7IGZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICAgICYmIHJtIC1mciAkKGRpc3RkaXIpOyB9OyB9Ci1ESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKLUdaSVBfRU5WID0gLS1iZXN0Ci1kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1kaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAotQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAotQU1UQVIgPSBAQU1UQVJACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUdSRVAgPSBAR1JFUEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TRVRfTUFLRSA9IEBTRVRfTUFLRUAKLVNIRUxMID0gQFNIRUxMQAotU1RSSVAgPSBAU1RSSVBACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFtX19mYXN0ZGVwQ0NfRkFMU0UgPSBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAKLWFtX19mYXN0ZGVwQ0NfVFJVRSA9IEBhbV9fZmFzdGRlcENDX1RSVUVACi1hbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKLWFtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACi1hbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAotYW1fX3RhciA9IEBhbV9fdGFyQAotYW1fX3VudGFyID0gQGFtX191bnRhckAKLWJpbmRpciA9IEBiaW5kaXJACi1idWlsZCA9IEBidWlsZEAKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKLWJ1aWxkX29zID0gQGJ1aWxkX29zQAotYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWh0bWxkaXIgPSBAaHRtbGRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLWluc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKLWxpYmRpciA9IEBsaWJkaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1sb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLW1rZGlyX3AgPSBAbWtkaXJfcEAKLW9sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKLXBkZmRpciA9IEBwZGZkaXJACi1wcmVmaXggPSBAcHJlZml4QAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotcHNkaXIgPSBAcHNkaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi1wdHBfaWJtbGxfcHJveHlfU09VUkNFUyA9IHNyYy9wdHBfaWJtbGxfcHJveHkuYwotcHRwX2libWxsX3Byb3h5X0NGTEFHUyA9IC1nIC1JL29wdC9pYm1sbC9Mb2FkTC9mdWxsL2luY2x1ZGUvIC1JL3Vzci9scHAvTG9hZEwvZnVsbC9pbmNsdWRlLyAtSSQoUFJPWFkpL2luY2x1ZGUgLUkkKFVUSUxTKS9pbmNsdWRlICQoQU1fQ0ZMQUdTKSAKLXB0cF9pYm1sbF9wcm94eV9MREZMQUdTID0gLWcgLWxkbAotcHRwX2libWxsX3Byb3h5X0xEQUREID0gLWxwdGhyZWFkIAotYWxsOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5vYmoKLWFtLS1yZWZyZXNoOgotCUA6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgJzsgXAotCSAgICAgIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZSc7IFwKLQljZCAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCi0JICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpICQoQUNMT0NBTF9BTUZMQUdTKQotCi1jb25maWcuaDogc3RhbXAtaDEKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkgIHJtIC1mIHN0YW1wLWgxOyBcCi0JICAkKE1BS0UpIHN0YW1wLWgxOyBcCi0JZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotJChzcmNkaXIpL2NvbmZpZy5oLmluOiAgJChhbV9fY29uZmlndXJlX2RlcHMpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCXJtIC1mIHN0YW1wLWgxCi0JdG91Y2ggJEAKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmggc3RhbXAtaDEKLWluc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChta2Rpcl9wKSAiJChERVNURElSKSQoYmluZGlyKSIKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBwMT1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCSAgaWYgdGVzdCAtZiAkJHAgXAotCSAgOyB0aGVuIFwKLQkgICAgZj1gZWNobyAiJCRwMSIgfCBzZWQgJ3MsXi4qLywsOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgJyQkcCcgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKLQkgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgIiQkcCIgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1iaW5QUk9HUkFNUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAotCSAgcm0gLWYgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAotCWRvbmUKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi1wdHBfaWJtbGxfcHJveHkkKEVYRUVYVCk6ICQocHRwX2libWxsX3Byb3h5X09CSkVDVFMpICQocHRwX2libWxsX3Byb3h5X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHB0cF9pYm1sbF9wcm94eSQoRVhFRVhUKQotCSQoTElOSykgJChwdHBfaWJtbGxfcHJveHlfTERGTEFHUykgJChwdHBfaWJtbGxfcHJveHlfT0JKRUNUUykgJChwdHBfaWJtbGxfcHJveHlfTERBREQpICQoTElCUykKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3B0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkuUG9AYW1fX3F1b3RlQAotCi0uYy5vOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLm9iajoKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKLQotcHRwX2libWxsX3Byb3h5LXB0cF9pYm1sbF9wcm94eS5vOiBzcmMvcHRwX2libWxsX3Byb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHB0cF9pYm1sbF9wcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHRwX2libWxsX3Byb3h5LXB0cF9pYm1sbF9wcm94eS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHRwX2libWxsX3Byb3h5LXB0cF9pYm1sbF9wcm94eS5UcG8iIC1jIC1vIHB0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkubyBgdGVzdCAtZiAnc3JjL3B0cF9pYm1sbF9wcm94eS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHRwX2libWxsX3Byb3h5LmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wdHBfaWJtbGxfcHJveHktcHRwX2libWxsX3Byb3h5LlRwbyIgIiQoREVQRElSKS9wdHBfaWJtbGxfcHJveHktcHRwX2libWxsX3Byb3h5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3B0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3B0cF9pYm1sbF9wcm94eS5jJyBvYmplY3Q9J3B0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHRwX2libWxsX3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHB0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkubyBgdGVzdCAtZiAnc3JjL3B0cF9pYm1sbF9wcm94eS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHRwX2libWxsX3Byb3h5LmMKLQotcHRwX2libWxsX3Byb3h5LXB0cF9pYm1sbF9wcm94eS5vYmo6IHNyYy9wdHBfaWJtbGxfcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHRwX2libWxsX3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1NVCBwdHBfaWJtbGxfcHJveHktcHRwX2libWxsX3Byb3h5Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3B0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkuVHBvIiAtYyAtbyBwdHBfaWJtbGxfcHJveHktcHRwX2libWxsX3Byb3h5Lm9iaiBgaWYgdGVzdCAtZiAnc3JjL3B0cF9pYm1sbF9wcm94eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wdHBfaWJtbGxfcHJveHkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3B0cF9pYm1sbF9wcm94eS5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHRwX2libWxsX3Byb3h5LXB0cF9pYm1sbF9wcm94eS5UcG8iICIkKERFUERJUikvcHRwX2libWxsX3Byb3h5LXB0cF9pYm1sbF9wcm94eS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wdHBfaWJtbGxfcHJveHktcHRwX2libWxsX3Byb3h5LlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NyYy9wdHBfaWJtbGxfcHJveHkuYycgb2JqZWN0PSdwdHBfaWJtbGxfcHJveHktcHRwX2libWxsX3Byb3h5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHRwX2libWxsX3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHB0cF9pYm1sbF9wcm94eS1wdHBfaWJtbGxfcHJveHkub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHRwX2libWxsX3Byb3h5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3B0cF9pYm1sbF9wcm94eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHRwX2libWxsX3Byb3h5LmMnOyBmaWAKLXVuaW5zdGFsbC1pbmZvLWFtOgotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiBUQUdTCi0KLVRBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICQkdGFncyAkJHVuaXF1ZTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdGFncyAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKLQl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgY2FzZSAkJGZpbGUgaW4gXAotCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAotCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCi0JICBlc2FjOyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCi0JICAgIGRpcj0iLyQkZGlyIjsgXAotCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCi0JICBlbHNlIFwKLQkgICAgZGlyPScnOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAotCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKFNIRUxMKSAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCi0JfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKLWRpc3QtZ3ppcDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtYnppcDI6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXRhclo6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1zaGFyOiBkaXN0ZGlyCi0Jc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC16aXA6IGRpc3RkaXIKLQktcm0gLWYgJChkaXN0ZGlyKS56aXAKLQl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdCBkaXN0LWFsbDogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKLQkqLnRhci5neiopIFwKLQkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLmJ6MiopIFwKLQkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAotCSoudGFyLloqKSBcCi0JICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCi0JKi5zaGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAotCSouemlwKikgXAotCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCi0JZXNhYwotCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS9faW5zdAotCWNobW9kIGEtdyAkKGRpc3RkaXIpCi0JZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCi0JICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKLQkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAotCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgJiYgKHsgXAotCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCi0JICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCi0JICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKLQkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKLQkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKLQkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0JQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKLQkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKLQkgIHNlZCAtZSAnMXtoO3MvLi89L2c7cDt4O30nIC1lICckJHtwO3g7fScKLWRpc3R1bmluc3RhbGxjaGVjazoKLQlAY2QgJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKSBcCi0JJiYgdGVzdCBgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtbGUgMSBcCi0JICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKLQkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKLQkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKLQkgICAgICAgIGZpIDsgXAotCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKLQkgICAgICAgIGV4aXQgMTsgfSA+JjIKLWRpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KLQlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKLQkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKLQkgIGV4aXQgMSA7IFwKLQlmaQotCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAotCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCi0JICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKLQkgICAgICAgZXhpdCAxOyB9ID4mMgotY2hlY2stYW06IGFsbC1hbQotY2hlY2s6IGNoZWNrLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpIGNvbmZpZy5oCi1pbnN0YWxsZGlyczoKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChiaW5kaXIpIjsgZG8gXAotCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQobWtkaXJfcCkgIiQkZGlyIjsgXAotCWRvbmUKLWluc3RhbGw6IGluc3RhbGwtYW0KLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKLQkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAotCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCi0JICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi1jbGVhbjogY2xlYW4tYW0KLQotY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1kaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKLQlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi10YWdzCi0KLWR2aTogZHZpLWFtCi0KLWR2aS1hbToKLQotaHRtbDogaHRtbC1hbQotCi1pbmZvOiBpbmZvLWFtCi0KLWluZm8tYW06Ci0KLWluc3RhbGwtZGF0YS1hbToKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TCi0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtbWFuOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKLQktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKLQktcm0gLXJmIC4vJChERVBESVIpCi0JLXJtIC1mIE1ha2VmaWxlCi1tYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1tb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtaW5mby1hbQotCi0uUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gXAotCWNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY3RhZ3MgZGlzdCBkaXN0LWFsbCBkaXN0LWJ6aXAyIFwKLQlkaXN0LWd6aXAgZGlzdC1zaGFyIGRpc3QtdGFyWiBkaXN0LXppcCBkaXN0Y2hlY2sgZGlzdGNsZWFuIFwKLQlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIFwKLQlkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW5jaGVjayBkaXN0ZGlyIGRpc3R1bmluc3RhbGxjaGVjayBkdmkgXAotCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCi0JaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBcCi0JaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAotCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCi0JbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAotCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKLQl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblBST0dSQU1TIFwKLQl1bmluc3RhbGwtaW5mby1hbQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9ORVdTIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9ORVdTCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L1JFQURNRSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9SRUFETUUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvYWNsb2NhbC5tNCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjczYmEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDg3OCArMCwwIEBACi0jIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS45LjYgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKLSMgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KLSMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCi1BQ19ERUZVTihbQU1fQVVUT01BS0VfVkVSU0lPTl0sIFthbV9fYXBpX3ZlcnNpb249IjEuOSJdKQotCi0jIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gaXQgY2FuIGJlIHRyYWNlZC4KLSMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBQ19JTklUX0FVVE9NQUtFLgotQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAotCSBbQU1fQVVUT01BS0VfVkVSU0lPTihbMS45LjZdKV0pCi0KLSMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cwotIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bwotIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgotIwotIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCi0jIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCi0jIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAotIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKLSMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKLSMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCi0jIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCi0jCi0jICRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQotIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCi0jICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAotIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCi0jCi0jIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCi0jIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5Ci0jIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQotIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgotIwotIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKLSMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6Ci0jICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCi0jIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcwotIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgotIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQotIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgotIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCi0jIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KLSMKLSMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCi0jIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKLSMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgotCi1BQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAotW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCi1BQ19QUkVSRVEoWzIuNTBdKWRubAotIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAotYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotXSkKLQotIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA3Ci0KLSMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKLVtBQ19QUkVSRVEoMi41MilkbmwKLSBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAotCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKLUFDX1NVQlNUKFskMV9UUlVFXSkKLUFDX1NVQlNUKFskMV9GQUxTRV0pCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maQotQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKLVtpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQotZmldKV0pCi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOAotCi0jIFRoZXJlIGFyZSBhIGZldyBkaXJ0eSBoYWNrcyBiZWxvdyB0byBhdm9pZCBsZXR0aW5nIGBBQ19QUk9HX0NDJyBiZQotIyB3cml0dGVuIGluIGNsZWFyLCBpbiB3aGljaCBjYXNlIGF1dG9tYWtlLCB3aGVuIHJlYWRpbmcgYWNsb2NhbC5tNCwKLSMgd2lsbCB0aGluayBpdCBzZWVzIGEgKnVzZSosIGFuZCB0aGVyZWZvcmUgd2lsbCB0cmlnZ2VyIGFsbCBpdCdzCi0jIEMgc3VwcG9ydCBtYWNoaW5lcnkuICBBbHNvIG5vdGUgdGhhdCBpdCBtZWFucyB0aGF0IGF1dG9zY2FuLCBzZWVpbmcKLSMgQ0MgZXRjLiBpbiB0aGUgTWFrZWZpbGUsIHdpbGwgYXNrIGZvciBhbiBBQ19QUk9HX0NDIHVzZS4uLgotCi0KLSMgX0FNX0RFUEVOREVOQ0lFUyhOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KLSMgTkFNRSBpcyAiQ0MiLCAiQ1hYIiwgIkdDSiIsIG9yICJPQkpDIi4KLSMgV2UgdHJ5IGEgZmV3IHRlY2huaXF1ZXMgYW5kIHVzZSB0aGF0IHRvIHNldCBhIHNpbmdsZSBjYWNoZSB2YXJpYWJsZS4KLSMKLSMgV2UgZG9uJ3QgQUNfUkVRVUlSRSB0aGUgY29ycmVzcG9uZGluZyBBQ19QUk9HX0NDIHNpbmNlIHRoZSBsYXR0ZXIgd2FzCi0jIG1vZGlmaWVkIHRvIGludm9rZSBfQU1fREVQRU5ERU5DSUVTKENDKTsgd2Ugd291bGQgaGF2ZSBhIGNpcmN1bGFyCi0jIGRlcGVuZGVuY3ksIGFuZCBnaXZlbiB0aGF0IHRoZSB1c2VyIGlzIG5vdCBleHBlY3RlZCB0byBydW4gdGhpcyBtYWNybywKLSMganVzdCByZWx5IG9uIEFDX1BST0dfQ0MuCi1BQ19ERUZVTihbX0FNX0RFUEVOREVOQ0lFU10sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0RFUERJUl0pZG5sCi1BQ19SRVFVSVJFKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10pZG5sCi1BQ19SRVFVSVJFKFtBTV9NQUtFX0lOQ0xVREVdKWRubAotQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKLQotaWZlbHNlKFskMV0sIENDLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgT0JKQywgW2RlcGNjPSIkT0JKQyIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKLQotQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKLSAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCi1baWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgotICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCi0gICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCi0gICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCi0gICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKLSAgIyBpbiBEJy4KLSAgbWtkaXIgY29uZnRlc3QuZGlyCi0gICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCi0gICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCi0gIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCi0gIGNkIGNvbmZ0ZXN0LmRpcgotICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKLSAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKLSAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKLSAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCi0gICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAotICAjIGRpcmVjdG9yeS4KLSAgbWtkaXIgc3ViCi0KLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgotICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gWydzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJ10gPCAuL2RlcGNvbXBgCi0gIGZpCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBlbHNlCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLV0pCi1BQ19TVUJTVChbJDFERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKLUFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcCQxXSwgWwotICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAotICAmJiB0ZXN0ICIkYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCi1dKQotCi0KLSMgQU1fU0VUX0RFUERJUgotIyAtLS0tLS0tLS0tLS0tCi0jIENob29zZSBhIGRpcmVjdG9yeSBuYW1lIGZvciBkZXBlbmRlbmN5IGZpbGVzLgotIyBUaGlzIG1hY3JvIGlzIEFDX1JFUVVJUkVkIGluIF9BTV9ERVBFTkRFTkNJRVMKLUFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAotQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAotXSkKLQotCi0jIEFNX0RFUF9UUkFDSwotIyAtLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAotW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKLVsgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKLSAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLUFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQotQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSkKLV0pCi0KLSMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4gICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotI3NlcmlhbCAzCi0KLSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgU28gbGV0J3MgZ3JlcCB3aG9sZSBmaWxlLgotICBpZiBncmVwICdeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlJyAkbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGRpcnBhcnQ9YEFTX0RJUk5BTUUoIiRtZiIpYAotICBlbHNlCi0gICAgY29udGludWUKLSAgZmkKLSAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKLSAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgotICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQotICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCi0gIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCi0gICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0Ci0gIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKLSAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAotICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKLSAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKLSAgIyBleHBhbnNpb24uCi0gIGZvciBmaWxlIGluIGBzZWQgLW4gIgotICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAotICAgICAgIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbwotICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgotICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQotICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKLSAgICBBU19NS0RJUl9QKFskZGlycGFydC8kZmRpcl0pCi0gICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKLSAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKLSAgZG9uZQotZG9uZQotXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotCi0KLSMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgotIwotIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCi0jIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKLSMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KLUFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCi0gICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAotICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCi1dKQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEyCi0KLSMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCi0jIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKLSMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQotIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCi0jIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQotIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgotIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKLSMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKLSMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgotIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgotQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAotW0FDX1BSRVJFUShbMi41OF0pZG5sCi1kbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdwotZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCi1tNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKLSMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJgotICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLQotIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCi1pZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgotICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCi0gIGVsc2UKLSAgICBDWUdQQVRIX1c9ZWNobwotICBmaQotZmkKLUFDX1NVQlNUKFtDWUdQQVRIX1ddKQotCi0jIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCi1kbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KLW00X2lmdmFsKFskMl0sCi1bbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAotW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKLQotX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCi1bQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKLUFNX1BST0dfSU5TVEFMTF9TSAotQU1fUFJPR19JTlNUQUxMX1NUUklQCi1BQ19SRVFVSVJFKFtBTV9QUk9HX01LRElSX1BdKWRubAotIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KLSMgc29tZSBwbGF0Zm9ybXMuCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1fQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKLSAgICAgICAgICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCi0JICAgICAgCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCi1fQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKLVtBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DQ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKENDKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCi0gICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKLSAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCi1dKQotXSkKLQotCi0jIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi0jIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotIyB0aGF0IGlzIGdlbmVyYXRlZC4gIFRoZSBzdGFtcCBmaWxlcyBhcmUgbnVtYmVyZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMuCi0KLSMgQXV0b2NvbmYgY2FsbHMgX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PSyAod2hlbiBkZWZpbmVkKSBpbiB0aGUKLSMgbG9vcCB3aGVyZSBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIGhlYWRlcnMsIHNvIHdlIGNhbiBnZW5lcmF0ZQotIyBvdXIgc3RhbXAgZmlsZXMgdGhlcmUuCi1BQ19ERUZVTihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sCi1bIyBDb21wdXRlICQxJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgotX2FtX3N0YW1wX2NvdW50PTEKLWZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbwotICBjYXNlICRfYW1faGVhZGVyIGluCi0gICAgJDEgfCAkMToqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgKiApCi0gICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7Ci0gIGVzYWMKLWRvbmUKLWVjaG8gInRpbWVzdGFtcCBmb3IgJDEiID5gQVNfRElSTkFNRShbJDFdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEFNX1BST0dfSU5TVEFMTF9TSAotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lICRpbnN0YWxsX3NoLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCi1bQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotaW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIiRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQotQUNfU1VCU1QoaW5zdGFsbF9zaCldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCi0jIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KLUFDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAotW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCi1ta2RpciAudHN0IDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC50c3Q7IHRoZW4KLSAgYW1fX2xlYWRpbmdfZG90PS4KLWVsc2UKLSAgYW1fX2xlYWRpbmdfZG90PV8KLWZpCi1ybWRpciAudHN0IDI+L2Rldi9udWxsCi1BQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQotCi0jIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIEFNX01BS0VfSU5DTFVERSgpCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCi1BQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKLVthbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQotYW1fX2luY2x1ZGU9IiMiCi1hbV9fcXVvdGU9Ci1fYW1fcmVzdWx0PW5vbmUKLSMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCi1lY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCi0jIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCi0jIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCi0jIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0Ci0jIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAotIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCi1pZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KLSAgIGFtX19pbmNsdWRlPWluY2x1ZGUKLSAgIGFtX19xdW90ZT0KLSAgIF9hbV9yZXN1bHQ9R05VCi1maQotIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCi1pZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCi0gICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCi0gICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCi0gICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQotICAgICAgYW1fX3F1b3RlPSJcIiIKLSAgICAgIF9hbV9yZXN1bHQ9QlNECi0gICBmaQotZmkKLUFDX1NVQlNUKFthbV9faW5jbHVkZV0pCi1BQ19TVUJTVChbYW1fX3F1b3RlXSkKLUFDX01TR19SRVNVTFQoWyRfYW1fcmVzdWx0XSkKLXJtIC1mIGNvbmZpbmMgY29uZm1mCi1dKQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIEFNX1BST0dfQ0NfQ19PCi0jIC0tLS0tLS0tLS0tLS0tCi0jIExpa2UgQUNfUFJPR19DQ19DX08sIGJ1dCBjaGFuZ2VkIGZvciBhdXRvbWFrZS4KLUFDX0RFRlVOKFtBTV9QUk9HX0NDX0NfT10sCi1bQUNfUkVRVUlSRShbQUNfUFJPR19DQ19DX09dKWRubAotQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAotIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCi0jIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KLXNldCBkdW1teSAkQ0MKLWFjX2NjPWBlY2hvICRbMl0gfCBzZWQgWydzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ11gCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX2NjXycke2FjX2NjfV9jX29gXCIgIT0geWVzIjsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotXSkKLQotIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA0Ci0KLSMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCi1bQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKLSQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIEFNX01JU1NJTkdfSEFTX1JVTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgotIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCi1BQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi10ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAotaWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KLSAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKLWVsc2UKLSAgYW1fbWlzc2luZ19ydW49Ci0gIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCi1maQotXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19NS0RJUl9QCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB3aGV0aGVyIGBta2RpciAtcCcgaXMgc3VwcG9ydGVkLCBmYWxsYmFjayB0byBta2luc3RhbGxkaXJzIG90aGVyd2lzZS4KLSMKLSMgQXV0b21ha2UgMS44IHVzZWQgYG1rZGlyIC1tIDA3NTUgLXAgLS0nIHRvIGVuc3VyZSB0aGF0IGRpcmVjdG9yaWVzCi0jIGNyZWF0ZWQgYnkgYG1ha2UgaW5zdGFsbCcgYXJlIGFsd2F5cyB3b3JsZCByZWFkYWJsZSwgZXZlbiBpZiB0aGUKLSMgaW5zdGFsbGVyIGhhcHBlbnMgdG8gaGF2ZSBhbiBvdmVybHkgcmVzdHJpY3RpdmUgdW1hc2sgKGUuZy4gMDc3KS4KLSMgVGhpcyB3YXMgYSBtaXN0YWtlLiAgVGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWFzb25zIHdoeSB3ZSBtdXN0IG5vdAotIyB1c2UgYC1tIDA3NTUnOgotIyAgIC0gaXQgY2F1c2VzIHNwZWNpYWwgYml0cyBsaWtlIFNHSUQgdG8gYmUgaWdub3JlZCwKLSMgICAtIGl0IG1heSBiZSB0b28gcmVzdHJpY3RpdmUgKHNvbWUgc2V0dXBzIGV4cGVjdCA3NzUgZGlyZWN0b3JpZXMpLgotIwotIyBEbyBub3QgdXNlIC1tIDA3NTUgYW5kIGxldCBwZW9wbGUgY2hvb3NlIHdoYXRldmVyIHRoZXkgZXhwZWN0IGJ5Ci0jIHNldHRpbmcgdW1hc2suCi0jCi0jIFdlIGNhbm5vdCBhY2NlcHQgYW55IGltcGxlbWVudGF0aW9uIG9mIGBta2RpcicgdGhhdCByZWNvZ25pemVzIGAtcCcuCi0jIFNvbWUgaW1wbGVtZW50YXRpb25zIChzdWNoIGFzIFNvbGFyaXMgOCdzKSBhcmUgbm90IHRocmVhZC1zYWZlOiBpZiBhCi0jIHBhcmFsbGVsIG1ha2UgdHJpZXMgdG8gcnVuIGBta2RpciAtcCBhL2InIGFuZCBgbWtkaXIgLXAgYS9jJwotIyBjb25jdXJyZW50bHksIGJvdGggdmVyc2lvbiBjYW4gZGV0ZWN0IHRoYXQgYS8gaXMgbWlzc2luZywgYnV0IG9ubHkKLSMgb25lIGNhbiBjcmVhdGUgaXQgYW5kIHRoZSBvdGhlciB3aWxsIGVycm9yIG91dC4gIENvbnNlcXVlbnRseSB3ZQotIyByZXN0cmljdCBvdXJzZWx2ZXMgdG8gR05VIG1ha2UgKHVzaW5nIHRoZSAtLXZlcnNpb24gb3B0aW9uIGVuc3VyZXMKLSMgdGhpcy4pCi1BQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKLVtpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCi0gICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCi0gICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgotICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCi0gICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKLSAgIyBmb3IgdHdvIHJlYXNvbnM6Ci0gICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKLSAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKLSAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKLSAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQotICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCi0gICMgICAgICQoREVTVERJUikgaXMgbm90LgotICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQotICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAotICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KLSAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCi1lbHNlCi0gICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90Ci0gICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcwotICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQotICAjIGV4aXN0cy4KLSAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKLSAgZG8KLSAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCi0gIGRvbmUKLSAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCi0gIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCi0gICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKLSAgZWxzZQotICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCi0gIGZpCi1maQotQUNfU1VCU1QoW21rZGlyX3BdKV0pCi0KLSMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDMKLQotIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKLVtbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQotCi0jIF9BTV9TRVRfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAotW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQotCi0jIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgotQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCi1bQUNfRk9SRUFDSChbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKLQotIyBfQU1fSUZfT1BUSU9OKE9QVElPTiwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXhlY3V0ZSBJRi1TRVQgaWYgT1BUSU9OIGlzIHNldCwgSUYtTk9ULVNFVCBvdGhlcndpc2UuCi1BQ19ERUZVTihbX0FNX0lGX09QVElPTl0sCi1bbTRfaWZzZXQoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIFskMl0sIFskM10pXSkKLQotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4gICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA0Ci0KLSMgQU1fU0FOSVRZX0NIRUNLCi0jIC0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGVgCi0gICBmaQotICAgcm0gLWYgY29uZnRlc3QuZmlsZQotICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKLSMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci0jIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCi0jIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgotIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCi0jIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKLSMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAotW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCR7U0hFTEx9IFwkKGluc3RhbGxfc2gpIC1jIC1zIgotQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pXSkKLQotIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMgotCi0jIF9BTV9QUk9HX1RBUihGT1JNQVQpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCi0jIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mIGB2NycsIGB1c3RhcicsIG9yIGBwYXgnLgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAotIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQotIyAkdGFyZGlyLgotIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgotIwotIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCi0jIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCi0jICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCi1BQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKLVsjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1BTV9NSVNTSU5HX1BST0coW0FNVEFSXSwgW3Rhcl0pCi1tNF9pZihbJDFdLCBbdjddLAotICAgICBbYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nXSwKLSAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKLSAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCi0jIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCi1fYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJwotX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KLSMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAotIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgotZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKLWRvCi0gIGNhc2UgJF9hbV90b29sIGluCi0gIGdudXRhcikKLSAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7Ci0gICAgZG8KLSAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCi0gICAgZG9uZQotICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCi0gICAgOzsKLSAgcGxhaW50YXIpCi0gICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKLSAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgotICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKLSAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3RhciB4ZiAtJwotICAgIDs7Ci0gIHBheCkKLSAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKLSAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKLSAgICBhbV9fdW50YXI9J3BheCAtcicKLSAgICA7OwotICBjcGlvKQotICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJwotICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKLSAgICA7OwotICBub25lKQotICAgIGFtX190YXI9ZmFsc2UKLSAgICBhbV9fdGFyXz1mYWxzZQotICAgIGFtX191bnRhcj1mYWxzZQotICAgIDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgotICAjIGFuZCBhbV9fdW50YXIgc2V0LgotICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKLQotICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQotICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCi0gICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKLSAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKLSAgZmkKLWRvbmUKLXJtIC1yZiBjb25mdGVzdC5kaXIKLQotQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQotQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQotQUNfU1VCU1QoW2FtX190YXJdKQotQUNfU1VCU1QoW2FtX191bnRhcl0pCi1dKSAjIF9BTV9QUk9HX1RBUgotCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9idWlsZC5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2Njc4Ni4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gQVVUSE9SUyxcCi0gICAgICAgICAgICAgICBDT1BZSU5HLFwKLSAgICAgICAgICAgICAgIENoYW5nZUxvZyxcCi0gICAgICAgICAgICAgICBJTlNUQUxMLFwKLSAgICAgICAgICAgICAgIE1ha2VmaWxlLmFtLFwKLSAgICAgICAgICAgICAgIE1ha2VmaWxlLmluLFwKLSAgICAgICAgICAgICAgIE5FV1MsXAotICAgICAgICAgICAgICAgUkVBRE1FLFwKLSAgICAgICAgICAgICAgIGFjbG9jYWwubTQsXAotICAgICAgICAgICAgICAgY29tcGlsZSxcCi0gICAgICAgICAgICAgICBjb25maWcuZ3Vlc3MsXAotICAgICAgICAgICAgICAgY29uZmlnLmguaW4sXAotICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyxcCi0gICAgICAgICAgICAgICBjb25maWcuc3ViLFwKLSAgICAgICAgICAgICAgIGNvbmZpZ3VyZSxcCi0gICAgICAgICAgICAgICBjb25maWd1cmUuaW4sXAotICAgICAgICAgICAgICAgZGVwY29tcCxcCi0gICAgICAgICAgICAgICBpbnN0YWxsLXNoLFwKLSAgICAgICAgICAgICAgIG1pc3NpbmcsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvY29tcGlsZSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbXBpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MWUwMDAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvY29tcGlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIFdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDMtMTEtMDkuMDAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAotIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCi0jIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBjb21waWxlIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotUmVtb3ZlIGAtbyBkZXN0Lm8nIGZyb20gQVJHUywgcnVuIFBST0dSQU0gd2l0aCB0aGUgcmVtYWluaW5nCi1hcmd1bWVudHMsIGFuZCByZW5hbWUgdGhlIG91dHB1dCBhcyBleHBlY3RlZC4KLQotSWYgeW91IGFyZSB0cnlpbmcgdG8gYnVpbGQgYSB3aG9sZSBwYWNrYWdlIHRoaXMgaXMgbm90IHRoZQotcmlnaHQgc2NyaXB0IHRvIHJ1bjogcGxlYXNlIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGZpbGUgYElOU1RBTEwnLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAwCi0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAwCi0gICAgOzsKLWVzYWMKLQotCi1wcm9nPSQxCi1zaGlmdAotCi1vZmlsZT0KLWNmaWxlPQotYXJncz0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gIGNhc2UgIiQxIiBpbgotICAgIC1vKQotICAgICAgIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCi0gICAgICAjIFNvIHdlIGRvIHNvbWV0aGluZyB1Z2x5IGhlcmUuCi0gICAgICBvZmlsZT0kMgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgIiRvZmlsZSIgaW4KLQkqLm8gfCAqLm9iaikKLQkgIDs7Ci0JKikKLQkgIGFyZ3M9IiRhcmdzIC1vICRvZmlsZSIKLQkgIG9maWxlPQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICAgICA7OwotICAgICouYykKLSAgICAgIGNmaWxlPSQxCi0gICAgICBhcmdzPSIkYXJncyAkMSIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFyZ3M9IiRhcmdzICQxIgotICAgICAgOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KLSAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQotICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCi0gICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KLSAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbwotICAjIG9rLgotICBleGVjICIkcHJvZyIgJGFyZ3MKLWZpCi0KLSMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCi1jb2ZpbGU9YGVjaG8gJGNmaWxlIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5jJC8uby8nYAotCi0jIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCi0jIE5vdGU6IHVzZSBgWy8uLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKLSMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKLSMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgotbG9ja2Rpcj1gZWNobyAkY29maWxlIHwgc2VkIC1lICdzfFsvLi1dfF98ZydgLmQKLXdoaWxlIHRydWU7IGRvCi0gIGlmIG1rZGlyICRsb2NrZGlyID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBicmVhawotICBmaQotICBzbGVlcCAxCi1kb25lCi0jIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KLXRyYXAgInJtZGlyICRsb2NrZGlyOyBleGl0IDEiIDEgMiAxNQotCi0jIFJ1biB0aGUgY29tcGlsZS4KLSIkcHJvZyIgJGFyZ3MKLXN0YXR1cz0kPwotCi1pZiB0ZXN0IC1mICIkY29maWxlIjsgdGhlbgotICBtdiAiJGNvZmlsZSIgIiRvZmlsZSIKLWZpCi0KLXJtZGlyICRsb2NrZGlyCi1leGl0ICRzdGF0dXMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvY29uZmlnLmd1ZXNzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGY3NzcyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDEzMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDItMDMtMDQnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi0KLWR1bW15PWR1bW15LSQkCi10cmFwICdybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4KLSMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKLSMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KLQotc2V0X2NjX2Zvcl9idWlsZD0nY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgZHVtbXkoKXt9IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IDsgZG8KLQkgICgkYyAkZHVtbXkuYyAtYyAtbyAkZHVtbXkubykgPi9kZXYvbnVsbCAyPiYxIDsKLQkgIGlmIHRlc3QgJD8gPSAwIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjJwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKLQkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgMCA7OwotICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBocDMwMDpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hY3BwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZXBwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlYi11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMzpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFscGhhOk9TRjE6KjoqKQotCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQlmaQotCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgotCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCi0JIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCi0JIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCi0JY2F0IDw8RU9GID4kZHVtbXkucwotCS5kYXRhCi1cJExmb3JtYXQ6Ci0JLmJ5dGUgMzcsMTAwLDQ1LDM3LDEyMCwxMCwwCSMgIiVkLSV4XG4iCi0KLQkudGV4dAotCS5nbG9ibCBtYWluCi0JLmFsaWduIDQKLQkuZW50IG1haW4KLW1haW46Ci0JLmZyYW1lIFwkMzAsMTYsXCQyNiwwCi0JbGRncCBcJDI5LDAoXCQyNykKLQkucHJvbG9ndWUgMQotCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyIFwkMAotCWxkYSBcJDIsLTEKLQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQotCWxkYSBcJDE2LFwkTGZvcm1hdAotCW1vdiBcJDAsXCQxNwotCW5vdCBcJDEsXCQxOAotCWpzciBcJDI2LHByaW50ZgotCWxkZ3AgXCQyOSwwKFwkMjYpCi0JbW92IDAsXCQxNgotCWpzciBcJDI2LGV4aXQKLQkuZW5kIG1haW4KLUVPRgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCWNhc2UgYC4vJGR1bW15YCBpbgotCQkJMC0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTEtMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEtMTAxKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTItMzAzKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQkyLTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciCi0JCQkJOzsKLQkJCTItMTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgMDs7Ci0gICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCAwIDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgTklMRSo6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKLSAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKLSAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCi0gICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgotICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5Ci0gICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKLSAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKLSAgICAjIGJlIG5vIHByb2JsZW0uCi0gICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLQllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IFwKLQkgICYmIC4vJGR1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKLQkgICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgMCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYTY0OkFJWDoqOiopCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAuLyRkdW1teWAKLQkJICAgIGlmIHRlc3QgLXogIiRIUF9BUkNIIjsgdGhlbiBIUF9BUkNIPWhwcGE7IGZpCi0JCSAgICBybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQkJZmkgOzsKLQllc2FjCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0Q6KjoqOiopCi0JZWNobyBhbHBoYS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNwYXJjKjpCU0QvT1M6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpDWUdXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6UFcqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKLQlleGl0IDAgOzsKLSAgICB4ODY6SW50ZXJpeCo6MyopCi0JZWNobyBpMzg2LXBjLWludGVyaXgzCi0JZXhpdCAwIDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpNaW5peDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4Ci0JZXhpdCAwIDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgKLQlleGl0IDAgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBtaXBzOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHMKLQkjdW5kZWYgbWlwc2VsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkgCi0JQ1BVPW1pcHNlbCAKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpIAotCUNQVT1taXBzCi0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmIAotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCi0Jcm0gLWYgJGR1bW15LmMKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS1wYy1saW51eC1nbnUiICYmIGV4aXQgMAotCTs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotICAgICAgICBlc2FjCi0Jb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQlleGl0IDAgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAotCWV4aXQgMCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAotCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KLQkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgotCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCi0JICBlbGYzMi1pMzg2KQotCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgotCQk7OwotCSAgYS5vdXQtaTM4Ni1saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDAgOzsJCQotCSAgY29mZi1pMzg2KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCi0JCWV4aXQgMCA7OwotCSAgIiIpCi0JCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgotCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCAwIDs7Ci0JZXNhYwotCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0JI2lmZGVmIF9fRUxGX18KLQkjIGlmZGVmIF9fR0xJQkNfXwotCSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0JTElCQz1nbnUKLQkjICBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgIGVuZGlmCi0JIyBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgZW5kaWYKLQkjZWxzZQotCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCi0JTElCQz1nbnUKLQkjZWxzZQotCUxJQkM9Z251YW91dAotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAotCXJtIC1mICRkdW1teS5jCi0JdGVzdCB4IiR7TElCQ30iICE9IHggJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IiAmJiBleGl0IDAKLQl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIGVjaG8gIiR7VEVOVEFUSVZFfSIgJiYgZXhpdCAwCi0JOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQotCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NTpbNzhdKikKLQljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgotCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKLQkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7Ci0JICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgP0lJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCWVjaG8gYHVuYW1lIC1wYC1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAieDg2cGMiOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9cGMKLQkJZWNobyBpMzg2LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWVsc2UKLQkJZWNobyBgdW5hbWUgLXBgLSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpRTlg6Kjo0KikKLQllY2hvIGkzODYtcGMtcW54Ci0JZXhpdCAwIDs7Ci0gICAgTlNSLVtHS0xOUFRWV106Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgMCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgMCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgMCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgMCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgMCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgMCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgMCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgMCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotY2F0ID4mMiA8PEVPRgotJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQotCi1UaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQotdGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQotZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCi0KLSAgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L2NvbmZpZy8KLQotSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCi1zZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQotcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKLWluZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KLQotY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9jb25maWcuaC5pbiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZy5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY2MWM4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZy5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9JTlRUWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHJveHlzdnInIGxpYnJhcnkgKC1scHJveHlzdnIpLiAqLwotI3VuZGVmIEhBVkVfTElCUFJPWFlTVlIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1dGlscycgbGlicmFyeSAoLWx1dGlscykuICovCi0jdW5kZWYgSEFWRV9MSUJVVElMUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0IC1jIGFuZCAtbyB0b2dldGhlci4gKi8KLSN1bmRlZiBOT19NSU5VU19DX01JTlVTX08KLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9WRVJTSU9OCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChgaW50JyBvciBgdm9pZCcpLiAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9jb25maWcuc3ViIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvY29uZmlnLnN1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjM2NTc5Ny4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdGltZXN0YW1wPScyMDAyLTAzLTA3JwotCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgotIwotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUwotICAgICAgICQwIFtPUFRJT05dIEFMSUFTCi0KLUNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgotICAgICAgIGV4aXQgMSA7OwotCi0gICAgKmxvY2FsKikKLSAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLSAgICAgICBlY2hvICQxCi0gICAgICAgZXhpdCAwOzsKLQotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotY2FzZSAkIyBpbgotIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotIDEpIDs7Ci0gKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCB3aW5kb3dzMzItKiB8IHJ0bWstbm92YSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcykKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2NvdXQpCi0JCTs7Ci0JLXdycykKLQkJb3M9LXZ4d29ya3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1jaG9ydXNvcyopCi0JCW9zPS1jaG9ydXNvcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0gCS1jaG9ydXNyZGIpCi0gCQlvcz0tY2hvcnVzcmRiCi0JCWJhc2ljX21hY2hpbmU9JDEKLSAJCTs7Ci0JLWhpdXgqKQotCQlvcz0taGl1eHdlMgotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS11ZGsqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWlzYykKLQkJb3M9LWlzYzIuMgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWNsaXgqKQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAotCQk7OwotCS1pc2MqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWx5bngqKQotCQlvcz0tbHlueG9zCi0JCTs7Ci0JLXB0eCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAotCQk7OwotCS13aW5kb3dzbnQqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCi0JCTs7Ci0JLXBzb3MqKQotCQlvcz0tcHNvcwotCQk7OwotCS1taW50IHwgLW1pbnRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotZXNhYwotCi0jIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgotCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCi0JMTc1MGEgfCA1ODAgXAotCXwgYTI5ayBcCi0JfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAotCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCi0JfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRzcDE2eHggXAotCXwgZnIzMCBcCi0JfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAotCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCi0JfCBtMzJyIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgfCBtY29yZSBcCi0JfCBtaXBzIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwczY0ZWwgfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgfCBtaXBzNjR2cjQzMDAgXAotCXwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTY0IFwKLQl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3BlbnJpc2MgfCBvcjMyIFwKLQl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCi0JfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCi0JfCBweXJhbWlkIFwKLQl8IHNoIHwgc2hbMzRdIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoNjQgXAotCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCi0JfCBzdHJvbmdhcm0gXAotCXwgdGFob2UgfCB0aHVtYiB8IHRpYzgwIHwgdHJvbiBcCi0JfCB2ODUwIHwgdjg1MGUgXAotCXwgd2UzMmsgXAotCXwgeDg2IHwgeHNjYWxlIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4aykKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyKQotCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCW9zPS1ub25lCi0JCTs7Ci0JbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpKjg2IHwgeDg2XzY0KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQk1ODAtKiBcCi0JfCBhMjlrLSogXAotCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCi0JfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAotCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCi0JfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybXYqLSogXAotCXwgYXZyLSogXAotCXwgYnMyMDAwLSogXAotCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzU0eC0qIFwKLQl8IGNsaXBwZXItKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIFwKLQl8IGVseHNpLSogXAotCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgbTMyci0qIFwKLQl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1jb3JlLSogXAotCXwgbWlwcy0qIHwgbWlwczE2LSogfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogfCBtaXBzNjRvcmlvbi0qIFwKLQl8IG1pcHM2NG9yaW9uZWwtKiB8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIFwKLQl8IG1pcHNsZS0qIHwgbWlwc2VsLSogfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogXAotCXwgc2gtKiB8IHNoWzM0XS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiB8IHNobGUtKiB8IHNoNjQtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKLQl8IHRhaG9lLSogfCB0aHVtYi0qIHwgdGljMzAtKiB8IHRpYzU0eC0qIHwgdGljODAtKiB8IHRyb24tKiBcCi0JfCB2ODUwLSogfCB2ODUwZS0qIHwgdmF4LSogXAotCXwgd2UzMmstKiBcCi0JfCB4ODYtKiB8IHg4Nl82NC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzdG9ybXkxNi0qIFwKLQl8IHh0ZW5zYS0qIFwKLQl8IHltcC0qIFwKLQl8IHo4ay0qKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQlhbWlnYXVuaXggfCBhbWl4KQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWFwb2xsbzY4YnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1ic2QKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWM5MCkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY29udmV4LWMxKQotCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMyKQotCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzMikKLQkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM0KQotCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzgpCi0JCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY3JheSB8IGo5MCkKLQkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKLQkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWkqODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaSo4NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWkqODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpKjg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdudW0gfCBtMzIzMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJb3M9LXN5c3YKLQkJOzsKLQltZXJsaW4pCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawotCQlvcz0tc3lzdgotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltbWl4KikKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltb3JwaG9zKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQlvcz0tbW9ycGhvcwotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcjMyIHwgb3IzMi0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJOzsKLQlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCi0JICAgICAgICA7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0JcHczMikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KLQkJb3M9LXB3MzIKLQkJOzsKLQlyb202OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JczM5MCB8IHMzOTAtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQotCQk7OwotCXMzOTB4IHwgczM5MHgtKikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0gICAgICAgIHN2MSkKLQkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZCkKLQkJYmFzaWNfbWFjaGluZT1hbHBoYS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b2FkMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKLQkJb3M9LXRvcHMyMAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jd2luZG93czMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LXdpbmRvd3MzMi1tc3ZjcnQKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoMyB8IHNoNCB8IHNoM2ViIHwgc2g0ZWIpCi0JCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JYzR4KikKLQkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQotCQlvcz0tY29mZgotCQk7OwotCSotdW5rbm93bikKLQkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCi0JICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCi0JICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCi0JICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAotCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8qKQotCQlvcz0tbnRvLXFueAotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3BlbmVkKikKLQkJb3M9LW9wZW5lZGl0aW9uCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCSAgICAgICAgb3M9LW5leHRzdGVwMgotCQk7OwotCS1uc2sqKQotCQlvcz0tbnNrCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkgICAgICAgIG9zPS1taW50Ci0JCTs7Ci0JLW5vbmUpCi0JCTs7Ci0JKikKLQkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLWVsc2UKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgotIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKLSMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KLQotIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAotIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAotIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCi0jIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKLSMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCi0KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KLQlwZHAxMC0qKQotCQlvcz0tdG9wczIwCi0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCW9yMzItKikKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgotCQlvcz0tc3lzdjMKLQkJOzsKLQlzcGFyYy0qIHwgKi1zdW4pCi0JCW9zPS1zdW5vczQuMS4xCi0JCTs7Ci0JKi1iZSkKLQkJb3M9LWJlb3MKLQkJOzsKLQkqLWlibSkKLQkJb3M9LWFpeAotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLSAgICAgICAgKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLSAgICAgICAgKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotICAgICAgICAqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLSAgICAgICAgKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSotcm9tNjhrKQotCQlvcz0tY29mZgotCQk7OwotCSotKmJ1ZykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLWFwcGxlKQotCQlvcz0tbWFjb3MKLQkJOzsKLQkqLWF0YXJpKikKLQkJb3M9LW1pbnQKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktYmVvcyopCi0JCQkJdmVuZG9yPWJlCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLW1wZWl4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyogfCAtb3BlbmVkKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCQktdm9zKikKLQkJCQl2ZW5kb3I9c3RyYXR1cwotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZ3VyZSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JiNDhiZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MDA5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBvcmcuZWNsaXBzZS5wdHAuaWJtbGwgMi4xLjEuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLSMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi1pZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCi0gIGlmIChldmFsICI6IikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLQotICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0geWVzICYmIAkgKGV2YWwgIjoKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotKAotICBhc19saW5lbm9fMT1cJExJTkVOTwotICBhc19saW5lbm9fMj1cJExJTkVOTwotICB0ZXN0IFwieFwkYXNfbGluZW5vXzFcIiAhPSBcInhcJGFzX2xpbmVub18yXCIgJiYKLSAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLSIpIDI+IC9kZXYvbnVsbDsgdGhlbgotICA6Ci1lbHNlCi0gIGFzX2NhbmRpZGF0ZV9zaGVsbHM9Ci0gICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBjYXNlICRhc19kaXIgaW4KLQkgLyopCi0JICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKLQkgICBkb25lOzsKLSAgICAgICBlc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KLQkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKLQkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotOgotX0FTRU9GCi19OyB0aGVuCi0gIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKLQkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLQkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0ICQxKQotfQotYXNfZnVuY19zdWNjZXNzICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMAotfQotYXNfZnVuY19mYWlsdXJlICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMQotfQotYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Ci0gIHJldHVybiAwCi19Ci1hc19mdW5jX3JldF9mYWlsdXJlICgpIHsKLSAgcmV0dXJuIDEKLX0KLQotZXhpdGNvZGU9MAotaWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi0KLXRlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotX0FTRU9GCi19OyB0aGVuCi0gIGJyZWFrCi1maQotCi1maQotCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCi0gICAgICAgIGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gICAgICAgIGRvbmUKLSAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci1maQotCi0KLSAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KLSAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQotICAgICAgZWNobyBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgUGxlYXNlIGluc3RhbGwgYQotICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQotICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCi0gICAgICB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLQotZmkKLQotZmkKLQotCi0KLShldmFsICJhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgewotICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgotICBlY2hvIFBsZWFzZSB0ZWxsIGF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCi0gIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKLSAgZWNobyBtZXNzYWdlCi19Ci0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KLS1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gICopICAgRUNIT19DPSdcYyc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyCi1maQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi0KLWV4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKLQotIyBOYW1lIG9mIHRoZSBob3N0LgotIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKLSMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgotYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0KLSMKLSMgSW5pdGlhbGl6YXRpb25zLgotIwotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotYWNfY2xlYW5fZmlsZXM9Ci1hY19jb25maWdfbGlib2JqX2Rpcj0uCi1MSUJPQkpTPQotY3Jvc3NfY29tcGlsaW5nPW5vCi1zdWJkaXJzPQotTUZMQUdTPQotTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCi1QQUNLQUdFX05BTUU9J29yZy5lY2xpcHNlLnB0cC5pYm1sbCcKLVBBQ0tBR0VfVEFSTkFNRT0nb3JnLWVjbGlwc2UtcHRwLWlibWxsJwotUEFDS0FHRV9WRVJTSU9OPScyLjEuMScKLVBBQ0tBR0VfU1RSSU5HPSdvcmcuZWNsaXBzZS5wdHAuaWJtbGwgMi4xLjEnCi1QQUNLQUdFX0JVR1JFUE9SVD0nJwotCi1hY191bmlxdWVfZmlsZT0ic3JjL3B0cF9pYm1sbF9wcm94eS5jIgotIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1RETElCX0gKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi0jICBpbmNsdWRlIDxtZW1vcnkuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIgotCi1hY19zdWJzdF92YXJzPSdTSEVMTAotUEFUSF9TRVBBUkFUT1IKLVBBQ0tBR0VfTkFNRQotUEFDS0FHRV9UQVJOQU1FCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX0JVR1JFUE9SVAotZXhlY19wcmVmaXgKLXByZWZpeAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotYmluZGlyCi1zYmluZGlyCi1saWJleGVjZGlyCi1kYXRhcm9vdGRpcgotZGF0YWRpcgotc3lzY29uZmRpcgotc2hhcmVkc3RhdGVkaXIKLWxvY2Fsc3RhdGVkaXIKLWluY2x1ZGVkaXIKLW9sZGluY2x1ZGVkaXIKLWRvY2RpcgotaW5mb2RpcgotaHRtbGRpcgotZHZpZGlyCi1wZGZkaXIKLXBzZGlyCi1saWJkaXIKLWxvY2FsZWRpcgotbWFuZGlyCi1ERUZTCi1FQ0hPX0MKLUVDSE9fTgotRUNIT19UCi1MSUJTCi1idWlsZF9hbGlhcwotaG9zdF9hbGlhcwotdGFyZ2V0X2FsaWFzCi1JTlNUQUxMX1BST0dSQU0KLUlOU1RBTExfU0NSSVBUCi1JTlNUQUxMX0RBVEEKLUNZR1BBVEhfVwotUEFDS0FHRQotVkVSU0lPTgotQUNMT0NBTAotQVVUT0NPTkYKLUFVVE9NQUtFCi1BVVRPSEVBREVSCi1NQUtFSU5GTwotaW5zdGFsbF9zaAotU1RSSVAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTQotbWtkaXJfcAotQVdLCi1TRVRfTUFLRQotYW1fX2xlYWRpbmdfZG90Ci1BTVRBUgotYW1fX3RhcgotYW1fX3VudGFyCi1idWlsZAotYnVpbGRfY3B1Ci1idWlsZF92ZW5kb3IKLWJ1aWxkX29zCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1DUFBGTEFHUwotYWNfY3RfQ0MKLUVYRUVYVAotT0JKRVhUCi1ERVBESVIKLWFtX19pbmNsdWRlCi1hbV9fcXVvdGUKLUFNREVQX1RSVUUKLUFNREVQX0ZBTFNFCi1BTURFUEJBQ0tTTEFTSAotQ0NERVBNT0RFCi1hbV9fZmFzdGRlcENDX1RSVUUKLWFtX19mYXN0ZGVwQ0NfRkFMU0UKLVJBTkxJQgotQ1BQCi1HUkVQCi1FR1JFUAotTElCT0JKUwotTFRMSUJPQkpTJwotYWNfc3Vic3RfZmlsZXM9JycKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTCi1DUFAnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKLSAgKikJYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPW5vIDs7Ci0KLSAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKLSAgICBhY19wcmV2PWRvY2RpciA7OwotICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKLSAgICBkb2NkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCi0gICAgYWNfcHJldj1kdmlkaXIgOzsKLSAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKLSAgICBkdmlkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIDs7Ci0KLSAgKj0qKQotICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19lbnZ2YXIiIDogIi4qW15fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgotICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCi0gICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLSMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLWZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAotCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKLQkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAotCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgotZG8KLSAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gIGNhc2UgJGFjX3ZhbCBpbgotICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7Ci0gICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OwotICBlc2FjCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWRvbmUKLQotIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwotIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1idWlsZD0kYnVpbGRfYWxpYXMKLWhvc3Q9JGhvc3RfYWxpYXMKLXRhcmdldD0kdGFyZ2V0X2FsaWFzCi0KLSMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLWlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgotICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCi0gICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKLSAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKLSAgZmkKLWZpCi0KLWFjX3Rvb2xfcHJlZml4PQotdGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQotCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCi0KLQotYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCi1hY19sc19kaT1gbHMgLWRpIC5gICYmCi1hY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBXb3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiQwIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgotYWNfYWJzX2NvbmZkaXI9YCgKLQljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IHsgZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQlwd2QpYAotIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KLWlmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KLSAgc3JjZGlyPS4KLWZpCi0jIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgotIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCi0jIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KLWNhc2UgJHNyY2RpciBpbgotKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Ci1lc2FjCi1mb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0gIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0gIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotZG9uZQotCi0jCi0jIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCi0jCi1pZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgotICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICBjYXQgPDxfQUNFT0YKLVxgY29uZmlndXJlJyBjb25maWd1cmVzIG9yZy5lY2xpcHNlLnB0cC5pYm1sbCAyLjEuMSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCi0KLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgotCi1UbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCi1WQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgotCi1EZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KLQotQ29uZmlndXJhdGlvbjoKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQotICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKLSAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCi0gIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCi0gIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotCQkJICBbUFJFRklYXQotCi1CeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLVxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5Ci1hbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAotZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLQotRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCi0KLUZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0tZGF0YXJvb3RkaXI9RElSICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQotICAtLWxvY2FsZWRpcj1ESVIgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCi0gIC0tZG9jZGlyPURJUiAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2Mvb3JnLWVjbGlwc2UtcHRwLWlibWxsXQotICAtLWh0bWxkaXI9RElSICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcGRmZGlyPURJUiAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1wc2Rpcj1ESVIgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVN5c3RlbSB0eXBlczoKLSAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KLV9BQ0VPRgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KLSAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCi0gICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBvcmcuZWNsaXBzZS5wdHAuaWJtbGwgMi4xLjE6Ijs7Ci0gICBlc2FjCi0gIGNhdCA8PFxfQUNFT0YKLQotT3B0aW9uYWwgRmVhdHVyZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzCi0KLU9wdGlvbmFsIFBhY2thZ2VzOgotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXdpdGgtbGwtaGVhZGVyPURJUiAgICBsb2NhbCBMb2FkTGV2ZWxlciBoZWFkZXIgZGlyZWN0b3J5IFtub25lXQotCi1Tb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCi0gIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKLSAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCi0gICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KLSAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0gICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgotICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1fQUNFT0YKLWFjX3N0YXR1cz0kPwotZmkKLQotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgotICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQotICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8IGNvbnRpbnVlCi0gICAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKLSAgICBmaSB8fCBhY19zdGF0dXM9JD8KLSAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Ci0gIGRvbmUKLWZpCi0KLXRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwotaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgotICBjYXQgPDxcX0FDRU9GCi1vcmcuZWNsaXBzZS5wdHAuaWJtbGwgY29uZmlndXJlIDIuMS4xCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLWNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0KLUl0IHdhcyBjcmVhdGVkIGJ5IG9yZy5lY2xpcHNlLnB0cC5pYm1sbCAkYXNfbWUgMi4xLjEsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgJCAkMCAkQAotCi1fQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotY2F0IDw8X0FTVU5BTUUKLSMjIC0tLS0tLS0tLSAjIwotIyMgUGxhdGZvcm0uICMjCi0jIyAtLS0tLS0tLS0gIyMKLQotaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0KLV9BU1VOQU1FCi0KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19wYXNzIGluCi0gICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKLSAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgotCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KLSAgICAgIGVsc2UKLQljYXNlICRhY19hcmcgaW4KLQkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAotCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAotCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCi0JICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQotCi0jIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0jIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KLXRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotICB7Ci0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE91dHB1dCB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICAgIGRvbmUgfCBzb3J0Ci0gICAgICBlY2hvCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBjYXQgY29uZmRlZnMuaAotICAgICAgZWNobwotICAgIGZpCi0gICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLQotIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBzZXQgeCAiJENPTkZJR19TSVRFIgotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZmkKLXNoaWZ0Ci1mb3IgYWNfc2l0ZV9maWxlCi1kbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKLSAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gID4kY2FjaGVfZmlsZQotZmkKLQotIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQotIyB2YWx1ZS4KLWFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQotICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KLSAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICwpOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0JYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCi0gICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KLSAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKLQotCi1hbV9fYXBpX3ZlcnNpb249IjEuOSIKLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKLSMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KLSMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgotYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCi1zL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCi1fQUNFT0YKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotcm0gLWYgY29uZnRlc3Quc2VkCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9Ci1maQotCi1pZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCi0gICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCi0gICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgotICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCi0gICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKLSAgIyBmb3IgdHdvIHJlYXNvbnM6Ci0gICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKLSAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKLSAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKLSAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQotICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCi0gICMgICAgICQoREVTVERJUikgaXMgbm90LgotICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQotICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAotICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KLSAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCi1lbHNlCi0gICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90Ci0gICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcwotICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQotICAjIGV4aXN0cy4KLSAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKLSAgZG8KLSAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCi0gIGRvbmUKLSAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCi0gIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCi0gICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKLSAgZWxzZQotICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCi0gIGZpCi1maQotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BV0s9JGFjX2N2X3Byb2dfQVdLCi1pZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCi1kb25lCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi0jIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKLSAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKLWlmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCi0gIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKLSAgZWxzZQotICAgIENZR1BBVEhfVz1lY2hvCi0gIGZpCi1maQotCi0KLSMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KLSBQQUNLQUdFPSdvcmctZWNsaXBzZS1wdHAtaWJtbGwnCi0gVkVSU0lPTj0nMi4xLjEnCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1fQUNFT0YKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotCi1BQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9Ci0KLQotQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQotCi0KLUFVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQotCi0KLU1BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQotCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci0KLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCR7U0hFTEx9IFwkKGluc3RhbGxfc2gpIC1jIC1zIgotCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLSMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotQU1UQVI9JHtBTVRBUi0iJHthbV9taXNzaW5nX3J1bn10YXIifQotCi1hbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLScKLQotCi0KLQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRhY19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQotCi1VVElMUz0iLi4vb3JnLmVjbGlwc2UucHRwLnV0aWxzIgotaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCVVUSUxTPSJgZWNobyAke1VUSUxTfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1dGlscyBkaXJlY3Rvcnkgbm90IGZvdW5kIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHV0aWxzIGRpcmVjdG9yeSBub3QgZm91bmQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQlmaQotZmkKLQotUFJPWFk9Ii4uL29yZy5lY2xpcHNlLnB0cC5wcm94eSIKLWlmIHRlc3QgISAtZCAkUFJPWFk7IHRoZW4KLQlQUk9YWT0iYGVjaG8gJHtQUk9YWX1fJHtQQUNLQUdFX1ZFUlNJT059LipgIgotCWlmIHRlc3QgISAtZCAkUFJPWFk7IHRoZW4KLQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogcHJveHkgZGlyZWN0b3J5IG5vdCBmb3VuZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBwcm94eSBkaXJlY3Rvcnkgbm90IGZvdW5kIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JZmkKLWZpCi0KLUxJQlM9IiRMSUJTIC1MJFVUSUxTIC1MJFBST1hZIgotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGwtaGVhZGVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9sbF9oZWFkZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0kd2l0aF9sbF9oZWFkZXI7IGxsaW5jbHVkZT0tSSR3aXRodmFsCi1lbHNlCi0gIGxsaW5jbHVkZT0iIgotZmkKLQotbGxkaXI9IiRsbGluY2x1ZGUgLUkvb3B0L2libWxsL0xvYWRML2Z1bGwvaW5jbHVkZSAtSS91c3IvbHBwL0xvYWRML2Z1bGwvaW5jbHVkZSIKLW9zPWB1bmFtZSAtc2AKLWlmIHRlc3QgIngkb3MiID0gInhBSVgiIDsgdGhlbgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXFpbmZvPWdlbiAtcWNwbHVzY210ICAtSSRVVElMUy9pbmNsdWRlIC1JJFBST1hZL2luY2x1ZGUgJGxsZGlyIgotZWxzZQotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwgLUkkVVRJTFMvaW5jbHVkZSAtSSRQUk9YWS9pbmNsdWRlICRsbGRpciIKLWZpCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRpbnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1hY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCi17IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0jCi0jIExpc3Qgb2YgcG9zc2libGUgb3V0cHV0IGZpbGVzLCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4KLSMgVGhlIGFsZ29yaXRobSBpcyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikKLSMgb25seSBhcyBhIGxhc3QgcmVzb3J0LiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KLWFjX2ZpbGVzPSdhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0JwotIwotIyBUaGUgSVJJWCA2IGxpbmtlciB3cml0ZXMgaW50byBleGlzdGluZyBmaWxlcyB3aGljaCBtYXkgbm90IGJlCi0jIGV4ZWN1dGFibGUsIHJldGFpbmluZyB0aGVpciBwZXJtaXNzaW9ucy4gIFJlbW92ZSB0aGVtIGZpcnN0IHNvIGEKLSMgc3Vic2VxdWVudCBleGVjdXRpb24gdGVzdCB3b3Jrcy4KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVzCi0KLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZvciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLSAgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Ci0JdGhlbiA6OyBlbHNlCi0JICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JZmkKLQkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKLQkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKLQkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLQkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKLQkjIGFjdHVhbGx5IHdvcmtpbmcuCi0JYnJlYWs7OwotICAgICogKQotCWJyZWFrOzsKLSAgZXNhYwotZG9uZQotdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Ci0KLWVsc2UKLSAgYWNfZmlsZT0nJwotZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLWZpCi0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KLSMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKLSMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBmaQotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0KLXJtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKLSMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAotIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSMgYHJtJy4KLWZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGJyZWFrOzsKLSAgICAqICkgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1ybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY29tcGlsZXJfZ251PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1HQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKLWFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLWFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JQ0ZMQUdTPSIiCi0gICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLQkgQ0ZMQUdTPSItZyIKLQkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0vKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCi1zdHJ1Y3QgYnVmIHsgaW50IHg7IH07Ci1GSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKmUgKHAsIGkpCi0gICAgIGNoYXIgKipwOwotICAgICBpbnQgaTsKLXsKLSAgcmV0dXJuIHBbaV07Ci19Ci1zdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCi17Ci0gIGNoYXIgKnM7Ci0gIHZhX2xpc3QgdjsKLSAgdmFfc3RhcnQgKHYscCk7Ci0gIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7Ci0gIHZhX2VuZCAodik7Ci0gIHJldHVybiBzOwotfQotCi0vKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcwotICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCi0gICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0Ci0gICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCi0gICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07Ci0KLS8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycwotICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLwotI2RlZmluZSBGT08oeCkgJ3gnCi1pbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKLQotaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Ci1zdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKLXN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OwotaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci1pbnQgYXJnYzsKLWNoYXIgKiphcmd2OwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKLQktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgotZG8KLSAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUNDPSRhY19zYXZlX0NDCi0KLWZpCi0jIEFDX0NBQ0hFX1ZBTAotY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KLSAgeCkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKLSAgeG5vKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9dW5zdXBwb3J0ZWQiID4mNjsgfSA7OwotICAqKQotICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Ci1lc2FjCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgotCi1hY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCi0KLQotYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIGRvbmUKLS5QSE9OWTogYW1fX2RvaXQKLUVORAotIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKLSMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KLSMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKLSMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCi0jIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KLWlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgotICAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICAgYW1fX3F1b3RlPQotICAgX2FtX3Jlc3VsdD1HTlUKLWZpCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KLSAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgICBhbV9fcXVvdGU9IlwiIgotICAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgIGZpCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JF9hbV9yZXN1bHQiID4mNjsgfQotcm0gLWYgY29uZmluYyBjb25mbWYKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOwotZmkKLQotaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCi0gIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCi0gIEFNREVQQkFDS1NMQVNIPSdcJwotZmkKLQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgQU1ERVBfVFJVRT0KLSAgQU1ERVBfRkFMU0U9JyMnCi1lbHNlCi0gIEFNREVQX1RSVUU9JyMnCi0gIEFNREVQX0ZBTFNFPQotZmkKLQotCi0KLQotZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCi0gIGZpCi0gIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwotICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycwotICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKLSAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCi0gICAgIwotICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5Ci0gICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KLSAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KLSAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKLSAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLSAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKLSAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCi0gICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgotICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCi0gICAgZG9uZQotICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKLQotICAgIGNhc2UgJGRlcG1vZGUgaW4KLSAgICBub3NpZGVlZmZlY3QpCi0gICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKLSAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgotCWNvbnRpbnVlCi0gICAgICBlbHNlCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICA7OwotICAgIG5vbmUpIGJyZWFrIDs7Ci0gICAgZXNhYwotICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgotICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5Ci0gICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCi0gICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCi0gICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAotICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCi0gICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKLSAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKLSAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCi0gICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KLSAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCi0gICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgotICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKLSAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAotICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgICAgICAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotCi0gIGNkIC4uCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLWVsc2UKLSAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQotZmkKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9Ci1DQ0RFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKLQotCi0KLWlmCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCi0gIGFtX19mYXN0ZGVwQ0NfVFJVRT0KLSAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0nIycKLWVsc2UKLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPScjJwotICBhbV9fZmFzdGRlcENDX0ZBTFNFPQotZmkKLQotCi1pZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICRFQ0hPX0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICRFQ0hPX0MiID4mNjsgfQotZmkKLXNldCBkdW1teSAkQ0M7IGFjX2NjPWBlY2hvICQyIHwKLQkJICAgICAgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKLWlmIHsgYXNfdmFyPWFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi0jIE1ha2Ugc3VyZSBpdCB3b3JrcyBib3RoIHdpdGggJENDIGFuZCB3aXRoIHNpbXBsZSBjYy4KLSMgV2UgZG8gdGhlIHRlc3QgdHdpY2UgYmVjYXVzZSBzb21lIGNvbXBpbGVycyByZWZ1c2UgdG8gb3ZlcndyaXRlIGFuCi0jIGV4aXN0aW5nIC5vIGZpbGUgd2l0aCAtbywgdGhvdWdoIHRoZXkgd2lsbCBjcmVhdGUgb25lLgotYWNfdHJ5PSckQ0MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCi1ybSAtZiBjb25mdGVzdDIuKgotaWYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLSAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07Ci10aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289eWVzCi0gIGlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICAgICMgVGVzdCBmaXJzdCB0aGF0IGNjIGV4aXN0cyBhdCBhbGwuCi0gICAgaWYgeyBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgICAgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLSAgICAgIHJtIC1mIGNvbmZ0ZXN0Mi4qCi0gICAgICBpZiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OwotICAgICAgdGhlbgotCSMgY2Mgd29ya3MgdG9vLgotCToKLSAgICAgIGVsc2UKLQkjIGNjIGV4aXN0cyBidXQgZG9lc24ndCBsaWtlIC1vLgotCWV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbyA9IHllczsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEKLV9BQ0VPRgotCi1maQotCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYWNfY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19jY18nJHthY19jY31fY19vYFwiICE9IHllcyI7IHRoZW4KLSAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCi0gICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgotICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCi0gICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCi0gICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgotICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1SQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQotZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotICBhY19jdF9SQU5MSUI9JFJBTkxJQgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgotaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9SQU5MSUIiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgotICAgIFJBTkxJQj0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCi0gIGZpCi1lbHNlCi0gIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotZmkKLQotCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGJpdHNldF9uZXcgaW4gLWx1dGlscyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBiaXRzZXRfbmV3IGluIC1sdXRpbHMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sdXRpbHMgICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgYml0c2V0X25ldyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGJpdHNldF9uZXcgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXciID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXcgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQlVUSUxTIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sdXRpbHMgJExJQlMiCi0KLWZpCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHByb3h5X3N2cl9pbml0IGluIC1scHJveHlzdnIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcHJveHlfc3ZyX2luaXQgaW4gLWxwcm94eXN2ci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scHJveHlzdnIgICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcHJveHlfc3ZyX2luaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwcm94eV9zdnJfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0ID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJQUk9YWVNWUiAxCi1fQUNFT0YKLQotICBMSUJTPSItbHByb3h5c3ZyICRMSUJTIgotCi1maQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjY7IH0KLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0gICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKLSAgICBkbwotICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQotZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0JCSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KLSAgOgotZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyZXAgZ2dyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0Ci1pZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KLXNldCBkdW1teSBncmVwIGdncmVwOyBhY19wcm9nX25hbWU9JDIKLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCi0gICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAotY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0gICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCi0gICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0KLSAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgZG9uZQotZG9uZQotCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLQotR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLWlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLWVsc2UKLSAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCi1maQotCi0KLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Ci0gR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKLSAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCi0gICBlbHNlCi0gICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZWdyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0Ci1pZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi1zZXQgZHVtbXkgZWdyZXA7IGFjX3Byb2dfbmFtZT0kMgotaWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKLSMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKLSAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKLWNhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICBlY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgotICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLQotICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgZG9uZQotZG9uZQotCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLQotRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLWVsc2UKLSAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKLWZpCi0KLQotICAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KLSBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKLSMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNlbHNlCi0jIGRlZmluZSBJU0xPV0VSKGMpIFwKLQkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKLQkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCi0JCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQotI2VuZGlmCi0KLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCi0JfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICByZXR1cm4gMjsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1fQUNFT0YKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KLQotCi0KLQotCi0KLQotCi0KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLQotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbGxhcGlfaCtzZXR9IiA9IHNldDsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGxhcGkuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsbGFwaS5oLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbGxhcGlfaCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9sbGFwaV9oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfbGxhcGlfaCIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbGxhcGkuaCB1c2FiaWxpdHkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBsbGFwaS5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpbmNsdWRlIDxsbGFwaS5oPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hlYWRlcl9jb21waWxlcj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbGxhcGkuaCBwcmVzZW5jZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGxsYXBpLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxsbGFwaS5oPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQotCi0jIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLWNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KLSAgeWVzOm5vOiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGxhcGkuaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxsYXBpLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGxhcGkuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxsYXBpLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0gICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gICAgOzsKLSAgbm86eWVzOiogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGxsYXBpLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxsYXBpLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBsbGFwaS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogbGxhcGkuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBsbGFwaS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBsbGFwaS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGxhcGkuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGxsYXBpLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbGxhcGkuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBsbGFwaS5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBsbGFwaS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBsbGFwaS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0KLSAgICA7OwotZXNhYwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxsYXBpLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGxhcGkuaC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2xsYXBpX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX2xsYXBpX2g9JGFjX2hlYWRlcl9wcmVwcm9jCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2xsYXBpX2giID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9sbGFwaV9oIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sbGFwaV9oID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogTG9hZExldmVsZXIgbm90IGluc3RhbGxlZCwgc2tpcHBpbmcuLi4iID4mNQotZWNobyAiJGFzX21lOiBMb2FkTGV2ZWxlciBub3QgaW5zdGFsbGVkLCBza2lwcGluZy4uLiIgPiY2O30KLQkgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLWZpCi0KLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2lnbmFsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAqKHNpZ25hbCAoMCwgMCkpICgwKSA9PSAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaWduYWwiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2lnbmFsIiA+JjY7IH0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAotX0FDRU9GCi0KLQotCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUiCi0KLWNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCi0jIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0Ci0jIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Ci0jIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgotIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzLgotCi1fQUNFT0YKLQotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLWZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCi0gICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgotICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCi1kb25lCi1MSUJPQkpTPSRhY19saWJvYmpzCi0KLUxUTElCT0JKUz0kYWNfbHRsaWJvYmpzCi0KLQotaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Ci1jYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jISAkU0hFTEwKLSMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1kZWJ1Zz1mYWxzZQotYWNfY3NfcmVjaGVjaz1mYWxzZQotYWNfY3Nfc2lsZW50PWZhbHNlCi1TSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKLQotICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0gICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCi0gICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0gICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKLSAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAotICAjIGNhc2UgYXQgbGluZSBlbmQuCi0gICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKLSAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgotLW4qKQotICBjYXNlIGBlY2hvICd4XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKLWZpCi1lY2hvID5jb25mJCQuZmlsZQotaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9J2xuIC1zJwotICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgIGFzX2xuX3M9J2NwIC1wJwotZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz1sbgotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD06Ci1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotICAgICAgICB0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluCi0gICAgICAgIC0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4KLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCi0jIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgotYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgb3JnLmVjbGlwc2UucHRwLmlibWxsICRhc19tZSAyLjEuMSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLW9yZy5lY2xpcHNlLnB0cC5pYm1sbCBjb25maWcuc3RhdHVzIDIuMS4xCi1jb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEsCi0gIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCi0KLUNvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotYWNfcHdkPSckYWNfcHdkJwotc3JjZGlyPSckc3JjZGlyJwotSU5TVEFMTD0nJElOU1RBTEwnCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0jIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAotIyB2YWx1ZS4gIEJ5IHdlIG5lZWQgdG8ga25vdyBpZiBmaWxlcyB3ZXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KLWFjX25lZWRfZGVmYXVsdHM9Ogotd2hpbGUgdGVzdCAkIyAhPSAwCi1kbwotICBjYXNlICQxIGluCi0gIC0tKj0qKQotICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCi0gICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAotICAgIGFjX3NoaWZ0PToKLSAgICA7OwotICAqKQotICAgIGFjX29wdGlvbj0kMQotICAgIGFjX29wdGFyZz0kMgotICAgIGFjX3NoaWZ0PXNoaWZ0Ci0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBhY19jc19yZWNoZWNrPTogOzsKLSAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQotICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZSB8IC0taCkKLSAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIC0taGVscCB8IC0taGVsIHwgLWggKQotICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQotICAgIGFjX2NzX3NpbGVudD06IDs7Ci0KLSAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0KLSAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKLSAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwotCi0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Ci0KLWlmICRhY19jc19zaWxlbnQ7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgotZmkKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIGVjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCAkU0hFTEwgJDAgIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgotICBDT05GSUdfU0hFTEw9JFNIRUxMCi0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgZXhlYyAkU0hFTEwgIiQwIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKLSMjIFJ1bm5pbmcgJGFzX21lLiAjIwotX0FTQk9YCi0gIGVjaG8gIiRhY19sb2ciCi19ID4mNQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jCi0jIElOSVQtQ09NTUFORFMKLSMKLUFNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotCi0jIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KLWZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotZG8KLSAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgotICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7Ci0gICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLQotICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0KLSMKLSMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCi0jCi0KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotCi1fQUNFT0YKLQotCi0KLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotU0hFTEwhJFNIRUxMJGFjX2RlbGltCi1QQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KLVBBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi1QQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQotUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KLVBBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCi1leGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KLXByZWZpeCEkcHJlZml4JGFjX2RlbGltCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCi1iaW5kaXIhJGJpbmRpciRhY19kZWxpbQotc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQotZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCi1kYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi1zeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCi1zaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KLWxvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLWluY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KLW9sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KLWRvY2RpciEkZG9jZGlyJGFjX2RlbGltCi1pbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCi1odG1sZGlyISRodG1sZGlyJGFjX2RlbGltCi1kdmlkaXIhJGR2aWRpciRhY19kZWxpbQotcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KLXBzZGlyISRwc2RpciRhY19kZWxpbQotbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLWxvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCi1tYW5kaXIhJG1hbmRpciRhY19kZWxpbQotREVGUyEkREVGUyRhY19kZWxpbQotRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KLUVDSE9fTiEkRUNIT19OJGFjX2RlbGltCi1FQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotTElCUyEkTElCUyRhY19kZWxpbQotYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCi1ob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi10YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQotSU5TVEFMTF9QUk9HUkFNISRJTlNUQUxMX1BST0dSQU0kYWNfZGVsaW0KLUlOU1RBTExfU0NSSVBUISRJTlNUQUxMX1NDUklQVCRhY19kZWxpbQotSU5TVEFMTF9EQVRBISRJTlNUQUxMX0RBVEEkYWNfZGVsaW0KLUNZR1BBVEhfVyEkQ1lHUEFUSF9XJGFjX2RlbGltCi1QQUNLQUdFISRQQUNLQUdFJGFjX2RlbGltCi1WRVJTSU9OISRWRVJTSU9OJGFjX2RlbGltCi1BQ0xPQ0FMISRBQ0xPQ0FMJGFjX2RlbGltCi1BVVRPQ09ORiEkQVVUT0NPTkYkYWNfZGVsaW0KLUFVVE9NQUtFISRBVVRPTUFLRSRhY19kZWxpbQotQVVUT0hFQURFUiEkQVVUT0hFQURFUiRhY19kZWxpbQotTUFLRUlORk8hJE1BS0VJTkZPJGFjX2RlbGltCi1pbnN0YWxsX3NoISRpbnN0YWxsX3NoJGFjX2RlbGltCi1TVFJJUCEkU1RSSVAkYWNfZGVsaW0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSEkSU5TVEFMTF9TVFJJUF9QUk9HUkFNJGFjX2RlbGltCi1ta2Rpcl9wISRta2Rpcl9wJGFjX2RlbGltCi1BV0shJEFXSyRhY19kZWxpbQotU0VUX01BS0UhJFNFVF9NQUtFJGFjX2RlbGltCi1hbV9fbGVhZGluZ19kb3QhJGFtX19sZWFkaW5nX2RvdCRhY19kZWxpbQotQU1UQVIhJEFNVEFSJGFjX2RlbGltCi1hbV9fdGFyISRhbV9fdGFyJGFjX2RlbGltCi1hbV9fdW50YXIhJGFtX191bnRhciRhY19kZWxpbQotYnVpbGQhJGJ1aWxkJGFjX2RlbGltCi1idWlsZF9jcHUhJGJ1aWxkX2NwdSRhY19kZWxpbQotYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KLWJ1aWxkX29zISRidWlsZF9vcyRhY19kZWxpbQotQ0MhJENDJGFjX2RlbGltCi1DRkxBR1MhJENGTEFHUyRhY19kZWxpbQotTERGTEFHUyEkTERGTEFHUyRhY19kZWxpbQotQ1BQRkxBR1MhJENQUEZMQUdTJGFjX2RlbGltCi1hY19jdF9DQyEkYWNfY3RfQ0MkYWNfZGVsaW0KLUVYRUVYVCEkRVhFRVhUJGFjX2RlbGltCi1PQkpFWFQhJE9CSkVYVCRhY19kZWxpbQotREVQRElSISRERVBESVIkYWNfZGVsaW0KLWFtX19pbmNsdWRlISRhbV9faW5jbHVkZSRhY19kZWxpbQotYW1fX3F1b3RlISRhbV9fcXVvdGUkYWNfZGVsaW0KLUFNREVQX1RSVUUhJEFNREVQX1RSVUUkYWNfZGVsaW0KLUFNREVQX0ZBTFNFISRBTURFUF9GQUxTRSRhY19kZWxpbQotQU1ERVBCQUNLU0xBU0ghJEFNREVQQkFDS1NMQVNIJGFjX2RlbGltCi1DQ0RFUE1PREUhJENDREVQTU9ERSRhY19kZWxpbQotYW1fX2Zhc3RkZXBDQ19UUlVFISRhbV9fZmFzdGRlcENDX1RSVUUkYWNfZGVsaW0KLWFtX19mYXN0ZGVwQ0NfRkFMU0UhJGFtX19mYXN0ZGVwQ0NfRkFMU0UkYWNfZGVsaW0KLVJBTkxJQiEkUkFOTElCJGFjX2RlbGltCi1DUFAhJENQUCRhY19kZWxpbQotR1JFUCEkR1JFUCRhY19kZWxpbQotRUdSRVAhJEVHUkVQJGFjX2RlbGltCi1MSUJPQkpTISRMSUJPQkpTJGFjX2RlbGltCi1MVExJQk9CSlMhJExUTElCT0JKUyRhY19kZWxpbQotX0FDRU9GCi0KLSAgaWYgdGVzdCBgc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLnNlZCB8IGdyZXAgLWMgWGAgPSA4NDsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLWFjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8wL3AnIGNvbmYkJHN1YnMuc2VkYAotaWYgdGVzdCAtbiAiJGFjX2VvZiI7IHRoZW4KLSAgYWNfZW9mPWBlY2hvICIkYWNfZW9mIiB8IHNvcnQgLW5ydSB8IHNlZCAxcWAKLSAgYWNfZW9mPWBleHByICRhY19lb2YgKyAxYAotZmkKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLWNhdCA+IlwkdG1wL3N1YnMtMS5zZWQiIDw8XENFT0YkYWNfZW9mCi0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiIGVuZAotX0FDRU9GCi1zZWQgJwotcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZwotcy9eL3MsQC87IHMvIS9ALHwjXyEhXyN8LwotOm4KLXQgbgotcy8nIiRhY19kZWxpbSInJC8sZy87IHQKLXMvJC9cXC87IHAKLU47IHMvXi4qXG4vLzsgcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZzsgYiBuCi0nID4+JENPTkZJR19TVEFUVVMgPGNvbmYkJHN1YnMuc2VkCi1ybSAtZiBjb25mJCRzdWJzLnNlZAotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLTplbmQKLXMvfCNfISFfI3wvL2cKLUNFT0YkYWNfZW9mCi1fQUNFT0YKLQotCi0jIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKLSMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97Ci1zLzoqXCQoc3JjZGlyKToqLzovCi1zLzoqXCR7c3JjZGlyfToqLzovCi1zLzoqQHNyY2RpckA6Ki86Lwotcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCi1zLzoqJC8vCi1zL15bXj1dKj1bCSBdKiQvLwotfScKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgotCi0KLWZvciBhY190YWcgaW4gIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICA6QyAkQ09ORklHX0NPTU1BTkRTCi1kbwotICBjYXNlICRhY190YWcgaW4KLSAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7Ci0gIGVzYWMKLSAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KLSAgOltGSExdKjoqKTs7Ci0gIDpMKiB8IDpDKjoqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIDpbRkhdLSkgYWNfdGFnPS06LTs7Ci0gIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7Ci0gIGVzYWMKLSAgYWNfc2F2ZV9JRlM9JElGUwotICBJRlM9OgotICBzZXQgeCAkYWNfdGFnCi0gIElGUz0kYWNfc2F2ZV9JRlMKLSAgc2hpZnQKLSAgYWNfZmlsZT0kMQotICBzaGlmdAotCi0gIGNhc2UgJGFjX21vZGUgaW4KLSAgOkwpIGFjX3NvdXJjZT0kMTs7Ci0gIDpbRkhdKQotICAgIGFjX2ZpbGVfaW5wdXRzPQotICAgIGZvciBhY19mCi0gICAgZG8KLSAgICAgIGNhc2UgJGFjX2YgaW4KLSAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKLSAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCi0JICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAotCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgotCSB0ZXN0IC1mICIkYWNfZiIgfHwKLQkgICBjYXNlICRhY19mIGluCi0JICAgW1xcLyRdKikgZmFsc2U7OwotCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKLQkgICBlc2FjIHx8Ci0JICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICAgICAgZXNhYwotICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAkYWNfZiIKLSAgICBkb25lCi0KLSAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotICAgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGZyb20gImBJRlM9OgotCSAgZWNobyAkKiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnYCIgYnkgY29uZmlndXJlLiIKLSAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgZmkKLQotICAgIGNhc2UgJGFjX3RhZyBpbgotICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIjs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLQotICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKLSRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgeyBhc19kaXI9IiRhY19kaXIiCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLSAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpGKQotICAjCi0gICMgQ09ORklHX0ZJTEUKLSAgIwotCi0gIGNhc2UgJElOU1RBTEwgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OwotICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKLSAgZXNhYwotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgotIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCi1hY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KLQotY2FzZSBgc2VkIC1uICcvZGF0YXJvb3RkaXIvIHsKLSAgcAotICBxCi19Ci0vQGRhdGFkaXJAL3AKLS9AZG9jZGlyQC9wCi0vQGluZm9kaXJAL3AKLS9AbG9jYWxlZGlyQC9wCi0vQG1hbmRpckAvcAotJyAkYWNfZmlsZV9pbnB1dHNgIGluCi0qZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7Ci0qQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICBhY19kYXRhcm9vdGRpcl9oYWNrPScKLSAgcyZAZGF0YWRpckAmJGRhdGFkaXImZwotICBzJkBkb2NkaXJAJiRkb2NkaXImZwotICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCi0gIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCi0gIHMmQG1hbmRpckAmJG1hbmRpciZnCi0gICAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKLWVzYWMKLV9BQ0VPRgotCi0jIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCi0jIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0gIHNlZCAiJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi06dAotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgotcyZAY29uZmlndXJlX2lucHV0QCYkY29uZmlndXJlX2lucHV0Jjt0IHQKLXMmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAotcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKLXMmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKLXMmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKLXMmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAotcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0Ci1zJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAotcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAotcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAotJGFjX2RhdGFyb290ZGlyX2hhY2sKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgc2VkIC1mICIkdG1wL3N1YnMtMS5zZWQiID4kdG1wL291dAotCi10ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQotCi0gIHJtIC1mICIkdG1wL3N0ZGluIgotICBjYXNlICRhY19maWxlIGluCi0gIC0pIGNhdCAiJHRtcC9vdXQiOyBybSAtZiAiJHRtcC9vdXQiOzsKLSAgKikgcm0gLWYgIiRhY19maWxlIjsgbXYgIiR0bXAvb3V0IiAkYWNfZmlsZTs7Ci0gIGVzYWMKLSA7OwotICA6SCkKLSAgIwotICAjIENPTkZJR19IRUFERVIKLSAgIwotX0FDRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgYGNvbmZ0ZXN0LmRlZmluZXMnLCB0aGF0Ci0jIHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KLXJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAotIyBGaXJzdCwgYXBwZW5kIGEgc3BhY2UgdG8gZXZlcnkgdW5kZWYvZGVmaW5lIGxpbmUsIHRvIGVhc2UgbWF0Y2hpbmcuCi1lY2hvICdzLyQvIC8nID5jb25mdGVzdC5kZWZpbmVzCi0jIFRoZW4sIHByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCwgb3IgaW4KLSMgYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCwgaW4gY29uZmlnLnN0YXR1cy4gIElmIHNvbWUgbWFjcm9zIHdlcmUKLSMgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCAjZGVmaW5lcyBmb3IgdGhlIHNhbWUKLSMgc3ltYm9sLCB3aGljaCBpcyB1c2VsZXNzLiAgQnV0IGRvIG5vdCBzb3J0IHRoZW0sIHNpbmNlIHRoZSBsYXN0Ci0jIEFDX0RFRklORSBtdXN0IGJlIGhvbm9yZWQuCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIFBBUkFNUyBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCwgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIyBQQVJBTVMgaXMgdGhlIHBhcmFtZXRlciBsaXN0IGluIHRoZSBtYWNybyBkZWZpbml0aW9uLS1pbiBtb3N0IGNhc2VzLCBpdCdzCi0jIGp1c3QgYW4gZW1wdHkgc3RyaW5nLgotYWNfZEE9J3MsXlxcKFsJICNdKlxcKVteCSBdKlxcKFsJIF0qJwotYWNfZEI9J1xcKVsJIChdLiosXFwxZGVmaW5lXFwyJwotYWNfZEM9JyAnCi1hY19kRD0nICwnCi0KLXVuaXEgY29uZmRlZnMuaCB8Ci0gIHNlZCAtbiAnCi0JdCByc2V0Ci0JOnJzZXQKLQlzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8vCi0JdCBvawotCWQKLQk6b2sKLQlzL1tcXCYsXS9cXCYvZwotCXMvXlwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS8gJyIkYWNfZEEiJ1wxJyIkYWNfZEIiJ1wyJyIke2FjX2RDfSInXDMnIiRhY19kRCInL3AKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvJyIkYWNfZEEiJ1wxJyIkYWNfZEIkYWNfZEMiJ1wyJyIkYWNfZEQiJy9wCi0gICcgPj5jb25mdGVzdC5kZWZpbmVzCi0KLSMgUmVtb3ZlIHRoZSBzcGFjZSB0aGF0IHdhcyBhcHBlbmRlZCB0byBlYXNlIG1hdGNoaW5nLgotIyBUaGVuIHJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSMgKFRoZSByZWdleHAgY2FuIGJlIHNob3J0LCBzaW5jZSB0aGUgbGluZSBjb250YWlucyBlaXRoZXIgI2RlZmluZSBvciAjdW5kZWYuKQotZWNobyAncy8gJC8vCi1zLF5bCSAjXSp1LiosLyogJiAqLywnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXM6Ci1hY19tYXhfc2VkX2xpbmVzPTUwCi0KLSMgRmlyc3Qgc2VkIGNvbW1hbmQgaXM6CSBzZWQgLWYgZGVmaW5lcy5zZWQgJGFjX2ZpbGVfaW5wdXRzID4iJHRtcC9vdXQxIgotIyBTZWNvbmQgb25lIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICIkdG1wL291dDEiID4iJHRtcC9vdXQyIgotIyBUaGlyZCBvbmUgd2lsbCBiZToJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQyIiA+IiR0bXAvb3V0MSIKLSMgZXQgY2V0ZXJhLgotYWNfaW49JyRhY19maWxlX2lucHV0cycKLWFjX291dD0nIiR0bXAvb3V0MSInCi1hY19ueHQ9JyIkdG1wL291dDIiJwotCi13aGlsZSA6Ci1kbwotICAjIFdyaXRlIGEgaGVyZSBkb2N1bWVudDoKLSAgICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICAgICMgRmlyc3QsIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGxpbmU6Ci0gICAgY2F0ID4iXCR0bXAvZGVmaW5lcy5zZWQiIDw8XFxDRU9GCi0vXlsJIF0qI1sJIF0qdW5kZWZbCSBdWwkgXSokYWNfd29yZF9yZVsJIF0qXCQvYiBkZWYKLS9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSokYWNfd29yZF9yZVsoCSBdL2IgZGVmCi1iCi06ZGVmCi1fQUNFT0YKLSAgc2VkICR7YWNfbWF4X3NlZF9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gICAgc2VkIC1mICIkdG1wL2RlZmluZXMuc2VkIicgIiRhY19pbiA+JGFjX291dCIgPj4kQ09ORklHX1NUQVRVUwotICBhY19pbj0kYWNfb3V0OyBhY19vdXQ9JGFjX254dDsgYWNfbnh0PSRhY19pbgotICBzZWQgMSwke2FjX21heF9zZWRfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCi0gIGdyZXAgLiBjb25mdGVzdC50YWlsID4vZGV2L251bGwgfHwgYnJlYWsKLSAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAotCi1lY2hvICJhY19yZXN1bHQ9JGFjX2luIiA+PiRDT05GSUdfU1RBVFVTCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiA+IiR0bXAvY29uZmlnLmgiCi0gICAgY2F0ICIkYWNfcmVzdWx0IiA+PiIkdG1wL2NvbmZpZy5oIgotICAgIGlmIGRpZmYgJGFjX2ZpbGUgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKLWVjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIHJtIC1mICRhY19maWxlCi0gICAgICBtdiAiJHRtcC9jb25maWcuaCIgJGFjX2ZpbGUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iCi0gICAgY2F0ICIkYWNfcmVzdWx0IgotICBmaQotICBybSAtZiAiJHRtcC9vdXQxMiIKLSMgQ29tcHV0ZSAkYWNfZmlsZSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KLV9hbV9zdGFtcF9jb3VudD0xCi1mb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KLSAgY2FzZSAkX2FtX2hlYWRlciBpbgotICAgICRhY19maWxlIHwgJGFjX2ZpbGU6KiApCi0gICAgICBicmVhayA7OwotICAgICogKQotICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OwotICBlc2FjCi1kb25lCi1lY2hvICJ0aW1lc3RhbXAgZm9yICRhY19maWxlIiA+YCRhc19kaXJuYW1lIC0tICRhY19maWxlIHx8Ci0kYXNfZXhwciBYJGFjX2ZpbGUgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCRhY19maWxlIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgkYWNfZmlsZSA6ICdYXCgvL1wpJCcgXHwgXAotCSBYJGFjX2ZpbGUgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgkYWNfZmlsZSB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKLSA7OwotCi0gIDpDKSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKLWVjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQotIDs7Ci0gIGVzYWMKLQotCi0gIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgotICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgU28gbGV0J3MgZ3JlcCB3aG9sZSBmaWxlLgotICBpZiBncmVwICdeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlJyAkbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8Ci0kYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJG1mIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgZWxzZQotICAgIGNvbnRpbnVlCi0gIGZpCi0gICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCi0gICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KLSAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKLSAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKLSAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQotICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAotICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAotICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCi0gICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKLSAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCi0gICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCi0gICMgZXhwYW5zaW9uLgotICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKLSAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKLSAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KLSAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKLSAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8Ci0kYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgeyBhc19kaXI9JGRpcnBhcnQvJGZkaXIKLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7Ci0gICAgYXNfZGlycz0KLSAgICB3aGlsZSA6OyBkbwotICAgICAgY2FzZSAkYXNfZGlyIGluICMoCi0gICAgICAqXCcqKSBhc19xZGlyPWBlY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhc19kaXIiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQotICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCi0gICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCi0gIGRvbmUKLWRvbmUKLSA7OwotCi0gIGVzYWMKLWRvbmUgIyBmb3IgYWNfdGFnCi0KLQoteyAoZXhpdCAwKTsgZXhpdCAwOyB9Ci1fQUNFT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotCi0KLSMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KLSMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgotIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KLSMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cwotIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKLSMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKLSMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQotIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KLWlmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgotICBhY19jc19zdWNjZXNzPToKLSAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQotICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgotICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgotICBleGVjIDU+L2Rldi9udWxsCi0gICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKLSAgZXhlYyA1Pj5jb25maWcubG9nCi0gICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCi0gICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgotICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZ3VyZS5pbiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyMTkyNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1kbmwgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4KLWRubCBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1kbmwgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi1kbmwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWRubCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotZG5sCi1kbmwKLQotQUNfUFJFUkVRKDIuNTApCi0KLUFDX0lOSVQob3JnLmVjbGlwc2UucHRwLmlibWxsLCAyLjEuMSkKLUFDX0NPTkZJR19TUkNESVIoc3JjL3B0cF9pYm1sbF9wcm94eS5jKQotQUNfQ09ORklHX0hFQURFUlMoY29uZmlnLmgpCi0KLUFNX0lOSVRfQVVUT01BS0UKLQotQUNfQ0FOT05JQ0FMX0JVSUxECi0KLVVUSUxTPSIuLi9vcmcuZWNsaXBzZS5wdHAudXRpbHMiCi1pZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JVVRJTFM9ImBlY2hvICR7VVRJTFN9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFVUSUxTOyB0aGVuCi0JCUFDX01TR19FUlJPUihbdXRpbHMgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLVBST1hZPSIuLi9vcmcuZWNsaXBzZS5wdHAucHJveHkiCi1pZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JUFJPWFk9ImBlY2hvICR7UFJPWFl9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JCUFDX01TR19FUlJPUihbcHJveHkgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLUxJQlM9IiRMSUJTIC1MJFVUSUxTIC1MJFBST1hZIgotCi1BQ19BUkdfV0lUSChsbC1oZWFkZXIsIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGwtaGVhZGVyPURJUl0sIAotCQkJW2xvY2FsIExvYWRMZXZlbGVyIGhlYWRlciBkaXJlY3RvcnkgQDw6QG5vbmVAOj5AXSksCi0JCQlsbGluY2x1ZGU9LUkkd2l0aHZhbCwgbGxpbmNsdWRlPSIiKQotbGxkaXI9IiRsbGluY2x1ZGUgLUkvb3B0L2libWxsL0xvYWRML2Z1bGwvaW5jbHVkZSAtSS91c3IvbHBwL0xvYWRML2Z1bGwvaW5jbHVkZSIKLW9zPWB1bmFtZSAtc2AKLWlmIHRlc3QgIngkb3MiID0gInhBSVgiIDsgdGhlbgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXFpbmZvPWdlbiAtcWNwbHVzY210ICAtSSRVVElMUy9pbmNsdWRlIC1JJFBST1hZL2luY2x1ZGUgJGxsZGlyIgotZWxzZQotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwgLUkkVVRJTFMvaW5jbHVkZSAtSSRQUk9YWS9pbmNsdWRlICRsbGRpciIKLWZpCi0KLWRubAotZG5sIENoZWNrIGZvciBwcm9ncmFtcy4KLWRubAotCi1BQ19QUk9HX0NDCi1BTV9QUk9HX0NDX0NfTwotQUNfUFJPR19JTlNUQUxMCi1BQ19QUk9HX01BS0VfU0VUCi1BQ19QUk9HX1JBTkxJQgotCi1kbmwKLWRubCBDaGVjayBmb3IgbGlicmFyaWVzLgotZG5sCi1BQ19DSEVDS19MSUIodXRpbHMsIGJpdHNldF9uZXcpCi1BQ19DSEVDS19MSUIocHJveHlzdnIsIHByb3h5X3N2cl9pbml0KQotCi1kbmwKLWRubCBDaGVjayBmb3IgaGVhZGVyIGZpbGVzLgotZG5sCi0KLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVIoW2xsYXBpLmhdLCBbXSwgCi0JW0FDX01TR19OT1RJQ0UoW0xvYWRMZXZlbGVyIG5vdCBpbnN0YWxsZWQsIHNraXBwaW5nLi4uXSkKLQkgQVNfRVhJVAotCV0pCi0KLWRubAotZG5sIENoZWNrIGZvciB0eXBlcwotZG5sCi1BQ19UWVBFX1NJR05BTAotCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvZGVwY29tcCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2RlcGNvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZTJkM2IuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA0LTA1LTMxLjIzCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCi1hcyBzaWRlLWVmZmVjdHMuCi0KLUVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgotICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KLSAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KLSAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0IDAKLSAgICA7OwotICAtdiB8IC0tdiopCi0gICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKLSAgICBleGl0IDAKLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAkZGVwZmlsZQotICAgIGVjaG8gPj4gJGRlcGZpbGUKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAotICAgPj4gJGRlcGZpbGUKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKLSAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIERlcGVuZGVuY2llcyBhcmUgb3V0cHV0IGluIC5sby5kIHdpdGggbGlidG9vbCAxLjQuCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhleSBhcmUgb3V0cHV0IGJvdGggaW4gJGRpci5saWJzLyRiYXNlLm8uZAotICAgICAgIyBhbmQgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQgJGRpciRiYXNlLm8uZC4gIFdlIHByb2Nlc3MgdGhlCi0gICAgICAjIGxhdHRlciwgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgYmUgY2xlYW5lZCB3aGVuICRkaXIubGlicyBpcwotICAgICAgIyBlcmFzZWQuCi0gICAgICB0bXBkZXBmaWxlMT0iJGRpci5saWJzLyRiYXNlLmxvLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLm8uZCIKLSAgICAgIHRtcGRlcGZpbGUzPSIkZGlyLmxpYnMvJGJhc2UuZCIKLSAgICAgICIkQCIgLVdjLC1NRAotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZTE9IiRkaXIkYmFzZS5vLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLmQiCi0gICAgICB0bXBkZXBmaWxlMz0iJGRpciRiYXNlLmQiCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUxIjsgdGhlbgotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUxIgotICAgZWxpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTIiOyB0aGVuCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTMiCi0gICBmaQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAotICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCi0gICIkQCIgfHwgZXhpdCAkPwotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgotICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ub25lKQotICBleGVjICIkQCIKLSAgOzsKLQotKikKLSAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvaW5zdGFsbC1zaCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViYzY2OTEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9taXNzaW5nIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlZjgzYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0KLXNjcmlwdHZlcnNpb249MjAwMy0wOS0wMi4yMwotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMyAKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotIyAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1ydW49OgotCi0jIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCi0jIHNyY2RpciBhbHJlYWR5LgotaWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYwotZWxzZQotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCi1maQotCi1tc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCi0KLWNhc2UgIiQxIiBpbgotLS1ydW4pCi0gICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KLSAgcnVuPQotICBzaGlmdAotICAiJEAiICYmIGV4aXQgMAotICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCi0gICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KLSAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQotICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCi0gICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgotICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KLSAgICBydW49OgotICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKLSMgdHJ5IHRvIGVtdWxhdGUgaXQuCi1jYXNlICIkMSIgaW4KLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKLQotU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgotICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCi0gIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwotICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJwotICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCi0gIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLSAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLQotU2VuZCBidWcgcmVwb3J0cyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgYWNsb2NhbCopCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KLSAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBhY2xvY2FsLm00Ci0gICAgOzsKLQotICBhdXRvY29uZikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCi0gICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBjb25maWd1cmUKLSAgICA7OwotCi0gIGF1dG9oZWFkZXIpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCi0gICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAotICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgotICAgIHRvdWNoX2ZpbGVzPQotICAgIGZvciBmIGluICRmaWxlczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBhdXRvbTR0ZSkKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCi0gICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiIyEgL2Jpbi9zaCIKLQllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKLQllY2hvICIjICAkICRAIgotCWVjaG8gImV4aXQgMCIKLQljaG1vZCAreCAkZmlsZQotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBiaXNvbnx5YWNjKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYwotCSAgICBmaQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYwotICAgIGZpCi0gICAgOzsKLQotICBsZXh8ZmxleCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIGxleC55eS5jCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBoZWxwMm1hbikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCi0JIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQotCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAotICAgIGZpCi0gICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAobWFrZWluZm8gLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIG1ha2VpbmZvLCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLSAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKLSAgICBmaQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICB0YXIpCi0gICAgc2hpZnQKLSAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgotICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgotICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgotICAgICMgbWVzc2FnZXMuCi0gICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGZpcnN0YXJnPSIkMSIKLSAgICBpZiBzaGlmdDsgdGhlbgotCWNhc2UgIiRmaXJzdGFyZyIgaW4KLQkqbyopCi0JICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAotCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKLQkgICAgOzsKLQllc2FjCi0JY2FzZSAiJGZpcnN0YXJnIiBpbgotCSpoKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCi0gICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI1ZTYxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBJQk0gTG9hZExldmVsZXIgUHJveHkgQWdlbnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9zcmMvcHRwX2libWxsX3Byb3h5LmMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eS9zcmMvcHRwX2libWxsX3Byb3h5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZmZkZjEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkvc3JjL3B0cF9pYm1sbF9wcm94eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSAKLSAqIG1hcmtlZCwgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqIAotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5PVEUgTk9URSBOT1RFIE5PVEUgTk9URSBOT1RFIE5PVEUgTk9URSBOT1RFIE5PVEUgTk9URSBOT1RFIE5PVEUgTk9URSBOT1RFCi0gKiAgVGhpcyBjb2RlIGJlc3QgZGV2ZWxvcGVkIGFuZCBmb3JtYXR0ZWQgb24gTGludXggdXNpbmcgaW5kZW50IGFzIGZvbGxvd3M6IAotICogaW5kZW50IC1rciAtYmFwIC1ibGkyIC1iciAtYnJzIC1jYmkyIC1jaTIgLWNsaTIgLWQyIC1kaTIgLWZjMSAtaTIgLWwxMjU1IAotICogICAgICAgICAtbGMyNTUgLW5iYWQgLW5iZmRlIC1uYmZkYSAtbmJjIC1uc29iIC1udXQgLXNjIC1uZmNhIHB0cF9pYm1sbF9wcm94eS5jCi0gKiBOb3RlIHRoYXQgdGhlIGZvcm1hdHRlciBzdGlsbCBzY3Jld3MgdXAgYSBmZXcgY29tbWVudHMgYnV0IHRoZXkgYXJlIGVhc2lseSAgICAKLSAqIGZpeGVkIGFuZCB0aGUgY29kZSBpcyBzbyBtdWNoIG1vcmUgcmVhZGFibGUuIEl0IGlzIGFwcHJlY2lhdGVkIGlmIHlvdSBzdGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogd2l0aCB0aGlzIGZvcm1hdHRpbmcgaWYgeW91IGNoYW5nZSB0aGUgY29kZSBpbiB0aGUgcmVwb3NpdG9yeS4gVGhhbmtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2lmZGVmIF9fbGludXhfXwotI2luY2x1ZGUgPGdldG9wdC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxwcm94eV9jbWQuaD4KLSNpbmNsdWRlIDxwcm94eS5oPgotI2luY2x1ZGUgPHByb3h5X3RjcC5oPgotI2luY2x1ZGUgPHByb3h5X2V2ZW50Lmg+Ci0jaW5jbHVkZSA8cHJveHlfY21kLmg+Ci0jaW5jbHVkZSA8cHJveHlfbXNnLmg+Ci0jaW5jbHVkZSA8aGFuZGxlci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGxpc3QuaD4KLSNpbmNsdWRlIDxoYXNoLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxsbGFwaS5oPgotLyoKLSAqIFJURVZfRVJST1IgY29kZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgaWJtbGwgc3BlY2lmaWMgcGx1Z2luCi0gKi8KLSNkZWZpbmUgUlRFVl9FUlJPUl9MTF9JTklUCSAgICAJICBSVEVWX09GRlNFVCArIDEwMDAKLSNkZWZpbmUgUlRFVl9FUlJPUl9MTF9GSU5BTElaRSAgICAgIFJURVZfT0ZGU0VUICsgMTAwMQotI2RlZmluZSBSVEVWX0VSUk9SX0xMX1NVQk1JVF9KT0IgICBSVEVWX09GRlNFVCArIDEwMDIKLSNkZWZpbmUgUlRFVl9FUlJPUl9DQU5DRUxfSk9CCQkJUlRFVl9PRkZTRVQgKyAxMDAzCi0jZGVmaW5lIERFRkFVTFRfUFJPWFkgInRjcCIKLSNkZWZpbmUgREVGQVVMVF9RVUVVRV9OQU1FICJkZWZhdWx0IgotI2RlZmluZSBBVFRSSUJfTk9ERV9OQU1FX0lEIDEKLSNkZWZpbmUgQVRUUklCX1FVRVVFX05BTUVfSUQgMQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgZ3JvdXBzIG9mIGRlZmluaXRpb25zIGJlbG9uZyBpbiBhIGdsb2JhbCBQVFAgaGVhZGVyLAotICogbm90IGluIGluZGl2aWR1YWwgcHJveGllcwotICovCi0vKgotICogUlRFViBjb2RlcyBtdXN0IEVYQUNUTFkKLSAqIG1hdGNoIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnQKLSAqLwotI2RlZmluZSBSVEVWX09GRlNFVAkJCTIwMAotc3RhdGljIFJFVFNJR1RZUEUgcHRwX3NpZ25hbF9oYW5kbGVyKGludCBzaWcpOwotc3RhdGljIGludCBzZXJ2ZXIoY2hhciAqbmFtZSwgY2hhciAqaG9zdCwgaW50IHBvcnQsIGNoYXIgKmxpYnBhdGgpOwotc3RhdGljIGludCBjb21tYW5kX2luaXRpYWxpemUoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKTsKLXN0YXRpYyBpbnQgY29tbWFuZF9kZWZpbmVfbW9kZWwoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKTsKLXN0YXRpYyBpbnQgY29tbWFuZF9zdWJtaXRfam9iKGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgaW50IGNvbW1hbmRfY2FuY2VsX2pvYihpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pOwotc3RhdGljIGludCBjb21tYW5kX3Rlcm1pbmF0ZShpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pOwotc3RhdGljIGludCBjb21tYW5kX3N0YXJ0X2V2ZW50cyhpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pOwotc3RhdGljIGludCBjb21tYW5kX2hhbHRfZXZlbnRzKGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgdm9pZCBwcmludF9tZXNzYWdlX2FyZ3MoaW50IG5hcmdzLCBjaGFyICphcmdzW10pOwotc3RhdGljIHZvaWQgcHJpbnRfbWVzc2FnZShpbnQgdHlwZSwgY29uc3QgY2hhciAqLCAuLi4pOyAvKiBJTkZPLCBUUkFDRSAmIFdBUk5JTkcgdG8gc3Rkb3V0LCBFUlJPUiAmIEZBVEFMIHRvIHN0ZGVyciAqLwotI2RlZmluZSBJTkZPX01FU1NBR0UgMAotI2RlZmluZSBUUkFDRV9NRVNTQUdFIDEKLSNkZWZpbmUgV0FSTklOR19NRVNTQUdFIDIKLSNkZWZpbmUgRVJST1JfTUVTU0FHRSAzCi0jZGVmaW5lIEZBVEFMX01FU1NBR0UgNAotI2RlZmluZSBBUkdTX01FU1NBR0UgNQotc3RhdGljIGludCBzdGF0ZV90cmFjZSA9IDA7ICAgICAvKiAwPW1lc3NhZ2Ugb2ZmLCAxPW1lc3NhZ2Ugb24gKi8KLXN0YXRpYyBpbnQgc3RhdGVfaW5mbyA9IDA7ICAgICAgLyogMD1tZXNzYWdlIG9mZiwgMT1tZXNzYWdlIG9uICovCi1zdGF0aWMgaW50IHN0YXRlX3dhcm5pbmcgPSAwOyAgIC8qIDA9bWVzc2FnZSBvZmYsIDE9bWVzc2FnZSBvbiAqLwotc3RhdGljIGludCBzdGF0ZV9lcnJvciA9IDA7ICAgICAvKiAwPW1lc3NhZ2Ugb2ZmLCAxPW1lc3NhZ2Ugb24gKi8KLXN0YXRpYyBpbnQgc3RhdGVfZmF0YWwgPSAwOyAgICAgLyogMD1tZXNzYWdlIG9mZiwgMT1tZXNzYWdlIG9uICovCi1zdGF0aWMgaW50IHN0YXRlX2FyZ3MgPSAwOyAgICAgIC8qIDA9bWVzc2FnZSBvZmYsIDE9bWVzc2FnZSBvbiAqLwotc3RhdGljIGludCBzdGF0ZV9ldmVudHNfYWN0aXZlID0gMDsgICAgIC8qIGV2ZW50cyBhcmUgb2ZmIGluaXRpYWxpemUgKi8KLXN0YXRpYyBpbnQgc3RhdGVfZGVidWdfbG9vcCA9IDA7ICAgICAgICAvKiBkZWJ1ZyBsb29wIGZvciBkZWJ1Z2dlciBhdHRhY2ggaXMgb2ZmIGJ5IGRlZmF1bHQgKi8KLXN0YXRpYyBpbnQgc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID0gMDsgICAgICAgIC8qIHNodXRkb3duIG5vdCBpbiBwcm9ncmVzcyAqLwotc3RhdGljIGludCBzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlID0gMTsgIC8qIHdhbnQgdGltZSBkYXRlIHN0YW1wIGluIG1lc3NhZ2VzICovCi1zdGF0aWMgaW50IHN0YXRlX21lc3NhZ2VfdGhyZWFkaWQgPSAxOyAgLyogd2FudCB0aHJlYWQgaWQgaW4gbWVzc2FnZXMgKi8KLXN0YXRpYyBpbnQgc3RhdGVfdGVtcGxhdGUgPSAxOyAgLyogYWx3YXlzIHdyaXRlIGRlZmF1bHQgdGVtcGxhdGUgYXQgc3RhcnR1cCAqLwotc3RhdGljIGNoYXIgKnN0YXRpY190ZW1wbGF0ZV9wcmVmaXggPSAiL3RtcC9QVFBfSUJNTExfVEVNUExBVEVfIjsKLXN0YXRpYyBjaGFyICp1c2VyaWQgPSBOVUxMOwotc3RhdGljIGNoYXIgc3RhdGljX3RlbXBsYXRlX25hbWVbMjU2XTsgIC8qIHRlbXBsYXRlIHBhdGggYW5kIG5hbWUgKi8KLXN0YXRpYyBjaGFyICpzdGF0aWNfdGVtcGxhdGVfb3ZlcnJpZGUgPSAiIjsKLXN0YXRpYyBpbnQgbWF4X25vZGVfc2xlZXBfc2Vjb25kcyA9IDMwMDsKLXN0YXRpYyBpbnQgbWluX25vZGVfc2xlZXBfc2Vjb25kcyA9IDMwOwotc3RhdGljIGludCBqb2Jfc2xlZXBfc2Vjb25kcyA9IDMwOwotc3RhdGljIGNoYXIgaG9zdG5hbWVbMjU2XTsKLXN0YXRpYyBpbnQgZGVidWdfbGV2ZWwgPSAwOyAvKiAwIGlzIG9mZiAqLwotCi1zdHJ1Y3QgQ2x1c3Rlck9iamVjdCB7ICAgICAgICAgIC8qIGEgTG9hZExldmVsZXIgY2x1c3RlciAoc2FtZSBhcyBhIHB0cCBtYWNoaW5lKSAqLwotICBpbnQgcHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWQ7Ci0gIGNoYXIgKmNsdXN0ZXJfbmFtZTsKLSAgSGFzaCAqbm9kZV9oYXNoOwotICBpbnQgcHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkOwotICBpbnQgY2x1c3Rlcl9zdGF0ZTsKLSAgaW50IHF1ZXVlX3N0YXRlOwotICBpbnQgY2x1c3Rlcl9pc19sb2NhbDsKLSAgaW50IG5vZGVfY2xlYW51cF9yZXF1aXJlZDsKLSAgaW50IGpvYl9jbGVhbnVwX3JlcXVpcmVkOwotfTsKLXR5cGVkZWYgc3RydWN0IENsdXN0ZXJPYmplY3QgQ2x1c3Rlck9iamVjdDsKLQotc3RydWN0IE5vZGVPYmplY3QgeyAgICAgICAgICAgICAvKiBhIExvYWRMZXZlbGVyIG9yIHB0cCBub2RlIGluIGEgY2x1c3RlciAobWFjaGluZSkgKi8KLSAgaW50IHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkOwotICBpbnQgbm9kZV9mb3VuZDsgICAgICAgICAgICAgICAvKiBub2RlIGZvdW5kIGluZGljYXRvciAqLwotICBpbnQgbm9kZV9zdGF0ZTsKLSAgY2hhciAqbm9kZV9uYW1lOyAgICAgICAgICAgICAgLyogdXNlIHRoZSBuYW1lIGFzIHRoZSBrZXkgdG8gdGhlIG5vZGUgaGFzaCB0YWJsZSBpbiB0aGUgY2x1c3RlciBvYmplY3QgKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBOb2RlT2JqZWN0IE5vZGVPYmplY3Q7Ci1Ob2RlT2JqZWN0ICpnZXRfbm9kZV9pbl9oYXNoKEhhc2ggKiBub2RlX2hhc2gsIGNoYXIgKm5vZGVfbmFtZSk7Ci12b2lkIGFkZF9ub2RlX3RvX2hhc2goSGFzaCAqIG5vZGVfaGFzaCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KTsKLXZvaWQgZGVsZXRlX25vZGVfZnJvbV9saXN0KExpc3QgKiBub2RlX2xpc3QsIE5vZGVPYmplY3QgKiBub2RlX29iamVjdCk7Ci0KLXN0cnVjdCBKb2JPYmplY3QgeyAgICAgICAgICAgICAgLyogYSBMb2FkTGV2ZWxlciBvciBwdHAgam9iIGluIGEgY2x1c3RlciAqLwotICBpbnQgcHJveHlfZ2VuZXJhdGVkX2pvYl9pZDsKLSAgY2hhciAqZ3VpX2Fzc2lnbmVkX2pvYl9pZDsKLSAgaW50IGpvYl9mb3VuZDsgICAgICAgICAgICAgICAgLyogam9iIGZvdW5kIGluZGljYXRvciAqLwotICBpbnQgam9iX3N0YXRlOyAgICAgICAgICAgICAgICAvKiAxPXN1Ym1pdHRlZCwgMj1pbiBxdWV1ZSAqLwotICB0aW1lX3Qgam9iX3N1Ym1pdF90aW1lOyAgICAgICAvKiB0aW1lIHdoZW4gc3VibWl0dGVkICovCi0gIExpc3QgKnRhc2tfbGlzdDsgICAgICAgICAgICAgIC8qIHByb2Nlc3NlcyBydW5uaW5nIGZvciB0aGlzIGpvYiAqLwotICBMTF9TVEVQX0lEIGxsX3N0ZXBfaWQ7Ci0gIGNoYXIgKmNsdXN0ZXJfbmFtZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBKb2JPYmplY3QgSm9iT2JqZWN0OwotSm9iT2JqZWN0ICpnZXRfam9iX2luX2xpc3QoTGlzdCAqIGpvYl9saXN0LCBMTF9TVEVQX0lEIGxsX3N0ZXBfSUQpOwotSm9iT2JqZWN0ICpnZXRfam9iX2luX2xpc3RfZnJvbV9pZChMaXN0ICogam9iX2xpc3QsIGludCBqb2JfaWQpOwotdm9pZCBhZGRfam9iX3RvX2xpc3QoTGlzdCAqIGpvYl9saXN0LCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KTsKLXZvaWQgZGVsZXRlX2pvYl9mcm9tX2xpc3QoTGlzdCAqIGpvYl9saXN0LCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KTsKLQotc3RydWN0IFRhc2tPYmplY3QgeyAgICAgICAgICAgICAvKiBhIExvYWRMZXZlbGVyIG9yIHB0cCB0YXNrIGZvciBqb2IgKi8KLSAgaW50IHByb3h5X2dlbmVyYXRlZF90YXNrX2lkOwotICBpbnQgdGFza19mb3VuZDsgICAgICAgICAgICAgICAvKiBqb2IgZm91bmQgaW5kaWNhdG9yICovCi0gIGludCBsbF90YXNrX2lkOwotICBpbnQgdGFza19zdGF0ZTsKLSAgY2hhciAqbm9kZV9uYW1lOwotICBjaGFyICpub2RlX2FkZHJlc3M7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgVGFza09iamVjdCBUYXNrT2JqZWN0OwotVGFza09iamVjdCAqZ2V0X3Rhc2tfaW5fbGlzdChMaXN0ICogdGFza19saXN0LCBjaGFyICp0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSwgaW50IGxsX3Rhc2tfaWQpOwotdm9pZCBhZGRfdGFza190b19saXN0KExpc3QgKiB0YXNrX2xpc3QsIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCk7Ci12b2lkIGRlbGV0ZV90YXNrX2Zyb21fbGlzdChMaXN0ICogdGFza19saXN0LCBUYXNrT2JqZWN0ICogdGFza19vYmplY3QpOwotCi1zdGF0aWMgdm9pZCBzZW5kRXJyb3JFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaW50IHR5cGUsIGNoYXIgKm1zZyk7Ci1zdGF0aWMgdm9pZCBzZW5kSm9iU3VibWlzc2lvbkVycm9yRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGNoYXIgKnN1YmlkLCBjaGFyICptc2d0ZXh0KTsKLXN0YXRpYyB2b2lkIHNlbmRPa0V2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkKTsKLXN0YXRpYyB2b2lkIHNlbmRTaHV0ZG93bkV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkKTsKLXN0YXRpYyBpbnQgc2VuZEF0dHJEZWZJbnRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgY2hhciAqaWQsIGNoYXIgKnNob3J0bmFtZSwgY2hhciAqZGVzY3JpcHRpb24sIGludCBzaG93LCBpbnQgZGVmYXVsdF92YWx1ZSwgaW50IGxsaW1pdCwgaW50IHVsaW1pdCk7Ci1zdGF0aWMgaW50IHNlbmRBdHRyRGVmU3RyaW5nRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGNoYXIgKmlkLCBjaGFyICpzaG9ydG5hbWUsIGNoYXIgKmRlc2NyaXB0aW9uLCBpbnQgc2hvdywgY2hhciAqdmFsdWUpOwotc3RhdGljIGludCBzZW5kTWFjaGluZUFkZEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QpOwotc3RhdGljIGludCBzZW5kUXVldWVBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0KTsKLXN0YXRpYyBpbnQgc2VuZE5vZGVBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0LCBOb2RlT2JqZWN0ICogbm9kZV9vYmplY3QpOwotc3RhdGljIGludCBzZW5kTm9kZUNoYW5nZUV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsIE5vZGVPYmplY3QgKiBub2RlX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmROb2RlUmVtb3ZlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KTsKLXN0YXRpYyBpbnQgc2VuZEpvYkFkZEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QpOwotc3RhdGljIGludCBzZW5kSm9iQ2hhbmdlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QpOwotc3RhdGljIGludCBzZW5kSm9iUmVtb3ZlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QpOwotc3RhdGljIGludCBzZW5kVGFza0FkZEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QsIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRUYXNrQ2hhbmdlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QsIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRUYXNrUmVtb3ZlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QsIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCk7Ci0KLXN0YXRpYyBpbnQgZ2VuZXJhdGVfaWQodm9pZCk7Ci1zdGF0aWMgdm9pZCBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihwcm94eV9tc2cgKiBldmVudCk7Ci1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLXZvaWQgcmVmcmVzaF9jbHVzdGVyX2xpc3QoKTsgICAgLyogcmVmcmVzaCBzdGF0aWMgbGlzdCBvZiBjbHVzdGVycyAqLwotc3RhdGljIExpc3QgKmNsdXN0ZXJfbGlzdCA9IE5VTEw7ICAgICAgIC8qIGxpc3Qgb2YgY2x1c3RlcnMgaWYgbXVsdGljbHVzdGVyICh3ZSdsbCBzZXQgdG8gc2luZ2xlIGxvY2FsIGlmIG5vbmUpICovCi1zdGF0aWMgTGlzdCAqam9iX2xpc3QgPSBOVUxMOyAgIC8qIGpvYiBsaXN0IGZvciBhbGwgY2x1c3RlcnMgKHNpbmNlIGpvYnMgY2FuIG1vdmUpICovCi1pbnQgZ2V0X211bHRpY2x1c3Rlcl9zdGF0dXMoKTsgIC8qIGFyZSB3ZSBydW5uaW5nIG11bHRpY2x1c3RlciBvciBzaW5nbGUgY2x1c3RlciA/ICovCi1zdGF0aWMgaW50IG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAtMTsgICAgLyogaW5pdCB0byBub3QgZGV0ZXJtaW5lZCB5ZXQgIC0gd2Ugd2FudCAwLWxvY2FsIDEtbXVsdGljbHVzdGVyICovCi1zdGF0aWMgcHRocmVhZF90IHRocmVhZF9tYXBfdGFibGVbMjU2XSA9IHsgMCwgMCwgMCwgMCB9OyAgICAgICAgLyogdG8gc2ltcGxpZnkgbWVzc2FnZXMgKi8KLXN0YXRpYyB2b2lkIG1hbGxvY19jaGVjayh2b2lkICpwLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGxpbmUpOwotaW50IGlzX3N1YnN0aXR1dGlvbl9yZXF1aXJlZChjaGFyICpsaW5lKTsKLQotaW50IHJlZ2lzdGVyX3RocmVhZChwdGhyZWFkX3QgaGFuZGxlKTsKLWludCBmaW5kX3RocmVhZChwdGhyZWFkX3QgaGFuZGxlKTsKLQotI2RlZmluZSBNWV9TVEFURV9VTktOT1dOIDAKLSNkZWZpbmUgTVlfU1RBVEVfVVAgMQotI2RlZmluZSBNWV9TVEFURV9ET1dOIDIKLSNkZWZpbmUgTVlfU1RBVEVfU1RPUFBFRCAzCi0jZGVmaW5lIE1ZX1NUQVRFX1JVTk5JTkcgNAotI2RlZmluZSBNWV9TVEFURV9JRExFIDUKLSNkZWZpbmUgTVlfU1RBVEVfVEVSTUlOQVRFRCA2Ci0KLXN0YXRpYyBpbnQgcHRwX3NpZ25hbF9leGl0Owotc3RhdGljIGludCBwdHBfc2lnbmFsX3RocmVhZDsKLXN0YXRpYyBMaXN0ICpldmVudHMgPSBOVUxMOwotc3RhdGljIFJFVFNJR1RZUEUoKnNhdmVkX3NpZ25hbHNbTlNJR10pIChpbnQpOwotc3RhdGljIHByb3h5X3N2ciAqbGxfcHJveHkgPSBOVUxMOwotc3RhdGljIHB0aHJlYWRfdCBtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkID0gMDsKLXN0YXRpYyBwdGhyZWFkX2F0dHJfdCBtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkX2F0dHI7Ci1zdGF0aWMgdm9pZCAqbW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzKHZvaWQgKmFyZ3MpOwotc3RhdGljIHB0aHJlYWRfdCBtb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzX3RocmVhZCA9IDA7Ci1zdGF0aWMgcHRocmVhZF9hdHRyX3QgbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2Rlc190aHJlYWRfYXR0cjsKLXN0YXRpYyB2b2lkICptb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzKHZvaWQgKmFyZ3MpOwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhY2Nlc3NfTG9hZExldmVsZXJfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHByb3h5X3N2cl9xdWV1ZV9tc2dfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHByaW50X21lc3NhZ2VfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IG1hc3Rlcl9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLSNpZmRlZiBfX2xpbnV4X18KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0gIHsicHJveHkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1AnfSwKLSAgeyJwb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdwJ30sCi0gIHsiaG9zdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7ImxpYl9vdmVycmlkZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICB7ImRlYnVnX2xvb3AiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgeyJkZWJ1ZyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnZyd9LAotICB7InRyYWNlX21lc3NhZ2VzIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsICd0J30sCi0gIHsiaW5mb19tZXNzYWdlcyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAotICB7Indhcm5pbmdfbWVzc2FnZXMiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ3cnfSwKLSAgeyJlcnJvcl9tZXNzYWdlcyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7ImZhdGFsX21lc3NhZ2VzIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsiYXJnc19tZXNzYWdlcyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7Im11bHRpY2x1c3RlciIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAotICB7InRlbXBsYXRlX292ZXJyaWRlIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsICdvJ30sCi0gIHsidGVtcGxhdGVfd3JpdGUiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ3InfSwKLSAgeyJub2RlX3BvbGxpbmdfbWluIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsICd4J30sCi0gIHsibm9kZV9wb2xsaW5nX21heCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAneSd9LAotICB7ImpvYl9wb2xsaW5nIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsICd6J30sCi0gIHtOVUxMLCAwLCBOVUxMLCAwfQotfTsKLSNlbmRpZgotc3RhdGljIHByb3h5X3N2cl9oZWxwZXJfZnVuY3MgaGVscGVyX2Z1bmNzID0gewotICBOVUxMLAotICBOVUxMCi19Owotc3RhdGljIHByb3h5X2NtZCBpYm1sbF9jbWRzW10gPSB7Ci0gIGNvbW1hbmRfdGVybWluYXRlLAotICBjb21tYW5kX2luaXRpYWxpemUsCi0gIGNvbW1hbmRfZGVmaW5lX21vZGVsLAotICBjb21tYW5kX3N0YXJ0X2V2ZW50cywKLSAgY29tbWFuZF9oYWx0X2V2ZW50cywKLSAgY29tbWFuZF9zdWJtaXRfam9iLAotICBjb21tYW5kX2NhbmNlbF9qb2IKLX07Ci1zdGF0aWMgcHJveHlfY29tbWFuZHMgY29tbWFuZF90YWIgPSB7Ci0gIDAsIHNpemVvZihpYm1sbF9jbWRzKSAvIHNpemVvZihwcm94eV9jbWQpLCBpYm1sbF9jbWRzCi19OwotCi1zdGF0aWMgY2hhciAqIGlibWxsX2xpYnBhdGhfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgdm9pZCAqIGlibWxsX2xpYnBhdGhfaGFuZGxlID0gMDsKLXN0YXRpYyBpbnQgaWJtbGxfcHJveHlfYmFzZV9pZCA9IDA7Ci1zdGF0aWMgY2hhciBpYm1sbF9wcm94eV9iYXNlX2lkX3N0cmluZ1syNTZdOwotc3RhdGljIGludCBpYm1sbF9sYXN0X2lkID0gMDsKLXN0YXRpYyBpbnQgc3RhcnRfZXZlbnRzX2d1aV90cmFuc21pc3Npb25faWQgPSAwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTG9hZExldmVsZXIgc3ltYm9scyBmcm9tIGR5bmFtaWMgbG9hZCBvZiBsaWJsbGFwaS5hIG9yIGxpYmxsYXBpLnNvICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IHsKLSAgTExfZWxlbWVudCAqKCpsbF9xdWVyeSkgKGVudW0gUXVlcnlUeXBlKTsKLSAgaW50ICgqbGxfc2V0X3JlcXVlc3QpIChMTF9lbGVtZW50ICosIGVudW0gUXVlcnlGbGFncywgY2hhciAqKiwgZW51bSBEYXRhRmlsdGVyKTsKLSAgTExfZWxlbWVudCAqKCpsbF9nZXRfb2JqcykgKExMX2VsZW1lbnQgKiwgZW51bSBMTF9EYWVtb24sIGNoYXIgKiwgaW50ICosIGludCAqKTsKLSAgaW50ICgqbGxfZ2V0X2RhdGEpIChMTF9lbGVtZW50ICosIGVudW0gTExBUElfU3BlY2lmaWNhdGlvbiwgdm9pZCAqKTsKLSAgaW50ICgqbGxfZGVhbGxvY2F0ZSkgKExMX2VsZW1lbnQgKik7Ci0gIExMX2VsZW1lbnQgKigqbGxfbmV4dF9vYmopIChMTF9lbGVtZW50ICopOwotICBpbnQgKCpsbF9mcmVlX29ianMpIChMTF9lbGVtZW50ICopOwotICBpbnQgKCpsbF9jbHVzdGVyKSAoaW50LCBMTF9lbGVtZW50ICoqLCBMTF9jbHVzdGVyX3BhcmFtICopOwotICBpbnQgKCpsbF9zdWJtaXRfam9iKSAoY2hhciAqam9iX2NtZF9maWxlLCBjaGFyICptb25pdG9yX3Byb2dyYW0sIGNoYXIgKm1vbml0b3JfYXJnLCBMTF9qb2IgKiBqb2JfaW5mbywgaW50IGpvYl92ZXJzaW9uKTsKLSAgaW50ICgqbGxfdGVybWluYXRlX2pvYikgKExMX3Rlcm1pbmF0ZV9qb2JfaW5mbyAqIHB0cik7Ci0gIHZvaWQgKCpsbF9mcmVlX2pvYl9pbmZvKSAoTExfam9iICogam9iX2luZm8sIGludCBqb2JfdmVyc2lvbik7Ci0gIGNoYXIgKigqbGxfZXJyb3IpIChMTF9lbGVtZW50ICoqIGVyck9iaiwgaW50IHByaW50X3RvKTsKLX0gTExfU1lNUzsKLQotaW50IG15X2xsX2NsdXN0ZXIoaW50LCBMTF9lbGVtZW50ICoqLCBMTF9jbHVzdGVyX3BhcmFtICopOwotaW50IG15X2xsX2dldF9kYXRhKExMX2VsZW1lbnQgKiwgZW51bSBMTEFQSV9TcGVjaWZpY2F0aW9uLCB2b2lkICopOwotTExfZWxlbWVudCAqbXlfbGxfcXVlcnkoZW51bSBRdWVyeVR5cGUpOwotaW50IG15X2xsX2ZyZWVfb2JqcyhMTF9lbGVtZW50ICopOwotaW50IG15X2xsX2RlYWxsb2NhdGUoTExfZWxlbWVudCAqKTsKLUxMX2VsZW1lbnQgKm15X2xsX25leHRfb2JqKExMX2VsZW1lbnQgKik7Ci1MTF9lbGVtZW50ICpteV9sbF9nZXRfb2JqcyhMTF9lbGVtZW50ICosIGVudW0gTExfRGFlbW9uLCBjaGFyICosIGludCAqLCBpbnQgKik7Ci1pbnQgbXlfbGxfc2V0X3JlcXVlc3QoTExfZWxlbWVudCAqLCBlbnVtIFF1ZXJ5RmxhZ3MsIGNoYXIgKiosIGVudW0gRGF0YUZpbHRlcik7Ci1pbnQgbXlfbGxfc3VibWl0X2pvYihpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgY2hhciAqam9iX3N1Yl9pZCwgY2hhciAqY29tbWFuZF9maWxlLCBjaGFyICpqb2JfZW52X3ZhcnNbXVszXSk7Ci1pbnQgbXlfbGxfdGVybWluYXRlX2pvYihpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCk7Ci12b2lkIG15X2xsX2ZyZWVfam9iX2luZm8oTExfam9iICogam9iX2luZm8pOwotCi12b2lkIHByaW50X3Byb3h5X21lc3NhZ2UocHJveHlfbXNnICogbXNnKTsKLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICogYXR0cmlidXRlcyB0byBzZW5kIHRvIGZyb250IGVuZCBpbiByZXNwb25zZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICogCi0gICAqIGNvbW1hbmRfZGVmaW5lX21vZGVsIGNhbGwgdG8gaW5pdGlhbGl6ZSB0aGUgdGFiYmVkIHBhbmVscy4gICAgICAgICAgICAqIAotICAgKiBUaGlzIGNvZGUgaXMgc2V0IHVwIHRvIHNlbmQgdXAgYmxhbmtzIGFzIGRlZmF1bHRzIGFuZCBub3QgcmV0dXJuIGFueSAgKgotICAgKiBmaWVsZCB3aXRoIGJsYW5rIGJhY2sgZnJvbSBndWkgc28gaXQgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIGpvYiAgICAgICAgKgotICAgKiBjb21tYW5kIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAqIFN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqaWQ7ICAgICAgICAgICAgICAgICAgICAgLyogQXR0cmlidXRlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICovCi0gIGNoYXIgKnNob3J0X25hbWU7ICAgICAgICAgICAgIC8qIERlc2NyaXB0aW9uIHVzZWQgYXMgbGFiZWwgaW4gR1VJICAgICAqLwotICBjaGFyICpsb25nX25hbWU7ICAgICAgICAgICAgICAvKiBUZXh0IHVzZWQgZm9yIHRvb2x0aXAgdGV4dCBpbiBHVUkgICAqLwotICBjaGFyICpkZWZhdWx0X3ZhbHVlOyAgICAgICAgICAvKiBBdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgKi8KLX0gc3RyaW5nX2xhdW5jaF9hdHRyOwotCi1zdGF0aWMgc3RyaW5nX2xhdW5jaF9hdHRyIHN0cmluZ19sYXVuY2hfYXR0cnNbXSA9IHsKLSAgeyJMTF9QVFBfSk9CX0NPTU1BTkRfRklMRSIsICJJQk1MTExhdW5jaC5MTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9UT09MVElQIiwgIiJ9LAotICB7IkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFX1RFTVBMQVRFIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFX1RFTVBMQVRFX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFX1RFTVBMQVRFX1RPT0xUSVAiLCAiL3RtcC9QVFBfSUJNTExfVEVNUExBVEVfdXNlcmlkIn0sCi0gIHsiTExfUFRQX0NMQVNTIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9DTEFTU19MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfQ0xBU1NfVE9PTFRJUCIsICJOb19DbGFzcyJ9LAotICB7IkxMX1BUUF9DT01NRU5UIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9DT01NRU5UX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9DT01NRU5UX1RPT0xUSVAiLCAiIn0sCi0gIHsiTExfUFRQX0VSUk9SIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9FUlJPUl9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfRVJST1JfVE9PTFRJUCIsICIvZGV2L251bGwifSwKLSAgeyJMTF9QVFBfRVhFQ1VUQUJMRSIsICJJQk1MTExhdW5jaC5MTF9QVFBfRVhFQ1VUQUJMRV9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfRVhFQ1VUQUJMRV9UT09MVElQIiwgIiJ9LAotICB7IkxMX1BUUF9FTlZJUk9OTUVOVCIsICJJQk1MTExhdW5jaC5MTF9QVFBfRU5WSVJPTk1FTlRfTEFCRUwiLCAiSUJNTExMYXVuY2guTExfUFRQX0VOVklST05NRU5UX1RPT0xUSVAiLCAiQ09QWV9BTEwifSwKLSAgeyJMTF9QVFBfSU5QVVQiLCAiSUJNTExMYXVuY2guTExfUFRQX0lOUFVUX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9JTlBVVF9UT09MVElQIiwgIi9kZXYvbnVsbCJ9LAotICB7IkxMX1BUUF9PVVRQVVQiLCAiSUJNTExMYXVuY2guTExfUFRQX09VVFBVVF9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfT1VUUFVUX1RPT0xUSVAiLCAiL2Rldi9udWxsIn0sCi0gIHsiTExfUFRQX0lOSVRJQUxESVIiLCAiSUJNTExMYXVuY2guTExfUFRQX0lOSVRJQUxESVJfTEFCRUwiLCAiSUJNTExMYXVuY2guTExfUFRQX0lOSVRJQUxESVJfVE9PTFRJUCIsICIifSwKLSAgeyJMTF9QVFBfSk9CX05BTUUiLCAiSUJNTExMYXVuY2guTExfUFRQX0pPQl9OQU1FX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9KT0JfTkFNRV9UT09MVElQIiwgIiJ9LAotICB7IkxMX1BUUF9ORVRXT1JLX01QSSIsICJJQk1MTExhdW5jaC5MTF9QVFBfTkVUV09SS19NUElfTEFCRUwiLCAiSUJNTExMYXVuY2guTExfUFRQX05FVFdPUktfTVBJX1RPT0xUSVAiLCAiIn0sCi0gIHsiTExfUFRQX05FVFdPUktfTEFQSSIsICJJQk1MTExhdW5jaC5MTF9QVFBfTkVUV09SS19MQVBJX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9ORVRXT1JLX0xBUElfVE9PTFRJUCIsICIifSwKLSAgeyJMTF9QVFBfTkVUV09SS19NUElfTEFQSSIsICJJQk1MTExhdW5jaC5MTF9QVFBfTkVUV09SS19NUElfTEFQSV9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfTkVUV09SS19NUElfTEFQSV9UT09MVElQIiwgIiJ9LAotICB7IkxMX1BUUF9SRVFVSVJFTUVOVFMiLCAiSUJNTExMYXVuY2guTExfUFRQX1JFUVVJUkVNRU5UU19MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfUkVRVUlSRU1FTlRTX1RPT0xUSVAiLCAiIn0sCi0gIHsiTExfUFRQX1JFU09VUkNFUyIsICJJQk1MTExhdW5jaC5MTF9QVFBfUkVTT1VSQ0VTX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9SRVNPVVJDRVNfVE9PTFRJUCIsICIifSwKLSAgeyJMTF9QVFBfU0hFTEwiLCAiSUJNTExMYXVuY2guTExfUFRQX1NIRUxMX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9TSEVMTF9UT09MVElQIiwgIiJ9LAotICB7IkxMX1BUUF9UQVNLX0dFT01FVFJZIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9UQVNLX0dFT01FVFJZX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9UQVNLX0dFT01FVFJZX1RPT0xUSVAiLCAiIn0sCi0gIHsiTExfUFRQX05PREVfTUlOIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9OT0RFX01JTl9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfTk9ERV9NSU5fVE9PTFRJUCIsICIifSwKLSAgeyJMTF9QVFBfTk9ERV9NQVgiLCAiSUJNTExMYXVuY2guTExfUFRQX05PREVfTUFYX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9OT0RFX01BWF9UT09MVElQIiwgIiJ9LAotICB7IkxMX1BUUF9CTE9DS0lORyIsICJJQk1MTExhdW5jaC5MTF9QVFBfQkxPQ0tJTkdfTEFCRUwiLCAiSUJNTExMYXVuY2guTExfUFRQX0JMT0NLSU5HX1RPT0xUSVAiLCAiIn0sCi0gIHsiTExfUFRQX1RPVEFMX1RBU0tTIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9UT1RBTF9UQVNLU19MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfVE9UQUxfVEFTS1NfVE9PTFRJUCIsICIifSwKLSAgeyJMTF9QVFBfV0FMTENMT0NLX0hBUkQiLCAiSUJNTExMYXVuY2guTExfUFRQX1dBTExDTE9DS19IQVJEX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9XQUxMQ0xPQ0tfSEFSRF9UT09MVElQIiwgIjAwOjAwOjAwIn0sCi0gIHsiTExfUFRQX1dBTExDTE9DS19TT0ZUIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9XQUxMQ0xPQ0tfU09GVF9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfV0FMTENMT0NLX1NPRlRfVE9PTFRJUCIsICIwMDowMDowMCJ9Ci0KLX07Ci0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAqIEVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqaWQ7ICAgICAgICAgICAgICAgICAgICAgLyogQXR0cmlidXRlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICovCi0gIGNoYXIgKnNob3J0X25hbWU7ICAgICAgICAgICAgIC8qIERlc2NyaXB0aW9uIHVzZWQgYXMgbGFiZWwgaW4gR1VJICovCi0gIGNoYXIgKmxvbmdfbmFtZTsgICAgICAgICAgICAgIC8qIFRleHQgdXNlZCBmb3IgdG9vbHRpcCB0ZXh0IGluIEdVSSAqLwotICBjaGFyICpkZWZhdWx0X3ZhbHVlOyAgICAgICAgICAvKiBBdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgKi8KLSAgY2hhciAqZW51bXM7ICAgICAgICAgICAgICAgICAgLyogRW51bWVyYXRpb24gdmFsdWVzICcsJyBkZWxpbWl0ZWQgICAgICovCi19IGVudW1fbGF1bmNoX2F0dHI7Ci0KLXN0YXRpYyBlbnVtX2xhdW5jaF9hdHRyIGVudW1fYXR0cnNbXSA9IHsKLSAgeyJMTF9QVFBfSk9CX1RZUEUiLCAiSUJNTExMYXVuY2guTExfUFRQX0pPQl9UWVBFX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9KT0JfVFlQRV9UT09MVElQIiwgIlBhcmFsbGVsIiwgIlNlcmlhbHxQYXJhbGxlbHxNUElDSCJ9LAotICB7IkxMX1BUUF9CVUxLX1hGRVIiLCAiSUJNTExMYXVuY2guTExfUFRQX0JVTEtfWEZFUl9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfQlVMS19YRkVSX1RPT0xUSVAiLCAiKExvYWRMZXZlbGVyIGRlZmF1bHQpIiwgIihMb2FkTGV2ZWxlciBkZWZhdWx0KXxZRVN8Tk8ifSwKLSAgeyJMTF9QVFBfTEFSR0VfUEFHRSIsICJJQk1MTExhdW5jaC5MTF9QVFBfTEFSR0VfUEFHRV9MQUJFTCIsICJJQk1MTExhdW5jaC5MTF9QVFBfTEFSR0VfUEFHRV9UT09MVElQIiwgIihMb2FkTGV2ZWxlciBkZWZhdWx0KSIsICIoTG9hZExldmVsZXIgZGVmYXVsdCl8WXxNfE4ifSwKLSAgeyJMTF9QVFBfU1VCTUlUX01PREUiLCAiSUJNTExMYXVuY2guTExfUFRQX1NVQk1JVF9NT0RFX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9TVUJNSVRfTU9ERV9UT09MVElQIiwgIkFkdmFuY2VkIiwgIkFkdmFuY2VkfEJhc2ljIn0KLX07Ci0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAqIEludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqaWQ7ICAgICAgICAgICAgICAgICAgICAgLyogQXR0cmlidXRlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICovCi0gIGNoYXIgKnNob3J0X25hbWU7ICAgICAgICAgICAgIC8qIERlc2NyaXB0aW9uIHVzZWQgYXMgbGFiZWwgaW4gR1VJICovCi0gIGNoYXIgKmxvbmdfbmFtZTsgICAgICAgICAgICAgIC8qIFRleHQgdXNlZCBmb3IgdG9vbHRpcCB0ZXh0IGluIEdVSSAqLwotICBpbnQgZGVmYXVsdF92YWx1ZTsgICAgICAgICAgICAvKiBBdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgKi8KLSAgaW50IGxsaW1pdDsgICAgICAgICAgICAgICAgICAgLyogQXR0cmlidXRlJ3MgbG93ZXIgbGltaXQgKG1pbikgICAgICAgICovCi0gIGludCB1bGltaXQ7ICAgICAgICAgICAgICAgICAgIC8qIEF0dHJpYnV0ZSdzIHVwcGVyIGxpbWl0IChtYXgpICAgICAgICAqLwotfSBpbnRfbGF1bmNoX2F0dHI7Ci0KLWludF9sYXVuY2hfYXR0ciBpbnRfYXR0cnNbXSA9IHsKLSAgeyJMTF9QVFBfVEFTS1NfUEVSX05PREUiLCAiSUJNTExMYXVuY2guTExfUFRQX1RBU0tTX1BFUl9OT0RFX0xBQkVMIiwgIklCTUxMTGF1bmNoLkxMX1BUUF9UQVNLU19QRVJfTk9ERV9UT09MVElQIiwgMCwwLElOVF9NQVh9Ci19OwotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgKiBMb25ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKmlkOyAgICAgICAgICAgICAgICAgICAgIC8qIEF0dHJpYnV0ZSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAqLwotICBjaGFyICpzaG9ydF9uYW1lOyAgICAgICAgICAgICAvKiBEZXNjcmlwdGlvbiB1c2VkIGFzIGxhYmVsIGluIEdVSSAqLwotICBjaGFyICpsb25nX25hbWU7ICAgICAgICAgICAgICAvKiBUZXh0IHVzZWQgZm9yIHRvb2x0aXAgdGV4dCBpbiBHVUkgKi8KLSAgbG9uZyBsb25nIGRlZmF1bHRfdmFsdWU7ICAgICAgLyogQXR0cmlidXRlJ3MgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICovCi0gIGxvbmcgbG9uZyBsbGltaXQ7ICAgICAgICAgICAgIC8qIEF0dHJpYnV0ZSdzIGxvd2VyIGxpbWl0IChtaW4pICAgICAgICAqLwotICBsb25nIGxvbmcgdWxpbWl0OyAgICAgICAgICAgICAvKiBBdHRyaWJ1dGUncyB1cHBlciBsaW1pdCAobWF4KSAgICAgICAgKi8KLX0gbG9uZ19pbnRfbGF1bmNoX2F0dHI7Ci0KLWxvbmdfaW50X2xhdW5jaF9hdHRyIGxvbmdfaW50X2F0dHJzW10gPSB7Ci0gIHsiUGxhY2VIb2xkZXItbG9uZyIsICI/Pz8iLCAiUGxhY2UgaG9sZGVyOiIsIDAsIDAsIDB4N2ZmZmZmZmZmZmZmZmZmZkxMfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBKb2IgQ29tbWFuZCBGaWxlIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNoYXIgKmpvYl9jb21tYW5kX2ZpbGVfdGVtcGxhdGVbXSA9IHsKLSAgIiMhL2Jpbi9zaCIsCi0gICIjIEAgYWNjb3VudF9ubyA9IDw8PExMX1BUUF9BQ0NPVU5UX05PPj4+IiwKLSAgIiMgQCBhcmd1bWVudHMgPSA8PDxwcm9nQXJncz4+PiIsCi0gICIjKE5PVCBTVVBQT1JURUQpIyBAIGJnX2Nvbm5lY3Rpb24iLAotICAiIyhOT1QgU1VQUE9SVEVEKSMgQCBiZ19wYXJ0aXRpb24iLAotICAiIyhOT1QgU1VQUE9SVEVEKSMgQCBiZ19yZXF1aXJlbWVudHMiLAotICAiIyhOT1QgU1VQUE9SVEVEKSMgQCBiZ19yb3V0ZSIsCi0gICIjKE5PVCBTVVBQT1JURUQpIyBAIGJnX3NoYXBlIiwKLSAgIiMoTk9UIFNVUFBPUlRFRCkjIEAgYmdfc2l6ZSIsCi0gICIjIEAgYmxvY2tpbmcgPSA8PDxMTF9QVFBfQkxPQ0tJTkc+Pj4iLAotICAiIyBAIGJ1bGt4ZmVyID0gPDw8TExfUFRQX0JVTEtYRkVSPj4+IiwKLSAgIiMgQCBjaGVja3BvaW50ID0gPDw8TExfUFRQX0NIRUNLUE9JTlQ+Pj4iLAotICAiIyBAIGNrcHRfZGlyID0gPDw8TExfUFRQX0NLUFRfRElSPj4+IiwKLSAgIiMgQCBja3B0X2V4ZWN1dGVfZGlyID0gPDw8TExfUFRQX0NLUFRfRVhFQ1VURV9ESVI+Pj4iLAotICAiIyBAIGNrcHRfZmlsZSA9IDw8PExMX1BUUF9DS1BUX0ZJTEU+Pj4iLAotICAiIyBAIGNrcHRfdGltZV9saW1pdCA9IDw8PExMX1BUUF9DS1BUX1RJTUVfTElNSVRfSEFSRD4+Piw8PDxMTF9QVFBfQ0tQVF9USU1FX0xJTUlUX1NPRlQ+Pj4iLAotICAiIyBAIGNsYXNzID0gPDw8TExfUFRQX0NMQVNTPj4+IiwKLSAgIiMgQCBjbHVzdGVyX2lucHV0X2ZpbGUgPSA8PDxMTF9QVFBfQ0xVU1RFUl9JTlBVVF9GSUxFXzE+Pj4iLAotICAiIyBAIGNsdXN0ZXJfaW5wdXRfZmlsZSA9IDw8PExMX1BUUF9DTFVTVEVSX0lOUFVUX0ZJTEVfMj4+PiIsCi0gICIjIEAgY2x1c3Rlcl9pbnB1dF9maWxlID0gPDw8TExfUFRQX0NMVVNURVJfSU5QVVRfRklMRV8zPj4+IiwKLSAgIiMgQCBjbHVzdGVyX2xpc3QgPSA8PDxMTF9QVFBfQ0xVU1RFUl9MSVNUPj4+IiwKLSAgIiMgQCBjbHVzdGVyX291dHB1dF9maWxlID0gPDw8TExfUFRQX0NMVVNURVJfT1VUUFVUX0ZJTEVfMT4+PiIsCi0gICIjIEAgY2x1c3Rlcl9vdXRwdXRfZmlsZSA9IDw8PExMX1BUUF9DTFVTVEVSX09VVFBVVF9GSUxFXzI+Pj4iLAotICAiIyBAIGNsdXN0ZXJfb3V0cHV0X2ZpbGUgPSA8PDxMTF9QVFBfQ0xVU1RFUl9PVVRQVVRfRklMRV8zPj4+IiwKLSAgIiMgQCBjb21tZW50ID0gPDw8TExfUFRQX0NPTU1FTlQ+Pj4iLAotICAiIyBAIGNvcmVfbGltaXQgPSA8PDxMTF9QVFBfQ09SRV9MSU1JVF9IQVJEPj4+LDw8PExMX1BUUF9DT1JFX0xJTUlUX1NPRlQ+Pj4iLAotICAiIyhOT1QgU1VQUE9SVEVEKSMgQCBjb3NjaGVkdWxlIiwKLSAgIiMgQCBjcHVfbGltaXQgPSA8PDxMTF9QVFBfQ1BVX0xJTUlUX0hBUkQ+Pj4sPDw8TExfUFRQX0NQVV9MSU1JVF9TT0ZUPj4+IiwKLSAgIiMgQCBkYXRhX2xpbWl0ID0gPDw8TExfUFRQX0RBVEFfTElNSVRfSEFSRD4+Piw8PDxMTF9QVFBfREFUQV9MSU1JVF9TT0ZUPj4+IiwKLSAgIiMoTk9UIFNVUFBPUlRFRCkjIEAgZGVwZW5kZW5jeSIsCi0gICIjIEAgZW52X2NvcHkgPSA8PDxMTF9QVFBfRU5WX0NPUFk+Pj4iLAotICAiIyBAIGVudmlyb25tZW50ID0gPDw8TExfUFRQX0VOVklST05NRU5UPj4+IiwKLSAgIiMgQCBlcnJvciA9IDw8PExMX1BUUF9FUlJPUj4+PiIsCi0gICIjIEAgZXhlY3V0YWJsZSA9IDw8PGV4ZWNQYXRoPj4+Lzw8PGV4ZWNOYW1lPj4+IiwKLSAgIiMgQCBleGVjdXRhYmxlID0gPDw8TExfUFRQX0VYRUNVVEFCTEU+Pj4iLAotICAiIyBAIGZpbGVfbGltaXQgPSA8PDxMTF9QVFBfRklMRV9MSU1JVF9IQVJEPj4+LDw8PExMX1BUUF9GSUxFX0xJTUlUX1NPRlQ+Pj4iLAotICAiIyBAIGdyb3VwID0gPDw8TExfUFRQX0dST1VQPj4+IiwKLSAgIiMoTk9UIFNVUFBPUlRFRCkjIEAgaG9sZCIsCi0gICIjIEAgaW1hZ2Vfc2l6ZSA9IDw8PExMX1BUUF9JTUFHRV9TSVpFPj4+IiwKLSAgIiMgQCBpbml0aWFsZGlyID0gPDw8d29ya2luZ0Rpcj4+PiIsCi0gICIjIEAgaW5pdGlhbGRpciA9IDw8PExMX1BUUF9JTklUSUFMRElSPj4+IiwKLSAgIiMgQCBpbnB1dCA9IDw8PExMX1BUUF9JTlBVVD4+PiIsCi0gICIjIEAgam9iX2NwdV9saW1pdCA9IDw8PExMX1BUUF9KT0JfQ1BVX0xJTUlUX0hBUkQ+Pj4sIDw8PExMX1BUUF9KT0JfQ1BVX0xJTUlUX1NPRlQ+Pj4iLAotICAiIyBAIGpvYl9uYW1lID0gPDw8TExfUFRQX0pPQl9OQU1FPj4+IiwKLSAgIiMgQCBqb2JfdHlwZSA9IDw8PExMX1BUUF9KT0JfVFlQRT4+PiIsCi0gICIjIEAgbGFyZ2VfcGFnZSA9IDw8PExMX1BUUF9MQVJHRV9QQUdFPj4+IiwKLSAgIiMoTk9UIFNVUFBPUlRFRCkjIEAgbWF4X3Byb2Nlc3NvcnMiLAotICAiIyBAIG1jbV9hZmZpbml0eV9vcHRpb25zID0gPDw8TExfUFRQX01DTV9BRkZJTklUWV9PUFRJT05TPj4+IiwKLSAgIiMoTk9UIFNVUFBPUlRFRCkjIEAgbWluX3Byb2Nlc3NvcnMiLAotICAiIyBAIG5ldHdvcmsuTVBJID0gPDw8TExfUFRQX05FVFdPUktfTVBJPj4+IiwKLSAgIiMgQCBuZXR3b3JrLkxBUEkgPSA8PDxMTF9QVFBfTkVUV09SS19MQVBJPj4+IiwKLSAgIiMgQCBuZXR3b3JrLk1QSV9MQVBJID0gPDw8TExfUFRQX05FVFdPUktfTVBJX0xBUEk+Pj4iLAotICAiIyBAIG5vZGUgPSA8PDxMTF9QVFBfTk9ERV9NSU4+Pj4sPDw8TExfUFRQX05PREVfTUFYPj4+IiwKLSAgIiMgQCBub2RlX3VzYWdlID0gPDw8TExfUFRQX05PREVfVVNBR0U+Pj4iLAotICAiIyBAIG5vdGlmaWNhdGlvbiA9IDw8PExMX1BUUF9OT1RJRklDQVRJT04+Pj4iLAotICAiIyBAIG5vdGlmeV91c2VyID0gPDw8TExfUFRQX05PVElGWV9VU0VSPj4+IiwKLSAgIiMgQCBvdXRwdXQgPSA8PDxMTF9QVFBfT1VUUFVUPj4+IiwKLSAgIiMgQCBwcmVmZXJlbmNlcyA9IDw8PExMX1BUUF9QUkVGRVJFTkNFUz4+PiIsCi0gICIjIEAgcmVxdWlyZW1lbnRzID0gPDw8TExfUFRQX1JFUVVJUkVNRU5UUz4+PiIsCi0gICIjIEAgcmVzb3VyY2VzID0gPDw8TExfUFRQX1JFU09VUkNFUz4+PiIsCi0gICIjIEAgcmVzdGFydCA9IDw8PExMX1BUUF9SRVNUQVJUPj4+IiwKLSAgIiMgQCByZXN0YXJ0X2Zyb21fY2twdCA9IDw8PExMX1BUUF9SRVNUQVJUX0ZST01fQ0tQVD4+PiIsCi0gICIjKE5PVCBTVVBQT1JURUQpIyBAIHJlc3RhcnRfb25fc2FtZV9ub2RlcyIsCi0gICIjIEAgcnNldCA9IDw8PExMX1BUUF9SU0VUPj4+IiwKLSAgIiMgQCBzaGVsbCA9IDw8PExMX1BUUF9TSEVMTD4+PiIsCi0gICIjIEAgc210ID0gPDw8TExfUFRQX1NNVD4+PiIsCi0gICIjIEAgc3RhY2tfbGltaXQgPSA8PDxMTF9QVFBfU1RBQ0tfTElNSVRfSEFSRD4+Piw8PDxMTF9QVFBfU1RBQ0tfTElNSVRfU09GVD4+PiIsCi0gICIjIEAgc3RhcnRfZGF0ZSA9IDw8PExMX1BUUF9TVEFSVF9EQVRFPj4+IiwKLSAgIiMoTk9UIFNVUFBPUlRFRCkjIEAgc3RlcF9uYW1lIiwKLSAgIiMgQCB0YXNrX2dlb21ldHJ5ID0gPDw8TExfUFRQX1RBU0tfR0VPTUVUUlk+Pj4iLAotICAiIyBAIHRhc2tzX3Blcl9ub2RlID0gPDw8TExfUFRQX1RBU0tTX1BFUl9OT0RFPj4+IiwKLSAgIiMgQCB0b3RhbF90YXNrcyA9IDw8PExMX1BUUF9UT1RBTF9UQVNLUz4+PiIsCi0gICIjIEAgdXNlcl9wcmlvcml0eSA9IDw8PExMX1BUUF9VU0VSX1BSSU9SSVRZPj4+IiwKLSAgIiMgQCB3YWxsX2Nsb2NrX2xpbWl0ID0gPDw8TExfUFRQX1dBTExDTE9DS19IQVJEPj4+LDw8PExMX1BUUF9XQUxMQ0xPQ0tfU09GVD4+PiIsCi0gICIjIEAgcXVldWUiCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFByb3h5IGNvbW1hbmQgaGFuZGxlciAtIGNvbW1hbmRfaW5pdGlhbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiBEeW5hbWljYWxseSBsb2FkIExvYWRMZXZlbGVyIGxpYiAobGlibGxhcGkuYSBmb3IgQUlYIG9yICAgICAgICAgICAgICAgKiAKLSAqIGxpYmxsYXBpLnNvIGZvciBMaW51eCkgdGhlbiByZXNvbHZlIHRoZSBmdW5jdGlvbnMgd2UgbmVlZCB0byAgICAgICAgICAqIAotICogY2FsbCB0byB0YWxrIHRvIExvYWRMZXZlbGVyIChzdWJtaXQsIGNhbmNlbCBvciBxdWVyeSBqb2JzLCAgICAgICAgICAgICogCi0gKiBxdWVyeSBtYWNoaW5lcywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogU2VlIGxsYXBpLmggZm9yIGludGVyZmFjZXMgdG8gTG9hZExldmVsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBjb21tYW5kX2luaXRpYWxpemUoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKQotewotICBpbnQgaTsKLSAgaW50IGRsb3Blbl9tb2RlID0gMDsKLSAgaW50IG15X2Vycm5vID0gMDsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0gIAlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoQkFTRV9JRF9BVFRSLCBhcmdzW2ldKSkgewotICAJCWlibWxsX3Byb3h5X2Jhc2VfaWQgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsgICAgICAvKiB0aGUgYmFzZSBpZCBlc3RhYmxpc2hlZCBieSBndWkgZnJvbnQgZW5kICovCi0gIAl9Ci0gIH0gIAotICBzcHJpbnRmKGlibWxsX3Byb3h5X2Jhc2VfaWRfc3RyaW5nLCAiJWQiLCBpYm1sbF9wcm94eV9iYXNlX2lkKTsKLQotICBtZW1zZXQoJkxMX1NZTVMsICdcMCcsIHNpemVvZihMTF9TWU1TKSk7ICAgICAgLyogemVybyB0aGUgTG9hZExldmVsZXIgZGxzeW0gc3ltYm9sIHRhYmxlICovCi0gIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiZGxvcGVuIExvYWRMZXZlbGVyIHNoYXJlZCBsaWJyYXJ5ICVzLlxuIiwgaWJtbGxfbGlicGF0aF9uYW1lKTsKLSAgZGxvcGVuX21vZGUgPSBSVExEX0xPQ0FMIHwgUlRMRF9OT1c7Ci0jaWZkZWYgX0FJWAotICBkbG9wZW5fbW9kZSA9IGRsb3Blbl9tb2RlIHwgUlRMRF9NRU1CRVI7Ci0jZW5kaWYKLSAgaWJtbGxfbGlicGF0aF9oYW5kbGUgPSBkbG9wZW4oaWJtbGxfbGlicGF0aF9uYW1lLCBkbG9wZW5fbW9kZSk7Ci0gIG15X2Vycm5vID0gZXJybm87Ci0gIGlmIChpYm1sbF9saWJwYXRoX2hhbmRsZSA9PSBOVUxMKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiZGxvcGVuIG9mICVzIGZhaWxlZCB3aXRoIGVycm5vPSVkLlxuIiwgaWJtbGxfbGlicGF0aF9uYW1lLCBteV9lcnJubyk7Ci0gICAgc2VuZEVycm9yRXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgUlRFVl9FUlJPUl9MTF9JTklULCAiZGxvcGVuIGZhaWxlZCBmb3IgTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkiKTsKLSAgICByZXR1cm4gUFJPWFlfUkVTX0VSUjsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgImRsb3BlbiAlcyBzdWNjZXNzZnVsLlxuIiwgaWJtbGxfbGlicGF0aF9uYW1lKTsKLSAgfQotCi0gIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTG9jYXRpbmcgTG9hZExldmVsZXIgZnVuY3Rpb25zIHZpYSBkbHN5bS5cbiIpOwotICAqKHZvaWQgKiopICgmKExMX1NZTVMubGxfcXVlcnkpKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfcXVlcnkiKTsKLSAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfc2V0X3JlcXVlc3QpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbF9zZXRfcmVxdWVzdCIpOwotICAqKHZvaWQgKiopICgmTExfU1lNUy5sbF9nZXRfb2JqcykgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsX2dldF9vYmpzIik7Ci0gICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX2dldF9kYXRhKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfZ2V0X2RhdGEiKTsKLSAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfZnJlZV9vYmpzKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfZnJlZV9vYmpzIik7Ci0gICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX2RlYWxsb2NhdGUpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbF9kZWFsbG9jYXRlIik7Ci0gICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX25leHRfb2JqKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfbmV4dF9vYmoiKTsKLSAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfY2x1c3RlcikgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsX2NsdXN0ZXIiKTsKLSAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfc3VibWl0X2pvYikgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsc3VibWl0Iik7Ci0gICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX3Rlcm1pbmF0ZV9qb2IpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbF90ZXJtaW5hdGVfam9iIik7Ci0gICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX2ZyZWVfam9iX2luZm8pID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbGZyZWVfam9iX2luZm8iKTsKLSAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfZXJyb3IpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbF9lcnJvciIpOwotICBpZiAoKExMX1NZTVMubGxfcXVlcnkgPT0gTlVMTCkgfHwgKExMX1NZTVMubGxfc2V0X3JlcXVlc3QgPT0gTlVMTCkKLSAgICAgIHx8IChMTF9TWU1TLmxsX2dldF9vYmpzID09IE5VTEwpIHx8IChMTF9TWU1TLmxsX2dldF9kYXRhID09IE5VTEwpCi0gICAgICB8fCAoTExfU1lNUy5sbF9mcmVlX29ianMgPT0gTlVMTCkKLSAgICAgIHx8IChMTF9TWU1TLmxsX2RlYWxsb2NhdGUgPT0gTlVMTCkKLSAgICAgIHx8IChMTF9TWU1TLmxsX2NsdXN0ZXIgPT0gTlVMTCkKLSAgICAgIHx8IChMTF9TWU1TLmxsX25leHRfb2JqID09IE5VTEwpCi0gICAgICB8fCAoTExfU1lNUy5sbF9mcmVlX2pvYl9pbmZvID09IE5VTEwpCi0gICAgICB8fCAoTExfU1lNUy5sbF90ZXJtaW5hdGVfam9iID09IE5VTEwpCi0gICAgICB8fCAoTExfU1lNUy5sbF9lcnJvciA9PSBOVUxMKQotICAgICAgfHwgKExMX1NZTVMubGxfc3VibWl0X2pvYiA9PSBOVUxMKSkgewotICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIk9uZSBvciBtb3JlIExvYWRMZXZlbGVyIHN5bWJvbHMgY291bGQgbm90IGJlIGxvY2F0ZWQgaW4gJXMuXG4iLCBpYm1sbF9saWJwYXRoX25hbWUpOwotICAgIHNlbmRFcnJvckV2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIFJURVZfRVJST1JfTExfSU5JVCwgIkxvYWRMZXZlbGVyIHN5bWJvbHMgbm90IGxvY2F0ZWQiKTsKLSAgICByZXR1cm4gUFJPWFlfUkVTX0VSUjsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlN1Y2Nlc3NmdWxseSBsb2NhdGVkIGFsbCBvZiB0aGUgcmVxdWlyZWQgTG9hZExldmVsZXIgZnVuY3Rpb25zIHZpYSBkbHN5bS5cbiIpOwotICB9Ci0KLSAgc2VuZE9rRXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCk7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFByb3h5IGNvbW1hbmQgaGFuZGxlciAtIGNvbW1hbmRfZGVmaW5lX21vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiBTZW5kIGF0dHJpYnV0ZXMgdG8gZnJvbnQgZW5kIGRlc2NyaWJpbmcgdGhlIGxhdW5jaCAgICAgICAgICAgICAgICAgICAgKiAKLSAqIGNvbmZpZ3VyYXRpb24gKGxhYmVscywgZGVmYXVsdCB2YWx1ZXMsIGV0YykuICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgY29tbWFuZF9kZWZpbmVfbW9kZWwoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKQotewotICBpbnQgaSA9IDA7Ci0gIGNoYXIgcHJveHlfZ2VuZXJhdGVkX2F0dHJpYnV0ZV9zdHJpbmdbMjU2XTsKLSAgcHJveHlfbXNnICptc2c7Ci0gIGNoYXIgKmNwOwotICBjaGFyICplbmRfY3A7Ci0gIGNoYXIgKmNwX3NhdmU7Ci0gIGludCBuOwotCi0vKiAKLSAqIFNlbmQgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucywgbGF1bmNoIGF0dHJpYnV0ZSBkZWZpbml0aW9ucywKLSAqIGFuZCBlbGVtZW50IGRlZmluaXRpb25zIGtub3duIGJ5IHRoaXMgcHJveHkgdG8gdGhlIEdVSS4KLSAqLwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogc2VuZCBzdHJpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cmluZ19sYXVuY2hfYXR0cnMpIC8gc2l6ZW9mKHN0cmluZ19sYXVuY2hfYXR0cikpOyBpKyspIHsKLSAgICBpZiAoc3RyY21wKCJMTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9URU1QTEFURSIsIHN0cmluZ19sYXVuY2hfYXR0cnNbaV0uaWQpID09IDApIHsKLSAgICAgIGlmIChzdHJsZW4oc3RhdGljX3RlbXBsYXRlX292ZXJyaWRlKSA+IDApIHsKLSAgICAgICAgc2VuZEF0dHJEZWZTdHJpbmdFdmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLmlkLCBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLnNob3J0X25hbWUsIHN0cmluZ19sYXVuY2hfYXR0cnNbaV0ubG9uZ19uYW1lLCAwLCBzdGF0aWNfdGVtcGxhdGVfb3ZlcnJpZGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VuZEF0dHJEZWZTdHJpbmdFdmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLmlkLCBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLnNob3J0X25hbWUsIHN0cmluZ19sYXVuY2hfYXR0cnNbaV0ubG9uZ19uYW1lLCAwLCBzdGF0aWNfdGVtcGxhdGVfbmFtZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlbmRBdHRyRGVmU3RyaW5nRXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgc3RyaW5nX2xhdW5jaF9hdHRyc1tpXS5pZCwgc3RyaW5nX2xhdW5jaF9hdHRyc1tpXS5zaG9ydF9uYW1lLCBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLmxvbmdfbmFtZSwgMCwgc3RyaW5nX2xhdW5jaF9hdHRyc1tpXS5kZWZhdWx0X3ZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIHNlbmQgaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihpbnRfYXR0cnMpIC8gc2l6ZW9mKGludF9sYXVuY2hfYXR0cikpOyBpKyspIHsKLSAgICBzZW5kQXR0ckRlZkludEV2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIGludF9hdHRyc1tpXS5pZCwgaW50X2F0dHJzW2ldLnNob3J0X25hbWUsIGludF9hdHRyc1tpXS5sb25nX25hbWUsIDAsIGludF9hdHRyc1tpXS5kZWZhdWx0X3ZhbHVlLCBpbnRfYXR0cnNbaV0ubGxpbWl0LCBpbnRfYXR0cnNbaV0udWxpbWl0KTsKLSAgfQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogc2VuZCBsb25ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGxvbmdfaW50X2F0dHJzKSAvIHNpemVvZihsb25nX2ludF9sYXVuY2hfYXR0cikpOyBpKyspIHsKLSAgICBtc2cgPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX0FUVFJfREVGLCBndWlfdHJhbnNtaXNzaW9uX2lkKTsKLSAgICBwcm94eV9tc2dfYWRkX2ludChtc2csIDEpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgOCk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBsb25nX2ludF9hdHRyc1tpXS5pZCk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCAiQklHSU5URUdFUiIpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgbG9uZ19pbnRfYXR0cnNbaV0uc2hvcnRfbmFtZSk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBsb25nX2ludF9hdHRyc1tpXS5sb25nX25hbWUpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgMCk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfYXR0cmlidXRlX3N0cmluZywgIiVsbGQiLCBsb25nX2ludF9hdHRyc1tpXS5kZWZhdWx0X3ZhbHVlKTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIHByb3h5X2dlbmVyYXRlZF9hdHRyaWJ1dGVfc3RyaW5nKTsKLSAgICBzcHJpbnRmKHByb3h5X2dlbmVyYXRlZF9hdHRyaWJ1dGVfc3RyaW5nLCAiJWxsZCIsIGxvbmdfaW50X2F0dHJzW2ldLmxsaW1pdCk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBwcm94eV9nZW5lcmF0ZWRfYXR0cmlidXRlX3N0cmluZyk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfYXR0cmlidXRlX3N0cmluZywgIiVsbGQiLCBsb25nX2ludF9hdHRyc1tpXS51bGltaXQpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgcHJveHlfZ2VuZXJhdGVkX2F0dHJpYnV0ZV9zdHJpbmcpOwotICAgIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIHNlbmQgZW51bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihlbnVtX2F0dHJzKSAvIHNpemVvZihlbnVtX2xhdW5jaF9hdHRyKSk7IGkrKykgewotCi0KLSAgLyoKLSAgICogQ291bnQgdGhlIG51bWJlciBvZiBlbnVtZXJhdGlvbnMgaW4gdGhlIGVudW0gbGlzdC4gRW51bWVyYXRpb25zIGFyZQotICAgKiBkZWxpbWl0ZWQgYnkgJ3wnIHNvIG51bWJlciBvZiBlbnVtZXJhdGlvbnMgaXMgbnVtYmVyIG9mICd8JyArIDEKLSAgICovCi0gICAgY3AgPSBlbnVtX2F0dHJzW2ldLmVudW1zOwotICAgIG4gPSAxOwotICAgIHdoaWxlICgqY3AgIT0gJ1wwJykgewotICAgICAgaWYgKCgqY3ApID09ICd8JykgewotICAgICAgICBuID0gbiArIDE7Ci0gICAgICB9Ci0gICAgICBjcCA9IGNwICsgMTsKLSAgICB9Ci0gIC8qCi0gICAqIENyZWF0ZSB0aGUgZW51bWVyYXRpb24gYXR0cmlidXRlIGRlZmluaXRpb24gaGVhZGVyCi0gICAqLwotICAgIG1zZyA9IG5ld19wcm94eV9tc2coUFJPWFlfRVZfUlRfQVRUUl9ERUYsIGd1aV90cmFuc21pc3Npb25faWQpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgMSk7Ci0gICAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCBuICsgNik7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBlbnVtX2F0dHJzW2ldLmlkKTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csICJFTlVNRVJBVEVEIik7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBlbnVtX2F0dHJzW2ldLnNob3J0X25hbWUpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZW51bV9hdHRyc1tpXS5sb25nX25hbWUpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgMCk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBlbnVtX2F0dHJzW2ldLmRlZmF1bHRfdmFsdWUpOwotCi0gIC8qCi0gICAqIEFwcGVuZCBlbnVtZXJhdGlvbnMgdG8gbWVzc2FnZS4gU2luY2UgZW51bWVyYXRpb25zIHN0cmluZyBpcwotICAgKiBhIHN0cmluZyBsaXRlcmFsIHRoYXQgaXMgaWxsZWdhbCB0byBtb2RpZnksIGNyZWF0ZSBhIHdvcmtpbmcgY29weQotICAgKi8KLSAgICBjcCA9IHN0cmR1cChlbnVtX2F0dHJzW2ldLmVudW1zKTsKLSAgICBjcF9zYXZlID0gY3A7Ci0gICAgZm9yICg7OykgewotICAgICAgZW5kX2NwID0gc3RyY2hyKGNwLCAnfCcpOwotICAgICAgaWYgKGVuZF9jcCA9PSBOVUxMKSB7Ci0gICAgICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgY3ApOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICplbmRfY3AgPSAnXDAnOwotICAgICAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGNwKTsKLSAgICAgICAgY3AgPSBlbmRfY3AgKyAxOwotICAgICAgfQotICAgIH0KLSAgICBmcmVlKGNwX3NhdmUpOwotICAvKgotICAgKiBTZW5kIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbgotICAgKi8KLSAgICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICB9Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgKiBkb25lIGRlZmluaW5nIHRoZSBtb2RlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgc2VuZE9rRXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCk7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFByb3h5IGNvbW1hbmQgaGFuZGxlciAtIGNvbW1hbmRfc3RhcnRfZXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiBJbiB0aGUgTG9hZExldmVsZXIgd29ybGQgYSBQVFAgbWFjaGluZSBpcyBhIGNsdXN0ZXIgLSBzbyBoZXJlIHdlICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGNvbW1hbmRfc3RhcnRfZXZlbnRzKGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSkKLXsKLQotLyogCi0gKiBTZW5kIHRoZSBjb21wbGV0ZSBtYWNoaW5lIHN0YXRlIHRvIHRoZSBHVUkuICBRdWVyeSBMb2FkTGV2ZWxlciAKLSAqIHRvIGdldCB0aGUgc2V0IG9mIG5vZGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNsdXN0ZXIgKG1hY2hpbmUpIAotICogYW5kIHNlbmQgbmV3IG5vZGUgZXZlbnRzIHRvIHRoZSBHVUkgZm9yIGVhY2ggbm9kZS4KLSAqLwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotCi0gIHN0YXRlX2V2ZW50c19hY3RpdmUgPSAxOyAgICAgIC8qIGV2ZW50cyBhcmUgbm93IGFjdGl2ZSAqLwotICBzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCA9IGd1aV90cmFuc21pc3Npb25faWQ7Ci0KLS8qIENyZWF0ZSB0aHJlYWQgdG8gbW9uaXRvciBMb2FkTGV2ZWxlciBjbHVzdGVycyBvZiBtYWNoaW5lcyAodGhlc2UgYXJlIG5vZGVzIGluIGEgbWFjaGluZSBpbiBwdHAgbGluZ28pLiAgKi8KLSAgcHRocmVhZF9hdHRyX2luaXQoJm1vbml0b3JfTG9hZExldmVsZXJfbm9kZXNfdGhyZWFkX2F0dHIpOwotICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJm1vbml0b3JfTG9hZExldmVsZXJfbm9kZXNfdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKLSAgcHRocmVhZF9jcmVhdGUoJm1vbml0b3JfTG9hZExldmVsZXJfbm9kZXNfdGhyZWFkLCAmbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2Rlc190aHJlYWRfYXR0ciwgbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2RlcywgTlVMTCk7Ci0gIHJlZ2lzdGVyX3RocmVhZChtb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzX3RocmVhZCk7Ci0KLS8qIENyZWF0ZSB0aHJlYWQgdG8gbW9uaXRvciBMb2FkTGV2ZWxlciBqb2JzIGluIGNsdXN0ZXJzLiAgKi8KLSAgcHRocmVhZF9hdHRyX2luaXQoJm1vbml0b3JfTG9hZExldmVsZXJfam9ic190aHJlYWRfYXR0cik7Ci0gIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmbW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzX3RocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7Ci0gIHB0aHJlYWRfY3JlYXRlKCZtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkLCAmbW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzX3RocmVhZF9hdHRyLCBtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnMsIE5VTEwpOwotICByZWdpc3Rlcl90aHJlYWQobW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzX3RocmVhZCk7Ci0gIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAicmVtYXBwZWQgdGhyZWFkIGlkIGZvciBub2RlcyBpcyAldWwtPiVpIGFuZCBmb3Igam9icyBpcyAldWwtPiVpXG4iLCBtb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzX3RocmVhZCwgZmluZF90aHJlYWQobW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2Rlc190aHJlYWQpLCBtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkLCBmaW5kX3RocmVhZChtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkKSk7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFByb3h5IGNvbW1hbmQgaGFuZGxlciAtIGNvbW1hbmRfc3VibWl0X2pvYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiBJbiB0aGUgcHJveHkgd2UgYXJlIGFjY2VwdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIG9uICAgKiAKLSAqIHRvIHN1Ym1pdC4gVGhlc2UgY29tZSBpbiBhcyBlbnY9VkFSTkFNRT1WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiBXZSBhbHNvIGFjY2VwdCBhIGZpbml0ZSBudW1iZXIgb2YgdmFyaWFibGVzIHRvIGNvbnRyb2wgdGhlIGNtZCBmaWxlICAgKiAKLSAqIHN1Ym1pdC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCBmaWxlIGFuZCBvcHRpb25hbGx5IGEgaGV4ICAgICAqIAotICogc3RyaW5nIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZCBjb21tYW5mIGZpbGUuICAgICAgICAgICAgICAgICAgICogCi0gKiAgSGV4IHN0cmluZyBvbmx5IC0+IHdyaXRlIGludG8gY21kIGZpbGUgaW4gdG1wIGFuZCBzdWJtaXQgICAgICAgICAgICAgKiAKLSAqICBDbWQgZmlsZSBvbmx5IC0+IHN1Ym1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogIEhleCBzdHJpbmcgYW5kIGNtZCBmaWxlIC0+IHdyaXRlIGludG8gc3BlY2lmaWVkIGNtZCBmaWxlIGFuZCBzdWJtaXQgICogCi0gKiBJdCBpcyBleHBlY3RlZCB0aGF0IGFsbCBvdGhlciB2YXJpYWJsZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZ3VpIGFuZCAgKiAKLSAqIHN1YnN0aXR1dGVkIGludG8gYSB0ZW1wbGF0ZSBqb2IgY29tbWFuZCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgY29tbWFuZF9zdWJtaXRfam9iKGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSkKLXsKLSAgaW50IHJjID0gMDsKLQotICBjaGFyICpjcCA9IE5VTEw7Ci0gIGNoYXIgKmpvYl9zdWJfaWQgPSBOVUxMOwotICBjaGFyICpsbF9qb2JfY29tbWFuZF9maWxlID0gTlVMTDsKLSAgY2hhciAqbGxfam9iX2NvbW1hbmRfZmlsZV90ZW1wbGF0ZSA9IE5VTEw7Ci0gIGNoYXIgKmpvYl9lbnZfdmFyc1sxMDI0XVszXTsgIC8qIGFsbG93IDEwMjQgZW52IHZhcnMga2V5d29yZCwgbmV3IHZhbHVlLCBvbGQgdmFsdWUgKi8KLSAgY2hhciAqbGxfcHRwX3ZhcnNbMTAyNF1bMl07ICAgLyogYWxsb3cgMTAyNCBsbCB2YXJzIGtleXdvcmQsIHZhbHVlICovCi0gIGludCBpID0gMDsKLSAgaW50IGsgPSAwOwotICBpbnQgbyA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0gIGludCBlbnZfY291bnQgPSAwOwotICBpbnQgbGxfY291bnQgPSAwOwotICBjaGFyIGluY29taW5nWzIwNDhdOwotICBjaGFyIG91dGdvaW5nWzIwNDhdOwotICBjaGFyIHN1Ym1pdF90ZW1wX2ZpbGVbMjU2XTsKLSAgaW50IHN1Ym1pdF90ZW1wX2ZpbGVfZmQgPSAwOwotICBGSUxFICpzdWJtaXRfdGVtcGxhdGVfRklMRSA9IE5VTEw7Ci0gIGludCBhZHZhbmNlZF9tb2RlID0gMTsgICAgICAgIC8qIHByZXNldCB0byBhZHZhbmNlZCBtb2RlICovCi0gIGludCBieXRlc193cml0dGVuID0gMDsKLSAgaW50IG15ZXJybm8gPSAwOwotICBpbnQgc3VibWl0X2ZhaWxlZCA9IDA7ICAgICAgICAvKiBwcmVzZXQgdG8gYWxsIG9rIG9uIHRoaXMgc3VibWl0ICovCi0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcHJpbnRfbWVzc2FnZV9hcmdzKG5hcmdzLCBhcmdzKTsKLQotICBtZW1zZXQoam9iX2Vudl92YXJzLCAnXDAnLCBzaXplb2Yoam9iX2Vudl92YXJzKSk7ICAgICAvKiB6ZXJvIHRoZSBhcmVhICovCi0gIG1lbXNldChzdWJtaXRfdGVtcF9maWxlLCAnXDAnLCBzaXplb2Yoc3VibWl0X3RlbXBfZmlsZSkpOyAgICAgLyogemVybyB0aGUgYXJlYSAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogcHJvY2VzcyBhcmdzIHBhc3NlZCBpbnRvIHRoZSBzdWJtaXQgY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGZvciAoaSA9IDA7IGFyZ3NbaV0gIT0gTlVMTDsgaSsrKSB7Ci0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICogTG9hZExldmVsZXIga2V5d29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAoc3RybmNtcChhcmdzW2ldLCAiTExfUFRQX0pPQl9DT01NQU5EX0ZJTEU9Iiwgc3RybGVuKCJMTF9QVFBfSk9CX0NPTU1BTkRfRklMRT0iKSkgPT0gMCkgewotICAgICAgY3AgPSBzdHJjaHIoYXJnc1tpXSwgJz0nKTsKLSAgICAgIGxsX2pvYl9jb21tYW5kX2ZpbGUgPSBzdHJkdXAoY3AgKyAxKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAoYXJnc1tpXSwgIkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFX1RFTVBMQVRFPSIsIHN0cmxlbigiTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfVEVNUExBVEU9IikpID09IDApIHsKLSAgICAgIGNwID0gc3RyY2hyKGFyZ3NbaV0sICc9Jyk7Ci0gICAgICBsbF9qb2JfY29tbWFuZF9maWxlX3RlbXBsYXRlID0gc3RyZHVwKGNwICsgMSk7Ci0gICAgfQotCi0gICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgKiBHZW5lcmFsIFBUUCBsYXVuY2ggY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYW5kIGVudmlyb25tZW50IHZhcnMgICAgICAgKiAKLSAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaWYgKHN0cm5jbXAoYXJnc1tpXSwgSk9CX1NVQl9JRF9BVFRSICI9Iiwgc3RybGVuKEpPQl9TVUJfSURfQVRUUikgKyAxKSA9PSAwKSB7Ci0gICAgICBjcCA9IHN0cmNocihhcmdzW2ldLCAnPScpOwotICAgICAgam9iX3N1Yl9pZCA9IHN0cmR1cChjcCArIDEpOyAgICAgIC8qIHBpY2sgdXAgdGhlIHZhbCBwYXJ0IG9mIHRoZSBqb2IgaWQgKi8KLSAgICB9Ci0KLSAgICBpZiAoc3RybmNtcChhcmdzW2ldLCBKT0JfRU5WX0FUVFIgIj0iLCBzdHJsZW4oSk9CX0VOVl9BVFRSKSArIDEpID09IDApIHsKLSAgICAgIGNwID0gc3RyY2hyKGFyZ3NbaV0sICc9Jyk7ICAgICAgICAvKiBwaWNrIHVwIHRoZSB2YWwgcGFydCBvZiBlbnY9IHdoaWNoIGlzIGEga2V5d29yZD12YWx1ZSBwYWlyICovCi0gICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGNoYXIgb2Yga2V5d29yZD12YWx1ZSAqLwotICAgICAgbWVtc2V0KGluY29taW5nLCAnXDAnLCBzaXplb2YoaW5jb21pbmcpKTsKLSAgICAgIHN0cmNweShpbmNvbWluZywgY3ApOyAgICAgLyogcGljayB1cCBpbnRvIHdvcmsgYXJlYSBmb3IgbW9kaWZpY2F0aW9ucyAqLwotICAgICAgY3AgPSBzdHJjaHIoaW5jb21pbmcsICc9Jyk7ICAgICAgIC8qIHBpY2sgdXAgdGhlID0gaW4ga2V5d29yZD12YWx1ZSBwYWlyICovCi0gICAgICAqY3AgPSAnXDAnOyAgICAgICAgICAgICAgIC8qIG1ha2Uga2V5IGEgc3RyaW5nIGJ5IGl0c2VsZiAqLwotICAgICAgY3ArKzsgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBjaGFyIG9mIHZhbHVlIGluIGtleXdvcmQ9dmFsdWUgcGFpciAqLwotICAgICAgam9iX2Vudl92YXJzW2Vudl9jb3VudF1bMF0gPSBzdHJkdXAoaW5jb21pbmcpOyAgICAvKiBrZXl3b3JkICovCi0gICAgICBqb2JfZW52X3ZhcnNbZW52X2NvdW50XVsxXSA9IHN0cmR1cChjcCk7ICAvKiBuZXcgdmFsdWUgKi8KLSAgICAgIGVudl9jb3VudCsrOwotICAgIH0KLQotICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICogU3Vic3RpdHV0aW9uIHZhcmlhYmxlcyAobGlrZSBMTF9QVFBfeHh4eHh4eHh4KSAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGlmICgoc3RybmNtcChhcmdzW2ldLCAiTExfUFRQXyIsIHN0cmxlbigiTExfUFRQXyIpKSA9PSAwKSB8fCAoc3RybmNtcChhcmdzW2ldLCAid29ya2luZ0RpciIsIHN0cmxlbigid29ya2luZ0RpciIpKSA9PSAwKSB8fCAoc3RybmNtcChhcmdzW2ldLCAicHJvZ0FyZ3MiLCBzdHJsZW4oInByb2dBcmdzIikpID09IDApIHx8IChzdHJuY21wKGFyZ3NbaV0sICJleGVjTmFtZSIsIHN0cmxlbigiZXhlY05hbWUiKSkgPT0gMCkgfHwgKHN0cm5jbXAoYXJnc1tpXSwgImV4ZWNQYXRoIiwgc3RybGVuKCJleGVjUGF0aCIpKSA9PSAwKQotICAgICAgKSB7Ci0gICAgICBtZW1zZXQoaW5jb21pbmcsICdcMCcsIHNpemVvZihpbmNvbWluZykpOwotICAgICAgc3RyY3B5KGluY29taW5nLCBhcmdzW2ldKTsgICAgICAgIC8qIHBpY2sgdXAgaW50byB3b3JrIGFyZWEgZm9yIG1vZGlmaWNhdGlvbnMgKi8KLSAgICAgIGNwID0gc3RyY2hyKGluY29taW5nLCAnPScpOyAgICAgICAvKiBwaWNrIHVwIHRoZSA9IGluIGtleXdvcmQ9dmFsdWUgcGFpciAqLwotICAgICAgKmNwID0gJ1wwJzsgICAgICAgICAgICAgICAvKiBtYWtlIGtleSBhIHN0cmluZyBieSBpdHNlbGYgKi8KLSAgICAgIGxsX3B0cF92YXJzW2xsX2NvdW50XVswXSA9IHN0cmR1cChpbmNvbWluZyk7ICAgICAgLyogcGljayB1cCB0aGUga2V5d29yZCAqLwotICAgICAgY3ArKzsgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBjaGFyIG9mIHZhbHVlIGluIGtleXdvcmQ9dmFsdWUgcGFpciAqLwotICAgICAgbGxfcHRwX3ZhcnNbbGxfY291bnRdWzFdID0gc3RyZHVwKGNwKTsgICAgLyogcGljayB1cCB0aGUgdmFsdWUgKi8KLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiUmVjZWl2ZWQga2V5d29yZFslZF09dmFsdWUgJXM9JXNcbiIsIGxsX2NvdW50LCBsbF9wdHBfdmFyc1tsbF9jb3VudF1bMF0sIGxsX3B0cF92YXJzW2xsX2NvdW50XVsxXSk7Ci0gICAgICBpZiAoc3RyY21wKGxsX3B0cF92YXJzW2xsX2NvdW50XVswXSwgIkxMX1BUUF9TVUJNSVRfTU9ERSIpID09IDApIHsKLSAgICAgICAgaWYgKHN0cmNtcChsbF9wdHBfdmFyc1tsbF9jb3VudF1bMV0sICJCYXNpYyIpID09IDApIHsKLSAgICAgICAgICBhZHZhbmNlZF9tb2RlID0gMDsgICAgLyogbm8gbG9uZ2VyIGFkdmFuY2VkIG1vZGUgLSBub3cgd2UgYXJlIGJhc2ljICovCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxsX2NvdW50Kys7ICAgICAgICAgICAgICAgLyogY291bnQgaXQgKi8KLSAgICB9Ci0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGxvb3Agb24gYXJncyBwYXNzZWQgaW50byBzdWJtaXQgY29tbWFuZCAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogSGFuZGxlIG92ZXJyaWRlcyBvZiBMTF9QVFBfeHh4eHggdmFyaWFibGVzIG92ZXIgIFBUUCB2YXJpYWJsZXMgICAgICAgICogCi0gICAgICogTExfUFRQX0lOSVRJQUxESVIgb3ZlcnJpZGVzIHdvcmtpbmdEaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiBMTF9QVFBfRVhFQ1VUQUJMRSBvdmVycmlkZXMgZXhlY1BhdGgvZXhlY05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBmb3IgKGsgPSAwOyBrIDwgbGxfY291bnQ7IGsrKykgeyAgICAgIC8qIGxvb3Agb24ga2V5d29yZCB2YWx1ZSBwYWlycyAqLwotICAgIGlmIChzdHJuY21wKCJMTF9QVFBfRVhFQ1VUQUJMRSIsIGxsX3B0cF92YXJzW2tdWzBdLCBzdHJsZW4obGxfcHRwX3ZhcnNba11bMF0pKSA9PSAwKSB7ICAgICAgLyogbWF0Y2ggc28gZmFyICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbGxfY291bnQ7IGkrKykgeyAgLyogbG9vcCBvbiBrZXl3b3JkIHZhbHVlIHBhaXJzICovCi0gICAgICAgIGlmIChzdHJuY21wKCJleGVjUGF0aCIsIGxsX3B0cF92YXJzW2ldWzBdLCBzdHJsZW4obGxfcHRwX3ZhcnNbaV1bMF0pKSA9PSAwKSB7Ci0gICAgICAgICAgZnJlZShsbF9wdHBfdmFyc1tpXVswXSk7Ci0gICAgICAgICAgbGxfcHRwX3ZhcnNbaV1bMF0gPSBzdHJkdXAoIiAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybmNtcCgiZXhlY05hbWUiLCBsbF9wdHBfdmFyc1tpXVswXSwgc3RybGVuKGxsX3B0cF92YXJzW2ldWzBdKSkgPT0gMCkgewotICAgICAgICAgIGZyZWUobGxfcHRwX3ZhcnNbaV1bMF0pOwotICAgICAgICAgIGxsX3B0cF92YXJzW2ldWzBdID0gc3RyZHVwKCIgIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAoIkxMX1BUUF9JTklUSUFMRElSIiwgbGxfcHRwX3ZhcnNba11bMF0sIHN0cmxlbihsbF9wdHBfdmFyc1trXVswXSkpID09IDApIHsgICAgICAvKiBtYXRjaCBzbyBmYXIgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsbF9jb3VudDsgaSsrKSB7ICAvKiBsb29wIG9uIGtleXdvcmQgdmFsdWUgcGFpcnMgKi8KLSAgICAgICAgaWYgKHN0cm5jbXAoIndvcmtpbmdEaXIiLCBsbF9wdHBfdmFyc1tpXVswXSwgc3RybGVuKGxsX3B0cF92YXJzW2ldWzBdKSkgPT0gMCkgewotICAgICAgICAgIGZyZWUobGxfcHRwX3ZhcnNbaV1bMF0pOwotICAgICAgICAgIGxsX3B0cF92YXJzW2ldWzBdID0gc3RyZHVwKCIgIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBsb29wIG9uIGtleXdvcmQgdmFsdWUgcGFpcnMgKi8KLQotCi0gICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgKiBQZXJmb3JtIHN1YnN0aXR1dGlvbnMgYW5kIGRvIHN1Ym1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGlmIChhZHZhbmNlZF9tb2RlID09IDEpIHsgICAgIC8qIGlmIGFkdmFuY2VkIG1vZGUgc3VibWl0IC0gbm8gc3Vic3RpdHV0aW9ucyAqLwotICAgIHJjID0gbXlfbGxfc3VibWl0X2pvYihndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfc3ViX2lkLCBsbF9qb2JfY29tbWFuZF9maWxlLCBqb2JfZW52X3ZhcnMpOwotICAgIGlmIChyYyA9PSAwKSB7ICAgICAgICAgICAgICAvKiBpZiBqb2Igc3VibWl0IHN1Y2Nlc3NmdWwgKi8KLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiSm9iICVzIHN1Ym1pdHRlZC5cbiIsIGxsX2pvYl9jb21tYW5kX2ZpbGUpOwotICAgIH0gLyogZW5kIGlmIGpvYiBzdWJtaXQgc3VjY2Vzc2Z1bCAqLwotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBqb2Igc3VibWl0IGVycm9yICovCi0gICAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJKb2Igc3VibWl0IGZhaWxlZCBmb3Igam9iICVzLlxuIiwgbGxfam9iX2NvbW1hbmRfZmlsZSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiBqb2Igc3VibWl0IGVycm9yICovCi0gIH0gLyogZW5kIGlmIGFkdmFuY2VkIG1vZGUgc3VibWl0IC0gbm8gc3Vic3RpdHV0aW9ucyAqLwotICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBiYXNpYyBtb2RlIHN1Ym1pdCAtICBzdWJzdGl0dXRpb25zIHRvIGJlIHBlcmZvcm1lZCAqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIE9wZW4gYSB0ZW1wIGZpbGUgZm9yIHN1Ym1pdHRpbmcgb24gL3RtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHN0cmNweShzdWJtaXRfdGVtcF9maWxlLCAiL3RtcC9sbF9wdHBfdGVtcF9zdWJtaXRfZmlsZV8iKTsKLSAgICBzdHJjYXQoc3VibWl0X3RlbXBfZmlsZSwgdXNlcmlkKTsKLSAgICBzdHJjYXQoc3VibWl0X3RlbXBfZmlsZSwgIl9YWFhYWFgiKTsKLSAgICBzdWJtaXRfdGVtcF9maWxlX2ZkID0gbWtzdGVtcChzdWJtaXRfdGVtcF9maWxlKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIE9wZW4gdGVtcGxhdGUgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHN1Ym1pdF90ZW1wbGF0ZV9GSUxFID0gZm9wZW4obGxfam9iX2NvbW1hbmRfZmlsZV90ZW1wbGF0ZSwgInIiKTsKLSAgICBpZiAoc3VibWl0X3RlbXBsYXRlX0ZJTEUgPT0gTlVMTCkgewotICAgICAgbXllcnJubyA9IGVycm5vOwotICAgICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiVW5hYmxlIHRvIG9wZW4gc3VibWl0IHRlbXBsYXRlIGZpbGUgJXMsIGVycm5vPSVkXG4iLCBsbF9qb2JfY29tbWFuZF9maWxlX3RlbXBsYXRlLCBteWVycm5vKTsKLSAgICAgIHN1Ym1pdF9mYWlsZWQgPSAxOyAgICAgICAgLyogc3RvcCBwcm9jZXNpbmcgdGhlIHN1Ym1pdCAqLwotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIFJlYWQgaW4gZnJvbSB0ZW1wbGF0ZSBhbmQgc3Vic3RpdHV0ZSBpbiBrZXk9dmFsdWUsIGlmIGxpbmUgY29udGFpbnMgICAqIAotICAgICAqIGFueSBub24gc3Vic3RpdHV0ZWQgdGhlbiBkb24ndCB3cml0ZSB0aGUgbGluZSBiYWNrIG91dCAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGlmIChzdWJtaXRfZmFpbGVkID09IDApIHsgICAvKiBpZiBzdGlsbCBvayB0byBwcm9jZXNzICovCi0gICAgICBtZW1zZXQoaW5jb21pbmcsICdcMCcsIHNpemVvZihpbmNvbWluZykpOyAvKiB6ZXJvIHRoZSBhcmVhICovCi0gICAgICB3aGlsZSAoKGZnZXRzKGluY29taW5nLCBzaXplb2YoaW5jb21pbmcpLCBzdWJtaXRfdGVtcGxhdGVfRklMRSkpICE9IE5VTEwpIHsgICAgICAgLyogcmVhZCBsaW5lIGludG8gaW5jb21pbmcgKi8KLSAgICAgICAgbyA9IDA7ICAgICAgICAgICAgICAgICAgLyogb3V0Z29pbmcgbGluZSBwb3NpdGlvbiAqLwotICAgICAgICBtZW1zZXQob3V0Z29pbmcsICdcMCcsIHNpemVvZihvdXRnb2luZykpOyAgICAgICAvKiB6ZXJvIHRoZSBvdXRnb2luZyBhcmVhICovCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihpbmNvbWluZyk7KSB7ICAgIC8qIGxvb3Agb24gaW5jb21pbmcgbGluZSAqLwotICAgICAgICAgIG1hdGNoID0gMDsKLSAgICAgICAgICBpZiAoc3RybGVuKCZpbmNvbWluZ1tpXSkgPj0gNikgeyAgICAgIC8qIGlmIGxpbmUgbGVmdCBpcyA+PSA2ICovCi0gICAgICAgICAgICBpZiAoc3RybmNtcCgmaW5jb21pbmdbaV0sICI8PDwiLCAzKSA9PSAwKSB7IC8qIG1heWJlIGEgbWF0Y2ggKi8KLSAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxsX2NvdW50OyBrKyspIHsgIC8qIGxvb3Agb24ga2V5d29yZCB2YWx1ZSBwYWlycyAqLwotICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKCZpbmNvbWluZ1tpICsgM10sIGxsX3B0cF92YXJzW2tdWzBdLCBzdHJsZW4obGxfcHRwX3ZhcnNba11bMF0pKSA9PSAwKSB7ICAgICAvKiBtYXRjaCBzbyBmYXIgKi8KLSAgICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKCZpbmNvbWluZ1tpICsgMyArIHN0cmxlbihsbF9wdHBfdmFyc1trXVswXSldLCAiPj4+IiwgMykgPT0gMCkgeyAgIC8qIGl0IGlzIGEgY29tcGxldGUgbWF0Y2ggISAqLwotICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KCZvdXRnb2luZ1tvXSwgbGxfcHRwX3ZhcnNba11bMV0sIHN0cmxlbihsbF9wdHBfdmFyc1trXVsxXSkpOwotICAgICAgICAgICAgICAgICAgICBpID0gaSArIDYgKyBzdHJsZW4obGxfcHRwX3ZhcnNba11bMF0pOyAgICAgIC8qIG5leHQgY2hhciBpbiBpbmNvbWluZyBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgIG8gPSBvICsgc3RybGVuKGxsX3B0cF92YXJzW2tdWzFdKTsgIC8qIG5leHQgY2hhciBpbiBvdXRnb2luZyBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTsgIC8qIHdlIG1hdGNoIG9uIHRoaXMgc3RyaW5nIGluIGluY29taW5nICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAvKiBlbmQgaWYgaXQgaXMgYSBjb21wbGV0ZSBtYXRjaCAqLwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBlbmQgaWYgbWF0Y2ggKi8KLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgLyogZW5kIGxvb3Agb24ga2V5d29yZCB2YWx1ZSBwYWlycyAqLwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYgbWF5YmUgYSBtYXRjaCAqLwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYgbGluZSBsZWZ0IGlzID49IDcgKi8KLSAgICAgICAgICBpZiAobWF0Y2ggPT0gMCkgewotICAgICAgICAgICAgb3V0Z29pbmdbbysrXSA9IGluY29taW5nW2krK107ICAgICAgLyogY29weSAxIGJ5dGUgb3ZlciB0byBuZXcgbGluZSAqLwotICAgICAgICAgIH0KLQotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgbG9vcCBvbiBpbmNvbWluZyBsaW5lICovCi0KLSAgICAgICAgaWYgKGlzX3N1YnN0aXR1dGlvbl9yZXF1aXJlZChvdXRnb2luZykgPT0gMCkgeyAgLyogaWYgdGhlcmUgYXJlIG5vdCBhbnkgPDw8WFhYWFhYWFg+Pj4gdmFyaWFibGVzICovCi0gICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRlKHN1Ym1pdF90ZW1wX2ZpbGVfZmQsIG91dGdvaW5nLCBzdHJsZW4ob3V0Z29pbmcpKTsKLSAgICAgICAgfQotICAgICAgLyogZW5kIGxvb3Agb24ga2V5d29yZCB2YWx1ZSBwYWlycyAqLwotICAgICAgICBteWVycm5vID0gZXJybm87Ci0gICAgICAgIG1lbXNldChpbmNvbWluZywgJ1wwJywgc2l6ZW9mKGluY29taW5nKSk7ICAgICAgIC8qIHplcm8gdGhlIGFyZWEgZm9yIG5leHQgdGVtcGxhdGUgcmVhZCAqLwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYgc3RpbGwgb2sgdG8gcHJvY2VzcyAqLwotICAgIGlmIChzdWJtaXRfdGVtcF9maWxlX2ZkID4gMCkgewotICAgICAgY2xvc2Uoc3VibWl0X3RlbXBfZmlsZV9mZCk7Ci0gICAgfQotICAgIGlmIChzdWJtaXRfdGVtcGxhdGVfRklMRSAhPSBOVUxMKSB7Ci0gICAgICBmY2xvc2Uoc3VibWl0X3RlbXBsYXRlX0ZJTEUpOwotICAgIH0KLQotICAgIGlmIChzdWJtaXRfZmFpbGVkID09IDApIHsgICAvKiBpZiBzdGlsbCBvayB0byBwcm9jZXNzICovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogU3VibWl0IHRoZSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICByYyA9IG15X2xsX3N1Ym1pdF9qb2IoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX3N1Yl9pZCwgc3VibWl0X3RlbXBfZmlsZSwgam9iX2Vudl92YXJzKTsKLSAgICAgIGlmIChyYyA9PSAwKSB7ICAgICAgICAgICAgLyogaWYgam9iIHN1Ym1pdCBzdWNjZXNzZnVsICovCi0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiSm9iICVzIHN1Ym1pdHRlZC5cbiIsIHN1Ym1pdF90ZW1wX2ZpbGUpOwotICAgICAgfSAvKiBlbmQgaWYgam9iIHN1Ym1pdCBzdWNjZXNzZnVsICovCi0gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGlmIGpvYiBzdWJtaXQgZXJyb3IgKi8KLSAgICAgICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiSm9iIHN1Ym1pdCBmYWlsZWQgZm9yIGpvYiAlcy5cbiIsIHN1Ym1pdF90ZW1wX2ZpbGUpOwotICAgICAgICBzdWJtaXRfZmFpbGVkID0gMTsgLyogZmxhZyBhcyBmYWlsZWQgKi8KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIGpvYiBzdWJtaXQgZXJyb3IgKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgcmVtb3ZlKHN1Ym1pdF90ZW1wX2ZpbGUpOyAvKiBkZWxldGUgdGhlIHRtcCBmaWxlICovCi0gICAgfSAgICAgICAgICAvKiBlbmQgaWYgc3RpbGwgb2sgdG8gcHJvY2VzcyAqLwotICAgIAotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAqIENsZWFudXAgYWZ0ZXIgc3VibWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGZvciAoaSA9IDA7IGkgPCBsbF9jb3VudDsgaSsrKSB7Ci0gICAgICBmcmVlKGxsX3B0cF92YXJzW2ldWzBdKTsKLSAgICAgIGxsX3B0cF92YXJzW2ldWzBdID0gTlVMTDsKLSAgICAgIGZyZWUobGxfcHRwX3ZhcnNbaV1bMV0pOwotICAgICAgbGxfcHRwX3ZhcnNbaV1bMV0gPSBOVUxMOwotICAgIH0KLSAgICBpZiAobGxfam9iX2NvbW1hbmRfZmlsZV90ZW1wbGF0ZSAhPSBOVUxMKSB7Ci0gICAgICBmcmVlKGxsX2pvYl9jb21tYW5kX2ZpbGVfdGVtcGxhdGUpOwotICAgICAgbGxfam9iX2NvbW1hbmRfZmlsZV90ZW1wbGF0ZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGxsX2pvYl9jb21tYW5kX2ZpbGUgIT0gTlVMTCkgewotICAgICAgZnJlZShsbF9qb2JfY29tbWFuZF9maWxlKTsKLSAgICAgIGxsX2pvYl9jb21tYW5kX2ZpbGUgPSBOVUxMOwotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIGJhc2ljIG1vZGUgKi8KLQotICBpZiAoc3VibWl0X2ZhaWxlZCA9PSAwKSB7Ci0gICAgc2VuZE9rRXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCk7ICAgICAvKiBjbG9zZSBvdXQgdGhlIGhhbHQgZXZlbnRzIGNvbW1hbmQgKi8KLSAgfQotICBlbHNlIHsKLQlzZW5kSm9iU3VibWlzc2lvbkVycm9yRXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX3N1Yl9pZCwgIkxvYWRMZXZlbGVyIGpvYiBzdWJtaXQgZmFpbGVkLiIpOwotICB9Ci0gIAotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogUHJveHkgY29tbWFuZCBoYW5kbGVyIC0gY29tbWFuZF9oYWx0X2V2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBjb21tYW5kX2hhbHRfZXZlbnRzKGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSkKLXsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcHJpbnRfbWVzc2FnZV9hcmdzKG5hcmdzLCBhcmdzKTsKLQotICBzZW5kT2tFdmVudChzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCk7ICAgICAgICAvKiBjbG9zZSBvdXQgdGhlIHN0YXJ0IGV2ZW50cyBjb21tYW5kIChrZXB0IG9wZW4gZm9yIGFzeW5jKSAqLwotICBzdGF0ZV9ldmVudHNfYWN0aXZlID0gMDsgICAgICAvKiBldmVudHMgYXJlIG5vdyBpbmFjdGl2ZSAqLwotICBzZW5kT2tFdmVudChndWlfdHJhbnNtaXNzaW9uX2lkKTsgICAgIC8qIGNsb3NlIG91dCB0aGUgaGFsdCBldmVudHMgY29tbWFuZCAqLwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogUHJveHkgY29tbWFuZCBoYW5kbGVyIC0gY29tbWFuZF9jYW5jZWxfam9iICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBjb21tYW5kX2NhbmNlbF9qb2IoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKQotewotICBpbnQgaTsKLSAgaW50IGpvYl9pZGVudCA9IC0xOwotICBKb2JPYmplY3QgKmpvYl9vYmplY3QgPSBOVUxMOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0gICAgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9JRF9BVFRSLCBhcmdzW2ldKSkgewotCSAgam9iX2lkZW50ID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9pbnQoYXJnc1tpXSk7Ci0gICAgfQotICB9Ci0gIGpvYl9vYmplY3QgPSBnZXRfam9iX2luX2xpc3RfZnJvbV9pZChqb2JfbGlzdCwgam9iX2lkZW50KTsKLSAgaWYgKGpvYl9vYmplY3QgIT0gTlVMTCkgewotICAgIG15X2xsX3Rlcm1pbmF0ZV9qb2IoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX29iamVjdCk7Ci0gIH0KLQotICBzZW5kT2tFdmVudChndWlfdHJhbnNtaXNzaW9uX2lkKTsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBQcm94eSBjb21tYW5kIGhhbmRsZXIgLSBjb21tYW5kX3Rlcm1pbmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGNvbW1hbmRfdGVybWluYXRlKGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSkKLXsKLSAgaW50IHJjID0gMDsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcHJpbnRfbWVzc2FnZV9hcmdzKG5hcmdzLCBhcmdzKTsKLSAgc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID0gMTsKLQotICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIldhaXRpbmcgZm9yIG1vbml0b3IgdGhyZWFkcyB0byBiZWNvbWUgaW5hY3R2ZS5cbiIpOwotICBwdGhyZWFkX211dGV4X2xvY2soJm1hc3Rlcl9sb2NrKTsKLSAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJDb250aW51aW5nIHRlcm1pbmF0aW9uIHJlcXVlc3QuXG4iKTsKLSAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJkbGNsb3NlIExvYWRMZXZlbGVyIHNoYXJlZCBsaWJyYXJ5ICVzLlxuIiwgaWJtbGxfbGlicGF0aF9uYW1lKTsKLSAgcmMgPSBkbGNsb3NlKGlibWxsX2xpYnBhdGhfaGFuZGxlKTsKLSAgaWYgKHJjICE9IDApIHsKLSAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJkbGNsb3NlIG9mICVzIGZhaWxlZCB3aXRoIHJjPSVkLlxuIiwgcmMpOwotICAgIHNlbmRFcnJvckV2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIFJURVZfRVJST1JfTExfSU5JVCwgImRsY2xvc2UgZmFpbGVkIGZvciBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSIpOwotICAgIHNlbmRTaHV0ZG93bkV2ZW50KGd1aV90cmFuc21pc3Npb25faWQpOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbWFzdGVyX2xvY2spOwotICAgIHJldHVybiBQUk9YWV9SRVNfRVJSOwotICB9IGVsc2UgewotICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiZGxjbG9zZSAlcyBzdWNjZXNzZnVsLlxuIiwgaWJtbGxfbGlicGF0aF9uYW1lKTsKLSAgICBzZW5kU2h1dGRvd25FdmVudChndWlfdHJhbnNtaXNzaW9uX2lkKTsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1hc3Rlcl9sb2NrKTsKLSAgICByZXR1cm4gUFJPWFlfUkVTX09LOwotICB9Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXN0ZXJfbG9jayk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBTZXJ2aWNlIHRocmVhZCAtIExvb3Agd2hpbGUgYWxsb3dlZCB0byBtb25pdG9yIExvYWRMZXZlbGVyIGZvciBub2RlcyAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2Rlcyh2b2lkICpqb2JfaWRlbnQpCi17Ci0gIGludCByYyA9IDA7Ci0gIGludCBpID0gMDsKLSAgY2hhciAqbm9kZV9uYW1lID0gTlVMTDsKLSAgTExfZWxlbWVudCAqbm9kZSA9IE5VTEw7Ci0gIExMX2VsZW1lbnQgKnF1ZXJ5X2VsZW0gPSBOVUxMOwotICBpbnQgbm9kZV9jb3VudCA9IDA7Ci0gIGludCBzbGVlcF9zZWNvbmRzID0gMzA7Ci0gIGludCBzbGVlcF90aW1lX3Jlc2V0ID0gMDsgICAgIC8qIGlmIGNoYW5nZXMgdGhpcyBwYXNzICovCi0gIExMX2VsZW1lbnQgKmVyck9iaiA9IE5VTEw7Ci0KLSAgTGlzdEVsZW1lbnQgKmNsdXN0ZXJfbGlzdF9lbGVtZW50ID0gTlVMTDsKLSAgQ2x1c3Rlck9iamVjdCAqY2x1c3Rlcl9vYmplY3QgPSBOVUxMOwotICBOb2RlT2JqZWN0ICpub2RlX29iamVjdCA9IE5VTEw7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICogbG9vcCBmb3JldmVyIHVudGlsIHdlIGFyZSB0b2xkIHdlIGFyZSBzaHV0dGluZyBkb3duLiAgICAgICAgICAgICAgICAgICogCi0gICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICB3aGlsZSAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDApIHsgICAgICAgLyogbG9vcCB3aGlsZSBub3Qgc2h1dHRpbmcgZG93biAqLwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbWFzdGVyX2xvY2spOwotICAgIGlmIChzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPT0gMSkgeyAgICAgICAgLyogaWYgbWFpbiB0YXNrIHN0YXJ0ZWQgc2h1dGRvd24gYW5kIHNudWNrIGluIGF0IHRoZSByaWdodCB0aW1lICovCi0gICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbWFzdGVyX2xvY2spOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotICAgIG5vZGVfbmFtZSA9IE5VTEw7Ci0gICAgbm9kZV9jb3VudCA9IDA7Ci0gICAgbm9kZSA9IE5VTEw7Ci0gICAgTExfY2x1c3Rlcl9wYXJhbSBjbHVzdGVyX3Bhcm07Ci0gICAgY2hhciAqcmVtb3RlX2NsdXN0ZXJbMl07Ci0gICAgSGFzaCAqbm9kZV9oYXNoID0gTlVMTDsKLSAgICBIYXNoRW50cnkgKmhhc2hfZWxlbWVudCA9IE5VTEw7Ci0gICAgTGlzdCAqbm9kZV9saXN0ID0gTlVMTDsKLSAgICBMaXN0RWxlbWVudCAqbm9kZV9saXN0X2VsZW1lbnQgPSBOVUxMOwotICAgIHNsZWVwX3RpbWVfcmVzZXQgPSAwOyAgICAgICAvKiBwcmVzZXQgZm9yIHRoaXMgbG9vcCB0aGF0IG5vIGNoYW5nZXMgd2VyZSBkZXRlY3RlZCAqLwotCi0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIHRocmVhZCBydW5uaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgaWYgKGNsdXN0ZXJfbGlzdCA9PSBOVUxMKSB7Ci0gICAgICByZWZyZXNoX2NsdXN0ZXJfbGlzdCgpOyAgIC8qIGluc3VyZSB3ZSBoYXZlIGxhdGVzdCBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZnJvbSBMb2FkTGV2ZWxlciAqLwotICAgIH0KLQotICAgIGlmIChjbHVzdGVyX2xpc3QgIT0gTlVMTCkgeyAvKiBpZiB3ZSBoYXZlIGNsdXN0ZXJzLCBub2RlcywgZXRjLiAqLwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAqIGxvb3Agb24gdGhlIGNsdXN0ZXIgbGlzdCB3ZSBvYnRhaW5lZCBlYXJsaWVyIGZyb20gTG9hZExldmVsZXIuICAgICAgICAqIAotICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBjbHVzdGVyX2xpc3RfZWxlbWVudCA9IGNsdXN0ZXJfbGlzdC0+bF9oZWFkOwotICAgICAgd2hpbGUgKGNsdXN0ZXJfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsgICAgLyogd2hpbGUgd2UgaGF2ZSBhIGNsdXN0ZXIgdG8gcXVlcnkgKi8KLSAgICAgICAgY2x1c3Rlcl9vYmplY3QgPSBjbHVzdGVyX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsgLyogZ2V0IG91ciBjbHVzdGVyIG9iamVjdCBmcm9tIHRoaXMgbGlzdCBlbGVtZW50ICovCi0gICAgICAgIGNsdXN0ZXJfbGlzdF9lbGVtZW50ID0gY2x1c3Rlcl9saXN0X2VsZW1lbnQtPmxfbmV4dDsgICAgLyogcHJlcGFyZSBmb3IgbmV4dCBwYXNzICovCi0gICAgICAgIGlmIChjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoLT5jb3VudCA8PSAwKSB7ICAgIC8qIGlmIG5vIG5vZGVzIGluIHRoaXMgY2x1c3RlciAqLwotICAgICAgICAgIHNsZWVwX3RpbWVfcmVzZXQgPSAxOyAvKiB3ZSBuZWVkIHRvIGtlZXAgbG9va2luZyBmb3Igbm9kZXMsIGV0YyBvbiBzaG9ydCBpbnRlcnZhbCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG11bHRpY2x1c3Rlcl9zdGF0dXMgPT0gMSkgeyAvKiBpZiBydW5uaW5nIG11bHRpY2x1c3RlciAqLwotCi0gICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICAqIHdlIGFyZSBydW5uaW5nIG11bHRpY2x1c3RlciAtIHNldCBjbHVzdGVyIG5hbWUgaW50byBlbnZpcm9ubWVudCAgICAgICAqIAotICAgICAgICAgICogdG8gaW5mbHVlbmNlIHdoZXJlIExvYWRMZXZlbGVyIHNlYXJjaGVzIGZvciBkYXRhICh3aGF0IGNsdXN0ZXIpICAgICAgICogCi0gICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICByZW1vdGVfY2x1c3RlclswXSA9IGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWU7Ci0gICAgICAgICAgcmVtb3RlX2NsdXN0ZXJbMV0gPSBOVUxMOwotICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2V0dGluZyBhY2Nlc3MgZm9yIExvYWRMZXZlbGVyIGNsdXN0ZXI9JXMuXG4iLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICBjbHVzdGVyX3Bhcm0uYWN0aW9uID0gQ0xVU1RFUl9TRVQ7ICAgIC8qIHdlIGFyZSBzZXR0aW5nIHRoZSBjbHVzdGVyIGZvciByZW1vdGUgYWNjZXNzICovCi0gICAgICAgICAgY2x1c3Rlcl9wYXJtLmNsdXN0ZXJfbGlzdCA9IHJlbW90ZV9jbHVzdGVyOyAgIC8qIGNsdXN0ZXIgbmFtZSB3ZSB3YW50IGRhdGEgZnJvbSAqLwotICAgICAgICAgIHJjID0gbXlfbGxfY2x1c3RlcihMTF9BUElfVkVSU0lPTiwgJmVyck9iaiwgJmNsdXN0ZXJfcGFybSk7ICAgLyogc2V0IHRoZSBjbHVzdGVyIG5hbWUgKi8KLSAgICAgICAgfSAvKiBlbmQgaWYgdGhpcyBpcyBub3QgYSBsb2NhbCBjbHVzdGVyICovCi0gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgYSBsb2NhbCBjbHVzdGVyICovCi0KLSAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICogbm90IHJ1bm5pbmcgbXVsdGljbHVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNldHRpbmcgYWNjZXNzIGZvciBMb2FkTGV2ZWxlciBsb2NhbCBjbHVzdGVyIChzaW5nbGUgY2x1c3RlcikuXG4iKTsKLSAgICAgICAgICBjbHVzdGVyX3Bhcm0uYWN0aW9uID0gQ0xVU1RFUl9VTlNFVDsgIC8qIHdlIGFyZSB1bnNldHRpbmcgdGhlIGNsdXN0ZXIgKi8KLSAgICAgICAgICBjbHVzdGVyX3Bhcm0uY2x1c3Rlcl9saXN0ID0gTlVMTDsKLSAgICAgICAgICByYyA9IG15X2xsX2NsdXN0ZXIoTExfQVBJX1ZFUlNJT04sICZlcnJPYmosICZjbHVzdGVyX3Bhcm0pOyAgIC8qIHVuc2V0IHRoZSBjbHVzdGVyIG5hbWUgLSBiYWNrIHRvIGxvY2FsICovCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiB0aGlzIGlzIGEgbG9jYWwgY2x1c3RlciAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgKiBidWlsZCBhIExvYWRMZXZlbGVyIHF1ZXJ5IG9iamVjdCAoZm9yIG5vZGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHF1ZXJ5X2VsZW0gPSBteV9sbF9xdWVyeShNQUNISU5FUyk7Ci0gICAgICAgIGlmIChxdWVyeV9lbGVtID09IE5VTEwpIHsKLSAgICAgICAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJVbmFibGUgdG8gb2J0YWluIHF1ZXJ5IGVsZW1lbnQuIExvYWRMZXZlbGVyIG1heSBub3QgYmUgYWN0aXZlIG9yIGlzIG5vdCByZXNwb25kaW5nLlxuIik7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICogc2V0IHRoZSByZXF1ZXN0IHR5cGUgZm9yIExvYWRMZXZlbGVyICh3ZSB3YW50IG5vZGVzKSAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNhbGwgTG9hZExldmVsZXIgKGxsX3NldF9yZXF1ZXN0KSBmb3Igbm9kZXMgaW4gY2x1c3Rlcj0lcy5cbiIsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICByYyA9IG15X2xsX3NldF9yZXF1ZXN0KHF1ZXJ5X2VsZW0sIFFVRVJZX0FMTCwgTlVMTCwgQUxMX0RBVEEpOwotICAgICAgICBpZiAocmMgIT0gMCkgewotICAgICAgICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLSAgICAgICAgICBxdWVyeV9lbGVtID0gTlVMTDsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgKiBnZXQgbm9kZXMgZnJvbSBMb2FkTGV2ZWxlciBmb3IgY3VycmVudCBvciBsb2NhbCBjbHVzdGVyLiAgICAgICAgICAgICAgKiAKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2FsbCBMb2FkTGV2ZWxlciAobGxfZ2V0X29ianMpIGZvciBub2RlcyBpbiBjbHVzdGVyPSVzLlxuIiwgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgIG5vZGUgPSBteV9sbF9nZXRfb2JqcyhxdWVyeV9lbGVtLCBMTF9DTSwgTlVMTCwgJm5vZGVfY291bnQsICZyYyk7Ci0gICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJOdW1iZXIgb2YgTG9hZExldmVsZXIgTm9kZXM9JWQgaW4gY2x1c3Rlcj0lcy5cbiIsIG5vZGVfY291bnQsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgKiBsb29wIG9uIHRoZSBub2RlcyByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7ICAvKiBub2RlIHBvaW50cyB0byB0aGUgZmlyc3Qgb3IgbmV4dCBub2RlIGluIHRoZSBsaXN0IGZyb20gTG9hZExldmVsZXIgKi8KLSAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkxvYWRMZXZlbGVyIE5vZGUgJWQ6XG4iLCBpKTsKLSAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKG5vZGUsIExMX01hY2hpbmVOYW1lLCAmbm9kZV9uYW1lKTsKLSAgICAgICAgICBpZiAocmMgPT0gMCkgeyAvKiBkbyBzb21ldGhpbmcgaGVyZSB3aXRoIHRoZSBub2RlIG9iamVjdCAqLwotICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJOb2RlIG5hbWU9JXNcbiIsIG5vZGVfbmFtZSk7Ci0gICAgICAgICAgICBpZiAoKG5vZGVfb2JqZWN0ID0gZ2V0X25vZGVfaW5faGFzaChjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoLCBub2RlX25hbWUpKSAhPSBOVUxMKSB7ICAgICAgIC8qIGV4aXN0aW5nIG5vZGUgKi8KLSAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICAgICAgICAgICAqIG5vZGUgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgd2FzIGZvdW5kIGluIG91ciBwdHAgbm9kZSBsaXN0LiAgICAgICAgICAqIAotICAgICAgICAgICAgICAgKiBmbGFnIGl0IGFzIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgICAgICAgIG5vZGVfb2JqZWN0LT5ub2RlX2ZvdW5kID0gMTsgICAgICAvKiBmbGFnIGl0IGFzIGZvdW5kICovCi0gICAgICAgICAgICAgIGlmIChub2RlX29iamVjdC0+bm9kZV9zdGF0ZSAhPSBNWV9TVEFURV9VUCkgewotICAgICAgICAgICAgICAgIG5vZGVfb2JqZWN0LT5ub2RlX3N0YXRlID0gTVlfU1RBVEVfVVA7Ci0gICAgICAgICAgICAgICAgc2xlZXBfdGltZV9yZXNldCA9IDE7ICAgLyogd2UgaGF2ZSBhIGNoYW5nZSB0aGlzIHBhc3MgKi8KLSAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogbm9kZT0lcyBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgbm9kZV9uYW1lLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICAgICAgICBzZW5kTm9kZUNoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCwgbm9kZV9vYmplY3QpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8qIG5ldyBub2RlIChub3QgeWV0IGluIGxpc3QpICovCi0gICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICAgICAgKiBub2RlIHJldHVybmVkIGJ5IExvYWRMZXZlbGVyIHdhcyBub3QgZm91bmQgaW4gb3VyIHB0cCBub2RlIGxpc3QgICAgICAgKiAKLSAgICAgICAgICAgICAgICogYWRkIGl0IGFuZCBnZW5lcmF0ZSBhbiBldmVudCB0byB0aGUgZ3VpLiBmbGFnIGl0IGFzIGFkZGVkLiAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICBub2RlX29iamVjdCA9IChOb2RlT2JqZWN0ICopIG1hbGxvYyhzaXplb2YoTm9kZU9iamVjdCkpOwotICAgICAgICAgICAgICBtYWxsb2NfY2hlY2sobm9kZV9vYmplY3QsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgICAgICAgICAgICBtZW1zZXQobm9kZV9vYmplY3QsICdcMCcsIHNpemVvZihub2RlX29iamVjdCkpOyAgIC8qIHplcm8gdGhlIG1hbGxvYyBhcmVhICovCi0gICAgICAgICAgICAgIG5vZGVfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfbm9kZV9pZCA9IGdlbmVyYXRlX2lkKCk7ICAgICAvKiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsdXN0ZXIgKi8KLSAgICAgICAgICAgICAgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSA9IHN0cmR1cChub2RlX25hbWUpOwotICAgICAgICAgICAgICBub2RlX29iamVjdC0+bm9kZV9mb3VuZCA9IDI7ICAgICAgLyogZmxhZyBpdCBhcyBhZGRlZCAqLwotICAgICAgICAgICAgICBub2RlX29iamVjdC0+bm9kZV9zdGF0ZSA9IE1ZX1NUQVRFX1VQOwotICAgICAgICAgICAgICBzbGVlcF90aW1lX3Jlc2V0ID0gMTsgICAgIC8qIHdlIGhhdmUgYSBjaGFuZ2UgdGhpcyBwYXNzICovCi0gICAgICAgICAgICAgIGFkZF9ub2RlX3RvX2hhc2goY2x1c3Rlcl9vYmplY3QtPm5vZGVfaGFzaCwgKHZvaWQgKikgbm9kZV9vYmplY3QpOyAgICAgICAgLyogYWRkIHRoZSBuZXcgbm9kZSBvYmplY3QgdG8gdGhlIGhhc2ggKi8KLSAgICAgICAgICAgICAgc2xlZXBfdGltZV9yZXNldCA9IDE7ICAgICAvKiB3ZSBoYXZlIGEgY2hhbmdlIHRoaXMgcGFzcyAqLwotICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogbm9kZT0lcyBhZGRlZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsIG5vZGVfbmFtZSwgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgIHNlbmROb2RlQWRkRXZlbnQoc3RhcnRfZXZlbnRzX2d1aV90cmFuc21pc3Npb25faWQsIGNsdXN0ZXJfb2JqZWN0LCBub2RlX29iamVjdCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiBuZXcgbm9kZSAqLwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAvKiB3ZSBnb3QgYSBub2RlIG5hbWUgb2sgKi8KLQotICAgICAgICAgIGkrKzsKLSAgICAgICAgICBub2RlID0gbXlfbGxfbmV4dF9vYmoocXVlcnlfZWxlbSk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB3aGlsZSB3ZSBoYXZlIGEgbm9kZSAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgKiBsb29wIG9uIHRoZSBwdHAgbm9kZSBsaXN0IHRvIHNlZSBpZiBhbnkgbm9kZXMgd2VyZSBub3QgcmV0dXJuZWQgICAgICAgKiAKLSAgICAgICAgICogYnkgTG9hZExldmVsZXIgb24gdGhpcyBwYXNzIChtYXliZSB0aGV5IHdlbnQgZG93bikuICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAqIGdlbmVyYXRlIGFuIGV2ZW50IChjaGFuZ2VkL2dvbmUpIHRvIHRoZSBndWkuICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgbm9kZV9oYXNoID0gY2x1c3Rlcl9vYmplY3QtPm5vZGVfaGFzaDsgIC8qIHBpY2sgdXAgdGhlIG5vZGUgaGFzaCAqLwotICAgICAgICBpZiAobm9kZV9oYXNoICE9IE5VTEwpIHsgICAgICAgIC8qIGlmIHdlIGhhdmUgYSBub2RlIGhhc2ggdGFibGUgb2sgKi8KLSAgICAgICAgICBIYXNoU2V0KG5vZGVfaGFzaCk7ICAgLyogcG9zaXRpb24gdG8gYmVnaW5uaW5nIG9mIHRoZSBoYXNoIHRhYmxlICovCi0gICAgICAgICAgaGFzaF9lbGVtZW50ID0gSGFzaEdldChub2RlX2hhc2gpOyAgICAvKiBnZXQgbmV4dCBoYXNoIHRhYmxlIGVudHJ5ICovCi0gICAgICAgICAgd2hpbGUgKGhhc2hfZWxlbWVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlX2xpc3QgPSAoTGlzdCAqKSBoYXNoX2VsZW1lbnQtPmhfZGF0YTsgIC8qIHRoZSBoYXNoIGVudHJ5IGlzIGEgbGlzdCBvZiBub2RlIG9iamVjdHMgKi8KLSAgICAgICAgICAgIGhhc2hfZWxlbWVudCA9IEhhc2hHZXQobm9kZV9oYXNoKTsgIC8qIGdldCBuZXh0IGhhc2ggdGFibGUgZW50cnkgKi8KLSAgICAgICAgICAgIG5vZGVfbGlzdF9lbGVtZW50ID0gbm9kZV9saXN0LT5sX2hlYWQ7ICAgICAgLyogZmlyc3QgaW4gbGlzdCAqLwotICAgICAgICAgICAgd2hpbGUgKG5vZGVfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsgLyogd2hpbGUgd2UgaGF2ZSBhIG5vZGUgdG8gcXVlcnkgKi8KLSAgICAgICAgICAgICAgbm9kZV9vYmplY3QgPSBub2RlX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsgLyogZ2V0IG91ciBub2RlIG9iamVjdCBmcm9tIHRoaXMgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgIG5vZGVfbGlzdF9lbGVtZW50ID0gbm9kZV9saXN0X2VsZW1lbnQtPmxfbmV4dDsgICAgLyogcHJlcGFyZSBmb3IgbmV4dCBwYXNzICovCi0gICAgICAgICAgICAgIGlmIChub2RlX29iamVjdC0+bm9kZV9mb3VuZCA9PSAwKSB7ICAgICAgIC8qIGlmIG5vdCBmb3VuZCAtIG5vZGUgd2VudCBhd2F5ICovCi0gICAgICAgICAgICAgICAgaWYgKG5vZGVfb2JqZWN0LT5ub2RlX3N0YXRlICE9IE1ZX1NUQVRFX1VOS05PV04pIHsKLSAgICAgICAgICAgICAgICAgIG5vZGVfb2JqZWN0LT5ub2RlX3N0YXRlID0gTVlfU1RBVEVfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBub2RlPSVzIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBub2RlX25hbWUsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgICAgICAgc2VuZE5vZGVDaGFuZ2VFdmVudChzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCwgY2x1c3Rlcl9vYmplY3QsIG5vZGVfb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgIHNsZWVwX3RpbWVfcmVzZXQgPSAxOyAvKiB3ZSBoYXZlIGEgY2hhbmdlIHRoaXMgcGFzcyAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgLyogbm9kZSB3YXMgZm91bmQgb3IgYWRkZWQgdGhpcyBwYXNzICovCi0gICAgICAgICAgICAgICAgbm9kZV9vYmplY3QtPm5vZGVfZm91bmQgPSAwOyAgICAvKiByZXNldCBmb3IgbmV4dCBwYXNzICovCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kIHdoaWxlIHdlIGhhdmUgbm9kZSBsaXN0IGVsZW1lbnQgdG8gbG9vayBhdCAqLwotCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB3aGlsZSB3ZSBzdGlsbCBoYXZlIGhhc2ggdGFibGUgZW50cnkgKi8KLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIHdlIGhhdmUgYSBub2RlIGhhc2ggdGFibGUgb2sgKi8KLSAgICAgICAgaWYgKHF1ZXJ5X2VsZW0gIT0gTlVMTCkgewotICAgICAgICAgIHJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLSAgICAgICAgICBxdWVyeV9lbGVtID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB3aGlsZSB3ZSBoYXZlIGEgY2x1c3RlciB0byBxdWVyeSAqLwotICAgIH0gLyogZW5kIGlmIHdlIGhhdmUgY2x1c3RlciBsaXN0LCBub2RlcywgZXRjLiAqLwotICAgIGVsc2UgewotICAgICAgc2xlZXBfdGltZV9yZXNldCA9IDE7ICAgICAvKiB3ZSBuZWVkIHRvIGtlZXAgbG9va2luZyBmb3Igbm9kZXMsIGV0YyAqLwotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXN0ZXJfbG9jayk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgKiBhZGp1c3Qgc2xlZXAgaW50ZXJ2YWwgYmFzZWQgb24gY2hhbmdlcyB0aGlzIHBhc3MuICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAoc2xlZXBfdGltZV9yZXNldCA9PSAxKSB7ICAgICAgICAvKiB5ZXMgLSB0aGVyZSB3YXMgYWN0aXZpdHkgKi8KLSAgICAgIHNsZWVwX3NlY29uZHMgPSBtaW5fbm9kZV9zbGVlcF9zZWNvbmRzOyAgIC8qIHNldCB0byBtaW4gc2xlZXAgaW50ZXJ2YWwgKi8KLSAgICB9IC8qIGVuZCBpZiBhY3Rpdml0eSB0aGlzIHBhc3MgKi8KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogaWYgbm8gYWN0aXZpdHkgdGhpcyBwYXNzICovCi0gICAgICBzbGVlcF9zZWNvbmRzID0gc2xlZXBfc2Vjb25kcyArIG1pbl9ub2RlX3NsZWVwX3NlY29uZHM7Ci0gICAgICBpZiAoc2xlZXBfc2Vjb25kcyA+IG1heF9ub2RlX3NsZWVwX3NlY29uZHMpIHsgICAgIC8qIGlmIG1heCBleGNlZWRlZCAqLwotICAgICAgICBzbGVlcF9zZWNvbmRzID0gbWF4X25vZGVfc2xlZXBfc2Vjb25kczsgLyogcmVzZXQgdG8gbWF4IHNsZWVwIGludGVydmFsICovCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiBtYXggZXhjZWVkZWQgKi8KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIG5vIGFjdGl2aXR5IHRoaXMgcGFzcyAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogc2xlZXAgYW5kIGxvb3AgYWdhaW4gb24gdGhlIExvYWRMZXZlbGVyIG1hY2hpbmVzLiAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaWYgKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSB7Ci0gICAgICBpbnQgc2xlZXBfaW50ZXJ2YWwgPSAwOwotICAgICAgaW50IG1pbmlfc2xlZXBfaW50ZXJ2YWwgPSAoc2xlZXBfc2Vjb25kcyArIDQpIC8gNTsKLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiJXMgU2xlZXBpbmcgZm9yICglZCBzZWNvbmRzKSAlZCBpbnRlcnZhbHMgb2YgNSBzZWNvbmRzXG4iLCBfX0ZVTkNUSU9OX18sIG1pbmlfc2xlZXBfaW50ZXJ2YWwgKiA1LCBtaW5pX3NsZWVwX2ludGVydmFsKTsKLSAgICAgIGZvciAoc2xlZXBfaW50ZXJ2YWwgPSAwOyBzbGVlcF9pbnRlcnZhbCA8IG1pbmlfc2xlZXBfaW50ZXJ2YWw7IHNsZWVwX2ludGVydmFsKyspIHsKLSAgICAgICAgaWYgKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSB7Ci0gICAgICAgICAgc2xlZXAoNSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHdoaWxlIHdlIGFyZSBub3Qgc2h1dHRpbmcgZG93biAqLwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogU2VydmljZSB0aHJlYWQgLSBMb29wIHdoaWxlIGFsbG93ZWQgdG8gbW9uaXRvciBMb2FkTGV2ZWxlciBmb3Igam9icyAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKm1vbml0b3JfTG9hZExldmVsZXJfam9icyh2b2lkICpqb2JfaWRlbnQpCi17Ci0gIGludCByYyA9IDA7Ci0gIGludCBpID0gMDsKLSAgY2hhciAqam9iX25hbWUgPSBOVUxMOwotICBjaGFyICpqb2Jfc3VibWl0X2hvc3QgPSBOVUxMOwotICBjaGFyICpzdGVwX0lEID0gTlVMTDsKLSAgTExfU1RFUF9JRCBsbF9zdGVwX2lkOwotICBpbnQgc3RlcF9tYWNoaW5lX2NvdW50ID0gMDsKLSAgTExfZWxlbWVudCAqam9iID0gTlVMTDsKLSAgTExfZWxlbWVudCAqc3RlcCA9IE5VTEw7Ci0gIExMX2VsZW1lbnQgKnF1ZXJ5X2VsZW0gPSBOVUxMOwotICBMTF9lbGVtZW50ICpub2RlID0gTlVMTDsKLSAgTExfZWxlbWVudCAqdGFzayA9IE5VTEw7Ci0gIExMX2VsZW1lbnQgKnRhc2tfaW5zdGFuY2UgPSBOVUxMOwotICBpbnQgam9iX2NvdW50ID0gMDsKLSAgTExfZWxlbWVudCAqZXJyT2JqID0gTlVMTDsKLSAgTExfY2x1c3Rlcl9wYXJhbSBjbHVzdGVyX3Bhcm07Ci0gIGNoYXIgKnJlbW90ZV9jbHVzdGVyWzJdOwotICBMaXN0RWxlbWVudCAqam9iX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0gIExpc3QgKnRhc2tfbGlzdCA9IE5VTEw7Ci0gIExpc3RFbGVtZW50ICp0YXNrX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0gIGNoYXIgKnRhc2tfaW5zdGFuY2VfbWFjaGluZV9uYW1lID0gTlVMTDsKLSAgY2hhciAqdGFza19pbnN0YW5jZV9tYWNoaW5lX2FkZHJlc3MgPSBOVUxMOwotICBpbnQgdGFza19pbnN0YW5jZV90YXNrX0lEID0gMDsKLSAgaW50IHN0ZXBfbm9kZV9jb3VudCA9IDA7Ci0gIGludCBub2RlX3Rhc2tfY291bnQgPSAwOwotICBpbnQgdGFza19pbnN0YW5jZV9jb3VudCA9IDA7Ci0gIHRpbWVfdCBteV9jbG9jazsKLQotICBMaXN0RWxlbWVudCAqY2x1c3Rlcl9saXN0X2VsZW1lbnQgPSBOVUxMOwotICBDbHVzdGVyT2JqZWN0ICpjbHVzdGVyX29iamVjdCA9IE5VTEw7Ci0gIEpvYk9iamVjdCAqam9iX29iamVjdCA9IE5VTEw7Ci0gIFRhc2tPYmplY3QgKnRhc2tfb2JqZWN0ID0gTlVMTDsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgKiBsb29wIGZvcmV2ZXIgdW50aWwgd2UgYXJlIHRvbGQgd2UgYXJlIHNodXR0aW5nIGRvd24uICAgICAgICAgICAgICAgICAgKiAKLSAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIHdoaWxlIChzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPT0gMCkgeyAgICAgICAvKiBsb29wIHdoaWxlIG5vdCBzaHV0dGluZyBkb3duICovCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtYXN0ZXJfbG9jayk7Ci0gICAgaWYgKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAxKSB7ICAgICAgICAvKiBpZiBtYWluIHRhc2sgc3RhcnRlZCBzaHV0ZG93biBhbmQgc251Y2sgaW4gYXQgdGhlIHJpZ2h0IHRpbWUgKi8KLSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXN0ZXJfbG9jayk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgam9iX25hbWUgPSBOVUxMOwotICAgIHN0ZXBfSUQgPSBOVUxMOwotICAgIGpvYl9jb3VudCA9IDA7Ci0gICAgc3RlcF9tYWNoaW5lX2NvdW50ID0gMDsKLSAgICBqb2IgPSBOVUxMOwotICAgIGNoYXIgKnBDaGFyID0gTlVMTDsKLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyB0aHJlYWQgcnVubmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCi0gICAgaWYgKGNsdXN0ZXJfbGlzdCAhPSBOVUxMKSB7IC8qIGlmIHdlIGhhdmUgY2x1c3RlcnMsIG5vZGVzLCBldGMuIGZyb20gbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2RlcyB0aHJlYWQgKi8KLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICAgKiBsb29wIG9uIHRoZSBjbHVzdGVyIGxpc3Qgd2Ugb2J0YWluZWQgZWFybGllciBmcm9tIExvYWRMZXZlbGVyLiAgICAgICAgKiAKLSAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgY2x1c3Rlcl9saXN0X2VsZW1lbnQgPSBjbHVzdGVyX2xpc3QtPmxfaGVhZDsKLSAgICAgIHdoaWxlIChjbHVzdGVyX2xpc3RfZWxlbWVudCAhPSBOVUxMKSB7ICAgIC8qIHdoaWxlIHdlIGhhdmUgYSBjbHVzdGVyIHRvIHF1ZXJ5ICovCi0gICAgICAgIGNsdXN0ZXJfb2JqZWN0ID0gY2x1c3Rlcl9saXN0X2VsZW1lbnQtPmxfdmFsdWU7IC8qIGdldCBvdXIgY2x1c3RlciBvYmplY3QgZnJvbSB0aGlzIGxpc3QgZWxlbWVudCAqLwotICAgICAgICBjbHVzdGVyX2xpc3RfZWxlbWVudCA9IGNsdXN0ZXJfbGlzdF9lbGVtZW50LT5sX25leHQ7ICAgIC8qIHByZXBhcmUgZm9yIG5leHQgcGFzcyAqLwotCi0gICAgICAgIGlmIChjbHVzdGVyX29iamVjdCAhPSBOVUxMKSB7ICAgLyogaWYgd2UgaGF2ZSBhIGNsdXN0ZXIgb2JqZWN0ICovCi0gICAgICAgICAgaWYgKGNsdXN0ZXJfb2JqZWN0LT5ub2RlX2hhc2ggIT0gTlVMTCkgeyAgICAgIC8qIGlmIHdlIGhhdmUgYSBub2RlIGhhcyB0YWJsZSB0byBsb29rIGF0ICovCi0gICAgICAgICAgICBpZiAoY2x1c3Rlcl9vYmplY3QtPm5vZGVfaGFzaC0+Y291bnQgPiAwKSB7IC8qIGlmIHdlIGhhdmUgbm9kZXMgaW4gdGhpcyBjbHVzdGVyICovCi0KLSAgICAgICAgICAgICAgaWYgKG11bHRpY2x1c3Rlcl9zdGF0dXMgPT0gMSkgeyAgIC8qIGlmIHJ1bm5pbmcgbXVsdGljbHVzdGVyICovCi0KLSAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICogd2UgYXJlIHJ1bm5pbmcgbXVsdGljbHVzdGVyIC0gc2V0IGNsdXN0ZXIgbmFtZSBpbnRvIGVudmlyb25tZW50ICAgICAgICogCi0gICAgICAgICAgKiB0byBpbmZsdWVuY2Ugd2hlcmUgTG9hZExldmVsZXIgc2VhcmNoZXMgZm9yIGRhdGEgKHdoYXQgY2x1c3RlcikgICAgICAgKiAKLSAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgIHJlbW90ZV9jbHVzdGVyWzBdID0gY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZTsKLSAgICAgICAgICAgICAgICByZW1vdGVfY2x1c3RlclsxXSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTZXR0aW5nIGFjY2VzcyBmb3IgTG9hZExldmVsZXIgY2x1c3Rlcj0lcy5cbiIsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgICAgIGNsdXN0ZXJfcGFybS5hY3Rpb24gPSBDTFVTVEVSX1NFVDsgICAgICAvKiB3ZSBhcmUgc2V0dGluZyB0aGUgY2x1c3RlciBmb3IgcmVtb3RlIGFjY2VzcyAqLwotICAgICAgICAgICAgICAgIGNsdXN0ZXJfcGFybS5jbHVzdGVyX2xpc3QgPSByZW1vdGVfY2x1c3RlcjsgICAgIC8qIGNsdXN0ZXIgbmFtZSB3ZSB3YW50IGRhdGEgZnJvbSAqLwotICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfY2x1c3RlcihMTF9BUElfVkVSU0lPTiwgJmVyck9iaiwgJmNsdXN0ZXJfcGFybSk7ICAgICAvKiBzZXQgdGhlIGNsdXN0ZXIgbmFtZSAqLwotICAgICAgICAgICAgICB9IC8qIGVuZCBpZiB0aGlzIGlzIG5vdCBhIGxvY2FsIGNsdXN0ZXIgKi8KLSAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgLyogdGhpcyBpcyBhIGxvY2FsIGNsdXN0ZXIgKi8KLQotICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICAgICAgKiBub3QgcnVubmluZyBtdWx0aWNsdXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2V0dGluZyBhY2Nlc3MgZm9yIExvYWRMZXZlbGVyIGxvY2FsIGNsdXN0ZXIgKHNpbmdsZSBjbHVzdGVyKS5cbiIpOwotICAgICAgICAgICAgICAgIGNsdXN0ZXJfcGFybS5hY3Rpb24gPSBDTFVTVEVSX1VOU0VUOyAgICAvKiB3ZSBhcmUgdW5zZXR0aW5nIHRoZSBjbHVzdGVyICovCi0gICAgICAgICAgICAgICAgY2x1c3Rlcl9wYXJtLmNsdXN0ZXJfbGlzdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmMgPSBteV9sbF9jbHVzdGVyKExMX0FQSV9WRVJTSU9OLCAmZXJyT2JqLCAmY2x1c3Rlcl9wYXJtKTsgICAgIC8qIHVuc2V0IHRoZSBjbHVzdGVyIG5hbWUgLSBiYWNrIHRvIGxvY2FsICovCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgIC8qIGVuZCBpZiB0aGlzIGlzIGEgbG9jYWwgY2x1c3RlciAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgKiBidWlsZCBhIExvYWRMZXZlbGVyIHF1ZXJ5IG9iamVjdCAoZm9yIGpvYnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgICAgICAgIHF1ZXJ5X2VsZW0gPSBteV9sbF9xdWVyeShKT0JTKTsKLSAgICAgICAgICAgICAgaWYgKHF1ZXJ5X2VsZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIlVuYWJsZSB0byBvYnRhaW4gcXVlcnkgZWxlbWVudC4gTG9hZExldmVsZXIgbWF5IG5vdCBiZSBhY3RpdmUgb3IgaXMgbm90IHJlc3BvbmRpbmcuXG4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgKiBzZXQgdGhlIHJlcXVlc3QgdHlwZSBmb3IgTG9hZExldmVsZXIgKHdlIHdhbnQgbm9kZXMpICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2FsbCBMb2FkTGV2ZWxlciAobGxfc2V0X3JlcXVlc3QpIGZvciBqb2JzIGluIGNsdXN0ZXI9JXMuXG4iLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICAgICAgcmMgPSBteV9sbF9zZXRfcmVxdWVzdChxdWVyeV9lbGVtLCBRVUVSWV9BTEwsIE5VTEwsIEFMTF9EQVRBKTsKLSAgICAgICAgICAgICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgICAgICAgICByYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0gICAgICAgICAgICAgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICogZ2V0IGpvYnMgZnJvbSBMb2FkTGV2ZWxlciBmb3IgY3VycmVudCBvciBsb2NhbCBjbHVzdGVyLiAgICAgICAgICAgICAgICogCi0gICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNhbGwgTG9hZExldmVsZXIgKGxsX2dldF9vYmpzKSBmb3Igam9icyBpbiBjbHVzdGVyPSVzLlxuIiwgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgIGpvYl9jb3VudCA9IDA7ICAgIC8qIHByZXNldCB0byBubyBqb2JzIGZvdW5kIGluIGNsdXN0ZXIgKi8KLSAgICAgICAgICAgICAgam9iID0gbXlfbGxfZ2V0X29ianMocXVlcnlfZWxlbSwgTExfQ00sIE5VTEwsICZqb2JfY291bnQsICZyYyk7Ci0gICAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgICAgICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJOdW1iZXIgb2YgTG9hZExldmVsZXIgSm9icz0lZCBpbiBjbHVzdGVyPSVzLlxuIiwgam9iX2NvdW50LCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICogbG9vcCBvbiB0aGUgam9icyByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgd2hpbGUgKGpvYiAhPSBOVUxMKSB7ICAgICAvKiBqb2IgcG9pbnRzIHRvIHRoZSBmaXJzdCBvciBuZXh0IGpvYiBpbiB0aGUgbGlzdCBmcm9tIExvYWRMZXZlbGVyICovCi0gICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJMb2FkTGV2ZWxlciBKb2IgJWQ6XG4iLCBpKTsKLSAgICAgICAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKGpvYiwgTExfSm9iU3VibWl0SG9zdCwgJmpvYl9zdWJtaXRfaG9zdCk7Ci0gICAgICAgICAgICAgICAgcmMgPSBteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYk5hbWUsICZqb2JfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID09IDApIHsgLyogZG8gc29tZXRoaW5nIGhlcmUgd2l0aCB0aGUgam9iIG9iamVjdCAqLwotICAgICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJKb2IgbmFtZT0lc1xuIiwgam9iX25hbWUpOwotICAgICAgICAgICAgICAgICAgcmMgPSBteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYkdldEZpcnN0U3RlcCwgJnN0ZXApOyAgLyogZ2V0IGEgam9iIHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGVwICE9IE5VTEwpIHsgICAgICAgIC8qIHdoaWxlIHdlIGhhdmUgYSBzdGVwICovCi0gICAgICAgICAgICAgICAgICAgIHN0ZXBfbWFjaGluZV9jb3VudCA9IDA7ICAgICAvKiBwcmUgYXNzdW1lIGpvYiBub3QgcnVubmluZyAqLwotICAgICAgICAgICAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKHN0ZXAsIExMX1N0ZXBJRCwgJnN0ZXBfSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgeyAgICAvKiBkbyBzb21ldGhpbmcgaGVyZSB3aXRoIHRoZSBzdGVwIG9iamVjdCAqLwotICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICAgICAgICAgICAgKiBicmVhayB0aGUgam9iIHN0ZXAgbmFtZSBhcGFydCBpbnRvIGEgTG9hZExldmVsZXIgTExfU1RFUF9JRCAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgICAgICAgIGxsX3N0ZXBfaWQuZnJvbV9ob3N0ID0gc3RyZHVwKGpvYl9zdWJtaXRfaG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgcENoYXIgPSBzdGVwX0lEICsgc3RybGVuKGpvYl9zdWJtaXRfaG9zdCkgKyAxOyAgICAvKiBUaGUgbmV4dCBzZWdtZW50IGlzIHRoZSBjbHVzdGVyIG9yIGpvYiBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICBwQ2hhciA9IHN0cnRvayhwQ2hhciwgIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICBsbF9zdGVwX2lkLmNsdXN0ZXIgPSBhdG9pKHBDaGFyKTsgLyogVGhlIGxhc3QgdG9rZW4gaXMgdGhlIHByb2Mgb3Igc3RlcCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICBwQ2hhciA9IHN0cnRvayhOVUxMLCAiLiIpOwotICAgICAgICAgICAgICAgICAgICAgIGxsX3N0ZXBfaWQucHJvYyA9IGF0b2kocENoYXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJKb2Igc3RlcCBJRD0lcy4lZC4lZFxuIiwgbGxfc3RlcF9pZC5mcm9tX2hvc3QsIGxsX3N0ZXBfaWQuY2x1c3RlciwgbGxfc3RlcF9pZC5wcm9jKTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGpvYl9vYmplY3QgPSBnZXRfam9iX2luX2xpc3Qoam9iX2xpc3QsIGxsX3N0ZXBfaWQpKSAhPSBOVUxMKSB7ICAgICAgIC8qIGV4aXN0aW5nIHN0ZXAgKi8KLQotICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICAgICAgICogc3RlcCByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciB3YXMgZm91bmQgaW4gb3VyIHB0cCBqb2IgbGlzdC4gICAgICAgICAgICogCi0gICAgICAgICAgICAgICAqIGZsYWcgaXQgYXMgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9vYmplY3QtPmpvYl9mb3VuZCA9IDE7ICAgICAgLyogZmxhZyBpdCBhcyBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9PSBNWV9TVEFURV9VTktOT1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBKb2I9JXMuJWQuJWQgY2hhbmdlZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEpvYkNoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aWNsdXN0ZXJfc3RhdHVzID09IDEpIHsgLyogaWYgcnVubmluZyBtdWx0aWNsdXN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpICE9IDApIHsgICAgLyogaWYgam9iIG1vdmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEpvYlJlbW92ZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUgPSBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lOyAgICAvKiBwaWNrIHVwIG5ldyBjbHVzdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEpvYkFkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCwgam9iX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgIC8qIGlmIGpvYiBtb3ZlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAvKiBlbmQgaWYgcnVubmluZyBtdWx0aWNsdXN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogbmV3IGpvYiAobm90IHlldCBpbiBsaXN0KSAqLwotCi0gICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICAgICAgKiBqb2IgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgd2FzIG5vdCBmb3VuZCBpbiBvdXIgcHRwIGpvYiBsaXN0ICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICogYWRkIGl0IGFuZCBnZW5lcmF0ZSBhbiBldmVudCB0byB0aGUgZ3VpLiBmbGFnIGl0IGFzIGFkZGVkLiAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgICAgICAgICAgam9iX29iamVjdCA9IChKb2JPYmplY3QgKikgbWFsbG9jKHNpemVvZihKb2JPYmplY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvY19jaGVjayhqb2Jfb2JqZWN0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChqb2Jfb2JqZWN0LCAnXDAnLCBzaXplb2Yoam9iX29iamVjdCkpOyAgIC8qIHplcm8gdGhlIG1hbGxvYyBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfam9iX2lkID0gZ2VuZXJhdGVfaWQoKTsgICAgIC8qIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgY2x1c3RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgam9iX29iamVjdC0+Z3VpX2Fzc2lnbmVkX2pvYl9pZCA9ICItMSI7IC8qIHVuc29saWNpdGVkIGpvYiBmcm9tIHByb3h5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCA9IHN0cmR1cChsbF9zdGVwX2lkLmZyb21faG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIgPSBsbF9zdGVwX2lkLmNsdXN0ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MgPSBsbF9zdGVwX2lkLnByb2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5qb2JfZm91bmQgPSAyOyAgICAgIC8qIGZsYWcgaXQgYXMgbmV3bHkgYWRkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT50YXNrX2xpc3QgPSBOZXdMaXN0KCk7ICAgICAgLyogbGlzdCB0byBob2xkIHRhc2tzIGZvciB0aGlzIGpvYiBzdGVwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUgPSBzdHJkdXAoY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfam9iX3RvX2xpc3Qoam9iX2xpc3QsICh2b2lkICopIGpvYl9vYmplY3QpOyAvKiBhZGQgdGhlIG5ldyBqb2Igb2JqZWN0IHRvIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEpvYkFkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCwgam9iX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgIC8qIGVuZCBpZiBuZXcgbm9kZSAqLwotICAgICAgICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEoc3RlcCwgTExfU3RlcE5vZGVDb3VudCwgJnN0ZXBfbm9kZV9jb3VudCk7ICAgIC8qIG5vZGVzIHJ1bm5pbmcgb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlN0ZXA9JXMuJWQuJWQuIFN0ZXBOb2RlQ291bnQ9JWQuXG4iLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIHN0ZXBfbm9kZV9jb3VudCk7Ci0KLSAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICAgICAgICAgKiBpZiB0aGlzIGpvYiBmcm9tIExvYWRMZXZlbGVyIGhhcyBub2RlcyAoaXMgcnVubmluZy1saWtlKSB0aGVuIGxvb3Agb24gKgotICAgICAgICAgICAgICAgICAqIHRoZSBub2RlcyB0byBzZWUgdGFzayBzdGF0dXMgZm9yIG5ldyBvciBleGlzdGluZyB0YXNrcy4gICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwX25vZGVfY291bnQgPiAwKSB7ICAgICAgICAvKiBpZiBqb2Igc3RlcCBpcyBpbiBydW5uaW5nLWxpa2Ugc3RhdGUgKGlzIHVzaW5nIG5vZGVzKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBteV9sbF9nZXRfZGF0YShzdGVwLCBMTF9TdGVwR2V0Rmlyc3ROb2RlLCAmbm9kZSk7ICAvKiBub2RlICovCi0KLSAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICAgICAgICAgICogbG9vcCBvbiB0aGUgbm9kZXMgaW4gdGhlIGpvYiByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IE5VTEwpIHsgIC8qIHdoaWxlIHdlIGhhdmUgYSB2YWxpZCBMb2FkTGV2ZWxlciBub2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEobm9kZSwgTExfTm9kZVRhc2tDb3VudCwgJm5vZGVfdGFza19jb3VudCk7ICAgICAgICAvKiB0YXNrcyBydW5uaW5nIG9uIG5vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJOb2RlVGFza0NvdW50PSVkLlxuIiwgbm9kZV90YXNrX2NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBteV9sbF9nZXRfZGF0YShub2RlLCBMTF9Ob2RlR2V0Rmlyc3RUYXNrLCAmdGFzayk7ICAgICAgICAvKiB0YXNrICovCi0KLSAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICAgICAgICAgICogbG9vcCBvbiB0aGUgdGFza3MgaW4gdGhlIGpvYiByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhc2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEodGFzaywgTExfVGFza1Rhc2tJbnN0YW5jZUNvdW50LCAmdGFza19pbnN0YW5jZV9jb3VudCk7ICAvKiB0YXNrIGluc3RhbmNlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiVGFza0luc3RhbmNlQ291bnQ9JWQuXG4iLCB0YXNrX2luc3RhbmNlX2NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2ssIExMX1Rhc2tHZXRGaXJzdFRhc2tJbnN0YW5jZSwgJnRhc2tfaW5zdGFuY2UpOyAgICAgLyogdGFzayBpbnN0YW5jZXMgKi8KLQotICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3Agb24gdGhlIHRhc2tfaW5zdGFuY2VzIGluIHRoZSBqb2IgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXNrX2luc3RhbmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEodGFza19pbnN0YW5jZSwgTExfVGFza0luc3RhbmNlTWFjaGluZU5hbWUsICZ0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSk7ICAgICAgLyogbWFjaGluZSBuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2tfaW5zdGFuY2UsIExMX1Rhc2tJbnN0YW5jZU1hY2hpbmVBZGRyZXNzLCAmdGFza19pbnN0YW5jZV9tYWNoaW5lX2FkZHJlc3MpOyAgICAgICAgLyogbWFjaGluZSBuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2tfaW5zdGFuY2UsIExMX1Rhc2tJbnN0YW5jZVRhc2tJRCwgJnRhc2tfaW5zdGFuY2VfdGFza19JRCk7ICAgICAgICAvKiB0YXNrIGlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlRhc2tJbnN0YW5jZU1hY2hpbmVOYW1lPSVzLiBUYXNrSW5zdGFuY2VNYWNoaW5lQWRkcmVzcz0lcy4gVGFza0luc3RhbmNlVGFza0lEPSVkLlxuIiwgdGFza19pbnN0YW5jZV9tYWNoaW5lX25hbWUsIHRhc2tfaW5zdGFuY2VfbWFjaGluZV9hZGRyZXNzLCB0YXNrX2luc3RhbmNlX3Rhc2tfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0YXNrX29iamVjdCA9IGdldF90YXNrX2luX2xpc3Qoam9iX29iamVjdC0+dGFza19saXN0LCB0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSwgdGFza19pbnN0YW5jZV90YXNrX0lEKSkgIT0gTlVMTCkgeyAvKiBleGlzdGluZyB0YXNrICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRhc2sgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgd2FzIGZvdW5kIGluIG91ciBwdHAgam9iIHRhc2sgbGlzdC4gICAgICAqIAotICAgICAgICAgICAgICAgICAgICAgICAgICogZmxhZyBpdCBhcyBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQgPSB0YXNrX2luc3RhbmNlX3Rhc2tfSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfb2JqZWN0LT50YXNrX2ZvdW5kID0gMTsgICAgLyogZmxhZyBpdCBhcyBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFza19vYmplY3QtPnRhc2tfc3RhdGUgIT0gTVlfU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfb2JqZWN0LT50YXNrX3N0YXRlID0gTVlfU1RBVEVfUlVOTklORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogVGFza19JRD0lZCBydW5uaW5nIG9uIG5vZGVfbmFtZT0lcyBhZGRlZCBmb3IgTG9hZExldmVsZXIgSm9iPSVzLiVkLiVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQsIHRhc2tfb2JqZWN0LT5ub2RlX25hbWUsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVGFza0NoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfb2JqZWN0LCB0YXNrX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYl9vYmplY3QtPmpvYl9zdGF0ZSAhPSBNWV9TVEFURV9SVU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX29iamVjdC0+am9iX3N0YXRlID0gTVlfU1RBVEVfUlVOTklORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEpvYkNoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIG5ldyB0YXNrIChub3QgeWV0IGluIGxpc3QpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGFzayByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciB3YXMgbm90IGZvdW5kIGluIG91ciBwdHAgam9iIHRhc2sgbGlzdCAgICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgaXQgYW5kIGdlbmVyYXRlIGFuIGV2ZW50IHRvIHRoZSBndWkuIGZsYWcgaXQgYXMgYWRkZWQuICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX29iamVjdCA9IChUYXNrT2JqZWN0ICopIG1hbGxvYyhzaXplb2YoVGFza09iamVjdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2NfY2hlY2sodGFza19vYmplY3QsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGFza19vYmplY3QsICdcMCcsIHNpemVvZih0YXNrX29iamVjdCkpOyAvKiB6ZXJvIHRoZSBtYWxsb2MgYXJlYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWQgPSBnZW5lcmF0ZV9pZCgpOyAgIC8qIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgY2x1c3RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX29iamVjdC0+bGxfdGFza19pZCA9IHRhc2tfaW5zdGFuY2VfdGFza19JRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza19vYmplY3QtPm5vZGVfbmFtZSA9IHN0cmR1cCh0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfb2JqZWN0LT5ub2RlX2FkZHJlc3MgPSBzdHJkdXAodGFza19pbnN0YW5jZV9tYWNoaW5lX2FkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX29iamVjdC0+dGFza19mb3VuZCA9IDI7ICAgIC8qIGZsYWcgaXQgYXMgYWRkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza19vYmplY3QtPnRhc2tfc3RhdGUgPSBNWV9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgIT0gTVlfU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IEpvYj0lcy4lZC4lZCBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRKb2JDaGFuZ2VFdmVudChzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3Rhc2tfdG9fbGlzdChqb2Jfb2JqZWN0LT50YXNrX2xpc3QsICh2b2lkICopIHRhc2tfb2JqZWN0KTsgIC8qIGFkZCB0aGUgbmV3IHRhc2sgb2JqZWN0IHRvIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBUYXNrX0lEPSVkIHJ1bm5pbmcgb24gbm9kZV9uYW1lPSVzIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBKb2I9JXMuJWQuJWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCB0YXNrX29iamVjdC0+bGxfdGFza19pZCwgdGFza19vYmplY3QtPm5vZGVfbmFtZSwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVGFza0FkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCwgam9iX29iamVjdCwgdGFza19vYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgaWYgbmV3IG5vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEodGFzaywgTExfVGFza0dldE5leHRUYXNrSW5zdGFuY2UsICZ0YXNrX2luc3RhbmNlKTsgICAgLyogdGFzayBpbnN0YW5jZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBteV9sbF9nZXRfZGF0YShub2RlLCBMTF9Ob2RlR2V0TmV4dFRhc2ssICZ0YXNrKTsgICAgICAgLyogdGFzayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEoc3RlcCwgTExfU3RlcEdldE5leHROb2RlLCAmbm9kZSk7IC8qIG5vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyogZW5kIHdoaWxlIHdlIGhhdmUgYSB2YWxpZCBMb2FkTGV2ZWxlciBub2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgLyogZW5kIGlmIGpvYiBzdGVwIGlzIGluIHJ1bm5pbmctbGlrZSBzdGF0ZSAoaXMgdXNpbmcgbm9kZXMpICovCi0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICAgICAgICAgICAgICogbG9vcCBvbiB0aGUgdGFza3MgaW4gdGhlIGpvYiBvYmplY3QgLSBpZiBhbnkgbm90IGZvdW5kIHRoYXQgd2VyZSAgICAgICogCi0gICAgICAgICAgICAgICAgICogcHJlc2VudCBiZWZvcmUgdGhlbiBnZW5lcmF0ZSBkZWxldGVkIHRhc2sgZXZlbnRzLiAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgICAgICAgICAgICAgICAgdGFza19saXN0ID0gKExpc3QgKikgam9iX29iamVjdC0+dGFza19saXN0OyAgICAgICAvKiB0aGUgdGFzayBsaXN0IGluIHRoZSBqb2IgKi8KLSAgICAgICAgICAgICAgICAgICAgICB0YXNrX2xpc3RfZWxlbWVudCA9IHRhc2tfbGlzdC0+bF9oZWFkOyAgICAvKiBmaXJzdCBpbiBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhc2tfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsgICAgICAgLyogd2hpbGUgd2UgaGF2ZSBhIHRhc2sgdG8gcXVlcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfb2JqZWN0ID0gdGFza19saXN0X2VsZW1lbnQtPmxfdmFsdWU7ICAgICAgIC8qIGdldCB0aGUgdGFzayBvYmplY3QgKGlmIGFueSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfbGlzdF9lbGVtZW50ID0gdGFza19saXN0X2VsZW1lbnQtPmxfbmV4dDsgIC8qIHByZXBhcmUgZm9yIG5leHQgcGFzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tfb2JqZWN0ICE9IDApIHsgLyogaWYgd2UgaGF2ZSBhIHRhc2sgb2JqZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrX29iamVjdC0+dGFza19mb3VuZCA9PSAwKSB7ICAgLyogaWYgbm90IGZvdW5kIG9yIGFkZGVkIHRoaXMgcGFzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfb2JqZWN0LT50YXNrX3N0YXRlID0gTVlfU1RBVEVfVEVSTUlOQVRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX29iamVjdC0+dGFza19mb3VuZCA9IDA7ICAgICAgICAvKiByZXNldCBmb3IgbmV4dCBwYXNzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IFRhc2tfSUQ9JWQgcnVubmluZyBvbiBub2RlX25hbWU9JXMgZGVsZXRlZCBmb3IgTG9hZExldmVsZXIgSm9iPSVzLiVkLiVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQsIHRhc2tfb2JqZWN0LT5ub2RlX25hbWUsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVGFza1JlbW92ZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfb2JqZWN0LCB0YXNrX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3Rhc2tfZnJvbV9saXN0KHRhc2tfbGlzdCwgdGFza19vYmplY3QpOyAgICAgIC8qIGNsZWFuIHRoaXMgdGFzayBvYmplY3QgYW5kIGRlbGV0ZSBmcm9tIHRoZSBqb2IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2l6ZU9mTGlzdCh0YXNrX2xpc3QpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPT0gTVlfU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPSBNWV9TVEFURV9URVJNSU5BVEVEOyAgICAvKiBqb2IgaXMgZG9uZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIHRlcm1pbmF0ZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRKb2JDaGFuZ2VFdmVudChzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOTyBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGRlbGV0ZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOTyBzZW5kSm9iUmVtb3ZlRXZlbnQoc3RhcnRfZXZlbnRzX2d1aV90cmFuc21pc3Npb25faWQsIGpvYl9vYmplY3QpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX29iamVjdC0+am9iX3N0YXRlID0gTVlfU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IEpvYj0lcy4lZC4lZCBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kSm9iQ2hhbmdlRXZlbnQoc3RhcnRfZXZlbnRzX2d1aV90cmFuc21pc3Npb25faWQsIGpvYl9vYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAvKiBpdCB3YXMgZm91bmQgb3IgYWRkZWQgdGhpcyBwYXNzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza19vYmplY3QtPnRhc2tfZm91bmQgPSAwOyAgICAgICAgLyogcmVzZXQgZm9yIG5leHQgcGFzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgIC8qIGVuZCBpZiB3ZSBoYXZlIGEgdGFzayBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgLyogZW5kIHdoaWxlIHdlIGhhdmUgdGFzayBsaXN0IGVsZW1lbnQgdG8gbG9vayBhdCAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKGpvYiwgTExfSm9iR2V0TmV4dFN0ZXAsICZzdGVwKTsgICAgICAgLyogZ2V0IGFub3RoZXIgam9iIHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAvKiBlbmQgd2hpbGUgd2UgaGF2ZSBhIHN0ZXAgKi8KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogd2UgZ290IGEgam9iIG5hbWUgb2sgKi8KLQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICBqb2IgPSBteV9sbF9uZXh0X29iaihxdWVyeV9lbGVtKTsKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgLyogZW5kIHdoaWxlIHdlIGhhdmUgYSBqb2IgKi8KLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIHdlIGhhdmUgbm9kZXMgaW4gdGhpcyBjbHVzdGVyICovCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiB3ZSBoYXZlIGEgbm9kZSB0YWJsZSBpbiB0aGlzIGNsdXN0ZXIgKi8KLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIHdlIGhhdmUgYSBjbHVzdGVyIG9iamVjdCAqLwotICAgICAgICBpZiAocXVlcnlfZWxlbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcmMgPSBteV9sbF9mcmVlX29ianMocXVlcnlfZWxlbSk7Ci0gICAgICAgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB3aGlsZSB3ZSBoYXZlIGEgY2x1c3RlciB0byBxdWVyeSAqLwotCi0gICAgICBpZiAocXVlcnlfZWxlbSAhPSBOVUxMKSB7Ci0gICAgICAgIHJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotICAgICAgICByYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0gICAgICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotICAgICAgfQotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAqIGdldCB0aGUgdGltZSBhbmQgc2VlIGlmIGpvYiBoYXMgYmVlbiBzaXR0aW5nIGluIHN1Ym1pdHRlZCBzdGF0ZSB0b28gICAqIAotICAgICAgICogbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIHRpbWUoJm15X2Nsb2NrKTsgICAgICAgICAgICAgLyogd2hhdCB0aW1lIGlzIGl0ID8gKi8KLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICAgKiBsb29wIG9uIHRoZSBwdHAgam9iIGxpc3QgdG8gc2VlIGlmIGFueSBqb2JzIHdlcmUgbm90IHJldHVybmVkICAgICAgICAgKiAKLSAgICAgICAqIGJ5IExvYWRMZXZlbGVyIG9uIHRoaXMgcGFzcyAobWF5YmUgdGhleSB3ZW50IGRvd24pLiAgICAgICAgICAgICAgICAgICAqIAotICAgICAgICogZ2VuZXJhdGUgYW4gZXZlbnQgKGNoYW5nZWQvZ29uZSkgdG8gdGhlIGd1aS4gICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGlmIChqb2JfbGlzdCAhPSBOVUxMKSB7ICAgLyogaWYgd2UgaGF2ZSBhIGpvYiBsaXN0IG9rICovCi0gICAgICAgIGpvYl9saXN0X2VsZW1lbnQgPSBqb2JfbGlzdC0+bF9oZWFkOyAgICAvKiBmaXJzdCBpbiBsaXN0ICovCi0gICAgICAgIHdoaWxlIChqb2JfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsgICAgICAvKiB3aGlsZSB3ZSBoYXZlIGEgam9iIHRvIHF1ZXJ5ICovCi0gICAgICAgICAgam9iX29iamVjdCA9IGpvYl9saXN0X2VsZW1lbnQtPmxfdmFsdWU7ICAgICAgIC8qIGdldCBvdXIgam9iIG9iamVjdCBmcm9tIHRoaXMgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgam9iX2xpc3RfZWxlbWVudCA9IGpvYl9saXN0X2VsZW1lbnQtPmxfbmV4dDsgIC8qIHByZXBhcmUgZm9yIG5leHQgcGFzcyAqLwotICAgICAgICAgIGlmICgoam9iX29iamVjdC0+am9iX2ZvdW5kID09IDApICYmICAgLyogaWYgam9iIG5vdCBmb3VuZCAqLwotICAgICAgICAgICAgICAoKGpvYl9vYmplY3QtPmpvYl9zdGF0ZSAhPSBNWV9TVEFURV9VTktOT1dOKSB8fCAgIC8qIGFuZCB3YXMgcnVubmluZyAqLwotICAgICAgICAgICAgICAgKChteV9jbG9jayAtIGpvYl9vYmplY3QtPmpvYl9zdWJtaXRfdGltZSkgPiAzMDApKSkgeyAgICAgICAgLyogb3IgbmV2ZXIgcXVldWVkIGFmdGVyIHRpbWUgbGltaXQgKHNlY29uZHMpICovCi0gICAgICAgICAgICBqb2Jfb2JqZWN0LT5qb2JfZm91bmQgPSAwOyAgLyogcmVzZXQgZm9yIG5leHQgcGFzcyAqLwotCi0gICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAgICAgICAqIGxvb3Agb24gdGhlIHRhc2tzIGluIHRoZSBqb2Igb2JqZWN0IC0gc2VuZCBkZWxldGVkIGV2ZW50IGFuZCBtYXJrICAgICAqCi0gICAgICAgICAgICAgKiBhbGwgZGVsZXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgICAgICB0YXNrX2xpc3QgPSAoTGlzdCAqKSBqb2Jfb2JqZWN0LT50YXNrX2xpc3Q7IC8qIHRoZSB0YXNrIGxpc3QgaW4gdGhlIGpvYiAqLwotICAgICAgICAgICAgdGFza19saXN0X2VsZW1lbnQgPSB0YXNrX2xpc3QtPmxfaGVhZDsgICAgICAvKiBmaXJzdCBpbiBsaXN0ICovCi0gICAgICAgICAgICB3aGlsZSAodGFza19saXN0X2VsZW1lbnQgIT0gTlVMTCkgeyAvKiB3aGlsZSB3ZSBoYXZlIGEgdGFzayB0byBkZWxldGUgKi8KLSAgICAgICAgICAgICAgdGFza19vYmplY3QgPSB0YXNrX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsgLyogZ2V0IHRoZSB0YXNrIG9iamVjdCAoaWYgYW55KSAqLwotICAgICAgICAgICAgICB0YXNrX2xpc3RfZWxlbWVudCA9IHRhc2tfbGlzdF9lbGVtZW50LT5sX25leHQ7ICAgIC8qIHByZXBhcmUgZm9yIG5leHQgcGFzcyAqLwotICAgICAgICAgICAgICBpZiAodGFza19vYmplY3QgIT0gMCkgeyAgIC8qIGlmIHdlIGhhdmUgYSB0YXNrIG9iamVjdCAqLwotICAgICAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBUYXNrX0lEPSVkIGRlbGV0ZWQgb24gbm9kZV9uYW1lPSVzIGRlbGV0ZWQgZm9yIExvYWRMZXZlbGVyIEpvYj0lcy4lZC4lZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsIHRhc2tfb2JqZWN0LT5sbF90YXNrX2lkLCB0YXNrX29iamVjdC0+bm9kZV9uYW1lLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgc2VuZFRhc2tSZW1vdmVFdmVudChzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX29iamVjdCwgdGFza19vYmplY3QpOwotICAgICAgICAgICAgICAgIGRlbGV0ZV90YXNrX2Zyb21fbGlzdCh0YXNrX2xpc3QsIHRhc2tfb2JqZWN0KTsgIC8qIGNsZWFuIHRoaXMgdGFzayBvYmplY3QgYW5kIGRlbGV0ZSBmcm9tIHRoZSBqb2IgKi8KLSAgICAgICAgICAgICAgICBpZiAoU2l6ZU9mTGlzdCh0YXNrX2xpc3QpID09IDApIHsKLSAgICAgICAgICAgICAgICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICBzZW5kSm9iQ2hhbmdlRXZlbnQoc3RhcnRfZXZlbnRzX2d1aV90cmFuc21pc3Npb25faWQsIGpvYl9vYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgLyogZW5kIGlmIHdlIGhhdmUgYSB0YXNrIG9iamVjdCAqLwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgd2hpbGUgd2UgaGF2ZSB0YXNrIGxpc3QgZWxlbWVudCB0byBsb29rIGF0ICovCi0KLSAgICAgICAgICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX1RFUk1JTkFURUQ7ICAgICAgICAvKiBqb2IgaXMgZG9uZSAqLwotICAgICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IEpvYj0lcy4lZC4lZCB0ZXJtaW5hdGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgc2VuZEpvYkNoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBqb2Jfb2JqZWN0KTsKLSAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBKb2I9JXMuJWQuJWQgZGVsZXRlZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgICAgICAgIHNlbmRKb2JSZW1vdmVFdmVudChzdGFydF9ldmVudHNfZ3VpX3RyYW5zbWlzc2lvbl9pZCwgam9iX29iamVjdCk7Ci0gICAgICAgICAgICBkZWxldGVfam9iX2Zyb21fbGlzdChqb2JfbGlzdCwgam9iX29iamVjdCk7IC8qIGNsZWFuIHRoaXMgam9iIG9iamVjdCBhbmQgZGVsZXRlIGZyb20gaXRzIGNsdXN0ZXIgKi8KLSAgICAgICAgICB9IC8qIGVuZCBpZiBub3QgZm91bmQgYW5kIHdhcyBub3QgcHJldmlvdXNseSBpbiBxdWV1ZSAqLwotICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAvKiBqb2Igd2FzIGZvdW5kIG9yIG5vdCBmb3VuZCBidXQgaGFzbid0IG1hZGUgaXQgdG8gcXVldWUgeWV0ICovCi0gICAgICAgICAgICBqb2Jfb2JqZWN0LT5qb2JfZm91bmQgPSAwOyAgLyogcmVzZXQgZm9yIG5leHQgcGFzcyAqLwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYgam9iIHdhcyBmb3VuZCBvciBub3QgZm91bmQgYnV0IGhhc24ndCBtYWRlIGl0IHRvIHF1ZXVlIHlldCAqLwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgd2hpbGUgd2UgaGF2ZSBqb2IgbGlzdCBlbGVtZW50IHRvIGxvb2sgYXQgKi8KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHdoaWxlIHdlIGhhdmUgYSBqb2IgbGlzdCB0YWJsZSAqLwotICAgIH0KLSAgLyogZW5kIGlmIHdlIGhhdmUgYSBjbHVzdGVycywgbm9kZXMsIGV0YyAqLwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXN0ZXJfbG9jayk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgKiBzbGVlcCBhbmQgbG9vcCBhZ2FpbiBvbiB0aGUgTG9hZExldmVsZXIgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDApIHsKLSAgICAgIGludCBzbGVlcF9pbnRlcnZhbCA9IDA7Ci0gICAgICBpbnQgbWluaV9zbGVlcF9pbnRlcnZhbCA9IChqb2Jfc2xlZXBfc2Vjb25kcyArIDQpIC8gNTsKLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiJXMgU2xlZXBpbmcgZm9yICglZCBzZWNvbmRzKSAlZCBpbnRlcnZhbHMgb2YgNSBzZWNvbmRzXG4iLCBfX0ZVTkNUSU9OX18sIG1pbmlfc2xlZXBfaW50ZXJ2YWwgKiA1LCBtaW5pX3NsZWVwX2ludGVydmFsKTsKLSAgICAgIGZvciAoc2xlZXBfaW50ZXJ2YWwgPSAwOyBzbGVlcF9pbnRlcnZhbCA8IG1pbmlfc2xlZXBfaW50ZXJ2YWw7IHNsZWVwX2ludGVydmFsKyspIHsKLSAgICAgICAgaWYgKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSB7Ci0gICAgICAgICAgc2xlZXAoNSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB3aGlsZSB3ZSBhcmUgbm90IHNodXR0aW5nIGRvd24gKi8KLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFJldHJpZXZlIGEgbGlzdCBvZiBMb2FkTGV2ZWxlciBjbHVzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogSWYgbm8gbXVsdGljbHVzdGVyIGVudmlyb25tZW50IHRoZW4gcmV0dXJuIGEgbGlzdCBvZiAxIGNsdXN0ZXIuICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZWZyZXNoX2NsdXN0ZXJfbGlzdCgpCi17Ci0gIGludCByYyA9IDA7Ci0gIGludCBpID0gMDsKLSAgTExfZWxlbWVudCAqcXVlcnlfZWxlbSA9IE5VTEw7Ci0gIExMX2VsZW1lbnQgKmNsdXN0ZXIgPSBOVUxMOwotICBpbnQgY2x1c3Rlcl9jb3VudCA9IDA7Ci0gIGNoYXIgKmNsdXN0ZXJfbmFtZSA9IE5VTEw7Ci0gIGludCBjbHVzdGVyX2xvY2FsID0gMDsKLSAgQ2x1c3Rlck9iamVjdCAqY2x1c3Rlcl9vYmplY3QgPSBOVUxMOwotICBjaGFyIHdvcmthcmVhWzUxMl07Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQotICBpZiAoKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSAmJiAoc3RhdGVfZXZlbnRzX2FjdGl2ZSA9PSAxKSkgeyAgLyogaWYgbm90IHNodXR0aW5nIGRvd24gKi8KLQotICAgIGlmIChtdWx0aWNsdXN0ZXJfc3RhdHVzID09IC0xKSB7ICAgIC8qIGlmIHN0YXRlIG5vdCB5ZXQgZGV0ZXJtaW5lZCAqLwotICAgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IGdldF9tdWx0aWNsdXN0ZXJfc3RhdHVzKCk7ICAvKiBhcmUgd2UgcnVubmluZyBtdWx0aWNsdXN0ZXI/ICovCi0gICAgfQotICAvKiBlbmQgaWYgc3RhdGUgbm90IHlldCBkZXRlcm1pbmVkICovCi0gICAgc3dpdGNoIChtdWx0aWNsdXN0ZXJfc3RhdHVzKSB7Ci0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICAgICogbm8gY29udGFjdCB3aXRoIGxvYWRsZXZlbGVyIHlldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGNhc2UgLTE6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAqIHNpbmdsZSBjbHVzdGVyIGFuZCBtdWx0aSBjbHVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgLyogc2luZ2xlIGNsdXN0ZXIgKi8KLSAgICAgICAgaWYgKGNsdXN0ZXJfbGlzdCA9PSBOVUxMKSB7ICAgICAvKiBpZiBubyBsaXN0IG9idGFpbmVkIHlldCAqLwotICAgICAgICAgIGNsdXN0ZXJfbGlzdCA9IE5ld0xpc3QoKTsgICAgIC8qIGNyZWF0ZSBhIG5ldyBjbHVzdGVyIGxpc3QgKi8KLSAgICAgICAgICBqb2JfbGlzdCA9IE5ld0xpc3QoKTsgLyogY3JlYXRlIGEgbmV3IGpvYiBsaXN0ICovCi0gICAgICAgIH0KLSAgICAgIC8qIGVuZCBpZiBubyBsaXN0IG9idGFpbmVkIHlldCAqLwotICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIk51bWJlciBvZiBMb2FkTGV2ZWxlciBDbHVzdGVycz0wIChub3QgcnVubmluZyBtdWx0aWNsdXN0ZXIpLlxuIik7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICBjbHVzdGVyX29iamVjdCA9IChDbHVzdGVyT2JqZWN0ICopIG1hbGxvYyhzaXplb2YoQ2x1c3Rlck9iamVjdCkpOwotICAgICAgICBtYWxsb2NfY2hlY2soY2x1c3Rlcl9vYmplY3QsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgICAgICBtZW1zZXQoY2x1c3Rlcl9vYmplY3QsICdcMCcsIHNpemVvZihjbHVzdGVyX29iamVjdCkpOyAgIC8qIHplcm8gdGhlIG1hbGxvYyBhcmVhICovCi0gICAgICAgIGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZCA9IGdlbmVyYXRlX2lkKCk7ICAgICAvKiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsdXN0ZXIgKi8KLSAgICAgICAgY2x1c3Rlcl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZCA9IGdlbmVyYXRlX2lkKCk7ICAgICAgIC8qIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgY2x1c3RlciAqLwotICAgICAgICBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9zdGF0ZSA9IE1ZX1NUQVRFX1VQOyAgICAvKiBtYXJrIGNsdXN0ZXIgb2JqZWN0IGNyZWF0ZWQgKi8KLSAgICAgICAgY2x1c3Rlcl9vYmplY3QtPnF1ZXVlX3N0YXRlID0gTVlfU1RBVEVfVVA7ICAgICAgLyogbWFyayBxdWV1ZSBvYmplY3QgY3JlYXRlZCAqLwotICAgICAgICBtZW1zZXQod29ya2FyZWEsICdcMCcsIHNpemVvZih3b3JrYXJlYSkpOyAgICAgICAvKiB6ZXJvIHRoZSBhcmVhICovCi0gICAgICAgIHN0cmNweSh3b3JrYXJlYSwiTG9jYWxAIik7Ci0gICAgICAgIHN0cmNhdCh3b3JrYXJlYSxob3N0bmFtZSk7Ci0gICAgICAgIHN0cmNhdCh3b3JrYXJlYSwiIChub3QgbXVsdGljbHVzdGVyKSIpOwotICAgICAgICBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lID0gc3RyZHVwKHdvcmthcmVhKTsgICAgICAvKiBmaXJzdCBjbHVzdGVyIGluIHRoZSBsaXN0IGlzIHRoZSBsb2NhbCBjbHVzdGVyIChub25hbWUpICovCi0gICAgICAgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX2lzX2xvY2FsID0gMTsgICAvKiB0aGlzIGlzIGEgbG9jYWwgY2x1c3RlciAqLwotICAgICAgICBjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoID0gSGFzaENyZWF0ZSgxMDI0KTsKLSAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJDbHVzdGVyIG5hbWU9JXNcbiIsIGNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgIEFkZFRvTGlzdChjbHVzdGVyX2xpc3QsICh2b2lkICopIGNsdXN0ZXJfb2JqZWN0KTsgICAgICAgLyogYWRkIHRoZSBuZXcgY2x1c3RlciBvYmplY3QgdG8gdGhlIGxpc3QgKi8KLSAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTZW5kIGV2ZW50IG5vdGlmaWNhdGlvbjogUFRQIE1hY2hpbmUgYWRkZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBjbHVzdGVyX25hbWUpOwotICAgICAgICBzZW5kTWFjaGluZUFkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCk7Ci0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2VuZCBldmVudCBub3RpZmljYXRpb246IFBUUCBRdWV1ZSBhZGRlZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsIGNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgIHNlbmRRdWV1ZUFkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAgICAqIG11bHRpY2x1c3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgLyogbXVsdGljbHVzdGVyICovCi0gICAgICAgIGlmIChjbHVzdGVyX2xpc3QgPT0gTlVMTCkgeyAgICAgLyogaWYgbm8gbGlzdCBvYnRhaW5lZCB5ZXQgKi8KLSAgICAgICAgICBjbHVzdGVyX2xpc3QgPSBOZXdMaXN0KCk7ICAgICAvKiBjcmVhdGUgYSBuZXcgY2x1c3RlciBsaXN0ICovCi0gICAgICAgICAgam9iX2xpc3QgPSBOZXdMaXN0KCk7IC8qIGNyZWF0ZSBhIG5ldyBqb2IgbGlzdCAqLwotICAgICAgICB9Ci0gICAgICAvKiBlbmQgaWYgbm8gbGlzdCBvYnRhaW5lZCB5ZXQgKi8KLSAgICAgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0KLSAgICAgICAgcXVlcnlfZWxlbSA9IG15X2xsX3F1ZXJ5KE1DTFVTVEVSUyk7Ci0KLSAgICAgICAgaWYgKHF1ZXJ5X2VsZW0gPT0gTlVMTCkgewotICAgICAgICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIlVuYWJsZSB0byBvYnRhaW4gcXVlcnkgZWxlbWVudC4gTG9hZExldmVsZXIgbWF5IG5vdCBiZSBhY3RpdmUuXG4iKTsKLSAgICAgICAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7ICAgICAvKiB3ZSBuZWVkIHRvIGNvbWUgaW4gaGVyZSBhZ2FpbiAqLwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2FsbCBMb2FkTGV2ZWxlciAobGxfc2V0X3JlcXVlc3QpIGZvciBjbHVzdGVycy5cbiIpOwotICAgICAgICByYyA9IG15X2xsX3NldF9yZXF1ZXN0KHF1ZXJ5X2VsZW0sIFFVRVJZX0FMTCwgTlVMTCwgQUxMX0RBVEEpOwotCi0gICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotICAgICAgICAgIG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAtMTsgICAgIC8qIHdlIG5lZWQgdG8gY29tZSBpbiBoZXJlIGFnYWluICovCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJDYWxsIExvYWRMZXZlbGVyIChsbF9nZXRfb2JqcykgZm9yIGNsdXN0ZXJzLlxuIik7Ci0gICAgICAgIGNsdXN0ZXIgPSBteV9sbF9nZXRfb2JqcyhxdWVyeV9lbGVtLCBMTF9TQ0hFREQsIE5VTEwsICZjbHVzdGVyX2NvdW50LCAmcmMpOwotICAgICAgICBpZiAocmMgIT0gMCkgewotICAgICAgICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLSAgICAgICAgICBxdWVyeV9lbGVtID0gTlVMTDsKLSAgICAgICAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7ICAgICAvKiB3ZSBuZWVkIHRvIGNvbWUgaW4gaGVyZSBhZ2FpbiAqLwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTnVtYmVyIG9mIExvYWRMZXZlbGVyIENsdXN0ZXJzPSVkLlxuIiwgY2x1c3Rlcl9jb3VudCk7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZSAoKGNsdXN0ZXIgIT0gTlVMTCkgJiYgKHF1ZXJ5X2VsZW0gIT0gTlVMTCkpIHsKLSAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNsdXN0ZXIgJWQ6XG4iLCBpKTsKLSAgICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKGNsdXN0ZXIsIExMX01DbHVzdGVyTmFtZSwgJmNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgICAgIHJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgICAgICAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7ICAgLyogd2UgbmVlZCB0byBjb21lIGluIGhlcmUgYWdhaW4gKi8KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2x1c3Rlcl9vYmplY3QgPSAoQ2x1c3Rlck9iamVjdCAqKSBtYWxsb2Moc2l6ZW9mKENsdXN0ZXJPYmplY3QpKTsKLSAgICAgICAgICAgIG1hbGxvY19jaGVjayhjbHVzdGVyX29iamVjdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBtZW1zZXQoY2x1c3Rlcl9vYmplY3QsICdcMCcsIHNpemVvZihjbHVzdGVyX29iamVjdCkpOyAgICAgICAvKiB6ZXJvIHRoZSBtYWxsb2MgYXJlYSAqLwotICAgICAgICAgICAgY2x1c3Rlcl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9jbHVzdGVyX2lkID0gZ2VuZXJhdGVfaWQoKTsgLyogYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjbHVzdGVyICovCi0gICAgICAgICAgICBjbHVzdGVyX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkID0gZ2VuZXJhdGVfaWQoKTsgICAvKiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsdXN0ZXIgKi8KLSAgICAgICAgICAgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX3N0YXRlID0gTVlfU1RBVEVfVVA7ICAgICAgICAvKiBtYXJrIGNsdXN0ZXIgb2JqZWN0IGNyZWF0ZWQgKi8KLSAgICAgICAgICAgIGNsdXN0ZXJfb2JqZWN0LT5xdWV1ZV9zdGF0ZSA9IE1ZX1NUQVRFX1VQOyAgLyogbWFyayBxdWV1ZSBvYmplY3QgY3JlYXRlZCAqLwotICAgICAgICAgICAgcmMgPSBteV9sbF9nZXRfZGF0YShjbHVzdGVyLCBMTF9NQ2x1c3RlckxvY2FsLCAmY2x1c3Rlcl9sb2NhbCk7Ci0gICAgICAgICAgICBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lID0gc3RyZHVwKGNsdXN0ZXJfbmFtZSk7ICAgICAgICAvKiBmaXJzdCBjbHVzdGVyIGluIHRoZSBsaXN0IGlzIHRoZSBsb2NhbCBjbHVzdGVyIChub25hbWUpICovCi0gICAgICAgICAgICBpZiAoY2x1c3Rlcl9sb2NhbCA9PSAxKSB7Ci0gICAgICAgICAgICAgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX2lzX2xvY2FsID0gMTsgICAgIC8qIHRoaXMgaXMgYSBsb2NhbCBjbHVzdGVyICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoID0gSGFzaENyZWF0ZSgxMDI0KTsKLSAgICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2x1c3RlciBuYW1lPSVzXG4iLCBjbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgQWRkVG9MaXN0KGNsdXN0ZXJfbGlzdCwgKHZvaWQgKikgY2x1c3Rlcl9vYmplY3QpOyAgIC8qIGFkZCB0aGUgbmV3IGNsdXN0ZXIgb2JqZWN0IHRvIHRoZSBsaXN0ICovCi0gICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNlbmQgZXZlbnQgbm90aWZpY2F0aW9uOiBQVFAgTWFjaGluZSBhZGRlZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsIGNsdXN0ZXJfbmFtZSk7Ci0gICAgICAgICAgICBzZW5kTWFjaGluZUFkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCk7Ci0gICAgICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNlbmQgZXZlbnQgbm90aWZpY2F0aW9uOiBQVFAgUXVldWUgYWRkZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLCBjbHVzdGVyX25hbWUpOwotICAgICAgICAgICAgc2VuZFF1ZXVlQWRkRXZlbnQoc3RhcnRfZXZlbnRzX2d1aV90cmFuc21pc3Npb25faWQsIGNsdXN0ZXJfb2JqZWN0KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpKys7Ci0gICAgICAgICAgY2x1c3RlciA9IG15X2xsX25leHRfb2JqKHF1ZXJ5X2VsZW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHF1ZXJ5X2VsZW0gIT0gTlVMTCkgewotICAgICAgICAgIHJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotICAgICAgICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLSAgICAgICAgfQotICAgICAgICBxdWVyeV9lbGVtID0gTlVMTDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHN3aXRjaCAqLwotCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiBub3Qgc2h1dGRvd24gKi8KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogU2VuZCBPSyBFdmVudCB0byBmcm9udCBlbmQgR1VJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc2VuZE9rRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQpCi17Ci0gIHByb3h5X21zZyAqbXNnOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBtc2cgPSBwcm94eV9va19ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkKTsKLSAgZW5xdWV1ZV9ldmVudF90b19wcm94eV9zZXJ2ZXIobXNnKTsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFNlbmQgU2h1dGRvd24gRXZlbnQgdG8gZnJvbnQgZW5kIEdVSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNlbmRTaHV0ZG93bkV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkKQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgbXNnID0gcHJveHlfc2h1dGRvd25fZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCk7Ci0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBTZW5kIEVSUk9SIEV2ZW50IHRvIGZyb250IGVuZCBHVUkgKGVycm9yIHR5cGUgYW5kIG1lc3NhZ2UpICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzZW5kRXJyb3JFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaW50IHR5cGUsIGNoYXIgKm1zZ3RleHQpCi17Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiB0eXBlPSVkLiBtZXNzYWdlPSVzLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdHlwZSwgbXNndGV4dCk7Ci0vKiAKLSAqIFNlbmQgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgZnJvbnQgZW5kCi0gKi8KLSAgcHJveHlfbXNnICptc2c7Ci0gIG1zZyA9IG5ld19wcm94eV9tc2coUFJPWFlfRVZfRVJST1IsIGd1aV90cmFuc21pc3Npb25faWQpOwotICBwcm94eV9tc2dfYWRkX2ludChtc2csIHR5cGUpOwotICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIG1zZ3RleHQpOwotICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBTZW5kIGpvYiBzdWJtaXNzaW9uIEVSUk9SIEV2ZW50IHRvIGZyb250IGVuZCBHVUkgKGVycm9yIHR5cGUgYW5kICAgICAgKgotICogbWVzc2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc2VuZEpvYlN1Ym1pc3Npb25FcnJvckV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBjaGFyICpzdWJpZCwgY2hhciAqbXNndGV4dCkKLXsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGlkPSVzLiBtZXNzYWdlPSVzLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc3ViaWQsIG1zZ3RleHQpOwotLyogCi0gKiBTZW5kIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGZyb250IGVuZAotICovCi0gIHByb3h5X21zZyAqbXNnOwotICBtc2cgPSBwcm94eV9zdWJtaXRqb2JfZXJyb3JfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgc3ViaWQsIDAsIG1zZ3RleHQpOwotICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBTZW5kIENvbmZpZ3VyYXRpb24gcGFuZWwgaW50ZWdlciBhdHRyaWJ1dGUgRXZlbnQgdG8gZnJvbnQgZW5kIEdVSSAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZW5kQXR0ckRlZkludEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBjaGFyICphdHRyaWJ1dGVfaWQsIGNoYXIgKmF0dHJpYnV0ZV9zaG9ydG5hbWUsIGNoYXIgKmF0dHJpYnV0ZV9kZXNjcmlwdGlvbiwgaW50IGF0dHJpYnV0ZV9zaG93LCBpbnQgYXR0cmlidXRlX2RlZmF1bHRfdmFsdWUsIGludCBhdHRyaWJ1dGVfbGxpbWl0LCBpbnQgYXR0cmlidXRlX3VsaW1pdCkKLXsKLSAgcHJveHlfbXNnICptc2c7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGlkPSVzLiBuYW1lPSVzLiBkZXNjcmlwdGlvbj0lcy4gZGVmYXVsdD0lZC4gdmFsdWUxPSVkLiB2YWx1ZTI9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBhdHRyaWJ1dGVfaWQsIGF0dHJpYnV0ZV9zaG9ydG5hbWUsIGF0dHJpYnV0ZV9kZXNjcmlwdGlvbiwgYXR0cmlidXRlX2RlZmF1bHRfdmFsdWUsIGF0dHJpYnV0ZV9sbGltaXQsIGF0dHJpYnV0ZV91bGltaXQpOwotICBtc2cgPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX0FUVFJfREVGLCBndWlfdHJhbnNtaXNzaW9uX2lkKTsKLSAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCAxKTsKLSAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCA4KTsKLSAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBhdHRyaWJ1dGVfaWQpOwotICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csICJJTlRFR0VSIik7Ci0gIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYXR0cmlidXRlX3Nob3J0bmFtZSk7Ci0gIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgYXR0cmlidXRlX2Rlc2NyaXB0aW9uKTsKLSAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCBhdHRyaWJ1dGVfc2hvdyk7Ci0gIHByb3h5X21zZ19hZGRfaW50KG1zZywgYXR0cmlidXRlX2RlZmF1bHRfdmFsdWUpOwotICBwcm94eV9tc2dfYWRkX2ludChtc2csIGF0dHJpYnV0ZV9sbGltaXQpOwotICBwcm94eV9tc2dfYWRkX2ludChtc2csIGF0dHJpYnV0ZV91bGltaXQpOwotICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFNlbmQgQ29uZmlndXJhdGlvbiBwYW5lbCBzdHJpbmcgYXR0cmlidXRlIEV2ZW50IHRvIGZyb250IGVuZCBHVUkgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNlbmRBdHRyRGVmU3RyaW5nRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIGNoYXIgKmF0dHJpYnV0ZV9pZCwgY2hhciAqYXR0cmlidXRlX3Nob3J0bmFtZSwgY2hhciAqYXR0cmlidXRlX2Rlc2NyaXB0aW9uLCBpbnQgYXR0cmlidXRlX3Nob3csIGNoYXIgKmF0dHJpYnV0ZV92YWx1ZSkKLXsKLSAgcHJveHlfbXNnICptc2c7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGlkPSVzLiBuYW1lPSVzLiBkZXNjcmlwdGlvbj0lcy4gdmFsdWU9JXMuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBhdHRyaWJ1dGVfaWQsIGF0dHJpYnV0ZV9zaG9ydG5hbWUsIGF0dHJpYnV0ZV9kZXNjcmlwdGlvbiwgYXR0cmlidXRlX3ZhbHVlKTsKLSAgbXNnID0gcHJveHlfYXR0cl9kZWZfc3RyaW5nX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIGF0dHJpYnV0ZV9pZCwgYXR0cmlidXRlX3Nob3J0bmFtZSwgYXR0cmlidXRlX2Rlc2NyaXB0aW9uLCBhdHRyaWJ1dGVfc2hvdywgYXR0cmlidXRlX3ZhbHVlKTsKLSAgZW5xdWV1ZV9ldmVudF90b19wcm94eV9zZXJ2ZXIobXNnKTsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBEZXRlcm1pbmUgaWYgTG9hZExldmVsZXIgaXMgY29uZmlndXJlZCBtdWx0aWNsdXN0ZXIuICAgICAgICAgICAgICAgICAgKiAKLSAqIElmIGFueSBlcnJvcnMgdGhlbiBkZWZhdWx0IHRvIGxvY2FsLiBUaGlzIGNvZGUgd2lsbCBub3QgYmUgY2FsbGVkICAgICAqIAotICogaWYgdGhlIHVzZXIgaGFzIGZvcmNlZCB1cyB0byBydW4gbG9jYWwgb25seSBvciBtdWx0aWNsdXN0ZXIgbW9kZS4gICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBnZXRfbXVsdGljbHVzdGVyX3N0YXR1cygpCi17Ci0gIGludCByYyA9IDA7Ci0gIGludCBpID0gMDsKLSAgTExfZWxlbWVudCAqcXVlcnlfZWxlbSA9IE5VTEw7Ci0gIExMX2VsZW1lbnQgKmNsdXN0ZXIgPSBOVUxMOwotICBpbnQgY2x1c3Rlcl9jb3VudCA9IDA7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQotICBpZiAoKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSAmJiAoc3RhdGVfZXZlbnRzX2FjdGl2ZSA9PSAxKSkgeyAgLyogaWYgbm90IHNodXR0aW5nIGRvd24gYW5kIGFsbG93ZWQgdG8gcHJvY2VzcyBldmVudHMgKi8KLQotICAgIGlmIChtdWx0aWNsdXN0ZXJfc3RhdHVzID09IC0xKSB7ICAgIC8qIGlmIHN0YXRlIG5vdCB5ZXQgZGV0ZXJtaW5lZCAqLwotCi0gICAgICBxdWVyeV9lbGVtID0gTlVMTDsKLSAgICAgIHF1ZXJ5X2VsZW0gPSBteV9sbF9xdWVyeShDTFVTVEVSUyk7Ci0KLSAgICAgIGlmIChxdWVyeV9lbGVtID09IE5VTEwpIHsKLSAgICAgICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiVW5hYmxlIHRvIG9idGFpbiBxdWVyeSBlbGVtZW50LiBMb2FkTGV2ZWxlciBtYXkgbm90IGJlIGFjdGl2ZS5cbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0KLSAgICAvKiBHZXQgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gTG9hZExldmVsZXIgY2x1c3RlcnMuCi0gICAgICogUVVFUllfQUxMOiB3ZSBhcmUgcXVlcnlpbmcgZm9yIGxvY2FsIGNsdXN0ZXIgZGF0YSAgCi0gICAgICogTlVMTDogbm8gZmlsdGVyIG5lZWRlZCAKLSAgICAgKiBBTExfREFUQTogd2Ugd2FudCBhbGwgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBhYm91dCB0aGUgY2x1c3RlciAqLwotCi0gICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNhbGwgTG9hZExldmVsZXIgKGxsX3NldF9yZXF1ZXN0KSBmb3IgY2x1c3Rlci5cbiIpOwotICAgICAgcmMgPSBteV9sbF9zZXRfcmVxdWVzdChxdWVyeV9lbGVtLCBRVUVSWV9BTEwsIE5VTEwsIEFMTF9EQVRBKTsKLQotICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJDYWxsIExvYWRMZXZlbGVyIChsbF9nZXRfb2JqcykgZm9yIGNsdXN0ZXIuXG4iKTsKLSAgICAgIGNsdXN0ZXIgPSBteV9sbF9nZXRfb2JqcyhxdWVyeV9lbGVtLCBMTF9DTSwgTlVMTCwgJmNsdXN0ZXJfY291bnQsICZyYyk7Ci0gICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIk51bWJlciBvZiBMb2FkTGV2ZWxlciBDbHVzdGVycz0lZC5cbiIsIGNsdXN0ZXJfY291bnQpOwotICAgICAgaSA9IDA7Ci0gICAgICBpZiAoY2x1c3RlciAhPSBOVUxMKSB7Ci0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2x1c3RlciAlZDpcbiIsIGkpOwotICAgICAgICByYyA9IG15X2xsX2dldF9kYXRhKGNsdXN0ZXIsIExMX0NsdXN0ZXJNdXN0ZXJFbnZpcm9ubWVudCwgJm11bHRpY2x1c3Rlcl9zdGF0dXMpOwotICAgICAgICBpZiAocmMgIT0gMCkgewotICAgICAgICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIkVycm9yIHJjPSVkIHRyeWluZyB0byBkZXRlcm1pbmUgaWYgTG9hZExldmVsZXIgaXMgcnVubmluZyBsb2NhbCBvciBtdWx0aWNsdXN0ZXIgY29uZmlndXJhdGlvbi4gRGVmYXVsdGluZyB0byBsb2NhbCBjbHVzdGVyIG9ubHkgKG5vIG11bHRpY2x1c3RlcikuXG4iLCByYyk7Ci0gICAgICAgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IDA7ICAgICAgLyogZGVmYXVsdCB0byBsb2NhbCAqLwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTXVsdGljbHVzdGVyIHJldHVybmVkIGlzID0gJWQuXG4iLCBtdWx0aWNsdXN0ZXJfc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICAvKiBGaXJzdCB3ZSBuZWVkIHRvIHJlbGVhc2UgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyB0aGF0IHdlcmUgKi8KLSAgICAvKiBvYnRhaW5lZCBieSB0aGUgcXVlcnkgKi8KLSAgICAgIHJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotICAgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYgc3RhdGUgbm90IHlldCBkZXRlcm1pbmVkICovCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiBub3Qgc2h1dGRvd24gKi8KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gbXVsdGljbHVzdGVyX3N0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBzZW5kIGNsdXN0ZXIgYWRkZWQgZXZlbnQgdG8gZ3VpIChhIGNsdXN0ZXIgdG8gTG9hZExldmVsZXIgaXMgYSAgICAgICAgKiAKLSAqIFBUUCBtYWNoaW5lIHRvIHRoZSBndWkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNlbmRNYWNoaW5lQWRkRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCkKLXsKLSAgcHJveHlfbXNnICptc2c7Ci0gIGNoYXIgcHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nWzI1Nl07Ci0gIGNoYXIgKm1hY2hpbmVfc3RhdGVfdG9fcmVwb3J0ID0gTUFDSElORV9TVEFURV9VTktOT1dOOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBjbHVzdGVyPSVzLiBzdGF0ZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX3N0YXRlKTsKLSAgbWVtc2V0KHByb3h5X2dlbmVyYXRlZF9jbHVzdGVyX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF9jbHVzdGVyX2lkX3N0cmluZykpOyAgIC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcsICIlZCIsIGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZCk7Ci0KLSAgc3dpdGNoIChjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9zdGF0ZSkgewotICAgIGNhc2UgTVlfU1RBVEVfVVA6Ci0gICAgICBtYWNoaW5lX3N0YXRlX3RvX3JlcG9ydCA9IE1BQ0hJTkVfU1RBVEVfVVA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1ZX1NUQVRFX0RPV046Ci0gICAgICBtYWNoaW5lX3N0YXRlX3RvX3JlcG9ydCA9IE1BQ0hJTkVfU1RBVEVfRE9XTjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBtYWNoaW5lX3N0YXRlX3RvX3JlcG9ydCA9IE1BQ0hJTkVfU1RBVEVfVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotICB9Ci0gIG1zZyA9IHByb3h5X25ld19tYWNoaW5lX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIGlibWxsX3Byb3h5X2Jhc2VfaWRfc3RyaW5nLCBwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUsIG1hY2hpbmVfc3RhdGVfdG9fcmVwb3J0KTsKLSAgZW5xdWV1ZV9ldmVudF90b19wcm94eV9zZXJ2ZXIobXNnKTsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBzZW5kIHF1ZXVlIGFxZGRlZCBldmVudCB0byBndWkgKG9uZSBwZXIgY2x1c3RlcikgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZW5kUXVldWVBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nWzI1Nl07Ci0gIGNoYXIgKnF1ZXVlX3N0YXRlX3RvX3JlcG9ydCA9IFFVRVVFX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIHF1ZXVlPSVzLiBzdGF0ZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUsIGNsdXN0ZXJfb2JqZWN0LT5xdWV1ZV9zdGF0ZSk7Ci0gIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZykpOyAgICAgICAvKiB6ZXJvIHRoZSBhcmVhICovCi0gIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZywgIiVkIiwgY2x1c3Rlcl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZCk7Ci0KLSAgc3dpdGNoIChjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9zdGF0ZSkgewotICAgIGNhc2UgTVlfU1RBVEVfVVA6Ci0gICAgICBxdWV1ZV9zdGF0ZV90b19yZXBvcnQgPSBRVUVVRV9TVEFURV9OT1JNQUw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcXVldWVfc3RhdGVfdG9fcmVwb3J0ID0gUVVFVUVfU1RBVEVfU1RPUFBFRDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgbXNnID0gcHJveHlfbmV3X3F1ZXVlX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIGlibWxsX3Byb3h5X2Jhc2VfaWRfc3RyaW5nLCBwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lLCBxdWV1ZV9zdGF0ZV90b19yZXBvcnQpOwotICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIHNlbmQgbm9kZSBhZGRlZCBldmVudCB0byBndWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNlbmROb2RlQWRkRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmdbMjU2XTsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmdbMjU2XTsKLSAgY2hhciAqbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VOS05PV047Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGNsdXN0ZXI9JXMuIG5vZGU9JXMuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSwgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSwgbm9kZV9vYmplY3QtPm5vZGVfc3RhdGUpOwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nKSk7ICAgLyogemVybyB0aGUgYXJlYSAqLwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nKSk7IC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcsICIlZCIsIGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZCk7Ci0gIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nLCAiJWQiLCBub2RlX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX25vZGVfaWQpOwotCi0gIHN3aXRjaCAobm9kZV9vYmplY3QtPm5vZGVfc3RhdGUpIHsKLSAgICBjYXNlIE1ZX1NUQVRFX1VQOgotICAgICAgbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9ET1dOOgotICAgICAgbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX0RPV047Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VOS05PV047Ci0gICAgICBicmVhazsKLSAgfQotCi0gIG1zZyA9IHByb3h5X25ld19ub2RlX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIHByb3h5X2dlbmVyYXRlZF9jbHVzdGVyX2lkX3N0cmluZywgMSk7ICAgICAgICAvKiAxPT1udW1iZXIgbmV3IG5vZGVzIGluIGNsdXN0ZXIgKi8KLSAgcHJveHlfYWRkX25vZGUobXNnLCBwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcsIG5vZGVfb2JqZWN0LT5ub2RlX25hbWUsIG5vZGVfc3RhdGVfdG9fcmVwb3J0LCAwKTsgLyogMD09ZXh0cmEgYXR0cmlidXRlcyAqLwotICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIHNlbmQgbm9kZSBjaGFuZ2VkIGV2ZW50IHRvIGd1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNlbmROb2RlQ2hhbmdlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmdbMjU2XTsKLSAgY2hhciAqbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VOS05PV047Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGNsdXN0ZXI9JXMuIG5vZGU9JXMuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSwgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSwgbm9kZV9vYmplY3QtPm5vZGVfc3RhdGUpOwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nKSk7IC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcsICIlZCIsIG5vZGVfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfbm9kZV9pZCk7Ci0KLSAgc3dpdGNoIChub2RlX29iamVjdC0+bm9kZV9zdGF0ZSkgewotICAgIGNhc2UgTVlfU1RBVEVfVVA6Ci0gICAgICBub2RlX3N0YXRlX3RvX3JlcG9ydCA9IE5PREVfU1RBVEVfVVA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1ZX1NUQVRFX0RPV046Ci0gICAgICBub2RlX3N0YXRlX3RvX3JlcG9ydCA9IE5PREVfU1RBVEVfRE9XTjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBub2RlX3N0YXRlX3RvX3JlcG9ydCA9IE5PREVfU1RBVEVfVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgbXNnID0gcHJveHlfbm9kZV9jaGFuZ2VfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgcHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nLCAxKTsgICAgICAgIC8qIDE9PW51bWJlciBuZXcgbm9kZXMgaW4gY2x1c3RlciAqLwotICBwcm94eV9hZGRfbm9kZShtc2csIHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZywgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSwgbm9kZV9zdGF0ZV90b19yZXBvcnQsIDApOyAvKiAwPT1leHRyYSBhdHRyaWJ1dGVzICovCi0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2VuZCBub2RlIHJlbW92ZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2VuZE5vZGVSZW1vdmVFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0LCBOb2RlT2JqZWN0ICogbm9kZV9vYmplY3QpCi17Ci0gIHByb3h5X21zZyAqbXNnOwotICBjaGFyIHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZ1syNTZdOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBjbHVzdGVyPSVzLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSwgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSk7Ci0gIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcpKTsgLyogemVybyB0aGUgYXJlYSAqLwotICBzcHJpbnRmKHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZywgIiVkIiwgbm9kZV9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9ub2RlX2lkKTsKLQotICBtc2cgPSBwcm94eV9yZW1vdmVfbm9kZV9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcpOwotICBlbnF1ZXVlX2V2ZW50X3RvX3Byb3h5X3NlcnZlcihtc2cpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIHNlbmQgam9iIGFkZGVkIGV2ZW50IHRvIGd1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNlbmRKb2JBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0LCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZ1syNTZdOwotICBjaGFyIHByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZF9zdHJpbmdbMjU2XTsKLSAgY2hhciBqb2JfbmFtZV9zdHJpbmdbMjU2XTsKLSAgY2hhciAqam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBqb2I9JXMuJWQuJWQuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUpOwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZykpOyAgIC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgbWVtc2V0KHByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nKSk7ICAgICAgIC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgbWVtc2V0KGpvYl9uYW1lX3N0cmluZywgJ1wwJywgc2l6ZW9mKGpvYl9uYW1lX3N0cmluZykpOyAgICAgICAvKiB6ZXJvIHRoZSBhcmVhICovCi0gIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICIlZCIsIGpvYl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9qb2JfaWQpOwotICBzcHJpbnRmKHByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZF9zdHJpbmcsICIlZCIsIGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfcXVldWVfaWQpOwotCi0gIHN3aXRjaCAoam9iX29iamVjdC0+am9iX3N0YXRlKSB7Ci0gICAgY2FzZSBNWV9TVEFURV9JRExFOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9SVU5OSU5HOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9SVU5OSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9TVE9QUEVEOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9URVJNSU5BVEVEOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9URVJNSU5BVEVEOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGpvYl9zdGF0ZV90b19yZXBvcnQgPSBKT0JfU1RBVEVfSU5JVDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc3ByaW50Zihqb2JfbmFtZV9zdHJpbmcsICIlcy4lZC4lZCIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYyk7Ci0gIG1zZyA9IHByb3h5X25ld19qb2JfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgcHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZywgcHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsIGpvYl9uYW1lX3N0cmluZywgam9iX3N0YXRlX3RvX3JlcG9ydCwgam9iX29iamVjdC0+Z3VpX2Fzc2lnbmVkX2pvYl9pZCk7Ci0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2VuZCBqb2IgY2hhbmdlZCBldmVudCB0byBndWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2VuZEpvYkNoYW5nZUV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZ1syNTZdOwotICBjaGFyIGpvYl9zdGF0ZV9zdHJpbmdbMjU2XTsKLSAgY2hhciAqam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBqb2I9JXMuJWQuJWQuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUpOwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZykpOyAgIC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgbWVtc2V0KGpvYl9zdGF0ZV9zdHJpbmcsICdcMCcsIHNpemVvZihqb2Jfc3RhdGVfc3RyaW5nKSk7ICAgICAvKiB6ZXJvIHRoZSBhcmVhICovCi0gIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICIlZCIsIGpvYl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9qb2JfaWQpOwotCi0gIHN3aXRjaCAoam9iX29iamVjdC0+am9iX3N0YXRlKSB7Ci0gICAgY2FzZSBNWV9TVEFURV9JRExFOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9SVU5OSU5HOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9SVU5OSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9TVE9QUEVEOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9URVJNSU5BVEVEOgotICAgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9URVJNSU5BVEVEOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGpvYl9zdGF0ZV90b19yZXBvcnQgPSBKT0JfU1RBVEVfSU5JVDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgbXNnID0gcHJveHlfam9iX2NoYW5nZV9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgMSk7Ci0gIHNwcmludGYoam9iX3N0YXRlX3N0cmluZywgIiVkIiwgam9iX29iamVjdC0+am9iX3N0YXRlKTsKLSAgcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobXNnLCBKT0JfU1RBVEVfQVRUUiwgam9iX3N0YXRlX3RvX3JlcG9ydCk7Ci0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2VuZCBqb2IgcmVtb3ZlZCBldmVudCB0byBndWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2VuZEpvYlJlbW92ZUV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZ1syNTZdOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBqb2I9JXMuJWQuJWQuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUpOwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZykpOyAgIC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgIiVkIiwgam9iX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX2pvYl9pZCk7Ci0KLSAgbXNnID0gcHJveHlfcmVtb3ZlX2pvYl9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZyk7Ci0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2VuZCB0YXNrIGFkZGVkIGV2ZW50IHRvIGd1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2VuZFRhc2tBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0LCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0LCBUYXNrT2JqZWN0ICogdGFza19vYmplY3QpCi17Ci0gIHByb3h5X21zZyAqbXNnOwotICBjaGFyIHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nWzI1Nl07Ci0gIGNoYXIgcHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nWzI1Nl07Ci0gIGNoYXIgbGxfdGFza19pZF9zdHJpbmdbMjU2XTsKLSAgY2hhciAqdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX1NUT1BQRUQ7Ci0gIE5vZGVPYmplY3QgKm5vZGVfb2JqZWN0ID0gTlVMTDsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gam9iPSVzLiVkLiVkLiBub2RlPSVzLiB0YXNrPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCB0YXNrX29iamVjdC0+bm9kZV9uYW1lLCB0YXNrX29iamVjdC0+bGxfdGFza19pZCk7Ci0gIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nKSk7ICAgLyogemVybyB0aGUgYXJlYSAqLwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nKSk7IC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgbWVtc2V0KGxsX3Rhc2tfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YobGxfdGFza19pZF9zdHJpbmcpKTsgICAvKiB6ZXJvIHRoZSBhcmVhICovCi0gIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICIlZCIsIGpvYl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9qb2JfaWQpOwotICBzcHJpbnRmKHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZywgIiVkIiwgdGFza19vYmplY3QtPnByb3h5X2dlbmVyYXRlZF90YXNrX2lkKTsKLSAgc3ByaW50ZihsbF90YXNrX2lkX3N0cmluZywgIiVkIiwgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQpOwotICBtc2cgPSBwcm94eV9uZXdfcHJvY2Vzc19ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgMSk7IC8qIDEgPT0gbnVtIHRhc2tzICovCi0KLSAgc3dpdGNoICh0YXNrX29iamVjdC0+dGFza19zdGF0ZSkgewotICAgIGNhc2UgTVlfU1RBVEVfSURMRToKLSAgICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9TVEFSVElORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVlfU1RBVEVfUlVOTklORzoKLSAgICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9SVU5OSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9TVE9QUEVEOgotICAgICAgdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX1NUT1BQRUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1ZX1NUQVRFX1RFUk1JTkFURUQ6Ci0gICAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfRVhJVEVEOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9TVEFSVElORzsKLSAgICAgIGJyZWFrOwotICB9Ci0KLQotICBwcm94eV9hZGRfcHJvY2Vzcyhtc2csIHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZywgbGxfdGFza19pZF9zdHJpbmcsIHRhc2tfc3RhdGVfdG9fcmVwb3J0LCAyKTsgICAvKiAyPWV4dHJhIGF0dHJzICovCi0KLSAgbm9kZV9vYmplY3QgPSBnZXRfbm9kZV9pbl9oYXNoKGNsdXN0ZXJfb2JqZWN0LT5ub2RlX2hhc2gsIHRhc2tfb2JqZWN0LT5ub2RlX25hbWUpOwotICBwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtc2csIFBST0NfTk9ERUlEX0FUVFIsIG5vZGVfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfbm9kZV9pZCk7IC8qIHByb3h5IG5vZGUgaWQgKi8KLSAgcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobXNnLCBQUk9DX0lOREVYX0FUVFIsIHRhc2tfb2JqZWN0LT5sbF90YXNrX2lkKTsgICAgICAgLyogbG9hZGxldmVsZXIgdGFzayBpZCAqLwotCi0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2VuZCB0YXNrIGNoYW5nZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2VuZFRhc2tDaGFuZ2VFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCwgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmdbMjU2XTsKLSAgY2hhciAqdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgbWVtc2V0KHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZykpOyAvKiB6ZXJvIHRoZSBhcmVhICovCi0gIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nLCAiJWQiLCB0YXNrX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWQpOwotICBtc2cgPSBwcm94eV9wcm9jZXNzX2NoYW5nZV9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsIDEpOwotCi0gIHN3aXRjaCAodGFza19vYmplY3QtPnRhc2tfc3RhdGUpIHsKLSAgICBjYXNlIE1ZX1NUQVRFX0lETEU6Ci0gICAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfU1RBUlRJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1ZX1NUQVRFX1JVTk5JTkc6Ci0gICAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfUlVOTklORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVlfU1RBVEVfU1RPUFBFRDoKLSAgICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9TVE9QUEVEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNWV9TVEFURV9URVJNSU5BVEVEOgotICAgICAgdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX0VYSVRFRDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfU1RBUlRJTkc7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG1zZywgUFJPQ19TVEFURV9BVFRSLCB0YXNrX3N0YXRlX3RvX3JlcG9ydCk7Ci0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2VuZCB0YXNrIHJlbW92ZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2VuZFRhc2tSZW1vdmVFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCwgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KQotewotICBwcm94eV9tc2cgKm1zZzsKLSAgY2hhciBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmdbMjU2XTsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nKSk7IC8qIHplcm8gdGhlIGFyZWEgKi8KLSAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsICIlZCIsIHRhc2tfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfdGFza19pZCk7Ci0gIG1zZyA9IHByb3h5X3JlbW92ZV9wcm9jZXNzX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZyk7Ci0gIGVucXVldWVfZXZlbnRfdG9fcHJveHlfc2VydmVyKG1zZyk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogR2VuZXJhdGUgYSB1bmlxdWUgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZ2VuZXJhdGVfaWQoKQotewotICByZXR1cm4gaWJtbGxfcHJveHlfYmFzZV9pZCArIGlibWxsX2xhc3RfaWQrKzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBTZW5kIGFuIGV2ZW50IG1lc3NhZ2UgKHByb3h5X21zZykgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5xdWV1ZV9ldmVudF90b19wcm94eV9zZXJ2ZXIocHJveHlfbXNnICogbXNnKQotewotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwcmludF9wcm94eV9tZXNzYWdlKG1zZyk7Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmcHJveHlfc3ZyX3F1ZXVlX21zZ19sb2NrKTsKLSAgcHJveHlfc3ZyX3F1ZXVlX21zZyhsbF9wcm94eSwgbXNnKTsKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJnByb3h5X3N2cl9xdWV1ZV9tc2dfbG9jayk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBQcmludCBjb21tYW5kIGFyZ3VtZW50cyBmcm9tIGd1aSBjb21tYW5kIGNhbGxzICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcmludF9tZXNzYWdlX2FyZ3MoaW50IG5hcmdzLCBjaGFyICpvcHRpb25hbF9hcmdzW10pCi17Ci0gIGludCBpID0gMDsKLSAgaWYgKG9wdGlvbmFsX2FyZ3MgIT0gTlVMTCkgewotICAgIHdoaWxlICgob3B0aW9uYWxfYXJnc1tpXSAhPSBOVUxMKSAmJiAoaSA8IG5hcmdzKSkgewotICAgICAgcHJpbnRfbWVzc2FnZShBUkdTX01FU1NBR0UsICIgJyVzJyIsIG9wdGlvbmFsX2FyZ3NbaSsrXSk7Ci0gICAgfQotICB9Ci0gIHByaW50X21lc3NhZ2UoQVJHU19NRVNTQUdFLCAiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBQcm94eSBzdGFydHVwIGFuZCBjb21tYW5kIGxvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgY2hhciAqdXNlcl9saWJwYXRoID0gTlVMTDsgICAgLyogZmluYWwgTG9hZExldmVsZXIgbGliIHBhdGggYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNoYXJlZCBsaWJyYXJ5IG5hbWUgKi8KLSAgY2hhciAqaG9zdCA9ICJsb2NhbGhvc3QiOwotICBjaGFyICpwcm94eV9zdHIgPSBERUZBVUxUX1BST1hZOwotICBpbnQgY2g7Ci0gIGludCBwb3J0ID0gUFJPWFlfVENQX1BPUlQ7Ci0gIGludCByYzsKLSAgc3RydWN0IHBhc3N3ZCAqcHdkOwotICBpbnQgaSA9IDA7Ci0gIGNoYXIgKmNwID0gTlVMTDsKLSAgaW50IG4gPSAwOwotCi0gIG4gPSAwOyAvKiBwcmV2ZW50IHdhcm5pbmcgb24gbGludXggZm9yIHVuc2VkIHZhciAodXNlZCBvbmx5IG9uIGFpeCkgKi8KLS8qIHByZXByb2Nlc3MgaW5wdXQgYXJncyB0byBzZXQgZGVidWcgbG9vcCBhbmQgbWVzc2FnZSBwcm9jZXNzaW5nIAotICogYmVmb3JlIHdlIGRvIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgaWYgKHN0cnN0cihhcmd2W2ldLCAiZGVidWdfbG9vcD15IikgIT0gTlVMTCkgewotICAgICAgc3RhdGVfZGVidWdfbG9vcCA9IDE7ICAgICAvKiB0dXJuIG9uIGhhcmQgbG9vcCBmb3IgYXR0YWNoaW5nIGRlYnVnZ2VyICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHN0cnN0cihhcmd2W2ldLCAidHJhY2VfbWVzc2FnZXM9eSIpICE9IE5VTEwpIHsKLSAgICAgIHN0YXRlX3RyYWNlID0gMTsgICAgICAgICAgLyogdHVybiBvbiB0cmFjaW5nIG1lc3NhZ2VzICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHN0cnN0cihhcmd2W2ldLCAiaW5mb19tZXNzYWdlcz15IikgIT0gTlVMTCkgewotICAgICAgc3RhdGVfaW5mbyA9IDE7ICAgICAgICAgICAvKiB0dXJuIG9uIGluZm8gbWVzc2FnZXMgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoc3Ryc3RyKGFyZ3ZbaV0sICJ3YXJuaW5nX21lc3NhZ2VzPXkiKSAhPSBOVUxMKSB7Ci0gICAgICBzdGF0ZV93YXJuaW5nID0gMTsgICAgICAgIC8qIHR1cm4gb24gd2FybmluZyBtZXNzYWdlcyAqLwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzdHJzdHIoYXJndltpXSwgImVycm9yX21lc3NhZ2VzPXkiKSAhPSBOVUxMKSB7Ci0gICAgICBzdGF0ZV9lcnJvciA9IDE7ICAgICAgICAgIC8qIHR1cm4gb24gZXJyb3IgbWVzc2FnZXMgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoc3Ryc3RyKGFyZ3ZbaV0sICJmYXRhbF9tZXNzYWdlcz15IikgIT0gTlVMTCkgewotICAgICAgc3RhdGVfZmF0YWwgPSAxOyAgICAgICAgICAvKiB0dXJuIG9uIGZhdGFsIG1lc3NhZ2VzICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHN0cnN0cihhcmd2W2ldLCAiYXJnc19tZXNzYWdlcz15IikgIT0gTlVMTCkgewotICAgICAgc3RhdGVfYXJncyA9IDE7ICAgICAgICAgICAvKiB0dXJuIG9uIGFyZ3MgbWVzc2FnZXMgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgfQotCi0KLSAgcmVnaXN0ZXJfdGhyZWFkKHB0aHJlYWRfc2VsZigpKTsKLQotLyogc2V0IGZvbGxvd2luZyBkaXJlY3RpdmUgdG8gImlmIDEiIGFuZCByZWNvbXBpbGUgdG8gdHVybiBvbiBkZWJ1ZywgImlmIDAiIGFuZCByZWNvbXBpbGUgdG8gdHVybiBvZmYgZGVidWcgKi8KLSAgaWYgKHN0YXRlX2RlYnVnX2xvb3ApIHsKLSAgICBpbnQgZGVidWdfbG9vcCA9IDE7Ci0gICAgd2hpbGUgKGRlYnVnX2xvb3AgPiAwKSB7Ci0gICAgICBpZiAoKGRlYnVnX2xvb3AgJSA2MCkgPT0gMSkgewotICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkRlYnVnIGxvb3AgLSBhdHRhY2ggZGVidWdnZXIsIHNldCBicmVha3BvaW50cyBhbmQgdGhlbiBjaGFuZ2UgZGVidWdfbG9vcCB0byAwIHRvIGNvbnRpbnVlLlxuIik7Ci0gICAgICB9Ci0gICAgICBkZWJ1Z19sb29wKys7Ci0gICAgICBzbGVlcCgxKTsKLSAgICB9Ci0gIH0KLQotICBnZXRob3N0bmFtZShob3N0bmFtZSxzaXplb2YoaG9zdG5hbWUpKTsKLSAgY3AgPSBzdHJjaHIoaG9zdG5hbWUsICcuJyk7Ci0gIGlmIChjcCAhPSBOVUxMKSB7Ci0gICAgICAqY3AgPSAnXDAnOwotICB9Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJNYWluIGNhbGxlZCB3aXRoIGFyZ1slZF09JXMuXG4iLCBpLCBhcmd2W2ldKTsKLSAgfQotCi0gIHB3ZCA9IGdldHB3dWlkKGdldHVpZCgpKTsKLSAgdXNlcmlkID0gc3RyZHVwKHB3ZC0+cHdfbmFtZSk7Ci0KLSNpZmRlZiBfX2xpbnV4X18gIAotICB3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6cDpoOmw6ZDp0Omk6dzplOmY6YTptOm86cjp4Onk6ejoiLCBsb25nb3B0cywgTlVMTCkpICE9IC0xKSB7Ci0gICAgc3dpdGNoIChjaCkgewotICAgICAgY2FzZSAnUCc6Ci0gICAgICAgIHByb3h5X3N0ciA9IHN0cmR1cChvcHRhcmcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3AnOgotICAgICAgICBwb3J0ID0gYXRvaShvcHRhcmcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2cnOgotICAgICAgICBkZWJ1Z19sZXZlbCA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdoJzoKLSAgICAgICAgaG9zdCA9IHN0cmR1cChvcHRhcmcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2wnOgotICAgICAgICB1c2VyX2xpYnBhdGggPSBzdHJkdXAob3B0YXJnKTsgIC8qIHVzZXIgaGFzIHNwZWNpZmllZCBvdmVycmlkZSBmdWxsIHBhdGggdG8gTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdtJzoKLSAgICAgICAgaWYgKHN0cm5jbXAob3B0YXJnLCAieSIsIDEpID09IDApIHsgICAgIC8qIHkgLSBtdWx0aWNsdXN0ZXIgZm9yY2VkIG9uICovCi0gICAgICAgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IDE7ICAgICAgLyogZm9yY2UgbXVsdGljbHVzdGVyICovCi0gICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvcHRhcmcsICJuIiwgMSkgPT0gMCkgeyAgICAgIC8qIG4gLSBtdWx0aWNsdXN0ZXIgZm9yY2VkIG9mZiAqLwotICAgICAgICAgIG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAwOyAgICAgIC8qIGZvcmNlIGxvY2FsICovCi0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIGQgLSBkZWZhdWx0IHRvIExvYWRMZXZlbGVyIGRldGVybWluZSBtdWx0aWNsdXN0ZXIgc3RhdGUgKi8KLSAgICAgICAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7ICAgICAvKiBhbGxvdyBMb2FkTGV2ZWxlciB0byBkZXRlcm1pbmUgbW9kZSAqLwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnbyc6Ci0gICAgICAgIHN0YXRpY190ZW1wbGF0ZV9vdmVycmlkZSA9IHN0cmR1cChvcHRhcmcpOyAgICAgIC8qIHVzZXIgc3VwcGxpZWQgdGVtcGxhdGUgZmlsZSBuYW1lICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAncic6Ci0gICAgICAgIGlmIChzdHJuY21wKG9wdGFyZywgInkiLCAxKSA9PSAwKSB7ICAgICAvKiB3cml0ZSB0ZW1wbGF0ZSBmaWxlIGFsd2F5cyAoYXQgbWFpbiBzdGFydHVwKSAqLwotICAgICAgICAgIHN0YXRlX3RlbXBsYXRlID0gMTsgICAvKiB3cml0ZSB0ZW1wbGF0ZSBhdCBldmVyeSBtYWluIHN0YXJ0dXAgKi8KLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogbiAtIGRvIG5vdCB3cml0ZSBkZWZhdWx0IHRlbXBsYXRlIGZpbGUgKi8KLSAgICAgICAgICBzdGF0ZV90ZW1wbGF0ZSA9IDA7ICAgLyogbmV2ZXIgd3JpdGUgdGVtcGxhdGUgZmlsZSAqLwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnZCc6ICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgcHJlcHJvY2Vzc2VkICovCi0gICAgICBjYXNlICd0JzogICAgICAgICAgICAgICAgLyogYWxyZWFkeSBwcmVwcm9jZXNzZWQgKi8KLSAgICAgIGNhc2UgJ2knOiAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IHByZXByb2Nlc3NlZCAqLwotICAgICAgY2FzZSAndyc6ICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgcHJlcHJvY2Vzc2VkICovCi0gICAgICBjYXNlICdlJzogICAgICAgICAgICAgICAgLyogYWxyZWFkeSBwcmVwcm9jZXNzZWQgKi8KLSAgICAgIGNhc2UgJ2YnOiAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IHByZXByb2Nlc3NlZCAqLwotICAgICAgY2FzZSAnYSc6ICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgcHJlcHJvY2Vzc2VkICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAneCc6ICAgICAgICAgICAgICAgIC8qIG1pbiBub2RlIHBvbGxpbmcgKi8KLSAgICAgICAgbWluX25vZGVfc2xlZXBfc2Vjb25kcyA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd5JzogICAgICAgICAgICAgICAgLyogbWF4IG5vZGUgcG9sbGluZyAqLwotICAgICAgICBtYXhfbm9kZV9zbGVlcF9zZWNvbmRzID0gYXRvaShvcHRhcmcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3onOiAgICAgICAgICAgICAgICAvKiBqb2IgcG9sbGluZyAqLwotICAgICAgICBqb2Jfc2xlZXBfc2Vjb25kcyA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICIlcyBbLS1Qcm94eT1wcm94eV0gWy0taG9zdD1ob3N0X25hbWVdIFstLXBvcnQ9cG9ydF0gWy0tZGVidWc9bGV2ZWxdIFstLWxpYl9vdmVycmlkZT1kaXJlY3RvcnldIFstLWRlYnVnX2xvb3A9eXxuXSBbLS10cmFjZV9tZXNzYWdlcz15fG5dIFstLWluZm9fbWVzc2FnZXM9eXxuXSBbLS13YXJuaW5nX21lc3NhZ2VzPXl8bl0gWy0tZXJyb3JfbWVzc2FnZXM9eXxuXSBbLS1mYXRhbF9tZXNzYWdlcz15fG5dIFstLWFyZ3NfbWVzc2FnZXM9eXxuXSBbLS1tdWx0aWNsdXN0ZXI9ZHxufHldIFstLXRlbXBsYXRlX292ZXJyaWRlPWZpbGVdIFstLXRlbXBsYXRlX3dyaXRlPXl8bl0gLS1ub2RlX3BvbGxpbmdfbWluPXZhbHVlIC0tbm9kZV9wb2xsaW5nX21heD12YWx1ZSAtLWpvYl9wb2xsaW5nPXZhbHVlIFxuIiwgYXJndlswXSk7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLSNlbHNlCi0gLyogQUlYIGRvZXMgbm90IGhhdmUgdGhlIGdldG9wdF9sb25nIGZ1bmN0aW9uLiBTaW5jZSB0aGUgcHJveHkgaXMKLSAgKiBpbnZva2VkIG9ubHkgYnkgdGhlIFBUUCBmcm9udCBlbmQsIHRoZSBmb2xsb3dpbmcgc2ltcGxpZmllZCBvcHRpb25zCi0gICogcGFyc2luZyBpcyBzdWZmaWNpZW50LgotICAqIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgbWFpbnRhaW5lZCBpbiBzeW5jIHdpdGggdGhlIGFib3ZlCi0gICogZ2V0b3B0X2xvbmcgbG9vcC4KLSAgKi8KLW4gPSAxOwotd2hpbGUgKG4gPCBhcmdjKSB7Ci0gY3AgPSBzdHJjaHIoYXJndltuXSwgJz0nKTsKLSBpZiAoY3AgIT0gTlVMTCkgewotICAgICAqY3AgPSAnXDAnOwotICAgICBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXByb3h5IikgPT0gMCkgewotICAgICAgICAgcHJveHlfc3RyID0gc3RyZHVwKGNwICsgMSk7Ci0gICAgICAgICBuID0gbiArIDE7Ci0gICAgIH0KLSAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXBvcnQiKSA9PSAwKSB7Ci0gICAgICAgICBwb3J0ID0gYXRvaShjcCArIDEpOwotICAgICAgICAgbiA9IG4gKyAxOwotICAgICB9Ci0gICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1ob3N0IikgPT0gMCkgewotICAgICAgICAgaG9zdCA9IHN0cmR1cChjcCArIDEpOwotICAgICAgICAgbiA9IG4gKyAxOwotICAgICB9Ci0gICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1saWJfb3ZlcnJpZGUiKSA9PSAwKSB7Ci0gICAgCSB1c2VyX2xpYnBhdGggPSBzdHJkdXAoY3AgKyAxKTsgIC8qIHVzZXIgaGFzIHNwZWNpZmllZCBvdmVycmlkZSBmdWxsIHBhdGggdG8gTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAgICAgICAgICAgbiA9IG4gKyAxOwotICAgICAgICAgIH0KLSAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLW11bHRpY2x1c3RlciIpID09IDApIHsKLSAgICAJIGlmIChzdHJuY21wKGNwICsgMSwgInkiLCAxKSA9PSAwKSB7ICAgICAvKiB5IC0gbXVsdGljbHVzdGVyIGZvcmNlZCBvbiAqLwotICAgIAkgICAgICAgICAgIG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAxOyAgICAgIC8qIGZvcmNlIG11bHRpY2x1c3RlciAqLwotICAgIAkgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoY3AgKyAxLCAibiIsIDEpID09IDApIHsgICAgICAvKiBuIC0gbXVsdGljbHVzdGVyIGZvcmNlZCBvZmYgKi8KLSAgICAJICAgICAgICAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gMDsgICAgICAvKiBmb3JjZSBsb2NhbCAqLwotICAgIAkgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBkIC0gZGVmYXVsdCB0byBMb2FkTGV2ZWxlciBkZXRlcm1pbmUgbXVsdGljbHVzdGVyIHN0YXRlICovCi0gICAgCSAgICAgICAgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IC0xOyAgICAgLyogYWxsb3cgTG9hZExldmVsZXIgdG8gZGV0ZXJtaW5lIG1vZGUgKi8KLSAgICAJICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXRlbXBsYXRlX292ZXJyaWRlIikgPT0gMCkgewotICAgIAkgc3RhdGljX3RlbXBsYXRlX292ZXJyaWRlID0gc3RyZHVwKGNwICsgMSk7ICAgICAgLyogdXNlciBzdXBwbGllZCB0ZW1wbGF0ZSBmaWxlIG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICBuID0gbiArIDE7Ci0gICAgICAgICAgICAgICB9Ci0gICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS10ZW1wbGF0ZV93cml0ZSIpID09IDApIHsKLSAgICAJIGlmIChzdHJuY21wKGNwICsgMSwgInkiLCAxKSA9PSAwKSB7ICAgICAvKiB3cml0ZSB0ZW1wbGF0ZSBmaWxlIGFsd2F5cyAoYXQgbWFpbiBzdGFydHVwKSAqLwotICAgIAkgICAgICAgICAgIHN0YXRlX3RlbXBsYXRlID0gMTsgICAvKiB3cml0ZSB0ZW1wbGF0ZSBhdCBldmVyeSBtYWluIHN0YXJ0dXAgKi8KLSAgICAJICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogbiAtIGRvIG5vdCB3cml0ZSBkZWZhdWx0IHRlbXBsYXRlIGZpbGUgKi8KLSAgICAJICAgICAgICAgICBzdGF0ZV90ZW1wbGF0ZSA9IDA7ICAgLyogbmV2ZXIgd3JpdGUgdGVtcGxhdGUgZmlsZSAqLwotICAgIAkgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgbiA9IG4gKyAxOwotICAgICAgICAgICAgICAgfQotICAgICBlbHNlIGlmICgoc3RyY21wKGFyZ3Zbbl0sICItLWRlYnVnX2xvb3AiKSA9PSAwKSB8fCAvKiBhbHJlYWR5IHByZXByb2Nlc3NlZCAqLwotICAgIAkgICAgICAoc3RyY21wKGFyZ3Zbbl0sICItLXRyYWNlX21lc3NhZ2VzIikgPT0gMCkgfHwgLyogYWxyZWFkeSBwcmVwcm9jZXNzZWQgKi8KLSAgICAJICAgICAgKHN0cmNtcChhcmd2W25dLCAiLS1pbmZvX21lc3NhZ2VzIikgPT0gMCkgfHwgLyogYWxyZWFkeSBwcmVwcm9jZXNzZWQgKi8KLSAgICAJICAgICAgKHN0cmNtcChhcmd2W25dLCAiLS13YXJuaW5nX21lc3NhZ2VzIikgPT0gMCkgfHwgLyogYWxyZWFkeSBwcmVwcm9jZXNzZWQgKi8KLSAgICAJICAgICAgKHN0cmNtcChhcmd2W25dLCAiLS1lcnJvcl9tZXNzYWdlcyIpID09IDApIHx8IC8qIGFscmVhZHkgcHJlcHJvY2Vzc2VkICovCi0gICAgCSAgICAgIChzdHJjbXAoYXJndltuXSwgIi0tZmF0YWxfbWVzc2FnZXMiKSA9PSAwKSB8fCAvKiBhbHJlYWR5IHByZXByb2Nlc3NlZCAqLwotICAgIAkJICAoc3RyY21wKGFyZ3Zbbl0sICItLWFyZ3NfbWVzc2FnZXMiKSA9PSAwKSkgeyAvKiBhbHJlYWR5IHByZXByb2Nlc3NlZCAqLwotICAgICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLW5vZGVfcG9sbGluZ19taW4iKSA9PSAwKSB7Ci0gICAgCSBtaW5fbm9kZV9zbGVlcF9zZWNvbmRzID0gYXRvaShjcCArIDEpOwotICAgICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLW5vZGVfcG9sbGluZ19tYXgiKSA9PSAwKSB7Ci0gICAgCSBtYXhfbm9kZV9zbGVlcF9zZWNvbmRzID0gYXRvaShjcCArIDEpOwotICAgICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLWRlYnVnIikgPT0gMCkgewotICAgICAJICAgIGRlYnVnX2xldmVsID0gYXRvaShjcCArIDEpOwotICAgICAJCW4gPSBuICsgMTsKLSAgICAgCSAgICB9Ci0gICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1qb2JfcG9sbGluZyIpID09IDApIHsKLSAgICAJICBqb2Jfc2xlZXBfc2Vjb25kcyA9IGF0b2koY3AgKyAxKTsKLSAgICAgICAgICAgICAgICAgICBuID0gbiArIDE7Ci0gICAgICAgICAgICAgICB9Ci0gICAgIGVsc2UgewotICAgICAgICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiSW52YWxpZCBhcmd1bWVudCAlcyAoJWQpXG4iLCBhcmd2W25dLCBuKTsKLSAgICAgICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIiVzIFstLVByb3h5PXByb3h5XSBbLS1ob3N0PWhvc3RfbmFtZV0gWy0tcG9ydD1wb3J0XSBbLS1saWJfb3ZlcnJpZGU9ZGlyZWN0b3J5XSBbLS1kZWJ1Z19sb29wPXl8bl0gWy0tdHJhY2VfbWVzc2FnZXM9eXxuXSBbLS1pbmZvX21lc3NhZ2VzPXl8bl0gWy0td2FybmluZ19tZXNzYWdlcz15fG5dIFstLWVycm9yX21lc3NhZ2VzPXl8bl0gWy0tZmF0YWxfbWVzc2FnZXM9eXxuXSBbLS1hcmdzX21lc3NhZ2VzPXl8bl0gWy0tbXVsdGljbHVzdGVyPWR8bnx5XSBbLS10ZW1wbGF0ZV9vdmVycmlkZT1maWxlXSBbLS10ZW1wbGF0ZV93cml0ZT15fG5dIC0tbm9kZV9wb2xsaW5nX21pbj12YWx1ZSAtLW5vZGVfcG9sbGluZ19tYXg9dmFsdWUgLS1qb2JfcG9sbGluZz12YWx1ZSBcbiIsIGFyZ3ZbMF0pOwotICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICAgfQotIH0KLX0KLSAKLSNlbmRpZgotICBwdHBfc2lnbmFsX2V4aXQgPSAwOwotICBwdHBfc2lnbmFsX3RocmVhZCA9IC0xOwotICBzaWduYWwoU0lHSU5ULCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotICBzaWduYWwoU0lHSFVQLCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotICBzaWduYWwoU0lHSUxMLCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotICBzaWduYWwoU0lHU0VHViwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLSAgc2lnbmFsKFNJR1RFUk0sIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0gIHNpZ25hbChTSUdRVUlULCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotICBzaWduYWwoU0lHQUJSVCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLSAgcmMgPSBzZXJ2ZXIocHJveHlfc3RyLCBob3N0LCBwb3J0LCB1c2VyX2xpYnBhdGgpOwotICBzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPSAxOwotICBleGl0KHJjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBIYW5kbGUgYSBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUkVUU0lHVFlQRSBwdHBfc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKLXsKLSAgcHRwX3NpZ25hbF9leGl0ID0gc2lnOwotICBwdHBfc2lnbmFsX3RocmVhZCA9IGZpbmRfdGhyZWFkKHB0aHJlYWRfc2VsZigpKTsKLSAgaWYgKHNpZyA+PSAwICYmIHNpZyA8IE5TSUcpIHsKLSAgICBSRVRTSUdUWVBFKCpzYXZlZF9zaWduYWwpIChpbnQpID0gc2F2ZWRfc2lnbmFsc1tzaWddOwotICAgIGlmIChzYXZlZF9zaWduYWwgIT0gU0lHX0VSUiAmJiBzYXZlZF9zaWduYWwgIT0gU0lHX0lHTiAmJiBzYXZlZF9zaWduYWwgIT0gU0lHX0RGTCkgewotICAgICAgc2F2ZWRfc2lnbmFsKHNpZyk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBQcmludCBtZXNzYWdlICh3aXRoIHRpbWUgYW5kIGRhdGUgYW5kIHRocmVhZCBpZCkgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqIEluZm8sIFRyYWNlLCBBcmcgYW5kIFdhcm5pbmcgbWVzc2FnZXMgZ28gdG8gc3Rkb3V0LiAgICAgICAgICAgICAgICAgICAqIAotICogRXJyb3IgYW5kIEZhdGFsIG1lc3NhZ2VzIGdvIHRvIHN0ZGVyci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHByaW50X21lc3NhZ2UoaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFwOwotICBjaGFyIHRpbWVidWZbMjBdOwotICB0aW1lX3QgbXlfY2xvY2s7Ci0gIHN0cnVjdCB0bSBhX3RtOwotICBpbnQgdGhyZWFkX2lkID0gMDsKLQotICBtZW1zZXQodGltZWJ1ZiwgJ1wwJywgc2l6ZW9mKHRpbWVidWYpKTsgICAgICAgLyogemVybyB0aGUgYXJlYSAqLwotICBwdGhyZWFkX211dGV4X2xvY2soJnByaW50X21lc3NhZ2VfbG9jayk7Ci0gIHB0aHJlYWRfdCB0aWQgPSBwdGhyZWFkX3NlbGYoKTsgICAgICAgLyogd2hhdCB0aHJlYWQgYW0gSSA/ICovCi0gIGZvciAodGhyZWFkX2lkID0gMDsgdGhyZWFkX2lkIDwgKHNpemVvZih0aHJlYWRfbWFwX3RhYmxlKSAvIHNpemVvZihwdGhyZWFkX3QpKTsgdGhyZWFkX2lkKyspIHsKLSAgICBpZiAodGlkID09IHRocmVhZF9tYXBfdGFibGVbdGhyZWFkX2lkXSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHRpbWUoJm15X2Nsb2NrKTsgICAgICAgICAgICAgICAgIC8qIHdoYXQgdGltZSBpcyBpdCA/ICovCi0gIGxvY2FsdGltZV9yKCZteV9jbG9jaywgJmFfdG0pOwotICBzdHJmdGltZSgmdGltZWJ1ZlswXSwgMTUsICIlbS8lZCAlMDJIOiUwMk06JTAyUyIsICZhX3RtKTsKLQotICB2YV9zdGFydChhcCwgZm9ybWF0KTsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBJTkZPX01FU1NBR0U6Ci0gICAgICBpZiAoc3RhdGVfaW5mbyA9PSAxKSB7ICAgIC8qIGlmIGluZm8gbWVzc2FnZXMgYWxsb3dlZCAqLwotICAgICAgICBpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRvdXQsICIlcyAiLCB0aW1lYnVmKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdGVfbWVzc2FnZV90aHJlYWRpZCAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRvdXQsICJUKCVkKSAiLCB0aHJlYWRfaWQpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiSW5mbzogIik7Ci0gICAgICAgIHZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUUkFDRV9NRVNTQUdFOgotICAgICAgaWYgKHN0YXRlX3RyYWNlID09IDEpIHsgICAvKiBpZiB0cmFjZSBtZXNzYWdlcyBhbGxvd2VkICovCi0gICAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVzICIsIHRpbWVidWYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlQoJWQpICIsIHRocmVhZF9pZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJUcmFjZTogIik7Ci0gICAgICAgIHZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXQVJOSU5HX01FU1NBR0U6Ci0gICAgICBpZiAoc3RhdGVfd2FybmluZyA9PSAxKSB7IC8qIGlmIHdhcm5pbmcgbWVzc2FnZXMgYWxsb3dlZCAqLwotICAgICAgICBpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRvdXQsICIlcyAiLCB0aW1lYnVmKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdGVfbWVzc2FnZV90aHJlYWRpZCAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRvdXQsICJUKCVkKSAiLCB0aHJlYWRfaWQpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiV2FybmluZzogIik7Ci0gICAgICAgIHZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFUlJPUl9NRVNTQUdFOgotICAgICAgaWYgKHN0YXRlX2Vycm9yID09IDEpIHsgICAvKiBpZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkICovCi0gICAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICIsIHRpbWVidWYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlQoJWQpICIsIHRocmVhZF9pZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogIik7Ci0gICAgICAgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcCk7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGQVRBTF9NRVNTQUdFOiAgICAgICAgLyogZmF0YWwgbWVzc2FnZXMgYXJlIG5ldmVyIHN1cHByZXNzZWQgKi8KLSAgICAgIGlmIChzdGF0ZV9mYXRhbCA9PSAxKSB7ICAgLyogaWYgZmF0YWwgbWVzc2FnZXMgYWxsb3dlZCAqLwotICAgICAgICBpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyAiLCB0aW1lYnVmKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdGVfbWVzc2FnZV90aHJlYWRpZCAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUKCVkKSAiLCB0aHJlYWRfaWQpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmF0YWw6ICIpOwotICAgICAgICB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXApOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJHU19NRVNTQUdFOgotICAgICAgaWYgKHN0YXRlX2FyZ3MgPT0gMSkgeyAgICAvKiBpZiBmb3JtYXR0ZWQgYXJnIG1lc3NhZ2VzIGFyZSBhbGxvd2VkICovCi0gICAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVzICIsIHRpbWVidWYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlQoJWQpICIsIHRocmVhZF9pZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJBcmdzOiAiKTsKLSAgICAgICAgdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJcbiIpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIC8qIHVua25vd24gbWVzc2FnZSB0eXBlIC0gYWxsb3cgaXQgKi8KLSAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlICE9IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIlcyAiLCB0aW1lYnVmKTsKLSAgICAgIH0KLSAgICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJUKCVkKSAiLCB0aHJlYWRfaWQpOwotICAgICAgfQotICAgICAgZnByaW50ZihzdGRvdXQsICI6ICIpOwotICAgICAgdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICB2YV9lbmQoYXApOwotCi0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwcmludF9tZXNzYWdlX2xvY2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIG1haW4gcHJveHkgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgc2VydmVyKGNoYXIgKm5hbWUsIGNoYXIgKmhvc3QsIGludCBwb3J0LCBjaGFyICp1c2VyX2xpYnBhdGgpCi17Ci0vKiAKLSAqIEluaXRpYWxpemUgdGhlIHByb3h5LCBjb25uZWN0IHRvIGZyb250IGVuZCwgdGhlbiBydW4gdGhlIG1haW4gbG9vcAotICogdW50aWwgdGhlIHByb3h5IGlzIHJlcXVlc3RlZCB0byBzaHV0IGRvd24uCi0gKi8KLSAgY2hhciBzaGFyZWRfYnVmZmVyWzEwMjRdOwotICBjaGFyICptc2cxID0gTlVMTDsKLSAgY2hhciAqbXNnMiA9IE5VTEw7Ci0gIGludCByYyA9IDA7Ci0gIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQgPSB7Ci0gICAgMCwgMjAwMDAKLSAgfTsKLSAgaW50IGxpYl9mb3VuZCA9IDA7Ci0gIGludCBzdGF0dXMgPSAwOwotICBzdHJ1Y3Qgc3RhdCBzdGF0aW5mbzsKLSAgaW50IGkgPSAwOwotICBpbnQgc2F2ZV9lcnJubyA9IDA7Ci0gIGludCBjb25uZWN0X3JjPTA7Ci0jaWZkZWYgIF9fbGludXhfXwotICBjaGFyICpsaWJwYXRoW10gPSB7Ci0gICAgTlVMTCwgIi9vcHQvaWJtbGwvTG9hZEwvZnVsbC9saWIvIiwgIi9vcHQvaWJtbGwvTG9hZEwvc28vbGliLyIsIChjaGFyICopIC0xCi0gIH07Ci0gIGNoYXIgKmxpYm5hbWUgPSAibGlibGxhcGkuc28iOwotI2Vsc2UKLSAgY2hhciAqbGlicGF0aFtdID0gewotICAgIE5VTEwsICIvdXNyL2xwcC9Mb2FkTC9mdWxsL2xpYiIsICIvdXNyL2xwcC9Mb2FkTC9zby9saWIiLCAiL29wdC9pYm1sbC9Mb2FkTC9mdWxsL2xpYi8iLCAiL29wdC9pYm1sbC9Mb2FkTC9zby9saWIvIiwgKGNoYXIgKikgLTEKLSAgfTsKLSAgY2hhciAqbGlibmFtZSA9ICJsaWJsbGFwaS5hIjsKLSNlbmRpZgotICBpbnQgdGVtcGxhdGVfd3JpdGUgPSAxOyAgICAgICAvKiBwcmVzZXQgdG8gd3JpdGUgKi8KLSAgRklMRSAqdGVtcGxhdGVfRklMRSA9IE5VTEw7Ci0gIGludCB0ZW1wbGF0ZV9jb3VudCA9IDA7Ci0KLSAgbWVtc2V0KHNoYXJlZF9idWZmZXIsICdcMCcsIHNpemVvZihzaGFyZWRfYnVmZmVyKSk7ICAgLyogemVybyB0aGUgYXJlYSAqLwotICBtZW1zZXQoc3RhdGljX3RlbXBsYXRlX25hbWUsICdcMCcsIHNpemVvZihzdGF0aWNfdGVtcGxhdGVfbmFtZSkpOyAgICAgLyogemVybyB0aGUgYXJlYSAqLwotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICogRmluZCB0aGUgTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgd2UgYXJlIHVzaW5nIGZvciBBSVggb3IgTGludXguICAgICoKLSAgICogSWYgd2UgY2Fubm90IGZpbmQgaXQgdGhlbiBMb2FkTGV2ZWxlciBpcyBub3QgaW5zdGFsbGVkIG9yIHdlIGhhdmUgICAgICogCi0gICAqICBiZWVuIGRpcmVjdGVkIHRvIHVzZSB0aGUgd3JvbmcgcGF0aC4gIElmIHdlIGZpbmQgaXQgT0sgdGhlbiB3ZSB3aWxsICAqCi0gICAqIHRyeSB0byBkeW5hbWljIG9wZW4gdGhlIGxpYnJhcnkgYW5kIGNvbXBhcmUgdmVyc2lvbnMgbGF0ZXIgaW4gdGhlICAgICAqCi0gICAqIGNvbW1hbmRfaW5pdGlhbGl6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYgKHVzZXJfbGlicGF0aCAhPSBOVUxMKSB7ICAgLyogaWYgdXNlciBzcGVjaWZpZWQgbGliICovCi0gICAgaWYgKHN0cmxlbih1c2VyX2xpYnBhdGgpID4gMCkgeyAgICAgLyogaWYgbm90IGEgbnVsbCBzdHJpbmcgKi8KLSAgICAgIGxpYnBhdGhbMF0gPSB1c2VyX2xpYnBhdGg7ICAgICAgICAvKiBwaWNrIHVwIHVzZXIgc3BlY2lmaWVkIGxpYnBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcyBvbmx5IG9uZSB0byBjaGVjayAqLwotICAgICAgbGlicGF0aFsxXSA9IChjaGFyICopIC0xOyAvKiBuZXcgZW5kIG9mIGxpc3QgKi8KLSAgICB9Ci0gIH0KLQotICBsaWJfZm91bmQgPSAwOyAgICAgICAgICAgICAgICAvKiBwcmVzZXQgdG8gbm90IGZvdW5kICovCi0gIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2VhcmNoaW5nIGZvciBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeS5cbiIpOwotICB3aGlsZSAoKGxpYnBhdGhbaV0gIT0gKGNoYXIgKikgLTEpICYmIChsaWJfZm91bmQgPT0gMCkpIHsgICAgIC8qIGlmIG5vdCBlbmQgb2YgbGlzdCBhbmQgbm90IHlldCBmb3VuZCAqLwotICAgIGlmIChsaWJwYXRoW2ldICE9IE5VTEwpIHsgICAvKiBpZiB2YWxpZCBlbnRyeSAqLwotICAgICAgc3RyY3B5KHNoYXJlZF9idWZmZXIsIGxpYnBhdGhbaV0pOwotICAgICAgc3RyY2F0KHNoYXJlZF9idWZmZXIsICIvIik7Ci0gICAgICBzdHJjYXQoc2hhcmVkX2J1ZmZlciwgbGlibmFtZSk7Ci0gICAgLyogc2VlIGlmIHRoaXMgaXMgYSB2YWxpZCBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSAqLwotICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJUcnlpbmc6ICVzXG4iLCBzaGFyZWRfYnVmZmVyKTsKLSAgICAgIHN0YXR1cyA9IHN0YXQoc2hhcmVkX2J1ZmZlciwgJnN0YXRpbmZvKTsKLSAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotI2lmZGVmIF9BSVgKLSAgICAgIHN0cmNhdChzaGFyZWRfYnVmZmVyLCIoc2hyLm8pIik7Ci0jZW5kaWYKLSAgICAgICAgaWJtbGxfbGlicGF0aF9uYW1lID0gc3RyZHVwKHNoYXJlZF9idWZmZXIpOwotICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlN1Y2Nlc3NmdWwgc2VhcmNoOiBGb3VuZCBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSAlc1xuIiwgaWJtbGxfbGlicGF0aF9uYW1lKTsKLSAgICAgICAgbGliX2ZvdW5kID0gMTsgICAgICAgICAgLyogd2UgZm91bmQgaXQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJTZWFyY2ggZmFpbHVyZTogXCJzdGF0XCIgb2YgTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgJXMgcmV0dXJuZWQgZXJybm89JWQuXG4iLCBzaGFyZWRfYnVmZmVyLCBzYXZlX2Vycm5vKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaSsrOwotICB9Ci0KLSAgaWYgKGxpYl9mb3VuZCA9PSAwKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShGQVRBTF9NRVNTQUdFLCAiTm8gTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgZm91bmQgLSBxdWl0dGluZy4uLlxuIik7Ci0gICAgc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID0gMTsKLSAgICBleGl0KDk5KTsKLSAgfQotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgKiBJZiBhbGxvd2VkLCB3cml0ZSB0aGUgdGVtcGxhdGUgZmlsZSB0byAvdG1wICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgKiBUZW1wbGF0ZSBmaWxlIHdpbGwgYmUgc2F2ZWQgd2l0aCB1c2VyaWQgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgKiAvdG1wL1BUUF9JQk1MTF9URU1QTEFURV91c2VyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgc3dpdGNoIChzdGF0ZV90ZW1wbGF0ZSkgewotICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCB3cml0ZSB0ZW1wbGF0ZSBmaWxlICovCi0gICAgICB0ZW1wbGF0ZV93cml0ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAvKiBhbHdheXMgd3JpdGUgdGVtcGxhdGUgZmlsZSAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICB0ZW1wbGF0ZV93cml0ZSA9IDE7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmICh0ZW1wbGF0ZV93cml0ZSA9PSAxKSB7Ci0gICAgc3RyY3B5KCZzdGF0aWNfdGVtcGxhdGVfbmFtZVswXSwgc3RhdGljX3RlbXBsYXRlX3ByZWZpeCk7Ci0gICAgc3RyY3B5KCZzdGF0aWNfdGVtcGxhdGVfbmFtZVtzdHJsZW4oc3RhdGljX3RlbXBsYXRlX3ByZWZpeCldLCB1c2VyaWQpOwotICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiV3JpdGluZyBqb2IgY29tbWFuZCB0ZW1wbGF0ZSBmaWxlICVzLlxuIiwgc3RhdGljX3RlbXBsYXRlX25hbWUpOwotCi0gICAgdGVtcGxhdGVfRklMRSA9IGZvcGVuKHN0YXRpY190ZW1wbGF0ZV9uYW1lLCAidyIpOyAgIC8qIHJlc2V0IGZpbGUgbGVuZ3RoIHRvIDAgb3IgY3JlYXRlIGZpbGUgKi8KLSAgICB0ZW1wbGF0ZV9jb3VudCA9IHNpemVvZihqb2JfY29tbWFuZF9maWxlX3RlbXBsYXRlKSAvIHNpemVvZihqb2JfY29tbWFuZF9maWxlX3RlbXBsYXRlWzBdKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wbGF0ZV9jb3VudDsgaSsrKSB7Ci0gICAgICBmcHV0cyhqb2JfY29tbWFuZF9maWxlX3RlbXBsYXRlW2ldLCB0ZW1wbGF0ZV9GSUxFKTsKLSAgICAgIGZwdXRzKCJcbiIsIHRlbXBsYXRlX0ZJTEUpOwotICAgIH0KLSAgICBmY2xvc2UodGVtcGxhdGVfRklMRSk7Ci0KLSAgfQotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgKiBjb250aW51ZSBwcm94eSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgZXZlbnRzID0gTmV3TGlzdCgpOwotICBpZiAocHJveHlfc3ZyX2luaXQobmFtZSwgJnRpbWVvdXQsICZoZWxwZXJfZnVuY3MsICZjb21tYW5kX3RhYiwgJmxsX3Byb3h5KSAhPSBQUk9YWV9SRVNfT0spIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICgoY29ubmVjdF9yYyA9IHByb3h5X3N2cl9jb25uZWN0KGxsX3Byb3h5LCBob3N0LCBwb3J0KSkgPT0gUFJPWFlfUkVTX09LKSB7Ci0gIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiUnVubmluZyBwcm94eSBvbiBwb3J0ICVkLlxuIiwgcG9ydCk7Ci0gIHdoaWxlIChwdHBfc2lnbmFsX2V4aXQgPT0gMCAmJiBzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPT0gMCkgewotICAgIGlmICgocHJveHlfc3ZyX3Byb2dyZXNzKGxsX3Byb3h5KSAhPSBQUk9YWV9SRVNfT0spKSB7Ci0gICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkVuZGluZyBub2RlIG1vbml0b3IgbG9vcFxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAocHRwX3NpZ25hbF9leGl0ICE9IDApIHsKLSAgICBzd2l0Y2ggKHB0cF9zaWduYWxfZXhpdCkgewotICAgICAgY2FzZSBTSUdJTlQ6Ci0gICAgICAgIG1zZzEgPSAiSU5UIjsKLSAgICAgICAgbXNnMiA9ICJJbnRlcnJ1cHQiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0lHSFVQOgotICAgICAgICBtc2cxID0gIkhVUCI7Ci0gICAgICAgIG1zZzIgPSAiSGFuZ3VwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJR0lMTDoKLSAgICAgICAgbXNnMSA9ICJJTEwiOwotICAgICAgICBtc2cyID0gIklsbGVnYWwgSW5zdHJ1Y3Rpb24iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0lHU0VHVjoKLSAgICAgICAgbXNnMSA9ICJTRUdWIjsKLSAgICAgICAgbXNnMiA9ICJTZWdtZW50YXRpb24gVmlvbGF0aW9uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJR1RFUk06Ci0gICAgICAgIG1zZzEgPSAiVEVSTSI7Ci0gICAgICAgIG1zZzIgPSAiVGVybWluYXRpb24iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0lHUVVJVDoKLSAgICAgICAgbXNnMSA9ICJRVUlUIjsKLSAgICAgICAgbXNnMiA9ICJRdWl0IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJR0FCUlQ6Ci0gICAgICAgIG1zZzEgPSAiQUJSVCI7Ci0gICAgICAgIG1zZzIgPSAiUHJvY2VzcyBBYm9ydGVkIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBtc2cxID0gIioqKlVOS05PV04gU0lHTkFMKioqIjsKLSAgICAgICAgbXNnMiA9ICJFUlJPUiAtIFVOS05PV04gU0lHTkFMIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHByaW50X21lc3NhZ2UoRkFUQUxfTUVTU0FHRSwgIiMjIyMjIyBTSUdOQUw6ICVpICglcykgZGV0ZWN0ZWQgaW4gVCglaSlcbiIsIHB0cF9zaWduYWxfZXhpdCwgbXNnMSwgcHRwX3NpZ25hbF90aHJlYWQpOwotICAgIHByaW50X21lc3NhZ2UoRkFUQUxfTUVTU0FHRSwgIiMjIyMjIyBTaHV0dGluZyBkb3duIHByb3h5XG4iKTsKLSAgICBwcmludF9tZXNzYWdlKEZBVEFMX01FU1NBR0UsICJwdHBfaWJtbGxfcHJveHkgcmVjZWl2ZWQgc2lnbmFsICVzICglcykgYW5kIGlzIGV4aXRpbmcuXG4iLCBtc2cxLCBtc2cyKTsKLSAgLyogb3VyIHJldHVybiBjb2RlID0gdGhlIHNpZ25hbCB0aGF0IGZpcmVkICovCi0gICAgcmMgPSBwdHBfc2lnbmFsX2V4aXQ7Ci0gIH0KLSAgfQotICBlbHNlIHsKLSAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwicHJveHkgY29ubmVjdGlvbiBmYWlsZWQuIHJjPSVkXG4iLGNvbm5lY3RfcmMpOwotICB9Ci0gIHByb3h5X3N2cl9maW5pc2gobGxfcHJveHkpOwotICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgInByb3h5X3N2cl9maW5pc2ggcmV0dXJuZWQuXG4iKTsKLSAgc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID0gMTsKLSAgcmV0dXJuIHJjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIENhbGwgTG9hZExldmVsZXIgdG8gcmV0cmlldmUgdGhlIGNsdXN0ZXIgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXlfbGxfY2x1c3RlcihpbnQgdmVyc2lvbiwgTExfZWxlbWVudCAqKiBlcnJPYmosIExMX2NsdXN0ZXJfcGFyYW0gKiBjcCkKLXsKLSAgaW50IHJjID0gMDsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIHZlcnNpb249JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCB2ZXJzaW9uKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIHJjID0gKCpMTF9TWU1TLmxsX2NsdXN0ZXIpICh2ZXJzaW9uLCBlcnJPYmosIGNwKTsgICAgIC8qIHNldCB0aGUgY2x1c3RlciBuYW1lICovCi0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIGlmIChyYyAhPSAwKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJMb2FkTGV2ZWxlciBsbF9jbHVzdGVyIHJjPSVkLlxuIiwgcmMpOwotICB9Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHJjPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmMpOwotICByZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogQ2FsbCBMb2FkTGV2ZWxlciB0byBnZXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBteV9sbF9nZXRfZGF0YShMTF9lbGVtZW50ICogcmVxdWVzdCwgZW51bSBMTEFQSV9TcGVjaWZpY2F0aW9uIHNwZWMsIHZvaWQgKnJlc3VsdCkKLXsKLSAgaW50IHJjID0gMDsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIExMQVBJX1NwZWNpZmljYXRpb249JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcGVjKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIHJjID0gKCpMTF9TWU1TLmxsX2dldF9kYXRhKSAocmVxdWVzdCwgc3BlYywgcmVzdWx0KTsKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgaWYgKHJjICE9IDApIHsKLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkxvYWRMZXZlbGVyIGxsX2dldF9kYXRhIHJjPSVkLlxuIiwgcmMpOwotICB9Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHJjPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmMpOwotICByZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogQ2FsbCBMb2FkTGV2ZWxlciB0byBwZXJmb3JtIGEgcXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxMX2VsZW1lbnQgKm15X2xsX3F1ZXJ5KGVudW0gUXVlcnlUeXBlIHR5cGUpCi17Ci0gIExMX2VsZW1lbnQgKnF1ZXJ5X2VsZW0gPSBOVUxMOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gUXVlcnlUeXBlPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdHlwZSk7Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICBxdWVyeV9lbGVtID0gKCpMTF9TWU1TLmxsX3F1ZXJ5KSAodHlwZSk7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIGlmIChxdWVyeV9lbGVtID09IE5VTEwpIHsKLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkxvYWRMZXZlbGVyIGxsX3F1ZXJ5IGVsZW1lbnQ9TlVMTC4gRW5kIG9mIGxpc3Qgd2FzIHByb2JhYmx5IHJlYWNoZWQuXG4iKTsKLSAgfQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIHJldHVybiBxdWVyeV9lbGVtOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIENhbGwgTG9hZExldmVsZXIgdG8gZnJlZSB0aGUgb2JqZWN0cyBpbiB0aGUgcXVlcnkgZWxlbWVudCAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXlfbGxfZnJlZV9vYmpzKExMX2VsZW1lbnQgKiBxdWVyeV9lbGVtKQotewotICBpbnQgcmMgPSAwOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwdGhyZWFkX211dGV4X2xvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgcmMgPSAoKkxMX1NZTVMubGxfZnJlZV9vYmpzKSAocXVlcnlfZWxlbSk7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIGlmIChyYyAhPSAwKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiTG9hZExldmVsZXIgbGxfZnJlZV9vYmpzIHJjPSVkLlxuIiwgcmMpOwotICB9Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHJjPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmMpOwotICByZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogQ2FsbCBMb2FkTGV2ZWxlciB0byBkZWFsbG9jYXRlIHRoZSBxdWVyeSBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBteV9sbF9kZWFsbG9jYXRlKExMX2VsZW1lbnQgKiBxdWVyeV9lbGVtKQotewotICBpbnQgcmMgPSAwOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwdGhyZWFkX211dGV4X2xvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgcmMgPSAoKkxMX1NZTVMubGxfZGVhbGxvY2F0ZSkgKHF1ZXJ5X2VsZW0pOwotICBwdGhyZWFkX211dGV4X3VubG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICBpZiAocmMgIT0gMCkgewotICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIkxvYWRMZXZlbGVyIGxsX2RlYWxsb2NhdGUgcmM9JWQuXG4iLCByYyk7Ci0gIH0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gcmM9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByYyk7Ci0gIHJldHVybiByYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBDYWxsIExvYWRMZXZlbGVyIHRvIGdldCB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgcmV0dXJuZWQgbGlzdCAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTExfZWxlbWVudCAqbXlfbGxfbmV4dF9vYmooTExfZWxlbWVudCAqIHF1ZXJ5X2VsZW0pCi17Ci0gIExMX2VsZW1lbnQgKm5leHRfZWxlbSA9IE5VTEw7OwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwdGhyZWFkX211dGV4X2xvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgbmV4dF9lbGVtID0gKCpMTF9TWU1TLmxsX25leHRfb2JqKSAocXVlcnlfZWxlbSk7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIGlmIChuZXh0X2VsZW0gPT0gTlVMTCkgewotICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTG9hZExldmVsZXIgbGxfbmV4dF9vYmogZWxlbWVudD1OVUxMLiBFbmQgb2YgbGlzdCB3YXMgcHJvYmFibHkgcmVhY2hlZC5cbiIpOwotICB9Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgcmV0dXJuIG5leHRfZWxlbTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBDYWxsIExvYWRMZXZlbGVyIHRvIGdldCBvYmplY3RzIGZyb20gdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgZWxlbWVudCAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTExfZWxlbWVudCAqbXlfbGxfZ2V0X29ianMoTExfZWxlbWVudCAqIHF1ZXJ5X2VsZW0sIGVudW0gTExfRGFlbW9uIGRhZW1vbiwgY2hhciAqaWdub3JlLCBpbnQgKnZhbHVlLCBpbnQgKnJjKQotewotICAqcmMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVzZXQgcmMgdG8gMCAqLwotICBMTF9lbGVtZW50ICpyZXRfb2JqZWN0ID0gTlVMTDsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIExMX0RhZW1vbj0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRhZW1vbik7Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICByZXRfb2JqZWN0ID0gTExfU1lNUy5sbF9nZXRfb2JqcyhxdWVyeV9lbGVtLCBkYWVtb24sIGlnbm9yZSwgdmFsdWUsIHJjKTsKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgaWYgKHJldF9vYmplY3QgPT0gTlVMTCkgewotICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTG9hZExldmVsZXIgbGxfZ2V0X29ianMgZWxlbWVudD1OVUxMLiBFbmQgb2YgbGlzdCB3YXMgcHJvYmFibHkgcmVhY2hlZC5cbiIpOwotICB9Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHJjPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKnJjKTsKLSAgcmV0dXJuIHJldF9vYmplY3Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogIENhbGwgTG9hZExldmVsZXIgdG8gYnVpbGQgYSByZXF1ZXN0IG9iamVjdCBmb3IgYSBzdWJzZXF1ZW50IGNhbGwgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBteV9sbF9zZXRfcmVxdWVzdChMTF9lbGVtZW50ICogcXVlcnlfZWxlbSwgZW51bSBRdWVyeUZsYWdzIHFmbGFncywgY2hhciAqKmlnbm9yZSwgZW51bSBEYXRhRmlsdGVyIGRmaWx0ZXIpCi17Ci0gIGludCByYyA9IDA7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBRdWVyeUZsYWdzPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcWZsYWdzKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIHJjID0gTExfU1lNUy5sbF9zZXRfcmVxdWVzdChxdWVyeV9lbGVtLCBxZmxhZ3MsIGlnbm9yZSwgZGZpbHRlcik7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIGlmIChyYyAhPSAwKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiTG9hZExldmVsZXIgbGxfc2V0X3JlcXVlc3QgcmM9JWkuXG4iLCByYyk7Ci0gIH0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gcmM9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByYyk7Ci0gIHJldHVybiByYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBDYWxsIExvYWRMZXZlbGVyIHRvIHN1Ym1pdCBhIGpvYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogSW4gdGhlIHByb3h5IHdlIGFyZSBhY2NlcHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIHBhc3NlZCBvbiAgICogCi0gKiB0byBzdWJtaXQgYnkgZm9ya2luZyB0aGUgc3VibWl0IGFuZCBtYWtpbmcgc3VyZSB3ZSBzZSB0aGUgZW52IHZhcnMgICAgKiAKLSAqIGludG8gdGhlIGVudmlyb25tZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXlfbGxfc3VibWl0X2pvYihpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgY2hhciAqam9iX3N1Yl9pZCwgY2hhciAqY29tbWFuZF9maWxlLCBjaGFyICpqb2JfZW52X3ZhcnNbXVszXSkKLXsKLSAgTExfam9iIGpvYl9pbmZvOwotICBMTF9qb2Jfc3RlcCAqam9iX3N0ZXBfaW5mbzsKLSAgSm9iT2JqZWN0ICpqb2Jfb2JqZWN0ID0gTlVMTDsKLSAgaW50IHN1Ym1pdF9yYyA9IDA7Ci0gIExMX2NsdXN0ZXJfcGFyYW0gY2x1c3Rlcl9wYXJtOwotICBMTF9lbGVtZW50ICplcnJPYmogPSBOVUxMOwotICBpbnQgaSA9IDA7Ci0gIENsdXN0ZXJPYmplY3QgKmNsdXN0ZXJfb2JqZWN0ID0gTlVMTDsKLSAgTGlzdEVsZW1lbnQgKmNsdXN0ZXJfbGlzdF9lbGVtZW50ID0gTlVMTDsKLSAgdGltZV90IG15X2Nsb2NrOwotICBjaGFyICp0ZW1wc3RyaW5nID0gTlVMTDsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBtZW1zZXQoJmpvYl9pbmZvLCAnXDAnLCBzaXplb2Yoam9iX2luZm8pKTsgICAgLyogemVybyB0aGUgam9iIGluZm8gYXJlYSAqLwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmbWFzdGVyX2xvY2spOwotICBjbHVzdGVyX2xpc3RfZWxlbWVudCA9IGNsdXN0ZXJfbGlzdC0+bF9oZWFkOyAgLyogYWx3YXlzIHN1Ym1pdCB0byB0aGUgZmlyc3QgY2x1c3RlciAqLwotICBjbHVzdGVyX29iamVjdCA9IGNsdXN0ZXJfbGlzdF9lbGVtZW50LT5sX3ZhbHVlOyAgICAgICAvKiBnZXQgb3VyIGNsdXN0ZXIgb2JqZWN0IGZyb20gdGhpcyBsaXN0IGVsZW1lbnQgKi8KLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICogYWx3YXlzIHN1Ym1pdCBsb2NhbCByZWdhcmRsZXNzIGlmIHJ1bm5pbmcgbXVsdGljbHVzdGVyIG9yIG5vdCAgICAgICAgICogCi0gICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNldHRpbmcgYWNjZXNzIGZvciBMb2FkTGV2ZWxlciBsb2NhbCBjbHVzdGVyIChzaW5nbGUgY2x1c3RlcikuXG4iKTsKLSAgY2x1c3Rlcl9wYXJtLmFjdGlvbiA9IENMVVNURVJfVU5TRVQ7ICAvKiB3ZSBhcmUgdW5zZXR0aW5nIHRoZSBjbHVzdGVyICovCi0gIGNsdXN0ZXJfcGFybS5jbHVzdGVyX2xpc3QgPSBOVUxMOwotICBzdWJtaXRfcmMgPSBteV9sbF9jbHVzdGVyKExMX0FQSV9WRVJTSU9OLCAmZXJyT2JqLCAmY2x1c3Rlcl9wYXJtKTsgICAgLyogdW5zZXQgdGhlIGNsdXN0ZXIgbmFtZSAtIGJhY2sgdG8gbG9jYWwgKi8KLQotICBwdGhyZWFkX211dGV4X2xvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICogcmV0cmlldmUgZW52aXJvbm1lbnQgdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpID0gMDsKLSAgd2hpbGUgKGpvYl9lbnZfdmFyc1tpXVswXSAhPSBOVUxMKSB7ICAvKiBpZiBrZXl3b3JkICovCi0gICAgdGVtcHN0cmluZyA9IGdldGVudihqb2JfZW52X3ZhcnNbaV1bMF0pOwotICAgIGlmICh0ZW1wc3RyaW5nICE9IE5VTEwpIHsKLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiUmV0cmlldmluZyBlbnYgdmFyICVzPSVzLlxuIiwgam9iX2Vudl92YXJzW2ldWzBdLCB0ZW1wc3RyaW5nKTsKLSAgICAgIGpvYl9lbnZfdmFyc1tpXVsyXSA9IHN0cmR1cCh0ZW1wc3RyaW5nKTsgIC8qIGlmIG9sZCB2YWx1ZSAqLwotICAgIH0KLSAgICBpKys7Ci0gIH0KLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICogd3JpdGUgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpID0gMDsKLSAgd2hpbGUgKGpvYl9lbnZfdmFyc1tpXVswXSAhPSBOVUxMKSB7ICAvKiBpZiBrZXl3b3JkICovCi0gICAgaWYgKGpvYl9lbnZfdmFyc1tpXVsxXSAhPSBOVUxMKSB7ICAgLyogaWYgbmV3IHZhbHVlICovCi0gICAgICBpZiAoKGpvYl9lbnZfdmFyc1tpXVsyXSA9PSBOVUxMKSB8fCAgICAgICAvKiBpZiBubyBvbGQgdmFsICovCi0gICAgICAgICAgKChqb2JfZW52X3ZhcnNbaV1bMl0gIT0gTlVMTCkgJiYgICAgICAvKiBvciBpZiB3ZSBoYWQgb2xkIHZhbHVlIGFuZCBkaWZmZXJlbnQgdGhhbiBuZXcgKi8KLSAgICAgICAgICAgKHN0cmNtcChqb2JfZW52X3ZhcnNbaV1bMV0sIGpvYl9lbnZfdmFyc1tpXVsyXSkgIT0gMCkpKSB7ICAgIC8qIGFuZCBpZiBvbGQgYW5kIG5ldyBub3QgaWRlbnRpY2FsICovCi0gICAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiU2V0dGluZyBlbnYgdmFyICVzPSVzLlxuIiwgam9iX2Vudl92YXJzW2ldWzBdLCBqb2JfZW52X3ZhcnNbaV1bMV0pOwotICAgICAgICBzZXRlbnYoam9iX2Vudl92YXJzW2ldWzBdLCBqb2JfZW52X3ZhcnNbaV1bMV0sIDEpOyAgICAgIC8qIHNldCB0aGUgbmV3IHZhbHVlICovCi0gICAgICB9Ci0gICAgfQotICAgIGkrKzsKLSAgfQotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgKiBzdWJtaXQgam9iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIHN1Ym1pdF9yYyA9IExMX1NZTVMubGxfc3VibWl0X2pvYihjb21tYW5kX2ZpbGUsIE5VTEwsIE5VTEwsICZqb2JfaW5mbywgTExfSk9CX1ZFUlNJT04pOwotICBpZiAoc3VibWl0X3JjID09IC0xKSB7Ci0gICAgY2hhciAqdGhlRXJyb3IgPSBMTF9TWU1TLmxsX2Vycm9yKE5VTEwsIDMpOyAvKiBwcmludCBhbnkgaW50ZXJuYWwgZXJyb3JzICovCi0gICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiSW50ZXJuYWwgZXJyb3JzIChpZiBhbnkpIHJldHVybmVkIGJ5IExvYWRMZXZlbGVyIHN1Ym1pdCBBUEk6XG4lc1xuXG4iLCB0aGVFcnJvcik7Ci0gIH0KLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICogcmVzdG9yZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpID0gMDsKLQotICB3aGlsZSAoam9iX2Vudl92YXJzW2ldWzBdICE9IE5VTEwpIHsgIC8qIGlmIGtleXdvcmQgKi8KLSAgICBpZiAoam9iX2Vudl92YXJzW2ldWzFdICE9IE5VTEwpIHsgICAvKiBpZiBuZXcgdmFsdWUgKi8KLQotICAgICAgaWYgKGpvYl9lbnZfdmFyc1tpXVsyXSAhPSBOVUxMKSB7IC8qIGlmIHdlIGhhZCBvbGQgdmFsdWUgKi8KLSAgICAgICAgaWYgKHN0cmNtcChqb2JfZW52X3ZhcnNbaV1bMV0sIGpvYl9lbnZfdmFyc1tpXVsyXSkgIT0gMCkgeyAgICAgIC8qIGFuZCBpZiBvbGQgYW5kIG5ldyBub3QgaWRlbnRpY2FsICovCi0gICAgICAgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJSZXN0b3JpbmcgZW52IHZhciAlcz0lcy5cbiIsIGpvYl9lbnZfdmFyc1tpXVswXSwgam9iX2Vudl92YXJzW2ldWzJdKTsKLSAgICAgICAgICBzZXRlbnYoam9iX2Vudl92YXJzW2ldWzBdLCBqb2JfZW52X3ZhcnNbaV1bMl0sIDEpOyAgICAvKiByZXN0b3JlIG9sZCB2YWx1ZSBiYWNrIGludG8gZW52aXJvbm1lbnQgKi8KLSAgICAgICAgfQotICAgICAgfSAvKiBlbmQgaWYgd2UgaGFkIG9sZCB2YWx1ZSAqLwotICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBpZiBuZXcgb25seSAtIG5vIG9sZCAqLwotICAgICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlVuc2V0dGluZyBlbnYgdmFyICVzLlxuIiwgam9iX2Vudl92YXJzW2ldWzBdKTsKLSAgICAgICAgdW5zZXRlbnYoam9iX2Vudl92YXJzW2ldWzBdKTsgICAvKiB1bnNldCBuZXcgdmFsdWUgd2UgcHV0IGluIGVudmlyb25tZW50ICovCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiBuZXcgdmFsdWUgb25seSAqLwotCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiB3ZSBoYWQgYSBuZXcgdmFsdWUgKi8KLSAgICBpKys7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB3aGlsZSBsb29wIG9uIGtleXdvcmRzICovCi0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgaWYgKHN1Ym1pdF9yYyAhPSAwKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiTG9hZExldmVsZXIgbGxfc3VibWl0X2pvYiByYz0laS5cbiIsIHN1Ym1pdF9yYyk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJKb2IgU3VibWl0dGVkOiBqb2JfbmFtZT0lcyBzdWJtaXRob3N0PSVzIG93bmVyPSVzIHN0ZXBzPSVkLlxuIiwgam9iX2luZm8uam9iX25hbWUsIGpvYl9pbmZvLnN1Ym1pdF9ob3N0LCBqb2JfaW5mby5vd25lciwgam9iX2luZm8uc3RlcHMpOwotCi0gICAgdGltZSgmbXlfY2xvY2spOyAgICAgICAgICAgICAgIC8qIHdoYXQgdGltZSBpcyBpdCA/ICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgam9iX2luZm8uc3RlcHM7IGkrKykgewotICAgICAgam9iX3N0ZXBfaW5mbyA9IGpvYl9pbmZvLnN0ZXBfbGlzdFtpXTsKLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiSm9iIHN0ZXA6ICBzdGVwX25hbWU9JXMuIHN0ZXBfY2xhc3M9JXMuIHN0ZXBfaWQ9JXMuJWQuJWRcbiIsIGpvYl9zdGVwX2luZm8tPnN0ZXBfbmFtZSwgam9iX3N0ZXBfaW5mby0+c3RlcGNsYXNzLCBqb2Jfc3RlcF9pbmZvLT5pZC5mcm9tX2hvc3QsIGpvYl9zdGVwX2luZm8tPmlkLmNsdXN0ZXIsIGpvYl9zdGVwX2luZm8tPmlkLnByb2MpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAgICogY3JlYXRlIG5ldyBqb2Igb2JqZWN0IGZvciBzdWJtaXR0ZWQgam9iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBqb2Jfb2JqZWN0ID0gKEpvYk9iamVjdCAqKSBtYWxsb2Moc2l6ZW9mKEpvYk9iamVjdCkpOwotICAgICAgbWFsbG9jX2NoZWNrKGpvYl9vYmplY3QsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgICAgbWVtc2V0KGpvYl9vYmplY3QsICdcMCcsIHNpemVvZihqb2Jfb2JqZWN0KSk7ICAgICAvKiB6ZXJvIHRoZSBtYWxsb2MgYXJlYSAqLwotICAgICAgam9iX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX2pvYl9pZCA9IGdlbmVyYXRlX2lkKCk7ICAgICAgIC8qIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgY2x1c3RlciAqLwotICAgICAgam9iX29iamVjdC0+Z3VpX2Fzc2lnbmVkX2pvYl9pZCA9ICItMSI7ICAgLyogcHJlc2V0IHRvIGFzeW5jIGlkICgyIC0gbikgKi8KLSAgICAgIGlmIChpID09IDApIHsgICAgICAgICAgICAgLyogaWYgZmlyc3QgKi8KLSAgICAgICAgam9iX29iamVjdC0+Z3VpX2Fzc2lnbmVkX2pvYl9pZCA9IGpvYl9zdWJfaWQ7ICAgLyogcGljayB1cCB0aGUgcGFyc2VkIGpvYmlkIGZvciB0aGUgZmlyc3Qgam9ic3RlcCBpbiBqb2IgKi8KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIGZpcnN0ICovCi0gICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCA9IHN0cmR1cChqb2Jfc3RlcF9pbmZvLT5pZC5mcm9tX2hvc3QpOwotICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyID0gam9iX3N0ZXBfaW5mby0+aWQuY2x1c3RlcjsKLSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYyA9IGpvYl9zdGVwX2luZm8tPmlkLnByb2M7Ci0gICAgICBqb2Jfb2JqZWN0LT50YXNrX2xpc3QgPSBOZXdMaXN0KCk7ICAgICAgICAvKiBsaXN0IHRvIGhvbGQgdGFza3MgZm9yIHRoaXMgam9iIHN0ZXAgKi8KLSAgICAgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSA9IHN0cmR1cChjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX0lETEU7Ci0gICAgICBqb2Jfb2JqZWN0LT5qb2Jfc3VibWl0X3RpbWUgPSBteV9jbG9jazsgICAgICAvKiB0aW1lIHNpbmNlIGVwb2NoIHdoZW4gam9iIHN1Ym1pdHRlZCAqLwotICAgICAgYWRkX2pvYl90b19saXN0KGpvYl9saXN0LCAodm9pZCAqKSBqb2Jfb2JqZWN0KTsgICAvKiBhZGQgdGhlIG5ldyBqb2Igb2JqZWN0IHRvIHRoZSBsaXN0ICovCi0gICAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgICAgc2VuZEpvYkFkZEV2ZW50KHN0YXJ0X2V2ZW50c19ndWlfdHJhbnNtaXNzaW9uX2lkLCBjbHVzdGVyX29iamVjdCwgam9iX29iamVjdCk7Ci0gICAgfQotCi0gICAgbXlfbGxfZnJlZV9qb2JfaW5mbygmam9iX2luZm8pOwotICB9Ci0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm1hc3Rlcl9sb2NrKTsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gcmM9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzdWJtaXRfcmMpOwotICByZXR1cm4gc3VibWl0X3JjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIENhbGwgTG9hZExldmVsZXIgdG8gY2FuY2VsIGEgam9iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXlfbGxfdGVybWluYXRlX2pvYihpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCkKLXsKLSAgTExfdGVybWluYXRlX2pvYl9pbmZvIHRlcm1pbmF0ZV9qb2JfaW5mbzsKLSAgaW50IHJjID0gMDsKLSAgTExfY2x1c3Rlcl9wYXJhbSBjbHVzdGVyX3Bhcm07Ci0gIExMX2VsZW1lbnQgKmVyck9iaiA9IE5VTEw7Ci0gIGNoYXIgKnJlbW90ZV9jbHVzdGVyWzJdOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gIG1lbXNldCgmdGVybWluYXRlX2pvYl9pbmZvLCAnXDAnLCBzaXplb2YodGVybWluYXRlX2pvYl9pbmZvKSk7ICAgICAgICAvKiB6ZXJvIHRoZSB0ZXJtaW5hdGUgam9iIGluZm8gYXJlYSAqLwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmbWFzdGVyX2xvY2spOwotICBpZiAobXVsdGljbHVzdGVyX3N0YXR1cyA9PSAxKSB7ICAgICAgIC8qIGlmIHJ1bm5pbmcgbXVsdGljbHVzdGVyICovCi0KLSAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIAotICAgICogd2UgYXJlIHJ1bm5pbmcgbXVsdGljbHVzdGVyIC0gc2V0IGNsdXN0ZXIgbmFtZSBpbnRvIGVudmlyb25tZW50ICAgICAgICogCi0gICAgKiB0byBpbmZsdWVuY2Ugd2hlcmUgTG9hZExldmVsZXIgc2VhcmNoZXMgZm9yIGRhdGEgKHdoYXQgY2x1c3RlcikgICAgICAgKiAKLSAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJlbW90ZV9jbHVzdGVyWzBdID0gam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lOwotICAgIHJlbW90ZV9jbHVzdGVyWzFdID0gTlVMTDsKLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNldHRpbmcgYWNjZXNzIGZvciBMb2FkTGV2ZWxlciBjbHVzdGVyICVzLlxuIiwgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLSAgICBjbHVzdGVyX3Bhcm0uYWN0aW9uID0gQ0xVU1RFUl9TRVQ7ICAvKiB3ZSBhcmUgc2V0dGluZyB0aGUgY2x1c3RlciBmb3IgcmVtb3RlIGFjY2VzcyAqLwotICAgIGNsdXN0ZXJfcGFybS5jbHVzdGVyX2xpc3QgPSByZW1vdGVfY2x1c3RlcjsgLyogY2x1c3RlciBuYW1lIHdlIHdhbnQgdG8gY2FuY2VsIGpvYiBpbiAqLwotICAgIHJjID0gbXlfbGxfY2x1c3RlcihMTF9BUElfVkVSU0lPTiwgJmVyck9iaiwgJmNsdXN0ZXJfcGFybSk7IC8qIHNldCB0aGUgY2x1c3RlciBuYW1lICovCi0gIH0gLyogZW5kIGlmIHRoaXMgaXMgbm90IGEgbG9jYWwgY2x1c3RlciAqLwotICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIGEgbG9jYWwgY2x1c3RlciAqLwotCi0gICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiAKLSAgICAqIG5vdCBydW5uaW5nIG11bHRpY2x1c3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTZXR0aW5nIGFjY2VzcyBmb3IgTG9hZExldmVsZXIgbG9jYWwgY2x1c3RlciAoc2luZ2xlIGNsdXN0ZXIpLlxuIik7Ci0gICAgY2x1c3Rlcl9wYXJtLmFjdGlvbiA9IENMVVNURVJfVU5TRVQ7ICAgICAgICAvKiB3ZSBhcmUgdW5zZXR0aW5nIHRoZSBjbHVzdGVyICovCi0gICAgY2x1c3Rlcl9wYXJtLmNsdXN0ZXJfbGlzdCA9IE5VTEw7Ci0gICAgcmMgPSBteV9sbF9jbHVzdGVyKExMX0FQSV9WRVJTSU9OLCAmZXJyT2JqLCAmY2x1c3Rlcl9wYXJtKTsgLyogdW5zZXQgdGhlIGNsdXN0ZXIgbmFtZSAtIGJhY2sgdG8gbG9jYWwgKi8KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmIHRoaXMgaXMgYSBsb2NhbCBjbHVzdGVyICovCi0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSogCi0gICAqIHNlbmQgdGhlIGxsIGNhbmNlbCBjb21tYW5kIGFuZCBob3BlIHRoYXQgaXQgZXZlbnR1YWxseSB3b3JrcyAgICAgICAgICAqIAotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgdGVybWluYXRlX2pvYl9pbmZvLnZlcnNpb25fbnVtID0gTExfUFJPQ19WRVJTSU9OOwotICB0ZXJtaW5hdGVfam9iX2luZm8uU3RlcElkLmNsdXN0ZXIgPSBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXI7ICAgLyogb2xkIG5vdGF0aW9uIGZvciBqb2IgbnVtYmVyICovCi0gIHRlcm1pbmF0ZV9qb2JfaW5mby5TdGVwSWQucHJvYyA9IGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYzsgLyogb2xkIG5vdGF0aW9uIGZvciBzdGVwIG51bWJlciAqLwotICB0ZXJtaW5hdGVfam9iX2luZm8uU3RlcElkLmZyb21faG9zdCA9IGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0OyAgICAgICAvKiBvbGQgbm90YXRpb24gZm9yIG9yaWdpbmF0aW5nIHNjaGVkZCBub2RlIG5hbWUgKi8KLSAgdGVybWluYXRlX2pvYl9pbmZvLm1zZyA9IE5VTEw7ICAgICAgICAvKiBtZXNzYWdlIHRvIHVzZSAqLwotICBwdGhyZWFkX211dGV4X2xvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgcmMgPSBMTF9TWU1TLmxsX3Rlcm1pbmF0ZV9qb2IoJnRlcm1pbmF0ZV9qb2JfaW5mbyk7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gIGlmIChyYyAhPSAwKSB7Ci0gICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiTG9hZExldmVsZXIgbGxfdGVybWluYXRlX2pvYiByYz0laS5cbiIsIHJjKTsKLSAgfQotCi0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXN0ZXJfbG9jayk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHJjPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmMpOwotICByZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogY2FsbCBMb2FkTGV2ZWxlciB0byBmcmVlIGpvYiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbXlfbGxfZnJlZV9qb2JfaW5mbyhMTF9qb2IgKiBqb2JfaW5mbykKLXsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgTExfU1lNUy5sbF9mcmVlX2pvYl9pbmZvKGpvYl9pbmZvLCBMTF9KT0JfVkVSU0lPTik7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBmaW5kIG5vZGUgaW4gbXkgaGFzaCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTm9kZU9iamVjdCAqZ2V0X25vZGVfaW5faGFzaChIYXNoICogbm9kZV9oYXNoLCBjaGFyICpub2RlX25hbWUpCi17Ci0gIGludCBoYXNoX2tleSA9IDA7Ci0gIExpc3QgKm5vZGVfbGlzdCA9IE5VTEw7Ci0gIExpc3RFbGVtZW50ICpub2RlX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0gIE5vZGVPYmplY3QgKm5vZGVfb2JqZWN0ID0gTlVMTDsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gbmFtZT0lcy5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIG5vZGVfbmFtZSk7Ci0gIGhhc2hfa2V5ID0gSGFzaENvbXB1dGUobm9kZV9uYW1lLCBzdHJsZW4obm9kZV9uYW1lKSk7Ci0gIG5vZGVfbGlzdCA9IEhhc2hTZWFyY2gobm9kZV9oYXNoLCBoYXNoX2tleSk7Ci0gIGlmIChub2RlX2xpc3QgIT0gTlVMTCkgewotICAgIG5vZGVfbGlzdF9lbGVtZW50ID0gbm9kZV9saXN0LT5sX2hlYWQ7ICAgICAgLyogYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCi0gICAgd2hpbGUgKG5vZGVfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsKLSAgICAgIG5vZGVfb2JqZWN0ID0gbm9kZV9saXN0X2VsZW1lbnQtPmxfdmFsdWU7Ci0gICAgICBub2RlX2xpc3RfZWxlbWVudCA9IG5vZGVfbGlzdF9lbGVtZW50LT5sX25leHQ7ICAgIC8qIHByZXBhcmUgZm9yIG5leHQgcGFzcyAqLwotICAgICAgaWYgKHN0cmNtcChub2RlX25hbWUsIG5vZGVfb2JqZWN0LT5ub2RlX25hbWUpID09IDApIHsKLSAgICAgICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gbm9kZV9vYmplY3Q9eFwnJTA4eFwnLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgbm9kZV9vYmplY3QpOwotICAgICAgICByZXR1cm4gbm9kZV9vYmplY3Q7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIG5vZGVfb2JqZWN0ID0gTlVMTDsgICAgICAgICAgIC8qIG5vdCBmb3VuZCBpbiBsaXN0ICovCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIG5vZGVfb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIG5vZGVfb2JqZWN0KTsKLSAgcmV0dXJuIG5vZGVfb2JqZWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIGFkZCBub2RlIHRvIG15IGhhc2ggdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGFkZF9ub2RlX3RvX2hhc2goSGFzaCAqIG5vZGVfaGFzaCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KQotewotICBpbnQgaGFzaF9rZXk7Ci0gIExpc3QgKm5vZGVfbGlzdDsKLQotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIG5vZGVfb2JqZWN0KTsKLSAgaGFzaF9rZXkgPSBIYXNoQ29tcHV0ZShub2RlX29iamVjdC0+bm9kZV9uYW1lLCBzdHJsZW4obm9kZV9vYmplY3QtPm5vZGVfbmFtZSkpOwotICBub2RlX2xpc3QgPSBIYXNoU2VhcmNoKG5vZGVfaGFzaCwgaGFzaF9rZXkpOwotICBpZiAobm9kZV9saXN0ID09IE5VTEwpIHsKLSAgICBub2RlX2xpc3QgPSBOZXdMaXN0KCk7Ci0gICAgQWRkVG9MaXN0KG5vZGVfbGlzdCwgbm9kZV9vYmplY3QpOwotICAgIEhhc2hJbnNlcnQobm9kZV9oYXNoLCBoYXNoX2tleSwgbm9kZV9saXN0KTsKLSAgfSBlbHNlIHsKLSAgICBBZGRUb0xpc3Qobm9kZV9saXN0LCBub2RlX29iamVjdCk7Ci0gIH0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIGZpbmQgam9iIGluIG15IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Kb2JPYmplY3QgKmdldF9qb2JfaW5fbGlzdChMaXN0ICogam9iX2xpc3QsIExMX1NURVBfSUQgbGxfc3RlcF9pZCkKLXsKLSAgTGlzdEVsZW1lbnQgKmpvYl9saXN0X2VsZW1lbnQgPSBOVUxMOwotICBKb2JPYmplY3QgKmpvYl9vYmplY3QgPSBOVUxMOwotCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBuYW1lPSVzLiVkLiVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgbGxfc3RlcF9pZC5mcm9tX2hvc3QsIGxsX3N0ZXBfaWQuY2x1c3RlciwgbGxfc3RlcF9pZC5wcm9jKTsKLSAgam9iX2xpc3RfZWxlbWVudCA9IGpvYl9saXN0LT5sX2hlYWQ7ICAvKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKi8KLSAgd2hpbGUgKGpvYl9saXN0X2VsZW1lbnQgIT0gTlVMTCkgewotICAgIGpvYl9vYmplY3QgPSBqb2JfbGlzdF9lbGVtZW50LT5sX3ZhbHVlOwotICAgIGpvYl9saXN0X2VsZW1lbnQgPSBqb2JfbGlzdF9lbGVtZW50LT5sX25leHQ7ICAgICAgICAvKiBwcmVwYXJlIGZvciBuZXh0IHBhc3MgKi8KLSAgICBpZiAoKHN0cmNtcChsbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QpID09IDApICYmIChsbF9zdGVwX2lkLmNsdXN0ZXIgPT0gam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyKSAmJiAobGxfc3RlcF9pZC5wcm9jID09IGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYykpIHsKLSAgICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIGpvYl9vYmplY3Q9eFwnJTA4eFwnLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdCk7Ci0gICAgICByZXR1cm4gam9iX29iamVjdDsKLSAgICB9Ci0gIH0KLSAgam9iX29iamVjdCA9IE5VTEw7ICAgICAgICAgICAgLyogbm90IGZvdW5kIGluIGxpc3QgKi8KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gam9iX29iamVjdD14XCclMDh4XCcuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBqb2Jfb2JqZWN0KTsKLSAgcmV0dXJuIGpvYl9vYmplY3Q7Ci19Ci0KLUpvYk9iamVjdCAqZ2V0X2pvYl9pbl9saXN0X2Zyb21faWQoTGlzdCAqIGpvYl9saXN0LCBpbnQgam9iX2lkKQotewotICBMaXN0RWxlbWVudCAqam9iX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0gIEpvYk9iamVjdCAqam9iX29iamVjdCA9IE5VTEw7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBpZD0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGpvYl9pZCk7Ci0gIGpvYl9saXN0X2VsZW1lbnQgPSBqb2JfbGlzdC0+bF9oZWFkOyAgLyogYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCi0gIHdoaWxlIChqb2JfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsKLSAgICBqb2Jfb2JqZWN0ID0gam9iX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsKLSAgICBqb2JfbGlzdF9lbGVtZW50ID0gam9iX2xpc3RfZWxlbWVudC0+bF9uZXh0OyAgICAgICAgLyogcHJlcGFyZSBmb3IgbmV4dCBwYXNzICovCi0gICAgaWYgKGpvYl9pZCA9PSBqb2Jfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfam9iX2lkKSB7Ci0gICAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLiBqb2Jfb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGpvYl9vYmplY3QpOwotICAgICAgcmV0dXJuIGpvYl9vYmplY3Q7Ci0gICAgfQotICB9Ci0gIGpvYl9vYmplY3QgPSBOVUxMOyAgICAgICAgICAgIC8qIG5vdCBmb3VuZCBpbiBsaXN0ICovCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIGpvYl9vYmplY3Q9eFwnJTA4eFwnLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdCk7Ci0gIHJldHVybiBqb2Jfb2JqZWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIGFkZCBqb2IgdG8gbXkgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGFkZF9qb2JfdG9fbGlzdChMaXN0ICogam9iX2xpc3QsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QpCi17Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBqb2Jfb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGpvYl9vYmplY3QpOwotICBBZGRUb0xpc3Qoam9iX2xpc3QsIGpvYl9vYmplY3QpOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogc2F2ZSByZWFsIHRocmVhZCBudW1iZXIgZm9yIG1hcHBpbmcgdG8gdXNlYWJsZSBudW1iZXIgKDAsIDEsIDIsIC4uLikgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCByZWdpc3Rlcl90aHJlYWQocHRocmVhZF90IGhhbmRsZSkKLXsKLSAgaW50IHRocmVhZF9pZCA9IC0xOwotCi0gIGZvciAodGhyZWFkX2lkID0gMDsgdGhyZWFkX2lkIDwgKHNpemVvZih0aHJlYWRfbWFwX3RhYmxlKSAvIHNpemVvZihwdGhyZWFkX3QpKTsgdGhyZWFkX2lkKyspIHsKLSAgICBpZiAodGhyZWFkX21hcF90YWJsZVt0aHJlYWRfaWRdID09IDApIHsKLSAgICAgIHRocmVhZF9tYXBfdGFibGVbdGhyZWFkX2lkXSA9IGhhbmRsZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gdGhyZWFkX2lkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIG1hcCBteSB0aHJlYWRzIHRvIHVzZWFibGUgbnVtYmVyICgwLCAxLCAyLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmluZF90aHJlYWQocHRocmVhZF90IGhhbmRsZSkKLXsKLSAgaW50IHRocmVhZF9pZCA9IC0xOwotCi0gIGZvciAodGhyZWFkX2lkID0gMDsgdGhyZWFkX2lkIDwgKHNpemVvZih0aHJlYWRfbWFwX3RhYmxlKSAvIHNpemVvZihwdGhyZWFkX3QpKTsgdGhyZWFkX2lkKyspIHsKLSAgICBpZiAodGhyZWFkX21hcF90YWJsZVt0aHJlYWRfaWRdID09IGhhbmRsZSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0aHJlYWRfaWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogdmVyaWZ5IHRoYXQgbWFsbG9jIGRpZG4ndCBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbWFsbG9jX2NoZWNrKHZvaWQgKnAsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBpbnQgbGluZSkKLXsKLSAgaWYgKHAgPT0gTlVMTCkgewotICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGluIGZ1bmN0aW9uICVzIChsaW5lICVkKVxuIiwgZnVuY3Rpb24sIGxpbmUpOwotICAgIHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9IDE7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogZmluZCB0YXNrIGluIG15IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRhc2tPYmplY3QgKmdldF90YXNrX2luX2xpc3QoTGlzdCAqIHRhc2tfbGlzdCwgY2hhciAqdGFza19pbnN0YW5jZV9tYWNoaW5lX25hbWUsIGludCBsbF90YXNrX2lkKQotewotICBUYXNrT2JqZWN0ICp0YXNrX29iamVjdCA9IE5VTEw7Ci0gIExpc3RFbGVtZW50ICp0YXNrX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGlkPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgbGxfdGFza19pZCk7Ci0gIHRhc2tfbGlzdF9lbGVtZW50ID0gdGFza19saXN0LT5sX2hlYWQ7ICAgICAgICAvKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKi8KLSAgd2hpbGUgKHRhc2tfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsgICAvKiB3aGlsZSB3ZSBoYXZlIGEgdmFsaWQgdGFzayBlbGVtZW50ICovCi0gICAgdGFza19vYmplY3QgPSB0YXNrX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsKLSAgICB0YXNrX2xpc3RfZWxlbWVudCA9IHRhc2tfbGlzdF9lbGVtZW50LT5sX25leHQ7ICAgICAgLyogcHJlcGFyZSBmb3IgbmV4dCBwYXNzICovCi0gICAgaWYgKChsbF90YXNrX2lkID09IHRhc2tfb2JqZWN0LT5sbF90YXNrX2lkKSAmJiAoc3RyY21wKHRhc2tfb2JqZWN0LT5ub2RlX25hbWUsIHRhc2tfaW5zdGFuY2VfbWFjaGluZV9uYW1lKSA9PSAwKSkgewotICAgICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gdGFza19vYmplY3Q9eFwnJTA4eFwnLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdGFza19vYmplY3QpOwotICAgICAgcmV0dXJuIHRhc2tfb2JqZWN0OwotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHdoaWxlIHdlIGhhdmUgYSB2YWxpZCB0YXNrIGVsZW1lbnQgKi8KLSAgdGFza19vYmplY3QgPSBOVUxMOyAgICAgICAgICAgLyogbm90IGZvdW5kICovCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHRhc2tfb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHRhc2tfb2JqZWN0KTsKLSAgcmV0dXJuIHRhc2tfb2JqZWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIGFkZCB0YXNrIHRvIG15IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGFkZF90YXNrX3RvX2xpc3QoTGlzdCAqIHRhc2tfbGlzdCwgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KQotewotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gdGFza19vYmplY3Q9eFwnJTA4eFwnLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdGFza19vYmplY3QpOwotICBBZGRUb0xpc3QodGFza19saXN0LCB0YXNrX29iamVjdCk7Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBkZWxldGUgbm9kZSBmcm9tIG15IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBkZWxldGVfbm9kZV9mcm9tX2xpc3QoTGlzdCAqIG5vZGVfbGlzdCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KQotewotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBpZiAobm9kZV9vYmplY3QtPm5vZGVfbmFtZSAhPSBOVUxMKSB7Ci0gICAgZnJlZShub2RlX29iamVjdC0+bm9kZV9uYW1lKTsKLSAgICBub2RlX29iamVjdC0+bm9kZV9uYW1lID0gTlVMTDsKLSAgfQotICBSZW1vdmVGcm9tTGlzdChub2RlX2xpc3QsIG5vZGVfb2JqZWN0KTsgICAgICAgLyogcmVtb3ZlIGZyb20gbGlzdCBhbmQgZnJlZSBtZW1vcnkgKi8KLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIGRlbGV0ZSBqb2IgZnJvbSBteSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGRlbGV0ZV9qb2JfZnJvbV9saXN0KExpc3QgKiBqb2JfbGlzdCwgSm9iT2JqZWN0ICogam9iX29iamVjdCkKLXsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgaWYgKGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0ICE9IE5VTEwpIHsKLSAgICBmcmVlKGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0KTsKLSAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCA9IE5VTEw7Ci0gIH0KLSAgaWYgKGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSAhPSBOVUxMKSB7Ci0gICAgZnJlZShqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotICAgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSA9IE5VTEw7Ci0gIH0KLSAgaWYgKGpvYl9vYmplY3QtPnRhc2tfbGlzdCAhPSBOVUxMKSB7Ci0gICAgZnJlZShqb2Jfb2JqZWN0LT50YXNrX2xpc3QpOwotICAgIGpvYl9vYmplY3QtPnRhc2tfbGlzdCA9IE5VTEw7Ci0gIH0KLSAgUmVtb3ZlRnJvbUxpc3Qoam9iX2xpc3QsIGpvYl9vYmplY3QpOyAvKiByZW1vdmUgZnJvbSBsaXN0IGFuZCBmcmVlIG1lbW9yeSAqLwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogZGVsZXRlIHRhc2sgZnJvbSBteSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZGVsZXRlX3Rhc2tfZnJvbV9saXN0KExpc3QgKiB0YXNrX2xpc3QsIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCkKLXsKLSAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgaWYgKHRhc2tfb2JqZWN0LT5ub2RlX25hbWUgIT0gTlVMTCkgewotICAgIGZyZWUodGFza19vYmplY3QtPm5vZGVfbmFtZSk7Ci0gICAgdGFza19vYmplY3QtPm5vZGVfbmFtZSA9IE5VTEw7Ci0gIH0KLSAgaWYgKHRhc2tfb2JqZWN0LT5ub2RlX2FkZHJlc3MgIT0gTlVMTCkgewotICAgIGZyZWUodGFza19vYmplY3QtPm5vZGVfYWRkcmVzcyk7Ci0gICAgdGFza19vYmplY3QtPm5vZGVfYWRkcmVzcyA9IE5VTEw7Ci0gIH0KLSAgUmVtb3ZlRnJvbUxpc3QodGFza19saXN0LCB0YXNrX29iamVjdCk7ICAgICAgIC8qIHJlbW92ZSBmcm9tIGxpc3QgYW5kIGZyZWUgbWVtb3J5ICovCi0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBkdW1wIG91dCBhbGwgdGhlIHBhcm1zIGJlaW5nIHNlbnQgYmFjayB0byB0aGUgcHJveHkgZnJvbnQgZW5kICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcmludF9wcm94eV9tZXNzYWdlKHByb3h5X21zZyAqIG1zZykKLXsKLSAgaW50IGkgPSAwOwotICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIm1zZ19pZD0lZC4gdHJhbnNfaWQ9JWQuIG51bV9hcmdzPSVkLiBhcmdfc2l6ZT0lZC5cbiIsIG1zZy0+bXNnX2lkLCBtc2ctPnRyYW5zX2lkLCBtc2ctPm51bV9hcmdzLCBtc2ctPmFyZ19zaXplKTsKLSAgaWYgKG1zZy0+bnVtX2FyZ3MgPiAwKSB7ICAgICAgLyogaWYgd2UgaGF2ZSBhcmd1bWVudHMgKi8KLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgInByb3h5IG1zZyAoZXZlbnQpIGFyZ3VtZW50czpcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPm51bV9hcmdzOyBpKyspIHsKLSAgICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiYXJnWyVkXT0lcy5cbiIsIGksIG1zZy0+YXJnc1tpXSk7Ci0gICAgfQotICB9Ci0gIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBzZWUgaWYgPDw8WFhYWFhYWFg+Pj4gdmFyaWFibGUgaW4gdGhlIGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGlzX3N1YnN0aXR1dGlvbl9yZXF1aXJlZChjaGFyICpsaW5lKQotewotICBjaGFyICpwb3NpdGlvbjEgPSBOVUxMOwotICBjaGFyICpwb3NpdGlvbjIgPSBOVUxMOwotICBmb3IgKHBvc2l0aW9uMSA9IGxpbmU7IHN0cmxlbihwb3NpdGlvbjEpID49IDY7IHBvc2l0aW9uMSsrKSB7Ci0gICAgaWYgKHN0cm5jbXAocG9zaXRpb24xLCAiPDw8IiwgMykgPT0gMCkgeyAgICAvKiBpZiA8PDwgZm91bmQgKi8KLSAgICAgIGZvciAocG9zaXRpb24yID0gcG9zaXRpb24xICsgMzsgc3RybGVuKHBvc2l0aW9uMikgPj0gMzsgcG9zaXRpb24yKyspIHsKLSAgICAgICAgaWYgKCgocG9zaXRpb24yWzBdID49ICdhJykgJiYgKHBvc2l0aW9uMlswXSA8PSAneicpKSB8fCAoKHBvc2l0aW9uMlswXSA+PSAnQScpICYmIChwb3NpdGlvbjJbMF0gPD0gJ1onKSkgfHwgKChwb3NpdGlvbjJbMF0gPj0gJzAnKSAmJiAocG9zaXRpb24yWzBdIDw9ICc5JykpIHx8IChwb3NpdGlvbjJbMF0gPT0gJ18nKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChzdHJuY21wKHBvc2l0aW9uMiwgIj4+PiIsIDMpID09IDApIHsgICAgICAvKiBpZiA+Pj4gZm91bmQgKi8KLSAgICAgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgLyogZm91bmQgYSA8PDxYWFhYWFhYWD4+PiBtYXRjaCAqLwotICAgICAgICAgIH0gLyogZW5kIGlmIDw8PCBmb3VuZCAqLwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZiA8PDwgZm91bmQgKi8KLSAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjZhNWZjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzEzNGFlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWk7YnVuZGxlLXZlcnNpb249IjIuMC4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLnByZWZlcmVuY2VzCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9hYm91dC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3MzQxNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk0Yjk4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBJQk0gTG9hZExldmVsZXIgVUkKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9wbHVnaW4ueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhMWFmZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucm1QcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5wcmVmZXJlbmNlcy5JQk1MTFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5pYm1sbC51aS5wcmVmZXJlbmNlcy5JQk1MTFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iTG9hZExldmVsZXIiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnVpLnJtQ29uZmlndXJhdGlvbnMiPgotICAgICAgPGNvbmZpZ3VyYXRpb25XaXphcmQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLndpemFyZHMuSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmlibWxsLnVpLmNvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucm1MYXVuY2hDb25maWd1cmF0aW9ucyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkucm1MYXVuY2hDb25maWd1cmF0aW9uLklCTUxMUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuaWJtbGwudWkubGF1bmNoQ29uZmlndXJhdGlvbiIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvQWN0aXZhdG9yLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljNmQ5Yy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJSUJNTExQcmVmZXJlbmNlTWFuYWdlci5pbml0aWFsaXplUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL0lCTUxMUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL0lCTUxMUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1MmVjYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9JQk1MTFByZWZlcmVuY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVByb3h5T3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBJQk1MTFByZWZlcmVuY2VNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfRVhFQ1VUQUJMRV9OQU1FID0gInB0cF9pYm1sbF9wcm94eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0VYRUNVVEFCTEVfUEFUSCA9IG51bGw7IC8vIHVzZSBsb2NhbCBmcmFnbWVudCBkaXJlY3RvcnkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExBVU5DSF9NQU5VQUxMWSA9IGZhbHNlOyAvLyB1c2UgbG9jYWwgZnJhZ21lbnQgZGlyZWN0b3J5Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QVElPTlMgPSBJUmVtb3RlUHJveHlPcHRpb25zLlBPUlRfRk9SV0FSRElORzsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0T3B0aW9ucygpIHsKLQkJcmV0dXJuIE9QVElPTlM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0TGF1bmNoTWFudWFsRmxhZygpIHsKLQkJcmV0dXJuIExBVU5DSF9NQU5VQUxMWTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UHJveHlFeGVjdXRhYmxlUGF0aCgpIHsKLQkJcmV0dXJuIFBST1hZX0VYRUNVVEFCTEVfUEFUSDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXIgPSAiIjsKLQkJCQotCQlpZiAoUFJPWFlfRVhFQ1VUQUJMRV9QQVRIICE9IG51bGwpIHsKLQkJCXNlcnZlciA9IG5ldyBQYXRoKFBST1hZX0VYRUNVVEFCTEVfUEFUSCkuYXBwZW5kKFBST1hZX0VYRUNVVEFCTEVfTkFNRSkudG9PU1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJc2VydmVyID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkubG9jYXRlRnJhZ21lbnRGaWxlKCJvcmcuZWNsaXBzZS5wdHAiLCBQUk9YWV9FWEVDVVRBQkxFX05BTUUpOwotCQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQkJc2VydmVyID0gIiI7Ci0JCQl9Ci0gICAgICAgfQotCQkKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1BBVEgsIHNlcnZlcik7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05TLCBPUFRJT05TKTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL2ludGVybmFsL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZjE2ZDkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqICAKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL2ludGVybmFsL3VpL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzZhZDUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1JQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLm5hbWU9SUJNIExvYWRMZXZlbGVyIENvbmZpZ3VyYXRpb24gV2l6YXJkIFBhZ2UKLUlCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UudGl0bGU9SUJNIExvYWRMZXZlbGVyIENvbmZpZ3VyYXRpb24gV2l6YXJkIFBhZ2UKLUlCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuZGVzY3JpcHRpb249SUJNIExvYWRMZXZlbGVyIENvbmZpZ3VyYXRpb24gV2l6YXJkIFBhZ2UKLQotI0lCTUxMUHJlZmVyZW5jZVBhZ2UgYW5kIElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UKLUlCTUxMUHJlZldpelBhZ2UuYnJvd3NlQnV0dG9uPUJyb3dzZQotCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5T3B0aW9uc0dyb3VwTGFiZWw9TG9hZExldmVsZXIgUHJveHkgTWVzc2FnZSBPcHRpb25zCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5TGlicmFyeUdyb3VwTGFiZWw9TG9hZExldmVsZXIgUHJveHkgUHJpdmF0ZSBMaWJyYXJ5IFBhdGgKLUlCTUxMUHJlZldpelBhZ2UucHJveHlMaWJyYXJ5VG9vbFRpcD1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgdG8gd2hlcmUgbGlibGxhcGkuYSBvciBsaWJsbGFwaS5zbyBpcyBpbnN0YWxsZWQgaWYgbm9uLXN0YW5kYXJkIGluc3RhbGxhdGlvbgotSUJNTExQcmVmV2l6UGFnZS5wcm94eUxpYnJhcnlMYWJlbD1MaWJyYXJ5IFBhdGggT3ZlcnJpZGUKLUlCTUxMUHJlZldpelBhZ2UucHJveHlEZWJ1Z0dyb3VwTGFiZWw9TG9hZExldmVsZXIgUHJveHkgRGVidWcgT3B0aW9ucwotSUJNTExQcmVmV2l6UGFnZS5Qcm94eU1lc3NhZ2VMYWJlbD1NZXNzYWdlczoKLUlCTUxMUHJlZldpelBhZ2UuUHJveHlUcmFjZU1lc3NhZ2VMYWJlbD1UcmFjZQotSUJNTExQcmVmV2l6UGFnZS5Qcm94eVRyYWNlTWVzc2FnZVRvb2xUaXA9T3V0cHV0IHByb3h5IHRyYWNlIG1lc3NhZ2VzIHRvIGNvbnNvbGUKLUlCTUxMUHJlZldpelBhZ2UuUHJveHlJbmZvTWVzc2FnZUxhYmVsPUluZm8KLUlCTUxMUHJlZldpelBhZ2UuUHJveHlJbmZvTWVzc2FnZVRvb2xUaXA9T3V0cHV0IHByb3h5IGluZm9ybWF0aW9uIG1lc3NhZ2VzIHRvIGNvbnNvbGUKLUlCTUxMUHJlZldpelBhZ2UuUHJveHlXYXJuaW5nTWVzc2FnZUxhYmVsPVdhcm5pbmcKLUlCTUxMUHJlZldpelBhZ2UuUHJveHlXYXJuaW5nTWVzc2FnZVRvb2xUaXA9T3V0cHV0IHByb3h5IHdhcm5pbmcgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5Qcm94eUVycm9yTWVzc2FnZUxhYmVsPUVycm9yCi1JQk1MTFByZWZXaXpQYWdlLlByb3h5RXJyb3JNZXNzYWdlVG9vbFRpcD1PdXRwdXQgcHJveHkgZXJyb3IgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5Qcm94eUZhdGFsTWVzc2FnZUxhYmVsPUZhdGFsCi1JQk1MTFByZWZXaXpQYWdlLlByb3h5RmF0YWxNZXNzYWdlVG9vbFRpcD1PdXRwdXQgcHJveHkgZmF0YWwgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5Qcm94eUFyZ3NNZXNzYWdlTGFiZWw9QXJncwotSUJNTExQcmVmV2l6UGFnZS5Qcm94eUFyZ3NNZXNzYWdlVG9vbFRpcD1PdXRwdXQgcHJveHkgYXJndW1lbnQgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5Qcm94eURlYnVnTG9vcExhYmVsPURlYnVnIExvb3AKLUlCTUxMUHJlZldpelBhZ2UuUHJveHlEZWJ1Z0xvb3BUb29sVGlwPVNwaW4gbG9vcCBpbiBwcm94eSB0byBhbGxvdyBkZWJ1Z2dlciBhdHRhY2gKLQotSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3Rlckdyb3VwTGFiZWw9TG9hZExldmVsZXIgTXVsdGljbHVzdGVyIE9wdGlvbnMKLUlCTUxMUHJlZldpelBhZ2UucHJveHlNdWx0aWNsdXN0ZXJEZWZhdWx0TGFiZWw9TG9hZExldmVsZXIgRGVmYXVsdAotSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckRlZmF1bHRUb29sVGlwPUFsbG93IExvYWRMZXZlbGVyIHRvIGRldGVybWluZSBtdWx0aWNsdXN0ZXIgb3Igc2luZ2xlIGNsdXN0ZXIgY29uZmlndXJhdGlvbgotSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTG9jYWxMYWJlbD1Gb3JjZSBMb2NhbAotSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTG9jYWxUb29sVGlwPUZvcmNlIGNvbmZpZ3VyYXRpb24gdG8gc2luZ2xlIChub24tbXVsdGljbHVzdGVyKSBjb25maWd1cmF0aW9uICh1c3VhbGx5IHVzZWQgd2l0aCBwcmUgMy40LjEuMiB2ZXJzaW9ucyBvZiBMb2FkTGV2ZWxlcikKLUlCTUxMUHJlZldpelBhZ2UucHJveHlNdWx0aWNsdXN0ZXJGb3JjZU11bHRpY2x1c3RlckxhYmVsPUZvcmNlIE11bHRpY2x1c3RlcgotSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTXVsdGljbHVzdGVyVG9vbFRpcD1Gb3JjZSBjb25maWd1cmF0aW9uIHRvIG11bHRpY2x1c3RlciBjb25maWd1cmF0aW9uICh1c3VhbGx5IHVzZWQgd2l0aCBwcmUgMy40LjEuMiB2ZXJzaW9ucyBvZiBMb2FkTGV2ZWxlcikKLQotSUJNTExQcmVmV2l6UGFnZS5wcm94eVRlbXBsYXRlR3JvdXBMYWJlbD1Mb2FkTGV2ZWxlciBKb2IgQ29tbWFuZCBGaWxlIFRlbXBsYXRlIE92ZXJyaWRlCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXBMYWJlbD1Mb2FkTGV2ZWxlciBCYXNpYyBUZW1wbGF0ZSBPcHRpb25zCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVMYWJlbD1UZW1wbGF0ZSBGaWxlIE92ZXJyaWRlCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVUb29sVGlwPUxvYWRMZXZlbGVyIFRlbXBsYXRlIEpvYiBDb21tYW5kIEZpbGUgT3ZlcnJpZGUgKHZhbHVlcyBhcmUgc3Vic3RpdHV0ZWQgZm9yIDw8PGtleXdvcmQ+Pj4gb2NjdXJyZW5jZXMgaW4gdGhlIHRlbXBsYXRlIGZpbGUpCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVOZXZlckxhYmVsPU5ldmVyIFdyaXRlCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVOZXZlclRvb2xUaXA9TmV2ZXIgV3JpdGUgRGVmYXVsdCBUZW1wbGF0ZSBKb2IgQ29tbWFuZCBGaWxlIHRvIC90bXAgYXQgUmVzb3VyY2UgTWFuYWdlciBzdGFydCAKLUlCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZUFsd2F5c0xhYmVsPUFsd2F5cyBXcml0ZQotSUJNTExQcmVmV2l6UGFnZS5wcm94eVRlbXBsYXRlQWx3YXlzVG9vbFRpcD1BbHdheXMgV3JpdGUgRGVmYXVsdCBUZW1wbGF0ZSBKb2IgQ29tbWFuZCBGaWxlIHRvIC90bXAgYXQgUmVzb3VyY2UgTWFuYWdlciBzdGFydAotCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ0dyb3VwTGFiZWw9TG9hZExldmVsZXIgUHJveHkgUG9sbGluZyBPcHRpb25zCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ05vZGVNaW5Ub29sVGlwPU1pbmltdW0gbnVtYmVyIG9mIHNlY29uZHMgZm9yIHBvbGxpbmcgTG9hZExldmVsZXIgZm9yIE5vZGUgc3RhdHVzCi1JQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ05vZGVNaW5MYWJlbD1Ob2RlIE1pbgotSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdOb2RlTWF4VG9vbFRpcD1NYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIGZvciBwb2xsaW5nIExvYWRMZXZlbGVyIGZvciBOb2RlIHN0YXR1cwotSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdOb2RlTWF4TGFiZWw9Tm9kZSBNYXgKLUlCTUxMUHJlZldpelBhZ2UucHJveHlQb2xsaW5nSm9iVG9vbFRpcD1OdW1iZXIgb2Ygc2Vjb25kcyBmb3IgcG9sbGluZyBMb2FkTGV2ZWxlciBmb3IgSm9iIHN0YXR1cwotSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdKb2JMYWJlbD1Kb2IKLQotSUJNTExQcmVmV2l6UGFnZS5ndWlPcHRpb25zR3JvdXBMYWJlbD1Mb2FkTGV2ZWxlciBHdWkgTWVzc2FnZSBPcHRpb25zCi1JQk1MTFByZWZXaXpQYWdlLkd1aU1lc3NhZ2VMYWJlbD1NZXNzYWdlczoKLUlCTUxMUHJlZldpelBhZ2UuR3VpVHJhY2VNZXNzYWdlTGFiZWw9VHJhY2UKLUlCTUxMUHJlZldpelBhZ2UuR3VpVHJhY2VNZXNzYWdlVG9vbFRpcD1PdXRwdXQgZ3VpIHRyYWNlIG1lc3NhZ2VzIHRvIGNvbnNvbGUKLUlCTUxMUHJlZldpelBhZ2UuR3VpSW5mb01lc3NhZ2VMYWJlbD1JbmZvCi1JQk1MTFByZWZXaXpQYWdlLkd1aUluZm9NZXNzYWdlVG9vbFRpcD1PdXRwdXQgZ3VpIGluZm9ybWF0aW9uIG1lc3NhZ2VzIHRvIGNvbnNvbGUKLUlCTUxMUHJlZldpelBhZ2UuR3VpV2FybmluZ01lc3NhZ2VMYWJlbD1XYXJuaW5nCi1JQk1MTFByZWZXaXpQYWdlLkd1aVdhcm5pbmdNZXNzYWdlVG9vbFRpcD1PdXRwdXQgZ3VpIHdhcm5pbmcgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5HdWlFcnJvck1lc3NhZ2VMYWJlbD1FcnJvcgotSUJNTExQcmVmV2l6UGFnZS5HdWlFcnJvck1lc3NhZ2VUb29sVGlwPU91dHB1dCBndWkgZXJyb3IgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5HdWlGYXRhbE1lc3NhZ2VMYWJlbD1GYXRhbAotSUJNTExQcmVmV2l6UGFnZS5HdWlGYXRhbE1lc3NhZ2VUb29sVGlwPU91dHB1dCBndWkgZmF0YWwgbWVzc2FnZXMgdG8gY29uc29sZQotSUJNTExQcmVmV2l6UGFnZS5HdWlBcmdzTWVzc2FnZUxhYmVsPUFyZ3MKLUlCTUxMUHJlZldpelBhZ2UuR3VpQXJnc01lc3NhZ2VUb29sVGlwPU91dHB1dCBndWkgYXJndW1lbnQgbWVzc2FnZXMgdG8gY29uc29sZQotCi0KLUdlbmVyYWxUYWIudGl0bGU9R2VuZXJhbAotU2NoZWR1bGluZ0Jhc2ljVGFiLnRpdGxlPVNjaGVkdWxpbmcgKEJhc2ljKQotU2NoZWR1bGluZ1JlcXVpcmVtZW50c1RhYi50aXRsZT1TY2hlZHVsaW5nIChSZXF1aXJlbWVudHMpCi1TY2hlZHVsaW5nUmVzb3VyY2VzVGFiLnRpdGxlPVNjaGVkdWxpbmcgKFJlc291cmNlcykKLVJ1bnRpbWVUYWIudGl0bGU9UnVudGltZQotTm9kZXNOZXR3b3JrVGFiLnRpdGxlPU5vZGVzL05ldHdvcmsKLUxpbWl0c1RhYi50aXRsZT1MaW1pdHMKLUZpbGVTZWxlY3Rvci5Ccm93c2VCdXR0b249QnJvd3NlCi0KLUludmFsaWQubGxKb2JDb21tYW5kRmlsZT1Kb2IgQ29tbWFuZCBGaWxlIG11c3Qgc3BlY2lmeSBhIHJlYWRhYmxlIGZpbGUuCi1JbnZhbGlkLmxsSm9iQ29tbWFuZEZpbGVUZW1wbGF0ZT1Kb2IgQ29tbWFuZCBUZW1wbGF0ZSBGaWxlIG11c3Qgc3BlY2lmeSBhIHJlYWRhYmxlIGZpbGUuCi1JbnZhbGlkLmxsTGlicmFyeVBhdGg9TGlicmFyeSBQYXRoIG11c3Qgc3BlY2lmeSBhIHZhbGlkIGRpcmVjdG9yeS4KLUludmFsaWQubGxKb2JOYW1lPUpvYiBOYW1lIG11c3QgY29udGFpbiBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgbnVtYmVycywgb3IgYm90aC4KLUludmFsaWQubGxDbGFzcz1Kb2IgQ2xhc3MgbXVzdCBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBudW1iZXJzLCBvciBib3RoLgotSW52YWxpZC5sbE5vZGVNaW49Tm9kZSBNaW5pbXVtIG11c3Qgc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIuCi1JbnZhbGlkLmxsTm9kZU1heD1Ob2RlIE1heGltdW0gbXVzdCBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlci4KLUludmFsaWQubGxOb2RlTWluTWF4PU5vZGUgTWluaW11bSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBOb2RlIE1heGltdW0uCi1JbnZhbGlkLmxsQmxvY2tpbmc9QmxvY2tpbmcgbXVzdCBzcGVjaWZ5IHRoZSBtdWx0aXBsZSB0aGF0IHRhc2tzIGJlIGFzc2lnbmVkIHRvIG1hY2hpbmVzIG9yIFwidW5saW1pdGVkXCIgKHRhc2tzIGJlIGFzc2lnbmVkIHRvIGVhY2ggbWFjaGluZSB1bnRpbCBpdCBydW5zIG91dCBvZiBpbml0aWF0b3JzKS4KLUludmFsaWQubGxUYXNrc1Blck5vZGU9VGFza3MgUGVyIE5vZGUgbXVzdCBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlci4KLUludmFsaWQubGxUb3RhbFRhc2tzPVRvdGFsIFRhc2tzIG11c3Qgc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIuCi1JbnZhbGlkLmxsV2FsbENsb2NrTGltaXRIYXJkPUhhcmQgV2FsbCBDbG9jayBMaW1pdCBtdXN0IHNwZWNpZnkgdGhlIGhhcmQgbGltaXQgZm9yIGVsYXBzZWQgdGltZSBhIGpvYiBjYW4gcnVuLiBbW0hIOl1NTTpdU1MKLUludmFsaWQubGxXYWxsQ2xvY2tMaW1pdFNvZnQ9U29mdCBXYWxsIENsb2NrIExpbWl0IG11c3Qgc3BlY2lmeSB0aGUgc29mdCBsaW1pdCBmb3IgZWxhcHNlZCB0aW1lIGEgam9iIGNhbiBydW4uIFtbSEg6XU1NOl1TUwotSW52YWxpZC5sbFRhc2tzUGVyTm9kZV9sbFRvdGFsVGFza3M9VGFza3MgUGVyIE5vZGUgYW5kIFRvdGFsIFRhc2tzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIERvIG5vdCBzcGVjaWZ5IGJvdGggZm9yIHRoZSBzYW1lIGpvYi4KLUludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxKb2JUeXBlPVRhc2sgR2VvbWVudHJ5IGlzIG9uIHBlcm1pdHRlZCBmb3IgSm9iIFR5cGUgPSBQYXJhbGxlbC4KLUludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxUYXNrc1Blck5vZGU9VGFzayBHZW9tZXRyeSBhbmQgVGFza3MgUGVyIE5vZGUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gIERvIG5vdCBzcGVjaWZ5IGJvdGggZm9yIHRoZSBzYW1lIGpvYi4KLUludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxUb3RhbFRhc2tzPVRhc2sgR2VvbWV0cnkgYW5kIFRvdGFsIFRhc2tzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBEbyBub3Qgc3BlY2lmeSBib3RoIGZvciB0aGUgc2FtZSBqb2IuCi1JbnZhbGlkLmxsVGFza0dlb21ldHJ5X2xsTm9kZU1pbj1UYXNrIEdlb21ldHJ5IGFuZCBOb2RlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBEbyBub3Qgc3BlY2lmeSBib3RoIGZvciB0aGUgc2FtZSBqb2IuCi1JbnZhbGlkLmxsVGFza0dlb21ldHJ5X2xsTm9kZU1heD1UYXNrIEdlb21ldHJ5IGFuZCBOb2RlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBEbyBub3Qgc3BlY2lmeSBib3RoIGZvciB0aGUgc2FtZSBqb2IuCi1JbnZhbGlkLmxsVGFza0dlb21ldHJ5X2xsQmxvY2tpbmc9VGFzayBHZW9tZXRyeSBhbmQgQmxvY2tpbmcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gIERvIG5vdCBzcGVjaWZ5IGJvdGggZm9yIHRoZSBzYW1lIGpvYi4KLQotSUJNTExMYXVuY2guTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfTEFCRUw9TG9hZExldmVsZXIgam9iIGNvbW1hbmQgZmlsZToKLUlCTUxMTGF1bmNoLkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFX1RFTVBMQVRFX0xBQkVMPUxvYWRMZXZlbGVyIGpvYiBjb21tYW5kIGZpbGUgdGVtcGxhdGU6Ci1JQk1MTExhdW5jaC5MTF9QVFBfQ0xBU1NfTEFCRUw9Sm9iIGNsYXNzOgotSUJNTExMYXVuY2guTExfUFRQX0NPTU1FTlRfTEFCRUw9Q29tbWVudDoKLUlCTUxMTGF1bmNoLkxMX1BUUF9FUlJPUl9MQUJFTD1TdGFuZGFyZCBlcnJvcjoKLUlCTUxMTGF1bmNoLkxMX1BUUF9FWEVDVVRBQkxFX0xBQkVMPUV4ZWN1dGFibGUgKG92ZXJyaWRlKToKLUlCTUxMTGF1bmNoLkxMX1BUUF9FTlZJUk9OTUVOVF9MQUJFTD1FbnZpcm9ubWVudDoKLUlCTUxMTGF1bmNoLkxMX1BUUF9JTlBVVF9MQUJFTD1TdGFuZGFyZCBpbnB1dDoKLUlCTUxMTGF1bmNoLkxMX1BUUF9PVVRQVVRfTEFCRUw9U3RhbmRhcmQgb3V0cHV0OgotSUJNTExMYXVuY2guTExfUFRQX0lOSVRJQUxESVJfTEFCRUw9SW5pdGlhbGRpciAob3ZlcnJpZGUpOgotSUJNTExMYXVuY2guTExfUFRQX0pPQl9OQU1FX0xBQkVMPUpvYiBuYW1lOgotSUJNTExMYXVuY2guTExfUFRQX05FVFdPUktfTVBJX0xBQkVMPU5ldHdvcmsgbXBpOgotSUJNTExMYXVuY2guTExfUFRQX05FVFdPUktfTEFQSV9MQUJFTD1OZXR3b3JrIGxhcGk6Ci1JQk1MTExhdW5jaC5MTF9QVFBfTkVUV09SS19NUElfTEFQSV9MQUJFTD1OZXR3b3JrIG1waV9sYXBpOgotSUJNTExMYXVuY2guTExfUFRQX1JFUVVJUkVNRU5UU19MQUJFTD1SZXF1aXJlbWVudHM6Ci1JQk1MTExhdW5jaC5MTF9QVFBfUkVTT1VSQ0VTX0xBQkVMPVJlc291cmNlczoKLUlCTUxMTGF1bmNoLkxMX1BUUF9TSEVMTF9MQUJFTD1TaGVsbDoKLUlCTUxMTGF1bmNoLkxMX1BUUF9UQVNLX0dFT01FVFJZX0xBQkVMPVRhc2sgZ2VvbWV0cnk6Ci1JQk1MTExhdW5jaC5MTF9QVFBfTk9ERV9NSU5fTEFCRUw9Tm9kZSAobWluKToKLUlCTUxMTGF1bmNoLkxMX1BUUF9OT0RFX01BWF9MQUJFTD1Ob2RlIChtYXgpOgotSUJNTExMYXVuY2guTExfUFRQX0JMT0NLSU5HX0xBQkVMPUJsb2NraW5nOgotSUJNTExMYXVuY2guTExfUFRQX1RPVEFMX1RBU0tTX0xBQkVMPVRvdGFsIHRhc2tzOgotSUJNTExMYXVuY2guTExfUFRQX1dBTExDTE9DS19IQVJEX0xBQkVMPUhhcmQgd2FsbCBjbG9jayBsaW1pdDoKLUlCTUxMTGF1bmNoLkxMX1BUUF9XQUxMQ0xPQ0tfU09GVF9MQUJFTD1Tb2Z0IHdhbGwgY2xvY2sgbGltaXQ6Ci1JQk1MTExhdW5jaC5MTF9QVFBfVEFTS1NfUEVSX05PREVfTEFCRUw9VGFza3MgcGVyIG5vZGU6Ci1JQk1MTExhdW5jaC5MTF9QVFBfSk9CX1RZUEVfTEFCRUw9Sm9iIHR5cGU6Ci1JQk1MTExhdW5jaC5MTF9QVFBfQlVMS19YRkVSX0xBQkVMPUJ1bGt4ZmVyOgotSUJNTExMYXVuY2guTExfUFRQX0xBUkdFX1BBR0VfTEFCRUw9TGFyZ2UgcGFnZToKLUlCTUxMTGF1bmNoLkxMX1BUUF9TVUJNSVRfTU9ERV9MQUJFTD1TdWJtaXQgbW9kZToKLQotSUJNTExMYXVuY2guTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfVE9PTFRJUD1TcGVjaWZ5IGNvbXBsZXRlIGNvbW1hbmQgZmlsZSBpZiBhZHZhbmNlZCBtb2RlIChubyBzdWJzdGl0dXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkKS4KLUlCTUxMTGF1bmNoLkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFX1RFTVBMQVRFX1RPT0xUSVA9U3BlY2lmeSBjb21tYW5kIGZpbGUgdGhhdCBtYXkgdXNlIDw8PEtFWVdPUkQ+Pj4gc3Vic3RpdHV0aW9ucyBpZiB1c2luZyBiYXNpYyBtb2RlLgotSUJNTExMYXVuY2guTExfUFRQX0NMQVNTX1RPT0xUSVA9U3BlY2lmeSB0aGUgam9iIGNsYXNzIHRvIHVzZS4gU3ludGF4OiBjbGFzcyA9IG5hbWUKLUlCTUxMTGF1bmNoLkxMX1BUUF9DT01NRU5UX1RPT0xUSVA9U3BlY2lmeSB0ZXh0IHRvIGRlc2NyaWJlIGNoYXJhY3RlcmlzdGljcyBvciBkaXN0aW5ndWlzaGluZyBmZWF0dXJlcyBvZiB0aGUgam9iLiBTeW50YXg6IGNvbW1lbnQgPSBkZXNjcmlwdGlvbgotSUJNTExMYXVuY2guTExfUFRQX0VSUk9SX1RPT0xUSVA9U3BlY2lmeSBhIGZpbGUgdG8gdXNlIGFzIHN0YW5kYXJkIGVycm9yIChzdGRlcnIpIHdoZW4gdGhlIGpvYiBydW5zLiBTeW50YXg6IGVycm9yID0gZmlsZW5hbWUKLUlCTUxMTGF1bmNoLkxMX1BUUF9FWEVDVVRBQkxFX1RPT0xUSVA9T3ZlcnJpZGUgdGhlIGV4ZWN1dGFibGUgZGVmaW5lZCBvbiB0aGUgUFRQIG1lbnUuIFN5bnRheDogZXhlY3V0YWJsZSA9IG5hbWUKLUlCTUxMTGF1bmNoLkxMX1BUUF9FTlZJUk9OTUVOVF9UT09MVElQPVNwZWNpZmllcyBsb2dpbiBpbml0aWFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgYnkgTG9hZExldmVsZXIgd2hlbiB5b3VyIGpvYiBzdGVwIHN0YXJ0cyBhbmQgb3ZlcnJpZGVzIGFueSBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBzcGVjaWZpZWQgb24gdGhlIFBUUCBlbnZpcm9ubWVudCBtZW51LiBTeW50YXg6IGVudmlyb25tZW50ID0gZW52MSA7IGVudjIgOyAuLi4KLUlCTUxMTGF1bmNoLkxMX1BUUF9JTlBVVF9UT09MVElQPVNwZWNpZnkgYSBmaWxlIHRvIHVzZSBhcyBzdGFuZGFyZCBpbnB1dCAoc3RkaW4pIHdoZW4gdGhlIGpvYiBydW5zLiBTeW50YXg6IGlucHV0ID0gZmlsZW5hbWUKLUlCTUxMTGF1bmNoLkxMX1BUUF9PVVRQVVRfVE9PTFRJUD1TcGVjaWZ5IGEgZmlsZSB0byB1c2UgYXMgc3RhbmRhcmQgb3V0cHV0IChzdGRvdXQpIHdoZW4gdGhlIGpvYiBydW5zLiBTeW50YXg6IG91dHB1dCA9IGZpbGVuYW1lCi1JQk1MTExhdW5jaC5MTF9QVFBfSU5JVElBTERJUl9UT09MVElQPU92ZXJyaWRlIHRoZSBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5IHNwZWNpZmllZCBvbiB0aGUgUFRQIG1lbnUuIFN5bnRheDogaW5pdGlhbGRpciA9IHBhdGhuYW1lCi1JQk1MTExhdW5jaC5MTF9QVFBfSk9CX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBqb2IuIFN5bnRheDogam9iX25hbWUgPSBqb2JfbmFtZQotSUJNTExMYXVuY2guTExfUFRQX05FVFdPUktfTVBJX1RPT0xUSVA9U3BlY2lmeSB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbHMsIGFkYXB0ZXJzIGFuZCB0aGVpciBjaGFyYWN0ZXJpc3RpY3MuIFN5bnRheDogbmV0d29yay5wcm90b2NvbCA9IHR5cGUgWyx1c2FnZVssbW9kZVssY29tbV9sZXZlbFssaW5zdGFuY2VzPTxudW1iZXJ8bWF4PlsscmN4dGJsb2Nrcz1udW1iZXJdXV1dXQotSUJNTExMYXVuY2guTExfUFRQX05FVFdPUktfTEFQSV9UT09MVElQPVNwZWNpZnkgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2xzLCBhZGFwdGVycyBhbmQgdGhlaXIgY2hhcmFjdGVyaXN0aWNzLiBTeW50YXg6IG5ldHdvcmsucHJvdG9jb2wgPSB0eXBlIFssdXNhZ2VbLG1vZGVbLGNvbW1fbGV2ZWxbLGluc3RhbmNlcz08bnVtYmVyfG1heD5bLHJjeHRibG9ja3M9bnVtYmVyXV1dXV0KLUlCTUxMTGF1bmNoLkxMX1BUUF9ORVRXT1JLX01QSV9MQVBJX1RPT0xUSVA9U3BlY2lmeSB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbHMsIGFkYXB0ZXJzIGFuZCB0aGVpciBjaGFyYWN0ZXJpc3RpY3MuIFN5bnRheDogbmV0d29yay5wcm90b2NvbCA9IHR5cGUgWyx1c2FnZVssbW9kZVssY29tbV9sZXZlbFssaW5zdGFuY2VzPTxudW1iZXJ8bWF4PlsscmN4dGJsb2Nrcz1udW1iZXJdXV1dXQotSUJNTExMYXVuY2guTExfUFRQX1JFUVVJUkVNRU5UU19UT09MVElQPVNwZWNpZnkgdGhlIHJlcXVpcmVtZW50cyB3aGljaCBhIG5vZGUgaW4gdGhlIExvYWRMZXZlbGVyIGNsdXN0ZXIgbXVzdCBtZWV0IHRvIGV4ZWN1dGUgYW55IGpvYi4gU3ludGF4OiByZXF1aXJlbWVudHMgPSBCb29sZWFuX2V4cHJlc3Npb24KLUlCTUxMTGF1bmNoLkxMX1BUUF9SRVNPVVJDRVNfVE9PTFRJUD1TcGVjaWZ5IHF1YW50aXRpZXMgb2YgdGhlIGNvbnN1bWFibGUgcmVzb3VyY2VzIGNvbnN1bWVkIGJ5IGVhY2ggdGFzayBvZiBhIGpvYi4gU3ludGF4OiByZXNvdXJjZXM9bmFtZShjb3VudCkgbmFtZShjb3VudCkgLi4uIG5hbWUoY291bnQpCi1JQk1MTExhdW5jaC5MTF9QVFBfU0hFTExfVE9PTFRJUD1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzaGVsbCB0byB1c2UgZm9yIHRoZSBqb2IuIFN5bnRheDogc2hlbGwgPSBuYW1lCi1JQk1MTExhdW5jaC5MTF9QVFBfVEFTS19HRU9NRVRSWV9UT09MVElQPUdyb3VwIHRhc2tzIG9mIGEgcGFyYWxsZWwgam9iIHRvIHJ1biB0b2dldGhlciBvbiB0aGUgc2FtZSBub2RlLiBTeW50YXg6IHRhc2tfZ2VvbWV0cnk9eyh0YXNrIGlkLHRhc2sgaWQsLi4uKSh0YXNrIGlkLHRhc2sgaWQsIC4uLikgLi4uIH0KLUlCTUxMTGF1bmNoLkxMX1BUUF9OT0RFX01JTl9UT09MVElQPVNwZWNpZnkgdGhlIG1pbmltdW0gbnVtYmVyIG9mIG5vZGVzIHJlcXVlc3RlZC4gU3ludGF4OiBub2RlID0gW21pbl1bLG1heF0KLUlCTUxMTGF1bmNoLkxMX1BUUF9OT0RFX01BWF9UT09MVElQPVNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzIHJlcXVlc3RlZC4gU3ludGF4OiBub2RlID0gW21pbl1bLG1heF0KLUlCTUxMTGF1bmNoLkxMX1BUUF9CTE9DS0lOR19UT09MVElQPVNwZWNpZnkgdGhlIG11bHRpcGxlIGZvciB3aGljaCB0YXNrcyB3aWxsIGJlIGFzc2lnbmVkIHRvIG5vZGVzLiBTeW50YXg6IGJsb2NraW5nID0gaW50ZWdlciB8IHVubGltaXRlZAotSUJNTExMYXVuY2guTExfUFRQX1RPVEFMX1RBU0tTX1RPT0xUSVA9U3BlY2lmeSB0aGUgdG90YWwgbnVtYmVyIG9mIHRhc2tzIG9mIGEgcGFyYWxsZWwgam9iIHlvdSB3YW50IHRvIHJ1biBvbiB0aGUgYXZhaWxhYmxlIG5vZGVzLiBTeW50YXg6IHRvdGFsX3Rhc2tzID0gbnVtYmVyCi1JQk1MTExhdW5jaC5MTF9QVFBfV0FMTENMT0NLX0hBUkRfVE9PTFRJUD1TcGVjaWZ5IHRoZSBoYXJkIGxpbWl0IChISDpNTTpTUykgZm9yIHRoZSBlbGFwc2VkIHRpbWUgdGhlIGpvYiBjYW4gcnVuLiBTeW50YXg6IHdhbGxfY2xvY2tfbGltaXQgPSBoYXJkbGltaXQsc29mdGxpbWl0Ci1JQk1MTExhdW5jaC5MTF9QVFBfV0FMTENMT0NLX1NPRlRfVE9PTFRJUD1TcGVjaWZ5IHRoZSBzb2Z0IGxpbWl0IChISDpNTTpTUykgZm9yIHRoZSBlbGFwc2VkIHRpbWUgdGhlIGpvYiBjYW4gcnVuLiBTeW50YXg6IHdhbGxfY2xvY2tfbGltaXQgPSBoYXJkbGltaXQsc29mdGxpbWl0Ci1JQk1MTExhdW5jaC5MTF9QVFBfVEFTS1NfUEVSX05PREVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGFza3Mgb2YgYSBwYXJhbGxlbCBqb2IgeW91IHdhbnQgdG8gcnVuIHBlciBub2RlLiBTeW50YXg6IHRhc2tzX3Blcl9ub2RlID0gbnVtYmVyCi1JQk1MTExhdW5jaC5MTF9QVFBfSk9CX1RZUEVfVE9PTFRJUD1TcGVjaWZ5IHRoZSB0eXBlIG9mIHRoZSBqb2IuIFN5bnRheDogam9iX3R5cGUgPSBzZXJpYWwgfCBwYXJhbGxlbCB8IE1QSUNICi1JQk1MTExhdW5jaC5MTF9QVFBfQlVMS19YRkVSX1RPT0xUSVA9U3BlY2lmeSB3aGV0aGVyIHRoZSBjb21tdW5pY2F0aW9ucyBzdWJzeXN0ZW0gd2lsbCB1c2UgYnVsayBkYXRhIHRyYW5zZmVyIGZvciB1c2VyIHNwYWNlIGpvYnMuIFN5bnRheDogYnVsa3hmZXIgPSB5ZXMgfCBubyAKLUlCTUxMTGF1bmNoLkxMX1BUUF9MQVJHRV9QQUdFX1RPT0xUSVA9U3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBhIGpvYiByZXF1aXJlcyBMYXJnZSBQYWdlIHN1cHBvcnQgZnJvbSBBSVguIFN5bnRheDogbGFyZ2VfcGFnZSA9IHZhbHVlCi1JQk1MTExhdW5jaC5MTF9QVFBfU1VCTUlUX01PREVfVE9PTFRJUD1BZHZhbmNlZCBtb2RlKHN1Ym1pdCBjb21wbGV0ZSBqb2IgY29tbWFuZCBmaWxlIC0gbm8gc3Vic3RpdHV0aW9ucykgb3IgQmFzaWMgbW9kZSAoc3VibWl0IGpvYiBjb21tYW5kIGZpbGUgdGVtcGxhdGUgYWZ0ZXIgbWVudSBzdWJzdGl0dXRpb25zKS4KLQotV2l6YXJkLkludm9jYXRpb25PcHRpb25zVGl0bGU9SUJNIExvYWRMZXZlbGVyIFByb3h5IEludm9jYXRpb24gT3B0aW9ucwotV2l6YXJkLkludm9jYXRpb25PcHRpb25zPVNwZWNpZnkgaW52b2NhdGlvbiBvcHRpb25zIGZvciBJQk0gTG9hZExldmVsZXIgcHJveHkgc2VydmVyCi1XaXphcmQuQ29uZmlndXJhdGlvblRpdGxlPUlCTSBMb2FkTGV2ZWxlciBQcm94eSBDb25maWd1cmF0aW9uCi1XaXphcmQuQ29uZmlndXJhdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25uZWN0IHRvIGFuIElCTSBMb2FkTGV2ZWxlciBwcm94eSBzZXJ2ZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3ByZWZlcmVuY2VzL0lCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcHJlZmVyZW5jZXMvSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmQwMjguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcHJlZmVyZW5jZXMvSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5wcmVmZXJlbmNlczsKLQotcHVibGljIGludGVyZmFjZSBJQk1MTFByZWZlcmVuY2VDb25zdGFudHMKLXsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1lFUyA9ICJZIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9OTyA9ICJOIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9JTkZPX01FU1NBR0UgPSAiUHJveHlJbmZvTWVzc2FnZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfVFJBQ0VfTUVTU0FHRSA9ICJQcm94eVRyYWNlTWVzc2FnZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfV0FSTklOR19NRVNTQUdFID0gIlByb3h5V2FybmluZ01lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0VSUk9SX01FU1NBR0UgPSAiUHJveHlFcnJvck1lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0ZBVEFMX01FU1NBR0UgPSAiUHJveHlGYXRhbE1lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0FSR1NfTUVTU0FHRSA9ICJQcm94eUFyZ3NNZXNzYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9ERUJVR19MT09QPSJQcm94eURlYnVnTG9vcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfTE9BRExFVkVMRVJfTElCUkFSWV9QQVRIPSJQcm94eUxvYWRMZXZlbGVyTGlicmFyeVBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0RFRkFVTFRfTVVMVElDTFVTVEVSPSJQcm94eUxvYWRMZXZlbGVyTXVsdGljbHVzdGVyRGVmYXVsdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfRk9SQ0VfTE9DQUw9IlByb3h5TG9hZExldmVsZXJNdWx0aWNsdXN0ZXJGb3JjZUxvY2FsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9GT1JDRV9NVUxUSUNMVVNURVI9IlByb3h5TG9hZExldmVsZXJNdWx0aWNsdXN0ZXJGb3JjZU11bHRpY2x1c3RlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfTE9BRExFVkVMRVJfVEVNUExBVEVfRklMRT0iUHJveHlMb2FkTGV2ZWxlclRlbXBsYXRlRmlsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfV1JJVEVfVEVNUExBVEVfQUxXQVlTPSJQcm94eUxvYWRMZXZlbGVyVGVtcGxhdGVBbHdheXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1dSSVRFX1RFTVBMQVRFX05FVkVSPSJQcm94eUxvYWRMZXZlbGVyVGVtcGxhdGVOZXZlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfTUlOX05PREVfUE9MTElORz0iUHJveHlNaW5pbXVtTm9kZVBvbGxpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX01BWF9OT0RFX1BPTExJTkc9IlByb3h5TWF4aW11bU5vZGVQb2xsaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9KT0JfUE9MTElORz0iUHJveHlKb2JQb2xsaW5nIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlfSU5GT19NRVNTQUdFID0gIkd1aUluZm9NZXNzYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlfVFJBQ0VfTUVTU0FHRSA9ICJHdWlUcmFjZU1lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSV9XQVJOSU5HX01FU1NBR0UgPSAiR3VpV2FybmluZ01lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSV9FUlJPUl9NRVNTQUdFID0gIkd1aUVycm9yTWVzc2FnZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJX0ZBVEFMX01FU1NBR0UgPSAiR3VpRmF0YWxNZXNzYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlfQVJHU19NRVNTQUdFID0gIkd1aUFyZ3NNZXNzYWdlIjsKLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3ByZWZlcmVuY2VzL0lCTUxMUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3ByZWZlcmVuY2VzL0lCTUxMUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmOGFkZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9wcmVmZXJlbmNlcy9JQk1MTFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICogIAotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkuSUJNTExQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RSZW1vdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIElCTUxMUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgVGV4dCBwcm94eUxpYnJhcnlUZXh0V2lkZ2V0ID0gbnVsbDsKLQlwcml2YXRlIEV2ZW50TW9uaXRvciBsaWJyYXJ5TGlzdGVuZXIgPSBudWxsOyAvKiB2YWxpZGF0ZSBsaWJyYXJ5IG5hbWUgKi8KLQlwcml2YXRlIEJ1dHRvbiBsaWJyYXJ5QnJvd3NlQnV0dG9uID0gbnVsbDsKLQotCXByaXZhdGUgQnV0dG9uIHByb3h5VHJhY2VNZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eUluZm9NZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eVdhcm5pbmdNZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eUVycm9yTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcHJveHlGYXRhbE1lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHByb3h5QXJnc01lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHByb3h5RGVidWdMb29wQnV0dG9uID0gbnVsbDsKLQotCXByaXZhdGUgQnV0dG9uIHByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eUZvcmNlTXVsdGljbHVzdGVyUmFkaW9CdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHByb3h5TExEZWZhdWx0UmFkaW9CdXR0b24gPSBudWxsOwotCi0JcHJpdmF0ZSBUZXh0IHByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0ID0gbnVsbDsKLQlwcml2YXRlIEV2ZW50TW9uaXRvciB0ZW1wbGF0ZUxpc3RlbmVyID0gbnVsbDsgLyogdmFsaWRhdGUgdGVtcGxhdGUgZmlsZSBuYW1lICovCi0JcHJpdmF0ZSBCdXR0b24gcHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gdGVtcGxhdGVCcm93c2VCdXR0b24gPSBudWxsOwotCi0JcHJpdmF0ZSBTcGlubmVyIHByb3h5UG9sbGluZ05vZGVNaW4gPSBudWxsOwotCXByaXZhdGUgU3Bpbm5lciBwcm94eVBvbGxpbmdOb2RlTWF4ID0gbnVsbDsKLQlwcml2YXRlIFNwaW5uZXIgcHJveHlQb2xsaW5nSm9iID0gbnVsbDsKLQotCXByaXZhdGUgQnV0dG9uIGd1aVRyYWNlTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZ3VpSW5mb01lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGd1aVdhcm5pbmdNZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBndWlFcnJvck1lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGd1aUZhdGFsTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZ3VpQXJnc01lc3NhZ2VCdXR0b24gPSBudWxsOwotCi0JcHJpdmF0ZSBFdmVudE1vbml0b3IgZXZlbnRNb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLS8vCQlTeXN0ZW0uZXJyLnByaW50bG4oInByZWZlcmVuY2VzOiBwZXJmb3JtT2sgZW50ZXJlZC4uLiIpOwotCQl1cGRhdGVQcmVmZXJlbmNlUGFnZSgpOwotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFdmVudE1vbml0b3IgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgRXZlbnRNb25pdG9yKCkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oInByZWZlcmVuY2VzOiBFdmVudE1vbml0b3IiKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCVN5c3RlbS5lcnIucHJpbnRsbigicHJlZmVyZW5jZXM6IHdpZGdldERlZmF1bHRTZWxlY3RlZCIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oInByZWZlcmVuY2VzOiB3aWRnZXRTZWxlY3RlZCIpOwotCQotCQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJCWlmIChzb3VyY2UgPT0gbGlicmFyeUJyb3dzZUJ1dHRvbikgewotLy8JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicHJlZmVyZW5jZXM6IGxpYnJhcnlCcm93c2VCdXR0b24iKTsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZFBhdGggPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWRQYXRoICE9IG51bGwpCi0JCQkJCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0LnNldFRleHQoc2VsZWN0ZWRQYXRoKTsKLQkJCQl9IAotCQkJCWVsc2UgaWYgKHNvdXJjZSA9PSB0ZW1wbGF0ZUJyb3dzZUJ1dHRvbikgewotLy8JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicHJlZmVyZW5jZXM6IHRlbXBsYXRlQnJvd3NlQnV0dG9uIik7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJCVN0cmluZyBjb3JyZWN0UGF0aCA9IGdldEZpZWxkQ29udGVudChwcm94eVRlbXBsYXRlVGV4dFdpZGdldC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJaWYgKGNvcnJlY3RQYXRoICE9IG51bGwpIHsKLQkJCQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGNvcnJlY3RQYXRoKTsKLQkJCQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKHBhdGguaXNGaWxlKCkgPyBjb3JyZWN0UGF0aCA6IHBhdGgKLQkJCQkJCQkJCS5nZXRQYXJlbnQoKSk7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgc2VsZWN0ZWRQYXRoID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKQotCQkJCQkJcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuc2V0VGV4dChzZWxlY3RlZFBhdGgpOwotCQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldE1vZGlmaWVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJwcmVmZXJlbmNlczogd2lkZ2V0TW9kaWZpZWQiKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oInByZWZlcmVuY2VzOiBtb2RpZnlUZXh0Iik7Ci0vLwkJCVN5c3RlbS5lcnIucHJpbnRsbigid2lkZ2V0IGVudGVyZWQgaXMgIisgZS53aWRnZXQudG9TdHJpbmcoKSk7Ci0JCQlpZiAoZS53aWRnZXQuZXF1YWxzKHByb3h5UG9sbGluZ0pvYikpIHsKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigid2lkZ2V0IGVudGVyZWQgaXMgcHJveHlQb2xsaW5nSm9iIik7Ci0JCQl9Ci0JCQlpZiAoZS53aWRnZXQuZXF1YWxzKHByb3h5UG9sbGluZ05vZGVNaW4pKSB7Ci0vLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIndpZGdldCBlbnRlcmVkIGlzIHByb3h5UG9sbGluZ05vZGVNaW4iKTsKLQkJCQlpbnQgbWluX3ZhbHVlID0gcHJveHlQb2xsaW5nTm9kZU1pbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgbWF4X3ZhbHVlID0gcHJveHlQb2xsaW5nTm9kZU1heC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAobWluX3ZhbHVlID4gbWF4X3ZhbHVlKSB7Ci0JCQkJCXByb3h5UG9sbGluZ05vZGVNYXguc2V0U2VsZWN0aW9uKG1pbl92YWx1ZSk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJaWYgKGUud2lkZ2V0LmVxdWFscyhwcm94eVBvbGxpbmdOb2RlTWF4KSkgewotLy8JCQkJU3lzdGVtLmVyci5wcmludGxuKCJ3aWRnZXQgZW50ZXJlZCBpcyBwcm94eVBvbGxpbmdOb2RlTWF4Iik7Ci0JCQkJaW50IG1pbl92YWx1ZSA9IHByb3h5UG9sbGluZ05vZGVNaW4uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IG1heF92YWx1ZSA9IHByb3h5UG9sbGluZ05vZGVNYXguZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKG1heF92YWx1ZSA8IG1pbl92YWx1ZSkgewotCQkJCQlwcm94eVBvbGxpbmdOb2RlTWluLnNldFNlbGVjdGlvbihtYXhfdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlLndpZGdldC5lcXVhbHMocHJveHlMaWJyYXJ5VGV4dFdpZGdldCkpIHsKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigid2lkZ2V0IGVudGVyZWQgaXMgcHJveHlMaWJyYXJ5VGV4dFdpZGdldCIpOwotCQkJCVN0cmluZyBjb3JyZWN0UGF0aCA9IGdldEZpZWxkQ29udGVudChwcm94eUxpYnJhcnlUZXh0V2lkZ2V0LmdldFRleHQoKS50cmltKCkpOwotCQkJCWlmIChjb3JyZWN0UGF0aCAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGNvcnJlY3RQYXRoKTsKLQkJCQkJaWYgKHBhdGguZXhpc3RzKCkgJiYgKHBhdGguaXNEaXJlY3RvcnkoKSkpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJCXNldFZhbGlkKHRydWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzCi0JCQkJCQkJCS5nZXRTdHJpbmcoIkludmFsaWQubGxMaWJyYXJ5UGF0aCIpKTsKLQkJCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChlLndpZGdldC5lcXVhbHMocHJveHlUZW1wbGF0ZVRleHRXaWRnZXQpKSB7Ci0vLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIndpZGdldCBlbnRlcmVkIGlzIHByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0Iik7Ci0JCQkJU3RyaW5nIGNvcnJlY3RQYXRoID0gZ2V0RmllbGRDb250ZW50KHByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0LmdldFRleHQoKS50cmltKCkpOwotCQkJCWlmIChjb3JyZWN0UGF0aCAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGNvcnJlY3RQYXRoKTsKLQkJCQkJaWYgKHBhdGguZXhpc3RzKCkgJiYgKHBhdGguaXNGaWxlKCkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCQlzZXRWYWxpZCh0cnVlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcwotCQkJCQkJCQkuZ2V0U3RyaW5nKCJJbnZhbGlkLmxsSm9iQ29tbWFuZEZpbGVUZW1wbGF0ZSIpKTsKLQkJCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCi0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBJQk1MTFByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlJQk1MTFByZWZlcmVuY2VNYW5hZ2VyLnNhdmVQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgd2lkZ2V0cyBmb3IgcHJlZmVyZW5jZSBzZXR0aW5ncy4gVGhpcyBtZXRob2QgY2FsbHMgdGhlCi0JICogc3VwZXJjbGFzcyBjcmVhdGVDb250ZW50cygpIG1ldGhvZCB0byBjcmVhdGUgdGhlIGRlZmF1bHQgd2lkZ2V0cyBmb3IgdGhlCi0JICogcGFuZWwsIHRoZW4gY3JlYXRlcyB0aGUgYWRkaXRpb25hbCB3aWRnZXRzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgd2lkZ2V0IGZvciB0aGlzIHBhbmUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b3AgbGV2ZWwgd2lkZ2V0IGZvciB0aGUgcHJlZmVyZW5jZSBwYW5lCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIHByZWZlcmVuY2VQYW5lOwotCQlHcm91cCBwcm94eUxpYnJhcnlHcm91cCA9IG51bGw7Ci0JCUdyb3VwIHByb3h5T3B0aW9uc0dyb3VwID0gbnVsbDsKLQkJR3JvdXAgcHJveHlEZWJ1Z0dyb3VwID0gbnVsbDsKLQkJR3JvdXAgZ3VpT3B0aW9uc0dyb3VwID0gbnVsbDsKLQkJR3JvdXAgcHJveHlNdWx0aWNsdXN0ZXJHcm91cCA9IG51bGw7Ci0JCUdyb3VwIHByb3h5VGVtcGxhdGVHcm91cCA9IG51bGw7Ci0JCUdyb3VwIHByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXAgPSBudWxsOwotCQlHcm91cCBwcm94eVBvbGxpbmdHcm91cCA9IG51bGw7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQkJbGlicmFyeUJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JCXRlbXBsYXRlQnJvd3NlQnV0dG9uID0gbnVsbDsKLQkJCi0JCVN0cmluZyBwcmVmZXJlbmNlVmFsdWU7Ci0KLQkJcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlldmVudE1vbml0b3IgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0JCXByZWZlcmVuY2VQYW5lID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gQWx0ZXJuYXRlIExvYWRMZXZlbGVyIExpYnJhcnkgSW5zdGFsbCBMb2NhdGlvbgotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlMaWJyYXJ5R3JvdXAgPSBuZXcgR3JvdXAoKENvbXBvc2l0ZSkgcHJlZmVyZW5jZVBhbmUsIFNXVC5OT05FKTsKLQkJcHJveHlMaWJyYXJ5R3JvdXAuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMywgZmFsc2UsIDAsIDApKTsKLQkJcHJveHlMaWJyYXJ5R3JvdXAuc2V0TGF5b3V0RGF0YShzcGFuR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLAotCQkJCTUpKTsKLQkJcHJveHlMaWJyYXJ5R3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlMaWJyYXJ5R3JvdXBMYWJlbCIpKTsKLQotCQluZXcgTGFiZWwocHJveHlMaWJyYXJ5R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eUxpYnJhcnlMYWJlbCIpKTsKLQotCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0ID0gbmV3IFRleHQocHJveHlMaWJyYXJ5R3JvdXAsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5CT1JERVIpOwotCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0JCXByb3h5TGlicmFyeVRleHRXaWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJcHJveHlMaWJyYXJ5VGV4dFdpZGdldAotCQkJCS5zZXRUZXh0KHByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9MT0FETEVWRUxFUl9MSUJSQVJZX1BBVEgpKTsKLQkJcHJveHlMaWJyYXJ5VGV4dFdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlMaWJyYXJ5VG9vbFRpcCIpKTsKLQotCQkgbGlicmFyeUJyb3dzZUJ1dHRvbiA9Ci0JCSBTV1RVdGlsLmNyZWF0ZVB1c2hCdXR0b24ocHJveHlMaWJyYXJ5R3JvdXAsIE1lc3NhZ2VzCi0JCSAuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLmJyb3dzZUJ1dHRvbiIpLAotCQkgbnVsbCk7Ci0JCSBsaWJyYXJ5QnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0KLQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIENoZWNrIGJveCBncm91cCBmb3IgcHJveHkgbWVzc2FnZXMKLQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXByb3h5T3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCXByb3h5T3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlwcm94eU9wdGlvbnNHcm91cC5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU9wdGlvbnNHcm91cExhYmVsIikpOwotCi0JCXByb3h5VHJhY2VNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJcHJveHlUcmFjZU1lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlUcmFjZU1lc3NhZ2VMYWJlbCIpKTsKLQkJcHJveHlUcmFjZU1lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5VHJhY2VNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9UUkFDRV9NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCXByb3h5VHJhY2VNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkvLyBwcm94eVRyYWNlTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCXByb3h5SW5mb01lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5T3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlwcm94eUluZm9NZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5SW5mb01lc3NhZ2VMYWJlbCIpKTsKLQkJcHJveHlJbmZvTWVzc2FnZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlJbmZvTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfSU5GT19NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCXByb3h5SW5mb01lc3NhZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCS8vIHByb3h5SW5mb01lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQlwcm94eVdhcm5pbmdNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJcHJveHlXYXJuaW5nTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eVdhcm5pbmdNZXNzYWdlTGFiZWwiKSk7Ci0JCXByb3h5V2FybmluZ01lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5V2FybmluZ01lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1dBUk5JTkdfTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eVdhcm5pbmdNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkvLyBwcm94eVdhcm5pbmdNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJcHJveHlFcnJvck1lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5T3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlwcm94eUVycm9yTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eUVycm9yTWVzc2FnZUxhYmVsIikpOwotCQlwcm94eUVycm9yTWVzc2FnZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlFcnJvck1lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0VSUk9SX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJcHJveHlFcnJvck1lc3NhZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCS8vIHByb3h5RXJyb3JNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJcHJveHlGYXRhbE1lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5T3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlwcm94eUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eUZhdGFsTWVzc2FnZUxhYmVsIikpOwotCQlwcm94eUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlGYXRhbE1lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0ZBVEFMX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJcHJveHlGYXRhbE1lc3NhZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCS8vIHByb3h5RmF0YWxNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJcHJveHlBcmdzTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByb3h5QXJnc01lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlBcmdzTWVzc2FnZUxhYmVsIikpOwotCQlwcm94eUFyZ3NNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eUFyZ3NNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9BUkdTX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJcHJveHlBcmdzTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gcHJveHlBcmdzTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBDaGVjayBib3ggZ3JvdXAgZm9yIHByb3h5IGRlYnVnCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlwcm94eURlYnVnR3JvdXAgPSBuZXcgR3JvdXAoKENvbXBvc2l0ZSkgcHJlZmVyZW5jZVBhbmUsIFNXVC5OT05FKTsKLQkJcHJveHlEZWJ1Z0dyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlwcm94eURlYnVnR3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlEZWJ1Z0dyb3VwTGFiZWwiKSk7Ci0KLQkJcHJveHlEZWJ1Z0xvb3BCdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5RGVidWdHcm91cCwgU1dULkNIRUNLKTsKLQkJcHJveHlEZWJ1Z0xvb3BCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlEZWJ1Z0xvb3BMYWJlbCIpKTsKLQkJcHJveHlEZWJ1Z0xvb3BCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5RGVidWdMb29wVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9ERUJVR19MT09QKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCXByb3h5RGVidWdMb29wQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkvLyBwcm94eURlYnVnTG9vcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBDaGVjayBib3ggZ3JvdXAgZm9yIGd1aSBtZXNzYWdlcwotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJZ3VpT3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCWd1aU9wdGlvbnNHcm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3VpT3B0aW9uc0dyb3VwLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLmd1aU9wdGlvbnNHcm91cExhYmVsIikpOwotCi0JCWd1aVRyYWNlTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3VpT3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlndWlUcmFjZU1lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuR3VpVHJhY2VNZXNzYWdlTGFiZWwiKSk7Ci0JCWd1aVRyYWNlTWVzc2FnZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuR3VpVHJhY2VNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfVFJBQ0VfTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlndWlUcmFjZU1lc3NhZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCS8vIGd1aVRyYWNlTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCWd1aUluZm9NZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aUluZm9NZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aUluZm9NZXNzYWdlTGFiZWwiKSk7Ci0JCWd1aUluZm9NZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlJbmZvTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0lORk9fTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlndWlJbmZvTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gZ3VpSW5mb01lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQlndWlXYXJuaW5nTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3VpT3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlndWlXYXJuaW5nTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlXYXJuaW5nTWVzc2FnZUxhYmVsIikpOwotCQlndWlXYXJuaW5nTWVzc2FnZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuR3VpV2FybmluZ01lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9XQVJOSU5HX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJZ3VpV2FybmluZ01lc3NhZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCS8vIGd1aVdhcm5pbmdNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJZ3VpRXJyb3JNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aUVycm9yTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlFcnJvck1lc3NhZ2VMYWJlbCIpKTsKLQkJZ3VpRXJyb3JNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlFcnJvck1lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9FUlJPUl9NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCWd1aUVycm9yTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gZ3VpRXJyb3JNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJZ3VpRmF0YWxNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlGYXRhbE1lc3NhZ2VMYWJlbCIpKTsKLQkJZ3VpRmF0YWxNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlGYXRhbE1lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9GQVRBTF9NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCWd1aUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gZ3VpRmF0YWxNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJZ3VpQXJnc01lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGd1aU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJZ3VpQXJnc01lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuR3VpQXJnc01lc3NhZ2VMYWJlbCIpKTsKLQkJZ3VpQXJnc01lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aUFyZ3NNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfQVJHU19NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCWd1aUFyZ3NNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkvLyBndWlBcmdzTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBSYWRpbyBib3ggZ3JvdXAgZm9yIG11bHRpY2x1c3RlcgotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlNdWx0aWNsdXN0ZXJHcm91cCA9IG5ldyBHcm91cCgoQ29tcG9zaXRlKSBwcmVmZXJlbmNlUGFuZSwgU1dULk5PTkUpOwotCQlwcm94eU11bHRpY2x1c3Rlckdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlwcm94eU11bHRpY2x1c3Rlckdyb3VwLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5TXVsdGljbHVzdGVyR3JvdXBMYWJlbCIpKTsKLQotCQlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU11bHRpY2x1c3Rlckdyb3VwLAotCQkJCVNXVC5SQURJTyk7Ci0JCXByb3h5TExEZWZhdWx0UmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckRlZmF1bHRMYWJlbCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9ERUZBVUxUX01VTFRJQ0xVU1RFUik7Ci0gICAgICAgIGlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0gICAgICAgIAlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotCQlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUCkpOwotCQkvLyBwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCQlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uCi0JCQkJLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5TXVsdGljbHVzdGVyRGVmYXVsdFRvb2xUaXAiKSk7Ci0KLQkJcHJveHlGb3JjZUxvY2FsUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5TXVsdGljbHVzdGVyR3JvdXAsCi0JCQkJU1dULlJBRElPKTsKLQkJcHJveHlGb3JjZUxvY2FsUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTG9jYWxMYWJlbCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9GT1JDRV9MT0NBTCk7Ci0gICAgICAgIGlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0gICAgICAgIAlwcm94eUZvcmNlTG9jYWxSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLQkJcHJveHlGb3JjZUxvY2FsUmFkaW9CdXR0b24uc2V0RGF0YShuZXcgSW50ZWdlcihTV1QuSU1BR0VfQk1QKSk7Ci0JCS8vIHByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCQlwcm94eUZvcmNlTG9jYWxSYWRpb0J1dHRvbgotCQkJCS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTG9jYWxUb29sVGlwIikpOwotCi0JCXByb3h5Rm9yY2VNdWx0aWNsdXN0ZXJSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlNdWx0aWNsdXN0ZXJHcm91cCwKLQkJCQlTV1QuUkFESU8pOwotCQlwcm94eUZvcmNlTXVsdGljbHVzdGVyUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTXVsdGljbHVzdGVyTGFiZWwiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfRk9SQ0VfTVVMVElDTFVTVEVSKTsKLSAgICAgICAgaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLSAgICAgICAgCXByb3h5Rm9yY2VNdWx0aWNsdXN0ZXJSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLQkJcHJveHlGb3JjZU11bHRpY2x1c3RlclJhZGlvQnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUCkpOwotCQkvLyBwcm94eUZvcmNlTXVsdGljbHVzdGVyUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0JCXByb3h5Rm9yY2VNdWx0aWNsdXN0ZXJSYWRpb0J1dHRvbgotCQkJCS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckZvcmNlTXVsdGljbHVzdGVyVG9vbFRpcCIpKTsKLQotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gVGVtcGxhdGUgbmFtZSBncm91cAotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlUZW1wbGF0ZUdyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCXByb3h5VGVtcGxhdGVHcm91cC5zZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgzLCBmYWxzZSwgMCwgMCkpOwotCQlwcm94eVRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0RGF0YShzcGFuR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLAotCQkJCTUpKTsKLQkJcHJveHlUZW1wbGF0ZUdyb3VwLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVHcm91cExhYmVsIikpOwotCi0JCW5ldyBMYWJlbChwcm94eVRlbXBsYXRlR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVRlbXBsYXRlTGFiZWwiKSk7Ci0KLQkJcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQgPSBuZXcgVGV4dChwcm94eVRlbXBsYXRlR3JvdXAsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5CT1JERVIpOwotCQlwcm94eVRlbXBsYXRlVGV4dFdpZGdldC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGVtcGxhdGVMaXN0ZW5lciA9IG5ldyBFdmVudE1vbml0b3IoKTsKLQkJcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIodGVtcGxhdGVMaXN0ZW5lcik7Ci0JCXByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0Ci0JCQkJLnNldFRleHQocHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0xPQURMRVZFTEVSX1RFTVBMQVRFX0ZJTEUpKTsKLQkJcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVUb29sVGlwIikpOwotCi0JCSB0ZW1wbGF0ZUJyb3dzZUJ1dHRvbiA9Ci0JCSBTV1RVdGlsLmNyZWF0ZVB1c2hCdXR0b24ocHJveHlUZW1wbGF0ZUdyb3VwLAotCQkgTWVzc2FnZXMuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLmJyb3dzZUJ1dHRvbiIpLAotCQkgbnVsbCk7Ci0JCSB0ZW1wbGF0ZUJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0ZW1wbGF0ZUxpc3RlbmVyKTsKLQotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gVGVtcGxhdGUgb3B0aW9ucyBncm91cAotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlUZW1wbGF0ZU9wdGlvbnNHcm91cCA9IG5ldyBHcm91cCgoQ29tcG9zaXRlKSBwcmVmZXJlbmNlUGFuZSwKLQkJCQlTV1QuTk9ORSk7Ci0JCXByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCXByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXAKLQkJCQkuc2V0VGV4dChNZXNzYWdlcwotCQkJCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVRlbXBsYXRlT3B0aW9uc0dyb3VwTGFiZWwiKSk7Ci0KLQkJcHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXAsCi0JCQkJU1dULlJBRElPKTsKLQkJcHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZU5ldmVyTGFiZWwiKSk7Ci0JCXByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUCkpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1dSSVRFX1RFTVBMQVRFX05FVkVSKTsKLSAgICAgICAgaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLSAgICAgICAgCXByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotCQkvLyBwcm94eVRlbXBsYXRlTmV2ZXJSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihyYWRpb1NlbGVjdGVkKTsKLQkJcHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVOZXZlclRvb2xUaXAiKSk7Ci0KLQkJcHJveHlUZW1wbGF0ZUFsd2F5c1JhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eVRlbXBsYXRlT3B0aW9uc0dyb3VwLAotCQkJCVNXVC5SQURJTyk7Ci0JCXByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVRlbXBsYXRlQWx3YXlzTGFiZWwiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfV1JJVEVfVEVNUExBVEVfQUxXQVlTKTsKLSAgICAgICAgaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLSAgICAgICAgCXByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLQkJcHJveHlUZW1wbGF0ZUFsd2F5c1JhZGlvQnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUCkpOwotCQkvLyBwcm94eVRlbXBsYXRlQWx3YXlzUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0JCXByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZUFsd2F5c1Rvb2xUaXAiKSk7Ci0KLQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIFBvbGxpbmcgb3B0aW9ucyBncm91cAotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlQb2xsaW5nR3JvdXAgPSBuZXcgR3JvdXAoKENvbXBvc2l0ZSkgcHJlZmVyZW5jZVBhbmUsIFNXVC5OT05FKTsKLQkJcHJveHlQb2xsaW5nR3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCXByb3h5UG9sbGluZ0dyb3VwLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ0dyb3VwTGFiZWwiKSk7Ci0KLQkJbmV3IExhYmVsKHByb3h5UG9sbGluZ0dyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlQb2xsaW5nTm9kZU1pbkxhYmVsIikpOwotCi0JCXByb3h5UG9sbGluZ05vZGVNaW4gPSBuZXcgU3Bpbm5lcihwcm94eVBvbGxpbmdHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCXByb3h5UG9sbGluZ05vZGVNaW4uc2V0SW5jcmVtZW50KDEwKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1pbi5zZXRNaW5pbXVtKDMwKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1pbi5zZXRNYXhpbXVtKDMwMCk7Ci0JCXByb3h5UG9sbGluZ05vZGVNaW4uc2V0UGFnZUluY3JlbWVudCg1MCk7Ci0JCXByb3h5UG9sbGluZ05vZGVNaW4uc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmdldEludChJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfTUlOX05PREVfUE9MTElORykpOwotCQlwcm94eVBvbGxpbmdOb2RlTWluLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdOb2RlTWluVG9vbFRpcCIpKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1pbi5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCW5ldyBMYWJlbChwcm94eVBvbGxpbmdHcm91cCwgU1dULk5PTkUpLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ05vZGVNYXhMYWJlbCIpKTsKLQotCQlwcm94eVBvbGxpbmdOb2RlTWF4ID0gbmV3IFNwaW5uZXIocHJveHlQb2xsaW5nR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlwcm94eVBvbGxpbmdOb2RlTWF4LnNldEluY3JlbWVudCgxMCk7Ci0JCXByb3h5UG9sbGluZ05vZGVNYXguc2V0TWluaW11bSgzMCk7Ci0JCXByb3h5UG9sbGluZ05vZGVNYXguc2V0TWF4aW11bSg1MDApOwotCQlwcm94eVBvbGxpbmdOb2RlTWF4LnNldFBhZ2VJbmNyZW1lbnQoNTApOwotCQlwcm94eVBvbGxpbmdOb2RlTWF4LnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXRJbnQoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX01BWF9OT0RFX1BPTExJTkcpKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1heC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlQb2xsaW5nTm9kZU1heFRvb2xUaXAiKSk7Ci0JCXByb3h5UG9sbGluZ05vZGVNYXguYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQluZXcgTGFiZWwocHJveHlQb2xsaW5nR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdKb2JMYWJlbCIpKTsKLQotCQlwcm94eVBvbGxpbmdKb2IgPSBuZXcgU3Bpbm5lcihwcm94eVBvbGxpbmdHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCXByb3h5UG9sbGluZ0pvYi5zZXRJbmNyZW1lbnQoMTApOwotCQlwcm94eVBvbGxpbmdKb2Iuc2V0TWluaW11bSgzMCk7Ci0JCXByb3h5UG9sbGluZ0pvYi5zZXRNYXhpbXVtKDMwMCk7Ci0JCXByb3h5UG9sbGluZ0pvYi5zZXRQYWdlSW5jcmVtZW50KDUwKTsKLQkJcHJveHlQb2xsaW5nSm9iLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXRJbnQoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0pPQl9QT0xMSU5HKSk7Ci0JCXByb3h5UG9sbGluZ0pvYi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlQb2xsaW5nSm9iVG9vbFRpcCIpKTsKLQkJcHJveHlQb2xsaW5nSm9iLmFkZE1vZGlmeUxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJcmV0dXJuIHByZWZlcmVuY2VQYW5lOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJlZmVyZW5jZXMgc3RvcmUgd2l0aCB0aGUgdmFsdWVzIHNldCBpbiB0aGUgd2lkZ2V0cyBtYW5hZ2VkCi0JICogYnkgdGhpcyBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7Ci0KLQkJcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCi0JCWlmIChwcm94eUxpYnJhcnlUZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfTE9BRExFVkVMRVJfTElCUkFSWV9QQVRILAotCQkJCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0LmdldFRleHQoKS50cmltKCkpOwotCQl9Ci0KLQkJaWYgKHByb3h5VHJhY2VNZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eVRyYWNlTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1RSQUNFX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfVFJBQ0VfTUVTU0FHRSwKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9OTyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJveHlJbmZvTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlJbmZvTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0lORk9fTUVTU0FHRSwKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZSgKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9JTkZPX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5V2FybmluZ01lc3NhZ2VCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHByb3h5V2FybmluZ01lc3NhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZSgKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9XQVJOSU5HX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfV0FSTklOR19NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX05PKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm94eUVycm9yTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlFcnJvck1lc3NhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZSgKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9FUlJPUl9NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0VSUk9SX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5RmF0YWxNZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eUZhdGFsTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0ZBVEFMX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfRkFUQUxfTUVTU0FHRSwKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9OTyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJveHlBcmdzTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlBcmdzTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0FSR1NfTUVTU0FHRSwKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZSgKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9BUkdTX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5RGVidWdMb29wQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eURlYnVnTG9vcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9ERUJVR19MT09QLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9ERUJVR19MT09QLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX05PKTsKLQkJCX0KLQkJfQotCi0KLQkJaWYgKGd1aVRyYWNlTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZ3VpVHJhY2VNZXNzYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX1RSQUNFX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX1RSQUNFX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKGd1aUluZm9NZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChndWlJbmZvTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfSU5GT19NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfSU5GT19NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX05PKTsKLQkJCX0KLQkJfQotCi0JCWlmIChndWlXYXJuaW5nTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZ3VpV2FybmluZ01lc3NhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZSgKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfV0FSTklOR19NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9XQVJOSU5HX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKGd1aUVycm9yTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZ3VpRXJyb3JNZXNzYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0VSUk9SX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0VSUk9SX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKGd1aUZhdGFsTWVzc2FnZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZ3VpRmF0YWxNZXNzYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0ZBVEFMX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0ZBVEFMX01FU1NBR0UsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKGd1aUFyZ3NNZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChndWlBcmdzTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfQVJHU19NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfQVJHU19NRVNTQUdFLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX05PKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfREVGQVVMVF9NVUxUSUNMVVNURVIsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfREVGQVVMVF9NVUxUSUNMVVNURVIsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eUZvcmNlTG9jYWxSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0ZPUkNFX0xPQ0FMLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0ZPUkNFX0xPQ0FMLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX05PKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm94eUZvcmNlTXVsdGljbHVzdGVyUmFkaW9CdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHByb3h5Rm9yY2VNdWx0aWNsdXN0ZXJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0ZPUkNFX01VTFRJQ0xVU1RFUiwKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZSgKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9GT1JDRV9NVUxUSUNMVVNURVIsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfTE9BRExFVkVMRVJfVEVNUExBVEVfRklMRSwKLQkJCQkJcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCX0KLQotCQlpZiAocHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfV1JJVEVfVEVNUExBVEVfTkVWRVIsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfV1JJVEVfVEVNUExBVEVfTkVWRVIsCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfTk8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlUZW1wbGF0ZUFsd2F5c1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoCi0JCQkJCQlJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfV1JJVEVfVEVNUExBVEVfQUxXQVlTLAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKAotCQkJCQkJSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1dSSVRFX1RFTVBMQVRFX0FMV0FZUywKLQkJCQkJCUlCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9OTyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwcm94eVBvbGxpbmdOb2RlTWluICE9IG51bGwpIHsKLQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9NSU5fTk9ERV9QT0xMSU5HLHByb3h5UG9sbGluZ05vZGVNaW4uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JCQotCQlpZiAocHJveHlQb2xsaW5nTm9kZU1heCAhPSBudWxsKSB7Ci0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfTUFYX05PREVfUE9MTElORyxwcm94eVBvbGxpbmdOb2RlTWF4LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJaWYgKHByb3h5UG9sbGluZ0pvYiAhPSBudWxsKSB7Ci0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfSk9CX1BPTExJTkcscHJveHlQb2xsaW5nSm9iLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRDb250ZW50KFN0cmluZyB0ZXh0KSAKLQl7Ci0JCWlmICh0ZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHRleHQuZXF1YWxzKCIiKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL0Jvb2xlYW5Sb3dXaWRnZXQuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9Cb29sZWFuUm93V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZDc2MzguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL0Jvb2xlYW5Sb3dXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5ybUxhdW5jaENvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIEJvb2xlYW5Sb3dXaWRnZXQgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RhdGUKLXsKLSAgICBwcml2YXRlIExhYmVsIGxhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgbm9uRGVmYXVsdE1hcmtlcjsKLSAgICBwcml2YXRlIEdyaWREYXRhIGdyaWREYXRhOwotICAgIHByaXZhdGUgU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyRGVmOwotICAgIHByaXZhdGUgQm9vbGVhbk9wdGlvbiB3aWRnZXQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotICAgIHByaXZhdGUgRXZlbnRNb25pdG9yIGV2ZW50TW9uaXRvcjsKLSAgICBwcml2YXRlIGludCB2YWxpZGF0aW9uU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBsaXN0ZW5lciBjbGFzcyBmb3IgZXZlbnRzIG5lZWRlZCBmb3Igbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgaW4gZGF0YSB2YWx1ZSBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRXZlbnRNb25pdG9yIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgICB7Ci0JcHVibGljIEV2ZW50TW9uaXRvcigpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5vbi1kZWZhdWx0IHZhbHVlIGluZGljYXRvciBpZiB0aGUgd2lkZ2V0J3MgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIGF0dHJpYnV0ZSdzIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqIEBwYXJhbSBlIFRoZSBzZWxlY3Rpb24gZXZlbnQgaW5kaWNhdGluZyB0aGlzIG9iamVjdCB3YXMgY2xpY2tlZAotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCSAgICBCdXR0b24gc2VsZWN0ZWRCdXR0b247Ci0KLQkgICAgc2VsZWN0ZWRCdXR0b24gPSAoQnV0dG9uKSBlLmdldFNvdXJjZSgpOwotCSAgICBpZiAoc2VsZWN0ZWRCdXR0b24uZ2V0VGV4dCgpLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7Ci0JCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCSAgICB9IGVsc2UgewotCQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIioiKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEJvb2xlYW5PcHRpb24KLSAgICB7Ci0JcHJpdmF0ZSBTdHJpbmcgYXR0clZhbHVlOwotCXByaXZhdGUgQ29tcG9zaXRlIGdyb3VwOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbnNbXTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHJhZGlvIGJ1dHRvbiBwYWlyIGZvciB1c2UgaW4gc2VsZWN0aW5nIGEgYm9vbGVhbiBvcHRpb24uIFRoaXMgb2JqZWN0IGlzIGEgY29udGFpbmVyIGZvciBhIHBhaXIgb2YKLQkgKiByYWRpbyBidXR0b25zIGluIGEgZ3JvdXAgYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB3aWRnZXQgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxhYmVscyBBIGxpc3Qgb2YgdHdvIGxhYmVscyB1c2VkIHRvIGxhYmVsIHRoZSByYWRpbyBidXR0b25zCi0JICovCi0JcHVibGljIEJvb2xlYW5PcHRpb24oQ29tcG9zaXRlIHBhcmVudCwgTGlzdDxTdHJpbmc+IGxhYmVscywgaW50IGJ1dHRvbl9pZCkKLQl7Ci0JICAgIEdyaWRMYXlvdXQgbGF5b3V0OwotCi0JICAgIGlmIChsYWJlbHMuc2l6ZSgpICE9IDIpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQm9vbGVhbk9wdGlvbiByZXF1aXJlcyB0d28gbGFiZWxzIik7Ci0JICAgIH0KLQkgICAgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQkgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotCSAgICBidXR0b25zID0gbmV3IEJ1dHRvblsyXTsKLQkgICAgYnV0dG9uc1swXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JICAgIGJ1dHRvbnNbMF0uc2V0VGV4dChsYWJlbHMuZ2V0KDApKTsKLQkgICAgYnV0dG9uc1swXS5zZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQlVUVE9OX0lELCBidXR0b25faWQpOwotCSAgICBidXR0b25zWzFdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkgICAgYnV0dG9uc1sxXS5zZXRUZXh0KGxhYmVscy5nZXQoMSkpOwotCSAgICBidXR0b25zWzFdLnNldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5CVVRUT05fSUQsIGJ1dHRvbl9pZCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0b29sdGlwIHRleHQgZm9yIHRoZSBvYmplY3QuIFRoZSB0b29sdGlwIHRleHQgaXMgc2V0IG9uIHRoZSBncm91cCBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCBUaGUgdG9vbHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpCi0JewotCSAgICBncm91cC5zZXRUb29sVGlwVGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGlvbiBzdGF0ZS4gVGhlIGJ1dHRvbiB3aXRoIHRleHQgbWF0Y2hpbmcgdGhlIHZhbHVlIHN0cmluZyBpcyBzZXQgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkQnV0dG9uKFN0cmluZyB2YWx1ZSkKLQl7Ci0JICAgIGlmIChidXR0b25zWzBdLmdldFRleHQoKS5lcXVhbHModmFsdWUpKSB7Ci0JCWJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCSAgICB9IGVsc2UgewotCQlidXR0b25zWzFdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkgICAgfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBidXR0b24uIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgbGFiZWwgZm9yIHRoZSBzZWxlY3RlZCBidXR0b24uCi0JICogCi0JICogQHJldHVybiBWYWx1ZSBmb3IgdGhpcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLQl7Ci0JICAgIGlmIChidXR0b25zWzBdLmdldFNlbGVjdGlvbigpKSB7Ci0JCXJldHVybiBidXR0b25zWzBdLmdldFRleHQoKTsKLQkgICAgfQotCSAgICByZXR1cm4gYnV0dG9uc1sxXS5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhpcyBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZ2QgTGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKEdyaWREYXRhIGdkKQotCXsKLQkgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBlbmFibGUgc3RhdGUgZm9yIHRoZSBCdXR0b24gb2JqZWN0cyBpbiB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHN0YXRlIAotCSAqIEBwYXJhbSBzdGF0ZSBFbmFibGUgc3RhdGUgZm9yIHRoaXMgd2lkZ2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHN0YXRlKQotCXsKLQkgICAgYnV0dG9uc1swXS5zZXRFbmFibGVkKHN0YXRlKTsKLQkgICAgYnV0dG9uc1sxXS5zZXRFbmFibGVkKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyB3aWRnZXQgaXMgaW4gdGhlIGVuYWJsZWQgc3RhdGUKLQkgKiBAcmV0dXJuIEVuYWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0JewotCSAgICByZXR1cm4gYnV0dG9uc1swXS5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSBzZXR0aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIHZhbHVlKQotCXsKLQkgICAgYXR0clZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAnZGF0YSBvYmplY3QnIGFzIGlmIHdlIHdlcmUgcmV0cmlldmluZyB0aGUgQVRUUl9OQU1FIG9iamVjdCBmb3IgYSBXaWRnZXQgb2JqZWN0Ci0JICogCi0JICogQHJldHVybiAtIFZhbHVlIG9mIHRoZSBkYXRhIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpCi0JewotCSAgICByZXR1cm4gYXR0clZhbHVlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGUgQnV0dG9uIG9iamVjdHMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JICAgIGJ1dHRvbnNbMF0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCSAgICBidXR0b25zWzFdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ1dpZGdldChXaWRnZXQgc291cmNlKQotCXsKLQkgICAgcmV0dXJuICgoc291cmNlID09IGJ1dHRvbnNbMF0pIHx8IChzb3VyY2UgPT0gYnV0dG9uc1sxXSkpOwotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHdpZGdldHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHJvdy4gVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIGxheW91dCBtYW5hZ2VyIGZvciB0aGUKLSAgICAgKiBDb21wb3NpdGUgcGFyZW50IGlzIGEgR3JpZExheW91dCB3aXRoIGZvdXIgY29sdW1ucy4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBDb21wb3NpdGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQgVGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGlzIHdpZGdldAotICAgICAqIEBwYXJhbSBkZWYgVGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGlzIHdpZGdldAotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuUm93V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpZCwgU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbiBkZWYsIGludCBidXR0b25faWQpCi0gICAgewotCWF0dHJEZWYgPSBkZWY7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoYXR0ckRlZi5nZXROYW1lKCkpKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlub25EZWZhdWx0TWFya2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCXdpZGdldCA9IG5ldyBCb29sZWFuT3B0aW9uKHBhcmVudCwgYXR0ckRlZi5nZXRWYWx1ZXMoKSwgYnV0dG9uX2lkKTsKLQl3aWRnZXQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHJEZWYuZ2V0RGVzY3JpcHRpb24oKSkpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCXdpZGdldC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl3aWRnZXQuc2V0RGF0YShpZCk7Ci0JdHJ5IHsKLQkgICAgZGVmYXVsdFZhbHVlID0gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCSAgICBkZWZhdWx0VmFsdWUgPSAiIjsKLQl9Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgaXMgYSB3cmFwcGVyIHRoYXQganVzdCBjYWxscyAKLSAgICAgKiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBmb3IgdGhlIEJvb2xlYW5PcHRpb24gd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBzZWxlY3Rpb24gbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIEJvb2xlYW5PcHRpb24gb2JqZWN0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdAotICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgZW5hYmxlIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHN0YXRlKQotICAgIHsKLQl3aWRnZXQuc2V0RW5hYmxlZChzdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBmb3IgdGhlIEJvb2xlYW5PcHRpb24gb2JqZWN0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdC4gVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSByYWRpbyBidXR0b24gd2l0aAotICAgICAqIGxhYmVsIHRleHQgbWF0Y2hpbmcgdGhlIHZhbHVlIHBhcmFtZXRlciBpcyBzZXQgc2VsZWN0ZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gICAgewotCXdpZGdldC5zZXRTZWxlY3RlZEJ1dHRvbih2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhdHRyaWJ1dGUgbmFtZSBzdG9yZWQgaW4gdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBCb29sZWFuT3B0aW9uIG9iamVjdCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QuIFRIZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgbGFiZWwgdGV4dCBvZiB0aGUKLSAgICAgKiByYWRpbyBidXR0b24gaW4gc2VsZWN0ZWQgc3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgb2JqZWN0J3MgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXRWYWx1ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdHVhbCB3aWRnZXQgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0IGlzIHRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZAotICAgICAqIGZvcgotICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiAtIHN0YXR1cyBpbmRpY2F0aW5nIHRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXRjaGluZyB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ1dpZGdldChXaWRnZXQgc291cmNlKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmlzTWF0Y2hpbmdXaWRnZXQoc291cmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIG5vIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFZhbGlkYXRpb25TdGF0ZSgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5VTkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbiBlcnJvciBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZEluRXJyb3IoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgaWYgdGhpcyBvYmplY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkCi0gICAgICogQHJldHVybiAtIHZhbGlkYXRpb24gc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQlyZXR1cm4gKCh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQpIHx8ICh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsJCi0gICAgfQotICAgIAotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vQ2hlY2tib3hSb3dXaWRnZXQuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9DaGVja2JveFJvd1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTE1MDYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9DaGVja2JveFJvd1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBDaGVja2JveFJvd1dpZGdldCBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdGF0ZQotewotCi0gICAgcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIGZpbGw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotICAgIHByaXZhdGUgQnV0dG9uIHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY2hlY2tib3ggd2lkZ2V0IGFuZCBhc3NvY2lhdGVkIHdpZGdldHMuIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsYXlvdXQgbWFuYWdlciBmb3IgdGhlIAotICAgICAqIHBhcmVudCBDb21wb3NpdGUgb2JqZWN0IGlzIGEgR3JpZExheW91dCB3aXRoIDQgY29sdW1ucy4gCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IENvbXBvc2l0ZSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgCi0gICAgICovCi0gICAgcHVibGljIENoZWNrYm94Um93V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpZCwgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZGVmKQotICAgIHsKLQlhdHRyRGVmID0gZGVmOwotCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGRlZi5nZXROYW1lKCkpKTsKLQlub25EZWZhdWx0TWFya2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCXdpZGdldCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCXdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoZGVmLmdldERlc2NyaXB0aW9uKCkpKTsKLQl3aWRnZXQuc2V0VGV4dCgiIik7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQl3aWRnZXQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0Jd2lkZ2V0LnNldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5BVFRSX05BTUUsIGlkKTsKLQlmaWxsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWZpbGwuc2V0VGV4dCgiIik7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JZmlsbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLQl3aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBkYXRhIG9iamVjdCBpbiB0aGlzIGNsYXNzIHVzaW5nIHRoZSBhc3NvY2lhdGVkIGtleQotICAgICAqIEBwYXJhbSBrZXkgVGhlIGRhdGEgb2JqZWN0IGtleQotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotCXdpZGdldC5zZXREYXRhKGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGlzIG9iamVjdCBpcyBpbiB0aGUgc2VsZWN0ZWQgc3RhdGUKLSAgICAgKiBAcmV0dXJuIHNlbGVjdGlvbiBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFNlbGVjdGlvbigpCi0gICAgewotCXJldHVybiB3aWRnZXQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzZWxlY3Rpb24gc3RhdGUgKGNoZWNrIG1hcmspIGZvciB0aGlzIHdpZGdldAotICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdG8gYmUgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGJvb2xlYW4gc3RhdGUpCi0gICAgewotCXdpZGdldC5zZXRTZWxlY3Rpb24oc3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICogQHBhcmFtIGtleSBLZXkgZm9yIGRhdGEgdG8gYmUgcmV0cmlldmVkCi0gICAgICogQHJldHVybiBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YShTdHJpbmcga2V5KQotICAgIHsKLQlyZXR1cm4gKFN0cmluZykgd2lkZ2V0LmdldERhdGEoa2V5KTsKLSAgICB9Ci0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldCA9PSBzb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSBubyB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRWYWxpZGF0aW9uU3RhdGUoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuVU5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgaW4gZXJyb3IgYW5kIG11c3QgYmUgdmFsaWRhdGVkIGFnYWluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRJbkVycm9yKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIGFuZCB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZAotICAgICAqIEByZXR1cm4gLSB2YWxpZGF0aW9uIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0JcmV0dXJuICgodmFsaWRhdGlvblN0YXRlID09IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEKSB8fCAodmFsaWRhdGlvblN0YXRlID09IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUikpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL0NvbWJvUm93V2lkZ2V0LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vQ29tYm9Sb3dXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3MWI5YS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vQ29tYm9Sb3dXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5ybUxhdW5jaENvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgQ29tYm9Sb3dXaWRnZXQgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RhdGUKLXsKLQotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotICAgIHByaXZhdGUgQ29tYm8gd2lkZ2V0OwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIEV2ZW50TW9uaXRvciBldmVudE1vbml0b3I7Ci0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgbGlzdGVuZXIgY2xhc3MgdXNlZCB0byBtb25pdG9yIGZvciBjaGFuZ2VzIGluIHRoZSBkYXRhIHZhbHVlIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFdmVudE1vbml0b3IgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLSAgICB7Ci0JcHVibGljIEV2ZW50TW9uaXRvcigpCi0JewotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBldmVudCBub3RpZmljYXRpb24gaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZSB3aWRnZXQgaGFzIGNoYW5nZWQKLQkgKiBAcGFyYW0gZSBUaGUgbm90aWZpY2F0aW9uIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCXsKLQkgICAgc2V0RGVmYXVsdFN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBldmVudCBub3RpZmljYXRpb24gaW5kaWNhdGluZyB0aGF0IGEgdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQgZnJvbSB0aGUgQ29tYm8gZHJvcGRvd24KLQkgKiBAcGFyYW0gZSBUaGUgbm90aWZpY2F0aW9uIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCSAgICBzZXREZWZhdWx0U3RhdHVzKCk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBvYmplY3QgY29udGFpbmluZyBhIENvbWJvIHdpZGdldCBhbmQgcmVsYXRlZCB3aWRnZXRzIGZvciB1c2UgaW4gYSB0YWIgcGFiZS4gVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlCi0gICAgICogbGF5b3V0IG1hbmFnZXIgZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlIHdpZGdldCBpcyBhIEdyaWRMYXlvdXQgd2l0aCA0IGNvbHVtbnMuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IENvbXBvc2l0ZSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gcmVhZE9ubHkgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENvbWJvIHdpZGdldCBpcyBlZGl0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBDb21ib1Jvd1dpZGdldChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQsIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGRlZiwgYm9vbGVhbiByZWFkT25seSwgaW50IHNlbGVjdG9yX2lkKQotICAgIHsKLQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXI7Ci0KLQlhdHRyRGVmID0gZGVmOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHJEZWYuZ2V0TmFtZSgpKSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0Jbm9uRGVmYXVsdE1hcmtlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIiAiKTsKLQlpZiAocmVhZE9ubHkpIHsKLQkgICAgd2lkZ2V0ID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCX0gZWxzZSB7Ci0JICAgIHdpZGdldCA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04pOwotCX0KLQlpdGVyID0gKChTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uKSBkZWYpLmdldFZhbHVlcygpLml0ZXJhdG9yKCk7Ci0Jd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JICAgIHdpZGdldC5hZGQoaXRlci5uZXh0KCkpOwotCX0KLQkvLyBFdmVuIHRob3VnaCBzZXRUb29sVGlwVGV4dCBpcyBjYWxsZWQsIHRoZSB0b29sdGlwIHRleHQgZG9lcyBub3QKLQkvLyBhcHBlYXIgd2hlbiB0aGlzIGlzIHJ1biBvbiBMaW51eC4gVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUKLQkvLyBzZXR0aW5nIHRvb2x0aXAgdGV4dCBvbiBhIHJlYWQtb25seSBjb21ib2JveC4gRWRpdGFibGUgY29tYm9ib3hlcwotCS8vIHdvcmsgY29ycmVjdGx5LiBNYXliZSBhIExpbnV4IGltcGxlbWVudGF0aW9uIGJ1ZyBzaW5jZSB0aGlzIHdvcmtzCi0JLy8gb24gV2luZG93cyBYUC4KLQl3aWRnZXQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHJEZWYuZ2V0RGVzY3JpcHRpb24oKSkpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXdpZGdldC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl3aWRnZXQuc2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkFUVFJfTkFNRSwgaWQpOwotICAgIHdpZGdldC5zZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQlVUVE9OX0lELCBzZWxlY3Rvcl9pZCk7Ci0JdHJ5IHsKLQkgICAgZGVmYXVsdFZhbHVlID0gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCSAgICBkZWZhdWx0VmFsdWUgPSAiIjsKLQl9Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gdGhpcyBvYmplY3QgZm9yIG5vdGlmaWNhdGlvbiB0aGF0IGEgdmFsdWUgd2FzIHNlbGVjdGVkIGZyb20gdGhlIENvbWJvIGRyb3Bkb3duCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBtb2RpZnkgbGlzdGVuZXIgdG8gdGhpcyBvYmplY3QgZm9yIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSB2YWx1ZSBpbiB0aGUgQ29tYm8ncyB0ZXh0IGVudHJ5IGZpZWxkIGhhcyBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgQ29tYm8gd2lkZ2V0Ci0gICAgICogQHJldHVybiBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldFRleHQoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkYXRhIHZhbHVlIGluIHRoZSBDb21ibyB3aWRnZXQuCi0gICAgICogQHBhcmFtIHZhbHVlIERhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gICAgewotCXdpZGdldC5zZXRUZXh0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGJlIHVzZWQKLSAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhKFN0cmluZyBrZXkpCi0gICAgewotCXJldHVybiAoU3RyaW5nKSB3aWRnZXQuZ2V0RGF0YShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZW5hYmxlIHN0YXRlIGZvciB0aGUgb2JqZWN0IAotICAgICAqIEByZXR1cm4gdGhlIGVuYWJsZSBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0gICAgewotCXJldHVybiB3aWRnZXQuaXNFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBub24tZGVmYXVsdCBzdGF0dXMgZmxhZyB0byBzaG93IHdoZXRoZXIgdGhlIGRhdGEgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICogZm9yIHRoZSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFN0YXR1cygpCi0gICAgewotCVN0cmluZyB2YWx1ZTsKLQkKLQl2YWx1ZSA9IHdpZGdldC5nZXRUZXh0KCkudHJpbSgpOwotCWlmICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgKHZhbHVlLmVxdWFscyhkZWZhdWx0VmFsdWUpKSkgewotCSAgICBub25EZWZhdWx0TWFya2VyLnNldFRleHQoIiAiKTsKLQl9IGVsc2UgewotCSAgICBub25EZWZhdWx0TWFya2VyLnNldFRleHQoIioiKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSBubyB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRWYWxpZGF0aW9uU3RhdGUoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuVU5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgaW4gZXJyb3IgYW5kIG11c3QgYmUgdmFsaWRhdGVkIGFnYWluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRJbkVycm9yKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIGFuZCB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZAotICAgICAqIEByZXR1cm4gLSB2YWxpZGF0aW9uIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0JcmV0dXJuICgodmFsaWRhdGlvblN0YXRlID09IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEKSB8fCAodmFsaWRhdGlvblN0YXRlID09IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUikpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdHVhbCB3aWRnZXQgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0IGlzIHRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZAotICAgICAqIGZvcgotICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiAtIHN0YXR1cyBpbmRpY2F0aW5nIHRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXRjaGluZyB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ1dpZGdldChXaWRnZXQgc291cmNlKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0ID09IHNvdXJjZTsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vRHVhbEZpZWxkUm93V2lkZ2V0LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vRHVhbEZpZWxkUm93V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzdmNWUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL0R1YWxGaWVsZFJvd1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkucm1MYXVuY2hDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBEdWFsRmllbGRSb3dXaWRnZXQgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RhdGUKLXsKLSAgICBwcml2YXRlIExhYmVsIGxhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgbm9uRGVmYXVsdE1hcmtlcjsKLSAgICBwcml2YXRlIEdyaWREYXRhIGdyaWREYXRhOwotICAgIHByaXZhdGUgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gYXR0cjE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyMjsKLSAgICBwcml2YXRlIER1YWxGaWVsZCB3aWRnZXQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlW107Ci0gICAgcHJpdmF0ZSBFdmVudE1vbml0b3IgZXZlbnRNb25pdG9yOwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGxpc3RlbmVyIGNsYXNzIHVzZWQgdG8gbW9uaXRvciBjaGFuZ2VzIGluIHZhbHVlIGZvciB0aGlzIG9iamVjdAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFdmVudE1vbml0b3IgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotICAgIHsKLQlwdWJsaWMgRXZlbnRNb25pdG9yKCkKLQl7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBub24tZGVmYXVsdCBpbmRpY2F0b3IgdG8gJyonIGlmIHRoZSBkYXRhIHZhbHVlIGZvciB0aGlzIG9iamVjdCBkb2VzIG5vdCBtYXRjaAotCSAqIHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICogQHBhcmFtIGUgVGhlIGV2ZW50IGluZGljYXRpbmcgdmFsdWUgaGFzIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0JewotCSAgICBTdHJpbmcgdmFsdWVbXTsKLQotCSAgICB2YWx1ZSA9IHdpZGdldC5nZXRUZXh0KCk7Ci0JICAgIGlmICgodmFsdWVbMF0uZXF1YWxzKGRlZmF1bHRWYWx1ZVswXSkpICYmICh2YWx1ZVsxXS5lcXVhbHMoZGVmYXVsdFZhbHVlWzFdKSkpIHsKLQkJbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0JICAgIH0gZWxzZSB7Ci0JCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiKiIpOwotCSAgICB9Ci0JfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgd2lkZ2V0IGNvbnRhaW5pbmcgdHdvIHRleHQgZmllbGRzIGxhaWQgb3V0IGhvcml6b250YWxseS4gVGhlIGludGVuZGVkIHVzZSBpcyBmb3IKLSAgICAgKiBhdHRyaWJ1dGVzIHdoaWNoIG1heSBoYXZlIHR3byB2YWx1ZXMsIHN1Y2ggYXMgTVBfQlVGRkVSX1NJWkUsIHNvIHRoYXQgZWFjaCBmaWVsZCBjYW4gYmUgaGFuZGxlZCBhbmQgdmFsaWRhdGVkCi0gICAgICogaW5kaXZpZHVhbGx5LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRHVhbEZpZWxkCi0gICAgewotCXByaXZhdGUgT2JqZWN0IGF0dHJWYWx1ZTE7Ci0JcHJpdmF0ZSBPYmplY3QgYXR0clZhbHVlMjsKLQlwcml2YXRlIENvbXBvc2l0ZSBncm91cDsKLQlwcml2YXRlIFRleHQgdmFsdWVbXTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgRHVhbEZpZWxkIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGZvciB0aGlzIG9iamVjdAotCSAqLwotCXB1YmxpYyBEdWFsRmllbGQoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JICAgIEdyaWRMYXlvdXQgbGF5b3V0OwotCSAgICBHcmlkRGF0YSBnZDsKLQotCSAgICBncm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkgICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JICAgIHZhbHVlID0gbmV3IFRleHRbMl07Ci0JICAgIHZhbHVlWzBdID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkgICAgdmFsdWVbMF0uc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAgIHZhbHVlWzFdID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkgICAgdmFsdWVbMV0uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxheW91dCBkYXRhIGZvciB0aGlzIHdpZGdldAotCSAqIAotCSAqIEBwYXJhbSBnZCBMYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoR3JpZERhdGEgZ2QpCi0JewotCSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBNb2RpZnlMaXN0ZW5lciB0aGF0IHdpbGwgbW9uaXRvciB0aGUgVGV4dCBmaWVsZCBmb3IgbW9kaWZpY2F0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgTW9kaWZ5TGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JICAgIHZhbHVlWzBdLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkgICAgdmFsdWVbMV0uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFNldCB0b29sdGlwIHRleHQgZm9yIGVhY2ggZmllbGQgb2YgdGhlIHdpZGdldAotCSAqIAotCSAqIEBwYXJhbSB0aXAxIFRvb2x0aXAgdGV4dCBmb3IgZmlyc3QgZmllbGQKLQkgKiBAcGFyYW0gdGlwMiBUb29sdGlwIHRleHQgZm9yIHNlY29uZCBmaWVsZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0aXAxLCBTdHJpbmcgdGlwMikKLQl7Ci0JICAgIHZhbHVlWzBdLnNldFRvb2xUaXBUZXh0KHRpcDEpOwotCSAgICB2YWx1ZVsxXS5zZXRUb29sVGlwVGV4dCh0aXAyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIGVhY2ggZmllbGQgaW4gdGhlIHdpZGdldAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZTEgVmFsdWUgZm9yIGZpcnN0IGZpZWxkCi0JICogQHBhcmFtIHZhbHVlMiBWYWx1ZSBmb3Igc2Vjb25kIGZpZWxkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUxLCBTdHJpbmcgdmFsdWUyKQotCXsKLQkgICAgdmFsdWVbMF0uc2V0VGV4dCh2YWx1ZTEpOwotCSAgICB2YWx1ZVsxXS5zZXRUZXh0KHZhbHVlMik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBwYWlyIGZvciB0aGlzIHdpZGdldAotCSAqIAotCSAqIEByZXR1cm4gdGV4dCB2YWx1ZXMgY29udGFpbmVkIGluIHRleHQgd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRUZXh0KCkKLQl7Ci0JICAgIFN0cmluZyB0ZXh0VmFsdWVbXTsKLQotCSAgICB0ZXh0VmFsdWUgPSBuZXcgU3RyaW5nWzJdOwotCSAgICB0ZXh0VmFsdWVbMF0gPSB2YWx1ZVswXS5nZXRUZXh0KCkudHJpbSgpOwotCSAgICB0ZXh0VmFsdWVbMV0gPSB2YWx1ZVsxXS5nZXRUZXh0KCkudHJpbSgpOwotCSAgICByZXR1cm4gdGV4dFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoaXMgd2lkZ2V0IGlzIGVuYWJsZWQKLQkgKiAKLQkgKiBAcmV0dXJuIEVuYWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0JewotCSAgICByZXR1cm4gdmFsdWVbMF0uaXNFbmFibGVkKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBlbmFibGUgc3RhdGUgZm9yIHRoaXMgd2lkZ2V0Ci0JICogCi0JICogQHBhcmFtIHN0YXRlIEVuYWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLQl7Ci0JICAgIHZhbHVlWzBdLnNldEVuYWJsZWQoc3RhdGUpOwotCSAgICB2YWx1ZVsxXS5zZXRFbmFibGVkKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSBzZXR0aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGExKE9iamVjdCB2YWx1ZSkKLQl7Ci0JICAgIGF0dHJWYWx1ZTEgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSByZXRyaWV2aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIC0gVmFsdWUgb2YgdGhlIGRhdGEgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhMSgpCi0JewotCSAgICByZXR1cm4gYXR0clZhbHVlMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSBzZXR0aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEyKE9iamVjdCB2YWx1ZSkKLQl7Ci0JICAgIGF0dHJWYWx1ZTIgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSByZXRyaWV2aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIC0gVmFsdWUgb2YgdGhlIGRhdGEgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhMigpCi0JewotCSAgICByZXR1cm4gYXR0clZhbHVlMjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ1dpZGdldChXaWRnZXQgc291cmNlKQotCXsKLQkgICAgcmV0dXJuICgodmFsdWVbMF0gPT0gc291cmNlKSB8fCAodmFsdWVbMV0gPT0gc291cmNlKSk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHdpZGdldCB3aXRoIHR3byB0ZXh0IGVudHJ5IGZpZWxkcyByZXByZXNlbnRpbmcgdGhlIHR3byBzdWItZmllbGRzIHJlcXVpcmVkIGJ5IHRoaXMgd2lkZ2V0LgotICAgICAqIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsYXlvdXQgc2V0IGZvciB0aGUgcGFyZW50IENvbXBvc2l0ZSBvYmplY3QgaXMgYSBHcmlkTGF5b3V0IHdpdGggZm91ciBjb2x1bW5zLgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQxIFRoZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlIGZpcnN0IGZpZWxkIGluIHRoaXMgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGlkMiBUaGUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBzZWNvbmQgZmllbGQgaW4gdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gZGVmMSBUaGUgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGlzIHdpZGdldAotICAgICAqIEBwYXJhbSBkZWYyIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIHNlY29uZCBmaWVsZCBpbiB0aGlzIHdpZGdldAotICAgICAqLwotICAgIHB1YmxpYyBEdWFsRmllbGRSb3dXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGlkMSwgU3RyaW5nIGlkMiwgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZGVmMSwKLQkgICAgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZGVmMikKLSAgICB7Ci0JYXR0cjEgPSBkZWYxOwotCWF0dHIyID0gZGVmMjsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyMS5nZXROYW1lKCkpKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlub25EZWZhdWx0TWFya2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCXdpZGdldCA9IG5ldyBEdWFsRmllbGQocGFyZW50KTsKLQl3aWRnZXQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHIxLmdldERlc2NyaXB0aW9uKCkpLCBNZXNzYWdlcy5nZXRTdHJpbmcoYXR0cjIuZ2V0RGVzY3JpcHRpb24oKSkpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXdpZGdldC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl3aWRnZXQuc2V0RGF0YTEoaWQxKTsKLQl3aWRnZXQuc2V0RGF0YTIoaWQyKTsKLQl0cnkgewotCSAgICBkZWZhdWx0VmFsdWUgPSBuZXcgU3RyaW5nWzJdOwotCSAgICBkZWZhdWx0VmFsdWVbMF0gPSBhdHRyMS5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JICAgIGRlZmF1bHRWYWx1ZVsxXSA9IGF0dHIyLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JICAgIGRlZmF1bHRWYWx1ZVswXSA9ICIiOwotCSAgICBkZWZhdWx0VmFsdWVbMV0gPSAiIjsKLQkgICAgOwotCX0KLQlldmVudE1vbml0b3IgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0Jd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbW9kaWZ5IGxpc3RlbmVyIHRvIHRoaXMgb2JqZWN0IAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbmFibGUgc3RhdGUgZm9yIHRoaXMgd2lkZ2V0Ci0gICAgICogQHBhcmFtIHN0YXRlIFRoZSBlbmFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gICAgewotCXdpZGdldC5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlcyBmb3IgdGhlIHR3byBUZXh0IHdpZGdldHMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIHZhbHVlMSBGaXJzdCB0ZXh0IG9iamVjdCdzIHZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlMiBTZWNvbmQgdGV4dCBvYmplY3QncyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZTEsIFN0cmluZyB2YWx1ZTIpCi0gICAgewotCXdpZGdldC5zZXRUZXh0KHZhbHVlMSwgdmFsdWUyKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogR2V0IHRoZSBkYXRhIG9iamVjdCAodGhlIGF0dHJpYnV0ZSBuYW1lKSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0IFRleHQgd2lkZ2V0IGluIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldERhdGExKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXREYXRhMSgpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBHZXQgdGhlIGRhdGEgb2JqZWN0ICh0aGUgYXR0cmlidXRlIG5hbWUpIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vjb25kIFRleHQgd2lkZ2V0IGluIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldERhdGEyKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXREYXRhMigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIFN0cmluZyBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgdHdvIFRleHQgb2JqZWN0cyBjb250YWluZWQgaW4gdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFR3byBlbGVtZW50IGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlIGZyb20gdGhlIHR3byBUZXh0IHdpZGdldHMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbmFibGUgc3RhdGUgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgZW5hYmxlIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5pc0VuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIG5vIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFZhbGlkYXRpb25TdGF0ZSgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5VTkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbiBlcnJvciBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZEluRXJyb3IoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgaWYgdGhpcyBvYmplY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkCi0gICAgICogQHJldHVybiAtIHZhbGlkYXRpb24gc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQlyZXR1cm4gKCh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQpIHx8ICh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SKSk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0dWFsIHdpZGdldCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QgaXMgdGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkCi0gICAgICogZm9yCi0gICAgICogQHBhcmFtIHNvdXJjZSAtIFRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IKLSAgICAgKiBAcmV0dXJuIC0gc3RhdHVzIGluZGljYXRpbmcgdGhpcyBvYmplY3QgY29udGFpbnMgdGhlIG1hdGNoaW5nIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nV2lkZ2V0KFdpZGdldCBzb3VyY2UpCi0gICAgewotCXJldHVybiB3aWRnZXQuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9GaWxlU2VsZWN0b3JSb3dXaWRnZXQuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9GaWxlU2VsZWN0b3JSb3dXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyOTFkNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vRmlsZVNlbGVjdG9yUm93V2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkucm1MYXVuY2hDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkucm1MYXVuY2hDb25maWd1cmF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIEZpbGVTZWxlY3RvclJvd1dpZGdldCBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdGF0ZQotewotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyOwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yIHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBFdmVudE1vbml0b3IgZXZlbnRNb25pdG9yOwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGxpc3RlbmVyIGNsYXNzIGZvciBub3RpZmljYXRpb25zIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBwYXRobmFtZSBmaWVsZCBjaGFuZ2VzCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEV2ZW50TW9uaXRvciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi0gICAgewotCXB1YmxpYyBFdmVudE1vbml0b3IoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5vbi1kZWZhdWx0IGluZGljYXRvciBmb3IgdGhpcyBvYmplY3Qgd2hlbiB0aGUgcGF0aG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGRlZmF1bHQgcGF0aG5hbWUgZm9yIHRoaXMKLQkgKiBvYmplY3QKLQkgKiBAcGFyYW0gZSBUaGUgbm90aWZpY2F0aW9uIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCXsKLQkgICAgaWYgKHdpZGdldC5nZXRQYXRoKCkuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIHsKLQkJbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0JICAgIH0gZWxzZSB7Ci0JCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiKiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgYSBjb250YWluZXIgZm9yIGEgdGV4dCBmaWVsZCBhbmQgYnJvd3NlIGJ1dHRvbiBjb21iaW5hdGlvbiB1c2VkIGZvciBmaWxlIHNlbGVjdGlvbi4gV2hlbiB0aGUgYnJvd3NlCi0gICAgICogYnV0dG9uIGlzIGNsaWNrZWQsIHRoZSByZWdpc3RlcmVkIFNlbGVjdGlvbkxpc3RlbmVyIHdpbGwgcG9wIHVwIGEgZmlsZSBvciBkaXJlY3RvcnkgZGlhbG9nIHByb21wdGluZyB0aGUgdXNlciBmb3IKLSAgICAgKiBhIHBhdGguIFdoZW4gdGhlIHVzZXIgY2xpY2tzIG9rIGluIHRoYXQgZGlhbG9nLCB0aGUgdGV4dCBmaWVsZCBpbiB0aGlzIG9iamVjdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgc2VsZWN0ZWQKLSAgICAgKiBwYXRoLiBUaGUgYnJvd3NlIGJ1dHRvbiBhbmQgdGV4dCBib3ggYXJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgb2JqZWN0IGJ5IHRoZSByZXN0IG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBzbyB0aGF0Ci0gICAgICogdGhleSBjYW4gYmUgZWFzaWx5IHNldCB0byBlbmFibGVkIG9yIGRpc2FibGVkIHN0YXRlLgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRmlsZVNlbGVjdG9yCi0gICAgewotCXByaXZhdGUgT2JqZWN0IGF0dHJWYWx1ZTsKLQlwcml2YXRlIFRleHQgcGF0aDsKLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGZpbGUgc2VsZWN0b3Igb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgd2lkZ2V0IGZvciB0aGUgZmlsZSBzZWxlY3RvcgotCSAqIEBwYXJhbSBzZWxlY3RvcklEIElkZW50aWZpZXIgZm9yIHRoaXMgZmlsZSBzZWxlY3RvcgotCSAqIEBwYXJhbSB0b29sdGlwVGV4dCBUb29sdGlwIHRleHQgZm9yIHRoZSBzZWxlY3RvcgotCSAqLwotCXB1YmxpYyBGaWxlU2VsZWN0b3IoQ29tcG9zaXRlIHBhcmVudCwgSW50ZWdlciBzZWxlY3RvcklELCBTdHJpbmcgdG9vbHRpcFRleHQpCi0JewotCSAgICBHcmlkRGF0YSBnZDsKLQotCSAgICBwYXRoID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JICAgIHBhdGguc2V0VG9vbFRpcFRleHQodG9vbHRpcFRleHQpOwotCSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkgICAgcGF0aC5zZXRMYXlvdXREYXRhKGdkKTsKLQkgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkgICAgYnJvd3NlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJGaWxlU2VsZWN0b3IuQnJvd3NlQnV0dG9uIikpOwotCSAgICBicm93c2VCdXR0b24uc2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkJVVFRPTl9JRCwgbmV3IEludGVnZXIoc2VsZWN0b3JJRCkpOwotCSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JICAgIGJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmlsZSBzZWxlY3RvcidzIGVuYWJsZSBzdGF0ZQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUgRW5hYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZSkKLQl7Ci0JICAgIHBhdGguc2V0RW5hYmxlZChlbmFibGUpOwotCSAgICBicm93c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB0aGUgZW5hYmxlIHN0YXRlIGZvciB0aGUgZmlsZSBzZWxlY3RvcgotCSAqIAotCSAqIEByZXR1cm4gZW5hYmxlIHN0YXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLQl7Ci0JICAgIHJldHVybiBwYXRoLmlzRW5hYmxlZCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcGF0aCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRleHQgZmllbGQgb2YgdGhlIGZpbGUgc2VsZWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aG5hbWUgUGF0aG5hbWUgdG8gYmUgZGlzcGxheWVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aG5hbWUpCi0JewotCSAgICBwYXRoLnNldFRleHQocGF0aG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgdGV4dCBmaWVsZCBvZiB0aGUgZmlsZSBzZWxlY3RvcgotCSAqIAotCSAqIEByZXR1cm4gUGF0aG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKQotCXsKLQkgICAgcmV0dXJuIHBhdGguZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFNldCBmb2N1cyBvbiB0aGUgdGV4dCBmaWVsZCB3aXRoaW4gdGhlIHNlbGVjdG9yIHdpZGdldAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpCi0JewotCSAgICByZXR1cm4gcGF0aC5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgJ2RhdGEgb2JqZWN0JyBhcyBpZiB3ZSB3ZXJlIHNldHRpbmcgdGhlIEFUVFJfTkFNRSBvYmplY3QgZm9yIGEgV2lkZ2V0IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShPYmplY3QgdmFsdWUpCi0JewotCSAgICBhdHRyVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSByZXRyaWV2aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIC0gVmFsdWUgb2YgdGhlIGRhdGEgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKCkKLQl7Ci0JICAgIHJldHVybiBhdHRyVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCSAgICBicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkgICAgcGF0aC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLQl7Ci0JICAgIHJldHVybiBwYXRoID09IHNvdXJjZTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmlsZSBzZWxlY3RvciB3aWRnZXQgYW5kIHJlbGF0ZWQgd2lkZ2V0cyBmb3IgdGhpcyBjbGFzcy4gVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIGxheW91dCBtYW5hZ2VyCi0gICAgICogZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlIG9iamVjdCBpcyBhIEdyaWRMYXlvdXQgd2l0aCA0IGNvbHVtbnMuCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBzZWxlY3RvcklECi0gICAgICogQHBhcmFtIGRlZgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU2VsZWN0b3JSb3dXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGlkLCBJbnRlZ2VyIHNlbGVjdG9ySUQsIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGRlZikKLSAgICB7Ci0JYXR0ciA9IGRlZjsKLQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyLmdldE5hbWUoKSkpOwotCW5vbkRlZmF1bHRNYXJrZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0Jbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0Jd2lkZ2V0ID0gbmV3IEZpbGVTZWxlY3RvcihwYXJlbnQsIHNlbGVjdG9ySUQsIE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyLmdldERlc2NyaXB0aW9uKCkpKTsKLQl3aWRnZXQuc2V0RGF0YShpZCk7Ci0JdHJ5IHsKLQkgICAgZGVmYXVsdFZhbHVlID0gYXR0ci5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCSAgICBkZWZhdWx0VmFsdWUgPSAiIjsKLQl9Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aG5hbWUgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIHBhdGggUGF0aG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKQotICAgIHsKLQl3aWRnZXQuc2V0UGF0aChwYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGVuYWJsZSBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGF0YSB2YWx1ZSAoYXR0cmlidXRlIG5hbWUpIGZvciB0aGlzIG9iamVjdAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGEoT2JqZWN0IHZhbHVlKQotICAgIHsKLQl3aWRnZXQuc2V0RGF0YSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkYXRhIHZhbHVlIChhdHRyaWJ1dGUgbmFtZSkgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpCi0gICAgewotCXJldHVybiB3aWRnZXQuZ2V0RGF0YSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGF0aG5hbWUgc3BlY2lmaWVkIGluIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiBQYXRobmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldFBhdGgoKS50cmltKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgZW5hYmxlIHN0YXRlIGZvciB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIGVuYWJsZSBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0gICAgewotCXJldHVybiB3aWRnZXQuaXNFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGZvY3VzIHRvIHRoZSB0ZXh0IGZpZWxkIHdpdGhpbiB0aGlzIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkKLSAgICB7Ci0Jd2lkZ2V0LnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHdoaWNoIHdpbGwgcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gdGhlIGJyb3dzZSBidXR0b24gaW4gdGhpcyBvYmplY3QgaGFzCi0gICAgICogYmVlbiBjbGlja2VkLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgd2hpY2ggd2lsbCByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgcGF0aCBuYW1lIGZpZWxkIGluIHRoaXMgb2JqZWN0IGhhcyBjaGFuZ2VkIHZhbHVlCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLQl3aWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLlVOQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGlzIG9iamVjdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQKLSAgICAgKiBAcmV0dXJuIC0gdmFsaWRhdGlvbiBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXJldHVybiAoKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRCkgfHwgKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1IpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5pc01hdGNoaW5nV2lkZ2V0KHNvdXJjZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9JQk1MTFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9JQk1MTFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzN2RkYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkucm1MYXVuY2hDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQmlnSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ1NldEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLlJNTGF1bmNoVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5QVFBSZW1vdGVDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLlBUUFJlbW90ZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS5ybXN5c3RlbS5JQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5JQk1MTFByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5wcmVmZXJlbmNlcy5JQk1MTFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGV4dGVuZHMKLQkJQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19NRVNTQUdFID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0VfTUVTU0FHRSA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfTUVTU0FHRSA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SX01FU1NBR0UgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQVRBTF9NRVNTQUdFID0gNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJHU19NRVNTQUdFID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGludCBzdGF0ZV90cmFjZSA9IDA7IC8qIDA9bWVzc2FnZSBvZmYsIDE9bWVzc2FnZSBvbiAqLwotCXByaXZhdGUgc3RhdGljIGludCBzdGF0ZV9pbmZvID0gMDsgLyogMD1tZXNzYWdlIG9mZiwgMT1tZXNzYWdlIG9uICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHN0YXRlX3dhcm5pbmcgPSAxOyAvKiAwPW1lc3NhZ2Ugb2ZmLCAxPW1lc3NhZ2Ugb24gKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgc3RhdGVfZXJyb3IgPSAxOyAvKiAwPW1lc3NhZ2Ugb2ZmLCAxPW1lc3NhZ2Ugb24gKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgc3RhdGVfYXJncyA9IDA7IC8qIDA9bWVzc2FnZSBvZmYsIDE9bWVzc2FnZSBvbiAqLwotCXByaXZhdGUgc3RhdGljIGludCBzdGF0ZV9mYXRhbCA9IDE7IC8qIDA9bWVzc2FnZSBvZmYsIDE9bWVzc2FnZSBvbiAqLwotCi0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmUgdGhlIG5hbWVzIG9mIGFsbCBhdHRyaWJ1dGVzIHdoaWNoIG1heSBiZQotCSAqIGtub3duIGJ5IHRoZSBJQk1MTCBwcm94eS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX0pPQl9DT01NQU5EX0ZJTEUgPSAiTExfUFRQX0pPQl9DT01NQU5EX0ZJTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9URU1QTEFURSA9ICJMTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9URU1QTEFURSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9TVUJNSVRfTU9ERSA9ICJMTF9QVFBfU1VCTUlUX01PREUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfQ0xBU1MgPSAiTExfUFRQX0NMQVNTIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX0NPTU1FTlQgPSAiTExfUFRQX0NPTU1FTlQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfRVJST1IgPSAiTExfUFRQX0VSUk9SIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX0lOUFVUID0gIkxMX1BUUF9JTlBVVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9PVVRQVVQgPSAiTExfUFRQX09VVFBVVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9JTklUSUFMRElSID0gIkxMX1BUUF9JTklUSUFMRElSIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX0pPQl9OQU1FID0gIkxMX1BUUF9KT0JfTkFNRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9KT0JfVFlQRSA9ICJMTF9QVFBfSk9CX1RZUEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfTkVUV09SS19NUEkgPSAiTExfUFRQX05FVFdPUktfTVBJIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX05FVFdPUktfTEFQSSA9ICJMTF9QVFBfTkVUV09SS19MQVBJIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX05FVFdPUktfTVBJX0xBUEkgPSAiTExfUFRQX05FVFdPUktfTVBJX0xBUEkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfUkVRVUlSRU1FTlRTID0gIkxMX1BUUF9SRVFVSVJFTUVOVFMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfUkVTT1VSQ0VTID0gIkxMX1BUUF9SRVNPVVJDRVMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfU0hFTEwgPSAiTExfUFRQX1NIRUxMIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX1RBU0tfR0VPTUVUUlkgPSAiTExfUFRQX1RBU0tfR0VPTUVUUlkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfQlVMS19YRkVSID0gIkxMX1BUUF9CVUxLX1hGRVIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfTEFSR0VfUEFHRSA9ICJMTF9QVFBfTEFSR0VfUEFHRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9OT0RFX01JTiA9ICJMTF9QVFBfTk9ERV9NSU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfTk9ERV9NQVggPSAiTExfUFRQX05PREVfTUFYIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX0JMT0NLSU5HID0gIkxMX1BUUF9CTE9DS0lORyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9UT1RBTF9UQVNLUyA9ICJMTF9QVFBfVE9UQUxfVEFTS1MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfV0FMTENMT0NLX0hBUkQgPSAiTExfUFRQX1dBTExDTE9DS19IQVJEIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTExfUFRQX1dBTExDTE9DS19TT0ZUID0gIkxMX1BUUF9XQUxMQ0xPQ0tfU09GVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9UQVNLU19QRVJfTk9ERSA9ICJMTF9QVFBfVEFTS1NfUEVSX05PREUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfRVhFQ1VUQUJMRSA9ICJMTF9QVFBfRVhFQ1VUQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExMX1BUUF9FTlZJUk9OTUVOVCA9ICJMTF9QVFBfRU5WSVJPTk1FTlQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMTF9QVFBfTUFYX0lOVCA9ICJMTF9QVFBfTUFYX0lOVCI7Ci0KLQkvKgotCSAqIEVuZCBvZiBhdHRyaWJ1dGUgbmFtZSBsaXN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfU1RBVEUgPSAiRU5BQkxFX1NUQVRFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSTUxhdW5jaFZhbGlkYXRpb24gc3VjY2VzcyA9IG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oCi0JCQl0cnVlLCAiIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfU0VMRUNUT1IgPSAxODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTExfUFRQX1NVQk1JVF9NT0RFX1JBRElPQk9YID0gMTAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9URU1QTEFURV9TRUxFQ1RPUiA9IDE5OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMTF9QVFBfSk9CX1RZUEVfU0VMRUNUT1IgPSAyMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLQllURSA9IDEwMjQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1CWVRFID0gMTAyNCAqIDEwMjQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdCWVRFID0gMTAyNCAqIDEwMjQgKiAxMDI0OwotCi0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU1vZGlmeUV2ZW50cyA9IGZhbHNlOwotCXByaXZhdGUgRXZlbnRNb25pdG9yIGV2ZW50TW9uaXRvcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBtYWluUGFuZWw7Ci0JcHJpdmF0ZSBUYWJGb2xkZXIgdGFiYmVkUGFuZTsKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY3VycmVudExhdW5jaENvbmZpZzsKLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXIgY3VycmVudFJNOwotCXByaXZhdGUgQm9vbGVhblJvd1dpZGdldCBsbFN1Ym1pdE1vZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbEZpZWxkc1ZhbGlkID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0JcHJpdmF0ZSBWZWN0b3I8T2JqZWN0PiBhY3RpdmVXaWRnZXRzOwotCXByaXZhdGUgSVJlbW90ZUNvbm5lY3Rpb24gcmVtb3RlQ29ubmVjdGlvbjsKLQlwcml2YXRlIElSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlOwotCXByaXZhdGUgSVJlbW90ZVVJU2VydmljZXMgcmVtb3RlVUlTZXJ2aWNlOwotCXByaXZhdGUgU2hlbGwgcGFyZW50U2hlbGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBnZW5lcmFsVGFiUGFuZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgc2NoZWR1bGluZ0Jhc2ljVGFiUGFuZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgc2NoZWR1bGluZ1JlcXVpcmVtZW50c1RhYlBhbmUgPSBudWxsOwotCXByaXZhdGUgQ29tcG9zaXRlIHNjaGVkdWxpbmdSZXNvdXJjZXNUYWJQYW5lID0gbnVsbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBydW50aW1lVGFiUGFuZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgbm9kZXNOZXR3b3JrVGFiUGFuZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgbGltaXRzVGFiUGFuZSA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBsbEpvYkNvbW1hbmRGaWxlID0gbnVsbDsKLQlwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBsbEpvYkNvbW1hbmRGaWxlVGVtcGxhdGUgPSBudWxsOwotCi0JLyoKLQkgKiBXaWRnZXRzIGZvciBHZW5lcmFsIFRhYgotCSAqLwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbENvbW1lbnQgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbEpvYk5hbWUgPSBudWxsOwotCXByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbGxKb2JUeXBlID0gbnVsbDsKLQkvKgotCSAqIFdpZGdldHMgZm9yIFNjaGVkdWxpbmcgKEJhc2ljKSBUYWIKLQkgKi8KLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBsbExhcmdlUGFnZSA9IG51bGw7Ci0JLyoKLQkgKiBXaWRnZXRzIGZvciBTY2hlZHVsaW5nIChSZXF1aXJlbWVudHMpIFRhYgotCSAqLwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbFJlcXVpcmVtZW50cyA9IG51bGw7Ci0JLyoKLQkgKiBXaWRnZXRzIGZvciBTY2hlZHVsaW5nIChSZXNvdXJjZXMpIFRhYgotCSAqLwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbFJlc291cmNlcyA9IG51bGw7Ci0JLyoKLQkgKiBXaWRnZXRzIGZvciBSdW50aW1lCi0JICovCi0JcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IGxsRXJyb3IgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbElucHV0ID0gbnVsbDsKLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxPdXRwdXQgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbEluaXRpYWxEaXIgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbFNoZWxsID0gbnVsbDsKLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxFeGVjdXRhYmxlID0gbnVsbDsKLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxFbnZpcm9ubWVudCA9IG51bGw7Ci0JLyoKLQkgKiBXaWRnZXRzIGZvciBOb2Rlcy9OZXR3b3JrIFRhYgotCSAqLwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbEJsb2NraW5nID0gbnVsbDsKLQlwcml2YXRlIENvbWJvUm93V2lkZ2V0IGxsQnVsa3hmZXIgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbE5ldHdvcmtfbXBpID0gbnVsbDsKLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxOZXR3b3JrX2xhcGkgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbE5ldHdvcmtfbXBpX2xhcGkgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbE5vZGVNaW4gPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbE5vZGVNYXggPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbFRhc2tHZW9tZXRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IGxsVGFza3NQZXJOb2RlID0gbnVsbDsKLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxUb3RhbFRhc2tzID0gbnVsbDsKLQkvKgotCSAqIFdpZGdldHMgZm9yIExpbWl0cyBUYWIgTm90ZTogbGxXYWxsQ2xvY2tMaW1pdEhhcmQgYW5kCi0JICogbGxXYWxsQ2xvY2tMaW1pdFNvZnQgYXJlIGR1cGxpY2F0ZWQgaGVyZS4KLQkgKi8KLQlwcml2YXRlIFRleHRSb3dXaWRnZXQgbGxXYWxsQ2xvY2tMaW1pdEhhcmQgPSBudWxsOwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBsbFdhbGxDbG9ja0xpbWl0U29mdCA9IG51bGw7Ci0KLQlQcmVmZXJlbmNlcyBteVByZWZlcmVuY2VzID0gbnVsbDsKLQkvKioKLQkgKiBFeGNlcHRpb24gY2xhc3MgaW50ZW5kZWQgZm9yIHVzZSBpbiB2YWxpZGF0aW5nIGZpZWxkcyB3aXRoaW4gdGhpcyBwYW5lbC4KLQkgKiBXaGVuIGEgdmFsaWRhdGlvbiBlcnJvciBvY2N1cnMsIHRoZSB2YWxpZGF0aW9uIGNvZGUgc2hvdWxkIGNyZWF0ZSBhbmQKLQkgKiB0aHJvdyBhIFZhbGlkYXRpb25FeGNlcHRpb24sIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIGNhdWdodCBieSB0aGUgdG9wCi0JICogbGV2ZWwgdmFsaWRhdGlvbiBtZXRob2QuCi0JICovCi0JcHVibGljIGNsYXNzIFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICoKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCQlwcml2YXRlIFZhbGlkYXRpb25FeGNlcHRpb24oKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKAotCQkJCQkiVmFsaWRhdGlvbkV4Y2VwdGlvbiBkZWZhdWx0IGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgY2FsbGVkIik7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGEgVmFsaWRhdGlvbkV4Y2VwdGlvbiB3aXRoIGVycm9yIG1lc3NhZ2UKLQkJICoKLQkJICogQHBhcmFtIG1lc3NhZ2UKLQkJICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZQotCQkgKi8KLQkJcHVibGljIFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXN1cGVyKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgY2xhc3Mgd2hpY2ggaGFuZGxlcyBldmVudHMgb2YgaW50ZXJlc3QgdG8gdGhpcyBwYW5lbAotCSAqLwotCXByaXZhdGUgY2xhc3MgRXZlbnRNb25pdG9yIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIEV2ZW50TW9uaXRvcigpIHsKLQkJCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICI6RXZlbnRNb25pdG9yIGVudGVyZWQuIik7Ci0JCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiOkV2ZW50TW9uaXRvciByZXR1cm5pbmcuIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIjp3aWRnZXREZWZhdWx0U2VsZWN0ZWQgZW50ZXJlZC4iKTsKLQkJCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICI6d2lkZ2V0RGVmYXVsdFNlbGVjdGVkIHJldHVybmluZy4iKTsKLQkJfQotCi0JCS8qKgotCQkgKiBIYW5kbGUgZXZlbnRzIHNlbnQgd2hlbiByZWdpc3RlcmVkIGJ1dHRvbnMgYXJlIGNsaWNrZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCB3aWRnZXREYXRhOwotCi0JCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiOndpZGdldFNlbGVjdGVkIGVudGVyZWQuIik7Ci0JCQkvLyBEZXRlcm1pbmUgd2hpY2ggYnV0dG9uIHdhcyBjbGlja2VkIGJhc2VkIG9uIHRoZSBkYXRhIHZhbHVlIHN0b3JlZAotCQkJLy8gaW4gdGhhdCBidXR0b24gb2JqZWN0Ci0JCQkvLyBhbmQgaGFuZGxlIHByb2Nlc3NpbmcgZm9yIHRoYXQgYnV0dG9uLgotCQkJd2lkZ2V0RGF0YSA9IGUud2lkZ2V0LmdldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5CVVRUT05fSUQpOwotCQkJaWYgKHdpZGdldERhdGEgPT0gbnVsbCkgewotCQkJCS8vIEEgd2lkZ2V0IG90aGVyIHRoYW4gYSBmaWxlIHNlbGVjdG9yIGJyb3dzZSBidXR0b24gd2FzCi0JCQkJLy8gY2xpY2tlZC4gSnVzdCBjYWxsCi0JCQkJLy8gZmlyZUNvbnRlbnRzQ2hhbmdlZCB0byBkcml2ZSBlbmFibGluZyB0aGUgQXBwbHkvUmV2ZXJ0Ci0JCQkJLy8gYnV0dG9ucy4gU2luY2UgdGhlIHdpZGdldCBpcyBzdXBwb3NlZAotCQkJCS8vIHRvIGJlIGEgYnV0dG9uIHdpZGdldCwgbm8gdmFsaWRhdGlvbiBvZiB1c2VyIGRhdGEgaXMgbmVlZGVkLgotCQkJCWZpcmVDb250ZW50c0NoYW5nZWQoKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlzd2l0Y2ggKCgoSW50ZWdlcikgd2lkZ2V0RGF0YSkuaW50VmFsdWUoKSkgewotCQkJCWNhc2UgTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfU0VMRUNUT1I6Ci0JCQkJCWdldElucHV0RmlsZShsbEpvYkNvbW1hbmRGaWxlLAotCQkJCQkJCSJGaWxlLmxsSm9iQ29tbWFuZEZpbGVUaXRsZSIsCi0JCQkJCQkJImxsSm9iQ29tbWFuZEZpbGVQYXRoIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfVEVNUExBVEVfU0VMRUNUT1I6Ci0JCQkJCWdldElucHV0RmlsZShsbEpvYkNvbW1hbmRGaWxlVGVtcGxhdGUsCi0JCQkJCQkJIkZpbGUubGxKb2JDb21tYW5kRmlsZVRlbXBsYXRlVGl0bGUiLAotCQkJCQkJCSJsbEpvYkNvbW1hbmRGaWxlVGVtcGxhdGVQYXRoIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTExfUFRQX1NVQk1JVF9NT0RFX1JBRElPQk9YOgotCQkJCQlzZXRMYXVuY2hQYW5lbE1vZGUoKTsKLQkJCQkJdmFsaWRhdGVBbGxGaWVsZHMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMTF9QVFBfSk9CX1RZUEVfU0VMRUNUT1I6Ci0JCQkJCXZhbGlkYXRlQWxsRmllbGRzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIjp3aWRnZXRTZWxlY3RlZCByZXR1cm5pbmcuIik7Ci0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlIGV2ZW50cyBzZW50IHdoZW4gcmVnaXN0ZXJlZCBUZXh0IGFuZCBDb21ibyB3aWRnZXRzIGhhdmUgdGhlaXIKLQkJICogdGV4dCBmaWVsZCBtb2RpZmllZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIjptb2RpZnlUZXh0IGVudGVyZWQuIik7Ci0JCQkvLyBUZXh0IGFuZCBDb21ibyB3aWRnZXRzIHNlbmQgTW9kaWZ5RXZlbnRzIGFueSB0aW1lIHRoZWlyIHRleHQKLQkJCS8vIHZhbHVlIGlzIG1vZGlmaWVkLCBpbmNsdWRpbmcKLQkJCS8vIHdoZW4gdGhlIHZhbHVlIGlzIG1vZGlmaWVkIGJ5IGEgc2V0VGV4dCgpIGNhbGwuIFRoZSBvbmx5IHRpbWUKLQkJCS8vIE1vZGlmeUV2ZW50cyBhcmUgb2YgaW50ZXJlc3QgaXMKLQkJCS8vIHdoZW4gdGhlIHVzZXIgaGFzIGVudGVyZWQgdGV4dC4gQ29kZSB3aGljaCBjYWxscyBzZXRUZXh0KCkgb24gYQotCQkJLy8gd2lkZ2V0IHNob3VsZCBzZXQgdGhlCi0JCQkvLyBpZ25vcmVNb2RpZnlFdmVudHMgYmVmb3JlIGNhbGxpbmcgc2V0VGV4dCgpIGFuZCByZXNldAotCQkJLy8gaWdub3JlTW9kaWZ5RXZlbnRzIGFmdGVyIHRoZSBjYWxsLgotCQkJc2V0RmllbGRWYWxpZGF0aW9uUmVxdWlyZWQoKFdpZGdldCkgZS5nZXRTb3VyY2UoKSk7Ci0JCQlpZiAoIWlnbm9yZU1vZGlmeUV2ZW50cykgewotCQkJCXZhbGlkYXRlQWxsRmllbGRzKCk7Ci0JCQl9Ci0KLQkJCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkrICI6bW9kaWZ5VGV4dCByZXR1cm5pbmcuIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOklCTUxMUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBlbnRlcmVkLiIpOwotCQlteVByZWZlcmVuY2VzID0gSUJNTExQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCi0JCWlmICgobXlQcmVmZXJlbmNlcy5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9UUkFDRV9NRVNTQUdFKSkuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlzdGF0ZV90cmFjZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZV90cmFjZSAgPSAwOwotCQl9Ci0KLQkJaWYgKChteVByZWZlcmVuY2VzLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0lORk9fTUVTU0FHRSkpLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJc3RhdGVfaW5mbyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZV9pbmZvICA9IDA7Ci0JCX0KLQotCQlpZiAoKG15UHJlZmVyZW5jZXMuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfV0FSTklOR19NRVNTQUdFKSkuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlzdGF0ZV93YXJuaW5nID0gMTsKLQkJfSBlbHNlIHsKLQkJCXN0YXRlX3dhcm5pbmcgID0gMDsKLQkJfQotCi0JCWlmICgobXlQcmVmZXJlbmNlcy5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9FUlJPUl9NRVNTQUdFKSkuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlzdGF0ZV9lcnJvciA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZV9lcnJvciAgPSAwOwotCQl9Ci0KLQkJaWYgKChteVByZWZlcmVuY2VzLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0FSR1NfTUVTU0FHRSkpLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJc3RhdGVfYXJncyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZV9hcmdzICA9IDA7Ci0JCX0KLQotCQlpZiAoKG15UHJlZmVyZW5jZXMuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfRkFUQUxfTUVTU0FHRSkpLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJc3RhdGVfZmF0YWwgPSAxOwotCQl9IGVsc2UgewotCQkJc3RhdGVfZmF0YWwgID0gMDsKLQkJfQotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpJQk1MTFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjY2FuU2F2ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLAotCSAqICAgICAgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFF1ZXVlKQotCSAqLwotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gY2FuU2F2ZShDb250cm9sIGNvbnRyb2wsIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjYW5TYXZlIGVudGVyZWQuIik7Ci0JCWlmIChhbGxGaWVsZHNWYWxpZCkgewotCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIjpjYW5TYXZlIHJldHVybmluZy4iKTsKLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjYW5TYXZlIHJldHVybmluZy4iKTsKLQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXJlY3RvcnkgcGF0aCBmcm9tIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIERpcmVjdG9yeSBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZURpYWxvZ1BhdGgoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCVN0cmluZyBkaXI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldEZpbGVEaWFsb2dQYXRoIGVudGVyZWQuIik7Ci0JCWRpciA9ICIvIjsKLQkJaWYgKGN1cnJlbnRMYXVuY2hDb25maWcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkaXIgPSBjdXJyZW50TGF1bmNoQ29uZmlnLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIi8iKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWRpciA9ICIvIjsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Z2V0RmlsZURpYWxvZ1BhdGggcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gZGlyOwotCX0KLQotCS8qKgotCSAqIFNhdmUgZGlyZWN0b3J5IHBhdGggaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICoKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGlzIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBEaXJlY3RvcnkgcGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlRmlsZURpYWxvZ1BhdGgoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgcGF0aCkgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2F2ZUZpbGVEaWFsb2dQYXRoIGVudGVyZWQuIik7Ci0JCWlmIChjdXJyZW50TGF1bmNoQ29uZmlnICE9IG51bGwpIHsKLQkJCWN1cnJlbnRMYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBwYXRoKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2F2ZUZpbGVEaWFsb2dQYXRoIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGEgZmlsZSBzZWxlY3RvciBkaWFsb2cgcHJvbXB0aW5nIHRoZSB1c2VyIGZvciB0aGUgcGF0aCBvZiBhbgotCSAqIGlucHV0IGZpbGUuIElmIHRoZSB1c2VyIGNsaWNrcyAnb3BlbicsIHRoZW4gc2V0IHRoZSBwYXRobmFtZSBpbnRvIHRoZQotCSAqIHRleHQgZmllbGQgb2YgdGhlIHNwZWNpZmllZCBGaWxlU2VsZWN0b3Igb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIHNlbGVjdG9yCi0JICogICAgICAgICAgICBUaGUgRmlsZVNlbGVjdG9yIG9iamVjdCB0byBob2xkIHBhdGggbmFtZQotCSAqIEBwYXJhbSB0aXRsZUlECi0JICogICAgICAgICAgICBUaXRsZSBmb3IgdGhlIGRpYWxvZwotCSAqIEBwYXJhbSBwYXRoQXR0cklECi0JICogICAgICAgICAgICBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgaWQgZm9yIHNhdmluZyBwYXRoIGluZm8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJbnB1dEZpbGUoRmlsZVNlbGVjdG9yUm93V2lkZ2V0IHNlbGVjdG9yLCBTdHJpbmcgdGl0bGVJRCwKLQkJCVN0cmluZyBwYXRoQXR0cklEKSB7Ci0JCVN0cmluZyBzZWxlY3RlZEZpbGUgPSBudWxsOwotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Z2V0SW5wdXRGaWxlIGVudGVyZWQuIik7Ci0JCWlmIChyZW1vdGVVSVNlcnZpY2UgIT0gbnVsbCkgewotCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZm1nciA9IHJlbW90ZVVJU2VydmljZS5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCQlmbWdyLnNldENvbm5lY3Rpb24ocmVtb3RlQ29ubmVjdGlvbik7Ci0JCQlzZWxlY3RlZEZpbGUgPSBmbWdyLmJyb3dzZUZpbGUocGFyZW50U2hlbGwsIE1lc3NhZ2VzLmdldFN0cmluZyh0aXRsZUlEKSwKLQkJCQkJCQlnZXRGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklEKSkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLQkJCXNhdmVGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklELCBzZWxlY3RlZEZpbGUpOwotCQkJc2VsZWN0b3Iuc2V0UGF0aChzZWxlY3RlZEZpbGUpOwotCQkJc2VsZWN0b3Iuc2V0Rm9jdXMoKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Z2V0SW5wdXRGaWxlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGEgZmlsZSBzZWxlY3RvciBkaWFsb2cgcHJvbXB0aW5nIHRoZSB1c2VyIGZvciB0aGUgcGF0aCBvZiBhbgotCSAqIG91dHB1dCBmaWxlLiBJZiB0aGUgdXNlciBjbGlja3MgJ3NhdmUnLCB0aGVuIHNldCB0aGUgcGF0aG5hbWUgaW50byB0aGUKLQkgKiB0ZXh0IGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgRmlsZVNlbGVjdG9yIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3RvcgotCSAqICAgICAgICAgICAgVGhlIEZpbGVTZWxlY3RvciBvYmplY3QgdG8gaG9sZCBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gdGl0bGVJRAotCSAqICAgICAgICAgICAgVGl0bGUgZm9yIHRoZSBkaWFsb2cKLQkgKiBAcGFyYW0gcGF0aEF0dHJJRAotCSAqICAgICAgICAgICAgTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGlkIGZvciBzYXZpbmcgcGF0aCBpbmZvCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0T3V0cHV0RmlsZShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsCi0JCQlTdHJpbmcgdGl0bGVJRCwgU3RyaW5nIHBhdGhBdHRySUQpIHsKLQkJU3RyaW5nIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldE91dHB1dEZpbGUgZW50ZXJlZC4iKTsKLQkJaWYgKHJlbW90ZVVJU2VydmljZSAhPSBudWxsKSB7Ci0JCQlJUmVtb3RlVUlGaWxlTWFuYWdlciBmbWdyID0gcmVtb3RlVUlTZXJ2aWNlLmdldFVJRmlsZU1hbmFnZXIoKTsKLQkJCWZtZ3Iuc2V0Q29ubmVjdGlvbihyZW1vdGVDb25uZWN0aW9uKTsKLQkJCXNlbGVjdGVkRmlsZSA9IGZtZ3IuYnJvd3NlRmlsZShwYXJlbnRTaGVsbCwgTWVzc2FnZXMuZ2V0U3RyaW5nKHRpdGxlSUQpLAotCQkJCQkJCWdldEZpbGVEaWFsb2dQYXRoKHBhdGhBdHRySUQpKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChzZWxlY3RlZEZpbGUgIT0gbnVsbCkgewotCQkJc2F2ZUZpbGVEaWFsb2dQYXRoKHBhdGhBdHRySUQsIHNlbGVjdGVkRmlsZSk7Ci0JCQlzZWxlY3Rvci5zZXRQYXRoKHNlbGVjdGVkRmlsZSk7Ci0JCQlzZWxlY3Rvci5zZXRGb2N1cygpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpnZXRPdXRwdXRGaWxlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGEgZGlyZWN0b3J5IHNlbGVjdG9yIGRpYWxvZyBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yIHRoZSBwYXRobmFtZQotCSAqIG9mIGEgZGlyZWN0b3J5LiBJZiB0aGUgdXNlciBjbG9ja3MgJ29rJywgdGhlbiBzZXQgdGhlIHBhdGhuYW1lIGludG8gdGhlCi0JICogdGV4dCBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIEZpbGVTZWxlY3Rvci4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3RvcgotCSAqICAgICAgICAgICAgRmlsZVNlbGVjdG9yIG9iamVjdCB0byBiZSB1cGRhdGVkCi0JICogQHBhcmFtIHRpdGxlSUQKLQkgKiAgICAgICAgICAgIFRpdGxlIGZvciB0aGUgZGlhbG9nCi0JICogQHBhcmFtIHBhdGhBdHRySUQKLQkgKiAgICAgICAgICAgIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBpZCBmb3Igc2F2aW5nIHBhdGggaW5mbwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdldERpcmVjdG9yeShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyB0aXRsZUlELAotCQkJU3RyaW5nIHBhdGhBdHRySUQpIHsKLQkJU3RyaW5nIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldERpcmVjdG9yeSBlbnRlcmVkLiIpOwotCQlpZiAocmVtb3RlVUlTZXJ2aWNlICE9IG51bGwpIHsKLQkJCUlSZW1vdGVVSUZpbGVNYW5hZ2VyIGZtZ3IgPSByZW1vdGVVSVNlcnZpY2UuZ2V0VUlGaWxlTWFuYWdlcigpOwotCQkJZm1nci5zZXRDb25uZWN0aW9uKHJlbW90ZUNvbm5lY3Rpb24pOwotCQkJc2VsZWN0ZWRGaWxlID0gZm1nci5icm93c2VEaXJlY3RvcnkocGFyZW50U2hlbGwsIE1lc3NhZ2VzLmdldFN0cmluZyh0aXRsZUlEKSwKLQkJCQkJCQlnZXRGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklEKSkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBwYXJlbnREaXI7Ci0KLQkJCXBhcmVudERpciA9IG5ldyBGaWxlKHNlbGVjdGVkRmlsZSkuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocGFyZW50RGlyID09IG51bGwpIHsKLQkJCQlzYXZlRmlsZURpYWxvZ1BhdGgocGF0aEF0dHJJRCwgIi8iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2F2ZUZpbGVEaWFsb2dQYXRoKHBhdGhBdHRySUQsIHBhcmVudERpcik7Ci0JCQl9Ci0JCQlzZWxlY3Rvci5zZXRQYXRoKHNlbGVjdGVkRmlsZSk7Ci0JCQlzZWxlY3Rvci5zZXRGb2N1cygpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpnZXREaXJlY3RvcnkgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIHZhbGlkYXRpb24gc3RhdGUgZm9yIHRoZSBzcGVjaWZpZWQgd2lkZ2V0IHRvIGluZGljYXRlIHRoYXQgdGhlCi0JICogd2lkZ2V0IHZhbHVlIG11c3QgYmUgdmFsaWRhdGVkLgotCSAqCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHdpZGdldCB0byB2YWxpZGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaWVsZFZhbGlkYXRpb25SZXF1aXJlZChXaWRnZXQgc291cmNlKSB7Ci0JCS8vIEl0ZXJhdGUgdGhydSB0aGUgbGlzdCBvZiB3aWRnZXRzIGxvb2tpbmcgZm9yIHRoZSB3aWRnZXQgd2hpY2ggbmVlZHMKLQkJLy8gdG8gYmUgdmFsaWRhdGVkLiBXaGVuIGZvdW5kLCBzZXQKLQkJLy8gdGhhdCB3aWRnZXQncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHZhbGlkYXRpb24gaXMgbmVlZGVkLgotCQkvLyBXaWRnZXQgY2xhc3MgbmVlZHMKLQkJLy8gdG8gYmUgY2hlY2tlZCBzaW5jZSBhbHRob3VnaCB0aGVzZSB3aWRnZXRzIHBlcmZvcm0gc2ltaWxhciBmdW5jdGlvbnMsCi0JCS8vIHRoZXkgZG8gbm90IGNvbXByaXNlIGEgc2V0IG9mCi0JCS8vIGxvZ2ljYWxseSByZWxhdGVkIHdpZGdldHMgdGhhdCBjYW4gYmUgZWFzaWx5IG9yZ2FuaXplZCBpbiBhIGNsYXNzCi0JCS8vIGhpZXJhcmNoeS4KLQkJSXRlcmF0b3I8T2JqZWN0PiBpOwotCi0JCWkgPSBhY3RpdmVXaWRnZXRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHdpZGdldDsKLQotCQkJd2lkZ2V0ID0gaS5uZXh0KCk7Ci0JCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQm9vbGVhblJvd1dpZGdldCkgewotCQkJCWlmICgoKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCkuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpKSB7Ci0JCQkJCSgoQm9vbGVhblJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ2hlY2tib3hSb3dXaWRnZXQpIHsKLQkJCQlpZiAoKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KS5pc01hdGNoaW5nV2lkZ2V0KHNvdXJjZSkpIHsKLQkJCQkJKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tYm9Sb3dXaWRnZXQpIHsKLQkJCQlpZiAoKChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0KS5pc01hdGNoaW5nV2lkZ2V0KHNvdXJjZSkpIHsKLQkJCQkJKChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHVhbEZpZWxkUm93V2lkZ2V0KSB7Ci0JCQkJaWYgKCgoRHVhbEZpZWxkUm93V2lkZ2V0KSB3aWRnZXQpLmlzTWF0Y2hpbmdXaWRnZXQoc291cmNlKSkgewotCQkJCQkoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgRmlsZVNlbGVjdG9yUm93V2lkZ2V0KSB7Ci0JCQkJaWYgKCgoRmlsZVNlbGVjdG9yUm93V2lkZ2V0KSB3aWRnZXQpLmlzTWF0Y2hpbmdXaWRnZXQoc291cmNlKSkgewotCQkJCQkoKEZpbGVTZWxlY3RvclJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGV4dFJvd1dpZGdldCkgewotCQkJCWlmICgoKFRleHRSb3dXaWRnZXQpIHdpZGdldCkuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpKSB7Ci0JCQkJCSgoVGV4dFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgYWxsIHdpZGdldCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd2lkZ2V0IHZhbHVlIGhhcwotCSAqIGNoYW5nZWQsIG1lYW5pbmcgdmFsaWRhdGlvbiBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0FsbEZpZWxkc0NoYW5nZWQoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaTsKLQotCQlpID0gYWN0aXZlV2lkZ2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCB3aWRnZXQ7Ci0KLQkJCXdpZGdldCA9IGkubmV4dCgpOwotCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIEJvb2xlYW5Sb3dXaWRnZXQpIHsKLQkJCQkoKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCkuc2V0VmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0JCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIENoZWNrYm94Um93V2lkZ2V0KSB7Ci0JCQkJKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tYm9Sb3dXaWRnZXQpIHsKLQkJCQkoKENvbWJvUm93V2lkZ2V0KSB3aWRnZXQpLnNldFZhbGlkYXRpb25SZXF1aXJlZCgpOwotCQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBEdWFsRmllbGRSb3dXaWRnZXQpIHsKLQkJCQkoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgRmlsZVNlbGVjdG9yUm93V2lkZ2V0KSB7Ci0JCQkJKChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCkuc2V0VmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0JCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRleHRSb3dXaWRnZXQpIHsKLQkJCQkoKFRleHRSb3dXaWRnZXQpIHdpZGdldCkuc2V0VmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHRoZSB0YWIgcGFuZSB3aWRnZXQgYW5kIGFsbCBjaGlsZHJlbiBvZiB0aGUgdGFiIHBhbmUuIENhbGxpbmcKLQkgKiBzZXRFbmFibGVkKGZhbHNlKSBvbiB0aGUgdGFiIHBhbmUgd2lkZ2V0IGRpc2FibGVzIHRoZSB0YWIgcGFuZSBhbmQKLQkgKiBwcmV2ZW50cyBpbnRlcmFjdGlvbiB3aXRoIGNoaWxkIHdpZGdldHMsIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZpc2libGUKLQkgKiBzdGF0ZSBvZiB0aGUgY2hpbGQgd2lkZ2V0LiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiBhbGwgd2lkZ2V0cwotCSAqIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSB0aGV5IGFyZSBkaXNhYmxlZC4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXQKLQkgKiAgICAgICAgICAgIFRoZSB3aWRnZXQgdG8gYmUgZGlzYWJsZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2FibGVUYWJQYW5lV2lkZ2V0KENvbnRyb2wgd2lkZ2V0KSB7Ci0JCUNvbnRyb2wgY2hpbGRyZW5bXTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6ZGlzYWJsZVRhYlBhbmVXaWRnZXQgZW50ZXJlZC4iKTsKLQkJLy8gRm9yIGFueSBDb21wb3NpdGUgd2lkZ2V0LCByZWN1cnNpdmVseSBjYWxsIHRoaXMgbWV0aG9kIGZvciBlYWNoIGNoaWxkCi0JCS8vIG9mIHRoZSBDb21wb3NpdGUuIFRoaXMgbXVzdCBiZQotCQkvLyBkb25lIGJlZm9yZSBkaXNhYmxpbmcgdGhlIENvbXBvc2l0ZSBzaW5jZSBkaXNhYmxpbmcgdGhlIENvbXBvc2l0ZQotCQkvLyBhbHNvIG1hcmtzIGl0cyBjaGlsZHJlbiBkaXNhYmxlZAotCQkvLyBhbmQgdGhlIHJlYWwgZW5hYmxlL2Rpc2FibGUgc3RhdGUgb2YgdGhlIGNoaWxkIGNhbm5vdCBiZSBwcmVzZXJ2ZWQuCi0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCWNoaWxkcmVuID0gKChDb21wb3NpdGUpIHdpZGdldCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlkaXNhYmxlVGFiUGFuZVdpZGdldChjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdpZGdldCwgdGhlbiBkaXNhYmxlIGl0LgotCQl3aWRnZXQuc2V0RGF0YShFTkFCTEVfU1RBVEUsIEJvb2xlYW4udmFsdWVPZih3aWRnZXQuaXNFbmFibGVkKCkpKTsKLQkJd2lkZ2V0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6ZGlzYWJsZVRhYlBhbmVXaWRnZXQgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgd2lkZ2V0IGJhY2sgdG8gaXRzIHByZXZpb3VzIGVuYWJsZS9kaXNhYmxlIHN0YXRlCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0Ci0JICogICAgICAgICAgICBUaGUgd2lkZ2V0IHdob3NlIHN0YXRlIGlzIHRvIGJlIHJlc3RvcmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlVGFiUGFuZVdpZGdldFN0YXRlKENvbnRyb2wgd2lkZ2V0KSB7Ci0JCUNvbnRyb2wgY2hpbGRyZW5bXTsKLQkJQm9vbGVhbiBzdGF0ZTsKLQkJYm9vbGVhbiBlbmFibGVGbGFnOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpyZXN0b3JlVGFiUGFuZVdpZGdldFN0YXRlIGVudGVyZWQuIik7Ci0JCS8vIEdldCB3aWRnZXQncyBwcmV2aW91cyBlbmFibGUvZGlzYWJsZSBzdGF0ZS4gSWYgdGhlcmUgaXMgbm8gc2F2ZWQKLQkJLy8gc3RhdGUsIHN1Y2ggYXMgd2hlbiBpbml0aWFsbHkKLQkJLy8gY3JlYXRpbmcgdGhlIHBhcmFsbGVsIHRhYiBpbiBiYXNpYyBtb2RlLCB0aGVuIGVuYWJsZSB0aGUgd2lkZ2V0LgotCQlzdGF0ZSA9IChCb29sZWFuKSB3aWRnZXQuZ2V0RGF0YShFTkFCTEVfU1RBVEUpOwotCQlpZiAoc3RhdGUgPT0gbnVsbCkgewotCQkJZW5hYmxlRmxhZyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllbmFibGVGbGFnID0gc3RhdGUuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJd2lkZ2V0LnNldEVuYWJsZWQoZW5hYmxlRmxhZyk7Ci0JCS8vIFJlY3Vyc2l2ZWx5IGNhbGwgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGNoaWxkcmVuIG9mIGEgQ29tcG9zaXRlCi0JCS8vIHdpZGdldC4gTm90ZSB0aGF0IG9yZGVyaW5nIG9mIHByb2Nlc3NpbmcKLQkJLy8gaGVyZSBkb2VzIG5vdCBtYXR0ZXIgc2luY2UgZW5hYmxpbmcgYSBDb21wb3NpdGUgd2lkZ2V0IGRvZXMgbm90Ci0JCS8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIGl0cyBjaGlsZHJlbi4KLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJY2hpbGRyZW4gPSAoKENvbXBvc2l0ZSkgd2lkZ2V0KS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXJlc3RvcmVUYWJQYW5lV2lkZ2V0U3RhdGUoY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpyZXN0b3JlVGFiUGFuZVdpZGdldFN0YXRlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHdpZGdldCBiYWNrIHRvIGl0cyBwcmV2aW91cyBlbmFibGUvZGlzYWJsZSBzdGF0ZQotCSAqCi0JICogQHBhcmFtIHdpZGdldAotCSAqICAgICAgICAgICAgVGhlIHdpZGdldCB3aG9zZSBzdGF0ZSBpcyB0byBiZSByZXN0b3JlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlVGFiUGFuZVdpZGdldFN0YXRlKENvbnRyb2wgd2lkZ2V0KSB7Ci0JCUNvbnRyb2wgY2hpbGRyZW5bXTsKLQkJQm9vbGVhbiBzdGF0ZTsKLQkJYm9vbGVhbiBlbmFibGVGbGFnOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjplbmFibGVUYWJQYW5lV2lkZ2V0U3RhdGUgZW50ZXJlZC4iKTsKLQkJLy8gRW5hYmxlIHRoZSB3aWRnZXQuCi0JCXdpZGdldC5zZXRFbmFibGVkKHRydWUpOwotCQkvLyBSZWN1cnNpdmVseSBjYWxsIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBjaGlsZHJlbiBvZiBhIENvbXBvc2l0ZQotCQkvLyB3aWRnZXQuIE5vdGUgdGhhdCBvcmRlcmluZyBvZiBwcm9jZXNzaW5nCi0JCS8vIGhlcmUgZG9lcyBub3QgbWF0dGVyIHNpbmNlIGVuYWJsaW5nIGEgQ29tcG9zaXRlIHdpZGdldCBkb2VzIG5vdAotCQkvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSBpdHMgY2hpbGRyZW4uCi0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCWNoaWxkcmVuID0gKChDb21wb3NpdGUpIHdpZGdldCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQllbmFibGVUYWJQYW5lV2lkZ2V0U3RhdGUoY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjplbmFibGVUYWJQYW5lV2lkZ2V0U3RhdGUgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFNldCBsYXVuY2ggcGFuZWwgbW9kZSBiYXNlZCBvbiBsbFN1Ym1pdE1vZGUgc2V0dGluZy4gSWYgY2hlY2tlZCwgdGhlbiBzZXQKLQkgKiBzdWJtaXQgbW9kZSwgd2hlcmUgdGhlIHVzZXIgc3VwcGxpZXMgYSBMTCBzZXR1cCBzY3JpcHQuIE90aGVyd2lzZSBzZXQKLQkgKiBiYXNpYyBtb2RlLCB3aGVyZSB0aGUgdXNlciBjaG9vc2VzIExMIG9wdGlvbnMgZnJvbSBhIHRhYmJlZCBkaWFsb2cgcGFuZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGF1bmNoUGFuZWxNb2RlKCkgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0TGF1bmNoUGFuZWxNb2RlIGVudGVyZWQuIik7Ci0JCWlmIChsbFN1Ym1pdE1vZGUgIT0gbnVsbCkgewotCQkJaWYgKGxsU3VibWl0TW9kZS5nZXRWYWx1ZSgpLmVxdWFscygiQWR2YW5jZWQiKSkgewotCQkJCWlmIChsbEpvYkNvbW1hbmRGaWxlICE9IG51bGwpIHsKLQkJCQkJbGxKb2JDb21tYW5kRmlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCQlpZiAobGxKb2JDb21tYW5kRmlsZVRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJbGxKb2JDb21tYW5kRmlsZVRlbXBsYXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlkaXNhYmxlVGFiUGFuZVdpZGdldCh0YWJiZWRQYW5lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxsSm9iQ29tbWFuZEZpbGUgIT0gbnVsbCkgewotCQkJCQlsbEpvYkNvbW1hbmRGaWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAobGxKb2JDb21tYW5kRmlsZVRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJbGxKb2JDb21tYW5kRmlsZVRlbXBsYXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWVuYWJsZVRhYlBhbmVXaWRnZXRTdGF0ZSh0YWJiZWRQYW5lKTsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0TGF1bmNoUGFuZWxNb2RlIHJldHVybmluZy4iKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHRleHQgd2lkZ2V0IGluIHRoZSB0YWJiZWQgdmlldy4gVGhlIHRleHQgZmllbGQgc3BhbnMgY29sdW1ucyAyCi0JICogYW5kIDMgb2YgdGhlIHRhYmJlZCBwYW5lLiBUaGUgbGFiZWwgYW5kIHRvb2x0aXAgdGV4dCBhcmUgb2J0YWluZWQgZnJvbQotCSAqIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBQYXJlbnQgd2lkZ2V0ICh0aGUgcGFuZSBpbiB0aGUgdGFiYmVkIHZpZXcpCi0JICogQHBhcmFtIHJtCi0JICogICAgICAgICAgICBSZXNvdXJjZSBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBsYXVuY2ggY29uZmlnCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgaWQgZm9yIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0JICogQHJldHVybiBUZXh0Um93V2lkZ2V0IGVudHJ5IHdpZGdldAotCSAqLwotCXByaXZhdGUgVGV4dFJvd1dpZGdldCBjcmVhdGVUZXh0V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgaWQpIHsKLQkJVGV4dFJvd1dpZGdldCB3aWRnZXQ7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZVRleHRXaWRnZXQgZW50ZXJlZC4iKTsKLQkJd2lkZ2V0ID0gbnVsbDsKLQkJYXR0ciA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQl3aWRnZXQgPSBuZXcgVGV4dFJvd1dpZGdldChwYXJlbnQsIGlkLCBhdHRyKTsKLQkJCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQkJd2lkZ2V0LnNldFZhbGlkYXRpb25SZXF1aXJlZCgpOwotCQkJYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlVGV4dFdpZGdldCByZXR1cm5pbmcuIik7Ci0JCXJldHVybiB3aWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgdGV4dCB3aWRnZXQgaW4gdGhlIHRhYmJlZCB2aWV3LiBUaGUgdGV4dCBmaWVsZCBzcGFucyBjb2x1bW5zIDIKLQkgKiBhbmQgMyBvZiB0aGUgdGFiYmVkIHBhbmUuIFRoZSBsYWJlbCBhbmQgdG9vbHRpcCB0ZXh0IGFyZSBvYnRhaW5lZCBmcm9tCi0JICogdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFBhcmVudCB3aWRnZXQgKHRoZSBwYW5lIGluIHRoZSB0YWJiZWQgdmlldykKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFJlc291cmNlIG1hbmFnZXIgdXNlZCBieSB0aGlzIGxhdW5jaCBjb25maWcKLQkgKiBAcGFyYW0gaWQxCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgaWQgZm9yIGZpcnN0IHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0JICogQHBhcmFtIGlkMgotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGlkIGZvciBzZWNvbmQgcm0gYXR0cmlidXRlIHRoaXMgd2lkZ2V0IHJlcHJlc2VudHMKLQkgKiBAcmV0dXJuIFRleHQgZW50cnkgd2lkZ2V0Ci0JICovCi0JcHJpdmF0ZSBEdWFsRmllbGRSb3dXaWRnZXQgY3JlYXRlRHVhbEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgaWQxLCBTdHJpbmcgaWQyKSB7Ci0JCUR1YWxGaWVsZFJvd1dpZGdldCB3aWRnZXQ7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHIxOwotCQlJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyMjsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlRHVhbEZpZWxkIGVudGVyZWQuIik7Ci0JCXdpZGdldCA9IG51bGw7Ci0JCWF0dHIxID0gcm0uZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihpZDEpOwotCQlhdHRyMiA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQyKTsKLQkJaWYgKChhdHRyMSAhPSBudWxsKSAmJiAoYXR0cjIgIT0gbnVsbCkpIHsKLQkJCXdpZGdldCA9IG5ldyBEdWFsRmllbGRSb3dXaWRnZXQocGFyZW50LCBpZDEsIGlkMiwgYXR0cjEsIGF0dHIyKTsKLQkJCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQkJd2lkZ2V0LnNldFZhbGlkYXRpb25SZXF1aXJlZCgpOwotCQkJYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlRHVhbEZpZWxkIHJldHVybmluZy4iKTsKLQkJcmV0dXJuIHdpZGdldDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjaGVja2JveCB3aWRnZXQgaW4gdGhlIHRhYmJlZCB2aWV3LiBUaGUgY2hlY2tib3ggaXMgaW4gY29sdW1uIDIKLQkgKiBhbmQgY29sdW1uIDMgaXMgYSBmaWxsZXIgKExhYmVsKSB3aWRnZXQuIFRvIGVuc3VyZSBjb25zaXN0ZW50IGFsaWdubWVudCwKLQkgKiB0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgZXh0cmEgaG9yaXpvbnRhbCBzcGFjZSB0byB0aGUgMm5kIGNvbHVtbi4gVGhlIGxhYmVsCi0JICogYW5kIHRvb2x0aXAgdGV4dCBhcmUgb2J0YWluZWQgZnJvbSB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgUGFyZW50IHdpZGdldCAodGhlIHBhbmUgaW4gdGhlIHRhYmJlZCB2aWV3KQotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgUmVzb3VyY2UgbWFuYWdlciB1c2VkIGJ5IHRoaXMgbGF1bmNoIGNvbmZpZwotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGlkIGZvciBybSBhdHRyaWJ1dGUgdGhpcyB3aWRnZXQgcmVwcmVzZW50cwotCSAqIEByZXR1cm4gQ2hlY2tib3ggYnV0dG9uIGZvciB0aGlzIGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgQ2hlY2tib3hSb3dXaWRnZXQgY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBpZCkgewotCQlDaGVja2JveFJvd1dpZGdldCB3aWRnZXQ7Ci0JCVN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlQ2hlY2tib3ggZW50ZXJlZC4iKTsKLQkJd2lkZ2V0ID0gbnVsbDsKLQkJYXR0ckRlZiA9IChTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGlkKTsKLQkJaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCQkJd2lkZ2V0ID0gbmV3IENoZWNrYm94Um93V2lkZ2V0KHBhcmVudCwgaWQsIGF0dHJEZWYpOwotCQkJd2lkZ2V0LnNldFZhbGlkYXRpb25SZXF1aXJlZCgpOwotCQkJYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlQ2hlY2tib3ggcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gd2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHJhZGlvIGJ1dHRvbiBwYWlyIGluIHRoZSB0YWJiZWQgdmlldy4gVGhlIGxhYmVsLCBidXR0b24gbGFiZWxzLAotCSAqIGFuZCB0b29sdGlwIHRleHQgYXJlIG9idGFpbmVkIGZyb20gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFBhcmVudCB3aWRnZXQgKHRoZSBwYW5lIGluIHRoZSB0YWJiZWQgdmlldykKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFJlc291cmNlIG1hbmFnZXIgdXNlZCBieSB0aGlzIGxhdW5jaCBjb25maWcKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBpZCBmb3Igcm0gYXR0cmlidXRlIHRoaXMgd2lkZ2V0IHJlcHJlc2VudHMKLQkgKiBAcmV0dXJuIENoZWNrYm94IGJ1dHRvbiBmb3IgdGhpcyBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgY3JlYXRlQm9vbGVhbk9wdGlvbihDb21wb3NpdGUgcGFyZW50LAotCQkJSVJlc291cmNlTWFuYWdlciBybSwgU3RyaW5nIGlkKSB7Ci0JCUJvb2xlYW5Sb3dXaWRnZXQgd2lkZ2V0OwotCQlTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJEZWY7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUJvb2xlYW5PcHRpb24gZW50ZXJlZC4iKTsKLQkJd2lkZ2V0ID0gbnVsbDsKLQkJYXR0ckRlZiA9IChTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uKSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGlkKTsKLQkJaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCQkJd2lkZ2V0ID0gbmV3IEJvb2xlYW5Sb3dXaWRnZXQocGFyZW50LCBpZCwgYXR0ckRlZiwKLQkJCQkJTExfUFRQX1NVQk1JVF9NT0RFX1JBRElPQk9YKTsKLQkJCXdpZGdldC5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQkJYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlQm9vbGVhbk9wdGlvbiByZXR1cm5pbmcuIik7Ci0JCXJldHVybiB3aWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgdGV4dCBmaWVsZCBhbmQgcHVzaGJ1dHRvbiBpbiB0aGlzIHJvdy4gVGhlIHRleHQgZmllbGQgaXMgaW4KLQkgKiBjb2x1bW4gMiBhbmQgdGhlIHB1c2hidXR0b24gaW4gY29sdW1uIDMuIFRoZSB1c2VyIGVpdGhlciBmaWxscyBpbiB0aGUKLQkgKiB0ZXh0IGZpZWxkIHdpdGggYSBwYXRobmFtZSwgb3IgY2xpY2tzIHRoZSBidXR0b24gdG8gcG9wIHVwIGEgZmlsZQotCSAqIHNlbGVjdG9yIGRpYWxvZyB0aGF0IHRoZW4gZmlsbHMgaW4gdGhlIHRleHQgZmllbGQuIFRvIGVuc3VyZSBjb25zaXN0ZW50Ci0JICogYWxpZ25tZW50LCB0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgZXh0cmEgaG9yaXpvbnRhbCBzcGFjZSB0byB0aGUgMm5kCi0JICogY29sdW1uLiBUaGUgbGFiZWwgYW5kIHRvb2x0aXAgdGV4dCBhcmUgb2J0YWluZWQgZnJvbSB0aGUgYXR0cmlidXRlCi0JICogZGVmaW5pdGlvbiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBQYXJlbnQgd2lkZ2V0ICh0aGUgcGFuZSBpbiB0aGUgdGFiYmVkIHZpZXcpCi0JICogQHBhcmFtIHJtCi0JICogICAgICAgICAgICBSZXNvdXJjZSBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBsYXVuY2ggY29uZmlnCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgaWQgZm9yIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0JICogQHBhcmFtIHNlbGVjdG9ySUQKLQkgKiAgICAgICAgICAgIElkZW50aWZpZXIgdXNlZCB0byBpZGVudGlmeSB0aGUgYnJvd3NlIGJ1dHRvbiBhc3NvY2lhdGVkIHdpdGgKLQkgKiAgICAgICAgICAgIHRoaXMgd2lkZ2V0Ci0JICogQHJldHVybiBUZXh0IGVudHJ5IGZpZWxkIGZvciB0aGlzIGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IGNyZWF0ZUZpbGVTZWxlY3RvcihDb21wb3NpdGUgcGFyZW50LAotCQkJSVJlc291cmNlTWFuYWdlciBybSwgU3RyaW5nIGlkLCBpbnQgc2VsZWN0b3JJRCkgewotCQlGaWxlU2VsZWN0b3JSb3dXaWRnZXQgd2lkZ2V0OwotCQlTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUZpbGVTZWxlY3RvciBlbnRlcmVkLiIpOwotCQl3aWRnZXQgPSBudWxsOwotCQlhdHRyID0gKFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24pIHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQl3aWRnZXQgPSBuZXcgRmlsZVNlbGVjdG9yUm93V2lkZ2V0KHBhcmVudCwgaWQsIHNlbGVjdG9ySUQsIGF0dHIpOwotCQkJd2lkZ2V0LnNldERhdGEoaWQpOwotCQkJd2lkZ2V0LnNldFZhbGlkYXRpb25SZXF1aXJlZCgpOwotCQkJd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JCQl3aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQkJCWFjdGl2ZVdpZGdldHMuYWRkKHdpZGdldCk7Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUZpbGVTZWxlY3RvciByZXR1cm5pbmcuIik7Ci0JCXJldHVybiB3aWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY29tYm9ib3ggd2lkZ2V0IGluIHRoZSB0YWJiZWQgdmlldy4gVGhlIHdpZGdldCBzcGFucyBjb2x1bW5zIDIKLQkgKiBhbmQgMyBvZiB0aGUgdGFiYmVkIHBhbmUuIFRoZSBsYWJlbCBhbmQgdG9vbHRpcCB0ZXh0IGFyZSBvYnRhaW5lZCBmcm9tCi0JICogdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFBhcmVudCB3aWRnZXQgKHRoZSBwYW5lIGluIHRoZSB0YWJiZWQgdmlldykKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFJlc291cmNlIG1hbmFnZXIgdXNlZCBieSB0aGlzIGxhdW5jaCBjb25maWcKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBpZCBmb3Igcm0gYXR0cmlidXRlIHRoaXMgd2lkZ2V0IHJlcHJlc2VudHMKLQkgKiBAcmV0dXJuIENvbWJvUm93V2lkZ2V0IHVzZWQgYnkgdGhpcyBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIENvbWJvUm93V2lkZ2V0IGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgaWQsIGludCBzZWxlY3Rvcl9pZCkgewotCQlDb21ib1Jvd1dpZGdldCB3aWRnZXQ7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUNvbWJvYm94IGVudGVyZWQuIik7Ci0JCXdpZGdldCA9IG51bGw7Ci0JCWF0dHIgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGlkKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJd2lkZ2V0ID0gbmV3IENvbWJvUm93V2lkZ2V0KHBhcmVudCwgaWQsIGF0dHIsIHRydWUsIHNlbGVjdG9yX2lkKTsKLQkJCXdpZGdldC5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQkJYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlQ29tYm9ib3ggcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gd2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlZGl0YWJsZSBjb21ib2JveCBpbiB0aGUgdGFiYmVkIHZpZXcuIFRoZSB3aWRnZXQgc3BhbnMgY29sdW1ucwotCSAqIDIgYW5kIDMgb2YgdGhlIHRhYmJlZCBwYW5lLiBUaGUgbGFiZWwgYW5kIHRvb2x0aXAgdGV4dCBhcmUgb2J0YWluZWQgZnJvbQotCSAqIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBQYXJlbnQgd2lkZ2V0ICh0aGUgcGFuZSBpbiB0aGUgdGFiYmVkIHZpZXcpCi0JICogQHBhcmFtIHJtCi0JICogICAgICAgICAgICBSZXNvdXJjZSBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBsYXVuY2ggY29uZmlnCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgaWQgZm9yIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0JICogQHJldHVybiBFZGl0YWJsZSBDb21ib1Jvd1dpZGdldCB1c2VkIGJ5IHRoaXMgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBjcmVhdGVFZGl0YWJsZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgaWQsIGludCBzZWxlY3Rvcl9pZCkgewotCQlDb21ib1Jvd1dpZGdldCB3aWRnZXQ7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUVkaXRhYmxlQ29tYm9ib3ggZW50ZXJlZC4iKTsKLQkJd2lkZ2V0ID0gbnVsbDsKLQkJYXR0ciA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQl3aWRnZXQgPSBuZXcgQ29tYm9Sb3dXaWRnZXQocGFyZW50LCBpZCwgYXR0ciwgZmFsc2UsIHNlbGVjdG9yX2lkKTsKLQkJCXdpZGdldC5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQkJd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JCQlhY3RpdmVXaWRnZXRzLmFkZCh3aWRnZXQpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVFZGl0YWJsZUNvbWJvYm94IHJldHVybmluZy4iKTsKLQkJcmV0dXJuIHdpZGdldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhbGwgd2lkZ2V0cyB3aXRoaW4gdGhpcyBwYW5lIHRvIG51bGwgYXMgcGFydCBvZiBwYW5lbAotCSAqIGluaXRpYWxpemF0aW9uLiBEZXBlbmRpbmcgb24gT1MgYW5kIG9wZXJhdGlvbiBtb2RlICh3aXRoIG9yIHdpdGhvdXQKLQkgKiBMb2FkTGV2ZWxlciksIHNvbWUgd2lkZ2V0cyB3aWxsIG5vdCBhcHBlYXIgb24gdGhlIHBhbmVscywgd2hlcmUgdGhlIHNldAotCSAqIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBzZW50IGJ5IHRoZSBwcm94eSBkZXRlcm1pbmVzIHRoYXQgc2V0LiBOZXcKLQkgKiB3aWRnZXRzIHdpbGwgYmUgZ2VuZXJhdGVkIG9ubHkgd2hlbiBhIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGRlZmluaXRpb24KLQkgKiBpcyBzZW50IGJ5IHRoZSBwcm94eS4gQW55IGNvZGUgd2hpY2ggYWNjZXNzZXMgYSB3aWRnZXQgc2hvdWxkIGVuc3VyZSB0aGUKLQkgKiB3aWRnZXQgaXMgbm90IG51bGwgYmVmb3JlIGFjY2Vzc2luZyB0aGUgd2lkZ2V0IG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJBbGxXaWRnZXRzKCkgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y2xlYXJBbGxXaWRnZXRzIGVudGVyZWQuIik7Ci0JCWxsQ29tbWVudCA9IG51bGw7Ci0JCWxsSm9iTmFtZSA9IG51bGw7Ci0JCWxsSm9iVHlwZSA9IG51bGw7Ci0JCWxsQ2xhc3MgPSBudWxsOwotCQlsbExhcmdlUGFnZSA9IG51bGw7Ci0JCWxsV2FsbENsb2NrTGltaXRIYXJkID0gbnVsbDsKLQkJbGxXYWxsQ2xvY2tMaW1pdFNvZnQgPSBudWxsOwotCQlsbFJlcXVpcmVtZW50cyA9IG51bGw7Ci0JCWxsUmVzb3VyY2VzID0gbnVsbDsKLQkJbGxFcnJvciA9IG51bGw7Ci0JCWxsSW5wdXQgPSBudWxsOwotCQlsbE91dHB1dCA9IG51bGw7Ci0JCWxsSW5pdGlhbERpciA9IG51bGw7Ci0JCWxsU2hlbGwgPSBudWxsOwotCQlsbEV4ZWN1dGFibGUgPSBudWxsOwotCQlsbEVudmlyb25tZW50ID0gbnVsbDsKLQkJbGxCbG9ja2luZyA9IG51bGw7Ci0JCWxsQnVsa3hmZXIgPSBudWxsOwotCQlsbE5ldHdvcmtfbXBpID0gbnVsbDsKLQkJbGxOZXR3b3JrX2xhcGkgPSBudWxsOwotCQlsbE5ldHdvcmtfbXBpX2xhcGkgPSBudWxsOwotCQlsbE5vZGVNaW4gPSBudWxsOwotCQlsbE5vZGVNYXggPSBudWxsOwotCQlsbFRhc2tHZW9tZXRyeSA9IG51bGw7Ci0JCWxsVGFza3NQZXJOb2RlID0gbnVsbDsKLQkJbGxUb3RhbFRhc2tzID0gbnVsbDsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y2xlYXJBbGxXaWRnZXRzIHJldHVybmluZy4iKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgbGF5b3V0IG9iamVjdCBmb3IgYSBwYW5lIGluIHRoZSBUYWJGb2xkZXIKLQkgKgotCSAqIEByZXR1cm4gTGF5b3V0IGZvciB1c2UgaW4gdGhlIHRhYmJlZCBwYW5lCi0JICovCi0JcHJpdmF0ZSBMYXlvdXQgY3JlYXRlVGFiUGFuZUxheW91dCgpIHsKLQkJR3JpZExheW91dCBsYXlvdXQ7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZVRhYlBhbmVMYXlvdXQgZW50ZXJlZC4iKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA0OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA4OwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNDsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZVRhYlBhbmVMYXlvdXQgcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdGFza3MgdGFiIG9mIHRoZSBhdHRyaWJ1dGVzIHBhbmUKLQkgKgotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmFsVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJVGFiSXRlbSB0YWI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUdlbmVyYWxUYWIgZW50ZXJlZC4iKTsKLQkJdGFiID0gbmV3IFRhYkl0ZW0odGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCQlnZW5lcmFsVGFiUGFuZSA9IG5ldyBDb21wb3NpdGUodGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCQl0YWIuc2V0Q29udHJvbChnZW5lcmFsVGFiUGFuZSk7Ci0JCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR2VuZXJhbFRhYi50aXRsZSIpKTsKLQkJZ2VuZXJhbFRhYlBhbmUuc2V0TGF5b3V0KGNyZWF0ZVRhYlBhbmVMYXlvdXQoKSk7Ci0JCWxsQ29tbWVudCA9IGNyZWF0ZVRleHRXaWRnZXQoZ2VuZXJhbFRhYlBhbmUsIHJtLCBMTF9QVFBfQ09NTUVOVCk7Ci0JCWxsSm9iTmFtZSA9IGNyZWF0ZVRleHRXaWRnZXQoZ2VuZXJhbFRhYlBhbmUsIHJtLCBMTF9QVFBfSk9CX05BTUUpOwotCQlsbEpvYlR5cGUgPSBjcmVhdGVDb21ib2JveChnZW5lcmFsVGFiUGFuZSwgcm0sIExMX1BUUF9KT0JfVFlQRSwgTExfUFRQX0pPQl9UWVBFX1NFTEVDVE9SKTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlR2VuZXJhbFRhYiByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBJL08gdGFiIG9mIHRoZSBhdHRyaWJ1dGVzIHBhbmUKLQkgKgotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTY2hlZHVsaW5nQmFzaWNUYWIoSVJlc291cmNlTWFuYWdlciBybSkgewotCQlUYWJJdGVtIHRhYjsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlU2NoZWR1bGluZ0Jhc2ljVGFiIGVudGVyZWQuIik7Ci0JCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJc2NoZWR1bGluZ0Jhc2ljVGFiUGFuZSA9IG5ldyBDb21wb3NpdGUodGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCQl0YWIuc2V0Q29udHJvbChzY2hlZHVsaW5nQmFzaWNUYWJQYW5lKTsKLQkJdGFiLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTY2hlZHVsaW5nQmFzaWNUYWIudGl0bGUiKSk7Ci0JCXNjaGVkdWxpbmdCYXNpY1RhYlBhbmUuc2V0TGF5b3V0KGNyZWF0ZVRhYlBhbmVMYXlvdXQoKSk7Ci0JCWxsQ2xhc3MgPSBjcmVhdGVUZXh0V2lkZ2V0KHNjaGVkdWxpbmdCYXNpY1RhYlBhbmUsIHJtLCBMTF9QVFBfQ0xBU1MpOwotCQlsbExhcmdlUGFnZSA9IGNyZWF0ZUNvbWJvYm94KHNjaGVkdWxpbmdCYXNpY1RhYlBhbmUsIHJtLAotCQkJCUxMX1BUUF9MQVJHRV9QQUdFLCAwKTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlU2NoZWR1bGluZ0Jhc2ljVGFiIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGRpYWdub3N0aWNzIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2NoZWR1bGluZ1JlcXVpcmVtZW50c1RhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKSB7Ci0JCVRhYkl0ZW0gdGFiOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVTY2hlZHVsaW5nUmVxdWlyZW1lbnRzVGFiIGVudGVyZWQuIik7Ci0JCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJc2NoZWR1bGluZ1JlcXVpcmVtZW50c1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJdGFiLnNldENvbnRyb2woc2NoZWR1bGluZ1JlcXVpcmVtZW50c1RhYlBhbmUpOwotCQl0YWIuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNjaGVkdWxpbmdSZXF1aXJlbWVudHNUYWIudGl0bGUiKSk7Ci0JCXNjaGVkdWxpbmdSZXF1aXJlbWVudHNUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCQlsbFJlcXVpcmVtZW50cyA9IGNyZWF0ZVRleHRXaWRnZXQoc2NoZWR1bGluZ1JlcXVpcmVtZW50c1RhYlBhbmUsIHJtLAotCQkJCUxMX1BUUF9SRVFVSVJFTUVOVFMpOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVTY2hlZHVsaW5nUmVxdWlyZW1lbnRzVGFiIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGRlYnVnIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2NoZWR1bGluZ1Jlc291cmNlc1RhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKSB7Ci0JCVRhYkl0ZW0gdGFiOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVTY2hlZHVsaW5nUmVzb3VyY2VzVGFiIGVudGVyZWQuIik7Ci0JCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJc2NoZWR1bGluZ1Jlc291cmNlc1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJdGFiLnNldENvbnRyb2woc2NoZWR1bGluZ1Jlc291cmNlc1RhYlBhbmUpOwotCQl0YWIuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNjaGVkdWxpbmdSZXNvdXJjZXNUYWIudGl0bGUiKSk7Ci0JCXNjaGVkdWxpbmdSZXNvdXJjZXNUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCQlsbFJlc291cmNlcyA9IGNyZWF0ZVRleHRXaWRnZXQoc2NoZWR1bGluZ1Jlc291cmNlc1RhYlBhbmUsIHJtLAotCQkJCUxMX1BUUF9SRVNPVVJDRVMpOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVTY2hlZHVsaW5nUmVzb3VyY2VzVGFiIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHN5c3RlbSByZXNvdXJjZXMgdGFiIG9mIHRoZSBhdHRyaWJ1dGVzIHBhbmUKLQkgKgotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVSdW50aW1lVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJVGFiSXRlbSB0YWI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZVJ1bnRpbWVUYWIgZW50ZXJlZC4iKTsKLQkJdGFiID0gbmV3IFRhYkl0ZW0odGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCQlydW50aW1lVGFiUGFuZSA9IG5ldyBDb21wb3NpdGUodGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCQl0YWIuc2V0Q29udHJvbChydW50aW1lVGFiUGFuZSk7Ci0JCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUnVudGltZVRhYi50aXRsZSIpKTsKLQkJcnVudGltZVRhYlBhbmUuc2V0TGF5b3V0KGNyZWF0ZVRhYlBhbmVMYXlvdXQoKSk7Ci0JCWxsRXJyb3IgPSBjcmVhdGVUZXh0V2lkZ2V0KHJ1bnRpbWVUYWJQYW5lLCBybSwgTExfUFRQX0VSUk9SKTsKLQkJbGxPdXRwdXQgPSBjcmVhdGVUZXh0V2lkZ2V0KHJ1bnRpbWVUYWJQYW5lLCBybSwgTExfUFRQX09VVFBVVCk7Ci0JCWxsSW5wdXQgPSBjcmVhdGVUZXh0V2lkZ2V0KHJ1bnRpbWVUYWJQYW5lLCBybSwgTExfUFRQX0lOUFVUKTsKLQkJbGxFeGVjdXRhYmxlID0gY3JlYXRlVGV4dFdpZGdldChydW50aW1lVGFiUGFuZSwgcm0sIExMX1BUUF9FWEVDVVRBQkxFKTsKLQkJbGxJbml0aWFsRGlyID0gY3JlYXRlVGV4dFdpZGdldChydW50aW1lVGFiUGFuZSwgcm0sIExMX1BUUF9JTklUSUFMRElSKTsKLQkJbGxFbnZpcm9ubWVudCA9IGNyZWF0ZVRleHRXaWRnZXQocnVudGltZVRhYlBhbmUsIHJtLCBMTF9QVFBfRU5WSVJPTk1FTlQpOwotCQlsbFNoZWxsID0gY3JlYXRlVGV4dFdpZGdldChydW50aW1lVGFiUGFuZSwgcm0sIExMX1BUUF9TSEVMTCk7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZVJ1bnRpbWVUYWIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgbm9kZSBhbGxvY2F0aW9uIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTm9kZXNOZXR3b3JrVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJVGFiSXRlbSB0YWI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZU5vZGVzTmV0d29ya1RhYiBlbnRlcmVkLiIpOwotCQl0YWIgPSBuZXcgVGFiSXRlbSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0JCW5vZGVzTmV0d29ya1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJdGFiLnNldENvbnRyb2wobm9kZXNOZXR3b3JrVGFiUGFuZSk7Ci0JCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTm9kZXNOZXR3b3JrVGFiLnRpdGxlIikpOwotCQlub2Rlc05ldHdvcmtUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCQlsbEJsb2NraW5nID0gY3JlYXRlVGV4dFdpZGdldChub2Rlc05ldHdvcmtUYWJQYW5lLCBybSwgTExfUFRQX0JMT0NLSU5HKTsKLQkJbGxCdWxreGZlciA9IGNyZWF0ZUNvbWJvYm94KG5vZGVzTmV0d29ya1RhYlBhbmUsIHJtLAotCQkJCUxMX1BUUF9CVUxLX1hGRVIsIDApOwotCQlsbE5ldHdvcmtfbXBpID0gY3JlYXRlVGV4dFdpZGdldChub2Rlc05ldHdvcmtUYWJQYW5lLCBybSwKLQkJCQlMTF9QVFBfTkVUV09SS19NUEkpOwotCQlsbE5ldHdvcmtfbGFwaSA9IGNyZWF0ZVRleHRXaWRnZXQobm9kZXNOZXR3b3JrVGFiUGFuZSwgcm0sCi0JCQkJTExfUFRQX05FVFdPUktfTEFQSSk7Ci0JCWxsTmV0d29ya19tcGlfbGFwaSA9IGNyZWF0ZVRleHRXaWRnZXQobm9kZXNOZXR3b3JrVGFiUGFuZSwgcm0sCi0JCQkJTExfUFRQX05FVFdPUktfTVBJX0xBUEkpOwotCQlsbE5vZGVNaW4gPSBjcmVhdGVUZXh0V2lkZ2V0KG5vZGVzTmV0d29ya1RhYlBhbmUsIHJtLCBMTF9QVFBfTk9ERV9NSU4pOwotCQlsbE5vZGVNYXggPSBjcmVhdGVUZXh0V2lkZ2V0KG5vZGVzTmV0d29ya1RhYlBhbmUsIHJtLCBMTF9QVFBfTk9ERV9NQVgpOwotCQlsbFRhc2tHZW9tZXRyeSA9IGNyZWF0ZVRleHRXaWRnZXQobm9kZXNOZXR3b3JrVGFiUGFuZSwgcm0sCi0JCQkJTExfUFRQX1RBU0tfR0VPTUVUUlkpOwotCQlsbFRhc2tzUGVyTm9kZSA9IGNyZWF0ZVRleHRXaWRnZXQobm9kZXNOZXR3b3JrVGFiUGFuZSwgcm0sCi0JCQkJTExfUFRQX1RBU0tTX1BFUl9OT0RFKTsKLQkJbGxUb3RhbFRhc2tzID0gY3JlYXRlVGV4dFdpZGdldChub2Rlc05ldHdvcmtUYWJQYW5lLCBybSwKLQkJCQlMTF9QVFBfVE9UQUxfVEFTS1MpOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVOb2Rlc05ldHdvcmtUYWIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZmlyc3QgcGVyZm9ybWFuY2UgdGFiIG9mIHRoZSBhdHRyaWJ1dGVzIHBhbmUuIER1ZSB0byB0aGUKLQkgKiBudW1iZXIgb2YgcGVyZm9ybWFuY2UgcmVsYXRlZCBhdHRyaWJ1dGVzLCB0aGVyZSBhcmUgdHdvIHBlcmZvcm1hbmNlIHRhYnMuCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGltaXRzVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJVGFiSXRlbSB0YWI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUxpbWl0c1RhYiBlbnRlcmVkLiIpOwotCQl0YWIgPSBuZXcgVGFiSXRlbSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0JCWxpbWl0c1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQkJdGFiLnNldENvbnRyb2wobGltaXRzVGFiUGFuZSk7Ci0JCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTGltaXRzVGFiLnRpdGxlIikpOwotCQlsaW1pdHNUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCQlsbFdhbGxDbG9ja0xpbWl0SGFyZCA9IGNyZWF0ZVRleHRXaWRnZXQobGltaXRzVGFiUGFuZSwgcm0sCi0JCQkJTExfUFRQX1dBTExDTE9DS19IQVJEKTsKLQkJbGxXYWxsQ2xvY2tMaW1pdFNvZnQgPSBjcmVhdGVUZXh0V2lkZ2V0KGxpbWl0c1RhYlBhbmUsIHJtLAotCQkJCUxMX1BUUF9XQUxMQ0xPQ0tfU09GVCk7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmNyZWF0ZUxpbWl0c1RhYiByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcGFuZSBjb250YWluaW5nIHRoZSBzdWJtaXQgbW9kZSByYWRpbyBib3gKLQkgKgotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTW9kZUJveChJUmVzb3VyY2VNYW5hZ2VyIHJtKSB7Ci0JCUdyaWREYXRhIGdkOwotCQlHcmlkTGF5b3V0IGxheW91dDsKLQkJQ29tcG9zaXRlIHBhbmU7Ci0KLQkJcGFuZSA9IG5ldyBDb21wb3NpdGUobWFpblBhbmVsLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gODsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDQ7Ci0JCXBhbmUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlwYW5lLnNldExheW91dERhdGEoZ2QpOwotCi0JCWxsU3VibWl0TW9kZSA9IGNyZWF0ZUJvb2xlYW5PcHRpb24ocGFuZSwgcm0sIExMX1BUUF9TVUJNSVRfTU9ERSk7Ci0JCWlmIChsbFN1Ym1pdE1vZGUgIT0gbnVsbCkgewotCQkJbGxTdWJtaXRNb2RlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JCQlsbEpvYkNvbW1hbmRGaWxlID0gY3JlYXRlRmlsZVNlbGVjdG9yKHBhbmUsIHJtLAotCQkJCQlMTF9QVFBfSk9CX0NPTU1BTkRfRklMRSwgTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfU0VMRUNUT1IpOwotCQkJbGxKb2JDb21tYW5kRmlsZVRlbXBsYXRlID0gY3JlYXRlRmlsZVNlbGVjdG9yKHBhbmUsIHJtLAotCQkJCQlMTF9QVFBfSk9CX0NPTU1BTkRfRklMRV9URU1QTEFURSwKLQkJCQkJTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfVEVNUExBVEVfU0VMRUNUT1IpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVNb2RlQm94IHJldHVybmluZy4iKTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYWxsIG9mIHRoZSBHVUkgZWxlbWVudHMgb2YgdGhlIHJlc291cmNlLW1hbmFnZXIKLQkgKiBzcGVjaWZpYyBwYW5lIHdpdGhpbiB0aGUgcGFyYWxsZWwgdGFiIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGlzIGNvbnRyb2wncyBwYXJlbnQKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHF1ZXVlCi0JICogICAgICAgICAgICBDdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpjcmVhdGVDb250cm9sIGVudGVyZWQuIik7Ci0JCUlCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCUlSZW1vdGVDb25uZWN0aW9uTWFuYWdlciBjb25uTWdyOwotCi0JCWNvbmZpZyA9IChJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pICgoQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIpIHJtKQotCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXJlbW90ZVNlcnZpY2UgPSBQVFBSZW1vdGVDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVTZXJ2aWNlcygKLQkJCQljb25maWcuZ2V0UmVtb3RlU2VydmljZXNJZCgpKTsKLQkJcmVtb3RlVUlTZXJ2aWNlID0gUFRQUmVtb3RlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVVJU2VydmljZXMocmVtb3RlU2VydmljZSk7Ci0JCWNvbm5NZ3IgPSByZW1vdGVTZXJ2aWNlLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0JCXJlbW90ZUNvbm5lY3Rpb24gPSBjb25uTWdyLmdldENvbm5lY3Rpb24oY29uZmlnLmdldENvbm5lY3Rpb25OYW1lKCkpOwotCQlwYXJlbnRTaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCQljbGVhckFsbFdpZGdldHMoKTsKLQkJYWN0aXZlV2lkZ2V0cyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOwotCQlldmVudE1vbml0b3IgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0JCW1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY3JlYXRlTW9kZUJveChybSk7Ci0JCXRhYmJlZFBhbmUgPSBuZXcgVGFiRm9sZGVyKG1haW5QYW5lbCwgU1dULlRPUCk7Ci0JCWNyZWF0ZUdlbmVyYWxUYWIocm0pOwotCQljcmVhdGVTY2hlZHVsaW5nQmFzaWNUYWIocm0pOwotCQljcmVhdGVTY2hlZHVsaW5nUmVxdWlyZW1lbnRzVGFiKHJtKTsKLQkJY3JlYXRlU2NoZWR1bGluZ1Jlc291cmNlc1RhYihybSk7Ci0JCWNyZWF0ZVJ1bnRpbWVUYWIocm0pOwotCQljcmVhdGVOb2Rlc05ldHdvcmtUYWIocm0pOwotCQljcmVhdGVMaW1pdHNUYWIocm0pOwotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Y3JlYXRlQ29udHJvbCByZXR1cm5pbmcuIik7Ci0JCWN1cnJlbnRSTSA9IHJtOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHNldCBvZiBsYXVuY2ggYXR0cmlidXRlcyBpZiBub3Qgc2FtZSBhcyBkZWZhdWx0Ci0JICogc2VudCBmcm9tIHByb3h5Ci0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBsYXVuY2gKLQkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRycwotCSAqICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBsYXVuY2ggYXR0cmlidXRlcwotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZCB0byBsYXVuY2ggYXR0cmlidXRlcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGUoSVJlc291cmNlTWFuYWdlciBybSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVmVjdG9yPFN0cmluZ0F0dHJpYnV0ZT4gYXR0cnMsIFN0cmluZyBhdHRyTmFtZSkgewotCQlTdHJpbmcgYXR0clZhbHVlOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlOwotCQlTdHJpbmdBdHRyaWJ1dGUgYXR0cjsKLQkJU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyRGVmOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjphZGRBdHRyaWJ1dGUgZW50ZXJlZC4iKTsKLQkJaWYgKHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0ck5hbWUpICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYXR0clZhbHVlID0gY29uZmlnLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIiIpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJYXR0clZhbHVlID0gIiI7Ci0JCQl9Ci0KLQkJCWRlZmF1bHRWYWx1ZSA9IGdldEF0dHJEZWZhdWx0VmFsdWUocm0sIGF0dHJOYW1lKTsKLQotCQkJaWYgKChhdHRyVmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJJiYgKCghYXR0clZhbHVlLmVxdWFscyhkZWZhdWx0VmFsdWUpKQotCQkJCQkJCXx8IChhdHRyTmFtZS5lcXVhbHMoIkxMX1BUUF9KT0JfVFlQRSIpKQotCQkJCQkJCXx8IChhdHRyTmFtZQotCQkJCQkJCQkJLmVxdWFscygiTExfUFRQX0pPQl9DT01NQU5EX0ZJTEVfVEVNUExBVEUiKSkKLQkJCQkJCQl8fCAoYXR0ck5hbWUuZXF1YWxzKCJMTF9QVFBfU1VCTUlUX01PREUiKSkKLQkJCQkJCQl8fCAoYXR0ck5hbWUuZXF1YWxzKCJMTF9QVFBfQ0xBU1MiKSkKLQkJCQkJCQl8fCAoYXR0ck5hbWUuZXF1YWxzKCJMTF9QVFBfSU5QVVQiKSkKLQkJCQkJCQl8fCAoYXR0ck5hbWUuZXF1YWxzKCJMTF9QVFBfT1VUUFVUIikpCi0JCQkJCQkJfHwgKGF0dHJOYW1lLmVxdWFscygiTExfUFRQX0VSUk9SIikpCi0JCQkJCQkJfHwgKGF0dHJOYW1lLmVxdWFscygiTExfUFRQX0VOVklST05NRU5UIikpCi0JCQkJCQkJfHwgKGF0dHJOYW1lLmVxdWFscygiTExfUFRQX0pPQl9UWVBFIikpIHx8IChhdHRyTmFtZQotCQkJCQkJCS5lcXVhbHMoIkxMX1BUUF9KT0JfQ09NTUFORF9GSUxFIikpKSkgewotCQkJCWF0dHJEZWYgPSBuZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihhdHRyTmFtZSwgIiIsICIiLAotCQkJCQkJZmFsc2UsICIiKTsKLQkJCQlhdHRyID0gbmV3IFN0cmluZ0F0dHJpYnV0ZShhdHRyRGVmLCBhdHRyVmFsdWUpOwotCQkJCWF0dHJzLmFkZChhdHRyKTsKLQkJCX0KLQotCQl9Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmFkZEF0dHJpYnV0ZSByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZXQgb2YgYXR0cmlidXRlcyB0byBiZSB1c2VkIGFzIGxhdW5jaCBhdHRyaWJ1dGVzCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBsYXVuY2gKLQkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcXVldWUKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHF1ZXVlIChub3QgdXNlZCBmb3IgTEwgc2luY2UgdGhlcmUgaXMgb25seSBhCi0JICogICAgICAgICAgICBzaW5nbGUgcXVldWUpCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIElBdHRyaWJ1dGU8U3RyaW5nLCBTdHJpbmdBdHRyaWJ1dGUsIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24+W10gZ2V0QXR0cmlidXRlcygKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUsCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWZWN0b3I8U3RyaW5nQXR0cmlidXRlPiBhdHRyczsKLQkJU3RyaW5nQXR0cmlidXRlIGF0dHJBcnJheVtdOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpnZXRBdHRyaWJ1dGVzIGVudGVyZWQuIik7Ci0JCWF0dHJzID0gbmV3IFZlY3RvcjxTdHJpbmdBdHRyaWJ1dGU+KCk7Ci0JCWF0dHJBcnJheSA9IG5ldyBTdHJpbmdBdHRyaWJ1dGVbMF07Ci0KLQkJTWFwPFN0cmluZywgU3RyaW5nQXR0cmlidXRlPiBhbGxBdHRyczsKLQkJU2V0PFN0cmluZz4gYXR0ck5hbWVzOwotCQlJdGVyYXRvcjxTdHJpbmc+IGk7Ci0JCVN0cmluZyBuYW1lOwotCi0JCWFsbEF0dHJzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWF0dHJOYW1lcyA9IGFsbEF0dHJzLmtleVNldCgpOwotCQlpID0gYXR0ck5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbmFtZSA9IGkubmV4dCgpOwotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiTExfUFRQXyIpKSB7Ci0JCQkJYWRkQXR0cmlidXRlKHJtLCBjb25maWd1cmF0aW9uLCBhdHRycywgbmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldEF0dHJpYnV0ZXMgcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gYXR0cnMudG9BcnJheShhdHRyQXJyYXkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjZ2V0Q29udHJvbCgpCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldENvbnRyb2wgZW50ZXJlZC4iKTsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldENvbnRyb2wgcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYW4gYXR0cmlidXRlIGZyb20gdGhlIHJlc291cmNlIG1hbmFnZXIsIGdpdmluZwotCSAqIHByZWZlcmVuY2UgdG8gYSB1c2VyIG92ZXJyaWRlIG9mIHRoZSBkZWZhdWx0IHZhbHVlICh3aGljaCB0aGUgdXNlciBkb2VzCi0JICogYnkgc2V0dGluZyBvZiB0aGUgY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgc3RhcnRpbmcgdGhlCi0JICogcHJveHkuKSBUaGUgdXNlcidzIG92ZXJyaWRlIGlzIHBhc3NlZCB0byB0aGUgZnJvbnQgZW5kIGJ5IHRoZSBwcm94eSBhcyBhCi0JICogc3RyaW5nIGF0dHJpYnV0ZSB3aGVyZSB0aGUgbGVhZGluZyAnTVBfJyBvZiB0aGUgYXR0cmlidXRlIG5hbWUgaXMKLQkgKiByZXBsYWNlZCB3aXRoICdFTl8nCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaAotCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyTG9jYWxEZWZhdWx0VmFsdWUoSVJlc291cmNlTWFuYWdlciBybSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHJEZWY7Ci0JCVN0cmluZyBsb2NhbERlZmF1bHRFbnY7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldEF0dHJMb2NhbERlZmF1bHRWYWx1ZSBlbnRlcmVkLiIpOwotCQlsb2NhbERlZmF1bHRFbnYgPSBhdHRyTmFtZS5yZXBsYWNlRmlyc3QoIl5NUF8iLCAiRU5fIik7Ci0JCWF0dHJEZWYgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGxvY2FsRGVmYXVsdEVudik7Ci0JCWlmIChhdHRyRGVmICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCQkrICI6Z2V0QXR0ckxvY2FsRGVmYXVsdFZhbHVlIHJldHVybmluZy4iKTsKLQkJCQlyZXR1cm4gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWF0dHJEZWYgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJOYW1lKTsKLQkJaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCSsgIjpnZXRBdHRyTG9jYWxEZWZhdWx0VmFsdWUgcmV0dXJuaW5nLiIpOwotCQkJCXJldHVybiBhdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCQkrICI6Z2V0QXR0ckxvY2FsRGVmYXVsdFZhbHVlIHJldHVybmluZy4iKTsKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmdldEF0dHJMb2NhbERlZmF1bHRWYWx1ZSByZXR1cm5pbmcuIik7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0JICoKLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaAotCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyRGVmYXVsdFZhbHVlKElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBhdHRyTmFtZSkgewotCQlJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpnZXRBdHRyRGVmYXVsdFZhbHVlIGVudGVyZWQuIik7Ci0JCWF0dHJEZWYgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJOYW1lKTsKLQkJaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCSsgIjpnZXRBdHRyRGVmYXVsdFZhbHVlIHJldHVybmluZy4iKTsKLQkJCQlyZXR1cm4gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkJKyAiOmdldEF0dHJEZWZhdWx0VmFsdWUgcmV0dXJuaW5nLiIpOwotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Z2V0QXR0ckRlZmF1bHRWYWx1ZSByZXR1cm5pbmcuIik7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuIElmIHRoZSB2YWx1ZSBpcwotCSAqIHN0b3JlZCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIHRoYXQgdmFsdWUgaXMgdXNlZC4gT3RoZXJ3aXNlIHRoZQotCSAqIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyB1c2VkLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcm0KLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaAotCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBdHRySW5pdGlhbFZhbHVlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBhdHRyTmFtZSkgewotCQlTdHJpbmcgdmFsdWU7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IHJtQXR0ckRlZjsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Z2V0QXR0ckluaXRpYWxWYWx1ZSBlbnRlcmVkLiIpOwotCQl0cnkgewotCQkJdmFsdWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKGF0dHJOYW1lLCAiX25vX3ZhbHVlXyIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXZhbHVlID0gIl9ub192YWx1ZV8iOwotCQl9Ci0JCWlmICh2YWx1ZS5lcXVhbHMoIl9ub192YWx1ZV8iKSkgewotCQkJLy8gR2V0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZSwgd2hlcmUgdGhhdCBkZWZhdWx0IG1heSBiZSB0aGUKLQkJCS8vIHZhbHVlCi0JCQkvLyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgYXMgYW4gb3ZlcnJpZGUgdG8gdGhlIExMIGRlZmF1bHQgdmFsdWUuCi0JCQl2YWx1ZSA9IGdldEF0dHJMb2NhbERlZmF1bHRWYWx1ZShybSwgYXR0ck5hbWUpOwotCQl9Ci0JCS8vIElmIGFuIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIGFzIGFuIGludGVnZXIgYXR0cmlidXRlLCB0aGVuIGRldGVybWluZSBpZgotCQkvLyB0aGUgYXR0cmlidXRlIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgMUcsIDFNIG9yIDFLLCBhbmQgaWYgc28sIHRoZW4KLQkJLy8gY29udmVydCB0aGUKLQkJLy8gdmFsdWUgYWNjb3JkaW5nbHkuIFRoZSB0ZXN0cyBtdXN0IGJlIGRvbmUgbGFyZ2VzdCB0byBzbWFsbGVzdCBzbyB0aGF0Ci0JCS8vIHRoZSBsYXJnZXN0IGNvbnZlcnNpb24gZmFjdG9yIGlzIHVzZWQuIFRoZSBhdHRyaWJ1dGUgdmFsdWUgbWF5Ci0JCS8vIGFscmVhZHkgYmUKLQkJLy8gaW4gdGhlIGZvcm0gOTk5W2dHbU1rS10uIENvbnZlcnRpbmcgdGhhdCB0byBhIGxvbmcgd2lsbCByZXN1bHQgaW4gYQotCQkvLyBOdW1iZXJGb3JtYXRFeGNlcHRpb24sIHNvIGEgdHJ5L2NhdGNoIGJsb2NrIGlzIHJlcXVpcmVkLCB3aGVyZSB0aGUKLQkJLy8gc3RyaW5nCi0JCS8vIHZhbHVlIGlzIHJldHVybmVkIGluIHRoZWNhc2Ugb2YgYSBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkJcm1BdHRyRGVmID0gcm0uZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihhdHRyTmFtZSk7Ci0JCWlmIChybUF0dHJEZWYgaW5zdGFuY2VvZiBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbgotCQkJCXx8IHJtQXR0ckRlZiBpbnN0YW5jZW9mIEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKSB7Ci0JCQlsb25nIGludFZhbDsKLQotCQkJdHJ5IHsKLQkJCQlpbnRWYWwgPSBMb25nLnZhbHVlT2YodmFsdWUpOwotCQkJCWlmIChpbnRWYWwgIT0gMCkgewotCQkJCQlpZiAoKGludFZhbCAlIEdCWVRFKSA9PSAwKSB7Ci0JCQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIgotCQkJCQkJCQkrIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiOmdldEF0dHJJbml0aWFsVmFsdWUgcmV0dXJuaW5nLiIpOwotCQkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGludFZhbCAvIEdCWVRFKSArICJHIjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICgoaW50VmFsICUgTUJZVEUpID09IDApIHsKLQkJCQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIgotCQkJCQkJCQkJKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkrICI6Z2V0QXR0ckluaXRpYWxWYWx1ZSByZXR1cm5pbmcuIik7Ci0JCQkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGludFZhbCAvIE1CWVRFKSArICJNIjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKChpbnRWYWwgJSBLQllURSkgPT0gMCkgewotCQkJCQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIgotCQkJCQkJCQkJCSsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkJCQkJCSsgIjpnZXRBdHRySW5pdGlhbFZhbHVlIHJldHVybmluZy4iKTsKLQkJCQkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGludFZhbCAvIEtCWVRFKSArICJLIjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkJKyAiOmdldEF0dHJJbml0aWFsVmFsdWUgcmV0dXJuaW5nLiIpOwotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6Z2V0QXR0ckluaXRpYWxWYWx1ZSByZXR1cm5pbmcuIik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgY2hlY2tib3ggdG8gY2hlY2tlZCBzdGF0ZSBpZiBhdHRyaWJ1dGUgaGFzIHZhbHVlIGVxdWFsIHRvIGNoZWNrVmFsdWUKLQkgKiBvdGhlcndpc2Ugc2V0IGl0IHVuY2hlY2tlZAotCSAqCi0JICogQHBhcmFtIGNoZWNrYm94Ci0JICogICAgICAgICAgICBUaGUgY2hlY2tib3ggdG8gc2V0Ci0JICogQHBhcmFtIGF0dHJWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBjaGVjawotCSAqIEBwYXJhbSBjaGVja1ZhbHVlCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhIGNoZWNrZWQgY2hlY2tib3gKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWUoQ2hlY2tib3hSb3dXaWRnZXQgY2hlY2tib3gsIFN0cmluZyBhdHRyVmFsdWUsCi0JCQlTdHJpbmcgY2hlY2tWYWx1ZSkgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0VmFsdWUgZW50ZXJlZC4iKTsKLQkJaWYgKGNoZWNrYm94ICE9IG51bGwpIHsKLQkJCWlmIChhdHRyVmFsdWUuZXF1YWxzKGNoZWNrVmFsdWUpKSB7Ci0JCQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRWYWx1ZSByZXR1cm5pbmcuIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlKEJvb2xlYW5Sb3dXaWRnZXQgb3B0aW9uLCBTdHJpbmcgY2hlY2tWYWx1ZSkgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0VmFsdWUgZW50ZXJlZC4iKTsKLQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQlvcHRpb24uc2V0VmFsdWUoY2hlY2tWYWx1ZSk7Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldFZhbHVlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQgdmFsdWUgZm9yIGEgVGV4dCB3aWRnZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiB0aGUgd2lkZ2V0Ci0JICogaXMgbm90IG51bGwuCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0Ci0JICogICAgICAgICAgICBUaGUgd2lkZ2V0IHRvIHNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZShUZXh0Um93V2lkZ2V0IHdpZGdldCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRWYWx1ZSBlbnRlcmVkLiIpOwotCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJCXdpZGdldC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldFZhbHVlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQgdmFsdWUgZm9yIGEgRHVhbEZpZWxkIHdpZGdldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGlmIHRoZQotCSAqIHdpZGdldCBpcyBub3QgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXQKLQkgKiAgICAgICAgICAgIFRoZSB3aWRnZXQgdG8gc2V0Ci0JICogQHBhcmFtIHZhbHVlMQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGJlIHNldCBpbiBmaWVsZCAxCi0JICogQHBhcmFtIHZhbHVlMgotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGJlIHNldCBpbiBmaWVsZCAyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlKER1YWxGaWVsZFJvd1dpZGdldCB3aWRnZXQsIFN0cmluZyB2YWx1ZTEsCi0JCQlTdHJpbmcgdmFsdWUyKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRWYWx1ZSBlbnRlcmVkLiIpOwotCQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJCXdpZGdldC5zZXRWYWx1ZSh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldFZhbHVlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQgdmFsdWUgZm9yIGEgQ29tYm9Sb3dXaWRnZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiB0aGUKLQkgKiB3aWRnZXQgaXMgbm90IG51bGwuCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0Ci0JICogICAgICAgICAgICBUaGUgd2lkZ2V0IHRvIHNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZShDb21ib1Jvd1dpZGdldCB3aWRnZXQsIFN0cmluZyB2YWx1ZSkgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0VmFsdWUgZW50ZXJlZC4iKTsKLQkJaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0JCQl3aWRnZXQuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRWYWx1ZSByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBwYXRobmFtZSBmb3IgYSBmaWxlIHNlbGVjdG9yIGlmIHRoZSBmaWxlIHNlbGVjdG9yIGlzIG5vdCBudWxsCi0JICoKLQkgKiBAcGFyYW0gc2VsZWN0b3IKLQkgKiAgICAgICAgICAgIEZpbGUgc2VsZWN0b3IgdG8gYmUgdXBkYXRlZAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBQYXRobmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyBwYXRoKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRWYWx1ZSBlbnRlcmVkLiIpOwotCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJc2VsZWN0b3Iuc2V0UGF0aChwYXRoKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0VmFsdWUgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgYWxsIHdpZGdldHMKLQkgKgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF1bmNoCi0JICogICAgICAgICAgICBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxWYWx1ZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJSVJlc291cmNlTWFuYWdlciBybSkgewotCQlPYmplY3Qgd2lkZ2V0OwotCQlJdGVyYXRvcjxPYmplY3Q+IGk7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldEluaXRpYWxWYWx1ZXMgZW50ZXJlZC4iKTsKLQkJLy8gQWxsIFRleHQgYW5kIENvbWJvIHdpZGdldHMgaGF2ZSBNb2RpZnlMaXN0ZW5lcnMgcmVnaXN0ZXJlZCBvbiB0aGVtIGluCi0JCS8vIG9yZGVyIHRvIGludm9rZSBmaWVsZCB2YWxpZGF0aW9uCi0JCS8vIHdoZW4gY29udGVudHMgb2YgdGhlIHdpZGdldCdzIHRleHQgZmllbGQgY2hhbmdlLiBUaGUgTW9kaWZ5TGlzdGVuZXIKLQkJLy8gaXMgaW52b2tlZCBmb3IgZWFjaCB3aWRnZXQgYXMgYQotCQkvLyByZXN1bHQgb2YgY2FsbGluZyB0aGUgc2V0VGV4dCgpIG1ldGhvZCBmb3IgdGhlIHdpZGdldC4gVGhlIHJlc3VsdGluZwotCQkvLyBNb2RpZnlFdmVudCByZXN1bHRzIGluIGNhbGxpbmcKLQkJLy8gdmFsaWRhdGVBbGxGaWVsZHMoKSwgd2hpY2ggaW52b2tlc2ZpcmVDb250ZW50c0NoYW5nZWQoKSwgd2hpY2ggaW4KLQkJLy8gdHVybiByZXN1bHRzIGluIHBlcmZvcm1BcHBseSgpIGJlaW5nCi0JCS8vIGludm9rZWQuIFRoZSBwZXJmb3JtQXBwbHkoKSBtZXRob2Qgc2F2ZXMgYWxsIHdpZGdldCdzIHZhbHVlcyBpbnRvIHRoZQotCQkvLyBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uLgotCQkvLyBTaW5jZSBhdCB0aGUgdGltZSB0aGF0IHNldEluaXRpYWxWYWx1ZXMgaXMgY2FsbGVkLCB3aWRnZXRzIG1heSBiZQotCQkvLyBibGFuaywgdGhpcyByZXN1bHRzIGluIHN0b3JpbmcKLQkJLy8gYmxhbmtzIGZvciBhbGwgYXR0cmlidXRlcyBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIHdpcGluZyBvdXQgdGhlCi0JCS8vIHNhdmVkIHZhbHVlcyBpbiB0aGUgbGF1bmNoCi0JCS8vIGNvbmZpZ3VyYXRpb24uCi0JCS8vIFRvIGF2b2lkIHRoaXMsIGlnbm9yZU1vZGlmeUV2ZW50cyBpcyBzZXQsIHNvIHRoYXQgdGhlIE1vZGlmeUxpc3RlbmVyCi0JCS8vIGRvZXMgbm90aGluZy4KLQkJaWdub3JlTW9kaWZ5RXZlbnRzID0gdHJ1ZTsKLQkJaSA9IGFjdGl2ZVdpZGdldHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQl3aWRnZXQgPSBpLm5leHQoKTsKLQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHsKLQkJCQlzZXRWYWx1ZSgoRmlsZVNlbGVjdG9yUm93V2lkZ2V0KSB3aWRnZXQsIGdldEF0dHJJbml0aWFsVmFsdWUoCi0JCQkJCQljb25maWcsIHJtLCAoU3RyaW5nKSAoKEZpbGVTZWxlY3RvclJvd1dpZGdldCkgd2lkZ2V0KQotCQkJCQkJCQkuZ2V0RGF0YSgpKSk7Ci0JCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIER1YWxGaWVsZFJvd1dpZGdldCkgewotCQkJCXNldFZhbHVlKChEdWFsRmllbGRSb3dXaWRnZXQpIHdpZGdldCwgZ2V0QXR0ckluaXRpYWxWYWx1ZSgKLQkJCQkJCWNvbmZpZywgcm0sIChTdHJpbmcpICgoRHVhbEZpZWxkUm93V2lkZ2V0KSB3aWRnZXQpCi0JCQkJCQkJCS5nZXREYXRhMSgpKSwgZ2V0QXR0ckluaXRpYWxWYWx1ZShjb25maWcsIHJtLAotCQkJCQkJKFN0cmluZykgKChEdWFsRmllbGRSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YTIoKSkpOwotCQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUZXh0Um93V2lkZ2V0KSB7Ci0JCQkJc2V0VmFsdWUoKFRleHRSb3dXaWRnZXQpIHdpZGdldCwgZ2V0QXR0ckluaXRpYWxWYWx1ZShjb25maWcsCi0JCQkJCQlybSwgKChUZXh0Um93V2lkZ2V0KSB3aWRnZXQpCi0JCQkJCQkJCS5nZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FKSkpOwotCQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21ib1Jvd1dpZGdldCkgewotCQkJCXNldFZhbHVlKChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0LCBnZXRBdHRySW5pdGlhbFZhbHVlKGNvbmZpZywKLQkJCQkJCXJtLCAoKENvbWJvUm93V2lkZ2V0KSB3aWRnZXQpCi0JCQkJCQkJCS5nZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FKSkpOwotCQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBCb29sZWFuUm93V2lkZ2V0KSB7Ci0JCQkJc2V0VmFsdWUoKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCwgZ2V0QXR0ckluaXRpYWxWYWx1ZShjb25maWcsCi0JCQkJCQlybSwgKChCb29sZWFuUm93V2lkZ2V0KSB3aWRnZXQpLmdldERhdGEoKSkpOwotCQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDaGVja2JveFJvd1dpZGdldCkgewotCQkJCXNldFZhbHVlKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0LCBnZXRBdHRySW5pdGlhbFZhbHVlKAotCQkJCQkJY29uZmlnLCBybSwgKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KQotCQkJCQkJCQkuZ2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkFUVFJfTkFNRSkpLCAieWVzIik7Ci0JCQl9Ci0KLQkJfQotCQlzZXRMYXVuY2hQYW5lbE1vZGUoKTsKLQkJLy8gU2V0dXAgY29tcGxldGUsIHJlLWVuYWJsZSBNb2RpZnlMaXN0ZW5lcgotCQlpZ25vcmVNb2RpZnlFdmVudHMgPSBmYWxzZTsKLQkJbWFya0FsbEZpZWxkc0NoYW5nZWQoKTsKLQkJLy8gQWxsIGZpZWxkcyBuZWVkIHRvIGJlIHZhbGlkYXRlZCBiZWNhdXNlIGEgZGlmZmVyZW50IHJlc291cmNlIG1hbmFnZXIKLQkJLy8gbWF5IGhhdmUgYmVlbiBzZWxlY3RlZCwgYW5kIHRoZXJlZm9yZQotCQkvLyB2YWx1ZXMgc2F2ZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLCBzdWNoIGFzIHBhdGhuYW1lcyBtYXkgbm8KLQkJLy8gbG9uZ2VyIGJlIHZhbGlkLgotCQl2YWxpZGF0ZUFsbEZpZWxkcygpOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRJbml0aWFsVmFsdWVzIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc3RhdGUgZm9yIHdpZGdldHMgYmFzZWQgb24gZGVwZW5kZW5jaWVzIGJldHdlZW4gd2lkZ2V0IHZhbHVlcy4gQXQgdGhlCi0JICogcG9pbnQgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBhbGwgd2lkZ2V0cyBhcmUgaW4gZW5hYmxlZCBzdGF0ZSwgc28gaXQgaXMKLQkgKiBvbmx5IG5lY2Vzc2FyeSB0byBkaXNhYmxlIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxXaWRnZXRTdGF0ZSgpIHsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldEluaXRpYWxXaWRnZXRTdGF0ZSBlbnRlcmVkLiIpOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRJbml0aWFsV2lkZ2V0U3RhdGUgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBpbml0aWFsaXplRnJvbShDb250cm9sIGNvbnRyb2wsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6aW5pdGlhbGl6ZUZyb20gZW50ZXJlZC4iKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gaW5zdGFuY2VvZiBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KSB7Ci0JCQljdXJyZW50TGF1bmNoQ29uZmlnID0gKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpIGNvbmZpZ3VyYXRpb247Ci0JCX0KLQkJc2V0SW5pdGlhbFZhbHVlcyhjb25maWd1cmF0aW9uLCBybSk7Ci0JCXNldEluaXRpYWxXaWRnZXRTdGF0ZSgpOwotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6aW5pdGlhbGl6ZUZyb20gcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSkKLQkgKi8KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmlzVmFsaWQgZW50ZXJlZC4iKTsKLQkJaWYgKGFsbEZpZWxkc1ZhbGlkKSB7Ci0JCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiOmlzVmFsaWQgcmV0dXJuaW5nLiIpOwotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOmlzVmFsaWQgcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSBhIFRleHQgd2lkZ2V0IGludG8gdGhlIHNwZWNpZmllZCBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZSB3aWRnZXQgaXMgbm90IG51bGwKLQkgKgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBybQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIGxhdW5jaAotCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIFRoZSB3aWRnZXQgdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbmZpZ0F0dHIoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgYXR0ciwgVGV4dFJvd1dpZGdldCBjb250cm9sKSB7Ci0JCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHJEZWY7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldENvbmZpZ0F0dHIgZW50ZXJlZC4iKTsKLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJU3RyaW5nIGF0dHJWYWx1ZTsKLQotCQkJYXR0ckRlZiA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0cik7Ci0JCQl0cnkgewotCQkJCWlmICgoYXR0ckRlZiBpbnN0YW5jZW9mIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKQotCQkJCQkJfHwgKGF0dHJEZWYgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbikpIHsKLQkJCQkJYXR0clZhbHVlID0gZ2V0SW50ZWdlclZhbHVlKGNvbnRyb2wuZ2V0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXR0clZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCQkJCX0KLQkJCQljb25maWcuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIHRoZSBmaWVsZCBoYXMgYW4gaW52YWxpZCBudW1lcmljIHZhbHVlLCB0aGVuIGRvbid0IHNhdmUgaXQKLQkJCQkvLyBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0Q29uZmlnQXR0ciByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogU3RvcmUgdGhlIHZhbHVlIGZyb20gYSBEaWFsRmllbGQgd2lkZ2V0IGludG8gdGhlIHNwZWNpZmllZCBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZSB3aWRnZXQgaXMgbm90IG51bGwKLQkgKgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIFRoZSB3aWRnZXQgdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbmZpZ0F0dHIoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsCi0JCQlTdHJpbmcgYXR0cjEsIFN0cmluZyBhdHRyMiwgRHVhbEZpZWxkUm93V2lkZ2V0IGNvbnRyb2wpIHsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldENvbmZpZ0F0dHIgZW50ZXJlZC4iKTsKLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlW107Ci0KLQkJCXZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCQkJY29uZmlnLnNldEF0dHJpYnV0ZShhdHRyMSwgdmFsdWVbMF0udHJpbSgpKTsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0cjIsIHZhbHVlWzFdLnRyaW0oKSk7Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNldENvbmZpZ0F0dHIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIGEgQ29tYm9Sb3dXaWRnZXQgaW50byB0aGUgc3BlY2lmaWVkIGxhdW5jaAotCSAqIGNvbmZpZ3VyYXRpb24gaWYgdGhlIHdpZGdldCBpcyBub3QgbnVsbAotCSAqCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgVGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgVGhlIHdpZGdldCB0byBvYnRhaW4gdGhlIHZhbHVlIGZyb20KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q29uZmlnQXR0cihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZywKLQkJCVN0cmluZyBhdHRyLCBDb21ib1Jvd1dpZGdldCBjb250cm9sKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRDb25maWdBdHRyIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgY29udHJvbC5nZXRWYWx1ZSgpKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0Q29uZmlnQXR0ciByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogU3RvcmUgdGhlIHZhbHVlIGZyb20gYSBmaWxlIHNlbGVjdG9yIGludG8gdGhlIHNwZWNpZmllZCBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZSBmaWxlIHNlbGVjdG9yIGlzIG5vdCBudWxsCi0JICoKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBUaGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICBUaGUgd2lkZ2V0IHRvIG9idGFpbiB0aGUgdmFsdWUgZnJvbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb25maWdBdHRyKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLAotCQkJU3RyaW5nIGF0dHIsIEZpbGVTZWxlY3RvclJvd1dpZGdldCBjb250cm9sKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRDb25maWdBdHRyIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgY29udHJvbC5nZXRWYWx1ZSgpKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0Q29uZmlnQXR0ciByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogU3RvcmUgdGhlIHZhbHVlIGZyb20gYSBCdXR0b24gd2lkZ2V0IGludG8gdGhlIHNwZWNpZmllZCBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZSB3aWRnZXQgaXMgbm90IG51bGwKLQkgKgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIFRoZSB3aWRnZXQgdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tCi0JICogQHBhcmFtIHRydWVWYWwKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgaWYgdGhlIGJ1dHRvbiBpcyBzZWxlY3RlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb25maWdBdHRyKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLAotCQkJU3RyaW5nIGF0dHIsIENoZWNrYm94Um93V2lkZ2V0IGNvbnRyb2wsIFN0cmluZyB0cnVlVmFsLAotCQkJU3RyaW5nIGZhbHNlVmFsKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRDb25maWdBdHRyIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgKGNvbnRyb2wuZ2V0U2VsZWN0aW9uKCkgPyB0cnVlVmFsCi0JCQkJCTogZmFsc2VWYWwpKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0Q29uZmlnQXR0ciByZXR1cm5pbmcuIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbmZpZ0F0dHIoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsCi0JCQlTdHJpbmcgYXR0ciwgQm9vbGVhblJvd1dpZGdldCBjb250cm9sKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXRDb25maWdBdHRyIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgY29udHJvbC5nZXRWYWx1ZSgpKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0Q29uZmlnQXR0ciByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgdmFsdWVzIGVudGVyZWQgaW4gdGhpcyBwYW5lbCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKgotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb25EYXRhKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLAotCQkJSVJlc291cmNlTWFuYWdlciBybSkgewotCQlPYmplY3Qgd2lkZ2V0OwotCQlJdGVyYXRvcjxPYmplY3Q+IGk7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnNhdmVDb25maWd1cmF0aW9uRGF0YSBlbnRlcmVkLiIpOwotCQlpID0gYWN0aXZlV2lkZ2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCXdpZGdldCA9IGkubmV4dCgpOwotCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRleHRSb3dXaWRnZXQpIHsKLQkJCQlzZXRDb25maWdBdHRyKGNvbmZpZywgcm0sICgoVGV4dFJvd1dpZGdldCkgd2lkZ2V0KQotCQkJCQkJLmdldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5BVFRSX05BTUUpLAotCQkJCQkJKFRleHRSb3dXaWRnZXQpIHdpZGdldCk7Ci0JCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbWJvUm93V2lkZ2V0KSB7Ci0JCQkJc2V0Q29uZmlnQXR0cihjb25maWcsIChTdHJpbmcpICgoQ29tYm9Sb3dXaWRnZXQpIHdpZGdldCkKLQkJCQkJCS5nZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FKSwKLQkJCQkJCShDb21ib1Jvd1dpZGdldCkgd2lkZ2V0KTsKLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ2hlY2tib3hSb3dXaWRnZXQpIHsKLQkJCQlzZXRDb25maWdBdHRyKGNvbmZpZywgKFN0cmluZykgKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KQotCQkJCQkJLmdldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5BVFRSX05BTUUpLAotCQkJCQkJKENoZWNrYm94Um93V2lkZ2V0KSB3aWRnZXQsICJ5ZXMiLCAibm8iKTsKLQkJCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQm9vbGVhblJvd1dpZGdldCkgewotCQkJCXNldENvbmZpZ0F0dHIoY29uZmlnLCAoU3RyaW5nKSAoKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCkKLQkJCQkJCS5nZXREYXRhKCksIChCb29sZWFuUm93V2lkZ2V0KSB3aWRnZXQpOwotCQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHsKLQkJCQlzZXRDb25maWdBdHRyKGNvbmZpZywgKFN0cmluZykgKChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCkKLQkJCQkJCS5nZXREYXRhKCksIChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCk7Ci0JCQl9IGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIER1YWxGaWVsZFJvd1dpZGdldCkgewotCQkJCXNldENvbmZpZ0F0dHIoY29uZmlnLCAoU3RyaW5nKSAoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KQotCQkJCQkJLmdldERhdGExKCksIChTdHJpbmcpICgoRHVhbEZpZWxkUm93V2lkZ2V0KSB3aWRnZXQpCi0JCQkJCQkuZ2V0RGF0YTIoKSwgKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KTsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2F2ZUNvbmZpZ3VyYXRpb25EYXRhIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI3BlcmZvcm1BcHBseShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHksCi0JICogICAgICBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpCi0JICovCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBwZXJmb3JtQXBwbHkoCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpwZXJmb3JtQXBwbHkgZW50ZXJlZC4iKTsKLQkJY3VycmVudExhdW5jaENvbmZpZyA9IGNvbmZpZ3VyYXRpb247Ci0JCXNhdmVDb25maWd1cmF0aW9uRGF0YShjb25maWd1cmF0aW9uLCBybSk7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpwZXJmb3JtQXBwbHkgcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCAiIik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNzZXREZWZhdWx0cyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHksCi0JICogICAgICBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpCi0JICovCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBzZXREZWZhdWx0cygKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSkgewotCQlJQXR0cmlidXRlPD8sID8sID8+IHJtQXR0cnNbXTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6c2V0RGVmYXVsdHMgZW50ZXJlZC4iKTsKLQkJY3VycmVudExhdW5jaENvbmZpZyA9IGNvbmZpZzsKLQkJcm1BdHRycyA9IHJtLmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBybUF0dHJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUocm1BdHRyc1tpXS5nZXREZWZpbml0aW9uKCkuZ2V0SWQoKSwKLQkJCQkJCXJtQXR0cnNbaV0uZ2V0RGVmaW5pdGlvbigpLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCS8vIHNldERlZmF1bHRWYWx1ZXMoY29uZmlnLCBybSk7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpzZXREZWZhdWx0cyByZXR1cm5pbmcuIik7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB2YWxpZGF0aW9uIG9mIGFsbCBmaWVsZHMgaW4gdGhlIHRhYmJlZCBwYW5lIG9mIHRoZSBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uJ3MgcGFyYWxsZWwgdGFiLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWxsRmllbGRzKCkgewotCQkvLyBUaGlzIG1ldGhvZCBpcyB0aGUgdG9wIGxldmVsIGRyaXZlciBmb3IgdmFsaWRhdGluZyB0aGUgZmllbGRzIGluIHRoZQotCQkvLyB0YWJiZWQgcGFuZS4gSXQgaXMgY2FsbGVkIHdoZW4gYSBmaWVsZCBpbiB0aGUgdGFiYmVkIHBhbmUgaXMKLQkJLy8gbW9kaWZpZWQsIHZpYSBhIE1vZGlmeUxpc3RlbmVyIHJlZ2lzdGVyZWQgb24KLQkJLy8gZWFjaCB0ZXh0IG9yIGVkaXRhYmxlIGNvbWJvYm94IHdpZGdldCBJdCBjYWxscyBhIHZhbGlkYXRpb24gbWV0aG9kCi0JCS8vIGZvciBlYWNoIHRhYiBpbiB0aGUgcGFuZS4gVmFsaWRhdGlvbgotCQkvLyBzaG91bGQgYmUgZG9uZSBpbiB0YWIgb3JkZXIsIGxlZnQgdG8gcmlnaHQsCi0JCS8vIEFsbCB2YWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIHNjb3BlIG9mIGEgdHJ5IGJsb2NrIHdoaWNoIGNhdGNoZXMgYW55Ci0JCS8vIFZhbGlkYXRpb25FeGNlcHRpb24gcHJvcGFnYXRlZCB1cAotCQkvLyBmcm9tIGxvd2VyIGxldmVsIG1ldGhvZHMuIFRoZSBpZGVhIGlzIHRvIHZhbGlkYXRlIHRoZSBmaWVsZHMgd2l0aGluCi0JCS8vIHRhYiBvcmRlciBsZWZ0IHRvIHJpZ2h0LCB0aGVuIHdpdGhpbiBlYWNoCi0JCS8vIHRhYiwgZnJvbSB0b3AgdG8gYm90dG9tLiBFYWNoIHZhbGlkYXRpb24gbWV0aG9kIHdpbGwgdGhyb3cgYQotCQkvLyBWYWxpZGF0aW9uRXhjZXB0aW9uIGlmIHRoYXQgZmllbGQgZmFpbHMKLQkJLy8gdmFsaWRhdGlvbiwgd2hlcmUgdGhlIHRocm93biBleGNlcHRpb24gd2lsbCBzdG9wIGZ1cnRoZXIgdmFsaWRhdGlvbgotCQkvLyBvZiB0aGUgcGFuZS4gVGhpcyBzdHJ1Y3R1cmUgYWxsb3dzIGZpZWxkcwotCQkvLyB0byBiZSBlYXNpbHkgbW92ZWQgdG8gYW5vdGhlciBwYW5lLCBvciB0byByZW9yZGVyIGZpZWxkcyB3aXRoaW4gYQotCQkvLyBwYW5lLiBVc2luZyBhbiBleGNlcHRpb24gdG8gdGVybWluYXRlCi0JCS8vIHZhbGlkYXRpb24gYWxzbyBhdm9pZHMgY2x1dHRlcmluZyB0aGUgbG9naWMgb2YgdGhlIHZhbGlkYXRpb24gbWV0aG9kCi0JCS8vIHdpdGggZGVlcGx5IG5lc3RlZCAnaWYgLi4uIGVsc2UgLi4uJwotCQkvLyBsb2dpYy4KLQkJLy8gSWYgYWxsIGZpZWxkcyBhcmUgdmFsaWQsIHRoZW4gdGhlIGFsbEZpZWxkc1ZhbGlkIGZsYWcgaXMgc2V0IHNvIHRoYXQKLQkJLy8gdGhlIGlzVmFsaWQoKSBhbmQgY2FuU2F2ZSgpIG1ldGhvZHMgY2FuCi0JCS8vIGVhc2lseSBjaGVjayBwYW5lbCB2YWxpZGl0eS4KLQkJLy8gVmFsaWRhdGlvbiBvZiB2YWxpZCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBmaWVsZHMgc2hvdWxkIGJlIHBlcmZvcm1lZAotCQkvLyBhcyBhIHNlY29uZCBzdGVwIGFmdGVyIGFsbCBmaWVsZHMgaGF2ZQotCQkvLyBiZWVuIGluZGl2aWR1YWxseSB2YWxpZGF0ZWQgZm9yIGNvcnJlY3QgdmFsdWVzLgotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVBbGxGaWVsZHMgZW50ZXJlZC4iKTsKLQkJdHJ5IHsKLQkJCWlmIChsbFN1Ym1pdE1vZGUuZ2V0VmFsdWUoKS5lcXVhbHMoIkFkdmFuY2VkIikpIHsKLQkJCQl2YWxpZGF0ZUlucHV0UGF0aChsbEpvYkNvbW1hbmRGaWxlLCAiSW52YWxpZC5sbEpvYkNvbW1hbmRGaWxlIik7Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRlSW5wdXRQYXRoKGxsSm9iQ29tbWFuZEZpbGVUZW1wbGF0ZSwKLQkJCQkJCSJJbnZhbGlkLmxsSm9iQ29tbWFuZEZpbGVUZW1wbGF0ZSIpOwotCQkJCXZhbGlkYXRlR2VuZXJhbFRhYigpOwotCQkJCXZhbGlkYXRlU2NoZWR1bGluZ0Jhc2ljVGFiKCk7Ci0JCQkJdmFsaWRhdGVTY2hlZHVsaW5nUmVxdWlyZW1lbnRzVGFiKCk7Ci0JCQkJdmFsaWRhdGVTY2hlZHVsaW5nUmVzb3VyY2VzVGFiKCk7Ci0JCQkJdmFsaWRhdGVSdW50aW1lVGFiKCk7Ci0JCQkJdmFsaWRhdGVOb2Rlc05ldHdvcmtUYWIoKTsKLQkJCQl2YWxpZGF0ZUxpbWl0c1RhYigpOwotCQkJfQotCQkJYWxsRmllbGRzVmFsaWQgPSB0cnVlOwotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yTWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJYWxsRmllbGRzVmFsaWQgPSBmYWxzZTsKLQkJfQotCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZUFsbEZpZWxkcyByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgZmllbGRzIGluIHRhc2sgc3BlY2lmaWNhdGlvbiB0YWIKLQkgKgotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUdlbmVyYWxUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZUdlbmVyYWxUYWIgZW50ZXJlZC4iKTsKLQkJdmFsaWRhdGVBbHBoYU51bWVyaWMobGxKb2JOYW1lLCAiSW52YWxpZC5sbEpvYk5hbWUiKTsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlR2VuZXJhbFRhYiByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgYWxsIHRleHQgYW5kIGVkaXRhYmxlIGNvbWJvYm94IGZpZWxkcyBpbiB0aGUgSS9PIHRhYiwgdG9wIHRvCi0JICogYm90dG9tCi0JICoKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTY2hlZHVsaW5nQmFzaWNUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVNjaGVkdWxpbmdCYXNpY1RhYiBlbnRlcmVkLiIpOwotCQl2YWxpZGF0ZUFscGhhTnVtZXJpYyhsbENsYXNzLCAiSW52YWxpZC5sbENsYXNzIik7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVNjaGVkdWxpbmdCYXNpY1RhYiByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgYWxsIHRleHQgYW5kIGVkaXRhYmxlIGNvbWJvYm94IGZpZWxkcyBpbiBkaWFnbm9zdGljIHRhYiwgdG9wIHRvCi0JICogYm90dG9tCi0JICoKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTY2hlZHVsaW5nUmVxdWlyZW1lbnRzVGFiKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVTY2hlZHVsaW5nUmVxdWlyZW1lbnRzVGFiIGVudGVyZWQuIik7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVNjaGVkdWxpbmdSZXF1aXJlbWVudHNUYWIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gdGhlIGRlYnVnIHRhYiwgdG9wIHRvCi0JICogYm90dG9tCi0JICoKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTY2hlZHVsaW5nUmVzb3VyY2VzVGFiKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVTY2hlZHVsaW5nUmVzb3VyY2VzVGFiIGVudGVyZWQuIik7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVNjaGVkdWxpbmdSZXNvdXJjZXNUYWIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gdGhlIHN5c3RlbSByZXNvdXJjZXMKLQkgKiB0YWIsIHRvcCB0byBib3R0b20KLQkgKgotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJ1bnRpbWVUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVJ1bnRpbWVUYWIgZW50ZXJlZC4iKTsKLS8vbm8gY2hlY2tzIHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZSBmb2xsb3dpbmcgd2lkZ2V0cyBhdCB0aGlzIHRpbWUKLS8vCQlsbEVycm9yID0gY3JlYXRlVGV4dFdpZGdldChydW50aW1lVGFiUGFuZSwgcm0sIExMX1BUUF9FUlJPUik7Ci0vLwkJbGxPdXRwdXQgPSBjcmVhdGVUZXh0V2lkZ2V0KHJ1bnRpbWVUYWJQYW5lLCBybSwgTExfUFRQX09VVFBVVCk7Ci0vLwkJbGxJbnB1dCA9IGNyZWF0ZVRleHRXaWRnZXQocnVudGltZVRhYlBhbmUsIHJtLCBMTF9QVFBfSU5QVVQpOwotLy8JCWxsRXhlY3V0YWJsZSA9IGNyZWF0ZVRleHRXaWRnZXQocnVudGltZVRhYlBhbmUsIHJtLCBMTF9QVFBfRVhFQ1VUQUJMRSk7Ci0vLwkJbGxJbml0aWFsRGlyID0gY3JlYXRlVGV4dFdpZGdldChydW50aW1lVGFiUGFuZSwgcm0sIExMX1BUUF9JTklUSUFMRElSKTsKLS8vCQlsbEVudmlyb25tZW50ID0gY3JlYXRlVGV4dFdpZGdldChydW50aW1lVGFiUGFuZSwgcm0sIExMX1BUUF9FTlZJUk9OTUVOVCk7Ci0vLwkJbGxTaGVsbCA9IGNyZWF0ZVRleHRXaWRnZXQocnVudGltZVRhYlBhbmUsIHJtLCBMTF9QVFBfU0hFTEwpOwotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVSdW50aW1lVGFiIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBhbGwgdGV4dCBhbmQgZWRpdGFibGUgY29tYm9ib3ggZmllbGRzIGluIHRoZSBub2RlIGFsbG9jYXRpb24KLQkgKiB0YWIsIHRvcCB0byBib3R0b20KLQkgKgotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5vZGVzTmV0d29ya1RhYigpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgdHBuID0gIiI7Ci0JCVN0cmluZyB0cG5fZGVmYXVsdCA9ICIiOwotCQlTdHJpbmcgdHQgPSAiIjsKLQkJU3RyaW5nIHR0X2RlZmF1bHQgPSAiIjsKLQkJU3RyaW5nIGp0ID0gIiI7Ci0JCVN0cmluZyBqdF9kZWZhdWx0ID0gIiI7Ci0JCVN0cmluZyBubSA9ICIiOwotCQlTdHJpbmcgbm1fZGVmYXVsdCA9ICIiOwotCQlTdHJpbmcgbm14ID0gIiI7Ci0JCVN0cmluZyBubXhfZGVmYXVsdCA9ICIiOwotCQlTdHJpbmcgYiA9ICIiOwotCQlTdHJpbmcgYl9kZWZhdWx0ID0gIiI7Ci0JCVN0cmluZyB0ZyA9ICIiOwotCQlTdHJpbmcgdGdfZGVmYXVsdCA9ICIiOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZU5vZGVzTmV0d29ya1RhYiBlbnRlcmVkLiIpOwotCQlpZiAobGxUYXNrR2VvbWV0cnkgIT0gbnVsbCkgewotCQkJdGcgPSBsbFRhc2tHZW9tZXRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKHRnLmxlbmd0aCgpID4gMCkgewotCQkJICB0Z19kZWZhdWx0ID0gbGxUYXNrR2VvbWV0cnkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGxUYXNrc1Blck5vZGUgIT0gbnVsbCkgewotCQkJdHBuID0gbGxUYXNrc1Blck5vZGUuZ2V0VmFsdWUoKTsKLQkJCWlmICh0cG4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkgIHRwbl9kZWZhdWx0ID0gbGxUYXNrc1Blck5vZGUuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGxUb3RhbFRhc2tzICE9IG51bGwpIHsKLQkJCXR0ID0gbGxUb3RhbFRhc2tzLmdldFZhbHVlKCk7Ci0JCQlpZiAodHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkgIHR0X2RlZmF1bHQgPSBsbFRvdGFsVGFza3MuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGxKb2JUeXBlICE9IG51bGwpIHsKLQkJCWp0ID0gbGxKb2JUeXBlLmdldFZhbHVlKCk7Ci0JCQlpZiAoanQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkgIGp0X2RlZmF1bHQgPSBsbEpvYlR5cGUuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGxOb2RlTWluICE9IG51bGwpIHsKLQkJCW5tID0gbGxOb2RlTWluLmdldFZhbHVlKCk7Ci0JCQlpZiAobm0ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkgIG5tX2RlZmF1bHQgPSBsbE5vZGVNaW4uZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGxOb2RlTWF4ICE9IG51bGwpIHsKLQkJCW5teCA9IGxsTm9kZU1heC5nZXRWYWx1ZSgpOwotCQkJaWYgKG5teC5sZW5ndGgoKSA+IDApIHsKLQkJCSAgbm14X2RlZmF1bHQgPSBsbE5vZGVNYXguZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGxCbG9ja2luZyAhPSBudWxsKSB7Ci0JCQliID0gbGxCbG9ja2luZy5nZXRWYWx1ZSgpOwotCQkJaWYgKGIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkgIGJfZGVmYXVsdCA9IGxsQmxvY2tpbmcuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKHRwbi5lcXVhbHModHBuX2RlZmF1bHQpID09IGZhbHNlKSAmJgotCQkgICAodHQuZXF1YWxzKHR0X2RlZmF1bHQpID09IGZhbHNlKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnZhbGlkLmxsVGFza3NQZXJOb2RlX2xsVG90YWxUYXNrcyIpKTsKLQkJfQotCi0JCWlmICgodGcuZXF1YWxzKHRnX2RlZmF1bHQpID09IGZhbHNlKSAmJgotCQkgICAgKGp0LmVxdWFsc0lnbm9yZUNhc2UoIlBhcmFsbGVsIikgPT0gZmFsc2UpKSB7Ci0JCSAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxKb2JUeXBlIikpOwotCQkgICAgfQotCi0JCWlmICgodGcuZXF1YWxzKHRnX2RlZmF1bHQpID09IGZhbHNlKSAmJgotCQkJCSh0cG4uZXF1YWxzKHRwbl9kZWZhdWx0KSA9PSBmYWxzZSkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW52YWxpZC5sbFRhc2tHZW9tZXRyeV9sbFRhc2tzUGVyTm9kZSIpKTsKLQkJfQotCi0JCWlmICgodGcuZXF1YWxzKHRnX2RlZmF1bHQpID09IGZhbHNlKSAmJgotCQkJCSh0dC5lcXVhbHModHRfZGVmYXVsdCkgPT0gZmFsc2UpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxUb3RhbFRhc2tzIikpOwotCQl9Ci0KLQkJaWYgKCh0Zy5lcXVhbHModGdfZGVmYXVsdCkgPT0gZmFsc2UpICYmCi0JCQkJKG5tLmVxdWFscyhubV9kZWZhdWx0KSA9PSBmYWxzZSkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW52YWxpZC5sbFRhc2tHZW9tZXRyeV9sbE5vZGVNaW4iKSk7Ci0JCX0KLQotCQlpZiAoKHRnLmVxdWFscyh0Z19kZWZhdWx0KSA9PSBmYWxzZSkgJiYKLQkJCQkobm14LmVxdWFscyhubXhfZGVmYXVsdCkgPT0gZmFsc2UpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxOb2RlTWF4IikpOwotCQl9Ci0KLQkJaWYgKCh0Zy5lcXVhbHModGdfZGVmYXVsdCkgPT0gZmFsc2UpICYmCi0JCQkJKGIuZXF1YWxzKGJfZGVmYXVsdCkgPT0gZmFsc2UpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQubGxUYXNrR2VvbWV0cnlfbGxCbG9ja2luZyIpKTsKLQkJfQotCi0JCXZhbGlkYXRlUG9zaXRpdmVPclVubGltaXRlZE51bWVyaWMobGxCbG9ja2luZywiSW52YWxpZC5sbEJsb2NraW5nIik7Ci0KLS8vbm8gY2hlY2tzIHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZSBmb2xsb3dpbmcgd2lkZ2V0cyBhdCB0aGlzIHRpbWUKLS8vCQlsbE5ldHdvcmtfbXBpID0gY3JlYXRlVGV4dFdpZGdldChub2Rlc05ldHdvcmtUYWJQYW5lLCBybSwKLS8vCQkJCUxMX1BUUF9ORVRXT1JLX01QSSk7Ci0vLwkJbGxOZXR3b3JrX2xhcGkgPSBjcmVhdGVUZXh0V2lkZ2V0KG5vZGVzTmV0d29ya1RhYlBhbmUsIHJtLAotLy8JCQkJTExfUFRQX05FVFdPUktfTEFQSSk7Ci0vLwkJbGxOZXR3b3JrX21waV9sYXBpID0gY3JlYXRlVGV4dFdpZGdldChub2Rlc05ldHdvcmtUYWJQYW5lLCBybSwKLS8vCQkJCUxMX1BUUF9ORVRXT1JLX01QSV9MQVBJKTsKLS8vCQl2YWxpZGF0ZU51bWVyaWNSYW5nZShsbE5vZGVNaW4sIExMX1BUUF9OT0RFX01JTiwgIkludmFsaWQubGxOb2RlTWluIik7Ci0vLwkJdmFsaWRhdGVOdW1lcmljUmFuZ2UobGxOb2RlTWF4LCBMTF9QVFBfTk9ERV9NQVgsICJJbnZhbGlkLmxsTm9kZU1heCIpOwotLy9ubyBjaGVja3Mgd2lsbCBiZSBwZXJmb3JtZWQgb24gdGhlIGZvbGxvd2luZyB3aWRnZXRzIGF0IHRoaXMgdGltZQotLy8JCWxsVGFza0dlb21ldHJ5ID0gY3JlYXRlVGV4dFdpZGdldChub2Rlc05ldHdvcmtUYWJQYW5lLCBybSwKLS8vCQkJCUxMX1BUUF9UQVNLX0dFT01FVFJZKTsKLQotCQl2YWxpZGF0ZU51bWVyaWNNaW5NYXgobGxOb2RlTWluLCBMTF9QVFBfTk9ERV9NSU4sICJJbnZhbGlkLmxsTm9kZU1pbiIsIGxsTm9kZU1heCwgTExfUFRQX05PREVfTUFYLCAiSW52YWxpZC5sbE5vZGVNYXgiKTsgCi0JCXZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKGxsVGFza3NQZXJOb2RlLCJJbnZhbGlkLmxsVGFza3NQZXJOb2RlIik7Ci0JCXZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKGxsVG90YWxUYXNrcywiSW52YWxpZC5sbFRvdGFsVGFza3MiKTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVOb2Rlc05ldHdvcmtUYWIgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gcGVyZm9ybWFuY2UgdGFiIDEsIHRvcAotCSAqIHRvIGJvdHRvbQotCSAqCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTGltaXRzVGFiKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVMaW1pdHNUYWIgZW50ZXJlZC4iKTsKLQkJdmFsaWRhdGVDbG9ja1ZhbHVlKGxsV2FsbENsb2NrTGltaXRIYXJkLCJJbnZhbGlkLmxsV2FsbENsb2NrTGltaXRIYXJkIik7Ci0JCXZhbGlkYXRlQ2xvY2tWYWx1ZShsbFdhbGxDbG9ja0xpbWl0U29mdCwiSW52YWxpZC5sbFdhbGxDbG9ja0xpbWl0U29mdCIpOwotCi0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlTGltaXRzVGFiIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGF0IGFuIGlucHV0IGZpbGUgaXMgYWNjZXNzaWJsZQotCSAqCi0JICogQHBhcmFtIHNlbGVjdG9yCi0JICogICAgICAgICAgICBUaGUgZmlsZSBzZWxlY3RvciBjb250YWluaW5nIHRoZSBwYXRobmFtZQotCSAqIEBwYXJhbSBlcnJvcklECi0JICogICAgICAgICAgICBpZCBvZiB0aGUgZXJyb3Igc3RyaW5nIHVzZWQgaWYgZmlsZSBpcyBpbmFjY2Vzc2libGUKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVJbnB1dFBhdGgoRmlsZVNlbGVjdG9yUm93V2lkZ2V0IHNlbGVjdG9yLAotCQkJU3RyaW5nIGVycm9ySUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBhdGg7Ci0KLQkJaWYgKChzZWxlY3RvciAhPSBudWxsKSAmJiBzZWxlY3Rvci5pc0VuYWJsZWQoKQotCQkJCSYmIHNlbGVjdG9yLmlzVmFsaWRhdGlvblJlcXVpcmVkKCkpIHsKLQkJCXBhdGggPSBzZWxlY3Rvci5nZXRWYWx1ZSgpOwotCQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNlbGVjdG9yLnJlc2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZUlucHV0UGF0aChwYXRoLCBlcnJvcklEKTsKLQkJCQlzZWxlY3Rvci5yZXNldFZhbGlkYXRpb25TdGF0ZSgpOwotCQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2VsZWN0b3Iuc2V0RmllbGRJbkVycm9yKCk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoYXQgYW4gb3V0cHV0IGZpbGUgaXMgYWNjZXNzaWJsZQotCSAqCi0JICogQHBhcmFtIHNlbGVjdG9yCi0JICogICAgICAgICAgICBUaGUgZmlsZSBzZWxlY3RvciBjb250YWluaW5nIHRoZSBwYXRobmFtZQotCSAqIEBwYXJhbSBlcnJvcklECi0JICogICAgICAgICAgICBpZCBvZiB0aGUgZXJyb3Igc3RyaW5nIHVzZWQgaWYgdGhlIGZpbGUgaXMgaW5hY2Nlc3NpYmxlCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGVPdXRwdXRQYXRoKEZpbGVTZWxlY3RvclJvd1dpZGdldCBzZWxlY3RvciwKLS8vCQkJU3RyaW5nIGVycm9ySUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLS8vCQlTdHJpbmcgcGF0aDsKLS8vCi0vLwkJaWYgKChzZWxlY3RvciAhPSBudWxsKSAmJiBzZWxlY3Rvci5pc0VuYWJsZWQoKQotLy8JCQkJJiYgc2VsZWN0b3IuaXNWYWxpZGF0aW9uUmVxdWlyZWQoKSkgewotLy8JCQlwYXRoID0gc2VsZWN0b3IuZ2V0VmFsdWUoKTsKLS8vCQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJc2VsZWN0b3IucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLS8vCQkJCXJldHVybjsKLS8vCQkJfQotLy8JCQl0cnkgewotLy8JCQkJdmFsaWRhdGVPdXRwdXRQYXRoKHBhdGgsIGVycm9ySUQpOwotLy8JCQkJc2VsZWN0b3IucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLS8vCQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlzZWxlY3Rvci5zZXRGaWVsZEluRXJyb3IoKTsKLS8vCQkJCXRocm93IGU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGF0IGluIGlucHV0IGZpbGUgaXMgYWNjZXNzaWJsZQotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFBhdGhuYW1lIG9mIHRoZSBpbnB1dCBmaWxlCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIGlkIG9mIHRoZSBlcnJvciBzdHJpbmcgdXNlZCBpZiB0aGUgZmlsZSBpcyBpbmFjY2Vzc2libGUKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW5wdXRQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgZXJyb3JJRCkKLQkJCXRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIHRlc3RQYXRoOwotCQlJRmlsZVN0b3JlIHJlbW90ZVJlc291cmNlOwotCQlJRmlsZUluZm8gZmlsZUluZm87Ci0KLQkJdGVzdFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKCF0ZXN0UGF0aC5pc1ZhbGlkUGF0aChwYXRoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQkJfQotCQlyZW1vdGVSZXNvdXJjZSA9IHJlbW90ZVNlcnZpY2UuZ2V0RmlsZU1hbmFnZXIocmVtb3RlQ29ubmVjdGlvbikKLQkJCQkuZ2V0UmVzb3VyY2UodGVzdFBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlmaWxlSW5mbyA9IHJlbW90ZVJlc291cmNlLmZldGNoSW5mbygpOwotCQlpZiAoKCFmaWxlSW5mby5leGlzdHMoKSkgfHwgKGZpbGVJbmZvLmlzRGlyZWN0b3J5KCkpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhhdCBhbiBvdXRwdXQgZmlsZSBpcyBhY2Nlc3NpYmxlCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgUGF0aG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIGlkIG9mIHRoZSBlcnJvciBzdHJpbmcgdXNlZCBpZiB0aGUgZmlsZSBpcyBub3QgYWNjZXNzaWJsZQotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVPdXRwdXRQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgZXJyb3JJRCkKLQkJCXRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIHRlc3RQYXRoOwotCQlJRmlsZVN0b3JlIHJlbW90ZVJlc291cmNlOwotCQlJRmlsZUluZm8gZmlsZUluZm87Ci0KLQkJdGVzdFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKCF0ZXN0UGF0aC5pc1ZhbGlkUGF0aChwYXRoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQkJfQotCQlyZW1vdGVSZXNvdXJjZSA9IHJlbW90ZVNlcnZpY2UuZ2V0RmlsZU1hbmFnZXIocmVtb3RlQ29ubmVjdGlvbikKLQkJCQkuZ2V0UmVzb3VyY2UodGVzdFBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlmaWxlSW5mbyA9IHJlbW90ZVJlc291cmNlLmZldGNoSW5mbygpOwotCQlpZiAoZmlsZUluZm8uaXNEaXJlY3RvcnkoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoYXQgdGhlIGRpcmVjdG9yeSBwYXRobmFtZSBpcyB2YWxpZAotCSAqCi0JICogQHBhcmFtIHNlbGVjdG9yCi0JICogICAgICAgICAgICBGaWxlIHNlbGVjdG9yIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBuYW1lCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIGlkIG9mIHRoZSBlcnJvciBzdHJpbmcgdXNlZCBpZiB0aGUgZGlyZWN0b3J5IGlzIGludmFsaWQKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGlyZWN0b3J5KEZpbGVTZWxlY3RvclJvd1dpZGdldCBzZWxlY3RvciwKLQkJCVN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcGF0aDsKLQkJSVBhdGggdGVzdFBhdGg7Ci0JCUlGaWxlU3RvcmUgcmVtb3RlUmVzb3VyY2U7Ci0JCUlGaWxlSW5mbyBmaWxlSW5mbzsKLQotCQlpZiAoKHNlbGVjdG9yICE9IG51bGwpICYmIHNlbGVjdG9yLmlzRW5hYmxlZCgpCi0JCQkJJiYgc2VsZWN0b3IuaXNWYWxpZGF0aW9uUmVxdWlyZWQoKSkgewotCQkJcGF0aCA9IHNlbGVjdG9yLmdldFZhbHVlKCk7Ci0JCQl0cnkgewotCQkJCWlmIChwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkJc2VsZWN0b3IucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCXRlc3RQYXRoID0gbmV3IFBhdGgocGF0aCk7Ci0JCQkJaWYgKCF0ZXN0UGF0aC5pc1ZhbGlkUGF0aChwYXRoKSkgewotCQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQkJCX0KLQkJCQlyZW1vdGVSZXNvdXJjZSA9IHJlbW90ZVNlcnZpY2UuZ2V0RmlsZU1hbmFnZXIocmVtb3RlQ29ubmVjdGlvbikKLQkJCQkJCS5nZXRSZXNvdXJjZSh0ZXN0UGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJZmlsZUluZm8gPSByZW1vdGVSZXNvdXJjZS5mZXRjaEluZm8oKTsKLQkJCQlpZiAoIWZpbGVJbmZvLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMKLQkJCQkJCQkuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQkJCQl9Ci0JCQkJc2VsZWN0b3IucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLQkJCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXNlbGVjdG9yLnNldEZpZWxkSW5FcnJvcigpOwotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWZXJpZnkgdGhhdCB0aGUgdmFsdWUgc2VsZWN0ZWQgb3IgZW50ZXJlZCBpbiBhbiBlZGl0YWJsZSBjb21ib2JveCBpcyBhCi0JICogdmFsaWQgdmFsdWUsIGFzIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUKLQkgKiBhdHRyaWJ1dGUuCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0Ci0JICogICAgICAgICAgICBUaGUgY29tYm9ib3ggdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZSBuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIHNlbGVjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRMaXN0U2VsZWN0aW9uKENvbWJvUm93V2lkZ2V0IHdpZGdldCwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCVN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JCVN0cmluZ1NldEF0dHJpYnV0ZSBhdHRyOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjppc1ZhbGlkTGlzdFNlbGVjdGlvbiBlbnRlcmVkLiIpOwotCQlhdHRyRGVmID0gKFN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24pIGN1cnJlbnRSTQotCQkJCS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJOYW1lKTsKLQkJaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlhdHRyID0gYXR0ckRlZi5jcmVhdGUod2lkZ2V0LmdldFZhbHVlKCkpOwotCQkJCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCQkJKyAiOmlzVmFsaWRMaXN0U2VsZWN0aW9uIHJldHVybmluZy4iKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCQkrICI6aXNWYWxpZExpc3RTZWxlY3Rpb24gcmV0dXJuaW5nLiIpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6aXNWYWxpZExpc3RTZWxlY3Rpb24gcmV0dXJuaW5nLiIpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGF0IHRoZSBtaW5WYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1heFZhbHVlLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2xNaW4KLQkgKiAgICAgICAgICAgIFRoZSBtaW4gVGV4dCB3aWRnZXQgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcGFyYW0gYXR0ck5hbWVNaW4KLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtaW4gYXR0cmlidXRlCi0JICogQHBhcmFtIGVycm9ySURNaW4KLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZXJyb3IgbWVzc2FnZSB1c2VkIGlmIGNvbnRyb2xNaW4gdmFsaWRhdGlvbiBmYWlscwotCSAqIEBwYXJhbSBjb250cm9sTWF4Ci0JICogICAgICAgICAgICBUaGUgbWF4IFRleHQgd2lkZ2V0IHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGF0dHJOYW1lTWF4Ci0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbWF4IGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBlcnJvcklETWF4Ci0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGVycm9yIG1lc3NhZ2UgdXNlZCBpZiBjb250cm9sTWF4IHZhbGlkYXRpb24gZmFpbHMKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBUZXh0IHdpZGdldCBmYWlsZWQgdmFsaWRhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU51bWVyaWNNaW5NYXgoVGV4dFJvd1dpZGdldCBjb250cm9sTWluLCBTdHJpbmcgYXR0ck5hbWVNaW4sIFN0cmluZyBlcnJvcklETWluLAotCQkJVGV4dFJvd1dpZGdldCBjb250cm9sTWF4LCBTdHJpbmcgYXR0ck5hbWVNYXgsCi0JCQlTdHJpbmcgZXJyb3JJRE1heCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgc3RyTWluID0gIiIsIHN0ck1heCA9ICIiOwotCQlpbnQgaU1pbiA9IDAsIGlNYXggPSAwOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZU51bWVyaWNNaW5NYXggZW50ZXJlZC4iKTsKLQkJCQkKLQkJaWYgKGNvbnRyb2xNaW4gIT0gbnVsbCkgewotCQkJc3RyTWluID0gY29udHJvbE1pbi5nZXRWYWx1ZSgpOwotCQkJaWYgKHN0ck1pbi5sZW5ndGgoKSA+IDApIHsKLQkJCQlpTWluID0gdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMoc3RyTWluLCBlcnJvcklETWluKTsKLQkJCX0KLQkJfQotCQlpZiAoY29udHJvbE1heCAhPSBudWxsKSB7Ci0JCQlzdHJNYXggPSBjb250cm9sTWF4LmdldFZhbHVlKCk7Ci0JCQlpZiAoc3RyTWF4Lmxlbmd0aCgpID4gMCkgewotCQkJCWlNYXggPSB2YWxpZGF0ZVBvc2l0aXZlTnVtZXJpYyhzdHJNYXgsIGVycm9ySURNYXgpOwotCQkJfQotCQl9Ci0JCWlmICgoc3RyTWluLmxlbmd0aCgpID4gMCkgJiYgKHN0ck1heC5sZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAoaU1pbiA+IGlNYXgpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQubGxOb2RlTWluTWF4IikpOwotCQkJfQotCQl9Ci0JCQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVOdW1lcmljTWluTWF4IHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGF0IGFuIGludGVnZXIgdmFsdWUgaXMgd2l0aGluIHRoZSByYW5nZSBhbGxvd2VkIGZvciB0aGUKLQkgKiBhdHRyaWJ1dGUuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgVGhlIFRleHQgd2lkZ2V0IHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZXJyb3IgbWVzc2FnZSB1c2VkIGlmIHZhbGlkYXRpb24gZmFpbHMKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBUZXh0IHdpZGdldCBmYWlsZWQgdmFsaWRhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU51bWVyaWNSYW5nZShUZXh0Um93V2lkZ2V0IGNvbnRyb2wsIFN0cmluZyBhdHRyTmFtZSwKLQkJCVN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVOdW1lcmljUmFuZ2UgZW50ZXJlZC4iKTsKLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJdmFsdWUgPSBjb250cm9sLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdmFsaWRhdGVOdW1lcmljUmFuZ2UodmFsdWUsIGF0dHJOYW1lLCBlcnJvcklEKTsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVOdW1lcmljUmFuZ2UgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoYXQgYW4gaW50ZWdlciB2YWx1ZSBpcyB3aXRoaW4gdGhlIHJhbmdlIGFsbG93ZWQgZm9yIHRoZQotCSAqIGF0dHJpYnV0ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZXJyb3IgbWVzc2FnZSB1c2VkIGlmIHZhbGlkYXRpb24gZmFpbHMKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBUZXh0IHdpZGdldCBmYWlsZWQgdmFsaWRhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU51bWVyaWNSYW5nZShTdHJpbmcgdmFsdWUsIFN0cmluZyBhdHRyTmFtZSwKLQkJCVN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCB0ZXN0VmFsdWU7Ci0JCWludCBsZW47Ci0JCWNoYXIgc3VmZml4OwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZU51bWVyaWNSYW5nZSBlbnRlcmVkLiIpOwotCQlsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLQkJc3VmZml4ID0gdmFsdWUuY2hhckF0KGxlbiAtIDEpOwotCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoc3VmZml4KSkgewotCQkJdHJ5IHsKLQkJCQl0ZXN0VmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQl0ZXN0VmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUuc3Vic3RyaW5nKDAsIGxlbiAtIDEpKTsKLQkJCQlpZiAoKHN1ZmZpeCA9PSAnRycpIHx8IChzdWZmaXggPT0gJ2cnKSkgewotCQkJCQl0ZXN0VmFsdWUgPSB0ZXN0VmFsdWUgKiBHQllURTsKLQkJCQl9IGVsc2UgaWYgKChzdWZmaXggPT0gJ00nKSB8fCAoc3VmZml4ID09ICdtJykpIHsKLQkJCQkJdGVzdFZhbHVlID0gdGVzdFZhbHVlICogTUJZVEU7Ci0JCQkJfSBlbHNlIGlmICgoc3VmZml4ID09ICdLJykgfHwgKHN1ZmZpeCA9PSAnaycpKSB7Ci0JCQkJCXRlc3RWYWx1ZSA9IHRlc3RWYWx1ZSAqIEtCWVRFOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQkJfQotCQl9Ci0JCXZhbGlkYXRlTnVtZXJpY1JhbmdlKHRlc3RWYWx1ZSwgYXR0ck5hbWUsIGVycm9ySUQpOwotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVOdW1lcmljUmFuZ2UgcmV0dXJuaW5nLiIpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoYXQgYW4gaW50ZWdlciB2YWx1ZSBpcyB3aXRoaW4gdGhlIHJhbmdlIGFsbG93ZWQgZm9yIHRoZQotCSAqIGF0dHJpYnV0ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZXJyb3IgbWVzc2FnZSB1c2VkIGlmIHZhbGlkYXRpb24gZmFpbHMKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBUZXh0IHdpZGdldCBmYWlsZWQgdmFsaWRhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU51bWVyaWNSYW5nZShpbnQgdmFsdWUsIFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGVycm9ySUQpCi0JCQl0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJEZWY7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCQlJbnRlZ2VyQXR0cmlidXRlIGF0dHI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlTnVtZXJpY1JhbmdlIGVudGVyZWQuIik7Ci0JCWF0dHJEZWYgPSAoSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24pIGN1cnJlbnRSTQotCQkJCS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJOYW1lKTsKLQkJdHJ5IHsKLQkJCWF0dHIgPSBhdHRyRGVmLmNyZWF0ZSh2YWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZU51bWVyaWNSYW5nZSByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIHN0cmluZyB3aGljaCBtYXkgaGF2ZSBhIHN1ZmZpeCAnaycsICdtJyBvciAnZycgdG8gaXQncyBhY3R1YWwKLQkgKiBudW1lcmljIHZhbHVlLCBtdWx0aXBseWluZyBieSB0aGUgYXBwcm9wcmlhdGUgbXVsdGlwbGllcgotCSAqCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCBudW1iZXIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbnRlZ2VyVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWludCB0ZXN0VmFsdWU7Ci0JCWludCBsZW47Ci0JCWNoYXIgc3VmZml4OwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjpnZXRJbnRlZ2VyVmFsdWUgZW50ZXJlZC4iKTsKLQkJdGVzdFZhbHVlID0gMDsKLQkJbGVuID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIjpnZXRJbnRlZ2VyVmFsdWUgcmV0dXJuaW5nLiIpOwotCQkJcmV0dXJuICIiOwotCQl9IGVsc2UgewotCQkJc3VmZml4ID0gdmFsdWUuY2hhckF0KGxlbiAtIDEpOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHN1ZmZpeCkpIHsKLQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCSsgIjpnZXRJbnRlZ2VyVmFsdWUgcmV0dXJuaW5nLiIpOwotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxlbiA+PSAyKSB7Ci0JCQkJCXRlc3RWYWx1ZSA9IEludGVnZXIudmFsdWVPZih2YWx1ZS5zdWJzdHJpbmcoMCwgbGVuIC0gMSkpOwotCQkJCQlpZiAoKHN1ZmZpeCA9PSAnRycpIHx8IChzdWZmaXggPT0gJ2cnKSkgewotCQkJCQkJdGVzdFZhbHVlID0gdGVzdFZhbHVlICogR0JZVEU7Ci0JCQkJCX0gZWxzZSBpZiAoKHN1ZmZpeCA9PSAnTScpIHx8IChzdWZmaXggPT0gJ20nKSkgewotCQkJCQkJdGVzdFZhbHVlID0gdGVzdFZhbHVlICogTUJZVEU7Ci0JCQkJCX0gZWxzZSBpZiAoKHN1ZmZpeCA9PSAnSycpIHx8IChzdWZmaXggPT0gJ2snKSkgewotCQkJCQkJdGVzdFZhbHVlID0gdGVzdFZhbHVlICogS0JZVEU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIgotCQkJCQkJCQkrIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiOmdldEludGVnZXJWYWx1ZSByZXR1cm5pbmcuIik7Ci0JCQkJCQlyZXR1cm4gIiI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiOmdldEludGVnZXJWYWx1ZSByZXR1cm5pbmcuIik7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodGVzdFZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoYXQgYSBCaWdJbnRlZ2VyIHZhbHVlIGlzIHdpdGhpbiB0aGUgcmFuZ2UgYWxsb3dlZCBmb3IgdGhlCi0JICogYXR0cmlidXRlLgotCSAqCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gZXJyb3JJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBlcnJvciBtZXNzYWdlIHVzZWQgaWYgdmFsaWRhdGlvbiBmYWlscwotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IFRleHQgd2lkZ2V0IGZhaWxlZCB2YWxpZGF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTG9uZ051bWVyaWNSYW5nZShTdHJpbmcgdmFsdWUsIFN0cmluZyBhdHRyTmFtZSwKLQkJCVN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJEZWY7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCQlCaWdJbnRlZ2VyQXR0cmlidXRlIGF0dHI7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlTG9uZ051bWVyaWNSYW5nZSBlbnRlcmVkLiIpOwotCQlhdHRyRGVmID0gKEJpZ0ludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKSBjdXJyZW50Uk0KLQkJCQkuZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihhdHRyTmFtZSk7Ci0JCXRyeSB7Ci0JCQlhdHRyID0gYXR0ckRlZi5jcmVhdGUodmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVMb25nTnVtZXJpY1JhbmdlIHJldHVybmluZy4iKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBhIFN0cmluZydzIHZhbHVlIHRvIHZlcmlmeSBpdCBpcyB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UKLQkgKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgU3RyaW5nIHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGxvd0xpbWl0Ci0JICogICAgICAgICAgICBMb3cgbGltaXQgb2YgcmFuZ2UKLQkgKiBAcGFyYW0gaGlnaExpbWl0Ci0JICogICAgICAgICAgICBIaWdoIGxpbWl0IG9mIHJhbmdlCi0JICogQHBhcmFtIGVycm9ySUQKLQkgKiAgICAgICAgICAgIGlkIG9mIHRoZSBlcnJvciBtZXNzYWdlIHVzZWQgaWYgdmFsdWUgaXMgbm90IGluIGFsbG93YWJsZQotCSAqICAgICAgICAgICAgcmFuZ2UKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVOdW1lcmljUmFuZ2UoU3RyaW5nIHZhbHVlLCBpbnQgbG93TGltaXQsCi0JCQlpbnQgaGlnaExpbWl0LCBTdHJpbmcgZXJyb3JJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpbnQgbjsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVOdW1lcmljUmFuZ2UgZW50ZXJlZC4iKTsKLQkJdHJ5IHsKLQkJCW4gPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotCQkJaWYgKChuIDwgbG93TGltaXQpIHx8IChuID4gaGlnaExpbWl0KSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZU51bWVyaWNSYW5nZSByZXR1cm5pbmcuIik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgYSBtZXNzYWdlOiBJbmZvLCBUcmFjZSwgQXJnIGFuZCBXYXJuaW5nIG1lc3NhZ2VzIGdvIHRvIHN0ZG91dC4KLQkgKiBFcnJvciBhbmQgRmF0YWwgbWVzc2FnZXMgZ28gdG8gc3RkZXJyLiAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50X21lc3NhZ2UoaW50IHR5cGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIElORk9fTUVTU0FHRToKLQkJCWlmIChzdGF0ZV9pbmZvID09IDEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluZm86ICIgKyBtZXNzYWdlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFRSQUNFX01FU1NBR0U6Ci0JCQlpZiAoc3RhdGVfdHJhY2UgPT0gMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVHJhY2U6ICIgKyBtZXNzYWdlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdBUk5JTkdfTUVTU0FHRToKLQkJCWlmIChzdGF0ZV93YXJuaW5nID09IDEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyBtZXNzYWdlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFSR1NfTUVTU0FHRToKLQkJCWlmIChzdGF0ZV9hcmdzID09IDEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3M6ICIgKyBtZXNzYWdlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEVSUk9SX01FU1NBR0U6Ci0JCQlpZiAoc3RhdGVfZXJyb3IgPT0gMSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBtZXNzYWdlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEZBVEFMX01FU1NBR0U6Ci0JCQlpZiAoc3RhdGVfZmF0YWwgPT0gMSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRmF0YWwgIiArIG1lc3NhZ2UpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUFscGhhTnVtZXJpYyhUZXh0Um93V2lkZ2V0IGNvbnRyb2wsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVBbHBoYU51bWVyaWMgZW50ZXJlZC4iKTsKLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJdmFsdWUgPSBjb250cm9sLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdmFsaWRhdGVBbHBoYU51bWVyaWModmFsdWUsIGVycm9ySUQpOwotCQkJfQotCQl9Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZUFscGhhTnVtZXJpYyByZXR1cm5pbmcuIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQWxwaGFOdW1lcmljKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGVycm9ySUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGk7Ci0JCVN0cmluZyBzdHJpcHBlZCA9IHZhbHVlLnRyaW0oKTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVBbHBoYU51bWVyaWMgZW50ZXJlZC4iKTsKLQkJZm9yIChpPTA7IGk8c3RyaXBwZWQubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKHN0cmlwcGVkLm1hdGNoZXMoIlthLXpBLVpfMC05XSoiKSA9PSBmYWxzZSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVBbHBoYU51bWVyaWMgcmV0dXJuaW5nLiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVBvc2l0aXZlT3JVbmxpbWl0ZWROdW1lcmljKFRleHRSb3dXaWRnZXQgY29udHJvbCwgU3RyaW5nIGVycm9ySUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVBvc2l0aXZlT3JVbmxpbWl0ZWROdW1lcmljIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCXZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJ1bmxpbWl0ZWQiKSkgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8gLSB1bmxpbWl0ZWQgaXMgdmFsaWQgdmFsdWUKLQkJCX0gZWxzZSB7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdmFsaWRhdGVQb3NpdGl2ZU9yVW5saW1pdGVkTnVtZXJpYyh2YWx1ZSwgZXJyb3JJRCk7Ci0JCQl9IH0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVQb3NpdGl2ZU9yVW5saW1pdGVkTnVtZXJpYyByZXR1cm5pbmcuIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUG9zaXRpdmVPclVubGltaXRlZE51bWVyaWMoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZXJyb3JJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpbnQgbjsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVQb3NpdGl2ZU9yVW5saW1pdGVkTnVtZXJpYyBlbnRlcmVkLiIpOwotCQl0cnkgewotCQkJbiA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCQlpZiAoKG4gPCAxKSB8fCAobiA+IEludGVnZXIuTUFYX1ZBTFVFKSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQl9Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlUG9zaXRpdmVPclVubGltaXRlZE51bWVyaWMgcmV0dXJuaW5nLiIpOwotCX0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMoVGV4dFJvd1dpZGdldCBjb250cm9sLCBTdHJpbmcgZXJyb3JJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWU7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlUG9zaXRpdmVOdW1lcmljIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCXZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCXZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKHZhbHVlLCBlcnJvcklEKTsKLQkJCX0KLQkJfQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMgcmV0dXJuaW5nLiIpOwotCX0KLQotCXByaXZhdGUgaW50IHZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGVycm9ySUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaW50IG4gPSAwOwotCi0JCXByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotCQkJCSsgIjp2YWxpZGF0ZVBvc2l0aXZlTnVtZXJpYyBlbnRlcmVkLiIpOwotCQl0cnkgewotCQkJbiA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCQlpZiAoKG4gPCAwKSB8fCAobiA+IEludGVnZXIuTUFYX1ZBTFVFKSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQl9Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlUG9zaXRpdmVOdW1lcmljIHJldHVybmluZy4iKTsKLQkJcmV0dXJuIG47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ2xvY2tWYWx1ZShUZXh0Um93V2lkZ2V0IGNvbnRyb2wsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZTsKLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVDbG9ja1ZhbHVlIGVudGVyZWQuIik7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCXZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCXZhbGlkYXRlQ2xvY2tWYWx1ZSh2YWx1ZSwgZXJyb3JJRCk7Ci0JCQl9Ci0JCX0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlQ2xvY2tWYWx1ZSByZXR1cm5pbmcuIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ2xvY2tWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBpOwotCQlTdHJpbmcgc3RyaXBwZWQgPSB2YWx1ZS50cmltKCk7Ci0KLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJKyAiOnZhbGlkYXRlQ2xvY2tWYWx1ZSBlbnRlcmVkLiIpOwotCQlmb3IgKGk9MDsgaTxzdHJpcHBlZC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoc3RyaXBwZWQubWF0Y2hlcygiWzAtOV0rKDpbMC05XSspezAsMn0iKSA9PSBmYWxzZSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLQkJCQkrICI6dmFsaWRhdGVDbG9ja1ZhbHVlIHJldHVybmluZy4iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTUwODguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL0lCTUxMUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBMb3MgQWxhbW9zIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMuCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgREUtQUM1Mi0wNk5BMjUzOTYKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgKExBTkwpLCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgTG9zIEFsYW1vcwotICogTmF0aW9uYWwgU2VjdXJpdHksIExMQyAoTEFOUykgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBoYXMKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUKLSAqIEdPVkVSTk1FTlQgTk9SIExBTlMgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLkFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlLnJtc3lzdGVtLklCTUxMUmVzb3VyY2VNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkb0NyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyIHJtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSUJNTExSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKHJtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXI+IGdldFJlc291cmNlTWFuYWdlckNsYXNzKCkgewotCQlyZXR1cm4gSUJNTExSZXNvdXJjZU1hbmFnZXIuY2xhc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vVGV4dFJvd1dpZGdldC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1RleHRSb3dXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5NGViYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vVGV4dFJvd1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0Um93V2lkZ2V0IGltcGxlbWVudHMgVmFsaWRhdGlvblN0YXRlCi17Ci0gICAgcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG5vbkRlZmF1bHRNYXJrZXI7Ci0gICAgcHJpdmF0ZSBHcmlkRGF0YSBncmlkRGF0YTsKLSAgICBwcml2YXRlIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHJEZWY7Ci0gICAgcHJpdmF0ZSBUZXh0IHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBFdmVudE1vbml0b3IgZXZlbnRNb25pdG9yOwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIHdoaWNoIGxpc3RlbnMgZm9yIGV2ZW50cyBpbmRpY2F0aW5nIHRoZSBkYXRhIHZhbHVlIGZvciB0aGlzIG9iamVjdCBoYXMgY2hhbmdlZAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFdmVudE1vbml0b3IgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotICAgIHsKLQlwdWJsaWMgRXZlbnRNb25pdG9yKCkKLQl7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBub24tZGVmYXVsdCB2YWx1ZSBpbmRpY2F0b3IgZm9yIHRoaXMgb2JqZWN0IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRhdGEgdmFsdWUgbWF0Y2hlcwotCSAqIHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICogQHBhcmFtIGUgVGhlIGV2ZW50IGluZGljYXRpbmcgZGF0YSB2YWx1ZSBoYXMgY2hhbmdlZCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0JewotCSAgICBTdHJpbmcgdmFsdWU7Ci0JICAgIAotCSAgICB2YWx1ZSA9IHdpZGdldC5nZXRUZXh0KCkudHJpbSgpOwotCSAgICBpZiAoKHZhbHVlLmxlbmd0aCAoKSA9PSAwKSB8fCAodmFsdWUuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpKSB7Ci0JCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCSAgICB9IGVsc2UgewotCQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIioiKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB3aWRnZXQgd2hpY2ggaXMgdXNlZCBhcyBhIHRleHQgZW50cnkgZmllbGQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLiBUaGlzIGNsYXNzIGFzc3VtZXMgdGhhdAotICAgICAqIHRoZSBsYXlvdXQgbWFuYWdlciBzZXQgZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlIG9iamVjdCBpcyBhIEdyaWRMYXlvdXQgd2lkZ2V0IHdpdGggNCBjb2x1bW5zCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IENvbXBvc2l0ZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dFJvd1dpZGdldChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQsIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGRlZikKLSAgICB7Ci0JYXR0ckRlZiA9IGRlZjsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyRGVmLmdldE5hbWUoKSkpOwotCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCW5vbkRlZmF1bHRNYXJrZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0Jbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIqIik7Ci0Jd2lkZ2V0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0Jd2lkZ2V0LnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyRGVmLmdldERlc2NyaXB0aW9uKCkpKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQl3aWRnZXQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0Jd2lkZ2V0LnNldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5BVFRSX05BTUUsIGlkKTsKLQl0cnkgewotCSAgICBkZWZhdWx0VmFsdWUgPSBhdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JICAgIGRlZmF1bHRWYWx1ZSA9ICIiOwotCX0KLQlldmVudE1vbml0b3IgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0Jd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgTW9kaWZ5TGlzdGVuZXIgdG8gdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgbGlzdGVuaW5nIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vbml0b3IpCi0gICAgewotCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihtb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGEgdmFsdWUgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldFRleHQoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkYXRhIHZhbHVlIGZvciB0aGlzIG9iamVjdAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldFRleHQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGF0YSBvYmplY3QgKGF0dHJpYnV0ZSBuYW1lKSBzdG9yZWQgaW4gdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gdXNlIGluIHJldHJpZXZpbmcgdGhlIGRhdGEgb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgZGF0YSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoU3RyaW5nIGtleSkKLSAgICB7Ci0JcmV0dXJuIChTdHJpbmcpIHdpZGdldC5nZXREYXRhKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSBubyB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRWYWxpZGF0aW9uU3RhdGUoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuVU5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgaW4gZXJyb3IgYW5kIG11c3QgYmUgdmFsaWRhdGVkIGFnYWluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRJbkVycm9yKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIGFuZCB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZAotICAgICAqIEByZXR1cm4gLSB2YWxpZGF0aW9uIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0JcmV0dXJuICgodmFsaWRhdGlvblN0YXRlID09IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEKSB8fCAodmFsaWRhdGlvblN0YXRlID09IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUikpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdHVhbCB3aWRnZXQgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0IGlzIHRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZAotICAgICAqIGZvcgotICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiAtIHN0YXR1cyBpbmRpY2F0aW5nIHRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXRjaGluZyB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ1dpZGdldChXaWRnZXQgc291cmNlKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0ID09IHNvdXJjZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHN0YXRlKQotICAgIHsKLQl3aWRnZXQuc2V0RW5hYmxlZChzdGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0gICAgewotCXJldHVybiB3aWRnZXQuaXNFbmFibGVkKCk7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTliMGI4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9WYWxpZGF0aW9uU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdGF0ZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ0hBTkdFRCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fRVJST1I9MjsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZAotICAgICAqIEByZXR1cm4gLSB2YWxpZGF0aW9uIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vV2lkZ2V0QXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1dpZGdldEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2ZDRiMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vV2lkZ2V0QXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkucm1MYXVuY2hDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldEF0dHJpYnV0ZXMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAiQVRUUl9OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT05fSUQgPSAiQlVUVE9OX0lEIjsKLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3dpemFyZHMvSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvd2l6YXJkcy9JQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTg2YzEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvd2l6YXJkcy9JQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLklCTUxMUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLndpemFyZHMuQWJzdHJhY3RSZW1vdGVQcm94eVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLQotcHVibGljIGZpbmFsIGNsYXNzIElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcwotCUFic3RyYWN0UmVtb3RlUHJveHlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSB7Ci0JCi0JcHVibGljIElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkLkNvbmZpZ3VyYXRpb25UaXRsZSIpKTsKLQkJc2V0VGl0bGUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJXaXphcmQuQ29uZmlndXJhdGlvblRpdGxlIikpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIldpemFyZC5Db25maWd1cmF0aW9uIikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3dpemFyZHMvSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL2xsL3VpL3dpemFyZHMvSUJNTExSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjMTRhZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS93aXphcmRzL0lCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwuY29yZS5ybXN5c3RlbS5JQk1MTFJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSBleHRlbmRzCi0JCVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5IHsKLQotCXB1YmxpYyBJQk1MTFJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSgpIHsKLQkJLy8gbm8tb3AKLQl9Ci0KLQlwdWJsaWMgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZVtdIGdldFBhZ2VzKFJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsKLQkJcmV0dXJuIG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW117bmV3IElCTUxMUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2Uod2l6YXJkKSwgCi0JCQkJCQkgICAgICAgbmV3IElCTUxMUmVzb3VyY2VNYW5hZ2VyT3B0aW9uV2l6YXJkUGFnZSh3aXphcmQpfTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3M8SUJNTExSZXNvdXJjZU1hbmFnZXJGYWN0b3J5PiBnZXRSTUZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIElCTUxMUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS93aXphcmRzL0lCTUxMUmVzb3VyY2VNYW5hZ2VyT3B0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vbGwvdWkvd2l6YXJkcy9JQk1MTFJlc291cmNlTWFuYWdlck9wdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjZTRmNy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9sbC91aS93aXphcmRzL0lCTUxMUmVzb3VyY2VNYW5hZ2VyT3B0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5JQk1MTFByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aS5wcmVmZXJlbmNlcy5JQk1MTFByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS5jb3JlLkFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgSUJNTExSZXNvdXJjZU1hbmFnZXJPcHRpb25XaXphcmRQYWdlIGV4dGVuZHMKLQkJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcHJlZmVyZW5jZVBhbmU7Ci0KLQlwcml2YXRlIFRleHQgcHJveHlMaWJyYXJ5VGV4dFdpZGdldCA9IG51bGw7Ci0JcHJpdmF0ZSBFdmVudE1vbml0b3IgbGlicmFyeUxpc3RlbmVyID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBsaWJyYXJ5QnJvd3NlQnV0dG9uID0gbnVsbDs7Ci0KLQlwcml2YXRlIEJ1dHRvbiBwcm94eVRyYWNlTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcHJveHlJbmZvTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcHJveHlXYXJuaW5nTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcHJveHlFcnJvck1lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHByb3h5RmF0YWxNZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eUFyZ3NNZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eURlYnVnTG9vcEJ1dHRvbiA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBwcm94eUZvcmNlTG9jYWxSYWRpb0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcHJveHlGb3JjZU11bHRpY2x1c3RlclJhZGlvQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uID0gbnVsbDsKLQotCXByaXZhdGUgVGV4dCBwcm94eVRlbXBsYXRlVGV4dFdpZGdldCA9IG51bGw7Ci0JcHJpdmF0ZSBFdmVudE1vbml0b3IgdGVtcGxhdGVMaXN0ZW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gcHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gdGVtcGxhdGVCcm93c2VCdXR0b24gPSBudWxsOzsKLQotCXByaXZhdGUgQnV0dG9uIGd1aVRyYWNlTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZ3VpSW5mb01lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGd1aVdhcm5pbmdNZXNzYWdlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBndWlFcnJvck1lc3NhZ2VCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGd1aUZhdGFsTWVzc2FnZUJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZ3VpQXJnc01lc3NhZ2VCdXR0b24gPSBudWxsOwotCi0JcHJpdmF0ZSBTcGlubmVyIHByb3h5UG9sbGluZ05vZGVNaW4gPSBudWxsOwotCXByaXZhdGUgU3Bpbm5lciBwcm94eVBvbGxpbmdOb2RlTWF4ID0gbnVsbDsKLQlwcml2YXRlIFNwaW5uZXIgcHJveHlQb2xsaW5nSm9iID0gbnVsbDsKLQotCXByaXZhdGUgRXZlbnRNb25pdG9yIGV2ZW50TW9uaXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBSTUNvbmZpZ3VyYXRpb25XaXphcmQgY29uZldpemFyZDsKLQotCXByaXZhdGUgY2xhc3MgRXZlbnRNb25pdG9yIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIEV2ZW50TW9uaXRvcigpIHsKLS8vCQkJIFN5c3RlbS5lcnIucHJpbnRsbigid2l6YXJkOiBFdmVudE1vbml0b3IgZW50ZXJlZCIpOwotCQkJdXBkYXRlQ29uZmlnT3B0aW9ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJIFN5c3RlbS5lcnIucHJpbnRsbigid2l6YXJkOiB3aWRnZXREZWZhdWx0U2VsZWN0ZWQgZW50ZXJlZCIpOwotCQkJdXBkYXRlQ29uZmlnT3B0aW9ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotLy8JCQkgU3lzdGVtLmVyci5wcmludGxuKCJ3aXphcmQ6IHdpZGdldFNlbGVjdGVkIGVudGVyZWQiKTsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSBsaWJyYXJ5QnJvd3NlQnV0dG9uKSB7Ci0vLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oInByZWZlcmVuY2VzOiBsaWJyYXJ5QnJvd3NlQnV0dG9uIik7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkUGF0aCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKQotCQkJCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0LnNldFRleHQoc2VsZWN0ZWRQYXRoKTsKLQkJCX0gCi0JCQllbHNlIGlmIChzb3VyY2UgPT0gdGVtcGxhdGVCcm93c2VCdXR0b24pIHsKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicHJlZmVyZW5jZXM6IHRlbXBsYXRlQnJvd3NlQnV0dG9uIik7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQlTdHJpbmcgY29ycmVjdFBhdGggPSBnZXRGaWVsZENvbnRlbnQocHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJaWYgKGNvcnJlY3RQYXRoICE9IG51bGwpIHsKLQkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoY29ycmVjdFBhdGgpOwotCQkJCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKHBhdGguaXNGaWxlKCkgPyBjb3JyZWN0UGF0aCA6IHBhdGgKLQkJCQkJCQkJLmdldFBhcmVudCgpKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgc2VsZWN0ZWRQYXRoID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWRQYXRoICE9IG51bGwpCi0JCQkJCXByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0LnNldFRleHQoc2VsZWN0ZWRQYXRoKTsKLQkJCX0KLQkJCXVwZGF0ZUNvbmZpZ09wdGlvbnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldE1vZGlmaWVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJIFN5c3RlbS5lcnIucHJpbnRsbigid2l6YXJkOiB3aWRnZXRNb2RpZmllZCBlbnRlcmVkIik7Ci0JCQl1cGRhdGVDb25maWdPcHRpb25zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLS8vCQkJIFN5c3RlbS5lcnIucHJpbnRsbigicHJlZmVyZW5jZXM6IG1vZGlmeVRleHQgZW50ZXJlZCIpOwotCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJ3aWRnZXQgZW50ZXJlZCBpcyAiKyBlLndpZGdldC50b1N0cmluZygpKTsKLQkJCWlmIChlLndpZGdldC5lcXVhbHMocHJveHlQb2xsaW5nSm9iKSkgewotCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigid2lkZ2V0IGVudGVyZWQgaXMgcHJveHlQb2xsaW5nSm9iIik7Ci0JCQl9Ci0JCQlpZiAoZS53aWRnZXQuZXF1YWxzKHByb3h5UG9sbGluZ05vZGVNaW4pKSB7Ci0JCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJ3aWRnZXQgZW50ZXJlZCBpcyBwcm94eVBvbGxpbmdOb2RlTWluIik7Ci0JCQkJaW50IG1pbl92YWx1ZSA9IHByb3h5UG9sbGluZ05vZGVNaW4uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IG1heF92YWx1ZSA9IHByb3h5UG9sbGluZ05vZGVNYXguZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKG1pbl92YWx1ZSA+IG1heF92YWx1ZSkgewotCQkJCQlwcm94eVBvbGxpbmdOb2RlTWF4LnNldFNlbGVjdGlvbihtaW5fdmFsdWUpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKGUud2lkZ2V0LmVxdWFscyhwcm94eVBvbGxpbmdOb2RlTWF4KSkgewotCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigid2lkZ2V0IGVudGVyZWQgaXMgcHJveHlQb2xsaW5nTm9kZU1heCIpOwotCQkJCWludCBtaW5fdmFsdWUgPSBwcm94eVBvbGxpbmdOb2RlTWluLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBtYXhfdmFsdWUgPSBwcm94eVBvbGxpbmdOb2RlTWF4LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChtYXhfdmFsdWUgPCBtaW5fdmFsdWUpIHsKLQkJCQkJcHJveHlQb2xsaW5nTm9kZU1pbi5zZXRTZWxlY3Rpb24obWF4X3ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZS53aWRnZXQuZXF1YWxzKHByb3h5TGlicmFyeVRleHRXaWRnZXQpKSB7Ci0vLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIndpZGdldCBlbnRlcmVkIGlzIHByb3h5TGlicmFyeVRleHRXaWRnZXQiKTsKLQkJCQlTdHJpbmcgY29ycmVjdFBhdGggPSBnZXRGaWVsZENvbnRlbnQocHJveHlMaWJyYXJ5VGV4dFdpZGdldC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQlpZiAoY29ycmVjdFBhdGggIT0gbnVsbCkgewotCQkJCQlGaWxlIHBhdGggPSBuZXcgRmlsZShjb3JyZWN0UGF0aCk7Ci0JCQkJCWlmIChwYXRoLmV4aXN0cygpICYmIChwYXRoLmlzRGlyZWN0b3J5KCkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMKLQkJCQkJCQkJLmdldFN0cmluZygiSW52YWxpZC5sbExpYnJhcnlQYXRoIikpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGUud2lkZ2V0LmVxdWFscyhwcm94eVRlbXBsYXRlVGV4dFdpZGdldCkpIHsKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigid2lkZ2V0IGVudGVyZWQgaXMgcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQiKTsKLQkJCQlTdHJpbmcgY29ycmVjdFBhdGggPSBnZXRGaWVsZENvbnRlbnQocHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJaWYgKGNvcnJlY3RQYXRoICE9IG51bGwpIHsKLQkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoY29ycmVjdFBhdGgpOwotCQkJCQlpZiAocGF0aC5leGlzdHMoKSAmJiAocGF0aC5pc0ZpbGUoKSkpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcwotCQkJCQkJCQkuZ2V0U3RyaW5nKCJJbnZhbGlkLmxsSm9iQ29tbWFuZEZpbGVUZW1wbGF0ZSIpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCQkJdXBkYXRlQ29uZmlnT3B0aW9ucygpOwotCQkJLy8gVE9ETyAtIGNoZWNrIGZvciB2YWxpZCBmaWxlIGhlcmUgLSBvciBlbHNlIGltcGxlbWVudCBhIGJyb3dzZQotCQkJLy8gYnV0dG9uIHRvIHNlbGVjdCBhbmQgY2hlY2sgc29tZXdoZXJlCi0KLQkJfQotCX0KLQotCXB1YmxpYyBJQk1MTFJlc291cmNlTWFuYWdlck9wdGlvbldpemFyZFBhZ2UoUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkLkludm9jYXRpb25PcHRpb25zVGl0bGUiKSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkLkludm9jYXRpb25PcHRpb25zVGl0bGUiKSk7Ci0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkLkludm9jYXRpb25PcHRpb25zIikpOwotCQljb25mV2l6YXJkID0gZ2V0Q29uZmlndXJhdGlvbldpemFyZCgpOwotCQljb25maWcgPSAoQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mV2l6YXJkCi0JCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG9iamVjdCBmb3IgdGhlIElCTUxMIGltcGxlbWVudGF0aW9uCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZXMgb2JqZWN0Ci0JICovCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSUJNTExQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgd2lkZ2V0cyBmb3IgdGhpcyBwcm94eSBjb25maWd1cmF0aW9uIHBhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgd2lkZ2V0IGZvciB0aGlzIGNsYXNzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJR3JvdXAgcHJveHlMaWJyYXJ5R3JvdXAgPSBudWxsOwotCQlHcm91cCBwcm94eU9wdGlvbnNHcm91cCA9IG51bGw7Ci0JCUdyb3VwIHByb3h5RGVidWdHcm91cCA9IG51bGw7Ci0JCUdyb3VwIGd1aU9wdGlvbnNHcm91cCA9IG51bGw7Ci0JCUdyb3VwIHByb3h5TXVsdGljbHVzdGVyR3JvdXAgPSBudWxsOwotCQlHcm91cCBwcm94eVRlbXBsYXRlR3JvdXAgPSBudWxsOwotCQlHcm91cCBwcm94eVRlbXBsYXRlT3B0aW9uc0dyb3VwID0gbnVsbDsKLQkJR3JvdXAgcHJveHlQb2xsaW5nR3JvdXAgPSBudWxsOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0JCWxpYnJhcnlCcm93c2VCdXR0b24gPSBudWxsOwotCQl0ZW1wbGF0ZUJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JCVN0cmluZyBwcmVmZXJlbmNlVmFsdWU7Ci0KLQkJcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlldmVudE1vbml0b3IgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQ7Ci0KLQkJcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlwcmVmZXJlbmNlUGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCQlwcmVmZXJlbmNlUGFuZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gQWx0ZXJuYXRlIExvYWRMZXZlbGVyIExpYnJhcnkgSW5zdGFsbCBMb2NhdGlvbgotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlMaWJyYXJ5R3JvdXAgPSBuZXcgR3JvdXAoKENvbXBvc2l0ZSkgcHJlZmVyZW5jZVBhbmUsIFNXVC5OT05FKTsKLQkJcHJveHlMaWJyYXJ5R3JvdXAuc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoMywgZmFsc2UsIDAsIDApKTsKLQkJcHJveHlMaWJyYXJ5R3JvdXAuc2V0TGF5b3V0RGF0YShzcGFuR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLAotCQkJCTUpKTsKLQkJcHJveHlMaWJyYXJ5R3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlMaWJyYXJ5R3JvdXBMYWJlbCIpKTsKLQotCQluZXcgTGFiZWwocHJveHlMaWJyYXJ5R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eUxpYnJhcnlMYWJlbCIpKTsKLQotCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0ID0gbmV3IFRleHQocHJveHlMaWJyYXJ5R3JvdXAsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5CT1JERVIpOwotCQlwcm94eUxpYnJhcnlUZXh0V2lkZ2V0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0JCXByb3h5TGlicmFyeVRleHRXaWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJcHJveHlMaWJyYXJ5VGV4dFdpZGdldAotCQkJCS5zZXRUZXh0KHByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9MT0FETEVWRUxFUl9MSUJSQVJZX1BBVEgpKTsKLQkJcHJveHlMaWJyYXJ5VGV4dFdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlMaWJyYXJ5VG9vbFRpcCIpKTsKLQotCQkgbGlicmFyeUJyb3dzZUJ1dHRvbiA9Ci0JCQkgU1dUVXRpbC5jcmVhdGVQdXNoQnV0dG9uKHByb3h5TGlicmFyeUdyb3VwLCBNZXNzYWdlcwotCQkJIC5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuYnJvd3NlQnV0dG9uIiksCi0JCQkgbnVsbCk7Ci0JCQkgbGlicmFyeUJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBDaGVjayBib3ggZ3JvdXAgZm9yIHByb3h5IG1lc3NhZ2VzCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlwcm94eU9wdGlvbnNHcm91cCA9IG5ldyBHcm91cCgoQ29tcG9zaXRlKSBwcmVmZXJlbmNlUGFuZSwgU1dULk5PTkUpOwotCQlwcm94eU9wdGlvbnNHcm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJcHJveHlPcHRpb25zR3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlPcHRpb25zR3JvdXBMYWJlbCIpKTsKLQotCQlwcm94eVRyYWNlTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByb3h5VHJhY2VNZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5VHJhY2VNZXNzYWdlTGFiZWwiKSk7Ci0JCXByb3h5VHJhY2VNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eVRyYWNlTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfVFJBQ0VfTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eVRyYWNlTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIHByb3h5VHJhY2VNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJcHJveHlJbmZvTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByb3h5SW5mb01lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlJbmZvTWVzc2FnZUxhYmVsIikpOwotCQlwcm94eUluZm9NZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eUluZm9NZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9JTkZPX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJcHJveHlJbmZvTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIHByb3h5SW5mb01lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQlwcm94eVdhcm5pbmdNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJcHJveHlXYXJuaW5nTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eVdhcm5pbmdNZXNzYWdlTGFiZWwiKSk7Ci0JCXByb3h5V2FybmluZ01lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5V2FybmluZ01lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1dBUk5JTkdfTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eVdhcm5pbmdNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkgcHJveHlXYXJuaW5nTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCXByb3h5RXJyb3JNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJcHJveHlFcnJvck1lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlFcnJvck1lc3NhZ2VMYWJlbCIpKTsKLQkJcHJveHlFcnJvck1lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5RXJyb3JNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9FUlJPUl9NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCXByb3h5RXJyb3JNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkgcHJveHlFcnJvck1lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQlwcm94eUZhdGFsTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByb3h5RmF0YWxNZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5RmF0YWxNZXNzYWdlTGFiZWwiKSk7Ci0JCXByb3h5RmF0YWxNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eUZhdGFsTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfRkFUQUxfTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIHByb3h5RmF0YWxNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJcHJveHlBcmdzTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByb3h5QXJnc01lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuUHJveHlBcmdzTWVzc2FnZUxhYmVsIikpOwotCQlwcm94eUFyZ3NNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eUFyZ3NNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9BUkdTX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJcHJveHlBcmdzTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIHByb3h5QXJnc01lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gQ2hlY2sgYm94IGdyb3VwIGZvciBwcm94eSBkZWJ1ZwotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlEZWJ1Z0dyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCXByb3h5RGVidWdHcm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJcHJveHlEZWJ1Z0dyb3VwLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5RGVidWdHcm91cExhYmVsIikpOwotCi0JCXByb3h5RGVidWdMb29wQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eURlYnVnR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByb3h5RGVidWdMb29wQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLlByb3h5RGVidWdMb29wTGFiZWwiKSk7Ci0JCXByb3h5RGVidWdMb29wQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5Qcm94eURlYnVnTG9vcFRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfREVCVUdfTE9PUCk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eURlYnVnTG9vcEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIHByb3h5RGVidWdMb29wQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIENoZWNrIGJveCBncm91cCBmb3IgZ3VpIG1lc3NhZ2VzCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlndWlPcHRpb25zR3JvdXAgPSBuZXcgR3JvdXAoKENvbXBvc2l0ZSkgcHJlZmVyZW5jZVBhbmUsIFNXVC5OT05FKTsKLQkJZ3VpT3B0aW9uc0dyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlndWlPcHRpb25zR3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuZ3VpT3B0aW9uc0dyb3VwTGFiZWwiKSk7Ci0KLQkJZ3VpVHJhY2VNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aVRyYWNlTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlUcmFjZU1lc3NhZ2VMYWJlbCIpKTsKLQkJZ3VpVHJhY2VNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlUcmFjZU1lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9UUkFDRV9NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCWd1aVRyYWNlTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIGd1aVRyYWNlTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCWd1aUluZm9NZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aUluZm9NZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aUluZm9NZXNzYWdlTGFiZWwiKSk7Ci0JCWd1aUluZm9NZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlJbmZvTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0lORk9fTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlndWlJbmZvTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIGd1aUluZm9NZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJZ3VpV2FybmluZ01lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGd1aU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJZ3VpV2FybmluZ01lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UuR3VpV2FybmluZ01lc3NhZ2VMYWJlbCIpKTsKLQkJZ3VpV2FybmluZ01lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aVdhcm5pbmdNZXNzYWdlVG9vbFRpcCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfV0FSTklOR19NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCWd1aVdhcm5pbmdNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkgZ3VpV2FybmluZ01lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQlndWlFcnJvck1lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGd1aU9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJZ3VpRXJyb3JNZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aUVycm9yTWVzc2FnZUxhYmVsIikpOwotCQlndWlFcnJvck1lc3NhZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aUVycm9yTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0VSUk9SX01FU1NBR0UpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJZ3VpRXJyb3JNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkgZ3VpRXJyb3JNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJZ3VpRmF0YWxNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlGYXRhbE1lc3NhZ2VMYWJlbCIpKTsKLQkJZ3VpRmF0YWxNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlGYXRhbE1lc3NhZ2VUb29sVGlwIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkdVSV9GQVRBTF9NRVNTQUdFKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCWd1aUZhdGFsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIGd1aUZhdGFsTWVzc2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCWd1aUFyZ3NNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihndWlPcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWd1aUFyZ3NNZXNzYWdlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLkd1aUFyZ3NNZXNzYWdlTGFiZWwiKSk7Ci0JCWd1aUFyZ3NNZXNzYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5HdWlBcmdzTWVzc2FnZVRvb2xUaXAiKSk7Ci0JCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzCi0JCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuR1VJX0FSR1NfTUVTU0FHRSk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlndWlBcmdzTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIGd1aUFyZ3NNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIFJhZGlvIGJveCBncm91cCBmb3IgbXVsdGljbHVzdGVyCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlwcm94eU11bHRpY2x1c3Rlckdyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCXByb3h5TXVsdGljbHVzdGVyR3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCXByb3h5TXVsdGljbHVzdGVyR3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlNdWx0aWNsdXN0ZXJHcm91cExhYmVsIikpOwotCi0JCXByb3h5TExEZWZhdWx0UmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHByb3h5TXVsdGljbHVzdGVyR3JvdXAsCi0JCQkJU1dULlJBRElPKTsKLQkJcHJveHlMTERlZmF1bHRSYWRpb0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckRlZmF1bHRMYWJlbCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9ERUZBVUxUX01VTFRJQ0xVU1RFUik7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoU1dULklNQUdFX0JNUCkpOwotCQkgcHJveHlMTERlZmF1bHRSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQlwcm94eUxMRGVmYXVsdFJhZGlvQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eU11bHRpY2x1c3RlckRlZmF1bHRUb29sVGlwIikpOwotCi0JCXByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU11bHRpY2x1c3Rlckdyb3VwLAotCQkJCVNXVC5SQURJTyk7Ci0JCXByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5TXVsdGljbHVzdGVyRm9yY2VMb2NhbExhYmVsIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0ZPUkNFX0xPQ0FMKTsKLQkJaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLkxMX1lFUykpIHsKLQkJCXByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQlwcm94eUZvcmNlTG9jYWxSYWRpb0J1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVApKTsKLQkJIHByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JCXByb3h5Rm9yY2VMb2NhbFJhZGlvQnV0dG9uCi0JCQkJLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5TXVsdGljbHVzdGVyRm9yY2VMb2NhbFRvb2xUaXAiKSk7Ci0KLQkJcHJveHlGb3JjZU11bHRpY2x1c3RlclJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eU11bHRpY2x1c3Rlckdyb3VwLAotCQkJCVNXVC5SQURJTyk7Ci0JCXByb3h5Rm9yY2VNdWx0aWNsdXN0ZXJSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5TXVsdGljbHVzdGVyRm9yY2VNdWx0aWNsdXN0ZXJMYWJlbCIpKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9GT1JDRV9NVUxUSUNMVVNURVIpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuTExfWUVTKSkgewotCQkJcHJveHlGb3JjZU11bHRpY2x1c3RlclJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQlwcm94eUZvcmNlTXVsdGljbHVzdGVyUmFkaW9CdXR0b24uc2V0RGF0YShuZXcgSW50ZWdlcihTV1QuSU1BR0VfQk1QKSk7Ci0JCSBwcm94eUZvcmNlTXVsdGljbHVzdGVyUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQkJcHJveHlGb3JjZU11bHRpY2x1c3RlclJhZGlvQnV0dG9uCi0JCQkJLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5TXVsdGljbHVzdGVyRm9yY2VNdWx0aWNsdXN0ZXJUb29sVGlwIikpOwotCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBUZW1wbGF0ZSBuYW1lIGdyb3VwCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlwcm94eVRlbXBsYXRlR3JvdXAgPSBuZXcgR3JvdXAoKENvbXBvc2l0ZSkgcHJlZmVyZW5jZVBhbmUsIFNXVC5OT05FKTsKLQkJcHJveHlUZW1wbGF0ZUdyb3VwLnNldExheW91dChjcmVhdGVHcmlkTGF5b3V0KDMsIGZhbHNlLCAwLCAwKSk7Ci0JCXByb3h5VGVtcGxhdGVHcm91cC5zZXRMYXlvdXREYXRhKHNwYW5HcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsCi0JCQkJNSkpOwotCQlwcm94eVRlbXBsYXRlR3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZUdyb3VwTGFiZWwiKSk7Ci0KLQkJbmV3IExhYmVsKHByb3h5VGVtcGxhdGVHcm91cCwgU1dULk5PTkUpLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVMYWJlbCIpKTsKLQotCQlwcm94eVRlbXBsYXRlVGV4dFdpZGdldCA9IG5ldyBUZXh0KHByb3h5VGVtcGxhdGVHcm91cCwgU1dULlNJTkdMRQotCQkJCXwgU1dULkJPUkRFUik7Ci0JCXByb3h5VGVtcGxhdGVUZXh0V2lkZ2V0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZW1wbGF0ZUxpc3RlbmVyID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCQlwcm94eVRlbXBsYXRlVGV4dFdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcih0ZW1wbGF0ZUxpc3RlbmVyKTsKLQkJcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQKLQkJCQkuc2V0VGV4dChwcmVmZXJlbmNlcwotCQkJCQkJLmdldFN0cmluZyhJQk1MTFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfTE9BRExFVkVMRVJfVEVNUExBVEVfRklMRSkpOwotCQlwcm94eVRlbXBsYXRlVGV4dFdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZVRvb2xUaXAiKSk7Ci0KLQkJIHRlbXBsYXRlQnJvd3NlQnV0dG9uID0KLQkJCSBTV1RVdGlsLmNyZWF0ZVB1c2hCdXR0b24ocHJveHlUZW1wbGF0ZUdyb3VwLAotCQkJIE1lc3NhZ2VzLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5icm93c2VCdXR0b24iKSwKLQkJCSBudWxsKTsKLQkJCSB0ZW1wbGF0ZUJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0ZW1wbGF0ZUxpc3RlbmVyKTsKLQotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gVGVtcGxhdGUgb3B0aW9ucyBncm91cAotCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJcHJveHlUZW1wbGF0ZU9wdGlvbnNHcm91cCA9IG5ldyBHcm91cCgoQ29tcG9zaXRlKSBwcmVmZXJlbmNlUGFuZSwKLQkJCQlTV1QuTk9ORSk7Ci0JCXByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCXByb3h5VGVtcGxhdGVPcHRpb25zR3JvdXAuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZU9wdGlvbnNHcm91cExhYmVsIikpOwotCi0JCXByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwcm94eVRlbXBsYXRlT3B0aW9uc0dyb3VwLAotCQkJCVNXVC5SQURJTyk7Ci0JCXByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVOZXZlckxhYmVsIikpOwotCQlwcm94eVRlbXBsYXRlTmV2ZXJSYWRpb0J1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVApKTsKLQkJcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMKLQkJCQkuZ2V0U3RyaW5nKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9XUklURV9URU1QTEFURV9ORVZFUik7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eVRlbXBsYXRlTmV2ZXJSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJIHByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JCXByb3h5VGVtcGxhdGVOZXZlclJhZGlvQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVRlbXBsYXRlTmV2ZXJUb29sVGlwIikpOwotCi0JCXByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocHJveHlUZW1wbGF0ZU9wdGlvbnNHcm91cCwKLQkJCQlTV1QuUkFESU8pOwotCQlwcm94eVRlbXBsYXRlQWx3YXlzUmFkaW9CdXR0b24uc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlUZW1wbGF0ZUFsd2F5c0xhYmVsIikpOwotCQlwcmVmZXJlbmNlVmFsdWUgPSBwcmVmZXJlbmNlcwotCQkJCS5nZXRTdHJpbmcoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1dSSVRFX1RFTVBMQVRFX0FMV0FZUyk7Ci0JCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5MTF9ZRVMpKSB7Ci0JCQlwcm94eVRlbXBsYXRlQWx3YXlzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCXByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVApKTsKLQkJIHByb3h5VGVtcGxhdGVBbHdheXNSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCQlwcm94eVRlbXBsYXRlQWx3YXlzUmFkaW9CdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5VGVtcGxhdGVBbHdheXNUb29sVGlwIikpOwotCi0JCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyBQb2xsaW5nIG9wdGlvbnMgZ3JvdXAKLQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCXByb3h5UG9sbGluZ0dyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuTk9ORSk7Ci0JCXByb3h5UG9sbGluZ0dyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlwcm94eVBvbGxpbmdHcm91cC5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdHcm91cExhYmVsIikpOwotCi0JCW5ldyBMYWJlbChwcm94eVBvbGxpbmdHcm91cCwgU1dULk5PTkUpLnNldFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ05vZGVNaW5MYWJlbCIpKTsKLQotCQlwcm94eVBvbGxpbmdOb2RlTWluID0gbmV3IFNwaW5uZXIocHJveHlQb2xsaW5nR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlwcm94eVBvbGxpbmdOb2RlTWluLnNldEluY3JlbWVudCgxMCk7Ci0JCXByb3h5UG9sbGluZ05vZGVNaW4uc2V0TWluaW11bSgzMCk7Ci0JCXByb3h5UG9sbGluZ05vZGVNaW4uc2V0TWF4aW11bSgzMDApOwotCQlwcm94eVBvbGxpbmdOb2RlTWluLnNldFBhZ2VJbmNyZW1lbnQoNTApOwotCQlwcm94eVBvbGxpbmdOb2RlTWluLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcwotCQkJCS5nZXRJbnQoSUJNTExQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX01JTl9OT0RFX1BPTExJTkcpKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1pbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlQb2xsaW5nTm9kZU1pblRvb2xUaXAiKSk7Ci0JCXByb3h5UG9sbGluZ05vZGVNaW4uYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQotCQluZXcgTGFiZWwocHJveHlQb2xsaW5nR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzCi0JCQkJLmdldFN0cmluZygiSUJNTExQcmVmV2l6UGFnZS5wcm94eVBvbGxpbmdOb2RlTWF4TGFiZWwiKSk7Ci0KLQkJcHJveHlQb2xsaW5nTm9kZU1heCA9IG5ldyBTcGlubmVyKHByb3h5UG9sbGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1heC5zZXRJbmNyZW1lbnQoMTApOwotCQlwcm94eVBvbGxpbmdOb2RlTWF4LnNldE1pbmltdW0oMzApOwotCQlwcm94eVBvbGxpbmdOb2RlTWF4LnNldE1heGltdW0oNTAwKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1heC5zZXRQYWdlSW5jcmVtZW50KDUwKTsKLQkJcHJveHlQb2xsaW5nTm9kZU1heC5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW50KElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9NQVhfTk9ERV9QT0xMSU5HKSk7Ci0JCXByb3h5UG9sbGluZ05vZGVNYXguc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ05vZGVNYXhUb29sVGlwIikpOwotCQlwcm94eVBvbGxpbmdOb2RlTWF4LmFkZE1vZGlmeUxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0KLQkJbmV3IExhYmVsKHByb3h5UG9sbGluZ0dyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dChNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIklCTUxMUHJlZldpelBhZ2UucHJveHlQb2xsaW5nSm9iTGFiZWwiKSk7Ci0KLQkJcHJveHlQb2xsaW5nSm9iID0gbmV3IFNwaW5uZXIocHJveHlQb2xsaW5nR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlwcm94eVBvbGxpbmdKb2Iuc2V0SW5jcmVtZW50KDEwKTsKLQkJcHJveHlQb2xsaW5nSm9iLnNldE1pbmltdW0oMzApOwotCQlwcm94eVBvbGxpbmdKb2Iuc2V0TWF4aW11bSgzMDApOwotCQlwcm94eVBvbGxpbmdKb2Iuc2V0UGFnZUluY3JlbWVudCg1MCk7Ci0JCXByb3h5UG9sbGluZ0pvYi5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW50KElCTUxMUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9KT0JfUE9MTElORykpOwotCQlwcm94eVBvbGxpbmdKb2Iuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJJQk1MTFByZWZXaXpQYWdlLnByb3h5UG9sbGluZ0pvYlRvb2xUaXAiKSk7Ci0JCXByb3h5UG9sbGluZ0pvYi5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JCXNldENvbnRyb2wocHJlZmVyZW5jZVBhbmUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBzZXR0aW5ncyBzcGVjaWZpZWQgb24gdGhpcyBwYW5lbCBhbmQgY3JlYXRlIHRoZSBzdHJpbmcKLQkgKiBjb250YWluaW5nIHByb3h5IGludm9jYXRpb24gb3B0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRob3NlIHZhbHVlcwotCSAqIAotCSAqIEByZXR1cm4gU3RhdHVzIGluZGljYXRpbmcgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlQ29uZmlnT3B0aW9ucygpIHsKLQkJU3RyaW5nIG9wdGlvbnM7Ci0KLQkJb3B0aW9ucyA9ICIiOwotCQlpZiAocHJveHlMaWJyYXJ5VGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlMaWJyYXJ5VGV4dFdpZGdldC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tbGliX292ZXJyaWRlPSIKLQkJCQkJCSsgcHJveHlMaWJyYXJ5VGV4dFdpZGdldC5nZXRUZXh0KCkudHJpbSgpICsgIiAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5VHJhY2VNZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eVRyYWNlTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tdHJhY2VfbWVzc2FnZXM9eSAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5SW5mb01lc3NhZ2VCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHByb3h5SW5mb01lc3NhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlvcHRpb25zID0gb3B0aW9ucyArICItLWluZm9fbWVzc2FnZXM9eSAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5V2FybmluZ01lc3NhZ2VCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHByb3h5V2FybmluZ01lc3NhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlvcHRpb25zID0gb3B0aW9ucyArICItLXdhcm5pbmdfbWVzc2FnZXM9eSAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5RXJyb3JNZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eUVycm9yTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tZXJyb3JfbWVzc2FnZXM9eSAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5RmF0YWxNZXNzYWdlQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eUZhdGFsTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tZmF0YWxfbWVzc2FnZXM9eSAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5QXJnc01lc3NhZ2VCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKHByb3h5QXJnc01lc3NhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlvcHRpb25zID0gb3B0aW9ucyArICItLWFyZ3NfbWVzc2FnZXM9eSAiOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3h5RGVidWdMb29wQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmIChwcm94eURlYnVnTG9vcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tZGVidWdfbG9vcD15ICI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKHByb3h5TExEZWZhdWx0UmFkaW9CdXR0b24gIT0gbnVsbCkKLQkJCQkmJiAocHJveHlGb3JjZUxvY2FsUmFkaW9CdXR0b24gIT0gbnVsbCkKLQkJCQkmJiAocHJveHlGb3JjZU11bHRpY2x1c3RlclJhZGlvQnV0dG9uICE9IG51bGwpKSB7Ci0JCQlpZiAocHJveHlMTERlZmF1bHRSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tbXVsdGljbHVzdGVyPWQgIjsKLQkJCX0gZWxzZSBpZiAocHJveHlGb3JjZUxvY2FsUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlvcHRpb25zID0gb3B0aW9ucyArICItLW11bHRpY2x1c3Rlcj1uICI7Ci0JCQl9IGVsc2UgaWYgKHByb3h5Rm9yY2VNdWx0aWNsdXN0ZXJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tbXVsdGljbHVzdGVyPXkgIjsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm94eVRlbXBsYXRlVGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlvcHRpb25zID0gb3B0aW9ucyArICItLXRlbXBsYXRlX292ZXJyaWRlPSIKLQkJCQkJCSsgcHJveHlUZW1wbGF0ZVRleHRXaWRnZXQuZ2V0VGV4dCgpLnRyaW0oKSArICIgIjsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm94eVRlbXBsYXRlTmV2ZXJSYWRpb0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAocHJveHlUZW1wbGF0ZU5ldmVyUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlvcHRpb25zID0gb3B0aW9ucyArICItLXRlbXBsYXRlX3dyaXRlPW4gIjsKLQkJCX0gZWxzZSBpZiAocHJveHlUZW1wbGF0ZUFsd2F5c1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJb3B0aW9ucyA9IG9wdGlvbnMgKyAiLS10ZW1wbGF0ZV93cml0ZT1hICI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJveHlQb2xsaW5nTm9kZU1pbiAhPSBudWxsKSB7Ci0JCQlvcHRpb25zID0gb3B0aW9ucyArICItLW5vZGVfcG9sbGluZ19taW49IgotCQkJCQkrIHByb3h5UG9sbGluZ05vZGVNaW4uZ2V0U2VsZWN0aW9uKCkgKyAiICI7Ci0JCX0KLQotCQlpZiAocHJveHlQb2xsaW5nTm9kZU1heCAhPSBudWxsKSB7Ci0JCQlvcHRpb25zID0gb3B0aW9ucyArICItLW5vZGVfcG9sbGluZ19tYXg9IgotCQkJCQkrIHByb3h5UG9sbGluZ05vZGVNYXguZ2V0U2VsZWN0aW9uKCkgKyAiICI7Ci0JCX0KLQotCQlpZiAocHJveHlQb2xsaW5nSm9iICE9IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBvcHRpb25zICsgIi0tam9iX3BvbGxpbmc9IgotCQkJCQkrIHByb3h5UG9sbGluZ0pvYi5nZXRTZWxlY3Rpb24oKSArICIgIjsKLQkJfQotCi0vLwkJIFN5c3RlbS5lcnIucHJpbnRsbigiT3B0aW9ucyBmcm9tIHdpemFyZCBwYWdlIGFyZSBub3cgc2V0IHRvOiAiICsKLS8vCQkgb3B0aW9ucyApOwotCi0JCWNvbmZpZy5zZXRJbnZvY2F0aW9uT3B0aW9ucyhvcHRpb25zKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KGludCBjb2x1bW5zLCBib29sZWFuIGlzRXF1YWwsIGludCBtaCwKLQkJCWludCBtdykgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSBjb2x1bW5zOwotCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGlzRXF1YWw7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWg7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSBtdzsKLQkJcmV0dXJuIGdyaWRMYXlvdXQ7Ci0JfQotCi0JcHJvdGVjdGVkIEdyaWREYXRhIHNwYW5HcmlkRGF0YShpbnQgc3R5bGUsIGludCBzcGFjZSkgewotCQlHcmlkRGF0YSBnZCA9IG51bGw7Ci0JCWlmIChzdHlsZSA9PSAtMSkKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWVsc2UKLQkJCWdkID0gbmV3IEdyaWREYXRhKHN0eWxlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFjZTsKLQkJcmV0dXJuIGdkOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkQ29udGVudChTdHJpbmcgdGV4dCkgCi0JewotCQlpZiAodGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCB0ZXh0LmVxdWFscygiIikpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNzIxODkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU5ZDlhMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLnJtc3lzdGVtCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2Fib3V0LmluaSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY3NjJhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2NjkyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTkxTX01FU1NBR0VGT1JNQVRfTk9ORQotIyBOTFNfRU5DT0RJTkc9VVRGLTgKLQotYmx1cmI9UFRQIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3B0cFxuCi0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQwYmY4Yy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIucG5nLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2VjbGlwc2UzMi5wbmcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzM2Y4MGQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgSUJNIFBhcmFsbGVsIEVudmlyb25tZW50IFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5NjllZjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgIC0tPgotPCEtLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAtLT4KLTwhLS0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgLS0+Ci08IS0tIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuY29yZS5yZXNvdXJjZU1hbmFnZXJzIj4KLSAgICAgIDxyZXNvdXJjZU1hbmFnZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUucm1zeXN0ZW0uUEVSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5pYm1wZS5jb3JlLnJlc291cmNlbWFuYWdlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL0FjdGl2YXRvci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOTJjMWFkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICogIAotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL1BFUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL1BFUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNlMzQ5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9QRVByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUEVQcmVmZXJlbmNlQ29uc3RhbnRzCi17Ci0gICAgLy8gVmFsdWVzIG9mIGNvbnN0YW50cyB1c2VkIGFzIHByZWZlcmVuY2Uga2V5cyBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aAotICAgIC8vICdQRV8nIHRvIGVuc3VyZSBubyBjb2xsaXNpb25zIHdpdGggYW55IG90aGVyIHByZWZlcmVuY2Uga2V5cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX05PVEhJTkcgPSAiTm9uZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VfRlVOQ1RJT04gPSAiRnVuY3Rpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX0RFVEFJTCA9ICJEZXRhaWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfTEVWRUxFUl9PUFRJT04gPSAiUEVfdXNlTG9hZExldmVsZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX0xFVkVMID0gIlBFX3RyYWNlTGV2ZWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9NSU5JUFJPWFkgPSAiUEVfcnVuTWluaXByb3h5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0xFVkVMRVJfTU9ERSA9ICJQRV9Mb2FkTGV2ZWxlck1vZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfT1ZFUlJJREUgPSAiUEVfbGlicmFyeU92ZXJyaWRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX01JTl9QT0xMX0lOVEVSVkFMID0gIlBFX05vZGVNaW5Qb2xsSW50ZXJ2YWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfTUFYX1BPTExfSU5URVJWQUwgPSAiUEVfTm9kZU1heFBvbGxJbnRlcnZhbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1BPTExfSU5URVJWQUwgPSAiUEVfSm9iUG9sbEludGVydmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fWUVTID0gIlkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9OTyA9ICJOIjsKLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9QRVByZWZlcmVuY2VNYW5hZ2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2NvcmUvUEVQcmVmZXJlbmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzNkMWQ3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9QRVByZWZlcmVuY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJveHlPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUudWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFBFUHJlZmVyZW5jZU1hbmFnZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfRVhFQ1VUQUJMRV9OQU1FID0gInB0cF9pYm1wZV9wcm94eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0VYRUNVVEFCTEVfUEFUSCA9IG51bGw7IC8vIHVzZSBsb2NhbCBmcmFnbWVudCBkaXJlY3RvcnkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OUyA9IElSZW1vdGVQcm94eU9wdGlvbnMuUE9SVF9GT1JXQVJESU5HOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdE9wdGlvbnMoKQotICAgIHsKLQlyZXR1cm4gT1BUSU9OUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UHJveHlFeGVjdXRhYmxlUGF0aCgpCi0gICAgewotCXJldHVybiBQUk9YWV9FWEVDVVRBQkxFX1BBVEg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpCi0gICAgewotCXJldHVybiBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpCi0gICAgewotCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpCi0gICAgewotCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JU3RyaW5nIHNlcnZlciA9ICIiOwotCi0JaWYgKFBST1hZX0VYRUNVVEFCTEVfUEFUSCAhPSBudWxsKSB7Ci0JICAgIHNlcnZlciA9IG5ldyBQYXRoKFBST1hZX0VYRUNVVEFCTEVfUEFUSCkuYXBwZW5kKFBST1hZX0VYRUNVVEFCTEVfTkFNRSkudG9PU1N0cmluZygpOwotCX0gZWxzZSB7Ci0JICAgIHNlcnZlciA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvY2F0ZUZyYWdtZW50RmlsZSgib3JnLmVjbGlwc2UucHRwIiwgUFJPWFlfRVhFQ1VUQUJMRV9OQU1FKTsKLQkgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCXNlcnZlciA9ICIiOwotCSAgICB9Ci0JfQotCi0JcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1BBVEgsIHNlcnZlcik7Ci0JcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTlMsIE9QVElPTlMpOwotCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkxPQURfTEVWRUxFUl9PUFRJT04sIFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fTk8pOwotCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkxPQURfTEVWRUxFUl9NT0RFLCAiZCIpOwotCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkpPQl9QT0xMX0lOVEVSVkFMLCAiMzAiKTsKLQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBFUHJlZmVyZW5jZUNvbnN0YW50cy5OT0RFX01JTl9QT0xMX0lOVEVSVkFMLCAiMzAiKTsKLQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBFUHJlZmVyZW5jZUNvbnN0YW50cy5OT0RFX01BWF9QT0xMX0lOVEVSVkFMLCAiMTIwIik7Ci0JcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQRVByZWZlcmVuY2VDb25zdGFudHMuTElCUkFSWV9PVkVSUklERSwgIiIpOwotCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlJVTl9NSU5JUFJPWFksIFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fWUVTKTsKLQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBFUHJlZmVyZW5jZUNvbnN0YW50cy5UUkFDRV9MRVZFTCwgUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlRSQUNFX05PVEhJTkcpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2NvcmUvcm1zeXN0ZW0vUEVSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ybXN5c3RlbS9QRVJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTc0OGIxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ybXN5c3RlbS9QRVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqIAotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE5vZGVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLnJ0c3lzdGVtLlBFUHJveHlSdW50aW1lQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5ydHN5c3RlbS5QRVJ1bnRpbWVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJ0c3lzdGVtLklSdW50aW1lU3lzdGVtOwotCi1wdWJsaWMgY2xhc3MgUEVSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIgewotCi0JcHJpdmF0ZSBJbnRlZ2VyIFBFUk1JRDsKLQkKLQlwdWJsaWMgUEVSZXNvdXJjZU1hbmFnZXIoSW50ZWdlciBpZCwgSVBVbml2ZXJzZUNvbnRyb2wgdW5pdmVyc2UsIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihpZC50b1N0cmluZygpLCB1bml2ZXJzZSwgY29uZmlnKTsKLQkJUEVSTUlEID0gaWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UHJveHlSZXNvdXJjZU1hbmFnZXIjZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RQcm94eVJlc291cmNlTWFuYWdlciNkb0FmdGVyT3BlbkNvbm5lY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWZ0ZXJPcGVuQ29ubmVjdGlvbigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RQcm94eVJlc291cmNlTWFuYWdlciNkb0JlZm9yZUNsb3NlQ29ubmVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVDbG9zZUNvbm5lY3Rpb24oKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UHJveHlSZXNvdXJjZU1hbmFnZXIjZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlSm9iKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUEpvYkNvbnRyb2wgZG9DcmVhdGVKb2IoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIFN0cmluZyBqb2JJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3Sm9iKHF1ZXVlLCBqb2JJZCwgYXR0cnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVNYWNoaW5lKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVBNYWNoaW5lQ29udHJvbCBkb0NyZWF0ZU1hY2hpbmUoU3RyaW5nIG1hY2hpbmVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3TWFjaGluZShtYWNoaW5lSWQsIGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlTm9kZShvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBNYWNoaW5lQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUE5vZGVDb250cm9sIGRvQ3JlYXRlTm9kZShJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIFN0cmluZyBub2RlSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsKLQkJcmV0dXJuIG5ld05vZGUobWFjaGluZSwgbm9kZUlkLCBhdHRycyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVByb2Nlc3Mob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQSm9iQ29udHJvbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUFByb2Nlc3NDb250cm9sIGRvQ3JlYXRlUHJvY2VzcyhJUEpvYkNvbnRyb2wgam9iLCBTdHJpbmcgcHJvY2Vzc0lkLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiBuZXdQcm9jZXNzKGpvYiwgcHJvY2Vzc0lkLCBhdHRycyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVF1ZXVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVBRdWV1ZUNvbnRyb2wgZG9DcmVhdGVRdWV1ZShTdHJpbmcgcXVldWVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gbmV3UXVldWUocXVldWVJZCwgYXR0cnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVSdW50aW1lU3lzdGVtKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVTeXN0ZW0gZG9DcmVhdGVSdW50aW1lU3lzdGVtKCkgewotCQlQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOwotCQkvKiBsb2FkIHVwIHRoZSBjb250cm9sIGFuZCBtb25pdG9yaW5nIHN5c3RlbXMgZm9yIE9NUEkgKi8KLQkJUEVQcm94eVJ1bnRpbWVDbGllbnQgcnVudGltZVByb3h5ID0gbmV3IFBFUHJveHlSdW50aW1lQ2xpZW50KGNvbmZpZywgUEVSTUlEKTsKLQkJcmV0dXJuIG5ldyBQRVJ1bnRpbWVTeXN0ZW0ocnVudGltZVByb3h5LCBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlSm9icyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlSm9icyhJUFF1ZXVlQ29udHJvbCBxdWV1ZSwgQ29sbGVjdGlvbjxJUEpvYkNvbnRyb2w+IGpvYnMsCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiB1cGRhdGVKb2JzKHF1ZXVlLCBqb2JzLCBhdHRycyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZU1hY2hpbmVzKGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVNYWNoaW5lcyhDb2xsZWN0aW9uPElQTWFjaGluZUNvbnRyb2w+IG1hY2hpbmVzLAotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gdXBkYXRlTWFjaGluZXMobWFjaGluZXMsIGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlTm9kZXMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQTWFjaGluZUNvbnRyb2wsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVOb2RlcyhJUE1hY2hpbmVDb250cm9sIG1hY2hpbmUsIAotCQkJQ29sbGVjdGlvbjxJUE5vZGVDb250cm9sPiBub2RlcywgQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gdXBkYXRlTm9kZXMobWFjaGluZSwgbm9kZXMsIGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlUHJvY2Vzc2VzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2wsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVQcm9jZXNzZXMoSVBKb2JDb250cm9sIGpvYiwKLQkJCUNvbGxlY3Rpb248SVBQcm9jZXNzQ29udHJvbD4gcHJvY2Vzc2VzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7Ci0JCXJldHVybiB1cGRhdGVQcm9jZXNzZXMoam9iLCBwcm9jZXNzZXMsIGF0dHJzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvVXBkYXRlUXVldWVzKGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVRdWV1ZXMoQ29sbGVjdGlvbjxJUFF1ZXVlQ29udHJvbD4gcXVldWVzLAotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRycykgewotCQlyZXR1cm4gdXBkYXRlUXVldWVzKHF1ZXVlcywgYXR0cnMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ybXN5c3RlbS9QRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ybXN5c3RlbS9QRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2MwZjgwYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2NvcmUvcm1zeXN0ZW0vUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNSAKLSAqIAotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotZmluYWwgcHVibGljIGNsYXNzIFBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbgotewotCi0gICAgCS8vIFZhbHVlcyBvZiB0YWdzIHVzZWQgYXMgbWVtZW50byBrZXlzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoICdQRV8nIHRvIGVuc3VyZSBubwotICAgIAkvLyBjb2xsaXNpb25zIHdpdGggb3RoZXIgcHJveHkncyBzZXR0aW5ncwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVNFX0xPQURMRVZFTEVSID0gIlBFX1VzZUxvYWRMZXZlbGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFQlVHX0xFVkVMID0gIlBFX0RlYnVnTGV2ZWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUlVOX01JTklQUk9YWSA9ICJQRV9SdW5NaW5pcHJveHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU1VTUEVORF9QUk9YWSA9ICJQRV9TdXNwZW5kUHJveHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTE9BRExFVkVMRVJfTU9ERSA9ICJQRV9Mb2FkTGV2ZWxlck1vZGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUlOX05PREVfUE9MTF9JTlRFUlZBTCA9ICJQRV9Ob2RlTWluUG9sbEludGVydmFsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX01BWF9OT0RFX1BPTExfSU5URVJWQUwgPSAiUEVfTm9kZU1heFBvbGxJbnRlcnZhbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19KT0JfUE9MTF9JTlRFUlZBTCA9ICJQRV9Kb2JQb2xsSW50ZXJ2YWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTElCUkFSWV9PVkVSUklERSA9ICJQRV9MaWJyYXJ5T3ZlcnJpZGUiOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZUxvYWRMZXZlbGVyOwotICAgIHByaXZhdGUgU3RyaW5nIHJ1bk1pbmlwcm94eTsKLSAgICBwcml2YXRlIFN0cmluZyBkZWJ1Z0xldmVsOwotICAgIHByaXZhdGUgU3RyaW5nIHN1c3BlbmRQcm94eTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2FkTGV2ZWxlck1vZGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbm9kZU1pblBvbGxJbnRlcnZhbDsKLSAgICBwcml2YXRlIFN0cmluZyBub2RlTWF4UG9sbEludGVydmFsOwotICAgIHByaXZhdGUgU3RyaW5nIGpvYlBvbGxJbnRlcnZhbDsKLSAgICBwcml2YXRlIFN0cmluZyBsaWJyYXJ5T3ZlcnJpZGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWQoUEVSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnksIElNZW1lbnRvIG1lbWVudG8pCi0gICAgewotCi0JUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZzsKLQlTdHJpbmcgdXNlTG9hZExldmVsZXI7Ci0JU3RyaW5nIHJ1bk1pbmlwcm94eTsKLQlTdHJpbmcgZGVidWdMZXZlbDsKLQlTdHJpbmcgc3VzcGVuZFByb3h5OwotCVN0cmluZyBsb2FkTGV2ZWxlck1vZGU7Ci0JU3RyaW5nIG5vZGVNaW5Qb2xsSW50ZXJ2YWw7Ci0JU3RyaW5nIG5vZGVNYXhQb2xsSW50ZXJ2YWw7Ci0JU3RyaW5nIGpvYlBvbGxJbnRlcnZhbDsKLQlTdHJpbmcgbGlicmFyeU92ZXJyaWRlOwotCi0JcmVtb3RlQ29uZmlnID0gbG9hZFJlbW90ZShmYWN0b3J5LCBtZW1lbnRvKTsKLQl1c2VMb2FkTGV2ZWxlciA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19VU0VfTE9BRExFVkVMRVIpOwotCXJ1bk1pbmlwcm94eSA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19SVU5fTUlOSVBST1hZKTsKLQlkZWJ1Z0xldmVsID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0RFQlVHX0xFVkVMKTsKLQlzdXNwZW5kUHJveHkgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfU1VTUEVORF9QUk9YWSk7Ci0Jbm9kZU1pblBvbGxJbnRlcnZhbCA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19NSU5fTk9ERV9QT0xMX0lOVEVSVkFMKTsKLQlub2RlTWF4UG9sbEludGVydmFsID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX01BWF9OT0RFX1BPTExfSU5URVJWQUwpOwotCWpvYlBvbGxJbnRlcnZhbCA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19KT0JfUE9MTF9JTlRFUlZBTCk7Ci0JbGlicmFyeU92ZXJyaWRlID0gbWVtZW50by5nZXRTdHJpbmcoVEFHX0xJQlJBUllfT1ZFUlJJREUpOwotCWxvYWRMZXZlbGVyTW9kZSA9IG1lbWVudG8uZ2V0U3RyaW5nKFRBR19MT0FETEVWRUxFUl9NT0RFKTsKLQlQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihmYWN0b3J5LCByZW1vdGVDb25maWcsCi0JCXVzZUxvYWRMZXZlbGVyLCBydW5NaW5pcHJveHksIGRlYnVnTGV2ZWwsIHN1c3BlbmRQcm94eSwgbG9hZExldmVsZXJNb2RlLCBsaWJyYXJ5T3ZlcnJpZGUsIAotCQlub2RlTWluUG9sbEludGVydmFsLCBub2RlTWF4UG9sbEludGVydmFsLCBqb2JQb2xsSW50ZXJ2YWwpOwotCi0JcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKFBFUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LCBSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnLAotCSAgICBTdHJpbmcgdXNlTG9hZExldmVsZXIsIFN0cmluZyBydW5NaW5pcHJveHksIFN0cmluZyBkZWJ1Z0xldmVsLCBTdHJpbmcgc3VzcGVuZFByb3h5LAotCSAgICBTdHJpbmcgbG9hZExldmVsZXJNb2RlLCBTdHJpbmcgbGlicmFyeU92ZXJyaWRlLCBTdHJpbmcgbm9kZU1pblBvbGxJbnRlcnZhbCwgCi0JICAgIFN0cmluZyBub2RlTWF4UG9sbEludGVydmFsLCBTdHJpbmcgam9iUG9sbEludGVydmFsKQotICAgIHsKLQlzdXBlcihyZW1vdGVDb25maWcsIGZhY3RvcnkpOwotCXRoaXMudXNlTG9hZExldmVsZXIgPSB1c2VMb2FkTGV2ZWxlcjsKLQl0aGlzLnJ1bk1pbmlwcm94eSA9IHJ1bk1pbmlwcm94eTsKLQl0aGlzLmRlYnVnTGV2ZWwgPSBkZWJ1Z0xldmVsOwotCXRoaXMuc3VzcGVuZFByb3h5ID0gc3VzcGVuZFByb3h5OwotCXRoaXMubG9hZExldmVsZXJNb2RlID0gbG9hZExldmVsZXJNb2RlOwotCXRoaXMubGlicmFyeU92ZXJyaWRlID0gbGlicmFyeU92ZXJyaWRlOwotCXRoaXMubm9kZU1pblBvbGxJbnRlcnZhbCA9IG5vZGVNaW5Qb2xsSW50ZXJ2YWw7Ci0JdGhpcy5ub2RlTWF4UG9sbEludGVydmFsID0gbm9kZU1heFBvbGxJbnRlcnZhbDsKLQl0aGlzLmpvYlBvbGxJbnRlcnZhbCA9IGpvYlBvbGxJbnRlcnZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKFBFUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5KQotICAgIHsKLQl0aGlzKGZhY3RvcnksIG5ldyBSZW1vdGVDb25maWcoKSwgIk4iLCAiWSIsICJOb25lIiwgIk4iLCAiZCIsICIiLCAiIiwgIiIsICIiKTsKLQlzZXREZWZhdWx0TmFtZUFuZERlc2MoKTsKLSAgICB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlDb21tb25Db25maWcgY29tbW9uQ29uZiA9IG5ldyBDb21tb25Db25maWcoZ2V0TmFtZSgpLAotCQkJCWdldERlc2NyaXB0aW9uKCksIGdldFVuaXF1ZU5hbWUoKSk7Ci0JCVJlbW90ZUNvbmZpZyByZW1vdGVDb25mID0gbmV3IFJlbW90ZUNvbmZpZyhjb21tb25Db25mLAotCQkJCWdldFJlbW90ZVNlcnZpY2VzSWQoKSwgZ2V0Q29ubmVjdGlvbk5hbWUoKSwKLQkJCQlnZXRQcm94eVNlcnZlclBhdGgoKSwgZ2V0TG9jYWxBZGRyZXNzKCksCi0JCQkJZ2V0SW52b2NhdGlvbk9wdGlvbnNTdHIoKSwgZ2V0T3B0aW9ucygpKTsKLQkJcmV0dXJuIG5ldyBQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oCi0JCQkJKFBFUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSkgZ2V0RmFjdG9yeSgpLCByZW1vdGVDb25mLAotCQkJCWdldFVzZUxvYWRMZXZlbGVyKCksIGdldFJ1bk1pbmlwcm94eSgpLCBnZXREZWJ1Z0xldmVsKCksIAotCQkJCWdldFN1c3BlbmRQcm94eSgpLCBnZXRMb2FkTGV2ZWxlck1vZGUoKSwgZ2V0TGlicmFyeU92ZXJyaWRlKCksCi0JCQkJZ2V0Tm9kZU1pblBvbGxJbnRlcnZhbCgpLCBnZXROb2RlTWF4UG9sbEludGVydmFsKCksCi0JCQkJZ2V0Sm9iUG9sbEludGVydmFsKCkpOwotCX0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXREZWZhdWx0TmFtZUFuZERlc2MoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lQW5kRGVzYygpCi0gICAgewotCVN0cmluZyBuYW1lID0gIlBFIjsKLQlTdHJpbmcgY29ubiA9IGdldENvbm5lY3Rpb25OYW1lKCk7Ci0JaWYgKGNvbm4gIT0gbnVsbCAmJiAhY29ubi5lcXVhbHMoIiIpKSB7Ci0JICAgIG5hbWUgKz0gIkAiICsgY29ubjsKLQl9Ci0Jc2V0TmFtZShuYW1lKTsKLQlzZXREZXNjcmlwdGlvbigiUEUgUmVzb3VyY2UgTWFuYWdlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBmbGFnIGluZGljYXRpbmcgTG9hZExldmVsZXIgaXMgdXNlZCB0byBhbGxvY2F0ZSBub2RlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIExvYWRMZXZlbGVyIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZUxvYWRMZXZlbGVyKCkKLSAgICB7Ci0JcmV0dXJuIHVzZUxvYWRMZXZlbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBmbGFnIGluZGljYXRpbmcgdGhlIG1pbmlwcm94eSBpcyB0byBydW4gZm9sbG93aW5nIG1haW4gcHJveHkgc2h1dGRvd24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1pbmlwcm94eSBmbGFnCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSdW5NaW5pcHJveHkoKQotICAgIHsKLQlyZXR1cm4gcnVuTWluaXByb3h5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJveHkgZGVidWcgbGV2ZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGRlYnVnIGxldmVsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWJ1Z0xldmVsKCkKLSAgICB7Ci0JcmV0dXJuIGRlYnVnTGV2ZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmbGFnIGluZGljYXRpbmcgcHJveHkgc2hvdWxkIGJlIHN1c3BlbmRlZCBhdCBzdGFydHVwIChmb3IgZGVidWdnaW5nKQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1c3BlbmQgcHJveHkgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VzcGVuZFByb3h5KCkKLSAgICB7Ci0JcmV0dXJuIHN1c3BlbmRQcm94eTsKLSAgICB9Ci0KLS8vICAgIC8qCi0vLyAgICAgKiBTYXZlIG9wdGlvbiBzZXR0aW5ncyBmb3IgcmVzb3VyY2UgbWFuYWdlciBkZWZpbml0aW9uIChub24tSmF2YWRvYykKLS8vICAgICAqIAotLy8gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI2RvU2F2ZShvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLS8vICAgICAqLwotLy8gICAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlKElNZW1lbnRvIG1lbWVudG8pCi0vLyAgICB7Ci0vLwlzdXBlci5kb1NhdmUobWVtZW50byk7Ci0vLwltZW1lbnRvLnB1dFN0cmluZyhUQUdfVVNFX0xPQURMRVZFTEVSLCB1c2VMb2FkTGV2ZWxlcik7Ci0vLwltZW1lbnRvLnB1dFN0cmluZyhUQUdfUlVOX01JTklQUk9YWSwgcnVuTWluaXByb3h5KTsKLS8vCW1lbWVudG8ucHV0U3RyaW5nKFRBR19ERUJVR19MRVZFTCwgZGVidWdMZXZlbCk7Ci0vLwltZW1lbnRvLnB1dFN0cmluZyhUQUdfTUlOX05PREVfUE9MTF9JTlRFUlZBTCwgbm9kZU1pblBvbGxJbnRlcnZhbCk7Ci0vLwltZW1lbnRvLnB1dFN0cmluZyhUQUdfTUFYX05PREVfUE9MTF9JTlRFUlZBTCwgbm9kZU1heFBvbGxJbnRlcnZhbCk7Ci0vLwltZW1lbnRvLnB1dFN0cmluZyhUQUdfSk9CX1BPTExfSU5URVJWQUwsIGpvYlBvbGxJbnRlcnZhbCk7Ci0vLwltZW1lbnRvLnB1dFN0cmluZyhUQUdfTE9BRExFVkVMRVJfTU9ERSwgbG9hZExldmVsZXJNb2RlKTsKLS8vCW1lbWVudG8ucHV0U3RyaW5nKFRBR19MSUJSQVJZX09WRVJSSURFLCBsaWJyYXJ5T3ZlcnJpZGUpOwotLy8JbWVtZW50by5wdXRTdHJpbmcoVEFHX1NVU1BFTkRfUFJPWFksIHN1c3BlbmRQcm94eSk7Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgTG9hZExldmVsZXIgaXMgdXNlZCB0byBhbGxvY2F0ZSBub2RlcwotICAgICAqIEBwYXJhbSB1c2VMb2FkTGV2ZWxlciAtIGZsYWcgaW5pZGNhdGluZyBMb2FkTGV2ZWxlciB1c2VkIHRvIGFsbG9jYXRlIG5vZGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlTG9hZExldmVsZXIoU3RyaW5nIHVzZUxvYWRMZXZlbGVyKQotICAgIHsKLSAgICAgICAgdGhpcy51c2VMb2FkTGV2ZWxlciA9IHVzZUxvYWRMZXZlbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBmbGFnIGluZGljYXRpbmcgd2hldGhlciBtaW5pcHJveHkgc2hvdWxkIHJ1biBmb2xsb3dpbmcgcHJveHkgc2h1dGRvd24KLSAgICAgKiBAcGFyYW0gcnVuTWluaXByb3h5IEZsYWcgaW5kaWNhdGluZyBtaW5pcHJveHkgc2hvdWxkIHJ1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bk1pbmlwcm94eShTdHJpbmcgcnVuTWluaXByb3h5KQotICAgIHsKLSAgICAgICAgdGhpcy5ydW5NaW5pcHJveHkgPSBydW5NaW5pcHJveHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWJ1ZyBsZXZlbCBmb3IgdGhlIHByb3h5Ci0gICAgICogQHBhcmFtIGRlYnVnTGV2ZWwgRGVidWcgbGV2ZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKFN0cmluZyBkZWJ1Z0xldmVsKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWJ1Z0xldmVsID0gZGVidWdMZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgcHJveHkgc2hvdWxkIGJlIHN1c3BlbmRlZCBhdCBzdGFydHVwIChmb3IgZGVidWdnaW5nKQotICAgICAqIEBwYXJhbSBzdXNwZW5kUHJveHkgcHJveHkgc3VzcGVuc2lvbiBmbGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VzcGVuZFByb3h5KFN0cmluZyBzdXNwZW5kUHJveHkpCi0gICAgewotICAgICAgICB0aGlzLnN1c3BlbmRQcm94eSA9IHN1c3BlbmRQcm94eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgTG9hZExldmVsZXIgcnVuIG1vZGUgKGxvY2FsLCBtdWx0aWNsdXN0ZXIsIGRlZmF1bHQpCi0gICAgICogQHJldHVybiB0aGUgbG9hZExldmVsZXJNb2RlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2FkTGV2ZWxlck1vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvYWRMZXZlbGVyTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgTG9hZExldmVsZXIgcnVuIG1vZGUgKGxvY2FsLCBtdWx0aWNsdXN0ZXIsIGRlZmF1bHQpCi0gICAgICogQHBhcmFtIGxvYWRMZXZlbGVyTW9kZSB0aGUgbG9hZExldmVsZXJNb2RlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvYWRMZXZlbGVyTW9kZShTdHJpbmcgbG9hZExldmVsZXJNb2RlKQotICAgIHsKLSAgICAgICAgdGhpcy5sb2FkTGV2ZWxlck1vZGUgPSBsb2FkTGV2ZWxlck1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtaW5pbXVtIGludGVydmFsIHRvIHBvbGwgTG9hZExldmVsZXIgZm9yIG5vZGUgc3RhdHVzCi0gICAgICogQHJldHVybiB0aGUgbm9kZVBvbGxNaW5JbnRlcnZhbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU1pblBvbGxJbnRlcnZhbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbm9kZU1pblBvbGxJbnRlcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1pbmltdW0gaW50ZXJ2YWwgdG8gcG9sbCBMb2FkTGV2ZWxlciBmb3Igbm9kZSBzdGF0dXMKLSAgICAgKiBAcGFyYW0gbm9kZVBvbGxNaW5JbnRlcnZhbCB0aGUgbm9kZVBvbGxNaW5JbnRlcnZhbCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb2RlTWluUG9sbEludGVydmFsKFN0cmluZyBub2RlTWluUG9sbEludGVydmFsKQotICAgIHsKLSAgICAgICAgdGhpcy5ub2RlTWluUG9sbEludGVydmFsID0gbm9kZU1pblBvbGxJbnRlcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1heGltdW0gaW50ZXJ2YWwgdG8gcG9sbCBMb2FkTGV2ZWxlciBmb3Igbm9kZSBzdGF0dXMKLSAgICAgKiBAcmV0dXJuIHRoZSBub2RlUG9sbE1heEludGVydmFsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTWF4UG9sbEludGVydmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBub2RlTWF4UG9sbEludGVydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWF4aW11bSBpbnRlcnZhbCB0byBwb2xsIExvYWRMZXZlbGVyIGZvciBub2RlIHN0YXR1cwotICAgICAqIEBwYXJhbSBub2RlUG9sbE1heEludGVydmFsIHRoZSBub2RlUG9sbE1heEludGVydmFsIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVNYXhQb2xsSW50ZXJ2YWwoU3RyaW5nIG5vZGVNYXhQb2xsSW50ZXJ2YWwpCi0gICAgewotICAgICAgICB0aGlzLm5vZGVNYXhQb2xsSW50ZXJ2YWwgPSBub2RlTWF4UG9sbEludGVydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW50ZXJ2YWwgdG8gcG9sbCBMb2FkTGV2ZWxlciBmb3Igam9iIHN0YXR1cwotICAgICAqIEByZXR1cm4gdGhlIGpvYlBvbGxJbnRlcnZhbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Sm9iUG9sbEludGVydmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBqb2JQb2xsSW50ZXJ2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnRlcnZhbCB0byBwb2xsIExvYWRMZXZlbGVyIGZvciBqb2Igc3RhdHVzCi0gICAgICogQHBhcmFtIGpvYlBvbGxJbnRlcnZhbCB0aGUgam9iUG9sbEludGVydmFsIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpvYlBvbGxJbnRlcnZhbChTdHJpbmcgam9iUG9sbEludGVydmFsKQotICAgIHsKLSAgICAgICAgdGhpcy5qb2JQb2xsSW50ZXJ2YWwgPSBqb2JQb2xsSW50ZXJ2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhbHRlcm5hdGUgbGlicmFyeSBwYXRoIGZvciB0aGUgTG9hZExldmVsZXIgQVBJIGxpYnJhcnkKLSAgICAgKiBAcmV0dXJuIHRoZSBsaWJyYXJ5T3ZlcnJpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlPdmVycmlkZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGlicmFyeU92ZXJyaWRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgYWx0ZXJuYXRlIGxpYnJhcnkgcGF0aCBmb3IgdGhlIExvYWRMZXZlbGVyIEFQSSBsaWJyYXJ5Ci0gICAgICogQHBhcmFtIGxpYnJhcnlPdmVycmlkZSB0aGUgbGlicmFyeU92ZXJyaWRlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpYnJhcnlPdmVycmlkZShTdHJpbmcgbGlicmFyeU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgdGhpcy5saWJyYXJ5T3ZlcnJpZGUgPSBsaWJyYXJ5T3ZlcnJpZGU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ybXN5c3RlbS9QRVJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ybXN5c3RlbS9QRVJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDg4OTdiMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2NvcmUvcm1zeXN0ZW0vUEVSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVJlc291cmNlTWFuYWdlckNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLlBFUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUuUEVQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLXB1YmxpYyBjbGFzcyBQRVJlc291cmNlTWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkgewotCi0JcHVibGljIFBFUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJc3VwZXIoIklCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkjY29weUNvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb3B5Q29uZmlndXJhdGlvbihJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JICAgIHJldHVybiAoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24uY2xvbmUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIGNyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25mSW4pIHsKLQkJUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mSW47Ci0JCWZpbmFsIFBUUENvcmVQbHVnaW4gcGx1Z2luID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWZpbmFsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlID0gKElQVW5pdmVyc2VDb250cm9sKSBwbHVnaW4uZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBQRVJlc291cmNlTWFuYWdlcih1bml2ZXJzZS5nZXROZXh0UmVzb3VyY2VNYW5hZ2VySWQoKSwgdW5pdmVyc2UsIGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkjY3JlYXRlQ29uZmlndXJhdGlvbigpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCVBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IFBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbih0aGlzKTsKLQkJCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gUEVQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCQkKLQkJY29uZi5zZXRQcm94eVNlcnZlclBhdGgocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfUEFUSCkpOwotCQljb25mLnNldE9wdGlvbnMocHJlZmVyZW5jZXMuZ2V0SW50KFByZWZlcmVuY2VDb25zdGFudHMuT1BUSU9OUykpOwotCQljb25mLnNldERlYnVnTGV2ZWwocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5UUkFDRV9MRVZFTCkpOwotCQljb25mLnNldEpvYlBvbGxJbnRlcnZhbChwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkpPQl9QT0xMX0lOVEVSVkFMKSk7Ci0JCWNvbmYuc2V0TGlicmFyeU92ZXJyaWRlKHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuTElCUkFSWV9PVkVSUklERSkpOwotCQljb25mLnNldExvYWRMZXZlbGVyTW9kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkxPQURfTEVWRUxFUl9NT0RFKSk7Ci0JCWNvbmYuc2V0Tm9kZU1heFBvbGxJbnRlcnZhbChwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk5PREVfTUFYX1BPTExfSU5URVJWQUwpKTsKLQkJY29uZi5zZXROb2RlTWluUG9sbEludGVydmFsKHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuTk9ERV9NSU5fUE9MTF9JTlRFUlZBTCkpOwotCQljb25mLnNldFJ1bk1pbmlwcm94eShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlJVTl9NSU5JUFJPWFkpKTsKLQkJY29uZi5zZXRVc2VMb2FkTGV2ZWxlcihwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkxPQURfTEVWRUxFUl9PUFRJT04pKTsKLQotCQlyZXR1cm4gY29uZjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2xvYWRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBsb2FkQ29uZmlndXJhdGlvbihJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXJldHVybiBQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24ubG9hZCh0aGlzLCBtZW1lbnRvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvY29yZS9ydHN5c3RlbS9QRVByb3h5UnVudGltZUNsaWVudC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL3J0c3lzdGVtL1BFUHJveHlSdW50aW1lQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMjcyNzIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL3J0c3lzdGVtL1BFUHJveHlSdW50aW1lQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUucm1zeXN0ZW0uUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZUNsaWVudDsKLQotcHVibGljIGNsYXNzIFBFUHJveHlSdW50aW1lQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVDbGllbnQgewotCXB1YmxpYyBQRVByb3h5UnVudGltZUNsaWVudChQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnLCAKLQkJCWludCBiYXNlTW9kZWxJZCkgewotCQlzdXBlcihjb25maWcsIGJhc2VNb2RlbElkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2NvcmUvcnRzeXN0ZW0vUEVSdW50aW1lU3lzdGVtLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2NvcmUvcnRzeXN0ZW0vUEVSdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlMDcxZGIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS9jb3JlL3J0c3lzdGVtL1BFUnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICogCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBQRVJ1bnRpbWVTeXN0ZW0gZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVByb3h5UnVudGltZVN5c3RlbSB7Ci0JcHVibGljIFBFUnVudGltZVN5c3RlbShQRVByb3h5UnVudGltZUNsaWVudCBwcm94eSwgQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlcihwcm94eSwgbWFuYWdlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYmExMGM0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHA8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViZWFjMWYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHA7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAuQWN0aXZhdG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU2ZDg3Yi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgICoueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvUEVNYWluSGVscC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL1BFTWFpbkhlbHAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjgwMDY4Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvUEVNYWluSGVscC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTwhLS0gQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgIC0tPgotPCEtLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAtLT4KLTwhLS0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgLS0+Ci08IS0tIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5SdW5uaW5nIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCBBcHBsaWNhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5SdW5uaW5nIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCBBcHBsaWNhdGlvbnM8L2gxPgotPGgyPjxBIG5hbWU9aW50cm9kdWN0aW9uPjwvQT5JbnRyb2R1Y3Rpb248L2gyPgotPHA+VGhpcyBwbHVnaW4gYWxsb3dzIHlvdSB0byBydW4gYSBwYXJhbGxlbCBhcHBsaWNhdGlvbiB1c2luZyBJQk0gUGFyYWxsZWwgRW52aXJvbm1lbnQgZnJvbSB3aXRoaW4gdGhlIFBUUCBmcmFtZXdvcmsuIAotSW4gYWRkaXRpb24gdG8gcnVubmluZyBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gbW9uaXRvciB0aGVpciBzdGF0dXMsIGNvbnRyb2wgdGhlaXIgZXhlY3V0aW9uLCBhbmQgdmlldyB0aGVpciBzdGRpbwotb3V0cHV0IGZyb20gd2l0aGluIFBUUC4gWW91IGNhbiBhbHNvIGRlYnVnIGEgcGFyYWxsZWwgYXBwbGljYXRpb24gdXNpbmcgdGhlIGJ1aWx0IGluIFBUUCBwYXJhbGxlbCBkZWJ1Z2dlci48L3A+Ci08cD5Zb3UgY2FuIHJ1biBhbmQgZGVidWcgcGFyYWxsZWwgYXBwbGljYXRpb25zIGVpdGhlciBhcyBsb2NhbCBwcm9qZWN0cyBvciBhcyByZW1vdGUgcHJvamVjdHMsIHVzaW5nIHRoZSByZW1vdGUgZGV2ZWxvcG1lbnQgCi1lbnZpcm9ubWVudCBzdXBwb3J0IHRoYXQgaXMgcGFydCBvZiBQVFAuPC9wPgotPHA+T3B0aW9uYWxseSwgeW91IGNhbiB1c2UgSUJNIFRpdm9saSBXb3JrbG9hZFNjaGVkdWxlciBMb2FkTGV2ZWxlciB0byBtYW5hZ2UgeW91ciBhcHBsaWNhdGlvbidzIGFjY2VzcyB0byBzeXN0ZW0gcmVzb3VyY2VzPC9wPgotPHA+VGhpcyBwbHVnaW4gY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBUaGUgZmlyc3QgaXMgdGhlIEVjbGlwc2UgUFRQIHBsdWdpbiBjb2RlIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgUFRQIHZpZXdzIAotcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFuZCB0aGUgdXNlcidzIGludGVyYWN0aW9uIHdpdGggdGhvc2Ugdmlld3MuIFRoZSBzZWNvbmQgcGFydCBpcyBhIHJlc291cmNlIG1hbmFnZXIgKHByb3h5KSwgd2hpY2ggaXMKLXJlc3BvbnNpYmxlIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFBUUCBQRSBwbHVnaW4gY29kZSwgaW52b2tpbmcgdGhlIHBhcmFsbGVsIGFwcGxpY2F0aW9uLCBhbmQgcmVwb3J0aW5nIGFwcGxpY2F0aW9uCi1zdGF0dXMgdG8gdGhlIFBUUCBQRSBwbHVnaW4uPC9wPgotPGgyPjxBIG5hbWU9cmVxdWlyZW1lbnRzPjwvQT5SZXF1aXJlbWVudHM8L2gyPgotPHA+SW4gYWRkaXRpb24gdG8gaGF2aW5nIEVjbGlwc2UgYW5kIFBUUCBpbnN0YWxsZWQsIHlvdSBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBzb2Z0d2FyZSBwYWNrYWdlcyBpbnN0YWxsZWQuPC9wPgotPHVsPgotPGxpPkNEVCA0LjAsIGF2YWlsYWJsZSBmcm9tIHRoZSBFY2xpcHNlIGRvd25sb2FkIHNpdGU8L2xpPgotPGxpPlBhcmFsbGVsIEVudmlyb25tZW50IDQuMy4xIG9yIGxhdGVyLCBhdmFpbGFibGUgZnJvbSBJQk08L2xpPgotPGxpPkxBUEkgMi40LjQuMCBvciBsYXRlciwgYXZhaWxhYmxlIGZyb20gSUJNPC9saT4KLTxsaT5JQk0gVGl2b2xpIFdvcmtsb2FkU2NoZWR1bGVyIExvYWRMZXZlbGVyIDMuNCBvciBsYXRlciwgYXZhaWxhYmxlIGZyb20gSUJNLCBpZiB5b3UgcGxhbiB0byB1c2UgTG9hZExldmVsZXIgdG8gbWFuYWdlIHlvdXIgYXBwbGljYXRpb24ncwotYWNjZXNzIHRvIHN5c3RlbSByZXNvdXJjZXM8L2xpPiAKLTwvdWw+Ci08cD5Zb3Ugc2hvdWxkIHJldmlldyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IFBhcmFsbGVsIEVudmlyb25tZW50IGluc3RhbGxhdGlvbiBhbmQgdXNhZ2UKLTx1bD4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWIuYm91bGRlci5pYm0uY29tL2VwdWJzL3BkZi9hbTEwMW0wMC5wZGYiPgotSUJNIFBhcmFsbGVsIEVudmlyb25tZW50IGZvciBBSVggYW5kIExpbnV4IEluc3RhbGxhdGlvbiBHdWlkZTwvYT4KLTwvbGk+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vcHVibGliLmJvdWxkZXIuaWJtLmNvbS9lcHVicy9wZGYvYW0xMDJtMDAucGRmIj4KLUlCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCBmb3IgQUlYIDVMIGFuZCBMaW51eCBPcGVyYXRpb24gYW5kIFVzZSwgVm9sIDEsIFVzaW5nIHRoZSBQYXJhbGxlbCBPcGVyYXRpbmcgRW52aXJvbm1lbnQ8L2E+Ci08L2xpPgotPC91bD4KLTxwPklmIHlvdSBhcmUgdXNpbmcgTG9hZExldmVsZXIgdG8gbWFuYWdlIHlvdXIgYXBwbGljYXRpb24ncyBhY2Nlc3MgdG8gc3lzdGVtIHJlc291cmNlcywgdGhlbiB5b3Ugc2hvdWxkIHJldmlldyB0aGUgZm9sbG93aW5nCi1Mb2FkTGV2ZWxlciBkb2N1bWVudGF0aW9uPC9wPgotPHVsPgotPGxpPgotPGEgaHJlZj0iaHR0cDovL3B1YmxpYi5ib3VsZGVyLmlibS5jb20vZXB1YnMvcGRmL2FtMmluMjA2LnBkZiI+Ci1UaXZvbGkgV29ya2xvYWQgU2NoZWR1bGVyIExvYWRMZXZlbGVyIFYzLjQgSW5zdGFsbGF0aW9uIEd1aWRlPC9hPgotPC9saT4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWIuYm91bGRlci5pYm0uY29tL2VwdWJzL3BkZi9hbTJ1ZzMwNS5wZGYiPgotVGl2b2xpIFdvcmtsb2FkIFNjaGVkdWxlciBMb2FkTGV2ZWxlciBWMy40IFVzaW5nIGFuZCBBZG1pbmlzdGVyaW5nIEd1aWRlPC9hPgotPC9saT4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWIuYm91bGRlci5pYm0uY29tL2VwdWJzL3BkZi9hbTJtZzEwNS5wZGYiPgotVGl2b2xpIFdvcmtsb2FkIFNjaGVkdWxlciBMb2FkTGV2ZWxlciBWMy40IERpYWdub3NpcyBhbmQgTWVzc2FnZXMgR3VpZGU8L2E+Ci08L2xpPgotPC91bD4KLTxoMj48QSBuYW1lPWluc3RhbGxhdGlvbj48L0E+SW5zdGFsbGF0aW9uPC9oMj4KLUlmIHlvdSB3aWxsIGJlIHJ1bm5pbmcgYXBwbGljYXRpb25zIHVzaW5nIFBFIHdpdGggYSBob3N0IGxpc3QgYW5kIG5vdCB1c2luZyBMb2FkTGV2ZWxlciB0byBtYW5hZ2UgcmVzb3VyY2UgYWxsb2NhdGlvbiwKLXRoZW4gaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlIG9uY2UgeW91IGNvbXBsZXRlIHRoZSBQVFAgcGx1Z2luIGluc3RhbGxhdGlvbiBwcm9jZWR1cmVzLiBJZiB5b3UgcGxhbiB0byB1c2UgTG9hZExldmVsZXIgCi10byBtYW5hZ2UgcmVzb3VyY2UgYWxsb2NhdGlvbiwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIHJlYnVpbGQgdGhlIFBhcmFsbGVsIEVudmlyb25tZW50IHByb3h5IGJ5IGZvbGxvd2luZyB0aGVzZSBzdGVwcwotPG9sPgotPGxpPk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgTG9hZExldmVsZXIgYW5kIHRoYXQgdGhlIGxsYXBpLmggaW5jbHVkZSBmaWxlIGV4aXN0cyBvbiB5b3VyIHN5c3RlbS4KLUl0IG5vcm1hbGx5IGlzIGxvY2F0ZWQgaW4gdGhlIC4vZnVsbC9pbmNsdWRlIGRpcmVjdG9yeSB3aXRoaW4gYSBMb2FkTGV2ZWxlciBpbnN0YWxsYXRpb24uIAotTG9hZExldmVsZXIgaXMgbm9ybWFsbHkgaW5zdGFsbGVkIGluIC91c3IvbHBwL0xvYWRMIG9uIEFJWCBzeXN0ZW1zIGFuZCBpbiAvb3B0L2libWxsL0xvYWRMIG9uIExpbnV4IHN5c3RlbXMuIExvYWRMZXZlbGVyIG1heSBhbHNvIGJlIAotaW5zdGFsbGVkIGluIGEgcHJpdmF0ZSBkaXJlY3RvcnkgaWYgeW91IGNob29zZSB0byBkbyBzby4KLTxsaT5jZCB0byB0aGUgb3JnLmVjbGlwc2UucHRwLmlibXBlLnByb3h5IGRpcmVjdG9yeSBpbnNpZGUgeW91ciBwbHVnaW5zIGRpcmVjdG9yeS48L2xpPgotPGxpPkludm9rZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpbiB0aGF0IGRpcmVjdG9yeSB3aXRoIHRoZSA8Yj4tLXdpdGgtbGwtaGVhZGVyPC9iPiBmbGFnLCBzcGVjaWZ5aW5nIHRoZSBwYXRoIHRvCi10aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGxhcGkuaC4gKFVzZSA8Yj5jb25maWd1cmUgLS1oZWxwPC9iPiB0byBzZWUgYSBjb21wbGV0ZSBsaXN0IG9mIGNvbmZpZ3VyZSBzY3JpcHQgb3B0aW9ucyk8L2xpPgotPGxpPkludm9rZSA8Yj5tYWtlPC9iPiBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCi08L29sPgotPGgyPjxBIG5hbWU9c3RhcnRpbmc+PC9BPkdldHRpbmcgU3RhcnRlZDwvaDI+Ci08cD5EZWZpbmUgYW4gYXBwcm9wcmlhdGUgcHJvamVjdCwgZWl0aGVyIGEgQy9DKysgcHJvamVjdCB1c2luZyBDRFQsIG9yIGEgRm9ydHJhbiBwcm9qZWN0IHVzaW5nIFBob3RyYW4uIFlvdSBjYW4gZGVmaW5lIAotZWl0aGVyIGEgc3RhbmRhcmQgbWFrZSBwcm9qZWN0IG9yIGEgbWFuYWdlZCBtYWtlIHByb2plY3QuPC9wPgotPHA+V2hlbiB5b3UgZGVmaW5lIHRoZSBwcm9qZWN0LCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlIHByb2plY3QgbG9jYXRpb24gYXMgYSBkaXJlY3Rvcnkgd2hpY2ggaXMgc2hhcmVkIGFtb25nIGFsbCBub2RlcyAKLXdoZXJlIHRoZSBwYXJhbGxlbCBhcHBsaWNhdGlvbiB3aWxsIHJ1biB0byBlbnN1cmUgUGFyYWxsZWwgRW52aXJvbm1lbnQgaGFzIGFjY2VzcyB0byB0aGUgZXhlY3V0YWJsZSBvbiBhbGwgbm9kZXMuIFRoZSAKLWZvbGxvd2luZyBpbWFnZSBzaG93cyBob3cgYSBwcm9qZWN0IGNhbiBiZSBjcmVhdGVkIHVzaW5nIGEgZGlyZWN0b3J5IHZpc2libGUgdG8gYWxsIG5vZGVzLjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvcHJvamVjdF9jcmVhdGVfMS5qcGciPiAKLTxwPllvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcgY29tcGlsZXIgaW52b2NhdGlvbiBjb21tYW5kcwotdG8gaW52b2tlIHRoZSBjb21waWxlciwgZWl0aGVyIGluIHlvdXIgbWFrZWZpbGUsIG9yIHdoZW4gc3BlY2lmeWluZyB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciBpbiBhIG1hbmFnZWQgbWFrZSBwcm9qZWN0LjwvcD4KLTx1bD4KLTxsaT5BSVg8L2xpPgotPHVsPgotPGxpPm1wY2NfciBmb3IgQyBwcm9ncmFtczwvbGk+Ci08bGk+bXBDQ19yIGZvciBDKysgcHJvZ3JhbXM8L2xpPgotPGxpPm1weGxmX3IgZm9yIEZvcnRyYW4gcHJvZ3JhbXM8L2xpPgotPC91bD4KLTxsaT5MaW51eDwvbGk+Ci08dWw+Ci08bGk+bXBjYyBmb3IgQyBwcm9ncmFtczwvbGk+Ci08bGk+bXBDQyBmb3IgQysrIHByb2dyYW1zPC9saT4KLTxsaT5tcGZvcnQgZm9yIEZvcnRyYW4gcHJvZ3JhbXM8L2xpPgotPC91bD4KLTwvdWw+IAotPHA+VGhlIGZvbGxvd2luZyBpbWFnZSBzaG93cyBob3cgdGhlIGNvbXBpbGVyIGlzIHNwZWNpZmllZCBmb3IgYSBtYW5hZ2VkIG1ha2UgcHJvamVjdC4gVGhlIGNvcnJlY3QgbGlua2VyIHNob3VsZCBhbHNvCi1iZSBzcGVjaWZpZWQgYnkgY2xpY2tpbmcgdGhlIHNldHRpbmdzIGZvciB0aGUgbGlua2VyLjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvcHJvamVjdF9jcmVhdGVfMi5qcGciPgotPHA+T25jZSB5b3UgaGF2ZSBjcmVhdGVkIHlvdXIgcHJvamVjdCwgeW91IHNob3VsZCBzd2l0Y2ggdG8gdGhlIFBUUCBydW50aW1lIHBlcnNwZWN0aXZlLCBhbmQgc2V0IHVwIHRoZSBkZWZhdWx0IAotcHJlZmVyZW5jZXMgZm9yIFBhcmFsbGVsIEVudmlyb25tZW50IGFuZCBzcGVjaWZ5IHRoZSByZXF1aXJlZCByZXNvdXJjZSBtYW5hZ2VyLiBUaGlzIHNldHVwIG5lZWRzIHRvIG9ubHkgYmUgZG9uZSBvbmNlLjwvcD4KLTxwPllvdSBzcGVjaWZ5IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGJ5IG9wZW5pbmcgdGhlIHByZWZlcmVuY2VzIGRpYWxvZywgb3BlbmluZyB0aGUgPGI+UFRQPC9iPiBub2RlLCBvcGVuaW5nIHRoZQotPGI+UmVzb3VyY2UgTWFuYWdlcnM8L2I+IG5vZGUsIGFuZCB0aGVuIGNsaWNraW5nIHRoZSA8Yj5QYXJhbGxlbCBFbnZpcm9ubWVudDwvYj4gZW50cnkuIFRoZSBQRSBwcmVmZXJlbmNlcyBwYW5lbCBpcyBkaXNwbGF5ZWQuIEhlcmUsCi15b3Ugc3BlY2lmeSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgYSByZXNvdXJjZSBtYW5hZ2VyIHRvIGJlIHVzZWQgZm9yIFBhcmFsbGVsIEVudmlyb25tZW50LjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvcGVfcHJlZmVyZW5jZXMuanBnIj4KLTxwPlRoZSBzZXR0aW5ncyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaGVyZSBhcmU6PC9wPgotPHVsPgotPGxpPlRoZSBwYXRobmFtZSB0byB0aGUgUEUgcHJveHkgZXhlY3V0YWJsZS4gVGhpcyBwcm94eSBoYW5kbGVzIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBFY2xpcHNlIFBUUCBzZXNzaW9uIGFuZCB5b3VyIAotcGFyYWxsZWwgYXBwbGljYXRpb25zLjwvbGk+Ci08bGk+TXVsdGlwbGV4aW5nIG9wdGlvbnM8L2xpPgotPGxpPldoZXRoZXIgdGhlIHByb3h5IGlzIHN0YXJ0ZWQgbWFudWFsbHkgb3IgaXMgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gRWNsaXBzZSBpcyBzdGFydGVkPC9saT4KLTxsaT5XaGV0aGVyIExvYWRMZXZlbGVyIGlzIHVzZWQgdG8gbWFuYWdlIGFjY2VzcyB0byBzeXN0ZW0gcmVzb3VyY2VzPC9saT4KLTxsaT5JZiBMb2FkTGV2ZWxlciBpcyB1c2VkOjwvbGk+Ci08dWw+Ci08bGk+V2hldGhlciBQVFAgZm9yY2VzIExvYWRMZXZlbGVyIHRvIG9wZXJhdGUgaW4gbXVsdGktY2x1c3RlciBtb2RlLCBzaW5nbGUgKGxvY2FsKSBjbHVzdGVyIG1vZGUsIG9yIHRvIHVzZSB0aGUgbW9kZSAKLUxvYWRMZXZlbGVyIHdhcyBjb25maWd1cmVkIGZvcjwvbGk+Ci08bGk+VGhlIG1pbmltdW0gaW50ZXJ2YWwgdGhhdCB0aGUgcHJveHkgd2lsbCBwb2xsIExvYWRMZXZlbGVyIHRvIHF1ZXJ5IG5vZGUgc3RhdHVzPC9saT4KLTxsaT5UaGUgbWF4aW11bSBpbnRlcnZhbCB0aGF0IHRoZSBwcm94eSB3aWxsIHBvbGwgTG9hZExldmVsZXIgdG8gcXVlcnkgbm9kZSBzdGF0dXM8L2xpPgotPGxpPlRoZSBpbnRlcnZhbCB0aGF0IHRoZSBwcm94eSB3aWxsIHBvbGwgTG9hZExldmVsZXIgZm9yIGpvYiBzdGF0dXM8L2xpPgotPGxpPkFsdGVybmF0ZSBkaXJlY3RvcnkgZm9yIHRoZSBMb2FkTGF2ZWxlciBpbnRlcmZhY2UgbGlicmFyeS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIExvYWRMZXZlbGVyIGlzIG5vdCBpbnN0YWxsZWQKLW9uIHRoZSBub2RlIHdoZXJlIHRoZSBwcm94eSBydW5zLCBhbmQgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIgb3duIGNvcHkgb2YgdGhlIExvYWRMZXZlbGVyIGludGVyZmFjZSBsaWJyYXJ5IGxpYmxsYXBpPC9saT4KLTxsaT5XaGV0aGVyIGEgc2Vjb25kIHByb3h5IHByb2Nlc3MgaXMgc3RhcnRlZCB3aGVuIHRoZSBQVFAgUEUgcHJveHkgc2h1dHMgZG93bi4gVGhpcyBzZWNvbmQgcHJveHkgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlCi1hbiBhcHBsaWNhdGlvbiB3cml0ZXMgZGF0YSB0byBTVERJTy4gSWYgdGhlIFBFIFBUUCBwcm94eSBzaHV0cyBkb3duIHdpdGhvdXQgc3RhcnRpbmcgdGhlIHNlY29uZCBwcm94eSwgdGhlbiB0aGUgYXBwbGljYXRpb24KLW1heSBzdXNwZW5kIHNpbmNlIHRoZXJlIGlzIG5vIHByb2Nlc3MgaW50ZXJjZXB0aW5nIHRoZSBTVERJTyBvdXRwdXQgZnJvbSB0aGUgYXBwbGljYXRpb24uIElmIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkLAotYSBzZWNvbmQsIHNtYWxsZXIsIHByb3h5IGlzIHN0YXJ0ZWQuIFRoaXMgc2Vjb25kIHByb3h5IGludGVyY2VwdHMgdGhlIFNURElPIG91dHB1dCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBhbmQgd3JpdGVzIGl0IHRvCi1maWxlcyBpbiAvdG1wLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJsb2NraW5nIHdoZW4gdGhlIHBpcGVzIGNvbm5lY3RlZCB0byB0aGUgYXBwbGljYXRpb24ncyBTVERJTwotZmlsZSBkZXNjcmlwdG9ycyBhcmUgZnVsbC48L2xpPgotPGxpPlNwZWNpZnkgdGhlIGxldmVsIG9mIHRyYWNpbmcgcGVyZm9ybWVkIGJ5IHRoZSBwcm94eS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4gYXR0ZW1wdGluZyB0byBkaWFnbm9zZSBwcm9ibGVtcwotd2l0aCB0aGUgUFRQIFBFIHBsdWdpbjwvbGk+Ci08L3VsPgotPHA+T25jZSB5b3UgaGF2ZSBzZXQgdXAgcHJlZmVyZW5jZXMsIGNyZWF0ZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBmb3IgUGFyYWxsZWwgRW52aXJvbm1lbnQuIFRvIGRvIHRoaXMsIHJpZ2h0LWNsaWNrIGluIHRoZQotcmVzb3VyY2UgbWFuYWdlcnMgdmlldyBhbmQgc2VsZWN0IDxiPkFkZCBSZXNvdXJjZSBNYW5hZ2VyPC9iPiBmcm9tIHRoZSBtZW51LiBBIHJlc291cmNlIG1hbmFnZXIgd2l6YXJkIHdpbGwgYmUgCi1kaXNwbGF5ZWQuIFNlbGVjdCA8Yj5QRTwvYj4gZnJvbSB0aGUgbGlzdCBvZiByZXNvdXJjZSBtYW5hZ2VyIHR5cGVzIGFuZCBjbGljayBuZXh0LjwvcD4gCi08cD5UaGUgbmV4dCBwYW5lbCBkaXNwbGF5ZWQgaXMgdGhlIGZpcnN0IHdpemFyZCBwYW5lbCB3aGljaCBjb25maWd1cmVzIHRoZSBQRSByZXNvdXJjZSBtYW5hZ2VyLjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvcGVfcHJveHlfY29uZmlnXzEuanBnIj4KLTxwPlRoaXMgcGFuZWwgaXMgdGhlIHN0YW5kYXJkIFBUUCB3aXphcmQgcmVzb3VyY2UgbWFuYWdlciBjb25maWd1cmF0aW9uIHdpemFyZCBwYW5lbCB3aGljaCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIGFuZAotY29ubmVjdGlvbiBhdHRyaWJ1dGVzIGZvciBhIHByb3h5LjwvcD4KLTxwPlNlbGVjdCB0aGUgUmVtb3RlIHNlcnZpY2UgcHJvdmlkZXIgYW5kIHByb3h5IHNlcnZlciBsb2NhdGlvbiBmcm9tIHRoZSBkcm9wZG93biBsaXN0cy4gWW91IGNhbgotYWxzbyBjcmVhdGUgYSBuZXcgcHJveHkgc2VydmVyIGxvY2F0aW9uIGJ5IGNsaWNraW5nIHRoZSA8Yj5OZXc8L2I+IGJ1dHRvbiBpbiB0aGlzIHBhbmUuIFNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHByb3h5IAotc2VydmVyIGV4ZWN1dGFibGUsIG9yIGp1c3QgYWNjZXB0IHRoZSB2YWx1ZSBmaWxsZWQgaW4gYXMgZGVmYXVsdCBmcm9tIHRoZSBwcmVmZXJlbmNlcyBwYW5lbC4gVW5jaGVjayB0aGUgPGI+TGF1bmNoIHNlcnZlciAKLW1hbnVhbGx5PC9iPiBhbmQgY2xpY2sgbmV4dCBhZ2FpbiB0byBwcm9jZWVkIHRvIHRoZSBuZXh0IHdpemFyZCBwYW5lbDwvcD4gCi08aW1nIHNyYz0iaW1hZ2VzL3BlX3Byb3h5X2NvbmZpZ18yLmpwZyI+Ci08cD5UaGlzIHBhbmVsIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJveHkgb3B0aW9ucyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJlc291cmNlIG1hbmFnZXIgY29uZmlndXJhdGlvbi4gTW9zdCBvZiB0aGUKLW9wdGlvbnMgb24gdGhpcyBwYW5lbCBhcmUgaWRlbnRpY2FsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGluIHRoZSBQRSBwbHVnaW4gcHJlZmVyZW5jZXMgcGFuZWwuCi1UaGlzIHBhbmVsIGhhcyBvbmUgYWRkaXRpb25hbCBvcHRpb24sIHdoaWNoIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBwcm94eSBleGVjdXRpb24gaXMgdG8gYmUgc3VzcGVuZGVkIGltbWVkaWF0ZWx5IGFmdGVyIAotaXQgc3RhcnRzLiBUaGlzIG9wdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGRlYnVnZ2luZyB0aGUgcHJveHkgaW4gY2FzZXMgd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIHN1c3BlbmQgcHJveHkgCi1leGVjdXRpb24gYmVmb3JlIHRoZSBmaXJzdCBjb21tYW5kIHNlbnQgdG8gdGhlIHByb3h5IGlzIHByb2Nlc3NlZCwgc28gdGhhdCBhIGRlYnVnZ2VyIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgcHJveHkgcHJvY2VzczwvcD4KLTxwPk9uY2UgdGhlIGZpZWxkcyBvbiB0aGlzIHBhbmVsIGhhdmUgYmVlbiBmaWxsZWQgaW4sIGNsaWNrIG5leHQgdG8gcHJvY2VlZCB0byB0aGUgbmV4dCB3aXphcmQgcGFuZWw8L3A+Ci08cD5PbiB0aGUgZmluYWwgcGFnZSBvZiB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBtYW5hZ2VyIHdpemFyZCwgZWl0aGVyIGFjY2VwdCB0aGUgCi1kZWZhdWx0IHJlc291cmNlIG1hbmFnZXIgbmFtZSwgb3IgdW5jaGVjayB0aGUgY2hlY2tib3ggYW5kIGVudGVyIGEgbmFtZSBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyLiAKLVRoZW4gY2xpY2sgZmluaXNoIHRvIGNyZWF0ZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBlbnRyeS48L3A+Ci08cD5Zb3UgbWF5IGhhdmUgYXMgbWFueSByZXNvdXJjZSBtYW5hZ2VycyBkZWZpbmVkIGFzIHlvdSByZXF1aXJlIGZvciB5b3VyIHN5c3RlbSBjb25maWd1cmF0aW9uLjwvcD4KLTxwPk9uY2UgeW91IGhhdmUgZGVmaW5lZCBhIHJlc291cmNlIG1hbmFnZXIsIHlvdSBtdXN0IHN0YXJ0IGl0IGJlZm9yZSBpdCBjYW4gcnVuIGEgcGFyYWxsZWwgYXBwbGljYXRpb24gdXNpbmcgdGhhdAotcmVzb3VyY2UgbWFuYWdlci4gVG8gc3RhcnQgYSByZXNvdXJjZSBtYW5hZ2VyLCByaWdodC1jbGljayBvdmVyIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGluIHRoZSByZXNvdXJjZSBtYW5hZ2VyIAotdmlldyB0aGVuIHNlbGVjdCA8Yj5TdGFydCByZXNvdXJjZSBtYW5hZ2VyPC9iPiBmcm9tIHRoZSBwb3B1cCBtZW51LiBPbmNlIHN0YXJ0ZWQsIHRoZSBpY29uIGZvciB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgCi1tYW5hZ2VyIHdpbGwgdHVybiBncmVlbi48L3A+IAotPHA+SWYgbmVjZXNzYXJ5LCB5b3UgY2FuIHN0b3AgYSByZXNvdXJjZSBtYW5hZ2VyIGJ5IHJpZ2h0LWNsaWNraW5nIG92ZXIgaXRzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1hbmFnZXIgYW5kIHNlbGVjdGluZyAKLTxiPlN0b3AgcmVzb3VyY2UgbWFuYWdlcjwvYj4gZnJvbSB0aGUgcG9wdXAgbWVudS4gTm9ybWFsbHksIGEgcmVzb3VyY2UgbWFuZ2VyIHdpbGwgc2h1dGRvd24gYXV0b21hdGljYWxseSB3aGVuIFBUUCBpcwotc2h1dGRvd24sIGFuZCBpZiBpdCB3YXMgcnVubmluZyB3aGVuIFBUUCB3YXMgc2h1dGRvd24sIHRoZW4gaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHdoZW4gUFRQIGlzIHN0YXJ0ZWQgYWdhaW4uPC9wPgotPHA+WW91IGNhbiBlZGl0IHJlc291cmNlIG1hbmFnZXIgY29uZmlndXJhdGlvbiBmb3IgYSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgaXMgaW4gdGhlIHN0b3BwZWQgc3RhdGUgYnkgZG91YmxlIGNsaWNraW5nCi10aGUgcmVzb3VyY2UgbWFuYWdlciBuYW1lIG9yIGJ5IHJpZ2h0IGNsaWNraW5nIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG5hbWUgYW5kIHNlbGVjdGluZyA8Yj5FZGl0IFJlc291cmNlIE1hbmFnZXI8L2I+IAotZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuPC9wPgotPGgyPjxBIG5hbWU9cnVubmluZz48L0E+UnVubmluZyBhIFBhcmFsbGVsIEFwcGxpY2F0aW9uPC9oMj4KLTxwPk9uY2UgYW4gYXBwbGljYXRpb24gaGFzIGJlZW4gY29tcGlsZWQsIHRoZSBmaXJzdCBzdGVwIGluIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGlzIHRvIGJlIHN1cmUgdGhlIHJlc291cmNlIG1hbmFnZXIgZm9yIAotUGFyYWxsZWwgRW52aXJvbm1lbnQgaXMgcnVubmluZyBvbiB0aGUgbm9kZSB3aGVyZSB5b3UgaW50ZW5kIHRvIHN0YXJ0IHRoZSBhcHBsaWNhdGlvbi4gVG8gZG8gdGhpcywgY2hlY2sgdGhlIHJlc291cmNlIAotbWFuYWdlcidzIGVudHJ5IGluIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHZpZXcuIFRoZSBpY29uIGZvciB0aGUgcmVzb3VyY2UgbWFuYWdlciBzaG91bGQgYmUgZ3JlZW4uIElmIGl0IGlzIG5vdCBncmVlbiwgdGhlbiAKLXJpZ2h0IGNsaWNrIG92ZXIgdGhlIHJlc291cmNlIG1hbmFnZXIncyBuYW1lIGFuZCBzZWxlY3QgPGI+U3RhcnQgcmVzb3VyY2UgbWFuYWdlcjwvYj4gZnJvbSB0aGUgcG9wdXAgbWVudSB0byBzdGFydCB0aGUKLXJlc291cmNlIG1hbmFnZXIuPC9wPgotPHA+QmVmb3JlIHJ1bm5pbmcgYW4gYXBwbGljYXRpb24sIGl0IG11c3QgaGF2ZSBhIGxhdW5jaCBjb25maWd1cmF0aW9uIGRlZmluZWQgZm9yIGl0LiBBIGxhdW5jaCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIAotYWxsIG9mIHRoZSBzZXR0aW5ncyByZXF1aXJlZCB0byBydW4gdGhlIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWVzIGVudGVyZWQgaW4gYSBsYXVuY2ggY29uZmlndXJhdGlvbiBhcmUgc2F2ZWQgc28gdGhhdCB0aGUKLW5leHQgdGltZSB0aGUgYXBwbGljYXRpb24gaXMgcnVuIHVzaW5nIHRoZSBzYW1lIGxhdW5jaCBjb25maWd1cmF0aW9uLCB0aG9zZSB2YWx1ZXMgZG8gbm90IG5lZWQgdG8gYmUgZW50ZXJlZCBhZ2Fpbi48L3A+Ci08cD5UbyBjcmVhdGUgYSBsYXVuY2ggY29uZmlndXJhdGlvbiwgY2xpY2sgdGhlIDxiPlJ1bjwvYj4gbWVudSBpbiB0aGUgRWNsaXBzZSBtZW51YmFyIGFuZCBzZWxlY3QgPGI+T3BlbiBSdW4gRGlhbG9nPC9iPi4gCi1BbHRlcm5hdGl2ZWx5LCBjbGljayB0aGUgZHJvcGRvd24gbmV4dCB0byB0aGUgcnVuIGljb24gaW4gdGhlIEVjbGlwc2UgdG9vbGJhciBhbmQgc2VsZWN0IE9wZW4gUnVuIERpYWxvZy4gCi1XaGVuIHRoZSBydW4gZGlhbG9nIGlzIGRpc3BsYXllZCwgcmlnaHQgY2xpY2sgb3ZlciA8Yj5QYXJhbGxlbCBBcHBsaWNhdGlvbjwvYj4gYW5kIGNsaWNrIDxiPk5ldzwvYj4gZnJvbSB0aGUgbWVudS4gCi1UaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uLiBTZXQgaXRzIG5hbWUgdG8gdGhlIGRlc2lyZWQgdmFsdWUuIFNlbGVjdCB0aGUgPGI+TWFpbjwvYj4gdGFiIGFuZCBmaWxsIGluCi10aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0uIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZWJ1Z2dlciB0YWIgaGFzIGFuIGFwcHJvcHJpYXRlIGRlYnVnZ2VyIHNlbGVjdGVkLgotRmlsbCBpbiB0aGUgQXJndW1lbnRzIHRhYiB3aXRoIGFueSBhcHBsaWNhdGlvbiBwcm9ncmFtIGFyZ3VtZW50cy4gRmlsbCBpbiB0aGUgRW52aXJvbm1lbnQgdGFiIHdpdGggYW55IGVudmlyb25tZW50IHZhcmlhYmxlCi1zZXR0aW5ncyByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24uIElmIHlvdSBhcmUgdXNpbmcgUGFyYWxsZWwgRW52aXJvbm1lbnQgaW4gYmFzaWMgbW9kZSwgZGVzY3JpYmVkIGJlbG93LCB0aGVuIHlvdSBzaG91bGQKLW5vdCBzZXQgYW55IFBhcmFsbGVsIEVudmlyb25tZW50IGVudmlyb25tZW50IHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCBNUF8pIGluIHRoZSBFbnZpcm9ubWVudCB0YWIgYW5kIG5vdCBzcGVjaWZ5IGFueQotb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgPGI+cG9lPC9iPiBjb21tYW5kIGluIHRoZSBBcmd1bWVudHMgdGFiLCBzaW5jZSB0aG9zZSBzZXR0aW5ncyBtYXkgY29uZmxpY3Qgd2l0aCBzZXR0aW5ncyBpbiB0aGUKLVBhcmFsbGVsIHRhYiBhbmQgY2F1c2UgYXBwbGljYXRpb24gaW52b2NhdGlvbiB0byBmYWlsLjwvcD4KLTxwPlRoZSA8Yj5SZXNvdXJjZXM8L2I+IHRhYiBpcyB0aGUgdGFiIHdoZXJlIGludm9jYXRpb24gb3B0aW9ucyB1bmlxdWUgdG8gUGFyYWxsZWwgRW52aXJvbm1lbnQgYXJlIHNwZWNpZmllZC4gV2hlbiBpdCBpcyBpbml0aWFsbHkgZGlzcGxheWVkLAotaXQgd2lsbCBhcHBlYXIgYXMgZm9sbG93cy48L3A+Ci08aW1nIHNyYz0iaW1hZ2VzL3BlX3J1bl9jb25maWcuanBnIj4KLTxwPlRoZSBmaXJzdCBzdGVwIGlzIHRvIHNlbGVjdCBhIHJlc291cmNlIG1hbmFnZXIgZnJvbSB0aGUgZHJvcGRvd24gbGlzdCBhdCB0aGUgdG9wIG9mIHRoZSByZXNvdXJjZXMgdGFiLiBUaGlzIGxpc3QgY29udGFpbnMKLWVudHJpZXMgZm9yIGVhY2ggcnVubmluZyByZXNvdXJjZSBtYW5hZ2VyLiA8L3A+Ci08cD5UaGUgbmV4dCBzdGVwIGlzIHRvIHNlbGVjdCB0aGUgcnVuIG1vZGUgZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGJ5IGNoZWNraW5nIG9yIHVuY2hlY2tpbmcgdGhlIDxiPkFkdmFuY2VkIE1vZGU8L2I+Ci1jaGVja2JveC48L3A+Ci08cD5XaGVuIHRoaXMgY2hlY2tib3ggaXMgY2hlY2tlZCwgdGhlIHJlc291cmNlIG1hbmFnZXIgaXMgcnVubmluZyBpbiBhZHZhbmNlZCBtb2RlLiBJbiB0aGlzIG1vZGUsIHlvdSBuZWVkIHRvIGhhdmUgYW4gZXhpc3RpbmcKLXNldHVwIHNjcmlwdCBjcmVhdGVkLiBUaGlzIGlzIGEgdGV4dCBmaWxlLCBzaW1pbGFyIHRvIGEgLnJjIG9yIC5wcm9maWxlIHNjcmlwdCwgd2hlcmUgeW91IHNwZWNpZnkgUGFyYWxsZWwgRW52aXJvbm1lbnQKLWVudmlyb25tZW50IHZhcmlhYmxlIHNldHRpbmdzLiBFYWNoIHNldHRpbmcgaXMgc3BlY2lmaWVkIGFzIGEga2V5d29yZC12YWx1ZSBwYWlyIHN1Y2ggYXM8L3A+Ci08c2FtcD4KLU1QX1BST0NTPTI8YnI+Ci1NUF9IT1NURklMRT0vaG9tZS9kZWVwdmlldy9ob3N0ZmlsZQotPC9zYW1wPgotPHA+VGhpcyBmaWxlIHNob3VsZCBjb250YWluIG9ubHkgUGFyYWxsZWwgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MuIEFueXRoaW5nIGVsc2UgaXMgaWdub3JlZC4gCi1FbnZpcm9ubWVudCB2YXJpYWJsZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgYXJlIG5vdCB2YWxpZGl0eSBjaGVja2VkLiBZb3UgbWF5IGFsc28gc3BlY2lmeSBQYXJhbGxlbCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCAKLXZhcmlhYmxlcyBpbiB0aGUgRW52aXJvbm1lbnQgdGFiIGluIHRoaXMgbW9kZSwgYXMgd2VsbCBhcyBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMgdG8gdGhlIDxiPnBvZTwvYj4gY29tbWFuZCBpbiB0aGUgQXJndW1lbnRzCi10YWIgaW4gYWR2YW5jZWQgbW9kZS4gQW55IHNldHRpbmdzIGluIHRoZXNlIHRhYnMgd2lsbCBub3QgYmUgY2hlY2tlZCwgYW5kIG1heSByZXN1bHQgaW4gY29uZmxpY3RzIHdpdGggd2hhdCBpcyBzcGVjaWZpZWQKLWluIHRoZSBzZXR1cCBzY3JpcHQuPC9wPgotPHA+V2hlbiB1c2luZyBhZHZhbmNlZCBtb2RlLCB0aGUgPGI+RW52aXJvbm1lbnQgU2V0dXAgU2NyaXB0PC9iPiB3aWxsIGJlIGVuYWJsZWQsIGFuZCB5b3UgbXVzdCBmaWxsIGluIHRoZSBwYXRobmFtZSB0byB0aGUgCi1zZXR1cCBzY3JpcHQuPC9wPgotPHA+SWYgdGhlIDxiPkFkdmFuY2VkIE1vZGU8L2I+IGNoZWNrYm94IGlzIG5vdCBjaGVja2VkLCB0aGVuIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIHJ1bm5pbmcgaW4gYmFzaWMgbW9kZS4gSW4gdGhpcyBtb2RlLAotdGhlIHRhYmJlZCBwYW5lIGF0IHRoZSBib3R0b20gb2YgdGhlIFBhcmFsbGVsIHRhYiB3aWxsIGJlIGVuYWJsZWQsIGFuZCB5b3UgY2FuIGZpbGwgaW4gdGhlIHJlcXVpcmVkIHZhbHVlcyBmb3IgcnVubmluZyAKLXlvdXIgYXBwbGljYXRpb24uPC9wPgotPHA+SW4gYmFzaWMgbW9kZSwgZWFjaCBQYXJhbGxlbCBFbnZpcm9ubWVudCBvcHRpb24gaGFzIGEgZmllbGQgaW4gdGhlIHRhYmJlZCBwYW5lIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhcmFsbGVsIHRhYi4gCi1FYWNoIGZpZWxkIGhhcyBmbHlvdmVyIGhlbHAsIHdoZXJlIHlvdSBjYW4gc2VlIHRoYXQgaGVscCBieSBtb3ZpbmcgdGhlIG1vdXNlIG92ZXIgdGhlIGZpZWxkIGluIHF1ZXN0aW9uLiBFYWNoIGZpZWxkIGlzIAotdmFsaWRpdHkgY2hlY2tlZCB3aGVyZSBwb3NzaWJsZSB0byByZWR1Y2UgdGhlIHByb2JhYmlsaXR5IG9mIGludm9raW5nIGFuIGFwcGxpY2F0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzLjwvcD4KLTxwPklmIGFueSB2YWx1ZSBpbiB0aGUgcGFyYWxsZWwgdGFiIGlzIGludmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBsYXVuY2gKLWNvbmZpZ3VyYXRpb24gZGlhbG9nIGFuZCB0aGUgYXBwbHkgYW5kIHJ1biBidXR0b25zIHdpbGwgYmUgZGlzYWJsZWQuIE9uY2UgYWxsIGZpZWxkcyBoYXZlIHZhbGlkIHZhbHVlcywgdGhlbiB5b3UgY2FuCi1jbGljayB0aGUgPGI+QXBwbHk8L2I+YnV0dG9uIHRvIHNhdmUgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiwgb3IgY2xpY2sgdGhlIDxiPlJ1bjwvYj4gYnV0dG9uIHRvCi1pbnZva2UgdGhlIGFwcGxpY2F0aW9uLjwvcD4KLTxwPkFzIGEgbWluaW11bSwgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIG9yIHRoZSBQYXJhbGxlbCBFbnZpcm9ubWVudCBzZXR1cCBzY3JpcHQgbXVzdCBzcGVjaWZ5IHRoZSBwYXRoIG5hbWUgb2YgYSB2YWxpZCAKLWhvc3RmaWxlIChNUF9IT1NURklMRSkgYW5kIG51bWJlciBvZiBwYXJhbGxlbCB0YXNrcyAoTVBfVEFTS1MpPHA+Ci08aDM+PGEgbmFtZT1kZWJ1Z2dpbmc+PC9hPkRlYnVnZ2luZyBhIFBhcmFsbGVsIEFwcGxpY2F0aW9uPC9oMz4KLVlvdSBjYW4gZGVidWcgYSBwYXJhbGxlbCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgYnVpbHQgaW4gUFRQIHBhcmFsbGVsIGRlYnVnZ2VyLiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIHNhbWUgcnVuIGNvbmZpZ3VyYXRpb24gCi10aGF0IHlvdSB1c2UgZm9yIHJ1bm5pbmcgeW91ciBhcHBsaWNhdGlvbi4gWW91IGNhbiBkZWJ1ZyB0aGUgYXBwbGljYXRpb24gYnkgY2xpY2tpbmcgdGhlIGRlYnVnIGljb24gCi1pbiB0aGUgRWNsaXBzZSB0b29sYmFyIG9yIGJ5IHNlbGVjdGluZyA8Yj5EZWJ1ZyBDb25maWd1cmF0aW9uczwvYj4gZnJvbSB0aGUgRWNsaXBzZSBydW4gbWVudS4gQmVmb3JlIHlvdSBkZWJ1ZyBhIHBhcmFsbGVsIGFwcGxpY2F0aW9uIAotZm9yIHRoZSBmaXJzdCB0aW1lLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHByb3Blcmx5IGNvbmZpZ3VyZWQgdGhlIGRlYnVnZ2VyIGJ5IG9wZW5pbmcKLXRoZSBydW4gY29uZmlndXJhdGlvbiBhbmQgc2VsZWN0aW5nIHRoZSBkZWJ1ZyB0YWIgdGhlbiBtYWtpbmcgc3VyZSB0aGUgZGVidWdnZXIgc2V0dGluZ3MgYXJlIGNvcnJlY3QuPC9wPiAgCi08aDI+PGEgbmFtZT1yZWRpcmVjdGlvbj48L2E+UmVkaXJlY3Rpbmcgc3RkaW88L2gyPgotPHA+VGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhhdCBkYXRhIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXMgdG8gc3Rkb3V0IGlzIHNlbnQgdG8gdGhlIFBUUCBHVUkuIFRoYXQgZGF0YSBjYW4gYmUgdmlld2VkIGJ5IAotZG91YmxlIGNsaWNraW5nIHRoZSB0YXNrIGljb24gZm9yIHRoZSB0YXNrLCBub3JtYWxseSB0YXNrIDAsIGluIHRoZSBqb2JzIHZpZXcgcm93IGZvciB0aGUgYXBwbGljYXRpb24uIFRoaXMgd2lsbCBvcGVuCi1hIHByb2Nlc3MgdmlldyB3aW5kb3cgc2hvd2luZyB0aGUgZGF0YS4gQnkgZGVmYXVsdCwgdGhlIGFwcGxpY2F0aW9uIHN0ZGVyciBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgY29uc29sZSB3aGVyZSBFY2xpcHNlIAotd2FzIGludm9rZWQuPC9wPgotPHA+SWYgdGhlIGFwcGxpY2F0aW9uIHdyaXRlcyBhIGxhcmdlIGFtb3VudCBvZiBkYXRhIHRvIHN0ZG91dCBvciBzdGRlcnIsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHNlbmRpbmcgdGhhdCBkYXRhIHRvIHRoZQotUFRQIEdVSSBmb3IgaGFuZGxpbmcgY2FuIGNhdXNlIHRoZSBHVUkgdG8gYmVjb21lIHNsb3cgb3IgdW5yZXNwb25zaXZlLiBBbHRlcm5hdGl2ZWx5LCBzdGRvdXQgYW5kIHN0ZGVyciBjYW4gYmUgcmVkaXJlY3RlZCB0bwotZmlsZXMgb24gdGhlIG5vZGUgd2hlcmUgdGhlIHJlc291cmNlIG1hbmFnZXIgcHJvY2VzcyBpcyBydW5uaW5nLiBUaGlzIGlzIGRvbmUgYnkgc3BlY2lmeWluZyB0aGUgcGF0aCBuYW1lIGZvciBzdGRvdXQgb3IKLXN0ZGVyciBpbiB0aGUgZmllbGRzIGxhYmVsbGVkIDxiPlN0ZG91dCBQYXRoPC9iPiBvciA8Yj5TdGRlcnIgUGF0aDwvYj4gaW4gdGhlIHBhcmFsbGVsIHRhYiBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uPC9wPgotCi08aDI+PGEgbmFtZT1tb25pdG9yaW5nPjwvYT5Nb25pdG9yaW5nIEFwcGxpY2F0aW9uIEV4ZWN1dGlvbjwvaDI+Ci08cD5PbmNlIHlvdSBjbGljayBydW4gdG8gaW52b2tlIHRoZSBhcHBsaWNhdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIgd2lsbCBtb25pdG9yIHRoZSBhcHBsaWNhdGlvbidzIGV4ZWN1dGlvbi4gV2hlbiBQYXJhbGxlbAotRW52aXJvbm1lbnQgYWxsb2NhdGVzIHRhc2tzIHRvIG5vZGVzLCB0aGUgZGVmYXVsdCBtYWNoaW5lIHZpZXcgZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHdpbGwgYmUgdXBkYXRlZCB0byBzaG93IHRoZSBub2RlcyAKLXRoYXQgYXJlIGN1cnJlbnRseSBpbiB1c2UuIElmIHlvdSBtb3ZlIHRoZSBtb3VzZSBvdmVyIGEgbm9kZSBpY29uLCBpbiB0aGUgbWFjaGluZSB2aWV3LCB5b3Ugd2lsbCBzZWUgdGhlIGhvc3RuYW1lIGZvciB0aGF0IG5vZGUuIAotSWYgeW91IGRvdWJsZSBjbGljayBhIG5vZGUgaWNvbiBpbiB0aGUgbWFjaGluZSB2aWV3LCB0aGUgbm9kZSBhdHRyaWJ1dGVzIGFuZCBwcm9jZXNzIGluZm8gd2luZG93cyBpbiB0aGUgbWFjaGluZSB2aWV3Ci13aWxsIGJlIHVwZGF0ZWQgdG8gcmVwb3J0IGN1cnJlbnQgc3RhdHVzIGZvciB0aGF0IG5vZGUuIE9uY2UgYSBqb2IgY29tcGxldGVzLCB0aGUgbWFjaGluZXMgdmlldyB3aWxsIGJlIHVwZGF0ZWQgdG8gCi1zaG93IHRoZSBjdXJyZW50IHN0YXR1cy4gQXMgYXBwbGljYXRpb25zIGNvbXBsZXRlLCBub2RlcyBtYXkgZGlzYXBwZWFyIGZyb20gdGhlIG1hY2hpbmUgdmlldyBpZiBubyBvdGhlciBwYXJhbGxlbCB0YXNrcwotaW52b2tlZCBieSB5b3UgYXJlIHVzaW5nIHRob3NlIG5vZGVzLjwvcD4KLTxwPk9uY2UgYSBwYXJhbGxlbCBhcHBsaWNhdGlvbiBzdGFydHMsIHRoZSBqb2JzIHZpZXcgd2lsbCBiZSB1cGRhdGVkIHRvIHNob3cgYW4gZW50cnkgZm9yIHRoYXQgam9iLCBhbG9uZyB3aXRoIGljb25zIGZvciBlYWNoCi10YXNrIGluIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGpvYiBhbmQgdGFzayBpY29ucyB3aWxsIGNoYW5nZSBzdGF0ZSBvbmNlIFBhcmFsbGVsIEVudmlyb25tZW50IHNldHVwIGlzIGNvbXBsZXRlIHRvIHNob3cgdGhlCi1qb2IgaXMgcnVubmluZywgYW5kIGFnYWluIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGV4aXRzLCB0byBzaG93IHRoYXQgdGhlIGpvYiBoYXMgY29tcGxldGVkLiBBdCBhbnkgdGltZSB0aGF0IGEgam9iIGlzIHNob3duIGluCi10aGUgam9icyB2aWV3LCB5b3UgY2FuIGRvdWJsZSBjbGljayBhIHRhc2sgaWNvbiB0byBzaG93IHRoZSBzdGRvdXQgb3V0cHV0IGZvciB0aGF0IHRhc2sgaWYgc3Rkb3V0IGhhcyBub3QgYmVlbgotcmVkaXJlY3RlZCB0byBhIGZpbGUuPC9wPgotPGgyPjxBIG5hbWU9cmVzdHJpY3Rpb25zPjwvQT5SZXN0cmljdGlvbnM8L2gyPgotPHVsPgotPGxpPkFwcGxpY2F0aW9ucyBjYW5ub3QgcmVhZCBpbnB1dCBmcm9tIHN0ZGluIGF0IHRoaXMgdGltZTwvbGk+Ci08bGk+RGVidWdnaW5nIGFwcGxpY2F0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZTwvbGk+Ci08bGk+QWxsIHBhdGhuYW1lcyBzcGVjaWZpZWQgaW4gdGhlIFBhcmFsbGVsIHRhYiBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhYnNvbHV0ZSBwYXRobmFtZXM8L2xpPgotPGxpPldoZW4gdXNpbmcgTG9hZExldmVsZXIsIHlvdSBjYW4gb25seSB2aXcgc3Rkb3V0IGFuZCBzdGRlcnIgb3V0cHV0IGZvciBhcHBsaWNhdGlvbnMgc3RhcnRlZCBieSB5b3UgdXNpbmcgdGhpcyBwbHVnaW4uIAotWW91IGNhbm5vdCB2aWV3IG91dHB1dCBmcm9tIG90aGVyIGFwcGxpY2F0aW9ucyBldmVuIHRob3VnaCB5b3UgY2FuIHNlZSB0aGVpciBwcm9jZXNzIGljb25zIGluIHRoZSBQVFAgam9icyB2aWV3LjwvbGk+IAotPC91bD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvaW1hZ2VzL3BlX3ByZWZlcmVuY2VzLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcHJlZmVyZW5jZXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWM1YzJhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcHJlZmVyZW5jZXMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wZV9wcm94eV9jb25maWcuanBnIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wZV9wcm94eV9jb25maWcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzRlMjkxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcHJveHlfY29uZmlnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcHJveHlfY29uZmlnXzEuanBnIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wZV9wcm94eV9jb25maWdfMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2YjI5OTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wZV9wcm94eV9jb25maWdfMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvaW1hZ2VzL3BlX3Byb3h5X2NvbmZpZ18yLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcHJveHlfY29uZmlnXzIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjlkZmUyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcHJveHlfY29uZmlnXzIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wZV9ydW5fY29uZmlnLmpwZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcGVfcnVuX2NvbmZpZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzODM5N2UuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wZV9ydW5fY29uZmlnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcHJvamVjdF9jcmVhdGVfMS5qcGcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvaW1hZ2VzL3Byb2plY3RfY3JlYXRlXzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OWUyZDBiLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvaHRtbC9pbWFnZXMvcHJvamVjdF9jcmVhdGVfMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvaW1hZ2VzL3Byb2plY3RfY3JlYXRlXzIuanBnIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9odG1sL2ltYWdlcy9wcm9qZWN0X2NyZWF0ZV8yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjgxMzI5Ni4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL2h0bWwvaW1hZ2VzL3Byb2plY3RfY3JlYXRlXzIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZTc0OTAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgSUJNIFBhcmFsbGVsIEVudmlyb25tZW50IFVzZXIgR3VpZGUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjM2JkMWIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLQotPCEtLSBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgLS0+Ci08IS0tIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgIC0tPgotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAtLT4KLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jCi0gICAgICAgICAgICBmaWxlPSJ0b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvaGVscC9BY3RpdmF0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvaGVscC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY0YjQ1Ny4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL2hlbHAvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC90b2MueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscC90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjAzYjM5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmhlbHAvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgIC0tPgotPCEtLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAtLT4KLTwhLS0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgLS0+Ci08IS0tIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJSdW5uaW5nIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCBBcHBsaWNhdGlvbnMiPgotCTx0b3BpYyBsYWJlbD0iSW50cm9kdWN0aW9uIiAgaHJlZj0iaHRtbC9QRU1haW5IZWxwLmh0bWwjaW50cm9kdWN0aW9uIj4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlJlcXVpcmVtZW50cyIgaHJlZj0iaHRtbC9QRU1haW5IZWxwLmh0bWwjcmVxdWlyZW1lbnRzIj48L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iSW5zdGFsbGF0aW9uIiBocmVmPSJodG1sL1BFTWFpbkhlbHAuaHRtbCNpbnN0YWxsYXRpb24iPjwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGhyZWY9Imh0bWwvUEVNYWluSGVscC5odG1sI3N0YXJ0aW5nIj48L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iUnVubmluZyBhbiBhcHBsaWNhdGlvbiIgaHJlZj0iaHRtbC9QRU1haW5IZWxwLmh0bWwjcnVubmluZyI+PC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlJlZGlyZWN0aW5nIHN0ZGlvIiBocmVmPSJodG1sL1BFTWFpbkhlbHAuaHRtbCNyZWRpcmVjdGlvbiI+PC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1vbml0b3JpbmcgYXBwbGljYXRpb24gZXhlY3V0aW9uIiBocmVmPSJodG1sL1BFTWFpbkhlbHAuaHRtbCNtb25pdG9yaW5nIj48L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iUmVzdHJpY3Rpb25zIiBocmVmPSJodG1sL1BFTWFpbkhlbHAuaHRtbCNyZXN0cmljdGlvbnMiPjwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ly5jZHRwcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvLmNkdHByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0MGI1OWYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4KLQotPGNkdHByb2plY3QgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZSI+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4KLTxkYXRhPgotPGl0ZW0gaWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08L2l0ZW0+Ci08aXRlbSBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUucGF0aGVudHJ5Ij4KLTxwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0ib3V0IiBwYXRoPSIiLz4KLTxwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkRJU0NPVkVSRURfU0NBTk5FUl9JTkZPIi8+Ci08L2l0ZW0+Ci08L2RhdGE+Ci08L2NkdHByb2plY3Q+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8uY3Byb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8uY3Byb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMGJkNjguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvLmNwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZmlsZVZlcnNpb24gNC4wLjA/PgotCi08Y3Byb2plY3Q+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPgotPGNjb25maWd1cmF0aW9uIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjIwNTE1NDk0MjkiPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KLTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgotPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KLTxwYXJzZXIgZW5hYmxlZD0iZmFsc2UiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0iZmFsc2UiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9ImZhbHNlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08L3N0b3JhZ2VNb2R1bGU+Ci0KLTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmRlZmF1bHRDb25maWdEYXRhUHJvdmlkZXIiIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjIwNTE1NDk0MjkiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iY29udmVydGVkQ29uZmlnIj4KLTxleHRlcm5hbFNldHRpbmdzLz4KLTxleHRlbnNpb25zPgotPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+Ci08L2V4dGVuc2lvbnM+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUubGFuZ3VhZ2UubWFwcGluZyIvPgotCi08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIvPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhdGhlbnRyeSI+Ci08cGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9Im91dCIgcGF0aD0iIi8+Ci08cGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5ESVNDT1ZFUkVEX1NDQU5ORVJfSU5GTyIvPgotPC9zdG9yYWdlTW9kdWxlPgotPC9jY29uZmlndXJhdGlvbj4KLTwvc3RvcmFnZU1vZHVsZT4KLTwvY3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8uY3ZzaWdub3JlIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjNmFiZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1hdXRvbTR0ZS5jYWNoZQotcHRwX2libXBlX21pbmlwcm94eQotc3RhbXAtaDEKLS5kZXBzCi1jb25maWcuc3RhdHVzCi1wdHBfaWJtcGVfcHJveHkKLU1ha2VmaWxlCi1hLm91dC5kU1lNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYmVjMTQ5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUubWFrZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQuYXJndW1lbnRzPC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQuY29yZS5lcnJvck91dHB1dFBhcnNlcjwva2V5PgotCQkJCQk8dmFsdWU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuTWFrZUVycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdMREVycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLlZDRXJyb3JQYXJzZXI7PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbnZpcm9ubWVudDwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVBdXRvQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmVuYWJsZUZ1bGxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmluYzwva2V5PgotCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVkSW5jcmVtZW50YWxCdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQubG9jYXRpb248L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQuY29tbWFuZDwva2V5PgotCQkJCQk8dmFsdWU+bWFrZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmNsZWFuPC9rZXk+Ci0JCQkJCTx2YWx1ZT5jbGVhbjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQ2xlYW5CdWlsZDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYXBwZW5kX2Vudmlyb25tZW50PC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS51c2VEZWZhdWx0QnVpbGRDbWQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnN0b3BPbkVycm9yPC9rZXk+Ci0JCQkJCTx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGQudGFyZ2V0LmF1dG88L2tleT4KLQkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5TY2FubmVyQ29uZmlnQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQuY29yZS5jbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5tYWtlTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5TY2FubmVyQ29uZmlnTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY2NuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY2R0LmNvcmUucHJlZnMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY2R0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyMjEyYTcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jVGh1IEFwciAxNyAwOToxMToyMCBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluZGV4ZXIvaW5kZXhlcklkPW9yZy5lY2xpcHNlLmNkdC5jb3JlLmZhc3RJbmRleGVyCi1pbmRleGVySWQ9b3JnLmVjbGlwc2UuY2R0LmNvcmUuZmFzdEluZGV4ZXIKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L0FVVEhPUlMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9BVVRIT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2YzMjI1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L0FVVEhPUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1EYXZlIFdvb3R0b24gPGR3b290dG9uQHVzLmlibS5jb20+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvQ09QWUlORyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2UxMDUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLVRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi1vZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi1yaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IAotbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0KLUFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gCi1MQS1DQyAwNC0xMTUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9DaGFuZ2VMb2cgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L0lOU1RBTEwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBjNDJmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L0lOU1RBTEwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TZWUgUkVBRE1FIGZvciBidWlsZC9pbnN0YWxsIGluc3RydWN0aW9ucy4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZjQwNzQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ci1CdW5kbGUtVmVyc2lvbjogMi4xLjEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnB0cC5wcm94eSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L01ha2VmaWxlLmFtIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlMTU0MTQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0KLWJpbl9QUk9HUkFNUyA9CQkJcHRwX2libXBlX3Byb3h5IHB0cF9pYm1wZV9taW5pcHJveHkKLQotcHRwX2libXBlX3Byb3h5X1NPVVJDRVMgPQkJc3JjL3B0cF9pYm1wZV9wcm94eS5jCi1wdHBfaWJtcGVfcHJveHlfQ0ZMQUdTID0JCS1nIC1JJChQUk9YWSkvaW5jbHVkZSAtSSQoVVRJTFMpL2luY2x1ZGUgLUkvb3B0L2libWxsL0xvYWRML2Z1bGwvaW5jbHVkZS8gLUkvdXNyL2xwcC9Mb2FkTC9mdWxsL2luY2x1ZGUvIC1JJChQUk9YWSkvaW5jbHVkZSAtSSQoVVRJTFMpL2luY2x1ZGUgJChBTV9DRkxBR1MpIAotcHRwX2libXBlX3Byb3h5X0xERkxBR1MgPSAtZwotcHRwX2libXBlX3Byb3h5X0xEQUREID0JCS1sZGwgLWxwdGhyZWFkIAotCi1wdHBfaWJtcGVfbWluaXByb3h5X1NPVVJDRVMgPQkJc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYwotcHRwX2libXBlX21pbmlwcm94eV9DRkxBR1MgPQkJLWcgCi1wdHBfaWJtcGVfbWluaXByb3h5X0xERkxBR1MgPSAtZwotcHRwX2libXBlX21pbmlwcm94eV9MREFERCA9CQktbHB0aHJlYWQgCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9NYWtlZmlsZS5pbiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODJkODg0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuOS42IGZyb20gTWFrZWZpbGUuYW0uCi0jIEBjb25maWd1cmVfaW5wdXRACi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAotIyAyMDAzLCAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUBTRVRfTUFLRUAKLQotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLXRvcF9idWlsZGRpciA9IC4KLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLUlOU1RBTEwgPSBASU5TVEFMTEAKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1iaW5fUFJPR1JBTVMgPSBwdHBfaWJtcGVfcHJveHkkKEVYRUVYVCkgcHRwX2libXBlX21pbmlwcm94eSQoRVhFRVhUKQotRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9jb25maWcuaC5pbiBcCi0JJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgQVVUSE9SUyBDT1BZSU5HIENoYW5nZUxvZyBJTlNUQUxMIE5FV1MgXAotCWNvbXBpbGUgY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgZGVwY29tcCBpbnN0YWxsLXNoIG1pc3NpbmcKLXN1YmRpciA9IC4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLWFtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgotYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKLQkkKEFDTE9DQUxfTTQpCi1hbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAotIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlndXJlLnN0YXR1cy5saW5lbm8KLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9Ci1hbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoYmluZGlyKSIKLWJpblBST0dSQU1TX0lOU1RBTEwgPSAkKElOU1RBTExfUFJPR1JBTSkKLVBST0dSQU1TID0gJChiaW5fUFJPR1JBTVMpCi1hbV9wdHBfaWJtcGVfbWluaXByb3h5X09CSkVDVFMgPSAgXAotCXB0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS4kKE9CSkVYVCkKLXB0cF9pYm1wZV9taW5pcHJveHlfT0JKRUNUUyA9ICQoYW1fcHRwX2libXBlX21pbmlwcm94eV9PQkpFQ1RTKQotcHRwX2libXBlX21pbmlwcm94eV9ERVBFTkRFTkNJRVMgPQotYW1fcHRwX2libXBlX3Byb3h5X09CSkVDVFMgPSAgXAotCXB0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkuJChPQkpFWFQpCi1wdHBfaWJtcGVfcHJveHlfT0JKRUNUUyA9ICQoYW1fcHRwX2libXBlX3Byb3h5X09CSkVDVFMpCi1wdHBfaWJtcGVfcHJveHlfREVQRU5ERU5DSUVTID0KLURFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkuCi1kZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCi1hbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcwotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCi0JJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotU09VUkNFUyA9ICQocHRwX2libXBlX21pbmlwcm94eV9TT1VSQ0VTKSAkKHB0cF9pYm1wZV9wcm94eV9TT1VSQ0VTKQotRElTVF9TT1VSQ0VTID0gJChwdHBfaWJtcGVfbWluaXByb3h5X1NPVVJDRVMpIFwKLQkkKHB0cF9pYm1wZV9wcm94eV9TT1VSQ0VTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAotICB7IHRlc3QgISAtZCAkKGRpc3RkaXIpIFwKLSAgICB8fCB7IGZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICAgICYmIHJtIC1mciAkKGRpc3RkaXIpOyB9OyB9Ci1ESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKLUdaSVBfRU5WID0gLS1iZXN0Ci1kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1kaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAotQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAotQU1UQVIgPSBAQU1UQVJACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFAgPSBAQ1BQQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUdSRVAgPSBAR1JFUEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotT0JKRVhUID0gQE9CSkVYVEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAotUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKLVBBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAotUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKLVBBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACi1QQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKLVBPRSA9IEBQT0VACi1SQU5MSUIgPSBAUkFOTElCQAotU0VUX01BS0UgPSBAU0VUX01BS0VACi1TSEVMTCA9IEBTSEVMTEAKLVNUUklQID0gQFNUUklQQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hbV9fZmFzdGRlcENDX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ0NfRkFMU0VACi1hbV9fZmFzdGRlcENDX1RSVUUgPSBAYW1fX2Zhc3RkZXBDQ19UUlVFQAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotcHRwX2libXBlX3Byb3h5X1NPVVJDRVMgPSBzcmMvcHRwX2libXBlX3Byb3h5LmMKLXB0cF9pYm1wZV9wcm94eV9DRkxBR1MgPSAtZyAtSSQoUFJPWFkpL2luY2x1ZGUgLUkkKFVUSUxTKS9pbmNsdWRlIC1JL29wdC9pYm1sbC9Mb2FkTC9mdWxsL2luY2x1ZGUvIC1JL3Vzci9scHAvTG9hZEwvZnVsbC9pbmNsdWRlLyAtSSQoUFJPWFkpL2luY2x1ZGUgLUkkKFVUSUxTKS9pbmNsdWRlICQoQU1fQ0ZMQUdTKSAKLXB0cF9pYm1wZV9wcm94eV9MREZMQUdTID0gLWcKLXB0cF9pYm1wZV9wcm94eV9MREFERCA9IC1sZGwgLWxwdGhyZWFkIAotcHRwX2libXBlX21pbmlwcm94eV9TT1VSQ0VTID0gc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYwotcHRwX2libXBlX21pbmlwcm94eV9DRkxBR1MgPSAtZyAKLXB0cF9pYm1wZV9taW5pcHJveHlfTERGTEFHUyA9IC1nCi1wdHBfaWJtcGVfbWluaXByb3h5X0xEQUREID0gLWxwdGhyZWFkIAotYWxsOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5vYmoKLWFtLS1yZWZyZXNoOgotCUA6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCUBmb3IgZGVwIGluICQ/OyBkbyBcCi0JICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKLQkgICAgKiQkZGVwKikgXAotCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgJzsgXAotCSAgICAgIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgXAotCQkmJiBleGl0IDA7IFwKLQkgICAgICBleGl0IDE7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZSc7IFwKLQljZCAkKHRvcF9zcmNkaXIpICYmIFwKLQkgICQoQVVUT01BS0UpIC0tZ251ICBNYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCi0JICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0kKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpICQoQUNMT0NBTF9BTUZMQUdTKQotCi1jb25maWcuaDogc3RhbXAtaDEKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkgIHJtIC1mIHN0YW1wLWgxOyBcCi0JICAkKE1BS0UpIHN0YW1wLWgxOyBcCi0JZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotJChzcmNkaXIpL2NvbmZpZy5oLmluOiAgJChhbV9fY29uZmlndXJlX2RlcHMpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCXJtIC1mIHN0YW1wLWgxCi0JdG91Y2ggJEAKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmggc3RhbXAtaDEKLWluc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChta2Rpcl9wKSAiJChERVNURElSKSQoYmluZGlyKSIKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBwMT1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCSAgaWYgdGVzdCAtZiAkJHAgXAotCSAgOyB0aGVuIFwKLQkgICAgZj1gZWNobyAiJCRwMSIgfCBzZWQgJ3MsXi4qLywsOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgJyQkcCcgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKLQkgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgIiQkcCIgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIiB8fCBleGl0IDE7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1iaW5QUk9HUkFNUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAotCSAgcm0gLWYgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAotCWRvbmUKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi1wdHBfaWJtcGVfbWluaXByb3h5JChFWEVFWFQpOiAkKHB0cF9pYm1wZV9taW5pcHJveHlfT0JKRUNUUykgJChwdHBfaWJtcGVfbWluaXByb3h5X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHB0cF9pYm1wZV9taW5pcHJveHkkKEVYRUVYVCkKLQkkKExJTkspICQocHRwX2libXBlX21pbmlwcm94eV9MREZMQUdTKSAkKHB0cF9pYm1wZV9taW5pcHJveHlfT0JKRUNUUykgJChwdHBfaWJtcGVfbWluaXByb3h5X0xEQUREKSAkKExJQlMpCi1wdHBfaWJtcGVfcHJveHkkKEVYRUVYVCk6ICQocHRwX2libXBlX3Byb3h5X09CSkVDVFMpICQocHRwX2libXBlX3Byb3h5X0RFUEVOREVOQ0lFUykgCi0JQHJtIC1mIHB0cF9pYm1wZV9wcm94eSQoRVhFRVhUKQotCSQoTElOSykgJChwdHBfaWJtcGVfcHJveHlfTERGTEFHUykgJChwdHBfaWJtcGVfcHJveHlfT0JKRUNUUykgJChwdHBfaWJtcGVfcHJveHlfTERBREQpICQoTElCUykKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3B0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5Qb0BhbV9fcXVvdGVACi0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgJDw7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2A7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi1wdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkubzogc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHRwX2libXBlX21pbmlwcm94eV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHRwX2libXBlX21pbmlwcm94eS1wdHBfaWJtcGVfbWluaXByb3h5Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkuVHBvIiAtYyAtbyBwdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkubyBgdGVzdCAtZiAnc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3B0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5UcG8iICIkKERFUERJUikvcHRwX2libXBlX21pbmlwcm94eS1wdHBfaWJtcGVfbWluaXByb3h5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3B0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHRwX2libXBlX21pbmlwcm94eS5jJyBvYmplY3Q9J3B0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfaWJtcGVfbWluaXByb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHB0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5vIGB0ZXN0IC1mICdzcmMvcHRwX2libXBlX21pbmlwcm94eS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzcmMvcHRwX2libXBlX21pbmlwcm94eS5jCi0KLXB0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5vYmo6IHNyYy9wdHBfaWJtcGVfbWluaXByb3h5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHB0cF9pYm1wZV9taW5pcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHB0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkuVHBvIiAtYyAtbyBwdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHRwX2libXBlX21pbmlwcm94eS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NyYy9wdHBfaWJtcGVfbWluaXByb3h5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wdHBfaWJtcGVfbWluaXByb3h5LmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkuVHBvIiAiJChERVBESVIpL3B0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYycgb2JqZWN0PSdwdHBfaWJtcGVfbWluaXByb3h5LXB0cF9pYm1wZV9taW5pcHJveHkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfaWJtcGVfbWluaXByb3h5X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHB0cF9pYm1wZV9taW5pcHJveHktcHRwX2libXBlX21pbmlwcm94eS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wdHBfaWJtcGVfbWluaXByb3h5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYyc7IGZpYAotCi1wdHBfaWJtcGVfcHJveHktcHRwX2libXBlX3Byb3h5Lm86IHNyYy9wdHBfaWJtcGVfcHJveHkuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHRwX2libXBlX3Byb3h5X0NGTEFHUykgJChDRkxBR1MpIC1NVCBwdHBfaWJtcGVfcHJveHktcHRwX2libXBlX3Byb3h5Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wdHBfaWJtcGVfcHJveHktcHRwX2libXBlX3Byb3h5LlRwbyIgLWMgLW8gcHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5vIGB0ZXN0IC1mICdzcmMvcHRwX2libXBlX3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wdHBfaWJtcGVfcHJveHkuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3B0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkuVHBvIiAiJChERVBESVIpL3B0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzcmMvcHRwX2libXBlX3Byb3h5LmMnIG9iamVjdD0ncHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfaWJtcGVfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5vIGB0ZXN0IC1mICdzcmMvcHRwX2libXBlX3Byb3h5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNyYy9wdHBfaWJtcGVfcHJveHkuYwotCi1wdHBfaWJtcGVfcHJveHktcHRwX2libXBlX3Byb3h5Lm9iajogc3JjL3B0cF9pYm1wZV9wcm94eS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfaWJtcGVfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHB0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5UcG8iIC1jIC1vIHB0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkub2JqIGBpZiB0ZXN0IC1mICdzcmMvcHRwX2libXBlX3Byb3h5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3JjL3B0cF9pYm1wZV9wcm94eS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zcmMvcHRwX2libXBlX3Byb3h5LmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wdHBfaWJtcGVfcHJveHktcHRwX2libXBlX3Byb3h5LlRwbyIgIiQoREVQRElSKS9wdHBfaWJtcGVfcHJveHktcHRwX2libXBlX3Byb3h5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3B0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3JjL3B0cF9pYm1wZV9wcm94eS5jJyBvYmplY3Q9J3B0cF9pYm1wZV9wcm94eS1wdHBfaWJtcGVfcHJveHkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwdHBfaWJtcGVfcHJveHlfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHRwX2libXBlX3Byb3h5LXB0cF9pYm1wZV9wcm94eS5vYmogYGlmIHRlc3QgLWYgJ3NyYy9wdHBfaWJtcGVfcHJveHkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzcmMvcHRwX2libXBlX3Byb3h5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NyYy9wdHBfaWJtcGVfcHJveHkuYyc7IGZpYAotdW5pbnN0YWxsLWluZm8tYW06Ci0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGRvbmUgfCBcCi0JICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKLQkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKLQkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKLQkgICAgJCR0YWdzICQkdW5pcXVlOyBcCi0JZmkKLWN0YWdzOiBDVEFHUwotQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAotCQkkKFRBR1NfRklMRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR0YWdzICQkdW5pcXVlCi0KLUdUQUdTOgotCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCi0JICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCi0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCi0JbGlzdD0nJChESVNURklMRVMpJzsgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBjYXNlICQkZmlsZSBpbiBcCi0JICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCi0JICAgICQodG9wX3NyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3wiYDs7IFwKLQkgIGVzYWM7IFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKLQkgICAgZGlyPSIvJCRkaXIiOyBcCi0JICAgICQobWtkaXJfcCkgIiQoZGlzdGRpcikkJGRpciI7IFwKLQkgIGVsc2UgXAotCSAgICBkaXI9Jyc7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKLQkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JLWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTc3NyAtZXhlYyBjaG1vZCBhK3J3eCB7fSBcOyAtbyBcCi0JICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCi0JICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCi0JICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoU0hFTEwpICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKLQl8fCBjaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotZGlzdC1nemlwOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1iemlwMjogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBiemlwMiAtOSAtYyA+JChkaXN0ZGlyKS50YXIuYnoyCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtdGFyWjogZGlzdGRpcgotCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBjb21wcmVzcyAtYyA+JChkaXN0ZGlyKS50YXIuWgotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXNoYXI6IGRpc3RkaXIKLQlzaGFyICQoZGlzdGRpcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikuc2hhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LXppcDogZGlzdGRpcgotCS1ybSAtZiAkKGRpc3RkaXIpLnppcAotCXppcCAtcnEgJChkaXN0ZGlyKS56aXAgJChkaXN0ZGlyKQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0IGRpc3QtYWxsOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JY2FzZSAnJChESVNUX0FSQ0hJVkVTKScgaW4gXAotCSoudGFyLmd6KikgXAotCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIuYnoyKikgXAotCSAgYnVuemlwMiAtYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIuWiopIFwKLQkgIHVuY29tcHJlc3MgLWMgJChkaXN0ZGlyKS50YXIuWiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnNoYXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCi0JKi56aXAqKSBcCi0JICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKLQllc2FjCi0JY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIGErdyAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKLQlta2RpciAkKGRpc3RkaXIpL19pbnN0Ci0JY2htb2QgYS13ICQoZGlzdGRpcikKLQlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKLQkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAotCSAgJiYgY2QgJChkaXN0ZGlyKS9fYnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCi0JICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAmJiAoeyBcCi0JICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKLQkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAotCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAotCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAotCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQlAKGVjaG8gIiQoZGlzdGRpcikgYXJjaGl2ZXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbjogIjsgXAotCSAgbGlzdD0nJChESVNUX0FSQ0hJVkVTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUpIHwgXAotCSAgc2VkIC1lICcxe2g7cy8uLz0vZztwO3g7fScgLWUgJyQke3A7eDt9JwotZGlzdHVuaW5zdGFsbGNoZWNrOgotCUBjZCAkKGRpc3R1bmluc3RhbGxjaGVja19kaXIpIFwKLQkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKLQkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAotCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAotCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAotCSAgICAgICAgZmkgOyBcCi0JICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICAgZXhpdCAxOyB9ID4mMgotZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgotCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAotCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCi0JICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKLQkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAotCSAgICAgICBleGl0IDE7IH0gPiYyCi1jaGVjay1hbTogYWxsLWFtCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgY29uZmlnLmgKLWluc3RhbGxkaXJzOgotCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGJpbmRpcikiOyBkbyBcCi0JICB0ZXN0IC16ICIkJGRpciIgfHwgJChta2Rpcl9wKSAiJCRkaXIiOyBcCi0JZG9uZQotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLWRpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAotCWRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLXRhZ3MKLQotZHZpOiBkdmktYW0KLQotZHZpLWFtOgotCi1odG1sOiBodG1sLWFtCi0KLWluZm86IGluZm8tYW0KLQotaW5mby1hbToKLQotaW5zdGFsbC1kYXRhLWFtOgotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMKLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGxjaGVjay1hbToKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQotCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQotCS1ybSAtcmYgLi8kKERFUERJUikKLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotcGRmOiBwZGYtYW0KLQotcGRmLWFtOgotCi1wczogcHMtYW0KLQotcHMtYW06Ci0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1pbmZvLWFtCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBcCi0JY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjdGFncyBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgXAotCWRpc3QtZ3ppcCBkaXN0LXNoYXIgZGlzdC10YXJaIGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gXAotCWRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAotCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgZGlzdHVuaW5zdGFsbGNoZWNrIGR2aSBcCi0JZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKLQlpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIFwKLQlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCi0JaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKLQltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCi0JbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAotCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtYmluUFJPR1JBTVMgXAotCXVuaW5zdGFsbC1pbmZvLWFtCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L05FV1MgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L05FV1MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvUkVBRE1FIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L1JFQURNRQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9hYm91dC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9hY2xvY2FsLm00IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyNzNiYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsODc4ICswLDAgQEAKLSMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjkuNiAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fQVVUT01BS0VfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEF1dG9tYWtlIFguWSB0cmFjZXMgdGhpcyBtYWNybyB0byBlbnN1cmUgYWNsb2NhbC5tNCBoYXMgYmVlbgotIyBnZW5lcmF0ZWQgZnJvbSB0aGUgbTQgZmlsZXMgYWNjb21wYW55aW5nIEF1dG9tYWtlIFguWS4KLUFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwgW2FtX19hcGlfdmVyc2lvbj0iMS45Il0pCi0KLSMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyBpdCBjYW4gYmUgdHJhY2VkLgotIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFDX0lOSVRfQVVUT01BS0UuCi1BQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCi0JIFtBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjkuNl0pXSkKLQotIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCi0jICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCi0jIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCi0jCi0jIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKLSMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKLSMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCi0jIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQotIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAotIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKLSMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KLSMKLSMgJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCi0jICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKLSMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCi0jICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKLSMKLSMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKLSMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKLSMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91Ci0jIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCi0jCi0jIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAotIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKLSMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKLSMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCi0jICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCi0jIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCi0jIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KLSMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgotIwotIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KLSMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQotIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCi0KLUFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCi1bZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KLUFDX1BSRVJFUShbMi41MF0pZG5sCi0jIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCi1hbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1dKQotCi0jIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDcKLQotIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi1BQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAotW0FDX1BSRVJFUSgyLjUyKWRubAotIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCi0JWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAotQUNfU1VCU1QoWyQxX1RSVUVdKQotQUNfU1VCU1QoWyQxX0ZBTFNFXSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKAotW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgotICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCi1maV0pXSkKLQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA4Ci0KLSMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCi0jIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAotIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKLSMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZwotIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCi0KLQotIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgotIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgotIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgotIwotIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKLSMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKLSMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAotIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KLUFDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKLVtBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKLUFDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKLUFDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCi1BQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAotCi1pZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAotICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAotICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCi0gICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAotICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKLVtpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCi0gICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKLSAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKLSAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKLSAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAotICAjIGluIEQnLgotICBta2RpciBjb25mdGVzdC5kaXIKLSAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKLSAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KLSAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKLSAgY2QgY29uZnRlc3QuZGlyCi0gICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQotICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQotICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQotICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KLSAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0Ci0gICMgZGlyZWN0b3J5LgotICBta2RpciBzdWIKLQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi0gIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCi0gICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKLSAgZmkKLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgY2FzZSAkZGVwbW9kZSBpbgotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotXSkKLUFDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQotQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKLV0pCi0KLQotIyBBTV9TRVRfREVQRElSCi0jIC0tLS0tLS0tLS0tLS0KLSMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCi0jIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUwotQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1BQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCi1dKQotCi0KLSMgQU1fREVQX1RSQUNLCi0jIC0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCi1bQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAotWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCi1BQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKQotXSkKLQotIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jc2VyaWFsIDMKLQotIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLVtmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KLSAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKLSAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KLSAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAotICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KLSAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKLSAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KLSAgIyBTbyBsZXQncyBncmVwIHdob2xlIGZpbGUuCi0gIGlmIGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnICRtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCi0gIGVsc2UKLSAgICBjb250aW51ZQotICBmaQotICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCi0gIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKLSAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCi0gICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAjIGV4cGFuc2lvbi4KLSAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0gICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCi0gICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAotICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKLSAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgotICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICBkb25lCi1kb25lCi1dKSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0KLQotIyBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCi0jCi0jIFRoaXMgY29kZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gYXV0b21hdGljIGRlcGVuZGVuY3kgdHJhY2tpbmcKLSMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAotIyBuZWVkIGluIG9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBjb2RlLgotQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLVtBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKLSAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi0gICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKLV0pCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMTIKLQotIyBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2guICBTb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKLSMgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuICBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBBTV9JTklUX0FVVE9NQUtFKFBBQ0tBR0UsIFZFUlNJT04sIFtOTy1ERUZJTkVdKQotIyBBTV9JTklUX0FVVE9NQUtFKFtPUFRJT05TXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhlIGNhbGwgd2l0aCBQQUNLQUdFIGFuZCBWRVJTSU9OIGFyZ3VtZW50cyBpcyB0aGUgb2xkIHN0eWxlCi0jIGNhbGwgKHByZSBhdXRvY29uZi0yLjUwKSwgd2hpY2ggaXMgYmVpbmcgcGhhc2VkIG91dC4gIFBBQ0tBR0UKLSMgYW5kIFZFUlNJT04gc2hvdWxkIG5vdyBiZSBwYXNzZWQgdG8gQUNfSU5JVCBhbmQgcmVtb3ZlZCBmcm9tCi0jIHRoZSBjYWxsIHRvIEFNX0lOSVRfQVVUT01BS0UuCi0jIFdlIHN1cHBvcnQgYm90aCBjYWxsIHN0eWxlcyBmb3IgdGhlIHRyYW5zaXRpb24uICBBZnRlcgotIyB0aGUgbmV4dCBBdXRvbWFrZSByZWxlYXNlLCBBdXRvY29uZiBjYW4gbWFrZSB0aGUgQUNfSU5JVAotIyBhcmd1bWVudHMgbWFuZGF0b3J5LCBhbmQgdGhlbiB3ZSBjYW4gZGVwZW5kIG9uIGEgbmV3IEF1dG9jb25mCi0jIHJlbGVhc2UgYW5kIGRyb3AgdGhlIG9sZCBjYWxsIHN1cHBvcnQuCi1BQ19ERUZVTihbQU1fSU5JVF9BVVRPTUFLRV0sCi1bQUNfUFJFUkVRKFsyLjU4XSlkbmwKLWRubCBBdXRvY29uZiB3YW50cyB0byBkaXNhbGxvdyBBTV8gbmFtZXMuICBXZSBleHBsaWNpdGx5IGFsbG93Ci1kbmwgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KLW00X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAotIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmCi0gICB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotCi0jIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKLWlmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCi0gIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKLSAgZWxzZQotICAgIENZR1BBVEhfVz1lY2hvCi0gIGZpCi1maQotQUNfU1VCU1QoW0NZR1BBVEhfV10pCi0KLSMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KLWRubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgotbTRfaWZ2YWwoWyQyXSwKLVttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKLSBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCi0gQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCi1bX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAotCi1fQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKLVtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQotQU1fUFJPR19JTlNUQUxMX1NICi1BTV9QUk9HX0lOU1RBTExfU1RSSVAKLUFDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLUFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLV9BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAotICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKLQkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKLV9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLV0pCi1dKQotCi0KLSMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLSMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi0jIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KLQotIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQotIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCi0jIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KLUFDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKLVsjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkMSB8ICQxOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkMSIgPmBBU19ESVJOQU1FKFskMV0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NICi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgJGluc3RhbGxfc2guCi1BQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci1BQ19TVUJTVChpbnN0YWxsX3NoKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKLSMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgotQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCi1bcm0gLXJmIC50c3QgMj4vZGV2L251bGwKLW1rZGlyIC50c3QgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLnRzdDsgdGhlbgotICBhbV9fbGVhZGluZ19kb3Q9LgotZWxzZQotICBhbV9fbGVhZGluZ19kb3Q9XwotZmkKLXJtZGlyIC50c3QgMj4vZGV2L251bGwKLUFDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCi0KLSMgQ2hlY2sgdG8gc2VlIGhvdyAnbWFrZScgdHJlYXRzIGluY2x1ZGVzLgkgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAzCi0KLSMgQU1fTUFLRV9JTkNMVURFKCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgdG8gc2VlIGhvdyBtYWtlIHRyZWF0cyBpbmNsdWRlcy4KLUFDX0RFRlVOKFtBTV9NQUtFX0lOQ0xVREVdLAotW2FtX21ha2U9JHtNQUtFLW1ha2V9Ci1jYXQgPiBjb25maW5jIDw8ICdFTkQnCi1hbV9fZG9pdDoKLQlAZWNobyBkb25lCi0uUEhPTlk6IGFtX19kb2l0Ci1FTkQKLSMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KLUFDX01TR19DSEVDS0lORyhbZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZV0pCi1hbV9faW5jbHVkZT0iIyIKLWFtX19xdW90ZT0KLV9hbV9yZXN1bHQ9bm9uZQotIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKLSMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKLSMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KLSMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKLSMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCi0jIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KLWlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgotICAgYW1fX2luY2x1ZGU9aW5jbHVkZQotICAgYW1fX3F1b3RlPQotICAgX2FtX3Jlc3VsdD1HTlUKLWZpCi0jIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KLWlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KLSAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKLSAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KLSAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCi0gICAgICBhbV9fcXVvdGU9IlwiIgotICAgICAgX2FtX3Jlc3VsdD1CU0QKLSAgIGZpCi1maQotQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKLUFDX1NVQlNUKFthbV9fcXVvdGVdKQotQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQotcm0gLWYgY29uZmluYyBjb25mbWYKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAzCi0KLSMgQU1fUFJPR19DQ19DX08KLSMgLS0tLS0tLS0tLS0tLS0KLSMgTGlrZSBBQ19QUk9HX0NDX0NfTywgYnV0IGNoYW5nZWQgZm9yIGF1dG9tYWtlLgotQUNfREVGVU4oW0FNX1BST0dfQ0NfQ19PXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDX0NfT10pZG5sCi1BQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi0jIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKLSMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgotc2V0IGR1bW15ICRDQwotYWNfY2M9YGVjaG8gJFsyXSB8IHNlZCBbJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nXWAKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfY2NfJyR7YWNfY2N9X2Nfb2BcIiAhPSB5ZXMiOyB0aGVuCi0gICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgotICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KLSAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgotICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAotICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKLSAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKLWZpCi1dKQotCi0jIEZha2UgdGhlIGV4aXN0ZW5jZSBvZiBwcm9ncmFtcyB0aGF0IEdOVSBtYWludGFpbmVycyB1c2UuICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKLVtBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQotJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9Ci1BQ19TVUJTVCgkMSldKQotCi0KLSMgQU1fTUlTU0lOR19IQVNfUlVOCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCi0jIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KLUFDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLXRlc3QgeCIke01JU1NJTkcrc2V0fSIgPSB4c2V0IHx8IE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgQUNfTVNHX1dBUk4oW2BtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKLWZpCi1dKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX01LRElSX1AKLSMgLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHdoZXRoZXIgYG1rZGlyIC1wJyBpcyBzdXBwb3J0ZWQsIGZhbGxiYWNrIHRvIG1raW5zdGFsbGRpcnMgb3RoZXJ3aXNlLgotIwotIyBBdXRvbWFrZSAxLjggdXNlZCBgbWtkaXIgLW0gMDc1NSAtcCAtLScgdG8gZW5zdXJlIHRoYXQgZGlyZWN0b3JpZXMKLSMgY3JlYXRlZCBieSBgbWFrZSBpbnN0YWxsJyBhcmUgYWx3YXlzIHdvcmxkIHJlYWRhYmxlLCBldmVuIGlmIHRoZQotIyBpbnN0YWxsZXIgaGFwcGVucyB0byBoYXZlIGFuIG92ZXJseSByZXN0cmljdGl2ZSB1bWFzayAoZS5nLiAwNzcpLgotIyBUaGlzIHdhcyBhIG1pc3Rha2UuICBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIHJlYXNvbnMgd2h5IHdlIG11c3Qgbm90Ci0jIHVzZSBgLW0gMDc1NSc6Ci0jICAgLSBpdCBjYXVzZXMgc3BlY2lhbCBiaXRzIGxpa2UgU0dJRCB0byBiZSBpZ25vcmVkLAotIyAgIC0gaXQgbWF5IGJlIHRvbyByZXN0cmljdGl2ZSAoc29tZSBzZXR1cHMgZXhwZWN0IDc3NSBkaXJlY3RvcmllcykuCi0jCi0jIERvIG5vdCB1c2UgLW0gMDc1NSBhbmQgbGV0IHBlb3BsZSBjaG9vc2Ugd2hhdGV2ZXIgdGhleSBleHBlY3QgYnkKLSMgc2V0dGluZyB1bWFzay4KLSMKLSMgV2UgY2Fubm90IGFjY2VwdCBhbnkgaW1wbGVtZW50YXRpb24gb2YgYG1rZGlyJyB0aGF0IHJlY29nbml6ZXMgYC1wJy4KLSMgU29tZSBpbXBsZW1lbnRhdGlvbnMgKHN1Y2ggYXMgU29sYXJpcyA4J3MpIGFyZSBub3QgdGhyZWFkLXNhZmU6IGlmIGEKLSMgcGFyYWxsZWwgbWFrZSB0cmllcyB0byBydW4gYG1rZGlyIC1wIGEvYicgYW5kIGBta2RpciAtcCBhL2MnCi0jIGNvbmN1cnJlbnRseSwgYm90aCB2ZXJzaW9uIGNhbiBkZXRlY3QgdGhhdCBhLyBpcyBtaXNzaW5nLCBidXQgb25seQotIyBvbmUgY2FuIGNyZWF0ZSBpdCBhbmQgdGhlIG90aGVyIHdpbGwgZXJyb3Igb3V0LiAgQ29uc2VxdWVudGx5IHdlCi0jIHJlc3RyaWN0IG91cnNlbHZlcyB0byBHTlUgbWFrZSAodXNpbmcgdGhlIC0tdmVyc2lvbiBvcHRpb24gZW5zdXJlcwotIyB0aGlzLikKLUFDX0RFRlVOKFtBTV9QUk9HX01LRElSX1BdLAotW2lmIG1rZGlyIC1wIC0tdmVyc2lvbiAuID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KLSAgIyBXZSB1c2VkIHRvIGtlZXBpbmcgdGhlIGAuJyBhcyBmaXJzdCBhcmd1bWVudCwgaW4gb3JkZXIgdG8KLSAgIyBhbGxvdyAkKG1rZGlyX3ApIHRvIGJlIHVzZWQgd2l0aG91dCBhcmd1bWVudC4gIEFzIGluCi0gICMgICAkKG1rZGlyX3ApICQoc29tZWRpcikKLSAgIyB3aGVyZSAkKHNvbWVkaXIpIGlzIGNvbmRpdGlvbmFsbHkgZGVmaW5lZC4gIEhvd2V2ZXIgdGhpcyBpcyB3cm9uZwotICAjIGZvciB0d28gcmVhc29uczoKLSAgIyAgMS4gaWYgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGJ5IGEgdXNlciB3aG8gY2Fubm90IHdyaXRlIGAuJwotICAjICAgICBtYWtlIGluc3RhbGwgd2lsbCBmYWlsLAotICAjICAyLiB0aGUgYWJvdmUgY29tbWVudCBzaG91bGQgbW9zdCBjZXJ0YWlubHkgcmVhZAotICAjICAgICAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpCi0gICMgICAgIHNvIGl0IGRvZXMgbm90IHdvcmsgd2hlbiAkKHNvbWVkaXIpIGlzIHVuZGVmaW5lZCBhbmQKLSAgIyAgICAgJChERVNURElSKSBpcyBub3QuCi0gICMgIFRvIHN1cHBvcnQgdGhlIGxhdHRlciBjYXNlLCB3ZSBoYXZlIHRvIHdyaXRlCi0gICMgICAgIHRlc3QgLXogIiQoc29tZWRpcikiIHx8ICQobWtkaXJfcCkgJChERVNURElSKSQoc29tZWRpciksCi0gICMgIHNvIHRoZSBgLicgdHJpY2sgaXMgcG9pbnRsZXNzLgotICBta2Rpcl9wPSdta2RpciAtcCAtLScKLWVsc2UKLSAgIyBPbiBOZXh0U3RlcCBhbmQgT3BlblN0ZXAsIHRoZSBgbWtkaXInIGNvbW1hbmQgZG9lcyBub3QKLSAgIyByZWNvZ25pemUgYW55IG9wdGlvbi4gIEl0IHdpbGwgaW50ZXJwcmV0IGFsbCBvcHRpb25zIGFzCi0gICMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLCBhbmQgdGhlbiBhYm9ydCBiZWNhdXNlIGAuJyBhbHJlYWR5Ci0gICMgZXhpc3RzLgotICBmb3IgZCBpbiAuLy1wIC4vLS12ZXJzaW9uOwotICBkbwotICAgIHRlc3QgLWQgJGQgJiYgcm1kaXIgJGQKLSAgZG9uZQotICAjICQobWtpbnN0YWxsZGlycykgaXMgZGVmaW5lZCBieSBBdXRvbWFrZSBpZiBta2luc3RhbGxkaXJzIGV4aXN0cy4KLSAgaWYgdGVzdCAtZiAiJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyI7IHRoZW4KLSAgICBta2Rpcl9wPSckKG1raW5zdGFsbGRpcnMpJwotICBlbHNlCi0gICAgbWtkaXJfcD0nJChpbnN0YWxsX3NoKSAtZCcKLSAgZmkKLWZpCi1BQ19TVUJTVChbbWtkaXJfcF0pXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgMwotCi0jIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAotW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCi0KLSMgX0FNX1NFVF9PUFRJT04oTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KLUFDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCi1bbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCi0KLSMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKLVtBQ19GT1JFQUNIKFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQotCi0jIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLUFDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKLVttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQotCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDQKLQotIyBBTV9TQU5JVFlfQ0hFQ0sKLSMgLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAotIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKLSMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKLSMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCi0jIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKLSMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQotIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgotQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCi1bQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWRubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgotICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCi1maQotSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJHtTSEVMTH0gXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQotCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgX0FNX1BST0dfVEFSKEZPUk1BVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KLSMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCi0jIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5Ci0jICR0YXJkaXIuCi0jICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKLSMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KLSMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKLUFDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAotWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLUFNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKLW00X2lmKFskMV0sIFt2N10sCi0gICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAotICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAotICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKLUFDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKLSMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KLV9hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCi1fYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQotIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCi0jIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCi1mb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scwotZG8KLSAgY2FzZSAkX2FtX3Rvb2wgaW4KLSAgZ251dGFyKQotICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKLSAgICBkbwotICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKLSAgICA7OwotICBwbGFpbnRhcikKLSAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQotICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCi0gICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQotICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCi0gICAgOzsKLSAgcGF4KQotICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ncGF4IC1yJwotICAgIDs7Ci0gIGNwaW8pCi0gICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJwotICAgIDs7Ci0gIG5vbmUpCi0gICAgYW1fX3Rhcj1mYWxzZQotICAgIGFtX190YXJfPWZhbHNlCi0gICAgYW1fX3VudGFyPWZhbHNlCi0gICAgOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCi0gICMgYW5kIGFtX191bnRhciBzZXQuCi0gIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhawotCi0gICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcwotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCi0gIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KLSAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQotICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhawotICBmaQotZG9uZQotcm0gLXJmIGNvbmZ0ZXN0LmRpcgotCi1BQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCi1BQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCi1BQ19TVUJTVChbYW1fX3Rhcl0pCi1BQ19TVUJTVChbYW1fX3VudGFyXSkKLV0pICMgX0FNX1BST0dfVEFSCi0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM0NzM4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBBVVRIT1JTLFwKLSAgICAgICAgICAgICAgIENPUFlJTkcsXAotICAgICAgICAgICAgICAgQ2hhbmdlTG9nLFwKLSAgICAgICAgICAgICAgIElOU1RBTEwsXAotICAgICAgICAgICAgICAgTWFrZWZpbGUuYW0sXAotICAgICAgICAgICAgICAgTWFrZWZpbGUuaW4sXAotICAgICAgICAgICAgICAgTkVXUyxcCi0gICAgICAgICAgICAgICBSRUFETUUsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhY2xvY2FsLm00LFwKLSAgICAgICAgICAgICAgIGNvbXBpbGUsXAotICAgICAgICAgICAgICAgY29uZmlnLmd1ZXNzLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5oLmluLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMsXAotICAgICAgICAgICAgICAgY29uZmlnLnN1YixcCi0gICAgICAgICAgICAgICBjb25maWd1cmUsXAotICAgICAgICAgICAgICAgY29uZmlndXJlLmluLFwKLSAgICAgICAgICAgICAgIGRlcGNvbXAsXAotICAgICAgICAgICAgICAgaW5zdGFsbC1zaCxcCi0gICAgICAgICAgICAgICBtaXNzaW5nLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29tcGlsZSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2NvbXBpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MWUwMDAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29tcGlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIFdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotCi1zY3JpcHR2ZXJzaW9uPTIwMDMtMTEtMDkuMDAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAotIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCi0jIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBjb21waWxlIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVdyYXBwZXIgZm9yIGNvbXBpbGVycyB3aGljaCBkbyBub3QgdW5kZXJzdGFuZCBgLWMgLW8nLgotUmVtb3ZlIGAtbyBkZXN0Lm8nIGZyb20gQVJHUywgcnVuIFBST0dSQU0gd2l0aCB0aGUgcmVtYWluaW5nCi1hcmd1bWVudHMsIGFuZCByZW5hbWUgdGhlIG91dHB1dCBhcyBleHBlY3RlZC4KLQotSWYgeW91IGFyZSB0cnlpbmcgdG8gYnVpbGQgYSB3aG9sZSBwYWNrYWdlIHRoaXMgaXMgbm90IHRoZQotcmlnaHQgc2NyaXB0IHRvIHJ1bjogcGxlYXNlIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGZpbGUgYElOU1RBTEwnLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAwCi0gICAgOzsKLSAgLXYgfCAtLXYqKQotICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCi0gICAgZXhpdCAwCi0gICAgOzsKLWVzYWMKLQotCi1wcm9nPSQxCi1zaGlmdAotCi1vZmlsZT0KLWNmaWxlPQotYXJncz0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gIGNhc2UgIiQxIiBpbgotICAgIC1vKQotICAgICAgIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCi0gICAgICAjIFNvIHdlIGRvIHNvbWV0aGluZyB1Z2x5IGhlcmUuCi0gICAgICBvZmlsZT0kMgotICAgICAgc2hpZnQKLSAgICAgIGNhc2UgIiRvZmlsZSIgaW4KLQkqLm8gfCAqLm9iaikKLQkgIDs7Ci0JKikKLQkgIGFyZ3M9IiRhcmdzIC1vICRvZmlsZSIKLQkgIG9maWxlPQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICAgICA7OwotICAgICouYykKLSAgICAgIGNmaWxlPSQxCi0gICAgICBhcmdzPSIkYXJncyAkMSIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFyZ3M9IiRhcmdzICQxIgotICAgICAgOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KLSAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQotICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCi0gICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KLSAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbwotICAjIG9rLgotICBleGVjICIkcHJvZyIgJGFyZ3MKLWZpCi0KLSMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCi1jb2ZpbGU9YGVjaG8gJGNmaWxlIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5jJC8uby8nYAotCi0jIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCi0jIE5vdGU6IHVzZSBgWy8uLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKLSMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKLSMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgotbG9ja2Rpcj1gZWNobyAkY29maWxlIHwgc2VkIC1lICdzfFsvLi1dfF98ZydgLmQKLXdoaWxlIHRydWU7IGRvCi0gIGlmIG1rZGlyICRsb2NrZGlyID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBicmVhawotICBmaQotICBzbGVlcCAxCi1kb25lCi0jIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KLXRyYXAgInJtZGlyICRsb2NrZGlyOyBleGl0IDEiIDEgMiAxNQotCi0jIFJ1biB0aGUgY29tcGlsZS4KLSIkcHJvZyIgJGFyZ3MKLXN0YXR1cz0kPwotCi1pZiB0ZXN0IC1mICIkY29maWxlIjsgdGhlbgotICBtdiAiJGNvZmlsZSIgIiRvZmlsZSIKLWZpCi0KLXJtZGlyICRsb2NrZGlyCi1leGl0ICRzdGF0dXMKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlnLmd1ZXNzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGY3NzcyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDEzMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDItMDMtMDQnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi0KLWR1bW15PWR1bW15LSQkCi10cmFwICdybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4KLSMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKLSMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KLQotc2V0X2NjX2Zvcl9idWlsZD0nY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgZHVtbXkoKXt9IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IDsgZG8KLQkgICgkYyAkZHVtbXkuYyAtYyAtbyAkZHVtbXkubykgPi9kZXYvbnVsbCAyPiYxIDsKLQkgIGlmIHRlc3QgJD8gPSAwIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjJwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKLQkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06Ci0JIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06Ci0JIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgotCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgotCWV4aXQgMCA7OwotICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBocDMwMDpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hY3BwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZXBwYzpPcGVuQlNEOio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlYi11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMzpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFscGhhOk9TRjE6KjoqKQotCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQlmaQotCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgotCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCi0JIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCi0JIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCi0JY2F0IDw8RU9GID4kZHVtbXkucwotCS5kYXRhCi1cJExmb3JtYXQ6Ci0JLmJ5dGUgMzcsMTAwLDQ1LDM3LDEyMCwxMCwwCSMgIiVkLSV4XG4iCi0KLQkudGV4dAotCS5nbG9ibCBtYWluCi0JLmFsaWduIDQKLQkuZW50IG1haW4KLW1haW46Ci0JLmZyYW1lIFwkMzAsMTYsXCQyNiwwCi0JbGRncCBcJDI5LDAoXCQyNykKLQkucHJvbG9ndWUgMQotCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyIFwkMAotCWxkYSBcJDIsLTEKLQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQotCWxkYSBcJDE2LFwkTGZvcm1hdAotCW1vdiBcJDAsXCQxNwotCW5vdCBcJDEsXCQxOAotCWpzciBcJDI2LHByaW50ZgotCWxkZ3AgXCQyOSwwKFwkMjYpCi0JbW92IDAsXCQxNgotCWpzciBcJDI2LGV4aXQKLQkuZW5kIG1haW4KLUVPRgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCWNhc2UgYC4vJGR1bW15YCBpbgotCQkJMC0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTEtMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEtMTAxKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTItMzAzKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQkyLTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciCi0JCQkJOzsKLQkJCTItMTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgMDs7Ci0gICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCAwIDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgTklMRSo6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKLSAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKLSAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCi0gICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgotICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5Ci0gICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKLSAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKLSAgICAjIGJlIG5vIHByb2JsZW0uCi0gICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLQllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IFwKLQkgICYmIC4vJGR1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKLQkgICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgMCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpKjg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYTY0OkFJWDoqOiopCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAuLyRkdW1teWAKLQkJICAgIGlmIHRlc3QgLXogIiRIUF9BUkNIIjsgdGhlbiBIUF9BUkNIPWhwcGE7IGZpCi0JCSAgICBybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQkJZmkgOzsKLQllc2FjCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0Q6KjoqOiopCi0JZWNobyBhbHBoYS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNwYXJjKjpCU0QvT1M6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpDWUdXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6UFcqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKLQlleGl0IDAgOzsKLSAgICB4ODY6SW50ZXJpeCo6MyopCi0JZWNobyBpMzg2LXBjLWludGVyaXgzCi0JZXhpdCAwIDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpNaW5peDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4Ci0JZXhpdCAwIDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgKLQlleGl0IDAgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBtaXBzOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHMKLQkjdW5kZWYgbWlwc2VsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkgCi0JQ1BVPW1pcHNlbCAKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpIAotCUNQVT1taXBzCi0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmIAotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCi0Jcm0gLWYgJGR1bW15LmMKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS1wYy1saW51eC1nbnUiICYmIGV4aXQgMAotCTs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotICAgICAgICBlc2FjCi0Jb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQlleGl0IDAgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAotCWV4aXQgMCA7OwotICAgIHNoKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAotCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KLQkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgotCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCi0JICBlbGYzMi1pMzg2KQotCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgotCQk7OwotCSAgYS5vdXQtaTM4Ni1saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDAgOzsJCQotCSAgY29mZi1pMzg2KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCi0JCWV4aXQgMCA7OwotCSAgIiIpCi0JCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgotCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCAwIDs7Ci0JZXNhYwotCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0JI2lmZGVmIF9fRUxGX18KLQkjIGlmZGVmIF9fR0xJQkNfXwotCSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0JTElCQz1nbnUKLQkjICBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgIGVuZGlmCi0JIyBlbHNlCi0JTElCQz1nbnVsaWJjMQotCSMgZW5kaWYKLQkjZWxzZQotCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCi0JTElCQz1nbnUKLQkjZWxzZQotCUxJQkM9Z251YW91dAotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAotCXJtIC1mICRkdW1teS5jCi0JdGVzdCB4IiR7TElCQ30iICE9IHggJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IiAmJiBleGl0IDAKLQl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIGVjaG8gIiR7VEVOVEFUSVZFfSIgJiYgZXhpdCAwCi0JOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQotCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2Oio6NTpbNzhdKikKLQljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgotCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKLQkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7Ci0JICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgP0lJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCWVjaG8gYHVuYW1lIC1wYC1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAieDg2cGMiOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9cGMKLQkJZWNobyBpMzg2LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWVsc2UKLQkJZWNobyBgdW5hbWUgLXBgLSR7VU5BTUVfTUFDSElORX0tbnRvLXFueAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpRTlg6Kjo0KikKLQllY2hvIGkzODYtcGMtcW54Ci0JZXhpdCAwIDs7Ci0gICAgTlNSLVtHS0xOUFRWV106Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgMCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgMCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgMCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgMCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgMCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgMCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgMCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgMCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotY2F0ID4mMiA8PEVPRgotJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQotCi1UaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQotdGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQotZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCi0KLSAgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L2NvbmZpZy8KLQotSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCi1zZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQotcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKLWluZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KLQotY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWcuaCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU2NGJmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8KLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHByb3h5c3ZyJyBsaWJyYXJ5ICgtbHByb3h5c3ZyKS4gKi8KLSNkZWZpbmUgSEFWRV9MSUJQUk9YWVNWUiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXRpbHMnIGxpYnJhcnkgKC1sdXRpbHMpLiAqLwotI2RlZmluZSBIQVZFX0xJQlVUSUxTIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsbGFwaS5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX0xMQVBJX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCi0vKiAjdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PICovCi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI2RlZmluZSBQQUNLQUdFICJvcmctZWNsaXBzZS1wdHAtaWJtcGUiCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfTkFNRSAib3JnLmVjbGlwc2UucHRwLmlibXBlIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJvcmcuZWNsaXBzZS5wdHAuaWJtcGUgMi4wLjAiCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJvcmctZWNsaXBzZS1wdHAtaWJtcGUiCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMi4wLjAiCi0KLS8qIExvY2F0aW9uIG9mIHBvZSBwcm9ncmFtICovCi0jZGVmaW5lIFBPRSAiL3Vzci9iaW4vcG9lIgotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KLSNkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI2RlZmluZSBTVERDX0hFQURFUlMgMQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jZGVmaW5lIFZFUlNJT04gIjIuMC4wIgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlnLmguaW4gYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWcuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MWNiNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHByb3h5c3ZyJyBsaWJyYXJ5ICgtbHByb3h5c3ZyKS4gKi8KLSN1bmRlZiBIQVZFX0xJQlBST1hZU1ZSCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXRpbHMnIGxpYnJhcnkgKC1sdXRpbHMpLiAqLwotI3VuZGVmIEhBVkVfTElCVVRJTFMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsbGFwaS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0xMQVBJX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURElOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCi0jdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PCi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCi0jdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9TVFJJTkcKLQotLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQotCi0vKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgotCi0vKiBMb2NhdGlvbiBvZiBwb2UgcHJvZ3JhbSAqLwotI3VuZGVmIFBPRQotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlnLnN1YiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNjU3OTcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlnLnN1YgorKysgL2Rldi9udWxsCkBAIC0xLDE0NDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAotIyAgIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXRpbWVzdGFtcD0nMjAwMi0wMy0wNycKLQotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCi0jIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcwotIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgotIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucwotIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKLSMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcwotIyBjb25maWd1cmF0aW9uLgotCi0jIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgotIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQotIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCi0KLW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKLSAgICAgICAkMCBbT1BUSU9OXSBBTElBUwotCi1DYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0KLWhlbHA9IgotVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotd2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQotICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCAwIDs7Ci0gICAgLS12ZXJzaW9uIHwgLXYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKLSAgICAgICBleGl0IDEgOzsKLQotICAgICpsb2NhbCopCi0gICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi0gICAgICAgZWNobyAkMQotICAgICAgIGV4aXQgMDs7Ci0KLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWNhc2UgJCMgaW4KLSAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLSAxKSA7OwotICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci1lc2FjCi0KLSMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KLSMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCi1tYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKLWNhc2UgJG1heWJlX29zIGluCi0gIG50by1xbngqIHwgbGludXgtZ251KiB8IHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgd2luZG93czMyLSogfCBydG1rLW5vdmEqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlIHwgLWF4aXMpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNjb3V0KQotCQk7OwotCS13cnMpCi0JCW9zPS12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktY2hvcnVzb3MqKQotCQlvcz0tY2hvcnVzb3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotIAktY2hvcnVzcmRiKQotIAkJb3M9LWNob3J1c3JkYgotCQliYXNpY19tYWNoaW5lPSQxCi0gCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNSkKLQkJb3M9LXNjbzMuMnY1Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNCkKLQkJb3M9LXNjbzMuMnY0Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4yLls0LTldKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMnZbNC05XSopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktdWRrKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1pc2MpCi0JCW9zPS1pc2MyLjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1jbGl4KikKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKLQkJOzsKLQktaXNjKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLQktbWludCB8IC1taW50WzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCTE3NTBhIHwgNTgwIFwKLQl8IGEyOWsgXAotCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKLQl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAotCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIFwKLQl8IGM0eCB8IGNsaXBwZXIgXAotCXwgZDEwdiB8IGQzMHYgfCBkc3AxNnh4IFwKLQl8IGZyMzAgXAotCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKLQl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAotCXwgbTMyciB8IG02ODAwMCB8IG02OGsgfCBtODhrIHwgbWNvcmUgXAotCXwgbWlwcyB8IG1pcHMxNiB8IG1pcHM2NCB8IG1pcHM2NGVsIHwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKLQl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIHwgbWlwczY0dnI0MzAwIFwKLQl8IG1pcHM2NHZyNDMwMGVsIHwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAotCXwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIHwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKLQl8IG1pcHNpc2EzMiB8IG1pcHNpc2E2NCBcCi0JfCBtbjEwMjAwIHwgbW4xMDMwMCBcCi0JfCBuczE2ayB8IG5zMzJrIFwKLQl8IG9wZW5yaXNjIHwgb3IzMiBcCi0JfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAotCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAotCXwgcHlyYW1pZCBcCi0JfCBzaCB8IHNoWzM0XSB8IHNoWzM0XWViIHwgc2hiZSB8IHNobGUgfCBzaDY0IFwKLQl8IHNwYXJjIHwgc3BhcmM2NCB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgfCBzcGFyY3Y5IHwgc3BhcmN2OWIgXAotCXwgc3Ryb25nYXJtIFwKLQl8IHRhaG9lIHwgdGh1bWIgfCB0aWM4MCB8IHRyb24gXAotCXwgdjg1MCB8IHY4NTBlIFwKLQl8IHdlMzJrIFwKLQl8IHg4NiB8IHhzY2FsZSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCi0JfCB6OGspCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKLQkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbm9uZQotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQotCQk7OwotCi0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaSo4NiB8IHg4Nl82NCkKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JNTgwLSogXAotCXwgYTI5ay0qIFwKLQl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAotCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKLQl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAotCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm12Ki0qIFwKLQl8IGF2ci0qIFwKLQl8IGJzMjAwMC0qIFwKLQl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM1NHgtKiBcCi0JfCBjbGlwcGVyLSogfCBjeWRyYS0qIFwKLQl8IGQxMHYtKiB8IGQzMHYtKiBcCi0JfCBlbHhzaS0qIFwKLQl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZyMzAtKiB8IGZ4ODAtKiBcCi0JfCBoODMwMC0qIHwgaDg1MDAtKiBcCi0JfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAotCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKLQl8IG0zMnItKiBcCi0JfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAotCXwgbTg4MTEwLSogfCBtODhrLSogfCBtY29yZS0qIFwKLQl8IG1pcHMtKiB8IG1pcHMxNi0qIHwgbWlwczY0LSogfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiBcCi0JfCBtaXBzNjRvcmlvbmVsLSogfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAotCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiBcCi0JfCBtaXBzbGUtKiB8IG1pcHNlbC0qIHwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCi0JfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKLQl8IG9yaW9uLSogXAotCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCi0JfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAotCXwgcHlyYW1pZC0qIFwKLQl8IHJvbXAtKiB8IHJzNjAwMC0qIFwKLQl8IHNoLSogfCBzaFszNF0tKiB8IHNoWzM0XWViLSogfCBzaGJlLSogfCBzaGxlLSogfCBzaDY0LSogXAotCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIHwgc3BhcmNsaXRlLSogXAotCXwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIHwgdGh1bWItKiB8IHRpYzMwLSogfCB0aWM1NHgtKiB8IHRpYzgwLSogfCB0cm9uLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKLQl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c3Rvcm15MTYtKiBcCi0JfCB4dGVuc2EtKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWNyaXMgfCBjcmlzLSogfCBldHJheCopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCi0JCTs7Ci0JZGEzMCB8IGRhMzAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKLQkJOzsKLQlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKLQkJOzsKLQlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCi0JCW9zPS10b3BzMTAKLQkJOzsKLQlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAotCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQotCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKLQkJOzsKLQlkZWx0YTg4KQotCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tZ28zMgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpKjg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWkqODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpKjg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaSo4NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCi0JCTs7Ci0JbWFnbnVtIHwgbTMyMzApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWVybGluKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKLQkJb3M9LXN5c3YKLQkJOzsKLQltaW5ndzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwczMqLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCi0JCTs7Ci0JbWlwczMqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCi0JCTs7Ci0JbW1peCopCi0JCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAotCQlvcz0tbW1peHdhcmUKLQkJOzsKLQltb25pdG9yKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JbW9ycGhvcykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJb3M9LW1vcnBob3MKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1tc2RvcwotCQk7OwotCW12cykKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlub25zdG9wdXgpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKLQkJb3M9LW5vbnN0b3B1eAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQluc3ItdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jb3IzMiB8IG9yMzItKikKLQkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQlPU0U2ODAwMCB8IG9zZTY4MDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0Jb3M2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCi0JCW9zPS1vczY4awotCQk7OwotCXBhLWhpdGFjaGkpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JcGFyYWdvbikKLQkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCi0JCW9zPS1vc2YKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0gICAgICAgIHBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBuKQotCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCi0JCTs7Ci0JcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCi0JCTs7Ci0JcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXB3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCi0JCW9zPS1wdzMyCi0JCTs7Ci0Jcm9tNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jcm1bNDZdMDApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCi0JCTs7Ci0JcnRwYyB8IHJ0cGMtKikKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXMzOTAgfCBzMzkwLSopCi0JCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KLQkJOzsKLQlzMzkweCB8IHMzOTB4LSopCi0JCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCi0JCTs7Ci0Jc2EyOTIwMCkKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0Jc2VxdWVudCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJOzsKLQlzaCkKLQkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQlzcHM3KQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjIKLQkJOzsKLQlzcHVyKQotCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgotCQk7OwotCXN0MjAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQotCQk7OwotCXN0cmF0dXMpCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCi0JCW9zPS1zeXN2NAotCQk7OwotCXN1bjIpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQk7OwotCXN1bjJvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuMm9zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW4zb3MzKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4zb3M0KQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40b3MzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuNG9zNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRzb2wyKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlzdW4zIHwgc3VuMy0qKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCTs7Ci0Jc3VuNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgotCQk7OwotICAgICAgICBzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2QpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGEtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDNlKQotCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXQ5MCkKLQkJYmFzaWNfbWFjaGluZT10OTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdGljNTR4IHwgYzU0eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0eDM5KQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KLQkJOzsKLQl0eDM5ZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCi0JCTs7Ci0JdG9hZDEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCi0JCW9zPS10b3BzMjAKLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2ODEwIHwgbmVjdjgxMCkKLQkJYmFzaWNfbWFjaGluZT12ODEwLW5lYwotCQlvcz0tbm9uZQotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0gICAgICAgICAgICAgICBiYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotICAgICAgICAgICAgICAgOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXdpbmRvd3MzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS13aW5kb3dzMzItbXN2Y3J0Ci0JCTs7Ci0gICAgICAgIHhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMCkKLQkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAotCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzaDMgfCBzaDQgfCBzaDNlYiB8IHNoNGViKQotCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KLQkJOzsKLQlzaDY0KQotCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgotCQk7OwotCXNwYXJjIHwgc3BhcmN2OSB8IHNwYXJjdjliKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotICAgICAgICBjeWRyYSkKLQkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCi0JCTs7Ci0Jb3Jpb24pCi0JCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCi0JCTs7Ci0Jb3Jpb24xMDUpCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKLQkJOzsKLQltYWMgfCBtcHcgfCBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJOzsKLQlwbWFjIHwgcG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQotCQk7OwotCWM0eCopCi0JCWJhc2ljX21hY2hpbmU9YzR4LW5vbmUKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLXVua25vd24pCi0JCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCi0JCTs7Ci0JLXNvbGFyaXMpCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCS1zdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlKikKLQkJb3M9LXN5c3Y0LjJ1dwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogXAotCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCi0JICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAotCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAotCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKLQkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKLQkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiBcCi0JICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAotCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAotCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAotCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKLQkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqKQotCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkJOzsKLQktcW54KikKLQkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCQkgICAgeDg2LSogfCBpKjg2LSopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1udG8kb3MKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQktbnRvKikKLQkJb3M9LW50by1xbngKLQkJOzsKLQktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCi0JICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCi0JICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKLQkJOzsKLQktbWFjKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAotCQk7OwotCS1saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQktc3Vub3M1KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAotCQk7OwotCS1zdW5vczYqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCi0JCTs7Ci0JLW9wZW5lZCopCi0JCW9zPS1vcGVuZWRpdGlvbgotCQk7OwotCS13aW5jZSopCi0JCW9zPS13aW5jZQotCQk7OwotCS1vc2Zyb3NlKikKLQkJb3M9LW9zZnJvc2UKLQkJOzsKLQktb3NmKikKLQkJb3M9LW9zZgotCQk7OwotCS11dGVrKikKLQkJb3M9LWJzZAotCQk7OwotCS1keW5peCopCi0JCW9zPS1ic2QKLQkJOzsKLQktYWNpcyopCi0JCW9zPS1hb3MKLQkJOzsKLQktYXRoZW9zKikKLQkJb3M9LWF0aGVvcwotCQk7OwotCS0zODZic2QpCi0JCW9zPS1ic2QKLQkJOzsKLQktY3RpeCogfCAtdXRzKikKLQkJb3M9LXN5c3YKLQkJOzsKLQktbm92YSopCi0JCW9zPS1ydG1rLW5vdmEKLQkJOzsKLQktbnMyICkKLQkgICAgICAgIG9zPS1uZXh0c3RlcDIKLQkJOzsKLQktbnNrKikKLQkJb3M9LW5zawotCQk7OwotCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KLQktc2luaXg1LiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCi0JCTs7Ci0JLXNpbml4KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXRyaXRvbiopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1vc3MqKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXN2cjMpCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zeXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KLQktc3lzdiopCi0JCTs7Ci0JLW9zZSopCi0JCW9zPS1vc2UKLQkJOzsKLQktZXMxODAwKikKLQkJb3M9LW9zZQotCQk7OwotCS14ZW5peCkKLQkJb3M9LXhlbml4Ci0JCTs7Ci0gICAgICAgIC0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JICAgICAgICBvcz0tbWludAotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotcmViZWwpCi0JCW9zPS1saW51eAotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCi0JcGRwMTAtKikKLQkJb3M9LXRvcHMyMAotCQk7OwotICAgICAgICBwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCi0JCSMgZGVmYXVsdC4KLQkJIyBvcz0tc3Vub3M0Ci0JCTs7Ci0JbTY4Ki1jaXNjbykKLQkJb3M9LWFvdXQKLQkJOzsKLQltaXBzKi1jaXNjbykKLQkJb3M9LWVsZgotCQk7OwotCW1pcHMqLSopCi0JCW9zPS1lbGYKLQkJOzsKLQlvcjMyLSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLQkqLXdlYykKLQkJb3M9LXByb2VsZgotCQk7OwotCSotd2luYm9uZCkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotb2tpKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1ocCkKLQkJb3M9LWhwdXgKLQkJOzsKLQkqLWhpdGFjaGkpCi0JCW9zPS1oaXV4Ci0JCTs7Ci0JaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQotCQlvcz0tc3lzdgotCQk7OwotCSotY2JtKQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCSotZGcpCi0JCW9zPS1kZ3V4Ci0JCTs7Ci0JKi1kb2xwaGluKQotCQlvcz0tc3lzdjMKLQkJOzsKLQltNjhrLWNjdXIpCi0JCW9zPS1ydHUKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJb3M9LWx1bmEKLQkJOzsKLQkqLW5leHQgKQotCQlvcz0tbmV4dHN0ZXAKLQkJOzsKLQkqLXNlcXVlbnQpCi0JCW9zPS1wdHgKLQkJOzsKLQkqLWNyZHMpCi0JCW9zPS11bm9zCi0JCTs7Ci0JKi1ucykKLQkJb3M9LWdlbml4Ci0JCTs7Ci0JaTM3MC0qKQotCQlvcz0tbXZzCi0JCTs7Ci0JKi1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0gICAgICAgICotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0gICAgICAgICotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLSAgICAgICAgKi1zZ2kpCi0JCW9zPS1pcml4Ci0JCTs7Ci0gICAgICAgICotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqIHwgLW9wZW5lZCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktcHR4KikKLQkJCQl2ZW5kb3I9c2VxdWVudAotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQkJLXZvcyopCi0JCQkJdmVuZG9yPXN0cmF0dXMKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQgMAotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKLSMgdGltZS1zdGFtcC1lbmQ6ICInIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWd1cmUgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkODkyNGIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNjA3MCArMCwwIEBACi0jISAvYmluL3NoCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MSBmb3Igb3JnLmVjbGlwc2UucHRwLmlibXBlIDIuMS4xLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCi0jIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLQotCi0jIFBBVEggbmVlZHMgQ1IKLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKLSAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotICBjaG1vZCAreCBjb25mJCQuc2gKLSAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgZWxzZQotICAgIFBBVEhfU0VQQVJBVE9SPToKLSAgZmkKLSAgcm0gLWYgY29uZiQkLnNoCi1maQotCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1hc19ubD0nCi0nCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1jYXNlICQwIGluCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi1mb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICi1kbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KLQotaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgotICBpZiAoZXZhbCAiOiIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi1lbHNlCi0gIGFzX2hhdmVfcmVxdWlyZWQ9bm8KLWZpCi0KLSAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IHllcyAmJiAJIChldmFsICI6Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9XCRMSU5FTk8KLSAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzJcIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0iKSAyPiAvZGV2L251bGw7IHRoZW4KLSAgOgotZWxzZQotICBhc19jYW5kaWRhdGVfc2hlbGxzPQotICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgY2FzZSAkYXNfZGlyIGluCi0JIC8qKQotCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KLQkgICAgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9IiRhc19jYW5kaWRhdGVfc2hlbGxzICRhc19kaXIvJGFzX2Jhc2UiCi0JICAgZG9uZTs7Ci0gICAgICAgZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLSAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCi0JICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0JCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLV9BU0VPRgotfTsgdGhlbgotICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsCi0JICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0JICAgICAgIGlmIHsgIiRhc19zaGVsbCIgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi06Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCAkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9ICIkMSIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotCi0oCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLV9BU0VPRgotfTsgdGhlbgotICBicmVhawotZmkKLQotZmkKLQotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgotICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgotICAgICAgICBkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICAgICAgICBkb25lCi0gICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQotZmkKLQotCi0gICAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IG5vOyB0aGVuCi0gIGVjaG8gVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCB0aGUKLSAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKLSAgICAgIGVjaG8gbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4gdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEKLSAgICAgIGVjaG8gc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLgotICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0KLWZpCi0KLWZpCi0KLQotCi0oZXZhbCAiYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCIpIHx8IHsKLSAgZWNobyBObyBzaGVsbCBmb3VuZCB0aGF0IHN1cHBvcnRzIHNoZWxsIGZ1bmN0aW9ucy4KLSAgZWNobyBQbGVhc2UgdGVsbCBhdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAotICBlY2hvIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0gIGVjaG8gbWVzc2FnZQotfQotCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgewotCi0gICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KLSAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQotICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKLSAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcwotICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0gICMgY2FzZSBhdCBsaW5lIGVuZC4KLSAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCi0gICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQotICBzZWQgLW4gJwotICAgIHAKLSAgICAvWyRdTElORU5PLz0KLSAgJyA8JGFzX215c2VsZiB8Ci0gICAgc2VkICcKLSAgICAgIHMvWyRdTElORU5PLiovJi0vCi0gICAgICB0IGxpbmVubwotICAgICAgYgotICAgICAgOmxpbmVubwotICAgICAgTgotICAgICAgOmxvb3AKLSAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwotICAgICAgdCBsb29wCi0gICAgICBzLy1cbi4qLy8KLSAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3hcYydgIGluCi0gICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICAqKSAgIEVDSE9fQz0nXGMnOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLWlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgotICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCi1lbHNlCi0gIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpcgotZmkKLWVjaG8gPmNvbmYkJC5maWxlCi1pZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz0nbG4gLXMnCi0gICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgYXNfbG5fcz0nY3AgLXAnCi1lbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPWxuCi1lbHNlCi0gIGFzX2xuX3M9J2NwIC1wJwotZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLXJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLQotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPToKLWVsc2UKLSAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSAgYXNfbWtkaXJfcD1mYWxzZQotZmkKLQotaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc190ZXN0X3g9J3Rlc3QgLXgnCi1lbHNlCi0gIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGFzX2xzX0xfb3B0aW9uPUwKLSAgZWxzZQotICAgIGFzX2xzX0xfb3B0aW9uPQotICBmaQotICBhc190ZXN0X3g9JwotICAgIGV2YWwgc2ggLWMgJ1wnJwotICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCi0gICAgICAgIHRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4KLSAgICAgICAgLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotCi1leGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCi0KLSMgTmFtZSBvZiB0aGUgaG9zdC4KLSMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCi0jIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLWFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotCi0jCi0jIEluaXRpYWxpemF0aW9ucy4KLSMKLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLWFjX2NsZWFuX2ZpbGVzPQotYWNfY29uZmlnX2xpYm9ial9kaXI9LgotTElCT0JKUz0KLWNyb3NzX2NvbXBpbGluZz1ubwotc3ViZGlycz0KLU1GTEFHUz0KLU1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLSMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdvcmcuZWNsaXBzZS5wdHAuaWJtcGUnCi1QQUNLQUdFX1RBUk5BTUU9J29yZy1lY2xpcHNlLXB0cC1pYm1wZScKLVBBQ0tBR0VfVkVSU0lPTj0nMi4xLjEnCi1QQUNLQUdFX1NUUklORz0nb3JnLmVjbGlwc2UucHRwLmlibXBlIDIuMS4xJwotUEFDS0FHRV9CVUdSRVBPUlQ9JycKLQotYWNfdW5pcXVlX2ZpbGU9InNyYy9wdHBfaWJtcGVfcHJveHkuYyIKLSMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KLWFjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NURExJQl9ICi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAotIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0jIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURElOVF9ICi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiIKLQotYWNfc3Vic3RfdmFycz0nU0hFTEwKLVBBVEhfU0VQQVJBVE9SCi1QQUNLQUdFX05BTUUKLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9WRVJTSU9OCi1QQUNLQUdFX1NUUklORwotUEFDS0FHRV9CVUdSRVBPUlQKLWV4ZWNfcHJlZml4Ci1wcmVmaXgKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUKLWJpbmRpcgotc2JpbmRpcgotbGliZXhlY2RpcgotZGF0YXJvb3RkaXIKLWRhdGFkaXIKLXN5c2NvbmZkaXIKLXNoYXJlZHN0YXRlZGlyCi1sb2NhbHN0YXRlZGlyCi1pbmNsdWRlZGlyCi1vbGRpbmNsdWRlZGlyCi1kb2NkaXIKLWluZm9kaXIKLWh0bWxkaXIKLWR2aWRpcgotcGRmZGlyCi1wc2RpcgotbGliZGlyCi1sb2NhbGVkaXIKLW1hbmRpcgotREVGUwotRUNIT19DCi1FQ0hPX04KLUVDSE9fVAotTElCUwotYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotSU5TVEFMTF9QUk9HUkFNCi1JTlNUQUxMX1NDUklQVAotSU5TVEFMTF9EQVRBCi1DWUdQQVRIX1cKLVBBQ0tBR0UKLVZFUlNJT04KLUFDTE9DQUwKLUFVVE9DT05GCi1BVVRPTUFLRQotQVVUT0hFQURFUgotTUFLRUlORk8KLWluc3RhbGxfc2gKLVNUUklQCi1JTlNUQUxMX1NUUklQX1BST0dSQU0KLW1rZGlyX3AKLUFXSwotU0VUX01BS0UKLWFtX19sZWFkaW5nX2RvdAotQU1UQVIKLWFtX190YXIKLWFtX191bnRhcgotYnVpbGQKLWJ1aWxkX2NwdQotYnVpbGRfdmVuZG9yCi1idWlsZF9vcwotQ0MKLUNGTEFHUwotTERGTEFHUwotQ1BQRkxBR1MKLWFjX2N0X0NDCi1FWEVFWFQKLU9CSkVYVAotREVQRElSCi1hbV9faW5jbHVkZQotYW1fX3F1b3RlCi1BTURFUF9UUlVFCi1BTURFUF9GQUxTRQotQU1ERVBCQUNLU0xBU0gKLUNDREVQTU9ERQotYW1fX2Zhc3RkZXBDQ19UUlVFCi1hbV9fZmFzdGRlcENDX0ZBTFNFCi1SQU5MSUIKLUNQUAotR1JFUAotRUdSRVAKLVBPRQotTElCT0JKUwotTFRMSUJPQkpTJwotYWNfc3Vic3RfZmlsZXM9JycKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTCi1DUFAnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKLSAgKikJYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPW5vIDs7Ci0KLSAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKLSAgICBhY19wcmV2PWRvY2RpciA7OwotICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKLSAgICBkb2NkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCi0gICAgYWNfcHJldj1kdmlkaXIgOzsKLSAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKLSAgICBkdmlkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIDs7Ci0KLSAgKj0qKQotICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19lbnZ2YXIiIDogIi4qW15fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgotICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCi0gICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLSMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLWZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAotCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKLQkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAotCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgotZG8KLSAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gIGNhc2UgJGFjX3ZhbCBpbgotICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7Ci0gICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OwotICBlc2FjCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWRvbmUKLQotIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwotIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1idWlsZD0kYnVpbGRfYWxpYXMKLWhvc3Q9JGhvc3RfYWxpYXMKLXRhcmdldD0kdGFyZ2V0X2FsaWFzCi0KLSMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLWlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgotICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCi0gICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKLSAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKLSAgZmkKLWZpCi0KLWFjX3Rvb2xfcHJlZml4PQotdGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQotCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCi0KLQotYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCi1hY19sc19kaT1gbHMgLWRpIC5gICYmCi1hY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBXb3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiQwIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgotYWNfYWJzX2NvbmZkaXI9YCgKLQljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IHsgZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQlwd2QpYAotIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KLWlmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KLSAgc3JjZGlyPS4KLWZpCi0jIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgotIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCi0jIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KLWNhc2UgJHNyY2RpciBpbgotKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Ci1lc2FjCi1mb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0gIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0gIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotZG9uZQotCi0jCi0jIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCi0jCi1pZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgotICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICBjYXQgPDxfQUNFT0YKLVxgY29uZmlndXJlJyBjb25maWd1cmVzIG9yZy5lY2xpcHNlLnB0cC5pYm1wZSAyLjEuMSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCi0KLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgotCi1UbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCi1WQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgotCi1EZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KLQotQ29uZmlndXJhdGlvbjoKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQotICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKLSAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCi0gIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCi0gIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotCQkJICBbUFJFRklYXQotCi1CeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLVxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5Ci1hbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAotZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLQotRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCi0KLUZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0tZGF0YXJvb3RkaXI9RElSICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQotICAtLWxvY2FsZWRpcj1ESVIgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCi0gIC0tZG9jZGlyPURJUiAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2Mvb3JnLWVjbGlwc2UtcHRwLWlibXBlXQotICAtLWh0bWxkaXI9RElSICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcGRmZGlyPURJUiAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1wc2Rpcj1ESVIgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi1fQUNFT0YKLQotICBjYXQgPDxcX0FDRU9GCi0KLVByb2dyYW0gbmFtZXM6Ci0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0KLVN5c3RlbSB0eXBlczoKLSAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KLV9BQ0VPRgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KLSAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCi0gICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBvcmcuZWNsaXBzZS5wdHAuaWJtcGUgMi4xLjE6Ijs7Ci0gICBlc2FjCi0gIGNhdCA8PFxfQUNFT0YKLQotT3B0aW9uYWwgRmVhdHVyZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCi0gIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzCi0KLU9wdGlvbmFsIFBhY2thZ2VzOgotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXdpdGgtbGwtaGVhZGVyPURJUiAgICBsb2NhbCBMb2FkTGV2ZWxlciBoZWFkZXIgZGlyZWN0b3J5IFtub25lXQotCi1Tb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCi0gIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKLSAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCi0gICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KLSAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0gICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgotICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgotCi1Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAotaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgotCi1fQUNFT0YKLWFjX3N0YXR1cz0kPwotZmkKLQotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgotICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQotICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8IGNvbnRpbnVlCi0gICAgYWNfYnVpbGRkaXI9LgotCi1jYXNlICIkYWNfZGlyIiBpbgotLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0qKQotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCi0gICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKLSAgICBmaSB8fCBhY19zdGF0dXM9JD8KLSAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Ci0gIGRvbmUKLWZpCi0KLXRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwotaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgotICBjYXQgPDxcX0FDRU9GCi1vcmcuZWNsaXBzZS5wdHAuaWJtcGUgY29uZmlndXJlIDIuMS4xCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi1fQUNFT0YKLSAgZXhpdAotZmkKLWNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0KLUl0IHdhcyBjcmVhdGVkIGJ5IG9yZy5lY2xpcHNlLnB0cC5pYm1wZSAkYXNfbWUgMi4xLjEsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgJCAkMCAkQAotCi1fQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotY2F0IDw8X0FTVU5BTUUKLSMjIC0tLS0tLS0tLSAjIwotIyMgUGxhdGZvcm0uICMjCi0jIyAtLS0tLS0tLS0gIyMKLQotaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0KLV9BU1VOQU1FCi0KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19wYXNzIGluCi0gICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKLSAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgotCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KLSAgICAgIGVsc2UKLQljYXNlICRhY19hcmcgaW4KLQkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAotCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAotCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCi0JICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQotCi0jIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0jIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KLXRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotICB7Ci0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE91dHB1dCB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICAgIGRvbmUgfCBzb3J0Ci0gICAgICBlY2hvCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBjYXQgY29uZmRlZnMuaAotICAgICAgZWNobwotICAgIGZpCi0gICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLQotIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBzZXQgeCAiJENPTkZJR19TSVRFIgotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZmkKLXNoaWZ0Ci1mb3IgYWNfc2l0ZV9maWxlCi1kbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKLSAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gID4kY2FjaGVfZmlsZQotZmkKLQotIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQotIyB2YWx1ZS4KLWFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQotICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KLSAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICwpOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0JYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCi0gICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KLSAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLQotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKLQotCi1hbV9fYXBpX3ZlcnNpb249IjEuOSIKLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbwotICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKLSMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KLSMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgotYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi1jYXNlICRhc19kaXIvIGluCi0gIC4vIHwgLi8vIHwgL2NDLyogfCBcCi0gIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAotICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSAgL3Vzci91Y2IvKiApIDs7Ci0gICopCi0gICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAjIGJ5IGRlZmF1bHQuCi0gICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjY7IH0KLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKLSAgIGZpCi0gICBybSAtZiBjb25mdGVzdC5maWxlCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZeJiRwcm9ncmFtX3ByZWZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJlwkJiRwcm9ncmFtX3N1ZmZpeCY7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0jIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgotY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCi1zL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCi1fQUNFT0YKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAotcm0gLWYgY29uZnRlc3Quc2VkCi0KLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLQotdGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCi0jIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKLWlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCi0gIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCi1lbHNlCi0gIGFtX21pc3NpbmdfcnVuPQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9Ci1maQotCi1pZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCi0gICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCi0gICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgotICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCi0gICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKLSAgIyBmb3IgdHdvIHJlYXNvbnM6Ci0gICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKLSAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKLSAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKLSAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQotICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCi0gICMgICAgICQoREVTVERJUikgaXMgbm90LgotICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQotICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAotICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KLSAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCi1lbHNlCi0gICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90Ci0gICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcwotICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQotICAjIGV4aXN0cy4KLSAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKLSAgZG8KLSAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCi0gIGRvbmUKLSAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCi0gIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCi0gICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKLSAgZWxzZQotICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCi0gIGZpCi1maQotCi1mb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1BV0s9JGFjX2N2X3Byb2dfQVdLCi1pZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQotZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCi1kb25lCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotc2V0IHggJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0OyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKLVNIRUxMID0gL2Jpbi9zaAotYWxsOgotCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCi1fQUNFT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UKLWZpCi1pZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgU0VUX01BS0U9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1ybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAotbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAudHN0OyB0aGVuCi0gIGFtX19sZWFkaW5nX2RvdD0uCi1lbHNlCi0gIGFtX19sZWFkaW5nX2RvdD1fCi1maQotcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAotCi0jIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKLSAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi0jIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKLWlmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCi0gIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKLSAgZWxzZQotICAgIENZR1BBVEhfVz1lY2hvCi0gIGZpCi1maQotCi0KLSMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KLSBQQUNLQUdFPSdvcmctZWNsaXBzZS1wdHAtaWJtcGUnCi0gVkVSU0lPTj0nMi4xLjEnCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1fQUNFT0YKLQotIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgotCi1BQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9Ci0KLQotQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9Ci0KLQotQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQotCi0KLUFVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQotCi0KLU1BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQotCi1pbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci0KLSMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgotIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAotIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQotIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1TVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAotaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgotICBhY19jdF9TVFJJUD0kU1RSSVAKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAotaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCi0gICAgU1RSSVA9IjoiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBTVFJJUD0kYWNfY3RfU1RSSVAKLSAgZmkKLWVsc2UKLSAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgotZmkKLQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCR7U0hFTEx9IFwkKGluc3RhbGxfc2gpIC1jIC1zIgotCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLSMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotQU1UQVI9JHtBTVRBUi0iJHthbV9taXNzaW5nX3J1bn10YXIifQotCi1hbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLScKLQotCi0KLQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRhY19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQotCi1VVElMUz0iLi4vb3JnLmVjbGlwc2UucHRwLnV0aWxzIgotaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCVVUSUxTPSJgZWNobyAke1VUSUxTfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1dGlscyBkaXJlY3Rvcnkgbm90IGZvdW5kIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHV0aWxzIGRpcmVjdG9yeSBub3QgZm91bmQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQlmaQotZmkKLVBST1hZPSIuLi9vcmcuZWNsaXBzZS5wdHAucHJveHkiCi1pZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JUFJPWFk9ImBlY2hvICR7UFJPWFl9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHByb3h5IGRpcmVjdG9yeSBub3QgZm91bmQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcHJveHkgZGlyZWN0b3J5IG5vdCBmb3VuZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGwtaGVhZGVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9sbF9oZWFkZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0kd2l0aF9sbF9oZWFkZXI7IGxsaW5jbHVkZT0tSSR3aXRodmFsCi1lbHNlCi0gIGxsaW5jbHVkZT0iIgotZmkKLQotbGxkaXI9IiRsbGluY2x1ZGUgLUkvb3B0L2libWxsL0xvYWRML2Z1bGwvaW5jbHVkZSAtSS91c3IvbHBwL0xvYWRML2Z1bGwvaW5jbHVkZSIKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0gIGRvCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZmkKLQotZmkKLQotCi10ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLWFjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC12ID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAtdiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLVYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQotCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0jIG9mIGV4ZWV4dC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLSMKLSMgTGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgZmlsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LgotIyBUaGUgYWxnb3JpdGhtIGlzIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKQotIyBvbmx5IGFzIGEgbGFzdCByZXNvcnQuICBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgotYWNfZmlsZXM9J2Ffb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQnCi0jCi0jIFRoZSBJUklYIDYgbGlua2VyIHdyaXRlcyBpbnRvIGV4aXN0aW5nIGZpbGVzIHdoaWNoIG1heSBub3QgYmUKLSMgZXhlY3V0YWJsZSwgcmV0YWluaW5nIHRoZWlyIHBlcm1pc3Npb25zLiAgUmVtb3ZlIHRoZW0gZmlyc3Qgc28gYQotIyBzdWJzZXF1ZW50IGV4ZWN1dGlvbiB0ZXN0IHdvcmtzLgotYWNfcm1maWxlcz0KLWZvciBhY19maWxlIGluICRhY19maWxlcwotZG8KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSAgZXNhYwotZG9uZQotcm0gLWYgJGFjX3JtZmlsZXMKLQotaWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwotIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKLSMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0jIEF1dG9jb25mLgotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCi1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKLQl0aGVuIDo7IGVsc2UKLQkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQlmaQotCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAotCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgotCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgotCSMgYWN0dWFsbHkgd29ya2luZy4KLQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi10ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLQotZWxzZQotICBhY19maWxlPScnCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbgotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotZmkKLQotYWNfZXhlZXh0PSRhY19jdl9leGVleHQKLQotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQotIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAotIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVzCi0gICAgZWxzZQotCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGZpCi0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQotcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjY7IH0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OwotICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSAgYnJlYWs7OwotICAgICogKSBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mICkgOzsKLSAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKLSAgICAgICBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNjsgfQotT0JKRVhUPSRhY19jdl9vYmpleHQKLWFjX29iamV4dD0kT0JKRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jb21waWxlcl9nbnU9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLUdDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlDRkxBR1M9IiIKLSAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9wcm9nX2NjX2M4OT1ubwotYWNfc2F2ZV9DQz0kQ0MKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KLXN0cnVjdCBidWYgeyBpbnQgeDsgfTsKLUZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqZSAocCwgaSkKLSAgICAgY2hhciAqKnA7Ci0gICAgIGludCBpOwotewotICByZXR1cm4gcFtpXTsKLX0KLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgdmFfbGlzdCB2OwotICB2YV9zdGFydCAodixwKTsKLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKLSAgdmFfZW5kICh2KTsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCi0gICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCi0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKLSAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKLSAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZwotICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLwotaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKLQotLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCi0gICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCi0jZGVmaW5lIEZPTyh4KSAneCcKLWludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOwotCi1pbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKLXN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Owotc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307Ci1pbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKLWludCBhcmdjOwotY2hhciAqKmFyZ3Y7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAotCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCi1kbwotICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAotICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawotZG9uZQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotQ0M9JGFjX3NhdmVfQ0MKLQotZmkKLSMgQUNfQ0FDSEVfVkFMCi1jYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgotICB4KQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNjsgfSA7OwotICB4bm8pCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH11bnN1cHBvcnRlZCIgPiY2OyB9IDs7Ci0gICopCi0gICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKLWVzYWMKLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1ERVBESVI9IiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiCi0KLWFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKLQotCi1hbV9tYWtlPSR7TUFLRS1tYWtlfQotY2F0ID4gY29uZmluYyA8PCAnRU5EJwotYW1fX2RvaXQ6Ci0JQGVjaG8gZG9uZQotLlBIT05ZOiBhbV9fZG9pdAotRU5ECi0jIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAkRUNIT19DIiA+JjY7IH0KLWFtX19pbmNsdWRlPSIjIgotYW1fX3F1b3RlPQotX2FtX3Jlc3VsdD1ub25lCi0jIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgotZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgotIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JwotIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgotIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAotIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKLSMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgotaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCi0gICBhbV9faW5jbHVkZT1pbmNsdWRlCi0gICBhbV9fcXVvdGU9Ci0gICBfYW1fcmVzdWx0PUdOVQotZmkKLSMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgotaWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgotICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgotICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgotICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgIGFtX19xdW90ZT0iXCIiCi0gICAgICBfYW1fcmVzdWx0PUJTRAotICAgZmkKLWZpCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kX2FtX3Jlc3VsdCIgPiY2OyB9Ci1ybSAtZiBjb25maW5jIGNvbmZtZgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7Ci1maQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotCi0KLWlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgotICBBTURFUF9UUlVFPQotICBBTURFUF9GQUxTRT0nIycKLWVsc2UKLSAgQU1ERVBfVFJVRT0nIycKLSAgQU1ERVBfRkFMU0U9Ci1maQotCi0KLQotCi1kZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKLSAgZmkKLSAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCi0gICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCi0gICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAotICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KLSAgICAjCi0gICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKLSAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgotICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgotICAgIDogPiBzdWIvY29uZnRlc3QuYwotICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbwotICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwotICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKLSAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCi0gICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKLSAgICBkb25lCi0gICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgotCi0gICAgY2FzZSAkZGVwbW9kZSBpbgotICAgIG5vc2lkZWVmZmVjdCkKLSAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAotICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGVsc2UKLQlicmVhawotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgbm9uZSkgYnJlYWsgOzsKLSAgICBlc2FjCi0gICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCi0gICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKLSAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KLSAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKLSAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCi0gICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKLSAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAotICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KLUNDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQotCi0KLQotaWYKLSAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKLSAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KLSAgYW1fX2Zhc3RkZXBDQ19UUlVFPQotICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJwotZWxzZQotICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCi0gIGFtX19mYXN0ZGVwQ0NfRkFMU0U9Ci1maQotCi0KLWlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1maQotc2V0IGR1bW15ICRDQzsgYWNfY2M9YGVjaG8gJDIgfAotCQkgICAgICBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAotaWYgeyBhc192YXI9YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX287IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLSMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgotIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KLSMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCi1hY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKLXJtIC1mIGNvbmZ0ZXN0Mi4qCi1pZiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsKLXRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz15ZXMKLSAgaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCi0gICAgIyBUZXN0IGZpcnN0IHRoYXQgY2MgZXhpc3RzIGF0IGFsbC4KLSAgICBpZiB7IGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JwotICAgICAgcm0gLWYgY29uZnRlc3QyLioKLSAgICAgIGlmIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07Ci0gICAgICB0aGVuCi0JIyBjYyB3b3JrcyB0b28uCi0JOgotICAgICAgZWxzZQotCSMgY2MgZXhpc3RzIGJ1dCBkb2Vzbid0IGxpa2UgLW8uCi0JZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubwotICAgICAgZmkKLSAgICBmaQotICBmaQotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vID0geWVzOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBOT19NSU5VU19DX01JTlVTX08gMQotX0FDRU9GCi0KLWZpCi0KLSMgRklYTUU6IHdlIHJlbHkgb24gdGhlIGNhY2hlIHZhcmlhYmxlIG5hbWUgYmVjYXVzZQotIyB0aGVyZSBpcyBubyBvdGhlciB3YXkuCi1zZXQgZHVtbXkgJENDCi1hY19jYz1gZWNobyAkMiB8IHNlZCAncy9bXmEtekEtWjAtOV9dL18vZztzL15bMC05XS9fLydgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX2NjXycke2FjX2NjfV9jX29gXCIgIT0geWVzIjsgdGhlbgotICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KLSAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCi0gICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KLSAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKLSAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCi0gICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLWNhc2UgJGFzX2Rpci8gaW4KLSAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKLSAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCi0gID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAotICAvdXNyL3VjYi8qICkgOzsKLSAgKikKLSAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICMgYnkgZGVmYXVsdC4KLSAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKLQkgICAgYnJlYWsgMwotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1zZXQgeCAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiB7IGFzX3Zhcj1hY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgotU0hFTEwgPSAvYmluL3NoCi1hbGw6Ci0JQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLV9BQ0VPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1jYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KLSAgKkBAQCUlJT0/Kj1AQEAlJSUqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7Ci0gICopCi0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OwotZXNhYwotcm0gLWYgY29uZnRlc3QubWFrZQotZmkKLWlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotICBTRVRfTUFLRT0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi0gIGFjX2N0X1JBTkxJQj0kUkFOTElCCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCi1pZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1JBTkxJQiIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCi0gICAgUkFOTElCPSI6IgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgUkFOTElCPSRhY19jdF9SQU5MSUIKLSAgZmkKLWVsc2UKLSAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1maQotCi0KLW9zPWB1bmFtZSAtc2AKLWlmIHRlc3QgIngkb3MiID0gInhBSVgiIDsgdGhlbgotCUNGTEFHUz0iJENGTEFHUyAtcWluZm89Z2VuIC1xY3BsdXNjbXQiCi1lbHNlCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgotZmkKLQotQ0ZMQUdTPSIkQ0ZMQUdTIC1JJFVUSUxTL2luY2x1ZGUgLUkkUFJPWFkvaW5jbHVkZSAkbGxkaXIiCi1MSUJTPSIkTElCUyAtTCRVVElMUyAtTCRQUk9YWSIKLQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBiaXRzZXRfbmV3IGluIC1sdXRpbHMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYml0c2V0X25ldyBpbiAtbHV0aWxzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfdXRpbHNfYml0c2V0X25ldytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHV0aWxzICAkTElCUyIKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGJpdHNldF9uZXcgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBiaXRzZXRfbmV3ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXc9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfdXRpbHNfYml0c2V0X25ldz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxzX2JpdHNldF9uZXciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl91dGlsc19iaXRzZXRfbmV3ID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJVVElMUyAxCi1fQUNFT0YKLQotICBMSUJTPSItbHV0aWxzICRMSUJTIgotCi1maQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcm94eV9zdnJfaW5pdCBpbiAtbHByb3h5c3ZyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByb3h5X3N2cl9pbml0IGluIC1scHJveHlzdnIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHByb3h5c3ZyICAkTElCUyIKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHByb3h5X3N2cl9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcHJveHlfc3ZyX2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQ9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfcHJveHlzdnJfcHJveHlfc3ZyX2luaXQ9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3Byb3h5c3ZyX3Byb3h5X3N2cl9pbml0IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl9wcm94eXN2cl9wcm94eV9zdnJfaW5pdCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCUFJPWFlTVlIgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxwcm94eXN2ciAkTElCUyIKLQotZmkKLQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2OyB9Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KLSAgYnJlYWsKLWZpCi0KLSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotCi1maQotICBDUFA9JGFjX2N2X3Byb2dfQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDUFAiID4mNQotZWNobyAiJHtFQ0hPX1R9JENQUCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCi1jb250aW51ZQotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuCi0gIDoKLWVsc2UKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJncmVwIGdncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi1zZXQgZHVtbXkgZ3JlcCBnZ3JlcDsgYWNfcHJvZ19uYW1lPSQyCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQotICAgICMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKLWNhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgIGVjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgotICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotCi0gICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gIGRvbmUKLWRvbmUKLQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi1pZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQotIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImVncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotc2V0IGR1bW15IGVncmVwOyBhY19wcm9nX25hbWU9JDIKLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCi0jIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCi0gICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi1jYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYWNfY291bnQ9YGV4cHIgJGFjX2NvdW50ICsgMWAKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0KLSAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gIGRvbmUKLWRvbmUKLQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLWlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1lbHNlCi0gIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCi1maQotCi0KLSAgIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9Ci0gRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci1lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0oIGV4aXQgJGFjX3N0YXR1cyApCi1hY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotX0FDRU9GCi0KLWZpCi0KLSMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi0KLQotCi0KLQotCi0KLQotCi1mb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKLQkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLQotZm9yIGFjX2hlYWRlciBpbiBsbGFwaS5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWVsc2UKLSAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotICB5ZXM6bm86ICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotIENGTEFHUz0iJENGTEFHUyAtREhBVkVfTExBUElfSCIKLWZpCi0KLWRvbmUKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2lnbmFsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAqKHNpZ25hbCAoMCwgMCkpICgwKSA9PSAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaWduYWwiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2lnbmFsIiA+JjY7IH0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAotX0FDRU9GCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwb2UiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHBvZTsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1BPRStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXNlICRQT0UgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfUE9FPSIkUE9FIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfUE9FPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUE9FIiAmJiBhY19jdl9wYXRoX1BPRT0ibm8iCi0gIDs7Ci1lc2FjCi1maQotUE9FPSRhY19jdl9wYXRoX1BPRQotaWYgdGVzdCAtbiAiJFBPRSI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUE9FIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRQT0UiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotaWYgdGVzdCAiJGFjX2N2X3BhdGhfUE9FIiAhPSBubzsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBPRSAiJGFjX2N2X3BhdGhfUE9FIgotX0FDRU9GCi0KLWVsc2UKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBQRSBub3QgaW5zdGFsbGVkLCBza2lwcGluZy4uLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFBFIG5vdCBpbnN0YWxsZWQsIHNraXBwaW5nLi4uIiA+JjY7fQotCXsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUiCi0KLWNhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCi0jIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0Ci0jIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Ci0jIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLSMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgotIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzLgotCi1fQUNFT0YKLQotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgICAgc2VkIC1uIFwKLQkicy8nLydcXFxcJycvZzsKLQkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7ICMoCi0gICAgKikKLSAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pIHwKLSAgc2VkICcKLSAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0gICAgIHQgY2xlYXIKLSAgICAgOmNsZWFyCi0gICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSAgICAgdCBlbmQKLSAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDplbmQnID4+Y29uZmNhY2hlCi1pZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCi0gIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotYWNfbGlib2Jqcz0KLWFjX2x0bGlib2Jqcz0KLWZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCi0gICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgotICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCi1kb25lCi1MSUJPQkpTPSRhY19saWJvYmpzCi0KLUxUTElCT0JKUz0kYWNfbHRsaWJvYmpzCi0KLQotaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KLVVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCi1Vc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi1pZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Ci1jYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jISAkU0hFTEwKLSMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1kZWJ1Zz1mYWxzZQotYWNfY3NfcmVjaGVjaz1mYWxzZQotYWNfY3Nfc2lsZW50PWZhbHNlCi1TSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi0KLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKLQotICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0gICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCi0gICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0gICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKLSAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAotICAjIGNhc2UgYXQgbGluZSBlbmQuCi0gICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKLSAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSAgc2VkIC1uICcKLSAgICBwCi0gICAgL1skXUxJTkVOTy89Ci0gICcgPCRhc19teXNlbGYgfAotICAgIHNlZCAnCi0gICAgICBzL1skXUxJTkVOTy4qLyYtLwotICAgICAgdCBsaW5lbm8KLSAgICAgIGIKLSAgICAgIDpsaW5lbm8KLSAgICAgIE4KLSAgICAgIDpsb29wCi0gICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSAgICAgIHQgbG9vcAotICAgICAgcy8tXG4uKi8vCi0gICAgJyA+JGFzX21lLmxpbmVubyAmJgotICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0gICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCi0gICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgotICAuICIuLyRhc19tZS5saW5lbm8iCi0gICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotICBleGl0Ci19Ci0KLQotaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2Rpcm5hbWU9ZGlybmFtZQotZWxzZQotICBhc19kaXJuYW1lPWZhbHNlCi1maQotCi1FQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgotLW4qKQotICBjYXNlIGBlY2hvICd4XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKLWZpCi1lY2hvID5jb25mJCQuZmlsZQotaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9J2xuIC1zJwotICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgotICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAotICAgIGFzX2xuX3M9J2NwIC1wJwotZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz1sbgotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD06Ci1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotICAgICAgICB0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluCi0gICAgICAgIC0qKXNldCAiLi8kMSI7OwotCWVzYWM7Ci0JY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4KLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLWV4ZWMgNj4mMQotCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCi0jIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgotYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgb3JnLmVjbGlwc2UucHRwLmlibXBlICRhc19tZSAyLjEuMSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLW9yZy5lY2xpcHNlLnB0cC5pYm1wZSBjb25maWcuc3RhdHVzIDIuMS4xCi1jb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEsCi0gIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCi0KLUNvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotYWNfcHdkPSckYWNfcHdkJwotc3JjZGlyPSckc3JjZGlyJwotSU5TVEFMTD0nJElOU1RBTEwnCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0jIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAotIyB2YWx1ZS4gIEJ5IHdlIG5lZWQgdG8ga25vdyBpZiBmaWxlcyB3ZXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KLWFjX25lZWRfZGVmYXVsdHM9Ogotd2hpbGUgdGVzdCAkIyAhPSAwCi1kbwotICBjYXNlICQxIGluCi0gIC0tKj0qKQotICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCi0gICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAotICAgIGFjX3NoaWZ0PToKLSAgICA7OwotICAqKQotICAgIGFjX29wdGlvbj0kMQotICAgIGFjX29wdGFyZz0kMgotICAgIGFjX3NoaWZ0PXNoaWZ0Ci0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgJGFjX29wdGlvbiBpbgotICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBhY19jc19yZWNoZWNrPTogOzsKLSAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQotICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OwotICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotICAgIGRlYnVnPTogOzsKLSAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKLSAgICAkYWNfc2hpZnQKLSAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgJGFjX29wdGFyZyIKLSAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSAgLS1oZSB8IC0taCkKLSAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIC0taGVscCB8IC0taGVsIHwgLWggKQotICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQotICAgIGFjX2NzX3NpbGVudD06IDs7Ci0KLSAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0KLSAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKLSAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwotCi0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Ci0KLWlmICRhY19jc19zaWxlbnQ7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgotZmkKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0gIGVjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCAkU0hFTEwgJDAgIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgotICBDT05GSUdfU0hFTEw9JFNIRUxMCi0gIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgZXhlYyAkU0hFTEwgIiQwIiRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotZXhlYyA1Pj5jb25maWcubG9nCi17Ci0gIGVjaG8KLSAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKLSMjIFJ1bm5pbmcgJGFzX21lLiAjIwotX0FTQk9YCi0gIGVjaG8gIiRhY19sb2ciCi19ID4mNQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jCi0jIElOSVQtQ09NTUFORFMKLSMKLUFNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotCi0jIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KLWZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotZG8KLSAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgotICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7Ci0gICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLQotICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0KLSMKLSMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCi0jCi0KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotCi1fQUNFT0YKLQotCi0KLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotU0hFTEwhJFNIRUxMJGFjX2RlbGltCi1QQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KLVBBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi1QQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQotUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KLVBBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCi1leGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KLXByZWZpeCEkcHJlZml4JGFjX2RlbGltCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCi1iaW5kaXIhJGJpbmRpciRhY19kZWxpbQotc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQotZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCi1kYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi1zeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCi1zaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KLWxvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLWluY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KLW9sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KLWRvY2RpciEkZG9jZGlyJGFjX2RlbGltCi1pbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCi1odG1sZGlyISRodG1sZGlyJGFjX2RlbGltCi1kdmlkaXIhJGR2aWRpciRhY19kZWxpbQotcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KLXBzZGlyISRwc2RpciRhY19kZWxpbQotbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLWxvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCi1tYW5kaXIhJG1hbmRpciRhY19kZWxpbQotREVGUyEkREVGUyRhY19kZWxpbQotRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KLUVDSE9fTiEkRUNIT19OJGFjX2RlbGltCi1FQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotTElCUyEkTElCUyRhY19kZWxpbQotYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCi1ob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi10YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQotSU5TVEFMTF9QUk9HUkFNISRJTlNUQUxMX1BST0dSQU0kYWNfZGVsaW0KLUlOU1RBTExfU0NSSVBUISRJTlNUQUxMX1NDUklQVCRhY19kZWxpbQotSU5TVEFMTF9EQVRBISRJTlNUQUxMX0RBVEEkYWNfZGVsaW0KLUNZR1BBVEhfVyEkQ1lHUEFUSF9XJGFjX2RlbGltCi1QQUNLQUdFISRQQUNLQUdFJGFjX2RlbGltCi1WRVJTSU9OISRWRVJTSU9OJGFjX2RlbGltCi1BQ0xPQ0FMISRBQ0xPQ0FMJGFjX2RlbGltCi1BVVRPQ09ORiEkQVVUT0NPTkYkYWNfZGVsaW0KLUFVVE9NQUtFISRBVVRPTUFLRSRhY19kZWxpbQotQVVUT0hFQURFUiEkQVVUT0hFQURFUiRhY19kZWxpbQotTUFLRUlORk8hJE1BS0VJTkZPJGFjX2RlbGltCi1pbnN0YWxsX3NoISRpbnN0YWxsX3NoJGFjX2RlbGltCi1TVFJJUCEkU1RSSVAkYWNfZGVsaW0KLUlOU1RBTExfU1RSSVBfUFJPR1JBTSEkSU5TVEFMTF9TVFJJUF9QUk9HUkFNJGFjX2RlbGltCi1ta2Rpcl9wISRta2Rpcl9wJGFjX2RlbGltCi1BV0shJEFXSyRhY19kZWxpbQotU0VUX01BS0UhJFNFVF9NQUtFJGFjX2RlbGltCi1hbV9fbGVhZGluZ19kb3QhJGFtX19sZWFkaW5nX2RvdCRhY19kZWxpbQotQU1UQVIhJEFNVEFSJGFjX2RlbGltCi1hbV9fdGFyISRhbV9fdGFyJGFjX2RlbGltCi1hbV9fdW50YXIhJGFtX191bnRhciRhY19kZWxpbQotYnVpbGQhJGJ1aWxkJGFjX2RlbGltCi1idWlsZF9jcHUhJGJ1aWxkX2NwdSRhY19kZWxpbQotYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KLWJ1aWxkX29zISRidWlsZF9vcyRhY19kZWxpbQotQ0MhJENDJGFjX2RlbGltCi1DRkxBR1MhJENGTEFHUyRhY19kZWxpbQotTERGTEFHUyEkTERGTEFHUyRhY19kZWxpbQotQ1BQRkxBR1MhJENQUEZMQUdTJGFjX2RlbGltCi1hY19jdF9DQyEkYWNfY3RfQ0MkYWNfZGVsaW0KLUVYRUVYVCEkRVhFRVhUJGFjX2RlbGltCi1PQkpFWFQhJE9CSkVYVCRhY19kZWxpbQotREVQRElSISRERVBESVIkYWNfZGVsaW0KLWFtX19pbmNsdWRlISRhbV9faW5jbHVkZSRhY19kZWxpbQotYW1fX3F1b3RlISRhbV9fcXVvdGUkYWNfZGVsaW0KLUFNREVQX1RSVUUhJEFNREVQX1RSVUUkYWNfZGVsaW0KLUFNREVQX0ZBTFNFISRBTURFUF9GQUxTRSRhY19kZWxpbQotQU1ERVBCQUNLU0xBU0ghJEFNREVQQkFDS1NMQVNIJGFjX2RlbGltCi1DQ0RFUE1PREUhJENDREVQTU9ERSRhY19kZWxpbQotYW1fX2Zhc3RkZXBDQ19UUlVFISRhbV9fZmFzdGRlcENDX1RSVUUkYWNfZGVsaW0KLWFtX19mYXN0ZGVwQ0NfRkFMU0UhJGFtX19mYXN0ZGVwQ0NfRkFMU0UkYWNfZGVsaW0KLVJBTkxJQiEkUkFOTElCJGFjX2RlbGltCi1DUFAhJENQUCRhY19kZWxpbQotR1JFUCEkR1JFUCRhY19kZWxpbQotRUdSRVAhJEVHUkVQJGFjX2RlbGltCi1QT0UhJFBPRSRhY19kZWxpbQotTElCT0JKUyEkTElCT0JKUyRhY19kZWxpbQotTFRMSUJPQkpTISRMVExJQk9CSlMkYWNfZGVsaW0KLV9BQ0VPRgotCi0gIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gODU7IHRoZW4KLSAgICBicmVhawotICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotCi1hY19lb2Y9YHNlZCAtbiAnL15DRU9GWzAtOV0qJC9zL0NFT0YvMC9wJyBjb25mJCRzdWJzLnNlZGAKLWlmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCi0gIGFjX2VvZj1gZWNobyAiJGFjX2VvZiIgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCi0gIGFjX2VvZj1gZXhwciAkYWNfZW9mICsgMWAKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1jYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYiBlbmQKLV9BQ0VPRgotc2VkICcKLXMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKLXMvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KLTpuCi10IG4KLXMvJyIkYWNfZGVsaW0iJyQvLGcvOyB0Ci1zLyQvXFwvOyBwCi1OOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgotJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAotcm0gLWYgY29uZiQkc3Vicy5zZWQKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi06ZW5kCi1zL3wjXyEhXyN8Ly9nCi1DRU9GJGFjX2VvZgotX0FDRU9GCi0KLQotIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAotIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKLSMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0vewotcy86KlwkKHNyY2Rpcik6Ki86Lwotcy86Klwke3NyY2Rpcn06Ki86Lwotcy86KkBzcmNkaXJAOiovOi8KLXMvXlwoW149XSo9WwkgXSpcKToqL1wxLwotcy86KiQvLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLWZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKLQotCi1mb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICA6W0ZIXS0pIGFjX3RhZz0tOi07OwotICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OwotICBlc2FjCi0gIGFjX3NhdmVfSUZTPSRJRlMKLSAgSUZTPToKLSAgc2V0IHggJGFjX3RhZwotICBJRlM9JGFjX3NhdmVfSUZTCi0gIHNoaWZ0Ci0gIGFjX2ZpbGU9JDEKLSAgc2hpZnQKLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpMKSBhY19zb3VyY2U9JDE7OwotICA6W0ZIXSkKLSAgICBhY19maWxlX2lucHV0cz0KLSAgICBmb3IgYWNfZgotICAgIGRvCi0gICAgICBjYXNlICRhY19mIGluCi0gICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7Ci0gICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQotCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKLQkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KLQkgdGVzdCAtZiAiJGFjX2YiIHx8Ci0JICAgY2FzZSAkYWNfZiBpbgotCSAgIFtcXC8kXSopIGZhbHNlOzsKLQkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7Ci0JICAgZXNhYyB8fAotCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgICAgIGVzYWMKLSAgICAgIGFjX2ZpbGVfaW5wdXRzPSIkYWNfZmlsZV9pbnB1dHMgJGFjX2YiCi0gICAgZG9uZQotCi0gICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKLSAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Ci0gICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KLSAgICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBmcm9tICJgSUZTPToKLQkgIGVjaG8gJCogfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJ2AiIGJ5IGNvbmZpZ3VyZS4iCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0KLSAgICBjYXNlICRhY190YWcgaW4KLSAgICAqOi06KiB8ICo6LSkgY2F0ID4iJHRtcC9zdGRpbiI7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0KLSAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Ci0kYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYWNfZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIHsgYXNfZGlyPSIkYWNfZGlyIgotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Ci0gIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KLSMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgotYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci0KLWNhc2UgYHNlZCAtbiAnL2RhdGFyb290ZGlyLyB7Ci0gIHAKLSAgcQotfQotL0BkYXRhZGlyQC9wCi0vQGRvY2RpckAvcAotL0BpbmZvZGlyQC9wCi0vQGxvY2FsZWRpckAvcAotL0BtYW5kaXJAL3AKLScgJGFjX2ZpbGVfaW5wdXRzYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCi0gIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKLSAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKLSAgcyZAaW5mb2RpckAmJGluZm9kaXImZwotICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZwotICBzJkBtYW5kaXJAJiRtYW5kaXImZwotICAgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Ci1lc2FjCi1fQUNFT0YKLQotIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgotIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCi0jIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/Ci1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICBzZWQgIiRhY192cHN1YgotJGV4dHJhc3ViCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotOnQKLS9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKLXMmQGNvbmZpZ3VyZV9pbnB1dEAmJGNvbmZpZ3VyZV9pbnB1dCY7dCB0Ci1zJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLXMmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0Ci1zJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Ci1zJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci1zJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKLXMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAotcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLXMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKLXMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKLSRhY19kYXRhcm9vdGRpcl9oYWNrCi0iICRhY19maWxlX2lucHV0cyB8IHNlZCAtZiAiJHRtcC9zdWJzLTEuc2VkIiA+JHRtcC9vdXQKLQotdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KLQotICBybSAtZiAiJHRtcC9zdGRpbiIKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAtKSBjYXQgIiR0bXAvb3V0Ijsgcm0gLWYgIiR0bXAvb3V0Ijs7Ci0gICopIHJtIC1mICIkYWNfZmlsZSI7IG12ICIkdG1wL291dCIgJGFjX2ZpbGU7OwotICBlc2FjCi0gOzsKLSAgOkgpCi0gICMKLSAgIyBDT05GSUdfSEVBREVSCi0gICMKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGBjb25mdGVzdC5kZWZpbmVzJywgdGhhdAotIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLSMgRmlyc3QsIGFwcGVuZCBhIHNwYWNlIHRvIGV2ZXJ5IHVuZGVmL2RlZmluZSBsaW5lLCB0byBlYXNlIG1hdGNoaW5nLgotZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcwotIyBUaGVuLCBwcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QsIG9yIGluCi0jIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQsIGluIGNvbmZpZy5zdGF0dXMuICBJZiBzb21lIG1hY3JvcyB3ZXJlCi0jIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCi0jIHN5bWJvbCwgd2hpY2ggaXMgdXNlbGVzcy4gIEJ1dCBkbyBub3Qgc29ydCB0aGVtLCBzaW5jZSB0aGUgbGFzdAotIyBBQ19ERUZJTkUgbXVzdCBiZSBob25vcmVkLgotYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBQQVJBTVMgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQsIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMgUEFSQU1TIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi0taW4gbW9zdCBjYXNlcywgaXQncwotIyBqdXN0IGFuIGVtcHR5IHN0cmluZy4KLWFjX2RBPSdzLF5cXChbCSAjXSpcXClbXgkgXSpcXChbCSBdKicKLWFjX2RCPSdcXClbCSAoXS4qLFxcMWRlZmluZVxcMicKLWFjX2RDPScgJwotYWNfZEQ9JyAsJwotCi11bmlxIGNvbmZkZWZzLmggfAotICBzZWQgLW4gJwotCXQgcnNldAotCTpyc2V0Ci0Jcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovLwotCXQgb2sKLQlkCi0JOm9rCi0Jcy9bXFwmLF0vXFwmL2cKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvICciJGFjX2RBIidcMSciJGFjX2RCIidcMiciJHthY19kQ30iJ1wzJyIkYWNfZEQiJy9wCi0Jcy9eXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpLyciJGFjX2RBIidcMSciJGFjX2RCJGFjX2RDIidcMiciJGFjX2REIicvcAotICAnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIFJlbW92ZSB0aGUgc3BhY2UgdGhhdCB3YXMgYXBwZW5kZWQgdG8gZWFzZSBtYXRjaGluZy4KLSMgVGhlbiByZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi0jIChUaGUgcmVnZXhwIGNhbiBiZSBzaG9ydCwgc2luY2UgdGhlIGxpbmUgY29udGFpbnMgZWl0aGVyICNkZWZpbmUgb3IgI3VuZGVmLikKLWVjaG8gJ3MvICQvLwotcyxeWwkgI10qdS4qLC8qICYgKi8sJyA+PmNvbmZ0ZXN0LmRlZmluZXMKLQotIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzOgotYWNfbWF4X3NlZF9saW5lcz01MAotCi0jIEZpcnN0IHNlZCBjb21tYW5kIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICRhY19maWxlX2lucHV0cyA+IiR0bXAvb3V0MSIKLSMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKLSMgVGhpcmQgb25lIHdpbGwgYmU6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MiIgPiIkdG1wL291dDEiCi0jIGV0IGNldGVyYS4KLWFjX2luPSckYWNfZmlsZV9pbnB1dHMnCi1hY19vdXQ9JyIkdG1wL291dDEiJwotYWNfbnh0PSciJHRtcC9vdXQyIicKLQotd2hpbGUgOgotZG8KLSAgIyBXcml0ZSBhIGhlcmUgZG9jdW1lbnQ6Ci0gICAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgICAjIEZpcnN0LCBjaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBsaW5lOgotICAgIGNhdCA+IlwkdG1wL2RlZmluZXMuc2VkIiA8PFxcQ0VPRgotL15bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qJGFjX3dvcmRfcmVbCSBdKlwkL2IgZGVmCi0vXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qJGFjX3dvcmRfcmVbKAkgXS9iIGRlZgotYgotOmRlZgotX0FDRU9GCi0gIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICAgIHNlZCAtZiAiJHRtcC9kZWZpbmVzLnNlZCInICIkYWNfaW4gPiRhY19vdXQiID4+JENPTkZJR19TVEFUVVMKLSAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KLSAgc2VkIDEsJHthY19tYXhfc2VkX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAotICBncmVwIC4gY29uZnRlc3QudGFpbCA+L2Rldi9udWxsIHx8IGJyZWFrCi0gIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCi1kb25lCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLQotZWNobyAiYWNfcmVzdWx0PSRhY19pbiIgPj4kQ09ORklHX1NUQVRVUwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgPiIkdG1wL2NvbmZpZy5oIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIgPj4iJHRtcC9jb25maWcuaCIKLSAgICBpZiBkaWZmICRhY19maWxlICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1Ci1lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAkYWNfZmlsZQotICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICRhY19maWxlCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIKLSAgZmkKLSAgcm0gLWYgIiR0bXAvb3V0MTIiCi0jIENvbXB1dGUgJGFjX2ZpbGUncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkYWNfZmlsZSB8ICRhY19maWxlOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkYWNfZmlsZSIgPmAkYXNfZGlybmFtZSAtLSAkYWNfZmlsZSB8fAotJGFzX2V4cHIgWCRhY19maWxlIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgkYWNfZmlsZSA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYJGFjX2ZpbGUgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCRhY19maWxlIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYJGFjX2ZpbGUgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgL3N0YW1wLWgkX2FtX3N0YW1wX2NvdW50Ci0gOzsKLQotICA6QykgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci1lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KLSA7OwotICBlc2FjCi0KLQotICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KLSAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IGZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbwotICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAotICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgotICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0Ci0gICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgotICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwotICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgotICAjIFNvIGxldCdzIGdyZXAgd2hvbGUgZmlsZS4KLSAgaWYgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgJG1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAotJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRtZiIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIGVsc2UKLSAgICBjb250aW51ZQotICBmaQotICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCi0gIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKLSAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCi0gICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAjIGV4cGFuc2lvbi4KLSAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0gICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCi0gICAgZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRmaWxlIiB8fAotJGFzX2V4cHIgWCIkZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICAgIHsgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyCi0gIGNhc2UgJGFzX2RpciBpbiAjKAotICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7Ci0gIGVzYWMKLSAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLSAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgotICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICBkb25lCi1kb25lCi0gOzsKLQotICBlc2FjCi1kb25lICMgZm9yIGFjX3RhZwotCi0KLXsgKGV4aXQgMCk7IGV4aXQgMDsgfQotX0FDRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLQotCi0jIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCi0jIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KLSMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCi0jIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKLSMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCi0jIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCi0jIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKLSMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCi1pZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KLSAgYWNfY3Nfc3VjY2Vzcz06Ci0gIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KLSAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKLSAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKLSAgZXhlYyA1Pi9kZXYvbnVsbAotICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCi0gIGV4ZWMgNT4+Y29uZmlnLmxvZwotICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAotICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KLSAgJGFjX2NzX3N1Y2Nlc3MgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWd1cmUuaW4gYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3YmM1OTEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotZG5sIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24sIGFuZCBvdGhlcnMuCi1kbmwgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotZG5sIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotZG5sIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1kbmwgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLWRubAotZG5sCi0KLUFDX1BSRVJFUSgyLjUwKQotCi1BQ19JTklUKG9yZy5lY2xpcHNlLnB0cC5pYm1wZSwgMi4xLjEpCi1BQ19DT05GSUdfU1JDRElSKHNyYy9wdHBfaWJtcGVfcHJveHkuYykKLUFDX0NPTkZJR19IRUFERVJTKGNvbmZpZy5oKQotCi1BTV9JTklUX0FVVE9NQUtFCi0KLUFDX0NBTk9OSUNBTF9CVUlMRAotCi1VVElMUz0iLi4vb3JnLmVjbGlwc2UucHRwLnV0aWxzIgotaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCVVUSUxTPSJgZWNobyAke1VUSUxTfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCQlBQ19NU0dfRVJST1IoW3V0aWxzIGRpcmVjdG9yeSBub3QgZm91bmRdKQotCWZpCi1maQotUFJPWFk9Ii4uL29yZy5lY2xpcHNlLnB0cC5wcm94eSIKLWlmIHRlc3QgISAtZCAkUFJPWFk7IHRoZW4KLQlQUk9YWT0iYGVjaG8gJHtQUk9YWX1fJHtQQUNLQUdFX1ZFUlNJT059LipgIgotCWlmIHRlc3QgISAtZCAkUFJPWFk7IHRoZW4KLQkJQUNfTVNHX0VSUk9SKFtwcm94eSBkaXJlY3Rvcnkgbm90IGZvdW5kXSkKLQlmaQotZmkKLQotQUNfQVJHX1dJVEgobGwtaGVhZGVyLCBBQ19IRUxQX1NUUklORyhbLS13aXRoLWxsLWhlYWRlcj1ESVJdLCAKLQkJCVtsb2NhbCBMb2FkTGV2ZWxlciBoZWFkZXIgZGlyZWN0b3J5IEA8OkBub25lQDo+QF0pLAotCQkJW2xsaW5jbHVkZT0tSSR3aXRodmFsXSwgW2xsaW5jbHVkZT0iIl0pCi1sbGRpcj0iJGxsaW5jbHVkZSAtSS9vcHQvaWJtbGwvTG9hZEwvZnVsbC9pbmNsdWRlIC1JL3Vzci9scHAvTG9hZEwvZnVsbC9pbmNsdWRlIgotCi1kbmwKLWRubCBDaGVjayBmb3IgcHJvZ3JhbXMuCi1kbmwKLQotQUNfUFJPR19DQwotQU1fUFJPR19DQ19DX08KLUFDX1BST0dfSU5TVEFMTAotQUNfUFJPR19NQUtFX1NFVAotQUNfUFJPR19SQU5MSUIKLQotb3M9YHVuYW1lIC1zYAotaWYgdGVzdCAieCRvcyIgPSAieEFJWCIgOyB0aGVuCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1xaW5mbz1nZW4gLXFjcGx1c2NtdCIKLWVsc2UKLQlDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCi1maQotCi1DRkxBR1M9IiRDRkxBR1MgLUkkVVRJTFMvaW5jbHVkZSAtSSRQUk9YWS9pbmNsdWRlICRsbGRpciIKLUxJQlM9IiRMSUJTIC1MJFVUSUxTIC1MJFBST1hZIgotCi1kbmwKLWRubCBDaGVjayBmb3IgbGlicmFyaWVzLgotZG5sCi1BQ19DSEVDS19MSUIodXRpbHMsIGJpdHNldF9uZXcpCi1BQ19DSEVDS19MSUIocHJveHlzdnIsIHByb3h5X3N2cl9pbml0KQotCi1kbmwKLWRubCBDaGVjayBmb3IgaGVhZGVyIGZpbGVzLgotZG5sCi0KLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVJTKFtsbGFwaS5oXSwgW0NGTEFHUz0iJENGTEFHUyAtREhBVkVfTExBUElfSCJdKQotCi1kbmwKLWRubCBDaGVjayBmb3IgdHlwZXMKLWRubAotQUNfVFlQRV9TSUdOQUwKLWRubAotZG5sIENoZWNrIGZvciAicG9lIiBwcm9ncmFtCi1kbmwKLUFDX1BBVEhfUFJPRyhQT0UsIFtwb2VdLCBubykKLWlmIHRlc3QgIiRhY19jdl9wYXRoX1BPRSIgIT0gbm87IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoUE9FLCAiJGFjX2N2X3BhdGhfUE9FIiwgW0xvY2F0aW9uIG9mIHBvZSBwcm9ncmFtXSkKLWVsc2UKLQlBQ19NU0dfTk9USUNFKFtQRSBub3QgaW5zdGFsbGVkLCBza2lwcGluZy4uLl0pCi0JQVNfRVhJVAotZmkKLQotCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvZGVwY29tcCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2RlcGNvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExZTJkM2IuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA0LTA1LTMxLjIzCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCi0KLWNhc2UgJDEgaW4KLSAgJycpCi0gICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgICAgZXhpdCAxOwotICAgICA7OwotICAtaCB8IC0taCopCi0gICAgY2F0IDw8XEVPRgotVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KLQotUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCi1hcyBzaWRlLWVmZmVjdHMuCi0KLUVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgotICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KLSAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KLSAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KLSAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KLSAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCi0KLVJlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCi1FT0YKLSAgICBleGl0IDAKLSAgICA7OwotICAtdiB8IC0tdiopCi0gICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKLSAgICBleGl0IDAKLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCi0gIDs7Ci0KLWdjYykKLSMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCi0jIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKLSMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCi0jIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCi0jIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQotIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKLSMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgotIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQotIyMgICB0aGFuIHJlbmFtaW5nKS4KLSAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCi0gICAgZ2NjZmxhZz0tTUQsCi0gIGZpCi0gICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ci0jIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCi0gIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAotICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgotIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCi0jIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQotIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCi0jIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZwotIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbwotIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8Ci0jIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKLSMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcwotIyMgd2VsbC4KLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWhwKQotICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKLSAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAotICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgotICBleGl0IDEKLSAgOzsKLQotc2dpKQotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgotICBlbHNlCi0gICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgotICBmaQotICBzdGF0PSQ/Ci0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICAgIGV4aXQgJHN0YXQKLSAgZmkKLSAgcm0gLWYgIiRkZXBmaWxlIgotCi0gIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcwotICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0KLSAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCi0gICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKLSAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KLSAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOwotICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICAjIGRlcGVuZGVuY3kgbGluZS4KLSAgICB0ciAnICcgJwotJyA8ICIkdG1wZGVwZmlsZSIgXAotICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKLSAgICB0ciAnCi0nICcgJyA+PiAkZGVwZmlsZQotICAgIGVjaG8gPj4gJGRlcGZpbGUKLQotICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAotICAgPj4gJGRlcGZpbGUKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWFpeCkKLSAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcwotICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQotICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCi0gICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0gICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgotICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKLSAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgLVdjLC1NCi0gIGVsc2UKLSAgICAiJEAiIC1NCi0gIGZpCi0gIHN0YXQ9JD8KLQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgotICBlbHNlCi0gICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKLSAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKLSAgZmkKLQotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCi0gICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCi0gICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KLSAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCi0gICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIERlcGVuZGVuY2llcyBhcmUgb3V0cHV0IGluIC5sby5kIHdpdGggbGlidG9vbCAxLjQuCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhleSBhcmUgb3V0cHV0IGJvdGggaW4gJGRpci5saWJzLyRiYXNlLm8uZAotICAgICAgIyBhbmQgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQgJGRpciRiYXNlLm8uZC4gIFdlIHByb2Nlc3MgdGhlCi0gICAgICAjIGxhdHRlciwgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgYmUgY2xlYW5lZCB3aGVuICRkaXIubGlicyBpcwotICAgICAgIyBlcmFzZWQuCi0gICAgICB0bXBkZXBmaWxlMT0iJGRpci5saWJzLyRiYXNlLmxvLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLm8uZCIKLSAgICAgIHRtcGRlcGZpbGUzPSIkZGlyLmxpYnMvJGJhc2UuZCIKLSAgICAgICIkQCIgLVdjLC1NRAotICAgZWxzZQotICAgICAgdG1wZGVwZmlsZTE9IiRkaXIkYmFzZS5vLmQiCi0gICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLmQiCi0gICAgICB0bXBkZXBmaWxlMz0iJGRpciRiYXNlLmQiCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUxIjsgdGhlbgotICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUxIgotICAgZWxpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTIiOyB0aGVuCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTMiCi0gICBmaQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAotICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotbXN2aXN1YWxjcHApCi0gICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgotICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAotICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCi0gICIkQCIgfHwgZXhpdCAkPwotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICIkYXJnIiBpbgotICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQotCXNldCBmbm9yZCAiJEAiCi0Jc2hpZnQKLQlzaGlmdAotCTs7Ci0gICAgKikKLQlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgIiRAIiAtRSB8Ci0gIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgotICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCi0gIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1ub25lKQotICBleGVjICIkQCIKLSAgOzsKLQotKikKLSAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6IHNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjogMgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJCIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvaW5zdGFsbC1zaCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViYzY2OTEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9taXNzaW5nIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdlZjgzYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0KLXNjcmlwdHZlcnNpb249MjAwMy0wOS0wMi4yMwotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMyAKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotIyAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1ydW49OgotCi0jIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCi0jIHNyY2RpciBhbHJlYWR5LgotaWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYwotZWxzZQotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCi1maQotCi1tc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCi0KLWNhc2UgIiQxIiBpbgotLS1ydW4pCi0gICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KLSAgcnVuPQotICBzaGlmdAotICAiJEAiICYmIGV4aXQgMAotICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCi0gICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KLSAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQotICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCi0gICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgotICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KLSAgICBydW49OgotICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKLSMgdHJ5IHRvIGVtdWxhdGUgaXQuCi1jYXNlICIkMSIgaW4KLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKLQotU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgotICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCi0gIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwotICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJwotICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCi0gIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLSAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLQotU2VuZCBidWcgcmVwb3J0cyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgYWNsb2NhbCopCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KLSAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBhY2xvY2FsLm00Ci0gICAgOzsKLQotICBhdXRvY29uZikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCi0gICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBjb25maWd1cmUKLSAgICA7OwotCi0gIGF1dG9oZWFkZXIpCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCi0gICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAotICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgotICAgIHRvdWNoX2ZpbGVzPQotICAgIGZvciBmIGluICRmaWxlczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UqKQotICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBhdXRvbTR0ZSkKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCi0gICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JdG91Y2ggJGZpbGUKLSAgICBlbHNlCi0JdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCi0JZWNobyAiIyEgL2Jpbi9zaCIKLQllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKLQllY2hvICIjICAkICRAIgotCWVjaG8gImV4aXQgMCIKLQljaG1vZCAreCAkZmlsZQotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBiaXNvbnx5YWNjKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYwotCSAgICBmaQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYwotICAgIGZpCi0gICAgOzsKLQotICBsZXh8ZmxleCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIGxleC55eS5jCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBoZWxwMm1hbikKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCi0JIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQotCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLQotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAotICAgIGZpCi0gICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KLQl0b3VjaCAkZmlsZQotICAgIGVsc2UKLQl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKLQllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgotCWV4aXQgMQotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAobWFrZWluZm8gLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgIyBXZSBoYXZlIG1ha2VpbmZvLCBidXQgaXQgZmFpbGVkLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLSAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKLSAgICBmaQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICB0YXIpCi0gICAgc2hpZnQKLSAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgotICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgotICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgotICAgICMgbWVzc2FnZXMuCi0gICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGZpcnN0YXJnPSIkMSIKLSAgICBpZiBzaGlmdDsgdGhlbgotCWNhc2UgIiRmaXJzdGFyZyIgaW4KLQkqbyopCi0JICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAotCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKLQkgICAgOzsKLQllc2FjCi0JY2FzZSAiJGZpcnN0YXJnIiBpbgotCSpoKikKLQkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCi0JICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAotCSAgICA7OwotCWVzYWMKLSAgICBmaQotCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCi0gICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgotICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU2NmQ3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBJQk0gUGFyYWxsZWwgRW52aXJvbm1lbnQgUHJveHkgQWdlbnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9zcmMvcHRwX2libXBlX21pbmlwcm94eS5jIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvc3JjL3B0cF9pYm1wZV9taW5pcHJveHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVhOWI5MS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5wcm94eS9zcmMvcHRwX2libXBlX21pbmlwcm94eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqLwotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pOwotc3RhdGljIHZvaWQgKnN0ZG91dF93cml0ZXIodm9pZCAqZmQpOwotc3RhdGljIHZvaWQgKnN0ZGVycl93cml0ZXIodm9pZCAqZmQpOwotc3RhdGljIHZvaWQgY29tbW9uX3dyaXRlcihpbnQgZmQsIGNoYXIgKmZpbGVfc3VmZml4KTsKLQotc3RhdGljIGNoYXIgKnN0ZG91dF9wcmVmaXg7Ci1zdGF0aWMgY2hhciAqc3RkZXJyX3ByZWZpeDsKLXN0YXRpYyBGSUxFICp0cmFjZV9mZDsKLXN0YXRpYyBpbnQgdGhyZWFkX2NvdW50Owotc3RhdGljIHB0aHJlYWRfdCB0aWQ7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGNvdW50X2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICAvKgotICAgICAqIFBhcnNlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgYW5kIHJlZGlyZWN0IHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVycgotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZpbGUuCi0gICAgICogSW4gcHJpbmNpcGxlLCB0aGlzIGNvZGUgY291bGQgYmUgcGFydCBvZiB0aGUgbWFpbiBwcm94eSBtb2R1bGUsIGluCi0gICAgICogd2hpY2ggY2FzZSwgdGhlIG1haW4gcHJveHkgd291bGQganVzdCBmb3JrIGEgY29weSBvZiBpdHNlbGYgYW5kIHJ1bgotICAgICAqIHRoaXMgY29kZSBpbiB0aGUgbmV3IGNoaWxkLiBJdCB0dXJucyBvdXQgdGhpcyBkb2VzIG5vdCB3b3JrLCBzaW5jZSAKLSAgICAgKiBhdCB0aGUgcG9pbnQgdGhhdCB0aGUgcHJveHkgaXMgc2h1dCBkb3duLCB0aGVyZSBtYXkgc3RpbGwgYmUgZGF0YSAKLSAgICAgKiBxdWV1ZWQgdG8gYmUgc2VudCB0byB0aGUgZnJvbnQgZW5kLiBBdHRlbXB0cyB0byB3cml0ZSB0aGlzIGRhdGEgCi0gICAgICogcmVzdWx0IGluIEkvTyBlcnJvcnMgb25jZSB0aGUgZnJvbnQgZW5kIGhhcyBjbG9zZWQgdGhlIHByb3h5Ci0gICAgICogY29ubmVjdGlvbiwgYW5kIHRoZXJlIGlzIG5vdCBhIHNhZmUgd2F5IHRvIHNodXQgZG93biB0aGUgcXVldWVkIEkvTy4KLSAgICAgKiBBIHNlcGFyYXRlIHByb2Nlc3MgaXMgbGlrZWx5IHNhZmVyIGFueXdheSwgc2luY2UgaWYgdGhlIHByb3h5IGhhcwotICAgICAqIG90aGVyIHByb2JsZW1zLCB0aGV5IGNvdWxkIGFsc28gaW50ZXJmZXJlIHdpdGggdGhlIEkvTyBoYW5kbGluZy4KLSAgICAgKiBTaW5jZSB0aGlzIG1pbmlwcm94eSBjYW5ub3QgYXNzdW1lIGEgY29tbXVuaWNhdGlvbiBwYXRoIHRvIHRoZSBmcm9udAotICAgICAqIGVuZCwgdGhlIG1pbmlwcm94eSB3aWxsIHNpbGVudGx5IGZhaWwgb24gZXJyb3JzLCB1bmxlc3MgdHJhY2luZyBpcwotICAgICAqIGVuYWJsZWQuIAotICAgICAqIFRoZSBjb21tYW5kIGxpbmUgY29uc2lzdHMgb2YgYSBzaW5nbGUgcGFyYW1ldGVyIHdoaWNoIHRoaXMgZnVuY3Rpb24KLSAgICAgKiBtdXN0IHBhcnNlLiBUaGUgcGFyYW1ldGVyIGNvbnRhaW5zIGJsYW5rIGRlbGltaXRlZCB0b2tlbnMgYXMgZm9sbG93cwotICAgICAqIHRyYWNlIGZsYWcgKHkgb3IgbikuIFRyYWNpbmcgaXMgYWN0aXZlIHdoZW4gZmxhZyBpcyAneScKLSAgICAgKiBQYXRobmFtZSBwcmVmaXggZm9yIHN0ZG91dCBmaWxlcywgb3IgL2Rldi9udWxsIAotICAgICAqIFBhdGhuYW1lIHByZWZpeCBmb3Igc3RkZXJyIGZpbGVzLCBvciAvZGV2L251bGwKLSAgICAgKiBOdW1iZXIgb2Ygc3RkaW4gZmlsZSBkZXNjcmlwdG9ycyAoZmRzKSBmb2xsb3dpbmcsIG1heSBiZSAwCi0gICAgICogU2V0IG9mIHN0ZGluIGZkcwotICAgICAqIE51bWJlciBvZiBzdGRvdXQgZmlsZSBkZXNjcmlwdG9ycyBmb2xsb3dpbmcsIG1heSBiZSAwCi0gICAgICogU2V0IG9mIHN0ZG91dCBmZHMKLSAgICAgKiBOdW1iZXIgb2Ygc3RkZXJyIGZpbGUgZGVzY3JpcHRvcnMgZm9sbG93aW5nLCBtYXkgYmUgMAotICAgICAqIFNldCBvZiBzdGRlcnIgZmRzCi0gICAgICovCi0gICAgY2hhciAqdG9rZW47Ci0gICAgaW50IG51bV9mZHM7Ci0gICAgaW50IGN1cnJlbnRfZmQ7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgdG9rZW4gPSBzdHJ0b2soYXJndlsxXSwgIiAiKTsKLSAgICBpZiAodG9rZW4gPT0gTlVMTCkgewotCWV4aXQoMSk7Ci0gICAgfQotICAgIGlmICgqdG9rZW4gPT0gJ3knKSB7Ci0JdHJhY2VfZmQgPSBmb3BlbigiL3RtcC9wdHBfaWJtcGVfbWluaXByb3h5LmxvZyIsICJ3Iik7Ci0gICAgfQotICAgIHN0ZG91dF9wcmVmaXggPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICBpZiAoc3Rkb3V0X3ByZWZpeCA9PSBOVUxMKSB7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RkZXJyX3ByZWZpeCA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgIGlmIChzdGRlcnJfcHJlZml4ID09IE5VTEwpIHsKLQlleGl0KDEpOwotICAgIH0KLSAgICB0b2tlbiA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgbnVtX2ZkcyA9IGF0b2kodG9rZW4pOwotICAgIC8qCi0gICAgICogRm9yIHN0ZGluLCBqdXN0IHJlZGlyZWN0IHN0ZGluIHRvIC9kZXYvbnVsbC4gVGhlIGFwcGxpY2F0aW9uIHdpbGwKLSAgICAgKiBnZXQgYW4gdW5leHBlY3RlZCBlb2YsIHdoaWNoIGl0IHdpbGwgaG9wZWZ1bGx5IGhhbmRsZSBtb3JlCi0gICAgICogZ3JhY2VmdWxseSB0aGFuIHRoZSBTSUdQSVBFIGl0IHdvdWxkIGdldCB3aXRob3V0IGF0dGVtcHRpbmcKLSAgICAgKiByZWRpcmVjdGlvbi4gVGhlcmUgaXMgcmVhbGx5IG5vIG90aGVyIGFsdGVybmF0aXZlIGhlcmUuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9mZHM7IGkrKykgewotCWludCBzdGRpbl9mZDsKLQotCXRva2VuID0gc3RydG9rKE5VTEwsICIgIik7Ci0JaWYgKHRva2VuID09IE5VTEwpIHsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JY3VycmVudF9mZCA9IGF0b2kodG9rZW4pOwotCXN0ZGluX2ZkIC0gb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOwotCWlmIChzdGRpbl9mZCAhPSAtMSkgewotCSAgICBpZiAodHJhY2VfZmQgIT0gTlVMTCkgewotCQlmcHJpbnRmKHRyYWNlX2ZkLCAiUmVkaXJlY3Qgc3RkaW4gcGlwZSBmZCAlZCB0byAvZGV2L251bGxcbiIsCi0JCQljdXJyZW50X2ZkKTsKLQkJZmZsdXNoKHRyYWNlX2ZkKTsKLQkgICAgfQotCSAgICBkdXAyKGN1cnJlbnRfZmQsIHN0ZGluX2ZkKTsKLQl9Ci0gICAgfQotICAgIHRva2VuID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgaWYgKHRva2VuID09IE5VTEwpIHsKLQlleGl0KDEpOwotICAgIH0KLSAgICAvKgotICAgICAqIFN0YXJ0IGEgdGhyZWFkIGZvciBlYWNoIHN0ZG91dCBmaWxlIGRlc2NyaXB0b3IsIHdoZXJlIG91dHB1dCB3aWxsIGJlCi0gICAgICogcmVkaXJlY3RlZCB0byAvZGV2L251bGwgb3IgdG8gYSB1c2VyIHNwZWNpZmllZCB0YXJnZXQgZmlsZQotICAgICAqLwotICAgIG51bV9mZHMgPSBhdG9pKHRva2VuKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZkczsgaSsrKSB7Ci0JdG9rZW4gPSBzdHJ0b2soTlVMTCwgIiAiKTsKLQlpZiAodG9rZW4gPT0gTlVMTCkgewotCSAgICBleGl0KDEpOwotCX0KLQljdXJyZW50X2ZkID0gYXRvaSh0b2tlbik7Ci0JaWYgKHRyYWNlX2ZkICE9IE5VTEwpIHsKLQkgICAgZnByaW50Zih0cmFjZV9mZCwgIlN0YXJ0aW5nIHN0ZG91dCB3cml0ZXIgdGhyZWFkIGZvciBmZCAlZFxuIiwKLQkJICAgIGN1cnJlbnRfZmQpOwotCSAgICBmZmx1c2godHJhY2VfZmQpOwotCX0KLQlwdGhyZWFkX211dGV4X2xvY2soJmNvdW50X2xvY2spOwotCXRocmVhZF9jb3VudCA9IHRocmVhZF9jb3VudCArIDE7Ci0JcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50X2xvY2spOwotCXB0aHJlYWRfY3JlYXRlKCZ0aWQsIE5VTEwsIHN0ZG91dF93cml0ZXIsICh2b2lkICopIGN1cnJlbnRfZmQpOwotICAgIH0KLSAgICB0b2tlbiA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBTdGFydCBhIHRocmVhZCBmb3IgZWFjaCBzdGRvdXQgZmlsZSBkZXNjcmlwdG9yLCB3aGVyZSBvdXRwdXQgd2lsbCBiZQotICAgICAqIHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsIG9yIHRvIGEgdXNlciBzcGVjaWZpZWQgdGFyZ2V0IGZpbGUKLSAgICAgKi8KLSAgICBudW1fZmRzID0gYXRvaSh0b2tlbik7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9mZHM7IGkrKykgewotCXRva2VuID0gc3RydG9rKE5VTEwsICIgIik7Ci0JaWYgKHRva2VuID09IE5VTEwpIHsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JY3VycmVudF9mZCA9IGF0b2kodG9rZW4pOwotCWlmICh0cmFjZV9mZCAhPSBOVUxMKSB7Ci0JICAgIGZwcmludGYodHJhY2VfZmQsICJTdGFydGluZyBzdGRlcnIgd3JpdGVyIHRocmVhZCBmb3IgZmQgJWRcbiIsCi0JCSAgICBjdXJyZW50X2ZkKTsKLQkgICAgZmZsdXNoKHRyYWNlX2ZkKTsKLQl9Ci0JcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudF9sb2NrKTsKLQl0aHJlYWRfY291bnQgPSB0aHJlYWRfY291bnQgKyAxOwotCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb3VudF9sb2NrKTsKLQlwdGhyZWFkX2NyZWF0ZSgmdGlkLCBOVUxMLCBzdGRlcnJfd3JpdGVyLCAodm9pZCAqKSBjdXJyZW50X2ZkKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBXYWl0IHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIEkvTyB0aHJlYWRzCi0gICAgICovCi0gICAgd2hpbGUgKHRocmVhZF9jb3VudCA+IDApIHsKLQlzbGVlcCg2MCk7Ci0gICAgfQotICAgIGV4aXQoMCk7Ci19Ci0KLXZvaWQgKgotc3Rkb3V0X3dyaXRlcih2b2lkICpmZCkKLXsKLSAgICBjb21tb25fd3JpdGVyKChpbnQpIGZkLCAic3Rkb3V0Iik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKgotc3RkZXJyX3dyaXRlcih2b2lkICpmZCkKLXsKLSAgICBjb21tb25fd3JpdGVyKChpbnQpIGZkLCAic3RkZXJyIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQKLWNvbW1vbl93cml0ZXIoaW50IGZkLCBjaGFyICpmaWxlX3N1ZmZpeCkKLXsKLSAgICAvKgotICAgICAqIEhhbmRsZSByZWRpcmVjdGlvbiBvZiBvdXRwdXQgdG8gL2Rldi9udWxsIG9yIHRvIHVzZXItc3BlY2lmaWVkCi0gICAgICogZmlsZS4gVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGFuZ2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSAKLSAgICAgKiBub24tYmxvY2tpbmcgSS9PIHRvIGJsb2NraW5nIEkvTyB0aGVuIGxvb3BzLCBjb3B5aW5nIGRhdGEgZnJvbQotICAgICAqIGlucHV0IHRvIG91dHB1dCB1bnRpbCBlb2YgaXMgcmVhY2hlZC4KLSAgICAgKi8KLSAgICBpbnQgZmxhZ3M7Ci0gICAgaW50IHN0YXR1czsKLSAgICBpbnQgb3V0X2ZkOwotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKLQotICAgIGZsYWdzID0gZmNudGwoKGludCkgZmQsIEZfR0VURkwpOwotICAgIGZsYWdzID0gZmxhZ3MgJiAoMHhmZmZmZmZmZiBeIE9fTk9OQkxPQ0spOwotICAgIHN0YXR1cyA9IGZjbnRsKChpbnQpIGZkLCBGX1NFVEZMLCBmbGFncyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAtMSkgewotCWlmIChzdHJjbXAoc3Rkb3V0X3ByZWZpeCwgIi9kZXYvbnVsbCIpID09IDApIHsKLQkgICAgb3V0X2ZkID0gb3BlbihzdGRvdXRfcHJlZml4LCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7Ci0JfQotCWVsc2UgewotCSAgICBzbnByaW50ZihwYXRoLCBzaXplb2YgcGF0aCwgIiVzX2ZkJWQuJXMiLCBzdGRvdXRfcHJlZml4LCAoaW50KSBmZCwKLQkJICAgICBmaWxlX3N1ZmZpeCk7Ci0JICAgIHBhdGhbc2l6ZW9mIHBhdGggLSAxXSA9ICdcMCc7Ci0JICAgIG91dF9mZCA9IG9wZW4ocGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjYpOwotCX0KLQlpZiAob3V0X2ZkICE9IC0xKSB7Ci0JICAgIHN0YXR1cyA9IHJlYWQoKGludCkgZmQsIGJ1Ziwgc2l6ZW9mIGJ1Zik7Ci0JICAgIHdoaWxlIChzdGF0dXMgPiAwKSB7Ci0JCXN0YXR1cyA9IHdyaXRlKG91dF9mZCwgYnVmLCBzdGF0dXMpOwotCQlpZiAoc3RhdHVzID09IC0xKSB7Ci0JCSAgICBicmVhazsKLQkJfQotCQlzdGF0dXMgPSByZWFkKChpbnQpIGZkLCBidWYsIHNpemVvZiBidWYpOwotCSAgICB9Ci0JICAgIGlmICgoc3RhdHVzID09IC0xKSAmJiAodHJhY2VfZmQgIT0gTlVMTCkpIHsKLQkJZnByaW50Zih0cmFjZV9mZCwgIkkvTyBlcnJvciBpbiB3cml0ZXIgdGhyZWFkIGZvciBmZCAlZDogJXNcbiIsCi0JCQkoaW50KSBmZCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZmZsdXNoKHRyYWNlX2ZkKTsKLQkgICAgfQotCSAgICBjbG9zZShvdXRfZmQpOwotCX0KLSAgICB9Ci0gICAgaWYgKHRyYWNlX2ZkICE9IE5VTEwpIHsKLQlmcHJpbnRmKHRyYWNlX2ZkLCAiV3JpdGVyIHRocmVhZCBmb3IgZmQgJWQgY29tcGxldGVcbiIsIChpbnQpIGZkKTsKLQlmZmx1c2godHJhY2VfZmQpOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50X2xvY2spOwotICAgIHRocmVhZF9jb3VudCA9IHRocmVhZF9jb3VudCAtIDE7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50X2xvY2spOwotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvc3JjL3B0cF9pYm1wZV9wcm94eS5jIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHkvc3JjL3B0cF9pYm1wZV9wcm94eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGE1NTU4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5L3NyYy9wdHBfaWJtcGVfcHJveHkuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMTYgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eQotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseQotICogbWFya2VkLCBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKgotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIExBLUNDIDA0LTExNQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMHMKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFF1ZXN0aW9ucy9wcm9ibGVtcwotICogMjIpIFNob3VsZCBwcm9iYWJseSBzZXJpYWxpemUgYXJvdW5kIHByb2Nlc3MgYW5kIG5vZGUgb2JqZWN0IGdlbmVyYXRpb24gdG8KLSAqCSAgIHNpbXBsaWZ5IGdlbmVyYXRpb24gb2Ygbm9kZSBhbmQgcHJvY2VzcyBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgYWZmZWN0aW5nCi0gKgkgICBtdWx0aXBsZSBub2RlcyBvciBwcm9jZXNzZXMgd2l0aCBjb25zZWN1dGl2ZSBvYmplY3QgaWQgcmFuZ2VzCi0gKiAyMykgRm9yIFBFL0xMIGNhc2UsIG1hY2hpbmVfaWQgYW5kIHF1ZXVlX2lkIG5lZWQgdG8gYmUgc2V0IHRvIHRoZSBtYWNoaW5lIGlkIGFuZAotICogCSAgIHF1ZXVlIGlkIGZvciB0aGUgY2x1c3RlciB0aGF0IGNvbnRhaW5zIHRoZSBub2RlIHdoZXJlIHRoaXMgcHJveHkgaXMgcnVubmluZy4KLSAqIAkgICAoTG9hZExldmVsZXIgcmVzdHJpY3RzIGludGVyYWN0aXZlIFBFIGFwcGxpY2F0aW9ucyB0byBydW5uaW5nIG9ubHkgb24gdGhlCi0gKiAgICAgICAgIGNsdXN0ZXIgd2hlcmUgdGhlIHBvZSBwcm9jZXNzIHJ1bnMsIHdoaWNoIGluIG91ciBjYXNlIGlzIHRoZSBub2RlIHdoZXJlIHRoZQotICogICAgICAgICBwcm94eSBydW5zKQotICovCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPGdycC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHByb3h5X2NtZC5oPgotI2luY2x1ZGUgPHByb3h5Lmg+Ci0jaW5jbHVkZSA8cHJveHlfdGNwLmg+Ci0jaW5jbHVkZSA8cHJveHlfZXZlbnQuaD4KLSNpbmNsdWRlIDxwcm94eV9jbWQuaD4KLSNpbmNsdWRlIDxwcm94eV9tc2cuaD4KLSNpbmNsdWRlIDxwcm94eV9hdHRyLmg+Ci0jaW5jbHVkZSA8aGFuZGxlci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGxpc3QuaD4KLSNpbmNsdWRlIDxoYXNoLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpZmRlZiBfX2xpbnV4X18KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNlbmRpZgotI2lmZGVmIF9BSVgKLSNpbmNsdWRlIDxwcm9jaW5mby5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9MTEFQSV9ICi0jaW5jbHVkZSA8bGxhcGkuaD4KLSNlbmRpZgotCi0jZGVmaW5lIFBFX0RVQUxfUE9FX0RFQlVHCQkJCS8qIEluY2x1ZGUgY29kZSBmb3IgUEUgcHJveHkgc3VwcG9ydCBmb3IgdGhlIGR1YWwgcG9lIGRlYnVnZ2VyLiovCi0KLSNkZWZpbmUgREVGQVVMVF9QUk9YWSAidGNwIgotI2RlZmluZSBERUZBVUxUX1FVRVVFX05BTUUgImRlZmF1bHQiCi0jZGVmaW5lIFNLSVBQSU5HX1NQQUNFUwkJCTEKLSNkZWZpbmUgUEFSU0lOR19VTlFVT1RFRF9BUkcJMgotI2RlZmluZSBQQVJTSU5HX1FVT1RFRF9BUkcJCTMKLSNkZWZpbmUgU0tJUFBJTkdfQ0hBUlMJCQk0Ci0jZGVmaW5lIFJFQURfQlVGRkVSX1NJWkUgMTAyNAotI2RlZmluZSBTVERJT19XUklURV9CVUZTSVpFIDEwMjQKLSNpZm5kZWYgUE9FCi0jZGVmaW5lIFBPRSAiL3Vzci9iaW4vcG9lIgotI2VuZGlmIC8qIFBPRSAqLwotI2RlZmluZSBQTURfSEVMUEVSCQkJCSIvdXNyL2Jpbi9wbWRoZWxwZXIiCQkvKiBkZWZhdWx0IGR1YWwgcG9lIGRlYnVnZ2VyIGhlbHBlciAqLwotI2RlZmluZSBJTkZPX01FU1NBR0UgMAotI2RlZmluZSBUUkFDRV9NRVNTQUdFIDEKLSNkZWZpbmUgVFJBQ0VfREVUQUlMX01FU1NBR0UgMgotI2RlZmluZSBXQVJOSU5HX01FU1NBR0UgMwotI2RlZmluZSBFUlJPUl9NRVNTQUdFIDQKLSNkZWZpbmUgRkFUQUxfTUVTU0FHRSA1Ci0jZGVmaW5lIEFSR1NfTUVTU0FHRSA2Ci0jZGVmaW5lIEFUVFJfRk9SX0xJTlVYIDB4MDAwMDAwMQotI2RlZmluZSBBVFRSX0ZPUl9BSVggMHgwMDAwMDAwMgotI2RlZmluZSBBVFRSX0ZPUl9QRV9TVEFOREFMT05FIDB4MDAwMDAxMDAKLSNkZWZpbmUgQVRUUl9GT1JfUEVfV0lUSF9MTCAweDAwMDAwMjAwCi0jZGVmaW5lIEFUVFJfRk9SX0FMTF9PUyAweDAwMDAwMGZmCi0jZGVmaW5lIEFUVFJfRk9SX0FMTF9QUk9YWSAweDAwMDBmZjAwCi0jZGVmaW5lIEFUVFJfQUxXQVlTX0FMTE9XRUQgMHhmZmZmZmZmZgotI2RlZmluZSBUUkFDRV9FTlRSWSBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gKExpbmUgJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSNkZWZpbmUgVFJBQ0VfRVhJVCBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgZXhpdGVkLiAoTGluZSAlZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotI2RlZmluZSBUUkFDRV9ERVRBSUwoZm9ybWF0KSBwcmludF9tZXNzYWdlKFRSQUNFX0RFVEFJTF9NRVNTQUdFLCBmb3JtYXQpCi0jZGVmaW5lIFRSQUNFX0RFVEFJTF9WKGZvcm1hdCwgLi4uKSBwcmludF9tZXNzYWdlKFRSQUNFX0RFVEFJTF9NRVNTQUdFLCBmb3JtYXQsIF9fVkFfQVJHU19fKQotCi10eXBlZGVmIHN0cnVjdCBqb2JpbmZvICpqb2JpbmZvcHRyOwkvKiBGb3J3YXJkIHJlZmVyZW5jZSB0byBqb2JpbmZvICAgICAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKnJlYWRfYnVmOwkJLyogUmVhZCBidWZmZXIgZm9yIHN0ZG91dC9zdGRlcnIgICAgICAgICovCi0gICAgY2hhciAqd3JpdGVfYnVmOwkJLyogV3JpdGUgYnVmZmVyIGZvciBzdGRvdXQvc3RkZXJyICAgICAgICovCi0gICAgY2hhciAqY3A7CQkJLyogQ3VycmVudCBjaGFyYWN0ZXIgaW4gd3JpdGUgYnVmZmVyICAgICovCi0gICAgaW50IGFsbG9jYXRlZDsJCS8qIEFsbG9jYXRlZCBzaXplIG9mIHdyaXRlIGJ1ZmZlciAgICAgICAqLwotICAgIGludCByZW1haW5pbmc7CQkvKiBCeXRlcyBsZWZ0IGluIHdyaXRlIGJ1ZmZlciAgICAgICAgICAgKi8KLSAgICB2b2lkICgqd3JpdGVfZnVuYykgKGpvYmluZm9wdHIgam9iLCBjaGFyICpidWYpOwkvKiBGdW5jdGlvbiB3cml0aW5nIGRhdGEgKi8KLX0gaW9pbmZvOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHByb3h5X3Rhc2tpZDsJCS8qIFByb2Nlc3MgaWQgYXNzaWduZWQgYnkgcHJveHkgICAgICAgICAqLwotICAgIHBpZF90IHBhcmVudF9waWQ7CQkvKiBQSUQgZm9yIHBhcmVudCAocG9lKSBwcm9jZXNzICAgICAgICAgKi8KLSAgICBwaWRfdCB0YXNrX3BpZDsJCS8qIFBJRCBmb3IgdGhpcyBwcm9jZXNzICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgKmlwYWRkcjsJCS8qIElQIGFkZHJlc3Mgb2Ygbm9kZSB3aGVyZSB0YXNrIGlzICAgICAqLwotICAgIGNoYXIgKmhvc3RuYW1lOwkJLyogSG9zdG5hbWUgb2Ygbm9kZSB3aGVyZSB0YXNrIGlzICAgICAgICovCi19IHRhc2tpbmZvOwotCi10eXBlZGVmIHN0cnVjdCBqb2JpbmZvIHsKLSAgICBpbnQgcHJveHlfam9iaWQ7CQkvKiBKb2IgaWQgYXNzaWduZWQgYnkgcHJveHkgICAgICAgICAgICAgKi8KLSAgICBjaGFyICpzdWJtaXRfam9iaWQ7CQkvKiBKb2JpZCB1c2VkIHdoZW4gc3VibWl0dGVkIGJ5IEdVSSAgICAgKi8KLSAgICBwaWRfdCBwb2VfcGlkOwkJLyogUHJvY2VzcyBpZCBmb3IgbWFpbiBwb2UgcHJvY2VzcyAgICAgICovCi0gICAgcGlkX3QgdGFzazBfcGlkOwkJLyogUHJvY2VzcyBpZCBmb3IgYXBwLiB0YXNrIDAgICAgICAgICAgICovCi0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLSAgICBqb2JpbmZvcHRyIGRlYnVnZ2VyX2pvYjsgICAgLyogcmVmZXJlbmNlIHRvIGRlYnVnZ2VyIGpvYiAqLwotICAgIGpvYmluZm9wdHIgZGVidWdnZWVfam9iOyAgICAvKiByZWZlcmVuY2UgdG8gZGVidWdnZWUgam9iICovCi0jZW5kaWYKLSAgICBpbnQgZGVidWdnaW5nOwkJLyogSm9iIGlzIGJlaW5nIGRlYnVnZ2VkIAkJKi8KLSAgICBjaGFyICpzZG1fZGVidWdkaXI7ICAgICAgICAgLyogRGlyZWN0b3J5IHBhdGggZm9yIFNETSBkZWJ1Z2dlciAgICAgICovCi0gICAgY2hhciAqc2RtX2RlYnVnbmFtZTsgICAgICAgIC8qIFBhdGhuYW1lIHRvIHRoZSB0b3AgbGV2ZWwgZGVidWdnZXIgICAqLwotICAgIGNoYXIgKipzZG1fZGVidWdhcmdzOyAgICAgICAvKiBBcnJheSBvZiBkZWJ1Z2dlciBhcmdzICAgICAgICAgICAgICAgKi8KLSAgICBjaGFyICoqc2RtX2VudnA7ICAgICAgICAgICAgLyogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBTRE0gICAgICAgICovCi0gICAgaW50IHNkbV9kZWJ1Z19hcmdfY291bnQ7ICAgIC8qIE51bWJlciBvZiBkZWJ1Z2dlciBhcmdzICAgICAgICAgICAgICAqLwotICAgIGludCBzdGRpbl9mZDsJCS8qIFNURElOIHBpcGUvZmlsZSBkZXNjcmlwdG9yICAgICAgICAgICAqLwotICAgIGludCBzdGRvdXRfZmQ7CQkvKiBTVERPVVQgcGlwZS9maWxlIGRlc2NyaXB0b3IgICAgICAgICAgKi8KLSAgICBpbnQgc3RkZXJyX2ZkOwkJLyogU1RERVJSIHBpcGUvZmlsZSBkZXNjcmlwdG9yICAgICAgICAgICovCi0gICAgaW9pbmZvIHN0ZG91dF9pbmZvOwkJLyogU3Rkb3V0IGZpbGUgYnVmZmVyIGluZm8gICAgICAgICAgICAgICovCi0gICAgaW9pbmZvIHN0ZGVycl9pbmZvOwkJLyogU3RkZXJyIGZpbGUgYnVmZmVyIGluZm8gICAgICAgICAgICAgICovCi0gICAgaW50IG51bXRhc2tzOwkJLyogTnVtYmVyIG9mIHRhc2tzIGluIGFwcGxpY2F0aW9uICAgICAgICovCi0gICAgdGFza2luZm8gKnRhc2tzOwkJLyogVGFza3MgaW4gdGhpcyBhcHBsaWNhdGlvbiAgICAgICAgICAgICovCi0gICAgcHRocmVhZF90IHN0YXJ0dXBfdGhyZWFkOwkvKiBTdGFydHVwIG1vbml0b3IgdGhyZWFkIGZvciBhcHAgICAgICAgKi8KLSAgICB0aW1lX3Qgc3VibWl0X3RpbWU7CQkvKiBUaW1lIGpvYiB3YXMgc3VibWl0dGVkICAgICAgICAgICAgICAgKi8KLSAgICBpbnQgbGFiZWxfaW86MTsJCS8qIFVzZXIgc2V0IE1QX0xBQkVMSU8gICAgICAgICAgICAgICAgICAqLwotICAgIGludCBzcGxpdF9pbzoxOwkJLyogU1RET1VUIGlzIHNwbGl0IGJ5IHRhc2sgICAgICAgICAgICAgICovCi0gICAgaW50IHN0ZGluX3JlZGlyZWN0OjE7CS8qIFN0ZGluIHJlZGlyZWN0ZWQgdG8gZmlsZSAgICAgICAgICAgICAqLwotICAgIGludCBzdGRvdXRfcmVkaXJlY3Q6MTsJLyogU3Rkb3V0IHJlZGlyZWN0ZWQgdG8gZmlsZSAgICAgICAgICAgICovCi0gICAgaW50IHN0ZGVycl9yZWRpcmVjdDoxOwkvKiBTdGRlcnIgcmVkaXJlY3RlZCB0byBmaWxlICAgICAgICAgICAgKi8KLSAgICBpbnQgZGlzY292ZXJlZF9qb2I6MTsJLyogSm9iIGFscmVhZHkgcnVubmluZyBhdCBQVFAgc3RhcnR1cCAgICovCi19IGpvYmluZm87Ci0KLXR5cGVkZWYgc3RydWN0IE5PREVfUkVGQ09VTlQgewotICAgIHN0cnVjdCBOT0RFX1JFRkNPVU5UICpuZXh0OwkvKiAtPiBOZXh0IG5vZGUgaW4gaGFzaCBjaGFpbiAgICAgICAgICAgKi8KLSAgICBjaGFyICprZXk7CQkJLyogSGFzaCBrZXkgZm9yIHRoaXMgc3RydWN0dXJlICAgICAgICAgICovCi0gICAgaW50IHByb3h5X25vZGVpZDsJCS8qIFByb3h5IGFzc2lnbmVkIG5vZGUgaWQgZm9yIG5vZGUgICAgICAqLwotICAgIGludCBub2RlX251bWJlcjsJCS8qIFRoaXMgbm9kZSdzIG5vZGUgbnVtYmVyICAgICAgICAgICAgICAqLwotICAgIGludCB0YXNrX2NvdW50OwkJLyogTnVtYmVyIG9mIHRhc2tzIHJ1bm5pbmcgb24gbm9kZSAgICAgICovCi19IG5vZGVfcmVmY291bnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICppZDsJCQkvKiBBdHRyaWJ1dGUgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgKi8KLSAgICBpbnQgdHlwZTsJCQkvKiBDYXNlcyB3aGVyZSBhdHRyaWJ1dGUgaXMgYWxsb3dlZCAqLwotICAgIGNoYXIgKnNob3J0X25hbWU7CQkvKiBEZXNjcmlwdGlvbiB1c2VkIGFzIGxhYmVsIGluIEdVSSAgICAgKi8KLSAgICBjaGFyICpsb25nX25hbWU7CQkvKiBUZXh0IHVzZWQgZm9yIHRvb2x0aXAgdGV4dCBpbiBHVUkgICAgKi8KLSAgICBjaGFyICpkZWZhdWx0X3ZhbHVlOwkvKiBBdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgKi8KLX0gc3RyaW5nX2xhdW5jaF9hdHRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqaWQ7CQkJLyogQXR0cmlidXRlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICovCi0gICAgaW50IHR5cGU7CQkJLyogQ2FzZXMgd2hlcmUgYXR0cmlidXRlIGlzIGFsbG93ZWQgKi8KLSAgICBjaGFyICpzaG9ydF9uYW1lOwkJLyogRGVzY3JpcHRpb24gdXNlZCBhcyBsYWJlbCBpbiBHVUkgKi8KLSAgICBjaGFyICpsb25nX25hbWU7CQkvKiBUZXh0IHVzZWQgZm9yIHRvb2x0aXAgdGV4dCBpbiBHVUkgKi8KLSAgICBjaGFyICpkZWZhdWx0X3ZhbHVlOwkvKiBBdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgKi8KLSAgICBjaGFyICplbnVtczsJCS8qIEVudW1lcmF0aW9uIHZhbHVlcyAnLCcgZGVsaW1pdGVkICAgICAqLwotfSBlbnVtX2xhdW5jaF9hdHRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqaWQ7CQkJLyogQXR0cmlidXRlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICovCi0gICAgaW50IHR5cGU7CQkJLyogQ2FzZXMgd2hlcmUgYXR0cmlidXRlIGlzIGFsbG93ZWQgKi8KLSAgICBjaGFyICpzaG9ydF9uYW1lOwkJLyogRGVzY3JpcHRpb24gdXNlZCBhcyBsYWJlbCBpbiBHVUkgKi8KLSAgICBjaGFyICpsb25nX25hbWU7CQkvKiBUZXh0IHVzZWQgZm9yIHRvb2x0aXAgdGV4dCBpbiBHVUkgKi8KLSAgICBpbnQgZGVmYXVsdF92YWx1ZTsJCS8qIEF0dHJpYnV0ZSdzIGRlZmF1bHQgdmFsdWUgICAgICAgICAgICAqLwotICAgIGludCBsbGltaXQ7CQkJLyogQXR0cmlidXRlJ3MgbG93ZXIgbGltaXQgICAgICAgICAgICAgICovCi0gICAgaW50IHVsaW1pdDsJCQkvKiBBdHRyaWJ1dGUncyB1cHBlciBsaW1pdCAgICAgICAgICAgICAgKi8KLX0gaW50X2xhdW5jaF9hdHRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqaWQ7CQkJLyogQXR0cmlidXRlIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICovCi0gICAgaW50IHR5cGU7CQkJLyogQ2FzZXMgd2hlcmUgYXR0cmlidXRlIGlzIGFsbG93ZWQgKi8KLSAgICBjaGFyICpzaG9ydF9uYW1lOwkJLyogRGVzY3JpcHRpb24gdXNlZCBhcyBsYWJlbCBpbiBHVUkgKi8KLSAgICBjaGFyICpsb25nX25hbWU7CQkvKiBUZXh0IHVzZWQgZm9yIHRvb2x0aXAgdGV4dCBpbiBHVUkgKi8KLSAgICBsb25nIGxvbmcgZGVmYXVsdF92YWx1ZTsJLyogQXR0cmlidXRlJ3MgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICovCi0gICAgbG9uZyBsb25nIGxsaW1pdDsJCS8qIEF0dHJpYnV0ZSdzIGxvd2VyIGxpbWl0ICAgICAgICAgICAgICAqLwotICAgIGxvbmcgbG9uZyB1bGltaXQ7CQkvKiBBdHRyaWJ1dGUncyB1cHBlciBsaW1pdCAgICAgICAgICAgICAgKi8KLX0gbG9uZ19pbnRfbGF1bmNoX2F0dHI7Ci0KLXN0YXRpYyBSRVRTSUdUWVBFIHB0cF9zaWduYWxfaGFuZGxlcihpbnQgc2lnKTsKLXN0YXRpYyBpbnQgc2VydmVyKGNoYXIgKm5hbWUsIGNoYXIgKmhvc3QsIGludCBwb3J0KTsKLXN0YXRpYyBpbnQgUEVfc3RhcnRfZGFlbW9uKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pOwotc3RhdGljIGludCBQRV9kZWZpbmVfbW9kZWwoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgaW50IFBFX3N1Ym1pdF9qb2IoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgaW50IFBFX3Rlcm1pbmF0ZV9qb2IoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgaW50IFBFX3F1aXQoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgaW50IFBFX3N0YXJ0X2V2ZW50cyhpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKTsKLXN0YXRpYyBpbnQgUEVfaGFsdF9ldmVudHMoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSk7Ci1zdGF0aWMgaW50IHNodXRkb3duX3Byb3h5KHZvaWQpOwotc3RhdGljIHZvaWQgam9iX2VucXVldWUoam9iaW5mbyAqLCBwaWRfdCk7Ci1zdGF0aWMgdm9pZCBwb3N0X2Vycm9yKGludCB0cmFuc19pZCwgaW50IHR5cGUsIGNoYXIgKm1zZyk7Ci1zdGF0aWMgdm9pZCBwb3N0X3N1Ym1pdGpvYl9lcnJvcihpbnQgdHJhbnNfaWQsIGNoYXIgKnN1YmlkLCBjaGFyICptc2cpOwotc3RhdGljIGNoYXIgKipjcmVhdGVfZXhlY19wYXJtbGlzdChjaGFyICpleGVjbmFtZSwgY2hhciAqdGFyZ2V0bmFtZSwgY2hhciAqYXJncywgY2hhciAqaGVscGVyKTsKLXN0YXRpYyBjaGFyICoqY3JlYXRlX2NoaWxkX3NkbV9wYXJtbGlzdChjaGFyICpkZWJ1Z2dlcl9wYXRoLCBjaGFyICpkZWJ1Z2dlcl9uYW1lLCBpbnQgZGVidWdfYXJnc19jb3VudCwgY2hhciAqKmRlYnVnX2FyZ3MpOwotc3RhdGljIGNoYXIgKipjcmVhdGVfZGVidWdfcGFybWxpc3QoY2hhciAqZGVidWdnZXJfbmFtZSwgaW50IGRlYnVnX2FyZ3NfY291bnQsIGNoYXIgKipkZWJ1Z19hcmdzKTsKLXN0YXRpYyBjaGFyICoqY3JlYXRlX2Vudl9hcnJheShjaGFyICphcmdzW10sIGludCBzcGxpdF9pbywgY2hhciAqbXBfYnVmZmVyX21lbSwKLQkJCSAgICAgICBjaGFyICptcF9yZG1hX2NvdW50LCBjaGFyICpkZWJ1Z2dlcl9pZCwgaW50IGlzX2RlYnVnZ2VyKTsKLXN0YXRpYyB2b2lkIGFkZF9lbnZpcm9ubWVudF92YXJpYWJsZShjaGFyICplbnZfdmFyKTsKLXN0YXRpYyBpbnQgc2V0dXBfc3RkaW9fZmQoaW50IHJ1bl90cmFuc19pZCwgY2hhciAqc3ViaWQsIGludCBwaXBlX2Zkc1tdLCBjaGFyICpwYXRoLCBjaGFyICpzdGRpb19uYW1lLAotCQkJICBpbnQgKmZkLCBpbnQgKnJlZGlyZWN0KTsKLXN0YXRpYyBpbnQgc2V0dXBfY2hpbGRfc3RkaW8oaW50IHJ1bl90cmFuc19pZCwgY2hhciAqc3ViaWQsIGludCBzdGRpb19mZCwgaW50IHJlZGlyZWN0LAotCQkJICAgICBpbnQgKmZpbGVfZmQsIGludCBwaXBlX2ZkW10pOwotc3RhdGljIGludCBzdGRvdXRfaGFuZGxlcihpbnQgZmQsIHZvaWQgKmpvYik7Ci1zdGF0aWMgaW50IHN0ZGVycl9oYW5kbGVyKGludCBmZCwgdm9pZCAqam9iKTsKLXN0YXRpYyB2b2lkIGNoZWNrX2J1ZnNpemUoaW9pbmZvICogZmlsZV9pbmZvKTsKLXN0YXRpYyB2b2lkIHNlbmRfc3Rkb3V0KGpvYmluZm8gKiBqb2IsIGNoYXIgKmJ1Zik7Ci1zdGF0aWMgdm9pZCBzZW5kX3N0ZGVycihqb2JpbmZvICogam9iLCBjaGFyICpidWYpOwotc3RhdGljIGludCB3cml0ZV9vdXRwdXQoaW50IGZkLCBqb2JpbmZvICogam9iLCBpb2luZm8gKiBmaWxlX2luZm8pOwotc3RhdGljIHZvaWQgKnpvbWJpZV9yZWFwZXIodm9pZCAqYXJncyk7Ci1zdGF0aWMgdm9pZCB1cGRhdGVfbm9kZV9yZWZjb3VudHMoaW50IG51bXRhc2tzLCB0YXNraW5mbyAqIHRhc2tzKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV9ub2RlcmVmKGNoYXIgKmhvc3RuYW1lKTsKLXN0YXRpYyB2b2lkICpzdGFydHVwX21vbml0b3Iodm9pZCAqcGlkKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV90YXNrX2xpc3QoaW50IG51bXRhc2tzLCB0YXNraW5mbyAqIHRhc2tzKTsKLXN0YXRpYyB2b2lkICpraWxsX3Byb2Nlc3Modm9pZCAqcGlkKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9ub2RlcyhpbnQgdHJhbnNfaWQsIEZJTEUgKiBob3N0bGlzdCk7Ci1zdGF0aWMgdm9pZCBtYWxsb2NfY2hlY2sodm9pZCAqcCwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGludCBsaW5lKTsKLXN0YXRpYyBub2RlX3JlZmNvdW50ICphZGRfbm9kZShjaGFyICprZXkpOwotc3RhdGljIG5vZGVfcmVmY291bnQgKmZpbmRfbm9kZShjaGFyICprZXkpOwotc3RhdGljIHZvaWQgaGFzaF9jbGVhbnVwKHZvaWQgKmhhc2hfbGlzdCk7Ci1zdGF0aWMgdm9pZCBzZW5kX29rX2V2ZW50KGludCB0cmFuc19pZCk7Ci1zdGF0aWMgdm9pZCBkaXNjb3Zlcl9qb2JzKHZvaWQpOwotc3RhdGljIHZvaWQgYWRkX2Rpc2NvdmVyZWRfam9iKGNoYXIgKnBpZCk7Ci1zdGF0aWMgdm9pZCByZWRpcmVjdF9pbyh2b2lkKTsKLXN0YXRpYyBwcm94eV9tc2cgKnByb3h5X2F0dHJfZGVmX2VudW1fZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICppZCwgY2hhciAqbmFtZSwKLQkJCQkJICAgIGNoYXIgKmRlc2MsIGludCBkaXNwbGF5LCBjaGFyICpkZWYsIGludCBjb3VudCk7Ci1zdGF0aWMgcHJveHlfbXNnICpwcm94eV9hdHRyX2RlZl9pbnRfbGltaXRzX2V2ZW50KGludCB0cmFuc19pZCwgY2hhciAqaWQsCi0JCQkJCQkgIGNoYXIgKm5hbWUsIGNoYXIgKmRlc2MsIGludCBkaXNwbGF5LCBpbnQgZGVmLAotCQkJCQkJICBpbnQgbGxpbWl0LCBpbnQgdWxpbWl0KTsKLXN0YXRpYyBwcm94eV9tc2cgKnByb3h5X2F0dHJfZGVmX2xvbmdfaW50X2xpbWl0c19ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkLCBjaGFyICpuYW1lLAotCQkJCQkJICAgICAgIGNoYXIgKmRlc2MsIGludCBkaXNwbGF5LCBsb25nIGxvbmcgZGVmLAotCQkJCQkJICAgICAgIGxvbmcgbG9uZyBsbGltaXQsIGxvbmcgbG9uZyB1bGltaXQpOwotc3RhdGljIHZvaWQgc2VuZF9zdHJpbmdfYXR0cnMoaW50IHRyYW5zX2lkLCBpbnQgZmxhZ3MpOwotc3RhdGljIHZvaWQgc2VuZF9pbnRfYXR0cnMoaW50IHRyYW5zX2lkLCBpbnQgZmxhZ3MpOwotc3RhdGljIHZvaWQgc2VuZF9sb25nX2ludF9hdHRycyhpbnQgdHJhbnNfaWQsIGludCBmbGFncyk7Ci1zdGF0aWMgdm9pZCBzZW5kX2VudW1fYXR0cnMoaW50IHRyYW5zX2lkLCBpbnQgZmxhZ3MpOwotc3RhdGljIHZvaWQgc2VuZF9sb2NhbF9kZWZhdWx0X2F0dHJzKGludCB0cmFuc19pZCk7Ci1zdGF0aWMgdm9pZCBzZW5kX25ld19ub2RlX2xpc3QoaW50IHRyYW5zX2lkLCBpbnQgbWFjaGluZV9pZCwgTGlzdCAqIG5ld19ub2Rlcyk7Ci1zdGF0aWMgdm9pZCBzZW5kX2pvYl9zdGF0ZV9jaGFuZ2VfZXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgam9iaWQsIGNoYXIgKnN0YXRlKTsKLXN0YXRpYyB2b2lkIHNlbmRfcHJvY2Vzc19zdGF0ZV9jaGFuZ2VfZXZlbnQoaW50IHRyYW5zX2lkLCBqb2JpbmZvICogam9iLCBjaGFyICpzdGF0ZSk7Ci1zdGF0aWMgdm9pZCBzZW5kX3Byb2Nlc3Nfc3RhdGVfb3V0cHV0X2V2ZW50KGludCB0cmFuc19pZCwgaW50IHByb2NpZCwgY2hhciAqb3V0cHV0KTsKLXN0YXRpYyBpbnQgZ2VuZXJhdGVfaWQodm9pZCk7Ci1zdGF0aWMgdm9pZCBlbnF1ZXVlX2V2ZW50KHByb3h5X21zZyAqIGV2ZW50KTsKLXN0YXRpYyB2b2lkIHByaW50X21lc3NhZ2UoaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLXN0YXRpYyB2b2lkIHByaW50X21lc3NhZ2VfYXJncyhpbnQgYXJnYywgY2hhciAqb3B0aW9uYWxfYXJnc1tdKTsKLXN0YXRpYyBpbnQgZmluZF9sb2FkX2xldmVsZXJfbGlicmFyeSh2b2lkKTsKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pOwotI2lmZGVmIEhBVkVfTExBUElfSAotc3RhdGljIGludCBsb2FkX2xvYWRfbGV2ZWxlcl9saWJyYXJ5KGludCB0cmFuc19pZCk7Ci0jZW5kaWYKLQotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotc3RhdGljIGludCBldmVudHNfZW5hYmxlZCA9IDA7Ci1zdGF0aWMgaW50IHNodXRkb3duX3JlcXVlc3RlZDsKLXN0YXRpYyBpbnQgcHRwX3NpZ25hbF9leGl0Owotc3RhdGljIExpc3QgKmpvYnMgPSBOVUxMOwkJLyogSm9icyBydW4gYnkgdGhpcyBwcm94eSAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIEhhc2ggKm5vZGVzOwkJLyogTm9kZXMgY3VycmVudGx5IGluIHVzZSAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCBub2RlX2NvdW50ID0gMDsJCS8qIE51bWJlciBvZiBhY3RpdmUgbm9kZXMgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgZ2xvYmFsX25vZGVfaW5kZXggPSAwOwkvKiBTZXF1ZW50aWFsbHkgYXNzaWduZWQgbm9kZSBudW1iZXIgICAgICAgICovCi1zdGF0aWMgUkVUU0lHVFlQRSgqc2F2ZWRfc2lnbmFsc1tOU0lHXSkgKGludCk7Ci1zdGF0aWMgcHJveHlfc3ZyICpwZV9wcm94eSA9IE5VTEw7CS8qIEhhbmRsZSBmb3IgcHJveHkgbWVzc2FnZSBsaW5rICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgYmFzZV9pZDsJCS8qIEJhc2UgaWQgZm9yIHByb3h5IG9iamVjdHMgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgbGFzdF9pZCA9IDE7CQkvKiBMYXN0IGFzc2lnbmVkIG9iamVjdCBpZCAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50IHF1ZXVlX2lkOwkJLyogT2JqZWN0IGlkIGZvciBvdXIgcXVldWUgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCBtYWNoaW5lX2lkOwkJLyogT2JqZWN0IGlkIGZvciBvdXIgbWFjaGluZSAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCBzdGFydF9ldmVudHNfdHJhbnNpZDsJLyogc3RhcnRfZXZlbnRzIGNvbW1hbmQgaWQgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgcnVuX21pbmlwcm94eSA9IDA7CS8qIFJ1biBtaW5pcHJveHkgYXQgcHJveHkgc2h1dGRvd24gKi8KLXN0YXRpYyBjaGFyIGVtc2dfYnVmZmVyW19QT1NJWF9QQVRIX01BWCArIDUwXTsJLyogQnVmZmVyIGZvciBidWlsZGluZyBlcnJvciBtc2cgKi8KLXN0YXRpYyBpbnQgdXNlX2xvYWRfbGV2ZWxlciA9IDA7CS8qIFVzZSBMTCByZXNvdXJjZSBtYW5hZ21lbnQvdHJhY2tpbmcgICAgICAqLwotc3RhdGljIGNoYXIgKnVzZXJfbGlicGF0aDsJLyogQWx0ZXJuYXRlIGxpYmRpciBmb3IgTG9hZExldmVsZXIgICAgICAqLwotc3RhdGljIGludCBtdWx0aWNsdXN0ZXJfc3RhdHVzOwkvKiBMb2FkTGV2ZWxlciBtdWx0aWNsdXN0ZXIgc3RhdHVzICAgICAgICAgICovCi1zdGF0aWMgaW50IG1pbl9ub2RlX3NsZWVwX3NlY29uZHMgPSAzMDsJLyogTWluLiBMTCBub2RlIHN0YXR1cyBpbnRlcnZhbCAgICAgKi8KLXN0YXRpYyBpbnQgbWF4X25vZGVfc2xlZXBfc2Vjb25kcyA9IDMwMDsJLyogTWF4LiBMTCBub2RlIHN0YXR1cyBpbnRlcnZhbCAgICAqLwotc3RhdGljIGludCBqb2Jfc2xlZXBfc2Vjb25kcyA9IDMwOwkvKiBMTCBqb2Igc3RhdHVzIGludGVydmFsICAgICAgICAqLwotc3RhdGljIGNoYXIgaWJtbGxfbGlicGF0aF9uYW1lW19QT1NJWF9QQVRIX01BWF07CS8qIExvYWRMZXZlbGVyIGxpYiBwYXRoICovCi1zdGF0aWMgY2hhciBtaW5pcHJveHlfcGF0aFtfUE9TSVhfUEFUSF9NQVhdOwotCi0vKgotICogTGlzdCBmdW5jdGlvbnMgYXJlIHNhZmUgZm9yIGFkZGluZyBvciByZW1vdmluZyBsaXN0IGVsZW1lbnRzIHNpbmNlIHRoZXkKLSAqIGhhdmUgYXBwcm9wcmlhdGUgbG9ja3MgZm9yIHVwZGF0aW5nIHRoZSBsaXN0LiBIb3dldmVyLCBzaW5jZSB0aGUgbGlzdAotICogY3VycmVudCBsb2NhdGlvbiBwb2ludGVyIGlzIHBhcnQgb2YgdGhlIGxpc3Qgb2JqZWN0LCBhbnkgdGltZSB0aGUgbGlzdAotICogaXMgdHJhdmVyc2VkLCBzdGFydGluZyB3aXRoIGEgU2V0TGlzdCBjYWxsLCB0aGUgbGlzdCBtdXN0IGJlIGxvY2tlZAotICogc2luY2UgYSBTZXRMaXN0IGNhbGwgZm9yIHRoZSBzYW1lIGxpc3Qgb24gYSBkaWZmZXJlbnQgdGhyZWFkIGNhbgotICogaW52YWxpZGF0ZSB0aGUgbGlzdCBwb3NpdGlvbmluZyBmb3IgdGhlIGZpcnN0IHRocmVhZC4KLSAqLwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBqb2JfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IG5vZGVfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHByaW50X21lc3NhZ2VfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHJzOwkvKiBUaHJlYWQgY3JlYXRpb24gYXR0cmlidXRlcyAgICAgICAqLwotc3RhdGljIHB0aHJlYWRfdCB0ZXJtaW5hdGlvbl90aHJlYWQ7CS8qIFRocmVhZCB0byBtb25pdG9yIHByb2Nlc3MgZXhpdCAgICovCi1zdGF0aWMgaW50IHN0YXRlX3RyYWNlID0gMDsKLXN0YXRpYyBpbnQgc3RhdGVfdHJhY2VfZGV0YWlsID0gMDsKLXN0YXRpYyBpbnQgc3RhdGVfaW5mbyA9IDA7Ci1zdGF0aWMgaW50IHN0YXRlX3dhcm5pbmcgPSAwOwotc3RhdGljIGludCBzdGF0ZV9lcnJvciA9IDE7Ci1zdGF0aWMgaW50IHN0YXRlX2FyZ3MgPSAwOwotc3RhdGljIGludCBzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlID0gMTsKLXN0YXRpYyBpbnQgc3RhdGVfbWVzc2FnZV90aHJlYWRpZCA9IDE7Ci1zdGF0aWMgaW50IHN0YXRlX2V2ZW50c19hY3RpdmUgPSAwOwotc3RhdGljIHB0aHJlYWRfdCB0aHJlYWRfbWFwX3RhYmxlWzI1Nl07Ci1zdGF0aWMgY2hhciAqbXlfdXNlcm5hbWU7Ci1zdGF0aWMgaW50IG5leHRfZW52X2VudHJ5Owotc3RhdGljIGludCBlbnZfYXJyYXlfc2l6ZTsKLXN0YXRpYyBjaGFyICoqZW52X2FycmF5OwotCi0jaWZkZWYgX19saW51eF9fCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAgIHsicHJveHkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1AnfSwKLSAgICB7InBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgICB7Imhvc3QiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgICB7InVzZWxvYWRsZXZlbGVyIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdMJ30sCi0gICAgeyJ0cmFjZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICAgIHsibGliX292ZXJyaWRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gICAgeyJtdWx0aWNsdXN0ZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKLSAgICB7InRlbXBsYXRlX292ZXJyaWRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJ30sCi0gICAgeyJ0ZW1wbGF0ZV93cml0ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAncid9LAotICAgIHsibm9kZV9wb2xsaW5nX21pbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneCd9LAotICAgIHsibm9kZV9wb2xsaW5nX21heCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneSd9LAotICAgIHsiam9iX3BvbGxpbmciLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3onfSwKLSAgICB7InN1c3BlbmRfYXRfc3RhcnR1cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICAgIHsiZGVidWciLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0QnfSwKLSAgICB7InJ1bk1pbmlwcm94eSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAotICAgIHtOVUxMLCAwLCBOVUxMLCAwfQotfTsKLXN0YXRpYyBjaGFyICpsaWJwYXRoW10gPSB7IE5VTEwsICIvb3B0L2libWxsL0xvYWRML2Z1bGwvbGliLyIsCi0gICAgIi9vcHQvaWJtbGwvTG9hZEwvc28vbGliLyIsIChjaGFyICopIC0xCi19Owotc3RhdGljIGNoYXIgKmxpYm5hbWUgPSAibGlibGxhcGkuc28iOwotI2Vsc2UKLXN0YXRpYyBjaGFyICpsaWJwYXRoW10gPSB7Ci0gICAgTlVMTCwgIi91c3IvbHBwL0xvYWRML2Z1bGwvbGliIiwgIi91c3IvbHBwL0xvYWRML3NvL2xpYiIsICIvb3B0L2libWxsL0xvYWRML2Z1bGwvbGliLyIsCi0JIi9vcHQvaWJtbGwvTG9hZEwvc28vbGliLyIsIChjaGFyICopIC0xCi19Owotc3RhdGljIGNoYXIgKmxpYm5hbWUgPSAibGlibGxhcGkuYSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTExBUElfSAotCi0jZGVmaW5lIE1ZX1NUQVRFX1VOS05PV04gMAotI2RlZmluZSBNWV9TVEFURV9VUCAxCi0jZGVmaW5lIE1ZX1NUQVRFX0RPV04gMgotI2RlZmluZSBNWV9TVEFURV9TVE9QUEVEIDMKLSNkZWZpbmUgTVlfU1RBVEVfUlVOTklORyA0Ci0jZGVmaW5lIE1ZX1NUQVRFX0lETEUgNQotI2RlZmluZSBNWV9TVEFURV9URVJNSU5BVEVEIDYKLQotc3RydWN0IENsdXN0ZXJPYmplY3QgewkJLyogYSBMb2FkTGV2ZWxlciBjbHVzdGVyIChzYW1lIGFzIGEgcHRwIG1hY2hpbmUpICovCi0gICAgaW50IHByb3h5X2dlbmVyYXRlZF9jbHVzdGVyX2lkOwotICAgIGNoYXIgKmNsdXN0ZXJfbmFtZTsKLSAgICBIYXNoICpub2RlX2hhc2g7Ci0gICAgaW50IHByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZDsKLSAgICBpbnQgY2x1c3Rlcl9zdGF0ZTsKLSAgICBpbnQgcXVldWVfc3RhdGU7Ci0gICAgaW50IGNsdXN0ZXJfaXNfbG9jYWw7Ci0gICAgaW50IG5vZGVfY2xlYW51cF9yZXF1aXJlZDsKLSAgICBpbnQgam9iX2NsZWFudXBfcmVxdWlyZWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgQ2x1c3Rlck9iamVjdCBDbHVzdGVyT2JqZWN0OwotCi1zdHJ1Y3QgTm9kZU9iamVjdCB7CQkvKiBhIExvYWRMZXZlbGVyIG9yIHB0cCBub2RlIGluIGEgY2x1c3RlciAobWFjaGluZSkgKi8KLSAgICBpbnQgcHJveHlfZ2VuZXJhdGVkX25vZGVfaWQ7Ci0gICAgaW50IG5vZGVfZm91bmQ7CQkvKiBub2RlIGZvdW5kIGluZGljYXRvciAqLwotICAgIGludCBub2RlX3N0YXRlOwotICAgIGNoYXIgKm5vZGVfbmFtZTsJCS8qIHVzZSB0aGUgbmFtZSBhcyB0aGUga2V5IHRvIHRoZSBub2RlIGhhc2ggdGFibGUgaW4gdGhlIGNsdXN0ZXIgb2JqZWN0ICovCi19OwotdHlwZWRlZiBzdHJ1Y3QgTm9kZU9iamVjdCBOb2RlT2JqZWN0OwotCi1zdHJ1Y3QgSm9iT2JqZWN0IHsJCS8qIGEgTG9hZExldmVsZXIgb3IgcHRwIGpvYiBpbiBhIGNsdXN0ZXIgKi8KLSAgICBpbnQgcHJveHlfZ2VuZXJhdGVkX2pvYl9pZDsKLSAgICBjaGFyICpndWlfYXNzaWduZWRfam9iX2lkOwotICAgIGludCBqb2JfZm91bmQ7CQkvKiBqb2IgZm91bmQgaW5kaWNhdG9yICovCi0gICAgaW50IGpvYl9zdGF0ZTsJCS8qIDE9c3VibWl0dGVkLCAyPWluIHF1ZXVlICovCi0gICAgdGltZV90IGpvYl9zdWJtaXRfdGltZTsJLyogdGltZSB3aGVuIHN1Ym1pdHRlZCAqLwotICAgIExpc3QgKnRhc2tfbGlzdDsJCS8qIHByb2Nlc3NlcyBydW5uaW5nIGZvciB0aGlzIGpvYiAqLwotICAgIExMX1NURVBfSUQgbGxfc3RlcF9pZDsKLSAgICBjaGFyICpjbHVzdGVyX25hbWU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgSm9iT2JqZWN0IEpvYk9iamVjdDsKLXN0cnVjdCBUYXNrT2JqZWN0IHsJCS8qIGEgTG9hZExldmVsZXIgb3IgcHRwIHRhc2sgZm9yIGpvYiAqLwotICAgIGludCBwcm94eV9nZW5lcmF0ZWRfdGFza19pZDsKLSAgICBpbnQgdGFza19mb3VuZDsJCS8qIGpvYiBmb3VuZCBpbmRpY2F0b3IgKi8KLSAgICBpbnQgbGxfdGFza19pZDsKLSAgICBpbnQgdGFza19zdGF0ZTsKLSAgICBjaGFyICpub2RlX25hbWU7Ci0gICAgY2hhciAqbm9kZV9hZGRyZXNzOwotfTsKLXR5cGVkZWYgc3RydWN0IFRhc2tPYmplY3QgVGFza09iamVjdDsKLQotc3RhdGljIHZvaWQgKmlibWxsX2xpYnBhdGhfaGFuZGxlID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgewotICAgIExMX2VsZW1lbnQgKigqbGxfcXVlcnkpIChlbnVtIFF1ZXJ5VHlwZSk7Ci0gICAgaW50ICgqbGxfc2V0X3JlcXVlc3QpIChMTF9lbGVtZW50ICosIGVudW0gUXVlcnlGbGFncywgY2hhciAqKiwgZW51bSBEYXRhRmlsdGVyKTsKLSAgICBMTF9lbGVtZW50ICooKmxsX2dldF9vYmpzKSAoTExfZWxlbWVudCAqLCBlbnVtIExMX0RhZW1vbiwgY2hhciAqLCBpbnQgKiwgaW50ICopOwotICAgIGludCAoKmxsX2dldF9kYXRhKSAoTExfZWxlbWVudCAqLCBlbnVtIExMQVBJX1NwZWNpZmljYXRpb24sIHZvaWQgKik7Ci0gICAgaW50ICgqbGxfZGVhbGxvY2F0ZSkgKExMX2VsZW1lbnQgKik7Ci0gICAgTExfZWxlbWVudCAqKCpsbF9uZXh0X29iaikgKExMX2VsZW1lbnQgKik7Ci0gICAgaW50ICgqbGxfZnJlZV9vYmpzKSAoTExfZWxlbWVudCAqKTsKLSAgICBpbnQgKCpsbF9jbHVzdGVyKSAoaW50LCBMTF9lbGVtZW50ICoqLCBMTF9jbHVzdGVyX3BhcmFtICopOwotICAgIGludCAoKmxsX3N1Ym1pdF9qb2IpIChjaGFyICpqb2JfY21kX2ZpbGUsIGNoYXIgKm1vbml0b3JfcHJvZ3JhbSwgY2hhciAqbW9uaXRvcl9hcmcsCi0JCQkgIExMX2pvYiAqIGpvYl9pbmZvLCBpbnQgam9iX3ZlcnNpb24pOwotICAgIGludCAoKmxsX3Rlcm1pbmF0ZV9qb2IpIChMTF90ZXJtaW5hdGVfam9iX2luZm8gKiBwdHIpOwotICAgIHZvaWQgKCpsbF9mcmVlX2pvYl9pbmZvKSAoTExfam9iICogam9iX2luZm8sIGludCBqb2JfdmVyc2lvbik7Ci0gICAgY2hhciAqKCpsbF9lcnJvcikgKExMX2VsZW1lbnQgKiogZXJyT2JqLCBpbnQgcHJpbnRfdG8pOwotfSBMTF9TWU1TOwotCi1zdGF0aWMgaW50IHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9IDA7CS8qIHNodXRkb3duIG5vdCBpbiBwcm9ncmVzcyAqLwotVGFza09iamVjdCAqdGFza19vYmplY3QgPSBOVUxMOwotc3RhdGljIHB0aHJlYWRfdCBtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkID0gMDsKLXN0YXRpYyBwdGhyZWFkX2F0dHJfdCBtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkX2F0dHI7Ci1zdGF0aWMgcHRocmVhZF90IG1vbml0b3JfTG9hZExldmVsZXJfbm9kZXNfdGhyZWFkID0gMDsKLXN0YXRpYyBwdGhyZWFkX2F0dHJfdCBtb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzX3RocmVhZF9hdHRyOwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBtYXN0ZXJfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLXN0YXRpYyBMaXN0ICpjbHVzdGVyX2xpc3QgPSBOVUxMOwkvKiBsaXN0IG9mIGNsdXN0ZXJzIGlmIG11bHRpY2x1c3RlciAod2UnbGwgc2V0IHRvIHNpbmdsZSBsb2NhbCBpZiBub25lKSAqLwotc3RhdGljIExpc3QgKmpvYl9saXN0ID0gTlVMTDsJLyogam9iIGxpc3QgZm9yIGFsbCBjbHVzdGVycyAoc2luY2Ugam9icyBjYW4gbW92ZSkgKi8KLXN0YXRpYyBwdGhyZWFkX211dGV4X3Qgam9iX25vdGlmeV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLXN0YXRpYyBwdGhyZWFkX2NvbmRfdCBqb2Jfbm90aWZ5X2NvbmR2YXIgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7Ci1zdGF0aWMgY2hhciBpYm1sbF9wcm94eV9iYXNlX2lkX3N0cmluZ1syNTZdOwotc3RhdGljIENsdXN0ZXJPYmplY3QgKm15X2NsdXN0ZXI7Ci0KLXN0YXRpYyB2b2lkICptb25pdG9yX0xvYWRMZXZlbGVyX2pvYnModm9pZCAqYXJncyk7Ci1zdGF0aWMgdm9pZCAqbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2Rlcyh2b2lkICphcmdzKTsKLXN0YXRpYyBpbnQgZ2V0X211bHRpY2x1c3Rlcl9zdGF0dXMoKTsKLXN0YXRpYyBpbnQgbXlfbGxfZ2V0X2RhdGEoTExfZWxlbWVudCAqIHJlcXVlc3QsIGVudW0gTExBUElfU3BlY2lmaWNhdGlvbiBzcGVjLCB2b2lkICpyZXN1bHQpOwotc3RhdGljIGludCBteV9sbF9jbHVzdGVyKGludCB2ZXJzaW9uLCBMTF9lbGVtZW50ICoqIGVyck9iaiwgTExfY2x1c3Rlcl9wYXJhbSAqIGNwKTsKLXN0YXRpYyBpbnQgbXlfbGxfZGVhbGxvY2F0ZShMTF9lbGVtZW50ICogcXVlcnlfZWxlbSk7Ci1zdGF0aWMgTExfZWxlbWVudCAqbXlfbGxfcXVlcnkoZW51bSBRdWVyeVR5cGUgdHlwZSk7Ci1zdGF0aWMgaW50IG15X2xsX2ZyZWVfb2JqcyhMTF9lbGVtZW50ICogcXVlcnlfZWxlbSk7Ci1zdGF0aWMgTExfZWxlbWVudCAqbXlfbGxfbmV4dF9vYmooTExfZWxlbWVudCAqIHF1ZXJ5X2VsZW0pOwotc3RhdGljIExMX2VsZW1lbnQgKm15X2xsX2dldF9vYmpzKExMX2VsZW1lbnQgKiBxdWVyeV9lbGVtLCBlbnVtIExMX0RhZW1vbiBkYWVtb24sIGNoYXIgKmlnbm9yZSwKLQkJCQkgIGludCAqdmFsdWUsIGludCAqcmMpOwotc3RhdGljIGludCBteV9sbF9zZXRfcmVxdWVzdChMTF9lbGVtZW50ICogcXVlcnlfZWxlbSwgZW51bSBRdWVyeUZsYWdzIHFmbGFncywgY2hhciAqKmlnbm9yZSwKLQkJCSAgICAgZW51bSBEYXRhRmlsdGVyIGRmaWx0ZXIpOwotc3RhdGljIGludCBzZW5kTm9kZUFkZEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsCi0JCQkgICAgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KTsKLXN0YXRpYyBpbnQgc2VuZE5vZGVDaGFuZ2VFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0LAotCQkJICAgICAgIE5vZGVPYmplY3QgKiBub2RlX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRKb2JBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0LAotCQkJICAgSm9iT2JqZWN0ICogam9iX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRKb2JDaGFuZ2VFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRKb2JSZW1vdmVFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRUYXNrQWRkRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCwKLQkJCSAgICBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0LCBUYXNrT2JqZWN0ICogdGFza19vYmplY3QpOwotc3RhdGljIGludCBzZW5kVGFza0NoYW5nZUV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0LAotCQkJICAgICAgIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRUYXNrUmVtb3ZlRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QsCi0JCQkgICAgICAgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KTsKLXN0YXRpYyBpbnQgc2VuZFF1ZXVlQWRkRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCk7Ci1zdGF0aWMgaW50IHNlbmRNYWNoaW5lQWRkRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCk7Ci1zdGF0aWMgdm9pZCBhZGRfam9iX3RvX2xpc3QoTGlzdCAqIGpvYl9saXN0LCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KTsKLXN0YXRpYyB2b2lkIGFkZF90YXNrX3RvX2xpc3QoTGlzdCAqIHRhc2tfbGlzdCwgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KTsKLXN0YXRpYyB2b2lkIGFkZF9ub2RlX3RvX2hhc2goSGFzaCAqIG5vZGVfaGFzaCwgTm9kZU9iamVjdCAqIG5vZGVfb2JqZWN0KTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV90YXNrX2Zyb21fbGlzdChMaXN0ICogdGFza19saXN0LCBUYXNrT2JqZWN0ICogdGFza19vYmplY3QpOwotc3RhdGljIEpvYk9iamVjdCAqZ2V0X2pvYl9pbl9saXN0KExpc3QgKiBqb2JfbGlzdCwgTExfU1RFUF9JRCBsbF9zdGVwX2lkKTsKLXN0YXRpYyBOb2RlT2JqZWN0ICpnZXRfbm9kZV9pbl9oYXNoKEhhc2ggKiBub2RlX2hhc2gsIGNoYXIgKm5vZGVfbmFtZSk7Ci1zdGF0aWMgVGFza09iamVjdCAqZ2V0X3Rhc2tfaW5fbGlzdChMaXN0ICogdGFza19saXN0LCBjaGFyICp0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSwKLQkJCQkgICAgaW50IGxsX3Rhc2tfaWQpOwotc3RhdGljIHZvaWQgcmVmcmVzaF9jbHVzdGVyX2xpc3QoKTsKLSNlbmRpZgotCi1zdGF0aWMgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcyBoZWxwZXJfZnVuY3MgPSB7IE5VTEwsIE5VTEwgfTsKLQotLyoKLSAqIFByb3h5IGluZnJhc3RydWN0dXJlIGV4cGVjdHMgY29tbWFuZHMgaW4gZXhhY3RseSB0aGlzIHNlcXVlbmNlLgotICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBvciBkZWxldGluZyBjb21tYW5kcwotICovCi1zdGF0aWMgcHJveHlfY21kIGNtZHNbXSA9IHsKLQkJUEVfcXVpdCwKLQkJUEVfc3RhcnRfZGFlbW9uLAotCQlQRV9kZWZpbmVfbW9kZWwsCi0JCVBFX3N0YXJ0X2V2ZW50cywKLQkJUEVfaGFsdF9ldmVudHMsCi0JCVBFX3N1Ym1pdF9qb2IsCi0JCVBFX3Rlcm1pbmF0ZV9qb2IKLX07Ci1zdGF0aWMgcHJveHlfY29tbWFuZHMgY29tbWFuZF90YWIgPSB7IDAsIHNpemVvZiBjbWRzIC8gc2l6ZW9mKHByb3h5X2NtZCksIGNtZHMgfTsKLQotc3RhdGljIGNoYXIgKm1wX2luZm9sZXZlbF9sYWJlbHNbXSA9IHsiRXJyb3IiLCAiV2FybmluZyIsICJJbmZvcm1hdGlvbmFsIiwKLSAgICAiRGlhZ25vc3RpYyIsICJEaWFnbm9zdGljIGxldmVsIDQiLCAiRGlhZ25vc3RpYyBsZXZlbCA1IiwKLSAgICAiRGlhZ25vc3RpYyBsZXZlbCA2IgotfTsKLQotLyoKLSAqIFRoaXMgdGFibGUgZGVmaW5lcyB0aGUgbGF1bmNoIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byBQRSBlbnZpcm9ubWVudAotICogdmFyaWFibGVzIGZvciB0aGUgc3RhbmQtYWxvbmUgUEUgY2FzZSBmb3IgTGludXguCi0gKi8KLXN0YXRpYyBzdHJpbmdfbGF1bmNoX2F0dHIgc3RyaW5nX2xhdW5jaF9hdHRyc1tdID0gewotICAgIC8qCi0gICAgICogQXR0cmlidXRlcyBuZWVkZWQgaW4gYm90aCBiYXNpYyBhbmQgYWR2YW5jZWQgbW9kZQotICAgICAqLwotICAgIHsiUEVfU1RESU5fUEFUSCIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJTdGRpbiBQYXRoIiwgIlNwZWNpZnkgcGF0aCBmb3Igc3RkaW4gaW5wdXQgZmlsZSIsICIifSwKLSAgICB7IlBFX1NURE9VVF9QQVRIIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIlN0ZG91dCBQYXRoIiwKLSAgICAgIlNwZWNpZnkgcGF0aCBmb3Igc3Rkb3V0IG91dHB1dCBmaWxlIiwgIiJ9LAotICAgIHsiUEVfU1RERVJSX1BBVEgiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiU3RkZXJyIFBhdGgiLAotICAgICAgIlNwZWNpZnkgcGF0aCBmb3Igc3RkZXJyIG91dHB1dCBmaWxlIiwgIiJ9LAotICAgIC8qCi0gICAgICogSS9PIFJlbGF0ZWQgYXR0cmlidXRlcwotICAgICAqLwotICAgIHsiTVBfSU9OT0RFRklMRSIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJNUEkgSS9PIE5vZGUgTGlzdCIsCi0gICAgICJTcGVjaWZ5IGZpbGUgbGlzdGluZyBub2RlcyBwZXJmb3JtaW5nIHBhcmFsbGVsIEkvTyAoTVBfSU9OT0RFRklMRSkiLAotICAgICAiIn0sCi0gICAgLyoKLSAgICAgKiBEaWFnbm9zdGljIHJlbGF0ZWQgYXR0cmlidXRlcwotICAgICAqLwotICAgIHsiTVBfUE1ETE9HX0RJUiIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJQTUQgTG9nIERpcmVjdG9yeSIsCi0gICAgICJTcGVjaWZ5IGRpcmVjdG9yeSB3aGVyZSBQTUQgbG9nIGlzIGdlbmVyYXRlZCAoTVBfUE1ETE9HX0RJUikiLCAiIn0sCi0gICAgeyJNUF9QUklPUklUWV9MT0dfRElSIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfQUxMX1BST1hZLCAiUHJpb3JpdHkgTG9nIERpcmVjdG9yeSIsCi0gICAgICJTcGVjaWZ5IGRpcmVjdG9yeSBjb250YWluaW5nIGNvLXNjaGVkdWxlciBsb2cgKE1QX1BSSU9SSVRZX0xPR19ESVIpIiwgIi90bXAifSwKLSAgICB7Ik1QX1BSSU9SSVRZX0xPR19OQU1FIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfQUxMX1BST1hZLCAiUHJpb3JpdHkgTG9nIE5hbWUiLAotICAgICAiU3BlY2lmeSBuYW1lIG9mIGNvLXNjaGVkdWxlciBsb2cgKE1QX1BSSU9SSVRZX0xPR19OQU1FKSIsICJwbWFkanByaS5sb2cifSwKLSAgICAvKgotICAgICAqIERlYnVnIHJlbGF0ZWQgYXR0cmlidXRlcwotICAgICAqLwotICAgIHsiTVBfQ09SRURJUiIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJDb3JlZmlsZSBEaXJlY3RvcnkiLAotICAgICAiU3BlY2lmeSBkaXJlY3RvcnkgZm9yIGFwcGxpY2F0aW9uJ3MgY29yZSBmaWxlcyAoTVBfQ09SRURJUikiLCAiIn0sCi0gICAgeyJNUF9ERUJVR19JTklUSUFMX1NUT1AiLCBBVFRSX0ZPUl9BSVggfCBBVFRSX0ZPUl9BTExfUFJPWFksICJJbml0aWFsIEJyZWFrcG9pbnQiLAotICAgICAiSW5pdGlhbCBicmVha3BvaW50IHdoZW4gZGVidWdnaW5nIGFuIGFwcGxpY2F0aW9uIChNUF9ERUJVR19JTklUSUFMX1NUT1ApIiwgIiJ9LAotICAgIHsiTVBfUFJPRkRJUiIsIEFUVFJfRk9SX0xJTlVYIHwgQVRUUl9GT1JfQUxMX1BST1hZLCAiR01PTiBEaXJlY3RvcnkiLAotICAgICAiRGlyZWN0b3J5IGNvbnRhaW5pbmcgR01PTiBwcm9maWxpbmcgZGF0YSBmaWxlcyAoR01PTl9QUk9GRElSKSIsICIifSwKLSAgICAvKgotICAgICAqIFN5c3RlbSByZXNvdXJjZSByZWxhdGVkICBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgeyJNUF9QUklPUklUWSIsIEFUVFJfRk9SX0FJWCB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkRpc3BhdGNoIFByaW9yaXR5IENsYXNzIiwKLSAgICAgIlNwZWNpZnkgcHJpb3JpdHkgY2xhc3Mgb3IgaGlnaC9sb3cgcHJpb3JpdHkgdmFsdWVzIChNUF9QUklPUklUWSkiLCAiIn0sCi0gICAgLyoKLSAgICAgKiBOb2RlIGFsbG9jYXRpb24gcmVsYXRlZCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgeyJNUF9DTURGSUxFIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkNvbW1hbmQgRmlsZSIsCi0gICAgICJTcGVjaWZ5IHNjcmlwdCB0byBsb2FkIG5vZGVzIGluIHBhcnRpdGlvbiAoTVBfQ01ERklMRSkiLCAiIn0sCi0gICAgeyJNUF9IT1NURklMRSIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkhvc3QgTGlzdCBGaWxlIiwKLSAgICAgIlNwZWNpZnkgbmFtZSBvZiBob3N0IGxpc3QgZmlsZSBmb3Igbm9kZSBhbGxvY2F0aW9uIChNUF9IT1NURklMRSkiLCAiIn0sCi0gICAgeyJNUF9SRU1PVEVESVIiLCBBVFRSX0ZPUl9BSVggfCBBVFRSX0ZPUl9BTExfUFJPWFksCi0gICAgICJTcGVjaWZ5IG5hbWUgb2Ygc2NyaXB0IGVjaG9pbmcgY3VycmVudCBkaXJlY3RvcnkgKE1QX1JFTU9URURJUikiLCAiIn0sCi0gICAgeyJNUF9MTEZJTEUiLCBBVFRSX0ZPUl9BTExfT1MgfCBBVFRSX0ZPUl9QRV9XSVRIX0xMLCAiSm9iIENvbW1hbmQgRmlsZSIsCi0gICAgICJTcGVjaWZ5IHBhdGggb2YgYSBMb2FkTGV2ZWxlciBqb2IgY29tbWFuZCBmaWxlIHVzZWQgZm9yIG5vZGUgYWxsb2NhdGlvbiAoTVBfTExGSUxFKSIsICIifSwKLSAgICB7Ik1QX1JNUE9PTCIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX1BFX1dJVEhfTEwsICJSZXNvdXJjZSBQb29sIiwKLSAgICAgIk5hbWUgb3IgbnVtYmVyIG9mIHJlc291cmNlIHBvb2wgdG8gdXNlIGZvciBub2RlIGFsbG9jYXRpb24gKE1QX1JNUE9PTCkiLCAiIn0sCi0gICAgLyoKLSAgICAgKiBQZXJmb3JtYW5jZSByZWxhdGVkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICAvKgotICAgICAqIE1pc2NlbGxhbmVvdXMgYXR0cmlidXRlcwotICAgICAqLwotICAgIHsiTVBfRVVJTElCUEFUSCIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJMaWJyYXJ5IFBhdGgiLAotICAgICAiU3BlY2lmeSBwYXRoIHRvIG1lc3NhZ2UgcGFzc2luZyBhbmQgY29tbXVuaWNhdGlvbnMgbGlicmFyaWVzIChNUF9FVUlMSUJQQVRIKSIsICIifSwKLSAgICB7Ik1QX0NLUFRGSUxFIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfQUxMX1BST1hZLCAiQ2hlY2twb2ludCBGaWxlIE5hbWUiLAotICAgICAiQmFzZSBuYW1lIG9mIHRoZSBjaGNla3BvaW50IGZpbGUgKE1QX0NLUFRGSUxFKSIsICIifSwKLSAgICB7Ik1QX0NLUFRESVIiLCBBVFRSX0ZPUl9BSVggfCBBVFRSX0ZPUl9BTExfUFJPWFksICJDaGVja3BvaW50IERpcmVjdG9yeSIsCi0gICAgICJEaXJlY3Rvcnkgd2hlcmUgdGhlIGNoZWNrcG9pbnQgZmlsZSB3aWxsIHJlc2lkZSAoTVBfQ0hQVERJUikiLCAiIn0sCi0KLSAgICAvKgotICAgICAqIEFsdGVybmF0ZSByZXNvdXJjZSBtYW5hZ2VyIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICB7Ik1QX1JNTElCIiwgQVRUUl9GT1JfQUxMX09TIHwgQVRUUl9GT1JfUEVfU1RBTkRBTE9ORSwgIlJlc291cmNlIE1hbmFnZXIgTGlicmFyeSIsCi0gICAgICJTcGVjaWZ5IGFsdGVybmF0ZSByZXNvdXJjZSBtYW5hZ2VyIGxpYnJhcnkiLCAiIn0sIC8qCi0gICAgICogT3RoZXIgYXR0cmlidXRlcwotICAgICAqLwotICAgIHsiUEVfRU5WX1NDUklQVCIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJFbnZpcm9ubWVudCBTZXR1cCBTY3JpcHQiLAotICAgICAiU3BlY2lmeSBpZiB1c2luZyBiYXNpYyBvciBhZHZhbmNlZCBtb2RlIiwgIiJ9LAotICAgIHsiUEVfQURWQU5DRURfTU9ERSIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJBZHZhbmNlZCBNb2RlIiwKLSAgICAgIlNwZWNpZnkgbmFtZSBvZiBQRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXR1cCBzY3JpcHQiLCAibm8ifSwKLSAgICB7Ik1QX1NBVkVfTExGSUxFIiwgQVRUUl9GT1JfQUxMX09TIHwgQVRUUl9GT1JfUEVfV0lUSF9MTCwgIlNhdmUgSm9iIENvbW1hbmQgRmlsZSIsCi0gICAgICJTcGVjaWZ5IHBhdGggb2YgZ2VuZXJhdGVkIExvYWRMZXZlbGVyIGpvYiBjb21tYW5kIGZpbGUgKE1QX1NBVkVfTExGSUxFKSIsICIifSwKLSAgICB7Ik1QX1NBVkVIT1NURklMRSIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX1BFX1dJVEhfTEwsICJTYXZlIEhvc3RsaXN0IEZpbGUiLAotICAgICAiU3BlY2lmeSBwYXRoIG9mIGdlbmVyYXRlZCBob3N0IGxpc3QgZmlsZSAoTVBfU0FWRUhPU1RGSUxFKSIsICIifQotfTsKLQotc3RhdGljIGVudW1fbGF1bmNoX2F0dHIgZW51bV9hdHRyc1tdID0gewotICAgIC8qCi0gICAgICogSS9PIHRhYiByZWxhdGVkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICB7Ik1QX0RFVlRZUEUiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiRGV2aWNlIFR5cGUgQ2xhc3MiLAotICAgICAiU3BlY2lmeSB0aGF0IEluZmluaWJhbmQgaW50ZXJjb25uZWN0IGlzIHRvIGJlIHVzZWQgKE1QX0RFVlRZUEUpIiwgIiIsICJ8aWIifSwKLSAgICB7Ik1QX0xBQkVMSU8iLCBBVFRSX0FMV0FZU19BTExPV0VELCAiTGFiZWwgSS9PIiwKLSAgICAgIlNwZWNpZnkgaWYgYXBwbGljYXRpb24gb3V0cHV0IGlzIGxhYmVsZWQgYnkgdGFzayBpZCAoTVBfTEFCRUxJTykiLCAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9JT19FUlJMT0ciLCBBVFRSX0FMV0FZU19BTExPV0VELCAiQ3JlYXRlIEkvTyBFcnJvciBMb2ciLAotICAgICAiU3BlY2lmeSBpZiBJL08gZXJyb3IgbG9nZ2luZyBpcyBlbmFibGVkIChNUF9JT19FUlJMT0cpIiwgIm5vIiwgInllc3xubyJ9LAotICAgIHsiUEVfU1BMSVRfU1RET1VUIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIlNwbGl0IFNURE9VVCBieSBUYXNrIiwKLSAgICAgIlNwZWNpZnkgaWYgc3RkaW8gb3V0cHV0IGlzIHNwbGl0IGJ5IHRhc2siLCAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9TVERJTk1PREUiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiU1RESU4gTW9kZSIsCi0gICAgICJTcGVjaWZ5IGhvdyBhcHBsaWNhdGlvbidzIHN0ZGluIGlzIG1hbmFnZWQgKE1QX1NURElOTU9ERSkiLCAiYWxsIiwgImFsbHxub25lIn0sCi0gICAgeyJNUF9TVERPVVRNT0RFIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIlNURE9VVCBNb2RlIiwKLSAgICAgIlNwZWNpZnkgaG93IGFwcGxpY2F0aW9uJ3Mgc3RkaW8gb3V0cHV0IGlzIGhhbmRsZWQgKE1QX1NURE9VVE1PREUpIiwKLSAgICAgInVub3JkZXJlZCIsICJvcmRlcmVkfHVub3JkZXJlZCJ9LAotICAgIC8qCi0gICAgICogRGlhZ25vc3RpYyB0YWIgcmVsYXRlZCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgeyJNUF9QTURMT0ciLCBBVFRSX0FMV0FZU19BTExPV0VELCAiQ3JlYXRlIFBNRCBMb2ciLAotICAgICAiU3BlY2lmeSBpZiBQRSBkaWFnbm9zdGljIG1lc3NhZ2VzIGFyZSBsb2dnZWQiLCAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9QUklOVEVOViIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJQcmludCBFbnZpcm9ubWVudCIsCi0gICAgICJTcGVjaWZ5IGlmIFBFIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcHJpbnRlZCAoTVBfUFJJTlRFTlYpIiwgIm5vIiwgInllc3xubyJ9LAotICAgIHsiTVBfUFJJT1JJVFlfTE9HIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfQUxMX1BST1hZLCAiTG9nIENvLXNjaGVkdWxlciBNZXNzYWdlcyIsCi0gICAgICJTcGVjaWZ5IGlmIG1lc3NhZ2VzIGFyZSBsb2dnZWQgdG8gY28tc2NoZWR1bGVyIGxvZyAoTVBfUFJJT1JJVFlfTE9HKSIsICJ5ZXMiLCAieWVzfG5vIn0sCi0gICAgeyJNUF9JTkZPTEVWRUwiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiTWVzc2FnZSBMZXZlbCIsCi0gICAgICJTcGVjaWZ5IGxldmVsIG9mIFBFIG1lc3NhZ2UgcmVwb3J0aW5nIChNUF9JTkZPTEVWRUwpIiwgIldhcm5pbmciLAotICAgICAiRXJyb3J8V2FybmluZ3xJbmZvcm1hdGlvbmFsfERpYWdub3N0aWN8RGlhZ25vc3RpYyBsZXZlbCA0fERpYWdub3N0aWMgbGV2ZWwgNXxEaWFnbm9zdGljIGxldmVsIDYifSwKLSAgICB7Ik1QX0xBUElfVFJBQ0VfTEVWRUwiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiTEFQSSBUcmFjZSBMZXZlbCIsCi0gICAgICJTcGVjaWZ5IGxldmVsIG9mIExBUEkgdHJhY2UgKE1QX0xBUElfVFJBQ0VfTEVWRUwpIiwgIjAiLCAiMHwxfDJ8M3w0fDUifSwKLSAgICB7Ik1QX1NUQVRJU1RJQ1MiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiTVBJIFN0YXRpc3RpY3MiLAotICAgICAiT2J0YWluIGNvbW11bmljYXRpb24gc3RhdGlzdGljcyBmb3IgdXNlciBzcGFjZSBqb2JzIChNUF9TVEFUSVNUSUNTKSIsICJubyIsICJ5ZXN8bm98cHJpbnQifSwKLQotICAgIC8qCi0gICAgICogRGVidWcgdGFiIHJlbGF0ZWQgYXR0cmlidXRlcwotICAgICAqLwotICAgIHsiTVBfREVCVUdfTk9USU1FT1VUIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIlN1cHByZXNzIFRpbWVvdXQiLAotICAgICAiU3BlY2lmeSBpZiBkZWJ1Z2dlciBjYW4gYXR0YWNoIHdpdGhvdXQgY2F1c2luZyBhcHBsaWNhdGlvbiB0aW1lb3V0IChNUF9ERUJVR19OT1RJTUVPVVQpIiwKLSAgICAgIm5vIiwgInllc3xubyJ9LAotICAgIHsiTVBfQ09SRUZJTEVfU0lHVEVSTSIsIEFUVFJfRk9SX0FJWCB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkNvcmVmaWxlIG9uIFNJR1RFUk0iLAotICAgICAiU3BlY2lmeSBpZiBjb3JlZmlsZSBnZW5lcmF0ZWQgb24gU0lHVEVSTSAoTVBfQ09SRUZJTEVfU0lHVEVSTSkiLCAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9FVUlERVZFTE9QIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIk1QSSBQYXJhbWV0ZXIgQ2hlY2tpbmciLAotICAgICAiU3BlY2lmeSBsZXZlbCBvZiBNUEkgcGFyYW1ldGVyIGNoZWNraW5nIChNUF9FVUlERVZFTE9QKSIsICJubyIsICJ5ZXN8bm98ZGVidWd8bWluaW11bSJ9LAotICAgIHsiTVBfQ09SRUZJTEVfRk9STUFUIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfQUxMX1BST1hZLAotICAgICAiU3BlY2lmeSBjb3JlIGZpbGUgZm9ybWF0IG9yIG5hbWUgb2YgbGlnaHR3ZWlnaHQgY29yZSBmaWxlIChNUF9DT1JFRklMRV9GT1JNQVQpIiwKLSAgICAgInN0YW5kYXJkIiwgInN0YW5kYXJkfFNUREVSUiJ9LAotICAgIC8qCi0gICAgICogU3lzdGVtIHRhYiByZWxhdGVkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICB7Ik1QX0FEQVBURVJfVVNFIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkV4Y2x1c2l2ZSBBZGFwdGVyIFVzZSIsCi0gICAgICJTcGVjaWZ5IGhvdyBub2RlJ3MgYWRhcHRlciBzaG91bGQgYmUgdXNlZCAoTVBfQURBUFRFUl9VU0UpIiwgInNoYXJlZCIsICJkZWRpY2F0ZWR8c2hhcmVkIn0sCi0gICAgeyJNUF9DUFVfVVNFIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkV4Y2x1c2l2ZSBDUFUgVXNlIiwKLSAgICAgIlNwZWNpZnkgaG93IG5vZGUncyBDUFUgc2hvdWxkIGJlIHVzZWQgKE1QX0NQVV9VU0UpIiwgIm11bHRpcGxlIiwgIm11bHRpcGxlfHVuaXF1ZSJ9LAotICAgIHsiTVBfRVVJREVWSUNFIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfQUxMX1BST1hZLCAiQWRhcHRlciIsCi0gICAgICJTcGVjaWZ5IGFkYXB0ZXIgdG8gdXNlIGZvciBtZXNzYWdlIHBhc3NpbmcgKE1QX0VVSURFVklDRSkiLAotICAgICAiIiwgImVuMHxmaTB8dHIwfHNuX2FsbHxzbl9zaW5nbGV8bWwwIn0sCi0gICAgeyJNUF9FVUlERVZJQ0UiLCBBVFRSX0ZPUl9MSU5VWCB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkFkYXB0ZXIiLAotICAgICAiU3BlY2lmeSBhZGFwdGVyIHRvIHVzZSBmb3IgbWVzc2FnZSBwYXNzaW5nIChNUF9FVUlERVZJQ0UpIiwgIiIsICJldGh4fHNuX2FsbHxzbl9zaW5nbGUifSwKLSAgICB7Ik1QX0VVSUxJQiIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkNvbW11bmljYXRpb25zIFN1YnN5c3RlbSIsCi0gICAgICJDb21tdW5pY2F0aW9ucyBzdXNic3lzdGVtIHRvIGJlIHVzZWQgKE1QX0VVSUxJQikiLCAiaXAiLCAiaXB8dXMifSwKLSAgICB7Ik1QX0lOU1RBTkNFUyIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX1BFX1dJVEhfTEwsICJXaW5kb3cgb3IgSVAgSW5zdGFuY2VzIiwKLSAgICAgIk51bWJlciBvZiB1c2VyIHNwYWNlIHdpbmRvd3Mgb3IgSVAgYWRkcmVzc2VzIHRvIGFzc2lnbiAoTVBfSU5TVEFOQ0VTKSIsICIiLCAifG1heCJ9LAotICAgIHsiTVBfUkVUUlkiLCBBVFRSX0ZPUl9BTExfT1MgfCBBVFRSX0ZPUl9QRV9XSVRIX0xMLCAiTm9kZSBSZXRyeSBJbnRlcnZhbCIsCi0gICAgICJQZXJpb2QgaW4gc2Vjb25kcyBiZXR3ZWVuIG5vZGUgYWxsb2NhdGlvbiByZXRyaWVzIChNUF9SRVRSWSkiLCAiMCIsICJ8d2FpdCJ9LAotICAgIC8qCi0gICAgICogTm9kZSB0YWIgcmVsYXRlZCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgeyJNUF9QR01NT0RFTCIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJQcm9ncmFtbWluZyBNb2RlbCIsCi0gICAgICJTcGVjaWZ5IHByb2dyYW1taW5nIG1vZGVsIChNUF9QR01NT0RFTCkiLCAic3BtZCIsICJzcG1kfG1wbWQifSwKLSAgICAvKgotICAgICAqIFBlcmZvcm1hbmNlIHRhYiByZWxhdGVkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICB7Ik1QX0NDX1NDUkFUQ0hfQlVGIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkZhc3Rlc3QgQ29sbGVjdGl2ZXMiLAotICAgICAiU3BlY2lmeSBpZiBmYXN0ZXN0IGNvbGxlY3RpdmUgYWxnb3JpdGhtIGlzIHVzZWQgKE1QX0NDX1NDUkFUQ0hfQlVGKSIsICJ5ZXMiLCAieWVzfG5vIn0sCi0gICAgeyJNUF9DU1NfSU5URVJSVVBUIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIlBhY2tldHMgR2VuZXJhdGUgSW50ZXJydXB0cyIsCi0gICAgICJTcGVjaWZ5IGlmIGFycml2aW5nIHBhY2tldHMgZ2VuZXJhdGUgaW50ZXJydXB0cyAoTVBfQ1NTX0lOVEVSUlVQVCkiLCAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9QUklPUklUWV9OVFAiLCBBVFRSX0ZPUl9BSVggfCBBVFRSX0ZPUl9BTExfUFJPWFksICJDb3NjaGVkdWxlciBkaXNhYmxlcyBOVFAiLAotICAgICAiU3BlY2lmeSBpZiBQRSBjby1zY2hlZHVsZXIgdHVybnMgTlRQIG9mZiAoTVBfUFJJT1JJVFlfTlRQKSIsICJubyIsICJ5ZXN8bm8ifSwKLSAgICB7Ik1QX1NIQVJFRF9NRU1PUlkiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiVXNlIFNoYXJlZCBNZW1vcnkiLAotICAgICAiU3BlY2lmeSBpcyBzaGFyZWQgbWVtb3J5IHVzZWQgZm9yIGNvbW11bmljYXRpb24gKE1QX1NIQVJFRF9NRU1PUlkpIiwgInllcyIsICJ5ZXN8bm8ifSwKLSAgICB7Ik1QX1NJTkdMRV9USFJFQUQiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiU2luZ2xlIE1QSSBUaHJlYWQiLAotICAgICAiU3BlY2lmeSBpZiBhcHBsaWNhdGlvbiBoYXMgc2luZ2xlIHRocmVhZCB3aXRoIE1QSSBjYWxscyAoTVBfU0lOR0xFX1RIUkVBRCkiLAotICAgICAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9XQUlUX01PREUiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiV2FpdCBNb2RlIiwKLSAgICAgIlNwZWNpZnkgdGhyZWFkIGJlaGF2aW9yIHdoZW4gd2FpdGluZyBmb3IgbWVzc2FnZXMgKE1QX1dBSVRfTU9ERSkiLAotICAgICAicG9sbCIsICJub3BvbGx8cG9sbHxzbGVlcHx5aWVsZCJ9LAotICAgIHsiTVBfVEFTS19BRkZJTklUWSIsIEFUVFJfRk9SX0FJWCB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIlRhc2sgQWZmaW5pdHkiLAotICAgICAiU3BlY2lmeSB0YXNrIGFmZmluaXR5IGNvbnN0cmFpbnRzIChNUF9UQVNLX0FGRklOSVRZKSIsICIiLCAifFNOSXwtMSJ9LAotICAgIHsiTVBfTkVXSk9CIiwgQVRUUl9GT1JfQUxMX09TIHwgQVRUUl9GT1JfUEVfV0lUSF9MTCwgIk1haW50YWluIFBhcnRpdGlvbiIsCi0gICAgICJNYWludGFpbiBMb2FkTGV2ZWxlciBwYXJ0dGl0aW9uIGZvciBtdWx0aXBsZSBqb2Igc3RlcHMgKE1QX05FV0pPQikiLCAibm8iLCAieWVzfG5vIn0sCi0gICAgeyJNUF9VU0VfQlVMS19YRkVSIiwgQVRUUl9GT1JfQUlYIHwgQVRUUl9GT1JfUEVfV0lUSF9MTCwgIlVzZSBCdWxrIFRyYW5zZmVyIiwKLSAgICAgIkV4cGxvaXQgaGlnaCBwZXJmb3JtYW5jZSBzd2l0Y2ggZGF0YSB0cmFuc2ZlciAoTVBfVVNFX0JVTEtfWEZFUikiLCAibm8iLCAieWVzfG5vIn0sCi0gICAgLyoKLSAgICAgKiBNaXNjZWxsYW5lb3VzIHRhYiByZWxhdGVkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICB7Ik1QX0hJTlRTX0ZJTFRFUkVEIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkhpbnRzIEZpbHRlcmVkIiwKLSAgICAgIlNwZWNpZnkgaWYgTVBJIGluZm8gb2JqZWN0cyByZWplY3QgaGludHMgKE1QX0hJTlRTX0ZJTFRFUkVEKSIsICJ5ZXMiLCAieWVzfG5vIn0sCi0gICAgeyJNUF9DTE9DS19TT1VSQ0UiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiQ2xvY2sgU291cmNlIiwKLSAgICAgIlNwZWNpZnkgaWYgaGlnaCBwZXJmb3JtYW5jZSBzd2l0Y2ggY2xvY2sgaXMgdGltZSBzb3VyY2UgKE1QX0NMT0NLX1NPVVJDRSkiLCAiIiwgInxPUyJ9LAotICAgIHsiTVBfTVNHX0FQSSIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJNZXNzYWdlIFBhc3NpbmcgQVBJIiwKLSAgICAgIlNwZWNpZnkgbWVzc2FnZSBwYXNzaW5nIEFQSSB1c2VkIGJ5IGFwcGxpY2F0aW9uIChNUF9NU0dfQVBJKSIsCi0gICAgICJNUEkiLCAiTVBJfExBUEl8TVBJX0xBUEl8TVBJLExBUEkifSwKLSAgICB7Ik1QX1RMUF9SRVFVSVJFRCIsIEFUVFJfRk9SX0FJWCB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkxhcmdlIFBhZ2UgQ2hlY2siLAotICAgICAiU3BlY2lmeSBpZiBQRSBjaGVja3MgaWYgYXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIHdpdGggbGFyZ2UgcGFnZXMgKE1QX1RMUF9SRVFVSVJFRCkiLAotICAgICAibm9uZSIsICJub25lfHdhcm58a2lsbCJ9LAotICAgIHsiTVBfQ0tQVERJUl9QRVJfVEFTSyIsIEFUVFJfRk9SX0FJWCB8IEFUVFJfRk9SX0FMTF9QUk9YWSwgIkNoZWNrcG9pbnQgRGlyZWN0b3J5IFBlciBUYXNrIiwKLSAgICAgIlNwZWNpZnkgaWYgc2VwYXJhdGUgY2hlY2twb2ludCBkaXJlY3RvcnkgcGVyIHRhc2sgKE1QX0NLUFRESVJfUEVSX1RBU0spIiwgIm5vIn0KLX07Ci0KLWludF9sYXVuY2hfYXR0ciBpbnRfYXR0cnNbXSA9IHsKLSAgICAvKgotICAgICAqIEkvTyB0YWIgcmVsYXRlZCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgeyJNUF9JT19CVUZGRVJfU0laRSIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJNUEkgSS9PIEJ1ZmZlciBTaXplIiwKLSAgICAgIlNwZWNpZnkgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgTVBJLUlPIChNUElfSU9fQlVGRkVSX1NJWkUpIiwgODE5MiwgMSwgMHg4MDAwMDAwfSwKLQkvKgotCSAqIE5vZGUgdGFiIHJlbGF0ZWQgYXR0cmlidXRlcwotCSAqLwotICAgIHsiTVBfUFJPQ1MiLCBBVFRSX0FMV0FZU19BTExPV0VELAotICAgICAiTnVtYmVyIG9mIFRhc2tzIiwgIlNwZWNpZnkgbnVtYmVyIG9mIHByb2dyYW0gdGFza3MgKE1QX1BST0NTKSIsIDEsIDEsIElOVF9NQVh9LAotICAgIHsiTVBfTk9ERVMiLCBBVFRSX0ZPUl9BTExfT1MgfCBBVFRSX0ZPUl9QRV9XSVRIX0xMLAotICAgICAiTnVtYmVyIG9mIE5vZGVzIiwgIk51bWJlciBvZiBub2RlcyB0byBhbGxvY2F0ZSAoTVBfTk9ERVMpIiwgMSwgMSwgSU5UX01BWH0sCi0gICAgeyJNUF9UQVNLU19QRVJfTk9ERSIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX1BFX1dJVEhfTEwsICJUYXNrcyBwZXIgTm9kZSIsCi0gICAgICJOdW1iZXIgb2YgdGFza3MgdG8gYXNzaWduIHRvIGEgbm9kZSAoTVBfVEFTS1NfUEVSX05PREUpIiwgMSwgMSwgSU5UX01BWH0sCi0KLSAgICB7Ik1QX1JFVFJZX0NPVU5UIiwgQVRUUl9GT1JfQUxMX09TIHwgQVRUUl9GT1JfUEVfV0lUSF9MTCwgIk5vZGUgUmV0cnkgQ291bnQiLAotICAgICAiTnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IG5vZGUgYWxsb2NhdGlvbiAoTVBfUkVUUllDT1VOVCkiLCAxLCAxLCBJTlRfTUFYfSwKLSAgICB7Ik1QX1JFVFJZX0lOVCIsIEFUVFJfRk9SX0FMTF9PUyB8IEFUVFJfRk9SX1BFX1dJVEhfTEwsICJOb2RlIFJldHJ5IEludGVydmFsIiwKLSAgICAiSW50ZXJ2YWwgdG8gcmV0cnkgbm9kZSBhbGxvY2F0aW9uIChNUF9SRVRSWV9JTlRFUlZBTCkiLCAxLCAxLCBJTlRfTUFYfSwKLQkvKgotCSAqIFBlcmZvcm1hbmNlIHRhYiByZWxhdGVkIGF0dHJpYnV0ZXMKLQkgKi8KLSAgICB7Ik1QX0FDS19USFJFU0giLCBBVFRSX0FMV0FZU19BTExPV0VELCAiQWNrbm93bGVkZ21lbnQgVGhyZXNob2xkIiwKLSAgICAgIlNwZWNpZnkgcGFja2V0IGFja25vd2xlZGdtZW50IHRocmVzaGhvbGQgKE1QX0FDS19USFJFU0gpIiwgMzAsIDEsIDMxfSwKLSAgICB7Ik1QX0VBR0VSX0xJTUlUIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkVhZ2VyIExpbWl0IiwKLSAgICAgIlNwZWNpZnkgcmVuZGV6dm91cyBwcm90b2NvbCBtZXNzYWdlIHNpemUgdGhyZXNob2xkIChNUF9FQUdFUl9MSU1JVCkiLAotICAgICAweDEwMDAwLCAxLCBJTlRfTUFYfSwKLSAgICB7Ik1QX01TR19FTlZFTE9QRV9CVUYiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiRW52ZWxvcGUgQnVmZmVyIFNpemUiLAotICAgICAiU3BlY2lmeSBzaXplIG9mIG1lc3NhZ2UgZW52ZWxvcGUgYnVmZmVyIChNUF9NU0dfRU5WRUxPUEVfQlVGKSIsCi0gICAgIDB4ODAwMDAwLCAxMDAwMDAxLCBJTlRfTUFYfSwKLSAgICB7Ik1QX1BPTExJTkdfSU5URVJWQUwiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiTVBJIFBvbGxpbmcgSW50ZXJ2YWwiLAotICAgICAiU3BlY2lmeSBQRSBwb2xsaW5nIGludGVydmFsIChNUF9QT0xMSU5HX0lOVEVSVkFMKSIsIDQwMDAwMCwgMSwgSU5UX01BWH0sCi0gICAgeyJQRV9SRE1BX0NPVU5UIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIk51bWJlciBvZiByQ3R4IEJsb2NrcyIsCi0gICAgICJTcGVjaWZ5IG51bWJlciBvZiByQ3h0IGJsb2NrcyAoTVBfUkRNQV9DT1VOVCkiLCAwLCAwLCBJTlRfTUFYfSwKLSAgICB7IlBFX1JETUFfQ09VTlRfMiIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJOdW1iZXIgb2YgckN0eCBCbG9ja3MiLAotICAgICAiU3BlY2lmeSBudW1iZXIgb2YgckN4dCBibG9ja3MgKE1QX1JETUFfQ09VTlQpIiwgMCwgMCwgSU5UX01BWH0sCi0gICAgeyJNUF9SRVRSQU5TTUlUX0lOVEVSVkFMIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIk1QSSBSZXRyYW5zbWl0IEludGVydmFsIiwKLSAgICAgIlNwZWNpZnkgaW50ZXJ2YWwgdG8gY2hlY2sgaWYgcmV0cmFuc21pdCBuZWVlZGVkIChNUF9SRVRSQU5TTUlUX0lOVEVSVkFMKSIsCi0gICAgIDEwMDAwLCAxMDAwLCBJTlRfTUFYfSwKLSAgICB7Ik1QX1JFWE1JVF9CVUZfQ05UIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIlJldHJhbnNtaXQgQnVmZmVycyIsCi0gICAgICJTcGVjaWZ5IG51bWJlciBvZiByZXRyYW5zbWl0IGJ1ZmZlcnMgcGVyIHRhc2sgKE1QX1JFWE1JVF9CVUZfQ05UKSIsIDEyOCwgMSwgSU5UX01BWH0sCi0gICAgeyJNUF9SRVhNSVRfQlVGX1NJWkUiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiTWF4aW11bSBMQVBJIEJ1ZmZlcmVkIE1lc3NhZ2UiLAotICAgICAiU3BlY2lmeSBtYXhpbXVtIExBUEkgYnVmZmVyIHNpemUgKE1QX1JFWE1JVF9CVUZfU0laRSkiLCA2NTU2OCwgMSwgSU5UX01BWH0sCi0gICAgeyJNUF9VRFBfUEFDS0VUX1NJWkUiLCBBVFRSX0FMV0FZU19BTExPV0VELAotICAgICAiVURQIFBhY2tldCBTaXplIiwgIlNwZWNpZnkgVURQIHBhY2tldCBzaXplIChNUF9VRFBfUEFDS0VUX1NJWkUpIiwgMSwgMSwgSU5UX01BWH0sCi0gICAgeyJQRV9CVUZGRVJfTUVNIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkJ1ZmZlciBNZW1vcnkiLAotICAgICAiU3BlY2lmeSBzaXplIG9mIHByZWFsbG9jYXRlZCBlYXJseSBhcnJpdmFsIGJ1ZmZlciAoTVBfQlVGRkVSX01FTSkiLAotICAgICAweDQwMDAwMDAsIDAsIElOVF9NQVh9LAotICAgIHsiTVBfQlVMS19NSU5fTVNHX1NJWkUiLCBBVFRSX0ZPUl9BSVggfCBBVFRSX0ZPUl9QRV9XSVRIX0xMLCAiTWluaW11bSBCdWxrIE1lc3NhZ2UgU2l6ZSIsCi0gICAgICJNaW5pbXVtIG1lc3NhZ2Ugc2l6ZSB0byB1c2UgYnVsayB0cmFuc2ZlciBwYXRoIChNUF9CVUxLX01JTl9NU0dfU0laRSkiLAotICAgICAxNTM2MDAsIDAsIElOVF9NQVh9LAotCS8qCi0JICogTWlzY2VsbGFuZW91cyB0YWIgcmVsYXRlZCBhdHRyaWJ1dGVzCi0JICovCi0gICAgeyJNUF9USFJFQURfU1RBQ0tTSVpFIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkFkZGl0aW9uYWwgTVBJIFRocmVhZCBTdGFjayBTaXplIiwKLSAgICAgIlNwZWNpZnkgYWRkaXRpb25hbCBzdGFjayBzaXplIGZvciBNUEkgc2VydmljZSB0aHJlYWQgKE1QX1RIUkVBRF9TVEFDS1NJWkUpIiwKLSAgICAgMCwgMCwgSU5UX01BWH0sCi0gICAgeyJNUF9QVUxTRSIsIEFUVFJfQUxXQVlTX0FMTE9XRUQsICJQdWxzZSBJbnRlcnZhbCIsCi0gICAgICJTcGVjaWZ5IGludGVydmFsIFBFIGNoZWNrcyByZW1vdGUgbW9kZXMgKE1QX1BVTFNFKSIsIDYwMCwgMCwgSU5UX01BWH0sCi0gICAgeyJNUF9USU1FT1VUIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIkNvbm5lY3Rpb24gVGltZW91dCIsCi0gICAgICJTcGVjaWZ5IHRpbWVvdXQgbGltaXQgZm9yIGNvbm5lY3RpbmcgdG8gcmVtb3RlIG5vZGVzIChNUF9USU1FT1VUKSIsIDE1MCwgMSwgSU5UX01BWH0sCi0JLyoKLQkgKiBBZGRpdGlvbmFsIGludGVnZXIgYXR0cmlidXRlcyB1c2VkIG9ubHkgZm9yIHZhbGlkYXRpb24gb2YgYXR0cmlidXRlCi0JICogZmllbGQgY29udGVudHMuIFRoZXNlIGFyZSB1c2VkIGluIGNhc2VzIHdoZXJlIGEgc2luZ2xlIGludGVnZXIsCi0JICogc3RyaW5nIG9yIGVudW1lcmF0ZWQgYXR0cmlidXRlIGlzIGluc3VmZmljaWVudCBmb3IgdmFsaWRhdGluZwotCSAqIGFuIGF0dHJpYnV0ZSBmaWVsZCwgZm9yIGluc3RhbmNlIHdoZXJlIGFuIGFsbG93YWJsZSB2YWx1ZSBpcyBhbgotCSAqIGVudW1lcmF0aW9uIG9yIGludGVnZXIgdmFsdWUsIG9yIHdoZXJlIGEgZmllbGQgY29udGFpbnMKLQkgKiBtdWx0aXBsZSBzdWItZmllbGRzLCBzdWNoIGFzIG1tbSxubm4uIEZvciB0aGVzZSBhdHRyaWJ1dGVzLAotCSAqIHNob3J0IG5hbWUsIGxvbmcgbmFtZSBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUgaXJyZWxldmFudC4KLQkgKi8KLSAgICB7Ik1QX0lOU1RBTkNFU19JTlQiLCBBVFRSX0FMV0FZU19BTExPV0VELCAiPz8/IiwgIj8/PyIsIDAsIDAsIElOVF9NQVh9LAotfTsKLQotbG9uZ19pbnRfbGF1bmNoX2F0dHIgbG9uZ19pbnRfYXR0cnNbXSA9IHsKLSAgICB7IlBFX0JVRkZFUl9NRU1fTUFYIiwgQVRUUl9BTFdBWVNfQUxMT1dFRCwgIj8/PyIsCi0gICAgICJTcGVjaWZ5IG1heGltdW0gc2l6ZSBvZiBlYXJseSBhcnJpdmFsIGJ1ZmZlciAoTVBfQlVGRkVSX01FTSkiLCAwLCAwLCAweDdmZmZmZmZmZmZmZmZmZmZMTH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQcm94eSBjb21tYW5kIGhhbmRsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLVBFX3N0YXJ0X2RhZW1vbihpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKQotewotICAgIC8qCi0gICAgICogUHJveHkgc3RhcnR1cC4gQWxsb2NhdGUgYSBsaXN0IHRvIGNvbnRhaW4gbWFjaGluZSBkZWZpbml0aW9ucywgd2hlcmUKLSAgICAgKiBlYWNoIHVuaXF1ZSBob3N0ZmlsZSBkZWZpbmVzIGEgbmV3IG1hY2hpbmUuIENyZWF0ZSBhIHRocmVhZCB0aGF0Ci0gICAgICogd2lsbCBtb25pdG9yIHN0YXJ0ZWQgcG9lIHByb2Nlc3NlcyBmb3IgdGVybWluYXRpb24gYW5kIHdpbGwKLSAgICAgKiBub3RpZnkgdGhlIGZyb250IGVuZCB0aGF0IHRoZSBwb2UgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4KLSAgICAgKi8KLSAgICBwdGhyZWFkX2F0dHJfdCB0ZXJtX3RocmVhZF9hdHRyczsKLSAgICBzdHJ1Y3QgcGFzc3dkICp1c2VyaW5mbzsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIHByaW50X21lc3NhZ2VfYXJncyhuYXJncywgYXJncyk7Ci0gICAgdXNlcmluZm8gPSBnZXRwd3VpZChnZXR1aWQoKSk7Ci0gICAgbXlfdXNlcm5hbWUgPSBzdHJkdXAodXNlcmluZm8tPnB3X25hbWUpOwotICAgIGJhc2VfaWQgPSBzdHJ0b2woYXJnc1sxXSwgTlVMTCwgMTApOwotICAgIG5vZGVzID0gSGFzaENyZWF0ZSgxMDI0KTsKLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHJzKTsKLSAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRycywgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwotICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0ZXJtX3RocmVhZF9hdHRycyk7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0ZXJtX3RocmVhZF9hdHRycywgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwotICAgIHB0aHJlYWRfY3JlYXRlKCZ0ZXJtaW5hdGlvbl90aHJlYWQsICZ0aHJlYWRfYXR0cnMsIHpvbWJpZV9yZWFwZXIsIE5VTEwpOwotI2lmZGVmIEhBVkVfTExBUElfSAotICAgIHN0cmNweShpYm1sbF9wcm94eV9iYXNlX2lkX3N0cmluZywgYXJnc1sxXSk7Ci0gICAgaWYgKHVzZV9sb2FkX2xldmVsZXIpIHsKLQlsb2FkX2xvYWRfbGV2ZWxlcl9saWJyYXJ5KHRyYW5zX2lkKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBzZW5kX29rX2V2ZW50KHRyYW5zX2lkKTsKLSAgICBUUkFDRV9FWElUOwotICAgIHJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLWludAotUEVfZGVmaW5lX21vZGVsKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pCi17Ci0gICAgLyoKLSAgICAgKiBTZW5kIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMsIGxhdW5jaCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMsCi0gICAgICogYW5kIGVsZW1lbnQgZGVmaW5pdGlvbnMga25vd24gYnkgdGhpcyBwcm94eSB0byB0aGUgR1VJLgotICAgICAqLwotICAgIGludCBmbGFnczsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGZsYWdzID0gMDsKLSNpZmRlZiBfX2xpbnV4X18KLSAgICBmbGFncyA9IGZsYWdzIHwgQVRUUl9GT1JfTElOVVg7Ci0jZW5kaWYKLSNpZmRlZiBfQUlYCi0gICAgZmxhZ3MgPSBmbGFncyB8IEFUVFJfRk9SX0FJWDsKLSNlbmRpZgotICAgIGlmICh1c2VfbG9hZF9sZXZlbGVyKSB7Ci0JZmxhZ3MgPSBmbGFncyB8IEFUVFJfRk9SX1BFX1dJVEhfTEw7Ci0gICAgfQotICAgIGVsc2UgewotCWZsYWdzID0gZmxhZ3MgfCBBVFRSX0ZPUl9QRV9TVEFOREFMT05FOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotICAgIHNlbmRfc3RyaW5nX2F0dHJzKHRyYW5zX2lkLCBmbGFncyk7Ci0gICAgc2VuZF9pbnRfYXR0cnModHJhbnNfaWQsIGZsYWdzKTsKLSAgICBzZW5kX2xvbmdfaW50X2F0dHJzKHRyYW5zX2lkLCBmbGFncyk7Ci0gICAgc2VuZF9lbnVtX2F0dHJzKHRyYW5zX2lkLCBmbGFncyk7Ci0gICAgc2VuZF9sb2NhbF9kZWZhdWx0X2F0dHJzKHRyYW5zX2lkKTsKLSAgICBzZW5kX29rX2V2ZW50KHRyYW5zX2lkKTsKLSAgICBUUkFDRV9FWElUOwotICAgIHJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLWludAotUEVfc3RhcnRfZXZlbnRzKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pCi17Ci0gICAgLyoKLSAgICAgKiBTZW5kIHRoZSBjb21wbGV0ZSBtYWNoaW5lIHN0YXRlIHRvIHRoZSBHVUkuIEluIFBFIHN0YW5kYWxvbmUgY2FzZSwKLSAgICAgKiB0aGVyZSBpcyBvbmx5IGEgbWFjaGluZSBhbmQgYSBxdWV1ZSwgc2luY2Ugbm9kZXMgYXJlIG5vdCBrbm93bgotICAgICAqIHVudGlsIGFuIGFwcGxpYXRpb24gaXMgaW52b2tlZCBhbmQgYSBob3N0bGlzdCBwcm92aWRlZC4gSW4gdGhlCi0gICAgICogUEUvTG9hZExldmVsZXIgY2FzZSwgcXVlcnkgTG9hZExldmVsZXIgdG8gZ2V0IHRoZSBzZXQgb2Ygbm9kZXMKLSAgICAgKiB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBjbHVzdGVyIChtYWNoaW5lKSBhbmQgc2VuZCBuZXcgbm9kZSBldmVudHMKLSAgICAgKiB0byB0aGUgR1VJIGZvciBlYWNoIG5vZGUuCi0gICAgICovCi0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotICAgIHN0YXJ0X2V2ZW50c190cmFuc2lkID0gdHJhbnNfaWQ7Ci0gICAgc3RhdGVfZXZlbnRzX2FjdGl2ZSA9IDE7Ci0gICAgaWYgKHVzZV9sb2FkX2xldmVsZXIpIHsKLSNpZmRlZiBIQVZFX0xMQVBJX0gKLQkvKgotCSAqIElmIExvYWRMZXZlbGVyIGlzIHVzZWQsIHRoZW4gUEUgam9icyB3aWxsIHVzZSB0aGUgbWFjaGluZSBhbmQgcXVldWUgdGhhdCB0aGUgbm9kZSB3aGVyZSB0aGlzCi0JICogcHJveHkgaXMgcnVubmluZyBpcyBhIG1lbWJlciBvZiwgc28gbWFjaGluZV9pZCBhbmQgcXVldWVfaWQgd29uJ3QgYmUgZ2VuZXJhdGVkIGhlcmUKLQkgKi8KLQkvKiBDcmVhdGUgdGhyZWFkIHRvIG1vbml0b3IgTG9hZExldmVsZXIgY2x1c3RlcnMgb2YgbWFjaGluZXMgKHRoZXNlIGFyZSBub2RlcyBpbiBhIG1hY2hpbmUgaW4gcHRwIGxpbmdvKS4gICovCi0JcHRocmVhZF9hdHRyX2luaXQoJm1vbml0b3JfTG9hZExldmVsZXJfbm9kZXNfdGhyZWFkX2F0dHIpOwotCXB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmbW9uaXRvcl9Mb2FkTGV2ZWxlcl9ub2Rlc190aHJlYWRfYXR0ciwKLQkJCQkgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwotCXB0aHJlYWRfY3JlYXRlKCZtb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzX3RocmVhZCwgJm1vbml0b3JfTG9hZExldmVsZXJfbm9kZXNfdGhyZWFkX2F0dHIsCi0JCSAgICAgICBtb25pdG9yX0xvYWRMZXZlbGVyX25vZGVzLCBOVUxMKTsKLQotCS8qIENyZWF0ZSB0aHJlYWQgdG8gbW9uaXRvciBMb2FkTGV2ZWxlciBqb2JzIGluIGNsdXN0ZXJzLiAgKi8KLQlwdGhyZWFkX2F0dHJfaW5pdCgmbW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzX3RocmVhZF9hdHRyKTsKLQlwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJm1vbml0b3JfTG9hZExldmVsZXJfam9ic190aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwotCXB0aHJlYWRfY3JlYXRlKCZtb25pdG9yX0xvYWRMZXZlbGVyX2pvYnNfdGhyZWFkLCAmbW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzX3RocmVhZF9hdHRyLAotCQkgICAgICAgbW9uaXRvcl9Mb2FkTGV2ZWxlcl9qb2JzLCBOVUxMKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIHsKLQljaGFyIGlkX3N0clsxMl07Ci0JY2hhciBiYXNlX2lkX3N0clsxMl07Ci0KLQltYWNoaW5lX2lkID0gZ2VuZXJhdGVfaWQoKTsKLQlxdWV1ZV9pZCA9IGdlbmVyYXRlX2lkKCk7Ci0Jc3ByaW50ZihiYXNlX2lkX3N0ciwgIiVkIiwgYmFzZV9pZCk7Ci0Jc3ByaW50ZihpZF9zdHIsICIlZCIsIG1hY2hpbmVfaWQpOwotCWVucXVldWVfZXZlbnQocHJveHlfbmV3X21hY2hpbmVfZXZlbnQodHJhbnNfaWQsIGJhc2VfaWRfc3RyLCBpZF9zdHIsCi0JCQkJCSAgICAgICJkZWZhdWx0IiwgTUFDSElORV9TVEFURV9VUCkpOwotCXNwcmludGYoaWRfc3RyLCAiJWQiLCBxdWV1ZV9pZCk7Ci0JZW5xdWV1ZV9ldmVudChwcm94eV9uZXdfcXVldWVfZXZlbnQodHJhbnNfaWQsIGJhc2VfaWRfc3RyLCBpZF9zdHIsCi0JCQkJCSAgICAiZGVmYXVsdCIsIFFVRVVFX1NUQVRFX05PUk1BTCkpOwotCS8qCi0JICogTG9vayBmb3IgcG9lIGpvYnMgYWxyZWFkeSBydW5uaW5nIG9uIHN5c3RlbQotCSAqLwotCWRpc2NvdmVyX2pvYnMoKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBEbyBub3Qgc2VuZCBhbiBhY2tub3dsZWRnbWVudCBmb3IgdGhlIFBFX3N0YXJ0X2V2ZW50cyBjb21tYW5kIGhlcmUKLSAgICAgKiBzaW5jZSBhc3luY2hyb25vdXMgZXZlbnQgbm90aWZpY2F0aW9ucyBmb3IgbmV3IG1hY2hpbmUsIG5vZGUsCi0gICAgICogcHJvY2Vzcywgam9iLCBhcyB3ZWxsIGFzIHN0YXRlIGNoYW5nZXMgaW4gdGhvc2Ugb2JqZWN0cyB1c2UgdGhlCi0gICAgICogc3RhcnRfZXZlbnRzIHRyYW5zYWN0aW9uIGlkLiBJZiBhbiBhY2sgaXMgc2VudCBoZXJlLCB0aGF0Ci0gICAgICogdHJhbnNhY3Rpb24gaWQgaXMgaW52YWxpZCBhbmQgYW55IGV2ZW50cyB1c2luZyB0aGF0IGlkIHdpbGwgY2F1c2UKLSAgICAgKiBhbiBleGNlcHRpb24gaW4gdGhlIGZyb250IGVuZCBzdGF0ZSBtYWNoaW5lIGxvb3AsIHRlcm1pbmF0aW5nIHRoZQotICAgICAqIHN0YXRlIG1hY2hpbmUuCi0gICAgICovCi0gICAgVFJBQ0VfRVhJVDsKLSAgICByZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi1pbnQKLVBFX3N1Ym1pdF9qb2IoaW50IHRyYW5zX2lkLCBpbnQgbmFyZ3MsIGNoYXIgKmFyZ3NbXSkKLXsKLSAgICAvKgotICAgICAqIFN1Ym1pdCBhIFBhcmFsbGVsIEVudmlyb25tbmVudCBhcHBsaWNhdGlvbiBmb3IgZXhlY3V0aW9uLgotICAgICAqIFRoaXMgZnVuY3Rpb246Ci0gICAgICogMSkgcGFyc2VzIHRoZSBwYXNzZWQgYXJndW1lbnQgbGlzdAotICAgICAqIDIpIHNldHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLSAgICAgKiAzKSBzZXRzIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIGluIHRoZSBhcmd1bWVudCBsaXN0Ci0gICAgICogNCkgY3JlYXRlcyBwaXBlcyB0byBoYW5kbGUgc3RkaW8gdG8vZnJvbSB0aGUgYXBwbGljYXRpb24KLSAgICAgKiA1KSBzZXRzIHVwIEkvTyBoYW5kbGVycyBmb3Igc3RkaW8KLSAgICAgKiA2KSBzZXRzIHVwIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgYXBwbGljYXRpb24KLSAgICAgKiA3KSBzdGFydHMgdGhlIGFwcGxpY2F0aW9uIGJ5IGZvcmsvZXhlYwotICAgICAqIDgpIHN0YXJ0cyBhIG1vbml0b3JpbmcgdGhyZWFkIHdob3NlIHB1cnBvc2UgaXMgdG8gd2FpdCBmb3IgdGhlCi0gICAgICogICAgYXR0YWNoLmNmZyBmaWxlIHRvIGJlIGNyZWF0ZWQsIHRoZW4gdXBkYXRlIGpvYiBzdGF0ZSB0byBydW5uaW5nLgotICAgICAqIDkpIG5vdGlmeSB0aGUgZnJvbnQgZW5kIGEgbmV3IGpvYiBoYXMgYmVlbiBzdWJtaXR0ZWQKLSAgICAgKi8KLSAgICBjaGFyICpleGVjbmFtZTsKLSAgICBjaGFyICpleGVjZGlyOwotICAgIGNoYXIgKmRlYnVnZ2VyX3BhdGg7Ci0gICAgY2hhciAqZGVidWdnZXJfbmFtZTsKLSAgICBjaGFyICoqZGVidWdfYXJnczsKLSAgICBjaGFyICphcmdwOwotICAgIGNoYXIgKmpvYmlkOwotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmN3ZDsKLSAgICBjaGFyICpzdGRpbl9wYXRoOwotICAgIGNoYXIgKnN0ZG91dF9wYXRoOwotICAgIGNoYXIgKnN0ZGVycl9wYXRoOwotICAgIGNoYXIgKm1wX2J1ZmZlcl9tZW07Ci0gICAgY2hhciAqbXBfYnVmZmVyX21lbV9tYXg7Ci0gICAgY2hhciAqbXBfcmRtYV9jb3VudDsKLSAgICBjaGFyICptcF9yZG1hX2NvdW50XzI7Ci0gICAgY2hhciAqKmVudnA7Ci0gICAgam9iaW5mbyAqam9iOwotICAgIGludCAgZGVidWdfZHVhbF9wb2VfbW9kZSA9IDA7Ci0gICAgY2hhciBwZV9kZWJ1Z2dlcl9pZFszMl0gPSB7IDAgfTsJCS8vIFBPRSBQSUQgb2YgcGFyYWxsZWwgZGVidWdnZXIuCi0gICAgY2hhciAqcG1kX2hlbHBlciA9IDA7Ci0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLSAgICBqb2JpbmZvICpkZWJ1Z2dlcl9qb2I7Ci0jZW5kaWYKLSAgICBpbnQgaTsKLSAgICBpbnQgZGVidWdfYXJnX2NvdW50OwotICAgIGludCBsYWJlbF9pbzsKLSAgICBpbnQgc3BsaXRfaW87Ci0gICAgaW50IHN0YXR1czsKLSAgICBpbnQgc3Rkb3V0X3BpcGVbMl07Ci0gICAgaW50IHN0ZGVycl9waXBlWzJdOwotICAgIHBpZF90IHBpZDsKLSAgICBpbnQgbXBfYnVmZmVyX21lbV9zZXQ7Ci0gICAgaW50IG1wX3JkbWFfY291bnRfc2V0OwotICAgIGludCByZWRpcmVjdDsKLSAgICBpbnQgZGVidWdfc2RtX21vZGU7Ci0gICAgY2hhciBtcF9yZG1hX2NvdW50X3ZhbHVlWzUwXTsKLSAgICBjaGFyIG1wX2J1ZmZlcl9tZW1fdmFsdWVbNTBdOwotCi0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgcHJpbnRfbWVzc2FnZV9hcmdzKG5hcmdzLCBhcmdzKTsKLSAgICBqb2JpZCA9IE5VTEw7Ci0gICAgZXhlY2RpciA9IE5VTEw7Ci0gICAgZXhlY25hbWUgPSBOVUxMOwotICAgIGN3ZCA9IE5VTEw7Ci0gICAgYXJncCA9IE5VTEw7Ci0gICAgbGFiZWxfaW8gPSAwOwotICAgIHNwbGl0X2lvID0gMDsKLSAgICBzdGRpbl9wYXRoID0gTlVMTDsKLSAgICBzdGRvdXRfcGF0aCA9IE5VTEw7Ci0gICAgc3RkZXJyX3BhdGggPSBOVUxMOwotICAgIG1wX2J1ZmZlcl9tZW0gPSAiIjsKLSAgICBtcF9idWZmZXJfbWVtX21heCA9ICIiOwotICAgIG1wX2J1ZmZlcl9tZW1fc2V0ID0gMDsKLSAgICBtcF9idWZmZXJfbWVtX3ZhbHVlWzBdID0gJ1wwJzsKLSAgICBtcF9yZG1hX2NvdW50ID0gIiI7Ci0gICAgbXBfcmRtYV9jb3VudF8yID0gIiI7Ci0gICAgbXBfcmRtYV9jb3VudF9zZXQgPSAwOwotICAgIG1wX3JkbWFfY291bnRfdmFsdWVbMF0gPSAnXDAnOwotICAgIGRlYnVnX2FyZ19jb3VudCA9IDA7Ci0gICAgZGVidWdfc2RtX21vZGUgPSAwOwotICAgIC8qCi0gICAgICogUHJvY2VzcyBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KLSAgICAgKi8KLSAgICBUUkFDRV9ERVRBSUwoIisrKyBQYXJzaW5nIGFyZ3VtZW50c1xuIik7Ci0gICAgZGVidWdfYXJncyA9IChjaGFyICoqKSBtYWxsb2MoMTAgKiBzaXplb2YoY2hhciAqKSk7Ci0gICAgbWFsbG9jX2NoZWNrKGRlYnVnX2FyZ3MsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIGZvciAoaSA9IDA7IGFyZ3NbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JLyoKLQkgKiBDaGVjayBpZiB0aGlzIGlzIGEgUEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGZvciBpbnN0YW5jZQotCSAqIE1QX1BST0NTPTIKLQkgKi8KLQlpZiAoc3RybmNtcChhcmdzW2ldLCAiTVBfIiwgMykgPT0gMCkgewotCSAgICBjcCA9IHN0cmNocihhcmdzW2ldLCAnPScpOwotCSAgICBpZiAoY3AgIT0gTlVMTCkgewotCQkvKgotCQkgKiBUaGUgTVBfTEFCRUxJTyBhbmQgTVBfSE9TVEZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZQotCQkgKiB1c2VkIGJ5IHRoZSBwcm94eSBzbyBwcm9jZXNzIHRoZW0gaGVyZS4KLQkJICovCi0JCSpjcCA9ICdcMCc7Ci0JCWlmIChzdHJjbXAoYXJnc1tpXSwgIk1QX0xBQkVMSU8iKSA9PSAwKSB7Ci0JCSAgICBpZiAoc3RyY21wKChjcCArIDEpLCAieWVzIikgPT0gMCkgewotCQkJbGFiZWxfaW8gPSAxOwotCQkgICAgfQotCQl9Ci0JCWVsc2UgaWYgKCghdXNlX2xvYWRfbGV2ZWxlcikgJiYgKHN0cmNtcChhcmdzW2ldLCAiTVBfSE9TVEZJTEUiKSkgPT0gMCkgewotCQkgICAgRklMRSAqaG9zdGxpc3Q7Ci0JCSAgICAvKgotCQkgICAgICogUHJvY2VzcyBob3N0IGZpbGUsIGJ1aWxkaW5nIG5ldyBtYWNoaW5lCi0JCSAgICAgKiBjb25maWd1cmF0aW9uIGlmIHRoaXMgaXMgYSB1bmlxdWUgaG9zdGZpbGUuCi0JCSAgICAgKiBJZiBMb2FkTGV2ZWxlciBpcyB1c2VkLCB0aGVuIGRvbid0IHByb2Nlc3MgaG9zdGZpbGUgc2luY2Ugbm9kZSBzdGF0dXMKLQkJICAgICAqIGlzIGhhbmRsZWQgYnkgdHJhY2tpbmcgTG9hZGxldmVsZXIncyB2aWV3IG9mIG5vZGUgc3RhdHVzLgotCQkgICAgICovCi0JCSAgICBob3N0bGlzdCA9IGZvcGVuKChjcCArIDEpLCAiciIpOwotCQkgICAgaWYgKGhvc3RsaXN0ICE9IE5VTEwpIHsKLQkJCXVwZGF0ZV9ub2Rlcyh0cmFuc19pZCwgaG9zdGxpc3QpOwotCQkJZmNsb3NlKGhvc3RsaXN0KTsKLQkJICAgIH0KLQkJfQotCQkvKgotCQkgKiBJZiBNUF9JTkZPTEVWRUwgaXMgPiAxIGNoYXIsIHRoZW4gY29udmVydCBmcm9tIGxhYmVsCi0JCSAqIG5hbWUgdG8gcmVhbCBzZXR0aW5nIHZhbHVlLiBOb3RlIHRoYXQgdGhlIG9yaWdpbmFsCi0JCSAqIHNldHRpbmcgaXMgb3ZlcndyaXR0ZW4sIHdoaWNoIGlzIG9rIHNpbmNlIHRoZQotCQkgKiBuZXcgdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBzaG9ydGVyIHRoYW4gdGhlCi0JCSAqIG9yaWdpbmFsIHZhbHVlLgotCQkgKi8KLQkJZWxzZSBpZiAoKHN0cmNtcChhcmdzW2ldLCAiTVBfSU5GT0xFVkVMIikgPT0gMCkgJiYgKHN0cmxlbihjcCArIDEpICE9IDEpKSB7Ci0JCSAgICBpbnQgbjsKLQotCQkgICAgZm9yIChuID0gMDsgbiA8IHNpemVvZiBtcF9pbmZvbGV2ZWxfbGFiZWxzIC8gc2l6ZW9mKGNoYXIgKik7IG4rKykgewotCQkJaWYgKHN0cmNtcChjcCArIDEsIG1wX2luZm9sZXZlbF9sYWJlbHNbbl0pID09IDApIHsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICAgIGlmIChuIDwgKHNpemVvZiBtcF9pbmZvbGV2ZWxfbGFiZWxzIC8gc2l6ZW9mKGNoYXIgKikpKSB7Ci0JCQlzcHJpbnRmKGNwICsgMSwgIiVkIiwgbik7Ci0JCSAgICB9Ci0JCX0KLQkJLyoKLQkJICogUmVzdG9yZSB0aGUgJz0nIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXR0aW5nCi0JCSAqLwotCQkqY3AgPSAnPSc7Ci0JICAgIH0KLQl9Ci0JLyoKLQkgKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFyaWFibGUgc2V0IGJ5IHRoZSBQRSBmcm9udCBlbmQgYW5kIGhhbmRsZSBpdAotCSAqIGlmIHNvLgotCSAqLwotCWVsc2UgaWYgKHN0cm5jbXAoYXJnc1tpXSwgIlBFXyIsIDMpID09IDApIHsKLQkgICAgY3AgPSBzdHJjaHIoYXJnc1tpXSwgJz0nKTsKLQkgICAgaWYgKGNwICE9IE5VTEwpIHsKLQkJKmNwID0gJ1wwJzsKLQkJaWYgKHN0cmNtcChhcmdzW2ldLCAiUEVfU1RESU5fUEFUSCIpID09IDApIHsKLQkJICAgIHN0ZGluX3BhdGggPSBjcCArIDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3NbaV0sICJQRV9TVERPVVRfUEFUSCIpID09IDApIHsKLQkJICAgIHN0ZG91dF9wYXRoID0gY3AgKyAxOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmdzW2ldLCAiUEVfU1RERVJSX1BBVEgiKSA9PSAwKSB7Ci0JCSAgICBzdGRlcnJfcGF0aCA9IGNwICsgMTsKLQkJfQotCQllbHNlIGlmICgoc3RyY21wKGFyZ3NbaV0sICJQRV9TUExJVF9TVERPVVQiKSA9PSAwKQotCQkJICYmIChzdHJjbXAoY3AgKyAxLCAieWVzIikgPT0gMCkpIHsKLQkJICAgIHNwbGl0X2lvID0gMTsKLQkJfQotCQkvKgotCQkgKiBUaGUgUEUgZW52aXJvbm1lbnQgdmFyaWFibGUgTVBfQlVGRkVSX01FTSBnZXRzCi0JCSAqIHNwZWNpYWwgaGFuZGxpbmcgc2luY2UgaXQgaXMgdGhlIG9ubHkgZW52aXJvbm1lbnQKLQkJICogdmFyaWFibGUgd2hpY2ggaGFzIHVwIHRvIDIgcGFyYW1ldGVycywgVGhlc2UgcGFyYW1ldGVycwotCQkgKiBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5IGluIHRoZSBHVUkgdG8gc2ltcGxpZnkKLQkJICogdmFsaWRhdGlvbi4gVGhlIEdVSSBzZW5kcyB0aGUgYXR0cmlidXRlcyBQRV9CVUZGRVJfTUVNCi0JCSAqIGFuZCBQRV9CVUZGRVJfTUVNX01BWCByZXByZXNlbnRpbmcgdGhlc2UgdHdvIHZhbHVlcy4KLQkJICogVGhpcyBjb2RlIG11c3QgcmUtYXNzZW1ibGUgdGhlIHBhcmFtZXRlcnMgaW50byBhIHByb3BlcgotCQkgKiBNUF9CVUZGRVJfTUVNIHNldHRpbmcgYW5kIGVuc3VyZSB0aGF0IHRoZSBlbnZpcm9ubWVudAotCQkgKiB2YXJpYWJsZSBnZXRzIHNldC4gU2luY2UgdGhlIHZhbHVlcyBwYXNzZWQgYnkgdGhlCi0JCSAqIEdVSSBtdXN0IG5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGFwcGxpY2F0aW9uLCB0aGUKLQkJICogZnJvbnQgZW5kIGlkZW50aWZpZXMgdGhlbSB3aXRoIGEgUEVfIHByZWZpeCBpbnN0ZWFkIG9mCi0JCSAqIHRoZSB1c3VhbCBNUF8gcHJlZml4LgotCQkgKiBNUF9SRE1BX0NPVU5UIGdldHMgc2ltaWxhciB0cmVhdG1lbnQsIHVzaW5nIEdVSSBhdHRyaWJ1dGVzCi0JCSAqIFBFX1JETUFfQ09VTlQgYW5kIFBFX1JETUFfQ09VTlRfMgotCQkgKi8KLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3NbaV0sICJQRV9CVUZGRVJfTUVNIikgPT0gMCkgewotCQkgICAgbXBfYnVmZmVyX21lbSA9IGNwICsgMTsKLQkJICAgIG1wX2J1ZmZlcl9tZW1fc2V0ID0gMTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgIlBFX0JVRkZFUl9NRU1fTUFYIikgPT0gMCkgewotCQkgICAgbXBfYnVmZmVyX21lbV9tYXggPSBjcCArIDE7Ci0JCSAgICBtcF9idWZmZXJfbWVtX3NldCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3NbaV0sICJQRV9SRE1BX0NPVU5UIikgPT0gMCkgewotCQkgICAgbXBfcmRtYV9jb3VudCA9IGNwICsgMTsKLQkJICAgIG1wX3JkbWFfY291bnRfc2V0ID0gMTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgIlBFX1JETUFfQ09VTlRfMiIpID09IDApIHsKLQkJICAgIG1wX3JkbWFfY291bnRfMiA9IGNwICsgMTsKLQkJICAgIG1wX3JkbWFfY291bnRfc2V0ID0gMTsKLQkJfQotI2lmZGVmIFBFX0RVQUxfUE9FX0RFQlVHCi0JCWVsc2UgaWYgKHN0cmNtcChhcmdzW2ldLCAiUEVfREVCVUdfTU9ERSIpID09IDApIHsKLQkJCWlmIChzdHJjYXNlY21wKGNwKzEsICJzZG0iKSA9PSAwKQotCQkJCWRlYnVnX3NkbV9tb2RlID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAoY3ArMSwgImR1YWwiKSA9PSAwKSB7Ci0JCQkJZGVidWdfZHVhbF9wb2VfbW9kZSsrOwotCQkJCWlmICghcG1kX2hlbHBlcikKLQkJCQkJcG1kX2hlbHBlciA9IFBNRF9IRUxQRVI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3NbaV0sICJQRV9ERUJVR19IRUxQRVIiKSA9PSAwKSB7Ci0JCQlwbWRfaGVscGVyID0gY3AgKyAxOwotCQl9Ci0jZW5kaWYKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgLyoKLQkgICAgICogTG9vayBmb3IgZ2VuZXJhbCBsYXVuY2ggY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYW5kIGhhbmRsZQotCSAgICAgKiBhcHByb3ByaWF0ZWx5Ci0JICAgICAqLwotCSAgICBjcCA9IHN0cmNocihhcmdzW2ldLCAnPScpOwotCSAgICBpZiAoY3AgIT0gTlVMTCkgewotCQkqY3AgPSAnXDAnOwotCQljcCA9IGNwICsgMTsKLQkJaWYgKHN0cmNtcChhcmdzW2ldLCBKT0JfU1VCX0lEX0FUVFIpID09IDApIHsKLQkJICAgIGpvYmlkID0gc3RyZHVwKGNwKTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgSk9CX0VYRUNfTkFNRV9BVFRSKSA9PSAwKSB7Ci0JCSAgICBleGVjbmFtZSA9IHN0cmR1cChjcCk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3NbaV0sIEpPQl9XT1JLSU5HX0RJUl9BVFRSKSA9PSAwKSB7Ci0JCQljd2QgPSBzdHJkdXAoY3ApOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmdzW2ldLCBKT0JfUFJPR19BUkdTX0FUVFIpID09IDApIHsKLQkJICAgIGFyZ3AgPSBzdHJkdXAoY3ApOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmdzW2ldLCBKT0JfRVhFQ19QQVRIX0FUVFIpID09IDApIHsKLQkJICAgIGV4ZWNkaXIgPSBzdHJkdXAoY3ApOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmdzW2ldLCBKT0JfRU5WX0FUVFIpID09IDApIHsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgSk9CX0RFQlVHX0VYRUNfTkFNRV9BVFRSKSA9PSAwKSB7Ci0JCSAgICBkZWJ1Z2dlcl9uYW1lID0gc3RyZHVwKGNwKTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgSk9CX0RFQlVHX0VYRUNfUEFUSF9BVFRSKSA9PSAwKSB7Ci0JCQlkZWJ1Z2dlcl9wYXRoID0gc3RyZHVwKGNwKTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgSk9CX0RFQlVHX0FSR1NfQVRUUikgPT0gMCkgewotCQkgICAgZGVidWdfYXJnc1tkZWJ1Z19hcmdfY291bnRdID0gc3RyZHVwKGNwKTsKLQkJICAgIGRlYnVnX2FyZ19jb3VudCA9IGRlYnVnX2FyZ19jb3VudCArIDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3NbaV0sIEpPQl9ERUJVR19GTEFHX0FUVFIpID09IDApIHsKLQkJICAgIGRlYnVnX3NkbV9tb2RlID0gMTsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoYXJnc1tpXSwgImRlYnVnU3RvcEluTWFpbiIpID09IDApIHsKLQkJfQotCQkqKGNwIC0gMSkgPSAnPSc7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGlmIChqb2JpZCA9PSBOVUxMKSB7Ci0gICAgCXBvc3RfZXJyb3IodHJhbnNfaWQsIFBST1hZX0VWX1JUX1NVQk1JVEpPQl9FUlJPUiwgIk1pc3NpbmcgSUQgb24gam9iIHN1Ym1pc3Npb24iKTsKLSAgICB9Ci0gICAgaWYgKGN3ZCAhPSBOVUxMKSB7Ci0gICAgCXN0YXR1cyA9IGNoZGlyKGN3ZCk7Ci0JICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKLQkJcG9zdF9zdWJtaXRqb2JfZXJyb3IodHJhbnNfaWQsIGpvYmlkLAotCQkJICAgIkludmFsaWQgd29ya2luZyBkaXJlY3RvcnkiKTsKLQkJVFJBQ0VfRVhJVDsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkgICAgfQotICAgIH0KLSAgICBpZiAobXBfYnVmZmVyX21lbV9zZXQpIHsKLQlzbnByaW50ZihtcF9idWZmZXJfbWVtX3ZhbHVlLCBzaXplb2YgbXBfYnVmZmVyX21lbV92YWx1ZSwKLQkJICJNUF9CVUZGRVJfTUVNPSVzJXMlcyIsIG1wX2J1ZmZlcl9tZW0sIChtcF9idWZmZXJfbWVtX21heFswXQotCQkJCQkJCSA9PSAnXDAnKSA/ICIiIDogIiwiLCBtcF9idWZmZXJfbWVtX21heCk7Ci0gICAgfQotICAgIGlmIChtcF9yZG1hX2NvdW50X3NldCkgewotCXNucHJpbnRmKG1wX3JkbWFfY291bnRfdmFsdWUsIHNpemVvZiBtcF9yZG1hX2NvdW50X3ZhbHVlLAotCQkgIk1QX1JETUFfQ09VTlQ9JXMlcyVzIiwgbXBfcmRtYV9jb3VudCwgKG1wX3JkbWFfY291bnRfMlswXQotCQkJCQkJCSA9PSAnXDAnKSA/ICIiIDogIiwiLCBtcF9yZG1hX2NvdW50XzIpOwotICAgIH0KLSAgICBpZiAoZXhlY2RpciA9PSBOVUxMKSB7Ci0gICAgcG9zdF9zdWJtaXRqb2JfZXJyb3IodHJhbnNfaWQsIGpvYmlkLCAiTm8gZXhlY3V0YWJsZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIik7Ci0JVFJBQ0VfRVhJVDsKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotICAgIH0KLSAgICBpZiAoZXhlY25hbWUgPT0gTlVMTCkgewotICAgIHBvc3Rfc3VibWl0am9iX2Vycm9yKHRyYW5zX2lkLCBqb2JpZCwgIk5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkIik7Ci0JVFJBQ0VfRVhJVDsKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotICAgIH0KLSAgICBqb2IgPSAoam9iaW5mbyAqKSBtYWxsb2Moc2l6ZW9mKGpvYmluZm8pKTsKLSAgICBtYWxsb2NfY2hlY2soam9iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBtZW1zZXQoam9iLCAwLCBzaXplb2Yoam9iaW5mbykpOwotI2lmZGVmIFBFX0RVQUxfUE9FX0RFQlVHCi0gICAgLypERUJVRyovCi0JaWYgKGRlYnVnX2R1YWxfcG9lX21vZGUpIHsKLQkJY2hhciAqZGVidWdnZXJfZnVsbF9wYXRoOwotCi0JCWRlYnVnX3NkbV9tb2RlID0gMDsJCQkvLyBkaXNhYmxlIFNETSBkZWJ1Z2dlciBsYXVuY2guCi0JCS8qCi0JCSAqIElmIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB0aGVuIHRyeSB0byBsb2NhdGUgZXhlY3VhYmxlLgotCQkgKi8KLQkJaWYgKGRlYnVnZ2VyX3BhdGggPT0gTlVMTCB8fCBkZWJ1Z2dlcl9uYW1lID09IE5VTEwpIHsKLQkJCXBvc3Rfc3VibWl0am9iX2Vycm9yKHRyYW5zX2lkLCBqb2JpZCwgIkRlYnVnZ2VyIGV4ZWN1dHVhYmxlIG5vdCBmb3VuZCIpOwotCQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkJfSBlbHNlIHsKLQkJCWFzcHJpbnRmKCZkZWJ1Z2dlcl9mdWxsX3BhdGgsICIlcy8lcyIsIGRlYnVnZ2VyX3BhdGgsIGRlYnVnZ2VyX25hbWUpOwotCQl9Ci0KLQkJaWYgKGFjY2VzcyhkZWJ1Z2dlcl9mdWxsX3BhdGgsIFhfT0spIDwgMCkgewotCQkJcG9zdF9zdWJtaXRqb2JfZXJyb3IodHJhbnNfaWQsIGpvYmlkLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkJfQotCi0JICAgIGRlYnVnZ2VyX2pvYiA9IChqb2JpbmZvICopIG1hbGxvYyhzaXplb2Yoam9iaW5mbykpOwotCSAgICBtYWxsb2NfY2hlY2soZGVidWdnZXJfam9iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQkgICAgbWVtc2V0KGRlYnVnZ2VyX2pvYiwgMCwgc2l6ZW9mKGpvYmluZm8pKTsKLQkgICAgZGVidWdnZXJfam9iLT5kZWJ1Z2dlZV9qb2IgPSBqb2I7Ci0JICAgIGpvYi0+ZGVidWdnZXJfam9iID0gZGVidWdnZXJfam9iOwotCi0JICAgIFRSQUNFX0RFVEFJTCgiKysrIEZvcmtpbmcgcG9lL2RlYnVnZ2VyIHByb2Nlc3NcbiIpOwotCSAgICBwaWQgPSBmb3JrKCk7Ci0JICAgIGlmIChwaWQgPT0gMCkgewotCSAgICAJY2hhciAqKmRlYnVnZ2VyX2FyZ3M7Ci0JICAgIAljaGFyICoqZGVidWdnZXJfZW52cDsKLQkgICAgCWludCBtYXhfZmQ7Ci0JICAgIAlpbnQgYTsKLQotCSAgICAJZGVidWdfYXJnX2NvdW50Kys7Ci0JCQlkZWJ1Z2dlcl9hcmdzID0gKGNoYXIgKiopbWFsbG9jKChkZWJ1Z19hcmdfY291bnQrMykgKiBzaXplb2YoY2hhciAqKSk7Ci0JCQlkZWJ1Z2dlcl9hcmdzWzBdID0gUE9FOwotCQkJZGVidWdnZXJfYXJnc1sxXSA9IGRlYnVnZ2VyX2Z1bGxfcGF0aDsKLQkJCS8qIFVzZSAtLWpvYmlkIHRvIGluZm9ybSBub2RlIGVsZW1lbnRzIG9mIGRlYnVnZ2VyIHdoYXQgdGhlaXIgcG9lIHBpZCBpcy4KLQkJCSAqIFRoaXMgJ2pvYmlkJyB3aWxsIGJlIHVzZWQgdG8gc2V0IHVwIGEgbWVzc2FnZSBxdWV1ZSB0byBhY2NlcHQgY29ubmVjdGlvbnMKLQkJCSAqIGZyb20gdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3Mgd2hlbiBpdCBsYXVuY2hlcyBvbiB0aGUgbm9kZS4KLQkJCSAqLwotCQkJYXNwcmludGYoJmRlYnVnZ2VyX2FyZ3NbMl0sICItLWpvYmlkPSVkIiwgZ2V0cGlkKCkpOwotCQkJZm9yIChpID0gMCwgYSA9IDM7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCQkJaWYgKHN0cm5jbXAoYXJnc1tpXSwgSk9CX0RFQlVHX0FSR1NfQVRUUiwgc3RybGVuKEpPQl9ERUJVR19BUkdTX0FUVFIpKSA9PSAwKSB7Ci0JCQkJCWRlYnVnZ2VyX2FyZ3NbYV0gPSBzdHJjaHIoYXJnc1tpXSwgJz0nKSArIDE7Ci0JCQkJCWErKzsKLQkJCQl9Ci0JCQl9Ci0JCQlkZWJ1Z2dlcl9hcmdzW2FdID0gTlVMTDsKLQotCQkJc25wcmludGYocGVfZGVidWdnZXJfaWQsIHNpemVvZiBwZV9kZWJ1Z2dlcl9pZCwgIlBFX0RFQlVHR0VSX0lEPSVkIiwgZ2V0cGlkKCkpOwotCQkJZGVidWdnZXJfZW52cCA9IGNyZWF0ZV9lbnZfYXJyYXkoYXJncywgMCwgTlVMTCwgTlVMTCwgcGVfZGVidWdnZXJfaWQsIDEpOwotCi0JCQltYXhfZmQgPSBzeXNjb25mKF9TQ19PUEVOX01BWCk7Ci0JCQlmb3IgKGkgPSBTVERFUlJfRklMRU5PICsgMTsgaSA8IG1heF9mZDsgaSsrKSB7Ci0JCQkgICAgY2xvc2UoaSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogSW52b2tlIHRoZSBkZWJ1Z2dlciBhcyBhIHRhcmdldCBvZiAncG9lJwotCQkJICovCi0JCQlUUkFDRV9ERVRBSUxfVigiKysrIFJlYWR5IHRvIGludm9rZSBkZWJ1Z2dlciAlc1xuIiwgZGVidWdnZXJfZnVsbF9wYXRoKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKGRlYnVnZ2VyX2VudnBbaV0gIT0gTlVMTCkgewotCQkJICAgIFRSQUNFX0RFVEFJTF9WKCJUYXJnZXQgZGVidWdnZXJfZW52cFslZF06ICVzXG4iLCBpLCBkZWJ1Z2dlcl9lbnZwW2ldKTsKLQkJCSAgICBpKys7Ci0JCQl9Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChkZWJ1Z2dlcl9hcmdzW2ldICE9IE5VTEwpIHsKLQkJCSAgICBUUkFDRV9ERVRBSUxfVigiVGFyZ2V0IGRlYnVnZ2VyX2FyZ3NbJWRdOiAlc1xuIiwgaSwgZGVidWdnZXJfYXJnc1tpXSk7Ci0JCQkgICAgaSsrOwotCQkJfQotCQkJc3RhdHVzID0gZXhlY3ZlKFBPRSwgZGVidWdnZXJfYXJncywgZGVidWdnZXJfZW52cCk7Ci0JCQlwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICIlcyBmYWlsZWQgdG8gZXhlY3V0ZSwgc3RhdHVzICVzXG4iLCBkZWJ1Z2dlcl9hcmdzWzBdLCBzdHJlcnJvcihlcnJubykpOwotCQkJcG9zdF9zdWJtaXRqb2JfZXJyb3IodHJhbnNfaWQsIGpvYmlkLCAiRXhlYyBmYWlsZWQiKTsKLQkJCVRSQUNFX0VYSVQ7Ci0JCQlleGl0KDEpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHBpZCA9PSAtMSkgewotCQkgICAgcG9zdF9zdWJtaXRqb2JfZXJyb3IodHJhbnNfaWQsIGpvYmlkLCAiRGVidWdnZXIgZm9yayBmYWlsZWQiKTsKLQkJICAgIHJldHVybiBQUk9YWV9SRVNfT0s7Ci0JCX0KLQkgICAgLyogUGFyZW50IGNvbnRpbnVlcyBvbi4uLiAqLwotCQkvKiBBdWdtZW50IHRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IHRvIGluY2x1ZGUgYSBkZWJ1ZyBtYXJrZXIgYmFzZWQgdXBvbiB0aGUgcG9lIHBpZCBvZiB0aGUgZGVidWdnZXIuICovCi0JCXNucHJpbnRmKHBlX2RlYnVnZ2VyX2lkLCBzaXplb2YgcGVfZGVidWdnZXJfaWQsICJQRV9ERUJVR0dFUl9JRD0lZCIsIHBpZCk7Ci0JCWRlYnVnZ2VyX2pvYi0+cG9lX3BpZCA9IHBpZDsKLQkJLyogVE9ETzogRG8gc29tZSBtb3JlIGluaXRpYWxpemF0aW9uIG9mIGRlYnVnZ2VyX2pvYiBoZXJlICovCi0JfQotI2VuZGlmCi0gICAgVFJBQ0VfREVUQUlMKCIrKysgU2V0dGluZyB1cCBzdGRpbyBwaXBlIGRlc2NyaXB0b3JzXG4iKTsKLSAgICBUUkFDRV9ERVRBSUxfVigiKysrIHN0ZG91dCBwYXRoOiAlc1xuIiwgc3Rkb3V0X3BhdGggPT0gTlVMTCA/ICJOVUxMIiA6IHN0ZG91dF9wYXRoKTsKLSAgICBUUkFDRV9ERVRBSUxfVigiKysrIHN0ZGVyciBwYXRoOiAlc1xuIiwgc3RkZXJyX3BhdGggPT0gTlVMTCA/ICJOVUxMIiA6IHN0ZGVycl9wYXRoKTsKLSAgICAvKgotICAgICAqIFNldCB1cCBwaXBlcyBvciBmaWxlcyB0byBoYW5kbGUgc3RkaW8gZm9yIGFwcGxpY2F0aW9uLiBJZiB0aGUgcGF0aAotICAgICAqIGZvciBhIGZpbGUgaXMgbnVsbCwgdGhlbiB0aGF0IGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8KLSAgICAgKiBhIHBpcGUuCi0gICAgICogSGFuZGxlIGZpbGUgZGVzY3JpcHRvciBzZXR1cCBmb3Igc3Rkb3V0IGZpcnN0Ci0gICAgICovCi0gICAgc3RhdHVzID0KLQlzZXR1cF9zdGRpb19mZCh0cmFuc19pZCwgam9iaWQsIHN0ZG91dF9waXBlLCBzdGRvdXRfcGF0aCwgInN0ZG91dCIsICYoam9iLT5zdGRvdXRfZmQpLCAmcmVkaXJlY3QpOwotICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKLQlUUkFDRV9FWElUOwotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0gICAgfQotICAgIGpvYi0+c3Rkb3V0X3JlZGlyZWN0ID0gcmVkaXJlY3Q7Ci0gICAgVFJBQ0VfREVUQUlMX1YoInN0ZG91dCBGRCAlZCAlZFxuIiwgc3Rkb3V0X3BpcGVbMF0sIHN0ZG91dF9waXBlWzFdKTsKLSAgICBzdGF0dXMgPQotCXNldHVwX3N0ZGlvX2ZkKHRyYW5zX2lkLCBqb2JpZCwgc3RkZXJyX3BpcGUsIHN0ZGVycl9wYXRoLCAic3RkZXJyIiwgJihqb2ItPnN0ZGVycl9mZCksICZyZWRpcmVjdCk7Ci0gICAgaWYgKHN0YXR1cyA9PSAtMSkgewotCVRSQUNFX0VYSVQ7Ci0JcmV0dXJuIFBST1hZX1JFU19PSzsKLSAgICB9Ci0gICAgam9iLT5zdGRlcnJfcmVkaXJlY3QgPSByZWRpcmVjdDsKLSAgICBUUkFDRV9ERVRBSUxfVigic3RkZXJyIEZEICVkICVkXG4iLCBzdGRlcnJfcGlwZVswXSwgc3RkZXJyX3BpcGVbMV0pOwotICAgIGpvYi0+c3VibWl0X2pvYmlkID0gam9iaWQ7Ci0gICAgam9iLT5sYWJlbF9pbyA9IGxhYmVsX2lvOwotICAgIGpvYi0+c3BsaXRfaW8gPSBzcGxpdF9pbzsKLSAgICBqb2ItPnN0ZG91dF9pbmZvLnJlYWRfYnVmID0gKGNoYXIgKikgbWFsbG9jKFJFQURfQlVGRkVSX1NJWkUpOwotICAgIG1hbGxvY19jaGVjayhqb2ItPnN0ZG91dF9pbmZvLnJlYWRfYnVmLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBqb2ItPnN0ZG91dF9pbmZvLndyaXRlX2J1ZiA9IChjaGFyICopIG1hbGxvYyhTVERJT19XUklURV9CVUZTSVpFKTsKLSAgICBtYWxsb2NfY2hlY2soam9iLT5zdGRvdXRfaW5mby53cml0ZV9idWYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIGpvYi0+c3Rkb3V0X2luZm8uYWxsb2NhdGVkID0gU1RESU9fV1JJVEVfQlVGU0laRTsKLSAgICBqb2ItPnN0ZG91dF9pbmZvLnJlbWFpbmluZyA9IFNURElPX1dSSVRFX0JVRlNJWkUgLSAxOwotICAgIGpvYi0+c3Rkb3V0X2luZm8uY3AgPSBqb2ItPnN0ZG91dF9pbmZvLndyaXRlX2J1ZjsKLSAgICBqb2ItPnN0ZG91dF9pbmZvLndyaXRlX2Z1bmMgPSBzZW5kX3N0ZG91dDsKLSAgICBqb2ItPnN0ZGVycl9pbmZvLnJlYWRfYnVmID0gKGNoYXIgKikgbWFsbG9jKFJFQURfQlVGRkVSX1NJWkUpOwotICAgIG1hbGxvY19jaGVjayhqb2ItPnN0ZGVycl9pbmZvLnJlYWRfYnVmLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBqb2ItPnN0ZGVycl9pbmZvLndyaXRlX2J1ZiA9IChjaGFyICopIG1hbGxvYyhTVERJT19XUklURV9CVUZTSVpFKTsKLSAgICBtYWxsb2NfY2hlY2soam9iLT5zdGRlcnJfaW5mby53cml0ZV9idWYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIGpvYi0+c3RkZXJyX2luZm8uYWxsb2NhdGVkID0gU1RESU9fV1JJVEVfQlVGU0laRTsKLSAgICBqb2ItPnN0ZGVycl9pbmZvLnJlbWFpbmluZyA9IFNURElPX1dSSVRFX0JVRlNJWkUgLSAxOwotICAgIGpvYi0+c3RkZXJyX2luZm8uY3AgPSBqb2ItPnN0ZGVycl9pbmZvLndyaXRlX2J1ZjsKLSAgICBqb2ItPnN0ZGVycl9pbmZvLndyaXRlX2Z1bmMgPSBzZW5kX3N0ZGVycjsKLSAgICBqb2ItPmRpc2NvdmVyZWRfam9iID0gMDsKLSAgICBlbnZwID0gY3JlYXRlX2Vudl9hcnJheShhcmdzLCBzcGxpdF9pbywgbXBfYnVmZmVyX21lbV92YWx1ZSwgbXBfcmRtYV9jb3VudF92YWx1ZSwgcGVfZGVidWdnZXJfaWQsIDApOwotICAgIFRSQUNFX0RFVEFJTCgiKysrIEZvcmtpbmcgY2hpbGQgcHJvY2Vzc1xuIik7Ci0gICAgcGlkID0gZm9yaygpOwotICAgIGlmIChwaWQgPT0gMCkgewotCWNoYXIgKiphcmd2OwotCWNoYXIgcG9lX3RhcmdldFtfUE9TSVhfUEFUSF9NQVggKiAyICsgMl07Ci0JaW50IG1heF9mZDsKLQotCXNucHJpbnRmKHBvZV90YXJnZXQsIHNpemVvZiBwb2VfdGFyZ2V0LCAiJXMvJXMiLCBleGVjZGlyLCBleGVjbmFtZSk7Ci0JcG9lX3RhcmdldFtzaXplb2YgcG9lX3RhcmdldCAtIDFdID0gJ1wwJzsKLQkvKgotCSAqIFNldCB1cCBleGVjdXRhYmxlIGFyZ3VtZW50IGxpc3QgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcyBmaXJzdAotCSAqIHNpbmNlIHRoZXJlIGlzIGEgc21hbGwgdGltaW5nIHdpbmRvdyB3aGVyZSBhIHNlY29uZCBydW4gY29tbWFuZAotCSAqIGNvdWxkIGJlIHByb2Nlc3NlZCB3aGlsZSB0aGlzIHByb2Nlc3MgaXMgc3RpbGwgc2V0dGluZyB1cCBwYXJhbWV0ZXJzCi0JICogZm9yIHRoZSBmaXJzdCBydW4sIHJlc3VsdGluZyBpbiBtb2RpZmljYXRpb24gb2YgdGhlIGZpcnN0IHByb2dyYW0ncwotCSAqIHBhcmFtZXRlcnMgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQkgKi8KLQlUUkFDRV9ERVRBSUxfVigiKysrIENyZWF0aW5nIHBvZSBleGVjKCkgcGFyYW1ldGVyIGxpc3QgJXNcbiIsIHBtZF9oZWxwZXIgPyAid2l0aCBwbWRoZWxwZXIiIDogIiIpOwotCWlmIChkZWJ1Z19zZG1fbW9kZSkgewotCSAgICBhcmd2ID0gY3JlYXRlX2NoaWxkX3NkbV9wYXJtbGlzdChkZWJ1Z2dlcl9wYXRoLCBkZWJ1Z2dlcl9uYW1lLCBkZWJ1Z19hcmdfY291bnQsIGRlYnVnX2FyZ3MpOwotCX0KLQllbHNlIHsKLQkgICAgYXJndiA9IGNyZWF0ZV9leGVjX3Bhcm1saXN0KFBPRSwgcG9lX3RhcmdldCwgYXJncCwgcG1kX2hlbHBlcik7Ci0JfQotCS8qCi0JICogQ29ubmVjdCBzdGRpbyB0byBwaXBlcyBvciBmaWxlcyBvd25lZCBieSBwYXJlbnQgcHJvY2VzcyAodGhlCi0JICogcHJveHkpCi0JICovCi0JVFJBQ0VfREVUQUlMKCIrKysgU2V0dGluZyB1cCBwb2Ugc3RkaW8gZmlsZSBkZXNjcmlwdG9yc1xuIik7Ci0Jc3RhdHVzID0KLQkgICAgc2V0dXBfY2hpbGRfc3RkaW8odHJhbnNfaWQsIGpvYmlkLCBTVERPVVRfRklMRU5PLCBqb2ItPnN0ZG91dF9yZWRpcmVjdCwgJihqb2ItPnN0ZG91dF9mZCksCi0JCQkgICAgICBzdGRvdXRfcGlwZSk7Ci0JaWYgKHN0YXR1cyA9PSAtMSkgewotCSAgICBUUkFDRV9FWElUOwotCSAgICBleGl0KDEpOwotCX0KLQlzdGF0dXMgPQotCSAgICBzZXR1cF9jaGlsZF9zdGRpbyh0cmFuc19pZCwgam9iaWQsIFNUREVSUl9GSUxFTk8sIGpvYi0+c3RkZXJyX3JlZGlyZWN0LCAmKGpvYi0+c3RkZXJyX2ZkKSwKLQkJCSAgICAgIHN0ZGVycl9waXBlKTsKLQlpZiAoc3RhdHVzID09IC0xKSB7Ci0JICAgIFRSQUNFX0VYSVQ7Ci0JICAgIGV4aXQoMSk7Ci0JfQotCS8qCi0JICogQ2xvc2UgYWxsIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBhYm92ZSBzdGRlcnIuCi0JICovCi0JbWF4X2ZkID0gc3lzY29uZihfU0NfT1BFTl9NQVgpOwotCWZvciAoaSA9IFNUREVSUl9GSUxFTk8gKyAxOyBpIDwgbWF4X2ZkOyBpKyspIHsKLQkgICAgY2xvc2UoaSk7Ci0JfQotCS8qCi0JICogSW52b2tlIHRoZSBhcHBsaWNhdGlvbiBhcyBhIHRhcmdldCBvZiAncG9lJwotCSAqLwotCVRSQUNFX0RFVEFJTF9WKCIrKysgUmVhZHkgdG8gaW52b2tlICVzXG4iLCBwb2VfdGFyZ2V0KTsKLQlpID0gMDsKLQl3aGlsZSAoZW52cFtpXSAhPSBOVUxMKSB7Ci0JICAgIFRSQUNFX0RFVEFJTF9WKCJUYXJnZXQgZW52WyVkXTogJXNcbiIsIGksIGVudnBbaV0pOwotCSAgICBpID0gaSArIDE7Ci0JfQotCWkgPSAwOwotCXdoaWxlIChhcmd2W2ldICE9IE5VTEwpIHsKLQkgICAgVFJBQ0VfREVUQUlMX1YoIlRhcmdldCBhcmdbJWRdOiAlc1xuIiwgaSwgYXJndltpXSk7Ci0JICAgIGkgPSBpICsgMTsKLQl9Ci0Jc3RhdHVzID0gZXhlY3ZlKCIvdXNyL2Jpbi9wb2UiLCBhcmd2LCBlbnZwKTsKLQlwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICIlcyBmYWlsZWQgdG8gZXhlY3V0ZSwgc3RhdHVzICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOwotCXBvc3Rfc3VibWl0am9iX2Vycm9yKHRyYW5zX2lkLCBqb2JpZCwgIkV4ZWMgZmFpbGVkIik7Ci0JVFJBQ0VfRVhJVDsKLQlleGl0KDEpOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAocGlkID09IC0xKSB7Ci0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLSAgICAgICAgICAgIGlmIChkZWJ1Z19kdWFsX3BvZV9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgLyogVE9ETzogVGFrZSBkb3duIGRlYnVnZ2VyIHBvZS4gKi8KLSAgICAgICAgICAgIH0KLSNlbmRpZgotCSAgICBwb3N0X3N1Ym1pdGpvYl9lcnJvcih0cmFuc19pZCwgam9iaWQsICJGb3JrIGZhaWxlZCIpOwotCSAgICByZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQllbHNlIHsKLSNpZmRlZiBQRV9EVUFMX1BPRV9ERUJVRwotICAgICAgICAgICAgaWYgKGRlYnVnX2R1YWxfcG9lX21vZGUpIHsKLSAgICAgICAgICAgICAgICBqb2JfZW5xdWV1ZShkZWJ1Z2dlcl9qb2IsIGRlYnVnZ2VyX2pvYi0+cG9lX3BpZCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQkgICAgaWYgKCFqb2ItPnN0ZG91dF9yZWRpcmVjdCkgewotCQljbG9zZShzdGRvdXRfcGlwZVsxXSk7Ci0JICAgIH0KLQkgICAgaWYgKCFqb2ItPnN0ZGVycl9yZWRpcmVjdCkgewotCQljbG9zZShzdGRlcnJfcGlwZVsxXSk7Ci0JICAgIH0KLSAgICAgICAgICAgIGpvYi0+ZGVidWdnaW5nID0gZGVidWdfc2RtX21vZGU7Ci0gICAgICAgICAgICBpZiAoZGVidWdfc2RtX21vZGUpIHsKLSAgICAgICAgICAgICAgICBqb2ItPnNkbV9lbnZwID0gZW52cDsKLSAgICAgICAgICAgICAgICBqb2ItPnNkbV9kZWJ1Z2RpciA9IGRlYnVnZ2VyX3BhdGg7Ci0gICAgICAgICAgICAgICAgam9iLT5zZG1fZGVidWduYW1lID0gZGVidWdnZXJfbmFtZTsKLSAgICAgICAgICAgICAgICBqb2ItPnNkbV9kZWJ1Z2FyZ3MgPSBkZWJ1Z19hcmdzOwotICAgICAgICAgICAgICAgIGpvYi0+c2RtX2RlYnVnX2FyZ19jb3VudCA9IGRlYnVnX2FyZ19jb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGpvYl9lbnF1ZXVlKGpvYiwgcGlkKTsKLQl9Ci0gICAgfQotICAgIHNlbmRfb2tfZXZlbnQodHJhbnNfaWQpOwotICAgIFRSQUNFX0VYSVQ7Ci0gICAgcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotaW50Ci1QRV9oYWx0X2V2ZW50cyhpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKQotewotICAgIC8qCi0gICAgICogU2V0IGZsYWcgaW5kaWNhdGluZyBldmVudHMgYXJlIHNodXQgZG93biwgYW5kIHNlbmQgT0sgYWNrcyBmb3IKLSAgICAgKiBib3RoIHRoZSBzdGFydF9ldmVudHMgYW5kIHN0b3BfZXZlbnRzIGNvbW1hbmRzIG5vdy4gT25jZSB0aGUKLSAgICAgKiBhY2sgZm9yIHRoZSBzdGFydF9ldmVudHMgY29tbWFuZCBpcyBzZW50LCB0aGUgc3RhcnRfZXZlbnRzCi0gICAgICogdHJhbnNhY3Rpb24gaWQgaXMgbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqLwotICAgIFRSQUNFX0VOVFJZOwotICAgIHByaW50X21lc3NhZ2VfYXJncyhuYXJncywgYXJncyk7Ci0gICAgZXZlbnRzX2VuYWJsZWQgPSAwOwotICAgIHNlbmRfb2tfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQpOwotICAgIHNlbmRfb2tfZXZlbnQodHJhbnNfaWQpOwotICAgIFRSQUNFX0VYSVQ7Ci0gICAgcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotaW50Ci1QRV90ZXJtaW5hdGVfam9iKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICphcmdzW10pCi17Ci0gICAgLyoKLSAgICAgKiBUZXJtaW5hdGUgdGhlIGFwcGxpY2F0aW9uLiBUaGUgaW5pdGlhbCBraWxsIGlzIFNJR1RFUk0uIElmIHRoYXQKLSAgICAgKiBkb2Vzbid0IHdvcmssIHRoZW4gYSBzZXBhcmF0ZSB0aHJlYWQgaXNzdWVzIGEga2lsbCAtOSBvbmUgbWludXRlCi0gICAgICogbGF0ZXIuCi0gICAgICovCi0gICAgcHRocmVhZF90IGtpbGxfdGlkOwotICAgIGpvYmluZm8gKmpvYjsKLSAgICBpbnQgam9iX2lkZW50ID0gLTE7Ci0gICAgaW50IGk7Ci0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmam9iX2xvY2spOwotICAgIFNldExpc3Qoam9icyk7Ci0gICAgam9iID0gR2V0TGlzdEVsZW1lbnQoam9icyk7Ci0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKLQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKEpPQl9JRF9BVFRSLCBhcmdzW2ldKSkgewotCQkJam9iX2lkZW50ID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9pbnQoYXJnc1tpXSk7Ci0JCX0KLQl9Ci0gICAgd2hpbGUgKGpvYiAhPSBOVUxMKSB7Ci0JaWYgKGpvYl9pZGVudCA9PSBqb2ItPnByb3h5X2pvYmlkKSB7Ci0JICAgIGJyZWFrOwotCX0KLQlqb2IgPSBHZXRMaXN0RWxlbWVudChqb2JzKTsKLSAgICB9Ci0gICAgaWYgKGpvYiAhPSBOVUxMKSB7Ci0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLSAgICAJLyogSXMgdGhpcyBhIGRlYnVnZ2VyIGpvYj8gKi8KLSAgICAJaWYgKGpvYi0+ZGVidWdnZWVfam9iKSB7Ci0gICAgCQlqb2JpbmZvICpkZWJ1Z2dlZV9qb2IgPSBqb2ItPmRlYnVnZ2VlX2pvYjsKLSAgICAJCWpvYi0+ZGVidWdnZWVfam9iID0gTlVMTDsKLSAgICAJCWtpbGwgKGRlYnVnZ2VlX2pvYi0+cG9lX3BpZCwgU0lHVEVSTSk7Ci0gICAgCQlwdGhyZWFkX2NyZWF0ZSgma2lsbF90aWQsICZ0aHJlYWRfYXR0cnMsIGtpbGxfcHJvY2VzcywgKHZvaWQgKikgZGVidWdnZWVfam9iLT5wb2VfcGlkKTsKLSAgICAJfQotI2VuZGlmCi0Ja2lsbChqb2ItPnBvZV9waWQsIFNJR1RFUk0pOwotCS8qCi0JICogQ3JlYXRlIGEgdGhyZWFkIHRvIGtpbGwgdGhlIHByb2Nlc3Mgd2l0aCBraWxsKDkpIGlmIHRoZQotCSAqIHRhcmdldCBwcm9jZXNzIGlzIHN0aWxsIGFyb3VuZCBhZnRlciAxIG1pbnV0ZS4KLQkgKi8KLQlwdGhyZWFkX2NyZWF0ZSgma2lsbF90aWQsICZ0aHJlYWRfYXR0cnMsIGtpbGxfcHJvY2VzcywgKHZvaWQgKikgam9iLT5wb2VfcGlkKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmpvYl9sb2NrKTsKLSAgICBzZW5kX29rX2V2ZW50KHRyYW5zX2lkKTsKLSAgICBUUkFDRV9FWElUOwotICAgIHJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLWludAotUEVfcXVpdChpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqYXJnc1tdKQotewotICAgIHZvaWQgKnRocmVhZF9zdGF0dXM7Ci0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBwcmludF9tZXNzYWdlX2FyZ3MobmFyZ3MsIGFyZ3MpOwotI2lmZGVmIEhBVkVfTExBUElfSAotICAgIGlmICh1c2VfbG9hZF9sZXZlbGVyKSB7Ci0JZGxjbG9zZShpYm1sbF9saWJwYXRoX2hhbmRsZSk7Ci0Jc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID0gMTsKLSAgICB9Ci0jZW5kaWYKLSAgICBwdGhyZWFkX2NhbmNlbCh0ZXJtaW5hdGlvbl90aHJlYWQpOwotICAgIHB0aHJlYWRfam9pbih0ZXJtaW5hdGlvbl90aHJlYWQsICZ0aHJlYWRfc3RhdHVzKTsKLSAgICBlbnF1ZXVlX2V2ZW50KHByb3h5X3NodXRkb3duX2V2ZW50KHRyYW5zX2lkKSk7Ci0gICAgaWYgKHJ1bl9taW5pcHJveHkpIHsKLQlyZWRpcmVjdF9pbygpOwotICAgIH0KLSAgICBzaHV0ZG93bl9yZXF1ZXN0ZWQgPSAxOwotICAgIFRSQUNFX0VYSVQ7Ci0gICAgcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEpvYiBzdXBwb3J0IHJvdXRpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWpvYl9lbnF1ZXVlKGpvYmluZm8gKmpvYiwgcGlkX3QgcGlkKQotewotICAgIGNoYXIgam9ibmFtZVs0MF07Ci0gICAgY2hhciBxdWV1ZV9pZF9zdHJbMTJdOwotICAgIGNoYXIgam9iaWRfc3RyWzEyXTsKLQotICAgIC8qCi0gICAgICogVXBkYXRlIGpvYiBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb24gYW5kIG5vdGlmeSBmcm9udCBlbmQgdGhhdCBqb2IgaXMgc3RhcnRlZC4KLSAgICAgKi8KLSAgICBqb2ItPnRhc2tzID0gTlVMTDsKLSAgICBqb2ItPnBvZV9waWQgPSBwaWQ7Ci0gICAgam9iLT50YXNrMF9waWQgPSAtMTsKLSAgICBqb2ItPnN1Ym1pdF90aW1lID0gdGltZShOVUxMKTsKLSAgICBqb2ItPnByb3h5X2pvYmlkID0gZ2VuZXJhdGVfaWQoKTsKLSAgICBUUkFDRV9ERVRBSUxfVigiKysrIENyZWF0ZWQgcG9lIHByb2Nlc3MgcGlkICVkIGZvciBqb2JpZCAlZFxuIiwgam9iLT5wb2VfcGlkLCBqb2ItPnByb3h5X2pvYmlkKTsKLSAgICAvKgotICAgICAqIENyZWF0ZSB0aHJlYWQgdG8gd2F0Y2ggZm9yIGFwcGxpY2F0aW9uJ3MgYXR0YWNoLmNmZyBmaWxlIHRvIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHRocmVhZF9jcmVhdGUoJmpvYi0+c3RhcnR1cF90aHJlYWQsICZ0aHJlYWRfYXR0cnMsIHN0YXJ0dXBfbW9uaXRvciwgam9iKTsKLSAgICBBZGRUb0xpc3Qoam9icywgam9iKTsKLSNpZmRlZiBQRV9EVUFMX1BPRV9ERUJVRwotICAgIGlmIChqb2ItPmRlYnVnZ2VlX2pvYikKLSAgICAJcmV0dXJuOwkJLy8gRG9uJ3QgcmVwb3J0IGRlYnVnZ2VyCi0jZW5kaWYKLSAgICBzbnByaW50Zihqb2JuYW1lLCBzaXplb2Ygam9ibmFtZSwgIiVzLiVzIiwgbXlfdXNlcm5hbWUsIGpvYi0+c3VibWl0X2pvYmlkKTsKLSAgICBqb2JuYW1lW3NpemVvZiBqb2JuYW1lIC0gMV0gPSAnXDAnOwotICAgIHNwcmludGYocXVldWVfaWRfc3RyLCAiJWQiLCBxdWV1ZV9pZCk7Ci0gICAgc3ByaW50Zihqb2JpZF9zdHIsICIlZCIsIGpvYi0+cHJveHlfam9iaWQpOwotICAgIGVucXVldWVfZXZlbnQocHJveHlfbmV3X2pvYl9ldmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwKLQkJCQkgICAgICBxdWV1ZV9pZF9zdHIsIGpvYmlkX3N0ciwgam9ibmFtZSwgSk9CX1NUQVRFX0lOSVQsCi0JCQkJICAgICAgam9iLT5zdWJtaXRfam9iaWQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNlcnZpY2UgdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKgotc3RhcnR1cF9tb25pdG9yKHZvaWQgKmpvYl9pZGVudCkKLXsKLSAgICAvKgotICAgICAqIFdhaXQgZm9yIHRoZSBhdHRhY2guY2ZnIGZpbGUgZm9yIHRoaXMgdGFzayB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZAotICAgICAqIGluLCB0aGVuIHJlYWQgYW5kIHBhcnNlIGl0IHRvIGJ1aWxkIHRoZSBtYXAgb2YgdGFza3MgdG8gbm9kZXMgZm9yCi0gICAgICogdGhpcyBhcHBsaWNhdGlvbgotICAgICAqLwotICAgIGNoYXIgdGFza2xpc3RfcGF0aFtfUE9TSVhfUEFUSF9NQVggKyAxXTsKLSAgICBjaGFyICpjZmdpbmZvOwotICAgIEZJTEUgKmNmZ2ZpbGU7Ci0gICAgaW50IG51bXRhc2tzOwotICAgIHRhc2tpbmZvICp0YXNrczsKLSAgICB0YXNraW5mbyAqdGFza3A7Ci0gICAgam9iaW5mbyAqam9iOwotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGludCBzdGF0dXM7Ci0gICAgaW50IGRvbmU7Ci0gICAgdGltZV90IGxhc3RfbXRpbWU7Ci0gICAgc3RydWN0IHN0YXQgZmlsZWluZm87Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqcHJveHlfdGFza2lkOwotICAgIExpc3QgKm5ld19ub2RlczsKLSAgICBMaXN0ICp0YXNraWRfbGlzdDsKLSAgICBjaGFyIGpvYmlkX3N0clszMF07Ci0gICAgY2hhciBwcm9jaWRfc3RyWzEyXTsKLSAgICBjaGFyIHByb2NuYW1lWzIwXTsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGpvYiA9IChqb2JpbmZvICopIGpvYl9pZGVudDsKLSAgICBpZiAoam9iLT5kaXNjb3ZlcmVkX2pvYikgewotCW5ld19ub2RlcyA9IE5ld0xpc3QoKTsKLSAgICB9Ci0gICAgdGFza2lkX2xpc3QgPSBOZXdMaXN0KCk7Ci0gICAgc25wcmludGYodGFza2xpc3RfcGF0aCwgc2l6ZW9mIHRhc2tsaXN0X3BhdGgsICIvdG1wLy5wcGUuJWQuYXR0YWNoLmNmZyIsIGpvYi0+cG9lX3BpZCk7Ci0gICAgdGFza2xpc3RfcGF0aFtzaXplb2YgdGFza2xpc3RfcGF0aCAtIDFdID0gJ1wwJzsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX0RFVEFJTF9NRVNTQUdFLCAiV2FpdGluZyBmb3IgdGFzayBjb25maWcgZmlsZSAlc1xuIiwgdGFza2xpc3RfcGF0aCk7Ci0gICAgbGFzdF9tdGltZSA9IC0xOwotICAgIC8qCi0gICAgICogV2FpdCBmb3IgdGhlIGF0dGFjaC5jZmcgZmlsZSB0byBiZSBjcmVhdGVkIGFuZCB0byBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiB3aXRoaW4gdGhlIGxhc3Qgc2Vjb25kIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBhbmQgcGFyc2UgaXQKLSAgICAgKi8KLSAgICBmb3IgKDs7KSB7Ci0Jc2xlZXAoMSk7Ci0Jc3RhdHVzID0gc3RhdCh0YXNrbGlzdF9wYXRoLCAmZmlsZWluZm8pOwotCWlmIChzdGF0dXMgPT0gMCkgewotCSAgICBpZiAoKGxhc3RfbXRpbWUgPj0gam9iLT5zdWJtaXRfdGltZSkgJiYgKGxhc3RfbXRpbWUgPT0gZmlsZWluZm8uc3RfbXRpbWUpKSB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlsYXN0X210aW1lID0gZmlsZWluZm8uc3RfbXRpbWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIFRSQUNFX0RFVEFJTF9WKCIrKysgSGF2ZSB0YXNrIGNvbmZpZyBmaWxlICVzXG4iLCB0YXNrbGlzdF9wYXRoKTsKLSAgICBkb25lID0gMDsKLSAgICB3aGlsZSAoIWRvbmUpIHsKLQljaGFyICpsaW5lcHRyOwotCWNoYXIgKnRva2VucHRyOwotCWNoYXIgKmxpbmVwOwotCWNoYXIgKnA7Ci0JaW50IHRhc2tudW07Ci0JaW50IG51bWxpbmVzOwotCi0Jc3RhdCh0YXNrbGlzdF9wYXRoLCAmZmlsZWluZm8pOwotCWNmZ2ZpbGUgPSBmb3Blbih0YXNrbGlzdF9wYXRoLCAiciIpOwotCWlmIChjZmdmaWxlICE9IE5VTEwpIHsKLQkgICAgY2ZnaW5mbyA9IChjaGFyICopIG1hbGxvYyhmaWxlaW5mby5zdF9zaXplKTsKLQkgICAgbWFsbG9jX2NoZWNrKGNmZ2luZm8sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCSAgICBzdGF0dXMgPSBmcmVhZChjZmdpbmZvLCBmaWxlaW5mby5zdF9zaXplLCAxLCBjZmdmaWxlKTsKLQkgICAgZmNsb3NlKGNmZ2ZpbGUpOwotCSAgICBpZiAoc3RhdHVzICE9IGZpbGVpbmZvLnN0X3NpemUpIHsKLQkJLyoKLQkJICogRmlyc3QgbGluZSBjb250YWlucyB2ZXJzaW9uIGluZm8gd2hpY2ggd2UgZG9uJ3QgY2FyZQotCQkgKiBhYm91dCwgYW5kIHNvIGl0IGlzIGlnbm9yZWQKLQkJICovCi0JCXAgPSBzdHJ0b2tfcihjZmdpbmZvLCAiOyIsICZsaW5lcHRyKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkgICAgYnJlYWs7Ci0JCX0KLQkJLyoKLQkJICogU2Vjb25kIGxpbmUgY29udGFpbnMgbnVtYmVyIG9mIHRhc2tzIGluIGpvYgotCQkgKi8KLQkJcCA9IHN0cnRva19yKE5VTEwsICI7IiwgJmxpbmVwdHIpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCSAgICBicmVhazsKLQkJfQotCQlsaW5lcCA9IHA7Ci0JCXAgPSBzdHJ0b2tfcihsaW5lcCwgIiAiLCAmdG9rZW5wdHIpOwotCQludW10YXNrcyA9IGF0b2kocCk7Ci0JCW51bWxpbmVzID0gMDsKLQkJVFJBQ0VfREVUQUlMX1YoIisrKyBBcHBsaWNhdGlvbiBoYXMgJWQgdGFza3NcbiIsIG51bXRhc2tzKTsKLQkJdGFza3MgPSAodGFza2luZm8gKikgY2FsbG9jKG51bXRhc2tzLCBzaXplb2YodGFza2luZm8pKTsKLQkJbWFsbG9jX2NoZWNrKHRhc2tzLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQkJLyoKLQkJICogTm93IHJlYWQgb25lIGxpbmUgcGVyIHRhc2sgYW5kIGJ1aWxkIHRhc2sgbGlzdAotCQkgKi8KLQkJcCA9IHN0cnRva19yKE5VTEwsICI7IiwgJmxpbmVwdHIpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCSAgICBicmVhazsKLQkJfQotCQl3aGlsZSAoIWRvbmUpIHsKLQkJICAgIGNoYXIgKmNwOwotCQkgICAgbGluZXAgPSBwOwotCQkgICAgVFJBQ0VfREVUQUlMX1YoIlByb2Nlc3NpbmcgJXMiLCBsaW5lcCk7Ci0JCSAgICAvKgotCQkgICAgICogZ2V0IHRhc2sgaW5kZXgKLQkJICAgICAqLwotCQkgICAgcCA9IHN0cnRva19yKGxpbmVwLCAiICIsICZ0b2tlbnB0cik7Ci0JCSAgICBpZiAocCA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIHRhc2tudW0gPSBhdG9pKHApOwotCQkgICAgdGFza3AgPSAmdGFza3NbdGFza251bV07Ci0JCSAgICB0YXNrcC0+cHJveHlfdGFza2lkID0gZ2VuZXJhdGVfaWQoKTsKLSNpZmRlZiBfX2xpbnV4X18KLQkJICAgIC8qCi0JCSAgICAgKiBza2lwIGlnbm9yZWQgdG9rZW4KLQkJICAgICAqLwotCQkgICAgcCA9IHN0cnRva19yKE5VTEwsICIgIiwgJnRva2VucHRyKTsKLQkJICAgIGlmIChwID09IE5VTEwpIHsKLQkJCWJyZWFrOwotCQkgICAgfQotI2VuZGlmCi0JCSAgICAvKgotCQkgICAgICogZ2V0IG5vZGUgSVAgYWRkcmVzcwotCQkgICAgICovCi0JCSAgICBwID0gc3RydG9rX3IoTlVMTCwgIiAiLCAmdG9rZW5wdHIpOwotCQkgICAgaWYgKHAgPT0gTlVMTCkgewotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICB0YXNrcC0+aXBhZGRyID0gc3RyZHVwKHApOwotCQkgICAgLyoKLQkJICAgICAqIGdldCB0YXNrIGhvc3RuYW1lLiBob3N0bmFtZSB3aWxsIGJlIHRydW5jYXRlZCB0bwotCQkgICAgICogc2hvcnQgZm9ybSBpZiBMb2FkTGV2ZWxlciBpcyBub3QgYmVpbmcgdXNlZC4gSWYgTG9hZGxldmVsZXIKLQkJICAgICAqIGlzIHVzZWQsIGl0J3Mgbm9kZSBsaXN0IHVzZXMgZnVsbCBob3N0IG5hbWUgc28gdHJ1bmNhdGlvbiBpcwotCQkgICAgICogbm90IGFsbG93ZWQuCi0JCSAgICAgKi8KLQkJICAgIHAgPSBzdHJ0b2tfcihOVUxMLCAiICIsICZ0b2tlbnB0cik7Ci0JCSAgICBpZiAocCA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIGlmICghdXNlX2xvYWRfbGV2ZWxlcikgewotCQkJY3AgPSBzdHJjaHIocCwgJy4nKTsKLQkJCWlmIChjcCAhPSBOVUxMKSB7Ci0JCQkgICAgKmNwID0gJ1wwJzsKLQkJCX0KLQkJICAgIH0KLQkJICAgIHRhc2twLT5ob3N0bmFtZSA9IHN0cmR1cChwKTsKLQkJICAgIC8qCi0JCSAgICAgKiBnZXQgdGFzayBwaWQKLQkJICAgICAqLwotCQkgICAgcCA9IHN0cnRva19yKE5VTEwsICIgIiwgJnRva2VucHRyKTsKLQkJICAgIGlmIChwID09IE5VTEwpIHsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgdGFza3AtPnRhc2tfcGlkID0gYXRvaShwKTsKLQkJICAgIC8qCi0JCSAgICAgKiBnZXQgdGFzayBwYXJlbnQgcGlkCi0JCSAgICAgKi8KLQkJICAgIHAgPSBzdHJ0b2tfcihOVUxMLCAiICIsICZ0b2tlbnB0cik7Ci0JCSAgICBpZiAocCA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIHRhc2twLT5wYXJlbnRfcGlkID0gYXRvaShwKTsKLQkJICAgIG51bWxpbmVzID0gbnVtbGluZXMgKyAxOwotCQkgICAgaWYgKG51bWxpbmVzID49IG51bXRhc2tzKSB7Ci0JCQlkb25lID0gMTsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgLyoKLQkJICAgICAqIFJlYWQgbmV4dCBsaW5lIG9mIHRhc2sgaW5mbwotCQkgICAgICovCi0JCSAgICBwID0gc3RydG9rX3IoTlVMTCwgIjsiLCAmbGluZXB0cik7Ci0JCSAgICBpZiAocCA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfQotCQkvKgotCQkgKiBJZiBudW1saW5lID09IG51bXRhc2tzIHRoZW4gdGhlIGZpbGUgd2FzIGNvbXBsZXRlIGFuZAotCQkgKiB3ZSBhcmUgZG9uZSB3aXRoIHBhcnNpbmcgdGhlIGZpbGUuIE90aGVyd2lzZSBjbGVhbiB1cAotCQkgKiB0aGUgbGlzdCBhbmQgdHJ5IGFnYWluCi0JCSAqLwotCQlpZiAoIWRvbmUpIHsKLQkJICAgIGZyZWUoY2ZnaW5mbyk7Ci0JCSAgICBkZWxldGVfdGFza19saXN0KHRhc2tudW0gKyAxLCB0YXNrcyk7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyoKLQkJICogRmlsZSB3YXMgbm90IGNvbXBsZXRlbHkgcmVhZC4gQ2xvc2UgdGhlIGZpbGUgdGhlbiB0cnkKLQkJICogYWdhaW4uCi0JCSAqLwotCQlmcmVlKGNmZ2luZm8pOwotCQlmY2xvc2UoY2ZnZmlsZSk7Ci0JCWRlbGV0ZV90YXNrX2xpc3QodGFza251bSArIDEsIHRhc2tzKTsKLQkJc2xlZXAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGpvYi0+dGFza3MgPSB0YXNrczsKLSAgICBqb2ItPm51bXRhc2tzID0gbnVtdGFza3M7Ci0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLSAgICBpZiAoam9iLT5kZWJ1Z2dlZV9qb2IgIT0gTlVMTCkgICAgICAgIC8qIFRoZSBkZWJ1Z2dlciBqb2IgZG9lc24ndCByZXBvcnQgKi8KLSAgICAJZ290byBvdXQ7Ci0jZW5kaWYKLSAgICAvKgotICAgICAqIEZvciBlYWNoIHRhc2sgaW4gdGhlIGFwcGxpY2F0aW9uLCBzZW5kIGEgbmV3IHByb2Nlc3MgZXZlbnQgdG8gdGhlCi0gICAgICogR1VJLgotICAgICAqLwotICAgIHRhc2twID0gdGFza3M7Ci0gICAgc3ByaW50Zihqb2JpZF9zdHIsICIlZCIsICgoam9iaW5mbyAqKSBqb2JfaWRlbnQpLT5wcm94eV9qb2JpZCk7Ci0gICAgbXNnID0gcHJveHlfbmV3X3Byb2Nlc3NfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYmlkX3N0ciwgbnVtdGFza3MpOwotI2lmIDAKLQkvKgotCSAqIE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHByb3h5IG9yIHRoZSBHVUkgd3JpdGVzIHRoZSByb3V0aW5nIGZpbGUuCi0JICogSWYgdGhlIEdVSSB3cml0ZXMgdGhlIHJvdXRpbmcgZmlsZSwgdGhhdCBtYXkgYmVjb21lIGEgcHJvYmxlbSBhcyBsYXJnZXIKLQkgKiBudW1iZXJzIG9mIHRhc2tzIGFyZSBydW4uIElmIHRoZSBHVUkgd3JpdGVzIHRoZSByb3V0aW5nIGZpbGUsIHRoZSB0YXNrIGxpc3QKLQkgKiBpcyBzZW50IGFjcm9zcyB0aGUgbmV0d29yayBjb25uZWN0aW9uIHR3aWNlLCBmaXJzdCBmcm9tIHRoZSBwcm94eSB0byB0aGUgR1VJCi0JICogYW5kIHRoZW4gYmFjayBmcm9tIHRoZSBHVUkgdG8gdGhlIG5vZGUgd2hlcmUgdGhlIHByb3h5IHJ1bnMuCi0JICoKLQkgKiBGb3Igbm93LCB0aGUgR1VJIHdyaXRlcyB0aGUgcm91dGluZyBmaWxlLiBUaGlzIGNvZGUgbWF5IGJlIGNsb2JiZXJpbmcgdGhlCi0JICogcm91dGluZyBmaWxlIGdlbmVyYXRlZCBieSB0aGUgR1VJIHNvIGl0IGlzIGRpc2FibGVkLgotCSAqLwotICAgIGlmIChqb2ItPmRlYnVnZ2luZykgewotCUZJTEUgKnJvdXRpbmdfZmlsZTsKLQotCVRSQUNFX0RFVEFJTCgiXG5DcmVhdGluZyByb3V0aW5nIGZpbGVcbiIpOwotCXJvdXRpbmdfZmlsZSA9IGZvcGVuKCJyb3V0aW5nX2ZpbGUiLCAicnciKTsKLQlpZiAocm91dGluZ19maWxlICE9IE5VTEwpIHsKLQkgICAgZnByaW50Zihyb3V0aW5nX2ZpbGUsICIlZFxuIiwgbnVtdGFza3MpOwotCSAgICBUUkFDRV9ERVRBSUwoIldyaXRpbmcgcm91dGluZyBkYXRhXG4iKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IG51bXRhc2tzOyBpKyspIHsKLQkJZnByaW50Zihyb3V0aW5nX2ZpbGUsICIlZCAlcyA3Nzc3XG4iLCBpLCB0YXNrcFtpXS5ob3N0bmFtZSk7Ci0JICAgIH0KLQkgICAgZmNsb3NlKHJvdXRpbmdfZmlsZSk7Ci0JfQotCWVsc2UgewotCSAgICBUUkFDRV9ERVRBSUxfVigiXG5FcnJvciB3cml0aW5nIHJvdXRpbmcgZmlsZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIGlmIChqb2ItPmRpc2NvdmVyZWRfam9iKSB7Ci0JLyoKLQkgKiBJZiB0aGlzIGlzIGEgam9iIHJ1bm5pbmcgYmVmb3JlIHRoZSBwcm94eSBzdGFydGVkLCB0aGVuCi0JICogdGhlcmUgd2lsbCBiZSBubyBob3N0ZmlsZS4gSW4gdGhpcyBjYXNlLCBqdXN0IGFkZCBuZXcKLQkgKiBub2RlcyBmb3IgZWFjaCB1bmlxdWUgbm9kZW5hbWUgZm91bmQgaW4gdGhlIGF0dGFjaC5jZmcgZmlsZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtdGFza3M7IGkrKykgewotCSAgICBpZiAoZmluZF9ub2RlKHRhc2twW2ldLmhvc3RuYW1lKSA9PSBOVUxMKSB7Ci0JCW5vZGVfcmVmY291bnQgKm5vZGU7Ci0KLQkJbm9kZSA9IGFkZF9ub2RlKHRhc2twW2ldLmhvc3RuYW1lKTsKLQkJQWRkVG9MaXN0KG5ld19ub2Rlcywgbm9kZSk7Ci0JCW5vZGVfY291bnQgPSBub2RlX2NvdW50ICsgMTsKLQkgICAgfQotCX0KLQlpZiAoU2l6ZU9mTGlzdChuZXdfbm9kZXMpID4gMCkgewotCSAgICBzZW5kX25ld19ub2RlX2xpc3Qoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIG1hY2hpbmVfaWQsIG5ld19ub2Rlcyk7Ci0JfQotCURlc3Ryb3lMaXN0KG5ld19ub2RlcywgTlVMTCk7Ci0gICAgfQotICAgIGlmICh1c2VfbG9hZF9sZXZlbGVyKSB7Ci0jaWZkZWYgSEFWRV9MTEFQSV9ICi0JTm9kZU9iamVjdCAqbm9kZTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW10YXNrczsgaSsrKSB7Ci0JICAgIGlmIChpID09IDApIHsKLQkJam9iLT50YXNrMF9waWQgPSB0YXNrcC0+dGFza19waWQ7Ci0JICAgIH0KLQkgICAgbm9kZSA9IGdldF9ub2RlX2luX2hhc2gobXlfY2x1c3Rlci0+bm9kZV9oYXNoLCB0YXNrcFtpXS5ob3N0bmFtZSk7Ci0JICAgIGlmIChub2RlID09IE5VTEwpIHsKLQkJcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLCAiTm9kZSAlcyBub3QgZm91bmQgaW4gbm9kZSBsaXN0XG4iLCB0YXNrcC0+aG9zdG5hbWUpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlzcHJpbnRmKHByb2NpZF9zdHIsICIlZCIsIHRhc2twW2ldLnByb3h5X3Rhc2tpZCk7Ci0gICAgICAgICAgICAgICAgQWRkVG9MaXN0KHRhc2tpZF9saXN0LCBzdHJkdXAocHJvY2lkX3N0cikpOwotCQlzcHJpbnRmKHByb2NuYW1lLCAidGFza18lZCIsIGkpOwotCQlwcm94eV9hZGRfcHJvY2Vzcyhtc2csIHByb2NpZF9zdHIsIHByb2NuYW1lLCBQUk9DX1NUQVRFX1NUQVJUSU5HLCAzKTsKLQkJcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobXNnLCBQUk9DX05PREVJRF9BVFRSLCBub2RlLT5wcm94eV9nZW5lcmF0ZWRfbm9kZV9pZCk7Ci0gICAgICAgICAgICAgICAgQWRkVG9MaXN0KHRhc2tpZF9saXN0LCAmKG5vZGUtPnByb3h5X2dlbmVyYXRlZF9ub2RlX2lkKSk7Ci0JCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG1zZywgUFJPQ19JTkRFWF9BVFRSLCBpKTsKLQkJcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobXNnLCBQUk9DX1BJRF9BVFRSLCB0YXNrcFtpXS50YXNrX3BpZCk7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZm9yIChpID0gMDsgaSA8IG51bXRhc2tzOyBpKyspIHsKLQkgICAgbm9kZV9yZWZjb3VudCAqbm9kZTsKLQotCSAgICBpZiAoaSA9PSAwKSB7Ci0JCWpvYi0+dGFzazBfcGlkID0gdGFza3AtPnRhc2tfcGlkOwotCSAgICB9Ci0JICAgIC8qCi0JICAgICAqIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHRhc2tzIHJ1bm5pbmcgb24gdGhlIG5vZGUgYW5kIHNlbmQgdGhlCi0JICAgICAqIG5ldyBwcm9jZXNzIGV2ZW50Ci0JICAgICAqLwotCSAgICBub2RlID0gZmluZF9ub2RlKHRhc2twW2ldLmhvc3RuYW1lKTsKLQkgICAgaWYgKG5vZGUgPT0gTlVMTCkgewotCQlwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJOb2RlICVzIG5vdCBmb3VuZCBpbiBub2RlIGxpc3RcbiIsIHRhc2twLT5ob3N0bmFtZSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0KLQkJbm9kZS0+dGFza19jb3VudCA9IG5vZGUtPnRhc2tfY291bnQgKyAxOwotCQlzcHJpbnRmKHByb2NpZF9zdHIsICIlZCIsIHRhc2twW2ldLnByb3h5X3Rhc2tpZCk7Ci0gICAgICAgICAgICAgICAgQWRkVG9MaXN0KHRhc2tpZF9saXN0LCBzdHJkdXAocHJvY2lkX3N0cikpOwotCQlzcHJpbnRmKHByb2NuYW1lLCAidGFza18lZCIsIGkpOwotCQlwcm94eV9hZGRfcHJvY2Vzcyhtc2csIHByb2NpZF9zdHIsIHByb2NuYW1lLCBQUk9DX1NUQVRFX1NUQVJUSU5HLCAzKTsKLQkJcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobXNnLCBQUk9DX05PREVJRF9BVFRSLCBub2RlLT5wcm94eV9ub2RlaWQpOwotCQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtc2csIFBST0NfSU5ERVhfQVRUUiwgaSk7Ci0JCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG1zZywgUFJPQ19QSURfQVRUUiwgdGFza3BbaV0udGFza19waWQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgICAvKgotICAgICAgICogTm90aWZ5IGZyb250IGVuZCB0aGF0IGVhY2ggdGFzayBpcyBzdGFydGVkCi0gICAgICAgKi8KLSAgICBTZXRMaXN0KHRhc2tpZF9saXN0KTsKLSAgICBwcm94eV90YXNraWQgPSBHZXRMaXN0RWxlbWVudCh0YXNraWRfbGlzdCk7Ci0gICAgd2hpbGUgKHByb3h5X3Rhc2tpZCAhPSBOVUxMKSB7Ci0gICAgICAgIHByb3h5X21zZyAqbXNnOwotCi0gICAgICAgIG1zZyA9IHByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBwcm94eV90YXNraWQsIDEpOwotICAgICAgICBmcmVlKHByb3h5X3Rhc2tpZCk7Ci0gICAgICAgIHByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG1zZywgUFJPQ19TVEFURV9BVFRSLCBQUk9DX1NUQVRFX1JVTk5JTkcpOwotICAgICAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgICAgIHByb3h5X3Rhc2tpZCA9IEdldExpc3RFbGVtZW50KHRhc2tpZF9saXN0KTsKLSAgICB9Ci0gICAgRGVzdHJveUxpc3QodGFza2lkX2xpc3QsIE5VTEwpOwotICAgIC8qCi0gICAgICogYXR0YWNoLmNmZyBmaWxlIGlzIGNvbXBsZXRlIGFuZCBoYXMgYmVlbiBwYXJzZWQuIE5vdGlmeSB0aGUKLSAgICAgKiBmcm9udCBlbmQgdGhhdCB0aGUgam9iIGlzIHJ1bm5pbmcKLSAgICAgKi8KLSAgICBzZW5kX2pvYl9zdGF0ZV9jaGFuZ2VfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYi0+cHJveHlfam9iaWQsIEpPQl9TVEFURV9SVU5OSU5HKTsKLSAgICAvKgotICAgICAqIE5vdyB0aGF0IGFsbCB0YXNrIHBpZHMgYXJlIGtub3duLCBJL08gZnJvbSB0aGUgYXBwbGljYXRpb24gY2FuIGJlCi0gICAgICogZW5hYmxlZCBzaW5jZSB3ZSBjYW4gbm93IG1hcCBJL08gdG8gYSBzcGVjaWZpYyBwaWQuIFRoaXMgaXMgZG9uZQotICAgICAqIGhlcmUgb25seSBmb3Igc3Rkb3V0IHNpbmNlIHRhc2sgbWFwcGluZyBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCB0bwotICAgICAqIGhhbmRsZSBzcGxpdHRpbmcgc3Rkb3V0IGJ5IHRhc2suIE91dHB1dCB0byBzdGRlcnIgaXMgbm90IHNwbGl0IGJ5Ci0gICAgICogdGFzaywgc28gdGhlIHN0ZGVyciBmaWxlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBhdCBhcHBsaWNhdGlvbiBzdGFydHVwLgotICAgICAqIElmIHRoZSBqb2Igd2FzIGEgam9iIGRpc2NvdmVyZWQgYXQgcHJveHkgc3RhcnR1cCwgdGhlcmUgaXMgbm8gY29ubmVjdGlvbgotICAgICAqIHRvIHN0ZGlvIGZpbGUgZGVzY3JpcHRvcnMsIHNvIGRvbid0IHJlZ2lzdGVyIGZpbGUgaGFuZGxlcnMuCi0gICAgICovCi0gICAgaWYgKCFqb2ItPnN0ZG91dF9yZWRpcmVjdCAmJiAham9iLT5kaXNjb3ZlcmVkX2pvYikgewotCVJlZ2lzdGVyRmlsZUhhbmRsZXIoam9iLT5zdGRvdXRfZmQsIFJFQURfRklMRV9IQU5ETEVSLCBzdGRvdXRfaGFuZGxlciwgam9iKTsKLSAgICB9Ci0gICAgaWYgKGpvYi0+ZGVidWdnaW5nKSB7Ci0JICAvKgotCSAgICogSWYgdGhpcyBpcyBhIGRlYnVnIHNlc3Npb24gdGhlbiB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSB0b3AgbGV2ZWwgU0RNIHByb2Nlc3MKLQkgICAqIGF0IHRoaXMgcG9pbnQuIFRoZSBjaGlsZCBTRE0gcHJvY2Vzc2VzIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYnkgdGhlCi0JICAgKiBmb3JrL2V4ZWMgb2YgdGhlIHBvZSBwcm9jZXNzICh3aGljaCBpbiB0aGUgZGVidWcgY2FzZSBpcyAncG9lIHNkbSAuLi4nKSBhYm92ZS4KLQkgICAqLwotCXBpZF90IHNkbV9waWQ7Ci0JY2hhciAqZGVidWdnZXI7Ci0JaW50IGxlbjsKLQljaGFyICoqYXJndjsKLQotCXNkbV9waWQgPSBmb3JrKCk7Ci0JaWYgKHNkbV9waWQgPT0gMCkgewotCSAgICBUUkFDRV9ERVRBSUwoIisrKyBSZWFkeSB0byBpbnZva2UgdG9wIGxldmVsIFNETVxuIik7Ci0JICAgIGFyZ3YgPSBjcmVhdGVfZGVidWdfcGFybWxpc3Qoam9iLT5zZG1fZGVidWduYW1lLCBqb2ItPnNkbV9kZWJ1Z19hcmdfY291bnQsIGpvYi0+c2RtX2RlYnVnYXJncyk7Ci0JICAgIGxlbiA9IHN0cmxlbihqb2ItPnNkbV9kZWJ1Z2RpcikgKyBzdHJsZW4oam9iLT5zZG1fZGVidWduYW1lKSArIDI7Ci0JICAgIGRlYnVnZ2VyID0gKGNoYXIgKikgbWFsbG9jKGxlbik7Ci0JICAgIG1hbGxvY19jaGVjayhkZWJ1Z2dlciwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JICAgIHN0cmNweShkZWJ1Z2dlciwgam9iLT5zZG1fZGVidWdkaXIpOwotCSAgICBzdHJjYXQoZGVidWdnZXIsICIvIik7Ci0JICAgIHN0cmNhdChkZWJ1Z2dlciwgam9iLT5zZG1fZGVidWduYW1lKTsKLXNsZWVwKDUpOwotCSAgICBzdGF0dXMgPSBleGVjdmUoZGVidWdnZXIsIGFyZ3YsIGpvYi0+c2RtX2VudnApOwotCSAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICIlcyBmYWlsZWQgdG8gZXhlY3V0ZSwgc3RhdHVzICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOwotCSAgICBUUkFDRV9FWElUOwotCSAgICBleGl0KDEpOwotCX0KLQllbHNlIHsKLQkgICAgaWYgKHNkbV9waWQgPT0gLTEpIHsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyoKLQkJICogVGhpcyBpcyB0aGUgcGFyZW50IGxlZyBvZiB0aGUgZm9yayBmb3IgaW52b2tpbmcgdGhlIHRvcCBsZXZlbCBTRE0uCi0JCSAqIE5vIGV4cGxpY2l0IHByb2Nlc3NpbmcgcmVxdWlyZWQgaGVyZS4gQWxsIHdlIGNhcmUgYWJvdXQgaXMKLQkJICogZXZlbnR1YWxseSBjYXRjaGluZyB0aGUgU0RNIGV4aXQgc3RhdHVzIHNvIHdlIGRvbid0IGNyZWF0ZSBhIHpvbmJpZS4KLQkJICovCi0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBQRV9EVUFMX1BPRV9ERUJVRwotICBvdXQ6Ci0jZW5kaWYKLSAgICAvKgotICAgICAqIFRoZSBzdGFydHVwIHRocmVhZCBleGl0cyBhdCB0aGlzIHBvaW50LCBzbyBjbGVhciB0aGUgcmVmZXJlbmNlIGluCi0gICAgICogdGhlIGpvYiBpbmZvCi0gICAgICovCi0gICAgam9iLT5zdGFydHVwX3RocmVhZCA9IDA7Ci0gICAgVFJBQ0VfRVhJVDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqCi16b21iaWVfcmVhcGVyKHZvaWQgKmFyZykKLXsKLSAgICAvKgotICAgICAqIFdhdGNoIGZvciBwb2UgdGFza3Mgc3RhcnRlZCBieSB0aGlzIHByb3h5IHRvIHRlcm1pbmF0ZS4gV2hlbiBhIHRhc2sKLSAgICAgKiB0ZXJtaW5hdGVzLCBjbGVhbiB1cCByZXNvdXJjZXMgYW5kIG5vdGlmeSB0aGUgZnJvbnQgZW5kIHRoYXQgYSBqb2IKLSAgICAgKiBoYXMgY29tcGxldGVkLiBQb3N0IGNvbXBsZXRpb24gc3RhdHVzIHRvIGZyb250IGVuZC4gVGhpcyBmdW5jdGlvbiBpcwotICAgICAqIGludm9rZWQgYnkgYSB0aHJlYWQgc3RhcnRlZCBhdCBwcm94eSBzdGFydHVwLCBhbmQgcnVucyB1bnRpbCB0aGUKLSAgICAgKiBwcm94eSBpcyBzaHV0IGRvd24KLSAgICAgKi8KLSAgICBpbnQgc3RhdHVzOwotICAgIHBpZF90IHRlcm1pbmF0ZWRfcG1kOwotICAgIHN0cnVjdCBydXNhZ2UgcnVzYWdlX2luZm87Ci0gICAgam9iaW5mbyAqam9iOwotCi0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZShQVEhSRUFEX0NBTkNFTF9FTkFCTEUsIE5VTEwpOwotICAgIHB0aHJlYWRfc2V0Y2FuY2VsdHlwZShQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMsIE5VTEwpOwotCi0gICAgZm9yICg7OykgewotCXB0aHJlYWRfbXV0ZXhfbG9jaygmam9iX2xvY2spOwotCS8qCi0JICogU2NhbiB0aGUgam9iIGxpc3QgbG9va2luZyBmb3Igam9icyBydW5uaW5nIGJlZm9yZSB0aGUgcHJveHkKLQkgKiBzdGFydGVkLiBGb3IgZWFjaCBvZiB0aG9zZSBqb2JzLCBjaGVjayBpZiB0aGUgcG9lIHByb2Nlc3MKLQkgKiBzdGlsbCBleGlzdHMuIElmIHRoZSBwcm9jZXNzIGhhcyBkaXNhcHBlYXJlZCwgdGhlbiBtYXJrIHRoZQotCSAqIGpvYiB0ZXJtaW5hdGVkLgotCSAqLwotCVNldExpc3Qoam9icyk7Ci0Jam9iID0gR2V0TGlzdEVsZW1lbnQoam9icyk7Ci0Jd2hpbGUgKGpvYiAhPSBOVUxMKSB7Ci0JICAgIGlmICgoam9iLT5kaXNjb3ZlcmVkX2pvYikgJiYgKGtpbGwoam9iLT5wb2VfcGlkLCAwKSAhPSAwKSkgewotCQlUUkFDRV9ERVRBSUxfVigiKysrIHBvZSBwcm9jZXNzICVkIEV4aXRlZCB3aXRoIHVua25vd24gc3RhdHVzXG4iLCBqb2ItPnBvZV9waWQpOwotCQlzZW5kX2pvYl9zdGF0ZV9jaGFuZ2VfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsCi0JCQkJCSAgICBqb2ItPnByb3h5X2pvYmlkLCBKT0JfU1RBVEVfVEVSTUlOQVRFRCk7Ci0JCXNlbmRfcHJvY2Vzc19zdGF0ZV9jaGFuZ2VfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYiwgUFJPQ19TVEFURV9FWElURUQpOwotCQlpZiAoam9iLT50YXNrcyAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoIXVzZV9sb2FkX2xldmVsZXIpIHsKLQkJCXVwZGF0ZV9ub2RlX3JlZmNvdW50cyhqb2ItPm51bXRhc2tzLCBqb2ItPnRhc2tzKTsKLQkJICAgIH0KLQkJICAgIGRlbGV0ZV90YXNrX2xpc3Qoam9iLT5udW10YXNrcywgam9iLT50YXNrcyk7Ci0JCX0KLQkJUmVtb3ZlRnJvbUxpc3Qoam9icywgam9iKTsKLQkgICAgfQotCSAgICBqb2IgPSBHZXRMaXN0RWxlbWVudChqb2JzKTsKLQl9Ci0JLyoKLQkgKiB3YWl0IGZvciBhbnkgcG9lIHRhc2sgdG8gdGVybWluYXRlCi0JICovCi0JdGVybWluYXRlZF9wbWQgPSB3YWl0Mygmc3RhdHVzLCBXTk9IQU5HLCAmcnVzYWdlX2luZm8pOwotCWlmICh0ZXJtaW5hdGVkX3BtZCA+IDApIHsKLQotCSAgICBUUkFDRV9ERVRBSUxfVigiKysrIFBpZCAlZCBleGl0ZWRcbiIsIHRlcm1pbmF0ZWRfcG1kKTsKLQkgICAgLyoKLQkgICAgICogTG9vayBmb3Igam9iIHdpdGggbWF0Y2hpbmcgcG9lIHByb2Nlc3MgcGlkLiBJZiBmb3VuZCwgdGhlbgotCSAgICAgKiBwb3N0IHByb2Nlc3Mgc3RhdHVzIHRvIGZyb250IGVuZCBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzCi0JICAgICAqIElmIG5vIG1hdGNoIHRvIHBpZCBpcyBmb3VuZCwgaXQncyBwcm9iYWJseSBhIHRvcCBsZXZlbCBTRE0gZGVidWdnZXIKLQkgICAgICogcHJvY2VzcywgYW5kIG5vIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBpcyBuZWVkZWQuCi0JICAgICAqLwotCSAgICBTZXRMaXN0KGpvYnMpOwotCSAgICBqb2IgPSBHZXRMaXN0RWxlbWVudChqb2JzKTsKLQkgICAgd2hpbGUgKGpvYiAhPSBOVUxMKSB7Ci0JCWlmICh0ZXJtaW5hdGVkX3BtZCA9PSBqb2ItPnBvZV9waWQpIHsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWpvYiA9IEdldExpc3RFbGVtZW50KGpvYnMpOwotCSAgICB9Ci0JICAgIGlmIChqb2IgIT0gTlVMTCkgewotCQkvKgotCQkgKiBQT0UgcHJvY2VzcyBzdGF0dXMgdXNlZCB0byBiZSByZXBvcnRlZCB0byB0aGUgR1VJLgotCQkgKiBBcHBhcmVudGx5LCBub3csIG9ubHkgam9iIHN0YXR1cyBpcyBwb3N0ZWQuCi0JCSAqLwotCQlpZiAoc3RhdHVzIDw9IDEyOCkgewotCQkgICAgVFJBQ0VfREVUQUlMX1YoIisrKyAlZCBFeGl0ZWQgd2l0aCBzdGF0dXMgJTA4eFxuIiwgdGVybWluYXRlZF9wbWQsIHN0YXR1cyk7Ci0JCSAgICBzZW5kX2pvYl9zdGF0ZV9jaGFuZ2VfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsCi0JCQkJCQlqb2ItPnByb3h5X2pvYmlkLCBKT0JfU1RBVEVfVEVSTUlOQVRFRCk7Ci0JCSAgICBzZW5kX3Byb2Nlc3Nfc3RhdGVfY2hhbmdlX2V2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBqb2IsIFBST0NfU1RBVEVfRVhJVEVEKTsKLQkJfQotCQllbHNlIHsKLQkJICAgIFRSQUNFX0RFVEFJTF9WKCIrKysgJWQgc2lnbmFsbGVkIHdpdGggc3RhdHVzICUwOHhcbiIsIHRlcm1pbmF0ZWRfcG1kLAotCQkJCSAgIHN0YXR1cyAtIDEyOCk7Ci0JCSAgICBzZW5kX2pvYl9zdGF0ZV9jaGFuZ2VfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYi0+cHJveHlfam9iaWQsCi0JCQkJCQlKT0JfU1RBVEVfRVJST1IpOwotCQkgICAgc2VuZF9wcm9jZXNzX3N0YXRlX2NoYW5nZV9ldmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwgam9iLAotCQkJCQkJICAgIFBST0NfU1RBVEVfRVhJVEVEX1NJR05BTExFRCk7Ci0JCX0KLQkJLyoKLQkJICogU2luY2UgdGhlIGpvYiBpcyB0ZXJtaW5hdGVkLCB0aGUgc3RkaW8gZmlsZSBkZXNjcmlwdG9yCi0JCSAqIHBpcGVzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQgZnJvbSB0aGUgbWFpbiBwb2xsaW5nIGxvb3AKLQkJICogYW5kIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGNsb3NlZC4gSG93ZXZlciwgaWYgdGhlcmUKLQkJICogaXMgc3RpbGwgZGF0YSBpbiB0aGUgYnVmZmVycywgdGhpcyBkYXRhIHdvdWxkIGJlIGxvc3QuCi0JCSAqIFNvLCBsZWF2ZSB0aGUgcGlwZXMgcmVnaXN0ZXJlZC4gVGhlIHBvbGxpbmcgbG9vcAotCQkgKiB3aWxsIGV2ZW50dWFsbHkgcHJvY2VzcyB0aGUgZGF0YSBsZWZ0IGluIHRoZSBwaXBlLiBJZiB0aGUKLQkJICogbGFzdCBsaW5lIG9mIG91dHB1dCBkb2VzIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUsIHRoYXQKLQkJICogbGluZSBtYXkgYmUgbG9zdAotCQkgKi8KLQkJaWYgKGpvYi0+dGFza3MgIT0gTlVMTCkgewotCQkgICAgaWYgKCF1c2VfbG9hZF9sZXZlbGVyKSB7Ci0JCQl1cGRhdGVfbm9kZV9yZWZjb3VudHMoam9iLT5udW10YXNrcywgam9iLT50YXNrcyk7Ci0JCSAgICB9Ci0JCSAgICBkZWxldGVfdGFza19saXN0KGpvYi0+bnVtdGFza3MsIGpvYi0+dGFza3MpOwotCQl9Ci0JCWZyZWUoam9iLT5zdWJtaXRfam9iaWQpOwotCQlmcmVlKGpvYi0+c3Rkb3V0X2luZm8ucmVhZF9idWYpOwotCQlmcmVlKGpvYi0+c3RkZXJyX2luZm8ucmVhZF9idWYpOwotCQlmcmVlKGpvYi0+c3Rkb3V0X2luZm8ud3JpdGVfYnVmKTsKLQkJZnJlZShqb2ItPnN0ZGVycl9pbmZvLndyaXRlX2J1Zik7Ci0JCVJlbW92ZUZyb21MaXN0KGpvYnMsIGpvYik7Ci0JCWZyZWUoam9iKTsKLQkgICAgfQotCX0KLQlwdGhyZWFkX211dGV4X3VubG9jaygmam9iX2xvY2spOwotCS8qCi0JICogUG9sbCBmb3Igc3RhdHVzIG9uY2UgcGVyIHNlY29uZAotCSAqLwotCXNsZWVwKDEpOwotICAgIH0KLSAgICBUUkFDRV9FWElUOwotfQotCi12b2lkCi1yZWRpcmVjdF9pbyh2b2lkKQotewotICAgIC8qCi0gICAgICogU1RESU8gZm9yIHJ1bm5pbmcgYXBwbGljYXRpb25zIG5lZWRzIHRvIGJlIHJlZGlyZWN0ZWQgaW4gb3JkZXIgdG8KLSAgICAgKiBwcmV2ZW50IHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRlcm1pbmF0aW5nIHdpdGggU0lHUElQRSBmb3Igc3RkaW4KLSAgICAgKiBvciBmcm9tIGJsb2NraW5nIG9uIHN0ZG91dCBvciBzdGRlcnIgcGlwZXMgd2hlbiB0aGV5IGZpbGwuCi0gICAgICogVG8gZG8gdGhpcywgYnVpbGQgYSBjb21tYW5kIGxpbmUgaW52b2NhdGlvbiBmb3IgYSBtaW5pcHJveHkKLSAgICAgKiBwcm9jZXNzIGNvbnNpc3Rpbmcgb2YgdGhlIHBhdGggcHJlZml4ZXMgZm9yIHN0ZG91dCBhbmQgc3RkZXJyCi0gICAgICogZmlsZSBkZXNjcmlwdG9ycyBmb2xsb3dlZCBieSBsaXN0cyBvZiBmaWxlIGRlc2NyaXB0b3JzIGZvciBzdGRpbiwKLSAgICAgKiBzdGRvdXQgYW5kIHN0ZGVyciwgdGhlbiBpbnZva2UgdGhlIG1pbmlwcm94eS4KLSAgICAgKi8KLSAgICBqb2JpbmZvICpqb2I7Ci0gICAgaW50IHN0ZGluX2NvdW50OwotICAgIGludCBzdGRvdXRfY291bnQ7Ci0gICAgaW50IHN0ZGVycl9jb3VudDsKLSAgICBpbnQgcmVkaXJlY3RlZF9mZHM7Ci0gICAgY2hhciAqbWluaXByb3h5X2FyZ3NbM107Ci0gICAgY2hhciAqbWluaXByb3h5X3Bhcm1saXN0OwotICAgIGNoYXIgKnN0ZGluX2ZkczsKLSAgICBjaGFyICpzdGRvdXRfZmRzOwotICAgIGNoYXIgKnN0ZGVycl9mZHM7Ci0gICAgY2hhciBudW1bMTBdOwotICAgIHN0YXRpYyBjaGFyICptaW5pcHJveHlfZW52W10gPSB7IE5VTEwgfTsKLQotICAgIC8qCi0gICAgICogRGV0ZXJtaW5lIGhvdyBtYW55IG5vbi1yZWRpcmVjdGVkIGZpbGUgZGVzY3JpcHRvcnMgdGhlcmUgYXJlIGZvcgotICAgICAqIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KLSAgICAgKi8KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBzdGRpbl9jb3VudCA9IDA7Ci0gICAgc3Rkb3V0X2NvdW50ID0gMDsKLSAgICBzdGRlcnJfY291bnQgPSAwOwotICAgIFNldExpc3Qoam9icyk7Ci0gICAgam9iID0gR2V0TGlzdEVsZW1lbnQoam9icyk7Ci0gICAgcmVkaXJlY3RlZF9mZHMgPSAwOwotICAgIHdoaWxlIChqb2IgIT0gTlVMTCkgewotCWlmICgham9iLT5zdGRpbl9yZWRpcmVjdCkgewotCSAgICBzdGRpbl9jb3VudCA9IHN0ZGluX2NvdW50ICsgMTsKLQkgICAgcmVkaXJlY3RlZF9mZHMgPSAxOwotCX0KLQlpZiAoIWpvYi0+c3Rkb3V0X3JlZGlyZWN0KSB7Ci0JICAgIHN0ZG91dF9jb3VudCA9IHN0ZG91dF9jb3VudCArIDE7Ci0JICAgIHJlZGlyZWN0ZWRfZmRzID0gMTsKLQl9Ci0JaWYgKCFqb2ItPnN0ZGVycl9yZWRpcmVjdCkgewotCSAgICBzdGRlcnJfY291bnQgPSBzdGRlcnJfY291bnQgKyAxOwotCSAgICByZWRpcmVjdGVkX2ZkcyA9IDE7Ci0JfQotCWpvYiA9IEdldExpc3RFbGVtZW50KGpvYnMpOwotICAgIH0KLSAgICBpZiAocmVkaXJlY3RlZF9mZHMpIHsKLQkvKgotCSAqIEFsbG9jYXRlIGEgc3RyaW5nIGxvbmcgZW5vdWdoIHRvIGhvbGQgdGhyZWUgcGF0aG5hbWVzLCBhbmQgbGlzdHMgb2YgZmlsZQotCSAqIGRlc2NyaXB0b3JzIGZvciBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIsIGVhY2ggcHJlZml4ZWQgd2l0aCBhIGZpbGUKLQkgKiBkZXNjcmlwdG9yIGNvdW50LiBUaGVuIGFsbG9jYXRlIHdvcmsgc3RyaW5ncyBmb3IgZWFjaCBmaWxlIGRlc2NyaXB0b3IgbGlzdAotCSAqLwotCW1pbmlwcm94eV9wYXJtbGlzdCA9IChjaGFyICopIG1hbGxvYyhQQVRIX01BWCAqIDMgKyBzdGRpbl9jb3VudCAqIDExICsKLQkJCQkJICAgICBzdGRvdXRfY291bnQgKiAxMSArIHN0ZGVycl9jb3VudCAqIDExICsgMzApOwotCWlmIChtaW5pcHJveHlfcGFybWxpc3QgPT0gTlVMTCkgewotCSAgICBleGl0KDEpOwotCX0KLQlzdGRpbl9mZHMgPSAoY2hhciAqKSBtYWxsb2Moc3RkaW5fY291bnQgKiAxMSk7Ci0JbWFsbG9jX2NoZWNrKHN0ZGluX2ZkcywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0Jc3Rkb3V0X2ZkcyA9IChjaGFyICopIG1hbGxvYyhzdGRvdXRfY291bnQgKiAxMSk7Ci0JbWFsbG9jX2NoZWNrKHN0ZG91dF9mZHMsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCXN0ZGVycl9mZHMgPSAoY2hhciAqKSBtYWxsb2Moc3RkZXJyX2NvdW50ICogMTEpOwotCW1hbGxvY19jaGVjayhzdGRlcnJfZmRzLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIGZpbGUgZGVzY3JpcHRvciBsaXN0cywgdGhlbiBjb25jYXRlbmF0ZSBlYWNoCi0JICogZmQgbnVtYmVyIGZvciBhIG5vbi1yZWRpcmVjdGVkIGZpbGUgdG8gaXRzIGxpc3QuCi0JICovCi0Jc3RkaW5fZmRzWzBdID0gJ1wwJzsKLQlzdGRvdXRfZmRzWzBdID0gJ1wwJzsKLQlzdGRlcnJfZmRzWzBdID0gJ1wwJzsKLQlTZXRMaXN0KGpvYnMpOwotCWpvYiA9IEdldExpc3RFbGVtZW50KGpvYnMpOwotCXdoaWxlIChqb2IgIT0gTlVMTCkgewotCSAgICBpZiAoIWpvYi0+c3RkaW5fcmVkaXJlY3QpIHsKLQkJc3ByaW50ZihudW0sICIlZCAiLCBqb2ItPnN0ZGluX2ZkKTsKLQkJc3RyY2F0KHN0ZGluX2ZkcywgbnVtKTsKLQkgICAgfQotCSAgICBpZiAoIWpvYi0+c3Rkb3V0X3JlZGlyZWN0KSB7Ci0JCXNwcmludGYobnVtLCAiJWQgIiwgam9iLT5zdGRvdXRfZmQpOwotCQlzdHJjYXQoc3Rkb3V0X2ZkcywgbnVtKTsKLQkgICAgfQotCSAgICBpZiAoIWpvYi0+c3RkZXJyX3JlZGlyZWN0KSB7Ci0JCXNwcmludGYobnVtLCAiJWQgIiwgam9iLT5zdGRlcnJfZmQpOwotCQlzdHJjYXQoc3RkZXJyX2ZkcywgbnVtKTsKLQkgICAgfQotCSAgICBqb2IgPSBHZXRMaXN0RWxlbWVudChqb2JzKTsKLQl9Ci0JLyoKLQkgKiBCdWlsZCB0aGUgbWluaXByb3h5IHBhcmFtZXRlciBsaXN0LiBBbGwgZGF0YSBpcyBjb250YWluZWQgaW4gYQotCSAqIHN0cmluZyB0aGF0IGlzIHRva2VuaXplZCBpbnRvIGluZGl2aWR1YWwgcGFyYW1ldGVycyBieSBtaW5pcHJveHkKLQkgKi8KLQlzdHJjcHkobWluaXByb3h5X3Bhcm1saXN0LCBtaW5pcHJveHlfYXJnc1swXSk7Ci0JaWYgKHN0YXRlX3RyYWNlID09IDApIHsKLQkgICAgc3RyY2F0KG1pbmlwcm94eV9wYXJtbGlzdCwgIiBuIik7Ci0JfQotCWVsc2UgewotCSAgICBzdHJjYXQobWluaXByb3h5X3Bhcm1saXN0LCAiIHkiKTsKLQl9Ci0Jc3RyY2F0KG1pbmlwcm94eV9wYXJtbGlzdCwgIiAvdG1wL21wX3N0ZG91dCAvdG1wL21wX3N0ZGVyciAiKTsKLQlzcHJpbnRmKG51bSwgIiVkICIsIHN0ZGluX2NvdW50KTsKLQlzdHJjYXQobWluaXByb3h5X3Bhcm1saXN0LCBudW0pOwotCXN0cmNhdChtaW5pcHJveHlfcGFybWxpc3QsIHN0ZGluX2Zkcyk7Ci0Jc3ByaW50ZihudW0sICIlZCAiLCBzdGRvdXRfY291bnQpOwotCXN0cmNhdChtaW5pcHJveHlfcGFybWxpc3QsIG51bSk7Ci0Jc3RyY2F0KG1pbmlwcm94eV9wYXJtbGlzdCwgc3Rkb3V0X2Zkcyk7Ci0Jc3ByaW50ZihudW0sICIlZCAiLCBzdGRlcnJfY291bnQpOwotCXN0cmNhdChtaW5pcHJveHlfcGFybWxpc3QsIG51bSk7Ci0Jc3RyY2F0KG1pbmlwcm94eV9wYXJtbGlzdCwgc3RkZXJyX2Zkcyk7Ci0JbWluaXByb3h5X2FyZ3NbMF0gPSBtaW5pcHJveHlfcGF0aDsKLQltaW5pcHJveHlfYXJnc1sxXSA9IG1pbmlwcm94eV9wYXJtbGlzdDsKLQltaW5pcHJveHlfYXJnc1syXSA9IE5VTEw7Ci0JcHJpbnRfbWVzc2FnZShUUkFDRV9ERVRBSUxfTUVTU0FHRSwgIkludm9raW5nIG1pbmlwcm94eSB3aXRoIGFyZ3MgJXNcbiIsCi0JCSAgICAgIG1pbmlwcm94eV9wYXJtbGlzdCk7Ci0JaWYgKGZvcmsoKSA9PSAwKSB7Ci0JICAgIGV4ZWN2ZShtaW5pcHJveHlfYXJnc1swXSwgbWluaXByb3h5X2FyZ3MsIG1pbmlwcm94eV9lbnYpOwotCSAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJGYWlsZWQgdG8gaW52a2UgbWluaXByb3h5ICVzOiAlc1xuIiwKLQkJCSAgbWluaXByb3h5X2FyZ3NbMF0sIHN0cmVycm9yKGVycm5vKSk7Ci0JICAgIFRSQUNFX0VYSVQ7Ci0JICAgIGV4aXQoMSk7Ci0JfQotICAgIH0KLX0KLQotI2lmZGVmIEhBVkVfTExBUElfSAotCi12b2lkICoKLW1vbml0b3JfTG9hZExldmVsZXJfbm9kZXModm9pZCAqam9iX2lkZW50KQotewotICAgIGludCByYyA9IDA7Ci0gICAgaW50IGkgPSAwOwotICAgIGNoYXIgKm5vZGVfbmFtZSA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqbm9kZSA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgaW50IG5vZGVfY291bnQgPSAwOwotICAgIGludCBzbGVlcF9zZWNvbmRzID0gMzA7Ci0gICAgaW50IHNsZWVwX3RpbWVfcmVzZXQgPSAwOwkvKiBpZiBjaGFuZ2VzIHRoaXMgcGFzcyAqLwotICAgIExMX2VsZW1lbnQgKmVyck9iaiA9IE5VTEw7Ci0KLSAgICBMaXN0RWxlbWVudCAqY2x1c3Rlcl9saXN0X2VsZW1lbnQgPSBOVUxMOwotICAgIENsdXN0ZXJPYmplY3QgKmNsdXN0ZXJfb2JqZWN0ID0gTlVMTDsKLSAgICBOb2RlT2JqZWN0ICpub2RlX29iamVjdCA9IE5VTEw7Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCi0gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAqIGxvb3AgZm9yZXZlciB1bnRpbCB3ZSBhcmUgdG9sZCB3ZSBhcmUgc2h1dHRpbmcgZG93bi4gICAgICAgICAgICAgICAgICAqCi0gICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHdoaWxlIChzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPT0gMCkgewotCXB0aHJlYWRfbXV0ZXhfbG9jaygmbWFzdGVyX2xvY2spOwotCWlmIChzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPT0gMSkgewotCSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbWFzdGVyX2xvY2spOwotCSAgICBicmVhazsKLQl9Ci0JcXVlcnlfZWxlbSA9IE5VTEw7Ci0Jbm9kZV9uYW1lID0gTlVMTDsKLQlub2RlX2NvdW50ID0gMDsKLQlub2RlID0gTlVMTDsKLQlMTF9jbHVzdGVyX3BhcmFtIGNsdXN0ZXJfcGFybTsKLQljaGFyICpyZW1vdGVfY2x1c3RlclsyXTsKLQlIYXNoICpub2RlX2hhc2ggPSBOVUxMOwotCUhhc2hFbnRyeSAqaGFzaF9lbGVtZW50ID0gTlVMTDsKLQlMaXN0ICpub2RlX2xpc3QgPSBOVUxMOwotCUxpc3RFbGVtZW50ICpub2RlX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0Jc2xlZXBfdGltZV9yZXNldCA9IDA7Ci0KLQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgdGhyZWFkIHJ1bm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQlpZiAoY2x1c3Rlcl9saXN0ID09IE5VTEwpIHsKLQkgICAgcmVmcmVzaF9jbHVzdGVyX2xpc3QoKTsKLQl9Ci0KLQlpZiAoY2x1c3Rlcl9saXN0ICE9IE5VTEwpIHsKLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAqIGxvb3Agb24gdGhlIGNsdXN0ZXIgbGlzdCB3ZSBvYnRhaW5lZCBlYXJsaWVyIGZyb20gTG9hZExldmVsZXIuICAgICAgICAqCi0gICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkgICAgY2x1c3Rlcl9saXN0X2VsZW1lbnQgPSBjbHVzdGVyX2xpc3QtPmxfaGVhZDsKLQkgICAgd2hpbGUgKGNsdXN0ZXJfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsKLQkJY2x1c3Rlcl9vYmplY3QgPSBjbHVzdGVyX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsKLQkJY2x1c3Rlcl9saXN0X2VsZW1lbnQgPSBjbHVzdGVyX2xpc3RfZWxlbWVudC0+bF9uZXh0OwotCQlpZiAoY2x1c3Rlcl9vYmplY3QtPm5vZGVfaGFzaC0+Y291bnQgPD0gMCkgewotCQkgICAgc2xlZXBfdGltZV9yZXNldCA9IDE7Ci0JCX0KLQotCQlpZiAobXVsdGljbHVzdGVyX3N0YXR1cyA9PSAxKSB7Ci0KLQkgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICAqIHdlIGFyZSBydW5uaW5nIG11bHRpY2x1c3RlciAtIHNldCBjbHVzdGVyIG5hbWUgaW50byBlbnZpcm9ubWVudCAgICAgICAqCi0gICAgICAgICAgKiB0byBpbmZsdWVuY2Ugd2hlcmUgTG9hZExldmVsZXIgc2VhcmNoZXMgZm9yIGRhdGEgKHdoYXQgY2x1c3RlcikgICAgICAgKgotICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCSAgICByZW1vdGVfY2x1c3RlclswXSA9IGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWU7Ci0JCSAgICByZW1vdGVfY2x1c3RlclsxXSA9IE5VTEw7Ci0JCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlNldHRpbmcgYWNjZXNzIGZvciBMb2FkTGV2ZWxlciBjbHVzdGVyPSVzLlxuIiwKLQkJCQkgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCQkgICAgY2x1c3Rlcl9wYXJtLmFjdGlvbiA9IENMVVNURVJfU0VUOwotCQkgICAgY2x1c3Rlcl9wYXJtLmNsdXN0ZXJfbGlzdCA9IHJlbW90ZV9jbHVzdGVyOwotCQkgICAgcmMgPSBteV9sbF9jbHVzdGVyKExMX0FQSV9WRVJTSU9OLCAmZXJyT2JqLCAmY2x1c3Rlcl9wYXJtKTsKLQkJfQotCQllbHNlIHsKLQotCSAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICogbm90IHJ1bm5pbmcgbXVsdGljbHVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJICAiU2V0dGluZyBhY2Nlc3MgZm9yIExvYWRMZXZlbGVyIGxvY2FsIGNsdXN0ZXIgKHNpbmdsZSBjbHVzdGVyKS5cbiIpOwotCQkgICAgY2x1c3Rlcl9wYXJtLmFjdGlvbiA9IENMVVNURVJfVU5TRVQ7Ci0JCSAgICBjbHVzdGVyX3Bhcm0uY2x1c3Rlcl9saXN0ID0gTlVMTDsKLQkJICAgIHJjID0gbXlfbGxfY2x1c3RlcihMTF9BUElfVkVSU0lPTiwgJmVyck9iaiwgJmNsdXN0ZXJfcGFybSk7Ci0JCX0KLQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgICAqIGJ1aWxkIGEgTG9hZExldmVsZXIgcXVlcnkgb2JqZWN0IChmb3Igbm9kZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQlxdWVyeV9lbGVtID0gbXlfbGxfcXVlcnkoTUFDSElORVMpOwotCQlpZiAocXVlcnlfZWxlbSA9PSBOVUxMKSB7Ci0JCSAgICBwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsCi0JCQkJICAiVW5hYmxlIHRvIG9idGFpbiBxdWVyeSBlbGVtZW50LiBMb2FkTGV2ZWxlciBtYXkgbm90IGJlIGFjdGl2ZSBvciBpcyBub3QgcmVzcG9uZGluZy5cbiIpOwotCQkgICAgY29udGludWU7Ci0JCX0KLQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgICAqIHNldCB0aGUgcmVxdWVzdCB0eXBlIGZvciBMb2FkTGV2ZWxlciAod2Ugd2FudCBub2RlcykgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCSAgICAgICJDYWxsIExvYWRMZXZlbGVyIChsbF9zZXRfcmVxdWVzdCkgZm9yIG5vZGVzIGluIGNsdXN0ZXI9JXMuXG4iLAotCQkJICAgICAgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCXJjID0gbXlfbGxfc2V0X3JlcXVlc3QocXVlcnlfZWxlbSwgUVVFUllfQUxMLCBOVUxMLCBBTExfREFUQSk7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCSAgICByYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0JCSAgICBxdWVyeV9lbGVtID0gTlVMTDsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgKiBnZXQgbm9kZXMgZnJvbSBMb2FkTGV2ZWxlciBmb3IgY3VycmVudCBvciBsb2NhbCBjbHVzdGVyLiAgICAgICAgICAgICAgKgotICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkgICAgICAiQ2FsbCBMb2FkTGV2ZWxlciAobGxfZ2V0X29ianMpIGZvciBub2RlcyBpbiBjbHVzdGVyPSVzLlxuIiwKLQkJCSAgICAgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCQlub2RlID0gbXlfbGxfZ2V0X29ianMocXVlcnlfZWxlbSwgTExfQ00sIE5VTEwsICZub2RlX2NvdW50LCAmcmMpOwotCQlpZiAocmMgIT0gMCkgewotCQkgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotCQkgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCi0JCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTnVtYmVyIG9mIExvYWRMZXZlbGVyIE5vZGVzPSVkIGluIGNsdXN0ZXI9JXMuXG4iLAotCQkJICAgICAgbm9kZV9jb3VudCwgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgKiBsb29wIG9uIHRoZSBub2RlcyByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJaSA9IDA7Ci0JCXdoaWxlIChub2RlICE9IE5VTEwpIHsKLQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTG9hZExldmVsZXIgTm9kZSAlZDpcbiIsIGkpOwotCQkgICAgcmMgPSBteV9sbF9nZXRfZGF0YShub2RlLCBMTF9NYWNoaW5lTmFtZSwgJm5vZGVfbmFtZSk7Ci0JCSAgICBpZiAocmMgPT0gMCkgewotCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJOb2RlIG5hbWU9JXNcbiIsIG5vZGVfbmFtZSk7Ci0JCQlpZiAoKG5vZGVfb2JqZWN0ID0gZ2V0X25vZGVfaW5faGFzaChjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoLCBub2RlX25hbWUpKSAhPSBOVUxMKSB7Ci0KLQkgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgKiBub2RlIHJldHVybmVkIGJ5IExvYWRMZXZlbGVyIHdhcyBmb3VuZCBpbiBvdXIgcHRwIG5vZGUgbGlzdC4gICAgICAgICAgKgotICAgICAgICAgICAgICAgKiBmbGFnIGl0IGFzIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCSAgICBub2RlX29iamVjdC0+bm9kZV9mb3VuZCA9IDE7Ci0JCQkgICAgaWYgKG5vZGVfb2JqZWN0LT5ub2RlX3N0YXRlICE9IE1ZX1NUQVRFX1VQKSB7Ci0JCQkJbm9kZV9vYmplY3QtPm5vZGVfc3RhdGUgPSBNWV9TVEFURV9VUDsKLQkJCQlzbGVlcF90aW1lX3Jlc2V0ID0gMTsKLQkJCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogbm9kZT0lcyBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJICAgICAgbm9kZV9uYW1lLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQlzZW5kTm9kZUNoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBjbHVzdGVyX29iamVjdCwKLQkJCQkJCSAgICBub2RlX29iamVjdCk7Ci0JCQkgICAgfQotCQkJfQotCQkJZWxzZSB7CS8qIG5ldyBub2RlIChub3QgeWV0IGluIGxpc3QpICovCi0KLQkgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgKiBub2RlIHJldHVybmVkIGJ5IExvYWRMZXZlbGVyIHdhcyBub3QgZm91bmQgaW4gb3VyIHB0cCBub2RlIGxpc3QgICAgICAgKgotICAgICAgICAgICAgICAgKiBhZGQgaXQgYW5kIGdlbmVyYXRlIGFuIGV2ZW50IHRvIHRoZSBndWkuIGZsYWcgaXQgYXMgYWRkZWQuICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCSAgICBub2RlX29iamVjdCA9IChOb2RlT2JqZWN0ICopIG1hbGxvYyhzaXplb2YoTm9kZU9iamVjdCkpOwotCQkJICAgIG1hbGxvY19jaGVjayhub2RlX29iamVjdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JCQkgICAgbWVtc2V0KG5vZGVfb2JqZWN0LCAnXDAnLCBzaXplb2Yobm9kZV9vYmplY3QpKTsKLQkJCSAgICBub2RlX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX25vZGVfaWQgPSBnZW5lcmF0ZV9pZCgpOwotCQkJICAgIG5vZGVfb2JqZWN0LT5ub2RlX25hbWUgPSBzdHJkdXAobm9kZV9uYW1lKTsKLQkJCSAgICBub2RlX29iamVjdC0+bm9kZV9mb3VuZCA9IDI7Ci0JCQkgICAgbm9kZV9vYmplY3QtPm5vZGVfc3RhdGUgPSBNWV9TVEFURV9VUDsKLQkJCSAgICBzbGVlcF90aW1lX3Jlc2V0ID0gMTsKLQkJCSAgICBhZGRfbm9kZV90b19oYXNoKGNsdXN0ZXJfb2JqZWN0LT5ub2RlX2hhc2gsICh2b2lkICopIG5vZGVfb2JqZWN0KTsKLQkJCSAgICBzbGVlcF90aW1lX3Jlc2V0ID0gMTsKLQkJCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJICAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBub2RlPSVzIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJICBub2RlX25hbWUsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCQkJICAgIHNlbmROb2RlQWRkRXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGNsdXN0ZXJfb2JqZWN0LCBub2RlX29iamVjdCk7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICAgIGkrKzsKLQkJICAgIG5vZGUgPSBteV9sbF9uZXh0X29iaihxdWVyeV9lbGVtKTsKLQkJfQotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICogbG9vcCBvbiB0aGUgcHRwIG5vZGUgbGlzdCB0byBzZWUgaWYgYW55IG5vZGVzIHdlcmUgbm90IHJldHVybmVkICAgICAgICoKLSAgICAgICAgICogYnkgTG9hZExldmVsZXIgb24gdGhpcyBwYXNzIChtYXliZSB0aGV5IHdlbnQgZG93bikuICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICogZ2VuZXJhdGUgYW4gZXZlbnQgKGNoYW5nZWQvZ29uZSkgdG8gdGhlIGd1aS4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCW5vZGVfaGFzaCA9IGNsdXN0ZXJfb2JqZWN0LT5ub2RlX2hhc2g7Ci0JCWlmIChub2RlX2hhc2ggIT0gTlVMTCkgewotCQkgICAgSGFzaFNldChub2RlX2hhc2gpOwotCQkgICAgaGFzaF9lbGVtZW50ID0gSGFzaEdldChub2RlX2hhc2gpOwotCQkgICAgd2hpbGUgKGhhc2hfZWxlbWVudCAhPSBOVUxMKSB7Ci0JCQlub2RlX2xpc3QgPSAoTGlzdCAqKSBoYXNoX2VsZW1lbnQtPmhfZGF0YTsKLQkJCWhhc2hfZWxlbWVudCA9IEhhc2hHZXQobm9kZV9oYXNoKTsKLQkJCW5vZGVfbGlzdF9lbGVtZW50ID0gbm9kZV9saXN0LT5sX2hlYWQ7Ci0JCQl3aGlsZSAobm9kZV9saXN0X2VsZW1lbnQgIT0gTlVMTCkgewotCQkJICAgIG5vZGVfb2JqZWN0ID0gbm9kZV9saXN0X2VsZW1lbnQtPmxfdmFsdWU7Ci0JCQkgICAgbm9kZV9saXN0X2VsZW1lbnQgPSBub2RlX2xpc3RfZWxlbWVudC0+bF9uZXh0OwotCQkJICAgIGlmIChub2RlX29iamVjdC0+bm9kZV9mb3VuZCA9PSAwKSB7Ci0JCQkJaWYgKG5vZGVfb2JqZWN0LT5ub2RlX3N0YXRlICE9IE1ZX1NUQVRFX1VOS05PV04pIHsKLQkJCQkgICAgbm9kZV9vYmplY3QtPm5vZGVfc3RhdGUgPSBNWV9TVEFURV9VTktOT1dOOwotCQkJCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCSAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogbm9kZT0lcyBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJCSAgbm9kZV9uYW1lLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkgICAgc2VuZE5vZGVDaGFuZ2VFdmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwgY2x1c3Rlcl9vYmplY3QsCi0JCQkJCQkJbm9kZV9vYmplY3QpOwotCQkJCSAgICBzbGVlcF90aW1lX3Jlc2V0ID0gMTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICAgIGVsc2UgewotCQkJCW5vZGVfb2JqZWN0LT5ub2RlX2ZvdW5kID0gMDsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgIH0KLQkJfQotCQlpZiAocXVlcnlfZWxlbSAhPSBOVUxMKSB7Ci0JCSAgICByYyA9IG15X2xsX2ZyZWVfb2JqcyhxdWVyeV9lbGVtKTsKLQkJICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLQkJICAgIHF1ZXJ5X2VsZW0gPSBOVUxMOwotCQl9Ci0KLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgc2xlZXBfdGltZV9yZXNldCA9IDE7Ci0JfQotCi0JcHRocmVhZF9tdXRleF91bmxvY2soJm1hc3Rlcl9sb2NrKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogYWRqdXN0IHNsZWVwIGludGVydmFsIGJhc2VkIG9uIGNoYW5nZXMgdGhpcyBwYXNzLiAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlpZiAoc2xlZXBfdGltZV9yZXNldCA9PSAxKSB7Ci0JICAgIHNsZWVwX3NlY29uZHMgPSBtaW5fbm9kZV9zbGVlcF9zZWNvbmRzOwotCX0KLQllbHNlIHsKLQkgICAgc2xlZXBfc2Vjb25kcyA9IHNsZWVwX3NlY29uZHMgKyBtaW5fbm9kZV9zbGVlcF9zZWNvbmRzOwotCSAgICBpZiAoc2xlZXBfc2Vjb25kcyA+IG1heF9ub2RlX3NsZWVwX3NlY29uZHMpIHsKLQkJc2xlZXBfc2Vjb25kcyA9IG1heF9ub2RlX3NsZWVwX3NlY29uZHM7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqIHNsZWVwIGFuZCBsb29wIGFnYWluIG9uIHRoZSBMb2FkTGV2ZWxlciBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JaWYgKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSB7Ci0JICAgIGludCBzbGVlcF9pbnRlcnZhbCA9IDA7Ci0JICAgIGludCBtaW5pX3NsZWVwX2ludGVydmFsID0gKHNsZWVwX3NlY29uZHMgKyA0KSAvIDU7Ci0JICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiJXMgU2xlZXBpbmcgZm9yICglZCBzZWNvbmRzKSAlZCBpbnRlcnZhbHMgb2YgNSBzZWNvbmRzXG4iLAotCQkJICBfX0ZVTkNUSU9OX18sIG1pbmlfc2xlZXBfaW50ZXJ2YWwgKiA1LCBtaW5pX3NsZWVwX2ludGVydmFsKTsKLQkgICAgZm9yIChzbGVlcF9pbnRlcnZhbCA9IDA7IHNsZWVwX2ludGVydmFsIDwgbWluaV9zbGVlcF9pbnRlcnZhbDsgc2xlZXBfaW50ZXJ2YWwrKykgewotCQlpZiAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDApIHsKLQkJICAgIHNsZWVwKDUpOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTZXJ2aWNlIHRocmVhZCAtIExvb3Agd2hpbGUgYWxsb3dlZCB0byBtb25pdG9yIExvYWRMZXZlbGVyIGZvciBqb2JzICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICoKLW1vbml0b3JfTG9hZExldmVsZXJfam9icyh2b2lkICpqb2JfaWRlbnQpCi17Ci0gICAgaW50IHJjID0gMDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgY2hhciAqam9iX25hbWUgPSBOVUxMOwotICAgIGNoYXIgKmpvYl9zdWJtaXRfaG9zdCA9IE5VTEw7Ci0gICAgY2hhciAqc3RlcF9JRCA9IE5VTEw7Ci0gICAgTExfU1RFUF9JRCBsbF9zdGVwX2lkOwotICAgIGludCBzdGVwX21hY2hpbmVfY291bnQgPSAwOwotICAgIExMX2VsZW1lbnQgKmpvYiA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqc3RlcCA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqbm9kZSA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqdGFzayA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqdGFza19pbnN0YW5jZSA9IE5VTEw7Ci0gICAgaW50IGpvYl9jb3VudCA9IDA7Ci0gICAgTExfZWxlbWVudCAqZXJyT2JqID0gTlVMTDsKLSAgICBMTF9jbHVzdGVyX3BhcmFtIGNsdXN0ZXJfcGFybTsKLSAgICBjaGFyICpyZW1vdGVfY2x1c3RlclsyXTsKLSAgICBMaXN0RWxlbWVudCAqam9iX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0gICAgTGlzdCAqdGFza19saXN0ID0gTlVMTDsKLSAgICBMaXN0RWxlbWVudCAqdGFza19saXN0X2VsZW1lbnQgPSBOVUxMOwotICAgIGNoYXIgKnRhc2tfaW5zdGFuY2VfbWFjaGluZV9uYW1lID0gTlVMTDsKLSAgICBjaGFyICp0YXNrX2luc3RhbmNlX21hY2hpbmVfYWRkcmVzcyA9IE5VTEw7Ci0gICAgaW50IHRhc2tfaW5zdGFuY2VfdGFza19JRCA9IDA7Ci0gICAgaW50IHN0ZXBfbm9kZV9jb3VudCA9IDA7Ci0gICAgaW50IG5vZGVfdGFza19jb3VudCA9IDA7Ci0gICAgaW50IHRhc2tfaW5zdGFuY2VfY291bnQgPSAwOwotICAgIHRpbWVfdCBteV9jbG9jazsKLQotICAgIExpc3RFbGVtZW50ICpjbHVzdGVyX2xpc3RfZWxlbWVudCA9IE5VTEw7Ci0gICAgQ2x1c3Rlck9iamVjdCAqY2x1c3Rlcl9vYmplY3QgPSBOVUxMOwotICAgIEpvYk9iamVjdCAqam9iX29iamVjdCA9IE5VTEw7Ci0gICAgVGFza09iamVjdCAqdGFza19vYmplY3QgPSBOVUxMOwotCi0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgKiBsb29wIGZvcmV2ZXIgdW50aWwgd2UgYXJlIHRvbGQgd2UgYXJlIHNodXR0aW5nIGRvd24uICAgICAgICAgICAgICAgICAgKgotICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICB3aGlsZSAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDApIHsKLQlwdGhyZWFkX211dGV4X2xvY2soJm1hc3Rlcl9sb2NrKTsKLQlpZiAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDEpIHsKLQkgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1hc3Rlcl9sb2NrKTsKLQkgICAgYnJlYWs7Ci0JfQotCXF1ZXJ5X2VsZW0gPSBOVUxMOwotCWpvYl9uYW1lID0gTlVMTDsKLQlzdGVwX0lEID0gTlVMTDsKLQlqb2JfY291bnQgPSAwOwotCXN0ZXBfbWFjaGluZV9jb3VudCA9IDA7Ci0Jam9iID0gTlVMTDsKLQljaGFyICpwQ2hhciA9IE5VTEw7Ci0KLQlwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgdGhyZWFkIHJ1bm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQotCWlmIChjbHVzdGVyX2xpc3QgIT0gTlVMTCkgewotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICogbG9vcCBvbiB0aGUgY2x1c3RlciBsaXN0IHdlIG9idGFpbmVkIGVhcmxpZXIgZnJvbSBMb2FkTGV2ZWxlci4gICAgICAgICoKLSAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCSAgICBjbHVzdGVyX2xpc3RfZWxlbWVudCA9IGNsdXN0ZXJfbGlzdC0+bF9oZWFkOwotCSAgICB3aGlsZSAoY2x1c3Rlcl9saXN0X2VsZW1lbnQgIT0gTlVMTCkgewotCQljbHVzdGVyX29iamVjdCA9IGNsdXN0ZXJfbGlzdF9lbGVtZW50LT5sX3ZhbHVlOwotCQljbHVzdGVyX2xpc3RfZWxlbWVudCA9IGNsdXN0ZXJfbGlzdF9lbGVtZW50LT5sX25leHQ7Ci0KLQkJaWYgKGNsdXN0ZXJfb2JqZWN0ICE9IE5VTEwpIHsKLQkJICAgIGlmIChjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoICE9IE5VTEwpIHsKLQkJCWlmIChjbHVzdGVyX29iamVjdC0+bm9kZV9oYXNoLT5jb3VudCA+IDApIHsKLQotCQkJICAgIGlmIChtdWx0aWNsdXN0ZXJfc3RhdHVzID09IDEpIHsKLQotCSAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICogd2UgYXJlIHJ1bm5pbmcgbXVsdGljbHVzdGVyIC0gc2V0IGNsdXN0ZXIgbmFtZSBpbnRvIGVudmlyb25tZW50ICAgICAgICoKLSAgICAgICAgICAqIHRvIGluZmx1ZW5jZSB3aGVyZSBMb2FkTGV2ZWxlciBzZWFyY2hlcyBmb3IgZGF0YSAod2hhdCBjbHVzdGVyKSAgICAgICAqCi0gICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQlyZW1vdGVfY2x1c3RlclswXSA9IGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWU7Ci0JCQkJcmVtb3RlX2NsdXN0ZXJbMV0gPSBOVUxMOwotCQkJCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkgICAgICAiU2V0dGluZyBhY2Nlc3MgZm9yIExvYWRMZXZlbGVyIGNsdXN0ZXI9JXMuXG4iLAotCQkJCQkgICAgICBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQljbHVzdGVyX3Bhcm0uYWN0aW9uID0gQ0xVU1RFUl9TRVQ7Ci0JCQkJY2x1c3Rlcl9wYXJtLmNsdXN0ZXJfbGlzdCA9IHJlbW90ZV9jbHVzdGVyOwotCQkJCXJjID0gbXlfbGxfY2x1c3RlcihMTF9BUElfVkVSU0lPTiwgJmVyck9iaiwgJmNsdXN0ZXJfcGFybSk7Ci0JCQkgICAgfQotCQkJICAgIGVsc2UgewotCi0JIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgICAgKiBub3QgcnVubmluZyBtdWx0aWNsdXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCSAgICAgICJTZXR0aW5nIGFjY2VzcyBmb3IgTG9hZExldmVsZXIgbG9jYWwgY2x1c3RlciAoc2luZ2xlIGNsdXN0ZXIpLlxuIik7Ci0JCQkJY2x1c3Rlcl9wYXJtLmFjdGlvbiA9IENMVVNURVJfVU5TRVQ7Ci0JCQkJY2x1c3Rlcl9wYXJtLmNsdXN0ZXJfbGlzdCA9IE5VTEw7Ci0JCQkJcmMgPSBteV9sbF9jbHVzdGVyKExMX0FQSV9WRVJTSU9OLCAmZXJyT2JqLCAmY2x1c3Rlcl9wYXJtKTsKLQkJCSAgICB9Ci0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgKiBidWlsZCBhIExvYWRMZXZlbGVyIHF1ZXJ5IG9iamVjdCAoZm9yIGpvYnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCSAgICBxdWVyeV9lbGVtID0gbXlfbGxfcXVlcnkoSk9CUyk7Ci0JCQkgICAgaWYgKHF1ZXJ5X2VsZW0gPT0gTlVMTCkgewotCQkJCXByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwKLQkJCQkJICAgICAgIlVuYWJsZSB0byBvYnRhaW4gcXVlcnkgZWxlbWVudC4gTG9hZExldmVsZXIgbWF5IG5vdCBiZSBhY3RpdmUgb3IgaXMgbm90IHJlc3BvbmRpbmcuXG4iKTsKLQkJCQljb250aW51ZTsKLQkJCSAgICB9Ci0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgKiBzZXQgdGhlIHJlcXVlc3QgdHlwZSBmb3IgTG9hZExldmVsZXIgKHdlIHdhbnQgbm9kZXMpICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJICAiQ2FsbCBMb2FkTGV2ZWxlciAobGxfc2V0X3JlcXVlc3QpIGZvciBqb2JzIGluIGNsdXN0ZXI9JXMuXG4iLAotCQkJCQkgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCQkJICAgIHJjID0gbXlfbGxfc2V0X3JlcXVlc3QocXVlcnlfZWxlbSwgUVVFUllfQUxMLCBOVUxMLCBBTExfREFUQSk7Ci0JCQkgICAgaWYgKHJjICE9IDApIHsKLQkJCQlyYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0JCQkJcXVlcnlfZWxlbSA9IE5VTEw7Ci0JCQkJY29udGludWU7Ci0JCQkgICAgfQotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICogZ2V0IGpvYnMgZnJvbSBMb2FkTGV2ZWxlciBmb3IgY3VycmVudCBvciBsb2NhbCBjbHVzdGVyLiAgICAgICAgICAgICAgICoKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCSAgIkNhbGwgTG9hZExldmVsZXIgKGxsX2dldF9vYmpzKSBmb3Igam9icyBpbiBjbHVzdGVyPSVzLlxuIiwKLQkJCQkJICBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCSAgICBqb2JfY291bnQgPSAwOwotCQkJICAgIGpvYiA9IG15X2xsX2dldF9vYmpzKHF1ZXJ5X2VsZW0sIExMX0NNLCBOVUxMLCAmam9iX2NvdW50LCAmcmMpOwotCQkJICAgIGlmIChyYyAhPSAwKSB7Ci0JCQkJcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotCQkJCXF1ZXJ5X2VsZW0gPSBOVUxMOwotCQkJICAgIH0KLQotCQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkgICJOdW1iZXIgb2YgTG9hZExldmVsZXIgSm9icz0lZCBpbiBjbHVzdGVyPSVzLlxuIiwKLQkJCQkJICBqb2JfY291bnQsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICogbG9vcCBvbiB0aGUgam9icyByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkgICAgaSA9IDA7Ci0JCQkgICAgd2hpbGUgKGpvYiAhPSBOVUxMKSB7Ci0JCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJMb2FkTGV2ZWxlciBKb2IgJWQ6XG4iLCBpKTsKLQkJCQlyYyA9IG15X2xsX2dldF9kYXRhKGpvYiwgTExfSm9iU3VibWl0SG9zdCwgJmpvYl9zdWJtaXRfaG9zdCk7Ci0JCQkJcmMgPSBteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYk5hbWUsICZqb2JfbmFtZSk7Ci0JCQkJaWYgKHJjID09IDApIHsJLyogZG8gc29tZXRoaW5nIGhlcmUgd2l0aCB0aGUgam9iIG9iamVjdCAqLwotCQkJCSAgICAvKgotCQkJCSAgICAgKiBGb3IgaW50ZXJhY3RpdmUgUEUgam9icyBzdWJtaXR0ZWQgdGhydSBMb2FkTGV2ZWxlciwgdGhlcmUgaXMgbm8gd2F5IHRvIG1hdGNoCi0JCQkJICAgICAqIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBqb2IgdGhydSBQRSBhbmQgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGpvYiBpbiB0aGUgTG9hZGxldmVsZXIKLQkJCQkgICAgICogam9iIHF1ZXVlIHNpbmNlIHdoZW4gdGhlIGpvYiBpcyBzdWJtaXR0ZWQsIHRoZSBvbmx5IHRoaW5nIGtub3duIGlzIHRoZSBwaWQgb2YgdGhlIHBvZQotCQkJCSAgICAgKiBwcm9jZXNzLCBhbmQgdGhlIHBpZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSByZXNwb25zZXMgdG8gTG9hZExldmVsZXIgcXVlcmllcy4gSWYgdGhlIHBpZCB3YXMKLQkJCQkgICAgICogYXZhaWxhYmxlLCB0aGVuIHdlIGNvdWxkIG1hdGNoIHVwIGJhc2VkIG9uIHJlYWRpbmcgdGhlIGF0dGFjaC5jZmcgZmlsZSBnZW5lcmF0ZWQgYnkgUEUuCi0JCQkJICAgICAqIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byBhdHRlbXB0IHRvIGRldGVjdCBpbnRlcmFjdGl2ZSBQRSBqb2JzIGluIHRoZSBMb2FkTGV2ZWxlciBqb2IgcXVldWUKLQkJCQkgICAgICogYW5kIGlnbm9yZSB0aGVtLiBUaGUgcHJveHkgdGhyZWFkcyBjcmVhdGVkIHRvIG1vbml0b3IgaW50ZXJhY3RpdmUgUEUgc3RhdHVzIGJ5IHdhdGNoaW5nIGZvciB0aGUKLQkJCQkgICAgICogYXR0YWNoLmNmZyBmaWxlIGFuZCBwcm9jZXNzIHRlcm1pbmF0aW9uIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcgam9iIGV2ZW50cwotCQkJCSAgICAgKiBhbmQgYXNzb2NpYXRlZCBldmVudHMgZm9yIHRoZSBpbnRlcmFjdGl2ZSBQRSBqb2IuIFRoaXMgaXNuJ3QgMTAwJSBwZXJmZWN0LCBidXQgd2l0aCB0aGUgYXZhaWxhYmxlCi0JCQkJICAgICAqIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IHRoZSBiZXN0IHRoYXQgY2FuIGJlIGRvbmUuCi0JCQkJICAgICAqLwotCQkJCSAgICBpbnQgam9iX3N0ZXBfdHlwZTsKLQotCQkJCSAgICBteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYlN0ZXBUeXBlLCAmam9iX3N0ZXBfdHlwZSk7Ci0JCQkJICAgIGlmIChqb2Jfc3RlcF90eXBlID09IElOVEVSQUNUSVZFX0pPQikgewotCQkJCQlpbnQgam9iX2lzX3JlbW90ZTsKLQkJCQkJY2hhciAqc3VibWl0X3VzZXJfbmFtZTsKLQotCQkJCQlteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYklzUmVtb3RlLCAmam9iX2lzX3JlbW90ZSk7Ci0JCQkJCWlmIChqb2JfaXNfcmVtb3RlKSB7Ci0JCQkJCSAgICBteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYlN1Ym1pdHRpbmdVc2VyLAotCQkJCQkJCSAgICpzdWJtaXRfdXNlcl9uYW1lKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJICAgIExMX2VsZW1lbnQgKmpvYl9jcmVkZW50aWFsczsKLQotCQkJCQkgICAgbXlfbGxfZ2V0X2RhdGEoam9iLCBMTF9Kb2JDcmVkZW50aWFsLCAmam9iX2NyZWRlbnRpYWxzKTsKLQkJCQkJICAgIG15X2xsX2dldF9kYXRhKGpvYl9jcmVkZW50aWFscywgTExfQ3JlZGVudGlhbFVzZXJOYW1lLAotCQkJCQkJCSAgICZzdWJtaXRfdXNlcl9uYW1lKTsKLQkJCQkJfQotCQkJCQlpZiAoc3RyY21wKG15X3VzZXJuYW1lLCBzdWJtaXRfdXNlcl9uYW1lKSA9PSAwKSB7Ci0JCQkJCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkgICJKb2IgJXMgaXMgYW4gaW50ZXJhY3RpdmUgam9iIGZvciB0aGlzIHVzZXIsIGFuZCBpcyBpZ25vcmVkXG4iLAotCQkJCQkJCSAgam9iX25hbWUpOwotCQkJCQkgICAgZnJlZShzdWJtaXRfdXNlcl9uYW1lKTsKLQkJCQkJICAgIGpvYiA9IG15X2xsX25leHRfb2JqKHF1ZXJ5X2VsZW0pOwotCQkJCQkgICAgY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCSAgICBmcmVlKHN1Ym1pdF91c2VyX25hbWUpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQkJCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJKb2IgbmFtZT0lc1xuIiwgam9iX25hbWUpOwotCQkJCSAgICByYyA9IG15X2xsX2dldF9kYXRhKGpvYiwgTExfSm9iR2V0Rmlyc3RTdGVwLCAmc3RlcCk7Ci0JCQkJICAgIHdoaWxlIChzdGVwICE9IE5VTEwpIHsKLQkJCQkJc3RlcF9tYWNoaW5lX2NvdW50ID0gMDsKLQkJCQkJcmMgPSBteV9sbF9nZXRfZGF0YShzdGVwLCBMTF9TdGVwSUQsICZzdGVwX0lEKTsKLQkJCQkJaWYgKHJjICE9IDApIHsKLQkJCQkJICAgIHJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotCQkJCQkgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotCQkJCQkgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0JCQkJCSAgICBjb250aW51ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQotCSAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgICogYnJlYWsgdGhlIGpvYiBzdGVwIG5hbWUgYXBhcnQgaW50byBhIExvYWRMZXZlbGVyIExMX1NURVBfSUQgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkJCQkgICAgbGxfc3RlcF9pZC5mcm9tX2hvc3QgPSBzdHJkdXAoam9iX3N1Ym1pdF9ob3N0KTsKLQkJCQkJICAgIHBDaGFyID0gc3RlcF9JRCArIHN0cmxlbihqb2Jfc3VibWl0X2hvc3QpICsgMTsKLQkJCQkJICAgIHBDaGFyID0gc3RydG9rKHBDaGFyLCAiLiIpOwotCQkJCQkgICAgbGxfc3RlcF9pZC5jbHVzdGVyID0gYXRvaShwQ2hhcik7Ci0JCQkJCSAgICBwQ2hhciA9IHN0cnRvayhOVUxMLCAiLiIpOwotCQkJCQkgICAgbGxfc3RlcF9pZC5wcm9jID0gYXRvaShwQ2hhcik7Ci0KLQkJCQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiSm9iIHN0ZXAgSUQ9JXMuJWQuJWRcbiIsCi0JCQkJCQkJICBsbF9zdGVwX2lkLmZyb21faG9zdCwgbGxfc3RlcF9pZC5jbHVzdGVyLAotCQkJCQkJCSAgbGxfc3RlcF9pZC5wcm9jKTsKLQkJCQkJICAgIGlmICgoam9iX29iamVjdCA9IGdldF9qb2JfaW5fbGlzdChqb2JfbGlzdCwgbGxfc3RlcF9pZCkpICE9IE5VTEwpIHsKLQotCSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgICAgICAgICAqIHN0ZXAgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgd2FzIGZvdW5kIGluIG91ciBwdHAgam9iIGxpc3QuICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAqIGZsYWcgaXQgYXMgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkJCQkJam9iX29iamVjdC0+am9iX2ZvdW5kID0gMTsKLQkJCQkJCWlmIChqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPT0gTVlfU1RBVEVfVU5LTk9XTikgewotCQkJCQkJICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX0lETEU7Ci0JCQkJCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCQkJCSAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3RlciwKLQkJCQkJCQkJICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsCi0JCQkJCQkJCSAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkJCSAgICBzZW5kSm9iQ2hhbmdlRXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsCi0JCQkJCQkJCSAgICAgICBqb2Jfb2JqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCWlmIChtdWx0aWNsdXN0ZXJfc3RhdHVzID09IDEpIHsKLQkJCQkJCSAgICBpZiAoc3RyY21wKGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSwgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSkgIT0gMCkgewotCQkJCQkJCXNlbmRKb2JSZW1vdmVFdmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwKLQkJCQkJCQkJCSAgIGpvYl9vYmplY3QpOwotCQkJCQkJCWpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSA9IGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWU7Ci0JCQkJCQkJc2VuZEpvYkFkZEV2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLAotCQkJCQkJCQkJY2x1c3Rlcl9vYmplY3QsIGpvYl9vYmplY3QpOwotCQkJCQkJICAgIH0KLQkJCQkJCX0KLQkJCQkJICAgIH0KLQkJCQkJICAgIGVsc2UgewotCi0JICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICAgICAgICogam9iIHJldHVybmVkIGJ5IExvYWRMZXZlbGVyIHdhcyBub3QgZm91bmQgaW4gb3VyIHB0cCBqb2IgbGlzdCAgICAgICAgICoKLSAgICAgICAgICAgICAgICogYWRkIGl0IGFuZCBnZW5lcmF0ZSBhbiBldmVudCB0byB0aGUgZ3VpLiBmbGFnIGl0IGFzIGFkZGVkLiAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJCQlqb2Jfb2JqZWN0ID0KLQkJCQkJCSAgICAoSm9iT2JqZWN0ICopIG1hbGxvYyhzaXplb2YoSm9iT2JqZWN0KSk7Ci0JCQkJCQltYWxsb2NfY2hlY2soam9iX29iamVjdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JCQkJCQltZW1zZXQoam9iX29iamVjdCwgJ1wwJywgc2l6ZW9mKGpvYl9vYmplY3QpKTsKLQkJCQkJCWpvYl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9qb2JfaWQgPSBnZW5lcmF0ZV9pZCgpOwotCQkJCQkJam9iX29iamVjdC0+Z3VpX2Fzc2lnbmVkX2pvYl9pZCA9ICItMSI7Ci0JCQkJCQlqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCA9Ci0JCQkJCQkgICAgc3RyZHVwKGxsX3N0ZXBfaWQuZnJvbV9ob3N0KTsKLQkJCQkJCWpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3RlciA9IGxsX3N0ZXBfaWQuY2x1c3RlcjsKLQkJCQkJCWpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYyA9IGxsX3N0ZXBfaWQucHJvYzsKLQkJCQkJCWpvYl9vYmplY3QtPmpvYl9mb3VuZCA9IDI7Ci0JCQkJCQlqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPSBNWV9TVEFURV9JRExFOwotCQkJCQkJam9iX29iamVjdC0+dGFza19saXN0ID0gTmV3TGlzdCgpOwotCQkJCQkJam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lID0KLQkJCQkJCSAgICBzdHJkdXAoY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCQkJCQlhZGRfam9iX3RvX2xpc3Qoam9iX2xpc3QsICh2b2lkICopIGpvYl9vYmplY3QpOwotCQkJCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwKLQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsCi0JCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCSAgICAgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCQkJCQlzZW5kSm9iQWRkRXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsCi0JCQkJCQkJCWNsdXN0ZXJfb2JqZWN0LCBqb2Jfb2JqZWN0KTsKLQkJCQkJICAgIH0KLQkJCQkJICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEoc3RlcCwgTExfU3RlcE5vZGVDb3VudCwgJnN0ZXBfbm9kZV9jb3VudCk7Ci0JCQkJCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkgICJTdGVwPSVzLiVkLiVkLiBTdGVwTm9kZUNvdW50PSVkLlxuIiwKLQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCQkJCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLAotCQkJCQkJCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCSAgc3RlcF9ub2RlX2NvdW50KTsKLQotCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgICAqIGlmIHRoaXMgam9iIGZyb20gTG9hZExldmVsZXIgaGFzIG5vZGVzIChpcyBydW5uaW5nLWxpa2UpIHRoZW4gbG9vcCBvbiAqCi0gICAgICAgICAgICAgICAgICogdGhlIG5vZGVzIHRvIHNlZSB0YXNrIHN0YXR1cyBmb3IgbmV3IG9yIGV4aXN0aW5nIHRhc2tzLiAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQkJICAgIGlmIChzdGVwX25vZGVfY291bnQgPiAwKSB7Ci0JCQkJCQlyYyA9IG15X2xsX2dldF9kYXRhKHN0ZXAsIExMX1N0ZXBHZXRGaXJzdE5vZGUsICZub2RlKTsJLyogbm9kZSAqLwotCi0JCSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICAgICAgICAgICAqIGxvb3Agb24gdGhlIG5vZGVzIGluIHRoZSBqb2IgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQkJCXdoaWxlIChub2RlICE9IE5VTEwpIHsKLQkJCQkJCSAgICByYyA9IG15X2xsX2dldF9kYXRhKG5vZGUsIExMX05vZGVUYXNrQ291bnQsICZub2RlX3Rhc2tfY291bnQpOwotCQkJCQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkJCQkgICJOb2RlVGFza0NvdW50PSVkLlxuIiwKLQkJCQkJCQkJICBub2RlX3Rhc2tfY291bnQpOwotCQkJCQkJICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEobm9kZSwgTExfTm9kZUdldEZpcnN0VGFzaywgJnRhc2spOwotCi0JCSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICAgICAgICAgICAqIGxvb3Agb24gdGhlIHRhc2tzIGluIHRoZSBqb2IgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQkJCSAgICB3aGlsZSAodGFzayAhPSBOVUxMKSB7Ci0JCQkJCQkJcmMgPSBteV9sbF9nZXRfZGF0YSh0YXNrLCBMTF9UYXNrVGFza0luc3RhbmNlQ291bnQsICZ0YXNrX2luc3RhbmNlX2NvdW50KTsKLQkJCQkJCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkJICAgICAgIlRhc2tJbnN0YW5jZUNvdW50PSVkLlxuIiwKLQkJCQkJCQkJICAgICAgdGFza19pbnN0YW5jZV9jb3VudCk7Ci0JCQkJCQkJcmMgPSBteV9sbF9nZXRfZGF0YSh0YXNrLCBMTF9UYXNrR2V0Rmlyc3RUYXNrSW5zdGFuY2UsICZ0YXNrX2luc3RhbmNlKTsKLQotCQkgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3Agb24gdGhlIHRhc2tfaW5zdGFuY2VzIGluIHRoZSBqb2IgcmV0dXJuZWQgYnkgTG9hZExldmVsZXIgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJCQkJd2hpbGUgKHRhc2tfaW5zdGFuY2UgIT0gTlVMTCkgewotCQkJCQkJCSAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2tfaW5zdGFuY2UsIExMX1Rhc2tJbnN0YW5jZU1hY2hpbmVOYW1lLCAmdGFza19pbnN0YW5jZV9tYWNoaW5lX25hbWUpOwotCQkJCQkJCSAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2tfaW5zdGFuY2UsIExMX1Rhc2tJbnN0YW5jZU1hY2hpbmVBZGRyZXNzLCAmdGFza19pbnN0YW5jZV9tYWNoaW5lX2FkZHJlc3MpOwotCQkJCQkJCSAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2tfaW5zdGFuY2UsIExMX1Rhc2tJbnN0YW5jZVRhc2tJRCwgJnRhc2tfaW5zdGFuY2VfdGFza19JRCk7Ci0JCQkJCQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkJCQkJICAiVGFza0luc3RhbmNlTWFjaGluZU5hbWU9JXMuIFRhc2tJbnN0YW5jZU1hY2hpbmVBZGRyZXNzPSVzLiBUYXNrSW5zdGFuY2VUYXNrSUQ9JWQuXG4iLAotCQkJCQkJCQkJICB0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSwKLQkJCQkJCQkJCSAgdGFza19pbnN0YW5jZV9tYWNoaW5lX2FkZHJlc3MsCi0JCQkJCQkJCQkgIHRhc2tfaW5zdGFuY2VfdGFza19JRCk7Ci0JCQkJCQkJICAgIGlmICgodGFza19vYmplY3QgPSBnZXRfdGFza19pbl9saXN0KGpvYl9vYmplY3QtPnRhc2tfbGlzdCwgdGFza19pbnN0YW5jZV9tYWNoaW5lX25hbWUsIHRhc2tfaW5zdGFuY2VfdGFza19JRCkpICE9IE5VTEwpIHsKLQotCQkJIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0YXNrIHJldHVybmVkIGJ5IExvYWRMZXZlbGVyIHdhcyBmb3VuZCBpbiBvdXIgcHRwIGpvYiB0YXNrIGxpc3QuICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgICAgICogZmxhZyBpdCBhcyBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkJCQkJCQl0YXNrX29iamVjdC0+bGxfdGFza19pZCA9Ci0JCQkJCQkJCSAgICB0YXNrX2luc3RhbmNlX3Rhc2tfSUQ7Ci0JCQkJCQkJCXRhc2tfb2JqZWN0LT50YXNrX2ZvdW5kID0gMTsKLQkJCQkJCQkJaWYgKHRhc2tfb2JqZWN0LT50YXNrX3N0YXRlICE9Ci0JCQkJCQkJCSAgICBNWV9TVEFURV9SVU5OSU5HKSB7Ci0JCQkJCQkJCSAgICB0YXNrX29iamVjdC0+dGFza19zdGF0ZSA9Ci0JCQkJCQkJCQlNWV9TVEFURV9SVU5OSU5HOwotCQkJCQkJCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCQkJCQkJICAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBUYXNrX0lEPSVkIHJ1bm5pbmcgb24gbm9kZV9uYW1lPSVzIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBKb2I9JXMuJWQuJWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCQkJCQkJCSAgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQsCi0JCQkJCQkJCQkJICB0YXNrX29iamVjdC0+bm9kZV9uYW1lLAotCQkJCQkJCQkJCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC4KLQkJCQkJCQkJCQkgIGZyb21faG9zdCwKLQkJCQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuCi0JCQkJCQkJCQkJICBjbHVzdGVyLAotCQkJCQkJCQkJCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCQkJCSAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkJCQkJICAgIHNlbmRUYXNrQ2hhbmdlRXZlbnQKLQkJCQkJCQkJCShzdGFydF9ldmVudHNfdHJhbnNpZCwKLQkJCQkJCQkJCSBqb2Jfb2JqZWN0LCB0YXNrX29iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGpvYl9vYmplY3QtPmpvYl9zdGF0ZSAhPQotCQkJCQkJCQkgICAgTVlfU1RBVEVfUlVOTklORykgewotCQkJCQkJCQkgICAgam9iX29iamVjdC0+am9iX3N0YXRlID0KLQkJCQkJCQkJCU1ZX1NUQVRFX1JVTk5JTkc7Ci0JCQkJCQkJCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkJCQkgICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IEpvYj0lcy4lZC4lZCBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuCi0JCQkJCQkJCQkJICBmcm9tX2hvc3QsCi0JCQkJCQkJCQkJICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLgotCQkJCQkJCQkJCSAgY2x1c3RlciwKLQkJCQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywKLQkJCQkJCQkJCQkgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCQkJCQkJCSAgICBzZW5kSm9iQ2hhbmdlRXZlbnQKLQkJCQkJCQkJCShzdGFydF9ldmVudHNfdHJhbnNpZCwKLQkJCQkJCQkJCSBqb2Jfb2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCSAgICB9Ci0JCQkJCQkJICAgIGVsc2UgewotCi0JCQkgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGFzayByZXR1cm5lZCBieSBMb2FkTGV2ZWxlciB3YXMgbm90IGZvdW5kIGluIG91ciBwdHAgam9iIHRhc2sgbGlzdCAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZCBpdCBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQgdG8gdGhlIGd1aS4gZmxhZyBpdCBhcyBhZGRlZC4gICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQkJCQkJdGFza19vYmplY3QgPQotCQkJCQkJCQkgICAgKFRhc2tPYmplY3QgKikKLQkJCQkJCQkJICAgIG1hbGxvYyhzaXplb2YoVGFza09iamVjdCkpOwotCQkJCQkJCQltYWxsb2NfY2hlY2sodGFza19vYmplY3QsCi0JCQkJCQkJCQkgICAgIF9fRlVOQ1RJT05fXywKLQkJCQkJCQkJCSAgICAgX19MSU5FX18pOwotCQkJCQkJCQltZW1zZXQodGFza19vYmplY3QsICdcMCcsIHNpemVvZih0YXNrX29iamVjdCkpOwotCQkJCQkJCQl0YXNrX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWQgPSBnZW5lcmF0ZV9pZCgpOwotCQkJCQkJCQl0YXNrX29iamVjdC0+bGxfdGFza19pZCA9Ci0JCQkJCQkJCSAgICB0YXNrX2luc3RhbmNlX3Rhc2tfSUQ7Ci0JCQkJCQkJCXRhc2tfb2JqZWN0LT5ub2RlX25hbWUgPQotCQkJCQkJCQkgICAgc3RyZHVwCi0JCQkJCQkJCSAgICAodGFza19pbnN0YW5jZV9tYWNoaW5lX25hbWUpOwotCQkJCQkJCQl0YXNrX29iamVjdC0+bm9kZV9hZGRyZXNzID0KLQkJCQkJCQkJICAgIHN0cmR1cAotCQkJCQkJCQkgICAgKHRhc2tfaW5zdGFuY2VfbWFjaGluZV9hZGRyZXNzKTsKLQkJCQkJCQkJdGFza19vYmplY3QtPnRhc2tfZm91bmQgPSAyOwkvKiBmbGFnIGl0IGFzIGFkZGVkICovCi0JCQkJCQkJCXRhc2tfb2JqZWN0LT50YXNrX3N0YXRlID0KLQkJCQkJCQkJICAgIE1ZX1NUQVRFX1JVTk5JTkc7Ci0JCQkJCQkJCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkJCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsCi0JCQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsCi0JCQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsCi0JCQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCQkJCQkJCQlpZiAoam9iX29iamVjdC0+am9iX3N0YXRlICE9Ci0JCQkJCQkJCSAgICBNWV9TVEFURV9SVU5OSU5HKSB7Ci0JCQkJCQkJCSAgICBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPQotCQkJCQkJCQkJTVlfU1RBVEVfUlVOTklORzsKLQkJCQkJCQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkJCQkJCSAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGNoYW5nZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCQkJCQkJCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC4KLQkJCQkJCQkJCQkgIGZyb21faG9zdCwKLQkJCQkJCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuCi0JCQkJCQkJCQkJICBjbHVzdGVyLAotCQkJCQkJCQkJCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCQkJCSAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkJCQkJICAgIHNlbmRKb2JDaGFuZ2VFdmVudAotCQkJCQkJCQkJKHN0YXJ0X2V2ZW50c190cmFuc2lkLAotCQkJCQkJCQkJIGpvYl9vYmplY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFkZF90YXNrX3RvX2xpc3Qoam9iX29iamVjdC0+dGFza19saXN0LCAodm9pZCAqKSB0YXNrX29iamVjdCk7Ci0JCQkJCQkJCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkJCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogVGFza19JRD0lZCBydW5uaW5nIG9uIG5vZGVfbmFtZT0lcyBhZGRlZCBmb3IgTG9hZExldmVsZXIgSm9iPSVzLiVkLiVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJCQkJCSAgICAgIHRhc2tfb2JqZWN0LT5sbF90YXNrX2lkLAotCQkJCQkJCQkJICAgICAgdGFza19vYmplY3QtPm5vZGVfbmFtZSwKLQkJCQkJCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkJCQkJc2VuZFRhc2tBZGRFdmVudAotCQkJCQkJCQkgICAgKHN0YXJ0X2V2ZW50c190cmFuc2lkLAotCQkJCQkJCQkgICAgIGNsdXN0ZXJfb2JqZWN0LCBqb2Jfb2JqZWN0LAotCQkJCQkJCQkgICAgIHRhc2tfb2JqZWN0KTsKLQkJCQkJCQkgICAgfQotCQkJCQkJCSAgICByYyA9IG15X2xsX2dldF9kYXRhKHRhc2ssIExMX1Rhc2tHZXROZXh0VGFza0luc3RhbmNlLCAmdGFza19pbnN0YW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJjID0gbXlfbGxfZ2V0X2RhdGEobm9kZSwgTExfTm9kZUdldE5leHRUYXNrLCAmdGFzayk7Ci0JCQkJCQkgICAgfQotCQkJCQkJICAgIHJjID0gbXlfbGxfZ2V0X2RhdGEoc3RlcCwgTExfU3RlcEdldE5leHROb2RlLCAmbm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCSAgICB9Ci0KLQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgICAgICAgICAgICAgKiBsb29wIG9uIHRoZSB0YXNrcyBpbiB0aGUgam9iIG9iamVjdCAtIGlmIGFueSBub3QgZm91bmQgdGhhdCB3ZXJlICAgICAgKgotICAgICAgICAgICAgICAgICAqIHByZXNlbnQgYmVmb3JlIHRoZW4gZ2VuZXJhdGUgZGVsZXRlZCB0YXNrIGV2ZW50cy4gICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJCSAgICB0YXNrX2xpc3QgPSAoTGlzdCAqKSBqb2Jfb2JqZWN0LT50YXNrX2xpc3Q7Ci0JCQkJCSAgICB0YXNrX2xpc3RfZWxlbWVudCA9IHRhc2tfbGlzdC0+bF9oZWFkOwotCQkJCQkgICAgd2hpbGUgKHRhc2tfbGlzdF9lbGVtZW50ICE9IE5VTEwpIHsKLQkJCQkJCXRhc2tfb2JqZWN0ID0gdGFza19saXN0X2VsZW1lbnQtPmxfdmFsdWU7Ci0JCQkJCQl0YXNrX2xpc3RfZWxlbWVudCA9IHRhc2tfbGlzdF9lbGVtZW50LT5sX25leHQ7Ci0JCQkJCQlpZiAodGFza19vYmplY3QgIT0gMCkgewotCQkJCQkJICAgIGlmICh0YXNrX29iamVjdC0+dGFza19mb3VuZCA9PSAwKSB7Ci0JCQkJCQkJdGFza19vYmplY3QtPnRhc2tfc3RhdGUgPQotCQkJCQkJCSAgICBNWV9TVEFURV9URVJNSU5BVEVEOwotCQkJCQkJCXRhc2tfb2JqZWN0LT50YXNrX2ZvdW5kID0gMDsKLQkJCQkJCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogVGFza19JRD0lZCBydW5uaW5nIG9uIG5vZGVfbmFtZT0lcyBkZWxldGVkIGZvciBMb2FkTGV2ZWxlciBKb2I9JXMuJWQuJWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCQkJCQkgICAgICB0YXNrX29iamVjdC0+bGxfdGFza19pZCwKLQkJCQkJCQkJICAgICAgdGFza19vYmplY3QtPm5vZGVfbmFtZSwKLQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC4KLQkJCQkJCQkJICAgICAgZnJvbV9ob3N0LAotCQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLgotCQkJCQkJCQkgICAgICBjbHVzdGVyLAotCQkJCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsCi0JCQkJCQkJCSAgICAgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCQkJCQkJc2VuZFRhc2tSZW1vdmVFdmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwKLQkJCQkJCQkJCSAgICBqb2Jfb2JqZWN0LAotCQkJCQkJCQkJICAgIHRhc2tfb2JqZWN0KTsKLQkJCQkJCQlkZWxldGVfdGFza19mcm9tX2xpc3QodGFza19saXN0LCB0YXNrX29iamVjdCk7Ci0JCQkJCQkJaWYgKFNpemVPZkxpc3QodGFza19saXN0KSA9PSAwKSB7Ci0JCQkJCQkJICAgIGlmIChqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPT0KLQkJCQkJCQkJTVlfU1RBVEVfUlVOTklORykgewotCQkJCQkJCQlqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPSBNWV9TVEFURV9URVJNSU5BVEVEOwotCQkJCQkJCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkJCSAgICAgICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IEpvYj0lcy4lZC4lZCB0ZXJtaW5hdGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkJCQkJc2VuZEpvYkNoYW5nZUV2ZW50Ci0JCQkJCQkJCSAgICAoc3RhcnRfZXZlbnRzX3RyYW5zaWQsCi0JCQkJCQkJCSAgICAgam9iX29iamVjdCk7Ci0JCQkJCQkJICAgIH0KLQkJCQkJCQkgICAgZWxzZSB7Ci0JCQkJCQkJCWpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9Ci0JCQkJCQkJCSAgICBNWV9TVEFURV9JRExFOwotCQkJCQkJCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJCQkJCSAgICAgICJTY2hlZHVsZSBldmVudCBub3RpZmljYXRpb246IEpvYj0lcy4lZC4lZCBjaGFuZ2VkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkJCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkJCQkJICAgICAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkJCQkJc2VuZEpvYkNoYW5nZUV2ZW50Ci0JCQkJCQkJCSAgICAoc3RhcnRfZXZlbnRzX3RyYW5zaWQsCi0JCQkJCQkJCSAgICAgam9iX29iamVjdCk7Ci0JCQkJCQkJICAgIH0KLQkJCQkJCQl9Ci0JCQkJCQkgICAgfQotCQkJCQkJICAgIGVsc2UgewotCQkJCQkJCXRhc2tfb2JqZWN0LT50YXNrX2ZvdW5kID0gMDsKLQkJCQkJCSAgICB9Ci0JCQkJCQl9Ci0JCQkJCSAgICB9Ci0KLQotCQkJCQkgICAgcmMgPSBteV9sbF9nZXRfZGF0YShqb2IsIExMX0pvYkdldE5leHRTdGVwLCAmc3RlcCk7Ci0JCQkJCX0KLQkJCQkgICAgfQotCQkJCX0KLQotCQkJCWkrKzsKLQkJCQlqb2IgPSBteV9sbF9uZXh0X29iaihxdWVyeV9lbGVtKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkJaWYgKHF1ZXJ5X2VsZW0gIT0gTlVMTCkgewotCQkgICAgcmMgPSBteV9sbF9mcmVlX29ianMocXVlcnlfZWxlbSk7Ci0JCSAgICByYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0JCSAgICBxdWVyeV9lbGVtID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgKHF1ZXJ5X2VsZW0gIT0gTlVMTCkgewotCQlyYyA9IG15X2xsX2ZyZWVfb2JqcyhxdWVyeV9lbGVtKTsKLQkJcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotCQlxdWVyeV9lbGVtID0gTlVMTDsKLQkgICAgfQotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICogZ2V0IHRoZSB0aW1lIGFuZCBzZWUgaWYgam9iIGhhcyBiZWVuIHNpdHRpbmcgaW4gc3VibWl0dGVkIHN0YXRlIHRvbyAgICoKLSAgICAgICAqIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkgICAgdGltZSgmbXlfY2xvY2spOwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICogbG9vcCBvbiB0aGUgcHRwIGpvYiBsaXN0IHRvIHNlZSBpZiBhbnkgam9icyB3ZXJlIG5vdCByZXR1cm5lZCAgICAgICAgICoKLSAgICAgICAqIGJ5IExvYWRMZXZlbGVyIG9uIHRoaXMgcGFzcyAobWF5YmUgdGhleSB3ZW50IGRvd24pLiAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgKiBnZW5lcmF0ZSBhbiBldmVudCAoY2hhbmdlZC9nb25lKSB0byB0aGUgZ3VpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JICAgIGlmIChqb2JfbGlzdCAhPSBOVUxMKSB7Ci0JCWpvYl9saXN0X2VsZW1lbnQgPSBqb2JfbGlzdC0+bF9oZWFkOwotCQl3aGlsZSAoam9iX2xpc3RfZWxlbWVudCAhPSBOVUxMKSB7Ci0JCSAgICBqb2Jfb2JqZWN0ID0gam9iX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsKLQkJICAgIGpvYl9saXN0X2VsZW1lbnQgPSBqb2JfbGlzdF9lbGVtZW50LT5sX25leHQ7Ci0JCSAgICBpZiAoKGpvYl9vYmplY3QtPmpvYl9mb3VuZCA9PSAwKSAmJgotCQkJKChqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgIT0gTVlfU1RBVEVfVU5LTk9XTikgfHwKLQkJCSAoKG15X2Nsb2NrIC0gam9iX29iamVjdC0+am9iX3N1Ym1pdF90aW1lKSA+IDMwMCkpKSB7Ci0JCQlqb2Jfb2JqZWN0LT5qb2JfZm91bmQgPSAwOwotCi0JICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgICAgICAgKiBsb29wIG9uIHRoZSB0YXNrcyBpbiB0aGUgam9iIG9iamVjdCAtIHNlbmQgZGVsZXRlZCBldmVudCBhbmQgbWFyayAgICAgKgotICAgICAgICAgICAgICogYWxsIGRlbGV0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkJdGFza19saXN0ID0gKExpc3QgKikgam9iX29iamVjdC0+dGFza19saXN0OwotCQkJdGFza19saXN0X2VsZW1lbnQgPSB0YXNrX2xpc3QtPmxfaGVhZDsKLQkJCXdoaWxlICh0YXNrX2xpc3RfZWxlbWVudCAhPSBOVUxMKSB7Ci0JCQkgICAgdGFza19vYmplY3QgPSB0YXNrX2xpc3RfZWxlbWVudC0+bF92YWx1ZTsKLQkJCSAgICB0YXNrX2xpc3RfZWxlbWVudCA9IHRhc2tfbGlzdF9lbGVtZW50LT5sX25leHQ7Ci0JCQkgICAgaWYgKHRhc2tfb2JqZWN0ICE9IDApIHsKLQkJCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogVGFza19JRD0lZCBkZWxldGVkIG9uIG5vZGVfbmFtZT0lcyBkZWxldGVkIGZvciBMb2FkTGV2ZWxlciBKb2I9JXMuJWQuJWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCQkgICAgICB0YXNrX29iamVjdC0+bGxfdGFza19pZCwgdGFza19vYmplY3QtPm5vZGVfbmFtZSwKLQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsCi0JCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3RlciwKLQkJCQkJICAgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCQkgICAgICBqb2Jfb2JqZWN0LT5jbHVzdGVyX25hbWUpOwotCQkJCXNlbmRUYXNrUmVtb3ZlRXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYl9vYmplY3QsIHRhc2tfb2JqZWN0KTsKLQkJCQlkZWxldGVfdGFza19mcm9tX2xpc3QodGFza19saXN0LCB0YXNrX29iamVjdCk7Ci0JCQkJaWYgKFNpemVPZkxpc3QodGFza19saXN0KSA9PSAwKSB7Ci0JCQkJICAgIGpvYl9vYmplY3QtPmpvYl9zdGF0ZSA9IE1ZX1NUQVRFX0lETEU7Ci0JCQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJCQkJICAiU2NoZWR1bGUgZXZlbnQgbm90aWZpY2F0aW9uOiBKb2I9JXMuJWQuJWQgY2hhbmdlZCBmb3IgTG9hZExldmVsZXIgQ2x1c3Rlcj0lcy5cbiIsCi0JCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCQkJICBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsCi0JCQkJCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywKLQkJCQkJCSAgam9iX29iamVjdC0+Y2x1c3Rlcl9uYW1lKTsKLQkJCQkgICAgc2VuZEpvYkNoYW5nZUV2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBqb2Jfb2JqZWN0KTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCi0JCQlqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUgPSBNWV9TVEFURV9URVJNSU5BVEVEOwotCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIHRlcm1pbmF0ZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCSAgICAgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCQlzZW5kSm9iQ2hhbmdlRXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYl9vYmplY3QpOwotCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJICAgICAgIlNjaGVkdWxlIGV2ZW50IG5vdGlmaWNhdGlvbjogSm9iPSVzLiVkLiVkIGRlbGV0ZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LAotCQkJCSAgICAgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuY2x1c3Rlciwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLAotCQkJCSAgICAgIGpvYl9vYmplY3QtPmNsdXN0ZXJfbmFtZSk7Ci0JCQlzZW5kSm9iUmVtb3ZlRXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIGpvYl9vYmplY3QpOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQlqb2Jfb2JqZWN0LT5qb2JfZm91bmQgPSAwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0JcHRocmVhZF9tdXRleF91bmxvY2soJm1hc3Rlcl9sb2NrKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogc2xlZXAgYW5kIGxvb3AgYWdhaW4gb24gdGhlIExvYWRMZXZlbGVyIG1hY2hpbmVzLiAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlpZiAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDApIHsKLQkgICAgaW50IHNsZWVwX2ludGVydmFsID0gMDsKLQkgICAgaW50IG1pbmlfc2xlZXBfaW50ZXJ2YWwgPSAoam9iX3NsZWVwX3NlY29uZHMgKyA0KSAvIDU7Ci0JICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiJXMgU2xlZXBpbmcgZm9yICglZCBzZWNvbmRzKSAlZCBpbnRlcnZhbHMgb2YgNSBzZWNvbmRzXG4iLAotCQkJICBfX0ZVTkNUSU9OX18sIG1pbmlfc2xlZXBfaW50ZXJ2YWwgKiA1LCBtaW5pX3NsZWVwX2ludGVydmFsKTsKLQkgICAgZm9yIChzbGVlcF9pbnRlcnZhbCA9IDA7IHNsZWVwX2ludGVydmFsIDwgbWluaV9zbGVlcF9pbnRlcnZhbDsgc2xlZXBfaW50ZXJ2YWwrKykgewotCQlpZiAoc3RhdGVfc2h1dGRvd25fcmVxdWVzdGVkID09IDApIHsKLQkJICAgIHN0cnVjdCB0aW1lc3BlYyB3YWtldXBfdGltZTsKLQkJICAgIGludCBzdGF0dXM7Ci0KLQkJICAgIGdldHRpbWVvZmRheSgmd2FrZXVwX3RpbWUsIE5VTEwpOwotCQkgICAgd2FrZXVwX3RpbWUudHZfc2VjID0gd2FrZXVwX3RpbWUudHZfc2VjICsgNTsKLQkJICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmam9iX25vdGlmeV9sb2NrKTsKLQkJICAgIHN0YXR1cyA9Ci0JCQlwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZqb2Jfbm90aWZ5X2NvbmR2YXIsICZqb2Jfbm90aWZ5X2xvY2ssICZ3YWtldXBfdGltZSk7Ci0JCSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmam9iX25vdGlmeV9sb2NrKTsKLQkJICAgIGlmIChzdGF0dXMgPT0gMCkgewotCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJNYWluIHRocmVhZCByZXF1ZXN0cyBqb2IgcXVlcnlcbiIpOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCWlmIChzdGF0dXMgIT0gRVRJTUVET1VUKSB7Ci0JCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCSAgIkVycm9yIGluIGNvbmRpdGlvbiB3YWl0IGluIGpvYiBxdWVyeSB0aHJlYWQ6ICVzKCVkKVxuIiwKLQkJCQkJICBzdHJlcnJvcihzdGF0dXMpLCBzdGF0dXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJCSAgIkpvYiBxdWVyeSB0aHJlYWQgd29rZSB1cCBhZnRlciA1IHNlY29uZCB3YWl0XG4iKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFN1cHBvcnQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqKgotY3JlYXRlX2V4ZWNfcGFybWxpc3QoY2hhciAqZXhlY25hbWUsIGNoYXIgKnRhcmdldG5hbWUsIGNoYXIgKmFyZ3MsIGNoYXIgKmhlbHBlcikKLXsKLSAgICBjaGFyICp0b2tlbml6ZWRfYXJnczsKLSAgICBjaGFyICpjcDsKLSAgICBjaGFyICoqYXJndjsKLSAgICBpbnQgaTsKLSAgICBpbnQgYXJnX2NvdW50OwotICAgIGludCBzdGF0ZTsKLSAgICBjaGFyIHF1b3RlOwotICAgIC8qCi0gICAgICogUHJvY2VzcyBhcmd1bWVudCBsaXN0IHRvICdwb2UnIGNvbW1hbmQuIFRoaXMgaXMgZG9uZSBpbiB0d28gcGFzc2VzCi0gICAgICogVGhlIGZpcnN0IHBhc3MgZGV0ZXJtaW5lcyBob3cgbWFueSBhcmd1bWVudHMgdGhlcmUgYXJlIHNvIHRoYXQgYXJndgotICAgICAqIGNhbiBiZSBhbGxvY2F0ZWQsIGFuZCB0ZXJtaW5hdGVzIGVhY2ggYXJnIHdpdGggYSAnXDAnLiAgVGhlIGZpcnN0Ci0gICAgICogcGFzcyBpZ25vcmVzIHdoaXRlc3BhY2Ugb3V0c2lkZSBvZiBxdW90ZWQgc3RyaW5ncyB3aGVuIGNvdW50aW5nCi0gICAgICogYW5kIHRva2VuaXppbmcgYXJncy4gSXQgbXVzdCBwcmVzZXJ2ZSBzcGFjZXMgd2l0aGluIHF1b3RlZCBzdHJpbmdzCi0gICAgICogYW5kIGFsc28gZGVhbCB3aXRoIHF1b3RlZCBzdHJpbmdzIHdpdGhpbiBhbiBhcmcsIGZvciBpbnN0YW5jZQotICAgICAqICdUaGlzIGlzIGFuIGFyZyB3aXRoIGEgInF1b3RlZCBzdHJpbmciIGluc2lkZScKLSAgICAgKi8KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBhcmdfY291bnQgPSAzOwotICAgIGlmIChoZWxwZXIpCi0gICAgCWFyZ19jb3VudCsrOwotICAgIGlmIChhcmdzID09IE5VTEwpIHsKLQlhcmd2ID0gbWFsbG9jKGFyZ19jb3VudCAqIHNpemVvZihjaGFyICopKTsKLQltYWxsb2NfY2hlY2soYXJndiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JaSA9IDA7Ci0JYXJndltpKytdID0gZXhlY25hbWU7Ci0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLQlpZiAoaGVscGVyKQotCQlhcmd2W2krK10gPSBoZWxwZXI7Ci0jZW5kaWYKLQlhcmd2W2krK10gPSB0YXJnZXRuYW1lOwotCWFyZ3ZbaSsrXSA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotCXF1b3RlID0gJ1wwJzsKLQl0b2tlbml6ZWRfYXJncyA9IHN0cmR1cChhcmdzKTsKLQljcCA9IHRva2VuaXplZF9hcmdzOwotCXN0YXRlID0gU0tJUFBJTkdfU1BBQ0VTOwotCXdoaWxlICgqY3AgIT0gJ1wwJykgewotCSAgICBzd2l0Y2ggKCpjcCkgewotCQljYXNlICcgJzoKLQkJICAgIGlmIChzdGF0ZSA9PSBQQVJTSU5HX1VOUVVPVEVEX0FSRykgewotCQkJCWFyZ19jb3VudCsrOwotCQkJKmNwID0gJ1wwJzsKLQkJCXN0YXRlID0gU0tJUFBJTkdfU1BBQ0VTOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJyInOgotCQljYXNlICdcJyc6Ci0JCSAgICBpZiAoc3RhdGUgPT0gUEFSU0lOR19RVU9URURfQVJHKSB7Ci0JCQlpZiAoKmNwID09IHF1b3RlKSB7Ci0JCQkJYXJnX2NvdW50Kys7Ci0JCQkgICAgcXVvdGUgPSAnXDAnOwotCQkJICAgICpjcCA9ICdcMCc7Ci0JCQkgICAgc3RhdGUgPSBTS0lQUElOR19TUEFDRVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgICBxdW90ZSA9ICpjcDsKLQkJCSAgICBzdGF0ZSA9IFBBUlNJTkdfUVVPVEVEX0FSRzsKLQkJCX0KLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgaWYgKHN0YXRlID09IFNLSVBQSU5HX1NQQUNFUykgewotCQkJc3RhdGUgPSBQQVJTSU5HX1VOUVVPVEVEX0FSRzsKLQkJICAgIH0KLQkgICAgfQotCSAgICBjcCsrOwotCX0KLQlpZiAoc3RhdGUgIT0gU0tJUFBJTkdfU1BBQ0VTKSB7Ci0JICAgIC8qCi0JICAgICAqIExhc3QgYXJnIGlzIHRlcm1pbmF0ZWQgYnkgZW5kaW5nICdcMCcgc28gbmVlZHMgdG8gYmUgY291bnRlZCBoZXJlCi0JICAgICAqLwotCQlhcmdfY291bnQrKzsKLQl9Ci0JLyoKLQkgKiBUaGUgc2Vjb25kIHBhc3MgYWxsb2NhdGVzIGFyZ3YsIHdpdGggb25lIGV4dHJhIHNsb3QgZm9yIHRoZQotCSAqIHBvZSBleGVjdXRhYmxlLCBvbmUgZm9yIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGludm9rZWQgYnkKLQkgKiBwb2UgYW5kIG9uZSBmb3IgdGhlIHRlcm1pbmF0aW5nIG51bGwgcG9pbnRlci4gSXQgdGhlbiBidWlsZHMgdGhlCi0JICogYXJndiBhcnJheSBieSBzY2FubmluZyBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggYXJnLCBza2lwcGluZwotCSAqIG92ZXIgYW4gaW5pdGlhbCBxdW90ZSwgaWYgcHJlc2VudC4gVGhlIHRyYWlsaW5nIHF1b3RlIGluIGEKLQkgKiBxdW90ZWQgYXJnIHdhcyByZW1vdmVkIGJ5IHRoZSBmaXJzdCBwYXNzIHRva2VuaXppbmcgc3RlcC4KLQkgKi8KLQlhcmd2ID0gbWFsbG9jKHNpemVvZihjaGFyICopICogYXJnX2NvdW50KTsKLQltYWxsb2NfY2hlY2soYXJndiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JaSA9IDA7Ci0JYXJndltpKytdID0gZXhlY25hbWU7Ci0jaWZkZWYgUEVfRFVBTF9QT0VfREVCVUcKLQlpZiAoaGVscGVyKQotCQlhcmd2W2krK10gPSBoZWxwZXI7Ci0jZW5kaWYKLQlhcmd2W2krK10gPSB0YXJnZXRuYW1lOwotCWNwID0gdG9rZW5pemVkX2FyZ3M7Ci0Jc3RhdGUgPSBTS0lQUElOR19TUEFDRVM7Ci0Jd2hpbGUgKGkgPCAoYXJnX2NvdW50ICsgMikpIHsKLQkgICAgaWYgKHN0YXRlID09IFNLSVBQSU5HX1NQQUNFUykgewotCQlpZiAoKmNwICE9ICcgJykgewotCQkgICAgc3RhdGUgPSBTS0lQUElOR19DSEFSUzsKLQkJICAgIGlmICgoKmNwID09ICciJykgfHwgKCpjcCA9PSAnXCcnKSkgewotCQkJYXJndltpXSA9IGNwICsgMTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJYXJndltpXSA9IGNwOwotCQkgICAgfQotCQkgICAgaSsrOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWlmICgqY3AgPT0gJ1wwJykgewotCQkgICAgc3RhdGUgPSBTS0lQUElOR19TUEFDRVM7Ci0JCX0KLQkgICAgfQotCSAgICBjcCsrOwotCX0KLQlhcmd2W2ldID0gTlVMTDsKLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLSAgICByZXR1cm4gYXJndjsKLX0KLQotY2hhciAqKgotY3JlYXRlX2RlYnVnX3Bhcm1saXN0KGNoYXIgKmRlYnVnbmFtZSwgaW50IGRlYnVnX2FyZ3NfY291bnQsIGNoYXIgKipkZWJ1Z19hcmdzKQotewotICAgIGNoYXIgKiphcmd2OwotICAgIGludCBuOwotICAgIGludCBpOwotCi0gICAgYXJndiA9IChjaGFyICoqKSBtYWxsb2MoKGRlYnVnX2FyZ3NfY291bnQgKyAzKSAqIHNpemVvZihjaGFyICopKTsKLSAgICBtYWxsb2NfY2hlY2soYXJndiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgbiA9IDA7Ci0gICAgYXJndltuKytdID0gZGVidWduYW1lOwotICAgIGFyZ3ZbbisrXSA9ICItLW1hc3RlciI7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRlYnVnX2FyZ3NfY291bnQ7IGkrKykgewotCWFyZ3ZbbisrXSA9IGRlYnVnX2FyZ3NbaV07Ci0gICAgfQotICAgIGFyZ3ZbbisrXSA9IE5VTEw7Ci0gICAgcmV0dXJuIGFyZ3Y7Ci19Ci0KLWNoYXIgKioKLWNyZWF0ZV9jaGlsZF9zZG1fcGFybWxpc3QoY2hhciAqZGVidWdkaXIsIGNoYXIgKmRlYnVnbmFtZSwgaW50IGRlYnVnX2FyZ3NfY291bnQsIGNoYXIgKipkZWJ1Z19hcmdzKQotewotICAgIGNoYXIgKmRlYnVnZ2VyOwotICAgIGNoYXIgKiphcmd2OwotICAgIGludCBsZW47Ci0gICAgaW50IG47Ci0gICAgaW50IGk7Ci0KLSAgICBsZW4gPSBzdHJsZW4oZGVidWdkaXIpICsgc3RybGVuKGRlYnVnbmFtZSkgKyAyOwotICAgIGRlYnVnZ2VyID0gKGNoYXIgKikgbWFsbG9jKGxlbiAqIHNpemVvZihjaGFyKSk7Ci0gICAgbWFsbG9jX2NoZWNrKGRlYnVnZ2VyLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBhcmd2ID0gKGNoYXIgKiopIG1hbGxvYygoZGVidWdfYXJnc19jb3VudCArIDMpICogc2l6ZW9mKGNoYXIgKikpOwotICAgIG1hbGxvY19jaGVjayhhcmd2LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBzcHJpbnRmKGRlYnVnZ2VyLCAiJXMvJXMiLCBkZWJ1Z2RpciwgZGVidWduYW1lKTsKLSAgICBuID0gMDsKLSAgICBhcmd2W24rK10gPSAicG9lIjsKLSAgICBhcmd2W24rK10gPSBkZWJ1Z2dlcjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVidWdfYXJnc19jb3VudDsgaSsrKSB7Ci0JYXJndltuKytdID0gZGVidWdfYXJnc1tpXTsKLSAgICB9Ci0gICAgYXJndltuKytdID0gTlVMTDsKLSAgICByZXR1cm4gYXJndjsKLX0KLQotY2hhciAqKgotY3JlYXRlX2Vudl9hcnJheShjaGFyICphcmdzW10sIGludCBzcGxpdF9pbywgY2hhciAqbXBfYnVmZmVyX21lbSwgY2hhciAqbXBfcmRtYV9jb3VudCwgY2hhciAqZGVidWdnZXJfaWQsIGludCBpc19kZWJ1Z2dlcikKLXsKLSAgICAvKgotICAgICAqIFNldCB1cCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXJyYXkgZm9yIHRoZSB0YXJnZXQgYXBwbGljYXRpb24uCi0gICAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGhhdmUgdHdvIGZvcm1zLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IG9uCi0gICAgICogdGhlIGVudmlyb25tZW50IHRhYiBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaGF2ZSB0aGUgZm9ybQotICAgICAqIGVudj1IT01FPS9ob21lL3B0cHVzZXIuIFBFIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgb24gdGhlCi0gICAgICogcGFyYWxsZWwgdGFiIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBoYXZlIHRoZSBmb3JtIE1QX1BST0NTPTIKLSAgICAgKiBCb3RoIHR5cGVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWRkZWQgdG8gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogZW52aXJvbm1lbnQgYXJyYXkgaW4gdGhlIGZvcm0gSE9NRT0vaG9tZS9wdHB1c2VyLgotICAgICAqIFRoZSB1c2VyIG1heSBoYXZlIHJlcXVlc3RlZCBzdGRvdXQgb3V0cHV0IHRvIGJlIHNwbGl0IGJ5IHRhc2suIElmIHNvLAotICAgICAqIHRoZW4gTVBfTEFCRUxJTyBtdXN0IGJlIHNldCB0byAneWVzJyBhcyB0aGUgbGFzdCBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICAqIHNldHRpbmcgaW4gdGhlIGFycmF5LgotICAgICAqIE5vIG90aGVyIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBpbnQgaTsKLSAgICBpbnQgaGFzX21wX3Byb2NzID0gMDsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGVudl9hcnJheV9zaXplID0gMTAwOwotICAgIG5leHRfZW52X2VudHJ5ID0gMDsKLSAgICBlbnZfYXJyYXkgPSAoY2hhciAqKikgbWFsbG9jKHNpemVvZihjaGFyICopICogZW52X2FycmF5X3NpemUpOwotICAgIGZvciAoaSA9IDA7IGFyZ3NbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JaWYgKHN0cm5jbXAoYXJnc1tpXSwgIk1QXyIsIDMpID09IDApIHsKLSNpZmRlZiBQRV9EVUFMX1BPRV9ERUJVRwotCQlpZiAoaXNfZGVidWdnZXIgJiYgc3RybmNtcChhcmdzW2ldLCAiTVBfUFJPQ1M9IiwgOSkgPT0gMCkgewotCQkJaW50IG5wcm9jcyA9IGF0b2koYXJnc1tpXSArIDkpICsgMTsKLQkJCWNoYXIgcHJvY3Nfc3RyWzEyOF07Ci0KLQkJCXNucHJpbnRmKHByb2NzX3N0ciwgc2l6ZW9mKHByb2NzX3N0ciksICJNUF9QUk9DUz0lZCIsIG5wcm9jcyk7Ci0JCQlhZGRfZW52aXJvbm1lbnRfdmFyaWFibGUoc3RyZHVwKHByb2NzX3N0cikpOwotCQkJaGFzX21wX3Byb2NzID0gMTsKLQkJfQotCQllbHNlIGlmIChpc19kZWJ1Z2dlciAmJiBzdHJuY21wKGFyZ3NbaV0sICJNUF9NU0dfQVBJPSIsIDExKSA9PSAwKSB7Ci0JCQkvKiBTdHJpcCB0aGlzIG91dCBhbmQgcmVwbGFjZSB3aXRoIFBFX0RFQlVHX01TR19BUEkgKHNlZSBiZWxvdykgKi87Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRfZW52aXJvbm1lbnRfdmFyaWFibGUoc3RyZHVwKGFyZ3NbaV0pKTsKLQkJfQotI2Vsc2UKLQkJYWRkX2Vudmlyb25tZW50X3ZhcmlhYmxlKHN0cmR1cChhcmdzW2ldKSk7Ci0jZW5kaWYKLQl9Ci0JZWxzZSB7Ci0JICAgIGlmIChzdHJuY21wKGFyZ3NbaV0sICJlbnY9IiwgNCkgPT0gMCkgewotCSAgICAJYWRkX2Vudmlyb25tZW50X3ZhcmlhYmxlKHN0cmR1cChhcmdzW2ldKSArIDQpOwotCSAgICB9Ci0JfQotICAgIH0KLSNpZmRlZiBQRV9EVUFMX1BPRV9ERUJVRwotICAgIGlmIChpc19kZWJ1Z2dlciAmJiAhaGFzX21wX3Byb2NzKQotICAgIAlhZGRfZW52aXJvbm1lbnRfdmFyaWFibGUoIk1QX1BST0NTPTIiKTsKLSNlbmRpZgotCi0gICAgaWYgKHNwbGl0X2lvID09IDEpIHsKLQlhZGRfZW52aXJvbm1lbnRfdmFyaWFibGUoIk1QX0xBQkVMSU89eWVzIik7Ci0gICAgfQotICAgIGlmIChtcF9idWZmZXJfbWVtICYmIG1wX2J1ZmZlcl9tZW1bMF0gIT0gJ1wwJykgewotCWFkZF9lbnZpcm9ubWVudF92YXJpYWJsZShtcF9idWZmZXJfbWVtKTsKLSAgICB9Ci0gICAgaWYgKG1wX3JkbWFfY291bnQgJiYgbXBfcmRtYV9jb3VudFswXSAhPSAnXDAnKSB7Ci0JYWRkX2Vudmlyb25tZW50X3ZhcmlhYmxlKG1wX3JkbWFfY291bnQpOwotICAgIH0KLSNpZmRlZiBQRV9EVUFMX1BPRV9ERUJVRwotICAgIGlmIChkZWJ1Z2dlcl9pZCAmJiBkZWJ1Z2dlcl9pZFswXSAhPSAnXDAnKSB7Ci0gICAgCWFkZF9lbnZpcm9ubWVudF92YXJpYWJsZShkZWJ1Z2dlcl9pZCk7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKHVzZV9sb2FkX2xldmVsZXIpIHsKLQlhZGRfZW52aXJvbm1lbnRfdmFyaWFibGUoIk1QX1JFU0Q9eWVzIik7Ci0JcHJpbnRfbWVzc2FnZShUUkFDRV9ERVRBSUxfTUVTU0FHRSwgIlBFIEpvYiB1c2VzIExvYWRMZXZlbGVyIHJlc291cmNlIG1hbmFnZW1lbnRcbiIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhZGRfZW52aXJvbm1lbnRfdmFyaWFibGUoIk1QX1JFU0Q9bm8iKTsKLSAgICB9Ci0gICAgYWRkX2Vudmlyb25tZW50X3ZhcmlhYmxlKE5VTEwpOwotICAgIFRSQUNFX0VYSVQ7Ci0gICAgcmV0dXJuIGVudl9hcnJheTsKLX0KLQotLyoKLSAqIEFkZCB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBwb2UgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQKLSAqLwotdm9pZAotYWRkX2Vudmlyb25tZW50X3ZhcmlhYmxlKGNoYXIgKmVudl92YXIpCi17Ci0gICAgaWYgKG5leHRfZW52X2VudHJ5ID49IGVudl9hcnJheV9zaXplKSB7Ci0JZW52X2FycmF5X3NpemUgPSBlbnZfYXJyYXlfc2l6ZSArIDEwOwotCWVudl9hcnJheSA9IChjaGFyICoqKSByZWFsbG9jKGVudl9hcnJheSwgc2l6ZW9mKGNoYXIgKikgKiBlbnZfYXJyYXlfc2l6ZSk7Ci0JbWFsbG9jX2NoZWNrKGVudl9hcnJheSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgfQotICAgIGVudl9hcnJheVtuZXh0X2Vudl9lbnRyeSsrXSA9IGVudl92YXI7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3Igc3RkaW8gb3V0cHV0IGZpbGVzCi0gKi8KLWludAotc2V0dXBfc3RkaW9fZmQoaW50IHJ1bl90cmFuc19pZCwgY2hhciAqc3ViaWQsIGludCBwaXBlX2Zkc1tdLCBjaGFyICpwYXRoLCBjaGFyICpzdGRpb19uYW1lLCBpbnQgKmZkLAotCSAgICAgICBpbnQgKnJlZGlyZWN0KQotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBpZiAocGF0aCA9PSBOVUxMKSB7Ci0Jc3RhdHVzID0gcGlwZShwaXBlX2Zkcyk7Ci0JaWYgKHN0YXR1cyA9PSAtMSkgewotCSAgICBzbnByaW50ZihlbXNnX2J1ZmZlciwgc2l6ZW9mIGVtc2dfYnVmZmVyLAotCQkgICAgICJFcnJvciBjcmVhdGluZyAlcyBwaXBlOiAlcyIsIHN0ZGlvX25hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JICAgIGVtc2dfYnVmZmVyW3NpemVvZiBlbXNnX2J1ZmZlciAtIDFdID0gJ1wwJzsKLQkgICAgcG9zdF9zdWJtaXRqb2JfZXJyb3IocnVuX3RyYW5zX2lkLCBzdWJpZCwgZW1zZ19idWZmZXIpOwotCSAgICBUUkFDRV9FWElUOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCXN0YXR1cyA9IGZjbnRsKHBpcGVfZmRzWzBdLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLQlpZiAoc3RhdHVzID09IC0xKSB7Ci0JICAgIHNucHJpbnRmKGVtc2dfYnVmZmVyLCBzaXplb2YgZW1zZ19idWZmZXIsCi0JCSAgICAgIkVycm9yIGluaXRpYWxpemluZyAlcyBwaXBlOiAlcyIsIHN0ZGlvX25hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JICAgIGVtc2dfYnVmZmVyW3NpemVvZiBlbXNnX2J1ZmZlciAtIDFdID0gJ1wwJzsKLQkgICAgcG9zdF9zdWJtaXRqb2JfZXJyb3IocnVuX3RyYW5zX2lkLCBzdWJpZCwgZW1zZ19idWZmZXIpOwotCSAgICBUUkFDRV9FWElUOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCSpmZCA9IHBpcGVfZmRzWzBdOwotCSpyZWRpcmVjdCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCSpmZCA9IG9wZW4ocGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOwotCWlmICgqZmQgPT0gLTEpIHsKLQkgICAgc25wcmludGYoZW1zZ19idWZmZXIsIHNpemVvZiBlbXNnX2J1ZmZlciwKLQkJICAgICAiRXJyb3IgcmVkaXJlY3RpbmcgJXMgdG8gJXM6ICVzIiwgc3RkaW9fbmFtZSwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLQkgICAgZW1zZ19idWZmZXJbc2l6ZW9mIGVtc2dfYnVmZmVyIC0gMV0gPSAnXDAnOwotCSAgICBwb3N0X3N1Ym1pdGpvYl9lcnJvcihydW5fdHJhbnNfaWQsIHN1YmlkLCBlbXNnX2J1ZmZlcik7Ci0JICAgIFRSQUNFX0VYSVQ7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JKnJlZGlyZWN0ID0gMTsKLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNldCB1cCBhIHN0ZGlvIGZpbGUgZGVzY3JpcHRvciBmb3IgY2hpbGQgcHJvY2VzcyBzbyBpdCBpcyByZWRpcmVjdGVkIHRvIGEgZmlsZSBvciBwaXBlCi0gKi8KLWludAotc2V0dXBfY2hpbGRfc3RkaW8oaW50IHJ1bl90cmFuc19pZCwgY2hhciAqc3ViaWQsIGludCBzdGRpb19mZCwgaW50IHJlZGlyZWN0LCBpbnQgKmZpbGVfZmQsIGludCBwaXBlX2ZkW10pCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGlmIChyZWRpcmVjdCkgewotCXN0YXR1cyA9IGR1cDIoKmZpbGVfZmQsIHN0ZGlvX2ZkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JY2xvc2UocGlwZV9mZFswXSk7Ci0Jc3RhdHVzID0gZHVwMihwaXBlX2ZkWzFdLCBzdGRpb19mZCk7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKLQlzbnByaW50ZihlbXNnX2J1ZmZlciwgc2l6ZW9mIGVtc2dfYnVmZmVyLAotCQkgIkVycm9yIHNldHRpbmcgc3RkaW8gZmlsZSBkZXNjcmlwdG9yICglZCkgZm9yIGFwcGxpY2F0aW9uOiAlcyIsCi0JCSBzdGRpb19mZCwgc3RyZXJyb3IoZXJybm8pKTsKLQllbXNnX2J1ZmZlcltzaXplb2YgZW1zZ19idWZmZXIgLSAxXSA9ICdcMCc7Ci0JcG9zdF9zdWJtaXRqb2JfZXJyb3IocnVuX3RyYW5zX2lkLCBzdWJpZCwgZW1zZ19idWZmZXIpOwotICAgIH0KLSAgICBUUkFDRV9FWElUOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQKLXVwZGF0ZV9ub2RlcyhpbnQgdHJhbnNfaWQsIEZJTEUgKiBob3N0bGlzdCkKLXsKLSAgICAvKgotICAgICAqIENyZWF0ZSBhIG5vZGUgbGlzdCwgY29udGFpbmluZyB1bmlxdWUgbm9kZXMsIGZyb20gdGhlIGhvc3RsaXN0IGZpbGUuCi0gICAgICogRWFjaCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBuZXcgbm9kZXMgbWF5IGJlIHJlZmVyZW5jZWQgaW4gdGhlCi0gICAgICogaG9zdGxpc3Qgc2luY2UgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gbW9kaWZ5aW5nIHRoZSBob3N0bGlzdC4gQW55Ci0gICAgICogbmV3IG5vZGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1hY2hpbmUgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIE1lc3NhZ2UgZm9ybWF0IGZvciBub2RlcyBtZXNzYWdlIGlzIGV2ZW50LWlkIChSVEVWX05BVFRSKSBmb2xsb3dlZCBieQotICAgICAqIGVuY29kZWQga2V5LXZhbHVlIHBhaXJzIHdoZXJlIGVhY2ggdG9rZW4gaXMgcHJlY2VkZWQgd2l0aCBvbmUgc3BhY2UuCi0gICAgICogTXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGluIHRoZSBtZXNzYWdlIHdpbGwgY2F1c2UgcGFyc2luZyBlcnJvcnMKLSAgICAgKiBpbiB0aGUgSmF2YSBjb2RlIGhhbmRsaW5nIHRoZSByZXNwb25zZS4KLSAgICAgKi8KLSAgICBjaGFyICpyZXM7Ci0gICAgY2hhciAqdmFsc3RyOwotICAgIGNoYXIgaG9zdG5hbWVbMjU2XTsKLSAgICBMaXN0ICpuZXdfbm9kZXM7Ci0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICB2YWxzdHIgPSBOVUxMOwotICAgIHJlcyA9IGZnZXRzKGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLCBob3N0bGlzdCk7Ci0gICAgbmV3X25vZGVzID0gTmV3TGlzdCgpOwotICAgIHdoaWxlIChyZXMgIT0gTlVMTCkgewotCWNoYXIgKmNwOwotCi0JLyoKLQkgKiBUcnVuY2F0ZSBub2RlIG5hbWUgdG8gc2hvcnQgZm9ybSBuYW1lCi0JICovCi0JY3AgPSBzdHJwYnJrKGhvc3RuYW1lLCAiLlxuXHIiKTsKLQlpZiAoY3AgIT0gTlVMTCkgewotCSAgICAqY3AgPSAnXDAnOwotCX0KLQlpZiAoZmluZF9ub2RlKGhvc3RuYW1lKSA9PSBOVUxMKSB7Ci0JICAgIG5vZGVfcmVmY291bnQgKm5vZGU7Ci0KLQkgICAgbm9kZSA9IGFkZF9ub2RlKGhvc3RuYW1lKTsKLQkgICAgQWRkVG9MaXN0KG5ld19ub2Rlcywgbm9kZSk7Ci0JICAgIG5vZGVfY291bnQgPSBub2RlX2NvdW50ICsgMTsKLQl9Ci0JcmVzID0gZmdldHMoaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSksIGhvc3RsaXN0KTsKLSAgICB9Ci0gICAgc2VuZF9uZXdfbm9kZV9saXN0KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBtYWNoaW5lX2lkLCBuZXdfbm9kZXMpOwotICAgIERlc3Ryb3lMaXN0KG5ld19ub2RlcywgTlVMTCk7Ci0gICAgVFJBQ0VfRVhJVDsKLX0KLQotbm9kZV9yZWZjb3VudCAqCi1maW5kX25vZGUoY2hhciAqa2V5KQotewotICAgIC8qCi0gICAgICogTG9vayBmb3Igbm9kZSB3aXRoIG1hdGNoaW5nIGtleSBpbiB0aGUgbm9kZSBsaXN0LiBUaGUgSGFzaFNlYXJjaAotICAgICAqIGZ1bmN0aW9uIG9ubHkgbG9va3MgZm9yIGEgbWF0Y2hpbmcgaGFzaCB2YWx1ZS4gU2luY2UgbXVsdGlwbGUga2V5cwotICAgICAqIG1heSBoYXNoIHRvIHRoZSBzYW1lIGhhc2ggdmFsdWUsIGFuIGFkZGl0aW9uYWwgY2hlY2sgbmVlZHMgdG8gYmUKLSAgICAgKiBtYWRlIG9mIGtleXMgdGhhdCBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlIGJlZm9yZSBkZXRlcm1pbmluZyBhIHRydWUKLSAgICAgKiBtYXRjaC4KLSAgICAgKi8KLSAgICBpbnQgaGFzaDsKLSAgICBMaXN0ICpub2RlX2xpc3Q7Ci0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBUUkFDRV9ERVRBSUxfVigiKysrIExvb2tpbmcgZm9yIG5vZGUgJyVzJ1xuIiwga2V5KTsKLSAgICBoYXNoID0gSGFzaENvbXB1dGUoa2V5LCBzdHJsZW4oa2V5KSk7Ci0gICAgbm9kZV9saXN0ID0gSGFzaFNlYXJjaChub2RlcywgaGFzaCk7Ci0gICAgaWYgKG5vZGVfbGlzdCA9PSBOVUxMKSB7Ci0JVFJBQ0VfRVhJVDsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0Jbm9kZV9yZWZjb3VudCAqbm9kZTsKLQotCS8qCi0JICogT3B0aW1hbGx5LCB0aGlzIGNvZGUgd291bGQgb2J0YWluIGEgbG9jayBvbiB0aGUgaGFzaCBub2RlIHJhdGhlcgotCSAqIHRoYW4gbG9ja2luZyBhbGwgYWNjZXNzZXMgdG8gbm9kZXMsIGJ1dCBjdXJyZW50bHkgdGhlIGhhc2ggZW50cnkKLQkgKiBvbmx5IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbGlzdC4gSWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbQotCSAqIHRoZW4gdGhlIGhhc2ggb2JqZWN0IGNvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBzdHJ1Y3R1cmUKLQkgKiBjb250YWluaW5nIHRoZSBub2RlIGxvY2sgYW5kIHRoZSBsaXN0IHBvaW50ZXIuCi0JICovCi0JcHRocmVhZF9tdXRleF9sb2NrKCZub2RlX2xvY2spOwotCVNldExpc3Qobm9kZV9saXN0KTsKLQlub2RlID0gR2V0TGlzdEVsZW1lbnQobm9kZV9saXN0KTsKLQl3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0JICAgIGlmIChzdHJjbXAoa2V5LCBub2RlLT5rZXkpID09IDApIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgbm9kZSA9IEdldExpc3RFbGVtZW50KG5vZGVfbGlzdCk7Ci0JfQotCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZub2RlX2xvY2spOwotCVRSQUNFX0VYSVQ7Ci0JcmV0dXJuIG5vZGU7Ci0gICAgfQotfQotCi1ub2RlX3JlZmNvdW50ICoKLWFkZF9ub2RlKGNoYXIgKmtleSkKLXsKLSAgICAvKgotICAgICAqIEFkZCBhIG5vZGUgdG8gdGhlIG5vZGUgbGlzdC4gU2luY2UgdGhlIGhhc2ggZnVuY3Rpb25zIGluIGhhc2guYyBvbmx5Ci0gICAgICogZGV0ZWN0IGR1cGxpY2F0ZSBoYXNoIHZhbHVlcywgYW5kIG5vdCBrZXlzIHRoYXQgbWFwIHRvIHRoZSBzYW1lIGhhc2gKLSAgICAgKiB2YWx1ZSwgdGhlIGRhdGEgYXQgZWFjaCBub2RlIGluIHRoZSBoYXNoIHRhYmxlIGlzIGEgc2ltcGxlIGxpbmtlZAotICAgICAqIGxpc3Qgb2Yga2V5cyB0aGF0IG1hcCB0byB0aGUgc2FtZSBoYXNoIGFuZCB0aGUgYXNzb2NpYXRlZCBkYXRhLgotICAgICAqLwotICAgIGludCBoYXNoOwotICAgIG5vZGVfcmVmY291bnQgKm5vZGU7Ci0gICAgTGlzdCAqbm9kZV9saXN0OwotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgdGhlIG5vZGUgZm9yIHRoZSBob3N0bmFtZS4gVGhlIG5vZGUga2V5IGlzIHRoZSBub2RlJ3MgaG9zdG5hbWUKLSAgICAgKi8KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBub2RlID0gbWFsbG9jKHNpemVvZihub2RlX3JlZmNvdW50KSk7Ci0gICAgbWFsbG9jX2NoZWNrKG5vZGUsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIG5vZGUtPmtleSA9IHN0cmR1cChrZXkpOwotICAgIG5vZGUtPm5vZGVfbnVtYmVyID0gZ2xvYmFsX25vZGVfaW5kZXg7Ci0gICAgZ2xvYmFsX25vZGVfaW5kZXggPSBnbG9iYWxfbm9kZV9pbmRleCArIDE7Ci0gICAgbm9kZS0+cHJveHlfbm9kZWlkID0gZ2VuZXJhdGVfaWQoKTsKLSAgICBub2RlLT50YXNrX2NvdW50ID0gMDsKLSAgICAvKgotICAgICAqIExvb2sgZm9yIHRoZSBoYXNoIGtleS4gSWYgdGhlIGhhc2gga2V5IGFscmVhZHkgZXhpc3RzLCB0aGVuCi0gICAgICoganVzdCBhZGQgdGhlIGhvc3RuYW1lIHRvIHRoZSBsaXN0IGZvciB0aGUgaGFzaCBrZXkuIE90aGVyd2lzZSwKLSAgICAgKiBjcmVhdGUgYSBuZXcgbGlzdCwgYWRkIHRoZSBob3N0bmFtZSB0byB0aGUgbGlzdCBhbmQgdGhlbiBhZGQgdGhlCi0gICAgICogbm9kZSBsaXN0IGFzIHRoZSAnZGF0YScgZm9yIHRoZSBoYXNoIG5vZGUuCi0gICAgICovCi0gICAgaGFzaCA9IEhhc2hDb21wdXRlKGtleSwgc3RybGVuKGtleSkpOwotICAgIG5vZGVfbGlzdCA9IEhhc2hTZWFyY2gobm9kZXMsIGhhc2gpOwotICAgIGlmIChub2RlX2xpc3QgPT0gTlVMTCkgewotCW5vZGVfbGlzdCA9IE5ld0xpc3QoKTsKLQlBZGRUb0xpc3Qobm9kZV9saXN0LCBub2RlKTsKLQlIYXNoSW5zZXJ0KG5vZGVzLCBoYXNoLCBub2RlX2xpc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLQlBZGRUb0xpc3Qobm9kZV9saXN0LCBub2RlKTsKLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLSAgICByZXR1cm4gbm9kZTsKLX0KLQotdm9pZAotdXBkYXRlX25vZGVfcmVmY291bnRzKGludCBudW10YXNrcywgdGFza2luZm8gKiB0YXNrcykKLXsKLSAgICAvKgotICAgICAqIFVwZGF0ZSBub2RlIHJlZmVyZW5jZSBjb3VudHMgKG51bWJlciBvZiB0YXNrcyBydW5uaW5nIG9uIG5vZGUpLAotICAgICAqIHN1YnRyYWN0aW5nIDEgZm9yIGVhY2ggYXBwZWFyYW5jZSBvZiBhIG5vZGUgbmFtZSBpbiB0aGUgdGFzawotICAgICAqIGxpc3QuIElmIHRoZSBjb3VudCBmb3IgYSBub2RlIGlzIHplcm8sIHRoZW4gdGhhdCBub2RlIG5lZWRzIHRvCi0gICAgICogYmUgcmVtb3ZlZCBmcm9tIHRoZSBub2RlIGxpc3QgYW5kIHRoZSBmcm9udCBlbmQgbm90aWZpZWQuCi0gICAgICovCi0gICAgbm9kZV9yZWZjb3VudCAqbm9kZXJlZjsKLSAgICBpbnQgaTsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW10YXNrczsgaSsrKSB7Ci0Jbm9kZXJlZiA9IGZpbmRfbm9kZSh0YXNrc1tpXS5ob3N0bmFtZSk7Ci0JaWYgKG5vZGVyZWYgPT0gTlVMTCkgewotCSAgICBwcmludF9tZXNzYWdlKFRSQUNFX0RFVEFJTF9NRVNTQUdFLAotCQkJICAiRmFpbGVkIHRvIGZpbmQgZXhwZWN0ZWQgbm9kZSAlc1xuIiwgdGFza3NbaV0uaG9zdG5hbWUpOwotCX0KLQllbHNlIHsKLQkgICAgbm9kZXJlZi0+dGFza19jb3VudCA9IG5vZGVyZWYtPnRhc2tfY291bnQgLSAxOwotCSAgICBpZiAobm9kZXJlZi0+dGFza19jb3VudCA8PSAwKSB7Ci0JCXByaW50X21lc3NhZ2UoVFJBQ0VfREVUQUlMX01FU1NBR0UsCi0JCQkgICAgICAiTm8gdGFza3MgbGVmdCBvbiAlcywgZGVsZXRpbmdcbiIsIHRhc2tzW2ldLmhvc3RuYW1lKTsKLQkJZGVsZXRlX25vZGVyZWYodGFza3NbaV0uaG9zdG5hbWUpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlwcmludF9tZXNzYWdlKFRSQUNFX0RFVEFJTF9NRVNTQUdFLAotCQkJICAgICAgIlJlZmNvdW50IGZvciAlcyBpcyAlZFxuIiwgdGFza3NbaV0uaG9zdG5hbWUsIG5vZGVyZWYtPnRhc2tfY291bnQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBUUkFDRV9FWElUOwotfQotCi12b2lkCi1kZWxldGVfbm9kZXJlZihjaGFyICpob3N0bmFtZSkKLXsKLSAgICAvKgotICAgICAqIGRlbGV0ZSBub2RlIGZyb20gdGhlIG5vZGUgbGlzdCBhbmQgbm90aWZ5IHRoZSBmcm9udCBlbmQKLSAgICAgKi8KLSAgICBpbnQgaGFzaDsKLSAgICBMaXN0ICpub2RlX2xpc3Q7Ci0gICAgbm9kZV9yZWZjb3VudCAqbm9kZTsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGhhc2ggPSBIYXNoQ29tcHV0ZShob3N0bmFtZSwgc3RybGVuKGhvc3RuYW1lKSk7Ci0gICAgbm9kZV9saXN0ID0gSGFzaFNlYXJjaChub2RlcywgaGFzaCk7Ci0gICAgaWYgKG5vZGVfbGlzdCA9PSBOVUxMKSB7Ci0JVFJBQ0VfRVhJVDsKLQlyZXR1cm47Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbm9kZV9sb2NrKTsKLSAgICBTZXRMaXN0KG5vZGVfbGlzdCk7Ci0gICAgbm9kZSA9IEdldExpc3RFbGVtZW50KG5vZGVfbGlzdCk7Ci0gICAgd2hpbGUgKG5vZGUgIT0gTlVMTCkgewotCWlmIChzdHJjbXAobm9kZS0+a2V5LCBob3N0bmFtZSkgPT0gMCkgewotCSAgICBjaGFyIG5vZGVfbnVtYmVyWzExXTsKLQotCSAgICBmcmVlKG5vZGUtPmtleSk7Ci0JICAgIFJlbW92ZUZyb21MaXN0KG5vZGVfbGlzdCwgbm9kZSk7Ci0JICAgIHNwcmludGYobm9kZV9udW1iZXIsICIlZCIsIG5vZGUtPnByb3h5X25vZGVpZCk7Ci0JICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfREVUQUlMX01FU1NBR0UsICJTZW5kaW5nIGRlbGV0ZSBldmVudCBmb3Igbm9kZSAlc1xuIiwgbm9kZV9udW1iZXIpOwotCSAgICBlbnF1ZXVlX2V2ZW50KHByb3h5X3JlbW92ZV9ub2RlX2V2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBub2RlX251bWJlcikpOwotCSAgICBmcmVlKG5vZGUpOwotCSAgICBicmVhazsKLQl9Ci0Jbm9kZSA9IEdldExpc3RFbGVtZW50KG5vZGVfbGlzdCk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZub2RlX2xvY2spOwotICAgIFRSQUNFX0VYSVQ7Ci19Ci0KLXZvaWQKLWRlbGV0ZV90YXNrX2xpc3QoaW50IG51bXRhc2tzLCB0YXNraW5mbyAqIHRhc2tzKQotewotICAgIGludCBpOwotCi0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bXRhc2tzOyBpKyspIHsKLQlpZiAodGFza3NbaV0uaG9zdG5hbWUgIT0gTlVMTCkgewotCSAgICBmcmVlKHRhc2tzW2ldLmhvc3RuYW1lKTsKLQl9Ci0JaWYgKHRhc2tzW2ldLmlwYWRkciAhPSBOVUxMKSB7Ci0JICAgIGZyZWUodGFza3NbaV0uaXBhZGRyKTsKLQl9Ci0gICAgfQotICAgIGZyZWUodGFza3MpOwotICAgIFRSQUNFX0VYSVQ7Ci19Ci0KLXZvaWQKLWhhc2hfY2xlYW51cCh2b2lkICpoYXNoX2xpc3QpCi17Ci0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgRGVzdHJveUxpc3QoaGFzaF9saXN0LCBOVUxMKTsKLSAgICBUUkFDRV9FWElUOwotfQotCi12b2lkICoKLWtpbGxfcHJvY2Vzcyh2b2lkICpwaWQpCi17Ci0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgc2xlZXAoNjApOwotICAgIGtpbGwoKHBpZF90KSBwaWQsIDkpOwotICAgIFRSQUNFX0VYSVQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQKLW1hbGxvY19jaGVjayh2b2lkICpwLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGxpbmUpCi17Ci0gICAgaWYgKHAgPT0gTlVMTCkgewotCXByaW50X21lc3NhZ2UoRkFUQUxfTUVTU0FHRSwKLQkJICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGluIHJlc291cmNlIG1hbmFnZXIgaW4gJXMgKGxpbmUgJWQpXG4iLAotCQkgICAgICBmdW5jdGlvbiwgbGluZSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLX0KLQotI2lmZGVmIEhBVkVfTExBUElfSAotCi1pbnQKLWxvYWRfbG9hZF9sZXZlbGVyX2xpYnJhcnkoaW50IHRyYW5zX2lkKQotewotICAgIGludCBkbG9wZW5fbW9kZTsKLSAgICBpbnQgbXlfZXJybm87Ci0KLSAgICBtZW1zZXQoJkxMX1NZTVMsICdcMCcsIHNpemVvZihMTF9TWU1TKSk7CS8qIHplcm8gdGhlIExvYWRMZXZlbGVyIGRsc3ltIHN5bWJvbCB0YWJsZSAqLwotICAgIGRsb3Blbl9tb2RlID0gMDsKLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgImRsb3BlbiBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSAlcy5cbiIsIGlibWxsX2xpYnBhdGhfbmFtZSk7Ci0jaWZkZWYgX0FJWAotICAgIGRsb3Blbl9tb2RlID0gUlRMRF9MT0NBTCB8IFJUTERfTk9XIHwgUlRMRF9NRU1CRVI7Ci0jZWxzZQotICAgIGRsb3Blbl9tb2RlID0gUlRMRF9MT0NBTCB8IFJUTERfTk9XOwotI2VuZGlmCi0gICAgaWJtbGxfbGlicGF0aF9oYW5kbGUgPSBkbG9wZW4oaWJtbGxfbGlicGF0aF9uYW1lLCBkbG9wZW5fbW9kZSk7Ci0gICAgbXlfZXJybm8gPSBlcnJubzsKLSAgICBpZiAoaWJtbGxfbGlicGF0aF9oYW5kbGUgPT0gTlVMTCkgewotCXByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgImRsb3BlbiBvZiAlcyBmYWlsZWQgd2l0aCBlcnJubz0lZC5cbiIsIGlibWxsX2xpYnBhdGhfbmFtZSwKLQkJICAgICAgbXlfZXJybm8pOwotI2lmIDAKLQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9MTF9JTklULAotCQkgICAgICAgImRsb3BlbiBmYWlsZWQgZm9yIExvYWRMZXZlbGVyIHNoYXJlZCBsaWJyYXJ5Iik7Ci0jZW5kaWYKLQlyZXR1cm4gUFJPWFlfUkVTX0VSUjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJkbG9wZW4gJXMgc3VjY2Vzc2Z1bC5cbiIsIGlibWxsX2xpYnBhdGhfbmFtZSk7Ci0gICAgfQotCi0gICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJMb2NhdGluZyBMb2FkTGV2ZWxlciBmdW5jdGlvbnMgdmlhIGRsc3ltLlxuIik7Ci0gICAgKih2b2lkICoqKSAoJihMTF9TWU1TLmxsX3F1ZXJ5KSkgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsX3F1ZXJ5Iik7Ci0gICAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfc2V0X3JlcXVlc3QpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbF9zZXRfcmVxdWVzdCIpOwotICAgICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX2dldF9vYmpzKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfZ2V0X29ianMiKTsKLSAgICAqKHZvaWQgKiopICgmTExfU1lNUy5sbF9nZXRfZGF0YSkgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsX2dldF9kYXRhIik7Ci0gICAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfZnJlZV9vYmpzKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfZnJlZV9vYmpzIik7Ci0gICAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfZGVhbGxvY2F0ZSkgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsX2RlYWxsb2NhdGUiKTsKLSAgICAqKHZvaWQgKiopICgmTExfU1lNUy5sbF9uZXh0X29iaikgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsX25leHRfb2JqIik7Ci0gICAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfY2x1c3RlcikKLQk9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfY2x1c3RlciIpOwotICAgICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX3N1Ym1pdF9qb2IpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbHN1Ym1pdCIpOwotICAgICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX3Rlcm1pbmF0ZV9qb2IpID0gZGxzeW0oaWJtbGxfbGlicGF0aF9oYW5kbGUsICJsbF90ZXJtaW5hdGVfam9iIik7Ci0gICAgKih2b2lkICoqKSAoJkxMX1NZTVMubGxfZnJlZV9qb2JfaW5mbykgPSBkbHN5bShpYm1sbF9saWJwYXRoX2hhbmRsZSwgImxsZnJlZV9qb2JfaW5mbyIpOwotICAgICoodm9pZCAqKikgKCZMTF9TWU1TLmxsX2Vycm9yKSA9IGRsc3ltKGlibWxsX2xpYnBhdGhfaGFuZGxlLCAibGxfZXJyb3IiKTsKLSAgICBpZiAoKExMX1NZTVMubGxfcXVlcnkgPT0gTlVMTCkgfHwgKExMX1NZTVMubGxfc2V0X3JlcXVlc3QgPT0gTlVMTCkKLQl8fCAoTExfU1lNUy5sbF9nZXRfb2JqcyA9PSBOVUxMKSB8fCAoTExfU1lNUy5sbF9nZXRfZGF0YSA9PSBOVUxMKQotCXx8IChMTF9TWU1TLmxsX2ZyZWVfb2JqcyA9PSBOVUxMKQotCXx8IChMTF9TWU1TLmxsX2RlYWxsb2NhdGUgPT0gTlVMTCkgfHwgKExMX1NZTVMubGxfY2x1c3RlciA9PSBOVUxMKQotCXx8IChMTF9TWU1TLmxsX25leHRfb2JqID09IE5VTEwpIHx8IChMTF9TWU1TLmxsX2ZyZWVfam9iX2luZm8KLQkJCQkJICAgICA9PSBOVUxMKSB8fCAoTExfU1lNUy5sbF90ZXJtaW5hdGVfam9iID09IE5VTEwpCi0JfHwgKExMX1NZTVMubGxfZXJyb3IgPT0gTlVMTCkgfHwgKExMX1NZTVMubGxfc3VibWl0X2pvYiA9PSBOVUxMKSkgewotCXByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwKLQkJICAgICAgIk9uZSBvciBtb3JlIExvYWRMZXZlbGVyIHN5bWJvbHMgY291bGQgbm90IGJlIGxvY2F0ZWQgaW4gJXMuXG4iLAotCQkgICAgICBpYm1sbF9saWJwYXRoX25hbWUpOwotI2lmIDAKLQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9MTF9JTklULCAiTG9hZExldmVsZXIgc3ltYm9scyBub3QgbG9jYXRlZCIpOwotI2VuZGlmCi0JcmV0dXJuIFBST1hZX1JFU19FUlI7Ci0gICAgfQotICAgIGVsc2UgewotCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkgICAgICAiU3VjY2Vzc2Z1bGx5IGxvY2F0ZWQgYWxsIG9mIHRoZSByZXF1aXJlZCBMb2FkTGV2ZWxlciBmdW5jdGlvbnMgdmlhIGRsc3ltLlxuIik7Ci0gICAgfQotICAgIHJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDYWxsIExvYWRMZXZlbGVyIHRvIGdldCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLW15X2xsX2dldF9kYXRhKExMX2VsZW1lbnQgKiByZXF1ZXN0LCBlbnVtIExMQVBJX1NwZWNpZmljYXRpb24gc3BlYywgdm9pZCAqcmVzdWx0KQotewotICAgIGludCByYyA9IDA7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIExMQVBJX1NwZWNpZmljYXRpb249JWQuXG4iLCBfX0ZVTkNUSU9OX18sCi0JCSAgX19MSU5FX18sIHNwZWMpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICAgIHJjID0gKCpMTF9TWU1TLmxsX2dldF9kYXRhKSAocmVxdWVzdCwgc3BlYywgcmVzdWx0KTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICAgIGlmIChyYyAhPSAwKSB7Ci0JcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJMb2FkTGV2ZWxlciBsbF9nZXRfZGF0YSByYz0lZC5cbiIsIHJjKTsKLSAgICB9Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gcmM9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByYyk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2FsbCBMb2FkTGV2ZWxlciB0byByZXRyaWV2ZSB0aGUgY2x1c3RlciBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1teV9sbF9jbHVzdGVyKGludCB2ZXJzaW9uLCBMTF9lbGVtZW50ICoqIGVyck9iaiwgTExfY2x1c3Rlcl9wYXJhbSAqIGNwKQotewotICAgIGludCByYyA9IDA7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIHZlcnNpb249JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAotCQkgIHZlcnNpb24pOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICAgIHJjID0gKCpMTF9TWU1TLmxsX2NsdXN0ZXIpICh2ZXJzaW9uLCBlcnJPYmosIGNwKTsJLyogc2V0IHRoZSBjbHVzdGVyIG5hbWUgKi8KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICAgIGlmIChyYyAhPSAwKSB7Ci0JcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJMb2FkTGV2ZWxlciBsbF9jbHVzdGVyIHJjPSVkLlxuIiwgcmMpOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLiByYz0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHJjKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENhbGwgTG9hZExldmVsZXIgdG8gZGVhbGxvY2F0ZSB0aGUgcXVlcnkgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotbXlfbGxfZGVhbGxvY2F0ZShMTF9lbGVtZW50ICogcXVlcnlfZWxlbSkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgcmMgPSAoKkxMX1NZTVMubGxfZGVhbGxvY2F0ZSkgKHF1ZXJ5X2VsZW0pOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgaWYgKHJjICE9IDApIHsKLQlwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsICJMb2FkTGV2ZWxlciBsbF9kZWFsbG9jYXRlIHJjPSVkLlxuIiwgcmMpOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLiByYz0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHJjKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDYWxsIExvYWRMZXZlbGVyIHRvIHBlcmZvcm0gYSBxdWVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTF9lbGVtZW50ICoKLW15X2xsX3F1ZXJ5KGVudW0gUXVlcnlUeXBlIHR5cGUpCi17Ci0gICAgTExfZWxlbWVudCAqcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIFF1ZXJ5VHlwZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCi0JCSAgdHlwZSk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgcXVlcnlfZWxlbSA9ICgqTExfU1lNUy5sbF9xdWVyeSkgKHR5cGUpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgaWYgKHF1ZXJ5X2VsZW0gPT0gTlVMTCkgewotCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkgICAgICAiTG9hZExldmVsZXIgbGxfcXVlcnkgZWxlbWVudD1OVUxMLiBFbmQgb2YgbGlzdCB3YXMgcHJvYmFibHkgcmVhY2hlZC5cbiIpOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuIHF1ZXJ5X2VsZW07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDYWxsIExvYWRMZXZlbGVyIHRvIGZyZWUgdGhlIG9iamVjdHMgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLW15X2xsX2ZyZWVfb2JqcyhMTF9lbGVtZW50ICogcXVlcnlfZWxlbSkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgcmMgPSAoKkxMX1NZTVMubGxfZnJlZV9vYmpzKSAocXVlcnlfZWxlbSk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgICBpZiAocmMgIT0gMCkgewotCXByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIkxvYWRMZXZlbGVyIGxsX2ZyZWVfb2JqcyByYz0lZC5cbiIsIHJjKTsKLSAgICB9Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gcmM9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByYyk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2FsbCBMb2FkTGV2ZWxlciB0byBnZXQgdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIHJldHVybmVkIGxpc3QgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTExfZWxlbWVudCAqCi1teV9sbF9uZXh0X29iaihMTF9lbGVtZW50ICogcXVlcnlfZWxlbSkKLXsKLSAgICBMTF9lbGVtZW50ICpuZXh0X2VsZW0gPSBOVUxMOzsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICAgIG5leHRfZWxlbSA9ICgqTExfU1lNUy5sbF9uZXh0X29iaikgKHF1ZXJ5X2VsZW0pOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgaWYgKG5leHRfZWxlbSA9PSBOVUxMKSB7Ci0JcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCSAgICAgICJMb2FkTGV2ZWxlciBsbF9uZXh0X29iaiBlbGVtZW50PU5VTEwuIEVuZCBvZiBsaXN0IHdhcyBwcm9iYWJseSByZWFjaGVkLlxuIik7Ci0gICAgfQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gbmV4dF9lbGVtOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2FsbCBMb2FkTGV2ZWxlciB0byBnZXQgb2JqZWN0cyBmcm9tIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGVsZW1lbnQgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTExfZWxlbWVudCAqCi1teV9sbF9nZXRfb2JqcyhMTF9lbGVtZW50ICogcXVlcnlfZWxlbSwgZW51bSBMTF9EYWVtb24gZGFlbW9uLCBjaGFyICppZ25vcmUsIGludCAqdmFsdWUsIGludCAqcmMpCi17Ci0gICAgKnJjID0gMDsJCQkvKiBwcmVzZXQgcmMgdG8gMCAqLwotICAgIExMX2VsZW1lbnQgKnJldF9vYmplY3QgPSBOVUxMOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBMTF9EYWVtb249JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAotCQkgIGRhZW1vbik7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZhY2Nlc3NfTG9hZExldmVsZXJfbG9jayk7Ci0gICAgcmV0X29iamVjdCA9IExMX1NZTVMubGxfZ2V0X29ianMocXVlcnlfZWxlbSwgZGFlbW9uLCBpZ25vcmUsIHZhbHVlLCByYyk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgICBpZiAocmV0X29iamVjdCA9PSBOVUxMKSB7Ci0JcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCSAgICAgICJMb2FkTGV2ZWxlciBsbF9nZXRfb2JqcyBlbGVtZW50PU5VTEwuIEVuZCBvZiBsaXN0IHdhcyBwcm9iYWJseSByZWFjaGVkLlxuIik7Ci0gICAgfQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuIHJjPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKLQkJICAqcmMpOwotICAgIHJldHVybiByZXRfb2JqZWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENhbGwgTG9hZExldmVsZXIgdG8gYnVpbGQgYSByZXF1ZXN0IG9iamVjdCBmb3IgYSBzdWJzZXF1ZW50IGNhbGwgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1teV9sbF9zZXRfcmVxdWVzdChMTF9lbGVtZW50ICogcXVlcnlfZWxlbSwgZW51bSBRdWVyeUZsYWdzIHFmbGFncywgY2hhciAqKmlnbm9yZSwKLQkJICBlbnVtIERhdGFGaWx0ZXIgZGZpbHRlcikKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBRdWVyeUZsYWdzPSVkLlxuIiwgX19GVU5DVElPTl9fLAotCQkgIF9fTElORV9fLCBxZmxhZ3MpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYWNjZXNzX0xvYWRMZXZlbGVyX2xvY2spOwotICAgIHJjID0gTExfU1lNUy5sbF9zZXRfcmVxdWVzdChxdWVyeV9lbGVtLCBxZmxhZ3MsIGlnbm9yZSwgZGZpbHRlcik7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFjY2Vzc19Mb2FkTGV2ZWxlcl9sb2NrKTsKLSAgICBpZiAocmMgIT0gMCkgewotCXByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwgIkxvYWRMZXZlbGVyIGxsX3NldF9yZXF1ZXN0IHJjPSVpLlxuIiwgcmMpOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLiByYz0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHJjKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzZW5kIG5vZGUgYWRkZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1zZW5kTm9kZUFkZEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsIE5vZGVPYmplY3QgKiBub2RlX29iamVjdCkKLXsKLSAgICBwcm94eV9tc2cgKm1zZzsKLSAgICBjaGFyIHByb3h5X2dlbmVyYXRlZF9jbHVzdGVyX2lkX3N0cmluZ1syNTZdOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciAqbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VOS05PV047Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gY2x1c3Rlcj0lcy4gbm9kZT0lcy4gc3RhdGU9JWQuXG4iLAotCQkgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUsIG5vZGVfb2JqZWN0LT5ub2RlX25hbWUsCi0JCSAgbm9kZV9vYmplY3QtPm5vZGVfc3RhdGUpOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcpKTsKLSAgICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nKSk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcsICIlZCIsIGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZCk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcsICIlZCIsIG5vZGVfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfbm9kZV9pZCk7Ci0KLSAgICBzd2l0Y2ggKG5vZGVfb2JqZWN0LT5ub2RlX3N0YXRlKSB7Ci0JY2FzZSBNWV9TVEFURV9VUDoKLQkgICAgbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VQOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX0RPV046Ci0JICAgIG5vZGVfc3RhdGVfdG9fcmVwb3J0ID0gTk9ERV9TVEFURV9ET1dOOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBub2RlX3N0YXRlX3RvX3JlcG9ydCA9IE5PREVfU1RBVEVfVU5LTk9XTjsKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbXNnID0gcHJveHlfbmV3X25vZGVfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgcHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nLCAxKTsKLSAgICBwcm94eV9hZGRfbm9kZShtc2csIHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZywgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSwgbm9kZV9zdGF0ZV90b19yZXBvcnQsIDApOwotICAgIGVucXVldWVfZXZlbnQobXNnKTsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzZW5kIG5vZGUgY2hhbmdlZCBldmVudCB0byBndWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1zZW5kTm9kZUNoYW5nZUV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsCi0JCSAgICBOb2RlT2JqZWN0ICogbm9kZV9vYmplY3QpCi17Ci0gICAgcHJveHlfbXNnICptc2c7Ci0gICAgY2hhciBwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmdbMjU2XTsKLSAgICBjaGFyICpub2RlX3N0YXRlX3RvX3JlcG9ydCA9IE5PREVfU1RBVEVfVU5LTk9XTjsKLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBjbHVzdGVyPSVzLiBub2RlPSVzLiBzdGF0ZT0lZC5cbiIsCi0JCSAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSwgbm9kZV9vYmplY3QtPm5vZGVfbmFtZSwKLQkJICBub2RlX29iamVjdC0+bm9kZV9zdGF0ZSk7Ci0gICAgbWVtc2V0KHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZykpOwotICAgIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX25vZGVfaWRfc3RyaW5nLCAiJWQiLCBub2RlX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX25vZGVfaWQpOwotCi0gICAgc3dpdGNoIChub2RlX29iamVjdC0+bm9kZV9zdGF0ZSkgewotCWNhc2UgTVlfU1RBVEVfVVA6Ci0JICAgIG5vZGVfc3RhdGVfdG9fcmVwb3J0ID0gTk9ERV9TVEFURV9VUDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBNWV9TVEFURV9ET1dOOgotCSAgICBub2RlX3N0YXRlX3RvX3JlcG9ydCA9IE5PREVfU1RBVEVfRE9XTjsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgbm9kZV9zdGF0ZV90b19yZXBvcnQgPSBOT0RFX1NUQVRFX1VOS05PV047Ci0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1zZyA9IHByb3h5X25vZGVfY2hhbmdlX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIHByb3h5X2dlbmVyYXRlZF9ub2RlX2lkX3N0cmluZywgMSk7Ci0gICAgcHJveHlfYWRkX25vZGUobXNnLCBwcm94eV9nZW5lcmF0ZWRfbm9kZV9pZF9zdHJpbmcsIG5vZGVfb2JqZWN0LT5ub2RlX25hbWUsIG5vZGVfc3RhdGVfdG9fcmVwb3J0LCAwKTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc2VuZCBqb2IgYWRkZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotc2VuZEpvYkFkZEV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBDbHVzdGVyT2JqZWN0ICogY2x1c3Rlcl9vYmplY3QsIEpvYk9iamVjdCAqIGpvYl9vYmplY3QpCi17Ci0gICAgcHJveHlfbXNnICptc2c7Ci0gICAgY2hhciBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZ1syNTZdOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZ1syNTZdOwotICAgIGNoYXIgam9iX25hbWVfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciAqam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotCi0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGpvYj0lcy4lZC4lZC4gc3RhdGU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sCi0JCSAgX19MSU5FX18sIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsCi0JCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUpOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nKSk7Ci0gICAgbWVtc2V0KHByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nKSk7Ci0gICAgbWVtc2V0KGpvYl9uYW1lX3N0cmluZywgJ1wwJywgc2l6ZW9mKGpvYl9uYW1lX3N0cmluZykpOwotICAgIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICIlZCIsIGpvYl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9qb2JfaWQpOwotICAgIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZywgIiVkIiwgY2x1c3Rlcl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZCk7Ci0KLSAgICBzd2l0Y2ggKGpvYl9vYmplY3QtPmpvYl9zdGF0ZSkgewotCWNhc2UgTVlfU1RBVEVfSURMRToKLQkgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX1JVTk5JTkc6Ci0JICAgIGpvYl9zdGF0ZV90b19yZXBvcnQgPSBKT0JfU1RBVEVfUlVOTklORzsKLQkgICAgYnJlYWs7Ci0JY2FzZSBNWV9TVEFURV9TVE9QUEVEOgotCSAgICBqb2Jfc3RhdGVfdG9fcmVwb3J0ID0gSk9CX1NUQVRFX0lOSVQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgTVlfU1RBVEVfVEVSTUlOQVRFRDoKLQkgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9URVJNSU5BVEVEOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBqb2Jfc3RhdGVfdG9fcmVwb3J0ID0gSk9CX1NUQVRFX0lOSVQ7Ci0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNwcmludGYoam9iX25hbWVfc3RyaW5nLCAiJXMuJWQuJWQiLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwKLQkgICAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MpOwotICAgIG1zZyA9Ci0JcHJveHlfbmV3X2pvYl9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nLAotCQkJICAgIHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nLCBqb2JfbmFtZV9zdHJpbmcsIGpvYl9zdGF0ZV90b19yZXBvcnQsCi0JCQkgICAgam9iX29iamVjdC0+Z3VpX2Fzc2lnbmVkX2pvYl9pZCk7Ci0gICAgZW5xdWV1ZV9ldmVudChtc2cpOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHNlbmQgam9iIGNoYW5nZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLXNlbmRKb2JDaGFuZ2VFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCkKLXsKLSAgICBwcm94eV9tc2cgKm1zZzsKLSAgICBjaGFyIHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciBqb2Jfc3RhdGVfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciAqam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotCi0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGpvYj0lcy4lZC4lZC4gc3RhdGU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sCi0JCSAgX19MSU5FX18sIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQuZnJvbV9ob3N0LCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmNsdXN0ZXIsCi0JCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5wcm9jLCBqb2Jfb2JqZWN0LT5qb2Jfc3RhdGUpOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nKSk7Ci0gICAgbWVtc2V0KGpvYl9zdGF0ZV9zdHJpbmcsICdcMCcsIHNpemVvZihqb2Jfc3RhdGVfc3RyaW5nKSk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgIiVkIiwgam9iX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX2pvYl9pZCk7Ci0KLSAgICBzd2l0Y2ggKGpvYl9vYmplY3QtPmpvYl9zdGF0ZSkgewotCWNhc2UgTVlfU1RBVEVfSURMRToKLQkgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9JTklUOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX1JVTk5JTkc6Ci0JICAgIGpvYl9zdGF0ZV90b19yZXBvcnQgPSBKT0JfU1RBVEVfUlVOTklORzsKLQkgICAgYnJlYWs7Ci0JY2FzZSBNWV9TVEFURV9TVE9QUEVEOgotCSAgICBqb2Jfc3RhdGVfdG9fcmVwb3J0ID0gSk9CX1NUQVRFX0lOSVQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgTVlfU1RBVEVfVEVSTUlOQVRFRDoKLQkgICAgam9iX3N0YXRlX3RvX3JlcG9ydCA9IEpPQl9TVEFURV9URVJNSU5BVEVEOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBqb2Jfc3RhdGVfdG9fcmVwb3J0ID0gSk9CX1NUQVRFX0lOSVQ7Ci0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1zZyA9IHByb3h5X2pvYl9jaGFuZ2VfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgcHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsIDEpOwotICAgIHNwcmludGYoam9iX3N0YXRlX3N0cmluZywgIiVkIiwgam9iX29iamVjdC0+am9iX3N0YXRlKTsKLSAgICBwcm94eV9hZGRfc3RyaW5nX2F0dHJpYnV0ZShtc2csIEpPQl9TVEFURV9BVFRSLCBqb2Jfc3RhdGVfdG9fcmVwb3J0KTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc2VuZCBqb2IgcmVtb3ZlZCBldmVudCB0byBndWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotc2VuZEpvYlJlbW92ZUV2ZW50KGludCBndWlfdHJhbnNtaXNzaW9uX2lkLCBKb2JPYmplY3QgKiBqb2Jfb2JqZWN0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmdbMjU2XTsKLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBqb2I9JXMuJWQuJWQuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLAotCQkgIF9fTElORV9fLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLAotCQkgIGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYywgam9iX29iamVjdC0+am9iX3N0YXRlKTsKLSAgICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZykpOwotICAgIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX2pvYl9pZF9zdHJpbmcsICIlZCIsIGpvYl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9qb2JfaWQpOwotCi0gICAgbXNnID0gcHJveHlfcmVtb3ZlX2pvYl9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZyk7Ci0gICAgZW5xdWV1ZV9ldmVudChtc2cpOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHNlbmQgdGFzayBhZGRlZCBldmVudCB0byBndWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLXNlbmRUYXNrQWRkRXZlbnQoaW50IGd1aV90cmFuc21pc3Npb25faWQsIENsdXN0ZXJPYmplY3QgKiBjbHVzdGVyX29iamVjdCwgSm9iT2JqZWN0ICogam9iX29iamVjdCwKLQkJIFRhc2tPYmplY3QgKiB0YXNrX29iamVjdCkKLXsKLSAgICBwcm94eV9tc2cgKm1zZzsKLSAgICBjaGFyIHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmdbMjU2XTsKLSAgICBjaGFyIGxsX3Rhc2tfaWRfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciAqdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX1NUT1BQRUQ7Ci0gICAgTm9kZU9iamVjdCAqbm9kZV9vYmplY3QgPSBOVUxMOwotCi0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIGpvYj0lcy4lZC4lZC4gbm9kZT0lcy4gdGFzaz0lZC5cbiIsCi0JCSAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QsCi0JCSAgam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyLCBqb2Jfb2JqZWN0LT5sbF9zdGVwX2lkLnByb2MsCi0JCSAgdGFza19vYmplY3QtPm5vZGVfbmFtZSwgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQpOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nKSk7Ci0gICAgbWVtc2V0KHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZykpOwotICAgIG1lbXNldChsbF90YXNrX2lkX3N0cmluZywgJ1wwJywgc2l6ZW9mKGxsX3Rhc2tfaWRfc3RyaW5nKSk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfam9iX2lkX3N0cmluZywgIiVkIiwgam9iX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX2pvYl9pZCk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsICIlZCIsIHRhc2tfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfdGFza19pZCk7Ci0gICAgc3ByaW50ZihsbF90YXNrX2lkX3N0cmluZywgIiVkIiwgdGFza19vYmplY3QtPmxsX3Rhc2tfaWQpOwotICAgIG1zZyA9IHByb3h5X25ld19wcm9jZXNzX2V2ZW50KGd1aV90cmFuc21pc3Npb25faWQsIHByb3h5X2dlbmVyYXRlZF9qb2JfaWRfc3RyaW5nLCAxKTsKLQotICAgIHN3aXRjaCAodGFza19vYmplY3QtPnRhc2tfc3RhdGUpIHsKLQljYXNlIE1ZX1NUQVRFX0lETEU6Ci0JICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9TVEFSVElORzsKLQkgICAgYnJlYWs7Ci0JY2FzZSBNWV9TVEFURV9SVU5OSU5HOgotCSAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfUlVOTklORzsKLQkgICAgYnJlYWs7Ci0JY2FzZSBNWV9TVEFURV9TVE9QUEVEOgotCSAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfU1RPUFBFRDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBNWV9TVEFURV9URVJNSU5BVEVEOgotCSAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfRVhJVEVEOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICB0YXNrX3N0YXRlX3RvX3JlcG9ydCA9IFBST0NfU1RBVEVfU1RBUlRJTkc7Ci0JICAgIGJyZWFrOwotICAgIH0KLQotCi0gICAgcHJveHlfYWRkX3Byb2Nlc3MobXNnLCBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsIGxsX3Rhc2tfaWRfc3RyaW5nLCB0YXNrX3N0YXRlX3RvX3JlcG9ydCwgMik7Ci0KLSAgICBub2RlX29iamVjdCA9IGdldF9ub2RlX2luX2hhc2goY2x1c3Rlcl9vYmplY3QtPm5vZGVfaGFzaCwgdGFza19vYmplY3QtPm5vZGVfbmFtZSk7Ci0gICAgcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobXNnLCBQUk9DX05PREVJRF9BVFRSLCBub2RlX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX25vZGVfaWQpOwotICAgIHByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG1zZywgUFJPQ19JTkRFWF9BVFRSLCB0YXNrX29iamVjdC0+bGxfdGFza19pZCk7Ci0KLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc2VuZCB0YXNrIGNoYW5nZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotc2VuZFRhc2tDaGFuZ2VFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCwgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciAqdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcpKTsKLSAgICBzcHJpbnRmKHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZywgIiVkIiwgdGFza19vYmplY3QtPnByb3h5X2dlbmVyYXRlZF90YXNrX2lkKTsKLSAgICBtc2cgPSBwcm94eV9wcm9jZXNzX2NoYW5nZV9ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsIDEpOwotCi0gICAgc3dpdGNoICh0YXNrX29iamVjdC0+dGFza19zdGF0ZSkgewotCWNhc2UgTVlfU1RBVEVfSURMRToKLQkgICAgdGFza19zdGF0ZV90b19yZXBvcnQgPSBQUk9DX1NUQVRFX1NUQVJUSU5HOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX1JVTk5JTkc6Ci0JICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9SVU5OSU5HOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX1NUT1BQRUQ6Ci0JICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9TVE9QUEVEOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX1RFUk1JTkFURUQ6Ci0JICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9FWElURUQ7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHRhc2tfc3RhdGVfdG9fcmVwb3J0ID0gUFJPQ19TVEFURV9TVEFSVElORzsKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobXNnLCBQUk9DX1NUQVRFX0FUVFIsIHRhc2tfc3RhdGVfdG9fcmVwb3J0KTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc2VuZCB0YXNrIHJlbW92ZWQgZXZlbnQgdG8gZ3VpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotc2VuZFRhc2tSZW1vdmVFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgSm9iT2JqZWN0ICogam9iX29iamVjdCwgVGFza09iamVjdCAqIHRhc2tfb2JqZWN0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX3Rhc2tfaWRfc3RyaW5nWzI1Nl07Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcsICdcMCcsIHNpemVvZihwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcpKTsKLSAgICBzcHJpbnRmKHByb3h5X2dlbmVyYXRlZF90YXNrX2lkX3N0cmluZywgIiVkIiwgdGFza19vYmplY3QtPnByb3h5X2dlbmVyYXRlZF90YXNrX2lkKTsKLSAgICBtc2cgPSBwcm94eV9yZW1vdmVfcHJvY2Vzc19ldmVudChndWlfdHJhbnNtaXNzaW9uX2lkLCBwcm94eV9nZW5lcmF0ZWRfdGFza19pZF9zdHJpbmcpOwotICAgIGVucXVldWVfZXZlbnQobXNnKTsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzZW5kIGNsdXN0ZXIgYWRkZWQgZXZlbnQgdG8gZ3VpIChhIGNsdXN0ZXIgdG8gTG9hZExldmVsZXIgaXMgYSAgICAgICAgKgotICogUFRQIG1hY2hpbmUgdG8gdGhlIGd1aSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotc2VuZE1hY2hpbmVBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nWzI1Nl07Ci0gICAgY2hhciAqbWFjaGluZV9zdGF0ZV90b19yZXBvcnQgPSBNQUNISU5FX1NUQVRFX1VOS05PV047Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gY2x1c3Rlcj0lcy4gc3RhdGU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sCi0JCSAgX19MSU5FX18sIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUsIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX3N0YXRlKTsKLSAgICBtZW1zZXQocHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nKSk7Ci0gICAgc3ByaW50Zihwcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZF9zdHJpbmcsICIlZCIsIGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZCk7Ci0KLSAgICAvLyBUT0RPIC0gTmVlZCB0byBlbnN1cmUgdGhhdCBtYWNoaW5lX2lkIGdldHMgc2V0IHRvIHRoZSBtYWNoaW5lIGZvciB0aGUgY2x1c3RlciBvd25pbmcgdGhlIHByb3h5IG5vZGUKLSAgICBteV9jbHVzdGVyID0gY2x1c3Rlcl9vYmplY3Q7Ci0gICAgbWFjaGluZV9pZCA9IGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZDsKLSAgICBzd2l0Y2ggKGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX3N0YXRlKSB7Ci0JY2FzZSBNWV9TVEFURV9VUDoKLQkgICAgbWFjaGluZV9zdGF0ZV90b19yZXBvcnQgPSBNQUNISU5FX1NUQVRFX1VQOwotCSAgICBicmVhazsKLQljYXNlIE1ZX1NUQVRFX0RPV046Ci0JICAgIG1hY2hpbmVfc3RhdGVfdG9fcmVwb3J0ID0gTUFDSElORV9TVEFURV9ET1dOOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBtYWNoaW5lX3N0YXRlX3RvX3JlcG9ydCA9IE1BQ0hJTkVfU1RBVEVfVU5LTk9XTjsKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIG1zZyA9Ci0JcHJveHlfbmV3X21hY2hpbmVfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaWJtbGxfcHJveHlfYmFzZV9pZF9zdHJpbmcsCi0JCQkJcHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWRfc3RyaW5nLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lLAotCQkJCW1hY2hpbmVfc3RhdGVfdG9fcmVwb3J0KTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc2VuZCBxdWV1ZSBhZGRlZCBldmVudCB0byBndWkgKG9uZSBwZXIgY2x1c3RlcikgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1zZW5kUXVldWVBZGRFdmVudChpbnQgZ3VpX3RyYW5zbWlzc2lvbl9pZCwgQ2x1c3Rlck9iamVjdCAqIGNsdXN0ZXJfb2JqZWN0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZ1syNTZdOwotICAgIGNoYXIgKnF1ZXVlX3N0YXRlX3RvX3JlcG9ydCA9IFFVRVVFX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gcXVldWU9JXMuIHN0YXRlPSVkLlxuIiwgX19GVU5DVElPTl9fLAotCQkgIF9fTElORV9fLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lLCBjbHVzdGVyX29iamVjdC0+cXVldWVfc3RhdGUpOwotICAgIG1lbXNldChwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nLCAnXDAnLCBzaXplb2YocHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZykpOwotICAgIHNwcmludGYocHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkX3N0cmluZywgIiVkIiwgY2x1c3Rlcl9vYmplY3QtPnByb3h5X2dlbmVyYXRlZF9xdWV1ZV9pZCk7Ci0KLSAgICAvLyBUT0RPIC0gTmVlZCB0byBlbnN1cmUgdGhhdCBxdWV1ZV9pZCBnZXRzIHNldCB0byB0aGUgcXVldWUgYmVsb25naW5nIHRvIHRoZSBjbHVzdGVyIHdoZXJlIHRoZSBwcm94eSBub2RlIHJlc2lkZXMKLSAgICBxdWV1ZV9pZCA9IGNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfcXVldWVfaWQ7Ci0gICAgc3dpdGNoIChjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9zdGF0ZSkgewotCWNhc2UgTVlfU1RBVEVfVVA6Ci0JICAgIHF1ZXVlX3N0YXRlX3RvX3JlcG9ydCA9IFFVRVVFX1NUQVRFX05PUk1BTDsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcXVldWVfc3RhdGVfdG9fcmVwb3J0ID0gUVVFVUVfU1RBVEVfU1RPUFBFRDsKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbXNnID0KLQlwcm94eV9uZXdfcXVldWVfZXZlbnQoZ3VpX3RyYW5zbWlzc2lvbl9pZCwgaWJtbGxfcHJveHlfYmFzZV9pZF9zdHJpbmcsCi0JCQkgICAgICBwcm94eV9nZW5lcmF0ZWRfcXVldWVfaWRfc3RyaW5nLCBjbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9uYW1lLAotCQkJICAgICAgcXVldWVfc3RhdGVfdG9fcmVwb3J0KTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYWRkIGpvYiB0byBteSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotYWRkX2pvYl90b19saXN0KExpc3QgKiBqb2JfbGlzdCwgSm9iT2JqZWN0ICogam9iX29iamVjdCkKLXsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gam9iX29iamVjdD14XCclMDh4XCcuXG4iLCBfX0ZVTkNUSU9OX18sCi0JCSAgX19MSU5FX18sIGpvYl9vYmplY3QpOwotICAgIEFkZFRvTGlzdChqb2JfbGlzdCwgam9iX29iamVjdCk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYWRkIHRhc2sgdG8gbXkgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotYWRkX3Rhc2tfdG9fbGlzdChMaXN0ICogdGFza19saXN0LCBUYXNrT2JqZWN0ICogdGFza19vYmplY3QpCi17Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIHRhc2tfb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywKLQkJICBfX0xJTkVfXywgdGFza19vYmplY3QpOwotICAgIEFkZFRvTGlzdCh0YXNrX2xpc3QsIHRhc2tfb2JqZWN0KTsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBhZGQgbm9kZSB0byBteSBoYXNoIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1hZGRfbm9kZV90b19oYXNoKEhhc2ggKiBub2RlX2hhc2gsIE5vZGVPYmplY3QgKiBub2RlX29iamVjdCkKLXsKLSAgICBpbnQgaGFzaF9rZXk7Ci0gICAgTGlzdCAqbm9kZV9saXN0OwotCi0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuIG9iamVjdD14XCclMDh4XCcuXG4iLCBfX0ZVTkNUSU9OX18sCi0JCSAgX19MSU5FX18sIG5vZGVfb2JqZWN0KTsKLSAgICBoYXNoX2tleSA9IEhhc2hDb21wdXRlKG5vZGVfb2JqZWN0LT5ub2RlX25hbWUsIHN0cmxlbihub2RlX29iamVjdC0+bm9kZV9uYW1lKSk7Ci0gICAgbm9kZV9saXN0ID0gSGFzaFNlYXJjaChub2RlX2hhc2gsIGhhc2hfa2V5KTsKLSAgICBpZiAobm9kZV9saXN0ID09IE5VTEwpIHsKLQlub2RlX2xpc3QgPSBOZXdMaXN0KCk7Ci0JQWRkVG9MaXN0KG5vZGVfbGlzdCwgbm9kZV9vYmplY3QpOwotCUhhc2hJbnNlcnQobm9kZV9oYXNoLCBoYXNoX2tleSwgbm9kZV9saXN0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JQWRkVG9MaXN0KG5vZGVfbGlzdCwgbm9kZV9vYmplY3QpOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlbGV0ZSB0YXNrIGZyb20gbXkgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWRlbGV0ZV90YXNrX2Zyb21fbGlzdChMaXN0ICogdGFza19saXN0LCBUYXNrT2JqZWN0ICogdGFza19vYmplY3QpCi17Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPj4+ICVzIGVudGVyZWQuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBpZiAodGFza19vYmplY3QtPm5vZGVfbmFtZSAhPSBOVUxMKSB7Ci0JZnJlZSh0YXNrX29iamVjdC0+bm9kZV9uYW1lKTsKLQl0YXNrX29iamVjdC0+bm9kZV9uYW1lID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHRhc2tfb2JqZWN0LT5ub2RlX2FkZHJlc3MgIT0gTlVMTCkgewotCWZyZWUodGFza19vYmplY3QtPm5vZGVfYWRkcmVzcyk7Ci0JdGFza19vYmplY3QtPm5vZGVfYWRkcmVzcyA9IE5VTEw7Ci0gICAgfQotICAgIFJlbW92ZUZyb21MaXN0KHRhc2tfbGlzdCwgdGFza19vYmplY3QpOwotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGZpbmQgam9iIGluIG15IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUpvYk9iamVjdCAqCi1nZXRfam9iX2luX2xpc3QoTGlzdCAqIGpvYl9saXN0LCBMTF9TVEVQX0lEIGxsX3N0ZXBfaWQpCi17Ci0gICAgTGlzdEVsZW1lbnQgKmpvYl9saXN0X2VsZW1lbnQgPSBOVUxMOwotICAgIEpvYk9iamVjdCAqam9iX29iamVjdCA9IE5VTEw7Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC4gbmFtZT0lcy4lZC4lZC5cbiIsIF9fRlVOQ1RJT05fXywKLQkJICBfX0xJTkVfXywgbGxfc3RlcF9pZC5mcm9tX2hvc3QsIGxsX3N0ZXBfaWQuY2x1c3RlciwgbGxfc3RlcF9pZC5wcm9jKTsKLSAgICBqb2JfbGlzdF9lbGVtZW50ID0gam9iX2xpc3QtPmxfaGVhZDsKLSAgICB3aGlsZSAoam9iX2xpc3RfZWxlbWVudCAhPSBOVUxMKSB7Ci0Jam9iX29iamVjdCA9IGpvYl9saXN0X2VsZW1lbnQtPmxfdmFsdWU7Ci0Jam9iX2xpc3RfZWxlbWVudCA9IGpvYl9saXN0X2VsZW1lbnQtPmxfbmV4dDsKLQlpZiAoKHN0cmNtcChsbF9zdGVwX2lkLmZyb21faG9zdCwgam9iX29iamVjdC0+bGxfc3RlcF9pZC5mcm9tX2hvc3QpID09IDApCi0JICAgICYmIChsbF9zdGVwX2lkLmNsdXN0ZXIgPT0gam9iX29iamVjdC0+bGxfc3RlcF9pZC5jbHVzdGVyKQotCSAgICAmJiAobGxfc3RlcF9pZC5wcm9jID09IGpvYl9vYmplY3QtPmxsX3N0ZXBfaWQucHJvYykpIHsKLQkgICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gam9iX29iamVjdD14XCclMDh4XCcuXG4iLAotCQkJICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBqb2Jfb2JqZWN0KTsKLQkgICAgcmV0dXJuIGpvYl9vYmplY3Q7Ci0JfQotICAgIH0KLSAgICBqb2Jfb2JqZWN0ID0gTlVMTDsKLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI8PDwgJXMgcmV0dXJuaW5nLiBsaW5lPSVkLiBqb2Jfb2JqZWN0PXhcJyUwOHhcJy5cbiIsIF9fRlVOQ1RJT05fXywKLQkJICBfX0xJTkVfXywgam9iX29iamVjdCk7Ci0gICAgcmV0dXJuIGpvYl9vYmplY3Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBmaW5kIG5vZGUgaW4gbXkgaGFzaCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Ob2RlT2JqZWN0ICoKLWdldF9ub2RlX2luX2hhc2goSGFzaCAqIG5vZGVfaGFzaCwgY2hhciAqbm9kZV9uYW1lKQotewotICAgIGludCBoYXNoX2tleSA9IDA7Ci0gICAgTGlzdCAqbm9kZV9saXN0ID0gTlVMTDsKLSAgICBMaXN0RWxlbWVudCAqbm9kZV9saXN0X2VsZW1lbnQgPSBOVUxMOwotICAgIE5vZGVPYmplY3QgKm5vZGVfb2JqZWN0ID0gTlVMTDsKLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBuYW1lPSVzLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKLQkJICBub2RlX25hbWUpOwotICAgIGhhc2hfa2V5ID0gSGFzaENvbXB1dGUobm9kZV9uYW1lLCBzdHJsZW4obm9kZV9uYW1lKSk7Ci0gICAgbm9kZV9saXN0ID0gSGFzaFNlYXJjaChub2RlX2hhc2gsIGhhc2hfa2V5KTsKLSAgICBpZiAobm9kZV9saXN0ICE9IE5VTEwpIHsKLQlub2RlX2xpc3RfZWxlbWVudCA9IG5vZGVfbGlzdC0+bF9oZWFkOwotCXdoaWxlIChub2RlX2xpc3RfZWxlbWVudCAhPSBOVUxMKSB7Ci0JICAgIG5vZGVfb2JqZWN0ID0gbm9kZV9saXN0X2VsZW1lbnQtPmxfdmFsdWU7Ci0JICAgIG5vZGVfbGlzdF9lbGVtZW50ID0gbm9kZV9saXN0X2VsZW1lbnQtPmxfbmV4dDsKLQkgICAgaWYgKHN0cmNtcChub2RlX25hbWUsIG5vZGVfb2JqZWN0LT5ub2RlX25hbWUpID09IDApIHsKLQkJcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gbm9kZV9vYmplY3Q9eFwnJTA4eFwnLlxuIiwKLQkJCSAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIG5vZGVfb2JqZWN0KTsKLQkJcmV0dXJuIG5vZGVfb2JqZWN0OwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBub2RlX29iamVjdCA9IE5VTEw7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gbm9kZV9vYmplY3Q9eFwnJTA4eFwnLlxuIiwKLQkJICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBub2RlX29iamVjdCk7Ci0gICAgcmV0dXJuIG5vZGVfb2JqZWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZmluZCB0YXNrIGluIG15IGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVGFza09iamVjdCAqCi1nZXRfdGFza19pbl9saXN0KExpc3QgKiB0YXNrX2xpc3QsIGNoYXIgKnRhc2tfaW5zdGFuY2VfbWFjaGluZV9uYW1lLCBpbnQgbGxfdGFza19pZCkKLXsKLSAgICBUYXNrT2JqZWN0ICp0YXNrX29iamVjdCA9IE5VTEw7Ci0gICAgTGlzdEVsZW1lbnQgKnRhc2tfbGlzdF9lbGVtZW50ID0gTlVMTDsKLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLiBpZD0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCi0JCSAgbGxfdGFza19pZCk7Ci0gICAgdGFza19saXN0X2VsZW1lbnQgPSB0YXNrX2xpc3QtPmxfaGVhZDsKLSAgICB3aGlsZSAodGFza19saXN0X2VsZW1lbnQgIT0gTlVMTCkgewotCXRhc2tfb2JqZWN0ID0gdGFza19saXN0X2VsZW1lbnQtPmxfdmFsdWU7Ci0JdGFza19saXN0X2VsZW1lbnQgPSB0YXNrX2xpc3RfZWxlbWVudC0+bF9uZXh0OwotCWlmICgobGxfdGFza19pZCA9PSB0YXNrX29iamVjdC0+bGxfdGFza19pZCkKLQkgICAgJiYgKHN0cmNtcCh0YXNrX29iamVjdC0+bm9kZV9uYW1lLCB0YXNrX2luc3RhbmNlX21hY2hpbmVfbmFtZSkgPT0gMCkpIHsKLQkgICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gdGFza19vYmplY3Q9eFwnJTA4eFwnLlxuIiwKLQkJCSAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdGFza19vYmplY3QpOwotCSAgICByZXR1cm4gdGFza19vYmplY3Q7Ci0JfQotICAgIH0KLSAgICB0YXNrX29iamVjdCA9IE5VTEw7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC4gdGFza19vYmplY3Q9eFwnJTA4eFwnLlxuIiwKLQkJICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCB0YXNrX29iamVjdCk7Ci0gICAgcmV0dXJuIHRhc2tfb2JqZWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGV0ZXJtaW5lIGlmIExvYWRMZXZlbGVyIGlzIGNvbmZpZ3VyZWQgbXVsdGljbHVzdGVyLiAgICAgICAgICAgICAgICAgICoKLSAqIElmIGFueSBlcnJvcnMgdGhlbiBkZWZhdWx0IHRvIGxvY2FsLiBUaGlzIGNvZGUgd2lsbCBub3QgYmUgY2FsbGVkICAgICAqCi0gKiBpZiB0aGUgdXNlciBoYXMgZm9yY2VkIHVzIHRvIHJ1biBsb2NhbCBvbmx5IG9yIG11bHRpY2x1c3RlciBtb2RlLiAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLWdldF9tdWx0aWNsdXN0ZXJfc3RhdHVzKCkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIGludCBpID0gMDsKLSAgICBMTF9lbGVtZW50ICpxdWVyeV9lbGVtID0gTlVMTDsKLSAgICBMTF9lbGVtZW50ICpjbHVzdGVyID0gTlVMTDsKLSAgICBpbnQgY2x1c3Rlcl9jb3VudCA9IDA7Ci0KLSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICI+Pj4gJXMgZW50ZXJlZC4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCi0gICAgaWYgKChzdGF0ZV9zaHV0ZG93bl9yZXF1ZXN0ZWQgPT0gMCkgJiYgKHN0YXRlX2V2ZW50c19hY3RpdmUgPT0gMSkpIHsKLQotCWlmIChtdWx0aWNsdXN0ZXJfc3RhdHVzID09IC0xKSB7Ci0KLQkgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0JICAgIHF1ZXJ5X2VsZW0gPSBteV9sbF9xdWVyeShDTFVTVEVSUyk7Ci0KLQkgICAgaWYgKHF1ZXJ5X2VsZW0gPT0gTlVMTCkgewotCQlwcmludF9tZXNzYWdlKEVSUk9SX01FU1NBR0UsCi0JCQkgICAgICAiVW5hYmxlIHRvIG9idGFpbiBxdWVyeSBlbGVtZW50LiBMb2FkTGV2ZWxlciBtYXkgbm90IGJlIGFjdGl2ZS5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgICAvKiBHZXQgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gTG9hZExldmVsZXIgY2x1c3RlcnMuCi0JICAgICAqIFFVRVJZX0FMTDogd2UgYXJlIHF1ZXJ5aW5nIGZvciBsb2NhbCBjbHVzdGVyIGRhdGEKLQkgICAgICogTlVMTDogbm8gZmlsdGVyIG5lZWRlZAotCSAgICAgKiBBTExfREFUQTogd2Ugd2FudCBhbGwgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBhYm91dCB0aGUgY2x1c3RlciAqLwotCi0JICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2FsbCBMb2FkTGV2ZWxlciAobGxfc2V0X3JlcXVlc3QpIGZvciBjbHVzdGVyLlxuIik7Ci0JICAgIHJjID0gbXlfbGxfc2V0X3JlcXVlc3QocXVlcnlfZWxlbSwgUVVFUllfQUxMLCBOVUxMLCBBTExfREFUQSk7Ci0KLQkgICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJDYWxsIExvYWRMZXZlbGVyIChsbF9nZXRfb2JqcykgZm9yIGNsdXN0ZXIuXG4iKTsKLQkgICAgY2x1c3RlciA9IG15X2xsX2dldF9vYmpzKHF1ZXJ5X2VsZW0sIExMX0NNLCBOVUxMLCAmY2x1c3Rlcl9jb3VudCwgJnJjKTsKLQkgICAgaWYgKHJjIDwgMCkgewotCQlyYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCi0JICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTnVtYmVyIG9mIExvYWRMZXZlbGVyIENsdXN0ZXJzPSVkLlxuIiwgY2x1c3Rlcl9jb3VudCk7Ci0JICAgIGkgPSAwOwotCSAgICBpZiAoY2x1c3RlciAhPSBOVUxMKSB7Ci0JCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2x1c3RlciAlZDpcbiIsIGkpOwotCQlyYyA9IG15X2xsX2dldF9kYXRhKGNsdXN0ZXIsIExMX0NsdXN0ZXJNdXN0ZXJFbnZpcm9ubWVudCwgJm11bHRpY2x1c3Rlcl9zdGF0dXMpOwotCQlpZiAocmMgIT0gMCkgewotCQkgICAgcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLAotCQkJCSAgIkVycm9yIHJjPSVkIHRyeWluZyB0byBkZXRlcm1pbmUgaWYgTG9hZExldmVsZXIgaXMgcnVubmluZyBsb2NhbCBvciBtdWx0aWNsdXN0ZXIgY29uZmlndXJhdGlvbi4gRGVmYXVsdGluZyB0byBsb2NhbCBjbHVzdGVyIG9ubHkgKG5vIG11bHRpY2x1c3RlcikuXG4iLAotCQkJCSAgcmMpOwotCQkgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIk11bHRpY2x1c3RlciByZXR1cm5lZCBpcyA9ICVkLlxuIiwKLQkJCQkgIG11bHRpY2x1c3Rlcl9zdGF0dXMpOwotCQl9Ci0KLQkgICAgfQotCi0JICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8gcmVsZWFzZSB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIHRoYXQgd2VyZSAqLwotCSAgICAvKiBvYnRhaW5lZCBieSB0aGUgcXVlcnkgKi8KLQkgICAgcmMgPSBteV9sbF9mcmVlX29ianMocXVlcnlfZWxlbSk7Ci0JICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLQl9Ci0gICAgfQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIjw8PCAlcyByZXR1cm5pbmcuIGxpbmU9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gbXVsdGljbHVzdGVyX3N0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJldHJpZXZlIGEgbGlzdCBvZiBMb2FkTGV2ZWxlciBjbHVzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBJZiBubyBtdWx0aWNsdXN0ZXIgZW52aXJvbm1lbnQgdGhlbiByZXR1cm4gYSBsaXN0IG9mIDEgY2x1c3Rlci4gICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1yZWZyZXNoX2NsdXN0ZXJfbGlzdCgpCi17Ci0gICAgaW50IHJjID0gMDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgTExfZWxlbWVudCAqcXVlcnlfZWxlbSA9IE5VTEw7Ci0gICAgTExfZWxlbWVudCAqY2x1c3RlciA9IE5VTEw7Ci0gICAgaW50IGNsdXN0ZXJfY291bnQgPSAwOwotICAgIGNoYXIgKmNsdXN0ZXJfbmFtZSA9IE5VTEw7Ci0gICAgaW50IGNsdXN0ZXJfbG9jYWwgPSAwOwotICAgIENsdXN0ZXJPYmplY3QgKmNsdXN0ZXJfb2JqZWN0ID0gTlVMTDsKLQotICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfTUVTU0FHRSwgIj4+PiAlcyBlbnRlcmVkLiBsaW5lPSVkLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0KLSAgICBpZiAoKHN0YXRlX3NodXRkb3duX3JlcXVlc3RlZCA9PSAwKSAmJiAoc3RhdGVfZXZlbnRzX2FjdGl2ZSA9PSAxKSkgewotCi0JaWYgKG11bHRpY2x1c3Rlcl9zdGF0dXMgPT0gLTEpIHsKLQkgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IGdldF9tdWx0aWNsdXN0ZXJfc3RhdHVzKCk7Ci0JfQotCi0Jc3dpdGNoIChtdWx0aWNsdXN0ZXJfc3RhdHVzKSB7Ci0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgKiBubyBjb250YWN0IHdpdGggbG9hZGxldmVsZXIgeWV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JICAgIGNhc2UgLTE6Ci0JCWJyZWFrOwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICogc2luZ2xlIGNsdXN0ZXIgYW5kIG11bHRpIGNsdXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCSAgICBjYXNlIDA6Ci0JCWlmIChjbHVzdGVyX2xpc3QgPT0gTlVMTCkgewotCQkgICAgY2x1c3Rlcl9saXN0ID0gTmV3TGlzdCgpOwotCQkgICAgam9iX2xpc3QgPSBOZXdMaXN0KCk7Ci0JCX0KLQkJLyogZW5kIGlmIG5vIGxpc3Qgb2J0YWluZWQgeWV0ICovCi0JCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLAotCQkJICAgICAgIk51bWJlciBvZiBMb2FkTGV2ZWxlciBDbHVzdGVycz0wIChub3QgcnVubmluZyBtdWx0aWNsdXN0ZXIpLlxuIik7Ci0JCWkgPSAwOwotCQljbHVzdGVyX29iamVjdCA9IChDbHVzdGVyT2JqZWN0ICopIG1hbGxvYyhzaXplb2YoQ2x1c3Rlck9iamVjdCkpOwotCQltYWxsb2NfY2hlY2soY2x1c3Rlcl9vYmplY3QsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCQltZW1zZXQoY2x1c3Rlcl9vYmplY3QsICdcMCcsIHNpemVvZihjbHVzdGVyX29iamVjdCkpOwotCQljbHVzdGVyX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX2NsdXN0ZXJfaWQgPSBnZW5lcmF0ZV9pZCgpOwotCQljbHVzdGVyX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkID0gZ2VuZXJhdGVfaWQoKTsKLQkJY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfc3RhdGUgPSBNWV9TVEFURV9VUDsKLQkJY2x1c3Rlcl9vYmplY3QtPnF1ZXVlX3N0YXRlID0gTVlfU1RBVEVfVVA7Ci0JCWNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX25hbWUgPSBzdHJkdXAoIkxvY2FsIChub3QgbXVsdGljbHVzdGVyKSIpOwotCQljbHVzdGVyX29iamVjdC0+Y2x1c3Rlcl9pc19sb2NhbCA9IDE7Ci0JCWNsdXN0ZXJfb2JqZWN0LT5ub2RlX2hhc2ggPSBIYXNoQ3JlYXRlKDEwMjQpOwotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNsdXN0ZXIgbmFtZT0lc1xuIiwgY2x1c3Rlcl9uYW1lKTsKLQkJQWRkVG9MaXN0KGNsdXN0ZXJfbGlzdCwgKHZvaWQgKikgY2x1c3Rlcl9vYmplY3QpOwotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCSAgICAgICJTZW5kIGV2ZW50IG5vdGlmaWNhdGlvbjogUFRQIE1hY2hpbmUgYWRkZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJICAgICAgY2x1c3Rlcl9uYW1lKTsKLQkJc2VuZE1hY2hpbmVBZGRFdmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwgY2x1c3Rlcl9vYmplY3QpOwotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCSAgICAgICJTZW5kIGV2ZW50IG5vdGlmaWNhdGlvbjogUFRQIFF1ZXVlIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCSAgICAgIGNsdXN0ZXJfbmFtZSk7Ci0JCXNlbmRRdWV1ZUFkZEV2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBjbHVzdGVyX29iamVjdCk7Ci0JCWJyZWFrOwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICogbXVsdGljbHVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCSAgICBjYXNlIDE6Ci0JCWlmIChjbHVzdGVyX2xpc3QgPT0gTlVMTCkgewotCQkgICAgY2x1c3Rlcl9saXN0ID0gTmV3TGlzdCgpOwotCQkgICAgam9iX2xpc3QgPSBOZXdMaXN0KCk7Ci0JCX0KLQkJLyogZW5kIGlmIG5vIGxpc3Qgb2J0YWluZWQgeWV0ICovCi0JCXF1ZXJ5X2VsZW0gPSBOVUxMOwotCi0JCXF1ZXJ5X2VsZW0gPSBteV9sbF9xdWVyeShNQ0xVU1RFUlMpOwotCi0JCWlmIChxdWVyeV9lbGVtID09IE5VTEwpIHsKLQkJICAgIHByaW50X21lc3NhZ2UoRVJST1JfTUVTU0FHRSwKLQkJCQkgICJVbmFibGUgdG8gb2J0YWluIHF1ZXJ5IGVsZW1lbnQuIExvYWRMZXZlbGVyIG1heSBub3QgYmUgYWN0aXZlLlxuIik7Ci0JCSAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7Ci0JCSAgICByZXR1cm47Ci0JCX0KLQotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNhbGwgTG9hZExldmVsZXIgKGxsX3NldF9yZXF1ZXN0KSBmb3IgY2x1c3RlcnMuXG4iKTsKLQkJcmMgPSBteV9sbF9zZXRfcmVxdWVzdChxdWVyeV9lbGVtLCBRVUVSWV9BTEwsIE5VTEwsIEFMTF9EQVRBKTsKLQotCQlpZiAocmMgIT0gMCkgewotCQkgICAgcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotCQkgICAgcXVlcnlfZWxlbSA9IE5VTEw7Ci0JCSAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7Ci0JCSAgICByZXR1cm47Ci0JCX0KLQotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIkNhbGwgTG9hZExldmVsZXIgKGxsX2dldF9vYmpzKSBmb3IgY2x1c3RlcnMuXG4iKTsKLQkJY2x1c3RlciA9IG15X2xsX2dldF9vYmpzKHF1ZXJ5X2VsZW0sIExMX1NDSEVERCwgTlVMTCwgJmNsdXN0ZXJfY291bnQsICZyYyk7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCSAgICByYyA9IG15X2xsX2RlYWxsb2NhdGUocXVlcnlfZWxlbSk7Ci0JCSAgICBxdWVyeV9lbGVtID0gTlVMTDsKLQkJICAgIG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAtMTsKLQkJICAgIHJldHVybjsKLQkJfQotCi0JCXByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiTnVtYmVyIG9mIExvYWRMZXZlbGVyIENsdXN0ZXJzPSVkLlxuIiwgY2x1c3Rlcl9jb3VudCk7Ci0JCWkgPSAwOwotCQl3aGlsZSAoKGNsdXN0ZXIgIT0gTlVMTCkgJiYgKHF1ZXJ5X2VsZW0gIT0gTlVMTCkpIHsKLQkJICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiQ2x1c3RlciAlZDpcbiIsIGkpOwotCQkgICAgcmMgPSBteV9sbF9nZXRfZGF0YShjbHVzdGVyLCBMTF9NQ2x1c3Rlck5hbWUsICZjbHVzdGVyX25hbWUpOwotCQkgICAgaWYgKHJjICE9IDApIHsKLQkJCXJjID0gbXlfbGxfZnJlZV9vYmpzKHF1ZXJ5X2VsZW0pOwotCQkJcmMgPSBteV9sbF9kZWFsbG9jYXRlKHF1ZXJ5X2VsZW0pOwotCQkJcXVlcnlfZWxlbSA9IE5VTEw7Ci0JCQltdWx0aWNsdXN0ZXJfc3RhdHVzID0gLTE7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCWNsdXN0ZXJfb2JqZWN0ID0gKENsdXN0ZXJPYmplY3QgKikgbWFsbG9jKHNpemVvZihDbHVzdGVyT2JqZWN0KSk7Ci0JCQltYWxsb2NfY2hlY2soY2x1c3Rlcl9vYmplY3QsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCQkJbWVtc2V0KGNsdXN0ZXJfb2JqZWN0LCAnXDAnLCBzaXplb2YoY2x1c3Rlcl9vYmplY3QpKTsKLQkJCWNsdXN0ZXJfb2JqZWN0LT5wcm94eV9nZW5lcmF0ZWRfY2x1c3Rlcl9pZCA9IGdlbmVyYXRlX2lkKCk7Ci0JCQljbHVzdGVyX29iamVjdC0+cHJveHlfZ2VuZXJhdGVkX3F1ZXVlX2lkID0gZ2VuZXJhdGVfaWQoKTsKLQkJCWNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX3N0YXRlID0gTVlfU1RBVEVfVVA7Ci0JCQljbHVzdGVyX29iamVjdC0+cXVldWVfc3RhdGUgPSBNWV9TVEFURV9VUDsKLQkJCXJjID0gbXlfbGxfZ2V0X2RhdGEoY2x1c3RlciwgTExfTUNsdXN0ZXJMb2NhbCwgJmNsdXN0ZXJfbG9jYWwpOwotCQkJY2x1c3Rlcl9vYmplY3QtPmNsdXN0ZXJfbmFtZSA9IHN0cmR1cChjbHVzdGVyX25hbWUpOwotCQkJaWYgKGNsdXN0ZXJfbG9jYWwgPT0gMSkgewotCQkJICAgIGNsdXN0ZXJfb2JqZWN0LT5jbHVzdGVyX2lzX2xvY2FsID0gMTsKLQkJCX0KLQkJCWNsdXN0ZXJfb2JqZWN0LT5ub2RlX2hhc2ggPSBIYXNoQ3JlYXRlKDEwMjQpOwotCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJDbHVzdGVyIG5hbWU9JXNcbiIsIGNsdXN0ZXJfbmFtZSk7Ci0JCQlBZGRUb0xpc3QoY2x1c3Rlcl9saXN0LCAodm9pZCAqKSBjbHVzdGVyX29iamVjdCk7Ci0JCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCQkgICAgICAiU2VuZCBldmVudCBub3RpZmljYXRpb246IFBUUCBNYWNoaW5lIGFkZGVkIGZvciBMb2FkTGV2ZWxlciBDbHVzdGVyPSVzLlxuIiwKLQkJCQkgICAgICBjbHVzdGVyX25hbWUpOwotCQkJc2VuZE1hY2hpbmVBZGRFdmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwgY2x1c3Rlcl9vYmplY3QpOwotCQkJcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsCi0JCQkJICAgICAgIlNlbmQgZXZlbnQgbm90aWZpY2F0aW9uOiBQVFAgUXVldWUgYWRkZWQgZm9yIExvYWRMZXZlbGVyIENsdXN0ZXI9JXMuXG4iLAotCQkJCSAgICAgIGNsdXN0ZXJfbmFtZSk7Ci0JCQlzZW5kUXVldWVBZGRFdmVudChzdGFydF9ldmVudHNfdHJhbnNpZCwgY2x1c3Rlcl9vYmplY3QpOwotCQkgICAgfQotCi0JCSAgICBpKys7Ci0JCSAgICBjbHVzdGVyID0gbXlfbGxfbmV4dF9vYmoocXVlcnlfZWxlbSk7Ci0JCX0KLQotCQlpZiAocXVlcnlfZWxlbSAhPSBOVUxMKSB7Ci0JCSAgICByYyA9IG15X2xsX2ZyZWVfb2JqcyhxdWVyeV9lbGVtKTsKLQkJICAgIHJjID0gbXlfbGxfZGVhbGxvY2F0ZShxdWVyeV9lbGVtKTsKLQkJfQotCQlxdWVyeV9lbGVtID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQl9Ci0KLSAgICB9Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9NRVNTQUdFLCAiPDw8ICVzIHJldHVybmluZy4gbGluZT0lZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybjsKLX0KLQotI2VuZGlmCi0KLXZvaWQKLXNlbmRfc3RyaW5nX2F0dHJzKGludCB0cmFuc19pZCwgaW50IGZsYWdzKQotewotCi0vKgotICogU2VuZCBzdHJpbmcgYXR0cmlidXRlcywgaW5jbHVkaW5nIGRlZmF1bHQgdmFsdWVzLCB0byBmcm9udCBlbmQKLSAqLwotICAgIFRSQUNFX0VOVFJZOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IChzaXplb2Ygc3RyaW5nX2xhdW5jaF9hdHRycyAvIHNpemVvZihzdHJpbmdfbGF1bmNoX2F0dHIpKTsgaSsrKSB7Ci0JaWYgKChzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLnR5cGUgJiBmbGFncykgPT0gZmxhZ3MpIHsKLQkgICAgZW5xdWV1ZV9ldmVudChwcm94eV9hdHRyX2RlZl9zdHJpbmdfZXZlbnQodHJhbnNfaWQsCi0JCQkJCQkgICAgICBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLmlkLAotCQkJCQkJICAgICAgc3RyaW5nX2xhdW5jaF9hdHRyc1tpXS5zaG9ydF9uYW1lLAotCQkJCQkJICAgICAgc3RyaW5nX2xhdW5jaF9hdHRyc1tpXS5sb25nX25hbWUsIDAsCi0JCQkJCQkgICAgICBzdHJpbmdfbGF1bmNoX2F0dHJzW2ldLmRlZmF1bHRfdmFsdWUpKTsKLQl9Ci0gICAgfQotICAgIFRSQUNFX0VYSVQ7Ci19Ci0KLXZvaWQKLXNlbmRfaW50X2F0dHJzKGludCB0cmFuc19pZCwgaW50IGZsYWdzKQotewotICAgIC8qCi0gICAgICogU2VuZCBpbnRlZ2VyIGF0dHJpYnV0ZXMsIGluY2x1ZGluZyBkZWZhdWx0IHZhbHVlLCBsb3dlciBhbmQgdXBwZXIKLSAgICAgKiBib3VuZHMsIHRvIGZyb250IGVuZAotICAgICAqLwotICAgIGludCBpOwotCi0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgZm9yIChpID0gMDsgaSA8IChzaXplb2YgaW50X2F0dHJzIC8gc2l6ZW9mKGludF9sYXVuY2hfYXR0cikpOyBpKyspIHsKLQlpZiAoKGludF9hdHRyc1tpXS50eXBlICYgZmxhZ3MpID09IGZsYWdzKSB7Ci0JICAgIGVucXVldWVfZXZlbnQocHJveHlfYXR0cl9kZWZfaW50X2xpbWl0c19ldmVudCh0cmFuc19pZCwKLQkJCQkJCQkgIGludF9hdHRyc1tpXS5pZCwgaW50X2F0dHJzW2ldLnNob3J0X25hbWUsCi0JCQkJCQkJICBpbnRfYXR0cnNbaV0ubG9uZ19uYW1lLCAwLAotCQkJCQkJCSAgaW50X2F0dHJzW2ldLmRlZmF1bHRfdmFsdWUsCi0JCQkJCQkJICBpbnRfYXR0cnNbaV0ubGxpbWl0LAotCQkJCQkJCSAgaW50X2F0dHJzW2ldLnVsaW1pdCkpOwotCX0KLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLX0KLQotdm9pZAotc2VuZF9sb25nX2ludF9hdHRycyhpbnQgdHJhbnNfaWQsIGludCBmbGFncykKLXsKLSAgICAvKgotICAgICAqIFNlbmQgbG9uZyAoNjQgYml0KSBpbnRnZWdlciBhdHRyaWJ1dGVzLCBpbmNsdWRpbmcgZGVmYXVsdCB2YWx1ZSBhbmQKLSAgICAgKiBsb3dlciBhbmQgdXBwZXIgYm91bmRzIHRvIGZyb250IGVuZAotICAgICAqLwotICAgIGludCBpOwotCi0gICAgVFJBQ0VfRU5UUlk7Ci0gICAgZm9yIChpID0gMDsgaSA8IChzaXplb2YgbG9uZ19pbnRfYXR0cnMgLyBzaXplb2YobG9uZ19pbnRfbGF1bmNoX2F0dHIpKTsgaSsrKSB7Ci0JaWYgKChsb25nX2ludF9hdHRyc1tpXS50eXBlICYgZmxhZ3MpID09IGZsYWdzKSB7Ci0JICAgIGVucXVldWVfZXZlbnQocHJveHlfYXR0cl9kZWZfbG9uZ19pbnRfbGltaXRzX2V2ZW50KHRyYW5zX2lkLAotCQkJCQkJCSAgICAgICBsb25nX2ludF9hdHRyc1tpXS5pZCwKLQkJCQkJCQkgICAgICAgbG9uZ19pbnRfYXR0cnNbaV0uc2hvcnRfbmFtZSwKLQkJCQkJCQkgICAgICAgbG9uZ19pbnRfYXR0cnNbaV0ubG9uZ19uYW1lLCAwLAotCQkJCQkJCSAgICAgICBsb25nX2ludF9hdHRyc1tpXS5kZWZhdWx0X3ZhbHVlLAotCQkJCQkJCSAgICAgICBsb25nX2ludF9hdHRyc1tpXS5sbGltaXQsCi0JCQkJCQkJICAgICAgIGxvbmdfaW50X2F0dHJzW2ldLnVsaW1pdCkpOwotCX0KLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLX0KLQotdm9pZAotc2VuZF9lbnVtX2F0dHJzKGludCB0cmFuc19pZCwgaW50IGZsYWdzKQotewotICAgIC8qCi0gICAgICogU2VuZCBlbnVtZXJhdGVkIGF0dHJpYnV0ZXMsIGluY2x1ZGluZyBkZWZhdWx0IGFuZCBhbGxvd2FibGUgdmFsdWVzLCB0bwotICAgICAqIGZyb250IGVuZC4KLSAgICAgKi8KLSAgICBpbnQgaTsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mIGVudW1fYXR0cnMgLyBzaXplb2YoZW51bV9sYXVuY2hfYXR0cikpOyBpKyspIHsKLQljaGFyICpjcDsKLQljaGFyICplbmRfY3A7Ci0JY2hhciAqY3Bfc2F2ZTsKLQlpbnQgbjsKLQotCXByb3h5X21zZyAqbXNnOwotCi0JaWYgKChlbnVtX2F0dHJzW2ldLnR5cGUgJiBmbGFncykgPT0gZmxhZ3MpIHsKLQkgICAgLyoKLQkgICAgICogQ291bnQgdGhlIG51bWJlciBvZiBlbnVtZXJhdGlvbnMgaW4gdGhlIGVudW0gbGlzdC4gRW51bWVyYXRpb25zIGFyZQotCSAgICAgKiBkZWxpbWl0ZWQgYnkgJ3wnIHNvIG51bWJlciBvZiBlbnVtZXJhdGlvbnMgaXMgbnVtYmVyIG9mICd8JyArIDEKLQkgICAgICovCi0JICAgIGNwID0gZW51bV9hdHRyc1tpXS5lbnVtczsKLQkgICAgbiA9IDE7Ci0JICAgIHdoaWxlICgqY3AgIT0gJ1wwJykgewotCQlpZiAoKCpjcCkgPT0gJ3wnKSB7Ci0JCSAgICBuID0gbiArIDE7Ci0JCX0KLQkJY3AgPSBjcCArIDE7Ci0JICAgIH0KLQkgICAgLyoKLQkgICAgICogQ3JlYXRlIHRoZSBlbnVtZXJhdGlvbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBoZWFkZXIKLQkgICAgICovCi0JICAgIG1zZyA9IHByb3h5X2F0dHJfZGVmX2VudW1fZXZlbnQodHJhbnNfaWQsIGVudW1fYXR0cnNbaV0uaWQsCi0JCQkJCSAgICBlbnVtX2F0dHJzW2ldLnNob3J0X25hbWUsIGVudW1fYXR0cnNbaV0ubG9uZ19uYW1lLCAwLAotCQkJCQkgICAgZW51bV9hdHRyc1tpXS5kZWZhdWx0X3ZhbHVlLCBuKTsKLQkgICAgLyoKLQkgICAgICogQXBwZW5kIGVudW1lcmF0aW9ucyB0byBtZXNzYWdlLiBTaW5jZSBlbnVtZXJhdGlvbnMgc3RyaW5nIGlzCi0JICAgICAqIGEgc3RyaW5nIGxpdGVyYWwgdGhhdCBpcyBpbGxlZ2FsIHRvIG1vZGlmeSwgY3JlYXRlIGEgd29ya2luZyBjb3B5Ci0JICAgICAqLwotCSAgICBjcCA9IHN0cmR1cChlbnVtX2F0dHJzW2ldLmVudW1zKTsKLQkgICAgY3Bfc2F2ZSA9IGNwOwotCSAgICBmb3IgKDs7KSB7Ci0JCWVuZF9jcCA9IHN0cmNocihjcCwgJ3wnKTsKLQkJaWYgKGVuZF9jcCA9PSBOVUxMKSB7Ci0JCSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGNwKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWVsc2UgewotCQkgICAgKmVuZF9jcCA9ICdcMCc7Ci0JCSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGNwKTsKLQkJICAgIGNwID0gZW5kX2NwICsgMTsKLQkJfQotCSAgICB9Ci0JICAgIGZyZWUoY3Bfc2F2ZSk7Ci0JICAgIC8qCi0JICAgICAqIFNlbmQgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICAgICAqLwotCSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0JfQotICAgIH0KLSAgICBUUkFDRV9FWElUOwotfQotCi12b2lkCi1zZW5kX2xvY2FsX2RlZmF1bHRfYXR0cnMoaW50IHRyYW5zX2lkKQotewotICAgIC8qCi0gICAgICogU2VuZCB2YWx1ZXMgb2YgYW55IFBFIGVudmlyb25tZW50IHZhcmlhYmxlcyAoTVBfKikgdG8gZnJvbnQgZW5kLiBUaGVzZQotICAgICAqIGFyZSBzZW50IGFzIHN0cmluZyBhdHRyaWJ1dGVzIHdpdGggdGhlIE1QXyBwcmVmaXggcmVwbGFjZWQgd2l0aAotICAgICAqIEVOXy4gVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGZyb250IGVuZCB0byBzZXQgbG9jYWwgKHVzZXIpIGRlZmF1bHQgdmFsdWVzCi0gICAgICogZm9yIFBFIGVudmlyb25tZW50IHZhbHVlcywgb3ZlcnJpZGluZyBJQk0gZGVmYXVsdHMuCi0gICAgICovCi0gICAgY2hhciAqKmVudjsKLSAgICBjaGFyICpjcDsKLSAgICBjaGFyICp2YWx1ZTsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIGVudiA9IGVudmlyb247Ci0gICAgd2hpbGUgKCplbnYgIT0gTlVMTCkgewotCS8qCi0JICogQ2hlY2sgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGEgUEUgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0JICovCi0JaWYgKG1lbWNtcCgqZW52LCAiTVBfIiwgMykgPT0gMCkgewotCSAgICAvKgotCSAgICAgKiBNYWtlIGEgZHVwbGljYXRlIG9mIHRoZSBlbnZpcm9ubWVudCB0aGVuIHNwbGl0IGludG8gbmFtZS92YWx1ZQotCSAgICAgKiBhdCAnPScsIGNoYW5nZSB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG5hbWUgdG8gJ0VOJyBhbmQKLQkgICAgICogc2VuZCBpdCB0byB0aGUgZnJvbnQgZW5kIGFzIGEgc3RyaW5nIGF0dHJpYnV0ZS4gVGhlc2UgYXR0cmlidXRlcwotCSAgICAgKiBkbyBub3QgaGF2ZSBhdHRyaWJ1dGUgbmFtZSBvciBkZXNjcmlwdGlvbiBzaW5jZSB0aGV5IGRvIG5vdAotCSAgICAgKiBkaXNwbGF5IGluIHRoZSBHVUkuCi0JICAgICAqLwotCSAgICBjcCA9IHN0cmR1cCgqZW52KTsKLQkgICAgdmFsdWUgPSBzdHJjaHIoY3AsICc9Jyk7Ci0JICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JCSp2YWx1ZSA9ICdcMCc7Ci0JCXZhbHVlID0gdmFsdWUgKyAxOwotCQltZW1jcHkoY3AsICJFTiIsIDIpOwotCQllbnF1ZXVlX2V2ZW50KHByb3h5X2F0dHJfZGVmX3N0cmluZ19ldmVudCh0cmFuc19pZCwgY3AsICIiLCAiIiwgMCwgdmFsdWUpKTsKLQkgICAgfQotCSAgICBmcmVlKGNwKTsKLQl9Ci0JZW52ID0gZW52ICsgMTsKLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLX0KLQotI2lmZGVmIF9fbGludXhfXwotdm9pZAotZGlzY292ZXJfam9icygpCi17Ci0gICAgLyoKLSAgICAgKiBMb29rIGZvciBhbHJlYWR5IHJ1bm5pbmcgcG9lIGpvYnMgc3RhcnRlZCBieSB0aGlzIHVzZXIsIGFuZCBpbmZvcm0KLSAgICAgKiB0aGUgZnJvbnQgZW5kIG9mIGVhY2ggbmV3IGpvYi4gRm9yIExpbnV4LCBuZXcgam9icyBhcmUgZm91bmQgYnkKLSAgICAgKiByZWFkaW5nIC9wcm9jIGxvb2tpbmcgZm9yIGRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gcHJvY2Vzc2VzLgotICAgICAqIEZvciBlYWNoIHByb2Nlc3Mgd2hpY2ggaXMgb3duZWQgYnkgdGhlIHVzZXIgcnVubmluZyB0aGUgcHJveHksIGFuZAotICAgICAqIHdoZXJlIHRoZSBleGVjdXRhYmxlIG5hbWVkIGluIHRoZSBjb21tYW5kIGxpbmUgaXMgL3Vzci9iaW4vcG9lLAotICAgICAqIGdlbmVyYXRlIHRoZSBuZXcgam9iLgotICAgICAqLwotICAgIERJUiAqcHJvY2RpcjsKLSAgICBzdHJ1Y3QgZGlyZW50ICpwcm9jX2VudHJ5OwotICAgIHVpZF90IG15X3VpZDsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2luZm87Ci0gICAgaW50IHN0YXR1czsKLSAgICBjaGFyIGNtZF9wYXRoW1BBVEhfTUFYXTsKLQotICAgIFRSQUNFX0VOVFJZOwotICAgIG15X3VpZCA9IGdldHVpZCgpOwotICAgIHByb2NkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOwotICAgIGlmIChwcm9jZGlyID09IE5VTEwpIHsKLQlUUkFDRV9FWElUOwotCXJldHVybjsKLSAgICB9Ci0gICAgc3RhdHVzID0gY2hkaXIoIi9wcm9jIik7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0JVFJBQ0VfRVhJVDsKLQlyZXR1cm47Ci0gICAgfQotICAgIHByb2NfZW50cnkgPSByZWFkZGlyKHByb2NkaXIpOwotICAgIC8qCi0gICAgICogRm9yIGVhY2ggZmlsZW5hbWUgaW4gL3Byb2MsIGRldGVybWluZSBpZiBpdCBpcyBhIGRpcmVjdG9yeSBvd25lZCBieQotICAgICAqIHRoZSB1c2VyIHJ1bm5pbmcgdGhlIHByb3h5LiBJZiBpdCBpcywgdGhlbiBhdHRlbXB0IHRvIHJlYWQKLSAgICAgKiAvcHJvYy88cGlkPi9jbWRsaW5lIGFuZCB2ZXJpZnkgdGhlIGV4ZWN1dGFibGUncyBwYXRobmFtZS4gSWYgaXQgaXMKLSAgICAgKiAvdXNyL2Jpbi9wb2UsIHRoZW4gdGhpcyBpcyBhIG5ldyBqb2IgdG8gYmUgYWRkZWQgdG8gdGhlIGpvYiBsaXN0LgotICAgICAqIE5vdGUgdGhhdCBzaW5jZSBhIHByb2Nlc3MgbWF5IGV4aXQgYXQgYW55IHRpbWUsIHRoaXMgZnVuY3Rpb24gbXVzdAotICAgICAqIGFudGljaXBhdGUgZXJyb3JzIGF0dGVtcHRpbmcgdG8gb3BlbiBvciByZWFkIGZpbGVzIGluIC9wcm9jLgotICAgICAqLwotICAgIHdoaWxlIChwcm9jX2VudHJ5ICE9IE5VTEwpIHsKLQlzdGF0dXMgPSBzdGF0KHByb2NfZW50cnktPmRfbmFtZSwgJnN0YXRfaW5mbyk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JICAgIGlmICgoc3RhdF9pbmZvLnN0X3VpZCA9PSBteV91aWQpICYmIChTX0lTRElSKHN0YXRfaW5mby5zdF9tb2RlKSkpIHsKLQkJRklMRSAqY21kbGluZV9maWxlOwotCi0JCXNucHJpbnRmKGNtZF9wYXRoLCBzaXplb2YgY21kX3BhdGgsICIvcHJvYy8lcy9jbWRsaW5lIiwgcHJvY19lbnRyeS0+ZF9uYW1lKTsKLQkJY21kbGluZV9maWxlID0gZm9wZW4oY21kX3BhdGgsICJyIik7Ci0JCWlmIChjbWRsaW5lX2ZpbGUgIT0gTlVMTCkgewotCQkgICAgY2hhciBjbWRsaW5lW1BBVEhfTUFYXTsKLQkJICAgIGNoYXIgKmNwOwotCi0JCSAgICBjcCA9IGZnZXRzKGNtZGxpbmUsIHNpemVvZiBjbWRsaW5lLCBjbWRsaW5lX2ZpbGUpOwotCQkgICAgaWYgKGNwICE9IE5VTEwpIHsKLQkJCWludCBsZW47Ci0KLQkJCS8qCi0JCQkgKiBUaGUgY29tbWFuZCBsaW5lIGlzIGFuIGFycmF5IG9mICdcMCcgdGVybWluYXRlZAotCQkJICogdG9rZW5zIHJlcHJlc2VudGluZyBhcmdbMF0gdGhydSBhcmdbbl0uIExvb2sKLQkJCSAqIGF0IHRoZSBsYXN0IDMgY2hhcmFjdGVycyBvZiBhcmdbMF0gdG8gc2VlIGlmCi0JCQkgKiBpdCBpcyBhIHBvZSBwcm9jZXNzLgotCQkJICovCi0JCQlsZW4gPSBzdHJsZW4oY21kbGluZSk7Ci0JCQlpZiAobGVuID49IDMpIHsKLQkJCSAgICBjcCA9IGNwICsgbGVuIC0gMzsKLQkJCX0KLQkJCWlmIChzdHJjbXAoY3AsICJwb2UiKSA9PSAwKSB7Ci0JCQkgICAgYWRkX2Rpc2NvdmVyZWRfam9iKHByb2NfZW50cnktPmRfbmFtZSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICBmY2xvc2UoY21kbGluZV9maWxlKTsKLQkJfQotCSAgICB9Ci0JfQotCXByb2NfZW50cnkgPSByZWFkZGlyKHByb2NkaXIpOwotICAgIH0KLSAgICBjbG9zZWRpcihwcm9jZGlyKTsKLSAgICBUUkFDRV9FWElUOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfQUlYCi12b2lkCi1kaXNjb3Zlcl9qb2JzKCkKLXsKLSAgICAvKgotICAgICAqIExvb2sgZm9yIGFscmVhZHkgcnVubmluZyBwb2Ugam9icyBzdGFydGVkIGJ5IHRoaXMgdXNlciwgYW5kIGluZm9ybQotICAgICAqIHRoZSBmcm9udCBlbmQgb2YgZWFjaCBuZXcgam9iLiBGb3IgQUlYLCBkbyB0aGlzIGJ5IHF1ZXJ5aW5nIHRoZQotICAgICAqIHByb2Nlc3MgdGFibGUgYW5kIG5vdGlmeWluZyB0aGUgZnJvbnQgZW5kIGZvciBlYWNoIGpvYiBkZXRlY3RlZC4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgcHJvY3NpbmZvICpwcm9jaW5mbzsKLSAgICBpbnQgbnVtX3Byb2NzOwotICAgIHVpZF90IHVpZDsKLSAgICBwaWRfdCBzdGFydF9waWQ7Ci0KLSAgICAvKgotICAgICAqIEp1c3QgZ2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcHJvY2VzcyB0YWJsZSBzbyB0aGF0IHdlIGtub3cKLSAgICAgKiBob3cgYmlnIG9mIGFuIGFycmF5IHRvIGFsbG9jYXRlLiBOb3RlIHRoYXQgcHJvY2Vzc2VzIG1heSBiZSBhZGRlZCBvcgotICAgICAqIGRlbGV0ZWQgZnJvbSB0aGUgcHJvY2VzcyB0YWJsZSBiZWZvcmUgdGhlIG5leHQgY2FsbCB0byBnZXRwcm9jcywgc28gaXQKLSAgICAgKiBpcyByZW1vdGVseSBwb3NzaWJsZSB0aGF0IGEgbmV3bHkgc3RhcnRlZCBwb2UgcHJvY2VzcyBpcyBtaXNzZWQgb3IKLSAgICAgKiBhIHBvZSBwcm9jZXNzIGp1c3QgdGVybWluYXRpbmcgaXMgZm91bmQuIFRoZSBjaGFuY2VzIG9mIGVpdGhlciBoYXBwZW5pbmcKLSAgICAgKiBhcmUgc21hbGwgYW5kIG5vdCB3b3J0aCB0aGUgdHJvdWJsZSBvZiBpdGVyYXRpbmcgb24gZ2V0cHJvY3MoKSB0byBlbnN1cmUKLSAgICAgKiBhbGwgcHJvY2Vzc2VzIGFyZSBkZXRlY3RlZAotICAgICAqLwotICAgIFRSQUNFX0VOVFJZOwotICAgIHN0YXJ0X3BpZCA9IDA7Ci0gICAgbnVtX3Byb2NzID0gZ2V0cHJvY3MoTlVMTCwgc2l6ZW9mKHN0cnVjdCBwcm9jc2luZm8pLCBOVUxMLAotCQkJIHNpemVvZihzdHJ1Y3QgZmRzaW5mbyksICZzdGFydF9waWQsIElOVF9NQVgpOwotICAgIGlmIChudW1fcHJvY3MgPiAwKSB7Ci0JcHJvY2luZm8gPSAoc3RydWN0IHByb2NzaW5mbyAqKSBtYWxsb2MobnVtX3Byb2NzICogc2l6ZW9mKHN0cnVjdCBwcm9jc2luZm8pKTsKLQltYWxsb2NfY2hlY2socHJvY2luZm8sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCS8qCi0JICogTm93IGdldCB0aGUgYWN0dWFsIHByb2Nlc3MgdGFibGUuCi0JICogc3RhcnRfcGlkIG11c3QgYmUgcmVzZXQgaW4gb3JkZXIgZm9yIGdldHByb2NzIHRvIGdldCBwcm9jZXNzCi0JICogdGFibGUgaW5mb3JtYXRpb24uCi0JICovCi0Jc3RhcnRfcGlkID0gMDsKLQludW1fcHJvY3MgPSBnZXRwcm9jcyhwcm9jaW5mbywgc2l6ZW9mKHN0cnVjdCBwcm9jc2luZm8pLCBOVUxMLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGZkc2luZm8pLCAmc3RhcnRfcGlkLCBudW1fcHJvY3MpOwotCWlmIChudW1fcHJvY3MgPj0gMCkgewotCSAgICBpbnQgaTsKLQotCSAgICB1aWQgPSBnZXR1aWQoKTsKLQkgICAgLyoKLQkgICAgICogTm90aWZ5IHRoZSBmcm9udCBlbmQgZm9yIGVhY2ggcG9lIHByb2Nlc3Mgb3duZWQgYnkgdGhlIHVzZXIKLQkgICAgICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcHJvY3M7IGkrKykgewotCQlpZiAocHJvY2luZm9baV0ucGlfdWlkID09IHVpZCkgewotCQkgICAgY2hhciAqY3A7Ci0KLQkJICAgIGNwID0gc3RycmNocihwcm9jaW5mb1tpXS5waV9jb21tLCAnLycpOwotCQkgICAgaWYgKGNwID09IE5VTEwpIHsKLQkJCWNwID0gcHJvY2luZm9baV0ucGlfY29tbTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJY3AgPSBjcCArIDE7Ci0JCSAgICB9Ci0JCSAgICBpZiAoc3RyY21wKGNwLCAicG9lIikgPT0gMCkgewotCQkJY2hhciBwb2VfcGlkWzIwXTsKLQotCQkJc25wcmludGYocG9lX3BpZCwgc2l6ZW9mIHBvZV9waWQsICIlZCIsIHByb2NpbmZvW2ldLnBpX3BpZCk7Ci0JCQlhZGRfZGlzY292ZXJlZF9qb2IocG9lX3BpZCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQlmcmVlKHByb2NpbmZvKTsKLSAgICB9Ci0gICAgVFJBQ0VfRVhJVDsKLX0KLSNlbmRpZgotCi12b2lkCi1hZGRfZGlzY292ZXJlZF9qb2IoY2hhciAqcGlkKQotewotICAgIC8qCi0gICAgICogQ3JlYXRlIGEgbmV3IGpvYiBvYmplY3QgZm9yIHRoZSBkaXNjb3ZlcmVkIGpvYiwgYWRkIGl0IHRvIHRoZSBqb2IKLSAgICAgKiBsaXN0LCBhbmQgbm90aWZ5IHRoZSBwcm94eSBvZiB0aGUgbmV3IGpvYi4KLSAgICAgKi8KLSAgICBqb2JpbmZvICpqb2I7Ci0gICAgc3RydWN0IHBhc3N3ZCAqdXNlcmluZm87Ci0gICAgY2hhciBqb2JpZF9zdHJbMTJdOwotICAgIGNoYXIgcXVldWVpZF9zdHJbMTJdOwotICAgIGNoYXIgam9ibmFtZVs0MF07Ci0KLSAgICBUUkFDRV9FTlRSWTsKLSAgICBqb2IgPSBjYWxsb2MoMSwgc2l6ZW9mKGpvYmluZm8pKTsKLSAgICBtYWxsb2NfY2hlY2soam9iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICBqb2ItPnByb3h5X2pvYmlkID0gZ2VuZXJhdGVfaWQoKTsKLSAgICBqb2ItPnN1Ym1pdF9qb2JpZCA9ICIiOwotICAgIGpvYi0+cG9lX3BpZCA9IGF0b2kocGlkKTsKLSAgICBqb2ItPmRpc2NvdmVyZWRfam9iID0gMTsKLSAgICBqb2ItPnN1Ym1pdF90aW1lID0gMDsKLSAgICBzcHJpbnRmKGpvYmlkX3N0ciwgIiVkIiwgam9iLT5wcm94eV9qb2JpZCk7Ci0gICAgc3ByaW50ZihxdWV1ZWlkX3N0ciwgIiVkIiwgcXVldWVfaWQpOwotICAgIHVzZXJpbmZvID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOwotICAgIHNucHJpbnRmKGpvYm5hbWUsIHNpemVvZiBqb2JuYW1lLCAiJXMucnVuXyVzIiwgdXNlcmluZm8tPnB3X25hbWUsIHBpZCk7Ci0gICAgam9ibmFtZVtzaXplb2Ygam9ibmFtZSAtIDFdID0gJ1wwJzsKLSAgICBBZGRUb0xpc3Qoam9icywgam9iKTsKLSAgICBlbnF1ZXVlX2V2ZW50KHByb3h5X25ld19qb2JfZXZlbnQoc3RhcnRfZXZlbnRzX3RyYW5zaWQsIHF1ZXVlaWRfc3RyLAotCQkJCSAgICAgIGpvYmlkX3N0ciwgam9ibmFtZSwgSk9CX1NUQVRFX0lOSVQsIGpvYi0+c3VibWl0X2pvYmlkKSk7Ci0gICAgLyoKLSAgICAgKiBTdGFydCBhIHRocmVhZCB0byB3YXRjaCBmb3IgdGhlIGF0dGFjaC5jZmcgZmlsZSBmb3IgdGhpcyBqb2IKLSAgICAgKiBhcyBpZiBpdCB3YXMgaW52b2tlZCBieSB0aGUgZnJvbnQgZW5kLgotICAgICAqLwotICAgIHB0aHJlYWRfY3JlYXRlKCZqb2ItPnN0YXJ0dXBfdGhyZWFkLCAmdGhyZWFkX2F0dHJzLCBzdGFydHVwX21vbml0b3IsIGpvYik7Ci0gICAgVFJBQ0VfRVhJVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNURE9VVC9TVERFUlIgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotc3Rkb3V0X2hhbmRsZXIoaW50IGZkLCB2b2lkICpqb2IpCi17Ci0gICAgcmV0dXJuIHdyaXRlX291dHB1dChmZCwgKGpvYmluZm8gKikgam9iLCAmKChqb2JpbmZvICopIGpvYiktPnN0ZG91dF9pbmZvKTsKLX0KLQotaW50Ci1zdGRlcnJfaGFuZGxlcihpbnQgZmQsIHZvaWQgKmpvYikKLXsKLSAgICByZXR1cm4gd3JpdGVfb3V0cHV0KGZkLCAoam9iaW5mbyAqKSBqb2IsICYoKGpvYmluZm8gKikgam9iKS0+c3RkZXJyX2luZm8pOwotfQotCi1pbnQKLXdyaXRlX291dHB1dChpbnQgZmQsIGpvYmluZm8gKiBqb2IsIGlvaW5mbyAqIGZpbGVfaW5mbykKLXsKLSAgICAvKgotICAgICAqIFJlYWQgYXZhaWxhYmxlIGRhdGEgZnJvbSB0aGUgZmlsZSBkZXNjcmlwdG9yIGFuZCBzZW5kIGl0IHRvCi0gICAgICogZnJvbnQgZW5kLiBEYXRhIGlzIHJlYWQgZnJvbSBhIG5vbi1ibG9ja2luZyBwaXBlIHRvIGF2b2lkIGhhbmdpbmcKLSAgICAgKiBvbiBhIHJlYWQgb2YgYW4gaW5jb21wbGV0ZSBsaW5lIG9mIGRhdGEuIEFzIGEgcmVzdWx0LCB0aGUgZGF0YSByZWFkCi0gICAgICogbWF5IGJlIGFuIGluY29tcGxldGUgbGluZS4gVGhpcyByZXF1aXJlcyB0aGF0IGFzIGRhdGEgaXMgcmVhZCwgaXQgaXMKLSAgICAgKiBhcHBlbmRlZCB0byBhIHNlY29uZCBidWZmZXIgdW50aWwgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkLgotICAgICAqIE9uY2UgdGhlIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlYWQsIHRoZSBzZWNvbmQgYnVmZmVyIGlzIHNlbnQgdG8gdGhlCi0gICAgICogZnJvbnQgZW5kIGFuZCB0aGUgYnVmZmVyIHJlc2V0IHNvIHRoZSBuZXh0IGxpbmUgb2Ygb3V0cHV0IGNhbiBiZQotICAgICAqIGJ1aWx0LgotICAgICAqIEZJWDogTWF5IG5lZWQgdG8gZmx1c2ggYW4gaW5jb21wbGV0ZSBsaW5lIG9mIG91dHB1dCBpZiB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBwcm9jZXNzIGV4aXRzIChhbmQgY2xvc2VzIHRoZSBwaXBlKSBiZWZvcmUgdGhlIGVuZGluZwotICAgICAqIG5ld2xpbmUgaXMgc2Vlbi4KLSAgICAgKi8KLSAgICBpbnQgYnl0ZV9jb3VudDsKLSAgICBjaGFyICpjcDsKLQotICAgIGJ5dGVfY291bnQgPSByZWFkKGZkLCBmaWxlX2luZm8tPnJlYWRfYnVmLCBSRUFEX0JVRkZFUl9TSVpFIC0gMSk7Ci0gICAgd2hpbGUgKGJ5dGVfY291bnQgPiAwKSB7Ci0JZmlsZV9pbmZvLT5yZWFkX2J1ZltieXRlX2NvdW50XSA9ICdcMCc7Ci0JY3AgPSBmaWxlX2luZm8tPnJlYWRfYnVmOwotCXdoaWxlICgqY3AgIT0gJ1wwJykgewotCSAgICBjaGVja19idWZzaXplKGZpbGVfaW5mbyk7Ci0JICAgICpmaWxlX2luZm8tPmNwID0gKmNwOwotCSAgICBpZiAoKmNwID09ICdcbicpIHsKLQkJY2hlY2tfYnVmc2l6ZShmaWxlX2luZm8pOwotCQlmaWxlX2luZm8tPmNwID0gZmlsZV9pbmZvLT5jcCArIDE7Ci0JCSpmaWxlX2luZm8tPmNwID0gJ1wwJzsKLQkJZmlsZV9pbmZvLT53cml0ZV9mdW5jKGpvYiwgZmlsZV9pbmZvLT53cml0ZV9idWYpOwotCQlmaWxlX2luZm8tPmNwID0gZmlsZV9pbmZvLT53cml0ZV9idWY7Ci0JCWZpbGVfaW5mby0+cmVtYWluaW5nID0gZmlsZV9pbmZvLT5hbGxvY2F0ZWQ7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWZpbGVfaW5mby0+Y3AgPSBmaWxlX2luZm8tPmNwICsgMTsKLQkJZmlsZV9pbmZvLT5yZW1haW5pbmcgPSBmaWxlX2luZm8tPnJlbWFpbmluZyAtIDE7Ci0JICAgIH0KLQkgICAgY3AgPSBjcCArIDE7Ci0JfQotCWJ5dGVfY291bnQgPSByZWFkKGZkLCBmaWxlX2luZm8tPnJlYWRfYnVmLCBSRUFEX0JVRkZFUl9TSVpFIC0gMSk7Ci0gICAgfQotICAgIGlmIChieXRlX2NvdW50ID09IC0xKSB7Ci0JaWYgKChlcnJubyA9PSBFSU5UUikgfHwgKGVycm5vID09IEVBR0FJTikpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlwcmludF9tZXNzYWdlKFRSQUNFX0RFVEFJTF9NRVNTQUdFLCAiRU9GIGZvciBmZCAlZC4gVW5yZWdpc3RlcmluZyBoYW5kbGVyXG4iLCBmZCk7Ci0JVW5yZWdpc3RlckZpbGVIYW5kbGVyKGZkKTsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotfQotCi12b2lkCi1jaGVja19idWZzaXplKGlvaW5mbyAqIGZpbGVfaW5mbykKLXsKLSAgICBpZiAoZmlsZV9pbmZvLT5yZW1haW5pbmcgPT0gMCkgewotCWZpbGVfaW5mby0+YWxsb2NhdGVkID0gZmlsZV9pbmZvLT5hbGxvY2F0ZWQgKiAyOwotCWZpbGVfaW5mby0+d3JpdGVfYnVmID0gKGNoYXIgKikgcmVhbGxvYyhmaWxlX2luZm8tPndyaXRlX2J1ZiwgZmlsZV9pbmZvLT5hbGxvY2F0ZWQpOwotCW1hbGxvY19jaGVjayhmaWxlX2luZm8tPndyaXRlX2J1ZiwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICB9Ci19Ci0KLXZvaWQKLXNlbmRfc3Rkb3V0KGpvYmluZm8gKiBqb2IsIGNoYXIgKmJ1ZikKLXsKLSAgICAvKgotICAgICAqIFNlbmQgdGhlIGRhdGEgd3JpdHRlbiB0byBzdGRpbyBmaWxlIGRlc2NyaXB0b3JzIHRvIHRoZSBmcm9udCBlbmQuCi0gICAgICogSWYgdGhlIHVzZXIgcmVxdWVzdGVkIEkvTyB0byBiZSBzcGxpdCBieSB0YXNrLCB0aGVuIHRhZyB0aGUgbWVzc2FnZQotICAgICAqIHdpdGggdGhlIHRhc2sgaWQgb2YgdGhlIG9yaWdpbmF0aW5nIHRhc2suIE90aGVyd2lzZSwgdGFnIGl0IGZvciB0YXNrCi0gICAgICogMC4gIEluIG9yZGVyIHRvIHByb3Blcmx5IHRhZyBzdGRpbywgdGhlIHByb3h5IGludGVybmFsbHkgc2V0cwotICAgICAqIE1QX0xBQkVMSU89eWVzIElmIHRoZSB1c2VyIGhhZCBhbHNvIHNldCBNUF9MQUJFTElPPXllcywgdGhlbiBzZW5kCi0gICAgICogdGhlIG91dHB1dCB3aXRoIHRoZSBQRS1nZW5lcmF0ZWQgdGFzayBpZCB0byB0aGUgZnJvbnQgZW5kLiBPdGhlcndpc2UKLSAgICAgKiBzdHJpcCBvZmYgdGhlIHRhc2sgaWQgYmVmb3JlIHNlbmRpbmcgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqb3V0cDsKLSAgICBpbnQgdGFzazsKLQotICAgIGlmIChqb2ItPnNwbGl0X2lvKSB7Ci0gICAgICAgIGNwID0gc3RyY2hyKGJ1ZiwgJzonKTsKLSAgICAgICAgaWYgKGNwICE9IE5VTEwpIHsKLQkgICAgICAgICpjcCA9ICdcMCc7Ci0JICAgICAgICB0YXNrID0gYXRvaShidWYpOwotCSAgICAgICAgKmNwID0gJzonOwotCSAgICBpZiAoam9iLT5sYWJlbF9pbykgewotCSAgICAgICAgb3V0cCA9IGJ1ZjsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgICAgIG91dHAgPSBjcCArIDE7Ci0JICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQkgICAgdGFzayA9IDA7Ci0JICAgIG91dHAgPSBidWY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHRhc2sgPSAwOwotICAgICAgICBvdXRwID0gYnVmOwotICAgIH0KLSAgICBzZW5kX3Byb2Nlc3Nfc3RhdGVfb3V0cHV0X2V2ZW50KHN0YXJ0X2V2ZW50c190cmFuc2lkLCBqb2ItPnRhc2tzW3Rhc2tdLnByb3h5X3Rhc2tpZCwgb3V0cCk7Ci19Ci0KLXZvaWQKLXNlbmRfc3RkZXJyKGpvYmluZm8gKiBqb2IsIGNoYXIgKmJ1ZikKLXsKLSAgICAvKgotICAgICAqIFNlbmQgdGhlIGRhdGEgd3JpdHRlbiB0byBzdGRlcnIgZmlsZSBkZXNjcmlwdG9ycyB0byB0aGUgZnJvbnQgZW5kLgotICAgICAqLwotICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBidWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRnVuY3Rpb25zIHRvIHNlbmQgZXZlbnRzIHRvIGZyb250IGVuZCBHVUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1zZW5kX29rX2V2ZW50KGludCB0cmFuc19pZCkKLXsKLSAgICBwcm94eV9tc2cgKm1zZzsKLQotICAgIG1zZyA9IHByb3h5X29rX2V2ZW50KHRyYW5zX2lkKTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci19Ci0KLXZvaWQKLXBvc3RfZXJyb3IoaW50IHRyYW5zX2lkLCBpbnQgdHlwZSwgY2hhciAqbXNndGV4dCkKLXsKLSAgICAvKgotICAgICAqIFNlbmQgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgZnJvbnQgZW5kCi0gICAgICovCi0gICAgcHJveHlfbXNnICptc2c7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgInBvc3RfZXJyb3I6ICVzXG4iLCBtc2d0ZXh0KTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBtc2cgPSBwcm94eV9lcnJvcl9ldmVudCh0cmFuc19pZCwgdHlwZSwgbXNndGV4dCk7Ci0gICAgZW5xdWV1ZV9ldmVudChtc2cpOwotICAgIHJldHVybjsKLX0KLQotdm9pZAotcG9zdF9zdWJtaXRqb2JfZXJyb3IoaW50IHRyYW5zX2lkLCBjaGFyICpzdWJpZCwgY2hhciAqbXNndGV4dCkKLXsKLSAgICAvKgotICAgICAqIFNlbmQgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgZnJvbnQgZW5kCi0gICAgICovCi0gICAgcHJveHlfbXNnICptc2c7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgInBvc3Rfc3VibWl0am9iX2Vycm9yOiAlc1xuIiwgbXNndGV4dCk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgbXNnID0gcHJveHlfc3VibWl0am9iX2Vycm9yX2V2ZW50KHRyYW5zX2lkLCBzdWJpZCwgMCwgbXNndGV4dCk7Ci0gICAgZW5xdWV1ZV9ldmVudChtc2cpOwotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIEZ1bmN0aW9ucyB0byBzZW5kIGV2ZW50IG5vdGlmaWNhdGlvbnMgdG8gZnJvbnQgZW5kLiBUaGUgYXR0cmlidXRlcwotICogYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgYWxsb3dlZCBmb3IgZWFjaCBldmVudCBhcmUgZGVmaW5lZCBpbiBwcm94eV9ldmVudC5oCi0gKi8KLQotcHJveHlfbXNnICoKLXByb3h5X2F0dHJfZGVmX2ludF9saW1pdHNfZXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICppZCwKLQkJCQljaGFyICpuYW1lLCBjaGFyICpkZXNjLCBpbnQgZGlzcGxheSwgaW50IGRlZiwgaW50IGxsaW1pdCwKLQkJCQlpbnQgdWxpbWl0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotCi0gICAgbXNnID0gbmV3X3Byb3h5X21zZyhQUk9YWV9FVl9SVF9BVFRSX0RFRiwgdHJhbnNfaWQpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgMSk7Ci0gICAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCA4KTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGlkKTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csICJJTlRFR0VSIik7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBuYW1lKTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIGRlc2MpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgZGlzcGxheSk7Ci0gICAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCBkZWYpOwotICAgIHByb3h5X21zZ19hZGRfaW50KG1zZywgbGxpbWl0KTsKLSAgICBwcm94eV9tc2dfYWRkX2ludChtc2csIHVsaW1pdCk7Ci0gICAgcmV0dXJuIG1zZzsKLX0KLQotcHJveHlfbXNnICoKLXByb3h5X2F0dHJfZGVmX2xvbmdfaW50X2xpbWl0c19ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkLAotCQkJCSAgICAgY2hhciAqbmFtZSwgY2hhciAqZGVzYywgaW50IGRpc3BsYXksIGxvbmcgbG9uZyBkZWYsCi0JCQkJICAgICBsb25nIGxvbmcgbGxpbWl0LCBsb25nIGxvbmcgdWxpbWl0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgbnVtX3N0clsyMl07Ci0KLSAgICBtc2cgPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX0FUVFJfREVGLCB0cmFuc19pZCk7Ci0gICAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCAxKTsKLSAgICBwcm94eV9tc2dfYWRkX2ludChtc2csIDgpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgaWQpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgIkJJR0lOVEVHRVIiKTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIG5hbWUpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZGVzYyk7Ci0gICAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCBkaXNwbGF5KTsKLSAgICBzcHJpbnRmKG51bV9zdHIsICIlbGxkIiwgZGVmKTsKLSAgICBwcm94eV9tc2dfYWRkX3N0cmluZyhtc2csIG51bV9zdHIpOwotICAgIHNwcmludGYobnVtX3N0ciwgIiVsbGQiLCBsbGltaXQpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgbnVtX3N0cik7Ci0gICAgc3ByaW50ZihudW1fc3RyLCAiJWxsZCIsIHVsaW1pdCk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBudW1fc3RyKTsKLSAgICByZXR1cm4gbXNnOwotfQotCi1wcm94eV9tc2cgKgotcHJveHlfYXR0cl9kZWZfZW51bV9ldmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKmlkLAotCQkJICBjaGFyICpuYW1lLCBjaGFyICpkZXNjLCBpbnQgZGlzcGxheSwgY2hhciAqZGVmLCBpbnQgY291bnQpCi17Ci0gICAgcHJveHlfbXNnICptc2c7Ci0KLSAgICBtc2cgPSBuZXdfcHJveHlfbXNnKFBST1hZX0VWX1JUX0FUVFJfREVGLCB0cmFuc19pZCk7Ci0gICAgcHJveHlfbXNnX2FkZF9pbnQobXNnLCAxKTsKLSAgICBwcm94eV9tc2dfYWRkX2ludChtc2csIGNvdW50ICsgNik7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBpZCk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCAiRU5VTUVSQVRFRCIpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgbmFtZSk7Ci0gICAgcHJveHlfbXNnX2FkZF9zdHJpbmcobXNnLCBkZXNjKTsKLSAgICBwcm94eV9tc2dfYWRkX2ludChtc2csIGRpc3BsYXkpOwotICAgIHByb3h5X21zZ19hZGRfc3RyaW5nKG1zZywgZGVmKTsKLSAgICByZXR1cm4gbXNnOwotfQotCi12b2lkCi1zZW5kX25ld19ub2RlX2xpc3QoaW50IHRyYW5zX2lkLCBpbnQgbWFjaGluZV9pZCwgTGlzdCAqIG5ld19ub2RlcykKLXsKLSAgICBwcm94eV9tc2cgKm1zZzsKLSAgICBub2RlX3JlZmNvdW50ICpub2RlcmVmOwotICAgIGNoYXIgaWRfc3RyaW5nWzEyXTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbm9kZV9sb2NrKTsKLSAgICBTZXRMaXN0KG5ld19ub2Rlcyk7Ci0gICAgc3ByaW50ZihpZF9zdHJpbmcsICIlZCIsIG1hY2hpbmVfaWQpOwotICAgIG1zZyA9IHByb3h5X25ld19ub2RlX2V2ZW50KHRyYW5zX2lkLCBpZF9zdHJpbmcsIFNpemVPZkxpc3QobmV3X25vZGVzKSk7Ci0gICAgbm9kZXJlZiA9IEdldExpc3RFbGVtZW50KG5ld19ub2Rlcyk7Ci0gICAgd2hpbGUgKG5vZGVyZWYgIT0gTlVMTCkgewotCXNwcmludGYoaWRfc3RyaW5nLCAiJWQiLCBub2RlcmVmLT5wcm94eV9ub2RlaWQpOwotCXByb3h5X2FkZF9ub2RlKG1zZywgaWRfc3RyaW5nLCBub2RlcmVmLT5rZXksIE5PREVfU1RBVEVfVVAsIDApOwotCW5vZGVyZWYgPSBHZXRMaXN0RWxlbWVudChuZXdfbm9kZXMpOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbm9kZV9sb2NrKTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci19Ci0KLXZvaWQKLXNlbmRfam9iX3N0YXRlX2NoYW5nZV9ldmVudChpbnQgdHJhbnNfaWQsIGludCBwcm94eV9qb2JpZCwgY2hhciAqc3RhdGUpCi17Ci0gICAgcHJveHlfbXNnICptc2c7Ci0gICAgY2hhciBqb2JpZF9zdHJbMTJdOwotCi0gICAgc3ByaW50Zihqb2JpZF9zdHIsICIlZCIsIHByb3h5X2pvYmlkKTsKLSAgICBtc2cgPSBwcm94eV9qb2JfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCBqb2JpZF9zdHIsIDEpOwotICAgIHByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtc2csIEpPQl9TVEFURV9BVFRSLCBzdGF0ZSk7Ci0gICAgZW5xdWV1ZV9ldmVudChtc2cpOwotfQotCi12b2lkCi1zZW5kX3Byb2Nlc3Nfc3RhdGVfY2hhbmdlX2V2ZW50KGludCB0cmFuc19pZCwgam9iaW5mbyAqIGpvYiwgY2hhciAqc3RhdGUpCi17Ci0gICAgLyoKLSAgICAgKiBTZW5kIHN0YXRlIGNoYW5nZSBldmVudCBmb3IgYWxsIHByb2Nlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGpvYgotICAgICAqCi0gICAgICogRmluZCBlYWNoIHJhbmdlIG9mIGNvbnNlY3V0aXZlIHByb2Nlc3Mgb2JqZWN0IGlkcyBhbmQgc2VuZCBhCi0gICAgICogbm90aWZpY2F0aW9uIHRvIHRoZSBmcm9udCBlbmQgZm9yIHRoYXQgcmFuZ2Ugb2YgcHJvY2Vzc2VzLiBUaGlzCi0gICAgICogdXN1YWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2YgcHJvY2VzcyBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgc2VudAotICAgICAqIHRvIHRoZSBmcm9udCBlbmQuIEluIHRoZSBtb3N0IGNvbW1vbiBjYXNlLCB3aGVyZSBhIHNpbmdsZQotICAgICAqIGFwcGxpY2F0aW9uIHdhcyBzdGFydGVkIGJlZm9yZSB0aGUgbmV4dCBhcHBsaWNhdGlvbiB3YXMgc3RhcnRlZCwKLSAgICAgKiB0aGVyZSB3aWxsIG9ubHkgYmUgYSBzaW5nbGUgbWVzc2FnZS4gSWYgdHdvIGFwcGxpY2F0aW9uJ3MKLSAgICAgKiBzdGFydHVwIG92ZXJsYXBzLCB0aGVuIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvZiBjb25zZWN1dGl2ZQotICAgICAqIGlkcyBmb3IgcHJvY2Vzc2VzLCB0aGVuIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSBtYXkgYmUgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIHRhc2tpbmZvICp0YXNrczsKLSAgICB0YXNraW5mbyAqaW5mbzsKLSAgICBpbnQgdGFza19pbmRleDsKLSAgICBpbnQgc3RhcnRfdGFzazsKLSAgICBpbnQgbmV4dF90YXNrOwotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcmFuZ2VbMjVdOwotICAgIGludCBpOwotCi0gICAgdGFza3MgPSBqb2ItPnRhc2tzOwotICAgIGlmICh0YXNrcyA9PSBOVUxMKSB7Ci0JcmV0dXJuOwotICAgIH0KLSAgICB0YXNrX2luZGV4ID0gLTE7Ci0gICAgaW5mbyA9IHRhc2tzOwotICAgIGkgPSAwOwotICAgIHdoaWxlIChpIDwgam9iLT5udW10YXNrcykgewotCXRhc2tfaW5kZXggPSBpbmZvLT5wcm94eV90YXNraWQ7Ci0Jc3RhcnRfdGFzayA9IHRhc2tfaW5kZXg7Ci0JbmV4dF90YXNrID0gdGFza19pbmRleDsKLQkvKgotCSAqIExvb3AgYXMgbG9uZyBhcyB0aGUgcHJvY2VzcyBvYmplY3QgaWRzIGFyZSBjb25zZWN1dGl2ZSBhbmQKLQkgKiBub3QgZW5kIG9mIGxpc3QuCi0JICovCi0Jd2hpbGUgKHRhc2tfaW5kZXggPT0gbmV4dF90YXNrKSB7Ci0JICAgIGkgPSBpICsgMTsKLQkgICAgaW5mbyA9ICZ0YXNrc1tpXTsKLQkgICAgbmV4dF90YXNrID0gbmV4dF90YXNrICsgMTsKLQkgICAgaWYgKGkgPj0gam9iLT5udW10YXNrcykgewotCQlicmVhazsKLQkgICAgfQotCSAgICB0YXNrX2luZGV4ID0gaW5mby0+cHJveHlfdGFza2lkOwotCX0KLQlpZiAodGFza19pbmRleCAhPSAtMSkgewotCSAgICAvKgotCSAgICAgKiBHZW5lcmF0ZSBhIHByb2Nlc3Mgc3RhdGUgY2hhbmdlIGV2ZW50IGZvciBhIGNvbnNlY3V0aXZlCi0JICAgICAqIHJhbmdlIG9mIHByb2Nlc3MgaWQgb2JqZWN0cy4gbmV4dF90YXNrIHdpbGwgaGF2ZSBhIHZhbHVlCi0JICAgICAqIDEgbW9yZSB0aGFuIHRoZSBsYXN0IGNvbnNlY3V0aXZlIG9iamVjdCBpZC4KLQkgICAgICovCi0JICAgIHNucHJpbnRmKHJhbmdlLCBzaXplb2YgcmFuZ2UsICIlZC0lZCIsIHN0YXJ0X3Rhc2ssIG5leHRfdGFzayAtIDEpOwotCSAgICByYW5nZVtzaXplb2YgcmFuZ2UgLSAxXSA9ICdcMCc7Ci0JICAgIG1zZyA9IHByb3h5X3Byb2Nlc3NfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCByYW5nZSwgMSk7Ci0JICAgIHByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtc2csIFBST0NfU1RBVEVfQVRUUiwgc3RhdGUpOwotCSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci0JICAgIHRhc2tfaW5kZXggPSAtMTsKLQl9Ci0gICAgfQotfQotCi12b2lkCi1zZW5kX3Byb2Nlc3Nfc3RhdGVfb3V0cHV0X2V2ZW50KGludCB0cmFuc19pZCwgaW50IHByb2NpZCwgY2hhciAqb3V0cHV0KQotewotICAgIHByb3h5X21zZyAqbXNnOwotICAgIGNoYXIgcHJvY2lkX3N0clsxMl07Ci0KLSAgICBzcHJpbnRmKHByb2NpZF9zdHIsICIlZCIsIHByb2NpZCk7Ci0gICAgbXNnID0gcHJveHlfcHJvY2Vzc19jaGFuZ2VfZXZlbnQodHJhbnNfaWQsIHByb2NpZF9zdHIsIDEpOwotICAgIHByb3h5X21zZ19hZGRfa2V5dmFsX3N0cmluZyhtc2csIFBST0NfU1RET1VUX0FUVFIsIG91dHB1dCk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9ERVRBSUxfTUVTU0FHRSwgIlNlbnQgc3Rkb3V0OiAlc1xuIiwgb3V0cHV0KTsKLSAgICBlbnF1ZXVlX2V2ZW50KG1zZyk7Ci19Ci0KLWludAotZ2VuZXJhdGVfaWQoKQotewotICAgIHJldHVybiBiYXNlX2lkICsgbGFzdF9pZCsrOwotfQotCi12b2lkCi1lbnF1ZXVlX2V2ZW50KHByb3h5X21zZyAqIG1zZykKLXsKLSAgICBwcm94eV9zdnJfcXVldWVfbXNnKHBlX3Byb3h5LCBtc2cpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfdXNhZ2UoY2hhciAqcHJvZ25hbWUpCi17Ci0JcHJpbnRfbWVzc2FnZShGQVRBTF9NRVNTQUdFLAotCQkgICIlcyBbLS1wcm94eT1wcm94eV0gWy0taG9zdD1ob3N0X25hbWVdIFstLXBvcnQ9cG9ydF0gWy0tdXNlbG9hZGxldmVsZXI9eS9uXSBbLS10cmFjZT1sZXZlbF0gWy0tbGliX292ZXJyaWRlPWRpcmVjdG9yeV0gWy0tbXVsdGljbHVzdGVyPWR8bnx5XSBbLS10ZW1wbGF0ZV9vdmVycmlkZT1maWxlXSBbLS10ZW1wbGF0ZV93cml0ZT15fG5dIC0tbm9kZV9wb2xsaW5nX21pbj12YWx1ZSAtLW5vZGVfcG9sbGluZ19tYXg9dmFsdWUgLS1qb2JfcG9sbGluZz12YWx1ZVxuIiwKLQkJICAgcHJvZ25hbWUpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFByb3h5IHN0YXJ0dXAgYW5kIGNvbW1hbmQgbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGNoYXIgKmhvc3QgPSAibG9jYWxob3N0IjsKLSAgICBjaGFyICpwcm94eV9zdHIgPSBERUZBVUxUX1BST1hZOwotICAgIGludCBjaDsKLSAgICBpbnQgcG9ydCA9IFBST1hZX1RDUF9QT1JUOwotICAgIGludCByYzsKLSAgICBpbnQgZGVidWc7Ci0gICAgY2hhciAqY3A7Ci0KLSAgICBzdHJjcHkobWluaXByb3h5X3BhdGgsIGFyZ3ZbMF0pOwotICAgIGNwID0gc3RycmNocihtaW5pcHJveHlfcGF0aCwgJy8nKTsKLSAgICBpZiAoY3AgIT0gTlVMTCkgewotCXN0cmNweShjcCArIDEsICJwdHBfaWJtcGVfbWluaXByb3h5Iik7Ci0gICAgfQotICAgIGVsc2UgewotCXN0cmNweShtaW5pcHJveHlfcGF0aCwgIi4vcHRwX2libXBlX21pbmlwcm94eSIpOwotICAgIH0KLSNpZmRlZiBfX2xpbnV4X18KLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkQ6UDpwOmg6dDpsOm06bzpyOng6eTp6OkxTTSIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gLTEpIHsKLQlzd2l0Y2ggKGNoKSB7Ci0JICAgIGNhc2UgJ1AnOgotCQlwcm94eV9zdHIgPSBvcHRhcmc7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkJcG9ydCA9IGF0b2kob3B0YXJnKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ2gnOgotCQlob3N0ID0gb3B0YXJnOwotCQlicmVhazsKLQkgICAgY2FzZSAnTCc6Ci0JCXVzZV9sb2FkX2xldmVsZXIgPSAxOwotCQlicmVhazsKLQkgICAgY2FzZSAndCc6Ci0JCWlmIChzdHJjbXAob3B0YXJnLCAiRnVuY3Rpb24iKSA9PSAwKSB7Ci0JCSAgICBzdGF0ZV90cmFjZSA9IDE7Ci0JCSAgICBzdGF0ZV90cmFjZV9kZXRhaWwgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJEZXRhaWwiKSA9PSAwKSB7Ci0JCSAgICBzdGF0ZV90cmFjZSA9IDE7Ci0JCSAgICBzdGF0ZV90cmFjZV9kZXRhaWwgPSAxOwotCQkgICAgc3RhdGVfaW5mbyA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIk5vbmUiKSA9PSAwKSB7Ci0JCSAgICBzdGF0ZV90cmFjZSA9IDA7Ci0JCSAgICBzdGF0ZV90cmFjZV9kZXRhaWwgPSAwOwotCQl9Ci0JCWVsc2UgewotCQkgICAgcHJpbnRfbWVzc2FnZShGQVRBTF9NRVNTQUdFLCAiSW5jb3JyZWN0IHRyYWNlIGxldmVsICclcydcbiIsIG9wdGFyZyk7Ci0JCSAgICByZXR1cm4gMTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSAnRCc6Ci0JCWJyZWFrOwotCSAgICBjYXNlICdsJzoKLQkJdXNlcl9saWJwYXRoID0gc3RyZHVwKG9wdGFyZyk7CS8qIHVzZXIgaGFzIHNwZWNpZmllZCBvdmVycmlkZSBmdWxsIHBhdGggdG8gTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgKi8KLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ20nOgotCQlpZiAoc3RybmNtcChvcHRhcmcsICJ5IiwgMSkgPT0gMCkgewkvKiB5IC0gbXVsdGljbHVzdGVyIGZvcmNlZCBvbiAqLwotCQkgICAgbXVsdGljbHVzdGVyX3N0YXR1cyA9IDE7CS8qIGZvcmNlIG11bHRpY2x1c3RlciAqLwotCQl9Ci0JCWVsc2UgaWYgKHN0cm5jbXAob3B0YXJnLCAibiIsIDEpID09IDApIHsJLyogbiAtIG11bHRpY2x1c3RlciBmb3JjZWQgb2ZmICovCi0JCSAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gMDsJLyogZm9yY2UgbG9jYWwgKi8KLQkJfQotCQllbHNlIHsJCS8qIGQgLSBkZWZhdWx0IHRvIExvYWRMZXZlbGVyIGRldGVybWluZSBtdWx0aWNsdXN0ZXIgc3RhdGUgKi8KLQkJICAgIG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAtMTsJLyogYWxsb3cgTG9hZExldmVsZXIgdG8gZGV0ZXJtaW5lIG1vZGUgKi8KLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSAneCc6CQkvKiBtaW4gbm9kZSBwb2xsaW5nICovCi0JCW1pbl9ub2RlX3NsZWVwX3NlY29uZHMgPSBhdG9pKG9wdGFyZyk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICd5JzoJCS8qIG1heCBub2RlIHBvbGxpbmcgKi8KLQkJbWF4X25vZGVfc2xlZXBfc2Vjb25kcyA9IGF0b2kob3B0YXJnKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3onOgkJLyogam9iIHBvbGxpbmcgKi8KLQkJam9iX3NsZWVwX3NlY29uZHMgPSBhdG9pKG9wdGFyZyk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdTJzoKLQkJZGVidWcgPSAxOwotCQl3aGlsZSAoZGVidWcpIHsKLQkJICAgIHNsZWVwKDEpOwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlICdNJzoKLQkJcnVuX21pbmlwcm94eSA9IDE7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHByaW50X3VzYWdlKGFyZ3ZbMF0pOwotCQlleGl0KDEpOwotCX0KLSAgICB9Ci0jZWxzZQotICAgIC8qCi0gICAgICogQUlYIGRvZXMgbm90IGhhdmUgdGhlIGdldG9wdF9sb25nIGZ1bmN0aW9uLiBTaW5jZSB0aGUgcHJveHkgaXMKLSAgICAgKiBpbnZva2VkIG9ubHkgYnkgdGhlIFBUUCBmcm9udCBlbmQsIHRoZSBmb2xsb3dpbmcgc2ltcGxpZmllZCBvcHRpb25zCi0gICAgICogcGFyc2luZyBpcyBzdWZmaWNpZW50LgotICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgbWFpbnRhaW5lZCBpbiBzeW5jIHdpdGggdGhlIGFib3ZlCi0gICAgICogZ2V0b3B0X2xvbmcgbG9vcC4KLSAgICAgKi8KLSAgICBpbnQgbiA9IDE7Ci0gICAgd2hpbGUgKG4gPCBhcmdjKSB7Ci0JY3AgPSBzdHJjaHIoYXJndltuXSwgJz0nKTsKLQlpZiAoY3AgPT0gTlVMTCkgewotCSAgICBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXN1c3BlbmRfYXRfc3RhcnR1cCIpID09IDApIHsKLQkJZGVidWcgPSAxOwotCQl3aGlsZSAoZGVidWcpIHsKLQkJICAgIHNsZWVwKDEpOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXJ1bk1pbmlwcm94eSIpID09IDApIHsKLQkJcnVuX21pbmlwcm94eSA9IDE7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXVzZWxvYWRsZXZlbGVyIikgPT0gMCkgewotCQl1c2VfbG9hZF9sZXZlbGVyID0gMTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcHJpbnRfbWVzc2FnZShGQVRBTF9NRVNTQUdFLCAiSW52YWxpZCBhcmd1bWVudCAlcyAoJWQpXG4iLCBhcmd2W25dLCBuKTsKLSAgICAJCXByaW50X3VzYWdlKGFyZ3ZbMF0pOwotCQlleGl0KDEpOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICAqY3AgPSAnXDAnOwotCSAgICBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXByb3h5IikgPT0gMCkgewotCQlwcm94eV9zdHIgPSBjcCArIDE7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXBvcnQiKSA9PSAwKSB7Ci0JCXBvcnQgPSBhdG9pKGNwICsgMSk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLWhvc3QiKSA9PSAwKSB7Ci0JCWhvc3QgPSBjcCArIDE7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLXRyYWNlIikgPT0gMCkgewotCQlpZiAoc3RyY21wKGNwICsgMSwgIkZ1bmN0aW9uIikgPT0gMCkgewotCQkgICAgc3RhdGVfdHJhY2UgPSAxOwotCQkgICAgc3RhdGVfdHJhY2VfZGV0YWlsID0gMDsKLQkJfQotCQllbHNlIGlmIChzdHJjbXAoY3AgKyAxLCAiRGV0YWlsIikgPT0gMCkgewotCQkgICAgc3RhdGVfdHJhY2UgPSAxOwotCQkgICAgc3RhdGVfdHJhY2VfZGV0YWlsID0gMTsKLQkJICAgIHN0YXRlX2luZm8gPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChjcCArIDEsICJOb25lIikgPT0gMCkgewotCQkgICAgc3RhdGVfdHJhY2UgPSAwOwotCQkgICAgc3RhdGVfdHJhY2VfZGV0YWlsID0gMDsKLQkJfQotCQllbHNlIHsKLQkJICAgIHByaW50X21lc3NhZ2UoRkFUQUxfTUVTU0FHRSwgIkluY29ycmVjdCB0cmFjZSBsZXZlbCAnJXMnXG4iLCBhcmd2W24gKyAxXSk7Ci0JCSAgICByZXR1cm4gMTsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1saWItb3ZlcnJpZGUiKSA9PSAwKSB7Ci0JCXVzZXJfbGlicGF0aCA9IHN0cmR1cChjcCArIDEpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1tdWx0aWNsdXN0ZXIiKSA9PSAwKSB7Ci0JCWlmIChzdHJuY21wKGNwICsgMSwgInkiLCAxKSA9PSAwKSB7Ci0JCSAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gMTsKLQkJfQotCQllbHNlIGlmIChzdHJuY21wKGNwICsgMSwgIm4iLCAxKSA9PSAwKSB7Ci0JCSAgICBtdWx0aWNsdXN0ZXJfc3RhdHVzID0gMDsKLQkJfQotCQllbHNlIHsKLQkJICAgIG11bHRpY2x1c3Rlcl9zdGF0dXMgPSAtMTsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1ub2RlX3BvbGxpbmdfbWluIikgPT0gMCkgewotCQltaW5fbm9kZV9zbGVlcF9zZWNvbmRzID0gYXRvaShjcCArIDEpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1ub2RlX3BvbGxpbmdfbWF4IikgPT0gMCkgewotCQltYXhfbm9kZV9zbGVlcF9zZWNvbmRzID0gYXRvaShjcCArIDEpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W25dLCAiLS1qb2JfcG9sbGluZyIpID09IDApIHsKLQkJam9iX3NsZWVwX3NlY29uZHMgPSBhdG9pKGNwICsgMSk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbbl0sICItLWRlYnVnIikgPT0gMCkgewotCQkvKiBEbyBub3RoaW5nICovCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXByaW50X21lc3NhZ2UoRkFUQUxfTUVTU0FHRSwgIkludmFsaWQgYXJndW1lbnQgJXMgKCVkKVxuIiwgYXJndltuXSwgbik7Ci0JCXByaW50X3VzYWdlKGFyZ3ZbMF0pOwotCQlleGl0KDEpOwotCSAgICB9Ci0JfQotCW4gPSBuICsgMTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAodXNlX2xvYWRfbGV2ZWxlcikgewotCWlmIChmaW5kX2xvYWRfbGV2ZWxlcl9saWJyYXJ5KCkgIT0gMCkgewotCSAgICBleGl0KDEpOwotCX0KLSAgICB9Ci0gICAgcHRwX3NpZ25hbF9leGl0ID0gMDsKLSAgICBzaWduYWwoU0lHSU5ULCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotICAgIHNpZ25hbChTSUdJTEwsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0gICAgc2lnbmFsKFNJR1NFR1YsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0gICAgc2lnbmFsKFNJR1RFUk0sIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0gICAgc2lnbmFsKFNJR1FVSVQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0gICAgc2lnbmFsKFNJR0FCUlQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0gICAgcmMgPSBzZXJ2ZXIocHJveHlfc3RyLCBob3N0LCBwb3J0KTsKLSAgICBIYXNoRGVzdHJveShub2RlcywgaGFzaF9jbGVhbnVwKTsKLSAgICBleGl0KHJjKTsKLX0KLQotaW50Ci1maW5kX2xvYWRfbGV2ZWxlcl9saWJyYXJ5KCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiBGaW5kIHRoZSBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSB3ZSBhcmUgdXNpbmcgZm9yIEFJWCBvciBMaW51eC4gICAgKgotICAgICAqIElmIHdlIGNhbm5vdCBmaW5kIGl0IHRoZW4gTG9hZExldmVsZXIgaXMgbm90IGluc3RhbGxlZCBvciB3ZSBoYXZlICAgICAqCi0gICAgICogIGJlZW4gZGlyZWN0ZWQgdG8gdXNlIHRoZSB3cm9uZyBwYXRoLiAgSWYgd2UgZmluZCBpdCBPSyB0aGVuIHdlIHdpbGwgICoKLSAgICAgKiB0cnkgdG8gZHluYW1pYyBvcGVuIHRoZSBsaWJyYXJ5IGFuZCBjb21wYXJlIHZlcnNpb25zIGxhdGVyIGluIHRoZSAgICAgKgotICAgICAqIGNvbW1hbmRfaW5pdGlhbGl6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGxpYl9mb3VuZDsKLSAgICBpbnQgaTsKLSAgICBpbnQgc3RhdHVzOwotICAgIHN0cnVjdCBzdGF0IHN0YXRpbmZvOwotCi0gICAgaWYgKHVzZXJfbGlicGF0aCAhPSBOVUxMKSB7CS8qIGlmIHVzZXIgc3BlY2lmaWVkIGxpYiAqLwotCWlmIChzdHJsZW4odXNlcl9saWJwYXRoKSA+IDApIHsJLyogaWYgbm90IGEgbnVsbCBzdHJpbmcgKi8KLQkgICAgbGlicGF0aFswXSA9IHVzZXJfbGlicGF0aDsJLyogcGljayB1cCB1c2VyIHNwZWNpZmllZCBsaWJwYXRoCi0JCQkJCSAqIGFzIG9ubHkgb25lIHRvIGNoZWNrICovCi0JICAgIGxpYnBhdGhbMV0gPSAoY2hhciAqKSAtMTsJLyogbmV3IGVuZCBvZiBsaXN0ICovCi0JfQotICAgIH0KLQotICAgIGxpYl9mb3VuZCA9IDA7CQkvKiBwcmVzZXQgdG8gbm90IGZvdW5kICovCi0gICAgaSA9IDA7Ci0gICAgcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJTZWFyY2hpbmcgZm9yIExvYWRMZXZlbGVyIHNoYXJlZCBsaWJyYXJ5LlxuIik7Ci0gICAgd2hpbGUgKChsaWJwYXRoW2ldICE9IChjaGFyICopIC0xKSAmJiAobGliX2ZvdW5kID09IDApKSB7CS8qIGlmIG5vdCBlbmQgb2YgbGlzdCBhbmQgbm90IHlldCBmb3VuZCAqLwotCWlmIChsaWJwYXRoW2ldICE9IE5VTEwpIHsJLyogaWYgdmFsaWQgZW50cnkgKi8KLQkgICAgc3RyY3B5KGlibWxsX2xpYnBhdGhfbmFtZSwgbGlicGF0aFtpXSk7Ci0JICAgIHN0cmNhdChpYm1sbF9saWJwYXRoX25hbWUsICIvIik7Ci0JICAgIHN0cmNhdChpYm1sbF9saWJwYXRoX25hbWUsIGxpYm5hbWUpOwotCSAgICAvKiBzZWUgaWYgdGhpcyBpcyBhIHZhbGlkIExvYWRMZXZlbGVyIHNoYXJlZCBsaWJyYXJ5ICovCi0JICAgIHByaW50X21lc3NhZ2UoSU5GT19NRVNTQUdFLCAiVHJ5aW5nOiAlc1xuIiwgaWJtbGxfbGlicGF0aF9uYW1lKTsKLQkgICAgc3RhdHVzID0gc3RhdChpYm1sbF9saWJwYXRoX25hbWUsICZzdGF0aW5mbyk7Ci0JICAgIGlmIChzdGF0dXMgPT0gMCkgewotI2lmZGVmIF9BSVgKLQkJc3RyY2F0KGlibWxsX2xpYnBhdGhfbmFtZSwgIihzaHIubykiKTsKLSNlbmRpZgotCQlwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwKLQkJCSAgICAgICJTdWNjZXNzZnVsIHNlYXJjaDogRm91bmQgTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgJXNcbiIsCi0JCQkgICAgICBpYm1sbF9saWJwYXRoX25hbWUpOwotCQlsaWJfZm91bmQgPSAxOwkvKiB3ZSBmb3VuZCBpdCAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcHJpbnRfbWVzc2FnZShFUlJPUl9NRVNTQUdFLAotCQkJICAgICAgIlNlYXJjaCBmYWlsdXJlOiBcInN0YXRcIiBvZiBMb2FkTGV2ZWxlciBzaGFyZWQgbGlicmFyeSAlcyByZXR1cm5lZCBlcnJubz0lZC5cbiIsCi0JCQkgICAgICBpYm1sbF9saWJwYXRoX25hbWUsIGVycm5vKTsKLQkgICAgfQotCX0KLQlpKys7Ci0gICAgfQotCi0gICAgaWYgKGxpYl9mb3VuZCA9PSAwKSB7Ci0JcHJpbnRfbWVzc2FnZShGQVRBTF9NRVNTQUdFLCAiTm8gTG9hZExldmVsZXIgc2hhcmVkIGxpYnJhcnkgZm91bmQgLSBxdWl0dGluZy4uLlxuIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1zaHV0ZG93bl9wcm94eSh2b2lkKQotewotICAgIHJldHVybiAwOwotfQotCi1SRVRTSUdUWVBFCi1wdHBfc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKLXsKLSAgICBwdHBfc2lnbmFsX2V4aXQgPSBzaWc7Ci0gICAgaWYgKHNpZyA+PSAwICYmIHNpZyA8IE5TSUcpIHsKLQlSRVRTSUdUWVBFKCpzYXZlZF9zaWduYWwpIChpbnQpID0gc2F2ZWRfc2lnbmFsc1tzaWddOwotCWlmIChzYXZlZF9zaWduYWwgIT0gU0lHX0VSUiAmJiBzYXZlZF9zaWduYWwgIT0gU0lHX0lHTiAmJiBzYXZlZF9zaWduYWwgIT0gU0lHX0RGTCkgewotCSAgICBzYXZlZF9zaWduYWwoc2lnKTsKLQl9Ci0gICAgfQotfQotCi1pbnQKLXNlcnZlcihjaGFyICpuYW1lLCBjaGFyICpob3N0LCBpbnQgcG9ydCkKLXsKLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgdGhlIHByb3h5LCBjb25uZWN0IHRvIGZyb250IGVuZCwgdGhlbiBydW4gdGhlIG1haW4gbG9vcAotICAgICAqIHVudGlsIHRoZSBwcm94eSBpcyByZXF1ZXN0ZWQgdG8gc2h1dCBkb3duLgotICAgICAqLwotICAgIGNoYXIgKm1zZzE7Ci0gICAgY2hhciAqbXNnMjsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgMCwgMjAwMDAgfTsKLQotICAgIGpvYnMgPSBOZXdMaXN0KCk7Ci0gICAgaWYgKHByb3h5X3N2cl9pbml0KG5hbWUsICZ0aW1lb3V0LCAmaGVscGVyX2Z1bmNzLCAmY29tbWFuZF90YWIsICZwZV9wcm94eSkKLQkhPSBQUk9YWV9SRVNfT0spCi0JcmV0dXJuIDA7Ci0KLSAgICByYyA9IHByb3h5X3N2cl9jb25uZWN0KHBlX3Byb3h5LCBob3N0LCBwb3J0KTsKLSAgICBpZiAocmMgIT0gUFJPWFlfUkVTX09LKSB7Ci0JcHJpbnRfbWVzc2FnZShJTkZPX01FU1NBR0UsICJwcm94eV9jb25uZWN0IGZhaWxzIHdpdGggJWQgc3RhdHVzLlxuIiwgcmMpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBwcmludF9tZXNzYWdlKElORk9fTUVTU0FHRSwgIlJ1bm5pbmcgSUJNUEUgcHJveHkgdG8gaG9zdCAlcyB2aWEgcG9ydCAlZFxuIiwgaG9zdCwgcG9ydCk7Ci0KLSAgICB3aGlsZSAocHRwX3NpZ25hbF9leGl0ID09IDAgJiYgIXNodXRkb3duX3JlcXVlc3RlZCkgewotCWlmICgocHJveHlfc3ZyX3Byb2dyZXNzKHBlX3Byb3h5KSAhPSBQUk9YWV9SRVNfT0spKSB7Ci0JICAgIHByaW50X21lc3NhZ2UoVFJBQ0VfREVUQUlMX01FU1NBR0UsICJMb29wIGVuZGluZ1xuIik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICBpZiAocHRwX3NpZ25hbF9leGl0ICE9IDApIHsKLQlzd2l0Y2ggKHB0cF9zaWduYWxfZXhpdCkgewotCSAgICBjYXNlIFNJR0lOVDoKLQkJbXNnMSA9ICJJTlQiOwotCQltc2cyID0gIkludGVycnVwdCI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNJR0hVUDoKLQkJbXNnMSA9ICJIVVAiOwotCQltc2cyID0gIkhhbmd1cCI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNJR0lMTDoKLQkJbXNnMSA9ICJJTEwiOwotCQltc2cyID0gIklsbGVnYWwgSW5zdHJ1Y3Rpb24iOwotCQlicmVhazsKLQkgICAgY2FzZSBTSUdTRUdWOgotCQltc2cxID0gIlNFR1YiOwotCQltc2cyID0gIlNlZ21lbnRhdGlvbiBWaW9sYXRpb24iOwotCQlicmVhazsKLQkgICAgY2FzZSBTSUdURVJNOgotCQltc2cxID0gIlRFUk0iOwotCQltc2cyID0gIlRlcm1pbmF0aW9uIjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0lHUVVJVDoKLQkJbXNnMSA9ICJRVUlUIjsKLQkJbXNnMiA9ICJRdWl0IjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0lHQUJSVDoKLQkJbXNnMSA9ICJBQlJUIjsKLQkJbXNnMiA9ICJQcm9jZXNzIEFib3J0ZWQiOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJbXNnMSA9ICIqKipVTktOT1dOIFNJR05BTCoqKiI7Ci0JCW1zZzIgPSAiRVJST1IgLSBVTktOT1dOIFNJR05BTCI7Ci0JCWJyZWFrOwotCX0KLQlwcmludF9tZXNzYWdlKEZBVEFMX01FU1NBR0UsCi0JCSAgICAgICJwdHBfcGVfcHJveHkgcmVjZWl2ZWQgc2lnbmFsICVzICglcykgYW5kIGlzIGV4aXRpbmcuIiwgbXNnMSwgbXNnMik7Ci0Jc2h1dGRvd25fcHJveHkoKTsKLQkvKiBvdXIgcmV0dXJuIGNvZGUgPSB0aGUgc2lnbmFsIHRoYXQgZmlyZWQgKi8KLQlyYyA9IHB0cF9zaWduYWxfZXhpdDsKLSAgICB9Ci0gICAgRGVzdHJveUxpc3Qoam9icywgTlVMTCk7Ci0gICAgcHJveHlfc3ZyX2ZpbmlzaChwZV9wcm94eSk7Ci0gICAgcHJpbnRfbWVzc2FnZShUUkFDRV9ERVRBSUxfTUVTU0FHRSwgInByb3h5X3N2cl9maW5pc2ggcmV0dXJuZWQuXG4iKTsKLQotICAgIHJldHVybiByYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFByaW50IG1lc3NhZ2UgKHdpdGggdGltZSBhbmQgZGF0ZSBhbmQgdGhyZWFkIGlkKSAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBJbmZvLCBUcmFjZSwgQXJnIGFuZCBXYXJuaW5nIG1lc3NhZ2VzIGdvIHRvIHN0ZG91dC4gICAgICAgICAgICAgICAgICAgKgotICogRXJyb3IgYW5kIEZhdGFsIG1lc3NhZ2VzIGdvIHRvIHN0ZGVyci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotcHJpbnRfbWVzc2FnZShpbnQgdHlwZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBjaGFyIHRpbWVidWZbMjBdOwotICAgIHRpbWVfdCBteV9jbG9jazsKLSAgICBzdHJ1Y3QgdG0gYV90bTsKLSAgICBpbnQgdGhyZWFkX2lkID0gMDsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcHJpbnRfbWVzc2FnZV9sb2NrKTsKLSAgICBwdGhyZWFkX3QgdGlkID0gcHRocmVhZF9zZWxmKCk7CS8qIHdoYXQgdGhyZWFkIGFtIEkgPyAqLwotICAgIGZvciAodGhyZWFkX2lkID0gMDsgdGhyZWFkX2lkIDwgKHNpemVvZih0aHJlYWRfbWFwX3RhYmxlKQotCQkJCSAgICAgLyBzaXplb2YocHRocmVhZF90KSk7IHRocmVhZF9pZCsrKSB7Ci0JaWYgKHRpZCA9PSB0aHJlYWRfbWFwX3RhYmxlW3RocmVhZF9pZF0pIHsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICB0aW1lKCZteV9jbG9jayk7CQkvKiB3aGF0IHRpbWUgaXMgaXQgPyAqLwotICAgIGxvY2FsdGltZV9yKCZteV9jbG9jaywgJmFfdG0pOwotICAgIHN0cmZ0aW1lKCZ0aW1lYnVmWzBdLCAxNSwgIiVtLyVkICUwMkg6JTAyTTolMDJTIiwgJmFfdG0pOwotCi0gICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJTkZPX01FU1NBR0U6Ci0JICAgIGlmIChzdGF0ZV9pbmZvID09IDEpIHsJLyogaWYgaW5mbyBtZXNzYWdlcyBhbGxvd2VkICovCi0JCWlmIChzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlICE9IDApIHsKLQkJICAgIGZwcmludGYoc3Rkb3V0LCAiJXMgIiwgdGltZWJ1Zik7Ci0JCX0KLQkJaWYgKHN0YXRlX21lc3NhZ2VfdGhyZWFkaWQgIT0gMCkgewotCQkgICAgZnByaW50ZihzdGRvdXQsICJUKCVkKSAiLCB0aHJlYWRfaWQpOwotCQl9Ci0JCWZwcmludGYoc3Rkb3V0LCAiSW5mbzogIik7Ci0JCXZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci0JCWZmbHVzaChzdGRvdXQpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgVFJBQ0VfTUVTU0FHRToKLQkgICAgaWYgKHN0YXRlX3RyYWNlID09IDEpIHsJLyogaWYgdHJhY2UgbWVzc2FnZXMgYWxsb3dlZCAqLwotCQlpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZG91dCwgIiVzICIsIHRpbWVidWYpOwotCQl9Ci0JCWlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLQkJICAgIGZwcmludGYoc3Rkb3V0LCAiVCglZCkgIiwgdGhyZWFkX2lkKTsKLQkJfQotCQlmcHJpbnRmKHN0ZG91dCwgIlRyYWNlOiAiKTsKLQkJdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBUUkFDRV9ERVRBSUxfTUVTU0FHRToKLQkgICAgaWYgKHN0YXRlX3RyYWNlX2RldGFpbCA9PSAxKSB7CS8qIGlmIHRyYWNlIG1lc3NhZ2VzIGFsbG93ZWQgKi8KLQkJaWYgKHN0YXRlX21lc3NhZ2VfdGltZWRhdGUgIT0gMCkgewotCQkgICAgZnByaW50ZihzdGRvdXQsICIlcyAiLCB0aW1lYnVmKTsKLQkJfQotCQlpZiAoc3RhdGVfbWVzc2FnZV90aHJlYWRpZCAhPSAwKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZG91dCwgIlQoJWQpICIsIHRocmVhZF9pZCk7Ci0JCX0KLQkJZnByaW50ZihzdGRvdXQsICJUcmFjZTogIik7Ci0JCXZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci0JCWZmbHVzaChzdGRvdXQpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgV0FSTklOR19NRVNTQUdFOgotCSAgICBpZiAoc3RhdGVfd2FybmluZyA9PSAxKSB7CS8qIGlmIHdhcm5pbmcgbWVzc2FnZXMgYWxsb3dlZCAqLwotCQlpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZG91dCwgIiVzICIsIHRpbWVidWYpOwotCQl9Ci0JCWlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLQkJICAgIGZwcmludGYoc3Rkb3V0LCAiVCglZCkgIiwgdGhyZWFkX2lkKTsKLQkJfQotCQlmcHJpbnRmKHN0ZG91dCwgIldhcm5pbmc6ICIpOwotCQl2ZnByaW50ZihzdGRvdXQsIGZvcm1hdCwgYXApOwotCQlmZmx1c2goc3Rkb3V0KTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIEVSUk9SX01FU1NBR0U6Ci0JICAgIGlmIChzdGF0ZV9lcnJvciA9PSAxKSB7CS8qIGlmIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQgKi8KLQkJaWYgKHN0YXRlX21lc3NhZ2VfdGltZWRhdGUgIT0gMCkgewotCQkgICAgZnByaW50ZihzdGRlcnIsICIlcyAiLCB0aW1lYnVmKTsKLQkJfQotCQlpZiAoc3RhdGVfbWVzc2FnZV90aHJlYWRpZCAhPSAwKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwgIlQoJWQpICIsIHRocmVhZF9pZCk7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogIik7Ci0JCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcCk7Ci0JCWZmbHVzaChzdGRlcnIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgRkFUQUxfTUVTU0FHRToJLyogZmF0YWwgbWVzc2FnZXMgYXJlIG5ldmVyIHN1cHByZXNzZWQgKi8KLQkgICAgaWYgKHN0YXRlX2Vycm9yID09IDEpIHsJLyogaWYgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCAqLwotCQlpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICIsIHRpbWVidWYpOwotCQl9Ci0JCWlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLQkJICAgIGZwcmludGYoc3RkZXJyLCAiVCglZCkgIiwgdGhyZWFkX2lkKTsKLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIkZhdGFsOiAiKTsKLQkJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFwKTsKLQkJZmZsdXNoKHN0ZGVycik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBBUkdTX01FU1NBR0U6Ci0JICAgIGlmIChzdGF0ZV9hcmdzID09IDEpIHsJLyogaWYgZm9ybWF0dGVkIGFyZyBtZXNzYWdlcyBhcmUgYWxsb3dlZCAqLwotCQlpZiAoc3RhdGVfbWVzc2FnZV90aW1lZGF0ZSAhPSAwKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZG91dCwgIiVzICIsIHRpbWVidWYpOwotCQl9Ci0JCWlmIChzdGF0ZV9tZXNzYWdlX3RocmVhZGlkICE9IDApIHsKLQkJICAgIGZwcmludGYoc3Rkb3V0LCAiVCglZCkgIiwgdGhyZWFkX2lkKTsKLQkJfQotCQlmcHJpbnRmKHN0ZG91dCwgIkFyZ3M6ICIpOwotCQl2ZnByaW50ZihzdGRvdXQsIGZvcm1hdCwgYXApOwotCQlmcHJpbnRmKHN0ZG91dCwgIlxuIik7Ci0JCWZmbHVzaChzdGRvdXQpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6CQkvKiB1bmtub3duIG1lc3NhZ2UgdHlwZSAtIGFsbG93IGl0ICovCi0JICAgIGlmIChzdGF0ZV9tZXNzYWdlX3RpbWVkYXRlICE9IDApIHsKLQkJZnByaW50ZihzdGRvdXQsICIlcyAiLCB0aW1lYnVmKTsKLQkgICAgfQotCSAgICBpZiAoc3RhdGVfbWVzc2FnZV90aHJlYWRpZCAhPSAwKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAiVCglZCkgIiwgdGhyZWFkX2lkKTsKLQkgICAgfQotCSAgICBmcHJpbnRmKHN0ZG91dCwgIjogIik7Ci0JICAgIHZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci0JICAgIGZmbHVzaChzdGRvdXQpOwotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICB2YV9lbmQoYXApOwotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnByaW50X21lc3NhZ2VfbG9jayk7Ci19Ci0KLXZvaWQKLXByaW50X21lc3NhZ2VfYXJncyhpbnQgYXJnYywgY2hhciAqb3B0aW9uYWxfYXJnc1tdKQotewotICAgIGludCBpOwotICAgIGlmIChvcHRpb25hbF9hcmdzICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGFyZ2MgPCAwKSB7Ci0gICAgICAgIAlhcmdjID0gMDsKLSAgICAgICAgCXdoaWxlIChvcHRpb25hbF9hcmdzW2FyZ2NdICE9IE5VTEwpCi0gICAgICAgIAkJKythcmdjOwotICAgICAgICB9Ci0JZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotCSAgICBwcmludF9tZXNzYWdlKFRSQUNFX01FU1NBR0UsICIgJyVzJ1xuIiwgb3B0aW9uYWxfYXJnc1tpXSk7Ci0JfQotICAgIH0KLX0KLQotLyoKLSAqIFRoaXMgc291cmNlIGZpbGUgZm9ybWF0dGVkIHVzaW5nIGZvbGxvd2luZyBpbmRlbnQgb3B0aW9ucwotICogLWJhcAotICogLWJiYgotICogLWJyCi0gKiAtYnJzCi0gKiAtY2xpNAotICogLWk0Ci0gKiAtbDgwCi0gKiAtbHAKLSAqIC10czgKLSAqIC1ibGk0Ci0gKiAtbnBjcwotICovCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IyMDliYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2RlZWFlZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4xLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLmxhdW5jaCwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS5wcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkYzM0ZjcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OGZhZmIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIElCTSBQYXJhbGxlbCBFbnZpcm9ubWVudCBVSQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmM5NDQ5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPCEtLSBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgLS0+Ci08IS0tIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgIC0tPgotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAtLT4KLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5ybVByZWZlcmVuY2VzUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLnByZWZlcmVuY2VzLlBFUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLmlibXBlLnVpLnByZWZlcmVuY2VzLlBFUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJQYXJhbGxlbCBFbnZpcm9ubWVudCI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAudWkucm1Db25maWd1cmF0aW9ucyI+Ci0gICAgICA8Y29uZmlndXJhdGlvbldpemFyZAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2l6YXJkcy5QRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuaWJtcGUudWkuY29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaC5ybUxhdW5jaENvbmZpZ3VyYXRpb25zIj4KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS5ybUxhdW5jaENvbmZpZ3VyYXRpb24uUEVSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5pYm1wZS51aS5sYXVuY2hDb25maWd1cmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS9BY3RpdmF0b3IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjRmMTQ2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLlBFUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlQRVByZWZlcmVuY2VNYW5hZ2VyLmluaXRpYWxpemVQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL2ludGVybmFsL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiM2I4MDQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gCi0gKiBUaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNiAKLSAqIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotICogb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzIAotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRSAKLSAqIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZCAKLSAqIHRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsIAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICogCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBMQS1DQyAwNC0xMTUKLSAqICAKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL2ludGVybmFsL3VpL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4ZDc1YjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvaW50ZXJuYWwvdWkvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5uYW1lPVBFIENvbmZpZ3VyYXRpb24gV2l6YXJkIFBhZ2UKLVBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UudGl0bGU9UEUgQ29uZmlndXJhdGlvbiBXaXphcmQgUGFnZQotUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5kZXNjcmlwdGlvbj1QRSBDb25maWd1cmF0aW9uIFdpemFyZCBQYWdlCi0KLSNQRVByZWZlcmVuY2VzUGFnZQotUEVQcmVmZXJlbmNlc1BhZ2UuZ3JvdXBfUEVkPVBhcmFsbGVsIEVudmlyb25tZW50IEVudmlyb25tZW50IERhZW1vbgotUEVQcmVmZXJlbmNlc1BhZ2UuUEVkRmlsZV90ZXh0PVBFZCBmaWxlOgotUEVQcmVmZXJlbmNlc1BhZ2UuU2VsZWN0X1BFZF9GSUxFPVNlbGVjdCBQRWQgZmlsZQotUEVQcmVmZXJlbmNlc1BhZ2UuSW5jb3JyZWN0X1BFZF9maWxlPUludmFsaWQgUEUgZGFlbW9uIGZpbGUKLVBFUHJlZmVyZW5jZXNQYWdlLlBFZEFyZ3NfdGV4dD1QRWQgYXJndW1lbnRzOgotUEVQcmVmZXJlbmNlc1BhZ2UuUEVkRnVsbF90ZXh0PVBFZCBydW4gY29tbWFuZDoKLVBFUHJlZmVyZW5jZXNQYWdlLmdyb3VwX3Byb3h5PVBhcmFsbGVsIEVudmlyb25tZW50IFBUUCBQcm94eSBTZXJ2ZXIKLVBFUHJlZmVyZW5jZXNQYWdlLlBFU2VydmVyX3RleHQ9UEV8UFRQIHByb3h5IHNlcnZlciBmaWxlOgotUEVQcmVmZXJlbmNlc1BhZ2UuU2VsZWN0X1BFX1BST1hZX0ZJTEU9U2VsZWN0IFBFfFBUUCBQcm94eSBzZXJ2ZXIgZmlsZQotUEVQcmVmZXJlbmNlc1BhZ2UuSW5jb3JyZWN0X3NlcnZlcl9maWxlPUludmFsaWQgUEV8UFRQIHByb3h5IHNlcnZlciBmaWxlCi1QRVByZWZlcmVuY2VzUGFnZS5tYW51YWw9TGF1bmNoIFBFIHNlcnZlciBtYW51YWxseQotUEVQcmVmZXJlbmNlc1BhZ2UuYnJvd3NlQnV0dG9uPUJyb3dzZQotCi1UYXNrc1RhYi50aXRsZT1UYXNrcwotSU9UYWIudGl0bGU9SS9PCi1ESUFHVGFiLnRpdGxlPURpYWdub3N0aWNzCi1ERUJVR1RhYi50aXRsZT1EZWJ1ZwotU1lTVGFiLnRpdGxlPVN5c3RlbQotTk9ERVRhYi50aXRsZT1Ob2RlcwotUEVSRlRhYjEudGl0bGU9UGVyZm9ybWFuY2UgMQotUEVSRlRhYjIudGl0bGU9UGVyZm9ybWFuY2UgMgotUk1UYWIudGl0bGU9T3RoZXIgUk0KLU1JU0NUYWIudGl0bGU9TWlzY2VsbGFuZW91cwotCi1QRUxhdW5jaC5icm93c2U9QnJvd3NlCi1QRUxhdW5jaC5iYXNpY01vZGU9QmFzaWMgTW9kZQotUEVMYXVuY2guZW52U2NyaXB0PVBFIEVudmlyb25tZW50IFNjcmlwdAotCi1GaWxlLm1wSU9Ob2RlRmlsZVRpdGxlPVNlbGVjdCBwYXRoIGZvciBJL08gbm9kZSBsaXN0Ci1GaWxlLnBlU3RkaW5QYXRoVGl0bGU9U2VsZWN0IHBhdGggZm9yIGFwcGxpY2F0aW9uJ3Mgc3RkaW4gZmlsZQotRmlsZS5wZVN0ZG91dFBhdGhUaXRsZT1TZWxlY3QgcGF0aCBmb3IgYXBwbGljYXRpb24ncyBzdGRvdXQgZmlsZQotRmlsZS5wZVN0ZGVyclBhdGhUaXRsZT1TZWxlY3QgcGF0aCBmb3IgYXBwbGljYXRpb24ncyBzdGRlcnIgZmlsZQotRmlsZS5tcENvcmVkaXJUaXRsZT1TZWxlY3QgZGlyZWN0b3J5IGZvciBQRSBhcHBsaWNhdGlvbiBjb3JlIGZpbGVzCi1GaWxlLm1wQ21kZmlsZVRpdGxlPVNlbGVjdCBwYXRoIGZvciBQRSBjb21tYW5kIGZpbGUKLUZpbGUubXBIb3N0ZmlsZVRpdGxlPVNlbGVjdCBwYXRoIGZvciBQRSBob3N0IGxpc3QgZmlsZQotRmlsZS5tcFJlbW90ZWRpclRpdGxlPVNlbGVjdCBQRSByZW1vdGUgZGlyZWN0b3J5Ci1GaWxlLm1wTExGaWxlVGl0bGU9U2VsZWN0IHBhdGggZm9yIExvYWRMZXZlbGVyIGNvbW1hbmQgZmlsZQotRmlsZS5tcFNhdmVIb3N0RmlsZVRpdGxlPVNlbGVjdCBwYXRoIGZvciBzYXZlZCBob3N0IGxpc3QgZmlsZQotRmlsZS5tcFNhdmVMTEZpbGVUaXRsZT1TZWxlY3QgcGF0aCBmb3Igc2F2ZWQgTG9hZExldmVsZXIgY29tbWFuZCBmaWxlCi1GaWxlLm1wRXVpbGliUGF0aFRpdGxlPVNlbGVjdCBwYXRoIGZvciBNUEkgY29tbXVuaWNhdGlvbnMgbGlicmFyeQotRmlsZS5wZVJNTGliVGl0bGU9U2VsZWN0IHBhdGggZm9yIGFsdGVybmF0ZSByZXNvdXJjZSBtYW5hZ2VyIGxpYnJhcnkKLUZpbGUucGVFbnZTY3JpcHRUaXRsZT1TZWxlY3QgcGF0aCBmb3IgUEUgZW52aXJvbm1lbnQgc2V0dXAgc2NyaXB0Ci1GaWxlLm1wUHJvZkRpclRpdGxlPVNlbGVjdCBkaXJlY3RvcnkgZm9yIEdNT04gZGF0YSBmaWxlcwotRmlsZS5tcFByaW9yaXR5TG9nRGlyVGl0bGU9U2VsZWN0IGRpcmVjdG9yeSBmb3IgcHJpb3JpdHkgbG9nCi1GaWxlLm1wUHJpb3JpdHlMb2dOYW1lVGl0bGU9U3BlY2lmeSBwYXRoIGZvciBwcmlvcml0eSBsb2cKLUZpbGUubXBDa3B0RGlyVGl0bGU9U3BlY2lmeSBwYXRoIGZvciBjaGVja3BvaW50IGRpcmVjdG9yeQotRmlsZS5tcENrcGZGaWxlVGl0bGU9U3BlY2lmeSBwYXRobmFtZSBmb3IgY2hlY2twb2ludCBmaWxlCi1GaWxlLm1wUE1ETG9nRGlyVGl0bGU9U3BlY2lmeSBwYXRoIGZvciBQTUQgbG9nIGRpcmVjdG9yeQotCi1JbnZhbGlkLm1wSU9CdWZmZXJTaXplPU1QSSBJL08gQnVmZmVyIHNpemUgbXVzdCBiZSBudW1lcmljIGluIHJhbmdlIDAtMTI4TS4KLUludmFsaWQubXBJT05vZGVGaWxlPU1QSSBJL08gTm9kZSBMaXN0IG11c3Qgc3BlY2lmeSBhIHJlYWRhYmxlIGZpbGUuCi1JbnZhbGlkLm1wU3RkaW5Nb2RlPVNURElOIG1vZGUgbXVzdCBiZSAnYWxsJywgJ25vbmUnIG9yIHZhbGlkIHRhc2tpZC4KLUludmFsaWQubXBTdGRvdXRNb2RlPVNURE9VVCBtb2RlIG11c3QgYmUgJ29yZGVyZWQnLCAndW5vcmRlcmVkJyBvciB2YWxpZCB0YXNraWQuCi1JbnZhbGlkLnBlU3RkaW5QYXRoPVN0ZGluIHBhdGggbXVzdCBzcGVjaWZ5IGEgcmVhZGFibGUgZmlsZS4KLUludmFsaWQucGVTdGRvdXRQYXRoPVN0ZG91dCBwYXRoIG11c3Qgc3BlY2lmeSBhIHdyaXRhYmxlIGZpbGUuCi1JbnZhbGlkLnBlU3RkZXJyUGF0aD1TdGRlcnIgcGF0aCBtdXN0IHNwZWNpZnkgYSB3cml0YWJsZSBmaWxlLiAKLUludmFsaWQubXBQcmludEVudj1QcmludCBFbnZpcm9ubWVudCBtdXN0IGJlICd5ZXMnLCAnbm8nLCBvciBwYXRobmFtZSBvZiBhIHNjcmlwdCBmaWxlLgotSW52YWxpZC5tcENvcmVEaXI9Q29yZWZpbGUgRGlyZWN0b3J5IG11c3Qgc3BlY2lmeSBhIHZhbGlkIGRpcmVjdG9yeSBuYW1lLgotSW52YWxpZC5tcFByb2ZEaXI9R01PTiBEaXJlY3RvcnkgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgZGlyZWN0b3J5IG5hbWUuCi1JbnZhbGlkLm1wSW5zdGFuY2VzPSJXaW5kb3cgb3IgSVAgSW5zdGFuY2VzIG11c3QgYmUgJ21heCcgb3IgbnVtYmVyID4gMC4KLUludmFsaWQubXBDbWRGaWxlPUNvbW1hbmQgRmlsZSBtdXN0IHNwZWNpZnkgYSByZWFkYWJsZSBmaWxlLgotSW52YWxpZC5tcEhvc3RGaWxlPUhvc3QgTGlzdCBGaWxlIG11c3Qgc3BlY2lmeSBhIHJlYWRhYmxlIGZpbGUuCi1JbnZhbGlkLm1wTExGaWxlPUpvYiBDb21tYW5kIEZpbGUgbXVzdCBzcGVjaWZ5IGEgcmVhZGFibGUgZmlsZS4KLUludmFsaWQubXBOb2Rlcz1OdW1iZXIgb2YgTm9kZXMgbXVzdCBiZSBhIG51bWJlciA+IHplcm8uCi1JbnZhbGlkLm1wUHJvY3M9TnVtYmVyIG9mIFRhc2tzIG11c3QgYmUgYSBudW1iZXIgPiB6ZXJvLgotSW52YWxpZC5tcFJlbW90ZURpcj1SZW1vdGUgRGlyZWN0b3J5IENvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgcmVhZGFibGUgZmlsZS4KLUludmFsaWQubXBSZXRyeT1Ob2RlIFJldHJ5IEludGVydmFsIG11c3QgYmUgJ3dhaXQnIG9yIGEgbnVtYmVyID4gemVyby4KLUludmFsaWQubXBSZXRyeUNvdW50PU5vZGUgUmV0cnkgQ291bnQgbXVzdCBiZSBhIG51bWJlciA+IHplcm8uCi1JbnZhbGlkLm1wVGFza3NQZXJOb2RlPVRhc2tzIHBlciBOb2RlIG11c3QgYmUgYSBudW1iZXIgPiB6ZXJvLgotSW52YWxpZC5tcEFja1RocmVzaD1BY2tub3dsZWRnbWVudCBUaHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDMxLgotSW52YWxpZC5tcFBvbGxpbmdJbnRlcnZhbD1NUEkgUG9sbGluZyBpbnRlcnZhbCBtdXN0IGJlIGEgbnVtYmVyID4gMC4KLUludmFsaWQucGVSRE1BQ291bnQ9TnVtYmVyIG9mIHJDdHggQmxvY2tzIG11c3QgYmUgYSBudW1iZXIgb3IgbnVtYmVyIHBhaXIgPiAwLgotSW52YWxpZC5wZVJETUFDb3VudFBhaXI9TnVtYmVyIG9mIHJDdHggQmxvY2tzIGNhbm5vdCBzcGVjaWZ5IHNlY29uZCB2YWx1ZSB3aXRob3V0IHNwZWNpZnlpbmcgZmlyc3QgdmFsdWUuCi1JbnZhbGlkLm1wVURQUGFja2V0U2l6ZT1VRFAgUGFja2V0IFNpemUgbXVzdCBiZSBhIG51bWJlciA+IDAuCi1JbnZhbGlkLm1wQnVsa01pbk1zZ1NpemU9TWluaW11bSBCdWxrIE1lc3NhZ2UgU2l6ZSBtdXN0IGJlIGEgbnVtYmVyID4gMC4gCi1JbnZhbGlkLnBlQnVmZmVyTWVtPUJ1ZmZlciBNZW1vcnkgbXVzdCBiZSBhIG51bWJlciBvciBudW1iZXIgPiAwLgotSW52YWxpZC5wZUJ1ZmZlck1lbTI9QnVmZmVyIE1lbW9yeSBtdXN0IGJlIGEgbnVtYmVyIG9yIG51bWJlciA+IDAuCi1JbnZhbGlkLm1wTXNnRW52ZWxvcGVCdWY9RW52ZWxvcGUgQnVmZmVyIFNpemUgbXVzdCBiZSBhIG51bWJlciA+PSAxLDAwMCwwMDAuCi1JbnZhbGlkLm1wRWFnZXJMaW1pdD1NZXNzYWdlIFNpemUgVGhyZXNob2xkIG11c3QgYmUgYSBudW1iZXIgPiAwLgotSW52YWxpZC5tcFJldHJhbnNtaXRJbnRlcnZhbD1NUEkgUmV0cmFuc21pdCBJbnRlcnZhbCBtdXN0IGJlIGEgbnVtYmVyID49IDEwMDAuCi1JbnZhbGlkLm1wUmV4bWl0QnVmQ250PVJldHJhbnNtaXQgQnVmZmVycyBtdXN0IGJlIGEgbnVtYmVyID4gMC4KLUludmFsaWQubXBSZXhtaXRCdWZTaXplPU1heGltdW0gTEFQSSBCdWZmZXJlZCBNZXNzYWdlIG11c3QgYmUgYSBudW1iZXIgPiAwLgotSW52YWxpZC5tcFJNTGliPVJlc291cmNlIE1hbmFnZXIgTGlicmFyeSBtdXN0IHNwZWNpZnkgYSByZWFkYWJsZSBmaWxlLgotSW52YWxpZC5tcEV1aUxpYlBhdGg9TGlicmFyeSBQYXRoIG11c3Qgc3BlY2lmeSBhIHJlYWRhYmxlIGZpbGUuCi1JbnZhbGlkLm1wUHVsc2U9UHVsc2UgSW50ZXJ2YWwgbXVzdCBiZSBhIG51bWJlciA+IDAuCi1JbnZhbGlkLm1wVGhyZWFkU3RhY2tTaXplPU1QSSBUaHJlYWQgU3RhY2sgU2l6ZSBtdXN0IGJlIGEgbnVtYmVyID4gMC4KLUludmFsaWQubXBUaW1lb3V0PUNvbm5lY3Rpb24gVGltZW91dCBtdXN0IGJlIGEgbnVtYmVyID4gMC4KLUludmFsaWQubXBTYXZlTExGaWxlPVNhdmUgSm9iIENvbW1hbmQgRmlsZSBtdXN0IHNwZWNpZnkgYSB3cml0YWJsZSBmaWxlLgotSW52YWxpZC5tcFNhdmVIb3N0RmlsZT1TYXZlIEhvc3RsaXN0IEZpbGUgbXVzdCBzcGVjaWZ5IGEgd3JpdGFibGUgZmlsZS4KLUludmFsaWQucGVFbnZTY3JpcHQ9RW52aXJvbm1lbnQgU2V0dXAgU2NyaXB0IG11c3Qgc3BlY2lmeSBhIHJlYWRhYmxlIGZpbGUuCi1JbnZhbGlkLm1wUHJpb3JpdHlMb2dEaXI9UHJpb3JpdHkgTG9nIERpcmVjdG9yeSBtdXN0IHNwZWNpZnkgYSB2YWxpZCBkaXJlY3RvcnkgbmFtZS4KLUludmFsaWQubXBQcmlvcml0eUxvZ05hbWU9UHJpb3JpdHkgTG9nIE5hbWUgbXVzdCBzcGVjaWZ5IGEgd3JpdGFibGUgZmlsZS4KLUludmFsaWQubXBDb3JlZmlsZUZvcm1hdD1Db3JlZmlsZSBGb3JtYXQgbXVzdCBiZSAnc3RhbmRhcmQnLCAnU1RERVJSJyBvciBwYXRobmFtZSBvZiBsaWdodHdlaWdodCBjb3JlIGZpbGUuCi1JbnZhbGlkLnJlbW90ZUNvbm5lY3Rpb25FcnJvcj1FcnJvciBpbiByZW1vdGUgY29ubmVjdGlvbjoKLUludmFsaWQuZGlzYWxsb3dlZEVudlZhcj1QRSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2Fubm90IGJlIHNldCBpbiBlbnZpcm9ubWVudCB0YWIgaW4gYmFzaWMgbW9kZS4KLUludmFsaWQuZGlzYWxsb3dlZE9wdGlvbj1QRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIGJhc2ljIG1vZGUuCi0KLVBFRGlhbG9ncy5JbnZvY2F0aW9uT3B0aW9uc1RpdGxlPVBFIFByb3h5IEludm9jYXRpb24gT3B0aW9ucwotUEVEaWFsb2dzLkludm9jYXRpb25PcHRpb25zPVNwZWNpZnkgaW52b2NhdGlvbiBvcHRpb25zIGZvciBQRSBwcm94eSBzZXJ2ZXIKLVBFRGlhbG9ncy5Mb2FkTGV2ZWxlck9wdGlvbkxhYmVsPVVzZSBMb2FkTGV2ZWxlcgotUEVEaWFsb2dzLlRyYWNlTGV2ZWxMYWJlbD1UcmFjZSBMZXZlbAotUEVEaWFsb2dzLkNvbmZpZ3VyYXRpb25UaXRsZT1QRSBQcm94eSBDb25maWd1cmF0aW9uCi1QRURpYWxvZ3MuQ29uZmlndXJhdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25uZWN0IHRvIGEgUEUgcHJveHkgc2VydmVyCi1QRURpYWxvZ3MuU3VzcGVuZExhYmVsPVN1c3BlbmQgcHJveHkgYXQgc3RhcnR1cCAoZm9yIGRlYnVnZ2luZykKLVBFRGlhbG9ncy5NaW5pcHJveHlMYWJlbD1BbGxvdyBhcHBsaWNhdGlvbnMgdG8gcnVuIGFmdGVyIHByb3h5IHNodXRkb3duCi1QRURpYWxvZ3MubGliT3ZlcnJpZGVMYWJlbD1BbHRlcm5hdGUgTG9hZExldmVsZXIgbGlicmFyeSBwYXRoCi1QRURpYWxvZ3MuR3JvdXBMYWJlbD1Qcm94eSBvcHRpb25zCi1QRURpYWxvZ3MuVHJhY2VMZXZlbExhYmVsPVRyYWNlIG9wdGlvbnMKLVBFRGlhbG9ncy5NaW5pcHJveHlMYWJlbD1BbGxvdyBhcHBsaWNhdGlvbnMgdG8gcnVuIGFmdGVyIHByb3h5IHNodXRkb3duCi1QRURpYWxvZ3MuYnJvd3NlPUJyb3dzZQotUEVEaWFsb2dzLkxMUnVuTW9kZT1NdWx0aWNsdXN0ZXIgbW9kZQotUEVEaWFsb2dzLmxsTW9kZUxvY2FsPUxvY2FsCi1QRURpYWxvZ3MubGxNb2RlTXVsdGljbHVzdGVyPU11bHRpY2x1c3RlcgotUEVEaWFsb2dzLmxsTW9kZURlZmF1bHQ9RGVmYXVsdAotUEVEaWFsb2dzLm1pbk5vZGVQb2xsSW50ZXJ2YWw9Tm9kZSBwb2xsIG1pbmltdW0gaW50ZXJ2YWwKLVBFRGlhbG9ncy5tYXhOb2RlUG9sbEludGVydmFsPU5vZGUgcG9sbCBtYXhpbXVtIGludGVydmFsCi1QRURpYWxvZ3Muam9iUG9sbEludGVydmFsPUpvYiBwb2xsIGludGVydmFsCi1QRURpYWxvZ3MuaW52YWxpZE1pblBvbGxJbnRlcnZhbD1NaW5pbXVtIG5vZGUgcG9sbGluZyBpbnRlcnZhbCBpcyBub3QgbnVtZXJpYy4KLVBFRGlhbG9ncy5pbnZhbGlkTWF4UG9sbEludGVydmFsPU1heGltdW0gbm9kZSBwb2xsaW5nIGludGVydmFsIGlzIG5vdCBudW1lcmljLgotUEVEaWFsb2dzLmludmFsaWRKb2JQb2xsSW50ZXJ2YWw9Sm9iIHBvbGxpbmcgaW50ZXJ2YWwgaXMgbm90IG51bWVyaWMuCi1QRURpYWxvZ3MuaW52YWxpZExpYnJhcnlQYXRoPUFsdGVybmF0ZSBMb2FkTGV2ZWxlciBsaWJyYXJ5IHBhdGggaXMgaW52YWxpZAotUEVEaWFsb2dzLmxpYnJhcnlTZWxlY3RvclRpdGxlPVNlbGVjdCBBbHRlcm5hdGUgTG9hZExldmVsZXIgTGlicmFyeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3ByZWZlcmVuY2VzL1BFUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3ByZWZlcmVuY2VzL1BFUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYzYzRjYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS9wcmVmZXJlbmNlcy9QRVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICogIAotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5QRVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLlBFUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0UmVtb3RlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgUEVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UmVtb3RlUHJlZmVyZW5jZVBhZ2UKLXsKLQotICAgIHByaXZhdGUgQnV0dG9uIGxvYWRMZXZlbGVyT3B0aW9uOwotICAgIHByaXZhdGUgQnV0dG9uIHJ1bk1pbmlwcm94eTsKLSAgICBwcml2YXRlIEJ1dHRvbiBsaWJPdmVycmlkZUJyb3dzZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBsbE1vZGVMb2NhbDsKLSAgICBwcml2YXRlIEJ1dHRvbiBsbE1vZGVNdWx0aWNsdXN0ZXI7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbGxNb2RlRGVmYXVsdDsKLSAgICBwcml2YXRlIFRleHQgbm9kZVBvbGxNaW5JbnRlcnZhbDsKLSAgICBwcml2YXRlIFRleHQgbm9kZVBvbGxNYXhJbnRlcnZhbDsKLSAgICBwcml2YXRlIFRleHQgam9iUG9sbEludGVydmFsOwotICAgIHByaXZhdGUgVGV4dCBsaWJPdmVycmlkZVBhdGg7Ci0gICAgcHJpdmF0ZSBHcm91cCBsbE1vZGVHcm91cDsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBsbE92ZXJyaWRlQm94OwotICAgIHByaXZhdGUgQ29tYm8gdHJhY2VPcHRpb25zOwotICAgIHByaXZhdGUgTGFiZWwgbG9hZExldmVsZXJMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIHRyYWNlTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBydW5NaW5pcHJveHlMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIGxpYk92ZXJyaWRlTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBsbE1vZGVMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG5vZGVQb2xsTWluTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub2RlUG9sbE1heExhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgam9iUG9sbExhYmVsOwotICAgIHByaXZhdGUgRXZlbnRNb25pdG9yIGV2ZW50TW9uaXRvcjsKLQotICAgIHByaXZhdGUgY2xhc3MgRXZlbnRNb25pdG9yIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyCi0gICAgewotCXB1YmxpYyBFdmVudE1vbml0b3IoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQl7Ci0JICAgIGlmIChsb2FkTGV2ZWxlck9wdGlvbi5nZXRTZWxlY3Rpb24oKSkgewotCQlzZXRMTFdpZGdldEVuYWJsZVN0YXRlKHRydWUpOwotCSAgICB9IGVsc2UgewotCQlzZXRMTFdpZGdldEVuYWJsZVN0YXRlKGZhbHNlKTsKLQkgICAgfQotCSAgICB1cGRhdGVQcmVmZXJlbmNlUGFnZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQl7Ci0JICAgIHVwZGF0ZVByZWZlcmVuY2VQYWdlKCk7Ci0JfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpCi0gICAgewotCXJldHVybiBQRVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkKLSAgICB7Ci0JUEVQcmVmZXJlbmNlTWFuYWdlci5zYXZlUHJlZmVyZW5jZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHdpZGdldHMgZm9yIHByZWZlcmVuY2Ugc2V0dGluZ3MuIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBzdXBlcmNsYXNzIGNyZWF0ZUNvbnRlbnRzKCkgbWV0aG9kIHRvIGNyZWF0ZQotICAgICAqIHRoZSBkZWZhdWx0IHdpZGdldHMgZm9yIHRoZSBwYW5lbCwgdGhlbiBjcmVhdGVzIHRoZSBhZGRpdGlvbmFsIHdpZGdldHMgbmVlZGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgLSBUaGUgcGFyZW50IHdpZGdldCBmb3IgdGhpcyBwYW5lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdG9wIGxldmVsIHdpZGdldCBmb3IgdGhlIHByZWZlcmVuY2UgcGFuZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotCUNvbnRyb2wgcHJlZmVyZW5jZVBhbmU7Ci0JR3JpZExheW91dCBsYXlvdXQ7Ci0JR3JpZExheW91dCBsaWJQYXRoTGF5b3V0OwotCUdyaWREYXRhIGdkOwotCUdyb3VwIG9wdGlvbnNHcm91cDsKLQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQlTdHJpbmcgcHJlZmVyZW5jZVZhbHVlOwotCi0JcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCWV2ZW50TW9uaXRvciA9IG5ldyBFdmVudE1vbml0b3IoKTsKLQlwcmVmZXJlbmNlUGFuZSA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0Jb3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKChDb21wb3NpdGUpIHByZWZlcmVuY2VQYW5lLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0Jb3B0aW9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCW9wdGlvbnNHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLkdyb3VwTGFiZWwiKSk7Ci0JbG9hZExldmVsZXJMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQlsb2FkTGV2ZWxlckxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuTG9hZExldmVsZXJPcHRpb25MYWJlbCIpKTsKLQlsb2FkTGV2ZWxlck9wdGlvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuTE9BRF9MRVZFTEVSX09QVElPTik7Ci0JaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9ZRVMpKSB7Ci0JICAgIGxvYWRMZXZlbGVyT3B0aW9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0KLQlsbE1vZGVMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQlsbE1vZGVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLkxMUnVuTW9kZSIpKTsKLQlsbE1vZGVHcm91cCA9IG5ldyBHcm91cChvcHRpb25zR3JvdXAsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQlsbE1vZGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWxsTW9kZUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCWxsTW9kZUxvY2FsID0gbmV3IEJ1dHRvbihsbE1vZGVHcm91cCwgU1dULlJBRElPKTsKLQlsbE1vZGVMb2NhbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmxsTW9kZUxvY2FsIikpOwotCWxsTW9kZU11bHRpY2x1c3RlciA9IG5ldyBCdXR0b24obGxNb2RlR3JvdXAsIFNXVC5SQURJTyk7Ci0JbGxNb2RlTXVsdGljbHVzdGVyLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MubGxNb2RlTXVsdGljbHVzdGVyIikpOwotCWxsTW9kZURlZmF1bHQgPSBuZXcgQnV0dG9uKGxsTW9kZUdyb3VwLCBTV1QuUkFESU8pOwotCWxsTW9kZURlZmF1bHQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5sbE1vZGVEZWZhdWx0IikpOwotCWxsTW9kZURlZmF1bHQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlsbE1vZGVMb2NhbC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWxsTW9kZU11bHRpY2x1c3Rlci5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuTE9BRF9MRVZFTEVSX01PREUpOwotCWlmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKCJ5IikpIHsKLQkgICAgbGxNb2RlTXVsdGljbHVzdGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9IGVsc2UgaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoIm4iKSkgewotCSAgICBsbE1vZGVMb2NhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfSBlbHNlIHsKLQkgICAgbGxNb2RlRGVmYXVsdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0Jbm9kZVBvbGxNaW5MYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQlub2RlUG9sbE1pbkxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MubWluTm9kZVBvbGxJbnRlcnZhbCIpKTsKLQlub2RlUG9sbE1pbkludGVydmFsID0gbmV3IFRleHQob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlub2RlUG9sbE1pbkludGVydmFsLnNldExheW91dERhdGEoZ2QpOwotCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuTk9ERV9NSU5fUE9MTF9JTlRFUlZBTCk7Ci0Jbm9kZVBvbGxNaW5JbnRlcnZhbC5zZXRUZXh0KHByZWZlcmVuY2VWYWx1ZSk7Ci0KLQlub2RlUG9sbE1heExhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNHcm91cCwgU1dULk5PTkUpOwotCW5vZGVQb2xsTWF4TGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5tYXhOb2RlUG9sbEludGVydmFsIikpOwotCW5vZGVQb2xsTWF4SW50ZXJ2YWwgPSBuZXcgVGV4dChvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCW5vZGVQb2xsTWF4SW50ZXJ2YWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5OT0RFX01BWF9QT0xMX0lOVEVSVkFMKTsKLQlub2RlUG9sbE1heEludGVydmFsLnNldFRleHQocHJlZmVyZW5jZVZhbHVlKTsKLQotCWpvYlBvbGxMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQlqb2JQb2xsTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5qb2JQb2xsSW50ZXJ2YWwiKSk7Ci0Jam9iUG9sbEludGVydmFsID0gbmV3IFRleHQob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlqb2JQb2xsSW50ZXJ2YWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5KT0JfUE9MTF9JTlRFUlZBTCk7Ci0Jam9iUG9sbEludGVydmFsLnNldFRleHQocHJlZmVyZW5jZVZhbHVlKTsKLQotCWxpYk92ZXJyaWRlTGFiZWwgPSBuZXcgTGFiZWwob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSk7Ci0JbGliT3ZlcnJpZGVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmxpYk92ZXJyaWRlTGFiZWwiKSk7Ci0KLQlsbE92ZXJyaWRlQm94ID0gbmV3IENvbXBvc2l0ZShvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWxsT3ZlcnJpZGVCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JbGliUGF0aExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQlsaWJQYXRoTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCWxpYlBhdGhMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCWxpYlBhdGhMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCWxsT3ZlcnJpZGVCb3guc2V0TGF5b3V0KGxpYlBhdGhMYXlvdXQpOwotCWxpYk92ZXJyaWRlUGF0aCA9IG5ldyBUZXh0KGxsT3ZlcnJpZGVCb3gsIFNXVC5OT05FKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWxpYk92ZXJyaWRlUGF0aC5zZXRMYXlvdXREYXRhKGdkKTsKLQlsaWJPdmVycmlkZUJyb3dzZSA9IG5ldyBCdXR0b24obGxPdmVycmlkZUJveCwgU1dULlBVU0gpOwotCWxpYk92ZXJyaWRlQnJvd3NlLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuYnJvd3NlIikpOwotCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCWxpYk92ZXJyaWRlQnJvd3NlLnNldExheW91dERhdGEoZ2QpOwotCXByZWZlcmVuY2VWYWx1ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuTElCUkFSWV9PVkVSUklERSk7Ci0JbGliT3ZlcnJpZGVQYXRoLnNldFRleHQocHJlZmVyZW5jZVZhbHVlKTsKLQotCXJ1bk1pbmlwcm94eUxhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNHcm91cCwgU1dULk5PTkUpOwotCXJ1bk1pbmlwcm94eUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuTWluaXByb3h5TGFiZWwiKSk7Ci0JcnVuTWluaXByb3h5ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JcHJlZmVyZW5jZVZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5SVU5fTUlOSVBST1hZKTsKLQlpZiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhQRVByZWZlcmVuY2VDb25zdGFudHMuT1BUSU9OX1lFUykpIHsKLQkgICAgcnVuTWluaXByb3h5LnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0JdHJhY2VMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zR3JvdXAsIFNXVC5OT05FKTsKLQl0cmFjZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuVHJhY2VMZXZlbExhYmVsIikpOwotCXRyYWNlT3B0aW9ucyA9IG5ldyBDb21ibyhvcHRpb25zR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCXRyYWNlT3B0aW9ucy5hZGQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlRSQUNFX05PVEhJTkcpOwotCXRyYWNlT3B0aW9ucy5hZGQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlRSQUNFX0ZVTkNUSU9OKTsKLQl0cmFjZU9wdGlvbnMuYWRkKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5UUkFDRV9ERVRBSUwpOwotCXRyYWNlT3B0aW9ucy5zZXRUZXh0KHByZWZlcmVuY2VzLmdldFN0cmluZyhQRVByZWZlcmVuY2VDb25zdGFudHMuVFJBQ0VfTEVWRUwpKTsKLQotCWlmICghbG9hZExldmVsZXJPcHRpb24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkgICAgc2V0TExXaWRnZXRFbmFibGVTdGF0ZShmYWxzZSk7Ci0JfQotCWxvYWRMZXZlbGVyT3B0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JbGxNb2RlTG9jYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsbE1vZGVNdWx0aWNsdXN0ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsbE1vZGVEZWZhdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0Jbm9kZVBvbGxNaW5JbnRlcnZhbC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCW5vZGVQb2xsTWF4SW50ZXJ2YWwuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlqb2JQb2xsSW50ZXJ2YWwuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsaWJPdmVycmlkZVBhdGguYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsaWJPdmVycmlkZUJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCXRyYWNlT3B0aW9ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCXJ1bk1pbmlwcm94eS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCi0JcmV0dXJuIHByZWZlcmVuY2VQYW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgd2lkZ2V0IGVuYWJsZSBzdGF0ZSBmb3IgdGhlc2Ugd2lkZ2V0cyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB1c2UgTG9hZExldmVsZXIgY2hlY2tib3ggaXMgY2hlY2tlZAotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRMTFdpZGdldEVuYWJsZVN0YXRlKGJvb2xlYW4gc3RhdGUpCi0gICAgewotCWxsTW9kZUxvY2FsLnNldEVuYWJsZWQoc3RhdGUpOwotCWxsTW9kZU11bHRpY2x1c3Rlci5zZXRFbmFibGVkKHN0YXRlKTsKLQlsbE1vZGVEZWZhdWx0LnNldEVuYWJsZWQoc3RhdGUpOwotCW5vZGVQb2xsTWluSW50ZXJ2YWwuc2V0RW5hYmxlZChzdGF0ZSk7Ci0Jbm9kZVBvbGxNYXhJbnRlcnZhbC5zZXRFbmFibGVkKHN0YXRlKTsKLQlqb2JQb2xsSW50ZXJ2YWwuc2V0RW5hYmxlZChzdGF0ZSk7Ci0JbGliT3ZlcnJpZGVQYXRoLnNldEVuYWJsZWQoc3RhdGUpOwotCWxpYk92ZXJyaWRlQnJvd3NlLnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgcHJlZmVyZW5jZXMgc3RvcmUgd2l0aCB0aGUgdmFsdWVzIHNldCBpbiB0aGUgd2lkZ2V0cyBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJlZmVyZW5jZVBhZ2UoKQotICAgIHsKLQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQotCXN1cGVyLnVwZGF0ZVByZWZlcmVuY2VQYWdlKCk7Ci0JcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCWlmIChsb2FkTGV2ZWxlck9wdGlvbiAhPSBudWxsKSB7Ci0JICAgIGlmIChsb2FkTGV2ZWxlck9wdGlvbi5nZXRTZWxlY3Rpb24oKSkgewotCQlpbnQgaW50ZXJ2YWw7Ci0JCVN0cmluZyB3aWRnZXRWYWx1ZTsKLQotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQRVByZWZlcmVuY2VDb25zdGFudHMuTE9BRF9MRVZFTEVSX09QVElPTiwgUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9ZRVMpOwotCQlpZiAobGxNb2RlRGVmYXVsdC5nZXRTZWxlY3Rpb24oKSkgewotCQkgICAgd2lkZ2V0VmFsdWUgPSAiZCI7Ci0JCX0gZWxzZSBpZiAobGxNb2RlTG9jYWwuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJICAgIHdpZGdldFZhbHVlID0gIm4iOwotCQl9IGVsc2UgewotCQkgICAgd2lkZ2V0VmFsdWUgPSAieSI7Ci0JCX0KLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkxPQURfTEVWRUxFUl9NT0RFLCB3aWRnZXRWYWx1ZSk7Ci0JCXdpZGdldFZhbHVlID0gbm9kZVBvbGxNaW5JbnRlcnZhbC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAod2lkZ2V0VmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCSAgICB0cnkgewotCQkJaW50ZXJ2YWwgPSBJbnRlZ2VyLnZhbHVlT2Yod2lkZ2V0VmFsdWUpOwotCQkgICAgfQotCQkgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuaW52YWxpZE1pblBvbGxJbnRlcnZhbCIpKTsKLQkJCXJldHVybjsKLQkJICAgIH0KLQkJfQotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQRVByZWZlcmVuY2VDb25zdGFudHMuTk9ERV9NSU5fUE9MTF9JTlRFUlZBTCwgd2lkZ2V0VmFsdWUpOwotCQl3aWRnZXRWYWx1ZSA9IG5vZGVQb2xsTWF4SW50ZXJ2YWwuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKHdpZGdldFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkgICAgdHJ5IHsKLQkJCWludGVydmFsID0gSW50ZWdlci52YWx1ZU9mKHdpZGdldFZhbHVlKTsKLQkJICAgIH0KLQkJICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmludmFsaWRNYXhQb2xsSW50ZXJ2YWwiKSk7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk5PREVfTUFYX1BPTExfSU5URVJWQUwsIHdpZGdldFZhbHVlKTsKLQkJd2lkZ2V0VmFsdWUgPSBqb2JQb2xsSW50ZXJ2YWwuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKHdpZGdldFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkgICAgdHJ5IHsKLQkJCWludGVydmFsID0gSW50ZWdlci52YWx1ZU9mKHdpZGdldFZhbHVlKTsKLQkJICAgIH0KLQkJICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmludmFsaWRKb2JQb2xsSW50ZXJ2YWwiKSk7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLkpPQl9QT0xMX0lOVEVSVkFMLCB3aWRnZXRWYWx1ZSk7Ci0JCXdpZGdldFZhbHVlID0gbGliT3ZlcnJpZGVQYXRoLmdldFRleHQoKS50cmltKCk7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5MSUJSQVJZX09WRVJSSURFLCB3aWRnZXRWYWx1ZSk7Ci0JICAgIH0gZWxzZSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5MT0FEX0xFVkVMRVJfT1BUSU9OLCBQRVByZWZlcmVuY2VDb25zdGFudHMuT1BUSU9OX05PKTsKLQkgICAgfQotCX0KLQlpZiAodHJhY2VPcHRpb25zICE9IG51bGwpIHsKLQkgICAgcHJlZmVyZW5jZXMuc2V0VmFsdWUoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlRSQUNFX0xFVkVMLCB0cmFjZU9wdGlvbnMuZ2V0VGV4dCgpKTsKLQl9Ci0JaWYgKHJ1bk1pbmlwcm94eSAhPSBudWxsKSB7Ci0JICAgIGlmIChydW5NaW5pcHJveHkuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlJVTl9NSU5JUFJPWFksIFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fWUVTKTsKLQkgICAgfSBlbHNlIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlJVTl9NSU5JUFJPWFksIFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fTk8pOwotCSAgICB9Ci0JfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vUEVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vUEVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4ZDYwMDYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1BFUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IExvcyBBbGFtb3MgTmF0aW9uYWwgU2VjdXJpdHksIExMQy4KLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBERS1BQzUyLTA2TkEyNTM5NgotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSAoTEFOTCksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBMb3MgQWxhbW9zCi0gKiBOYXRpb25hbCBTZWN1cml0eSwgTExDIChMQU5TKSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudCBvZiBFbmVyZ3kuICBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcwotICogcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRQotICogR09WRVJOTUVOVCBOT1IgTEFOUyBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IKLSAqIEFTU1VNRVMgQU5ZIExJQUJJTElUWSBGT1IgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLiBJZiBzb2Z0d2FyZSBpcyBtb2RpZmllZAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkJpZ0ludGVnZXJBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5CaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdTZXRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5STUxhdW5jaFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuSVJlbW90ZVVJU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5QVFBSZW1vdGVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLmNvcmUucm1zeXN0ZW0uUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzLkJvb2xlYW5Sb3dXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzLkNoZWNrYm94Um93V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2lkZ2V0cy5Db21ib1Jvd1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLndpZGdldHMuRHVhbEZpZWxkUm93V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2lkZ2V0cy5GaWxlU2VsZWN0b3JSb3dXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzLlRleHRSb3dXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzLldpZGdldEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgUEVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGV4dGVuZHMgQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiCi17Ci0gICAgLy8gVE9ETwotICAgIC8vIDgpIHBvcHVwICdub3RlcGFkJyBlZGl0b3IgdG8gY3JlYXRlIGhvc3QgZmlsZQotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgZGVmaW5lIHRoZSBuYW1lcyBvZiBhbGwgYXR0cmlidXRlcyB3aGljaCBtYXkgYmUga25vd24gYnkgdGhlIFBFIHByb3h5LiBOYW1lcyBzdGFydGluZwotICAgICAqIHdpdGggTVBfKiByZXByZXNlbnQgdGhlIGNvcnJlc3BvbmRpbmcgUEUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBOYW1lcyBzdGFydGluZyB3aXRoIFBFXyogcmVwcmVzZW50IGFkZGl0aW9uYWwKLSAgICAgKiBhdHRyaWJ1dGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUEUgcHJveHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0FDS19USFJFU0ggPSAiTVBfQUNLX1RIUkVTSCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0FEQVBURVJfVVNFID0gIk1QX0FEQVBURVJfVVNFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfQlVMS19NSU5fTVNHX1NJWkUgPSAiTVBfQlVMS19NSU5fTVNHX1NJWkUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9DQ19TQ1JBVENIX0JVRiA9ICJNUF9DQ19TQ1JBVENIX0JVRiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0NMT0NLX1NPVVJDRSA9ICJNUF9DTE9DS19TT1VSQ0UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9DS1BURElSID0gIk1QX0NLUFRESVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9DS1BURElSX1BFUlRBU0sgPSAiTVBfQ0tQVERJUl9QRVJUQVNLIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfQ0tQVEZJTEUgPSAiTVBfQ0tQVEZJTEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9DTURGSUxFID0gIk1QX0NNREZJTEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9DT1JFRElSID0gIk1QX0NPUkVESVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9DT1JFRklMRV9GT1JNQVQgPSAiTVBfQ09SRUZJTEVfRk9STUFUIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfQ09SRUZJTEVfU0lHVEVSTSA9ICJNUF9DT1JFRklMRV9TSUdURVJNIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfQ1BVX1VTRSA9ICJNUF9DUFVfVVNFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfQ1NTX0lOVEVSUlVQVCA9ICJNUF9DU1NfSU5URVJSVVBUIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfREVCVUdfSU5JVElBTF9TVE9QID0gIk1QX0RFQlVHX0lOSVRJQUxfU1RPUCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0RFQlVHX05PVElNRU9VVCA9ICJNUF9ERUJVR19OT1RJTUVPVVQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9ERVZUWVBFID0gIk1QX0RFVlRZUEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9FQUdFUl9MSU1JVCA9ICJNUF9FQUdFUl9MSU1JVCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0VVSURFVkVMT1AgPSAiTVBfRVVJREVWRUxPUCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0VVSURFVklDRSA9ICJNUF9FVUlERVZJQ0UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9FVUlMSUIgPSAiTVBfRVVJTElCIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfRVVJTElCUEFUSCA9ICJNUF9FVUlMSUJQQVRIIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfSElOVFNfRklMVEVSRUQgPSAiTVBfSElOVFNfRklMVEVSRUQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9IT1NURklMRSA9ICJNUF9IT1NURklMRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX0lORk9MRVZFTCA9ICJNUF9JTkZPTEVWRUwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9JTlNUQU5DRVMgPSAiTVBfSU5TVEFOQ0VTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfSU9fQlVGRkVSX1NJWkUgPSAiTVBfSU9fQlVGRkVSX1NJWkUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9JT19FUlJMT0cgPSAiTVBfSU9fRVJSTE9HIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfSU9OT0RFRklMRSA9ICJNUF9JT05PREVGSUxFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfTEFCRUxJTyA9ICJNUF9MQUJFTElPIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfTEFQSV9UUkFDRV9MRVZFTCA9ICJNUF9MQVBJX1RSQUNFX0xFVkVMIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfTExGSUxFID0gIk1QX0xMRklMRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX01TR19BUEkgPSAiTVBfTVNHX0FQSSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX01TR19FTlZFTE9QRV9CVUYgPSAiTVBfTVNHX0VOVkVMT1BFX0JVRiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX05FV0pPQiA9ICJNUF9ORVdKT0IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9OT0RFUyA9ICJNUF9OT0RFUyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1BHTU1PREVMID0gIk1QX1BHTU1PREVMIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUE1ETE9HID0gIk1QX1BNRExPRyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1BNRExPR19ESVIgPSAiTVBfUE1ETE9HX0RJUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1BPTExJTkdfSU5URVJWQUwgPSAiTVBfUE9MTElOR19JTlRFUlZBTCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1BSSU5URU5WID0gIk1QX1BSSU5URU5WIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUFJJT1JJVFkgPSAiTVBfUFJJT1JJVFkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9QUklPUklUWV9MT0cgPSAiTVBfUFJJT1JJVFlfTE9HIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUFJJT1JJVFlfTE9HX0RJUiA9ICJNUF9QUklPUklUWV9MT0dfRElSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUFJJT1JJVFlfTE9HX05BTUUgPSAiTVBfUFJJT1JJVFlfTE9HX05BTUUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9QUklPUklUWV9OVFAgPSAiTVBfUFJJT1JJVFlfTlRQIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUFJPQ1MgPSAiTVBfUFJPQ1MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9QUk9GRElSID0gIk1QX1BST0ZESVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9QVUxTRSA9ICJNUF9QVUxTRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1JFTU9URURJUiA9ICJNUF9SRU1PVEVESVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9SRVRSQU5TTUlUX0lOVEVSVkFMID0gIk1QX1JFVFJBTlNNSVRfSU5URVJWQUwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9SRVRSWSA9ICJNUF9SRVRSWSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1JFVFJZX0NPVU5UID0gIk1QX1JFVFJZX0NPVU5UIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUkVYTUlUX0JVRl9DTlQgPSAiTVBfUkVYTUlUX0JVRl9DTlQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9SRVhNSVRfQlVGX1NJWkUgPSAiTVBfUkVYTUlUX0JVRl9TSVpFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfUk1MSUIgPSAiTVBfUk1MSUIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9STVBPT0wgPSAiTVBfUk1QT09MIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfU0FWRV9MTEZJTEUgPSAiTVBfU0FWRV9MTEZJTEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9TQVZFSE9TVEZJTEUgPSAiTVBfU0FWRUhPU1RGSUxFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfU0hBUkVEX01FTU9SWSA9ICJNUF9TSEFSRURfTUVNT1JZIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfU0lOR0xFX1RIUkVBRCA9ICJNUF9TSU5HTEVfVEhSRUFEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfU1RBVElTVElDUyA9ICJNUF9TVEFUSVNUSUNTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfU1RESU5NT0RFID0gIk1QX1NURElOTU9ERSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1NURE9VVE1PREUgPSAiTVBfU1RET1VUTU9ERSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1RBU0tfQUZGSU5JVFkgPSAiTVBfVEFTS19BRkZJTklUWSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1RBU0tTX1BFUl9OT0RFID0gIk1QX1RBU0tTX1BFUl9OT0RFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfVEhSRUFEX1NUQUNLU0laRSA9ICJNUF9USFJFQURfU1RBQ0tTSVpFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfVElNRU9VVCA9ICJNUF9USU1FT1VUIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBfVExQX1JFUVVJUkVEID0gIk1QX1RMUF9SRVFVSVJFRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QX1VEUF9QQUNLRVRfU0laRSA9ICJNUF9VRFBfUEFDS0VUX1NJWkUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9VU0VfQlVMS19YRkVSID0gIk1QX1VTRV9CVUxLX1hGRVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9XQUlUX01PREUgPSAiTVBfV0FJVF9NT0RFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVfQURWQU5DRURfTU9ERSA9ICJQRV9BRFZBTkNFRF9NT0RFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVfQlVGRkVSX01FTSA9ICJQRV9CVUZGRVJfTUVNIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVfQlVGRkVSX01FTV9NQVggPSAiUEVfQlVGRkVSX01FTV9NQVgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRV9FTlZfU0NSSVBUID0gIlBFX0VOVl9TQ1JJUFQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRV9SRE1BX0NPVU5UID0gIlBFX1JETUFfQ09VTlQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRV9SRE1BX0NPVU5UXzIgPSAiUEVfUkRNQV9DT1VOVF8yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVfU1BMSVRfU1RET1VUID0gIlBFX1NQTElUX1NURE9VVCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFX1NUREVSUl9QQVRIID0gIlBFX1NUREVSUl9QQVRIIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVfU1RESU5fUEFUSCA9ICJQRV9TVERJTl9QQVRIIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVfU1RET1VUX1BBVEggPSAiUEVfU1RET1VUX1BBVEgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9JTlNUQU5DRVNfSU5UID0gIk1QX0lOU1RBTkNFU19JTlQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUF9SRVRSWV9JTlQgPSAiTVBfUkVUUllfSU5UIjsKLSAgICAvKgotICAgICAqIEVuZCBvZiBhdHRyaWJ1dGUgbmFtZSBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfU1RBVEUgPSAiRU5BQkxFX1NUQVRFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSTUxhdW5jaFZhbGlkYXRpb24gc3VjY2VzcyA9IG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgIiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNUF9JT05PREVGSUxFX1NFTEVDVE9SID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVfU1RESU5fUEFUSF9TRUxFQ1RPUiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBFX1NURE9VVF9QQVRIX1NFTEVDVE9SID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVfU1RERVJSX1BBVEhfU0VMRUNUT1IgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNUF9DT1JFRElSX1NFTEVDVE9SID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfQ01ERklMRV9TRUxFQ1RPUiA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1QX0hPU1RGSUxFX1NFTEVDVE9SID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfUkVNT1RFRElSX1NFTEVDVE9SID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfTExGSUxFX1NFTEVDVE9SID0gOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfRVVJTElCUEFUSF9TRUxFQ1RPUiA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNUF9TQVZFX0xMRklMRV9TRUxFQ1RPUiA9IDExOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNUF9TQVZFSE9TVEZJTEVfU0VMRUNUT1IgPSAxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfUk1MSUJfU0VMRUNUT1IgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVfRU5WX1NDUklQVF9TRUxFQ1RPUiA9IDE0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNUF9QUk9GRElSX1NFTEVDVE9SID0gMTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1QX1BSSU9SSVRZX0xPR19ESVJfU0VMRUNUT1IgPSAxNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfUFJJT1JJVFlfTE9HX05BTUVfU0VMRUNUT1IgPSAxNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfQ0tQVEZJTEVfU0VMRUNUT1IgPSAxODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVBfQ0tQVERJUl9TRUxFQ1RPUiA9IDE5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNUF9QTURMT0dfRElSX1NFTEVDVE9SID0gMjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBFX0FEVkFOQ0VEX01PREVfQ0hFQ0tCT1ggPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtCWVRFID0gMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUJZVEUgPSAxMDI0ICogMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0JZVEUgPSAxMDI0ICogMTAyNCAqIDEwMjQ7Ci0gICAgLyoKLSAgICAgKiBMaXN0IG9mIHZhbGlkIFBFIEVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhpcyBsaXN0IG11c3QgYmUga2VwdAotICAgICAqIGluIHNvcnRlZCBhc2NlbmRpbmcgb3JkZXIuIE1QX0ZFTkNFIGFuZCBNUF9OT0FSR0xJU1QgbXVzdCBub3QKLSAgICAgKiBhcHBlYXIgaW4gdGhpcyBsaXN0IHNpbmNlIHRoZXkgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCB0bwotICAgICAqIGNvbnRyb2wgY29tbWFuZCBsaW5lIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFRW52VmFyc1tdID0gewotCSJNUF9BQ0tfVEhSRVNIIiwKLQkiTVBfQURBUFRFUl9VU0UiLAotCSJNUF9CVUZGRVJfTUVNIiwKLQkiTVBfQlVGRkVSX01FTV9NQVgiLAotCSJNUF9CVUxLX01JTl9NU0dfU0laRSIsCi0JIk1QX0NDX1NDUkFUQ0hfQlVGIiwKLQkiTVBfQ0tQVERJUiIsCi0JIk1QX0NLUFRESVJfUEVSVEFTSyIsCi0JIk1QX0NLUFRGSUxFIiwKLQkiTVBfQ0xPQ0tfU09VUkNFIiwKLQkiTVBfQ01ERklMRSIsCi0JIk1QX0NPUkVESVIiLAotCSJNUF9DT1JFRklMRV9GT1JNQVQiLAotCSJNUF9DT1JFRklMRV9TSUdURVJNIiwKLQkiTVBfQ1BVX1VTRSIsCi0JIk1QX0NTU19JTlRFUlJVUFQiLAotCSJNUF9ERUJVR19JTklUSUFMX1NUT1AiLAotCSJNUF9ERUJVR19OT1RJTUVPVVQiLAotCSJNUF9ERVZUWVBFIiwKLQkiTVBfRUFHRVJfTElNSVQiLAotCSJNUF9FVUlERVZFTE9QIiwKLQkiTVBfRVVJREVWSUNFIiwKLQkiTVBfRVVJTElCIiwKLQkiTVBfRVVJTElCUEFUSCIsCi0JIk1QX0hJTlRTX0ZJTFRFUkVEIiwKLQkiTVBfSE9TVEZJTEUiLAotCSJNUF9JTkZPTEVWRUwiLAotCSJNUF9JTlNUQU5DRVMiLAotCSJNUF9JTlNUQU5DRVNfSU5UIiwKLQkiTVBfSU9fQlVGRkVSX1NJWkUiLAotCSJNUF9JT19FUlJMT0ciLAotCSJNUF9JT05PREVGSUxFIiwKLQkiTVBfTEFCRUxJTyIsCi0JIk1QX0xBUElfVFJBQ0VfTEVWRUwiLAotCSJNUF9MTEZJTEUiLAotCSJNUF9NU0dfQVBJIiwKLQkiTVBfTVNHX0VOVkVMT1BFX0JVRiIsCi0JIk1QX05FV0pPQiIsCi0JIk1QX05PREVTIiwKLQkiTVBfUEdNTU9ERUwiLAotCSJNUF9QTURMT0ciLAotCSJNUF9QTURMT0dfRElSIiwKLQkiTVBfUE9MTElOR19JTlRFUlZBTCIsCi0JIk1QX1BSSU5URU5WIiwKLQkiTVBfUFJJT1JJVFkiLAotCSJNUF9QUklPUklUWV9MT0ciLAotCSJNUF9QUklPUklUWV9MT0dfRElSIiwKLQkiTVBfUFJJT1JJVFlfTE9HX05BTUUiLAotCSJNUF9QUklPUklUWV9OVFAiLAotCSJNUF9QUk9DUyIsCi0JIk1QX1BST0ZESVIiLAotCSJNUF9QVUxTRSIsCi0JIk1QX1JETUFfQ09VTlQiLAotCSJNUF9SRU1PVEVESVIiLAotCSJNUF9SRVRSQU5TTUlUX0lOVEVSVkFMIiwKLQkiTVBfUkVUUlkiLAotCSJNUF9SRVRSWV9DT1VOVCIsCi0JIk1QX1JFVFJZX0lOVCIsCi0JIk1QX1JFWE1JVF9CVUZfQ05UIiwKLQkiTVBfUkVYTUlUX0JVRl9TSVpFIiwKLQkiTVBfUk1MSUIiLAotCSJNUF9STVBPT0wiLAotCSJNUF9TQVZFSE9TVEZJTEUiLAotCSJNUF9TQVZFX0xMRklMRSIsCi0JIk1QX1NIQVJFRF9NRU1PUlkiLAotCSJNUF9TSU5HTEVfVEhSRUFEIiwKLQkiTVBfU1RBVElTVElDUyIsCi0JIk1QX1NURElOTU9ERSIsCi0JIk1QX1NURE9VVE1PREUiLAotCSJNUF9UQVNLX0FGRklOSVRZIiwKLQkiTVBfVEFTS1NfUEVSX05PREUiLAotCSJNUF9USFJFQURfU1RBQ0tTSVpFIiwKLQkiTVBfVElNRU9VVCIsCi0JIk1QX1RMUF9SRVFVSVJFRCIsCi0JIk1QX1VEUF9QQUNLRVRfU0laRSIsCi0JIk1QX1VTRV9CVUxLX1hGRVIiLAotCSJNUF9XQUlUX01PREUiCi0gICAgfTsKLSAgICAvKgotICAgICAqIExpc3Qgb2YgdmFsaWQgUGFyYWxsZWwgRW52aXJvbm1lbnQgb3B0aW9ucy4gVGhpcyBsaXN0IG11c3QgYmUga2VwdAotICAgICAqIGluIHNvcnRlZCBhc2NlbmRpbmcgb3JkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFT3B0aW9uc1tdID0gewotCSItYWNrX3RocmVzaCIsCi0gICAgICAgICItYWRhcHRlcl91c2UiLAotICAgICAgICAiLWJ1ZmZlcl9tZW0iLAotICAgICAgICAiLWJ1bGtfbWluX21zZ19zaXplIiwKLSAgICAgICAgIi1jY19zY3JhdGNoX2J1ZiIsCi0gICAgICAgICItY2xvY2tfc291cmNlIiwKLSAgICAgICAgIi1jbWRmaWxlIiwKLSAgICAgICAgIi1jb3JlZGlyIiwKLSAgICAgICAgIi1jb3JlZmlsZV9mb3JtYXQiLAotICAgICAgICAiLWNvcmVmaWxlX3NpZ3Rlcm0iLAotICAgICAgICAiLWNwdV91c2UiLAotICAgICAgICAiLWNzc19pbnRlcnJ1cHQiLAotICAgICAgICAiLWRlYnVnX25vdGltZW91dCIsCi0gICAgICAgICItZGV2dHlwZSIsCi0gICAgICAgICItZWFnZXJfbGltaXQiLAotICAgICAgICAiLWV1aWRldmVsb3AiLAotICAgICAgICAiLWV1aWRldmljZSIsCi0gICAgICAgICItZXVpbGliIiwKLSAgICAgICAgIi1ldWlsaWJwYXRoIiwKLSAgICAgICAgIi1oZmlsZSIsCi0gICAgICAgICItaGludHNfZmlsdGVyZWQiLAotICAgICAgICAiLWhvc3RmaWxlIiwKLSAgICAgICAgIi1pbGV2ZWwiLAotICAgICAgICAiLWluZm9sZXZlbCIsCi0gICAgICAgICItaW5zdGFuY2VzIiwKLSAgICAgICAgIi1pb19idWZmZXJfc2l6ZSIsCi0gICAgICAgICItaW9fZXJybG9nIiwKLSAgICAgICAgIi1pb25vZGVmaWxlIiwKLSAgICAgICAgIi1sYWJlbGlvIiwKLSAgICAgICAgIi1sbGZpbGUiLAotICAgICAgICAiLW1zZ19hcGkiLAotICAgICAgICAiLW1zZ19lbnZlbG9wZV9idWYiLAotICAgICAgICAiLW5ld2pvYiIsCi0gICAgICAgICItbm9kZXMiLAotICAgICAgICAiLXBnbW1vZGVsIiwKLSAgICAgICAgIi1wbWRsb2ciLAotICAgICAgICAiLXBtZGxvZ19kaXIiLAotICAgICAgICAiLXBvbGxpbmdfaW50ZXJ2YWwiLAotICAgICAgICAiLXByaW50ZW52IiwKLSAgICAgICAgIi1wcmlvcml0eV9sb2ciLAotICAgICAgICAiLXByaW9yaXR5X2xvZ19kaXIiLAotICAgICAgICAiLXByaW9yaXR5X2xvZ19uYW1lIiwKLSAgICAgICAgIi1wcmlvcml0eV9udHAiLAotICAgICAgICAiLXByb2NzIiwKLSAgICAgICAgIi1wcm9mZGlyIiwKLSAgICAgICAgIi1wdWxzZSIsCi0gICAgICAgICItcmRtYV9jb3VudCIsCi0gICAgICAgICItcmVzZCIsCi0gICAgICAgICItcmV0cmFuc21pdF9pbnRlcnZhbCIsCi0gICAgICAgICItcmV0cnkiLAotICAgICAgICAiLXJldHJ5Y291bnQiLAotICAgICAgICAiLXJleG1pdF9idWZfY250IiwKLSAgICAgICAgIi1ybXBvb2wiLAotICAgICAgICAiLXNhdmVob3N0ZmlsZSIsCi0gICAgICAgICItc2F2ZV9sbGZpbGUiLAotICAgICAgICAiLXNoYXJlZF9tZW1vcnkiLAotICAgICAgICAiLXNpbmdsZV90aHJlYWQiLAotICAgICAgICAiLXN0YXRpc3RpY3MiLAotICAgICAgICAiLXN0ZGlubW9kZSIsCi0gICAgICAgICItc3Rkb3V0bW9kZSIsCi0gICAgICAgICItdGFza19hZmZpbml0eSIsCi0gICAgICAgICItdGFza3NfcGVyX25vZGUiLAotICAgICAgICAiLXRocmVhZF9zdGFja3NpemUiLAotICAgICAgICAiLXRscF9yZXF1aXJlZCIsCi0gICAgICAgICItdWRwX3BhY2tldF9zaXplIiwKLSAgICAgICAgIi11c2VfYnVsa194ZmVyIiwKLSAgICAgICAgIi13YWl0X21vZGUiCi0gICAgfTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVNb2RpZnlFdmVudHMgPSBmYWxzZTsKLSAgICBwcml2YXRlIEV2ZW50TW9uaXRvciBldmVudE1vbml0b3I7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbWFpblBhbmVsOwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VMb2FkTGV2ZWxlciA9IGZhbHNlOwotICAgIHByaXZhdGUgVGFiRm9sZGVyIHRhYmJlZFBhbmU7Ci0gICAgcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGN1cnJlbnRMYXVuY2hDb25maWc7Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyIGN1cnJlbnRSTTsKLSAgICBwcml2YXRlIENoZWNrYm94Um93V2lkZ2V0IHBlQWR2YW5jZWRNb2RlOwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IHBlRW52U2NyaXB0OwotICAgIHByaXZhdGUgYm9vbGVhbiBhbGxGaWVsZHNWYWxpZCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHRhc2tzVGFiUGFuZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBpb1RhYlBhbmU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ1RhYlBhbmU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZGVidWdUYWJQYW5lOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHN5c3RlbVRhYlBhbmU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbm9kZVRhYlBhbmU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGVyZm9ybWFuY2VUYWIxUGFuZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBwZXJmb3JtYW5jZVRhYjJQYW5lOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGFsdGVybmF0ZVJNVGFiUGFuZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtaXNjVGFiUGFuZTsKLSAgICBwcml2YXRlIFZlY3RvcjxPYmplY3Q+IGFjdGl2ZVdpZGdldHM7Ci0gICAgcHJpdmF0ZSBJUmVtb3RlQ29ubmVjdGlvbiByZW1vdGVDb25uZWN0aW9uOwotICAgIHByaXZhdGUgSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBJUmVtb3RlVUlTZXJ2aWNlcyByZW1vdGVVSVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBTaGVsbCBwYXJlbnRTaGVsbDsKLS8vICAgIHByaXZhdGUgUlNFRmlsZU1hbmFnZXIgcmVtb3RlRmlsZU1hbmFnZXI7Ci0gICAgLyoKLSAgICAgKiBXaWRnZXRzIGZvciBJTyB0YWIKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIENvbWJvUm93V2lkZ2V0IG1wRGV2VHlwZTsKLSAgICBwcml2YXRlIFRleHRSb3dXaWRnZXQgbXBJT0J1ZmZlclNpemU7Ci0gICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3JSb3dXaWRnZXQgbXBJT05vZGVGaWxlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQm9vbGVhblJvd1dpZGdldCBtcExhYmVsSU87Ci0gICAgcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBtcFN0ZGluTW9kZTsKLSAgICBwcml2YXRlIENvbWJvUm93V2lkZ2V0IG1wU3Rkb3V0TW9kZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBJT0VyckxvZzsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgcGVTcGxpdFN0ZG91dDsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBwZVN0ZGluUGF0aDsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBwZVN0ZG91dFBhdGg7Ci0gICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3JSb3dXaWRnZXQgcGVTdGRlcnJQYXRoOwotICAgIC8qCi0gICAgICogV2lkZ2V0cyBmb3IgZGlhZ25vc3RpYyB0YWIKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIENvbWJvUm93V2lkZ2V0IG1wSW5mb0xldmVsOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBMQVBJVHJhY2VMZXZlbDsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBQTURMb2c7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBtcFByaW50RW52OwotICAgIHByaXZhdGUgQm9vbGVhblJvd1dpZGdldCBtcFByaW9yaXR5TG9nOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBTdGF0aXN0aWNzOwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IG1wUG1kTG9nRGlyOwotICAgIC8qCi0gICAgICogV2lkZ2V0cyBmb3IgZGVidWcgdGFiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3JSb3dXaWRnZXQgbXBDb3JlRGlyOwotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBDb3JlZmlsZUZvcm1hdDsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBDb3JlZmlsZVNpZ3Rlcm07Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wRGVidWdJbml0aWFsU3RvcDsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBEZWJ1Z05vdGltZW91dDsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIENvbWJvUm93V2lkZ2V0IG1wRXVpRGV2ZWxvcDsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBtcFByb2ZEaXI7Ci0gICAgLyoKLSAgICAgKiBXaWRnZXRzIGZvciBzeXN0ZW0gcmVzb3VyY2VzIHRhYgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQm9vbGVhblJvd1dpZGdldCBtcEFkYXB0ZXJVc2U7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBCb29sZWFuUm93V2lkZ2V0IG1wQ3B1VXNlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBFdWlEZXZpY2U7Ci0gICAgcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBtcEluc3RhbmNlczsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIENvbWJvUm93V2lkZ2V0IG1wRXVpTGliOwotICAgIC8qCi0gICAgICogV2lkZ2V0cyBmb3Igbm9kZSBhbGxvY2F0aW9uIHRhYgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IG1wQ21kRmlsZTsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBtcEhvc3RGaWxlOwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcE5vZGVzOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBQZ21Nb2RlbDsKLSAgICBwcml2YXRlIFRleHRSb3dXaWRnZXQgbXBQcm9jczsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBtcFJlbW90ZURpcjsKLSAgICBwcml2YXRlIFRleHRSb3dXaWRnZXQgbXBUYXNrc1Blck5vZGU7Ci0gICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3JSb3dXaWRnZXQgbXBMTEZpbGU7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW51c2VkIiwgInVudXNlZCIgfSkKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBOZXdKb2I7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wUk1Qb29sOwotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBSZXRyeTsKLSAgICBwcml2YXRlIFRleHRSb3dXaWRnZXQgbXBSZXRyeUNvdW50OwotICAgIC8qCi0gICAgICogV2lkZ2V0cyBmb3IgcGVyZm9ybWFuY2UgdGFicwotICAgICAqLwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcEFja1RocmVzaDsKLSAgICBwcml2YXRlIER1YWxGaWVsZFJvd1dpZGdldCBwZUJ1ZmZlck1lbTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBDQ1NjcmF0Y2hCdWY7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBCb29sZWFuUm93V2lkZ2V0IG1wQ1NTSW50ZXJydXB0OwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcEVhZ2VyTGltaXQ7Ci0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wTXNnRW52ZWxvcGVCdWY7Ci0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wUG9sbGluZ0ludGVydmFsOwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcFByaW9yaXR5OwotICAgIHByaXZhdGUgQm9vbGVhblJvd1dpZGdldCBtcFByaW9yaXR5TlRQOwotICAgIHByaXZhdGUgRHVhbEZpZWxkUm93V2lkZ2V0IHBlUkRNQUNvdW50OwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcFJldHJhbnNtaXRJbnRlcnZhbDsKLSAgICBwcml2YXRlIFRleHRSb3dXaWRnZXQgbXBSZXhtaXRCdWZDbnQ7Ci0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wUmV4bWl0QnVmU2l6ZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBTaGFyZWRNZW1vcnk7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBCb29sZWFuUm93V2lkZ2V0IG1wU2luZ2xlVGhyZWFkOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBUYXNrQWZmaW5pdHk7Ci0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wVURQUGFja2V0U2l6ZTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBXYWl0TW9kZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBVc2VCdWxrWGZlcjsKLSAgICBwcml2YXRlIFRleHRSb3dXaWRnZXQgbXBCdWxrTWluTXNnU2l6ZTsKLSAgICAvKgotICAgICAqIFdpZGdldHMgZm9yIG1pc2NlbGxhbmVvdXMgdGFiCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBtcENsb2NrU291cmNlOwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IG1wRXVpTGliUGF0aDsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBIaW50c0ZpbHRlcmVkOwotICAgIHByaXZhdGUgQ29tYm9Sb3dXaWRnZXQgbXBNc2dBcGk7Ci0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wUHVsc2U7Ci0gICAgcHJpdmF0ZSBUZXh0Um93V2lkZ2V0IG1wVGhyZWFkU3RhY2tTaXplOwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcFRpbWVvdXQ7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBtcFRMUFJlcXVpcmVkOwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IG1wU2F2ZUxMRmlsZTsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBtcFNhdmVIb3N0RmlsZTsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBtcFByaW9yaXR5TG9nRGlyOwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBtcFByaW9yaXR5TG9nTmFtZTsKLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBtcENrcHREaXI7Ci0gICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3JSb3dXaWRnZXQgbXBDa3B0RmlsZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgbXBDa3B0RGlyUGVyVGFzazsKLSAgICAvKgotICAgICAqIFdpZGdldHMgZm9yIG90aGVyIFJNIHRhYgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yUm93V2lkZ2V0IG1wUk1MaWI7Ci0KLQotCi0KLQotICAgIC8qKgotICAgICAqIEV4Y2VwdGlvbiBjbGFzcyBpbnRlbmRlZCBmb3IgdXNlIGluIHZhbGlkYXRpbmcgZmllbGRzIHdpdGhpbiB0aGlzIHBhbmVsLiBXaGVuIGEgdmFsaWRhdGlvbiBlcnJvciBvY2N1cnMsIHRoZQotICAgICAqIHZhbGlkYXRpb24gY29kZSBzaG91bGQgY3JlYXRlIGFuZCB0aHJvdyBhIFZhbGlkYXRpb25FeGNlcHRpb24sIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIGNhdWdodCBieSB0aGUgdG9wIGxldmVsCi0gICAgICogdmFsaWRhdGlvbiBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi0gICAgewotCS8qKgotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIFZhbGlkYXRpb25FeGNlcHRpb24oKQotCXsKLQkgICAgdGhyb3cgbmV3IElsbGVnYWxBY2Nlc3NFcnJvcigiVmFsaWRhdGlvbkV4Y2VwdGlvbiBkZWZhdWx0IGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgY2FsbGVkIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVmFsaWRhdGlvbkV4Y2VwdGlvbiB3aXRoIGVycm9yIG1lc3NhZ2UKLQkgKgotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0JewotCSAgICBzdXBlcihtZXNzYWdlKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgY2xhc3Mgd2hpY2ggaGFuZGxlcyBldmVudHMgb2YgaW50ZXJlc3QgdG8gdGhpcyBwYW5lbAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRXZlbnRNb25pdG9yIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgewotCXB1YmxpYyBFdmVudE1vbml0b3IoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQl7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGV2ZW50cyBzZW50IHdoZW4gcmVnaXN0ZXJlZCBidXR0b25zIGFyZSBjbGlja2VkCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQl7Ci0JICAgIE9iamVjdCB3aWRnZXREYXRhOwotCi0JICAgIC8vIERldGVybWluZSB3aGljaCBidXR0b24gd2FzIGNsaWNrZWQgYmFzZWQgb24gdGhlIGRhdGEgdmFsdWUgc3RvcmVkIGluIHRoYXQgYnV0dG9uIG9iamVjdAotCSAgICAvLyBhbmQgaGFuZGxlIHByb2Nlc3NpbmcgZm9yIHRoYXQgYnV0dG9uLgotCSAgICB3aWRnZXREYXRhID0gZS53aWRnZXQuZ2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkJVVFRPTl9JRCk7Ci0JICAgIGlmICh3aWRnZXREYXRhID09IG51bGwpIHsKLQkJLy8gQSB3aWRnZXQgb3RoZXIgdGhhbiBhIGZpbGUgc2VsZWN0b3IgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZC4gSnVzdCBjYWxsCi0JCS8vIGZpcmVDb250ZW50c0NoYW5nZWQgdG8gZHJpdmUgZW5hYmxpbmcgdGhlIEFwcGx5L1JldmVydCBidXR0b25zLiBTaW5jZSB0aGUgd2lkZ2V0IGlzIHN1cHBvc2VkCi0JCS8vIHRvIGJlIGEgYnV0dG9uIHdpZGdldCwgbm8gdmFsaWRhdGlvbiBvZiB1c2VyIGRhdGEgaXMgbmVlZGVkLgotCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0JCWlmIChlLmdldFNvdXJjZSgpID09IG1wTXNnQXBpKSB7Ci0JCSAgICBzZXRNc2dBcGlEZXBlbmRlbnRzU3RhdGUoKTsKLQkJfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IG1wUmV0cnkpIHsKLQkJICAgIHNldFJldHJ5RGVwZW5kZW50c1N0YXRlKCk7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJc3dpdGNoICgoKEludGVnZXIpIHdpZGdldERhdGEpLmludFZhbHVlKCkpIHsKLQkJY2FzZSBNUF9JT05PREVGSUxFX1NFTEVDVE9SOgotCQkgICAgZ2V0SW5wdXRGaWxlKG1wSU9Ob2RlRmlsZSwgIkZpbGUubXBJT05vZGVGaWxlVGl0bGUiLCAibXBJT05vZGVGaWxlUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgUEVfU1RESU5fUEFUSF9TRUxFQ1RPUjoKLQkJICAgIGdldElucHV0RmlsZShwZVN0ZGluUGF0aCwgIkZpbGUucGVTdGRpblBhdGhUaXRsZSIsICJwZVN0ZGluUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgUEVfU1RET1VUX1BBVEhfU0VMRUNUT1I6Ci0JCSAgICBnZXRPdXRwdXRGaWxlKHBlU3Rkb3V0UGF0aCwgIkZpbGUucGVTdGRvdXRQYXRoVGl0bGUiLCAicGVTdGRvdXRQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBQRV9TVERFUlJfUEFUSF9TRUxFQ1RPUjoKLQkJICAgIGdldE91dHB1dEZpbGUocGVTdGRlcnJQYXRoLCAiRmlsZS5wZVN0ZGVyclBhdGhUaXRsZSIsICJwZVN0ZGVyclBhdGgiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE1QX0NPUkVESVJfU0VMRUNUT1I6Ci0JCSAgICBnZXREaXJlY3RvcnkobXBDb3JlRGlyLCAiRmlsZS5tcENvcmVkaXJUaXRsZSIsICJtcENvcmVkaXJQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBNUF9DTURGSUxFX1NFTEVDVE9SOgotCQkgICAgZ2V0SW5wdXRGaWxlKG1wQ21kRmlsZSwgIkZpbGUubXBDbWRmaWxlVGl0bGUiLCAibXBDbWRmaWxlUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgTVBfSE9TVEZJTEVfU0VMRUNUT1I6Ci0JCSAgICBnZXRJbnB1dEZpbGUobXBIb3N0RmlsZSwgIkZpbGUubXBIb3N0ZmlsZVRpdGxlIiwgIm1wSG9zdGZpbGVQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBNUF9SRU1PVEVESVJfU0VMRUNUT1I6Ci0JCSAgICBnZXRJbnB1dEZpbGUobXBSZW1vdGVEaXIsICJGaWxlLm1wUmVtb3RlZGlyVGl0bGUiLCAibXBSZW1vdGVkaXJQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBNUF9MTEZJTEVfU0VMRUNUT1I6Ci0JCSAgICBnZXRJbnB1dEZpbGUobXBMTEZpbGUsICJGaWxlLm1wTExGaWxlVGl0bGUiLCAibXBMTEZpbGVQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBNUF9FVUlMSUJQQVRIX1NFTEVDVE9SOgotCQkgICAgZ2V0SW5wdXRGaWxlKG1wRXVpTGliUGF0aCwgIkZpbGUubXBFdWlsaWJQYXRoVGl0bGUiLCAibXBFdWlsaWJQYXRoUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgTVBfU0FWRV9MTEZJTEVfU0VMRUNUT1I6Ci0JCSAgICBnZXRPdXRwdXRGaWxlKG1wU2F2ZUxMRmlsZSwgIkZpbGUubXBTYXZlTExGaWxlVGl0bGUiLCAibXBTYXZlTExGaWxlUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgTVBfU0FWRUhPU1RGSUxFX1NFTEVDVE9SOgotCQkgICAgZ2V0T3V0cHV0RmlsZShtcFNhdmVIb3N0RmlsZSwgIkZpbGUubXBTYXZlSG9zdEZpbGVUaXRsZSIsICJtcFNhdmVIb3N0RmlsZVBhdGgiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE1QX1JNTElCX1NFTEVDVE9SOgotCQkgICAgZ2V0SW5wdXRGaWxlKG1wUk1MaWIsICJGaWxlLnBlUk1MaWJUaXRsZSIsICJtcFJNTGliUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgUEVfRU5WX1NDUklQVF9TRUxFQ1RPUjoKLQkJICAgIGdldElucHV0RmlsZShwZUVudlNjcmlwdCwgIkZpbGUucGVFbnZTY3JpcHRUaXRsZSIsICJwZUVudlNjcmlwdFBhdGgiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE1QX1BST0ZESVJfU0VMRUNUT1I6Ci0JCSAgICBnZXREaXJlY3RvcnkobXBQcm9mRGlyLCAiRmlsZS5tcFByb2ZEaXJUaXRsZSIsICJtcFByb2ZEaXJQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBNUF9QUklPUklUWV9MT0dfRElSX1NFTEVDVE9SOgotCQkgICAgZ2V0RGlyZWN0b3J5KG1wUHJpb3JpdHlMb2dEaXIsICJGaWxlLm1wUHJpb3JpdHlMb2dEaXJUaXRsZSIsICJtcFByaW9yaXR5TG9nRGlyUGF0aCIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgTVBfQ0tQVERJUl9TRUxFQ1RPUjoKLQkJICAgIGdldERpcmVjdG9yeShtcENrcHREaXIsICJGaWxlLm1wQ2twdERpclRpdGxlIiwgIm1wQ2twdERpclBhdGgiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE1QX0NLUFRGSUxFX1NFTEVDVE9SOgotCQkgICAgZ2V0T3V0cHV0RmlsZShtcENrcHRGaWxlLCAiRmlsZS5tcENrcHRGaWxlVGl0bGUiLCAibXBDa3B0RmlsZVBhdGgiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE1QX1BNRExPR19ESVJfU0VMRUNUT1I6Ci0JCSAgICBnZXREaXJlY3RvcnkobXBQbWRMb2dEaXIsICJGaWxlLm1wUE1ETG9nRGlyVGl0bGUiLCAibXBQTURMb2dEaXJQYXRoIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBQRV9BRFZBTkNFRF9NT0RFX0NIRUNLQk9YOgotCQkgICAgc2V0TGF1bmNoUGFuZWxNb2RlKCk7Ci0JCSAgICB2YWxpZGF0ZUFsbEZpZWxkcygpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBldmVudHMgc2VudCB3aGVuIHJlZ2lzdGVyZWQgVGV4dCBhbmQgQ29tYm8gd2lkZ2V0cyBoYXZlIHRoZWlyIHRleHQgZmllbGQgbW9kaWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCXsKLQkgICAgLy8gVGV4dCBhbmQgQ29tYm8gd2lkZ2V0cyBzZW5kIE1vZGlmeUV2ZW50cyBhbnkgdGltZSB0aGVpciB0ZXh0IHZhbHVlIGlzIG1vZGlmaWVkLCBpbmNsdWRpbmcKLQkgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgbW9kaWZpZWQgYnkgYSBzZXRUZXh0KCkgY2FsbC4gVGhlIG9ubHkgdGltZSBNb2RpZnlFdmVudHMgYXJlIG9mIGludGVyZXN0IGlzCi0JICAgIC8vIHdoZW4gdGhlIHVzZXIgaGFzIGVudGVyZWQgdGV4dC4gQ29kZSB3aGljaCBjYWxscyBzZXRUZXh0KCkgb24gYSB3aWRnZXQgc2hvdWxkIHNldCB0aGUKLQkgICAgLy8gaWdub3JlTW9kaWZ5RXZlbnRzIGJlZm9yZSBjYWxsaW5nIHNldFRleHQoKSBhbmQgcmVzZXQgaWdub3JlTW9kaWZ5RXZlbnRzIGFmdGVyIHRoZSBjYWxsLgotCSAgICBzZXRGaWVsZFZhbGlkYXRpb25SZXF1aXJlZCgoV2lkZ2V0KSBlLmdldFNvdXJjZSgpKTsKLQkgICAgaWYgKCFpZ25vcmVNb2RpZnlFdmVudHMpIHsKLQkJdmFsaWRhdGVBbGxGaWVsZHMoKTsKLQkgICAgfQotCSAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSBtcFByaW9yaXR5KSB7Ci0JCXNldFByaW9yaXR5RGVwZW5kZW50c1N0YXRlKCk7Ci0JICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBtcFJldHJ5KSB7Ci0JCXNldFJldHJ5RGVwZW5kZW50c1N0YXRlKCk7Ci0JICAgIH0gZWxzZSBpZiAoKG1wTExGaWxlICE9IG51bGwpICYmIChtcExMRmlsZS5pc01hdGNoaW5nV2lkZ2V0KChXaWRnZXQpIGUuZ2V0U291cmNlKCkpKSkgewotCQlzZXRMTEZpbGVEZXBlbmRlbnRTdGF0ZSgpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHB1YmxpYyBQRVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIoSVJlc291cmNlTWFuYWdlciBybSkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNjYW5TYXZlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIGNhblNhdmUoQ29udHJvbCBjb250cm9sLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKQotICAgIHsKLQlpZiAoYWxsRmllbGRzVmFsaWQpIHsKLQkgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBlcnJvck1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGlyZWN0b3J5IHBhdGggZnJvbSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSBMYXVuY2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyBkaXJlY3RvcnkKLSAgICAgKiBAcmV0dXJuIERpcmVjdG9yeSBwYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZURpYWxvZ1BhdGgoU3RyaW5nIGF0dHJOYW1lKQotICAgIHsKLQlTdHJpbmcgZGlyOwotCi0JZGlyID0gIi8iOwotCWlmIChjdXJyZW50TGF1bmNoQ29uZmlnICE9IG51bGwpIHsKLQkgICAgdHJ5IHsKLQkJZGlyID0gY3VycmVudExhdW5jaENvbmZpZy5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUsICIvIik7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlkaXIgPSAiLyI7Ci0JICAgIH0KLQl9Ci0JcmV0dXJuIGRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGRpcmVjdG9yeSBwYXRoIGluIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGlzIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBwYXRoIERpcmVjdG9yeSBwYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVGaWxlRGlhbG9nUGF0aChTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBwYXRoKQotICAgIHsKLQlpZiAoY3VycmVudExhdW5jaENvbmZpZyAhPSBudWxsKSB7Ci0JICAgIGN1cnJlbnRMYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBwYXRoKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSBhIGZpbGUgc2VsZWN0b3IgZGlhbG9nIHByb21wdGluZyB0aGUgdXNlciBmb3IgdGhlIHBhdGggb2YgYW4gaW5wdXQgZmlsZS4gSWYgdGhlIHVzZXIgY2xpY2tzICdvcGVuJywgdGhlbgotICAgICAqIHNldCB0aGUgcGF0aG5hbWUgaW50byB0aGUgdGV4dCBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIEZpbGVTZWxlY3RvciBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIEZpbGVTZWxlY3RvciBvYmplY3QgdG8gaG9sZCBwYXRoIG5hbWUKLSAgICAgKiBAcGFyYW0gdGl0bGVJRCBUaXRsZSBmb3IgdGhlIGRpYWxvZwotICAgICAqIEBwYXJhbSBwYXRoQXR0cklEIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBpZCBmb3Igc2F2aW5nIHBhdGggaW5mbwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdldElucHV0RmlsZShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyB0aXRsZUlELCBTdHJpbmcgcGF0aEF0dHJJRCkKLSAgICB7Ci0JU3RyaW5nIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0KLQlpZiAocmVtb3RlVUlTZXJ2aWNlICE9IG51bGwpIHsKLQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZm1nciA9IHJlbW90ZVVJU2VydmljZS5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCWZtZ3Iuc2V0Q29ubmVjdGlvbihyZW1vdGVDb25uZWN0aW9uKTsKLQkJc2VsZWN0ZWRGaWxlID0gZm1nci5icm93c2VGaWxlKHBhcmVudFNoZWxsLCBNZXNzYWdlcy5nZXRTdHJpbmcodGl0bGVJRCksCi0JCQkJCQlnZXRGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklEKSkudG9TdHJpbmcoKTsKLQl9Ci0JaWYgKHNlbGVjdGVkRmlsZSAhPSBudWxsKSB7Ci0JICAgIHNhdmVGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklELCBzZWxlY3RlZEZpbGUpOwotCSAgICBzZWxlY3Rvci5zZXRQYXRoKHNlbGVjdGVkRmlsZSk7Ci0JICAgIHNlbGVjdG9yLnNldEZvY3VzKCk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXkgYSBmaWxlIHNlbGVjdG9yIGRpYWxvZyBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yIHRoZSBwYXRoIG9mIGFuIG91dHB1dCBmaWxlLiBJZiB0aGUgdXNlciBjbGlja3MgJ3NhdmUnLCB0aGVuCi0gICAgICogc2V0IHRoZSBwYXRobmFtZSBpbnRvIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgRmlsZVNlbGVjdG9yIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgRmlsZVNlbGVjdG9yIG9iamVjdCB0byBob2xkIHBhdGggbmFtZQotICAgICAqIEBwYXJhbSB0aXRsZUlEIFRpdGxlIGZvciB0aGUgZGlhbG9nCi0gICAgICogQHBhcmFtIHBhdGhBdHRySUQgTGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGlkIGZvciBzYXZpbmcgcGF0aCBpbmZvCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2V0T3V0cHV0RmlsZShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyB0aXRsZUlELCBTdHJpbmcgcGF0aEF0dHJJRCkKLSAgICB7Ci0JU3RyaW5nIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0KLQlpZiAocmVtb3RlVUlTZXJ2aWNlICE9IG51bGwpIHsKLQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZm1nciA9IHJlbW90ZVVJU2VydmljZS5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCWZtZ3Iuc2V0Q29ubmVjdGlvbihyZW1vdGVDb25uZWN0aW9uKTsKLQkJc2VsZWN0ZWRGaWxlID0gZm1nci5icm93c2VGaWxlKHBhcmVudFNoZWxsLCBNZXNzYWdlcy5nZXRTdHJpbmcodGl0bGVJRCksCi0JCQkJCQlnZXRGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklEKSkudG9TdHJpbmcoKTsKLQl9Ci0JaWYgKHNlbGVjdGVkRmlsZSAhPSBudWxsKSB7Ci0JICAgIHNhdmVGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklELCBzZWxlY3RlZEZpbGUpOwotCSAgICBzZWxlY3Rvci5zZXRQYXRoKHNlbGVjdGVkRmlsZSk7Ci0JICAgIHNlbGVjdG9yLnNldEZvY3VzKCk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXkgYSBkaXJlY3Rvcnkgc2VsZWN0b3IgZGlhbG9nIHByb21wdGluZyB0aGUgdXNlciBmb3IgdGhlIHBhdGhuYW1lIG9mIGEgZGlyZWN0b3J5LiBJZiB0aGUgdXNlciBjbG9ja3MgJ29rJywKLSAgICAgKiB0aGVuIHNldCB0aGUgcGF0aG5hbWUgaW50byB0aGUgdGV4dCBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIEZpbGVTZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBGaWxlU2VsZWN0b3Igb2JqZWN0IHRvIGJlIHVwZGF0ZWQKLSAgICAgKiBAcGFyYW0gdGl0bGVJRCBUaXRsZSBmb3IgdGhlIGRpYWxvZwotICAgICAqIEBwYXJhbSBwYXRoQXR0cklEIExhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBpZCBmb3Igc2F2aW5nIHBhdGggaW5mbwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdldERpcmVjdG9yeShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyB0aXRsZUlELCBTdHJpbmcgcGF0aEF0dHJJRCkKLSAgICB7Ci0JU3RyaW5nIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0KLQlpZiAocmVtb3RlVUlTZXJ2aWNlICE9IG51bGwpIHsKLQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZm1nciA9IHJlbW90ZVVJU2VydmljZS5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCWZtZ3Iuc2V0Q29ubmVjdGlvbihyZW1vdGVDb25uZWN0aW9uKTsKLQkJc2VsZWN0ZWRGaWxlID0gZm1nci5icm93c2VEaXJlY3RvcnkocGFyZW50U2hlbGwsIE1lc3NhZ2VzLmdldFN0cmluZyh0aXRsZUlEKSwKLQkJCQkJCWdldEZpbGVEaWFsb2dQYXRoKHBhdGhBdHRySUQpKS50b1N0cmluZygpOwotCX0KLQlpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLQkgICAgU3RyaW5nIHBhcmVudERpcjsKLQotCSAgICBwYXJlbnREaXIgPSBuZXcgRmlsZShzZWxlY3RlZEZpbGUpLmdldFBhcmVudCgpOwotCSAgICBpZiAocGFyZW50RGlyID09IG51bGwpIHsKLQkJc2F2ZUZpbGVEaWFsb2dQYXRoKHBhdGhBdHRySUQsICIvIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXNhdmVGaWxlRGlhbG9nUGF0aChwYXRoQXR0cklELCBwYXJlbnREaXIpOwotCSAgICB9Ci0JICAgIHNlbGVjdG9yLnNldFBhdGgoc2VsZWN0ZWRGaWxlKTsKLQkgICAgc2VsZWN0b3Iuc2V0Rm9jdXMoKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFyayB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBmb3IgdGhlIHNwZWNpZmllZCB3aWRnZXQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd2lkZ2V0IHZhbHVlIG11c3QgYmUgdmFsaWRhdGVkLgotICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHdpZGdldCB0byB2YWxpZGF0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGaWVsZFZhbGlkYXRpb25SZXF1aXJlZChXaWRnZXQgc291cmNlKQotICAgIHsKLQkvLyBJdGVyYXRlIHRocnUgdGhlIGxpc3Qgb2Ygd2lkZ2V0cyBsb29raW5nIGZvciB0aGUgd2lkZ2V0IHdoaWNoIG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4gV2hlbiBmb3VuZCwgc2V0Ci0JLy8gdGhhdCB3aWRnZXQncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHZhbGlkYXRpb24gaXMgbmVlZGVkLiBXaWRnZXQgY2xhc3MgbmVlZHMKLQkvLyB0byBiZSBjaGVja2VkIHNpbmNlIGFsdGhvdWdoIHRoZXNlIHdpZGdldHMgcGVyZm9ybSBzaW1pbGFyIGZ1bmN0aW9ucywgdGhleSBkbyBub3QgY29tcHJpc2UgYSBzZXQgb2YKLQkvLyBsb2dpY2FsbHkgcmVsYXRlZCB3aWRnZXRzIHRoYXQgY2FuIGJlIGVhc2lseSBvcmdhbml6ZWQgaW4gYSBjbGFzcyBoaWVyYXJjaHkuCi0JSXRlcmF0b3I8T2JqZWN0PiBpOwotCi0JaSA9IGFjdGl2ZVdpZGdldHMuaXRlcmF0b3IoKTsKLQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkgICAgT2JqZWN0IHdpZGdldDsKLQotCSAgICB3aWRnZXQgPSBpLm5leHQoKTsKLQkgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEJvb2xlYW5Sb3dXaWRnZXQpIHsKLQkJaWYgKCgoQm9vbGVhblJvd1dpZGdldCkgd2lkZ2V0KS5pc01hdGNoaW5nV2lkZ2V0KHNvdXJjZSkpIHsKLQkJICAgICgoQm9vbGVhblJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIENoZWNrYm94Um93V2lkZ2V0KSB7Ci0JCWlmICgoKENoZWNrYm94Um93V2lkZ2V0KSB3aWRnZXQpLmlzTWF0Y2hpbmdXaWRnZXQoc291cmNlKSkgewotCQkgICAgKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbWJvUm93V2lkZ2V0KSB7Ci0JCWlmICgoKENvbWJvUm93V2lkZ2V0KSB3aWRnZXQpLmlzTWF0Y2hpbmdXaWRnZXQoc291cmNlKSkgewotCQkgICAgKChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIER1YWxGaWVsZFJvd1dpZGdldCkgewotCQlpZiAoKChEdWFsRmllbGRSb3dXaWRnZXQpIHdpZGdldCkuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpKSB7Ci0JCSAgICAoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEZpbGVTZWxlY3RvclJvd1dpZGdldCkgewotCQlpZiAoKChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCkuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpKSB7Ci0JCSAgICAoKEZpbGVTZWxlY3RvclJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRleHRSb3dXaWRnZXQpIHsKLQkJaWYgKCgoVGV4dFJvd1dpZGdldCkgd2lkZ2V0KS5pc01hdGNoaW5nV2lkZ2V0KHNvdXJjZSkpIHsKLQkJICAgICgoVGV4dFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmsgYWxsIHdpZGdldCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd2lkZ2V0IHZhbHVlIGhhcyBjaGFuZ2VkLCBtZWFuaW5nIHZhbGlkYXRpb24gaXMKLSAgICAgKiByZXF1aXJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWFya0FsbEZpZWxkc0NoYW5nZWQoKQotICAgIHsKLQlJdGVyYXRvcjxPYmplY3Q+IGk7Ci0KLQlpID0gYWN0aXZlV2lkZ2V0cy5pdGVyYXRvcigpOwotCXdoaWxlIChpLmhhc05leHQoKSkgewotCSAgICBPYmplY3Qgd2lkZ2V0OwotCi0JICAgIHdpZGdldCA9IGkubmV4dCgpOwotCSAgICBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQm9vbGVhblJvd1dpZGdldCkgewotCQkoKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCkuc2V0VmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ2hlY2tib3hSb3dXaWRnZXQpIHsKLQkJKChDaGVja2JveFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkgICAgfQotCSAgICBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21ib1Jvd1dpZGdldCkgewotCQkoKENvbWJvUm93V2lkZ2V0KSB3aWRnZXQpLnNldFZhbGlkYXRpb25SZXF1aXJlZCgpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIER1YWxGaWVsZFJvd1dpZGdldCkgewotCQkoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KS5zZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLQkgICAgfQotCSAgICBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHsKLQkJKChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCkuc2V0VmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGV4dFJvd1dpZGdldCkgewotCQkoKFRleHRSb3dXaWRnZXQpIHdpZGdldCkuc2V0VmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSB0aGUgdGFiIHBhbmUgd2lkZ2V0IGFuZCBhbGwgY2hpbGRyZW4gb2YgdGhlIHRhYiBwYW5lLiBDYWxsaW5nIHNldEVuYWJsZWQoZmFsc2UpIG9uIHRoZSB0YWIgcGFuZSB3aWRnZXQKLSAgICAgKiBkaXNhYmxlcyB0aGUgdGFiIHBhbmUgYW5kIHByZXZlbnRzIGludGVyYWN0aW9uIHdpdGggY2hpbGQgd2lkZ2V0cywgYnV0IGRvZXMgbm90IGNoYW5nZSB0aGUgdmlzaWJsZSBzdGF0ZSBvZiB0aGUKLSAgICAgKiBjaGlsZCB3aWRnZXQuIFRoaXMgbWV0aG9kIGNoYW5nZXMgdGhlIHN0YXRlIG9mIGFsbCB3aWRnZXRzIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSB0aGV5IGFyZSBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aWRnZXQgVGhlIHdpZGdldCB0byBiZSBkaXNhYmxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVRhYlBhbmVXaWRnZXQoQ29udHJvbCB3aWRnZXQpCi0gICAgewotCUNvbnRyb2wgY2hpbGRyZW5bXTsKLQotCS8vIEZvciBhbnkgQ29tcG9zaXRlIHdpZGdldCwgcmVjdXJzaXZlbHkgY2FsbCB0aGlzIG1ldGhvZCBmb3IgZWFjaCBjaGlsZCBvZiB0aGUgQ29tcG9zaXRlLiBUaGlzIG11c3QgYmUKLQkvLyBkb25lIGJlZm9yZSBkaXNhYmxpbmcgdGhlIENvbXBvc2l0ZSBzaW5jZSBkaXNhYmxpbmcgdGhlIENvbXBvc2l0ZSBhbHNvIG1hcmtzIGl0cyBjaGlsZHJlbiBkaXNhYmxlZAotCS8vIGFuZCB0aGUgcmVhbCBlbmFibGUvZGlzYWJsZSBzdGF0ZSBvZiB0aGUgY2hpbGQgY2Fubm90IGJlIHByZXNlcnZlZC4KLQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JICAgIGNoaWxkcmVuID0gKChDb21wb3NpdGUpIHdpZGdldCkuZ2V0Q2hpbGRyZW4oKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlkaXNhYmxlVGFiUGFuZVdpZGdldChjaGlsZHJlbltpXSk7Ci0JICAgIH0KLQl9Ci0JLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdpZGdldCwgdGhlbiBkaXNhYmxlIGl0LgotCXdpZGdldC5zZXREYXRhKEVOQUJMRV9TVEFURSwgQm9vbGVhbi52YWx1ZU9mKHdpZGdldC5pc0VuYWJsZWQoKSkpOwotCXdpZGdldC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIHdpZGdldCBiYWNrIHRvIGl0cyBwcmV2aW91cyBlbmFibGUvZGlzYWJsZSBzdGF0ZQotICAgICAqCi0gICAgICogQHBhcmFtIHdpZGdldCBUaGUgd2lkZ2V0IHdob3NlIHN0YXRlIGlzIHRvIGJlIHJlc3RvcmVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlVGFiUGFuZVdpZGdldFN0YXRlKENvbnRyb2wgd2lkZ2V0KQotICAgIHsKLQlDb250cm9sIGNoaWxkcmVuW107Ci0JQm9vbGVhbiBzdGF0ZTsKLQlib29sZWFuIGVuYWJsZUZsYWc7Ci0KLQkvLyBHZXQgd2lkZ2V0J3MgcHJldmlvdXMgZW5hYmxlL2Rpc2FibGUgc3RhdGUuIElmIHRoZXJlIGlzIG5vIHNhdmVkIHN0YXRlLCBzdWNoIGFzIHdoZW4gaW5pdGlhbGx5Ci0JLy8gY3JlYXRpbmcgdGhlIHBhcmFsbGVsIHRhYiBpbiBiYXNpYyBtb2RlLCB0aGVuIGVuYWJsZSB0aGUgd2lkZ2V0LgotCXN0YXRlID0gKEJvb2xlYW4pIHdpZGdldC5nZXREYXRhKEVOQUJMRV9TVEFURSk7Ci0JaWYgKHN0YXRlID09IG51bGwpIHsKLQkgICAgZW5hYmxlRmxhZyA9IHRydWU7Ci0JfSBlbHNlIHsKLQkgICAgZW5hYmxlRmxhZyA9IHN0YXRlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQl3aWRnZXQuc2V0RW5hYmxlZChlbmFibGVGbGFnKTsKLQkvLyBSZWN1cnNpdmVseSBjYWxsIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBjaGlsZHJlbiBvZiBhIENvbXBvc2l0ZSB3aWRnZXQuIE5vdGUgdGhhdCBvcmRlcmluZyBvZiBwcm9jZXNzaW5nCi0JLy8gaGVyZSBkb2VzIG5vdCBtYXR0ZXIgc2luY2UgZW5hYmxpbmcgYSBDb21wb3NpdGUgd2lkZ2V0IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZW5hYmxlIGl0cyBjaGlsZHJlbi4KLQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JICAgIGNoaWxkcmVuID0gKChDb21wb3NpdGUpIHdpZGdldCkuZ2V0Q2hpbGRyZW4oKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlyZXN0b3JlVGFiUGFuZVdpZGdldFN0YXRlKGNoaWxkcmVuW2ldKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgbGF1bmNoIHBhbmVsIG1vZGUgYmFzZWQgb24gcGVBZHZhbmNlZE1vZGUgc2V0dGluZy4gSWYgY2hlY2tlZCwgdGhlbiBzZXQgYWR2YW5jZWQgbW9kZSwgd2hlcmUgdGhlIHVzZXIKLSAgICAgKiBzdXBwbGllcyBhIFBFIHNldHVwIHNjcmlwdC4gT3RoZXJ3aXNlIHNldCBiYXNpYyBtb2RlLCB3aGVyZSB0aGUgdXNlciBjaG9vc2VzIFBFIG9wdGlvbnMgZnJvbSBhIHRhYmJlZCBkaWFsb2cKLSAgICAgKiBwYW5lbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRMYXVuY2hQYW5lbE1vZGUoKQotICAgIHsKLQlpZiAocGVBZHZhbmNlZE1vZGUgIT0gbnVsbCkgewotCSAgICBpZiAocGVBZHZhbmNlZE1vZGUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJcGVFbnZTY3JpcHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZGlzYWJsZVRhYlBhbmVXaWRnZXQodGFiYmVkUGFuZSk7Ci0JICAgIH0gZWxzZSB7Ci0JCXBlRW52U2NyaXB0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXN0b3JlVGFiUGFuZVdpZGdldFN0YXRlKHRhYmJlZFBhbmUpOwotCSAgICB9Ci0JfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdGV4dCB3aWRnZXQgaW4gdGhlIHRhYmJlZCB2aWV3LiBUaGUgdGV4dCBmaWVsZCBzcGFucyBjb2x1bW5zIDIgYW5kIDMgb2YgdGhlIHRhYmJlZCBwYW5lLiBUaGUgbGFiZWwgYW5kCi0gICAgICogdG9vbHRpcCB0ZXh0IGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCB3aWRnZXQgKHRoZSBwYW5lIGluIHRoZSB0YWJiZWQgdmlldykKLSAgICAgKiBAcGFyYW0gcm0gUmVzb3VyY2UgbWFuYWdlciB1c2VkIGJ5IHRoaXMgbGF1bmNoIGNvbmZpZwotICAgICAqIEBwYXJhbSBpZCBBdHRyaWJ1dGUgaWQgZm9yIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0gICAgICogQHJldHVybiBUZXh0Um93V2lkZ2V0IGVudHJ5IHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgVGV4dFJvd1dpZGdldCBjcmVhdGVUZXh0V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBpZCkKLSAgICB7Ci0JVGV4dFJvd1dpZGdldCB3aWRnZXQ7Ci0JSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gYXR0cjsKLQotCXdpZGdldCA9IG51bGw7Ci0JYXR0ciA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQpOwotCWlmIChhdHRyICE9IG51bGwpIHsKLQkgICAgd2lkZ2V0ID0gbmV3IFRleHRSb3dXaWRnZXQocGFyZW50LCBpZCwgYXR0cik7Ci0JICAgIHdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCSAgICBhY3RpdmVXaWRnZXRzLmFkZCh3aWRnZXQpOwotCX0KLQlyZXR1cm4gd2lkZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRleHQgd2lkZ2V0IGluIHRoZSB0YWJiZWQgdmlldy4gVGhlIHRleHQgZmllbGQgc3BhbnMgY29sdW1ucyAyIGFuZCAzIG9mIHRoZSB0YWJiZWQgcGFuZS4gVGhlIGxhYmVsIGFuZAotICAgICAqIHRvb2x0aXAgdGV4dCBhcmUgb2J0YWluZWQgZnJvbSB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgd2lkZ2V0ICh0aGUgcGFuZSBpbiB0aGUgdGFiYmVkIHZpZXcpCi0gICAgICogQHBhcmFtIHJtIFJlc291cmNlIG1hbmFnZXIgdXNlZCBieSB0aGlzIGxhdW5jaCBjb25maWcKLSAgICAgKiBAcGFyYW0gaWQxIEF0dHJpYnV0ZSBpZCBmb3IgZmlyc3Qgcm0gYXR0cmlidXRlIHRoaXMgd2lkZ2V0IHJlcHJlc2VudHMKLSAgICAgKiBAcGFyYW0gaWQyIEF0dHJpYnV0ZSBpZCBmb3Igc2Vjb25kIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0gICAgICogQHJldHVybiBUZXh0IGVudHJ5IHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgRHVhbEZpZWxkUm93V2lkZ2V0IGNyZWF0ZUR1YWxGaWVsZChDb21wb3NpdGUgcGFyZW50LCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgaWQxLCBTdHJpbmcgaWQyKQotICAgIHsKLQlEdWFsRmllbGRSb3dXaWRnZXQgd2lkZ2V0OwotCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHIxOwotCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHIyOwotCi0Jd2lkZ2V0ID0gbnVsbDsKLQlhdHRyMSA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQxKTsKLQlhdHRyMiA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQyKTsKLQlpZiAoKGF0dHIxICE9IG51bGwpICYmIChhdHRyMiAhPSBudWxsKSkgewotCSAgICB3aWRnZXQgPSBuZXcgRHVhbEZpZWxkUm93V2lkZ2V0KHBhcmVudCwgaWQxLCBpZDIsIGF0dHIxLCBhdHRyMik7Ci0JICAgIHdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCSAgICBhY3RpdmVXaWRnZXRzLmFkZCh3aWRnZXQpOwotCX0KLQlyZXR1cm4gd2lkZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNoZWNrYm94IHdpZGdldCBpbiB0aGUgdGFiYmVkIHZpZXcuIFRoZSBjaGVja2JveCBpcyBpbiBjb2x1bW4gMiBhbmQgY29sdW1uIDMgaXMgYSBmaWxsZXIgKExhYmVsKSB3aWRnZXQuCi0gICAgICogVG8gZW5zdXJlIGNvbnNpc3RlbnQgYWxpZ25tZW50LCB0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgZXh0cmEgaG9yaXpvbnRhbCBzcGFjZSB0byB0aGUgMm5kIGNvbHVtbi4gVGhlIGxhYmVsIGFuZAotICAgICAqIHRvb2x0aXAgdGV4dCBhcmUgb2J0YWluZWQgZnJvbSB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgd2lkZ2V0ICh0aGUgcGFuZSBpbiB0aGUgdGFiYmVkIHZpZXcpCi0gICAgICogQHBhcmFtIHJtIFJlc291cmNlIG1hbmFnZXIgdXNlZCBieSB0aGlzIGxhdW5jaCBjb25maWcKLSAgICAgKiBAcGFyYW0gaWQgQXR0cmlidXRlIGlkIGZvciBybSBhdHRyaWJ1dGUgdGhpcyB3aWRnZXQgcmVwcmVzZW50cwotICAgICAqIEByZXR1cm4gQ2hlY2tib3ggYnV0dG9uIGZvciB0aGlzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByaXZhdGUgQ2hlY2tib3hSb3dXaWRnZXQgY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwgU3RyaW5nIGlkKQotICAgIHsKLQlDaGVja2JveFJvd1dpZGdldCB3aWRnZXQ7Ci0JU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyRGVmOwotCi0Jd2lkZ2V0ID0gbnVsbDsKLQlhdHRyRGVmID0gKFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24pIHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oaWQpOwotCWlmIChhdHRyRGVmICE9IG51bGwpIHsKLQkgICAgd2lkZ2V0ID0gbmV3IENoZWNrYm94Um93V2lkZ2V0KHBhcmVudCwgaWQsIGF0dHJEZWYpOwotCSAgICBhY3RpdmVXaWRnZXRzLmFkZCh3aWRnZXQpOwotCX0KLQlyZXR1cm4gd2lkZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHJhZGlvIGJ1dHRvbiBwYWlyIGluIHRoZSB0YWJiZWQgdmlldy4gVGhlIGxhYmVsLCBidXR0b24gbGFiZWxzLCBhbmQgdG9vbHRpcCB0ZXh0IGFyZSBvYnRhaW5lZCBmcm9tIHRoZQotICAgICAqIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IHdpZGdldCAodGhlIHBhbmUgaW4gdGhlIHRhYmJlZCB2aWV3KQotICAgICAqIEBwYXJhbSBybSBSZXNvdXJjZSBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBsYXVuY2ggY29uZmlnCi0gICAgICogQHBhcmFtIGlkIEF0dHJpYnV0ZSBpZCBmb3Igcm0gYXR0cmlidXRlIHRoaXMgd2lkZ2V0IHJlcHJlc2VudHMKLSAgICAgKiBAcmV0dXJuIENoZWNrYm94IGJ1dHRvbiBmb3IgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEJvb2xlYW5Sb3dXaWRnZXQgY3JlYXRlQm9vbGVhbk9wdGlvbihDb21wb3NpdGUgcGFyZW50LCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgaWQpCi0gICAgewotCUJvb2xlYW5Sb3dXaWRnZXQgd2lkZ2V0OwotCVN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLQotCXdpZGdldCA9IG51bGw7Ci0JYXR0ckRlZiA9IChTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uKSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGlkKTsKLQlpZiAoYXR0ckRlZiAhPSBudWxsKSB7Ci0JICAgIHdpZGdldCA9IG5ldyBCb29sZWFuUm93V2lkZ2V0KHBhcmVudCwgaWQsIGF0dHJEZWYsIC0xKTsKLQkgICAgd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JICAgIGFjdGl2ZVdpZGdldHMuYWRkKHdpZGdldCk7Ci0JfQotCXJldHVybiB3aWRnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdGV4dCBmaWVsZCBhbmQgcHVzaGJ1dHRvbiBpbiB0aGlzIHJvdy4gVGhlIHRleHQgZmllbGQgaXMgaW4gY29sdW1uIDIgYW5kIHRoZSBwdXNoYnV0dG9uIGluIGNvbHVtbiAzLiBUaGUKLSAgICAgKiB1c2VyIGVpdGhlciBmaWxscyBpbiB0aGUgdGV4dCBmaWVsZCB3aXRoIGEgcGF0aG5hbWUsIG9yIGNsaWNrcyB0aGUgYnV0dG9uIHRvIHBvcCB1cCBhIGZpbGUgc2VsZWN0b3IgZGlhbG9nIHRoYXQKLSAgICAgKiB0aGVuIGZpbGxzIGluIHRoZSB0ZXh0IGZpZWxkLiBUbyBlbnN1cmUgY29uc2lzdGVudCBhbGlnbm1lbnQsIHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBleHRyYSBob3Jpem9udGFsIHNwYWNlIHRvIHRoZQotICAgICAqIDJuZCBjb2x1bW4uIFRoZSBsYWJlbCBhbmQgdG9vbHRpcCB0ZXh0IGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCB3aWRnZXQgKHRoZSBwYW5lIGluIHRoZSB0YWJiZWQgdmlldykKLSAgICAgKiBAcGFyYW0gcm0gUmVzb3VyY2UgbWFuYWdlciB1c2VkIGJ5IHRoaXMgbGF1bmNoIGNvbmZpZwotICAgICAqIEBwYXJhbSBpZCBBdHRyaWJ1dGUgaWQgZm9yIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0gICAgICogQHBhcmFtIHNlbGVjdG9ySUQgSWRlbnRpZmllciB1c2VkIHRvIGlkZW50aWZ5IHRoZSBicm93c2UgYnV0dG9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpZGdldAotICAgICAqIEByZXR1cm4gVGV4dCBlbnRyeSBmaWVsZCBmb3IgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvclJvd1dpZGdldCBjcmVhdGVGaWxlU2VsZWN0b3IoQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwgU3RyaW5nIGlkLCBpbnQgc2VsZWN0b3JJRCkKLSAgICB7Ci0JRmlsZVNlbGVjdG9yUm93V2lkZ2V0IHdpZGdldDsKLQlTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHI7Ci0KLQl3aWRnZXQgPSBudWxsOwotCWF0dHIgPSAoU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbikgcm0uZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihpZCk7Ci0JaWYgKGF0dHIgIT0gbnVsbCkgewotCSAgICB3aWRnZXQgPSBuZXcgRmlsZVNlbGVjdG9yUm93V2lkZ2V0KHBhcmVudCwgaWQsIHNlbGVjdG9ySUQsIGF0dHIpOwotCSAgICB3aWRnZXQuc2V0RGF0YShpZCk7Ci0JICAgIHdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCSAgICB3aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQkgICAgYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQl9Ci0JcmV0dXJuIHdpZGdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21ib2JveCB3aWRnZXQgaW4gdGhlIHRhYmJlZCB2aWV3LiBUaGUgd2lkZ2V0IHNwYW5zIGNvbHVtbnMgMiBhbmQgMyBvZiB0aGUgdGFiYmVkIHBhbmUuIFRoZSBsYWJlbCBhbmQKLSAgICAgKiB0b29sdGlwIHRleHQgYXJlIG9idGFpbmVkIGZyb20gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IHdpZGdldCAodGhlIHBhbmUgaW4gdGhlIHRhYmJlZCB2aWV3KQotICAgICAqIEBwYXJhbSBybSBSZXNvdXJjZSBtYW5hZ2VyIHVzZWQgYnkgdGhpcyBsYXVuY2ggY29uZmlnCi0gICAgICogQHBhcmFtIGlkIEF0dHJpYnV0ZSBpZCBmb3Igcm0gYXR0cmlidXRlIHRoaXMgd2lkZ2V0IHJlcHJlc2VudHMKLSAgICAgKiBAcmV0dXJuIENvbWJvUm93V2lkZ2V0IHVzZWQgYnkgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIENvbWJvUm93V2lkZ2V0IGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBpZCkKLSAgICB7Ci0JQ29tYm9Sb3dXaWRnZXQgd2lkZ2V0OwotCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHI7Ci0KLQl3aWRnZXQgPSBudWxsOwotCWF0dHIgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGlkKTsKLQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JICAgIHdpZGdldCA9IG5ldyBDb21ib1Jvd1dpZGdldChwYXJlbnQsIGlkLCBhdHRyLCB0cnVlKTsKLQkgICAgd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JICAgIGFjdGl2ZVdpZGdldHMuYWRkKHdpZGdldCk7Ci0JfQotCXJldHVybiB3aWRnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGVkaXRhYmxlIGNvbWJvYm94IGluIHRoZSB0YWJiZWQgdmlldy4gVGhlIHdpZGdldCBzcGFucyBjb2x1bW5zIDIgYW5kIDMgb2YgdGhlIHRhYmJlZCBwYW5lLiBUaGUgbGFiZWwKLSAgICAgKiBhbmQgdG9vbHRpcCB0ZXh0IGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCB3aWRnZXQgKHRoZSBwYW5lIGluIHRoZSB0YWJiZWQgdmlldykKLSAgICAgKiBAcGFyYW0gcm0gUmVzb3VyY2UgbWFuYWdlciB1c2VkIGJ5IHRoaXMgbGF1bmNoIGNvbmZpZwotICAgICAqIEBwYXJhbSBpZCBBdHRyaWJ1dGUgaWQgZm9yIHJtIGF0dHJpYnV0ZSB0aGlzIHdpZGdldCByZXByZXNlbnRzCi0gICAgICogQHJldHVybiBFZGl0YWJsZSBDb21ib1Jvd1dpZGdldCB1c2VkIGJ5IHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21ib1Jvd1dpZGdldCBjcmVhdGVFZGl0YWJsZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBpZCkKLSAgICB7Ci0JQ29tYm9Sb3dXaWRnZXQgd2lkZ2V0OwotCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHI7Ci0KLQl3aWRnZXQgPSBudWxsOwotCWF0dHIgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGlkKTsKLQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JICAgIHdpZGdldCA9IG5ldyBDb21ib1Jvd1dpZGdldChwYXJlbnQsIGlkLCBhdHRyLCBmYWxzZSk7Ci0JICAgIHdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCSAgICB3aWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQkgICAgYWN0aXZlV2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQl9Ci0JcmV0dXJuIHdpZGdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCBhbGwgd2lkZ2V0cyB3aXRoaW4gdGhpcyBwYW5lIHRvIG51bGwgYXMgcGFydCBvZiBwYW5lbCBpbml0aWFsaXphdGlvbi4gRGVwZW5kaW5nIG9uIE9TIGFuZCBvcGVyYXRpb24gbW9kZQotICAgICAqICh3aXRoIG9yIHdpdGhvdXQgTG9hZExldmVsZXIpLCBzb21lIHdpZGdldHMgd2lsbCBub3QgYXBwZWFyIG9uIHRoZSBwYW5lbHMsIHdoZXJlIHRoZSBzZXQgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zCi0gICAgICogc2VudCBieSB0aGUgcHJveHkgZGV0ZXJtaW5lcyB0aGF0IHNldC4gTmV3IHdpZGdldHMgd2lsbCBiZSBnZW5lcmF0ZWQgb25seSB3aGVuIGEgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUKLSAgICAgKiBkZWZpbml0aW9uIGlzIHNlbnQgYnkgdGhlIHByb3h5LiBBbnkgY29kZSB3aGljaCBhY2Nlc3NlcyBhIHdpZGdldCBzaG91bGQgZW5zdXJlIHRoZSB3aWRnZXQgaXMgbm90IG51bGwgYmVmb3JlCi0gICAgICogYWNjZXNzaW5nIHRoZSB3aWRnZXQgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhckFsbFdpZGdldHMoKQotICAgIHsKLQltcElPQnVmZmVyU2l6ZSA9IG51bGw7Ci0JbXBJT05vZGVGaWxlID0gbnVsbDsKLQltcExhYmVsSU8gPSBudWxsOwotCW1wRGV2VHlwZSA9IG51bGw7Ci0JbXBQcmlvcml0eUxvZ0RpciA9IG51bGw7Ci0JbXBQcmlvcml0eUxvZ05hbWUgPSBudWxsOwotCW1wU3RkaW5Nb2RlID0gbnVsbDsKLQltcFN0ZG91dE1vZGUgPSBudWxsOwotCW1wSU9FcnJMb2cgPSBudWxsOwotCXBlU3BsaXRTdGRvdXQgPSBudWxsOwotCXBlU3RkaW5QYXRoID0gbnVsbDsKLQlwZVN0ZG91dFBhdGggPSBudWxsOwotCXBlU3RkZXJyUGF0aCA9IG51bGw7Ci0JbXBJbmZvTGV2ZWwgPSBudWxsOwotCW1wTEFQSVRyYWNlTGV2ZWwgPSBudWxsOwotCW1wUE1ETG9nID0gbnVsbDsKLQltcFByaW50RW52ID0gbnVsbDsKLQltcFByaW9yaXR5TG9nID0gbnVsbDsKLQltcFN0YXRpc3RpY3MgPSBudWxsOwotCW1wQ29yZURpciA9IG51bGw7Ci0JbXBDb3JlZmlsZUZvcm1hdCA9IG51bGw7Ci0JbXBDb3JlZmlsZVNpZ3Rlcm0gPSBudWxsOwotCW1wRGVidWdJbml0aWFsU3RvcCA9IG51bGw7Ci0JbXBEZWJ1Z05vdGltZW91dCA9IG51bGw7Ci0JbXBFdWlEZXZlbG9wID0gbnVsbDsKLQltcFByb2ZEaXIgPSBudWxsOwotCW1wQWRhcHRlclVzZSA9IG51bGw7Ci0JbXBDcHVVc2UgPSBudWxsOwotCW1wRXVpRGV2aWNlID0gbnVsbDsKLQltcEluc3RhbmNlcyA9IG51bGw7Ci0JbXBFdWlMaWIgPSBudWxsOwotCW1wQ21kRmlsZSA9IG51bGw7Ci0JbXBIb3N0RmlsZSA9IG51bGw7Ci0JbXBOb2RlcyA9IG51bGw7Ci0JbXBQZ21Nb2RlbCA9IG51bGw7Ci0JbXBQcm9jcyA9IG51bGw7Ci0JbXBSZW1vdGVEaXIgPSBudWxsOwotCW1wVGFza3NQZXJOb2RlID0gbnVsbDsKLQltcExMRmlsZSA9IG51bGw7Ci0JbXBOZXdKb2IgPSBudWxsOwotCW1wUk1Qb29sID0gbnVsbDsKLQltcFJldHJ5ID0gbnVsbDsKLQltcFJldHJ5Q291bnQgPSBudWxsOwotCW1wQWNrVGhyZXNoID0gbnVsbDsKLQlwZUJ1ZmZlck1lbSA9IG51bGw7Ci0JbXBDQ1NjcmF0Y2hCdWYgPSBudWxsOwotCW1wQ1NTSW50ZXJydXB0ID0gbnVsbDsKLQltcEVhZ2VyTGltaXQgPSBudWxsOwotCW1wTXNnRW52ZWxvcGVCdWYgPSBudWxsOwotCW1wUG9sbGluZ0ludGVydmFsID0gbnVsbDsKLQltcFByaW9yaXR5ID0gbnVsbDsKLQltcFByaW9yaXR5TlRQID0gbnVsbDsKLQlwZVJETUFDb3VudCA9IG51bGw7Ci0JbXBSZXRyYW5zbWl0SW50ZXJ2YWwgPSBudWxsOwotCW1wUmV4bWl0QnVmQ250ID0gbnVsbDsKLQltcFJleG1pdEJ1ZlNpemUgPSBudWxsOwotCW1wU2hhcmVkTWVtb3J5ID0gbnVsbDsKLQltcFNpbmdsZVRocmVhZCA9IG51bGw7Ci0JbXBUYXNrQWZmaW5pdHkgPSBudWxsOwotCW1wVURQUGFja2V0U2l6ZSA9IG51bGw7Ci0JbXBXYWl0TW9kZSA9IG51bGw7Ci0JbXBVc2VCdWxrWGZlciA9IG51bGw7Ci0JbXBCdWxrTWluTXNnU2l6ZSA9IG51bGw7Ci0JbXBDbG9ja1NvdXJjZSA9IG51bGw7Ci0JbXBFdWlMaWJQYXRoID0gbnVsbDsKLQltcEhpbnRzRmlsdGVyZWQgPSBudWxsOwotCW1wTXNnQXBpID0gbnVsbDsKLQltcFB1bHNlID0gbnVsbDsKLQltcFRocmVhZFN0YWNrU2l6ZSA9IG51bGw7Ci0JbXBUaW1lb3V0ID0gbnVsbDsKLQltcFRMUFJlcXVpcmVkID0gbnVsbDsKLQltcFNhdmVMTEZpbGUgPSBudWxsOwotCW1wU2F2ZUhvc3RGaWxlID0gbnVsbDsKLQltcFJNTGliID0gbnVsbDsKLQltcENrcHREaXIgPSBudWxsOwotCW1wQ2twdEZpbGUgPSBudWxsOwotCW1wQ2twdERpclBlclRhc2sgPSBudWxsOwotCW1wUG1kTG9nRGlyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgZW5hYmxlIHN0YXRlIGZvciB3aWRnZXRzIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gdGhlIHNldHRpbmcgZm9yIG1wUHJpb3JpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByaW9yaXR5RGVwZW5kZW50c1N0YXRlKCkKLSAgICB7Ci0JaWYgKChtcFByaW9yaXR5LmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgfHwKLQkJKG1wUHJpb3JpdHkuZ2V0VmFsdWUoKS5lcXVhbHMoZ2V0RGVmYXVsdEF0dHJpYnV0ZVZhbHVlKGN1cnJlbnRSTSwgTVBfUFJJT1JJVFkpKSkpIHsKLQkgICAgaWYgKG1wUHJpb3JpdHlMb2cgIT0gbnVsbCkgewotCQltcFByaW9yaXR5TG9nLnNldEVuYWJsZWQoZmFsc2UpOwotCSAgICB9Ci0JICAgIGlmIChtcFByaW9yaXR5TlRQICE9IG51bGwpIHsKLQkJbXBQcmlvcml0eU5UUC5zZXRFbmFibGVkKGZhbHNlKTsKLQkgICAgfQotCSAgICBpZiAobXBQcmlvcml0eUxvZ0RpciAhPSBudWxsKSB7Ci0JCW1wUHJpb3JpdHlMb2dEaXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgIH0KLQkgICAgaWYgKG1wUHJpb3JpdHlMb2dOYW1lICE9IG51bGwpIHsKLQkJbXBQcmlvcml0eUxvZ05hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIGlmIChtcFByaW9yaXR5TG9nICE9IG51bGwpIHsKLQkJbXBQcmlvcml0eUxvZy5zZXRFbmFibGVkKHRydWUpOwotCSAgICB9Ci0JICAgIGlmIChtcFByaW9yaXR5TlRQICE9IG51bGwpIHsKLQkJbXBQcmlvcml0eU5UUC5zZXRFbmFibGVkKHRydWUpOwotCSAgICB9Ci0JICAgIGlmIChtcFByaW9yaXR5TG9nRGlyICE9IG51bGwpIHsKLQkJbXBQcmlvcml0eUxvZ0Rpci5zZXRFbmFibGVkKHRydWUpOwotCSAgICB9Ci0JICAgIGlmIChtcFByaW9yaXR5TG9nTmFtZSAhPSBudWxsKSB7Ci0JCW1wUHJpb3JpdHlMb2dOYW1lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldCBlbmFibGUgc3RhdGUgZm9yIHdpZGdldHMgd2hpY2ggYXJlIGRlcGVuZGVudCBvbiB0aGUgc2V0dGluZyBmb3IgbXBNc2dBcGkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TXNnQXBpRGVwZW5kZW50c1N0YXRlKCkKLSAgICB7Ci0JaWYgKG1wTXNnQXBpLmdldFZhbHVlKCkuZXF1YWxzKCJNUEksTEFQSSIpKSB7Ci0JICAgIGlmIChwZVJETUFDb3VudCAhPSBudWxsKSB7Ci0JCXBlUkRNQUNvdW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIGlmIChwZVJETUFDb3VudCAhPSBudWxsKSB7Ci0JCXBlUkRNQUNvdW50LnNldEVuYWJsZWQoZmFsc2UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBlbmFibGUgc3RhdGUgZm9yIE1QX1JFVFJZX0NPVU5ULCB3aGVyZSBpdCBpcyBub3QgZW5hYmxlZCBpZiBNUF9SRVRSWSA9ICd3YWl0JyBhbmQKLSAgICAgKiBlbmFibGVkIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UmV0cnlEZXBlbmRlbnRzU3RhdGUoKQotICAgIHsKLQlpZiAobXBSZXRyeUNvdW50ICE9IG51bGwpIHsKLQkgICAgaWYgKG1wUmV0cnkuZ2V0VmFsdWUoKS5lcXVhbHMoIndhaXQiKSkgewotCQltcFJldHJ5Q291bnQuc2V0RW5hYmxlZCh0cnVlKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJbXBSZXRyeUNvdW50LnNldEVuYWJsZWQoZmFsc2UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBlbmFibGUgc3RhdGUgZm9yIHdpZGdldHMgZGVwZW5kZW50IG9uIE1QX0xMRklMRSBzZXR0aW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldExMRmlsZURlcGVuZGVudFN0YXRlKCkKLSAgICB7Ci0JYm9vbGVhbiBlbmFibGVTdGF0ZTsKLQotCWlmICgobXBMTEZpbGUgIT0gbnVsbCkgJiYgKG1wTExGaWxlLmdldFZhbHVlKCkubGVuZ3RoKCkgPiAwKSkgewotCSAgICBlbmFibGVTdGF0ZSA9IGZhbHNlOwotCX0KLQllbHNlIHsKLQkgICAgZW5hYmxlU3RhdGUgPSB0cnVlOwotCX0KLQlpZiAoKG1wTXNnQXBpICE9IG51bGwpICYmICghbXBNc2dBcGkuZ2V0VmFsdWUoKS5lcXVhbHMoIk1QSSxMQVBJIikpKSB7Ci0JICAgIGlmIChwZVJETUFDb3VudCAhPSBudWxsKSB7Ci0JCXBlUkRNQUNvdW50LnNldEVuYWJsZWQoZW5hYmxlU3RhdGUpOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgaWYgKHBlUkRNQUNvdW50ICE9IG51bGwpIHsKLQkJcGVSRE1BQ291bnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgIH0KLQl9Ci0JaWYgKG1wQWRhcHRlclVzZSAhPSBudWxsKSB7Ci0JICAgIG1wQWRhcHRlclVzZS5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JaWYgKG1wQ3B1VXNlICE9IG51bGwpIHsKLQkgICAgbXBDcHVVc2Uuc2V0RW5hYmxlZChlbmFibGVTdGF0ZSk7Ci0JfQotCWlmIChtcEV1aURldmljZSAhPSBudWxsKSB7Ci0JICAgIG1wRXVpRGV2aWNlLnNldEVuYWJsZWQoZW5hYmxlU3RhdGUpOwotCX0KLQlpZiAobXBFdWlMaWIgIT0gbnVsbCkgewotCSAgICBtcEV1aUxpYi5zZXRFbmFibGVkKGVuYWJsZVN0YXRlKTsKLQl9Ci0JaWYgKG1wSW5zdGFuY2VzICE9IG51bGwpIHsKLQkgICAgbXBJbnN0YW5jZXMuc2V0RW5hYmxlZChlbmFibGVTdGF0ZSk7Ci0JfQotCWlmIChtcE5vZGVzICE9IG51bGwpIHsKLQkgICAgbXBOb2Rlcy5zZXRFbmFibGVkKGVuYWJsZVN0YXRlKTsKLQl9Ci0JaWYgKG1wUHJvY3MgIT0gbnVsbCkgewotCSAgICBtcFByb2NzLnNldEVuYWJsZWQoZW5hYmxlU3RhdGUpOwotCX0KLQlpZiAobXBSTVBvb2wgIT0gbnVsbCkgewotCSAgICBtcFJNUG9vbC5zZXRFbmFibGVkKGVuYWJsZVN0YXRlKTsKLQl9Ci0JaWYgKG1wVGFza3NQZXJOb2RlICE9IG51bGwpIHsKLQkgICAgbXBUYXNrc1Blck5vZGUuc2V0RW5hYmxlZChlbmFibGVTdGF0ZSk7Ci0JfQotCWlmIChtcFRhc2tBZmZpbml0eSAhPSBudWxsKSB7Ci0JICAgIG1wVGFza0FmZmluaXR5LnNldEVuYWJsZWQoZW5hYmxlU3RhdGUpOwotCX0KLQlpZiAobXBVc2VCdWxrWGZlciAhPSBudWxsKSB7Ci0JICAgIG1wVXNlQnVsa1hmZXIuc2V0RW5hYmxlZChlbmFibGVTdGF0ZSk7Ci0JfQotCWlmIChtcFNhdmVMTEZpbGUgIT0gbnVsbCkgewotCSAgICBtcFNhdmVMTEZpbGUuc2V0RW5hYmxlZChlbmFibGVTdGF0ZSk7Ci0JfQotCWlmIChtcFNhdmVIb3N0RmlsZSAhPSBudWxsKSB7Ci0JICAgIG1wU2F2ZUhvc3RGaWxlLnNldEVuYWJsZWQoZW5hYmxlU3RhdGUpOwotCX0KLSAgICB9Ci0gICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGxheW91dCBvYmplY3QgZm9yIGEgcGFuZSBpbiB0aGUgVGFiRm9sZGVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIExheW91dCBmb3IgdXNlIGluIHRoZSB0YWJiZWQgcGFuZQotICAgICAqLwotICAgIHByaXZhdGUgTGF5b3V0IGNyZWF0ZVRhYlBhbmVMYXlvdXQoKQotICAgIHsKLQlHcmlkTGF5b3V0IGxheW91dDsKLQotCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSA0OwotCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDg7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDQ7Ci0JcmV0dXJuIGxheW91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRhc2tzIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUYXNrc1RhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlUYWJJdGVtIHRhYjsKLQotCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YXNrc1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbCh0YXNrc1RhYlBhbmUpOwotCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVGFza3NUYWIudGl0bGUiKSk7Ci0JdGFza3NUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCW1wSG9zdEZpbGUgPSBjcmVhdGVGaWxlU2VsZWN0b3IodGFza3NUYWJQYW5lLCBybSwgTVBfSE9TVEZJTEUsIE1QX0hPU1RGSUxFX1NFTEVDVE9SKTsKLQltcFByb2NzID0gY3JlYXRlVGV4dFdpZGdldCh0YXNrc1RhYlBhbmUsIHJtLCBNUF9QUk9DUyk7Ci0JbXBOb2RlcyA9IGNyZWF0ZVRleHRXaWRnZXQodGFza3NUYWJQYW5lLCBybSwgTVBfTk9ERVMpOwotCW1wVGFza3NQZXJOb2RlID0gY3JlYXRlVGV4dFdpZGdldCh0YXNrc1RhYlBhbmUsIHJtLCBNUF9UQVNLU19QRVJfTk9ERSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgSS9PIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVJT1RhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlUYWJJdGVtIHRhYjsKLQotCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQlpb1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbChpb1RhYlBhbmUpOwotCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiSU9UYWIudGl0bGUiKSk7Ci0JaW9UYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCW1wU3RkaW5Nb2RlID0gY3JlYXRlRWRpdGFibGVDb21ib2JveChpb1RhYlBhbmUsIHJtLCBNUF9TVERJTk1PREUpOwotCW1wU3Rkb3V0TW9kZSA9IGNyZWF0ZUVkaXRhYmxlQ29tYm9ib3goaW9UYWJQYW5lLCBybSwgTVBfU1RET1VUTU9ERSk7Ci0JbXBMYWJlbElPID0gY3JlYXRlQm9vbGVhbk9wdGlvbihpb1RhYlBhbmUsIHJtLCBNUF9MQUJFTElPKTsKLQlwZVNwbGl0U3Rkb3V0ID0gY3JlYXRlQm9vbGVhbk9wdGlvbihpb1RhYlBhbmUsIHJtLCBQRV9TUExJVF9TVERPVVQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZGlhZ25vc3RpY3MgdGFiIG9mIHRoZSBhdHRyaWJ1dGVzIHBhbmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBybSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURpYWdub3N0aWNUYWIoSVJlc291cmNlTWFuYWdlciBybSkKLSAgICB7Ci0JVGFiSXRlbSB0YWI7Ci0KLQl0YWIgPSBuZXcgVGFiSXRlbSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0JZGlhZ1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbChkaWFnVGFiUGFuZSk7Ci0JdGFiLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJESUFHVGFiLnRpdGxlIikpOwotCWRpYWdUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCW1wUG1kTG9nRGlyID0gY3JlYXRlRmlsZVNlbGVjdG9yKGRpYWdUYWJQYW5lLCBybSwgTVBfUE1ETE9HX0RJUiwgTVBfUE1ETE9HX0RJUl9TRUxFQ1RPUik7Ci0JbXBJbmZvTGV2ZWwgPSBjcmVhdGVDb21ib2JveChkaWFnVGFiUGFuZSwgcm0sIE1QX0lORk9MRVZFTCk7Ci0JbXBQcmludEVudiA9IGNyZWF0ZUVkaXRhYmxlQ29tYm9ib3goZGlhZ1RhYlBhbmUsIHJtLCBNUF9QUklOVEVOVik7Ci0JbXBQTURMb2cgPSBjcmVhdGVCb29sZWFuT3B0aW9uKGRpYWdUYWJQYW5lLCBybSwgTVBfUE1ETE9HKTsKLQltcFByaW9yaXR5TG9nID0gY3JlYXRlQm9vbGVhbk9wdGlvbihkaWFnVGFiUGFuZSwgcm0sIE1QX1BSSU9SSVRZX0xPRyk7Ci0JbXBTdGF0aXN0aWNzID0gY3JlYXRlQ29tYm9ib3goZGlhZ1RhYlBhbmUsIHJtLCBNUF9TVEFUSVNUSUNTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGRlYnVnIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEZWJ1Z1RhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlUYWJJdGVtIHRhYjsKLQotCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQlkZWJ1Z1RhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbChkZWJ1Z1RhYlBhbmUpOwotCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiREVCVUdUYWIudGl0bGUiKSk7Ci0JZGVidWdUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCW1wRXVpRGV2ZWxvcCA9IGNyZWF0ZUNvbWJvYm94KGRlYnVnVGFiUGFuZSwgcm0sIE1QX0VVSURFVkVMT1ApOwotCW1wQ29yZWZpbGVGb3JtYXQgPSBjcmVhdGVFZGl0YWJsZUNvbWJvYm94KGRlYnVnVGFiUGFuZSwgcm0sIE1QX0NPUkVGSUxFX0ZPUk1BVCk7Ci0JbXBDb3JlRGlyID0gY3JlYXRlRmlsZVNlbGVjdG9yKGRlYnVnVGFiUGFuZSwgcm0sIE1QX0NPUkVESVIsIE1QX0NPUkVESVJfU0VMRUNUT1IpOwotCW1wUHJvZkRpciA9IGNyZWF0ZUZpbGVTZWxlY3RvcihkZWJ1Z1RhYlBhbmUsIHJtLCBNUF9QUk9GRElSLCBNUF9QUk9GRElSX1NFTEVDVE9SKTsKLQltcERlYnVnSW5pdGlhbFN0b3AgPSBjcmVhdGVUZXh0V2lkZ2V0KGRlYnVnVGFiUGFuZSwgcm0sIE1QX0RFQlVHX0lOSVRJQUxfU1RPUCk7Ci0JbXBEZWJ1Z05vdGltZW91dCA9IGNyZWF0ZUJvb2xlYW5PcHRpb24oZGVidWdUYWJQYW5lLCBybSwgTVBfREVCVUdfTk9USU1FT1VUKTsKLQltcENvcmVmaWxlU2lndGVybSA9IGNyZWF0ZUJvb2xlYW5PcHRpb24oZGVidWdUYWJQYW5lLCBybSwgTVBfQ09SRUZJTEVfU0lHVEVSTSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBzeXN0ZW0gcmVzb3VyY2VzIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTeXN0ZW1UYWIoSVJlc291cmNlTWFuYWdlciBybSkKLSAgICB7Ci0JVGFiSXRlbSB0YWI7Ci0KLQl0YWIgPSBuZXcgVGFiSXRlbSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0Jc3lzdGVtVGFiUGFuZSA9IG5ldyBDb21wb3NpdGUodGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCXRhYi5zZXRDb250cm9sKHN5c3RlbVRhYlBhbmUpOwotCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiU1lTVGFiLnRpdGxlIikpOwotCXN5c3RlbVRhYlBhbmUuc2V0TGF5b3V0KGNyZWF0ZVRhYlBhbmVMYXlvdXQoKSk7Ci0JbXBFdWlEZXZpY2UgPSBjcmVhdGVDb21ib2JveChzeXN0ZW1UYWJQYW5lLCBybSwgTVBfRVVJREVWSUNFKTsKLQltcEV1aUxpYiA9IGNyZWF0ZUNvbWJvYm94KHN5c3RlbVRhYlBhbmUsIHJtLCBNUF9FVUlMSUIpOwotCW1wSW5zdGFuY2VzID0gY3JlYXRlRWRpdGFibGVDb21ib2JveChzeXN0ZW1UYWJQYW5lLCBybSwgTVBfSU5TVEFOQ0VTKTsKLQltcEFkYXB0ZXJVc2UgPSBjcmVhdGVCb29sZWFuT3B0aW9uKHN5c3RlbVRhYlBhbmUsIHJtLCBNUF9BREFQVEVSX1VTRSk7Ci0JbXBDcHVVc2UgPSBjcmVhdGVCb29sZWFuT3B0aW9uKHN5c3RlbVRhYlBhbmUsIHJtLCBNUF9DUFVfVVNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIG5vZGUgYWxsb2NhdGlvbiB0YWIgb2YgdGhlIGF0dHJpYnV0ZXMgcGFuZQotICAgICAqCi0gICAgICogQHBhcmFtIHJtIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTm9kZUFsbG9jYXRpb25UYWIoSVJlc291cmNlTWFuYWdlciBybSkKLSAgICB7Ci0JVGFiSXRlbSB0YWI7Ci0KLQl0YWIgPSBuZXcgVGFiSXRlbSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0Jbm9kZVRhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbChub2RlVGFiUGFuZSk7Ci0JdGFiLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOT0RFVGFiLnRpdGxlIikpOwotCW5vZGVUYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCW1wQ21kRmlsZSA9IGNyZWF0ZUZpbGVTZWxlY3Rvcihub2RlVGFiUGFuZSwgcm0sIE1QX0NNREZJTEUsIE1QX0NNREZJTEVfU0VMRUNUT1IpOwotCW1wUmVtb3RlRGlyID0gY3JlYXRlRmlsZVNlbGVjdG9yKG5vZGVUYWJQYW5lLCBybSwgTVBfUkVNT1RFRElSLCBNUF9SRU1PVEVESVJfU0VMRUNUT1IpOwotCW1wTExGaWxlID0gY3JlYXRlRmlsZVNlbGVjdG9yKG5vZGVUYWJQYW5lLCBybSwgTVBfTExGSUxFLCBNUF9MTEZJTEVfU0VMRUNUT1IpOwotCW1wUk1Qb29sID0gY3JlYXRlVGV4dFdpZGdldChub2RlVGFiUGFuZSwgcm0sIE1QX1JNUE9PTCk7Ci0JbXBSZXRyeUNvdW50ID0gY3JlYXRlVGV4dFdpZGdldChub2RlVGFiUGFuZSwgcm0sIE1QX1JFVFJZX0NPVU5UKTsKLQltcFBnbU1vZGVsID0gY3JlYXRlQ29tYm9ib3gobm9kZVRhYlBhbmUsIHJtLCBNUF9QR01NT0RFTCk7Ci0JbXBSZXRyeSA9IGNyZWF0ZUVkaXRhYmxlQ29tYm9ib3gobm9kZVRhYlBhbmUsIHJtLCBNUF9SRVRSWSk7Ci0JbXBOZXdKb2IgPSBjcmVhdGVCb29sZWFuT3B0aW9uKG5vZGVUYWJQYW5lLCBybSwgTVBfTkVXSk9CKTsKLQlpZiAobXBMTEZpbGUgIT0gbnVsbCkgewotCSAgICBtcExMRmlsZS5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGZpcnN0IHBlcmZvcm1hbmNlIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lLiBEdWUgdG8gdGhlIG51bWJlciBvZiBwZXJmb3JtYW5jZSByZWxhdGVkIGF0dHJpYnV0ZXMsCi0gICAgICogdGhlcmUgYXJlIHR3byBwZXJmb3JtYW5jZSB0YWJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJtIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGVyZm9ybWFuY2VUYWIxKElSZXNvdXJjZU1hbmFnZXIgcm0pCi0gICAgewotCVRhYkl0ZW0gdGFiOwotCi0JdGFiID0gbmV3IFRhYkl0ZW0odGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCXBlcmZvcm1hbmNlVGFiMVBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbChwZXJmb3JtYW5jZVRhYjFQYW5lKTsKLQl0YWIuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFUkZUYWIxLnRpdGxlIikpOwotCXBlcmZvcm1hbmNlVGFiMVBhbmUuc2V0TGF5b3V0KGNyZWF0ZVRhYlBhbmVMYXlvdXQoKSk7Ci0JbXBBY2tUaHJlc2ggPSBjcmVhdGVUZXh0V2lkZ2V0KHBlcmZvcm1hbmNlVGFiMVBhbmUsIHJtLCBNUF9BQ0tfVEhSRVNIKTsKLQltcFBvbGxpbmdJbnRlcnZhbCA9IGNyZWF0ZVRleHRXaWRnZXQocGVyZm9ybWFuY2VUYWIxUGFuZSwgcm0sIE1QX1BPTExJTkdfSU5URVJWQUwpOwotCW1wUHJpb3JpdHkgPSBjcmVhdGVUZXh0V2lkZ2V0KHBlcmZvcm1hbmNlVGFiMVBhbmUsIHJtLCBNUF9QUklPUklUWSk7Ci0JbXBCdWxrTWluTXNnU2l6ZSA9IGNyZWF0ZVRleHRXaWRnZXQocGVyZm9ybWFuY2VUYWIxUGFuZSwgcm0sIE1QX0JVTEtfTUlOX01TR19TSVpFKTsKLQltcFVEUFBhY2tldFNpemUgPSBjcmVhdGVUZXh0V2lkZ2V0KHBlcmZvcm1hbmNlVGFiMVBhbmUsIHJtLCBNUF9VRFBfUEFDS0VUX1NJWkUpOwotCXBlUkRNQUNvdW50ID0gY3JlYXRlRHVhbEZpZWxkKHBlcmZvcm1hbmNlVGFiMVBhbmUsIHJtLCBQRV9SRE1BX0NPVU5ULCBQRV9SRE1BX0NPVU5UXzIpOwotCW1wV2FpdE1vZGUgPSBjcmVhdGVDb21ib2JveChwZXJmb3JtYW5jZVRhYjFQYW5lLCBybSwgTVBfV0FJVF9NT0RFKTsKLQltcFByaW9yaXR5TlRQID0gY3JlYXRlQm9vbGVhbk9wdGlvbihwZXJmb3JtYW5jZVRhYjFQYW5lLCBybSwgTVBfUFJJT1JJVFlfTlRQKTsKLQltcENDU2NyYXRjaEJ1ZiA9IGNyZWF0ZUJvb2xlYW5PcHRpb24ocGVyZm9ybWFuY2VUYWIxUGFuZSwgcm0sIE1QX0NDX1NDUkFUQ0hfQlVGKTsKLQltcENTU0ludGVycnVwdCA9IGNyZWF0ZUJvb2xlYW5PcHRpb24ocGVyZm9ybWFuY2VUYWIxUGFuZSwgcm0sIE1QX0NTU19JTlRFUlJVUFQpOwotCW1wVXNlQnVsa1hmZXIgPSBjcmVhdGVCb29sZWFuT3B0aW9uKHBlcmZvcm1hbmNlVGFiMVBhbmUsIHJtLCBNUF9VU0VfQlVMS19YRkVSKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHNlY29uZCBwZXJmb3JtYW5jZSB0YWIgZm9yIHRoZSBhdHRyaWJ1dGVzIHBhbmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBybSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVBlcmZvcm1hbmNlVGFiMihJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlUYWJJdGVtIHRhYjsKLQotCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQlwZXJmb3JtYW5jZVRhYjJQYW5lID0gbmV3IENvbXBvc2l0ZSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0JdGFiLnNldENvbnRyb2wocGVyZm9ybWFuY2VUYWIyUGFuZSk7Ci0JdGFiLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRVJGVGFiMi50aXRsZSIpKTsKLQlwZXJmb3JtYW5jZVRhYjJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCXBlQnVmZmVyTWVtID0gY3JlYXRlRHVhbEZpZWxkKHBlcmZvcm1hbmNlVGFiMlBhbmUsIHJtLCBQRV9CVUZGRVJfTUVNLCBQRV9CVUZGRVJfTUVNX01BWCk7Ci0JbXBNc2dFbnZlbG9wZUJ1ZiA9IGNyZWF0ZVRleHRXaWRnZXQocGVyZm9ybWFuY2VUYWIyUGFuZSwgcm0sIE1QX01TR19FTlZFTE9QRV9CVUYpOwotCW1wRWFnZXJMaW1pdCA9IGNyZWF0ZVRleHRXaWRnZXQocGVyZm9ybWFuY2VUYWIyUGFuZSwgcm0sIE1QX0VBR0VSX0xJTUlUKTsKLQltcFJldHJhbnNtaXRJbnRlcnZhbCA9IGNyZWF0ZVRleHRXaWRnZXQocGVyZm9ybWFuY2VUYWIyUGFuZSwgcm0sIE1QX1JFVFJBTlNNSVRfSU5URVJWQUwpOwotCW1wUmV4bWl0QnVmQ250ID0gY3JlYXRlVGV4dFdpZGdldChwZXJmb3JtYW5jZVRhYjJQYW5lLCBybSwgTVBfUkVYTUlUX0JVRl9DTlQpOwotCW1wUmV4bWl0QnVmU2l6ZSA9IGNyZWF0ZVRleHRXaWRnZXQocGVyZm9ybWFuY2VUYWIyUGFuZSwgcm0sIE1QX1JFWE1JVF9CVUZfU0laRSk7Ci0JbXBUYXNrQWZmaW5pdHkgPSBjcmVhdGVFZGl0YWJsZUNvbWJvYm94KHBlcmZvcm1hbmNlVGFiMlBhbmUsIHJtLCBNUF9UQVNLX0FGRklOSVRZKTsKLQltcFNoYXJlZE1lbW9yeSA9IGNyZWF0ZUJvb2xlYW5PcHRpb24ocGVyZm9ybWFuY2VUYWIyUGFuZSwgcm0sIE1QX1NIQVJFRF9NRU1PUlkpOwotCW1wU2luZ2xlVGhyZWFkID0gY3JlYXRlQm9vbGVhbk9wdGlvbihwZXJmb3JtYW5jZVRhYjJQYW5lLCBybSwgTVBfU0lOR0xFX1RIUkVBRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBtaXNjZWxsYW5lb3VzIHRhYiBvZiB0aGUgYXR0cmlidXRlcyBwYW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNaXNjZWxsYW5lb3VzVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pCi0gICAgewotCVRhYkl0ZW0gdGFiOwotCi0JdGFiID0gbmV3IFRhYkl0ZW0odGFiYmVkUGFuZSwgU1dULk5PTkUpOwotCW1pc2NUYWJQYW5lID0gbmV3IENvbXBvc2l0ZSh0YWJiZWRQYW5lLCBTV1QuTk9ORSk7Ci0JdGFiLnNldENvbnRyb2wobWlzY1RhYlBhbmUpOwotCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTUlTQ1RhYi50aXRsZSIpKTsKLQltaXNjVGFiUGFuZS5zZXRMYXlvdXQoY3JlYXRlVGFiUGFuZUxheW91dCgpKTsKLQltcENsb2NrU291cmNlID0gY3JlYXRlQ29tYm9ib3gobWlzY1RhYlBhbmUsIHJtLCBNUF9DTE9DS19TT1VSQ0UpOwotCW1wTXNnQXBpID0gY3JlYXRlQ29tYm9ib3gobWlzY1RhYlBhbmUsIHJtLCBNUF9NU0dfQVBJKTsKLQltcFRMUFJlcXVpcmVkID0gY3JlYXRlQ29tYm9ib3gobWlzY1RhYlBhbmUsIHJtLCBNUF9UTFBfUkVRVUlSRUQpOwotCW1wRGV2VHlwZSA9IGNyZWF0ZUNvbWJvYm94KG1pc2NUYWJQYW5lLCBybSwgTVBfREVWVFlQRSk7Ci0JbXBMQVBJVHJhY2VMZXZlbCA9IGNyZWF0ZUNvbWJvYm94KG1pc2NUYWJQYW5lLCBybSwgTVBfTEFQSV9UUkFDRV9MRVZFTCk7Ci0JbXBFdWlMaWJQYXRoID0gY3JlYXRlRmlsZVNlbGVjdG9yKG1pc2NUYWJQYW5lLCBybSwgTVBfRVVJTElCUEFUSCwgTVBfRVVJTElCUEFUSF9TRUxFQ1RPUik7Ci0JbXBTYXZlTExGaWxlID0gY3JlYXRlRmlsZVNlbGVjdG9yKG1pc2NUYWJQYW5lLCBybSwgTVBfU0FWRV9MTEZJTEUsIE1QX1NBVkVfTExGSUxFX1NFTEVDVE9SKTsKLQltcFNhdmVIb3N0RmlsZSA9IGNyZWF0ZUZpbGVTZWxlY3RvcihtaXNjVGFiUGFuZSwgcm0sIE1QX1NBVkVIT1NURklMRSwgTVBfU0FWRUhPU1RGSUxFX1NFTEVDVE9SKTsKLQltcFByaW9yaXR5TG9nRGlyID0gY3JlYXRlRmlsZVNlbGVjdG9yKG1pc2NUYWJQYW5lLCBybSwgTVBfUFJJT1JJVFlfTE9HX0RJUiwgTVBfUFJJT1JJVFlfTE9HX0RJUl9TRUxFQ1RPUik7Ci0JbXBQcmlvcml0eUxvZ05hbWUgPSBjcmVhdGVUZXh0V2lkZ2V0KG1pc2NUYWJQYW5lLCBybSwgTVBfUFJJT1JJVFlfTE9HX05BTUUpOwotCW1wQ2twdERpciA9IGNyZWF0ZUZpbGVTZWxlY3RvcihtaXNjVGFiUGFuZSwgcm0sIE1QX0NLUFRESVIsIE1QX0NLUFRESVJfU0VMRUNUT1IpOwotCW1wQ2twdEZpbGUgPSBjcmVhdGVGaWxlU2VsZWN0b3IobWlzY1RhYlBhbmUsIHJtLCBNUF9DS1BURklMRSwgTVBfQ0tQVEZJTEVfU0VMRUNUT1IpOwotCW1wSU9Ob2RlRmlsZSA9IGNyZWF0ZUZpbGVTZWxlY3RvcihtaXNjVGFiUGFuZSwgcm0sIE1QX0lPTk9ERUZJTEUsIE1QX0lPTk9ERUZJTEVfU0VMRUNUT1IpOwotCW1wUHVsc2UgPSBjcmVhdGVUZXh0V2lkZ2V0KG1pc2NUYWJQYW5lLCBybSwgTVBfUFVMU0UpOwotCW1wVGhyZWFkU3RhY2tTaXplID0gY3JlYXRlVGV4dFdpZGdldChtaXNjVGFiUGFuZSwgcm0sIE1QX1RIUkVBRF9TVEFDS1NJWkUpOwotCW1wVGltZW91dCA9IGNyZWF0ZVRleHRXaWRnZXQobWlzY1RhYlBhbmUsIHJtLCBNUF9USU1FT1VUKTsKLQltcElPQnVmZmVyU2l6ZSA9IGNyZWF0ZVRleHRXaWRnZXQobWlzY1RhYlBhbmUsIHJtLCBNUF9JT19CVUZGRVJfU0laRSk7Ci0JbXBIaW50c0ZpbHRlcmVkID0gY3JlYXRlQm9vbGVhbk9wdGlvbihtaXNjVGFiUGFuZSwgcm0sIE1QX0hJTlRTX0ZJTFRFUkVEKTsKLQltcElPRXJyTG9nID0gY3JlYXRlQm9vbGVhbk9wdGlvbihtaXNjVGFiUGFuZSwgcm0sIE1QX0lPX0VSUkxPRyk7Ci0JbXBDa3B0RGlyUGVyVGFzayA9IGNyZWF0ZUJvb2xlYW5PcHRpb24obWlzY1RhYlBhbmUsIHJtLCBNUF9DS1BURElSX1BFUlRBU0spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgYWx0ZXJuYXRlIHJlc291cmNlIG1hbmFnZXIgdGFiIG9mIHRoZSByZXNvdXJjZXMgcGFuZQotICAgICAqCi0gICAgICogQHBhcmFtIHJtIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlT3RoZXJSTVRhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlUYWJJdGVtIHRhYjsKLQotCXRhYiA9IG5ldyBUYWJJdGVtKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQlhbHRlcm5hdGVSTVRhYlBhbmUgPSBuZXcgQ29tcG9zaXRlKHRhYmJlZFBhbmUsIFNXVC5OT05FKTsKLQl0YWIuc2V0Q29udHJvbChhbHRlcm5hdGVSTVRhYlBhbmUpOwotCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUk1UYWIudGl0bGUiKSk7Ci0JYWx0ZXJuYXRlUk1UYWJQYW5lLnNldExheW91dChjcmVhdGVUYWJQYW5lTGF5b3V0KCkpOwotCW1wUk1MaWIgPSBjcmVhdGVGaWxlU2VsZWN0b3IoYWx0ZXJuYXRlUk1UYWJQYW5lLCBybSwgTVBfUk1MSUIsIE1QX1JNTElCX1NFTEVDVE9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwYW5lIGNvbnRhaW5pbmcgdGhlIGFkdmFuY2VkIG1vZGUgY2hlY2tib3ggYW5kIFBFIHNldHVwIHNjcmlwdCBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gVGhlIHJlc291cmNlIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTW9kZUJveChJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlHcmlkRGF0YSBnZDsKLQlHcmlkTGF5b3V0IGxheW91dDsKLQlDb21wb3NpdGUgcGFuZTsKLQotCXBhbmUgPSBuZXcgQ29tcG9zaXRlKG1haW5QYW5lbCwgU1dULk5PTkUpOwotCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSA0OwotCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDg7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDQ7Ci0JcGFuZS5zZXRMYXlvdXQobGF5b3V0KTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXBhbmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcGVBZHZhbmNlZE1vZGUgPSBjcmVhdGVDaGVja2JveChwYW5lLCBybSwgUEVfQURWQU5DRURfTU9ERSk7Ci0JaWYgKHBlQWR2YW5jZWRNb2RlICE9IG51bGwpIHsKLQkgICAgcGVBZHZhbmNlZE1vZGUuc2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkJVVFRPTl9JRCwgKE9iamVjdCkgbmV3IEludGVnZXIoUEVfQURWQU5DRURfTU9ERV9DSEVDS0JPWCkpOwotCSAgICBwZUFkdmFuY2VkTW9kZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCX0KLQlwZUVudlNjcmlwdCA9IGNyZWF0ZUZpbGVTZWxlY3RvcihwYW5lLCBybSwgUEVfRU5WX1NDUklQVCwgUEVfRU5WX1NDUklQVF9TRUxFQ1RPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcGFuZSBjb250YWluaW5nIHRoZSBmaWxlIHNlbGVjdG9ycyBmb3Igc3RkaW8gcmVkaXJlY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBybSBUaGUgcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZWRpcmVjdEJveChJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlHcmlkRGF0YSBnZDsKLQlHcmlkTGF5b3V0IGxheW91dDsKLQlDb21wb3NpdGUgcGFuZTsKLQotCXBhbmUgPSBuZXcgQ29tcG9zaXRlKG1haW5QYW5lbCwgU1dULk5PTkUpOwotCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSA4OwotCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDg7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDg7Ci0JcGFuZS5zZXRMYXlvdXQobGF5b3V0KTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXBhbmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcGVTdGRpblBhdGggPSBjcmVhdGVGaWxlU2VsZWN0b3IocGFuZSwgcm0sIFBFX1NURElOX1BBVEgsIFBFX1NURElOX1BBVEhfU0VMRUNUT1IpOwotCXBlU3Rkb3V0UGF0aCA9IGNyZWF0ZUZpbGVTZWxlY3RvcihwYW5lLCBybSwgUEVfU1RET1VUX1BBVEgsIFBFX1NURE9VVF9QQVRIX1NFTEVDVE9SKTsKLQlwZVN0ZGVyclBhdGggPSBjcmVhdGVGaWxlU2VsZWN0b3IocGFuZSwgcm0sIFBFX1NUREVSUl9QQVRILCBQRV9TVERFUlJfUEFUSF9TRUxFQ1RPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhbGwgb2YgdGhlIEdVSSBlbGVtZW50cyBvZiB0aGUgcmVzb3VyY2UtbWFuYWdlciBzcGVjaWZpYyBwYW5lIHdpdGhpbiB0aGUgcGFyYWxsZWwgdGFiIG9mIHRoZQotICAgICAqIGxhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhpcyBjb250cm9sJ3MgcGFyZW50Ci0gICAgICogQHBhcmFtIHJtIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIHF1ZXVlIEN1cnJlbnRseSBzZWxlY3RlZCBxdWV1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkKLSAgICB7Ci0JUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlJUmVtb3RlQ29ubmVjdGlvbk1hbmFnZXIgY29ubk1ncjsKLQotCWNvbmZpZyA9IChQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pICgoQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXIpIHJtKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JcmVtb3RlU2VydmljZSA9IFBUUFJlbW90ZUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW90ZVNlcnZpY2VzKGNvbmZpZy5nZXRSZW1vdGVTZXJ2aWNlc0lkKCkpOwotCXJlbW90ZVVJU2VydmljZSA9IFBUUFJlbW90ZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZW1vdGVVSVNlcnZpY2VzKHJlbW90ZVNlcnZpY2UpOwotCWNvbm5NZ3IgPSByZW1vdGVTZXJ2aWNlLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0JcmVtb3RlQ29ubmVjdGlvbiA9IGNvbm5NZ3IuZ2V0Q29ubmVjdGlvbihjb25maWcuZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JcGFyZW50U2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQljbGVhckFsbFdpZGdldHMoKTsKLQlhY3RpdmVXaWRnZXRzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCW1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCWNyZWF0ZU1vZGVCb3gocm0pOwotCWNyZWF0ZVJlZGlyZWN0Qm94KHJtKTsKLQl0YWJiZWRQYW5lID0gbmV3IFRhYkZvbGRlcihtYWluUGFuZWwsIFNXVC5UT1ApOwotCWNyZWF0ZVRhc2tzVGFiKHJtKTsKLQljcmVhdGVJT1RhYihybSk7Ci0JY3JlYXRlRGlhZ25vc3RpY1RhYihybSk7Ci0JY3JlYXRlRGVidWdUYWIocm0pOwotCWNyZWF0ZVN5c3RlbVRhYihybSk7Ci0JY3JlYXRlTm9kZUFsbG9jYXRpb25UYWIocm0pOwotCWNyZWF0ZVBlcmZvcm1hbmNlVGFiMShybSk7Ci0JY3JlYXRlUGVyZm9ybWFuY2VUYWIyKHJtKTsKLQlpZiAoIXVzZUxvYWRMZXZlbGVyKSB7Ci0JICAgIGNyZWF0ZU90aGVyUk1UYWIocm0pOwotCX0KLQljcmVhdGVNaXNjZWxsYW5lb3VzVGFiKHJtKTsKLQljdXJyZW50Uk0gPSBybTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBzZXQgb2YgbGF1bmNoIGF0dHJpYnV0ZXMgaWYgaXRzIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBhbmQgdGhlIGF0dHJpYnV0ZQotICAgICAqIGlzIGtub3duIHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBybSBUaGUgcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIHZlY3RvciBjb250YWluaW5nIHRoZSBzZXQgb2YgbGF1bmNoIGF0dHJpYnV0ZXMKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZCB0byBsYXVuY2ggYXR0cmlidXRlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGUoSVJlc291cmNlTWFuYWdlciBybSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLCBWZWN0b3I8U3RyaW5nQXR0cmlidXRlPiBhdHRycywKLQkgICAgU3RyaW5nIGF0dHJOYW1lKQotICAgIHsKLQlTdHJpbmcgYXR0clZhbHVlOwotCVN0cmluZyBkZWZhdWx0VmFsdWU7Ci0JU3RyaW5nQXR0cmlidXRlIGF0dHI7Ci0JU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyRGVmOwotCi0JaWYgKHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0ck5hbWUpICE9IG51bGwpIHsKLQkgICAgdHJ5IHsKLQkJYXR0clZhbHVlID0gY29uZmlnLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIiIpOwotCSAgICB9Ci0JICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJYXR0clZhbHVlID0gIiI7Ci0JICAgIH0KLQkgICAgZGVmYXVsdFZhbHVlID0gZ2V0QXR0ckRlZmF1bHRWYWx1ZShybSwgYXR0ck5hbWUpOwotCSAgICAvLyBEb24ndCBhZGQgYXR0cmlidXRlIGlmIGl0IGhhcyBkZWZhdWx0IHZhbHVlIG9yIGlmIGl0IGlzIGJsYW5rLgotCSAgICAvLyBUaGlzIHJlZHVjZXMgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgc2VudCBpbiBydW4gY29tbWFuZC4KLQkgICAgaWYgKChhdHRyVmFsdWUubGVuZ3RoKCkgPiAwKSAmJiAoIWF0dHJWYWx1ZS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkpIHsKLQkJYXR0ckRlZiA9IG5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJOYW1lLCAiIiwgIiIsIGZhbHNlLCAiIik7Ci0JCWF0dHIgPSBuZXcgU3RyaW5nQXR0cmlidXRlKGF0dHJEZWYsIGF0dHJWYWx1ZSk7Ci0JCWF0dHJzLmFkZChhdHRyKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgYXMgbGF1bmNoIGF0dHJpYnV0ZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBybSBUaGUgcmVzb3VyY2UgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gcXVldWUgVGhlIGN1cnJlbnQgcXVldWUgKG5vdCB1c2VkIGZvciBQRSBzaW5jZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHF1ZXVlKQotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIElBdHRyaWJ1dGU8U3RyaW5nLCBTdHJpbmdBdHRyaWJ1dGUsIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCSAgICAJCQlJUFF1ZXVlIHF1ZXVlLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkKLQkgICAgCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0JVmVjdG9yPFN0cmluZ0F0dHJpYnV0ZT4gYXR0cnM7Ci0JU3RyaW5nQXR0cmlidXRlIGF0dHJBcnJheVtdOwotCi0JYXR0cnMgPSBuZXcgVmVjdG9yPFN0cmluZ0F0dHJpYnV0ZT4oKTsKLQlhdHRyQXJyYXkgPSBuZXcgU3RyaW5nQXR0cmlidXRlWzBdOwotCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShQRV9BRFZBTkNFRF9NT0RFLCAiIikuZXF1YWxzKCJ5ZXMiKSkgewotCSAgICBCdWZmZXJlZFJlYWRlciByZHI7Ci0JICAgIFN0cmluZyBzZXR1cFNjcmlwdFBhdGg7Ci0KLQkgICAgc2V0dXBTY3JpcHRQYXRoID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoUEVfRU5WX1NDUklQVCwgIiIpOwotCSAgICB0cnkgewotCQlTdHJpbmcgZW52RGF0YTsKLQotCQlyZHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc2V0dXBTY3JpcHRQYXRoKSk7Ci0JCWVudkRhdGEgPSByZHIucmVhZExpbmUoKTsKLQkJd2hpbGUgKGVudkRhdGEgIT0gbnVsbCkgewotCQkgICAgZW52RGF0YSA9IGVudkRhdGEudHJpbSgpOwotCQkgICAgaWYgKGVudkRhdGEuc3RhcnRzV2l0aCgiTVBfIikpIHsKLQkJCVN0cmluZyB0b2tlbnNbXTsKLQkJCVN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLQkJCVN0cmluZ0F0dHJpYnV0ZSBhdHRyOwotCi0JCQl0b2tlbnMgPSBlbnZEYXRhLnNwbGl0KCI9Iik7Ci0JCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAyKSB7Ci0JCQkgICAgYXR0ckRlZiA9IG5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKHRva2Vuc1swXSwgIiIsICIiLCBmYWxzZSwgIiIpOwotCQkJICAgIGF0dHIgPSBuZXcgU3RyaW5nQXR0cmlidXRlKGF0dHJEZWYsIHRva2Vuc1sxXSk7Ci0JCQkgICAgYXR0cnMuYWRkKGF0dHIpOwotCQkJfQotCQkgICAgfQotCQkgICAgZW52RGF0YSA9IHJkci5yZWFkTGluZSgpOwotCQl9Ci0JICAgIH0KLQkgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUEUgRW52aXJvbm1lbnQgc2V0dXAgZmlsZSAiICsgc2V0dXBTY3JpcHRQYXRoICsgIiBub3QgZm91bmQuIik7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciByZWFkaW5nIFBFIGVudmlyb25tZW50IHNldHVwIGZpbGUgIiArIHNldHVwU2NyaXB0UGF0aCArICI6ICIgKwotCQkJCSAgIGUuZ2V0TWVzc2FnZSgpKTsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIE1hcDxTdHJpbmcsIFN0cmluZ0F0dHJpYnV0ZT4gYWxsQXR0cnM7Ci0JICAgIFNldDxTdHJpbmc+IGF0dHJOYW1lczsKLQkgICAgSXRlcmF0b3I8U3RyaW5nPiBpOwotCSAgICBTdHJpbmcgbmFtZTsKLQotCSAgICBhbGxBdHRycyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCSAgICBhdHRyTmFtZXMgPSBhbGxBdHRycy5rZXlTZXQoKTsKLQkgICAgaSA9IGF0dHJOYW1lcy5pdGVyYXRvcigpOwotCSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJbmFtZSA9IGkubmV4dCgpOwotCQlpZiAoKG5hbWUuc3RhcnRzV2l0aCgiTVBfIikpIHx8ICgobmFtZS5zdGFydHNXaXRoKCJQRV8iKSkgJiYgKCEgbmFtZS5lcXVhbHMoUEVfRU5WX1NDUklQVCkpKSkgewotCQkgICAgYWRkQXR0cmlidXRlKHJtLCBjb25maWd1cmF0aW9uLCBhdHRycywgbmFtZSk7Ci0JCX0KLQkgICAgfQotCX0KLQlyZXR1cm4gYXR0cnMudG9BcnJheShhdHRyQXJyYXkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjZ2V0Q29udHJvbCgpCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gICAgewotCXJldHVybiBtYWluUGFuZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgcmVzb3VyY2UgbWFuYWdlciwgZ2l2aW5nCi0gICAgICogcHJlZmVyZW5jZSB0byBhIHVzZXIgb3ZlcnJpZGUgb2YgdGhlIGRlZmF1bHQgdmFsdWUgKHdoaWNoIHRoZSB1c2VyIGRvZXMgYnkgc2V0dGluZyBvZiB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSBzdGFydGluZyB0aGUgcHJveHkuKSBUaGUgdXNlcidzIG92ZXJyaWRlCi0gICAgICogaXMgcGFzc2VkIHRvIHRoZSBmcm9udCBlbmQgYnkgdGhlIHByb3h5IGFzIGEgc3RyaW5nIGF0dHJpYnV0ZSB3aGVyZSB0aGUgbGVhZGluZyAnTVBfJyBvZgotICAgICAqIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyByZXBsYWNlZCB3aXRoICdFTl8nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm0gVGhlIHJlc291cmNlIG1hbmFnZXIgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyTG9jYWxEZWZhdWx0VmFsdWUoSVJlc291cmNlTWFuYWdlciBybSwgU3RyaW5nIGF0dHJOYW1lKQotICAgIHsKLQlJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotCVN0cmluZyBsb2NhbERlZmF1bHRFbnY7Ci0KLQlsb2NhbERlZmF1bHRFbnYgPSBhdHRyTmFtZS5yZXBsYWNlRmlyc3QoIl5NUF8iLCAiRU5fIik7Ci0JYXR0ckRlZiA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24obG9jYWxEZWZhdWx0RW52KTsKLQlpZiAoYXR0ckRlZiAhPSBudWxsKSB7Ci0JICAgIHRyeSB7Ci0JCXJldHVybiBhdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkgICAgfQotCSAgICBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkgICAgfQotCX0KLQlhdHRyRGVmID0gcm0uZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihhdHRyTmFtZSk7Ci0JaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCSAgICB0cnkgewotCQlyZXR1cm4gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiAiIjsKLQkgICAgfQotCX0KLQlyZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgcmVzb3VyY2UgbWFuYWdlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJtIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0ckRlZmF1bHRWYWx1ZShJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgYXR0ck5hbWUpCi0gICAgewotCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHJEZWY7Ci0KLQlhdHRyRGVmID0gcm0uZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihhdHRyTmFtZSk7Ci0JaWYgKGF0dHJEZWYgIT0gbnVsbCkgewotCSAgICB0cnkgewotCQlyZXR1cm4gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiAiIjsKLQkgICAgfQotCX0KLQlyZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLiBJZiB0aGUgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiwgdGhhdAotICAgICAqIHZhbHVlIGlzIHVzZWQuIE90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIHJtIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0ckluaXRpYWxWYWx1ZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsIElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBhdHRyTmFtZSkKLSAgICB7Ci0JU3RyaW5nIHZhbHVlOwotCUlBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IHJtQXR0ckRlZjsKLQotCXRyeSB7Ci0JICAgIHZhbHVlID0gY29uZmlnLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIl9ub192YWx1ZV8iKTsKLQl9Ci0JY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCSAgICB2YWx1ZSA9ICJfbm9fdmFsdWVfIjsKLQl9Ci0JaWYgKHZhbHVlLmVxdWFscygiX25vX3ZhbHVlXyIpKSB7Ci0JICAgIAkvLyBHZXQgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlLCB3aGVyZSB0aGF0IGRlZmF1bHQgbWF5IGJlIHRoZSB2YWx1ZQotCSAgICAJLy8gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGFzIGFuIG92ZXJyaWRlIHRvIHRoZSBQRSBkZWZhdWx0IHZhbHVlLgotCSAgICB2YWx1ZSA9IGdldEF0dHJMb2NhbERlZmF1bHRWYWx1ZShybSwgYXR0ck5hbWUpOwotCX0KLQkJLy8gSWYgYW4gYXR0cmlidXRlIGlzIGRlZmluZWQgYXMgYW4gaW50ZWdlciBhdHRyaWJ1dGUsIHRoZW4gZGV0ZXJtaW5lIGlmCi0JCS8vIHRoZSBhdHRyaWJ1dGUgaXMgZXZlbmx5IGRpdmlzaWJsZSBieSAxRywgMU0gb3IgMUssIGFuZCBpZiBzbywgdGhlbiBjb252ZXJ0IHRoZQotCQkvLyB2YWx1ZSBhY2NvcmRpbmdseS4gVGhlIHRlc3RzIG11c3QgYmUgZG9uZSBsYXJnZXN0IHRvIHNtYWxsZXN0IHNvIHRoYXQKLQkJLy8gdGhlIGxhcmdlc3QgY29udmVyc2lvbiBmYWN0b3IgaXMgdXNlZC4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSBtYXkgYWxyZWFkeSBiZQotCQkvLyBpbiB0aGUgZm9ybSA5OTlbZ0dtTWtLXS4gQ29udmVydGluZyB0aGF0IHRvIGEgbG9uZyB3aWxsIHJlc3VsdCBpbiBhCi0JCS8vIE51bWJlckZvcm1hdEV4Y2VwdGlvbiwgc28gYSB0cnkvY2F0Y2ggYmxvY2sgaXMgcmVxdWlyZWQsIHdoZXJlIHRoZSBzdHJpbmcKLQkJLy8gdmFsdWUgaXMgcmV0dXJuZWQgaW4gdGhlY2FzZSBvZiBhIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCXJtQXR0ckRlZiA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0ck5hbWUpOwotCWlmIChybUF0dHJEZWYgaW5zdGFuY2VvZiBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiB8fCBybUF0dHJEZWYgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbikgewotCSAgICBsb25nIGludFZhbDsKLQotCSAgICB0cnkgewotCSAgICBpbnRWYWwgPSBMb25nLnZhbHVlT2YodmFsdWUpOwotCSAgICAJaWYgKGludFZhbCAhPSAwKSB7Ci0JICAgIAkgICAgaWYgKChpbnRWYWwgJSBHQllURSkgPT0gMCkgewotCSAgICAJCXJldHVybiBTdHJpbmcudmFsdWVPZihpbnRWYWwgLyBHQllURSkgKyAiRyI7Ci0JICAgIAkgICAgfQotCSAgICAJICAgIGVsc2UgewotCSAgICAJCWlmICgoaW50VmFsICUgTUJZVEUpID09IDApIHsKLQkgICAgCQkgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGludFZhbCAvIE1CWVRFKSArICJNIjsKLQkgICAgCQl9Ci0JICAgIAkJZWxzZSB7Ci0JICAgIAkJICAgIGlmICgoaW50VmFsICUgS0JZVEUpID09IDApIHsKLQkgICAgCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGludFZhbCAvIEtCWVRFKSArICJLIjsKLQkgICAgCQkgICAgfQotCSAgICAJCX0KLQkgICAgCSAgICB9Ci0JICAgIAl9Ci0JICAgIH0KLQkgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQkgICAgfQotCX0KLQlyZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGNoZWNrYm94IHRvIGNoZWNrZWQgc3RhdGUgaWYgYXR0cmlidXRlIGhhcyB2YWx1ZSBlcXVhbCB0byBjaGVja1ZhbHVlIG90aGVyd2lzZSBzZXQgaXQgdW5jaGVja2VkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hlY2tib3ggVGhlIGNoZWNrYm94IHRvIHNldAotICAgICAqIEBwYXJhbSBhdHRyVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBjaGVjawotICAgICAqIEBwYXJhbSBjaGVja1ZhbHVlIFRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgY2hlY2tlZCBjaGVja2JveAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShDaGVja2JveFJvd1dpZGdldCBjaGVja2JveCwgU3RyaW5nIGF0dHJWYWx1ZSwgU3RyaW5nIGNoZWNrVmFsdWUpCi0gICAgewotCWlmIChjaGVja2JveCAhPSBudWxsKSB7Ci0JICAgIGlmIChhdHRyVmFsdWUuZXF1YWxzKGNoZWNrVmFsdWUpKSB7Ci0JCWNoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkgICAgfSBlbHNlIHsKLQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWUoQm9vbGVhblJvd1dpZGdldCBvcHRpb24sIFN0cmluZyBjaGVja1ZhbHVlKQotICAgIHsKLQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkgICAgb3B0aW9uLnNldFZhbHVlKGNoZWNrVmFsdWUpOwotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRleHQgdmFsdWUgZm9yIGEgVGV4dCB3aWRnZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiB0aGUgd2lkZ2V0IGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHdpZGdldCBUaGUgd2lkZ2V0IHRvIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlKFRleHRSb3dXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgdmFsdWUpCi0gICAgewotCWlmICh3aWRnZXQgIT0gbnVsbCkgewotCSAgICB3aWRnZXQuc2V0VmFsdWUodmFsdWUpOwotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRleHQgdmFsdWUgZm9yIGEgRHVhbEZpZWxkIHdpZGdldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGlmIHRoZSB3aWRnZXQgaXMgbm90IG51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2lkZ2V0IFRoZSB3aWRnZXQgdG8gc2V0Ci0gICAgICogQHBhcmFtIHZhbHVlMSBUaGUgdmFsdWUgdG8gYmUgc2V0IGluIGZpZWxkIDEKLSAgICAgKiBAcGFyYW0gdmFsdWUyIFRoZSB2YWx1ZSB0byBiZSBzZXQgaW4gZmllbGQgMgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShEdWFsRmllbGRSb3dXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgdmFsdWUxLCBTdHJpbmcgdmFsdWUyKQotICAgIHsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkgICAgd2lkZ2V0LnNldFZhbHVlKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0ZXh0IHZhbHVlIGZvciBhIENvbWJvUm93V2lkZ2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaWYgdGhlIHdpZGdldCBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aWRnZXQgVGhlIHdpZGdldCB0byBzZXQKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShDb21ib1Jvd1dpZGdldCB3aWRnZXQsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0JaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0JICAgIHdpZGdldC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aG5hbWUgZm9yIGEgZmlsZSBzZWxlY3RvciBpZiB0aGUgZmlsZSBzZWxlY3RvciBpcyBub3QgbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEZpbGUgc2VsZWN0b3IgdG8gYmUgdXBkYXRlZAotICAgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlKEZpbGVTZWxlY3RvclJvd1dpZGdldCBzZWxlY3RvciwgU3RyaW5nIHBhdGgpCi0gICAgewotCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JICAgIHNlbGVjdG9yLnNldFBhdGgocGF0aCk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgYWxsIHdpZGdldHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIHJtIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxWYWx1ZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLCBJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlPYmplY3Qgd2lkZ2V0OwotCUl0ZXJhdG9yPE9iamVjdD4gaTsKLQotCS8vIEFsbCBUZXh0IGFuZCBDb21ibyB3aWRnZXRzIGhhdmUgTW9kaWZ5TGlzdGVuZXJzIHJlZ2lzdGVyZWQgb24gdGhlbSBpbiBvcmRlciB0byBpbnZva2UgZmllbGQgdmFsaWRhdGlvbgotCS8vIHdoZW4gY29udGVudHMgb2YgdGhlIHdpZGdldCdzIHRleHQgZmllbGQgY2hhbmdlLiBUaGUgTW9kaWZ5TGlzdGVuZXIgaXMgaW52b2tlZCBmb3IgZWFjaCB3aWRnZXQgYXMgYQotCS8vIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBzZXRUZXh0KCkgbWV0aG9kIGZvciB0aGUgd2lkZ2V0LiBUaGUgcmVzdWx0aW5nIE1vZGlmeUV2ZW50IHJlc3VsdHMgaW4gY2FsbGluZwotCS8vIHZhbGlkYXRlQWxsRmllbGRzKCksIHdoaWNoIGludm9rZXNmaXJlQ29udGVudHNDaGFuZ2VkKCksIHdoaWNoIGluIHR1cm4gcmVzdWx0cyBpbiBwZXJmb3JtQXBwbHkoKSBiZWluZwotCS8vIGludm9rZWQuIFRoZSBwZXJmb3JtQXBwbHkoKSBtZXRob2Qgc2F2ZXMgYWxsIHdpZGdldCdzIHZhbHVlcyBpbnRvIHRoZSBjdXJyZW50IGxhdW5jaCBjb25maWd1cmF0aW9uLgotCS8vIFNpbmNlIGF0IHRoZSB0aW1lIHRoYXQgc2V0SW5pdGlhbFZhbHVlcyBpcyBjYWxsZWQsIHdpZGdldHMgbWF5IGJlIGJsYW5rLCB0aGlzIHJlc3VsdHMgaW4gc3RvcmluZwotCS8vIGJsYW5rcyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLCB3aXBpbmcgb3V0IHRoZSBzYXZlZCB2YWx1ZXMgaW4gdGhlIGxhdW5jaAotCS8vIGNvbmZpZ3VyYXRpb24uCi0JLy8gVG8gYXZvaWQgdGhpcywgaWdub3JlTW9kaWZ5RXZlbnRzIGlzIHNldCwgc28gdGhhdCB0aGUgTW9kaWZ5TGlzdGVuZXIgZG9lcyBub3RoaW5nLgotCWlnbm9yZU1vZGlmeUV2ZW50cyA9IHRydWU7Ci0JaSA9IGFjdGl2ZVdpZGdldHMuaXRlcmF0b3IoKTsKLQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkgICAgd2lkZ2V0ID0gaS5uZXh0KCk7aWYgKHdpZGdldCBpbnN0YW5jZW9mIEZpbGVTZWxlY3RvclJvd1dpZGdldCkgewotCQlzZXRWYWx1ZSgoRmlsZVNlbGVjdG9yUm93V2lkZ2V0KSB3aWRnZXQsIGdldEF0dHJJbml0aWFsVmFsdWUoY29uZmlnLCBybSwKLQkJCSAoU3RyaW5nKSAoKEZpbGVTZWxlY3RvclJvd1dpZGdldCkgd2lkZ2V0KS5nZXREYXRhKCkpKTsKLQkgICAgfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBEdWFsRmllbGRSb3dXaWRnZXQpIHsKLQkJc2V0VmFsdWUoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0LAotCQkJZ2V0QXR0ckluaXRpYWxWYWx1ZShjb25maWcsIHJtLCAoU3RyaW5nKSAoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KS5nZXREYXRhMSgpKSwKLQkJCWdldEF0dHJJbml0aWFsVmFsdWUoY29uZmlnLCBybSwgKFN0cmluZykgKChEdWFsRmllbGRSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YTIoKSkpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRleHRSb3dXaWRnZXQpIHsKLQkJc2V0VmFsdWUoKFRleHRSb3dXaWRnZXQpIHdpZGdldCwKLQkJCSBnZXRBdHRySW5pdGlhbFZhbHVlKGNvbmZpZywgcm0sICgoVGV4dFJvd1dpZGdldCkgd2lkZ2V0KS5nZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FKSkpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbWJvUm93V2lkZ2V0KSB7Ci0JCXNldFZhbHVlKChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0LAotCQkJIGdldEF0dHJJbml0aWFsVmFsdWUoY29uZmlnLCBybSwgKChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0KS5nZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FKSkpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdpZGdldCBpbnN0YW5jZW9mIEJvb2xlYW5Sb3dXaWRnZXQpIHsKLQkJc2V0VmFsdWUoKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCwKLQkJCSBnZXRBdHRySW5pdGlhbFZhbHVlKGNvbmZpZywgcm0sICgoQm9vbGVhblJvd1dpZGdldCkgd2lkZ2V0KS5nZXREYXRhKCkpKTsKLQkgICAgfQotCSAgICBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDaGVja2JveFJvd1dpZGdldCkgewotCQlzZXRWYWx1ZSgoQ2hlY2tib3hSb3dXaWRnZXQpIHdpZGdldCwKLQkJCSBnZXRBdHRySW5pdGlhbFZhbHVlKGNvbmZpZywgcm0sICgoQ2hlY2tib3hSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkFUVFJfTkFNRSkpLAotCQkJICJ5ZXMiKTsKLQkgICAgfQotCi0JfQotCXNldExhdW5jaFBhbmVsTW9kZSgpOwotCS8vIFNldHVwIGNvbXBsZXRlLCByZS1lbmFibGUgTW9kaWZ5TGlzdGVuZXIKLQlpZ25vcmVNb2RpZnlFdmVudHMgPSBmYWxzZTsKLQltYXJrQWxsRmllbGRzQ2hhbmdlZCgpOwotCS8vIEFsbCBmaWVsZHMgbmVlZCB0byBiZSB2YWxpZGF0ZWQgYmVjYXVzZSBhIGRpZmZlcmVudCByZXNvdXJjZSBtYW5hZ2VyIG1heSBoYXZlIGJlZW4gc2VsZWN0ZWQsIGFuZCB0aGVyZWZvcmUKLQkvLyB2YWx1ZXMgc2F2ZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLCBzdWNoIGFzIHBhdGhuYW1lcyBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkLgotCXZhbGlkYXRlQWxsRmllbGRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHN0YXRlIGZvciB3aWRnZXRzIGJhc2VkIG9uIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHdpZGdldCB2YWx1ZXMuIEF0IHRoZSBwb2ludCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsCi0gICAgICogYWxsIHdpZGdldHMgYXJlIGluIGVuYWJsZWQgc3RhdGUsIHNvIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGRpc2FibGUgd2lkZ2V0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbFdpZGdldFN0YXRlKElSZXNvdXJjZU1hbmFnZXIgcm0pCi0gICAgewotCVN0cmluZyBtcFByaW9yaXR5RGVmYXVsdFZhbHVlOwotCWJvb2xlYW4gZW5hYmxlU3RhdGU7Ci0KLQltcFByaW9yaXR5RGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdEF0dHJpYnV0ZVZhbHVlKHJtLCBNUF9QUklPUklUWSk7Ci0JaWYgKChtcFByaW9yaXR5ICE9IG51bGwpCi0JCSYmICgobXBQcmlvcml0eS5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApIHx8IG1wUHJpb3JpdHkuZ2V0VmFsdWUoKS5lcXVhbHMobXBQcmlvcml0eURlZmF1bHRWYWx1ZSkpKSB7Ci0JICAgIGVuYWJsZVN0YXRlID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkgICAgZW5hYmxlU3RhdGUgPSB0cnVlOwotCX0KLQlpZiAobXBQcmlvcml0eUxvZyAhPSBudWxsKSB7Ci0JICAgIG1wUHJpb3JpdHlMb2cuc2V0RW5hYmxlZChlbmFibGVTdGF0ZSk7Ci0JfQotCWlmIChtcFByaW9yaXR5TlRQICE9IG51bGwpIHsKLQkgICAgbXBQcmlvcml0eU5UUC5zZXRFbmFibGVkKGVuYWJsZVN0YXRlKTsKLQl9Ci0JaWYgKG1wUHJpb3JpdHlMb2dEaXIgIT0gbnVsbCkgewotCSAgICBtcFByaW9yaXR5TG9nRGlyLnNldEVuYWJsZWQoZW5hYmxlU3RhdGUpOwotCX0KLQlpZiAobXBQcmlvcml0eUxvZ05hbWUgIT0gbnVsbCkgewotCSAgICBtcFByaW9yaXR5TG9nTmFtZS5zZXRFbmFibGVkKGVuYWJsZVN0YXRlKTsKLQl9Ci0JaWYgKChtcFJldHJ5ICE9IG51bGwpICYmIChtcFJldHJ5LmdldFZhbHVlKCkuZXF1YWxzKCJ3YWl0IikpKSB7Ci0JICAgIGlmIChtcFJldHJ5Q291bnQgIT0gbnVsbCkgewotCQltcFJldHJ5Q291bnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBpZiAobXBSZXRyeUNvdW50ICE9IG51bGwpIHsKLQkJbXBSZXRyeUNvdW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0JICAgIH0KLQl9Ci0Jc2V0TExGaWxlRGVwZW5kZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFuIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBybSBUaGUgY3VycmVudCByZXNvdXJjZSBtYW5hZ2VyCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlIG9yIGVtcHR5IHN0cmluZyBpZiB2YWx1ZSBjYW5ub3QgYmUgcmV0cmlldmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZVZhbHVlKElSZXNvdXJjZU1hbmFnZXIgcm0sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICAgIHsKLQlTdHJpbmcgZGVmYXVsdFZhbHVlOwotCi0JdHJ5IHsKLQkgICAgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZGVmOwotCi0JICAgIGRlZiA9IHJtLmdldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0cmlidXRlTmFtZSk7Ci0JICAgIGlmIChkZWYgIT0gbnVsbCkgewotCQlkZWZhdWx0VmFsdWUgPSBkZWYuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlkZWZhdWx0VmFsdWUgPSAiIjsKLQkgICAgfQotCX0KLQljYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkgICAgZGVmYXVsdFZhbHVlID0gIiI7Ci0JfQotCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gaW5pdGlhbGl6ZUZyb20oQ29udHJvbCBjb250cm9sLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLAotCSAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICAgIHsKLQlpZiAoY29uZmlndXJhdGlvbiBpbnN0YW5jZW9mIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpIHsKLQkgICAgY3VycmVudExhdW5jaENvbmZpZyA9IChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KSBjb25maWd1cmF0aW9uOwotCX0KLQlzZXRJbml0aWFsVmFsdWVzKGNvbmZpZ3VyYXRpb24sIHJtKTsKLQlzZXRJbml0aWFsV2lkZ2V0U3RhdGUocm0pOwotCXJldHVybiBzdWNjZXNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjaXNWYWxpZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLAotICAgICAqICAgICAgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpCi0gICAgICovCi0gICAgcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpCi0gICAgewotCQkvLyBJZiBydW5uaW5nIGluIGJhc2ljIG1vZGUsIHRoZW4gYW55IFBFIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZAotCQkvLyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRpc2FsbG93ZWQgc2luY2UgdGhvc2Ugc2V0dGluZ3MgbWF5Ci0JCS8vIGNvbmZsaWN0IHdpdGggd2hhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlc291cmNlcyB0YWIgcGFuZWwuCi0JaWYgKChwZUFkdmFuY2VkTW9kZSAhPSBudWxsKSAmJiAoISBwZUFkdmFuY2VkTW9kZS5nZXRTZWxlY3Rpb24oKSkpIHsKLQkgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudDsKLQkgICAgU3RyaW5nIG9wdGlvbnNGZW5jZTsKLQkgICAgU3RyaW5nIG5vUEVBcmdzOwotCSAgICBTdHJpbmcgY29tbWFuZE9wdGlvbnM7Ci0JICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZWRPcHRpb25zOwotCi0JICAgIHRyeSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcjsKLQkJZW52aXJvbm1lbnQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UuZGVidWcuY29yZS5lbnZpcm9ubWVudFZhcmlhYmxlcyIsCi0JCQluZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0JCWl0ZXIgPSBlbnZpcm9ubWVudC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJICAgIGlmIChBcnJheXMuYmluYXJ5U2VhcmNoKFBFRW52VmFycywgaXRlci5uZXh0KCkpID49IDApIHsKLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQuZGlzYWxsb3dlZEVudlZhciIpKTsKLQkJICAgIH0KLQkJfQotCQkJLy8gSWYgTVBfTk9BUkdMSVNUIG9yIE1QX0ZFTkNFIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IHRoZW4gaGFuZGxlIHBhcnNpbmcKLQkJCS8vIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFjY29yZGluZ2x5LgotCQlub1BFQXJncyA9IGVudmlyb25tZW50LmdldCgiTVBfTk9BUkdMSVNUIik7Ci0JCWlmICgobm9QRUFyZ3MgPT0gbnVsbCkgfHwgKG5vUEVBcmdzLmVxdWFsc0lnbm9yZUNhc2UoIm5vIikpKSB7Ci0JCSAgICBvcHRpb25zRmVuY2UgPSBlbnZpcm9ubWVudC5nZXQoIk1QX0ZFTkNFIik7Ci0JCSAgICBpZiAob3B0aW9uc0ZlbmNlID09IG51bGwpIHsKLQkJCW9wdGlvbnNGZW5jZSA9ICIiOwotCQkgICAgfQotCQkgICAgY29tbWFuZE9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UucHRwLmxhdW5jaC5BUkdVTUVOVF9BVFRSIiwgIiIpOwotCQkgICAgdG9rZW5pemVkT3B0aW9ucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWFuZE9wdGlvbnMsICIgIik7Ci0JCSAgICB3aGlsZSAodG9rZW5pemVkT3B0aW9ucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBvcHRpb247Ci0KLQkJCW9wdGlvbiA9IHRva2VuaXplZE9wdGlvbnMubmV4dFRva2VuKCk7Ci0JCQlpZiAob3B0aW9uLmVxdWFscyhvcHRpb25zRmVuY2UpKSB7Ci0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoQXJyYXlzLmJpbmFyeVNlYXJjaChQRU9wdGlvbnMsIG9wdGlvbikgPj0gMCkgewotCQkJICAgIHJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQuZGlzYWxsb3dlZE9wdGlvbiIpKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkgICAgfQotCX0KLQlpZiAoYWxsRmllbGRzVmFsaWQpIHsKLQkgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBlcnJvck1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIGEgVGV4dCB3aWRnZXQgaW50byB0aGUgc3BlY2lmaWVkIGxhdW5jaCBjb25maWd1cmF0aW9uIGlmIHRoZSB3aWRnZXQgaXMgbm90IG51bGwKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIHJtIFRoZSByZXNvdXJjZSBtYW5hZ2VyIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBhdHRyIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gY29udHJvbCBUaGUgd2lkZ2V0IHRvIG9idGFpbiB0aGUgdmFsdWUgZnJvbQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRDb25maWdBdHRyKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgYXR0ciwKLQkgICAgCQkgICAgICAgVGV4dFJvd1dpZGdldCBjb250cm9sKQotICAgIHsKLQlJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotCi0JaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCSAgICBTdHJpbmcgYXR0clZhbHVlOwotCi0JICAgIGF0dHJEZWYgPSBybS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHIpOwotCSAgICB0cnkgewotCQlpZiAoKGF0dHJEZWYgaW5zdGFuY2VvZiBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbikgfHwgKGF0dHJEZWYgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbikpIHsKLQkJICAgIGF0dHJWYWx1ZSA9IGdldEludGVnZXJWYWx1ZShjb250cm9sLmdldFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkgICAgYXR0clZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCQl9Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0clZhbHVlKTsKLQkgICAgfQotCSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJLy8gSWYgdGhlIGZpZWxkIGhhcyBhbiBpbnZhbGlkIG51bWVyaWMgdmFsdWUsIHRoZW4gZG9uJ3Qgc2F2ZSBpdCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSBhIERpYWxGaWVsZCB3aWRnZXQgaW50byB0aGUgc3BlY2lmaWVkIGxhdW5jaCBjb25maWd1cmF0aW9uIGlmIHRoZSB3aWRnZXQgaXMgbm90IG51bGwKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGF0dHIgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBjb250cm9sIFRoZSB3aWRnZXQgdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbmZpZ0F0dHIoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsIFN0cmluZyBhdHRyMSwgU3RyaW5nIGF0dHIyLAotCSAgICAJCSAgICAgICBEdWFsRmllbGRSb3dXaWRnZXQgY29udHJvbCkKLSAgICB7Ci0JaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCSAgICBTdHJpbmcgdmFsdWVbXTsKLQotCSAgICB2YWx1ZSA9IGNvbnRyb2wuZ2V0VmFsdWUoKTsKLQkgICAgY29uZmlnLnNldEF0dHJpYnV0ZShhdHRyMSwgdmFsdWVbMF0udHJpbSgpKTsKLQkgICAgY29uZmlnLnNldEF0dHJpYnV0ZShhdHRyMiwgdmFsdWVbMV0udHJpbSgpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHZhbHVlIGZyb20gYSBDb21ib1Jvd1dpZGdldCBpbnRvIHRoZSBzcGVjaWZpZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaWYgdGhlIHdpZGdldCBpcyBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGF0dHIgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBjb250cm9sIFRoZSB3aWRnZXQgdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbmZpZ0F0dHIoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsIFN0cmluZyBhdHRyLCBDb21ib1Jvd1dpZGdldCBjb250cm9sKQotICAgIHsKLQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgY29udHJvbC5nZXRWYWx1ZSgpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHZhbHVlIGZyb20gYSBmaWxlIHNlbGVjdG9yIGludG8gdGhlIHNwZWNpZmllZCBsYXVuY2ggY29uZmlndXJhdGlvbiBpZiB0aGUgZmlsZSBzZWxlY3RvciBpcyBub3QgbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gYXR0ciBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICogQHBhcmFtIGNvbnRyb2wgVGhlIHdpZGdldCB0byBvYnRhaW4gdGhlIHZhbHVlIGZyb20KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Q29uZmlnQXR0cihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZywgU3RyaW5nIGF0dHIsIEZpbGVTZWxlY3RvclJvd1dpZGdldCBjb250cm9sKQotICAgIHsKLQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgY29udHJvbC5nZXRWYWx1ZSgpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHZhbHVlIGZyb20gYSBCdXR0b24gd2lkZ2V0IGludG8gdGhlIHNwZWNpZmllZCBsYXVuY2ggY29uZmlndXJhdGlvbiBpZiB0aGUgd2lkZ2V0IGlzIG5vdCBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBhdHRyIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gY29udHJvbCBUaGUgd2lkZ2V0IHRvIG9idGFpbiB0aGUgdmFsdWUgZnJvbQotICAgICAqIEBwYXJhbSB0cnVlVmFsIFRoZSB2YWx1ZSB0byBzZXQgaWYgdGhlIGJ1dHRvbiBpcyBzZWxlY3RlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRDb25maWdBdHRyKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBTdHJpbmcgYXR0ciwgQ2hlY2tib3hSb3dXaWRnZXQgY29udHJvbCwKLQkgICAgU3RyaW5nIHRydWVWYWwsIFN0cmluZyBmYWxzZVZhbCkKLSAgICB7Ci0JaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCSAgICBjb25maWcuc2V0QXR0cmlidXRlKGF0dHIsIChjb250cm9sLmdldFNlbGVjdGlvbigpID8gdHJ1ZVZhbCA6IGZhbHNlVmFsKSk7Ci0JfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDb25maWdBdHRyKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBTdHJpbmcgYXR0ciwgQm9vbGVhblJvd1dpZGdldCBjb250cm9sKQotICAgIHsKLQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoYXR0ciwgY29udHJvbC5nZXRWYWx1ZSgpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgdmFsdWVzIGVudGVyZWQgaW4gdGhpcyBwYW5lbCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb25EYXRhKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBJUmVzb3VyY2VNYW5hZ2VyIHJtKQotICAgIHsKLQlPYmplY3Qgd2lkZ2V0OwotCUl0ZXJhdG9yPE9iamVjdD4gaTsKLQotCWlmIChhY3RpdmVXaWRnZXRzICE9IG51bGwpIHsKLQkgICAgaSA9IGFjdGl2ZVdpZGdldHMuaXRlcmF0b3IoKTsKLQkgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCXdpZGdldCA9IGkubmV4dCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVGV4dFJvd1dpZGdldCkgewotCQkgICAgc2V0Q29uZmlnQXR0cihjb25maWcsIHJtLCAoKFRleHRSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkFUVFJfTkFNRSksCi0JCQkgICAgKFRleHRSb3dXaWRnZXQpIHdpZGdldCk7Ci0JCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tYm9Sb3dXaWRnZXQpIHsKLQkJICAgIHNldENvbmZpZ0F0dHIoY29uZmlnLCAoU3RyaW5nKSAoKENvbWJvUm93V2lkZ2V0KSB3aWRnZXQpLmdldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5BVFRSX05BTUUpLAotCQkJICAgIChDb21ib1Jvd1dpZGdldCkgd2lkZ2V0KTsKLQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDaGVja2JveFJvd1dpZGdldCkgewotCQkgICAgc2V0Q29uZmlnQXR0cihjb25maWcsIChTdHJpbmcpICgoQ2hlY2tib3hSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkFUVFJfTkFNRSksCi0JCQkgICAgKENoZWNrYm94Um93V2lkZ2V0KSB3aWRnZXQsICJ5ZXMiLCAibm8iKTsKLQkJfSBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBCb29sZWFuUm93V2lkZ2V0KSB7Ci0JCSAgICBzZXRDb25maWdBdHRyKGNvbmZpZywgKFN0cmluZykgKChCb29sZWFuUm93V2lkZ2V0KSB3aWRnZXQpLmdldERhdGEoKSwgKEJvb2xlYW5Sb3dXaWRnZXQpIHdpZGdldCk7Ci0JCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgRmlsZVNlbGVjdG9yUm93V2lkZ2V0KSB7Ci0JCSAgICBzZXRDb25maWdBdHRyKGNvbmZpZywgKFN0cmluZykgKChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YSgpLAotCQkJICAgIChGaWxlU2VsZWN0b3JSb3dXaWRnZXQpIHdpZGdldCk7Ci0JCX0gZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHVhbEZpZWxkUm93V2lkZ2V0KSB7Ci0JCSAgICBzZXRDb25maWdBdHRyKGNvbmZpZywgKFN0cmluZykgKChEdWFsRmllbGRSb3dXaWRnZXQpIHdpZGdldCkuZ2V0RGF0YTEoKSwKLQkJCSAgICAoU3RyaW5nKSAoKER1YWxGaWVsZFJvd1dpZGdldCkgd2lkZ2V0KS5nZXREYXRhMigpLCAoRHVhbEZpZWxkUm93V2lkZ2V0KSB3aWRnZXQpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNwZXJmb3JtQXBwbHkob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5LAotICAgICAqICAgICAgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpCi0gICAgICovCi0gICAgcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCSAgICBJUFF1ZXVlIHF1ZXVlKQotICAgIHsKLQljdXJyZW50TGF1bmNoQ29uZmlnID0gY29uZmlndXJhdGlvbjsKLQlzYXZlQ29uZmlndXJhdGlvbkRhdGEoY29uZmlndXJhdGlvbiwgcm0pOwotCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsICIiKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSwKLSAgICAgKiAgICAgIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFF1ZXVlKQotICAgICAqLwotICAgIHB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JICAgIElQUXVldWUgcXVldWUpCi0gICAgewotCUlBdHRyaWJ1dGU8PywgPywgPz4gcm1BdHRyc1tdOwotCi0JY3VycmVudExhdW5jaENvbmZpZyA9IGNvbmZpZzsKLQlybUF0dHJzID0gcm0uZ2V0QXR0cmlidXRlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcm1BdHRycy5sZW5ndGg7IGkrKykgewotCSAgICB0cnkgewotCQljb25maWcuc2V0QXR0cmlidXRlKHJtQXR0cnNbaV0uZ2V0RGVmaW5pdGlvbigpLmdldElkKCksCi0JCSAgICAJCSAgICBybUF0dHJzW2ldLmdldERlZmluaXRpb24oKS5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOwotCSAgICB9Ci0JICAgIGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCSAgICB9Ci0JfQotLy8Jc2V0RGVmYXVsdFZhbHVlcyhjb25maWcsIHJtKTsKLQlyZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgdmFsaWRhdGlvbiBvZiBhbGwgZmllbGRzIGluIHRoZSB0YWJiZWQgcGFuZSBvZiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24ncyBwYXJhbGxlbCB0YWIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBbGxGaWVsZHMoKQotICAgIHsKLQkvLyBUaGlzIG1ldGhvZCBpcyB0aGUgdG9wIGxldmVsIGRyaXZlciBmb3IgdmFsaWRhdGluZyB0aGUgZmllbGRzIGluIHRoZQotCS8vIHRhYmJlZCBwYW5lLiBJdCBpcyBjYWxsZWQgd2hlbiBhIGZpZWxkIGluIHRoZSB0YWJiZWQgcGFuZSBpcyBtb2RpZmllZCwgdmlhIGEgTW9kaWZ5TGlzdGVuZXIgcmVnaXN0ZXJlZCBvbgotCS8vIGVhY2ggdGV4dCBvciBlZGl0YWJsZSBjb21ib2JveCB3aWRnZXQgSXQgY2FsbHMgYSB2YWxpZGF0aW9uIG1ldGhvZCBmb3IgZWFjaCB0YWIgaW4gdGhlIHBhbmUuIFZhbGlkYXRpb24KLQkvLyBzaG91bGQgYmUgZG9uZSBpbiB0YWIgb3JkZXIsIGxlZnQgdG8gcmlnaHQsCi0JLy8gQWxsIHZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgc2NvcGUgb2YgYSB0cnkgYmxvY2sgd2hpY2ggY2F0Y2hlcyBhbnkgVmFsaWRhdGlvbkV4Y2VwdGlvbiBwcm9wYWdhdGVkIHVwCi0JLy8gZnJvbSBsb3dlciBsZXZlbCBtZXRob2RzLiBUaGUgaWRlYSBpcyB0byB2YWxpZGF0ZSB0aGUgZmllbGRzIHdpdGhpbiB0YWIgb3JkZXIgbGVmdCB0byByaWdodCwgdGhlbiB3aXRoaW4gZWFjaAotCS8vIHRhYiwgZnJvbSB0b3AgdG8gYm90dG9tLiBFYWNoIHZhbGlkYXRpb24gbWV0aG9kIHdpbGwgdGhyb3cgYSBWYWxpZGF0aW9uRXhjZXB0aW9uIGlmIHRoYXQgZmllbGQgZmFpbHMKLQkvLyB2YWxpZGF0aW9uLCB3aGVyZSB0aGUgdGhyb3duIGV4Y2VwdGlvbiB3aWxsIHN0b3AgZnVydGhlciB2YWxpZGF0aW9uIG9mIHRoZSBwYW5lLiBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgZmllbGRzCi0JLy8gdG8gYmUgZWFzaWx5IG1vdmVkIHRvIGFub3RoZXIgcGFuZSwgb3IgdG8gcmVvcmRlciBmaWVsZHMgd2l0aGluIGEgcGFuZS4gVXNpbmcgYW4gZXhjZXB0aW9uIHRvIHRlcm1pbmF0ZQotCS8vIHZhbGlkYXRpb24gYWxzbyBhdm9pZHMgY2x1dHRlcmluZyB0aGUgbG9naWMgb2YgdGhlIHZhbGlkYXRpb24gbWV0aG9kIHdpdGggZGVlcGx5IG5lc3RlZCAnaWYgLi4uIGVsc2UgLi4uJwotCS8vIGxvZ2ljLgotCS8vIElmIGFsbCBmaWVsZHMgYXJlIHZhbGlkLCB0aGVuIHRoZSBhbGxGaWVsZHNWYWxpZCBmbGFnIGlzIHNldCBzbyB0aGF0IHRoZSBpc1ZhbGlkKCkgYW5kIGNhblNhdmUoKSBtZXRob2RzIGNhbgotCS8vIGVhc2lseSBjaGVjayBwYW5lbCB2YWxpZGl0eS4KLQkvLyBWYWxpZGF0aW9uIG9mIHZhbGlkIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGZpZWxkcyBzaG91bGQgYmUgcGVyZm9ybWVkIGFzIGEgc2Vjb25kIHN0ZXAgYWZ0ZXIgYWxsIGZpZWxkcyBoYXZlCi0JLy8gYmVlbiBpbmRpdmlkdWFsbHkgdmFsaWRhdGVkIGZvciBjb3JyZWN0IHZhbHVlcy4KLQl0cnkgewotCSAgICBpZiAocGVBZHZhbmNlZE1vZGUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJdmFsaWRhdGVJbnB1dFBhdGgocGVFbnZTY3JpcHQsICJJbnZhbGlkLnBlRW52U2NyaXB0Iik7Ci0JCXZhbGlkYXRlUmVkaXJlY3RCb3goKTsKLQkgICAgfSBlbHNlIHsKLQkJdmFsaWRhdGVSZWRpcmVjdEJveCgpOwotCQl2YWxpZGF0ZVRhc2tzVGFiKCk7Ci0JCXZhbGlkYXRlSU9UYWIoKTsKLQkJdmFsaWRhdGVEaWFnbm9zdGljVGFiKCk7Ci0JCXZhbGlkYXRlRGVidWdUYWIoKTsKLQkJdmFsaWRhdGVTeXN0ZW1UYWIoKTsKLQkJdmFsaWRhdGVOb2RlVGFiKCk7Ci0JCXZhbGlkYXRlUGVyZm9ybWFuY2VUYWIxKCk7Ci0JCXZhbGlkYXRlUGVyZm9ybWFuY2VUYWIyKCk7Ci0JCXZhbGlkYXRlUk1UYWIoKTsKLQkJdmFsaWRhdGVNaXNjVGFiKCk7Ci0JICAgIH0KLQkgICAgYWxsRmllbGRzVmFsaWQgPSB0cnVlOwotCX0KLQljYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JICAgIGVycm9yTWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCSAgICBhbGxGaWVsZHNWYWxpZCA9IGZhbHNlOwotCX0KLQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBhbiBpbnRlZ2VyIHZhbHVlIGlzIHdpdGhpbiB0aGUgcmFuZ2UgYWxsb3dlZCBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgdmVyaWZpZWQKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBlcnJvcklEIFRoZSBpZCBvZiB0aGUgZXJyb3IgbWVzc2FnZSB1c2VkIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gSW5kaWNhdGVzIHRoYXQgVGV4dCB3aWRnZXQgZmFpbGVkIHZhbGlkYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVOdW1lcmljUmFuZ2UoU3RyaW5nIHZhbHVlLCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IHRlc3RWYWx1ZTsKLSAgICAgICAgaW50IGxlbjsKLSAgICAgICAgY2hhciBzdWZmaXg7Ci0KLSAgICAgICAgbGVuID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIHN1ZmZpeCA9IHZhbHVlLmNoYXJBdChsZW4gLSAxKTsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHN1ZmZpeCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAl0ZXN0VmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgCXRlc3RWYWx1ZSA9IEludGVnZXIudmFsdWVPZih2YWx1ZS5zdWJzdHJpbmcoMCwgbGVuIC0gMSkpOwotICAgICAgICAJaWYgKChzdWZmaXggPT0gJ0cnKSB8fCAoc3VmZml4ID09ICdnJykpIHsKLSAgICAgICAgCSAgICB0ZXN0VmFsdWUgPSB0ZXN0VmFsdWUgKiBHQllURTsKLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UgaWYgKChzdWZmaXggPT0gJ00nKSB8fCAoc3VmZml4ID09ICdtJykpIHsKLSAgICAgICAgCSAgICB0ZXN0VmFsdWUgPSB0ZXN0VmFsdWUgKiBNQllURTsKLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UgaWYgKChzdWZmaXggPT0gJ0snKSB8fCAoc3VmZml4ID09ICdrJykpIHsKLSAgICAgICAgCSAgICB0ZXN0VmFsdWUgPSB0ZXN0VmFsdWUgKiBLQllURTsKLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UgewotICAgICAgICAJICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0gICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmFsaWRhdGVOdW1lcmljUmFuZ2UodGVzdFZhbHVlLCBhdHRyTmFtZSwgZXJyb3JJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgZmlsZSBzZWxlY3RvcnMgdXNlZCB0byBzcGVjaWZ5IHN0ZGlvIHJlZGlyZWN0aW9uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVSZWRpcmVjdEJveCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCXZhbGlkYXRlSW5wdXRQYXRoKHBlU3RkaW5QYXRoLCAiSW52YWxpZC5wZVN0ZGluUGF0aCIpOwotCXZhbGlkYXRlT3V0cHV0UGF0aChwZVN0ZG91dFBhdGgsICJJbnZhbGlkLnBlU3Rkb3V0UGF0aCIpOwotCXZhbGlkYXRlT3V0cHV0UGF0aChwZVN0ZGVyclBhdGgsICJJbnZhbGlkLnBlU3RkZXJyUGF0aCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGZpZWxkcyBpbiB0YXNrIHNwZWNpZmljYXRpb24gdGFiCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGFza3NUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZUlucHV0UGF0aChtcEhvc3RGaWxlLCAiSW52YWxpZC5tcEhvc3RGaWxlIik7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBQcm9jcywgTVBfUFJPQ1MsICJJbnZhbGlkLm1wUHJvY3MiKTsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcE5vZGVzLCBNUF9OT0RFUywgIkludmFsaWQubXBOb2RlcyIpOwotCXZhbGlkYXRlTnVtZXJpY1JhbmdlKG1wVGFza3NQZXJOb2RlLCBNUF9UQVNLU19QRVJfTk9ERSwgIkludmFsaWQubXBUYXNrc1Blck5vZGUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSBhbGwgdGV4dCBhbmQgZWRpdGFibGUgY29tYm9ib3ggZmllbGRzIGluIHRoZSBJL08gdGFiLCB0b3AgdG8gYm90dG9tCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVJT1RhYigpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCXZhbGlkYXRlU3RkaW5Nb2RlKCk7Ci0JdmFsaWRhdGVTdGRvdXRNb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgYWxsIHRleHQgYW5kIGVkaXRhYmxlIGNvbWJvYm94IGZpZWxkcyBpbiBkaWFnbm9zdGljIHRhYiwgdG9wIHRvIGJvdHRvbQotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGlhZ25vc3RpY1RhYigpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gdGhlIGRlYnVnIHRhYiwgdG9wIHRvIGJvdHRvbQotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGVidWdUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZUNvcmVmaWxlRm9ybWF0KCk7Ci0JdmFsaWRhdGVEaXJlY3RvcnkobXBDb3JlRGlyLCAiSW52YWxpZC5tcENvcmVEaXIiKTsKLQl2YWxpZGF0ZURpcmVjdG9yeShtcFByb2ZEaXIsICJJbnZhbGlkLm1wUHJvZkRpciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gdGhlIHN5c3RlbSByZXNvdXJjZXMgdGFiLCB0b3AgdG8gYm90dG9tCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTeXN0ZW1UYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZUluc3RhbmNlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gdGhlIG5vZGUgYWxsb2NhdGlvbiB0YWIsIHRvcCB0byBib3R0b20KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU5vZGVUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcFRhc2tzUGVyTm9kZSwgTVBfVEFTS1NfUEVSX05PREUsICJJbnZhbGlkLm1wVGFza3NQZXJOb2RlIik7Ci0JdmFsaWRhdGVJbnB1dFBhdGgobXBSZW1vdGVEaXIsICJJbnZhbGlkLm1wUmVtb3RlRGlyIik7Ci0JdmFsaWRhdGVJbnB1dFBhdGgobXBDbWRGaWxlLCAiSW52YWxpZC5tcENtZEZpbGUiKTsKLQl2YWxpZGF0ZUlucHV0UGF0aChtcExMRmlsZSwgIkludmFsaWQubXBMTEZpbGUiKTsKLQl2YWxpZGF0ZVJldHJ5KCk7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBSZXRyeUNvdW50LCBNUF9SRVRSWV9DT1VOVCwgIkludmFsaWQubXBSZXRyeUNvdW50Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgYWxsIHRleHQgYW5kIGVkaXRhYmxlIGNvbWJvYm94IGZpZWxkcyBpbiBwZXJmb3JtYW5jZSB0YWIgMSwgdG9wIHRvIGJvdHRvbQotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGVyZm9ybWFuY2VUYWIxKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBBY2tUaHJlc2gsIE1QX0FDS19USFJFU0gsICJJbnZhbGlkLm1wQWNrVGhyZXNoIik7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBQb2xsaW5nSW50ZXJ2YWwsIE1QX1BPTExJTkdfSU5URVJWQUwsICJJbnZhbGlkLm1wUG9sbGluZ0ludGVydmFsIik7Ci0JdmFsaWRhdGVSRE1BQ291bnQoKTsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcFVEUFBhY2tldFNpemUsIE1QX1VEUF9QQUNLRVRfU0laRSwgIkludmFsaWQubXBVRFBQYWNrZXRTaXplIik7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBCdWxrTWluTXNnU2l6ZSwgTVBfQlVMS19NSU5fTVNHX1NJWkUsICJJbnZhbGlkLm1wQnVsa01pbk1zZ1NpemUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSBhbGwgdGV4dCBhbmQgZWRpdGFibGUgY29tYm9ib3ggZmllbGRzIGluIHBlcmZvcm1hbmNlIHRhYiAyLCB0b3AgdG8gYm90dG9tCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQZXJmb3JtYW5jZVRhYjIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZUJ1ZmZlck1lbSgpOwotCXZhbGlkYXRlTnVtZXJpY1JhbmdlKG1wTXNnRW52ZWxvcGVCdWYsIE1QX01TR19FTlZFTE9QRV9CVUYsICJJbnZhbGlkLm1wTXNnRW52ZWxvcGVCdWYiKTsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcEVhZ2VyTGltaXQsIE1QX0VBR0VSX0xJTUlULCAiSW52YWxpZC5tcEVhZ2VyTGltaXQiKTsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcFJldHJhbnNtaXRJbnRlcnZhbCwgTVBfUkVUUkFOU01JVF9JTlRFUlZBTCwgIkludmFsaWQubXBSZXRyYW5zbWl0SW50ZXJ2YWwiKTsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcFJleG1pdEJ1ZkNudCwgTVBfUkVYTUlUX0JVRl9DTlQsICJJbnZhbGlkLm1wUmV4bWl0QnVmQ250Iik7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBSZXhtaXRCdWZTaXplLCBNUF9SRVhNSVRfQlVGX1NJWkUsICJJbnZhbGlkLm1wUmV4bWl0QnVmU2l6ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGFsbCB0ZXh0IGFuZCBlZGl0YWJsZSBjb21ib2JveCBmaWVsZHMgaW4gdGhlIGFsdGVybmF0ZSByZXNvdXJjZSBtYW5hZ2VyIHRhYgotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUk1UYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZUlucHV0UGF0aChtcFJNTGliLCAiSW52YWxpZC5tcFJNTGliIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgYWxsIHRleHQgZmllbGRzIGFuZCBlZGl0YWJsZSBjb21ibyBib3hlcyBpbiB0aGUgbWlzY2VsbGFuZW91cyB0YWIKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1pc2NUYWIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQl2YWxpZGF0ZUlucHV0UGF0aChtcEV1aUxpYlBhdGgsICJJbnZhbGlkLm1wRXVpTGliUGF0aCIpOwotCXZhbGlkYXRlTnVtZXJpY1JhbmdlKG1wUHVsc2UsIE1QX1BVTFNFLCAiSW52YWxpZC5tcFB1bHNlIik7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBUaHJlYWRTdGFja1NpemUsIE1QX1RIUkVBRF9TVEFDS1NJWkUsICJJbnZhbGlkLm1wVGhyZWFkU3RhY2tTaXplIik7Ci0JdmFsaWRhdGVOdW1lcmljUmFuZ2UobXBUaW1lb3V0LCBNUF9USU1FT1VULCAiSW52YWxpZC5tcFRpbWVvdXQiKTsKLQl2YWxpZGF0ZU51bWVyaWNSYW5nZShtcElPQnVmZmVyU2l6ZSwgTVBfSU9fQlVGRkVSX1NJWkUsICJJbnZhbGlkLm1wSU9CdWZmZXJTaXplIik7Ci0JdmFsaWRhdGVPdXRwdXRQYXRoKG1wU2F2ZUxMRmlsZSwgIkludmFsaWQubXBTYXZlTExGaWxlIik7Ci0JdmFsaWRhdGVPdXRwdXRQYXRoKG1wU2F2ZUhvc3RGaWxlLCAiSW52YWxpZC5tcFNhdmVIb3N0RmlsZSIpOwotCXZhbGlkYXRlRGlyZWN0b3J5KG1wUHJpb3JpdHlMb2dEaXIsICJJbnZhbGlkLm1wUHJpb3JpdHlMb2dEaXIiKTsKLQl2YWxpZGF0ZUlucHV0UGF0aChtcElPTm9kZUZpbGUsICJJbnZhbGlkLm1wSU9Ob2RlRmlsZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQgYW4gaW5wdXQgZmlsZSBpcyBhY2Nlc3NpYmxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIGZpbGUgc2VsZWN0b3IgY29udGFpbmluZyB0aGUgcGF0aG5hbWUKLSAgICAgKiBAcGFyYW0gZXJyb3JJRCBpZCBvZiB0aGUgZXJyb3Igc3RyaW5nIHVzZWQgaWYgZmlsZSBpcyBpbmFjY2Vzc2libGUKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVJbnB1dFBhdGgoRmlsZVNlbGVjdG9yUm93V2lkZ2V0IHNlbGVjdG9yLCBTdHJpbmcgZXJyb3JJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JU3RyaW5nIHBhdGg7Ci0KLQlpZiAoKHNlbGVjdG9yICE9IG51bGwpICYmIHNlbGVjdG9yLmlzRW5hYmxlZCgpICYmIHNlbGVjdG9yLmlzVmFsaWRhdGlvblJlcXVpcmVkKCkpIHsKLQkgICAgcGF0aCA9IHNlbGVjdG9yLmdldFZhbHVlKCk7Ci0JICAgIGlmIChwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJc2VsZWN0b3IucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIHRyeSB7Ci0JCXZhbGlkYXRlSW5wdXRQYXRoKHBhdGgsIGVycm9ySUQpOwotCQlzZWxlY3Rvci5yZXNldFZhbGlkYXRpb25TdGF0ZSgpOwotCSAgICB9Ci0JICAgIGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJc2VsZWN0b3Iuc2V0RmllbGRJbkVycm9yKCk7Ci0JCXRocm93IGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBhbiBvdXRwdXQgZmlsZSBpcyBhY2Nlc3NpYmxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIGZpbGUgc2VsZWN0b3IgY29udGFpbmluZyB0aGUgcGF0aG5hbWUKLSAgICAgKiBAcGFyYW0gZXJyb3JJRCBpZCBvZiB0aGUgZXJyb3Igc3RyaW5nIHVzZWQgaWYgdGhlIGZpbGUgaXMgaW5hY2Nlc3NpYmxlCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT3V0cHV0UGF0aChGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQlTdHJpbmcgcGF0aDsKLQotCWlmICgoc2VsZWN0b3IgIT0gbnVsbCkgJiYgc2VsZWN0b3IuaXNFbmFibGVkKCkgJiYgc2VsZWN0b3IuaXNWYWxpZGF0aW9uUmVxdWlyZWQoKSkgewotCSAgICBwYXRoID0gc2VsZWN0b3IuZ2V0VmFsdWUoKTsKLQkgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQlzZWxlY3Rvci5yZXNldFZhbGlkYXRpb25TdGF0ZSgpOwotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgdHJ5IHsKLQkJdmFsaWRhdGVPdXRwdXRQYXRoKHBhdGgsIGVycm9ySUQpOwotCQlzZWxlY3Rvci5yZXNldFZhbGlkYXRpb25TdGF0ZSgpOwotCSAgICB9Ci0JICAgIGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJc2VsZWN0b3Iuc2V0RmllbGRJbkVycm9yKCk7Ci0JCXRocm93IGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBpbiBpbnB1dCBmaWxlIGlzIGFjY2Vzc2libGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lIG9mIHRoZSBpbnB1dCBmaWxlCi0gICAgICogQHBhcmFtIGVycm9ySUQgaWQgb2YgdGhlIGVycm9yIHN0cmluZyB1c2VkIGlmIHRoZSBmaWxlIGlzIGluYWNjZXNzaWJsZQotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUlucHV0UGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGVycm9ySUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCUlQYXRoIHRlc3RQYXRoOwotCUlGaWxlU3RvcmUgcmVtb3RlUmVzb3VyY2U7Ci0JSUZpbGVJbmZvIGZpbGVJbmZvOwotCi0JdGVzdFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQlpZiAoISB0ZXN0UGF0aC5pc1ZhbGlkUGF0aChwYXRoKSkgewotCSAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCX0KLQl0cnkgewotCSAgICByZW1vdGVSZXNvdXJjZSA9IHJlbW90ZVNlcnZpY2UuZ2V0RmlsZU1hbmFnZXIocmVtb3RlQ29ubmVjdGlvbikuZ2V0UmVzb3VyY2UodGVzdFBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCSAgICBmaWxlSW5mbyA9IHJlbW90ZVJlc291cmNlLmZldGNoSW5mbygpOwotCSAgICBpZiAoKCEgZmlsZUluZm8uZXhpc3RzKCkpIHx8IChmaWxlSW5mby5pc0RpcmVjdG9yeSgpKSkgewotCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCSAgICB9Ci0JfQotCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW52YWxpZC5yZW1vdGVDb25uZWN0aW9uRXJyb3IiKSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBhbiBvdXRwdXQgZmlsZSBpcyBhY2Nlc3NpYmxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCBQYXRobmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUKLSAgICAgKiBAcGFyYW0gZXJyb3JJRCBpZCBvZiB0aGUgZXJyb3Igc3RyaW5nIHVzZWQgaWYgdGhlIGZpbGUgaXMgbm90IGFjY2Vzc2libGUKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVPdXRwdXRQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgZXJyb3JJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JSVBhdGggdGVzdFBhdGg7Ci0JSUZpbGVTdG9yZSByZW1vdGVSZXNvdXJjZTsKLQlJRmlsZUluZm8gZmlsZUluZm87Ci0KLQl0ZXN0UGF0aCA9IG5ldyBQYXRoKHBhdGgpOwotCWlmICghIHRlc3RQYXRoLmlzVmFsaWRQYXRoKHBhdGgpKSB7Ci0JICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JfQotCXRyeSB7Ci0JICAgIHJlbW90ZVJlc291cmNlID0gcmVtb3RlU2VydmljZS5nZXRGaWxlTWFuYWdlcihyZW1vdGVDb25uZWN0aW9uKS5nZXRSZXNvdXJjZSh0ZXN0UGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JICAgIGZpbGVJbmZvID0gcmVtb3RlUmVzb3VyY2UuZmV0Y2hJbmZvKCk7Ci0JICAgIGlmIChmaWxlSW5mby5pc0RpcmVjdG9yeSgpKSB7Ci0JCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JICAgIH0KLQl9Ci0JY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnZhbGlkLnJlbW90ZUNvbm5lY3Rpb25FcnJvciIpICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBkaXJlY3RvcnkgcGF0aG5hbWUgaXMgdmFsaWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBGaWxlIHNlbGVjdG9yIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBuYW1lCi0gICAgICogQHBhcmFtIGVycm9ySUQgaWQgb2YgdGhlIGVycm9yIHN0cmluZyB1c2VkIGlmIHRoZSBkaXJlY3RvcnkgaXMgaW52YWxpZAotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZURpcmVjdG9yeShGaWxlU2VsZWN0b3JSb3dXaWRnZXQgc2VsZWN0b3IsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQlTdHJpbmcgcGF0aDsKLQlJUGF0aCB0ZXN0UGF0aDsKLQlJRmlsZVN0b3JlIHJlbW90ZVJlc291cmNlOwotCUlGaWxlSW5mbyBmaWxlSW5mbzsKLQotCWlmICgoc2VsZWN0b3IgIT0gbnVsbCkgJiYgc2VsZWN0b3IuaXNFbmFibGVkKCkgJiYgc2VsZWN0b3IuaXNWYWxpZGF0aW9uUmVxdWlyZWQoKSkgewotCSAgICBwYXRoID0gc2VsZWN0b3IuZ2V0VmFsdWUoKTsKLQkgICAgdHJ5IHsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkgICAgc2VsZWN0b3IucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLQkJICAgIHJldHVybjsKLQkJfQotCi0JCXRlc3RQYXRoID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmICghIHRlc3RQYXRoLmlzVmFsaWRQYXRoKHBhdGgpKSB7Ci0JCSAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoZXJyb3JJRCkpOwotCQl9Ci0JCXRyeSB7Ci0JCSAgICByZW1vdGVSZXNvdXJjZSA9IHJlbW90ZVNlcnZpY2UuZ2V0RmlsZU1hbmFnZXIocmVtb3RlQ29ubmVjdGlvbikuZ2V0UmVzb3VyY2UodGVzdFBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkgICAgZmlsZUluZm8gPSByZW1vdGVSZXNvdXJjZS5mZXRjaEluZm8oKTsKLQkJICAgIGlmICghIGZpbGVJbmZvLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JCSAgICB9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW52YWxpZC5yZW1vdGVDb25uZWN0aW9uRXJyb3IiKSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlzZWxlY3Rvci5yZXNldFZhbGlkYXRpb25TdGF0ZSgpOwotCSAgICB9Ci0JICAgIGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJc2VsZWN0b3Iuc2V0RmllbGRJbkVycm9yKCk7Ci0JCXRocm93IGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIE1QX1NURElOTU9ERSBzZXR0aW5nCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTdGRpbk1vZGUoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQlTdHJpbmcgd2lkZ2V0VmFsdWU7Ci0JaW50IG51bVByb2NzOwotCi0JaWYgKChtcFN0ZGluTW9kZSAhPSBudWxsKSAmJiAobXBTdGRpbk1vZGUuaXNFbmFibGVkKCkpKSB7Ci0JICAgIHdpZGdldFZhbHVlID0gbXBTdGRpbk1vZGUuZ2V0VmFsdWUoKTsKLQkgICAgaWYgKHdpZGdldFZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIGlmIChpc1ZhbGlkTGlzdFNlbGVjdGlvbihtcFN0ZGluTW9kZSwgTVBfU1RESU5NT0RFKSkgewotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgdHJ5IHsKLQkJbnVtUHJvY3MgPSBJbnRlZ2VyLnZhbHVlT2YobXBQcm9jcy5nZXRWYWx1ZSgpKTsKLQkgICAgfQotCSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnZhbGlkLm1wU3RkaW5Nb2RlIikpOwotCSAgICB9Ci0JICAgIHZhbGlkYXRlTnVtZXJpY1JhbmdlKHdpZGdldFZhbHVlLCAwLCBudW1Qcm9jcywgIkludmFsaWQubXBTdGRpbk1vZGUiKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIE1QX1NURE9VVE1PREUgc2V0dGluZwotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU3Rkb3V0TW9kZSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCVN0cmluZyB3aWRnZXRWYWx1ZTsKLQlpbnQgbnVtUHJvY3M7Ci0KLQlpZiAoKG1wU3Rkb3V0TW9kZSAhPSBudWxsKSAmJiAobXBTdGRvdXRNb2RlLmlzRW5hYmxlZCgpKSkgewotCSAgICB3aWRnZXRWYWx1ZSA9IG1wU3Rkb3V0TW9kZS5nZXRWYWx1ZSgpOwotCSAgICBpZiAod2lkZ2V0VmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgaWYgKGlzVmFsaWRMaXN0U2VsZWN0aW9uKG1wU3Rkb3V0TW9kZSwgTVBfU1RET1VUTU9ERSkpIHsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIHRyeSB7Ci0JCW51bVByb2NzID0gSW50ZWdlci52YWx1ZU9mKG1wUHJvY3MuZ2V0VmFsdWUoKSk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW52YWxpZC5tcFN0ZG91dE1vZGUiKSk7Ci0JICAgIH0KLQkgICAgdmFsaWRhdGVOdW1lcmljUmFuZ2Uod2lkZ2V0VmFsdWUsIDAsIG51bVByb2NzIC0gMSwgIkludmFsaWQubXBTdGRvdXRNb2RlIik7Ci0JfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvcmVmaWxlRm9ybWF0KCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0KLQlpZiAoKG1wQ29yZWZpbGVGb3JtYXQgIT0gbnVsbCkgJiYgbXBDb3JlZmlsZUZvcm1hdC5pc0VuYWJsZWQoKSAmJiBtcENvcmVmaWxlRm9ybWF0LmlzVmFsaWRhdGlvblJlcXVpcmVkKCkpIHsKLQkgICAgU3RyaW5nIHdpZGdldFZhbHVlOwotCSAgICB3aWRnZXRWYWx1ZSA9IG1wQ29yZWZpbGVGb3JtYXQuZ2V0VmFsdWUoKTsKLQkgICAgdHJ5IHsKLQkJaWYgKHdpZGdldFZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJICAgIHJldHVybjsKLQkJfQotCQlpZiAoaXNWYWxpZExpc3RTZWxlY3Rpb24obXBDb3JlZmlsZUZvcm1hdCwgTVBfQ09SRUZJTEVfRk9STUFUKSkgewotCQkgICAgcmV0dXJuOwotCQl9Ci0JCXZhbGlkYXRlT3V0cHV0UGF0aCh3aWRnZXRWYWx1ZSwgIkludmFsaWQubXBDb3JlZmlsZUZvcm1hdCIpOwotCQltcENvcmVmaWxlRm9ybWF0LnJlc2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQltcENvcmVmaWxlRm9ybWF0LnNldEZpZWxkSW5FcnJvcigpOwotCQl0aHJvdyBlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBNUF9JTlNUQU5DRVMgc2V0dGluZwotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW5zdGFuY2VzKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JaWYgKChtcEluc3RhbmNlcyAhPSBudWxsKSAmJiAobXBJbnN0YW5jZXMuaXNFbmFibGVkKCkpKSB7Ci0JICAgIFN0cmluZyB3aWRnZXRWYWx1ZTsKLQotCSAgICB3aWRnZXRWYWx1ZSA9IG1wSW5zdGFuY2VzLmdldFZhbHVlKCk7Ci0JICAgIGlmICh3aWRnZXRWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBpZiAoaXNWYWxpZExpc3RTZWxlY3Rpb24obXBJbnN0YW5jZXMsIE1QX0lOU1RBTkNFUykpIHsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIHZhbGlkYXRlTnVtZXJpY1JhbmdlKHdpZGdldFZhbHVlLCBNUF9JTlNUQU5DRVNfSU5ULCAiSW52YWxpZC5tcEluc3RhbmNlcyIpOwotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGUgTVBfUkVUUlkgc2V0dGluZwotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmV0cnkoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQlpZiAoKG1wUmV0cnkgIT0gbnVsbCkgJiYgKG1wUmV0cnkuaXNFbmFibGVkKCkpKSB7Ci0JICAgIFN0cmluZyB3aWRnZXRWYWx1ZTsKLQotCSAgICB3aWRnZXRWYWx1ZSA9IG1wUmV0cnkuZ2V0VmFsdWUoKTsKLQkgICAgaWYgKHdpZGdldFZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIGlmIChpc1ZhbGlkTGlzdFNlbGVjdGlvbihtcFJldHJ5LCBNUF9SRVRSWSkpIHsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIHZhbGlkYXRlTnVtZXJpY1JhbmdlKHdpZGdldFZhbHVlLCBNUF9SRVRSWV9JTlQsICJJbnZhbGlkLm1wUmV0cnkiKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIE1QX1JETUFfQ09VTlQgc2V0dGluZwotICAgICAqCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUkRNQUNvdW50KCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JaWYgKChwZVJETUFDb3VudCAhPSBudWxsKSAmJiAocGVSRE1BQ291bnQuaXNFbmFibGVkKCkpKSB7Ci0JICAgIFN0cmluZyB3aWRnZXRWYWx1ZVtdOwotCi0JICAgIHdpZGdldFZhbHVlID0gcGVSRE1BQ291bnQuZ2V0VmFsdWUoKTsKLQkgICAgaWYgKCh3aWRnZXRWYWx1ZVswXS5sZW5ndGgoKSA9PSAwKSAmJiAod2lkZ2V0VmFsdWVbMV0ubGVuZ3RoKCkgPiAwKSkgewotCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQucGVSRE1BQ291bnRQYWlyIikpOwotCSAgICB9Ci0JICAgIGlmICh3aWRnZXRWYWx1ZVswXS5sZW5ndGgoKSA+IDApIHsKLQkJdmFsaWRhdGVOdW1lcmljUmFuZ2Uod2lkZ2V0VmFsdWVbMF0sIFBFX0JVRkZFUl9NRU0sICJJbnZhbGlkLnBlUkRNQUNvdW50Iik7Ci0JICAgIH0KLQkgICAgaWYgKHdpZGdldFZhbHVlWzFdLmxlbmd0aCgpID4gMCkgewotCQl2YWxpZGF0ZUxvbmdOdW1lcmljUmFuZ2Uod2lkZ2V0VmFsdWVbMV0sIFBFX0JVRkZFUl9NRU1fTUFYLCAiSW52YWxpZC5wZVJETUFDb3VudCIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBNUF9CVUZGRVJfTUVNIHNldHRpbmcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJ1ZmZlck1lbSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCWlmICgocGVCdWZmZXJNZW0gIT0gbnVsbCkgfHwgcGVCdWZmZXJNZW0uaXNFbmFibGVkKCkgJiYgcGVCdWZmZXJNZW0uaXNWYWxpZGF0aW9uUmVxdWlyZWQoKSkgewotCSAgICBTdHJpbmcgd2lkZ2V0VmFsdWVbXTsKLQotCSAgICB3aWRnZXRWYWx1ZSA9IHBlQnVmZmVyTWVtLmdldFZhbHVlKCk7Ci0JICAgIHRyeSB7Ci0JCWlmICh3aWRnZXRWYWx1ZVswXS5sZW5ndGgoKSA+IDApIHsKLQkJICAgIHZhbGlkYXRlTnVtZXJpY1JhbmdlKHdpZGdldFZhbHVlWzBdLCBQRV9CVUZGRVJfTUVNLCAiSW52YWxpZC5wZUJ1ZmZlck1lbSIpOwotCQl9Ci0JCWlmICh3aWRnZXRWYWx1ZVsxXS5sZW5ndGgoKSA+IDApIHsKLQkJICAgIHZhbGlkYXRlTG9uZ051bWVyaWNSYW5nZSh3aWRnZXRWYWx1ZVsxXSwgUEVfQlVGRkVSX01FTV9NQVgsICJJbnZhbGlkLnBlQnVmZmVyTWVtMiIpOwotCQl9Ci0JCXBlQnVmZmVyTWVtLnJlc2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQlwZUJ1ZmZlck1lbS5zZXRGaWVsZEluRXJyb3IoKTsKLQkJdGhyb3cgZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCB0aGUgdmFsdWUgc2VsZWN0ZWQgb3IgZW50ZXJlZCBpbiBhbiBlZGl0YWJsZSBjb21ib2JveCBpcyBhIHZhbGlkIHZhbHVlLCBhcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZQotICAgICAqIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgYXR0cmlidXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHdpZGdldCBUaGUgY29tYm9ib3ggdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgc2VsZWN0aW9uLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZExpc3RTZWxlY3Rpb24oQ29tYm9Sb3dXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgYXR0ck5hbWUpCi0gICAgewotCVN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlTdHJpbmdTZXRBdHRyaWJ1dGUgYXR0cjsKLQotCWF0dHJEZWYgPSAoU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbikgY3VycmVudFJNLmdldEF0dHJpYnV0ZURlZmluaXRpb24oYXR0ck5hbWUpOwotCWlmIChhdHRyRGVmICE9IG51bGwpIHsKLQkgICAgdHJ5IHsKLQkJYXR0ciA9IGF0dHJEZWYuY3JlYXRlKHdpZGdldC5nZXRWYWx1ZSgpKTsKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGF0IGFuIGludGVnZXIgdmFsdWUgaXMgd2l0aGluIHRoZSByYW5nZSBhbGxvd2VkIGZvciB0aGUgYXR0cmlidXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRyb2wgVGhlIFRleHQgd2lkZ2V0IHRvIGJlIHZlcmlmaWVkCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gZXJyb3JJRCBUaGUgaWQgb2YgdGhlIGVycm9yIG1lc3NhZ2UgdXNlZCBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIEluZGljYXRlcyB0aGF0IFRleHQgd2lkZ2V0IGZhaWxlZCB2YWxpZGF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTnVtZXJpY1JhbmdlKFRleHRSb3dXaWRnZXQgY29udHJvbCwgU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgZXJyb3JJRCkKLQkgICAgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JU3RyaW5nIHZhbHVlOwotCi0JaWYgKChjb250cm9sICE9IG51bGwpICYmIGNvbnRyb2wuaXNFbmFibGVkKCkgJiYgY29udHJvbC5pc1ZhbGlkYXRpb25SZXF1aXJlZCgpKSB7Ci0JICAgIHZhbHVlID0gY29udHJvbC5nZXRWYWx1ZSgpOwotCSAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCXRyeSB7Ci0JCSAgICB2YWxpZGF0ZU51bWVyaWNSYW5nZSh2YWx1ZSwgYXR0ck5hbWUsIGVycm9ySUQpOwotCQl9Ci0JCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJICAgIGNvbnRyb2wuc2V0RmllbGRJbkVycm9yKCk7Ci0JCSAgICB0aHJvdyBlOwotCQl9Ci0JCWNvbnRyb2wucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQgYW4gaW50ZWdlciB2YWx1ZSBpcyB3aXRoaW4gdGhlIHJhbmdlIGFsbG93ZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHZlcmlmaWVkCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gZXJyb3JJRCBUaGUgaWQgb2YgdGhlIGVycm9yIG1lc3NhZ2UgdXNlZCBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIEluZGljYXRlcyB0aGF0IFRleHQgd2lkZ2V0IGZhaWxlZCB2YWxpZGF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTnVtZXJpY1JhbmdlKGludCB2YWx1ZSwgU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgZXJyb3JJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgICB7Ci0JSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlJbnRlZ2VyQXR0cmlidXRlIGF0dHI7Ci0KLQlhdHRyRGVmID0gKEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKSBjdXJyZW50Uk0uZ2V0QXR0cmlidXRlRGVmaW5pdGlvbihhdHRyTmFtZSk7Ci0JdHJ5IHsKLQkgICAgYXR0ciA9IGF0dHJEZWYuY3JlYXRlKHZhbHVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZyhlcnJvcklEKSk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSBzdHJpbmcgd2hpY2ggbWF5IGhhdmUgYSBzdWZmaXggJ2snLCAnbScgb3IgJ2cnIHRvIGl0J3MgYWN0dWFsIG51bWVyaWMgdmFsdWUsIG11bHRpcGx5aW5nIGJ5IHRoZQotICAgICAqIGFwcHJvcHJpYXRlIG11bHRpcGxpZXIKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgbnVtYmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW50ZWdlclZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0JaW50IHRlc3RWYWx1ZTsKLQlpbnQgbGVuOwotCWNoYXIgc3VmZml4OwotCi0JdGVzdFZhbHVlID0gMDsKLQlsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLQlpZiAobGVuID09IDApIHsKLQkgICAgcmV0dXJuICIiOwotCX0KLQllbHNlIHsKLQkgICAgc3VmZml4ID0gdmFsdWUuY2hhckF0KGxlbiAtIDEpOwotCSAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoc3VmZml4KSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWlmIChsZW4gPj0gMikgewotCQkgICAgdGVzdFZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHZhbHVlLnN1YnN0cmluZygwLCBsZW4gLSAxKSk7Ci0JCSAgICBpZiAoKHN1ZmZpeCA9PSAnRycpIHx8IChzdWZmaXggPT0gJ2cnKSkgewotCQkJdGVzdFZhbHVlID0gdGVzdFZhbHVlICogR0JZVEU7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIGlmICgoc3VmZml4ID09ICdNJykgfHwgKHN1ZmZpeCA9PSAnbScpKSB7Ci0JCQl0ZXN0VmFsdWUgPSB0ZXN0VmFsdWUgKiBNQllURTsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYgKChzdWZmaXggPT0gJ0snKSB8fCAoc3VmZml4ID09ICdrJykpIHsKLQkJCXRlc3RWYWx1ZSA9IHRlc3RWYWx1ZSAqIEtCWVRFOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodGVzdFZhbHVlKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBhIEJpZ0ludGVnZXIgdmFsdWUgaXMgd2l0aGluIHRoZSByYW5nZSBhbGxvd2VkIGZvciB0aGUgYXR0cmlidXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSB2ZXJpZmllZAotICAgICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICogQHBhcmFtIGVycm9ySUQgVGhlIGlkIG9mIHRoZSBlcnJvciBtZXNzYWdlIHVzZWQgaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBJbmRpY2F0ZXMgdGhhdCBUZXh0IHdpZGdldCBmYWlsZWQgdmFsaWRhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUxvbmdOdW1lcmljUmFuZ2UoU3RyaW5nIHZhbHVlLCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBlcnJvcklEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQlCaWdJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyRGVmOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCUJpZ0ludGVnZXJBdHRyaWJ1dGUgYXR0cjsKLQotCWF0dHJEZWYgPSAoQmlnSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24pIGN1cnJlbnRSTS5nZXRBdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJOYW1lKTsKLQl0cnkgewotCSAgICBhdHRyID0gYXR0ckRlZi5jcmVhdGUodmFsdWUpOwotCX0KLQljYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgYSBTdHJpbmcncyB2YWx1ZSB0byB2ZXJpZnkgaXQgaXMgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgU3RyaW5nIHRvIGJlIHZlcmlmaWVkCi0gICAgICogQHBhcmFtIGxvd0xpbWl0IExvdyBsaW1pdCBvZiByYW5nZQotICAgICAqIEBwYXJhbSBoaWdoTGltaXQgSGlnaCBsaW1pdCBvZiByYW5nZQotICAgICAqIEBwYXJhbSBlcnJvcklEIGlkIG9mIHRoZSBlcnJvciBtZXNzYWdlIHVzZWQgaWYgdmFsdWUgaXMgbm90IGluIGFsbG93YWJsZSByYW5nZQotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU51bWVyaWNSYW5nZShTdHJpbmcgdmFsdWUsIGludCBsb3dMaW1pdCwgaW50IGhpZ2hMaW1pdCwgU3RyaW5nIGVycm9ySUQpCi0JICAgIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgewotCWludCBuOwotCi0JdHJ5IHsKLQkgICAgbiA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0JICAgIGlmICgobiA8IGxvd0xpbWl0KSB8fCAobiA+IGhpZ2hMaW1pdCkpIHsKLQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQkgICAgfQotCX0KLQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKGVycm9ySUQpKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1BFUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1BFUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTNlOTU1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9QRVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgTG9zIEFsYW1vcyBOYXRpb25hbCBTZWN1cml0eSwgTExDLgotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IERFLUFDNTItMDZOQTI1Mzk2Ci0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IChMQU5MKSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIExvcyBBbGFtb3MKLSAqIE5hdGlvbmFsIFNlY3VyaXR5LCBMTEMgKExBTlMpIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaGFzCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFCi0gKiBHT1ZFUk5NRU5UIE5PUiBMQU5TIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUgotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLAotICogc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotICoKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS5ybUxhdW5jaENvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5ybXN5c3RlbS5QRVJlc291cmNlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFBFUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSBleHRlbmRzCi0JCUFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZG9DcmVhdGUoSVJlc291cmNlTWFuYWdlciBybSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFBFUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJUmVzb3VyY2VNYW5hZ2VyPiBnZXRSZXNvdXJjZU1hbmFnZXJDbGFzcygpIHsKLQkJcmV0dXJuIFBFUmVzb3VyY2VNYW5hZ2VyLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9Cb29sZWFuUm93V2lkZ2V0LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL0Jvb2xlYW5Sb3dXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2MDIzMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL0Jvb2xlYW5Sb3dXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb247Ci0vL1RPRE8gZHJ3IGltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaWJtbGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuUm93V2lkZ2V0IGltcGxlbWVudHMgVmFsaWRhdGlvblN0YXRlCi17Ci0gICAgcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG5vbkRlZmF1bHRNYXJrZXI7Ci0gICAgcHJpdmF0ZSBHcmlkRGF0YSBncmlkRGF0YTsKLSAgICBwcml2YXRlIFN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24gYXR0ckRlZjsKLSAgICBwcml2YXRlIEJvb2xlYW5PcHRpb24gd2lkZ2V0OwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIEV2ZW50TW9uaXRvciBldmVudE1vbml0b3I7Ci0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgbGlzdGVuZXIgY2xhc3MgZm9yIGV2ZW50cyBuZWVkZWQgZm9yIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGluIGRhdGEgdmFsdWUgZm9yIHRoaXMgd2lkZ2V0Ci0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEV2ZW50TW9uaXRvciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgewotCXB1YmxpYyBFdmVudE1vbml0b3IoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQl7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBub24tZGVmYXVsdCB2YWx1ZSBpbmRpY2F0b3IgaWYgdGhlIHdpZGdldCdzIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0Ci0JICogdmFsdWUKLQkgKiBAcGFyYW0gZSBUaGUgc2VsZWN0aW9uIGV2ZW50IGluZGljYXRpbmcgdGhpcyBvYmplY3Qgd2FzIGNsaWNrZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCXsKLQkgICAgQnV0dG9uIHNlbGVjdGVkQnV0dG9uOwotCi0JICAgIHNlbGVjdGVkQnV0dG9uID0gKEJ1dHRvbikgZS5nZXRTb3VyY2UoKTsKLQkgICAgaWYgKHNlbGVjdGVkQnV0dG9uLmdldFRleHQoKS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgewotCQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIiAiKTsKLQkgICAgfSBlbHNlIHsKLQkJbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIqIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBCb29sZWFuT3B0aW9uCi0gICAgewotCXByaXZhdGUgU3RyaW5nIGF0dHJWYWx1ZTsKLQlwcml2YXRlIENvbXBvc2l0ZSBncm91cDsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b25zW107Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByYWRpbyBidXR0b24gcGFpciBmb3IgdXNlIGluIHNlbGVjdGluZyBhIGJvb2xlYW4gb3B0aW9uLiBUaGlzIG9iamVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBwYWlyIG9mCi0JICogcmFkaW8gYnV0dG9ucyBpbiBhIGdyb3VwIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgd2lkZ2V0IGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsYWJlbHMgQSBsaXN0IG9mIHR3byBsYWJlbHMgdXNlZCB0byBsYWJlbCB0aGUgcmFkaW8gYnV0dG9ucwotCSAqLwotCXB1YmxpYyBCb29sZWFuT3B0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIExpc3Q8U3RyaW5nPiBsYWJlbHMsIGludCBidXR0b25faWQpCi0JewotCSAgICBHcmlkTGF5b3V0IGxheW91dDsKLQotCSAgICBpZiAobGFiZWxzLnNpemUoKSAhPSAyKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJvb2xlYW5PcHRpb24gcmVxdWlyZXMgdHdvIGxhYmVscyIpOwotCSAgICB9Ci0JICAgIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0JICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkgICAgYnV0dG9ucyA9IG5ldyBCdXR0b25bMl07Ci0JICAgIGJ1dHRvbnNbMF0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCSAgICBidXR0b25zWzBdLnNldFRleHQobGFiZWxzLmdldCgwKSk7Ci0JICAgIGJ1dHRvbnNbMF0uc2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkJVVFRPTl9JRCwgYnV0dG9uX2lkKTsKLQkgICAgYnV0dG9uc1sxXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JICAgIGJ1dHRvbnNbMV0uc2V0VGV4dChsYWJlbHMuZ2V0KDEpKTsKLQkgICAgYnV0dG9uc1sxXS5zZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQlVUVE9OX0lELCBidXR0b25faWQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdG9vbHRpcCB0ZXh0IGZvciB0aGUgb2JqZWN0LiBUaGUgdG9vbHRpcCB0ZXh0IGlzIHNldCBvbiB0aGUgZ3JvdXAgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIHRleHQgVGhlIHRvb2x0aXAgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KQotCXsKLQkgICAgZ3JvdXAuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZWxlY3Rpb24gc3RhdGUuIFRoZSBidXR0b24gd2l0aCB0ZXh0IG1hdGNoaW5nIHRoZSB2YWx1ZSBzdHJpbmcgaXMgc2V0IHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEJ1dHRvbihTdHJpbmcgdmFsdWUpCi0JewotCSAgICBpZiAoYnV0dG9uc1swXS5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgewotCQlidXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkgICAgfSBlbHNlIHsKLQkJYnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JICAgIH0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgYnV0dG9uLiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIGxhYmVsIGZvciB0aGUgc2VsZWN0ZWQgYnV0dG9uLgotCSAqIAotCSAqIEByZXR1cm4gVmFsdWUgZm9yIHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0JewotCSAgICBpZiAoYnV0dG9uc1swXS5nZXRTZWxlY3Rpb24oKSkgewotCQlyZXR1cm4gYnV0dG9uc1swXS5nZXRUZXh0KCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGJ1dHRvbnNbMV0uZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoaXMgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGdkIExheW91dCBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShHcmlkRGF0YSBnZCkKLQl7Ci0JICAgIGdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZW5hYmxlIHN0YXRlIGZvciB0aGUgQnV0dG9uIG9iamVjdHMgaW4gdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBzdGF0ZSAKLQkgKiBAcGFyYW0gc3RhdGUgRW5hYmxlIHN0YXRlIGZvciB0aGlzIHdpZGdldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLQl7Ci0JICAgIGJ1dHRvbnNbMF0uc2V0RW5hYmxlZChzdGF0ZSk7Ci0JICAgIGJ1dHRvbnNbMV0uc2V0RW5hYmxlZChzdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgd2lkZ2V0IGlzIGluIHRoZSBlbmFibGVkIHN0YXRlCi0JICogQHJldHVybiBFbmFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotCXsKLQkgICAgcmV0dXJuIGJ1dHRvbnNbMF0uaXNFbmFibGVkKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSAnZGF0YSBvYmplY3QnIGFzIGlmIHdlIHdlcmUgc2V0dGluZyB0aGUgQVRUUl9OQU1FIG9iamVjdCBmb3IgYSBXaWRnZXQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyB2YWx1ZSkKLQl7Ci0JICAgIGF0dHJWYWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgJ2RhdGEgb2JqZWN0JyBhcyBpZiB3ZSB3ZXJlIHJldHJpZXZpbmcgdGhlIEFUVFJfTkFNRSBvYmplY3QgZm9yIGEgV2lkZ2V0IG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gLSBWYWx1ZSBvZiB0aGUgZGF0YSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKQotCXsKLQkgICAgcmV0dXJuIGF0dHJWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gdGhlIEJ1dHRvbiBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCSAgICBidXR0b25zWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkgICAgYnV0dG9uc1sxXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLQl7Ci0JICAgIHJldHVybiAoKHNvdXJjZSA9PSBidXR0b25zWzBdKSB8fCAoc291cmNlID09IGJ1dHRvbnNbMV0pKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB3aWRnZXRzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyByb3cuIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsYXlvdXQgbWFuYWdlciBmb3IgdGhlCi0gICAgICogQ29tcG9zaXRlIHBhcmVudCBpcyBhIEdyaWRMYXlvdXQgd2l0aCBmb3VyIGNvbHVtbnMuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgQ29tcG9zaXRlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoaXMgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGlkIFRoZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhblJvd1dpZGdldChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQsIFN0cmluZ1NldEF0dHJpYnV0ZURlZmluaXRpb24gZGVmLCBpbnQgYnV0dG9uX2lkKQotICAgIHsKLQlhdHRyRGVmID0gZGVmOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCS8vVE9ETyBkcncgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoYXR0ckRlZi5nZXROYW1lKCkpKTsKLQlsYWJlbC5zZXRUZXh0KGF0dHJEZWYuZ2V0TmFtZSgpKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlub25EZWZhdWx0TWFya2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCXdpZGdldCA9IG5ldyBCb29sZWFuT3B0aW9uKHBhcmVudCwgYXR0ckRlZi5nZXRWYWx1ZXMoKSwgYnV0dG9uX2lkKTsKLQkvL1RPRE8gZHJ3IHdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoYXR0ckRlZi5nZXREZXNjcmlwdGlvbigpKSk7Ci0Jd2lkZ2V0LnNldFRvb2xUaXBUZXh0KGF0dHJEZWYuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0Jd2lkZ2V0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXdpZGdldC5zZXREYXRhKGlkKTsKLQl0cnkgewotCSAgICBkZWZhdWx0VmFsdWUgPSBhdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JICAgIGRlZmF1bHRWYWx1ZSA9ICIiOwotCX0KLQlldmVudE1vbml0b3IgPSBuZXcgRXZlbnRNb25pdG9yKCk7Ci0Jd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoaXMgb2JqZWN0LiBUaGlzIG1ldGhvZCBpcyBhIHdyYXBwZXIgdGhhdCBqdXN0IGNhbGxzIAotICAgICAqIGFkZFNlbGVjdGlvbkxpc3RlbmVyIGZvciB0aGUgQm9vbGVhbk9wdGlvbiB3aWRnZXQgY29udGFpbmVkIGluIHRoaXMgY2xhc3MKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHNlbGVjdGlvbiBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLQl3aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW5hYmxlIHN0YXRlIGZvciB0aGUgQm9vbGVhbk9wdGlvbiBvYmplY3QgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIHN0YXRlIFRoZSBlbmFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gICAgewotCXdpZGdldC5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIGZvciB0aGUgQm9vbGVhbk9wdGlvbiBvYmplY3QgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIHJhZGlvIGJ1dHRvbiB3aXRoCi0gICAgICogbGFiZWwgdGV4dCBtYXRjaGluZyB0aGUgdmFsdWUgcGFyYW1ldGVyIGlzIHNldCBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldFNlbGVjdGVkQnV0dG9uKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSBuYW1lIHN0b3JlZCBpbiB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpCi0gICAgewotCXJldHVybiB3aWRnZXQuZ2V0RGF0YSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIEJvb2xlYW5PcHRpb24gb2JqZWN0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdC4gVEhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBsYWJlbCB0ZXh0IG9mIHRoZQotICAgICAqIHJhZGlvIGJ1dHRvbiBpbiBzZWxlY3RlZCBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QncyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0dWFsIHdpZGdldCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QgaXMgdGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkCi0gICAgICogZm9yCi0gICAgICogQHBhcmFtIHNvdXJjZSAtIFRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IKLSAgICAgKiBAcmV0dXJuIC0gc3RhdHVzIGluZGljYXRpbmcgdGhpcyBvYmplY3QgY29udGFpbnMgdGhlIG1hdGNoaW5nIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nV2lkZ2V0KFdpZGdldCBzb3VyY2UpCi0gICAgewotCXJldHVybiB3aWRnZXQuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLlVOQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGlzIG9iamVjdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQKLSAgICAgKiBAcmV0dXJuIC0gdmFsaWRhdGlvbiBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXJldHVybiAoKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRCkgfHwgKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1IpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvQ2hlY2tib3hSb3dXaWRnZXQuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvQ2hlY2tib3hSb3dXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExMDM0OC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL0NoZWNrYm94Um93V2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci0vL1RPRE8gZHJ3IGltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaWJtbGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBDaGVja2JveFJvd1dpZGdldCBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdGF0ZQotewotCi0gICAgcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIGZpbGw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotICAgIHByaXZhdGUgQnV0dG9uIHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY2hlY2tib3ggd2lkZ2V0IGFuZCBhc3NvY2lhdGVkIHdpZGdldHMuIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsYXlvdXQgbWFuYWdlciBmb3IgdGhlIAotICAgICAqIHBhcmVudCBDb21wb3NpdGUgb2JqZWN0IGlzIGEgR3JpZExheW91dCB3aXRoIDQgY29sdW1ucy4gCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IENvbXBvc2l0ZSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgCi0gICAgICovCi0gICAgcHVibGljIENoZWNrYm94Um93V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpZCwgSUF0dHJpYnV0ZURlZmluaXRpb248PywgPywgPz4gZGVmKQotICAgIHsKLQlhdHRyRGVmID0gZGVmOwotCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCS8vVE9ETyBkcncgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoZGVmLmdldE5hbWUoKSkpOwotCWxhYmVsLnNldFRleHQoZGVmLmdldE5hbWUoKSk7Ci0Jbm9uRGVmYXVsdE1hcmtlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIiAiKTsKLQl3aWRnZXQgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkvL1RPRE8gZHJ3IHdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoZGVmLmdldERlc2NyaXB0aW9uKCkpKTsKLQl3aWRnZXQuc2V0VG9vbFRpcFRleHQoZGVmLmdldERlc2NyaXB0aW9uKCkpOwotCXdpZGdldC5zZXRUZXh0KCIiKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXdpZGdldC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl3aWRnZXQuc2V0RGF0YShXaWRnZXRBdHRyaWJ1dGVzLkFUVFJfTkFNRSwgaWQpOwotCWZpbGwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JZmlsbC5zZXRUZXh0KCIiKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQlmaWxsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHNlbGVjdGlvbiBsaXN0ZW5lciBmb3IgdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIGRhdGEgb2JqZWN0IGluIHRoaXMgY2xhc3MgdXNpbmcgdGhlIGFzc29jaWF0ZWQga2V5Ci0gICAgICogQHBhcmFtIGtleSBUaGUgZGF0YSBvYmplY3Qga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldERhdGEoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoaXMgb2JqZWN0IGlzIGluIHRoZSBzZWxlY3RlZCBzdGF0ZQotICAgICAqIEByZXR1cm4gc2VsZWN0aW9uIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlbGVjdGlvbiBzdGF0ZSAoY2hlY2sgbWFyaykgZm9yIHRoaXMgd2lkZ2V0Ci0gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBiZSBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldFNlbGVjdGlvbihzdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5IEtleSBmb3IgZGF0YSB0byBiZSByZXRyaWV2ZWQKLSAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhKFN0cmluZyBrZXkpCi0gICAgewotCXJldHVybiAoU3RyaW5nKSB3aWRnZXQuZ2V0RGF0YShrZXkpOwotICAgIH0KLSAgICAvKiogCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdHVhbCB3aWRnZXQgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0IGlzIHRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZAotICAgICAqIGZvcgotICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yCi0gICAgICogQHJldHVybiAtIHN0YXR1cyBpbmRpY2F0aW5nIHRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXRjaGluZyB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ1dpZGdldChXaWRnZXQgc291cmNlKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0ID09IHNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIG5vIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFZhbGlkYXRpb25TdGF0ZSgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5VTkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbiBlcnJvciBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZEluRXJyb3IoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgaWYgdGhpcyBvYmplY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkCi0gICAgICogQHJldHVybiAtIHZhbGlkYXRpb24gc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQlyZXR1cm4gKCh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQpIHx8ICh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL0NvbWJvUm93V2lkZ2V0LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL0NvbWJvUm93V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmM2Y4ZjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9Db21ib1Jvd1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nU2V0QXR0cmlidXRlRGVmaW5pdGlvbjsKLS8vVE9ETyBkcncgaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pYm1sbC51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgQ29tYm9Sb3dXaWRnZXQgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RhdGUKLXsKLQotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyRGVmOwotICAgIHByaXZhdGUgQ29tYm8gd2lkZ2V0OwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIEV2ZW50TW9uaXRvciBldmVudE1vbml0b3I7Ci0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgbGlzdGVuZXIgY2xhc3MgdXNlZCB0byBtb25pdG9yIGZvciBjaGFuZ2VzIGluIHRoZSBkYXRhIHZhbHVlIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFdmVudE1vbml0b3IgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLSAgICB7Ci0JcHVibGljIEV2ZW50TW9uaXRvcigpCi0JewotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBldmVudCBub3RpZmljYXRpb24gaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZSB3aWRnZXQgaGFzIGNoYW5nZWQKLQkgKiBAcGFyYW0gZSBUaGUgbm90aWZpY2F0aW9uIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCXsKLQkgICAgc2V0RGVmYXVsdFN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBldmVudCBub3RpZmljYXRpb24gaW5kaWNhdGluZyB0aGF0IGEgdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQgZnJvbSB0aGUgQ29tYm8gZHJvcGRvd24KLQkgKiBAcGFyYW0gZSBUaGUgbm90aWZpY2F0aW9uIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCSAgICBzZXREZWZhdWx0U3RhdHVzKCk7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBvYmplY3QgY29udGFpbmluZyBhIENvbWJvIHdpZGdldCBhbmQgcmVsYXRlZCB3aWRnZXRzIGZvciB1c2UgaW4gYSB0YWIgcGFiZS4gVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlCi0gICAgICogbGF5b3V0IG1hbmFnZXIgZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlIHdpZGdldCBpcyBhIEdyaWRMYXlvdXQgd2l0aCA0IGNvbHVtbnMuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IENvbXBvc2l0ZSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gcmVhZE9ubHkgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENvbWJvIHdpZGdldCBpcyBlZGl0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBDb21ib1Jvd1dpZGdldChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQsIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGRlZiwgYm9vbGVhbiByZWFkT25seSkKLSAgICB7Ci0JSXRlcmF0b3I8U3RyaW5nPiBpdGVyOwotCi0JYXR0ckRlZiA9IGRlZjsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkvL1RPRE8gZHJ3IGxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHJEZWYuZ2V0TmFtZSgpKSk7Ci0JbGFiZWwuc2V0VGV4dChhdHRyRGVmLmdldE5hbWUoKSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0Jbm9uRGVmYXVsdE1hcmtlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIiAiKTsKLQlpZiAocmVhZE9ubHkpIHsKLQkgICAgd2lkZ2V0ID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCX0gZWxzZSB7Ci0JICAgIHdpZGdldCA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04pOwotCX0KLQlpdGVyID0gKChTdHJpbmdTZXRBdHRyaWJ1dGVEZWZpbml0aW9uKSBkZWYpLmdldFZhbHVlcygpLml0ZXJhdG9yKCk7Ci0Jd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JICAgIHdpZGdldC5hZGQoaXRlci5uZXh0KCkpOwotCX0KLQkvLyBFdmVuIHRob3VnaCBzZXRUb29sVGlwVGV4dCBpcyBjYWxsZWQsIHRoZSB0b29sdGlwIHRleHQgZG9lcyBub3QKLQkvLyBhcHBlYXIgd2hlbiB0aGlzIGlzIHJ1biBvbiBMaW51eC4gVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUKLQkvLyBzZXR0aW5nIHRvb2x0aXAgdGV4dCBvbiBhIHJlYWQtb25seSBjb21ib2JveC4gRWRpdGFibGUgY29tYm9ib3hlcwotCS8vIHdvcmsgY29ycmVjdGx5LiBNYXliZSBhIExpbnV4IGltcGxlbWVudGF0aW9uIGJ1ZyBzaW5jZSB0aGlzIHdvcmtzCi0JLy8gb24gV2luZG93cyBYUC4KLQkvL1RPRE8gZHJ3IHdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoYXR0ckRlZi5nZXREZXNjcmlwdGlvbigpKSk7Ci0Jd2lkZ2V0LnNldFRvb2xUaXBUZXh0KGF0dHJEZWYuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jd2lkZ2V0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXdpZGdldC5zZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FLCBpZCk7Ci0JdHJ5IHsKLQkgICAgZGVmYXVsdFZhbHVlID0gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCSAgICBkZWZhdWx0VmFsdWUgPSAiIjsKLQl9Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gdGhpcyBvYmplY3QgZm9yIG5vdGlmaWNhdGlvbiB0aGF0IGEgdmFsdWUgd2FzIHNlbGVjdGVkIGZyb20gdGhlIENvbWJvIGRyb3Bkb3duCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBtb2RpZnkgbGlzdGVuZXIgdG8gdGhpcyBvYmplY3QgZm9yIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSB2YWx1ZSBpbiB0aGUgQ29tYm8ncyB0ZXh0IGVudHJ5IGZpZWxkIGhhcyBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgQ29tYm8gd2lkZ2V0Ci0gICAgICogQHJldHVybiBUaGUgZGF0YSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldFRleHQoKS50cmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkYXRhIHZhbHVlIGluIHRoZSBDb21ibyB3aWRnZXQuCi0gICAgICogQHBhcmFtIHZhbHVlIERhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gICAgewotCXdpZGdldC5zZXRUZXh0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGJlIHVzZWQKLSAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhKFN0cmluZyBrZXkpCi0gICAgewotCXJldHVybiAoU3RyaW5nKSB3aWRnZXQuZ2V0RGF0YShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW5hYmxlIHN0YXRlIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIHN0YXRlIC0gVGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIHdpZGdldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIG9iamVjdCAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmlzRW5hYmxlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbm9uLWRlZmF1bHQgc3RhdHVzIGZsYWcgdG8gc2hvdyB3aGV0aGVyIHRoZSBkYXRhIHZhbHVlIGZvciB0aGlzIG9iamVjdCBpcyBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAqIGZvciB0aGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTdGF0dXMoKQotICAgIHsKLQlTdHJpbmcgdmFsdWU7Ci0JCi0JdmFsdWUgPSB3aWRnZXQuZ2V0VGV4dCgpLnRyaW0oKTsKLQlpZiAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8ICh2YWx1ZS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkpIHsKLQkgICAgbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0JfSBlbHNlIHsKLQkgICAgbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIqIik7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLlVOQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGlzIG9iamVjdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQKLSAgICAgKiBAcmV0dXJuIC0gdmFsaWRhdGlvbiBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXJldHVybiAoKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRCkgfHwgKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1IpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldCA9PSBzb3VyY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9EdWFsRmllbGRSb3dXaWRnZXQuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvRHVhbEZpZWxkUm93V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZWU0MTAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9EdWFsRmllbGRSb3dXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotLy9UT0RPIGRydyBpbXBvcnQgb3JnLmVjbGlwc2UucHRwLmlibWxsLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIER1YWxGaWVsZFJvd1dpZGdldCBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdGF0ZQotewotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyMTsKLSAgICBwcml2YXRlIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHIyOwotICAgIHByaXZhdGUgRHVhbEZpZWxkIHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWVbXTsKLSAgICBwcml2YXRlIEV2ZW50TW9uaXRvciBldmVudE1vbml0b3I7Ci0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgbGlzdGVuZXIgY2xhc3MgdXNlZCB0byBtb25pdG9yIGNoYW5nZXMgaW4gdmFsdWUgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEV2ZW50TW9uaXRvciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi0gICAgewotCXB1YmxpYyBFdmVudE1vbml0b3IoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5vbi1kZWZhdWx0IGluZGljYXRvciB0byAnKicgaWYgdGhlIGRhdGEgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGRvZXMgbm90IG1hdGNoCi0JICogdGhlIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24KLQkgKiBAcGFyYW0gZSBUaGUgZXZlbnQgaW5kaWNhdGluZyB2YWx1ZSBoYXMgY2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQl7Ci0JICAgIFN0cmluZyB2YWx1ZVtdOwotCi0JICAgIHZhbHVlID0gd2lkZ2V0LmdldFRleHQoKTsKLQkgICAgaWYgKCh2YWx1ZVswXS5lcXVhbHMoZGVmYXVsdFZhbHVlWzBdKSkgJiYgKHZhbHVlWzFdLmVxdWFscyhkZWZhdWx0VmFsdWVbMV0pKSkgewotCQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIiAiKTsKLQkgICAgfSBlbHNlIHsKLQkJbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIqIik7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSB3aWRnZXQgY29udGFpbmluZyB0d28gdGV4dCBmaWVsZHMgbGFpZCBvdXQgaG9yaXpvbnRhbGx5LiBUaGUgaW50ZW5kZWQgdXNlIGlzIGZvcgotICAgICAqIGF0dHJpYnV0ZXMgd2hpY2ggbWF5IGhhdmUgdHdvIHZhbHVlcywgc3VjaCBhcyBNUF9CVUZGRVJfU0laRSwgc28gdGhhdCBlYWNoIGZpZWxkIGNhbiBiZSBoYW5kbGVkIGFuZCB2YWxpZGF0ZWQKLSAgICAgKiBpbmRpdmlkdWFsbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBEdWFsRmllbGQKLSAgICB7Ci0JcHJpdmF0ZSBPYmplY3QgYXR0clZhbHVlMTsKLQlwcml2YXRlIE9iamVjdCBhdHRyVmFsdWUyOwotCXByaXZhdGUgQ29tcG9zaXRlIGdyb3VwOwotCXByaXZhdGUgVGV4dCB2YWx1ZVtdOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBEdWFsRmllbGQgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgZm9yIHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIER1YWxGaWVsZChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkgICAgR3JpZExheW91dCBsYXlvdXQ7Ci0JICAgIEdyaWREYXRhIGdkOwotCi0JICAgIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0JICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkgICAgdmFsdWUgPSBuZXcgVGV4dFsyXTsKLQkgICAgdmFsdWVbMF0gPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCSAgICB2YWx1ZVswXS5zZXRMYXlvdXREYXRhKGdkKTsKLQkgICAgdmFsdWVbMV0gPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCSAgICB2YWx1ZVsxXS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoaXMgd2lkZ2V0Ci0JICogCi0JICogQHBhcmFtIGdkIExheW91dCBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShHcmlkRGF0YSBnZCkKLQl7Ci0JICAgIGdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIE1vZGlmeUxpc3RlbmVyIHRoYXQgd2lsbCBtb25pdG9yIHRoZSBUZXh0IGZpZWxkIGZvciBtb2RpZmljYXRpb25zCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSBNb2RpZnlMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkgICAgdmFsdWVbMF0uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCSAgICB2YWx1ZVsxXS5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRvb2x0aXAgdGV4dCBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgd2lkZ2V0Ci0JICogCi0JICogQHBhcmFtIHRpcDEgVG9vbHRpcCB0ZXh0IGZvciBmaXJzdCBmaWVsZAotCSAqIEBwYXJhbSB0aXAyIFRvb2x0aXAgdGV4dCBmb3Igc2Vjb25kIGZpZWxkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRpcDEsIFN0cmluZyB0aXAyKQotCXsKLQkgICAgdmFsdWVbMF0uc2V0VG9vbFRpcFRleHQodGlwMSk7Ci0JICAgIHZhbHVlWzFdLnNldFRvb2xUaXBUZXh0KHRpcDIpOwotCX0KLQotCS8qKgotCSAqIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgZWFjaCBmaWVsZCBpbiB0aGUgd2lkZ2V0Ci0JICogCi0JICogQHBhcmFtIHZhbHVlMSBWYWx1ZSBmb3IgZmlyc3QgZmllbGQKLQkgKiBAcGFyYW0gdmFsdWUyIFZhbHVlIGZvciBzZWNvbmQgZmllbGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZTEsIFN0cmluZyB2YWx1ZTIpCi0JewotCSAgICB2YWx1ZVswXS5zZXRUZXh0KHZhbHVlMSk7Ci0JICAgIHZhbHVlWzFdLnNldFRleHQodmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIHBhaXIgZm9yIHRoaXMgd2lkZ2V0Ci0JICogCi0JICogQHJldHVybiB0ZXh0IHZhbHVlcyBjb250YWluZWQgaW4gdGV4dCB3aWRnZXRzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFRleHQoKQotCXsKLQkgICAgU3RyaW5nIHRleHRWYWx1ZVtdOwotCi0JICAgIHRleHRWYWx1ZSA9IG5ldyBTdHJpbmdbMl07Ci0JICAgIHRleHRWYWx1ZVswXSA9IHZhbHVlWzBdLmdldFRleHQoKS50cmltKCk7Ci0JICAgIHRleHRWYWx1ZVsxXSA9IHZhbHVlWzFdLmdldFRleHQoKS50cmltKCk7Ci0JICAgIHJldHVybiB0ZXh0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhpcyB3aWRnZXQgaXMgZW5hYmxlZAotCSAqIAotCSAqIEByZXR1cm4gRW5hYmxlIHN0YXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLQl7Ci0JICAgIHJldHVybiB2YWx1ZVswXS5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyB3aWRnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGUgRW5hYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHN0YXRlKQotCXsKLQkgICAgdmFsdWVbMF0uc2V0RW5hYmxlZChzdGF0ZSk7Ci0JICAgIHZhbHVlWzFdLnNldEVuYWJsZWQoc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgJ2RhdGEgb2JqZWN0JyBhcyBpZiB3ZSB3ZXJlIHNldHRpbmcgdGhlIEFUVFJfTkFNRSBvYmplY3QgZm9yIGEgV2lkZ2V0IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YTEoT2JqZWN0IHZhbHVlKQotCXsKLQkgICAgYXR0clZhbHVlMSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgJ2RhdGEgb2JqZWN0JyBhcyBpZiB3ZSB3ZXJlIHJldHJpZXZpbmcgdGhlIEFUVFJfTkFNRSBvYmplY3QgZm9yIGEgV2lkZ2V0IG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gLSBWYWx1ZSBvZiB0aGUgZGF0YSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGExKCkKLQl7Ci0JICAgIHJldHVybiBhdHRyVmFsdWUxOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgJ2RhdGEgb2JqZWN0JyBhcyBpZiB3ZSB3ZXJlIHNldHRpbmcgdGhlIEFUVFJfTkFNRSBvYmplY3QgZm9yIGEgV2lkZ2V0IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YTIoT2JqZWN0IHZhbHVlKQotCXsKLQkgICAgYXR0clZhbHVlMiA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgJ2RhdGEgb2JqZWN0JyBhcyBpZiB3ZSB3ZXJlIHJldHJpZXZpbmcgdGhlIEFUVFJfTkFNRSBvYmplY3QgZm9yIGEgV2lkZ2V0IG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gLSBWYWx1ZSBvZiB0aGUgZGF0YSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEyKCkKLQl7Ci0JICAgIHJldHVybiBhdHRyVmFsdWUyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nV2lkZ2V0KFdpZGdldCBzb3VyY2UpCi0JewotCSAgICByZXR1cm4gKCh2YWx1ZVswXSA9PSBzb3VyY2UpIHx8ICh2YWx1ZVsxXSA9PSBzb3VyY2UpKTsKLQl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgd2lkZ2V0IHdpdGggdHdvIHRleHQgZW50cnkgZmllbGRzIHJlcHJlc2VudGluZyB0aGUgdHdvIHN1Yi1maWVsZHMgcmVxdWlyZWQgYnkgdGhpcyB3aWRnZXQuCi0gICAgICogVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIGxheW91dCBzZXQgZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlIG9iamVjdCBpcyBhIEdyaWRMYXlvdXQgd2l0aCBmb3VyIGNvbHVtbnMuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHdpZGdldAotICAgICAqIEBwYXJhbSBpZDEgVGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGUgZmlyc3QgZmllbGQgaW4gdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gaWQyIFRoZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlIHNlY29uZCBmaWVsZCBpbiB0aGlzIHdpZGdldAotICAgICAqIEBwYXJhbSBkZWYxIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIGZpcnN0IGZpZWxkIGluIHRoaXMgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGRlZjIgVGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgc2Vjb25kIGZpZWxkIGluIHRoaXMgd2lkZ2V0Ci0gICAgICovCi0gICAgcHVibGljIER1YWxGaWVsZFJvd1dpZGdldChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQxLCBTdHJpbmcgaWQyLCBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBkZWYxLAotCSAgICBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBkZWYyKQotICAgIHsKLQlhdHRyMSA9IGRlZjE7Ci0JYXR0cjIgPSBkZWYyOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCS8vVE9ETyBkcncgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoYXR0cjEuZ2V0TmFtZSgpKSk7Ci0JbGFiZWwuc2V0VGV4dChhdHRyMS5nZXROYW1lKCkpOwotCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCW5vbkRlZmF1bHRNYXJrZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0Jbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0Jd2lkZ2V0ID0gbmV3IER1YWxGaWVsZChwYXJlbnQpOwotCS8vVE9ETyBkcncgd2lkZ2V0LnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyMS5nZXREZXNjcmlwdGlvbigpKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHIyLmdldERlc2NyaXB0aW9uKCkpKTsKLQl3aWRnZXQuc2V0VG9vbFRpcFRleHQoYXR0cjEuZ2V0RGVzY3JpcHRpb24oKSwgYXR0cjIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jd2lkZ2V0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXdpZGdldC5zZXREYXRhMShpZDEpOwotCXdpZGdldC5zZXREYXRhMihpZDIpOwotCXRyeSB7Ci0JICAgIGRlZmF1bHRWYWx1ZSA9IG5ldyBTdHJpbmdbMl07Ci0JICAgIGRlZmF1bHRWYWx1ZVswXSA9IGF0dHIxLmNyZWF0ZSgpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkgICAgZGVmYXVsdFZhbHVlWzFdID0gYXR0cjIuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpOwotCX0KLQljYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkgICAgZGVmYXVsdFZhbHVlWzBdID0gIiI7Ci0JICAgIGRlZmF1bHRWYWx1ZVsxXSA9ICIiOwotCSAgICA7Ci0JfQotCWV2ZW50TW9uaXRvciA9IG5ldyBFdmVudE1vbml0b3IoKTsKLQl3aWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBtb2RpZnkgbGlzdGVuZXIgdG8gdGhpcyBvYmplY3QgCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGVuYWJsZSBzdGF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWVzIGZvciB0aGUgdHdvIFRleHQgd2lkZ2V0cyBjb250YWluZWQgaW4gdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gdmFsdWUxIEZpcnN0IHRleHQgb2JqZWN0J3MgdmFsdWUKLSAgICAgKiBAcGFyYW0gdmFsdWUyIFNlY29uZCB0ZXh0IG9iamVjdCdzIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlMSwgU3RyaW5nIHZhbHVlMikKLSAgICB7Ci0Jd2lkZ2V0LnNldFRleHQodmFsdWUxLCB2YWx1ZTIpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBHZXQgdGhlIGRhdGEgb2JqZWN0ICh0aGUgYXR0cmlidXRlIG5hbWUpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlyc3QgVGV4dCB3aWRnZXQgaW4gdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YTEoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldERhdGExKCk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEdldCB0aGUgZGF0YSBvYmplY3QgKHRoZSBhdHRyaWJ1dGUgbmFtZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWNvbmQgVGV4dCB3aWRnZXQgaW4gdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YTIoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldERhdGEyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgU3RyaW5nIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmcm9tIHRoZSB0d28gVGV4dCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gVHdvIGVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWUgZnJvbSB0aGUgdHdvIFRleHQgd2lkZ2V0cyBjb250YWluZWQgaW4gdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWUoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBlbmFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmlzRW5hYmxlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLlVOQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGlzIG9iamVjdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQKLSAgICAgKiBAcmV0dXJuIC0gdmFsaWRhdGlvbiBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXJldHVybiAoKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRCkgfHwgKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1IpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5pc01hdGNoaW5nV2lkZ2V0KHNvdXJjZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9GaWxlU2VsZWN0b3JSb3dXaWRnZXQuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvRmlsZVNlbGVjdG9yUm93V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzQyYjguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9GaWxlU2VsZWN0b3JSb3dXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLS8vVE9ETyBkcncgaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pYm1sbC51aS5pbnRlcm5hbC51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIEZpbGVTZWxlY3RvclJvd1dpZGdldCBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdGF0ZQotewotICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub25EZWZhdWx0TWFya2VyOwotICAgIHByaXZhdGUgR3JpZERhdGEgZ3JpZERhdGE7Ci0gICAgcHJpdmF0ZSBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBhdHRyOwotICAgIHByaXZhdGUgRmlsZVNlbGVjdG9yIHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBFdmVudE1vbml0b3IgZXZlbnRNb25pdG9yOwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGxpc3RlbmVyIGNsYXNzIGZvciBub3RpZmljYXRpb25zIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBwYXRobmFtZSBmaWVsZCBjaGFuZ2VzCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEV2ZW50TW9uaXRvciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi0gICAgewotCXB1YmxpYyBFdmVudE1vbml0b3IoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5vbi1kZWZhdWx0IGluZGljYXRvciBmb3IgdGhpcyBvYmplY3Qgd2hlbiB0aGUgcGF0aG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGRlZmF1bHQgcGF0aG5hbWUgZm9yIHRoaXMKLQkgKiBvYmplY3QKLQkgKiBAcGFyYW0gZSBUaGUgbm90aWZpY2F0aW9uIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCXsKLQkgICAgaWYgKHdpZGdldC5nZXRQYXRoKCkuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIHsKLQkJbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0JICAgIH0gZWxzZSB7Ci0JCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiKiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgYSBjb250YWluZXIgZm9yIGEgdGV4dCBmaWVsZCBhbmQgYnJvd3NlIGJ1dHRvbiBjb21iaW5hdGlvbiB1c2VkIGZvciBmaWxlIHNlbGVjdGlvbi4gV2hlbiB0aGUgYnJvd3NlCi0gICAgICogYnV0dG9uIGlzIGNsaWNrZWQsIHRoZSByZWdpc3RlcmVkIFNlbGVjdGlvbkxpc3RlbmVyIHdpbGwgcG9wIHVwIGEgZmlsZSBvciBkaXJlY3RvcnkgZGlhbG9nIHByb21wdGluZyB0aGUgdXNlciBmb3IKLSAgICAgKiBhIHBhdGguIFdoZW4gdGhlIHVzZXIgY2xpY2tzIG9rIGluIHRoYXQgZGlhbG9nLCB0aGUgdGV4dCBmaWVsZCBpbiB0aGlzIG9iamVjdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgc2VsZWN0ZWQKLSAgICAgKiBwYXRoLiBUaGUgYnJvd3NlIGJ1dHRvbiBhbmQgdGV4dCBib3ggYXJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgb2JqZWN0IGJ5IHRoZSByZXN0IG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBzbyB0aGF0Ci0gICAgICogdGhleSBjYW4gYmUgZWFzaWx5IHNldCB0byBlbmFibGVkIG9yIGRpc2FibGVkIHN0YXRlLgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRmlsZVNlbGVjdG9yCi0gICAgewotCXByaXZhdGUgT2JqZWN0IGF0dHJWYWx1ZTsKLQlwcml2YXRlIFRleHQgcGF0aDsKLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGZpbGUgc2VsZWN0b3Igb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgd2lkZ2V0IGZvciB0aGUgZmlsZSBzZWxlY3RvcgotCSAqIEBwYXJhbSBzZWxlY3RvcklEIElkZW50aWZpZXIgZm9yIHRoaXMgZmlsZSBzZWxlY3RvcgotCSAqIEBwYXJhbSB0b29sdGlwVGV4dCBUb29sdGlwIHRleHQgZm9yIHRoZSBzZWxlY3RvcgotCSAqLwotCXB1YmxpYyBGaWxlU2VsZWN0b3IoQ29tcG9zaXRlIHBhcmVudCwgSW50ZWdlciBzZWxlY3RvcklELCBTdHJpbmcgdG9vbHRpcFRleHQpCi0JewotCSAgICBHcmlkRGF0YSBnZDsKLQotCSAgICBwYXRoID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JICAgIHBhdGguc2V0VG9vbFRpcFRleHQodG9vbHRpcFRleHQpOwotCSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkgICAgcGF0aC5zZXRMYXlvdXREYXRhKGdkKTsKLQkgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkgICAgLy9UT0RPIGRydyBicm93c2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkZpbGVTZWxlY3Rvci5Ccm93c2VCdXR0b24iKSk7Ci0JICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KCJCcm93c2UiKTsKLQkgICAgYnJvd3NlQnV0dG9uLnNldERhdGEoV2lkZ2V0QXR0cmlidXRlcy5CVVRUT05fSUQsIG5ldyBJbnRlZ2VyKHNlbGVjdG9ySUQpKTsKLQkgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCSAgICBicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZpbGUgc2VsZWN0b3IncyBlbmFibGUgc3RhdGUKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlIEVuYWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpCi0JewotCSAgICBwYXRoLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkgICAgYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIGZpbGUgc2VsZWN0b3IKLQkgKiAKLQkgKiBAcmV0dXJuIGVuYWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0JewotCSAgICByZXR1cm4gcGF0aC5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBhdGggdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZSBmaWxlIHNlbGVjdG9yCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lIFBhdGhuYW1lIHRvIGJlIGRpc3BsYXllZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGhuYW1lKQotCXsKLQkgICAgcGF0aC5zZXRUZXh0KHBhdGhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNwZWNpZmllZCBwYXRoIGZyb20gdGhlIHRleHQgZmllbGQgb2YgdGhlIGZpbGUgc2VsZWN0b3IKLQkgKiAKLQkgKiBAcmV0dXJuIFBhdGhuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkKLQl7Ci0JICAgIHJldHVybiBwYXRoLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZm9jdXMgb24gdGhlIHRleHQgZmllbGQgd2l0aGluIHRoZSBzZWxlY3RvciB3aWRnZXQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKQotCXsKLQkgICAgcmV0dXJuIHBhdGguc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlICdkYXRhIG9iamVjdCcgYXMgaWYgd2Ugd2VyZSBzZXR0aW5nIHRoZSBBVFRSX05BTUUgb2JqZWN0IGZvciBhIFdpZGdldCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoT2JqZWN0IHZhbHVlKQotCXsKLQkgICAgYXR0clZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAnZGF0YSBvYmplY3QnIGFzIGlmIHdlIHdlcmUgcmV0cmlldmluZyB0aGUgQVRUUl9OQU1FIG9iamVjdCBmb3IgYSBXaWRnZXQgb2JqZWN0Ci0JICogCi0JICogQHJldHVybiAtIFZhbHVlIG9mIHRoZSBkYXRhIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpCi0JewotCSAgICByZXR1cm4gYXR0clZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JICAgIHBhdGguYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nV2lkZ2V0KFdpZGdldCBzb3VyY2UpCi0JewotCSAgICByZXR1cm4gcGF0aCA9PSBzb3VyY2U7Ci0JfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZpbGUgc2VsZWN0b3Igd2lkZ2V0IGFuZCByZWxhdGVkIHdpZGdldHMgZm9yIHRoaXMgY2xhc3MuIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsYXlvdXQgbWFuYWdlcgotICAgICAqIGZvciB0aGUgcGFyZW50IENvbXBvc2l0ZSBvYmplY3QgaXMgYSBHcmlkTGF5b3V0IHdpdGggNCBjb2x1bW5zLgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3JJRAotICAgICAqIEBwYXJhbSBkZWYKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVNlbGVjdG9yUm93V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpZCwgSW50ZWdlciBzZWxlY3RvcklELCBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LCA/LCA/PiBkZWYpCi0gICAgewotCWF0dHIgPSBkZWY7Ci0JbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JLy9UT0RPIGRydyBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZyhhdHRyLmdldE5hbWUoKSkpOwotCWxhYmVsLnNldFRleHQoYXR0ci5nZXROYW1lKCkpOwotCW5vbkRlZmF1bHRNYXJrZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0Jbm9uRGVmYXVsdE1hcmtlci5zZXRUZXh0KCIgIik7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JLy9UT0RPIGRydyB3aWRnZXQgPSBuZXcgRmlsZVNlbGVjdG9yKHBhcmVudCwgc2VsZWN0b3JJRCwgTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHIuZ2V0RGVzY3JpcHRpb24oKSkpOwotCXdpZGdldCA9IG5ldyBGaWxlU2VsZWN0b3IocGFyZW50LCBzZWxlY3RvcklELGF0dHIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0Jd2lkZ2V0LnNldERhdGEoaWQpOwotCXRyeSB7Ci0JICAgIGRlZmF1bHRWYWx1ZSA9IGF0dHIuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpOwotCX0KLQljYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkgICAgZGVmYXVsdFZhbHVlID0gIiI7Ci0JfQotCWV2ZW50TW9uaXRvciA9IG5ldyBFdmVudE1vbml0b3IoKTsKLQl3aWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBhdGhuYW1lIGZvciB0aGlzIG9iamVjdAotICAgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkKLSAgICB7Ci0Jd2lkZ2V0LnNldFBhdGgocGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbmFibGUgc3RhdGUgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIHN0YXRlIFRoZSBlbmFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gICAgewotCXdpZGdldC5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRhdGEgdmFsdWUgKGF0dHJpYnV0ZSBuYW1lKSBmb3IgdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGRhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldERhdGEodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGF0YSB2YWx1ZSAoYXR0cmlidXRlIG5hbWUpIGZvciB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIGRhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldERhdGEoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBhdGhuYW1lIHNwZWNpZmllZCBpbiB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gUGF0aG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXRQYXRoKCkudHJpbSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBlbmFibGUgc3RhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmlzRW5hYmxlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBmb2N1cyB0byB0aGUgdGV4dCBmaWVsZCB3aXRoaW4gdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpCi0gICAgewotCXdpZGdldC5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHNlbGVjdGlvbiBsaXN0ZW5lciB3aGljaCB3aWxsIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBicm93c2UgYnV0dG9uIGluIHRoaXMgb2JqZWN0IGhhcwotICAgICAqIGJlZW4gY2xpY2tlZC4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotCXdpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHdoaWNoIHdpbGwgcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gdGhlIHBhdGggbmFtZSBmaWVsZCBpbiB0aGlzIG9iamVjdCBoYXMgY2hhbmdlZCB2YWx1ZQotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0Jd2lkZ2V0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIG5vIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFZhbGlkYXRpb25TdGF0ZSgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5VTkNIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbiBlcnJvciBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZEluRXJyb3IoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQl2YWxpZGF0aW9uU3RhdGUgPSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgaWYgdGhpcyBvYmplY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkCi0gICAgICogQHJldHVybiAtIHZhbGlkYXRpb24gc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVxdWlyZWQoKQotICAgIHsKLQlyZXR1cm4gKCh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLkNIQU5HRUQpIHx8ICh2YWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblN0YXRlLklOX0VSUk9SKSk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBSZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0dWFsIHdpZGdldCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QgaXMgdGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkCi0gICAgICogZm9yCi0gICAgICogQHBhcmFtIHNvdXJjZSAtIFRoZSB3aWRnZXQgdGhhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IKLSAgICAgKiBAcmV0dXJuIC0gc3RhdHVzIGluZGljYXRpbmcgdGhpcyBvYmplY3QgY29udGFpbnMgdGhlIG1hdGNoaW5nIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nV2lkZ2V0KFdpZGdldCBzb3VyY2UpCi0gICAgewotCXJldHVybiB3aWRnZXQuaXNNYXRjaGluZ1dpZGdldChzb3VyY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvVGV4dFJvd1dpZGdldC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9UZXh0Um93V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NjYyODMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2lkZ2V0cy9UZXh0Um93V2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci0vL1RPRE8gZHJ3IGltcG9ydCBvcmcuZWNsaXBzZS5wdHAuaWJtbGwudWkuaW50ZXJuYWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0Um93V2lkZ2V0IGltcGxlbWVudHMgVmFsaWRhdGlvblN0YXRlCi17Ci0gICAgcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG5vbkRlZmF1bHRNYXJrZXI7Ci0gICAgcHJpdmF0ZSBHcmlkRGF0YSBncmlkRGF0YTsKLSAgICBwcml2YXRlIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGF0dHJEZWY7Ci0gICAgcHJpdmF0ZSBUZXh0IHdpZGdldDsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBFdmVudE1vbml0b3IgZXZlbnRNb25pdG9yOwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIHdoaWNoIGxpc3RlbnMgZm9yIGV2ZW50cyBpbmRpY2F0aW5nIHRoZSBkYXRhIHZhbHVlIGZvciB0aGlzIG9iamVjdCBoYXMgY2hhbmdlZAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFdmVudE1vbml0b3IgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotICAgIHsKLQlwdWJsaWMgRXZlbnRNb25pdG9yKCkKLQl7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBub24tZGVmYXVsdCB2YWx1ZSBpbmRpY2F0b3IgZm9yIHRoaXMgb2JqZWN0IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRhdGEgdmFsdWUgbWF0Y2hlcwotCSAqIHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0JICogQHBhcmFtIGUgVGhlIGV2ZW50IGluZGljYXRpbmcgZGF0YSB2YWx1ZSBoYXMgY2hhbmdlZCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0JewotCSAgICBTdHJpbmcgdmFsdWU7Ci0JICAgIAotCSAgICB2YWx1ZSA9IHdpZGdldC5nZXRUZXh0KCkudHJpbSgpOwotCSAgICBpZiAoKHZhbHVlLmxlbmd0aCAoKSA9PSAwKSB8fCAodmFsdWUuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpKSB7Ci0JCW5vbkRlZmF1bHRNYXJrZXIuc2V0VGV4dCgiICIpOwotCSAgICB9IGVsc2UgewotCQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIioiKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB3aWRnZXQgd2hpY2ggaXMgdXNlZCBhcyBhIHRleHQgZW50cnkgZmllbGQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLiBUaGlzIGNsYXNzIGFzc3VtZXMgdGhhdAotICAgICAqIHRoZSBsYXlvdXQgbWFuYWdlciBzZXQgZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlIG9iamVjdCBpcyBhIEdyaWRMYXlvdXQgd2lkZ2V0IHdpdGggNCBjb2x1bW5zCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IENvbXBvc2l0ZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKiBAcGFyYW0gZGVmIFRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhpcyB3aWRnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dFJvd1dpZGdldChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQsIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sID8sID8+IGRlZikKLSAgICB7Ci0JYXR0ckRlZiA9IGRlZjsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkvL1RPRE8gZHJ3IGxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKGF0dHJEZWYuZ2V0TmFtZSgpKSk7Ci0JbGFiZWwuc2V0VGV4dChhdHRyRGVmLmdldE5hbWUoKSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0Jbm9uRGVmYXVsdE1hcmtlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlub25EZWZhdWx0TWFya2VyLnNldFRleHQoIioiKTsKLQl3aWRnZXQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkvL1RPRE8gZHJ3IHdpZGdldC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoYXR0ckRlZi5nZXREZXNjcmlwdGlvbigpKSk7Ci0Jd2lkZ2V0LnNldFRvb2xUaXBUZXh0KGF0dHJEZWYuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jd2lkZ2V0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXdpZGdldC5zZXREYXRhKFdpZGdldEF0dHJpYnV0ZXMuQVRUUl9OQU1FLCBpZCk7Ci0JdHJ5IHsKLQkgICAgZGVmYXVsdFZhbHVlID0gYXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCSAgICBkZWZhdWx0VmFsdWUgPSAiIjsKLQl9Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCXdpZGdldC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIE1vZGlmeUxpc3RlbmVyIHRvIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIGxpc3RlbmluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb25pdG9yKQotICAgIHsKLQl3aWRnZXQuYWRkTW9kaWZ5TGlzdGVuZXIobW9uaXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkYXRhIHZhbHVlIGZvciB0aGlzIG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIGRhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldC5nZXRUZXh0KCkudHJpbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGF0YSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGRhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gICAgewotCXdpZGdldC5zZXRUZXh0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGEgb2JqZWN0IChhdHRyaWJ1dGUgbmFtZSkgc3RvcmVkIGluIHRoaXMgd2lkZ2V0Ci0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHVzZSBpbiByZXRyaWV2aW5nIHRoZSBkYXRhIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhKFN0cmluZyBrZXkpCi0gICAgewotCXJldHVybiAoU3RyaW5nKSB3aWRnZXQuZ2V0RGF0YShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCkKLSAgICB7Ci0JdmFsaWRhdGlvblN0YXRlID0gVmFsaWRhdGlvblN0YXRlLlVOQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5JTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXZhbGlkYXRpb25TdGF0ZSA9IFZhbGlkYXRpb25TdGF0ZS5DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGlzIG9iamVjdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQKLSAgICAgKiBAcmV0dXJuIC0gdmFsaWRhdGlvbiBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXF1aXJlZCgpCi0gICAgewotCXJldHVybiAoKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuQ0hBTkdFRCkgfHwgKHZhbGlkYXRpb25TdGF0ZSA9PSBWYWxpZGF0aW9uU3RhdGUuSU5fRVJST1IpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSkKLSAgICB7Ci0JcmV0dXJuIHdpZGdldCA9PSBzb3VyY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0Jd2lkZ2V0LnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICAgIHsKLQlyZXR1cm4gd2lkZ2V0LmlzRW5hYmxlZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvVmFsaWRhdGlvblN0YXRlLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL1ZhbGlkYXRpb25TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTVhNDQyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvVmFsaWRhdGlvblN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdGF0ZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ0hBTkdFRCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fRVJST1I9MjsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIG9iamVjdCdzIHZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgb2JqZWN0J3MgdmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVxdWlyZWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhpcyBvYmplY3QncyB2YWxpZGF0aW9uIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGluIGVycm9yIGFuZCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5FcnJvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIGlmIHRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZAotICAgICAqIEByZXR1cm4gLSB2YWxpZGF0aW9uIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGlvblJlcXVpcmVkKCk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgd2lkZ2V0IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCBpcyB0aGUgd2lkZ2V0IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQKLSAgICAgKiBmb3IKLSAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHdpZGdldCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gLSBzdGF0dXMgaW5kaWNhdGluZyB0aGlzIG9iamVjdCBjb250YWlucyB0aGUgbWF0Y2hpbmcgd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdXaWRnZXQoV2lkZ2V0IHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aWRnZXRzL1dpZGdldEF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvV2lkZ2V0QXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQwMGIxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpZGdldHMvV2lkZ2V0QXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2lkZ2V0czsKLQotcHVibGljIGludGVyZmFjZSBXaWRnZXRBdHRyaWJ1dGVzCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIkFUVFJfTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OX0lEID0gIkJVVFRPTl9JRCI7Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aXphcmRzL1BFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpemFyZHMvUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZTI1OWQ4Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpemFyZHMvUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSAqIFRoaXMgbWF0ZXJpYWwgd2FzIHByb2R1Y2VkIHVuZGVyIFUuUy4gR292ZXJubWVudCBjb250cmFjdCBXLTc0MDUtRU5HLTM2IAotICogZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgCi0gKiBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0gKiByaWdodHMgdG8gdXNlLCByZXByb2R1Y2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuIE5FSVRIRVIgVEhFIAotICogR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SIAotICogQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotICogdG8gcHJvZHVjZSBkZXJpdmF0aXZlIHdvcmtzLCBzdWNoIG1vZGlmaWVkIHNvZnR3YXJlIHNob3VsZCBiZSBjbGVhcmx5IG1hcmtlZCwgCi0gKiBzbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuCi0gKiAKLSAqIEFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIExBLUNDIDA0LTExNQotICogIAotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUudWkud2l6YXJkcy5BYnN0cmFjdFJlbW90ZVByb3h5UmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzCi0JQWJzdHJhY3RSZW1vdGVQcm94eVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsKLQkKLSAgICBwcml2YXRlIFJNQ29uZmlndXJhdGlvbldpemFyZCBjb25maWdXaXphcmQ7Ci0gICAgCi0JcHVibGljIFBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLkNvbmZpZ3VyYXRpb25UaXRsZSIpKTsKLQkJc2V0VGl0bGUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuQ29uZmlndXJhdGlvblRpdGxlIikpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5Db25maWd1cmF0aW9uIikpOwotCQljb25maWdXaXphcmQgPSB3aXphcmQ7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlT3B0aW9uc0RpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGluaXRpYWxPcHRpb25zKSB7Ci0JICAgIFBFUmVzb3VyY2VNYW5hZ2VyT3B0aW9uRGlhbG9nIGRpYWxvZzsKLQkgICAgCi0JICAgIGRpYWxvZyA9IG5ldyBQRVJlc291cmNlTWFuYWdlck9wdGlvbkRpYWxvZyhzaGVsbCwgY29uZmlnV2l6YXJkLCBpbml0aWFsT3B0aW9ucyk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgewotCQkJcmV0dXJuIGRpYWxvZy5nZXRWYWx1ZSgpOwotCQl9Ci0JICAgIHJldHVybiBpbml0aWFsT3B0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpemFyZHMvUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpemFyZHMvUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTUyNTg3ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL2libS9wZS91aS93aXphcmRzL1BFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIAotICogVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0gKiBmb3IgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcyBvcGVyYXRlZCBieSB0aGUgVW5pdmVyc2l0eSAKLSAqIG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhcyAKLSAqIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0gKiBHT1ZFUk5NRU5UIE5PUiBUSEUgVU5JVkVSU0lUWSBNQUtFUyBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRCwgT1IgCi0gKiBBU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWQgCi0gKiB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSAqIHNvIGFzIG5vdCB0byBjb25mdXNlIGl0IHdpdGggdGhlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gTEFOTC4KLSAqIAotICogQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogTEEtQ0MgMDQtMTE1Ci0gKiAgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5ybXN5c3RlbS5QRVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSBleHRlbmRzCi0JCVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5IHsKLQotCXB1YmxpYyBQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSgpIHsKLQkJLy8gbm8tb3AKLQl9Ci0KLQlwdWJsaWMgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZVtdIGdldFBhZ2VzKFJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsKLQkJcmV0dXJuIG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW117bmV3IFBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2Uod2l6YXJkKX07Ci0JfQotCi0JcHVibGljIENsYXNzPFBFUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeT4gZ2V0Uk1GYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBQRVJlc291cmNlTWFuYWdlckZhY3RvcnkuY2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2l6YXJkcy9QRVJlc291cmNlTWFuYWdlck9wdGlvbkRpYWxvZy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9pYm0vcGUvdWkvd2l6YXJkcy9QRVJlc291cmNlTWFuYWdlck9wdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTBiMzNkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vaWJtL3BlL3VpL3dpemFyZHMvUEVSZXNvdXJjZU1hbmFnZXJPcHRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLlBUUFJlbW90ZUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZS5QRVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLlBFUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlLnJtc3lzdGVtLlBFUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnVpLmludGVybmFsLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBQRVJlc291cmNlTWFuYWdlck9wdGlvbkRpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZwotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVNQRU5EX0FUX1NUQVJUVVBfT1BUSU9OID0gIi0tc3VzcGVuZF9hdF9zdGFydHVwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0xPQURMRVZFTEVSX09QVElPTiA9ICItLXVzZWxvYWRsZXZlbGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElDTFVTVEVSX09QVElPTiA9ICItLW11bHRpY2x1c3RlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUE9MTF9NSU5fT1BUSU9OID0gIi0tbm9kZV9wb2xsaW5nX21pbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUE9MTF9NQVhfT1BUSU9OID0gIi0tbm9kZV9wb2xsaW5nX21heCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9QT0xMX09QVElPTiA9ICItLWpvYl9wb2xsaW5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCX09WRVJSSURFX09QVElPTiA9ICItLWxpYl9vdmVycmlkZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX09QVElPTiA9ICItLXRyYWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX01JTklQUk9YWV9PUFRJT04gPSAiLS1ydW5NaW5pcHJveHkiOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG9wdGlvbnNQYW5lOwotICAgIHByaXZhdGUgQnV0dG9uIGxvYWRMZXZlbGVyT3B0aW9uOwotICAgIHByaXZhdGUgQnV0dG9uIHN1c3BlbmRPcHRpb247Ci0gICAgcHJpdmF0ZSBCdXR0b24gcnVuTWluaXByb3h5OwotICAgIHByaXZhdGUgQnV0dG9uIGxpYk92ZXJyaWRlQnJvd3NlOwotICAgIHByaXZhdGUgQnV0dG9uIGxsTW9kZUxvY2FsOwotICAgIHByaXZhdGUgQnV0dG9uIGxsTW9kZU11bHRpY2x1c3RlcjsKLSAgICBwcml2YXRlIEJ1dHRvbiBsbE1vZGVEZWZhdWx0OwotICAgIHByaXZhdGUgVGV4dCBub2RlUG9sbE1pbkludGVydmFsOwotICAgIHByaXZhdGUgVGV4dCBub2RlUG9sbE1heEludGVydmFsOwotICAgIHByaXZhdGUgVGV4dCBqb2JQb2xsSW50ZXJ2YWw7Ci0gICAgcHJpdmF0ZSBUZXh0IGxpYk92ZXJyaWRlUGF0aDsKLSAgICBwcml2YXRlIEdyb3VwIGxsTW9kZUdyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGxsT3ZlcnJpZGVCb3g7Ci0gICAgcHJpdmF0ZSBDb21ibyBkZWJ1Z0xldmVsOwotICAgIHByaXZhdGUgTGFiZWwgbGxMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIGRlYnVnTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBzdXNwZW5kTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBydW5NaW5pcHJveHlMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIGxpYk92ZXJyaWRlTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBsbE1vZGVMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG5vZGVQb2xsTWluTGFiZWw7Ci0gICAgcHJpdmF0ZSBMYWJlbCBub2RlUG9sbE1heExhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgam9iUG9sbExhYmVsOwotICAgIHByaXZhdGUgU2hlbGwgcGFyZW50U2hlbGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJveHlPcHRpb25zOwotICAgIHByaXZhdGUgUEVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLSAgICBwcml2YXRlIFJNQ29uZmlndXJhdGlvbldpemFyZCBjb25mV2l6YXJkOwotICAgIHByaXZhdGUgSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBJUmVtb3RlVUlTZXJ2aWNlcyByZW1vdGVVSVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBJUmVtb3RlQ29ubmVjdGlvbiByZW1vdGVDb25uZWN0aW9uOwotICAgIHByaXZhdGUgSVJlbW90ZUNvbm5lY3Rpb25NYW5hZ2VyIGNvbm5NZ3I7Ci0KLSAgICBwcml2YXRlIEV2ZW50TW9uaXRvciBldmVudE1vbml0b3I7Ci0KLSAgICBwcml2YXRlIGNsYXNzIEV2ZW50TW9uaXRvciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lcgotICAgIHsKLQlwdWJsaWMgRXZlbnRNb25pdG9yKCkKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCSAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSBsb2FkTGV2ZWxlck9wdGlvbikgewotCQlpZiAobG9hZExldmVsZXJPcHRpb24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJICAgIHNldExMV2lkZ2V0RW5hYmxlU3RhdGUodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCSAgICBzZXRMTFdpZGdldEVuYWJsZVN0YXRlKGZhbHNlKTsKLQkJfQotCSAgICB9Ci0JICAgIGlmIChlLmdldFNvdXJjZSgpID09IGxpYk92ZXJyaWRlQnJvd3NlKSB7Ci0JCVN0cmluZyBzZWxlY3RlZEZpbGUgPSBudWxsOwotCi0JCWlmIChyZW1vdGVVSVNlcnZpY2UgIT0gbnVsbCkgewotCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZm1nciA9IHJlbW90ZVVJU2VydmljZS5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCQlmbWdyLnNldENvbm5lY3Rpb24ocmVtb3RlQ29ubmVjdGlvbik7Ci0JCQlzZWxlY3RlZEZpbGUgPSBmbWdyLmJyb3dzZURpcmVjdG9yeShwYXJlbnRTaGVsbCwgCi0JCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmxpYnJhcnlTZWxlY3RvclRpdGxlIiksICIvIikudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLQkJICAgIGxpYk92ZXJyaWRlUGF0aC5zZXRUZXh0KHNlbGVjdGVkRmlsZSk7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJdmFsaWRhdGVJbnB1dChlLmdldFNvdXJjZSgpKTsKLQkgICAgfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQl7Ci0JICAgIHZhbGlkYXRlSW5wdXQoZS5nZXRTb3VyY2UoKSk7Ci0JfQotICAgIH0KLQotICAgIHB1YmxpYyBQRVJlc291cmNlTWFuYWdlck9wdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQsIFN0cmluZyBpbml0aWFsT3B0aW9ucykKLSAgICB7Ci0Jc3VwZXIocGFyZW50KTsKLQlwYXJlbnRTaGVsbCA9IHBhcmVudDsKLQljb25mV2l6YXJkID0gd2l6YXJkOwotCWNvbmZpZyA9IChQRVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGNvbmZXaXphcmQuZ2V0Q29uZmlndXJhdGlvbigpOwotCXNldEluaXRpYWxPcHRpb25zKGluaXRpYWxPcHRpb25zKTsKLQljcmVhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG9iamVjdCBmb3IgdGhlIFBFIGltcGxlbWVudGF0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkKLSAgICB7Ci0JcmV0dXJuIFBFUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHdpZGdldHMgZm9yIHRoaXMgcHJveHkgY29uZmlndXJhdGlvbiBwYWdlIGFuZCBzZXQgdGhlaXIgdmFsdWVzCi0gICAgICogdG8gdGhlIGxhc3Qgc2F2ZWQgdmFsdWVzIGZvciB0aGlzIHJlc291cmNlIG1hbmFnZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IC0gVGhlIHBhcmVudCB3aWRnZXQgZm9yIHRoaXMgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotCUdyaWRMYXlvdXQgbGF5b3V0OwotCUdyaWRMYXlvdXQgbGliUGF0aExheW91dDsKLQlHcmlkTGF5b3V0IG1vZGVMYXlvdXQ7Ci0JR3JpZERhdGEgZ2Q7Ci0JUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7Ci0JU3RyaW5nIHByZWZlcmVuY2VWYWx1ZTsKLQotCXNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLkludm9jYXRpb25PcHRpb25zVGl0bGUiKSk7Ci0JZXZlbnRNb25pdG9yID0gbmV3IEV2ZW50TW9uaXRvcigpOwotCXByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQlvcHRpb25zUGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0Jb3B0aW9uc1BhbmUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQlsbExhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNQYW5lLCBTV1QuTk9ORSk7Ci0JbGxMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLkxvYWRMZXZlbGVyT3B0aW9uTGFiZWwiKSk7Ci0JbG9hZExldmVsZXJPcHRpb24gPSBuZXcgQnV0dG9uKG9wdGlvbnNQYW5lLCBTV1QuQ0hFQ0spOwotCXByZWZlcmVuY2VWYWx1ZSA9IGNvbmZpZy5nZXRVc2VMb2FkTGV2ZWxlcigpOwotCWlmICgocHJlZmVyZW5jZVZhbHVlICE9IG51bGwpICYmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fWUVTKSkpIHsKLQkgICAgbG9hZExldmVsZXJPcHRpb24uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQlsbE1vZGVMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCWxsTW9kZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuTExSdW5Nb2RlIikpOwotCWxsTW9kZUdyb3VwID0gbmV3IEdyb3VwKG9wdGlvbnNQYW5lLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JbW9kZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCWxsTW9kZUdyb3VwLnNldExheW91dChtb2RlTGF5b3V0KTsKLQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWxsTW9kZUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCWxsTW9kZUxvY2FsID0gbmV3IEJ1dHRvbihsbE1vZGVHcm91cCwgU1dULlJBRElPKTsKLQlsbE1vZGVMb2NhbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmxsTW9kZUxvY2FsIikpOwotCWxsTW9kZU11bHRpY2x1c3RlciA9IG5ldyBCdXR0b24obGxNb2RlR3JvdXAsIFNXVC5SQURJTyk7Ci0JbGxNb2RlTXVsdGljbHVzdGVyLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MubGxNb2RlTXVsdGljbHVzdGVyIikpOwotCWxsTW9kZURlZmF1bHQgPSBuZXcgQnV0dG9uKGxsTW9kZUdyb3VwLCBTV1QuUkFESU8pOwotCWxsTW9kZURlZmF1bHQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5sbE1vZGVEZWZhdWx0IikpOwotCWxsTW9kZURlZmF1bHQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlsbE1vZGVMb2NhbC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWxsTW9kZU11bHRpY2x1c3Rlci5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCXByZWZlcmVuY2VWYWx1ZSA9IGNvbmZpZy5nZXRMb2FkTGV2ZWxlck1vZGUoKTsKLQlpZiAocHJlZmVyZW5jZVZhbHVlICE9IG51bGwpIHsKLQkgICAgaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoInkiKSkgewotCQlsbE1vZGVNdWx0aWNsdXN0ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCSAgICB9IGVsc2UgaWYgKHByZWZlcmVuY2VWYWx1ZS5lcXVhbHMoIm4iKSkgewotCQlsbE1vZGVMb2NhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWxsTW9kZURlZmF1bHQuc2V0U2VsZWN0aW9uKHRydWUpOwotCSAgICB9Ci0JfSAKLQllbHNlIHsKLQkgICAgbGxNb2RlRGVmYXVsdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0Jbm9kZVBvbGxNaW5MYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCW5vZGVQb2xsTWluTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5taW5Ob2RlUG9sbEludGVydmFsIikpOwotCW5vZGVQb2xsTWluSW50ZXJ2YWwgPSBuZXcgVGV4dChvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jbm9kZVBvbGxNaW5JbnRlcnZhbC5zZXRMYXlvdXREYXRhKGdkKTsKLQlwcmVmZXJlbmNlVmFsdWUgPSBjb25maWcuZ2V0Tm9kZU1pblBvbGxJbnRlcnZhbCgpOwotCWlmIChwcmVmZXJlbmNlVmFsdWUgIT0gbnVsbCkgewotCSAgICBub2RlUG9sbE1pbkludGVydmFsLnNldFRleHQocHJlZmVyZW5jZVZhbHVlKTsKLQl9Ci0KLQlub2RlUG9sbE1heExhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNQYW5lLCBTV1QuTk9ORSk7Ci0Jbm9kZVBvbGxNYXhMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLm1heE5vZGVQb2xsSW50ZXJ2YWwiKSk7Ci0Jbm9kZVBvbGxNYXhJbnRlcnZhbCA9IG5ldyBUZXh0KG9wdGlvbnNQYW5lLCBTV1QuTk9ORSk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlub2RlUG9sbE1heEludGVydmFsLnNldExheW91dERhdGEoZ2QpOwotCXByZWZlcmVuY2VWYWx1ZSA9IGNvbmZpZy5nZXROb2RlTWF4UG9sbEludGVydmFsKCk7Ci0JaWYgKHByZWZlcmVuY2VWYWx1ZSAhPSBudWxsKSB7Ci0JICAgIG5vZGVQb2xsTWF4SW50ZXJ2YWwuc2V0VGV4dChwcmVmZXJlbmNlVmFsdWUpOwotCX0KLQotCWpvYlBvbGxMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCWpvYlBvbGxMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmpvYlBvbGxJbnRlcnZhbCIpKTsKLQlqb2JQb2xsSW50ZXJ2YWwgPSBuZXcgVGV4dChvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jam9iUG9sbEludGVydmFsLnNldExheW91dERhdGEoZ2QpOwotCXByZWZlcmVuY2VWYWx1ZSA9IGNvbmZpZy5nZXRKb2JQb2xsSW50ZXJ2YWwoKTsKLQlpZiAocHJlZmVyZW5jZVZhbHVlICE9IG51bGwpIHsKLQkgICAgam9iUG9sbEludGVydmFsLnNldFRleHQocHJlZmVyZW5jZVZhbHVlKTsKLQl9Ci0KLQlsaWJPdmVycmlkZUxhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNQYW5lLCBTV1QuTk9ORSk7Ci0JbGliT3ZlcnJpZGVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmxpYk92ZXJyaWRlTGFiZWwiKSk7Ci0KLQlsbE92ZXJyaWRlQm94ID0gbmV3IENvbXBvc2l0ZShvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JbGxPdmVycmlkZUJveC5zZXRMYXlvdXREYXRhKGdkKTsKLQlsaWJQYXRoTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWxpYlBhdGhMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JbGliUGF0aExheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JbGliUGF0aExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JbGxPdmVycmlkZUJveC5zZXRMYXlvdXQobGliUGF0aExheW91dCk7Ci0JbGliT3ZlcnJpZGVQYXRoID0gbmV3IFRleHQobGxPdmVycmlkZUJveCwgU1dULk5PTkUpOwotCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JbGliT3ZlcnJpZGVQYXRoLnNldExheW91dERhdGEoZ2QpOwotCWxpYk92ZXJyaWRlQnJvd3NlID0gbmV3IEJ1dHRvbihsbE92ZXJyaWRlQm94LCBTV1QuUFVTSCk7Ci0JbGliT3ZlcnJpZGVCcm93c2Uuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5icm93c2UiKSk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JbGliT3ZlcnJpZGVCcm93c2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcHJlZmVyZW5jZVZhbHVlID0gY29uZmlnLmdldExpYnJhcnlPdmVycmlkZSgpOwotCWlmIChwcmVmZXJlbmNlVmFsdWUgIT0gbnVsbCkgewotCSAgICBsaWJPdmVycmlkZVBhdGguc2V0VGV4dChwcmVmZXJlbmNlVmFsdWUpOwotCX0KLQotCXJ1bk1pbmlwcm94eUxhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNQYW5lLCBTV1QuTk9ORSk7Ci0JcnVuTWluaXByb3h5TGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5NaW5pcHJveHlMYWJlbCIpKTsKLQlydW5NaW5pcHJveHkgPSBuZXcgQnV0dG9uKG9wdGlvbnNQYW5lLCBTV1QuQ0hFQ0spOwotCXByZWZlcmVuY2VWYWx1ZSA9IGNvbmZpZy5nZXRSdW5NaW5pcHJveHkoKTsKLQlpZiAoKHByZWZlcmVuY2VWYWx1ZSAhPSBudWxsKSAmJiAocHJlZmVyZW5jZVZhbHVlLmVxdWFscyhQRVByZWZlcmVuY2VDb25zdGFudHMuT1BUSU9OX1lFUykpKSB7Ci0JICAgIHJ1bk1pbmlwcm94eS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JZGVidWdMYWJlbCA9IG5ldyBMYWJlbChvcHRpb25zUGFuZSwgU1dULk5PTkUpOwotCWRlYnVnTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5UcmFjZUxldmVsTGFiZWwiKSk7Ci0JZGVidWdMZXZlbCA9IG5ldyBDb21ibyhvcHRpb25zUGFuZSwgU1dULlJFQURfT05MWSk7Ci0JZGVidWdMZXZlbC5hZGQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlRSQUNFX05PVEhJTkcpOwotCWRlYnVnTGV2ZWwuYWRkKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5UUkFDRV9GVU5DVElPTik7Ci0JZGVidWdMZXZlbC5hZGQoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLlRSQUNFX0RFVEFJTCk7Ci0JcHJlZmVyZW5jZVZhbHVlID0gY29uZmlnLmdldERlYnVnTGV2ZWwoKTsKLQlpZiAocHJlZmVyZW5jZVZhbHVlICE9IG51bGwpIHsKLQkgICAgZGVidWdMZXZlbC5zZXRUZXh0KHByZWZlcmVuY2VWYWx1ZSk7Ci0JfQotCi0Jc3VzcGVuZExhYmVsID0gbmV3IExhYmVsKG9wdGlvbnNQYW5lLCBTV1QuTlVMTCk7Ci0Jc3VzcGVuZExhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQRURpYWxvZ3MuU3VzcGVuZExhYmVsIikpOwotCXN1c3BlbmRPcHRpb24gPSBuZXcgQnV0dG9uKG9wdGlvbnNQYW5lLCBTV1QuQ0hFQ0spOwotCXByZWZlcmVuY2VWYWx1ZSA9IGNvbmZpZy5nZXRTdXNwZW5kUHJveHkoKTsKLQkvLyBzdXNwZW5kT3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHRoZSBwcm94eSBzaG91bGQgc3VzcGVuZCBhZnRlciBpdCBoYXMgcmVjb2duaXplZCB0aGlzCi0JLy8gb3B0aW9uIHNvIHRoYXQgYSBkZWJ1Z2dlciBjYW4gYXR0YWNoIHRvIGl0LiBTaW5jZSB0aGlzIGlzIGEgZGVidWdnaW5nIGFpZCwgdGhlcmUgaXMgbm8KLQkvLyBwcmVmZXJlbmNlcyBzZXR0aW5nIGZvciB0aGlzIGZsYWcgKHByb3hpZXMgc2hvdWxkIG5ldmVyIHN1c3BlbmQgYXQgc3RhcnR1cCBieSBkZWZhdWx0KQotCWlmICgocHJlZmVyZW5jZVZhbHVlICE9IG51bGwpICYmIChwcmVmZXJlbmNlVmFsdWUuZXF1YWxzKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fWUVTKSkpIHsKLQkgICAgc3VzcGVuZE9wdGlvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JaWYgKCFsb2FkTGV2ZWxlck9wdGlvbi5nZXRTZWxlY3Rpb24oKSkgewotCSAgICBzZXRMTFdpZGdldEVuYWJsZVN0YXRlKGZhbHNlKTsKLQl9Ci0JbG9hZExldmVsZXJPcHRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlzdXNwZW5kT3B0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JbGxNb2RlTG9jYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsbE1vZGVNdWx0aWNsdXN0ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsbE1vZGVEZWZhdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0Jbm9kZVBvbGxNaW5JbnRlcnZhbC5hZGRNb2RpZnlMaXN0ZW5lcihldmVudE1vbml0b3IpOwotCW5vZGVQb2xsTWF4SW50ZXJ2YWwuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlqb2JQb2xsSW50ZXJ2YWwuYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsaWJPdmVycmlkZVBhdGguYWRkTW9kaWZ5TGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlsaWJPdmVycmlkZUJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCXJ1bk1pbmlwcm94eS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudE1vbml0b3IpOwotCXN1c3BlbmRPcHRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnRNb25pdG9yKTsKLQlkZWJ1Z0xldmVsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50TW9uaXRvcik7Ci0JCS8vIEVuc3VyZSB0aGF0IHRoZSBzdGFydGluZyB2YWx1ZXMgZm9yIHRoaXMgZGlhbG9nIGFyZSB2YWxpZCBhbmQgdGhhdCBvcHRpb25zIGNvbnRhaW5lZCBpbiB0aGlzCi0JCS8vIGRpYWxvZyBhcmUgc3RvcmVkIGluIHRoZSBvcHRpb24gc3RyaW5nIGV2ZW4gaWYgbm8gY2hhbmdlcyBhcmUgbWFkZS4KLQl2YWxpZGF0ZUlucHV0KG51bGwpOwotCXJldHVybiBvcHRpb25zUGFuZTsKLSAgICB9Ci0KLSAgICAJLyoqCi0gICAgCSAqIFNldCB0aGUgd2lkZ2V0IGVuYWJsZSBzdGF0ZSBmb3IgdGhlc2Ugd2lkZ2V0cyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB1c2UgTG9hZExldmVsZXIgY2hlY2tib3gKLSAgICAJICogaXMgY2hlY2tlZAotICAgIAkgKiAKLSAgICAJICogQHBhcmFtIHN0YXRlCi0gICAgCSAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRMTFdpZGdldEVuYWJsZVN0YXRlKGJvb2xlYW4gc3RhdGUpCi0gICAgewotCWxsTW9kZUxvY2FsLnNldEVuYWJsZWQoc3RhdGUpOwotCWxsTW9kZU11bHRpY2x1c3Rlci5zZXRFbmFibGVkKHN0YXRlKTsKLQlsbE1vZGVEZWZhdWx0LnNldEVuYWJsZWQoc3RhdGUpOwotCW5vZGVQb2xsTWluSW50ZXJ2YWwuc2V0RW5hYmxlZChzdGF0ZSk7Ci0Jbm9kZVBvbGxNYXhJbnRlcnZhbC5zZXRFbmFibGVkKHN0YXRlKTsKLQlqb2JQb2xsSW50ZXJ2YWwuc2V0RW5hYmxlZChzdGF0ZSk7Ci0JbGliT3ZlcnJpZGVQYXRoLnNldEVuYWJsZWQoc3RhdGUpOwotCWxpYk92ZXJyaWRlQnJvd3NlLnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBzZXR0aW5ncyBzcGVjaWZpZWQgb24gdGhpcyBwYW5lbCwgdmFsaWRhdGUgdGhvc2UgdmFsdWVzLCAKLSAgICAgKiBhbmQgY3JlYXRlIHRoZSBzdHJpbmcgY29udGFpbmluZyBwcm94eSBpbnZvY2F0aW9uIG9wdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aG9zZSB2YWx1ZXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0YXR1cyBpbmRpY2F0aW5nIHN1Y2Nlc3NmdWwgY29tcGxldGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlSW5wdXQoT2JqZWN0IGV2ZW50U291cmNlKQotICAgIHsKLQlTdHJpbmcgdHJhY2VPcHQ7Ci0KLQlwcm94eU9wdGlvbnMgPSAiIjsKLQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JaWYgKGxvYWRMZXZlbGVyT3B0aW9uLmdldFNlbGVjdGlvbigpKSB7Ci0JICAgIFN0cmluZyB3aWRnZXRWYWx1ZTsKLQkgICAgU3RyaW5nIG11bHRpY2x1c3Rlck1vZGU7Ci0JICAgIGludCBpbnRlcnZhbDsKLQotCSAgICBwcm94eU9wdGlvbnMgPSBwcm94eU9wdGlvbnMgKyBVU0VfTE9BRExFVkVMRVJfT1BUSU9OICsgIiAiOwotCSAgICBjb25maWcuc2V0VXNlTG9hZExldmVsZXIoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9ZRVMpOwotCSAgICBwcm94eU9wdGlvbnMgPSBwcm94eU9wdGlvbnMgKyBNVUxUSUNMVVNURVJfT1BUSU9OICsgIj0iOwotCSAgICBpZiAobGxNb2RlRGVmYXVsdC5nZXRTZWxlY3Rpb24oKSkgewotCQltdWx0aWNsdXN0ZXJNb2RlID0gImQiOwotCSAgICB9IGVsc2UgaWYgKGxsTW9kZUxvY2FsLmdldFNlbGVjdGlvbigpKSB7Ci0JCW11bHRpY2x1c3Rlck1vZGUgPSAibiI7Ci0JICAgIH0gZWxzZSB7Ci0JCW11bHRpY2x1c3Rlck1vZGUgPSAieSI7Ci0JICAgIH0KLQkgICAgcHJveHlPcHRpb25zID0gcHJveHlPcHRpb25zICsgbXVsdGljbHVzdGVyTW9kZSArICIgIjsKLQkgICAgY29uZmlnLnNldExvYWRMZXZlbGVyTW9kZShtdWx0aWNsdXN0ZXJNb2RlKTsKLQkgICAgd2lkZ2V0VmFsdWUgPSBub2RlUG9sbE1pbkludGVydmFsLmdldFRleHQoKS50cmltKCk7Ci0JICAgIGlmICh3aWRnZXRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJdHJ5IHsKLQkJICAgIGludGVydmFsID0gSW50ZWdlci52YWx1ZU9mKHdpZGdldFZhbHVlKTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5pbnZhbGlkTWluUG9sbEludGVydmFsIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXByb3h5T3B0aW9ucyA9IHByb3h5T3B0aW9ucyArIE5PREVfUE9MTF9NSU5fT1BUSU9OICsgIj0iICsgd2lkZ2V0VmFsdWUgKyAiICI7Ci0JICAgIH0KLQkgICAgY29uZmlnLnNldE5vZGVNaW5Qb2xsSW50ZXJ2YWwod2lkZ2V0VmFsdWUpOwotCSAgICB3aWRnZXRWYWx1ZSA9IG5vZGVQb2xsTWF4SW50ZXJ2YWwuZ2V0VGV4dCgpLnRyaW0oKTsKLQkgICAgaWYgKHdpZGdldFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQl0cnkgewotCQkgICAgaW50ZXJ2YWwgPSBJbnRlZ2VyLnZhbHVlT2Yod2lkZ2V0VmFsdWUpOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiUEVEaWFsb2dzLmludmFsaWRNYXhQb2xsSW50ZXJ2YWwiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHJveHlPcHRpb25zID0gcHJveHlPcHRpb25zICsgTk9ERV9QT0xMX01BWF9PUFRJT04gKyAiPSIgKyB3aWRnZXRWYWx1ZSArICIgIjsKLQkgICAgfQotCSAgICBjb25maWcuc2V0Tm9kZU1heFBvbGxJbnRlcnZhbCh3aWRnZXRWYWx1ZSk7Ci0JICAgIHdpZGdldFZhbHVlID0gam9iUG9sbEludGVydmFsLmdldFRleHQoKS50cmltKCk7Ci0JICAgIGlmICh3aWRnZXRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJdHJ5IHsKLQkJICAgIGludGVydmFsID0gSW50ZWdlci52YWx1ZU9mKHdpZGdldFZhbHVlKTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5pbnZhbGlkSm9iUG9sbEludGVydmFsIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXByb3h5T3B0aW9ucyA9IHByb3h5T3B0aW9ucyArIEpPQl9QT0xMX09QVElPTiArICI9IiArIHdpZGdldFZhbHVlICsgIiAiOwotCSAgICB9Ci0JICAgIGNvbmZpZy5zZXRKb2JQb2xsSW50ZXJ2YWwod2lkZ2V0VmFsdWUpOwotCSAgICB3aWRnZXRWYWx1ZSA9IGxpYk92ZXJyaWRlUGF0aC5nZXRUZXh0KCkudHJpbSgpOwotCSAgICBpZiAoKHdpZGdldFZhbHVlLmxlbmd0aCgpID4gMCkgJiYgKGV2ZW50U291cmNlID09IGxpYk92ZXJyaWRlUGF0aCkpIHsKLQkJSUZpbGVTdG9yZSByZW1vdGVSZXNvdXJjZTsKLQkJSUZpbGVJbmZvIGZpbGVJbmZvOwotCQlJUGF0aCB0ZXN0UGF0aDsKLQotCQlyZW1vdGVTZXJ2aWNlID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMoY29uZmlnLmdldFJlbW90ZVNlcnZpY2VzSWQoKSk7Ci0JCWNvbm5NZ3IgPSByZW1vdGVTZXJ2aWNlLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0JCXJlbW90ZUNvbm5lY3Rpb24gPSBjb25uTWdyLmdldENvbm5lY3Rpb24oY29uZmlnLmdldENvbm5lY3Rpb25OYW1lKCkpOwotCQl0ZXN0UGF0aCA9IG5ldyBQYXRoKHdpZGdldFZhbHVlKTsKLQkJaWYgKCF0ZXN0UGF0aC5pc1ZhbGlkUGF0aCh3aWRnZXRWYWx1ZSkpIHsKLQkJICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5pbnZhbGlkTGlicmFyeVBhdGgiKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJICAgIHJlbW90ZVJlc291cmNlID0gcmVtb3RlU2VydmljZS5nZXRGaWxlTWFuYWdlcihyZW1vdGVDb25uZWN0aW9uKS5nZXRSZXNvdXJjZSh0ZXN0UGF0aCwKLQkJCSAgICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJICAgIGZpbGVJbmZvID0gcmVtb3RlUmVzb3VyY2UuZmV0Y2hJbmZvKCk7Ci0JCSAgICBpZiAoKCFmaWxlSW5mby5leGlzdHMoKSkgfHwgKCEgZmlsZUluZm8uaXNEaXJlY3RvcnkoKSkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlBFRGlhbG9ncy5pbnZhbGlkTGlicmFyeVBhdGgiKSk7Ci0JCSAgICB9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIkludmFsaWQucmVtb3RlQ29ubmVjdGlvbkVycm9yIikgKyAiICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcHJveHlPcHRpb25zID0gcHJveHlPcHRpb25zICsgTElCX09WRVJSSURFX09QVElPTiArICI9IiArIHdpZGdldFZhbHVlICsgIiAiOwotCSAgICB9Ci0JICAgIGNvbmZpZy5zZXRMaWJyYXJ5T3ZlcnJpZGUod2lkZ2V0VmFsdWUpOwotCX0gZWxzZSB7Ci0JICAgIGNvbmZpZy5zZXRVc2VMb2FkTGV2ZWxlcihQRVByZWZlcmVuY2VDb25zdGFudHMuT1BUSU9OX05PKTsKLQl9Ci0JdHJhY2VPcHQgPSBkZWJ1Z0xldmVsLmdldFRleHQoKTsKLQlpZiAodHJhY2VPcHQubGVuZ3RoKCkgPiAwKSB7Ci0JICAgIHByb3h5T3B0aW9ucyA9IHByb3h5T3B0aW9ucyArIFRSQUNFX09QVElPTiArICI9IiArIHRyYWNlT3B0ICsgIiAiOwotCSAgICBjb25maWcuc2V0RGVidWdMZXZlbCh0cmFjZU9wdCk7Ci0JfQotCWlmIChzdXNwZW5kT3B0aW9uLmdldFNlbGVjdGlvbigpKSB7Ci0JICAgIHByb3h5T3B0aW9ucyA9IHByb3h5T3B0aW9ucyArIFNVU1BFTkRfQVRfU1RBUlRVUF9PUFRJT047Ci0JICAgIGNvbmZpZy5zZXRTdXNwZW5kUHJveHkoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9ZRVMpOwotCX0gZWxzZSB7Ci0JICAgIGNvbmZpZy5zZXRTdXNwZW5kUHJveHkoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9OTyk7Ci0JfQotCWlmIChydW5NaW5pcHJveHkuZ2V0U2VsZWN0aW9uKCkpIHsKLQkgICAgcHJveHlPcHRpb25zID0gcHJveHlPcHRpb25zICsgUlVOX01JTklQUk9YWV9PUFRJT04gKyAiICI7Ci0JICAgIGNvbmZpZy5zZXRSdW5NaW5pcHJveHkoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9ZRVMpOwotCX0gZWxzZSB7Ci0JICAgIGNvbmZpZy5zZXRSdW5NaW5pcHJveHkoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9OTyk7Ci0JfQotCWNvbmZpZy5zZXRJbnZvY2F0aW9uT3B0aW9ucyhwcm94eU9wdGlvbnMpOwotCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0JcmV0dXJuIHByb3h5T3B0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbE9wdGlvbnMoU3RyaW5nIGluaXRpYWxPcHRpb25zKQotICAgIHsKLQlTdHJpbmdUb2tlbml6ZXIgb3B0aW9uczsKLQkKLQlvcHRpb25zID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbml0aWFsT3B0aW9ucywgIiAiKTsKLQljb25maWcuc2V0U3VzcGVuZFByb3h5KFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fTk8pOwotCWNvbmZpZy5zZXRSdW5NaW5pcHJveHkoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9OTyk7Ci0Jd2hpbGUgKG9wdGlvbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JICAgIFN0cmluZyBjdXJyZW50VG9rZW5bXTsKLQkgICAgCi0JICAgIGN1cnJlbnRUb2tlbiA9IG9wdGlvbnMubmV4dFRva2VuKCkuc3BsaXQoIj0iKTsKLQkgICAgaWYgKGN1cnJlbnRUb2tlbi5sZW5ndGggPT0gMSkgewotCQlpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhTVVNQRU5EX0FUX1NUQVJUVVBfT1BUSU9OKSkgewotCQkgICAgY29uZmlnLnNldFN1c3BlbmRQcm94eShQRVByZWZlcmVuY2VDb25zdGFudHMuT1BUSU9OX1lFUyk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhSVU5fTUlOSVBST1hZX09QVElPTikpIHsKLQkJICAgIGNvbmZpZy5zZXRSdW5NaW5pcHJveHkoUEVQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTl9ZRVMpOwotCQl9ICAKLQkJZWxzZSBpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhVU0VfTE9BRExFVkVMRVJfT1BUSU9OKSkgewotCQkgICAgY29uZmlnLnNldFVzZUxvYWRMZXZlbGVyKFBFUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05fWUVTKTsKLQkJfSAgCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWlmIChjdXJyZW50VG9rZW5bMF0uZXF1YWxzKE1VTFRJQ0xVU1RFUl9PUFRJT04pKSB7Ci0JCSAgICBjb25maWcuc2V0TG9hZExldmVsZXJNb2RlKGN1cnJlbnRUb2tlblsxXSk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhOT0RFX1BPTExfTUlOX09QVElPTikpIHsKLQkJICAgIGNvbmZpZy5zZXROb2RlTWluUG9sbEludGVydmFsKGN1cnJlbnRUb2tlblsxXSk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhOT0RFX1BPTExfTUFYX09QVElPTikpIHsKLQkJICAgIGNvbmZpZy5zZXROb2RlTWF4UG9sbEludGVydmFsKGN1cnJlbnRUb2tlblsxXSk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhKT0JfUE9MTF9PUFRJT04pKSB7Ci0JCSAgICBjb25maWcuc2V0Sm9iUG9sbEludGVydmFsKGN1cnJlbnRUb2tlblsxXSk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFRva2VuWzBdLmVxdWFscyhMSUJfT1ZFUlJJREVfT1BUSU9OKSkgewotCQkgICAgY29uZmlnLnNldExpYnJhcnlPdmVycmlkZShjdXJyZW50VG9rZW5bMV0pOwotCQl9Ci0JCWVsc2UgaWYgKGN1cnJlbnRUb2tlblswXS5lcXVhbHMoVFJBQ0VfT1BUSU9OKSkgewotCQkgICAgY29uZmlnLnNldERlYnVnTGV2ZWwoY3VycmVudFRva2VuWzFdKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZjZTBhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWUzNTQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI01vbiBPY3QgMDYgMTQ6MzY6NDQgR01ULTAzOjAwIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWM5MzEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0sCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2Uuc2VhcmNoCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LmluaSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDE1ZTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QVFAgTVBJQ0gyIChuZXcpIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjFmODkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZGF0YS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhkYjllLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2RhdGEvZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTEFVTkNIX0NNRD1tcGlleGVjIC1sIC1hICR7TVBJQ0gyX2pvYmlkfSAke01QSUNIMl9hcmdzfSAke01QSUNIMl9lbnZ9ICR7ZXhlY1BhdGh9LyR7ZXhlY05hbWV9ICR7cHJvZ0FyZ3N9Ci1ERUJVR19DTUQ9bXBpZXhlYyAgLWwgLWEgJHtNUElDSDJfam9iaWR9ICR7TVBJQ0gyX2FyZ3N9ICR7TVBJQ0gyX2Vudn0gJHtkZWJ1Z0V4ZWNQYXRofS8ke2RlYnVnRXhlY05hbWV9ICR7ZGVidWdBcmdzfQotRElTQ09WRVJfQ01EPW1wZHRyYWNlIC1sCi1QRVJJT0RJQ19DTUQ9bXBkbGlzdGpvYnMKLVBFUklPRElDX1RJTUU9NTAwMAotUEFUSD0KLVVTRV9ERUZBVUxUUz10cnVlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9lY2xpcHNlMzIucG5nIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmYjViYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgTVBJQ0gyIChuZXcpIFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhM2FhOC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLmNvcmUucmVzb3VyY2VNYW5hZ2VycyI+Ci0gICAgICA8cmVzb3VyY2VNYW5hZ2VyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5NUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5tcGljaDIuY29yZS5yZXNvdXJjZW1hbmFnZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGE0ZTYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUZGRUNUSVZFX01QSUNIMl9FTlZfQVRUUl9JRCA9ICJNUElDSDJfZW52IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RJVkVfTVBJQ0gyX1BST0dfQVJHU19BVFRSX0lEID0gIk1QSUNIMl9wcm9nQXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUZGRUNUSVZFX01QSUNIMl9XT1JLSU5HX0RJUl9BVFRSX0lEID0gIk1QSUNIMl93b3JraW5nRGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZiA9Ci0JCW5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPihFRkZFQ1RJVkVfTVBJQ0gyX0VOVl9BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbnVsbCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWYgPQotCQluZXcgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4oRUZGRUNUSVZFX01QSUNIMl9QUk9HX0FSR1NfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyUHJvZ0FyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBudWxsKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJEZWYgPQotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihFRkZFQ1RJVkVfTVBJQ0gyX1dPUktJTkdfRElSX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgTVBJQ0gyIGhhcyBwYXNzZWQgdG8gdGhlIHByb2Nlc3Nlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVmZmVjdGl2ZU1QSUNIMkVudkF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIFByb2dyYW0gYXJndW1lbnRzIHRoYXQgTVBJQ0gyIGhhcyBwYXNzZWQgdG8gdGhlIHByb2Nlc3Nlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBXb3JraW5nIGRpcmVjdG9yeSB3aGVyZSBNUElDSDIgaGFzIHN0YXJ0ZWQgdGhlIHByb2Nlc3Nlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJEZWZhdWx0cy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiNGIyZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJEZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJEZWZhdWx0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQVVOQ0hfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUJVR19DTUQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0NPVkVSX0NNRCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSSU9ESUNfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGludCBQRVJJT0RJQ19USU1FID0gMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQVRIID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVVNFX0RFRkFVTFRTID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdHNSZXNvdXJjZVBhdGggPSAiL2RhdGEvZGVmYXVsdHMucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkRGVmYXVsdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBhdGggZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCA9IG5ldyBQYXRoKGRlZmF1bHRzUmVzb3VyY2VQYXRoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IE1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHJlYWQoZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgYnVuZGxlKTsKLQotCQlMQVVOQ0hfQ01EID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkxBVU5DSF9DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVR19DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiREVCVUdfQ01EIik7IC8vJE5PTi1OTFMtMSQKLQkJRElTQ09WRVJfQ01EID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkRJU0NPVkVSX0NNRCIpOyAvLyROT04tTkxTLTEkCi0JCVBFUklPRElDX0NNRCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQRVJJT0RJQ19DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlQRVJJT0RJQ19USU1FID0gZ2V0SW50ZWdlcihidW5kbGUsIHByb3BlcnRpZXMsICJQRVJJT0RJQ19USU1FIik7IC8vJE5PTi1OTFMtMSQKLQkJUEFUSCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQQVRIIik7IC8vJE5PTi1OTFMtMSQKLQkJVVNFX0RFRkFVTFRTID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VfREVGQVVMVFMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydCBMQVVOQ0hfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBERUJVR19DTUQgIT0gbnVsbDsKLQkJYXNzZXJ0IERJU0NPVkVSX0NNRCAhPSBudWxsOwotCQlhc3NlcnQgUEVSSU9ESUNfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBQQVRIICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIHJlYWQoUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBCdW5kbGUgYnVuZGxlKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW07Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlpblN0cmVhbSA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oYnVuZGxlLCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBmYWxzZSk7Ci0JCQlwcm9wZXJ0aWVzLmxvYWQoaW5TdHJlYW0pOwotCi0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgTVBJQ0gyUGx1Z2luLmNvcmVFcnJvckV4Y2VwdGlvbihNZXNzYWdlcy5NUElDSDJEZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGUsIGUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkRlZmF1bHRzX01pc3NpbmdWYWx1ZSwga2V5KSkpOwotCQl9Ci0JCQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZWdlcihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5NUElDSDJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXIsIGtleSkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCBrZXkpOwotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkpvYkF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkpvYkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxMTBkZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJKb2JBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIE5vZGUgYXR0cmlidXRlcy4KLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkpvYkF0dHJpYnV0ZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9JRF9BVFRSX0lEID0gIk1QSUNIMl9qb2JpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVE5BTUVfQVRUUl9JRCA9ICJNUElDSDJfaG9zdG5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYklkQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEpPQl9JRF9BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGhvc3RuYW1lQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEhPU1ROQU1FX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX3RpdGxlLCAKLQkJCQlNZXNzYWdlcy5NUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0Sm9iSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gam9iSWRBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRIb3N0bmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBob3N0bmFtZUF0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXtqb2JJZEF0dHJEZWYsIGhvc3RuYW1lQXR0ckRlZn07Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzMGRhMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJMYXVuY2hBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBPTVBJLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJMYXVuY2hBdHRyaWJ1dGVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0FSR1NfQVRUUl9JRCA9ICJNUElDSDJfYXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX0tFWVNfQVRUUl9JRCA9ICJNUElDSDJfZW52S2V5cyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX0FSR1NfQVRUUl9JRCA9ICJNUElDSDJfZW52IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBsYXVuY2hBcmdzQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKExBVU5DSF9BUkdTX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbiwgZmFsc2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZW52aXJvbm1lbnRLZXlBdHRyRGVmID0gbmV3IEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+KAotCQkJRU5WX0tFWVNfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfdGl0bGUsCi0JCQlNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50S2V5QXR0ckRlZl9kZXNjcmlwdGlvbiwgZmFsc2UsCi0JCQluZXcgU3RyaW5nWzBdKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZW52aXJvbm1lbnRBcmdzQXR0ckRlZiA9IG5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKAotCQkJRU5WX0FSR1NfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX3RpdGxlLCBNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfZGVzY3JpcHRpb24sIGZhbHNlLAotCSIke01QSUNIMl9lbnZLZXlzOjogLXggOjoteCA6fSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMaXN0IG9mIG5hbWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZ2V0RW52aXJvbm1lbnRLZXlzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVudmlyb25tZW50S2V5QXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgYXMgZXhwZWN0ZWQgYnkgb3Blbm1waSBjb21tYW5kIGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldEVudmlyb25tZW50QXJnc0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlbnZpcm9ubWVudEFyZ3NBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIEFyZ3VtZW50cyBmb3IgdGhlIGFwcGxpY2F0aW9uLCBhcyBleHBlY3RlZCBieSBvcGVubXBpIGNvbW1hbmQgbGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0TGF1bmNoQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGxhdW5jaEFyZ3NBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117Ci0JCQkJbGF1bmNoQXJnc0F0dHJEZWYsZW52aXJvbm1lbnRBcmdzQXR0ckRlZixlbnZpcm9ubWVudEtleUF0dHJEZWYKLQkJfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OGI1MWIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0KLS8qKgotICogTm9kZSBhdHRyaWJ1dGVzCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfTUVTU0FHRSA9ICJNUElDSDJfc3RhdHVzTWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gc3RhdHVzTWVzc2FnZUF0dHJEZWYgPQotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihTVEFUVVNfTUVTU0FHRSwgTWVzc2FnZXMuTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RhdHVzIG1lc3NhZ2UgaWYgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNjb3ZlciB0aGUgbWFjaGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBzdGF0dXNNZXNzYWdlQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltde3N0YXR1c01lc3NhZ2VBdHRyRGVmfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMk5vZGVBdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJOb2RlQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxYjk2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMk5vZGVBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5Cb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBOb2RlIGF0dHJpYnV0ZXMKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyTm9kZUF0dHJpYnV0ZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTV9OT0RFU19JRCA9ICJNUElDSDJfbnVtTm9kZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9OVU1fTk9ERVNfSUQgPSAiTVBJQ0gyX21heE51bU5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfTUVTU0FHRSA9ICJNUElDSDJfc3RhdHVzTWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlNVQlNDUklCRUQgPSAiTVBJQ0gyX292ZXJzdWJzY3JpYmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtTm9kZXNBdHRyRGVmID0KLQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKE5VTV9OT0RFU19JRCwgTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMk5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbmV3IEludGVnZXIoMCkpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbWF4TnVtTm9kZXNBdHRyRGVmID0KLQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKE1BWF9OVU1fTk9ERVNfSUQsIE1lc3NhZ2VzLk1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG5ldyBJbnRlZ2VyKDApKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gc3RhdHVzTWVzc2FnZUF0dHJEZWYgPQotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihTVEFUVVNfTUVTU0FHRSwgTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24gb3ZlcnN1YnNjcmliZWRBdHRyRGVmID0KLQkJbmV3IEJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uKE9WRVJTVUJTQ1JJQkVELCBNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfb3ZlcnN1YnNjcmliZWRBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCi0JLyoqCi0JICogTnVtYmVyIG9mIHNsb3RzIHN1Z2dlc3RlZCBvbiB0aGUgbm9kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE51bWJlck9mTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gbnVtTm9kZXNBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIE1heGltYWwgbnVtYmVyIG9mIHNsb3RzIG9uIHRoZSBub2RlLiBaZXJvIGlmIG5vdCBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRNYXhpbWFsTnVtYmVyT2ZOb2Rlc0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBtYXhOdW1Ob2Rlc0F0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogU3RhdHVzIG1lc3NhZ2UgaWYgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNjb3ZlciB0aGUgbm9kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBzdGF0dXNNZXNzYWdlQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBJZiBub2RlIGlzIG92ZXJzdWJzY3JpYmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24gZ2V0T3ZlcnN1YnNjcmliZWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gb3ZlcnN1YnNjcmliZWRBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117bnVtTm9kZXNBdHRyRGVmLG1heE51bU5vZGVzQXR0ckRlZixzdGF0dXNNZXNzYWdlQXR0ckRlZn07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyUGx1Z2luLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkNzRiMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5Ub29sc1JNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIE1QSUNIMlBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTVBJQ0gyUGx1Z2luKCkgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJTVBJQ0gyRGVmYXVsdHMubG9hZERlZmF1bHRzKCk7Ci0JCU1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLmluaXRpYWxpemVQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTVBJQ0gyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmFpc2UgY29yZSBleGNlcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGNvcmVFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb29sc1JNUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGNvcmVFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIG1lc3NhZ2UsIHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYW4gSVN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGEgVGhyb3dhYmxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuTVBJQ0gyUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yLCBlKSk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSB1bmlxdWUgaWRlbnRpZmllcgotCSAqIAotCSAqIEByZXR1cm4gdW5pcXVlIGlkZW50aWZpZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlSWRlbnRpZmllcigpIHsKLQkJaWYgKGdldERlZmF1bHQoKSA9PSBudWxsKQotCQkJLy8gSWYgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IHlldCBpbml0aWFsaXplZCwKLQkJCS8vIHJldHVybiBhIHN0YXRpYyBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgbXVzdAotCQkJLy8gbWF0Y2ggdGhlIHBsdWdpbiBpZCBkZWZpbmVkIGluIHBsdWdpbi54bWwKLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOGRkYjMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlcjsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJtcGljaDItIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIE1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlNUElDSDJQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gTVBJQ0gyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX0xBVU5DSF9DTUQsIE1QSUNIMkRlZmF1bHRzLkxBVU5DSF9DTUQpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX0RFQlVHX0NNRCwgTVBJQ0gyRGVmYXVsdHMuREVCVUdfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19ESVNDT1ZFUl9DTUQsIE1QSUNIMkRlZmF1bHRzLkRJU0NPVkVSX0NNRCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9DTUQsIE1QSUNIMkRlZmF1bHRzLlBFUklPRElDX0NNRCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9USU1FLCBNUElDSDJEZWZhdWx0cy5QRVJJT0RJQ19USU1FKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19SRU1PVEVfSU5TVEFMTF9QQVRILCBNUElDSDJEZWZhdWx0cy5QQVRIKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmNmJmZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRlZmF1bHRzX01pc3NpbmdWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyUHJvZ0FyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gySm9iQXR0cmlidXRlc192cGlkUmFuZ2VBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFN0YXJ0QXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRBcmdzQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50S2V5QXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50S2V5QXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2xhdW5jaEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbWF4TnVtTm9kZXNBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5X1Jlc291cmNlTWFuYWdlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9kZWZhdWx0UXVldWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZFBhcnNlSG9zdEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZFJlYWRIb3N0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVOb3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVQYXRoTm90QWJzb2x1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZE1pc3NpbmdIb3N0RmlsZVBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RGaWxlRXJyb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0RmlsZVBhcnNlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkUGFyc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFBhcnNlT3V0cHV0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRXaXRoQ29kZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSWdub3JlZEludmFsaWRQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0ludmFsaWRNYXhTbG90c1BhcmFtZXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSW52YWxpZFNsb3RzUGFyYW1ldGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9wcm9jZXNzRXJyb3JNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk1vbml0b3JKb2JfaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTW9uaXRvckpvYl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk1vbml0b3JKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNb25pdG9ySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fQ29tbWFuZEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNb25pdG9ySm9iX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0ludmFsaWRMaW5lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdEaXNwbGF5TWFwSW5mb3JtYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fQXR0cmlidXRlTm90SW50ZWdlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdBdHRyaWJ1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9Vbmtub3duQXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkVsZW1lbnQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUnVudGltZVN5c3RlbV9Kb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0ZhaWxlZFBhcnNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0hvc3RuYW1lc0RvTm90TWF0Y2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9Qcm9jZXNzTmFtZTsKLQkKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODkwODQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLU1QSUNIMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZT1GYWlsZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBkZWZhdWx0IHByZWZlcmVuY2VzLgotTVBJQ0gyRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyPUZhaWxlZCB0byBwYXJzZSBpbnRlZ2VyIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotTVBJQ0gyRGVmYXVsdHNfTWlzc2luZ1ZhbHVlPU1pc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDIxM0RlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZT1GYWlsZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBkZWZhdWx0IHByZWZlcmVuY2VzLgotTVBJQ0gyMTNEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI9RmFpbGVkIHRvIHBhcnNlIGludGVnZXIgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDIxM0RlZmF1bHRzX01pc3NpbmdWYWx1ZT1NaXNzaW5nIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMkVudkF0dHJEZWZfZGVzY3JpcHRpb249RWZmZWN0aXZlIGVudmlyb25tZW50IHN1cHBsaWVkIGJ5IE1QSUNIMiB0byBleGVjdXRhYmxlIG9uIGxhdW5jaAotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMkVudkF0dHJEZWZfdGl0bGU9RW52aXJvbm1lbnQgZm9yIE1QSUNIMiBwcm9jZXNzZXMKLU1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWZfZGVzY3JpcHRpb249RWZmZWN0aXZlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYnkgTVBJQ0gyIHN1cHBsaWVkIHRvIGV4ZWN1dGFibGUKLU1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWZfdGl0bGU9UHJvZ3JhbSBBcmd1bWVudHMgZm9yIE1QSUNIMiBwcm9jZXNzZXMKLU1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgTVBJQ0gyIGxhdW5jaGVkIHRoZSBwcm9jZXNzZXMKLU1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZl90aXRsZT1Xb3JraW5nIERpcmVjdG9yeSBmb3IgTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gySm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIGpvYiBob3N0bmFtZQotTVBJQ0gySm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfdGl0bGU9TVBJQ0gyIGhvc3RuYW1lCi1NUElDSDJKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgbWFwcGluZyBtb2RlCi1NUElDSDJKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl90aXRsZT1NUElDSDIgbWFwcGluZyBtb2RlCi1NUElDSDJKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgam9iIGlkCi1NUElDSDJKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl90aXRsZT1NUElDSDIgam9iIGlkCi1NUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIHZwaWQgcmFuZ2UKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl90aXRsZT1NUElDSDIgdnBpZCByYW5nZQotTVBJQ0gySm9iQXR0cmlidXRlc192cGlkU3RhcnRBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiB2cGlkIHN0YXJ0Ci1NUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfdGl0bGU9TVBJQ0gyIHZwaWQgc3RhcnQKLU1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1Db21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGVhY2ggTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX3RpdGxlPU1QSUNIMiBFbnZpcm9ubWVudCBhcmd1bWVudHMKLU1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX2Rlc2NyaXB0aW9uPU5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHN1cHBsaWVkIHRvIHRoZSBlYWNoIE1QSUNIMiBwcm9jZXNzZXMKLU1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX3RpdGxlPU1QSUNIMiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLU1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfZGVzY3JpcHRpb249Q29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgTVBJQ0gyCi1NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2xhdW5jaEFyZ3NBdHRyRGVmX3RpdGxlPU1QSUNIMiBhcmd1bWVudHMKLU1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBzdGF0dXMgbWVzc2FnZQotTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGU9TVBJQ0gyIHN0YXR1cyBtZXNzYWdlCi1NUElDSDJOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIG1heGltYWwgbnVtYmVyIG9mIG5vZGVzIG9uIHRoZSBob3N0Ci1NUElDSDJOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIG1heGltYWwgbnVtYmVyIG9mIG5vZGVzCi1NUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIG51bWJlciBvZiBub2RlcyBvbiB0aGUgaG9zdAotTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX3RpdGxlPU1QSUNIMiBudW1iZXIgb2Ygbm9kZXMKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgb3ZlcnN1YnNjcmliZWQgbm9kZSAobW9yZSBwcm9jZXNzZXMgdGhhbiBhdmFpbGFibGUpCi1NUElDSDJOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfdGl0bGU9TVBJQ0gyIG92ZXJzdWJzY3JpYmVkCi1NUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgc3RhdHVzIG1lc3NhZ2UKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX3RpdGxlPU1QSUNIMiBzdGF0dXMgbWVzc2FnZQotTVBJQ0gyUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yCi0KLU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdERlc2NyaXB0aW9uPU1QSUNIMiBSZXNvdXJjZSBNYW5hZ2VyCi1NUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHROYW1lPU1QSUNIMgotTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeV9SZXNvdXJjZU1hbmFnZXJOYW1lPU1QSUNIMiAobmV3KQotCi1NUElDSDJEaXNjb3ZlckpvYl9kZWZhdWx0UXVldWVOYW1lPWRlZmF1bHQKLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWQ9RXJyb3Igd2hpbGUgcnVubmluZyBkaXNjb3ZlciBjb21tYW5kOiB7MH0uCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkUGFyc2VIb3N0RmlsZT1GYWlsZWQgdG8gcGFyc2UgaG9zdGZpbGUgKHswfSkuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkUmVhZEhvc3RGaWxlPUZhaWxlZCByZWFkIGhvc3RmaWxlICh7MH0pLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlRW1wdHk9RW1wdHkgaG9zdGZpbGUgaXMgbm90IGFsbG93ZWQgKHswfSkuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVOb3RGb3VuZD1GYWlsZWQgZmluZCBob3N0ZmlsZSAoezB9KS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZVBhdGhOb3RBYnNvbHV0ZT1EaXNjb3ZlciBjb21tYW5kIGluZm9ybWVkIGEgcGF0aCB0byBob3N0ZmlsZSB0aGF0IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoICh7MH0pLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEludGVybmFsRXJyb3I9SW50ZXJuYWwgZXJyb3Igd2hpbGUgcnVubmluZyBkaXNjb3ZlciBjb21tYW5kOiB7MH0KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRNaXNzaW5nSG9zdEZpbGVQYXRoPURpc2NvdmVyIGNvbW1hbmQgZGlkIG5vdCBpbmZvcm0gcGF0aCB0byBkZWZhdWx0IGhvc3RmaWxlLiBJZiBuZWNlc3NhcnksIHNldCBNQ0EgcGFyYW1ldGVycyB0byBkZWZpbmUgZGVmYXVsdCBob3N0ZmlsZSBwYXRoLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RGaWxlRXJyb3JzPVRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIGhvc3RmaWxlLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RGaWxlUGFyc2VFcnJvcj1QYXJzZSBlcnJvcihzKSBpbiBob3N0ZmlsZS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWQ9RmFpbGVkIHRvIHJ1biBjb21tYW5kIHRvIGdldCBob3N0bmFtZS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZT1GYWlsZWQgdG8gcGFyc2UgY29tbWFuZCBmb3IgaG9zdG5hbWUuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkUGFyc2VPdXRwdXQ9RmFpbGVkIHRvIHBhcnNlIG91dHB1dCBvZiBkaXNjb3ZlciBjb21tYW5kLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFdpdGhDb2RlPUNvbW1hbmQgdG8gZ2V0IGhvc3RuYW1lIGZhaWxlZCB3aXRoIGV4aXQgY29kZSB7MH0KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9JZ25vcmVkSW52YWxpZFBhcmFtZXRlcj1JbnZhbGlkIHBhcmFtZXRlciB3YXMgaWdub3JlZCBmb3IgdGhpcyBob3N0LgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0ludmFsaWRNYXhTbG90c1BhcmFtZXRlcj1JbnZhbGlkICdtYXgtc2xvdHMnIHBhcmFtZXRlciB3YXMgaWdub3JlZCBmb3IgdGhpcyBob3N0LgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0ludmFsaWRTbG90c1BhcmFtZXRlcj1JbnZhbGlkICdzbG90cy9jcHVzL2NvdW50JyBwYXJhbWV0ZXIgd2FzIGlnbm9yZWQgZm9yIHRoaXMgaG9zdC4KLU1QSUNIMkRpc2NvdmVySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlPUludGVycnVwdGVkIHdoaWxlIHJ1bm5pbmcgTVBJQ0gyIGRpc2NvdmVyIGNvbW1hbmQuCi1NUElDSDJEaXNjb3ZlckpvYl9uYW1lPURpc2NvdmVyIE1QSUNIMiBvbiB7MH0KLU1QSUNIMkRpc2NvdmVySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIHBhcnNlIG91dHB1dCBvZiBNUElDSDIgZGlzY292ZXIgY29tbWFuZC4KLU1QSUNIMkRpc2NvdmVySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgcHJvY2VzcyBmb3IgTVBJQ0gyIGRpc2NvdmVyIGNvbW1hbmQuCi0KLU1QSUNIMlByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0ludmFsaWRMaW5lPUludmFsaWQgb3V0cHV0IGZyb20gTVBJQ0gyOiB7MH0KLU1QSUNIMlByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdEaXNwbGF5TWFwSW5mb3JtYXRpb249T3V0cHV0IGZyb20gTVBJQ0gyIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCBwcm9jZXNzZXMgYW5kIG5vZGVzLgotTVBJQ0gyUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uPUluY29tcGxldGUgb3V0cHV0IGZyb20gTVBJQ0gyLgotCi1NUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX0F0dHJpYnV0ZU5vdEludGVnZXI9QXR0cmlidXRlIHswfSBpcyBub3QgYW4gdmFsaWQgaW50ZWdlciAoezF9KQotTVBJQ0gyUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9NaXNzaW5nQXR0cmlidXRlPU1pc3NpbmcgWE1MIGF0dHJpYnV0ZTogezB9Ci1NUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX1Vua25vd25BdHRyaWJ1dGU9VW5rbm93biBYTUwgYXR0cmlidXRlOiB7MH0KLU1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkVsZW1lbnQ9VW5rbm93biBYTUwgZWxlbWVudDogezB9Ci0KLU1QSUNIMlJ1bnRpbWVTeXN0ZW1fSm9iTmFtZT1NUElDSDIgSm9iCi1NUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9GYWlsZWRQYXJzZT1GYWlsZWQgdG8gcGFyc2UgTVBJQ0gyIHJ1biBjb21tYW5kIG91dHB1dC4KLU1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0hvc3RuYW1lc0RvTm90TWF0Y2g9SG9zdG5hbWVzIGZyb20gTVBJQ0gyIG91dHB1dCBkbyBub3QgbWF0Y2ggZXhwZWN0ZWQgaG9zdG5hbWUuCi1NUElDSDJSdW50aW1lU3lzdGVtSm9iX1Byb2Nlc3NOYW1lPU1QSUNIMiBydW4KLQotTVBJQ0gyTW9uaXRvckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZT1JbnRlcnJ1cHRlZCB3aGlsZSBydW5uaW5nIE1QSUNIMiBtb25pdG9yIGNvbW1hbmQuCi1NUElDSDJNb25pdG9ySm9iX25hbWU9TW9uaXRvciBNUElDSDIgb24gezB9Ci1NUElDSDJNb25pdG9ySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIHBhcnNlIG91dHB1dCBvZiBNUElDSDIgbW9uaXRvciBjb21tYW5kLgotTVBJQ0gyTW9uaXRvckpvYl9wcm9jZXNzRXJyb3JNZXNzYWdlPUZhaWxlZCB0byBjcmVhdGUgcmVtb3RlIHByb2Nlc3MgZm9yIE1QSUNIMiBtb25pdG9yIGNvbW1hbmQuCi1NUElDSDJNb25pdG9ySm9iX0V4Y2VwdGlvbl9Db21tYW5kRmFpbGVkPUVycm9yIHdoaWxlIHJ1bm5pbmcgY29tbWFuZDogezB9LgotTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvciB3aGlsZSBydW5uaW5nIGNvbW1hbmQ6IHswfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjdlYThmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGV4dGVuZHMKLUFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiB7Ci0KLQlwdWJsaWMgRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbigKLQkJCUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24pOwotCQlNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIE1QSUNIMmNvbmZpZ3VyYXRpb24gPSAoTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiljb25maWd1cmF0aW9uOwotCQlTdHJpbmcgbGF1bmNoQ21kID0gbnVsbDsKLQkJU3RyaW5nIGRlYnVnQ21kID0gbnVsbDsKLQkJU3RyaW5nIGRpc2NvdmVyQ21kID0gbnVsbDsKLQkJU3RyaW5nIHBlcmlvZGljQ21kID0gbnVsbDsKLQkJaW50IHBlcmlvZGljVGltZSA9IDA7Ci0JCVN0cmluZyByZW1vdGVJbnN0YWxsUGF0aCA9IG51bGw7Ci0JCWlmIChNUElDSDJjb25maWd1cmF0aW9uLnVzZVRvb2xEZWZhdWx0cygpKSB7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JCQlsYXVuY2hDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfTEFVTkNIX0NNRCk7Ci0JCQlkZWJ1Z0NtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpOwotCQkJZGlzY292ZXJDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfRElTQ09WRVJfQ01EKTsKLQkJCXBlcmlvZGljQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfQ01EKTsKLQkJCXBlcmlvZGljVGltZSA9IHByZWZlcmVuY2VzLmdldEludChNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUpOwotCQl9IGVsc2UgewotCQkJbGF1bmNoQ21kID0gTVBJQ0gyY29uZmlndXJhdGlvbi5nZXRMYXVuY2hDbWQoKTsKLQkJCWRlYnVnQ21kID0gTVBJQ0gyY29uZmlndXJhdGlvbi5nZXREZWJ1Z0NtZCgpOwotCQkJZGlzY292ZXJDbWQgPSBNUElDSDJjb25maWd1cmF0aW9uLmdldERpc2NvdmVyQ21kKCk7Ci0JCQlwZXJpb2RpY0NtZCA9IE1QSUNIMmNvbmZpZ3VyYXRpb24uZ2V0UGVyaW9kaWNNb25pdG9yQ21kKCk7Ci0JCQlwZXJpb2RpY1RpbWUgPSBNUElDSDJjb25maWd1cmF0aW9uLmdldFBlcmlvZGljTW9uaXRvclRpbWUoKTsKLQkJfQotCQlyZW1vdGVJbnN0YWxsUGF0aCA9IE1QSUNIMmNvbmZpZ3VyYXRpb24uZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKTsKLQkJYXBwbHlWYWx1ZXMobGF1bmNoQ21kLCBkZWJ1Z0NtZCwgZGlzY292ZXJDbWQsIHBlcmlvZGljQ21kLCBwZXJpb2RpY1RpbWUsIG51bGwsIHJlbW90ZUluc3RhbGxQYXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkNDU5ZTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW07Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLkFic3RyYWN0VG9vbHNBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLkFic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtLk1QSUNIMlJ1bnRpbWVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJlc291cmNlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlciB7Ci0KLQlwcml2YXRlIEludGVnZXIgTVBJQ0gyX1JNSUQ7Ci0JcHJpdmF0ZSBNUElDSDJSdW50aW1lU3lzdGVtIHJ0cyA9IG51bGw7Ci0KLQlwdWJsaWMgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyKEludGVnZXIgaWQsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlLCBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoaWQudG9TdHJpbmcoKSwgdW5pdmVyc2UsIGNvbmZpZyk7Ci0JCU1QSUNIMl9STUlEID0gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlUnVudGltZVN5c3RlbSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElSdW50aW1lU3lzdGVtIGRvQ3JlYXRlUnVudGltZVN5c3RlbSgpIHsKLQkJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOwotCQlBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBhdHRyRGVmTWdyID0gZ2V0QXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIoKTsKLQkJYXR0ckRlZk1nci5zZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhBYnN0cmFjdFRvb2xzQXR0cmlidXRlcy5nZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSk7Ci0JCXJ0cyA9IG5ldyBNUElDSDJSdW50aW1lU3lzdGVtKE1QSUNIMl9STUlELCBjb25maWcsIGF0dHJEZWZNZ3IpOwotCQlyZXR1cm4gcnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjU1NzBhZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9NUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcwotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IE1QSUNIMl9DQVBBQklMSVRJRVMgPSBDQVBfTEFVTkNIIHwgQ0FQX0RJU0NPVkVSIHwgQ0FQX1BFUklPRElDX01PTklUT1IgfCBDQVBfUkVNT1RFX0lOU1RBTExfUEFUSDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkVSU0lPTl9JRCA9ICJ2ZXJzaW9uSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdGF0aWMgY2xhc3MgdG8gaG9sZCBvcGVubXBpIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLQkgKgotCSAqIEBhdXRob3IgZGZmZXJiZXIKLQkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIE1QSUNIMkNvbmZpZyB7Ci0KLQkJcHJpdmF0ZSBUb29sc0NvbmZpZyB0b29sc0NvbmZpZzsKLQkJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbklkOwotCi0JCXB1YmxpYyBNUElDSDJDb25maWcoKSB7Ci0JCQl0aGlzKG5ldyBUb29sc0NvbmZpZygpLCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBNUElDSDJDb25maWcoVG9vbHNDb25maWcgdG9vbHNDb25maWcsIFN0cmluZyB2ZXJzaW9uSWQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRvb2xzQ29uZmlnID0gdG9vbHNDb25maWc7Ci0JCQl0aGlzLnZlcnNpb25JZCA9IHZlcnNpb25JZDsKLQkJfQotCi0JCXB1YmxpYyBUb29sc0NvbmZpZyBnZXRUb29sc0NvbmZpZygpIHsKLQkJCXJldHVybiB0b29sc0NvbmZpZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRvb2xzQ29uZmlnKFRvb2xzQ29uZmlnIHRvb2xzQ29uZmlnKSB7Ci0JCQl0aGlzLnRvb2xzQ29uZmlnID0gdG9vbHNDb25maWc7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25JZCgpIHsKLQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZCkgewotCQkJdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uSWQ7Ci0KLQlwdWJsaWMgc3RhdGljIE1QSUNIMkNvbmZpZyBsb2FkT3Blbk1waUNvbmZpZyhJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LAotCQkJSU1lbWVudG8gbWVtZW50bykgewotCQlUb29sc0NvbmZpZyB0b29sc0NvbmZpZyA9IGxvYWRUb29sKGZhY3RvcnksIG1lbWVudG8pOwotCi0JCVN0cmluZyB2ZXJzaW9uSWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfVkVSU0lPTl9JRCk7Ci0KLQkJTVBJQ0gyQ29uZmlnIGNvbmZpZyA9IG5ldyBNUElDSDJDb25maWcodG9vbHNDb25maWcsIHZlcnNpb25JZCk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWQoCi0JCQlNUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnksIElNZW1lbnRvIG1lbWVudG8pIHsKLQkJTVBJQ0gyQ29uZmlnIG1waWNoMkNvbmZpZyA9IGxvYWRPcGVuTXBpQ29uZmlnKGZhY3RvcnksIG1lbWVudG8pOwotCQlNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKGZhY3RvcnksIG1waWNoMkNvbmZpZyk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIE1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKE1QSUNIMl9DQVBBQklMSVRJRVMsIG5ldyBUb29sc0NvbmZpZygpLCBmYWN0b3J5KTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JCXNldExhdW5jaENtZChwcmVmcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfTEFVTkNIX0NNRCkpOwotCQlzZXREZWJ1Z0NtZChwcmVmcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKSk7Ci0JCXNldERpc2NvdmVyQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpKTsKLQkJc2V0UGVyaW9kaWNNb25pdG9yQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX0NNRCkpOwotCQlzZXRQZXJpb2RpY01vbml0b3JUaW1lKHByZWZzLmdldEludChNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUpKTsKLQkJc2V0UmVtb3RlSW5zdGFsbFBhdGgocHJlZnMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgpKTsKLQkJLy8JCXNldFVzZVRvb2xEZWZhdWx0cyhwcmVmcy5nZXRCb29sZWFuKE1QSUNIMjEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19VU0VfREVGQVVMVFMpKTsKLQl9Ci0KLQlwdWJsaWMgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihNUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnksCi0JCQlNUElDSDJDb25maWcgY29uZmlnKSB7Ci0JCXN1cGVyKE1QSUNIMl9DQVBBQklMSVRJRVMsIGNvbmZpZy5nZXRUb29sc0NvbmZpZygpLCBmYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlDb21tb25Db25maWcgY29tbW9uQ29uZiA9IG5ldyBDb21tb25Db25maWcoZ2V0TmFtZSgpLAotCQkJCWdldERlc2NyaXB0aW9uKCksIGdldFVuaXF1ZU5hbWUoKSk7Ci0JCVJlbW90ZUNvbmZpZyByZW1vdGVDb25mID0gbmV3IFJlbW90ZUNvbmZpZyhjb21tb25Db25mLAotCQkJCWdldFJlbW90ZVNlcnZpY2VzSWQoKSwgZ2V0Q29ubmVjdGlvbk5hbWUoKSwKLQkJCQlnZXRQcm94eVNlcnZlclBhdGgoKSwgZ2V0TG9jYWxBZGRyZXNzKCksCi0JCQkJZ2V0SW52b2NhdGlvbk9wdGlvbnNTdHIoKSwgZ2V0T3B0aW9ucygpKTsKLQkJVG9vbHNDb25maWcgdG9vbHNDb25maWcgPSBuZXcgVG9vbHNDb25maWcoCi0JCQkJcmVtb3RlQ29uZiwKLQkJCQlnZXRMYXVuY2hDbWQoKSwKLQkJCQlnZXREZWJ1Z0NtZCgpLAotCQkJCWdldERpc2NvdmVyQ21kKCksCi0JCQkJZ2V0UGVyaW9kaWNNb25pdG9yQ21kKCksCi0JCQkJZ2V0UGVyaW9kaWNNb25pdG9yVGltZSgpLAotCQkJCWdldENvbnRpbnVvdXNNb25pdG9yQ21kKCksCi0JCQkJZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKSwKLQkJCQl1c2VUb29sRGVmYXVsdHMoKSk7Ci0JCU1QSUNIMkNvbmZpZyBvcGVuTXBpQ29uZmlnID0gbmV3IE1QSUNIMkNvbmZpZyh0b29sc0NvbmZpZywgZ2V0VmVyc2lvbklkKCkpOwotCi0JCXJldHVybiBuZXcgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbigKLQkJCQkoTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSkgZ2V0RmFjdG9yeSgpLCBvcGVuTXBpQ29uZmlnKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIuc2F2ZShtZW1lbnRvKTsKLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX1ZFUlNJT05fSUQsIHZlcnNpb25JZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVBbmREZXNjKCkgewotCQlTdHJpbmcgbmFtZSA9IE1lc3NhZ2VzLk1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdE5hbWU7Ci0JCVN0cmluZyBjb25uID0gZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKGNvbm4gIT0gbnVsbCAmJiAhY29ubi5lcXVhbHMoRU1QVFlfU1RSSU5HKSkgewotCQkJbmFtZSArPSAiQCIgKyBjb25uOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0TmFtZShuYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0RGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gdmVyc2lvbklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JZChTdHJpbmcgdmVyc2lvbklkKSB7Ci0JCXRoaXMudmVyc2lvbklkID0gdmVyc2lvbklkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM3Yjk1Yi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9NUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUmVzb3VyY2VNYW5hZ2VyQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJLy8gUVVFU1RJT046IFdvdWxkbnQgaXQgYmUgYmV0dGVyIHRvIHRha2UgbmFtZSBmcm9tIGV4dGVuc2lvbiBwb2ludD8KLQkJLy8gRXh0ZW5zaW9uIHBvaW50IGFscmVhZHkgaGFzIGEgbmFtZS4KLQkJc3VwZXIoTWVzc2FnZXMuTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeV9SZXNvdXJjZU1hbmFnZXJOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29weUNvbmZpZ3VyYXRpb24oCi0JCQlJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXJldHVybiAoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pY29uZmlndXJhdGlvbi5jbG9uZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyQ29udHJvbCBjcmVhdGUoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZkluKSB7Ci0JCU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mSW47Ci0JCVBUUENvcmVQbHVnaW4gcGx1Z2luID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCUlQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlID0gKElQVW5pdmVyc2VDb250cm9sKSBwbHVnaW4uZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBNUElDSDJSZXNvdXJjZU1hbmFnZXIodW5pdmVyc2UuZ2V0TmV4dFJlc291cmNlTWFuYWdlcklkKCksIHVuaXZlcnNlLCBjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpIHsKLQkJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IE1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24odGhpcyk7Ci0KLQkJcmV0dXJuIGNvbmY7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWRDb25maWd1cmF0aW9uKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmV0dXJuIE1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24ubG9hZCh0aGlzLCBtZW1lbnRvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkRpc2NvdmVySm9iLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJEaXNjb3ZlckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdjNDA5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkRpc2NvdmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJOb2RlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkRpc2NvdmVySm9iIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iIHsKLQlNUElDSDJSdW50aW1lU3lzdGVtIHJ0czsKLQotCXB1YmxpYyBNUElDSDJEaXNjb3ZlckpvYihNUElDSDJSdW50aW1lU3lzdGVtIHJ0cykgewotCQlzdXBlcihydHMsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfbmFtZSwgcnRzLmdldFJtQ29uZmlndXJhdGlvbigpLmdldE5hbWUoKSksCi0JCQkJcnRzLnJldHJpZXZlRWZmZWN0aXZlVG9vbFJtQ29uZmlndXJhdGlvbigpLmdldERpc2NvdmVyQ21kKCksCi0JCQkJTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2UsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9wYXJzaW5nRXJyb3JNZXNzYWdlKTsKLQkJdGhpcy5ydHMgPSBydHM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoQnVmZmVyZWRSZWFkZXIgb3V0cHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIE1QSSByZXNvdXJjZSBtYW5hZ2VyIGhhdmUgb25seSBvbmUgbWFjaGluZSBhbmQgb25lIHF1ZXVlLgotCQkgKiBUaGVyZSB0aGV5IGFyZSBpbXBsaWNpdGx5ICJkaXNjb3ZlcmVkIi4KLQkJICovCi0JCUlSZXNvdXJjZU1hbmFnZXIgcm0gPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydHMuZ2V0Um1JRCgpKTsKLQkJU3RyaW5nIG1hY2hpbmVJRCA9IHJ0cy5jcmVhdGVNYWNoaW5lKHJtLmdldE5hbWUoKSk7Ci0JCXJ0cy5zZXRNYWNoaW5lSUQobWFjaGluZUlEKTsKLQkJU3RyaW5nIHF1ZXVlSUQgPSBydHMuY3JlYXRlUXVldWUoTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfZGVmYXVsdFF1ZXVlTmFtZSk7Ci0JCXJ0cy5zZXRRdWV1ZUlEKHF1ZXVlSUQpOwotCi0JCUlQTWFjaGluZSBtYWNoaW5lID0gcm0uZ2V0TWFjaGluZUJ5SWQobWFjaGluZUlEKTsKLQkJYXNzZXJ0IG1hY2hpbmUgIT0gbnVsbDsKLQotCQkvKgotCQkgKiBBbnkgZXhjZXB0aW9uIGZyb20gbm93IG9uIGlzIGNhdWdodCBpbiBvcmRlciB0byBhZGQgdGhlIGVycm9yIG1lc3NhZ2UgYXMgYW4gYXR0cmlidXRlIHRvIHRoZSBtYWNoaW5lLgotCQkgKiBUaGVuLCB0aGUgZXhjZXB0aW9uIGlzIHJlLXRocm93bi4KLQkJICovCi0JCXRyeSB7Ci0JCQkvKgotCQkJICogUGFyc2Ugb3V0cHV0IG9mIHRyYWNlIGNvbW1hbmQgdGhhdCBkZXNjcmliZXMgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLgotCQkJICovCi0JCQlNUElDSDJUcmFjZVBhcnNlciBwYXJzZXIgPSBuZXcgTVBJQ0gyVHJhY2VQYXJzZXIoKTsKLQkJCU1QSUNIMkhvc3RNYXAgaG9zdE1hcCA9IHBhcnNlci5wYXJzZShvdXRwdXQpOwotCQkJaWYgKGhvc3RNYXAgPT0gbnVsbCkgewotCQkJCW1hY2hpbmUuYWRkQXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNYWNoaW5lQXR0cmlidXRlcy5TdGF0ZS5FUlJPUikpOwotCQkJCW1hY2hpbmUuYWRkQXR0cmlidXRlKE1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0RmlsZVBhcnNlRXJyb3IpKTsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIHBhcnNlci5nZXRFcnJvck1lc3NhZ2UoKSkpOwotCQkJfQotCi0JCQkvKgotCQkJICogQ3JlYXRlIG1vZGVsIGFjY29yZGluZyB0byBkYXRhIGZyb20gZGlzY292ZXIuCi0JCQkgKi8KLQkJCWludCBub2RlQ291bnRlciA9IDA7Ci0KLQkJCWZvciAoTVBJQ0gySG9zdE1hcC5Ib3N0IGhvc3QgOiBob3N0TWFwLmdldEhvc3RzKCkpIHsKLQotCQkJCS8vIEFkZCBub2RlIHRvIG1vZGVsCi0JCQkJU3RyaW5nIG5vZGVJZCA9IHJ0cy5jcmVhdGVOb2RlKG1hY2hpbmVJRCwgaG9zdC5nZXROYW1lKCksIG5vZGVDb3VudGVyKyspOwotCi0JCQkJLy8gQWRkIHByb2Nlc3NvciBpbmZvcm1hdGlvbiB0byBub2RlLgotCQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJCWlmIChob3N0LmdldE51bVByb2Nlc3NvcnMoKSAhPSAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTVBJQ0gyTm9kZUF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZOb2Rlc0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoaG9zdC5nZXROdW1Qcm9jZXNzb3JzKCkpKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRoaXMgc2l0dWF0aW9uIGlzIG5vdCBwb3NzaWJsZSBzaW5jZSBob3N0LmdldE51bVByb2Nlc3NvcnMoKSBpcyBhbHdheXMgdmFsaWQuCi0JCQkJCQlhc3NlcnQgZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcnRzLmNoYW5nZU5vZGUobm9kZUlkLCBhdHRyTWFuYWdlcik7Ci0JCQkJcnRzLnNldE5vZGVJREZvck5hbWUoaG9zdC5nZXROYW1lKCksIG5vZGVJZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFNob3cgbWVzc2FnZSBvZiBjb3JlIGV4Y2VwdGlvbiBhbmQgY2hhbmdlIG1hY2hpbmUgc3RhdHVzIHRvIGVycm9yLgotCQkJICovCi0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSkpOwotCQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmVJRCwgYXR0ck1hbmFnZXIpOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8qCi0JCQkgKiBTaG93IG1lc3NhZ2Ugb2YgYWxsIG90aGVyIGV4Y2VwdGlvbnMgYW5kIGNoYW5nZSBtYWNoaW5lIHN0YXR1cyB0byBlcnJvci4KLQkJCSAqLwotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEludGVybmFsRXJyb3IsIGUuZ2V0TWVzc2FnZSgpKSkpOwotCQkJcnRzLmNoYW5nZU1hY2hpbmUobWFjaGluZUlELCBhdHRyTWFuYWdlcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJIb3N0TWFwLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJIb3N0TWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGQ2NGMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gySG9zdE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJIb3N0TWFwIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEhvc3QgewotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19FUlJPUlMgPSAwOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJfTlVNX1NMT1RTID0gMSA8PCAxOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJfTUFYX05VTV9TTE9UUyA9IDEgPDwgMjsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJSX1VOS05PV05fQVRUUiA9IDEgPDwgMzsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgYWRkciA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIHBvcnQgPSBudWxsOwotCQlwcml2YXRlIGludCBudW1Qcm9jZXNzb3JzID0gMDsKLQkJcHJpdmF0ZSBpbnQgbWF4TnVtUHJvY2Vzc29ycyA9IDA7Ci0JCXByaXZhdGUgaW50IGVycm9ycyA9IE5PX0VSUk9SUzsKLQotCQlwdWJsaWMgSG9zdChTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgcG9ydCkgewotCQkJdGhpcy5uYW1lID0gaG9zdG5hbWU7Ci0JCQl0aGlzLmFkZHIgPSBhZGRyZXNzOwotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TnVtUHJvY2Vzc29ycygpIHsKLQkJCXJldHVybiBudW1Qcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNYXhOdW1Qcm9jZXNzb3JzKCkgewotCQkJcmV0dXJuIG1heE51bVByb2Nlc3NvcnM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotCQkJcmV0dXJuIGFkZHI7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7Ci0JCQlyZXR1cm4gcG9ydDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RXJyb3JzKCkgewotCQkJcmV0dXJuIGVycm9yczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE51bVByb2Nlc3NvcnMoaW50IG51bVByb2Nlc3NvcnMpIHsKLQkJCXRoaXMubnVtUHJvY2Vzc29ycyA9IG51bVByb2Nlc3NvcnM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNYXhOdW1Qcm9jZXNzb3JzKGludCBtYXhOdW1Qcm9jZXNzb3JzKSB7Ci0JCQl0aGlzLm1heE51bVByb2Nlc3NvcnMgPSBtYXhOdW1Qcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRXJyb3JzKGludCBlcnJvcnMpIHsKLQkJCXRoaXMuZXJyb3JzIHw9IGVycm9yczsKLQkJfQotCX0KLQotCUxpc3Q8SG9zdD4gaG9zdHMgPSBuZXcgQXJyYXlMaXN0PEhvc3Q+KCk7Ci0JTWFwPFN0cmluZywgSG9zdD4gaG9zdE5hbWVUb0hvc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEhvc3Q+KCk7Ci0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIb3N0KEhvc3QgaG9zdCkgewotCQlob3N0cy5hZGQoaG9zdCk7Ci0JCWhvc3ROYW1lVG9Ib3N0LnB1dChob3N0LmdldE5hbWUoKSwgaG9zdCk7Ci0JfQotCi0JcHVibGljIEhvc3RbXSBnZXRIb3N0cygpIHsKLQkJcmV0dXJuIGhvc3RzLnRvQXJyYXkobmV3IEhvc3RbaG9zdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEhvc3Q+IGdldEhvc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIGhvc3RzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBIb3N0IGdldEhvc3RCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGhvc3ROYW1lVG9Ib3N0LmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRIb3N0KFN0cmluZyBuYW1lLCBTdHJpbmcgYWRkcmVzcywgU3RyaW5nIHBvcnQpIHsKLQkJTVBJQ0gySG9zdE1hcC5Ib3N0IGhvc3QgPSBuZXcgTVBJQ0gySG9zdE1hcC5Ib3N0KG5hbWUsIGFkZHJlc3MsIHBvcnQpOwotCQlhZGRIb3N0KGhvc3QpOwotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoKSB7Ci0JCXJldHVybiBob3N0cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUGFyc2VFcnJvcnMoKSB7Ci0JCXJldHVybiBoYXNFcnJvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gySm9iTWFwLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJKb2JNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyZmQ3Ni4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJKb2JNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEdyZWcgV2F0c29uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gySm9iTWFwIHsKLQotCS8qKgotCSAqIEFuIE1QSUNIMiBqb2IuCi0JICovCi0JcHVibGljIGNsYXNzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0JJRCA9IDEgPDwgMDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpPQkFMSUFTID0gMSA8PCAxOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVNFUk5BTUUgPSAxIDw8IDI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIT1NUID0gMSA8PCAzOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElEID0gMSA8PCA0OwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0lEID0gMSA8PCA1OwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFOSyA9IDEgPDwgNjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBHTSA9IDEgPDwgNzsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIGpvYklEID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgam9iQWxpYXMgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3QgPSBudWxsOwotCQlwcml2YXRlIGludCBwaWQgPSAwOwotCQlwcml2YXRlIGludCBzaWQgPSAwOwotCQlwcml2YXRlIGludCByYW5rID0gMDsKLQkJcHJpdmF0ZSBTdHJpbmcgcGdtID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgY29tcGxldGU7Ci0KLQkJcHVibGljIEpvYigpIHsKLQkJCXRoaXMuY29tcGxldGUgPSAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgaG9zdAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotCQkJcmV0dXJuIGhvc3Q7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBqb2JJRAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRKb2JJRCgpIHsKLQkJCXJldHVybiBqb2JJRDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGpvYkFsaWFzCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEpvYkFsaWFzKCkgewotCQkJcmV0dXJuIGpvYkFsaWFzOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgcGdtCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBnbSgpIHsKLQkJCXJldHVybiBwZ207Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBwaWQKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0UGlkKCkgewotCQkJcmV0dXJuIHBpZDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHJhbmsKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKLQkJCXJldHVybiByYW5rOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgc2lkCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFNpZCgpIHsKLQkJCXJldHVybiBzaWQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgdXNlcm5hbWUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0JCQlyZXR1cm4gdXNlcm5hbWU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJCXJldHVybiBjb21wbGV0ZSA9PSAoSk9CSUQgfCBKT0JBTElBUyB8IFVTRVJOQU1FIHwgSE9TVCB8IFBJRCB8IFNJRCB8IFJBTksgfCBQR00pOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7Ci0JCQl0aGlzLmhvc3QgPSBob3N0OwotCQkJdGhpcy5jb21wbGV0ZSB8PSBIT1NUOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGpvYklEIHRoZSBqb2JJRCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEpvYklEKFN0cmluZyBqb2JJRCkgewotCQkJdGhpcy5qb2JJRCA9IGpvYklEOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBKT0JJRDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBqb2JBbGlhcyB0aGUgam9iQWxpYXMgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRKb2JBbGlhcyhTdHJpbmcgam9iQWxpYXMpIHsKLQkJCXRoaXMuam9iQWxpYXMgPSBqb2JBbGlhczsKLQkJCXRoaXMuY29tcGxldGUgfD0gSk9CQUxJQVM7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHBnbSB0aGUgcGdtIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGdtKFN0cmluZyBwZ20pIHsKLQkJCXRoaXMucGdtID0gcGdtOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBQR007Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gcGlkIHRoZSBwaWQgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQaWQoaW50IHBpZCkgewotCQkJdGhpcy5waWQgPSBwaWQ7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IFBJRDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSByYW5rIHRoZSByYW5rIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmFuayhpbnQgcmFuaykgewotCQkJdGhpcy5yYW5rID0gcmFuazsKLQkJCXRoaXMuY29tcGxldGUgfD0gUkFOSzsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBzaWQgdGhlIHNpZCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpZChpbnQgc2lkKSB7Ci0JCQl0aGlzLnNpZCA9IHNpZDsKLQkJCXRoaXMuY29tcGxldGUgfD0gU0lEOwotCQl9Ci0JCS8qKgotCQkgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7Ci0JCQl0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IFVTRVJOQU1FOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmcgc3RyID0gIkpvYiAiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWlzQ29tcGxldGUoKSkgewotCQkJCXN0ciArPSAiKGluY29tcGxldGUpIFsiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXN0ciArPSAiXSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBKT0JJRCkgPT0gSk9CSUQpIHsKLQkJCQlzdHIgKz0gIiBpZDogIiArIGpvYklEOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgSk9CQUxJQVMpID09IEpPQkFMSUFTKSB7Ci0JCQkJc3RyICs9ICIgYWxpYXM6ICIgKyBqb2JBbGlhczsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIFVTRVJOQU1FKSA9PSBVU0VSTkFNRSkgewotCQkJCXN0ciArPSAiIHVzZXJuYW1lOiIgKyB1c2VybmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIEhPU1QpID09IEhPU1QpIHsKLQkJCQlzdHIgKz0gIiBob3N0OiIgKyBob3N0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgUElEKSA9PSBQSUQpIHsKLQkJCQlzdHIgKz0gIiBwaWQ6IiArIHBpZDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIFNJRCkgPT0gU0lEKSB7Ci0JCQkJc3RyICs9ICIgc2lkOiIgKyBzaWQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBSQU5LKSA9PSBSQU5LKSB7Ci0JCQkJc3RyICs9ICIgcmFuazoiICsgcmFuazsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIFBHTSkgPT0gUEdNKSB7Ci0JCQkJc3RyICs9ICIgcGdtOiIgKyBwZ207IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBzdHIgKyAiXSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PEpvYj4+IGpvYnNCeUlEID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEpvYj4+KCk7Ci0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzID0gZmFsc2U7Ci0KLQlwdWJsaWMgTVBJQ0gySm9iTWFwKCkgewotCQkvLyBOb3RoaW5nLgotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEpvYihKb2Igam9iKSB7Ci0JCUxpc3Q8Sm9iPiBqb2JzID0gam9ic0J5SUQuZ2V0KGpvYi5nZXRKb2JJRCgpKTsKLQkJaWYgKGpvYnMgPT0gbnVsbCkgewotCQkJam9icyA9IG5ldyBBcnJheUxpc3Q8Sm9iPigpOwotCQkJam9ic0J5SUQucHV0KGpvYi5nZXRKb2JJRCgpLCBqb2JzKTsJCQkKLQkJfQotCQlqb2JzLmFkZChqb2IpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxKb2I+IGdldEpvYihTdHJpbmcgam9iSUQpIHsKLQkJcmV0dXJuIGpvYnNCeUlELmdldChqb2JJRCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248TGlzdDxKb2I+PiBnZXRKb2JzKCkgewotCQlyZXR1cm4gam9ic0J5SUQudmFsdWVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyTGlzdEpvYnNQYXJzZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkxpc3RKb2JzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjVmOTIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyTGlzdEpvYnNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEdyZWcgV2F0c29uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyTGlzdEpvYnNQYXJzZXIgewotCXB1YmxpYyBlbnVtIEpvYkxpc3RTdGF0ZSB7Sk9CTElTVF9JTklULCBKT0JMSVNUX1NUQVJULCBKT0JMSVNUX0VORCwgSk9CTElTVF9DT01QTEVURSwgSk9CTElTVF9FUlJPUn0KLQkKLQlwcml2YXRlIEpvYkxpc3RTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIE1QSUNIMkpvYk1hcCBtYXAgPSBuZXcgTVBJQ0gySm9iTWFwKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNc2c7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcnNlcgotCSAqIEBwYXJhbSBsaW5lCi0JICogQHBhcmFtIGpvYgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzSm9iSW5mbyhTdHJpbmcgbGluZSwgTVBJQ0gySm9iTWFwLkpvYiBqb2IpIHsKLQkJU3RyaW5nW10gcGFydHMgPSBsaW5lLnNwbGl0KCI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGtleTsKLQkJU3RyaW5nIHZhbHVlOwotCi0JCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJa2V5ID0gcGFydHNbMF0udHJpbSgpOwotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PSAyKSB7Ci0JCQlrZXkgPSBwYXJ0c1swXS50cmltKCk7Ci0JCQl2YWx1ZSA9IHBhcnRzWzFdLnRyaW0oKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfRVJST1I7Ci0JCQllcnJvck1zZyA9IGxpbmU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICgiam9iaWQiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRKb2JJRCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoImpvYmFsaWFzIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0Sm9iQWxpYXModmFsdWUpOwotCQl9IGVsc2UgaWYgKCJ1c2VybmFtZSIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldFVzZXJuYW1lKHZhbHVlKTsKLQkJfSBlbHNlIGlmICgiaG9zdCIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldEhvc3QodmFsdWUpOwotCQl9IGVsc2UgaWYgKCJwaWQiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRQaWQoSW50ZWdlci5wYXJzZUludCh2YWx1ZSkpOwotCQl9IGVsc2UgaWYgKCJzaWQiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRTaWQoSW50ZWdlci5wYXJzZUludCh2YWx1ZSkpOwotCQl9IGVsc2UgaWYgKCJyYW5rIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0UmFuayhJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0JCX0gZWxzZSBpZiAoInBnbSIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldFBnbSh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0VSUk9SOwotCQkJZXJyb3JNc2cgPSBsaW5lOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoam9iLmlzQ29tcGxldGUoKSkgewotCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9FTkQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYWRlcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE1QSUNIMkpvYk1hcCBwYXJzZShCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJTVBJQ0gySm9iTWFwLkpvYiBqb2IgPSBudWxsOwotCi0JCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfSU5JVDsKLQkJCi0JCXdoaWxlIChzdGF0ZSAhPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9DT01QTEVURSkgewotCQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBKT0JMSVNUX0lOSVQ6Ci0JCQkJaWYgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpID09IG51bGwpIHsKLQkJCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9DT01QTEVURTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJCWlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJLy8gSWdub3JlIGVtcHR5IGxpbmUKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9TVEFSVDsKLQotCQkJCWpvYiA9IG1hcC5uZXcgSm9iKCk7Ci0JCQkJcHJvY2Vzc0pvYkluZm8obGluZSwgam9iKTsKLQkJCQlicmVhazsKLQkJCQotCQkJY2FzZSBKT0JMSVNUX1NUQVJUOgotCQkJCWlmICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSA9PSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfRU5EOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJbGluZSA9IGxpbmUudHJpbSgpOwotCi0JCQkJaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCXByb2Nlc3NKb2JJbmZvKGxpbmUsIGpvYik7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIEpPQkxJU1RfRU5EOgotCQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCQlpZiAoam9iLmlzQ29tcGxldGUoKSkgewotCQkJCQkJbWFwLmFkZEpvYihqb2IpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgImpvYiBpcyBpbmNvbXBsZXRlLCBza2lwcGluZyIgKyBqb2IudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfQ09NUExFVEU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9JTklUOwotCQkJCX0KLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAiZm91bmQgam9iICIgKyBqb2IudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgSk9CTElTVF9DT01QTEVURToKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgSk9CTElTVF9FUlJPUjoKLQkJCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCQllcnJvck1zZyArPSAiXG4iICsgbGluZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNc2c7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJQZXJpb2RpY0pvYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUGVyaW9kaWNKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzMjc4Yy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJQZXJpb2RpY0pvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE5vZGVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5Ub29sc1JNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0UmVtb3RlQ29tbWFuZEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEdyZWcgV2F0c29uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUGVyaW9kaWNKb2IgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2IgewotCU1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRzOwotCi0JcHVibGljIE1QSUNIMlBlcmlvZGljSm9iKE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRzKSB7Ci0JCXN1cGVyKHJ0cywKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5NUElDSDJNb25pdG9ySm9iX25hbWUsIHJ0cy5nZXRSbUNvbmZpZ3VyYXRpb24oKS5nZXROYW1lKCkpLAotCQkJCXJ0cy5yZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKS5nZXRQZXJpb2RpY01vbml0b3JDbWQoKSwKLQkJCQlNZXNzYWdlcy5NUElDSDJNb25pdG9ySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMk1vbml0b3JKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJNb25pdG9ySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2UsCi0JCQkJcnRzLnJldHJpZXZlRWZmZWN0aXZlVG9vbFJtQ29uZmlndXJhdGlvbigpLmdldFBlcmlvZGljTW9uaXRvclRpbWUoKSk7Ci0JCXRoaXMucnRzID0gcnRzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKEJ1ZmZlcmVkUmVhZGVyIG91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBNUEkgcmVzb3VyY2UgbWFuYWdlciBoYXZlIG9ubHkgb25lIG1hY2hpbmUgYW5kIG9uZSBxdWV1ZS4KLQkJICogVGhlcmUgdGhleSBhcmUgaW1wbGljaXRseSAiZGlzY292ZXJlZCIuCi0JCSAqLwotCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRzLmdldFJtSUQoKSk7Ci0JCUlQTWFjaGluZSBtYWNoaW5lID0gcm0uZ2V0TWFjaGluZUJ5SWQocnRzLmdldE1hY2hpbmVJRCgpKTsKLQkJSVBRdWV1ZSBxdWV1ZSA9IHJtLmdldFF1ZXVlQnlJZChydHMuZ2V0UXVldWVJRCgpKTsKLQkJCi0JCS8qCi0JCSAqIFdlIG1heSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBtb2RlbCBoYXMgYmVlbiBzZXQgdXAgcHJvcGVybHkuIERvIG5vdGhpbmcKLQkJICogaWYgdGhpcyBpcyB0aGUgY2FzZS4KLQkJICovCi0JCWlmIChtYWNoaW5lID09IG51bGwgfHwgcXVldWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyoKLQkJICogQW55IGV4Y2VwdGlvbiBmcm9tIG5vdyBvbiBpcyBjYXVnaHQgaW4gb3JkZXIgdG8gYWRkIHRoZSBlcnJvciBtZXNzYWdlIGFzIGFuIGF0dHJpYnV0ZSB0byB0aGUgbWFjaGluZS4KLQkJICogVGhlbiwgdGhlIGV4Y2VwdGlvbiBpcyByZS10aHJvd24uCi0JCSAqLwotCQl0cnkgewotCQkJLyoKLQkJCSAqIFBhcnNlIG91dHB1dCBvZiBtcGRsaXN0am9icyBjb21tYW5kLgotCQkJICovCi0JCQlNUElDSDJMaXN0Sm9ic1BhcnNlciBwYXJzZXIgPSBuZXcgTVBJQ0gyTGlzdEpvYnNQYXJzZXIoKTsKLQkJCU1QSUNIMkpvYk1hcCBqb2JNYXAgPSBwYXJzZXIucGFyc2Uob3V0cHV0KTsKLQkJCWlmIChqb2JNYXAgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTVBJQ0gyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgcGFyc2VyLmdldEVycm9yTWVzc2FnZSgpKSk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBVcGRhdGUgbW9kZWwgYWNjb3JkaW5nIHRvIGRhdGEuIEZpcnN0IGNyZWF0ZSBhbnkgbmV3IGpvYnMuCi0JCQkgKi8KLQkJCWZvciAoTGlzdDxNUElDSDJKb2JNYXAuSm9iPiBqb2JzIDogam9iTWFwLmdldEpvYnMoKSkgewotCQkJCWZvciAoTVBJQ0gySm9iTWFwLkpvYiBqb2IgOiBqb2JzKSB7Ci0JCQkJCUlQSm9iIHBKb2IgPSBxdWV1ZS5nZXRKb2JCeUlkKGpvYi5nZXRKb2JBbGlhcygpKTsKLQkJCQkJaWYgKHBKb2IgPT0gbnVsbCkgewotCQkJCQkJLy8gTm90IG9uZSBvZiBvdXIgam9icwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJSVBQcm9jZXNzQ29udHJvbCBwcm9jZXNzID0gKElQUHJvY2Vzc0NvbnRyb2wpcEpvYi5nZXRQcm9jZXNzQnlJbmRleChqb2IuZ2V0UmFuaygpKTsKLQkJCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJLy8gcHJvY2VzcyBhbHJlYWR5IGV4aXN0cywgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5vZGVJRCA9IHJ0cy5nZXROb2RlSURmb3JOYW1lKGpvYi5nZXRIb3N0KCkpOwotCQkJCQlpZiAobm9kZUlEID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLk1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0hvc3RuYW1lc0RvTm90TWF0Y2gsIG51bGwpKTsKLQkJCQkJfQotCQotCQkJCQlTdHJpbmcgcHJvY2Vzc05hbWUgPSBJbnRlZ2VyLnRvU3RyaW5nKGpvYi5nZXRSYW5rKCkpOwotCQkJCQlTdHJpbmcgcHJvY2Vzc0lEID0gcnRzLmNyZWF0ZVByb2Nlc3Moam9iLmdldEpvYkFsaWFzKCksIHByb2Nlc3NOYW1lLCBqb2IuZ2V0UmFuaygpKTsKLQkJCQkJcHJvY2VzcyA9IChJUFByb2Nlc3NDb250cm9sKXBKb2IuZ2V0UHJvY2Vzc0J5SWQocHJvY2Vzc0lEKTsKLQkKLQkJCQkJSVBOb2RlIG5vZGUgPSBtYWNoaW5lLmdldE5vZGVCeUlkKG5vZGVJRCk7Ci0JCi0JCQkJCS8qCi0JCQkJCSAqIEFsdGhvdWdoIG9uZSBjb3VsZCBjYWxsIHByb2Nlc3NDb250cm9sLmFkZE5vZGUobm9kZSkgdG8gYXNzaWduIHRoZSBwcm9jZXNzIHRvIHRoZSBub2RlLCB0aGlzIGRvZXMgbm90IHdvcmsuCi0JCQkJCSAqIEl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIG5vZGVDb250cm9sLmFkZFByb2Nlc3Nlcyhwcm9jZXNzQ29udHJvbCkgaW5zdGVhZC4KLQkJCQkJICovCi0JCQkJCUlQTm9kZUNvbnRyb2wgbm9kZUNvbnRyb2wgPSAoSVBOb2RlQ29udHJvbCkgbm9kZTsKLQkJCQkJbm9kZUNvbnRyb2wuYWRkUHJvY2Vzc2VzKEFycmF5cy5hc0xpc3QobmV3IElQUHJvY2Vzc0NvbnRyb2xbXSB7cHJvY2Vzc30pKTsKLQotCQkJCQlwcm9jZXNzLnNldFN0YXRlKFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLlJVTk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvKgotCQkJICogU2hvdyBtZXNzYWdlIG9mIGNvcmUgZXhjZXB0aW9uIGFuZCBjaGFuZ2UgbWFjaGluZSBzdGF0dXMgdG8gZXJyb3IuCi0JCQkgKi8KLQkJCWlmIChlLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFjaGluZUF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fQ29tbWFuZEZhaWxlZCwgZS5nZXRNZXNzYWdlKCkpKSk7Ci0JCQkJcnRzLmNoYW5nZU1hY2hpbmUobWFjaGluZS5nZXRJRCgpLCBhdHRyTWFuYWdlcik7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFNob3cgbWVzc2FnZSBvZiBhbGwgb3RoZXIgZXhjZXB0aW9ucyBhbmQgY2hhbmdlIG1hY2hpbmUgc3RhdHVzIHRvIGVycm9yLgotCQkJICovCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFjaGluZUF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNUElDSDJNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShOTFMuYmluZChNZXNzYWdlcy5NUElDSDJNb25pdG9ySm9iX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yLCBlLmdldE1lc3NhZ2UoKSkpKTsKLQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmUuZ2V0SUQoKSwgYXR0ck1hbmFnZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUnVudGltZVN5c3RlbS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUnVudGltZVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTMxNmRjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLk1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJSdW50aW1lU3lzdGVtIGV4dGVuZHMgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSB7Ci0KLQkvKiogVGhlIG1hY2hpbmUgd2hlcmUgb3BlbiBtcGkgaXMgcnVubmluZyBvbi4gKi8KLQlwcml2YXRlIFN0cmluZyBtYWNoaW5lSUQ7Ci0JLyoqIFRoZSBxdWV1ZSB0aGF0IGRpc3BhdGNoZXMgam9icyB0byBtcGkuICovCi0JcHJpdmF0ZSBTdHJpbmcgcXVldWVJRDsKLQkvKiogTWFwcGluZyBvZiBkaXNjb3ZlcmVkIGhvc3RzIGFuZCB0aGVpciBJRCBmb3IgSVBOb2RlIGVsZW1lbnRzLiAqLwotCXByaXZhdGUgTWFwPFN0cmluZyxTdHJpbmc+IG5vZGVOYW1lVG9JRE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHVibGljIE1QSUNIMlJ1bnRpbWVTeXN0ZW0oSW50ZWdlciBybWlkLAotCQkJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBhdHRyRGVmTWdyKSB7Ci0JCXN1cGVyKHJtaWQsIGNvbmZpZywgYXR0ckRlZk1ncik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFjaGluZUlEKFN0cmluZyBtYWNoaW5lSUQpIHsKLQkJdGhpcy5tYWNoaW5lSUQgPSBtYWNoaW5lSUQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVldWVJRChTdHJpbmcgcXVldWVJRCkgewotCQl0aGlzLnF1ZXVlSUQgPSBxdWV1ZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFjaGluZUlEKCkgewotCQlyZXR1cm4gbWFjaGluZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVldWVJRCgpIHsKLQkJcmV0dXJuIHF1ZXVlSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlSURmb3JOYW1lKFN0cmluZyBob3N0bmFtZSkgewotCQlyZXR1cm4gbm9kZU5hbWVUb0lETWFwLmdldChob3N0bmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZUlERm9yTmFtZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBub2RlSUQpIHsKLQkJbm9kZU5hbWVUb0lETWFwLnB1dChob3N0bmFtZSwgbm9kZUlEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9TaHV0ZG93bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1NodXRkb3duKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtI2RvU3RhcnRFdmVudHMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3RhcnRFdmVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9TdGFydHVwKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3RhcnR1cChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSNkb1N0b3BFdmVudHMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3RvcEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2IgY3JlYXRlRGlzY292ZXJKb2IoKSB7Ci0JCWlmICghcm1Db25maWd1cmF0aW9uLmhhc0Rpc2NvdmVyQ21kKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpvYiBqb2IgPSBuZXcgTVBJQ0gyRGlzY292ZXJKb2IodGhpcyk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQlqb2Iuc2V0U3lzdGVtKGZhbHNlKTsKLQkJam9iLnNldFVzZXIoZmFsc2UpOwotCQlyZXR1cm4gam9iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2IgY3JlYXRlUGVyaW9kaWNNb25pdG9ySm9iKCkgewotCQlpZiAoIXJtQ29uZmlndXJhdGlvbi5oYXNQZXJpb2RpY01vbml0b3JDbWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSm9iIGpvYiA9IG5ldyBNUElDSDJQZXJpb2RpY0pvYih0aGlzKTsKLQkJam9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0JCWpvYi5zZXRTeXN0ZW0oZmFsc2UpOwotCQlqb2Iuc2V0VXNlcihmYWxzZSk7Ci0JCXJldHVybiBqb2I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvYiBjcmVhdGVDb250aW51b3VzTW9uaXRvckpvYigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvYiBjcmVhdGVSdW50aW1lU3lzdGVtSm9iKFN0cmluZyBqb2JJRCwgU3RyaW5nIHF1ZXVlSUQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1ncikgewotCQlyZXR1cm4gbmV3IE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2Ioam9iSUQsIHF1ZXVlSUQsIE1lc3NhZ2VzLk1QSUNIMlJ1bnRpbWVTeXN0ZW1fSm9iTmFtZSwgdGhpcywgYXR0ck1ncik7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uIHJldHJpZXZlRWZmZWN0aXZlVG9vbFJtQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKGdldFJtQ29uZmlndXJhdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJSdW50aW1lU3lzdGVtSm9iLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJSdW50aW1lU3lzdGVtSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NmE4ZDcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUnVudGltZVN5c3RlbUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Kb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklQcm9jZXNzQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUHJvY2Vzc0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLklucHV0U3RyZWFtT2JzZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJKb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyTGF1bmNoQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2IgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iIHsKLQkKLQlwcml2YXRlIE9iamVjdCBsb2NrMSA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIElucHV0U3RyZWFtT2JzZXJ2ZXIgc3RkZXJyT2JzZXJ2ZXI7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbU9ic2VydmVyIHN0ZG91dE9ic2VydmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFJlZW50cmFudExvY2sgcHJvY3NMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLQlwcm90ZWN0ZWQgZmluYWwgQ29uZGl0aW9uIHByb2NzQ29uZGl0aW9uID0gcHJvY3NMb2NrLm5ld0NvbmRpdGlvbigpOwotCXByb3RlY3RlZCBpbnQgbnVtUnVubmluZ1Byb2NzID0gMDsKLQotCXByb3RlY3RlZCBJUHJvY2Vzc0xpc3RlbmVyIHByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJUHJvY2Vzc0xpc3RlbmVyKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklQcm9jZXNzTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklQcm9jZXNzQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJvY2Vzc0NoYW5nZUV2ZW50IGUpIHsKLQkJCWlmIChlLmdldEF0dHJpYnV0ZXMoKS5nZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpICE9IG51bGwKLQkJCQkJJiYgZS5nZXRTb3VyY2UoKS5nZXRTdGF0ZSgpID09IFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLlJVTk5JTkcpIHsKLQkJCQlwcm9jc0xvY2subG9jaygpOwotCQkJCXRyeSB7Ci0JCQkJCW51bVJ1bm5pbmdQcm9jcysrOwotCQkJCQlwcm9jc0NvbmRpdGlvbi5zaWduYWxBbGwoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwcm9jc0xvY2sudW5sb2NrKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcm90ZWN0ZWQgSUpvYkNoaWxkTGlzdGVuZXIgam9iQ2hpbGRMaXN0ZW5lciA9IG5ldyBJSm9iQ2hpbGRMaXN0ZW5lcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1Byb2Nlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdQcm9jZXNzRXZlbnQgZSkgewotCQkJZm9yIChJUFByb2Nlc3MgcHJvY2VzcyA6IGUuZ2V0UHJvY2Vzc2VzKCkpIHsKLQkJCQlwcm9jZXNzLmFkZEVsZW1lbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUHJvY2Vzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVByb2Nlc3NFdmVudCBlKSB7Ci0JCQlmb3IgKElQUHJvY2VzcyBwcm9jZXNzIDogZS5nZXRQcm9jZXNzZXMoKSkgewotCQkJCXByb2Nlc3MucmVtb3ZlRWxlbWVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBNUElDSDJSdW50aW1lU3lzdGVtSm9iKFN0cmluZyBqb2JJRCwgU3RyaW5nIHF1ZXVlSUQsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHJ0U3lzdGVtLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IpIHsKLQkJc3VwZXIoam9iSUQsIHF1ZXVlSUQsIG5hbWUsIHJ0U3lzdGVtLCBhdHRyTWdyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hhbmdlQWxsUHJvY2Vzc2VzU3RhdHVzKFN0YXRlIG5ld1N0YXRlKSB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0KLQkJLyoKLQkJICogTWFyayBhbGwgcnVubmluZyBhbmQgc3RhcnRpbmcgcHJvY2Vzc2VzIGFzIGZpbmlzaGVkLgotCQkgKi8KLQkJTGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKElQUHJvY2VzcyBpcFByb2Nlc3MgOiBpcEpvYi5nZXRQcm9jZXNzZXMoKSkgewotCQkJc3dpdGNoIChpcFByb2Nlc3MuZ2V0U3RhdGUoKSkgewotCQkJY2FzZSBFWElURUQ6Ci0JCQljYXNlIEVSUk9SOgotCQkJY2FzZSBFWElURURfU0lHTkFMTEVEOgotCQkJCWJyZWFrOwotCQkJY2FzZSBSVU5OSU5HOgotCQkJY2FzZSBTVEFSVElORzoKLQkJCWNhc2UgU1VTUEVOREVEOgotCQkJY2FzZSBVTktOT1dOOgotCQkJCWlkcy5hZGQoaXBQcm9jZXNzLmdldElEKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTXJnID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJYXR0ck1yZy5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG5ld1N0YXRlKSk7Ci0JCWZvciAoU3RyaW5nIHByb2Nlc3NJZCA6IGlkcykgewotCQkJcnRTeXN0ZW0uY2hhbmdlUHJvY2Vzcyhwcm9jZXNzSWQsIGF0dHJNcmcpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0JCWlwSm9iLmFkZENoaWxkTGlzdGVuZXIoam9iQ2hpbGRMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25DbGVhblVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzLmRlc3Ryb3koKTsKLQkJfQotCQlpZiAoc3RkZXJyT2JzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc3RkZXJyT2JzZXJ2ZXIua2lsbCgpOwotCQkJc3RkZXJyT2JzZXJ2ZXIgPSBudWxsOwotCQl9Ci0JCWlmIChzdGRvdXRPYnNlcnZlciAhPSBudWxsKSB7Ci0JCQlzdGRvdXRPYnNlcnZlci5raWxsKCk7Ci0JCQlzdGRvdXRPYnNlcnZlciA9IG51bGw7Ci0JCX0KLQkJLy8gVE9ETzogbW9yZSBjbGVhbnVwPwotCQljaGFuZ2VBbGxQcm9jZXNzZXNTdGF0dXMoUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuRVhJVEVEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvbkZpbmlzaGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGFuZ2VBbGxQcm9jZXNzZXNTdGF0dXMoUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuRVhJVEVEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvblN0YXJ0ZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0KLQkJLyoKLQkJICogTGlzdGVuZXIgdGhhdCBzYXZlcyBzdGRvdXQuCi0JCSAqLwotCQlmaW5hbCBQaXBlZE91dHB1dFN0cmVhbSBzdGRvdXRPdXRwdXRTdHJlYW0gPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKLQkJZmluYWwgUGlwZWRJbnB1dFN0cmVhbSBzdGRvdXRJbnB1dFN0cmVhbSA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlzdGRvdXRJbnB1dFN0cmVhbS5jb25uZWN0KHN0ZG91dE91dHB1dFN0cmVhbSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydCBmYWxzZTsgLy8gVGhpcyBleGNlcHRpb24gaXMgbm90IHBvc3NpYmxlCi0JCX0KLQkJZmluYWwgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtIHN0ZG91dFBpcGVkU3RyZWFtTGlzdGVuZXIgPSBuZXcgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtKHN0ZG91dE91dHB1dFN0cmVhbSk7Ci0KLQkJVGhyZWFkIHN0ZG91dFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRvdXQgdGhyZWFkOiBzdGFydGVkIiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlCdWZmZXJlZFJlYWRlciBzdGRvdXRCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3Rkb3V0SW5wdXRTdHJlYW0pKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbGluZSA9IHN0ZG91dEJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlpbnQgcG9zID0gbGluZS5pbmRleE9mKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zID4gMCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygwLCBwb3MpKTsKLQkJCQkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2sxKSB7Ci0JCQkJCQkJSVBQcm9jZXNzIGlwUHJvYyA9IGlwSm9iLmdldFByb2Nlc3NCeUluZGV4KGluZGV4KTsKLQkJCQkJCQlpZiAoaXBQcm9jICE9IG51bGwpIHsKLQkJCQkJCQkJaXBQcm9jLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRvdXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGxpbmUpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX09VVFBVVF9UUkFDSU5HLCAiUlRTIGpvYiAjezB9Oj4gezF9Iiwgam9iSUQsIGxpbmUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlsaW5lID0gc3Rkb3V0QnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3Rkb3V0IHRocmVhZDogezB9IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTVBJQ0gyUGx1Z2luLmxvZyhlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdGRvdXRQaXBlZFN0cmVhbUxpc3RlbmVyLmRpc2FibGUoKTsKLQkJCQl9Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3Rkb3V0IHRocmVhZDogZmluaXNoZWQiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQotCQkvKgotCQkgKiBMaXN0ZW5lciB0aGF0IHNhdmVzIHN0ZGVyci4KLQkJICovCi0JCWZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHN0ZGVyck91dHB1dFN0cmVhbSA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotCQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIHN0ZGVycklucHV0U3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXN0ZGVycklucHV0U3RyZWFtLmNvbm5lY3Qoc3RkZXJyT3V0cHV0U3RyZWFtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0IGZhbHNlOyAvLyBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgcG9zc2libGUKLQkJfQotCQlmaW5hbCBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0gc3RkZXJyUGlwZWRTdHJlYW1MaXN0ZW5lciA9IG5ldyBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0oc3RkZXJyT3V0cHV0U3RyZWFtKTsKLQkJVGhyZWFkIHN0ZGVyclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiBzdGFydGVkIiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBzdGRlcnJCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RkZXJySW5wdXRTdHJlYW0pKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbGluZSA9IHN0ZGVyckJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlpbnQgcG9zID0gbGluZS5pbmRleE9mKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zID4gMCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygwLCBwb3MpKTsKLQkJCQkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2sxKSB7Ci0JCQkJCQkJSVBQcm9jZXNzIGlwUHJvYyA9IGlwSm9iLmdldFByb2Nlc3NCeUluZGV4KGluZGV4KTsKLQkJCQkJCQlpZiAoaXBQcm9jICE9IG51bGwpIHsKLQkJCQkJCQkJaXBQcm9jLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRlcnJBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGxpbmUpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJRGVidWdVdGlsLmVycm9yKERlYnVnVXRpbC5SVFNfSk9CX09VVFBVVF9UUkFDSU5HLCAiUlRTIGpvYiAjezB9Oj4gezF9IiwgZ2V0Sm9iSUQoKSwgbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWxpbmUgPSBzdGRlcnJCdWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiB7MX0iLCBnZXRKb2JJRCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNUElDSDJQbHVnaW4ubG9nKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0ZGVyclBpcGVkU3RyZWFtTGlzdGVuZXIuZGlzYWJsZSgpOwotCQkJCX0KLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiBmaW5pc2hlZCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3RhcnRpbmcgYWxsIHRocmVhZHMiLCBnZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBDcmVhdGUgYW5kIHN0YXJ0IGxpc3RlbmVycy4KLQkJICovCi0JCXN0ZG91dFRocmVhZC5zdGFydCgpOwotCQlzdGRlcnJUaHJlYWQuc3RhcnQoKTsKLQotCQlzdGRlcnJPYnNlcnZlciA9IG5ldyBJbnB1dFN0cmVhbU9ic2VydmVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCXN0ZG91dE9ic2VydmVyID0gbmV3IElucHV0U3RyZWFtT2JzZXJ2ZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKLQotCQlzdGRvdXRPYnNlcnZlci5hZGRMaXN0ZW5lcihzdGRvdXRQaXBlZFN0cmVhbUxpc3RlbmVyKTsKLQkJc3RkZXJyT2JzZXJ2ZXIuYWRkTGlzdGVuZXIoc3RkZXJyUGlwZWRTdHJlYW1MaXN0ZW5lcik7Ci0KLQkJc3RkZXJyT2JzZXJ2ZXIuc3RhcnQoKTsKLQkJc3Rkb3V0T2JzZXJ2ZXIuc3RhcnQoKTsKLQkJCi0JCS8qCi0JCSAqIEF0IHRoaXMgcG9pbnQgd2UgbmVlZCB0byBwYXVzZSB1bnRpbCBhbGwgcHJvY2Vzc2VzIGhhdmUgc3RhcnRlZC4gVGhpcyBpcyBiZWNhdXNlCi0JCSAqIHRoZSBtb2RlbCBzZW1hbnRpY3MgYXJlIHN1Y2ggdGhhdCB0aGUgam9iIHN0YXRlIG11c3Qgbm90IGJlIHNldCB0byBSVU5OSU5HIHVudGlsCi0JCSAqIGFsbCB0aGUgam9iJ3MgcHJvY2Vzc2VzIChpZiB0aGVyZSBhcmUgYW55KSBoYXZlIGJlZW4gY3JlYXRlZCBhbmQgYWxzbyBzZXQgdG8gUlVOTklORy4KLQkJICovCi0JCQotCQkvKgotCQkgKiBXZSBrbm93IHRoYXQgYSBNUElDSDIgam9iIGhhcyBhIG51bWJlciBvZiBwcm9jZXNzZXMgYXR0cmlidXRlCi0JCSAqLwotCQlpbnQgbnVtUHJvY3MgPSAxOwotCQlJbnRlZ2VyQXR0cmlidXRlIG51bVByb2NzQXR0ciA9IGF0dHJNZ3IuZ2V0QXR0cmlidXRlKEpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkpOwotCQlpZiAobnVtUHJvY3NBdHRyICE9IG51bGwpIHsKLQkJCW51bVByb2NzID0gbnVtUHJvY3NBdHRyLmdldFZhbHVlKCkuaW50VmFsdWUoKTsKLQkJfQotCQkKLQkJcHJvY3NMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCXdoaWxlICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgbnVtUnVubmluZ1Byb2NzIDwgbnVtUHJvY3MpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9jc0NvbmRpdGlvbi5hd2FpdCg1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm9jc0xvY2sudW5sb2NrKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1ByZXBhcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGRvUmV0cmlldmVUb29sQmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gbWFrZSBtYWNyb3MgYXZhaWxhYmxlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHdvcmsgZGlyZWN0b3J5LgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGRvUmV0cmlldmVUb29sQ29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyLAotCQkJU3RyaW5nIGRpcmVjdG9yeSwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkgewotCi0JCUxpc3Q8SUF0dHJpYnV0ZTw/LCA/LCA/Pj4gbmV3QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8SUF0dHJpYnV0ZTw/LD8sPz4+KCk7Ci0KLQkJLyoKLQkJICogQW4gTVBJQ0gyIHNwZWNpZmljIGF0dHJpYnV0ZS4KLQkJICogQXR0cmlidXRlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIG5hbWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQkJICovCi0JCWludCBwID0gMDsKLQkJU3RyaW5nIGtleXNbXSA9IG5ldyBTdHJpbmdbZW52aXJvbm1lbnQuc2l6ZSgpXTsKLQkJZm9yIChTdHJpbmcga2V5IDogZW52aXJvbm1lbnQua2V5U2V0KCkpIHsKLQkJCWtleXNbcCsrXSA9IGtleTsKLQkJfQotCQluZXdBdHRyaWJ1dGVzLmFkZChNUElDSDJMYXVuY2hBdHRyaWJ1dGVzLmdldEVudmlyb25tZW50S2V5c0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoa2V5cykpOwotCi0JCS8qCi0JCSAqIEFuIE1QSUNIMiBzcGVjaWZpYyBhdHRyaWJ1dGUuCi0JCSAqIEEgc2hvcnRjdXQgdGhhdCBnZW5lcmF0ZXMgYXJndW1lbnRzIGZvciB0aGUgTVBJQ0gyIHJ1biBjb21tYW5kLgotCQkgKi8KLQkJbmV3QXR0cmlidXRlcy5hZGQoTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5nZXRFbnZpcm9ubWVudEFyZ3NBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKCkpOwotCQkKLQkJLyoKLQkJICogVGhlIGpvYmlkIGlzIHVzZWQgdG8gYWxpYXMgdGhlIE1QSUNIMiBqb2Igc28gdGhhdCBpdCBjYW4gYmUgbWF0Y2hlZCBsYXRlci4KLQkJICovCi0JCW5ld0F0dHJpYnV0ZXMuYWRkKE1QSUNIMkpvYkF0dHJpYnV0ZXMuZ2V0Sm9iSWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGpvYklEKSk7Ci0JCQotCQlyZXR1cm4gbmV3QXR0cmlidXRlcy50b0FycmF5KG5ldyBJQXR0cmlidXRlPD8sID8sID8+W25ld0F0dHJpYnV0ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRvUmV0cmlldmVUb29sRW52aXJvbm1lbnQoKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm8gZXh0cmEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5lZWRzIHRvIGJlIHNldCBmb3IgTVBJQ0gyLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1Rlcm1pbmF0ZUpvYigpIHsKLQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9XYWl0RXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBXYWl0IHVudGlsIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgc3RvcCBiZWNhdXNlIHN0cmVhbSBhcmUgY2xvc2VkLgotCQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgaGFzIGZpbmlzaGVkLgotCQkgKi8KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogd2FpdGluZyBzdGRlcnIgdGhyZWFkIHRvIGZpbmlzaCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJc3RkZXJyT2JzZXJ2ZXIuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiB3YWl0aW5nIHN0ZG91dCB0aHJlYWQgdG8gZmluaXNoIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzdGRvdXRPYnNlcnZlci5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCi0JCS8qCi0JCSAqIFN0aWxsIGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgcmVtb3RlIHByb2Nlc3MgbWlnaHQgbm90IGhhdmUgeWV0IHRlcm1pbmF0ZWQsIGFsdGhvdWdoIHN0ZG91dCBhbmQgc3RkZXJyIGlzIGNsb3NlZC4KLQkJICovCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgbXBpIHByb2Nlc3MgdG8gZmluaXNoIGNvbXBsZXRlbHkiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXByb2Nlc3Mud2FpdEZvcigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IGNvbXBsZXRlbHkgZmluaXNoZWQiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlRyYWNlUGFyc2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJUcmFjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQzM2MwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlRyYWNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5EZWJ1Z1V0aWw7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEdyZWcgV2F0c29uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyVHJhY2VQYXJzZXIgewotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBNUElDSDJIb3N0TWFwIG1hcCA9IG5ldyBNUElDSDJIb3N0TWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoW15fXSspXyhbMC05XSkrIFxcKChbMC05Ll0rKVxcKSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBtcGR0cmFjZSBjb21tYW5kLgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiBAcmV0dXJuIGFuIE1QSUNIMkhvc3RNYXAgY29udGFpbmluZyB0aGUga25vd24gaG9zdHMsIG9yIG51bGwgaWYgdGhlcmUgd2FzIGFuIGVycm9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBNUElDSDJIb3N0TWFwIHBhcnNlKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTVBJQ0gyVHJhY2VQYXJzZXIgcGFyc2VyID0gbmV3IE1QSUNIMlRyYWNlUGFyc2VyKCk7Ci0JCVN0cmluZyBsaW5lOwotCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJbGluZSA9IGxpbmUudHJpbSgpOwotCi0JCQlpZiAobGluZS5sZW5ndGgoKT09MCkgewotCQkJCS8vIElnbm9yZSBlbXB0eSBsaW5lCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLQkJCWlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKLQkJCQkvKgotCQkJCSAqIFByb2JhYmx5IGFuIGVycm9yIGZyb20gbXBkdHJhY2UuIENvbGxlY3QgbGluZXMgYW5kIG1hcmsgZXJyb3IuCi0JCQkJICovCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCQllcnJvck1lc3NhZ2UgKz0gbGluZSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChtYXRjaGVyLm1hdGNoZXMoKSAmJiBtYXRjaGVyLmdyb3VwQ291bnQoKSA9PSAzKSB7Ci0JCQkJU3RyaW5nIGhvc3QgPSBtYXRjaGVyLmdyb3VwKDEpOwotCQkJCVN0cmluZyBwb3J0ID0gbWF0Y2hlci5ncm91cCgyKTsKLQkJCQlTdHJpbmcgYWRkciA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0JCQkJcGFyc2VyLm1hcC5hZGRIb3N0KGhvc3QsIGFkZHIsIHBvcnQpOwotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJmb3VuZCBob3N0ICIgKyBob3N0ICsgIiBhZGRyICIgKyBhZGRyICsgIiBwb3J0ICIgKyBwb3J0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHBhcnNlci5tYXA7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhM2U2OC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmMjEyNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxZTM1NC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI01vbiBPY3QgMDYgMTQ6MzY6NDQgR01ULTAzOjAwIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3OGViNy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHMKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhM2I5MS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2RhdGEvbGF1bmNoLWRlZmF1bHRzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1YTMyYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU5VTVBST0NTPTEKLU5PTE9DQUw9ZmFsc2UKLVBSRUZJWD0KLVVTRVBSRUZJWD1mYWxzZQotSE9TVEZJTEU9Ci1VU0VIT1NURklMRT1mYWxzZQotSE9TVExJU1Q9Ci1VU0VIT1NUTElTVD1mYWxzZQotQVJHVU1FTlRTPQotVVNFREVGQVVMVEFSR1VNRU5UUz10cnVlCi1VU0VERUZBVUxUUEFSQU1FVEVSUz10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZiZjFmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgTVBJQ0gyIChuZXcpIFVJCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZTFlMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5ybVByZWZlcmVuY2VzUGFnZS5PcGVuTVBJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLnByZWZlcmVuY2VzLk1QSUNIMlByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpLnVpLnByZWZlcmVuY2VzLk9wZW5NUEkxMiIKLSAgICAgICAgICAgIG5hbWU9Ik9wZW4gTVBJIDEuMiI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5ybVByZWZlcmVuY2VzUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5wcmVmZXJlbmNlcy5FbXB0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnJtUHJlZmVyZW5jZXNQYWdlLk9wZW5NUEkiCi0gICAgICAgICAgICBuYW1lPSJPcGVuIE1QSSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5ybVByZWZlcmVuY2VzUGFnZS5PcGVuTVBJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLnByZWZlcmVuY2VzLk1QSUNIMjEzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkudWkucHJlZmVyZW5jZXMuT3Blbk1QSTEzIgotICAgICAgICAgICAgbmFtZT0iT3BlbiBNUEkgMS4zIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC51aS5ybUNvbmZpZ3VyYXRpb25zIj4KLSAgICAgIDxjb25maWd1cmF0aW9uV2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkud2l6YXJkcy5NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLnVpLmNvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucm1MYXVuY2hDb25maWd1cmF0aW9ucyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaC5NUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIudWkubGF1bmNoQ29uZmlndXJhdGlvbiIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyVUlQbHVnaW4uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhYTNlMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5Ub29sc1JNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaC5NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBNUElDSDJVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTVBJQ0gyVUlQbHVnaW4oKSB7Ci0JCS8vIEVtcHR5IGltcGxlbWVudGF0aW9uLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5sb2FkRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNUElDSDJVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSYWlzZSBjb3JlIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSB0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlLCB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGFuIElTdGF0dXMKLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBzdHJpbmcKLQkgKgotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBUaHJvd2FibGUKLQkgKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLk1QSUNIMlVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yLCBlKSk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSB1bmlxdWUgaWRlbnRpZmllcgotCSAqCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0FkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODBkNWQ3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0FkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLlJNTGF1bmNoVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLkFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZXh0ZW5kcwotQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHsKLQotCUNvbXBvc2l0ZSBjb250cm9sOwotCUJ1dHRvbiB1c2VBcmdzRGVmYXVsdHNCdXR0b247Ci0JVGV4dCBhcmdzVGV4dDsKLQotCWNsYXNzIFdpZGdldExpc3RlbmVyIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyCi0JaW1wbGVtZW50cyBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLQkJcHVibGljIFdpZGdldExpc3RlbmVyKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkeW5hbWljVGFiKSB7Ci0JCQlzdXBlcihkeW5hbWljVGFiKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQljbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgewotCQlwcml2YXRlIGJvb2xlYW4gdXNlRGVmQXJnczsKLQkJcHJpdmF0ZSBTdHJpbmcgYXJnczsKLQotCQlwcm90ZWN0ZWQgRGF0YVNvdXJjZShBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcGFnZSkgewotCQkJc3VwZXIocGFnZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weUZyb21GaWVsZHMoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQl1c2VEZWZBcmdzID0gdXNlQXJnc0RlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJYXJncyA9IGV4dHJhY3RUZXh0KGFyZ3NUZXh0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9GaWVsZHMoKSB7Ci0JCQlhcHBseVRleHQoYXJnc1RleHQsIGFyZ3MpOwotCQkJdXNlQXJnc0RlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbih1c2VEZWZBcmdzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgewotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKAotCQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywKLQkJCQkJdXNlRGVmQXJncyk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoCi0JCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9BUkdVTUVOVFMsIGFyZ3MpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxvYWREZWZhdWx0KCkgewotCQkJYXJncyA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUzsKLQkJCXVzZURlZkFyZ3MgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTOwotCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21TdG9yYWdlKCkgewotCQkJdHJ5IHsKLQkJCQlhcmdzID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZSgKLQkJCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9BUkdVTUVOVFMsCi0JCQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9BUkdVTUVOVFMpOwotCQkJCXVzZURlZkFyZ3MgPSBnZXRDb25maWd1cmF0aW9uKCkKLQkJCQkuZ2V0QXR0cmlidXRlKAotCQkJCQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMsCi0JCQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gaGFuZGxlIGV4Y2VwdGlvbj8KLQkJCQlNUElDSDJVSVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMb2NhbCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCWlmICghdXNlRGVmQXJncyAmJiBhcmdzID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VzLkFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5QXJndW1lbnRzKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDb252ZXJ0IGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW50byBvbmUgaG9zdCBwZXIgbGluZQotCQkgKiAKLQkJICogQHBhcmFtIGxpc3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgaG9zdExpc3RUb1RleHQoU3RyaW5nIGxpc3QpIHsKLQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IGxpc3Quc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXZhbHVlc1tpXS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlyZXN1bHQgKz0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJlc3VsdCArPSB2YWx1ZXNbaV07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgewotCQlyZXR1cm4gbmV3IERhdGFTb3VyY2UodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlmaW5hbCBHcm91cCBhcmd1bWVudHNHcm91cCA9IG5ldyBHcm91cChjb250cm9sLCBTV1QuTk9ORSk7Ci0JCWFyZ3VtZW50c0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLAotCQkJCWZhbHNlKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlhcmd1bWVudHNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYXJndW1lbnRzR3JvdXAKLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0xhdW5jaEFyZ3VtZW50cyk7Ci0KLQkJdXNlQXJnc0RlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbihhcmd1bWVudHNHcm91cCwgU1dULkNIRUNLKTsKLQkJdXNlQXJnc0RlZmF1bHRzQnV0dG9uCi0JCS5zZXRUZXh0KE1lc3NhZ2VzLkFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0QXJndW1lbnRzKTsKLQkJLy8gdXNlQXJnc0RlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJdXNlQXJnc0RlZmF1bHRzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYXJndW1lbnRzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWxhYmVsCi0JCS5zZXRUZXh0KE1lc3NhZ2VzLkFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Bcmd1bWVudHMpOwotCi0JCWFyZ3NUZXh0ID0gbmV3IFRleHQoYXJndW1lbnRzR3JvdXAsIFNXVC5CT1JERVIpOwotCQlhcmdzVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGdldEF0dHJpYnV0ZXMoSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUlQUXVldWUgcXVldWUsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHNldERlZmF1bHRzKAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSkgewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZSgKLQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywKLQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywKLQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9BUkdVTUVOVFMpOwotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJYXJnc1RleHQuc2V0RW5hYmxlZCghdXNlQXJnc0RlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0Jhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTczOWNiLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0Jhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLlJNTGF1bmNoVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuUGl4ZWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZXh0ZW5kcyBBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgewotCi0JQ29tcG9zaXRlIGNvbnRyb2w7Ci0JU3Bpbm5lciBudW1Qcm9jc1NwaW5uZXI7Ci0JQnV0dG9uIG5vTG9jYWxCdXR0b247Ci0JQnV0dG9uIHVzZVByZWZpeEJ1dHRvbjsKLQlUZXh0IHByZWZpeFRleHQ7Ci0JVGV4dCBob3N0RmlsZVRleHQ7Ci0JQnV0dG9uIGhvc3RGaWxlQnV0dG9uOwotCVRleHQgaG9zdExpc3RUZXh0OwotCUJ1dHRvbiBob3N0TGlzdEJ1dHRvbjsKLQlCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIgewotCQlwdWJsaWMgV2lkZ2V0TGlzdGVuZXIoQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGR5bmFtaWNUYWIpIHsKLQkJCXN1cGVyKGR5bmFtaWNUYWIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvTW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBudW1Qcm9jc1NwaW5uZXIgfHwgZS5nZXRTb3VyY2UoKSA9PSBwcmVmaXhUZXh0IHx8IGUuZ2V0U291cmNlKCkgPT0gaG9zdEZpbGVUZXh0IHx8IGUuZ2V0U291cmNlKCkgPT0gaG9zdExpc3RUZXh0KSB7Ci0JCQkJLy8JCQkJZ2V0RGF0YVNvdXJjZSgpLmp1c3RWYWxpZGF0ZSgpOwotCQkJfSBlbHNlewotCQkJCXN1cGVyLmRvTW9kaWZ5VGV4dChlKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IG5vTG9jYWxCdXR0b24gfHwgZS5nZXRTb3VyY2UoKSA9PSB1c2VQcmVmaXhCdXR0b24pIHsKLQkJCQkvLwkJCQlnZXREYXRhU291cmNlKCkuanVzdFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gdXNlUHJlZml4QnV0dG9uIHx8IGUuZ2V0U291cmNlKCkgPT0gaG9zdEZpbGVCdXR0b24gfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0TGlzdEJ1dHRvbikgewotCQkJCS8vCQkJCWdldERhdGFTb3VyY2UoKS5qdXN0VmFsaWRhdGUoKTsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRGF0YVNvdXJjZSBleHRlbmRzIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlIHsKLQotCQlwcml2YXRlIGludCBudW1Qcm9jczsKLQkJcHJpdmF0ZSBib29sZWFuIG5vTG9jYWw7Ci0JCXByaXZhdGUgYm9vbGVhbiB1c2VQcmVmaXg7Ci0JCXByaXZhdGUgU3RyaW5nIHByZWZpeDsKLQkJcHJpdmF0ZSBib29sZWFuIHVzZUhvc3RGaWxlOwotCQlwcml2YXRlIFN0cmluZyBob3N0RmlsZTsKLQkJcHJpdmF0ZSBib29sZWFuIHVzZUhvc3RMaXN0OwotCQlwcml2YXRlIFN0cmluZyBob3N0TGlzdDsKLQotCQlwcm90ZWN0ZWQgRGF0YVNvdXJjZShBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcGFnZSkgewotCQkJc3VwZXIocGFnZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weUZyb21GaWVsZHMoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQludW1Qcm9jcyA9IG51bVByb2NzU3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQkJCW5vTG9jYWwgPSBub0xvY2FsQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJdXNlUHJlZml4ID0gdXNlUHJlZml4QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJcHJlZml4ID0gZXh0cmFjdFRleHQocHJlZml4VGV4dCk7Ci0JCQl1c2VIb3N0RmlsZSA9IGhvc3RGaWxlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJaG9zdEZpbGUgPSBleHRyYWN0VGV4dChob3N0RmlsZVRleHQpOwotCQkJdXNlSG9zdExpc3QgPSBob3N0TGlzdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCWhvc3RMaXN0ID0gZXh0cmFjdFRleHQoaG9zdExpc3RUZXh0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9GaWVsZHMoKSB7Ci0JCQludW1Qcm9jc1NwaW5uZXIuc2V0U2VsZWN0aW9uKG51bVByb2NzKTsKLQkJCW5vTG9jYWxCdXR0b24uc2V0U2VsZWN0aW9uKG5vTG9jYWwpOwotCQkJdXNlUHJlZml4QnV0dG9uLnNldFNlbGVjdGlvbih1c2VQcmVmaXgpOwotCQkJYXBwbHlUZXh0KHByZWZpeFRleHQsIHByZWZpeCk7Ci0JCQlhcHBseVRleHQoaG9zdEZpbGVUZXh0LCBob3N0RmlsZSk7Ci0JCQlob3N0RmlsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlSG9zdEZpbGUpOwotCQkJYXBwbHlUZXh0KGhvc3RMaXN0VGV4dCwgaG9zdExpc3RUb1RleHQoaG9zdExpc3QpKTsKLQkJCWhvc3RMaXN0QnV0dG9uLnNldFNlbGVjdGlvbih1c2VIb3N0TGlzdCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weVRvU3RvcmFnZSgpIHsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIG51bVByb2NzKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTk9MT0NBTCwgbm9Mb2NhbCk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRVBSRUZJWCwgdXNlUHJlZml4KTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfUFJFRklYLCBwcmVmaXgpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NURklMRSwgdXNlSG9zdEZpbGUpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9IT1NURklMRSwgaG9zdEZpbGUpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NUTElTVCwgdXNlSG9zdExpc3QpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9IT1NUTElTVCwgaG9zdExpc3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxvYWREZWZhdWx0KCkgewotCQkJbnVtUHJvY3MgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUzsKLQkJCW5vTG9jYWwgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OT0xPQ0FMOwotCQkJdXNlUHJlZml4ID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFUFJFRklYOwotCQkJcHJlZml4ID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUFJFRklYOwotCQkJaG9zdEZpbGUgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NURklMRTsKLQkJCXVzZUhvc3RGaWxlID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVEZJTEU7Ci0JCQlob3N0TGlzdCA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RMSVNUOwotCQkJdXNlSG9zdExpc3QgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NUTElTVDsKLQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tU3RvcmFnZSgpIHsKLQkJCXRyeSB7Ci0JCQkJbnVtUHJvY3MgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OVU1QUk9DUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTlVNUFJPQ1MpOwotCQkJCW5vTG9jYWwgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OT0xPQ0FMLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OT0xPQ0FMKTsKLQkJCQl1c2VQcmVmaXggPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VQUkVGSVgsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRVBSRUZJWCk7Ci0JCQkJcHJlZml4ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfUFJFRklYLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVgpOwotCQkJCWhvc3RGaWxlID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVEZJTEUsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RGSUxFKTsKLQkJCQl1c2VIb3N0RmlsZSA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RGSUxFLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NURklMRSk7Ci0JCQkJaG9zdExpc3QgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9IT1NUTElTVCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVExJU1QpOwotCQkJCXVzZUhvc3RMaXN0ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVExJU1QsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RMSVNUKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gaGFuZGxlIGV4Y2VwdGlvbj8KLQkJCQlNUElDSDJVSVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMb2NhbCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCWlmIChudW1Qcm9jcyA8IDEpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9Ob1Byb2Nlc3MpOwotCQkJfQotCQkJaWYgKHVzZVByZWZpeCAmJiBwcmVmaXggPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UHJlZml4KTsKLQkJCX0KLQkJCWlmICh1c2VIb3N0RmlsZSAmJiBob3N0RmlsZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlIb3N0ZmlsZSk7Ci0JCQl9Ci0JCQlpZiAodXNlSG9zdExpc3QgJiYgaG9zdExpc3QgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdExpc3QpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnQgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbnRvIG9uZSBob3N0IHBlciBsaW5lCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGhvc3RMaXN0VG9UZXh0KFN0cmluZyBsaXN0KSB7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IGxpc3Quc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXZhbHVlc1tpXS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlyZXN1bHQgKz0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJlc3VsdCArPSB2YWx1ZXNbaV07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgewotCQlyZXR1cm4gbmV3IERhdGFTb3VyY2UodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsICA9IG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX051bWJlclByb2Nlc3Nlcyk7Ci0KLQkJbnVtUHJvY3NTcGlubmVyID0gbmV3IFNwaW5uZXIoY29udHJvbCwgU1dULkJPUkRFUik7Ci0JCW51bVByb2NzU3Bpbm5lci5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJbnVtUHJvY3NTcGlubmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpKTsKLQotCQlmaW5hbCBHcm91cCBvcHRpb25zR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbCwgU1dULk5PTkUpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAzLCAxKSk7Ci0JCW9wdGlvbnNHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9PcHRpb25zR3JvdXApOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlub0xvY2FsQnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vTG9jYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCW5vTG9jYWxCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9Mb2NhbCk7Ci0KLQkJdXNlUHJlZml4QnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXVzZVByZWZpeEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJdXNlUHJlZml4QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX1ByZWZpeCk7Ci0KLQkJcHJlZml4VGV4dCA9IG5ldyBUZXh0KG9wdGlvbnNHcm91cCwgU1dULkJPUkRFUik7Ci0JCXByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCXByZWZpeFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0KLQkJZmluYWwgR3JvdXAgaG9zdEdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJaG9zdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQlob3N0R3JvdXAuc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdEdyb3VwKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlob3N0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJaG9zdEZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKGhvc3RHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9zdEZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCWhvc3RGaWxlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0hvc3RGaWxlKTsKLQotCQlob3N0RmlsZVRleHQgPSBuZXcgVGV4dChob3N0R3JvdXAsIFNXVC5CT1JERVIpOwotCQlob3N0RmlsZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWhvc3RGaWxlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGhvc3RHcm91cCwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQlQaXhlbENvbnZlcnRlciBwaXhlbGNvbnZlcnRlciA9IG5ldyBQaXhlbENvbnZlcnRlcihjb250cm9sKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlnZC53aWR0aEhpbnQgPSBwaXhlbGNvbnZlcnRlci5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0Jyb3dzZSk7Ci0KLQkJaG9zdExpc3RCdXR0b24gPSBuZXcgQnV0dG9uKGhvc3RHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9zdExpc3RCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIGZhbHNlLCBmYWxzZSkpOwotCQlob3N0TGlzdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJaG9zdExpc3RCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdExpc3QpOwotCi0JCWhvc3RMaXN0VGV4dCA9IG5ldyBUZXh0KGhvc3RHcm91cCwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDsKLQkJaG9zdExpc3RUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlob3N0TGlzdFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHVibGljIElBdHRyaWJ1dGU8PywgPywgPz5bXSBnZXRBdHRyaWJ1dGVzKElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlMaXN0PElBdHRyaWJ1dGU8Pyw/LD8+PiBhdHRycyA9IG5ldyBBcnJheUxpc3Q8SUF0dHJpYnV0ZTw/LD8sPz4+KCk7Ci0KLQkJaW50IG51bVByb2NzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05VTVBST0NTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUyk7Ci0JCXRyeSB7Ci0JCQlhdHRycy5hZGQoSm9iQXR0cmlidXRlcy5nZXROdW1iZXJPZlByb2Nlc3Nlc0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobnVtUHJvY3MpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTVBJQ0gyVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfRXhjZXB0aW9uX0ludmFsaWRDb25maWd1cmF0aW9uLCBlKSk7Ci0JCX0KLQotCQlhdHRycy5hZGQoTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5nZXRMYXVuY2hBcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uY2FsY3VsYXRlQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pKSk7Ci0KLQkJcmV0dXJuIGF0dHJzLnRvQXJyYXkobmV3IElBdHRyaWJ1dGU8Pyw/LD8+W2F0dHJzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLAotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05PTE9DQUwsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05PTE9DQUwpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFUFJFRklYLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VQUkVGSVgpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfUFJFRklYLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVgpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVEZJTEUsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RGSUxFKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RGSUxFLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NURklMRSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NUTElTVCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVExJU1QpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVExJU1QsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RMSVNUKTsKLQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXByZWZpeFRleHQuc2V0RW5hYmxlZCh1c2VQcmVmaXhCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChob3N0RmlsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWhvc3RGaWxlVGV4dC5zZXRFbmFibGVkKGhvc3RGaWxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJaG9zdExpc3RUZXh0LnNldEVuYWJsZWQoaG9zdExpc3RCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiMzI1ZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkFTRSA9IE1QSUNIMlVJUGx1Z2luLlBMVUdJTl9JRCArICIubGF1bmNoQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05VTVBST0NTID0gQVRUUl9CQVNFICsgIi5udW1Qcm9jcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05PTE9DQUwgPSBBVFRSX0JBU0UgKyAiLm5vTG9jYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUkVGSVggPSBBVFRSX0JBU0UgKyAiLnByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRVBSRUZJWCA9IEFUVFJfQkFTRSArICIudXNlUHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSE9TVEZJTEUgPSBBVFRSX0JBU0UgKyAiLmhvc3RGaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFSE9TVEZJTEUgPSBBVFRSX0JBU0UgKyAiLnVzZUhvc3RGaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSE9TVExJU1QgPSBBVFRSX0JBU0UgKyAiLmhvc3RMaXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFSE9TVExJU1QgPSBBVFRSX0JBU0UgKyAiLnVzZUhvc3RMaXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVJHVU1FTlRTID0gQVRUUl9CQVNFICsgIi5hcmd1bWVudHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTID0gQVRUUl9CQVNFICsgIi51c2VEZWZhdWx0QXJndW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUEFSQU1FVEVSUyA9IEFUVFJfQkFTRSArICIucGFyYW1ldGVycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTID0gQVRUUl9CQVNFICsgIi51c2VEZWZhdWx0UGFyYW1ldGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlQXJndW1lbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUykpIHsKLQkJCVN0cmluZyBsYXVuY2hBcmdzID0gIi1ucCAiICsgSW50ZWdlci50b1N0cmluZyhjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX05VTVBST0NTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUykpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9OT0xPQ0FMLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OT0xPQ0FMKSkgewotCQkJCWxhdW5jaEFyZ3MgKz0gIiAtbm9sb2NhbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRVBSRUZJWCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFUFJFRklYKSkgewotCQkJCWxhdW5jaEFyZ3MgKz0gIiAtLXByZWZpeCAiICsgZml4U3RyaW5nKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfUFJFRklYLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfVVNFSE9TVEZJTEUsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RGSUxFKSkgewotCQkJCWxhdW5jaEFyZ3MgKz0gIiAtaG9zdGZpbGUgIiArIGZpeFN0cmluZyhjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0hPU1RGSUxFLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NURklMRSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VIT1NUTElTVCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVExJU1QpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ob3N0ICIgKyBmaXhTdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9IT1NUTElTVCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVExJU1QpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoISBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUykpIHsKLQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfUEFSQU1FVEVSUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUEFSQU1FVEVSUyk7Ci0JCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW0gOiBwYXJhbXMuZW50cnlTZXQoKSkgewotCQkJCQlsYXVuY2hBcmdzICs9ICIgLW1jYSAiICsgcGFyYW0uZ2V0S2V5KCkgKyAiICIgKyBmaXhTdHJpbmcocGFyYW0uZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsYXVuY2hBcmdzOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGxhdW5jaEFyZ3MgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0FSR1VNRU5UUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTKTsKLQkJCXJldHVybiBsYXVuY2hBcmdzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFrZSBzdHJpbmcgc3VpdGFibGUgZm9yIHBhc3NpbmcgYXMgYW4gYXJndW1lbnQKLQkgKgotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBmaXhTdHJpbmcoU3RyaW5nIHMpIHsKLQkJLy8gVE9ETyBpcyB0aGF0IHJpZ2h0IGFuZCBlc2NhcGVkIGNvcnJlY3RseT8KLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJcmV0dXJuICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiXCIiICsgcyArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYzEyYmUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzIHsKLQlwdWJsaWMgc3RhdGljIGludCBBVFRSX05VTVBST0NTOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX05PTE9DQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfSE9TVEZJTEU7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFSE9TVEZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9IT1NUTElTVDsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9VU0VIT1NUTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSX0FSR1VNRU5UUzsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gQVRUUl9QQVJBTUVURVJTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlM7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdHNSZXNvdXJjZVBhdGggPSAiL2RhdGEvbGF1bmNoLWRlZmF1bHRzLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZERlZmF1bHRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlQYXRoIGRlZmF1bHRzUHJvcGVydGllc1BhdGggPSBuZXcgUGF0aChkZWZhdWx0c1Jlc291cmNlUGF0aCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBNUElDSDJVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHJlYWQoZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgYnVuZGxlKTsKLQotCQlBVFRSX05VTVBST0NTID0gZ2V0SW50ZWdlcihidW5kbGUsIHByb3BlcnRpZXMsICJOVU1QUk9DUyIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfTk9MT0NBTCA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiTk9MT0NBTCIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfUFJFRklYID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIlBSRUZJWCIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfVVNFUFJFRklYID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VQUkVGSVgiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX0hPU1RGSUxFID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkhPU1RGSUxFIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9VU0VIT1NURklMRSA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiVVNFSE9TVEZJTEUiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX0FSR1VNRU5UUyA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJBUkdVTUVOVFMiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRURFRkFVTFRBUkdVTUVOVFMiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VERUZBVUxUUEFSQU1FVEVSUyIpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0IEFUVFJfUFJFRklYICE9IG51bGw7Ci0JCWFzc2VydCBBVFRSX0hPU1RGSUxFICE9IG51bGw7Ci0JCWFzc2VydCBBVFRSX0FSR1VNRU5UUyAhPSBudWxsOwotCQkvLyBUT0RPOiByZWFkIEFUVFJfUEFSQU1FVEVSUwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyByZWFkKFBhdGggZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgQnVuZGxlIGJ1bmRsZSkKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtOwotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJaW5TdHJlYW0gPSBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGJ1bmRsZSwgZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgZmFsc2UpOwotCQkJcHJvcGVydGllcy5sb2FkKGluU3RyZWFtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgTVBJQ0gyVUlQbHVnaW4uY29yZUVycm9yRXhjZXB0aW9uKE1lc3NhZ2VzLk1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGUsIGUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19NaXNzaW5nVmFsdWUsIGtleSkpKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZWdlcihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyLCBrZXkpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmFiNmEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLkFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5NUElDSDJSZXNvdXJjZU1hbmFnZXI7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkb0NyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyIHJtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgTmV3TVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJUmVzb3VyY2VNYW5hZ2VyPiBnZXRSZXNvdXJjZU1hbmFnZXJDbGFzcygpIHsKLQkJcmV0dXJuIE1QSUNIMlJlc291cmNlTWFuYWdlci5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL05ld01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL05ld01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNGJkZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9OZXdNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guRXh0ZW5kYWJsZVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGV4dGVuZHMgRXh0ZW5kYWJsZVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgewotCi0JcHVibGljIE5ld01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIoSVJlc291cmNlTWFuYWdlciBybSkgewotCQlzdXBlcigpOwotCQlhZGREeW5hbWljVGFiKG5ldyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIoKSk7Ci0JCWFkZER5bmFtaWNUYWIobmV3IEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YzhhNTUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyVUlQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0FyZ3VtZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfRGVmYXVsdEFyZ3VtZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfRGVmYXVsdE1DQVBhcmFtZXRlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0xhdW5jaEFyZ3VtZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTUNBUGFyYW1ldGVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfUEFyYW1ldGVyVGFibGVfQ29sdW1uX05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1BhcmFtZXRlclRhYmxlX0NvbHVtbl9WYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0V4Y2VwdGlvbl9JbnZhbGlkQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9CeVNsb3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0hvc3RGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob0xvY2FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob092ZXJzdWJzY3JpYmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX051bWJlclByb2Nlc3NlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfUHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdEdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9Ib3N0TGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfT3B0aW9uc0dyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdGZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlIb3N0TGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9Ob1Byb2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19NaXNzaW5nVmFsdWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUHJlZmVyZW5jZVBhZ2VfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9WZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9Ob1ZlcnNpb25TZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIFByZXZlbnQgaW5zdGFuY2VzLgotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2N2ZmYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1NUElDSDJVSVBsdWdpbl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvcgotCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQXJndW1lbnRzPUFyZ3VtZW50czoKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0QXJndW1lbnRzPVVzZSBkZWZhdWx0IGFyZ3VtZW50cwotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRNQ0FQYXJhbWV0ZXJzPVVzZSBkZWZhdWx0IHBhcmFtZXRlcnMKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9MYXVuY2hBcmd1bWVudHM9TGF1bmNoIGFyZ3VtZW50cwotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX01DQVBhcmFtZXRlcnM9TUNBIFBhcmFtZXRlcnMKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QQXJhbWV0ZXJUYWJsZV9Db2x1bW5fTmFtZT1OYW1lCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfUGFyYW1ldGVyVGFibGVfQ29sdW1uX1ZhbHVlPVZhbHVlCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU9QWR2YW5jZWQgTVBJQ0gyCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUFyZ3VtZW50cz1Bcmd1bWVudHMgY2Fubm90IGJlIGVtcHR5Ci1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVBhcmFtZXRlcj1QYXJhbWV0ZXIgdmFsdWUgY2Fubm90IGJlIGVtcHR5Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfRXhjZXB0aW9uX0ludmFsaWRDb25maWd1cmF0aW9uPUludmFsaWQgY29uZmlndXJhdGlvbgotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0Jyb3dzZT1Ccm93c2UKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9CeVNsb3Q9Qnkgc2xvdAotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0hvc3RGaWxlPUhvc3QgZmlsZToKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob0xvY2FsPU5vIGxvY2FsCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9PdmVyc3Vic2NyaWJlPU5vIG92ZXJzdWJzY3JpYmUKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9OdW1iZXJQcm9jZXNzZXM9TnVtYmVyIG9mIHByb2Nlc3NlczoKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9QcmVmaXg9UHJlZml4OgotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlPUJhc2ljIE1QSUNIMgotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RHcm91cD1Ib3N0cwotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RMaXN0PUhvc3QgbGlzdDoKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9PcHRpb25zR3JvdXA9T3B0aW9ucwotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlIb3N0ZmlsZT1NdXN0IHByb3ZpZGUgYSBob3N0IGZpbGUKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdExpc3Q9TXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBob3N0IG5hbWUKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UHJlZml4PVByZWZpeCBjYW5ub3QgYmUgZW1wdHkKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX05vUHJvY2Vzcz1NdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHByb2Nlc3MKLU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGU9RmFpbGVkIHRvIHJlYWQgcHJvcGVydGllcyBmaWxlIHdpdGggZGVmYXVsdCBwcmVmZXJlbmNlcy4KLU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI9RmFpbGVkIHRvIHBhcnNlIGludGVnZXIgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfTWlzc2luZ1ZhbHVlPU1pc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci0KLU1QSUNIMlByZWZlcmVuY2VQYWdlX1RpdGxlPU1QSUNIMiBwcmVmZXJlbmNlcwotCi1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25maWd1cmUgdGhlIE1QSUNIMiB0b29sCi1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9WZXJzaW9uPU1QSUNIMiB2ZXJzaW9uOgotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTmFtZT1NUElDSDIKLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlPU1QSUNIMiB0b29sIGNvbmZpZ3VyYXRpb24KLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTm9WZXJzaW9uU2VsZWN0ZWQ9Tm8gTVBJQ0gyIHZlcnNpb24gc2VsZWN0ZWQKLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTI9TVBJQ0gyCi1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEzPU1QSUNIMgotTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbj1FbnRlciBNUElDSDIgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZT1NUElDSDIgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3ByZWZlcmVuY2VzL0VtcHR5UGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9wcmVmZXJlbmNlcy9FbXB0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2YWQ0Yy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3ByZWZlcmVuY2VzL0VtcHR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5UGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBFbXB0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gRW1wdHkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvcHJlZmVyZW5jZXMvTVBJQ0gyUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvcHJlZmVyZW5jZXMvTVBJQ0gyUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYmRiOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3ByZWZlcmVuY2VzL01QSUNIMlByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLk1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBNUElDSDJQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYLCBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLk1QSUNIMl9DQVBBQklMSVRJRVMsIE1lc3NhZ2VzLk1QSUNIMlByZWZlcmVuY2VQYWdlX1RpdGxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkNTYwMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkcy5BYnN0cmFjdENvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLndpemFyZHMuV2l6YXJkUGFnZURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLndpemFyZHMuV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsKLQotCVN0cmluZyB2ZXJzaW9uSWRzW10gPSBuZXcgU3RyaW5nW10geyB9OwotCVN0cmluZyB2ZXJzaW9uc05hbWVzW10gPSBuZXcgU3RyaW5nW10geyBNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEyLCBNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEzfTsKLQotCXByb3RlY3RlZCBDb21ibyB2ZXJzaW9uQ29tYm87Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLldpZGdldExpc3RlbmVyIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvTW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLQkJCXN1cGVyLmRvTW9kaWZ5VGV4dChldnQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHZlcnNpb25Db21ibykgewotCQkJCWhhbmRsZVZlcnNpb25TZWxlY3RlZCgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQkJZ2V0RGF0YVNvdXJjZSgpLnN0b3JlQW5kVmFsaWRhdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5EYXRhU291cmNlIHsKLQkJcHJvdGVjdGVkIERhdGFTb3VyY2UoQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCXByaXZhdGUgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlGcm9tRmllbGRzKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJc3VwZXIuY29weUZyb21GaWVsZHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9GaWVsZHMoKSB7Ci0JCQlzdXBlci5jb3B5VG9GaWVsZHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQlzdXBlci5sb2FkRnJvbVN0b3JhZ2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgewotCQkJc3VwZXIuY29weVRvU3RvcmFnZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlzdXBlci52YWxpZGF0ZUxvY2FsKCk7Ci0JCX0KLQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRDb25maWcoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkJdGhpcy5jb25maWcgPSAoTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjsKLQkJCXN1cGVyLnNldENvbmZpZyhjb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXaXphcmRQYWdlV2lkZ2V0TGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV2l6YXJkUGFnZURhdGFTb3VyY2UgY3JlYXRlRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIG5ldyBEYXRhU291cmNlKHRoaXMpOwotCX0KLQotCXB1YmxpYyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZShSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCXN1cGVyKHdpemFyZCwgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5NUElDSDJfQ0FQQUJJTElUSUVTLCAKLQkJCQlNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9OYW1lLCAKLQkJCQlNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZSwgCi0JCQkJTWVzc2FnZXMuTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9DcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZUNvbnRlbnRzKGNvbnRlbnRzKTsKLQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbnRlbnRzLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8qCi0JCSAqIFNlbGVjdGlvbiBmb3Igb3Blbm1waSB2ZXJzaW9uLgotCQkgKi8KLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLk1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1ZlcnNpb24pOwotCi0JCXZlcnNpb25Db21ibyA9IG5ldyBDb21ibyhjb250ZW50cywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXZlcnNpb25Db21iby5hZGQodmVyc2lvbnNOYW1lc1tpXSk7Ci0JCX0KLQkJdmVyc2lvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFdpZGdldExpc3RlbmVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZVZlcnNpb25TZWxlY3RlZCgpIHsKLQkJZ2V0V2lkZ2V0TGlzdGVuZXIoKS5kaXNhYmxlKCk7Ci0JCURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IChEYXRhU291cmNlKSB0aGlzLmdldERhdGFTb3VyY2UoKTsKLQkJZGF0YVNvdXJjZS5qdXN0VmFsaWRhdGUoKTsKLQkJU3RyaW5nIGxhdW5jaENtZCA9IG51bGw7Ci0JCVN0cmluZyBkZWJ1Z0NtZCA9IG51bGw7Ci0JCVN0cmluZyBkaXNjb3ZlckNtZCA9IG51bGw7Ci0JCVN0cmluZyByZW1vdGVJbnN0YWxsUGF0aCA9IG51bGw7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJbGF1bmNoQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0xBVU5DSF9DTUQpOwotCQlkZWJ1Z0NtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpOwotCQlkaXNjb3ZlckNtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpOwotCQlyZW1vdGVJbnN0YWxsUGF0aCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19SRU1PVEVfSU5TVEFMTF9QQVRIKTsKLQkJcmVzZXRFcnJvck1lc3NhZ2VzKCk7Ci0JCWRhdGFTb3VyY2Uuc2V0Q29tbWFuZEZpZWxkcyhsYXVuY2hDbWQsIGRlYnVnQ21kLCBkaXNjb3ZlckNtZCwgbnVsbCwgMCwgbnVsbCwgZGF0YVNvdXJjZS5nZXRSZW1vdGVJbnN0YWxsUGF0aCgpKTsKLQkJZGF0YVNvdXJjZS5zZXRVc2VEZWZhdWx0cyh0cnVlKTsKLQkJZGF0YVNvdXJjZS5jb3B5VG9GaWVsZHMoKTsKLQkJZ2V0V2lkZ2V0TGlzdGVuZXIoKS5lbmFibGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2YjMwYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLndpemFyZHMuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZShSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCXN1cGVyKHdpemFyZCwgTWVzc2FnZXMuTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLk1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvd2l6YXJkcy9NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTNhOTcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5IGV4dGVuZHMgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgewotCi0JcHVibGljIE1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5KCkgewotCQkvLyBuby1vcAotCX0KLQotCXByb3RlY3RlZCBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW10gZ2V0TVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VzKFJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsKLQkJcmV0dXJuIG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW10gewotCQkJCW5ldyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSh3aXphcmQpCi0JCX07Ci0JfQotCi0JLy8JQE92ZXJyaWRlCi0JQE92ZXJyaWRlCi0JcHVibGljIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSBnZXRQYWdlcyhSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCUxpc3Q8Uk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Uk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZT4oKTsKLQkJbGlzdC5hZGQobmV3IE1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2Uod2l6YXJkKSk7Ci0JCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0TVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VzKHdpemFyZCkpKTsKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZVtsaXN0LnNpemUoKV0pOwotCX0KLQotCS8vCUBPdmVycmlkZQotCUBPdmVycmlkZQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlckZhY3Rvcnk+IGdldFJNRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvLmNsYXNzcGF0aCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLy5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWMxOTU5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFlMzU0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jTW9uIE9jdCAwNiAxNDozNjo0NCBHTVQtMDM6MDAgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGIzNTg1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUElQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5zZWFyY2gKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUubWVzc2FnZXMsCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucGFyYW1ldGVycywKLSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYWJvdXQuaHRtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYWJvdXQuaW5pIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYWJvdXQubWFwcGluZ3MgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjhlZjUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTkxTX01FU1NBR0VGT1JNQVRfTk9ORQotIyBOTFNfRU5DT0RJTkc9VVRGLTgKLQotYmx1cmI9UFRQIE9wZW4gTVBJIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyMWY4OS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZGF0YS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2RhdGEvZGVmYXVsdHMtT3Blbk1QSS0xLjIucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9kYXRhL2RlZmF1bHRzLU9wZW5NUEktMS4yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTQ3M2IuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2RhdGEvZGVmYXVsdHMtT3Blbk1QSS0xLjIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTEFVTkNIX0NNRD1tcGlydW4gLWRpc3BsYXktbWFwICR7T3Blbl9NUElfYXJnc30gJHtPcGVuX01QSV9lbnZ9ICR7ZXhlY1BhdGh9LyR7ZXhlY05hbWV9ICR7cHJvZ0FyZ3N9Ci1ERUJVR19DTUQ9bXBpcnVuIC1kaXNwbGF5LW1hcCAke09wZW5fTVBJX2FyZ3N9ICR7T3Blbl9NUElfZW52fSAke2RlYnVnRXhlY1BhdGh9LyR7ZGVidWdFeGVjTmFtZX0gJHtkZWJ1Z0FyZ3N9Ci1ESVNDT1ZFUl9DTUQ9b21waV9pbmZvIC1hIC0tcGFyc2VhYmxlCi1QQVRIPQotVVNFX0RFRkFVTFRTPXRydWUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9kYXRhL2RlZmF1bHRzLU9wZW5NUEktMS4zLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvZGF0YS9kZWZhdWx0cy1PcGVuTVBJLTEuMy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGU0M2YyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9kYXRhL2RlZmF1bHRzLU9wZW5NUEktMS4zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUxBVU5DSF9DTUQ9bXBpcnVuIC1tY2Egb3J0ZV9zaG93X3Jlc29sdmVkX25vZGVuYW1lcyAxIC14bWwgLWRpc3BsYXktbWFwICR7T3Blbl9NUElfYXJnc30gJHtPcGVuX01QSV9lbnZ9ICR7ZXhlY1BhdGh9LyR7ZXhlY05hbWV9ICR7cHJvZ0FyZ3N9Ci1ERUJVR19DTUQ9bXBpcnVuIC1tY2Egb3J0ZV9zaG93X3Jlc29sdmVkX25vZGVuYW1lcyAxIC14bWwgLWRpc3BsYXktbWFwICR7T3Blbl9NUElfYXJnc30gJHtPcGVuX01QSV9lbnZ9ICR7ZGVidWdFeGVjUGF0aH0vJHtkZWJ1Z0V4ZWNOYW1lfSAke2RlYnVnQXJnc30KLURJU0NPVkVSX0NNRD1vbXBpX2luZm8gLWEgLS1wYXJzZWFibGUKLVBBVEg9Ci1VU0VfREVGQVVMVFM9dHJ1ZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL2VjbGlwc2UzMi5wbmcgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2NjlkZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIE9wZW4gTVBJIFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvcGx1Z2luLnhtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTg1YThjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLmNvcmUucmVzb3VyY2VNYW5hZ2VycyI+Ci0gICAgICA8cmVzb3VyY2VNYW5hZ2VyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucm1zeXN0ZW0uT3Blbk1QSVJlc291cmNlTWFuYWdlckZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLm9wZW5tcGkuY29yZS5yZXNvdXJjZW1hbmFnZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSTEyRGVmYXVsdHMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSTEyRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MWU4Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUEkxMkRlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJMTJEZWZhdWx0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQVVOQ0hfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUJVR19DTUQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0NPVkVSX0NNRCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFUSCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFVTRV9ERUZBVUxUUyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRzUmVzb3VyY2VQYXRoID0gIi9kYXRhL2RlZmF1bHRzLU9wZW5NUEktMS4yLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZERlZmF1bHRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlQYXRoIGRlZmF1bHRzUHJvcGVydGllc1BhdGggPSBuZXcgUGF0aChkZWZhdWx0c1Jlc291cmNlUGF0aCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBPcGVuTVBJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gcmVhZChkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBidW5kbGUpOwotCi0JCUxBVU5DSF9DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiTEFVTkNIX0NNRCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHX0NNRCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJERUJVR19DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlESVNDT1ZFUl9DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiRElTQ09WRVJfQ01EIik7IC8vJE5PTi1OTFMtMSQKLQkJUEFUSCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQQVRIIik7IC8vJE5PTi1OTFMtMSQKLQkJVVNFX0RFRkFVTFRTID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VfREVGQVVMVFMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydCBMQVVOQ0hfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBERUJVR19DTUQgIT0gbnVsbDsKLQkJYXNzZXJ0IERJU0NPVkVSX0NNRCAhPSBudWxsOwotCQlhc3NlcnQgUEFUSCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyByZWFkKFBhdGggZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgQnVuZGxlIGJ1bmRsZSkKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtOwotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJaW5TdHJlYW0gPSBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGJ1bmRsZSwgZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgZmFsc2UpOwotCQkJcHJvcGVydGllcy5sb2FkKGluU3RyZWFtKTsKLQotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IE9wZW5NUElQbHVnaW4uY29yZUVycm9yRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUEkxMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZSwgZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUEkxMkRlZmF1bHRzX01pc3NpbmdWYWx1ZSwga2V5KSkpOwotCQllbHNlCi0JCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZWdlcihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJMTJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXIsIGtleSkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCBrZXkpOwotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiMWIyNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9wZW5tcGktMS4yLSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBPcGVuTVBJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCU9wZW5NUElQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gT3Blbk1QSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gSW5pdGlhbGl6ZSBvbmx5IHByZWZlcmVuY2VzIGFzIGluIE9wZW5NcGlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLk9QRU5NUElfQ0FQQUJJTElUSUVTCi0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfTEFVTkNIX0NNRCwgT3Blbk1QSTEyRGVmYXVsdHMuTEFVTkNIX0NNRCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfREVCVUdfQ01ELCBPcGVuTVBJMTJEZWZhdWx0cy5ERUJVR19DTUQpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX0RJU0NPVkVSX0NNRCwgT3Blbk1QSTEyRGVmYXVsdHMuRElTQ09WRVJfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19SRU1PVEVfSU5TVEFMTF9QQVRILCBPcGVuTVBJMTJEZWZhdWx0cy5QQVRIKTsKLQkJLy8JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfVVNFX0RFRkFVTFRTLCBPcGVuTVBJMTJEZWZhdWx0cy5VU0VfREVGQVVMVFMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSTEzRGVmYXVsdHMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSTEzRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiMDY1ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUEkxM0RlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJMTNEZWZhdWx0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQVVOQ0hfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUJVR19DTUQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0NPVkVSX0NNRCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFUSCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFVTRV9ERUZBVUxUUyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRzUmVzb3VyY2VQYXRoID0gIi9kYXRhL2RlZmF1bHRzLU9wZW5NUEktMS4zLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZERlZmF1bHRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlQYXRoIGRlZmF1bHRzUHJvcGVydGllc1BhdGggPSBuZXcgUGF0aChkZWZhdWx0c1Jlc291cmNlUGF0aCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBPcGVuTVBJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gcmVhZChkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBidW5kbGUpOwotCi0JCUxBVU5DSF9DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiTEFVTkNIX0NNRCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHX0NNRCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJERUJVR19DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlESVNDT1ZFUl9DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiRElTQ09WRVJfQ01EIik7IC8vJE5PTi1OTFMtMSQKLQkJUEFUSCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJQQVRIIik7IC8vJE5PTi1OTFMtMSQKLQkJVVNFX0RFRkFVTFRTID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VfREVGQVVMVFMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydCBMQVVOQ0hfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBERUJVR19DTUQgIT0gbnVsbDsKLQkJYXNzZXJ0IERJU0NPVkVSX0NNRCAhPSBudWxsOwotCQlhc3NlcnQgUEFUSCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyByZWFkKFBhdGggZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgQnVuZGxlIGJ1bmRsZSkKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtOwotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJaW5TdHJlYW0gPSBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGJ1bmRsZSwgZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCwgZmFsc2UpOwotCQkJcHJvcGVydGllcy5sb2FkKGluU3RyZWFtKTsKLQotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IE9wZW5NUElQbHVnaW4uY29yZUVycm9yRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUEkxM0RlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZSwgZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSTEzRGVmYXVsdHNfTWlzc2luZ1ZhbHVlLCBrZXkpKSk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludGVnZXIoQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsIGtleSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSTEzRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyLCBrZXkpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTk0MzguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAib3Blbm1waS0xLjMtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIE9wZW5NUElQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJT3Blbk1QSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBPcGVuTVBJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBJbml0aWFsaXplIG9ubHkgcHJlZmVyZW5jZXMgYXMgaW4gT3Blbk1waVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uT1BFTk1QSV9DQVBBQklMSVRJRVMKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19MQVVOQ0hfQ01ELCBPcGVuTVBJMTNEZWZhdWx0cy5MQVVOQ0hfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19ERUJVR19DTUQsIE9wZW5NUEkxM0RlZmF1bHRzLkRFQlVHX0NNRCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfRElTQ09WRVJfQ01ELCBPcGVuTVBJMTNEZWZhdWx0cy5ESVNDT1ZFUl9DTUQpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgsIE9wZW5NUEkxM0RlZmF1bHRzLlBBVEgpOwotCQkvLwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19VU0VfREVGQVVMVFMsIE9wZW5NUEkxM0RlZmF1bHRzLlVTRV9ERUZBVUxUUyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmNzMyMC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RJVkVfT1BFTl9NUElfRU5WX0FUVFJfSUQgPSAiT3Blbl9NUElfZW52IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RJVkVfT1BFTl9NUElfUFJPR19BUkdTX0FUVFJfSUQgPSAiT3Blbl9NUElfcHJvZ0FyZ3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVGRkVDVElWRV9PUEVOX01QSV9XT1JLSU5HX0RJUl9BVFRSX0lEID0gIk9wZW5fTVBJX3dvcmtpbmdEaXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlZmZlY3RpdmVPcGVuTVBJRW52QXR0ckRlZiA9Ci0JCW5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPihFRkZFQ1RJVkVfT1BFTl9NUElfRU5WX0FUVFJfSUQsIE1lc3NhZ2VzLk9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSUVudkF0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVPcGVuTVBJRW52QXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbnVsbCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlZmZlY3RpdmVPcGVuTVBJUHJvZ0FyZ3NBdHRyRGVmID0KLQkJbmV3IEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+KEVGRkVDVElWRV9PUEVOX01QSV9QUk9HX0FSR1NfQVRUUl9JRCwgTWVzc2FnZXMuT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVPcGVuTVBJUHJvZ0FyZ3NBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSVByb2dBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbnVsbCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGVmZmVjdGl2ZU9wZW5NUElXb3JraW5nRGlyQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEVGRkVDVElWRV9PUEVOX01QSV9XT1JLSU5HX0RJUl9BVFRSX0lELCBNZXNzYWdlcy5PcGVuTVBJQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU9wZW5NUElXb3JraW5nRGlyQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5PcGVuTVBJQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU9wZW5NUElXb3JraW5nRGlyQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBPcGVuIE1QSSBoYXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzZXMuCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVmZmVjdGl2ZU9wZW5NUElFbnZBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZWZmZWN0aXZlT3Blbk1QSUVudkF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogUHJvZ3JhbSBhcmd1bWVudHMgdGhhdCBPcGVuIE1QSSBoYXMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzZXMuCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVmZmVjdGl2ZU9wZW5NUElQcm9nQXJnc0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlZmZlY3RpdmVPcGVuTVBJUHJvZ0FyZ3NBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIFdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIE9wZW4gTVBJIGhhcyBzdGFydGVkIHRoZSBwcm9jZXNzZXMuCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RWZmZWN0aXZlT3Blbk1QSVdvcmtpbmdEaXJBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZWZmZWN0aXZlT3Blbk1QSVdvcmtpbmdEaXJBdHRyRGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSUpvYkF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSUpvYkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0ODgwYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUElKb2JBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBOb2RlIGF0dHJpYnV0ZXMuCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJSm9iQXR0cmlidXRlcyB7Ci0KLQlwdWJsaWMgZW51bSBNYXBwaW5nTW9kZSB7Ci0JCVVOS05PV04sCi0JCUJZX05PREUsCi0JCUJZX1NMT1QKLQl9Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNX01BUFBFRF9OT0RFU19BVFRSX0lEID0gIk9wZW5fTVBJX051bU1hcHBlZE5vZGVzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBJX0pPQl9JRF9BVFRSX0lEID0gIk9wZW5fTVBJX01waUpvYklkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWUElEX1NUQVJUX0FUVFJfSUQgPSAiT3Blbl9NUElfVnBpZFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWUElEX1JBTkdFX0FUVFJfSUQgPSAiT3Blbl9NUElfVnBpZFJhbmdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX01PREVfQVRUUl9JRCA9ICJPcGVuX01QSV9NYXBwaW5nTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVE5BTUVfQVRUUl9JRCA9ICJPcGVuX01QSV9Ib3N0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bU1hcHBlZE5vZGVzRGVmID0KLQkvLwkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKE5VTV9NQVBQRURfTk9ERVNfQVRUUl9JRCwgIk1hcHBlZCBub2RlcyIsCi0JLy8JCQkJIk51bWJlciBvZiBtYXBwZWQgbm9kZXMiLCB0cnVlLCAwKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG1waUpvYklkQXR0ckRlZiA9Ci0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihNUElfSk9CX0lEX0FUVFJfSUQsIE1lc3NhZ2VzLk9wZW5NUElKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5PcGVuTVBJSm9iQXR0cmlidXRlc19tcGlKb2JJZEF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG5ldyBJbnRlZ2VyKDApKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIHZwaWRTdGFydEF0dHJEZWYgPQotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oVlBJRF9TVEFSVF9BVFRSX0lELCBNZXNzYWdlcy5PcGVuTVBJSm9iQXR0cmlidXRlc192cGlkU3RhcnRBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk9wZW5NUElKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG5ldyBJbnRlZ2VyKDApKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIHZwaWRSYW5nZUF0dHJEZWYgPQotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oVlBJRF9SQU5HRV9BVFRSX0lELCBNZXNzYWdlcy5PcGVuTVBJSm9iQXR0cmlidXRlc192cGlkUmFuZ2VBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk9wZW5NUElKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG5ldyBJbnRlZ2VyKDApKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPE1hcHBpbmdNb2RlPiBtYXBwaW5nTW9kZUF0dHJEZWYgPQotCQluZXcgRW51bWVyYXRlZEF0dHJpYnV0ZURlZmluaXRpb248TWFwcGluZ01vZGU+KE1BUFBJTkdfTU9ERV9BVFRSX0lELCBNZXNzYWdlcy5PcGVuTVBJSm9iQXR0cmlidXRlc19tYXBwaW5nTW9kZUF0dHJEZWZfdGl0bGUsIE1lc3NhZ2VzLk9wZW5NUElKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl9kZXNjcmlwdGlvbiwKLQkJCQl0cnVlLCBNYXBwaW5nTW9kZS5VTktOT1dOKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gaG9zdG5hbWVBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSE9TVE5BTUVfQVRUUl9JRCwgTWVzc2FnZXMuT3Blbk1QSUpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX3RpdGxlLCBNZXNzYWdlcy5PcGVuTVBJSm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgYW5kIDEuMwotCSAqLwotCS8vCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0TnVtTWFwcGVkTm9kZXNEZWZpbml0aW9uKCkgewotCS8vCQlyZXR1cm4gbnVtTWFwcGVkTm9kZXNEZWY7Ci0JLy8JfQotCi0JLyoqCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE1waUpvYklkQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG1waUpvYklkQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBvcGVubXBpIDEuMiBvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0VnBpZFN0YXJ0QXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHZwaWRTdGFydEF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldFZwaWRSYW5nZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB2cGlkUmFuZ2VBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0ZWRBdHRyaWJ1dGVEZWZpbml0aW9uPE1hcHBpbmdNb2RlPiBnZXRNYXBwaW5nTW9kZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBtYXBwaW5nTW9kZUF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogb3Blbm1waSAxLjIgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0SG9zdG5hbWVBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gaG9zdG5hbWVBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117bXBpSm9iSWRBdHRyRGVmLHZwaWRTdGFydEF0dHJEZWYsdnBpZFJhbmdlQXR0ckRlZixtYXBwaW5nTW9kZUF0dHJEZWZ9OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUElMYXVuY2hBdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL09wZW5NUElMYXVuY2hBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODQ3MDYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJTGF1bmNoQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BcnJheUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBPTVBJLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJTGF1bmNoQXR0cmlidXRlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9BUkdTX0FUVFJfSUQgPSAiT3Blbl9NUElfYXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX0tFWVNfQVRUUl9JRCA9ICJPcGVuX01QSV9lbnZLZXlzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfQVJHU19BVFRSX0lEID0gIk9wZW5fTVBJX2VudiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gbGF1bmNoQXJnc0F0dHJEZWYgPQotCQluZXcgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbihMQVVOQ0hfQVJHU19BVFRSX0lELCBNZXNzYWdlcy5PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbiwgZmFsc2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZW52aXJvbm1lbnRLZXlBdHRyRGVmID0gbmV3IEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+KAotCQkJRU5WX0tFWVNfQVRUUl9JRCwgTWVzc2FnZXMuT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX3RpdGxlLAotCQkJTWVzc2FnZXMuT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX2Rlc2NyaXB0aW9uLCBmYWxzZSwKLQkJCW5ldyBTdHJpbmdbMF0pOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBlbnZpcm9ubWVudEFyZ3NBdHRyRGVmID0gbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oCi0JCQlFTlZfQVJHU19BVFRSX0lELCBNZXNzYWdlcy5PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX3RpdGxlLCBNZXNzYWdlcy5PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uLCBmYWxzZSwKLQkiJHtPcGVuX01QSV9lbnZLZXlzOjogLXggOjoteCA6fSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMaXN0IG9mIG5hbWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLgotCSAqIDxwPgotCSAqIE5vdGU6IG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGdldEVudmlyb25tZW50S2V5c0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBlbnZpcm9ubWVudEtleUF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgYXBwbGljYXRpb24sIGFzIGV4cGVjdGVkIGJ5IG9wZW5tcGkgY29tbWFuZCBsaW5lLgotCSAqIDxwPgotCSAqIE5vdGU6IG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RW52aXJvbm1lbnRBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVudmlyb25tZW50QXJnc0F0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogQXJndW1lbnRzIGZvciB0aGUgYXBwbGljYXRpb24sIGFzIGV4cGVjdGVkIGJ5IG9wZW5tcGkgY29tbWFuZCBsaW5lLgotCSAqIDxwPgotCSAqIE5vdGU6IG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0TGF1bmNoQXJndW1lbnRzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGxhdW5jaEFyZ3NBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117Ci0JCQkJbGF1bmNoQXJnc0F0dHJEZWYsZW52aXJvbm1lbnRBcmdzQXR0ckRlZixlbnZpcm9ubWVudEtleUF0dHJEZWYKLQkJfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJTWFjaGluZUF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSU1hY2hpbmVBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzhhODAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJTWFjaGluZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBOb2RlIGF0dHJpYnV0ZXMKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSU1hY2hpbmVBdHRyaWJ1dGVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfTUVTU0FHRSA9ICJPcGVuX01QSV9zdGF0dXNNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdGF0dXNNZXNzYWdlQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNUQVRVU19NRVNTQUdFLCBNZXNzYWdlcy5PcGVuTVBJTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuT3Blbk1QSU1hY2hpbmVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0YXR1cyBtZXNzYWdlIGlmIGl0IHdhcyBub3QgcG9zc2libGUgdG8gZGlzY292ZXIgdGhlIG1hY2hpbmUuCi0JICogPHA+Ci0JICogTm90ZTogb3Blbm1waSAxLjIgYW5kIDEuMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXR1c01lc3NhZ2VBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117c3RhdHVzTWVzc2FnZUF0dHJEZWZ9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJTm9kZUF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTdhNjguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJTm9kZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5Cb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0KLS8qKgotICogTm9kZSBhdHRyaWJ1dGVzCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElOb2RlQXR0cmlidXRlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNX05PREVTX0lEID0gIk9wZW5fTVBJX251bU5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTlVNX05PREVTX0lEID0gIk9wZW5fTVBJX21heE51bU5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfTUVTU0FHRSA9ICJPcGVuX01QSV9zdGF0dXNNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSU1VCU0NSSUJFRCA9ICJPcGVuX01QSV9vdmVyc3Vic2NyaWJlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bU5vZGVzQXR0ckRlZiA9Ci0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihOVU1fTk9ERVNfSUQsIE1lc3NhZ2VzLk9wZW5NUElOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbmV3IEludGVnZXIoMCkpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbWF4TnVtTm9kZXNBdHRyRGVmID0KLQkJbmV3IEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uKE1BWF9OVU1fTk9ERVNfSUQsIE1lc3NhZ2VzLk9wZW5NUElOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbmV3IEludGVnZXIoMCkpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdGF0dXNNZXNzYWdlQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNUQVRVU19NRVNTQUdFLCBNZXNzYWdlcy5PcGVuTVBJTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uIG92ZXJzdWJzY3JpYmVkQXR0ckRlZiA9Ci0JCW5ldyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbihPVkVSU1VCU0NSSUJFRCwgTWVzc2FnZXMuT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5PcGVuTVBJTm9kZUF0dHJpYnV0ZXNfb3ZlcnN1YnNjcmliZWRBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCi0JLyoqCi0JICogTnVtYmVyIG9mIHNsb3RzIHN1Z2dlc3RlZCBvbiB0aGUgbm9kZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBvcGVubXBpIDEuMiBhbmQgMS4zCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXROdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG51bU5vZGVzQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBNYXhpbWFsIG51bWJlciBvZiBzbG90cyBvbiB0aGUgbm9kZS4gWmVybyBpZiBub3Qgc2V0LgotCSAqIDxwPgotCSAqIE5vdGU6IG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE1heGltYWxOdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG1heE51bU5vZGVzQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBTdGF0dXMgbWVzc2FnZSBpZiBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2NvdmVyIHRoZSBub2RlLgotCSAqIDxwPgotCSAqIE5vdGU6IG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBzdGF0dXNNZXNzYWdlQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBJZiBub2RlIGlzIG92ZXJzdWJzY3JpYmVkLgotCSAqIDxwPgotCSAqIE5vdGU6IG9wZW5tcGkgMS4yIGFuZCAxLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uIGdldE92ZXJzdWJzY3JpYmVkQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG92ZXJzdWJzY3JpYmVkQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltde251bU5vZGVzQXR0ckRlZixtYXhOdW1Ob2Rlc0F0dHJEZWYsc3RhdHVzTWVzc2FnZUF0dHJEZWZ9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvT3Blbk1QSVBsdWdpbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWYwYTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9PcGVuTVBJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlRvb2xzUk1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgT3Blbk1QSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgT3Blbk1QSVBsdWdpbigpIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCU9wZW5NUEkxMkRlZmF1bHRzLmxvYWREZWZhdWx0cygpOwotCQlPcGVuTVBJMTNEZWZhdWx0cy5sb2FkRGVmYXVsdHMoKTsKLQkJT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7Ci0JCU9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLmluaXRpYWxpemVQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3Blbk1QSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSYWlzZSBjb3JlIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSB0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlLCB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGFuIElTdGF0dXMKLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGEgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhIFRocm93YWJsZQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLk9wZW5NUElQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3IsIGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyCi0JICogCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYmU3ZGUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5tZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUEkxMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJMTJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSTEyRGVmYXVsdHNfTWlzc2luZ1ZhbHVlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUEkxM0RlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJMTNEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSTEzRGVmYXVsdHNfTWlzc2luZ1ZhbHVlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSUVudkF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVPcGVuTVBJRW52QXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU9wZW5NUElQcm9nQXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVPcGVuTVBJUHJvZ0FyZ3NBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSVdvcmtpbmdEaXJBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSVdvcmtpbmdEaXJBdHRyRGVmX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJSm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJSm9iQXR0cmlidXRlc19tcGlKb2JJZEF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJSm9iQXR0cmlidXRlc192cGlkU3RhcnRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50S2V5QXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSU1hY2hpbmVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJTm9kZUF0dHJpYnV0ZXNfbWF4TnVtTm9kZXNBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVJlc291cmNlTWFuYWdlckZhY3RvcnlfUmVzb3VyY2VNYW5hZ2VyTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9kZWZhdWx0UXVldWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkUGFyc2VIb3N0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZFJlYWRIb3N0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZU5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVQYXRoTm90QWJzb2x1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRJbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kTWlzc2luZ0hvc3RGaWxlUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RGaWxlRXJyb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkUGFyc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZU91dHB1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFdpdGhDb2RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSWdub3JlZEludmFsaWRQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9JbnZhbGlkTWF4U2xvdHNQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9JbnZhbGlkU2xvdHNQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSURpc2NvdmVySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9wYXJzaW5nRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElEaXNjb3ZlckpvYl9wcm9jZXNzRXJyb3JNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fTWlzc2luZ0Rpc3BsYXlNYXBJbmZvcm1hdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX0F0dHJpYnV0ZU5vdEludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fTWlzc2luZ0F0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9Vbmtub3duQXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX1Vua25vd25FbGVtZW50OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElSdW50aW1lU3lzdGVtX0pvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0ZhaWxlZFBhcnNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZXNEb05vdE1hdGNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9GYWlsZWRFeGVjdXRlMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJUnVudGltZVN5c3RlbUpvYl9Qcm9jZXNzTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aEV4aXRWYWx1ZTsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwZWY0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLU9wZW5NUEkxMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZT1GYWlsZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBkZWZhdWx0IHByZWZlcmVuY2VzLgotT3Blbk1QSTEyRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyPUZhaWxlZCB0byBwYXJzZSBpbnRlZ2VyIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotT3Blbk1QSTEyRGVmYXVsdHNfTWlzc2luZ1ZhbHVlPU1pc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci0KLU9wZW5NUEkxM0RlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZT1GYWlsZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBkZWZhdWx0IHByZWZlcmVuY2VzLgotT3Blbk1QSTEzRGVmYXVsdHNfRmFpbGVkUGFyc2VJbnRlZ2VyPUZhaWxlZCB0byBwYXJzZSBpbnRlZ2VyIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotT3Blbk1QSTEzRGVmYXVsdHNfTWlzc2luZ1ZhbHVlPU1pc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci0KLU9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSUVudkF0dHJEZWZfZGVzY3JpcHRpb249RWZmZWN0aXZlIGVudmlyb25tZW50IHN1cHBsaWVkIGJ5IE9wZW4gTVBJIHRvIGV4ZWN1dGFibGUgb24gbGF1bmNoCi1PcGVuTVBJQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU9wZW5NUElFbnZBdHRyRGVmX3RpdGxlPUVudmlyb25tZW50IGZvciBPcGVuIE1QSSBwcm9jZXNzZXMKLU9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSVByb2dBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBieSBPcGVuTVBJIHN1cHBsaWVkIHRvIGV4ZWN1dGFibGUKLU9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlT3Blbk1QSVByb2dBcmdzQXR0ckRlZl90aXRsZT1Qcm9ncmFtIEFyZ3VtZW50cyBmb3IgT3BlbiBNUEkgcHJvY2Vzc2VzCi1PcGVuTVBJQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU9wZW5NUElXb3JraW5nRGlyQXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgT3BlbiBNUEkgbGF1bmNoZWQgdGhlIHByb2Nlc3NlcwotT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVPcGVuTVBJV29ya2luZ0RpckF0dHJEZWZfdGl0bGU9V29ya2luZyBEaXJlY3RvcnkgZm9yIE9wZW4gTVBJIHByb2Nlc3NlcwotCi1PcGVuTVBJSm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfZGVzY3JpcHRpb249T3BlbiBNUEkgam9iIGhvc3RuYW1lCi1PcGVuTVBJSm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfdGl0bGU9T3BlbiBNUEkgaG9zdG5hbWUKLU9wZW5NUElKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl9kZXNjcmlwdGlvbj1PcGVuIE1QSSBtYXBwaW5nIG1vZGUKLU9wZW5NUElKb2JBdHRyaWJ1dGVzX21hcHBpbmdNb2RlQXR0ckRlZl90aXRsZT1PcGVuIE1QSSBtYXBwaW5nIG1vZGUKLU9wZW5NUElKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl9kZXNjcmlwdGlvbj1PcGVuIE1QSSBqb2IgaWQKLU9wZW5NUElKb2JBdHRyaWJ1dGVzX21waUpvYklkQXR0ckRlZl90aXRsZT1PcGVuIE1QSSBqb2IgaWQKLU9wZW5NUElKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfZGVzY3JpcHRpb249T3BlbiBNUEkgdnBpZCByYW5nZQotT3Blbk1QSUpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl90aXRsZT1PcGVuIE1QSSB2cGlkIHJhbmdlCi1PcGVuTVBJSm9iQXR0cmlidXRlc192cGlkU3RhcnRBdHRyRGVmX2Rlc2NyaXB0aW9uPU9wZW4gTVBJIHZwaWQgc3RhcnQKLU9wZW5NUElKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfdGl0bGU9T3BlbiBNUEkgdnBpZCBzdGFydAotCi1PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uPUNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgZWFjaCBPcGVuIE1QSSBwcm9jZXNzZXMKLU9wZW5NUElMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfdGl0bGU9T3BlbiBNUEkgRW52aXJvbm1lbnQgYXJndW1lbnRzCi1PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfZGVzY3JpcHRpb249TmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3VwcGxpZWQgdG8gdGhlIGVhY2ggT3BlbiBNUEkgcHJvY2Vzc2VzCi1PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfdGl0bGU9T3BlbiBNUEkgZW52aXJvbm1lbnQgdmFyaWFibGVzCi1PcGVuTVBJTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1Db21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBPcGVuIE1QSQotT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfdGl0bGU9T3BlbiBNUEkgYXJndW1lbnRzCi0KLU9wZW5NUElNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbj1PcGVuIE1QSSBzdGF0dXMgbWVzc2FnZQotT3Blbk1QSU1hY2hpbmVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX3RpdGxlPU9wZW4gTVBJIHN0YXR1cyBtZXNzYWdlCi0KLU9wZW5NUElOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb249T3BlbiBNUEkgbWF4aW1hbCBudW1iZXIgb2Ygbm9kZXMgb24gdGhlIGhvc3QKLU9wZW5NUElOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfdGl0bGU9T3BlbiBNUEkgbWF4aW1hbCBudW1iZXIgb2Ygbm9kZXMKLU9wZW5NUElOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb249T3BlbiBNUEkgbnVtYmVyIG9mIG5vZGVzIG9uIHRoZSBob3N0Ci1PcGVuTVBJTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX3RpdGxlPU9wZW4gTVBJIG51bWJlciBvZiBub2RlcwotT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl9kZXNjcmlwdGlvbj1PcGVuIE1QSSBvdmVyc3Vic2NyaWJlZCBub2RlIChtb3JlIHByb2Nlc3NlcyB0aGFuIGF2YWlsYWJsZSkKLU9wZW5NUElOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfdGl0bGU9T3BlbiBNUEkgb3ZlcnN1YnNjcmliZWQKLU9wZW5NUElOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbj1PcGVuIE1QSSBzdGF0dXMgbWVzc2FnZQotT3Blbk1QSU5vZGVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX3RpdGxlPU9wZW4gTVBJIHN0YXR1cyBtZXNzYWdlCi0KLU9wZW5NUElQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I9SW50ZXJuYWwgZXJyb3IKLQotT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdERlc2NyaXB0aW9uPU9wZW4gTVBJIFJlc291cmNlIE1hbmFnZXIKLU9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHROYW1lPU9wZW5fTVBJCi1PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeV9SZXNvdXJjZU1hbmFnZXJOYW1lPU9wZW4gTVBJCi0KLU9wZW5NUElEaXNjb3ZlckpvYl9kZWZhdWx0UXVldWVOYW1lPWRlZmF1bHQKLU9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkPUVycm9yIHdoaWxlIHJ1bm5pbmcgZGlzY292ZXIgY29tbWFuZDogezB9LgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRQYXJzZUhvc3RGaWxlPUZhaWxlZCB0byBwYXJzZSBob3N0ZmlsZSAoezB9KS4KLU9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkUmVhZEhvc3RGaWxlPUZhaWxlZCByZWFkIGhvc3RmaWxlICh7MH0pLgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZUVtcHR5PUVtcHR5IGhvc3RmaWxlIGlzIG5vdCBhbGxvd2VkICh7MH0pLgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZU5vdEZvdW5kPUZhaWxlZCBmaW5kIGhvc3RmaWxlICh7MH0pLgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZVBhdGhOb3RBYnNvbHV0ZT1EaXNjb3ZlciBjb21tYW5kIGluZm9ybWVkIGEgcGF0aCB0byBob3N0ZmlsZSB0aGF0IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoICh7MH0pLgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRJbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yIHdoaWxlIHJ1bm5pbmcgZGlzY292ZXIgY29tbWFuZDogezB9Ci1PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZE1pc3NpbmdIb3N0RmlsZVBhdGg9RGlzY292ZXIgY29tbWFuZCBkaWQgbm90IGluZm9ybSBwYXRoIHRvIGRlZmF1bHQgaG9zdGZpbGUuIElmIG5lY2Vzc2FyeSwgc2V0IE1DQSBwYXJhbWV0ZXJzIHRvIGRlZmluZSBkZWZhdWx0IGhvc3RmaWxlIHBhdGguCi1PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RGaWxlRXJyb3JzPVRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIGhvc3RmaWxlLgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0RmlsZVBhcnNlRXJyb3I9UGFyc2UgZXJyb3IocykgaW4gaG9zdGZpbGUuCi1PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZD1GYWlsZWQgdG8gcnVuIGNvbW1hbmQgdG8gZ2V0IGhvc3RuYW1lLgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZT1GYWlsZWQgdG8gcGFyc2UgY29tbWFuZCBmb3IgaG9zdG5hbWUuCi1PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFBhcnNlT3V0cHV0PUZhaWxlZCB0byBwYXJzZSBvdXRwdXQgb2YgZGlzY292ZXIgY29tbWFuZC4KLU9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkV2l0aENvZGU9Q29tbWFuZCB0byBnZXQgaG9zdG5hbWUgZmFpbGVkIHdpdGggZXhpdCBjb2RlIHswfQotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9JZ25vcmVkSW52YWxpZFBhcmFtZXRlcj1JbnZhbGlkIHBhcmFtZXRlciB3YXMgaWdub3JlZCBmb3IgdGhpcyBob3N0LgotT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9JbnZhbGlkTWF4U2xvdHNQYXJhbWV0ZXI9SW52YWxpZCAnbWF4LXNsb3RzJyBwYXJhbWV0ZXIgd2FzIGlnbm9yZWQgZm9yIHRoaXMgaG9zdC4KLU9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSW52YWxpZFNsb3RzUGFyYW1ldGVyPUludmFsaWQgJ3Nsb3RzL2NwdXMvY291bnQnIHBhcmFtZXRlciB3YXMgaWdub3JlZCBmb3IgdGhpcyBob3N0LgotT3Blbk1QSURpc2NvdmVySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlPUludGVycnVwdGVkIHdoaWxlIHJ1bm5pbmcgT3BlbiBNUEkgZGlzY292ZXIgY29tbWFuZC4KLU9wZW5NUElEaXNjb3ZlckpvYl9uYW1lPURpc2NvdmVyIE9wZW4gTVBJIG9uIHswfQotT3Blbk1QSURpc2NvdmVySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIHBhcnNlIG91dHB1dCBvZiBPcGVuIE1QSSBkaXNjb3ZlciBjb21tYW5kLgotT3Blbk1QSURpc2NvdmVySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgcHJvY2VzcyBmb3IgT3BlbiBNUEkgZGlzY292ZXIgY29tbWFuZC4KLQotT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0ludmFsaWRMaW5lPUludmFsaWQgb3V0cHV0IGZyb20gT3BlbiBNUEk6IHswfQotT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdEaXNwbGF5TWFwSW5mb3JtYXRpb249T3V0cHV0IGZyb20gT3BlbiBNUEkgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHByb2Nlc3NlcyBhbmQgbm9kZXMuCi1PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uPUluY29tcGxldGUgb3V0cHV0IGZyb20gT3BlbiBNUEkuCi0KLU9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX0F0dHJpYnV0ZU5vdEludGVnZXI9QXR0cmlidXRlIHswfSBpcyBub3QgYW4gdmFsaWQgaW50ZWdlciAoezF9KQotT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fTWlzc2luZ0F0dHJpYnV0ZT1NaXNzaW5nIFhNTCBhdHRyaWJ1dGU6IHswfQotT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkF0dHJpYnV0ZT1Vbmtub3duIFhNTCBhdHRyaWJ1dGU6IHswfQotT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkVsZW1lbnQ9VW5rbm93biBYTUwgZWxlbWVudDogezB9Ci0KLU9wZW5NUElSdW50aW1lU3lzdGVtX0pvYk5hbWU9T3BlbiBNcGkgSm9iCi1PcGVuTVBJUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRmFpbGVkUGFyc2U9RmFpbGVkIHRvIHBhcnNlIE9wZW4gTXBpIHJ1biBjb21tYW5kIG91dHB1dC4KLU9wZW5NUElSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZXNEb05vdE1hdGNoPUhvc3RuYW1lcyBmcm9tIE9wZW4gTVBJIG91dHB1dCBkbyBub3QgbWF0Y2ggZXhwZWN0ZWQgaG9zdG5hbWUuCi1PcGVuTVBJUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRmFpbGVkRXhlY3V0ZTA9Q29tbWFuZCBmYWlsZWQuIFNlZSBvdXRwdXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1PcGVuTVBJUnVudGltZVN5c3RlbUpvYl9Qcm9jZXNzTmFtZT1PcGVuIE1QSSBydW4KLU9wZW5NUElSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GYWlsZWRXaXRoRXhpdFZhbHVlPU9wZW4gTVBJIGFwcGxpY2F0aW9uIHRlcm1pbmF0ZWQgd2l0aCBleGl0IHZhbHVlIHswfS4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcGFyYW1ldGVycy9PbXBpSW5mby5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9wYXJhbWV0ZXJzL09tcGlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzJlYTUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9wYXJhbWV0ZXJzL09tcGlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnBhcmFtZXRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucGFyYW1ldGVycy5QYXJhbWV0ZXJzLlBhcmFtZXRlcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgR3JlZyBXYXRzb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPbXBpSW5mbyBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4ga3ZzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJa3ZzLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgUGFyYW1ldGVyIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gcGFyYW1zLmFkZFBhcmFtZXRlcihuYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9tcGlJbmZvIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJT21waUluZm8gbmV3SW5mbyA9IG5ldyBPbXBpSW5mbygpOwotCQluZXdJbmZvLmt2cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihrdnMpOwotCQluZXdJbmZvLnBhcmFtcyA9IHBhcmFtcy5jbG9uZSgpOwotCQlyZXR1cm4gbmV3SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBrdnMuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIFBhcmFtZXRlcnMuUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gcGFyYW1zLmdldFBhcmFtZXRlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIFBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiBwYXJhbXMuZ2V0UGFyYW1ldGVycygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9wYXJhbWV0ZXJzL1BhcmFtZXRlcnMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcGFyYW1ldGVycy9QYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWVmOGEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9wYXJhbWV0ZXJzL1BhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnBhcmFtZXRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVycyBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JcHVibGljIGNsYXNzIFBhcmFtZXRlciBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBTdHJpbmcgaGVscCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCi0JCXB1YmxpYyBQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBhcmFtZXRlciBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCQlQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKG5hbWUpOwotCQkJcGFyYW0uc2V0VmFsdWUodmFsdWUpOwotCQkJcGFyYW0uc2V0SGVscChoZWxwKTsKLQkJCXBhcmFtLnNldFJlYWRPbmx5KHJlYWRPbmx5KTsKLQkJCXJldHVybiBwYXJhbTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBoZWxwCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEhlbHAoKSB7Ci0JCQlyZXR1cm4gaGVscDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHJlYWRPbmx5Ci0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBoZWxwIHRoZSBoZWxwIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SGVscChTdHJpbmcgaGVscCkgewotCQkJdGhpcy5oZWxwID0gaGVscDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHJlYWRPbmx5IHRoZSByZWFkT25seSB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyPigpOwotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHsKLQkJcGFyYW1zLnB1dChwYXJhbS5nZXROYW1lKCksIHBhcmFtKTsKLQkJcmV0dXJuIHBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFBhcmFtZXRlciBhZGRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLQkJUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcihuYW1lKTsKLQkJcGFyYW1zLnB1dChuYW1lLCBwYXJhbSk7Ci0JCXJldHVybiBwYXJhbTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGFyYW1ldGVycyBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCVBhcmFtZXRlcnMgbmV3UGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoKTsKLQkJZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBnZXRQYXJhbWV0ZXJzKCkpIHsKLQkJCW5ld1BhcmFtcy5hZGRQYXJhbWV0ZXIocGFyYW0uY2xvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld1BhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gcGFyYW1zLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRQYXJhbWV0ZXJDb3VudCgpIHsKLQkJcmV0dXJuIHBhcmFtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXJbXSBnZXRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gcGFyYW1zLnZhbHVlcygpLnRvQXJyYXkobmV3IFBhcmFtZXRlcltwYXJhbXMuc2l6ZSgpXSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTM2YjYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ybXN5c3RlbS9FZmZlY3RpdmVPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRWZmZWN0aXZlT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcwotQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uIHsKLQotCXB1YmxpYyBFZmZlY3RpdmVPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbigKLQkJCUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24pOwotCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBvcGVuTVBJY29uZmlndXJhdGlvbiA9IChPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiljb25maWd1cmF0aW9uOwotCQlTdHJpbmcgbGF1bmNoQ21kID0gbnVsbDsKLQkJU3RyaW5nIGRlYnVnQ21kID0gbnVsbDsKLQkJU3RyaW5nIGRpc2NvdmVyQ21kID0gbnVsbDsKLQkJU3RyaW5nIHJlbW90ZUluc3RhbGxQYXRoID0gbnVsbDsKLQkJaWYgKG9wZW5NUEljb25maWd1cmF0aW9uLnVzZVRvb2xEZWZhdWx0cygpKSB7Ci0JCQlpZiAob3Blbk1QSWNvbmZpZ3VyYXRpb24uZ2V0VmVyc2lvbklkKCkuZXF1YWxzKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLlZFUlNJT05fMTIpKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCQkJCWxhdW5jaENtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKTsKLQkJCQlkZWJ1Z0NtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpOwotCQkJCWRpc2NvdmVyQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCk7Ci0JCQkJLy8gcmVtb3RlSW5zdGFsbFBhdGggPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCk7Ci0JCQl9IGVsc2UgaWYgKG9wZW5NUEljb25maWd1cmF0aW9uLmdldFZlcnNpb25JZCgpLmVxdWFscyhPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5WRVJTSU9OXzEzKSkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCQlsYXVuY2hDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfTEFVTkNIX0NNRCk7Ci0JCQkJZGVidWdDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKTsKLQkJCQlkaXNjb3ZlckNtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpOwotCQkJCS8vIHJlbW90ZUluc3RhbGxQYXRoID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnQgZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsYXVuY2hDbWQgPSBvcGVuTVBJY29uZmlndXJhdGlvbi5nZXRMYXVuY2hDbWQoKTsKLQkJCWRlYnVnQ21kID0gb3Blbk1QSWNvbmZpZ3VyYXRpb24uZ2V0RGVidWdDbWQoKTsKLQkJCWRpc2NvdmVyQ21kID0gb3Blbk1QSWNvbmZpZ3VyYXRpb24uZ2V0RGlzY292ZXJDbWQoKTsKLQkJCS8vIHJlbW90ZUluc3RhbGxQYXRoID0gb3Blbk1QSWNvbmZpZ3VyYXRpb24uZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKTsKLQkJfQotCQlyZW1vdGVJbnN0YWxsUGF0aCA9IG9wZW5NUEljb25maWd1cmF0aW9uLmdldFJlbW90ZUluc3RhbGxQYXRoKCk7Ci0JCWFwcGx5VmFsdWVzKGxhdW5jaENtZCwgZGVidWdDbWQsIGRpc2NvdmVyQ21kLCBudWxsLCAwLCBudWxsLCByZW1vdGVJbnN0YWxsUGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3Jtc3lzdGVtL09wZW5NUElSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcm1zeXN0ZW0vT3Blbk1QSVJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjY1MTIyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcm1zeXN0ZW0vT3Blbk1QSVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuQWJzdHJhY3RUb29sc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnBhcmFtZXRlcnMuT21waUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucnRzeXN0ZW0uT3Blbk1QSVJ1bnRpbWVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSZXNvdXJjZU1hbmFnZXIgewotCi0JcHJpdmF0ZSBJbnRlZ2VyIE9QRU5NUElfUk1JRDsKLQlwcml2YXRlIE9wZW5NUElSdW50aW1lU3lzdGVtIHJ0cyA9IG51bGw7Ci0KLQlwdWJsaWMgT3Blbk1QSVJlc291cmNlTWFuYWdlcihJbnRlZ2VyIGlkLCBJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSwgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGlkLnRvU3RyaW5nKCksIHVuaXZlcnNlLCBjb25maWcpOwotCQlPUEVOTVBJX1JNSUQgPSBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVSdW50aW1lU3lzdGVtKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVTeXN0ZW0gZG9DcmVhdGVSdW50aW1lU3lzdGVtKCkgewotCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSAoT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKTsKLQkJQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgYXR0ckRlZk1nciA9IGdldEF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyKCk7Ci0JCWF0dHJEZWZNZ3Iuc2V0QXR0cmlidXRlRGVmaW5pdGlvbnMoQWJzdHJhY3RUb29sc0F0dHJpYnV0ZXMuZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkpOwotCQlydHMgPSBuZXcgT3Blbk1QSVJ1bnRpbWVTeXN0ZW0oT1BFTk1QSV9STUlELCBjb25maWcsIGF0dHJEZWZNZ3IpOwotCQlyZXR1cm4gcnRzOwotCX0KLQotCS8qKgotCSAqIEdldCBPcGVuTVBJIGluZm8KLQkgKiAKLQkgKiBAcmV0dXJuIE9tcGlJbmZvCi0JICovCi0JcHVibGljIE9tcGlJbmZvIGdldE9tcGlJbmZvKCkgewotCQlpZiAocnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBydHMuZ2V0T21waUluZm8oKS5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcm1zeXN0ZW0vT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcm1zeXN0ZW0vT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU5MjU3Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3Jtc3lzdGVtL09wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGV4dGVuZHMKLUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBPUEVOTVBJX0NBUEFCSUxJVElFUyA9IENBUF9MQVVOQ0ggfCBDQVBfRElTQ09WRVIgfCBDQVBfUkVNT1RFX0lOU1RBTExfUEFUSDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkVSU0lPTl9JRCA9ICJ2ZXJzaW9uSWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzEyID0gIm9wZW5tcGktMS4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMTMgPSAib3Blbm1waS0xLjMiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFN0YXRpYyBjbGFzcyB0byBob2xkIG9wZW5tcGkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotCSAqCi0JICogQGF1dGhvciBkZmZlcmJlcgotCSAqLwotCXN0YXRpYyBwdWJsaWMgY2xhc3MgT3Blbk1waUNvbmZpZyB7Ci0KLQkJcHJpdmF0ZSBUb29sc0NvbmZpZyB0b29sc0NvbmZpZzsKLQkJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbklkOwotCi0JCXB1YmxpYyBPcGVuTXBpQ29uZmlnKCkgewotCQkJdGhpcyhuZXcgVG9vbHNDb25maWcoKSwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgT3Blbk1waUNvbmZpZyhUb29sc0NvbmZpZyB0b29sc0NvbmZpZywgU3RyaW5nIHZlcnNpb25JZCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudG9vbHNDb25maWcgPSB0b29sc0NvbmZpZzsKLQkJCXRoaXMudmVyc2lvbklkID0gdmVyc2lvbklkOwotCQl9Ci0KLQkJcHVibGljIFRvb2xzQ29uZmlnIGdldFRvb2xzQ29uZmlnKCkgewotCQkJcmV0dXJuIHRvb2xzQ29uZmlnOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VG9vbHNDb25maWcoVG9vbHNDb25maWcgdG9vbHNDb25maWcpIHsKLQkJCXRoaXMudG9vbHNDb25maWcgPSB0b29sc0NvbmZpZzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCkgewotCQkJcmV0dXJuIHZlcnNpb25JZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JZChTdHJpbmcgdmVyc2lvbklkKSB7Ci0JCQl0aGlzLnZlcnNpb25JZCA9IHZlcnNpb25JZDsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHZlcnNpb25JZDsKLQotCXB1YmxpYyBzdGF0aWMgT3Blbk1waUNvbmZpZyBsb2FkT3Blbk1waUNvbmZpZyhJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LAotCQkJSU1lbWVudG8gbWVtZW50bykgewotCQlUb29sc0NvbmZpZyB0b29sc0NvbmZpZyA9IGxvYWRUb29sKGZhY3RvcnksIG1lbWVudG8pOwotCi0JCVN0cmluZyB2ZXJzaW9uSWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfVkVSU0lPTl9JRCk7Ci0KLQkJT3Blbk1waUNvbmZpZyBjb25maWcgPSBuZXcgT3Blbk1waUNvbmZpZyh0b29sc0NvbmZpZywgdmVyc2lvbklkKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWQoCi0JCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LCBJTWVtZW50byBtZW1lbnRvKSB7Ci0JCU9wZW5NcGlDb25maWcgb3Blbk1waUNvbmZpZyA9IGxvYWRPcGVuTXBpQ29uZmlnKGZhY3RvcnksIG1lbWVudG8pOwotCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oZmFjdG9yeSwgb3Blbk1waUNvbmZpZyk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIoT1BFTk1QSV9DQVBBQklMSVRJRVMsIG5ldyBUb29sc0NvbmZpZygpLCBmYWN0b3J5KTsKLQotCQkvKgotCQkgKiBCeSBkZWZhdWx0LCBhc3N1bWUgb3Blbm1waSAxLjMgY29uZmlndXJhdGlvbi4KLQkJICovCi0JCVByZWZlcmVuY2VzIHByZWZzID0gT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJc2V0TGF1bmNoQ21kKHByZWZzLmdldFN0cmluZyhPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKSk7Ci0JCXNldERlYnVnQ21kKHByZWZzLmdldFN0cmluZyhPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpKTsKLQkJc2V0RGlzY292ZXJDbWQocHJlZnMuZ2V0U3RyaW5nKE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCkpOwotCQlzZXRSZW1vdGVJbnN0YWxsUGF0aChwcmVmcy5nZXRTdHJpbmcoT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCkpOwotCQkvLwkJc2V0VXNlVG9vbERlZmF1bHRzKHByZWZzLmdldEJvb2xlYW4oT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfVVNFX0RFRkFVTFRTKSk7Ci0JCXNldFZlcnNpb25JZChWRVJTSU9OXzEzKTsKLQl9Ci0KLQlwdWJsaWMgT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oT3Blbk1QSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZmFjdG9yeSwKLQkJCU9wZW5NcGlDb25maWcgY29uZmlnKSB7Ci0JCS8qCi0JCSAqIEJ5IGRlZmF1bHQsIGFzc3VtZSBvcGVubXBpIDEuMyBjb25maWd1cmF0aW9uLgotCQkgKi8KLQkJc3VwZXIoT1BFTk1QSV9DQVBBQklMSVRJRVMsIGNvbmZpZy5nZXRUb29sc0NvbmZpZygpLCBmYWN0b3J5KTsKLQkJc2V0VmVyc2lvbklkKGNvbmZpZy5nZXRWZXJzaW9uSWQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJQ29tbW9uQ29uZmlnIGNvbW1vbkNvbmYgPSBuZXcgQ29tbW9uQ29uZmlnKGdldE5hbWUoKSwKLQkJCQlnZXREZXNjcmlwdGlvbigpLCBnZXRVbmlxdWVOYW1lKCkpOwotCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZiA9IG5ldyBSZW1vdGVDb25maWcoY29tbW9uQ29uZiwKLQkJCQlnZXRSZW1vdGVTZXJ2aWNlc0lkKCksIGdldENvbm5lY3Rpb25OYW1lKCksCi0JCQkJZ2V0UHJveHlTZXJ2ZXJQYXRoKCksIGdldExvY2FsQWRkcmVzcygpLAotCQkJCWdldEludm9jYXRpb25PcHRpb25zU3RyKCksIGdldE9wdGlvbnMoKSk7Ci0JCVRvb2xzQ29uZmlnIHRvb2xzQ29uZmlnID0gbmV3IFRvb2xzQ29uZmlnKAotCQkJCXJlbW90ZUNvbmYsCi0JCQkJZ2V0TGF1bmNoQ21kKCksCi0JCQkJZ2V0RGVidWdDbWQoKSwKLQkJCQlnZXREaXNjb3ZlckNtZCgpLAotCQkJCWdldFBlcmlvZGljTW9uaXRvckNtZCgpLAotCQkJCWdldFBlcmlvZGljTW9uaXRvclRpbWUoKSwKLQkJCQlnZXRDb250aW51b3VzTW9uaXRvckNtZCgpLAotCQkJCWdldFJlbW90ZUluc3RhbGxQYXRoKCksCi0JCQkJdXNlVG9vbERlZmF1bHRzKCkpOwotCQlPcGVuTXBpQ29uZmlnIG9wZW5NcGlDb25maWcgPSBuZXcgT3Blbk1waUNvbmZpZyh0b29sc0NvbmZpZywgZ2V0VmVyc2lvbklkKCkpOwotCi0JCXJldHVybiBuZXcgT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oCi0JCQkJKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5KSBnZXRGYWN0b3J5KCksIG9wZW5NcGlDb25maWcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlKG1lbWVudG8pOwotCQltZW1lbnRvLnB1dFN0cmluZyhUQUdfVkVSU0lPTl9JRCwgdmVyc2lvbklkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZUFuZERlc2MoKSB7Ci0JCVN0cmluZyBuYW1lID0gTWVzc2FnZXMuT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdE5hbWU7Ci0JCVN0cmluZyBjb25uID0gZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKGNvbm4gIT0gbnVsbCAmJiAhY29ubi5lcXVhbHMoRU1QVFlfU1RSSU5HKSkgewotCQkJbmFtZSArPSAiQCIgKyBjb25uOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0TmFtZShuYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdERlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25JZCgpIHsKLQkJcmV0dXJuIHZlcnNpb25JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZCkgewotCQl0aGlzLnZlcnNpb25JZCA9IHZlcnNpb25JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3Jtc3lzdGVtL09wZW5NUElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3Jtc3lzdGVtL09wZW5NUElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMTE4ZGEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ybXN5c3RlbS9PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSVJlc291cmNlTWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3RvcnkgewotCi0JcHVibGljIE9wZW5NUElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5KCkgewotCQkvLyBRVUVTVElPTjogV291bGRudCBpdCBiZSBiZXR0ZXIgdG8gdGFrZSBuYW1lIGZyb20gZXh0ZW5zaW9uIHBvaW50PwotCQkvLyBFeHRlbnNpb24gcG9pbnQgYWxyZWFkeSBoYXMgYSBuYW1lLgotCQlzdXBlcihNZXNzYWdlcy5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeV9SZXNvdXJjZU1hbmFnZXJOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3Blbk1QSVJlc291cmNlTWFuYWdlckZhY3RvcnkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvcHlDb25maWd1cmF0aW9uKAotCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlyZXR1cm4gKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKWNvbmZpZ3VyYXRpb24uY2xvbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZJbikgewotCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mSW47Ci0JCVBUUENvcmVQbHVnaW4gcGx1Z2luID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCUlQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlID0gKElQVW5pdmVyc2VDb250cm9sKSBwbHVnaW4uZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyKHVuaXZlcnNlLmdldE5leHRSZXNvdXJjZU1hbmFnZXJJZCgpLCB1bml2ZXJzZSwgY29uZmlndXJhdGlvbik7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCU9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24odGhpcyk7Ci0KLQkJcmV0dXJuIGNvbmY7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWRDb25maWd1cmF0aW9uKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmV0dXJuIE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmxvYWQodGhpcywgbWVtZW50byk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElEaXNjb3ZlckpvYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ydHN5c3RlbS9PcGVuTVBJRGlzY292ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4N2UyYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElEaXNjb3ZlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuTWFjaGluZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Ob2RlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJvY2Vzc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUElNYWNoaW5lQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5PcGVuTVBJTm9kZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUuT3Blbk1QSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5wYXJhbWV0ZXJzLk9tcGlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbS5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbS5PcGVuTVBJSG9zdE1hcC5Ib3N0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSURpc2NvdmVySm9iIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iIHsKLQlPcGVuTVBJUnVudGltZVN5c3RlbSBydHM7Ci0KLQlwdWJsaWMgT3Blbk1QSURpc2NvdmVySm9iKE9wZW5NUElSdW50aW1lU3lzdGVtIHJ0cykgewotCQlzdXBlcihydHMsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX25hbWUsIHJ0cy5nZXRSbUNvbmZpZ3VyYXRpb24oKS5nZXROYW1lKCkpLAotCQkJCXJ0cy5yZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKS5nZXREaXNjb3ZlckNtZCgpLAotCQkJCU1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5PcGVuTVBJRGlzY292ZXJKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5PcGVuTVBJRGlzY292ZXJKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZSk7Ci0JCXRoaXMucnRzID0gcnRzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKEJ1ZmZlcmVkUmVhZGVyIG91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBMb2NhbCBjb3B5IG9mIGF0dHJpYnV0ZXMgZnJvbSB0aGUgUnVudGltZVN5c3RlbQotCQkgKi8KLQkJSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJ0cy5nZXRDb25uZWN0aW9uKCk7Ci0JCWFzc2VydCBjb25uZWN0aW9uICE9IG51bGw7Ci0JCUlSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IHJ0cy5nZXRSZW1vdGVTZXJ2aWNlcygpOwotCQlhc3NlcnQgcmVtb3RlU2VydmljZXMgIT0gbnVsbDsKLQkJSVJlbW90ZUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSByZW1vdGVTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcihjb25uZWN0aW9uKTsKLQkJT21waUluZm8gaW5mbyA9IHJ0cy5nZXRPbXBpSW5mbygpOwotCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBybUNvbmZpZ3VyYXRpb24gPSAoT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIHJ0cy5nZXRSbUNvbmZpZ3VyYXRpb24oKTsKLQkJYXNzZXJ0IGZpbGVNZ3IgIT0gbnVsbDsKLQotCQkvKgotCQkgKiBNUEkgcmVzb3VyY2UgbWFuYWdlciBoYXZlIG9ubHkgb25lIG1hY2hpbmUgYW5kIG9uZSBxdWV1ZS4KLQkJICogVGhlcmUgdGhleSBhcmUgaW1wbGljaXRseSAiZGlzY292ZXJlZCIuCi0JCSAqLwotCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRzLmdldFJtSUQoKSk7Ci0JCVN0cmluZyBtYWNoaW5lSUQgPSBydHMuY3JlYXRlTWFjaGluZShybS5nZXROYW1lKCkpOwotCQlydHMuc2V0TWFjaGluZUlEKG1hY2hpbmVJRCk7Ci0JCVN0cmluZyBxdWV1ZUlEID0gcnRzLmNyZWF0ZVF1ZXVlKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9kZWZhdWx0UXVldWVOYW1lKTsKLQkJcnRzLnNldFF1ZXVlSUQocXVldWVJRCk7Ci0KLQkJSVBNYWNoaW5lIG1hY2hpbmUgPSBybS5nZXRNYWNoaW5lQnlJZChtYWNoaW5lSUQpOwotCQlhc3NlcnQgbWFjaGluZSAhPSBudWxsOwotCi0JCS8qCi0JCSAqIEFueSBleGNlcHRpb24gZnJvbSBub3cgb24gaXMgY2F1Z2h0IGluIG9yZGVyIHRvIGFkZCB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hY2hpbmUuCi0JCSAqIFRoZW4sIHRoZSBleGNlcHRpb24gaXMgcmUtdGhyb3duLgotCQkgKi8KLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBTVEVQIDE6Ci0JCQkgKiBQYXJzZSBvdXRwdXQgb2YgY29tbWFuZC4KLQkJCSAqIFRPRE86IHZhbGlkYXRlIGxpbmVzIGFuZCB3cml0ZSB0byBsb2cgaWYgaW52YWxpZCBsaW5lcyB3ZXJlIGZvdW5kLgotCQkJICovCi0JCQlwYXJzZU9tcGlJbmZvKG91dHB1dCwgaW5mbyk7Ci0KLQkJCS8qCi0JCQkgKiBTVEVQIDI6Ci0JCQkgKiBSZWFkIGZpbGUgdGhhdCBkZXNjcmliZXMgbWFjaGluZSBnZW9ncmFwaHkuCi0JCQkgKiBJZiBubyBub2RlcyBhcmUgZ2l2ZW4sIHRoZW4gd2UgYXNzdW1lIE1QSSBkZWZhdWx0IHdoZW4gaG9zdCBhcmUgbm90IGNvbmZpZ3VyZWQ6IHRoZXJlIGlzIG9ubHkgb25lIG5vZGUgb24gdGhlIG1hY2hpbmUuCi0JCQkgKiBUaGlzIHBhcnQgaXMgYSBiaXQgdHJpY2t5LgotCQkJICogT3Blbk1QSSAxLjIgaGFzIGEgUkRTIChyZXNvdXJjZSBkaXNjb3Zlcnkgc3lzdGVtKSB0aGF0IGtub3dzIHRoZSBkZWZhdWx0IGhvc3RmaWxlIGFzIHJkc19ob3N0ZmlsZV9wYXRoIHBhcmFtZXRlci4KLQkJCSAqIEJ1dCB0aGUgUkRTIHdhcyBkcm9wcGVkIGJ5IHZlcnNpb24gMS4zLgotCQkJICogVGhlbiB0aGUgb3J0ZV9kZWZhdWx0X2hvc3RmaWxlIHBhcmFtZXRlciBtaWdodCBiZSB1c2VkIGluc3RlYWQsIGFzIGxvbmcgYXMgaXQgd2FzIGRlZmluZWQgaW4gdGhlIHN5c3RlbSB3aWRlIE1DQSBwYXJhbWV0ZXJzLgotCQkJICovCi0JCQlPcGVuTVBJSG9zdE1hcCBob3N0TWFwID0gcmVhZEhvc3RGaWxlKGNvbm5lY3Rpb24sIHJlbW90ZVNlcnZpY2VzLCBmaWxlTWdyLCBpbmZvLCBybUNvbmZpZ3VyYXRpb24pOwotCi0JCQkvKgotCQkJICogQ3JlYXRlIG1vZGVsIGFjY29yZGluZyB0byBkYXRhIGZyb20gZGlzY292ZXIuCi0JCQkgKi8KLQkJCWludCByYW5rQ291bnRlciA9IDA7Ci0JCQlib29sZWFuIGhhc1NvbWVFcnJvciA9IGZhbHNlOwotCQkJYXNzZXJ0IGhvc3RNYXAgIT0gbnVsbDsKLQotCQkJZm9yIChPcGVuTVBJSG9zdE1hcC5Ib3N0IGhvc3QgOiBob3N0TWFwLmdldEhvc3RzKCkpIHsKLQotCQkJCS8vIEFkZCBub2RlIHRvIG1vZGVsCi0JCQkJU3RyaW5nIG5vZGVJZCA9IHJ0cy5jcmVhdGVOb2RlKG1hY2hpbmVJRCwgaG9zdC5nZXROYW1lKCksIHJhbmtDb3VudGVyKyspOwotCQkJCUlQTm9kZSBub2RlID0gbWFjaGluZS5nZXROb2RlQnlJZChub2RlSWQpOwotCQkJCXJ0cy5zZXROb2RlSURGb3JOYW1lKGhvc3QuZ2V0TmFtZSgpLCBub2RlSWQpOwotCi0JCQkJLy8gQWRkIHByb2Nlc3NvciBpbmZvcm1hdGlvbiB0byBub2RlLgotCQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJCWlmIChob3N0LmdldE51bVByb2Nlc3NvcnMoKSAhPSAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmdldE51bWJlck9mTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGhvc3QuZ2V0TnVtUHJvY2Vzc29ycygpKSk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUaGlzIHNpdHVhdGlvbiBpcyBub3QgcG9zc2libGUgc2luY2UgaG9zdC5nZXROdW1Qcm9jZXNzb3JzKCkgaXMgYWx3YXlzIHZhbGlkLgotCQkJCQkJYXNzZXJ0IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChob3N0LmdldE1heE51bVByb2Nlc3NvcnMoKSAhPSAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmdldE1heGltYWxOdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShob3N0LmdldE1heE51bVByb2Nlc3NvcnMoKSkpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVGhpcyBzaXR1YXRpb24gaXMgbm90IHBvc3NpYmxlIHNpbmNlIGhvc3QuZ2V0TWF4TnVtUHJvY2Vzc29ycygpIGlzIGFsd2F5cyB2YWxpZC4KLQkJCQkJCWFzc2VydCBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaG9zdC5nZXRFcnJvcnMoKSAhPSAwKSB7Ci0JCQkJCWlmICgoaG9zdC5nZXRFcnJvcnMoKSAmIEhvc3QuRVJSX01BWF9OVU1fU0xPVFMpICE9IDApIHsKLQkJCQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShPcGVuTVBJTm9kZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9JbnZhbGlkTWF4U2xvdHNQYXJhbWV0ZXIpKTsKLQkJCQkJfSBlbHNlIGlmICgoaG9zdC5nZXRFcnJvcnMoKSAmIEhvc3QuRVJSX05VTV9TTE9UUykgIT0gMCkgewotCQkJCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE9wZW5NUElOb2RlQXR0cmlidXRlcy5nZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNZXNzYWdlcy5PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0ludmFsaWRTbG90c1BhcmFtZXRlcikpOwotCQkJCQl9IGVsc2UgaWYgKChob3N0LmdldEVycm9ycygpICYgSG9zdC5FUlJfVU5LTk9XTl9BVFRSKSAhPSAwKSB7Ci0JCQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSWdub3JlZEludmFsaWRQYXJhbWV0ZXIpKTsKLQkJCQkJfQotCQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTm9kZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE5vZGVBdHRyaWJ1dGVzLlN0YXRlLlVQKSk7Ci0JCQkJCWhhc1NvbWVFcnJvciA9IHRydWU7Ci0JCQkJfQotCQkJCXJ0cy5jaGFuZ2VOb2RlKG5vZGVJZCwgYXR0ck1hbmFnZXIpOwotCQkJfQotCQkJaWYgKGhvc3RNYXAuaGFzRXJyb3JzKSB7Ci0JCQkJbWFjaGluZS5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQkJbWFjaGluZS5hZGRBdHRyaWJ1dGUoT3Blbk1QSU1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yKSk7Ci0JCQl9Ci0JCQlpZiAoaG9zdE1hcC5oYXNQYXJzZUVycm9ycygpIHx8IGhhc1NvbWVFcnJvcikKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgT3Blbk1QSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVFcnJvcnMpKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8qCi0JCQkgKiBTaG93IG1lc3NhZ2Ugb2YgY29yZSBleGNlcHRpb24gYW5kIGNoYW5nZSBtYWNoaW5lIHN0YXR1cyB0byBlcnJvci4KLQkJCSAqLwotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNYWNoaW5lQXR0cmlidXRlcy5TdGF0ZS5FUlJPUikpOwotCQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShPcGVuTVBJTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSkpOwotCQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmVJRCwgYXR0ck1hbmFnZXIpOwotCQkJCXJtLmFkZEF0dHJpYnV0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShSZXNvdXJjZU1hbmFnZXJBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFNob3cgbWVzc2FnZSBvZiBhbGwgb3RoZXIgZXhjZXB0aW9ucyBhbmQgY2hhbmdlIG1hY2hpbmUgc3RhdHVzIHRvIGVycm9yLgotCQkJICovCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFjaGluZUF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShPcGVuTVBJTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRJbnRlcm5hbEVycm9yLCBlLmdldE1lc3NhZ2UoKSkpKTsKLQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmVJRCwgYXR0ck1hbmFnZXIpOwotCQkJcm0uYWRkQXR0cmlidXRlKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKFJlc291cmNlTWFuYWdlckF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgT3Blbk1QSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSW50ZXJuYWxFcnJvciwgZS5nZXRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9wZW5NUElIb3N0TWFwIHJlYWRIb3N0RmlsZShJUmVtb3RlQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotCQkJSVJlbW90ZVNlcnZpY2VzIHJlbW90ZVNlcnZpY2VzLCBJUmVtb3RlRmlsZU1hbmFnZXIgZmlsZU1nciwKLQkJCU9tcGlJbmZvIGluZm8sCi0JCQlPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBybUNvbmZpZ3VyYXRpb24pCi0JdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQkvKgotCQkgKiBPcGVuTXBpIDEuMiB1c2VzIHJkc19ob3N0ZmlsZV9wYXRoLiBPcGVuIDEuMyB1c2VzIG9ydGVfZGVmYXVsdF9ob3N0ZmlsZS4KLQkJICogRm9yIDEuMiwgcGF0aCBtdXN0IG5vdCBiZSBlbXB0eS4gRm9yIDEuMyBpdCBtYXkgYmUgZW1wdHkgYW5kIGRlZmF1bHQgaG9zdCBpcyBhc3N1bWVkLgotCQkgKi8KLQkJT3Blbk1QSUhvc3RNYXAgaG9zdE1hcCA9IG51bGw7Ci0JCVN0cmluZyBob3N0RmlsZSA9IG51bGw7Ci0JCUlQYXRoIGhvc3RGaWxlUGF0aCA9IG51bGw7Ci0KLQkJUGFyYW1ldGVycy5QYXJhbWV0ZXIgcmRzX3BhcmFtID0gaW5mby5nZXRQYXJhbWV0ZXIoInJkc19ob3N0ZmlsZV9wYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJUGFyYW1ldGVycy5QYXJhbWV0ZXIgb3J0ZV9wYXJhbSA9IGluZm8uZ2V0UGFyYW1ldGVyKCJvcnRlX2RlZmF1bHRfaG9zdGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHJlZml4ID0gaW5mby5nZXQoInBhdGg6cHJlZml4Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAicmRzX2hvc3RmaWxlX3BhdGg6IHswfSIsIChyZHNfcGFyYW09PW51bGw/Im51bGwiOnJkc19wYXJhbS5nZXRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIm9ydGVfZGVmYXVsdF9ob3N0ZmlsZTogezB9IiwgKG9ydGVfcGFyYW09PW51bGw/Im51bGwiOm9ydGVfcGFyYW0uZ2V0VmFsdWUoKSkpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJwcmVmaXg6IHswfSIsIChwcmVmaXg9PW51bGw/Im51bGwiOnByZWZpeCkpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQkJaWYgKHJkc19wYXJhbSAhPSBudWxsKSB7Ci0JCQlob3N0RmlsZSA9IHJkc19wYXJhbS5nZXRWYWx1ZSgpOwotCQkJaWYgKGhvc3RGaWxlLnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJaG9zdEZpbGVQYXRoID0gbmV3IFBhdGgoaG9zdEZpbGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoaG9zdEZpbGVQYXRoID09IG51bGwgJiYgb3J0ZV9wYXJhbSAhPSBudWxsKSB7Ci0JCQlob3N0RmlsZSA9IG9ydGVfcGFyYW0uZ2V0VmFsdWUoKTsKLQkJCWlmIChob3N0RmlsZS50cmltKCkubGVuZ3RoKCkgIT0gMCkgewotCQkJCWhvc3RGaWxlUGF0aCA9IG5ldyBQYXRoKGhvc3RGaWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGhvc3RGaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAocm1Db25maWd1cmF0aW9uLmdldFZlcnNpb25JZCgpLmVxdWFscyhPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5WRVJTSU9OXzEyKSkgewotCQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJNaXNzaW5nIG1hbmRhdG9yeSBob3N0ZmlsZSBmb3IgT3BlbiBNUEkgMS4yLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBPcGVuTVBJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRNaXNzaW5nSG9zdEZpbGVQYXRoKSk7Ci0JCQl9Ci0JCQkKLQkJCWhvc3RNYXAgPSBuZXcgT3Blbk1QSUhvc3RNYXAoKTsKLQkJCVN0cmluZyBob3N0bmFtZSA9IGdldFJlbW90ZUhvc3RuYW1lKGNvbm5lY3Rpb24sIHJlbW90ZVNlcnZpY2VzKTsKLQkJCWhvc3RNYXAuYWRkRGVmYXVsdEhvc3QoaG9zdG5hbWUpOwotCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIk1pc3Npbmcgb3B0aW9uYWwgaG9zdGZpbGUuIEFzc3VtaW5nIHswfSBhcyBkZWZhdWx0IGhvc3QuIiwgaG9zdG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaG9zdE1hcDsKLQkJfQotCQkKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIkZvdW5kIGhvc3RmaWxlIGZvciBPcGVuIE1QSSIpOyAvLyROT04tTkxTLTEkCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJob3N0RmlsZVBhdGg6IHswfSIsIGhvc3RGaWxlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIWhvc3RGaWxlUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCWlmIChybUNvbmZpZ3VyYXRpb24uZ2V0VmVyc2lvbklkKCkuZXF1YWxzKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLlZFUlNJT05fMTIpKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBPcGVuTVBJUGx1Z2luLlBMVUdJTl9JRCwgTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZVBhdGhOb3RBYnNvbHV0ZSwgaG9zdEZpbGVQYXRoKSkpOwotCQkJfQotCQkJCi0JCQlob3N0TWFwID0gbmV3IE9wZW5NUElIb3N0TWFwKCk7Ci0JCQlTdHJpbmcgaG9zdG5hbWUgPSBnZXRSZW1vdGVIb3N0bmFtZShjb25uZWN0aW9uLCByZW1vdGVTZXJ2aWNlcyk7Ci0JCQlob3N0TWFwLmFkZERlZmF1bHRIb3N0KGhvc3RuYW1lKTsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJCYWQgaG9zdGZpbGUgc3BlY2lmaWNhdGlvbi4gQXNzdW1pbmcgezB9IGFzIGRlZmF1bHQgaG9zdC4iLCBob3N0bmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBob3N0TWFwOwotCQl9Ci0JCQotCQkvLyBUcnkgdG8gcmVhZC4KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIk9wZW5pbmcgaG9zdGZpbGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJSUZpbGVTdG9yZSBob3N0ZmlsZTsKLQkJdHJ5IHsKLQkJCWhvc3RmaWxlID0gZmlsZU1nci5nZXRSZXNvdXJjZShob3N0RmlsZVBhdGgsIG1vbml0b3IpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE9wZW5NUElQbHVnaW4uUExVR0lOX0lELCBOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlTm90Rm91bmQsIGhvc3RGaWxlUGF0aCksIGUpKTsKLQkJfQotCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gaG9zdGZpbGUub3BlbklucHV0U3RyZWFtKEVGUy5OT05FLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE9wZW5NUElQbHVnaW4uUExVR0lOX0lELCBOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZFJlYWRIb3N0RmlsZSwgaG9zdGZpbGUpLCBlKSk7Ci0JCX0KLQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAiUGFyc2luZyBob3N0ZmlsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotCQkJaG9zdE1hcCA9IE9wZW5NUElIb3N0TWFwUGFyc2VyLnBhcnNlKHJlYWRlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgT3Blbk1QSVBsdWdpbi5QTFVHSU5fSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkUGFyc2VIb3N0RmlsZSwgaG9zdGZpbGUpLCBlKSk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIElmIG5vIGhvc3QgaW5mb3JtYXRpb24gd2FzIGZvdW5kIGluIHRoZSBob3N0ZmlsZSwgYWRkIGRlZmF1bHQuCi0JCSAqIE9ubHkgZm9yIE9wZW4gTVBJIDEuMi4gT24gMS4zLCB0aGVyZSBpcyBubyBkZWZhdWx0IGhvc3QgZmlsZSBhc3N1bWVkLgotCQkgKi8KLQkJaWYgKGhvc3RNYXAuY291bnQoKSA9PSAwKSB7Ci0JCQlpZiAocm1Db25maWd1cmF0aW9uLmdldFZlcnNpb25JZCgpLmVxdWFscyhPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5WRVJTSU9OXzEyKSkgewotCQkJCS8vIFRoaXMgd2FzIG5vdCBjb3JyZWN0IGZvciByZW1vdGUgaG9zdHMuIFdvcmtlZCBvbmx5IGZvciBsb2NhbCBob3N0cy4KLQkJCQkvLwkJCQkJdHJ5IHsKLQkJCQkvLwkJCQkJCUluZXRBZGRyZXNzIGxvY2FsaG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJCS8vCQkJCQkJaG9zdE1hcC5hZGREZWZhdWx0SG9zdChsb2NhbGhvc3QuZ2V0SG9zdE5hbWUoKSk7Ci0JCQkJLy8JCQkJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLwkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIkNhbm5vdCByZXRyaXZlIG5ldHdvcmsgaW5mb3JtYXRpb24gZm9yIGxvY2FsIG1hY2hpbmUuIENoZWNrIG5ldHdvcmsgY29uZmlndXJhdGlvbi4iKSk7Ci0JCQkJLy8JCQkJCX0KLQkJCQlTdHJpbmcgaG9zdG5hbWUgPSBnZXRSZW1vdGVIb3N0bmFtZShjb25uZWN0aW9uLCByZW1vdGVTZXJ2aWNlcyk7Ci0JCQkJaG9zdE1hcC5hZGREZWZhdWx0SG9zdChob3N0bmFtZSk7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIkhvc3RmaWxlIGlzIGVtcHR5LiBBZGRlZCBkZWZhdWx0IGhvc3QgezB9IGZvciBPcGVuIE1QSSAxLjIuIiwgaG9zdG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQkJCi0JCQlEZWJ1Z1V0aWwuZXJyb3IoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAiRW1wdHkgaG9zdGZpbGUgaXMgbm90IGFsbG93ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgT3Blbk1QSVBsdWdpbi5QTFVHSU5fSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVFbXB0eSwgaG9zdGZpbGUpKSk7Ci0JCX0KLQkJcmV0dXJuIGhvc3RNYXA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVtb3RlSG9zdG5hbWUoSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKLQkJCUlSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcykgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSVJlbW90ZVByb2Nlc3NCdWlsZGVyIHByb2Nlc3NCdWlsZGVyID0gcmVtb3RlU2VydmljZXMuZ2V0UHJvY2Vzc0J1aWxkZXIoY29ubmVjdGlvbiwgImhvc3RuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJSVJlbW90ZVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9jZXNzID0gcHJvY2Vzc0J1aWxkZXIuc3RhcnQoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBPcGVuTVBJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWQsIGUpKTsKLQkJfQotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCXRyeSB7Ci0JCQlwcm9jZXNzLndhaXRGb3IoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJaWYgKHByb2Nlc3MuZXhpdFZhbHVlKCkgIT0gMCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgT3Blbk1QSVBsdWdpbi5QTFVHSU5fSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkV2l0aENvZGUsIHByb2Nlc3MuZXhpdFZhbHVlKCkpKSk7Ci0JCVN0cmluZyBob3N0bmFtZSA9IGJyLnJlYWRMaW5lKCk7Ci0JCWlmIChob3N0bmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBPcGVuTVBJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuT3Blbk1QSURpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZSkpOwotCQlyZXR1cm4gaG9zdG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlT21waUluZm8oQnVmZmVyZWRSZWFkZXIgb3V0cHV0LCBPbXBpSW5mbyBpbmZvKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJU3RyaW5nIGxpbmU7Ci0JCQl3aGlsZSAoKGxpbmUgPSBvdXRwdXQucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWlmIChsaW5lLmluZGV4T2YoIm1jYToiKSA9PSAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW50IG5hbWVTdGFydCA9IGxpbmUuaW5kZXhPZigiOnBhcmFtOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChuYW1lU3RhcnQgPj0gMCkgewotCQkJCQkJbmFtZVN0YXJ0ICs9IDc7Ci0JCQkJCQlpbnQgcG9zID0gbGluZS5pbmRleE9mKCI6IiwgbmFtZVN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBJZiBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBpbiBsaXN0LCB0aGVuIHVwZGF0ZSwgb3RoZXJ3aXNlIGFkZC4KLQkJCQkJCQkgKi8KLQkJCQkJCQlTdHJpbmcgbmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVTdGFydCwgcG9zKTsKLQkJCQkJCQlQYXJhbWV0ZXJzLlBhcmFtZXRlciBwYXJhbSA9IGluZm8uZ2V0UGFyYW1ldGVyKG5hbWUpOwotCQkJCQkJCWlmIChwYXJhbSA9PSBudWxsKSB7Ci0JCQkJCQkJCXBhcmFtID0gaW5mby5hZGRQYXJhbWV0ZXIobmFtZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWludCBwb3MyOwotCQkJCQkJCWlmICgocG9zMiA9IGxpbmUuaW5kZXhPZigiOnZhbHVlOiIsIHBvcykpID49IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlwYXJhbS5zZXRWYWx1ZShsaW5lLnN1YnN0cmluZyhwb3MyICsgNykpOwotCQkJCQkJCX0gZWxzZSBpZiAoKHBvczIgPSBsaW5lLmluZGV4T2YoIjpzdGF0dXM6IiwgcG9zKSkgPj0gMCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmIChsaW5lLnN1YnN0cmluZyhwb3MyICsgOCkuZXF1YWxzKCJyZWFkLW9ubHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlwYXJhbS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAoKHBvczIgPSBsaW5lLmluZGV4T2YoIjpoZWxwOiIsIHBvcykpID49IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlwYXJhbS5zZXRIZWxwKGxpbmUuc3Vic3RyaW5nKHBvczIgKyA2KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IHZhbFN0YXJ0ID0gbGluZS5sYXN0SW5kZXhPZigiOiIpOyAvLyB3aWxsIGZhaWwgaWYgdmFsdWUgY29udGFpbnMgYSBjb2xvbiEgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAodmFsU3RhcnQgPj0gMCkgewotCQkJCQkJaW5mby5hZGQobGluZS5zdWJzdHJpbmcoMCwgdmFsU3RhcnQpLCBsaW5lLnN1YnN0cmluZyh2YWxTdGFydCsxKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPcGVuIE1QSSBwYXJhbWV0ZXJzOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChQYXJhbWV0ZXJzLlBhcmFtZXRlciBwYXJhbSA6IGluZm8uZ2V0UGFyYW1ldGVycygpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiICB7MH09ezF9IiwgcGFyYW0uZ2V0TmFtZSgpLCBwYXJhbS5nZXRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgT3Blbk1QSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLk9wZW5NUElEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkUGFyc2VPdXRwdXQsIGUpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSUhvc3RNYXAuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSUhvc3RNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNzMxYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElIb3N0TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJSG9zdE1hcCB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBIb3N0IHsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fRVJST1JTID0gMDsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJSX05VTV9TTE9UUyA9IDEgPDwgMTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJSX01BWF9OVU1fU0xPVFMgPSAxIDw8IDI7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUl9VTktOT1dOX0FUVFIgPSAxIDw8IDM7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG51bVByb2Nlc3NvcnMgPSAwOwotCQlwcml2YXRlIGludCBtYXhOdW1Qcm9jZXNzb3JzID0gMDsKLQkJcHJpdmF0ZSBpbnQgZXJyb3JzID0gTk9fRVJST1JTOwotCi0JCXB1YmxpYyBIb3N0KFN0cmluZyBob3N0bmFtZSkgewotCQkJdGhpcy5uYW1lID0gaG9zdG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE51bVByb2Nlc3NvcnMoKSB7Ci0JCQlyZXR1cm4gbnVtUHJvY2Vzc29yczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWF4TnVtUHJvY2Vzc29ycygpIHsKLQkJCXJldHVybiBtYXhOdW1Qcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEVycm9ycygpIHsKLQkJCXJldHVybiBlcnJvcnM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROdW1Qcm9jZXNzb3JzKGludCBudW1Qcm9jZXNzb3JzKSB7Ci0JCQl0aGlzLm51bVByb2Nlc3NvcnMgPSBudW1Qcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TWF4TnVtUHJvY2Vzc29ycyhpbnQgbWF4TnVtUHJvY2Vzc29ycykgewotCQkJdGhpcy5tYXhOdW1Qcm9jZXNzb3JzID0gbWF4TnVtUHJvY2Vzc29yczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9ycyhpbnQgZXJyb3JzKSB7Ci0JCQl0aGlzLmVycm9ycyB8PSBlcnJvcnM7Ci0JCX0KLQl9Ci0KLQlMaXN0PEhvc3Q+IGhvc3RzID0gbmV3IEFycmF5TGlzdDxIb3N0PigpOwotCU1hcDxTdHJpbmcsIEhvc3Q+IGhvc3ROYW1lVG9Ib3N0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBIb3N0PigpOwotCWJvb2xlYW4gaGFzRXJyb3JzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIb3N0KEhvc3QgaG9zdCkgewotCQlob3N0cy5hZGQoaG9zdCk7Ci0JCWhvc3ROYW1lVG9Ib3N0LnB1dChob3N0LmdldE5hbWUoKSwgaG9zdCk7Ci0JfQotCi0JcHVibGljIEhvc3RbXSBnZXRIb3N0cygpIHsKLQkJcmV0dXJuIGhvc3RzLnRvQXJyYXkobmV3IEhvc3RbaG9zdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEhvc3Q+IGdldEhvc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIGhvc3RzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBIb3N0IGdldEhvc3RCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGhvc3ROYW1lVG9Ib3N0LmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREZWZhdWx0SG9zdChTdHJpbmcgbmFtZSkgewotCQlPcGVuTVBJSG9zdE1hcC5Ib3N0IGhvc3QgPSBuZXcgT3Blbk1QSUhvc3RNYXAuSG9zdChuYW1lKTsKLQkJaG9zdC5udW1Qcm9jZXNzb3JzID0gMTsKLQkJaG9zdC5tYXhOdW1Qcm9jZXNzb3JzID0gMDsKLQkJYWRkSG9zdChob3N0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KCkgewotCQlyZXR1cm4gaG9zdHMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1BhcnNlRXJyb3JzKCkgewotCQlyZXR1cm4gaGFzRXJyb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSUhvc3RNYXBQYXJzZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSUhvc3RNYXBQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ZjliYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElIb3N0TWFwUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbS5PcGVuTVBJSG9zdE1hcC5Ib3N0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSUhvc3RNYXBQYXJzZXIgewotCXByaXZhdGUgT3Blbk1QSUhvc3RNYXBQYXJzZXIoKSB7Ci0JCS8vIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMuCi0JfQotCi0JT3Blbk1QSUhvc3RNYXAgbWFwID0gbmV3IE9wZW5NUElIb3N0TWFwKCk7Ci0JLy8JYm9vbGVhbiBoYXNFcnJvcnMgPSBmYWxzZTsKLQotCXN0YXRpYyBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxccyooXFxTKykoKD86XFxzK1xcUys9XFxkKykqKVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBQYXR0ZXJuIHBhcmFtUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKihcXFMrKT0oXFxkKykiKTsgLy8kTk9OLU5MUy0xJAotCS8vCXN0YXRpYyBQYXR0ZXJuIGhvc3RuYW1lUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKihcXFMrKSIpOwotCS8vCXN0YXRpYyBQYXR0ZXJuIHNsb3RzUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKyg/OnNsb3RzfGNwdXN8Y291bnQpXFxzKj1cXHMqKFxcZCspIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQkvLwlzdGF0aWMgUGF0dGVybiBtYXhTbG90c1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxccyttYXgtc2xvdHNcXHMqPVxccyooXFxkKykiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCS8qCi0JICogU29tZSB2ZXJ5IGFkdmFuY2VkIHJlZ2V4LiBNYWNoZXMgYSBsaW5lIHRoYXQgZG9lcyBOT1QgY29udGFpbiBhIHZhbGlkIHBhcmFtZXRlci4KLQkgKiBJbiBvdGhlciB3b3JkcywgbWF0Y2hlcyBhIGxpbmUgd2l0aCBhbnkgaW52YWxpZCBwYXJhbWV0ZXIuCi0JICogXiAtIG1hdGNoIGJlZ2lubmluZyBvZiBsaW5lCi0JICogKCEgKSAtIG1hdGNoIHN0cmluZyB0aGF0IGRvZXMgbm90IHNhdGlzZnkgdGhlIGVuY2xvc2VkIHJlZ2V4Ci0JICogKC4qXFxzKD86Y291bnR8Y3B1c3xzbG90cylcXHMqPSAtIG1hdGNoZXMgdGhlIHdvcmRzIGNvdW50LGNwdXMgb3Igc2xvdHMgc3RhcnRpbmcgYW55d2hlcmUsCi0JICogICAgIHdpdGggYSBzcGFjZSBiZWZvcmUsIGFuZCBmb2xsb3dlZCBieSBlcXVhbCB3aXRoIG9wdGlvbmFsIGludGVybGVhdmluZyBzcGFjZS4KLQkgKi8KLQkvLwlzdGF0aWMgUGF0dGVybiBvdGhlcnNQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeKD8hLipcXHMoPzpjb3VudHxjcHVzfHNsb3RzfG1heC1zbG90cylcXHMqPSkiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCi0JcHVibGljIHN0YXRpYyBPcGVuTVBJSG9zdE1hcCBwYXJzZShCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU9wZW5NUElIb3N0TWFwUGFyc2VyIHBhcnNlciA9IG5ldyBPcGVuTVBJSG9zdE1hcFBhcnNlcigpOwotCQlTdHJpbmcgbGluZTsKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBSZW1vdmUgY29tbWVudHMgZnJvbSBsaW5lLgotCQkJICovCi0JCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoJyMnKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCWxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQl9Ci0JCQlsaW5lID0gbGluZS50cmltKCk7Ci0KLQkJCWlmIChsaW5lLmxlbmd0aCgpPT0wKSB7Ci0JCQkJLy8gSWdub3JlIGVtcHR5IGxpbmUKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGxpbmUpOwotCQkJaWYgKCEgbWF0Y2hlci5tYXRjaGVzKCkpIHsKLQkJCQkvLyBJZ25vcmUgdGhlIGxpbmUKLQkJCQlwYXJzZXIubWFwLmhhc0Vycm9ycyA9IHRydWU7Ci0JCQkJRGVidWdVdGlsLmVycm9yKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIklnbm9yaW5nIGludmFsaWQgbGluZTogJ3swfSciLCBsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogQWRkIGhvc3QuIEFjY29yZGluZyB0byBNYWNPUyBYIG1hbiBwYWdlIGZvciBtcGlydW46Ci0JCQkgKiAtIElmIHRoZSBudW1iZXIgb2Ygc2xvdHMgYW5kIG1heC1zbG90cyBhcmUgb21pdHRlZCwgdGhlbiBvcGVubXBpIHVuZGVyc3RhbmRzIHRoYXQgdGhlIGhvc3QgYWNjZXB0cwotCQkJICogb25seSBvbmUgcHJvY2VzcyBhbmQgdGhhdCBvdmVyc3Vic2NyaWJpbmcgaXMgYWxsb3dlZC4gVGhpcyBpcyBhc3N1bWVkIGFzIGRlZmF1bHQuCi0JCQkgKiAtIElmIG51bWJlciBvZiBzbG90cyBpcyBvbWl0dGVkLCBidXQgbm90IG1heC1zbG90cywgdGhlIGl0IGlzIGFzc3VtZWQgdGhhdCBzbG90cz1tYXgtc2xvdHMuCi0JCQkgKiAtIElmIGJvdGggbnVtYmVyIG9mIHNsb3RzIGFuZCBtYXgtc2xvdHMgYXJlIGdpdmUsIHRoZW4gdGhlaXIgdmFsdWVzIGFyZSBrZXB0LCBhcyBsb25nIGFzIHNsb3RzPD1tYXgtc2xvdHMuCi0JCQkgKi8KLQkJCU9wZW5NUElIb3N0TWFwLkhvc3QgaG9zdCA9IG5ldyBPcGVuTVBJSG9zdE1hcC5Ib3N0KG1hdGNoZXIuZ3JvdXAoMSkpOwotCQkJcGFyc2VyLm1hcC5ob3N0cy5hZGQoaG9zdCk7Ci0JCQlob3N0LnNldE51bVByb2Nlc3NvcnMoMCk7Ci0JCQlob3N0LnNldE1heE51bVByb2Nlc3NvcnMoMCk7Ci0KLQkJCVN0cmluZyBwYXJhbWV0ZXJzID0gbWF0Y2hlci5ncm91cCgyKTsKLQkJCW1hdGNoZXIgPSBwYXJhbVBhdHRlcm4ubWF0Y2hlcihwYXJhbWV0ZXJzKTsKLQkJCS8qCi0JCQkgKiBUcnkgdG8gZ2V0IHNsb3RzIGFuZCBtYXgtc2xvdHMgaW5mb3JtYXRpb24uCi0JCQkgKi8KLQkJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotCQkJCS8vCQkJZm9yIChpbnQgaSA9IDI7IGkgPD0gbWF0Y2hlci5ncm91cENvdW50KCk7IGkrPTIpIHsKLQkJCQlTdHJpbmcga2V5ID0gbWF0Y2hlci5ncm91cCgxKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBtYXRjaGVyLmdyb3VwKDIpOwotCi0JCQkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJzbG90cyIpIHx8IGtleS5lcXVhbHNJZ25vcmVDYXNlKCJjcHVzIikgfHwga2V5LmVxdWFsc0lnbm9yZUNhc2UoImNvdW50IikpIHsgICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQkJCQkJLyoKLQkJCQkJICogT24gZmFpbHVyZSB0byBwYXJzZSwgYXNzdW1lIDAgcHJvY2Vzc29ycyAobm8gaW5mbyBhdmFpbGFibGUpLgotCQkJCQkgKi8KLQkJCQkJdHJ5IHsKLQkJCQkJCWhvc3Quc2V0TnVtUHJvY2Vzc29ycyhJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0JCQkJCQlpZiAoaG9zdC5nZXROdW1Qcm9jZXNzb3JzKCkgPD0gMSkgewotCQkJCQkJCWhvc3Quc2V0TnVtUHJvY2Vzc29ycygwKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhvc3QuYWRkRXJyb3JzKE9wZW5NUElIb3N0TWFwLkhvc3QuRVJSX05VTV9TTE9UUyk7Ci0JCQkJCQlob3N0LnNldE51bVByb2Nlc3NvcnMoMSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJtYXgtc2xvdHMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQkvKgotCQkJCQkJICogT24gZmFpbHVyZSB0byBwYXJzZSwgYXNzdW1lIDAgKG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSkuCi0JCQkJCQkgKi8KLQkJCQkJCWhvc3Quc2V0TWF4TnVtUHJvY2Vzc29ycyhJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0JCQkJCQlpZiAoaG9zdC5nZXRNYXhOdW1Qcm9jZXNzb3JzKCkgPD0gMSkgewotCQkJCQkJCWhvc3Quc2V0TWF4TnVtUHJvY2Vzc29ycygwKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhvc3QuYWRkRXJyb3JzKEhvc3QuRVJSX01BWF9OVU1fU0xPVFMpOwotCQkJCQkJaG9zdC5zZXRNYXhOdW1Qcm9jZXNzb3JzKDApOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRGVidWdVdGlsLmVycm9yKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgIkludmFsdWQgYXR0cmlidXRlOiAnezB9JyIsIG1hdGNoZXIuZ3JvdXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaG9zdC5hZGRFcnJvcnMoT3Blbk1QSUhvc3RNYXAuSG9zdC5FUlJfVU5LTk9XTl9BVFRSKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKgotCQkJICogVmFsaWRhdGUgbnVtYmVycy4KLQkJCSAqLwotCQkJaWYgKGhvc3QuZ2V0TnVtUHJvY2Vzc29ycygpID09IDApIHsKLQkJCQlpZiAoaG9zdC5nZXRNYXhOdW1Qcm9jZXNzb3JzKCkgPT0gMCkgewotCQkJCQlob3N0LnNldE51bVByb2Nlc3NvcnMoMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaG9zdC5zZXROdW1Qcm9jZXNzb3JzKGhvc3QuZ2V0TWF4TnVtUHJvY2Vzc29ycygpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChob3N0LmdldE1heE51bVByb2Nlc3NvcnMoKSA+IDApIHsKLQkJCQkJaWYgKGhvc3QuZ2V0TnVtUHJvY2Vzc29ycygpID4gaG9zdC5nZXRNYXhOdW1Qcm9jZXNzb3JzKCkpIHsKLQkJCQkJCWhvc3QuYWRkRXJyb3JzKEhvc3QuRVJSX01BWF9OVU1fU0xPVFMpOwotCQkJCQkJaG9zdC5zZXROdW1Qcm9jZXNzb3JzKGhvc3QuZ2V0TWF4TnVtUHJvY2Vzc29ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICIgIHswfSBzbG90cz17MX0gbWF4LXNsb3RzPXsyfSIsIGhvc3QuZ2V0TmFtZSgpLCBob3N0LmdldE51bVByb2Nlc3NvcnMoKSwgaG9zdC5nZXRNYXhOdW1Qcm9jZXNzb3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcGFyc2VyLm1hcDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxccyooXFxTKykoPzpcXHMrKFxcUyspXFxzKj1cXHMqKFxcZCspKSoiKTsgLy8kTk9OLU5MUy0xJAotCQlNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoImUgc2xvdHM9MyBtYXgtc2xvdHM9NCByPTUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIW0ubWF0Y2hlcygpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlmb3IoaW50IGkgPSAxOyBpIDw9IG0uZ3JvdXBDb3VudCgpOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtLmdyb3VwKGkpKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ydHN5c3RlbS9PcGVuTVBJUHJvY2Vzc01hcC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ydHN5c3RlbS9PcGVuTVBJUHJvY2Vzc01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA4ODg0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSVByb2Nlc3NNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJUHJvY2Vzc01hcCB7Ci0KLQkvKioKLQkgKiBBbiBhcHBsaWNhdGlvbiBsYXVuY2hlZCBieSBtcGlydW4uCi0JICogCi0JICogQGF1dGhvciBkZmZlcmJlcgotCSAqLwotCXN0YXRpYyBwdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gewotCQlwcml2YXRlIGludCBpbmRleDsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJZmluYWwgcHJpdmF0ZSBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJpYnV0ZU1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQlwcml2YXRlIGludCBudW1iZXJPZlByb2Nlc3NvcnM7Ci0KLQkJcHVibGljIEFwcGxpY2F0aW9uKGludCBpbmRleCwgU3RyaW5nIGFwcGxpY2F0aW9uTmFtZSwgaW50IG51bWJlck9mUHJvY2Vzc29ycykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMubmFtZSA9IGFwcGxpY2F0aW9uTmFtZTsKLQkJCXRoaXMubnVtYmVyT2ZQcm9jZXNzb3JzID0gbnVtYmVyT2ZQcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJCXJldHVybiBpbmRleDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROdW1iZXJPZlByb2Nlc3NvcnMoKSB7Ci0JCQlyZXR1cm4gbnVtYmVyT2ZQcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIEF0dHJpYnV0ZU1hbmFnZXIgZ2V0QXR0cmlidXRlTWFuYWdlcigpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGVNYW5hZ2VyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBob3N0IHRoYXQgaXMgZXhlY3V0aW5nIHByb2Nlc3NlcyBmcm9tIG1waXJ1bi4KLQkgKiAKLQkgKiBAYXV0aG9yIGRmZmVyYmVyCi0JICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBOb2RlIHsKLQkJLy8gSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgb3Blbm1waSAxLjIgYW5kIDEuMwotCQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVzb2x2ZWROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBudWxsOwotCi0JCWZpbmFsIHByaXZhdGUgQXR0cmlidXRlTWFuYWdlciBhdHRyaWJ1dGVNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQotCQkvLyBSZWZlcmVuY2VzIHRvIHByb2Nlc3Nlcy4KLQkJcHJpdmF0ZSBMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQotCQlwdWJsaWMgTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRSZXNvbHZlZE5hbWUoKSB7Ci0JCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCB8fCAhaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaXRlcmF0b3IgPSByZXNvbHZlZE5hbWVzLmxpc3RJdGVyYXRvcigpOwotCQkJfQotCQkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJCXJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFJlc29sdmVkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJaWYgKCFyZXNvbHZlZE5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJcmVzb2x2ZWROYW1lcy5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVNYW5hZ2VyKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZU1hbmFnZXI7Ci0JCX0KLQotCQkvLwkJcHVibGljIHZvaWQgYWRkUHJvY2Vzc29yKFByb2Nlc3MgcHJvY2VzcykgewotCQkvLwkJCXByb2Nlc3Nlcy5hZGQocHJvY2Vzcyk7Ci0JCS8vCQl9Ci0KLQkJcHVibGljIExpc3Q8UHJvY2Vzcz4gZ2V0UHJvY2Vzc2VzKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocHJvY2Vzc2VzKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQSBwcm9jZXNzIHNwYXduZWQgYnkgbXBpcnVuIGZvciBhIGNlcnRhaW4gYXBwbGljYXRpb24gb24gYSBjZXJ0YWluIG5vZGUuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBQcm9jZXNzIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCXByaXZhdGUgaW50IGFwcGxpY2F0aW9uSW5kZXg7Ci0JCXByaXZhdGUgTm9kZSBub2RlOwotCi0JCWZpbmFsIHByaXZhdGUgQXR0cmlidXRlTWFuYWdlciBhdHRyaWJ1dGVNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQotCQlwdWJsaWMgUHJvY2VzcyhOb2RlIG5vZGUsIGludCBpbmRleCwgU3RyaW5nIG5hbWUsIGludCBhcHBsaWNhdGlvbkluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLmFwcGxpY2F0aW9uSW5kZXggPSBhcHBsaWNhdGlvbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQkJcmV0dXJuIGluZGV4OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRBcHBsaWNhdGlvbkluZGV4KCkgewotCQkJcmV0dXJuIGFwcGxpY2F0aW9uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgQXR0cmlidXRlTWFuYWdlciBnZXRBdHRyaWJ1dGVNYW5hZ2VyKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZU1hbmFnZXI7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBwcml2YXRlIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cmlidXRlTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JZmluYWwgcHJpdmF0ZSBMaXN0PEFwcGxpY2F0aW9uPiBhcHBsaWNhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFwcGxpY2F0aW9uPigpOwotCWZpbmFsIHByaXZhdGUgTWFwPFN0cmluZyxOb2RlPiBub2RlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxOb2RlPigpOwotCWZpbmFsIHByaXZhdGUgTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0KLQlwdWJsaWMgT3Blbk1QSVByb2Nlc3NNYXAoKSB7Ci0JCS8vIE5vdGhpbmcuCi0JfQotCi0JcHVibGljIExpc3Q8UHJvY2Vzcz4gZ2V0UHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChwcm9jZXNzZXMpOwotCX0KLQotCXB1YmxpYyBMaXN0PE5vZGU+IGdldE5vZGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PE5vZGU+KG5vZGVzLnZhbHVlcygpKSk7Ci0JfQotCi0JcHVibGljIExpc3Q8QXBwbGljYXRpb24+IGdldEFwcENvbnRleHRzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChhcHBsaWNhdGlvbnMpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVNYW5hZ2VyIGdldEF0dHJpYnV0ZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCXRoaXMuYXBwbGljYXRpb25zLmFkZChhcHBsaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShOb2RlIG5vZGUpIHsKLQkJbm9kZXMucHV0KG5vZGUuZ2V0TmFtZSgpLCBub2RlKTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbm9kZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3MoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXByb2Nlc3Nlcy5hZGQocHJvY2Vzcyk7Ci0JCXByb2Nlc3Mubm9kZS5wcm9jZXNzZXMuYWRkKHByb2Nlc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjY2E2NC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUElBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUuT3Blbk1QSUpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUuT3Blbk1QSU5vZGVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUElKb2JBdHRyaWJ1dGVzLk1hcHBpbmdNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXIgewotCXByaXZhdGUgT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXIoKSB7Ci0JCS8vIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMuCi0JfQotCi0JT3Blbk1QSVByb2Nlc3NNYXAgbWFwID0gbmV3IE9wZW5NUElQcm9jZXNzTWFwKCk7Ci0JaW50IG51bUFwcGxpY2F0aW9uczsKLQlpbnQgbnVtTm9kZXM7Ci0KLQlwdWJsaWMgc3RhdGljIE9wZW5NUElQcm9jZXNzTWFwIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlciBwYXJzZXIgPSBuZXcgT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXIoKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyksIDEpOwotCi0JCXBhcnNlci5yZWFkU3RhcnQocmVhZGVyKTsKLQkJcGFyc2VyLnJlYWRWcGlkKHJlYWRlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLm51bUFwcGxpY2F0aW9uczsgaSsrKSB7Ci0JCQlwYXJzZXIucmVhZEFwcENvbnRleHQocmVhZGVyKTsKLQkJfQotCQlwYXJzZXIucmVhZE51bUVsZW1lbnRzKHJlYWRlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLm51bU5vZGVzOyBpKyspIHsKLQkJCXBhcnNlci5yZWFkTWFwcGVkTm9kZShyZWFkZXIsIGkpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcnNlci5tYXA7Ci0JfQotCi0JLyoKLQkgKiBGaW5kIG1hcHBlZCBub2RlIGluZm9ybWF0aW9uLCBpZ25vcmluZyBhbnl0aGluZyBlbHNlLiBGb3JtYXQgc2hvdWxkIGJlOgotCSAqIAotCSAqIAkJTWFwcGVkIG5vZGU6Ci0JICogCQkJQ2VsbDogMCBOb2RlbmFtZTogZHluNTMxOTk1LmJyLmlibS5jb20gTGF1bmNoIGlkOiAtMSBVc2VybmFtZTogTlVMTAotCSAqIAkJCURhZW1vbiBuYW1lOgotCSAqIAkJCQlEYXRhIHR5cGU6IE9SVEVfUFJPQ0VTU19OQU1FIERhdGEgVmFsdWU6IE5VTEwKLQkgKiAJCQlPdmVyc3Vic2NyaWJlZDogVHJ1ZSBOdW0gZWxlbWVudHMgaW4gcHJvY3MgbGlzdDogNgotCSAqIAkJCU1hcHBlZCBwcm9jOgotCSAqIAkJCQlQcm9jIE5hbWU6Ci0JICogCQkJCURhdGEgdHlwZTogT1JURV9QUk9DRVNTX05BTUUgRGF0YSBWYWx1ZTogWzAsMSwwXQotCSAqIAkJCQlQcm9jIFJhbms6IDAgUHJvYyBQSUQ6IDAgQXBwX2NvbnRleHQgaW5kZXg6IDAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZE1hcHBlZE5vZGUoQnVmZmVyZWRSZWFkZXIgcmVhZGVyLCBpbnQgbm9kZUNvdW50ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKk1hcHBlZCBub2RlOiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lOwotCQkKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihsaW5lKTsKLQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsaW5lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uKTsKLQkJfQotCi0JCXAgPSBQYXR0ZXJuLmNvbXBpbGUoIlxccypDZWxsOlxccyooXFxTKilcXHMqTm9kZW5hbWU6XFxzKihcXFMqKVxccypMYXVuY2ggaWQ6XFxzKihcXFMqKVxccypVc2VybmFtZTpcXHMqKFxcUyopIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5vZGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlub2RlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZSwgbGluZSkpOwotCQkJCX0KLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbik7Ci0JCX0KLQkJCi0JCU9wZW5NUElQcm9jZXNzTWFwLk5vZGUgbm9kZSA9IG5ldyBPcGVuTVBJUHJvY2Vzc01hcC5Ob2RlKG5vZGVOYW1lKTsKLQkJbWFwLmFkZE5vZGUobm9kZSk7Ci0KLQkJcCA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKkRhZW1vbiBuYW1lOiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJTWF0Y2hlciBtID0gcC5tYXRjaGVyKGxpbmUpOwotCQkJaWYgKG0ubWF0Y2hlcygpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb24pOwotCQl9Ci0JCQotCQlwID0gUGF0dGVybi5jb21waWxlKCJcXHMqRGF0YSB0eXBlOlxccypcXFMqXFxzKkRhdGEgVmFsdWU6XFxzKlxcUyoiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihsaW5lKTsKLQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsaW5lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uKTsKLQkJfQotCQkKLQkJcCA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKk92ZXJzdWJzY3JpYmVkOlxccyooXFxTKilcXHMqTnVtIGVsZW1lbnRzIGluIHByb2NzIGxpc3Q6XFxzKihcXGQqKSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpbnQgbnVtUHJvY2Vzc2VzID0gMDsKLQkJCi0JCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgcyA9IG0uZ3JvdXAoMSk7Ci0JCQkJCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlub2RlLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmdldE92ZXJzdWJzY3JpYmVkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSh0cnVlKSk7Ci0JCQkJCX0gZWxzZSBpZiAocy5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5vZGUuZ2V0QXR0cmlidXRlTWFuYWdlcigpLmFkZEF0dHJpYnV0ZShPcGVuTVBJTm9kZUF0dHJpYnV0ZXMuZ2V0T3ZlcnN1YnNjcmliZWRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGZhbHNlKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0ludmFsaWRMaW5lLCBsaW5lKSk7Ci0JCQkJCX0KLQkJCQkJcyA9IG0uZ3JvdXAoMik7Ci0JCQkJCW51bVByb2Nlc3NlcyA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZSwgbGluZSkpOwotCQkJCX0KLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbik7Ci0JCX0KLQotCQlwID0gUGF0dGVybi5jb21waWxlKCJcXHMqTWFwcGVkIHByb2M6Iik7IC8vJE5PTi1OTFMtMSQKLQkJUGF0dGVybiBwMiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKlByb2MgTmFtZTpcXHMqKFxcUyopIik7IC8vJE5PTi1OTFMtMSQKLQkJUGF0dGVybiBwMyA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKkRhdGEgdHlwZTpcXHMqXFxTKlxccypEYXRhIFZhbHVlOlxccypcXFMqIik7IC8vJE5PTi1OTFMtMSQKLQkJUGF0dGVybiBwNCA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKlByb2MgUmFuazpcXHMqKFxcZCopXFxzKlByb2MgUElEOlxccyooXFxkKilcXHMqQXBwX2NvbnRleHQgaW5kZXg6XFxzKihcXGQqKSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Qcm9jZXNzZXM7IGkgKyspIHsKLQkJCVN0cmluZyBwcm9jZXNzTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgcHJvY2Vzc0luZGV4ID0gMDsKLQkJCWludCBwcm9jZXNzUGlkID0gMDsKLQkJCWludCBhcHBsaWNhdGlvbkluZGV4ID0gMDsKLQotCQkJLy8gTWFwcGVkIHByb2M6Ci0JCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihsaW5lKTsKLQkJCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy8gUHJvYyBOYW1lOgotCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlNYXRjaGVyIG0gPSBwMi5tYXRjaGVyKGxpbmUpOwotCQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCQlwcm9jZXNzTmFtZSA9IG0uZ3JvdXAoMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChsaW5lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbik7Ci0JCQl9Ci0KLQkJCS8vIERhdGEgdHlwZToKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJTWF0Y2hlciBtID0gcDMubWF0Y2hlcihsaW5lKTsKLQkJCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy8gUHJvYyBSYW5rOgotCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlNYXRjaGVyIG0gPSBwNC5tYXRjaGVyKGxpbmUpOwotCQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHMgPSBtLmdyb3VwKDEpOwotCQkJCQkJcHJvY2Vzc0luZGV4ID0gSW50ZWdlci5wYXJzZUludChzKTsKLQkJCQkJCXMgPSBtLmdyb3VwKDIpOwotCQkJCQkJcHJvY2Vzc1BpZCA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQkJCQlzID0gbS5ncm91cCgzKTsKLQkJCQkJCWFwcGxpY2F0aW9uSW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHMpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZSwgbGluZSkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb24pOwotCQkJfQotCi0JCQlPcGVuTVBJUHJvY2Vzc01hcC5Qcm9jZXNzIHByb2MgPSBuZXcgT3Blbk1QSVByb2Nlc3NNYXAuUHJvY2Vzcyhub2RlLCBwcm9jZXNzSW5kZXgsIHByb2Nlc3NOYW1lLCBhcHBsaWNhdGlvbkluZGV4KTsKLQkJCW1hcC5hZGRQcm9jZXNzKHByb2MpOwotCQkJdHJ5IHsKLQkJCQlwcm9jLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0UElEQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShwcm9jZXNzUGlkKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRoaXMgaXMgbm90IHBvc3NpYmxlLgotCQkJCWFzc2VydCBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogRmluZCBudW0gZWxlbWVudHMgbGluZSwgaWdub3JpbmcgYW55dGhpbmcgZWxzZS4gRm9ybWF0IHNob3VsZCBiZToKLQkgKgotCSAqCQlOdW0gZWxlbWVudHMgaW4gbm9kZXMgbGlzdDogMQotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkTnVtRWxlbWVudHMoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIlxccypOdW0gZWxlbWVudHMgaW4gbm9kZXMgbGlzdDpcXHMqKFxcZCopIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmU7Ci0JCQotCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJTWF0Y2hlciBtID0gcC5tYXRjaGVyKGxpbmUpOwotCQkJaWYgKG0ubWF0Y2hlcygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHMgPSBtLmdyb3VwKDEpOwotCQkJCQludW1Ob2RlcyA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZSwgbGluZSkpOwotCQkJCX0KLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb24pOwotCQl9Ci0JfQotCQotCS8qCi0JICogRmluZCBhcHAgY29udGV4dCwgaWdub3JpbmcgYW55dGhpbmcgZWxzZS4gRm9ybWF0IHNob3VsZCBiZToKLQkgKiAKLQkgKiAJCURhdGEgZm9yIGFwcF9jb250ZXh0OiBpbmRleCAwIGFwcDogaGVsbG8KLQkgKiAJCQlOdW0gcHJvY3M6IDQKLQkgKiAJCQlBcmd2WzBdOiBoZWxsbwotCSAqIAkJCUVudlswXTogT01QSV9NQ0Ffcm1hcHNfYmFzZV9kaXNwbGF5X21hcD0xCi0JICoJCQlFbnZbMV06IE9NUElfTUNBX29ydGVfcHJlY29uZGl0aW9uX3RyYW5zcG9ydHM9ZTkxYWUyZmQ5YTAwNzk2YS1lNTY4NWNlZmNkYmFhMDg5Ci0JICoJCQkuLi4KLQkgKgkJCVdvcmtpbmcgZGlyOiAvaG9tZS9kZmZlcmJlci9FY2xpcHNlV29ya3NwYWNlcy9ydW50aW1lLU5ld19jb25maWd1cmF0aW9uL2hlbGxvL0RlYnVnICh1c2VyOiAwKQotCSAqCQkJTnVtIG1hcHM6IDAKLQkgKgkJCQotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkQXBwQ29udGV4dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaW5lOwotCQlpbnQgYXBwbGljYXRpb25JbmRleCA9IDA7Ci0JCVN0cmluZyBhcHBsaWNhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbnVtYmVyT2ZQcm9jZXNzb3JzID0gMDsKLQotCQlQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIlxccypEYXRhIGZvciBhcHBfY29udGV4dDpcXHMqXFx3KlxccyooXFxkKilbXjpdKjpcXHMqKC4qKSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJTWF0Y2hlciBtID0gcC5tYXRjaGVyKGxpbmUpOwotCQotCQkJaWYgKG0ubWF0Y2hlcygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHMgPSBtLmdyb3VwKDEpOwotCQkJCQlhcHBsaWNhdGlvbkluZGV4ID0gSW50ZWdlci5wYXJzZUludChzKTsKLQkJCQkJcyA9IG0uZ3JvdXAoMik7Ci0JCQkJCWFwcGxpY2F0aW9uTmFtZSA9IHM7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZSwgbGluZSkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCWlmIChsaW5lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fQnJva2VuRGlzcGxheU1hcEluZm9ybWF0aW9uKTsKLQkJfQotCQkKLQkJcCA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKk51bSBwcm9jczpcXHMqKFxcZCopIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgcyA9IG0uZ3JvdXAoMSk7Ci0JCQkJCW51bWJlck9mUHJvY2Vzc29ycyA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZSwgbGluZSkpOwotCQkJCX0KLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb24pOwotCQl9Ci0KLQkJT3Blbk1QSVByb2Nlc3NNYXAuQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBuZXcgT3Blbk1QSVByb2Nlc3NNYXAuQXBwbGljYXRpb24oYXBwbGljYXRpb25JbmRleCwgYXBwbGljYXRpb25OYW1lLCBudW1iZXJPZlByb2Nlc3NvcnMpOwotCQltYXAuYWRkQXBwbGljYXRpb24oYXBwbGljYXRpb24pOwotCi0JCS8qCi0JCSAqIENvbGxlY3QgQXJndiBhbmQgRW52IGxpbmVzIHVudGlsIHdlIG1hdGNoIFdvcmtpbmcgRGlyCi0JCSAqLwotCQlQYXR0ZXJuIHAxID0gUGF0dGVybi5jb21waWxlKCJcXHMqQXJndlxcW1xcZCpcXF1cXHMqOlxccyooLiopIik7IC8vJE5PTi1OTFMtMSQKLQkJUGF0dGVybiBwMiA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKkVudlxcW1xcZCpcXF1cXHMqOlxccyooLiopIik7IC8vJE5PTi1OTFMtMSQKLQkJcCA9IFBhdHRlcm4uY29tcGlsZSgiXFxzKldvcmtpbmcgZGlyOlxccyooLiopIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0PFN0cmluZz4gYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3Q8U3RyaW5nPiBlbnZpcm9ubWVudCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQlTdHJpbmcgcyA9IG0uZ3JvdXAoMSkudHJpbSgpOwotCQkJCWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlcy5nZXRFZmZlY3RpdmVPcGVuTVBJV29ya2luZ0RpckF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUocykpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQltID0gcDEubWF0Y2hlcihsaW5lKTsKLQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCWFyZ3VtZW50cy5hZGQobS5ncm91cCgxKSk7Ci0JCQl9IGVsc2UgewotCQkJCW0gPSBwMi5tYXRjaGVyKGxpbmUpOwotCQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCQllbnZpcm9ubWVudC5hZGQobS5ncm91cCgxKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbik7Ci0JCX0KLQkJCi0JCWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlcy5nZXRFZmZlY3RpdmVPcGVuTVBJUHJvZ0FyZ3NBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGFyZ3VtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbYXJndW1lbnRzLnNpemUoKV0pKSk7Ci0JCWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSUFwcGxpY2F0aW9uQXR0cmlidXRlcy5nZXRFZmZlY3RpdmVPcGVuTVBJRW52QXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShlbnZpcm9ubWVudC50b0FycmF5KG5ldyBTdHJpbmdbZW52aXJvbm1lbnQuc2l6ZSgpXSkpKTsKLQotCQlpbnQgbnVtX21hcHMgPSAwOwotCQlwID0gUGF0dGVybi5jb21waWxlKCJcXHMqTnVtIG1hcHM6XFxzKihcXGQqKS4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAobS5tYXRjaGVzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgcyA9IG0uZ3JvdXAoMSk7Ci0JCQkJCW51bV9tYXBzID0gSW50ZWdlci5wYXJzZUludChzKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0ludmFsaWRMaW5lLCBsaW5lKSk7Ci0JCQkJfQotCQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbik7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFNraXAgbWFwIGluZm9ybWF0aW9uCi0JCSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bV9tYXBzOyBpKyspIHsKLQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJfQotCX0KLQotCS8qCi0JICogRmluZCBzZWNvbmQgbGluZSwgaWdub3JpbmcgYW55dGhpbmcgZWxzZS4gRm9ybWF0IHNob3VsZCBiZToKLQkgKiAKLQkgKiAJCVN0YXJ0aW5nIHZwaWQ6IDAgVnBpZCByYW5nZTogNiBOdW0gYXBwX2NvbnRleHRzOiAyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRWcGlkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJcXHMqU3RhcnRpbmcgdnBpZDpcXHMqKFxcZCopXFxzKlZwaWQgcmFuZ2U6XFxzKihcXHcqKVxccypOdW0gYXBwX2NvbnRleHRzOlxccyooXFx3KikuKiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lOwotCQkKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihsaW5lKTsKLQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBzID0gbS5ncm91cCgxKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1hcC5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCkuYWRkQXR0cmlidXRlKE9wZW5NUElKb2JBdHRyaWJ1dGVzLmdldFZwaWRTdGFydEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoSW50ZWdlci5wYXJzZUludChzKSkpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVGhpcyBpcyBub3QgcG9zc2libGUuCi0JCQkJCQlhc3NlcnQgZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcyA9IG0uZ3JvdXAoMik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYXAuZ2V0QXR0cmlidXRlTWFuYWdlcigpLmFkZEF0dHJpYnV0ZShPcGVuTVBJSm9iQXR0cmlidXRlcy5nZXRWcGlkUmFuZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKEludGVnZXIucGFyc2VJbnQocykpKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRoaXMgaXMgbm90IHBvc3NpYmxlLgotCQkJCQkJYXNzZXJ0IGZhbHNlOwotCQkJCQl9Ci0JCQkJCXMgPSBtLmdyb3VwKDMpOwotCQkJCQludW1BcHBsaWNhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHMpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fSW52YWxpZExpbmUsIGxpbmUpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsaW5lID09IG51bGwpIHsJCQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb24pOwotCQl9Ci0JfQotCQotCS8qCi0JICogRmluZCBzdGFydCBvZiBtYXAgb3V0cHV0LiBUaGlzIGlzIGEgbGluZSBmb3JtYXR0ZWQgbGlrZSB0aGUgb25lIGJlbG93LiBJZ25vcmUgZXZlcnl0aGluZwotCSAqIGJlZm9yZSB0aGlzIGxpbmUuCi0JICogCi0JICoJCVtkeW41MzE5OTUuYnIuaWJtLmNvbToxMjI4MV0gTWFwIGZvciBqb2I6IDEgR2VuZXJhdGVkIGJ5IG1hcHBpbmcgbW9kZTogYnlub2RlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRTdGFydChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZSgiXFxbKFteOl0qKTooXFxkKilcXF1cXHMqTWFwIGZvciBqb2I6XFxzKihcXGQqKVteOl0qOlxccyooXFx3KikuKiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lOwotCQkKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihsaW5lKTsKLQkJCWlmIChtLm1hdGNoZXMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCW1hcC5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCkuYWRkQXR0cmlidXRlKE9wZW5NUElKb2JBdHRyaWJ1dGVzLmdldEhvc3RuYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShtLmdyb3VwKDEpKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYXAuZ2V0QXR0cmlidXRlTWFuYWdlcigpLmFkZEF0dHJpYnV0ZShPcGVuTVBJSm9iQXR0cmlidXRlcy5nZXRNcGlKb2JJZEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDMpKSkpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVGhpcyBpcyBub3QgcG9zc2libGUuCi0JCQkJCQlhc3NlcnQgZmFsc2U7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1vZGUgPSBtLmdyb3VwKDQpOwotCQkJCQlpZiAobW9kZS5lcXVhbHNJZ25vcmVDYXNlKCJieW5vZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQltYXAuZ2V0QXR0cmlidXRlTWFuYWdlcigpLmFkZEF0dHJpYnV0ZShPcGVuTVBJSm9iQXR0cmlidXRlcy5nZXRNYXBwaW5nTW9kZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFwcGluZ01vZGUuQllfTk9ERSkpOwotCQkJCQl9IGVsc2UgaWYgKG1vZGUuZXF1YWxzSWdub3JlQ2FzZSgiYnlzbG90IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWFwLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSUpvYkF0dHJpYnV0ZXMuZ2V0TWFwcGluZ01vZGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hcHBpbmdNb2RlLkJZX1NMT1QpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fSW52YWxpZExpbmUsIGxpbmUpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fSW52YWxpZExpbmUsIGxpbmUpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsaW5lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fTWlzc2luZ0Rpc3BsYXlNYXBJbmZvcm1hdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQl0cnkgewotCQkJRmlsZUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgidGVzdC50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJT3Blbk1QSVByb2Nlc3NNYXBUZXh0MTJQYXJzZXIucGFyc2UoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ydHN5c3RlbS9PcGVuTVBJUHJvY2Vzc01hcFhtbDEzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWI2OWYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ydHN5c3RlbS9PcGVuTVBJUHJvY2Vzc01hcFhtbDEzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5PcGVuTVBJTm9kZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUuT3Blbk1QSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbS5PcGVuTVBJUHJvY2Vzc01hcC5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJUHJvY2Vzc01hcFhtbDEzUGFyc2VyIHsKLQlwcml2YXRlIE9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXIoKSB7Ci0JCS8vIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMuCi0JfQotCQotCS8qCi0JICogQXR0ZW1wdCB0byBjbGVhbiB1cCBxdWFzaS1YTUwgb3V0cHV0IGJ5IDEuMy4wIAotCSAqIAotCSAqIFdlIGtub3cgdGhlIGZvbGxvd2luZzoKLQkgKiAtIHRoZSBYTUwgaXMgbWFsZm9ybWVkIGJlY2F1c2UgaXQgZG9lc24ndCBpbmNsdWRlIGEgcm9vdCBlbGVtZW50Ci0JICogLSBYTUwgYmV0d2VlbiB0aGUgPG1hcD4gYW5kIDwvbWFwPiB0YWdzIHNob3VsZCBiZSB3ZWxsIGZvcm1lZAotCSAqIC0gPG5vZGVyZXNvbHZlPiBlbGVtZW50cyBwcmVjZWRlIHRoZSA8bWFwPgotCSAqIC0gdGhlcmUgbWF5IGJlIGdhcmJhZ2UgcHJlY2VkaW5nIHRoZSBmaXJzdCA8bm9kZXJlc29sdmU+IGFuZCBhZnRlciB0aGUgPC9tYXA+Ci0JICogCi0JICogV2UgbmVlZCB0bzoKLQkgKiAtIGluamVjdCBhIHJvb3QgZWxlbWVudAotCSAqIC0gaWdub3JlIGFueXRoaW5nIHByaW9yIHRvIHRoZSBmaXJzdCBhbmQgYWZ0ZXIgdGhlIGxhc3QgWE1MIHRhZ3MKLQkgKiAKLQkgKiBUbyBzaW1wbGlmeSB0aGUgcGFyc2luZyAoc28gd2UgZG9uJ3QgbmVlZCB0byBidWlsZCBhIGZ1bGwgWE1MIHBhcnNlcikgd2UgYXNzdW1lCi0JICogdGhhdDoKLQkgKiAtIHRoZSBYTUwgYmVnaW5zIHdpdGggMCBvciBtb3JlIDxub2RlcmVzb2x2ZT4gZWxlbWVudHMgZm9sbG93ZWQgYnkgYSA8bWFwPiBlbGVtZW50Ci0JICogLSA8bm9kZXJlc29sdmU+IGVsZW1lbnRzIGFyZSBhbHdheXMgZW1wdHktZWxlbWVudCB0YWdzCi0JICogLSB0aGVyZSBpcyBvbmx5IG9uZSA8bWFwPiBlbGVtZW50Ci0JICogLSB0aGUgZmluYWwgWE1MIHRhZyBpcyA8L21hcD4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIE9wZW5NUEkxMzBJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFBST0xPRyA9IDA7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFSVF9UQUcgPSAxOwotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWE1MID0gMjsKLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEVQSUxPRyA9IDM7Ci0JCi0JCXByaXZhdGUgaW50IHN0YXRlID0gUFJPTE9HOwotCQkvL3ByaXZhdGUgUXVldWU8SW50ZWdlcj4gc2F2ZWQgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPEludGVnZXI+KCk7Ci0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIHByb2xvZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXBpbG9nID0gbmV3IFN0cmluZ0J1ZmZlcig2KTsKLQkJCi0JCXByb3RlY3RlZCBPcGVuTVBJMTMwSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKLQkJCXN1cGVyKGluKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI3JlYWQoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3aGlsZSAoc3RhdGUgIT0gRVBJTE9HKSB7Ci0JCQkJaW50IGNoID0gc3VwZXIucmVhZCgpOwotCQkJCWlmIChjaCA8IDApIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQkJY2FzZSBQUk9MT0c6Ci0JCQkJCS8vIElnbm9yZSBhbnl0aGluZyBleGNlcHQgYSBsZXNzLXRoYW4KLQkJCQkJaWYgKGNoID09ICc8JykgewotCQkJCQkJc3RhdGUgPSBTVEFSVF9UQUc7Ci0JCQkJCQlwcm9sb2cuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBTVEFSVF9UQUc6Ci0JCQkJCS8vIEZpbmQgbWF0Y2hpbmcgZ3JlYXRlci10aGFuLiBJZiB3ZSBlbmNvdW50ZXIKLQkJCQkJLy8gYW5vdGhlciBsZXNzLXRoYW4sIGFzc3VtZSB0aGF0IHRoaXMgaXMgdGhlIG5ldyAKLQkJCQkJLy8gc3RhcnRpbmcgcG9pbnQKLQkJCQkJc3dpdGNoIChjaCkgewotCQkJCQljYXNlICc8JzoKLQkJCQkJCXByb2xvZy5kZWxldGUoMCwgcHJvbG9nLmxlbmd0aCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgJz4nOgotCQkJCQkJc3RhdGUgPSBYTUw7Ci0JCQkJCQlwcm9sb2cuaW5zZXJ0KDAsICI8b21waT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcHJvbG9nLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCWJyZWFrOwotCQkJCQotCQkJCWNhc2UgWE1MOgotCQkJCQllcGlsb2cuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJY2ggPSBlcGlsb2cuY2hhckF0KDApOwotCQkJCQlpZiAoZXBpbG9nLmxlbmd0aCgpID49IDYpIHsKLQkJCQkJCWlmIChlcGlsb2cuc3Vic3RyaW5nKGVwaWxvZy5sZW5ndGgoKS02KS5lcXVhbHMoIjwvbWFwPiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllcGlsb2cuYXBwZW5kKCI8L29tcGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzdGF0ZSA9IEVQSUxPRzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHJvbG9nLmxlbmd0aCgpID4gMCkgewotCQkJCQkJY2ggPSBwcm9sb2cuY2hhckF0KDApOwotCQkJCQkJcHJvbG9nLmRlbGV0ZUNoYXJBdCgwKTsKLQkJCQkJCXJldHVybiBjaDsKLQkJCQkJfQotCQkJCQllcGlsb2cuZGVsZXRlQ2hhckF0KDApOwotCQkJCQlyZXR1cm4gY2g7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAocHJvbG9nLmxlbmd0aCgpID4gMCkgewotCQkJCWludCBjaCA9IHByb2xvZy5jaGFyQXQoMCk7Ci0JCQkJcHJvbG9nLmRlbGV0ZUNoYXJBdCgwKTsKLQkJCQlyZXR1cm4gY2g7Ci0JCQl9Ci0JCQlpZiAoZXBpbG9nLmxlbmd0aCgpID4gMCkgewotCQkJCWludCBjaCA9IGVwaWxvZy5jaGFyQXQoMCk7Ci0JCQkJZXBpbG9nLmRlbGV0ZUNoYXJBdCgwKTsKLQkJCQlyZXR1cm4gY2g7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWludCBwb3MgPSBvZmY7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuICYmIGF2YWlsYWJsZSgpID4gMDsgaSsrKSB7Ci0JCQkJaW50IGNoID0gcmVhZCgpOwotCQkJCWlmIChjaCA8IDApIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQliW3BvcysrXSA9IChieXRlKSAoY2ggJiAweGZmKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHBvcyAtIG9mZjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiBzdGF0ZSA9PSBQUk9MT0cgPyAxIDogcHJvbG9nLmxlbmd0aCgpICsgZXBpbG9nLmxlbmd0aCgpOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgY2xhc3MgU3RhY2tDb250ZXh0SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQkJU3RhY2s8Q29udGV4dEhhbmRsZXI+IGhhbmRsZXJzID0gbmV3IFN0YWNrPENvbnRleHRIYW5kbGVyPigpOwotCi0JCXB1YmxpYyBTdGFja0NvbnRleHRIYW5kbGVyKENvbnRleHRIYW5kbGVyIGRvY3VtZW50SGFuZGxlcikgewotCQkJaGFuZGxlcnMucHVzaChkb2N1bWVudEhhbmRsZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCXN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQkJCS8vIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBwYXJzaW5nIGhhcyBzdGFydGVkCi0JCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCSgoSU9wZW5NcGlQcm9jZXNzTWFwWG1sMTNQYXJzZXJMaXN0ZW5lciApIGxpc3RlbmVyKS5zdGFydERvY3VtZW50KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJT3Blbk1QSVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlzdXBlci5lbmREb2N1bWVudCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCXN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgZWxlbWVudDogIituYW1lKTsKLQkJCUNvbnRleHRIYW5kbGVyIGhhbmRsZXIgPSBoYW5kbGVycy5wZWVrKCk7Ci0JCQlDb250ZXh0SGFuZGxlciBjaGlsZEhhbmRsZXIgPSBudWxsOwotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJCWNoaWxkSGFuZGxlciA9IGhhbmRsZXIubmV3RWxlbWVudChuYW1lKTsKLQkJCQlpZiAoY2hpbGRIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJY2hpbGRIYW5kbGVyLnN0YXJ0KCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgYXR0cl9uYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLQkJCQkJCVN0cmluZyBhdHRyX3ZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJCQkJCWNoaWxkSGFuZGxlci5zZXRBdHRyaWJ1dGUoYXR0cl9uYW1lLCBhdHRyX3ZhbHVlKTsKLQkJCQkJfQotCQkJCQljaGlsZEhhbmRsZXIucHJlcGFyZSgpOwotCQkJCX0KLQkJCX0KLQkJCWhhbmRsZXJzLnB1c2goY2hpbGRIYW5kbGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCXN1cGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIG5hbWUpOwotCQkJLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVuZCBlbGVtZW50OiAiK25hbWUpOwotCQkJQ29udGV4dEhhbmRsZXIgaGFuZGxlciA9IGhhbmRsZXJzLnBvcCgpOwotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJCWhhbmRsZXIuZmluaXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlzdXBlci5lcnJvcihlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJc3VwZXIuZmF0YWxFcnJvcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBPcGVuTVBJUHJvY2Vzc01hcCBtYXAgPSBuZXcgT3Blbk1QSVByb2Nlc3NNYXAoKTsKLQlwcm90ZWN0ZWQgZmluYWwgU3RhY2tDb250ZXh0SGFuZGxlciBoYW5kbGVyID0gbmV3IFN0YWNrQ29udGV4dEhhbmRsZXIobmV3IERvY3VtZW50SGFuZGxlcigpKTsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElPcGVuTXBpUHJvY2Vzc01hcFhtbDEzUGFyc2VyTGlzdGVuZXIgewotCQl2b2lkIHN0YXJ0RG9jdW1lbnQoKTsKLQkJdm9pZCBlbmREb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBVbmtub3duRWxlbWVudEV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBVbmtub3duRWxlbWVudEV4Y2VwdGlvbihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkVsZW1lbnQsIG5hbWUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBVbmtub3duQXR0cmlidXRlRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIFVua25vd25BdHRyaWJ1dGVFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX1Vua25vd25BdHRyaWJ1dGUsIG5hbWUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdBdHRyaWJ1dGUsIG5hbWUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBJbnZhbGlkSW50ZWdlckF0dHJpYnV0ZUV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBJbnZhbGlkSW50ZWdlckF0dHJpYnV0ZUV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9BdHRyaWJ1dGVOb3RJbnRlZ2VyLCBuYW1lLCB2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFBhcnNlSW50ZXJydXB0ZWRFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGV4dEhhbmRsZXIgewotCQlwdWJsaWMgQ29udGV4dEhhbmRsZXIgbmV3RWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQl0aHJvdyBuZXcgVW5rbm93bkVsZW1lbnRFeGNlcHRpb24obmFtZSk7Ci0JCX0KLQkJLyoqIENhbGxlZCB3aGVuIHJlYWRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFnLiAqLwotCQlwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gRW1wdHkKLQkJfQotCQkvKiogQ2FsbGVkIGZvciBlYWNoIGFyZ3VtZW50IGZvdW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhZy4gKi8KLQkJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJdGhyb3cgbmV3IFVua25vd25BdHRyaWJ1dGVFeGNlcHRpb24obmFtZSk7Ci0JCX0KLQkJLyoqIENhbGxlZCB3aGVuIGFsbCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiByZWFkIGFuZCB0YWcgY29udGVudCBpcyBnb2luZyB0byBiZSByZWFkLiAqLwotCQlwdWJsaWMgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBFbXB0eQotCQl9Ci0JCS8qKiBDYWxsZWQgd2hlbiBmaW5pc2hlZCByZWFkaW5nIHRoZSBlbmQgb2YgdGhlIHRhZy4gKi8KLQkJcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBFbXB0eQotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIERvY3VtZW50SGFuZGxlciBleHRlbmRzIENvbnRleHRIYW5kbGVyIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250ZXh0SGFuZGxlciBuZXdFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIm9tcGkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBPbXBpSGFuZGxlcigpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5ld0VsZW1lbnQobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgT21waUhhbmRsZXIgZXh0ZW5kcyBDb250ZXh0SGFuZGxlciB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29udGV4dEhhbmRsZXIgbmV3RWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJtYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBNYXBIYW5kbGVyKCk7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibm9kZXJlc29sdmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBOb2RlUmVzb2x2ZUhhbmRsZXIoKTsKLQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGxvY2F0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOyAvLyBpZ25vcmUKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLm5ld0VsZW1lbnQobmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlzdXBlci5maW5pc2goKTsKLQkJCS8vIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBlbmQgaGFzIGJlZW4gcmVhY2hlZC4KLQkJCWZvciAoT2JqZWN0IGxpc3RlbmVyIDogbGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChJT3Blbk1waVByb2Nlc3NNYXBYbWwxM1BhcnNlckxpc3RlbmVyICkgbGlzdGVuZXIpLmVuZERvY3VtZW50KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJT3Blbk1QSVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUaHJvdyBleGNlcHRpb24gdG8gZm9yY2Ugc3RvcCBwYXJzaW5nLgotCQkJLy8gT3IgZWxzZSwgdGhlIHBhcnNlciB3b3VsZCBjb21wbGFpbiBhYm91dCBjb250ZW50IG5vdCBhbGxvd3MgYWZ0ZXIgaW4gdHJhaWxpbmcgc2VjdGlvbi4KLQkJCXRocm93IG5ldyBQYXJzZUludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgTWFwSGFuZGxlciBleHRlbmRzIENvbnRleHRIYW5kbGVyIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250ZXh0SGFuZGxlciBuZXdFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImhvc3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBIb3N0SGFuZGxlcigpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5ld0VsZW1lbnQobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgTm9kZVJlc29sdmVIYW5kbGVyIGV4dGVuZHMgQ29udGV4dEhhbmRsZXIgewotCQlwcml2YXRlIFN0cmluZyBub2RlTmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIHJlc29sdmVkTmFtZSA9IG51bGw7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibmFtZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlub2RlTmFtZSA9IHZhbHVlOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInJlc29sdmVkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc29sdmVkTmFtZSA9IHZhbHVlOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKG5vZGVOYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmVzb2x2ZWROYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTWlzc2luZ0F0dHJpYnV0ZUV4Y2VwdGlvbigicmVzb2x2ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlOb2RlIG5vZGUgPSBtYXAuZ2V0Tm9kZShyZXNvbHZlZE5hbWUpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBuZXcgTm9kZShyZXNvbHZlZE5hbWUpOwotCQkJCW1hcC5hZGROb2RlKG5vZGUpOwotCQkJfQotCQkJbm9kZS5hZGRSZXNvbHZlZE5hbWUobm9kZU5hbWUpOwotCQkJc3VwZXIuZmluaXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgSG9zdEhhbmRsZXIgZXh0ZW5kcyBDb250ZXh0SGFuZGxlciB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNfbnVtX3Nsb3RzID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNfbWF4X3Nsb3RzID0gZmFsc2U7Ci0JCXByaXZhdGUgaW50IG51bV9zbG90cyA9IDA7Ci0JCXByaXZhdGUgaW50IG1heF9zbG90cyA9IDA7Ci0KLQkJcHJpdmF0ZSBOb2RlIG5vZGU7Ci0JCXByaXZhdGUgTGlzdDxPcGVuTVBJUHJvY2Vzc01hcC5Qcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PE9wZW5NUElQcm9jZXNzTWFwLlByb2Nlc3M+KCk7Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250ZXh0SGFuZGxlciBuZXdFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInByb2Nlc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBQcm9jZXNzSGFuZGxlcihub2RlKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5uZXdFbGVtZW50KG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIm5hbWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5uYW1lID0gdmFsdWU7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2xvdHMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJbnVtX3Nsb3RzID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQkJCWlmIChudW1fc2xvdHMgPCAwKQotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnRlZ2VyQXR0cmlidXRlRXhjZXB0aW9uKG5hbWUsIHZhbHVlKTsKLQkJCQkJaGFzX251bV9zbG90cyA9IHRydWU7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnRlZ2VyQXR0cmlidXRlRXhjZXB0aW9uKG5hbWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibWF4X3Nsb3RzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCW1heF9zbG90cyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQkJCQlpZiAobWF4X3Nsb3RzIDwgMCkKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW50ZWdlckF0dHJpYnV0ZUV4Y2VwdGlvbihuYW1lLCB2YWx1ZSk7Ci0JCQkJCWlmIChtYXhfc2xvdHMgIT0gMCkgewotCQkJCQkJaGFzX21heF9zbG90cyA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52YWxpZEludGVnZXJBdHRyaWJ1dGVFeGNlcHRpb24obmFtZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE1pc3NpbmdBdHRyaWJ1dGVFeGNlcHRpb24oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCEgaGFzX251bV9zbG90cykgewotCQkJCXRocm93IG5ldyBNaXNzaW5nQXR0cmlidXRlRXhjZXB0aW9uKCJzbG90cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlub2RlID0gbWFwLmdldE5vZGUobmFtZSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IG5ldyBOb2RlKG5hbWUpOwotCQkJCW1hcC5hZGROb2RlKG5vZGUpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlub2RlLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmdldE51bWJlck9mTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG51bV9zbG90cykpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGlzIGlzIG5vdCBwb3NzaWJsZQotCQkJCU9wZW5NUElQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJaWYgKGhhc19tYXhfc2xvdHMpIHsKLQkJCQl0cnkgewotCQkJCQlub2RlLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5hZGRBdHRyaWJ1dGUoT3Blbk1QSU5vZGVBdHRyaWJ1dGVzLmdldE1heGltYWxOdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShtYXhfc2xvdHMpKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUaGlzIGlzIG5vdCBwb3NzaWJsZQotCQkJCQlPcGVuTVBJUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5wcmVwYXJlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLyoKLQkJCSAqIENvdW50IGhvdyBtYW55IHByb2Nlc3NlcyBhcmUgcnVubmluZyBvbiB0aGUgaG9zdCBhbmQgY2hlY2sgaWYgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIGFsbG93ZWQgb25lLgotCQkJICogSWYgeWVzLCB0aGVuIHRoZSBub2RlIGlzIG92ZXJzdWJzY3JpYmVkLgotCQkJICovCi0JCQlhc3NlcnQgbm9kZSAhPSBudWxsOwotCQkJbm9kZS5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCkuYWRkQXR0cmlidXRlKE9wZW5NUElOb2RlQXR0cmlidXRlcy5nZXRPdmVyc3Vic2NyaWJlZEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUocHJvY2Vzc2VzLnNpemUoKSA+IG51bV9zbG90cykpOwotCQkJc3VwZXIuZmluaXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUHJvY2Vzc0hhbmRsZXIgZXh0ZW5kcyBDb250ZXh0SGFuZGxlciB7Ci0JCXByaXZhdGUgTm9kZSBub2RlOwotCQlwcml2YXRlIGludCByYW5rOwotCi0JCXB1YmxpYyBQcm9jZXNzSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJCXRoaXMubm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicmFuayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlyYW5rID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQkJCWlmIChyYW5rIDwgMCkKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW50ZWdlckF0dHJpYnV0ZUV4Y2VwdGlvbihuYW1lLCB2YWx1ZSk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnRlZ2VyQXR0cmlidXRlRXhjZXB0aW9uKG5hbWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlPcGVuTVBJUHJvY2Vzc01hcC5Qcm9jZXNzIHByb2Nlc3MgPSBuZXcgT3Blbk1QSVByb2Nlc3NNYXAuUHJvY2Vzcyhub2RlLCByYW5rLCBJbnRlZ2VyLnRvU3RyaW5nKHJhbmspLCAxKTsKLQkJCW1hcC5hZGRQcm9jZXNzKHByb2Nlc3MpOwotCQkJc3VwZXIuZmluaXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9wZW5NUElQcm9jZXNzTWFwIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcGFyc2UoaXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT3Blbk1QSVByb2Nlc3NNYXAgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIElPcGVuTXBpUHJvY2Vzc01hcFhtbDEzUGFyc2VyTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXIgcGFyc2VyID0gbmV3IE9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXIoKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXBhcnNlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCU9wZW5NUEkxMzBJbnB1dFN0cmVhbSBvaXMgPSBwYXJzZXIubmV3IE9wZW5NUEkxMzBJbnB1dFN0cmVhbShpcyk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9pcyk7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlTQVhQYXJzZXIgc2F4UGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCXNheFBhcnNlci5wYXJzZShiaXMsIHBhcnNlci5oYW5kbGVyKTsKLQkJfSBjYXRjaCAoUGFyc2VJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIG9rIGFuZCBleHBlY3RlZAotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyLm1hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJT3Blbk1waVByb2Nlc3NNYXBYbWwxM1BhcnNlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElPcGVuTXBpUHJvY2Vzc01hcFhtbDEzUGFyc2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQl0cnkgewotCQkJRmlsZUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgieG1sX3NhbXBsZS50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJT3Blbk1QSVByb2Nlc3NNYXAgbWFwID0gT3Blbk1QSVByb2Nlc3NNYXBYbWwxM1BhcnNlci5wYXJzZShpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElSdW50aW1lU3lzdGVtLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElSdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzlmMjkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvY29yZS9ydHN5c3RlbS9PcGVuTVBJUnVudGltZVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdEVmZmVjdGl2ZVRvb2xSTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5wYXJhbWV0ZXJzLk9tcGlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJtc3lzdGVtLkVmZmVjdGl2ZU9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJtc3lzdGVtLk9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSVJ1bnRpbWVTeXN0ZW0gZXh0ZW5kcyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHsKLQotCXByaXZhdGUgT21waUluZm8gaW5mbyA9IG5ldyBPbXBpSW5mbygpOwotCi0JLyoqIFRoZSBtYWNoaW5lIHdoZXJlIG9wZW4gbXBpIGlzIHJ1bm5pbmcgb24uICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFjaGluZUlEOwotCS8qKiBUaGUgcXVldWUgdGhhdCBkaXNwYXRjaGVzIGpvYnMgdG8gbXBpLiAqLwotCXByaXZhdGUgU3RyaW5nIHF1ZXVlSUQ7Ci0JLyoqIE1hcHBpbmcgb2YgZGlzY292ZXJlZCBob3N0cyBhbmQgdGhlaXIgSUQgZm9yIElQTm9kZSBlbGVtZW50cy4gKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsU3RyaW5nPiBub2RlVG9JRE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHVibGljIE9wZW5NUElSdW50aW1lU3lzdGVtKEludGVnZXIgb3Blbm1waV9ybWlkLAotCQkJT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgYXR0ckRlZk1ncikgewotCQlzdXBlcihvcGVubXBpX3JtaWQsIGNvbmZpZywgYXR0ckRlZk1ncik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFjaGluZUlEKFN0cmluZyBtYWNoaW5lSUQpIHsKLQkJdGhpcy5tYWNoaW5lSUQgPSBtYWNoaW5lSUQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVldWVJRChTdHJpbmcgcXVldWVJRCkgewotCQl0aGlzLnF1ZXVlSUQgPSBxdWV1ZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFjaGluZUlEKCkgewotCQlyZXR1cm4gbWFjaGluZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVldWVJRCgpIHsKLQkJcmV0dXJuIHF1ZXVlSUQ7Ci0JfQotCi0JcHVibGljIE9tcGlJbmZvIGdldE9tcGlJbmZvKCkgewotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVJRGZvck5hbWUoU3RyaW5nIGhvc3RuYW1lKSB7Ci0JCXJldHVybiBub2RlVG9JRE1hcC5nZXQoaG9zdG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVJREZvck5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkgewotCQlub2RlVG9JRE1hcC5wdXQobmFtZSwgaWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSNkb1NodXRkb3duKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU2h1dGRvd24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9TdGFydEV2ZW50cygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TdGFydEV2ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSNkb1N0YXJ0dXAob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TdGFydHVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtI2RvU3RvcEV2ZW50cygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TdG9wRXZlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvYiBjcmVhdGVEaXNjb3ZlckpvYigpIHsKLQkJaWYgKCEgcm1Db25maWd1cmF0aW9uLmhhc0Rpc2NvdmVyQ21kKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSm9iIGpvYiA9IG5ldyBPcGVuTVBJRGlzY292ZXJKb2IodGhpcyk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQlqb2Iuc2V0U3lzdGVtKGZhbHNlKTsKLQkJam9iLnNldFVzZXIoZmFsc2UpOwotCQlyZXR1cm4gam9iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2IgY3JlYXRlUGVyaW9kaWNNb25pdG9ySm9iKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9iIGNyZWF0ZUNvbnRpbnVvdXNNb25pdG9ySm9iKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9iIGNyZWF0ZVJ1bnRpbWVTeXN0ZW1Kb2IoU3RyaW5nIGpvYklELCBTdHJpbmcgcXVldWVJRCwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB7Ci0JCXJldHVybiBuZXcgT3Blbk1QSVJ1bnRpbWVTeXN0ZW1Kb2Ioam9iSUQsIHF1ZXVlSUQsIE1lc3NhZ2VzLk9wZW5NUElSdW50aW1lU3lzdGVtX0pvYk5hbWUsIHRoaXMsIGF0dHJNZ3IpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiByZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRWZmZWN0aXZlT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oZ2V0Um1Db25maWd1cmF0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSVJ1bnRpbWVTeXN0ZW1Kb2IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL2NvcmUvcnRzeXN0ZW0vT3Blbk1QSVJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2M2NlYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS9jb3JlL3J0c3lzdGVtL09wZW5NUElSdW50aW1lU3lzdGVtSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE5vZGVDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFByb2Nlc3NDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkVsZW1lbnRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLlByb2Nlc3NBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuVG9vbHNSTVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW1Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLklucHV0U3RyZWFtTGlzdGVuZXJUb091dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5JbnB1dFN0cmVhbU9ic2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUElMYXVuY2hBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLk9wZW5NUElQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucm1zeXN0ZW0uT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucnRzeXN0ZW0uT3Blbk1QSVByb2Nlc3NNYXAuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ydHN5c3RlbS5PcGVuTVBJUHJvY2Vzc01hcFhtbDEzUGFyc2VyLklPcGVuTXBpUHJvY2Vzc01hcFhtbDEzUGFyc2VyTGlzdGVuZXI7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElSdW50aW1lU3lzdGVtSm9iIGV4dGVuZHMgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYiB7Ci0JT2JqZWN0IGxvY2sxID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbU9ic2VydmVyIHN0ZGVyck9ic2VydmVyOwotCXByaXZhdGUgSW5wdXRTdHJlYW1PYnNlcnZlciBzdGRvdXRPYnNlcnZlcjsKLQotCS8qKiBJbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBsYXVuY2ggY29tbWFuZC4gKi8KLQlPcGVuTVBJUHJvY2Vzc01hcCBtYXA7Ci0KLQkvKioKLQkgKiBQcm9jZXNzIElEcyBjcmVhdGVkIGJ5IHRoaXMgam9iLiBUaGUgZmlyc3QgcHJvY2VzcyAoemVybyBpbmRleCkgaXMgc3BlY2lhbCwKLQkgKiBiZWNhdXNlIGl0IGlzIGFsd2F5cyBjcmVhdGVkLgotCSAqLwotCVN0cmluZyBwcm9jZXNzSURzW107Ci0KLQkvKiogRXhjZXB0aW9uIHJhaXNlZCB3aGlsZSBwYXJzaW5nIG1waSBtYXAgaW5mb3JtYXRpb24uICovCi0JSU9FeGNlcHRpb24gcGFyc2VyRXhjZXB0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBPcGVuTVBJUnVudGltZVN5c3RlbUpvYihTdHJpbmcgam9iSUQsIFN0cmluZyBxdWV1ZUlELCBTdHJpbmcgbmFtZSwgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSBydFN5c3RlbSwgQXR0cmlidXRlTWFuYWdlciBhdHRyTWdyKSB7Ci0JCXN1cGVyKGpvYklELCBxdWV1ZUlELCBuYW1lLCBydFN5c3RlbSwgYXR0ck1ncik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRpb25TdGFydGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBDcmVhdGUgYSB6ZXJvIGluZGV4IGpvYi4KLQkJICovCi0JCWZpbmFsIE9wZW5NUElSdW50aW1lU3lzdGVtIHJ0U3lzdGVtID0gKE9wZW5NUElSdW50aW1lU3lzdGVtKSBnZXRSdFN5c3RlbSgpOwotCQlmaW5hbCBJUEpvYiBpcEpvYiA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJ0U3lzdGVtLmdldFJtSUQoKSkuZ2V0UXVldWVCeUlkKGdldFF1ZXVlSUQoKSkuZ2V0Sm9iQnlJZChnZXRKb2JJRCgpKTsKLQkJZmluYWwgU3RyaW5nIHplcm9JbmRleFByb2Nlc3NJRCA9IHJ0U3lzdGVtLmNyZWF0ZVByb2Nlc3MoZ2V0Sm9iSUQoKSwgTWVzc2FnZXMuT3Blbk1QSVJ1bnRpbWVTeXN0ZW1Kb2JfUHJvY2Vzc05hbWUsIDApOwotCQlwcm9jZXNzSURzID0gbmV3IFN0cmluZ1tdIHsgemVyb0luZGV4UHJvY2Vzc0lEIH0gOwotCi0JCS8qCi0JCSAqIExpc3RlbmVyIHRoYXQgc2F2ZXMgc3Rkb3V0LgotCQkgKi8KLQkJZmluYWwgUGlwZWRPdXRwdXRTdHJlYW0gc3Rkb3V0T3V0cHV0U3RyZWFtID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JCWZpbmFsIFBpcGVkSW5wdXRTdHJlYW0gc3Rkb3V0SW5wdXRTdHJlYW0gPSBuZXcgUGlwZWRJbnB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJc3Rkb3V0SW5wdXRTdHJlYW0uY29ubmVjdChzdGRvdXRPdXRwdXRTdHJlYW0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnQgZmFsc2U7IC8vIFRoaXMgZXhjZXB0aW9uIGlzIG5vdCBwb3NzaWJsZQotCQl9Ci0JCWZpbmFsIElucHV0U3RyZWFtTGlzdGVuZXJUb091dHB1dFN0cmVhbSBzdGRvdXRQaXBlZFN0cmVhbUxpc3RlbmVyID0gbmV3IElucHV0U3RyZWFtTGlzdGVuZXJUb091dHB1dFN0cmVhbShzdGRvdXRPdXRwdXRTdHJlYW0pOwotCi0JCVRocmVhZCBzdGRvdXRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3Rkb3V0IHRocmVhZDogc3RhcnRlZCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQkJCUJ1ZmZlcmVkUmVhZGVyIHN0ZG91dEJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdGRvdXRJbnB1dFN0cmVhbSkpOwotCQkJCUlQUHJvY2VzcyBpcFByb2MgPSBpcEpvYi5nZXRQcm9jZXNzQnlJZCh6ZXJvSW5kZXhQcm9jZXNzSUQpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBsaW5lID0gc3Rkb3V0QnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCQkJCQkJc3luY2hyb25pemVkIChsb2NrMSkgewotCQkJCQkJCWlwUHJvYy5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3Rkb3V0QXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShsaW5lKSk7Ci0JCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX09VVFBVVF9UUkFDSU5HLCAiUlRTIGpvYiAjezB9Oj4gezF9Iiwgam9iSUQsIGxpbmUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlsaW5lID0gc3Rkb3V0QnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3Rkb3V0IHRocmVhZDogezB9IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJT3Blbk1QSVBsdWdpbi5sb2coZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3Rkb3V0UGlwZWRTdHJlYW1MaXN0ZW5lci5kaXNhYmxlKCk7Ci0JCQkJCS8vCQkJCQlpZiAoc3Rkb3V0T2JzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQkvLwkJCQkJCXN0ZG91dE9ic2VydmVyLnJlbW92ZUxpc3RlbmVyKHN0ZG91dFBpcGVkU3RyZWFtTGlzdGVuZXIpOwotCQkJCQkvLwkJCQkJfQotCQkJCQkvLwkJCQkJdHJ5IHsKLQkJCQkJLy8JCQkJCQlzdGRvdXRPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJLy8JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8JCQkJCQlQVFBDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQkJLy8JCQkJCX0KLQkJCQkJLy8JCQkJCXRyeSB7Ci0JCQkJCS8vCQkJCQkJc3Rkb3V0SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJLy8JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8JCQkJCQlQVFBDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCQkJLy8JCQkJCX0KLQkJCQl9Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3Rkb3V0IHRocmVhZDogZmluaXNoZWQiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQotCQkvKgotCQkgKiBMaXN0ZW5lciB0aGF0IHNhdmVzIHN0ZGVyci4KLQkJICovCi0JCWZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHN0ZGVyck91dHB1dFN0cmVhbSA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotCQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIHN0ZGVycklucHV0U3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXN0ZGVycklucHV0U3RyZWFtLmNvbm5lY3Qoc3RkZXJyT3V0cHV0U3RyZWFtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0IGZhbHNlOyAvLyBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgcG9zc2libGUKLQkJfQotCQlmaW5hbCBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0gc3RkZXJyUGlwZWRTdHJlYW1MaXN0ZW5lciA9IG5ldyBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0oc3RkZXJyT3V0cHV0U3RyZWFtKTsKLQkJVGhyZWFkIHN0ZGVyclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRlcnIgdGhyZWFkOiBzdGFydGVkIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgc3RkZXJyQnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0ZGVycklucHV0U3RyZWFtKSk7Ci0JCQkJSVBQcm9jZXNzIGlwUHJvYyA9IGlwSm9iLmdldFByb2Nlc3NCeUlkKHplcm9JbmRleFByb2Nlc3NJRCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGxpbmUgPSBzdGRlcnJCdWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQkJCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2sxKSB7Ci0JCQkJCQkJaXBQcm9jLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRlcnJBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGxpbmUpKTsKLQkJCQkJCQlpcFByb2MuYWRkQXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldFN0ZG91dEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobGluZSkpOwotCQkJCQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuUlRTX0pPQl9PVVRQVVRfVFJBQ0lORywgIlJUUyBqb2IgI3swfTo+IHsxfSIsIGpvYklELCBsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJbGluZSA9IHN0ZGVyckJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0ZGVyciB0aHJlYWQ6IHswfSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCU9wZW5NUElQbHVnaW4ubG9nKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0ZGVyclBpcGVkU3RyZWFtTGlzdGVuZXIuZGlzYWJsZSgpOwotCQkJCQkvLwkJCQkJaWYgKHN0ZGVyck9ic2VydmVyICE9IG51bGwpIHsKLQkJCQkJLy8JCQkJCQlzdGRlcnJPYnNlcnZlci5yZW1vdmVMaXN0ZW5lcihzdGRlcnJQaXBlZFN0cmVhbUxpc3RlbmVyKTsKLQkJCQkJLy8JCQkJCX0KLQkJCQkJLy8JCQkJCXRyeSB7Ci0JCQkJCS8vCQkJCQkJc3RkZXJyT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCS8vCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCQkJCQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJCS8vCQkJCQl9Ci0JCQkJCS8vCQkJCQl0cnkgewotCQkJCQkvLwkJCQkJCXN0ZGVycklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCS8vCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCQkJCQkJUFRQQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJCS8vCQkJCQl9Ci0JCQkJfQotCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0ZGVyciB0aHJlYWQ6IGZpbmlzaGVkIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQkJLyoKLQkJICogVGhyZWFkIHRoYXQgcGFyc2VzIG1hcCBpbmZvcm1hdGlvbi4KLQkJICovCi0JCWZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHBhcnNlck91dHB1dFN0cmVhbSA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotCQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIHBhcnNlcklucHV0U3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXBhcnNlcklucHV0U3RyZWFtLmNvbm5lY3QocGFyc2VyT3V0cHV0U3RyZWFtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0IGZhbHNlOyAvLyBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgcG9zc2libGUKLQkJfQotCQlmaW5hbCBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0gcGFyc2VyUGlwZWRTdHJlYW1MaXN0ZW5lciA9IG5ldyBJbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW0ocGFyc2VyT3V0cHV0U3RyZWFtKTsKLQkJVGhyZWFkIHBhcnNlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBkaXNwbGF5LW1hcCBwYXJzZXIgdGhyZWFkOiBzdGFydGVkIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQkJT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0UnRTeXN0ZW0oKS5nZXRSbUNvbmZpZ3VyYXRpb24oKTsKLQkJCQl0cnkgewotCQkJCQkvLyBQYXJzZSBzdGRvdXQgb3Igc3RkZXJyLCBkZXBlbmRpbmcgb24gbXBpIDEuMiBvciAxLjMKLQkJCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0VmVyc2lvbklkKCkuZXF1YWxzKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLlZFUlNJT05fMTIpKSB7Ci0JCQkJCQltYXAgPSBPcGVuTVBJUHJvY2Vzc01hcFRleHQxMlBhcnNlci5wYXJzZShwYXJzZXJJbnB1dFN0cmVhbSk7Ci0JCQkJCX0gZWxzZSBpZiAoY29uZmlndXJhdGlvbi5nZXRWZXJzaW9uSWQoKS5lcXVhbHMoT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uVkVSU0lPTl8xMykpIHsKLQkJCQkJCW1hcCA9IE9wZW5NUElQcm9jZXNzTWFwWG1sMTNQYXJzZXIucGFyc2UocGFyc2VySW5wdXRTdHJlYW0sIG5ldyBJT3Blbk1waVByb2Nlc3NNYXBYbWwxM1BhcnNlckxpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JCQkJCQkJCS8vIEVtcHR5Ci0JCQkJCQkJfQotCQkJCQkJCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBUdXJuIG9mIGxpc3RlbmVyIHRoYXQgZ2VuZXJhdGVzIGlucHV0IGZvciBwYXJzZXIgd2hlbiBwYXJzaW5nIGZpbmlzaGVzLgotCQkJCQkJCQkgKiBJZiBub3QgZG9uZSwgdGhlIHBhcnNlciB3aWxsIGNsb3NlIHRoZSBwaXBlZCBpbnB1dHN0cmVhbSwgbWFraW5nIHRoZSBsaXN0ZW5lcgotCQkJCQkJCQkgKiBnZXQgSU9FeGNlcHRpb25zIGZvciBjbG9zZWQgc3RyZWFtLgotCQkJCQkJCQkgKi8KLQkJCQkJCQkJaWYgKHN0ZGVyck9ic2VydmVyICE9IG51bGwpIHsKLQkJCQkJCQkJCXBhcnNlclBpcGVkU3RyZWFtTGlzdGVuZXIuZGlzYWJsZSgpOwotCQkJCQkJCQkJc3RkZXJyT2JzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIocGFyc2VyUGlwZWRTdHJlYW1MaXN0ZW5lcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFzc2VydCBmYWxzZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLyoKLQkJCQkJICogSWYgb3V0cHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQsIHRoZSBraWxsIHRoZSBtcGkgcHJvY2Vzcy4KLQkJCQkJICovCi0JCQkJCXBhcnNlckV4Y2VwdGlvbiA9IGU7Ci0vLwkJCQkJcHJvY2Vzcy5kZXN0cm95KCk7Ci0JCQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IGRpc3BsYXktbWFwIHBhcnNlciB0aHJlYWQ6IHswfSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGFyc2VyUGlwZWRTdHJlYW1MaXN0ZW5lci5kaXNhYmxlKCk7Ci0JCQkJCWlmIChzdGRlcnJPYnNlcnZlciAhPSBudWxsKSB7Ci0JCQkJCQlzdGRlcnJPYnNlcnZlci5yZW1vdmVMaXN0ZW5lcihwYXJzZXJQaXBlZFN0cmVhbUxpc3RlbmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBkaXNwbGF5LW1hcCBwYXJzZXIgdGhyZWFkOiBmaW5pc2hlZCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0YXJ0aW5nIGFsbCB0aHJlYWRzIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIENyZWF0ZSBhbmQgc3RhcnQgbGlzdGVuZXJzLgotCQkgKi8KLQkJc3Rkb3V0VGhyZWFkLnN0YXJ0KCk7Ci0JCXN0ZGVyclRocmVhZC5zdGFydCgpOwotCQlwYXJzZXJUaHJlYWQuc3RhcnQoKTsKLQotCQlzdGRlcnJPYnNlcnZlciA9IG5ldyBJbnB1dFN0cmVhbU9ic2VydmVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCXN0ZG91dE9ic2VydmVyID0gbmV3IElucHV0U3RyZWFtT2JzZXJ2ZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKLQotCQlzdGRvdXRPYnNlcnZlci5hZGRMaXN0ZW5lcihzdGRvdXRQaXBlZFN0cmVhbUxpc3RlbmVyKTsKLQkJc3RkZXJyT2JzZXJ2ZXIuYWRkTGlzdGVuZXIoc3RkZXJyUGlwZWRTdHJlYW1MaXN0ZW5lcik7Ci0KLQkJLy8gUGFyc2Ugc3Rkb3V0IG9yIHN0ZGVyciwgZGVwZW5kaW5nIG9uIG1waSAxLjIgb3IgMS4zCi0JCU9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pIGdldFJ0U3lzdGVtKCkuZ2V0Um1Db25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWd1cmF0aW9uLmdldFZlcnNpb25JZCgpLmVxdWFscyhPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5WRVJTSU9OXzEyKSkgewotCQkJIC8qIAotCQkJICAqIEZpeCBmb3IgYnVnICMyNzE4MTAgCi0JCQkgICovCi0JCQlpZiAoIXJ0U3lzdGVtLmdldFJlbW90ZVNlcnZpY2VzKCkuZ2V0SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuUlNFUmVtb3RlU2VydmljZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3RkZXJyT2JzZXJ2ZXIuYWRkTGlzdGVuZXIocGFyc2VyUGlwZWRTdHJlYW1MaXN0ZW5lcik7Ci0JCQl9IGVsc2UgewotCQkJCXN0ZG91dE9ic2VydmVyLmFkZExpc3RlbmVyKHBhcnNlclBpcGVkU3RyZWFtTGlzdGVuZXIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0VmVyc2lvbklkKCkuZXF1YWxzKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLlZFUlNJT05fMTMpKSB7Ci0JCQlzdGRvdXRPYnNlcnZlci5hZGRMaXN0ZW5lcihwYXJzZXJQaXBlZFN0cmVhbUxpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydCBmYWxzZTsKLQkJfQotCi0JCXN0ZGVyck9ic2VydmVyLnN0YXJ0KCk7Ci0JCXN0ZG91dE9ic2VydmVyLnN0YXJ0KCk7Ci0KLQkJdHJ5IHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgZm9yIGRpc3BsYXktbWFwIHBhcnNlciB0aHJlYWQgdG8gZmluaXNoIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJzZXJUaHJlYWQuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEbyBub3RoaW5nLgotCQl9Ci0KLQkJaWYgKHBhcnNlckV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogSWYgcHJvY2VzcyBjb21wbGV0ZWQgd2l0aCBlcnJvciwgdGhlbiBpdCBkaXNwbGF5IG1hcCBwYXJzaW5nIGZhaWxlZCBiZWNhdXNlIG9mIHRoZSBlcnJvciBtZXNzYWdlLgotCQkJICogSWYgcHJvY2VzcyBkaWQgbm90IGNvbXBsZXRlLCB0aGUgZGVzdHJveSBpdC4KLQkJCSAqLwotLy8JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJd2FpdCgxMDAwKTsKLS8vCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkvLyBJZ25vcmUKLS8vCQkJCX0KLS8vCQkJfQotCQkJYm9vbGVhbiBwYXJzZUVycm9yID0gdHJ1ZTsKLS8vCQkJaWYgKCFwcm9jZXNzLmlzQ29tcGxldGVkKCkpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBkZXN0cm95IHByb2Nlc3MgZHVlIHRvIGVycm9yIHdoaWxlIHBhcnNpbmcgZGlzcGxheSBtYXAiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCXByb2Nlc3MuZGVzdHJveSgpOwotLy8JCQl9IGVsc2UgewotLy8JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogcHJvY2VzcyB0ZXJtaW5hdGVkIHdpdGggbm8gdmFsaWQgZGlzcGxheSBtYXAiLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWlmIChwcm9jZXNzLmV4aXRWYWx1ZSgpICE9IDApIHsKLS8vCQkJCQlwYXJzZUVycm9yID0gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCS8qCi0JCQkgKiBXYWl0IHVudGlsIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgc3RvcCBiZWNhdXNlIHN0cmVhbSBhcmUgY2xvc2VkLgotCQkJICogRXJyb3IgbWVzc2FnZXMgbWF5IGJlIHN0aWxsIHF1ZXVlZCBpbiB0aGUgc3RyZWFtLgotCQkJICovCi0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiB3YWl0aW5nIHN0ZGVyciB0aHJlYWQgdG8gZmluaXNoIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCXN0ZGVyck9ic2VydmVyLmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0KLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgc3Rkb3V0IHRocmVhZCB0byBmaW5pc2giLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJc3Rkb3V0T2JzZXJ2ZXIuam9pbigpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJCWlmIChwYXJzZUVycm9yKSB7Ci0JCQkJdGhyb3cgT3Blbk1QSVBsdWdpbi5jb3JlRXJyb3JFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBvdXRwdXQgb2YgT3BlbiBNUEkgY29tbWFuZC4gQ2hlY2sgb3V0cHV0IGZvciBlcnJvcnMuIiwgcGFyc2VyRXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBPcGVuTVBJUGx1Z2luLmNvcmVFcnJvckV4Y2VwdGlvbigiT3BlbiBNUEkgZmFpbGVkIHRvIGxhdW5jaCBwYXJhbGxlbCBhcHBsaWNhdGlvbi4gQ2hlY2sgb3V0cHV0IGZvciBlcnJvcnMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIENvcHkgam9iIGF0dHJpYnV0ZXMgZnJvbSBtYXAuCi0JCSAqLwotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiB1cGRhdGluZyBtb2RlbCB3aXRoIGRpc3BsYXktbWFwIGluZm9ybWF0aW9uIiwgam9iSUQpOyAvLyROT04tTkxTLTEkCi0JCXJ0U3lzdGVtLmNoYW5nZUpvYihnZXRKb2JJRCgpLCBtYXAuZ2V0QXR0cmlidXRlTWFuYWdlcigpKTsKLQotCQkvKgotCQkgKiBDb3B5IHByb2Nlc3MgYXR0cmlidXRlcyBmcm9tIG1hcC4KLQkJICovCi0JCUxpc3Q8UHJvY2Vzcz4gbmV3UHJvY2Vzc2VzID0gbWFwLmdldFByb2Nlc3NlcygpOwotCQlwcm9jZXNzSURzID0gbmV3IFN0cmluZ1tuZXdQcm9jZXNzZXMuc2l6ZSgpXTsKLQkJSVBNYWNoaW5lIGlwTWFjaGluZSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJ0U3lzdGVtLmdldFJtSUQoKSkuZ2V0TWFjaGluZUJ5SWQocnRTeXN0ZW0uZ2V0TWFjaGluZUlEKCkpOwotCQlmb3IgKFByb2Nlc3MgbmV3UHJvY2VzcyA6IG5ld1Byb2Nlc3NlcykgewotCQkJU3RyaW5nIG5vZGVuYW1lID0gbmV3UHJvY2Vzcy5nZXROb2RlKCkuZ2V0UmVzb2x2ZWROYW1lKCk7Ci0JCQlTdHJpbmcgbm9kZUlEID0gcnRTeXN0ZW0uZ2V0Tm9kZUlEZm9yTmFtZShub2RlbmFtZSk7Ci0JCQlpZiAobm9kZUlEID09IG51bGwpIHsKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5PcGVuTVBJUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fSG9zdG5hbWVzRG9Ob3RNYXRjaCwgcGFyc2VyRXhjZXB0aW9uKSk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBwcm9jZXNzTmFtZSA9IG5ld1Byb2Nlc3MuZ2V0TmFtZSgpOwotCQkJaW50IHByb2Nlc3NJbmRleCA9IG5ld1Byb2Nlc3MuZ2V0SW5kZXgoKTsKLQkJCVN0cmluZyBwcm9jZXNzSUQgPSBudWxsOwotCQkJaWYgKHByb2Nlc3NJbmRleCA9PSAwKSB7Ci0JCQkJcHJvY2Vzc0lEID0gemVyb0luZGV4UHJvY2Vzc0lEOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9jZXNzSUQgPSBydFN5c3RlbS5jcmVhdGVQcm9jZXNzKGdldEpvYklEKCksIHByb2Nlc3NOYW1lLCBwcm9jZXNzSW5kZXgpOwotCQkJfQotCQkJcHJvY2Vzc0lEc1twcm9jZXNzSW5kZXhdID0gcHJvY2Vzc0lEOwotCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJYXR0ck1nci5hZGRBdHRyaWJ1dGUoRWxlbWVudEF0dHJpYnV0ZXMuZ2V0TmFtZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUocHJvY2Vzc05hbWUpKTsKLQkJCWF0dHJNZ3IuYWRkQXR0cmlidXRlKFByb2Nlc3NBdHRyaWJ1dGVzLmdldE5vZGVJZEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobm9kZUlEKSk7Ci0JCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoUHJvY2Vzc0F0dHJpYnV0ZXMuU3RhdGUuUlVOTklORykpOwotCQkJdHJ5IHsKLQkJCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRJbmRleEF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobmV3UHJvY2Vzcy5nZXRJbmRleCgpKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCS8vIElzIGFsd2F5cyB2YWxpZC4KLQkJCQlhc3NlcnQgZmFsc2U7Ci0JCQl9Ci0JCQlhdHRyTWdyLmFkZEF0dHJpYnV0ZXMobmV3UHJvY2Vzcy5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCkuZ2V0QXR0cmlidXRlcygpKTsKLQkJCXJ0U3lzdGVtLmNoYW5nZVByb2Nlc3MocHJvY2Vzc0lELCBhdHRyTWdyKTsKLQotCQkJSVBQcm9jZXNzQ29udHJvbCBwcm9jZXNzQ29udHJvbCA9IChJUFByb2Nlc3NDb250cm9sKSBpcEpvYi5nZXRQcm9jZXNzQnlJZChwcm9jZXNzSUQpOwotCQkJSVBOb2RlIG5vZGUgPSBpcE1hY2hpbmUuZ2V0Tm9kZUJ5SWQobm9kZUlEKTsKLQotCQkJLyoKLQkJCSAqIEFsdGhvdWdoIG9uZSBjb3VsZCBjYWxsIHByb2Nlc3NDb250cm9sLmFkZE5vZGUobm9kZSkgdG8gYXNzaWduIHRoZSBwcm9jZXNzIHRvIHRoZSBub2RlLCB0aGlzIGRvZXMgbm90IHdvcmsuCi0JCQkgKiBJdCBpcyBuZWNlc3NhcnkgdG8gY2FsbCBub2RlQ29udHJvbC5hZGRQcm9jZXNzZXMocHJvY2Vzc0NvbnRyb2wpIGluc3RlYWQuCi0JCQkgKi8KLQkJCUlQTm9kZUNvbnRyb2wgbm9kZUNvbnRyb2wgPSAoSVBOb2RlQ29udHJvbCkgbm9kZTsKLQkJCW5vZGVDb250cm9sLmFkZFByb2Nlc3NlcyhBcnJheXMuYXNMaXN0KG5ldyBJUFByb2Nlc3NDb250cm9sW10ge3Byb2Nlc3NDb250cm9sfSApKTsKLQkJfQotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBmaW5pc2hlZCB1cGRhdGluZyBtb2RlbCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvV2FpdEV4ZWN1dGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogV2FpdCB1bnRpbCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIHN0b3AgYmVjYXVzZSBzdHJlYW0gYXJlIGNsb3NlZC4KLQkJICogVGhpcyBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGhhcyBmaW5pc2hlZC4KLQkJICovCi0JCWlmICghcnRTeXN0ZW0uZ2V0UmVtb3RlU2VydmljZXMoKS5nZXRJZCgpLmVxdWFscygib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5SU0VSZW1vdGVTZXJ2aWNlcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgc3RkZXJyIHRocmVhZCB0byBmaW5pc2giLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJc3RkZXJyT2JzZXJ2ZXIuam9pbigpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJfQotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgc3Rkb3V0IHRocmVhZCB0byBmaW5pc2giLCBqb2JJRCk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXN0ZG91dE9ic2VydmVyLmpvaW4oKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0KLQkJLyoKLQkJICogU3RpbGwgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCByZW1vdGUgcHJvY2VzcyBtaWdodCBub3QgaGF2ZSB5ZXQgdGVybWluYXRlZCwgYWx0aG91Z2ggc3Rkb3V0IGFuZCBzdGRlcnIgaXMgY2xvc2VkLgotCQkgKi8KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogd2FpdGluZyBtcGkgcHJvY2VzcyB0byBmaW5pc2ggY29tcGxldGVseSIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcHJvY2Vzcy53YWl0Rm9yKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogY29tcGxldGVseSBmaW5pc2hlZCIsIGpvYklEKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvVGVybWluYXRlSm9iKCkgewotCQkvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvbkZpbmlzaGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJvY2Vzcy5leGl0VmFsdWUoKSAhPSAwKSB7Ci0JCQljaGFuZ2VKb2JTdGF0ZShKb2JBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKTsKLQkJCWlmICghIHRlcm1pbmF0ZUpvYkZsYWcpIHsKLQkJCQl0aHJvdyBPcGVuTVBJUGx1Z2luLmNvcmVFcnJvckV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aEV4aXRWYWx1ZSwgcHJvY2Vzcy5leGl0VmFsdWUoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lORywgIlJUUyBqb2IgI3swfTogaWdub3JpbmcgZXhpdCB2YWx1ZSB7MX0gYmVjYXVzZSBqb2Igd2FzIGZvcmNlZCB0byB0ZXJtaW5hdGUgYnkgdXNlciIsIGpvYklELCBwcm9jZXNzLmV4aXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWNoYW5nZUFsbFByb2Nlc3Nlc1N0YXR1cyhQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5FWElURUQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VBbGxQcm9jZXNzZXNTdGF0dXMoU3RhdGUgbmV3U3RhdGUpIHsKLQkJZmluYWwgT3Blbk1QSVJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoT3Blbk1QSVJ1bnRpbWVTeXN0ZW0pIGdldFJ0U3lzdGVtKCk7Ci0JCWZpbmFsIElSZXNvdXJjZU1hbmFnZXIgcm0gPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpOwotCQlpZiAocm0gIT0gbnVsbCkgewotCQkJZmluYWwgSVBRdWV1ZSBxdWV1ZSA9IHJtLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpOwotCQkJaWYgKHF1ZXVlICE9IG51bGwpIHsKLQkJCQlmaW5hbCBJUEpvYiBpcEpvYiA9IHF1ZXVlLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0JCQkJaWYgKGlwSm9iICE9IG51bGwpIHsKLQotCQkJCQkvKgotCQkJCQkgKiBNYXJrIGFsbCBydW5uaW5nIGFuZCBzdGFydGluZyBwcm9jZXNzZXMgYXMgZmluaXNoZWQuCi0JCQkJCSAqLwotCQkJCQlMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJCWZvciAoSVBQcm9jZXNzIGlwUHJvY2VzcyA6IGlwSm9iLmdldFByb2Nlc3NlcygpKSB7Ci0JCQkJCQlzd2l0Y2ggKGlwUHJvY2Vzcy5nZXRTdGF0ZSgpKSB7Ci0JCQkJCQljYXNlIEVYSVRFRDoKLQkJCQkJCWNhc2UgRVJST1I6Ci0JCQkJCQljYXNlIEVYSVRFRF9TSUdOQUxMRUQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFJVTk5JTkc6Ci0JCQkJCQljYXNlIFNUQVJUSU5HOgotCQkJCQkJY2FzZSBTVVNQRU5ERUQ6Ci0JCQkJCQljYXNlIFVOS05PV046Ci0JCQkJCQkJaWRzLmFkZChpcFByb2Nlc3MuZ2V0SUQoKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQotCQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNcmcgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJCQlhdHRyTXJnLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobmV3U3RhdGUpKTsKLQkJCQkJZm9yIChTdHJpbmcgcHJvY2Vzc0lkIDogaWRzKSB7Ci0JCQkJCQlydFN5c3RlbS5jaGFuZ2VQcm9jZXNzKHByb2Nlc3NJZCwgYXR0ck1yZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvbkNsZWFuVXAoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCXByb2Nlc3MuZGVzdHJveSgpOwotCQkJcHJvY2VzcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHN0ZGVyck9ic2VydmVyICE9IG51bGwpIHsKLQkJCXN0ZGVyck9ic2VydmVyLmtpbGwoKTsKLQkJCXN0ZGVyck9ic2VydmVyID0gbnVsbDsKLQkJfQotCQlpZiAoc3Rkb3V0T2JzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc3Rkb3V0T2JzZXJ2ZXIua2lsbCgpOwotCQkJc3Rkb3V0T2JzZXJ2ZXIgPSBudWxsOwotCQl9Ci0JCS8vIFRPRE86IG1vcmUgY2xlYW51cD8KLQkJY2hhbmdlQWxsUHJvY2Vzc2VzU3RhdHVzKFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLkVYSVRFRCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGRvUmV0cmlldmVUb29sQmFzZVN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gbWFrZSBtYWNyb3MgYXZhaWxhYmxlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHdvcmsgZGlyZWN0b3J5LgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGRvUmV0cmlldmVUb29sQ29tbWFuZFN1YnN0aXR1dGlvbkF0dHJpYnV0ZXMoCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVNYW5hZ2VyLAotCQkJU3RyaW5nIGRpcmVjdG9yeSwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkgewotCi0JCUxpc3Q8SUF0dHJpYnV0ZTw/LCA/LCA/Pj4gbmV3QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8SUF0dHJpYnV0ZTw/LD8sPz4+KCk7Ci0KLQkJLyoKLQkJICogQW4gT3Blbk1QSSBzcGVjaWZpYyBhdHRyaWJ1dGUuCi0JCSAqIEF0dHJpYnV0ZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBuYW1lcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0JCSAqLwotCQlpbnQgcCA9IDA7Ci0JCVN0cmluZyBrZXlzW10gPSBuZXcgU3RyaW5nW2Vudmlyb25tZW50LnNpemUoKV07Ci0JCWZvciAoU3RyaW5nIGtleSA6IGVudmlyb25tZW50LmtleVNldCgpKSB7Ci0JCQlrZXlzW3ArK10gPSBrZXk7Ci0JCX0KLQkJbmV3QXR0cmlidXRlcy5hZGQoT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXMuZ2V0RW52aXJvbm1lbnRLZXlzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShrZXlzKSk7Ci0KLQkJLyoKLQkJICogQW4gT3Blbk1QSSBzcGVjaWZpYyBhdHRyaWJ1dGUuCi0JCSAqIEEgc2hvcnRjdXQgdGhhdCBnZW5lcmF0ZXMgYXJndW1lbnRzIGZvciB0aGUgT3Blbk1QSSBydW4gY29tbWFuZC4KLQkJICovCi0JCW5ld0F0dHJpYnV0ZXMuYWRkKE9wZW5NUElMYXVuY2hBdHRyaWJ1dGVzLmdldEVudmlyb25tZW50QXJnc0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoKSk7Ci0JCXJldHVybiBuZXdBdHRyaWJ1dGVzLnRvQXJyYXkobmV3IElBdHRyaWJ1dGU8PywgPywgPz5bbmV3QXR0cmlidXRlcy5zaXplKCldKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZG9SZXRyaWV2ZVRvb2xFbnZpcm9ubWVudCgpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBObyBleHRyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmVlZHMgdG8gYmUgc2V0IGZvciBPcGVuTVBJLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1ByZXBhcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvLmNsYXNzcGF0aCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhM2U2OC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLy5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1NDhiZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWUzNTQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jTW9uIE9jdCAwNiAxNDozNjo0NCBHTVQtMDM6MDAgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDQ2YTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkuT3Blbk1QSVVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gsCi0gb3JnLmVjbGlwc2UuZGVidWcudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0udWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5sYXVuY2gsCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLm1lc3NhZ2VzLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkud2l6YXJkcwotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTNiOTEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRhdGEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL2RhdGEvbGF1bmNoLWRlZmF1bHRzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL2RhdGEvbGF1bmNoLWRlZmF1bHRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmRjZTcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9kYXRhL2xhdW5jaC1kZWZhdWx0cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTlVNUFJPQ1M9MQotQllOT0RFPWZhbHNlCi1CWVNMT1Q9ZmFsc2UKLU5PT1ZFUlNVQlNDUklCRT1mYWxzZQotTk9MT0NBTD1mYWxzZQotUFJFRklYPQotVVNFUFJFRklYPWZhbHNlCi1IT1NURklMRT0KLVVTRUhPU1RGSUxFPWZhbHNlCi1IT1NUTElTVD0KLVVTRUhPU1RMSVNUPWZhbHNlCi1BUkdVTUVOVFM9Ci1VU0VERUZBVUxUQVJHVU1FTlRTPXRydWUKLVVTRURFRkFVTFRQQVJBTUVURVJTPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjNDE1NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBPcGVuIE1QSSBVSQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvcGx1Z2luLnhtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2ZGJmNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAudWkucHJlZmVyZW5jZXMucm1QcmVmZXJlbmNlc1BhZ2UuT3Blbk1QSSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkucHJlZmVyZW5jZXMuT3Blbk1QSTEyUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkudWkucHJlZmVyZW5jZXMuT3Blbk1QSTEyIgotICAgICAgICAgICAgbmFtZT0iT3BlbiBNUEkgMS4yIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnJtUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5wcmVmZXJlbmNlcy5FbXB0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnVpLnByZWZlcmVuY2VzLnJtUHJlZmVyZW5jZXNQYWdlLk9wZW5NUEkiCi0gICAgICAgICAgICBuYW1lPSJPcGVuIE1QSSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5ybVByZWZlcmVuY2VzUGFnZS5PcGVuTVBJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5wcmVmZXJlbmNlcy5PcGVuTVBJMTNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS51aS5wcmVmZXJlbmNlcy5PcGVuTVBJMTMiCi0gICAgICAgICAgICBuYW1lPSJPcGVuIE1QSSAxLjMiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnVpLnJtQ29uZmlndXJhdGlvbnMiPgotICAgICAgPGNvbmZpZ3VyYXRpb25XaXphcmQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkud2l6YXJkcy5PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGkudWkuY29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaC5ybUxhdW5jaENvbmZpZ3VyYXRpb25zIj4KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLmxhdW5jaC5PcGVuTVBJUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS51aS5sYXVuY2hDb25maWd1cmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL09wZW5NUElVSVBsdWdpbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL09wZW5NUElVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTcwMzE3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9PcGVuTVBJVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5Ub29sc1JNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5sYXVuY2guT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIE9wZW5NUElVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgT3Blbk1QSVVJUGx1Z2luKCkgewotCQkvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmxvYWREZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9wZW5NUElVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSYWlzZSBjb3JlIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSB0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXJyb3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlLCB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGFuIElTdGF0dXMKLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBzdHJpbmcKLQkgKgotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBUaHJvd2FibGUKLQkgKgotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLk9wZW5NUElVSVBsdWdpbl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvciwgZSkpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIGEgdW5pcXVlIGlkZW50aWZpZXIKLQkgKgotCSAqIEByZXR1cm4gdW5pcXVlIGlkZW50aWZpZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlSWRlbnRpZmllcigpIHsKLQkJaWYgKGdldERlZmF1bHQoKSA9PSBudWxsKQotCQkJLy8gSWYgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IHlldCBpbml0aWFsaXplZCwKLQkJCS8vIHJldHVybiBhIHN0YXRpYyBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgbXVzdAotCQkJLy8gbWF0Y2ggdGhlIHBsdWdpbiBpZCBkZWZpbmVkIGluIHBsdWdpbi54bWwKLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL2xhdW5jaC9BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL0FkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NTZhNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL0FkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblZpZXdlckVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRm9jdXNDZWxsT3duZXJEcmF3SGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXJGb2N1c0NlbGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlLnBhcmFtZXRlcnMuT21waUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucGFyYW1ldGVycy5QYXJhbWV0ZXJzLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbS5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5PcGVuTVBJVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzCi1BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCXByb3RlY3RlZCBCdXR0b24gdXNlQXJnc0RlZmF1bHRzQnV0dG9uOwotCXByb3RlY3RlZCBUZXh0IGFyZ3NUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gdXNlUGFyYW1zRGVmYXVsdHNCdXR0b247Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgcGFyYW1zVmlld2VyOwotCXByb3RlY3RlZCBUYWJsZSBwYXJhbXNUYWJsZTsKLQotCXByb3RlY3RlZCBPbXBpSW5mbyBpbmZvOwotCi0JcHVibGljIEFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIoSVJlc291cmNlTWFuYWdlciBybSkgewotCQlpbmZvID0gKChPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyKSBybSkuZ2V0T21waUluZm8oKTsKLQl9Ci0KLQljbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lcgotCWltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyBXaWRnZXRMaXN0ZW5lcihBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZHluYW1pY1RhYikgewotCQkJc3VwZXIoZHluYW1pY1RhYik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBwYXJhbXNWaWV3ZXIgfHwgZS5nZXRTb3VyY2UoKSA9PSB1c2VBcmdzRGVmYXVsdHNCdXR0b24pIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQkJT2JqZWN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpOwotCQkJCWlmIChzb3VyY2UgPT0gcGFyYW1zVmlld2VyKSB7Ci0JCQkJCWZpcmVDb250ZW50c0NoYW5nZWQoKTsKLQkJCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgewotCQlwcml2YXRlIGJvb2xlYW4gdXNlRGVmQXJnczsKLQkJcHJpdmF0ZSBTdHJpbmcgYXJnczsKLQkJcHJpdmF0ZSBib29sZWFuIHVzZURlZlBhcmFtczsKLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtczsKLQotCQlwcm90ZWN0ZWQgRGF0YVNvdXJjZShBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgcGFnZSkgewotCQkJc3VwZXIocGFnZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weUZyb21GaWVsZHMoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQl1c2VEZWZBcmdzID0gdXNlQXJnc0RlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJYXJncyA9IGV4dHJhY3RUZXh0KGFyZ3NUZXh0KTsKLQotCQkJdXNlRGVmUGFyYW1zID0gdXNlUGFyYW1zRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlwYXJhbXMuY2xlYXIoKTsKLQkJCWZvciAoT2JqZWN0IG9iamVjdCA6IHBhcmFtc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJhbWV0ZXIpIHsKLQkJCQkJUGFyYW1ldGVyIHBhcmFtID0gKFBhcmFtZXRlcikgb2JqZWN0OwotCQkJCQlwYXJhbXMucHV0KHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb0ZpZWxkcygpIHsKLQkJCWFwcGx5VGV4dChhcmdzVGV4dCwgYXJncyk7Ci0JCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZkFyZ3MpOwotCQkJdXNlUGFyYW1zRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZlBhcmFtcyk7Ci0KLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwYXJhbSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7Ci0JCQkJCVBhcmFtZXRlciBwID0gaW5mby5nZXRQYXJhbWV0ZXIocGFyYW0uZ2V0S2V5KCkpOwotCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQlwLnNldFZhbHVlKHBhcmFtLmdldFZhbHVlKCkpOwotCQkJCQkJcGFyYW1zVmlld2VyLnNldENoZWNrZWQocCwgdHJ1ZSk7Ci0JCQkJCQlwYXJhbXNWaWV3ZXIudXBkYXRlKHAsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb1N0b3JhZ2UoKSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoCi0JCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywKLQkJCQkJdXNlRGVmQXJncyk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoCi0JCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfQVJHVU1FTlRTLCBhcmdzKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZSgKLQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUywKLQkJCQkJdXNlRGVmUGFyYW1zKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZSgKLQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9QQVJBTUVURVJTLCBwYXJhbXMpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxvYWREZWZhdWx0KCkgewotCQkJYXJncyA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9BUkdVTUVOVFM7Ci0JCQl1c2VEZWZBcmdzID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFM7Ci0JCQl1c2VEZWZQYXJhbXMgPSBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlM7Ci0JCQlwYXJhbXMgPSBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUEFSQU1FVEVSUzsKLQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tU3RvcmFnZSgpIHsKLQkJCXRyeSB7Ci0JCQkJYXJncyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywKLQkJCQkJCU9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9BUkdVTUVOVFMpOwotCQkJCXVzZURlZkFyZ3MgPSBnZXRDb25maWd1cmF0aW9uKCkKLQkJCQkuZ2V0QXR0cmlidXRlKAotCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTLAotCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOwotCQkJCXVzZURlZlBhcmFtcyA9IGdldENvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTLAotCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTKTsKLQkJCQlwYXJhbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKAotCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9QQVJBTUVURVJTLAotCQkJCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BBUkFNRVRFUlMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBoYW5kbGUgZXhjZXB0aW9uPwotCQkJCU9wZW5NUElVSVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMb2NhbCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCWlmICghdXNlRGVmQXJncyAmJiBhcmdzID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlcy5BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHMpOwotCQkJaWYgKCF1c2VEZWZQYXJhbXMpIHsKLQkJCQlmb3IgKE9iamVjdCBvYmplY3QgOiBwYXJhbXNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpIHsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcmFtZXRlcikgewotCQkJCQkJUGFyYW1ldGVyIHBhcmFtID0gKFBhcmFtZXRlcikgb2JqZWN0OwotCQkJCQkJaWYgKHBhcmFtLmdldFZhbHVlKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotCQkJCQkJCQkJTWVzc2FnZXMuQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UGFyYW1ldGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgewotCQlyZXR1cm4gbmV3IERhdGFTb3VyY2UodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZmluYWwgR3JvdXAgYXJndW1lbnRzR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbCwgU1dULk5PTkUpOwotCQlhcmd1bWVudHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwKLQkJCQlmYWxzZSkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJYXJndW1lbnRzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWFyZ3VtZW50c0dyb3VwCi0JCS5zZXRUZXh0KE1lc3NhZ2VzLkFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTGF1bmNoQXJndW1lbnRzKTsKLQotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKGFyZ3VtZW50c0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24KLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0QXJndW1lbnRzKTsKLQkJLy8gdXNlQXJnc0RlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJdXNlQXJnc0RlZmF1bHRzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYXJndW1lbnRzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWxhYmVsCi0JCS5zZXRUZXh0KE1lc3NhZ2VzLkFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQXJndW1lbnRzKTsKLQotCQlhcmdzVGV4dCA9IG5ldyBUZXh0KGFyZ3VtZW50c0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJYXJnc1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCS8vIGFyZ3NUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZpbmFsIEdyb3VwIG9tcGlQYXJhbWV0ZXJlc0dyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJb21waVBhcmFtZXRlcmVzR3JvdXAKLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9NQ0FQYXJhbWV0ZXJzKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlvbXBpUGFyYW1ldGVyZXNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb21waVBhcmFtZXRlcmVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLAotCQkJCXRydWUsIHRydWUpKTsKLQotCQl1c2VQYXJhbXNEZWZhdWx0c0J1dHRvbiA9IG5ldyBCdXR0b24ob21waVBhcmFtZXRlcmVzR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXVzZVBhcmFtc0RlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQl1c2VQYXJhbXNEZWZhdWx0c0J1dHRvbgotCQkuc2V0VGV4dChNZXNzYWdlcy5BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRNQ0FQYXJhbWV0ZXJzKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJdXNlUGFyYW1zRGVmYXVsdHNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIHVzZVBhcmFtc0RlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQlwYXJhbXNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChvbXBpUGFyYW1ldGVyZXNHcm91cCwKLQkJCQlTV1QuQ0hFQ0sgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlwYXJhbXNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCAhPSBudWxsICYmIGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE9tcGlJbmZvKSB7Ci0JCQkJCU9tcGlJbmZvIGluZm8gPSAoT21waUluZm8pIGlucHV0RWxlbWVudDsKLQkJCQkJcmV0dXJuIGluZm8uZ2V0UGFyYW1ldGVycygpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwKLQkJCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JCQl9Ci0JCX0pOwotCQlwYXJhbXNWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgajEsIE9iamVjdCBqMikgewotCQkJCXJldHVybiAoKFBhcmFtZXRlcikgajEpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJCQkoKFBhcmFtZXRlcikgajIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlwYXJhbXNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGdldExvY2FsTGlzdGVuZXIoKSk7Ci0JCXBhcmFtc1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQotCQkvLyBFbmFibGUgY3Vyc29yIGtleXMgaW4gdGFibGUKLQkJVGFibGVWaWV3ZXJGb2N1c0NlbGxNYW5hZ2VyIGZvY3VzQ2VsbE1hbmFnZXIgPSBuZXcgVGFibGVWaWV3ZXJGb2N1c0NlbGxNYW5hZ2VyKAotCQkJCXBhcmFtc1ZpZXdlciwgbmV3IEZvY3VzQ2VsbE93bmVyRHJhd0hpZ2hsaWdodGVyKHBhcmFtc1ZpZXdlcikpOwotCQlDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kgYWN0U3VwcG9ydCA9IG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3koCi0JCQkJcGFyYW1zVmlld2VyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KAotCQkJCQlDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5UUkFWRVJTQUwKLQkJCQl8fCBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50Lk1PVVNFX0RPVUJMRV9DTElDS19TRUxFQ1RJT04KLQkJCQl8fCAoZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5LRVlfUFJFU1NFRCAmJiBldmVudC5rZXlDb2RlID09IFNXVC5DUikKLQkJCQl8fCBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50LlBST0dSQU1NQVRJQzsKLQkJCX0KLQkJfTsKLQkJVGFibGVWaWV3ZXJFZGl0b3IuY3JlYXRlKHBhcmFtc1ZpZXdlciwgZm9jdXNDZWxsTWFuYWdlciwgYWN0U3VwcG9ydCwKLQkJCQlDb2x1bW5WaWV3ZXJFZGl0b3IuVEFCQklOR19IT1JJWk9OVEFMCi0JCQkJfCBDb2x1bW5WaWV3ZXJFZGl0b3IuVEFCQklOR19NT1ZFX1RPX1JPV19ORUlHSEJPUgotCQkJCXwgQ29sdW1uVmlld2VyRWRpdG9yLlRBQkJJTkdfVkVSVElDQUwKLQkJCQl8IENvbHVtblZpZXdlckVkaXRvci5LRVlCT0FSRF9BQ1RJVkFUSU9OKTsKLQotCQlwYXJhbXNUYWJsZSA9IHBhcmFtc1ZpZXdlci5nZXRUYWJsZSgpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlnZC5oZWlnaHRIaW50ID0gMTAwOwotCQlwYXJhbXNUYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcGFyYW1zVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlwYXJhbXNUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlwYXJhbXNUYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJLy8gRGlzYWJsZSBjZWxsIGl0ZW0gc2VsZWN0aW9uCi0JCXBhcmFtc1RhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUKLQkJCSAqIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC4KLQkJCSAqIHdpZGdldHMuRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZENvbHVtbnMoKTsKLQotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlwYXJhbXNWaWV3ZXIuc2V0SW5wdXQoaW5mbyk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFkZCBjb2x1bW5zIHRvIHRoZSB0YWJsZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1ucygpIHsKLQkJLyoKLQkJICogTmFtZSBjb2x1bW4KLQkJICovCi0JCWZpbmFsIFRhYmxlVmlld2VyQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4ocGFyYW1zVmlld2VyLAotCQkJCVNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZQotCQkJICogb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nCi0JCQkgKiAuT2JqZWN0KQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChQYXJhbWV0ZXIpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0pOwotCQljb2x1bW4xLmdldENvbHVtbigpLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sdW1uMQotCQkuZ2V0Q29sdW1uKCkKLQkJLnNldFRleHQoCi0JCQkJTWVzc2FnZXMuQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QQXJhbWV0ZXJUYWJsZV9Db2x1bW5fTmFtZSk7Ci0KLQkJLyoKLQkJICogVmFsdWUgY29sdW1uCi0JCSAqLwotCQlmaW5hbCBUYWJsZVZpZXdlckNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHBhcmFtc1ZpZXdlciwKLQkJCQlTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUKLQkJCSAqIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZwotCQkJICogLk9iamVjdCkKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlcikKLQkJCQkJcmV0dXJuICgoUGFyYW1ldGVyKSBlbGVtZW50KS5nZXRWYWx1ZSgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0pOwotCQljb2x1bW4yLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBFZGl0aW5nU3VwcG9ydChwYXJhbXNWaWV3ZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhKChQYXJhbWV0ZXIpIGVsZW1lbnQpLmlzUmVhZE9ubHkoKQotCQkJCSYmIHBhcmFtc1ZpZXdlci5nZXRDaGVja2VkKGVsZW1lbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKHBhcmFtc1RhYmxlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoUGFyYW1ldGVyKSBlbGVtZW50KS5nZXRWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsKLQkJCQkoKFBhcmFtZXRlcikgZWxlbWVudCkuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotCQkJCWdldFZpZXdlcigpLnVwZGF0ZShlbGVtZW50LCBudWxsKTsKLQkJCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbHVtbjIuZ2V0Q29sdW1uKCkuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW4yCi0JCS5nZXRDb2x1bW4oKQotCQkuc2V0VGV4dCgKLQkJCQlNZXNzYWdlcy5BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1BhcmFtZXRlclRhYmxlX0NvbHVtbl9WYWx1ZSk7Ci0KLQkJcGFyYW1zVGFibGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmFtc1RhYmxlLmdldENsaWVudEFyZWEoKTsKLQkJCQkvLyBQb2ludCBzaXplID0gcGFyYW1zVGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJLy8gU1dULkRFRkFVTFQpOwotCQkJCVNjcm9sbEJhciB2QmFyID0gcGFyYW1zVGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoCi0JCQkJLSBwYXJhbXNUYWJsZS5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKS53aWR0aAotCQkJCS0gdkJhci5nZXRTaXplKCkueDsKLQkJCQlwYXJhbXNUYWJsZS5nZXRDb2x1bW4oMSkuc2V0V2lkdGgod2lkdGggLyAzKTsKLQkJCQlwYXJhbXNUYWJsZS5nZXRDb2x1bW4oMCkuc2V0V2lkdGgoCi0JCQkJCQl3aWR0aCAtIHBhcmFtc1RhYmxlLmdldENvbHVtbigxKS5nZXRXaWR0aCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGdldEF0dHJpYnV0ZXMoSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUlQUXVldWUgcXVldWUsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHNldERlZmF1bHRzKAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSkgewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZSgKLQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMsCi0JCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywKLQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUywKLQkJCQlPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1BBUkFNRVRFUlMsCi0JCQkJT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BBUkFNRVRFUlMpOwotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJYXJnc1RleHQuc2V0RW5hYmxlZCghdXNlQXJnc0RlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJcGFyYW1zVGFibGUuc2V0RW5hYmxlZCghdXNlUGFyYW1zRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoZ2V0TG9jYWxEYXRhU291cmNlKCkudXNlRGVmQXJncykgewotCQkJU3RyaW5nIGxhdW5jaEFyZ3MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlsYXVuY2hBcmdzID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uY2FsY3VsYXRlQXJndW1lbnRzKGdldExvY2FsRGF0YVNvdXJjZSgpLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWFyZ3NUZXh0LnNldFRleHQobGF1bmNoQXJncyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIERhdGFTb3VyY2UgZ2V0TG9jYWxEYXRhU291cmNlKCkgewotCQlyZXR1cm4gKERhdGFTb3VyY2UpIHN1cGVyLmdldERhdGFTb3VyY2UoKTsKLQl9Ci0KLQlwcml2YXRlIFdpZGdldExpc3RlbmVyIGdldExvY2FsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiAoV2lkZ2V0TGlzdGVuZXIpIHN1cGVyLmdldExpc3RlbmVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL0Jhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVjNGZhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubGF1bmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Kb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5STUxhdW5jaFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUuT3Blbk1QSUxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLk9wZW5NUElVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuUGl4ZWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGV4dGVuZHMKLUFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7Ci0KLQlDb21wb3NpdGUgY29udHJvbDsKLQlTcGlubmVyIG51bVByb2NzU3Bpbm5lcjsKLQlCdXR0b24gYnlOb2RlQnV0dG9uOwotCUJ1dHRvbiBieVNsb3RCdXR0b247Ci0JQnV0dG9uIG5vT3ZlcnN1YnNjcmliZUJ1dHRvbjsKLQlCdXR0b24gbm9Mb2NhbEJ1dHRvbjsKLQlCdXR0b24gdXNlUHJlZml4QnV0dG9uOwotCVRleHQgcHJlZml4VGV4dDsKLQlUZXh0IGhvc3RGaWxlVGV4dDsKLQlCdXR0b24gaG9zdEZpbGVCdXR0b247Ci0JVGV4dCBob3N0TGlzdFRleHQ7Ci0JQnV0dG9uIGhvc3RMaXN0QnV0dG9uOwotCUJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQljbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyBXaWRnZXRMaXN0ZW5lcihBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZHluYW1pY1RhYikgewotCQkJc3VwZXIoZHluYW1pY1RhYik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Nb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IG51bVByb2NzU3Bpbm5lciAKLQkJCQkJfHwgZS5nZXRTb3VyY2UoKSA9PSBwcmVmaXhUZXh0IAotCQkJCQl8fCBlLmdldFNvdXJjZSgpID09IGhvc3RGaWxlVGV4dCAKLQkJCQkJfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0TGlzdFRleHQpIHsKLQkJCQkvLwkJCQlnZXREYXRhU291cmNlKCkuanVzdFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2V7Ci0JCQkJc3VwZXIuZG9Nb2RpZnlUZXh0KGUpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gYnlOb2RlQnV0dG9uIAotCQkJCQl8fCBlLmdldFNvdXJjZSgpID09IGJ5U2xvdEJ1dHRvbiAKLQkJCQkJfHwgZS5nZXRTb3VyY2UoKSA9PSBub092ZXJzdWJzY3JpYmVCdXR0b24gCi0JCQkJCXx8IGUuZ2V0U291cmNlKCkgPT0gbm9Mb2NhbEJ1dHRvbiAKLQkJCQkJfHwgZS5nZXRTb3VyY2UoKSA9PSB1c2VQcmVmaXhCdXR0b24pIHsKLQkJCQkvLwkJCQlnZXREYXRhU291cmNlKCkuanVzdFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gdXNlUHJlZml4QnV0dG9uIAotCQkJCQl8fCBlLmdldFNvdXJjZSgpID09IGhvc3RGaWxlQnV0dG9uIAotCQkJCQl8fCBlLmdldFNvdXJjZSgpID09IGhvc3RMaXN0QnV0dG9uKSB7Ci0JCQkJLy8JCQkJZ2V0RGF0YVNvdXJjZSgpLmp1c3RWYWxpZGF0ZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgewotCi0JCXByaXZhdGUgaW50IG51bVByb2NzOwotCQlwcml2YXRlIGJvb2xlYW4gYnlOb2RlOwotCQlwcml2YXRlIGJvb2xlYW4gYnlTbG90OwotCQlwcml2YXRlIGJvb2xlYW4gbm9PdmVyc3Vic2NyaWJlOwotCQlwcml2YXRlIGJvb2xlYW4gbm9Mb2NhbDsKLQkJcHJpdmF0ZSBib29sZWFuIHVzZVByZWZpeDsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCQlwcml2YXRlIGJvb2xlYW4gdXNlSG9zdEZpbGU7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3RGaWxlOwotCQlwcml2YXRlIGJvb2xlYW4gdXNlSG9zdExpc3Q7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3RMaXN0OwotCi0JCXByb3RlY3RlZCBEYXRhU291cmNlKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCW51bVByb2NzID0gbnVtUHJvY3NTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJYnlOb2RlID0gYnlOb2RlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJYnlTbG90ID0gYnlTbG90QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJbm9PdmVyc3Vic2NyaWJlID0gbm9PdmVyc3Vic2NyaWJlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJbm9Mb2NhbCA9IG5vTG9jYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl1c2VQcmVmaXggPSB1c2VQcmVmaXhCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlwcmVmaXggPSBleHRyYWN0VGV4dChwcmVmaXhUZXh0KTsKLQkJCXVzZUhvc3RGaWxlID0gaG9zdEZpbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlob3N0RmlsZSA9IGV4dHJhY3RUZXh0KGhvc3RGaWxlVGV4dCk7Ci0JCQl1c2VIb3N0TGlzdCA9IGhvc3RMaXN0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJaG9zdExpc3QgPSBleHRyYWN0VGV4dChob3N0TGlzdFRleHQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb0ZpZWxkcygpIHsKLQkJCW51bVByb2NzU3Bpbm5lci5zZXRTZWxlY3Rpb24obnVtUHJvY3MpOwotCQkJYnlOb2RlQnV0dG9uLnNldFNlbGVjdGlvbihieU5vZGUpOwotCQkJYnlTbG90QnV0dG9uLnNldFNlbGVjdGlvbihieVNsb3QpOwotCQkJbm9PdmVyc3Vic2NyaWJlQnV0dG9uLnNldFNlbGVjdGlvbihub092ZXJzdWJzY3JpYmUpOwotCQkJbm9Mb2NhbEJ1dHRvbi5zZXRTZWxlY3Rpb24obm9Mb2NhbCk7Ci0JCQl1c2VQcmVmaXhCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVByZWZpeCk7Ci0JCQlhcHBseVRleHQocHJlZml4VGV4dCwgcHJlZml4KTsKLQkJCWFwcGx5VGV4dChob3N0RmlsZVRleHQsIGhvc3RGaWxlKTsKLQkJCWhvc3RGaWxlQnV0dG9uLnNldFNlbGVjdGlvbih1c2VIb3N0RmlsZSk7Ci0JCQlhcHBseVRleHQoaG9zdExpc3RUZXh0LCBob3N0TGlzdFRvVGV4dChob3N0TGlzdCkpOwotCQkJaG9zdExpc3RCdXR0b24uc2V0U2VsZWN0aW9uKHVzZUhvc3RMaXN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgewotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIG51bVByb2NzKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0JZTk9ERSwgYnlOb2RlKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0JZU0xPVCwgYnlTbG90KTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05PT1ZFUlNVQlNDUklCRSwgbm9PdmVyc3Vic2NyaWJlKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05PTE9DQUwsIG5vTG9jYWwpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFUFJFRklYLCB1c2VQcmVmaXgpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfUFJFRklYLCBwcmVmaXgpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVEZJTEUsIHVzZUhvc3RGaWxlKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RGSUxFLCBob3N0RmlsZSk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NUTElTVCwgdXNlSG9zdExpc3QpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVExJU1QsIGhvc3RMaXN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLQkJCW51bVByb2NzID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTOwotCQkJYnlOb2RlID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0JZTk9ERTsKLQkJCWJ5U2xvdCA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9CWVNMT1Q7Ci0JCQlub092ZXJzdWJzY3JpYmUgPSBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9PVkVSU1VCU0NSSUJFOwotCQkJbm9Mb2NhbCA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OT0xPQ0FMOwotCQkJdXNlUHJlZml4ID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRVBSRUZJWDsKLQkJCXByZWZpeCA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVg7Ci0JCQlob3N0RmlsZSA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NURklMRTsKLQkJCXVzZUhvc3RGaWxlID0gT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RGSUxFOwotCQkJaG9zdExpc3QgPSBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVExJU1Q7Ci0JCQl1c2VIb3N0TGlzdCA9IE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NUTElTVDsKLQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tU3RvcmFnZSgpIHsKLQkJCXRyeSB7Ci0JCQkJbnVtUHJvY3MgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUyk7Ci0JCQkJYnlOb2RlID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0JZTk9ERSwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0JZTk9ERSk7Ci0JCQkJYnlTbG90ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0JZU0xPVCwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0JZU0xPVCk7Ci0JCQkJbm9PdmVyc3Vic2NyaWJlID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05PT1ZFUlNVQlNDUklCRSwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05PT1ZFUlNVQlNDUklCRSk7Ci0JCQkJbm9Mb2NhbCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OT0xPQ0FMLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTCk7Ci0JCQkJdXNlUHJlZml4ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRVBSRUZJWCwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRVBSRUZJWCk7Ci0JCQkJcHJlZml4ID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1BSRUZJWCwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BSRUZJWCk7Ci0JCQkJaG9zdEZpbGUgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVEZJTEUsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NURklMRSk7Ci0JCQkJdXNlSG9zdEZpbGUgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVEZJTEUsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NURklMRSk7Ci0JCQkJaG9zdExpc3QgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVExJU1QsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NUTElTVCk7Ci0JCQkJdXNlSG9zdExpc3QgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVExJU1QsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NUTElTVCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIGhhbmRsZSBleGNlcHRpb24/Ci0JCQkJT3Blbk1QSVVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJaWYgKG51bVByb2NzIDwgMSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9Ob1Byb2Nlc3MpOwotCQkJfQotCQkJaWYgKHVzZVByZWZpeCAmJiBwcmVmaXggPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVByZWZpeCk7Ci0JCQl9Ci0JCQlpZiAodXNlSG9zdEZpbGUgJiYgaG9zdEZpbGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RmaWxlKTsKLQkJCX0KLQkJCWlmICh1c2VIb3N0TGlzdCAmJiBob3N0TGlzdCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdExpc3QpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnQgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbnRvIG9uZSBob3N0IHBlciBsaW5lCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGhvc3RMaXN0VG9UZXh0KFN0cmluZyBsaXN0KSB7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IGxpc3Quc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXZhbHVlc1tpXS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlyZXN1bHQgKz0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJlc3VsdCArPSB2YWx1ZXNbaV07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgewotCQlyZXR1cm4gbmV3IERhdGFTb3VyY2UodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJY29udHJvbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCAgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTnVtYmVyUHJvY2Vzc2VzKTsKLQotCQludW1Qcm9jc1NwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb250cm9sLCBTV1QuQk9SREVSKTsKLQkJbnVtUHJvY3NTcGlubmVyLmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQludW1Qcm9jc1NwaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCi0JCWZpbmFsIEdyb3VwIG9wdGlvbnNHcm91cCA9IG5ldyBHcm91cChjb250cm9sLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDMsIDEpKTsKLQkJb3B0aW9uc0dyb3VwLnNldFRleHQoTWVzc2FnZXMuQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9PcHRpb25zR3JvdXApOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlieU5vZGVCdXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJYnlOb2RlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQlieU5vZGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0J5Tm9kZSk7Ci0KLQkJYnlTbG90QnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJ5U2xvdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJYnlTbG90QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9CeVNsb3QpOwotCi0JCW5vT3ZlcnN1YnNjcmliZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlub092ZXJzdWJzY3JpYmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCW5vT3ZlcnN1YnNjcmliZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9PdmVyc3Vic2NyaWJlKTsKLQotCQlub0xvY2FsQnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vTG9jYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCW5vTG9jYWxCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vTG9jYWwpOwotCi0JCXVzZVByZWZpeEJ1dHRvbiA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl1c2VQcmVmaXhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCXVzZVByZWZpeEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfUHJlZml4KTsKLQotCQlwcmVmaXhUZXh0ID0gbmV3IFRleHQob3B0aW9uc0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDMsIDEpKTsKLQkJcHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQotCQlmaW5hbCBHcm91cCBob3N0R3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbCwgU1dULk5PTkUpOwotCQlob3N0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCWhvc3RHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdEdyb3VwKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlob3N0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJaG9zdEZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKGhvc3RHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9zdEZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCWhvc3RGaWxlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ib3N0RmlsZSk7Ci0KLQkJaG9zdEZpbGVUZXh0ID0gbmV3IFRleHQoaG9zdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJaG9zdEZpbGVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlob3N0RmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihob3N0R3JvdXAsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJUGl4ZWxDb252ZXJ0ZXIgcGl4ZWxjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoY29udHJvbCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJZ2Qud2lkdGhIaW50ID0gcGl4ZWxjb252ZXJ0ZXIuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQnJvd3NlKTsKLQotCQlob3N0TGlzdEJ1dHRvbiA9IG5ldyBCdXR0b24oaG9zdEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlob3N0TGlzdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWhvc3RMaXN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQlob3N0TGlzdEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdExpc3QpOwotCi0JCWhvc3RMaXN0VGV4dCA9IG5ldyBUZXh0KGhvc3RHcm91cCwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDsKLQkJaG9zdExpc3RUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlob3N0TGlzdFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0KLQotCX0KLQotCXB1YmxpYyBJQXR0cmlidXRlPD8sID8sID8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxJQXR0cmlidXRlPD8sPyw/Pj4gYXR0cnMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGU8Pyw/LD8+PigpOwotCi0JCWludCBudW1Qcm9jcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUyk7Ci0JCXRyeSB7Ci0JCQlhdHRycy5hZGQoSm9iQXR0cmlidXRlcy5nZXROdW1iZXJPZlByb2Nlc3Nlc0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUobnVtUHJvY3MpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgT3Blbk1QSVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgTWVzc2FnZXMuQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9FeGNlcHRpb25fSW52YWxpZENvbmZpZ3VyYXRpb24sIGUpKTsKLQkJfQotCi0JCWF0dHJzLmFkZChPcGVuTVBJTGF1bmNoQXR0cmlidXRlcy5nZXRMYXVuY2hBcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLmNhbGN1bGF0ZUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKSkpOwotCi0JCXJldHVybiBhdHRycy50b0FycmF5KG5ldyBJQXR0cmlidXRlPD8sPyw/PlthdHRycy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OVU1QUk9DUywgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9CWU5PREUsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9CWU5PREUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0JZU0xPVCwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0JZU0xPVCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTk9PVkVSU1VCU0NSSUJFLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9PVkVSU1VCU0NSSUJFKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OT0xPQ0FMLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFUFJFRklYLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFUFJFRklYKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9QUkVGSVgsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVgpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RGSUxFLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVEZJTEUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RGSUxFLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVEZJTEUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RMSVNULCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVExJU1QpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RMSVNULCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVExJU1QpOwotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIERhdGFTb3VyY2UgZ2V0QmFzaWNEYXRhU291cmNlKCkgewotCQlyZXR1cm4gKERhdGFTb3VyY2UpZ2V0RGF0YVNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlwcmVmaXhUZXh0LnNldEVuYWJsZWQodXNlUHJlZml4QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoaG9zdEZpbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlob3N0RmlsZVRleHQuc2V0RW5hYmxlZChob3N0RmlsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWhvc3RMaXN0VGV4dC5zZXRFbmFibGVkKGhvc3RMaXN0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIERhdGFTb3VyY2UgZ2V0TG9jYWxEYXRhU291cmNlKCkgewotCQlyZXR1cm4gKERhdGFTb3VyY2Upc3VwZXIuZ2V0RGF0YVNvdXJjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvTmV3T3Blbk1QSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvTmV3T3Blbk1QSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0OTYwZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL05ld09wZW5NUElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLmxhdW5jaDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLkV4dGVuZGFibGVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmV3T3Blbk1QSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZXh0ZW5kcwotRXh0ZW5kYWJsZVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgewotCi0JcHVibGljIE5ld09wZW5NUElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJc3VwZXIoKTsKLQkJYWRkRHluYW1pY1RhYihuZXcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYigpKTsKLQkJYWRkRHluYW1pY1RhYihuZXcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlOGU2ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL09wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLk9wZW5NUElVSVBsdWdpbjsKLQotLyoqCi0gKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkFTRSA9IE9wZW5NUElVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmxhdW5jaEF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1QUk9DUyA9IEFUVFJfQkFTRSArICIubnVtUHJvY3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CWU5PREUgPSBBVFRSX0JBU0UgKyAiLmJ5Tm9kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JZU0xPVCA9IEFUVFJfQkFTRSArICIuYnlTbG90IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTk9PVkVSU1VCU0NSSUJFID0gQVRUUl9CQVNFICsgIi5ub092ZXJzdWJzY3JpYmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OT0xPQ0FMID0gQVRUUl9CQVNFICsgIi5ub0xvY2FsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRklYID0gQVRUUl9CQVNFICsgIi5wcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VQUkVGSVggPSBBVFRSX0JBU0UgKyAiLnVzZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hPU1RGSUxFID0gQVRUUl9CQVNFICsgIi5ob3N0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRUhPU1RGSUxFID0gQVRUUl9CQVNFICsgIi51c2VIb3N0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hPU1RMSVNUID0gQVRUUl9CQVNFICsgIi5ob3N0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRUhPU1RMSVNUID0gQVRUUl9CQVNFICsgIi51c2VIb3N0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FSR1VNRU5UUyA9IEFUVFJfQkFTRSArICIuYXJndW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUyA9IEFUVFJfQkFTRSArICIudXNlRGVmYXVsdEFyZ3VtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BBUkFNRVRFUlMgPSBBVFRSX0JBU0UgKyAiLnBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUyA9IEFUVFJfQkFTRSArICIudXNlRGVmYXVsdFBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUFyZ3VtZW50cyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTKSkgewotCQkJU3RyaW5nIGxhdW5jaEFyZ3MgPSAiLW5wICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNUFJPQ1MsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUykpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9CWU5PREUsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9CWU5PREUpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ieW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9CWVNMT1QsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9CWVNMT1QpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ieXNsb3QiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9OT09WRVJTVUJTQ1JJQkUsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OT09WRVJTVUJTQ1JJQkUpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ub292ZXJzdWJzY3JpYmUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9OT0xPQ0FMLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTCkpIHsKLQkJCQlsYXVuY2hBcmdzICs9ICIgLW5vbG9jYWwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VQUkVGSVgsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VQUkVGSVgpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC0tcHJlZml4ICIgKyBmaXhTdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9QUkVGSVgsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfVVNFSE9TVEZJTEUsIE9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NURklMRSkpIHsKLQkJCQlsYXVuY2hBcmdzICs9ICIgLWhvc3RmaWxlICIgKyBmaXhTdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9IT1NURklMRSwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RGSUxFKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRUhPU1RMSVNULCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVExJU1QpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ob3N0ICIgKyBmaXhTdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9IT1NUTElTVCwgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RMSVNUKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKCEgY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUywgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTKSkgewotCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9QQVJBTUVURVJTLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfUEFSQU1FVEVSUyk7Ci0JCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW0gOiBwYXJhbXMuZW50cnlTZXQoKSkgewotCQkJCQlsYXVuY2hBcmdzICs9ICIgLW1jYSAiICsgcGFyYW0uZ2V0S2V5KCkgKyAiICIgKyBmaXhTdHJpbmcocGFyYW0uZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsYXVuY2hBcmdzOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfQVJHVU1FTlRTLCBPcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHN0cmluZyBzdWl0YWJsZSBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudAotCSAqCi0JICogQHBhcmFtIHMKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGZpeFN0cmluZyhTdHJpbmcgcykgewotCQkvLyBUT0RPIGlzIHRoYXQgcmlnaHQgYW5kIGVzY2FwZWQgY29ycmVjdGx5PwotCQlpZiAocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIlwiXCIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICJcIiIgKyBzICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL2xhdW5jaC9PcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL09wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5YTgwNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbGF1bmNoL09wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLk9wZW5NUElVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cyB7Ci0JcHVibGljIHN0YXRpYyBpbnQgQVRUUl9OVU1QUk9DUzsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9CWU5PREU7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfQllTTE9UOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX05PT1ZFUlNVQlNDUklCRTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9OT0xPQ0FMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRVBSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSX0hPU1RGSUxFOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRUhPU1RGSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfSE9TVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFSE9TVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9BUkdVTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUzsKLQlwdWJsaWMgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IEFUVFJfUEFSQU1FVEVSUyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRzUmVzb3VyY2VQYXRoID0gIi9kYXRhL2xhdW5jaC1kZWZhdWx0cy5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWREZWZhdWx0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoID0gbmV3IFBhdGgoZGVmYXVsdHNSZXNvdXJjZVBhdGgpOwotCQlCdW5kbGUgYnVuZGxlID0gT3Blbk1QSVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gcmVhZChkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBidW5kbGUpOwotCi0JCUFUVFJfTlVNUFJPQ1MgPSBnZXRJbnRlZ2VyKGJ1bmRsZSwgcHJvcGVydGllcywgIk5VTVBST0NTIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9CWU5PREUgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIkJZTk9ERSIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfQllTTE9UID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJCWVNMT1QiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX05PT1ZFUlNVQlNDUklCRSA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiTk9PVkVSU1VCU0NSSUJFIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9OT0xPQ0FMID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJOT0xPQ0FMIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9QUkVGSVggPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiUFJFRklYIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9VU0VQUkVGSVggPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRVBSRUZJWCIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfSE9TVEZJTEUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiSE9TVEZJTEUiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX1VTRUhPU1RGSUxFID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VIT1NURklMRSIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfQVJHVU1FTlRTID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkFSR1VNRU5UUyIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUyA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiVVNFREVGQVVMVEFSR1VNRU5UUyIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRURFRkFVTFRQQVJBTUVURVJTIik7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnQgQVRUUl9QUkVGSVggIT0gbnVsbDsKLQkJYXNzZXJ0IEFUVFJfSE9TVEZJTEUgIT0gbnVsbDsKLQkJYXNzZXJ0IEFUVFJfQVJHVU1FTlRTICE9IG51bGw7Ci0JCS8vIFRPRE86IHJlYWQgQVRUUl9QQVJBTUVURVJTCi0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIHJlYWQoUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBCdW5kbGUgYnVuZGxlKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW07Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlpblN0cmVhbSA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oYnVuZGxlLCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBmYWxzZSk7Ci0JCQlwcm9wZXJ0aWVzLmxvYWQoaW5TdHJlYW0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBPcGVuTVBJVUlQbHVnaW4uY29yZUVycm9yRXhjZXB0aW9uKE1lc3NhZ2VzLk9wZW5NUElMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlLCBlKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX01pc3NpbmdWYWx1ZSwga2V5KSkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZWdlcihCdW5kbGUgYnVuZGxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywga2V5KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBOTFMuYmluZChNZXNzYWdlcy5PcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlciwga2V5KSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsIGtleSk7Ci0JCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL2xhdW5jaC9PcGVuTVBJUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL2xhdW5jaC9PcGVuTVBJUk1MYXVuY2hDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDlhMDNkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9sYXVuY2gvT3Blbk1QSVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbS5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QSVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkgZXh0ZW5kcwotQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkb0NyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyIHJtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgTmV3T3Blbk1QSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIocm0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlcj4gZ2V0UmVzb3VyY2VNYW5hZ2VyQ2xhc3MoKSB7Ci0JCXJldHVybiBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzOGIxZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Bcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0QXJndW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfRGVmYXVsdE1DQVBhcmFtZXRlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9MYXVuY2hBcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9NQ0FQYXJhbWV0ZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfUEFyYW1ldGVyVGFibGVfQ29sdW1uX05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QYXJhbWV0ZXJUYWJsZV9Db2x1bW5fVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UGFyYW1ldGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9FeGNlcHRpb25fSW52YWxpZENvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ccm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9CeU5vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9CeVNsb3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ib3N0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vTG9jYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob092ZXJzdWJzY3JpYmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9OdW1iZXJQcm9jZXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9QcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfT3B0aW9uc0dyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RmaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fTm9Qcm9jZXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19FeGNlcHRpb25fRmFpbGVkUmVhZEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19NaXNzaW5nVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJMTJQcmVmZXJlbmNlUGFnZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJMTNQcmVmZXJlbmNlUGFnZV9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTm9WZXJzaW9uU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3Blbk1QSVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGU7Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4MTYwMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU9wZW5NUElVSVBsdWdpbl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvcgotCi1BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0FyZ3VtZW50cz1Bcmd1bWVudHM6Ci1BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRBcmd1bWVudHM9VXNlIGRlZmF1bHQgYXJndW1lbnRzCi1BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRNQ0FQYXJhbWV0ZXJzPVVzZSBkZWZhdWx0IHBhcmFtZXRlcnMKLUFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTGF1bmNoQXJndW1lbnRzPUxhdW5jaCBhcmd1bWVudHMKLUFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTUNBUGFyYW1ldGVycz1NQ0EgUGFyYW1ldGVycwotQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QQXJhbWV0ZXJUYWJsZV9Db2x1bW5fTmFtZT1OYW1lCi1BZHZhbmNlZE9wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1BhcmFtZXRlclRhYmxlX0NvbHVtbl9WYWx1ZT1WYWx1ZQotQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZT1BZHZhbmNlZCBPcGVuIE1QSQotQWR2YW5jZWRPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5QXJndW1lbnRzPUFyZ3VtZW50cyBjYW5ub3QgYmUgZW1wdHkKLUFkdmFuY2VkT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVBhcmFtZXRlcj1QYXJhbWV0ZXIgdmFsdWUgY2Fubm90IGJlIGVtcHR5Ci0KLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfRXhjZXB0aW9uX0ludmFsaWRDb25maWd1cmF0aW9uPUludmFsaWQgY29uZmlndXJhdGlvbgotQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ccm93c2U9QnJvd3NlCi1CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0J5Tm9kZT1CeSBub2RlCi1CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0J5U2xvdD1CeSBzbG90Ci1CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0hvc3RGaWxlPUhvc3QgZmlsZToKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTm9Mb2NhbD1ObyBsb2NhbAotQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob092ZXJzdWJzY3JpYmU9Tm8gb3ZlcnN1YnNjcmliZQotQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9OdW1iZXJQcm9jZXNzZXM9TnVtYmVyIG9mIHByb2Nlc3NlczoKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfUHJlZml4PVByZWZpeDoKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU9QmFzaWMgT3BlbiBNUEkKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdEdyb3VwPUhvc3RzCi1CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RMaXN0PUhvc3QgbGlzdDoKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfT3B0aW9uc0dyb3VwPU9wdGlvbnMKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RmaWxlPU11c3QgcHJvdmlkZSBhIGhvc3QgZmlsZQotQmFzaWNPcGVuTXBpUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5SG9zdExpc3Q9TXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBob3N0IG5hbWUKLUJhc2ljT3Blbk1waVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVByZWZpeD1QcmVmaXggY2Fubm90IGJlIGVtcHR5Ci1CYXNpY09wZW5NcGlSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fTm9Qcm9jZXNzPU11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcHJvY2VzcwotCi1PcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZT1GYWlsZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBkZWZhdWx0IHByZWZlcmVuY2VzLgotT3Blbk1QSUxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI9RmFpbGVkIHRvIHBhcnNlIGludGVnZXIgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1PcGVuTVBJTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX01pc3NpbmdWYWx1ZT1NaXNzaW5nIGRlZmF1bHQgdmFsdWUgZm9yIHswfQotCi1PcGVuTVBJMTJQcmVmZXJlbmNlUGFnZV9UaXRsZT1PcGVuIE1QSSAxLjIgcHJlZmVyZW5jZXMKLU9wZW5NUEkxM1ByZWZlcmVuY2VQYWdlX1RpdGxlPU9wZW4gTVBJIDEuMyBwcmVmZXJlbmNlcwotCi1PcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb249RW50ZXIgaW5mb3JtYXRpb24gdG8gY29uZmlndXJlIHRoZSBPcGVuIE1QSSB0b29sCi1PcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfVmVyc2lvbj1PcGVuIE1QSSB2ZXJzaW9uOgotT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX05hbWU9T3BlbiBNUEkKLU9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZT1PcGVuIE1QSSB0b29sIGNvbmZpZ3VyYXRpb24KLU9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WYWxpZGF0aW9uX05vVmVyc2lvblNlbGVjdGVkPU5vIE9wZW4gTVBJIHZlcnNpb24gc2VsZWN0ZWQKLU9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEyPU9wZW4gTVBJIDEuMgotT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTM9T3BlbiBNUEkgMS4zCi1PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbj1FbnRlciBPcGVuIE1QSSBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi1PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZT1PcGVuIE1QSSBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9wcmVmZXJlbmNlcy9FbXB0eVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9wcmVmZXJlbmNlcy9FbXB0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwZWQ5Ny4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvcHJlZmVyZW5jZXMvRW1wdHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5UGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgRW1wdHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIEVtcHR5Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvcHJlZmVyZW5jZXMvT3Blbk1QSTEyUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9wcmVmZXJlbmNlcy9PcGVuTVBJMTJQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDI0MzllLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9wcmVmZXJlbmNlcy9PcGVuTVBJMTJQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5PcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbS5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUEkxMlByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBPcGVuTVBJMTJQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYLCBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5PUEVOTVBJX0NBUEFCSUxJVElFUywgTWVzc2FnZXMuT3Blbk1QSTEyUHJlZmVyZW5jZVBhZ2VfVGl0bGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIE9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5zYXZlUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvcHJlZmVyZW5jZXMvT3Blbk1QSTEzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9wcmVmZXJlbmNlcy9PcGVuTVBJMTNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDU4OGNiLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS9wcmVmZXJlbmNlcy9PcGVuTVBJMTNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5PcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbS5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUEkxM1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBPcGVuTVBJMTNQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYLCBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5PUEVOTVBJX0NBUEFCSUxJVElFUywgTWVzc2FnZXMuT3Blbk1QSTEzUHJlZmVyZW5jZVBhZ2VfVGl0bGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5zYXZlUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvd2l6YXJkcy9PcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS93aXphcmRzL09wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MyM2FmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS93aXphcmRzL09wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5PcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5PcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZS5ybXN5c3RlbS5PcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLndpemFyZHMuQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzLldpemFyZFBhZ2VEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzLldpemFyZFBhZ2VXaWRnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzCi1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsKLQotCVN0cmluZyB2ZXJzaW9uSWRzW10gPSBuZXcgU3RyaW5nW10geyBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5WRVJTSU9OXzEyLCBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5WRVJTSU9OXzEzIH07Ci0JU3RyaW5nIHZlcnNpb25zTmFtZXNbXSA9IG5ldyBTdHJpbmdbXSB7IE1lc3NhZ2VzLk9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEyLCBNZXNzYWdlcy5PcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmVyc2lvbkNvbWJvX1ZlcnNpb24xM307Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gdmVyc2lvbkNvbWJvOwotCi0JcHJvdGVjdGVkIGNsYXNzIFdpZGdldExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5XaWRnZXRMaXN0ZW5lciB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb01vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSB7Ci0JCQlzdXBlci5kb01vZGlmeVRleHQoZXZ0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB2ZXJzaW9uQ29tYm8pIHsKLQkJCQloYW5kbGVWZXJzaW9uU2VsZWN0ZWQoKTsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJCWdldERhdGFTb3VyY2UoKS5zdG9yZUFuZFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGF0YVNvdXJjZSBleHRlbmRzIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuRGF0YVNvdXJjZSB7Ci0JCXByb3RlY3RlZCBEYXRhU291cmNlKEFic3RyYWN0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UgcGFnZSkgewotCQkJc3VwZXIocGFnZSk7Ci0JCX0KLQotCQlwcml2YXRlIE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbklkID0gbnVsbDsKLQotCQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25JZCgpIHsKLQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weUZyb21GaWVsZHMoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlpZiAodmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpIHsKLQkJCQl2ZXJzaW9uSWRzID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbklkID0gdmVyc2lvbklkc1t2ZXJzaW9uQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQl9Ci0JCQlzdXBlci5jb3B5RnJvbUZpZWxkcygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb0ZpZWxkcygpIHsKLQkJCWlmICh2ZXJzaW9uSWQgPT0gbnVsbCkgewotCQkJCXZlcnNpb25Db21iby5zZWxlY3QoLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25JZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHZlcnNpb25JZC5lcXVhbHModmVyc2lvbklkc1tpXSkpIHsKLQkJCQkJCXZlcnNpb25Db21iby5zZWxlY3QoaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5jb3B5VG9GaWVsZHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQl2ZXJzaW9uSWQgPSBjb25maWcuZ2V0VmVyc2lvbklkKCk7Ci0JCQlzdXBlci5sb2FkRnJvbVN0b3JhZ2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgewotCQkJY29uZmlnLnNldFZlcnNpb25JZCh2ZXJzaW9uSWQpOwotCQkJc3VwZXIuY29weVRvU3RvcmFnZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlpZiAodmVyc2lvbklkID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTm9WZXJzaW9uU2VsZWN0ZWQpOwotCQkJc3VwZXIudmFsaWRhdGVMb2NhbCgpOwotCQl9Ci0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0Q29uZmlnKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRoaXMuY29uZmlnID0gKE9wZW5NUElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOwotCQkJc3VwZXIuc2V0Q29uZmlnKGNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdpemFyZFBhZ2VXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXaXphcmRQYWdlRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgewotCQlyZXR1cm4gbmV3IERhdGFTb3VyY2UodGhpcyk7Ci0JfQotCi0JcHVibGljIE9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZShSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCXN1cGVyKHdpemFyZCwgT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uT1BFTk1QSV9DQVBBQklMSVRJRVMgLCBNZXNzYWdlcy5PcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTmFtZSwgTWVzc2FnZXMuT3Blbk1QSUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlLCBNZXNzYWdlcy5PcGVuTVBJQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRGVzY3JpcHRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9DcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZVZlcnNpb25Db250ZW50cyhjb250ZW50cyk7Ci0JCWNyZWF0ZUNvbnRlbnRzKGNvbnRlbnRzKTsKLQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbnRlbnRzLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8qCi0JCSAqIFNlbGVjdGlvbiBmb3Igb3Blbm1waSB2ZXJzaW9uLgotCQkgKi8KLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLk9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9WZXJzaW9uKTsKLQotCQl2ZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8oY29udGVudHMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2ZXJzaW9uQ29tYm8uYWRkKHZlcnNpb25zTmFtZXNbaV0pOwotCQl9Ci0JCXZlcnNpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRXaWRnZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVWZXJzaW9uU2VsZWN0ZWQoKSB7Ci0JCWdldFdpZGdldExpc3RlbmVyKCkuZGlzYWJsZSgpOwotCQlEYXRhU291cmNlIGRhdGFTb3VyY2UgPSAoRGF0YVNvdXJjZSkgdGhpcy5nZXREYXRhU291cmNlKCk7Ci0JCWRhdGFTb3VyY2UuanVzdFZhbGlkYXRlKCk7Ci0JCVN0cmluZyBsYXVuY2hDbWQgPSBudWxsOwotCQlTdHJpbmcgZGVidWdDbWQgPSBudWxsOwotCQlTdHJpbmcgZGlzY292ZXJDbWQgPSBudWxsOwotCQlTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBudWxsOwotCQlpZiAoZGF0YVNvdXJjZS5nZXRWZXJzaW9uSWQoKS5lcXVhbHMoT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uVkVSU0lPTl8xMikpIHsKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCWxhdW5jaENtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKTsKLQkJCWRlYnVnQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE9wZW5NUEkxMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RFQlVHX0NNRCk7Ci0JCQlkaXNjb3ZlckNtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpOwotCQkJcmVtb3RlSW5zdGFsbFBhdGggPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCk7Ci0JCX0gZWxzZSBpZiAoZGF0YVNvdXJjZS5nZXRWZXJzaW9uSWQoKS5lcXVhbHMoT3Blbk1QSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uVkVSU0lPTl8xMykpIHsKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCWxhdW5jaENtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKTsKLQkJCWRlYnVnQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE9wZW5NUEkxM1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RFQlVHX0NNRCk7Ci0JCQlkaXNjb3ZlckNtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBPcGVuTVBJMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpOwotCQkJcmVtb3RlSW5zdGFsbFBhdGggPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoT3Blbk1QSTEzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgT3Blbk1QSTEyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnQgZmFsc2U7Ci0JCX0KLQkJcmVzZXRFcnJvck1lc3NhZ2VzKCk7Ci0JCWRhdGFTb3VyY2Uuc2V0Q29tbWFuZEZpZWxkcyhsYXVuY2hDbWQsIGRlYnVnQ21kLCBkaXNjb3ZlckNtZCwgbnVsbCwgMCwgbnVsbCwgZGF0YVNvdXJjZS5nZXRSZW1vdGVJbnN0YWxsUGF0aCgpKTsKLQkJZGF0YVNvdXJjZS5zZXRVc2VEZWZhdWx0cyh0cnVlKTsKLQkJZGF0YVNvdXJjZS5jb3B5VG9GaWVsZHMoKTsKLQkJZ2V0V2lkZ2V0TGlzdGVuZXIoKS5lbmFibGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvd2l6YXJkcy9PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9vcGVubXBpL3VpL3dpemFyZHMvT3Blbk1QSVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2MzczOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvd2l6YXJkcy9PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUudWkud2l6YXJkcy5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9wZW5NUElSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgT3Blbk1QSVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UoUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLk9wZW5NUElSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlKTsKLQkJc2V0VGl0bGUoTWVzc2FnZXMuT3Blbk1QSVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL29wZW5tcGkvdWkvd2l6YXJkcy9PcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS93aXphcmRzL09wZW5NUElSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdiMDg0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvb3Blbm1waS91aS93aXphcmRzL09wZW5NUElSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUucm1zeXN0ZW0uT3Blbk1QSVJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5OwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgZXh0ZW5kcwotUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgewotCi0JcHVibGljIE9wZW5NUElSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSgpIHsKLQkJLy8gbm8tb3AKLQl9Ci0KLQlwcm90ZWN0ZWQgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZVtdIGdldE9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZXMoUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlyZXR1cm4gbmV3IFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSB7Ci0JCQkJbmV3IE9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZSh3aXphcmQpCi0JCX07Ci0JfQotCi0JLy8JQE92ZXJyaWRlCi0JQE92ZXJyaWRlCi0JcHVibGljIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSBnZXRQYWdlcyhSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCUxpc3Q8Uk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Uk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZT4oKTsKLQkJbGlzdC5hZGQobmV3IE9wZW5NUElSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKHdpemFyZCkpOwotCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE9wZW5NUElDb25maWd1cmF0aW9uV2l6YXJkUGFnZXMod2l6YXJkKSkpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLy8JQE92ZXJyaWRlCi0JQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeT4gZ2V0Uk1GYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBPcGVuTVBJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpLy5jbGFzc3BhdGggYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS8ub3B0aW9ucyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTQ2MGQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotb3JnLmVjbGlwc2UucHRwLnJtLnVpL2RlYnVnPXRydWUKLQotIyBUcmFjZSBldmVudHMgb24gZGF0YSBzb3VyY2Ugb2YgR1VJCi1vcmcuZWNsaXBzZS5wdHAucm0udWkvZGVidWcvZGF0YVNvdXJjZT10cnVlCi0KLSMgVHJhY2UgZXZlbnRzIG9uIHdpZGdldCBsaXN0ZW5lciBvZiBHVUkKLW9yZy5lY2xpcHNlLnB0cC5ybS51aS9kZWJ1Zy93aWRnZXRMaXN0ZW5lcj10cnVlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpLy5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyYjliNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWUzNTQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jTW9uIE9jdCAwNiAxNDozNjo0NCBHTVQtMDM6MDAgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTljNGIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0udWkKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5Ub29sc1JNVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aSwKLSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWksCi0gb3JnLmVjbGlwc2UucHRwLmxhdW5jaCwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS51aSwKLSBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5ybS51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5wdHAucm0udWkudXRpbHMsCi0gb3JnLmVjbGlwc2UucHRwLnJtLnVpLndpemFyZHMKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9hYm91dC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWEwNmY2Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxODU2MC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBSZXNvdXJjZSBNYW5hZ2VyIFVJCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL1Rvb2xzUk1VSVBsdWdpbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL1Rvb2xzUk1VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmRjNTk1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9Ub29sc1JNVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLnV0aWxzLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFRvb2xzUk1VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnJtLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFRvb2xzUk1VSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVG9vbHNSTVVJUGx1Z2luKCkgewotCQkvLyBOb3RoaW5nIHRvIGRvLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCURlYnVnVXRpbC5jb25maWd1cmVQbHVnaW5EZWJ1Z09wdGlvbnMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBUb29sc1JNVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYW4gSVN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxvZyBlbnRyeSBmcm9tIGEgVGhyb3dhYmxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuVG9vbHNSTVVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yLCBlKSk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgYSB1bmlxdWUgaWRlbnRpZmllcgotCSAqIAotCSAqIEByZXR1cm4gdW5pcXVlIGlkZW50aWZpZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlSWRlbnRpZmllcigpIHsKLQkJaWYgKGdldERlZmF1bHQoKSA9PSBudWxsKQotCQkJLy8gSWYgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IHlldCBpbml0aWFsaXplZCwKLQkJCS8vIHJldHVybiBhIHN0YXRpYyBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgbXVzdAotCQkJLy8gbWF0Y2ggdGhlIHBsdWdpbiBpZCBkZWZpbmVkIGluIHBsdWdpbi54bWwKLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbGF1bmNoL0Fic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL2xhdW5jaC9BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjMjY0Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbGF1bmNoL0Fic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLlJNTGF1bmNoVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBpbXBsZW1lbnRzCi1JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBjcmVhdGVEYXRhU291cmNlKCk7Ci0JcHJpdmF0ZSBmaW5hbCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIgd2lkZ2V0TGlzdGVuZXIgPSBjcmVhdGVMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3RlbmVyIGZvciB0aGUgdGFiLiBUaGUgbGlzdGVuZXIgbXVzdCBleHRlbmQge0BsaW5rIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lcn0gYW5kIGFkZAotCSAqIHNwZWNpZmljIGJlaGF2aW9yIGZvciB3aWRnZXRzIG9mIHRoZSB0aGUgdGFiLgotCSAqIEByZXR1cm4gdGhlIGxpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGRhdGEgc291cmNlIHRvIGhhbmRsZSB0YWIgY29udGVudC4gVGhlIGxpc3RlbmVyIG11c3QgZXh0ZW5kIHtAbGluayBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZX0gYW5kIGFkZAotCSAqIHNwZWNpZmljIGJlaGF2aW9yIGZvciB3aWRnZXRzIG9mIHRoZSB0aGUgdGFiLgotCSAqIEByZXR1cm4gdGhlIGxpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKTsKLQotCXByb3RlY3RlZCBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiB3aWRnZXRMaXN0ZW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIGRhdGFTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIoSVJNTGF1bmNoQ29uZmlndXJhdGlvbkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyKElSTUxhdW5jaENvbmZpZ3VyYXRpb25Db250ZW50c0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBHVUkgZWxlbWVudHMgYXJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLAotCSAqIGUuZy4gYSBUZXh0IHdpZGdldCBzaG91bGQgaGF2ZSBpdHMgTW9kaWZ5TGlzdGVuZXIncwotCSAqIG1vZGlmeVRleHQgbWV0aG9kIHNldCB1cCB0byBub3RpZnkgYWxsIG9mIHRoZSBjb250ZW50cwotCSAqIGNoYW5nZWQgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVDb250ZW50c0NoYW5nZWQoKSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChPYmplY3QgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCSgoSVJNTGF1bmNoQ29uZmlndXJhdGlvbkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcikuaGFuZGxlQ29udGVudHNDaGFuZ2VkKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBjYW5TYXZlKENvbnRyb2wgY29udHJvbCwKLQkJCUlSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsKLQkJaWYgKGRhdGFTb3VyY2UuY2FuU2F2ZSgpKQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBkYXRhU291cmNlLmdldEVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnLAotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgewotCQlpZiAoZGF0YVNvdXJjZS5jYW5BY2NlcHQoKSkKLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgZGF0YVNvdXJjZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JfQotCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBpbml0aWFsaXplRnJvbShDb250cm9sIGNvbnRyb2wsCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlkYXRhU291cmNlLnNldFJlc291cmNlTWFuYWdlcihybSk7Ci0JCWRhdGFTb3VyY2Uuc2V0UXVldWUocXVldWUpOwotCQlkYXRhU291cmNlLnNldENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JCXdpZGdldExpc3RlbmVyLmRpc2FibGUoKTsKLQkJZGF0YVNvdXJjZS5sb2FkQW5kVXBkYXRlKCk7Ci0JCXdpZGdldExpc3RlbmVyLmVuYWJsZSgpOwotCQlpZiAoZGF0YVNvdXJjZS5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBkYXRhU291cmNlLmdldEVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHBlcmZvcm1BcHBseSgKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUlQUXVldWUgcXVldWUpIHsKLQkJZGF0YVNvdXJjZS5zZXRSZXNvdXJjZU1hbmFnZXIocm0pOwotCQlkYXRhU291cmNlLnNldFF1ZXVlKHF1ZXVlKTsKLQkJZGF0YVNvdXJjZS5zZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoY29uZmlndXJhdGlvbik7Ci0JCWRhdGFTb3VyY2Uuc3RvcmVBbmRWYWxpZGF0ZSgpOwotCQlpZiAoZGF0YVNvdXJjZS5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBkYXRhU291cmNlLmdldEVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQkvLwlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHNldERlZmF1bHRzKAotCS8vCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCS8vCQkJSVBRdWV1ZSBxdWV1ZSkgewotCS8vCQlkYXRhU291cmNlLnNldFJlc291cmNlTWFuYWdlcihybSk7Ci0JLy8JCWRhdGFTb3VyY2Uuc2V0UXVldWUocXVldWUpOwotCS8vCQlkYXRhU291cmNlLnNldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weShjb25maWd1cmF0aW9uKTsKLQkvLwkJZGF0YVNvdXJjZS5zdG9yZURlZmF1bHRzKCk7Ci0JLy8JCWlmIChkYXRhU291cmNlLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkvLwkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCS8vCQl9IGVsc2UgewotCS8vCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIGRhdGFTb3VyY2UuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCS8vCQl9Ci0JLy8JfQotCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoKTsKLQotCWFic3RyYWN0IHB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCk7Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbGF1bmNoL0V4dGVuZGFibGVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbGF1bmNoL0V4dGVuZGFibGVSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWFiYTIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL2xhdW5jaC9FeHRlbmRhYmxlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbmRhYmxlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYgotZXh0ZW5kcwotb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLkFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYgotaW1wbGVtZW50cyBJUk1MYXVuY2hDb25maWd1cmF0aW9uQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYj4gdGFiQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYj4oKTsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRHluYW1pY1RhYihBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgdGFiQ29udHJvbGxlcikgewotCQl0YWJDb250cm9sbGVycy5hZGQodGFiQ29udHJvbGxlcik7Ci0JCXRhYkNvbnRyb2xsZXIuYWRkQ29udGVudHNDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBjYW5TYXZlKENvbnRyb2wgY29udHJvbCwgSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgewotCQlmb3IgKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB0YWJDb250cm9sIDogdGFiQ29udHJvbGxlcnMpIHsKLQkJCVJNTGF1bmNoVmFsaWRhdGlvbiB2YWxpZGF0aW9uID0gdGFiQ29udHJvbC5jYW5TYXZlKGNvbnRyb2wsIHJtLCBxdWV1ZSk7Ci0JCQlpZiAoISB2YWxpZGF0aW9uLmlzU3VjY2VzcygpKQotCQkJCXJldHVybiB2YWxpZGF0aW9uOwotCQl9Ci0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcsIElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsKLQkJZm9yIChBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgdGFiQ29udHJvbCA6IHRhYkNvbnRyb2xsZXJzKSB7Ci0JCQlSTUxhdW5jaFZhbGlkYXRpb24gdmFsaWRhdGlvbiA9IHRhYkNvbnRyb2wuaXNWYWxpZChsYXVuY2hDb25maWcsIHJtLCBxdWV1ZSk7Ci0JCQlpZiAoISB2YWxpZGF0aW9uLmlzU3VjY2VzcygpKQotCQkJCXJldHVybiB2YWxpZGF0aW9uOwotCQl9Ci0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJZmluYWwgVGFiRm9sZGVyIHRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoY29udHJvbCwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJZm9yIChBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgdGFiQ29udHJvbCA6IHRhYkNvbnRyb2xsZXJzKSB7Ci0JCQlmaW5hbCBUYWJJdGVtIHNpbXBsZVRhYkl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJCXRhYkNvbnRyb2wuY3JlYXRlQ29udHJvbCh0YWJGb2xkZXIsIHJtLCBxdWV1ZSk7Ci0JCQlzaW1wbGVUYWJJdGVtLnNldFRleHQodGFiQ29udHJvbC5nZXRUZXh0KCkpOwotCQkJc2ltcGxlVGFiSXRlbS5zZXRJbWFnZSh0YWJDb250cm9sLmdldEltYWdlKCkpOwotCQkJc2ltcGxlVGFiSXRlbS5zZXRDb250cm9sKHRhYkNvbnRyb2wuZ2V0Q29udHJvbCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gaW5pdGlhbGl6ZUZyb20oQ29udHJvbCBjb250cm9sLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlSTUxhdW5jaFZhbGlkYXRpb24gcmVzdWx0VmFsaWRhdGlvbiA9IG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCWZvciAoQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIHRhYkNvbnRyb2wgOiB0YWJDb250cm9sbGVycykgewotCQkJUk1MYXVuY2hWYWxpZGF0aW9uIHZhbGlkYXRpb24gPSB0YWJDb250cm9sLmluaXRpYWxpemVGcm9tKGNvbnRyb2wsIHJtLCBxdWV1ZSwgY29uZmlndXJhdGlvbik7Ci0JCQlpZiAoISB2YWxpZGF0aW9uLmlzU3VjY2VzcygpKSB7Ci0JCQkJcmVzdWx0VmFsaWRhdGlvbiA9IHZhbGlkYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFZhbGlkYXRpb247Ci0JfQotCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7Ci0JCVJNTGF1bmNoVmFsaWRhdGlvbiByZXN1bHRWYWxpZGF0aW9uID0gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCBudWxsKTsKLQkJZm9yIChBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgdGFiQ29udHJvbCA6IHRhYkNvbnRyb2xsZXJzKSB7Ci0JCQlSTUxhdW5jaFZhbGlkYXRpb24gdmFsaWRhdGlvbiA9IHRhYkNvbnRyb2wucGVyZm9ybUFwcGx5KGNvbmZpZ3VyYXRpb24sIHJtLCBxdWV1ZSk7Ci0JCQlpZiAoISB2YWxpZGF0aW9uLmlzU3VjY2VzcygpKSB7Ci0JCQkJcmVzdWx0VmFsaWRhdGlvbiA9IHZhbGlkYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFZhbGlkYXRpb247Ci0JfQotCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsKLQkJUk1MYXVuY2hWYWxpZGF0aW9uIHJlc3VsdFZhbGlkYXRpb24gPSBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCQlmb3IgKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB0YWJDb250cm9sIDogdGFiQ29udHJvbGxlcnMpIHsKLQkJCVJNTGF1bmNoVmFsaWRhdGlvbiB2YWxpZGF0aW9uID0gdGFiQ29udHJvbC5zZXREZWZhdWx0cyhjb25maWd1cmF0aW9uLCBybSwgcXVldWUpOwotCQkJaWYgKCEgdmFsaWRhdGlvbi5pc1N1Y2Nlc3MoKSkgewotCQkJCXJlc3VsdFZhbGlkYXRpb24gPSB2YWxpZGF0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBJQXR0cmlidXRlPD8sID8sID8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAotCQkJU3RyaW5nIG1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdDxJQXR0cmlidXRlPD8sID8sID8+PiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlPD8sID8sID8+PigpOwotCQlmb3IgKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB0YWJDb250cm9sIDogdGFiQ29udHJvbGxlcnMpIHsKLQkJCUlBdHRyaWJ1dGU8PywgPywgPz4gYXR0cmlidXRlQXJyYXlbXSA9IHRhYkNvbnRyb2wuZ2V0QXR0cmlidXRlcyhybSwgcXVldWUsIGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCQkJaWYgKGF0dHJpYnV0ZUFycmF5ICE9IG51bGwpIHsKLQkJCQlMaXN0PElBdHRyaWJ1dGU8PywgPywgPz4+IGF0dHJpYnV0ZXNMaXN0ID0gQXJyYXlzLmFzTGlzdChhdHRyaWJ1dGVBcnJheSk7Ci0JCQkJYXR0cmlidXRlcy5hZGRBbGwoYXR0cmlidXRlc0xpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IElBdHRyaWJ1dGU8PywgPywgPz5bYXR0cmlidXRlcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJZm9yIChBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgdGFiQ29udHJvbCA6IHRhYkNvbnRyb2xsZXJzKSB7Ci0JCQl0YWJDb250cm9sLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50c0NoYW5nZWQoSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZmFjdG9yeSkgewotCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL2xhdW5jaC9STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL2xhdW5jaC9STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQ3Njk0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9sYXVuY2gvUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS51dGlscy5EYXRhU291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHsKLQlwcml2YXRlIGZpbmFsIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBwYWdlOwotCXByaXZhdGUgSVBRdWV1ZSBxdWV1ZTsKLQlwcml2YXRlIElSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBwYWdlKSB7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotLy8JCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLS8vCQlwYWdlLnNldFZhbGlkKGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXBhZ2UudXBkYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdWV1ZShJUFF1ZXVlIHF1ZXVlKSB7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQl9Ci0KLQlwdWJsaWMgSVBRdWV1ZSBnZXRRdWV1ZSgpIHsKLQkJcmV0dXJuIHF1ZXVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTWFuYWdlcihJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbldvcmtpbmdDb3B5KSB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbldvcmtpbmdDb3B5ID0gY29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotCX0KLQotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbGF1bmNoL1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL2xhdW5jaC9STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2MTFkNy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbGF1bmNoL1JNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkudXRpbHMuV2lkZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyIGV4dGVuZHMgV2lkZ2V0TGlzdGVuZXIgewotCXByaXZhdGUgZmluYWwgQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGR5bmFtaWNUYWI7Ci0KLQlwdWJsaWMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyKAotCQkJQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGR5bmFtaWNUYWIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5keW5hbWljVGFiID0gZHluYW1pY1RhYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJc3VwZXIubW9kaWZ5VGV4dChlKTsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlkeW5hbWljVGFiLmZpcmVDb250ZW50c0NoYW5nZWQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJZHluYW1pY1RhYi5maXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlzdXBlci53aWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJZHluYW1pY1RhYi5maXJlQ29udGVudHNDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM3YWUxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS51aS5tZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5ybS51aS5tZXNzYWdlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRXhjZXB0aW9uX0Nvbm5lY3Rpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0V4Y2VwdGlvbl9Db25uZWN0aW9uRXJyb3JEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0NvbnRpbnVvdXNNaW5pdG9yQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0RlYnVnQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0Rpc2NvdmVyQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0xhdW5jaENvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9QYXRoSW5zdGFsbGF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfUGVyaW9kaWNNb25pdG9yQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1BlcmlvZGljTW9uaXRvckNvbW1hbmRQZXJpb2Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9Vc2VEZWZhdWx0U2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZV9QYXRoU2VsZWN0aW9uRGlhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9JbnZhbGlkUGVyaW9kaWNNb25pdG9yQ29tbWFuZFRpbWVSYW5nZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0RlYnVnQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0Rpc2NvdmVyQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0xhdW5jaENvbW1hbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfTGFiZWxfQ29udGludW9zTW9uaXRvckNvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX0xhYmVsX0RlYnVnQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfTGFiZWxfRGlzY292ZXJDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9JbnN0YWxsYXRpb25QYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9MYXVuY2hDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9QZXJpb2RpY01vbml0b3JDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9QZXJpb2RpY01vbml0b3JDb21tYW5kUGVyaW9kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9WYWxpZGF0aW9uX0ludmFsaWRQZXJpb2RpY01vbml0b3JDb21tYW5kVGltZVJhbmdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9WYWxpZGF0aW9uX01pc3NpbmdEaXNjb3ZlckNvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0xhdW5jaENvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ01pc3NpbmdEZWJ1Z0NvbW1hbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb29sc1JNVUlQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxZWQwZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRXhjZXB0aW9uX0Nvbm5lY3Rpb25FcnJvcj1Db25uZWN0aW9uIEVycm9yCi1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0V4Y2VwdGlvbl9Db25uZWN0aW9uRXJyb3JEZXNjcmlwdGlvbj1Db3VsZCBub3Qgb3BlbiBjb25uZWN0aW9uCi1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0NvbnRpbnVvdXNNaW5pdG9yQ29tbWFuZD1Db250aW51b3VzIG1vbml0b3IgY29tbWFuZDoKLUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfRGVidWdDb21tYW5kPURlYnVnIGNvbW1hbmQ6Ci1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0Rpc2NvdmVyQ29tbWFuZD1EaXNjb3ZlciBjb21tYW5kOgotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9MYXVuY2hDb21tYW5kPUxhdW5jaCBjb21tYW5kOgotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9QYXRoSW5zdGFsbGF0aW9uPVBhdGggdG8gaW5zdGFsbGF0aW9uOgotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9QZXJpb2RpY01vbml0b3JDb21tYW5kPU1vbml0b3IgY29tbWFuZDoKLUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfUGVyaW9kaWNNb25pdG9yQ29tbWFuZFBlcmlvZD1QZXJpb2Q6Ci1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1VzZURlZmF1bHRTZXR0aW5ncz1Vc2UgZGVmYXVsdCBzZXR0aW5ncwotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZV9QYXRoU2VsZWN0aW9uRGlhbG9nPVNlbGVjdCBwYXRoIHRvIGluc3RhbGxhdGlvbgotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9WYWxpZGF0aW9uX0ludmFsaWRQZXJpb2RpY01vbml0b3JDb21tYW5kVGltZVJhbmdlPVRpbWUgcGVyaW9kIG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMAotQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9WYWxpZGF0aW9uX01pc3NpbmdEZWJ1Z0NvbW1hbmQ9RGVidWcgY29tbWFuZCBpcyBtaXNzaW5nCi1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0Rpc2NvdmVyQ29tbWFuZD1EaXNjb3ZlciBjb21tYW5kIGlzIG1pc3NpbmcKLUFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nTGF1bmNoQ29tbWFuZD1MYXVuY2ggY29tbWFuZCBpcyBtaXNzaW5nCi0KLUFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9Db250aW51b3NNb25pdG9yQ29tbWFuZD1Db250aW51b3VzIG1vbml0b3IgY29tbWFuZDoKLUFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9EZWJ1Z0NvbW1hbmQ9RGVidWcgY29tbWFuZDoKLUFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9EaXNjb3ZlckNvbW1hbmQ9RGlzY292ZXIgY29tbWFuZDoKLUFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9JbnN0YWxsYXRpb25QYXRoPVBhdGggdG8gaW5zdGFsbGF0aW9uOgotQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX0xhYmVsX0xhdW5jaENvbW1hbmQ9TGF1bmNoIGNvbW1hbmQ6Ci1BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfTGFiZWxfUGVyaW9kaWNNb25pdG9yQ29tbWFuZD1Nb25pdG9yIGNvbW1hbmQ6Ci1BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfTGFiZWxfUGVyaW9kaWNNb25pdG9yQ29tbWFuZFBlcmlvZD1QZXJpb2Q6Ci1BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfVmFsaWRhdGlvbl9JbnZhbGlkUGVyaW9kaWNNb25pdG9yQ29tbWFuZFRpbWVSYW5nZT1UaW1lIHBlcmlvZCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDAKLUFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9WYWxpZGF0aW9uX01pc3NpbmdEaXNjb3ZlckNvbW1hbmQ9RGlzY292ZXIgY29tbWFuZCBpcyBtaXNzaW5nCi1BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nTGF1bmNoQ29tbWFuZD1MYXVuY2ggY29tbWFuZCBpcyBtaXNzaW5nCi1BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nTWlzc2luZ0RlYnVnQ29tbWFuZD1EZWJ1ZyBjb21tYW5kIGlzIG1pc3NpbmcKLQotVG9vbHNSTVVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yPUludGVybmFsIEVycm9yCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyMWI0YS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSBwcmVmZXJlbmNlIHBhZ2UgYWxyZWFkeSBwcmVwYXJlZCB0byBpbnRlci1vcGVyYXRlIHdpdGgge0BsaW5rIFByZWZlcmVuY2VEYXRhU291cmNlfSBhbmQge0BsaW5rIFByZWZlcmVuY2VXaWRnZXRMaXN0ZW5lcn0uCi0gKiBAYXV0aG9yIGRmZmVyYmVyCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgZmluYWwgUHJlZmVyZW5jZVdpZGdldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlTGlzdGVuZXIoKTsKLQlwcml2YXRlIGZpbmFsIFByZWZlcmVuY2VEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBjcmVhdGVEYXRhU291cmNlKCk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodGl0bGUpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlKFN0cmluZyB0aXRsZSwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCXN1cGVyKHRpdGxlLCBpbWFnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VXaWRnZXRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCkgewotCQlyZXR1cm4gZGF0YVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc3RvcmFnZSBmb3IgcHJlZmVyZW5jZXMuCi0JICogQHJldHVybiBUaGUgc3RvcmFnZSBmb3IgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJlZmVyZW5jZXMgc3RvcmFnZSBzaG91bGQgYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZVByZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbGlzdGVuZXIgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIFRoZSBsaXN0ZW5lciBtdXN0IGV4dGVuZCB7QGxpbmsgUHJlZmVyZW5jZVdpZGdldExpc3RlbmVyfSBhbmQgYWRkCi0JICogc3BlY2lmaWMgYmVoYXZpb3IgZm9yIHdpZGdldHMgb2YgdGhlIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCi0JICogQHJldHVybiB0aGUgbGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJlZmVyZW5jZVdpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGF0YSBzb3VyY2UgdG8gaGFuZGxlIHBhZ2UgY29udGVudC4gVGhlIGxpc3RlbmVyIG11c3QgZXh0ZW5kIHtAbGluayBQcmVmZXJlbmNlRGF0YVNvdXJjZX0gYW5kIGFkZAotCSAqIHNwZWNpZmljIGJlaGF2aW9yIGZvciB3aWRnZXRzIG9mIHRoZSB0aGUgcHJlZmVyZW5jZSBwYWdlLgotCSAqIEByZXR1cm4gdGhlIGxpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByZWZlcmVuY2VEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJCXJlc2V0RXJyb3JNZXNzYWdlcygpOwotCQkJZGF0YVNvdXJjZS5zdG9yZUFuZFZhbGlkYXRlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkvLwkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlyZXNldEVycm9yTWVzc2FnZXMoKTsKLQkJCWxpc3RlbmVyLmRpc2FibGUoKTsKLQkJCWRhdGFTb3VyY2UubG9hZERlZmF1bHRzQW5kVXBkYXRlKCk7Ci0JCQlsaXN0ZW5lci5lbmFibGUoKTsKLQkvLwkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJCXJlc2V0RXJyb3JNZXNzYWdlcygpOwotCQkJZGF0YVNvdXJjZS5zdG9yZUFuZFZhbGlkYXRlKCk7Ci0JLy8JCXN1cGVyLnBlcmZvcm1BcHBseSgpOwotCQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEVycm9yTWVzc2FnZXMoKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlsaXN0ZW5lci5kaXNhYmxlKCk7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IGRvQ3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJcmVzZXRFcnJvck1lc3NhZ2VzKCk7Ci0JCWRhdGFTb3VyY2UubG9hZEFuZFVwZGF0ZSgpOwotCQlsaXN0ZW5lci5lbmFibGUoKTsKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29udGVudHMgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQ29tcG9zaXRlIGRvQ3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzhjN2I1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9wcmVmZXJlbmNlcy9BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKgotICogVE9ETzogbWFrZSB0aGlzIGNsYXNzIGV4cGFuc2libGUgZm9yIHByZWZlcmVuY2UgcGFnZXMgZm9yIHRvb2xzLgotICogT25lIG1pZ2h0IHdhbnQgdG8gZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGFkZCBtb3JlIGZpZWxkcy4KLSAqIC0gTWFrZSBsaXN0ZW5lciBleHRlbnNpYmxlCi0gKiAtIE1ha2UgZGF0YSBzb3VyY2UgZXh0ZW5zaWJsZQotICogLSBNYWtlIGNyZWF0ZUNvbnRlbnRzIGV4dGVuc2libGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBQcmVmZXJlbmNlV2lkZ2V0TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkb01vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZXZ0LmdldFNvdXJjZSgpOwotCQkJaWYoc291cmNlID09IGxhdW5jaENtZFRleHQgfHwKLQkJCQkJc291cmNlID09IGRlYnVnQ21kVGV4dCB8fAotCQkJCQlzb3VyY2UgPT0gZGlzY292ZXJDbWRUZXh0IHx8Ci0JCQkJCXNvdXJjZSA9PSBwZXJpb2RpY01vbml0b3JDbWRUZXh0IHx8Ci0JCQkJCXNvdXJjZSA9PSBjb250aW51b3VzTW9uaXRvckNtZFRleHQgfHwKLQkJCQkJc291cmNlID09IHBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyIHx8Ci0JCQkJCXNvdXJjZSA9PSByZW1vdGVJbnN0YWxsUGF0aFRleHQpIHsKLQkJCQlyZXNldEVycm9yTWVzc2FnZXMoKTsKLQkJCQlnZXREYXRhU291cmNlKCkuanVzdFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydCBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIERhdGFTb3VyY2UgZXh0ZW5kcyBQcmVmZXJlbmNlRGF0YVNvdXJjZSB7Ci0JCURhdGFTb3VyY2UoQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCVN0cmluZyBsYXVuY2hDbWQgPSBudWxsOwotCQlTdHJpbmcgZGVidWdDbWQgPSBudWxsOwotCQlTdHJpbmcgZGlzY292ZXJDbWQgPSBudWxsOwotCQlTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kID0gbnVsbDsKLQkJaW50IHBlcmlvZGljTW9uaXRvclRpbWUgPSAwOwotCQlTdHJpbmcgY29udGludW91c01vbml0b3JDbWQgPSBudWxsOwotCQlTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBudWxsOwotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCWlmIChsYXVuY2hDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlsYXVuY2hDbWQgPSBleHRyYWN0VGV4dChsYXVuY2hDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChkZWJ1Z0NtZFRleHQgIT0gbnVsbCkgewotCQkJCWRlYnVnQ21kID0gZXh0cmFjdFRleHQoZGVidWdDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChkaXNjb3ZlckNtZFRleHQgIT0gbnVsbCkgewotCQkJCWRpc2NvdmVyQ21kID0gZXh0cmFjdFRleHQoZGlzY292ZXJDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlwZXJpb2RpY01vbml0b3JDbWQgPSBleHRyYWN0VGV4dChwZXJpb2RpY01vbml0b3JDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciAhPSBudWxsKSB7Ci0JCQkJcGVyaW9kaWNNb25pdG9yVGltZSA9IHBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQkJaWYgKGNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGludW91c01vbml0b3JDbWQgPSBleHRyYWN0VGV4dChjb250aW51b3VzTW9uaXRvckNtZFRleHQpOwotCQkJfQotCQkJaWYgKHJlbW90ZUluc3RhbGxQYXRoVGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVtb3RlSW5zdGFsbFBhdGggPSBleHRyYWN0VGV4dChyZW1vdGVJbnN0YWxsUGF0aFRleHQpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlpZiAobGF1bmNoQ21kVGV4dCAhPSBudWxsICYmIGxhdW5jaENtZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0xhdW5jaENvbW1hbmQpOwotCQkJfQotCQkJaWYgKGRlYnVnQ21kVGV4dCAhPSBudWxsICYmIGRlYnVnQ21kID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nTWlzc2luZ0RlYnVnQ29tbWFuZCk7Ci0JCQl9Ci0JCQlpZiAoZGlzY292ZXJDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlpZiAoZGlzY292ZXJDbWQgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nRGlzY292ZXJDb21tYW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJaWYgKHBlcmlvZGljTW9uaXRvckNtZCA9PSBudWxsKSB7Ci0JCQkJLy8JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJQZXJpb2RpYyBtb25pdG9yIGNvbW1hbmQgaXMgbWlzc2luZyIpOwotCQkJCS8vCQkJCX0KLQkJCQlpZiAocGVyaW9kaWNNb25pdG9yVGltZVNwaW5uZXIgIT0gbnVsbCAmJiBwZXJpb2RpY01vbml0b3JUaW1lIDwgMSkgewotCQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfVmFsaWRhdGlvbl9JbnZhbGlkUGVyaW9kaWNNb25pdG9yQ29tbWFuZFRpbWVSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb1N0b3JhZ2UoKSB7Ci0JCQlQcmVmZXJlbmNlcyBjb25maWcgPSBnZXRQcmVmZXJlbmNlcygpOwotCQkJaWYgKGxhdW5jaENtZFRleHQgIT0gbnVsbCkgewotCQkJCWNvbmZpZy5zZXRWYWx1ZShwcmVmaXggKyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfTEFVTkNIX0NNRCwgdG9QcmVmZXJlbmNlKGxhdW5jaENtZCkpOwotCQkJfQotCQkJaWYgKGRlYnVnQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldFZhbHVlKHByZWZpeCArIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQsIHRvUHJlZmVyZW5jZShkZWJ1Z0NtZCkpOwotCQkJfQotCQkJaWYgKGRpc2NvdmVyQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldFZhbHVlKHByZWZpeCArIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQsIHRvUHJlZmVyZW5jZShkaXNjb3ZlckNtZCkpOwotCQkJfQotCQkJaWYgKHBlcmlvZGljTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJCWNvbmZpZy5zZXRWYWx1ZShwcmVmaXggKyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9DTUQsIHRvUHJlZmVyZW5jZShwZXJpb2RpY01vbml0b3JDbWQpKTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldFZhbHVlKHByZWZpeCArIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUsIHBlcmlvZGljTW9uaXRvclRpbWUpOwotCQkJfQotCQkJaWYgKGNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldFZhbHVlKHByZWZpeCArIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19DT05USU5VT1VTX01PTklUT1JfQ01ELCB0b1ByZWZlcmVuY2UoY29udGludW91c01vbml0b3JDbWQpKTsKLQkJCX0KLQkJCWlmIChyZW1vdGVJbnN0YWxsUGF0aFRleHQgIT0gbnVsbCkgewotCQkJCWNvbmZpZy5zZXRWYWx1ZShwcmVmaXggKyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCwgdG9QcmVmZXJlbmNlKHJlbW90ZUluc3RhbGxQYXRoKSk7Ci0JCQl9Ci0JCQlzYXZlUHJlZmVyZW5jZXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQlQcmVmZXJlbmNlcyBjb25maWcgPSBnZXRQcmVmZXJlbmNlcygpOwotCQkJaWYgKGxhdW5jaENtZFRleHQgIT0gbnVsbCkgewotCQkJCWxhdW5jaENtZCA9IGZyb21QcmVmZXJlbmNlKGNvbmZpZy5nZXRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0xBVU5DSF9DTUQpKTsKLQkJCX0KLQkJCWlmIChkZWJ1Z0NtZFRleHQgIT0gbnVsbCkgewotCQkJCWRlYnVnQ21kID0gZnJvbVByZWZlcmVuY2UoY29uZmlnLmdldFN0cmluZyhwcmVmaXggKyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKSk7Ci0JCQl9Ci0JCQlpZiAoZGlzY292ZXJDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlkaXNjb3ZlckNtZCA9IGZyb21QcmVmZXJlbmNlKGNvbmZpZy5nZXRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCkpOwotCQkJfQotCQkJaWYgKHBlcmlvZGljTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJCXBlcmlvZGljTW9uaXRvckNtZCA9IGZyb21QcmVmZXJlbmNlKGNvbmZpZy5nZXRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfQ01EKSk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yVGltZVNwaW5uZXIgIT0gbnVsbCkgewotCQkJCXBlcmlvZGljTW9uaXRvclRpbWUgPSBjb25maWcuZ2V0SW50KHByZWZpeCArIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUpOwotCQkJfQotCQkJaWYgKGNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGludW91c01vbml0b3JDbWQgPSBmcm9tUHJlZmVyZW5jZShjb25maWcuZ2V0U3RyaW5nKHByZWZpeCArIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19DT05USU5VT1VTX01PTklUT1JfQ01EKSk7Ci0JCQl9Ci0JCQlpZiAocmVtb3RlSW5zdGFsbFBhdGhUZXh0ICE9IG51bGwpIHsKLQkJCQlyZW1vdGVJbnN0YWxsUGF0aCA9IGZyb21QcmVmZXJlbmNlKGNvbmZpZy5nZXRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgpKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLQkJCVByZWZlcmVuY2VzIGNvbmZpZyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAobGF1bmNoQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJbGF1bmNoQ21kID0gZnJvbVByZWZlcmVuY2UoY29uZmlnLmdldERlZmF1bHRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0xBVU5DSF9DTUQpKTsKLQkJCX0KLQkJCWlmIChkZWJ1Z0NtZFRleHQgIT0gbnVsbCkgewotCQkJCWRlYnVnQ21kID0gZnJvbVByZWZlcmVuY2UoY29uZmlnLmdldERlZmF1bHRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RFQlVHX0NNRCkpOwotCQkJfQotCQkJaWYgKGRpc2NvdmVyQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJZGlzY292ZXJDbWQgPSBmcm9tUHJlZmVyZW5jZShjb25maWcuZ2V0RGVmYXVsdFN0cmluZyhwcmVmaXggKyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfRElTQ09WRVJfQ01EKSk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJcGVyaW9kaWNNb25pdG9yQ21kID0gZnJvbVByZWZlcmVuY2UoY29uZmlnLmdldERlZmF1bHRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfQ01EKSk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yVGltZVNwaW5uZXIgIT0gbnVsbCkgewotCQkJCXBlcmlvZGljTW9uaXRvclRpbWUgPSBjb25maWcuZ2V0RGVmYXVsdEludChwcmVmaXggKyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9USU1FKTsKLQkJCX0KLQkJCWlmIChjb250aW51b3VzTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRpbnVvdXNNb25pdG9yQ21kID0gZnJvbVByZWZlcmVuY2UoY29uZmlnLmdldERlZmF1bHRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0NPTlRJTlVPVVNfTU9OSVRPUl9DTUQpKTsKLQkJCX0KLQkJCWlmIChyZW1vdGVJbnN0YWxsUGF0aFRleHQgIT0gbnVsbCkgewotCQkJCXJlbW90ZUluc3RhbGxQYXRoID0gZnJvbVByZWZlcmVuY2UoY29uZmlnLmdldERlZmF1bHRTdHJpbmcocHJlZml4ICsgQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgpKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9GaWVsZHMoKSB7Ci0JCQlpZiAobGF1bmNoQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJYXBwbHlUZXh0KGxhdW5jaENtZFRleHQsIGxhdW5jaENtZCk7Ci0JCQl9Ci0JCQlpZiAoZGVidWdDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlhcHBseVRleHQoZGVidWdDbWRUZXh0LCBkZWJ1Z0NtZCk7Ci0JCQl9Ci0JCQlpZiAoZGlzY292ZXJDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlhcHBseVRleHQoZGlzY292ZXJDbWRUZXh0LCBkaXNjb3ZlckNtZCk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJYXBwbHlUZXh0KHBlcmlvZGljTW9uaXRvckNtZFRleHQsIHBlcmlvZGljTW9uaXRvckNtZCk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yVGltZVNwaW5uZXIgIT0gbnVsbCkgewotCQkJCXBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyLnNldFNlbGVjdGlvbihwZXJpb2RpY01vbml0b3JUaW1lKTsKLQkJCX0KLQkJCWlmIChjb250aW51b3VzTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJCWFwcGx5VGV4dChjb250aW51b3VzTW9uaXRvckNtZFRleHQsIGNvbnRpbnVvdXNNb25pdG9yQ21kKTsKLQkJCX0KLQkJCWlmIChyZW1vdGVJbnN0YWxsUGF0aFRleHQgIT0gbnVsbCkgewotCQkJCWFwcGx5VGV4dChyZW1vdGVJbnN0YWxsUGF0aFRleHQsIHJlbW90ZUluc3RhbGxQYXRoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAgLy8kTk9OLU5MUy0xJAotCVRleHQgbGF1bmNoQ21kVGV4dCA9IG51bGw7Ci0JVGV4dCBkZWJ1Z0NtZFRleHQgPSBudWxsOwotCVRleHQgZGlzY292ZXJDbWRUZXh0ID0gbnVsbDsKLQlUZXh0IGNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dCA9IG51bGw7Ci0JVGV4dCBwZXJpb2RpY01vbml0b3JDbWRUZXh0ID0gbnVsbDsKLQlTcGlubmVyIHBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyID0gbnVsbDsKLQlUZXh0IHJlbW90ZUluc3RhbGxQYXRoVGV4dCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBjYXBhYmlsaXRpZXMgPSBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uTk9fQ0FQX1NFVDsKLQlmaW5hbCBTdHJpbmcgcHJlZml4OyAvLyB0byBnZXQgcHJlZmVyZW5jZXMKLQotCXB1YmxpYyBBYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHByZWZpeCwgaW50IGNhcGFiaWxpdGllcykgewotCQlzdXBlcigpOwotCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZShTdHJpbmcgcHJlZml4LCBpbnQgY2FwYWJpbGl0aWVzLCBTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlzdXBlcih0aXRsZSwgaW1hZ2UpOwotCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZShTdHJpbmcgcHJlZml4LCBpbnQgY2FwYWJpbGl0aWVzLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodGl0bGUpOwotCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBuZXcgRGF0YVNvdXJjZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVdpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldExpc3RlbmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBOb3RoaW5nIHRvIGRvLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9DcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQljb250ZW50cy5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvKgotCQkgKiBsYXVuY2ggY21kCi0JCSAqLwotCQlpZiAoKGNhcGFiaWxpdGllcyAmIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbi5DQVBfTEFVTkNIKSAhPSAwKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfTGFiZWxfTGF1bmNoQ29tbWFuZCk7Ci0KLQkJCWxhdW5jaENtZFRleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJbGF1bmNoQ21kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlLCAzLCAxKSk7Ci0JCQlsYXVuY2hDbWRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BYnN0cmFjdFRvb2xzUHJlZmVyZW5jZVBhZ2VfTGFiZWxfRGVidWdDb21tYW5kKTsKLQotCQkJZGVidWdDbWRUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWRlYnVnQ21kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlLCAzLCAxKSk7Ci0JCQlkZWJ1Z0NtZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSApOwotCQl9Ci0KLQkJLyoKLQkJICogZGlzY292ZXIgY21kCi0JCSAqLwotCQlpZiAoKGNhcGFiaWxpdGllcyAmIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbi5DQVBfRElTQ09WRVIpICE9IDApIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9EaXNjb3ZlckNvbW1hbmQpOwotCi0JCQlkaXNjb3ZlckNtZFRleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJZGlzY292ZXJDbWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgdHJ1ZSwgZmFsc2UsIDMsIDEpKTsKLQkJCWRpc2NvdmVyQ21kVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJfQotCi0JCS8qCi0JCSAqIFBlcmlvZGljIG1vbml0b3IgY21kIGFuZCB0aW1lCi0JCSAqLwotCQlpZiAoKGNhcGFiaWxpdGllcyAmIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbi5DQVBfUEVSSU9ESUNfTU9OSVRPUikgIT0gMCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX0xhYmVsX1BlcmlvZGljTW9uaXRvckNvbW1hbmQpOwotCi0JCQlwZXJpb2RpY01vbml0b3JDbWRUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXBlcmlvZGljTW9uaXRvckNtZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCQkJcGVyaW9kaWNNb25pdG9yQ21kVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpICk7Ci0KLQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9QZXJpb2RpY01vbml0b3JDb21tYW5kUGVyaW9kKTsKLQkJCXBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyID0gbmV3IFNwaW5uZXIoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXBlcmlvZGljTW9uaXRvckNtZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQkJCXBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyLmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29udGludW91cyBtb25pdG9yIGNtZAotCQkgKi8KLQkJaWYgKChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX0NPTlRJTlVPVVNfTU9OSVRPUikgIT0gMCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VQYWdlX0xhYmVsX0NvbnRpbnVvc01vbml0b3JDb21tYW5kKTsKLQotCQkJY29udGludW91c01vbml0b3JDbWRUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlLCAzLCAxKSk7Ci0JCQljb250aW51b3VzTW9uaXRvckNtZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCX0KLQotCQkvKgotCQkgKiBJbnN0YWxsYXRpb24gcGF0aAotCQkgKi8KLQkJaWYgKChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX1JFTU9URV9JTlNUQUxMX1BBVEgpICE9IDApIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFic3RyYWN0VG9vbHNQcmVmZXJlbmNlUGFnZV9MYWJlbF9JbnN0YWxsYXRpb25QYXRoKTsKLQotCQkJcmVtb3RlSW5zdGFsbFBhdGhUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlnZC53aWR0aEhpbnQgPSA2MDsKLQkJCXJlbW90ZUluc3RhbGxQYXRoVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXJlbW90ZUluc3RhbGxQYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8uCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VEYXRhU291cmNlLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2NDdmOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkudXRpbHMuRGF0YVNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VEYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZSB7Ci0JcHJpdmF0ZSBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHBhZ2U7Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZURhdGFTb3VyY2UoQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBwYWdlKSB7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRmFjaWxpdHkgdG8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gcHJlZmVyZW5jZSBzdG9yYWdlLgotCSAqIE51bGwgdmFsdWVzIGNhbm5vdCBiZSBzdG9yZWQsIHRoZXJlZm9yZSwgdGhleSBhcmUgY29udmVydGVkIHRvIGVtcHR5IHN0cmluZy4KLQkgKiBAcGFyYW0gVGhlIHN0cmluZyB0byBiZSBzdG9yZWQKLQkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9QcmVmZXJlbmNlKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyA9PSBudWxsID8gIiIgOiBzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEZhY2lsaXR5IHRvIGNvbnZlcnQgYSBzdHJpbmcgcmVhZCBmcm9tIHN0b3JhZ2Ugb2YgcHJlZmVyZW5jZSBwYWdlIHRvIGEgc3RyaW5nIHZhbHVlLgotCSAqIEVtcHR5IHN0cmluZyBpcyBjb252ZXJ0ZWQgdG8gbnVsbCwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgbWlzc2luZy4KLQkgKiBAcGFyYW0gVGhlIHN0cmluZyBmcm9tIHByZWZlcmVuY2Ugc3RvcmFnZQotCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmcm9tUHJlZmVyZW5jZShTdHJpbmcgcykgewotCQlyZXR1cm4gKHMuZXF1YWxzKEVNUFRZX1NUUklORykgPyBudWxsIDogcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQlwYWdlLnNldEVycm9yTWVzc2FnZShlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCXBhZ2Uuc2V0VmFsaWQoZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJcGFnZS51cGRhdGVDb250cm9scygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlV2lkZ2V0TGlzdGVuZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlV2lkZ2V0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1MmZhNC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZVdpZGdldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLnV0aWxzLldpZGdldExpc3RlbmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZVdpZGdldExpc3RlbmVyIGV4dGVuZHMgV2lkZ2V0TGlzdGVuZXIgewotCS8vIE5vdGhpbmcgdG8gYWRkIG9yIGV4dGVuZAotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3V0aWxzL0RhdGFTb3VyY2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS91dGlscy9EYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOGU5NzYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3V0aWxzL0RhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnVpLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb21tb24gZmVhdHVyZXMgZm9yIGEgaW50ZXJtZWRpYXJ5IGJ1ZmZlciwgdG8gbG9hZCBhbmQgc3RvcmUgY29udGVudCBvZgotICogd2lkZ2V0IG9uIGRpYWxvZyBwYWdlcyBhbmQgdG8gdmFsaWRhdGUgdGhlaXIgY29udGVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBlYXNlcyByZWFkaW5nL3dyaXRpbmcgdmFsdWVzIGZyb20gc3RvcmFnZSBhbmQgc2V0dGluZy9nZXR0aW5nIHRoZW0KLSAqIHRvL2Zyb20gaW5wdXQgd2lkZ2V0cyBvZiB0aGUgZGlhbG9nIHBhZ2UuCi0gKiA8cD4KLSAqIEZvciB0aGF0IHB1cnBvc2UsIHRoZSBjbGFzcyBhc3N1bWVzIGEgaW50ZXJtZWRpYXJ5IHN0b3JhZ2UgKGltcGxlbWVudGVkIGJ5Ci0gKiBleHRlbmRpbmcgY2xhc3MpIHRoYXQgYnVmZmVycyB0aGUgdmFsdWVzIHdoZW4gZ2V0dGluZyBmcm9tIHdpZGdldHMgYW5kCi0gKiB3cml0aW5nIHRoZW0gdG8gc3RvcmFnZSBzdG9yYWdlLiBUaGUgc2FtZSBpbnRlcm1lZGlhcnkgc3RvcmFnZSBpcyB1c2VkIHRvCi0gKiBidWZmZXIgdmFsdWVzIHdoZW4gcmVhZGluZyB2YWx1ZXMgZnJvbSBzdG9yYWdlIHN0b3JhZ2UgYW5kIHNldHRpbmcgdGhlbSB0bwotICogd2lkZ2V0cy4gV2hpbGUgaW4gaW50ZXJtZWRpYXJ5IGJ1ZmZlciwgdmFsdWVzIGFyZSB2YWxpZGF0ZWQuCi0gKiA8cD4KLSAqIEVhY2ggc3RlcCBpcyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBhYnN0cmFjdCBtZXRob2QgdGhhdCBpcyBpbXBsZW1lbnRlZCBieQotICogdGhlIGV4dGVuZGluZyBjbGFzcy4gTWV0aG9kcyBhcmUgcHJvdmlkZWQgZm9yIGEgY29tcGxldGUgc2VxdWVuY2Ugb2YKLSAqIG9wZXJhdGlvbnMgKGVnLiBnZXR0aW5nIGZyb20gd2lkZ2V0cywgdmFsaWRhdGluZywgd3JpdGluZyB0byBzdG9yYWdlKS4gVGhlCi0gKiBjbGFzcyBjb250cm9scyB0aGUgdmFsaWRpdHkgc3RhdGUgb2YgdGhlIGRpYWxvZyBwYWdlIGFuZCBpdHMgZXJyb3Ivd2FybmluZwotICogbWVzc2FnZS4KLSAqCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFTb3VyY2UgewotCS8qKgotCSAqIEV4Y2VwdGlvbiByYWlzZWQgYnkgdmFsaWRhdGlvbiBtZXRob2RzIHdoZW4gaW5wdXQgb2YgYSBmaWVsZCBpcyBpbnZhbGlkLgotCSAqIFRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24gaXMgZGlzcGxheWVkIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCi0JICovCi0JcHVibGljIGNsYXNzIFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIGNhblNhdmUgPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIGNhbkFjY2VwdCA9IGZhbHNlOwotCi0JCXB1YmxpYyBWYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlzdXBlcihtZXNzYWdlKTsKLQkJCWNhblNhdmUgPSBmYWxzZTsKLQkJCWNhbkFjY2VwdCA9IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gY2FuQWNjZXB0LAotCQkJCWJvb2xlYW4gY2FuU2F2ZSkgewotCQkJc3VwZXIobWVzc2FnZSk7Ci0JCQl0aGlzLmNhbkFjY2VwdCA9IGNhbkFjY2VwdDsKLQkJCXRoaXMuY2FuU2F2ZSA9IGNhblNhdmU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5BY2NlcHQoKSB7Ci0JCQlyZXR1cm4gY2FuQWNjZXB0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuU2F2ZSgpIHsKLQkJCXJldHVybiBjYW5TYXZlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBWYWxpZGF0aW9uRXhjZXB0aW9uIGZpcnN0RXhjZXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gY2FuU2F2ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBjYW5BY2NlcHQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHBhZ2Ugd2l0aCB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgc3RhdHVzLgotCSAqCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQgd2hpbGUgdmFsaWRhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHN0b3JhZ2UuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFZhbGlkYXRpb25FeGNlcHRpb24gZSk7Ci0KLQkvKioKLQkgKiBGYWNpbGl0eSB0byBnZXQgc3RyaW5nIHZhbHVlIG9mIGEge0BsaW5rIFRleHR9IHdpZGdldCwgb3IgbnVsbCBpZiB0aGUKLQkgKiB3aWRnZXQgaXMgZW1wdHkuCi0JICoKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHdpZGdldAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyB2YWx1ZSBvZiB3aWRnZXQgb3IgbnVsbCB3aWRnZXQgaXMgZW1wdHkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0VGV4dChUZXh0IHRleHQpIHsKLQkJYXNzZXJ0IHRleHQgIT0gbnVsbDsKLQkJU3RyaW5nIHMgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCXJldHVybiAocy5sZW5ndGgoKSA9PSAwID8gbnVsbCA6IHMpOwotCX0KLQotCS8qKgotCSAqIEZhY2lsaXR5IHRvIGdldCBzdHJpbmcgdmFsdWUgb2YgYSB7QGxpbmsgQ29tYm99IHdpZGdldCwgb3IgbnVsbCBpZiB0aGUKLQkgKiB3aWRnZXQgaXMgZW1wdHkuCi0JICoKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHdpZGdldAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyB2YWx1ZSBvZiB3aWRnZXQgb3IgbnVsbCB3aWRnZXQgaXMgZW1wdHkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0VGV4dChDb21ibyB0ZXh0KSB7Ci0JCWFzc2VydCB0ZXh0ICE9IG51bGw7Ci0JCVN0cmluZyBzID0gdGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlyZXR1cm4gKHMubGVuZ3RoKCkgPT0gMCA/IG51bGwgOiBzKTsKLQl9Ci0KLQkvKioKLQkgKiBGYWNpbGl0eSB0byBzZXQgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHtAbGluayBUZXh0fSB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gdAotCSAqICAgICAgICAgICAgVGhlIHtAbGluayBUZXh0fSB3aWRnZXQuCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgc3RyaW5nIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGx5VGV4dChUZXh0IHQsIFN0cmluZyBzKSB7Ci0JCWFzc2VydCB0ICE9IG51bGw7Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXQuc2V0VGV4dChFTVBUWV9TVFJJTkcpOwotCQl9IGVsc2UgewotCQkJdC5zZXRUZXh0KHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmFjaWxpdHkgdG8gc2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgYSB7QGxpbmsgVGV4dH0gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgVGV4dH0gd2lkZ2V0LgotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBUaGUgbmV3IHN0cmluZyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBseVRleHQoQ29tYm8gdCwgU3RyaW5nIHMpIHsKLQkJYXNzZXJ0IHQgIT0gbnVsbDsKLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJdC5zZXRUZXh0KEVNUFRZX1NUUklORyk7Ci0JCX0gZWxzZSB7Ci0JCQl0LnNldFRleHQocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaXZpZHVhbGx5IHZhbGlkYXRlIGVhY2ggdmFsdWUgaW4gaW50ZXJtZWRpYXJ5IHN0b3JhZ2UuCi0JICogU2hvdWxkIGJlIHVzZWQgdG8gdGVzdCBmb3JtYXQgYW5kIHJhbmdlIG9mIHZhbHVlcy4KLQkgKgotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEEgdmFsdWUgaW4gaW50ZXJtZWRpYXJ5IHN0b3JhZ2UgaXMgaW52YWxpZC4gVGhlIG1lc3NhZ2Ugb2YKLQkgKiAgICAgICAgICAgICB0aGUgZXhjZXB0aW9uIGlzIHNob3duIGFzIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgICBwYWdlLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCB0byB2YWxpZGF0ZSB0aGUgaW50ZXJtZWRpYXJ5IHN0b3JhZ2UgYXMgYSB3aG9sZS4gU2hvdWxkIGJlIHVzZWQgdG8KLQkgKiB0ZXN0IHZhbHVlcyBtYWtlIHNlbnNlIHdpdGggZWFjaCBvdGhlci4KLQkgKgotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEEgdmFsdWUgaW4gaW50ZXJtZWRpYXJ5IHN0b3JhZ2UgaXMgaW52YWxpZC4gVGhlIG1lc3NhZ2Ugb2YKLQkgKiAgICAgICAgICAgICB0aGUgZXhjZXB0aW9uIGlzIHNob3duIGFzIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgICBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlR2xvYmFsKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBnbG9iYWwgdmFsaWRhdGlvbi4KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gd3JpdGUgdGhlIGludGVybWVkaWFyeSBzdG9yYWdlIGludG8gc3RvcmFnZS4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gcmVhZCB0aGUgaW50ZXJtZWRpYXJ5IHN0b3JhZ2UgZnJvbSBzdG9yYWdlLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGxvYWRGcm9tU3RvcmFnZSgpOwotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGFzc2lnbiBkZWZhdWx0IHZhbHVlcyB0byBpbnRlcm1lZGlhcnkgc3RvcmFnZS4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBsb2FkRGVmYXVsdCgpOwotCi0JLyoqCi0JICogQ29weSB2YWx1ZXMgZnJvbSB0aGUgaW50ZXJtZWRpYXJ5IHN0b3JhZ2UgdG8gdGhlIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgY29weVRvRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBDb3B5IHZhbHVlcyBmcm9tIHRoZSB3aWRnZXRzIHRvIGludGVybWVkaWFyeSBzdG9yYWdlLgotCSAqCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQSB3aWRnZXQgY2Fubm90IGJlIHJlYWQgYmVjYXVzZSBpdCBjb250YWlucyBhbiBpbnZhbGlkIHZhbHVlCi0JICogICAgICAgICAgICAgdGhhdCBjYW5ub3QgYmUgcGFyc2VkIHRvIGludGVybWVkaWFyeSBzdG9yYWdlLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGNvcHlGcm9tRmllbGRzKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVcGRhdGUgdmlzaWJpbGl0eSBhbmQgJ2VuYWJsZWJpbGl0eScgb2Ygd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvbihWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5EQVRBU09VUkNFX1RSQUNJTkcsICJEYXRhU291cmNlOiBBZGQgRXhjZXB0aW9uOiB7MH0iLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZpcnN0RXhjZXB0aW9uID09IG51bGwpIHsKLQkJCWZpcnN0RXhjZXB0aW9uID0gZTsKLQkJCWNhbkFjY2VwdCA9IGUuY2FuQWNjZXB0KCk7Ci0JCQljYW5TYXZlID0gZS5jYW5TYXZlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2FuU2F2ZSAmJiAhIGUuY2FuU2F2ZSgpKSB7Ci0JCQkJZmlyc3RFeGNlcHRpb24gPSBlOwotCQkJfQotCQkJY2FuQWNjZXB0ID0gY2FuQWNjZXB0ICYmIGUuY2FuQWNjZXB0KCk7Ci0JCQljYW5TYXZlID0gY2FuU2F2ZSAmJiBlLmNhblNhdmUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0RXhjZXB0aW9ucygpIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5EQVRBU09VUkNFX1RSQUNJTkcsICJEYXRhU291cmNlOiBSZXNldCBleGNlcHRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJZmlyc3RFeGNlcHRpb24gPSBudWxsOwotCQljYW5BY2NlcHQgPSB0cnVlOwotCQljYW5TYXZlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BY2NlcHQoKSB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiRGF0YVNvdXJjZTogY2FuQWNjZXB0PXswfSIsIGNhbkFjY2VwdCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNhbkFjY2VwdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TYXZlKCkgewotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLkRBVEFTT1VSQ0VfVFJBQ0lORywgIkRhdGFTb3VyY2U6IGNhblNhdmU9ezB9IiwgY2FuU2F2ZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNhblNhdmU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VtbWFyaXplRXhjZXB0aW9ucygpIHsKLQkJaWYgKCEgY2FuQWNjZXB0IHx8ICEgY2FuU2F2ZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKGZpcnN0RXhjZXB0aW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJaWYgKGZpcnN0RXhjZXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIGZpcnN0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdmFsdWVzIGZyb20gd2lkZ2V0cyBpbnRvIGludGVybWVkaWFyeSBzdG9yYWdlIGFuZCB2YWxpZGF0ZSB0aGVtLgotCSAqLwotCWZpbmFsIHB1YmxpYyBib29sZWFuIGp1c3RWYWxpZGF0ZSgpIHsKLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5EQVRBU09VUkNFX1RSQUNJTkcsICJEYXRhU291cmNlOiBqdXN0VmFsaWRhdGUoKSIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXNldEV4Y2VwdGlvbnMoKTsKLQkJCWNvcHlGcm9tRmllbGRzKCk7Ci0JCQl2YWxpZGF0ZUxvY2FsKCk7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJYWRkRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXVwZGF0ZSgpOwotCQlyZXR1cm4gc3VtbWFyaXplRXhjZXB0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIFB1dCB2YWx1ZXMgZnJvbSBpbnRlcm1lZGlhcnkgc3RvcmFnZSBpbnRvIHdpZGdldHMgYW5kIHVwZGF0ZSB2aXNpYmlsaXR5IGFuZCAnZW5hYmxlYmlsaXR5JyBvZiB3aWRnZXRzLgotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIGp1c3RVcGRhdGUoKSB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiRGF0YVNvdXJjZToganVzdFVwZGF0ZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJY29weVRvRmllbGRzKCk7Ci0JCXRyeSB7Ci0JCQlyZXNldEV4Y2VwdGlvbnMoKTsKLQkJCXZhbGlkYXRlTG9jYWwoKTsKLQkJCXZhbGlkYXRlR2xvYmFsKCk7Ci0JCQlzdW1tYXJpemVFeGNlcHRpb25zKCk7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJYWRkRXhjZXB0aW9uKGUpOwotCQkJc3VtbWFyaXplRXhjZXB0aW9ucygpOwotCQl9Ci0JCXVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB2YWx1ZXMgZnJvbSB3aWRnZXRzLCB2YWxpZGF0ZSB0aGVtIGFuZCwgaWYgdmFsaWRhdGlvbnMgd2FzCi0JICogc3VjY2Vzc2Z1bCwgc3RvcmUgdGhlbSB0byBwcmVmZXJlbmNlcy4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjb3VsZCBzdG9yZSB0byBwcmVmZXJlbmNlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCWZpbmFsIHB1YmxpYyBib29sZWFuIHN0b3JlQW5kVmFsaWRhdGUoKSB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiRGF0YVNvdXJjZTogc3RvcmVBbmRWYWxpZGF0ZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXJlc2V0RXhjZXB0aW9ucygpOwotCQkJY29weUZyb21GaWVsZHMoKTsKLQkJCXZhbGlkYXRlTG9jYWwoKTsKLQkJCXZhbGlkYXRlR2xvYmFsKCk7Ci0JCQljb3B5VG9TdG9yYWdlKCk7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJYWRkRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXVwZGF0ZSgpOwotCQlyZXR1cm4gc3VtbWFyaXplRXhjZXB0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEdldCB2YWx1ZXMgZnJvbSBpbnB1dCBmaWVsZHMsIHZhbGlkYXRlcyB0aGVtIGFuZCBzdG9yZXMgdGhlbSB0bwotCSAqIHByZWZlcmVuY2VzLgotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIGxvYWRBbmRVcGRhdGUoKSB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiRGF0YVNvdXJjZTogbG9hZEFuZFVwZGF0ZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9hZEZyb21TdG9yYWdlKCk7Ci0JCWNvcHlUb0ZpZWxkcygpOwotCQl0cnkgewotCQkJcmVzZXRFeGNlcHRpb25zKCk7Ci0JCQl2YWxpZGF0ZUxvY2FsKCk7Ci0JCQl2YWxpZGF0ZUdsb2JhbCgpOwotCQkJc3VtbWFyaXplRXhjZXB0aW9ucygpOwotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFkZEV4Y2VwdGlvbihlKTsKLQkJCXN1bW1hcml6ZUV4Y2VwdGlvbnMoKTsKLQkJfQotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVmYXVsdCB2YWx1ZXMgZnJvbSBwcmVmZXJlbmNlcyBzdG9yYWdlIGFuZCBwdXQgdGhlbSBpbnRvIHdpZGdldHMuCi0JICogVmFsdWVzIGFyZSBhbHNvIHZhbGlkYXRlZC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCBsb2FkRGVmYXVsdHNBbmRVcGRhdGUoKSB7Ci0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiRGF0YVNvdXJjZTogbG9hZERlZmF1bHRzQW5kVXBkYXRlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQlsb2FkRGVmYXVsdCgpOwotCQljb3B5VG9GaWVsZHMoKTsKLQkJdHJ5IHsKLQkJCXJlc2V0RXhjZXB0aW9ucygpOwotCQkJdmFsaWRhdGVMb2NhbCgpOwotCQkJdmFsaWRhdGVHbG9iYWwoKTsKLQkJCXN1bW1hcml6ZUV4Y2VwdGlvbnMoKTsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhZGRFeGNlcHRpb24oZSk7Ci0JCQlzdW1tYXJpemVFeGNlcHRpb25zKCk7Ci0JCX0KLQkJdXBkYXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3V0aWxzL0RlYnVnVXRpbC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3V0aWxzL0RlYnVnVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWFiODlmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS91dGlscy9EZWJ1Z1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGVidWdVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQVNPVVJDRV9PUFRJT04gPSAib3JnLmVjbGlwc2UucHRwLnJtLnVpL2RlYnVnL2RhdGFTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RFTkVSX09QVElPTiA9ICJvcmcuZWNsaXBzZS5wdHAucm0uY29yZS9kZWJ1Zy93aWRnZXRMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBEQVRBU09VUkNFX1RSQUNJTkcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gTElTVEVORVJfVFJBQ0lORyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVBsdWdpbkRlYnVnT3B0aW9ucygpIHsKLQkJaWYgKFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCVN0cmluZyBvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihEQVRBU09VUkNFX09QVElPTik7Ci0JCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQlEQVRBU09VUkNFX1RSQUNJTkcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oTElTVEVORVJfT1BUSU9OKTsKLQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJCUxJU1RFTkVSX1RSQUNJTkcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJvb2xlYW4gb3B0aW9uLCBTdHJpbmcgcGF0dGVybiwgT2JqZWN0IC4uLiBhcmd1bWVudHMpIHsKLQkJdHJhY2Uob3B0aW9uLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmd1bWVudHMpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYm9vbGVhbiBvcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvcHRpb24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihib29sZWFuIG9wdGlvbiwgU3RyaW5nIHBhdHRlcm4sIE9iamVjdCAuLi4gYXJndW1lbnRzKSB7Ci0JCWVycm9yKG9wdGlvbiwgTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJndW1lbnRzKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKGJvb2xlYW4gb3B0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob3B0aW9uKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvdXRpbHMvV2lkZ2V0TGlzdGVuZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS91dGlscy9XaWRnZXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTYwYWRkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS91dGlscy9XaWRnZXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS51aS51dGlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50OwotCi0vKioKLSAqIENvbW1vbiBmZWF0dXJlcyB1c2VmdWwgZm9yIHdpZGdldCBldmVudCBsaXN0ZW5lcnMgb24gUHJlZmVyZW5jZVBhZ2VzLgotICogPHA+Ci0gKiBBdCB0aGUgbW9tZW50LCBvbmx5IGVuYWJsZS9kaXNhYmxlIGZlYXR1cmUgaXMgcHJvdmlkZWQuIFRoZSBsaXN0ZW5lciBtdXN0IGJlCi0gKiBkaXNhYmxlZCBiZWZvcmUgdXBkYXRpbmcgY29udGVudHMgb2YgaW5wdXQgd2lkZ2V0cy4gV2hlbiBjb250ZW50IG9mIFNXVAotICogd2lkZ2V0cyBpcyBjaGFuZ2VkIGJ5IGNvZGUsIHNvbWUgb2YgdGhlIHdpZGdldHMgZG8gZGlzcGF0Y2ggZXZlbnRzIGFzIGlmIHRoZXkKLSAqIHdlcmUgdXNlciBldmVudHMuCi0gKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXaWRnZXRMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLAotTW9kaWZ5TGlzdGVuZXIgewotCS8qKiBTdGF0ZSBvZiB0aGUgbGlzdGVuZXIgKGVuYWJsZWQvZGlzYWJsZWQpLiAqLwotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotCi0JLyoqIEVuYWJsZSB0aGUgbGlzdGVuZXIgdG8gaGFuZGxlIGV2ZW50cy4gKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlKCkgewotCQlsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotCX0KLQotCS8qKiBEaXNhYmxlIGxpc3RlbmVyLCByZWNlaXZlZCBldmVudHMgc2hhbGwgYmUgaWdub3JlZC4gKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzYWJsZSgpIHsKLQkJbGlzdGVuZXJFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JLyoqIFRlc3QgaWYgdGhlIGxpc3RlbmVyIGlzIGVuYWJsZWQuICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiV2lkZ2V0IGxpc3RlbmVyOiB3aWRnZXREZWZhdWx0U2VsZWN0ZWQgb24gezB9IiwgY2FsY3VsYXJlU291cmNlKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCX0gZWxzZSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLkRBVEFTT1VSQ0VfVFJBQ0lORywgIldpZGdldCBsaXN0ZW5lcjogaWdub3JlZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQgb24gezB9IiwgY2FsY3VsYXJlU291cmNlKGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBEZWZhdWx0IGVtcHR5IGltcGxlbWVudGF0aW9uLgotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLkRBVEFTT1VSQ0VfVFJBQ0lORywgIldpZGdldCBsaXN0ZW5lcjogd2lkZ2V0U2VsZWN0ZWQgb24gezB9IiwgY2FsY3VsYXJlU291cmNlKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJfSBlbHNlIHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiV2lkZ2V0IGxpc3RlbmVyOiBpZ25vcmVkIHdpZGdldFNlbGVjdGVkIG9uIHswfSIsIGNhbGN1bGFyZVNvdXJjZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBEZWZhdWx0IGVtcHR5IGltcGxlbWVudGF0aW9uLgotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiV2lkZ2V0IGxpc3RlbmVyOiBtb2RpZnlUZXh0IG9uIHswfSIsIGNhbGN1bGFyZVNvdXJjZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvTW9kaWZ5VGV4dChlKTsKLQkJfSBlbHNlIHsKLQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuREFUQVNPVVJDRV9UUkFDSU5HLCAiV2lkZ2V0IGxpc3RlbmVyOiBpZ25vcmVkIG1vZGlmeVRleHQgb24gezB9IiwgY2FsY3VsYXJlU291cmNlKGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9Nb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJLy8gRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbi4KLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXJlU291cmNlKFR5cGVkRXZlbnQgZSkgewotCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJcmV0dXJuIHNvdXJjZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvd2l6YXJkcy9BYnN0cmFjdENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvd2l6YXJkcy9BYnN0cmFjdENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjEyMjEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3dpemFyZHMvQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzCi1STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsKLQotCXByaXZhdGUgZmluYWwgV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlTGlzdGVuZXIoKTsKLQlwcml2YXRlIGZpbmFsIFdpemFyZFBhZ2VEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBjcmVhdGVEYXRhU291cmNlKCk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZShSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIod2l6YXJkLCBwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3RlbmVyIGZvciB0aGUgd2l6YXJkIHBhZ2UuIFRoZSBsaXN0ZW5lciBtdXN0IGV4dGVuZCB7QGxpbmsgV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyfSBhbmQgYWRkCi0JICogc3BlY2lmaWMgYmVoYXZpb3IgZm9yIHdpZGdldHMgb2YgdGhlIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCi0JICogQHJldHVybiB0aGUgbGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGF0YSBzb3VyY2UgdG8gaGFuZGxlIHBhZ2UgY29udGVudC4gVGhlIGxpc3RlbmVyIG11c3QgZXh0ZW5kIHtAbGluayBXaXphcmRQYWdlRGF0YVNvdXJjZX0gYW5kIGFkZAotCSAqIHNwZWNpZmljIGJlaGF2aW9yIGZvciB3aWRnZXRzIG9mIHRoZSB0aGUgcHJlZmVyZW5jZSBwYWdlLgotCSAqIEByZXR1cm4gdGhlIGxpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdpemFyZFBhZ2VEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKTsKLQotCXByb3RlY3RlZCBXaXphcmRQYWdlV2lkZ2V0TGlzdGVuZXIgZ2V0V2lkZ2V0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkUGFnZURhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIGRhdGFTb3VyY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXJlc2V0RXJyb3JNZXNzYWdlcygpOwotCQkJbGlzdGVuZXIuZGlzYWJsZSgpOwotCQkJZGF0YVNvdXJjZS5zZXRDb25maWcoZ2V0Q29uZmlndXJhdGlvbldpemFyZCgpLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlkYXRhU291cmNlLmxvYWRBbmRVcGRhdGUoKTsKLQkJCWxpc3RlbmVyLmVuYWJsZSgpOwotCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgYnV0dG9uIHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gdGhlIGJ1dHRvbiB3aWRnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCB0eXBlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgdHlwZSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgY2hlY2sgYnV0dG9uIHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcmV0dXJuIHRoZSBjaGVjayBidXR0b24gd2lkZ2V0Ci0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDaGVja0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGxhYmVsLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRFcnJvck1lc3NhZ2VzKCkgewotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbGlzdGVuZXIuZGlzYWJsZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZG9DcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQkvLwkJZG9DcmVhdGVDb250ZW50cyhjb21wb3NpdGUpOwotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCWxpc3RlbmVyLmVuYWJsZSgpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBDb21wb3NpdGUgZG9DcmVhdGVDb250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS93aXphcmRzL0Fic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS93aXphcmRzL0Fic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2MGQ2ZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvd2l6YXJkcy9BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuUFRQUmVtb3RlQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpLklSZW1vdGVVSVNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkuUFRQUmVtb3RlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLlRvb2xzUk1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qCi0gKiBUT0RPOiBtYWtlIHRoaXMgY2xhc3MgZXhwYW5zaWJsZSBmb3IgcHJlZmVyZW5jZSBwYWdlcyBmb3IgdG9vbHMuCi0gKiBPbmUgbWlnaHQgd2FudCB0byBleHRlbmQgdGhpcyBjbGFzcyBhbmQgYWRkIG1vcmUgZmllbGRzLgotICogLSBNYWtlIGxpc3RlbmVyIGV4dGVuc2libGUKLSAqIC0gTWFrZSBkYXRhIHNvdXJjZSBleHRlbnNpYmxlCi0gKiAtIE1ha2UgY3JlYXRlQ29udGVudHMgZXh0ZW5zaWJsZQotICovCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZSB7Ci0KLQkvLwlwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUmVtb3RlU2VydmljZXMgcmVtb3RlU2VydmljZXMgPSBudWxsOwotCXByaXZhdGUgSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBsYXVuY2hDbWRUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBkZWJ1Z0NtZFRleHQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IGRpc2NvdmVyQ21kVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgY29udGludW91c01vbml0b3JDbWRUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBwZXJpb2RpY01vbml0b3JDbWRUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3Bpbm5lciBwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgcmVtb3RlSW5zdGFsbFBhdGhUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWZhdWx0QnV0dG9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBpbnQgY2FwYWJpbGl0aWVzID0gQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uLk5PX0NBUF9TRVQ7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBXaXphcmRQYWdlV2lkZ2V0TGlzdGVuZXIgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Nb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGV2dC5nZXRTb3VyY2UoKTsKLQkJCWlmKHNvdXJjZSA9PSBsYXVuY2hDbWRUZXh0IHx8Ci0JCQkJCXNvdXJjZSA9PSBkZWJ1Z0NtZFRleHQgfHwKLQkJCQkJc291cmNlID09IGRpc2NvdmVyQ21kVGV4dCB8fAotCQkJCQlzb3VyY2UgPT0gcGVyaW9kaWNNb25pdG9yQ21kVGV4dCB8fAotCQkJCQlzb3VyY2UgPT0gY29udGludW91c01vbml0b3JDbWRUZXh0IHx8Ci0JCQkJCXNvdXJjZSA9PSBwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciB8fAotCQkJCQlzb3VyY2UgPT0gcmVtb3RlSW5zdGFsbFBhdGhUZXh0KSB7Ci0JCQkJcmVzZXRFcnJvck1lc3NhZ2VzKCk7Ci0JCQkJZ2V0RGF0YVNvdXJjZSgpLnN0b3JlQW5kVmFsaWRhdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IGJyb3dzZUJ1dHRvbikgewotCQkJCWhhbmRsZVBhdGhCcm93c2VCdXR0b25TZWxlY3RlZCgpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gZGVmYXVsdEJ1dHRvbikgIHsKLQkJCQlyZXNldEVycm9yTWVzc2FnZXMoKTsKLQkJCQlnZXREYXRhU291cmNlKCkuc3RvcmVBbmRWYWxpZGF0ZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydCBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCAgY2xhc3MgRGF0YVNvdXJjZSBleHRlbmRzIFdpemFyZFBhZ2VEYXRhU291cmNlIHsKLQkJcHJvdGVjdGVkIERhdGFTb3VyY2UoQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCXByaXZhdGUgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHVzZVRvb2xEZWZhdWx0cyA9IGZhbHNlOwotCQlwcml2YXRlIFN0cmluZyBsYXVuY2hDbWQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBkZWJ1Z0NtZCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGRpc2NvdmVyQ21kID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgcGVyaW9kaWNNb25pdG9yQ21kID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgcGVyaW9kaWNNb25pdG9yVGltZSA9IDA7Ci0JCXByaXZhdGUgU3RyaW5nIGNvbnRpbnVvdXNNb25pdG9yQ21kID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBudWxsOwotCi0JCXB1YmxpYyB2b2lkIHNldENvbW1hbmRGaWVsZHMoU3RyaW5nIGxhdW5jaENtZCwgU3RyaW5nIGRlYnVnQ21kLCBTdHJpbmcgZGlzY292ZXJDbWQsIFN0cmluZyBwZXJpb2RpY01vbml0b3JDbWQsIGludCBwZXJpb2RpY01vbml0b3JUaW1lLCBTdHJpbmcgY29udGludW91c01vbml0b3JDbWQsIFN0cmluZyByZW1vdGVJbnN0YWxsUGF0aCkgewotCQkJdGhpcy5sYXVuY2hDbWQgPSBsYXVuY2hDbWQ7Ci0JCQl0aGlzLmRlYnVnQ21kID0gZGVidWdDbWQ7Ci0JCQl0aGlzLmRpc2NvdmVyQ21kID0gZGlzY292ZXJDbWQ7Ci0JCQl0aGlzLnBlcmlvZGljTW9uaXRvckNtZCA9IHBlcmlvZGljTW9uaXRvckNtZDsKLQkJCXRoaXMucGVyaW9kaWNNb25pdG9yVGltZSA9IHBlcmlvZGljTW9uaXRvclRpbWU7Ci0JCQl0aGlzLmNvbnRpbnVvdXNNb25pdG9yQ21kID0gY29udGludW91c01vbml0b3JDbWQ7Ci0JCQl0aGlzLnJlbW90ZUluc3RhbGxQYXRoID0gcmVtb3RlSW5zdGFsbFBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0cyhib29sZWFuIHVzZVRvb2xEZWZhdWx0cykgewotCQkJdGhpcy51c2VUb29sRGVmYXVsdHMgPSB1c2VUb29sRGVmYXVsdHM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1VzZURlZmF1bHRzKCkgewotCQkJcmV0dXJuIHVzZVRvb2xEZWZhdWx0czsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoQ21kKCkgewotCQkJcmV0dXJuIGxhdW5jaENtZDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWdDbWQoKSB7Ci0JCQlyZXR1cm4gZGVidWdDbWQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERpc2NvdmVyQ21kKCkgewotCQkJcmV0dXJuIGRpc2NvdmVyQ21kOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQZXJpb2RpY01vbml0b3JDbWQoKSB7Ci0JCQlyZXR1cm4gcGVyaW9kaWNNb25pdG9yQ21kOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRQZXJpb2RpY01vbml0b3JUaW1lKCkgewotCQkJcmV0dXJuIHBlcmlvZGljTW9uaXRvclRpbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRpbnVvdXNNb25pdG9yQ21kKCkgewotCQkJcmV0dXJuIGNvbnRpbnVvdXNNb25pdG9yQ21kOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRSZW1vdGVJbnN0YWxsUGF0aCgpIHsKLQkJCXJldHVybiByZW1vdGVJbnN0YWxsUGF0aDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCXVzZVRvb2xEZWZhdWx0cyA9IGRlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChsYXVuY2hDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlsYXVuY2hDbWQgPSBleHRyYWN0VGV4dChsYXVuY2hDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChkZWJ1Z0NtZFRleHQgIT0gbnVsbCkgewotCQkJCWRlYnVnQ21kID0gZXh0cmFjdFRleHQoZGVidWdDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChkaXNjb3ZlckNtZFRleHQgIT0gbnVsbCkgewotCQkJCWRpc2NvdmVyQ21kID0gZXh0cmFjdFRleHQoZGlzY292ZXJDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlwZXJpb2RpY01vbml0b3JDbWQgPSBleHRyYWN0VGV4dChwZXJpb2RpY01vbml0b3JDbWRUZXh0KTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciAhPSBudWxsKSB7Ci0JCQkJcGVyaW9kaWNNb25pdG9yVGltZSA9IHBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQkJaWYgKGNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGludW91c01vbml0b3JDbWQgPSBleHRyYWN0VGV4dChjb250aW51b3VzTW9uaXRvckNtZFRleHQpOwotCQkJfQotCQkJaWYgKHJlbW90ZUluc3RhbGxQYXRoVGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVtb3RlSW5zdGFsbFBhdGggPSBleHRyYWN0VGV4dChyZW1vdGVJbnN0YWxsUGF0aFRleHQpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlpZiAoISB1c2VUb29sRGVmYXVsdHMpIHsKLQkJCQlpZiAobGF1bmNoQ21kVGV4dCAhPSBudWxsICYmIGxhdW5jaENtZCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nTGF1bmNoQ29tbWFuZCk7Ci0JCQkJfQotCQkJCWlmIChkZWJ1Z0NtZFRleHQgIT0gbnVsbCAmJiBkZWJ1Z0NtZCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9NaXNzaW5nRGVidWdDb21tYW5kKTsKLQkJCQl9Ci0JCQkJaWYgKGRpc2NvdmVyQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmIChkaXNjb3ZlckNtZCA9PSBudWxsKSB7Ci0JCQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZhbGlkYXRpb25fTWlzc2luZ0Rpc2NvdmVyQ29tbWFuZCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyICE9IG51bGwgJiYgcGVyaW9kaWNNb25pdG9yVGltZSA8IDEpIHsKLQkJCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9JbnZhbGlkUGVyaW9kaWNNb25pdG9yQ29tbWFuZFRpbWVSYW5nZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weVRvU3RvcmFnZSgpIHsKLQkJCWlmIChsYXVuY2hDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQljb25maWcuc2V0TGF1bmNoQ21kKGxhdW5jaENtZCk7Ci0JCQl9Ci0JCQlpZiAoZGVidWdDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQljb25maWcuc2V0RGVidWdDbWQoZGVidWdDbWQpOwotCQkJfQotCQkJaWYgKGRpc2NvdmVyQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldERpc2NvdmVyQ21kKGRpc2NvdmVyQ21kKTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQljb25maWcuc2V0UGVyaW9kaWNNb25pdG9yQ21kKHBlcmlvZGljTW9uaXRvckNtZCk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yVGltZVNwaW5uZXIgIT0gbnVsbCkgewotCQkJCWNvbmZpZy5zZXRQZXJpb2RpY01vbml0b3JUaW1lKHBlcmlvZGljTW9uaXRvclRpbWUpOwotCQkJfQotCQkJaWYgKGNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldENvbnRpbnVvdXNNb25pdG9yQ21kKGNvbnRpbnVvdXNNb25pdG9yQ21kKTsKLQkJCX0KLQkJCWlmIChyZW1vdGVJbnN0YWxsUGF0aFRleHQgIT0gbnVsbCkgewotCQkJCWNvbmZpZy5zZXRSZW1vdGVJbnN0YWxsUGF0aChyZW1vdGVJbnN0YWxsUGF0aCk7Ci0JCQl9Ci0JCQljb25maWcuc2V0VXNlVG9vbERlZmF1bHRzKHVzZVRvb2xEZWZhdWx0cyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21TdG9yYWdlKCkgewotCQkJaWYgKGxhdW5jaENtZFRleHQgIT0gbnVsbCkgewotCQkJCWxhdW5jaENtZCA9IGNvbmZpZy5nZXRMYXVuY2hDbWQoKTsKLQkJCX0KLQkJCWlmIChkZWJ1Z0NtZFRleHQgIT0gbnVsbCkgewotCQkJCWRlYnVnQ21kID0gY29uZmlnLmdldERlYnVnQ21kKCk7Ci0JCQl9Ci0JCQlpZiAoZGlzY292ZXJDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlkaXNjb3ZlckNtZCA9IGNvbmZpZy5nZXREaXNjb3ZlckNtZCgpOwotCQkJfQotCQkJaWYgKHBlcmlvZGljTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJCXBlcmlvZGljTW9uaXRvckNtZCA9IGNvbmZpZy5nZXRQZXJpb2RpY01vbml0b3JDbWQoKTsKLQkJCX0KLQkJCWlmIChwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciAhPSBudWxsKSB7Ci0JCQkJcGVyaW9kaWNNb25pdG9yVGltZSA9IGNvbmZpZy5nZXRQZXJpb2RpY01vbml0b3JUaW1lKCk7Ci0JCQl9Ci0JCQlpZiAoY29udGludW91c01vbml0b3JDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQljb250aW51b3VzTW9uaXRvckNtZCA9IGNvbmZpZy5nZXRDb250aW51b3VzTW9uaXRvckNtZCgpOwotCQkJfQotCQkJaWYgKHJlbW90ZUluc3RhbGxQYXRoVGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVtb3RlSW5zdGFsbFBhdGggPSBjb25maWcuZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKTsKLQkJCX0KLQkJCXVzZVRvb2xEZWZhdWx0cyA9IGNvbmZpZy51c2VUb29sRGVmYXVsdHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9GaWVsZHMoKSB7Ci0JCQlpZiAobGF1bmNoQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJYXBwbHlUZXh0KGxhdW5jaENtZFRleHQsIGxhdW5jaENtZCk7Ci0JCQl9Ci0JCQlpZiAoZGVidWdDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlhcHBseVRleHQoZGVidWdDbWRUZXh0LCBkZWJ1Z0NtZCk7Ci0JCQl9Ci0JCQlpZiAoZGlzY292ZXJDbWRUZXh0ICE9IG51bGwpIHsKLQkJCQlhcHBseVRleHQoZGlzY292ZXJDbWRUZXh0LCBkaXNjb3ZlckNtZCk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yQ21kVGV4dCAhPSBudWxsKSB7Ci0JCQkJYXBwbHlUZXh0KHBlcmlvZGljTW9uaXRvckNtZFRleHQsIHBlcmlvZGljTW9uaXRvckNtZCk7Ci0JCQl9Ci0JCQlpZiAocGVyaW9kaWNNb25pdG9yVGltZVNwaW5uZXIgIT0gbnVsbCkgewotCQkJCXBlcmlvZGljTW9uaXRvclRpbWVTcGlubmVyLnNldFNlbGVjdGlvbihwZXJpb2RpY01vbml0b3JUaW1lKTsKLQkJCX0KLQkJCWlmIChjb250aW51b3VzTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJCWFwcGx5VGV4dChjb250aW51b3VzTW9uaXRvckNtZFRleHQsIGNvbnRpbnVvdXNNb25pdG9yQ21kKTsKLQkJCX0KLQkJCWlmIChyZW1vdGVJbnN0YWxsUGF0aFRleHQgIT0gbnVsbCkgewotCQkJCWFwcGx5VGV4dChyZW1vdGVJbnN0YWxsUGF0aFRleHQsIHJlbW90ZUluc3RhbGxQYXRoKTsKLQkJCX0KLQkJCWRlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVRvb2xEZWZhdWx0cyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVHbG9iYWwoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkvLyBOb3RoaW5nIHlldC4gV291bGQgdmFsaWRhdGUgdGhlIGVudGlyZSBHZW5lcmljTVBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi4KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRDb25maWcoSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkJc3VwZXIuc2V0Q29uZmlnKGNvbmZpZ3VyYXRpb24pOwotCQkJLy8gU3RvcmUgYSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCXRoaXMuY29uZmlnID0gKEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVmYXVsdCgpIHsKLQkJCS8vIG5vdCBhdmFpbGFibGUKLQkJfQotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKFJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQsIGludCBjYXBhYmlsaXRpZXMsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIod2l6YXJkLCBwYWdlTmFtZSk7Ci0JCXRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOwotCQlzZXRUaXRsZSh0aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldExpc3RlbmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdpemFyZFBhZ2VEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBuZXcgRGF0YVNvdXJjZSh0aGlzKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9DcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRlbnRzLnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZUNvbnRlbnRzKGNvbnRlbnRzKTsKLQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGVudHMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gNDsKLQkJY29udGVudHMuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29udGVudHMuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLyoKLQkJICogRGVmYXVsdCBidXR0b24KLQkJICovCi0JCWRlZmF1bHRCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihjb250ZW50cywgTWVzc2FnZXMuQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9Vc2VEZWZhdWx0U2V0dGluZ3MpOwotCQlkZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFdpZGdldExpc3RlbmVyKCkpOwotCQlkZWZhdWx0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgdHJ1ZSwgZmFsc2UsIDQsIDEpKTsKLQotCQkvKgotCQkgKiBsYXVuY2ggY21kCi0JCSAqLwotCQlpZiAoKGNhcGFiaWxpdGllcyAmIEFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbi5DQVBfTEFVTkNIKSAhPSAwKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0xhdW5jaENvbW1hbmQpOwotCi0JCQlsYXVuY2hDbWRUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWxhdW5jaENtZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCB0cnVlLCBmYWxzZSwgMywgMSkpOwotCQkJbGF1bmNoQ21kVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRXaWRnZXRMaXN0ZW5lcigpKTsKLQotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9EZWJ1Z0NvbW1hbmQpOwotCi0JCQlkZWJ1Z0NtZFRleHQgPSBuZXcgVGV4dChjb250ZW50cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJZGVidWdDbWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgdHJ1ZSwgZmFsc2UsIDMsIDEpKTsKLQkJCWRlYnVnQ21kVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRXaWRnZXRMaXN0ZW5lcigpKTsKLQkJfQotCi0JCS8qCi0JCSAqIGRpc2NvdmVyIGNtZAotCQkgKi8KLQkJaWYgKChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX0RJU0NPVkVSKSAhPSAwKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX0Rpc2NvdmVyQ29tbWFuZCk7Ci0KLQkJCWRpc2NvdmVyQ21kVGV4dCA9IG5ldyBUZXh0KGNvbnRlbnRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlkaXNjb3ZlckNtZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCB0cnVlLCBmYWxzZSwgMywgMSkpOwotCQkJZGlzY292ZXJDbWRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldFdpZGdldExpc3RlbmVyKCkpOwotCQl9Ci0KLQkJLyoKLQkJICogUGVyaW9kaWMgbW9uaXRvciBjbWQgYW5kIHRpbWUKLQkJICovCi0JCWlmICgoY2FwYWJpbGl0aWVzICYgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uLkNBUF9QRVJJT0RJQ19NT05JVE9SKSAhPSAwKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1BlcmlvZGljTW9uaXRvckNvbW1hbmQpOwotCi0JCQlwZXJpb2RpY01vbml0b3JDbWRUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXBlcmlvZGljTW9uaXRvckNtZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCQlwZXJpb2RpY01vbml0b3JDbWRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldFdpZGdldExpc3RlbmVyKCkpOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1BlcmlvZGljTW9uaXRvckNvbW1hbmRQZXJpb2QpOwotCi0JCQlwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbnRlbnRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlwZXJpb2RpY01vbml0b3JDbWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lci5hZGRNb2RpZnlMaXN0ZW5lcihnZXRXaWRnZXRMaXN0ZW5lcigpKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbnRpbnVvdXMgbW9uaXRvciBjbWQKLQkJICovCi0JCWlmICgoY2FwYWJpbGl0aWVzICYgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uLkNBUF9DT05USU5VT1VTX01PTklUT1IpICE9IDApIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfQ29udGludW91c01pbml0b3JDb21tYW5kKTsKLQotCQkJY29udGludW91c01vbml0b3JDbWRUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWNvbnRpbnVvdXNNb25pdG9yQ21kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlLCAzLCAxKSk7Ci0JCQljb250aW51b3VzTW9uaXRvckNtZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0V2lkZ2V0TGlzdGVuZXIoKSk7Ci0JCX0KLQotCQkvKgotCQkgKiBJbnN0YWxsYXRpb24gcGF0aAotCQkgKi8KLQkJaWYgKChjYXBhYmlsaXRpZXMgJiBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24uQ0FQX1JFTU9URV9JTlNUQUxMX1BBVEgpICE9IDApIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTGFiZWxfUGF0aEluc3RhbGxhdGlvbik7Ci0KLQkJCXJlbW90ZUluc3RhbGxQYXRoVGV4dCA9IG5ldyBUZXh0KGNvbnRlbnRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlyZW1vdGVJbnN0YWxsUGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0V2lkZ2V0TGlzdGVuZXIoKSk7Ci0JCQlyZW1vdGVJbnN0YWxsUGF0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlUHVzaEJ1dHRvbihjb250ZW50cywgIkJyb3dzZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0V2lkZ2V0TGlzdGVuZXIoKSk7Ci0JCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdyBhIGRpYWxvZyB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IGEgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXRoQnJvd3NlQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCS8qCi0JCSAqIE5lZWQgdG8gZG8gdGhpcyBoZXJlIGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gbWF5IGhhdmUgYmVlbiBjaGFuZ2VkCi0JCSAqIGJ5IHRoZSBwcmV2aW91cyB3aXphcmQgcGFnZQotCQkgKi8KLQotCQlJUmVtb3RlVUlTZXJ2aWNlcyByZW1VSVNlcnZpY2VzID0gbnVsbDsKLQkJQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IChBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pZ2V0RGF0YVNvdXJjZSgpLmdldENvbmZpZygpOwotCQlTdHJpbmcgcm1JRCA9IGNvbmZpZy5nZXRSZW1vdGVTZXJ2aWNlc0lkKCk7Ci0JCWlmIChybUlEICE9IG51bGwpIHsKLQkJCXJlbW90ZVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMocm1JRCk7Ci0JCQlTdHJpbmcgY29ubiA9IGNvbmZpZy5nZXRDb25uZWN0aW9uTmFtZSgpOwotCQkJaWYgKHJlbW90ZVNlcnZpY2VzICE9IG51bGwgJiYgY29ubiAhPSBudWxsKSB7Ci0JCQkJY29ubmVjdGlvbiA9IHJlbW90ZVNlcnZpY2VzLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0Q29ubmVjdGlvbihjb25uKTsKLQkJCX0KLQkJCXJlbVVJU2VydmljZXMgPSBQVFBSZW1vdGVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlVUlTZXJ2aWNlcyhyZW1vdGVTZXJ2aWNlcyk7Ci0JCX0KLQotCQlpZiAocmVtVUlTZXJ2aWNlcyAhPSBudWxsICYmIGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJaWYgKCFjb25uZWN0aW9uLmlzT3BlbigpKSB7Ci0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29ubmVjdGlvbi5vcGVuKG1vbml0b3IpOwotCQkJCQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRXhjZXB0aW9uX0Nvbm5lY3Rpb25FcnJvciwKLQkJCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRXhjZXB0aW9uX0Nvbm5lY3Rpb25FcnJvckRlc2NyaXB0aW9uLAotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb29sc1JNVUlQbHVnaW4uUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIG9wKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRXhjZXB0aW9uX0Nvbm5lY3Rpb25FcnJvciwKLQkJCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0V4Y2VwdGlvbl9Db25uZWN0aW9uRXJyb3JEZXNjcmlwdGlvbiwKLQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1VSVBsdWdpbi5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9FeGNlcHRpb25fQ29ubmVjdGlvbkVycm9yLAotCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfRXhjZXB0aW9uX0Nvbm5lY3Rpb25FcnJvckRlc2NyaXB0aW9uLAotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVVJUGx1Z2luLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJUmVtb3RlVUlGaWxlTWFuYWdlciBmaWxlTWdyID0gcmVtVUlTZXJ2aWNlcy5nZXRVSUZpbGVNYW5hZ2VyKCk7Ci0JCQlmaWxlTWdyLnNldENvbm5lY3Rpb24oY29ubmVjdGlvbik7Ci0KLQkJCVN0cmluZyBpbml0aWFsUGF0aCA9ICIvLyI7IC8vIFN0YXJ0IGF0IHJvb3Qgc2luY2UgT01QSSBpcyBwcm9iYWJseSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBzb21ld2hlcmUgLy8kTk9OLU5MUy0xJAotCQkJSVBhdGggc2VsZWN0ZWRQYXRoID0gZmlsZU1nci5icm93c2VEaXJlY3RvcnkoZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGVfUGF0aFNlbGVjdGlvbkRpYWxvZywgaW5pdGlhbFBhdGgpOwotCQkJaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJcmVtb3RlSW5zdGFsbFBhdGhUZXh0LnNldFRleHQoc2VsZWN0ZWRQYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHdpemFyZCBVSSBzZWxlY3Rpb25zIGZyb20gc2V0dGluZ3MuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkKLQkgKiBzZXR0aW5ncyBhcmUgY2hhbmdlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gISBkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChsYXVuY2hDbWRUZXh0ICE9IG51bGwpIHsKLQkJCWxhdW5jaENtZFRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCQlpZiAoZGVidWdDbWRUZXh0ICE9IG51bGwpIHsKLQkJCWRlYnVnQ21kVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JCWlmIChkaXNjb3ZlckNtZFRleHQgIT0gbnVsbCkgewotCQkJZGlzY292ZXJDbWRUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQkJaWYgKHBlcmlvZGljTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJcGVyaW9kaWNNb25pdG9yQ21kVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JCWlmIChwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lciAhPSBudWxsKSB7Ci0JCQlwZXJpb2RpY01vbml0b3JUaW1lU3Bpbm5lci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JCWlmIChjb250aW51b3VzTW9uaXRvckNtZFRleHQgIT0gbnVsbCkgewotCQkJY29udGludW91c01vbml0b3JDbWRUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQkJLy8JCWlmIChyZW1vdGVJbnN0YWxsUGF0aFRleHQgIT0gbnVsbCkgewotCQkvLwkJCXJlbW90ZUluc3RhbGxQYXRoVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLwkJfQotCQkvLwkJaWYgKGJyb3dzZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCS8vCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3dpemFyZHMvV2l6YXJkUGFnZURhdGFTb3VyY2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS91aS93aXphcmRzL1dpemFyZFBhZ2VEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2FlNTYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3dpemFyZHMvV2l6YXJkUGFnZURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS51dGlscy5EYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpemFyZFBhZ2VEYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZSB7Ci0JcHJpdmF0ZSBBYnN0cmFjdENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHBhZ2U7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkUGFnZURhdGFTb3VyY2UoQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQlwYWdlLnNldEVycm9yTWVzc2FnZShlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCXBhZ2Uuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXBhZ2UudXBkYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZyhJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3VpL3dpemFyZHMvV2l6YXJkUGFnZVdpZGdldExpc3RlbmVyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvd2l6YXJkcy9XaXphcmRQYWdlV2lkZ2V0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1ODJhYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vdWkvd2l6YXJkcy9XaXphcmRQYWdlV2lkZ2V0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS51dGlscy5XaWRnZXRMaXN0ZW5lcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpemFyZFBhZ2VXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFdpZGdldExpc3RlbmVyICB7Ci0JLy8gTm90aGluZyB0byBhZGQgb3IgdG8gZXh0ZW5kLgotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTU1OTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0ib3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2FjdGlvbnMvVHJ5Sm9iLmphdmEiIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGE3NzJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotQGRvdAotaWNvbnMtb2xkCi0ub3B0aW9uc0hJREUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLy5wcm9qZWN0IGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWJlMWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlZjU0Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkNvbW1vblBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5zZWFyY2gsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYW5hbHlzaXMsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnZpZXdzCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2Fib3V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2Fib3V0LmluaSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2Fib3V0Lm1hcHBpbmdzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vYWJvdXQucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzkwOTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wdHBcbgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMWU1YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vZWNsaXBzZTMyLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2ljb25zLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9pY29ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODlkYWEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2ljb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWFuYWx5emVfYmx1ZS5naWYKLWFydGlmYWN0X2EuZ2lmCi1hcnRpZmFjdF9zbS5naWYKLXBzcGJyd3NlLmpiZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vaWNvbnMvYW5hbHl6ZS5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9pY29ucy9hbmFseXplLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0NTQyYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9pY29ucy9hbmFseXplLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2ljb25zL2ZpbHRlcl9wcy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9pY29ucy9maWx0ZXJfcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmU2ZjBlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2ljb25zL2ZpbHRlcl9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY2YzE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scyBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2E4ZTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5wcmVmcy5QTERUUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnByZWZzLlBMRFRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IlBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5wdHBQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgICAgICAvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnByZWZzLlByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFuYWx5c2lzRHJvcGRvd25DYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IkFuYWx5c2lzIERyb3Bkb3duIENhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5kcm9wRG93bkNvbW1hbmQiCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYW5hbHlzaXNEcm9wZG93bkNhdGVnb3J5IgotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hY3Rpb25zLkFuYWx5c2lzRHJvcGRvd25IYW5kbGVyIgotICAgICAgICAgICAgbmFtZT0iQW5hbHlzaXMgZHJvcGRvd24gbWVudSI+Ci0gICAgICAgICA8Y29tbWFuZFBhcmFtZXRlcgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5kcm9wRG93bkNvbW1hbmQubXNnIgotICAgICAgICAgICAgICAgbmFtZT0iTWVzc2FnZSIKLSAgICAgICAgICAgICAgIG9wdGlvbmFsPSJ0cnVlIgotICAgICAgICAgICAgICAgdHlwZUlkPSJTdHJpbmciPgotICAgICAgICAgPC9jb21tYW5kUGFyYW1ldGVyPgotICAgICAgICAgPGRlZmF1bHRIYW5kbGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnMuQW5hbHlzaXNEcm9wZG93bkhhbmRsZXIiPgotICAgICAgICAgPC9kZWZhdWx0SGFuZGxlcj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRJbWFnZXMiPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5kcm9wRG93bkNvbW1hbmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmFseXplLmdpZiI+Ci0gICAgICA8L2ltYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJ0b29sYmFyOm9yZy5lY2xpcHNlLnVpLm1haW4udG9vbGJhcj9hZnRlcj1hZGRpdGlvbnMiPgotICAgICAgICAgPHRvb2xiYXIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhcjEiPgotICAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmRyb3BEb3duQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhci5jb21tYW5kMSIKLSAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IlJlcGVhdCBsYXN0IFBhcmFsbGVsIEFuYWx5c2lzICI+Ci0gICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICA8L3Rvb2xiYXI+Ci0gICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSB0aGVzZSBnbyB1bmRlciB0aGUgZHJvcGRvd24gbWVudTsgY291bGQgY29tZSBmcm9tIGFub3RoZXIgcGx1Z2luIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi50b29sYmFyLmNvbW1hbmQxP2FmdGVyPWFkZGl0aW9ucyI+Ci0gICAgICAgIAotICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0ic2VwYXJhdG9yMS5tcGkiLz4KLSAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNlcGFyYXRvcjIub3Blbm1wIi8+Ci0gICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJzZXBhcmF0b3IzLm90aGVyQXJ0aWZhY3QiLz4KLSAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNlcGFyYXRvcjQuYmFycmllciIvPgotICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0ic2VwYXJhdG9yNS5vdGhlciIgdmlzaWJsZT0iZmFsc2UiLz4KLSAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgbmFtZT0iYWRkaXRpb25zIj4KLSAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgCi0gICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vQXJ0aWZhY3QuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0MDEzZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuU291cmNlSW5mbzsKLQotCi0KLS8qKgotICogQXJ0aWZhY3RzIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmcmFtZXdvcmsgKGUuZy4gTVBJKSBmdW5jdGlvbiBjYWxsIG9yIGNvbnN0YW50IHJlZmVyZW5jZSBmb3VuZCBpbiBzb3VyY2UgY29kZS4KLSAqIAotICogTm90ZTogaWYgd2UgaGF2ZSBhbnkgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcHMsIHRoaXMgY2xhc3Mgc2hvdWxkIGtub3cgYWJvdXQgaXQuCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdCBpbXBsZW1lbnRzIElBcnRpZmFjdAotewotICAgIC8qKiBMaW5lIG51bWJlciB3aGVyZSB0aGUgYXJ0aWZhY3Qgb2NjdXJzICovCi0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICBsaW5lXzsKLSAgICAvKiogQ29sdW1uIG51bWJlciB3aGVyZSB0aGUgYXJ0aWZhY3Qgb2NjdXJzICh1bnVzZWQpICovCi0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICBjb2x1bW5fOwotICAgIC8qKiBpbiB3aGljaCBmaWxlIGlzIHRoZSBsaW5lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBmaWxlTmFtZV87Ci0gICAgLyoqIExvbmdlciBkZXNjcmlwdGlvbiBvZiBNUEkgYXJ0aWZhY3QgKi8KLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uXzsKLSAgICAvKiogU2hvcnQgaGVhZGluZyBuYW1lIG9mIE1QSSBhcnRpZmFjdCAqLwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgc2hvcnROYW1lXzsKLSAgICAKLSAgICAvKiogdG8gaGVscCwgdGhpcyB3b3VsZCBsaWtlbHkgYmUgYW4gQVNUIG5vZGUgICAqLwotICAgIHByaXZhdGUgT2JqZWN0ICAgICAgICAgICAgICAgYXJ0aWZhY3RBc3Npc3RfOwotICAgIAotICAgIC8qKgotICAgICAqIFdoaWNoIGZpbGUtYW5hbHlzaXMtaW52b2NhdGlvbiBnYXZlIHJpc2UgdG8gdGhpcyBhcnRpZmFjdC48YnI+Ci0gICAgICogKEFuYWx5emluZyBvbmUgZmlsZSBtYXkgcHJvZHVjZSBhcnRpZmFjdHMgaW4gYW5vdGhlciBmaWxlLiBUaGlzIGlzIHRoZSBmaXJzdCBvbmUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBwcmltYXJ5ZmlsZU5hbWVfOwotICAgIC8qKiBOZXcgbGluZSBudW1iZXIgaWYgY2hhbmdlcyBhcmUgbWFkZSB0byBzb3VyY2UgKHVudXNlZCkgKi8KLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgIG5ld2xpbmVfOwotICAgIC8qKiB1bmlxdWUgSUQgb2YgYXJ0aWZhY3QsIHVzaW5nIGZvciBsb29rdXBzIGJ5IEFydGlmYWN0TWFuYWdlciovCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICB1bmlxdWVJRF87Ci0gICAgLyoqIHRpbWVzdGFtcCB1c2VkIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBpZHMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nICAgICAgICAgIG5vd18gICAgICAgICAgICAgICAgID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgLyoqIE9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgc291cmNlIGluZm9ybWF0aW9uICovCi0gICAgcHJpdmF0ZSBTb3VyY2VJbmZvICAgICAgICAgICBzb3VyY2VJbmZvXzsKLSAgICAvKiogQ29uc3RhbnQgdXNlZCBpbiBtYXJrZXIgdG8gaW5kaWNhdGUgdHlwZSBvZiBhcnRpZmFjdCBpcyB1bnNwZWNpZmllZCovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgICAgICBOT05FICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgLyoqIENvbnN0YW50IHVzZWQgaW4gbWFya2VyIHRvIGluZGljYXRlIHR5cGUgb2YgYXJ0aWZhY3QgaXMgYSBmdW5jdGlvbiBjYWxsKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAgICAgIEZVTkNUSU9OX0NBTEwgICAgICAgID0gMTsKLSAgICAvKiogQ29uc3RhbnQgdXNlZCBpbiBtYXJrZXIgdG8gaW5kaWNhdGUgdHlwZSBvZiBhcnRpZmFjdCBpcyBhIGNvbnN0YW50Ki8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAgICAgIENPTlNUQU5UICAgICAgICAgICAgID0gMjsKLSAgICAvKiogQ29uc3RhbnQgdXNlZCBpbiBtYXJrZXIgdG8gaW5kaWNhdGUgdHlwZSBvZiBhcnRpZmFjdCBpcyBhIHByYWdtYSovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgICAgICBQUkFHTUEgICAgICAgICAgICAgPSAzOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05TVFJVQ1RfVFlQRV9OQU1FUyA9IHsgIk5vbmUiLCAiRnVuY3Rpb24gQ2FsbCIsICJDb25zdGFudCIsIlByYWdtYSIgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBBcnRpZmFjdCB0byBrZWVwIHRyYWNrIG9mIGFuIHNvbWV0aGluZyBmb3VuZCBpbiBhIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHBhcmFtIGxpbmUKLSAgICAgKiBAcGFyYW0gY29sdW1uCi0gICAgICogQHBhcmFtIHNob3J0TmFtZQotICAgICAqIEBwYXJhbSBkZXNjCi0gICAgICogQHBhcmFtIGlnbm9yZQotICAgICAqIEBwYXJhbSBwcmltYXJ5RmlsZU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJ0aWZhY3QoU3RyaW5nIGZpbGVOYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHNob3J0TmFtZSwgU3RyaW5nIGRlc2MsIFNvdXJjZUluZm8gc291cmNlSW5mbykKLSAgICB7Ci0gICAgICAgIHRoaXMubGluZV8gPSBsaW5lOwotICAgICAgICB0aGlzLm5ld2xpbmVfID0gbGluZTsKLSAgICAgICAgdGhpcy5jb2x1bW5fID0gY29sdW1uOwotICAgICAgICB0aGlzLmZpbGVOYW1lXyA9IGZpbGVOYW1lOwotICAgICAgICB0aGlzLnNob3J0TmFtZV8gPSBzaG9ydE5hbWU7Ci0gICAgICAgIHRoaXMuc291cmNlSW5mb18gPSBzb3VyY2VJbmZvOwotICAgICAgICBzZXRJZCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gTVBJIEFydGlmYWN0IHRvIGtlZXAgdHJhY2sgb2YgYW4gTVBJIGZ1bmN0aW9uIGNhbGwgKG9yID8/PykgaW4gYSBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqIEBwYXJhbSBsaW5lCi0gICAgICogQHBhcmFtIGNvbHVtbgotICAgICAqIEBwYXJhbSBzaG9ydE5hbWUKLSAgICAgKiBAcGFyYW0gZGVzYwotICAgICAqIEBwYXJhbSBzb3VyY2VJbmZvCi0gICAgICogQHBhcmFtIGFydGlmYWN0QXNzaXN0Ci0gICAgICovCi0gICAgcHVibGljIEFydGlmYWN0KFN0cmluZyBmaWxlTmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyBzaG9ydE5hbWUsIFN0cmluZyBkZXNjLCBTb3VyY2VJbmZvIHNvdXJjZUluZm8sCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcnRpZmFjdEFzc2lzdCkKLSAgICB7Ci0gICAgICAgIHRoaXMubGluZV8gPSBsaW5lOwotICAgICAgICB0aGlzLm5ld2xpbmVfID0gbGluZTsKLSAgICAgICAgdGhpcy5jb2x1bW5fID0gY29sdW1uOwotICAgICAgICB0aGlzLmZpbGVOYW1lXyA9IGZpbGVOYW1lOwotICAgICAgICB0aGlzLnNob3J0TmFtZV8gPSBzaG9ydE5hbWU7Ci0gICAgICAgIHRoaXMuc291cmNlSW5mb18gPSBzb3VyY2VJbmZvOwotICAgICAgICB0aGlzLmFydGlmYWN0QXNzaXN0XyA9IGFydGlmYWN0QXNzaXN0OwotICAgICAgICBzZXRJZCgpOwotICAgIH0KLSAgICAKLQotICAgIHB1YmxpYyBBcnRpZmFjdChTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgc2hvcnROYW1lLCBTdHJpbmcgZGVzYywgYm9vbGVhbiBpZ25vcmUsCi0gICAgICAgICAgICBTdHJpbmcgcHJpbWFyeUZpbGVOYW1lLCBTb3VyY2VJbmZvIHNvdXJjZUluZm8pCi0gICAgewotICAgICAgICB0aGlzKGZpbGVOYW1lLCBsaW5lLCBjb2x1bW4sIHNob3J0TmFtZSwgZGVzYywgc291cmNlSW5mbyk7Ci0gICAgICAgIHRoaXMucHJpbWFyeWZpbGVOYW1lXyA9IHByaW1hcnlGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvLyBIb3cgdG8gY3JlYXRlIGFuIEVjbGlwc2UgSUZpbGUgb2JqZWN0IGZyb20gaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi0gICAgLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotICAgIC8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLSAgICAvLyBpbXBvcnQgY29tLmlibS5uZ3AuY29yZS5OR1BQbHVnaW47Ci0gICAgLy8gaW1wb3J0IGNvbS5pYm0ubmdwLmNvcmUuY29tbW9uLkxvZzsKLSAgICAvKgotICAgICAqIElGaWxlIGYgPSBOR1BQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlbmFtZSkpOyBpZiAoZiAhPSBudWxsICYmIGYuZXhpc3RzKCkpIHsgLy8KLSAgICAgKiBhZnRlciBjaGVja2luZyB0aGF0IGEgZmlsZSB3aXRoIHRoaXMgbmFtZSBhY3R1YWxseSBleGlzdHMsIC8vIGhlcmUncyBob3cgdG8gZ2V0IHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBiYWNrCi0gICAgICogZnJvbSB0aGUgSUZpbGUgb2JqZWN0OiBMb2cucHJpbnRpdCgiUEkgY3RvciBmaWxlIGlzOiAiK2YuZ2V0UmF3TG9jYXRpb24oKSk7IH0KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFNldCB1bmlxdWUgSUQgZm9yIHRoaXMgTVBJIGFydGlmYWN0LiBCYXNlIDM2IHZhbHVlcyB1c2UgMC4uOWEuLi56IGFuZCBhcmUgYXQgbW9zdCA4IGNoYXJhY3RlcnMgbG9uZy4gV2lsbCBub3QgYmUKLSAgICAgKiByZXBlYXRlZCAodQotICAgICAqIAotICAgICAqIEByZXR1cm4gc3RyaW5nIG9mIHVuaXF1ZSBJRC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJZCgpCi0gICAgewotICAgICAgICB1bmlxdWVJRF8gPSBMb25nLnRvU3RyaW5nKG5vd18rKywgMzYpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVuaXF1ZUlEXzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kIHJlcHJlc2VudGF0aW9uIG9mIGRhdGEsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQXJ0aWZhY3Q6ICIpOwotICAgICAgICBidWYuYXBwZW5kKCIgaWQ9IikuYXBwZW5kKHVuaXF1ZUlEXyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiAiKS5hcHBlbmQoc2hvcnROYW1lXyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiBsaW5lPSIpLmFwcGVuZChsaW5lXykuYXBwZW5kKCIgZmlsZW5hbWU9IikuYXBwZW5kKGZpbGVOYW1lXyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiBkZXNjPSIpLmFwcGVuZChkZXNjcmlwdGlvbl8pOwotICAgICAgICBidWYuYXBwZW5kKCIgc3RhcnQ9IikuYXBwZW5kKGdldFNvdXJjZUluZm8oKS5nZXRTdGFydCgpKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIGVuZD0iKS5hcHBlbmQoZ2V0U291cmNlSW5mbygpLmdldEVuZCgpKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5fOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbihpbnQgY29sdW1uXykKLSAgICB7Ci0gICAgICAgIHRoaXMuY29sdW1uXyA9IGNvbHVtbl87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb25fOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbl8pCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlTmFtZV87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lXykKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWVfID0gZmlsZU5hbWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGluZV87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZV8pCi0gICAgewotICAgICAgICB0aGlzLmxpbmVfID0gbGluZV87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5ZmlsZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByaW1hcnlmaWxlTmFtZV87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeWZpbGVOYW1lKFN0cmluZyBwcmltYXJ5ZmlsZU5hbWVfKQotICAgIHsKLSAgICAgICAgdGhpcy5wcmltYXJ5ZmlsZU5hbWVfID0gcHJpbWFyeWZpbGVOYW1lXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2hvcnROYW1lXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydE5hbWUoU3RyaW5nIHNob3J0TmFtZV8pCi0gICAgewotICAgICAgICB0aGlzLnNob3J0TmFtZV8gPSBzaG9ydE5hbWVfOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc291cmNlSW5mb18uCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZUluZm8gZ2V0U291cmNlSW5mbygpCi0gICAgewotICAgICAgICByZXR1cm4gc291cmNlSW5mb187Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROZXdsaW5lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXdsaW5lXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBcnRpZmFjdEFzc2lzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3RBc3Npc3RfOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9BcnRpZmFjdE1hbmFnZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vQXJ0aWZhY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNTA3MTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9BcnRpZmFjdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBNYW5hZ2UgdGhlIGFydGlmYWN0czogYmUgYWJsZSB0byByZXRyaWV2ZSBhbiBhcnRpZmFjdCBmcm9tIHRoZSBpZCBpbiBhIG1hcmtlciwgZm9yIGV4YW1wbGUuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBBcnRpZmFjdE1hbmFnZXIsIGRpc3Rpbmd1aXNoZWQgYnkgCi0gKiBhbiBJRCwgcHJvYmFibHkgYSBtYXJrZXJJRC4gIFRoYXQgaXMsIGFsbCBhcnRpZmFjdHMgb2YgdGhlIHNhbWUgbWFya2VySUQKLSAqIChwcm9iYWJseSBzaG93biBpbiB0aGUgc2FtZSB2aWV3KSBhcmUgbWFuYWdlZCBieSB0aGUgc2FtZSAoZGlzdGluY3QpIEFydGlmYWN0TWFuYWdlci4KLSAqIAotICogVE9ETyBRdWVzdGlvbjogd2h5IGNhbid0IHdlIGp1c3Qgc3RvcmUgdGhlIG9iamVjdHMgaW4gYW4gYXR0cmlidXRlPz8gCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdE1hbmFnZXIgewotCi0KLQkvKiogdG8gYmUgYWJsZSB0byBsb29rIHVwIGFydGlmYWN0cyBieSB1bmlxdWUgSUQgKi8KLQlzdGF0aWMgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsgIAotCi0JLyoqIElEIGZvciB0aGlzIHJlZ2lzdHJ5ICovCi0JcHJpdmF0ZSBTdHJpbmcgaWRfOwotCi0JLyoqCi0JICogUmVnaXN0cnkgb2YgYXJ0aWZhY3QgbWFuYWdlcnMuIElEcyBhcmUgcHJvYmFibHkgbWFya2VySURzIGZvciB0aGUgdHlwZSBvZgotCSAqIGFydGlmYWN0cyB0aGF0IHRoaXMgQXJ0aWZhY3RNYW5hZ2VyIGhvbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCByZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQXJ0aWZhY3RNYW5hZ2VyKFN0cmluZyBpZCkgewotCQl0aGlzLmlkXyA9IGlkOwotCQlyZWdpc3RyeS5wdXQoaWQsIHRoaXMpOwotCi0JfQotCi0JLyoqIGRpc2FsbG93IGRlZmF1bHQgY3RvciAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgQXJ0aWZhY3RNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgQXJ0aWZhY3RNYW5hZ2VyIHVzZWQgZm9yIG1hbmFnaW5nIGFydGlmYWN0cyBvZiB0eXBlICJpZCIKLQkgKiAocHJvYmFibHkgYSBtYXJrZXIgaWQpCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RNYW5hZ2VyIGdldE1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0gICAgICAgIE9iamVjdCBvID0gKE9iamVjdClyZWdpc3RyeS5nZXQoaWQpOwotICAgICAgICBpZiAobz09bnVsbCkKLSAgICAgICAgICAgIG5ldyBBcnRpZmFjdE1hbmFnZXIoaWQpOwotCQlyZXR1cm4gKEFydGlmYWN0TWFuYWdlcikgcmVnaXN0cnkuZ2V0KGlkKTsKLQl9Ci0JLyoqCi0JICogcmV0dXJuIHRoZSBhcnRpZmFjdCBmb3IgYSBtYXJrZXI7IGludm9sdmVzIGxvb2tpbmcgdXAgdGhlCi0JICogQXJ0aWZhY3QgTWFuYWdlciwgdGhlbiB0aGUgQXJ0aWZhY3Qgd2l0aGluIHRoYXQuCi0JICogCi0JICogTWF5YmUgd2UganVzdCBuZWVkIGEgYmlnIGhhc2h0YWJsZSBvciBvdGhlciBiaWcgTWFwIGluc3RlYWQ/Pz8KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0IGdldEFydGlmYWN0KElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJU3RyaW5nIGlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJRHMuVU5JUVVFX0lEKTsKLQkJU3RyaW5nIG1hcmtlcklEPW1hcmtlci5nZXRBdHRyaWJ1dGUoSURzLklEKS50b1N0cmluZygpOwotCQlBcnRpZmFjdE1hbmFnZXIgYU1ncj1nZXRNYW5hZ2VyKG1hcmtlcklEKTsKLQkJSUFydGlmYWN0IGEgPSAgYU1nci5nZXRBcnRpZmFjdChpZCk7Ci0JCQotCQlyZXR1cm4gYTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQWRkIGFuIGFydGlmYWN0IHRvIHRoZSBoYXNodGFibGUgZm9yIGZ1dHVyZSBsb29rdXAKLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcnRpZmFjdFRvSGFzaChJQXJ0aWZhY3QgYSkgewotCQlTdHJpbmcgaWQgPSBhLmdldElkKCk7IC8vIGZvciBkZWJ1Z2dpbmcgYWNjZXNzIG9ubHkKLQkJaGFzaE1hcC5wdXQoaWQsIGEpOwotCX0KLQotCS8qKgotCSAqIHJldHJpZXZlIGFydGlmYWN0IGJ5IHVuaXF1ZSBJRC4gVXNlZCBmb3IgcmV0cmlldmluZyBhcnRpZmFjdHMgd2hlbiBuZWVkZWQKLQkgKiBmcm9tIHRoZSBNYXJrZXJzIC0gc2luY2UgbWFya2VycyBjYW4ndCBob2xkIG9uIHRvIHRoZW0KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElBcnRpZmFjdCBnZXRBcnRpZmFjdChTdHJpbmcgaWQpIHsKLQkJSUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBoYXNoTWFwLmdldChpZCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0QXJ0aWZhY3RzKCkgewotCQlPYmplY3RbXSBhcnRpZmFjdHMgPSBoYXNoTWFwLnZhbHVlcygpLnRvQXJyYXkoKTsKLQkJcmV0dXJuIGFydGlmYWN0czsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRBcnRpZmFjdE1hcCgpIHsKLQkJcmV0dXJuIGhhc2hNYXA7Ci0JfQotCS8qKgotCSAqIFJlbW92ZSBhcnRpZmFjdCBieSBhcnRpZmFjdCBvYmplY3QKLQkgKiBAcGFyYW0gYQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFydGlmYWN0KElBcnRpZmFjdCBhKXsKLQkJcmV0dXJuIHJlbW92ZUFydGlmYWN0KGEuZ2V0SWQoKSk7Ci0JfQotCS8qKgotCSAqIFJlbW92ZSBhcnRpZmFjdCBieSBrZXkKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFydGlmYWN0KFN0cmluZyBrZXkpewotCQlpZihoYXNoTWFwLmNvbnRhaW5zS2V5KGtleSkpewotCQkJaGFzaE1hcC5yZW1vdmUoa2V5KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgYXJ0aWZhY3RzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpewotCQloYXNoTWFwLmNsZWFyKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuICJBcnRpZmFjdE1hbmFnZXIgZm9yICIraWRfOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9BcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjJiYWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9BcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbjsKLQotLyoqCi0gKiBBcnRpZmFjdCBWaXNpdG9yIC0gR2VuZXJpYyAtIGZvciBkZWx0YSBvciBmdWxsIGJ1aWxkCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqIAotICovCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLQotCi0vKioKLSAqIFByb2Nlc3NlcyBhbiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IG9yIGFuIDxjb2RlPklSZXNvdXJjZURlbHRhPC9jb2RlPiB0byBzZXQgQXJ0aWZhY3QgTWFya2VycyBvbiB0aGUgZmlsZXMKLSAqIGFuZCBwb3B1bGF0ZSB0aGUgZGF0YSBtb2RlbCB1c2VkIGZvciB0aGUgQXJ0aWZhY3QgdmlldyhzKS4KLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0TWFya2luZ1Zpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IsIElSZXNvdXJjZVZpc2l0b3IKLXsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWFya2VySURfOwotICAgIHByb3RlY3RlZCBBcnRpZmFjdE1hbmFnZXIgYXJ0aWZhY3RNYW5hZ2VyXzsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlTWFya2VyczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rpb24gdGhhdCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCB0byByZW1vdmVkIG9sZAotICAgICAqIG1hcmtlcnMgb24gdGhpcyByZXNvdXJjZSBiZWZvcmUgY3JlYXRpbmcgbmV3IG9uZXMKLSAgICAgKiBAcGFyYW0gbWFya2VySWQKLSAgICAgKiBAcGFyYW0gcmVtb3ZlTWFya2VycwotICAgICAqLwotICAgIHB1YmxpYyBBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKFN0cmluZyBtYXJrZXJJZCwgYm9vbGVhbiByZW1vdmVNYXJrZXJzKQotICAgIHsKLSAgICAgICAgdGhpcy5tYXJrZXJJRF8gPSBtYXJrZXJJZDsKLSAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXJzPXJlbW92ZU1hcmtlcnM7Ci0gICAgICAgIHRoaXMuYXJ0aWZhY3RNYW5hZ2VyXz1BcnRpZmFjdE1hbmFnZXIuZ2V0TWFuYWdlcihtYXJrZXJJRF8pOwotICAgICAgICBpZihhcnRpZmFjdE1hbmFnZXJfPT1udWxsKXsKLSAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigibm8gbWFuYWdlciB5ZXQhIik7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBiZWhhdmlvciB0aGF0IFdJTEwgcmVtb3ZlIG9sZCBtYXJrZXJzCi0gICAgICogb24gdGhlIHJlc291cmNlIGJlZm9yZSBjcmVhdGluZyBuZXcgb25lcy4gIChUaGlzIGlzIHRoZSBmb3JtZXIgYmVoYXZpb3IsCi0gICAgICogbm93IHRoZSBkZWZhdWx0IGJlaGF2aW9yKQotICAgICAqIEBwYXJhbSBtYXJrZXJJRCAKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihTdHJpbmcgbWFya2VySUQpCi0gICAgewotICAgICAgdGhpcyhtYXJrZXJJRCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJpYyB2aXNpdGluZyBvZiBhIGZpbGUsIHRvIHByZXN1bWFibHkgYWRkIG1hcmtlcnMuIFRoaXMgdmVyc2lvbiBpcyBjYWxsZWQgZnJvbSBhIGJ1aWxkLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdEZpbGUoSVJlc291cmNlIHJlc291cmNlKQotICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJmaWxlbmFtZT0iK3Jlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIEFydGlmYWN0W10gYXJ0aWZhY3RzID0gZ2V0UElzKHJlc291cmNlKTsKLSAgICAgICAgcmV0dXJuIHZpc2l0RmlsZShyZXNvdXJjZSwgYXJ0aWZhY3RzKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyaWMgdmVyc2lvbiB0byBwdXQgbWFya2VycyBvbiBhIGZpbGUsIGdpdmVuIHRoZSBmaWxlKHJlc291cmNlKSBhbmQgdGhlIGxpc3Qgb2YgYXJ0aWZhY3RzCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogQHBhcmFtIGFydGlmYWN0cyBsaXN0IG9mIGFydGlmYWN0IG9iamVjdHMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXRGaWxlKElSZXNvdXJjZSByZXNvdXJjZSwgQXJ0aWZhY3RbXSBhcnRpZmFjdHMpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3RNYXJraW5nVmlzaXRvci52aXNpdEZpbGU6ICIgKyByZXNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgLy8gZmlyc3QgY2xlYXIgZXhpc3RpbmcgbWFya2VycyAobm90OiBub3QgZG9pbmcgYW55dGhpbmcgQXJ0aWZhY3RNYW5hZ2VyIG5vdy4pCi0gICAgICAgICAgICBpZihyZW1vdmVNYXJrZXJzKSB7Ci0gICAgICAgICAgICAJcmVtb3ZlTWFya2VycyhyZXNvdXJjZSwgdGhpcy5tYXJrZXJJRF8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG51bUFydGlmYWN0cz1hcnRpZmFjdE1hbmFnZXJfLmdldEFydGlmYWN0cygpLmxlbmd0aDsKLSAgICAgICAgICAgIGlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJudW1BcnRpZmFjdHM6ICIrbnVtQXJ0aWZhY3RzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGZuID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChhcnRpZmFjdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNyZWF0ZU1hcmtlcnMocmVzb3VyY2UsIGZuLCBhcnRpZmFjdHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdEZpbGUoSVJlc291cmNlIHJlc291cmNlLCBMaXN0PEFydGlmYWN0PiBhcnRpZmFjdHMpCi0gICAgewotICAgICAgICBBcnRpZmFjdFtdIGFydGlmYWN0QXJyYXkgPSBuZXcgQXJ0aWZhY3RbYXJ0aWZhY3RzLnNpemUoKV07Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxBcnRpZmFjdD4gaXRlciA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGVsZW1lbnQgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgYXJ0aWZhY3RBcnJheVtpXSA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZpc2l0RmlsZShyZXNvdXJjZSwgYXJ0aWZhY3RBcnJheSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG1hcmtlcnMgZm9yIGEgZmlsZS4gVGhpcyBtZXRob2QgY3JlYXRlcyBhIG1hcmtlciBmb3IgZWFjaCBhcnRpZmFjdC4gSXQgYWxzbyBwb3B1bGF0ZXMvcmVmcmVzaGVzIHRoZQotICAgICAqIHZpZXdzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZSBhc3N1bWVkIHRvIGJlIGEgZmlsZSwgcmVzb3VyY2UgdXBvbiB3aGljaCB0byBwbGFjZSB0aGUgbWFya2VyKHMpCi0gICAgICogQHBhcmFtIGZuIC0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3RzIC0gYXJyYXkgb2YgQXJ0aWZhY3Qgb2JqZWN0cyBmb3Igd2hpY2ggdG8gY3JlYXRlIG1hcmtlcnMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBmbiwgQXJ0aWZhY3RbXSBhcnRpZmFjdHMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmNyZWF0ZU1hcmtlcnM6ICIgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiICNhcnRpZmFjdHM9IiArIGFydGlmYWN0cy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IGFydGlmYWN0c1tpXTsKLSAgICAgICAgICAgIC8vIGFydGlmYWN0TWFya2VyICdpbmhlcml0cycgZnJvbSB0ZXh0TWFya2VyKHNlZSBwbHVnaW4ueG1sKQotICAgICAgICAgICAgLy8gSWYgaXQgYWxzbyBpbmhlcml0ZWQgZnJvbSBQcm9ibGVtTWFya2VyLCBpdCB3b3VsZCBhdXRvbWFnaWNhbGx5IHNob3cgaW4gbW9yZSB2aWV3cyAoZS5nLiBQcm9ibGVtcyB2aWV3KQotICAgICAgICAgICAgaWYgKGFydGlmYWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBtYWtlIG1hcmtlciBmb3IgbWFpbiBBcnRpZmFjdAotCi0gICAgICAgICAgICAgICAgLy8gR2V0IGNvcnJlY3QgZmlsZW5hbWUgZm9yIGluY2x1ZGUgZmlsZXMKLSAgICAgICAgICAgICAgICAvLyBBY3R1YWwgZmlsZSBjb250YWluaW5nIGFydGlmYWN0IG1heSBiZSBhbiBpbmNsdWRlIGZpbGUsIHNvIHVzZSBpdAotICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGZpbGUgYmVpbmcgYW5hbHl6ZWQKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBhcnRpZmFjdC5nZXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIElSZXNvdXJjZSBmID0gcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYXJ0aWZhY3QgaXMgbm90IG9uIHNhbWUgZmlsZSBiZWluZyBhbmFseXplZCwgY29ycmVjdCBpdAotICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgdGhlIGFjdHVhbCBmaWxlLiBFLkcuIGFuIGluY2x1ZGUgZmlsZQotICAgICAgICAgICAgICAgIC8vIChkb24ndCBjcmVhdGUgYW5vdGhlciByZXNvdXJjZSBvYmplY3QgaWYgd2UgZG9uJ3QgbmVlZCB0bykKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlc0xvY249IityZXNvdXJjZS5nZXRSYXdMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIC8vIGlmICghcmVzTG9jbi5lcXVhbHMoZmlsZW5hbWUpKQotICAgICAgICAgICAgICAgIC8vIGYgPSBNcGlQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICAvLyBuZXcgUGF0aChwaWZuKSk7Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXg9ZmlsZW5hbWUubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBpZihpbmRleD09LTEpewotICAgICAgICAgICAgICAgIAlpbmRleD1maWxlbmFtZS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaW5kZXghPS0xKXsKLSAgICAgICAgICAgICAgICAJLy8gQlJUIG5vdGU6IGlmIGNvbnRhaW5zIGJvdGggLyBhbmQgXCB0aGlzIHdvbid0IHdvcmsKLSAgICAgICAgICAgICAgICAJLy8gdHJ1Y2F0ZSB0byBsYXN0IHBvcnRpb24gb2YgcGF0aAotICAgICAgICAgICAgICAgIAkvLyB0aGlzIHNoZCBwcm9iYWJseSBiZSBhIHVzZXIgcHJlZmVyZW5jZSwgaWYgdGhpcyBpcyB0cnVuY2F0ZWQgb3Igbm90Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB0bXAyPWZpbGVuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgICAgICAgICAJZmlsZW5hbWU9dG1wMjsKLSAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNyZWF0ZUFydGlmYWN0TWFya2VyKGYsIGFydGlmYWN0LCBmaWxlbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBtYWtpbmcgb3RoZXIgdmlld3MsIGUuZy4gdHJlZSB2aWV3LCBhZGQgdG8gbW9kZWwgdHJlZSBmb3IgdmlldyBoZXJlLi4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNlT24pCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIGFydGlmYWN0IGZvciAiICsgZm4gKyAiaXMgbnVsbCEgKioqKioqKioiKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBub3cgcmVmcmVzaCB0aGUgdHJlZSB2aWV3ISEKLSAgICAgICAgICAgIC8vIE1QSVRyZWUuZ2V0VHJlZSgpLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSB0aGUgbWFya2VyIGZvciB0aGUgYXJ0aWZhY3QsIGFuZCBhZGQgaXQgdG8KLSAgICAgKiB0aGUgcmVwb3NpdG9yeSAoQXJ0aWZhY3RNYW5hZ2VyKQotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEBwYXJhbSBhcnRpZmFjdAotICAgICAqIEBwYXJhbSBmbgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFydGlmYWN0TWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgQXJ0aWZhY3QgYXJ0aWZhY3QsIFN0cmluZyBmbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0IGRlc2M9IiArIGFydGlmYWN0LmdldFNob3J0TmFtZSgpICsgIiAgZm49IiArIGZuKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhdHRycyA9IGNyZWF0ZUNvbW1vbk1hcmtlckF0dHJzKHJlc291cmNlLCBhcnRpZmFjdCwgZm4pOwotICAgICAgICAvLyBtZXNzYWdlIGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgZm9yIGhvdmVyIG92ZXIgZWRpdG9yIGxvY2F0aW9uCi0gICAgICAgIGF0dHJzLnB1dChJTWFya2VyLk1FU1NBR0UsIGFydGlmYWN0LmdldFNob3J0TmFtZSgpKTsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBtYXJrZXIgYWxsIGF0IG9uY2UsIHNvIGdldCBPTkxZIGEgc2luZ2xlIHJlc291cmNlQ2hhbmdlIGV2ZW50LgotICAgICAgICBNYXJrZXJVdGlsaXRpZXMuY3JlYXRlTWFya2VyKHJlc291cmNlLCBhdHRycywgdGhpcy5tYXJrZXJJRF8pOyAgLy8gMTU0Ci0gICAgICAgIGlmICh0cmFjZU9uKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtYXJrZXIgY3JlYXRlZDogZm9yICIgKyBmbiArICIgLSAiICsgYXJ0aWZhY3QuZ2V0U2hvcnROYW1lKCkgKyAiIGxpbmUgIgotICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldExpbmUoKSArICIgc3RhcnQgIiArIGFydGlmYWN0LmdldFNvdXJjZUluZm8oKS5nZXRTdGFydCgpICsgIiBlbmQgIgotICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldFNvdXJjZUluZm8oKS5nZXRFbmQoKSk7Ci0gICAgICAgIAotICAgICAgICBhcnRpZmFjdE1hbmFnZXJfLmFkZEFydGlmYWN0VG9IYXNoKGFydGlmYWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgbWFya2VyIGF0dHJpYnV0ZXMgd2l0aCBjb21tb24gaW5mb3JtYXRpb24gc2hhcmVkIGJ5IGV2ZXJ5b25lCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlIEZpbGUgb24gd2hpY2ggYW5hbHlzaXMgd2FzIHJ1bgotICAgICAqIEBwYXJhbSBhcnRpZmFjdCB0aGUgYXJ0aWZhY3Qgb2JqZWN0Ci0gICAgICogQHBhcmFtIGZuIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICogCi0gICAgICogTm90ZSB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBtYXJrZXIgaGVyZTsgd2UgZG8gaXQgYWxsIGF0IG9uY2UgYWZ0ZXIgYXR0cmlidXRlcyBhcmUgY2FsY3VsYXRlZCwgc28gdGhhdCBhIHNpbmdsZQotICAgICAqIHJlc291cmNlQ2hhbmdlIGV2ZW50IGdldHMgdHJpZ2dlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRlQ29tbW9uTWFya2VyQXR0cnMoSVJlc291cmNlIHJlc291cmNlLCBBcnRpZmFjdCBhcnRpZmFjdCwgU3RyaW5nIGZuKQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhdHRycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBhdHRycy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9OT1JNQUwpKTsKLSAgICAgICAgYXR0cnMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGFydGlmYWN0LmdldExpbmUoKSkpOwotICAgICAgICAvLyB1c2UgZmlsZW5hbWUgZnJvbSB0aGUgYXJ0aWZhY3QsIG5vdCB0aGUgYmFzZSBmaWxlIGJlaW5nIGFuYWx5c2VkLAotICAgICAgICAvLyBiZWNhdXNlIHRoZSBhcnRpZmFjdCBtYXkgYmUgYSByZXN1bHQgb2YgcmVwb3J0aW5nIG9uIGUuZy4gYW4gaW5jbHVkZSBmaWxlCi0gICAgICAgIGF0dHJzLnB1dChJTWFya2VyLkxPQ0FUSU9OLCBhcnRpZmFjdC5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgYXR0cnMucHV0KElEcy5GSUxFTkFNRSwgZm4pOyAvLyBmbiBiZWluZyBwcm9jZXNzZWQKLSAgICAgICAgYXR0cnMucHV0KElEcy5OQU1FLCBhcnRpZmFjdC5nZXRTaG9ydE5hbWUoKSk7Ci0gICAgICAgIGF0dHJzLnB1dChJRHMuREVTQ1JJUFRJT04sIGFydGlmYWN0LmdldERlc2NyaXB0aW9uKCkpOwotCi0gICAgICAgIC8vIGphdmE1Ci0gICAgICAgIC8vIC8vIHRyeWluZyBzZXR0aW5nIHRoZSBtYXJrZXIgdG8gbW9yZSBwcmVjaXNlIGxvY2F0aW9uCi0gICAgICAgIC8vIGF0dHJzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIGFydGlmYWN0LmdldFNvdXJjZUluZm9fKCkuZ2V0U3RhcnQoKSk7Ci0gICAgICAgIC8vIGF0dHJzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBhcnRpZmFjdC5nZXRTb3VyY2VJbmZvXygpLmdldEVuZCgpKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gLy8gYWRkaW5nIGNvbnN0cnVjdCB0eXBlLCBpLmUuIGZ1bmMgY2FsbCwgY29uc3RhbnRzLCBlY3QuCi0gICAgICAgIC8vIGF0dHJzLnB1dChJRHMuQ09OU1RSVUNUX1RZUEUsIGFydGlmYWN0LmdldFNvdXJjZUluZm9fKCkuZ2V0Q29uc3RydWN0VHlwZSgpKTsKLQotICAgICAgICAvLyB0cnlpbmcgc2V0dGluZyB0aGUgbWFya2VyIHRvIG1vcmUgcHJlY2lzZSBsb2NhdGlvbgotICAgICAgICBhdHRycy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihhcnRpZmFjdC5nZXRTb3VyY2VJbmZvKCkuZ2V0U3RhcnQoKSkpOwotICAgICAgICBhdHRycy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoYXJ0aWZhY3QuZ2V0U291cmNlSW5mbygpLmdldEVuZCgpKSk7Ci0KLSAgICAgICAgLy8gYWRkaW5nIGNvbnN0cnVjdCB0eXBlLCBpLmUuIGZ1bmMgY2FsbCwgY29uc3RhbnRzLCBlY3QuCi0gICAgICAgIGF0dHJzLnB1dChJRHMuQ09OU1RSVUNUX1RZUEUsIG5ldyBJbnRlZ2VyKGFydGlmYWN0LmdldFNvdXJjZUluZm8oKS5nZXRDb25zdHJ1Y3RUeXBlKCkpKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSAoKEFydGlmYWN0KSBhcnRpZmFjdCkuZ2V0SWQoKTsKLSAgICAgICAgYXR0cnMucHV0KElEcy5JRCwgaWQpOyAvLyB1c2VkIHRvIGxvb2sgdXAgdG8gZ2V0IGFydGlmYWN0IGZyb20gbWFya2VyIGxhdGVyCi0gICAgICAgIGF0dHJzLnB1dChJRHMuTElORSwgSW50ZWdlci50b1N0cmluZyhhcnRpZmFjdC5nZXRMaW5lKCkpKTsKLSAgICAgICAgaWYgKHRyYWNlT24pCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1hcmtlciBjcmVhdGVkOiBmb3IgIiArIGZuICsgIiAtICIgKyBhcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpICsgIiBsaW5lICIgKyBhcnRpZmFjdC5nZXRMaW5lKCkpOwotICAgICAgICByZXR1cm4gYXR0cnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEFydGlmYWN0cyBmb3IgYSBnaXZlbiByZXNvdXJjZS4gZS5nLiBjb3VsZCByZWFkcyBYTUwgZmlsZSB0aGF0IGlzIHByZXN1bWVkIHRvIGJlIGluIHNhbWUgZm9sZGVyIGFzCi0gICAgICogcmVzb3VyY2UgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gciBUaGUgcmVzb3VyY2UgKGZpbGUgYXNzdW1lZCkgZm9yIHdoaWNoIHRvIGxvb2sgZm9yIGFydGlmYWN0cwotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFydGlmYWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RbXSBnZXRQSXMoSVJlc291cmNlIHIpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIipVTklNUExFTUVOVEVEKiogQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5nZXRQSXM6ICIgKyByLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgbWFya2VycyBjdXJyZW50bHkgc2V0IG9uIGEgcmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWFya2VySUQpCi0gICAgewotICAgICAgICBpZiAodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLnJlbW92ZU1hcmtlcnM6ICIgKyByZXNvdXJjZS5nZXROYW1lKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvdXJjZS5kZWxldGVNYXJrZXJzKG1hcmtlcklELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgIC8vIGFsc28gc3luYyB1cCB0cmVlIHZpZXcKLSAgICAgICAgICAgIC8vIE1QSVRyZWUuZ2V0VHJlZSgpLnJlbW92ZUlzc3VlcyhyZXNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gZGVsZXRpbmcgbWFya2VycyBvbiAiICsgcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGVkIGZvciBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgUmVxdWlyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpc2l0IG1ldGhvZC4gVGhlCi0gICAgICogPGNvZGU+SVJlc291cmNlRGVsdGE8L2NvZGU+IGlzIHByb2Nlc3NlZCBieSBwcm92aWRpbmcgaXQgYSB2aXNpdG9yIHVzaW5nIHRoZSA8Y29kZT5hY2NlcHQoKTwvY29kZT4gbWV0aG9kIGFuZAotICAgICAqIHVzaW5nIHRoaXMgbWV0aG9kIGluIHRoZSB2aXNpdG9yIHRvIHByb2Nlc3MgYW55IGV2ZW50cyBvZiBpbnRlcmVzdC4KLSAgICAgKiAKLSAgICAgKiBQcm9jZXNzaW5nIGNvbnRpbnVlcyBhcyBsb25nIGFzIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBvciB3aGVuIHRoZSBlbmQgb2YgdGhlIDxjb2RlPklSZXNvdXJjZURlbHRhPC9jb2RlPiBoYXMKLSAgICAgKiBiZWVuIHJlYWNoZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBpZiAodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0TWFya2luZ1Zpc2l0b3IudmlzaXQocmVzb3VyY2VEZWx0YSkuLi4iKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaW50IHR5cGUgPSByZXNvdXJjZS5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICgoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpICYmICh0eXBlID09IElSZXNvdXJjZS5GSUxFKSkgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJkZWx0YSB2aXNpdG9yIHZpc2l0cyBGSUxFOiAiICsKLSAgICAgICAgICAgIC8vIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0gICAgICAgICAgICB2aXNpdEZpbGUocmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOyAvLyBjYXJyeSBvbgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGVkIGZvciBJUmVzb3VyY2VWaXNpdG9yCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKQotICAgIHsKLSAgICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgLy8gaWYgKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJGVUxMIHZpc2l0b3IgdmlzaXRzIEZJTEU6ICIgKwotICAgICAgICAgICAgLy8gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLSAgICAgICAgICAgIHZpc2l0RmlsZShyZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhcnJ5IG9uCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBhbiBhcnRpZmFjdCBvYmplY3QgLSBwcmludCBmb3IgZGVidWdnaW5nL3RyYWNpbmcgcHVycG9zZXMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QgdGhlIEFydGlmYWN0IE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93QXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0IG5hbWU6ICIgKyBhcnRpZmFjdC5nZXRTaG9ydE5hbWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgRGVzY3JpcHRpb246ICIgKyBhcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBGaWxlbmFtZTogICAgIiArIGFydGlmYWN0LmdldEZpbGVOYW1lKCkpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9Db21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmNjA3ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIGZvciBQTERUIChQVFAncyBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scykKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvKiogVGhlIHNoYXJlZCBpbnN0YW5jZS4gKi8KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QbHVnaW4gcGx1Z2luOwotCS8qKiBSZXNvdXJjZSBidW5kbGUgKi8KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlVHJhY2VPbiA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGF2ZVJlYWRUcmFjZVN0YXR1cyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24iOwotCQotICAvKioKLSAgICogVG8gdXNlIGR5bmFtaWMgdHJhY2luZyAoVXNlciBpbnN0cnVjdGlvbnMpOgotICAgKiBDcmVhdGUgYSBmaWxlICIub3B0aW9ucyIgaW4gdGhlCi0gICAqIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgZWNsaXBzZSBleGVjdXRhYmxlLiBQdXQgdGhpcyBpbiB0aGUgZmlsZToKLSAgICogCi0gICAqIDxwcmU+Ci0gICAqICBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vZGVidWcgPSB0cnVlCi0gICAqICBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vZGVidWcvcGxkdFRyYWNlID0gdHJ1ZQotICAgKiA8L3ByZT4KLSAgICogCi0gICAqIFRoZW4gbGF1bmNoIGVjbGlwc2UgaW4gZGVidWcgbW9kZSB1c2luZyB0aGUgLWRlYnVnIG9wdGlvbiwgYW5kIG1pcnJvciB0aGUKLSAgICogQ29uc29sZSB2aWV3IG91dHB1dCB0byB0aGUgY29tbWFuZCBsaW5lIGNvbnNvbGUgdXNpbmcgdGhlIC1jb25zb2xlTG9nCi0gICAqIG9wdGlvbi4gKE1heWJlIExpbnV4IGFscmVhZHkgc3BpdHMgb3V0IHRoZSBjb25zb2xlLCBub3Qgc3VyZS4pCi0gICAqIAotICAgKiA8cHJlPgotICAgKiBlY2xpcHNlIC0gZGVidWcgLSBjb25zb2xlTG9nCi0gICAqIDwvcHJlPgotICAgKiAKLSAgICogV2hlbiB5b3UgcnVuIHdpdGggdGhpcyB0cmFjaW5nIGVuYWJsZWQsIGl0IHdpbGwgcHJpbnQgb3V0IGEgYnVuY2ggb2YKLSAgICogdHJhY2UgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuIEF0IGxlYXN0IE1QSSBhcnRpZmFjdCBhbmFseXNpcyBoYXMgYmVlbgotICAgKiBlbmFibGVkIGZvciB1c2VyLWRpcmVjdGVkIHRyYWNpbmcuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRUcmFjZU9uKCkgewotCQlpZiAoIWhhdmVSZWFkVHJhY2VTdGF0dXMpIHsKLQkJCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vZGVidWcvcGxkdFRyYWNlIik7Ci0JCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29tbW9uUGx1Z2luLmdldFRyYWNlT24oKTogcGxkdFRyYWNlIHRyYWNlIGZpbHRlcmluZyBpcyBvbjsgdHJhY2VGaWx0ZXI9ICIgKyB0cmFjZUZpbHRlcik7Ci0JCQkJZWNsaXBzZVRyYWNlT24gPSB0cnVlOwotCQkJfQotCQkJaGF2ZVJlYWRUcmFjZVN0YXR1cyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGVjbGlwc2VUcmFjZU9uOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHBsYWNlIHRvIHB1dCB0aGlzLCBidXQuLi4KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChJRHMuU0hPV19BTkFMWVNJU19DT05GSVJNQVRJT04sIHRydWUpOwotCQkKLQkJQnVuZGxlIGNkdEJ1bmRsZT1QbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmNkdC5jb3JlIik7Ci0JCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgY2R0QnVuZGxlLmdldEhlYWRlcnMoKS5nZXQob3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ0RUIHZlcnNpb246ICIrdmVyc2lvbik7Ci0JCWJvb2xlYW4gdmVyc09LID0gdmVyc2lvbi5zdGFydHNXaXRoKCI0LjAuMiIpfHwgdmVyc2lvbi5zdGFydHNXaXRoKCI0LjAuMyIpIHx8IHZlcnNpb24uc3RhcnRzV2l0aCgiNSIpOwotCQlpZighdmVyc09LKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKipXYXJuaW5nLCB3cm9uZyB2ZXJzaW9uIG9mIENEVC4gIFZlcnNpb24gNC4wLjIgb3IgaGlnaGVyIGlzIHJlcXVpcmVkIHdpdGggUExEVCAyLjAiKTsKLQkJCVN0cmluZyBtc2c9IlRoaXMgaXMgUExEVCAyLjAgd2hpY2ggcmVxdWlyZXMgQ0RUIFZlcnNpb24gNC4wLjIgb3IgaGlnaGVyLiI7Ci0JCQkJbXNnKz0iXG5UaGlzIGVjbGlwc2UgaW5zdGFsbGF0aW9uIGNvbnRhaW5zIENEVCB2ZXJzaW9uICIrdmVyc2lvbjsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG51bGwsICJWZXJzaW9uIG1pc21hdGNoIiwgbXNnKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4KLSAgICAgKiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkKLSAgICB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheTsKLSAgICAgICAgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLnB0cC5wbGR0LmNvbW1vbi5Db21tb25QbHVnaW5SZXNvdXJjZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0byB0aGUgIi5sb2ciIGZpbGUKLSAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIGxvZyBlbnRyeSwgZS5nLiBJU3RhdHVzLkVSUk9SLCBJU3RhdHVzLldBUk5JTkcsIGV0Yy4KLSAgICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHR5cGUsIFN0cmluZyBtc2cpIHsKLSAgICAJU3RyaW5nIHBsdWdpbklEPWdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLSAgICAJRXhjZXB0aW9uIGV4YyA9IG51bGw7Ly8gaWdub3JlIGV4Y2VwdGlvbiBmb3Igbm93Ci0JCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyh0eXBlLCBwbHVnaW5JRCwgdHlwZSwgbXNnLGV4Yyk7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQotICAgIH0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0byB0aGUgIi5sb2ciIGZpbGUgd2l0aCBkZWZhdWx0IHN0YXR1cyB0eXBlIG9mIElTdGF0dXMuSU5GTwotICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZyl7Ci0gICAgCWxvZyhJU3RhdHVzLklORk8sIG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9JQXJ0aWZhY3QuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vSUFydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlM2JmZTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9JQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuU291cmNlSW5mbzsKLQotLyoqCi0gKiBBcnRpZmFjdHMgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBzb21ldGhpbmcgZm91bmQgaW4gc291cmNlIGNvZGUuCi0gKiAKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFydGlmYWN0Ci17Ci0gICAgcHVibGljIGludCBnZXRDb2x1bW4oKTsKLSAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW4oaW50IGNvbCk7Ci0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0gICAgcHVibGljIGludCBnZXRMaW5lKCk7Ci0gICAgcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZU5vKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlmaWxlTmFtZSgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0gICAgcHVibGljIHZvaWQgc2V0U2hvcnROYW1lKFN0cmluZyBuYW1lKTsKLSAgICBwdWJsaWMgU291cmNlSW5mbyBnZXRTb3VyY2VJbmZvKCk7Ci0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL0lEcy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9JRHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliNzljYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL0lEcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbjsKLQotLyoqCi0gKiBNaXNjLiBJRHMgZm9yIHByZWZlcmVuY2VzLCBtYXJrZXJzLCBldGMuCi0gKiAKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEcwotewotICAgIFN0cmluZyBQX1JVTl9BTkFMWVNJUyAgPSAicnVuQW5hbHlzaXMiOwotICAgIFN0cmluZyBQX0VDSE9fRk9SQ0UgICAgPSAiZm9yY2VFY2hvIjsKLS8vICAgIFN0cmluZyBNQVJLRVJfRVJST1JfSUQgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUubXBpRXJyb3JNYXJrZXIiOwotLy8gICAgU3RyaW5nIE1BUktFUl9JRCAgICAgICA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5tcGlNYXJrZXIiOwotICAgIFN0cmluZyBGSUxFTkFNRSAgICAgICAgPSAiZmlsZW5hbWUiOwotICAgIFN0cmluZyBOQU1FICAgICAgICAgICAgPSAibmFtZSI7Ci0gICAgU3RyaW5nIERFU0NSSVBUSU9OICAgICA9ICJkZXNjcmlwdGlvbiI7Ci0gICAgU3RyaW5nIElEICAgICAgICAgICAgICA9ICJ1bmlxdWVJRCI7Ci0KLSAgICAvLyBub3RlIGJ1aWx0LWluIG1hcmtlciBpZCB0b28uLi4gbm90IHN1cmUgdGhpcyBpcyB1c2VkLAotICAgIC8vIGNvbXBhcmUgd2l0aCBJTWFya2VyLkxJTkVfTlVNQkVSIHdoaWNoIGlzIHByb2JhYmx5IHVzZWQgaW5zdGVhZC4KLSAgICBTdHJpbmcgTElORSAgICAgICAgICAgID0gInRoZUxpbmVObyI7Ci0gICAgU3RyaW5nIE5FV0xJTkUgICAgICAgICA9ICJ0aGVOZXdMaW5lTm8iOwotCi0gICAgLy8gcHJlZmVyZW5jZSBwYWdlIG5hbWUgZm9yIE1QSSBJbmNsdWRlcyBmaWVsZCBsYWJlbAotLy8gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgTVBJX0lOQ0xVREVTICAgID0gIk1QSSBJbmNsdWRlcyI7Ci0KLSAgICAvLyBtYXJrZXIgYXR0cmlidXRlIGZvciB0aGUgZXh0cmEgaW5mbyBzYXZlZCBmb3IgZWFjaCBtYXJrZXIvYXJ0aWZhY3QKLSAgICBTdHJpbmcgQ09OU1RSVUNUX1RZUEUgID0gImNvbnN0cnVjdFR5cGUiOwotICAgIC8qKgotCSAqIEtleSBmb3Igc3RvcmluZyBwcmVmZXJlbmNlIG9mIHdoZXRoZXIgb3Igbm90IHRvIHNob3cgcG9wdXAgY29uZmlybWF0aW9uCi0JICogZGlhbG9nIHdoZW4gYW5hbHlzaXMgaXMgY29tcGxldGUuCi0JICovCi0JU3RyaW5nIFNIT1dfQU5BTFlTSVNfQ09ORklSTUFUSU9OID0gInNob3dBbmFseXNpc0NvbmZpcm1hdGlvbiI7Ci0JU3RyaW5nIFVOSVFVRV9JRCA9ICJ1bmlxdWVJRCI7Ci0gICAgCi0gICAgLy8gaWQgZm9yIE1QSSBBcnRpZmFjdCB2aWV3Ci0vLyAgICBTdHJpbmcgTVBJX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUudmlld3MuTVBJVGFibGVWaWV3IjsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vU2NhblJldHVybi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9TY2FuUmV0dXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDYyNjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9TY2FuUmV0dXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCByZXByZXNlbnRzIHRoZSBjb2xsZWN0aW9uIG9mICBhcnRpZmFjdHMgKGUuZy4gTVBJIG9yIE9wZW5NUCBhcnRpZmFjdHMpIHJldHVybmVkIGZyb20gYW5hbHlzaXMsIAotICogd2hpY2ggd2lsbCBldmVudHVhbGx5IGJlIGRpc3BsYXllZCBpbgotICogdGhlIGFzc29jaWF0ZWQgdmlldywgZXRjLiA8YnI+Ci0gKiBJdCBjYW4gYWxzbyBjb250YWluIG90aGVyIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmV0dXJuIGNvZGVzLCBnZW5lcmFsaXplZCBhbmFseXNpcyByZXN1bHRzLCBwYXJhbWV0ZXJzLCBldGMuIDxicj4KLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNjYW5SZXR1cm4KLXsKLQotICAgIHByaXZhdGUgTGlzdDxBcnRpZmFjdD4gYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdD4oKTsKLSAgICAKLSAgICBwdWJsaWMgU2NhblJldHVybigpCi0gICAgeyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHdhc0Vycm9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxBcnRpZmFjdD4gZ2V0QXJ0aWZhY3RMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcnRpZmFjdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJ0aWZhY3QoQXJ0aWZhY3QgYSkKLSAgICB7Ci0gICAgICAgIGFydGlmYWN0cy5hZGQoYSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2FjdGlvbnMvQW5hbHlzaXNEcm9wZG93bkhhbmRsZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vYWN0aW9ucy9BbmFseXNpc0Ryb3Bkb3duSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRhYTIyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vYWN0aW9ucy9BbmFseXNpc0Ryb3Bkb3duSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLQotLyoqCi0gKiBEZWZhdWx0IGhhbmRsZXIgZm9yIHRoZSAiUGFyYWxsZWwgQW5hbHlzaXMiIHRvb2xiYXIgaWNvbiBjb21tYW5kIC0KLSAqIHRoZSB3b3JrIHdvdWxkIGJlIGRvbmUgYnkgdGhlIG1lbnVzIHRoYXQgZ2V0IHJlZ2lzdGVyZWQgKGJ5IG90aGVyIHBsdWdpbnMpCi0gKiB0byBhcHBlYXIgYmVuZWF0aCBpdCwgYnV0ICB0aGlzIGl0c2VsZiBjYW4gZG8gc29tZXRoaW5nIHVzZWZ1bAotICogYnkgcmVwZWF0aW5nIHRoZSBsYXN0LWluaXRpYXRlZCBzdWJtZW51IGFjdGlvbi4gICgiRG8gdGhlIGxhc3QgdGhpbmcgYWdhaW4iKQotICogCi0gKiBUaGlzIGNsYXNzIGFsc28gYWN0cyBhcyBhIHNpbmdsZSBwb2ludCB0byBjYWNoZSB0aGUgY3VycmVudCBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgotICogc28gdGhhdCB3aGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLCB0aGUgY3VycmVudCBzZWxlY3Rpb24gY2FuIGJlIGFjY2Vzc2VkLgotICogSXQgcmVnaXN0ZXJzIGFzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIGFjdGl2ZWx5IGxpc3RlbiBmb3Igc2VsZWN0aW9uIGNoYW5nZXMsCi0gKiBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gSGFuZGxlclV0aWwgd2hpY2ggd29uJ3QgZ2V0IHRoZSBmaXJzdCBvbmUgKGUuZy4gYmVmb3JlCi0gKiB0aGUgcGx1Z2luIGlzIGxvYWRlZCkuCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIEFuYWx5c2lzRHJvcGRvd25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKLQlzdGF0aWMgcHJvdGVjdGVkIFJ1bkFuYWx5c2VIYW5kbGVyIGxhc3RBbmFseXNpc0hhbmRsZXI9bnVsbDsKLQlzdGF0aWMgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGxhc3RBbmFseXNpc1NlbGVjdGlvbj1udWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBsYXN0U2VsZWN0aW9uPW51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBBbmFseXNpc0Ryb3Bkb3duSGFuZGxlciBpbnN0YW5jZT1udWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbj1mYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yOiBzZXQgc2luZ2xldG9uIGluc3RhbmNlLCBhbmQgc2V0IHVwIHNlbGVjdGlvbiBsaXN0ZW5lciB0byAKLQkgKiBsaXN0ZW4gZm9yIHNlbGVjdGlvbnMgc28gd2UgY2FuIHJlcG9ydCB0aGVtIG1vcmUgZWZmaWNpZW50bHkKLQkgKiB0aGFuIHJlbHlpbmcgb24gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCSAqIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpc24ndCBhIHN0cnVjdHVyZWQgc2VsZWN0aW9uIChlLmcuIGVkaXRvciBzZWxlY3Rpb24gb3Igc29tZXRoaW5nCi0JICogd2UgZG9uJ3QgY2FyZSBhYm91dCkgdGhlbiB3ZSB3YW50IHRoZSBsYXN0IHN0cnVjdHVyZWQgc2VsZWN0aW9uLgotCSAqIElmIHdlIGNhbid0IGZpbmQgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBhdCB0aGUgdGltZSB0aGlzIGN0b3IgaXMgY2FsbGVkLAotCSAqIGdvIGdldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyOyBpdCdzIHByb2JhYmx5IHdoYXQgd2Ugd2FudAotCSAqIChmb3IgdGhlIGNhc2Ugd2hlbiBhbiBlZGl0b3IgaGFzIGp1c3QgYmVlbiBvcGVuZWQgYnkgZG91YmxlLWNsaWNraW5nIG9uIGl0cwotCSAqIGVudHJ5IGluIHRoZSBwcm9qZWN0IGV4cGxvcmVyOiBpdCdzIHN0aWxsIHNlbGVjdGVkIGluIHRoZSBQcm9qIGV4cGxvcmVyLAotCSAqIGJ1dCB0aGUgZWRpdG9yIG5vdyBoYXMgdGhlIGZvY3VzKS4KLQkgKi8KLQlwdWJsaWMgQW5hbHlzaXNEcm9wZG93bkhhbmRsZXIoKXsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkFuYWx5c2lzRHJvcGRvd25IYW5kbGVyKCkgY3Rvci4uLiBzaG91bGQgbm90IGJlID4xIG9mIHRoZXNlIik7Ci0JCWFzc2VydChpbnN0YW5jZT09bnVsbCk7ICAvLyB3ZSBwcmVzdW1lIHRoaXMgaXMgYSBzaW5nbGV0b24KLQkJaW5zdGFuY2U9dGhpczsKLQkJSVNlbGVjdGlvblNlcnZpY2Ugc3M9bnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIG9mIGZ1dHVyZSBzZWxlY3Rpb25zCi0JCQlzcyA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKTsKLQkJCXNzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJLy8gYW5kIGNhY2hlIHRoZSBzZWxlY3Rpb24gdGhhdCB3YXMgaW4gZWZmZWN0IG5vdy4KLQkJCUlTZWxlY3Rpb24gc2VsPSBzcy5nZXRTZWxlY3Rpb24oKTsvL2dpdmVzIHNlbGVjdGlvbiBpbiBBQ1RJVkUgUEFSVC5JZiBlZGl0b3Igd2FzIGp1c3Qgb3BlbmVkLCBhY3RpdmUgcGFydCBpcyBwcm9iYWJseSB0aGUgZWRpdG9yLgotCQkJLy8KLQkJCWlmKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJbGFzdFNlbGVjdGlvbj0oSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsOwotCQkJCWlmKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAuLi5nb3QgaW5pdGlhbCBzZWxlY3Rpb24uIik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdD1lLmdldENhdXNlKCk7Ci0JCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuYWx5c2lzRHJvcGRvd25IYW5kbGVyIDxpbml0PiAiKyBlLmdldE1lc3NhZ2UoKSsiIGNhdXNlOiAiK3QuZ2V0TWVzc2FnZSgpKTsKLQkJCS8vIEZJWE1FIHRoaXMgZ2V0cyBoaXQgb24gdGFyZ2V0IHdvcmtiZW5jaCBzaHV0ZG93bi4gV0hZPwotCQkJLy9yZXR1cm47Ci0KLQkJfQotCi0KLQkJLy8gSWYgd2Ugc3RpbGwgZG9uJ3Qga25vdyB0aGUgc2VsZWN0aW9uIHRoZW4gZmluZCBvdXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUKLQkJLy8gcHJvamVjdCBleHBsb3JlciB2aWV3IC0gaXRzIGd1ZXNzIGlzIHByb2JhYmx5IHJpZ2h0LgotCQlpZiAobGFzdFNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJvakV4cElEID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiOwotCQkJSVNlbGVjdGlvbiBhcFNlbCA9IHNzLmdldFNlbGVjdGlvbihwcm9qRXhwSUQpOwotCQkJaWYgKGFwU2VsICE9IG51bGwgJiBhcFNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJaWYgKCFhcFNlbC5pc0VtcHR5KCkpIHsKLQkJCQkJbGFzdFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYXBTZWw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkFuYWx5c2lzRHJvcGRvd25IYW5kbGVyLmV4ZWN1dGUoKS4uLiIpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb24oZXZlbnQpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0aW9uOiAiK3NlbGVjdGlvbik7Ci0JCQotCQlpZihsYXN0QW5hbHlzaXNIYW5kbGVyIT1udWxsKXsKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJMYXN0IGFuYWx5c2lzIHdhczogIitsYXN0QW5hbHlzaXNIYW5kbGVyKTsKLQkJCWxhc3RBbmFseXNpc0hhbmRsZXIuZXhlY3V0ZShldmVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBTdHJpbmcgbXNnID0gIk5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgeWV0IHRvIHJlcGVhdC4iOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obnVsbCwgIlJlcGVhdCBBbmFseXNpcyIsIG1zZyk7Ci0JCX0KLQotCSAgICByZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogUmVtZW1iZXIgd2hhdCB3YXMgbGFzdCBleGVjdXRlZCwgc28gdGhhdCB3ZSBjYW4gZ2l2ZSBhIHJlcGVhdCBwZXJmb3JtYW5jZQotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICogQHBhcmFtIHNlbGVjdGlvbiAtIGNhY2hlIHRoZSBzZWxlY3Rpb24gdG9vOyB0aGlzIHdpbGwgYmUgdXNlZCBhcyBhIGxhc3QgCi0JICogcmVzb3J0IGlmIGFub3RoZXIgYW5hbHlzaXMgZG9lc24ndCBzZWUgYSByZWNlbnQgc2VsZWN0aW9uIGl0IGxpa2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYXN0SGFuZGxlZEFuYWx5c2lzKFJ1bkFuYWx5c2VIYW5kbGVyIGhhbmRsZXIsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWxhc3RBbmFseXNpc0hhbmRsZXIgPSBoYW5kbGVyOwotCQlpZihzZWxlY3Rpb24hPW51bGwpewotCQkJbGFzdEFuYWx5c2lzU2VsZWN0aW9uPXNlbGVjdGlvbjsKLQkJfQotCQkKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImxhc3RBbmFseXNpc0hhbmRsZXIgc2V0IHRvOiAiK2xhc3RBbmFseXNpc0hhbmRsZXIpOwotCQkKLQl9Ci0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRMYXN0QW5hbHlzaXNTZWxlY3Rpb24oKXsKLQkJcmV0dXJuIGxhc3RBbmFseXNpc1NlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRlZCBmb3IgU2VsZWN0aW9uTGlzdGVuZXIgaW50ZXJmYWNlOgotCSAqIExpc3RlbiBmb3Igc2VsZWN0aW9uIGNoYW5nZXMgYW5kIGNhY2hlIHRoZSBvbmVzIHRoYXQgbWlnaHQgYmUKLQkgKiBpbnRlcmVzdGluZyB0byB1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlsYXN0U2VsZWN0aW9uPShJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiQURESC5zZWxlY3Rpb25DaGFuZ2VkLCBnb3Qgc3RydWN0dXJlZCBzZWxlY3Rpb24iKTsKLQkJfQotCQkKLQl9Ci0JLyoqCi0JICogVGhlIGxhc3Qgc3RydWN0dXJlZCBzZWxlY3Rpb24gc2VlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0TGFzdFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGxhc3RTZWxlY3Rpb247Ci0JfQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHByb2JhYmx5IGZvciBhY2Nlc3NpbmcgaXRzCi0JICoga25vd2xlZGdlIGFib3V0IHRoZSBjdXJyZW50L2xhc3Qgc2VsZWN0aW9uIG9mIGludGVyZXN0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFuYWx5c2lzRHJvcGRvd25IYW5kbGVyIGdldEluc3RhbmNlKCkgewotCQlpZihpbnN0YW5jZT09bnVsbCkgewotCQkJaW5zdGFuY2U9bmV3IEFuYWx5c2lzRHJvcGRvd25IYW5kbGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9hY3Rpb25zL1J1bkFuYWx5c2VIYW5kbGVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2FjdGlvbnMvUnVuQW5hbHlzZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjNWRiNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2FjdGlvbnMvUnVuQW5hbHlzZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLS8qKgotICogCi0gKiBSdW5BbmFseXNlSGFuZGxlciAtIGtlZXBzIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgYW5hbHlzaXMgaGFuZGxlcnMgaW4KLSAqIHRoZSBkcm9wZG93biBhbmFseXNpcyBtZW51LgotICogQ29tbW9uIGJlaGF2aW9yIGlzIGluICAoZGVyaXZlZCBjbGFzcykgUnVuQW5hbHlzZUhhbmRsZXJCYXNlLgotICogCi0gKiBUaGF0IGlzLCB0aGUgQW5hbHlzaXNEcm9wZG93bkhhbmRsZXIgd2lsbCByZXBlYXQgdGhlIGFjdGlvbiBvZiB0aGUgbGFzdCBSdW5BbmFseXNlSGFuZGxlciAKLSAqIHRoYXQgd2FzIGV4ZWN1dGVkIC0gdGhleSBhcmUgY2FjaGVkIGFzIG9uZSBvZiB0aGVzZS4KLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bkFuYWx5c2VIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQkvKioKLQkgKiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgY2FjaGVkIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHVibGljIFJ1bkFuYWx5c2VIYW5kbGVyKCl7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBmcm9tIHRoZSBoYW5kbGVyIGV2ZW50LiBJZiBpdCdzIGEgc3RydWN0dXJlZCBzZWxlY3Rpb24KLQkgKiAoZS5nLiByZXNvdXJjZSBpbiB0aGUgcHJvamVjdCBleHBsb3JlcikgdGhlbiByZXR1cm4gaXQuCi0JICogSWYgaXQncyBlLmcuIGEgdGV4dCBzZWxlY3Rpb24gaW4gdGhlIGVkaXRvciwgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0Ci0JICogCi0JICogTm90ZSB0aGF0IHdlICBjYWNoZSB0aGUgbGFzdCBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiAobGlrZSB0aGUgcHJldmlvdXMgImFjdGlvbiIgdmVyc2lvbgotCSAqIG9mIHRoaXMgY2xhc3MpIHNpbmNlIHdlIGRvbid0IGdldCBzZWxlY3Rpb24gY2hhbmdlZCBldmVudHMuCi0JICogSG93ZXZlciwgQW5hbHlzaXNEcm9wRG93bkhhbmRsZXIgZG9lcyBnZXQgdGhlc2UgZXZlbnRzLCBhbmQgaXRzIHZhbHVlCi0JICogd2lsbCBiZSB1c2VkIGlmIEhhbmRlclV0aWwgZG9lc24ndCBoYXZlIGFueSBpbmZvcm1hdGlvbiB5ZXQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogQHJldHVybiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaWYgaXQncyBhIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGUuZy4gaW4gdGhlIG5hdmlnYXRvcgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHsKLQkJSVNlbGVjdGlvbiBjdXJTZWwgPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKGV2ZW50KTsKLQkJaWYgKGN1clNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1clNlbDsKLQkJfQotCQkKLQkJaWYoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IEFuYWx5c2lzRHJvcGRvd25IYW5kbGVyLmdldEluc3RhbmNlKCkuZ2V0TGFzdFNlbGVjdGlvbigpOwotCQl9Ci0JCS8vIElmIHRoZXJlIGlzbid0IGEgY3VycmVudCBzZWxlY3Rpb24gYXBwcm9wcmlhdGUgZm9yIHVzLAotCQkvLyBnZXQgdGhlIGxhc3Qgb25lIHVzZWQgaW4gYW55IGFuYWx5c2lzLgotCQkvLyBTaW5jZSB3ZSBub3cgcmVnaXN0ZXIgYXMgYSBzZWxlY3Rpb24gbGlzdGVuZXIsCi0JCS8vIEkgZG91YnQgdGhpcyBpcyBldmVyIHV0aWxpemVkLgotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IEFuYWx5c2lzRHJvcGRvd25IYW5kbGVyLmdldExhc3RBbmFseXNpc1NlbGVjdGlvbigpOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JCi0JfQotCi0JLyoqCi0JICogQ291bnRzIHRoZSBudW1iZXIgb2YgZmlsZXMgaW4gdGhlIHNlbGVjdGlvbiAobGVhZiBub2RlcyBvbmx5IC0gRmlsZXMgLQotCSAqIG5vdCB0aGUgZGlyZWN0b3JpZXMvY29udGFpbmVycykgPGJyPgotCSAqIE5vdGUgdGhhdCB0aGlzIG1ha2VzIG5vIGRpc3RpbmN0aW9uIGFib3V0IHdoYXQgdHlwZSBvZiBmaWxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBmaWxlcwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBpbnQgY291bnRGaWxlc1NlbGVjdGVkKCkgewotCQlpbnQgY291bnQgPSAwOwotCQkvLyBHZXQgZWxlbWVudHMgb2YgYSBwb3NzaWJsZSBtdWx0aXBsZSBzZWxlY3Rpb24KLQkJSXRlcmF0b3IgaXRlciA9IHRoaXMuc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJLy8gSXQgY2FuIGJlIGEgUHJvamVjdCwgRm9sZGVyLCBGaWxlLCBldGMuLi4KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJZmluYWwgSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKQotCQkJCQkJLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQljb3VudCA9IGNvdW50ICsgY291bnRGaWxlcyhyZXMpOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibnVtYmVyIG9mIGZpbGVzOiAiICsgY291bnQpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogQ291bnQgdGhlIG51bWJlciBvZiBmaWxlcyBpbiB0aGlzIHJlc291cmNlIChmaWxlIG9yIGNvbnRhaW5lcikuCi0JICogCi0JICogQHBhcmFtIHJlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvdW50RmlsZXMoSVJlc291cmNlIHJlcykgewotCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCWludCBjb3VudCA9IDA7Ci0JCi0JCQl0cnkgewotCQkJCUlSZXNvdXJjZVtdIGtpZHMgPSAoKElDb250YWluZXIpIHJlcykubWVtYmVycygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgY2hpbGQgPSBraWRzW2ldOwotCQkJCQljb3VudCA9IGNvdW50ICsgY291bnRGaWxlcyhjaGlsZCk7Ci0JCQkJfQotCQkJCXJldHVybiBjb3VudDsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQkgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JICBwcm90ZWN0ZWQgaW50IGNvdW50RmlsZXNTZWxlY3RlZChTdHJpbmdbXSBleHRzKSB7Ci0JICAgIGludCBjb3VudCA9IDA7Ci0JICAgIGludCBjb3VudEV4dD0wOwotCSAgICAvLyBHZXQgZWxlbWVudHMgb2YgYSBwb3NzaWJsZSBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgICAgSXRlcmF0b3IgaXRlciA9IHRoaXMuc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCSAgICAgIE9iamVjdCBvYmogPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkgICAgICAvLyBJdCBjYW4gYmUgYSBQcm9qZWN0LCBGb2xkZXIsIEZpbGUsIGV0Yy4uLgotCSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JICAgICAgICBmaW5hbCBJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvYmopCi0JICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkgICAgICAgIGNvdW50ID0gY291bnQgKyBjb3VudEZpbGVzKHJlcyxleHRzKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJudW1iZXIgb2YgZmlsZXM6ICIgKyBjb3VudCk7Ci0JICAgIHJldHVybiBjb3VudDsKLQkgIH0KLQkvKioKLQkgKiBjb3VudCBmaWxlcyBlbmRpbmcgaW4gb25lIG9mIHRoZSBnaXZlbiBmaWxlIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICogQHBhcmFtIGV4dHMgYXJyYXkgb2YgZXh0ZW5zaW9ucyBlLmcuICIuaCIsICIuaHBwIiBldGMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGludCBjb3VudEZpbGVzKElSZXNvdXJjZSByZXMsIFN0cmluZ1tdZXh0cykgewotCSAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpcmVzOwotCSAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykgewotICAgICAgICBTdHJpbmcgZXh0ID0gZXh0c1tpXTsKLSAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoZXh0KSl7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCAiK2V4dCsiIGluIGZpbGU6ICIrZmlsZS5nZXROYW1lKCkrIiAgY291bnQrMSIpOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIHJldHVybiAwOyAgLy8gbm90IGZvdW5kCi0KLSAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gIAotICAgICAgdHJ5IHsKLSAgICAgICAgSVJlc291cmNlW10ga2lkcyA9ICgoSUNvbnRhaW5lcikgcmVzKS5tZW1iZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIElSZXNvdXJjZSBjaGlsZCA9IGtpZHNbaV07Ci0gICAgICAgICAgY291bnQgPSBjb3VudCArIGNvdW50RmlsZXMoY2hpbGQsZXh0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9hY3Rpb25zL1J1bkFuYWx5c2VIYW5kbGVyQmFzZS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9hY3Rpb25zL1J1bkFuYWx5c2VIYW5kbGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2E3NzlkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vYWN0aW9ucy9SdW5BbmFseXNlSGFuZGxlckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLkNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5pbmRleC5JSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklDUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3RNYXJraW5nVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5JRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuQW5hbHlzaXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqIFJ1bkFuYWx5c2VCYXNlIC0gcnVuIGFuYWx5c2lzIHRvIGNyZWF0ZSBnZW5lcmljIGFydGlmYWN0IG1hcmtlcnMuIDxicj4KLSAqIFRoZSBhbmFseXNpcyBpcyBkb25lIGluIHRoZSBkb0FydGlmYWN0QW5hbHlzaXMoKSBtZXRob2QKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKiAKLSAqIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSBlbmFibGVzIHBvcHVwIG1lbnUgc2VsZWN0aW9uIDxicj4KLSAqIElXaW5kb3dBY3Rpb25EZWxlZ2F0ZSBlbmFibGVzIHRvb2xiYXIob3IgbWVudSkgc2VsZWN0aW9uCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bkFuYWx5c2VIYW5kbGVyQmFzZSBleHRlbmRzIFJ1bkFuYWx5c2VIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIC8qZmluYWwqLyBib29sZWFuIHRyYWNlT24gPSBmYWxzZTsKLQotCS8qKgotCSAqIGluZGVudCBhbW91bnQgZm9yIGVhY2ggbGV2ZWwgb2YgbmVzdGluZzsgdXNlZnVsIHdoZW4gcHJpbnRpbmcgZGVidWcKLQkgKiBzdGF0ZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVOVF9JTkNSID0gMjsKLQotCXByb3RlY3RlZCBib29sZWFuIGZvcmNlRWNobyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsbGVkQnlVc2VyID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgaW50IGN1bXVsYXRpdmVBcnRpZmFjdHMgPSAwOwotCi0JLyoqIHRoZSB0eXBlIG9mIGFydGlmYWN0IGUuZy4gIk1QSSIgb3IgIk9wZW5NUCIgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ly8gPSAiTVBJIjsKLQotCXByb3RlY3RlZCBBcnRpZmFjdE1hcmtpbmdWaXNpdG9yIHZpc2l0b3I7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcmtlcklEOwotCi0JcHJpdmF0ZSBib29sZWFuIGVyciA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSAiUnVuIEFuYWx5c2lzIiBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgYXJ0aWZhY3QgZS5nLiAiTVBJIiBvciAiT3Blbk1QIgotCSAqIEBwYXJhbSB2aXNpdG9yCi0JICogICAgICAgICAgICB0aGUgdmlzaXRvciB0aGF0IHdpbGwgcHV0IHRoZSBtYXJrZXJzIG9uIHRoZSBzb3VyY2UgZmlsZXMKLQkgKiBAcGFyYW0gbWFya2VySUQKLQkgKiAgICAgICAgICAgIG1hcmtlciBJRAotCSAqLwotCXB1YmxpYyBSdW5BbmFseXNlSGFuZGxlckJhc2UoU3RyaW5nIG5hbWUsIEFydGlmYWN0TWFya2luZ1Zpc2l0b3IgdmlzaXRvciwKLQkJCVN0cmluZyBtYXJrZXJJRCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZpc2l0b3IgPSB2aXNpdG9yOwotCQl0aGlzLm1hcmtlcklEID0gbWFya2VySUQ7Ci0JCQotCQl0cmFjZU9uPUNvbW1vblBsdWdpbi5nZXRUcmFjZU9uKCk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJSdW5BbmFseXNlQmFzZS5jdG9yOiB0cmFjZU9uPSIrdHJhY2VPbik7Ci0JCQotCQkvLyBnZXQgdGhlIG5hdmlnYXRvciwgcHJvamVjdCBleHBsb3JlciwgYy9DKysgcHJvamVjdHMgdmlldywgZXRjCi0JCS8vbmVlZCB0byBnZXQgc2VsZWN0aW9uQ2hhbmdlZCBvbiB0aGF0LCB0byBjYWNoZSB0aGUgbW9zdCByZWNlbnQgc2VsZWN0aW9uIHRoZXJlLAotCQkvLyBvdGhlcndpc2UgSGFuZGVyVXRpbCB3aWxsIHRlbGwgdXMgbGF0ZXN0IHNlbGVjdGlvbiBpbmNsdWRpbmcgb25lcyB3ZSBkb24ndCB3YW50Ci0JCQotCQkKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlpZiAodHJhY2VPbikKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUnVuQW5hbHlzZUJhc2Uuc2V0QWN0aXZlUGFydCgpLi4uIik7Ci0JCXNoZWxsID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyB0aGUgIlJ1biBBbmFseXNpcyIgb24gYSByZXNvdXJjZSAocHJvamVjdCwgZm9sZGVyLCBvciBmaWxlKS4KLQkgKiBEZXNjZW5kcyB0byBhbGwgY2hpbGQgbm9kZXMsIGNvbGxlY3RpbmcgYXJ0aWZhY3RzIG9uIGVhY2guCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh0cmFjZU9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSdW5BbmFseXNlSGFuZGxlckJhc2UucnVuKCkuLi4iKTsKLQotCQljYW5jZWxsZWRCeVVzZXIgPSBmYWxzZTsKLQkJZXJyID0gZmFsc2U7Ci0JCWN1bXVsYXRpdmVBcnRpZmFjdHMgPSAwOwotCQlyZWFkUHJlZmVyZW5jZXMoKTsKLQotCQlmaW5hbCBpbnQgaW5kZW50ID0gMDsKLSAKLQkJaWYgKChzZWxlY3Rpb24gPT0gbnVsbCkgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJTWVzc2FnZURpYWxvZwotCQkJCQkub3Blbldhcm5pbmcobnVsbCwgIk5vIGZpbGVzIHNlbGVjdGVkIGZvciBhbmFseXNpcy4iLAotCQkJCQkJCSJQbGVhc2Ugc2VsZWN0IGEgc291cmNlIGZpbGUgb3IgY29udGFpbmVyIChmb2xkZXIgb3IgcHJvamVjdCkgdG8gYW5hbHl6ZS4iKTsKLQotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJLy8gZ2V0IHByZWZlcmVuY2UgZm9yIGluY2x1ZGUgcGF0aHMKLQkJCWZpbmFsIExpc3Q8U3RyaW5nPiBpbmNsdWRlcyA9IGdldEluY2x1ZGVQYXRoKCk7Ci0JCQlpZiAoYXJlSW5jbHVkZVBhdGhzTmVlZGVkKCkgJiYgaW5jbHVkZXMuaXNFbXB0eSgpKSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJ1bkFuYWx5c2VIYW5kbGVyQmFzZS5ydW4oKSwgbm8gaW5jbHVkZSBwYXRocyBmb3VuZC4iKTsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHNoZWxsLCBuYW1lCi0JCQkJCQkrICIgSW5jbHVkZSBQYXRocyBOb3QgRm91bmQiLAotCQkJCQkJIlBsZWFzZSBmaXJzdCBzcGVjaWZ5IHRoZSAiICsgbmFtZQotCQkJCQkJCQkrICIgaW5jbHVkZSBwYXRocyBpbiB0aGUgUHJlZmVyZW5jZXMgcGFnZS4iKTsKLQotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGJhdGNoIHdzIG1vZGlmaWNhdGlvbnMgKmFuZCogcmVwb3J0IHByb2dyZXNzCi0JCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHdtbyA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQllcnIgPSBydW5SZXNvdXJjZXMobW9uaXRvciwgaW5kZW50LCBpbmNsdWRlcyk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbWRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coCi0JCQkJCQlzaGVsbCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcG1kaWFsb2cucnVuKHRydWUsIHRydWUsIHdtbyk7IC8vIGZvcms9dHJ1ZTsgaWYgZmFsc2UsIG5vdAotCQkJCQkJCQkJCQkJCS8vIGNhbmNlbGFibGUKLQotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQllcnIgPSB0cnVlOwotCQkJCQlUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgcnVubmluZyBhbmFseXNpczogSVRFOiAiCi0JCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBjYXVzZTogIiArIGNhdXNlICsgIiAtICIKLQkJCQkJCQkrIGNhdXNlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQotCQkJCQljYXVzZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNhbmNlbGxlZEJ5VXNlciA9IHRydWU7Ci0JCQkJfQotCi0JCQl9Ly8gZW5kIGVsc2UKLQkJfQotCQlpZiAodHJhY2VPbikKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUnVuQW5hbHlzZUJhc2U6IHJldGQgZnJvbSBydW4gaXRlcmF0b3IsIGVycj0iCi0JCQkJCSsgZXJyKTsKLQkJU3RyaW5nIGFydHNGb3VuZCA9ICJcbk51bWJlciBvZiAiICsgbmFtZSArICIgQXJ0aWZhY3RzIGZvdW5kOiAiCi0JCQkJKyBjdW11bGF0aXZlQXJ0aWZhY3RzOwotCQlpZiAoY2FuY2VsbGVkQnlVc2VyKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihudWxsLCAiUGFydGlhbCBBbmFseXNpcyBDb21wbGV0ZS4iLAotCQkJCQkiUGFydGlhbCBBbmFseXNpcyBjb21wbGV0ZS4gIENhbmNlbGxlZCBieSBVc2VyLiIKLQkJCQkJCQkrIGFydHNGb3VuZCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gIioqKkFuYWx5c2lzIGlzIGNvbXBsZXRlLiI7Ci0JCQlpZiAoIWVycikgewotCQkJCVN0cmluZyBrZXkgPSBJRHMuU0hPV19BTkFMWVNJU19DT05GSVJNQVRJT047Ci0JCQkJSVByZWZlcmVuY2VTdG9yZSBwZiA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlib29sZWFuIHNob3dEaWFsb2cgPSBwZgotCQkJCQkJLmdldEJvb2xlYW4oSURzLlNIT1dfQU5BTFlTSVNfQ09ORklSTUFUSU9OKTsKLQkJCQlpZiAoc2hvd0RpYWxvZykgewotCQkJCQlTdHJpbmcgdGl0bGUgPSAiQW5hbHlzaXMgY29tcGxldGUuIjsKLQkJCQkJU3RyaW5nQnVmZmVyIHNNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKGN1bXVsYXRpdmVBcnRpZmFjdHMgKyAiICIgKyBuYW1lCi0JCQkJCQkJKyAiIEFydGlmYWN0cyBmb3VuZCIpOwotCQkJCQkvLyBwcm92aWRlIHNvbWUgZXhwbGFuYXRpb24gb2Ygd2h5IHBlcmhhcHMgbm8gYXJ0aWZhY3RzIHdlcmUgZm91bmQuCi0JCQkJCS8vIE5vdGU6IHNob3VsZCB0aGlzIHBlcmhhcHMgYmUgaW4gYSAiRGV0YWlscyIgc2VjdGlvbiBvZiB0aGUgZGlhbG9nPwotCQkJCQlpZihjdW11bGF0aXZlQXJ0aWZhY3RzPT0wKSB7Ci0JCQkJCQlzTXNnLmFwcGVuZCgiXG5cbiIpLmFwcGVuZChuYW1lKS5hcHBlbmQoIiBBcnRpZmFjdHMgYXJlIGRlZmluZWQgYXMgQVBJcyBmb3VuZCBpbiB0aGUgaW5jbHVkZSBwYXRoIHNwZWNpZmllZCBpbiB0aGUgIik7Ci0JCQkJCQlzTXNnLmFwcGVuZChuYW1lKS5hcHBlbmQoIiBwcmVmZXJlbmNlcy4gIFRoZSBzYW1lIGluY2x1ZGUgcGF0aCBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzLCAiKTsKLQkJCQkJCXNNc2cuYXBwZW5kKCJyZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGEgYnVpbGQgY29tbWFuZCAoZS5nLiBtcGljYykgaW1wbGljaXRseSBkb2VzIHRoaXMgZm9yIGNvbXBpbGF0aW9uLiIpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyB0b2dNc2cgPSAiRG9uJ3Qgc2hvdyBtZSB0aGlzIGFnYWluIjsKLQkJCQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUub3BlbkluZm9ybWF0aW9uKHNoZWxsLCB0aXRsZSwgc01zZy50b1N0cmluZygpLAotCQkJCQkJCXRvZ01zZywgZmFsc2UsIHBmLCBrZXkpOwotCQkJCQlzaG93U3RhdHVzTWVzc2FnZShzTXNnLnRvU3RyaW5nKCksICJSdW5BbmFseXNlQmFzZS5ydW4oKSIpOwotCQkJCX0KLQkJCQlhY3RpdmF0ZVByb2JsZW1zVmlldygpOwotCQkJCWFjdGl2YXRlQXJ0aWZhY3RWaWV3KCk7Ci0JCQl9IGVsc2UgeyAvLyBlcnJvciBvY2N1cnJlZAotCQkJCXNob3dTdGF0dXNNZXNzYWdlKG1zZywgIlJ1bkFuYWx5c2VCYXNlLnJ1bigpIGVycm9yIik7Ci0JCQkJbXNnID0gIkFuYWx5c2lzIGNvbXBsZXRlZCB3aXRoIGVycm9ycyI7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobnVsbCwgIkFuYWx5c2lzIGNvbXBsZXRlZCB3aXRoIGVycm9ycyIsCi0JCQkJCQltc2cgKyBhcnRzRm91bmQpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSdW4gdGhlIGFuYWx5c2lzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoZmlsZSwgY29udGFpbmVyLCBvcgotCSAqIG11bHRpcGxlLXNlbGVjdGlvbikKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgcHJvZ3Jlc3MgbW9uaXRvciBvbiB3aGljaCB0byByZXBvcnQgcHJvZ3Jlc3MuCi0JICogQHBhcmFtIGluZGVudAotCSAqICAgICAgICAgICAgaW5kZW50IGFtb3VudCwgaW4gbnVtYmVyIG9mIHNwYWNlcywgdXNlZCBvbmx5IGZvciBkZWJ1ZwotCSAqICAgICAgICAgICAgcHJpbnRpbmcuCi0JICogQHBhcmFtIGluY2x1ZGVzCi0JICogQHJldHVybiB0cnVlIGlmIGFueSBlcnJvcnMgd2VyZSBmb3VuZC4KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIG9uIEl0ZXJhdG9yCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuUmVzb3VyY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IGluZGVudCwKLQkJCUxpc3Q8U3RyaW5nPiBpbmNsdWRlcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBmb3VuZEVycm9yID0gZmFsc2U7Ci0JCS8vIEZpcnN0LCBjb3VudCBmaWxlcyBzbyB3ZSBrbm93IGhvdyBtdWNoIHdvcmsgdG8gZG8uCi0JCS8vIG5vdGUgdGhpcyBpcyBudW1iZXIgb2YgZmlsZXMgb2YgYW55IHR5cGUsIG5vdCBuZWNlc3NhcmlseSBudW1iZXIgb2YKLQkJLy8gZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLgotCQlpbnQgY291bnQgPSBjb3VudEZpbGVzU2VsZWN0ZWQoKTsKLQotCQltb25pdG9yLmJlZ2luVGFzaygiQW5hbHlzaXMiLCBjb3VudCk7Ci0JCS8vIEdldCBlbGVtZW50cyBvZiBhIHBvc3NpYmxlIG11bHRpcGxlIHNlbGVjdGlvbgotCQlJdGVyYXRvcjxJU3RydWN0dXJlZFNlbGVjdGlvbj4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCS8vIHRoaXMgaXMgdXN1YWxseSBjYXVnaHQgaGVyZSB3aGlsZSBwcm9jZXNzaW5nCi0JCQkJLy8gbXVsdGlwbGUtc2VsZWN0aW9uIG9mIGZpbGVzCi0JCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ly8gcGllY2Ugb2Ygc2VsZWN0aW9uCi0JCQkvLyBJdCBjYW4gYmUgYSBQcm9qZWN0LCBGb2xkZXIsIEZpbGUsIGV0Yy4uLgotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQkvLyBJQ0VsZW1lbnQgY292ZXJzIGZvbGRlcnMgYW5kIHRyYW5zbGF0aW9udW5pdHMKLQkJCQlmaW5hbCBJQ0VsZW1lbnQgY2UgPSAoSUNFbGVtZW50KSAoKElBZGFwdGFibGUpIG9iaikKLQkJCQkJCS5nZXRBZGFwdGVyKElDRWxlbWVudC5jbGFzcyk7Ly8gY2R0NDAKLQkJCQlpZiAoY2UgIT0gbnVsbCkgewotCQkJCQkvLyBjZHQ0MAotCQkJCQkvLyBJQVNUVHJhbnNsYXRpb25Vbml0IGF0dSA9IHR1LmdldEFTVCgpOyBub3QgeWV0Ci0JCQkJCWJvb2xlYW4gZXJyID0gcnVuUmVzb3VyY2UobW9uaXRvciwgY2UsIGluZGVudCwgaW5jbHVkZXMpOwotCQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgKGVycj0iK2VycisiKXJ1bm5pbmcgYW5hbHlzaXMgb24gIitjZS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gZm91bmRFcnJvcjsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUFydGlmYWN0VmlldygpOwotCi0JLyoqCi0JICogSWYgdGhlIGFuYWx5c2lzIGhhcyBhbiBhZGRpdGlvbmFsIHZpZXcgdG8gYnJpbmcgdXAsIG92ZXJyaWRlIHRoaXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVByb2JsZW1zVmlldygpe30KLQotCS8qKgotCSAqIEdldCB0aGUgaW5jbHVkZSBwYXRoLiBTdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZVBhdGgoKTsKLQotCS8qKgotCSAqIFNob3cgc29tZXRoaW5nIGluIHRoZSBzdGF0dXMgbGluZTsgdGhpcyBpcyB1c2VkIHdoZW4gd2UgZG9uJ3QgaGF2ZSBlYXN5Ci0JICogYWNjZXNzIHRvIHRoZSB2aWV3IGZvciBnZXR0aW5nIHRoZSBTdGF0dXNMaW5lTWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBkZWJ1Z01lc3NhZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2hvd1N0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWJ1Z01lc3NhZ2UpIHsKLQkJaWYgKGZhbHNlKSB7Ci0JCQltZXNzYWdlICs9ICIgLSAiOwotCQkJbWVzc2FnZSArPSBkZWJ1Z01lc3NhZ2U7Ci0JCX0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3dy5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UmVmZXJlbmNlW10gdmlld1JlZnMgPSBwYWdlLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdmlld1JlZnMubGVuZ3RoOyBqKyspIHsKLQkJCUlWaWV3UmVmZXJlbmNlIHJlZmVyZW5jZSA9IHZpZXdSZWZzW2pdOwotCQkJSVZpZXdQYXJ0IHZwID0gcmVmZXJlbmNlLmdldFZpZXcoZmFsc2UpOwotCQkJaWYgKHZwICE9IG51bGwpCi0JCQkJdnAuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJlYWQgcHJlZmVyZW5jZXMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZvcmNlRWNobyA9IHByZWYuZ2V0Qm9vbGVhbihJRHMuUF9FQ0hPX0ZPUkNFKTsKLQotCX0KLQotCS8qKgotCSAqIFJ1biBhbmFseXNpcyBvbiBhIHJlc291cmNlIChlLmcuIEZpbGUgb3IgRm9sZGVyKSBXaWxsIGRlc2NlbmQgdG8gbWVtYmVycwotCSAqIG9mIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBhdHUKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZQotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBsZXZlbHMgb2YgbmVzdGluZy9yZWN1cnNpb24gZm9yIHByZXR0eXByaW50aW5nCi0JICogQHBhcmFtIGluY2x1ZGVzCi0JICogICAgICAgICAgICBjb250YWlucyBoZWFkZXIgZmlsZXMgaW5jbHVkZSBwYXRocyBmcm9tIHRoZSBQcmVmZXJlbmNlIHBhZ2UKLQkgKiBAcmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1blJlc291cmNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUNFbGVtZW50IGNlLAotCQkJaW50IGluZGVudCwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpbmRlbnQgKz0gSU5ERU5UX0lOQ1I7Ci0JCVNjYW5SZXR1cm4gcmVzdWx0czsKLQkJYm9vbGVhbiBmb3VuZEVycm9yID0gZmFsc2U7Ci0KLQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJaWYgKGNlIGluc3RhbmNlb2YgSVRyYW5zbGF0aW9uVW5pdCkgewotCQkJCUlSZXNvdXJjZSByZXMgPSBjZS5nZXRSZXNvdXJjZSgpOyAvLyBudWxsIGlmIG5vdCBwYXJ0IG9mIEMKLQkJCQkJCQkJCQkJCQkvLyBwcm9qZWN0IGluIHdzCi0JCQkJLy8gY2R0NDA6IGV2ZW50dWFsbHkgc2hkIGJlIGFibGUgdG8gZGVhbCB3aXRoIGp1c3QgdHU7Ci0JCQkJLy8gdHUuZ2V0UmVzb3VyY2UoKSBjYW4gYWx3YXlzIHdvcmsgbGF0ZXIuLi4KLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsvL3NoZCBhbHdheXMgYmUgdHJ1ZSAoYnV0IG1pZ2h0IGJlIG51bGwpCi0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlczsKLQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkJCS8vU3RyaW5nIGZuMiA9IGNlLmdldEVsZW1lbnROYW1lKCk7Ly8gc2hkIGJlIGZpbGVuYW1lIHRvbwotCQkJCQkJCQkJCQkJCQkvLyBjZHQ0MAotCQkJCSAgICBib29sZWFuIGNwcCA9IGlzQ1BQcHJvamVjdChjZSk7Ci0JCQkJICAgIC8vaWYgKEFuYWx5c2lzVXRpbC52YWxpZEZvckFuYWx5c2lzKGZpbGVuYW1lLGNwcCkpIHsKLQkJCQkgICAgCi0JCQkJCWlmICh2YWxpZEZvckFuYWx5c2lzKGZpbGVuYW1lLGNwcCkpIHsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCXByaW50bG4oZ2V0U3BhY2VzKGluZGVudCkgKyAiZmlsZTogIiArIGZpbGVuYW1lKTsKLQkJCQkJCXJlc3VsdHMgPSBhbmFseXNlKG1vbml0b3IsIChJVHJhbnNsYXRpb25Vbml0KSBjZSwKLQkJCQkJCQkJaW5jbHVkZXMpOwotCi0JCQkJCQlmb3VuZEVycm9yID0gZm91bmRFcnJvciB8fCByZXN1bHRzID09IG51bGwKLQkJCQkJCQkJfHwgcmVzdWx0cy53YXNFcnJvcigpOwotCQkJCQkJaWYgKGZvdW5kRXJyb3IpIHsKLQkJCQkJCQlpbnQgc3RvcEhlcmUgPSAwOwotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgZXJyb3Igb24gIgotCQkJCQkJCQkJKyBmaWxlLmdldE5hbWUoKSArICIgIiArIHN0b3BIZXJlKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCXByaW50bG4oIioqKioqKioqIFJ1bkFuYWx5c2VCYXNlLCBhbmFseXNpcyBjb21wbGV0ZTsgU2NhblJldHVybj0iCi0JCQkJCQkJCQkrIHJlc3VsdHMpOwotCQkJCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotCQkJCQkJCS8vIGFwcGx5IG1hcmtlcnMgdG8gdGhlIGZpbGUKLQkJCQkJCQlwcm9jZXNzUmVzdWx0cyhyZXN1bHRzLCBmaWxlKTsKLQkJCQkJCX0KLQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJcHJpbnRsbihnZXRTcGFjZXMoaW5kZW50KQotCQkJCQkJCQkJKyAiLS0tb21pdDogbm90IHZhbGlkIGZpbGU6ICIgKyBmaWxlbmFtZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZvdW5kRXJyb3I7Ci0JCQkJfQotCQkJfQotCi0JCQllbHNlIGlmIChjZSBpbnN0YW5jZW9mIElDQ29udGFpbmVyKSB7Ci0JCQkJSUNDb250YWluZXIgY29udGFpbmVyID0gKElDQ29udGFpbmVyKSBjZTsKLQkJCQl0cnkgewotCQkJCQlJQ0VsZW1lbnRbXSBtZW1zID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJLy8gdGhpcyBpcyB1c3VhbGx5IGhpdCB3aGlsZSBwcm9jZXNzaW5nIG5vcm1hbAotCQkJCQkJCS8vIGFuYWx5c2lzIG9mIGUuZy4gY29udGFpbmVyCi0JCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIGVyciA9IHJ1blJlc291cmNlKG1vbml0b3IsIG1lbXNbaV0sIGluZGVudCwKLQkJCQkJCQkJaW5jbHVkZXMpOwotCQkJCQkJZm91bmRFcnJvciA9IGZvdW5kRXJyb3IgfHwgZXJyOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJZWxzZSBpZiAoY2UgaW5zdGFuY2VvZiBJQ1Byb2plY3QpIHsKLQkJCQlJQ1Byb2plY3QgcHJvaiA9IChJQ1Byb2plY3QpIGNlOwotCQkJCXRyeSB7Ci0JCQkJCUlDRWxlbWVudFtdIG1lbXMgPSBwcm9qLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJLy8gdGhpcyBpcyB1c3VhbGx5IGhpdCB3aGlsZSBwcm9jZXNzaW5nIG5vcm1hbAotCQkJCQkJCS8vIGFuYWx5c2lzIG9mIGUuZy4gY29udGFpbmVyCi0JCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIGVyciA9IHJ1blJlc291cmNlKG1vbml0b3IsIG1lbXNbaV0sIGluZGVudCwKLQkJCQkJCQkJaW5jbHVkZXMpOwotCQkJCQkJZm91bmRFcnJvciA9IGZvdW5kRXJyb3IgfHwgZXJyOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQkJCQotCQkJfQotCQkJLy8gY29udGFpbmVyIGNvdWxkIGJlIHByb2plY3Qgb3IgZm9sZGVyCQkKLQkJfSAvLyBlbmQgaWYgIW1vbml0b3IuaXNDYW5jZWxlZCgpCi0JCWVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSAiIjsKLQkJCS8vY2R0NDAKLQkJCQluYW1lID0gY2UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkvL1N0cmluZyBwPWNlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5jZWxsZWQgYnkgVXNlciwgYWJvcnRpbmcgYW5hbHlzaXMgb24gc3Vic2VxdWVudCBmaWxlcy4uLiAiCi0JCQkJCQkJKyBuYW1lKTsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGZvdW5kRXJyb3I7Ci0JfQotLyoqCi0gKiBEZXRlcm1pbmUgaWYgdGhlIHByb2plY3QgaXMgYSBDKysgcHJvamVjdAotICogQHBhcmFtIGNlIHRoZSBJQ0VsZW1lbnQgcmVwcmVzZW50aW5nIGEgZmlsZSAKLSAqIEByZXR1cm4KLSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NQUHByb2plY3QoSUNFbGVtZW50IGNlKSB7Ci0gICAgSVByb2plY3QgcCA9IGNlLmdldENQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotICAgIHRyeSB7Ci0gICAgICBJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBwLmdldE5hdHVyZSgib3JnLmVjbGlwc2UuY2R0LmNvcmUuY2NuYXR1cmUiKTsKLSAgICAgIGlmKG5hdHVyZSE9bnVsbCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVzdWx0cyhTY2FuUmV0dXJuIHJlc3VsdHMsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlMaXN0PEFydGlmYWN0PiBhcnRpZmFjdHMgPSByZXN1bHRzLmdldEFydGlmYWN0TGlzdCgpOwotCQl2aXNpdG9yLnZpc2l0RmlsZShyZXNvdXJjZSwgYXJ0aWZhY3RzKTsKLQl9Ci0KLQotCi0JcHVibGljIFNjYW5SZXR1cm4gYW5hbHlzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElUcmFuc2xhdGlvblVuaXQgdHUsCi0JCQlMaXN0PFN0cmluZz4gaW5jbHVkZXMpIHsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludGxuKCJSdW5BbmFseXNlQmFzZS5hbmFseXNlKCkuLi4iKTsKLQkJLy9TY2FuUmV0dXJuIG5yID0gbnVsbDsKLQkJU3RyaW5nIGVyck1zZyA9IG51bGw7Ci0KLQkJbW9uaXRvci5zdWJUYXNrKCJTdGFydGluZyBBbmFseXNpcy4uLiIpOwotCi0JCS8vIGZ1bGx5IHF1YWxpZmllZCBmaWxlIGxvY2F0aW9uCi0JCS8vIFN0cmluZyByYXdQYXRoID0gdHUuZ2V0UmF3TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlTdHJpbmcgcmF3UGF0aCA9IHR1LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsvLyBjZHQ0MAotCQlpZiAodHJhY2VPbikKLQkJCXByaW50bG4oIlJ1bkFuYWx5c2VCYXNlOiAgICAgICAgICAgICAgZmlsZSA9ICIgKyB0dS5nZXRMb2NhdGlvbigpKTsKLQotCQltb25pdG9yLnN1YlRhc2soIiBvbiAiICsgcmF3UGF0aCk7Ci0JCS8vIGRpZCB0dSBwYXJzZSB3L28gZXJyb3JzPyAgSWYgd2UgY2FuIGRldGVybWluZSB0aGF0LCB3ZSBjYW4KLQkJLy8gd2FybiB1c2VyOyBvdGhlcndpc2UgT3Blbk1QIGFuYWx5c2lzIHdpbGwsIGZvciBleGFtcGxlLCAiZmluaXNoIHdpdGggZXJyb3JzIgotCQkvLyBlLmcuIGlmIGhlYWRlciBmaWxlIGNhbid0IGJlIGZvdW5kLgotCQkvKgotCQl0cnkgewotICAgICAgSUFTVFByb2JsZW1bXSBwcm9ibGVtcyAgPSBDUFBWaXNpdG9yLmdldFByb2JsZW1zKHR1LmdldEFTVCgpKTsKLSAgICAgIElBU1RQcm9ibGVtW10gcHJvYmxlbXMyID0gQ1Zpc2l0b3IuZ2V0UHJvYmxlbXModHUuZ2V0QVNUKCkpOwotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0JCSovCi0JCVNjYW5SZXR1cm4gc2NhblJldHVybiA9IGRvQXJ0aWZhY3RBbmFseXNpcyh0dSwgaW5jbHVkZXMpOwotCQltb25pdG9yLndvcmtlZCgxKTsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludGxuKCJBcnRpZmFjdCBhbmFseXNpcyBjb21wbGV0ZS4uLiIpOwotCQlpbnQgbnVtQXJ0aWZhY3RzID0gc2NhblJldHVybi5nZXRBcnRpZmFjdExpc3QoKS5zaXplKCk7Ci0JCWN1bXVsYXRpdmVBcnRpZmFjdHMgPSBjdW11bGF0aXZlQXJ0aWZhY3RzICsgbnVtQXJ0aWZhY3RzOwotCi0JCWlmICh0cmFjZU9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdHMgZm91bmQgZm9yICIKLQkJCQkJKyB0dS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICI6ICIgKyBudW1BcnRpZmFjdHMpOwotCQlpZiAodHJhY2VPbikKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgVG90YWwgIyBmb3VuZDogIiArIGN1bXVsYXRpdmVBcnRpZmFjdHMpOwotCi0JCWlmIChzY2FuUmV0dXJuID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2NhblJldHVybiByZXN1bHQgaXMgTlVMTC4gIE5vIHJlc3VsdHMgZm9yICIKLQkJCQkJKyB0dS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQllcnJNc2cgPSAiRXJyb3I6IE5vIHJlc3VsdHMgd2VyZSByZXR1cm5lZCBmcm9tIGFuYWx5c2lzIG9mICIKLQkJCQkJKyB0dS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiRXJyb3IgaW4gQW5hbHlzaXMiLCBlcnJNc2cpOwotCQl9IGVsc2UgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSdW5BbmFseXplQmFzZTogU2NhblJldHVybiByZWNlaXZlZCBmb3IgIgotCQkJCQkJKyB0dS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfQotCi0JCWlmIChzY2FuUmV0dXJuICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gd2FzRXJyb3IgPSBzY2FuUmV0dXJuLndhc0Vycm9yKCk7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImVycm9yIG9jY3VycmVkID0iICsgd2FzRXJyb3IpOwotCQkJaWYgKHdhc0Vycm9yKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSdW5BbmFseXNlQmFzZS5hbmFseXNlLi4uRXJyb3IuLi4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2NhblJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gYSBzdHJpbmcgb2Ygc3BhY2VzIG9mIGEgY2VydGFpbiBsZW5ndGgKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byByZXR1cm4gKHVzZWQgZm9yIHN1Y2Nlc3NpdmVseQotCSAqICAgICAgICAgICAgaW5kZW50aW5nIGRlYnVnIHN0YXRlbWVudHMgYmFzZWQgb24gZGVwdGggb2YgbmVzdGluZykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0VTID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQotCXByaXZhdGUgU3RyaW5nIGdldFNwYWNlcyhpbnQgaW5kZW50KSB7Ci0JCVN0cmluZyBpbmRlbnRTcGFjZSA9ICIiOwotCQl0cnkgewotCQkJaW5kZW50U3BhY2UgPSBTUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCk7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcHJpbnRsbigiUnVuQW5hbHlzZUJhc2U6IE5lc3RpbmcgbGV2ZWwgIiArIGluZGVudAotCQkJCQkrICIgZXhjZWVkcyBwcmludCBpbmRlbnQ7IElOQ1IgYXQgZWFjaCBsZXZlbCBpcyAiCi0JCQkJCSsgSU5ERU5UX0lOQ1IpOwotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gaW5kZW50U3BhY2U7Ci0JfQotCi0JLyoqCi0JICogcHJpbnQgdG8gbG9nCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqLwotCXZvaWQgcHJpbnRsbihTdHJpbmcgc3RyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCX0KLQotCS8qKgotCSAqIFdlIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gZGlzcG9zZSBvZiBhbnkgc3lzdGVtIHJlc291cmNlcyB3ZSBwcmV2aW91c2x5Ci0JICogYWxsb2NhdGVkLgotCSAqIAotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UgaW1wbGVtZW50ZWQgZm9yIHRvb2xiYXIKLQkgKiAgICAgIGVuYWJsZW1lbnQgb2YgdGhpcyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIENhY2hlIHRoZSB3aW5kb3cgb2JqZWN0IHRvIGJlIGFibGUgdG8gcHJvdmlkZSBwYXJlbnQgc2hlbGwgZm9yIHRoZQotCSAqIG1lc3NhZ2UgZGlhbG9nLgotCSAqIAotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQgaW1wbGVtZW50ZWQgZm9yIHRvb2xiYXIKLQkgKiAgICAgIGVuYWJsZW1lbnQgb2YgdGhpcyBhY3Rpb24gTk9URTogd2luZG93IG9iamVjdCB3aWxsIHRodXMgYmUgbnVsbCBmb3IKLQkgKiAgICAgIGNvbnRleHQgbWVudSB1c2UhISBzby4uLndlIGFyZSBub3QgdXNpbmcgdGhpcywgdXNpbmcKLQkgKiAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpIGFuZCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZSBhIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2Ygd2hhdCB3aWxsIGJlIGFuYWx5emVkLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGluZGljYXRpbmcgd2hhdCBpdCBpcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmFjZWROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHByZWZhY2UgPSAiIjsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGb2xkZXIpCi0JCQlwcmVmYWNlID0gIkNvbnRlbnRzIG9mIEZvbGRlcjogIjsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlwcmVmYWNlID0gIkNvbnRlbnRzIG9mIFByb2plY3Q6ICI7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKQotCQkJcHJlZmFjZSA9ICJTb3VyY2UgZmlsZTogIjsKLQkJU3RyaW5nIHJlcyA9IHByZWZhY2UgKyAoKElSZXNvdXJjZSkgb2JqKS5nZXROYW1lKCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhcnRpZmFjdCBhbmFseXNpcyBmb3IgZmlsZS4gPGJyPgotCSAqIERlcml2ZWQgY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0dQotCSAqIEBwYXJhbSBpbmNsdWRlcwotCSAqICAgICAgICAgICAgaGVhZGVyIGZpbGVzIGluY2x1ZGUgcGF0aHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFNjYW5SZXR1cm4gZG9BcnRpZmFjdEFuYWx5c2lzKGZpbmFsIElUcmFuc2xhdGlvblVuaXQgdHUsCi0JCQlmaW5hbCBMaXN0PFN0cmluZz4gaW5jbHVkZXMpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGluY2x1ZGUgcGF0aHMgbXVzdCBiZSBzZXQgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uIEZvcgotCSAqIGV4YW1wbGUsIEMgbmVlZHMgaW5jbHVkZSBwYXRocywgYnV0IEZvcnRyYW4gZG9lc24ndC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcmVJbmNsdWRlUGF0aHNOZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBJbXBsZW1lbnRlZCBmb3IgSGFuZGxlcjsgdGhpcyByZXBsYWNlcyBydW4oKSB3aGljaCBpcyBmb3IgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUnVuQW5hbHlzZUhhbmRsZXJCYXNlLmV4ZWN1dGUoKS4uLiIpOwotCQlnZXRTZWxlY3Rpb24oZXZlbnQpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0aW9uOiAiK3NlbGVjdGlvbik7Ci0JCXJ1bigpOwotCQlBbmFseXNpc0Ryb3Bkb3duSGFuZGxlci5zZXRMYXN0SGFuZGxlZEFuYWx5c2lzKHRoaXMsIHNlbGVjdGlvbik7Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEZWZhdWx0IGRldGVybWluYXRpb24gb2YgaWYgYSBnaXZlbiBmaWxlbmFtZSBpcyB2YWxpZCBmb3Igb3VyIGFydGlmYWN0IGFuYWx5c2lzCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGlzQ1BQICBpcyB0aGUgcHJvamVjdCBhIEMrKyBwcm9qZWN0IG9yIG5vdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZEZvckFuYWx5c2lzKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBpc0NQUCkgewotCQlyZXR1cm4gQW5hbHlzaXNVdGlsLnZhbGlkRm9yQW5hbHlzaXMoZmlsZW5hbWUsaXNDUFApOwotCX0KLQotICAvKioKLSAgICogR2V0IEFTVCBmcm9tIGluZGV4LCBub3QgZnVsbCB0dQotICAgKiBAcGFyYW0gdHUgdHJhbnNsYXRpb24gdW5pdCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgQVNUCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBJQVNUVHJhbnNsYXRpb25Vbml0IGdldEFTVChJVHJhbnNsYXRpb25Vbml0IHR1KSB7Ci0gICAgSUluZGV4IGluZGV4OwotICAgIHRyeSB7Ci0gICAgICBpbmRleCA9IENDb3JlUGx1Z2luLmdldEluZGV4TWFuYWdlcigpLmdldEluZGV4KHR1LmdldENQcm9qZWN0KCkpOwotICAgICAgSUFTVFRyYW5zbGF0aW9uVW5pdCBhc3QgPSB0dS5nZXRBU1QoaW5kZXgsIElUcmFuc2xhdGlvblVuaXQuQVNUX1NLSVBfQUxMX0hFQURFUlMpOwotICAgICAgLy9JQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVChpbmRleCwgMCk7Ci0gICAgICBpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGdldEFTVChpbmRleCxBU1RfU0tJUF9BTExfSEVBREVSUykiKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGFzdDsKLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgIENvbW1vblBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwiUnVuQW5hbHlzZU1QSUNvbW1hbmRIYW5kbGVyLmdldEFTVCgpOkVycm9yIGdldHRpbmcgQVNUIChmcm9tIGluZGV4KSBmb3IgcHJvamVjdCAiK3R1LmdldENQcm9qZWN0KCkpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vYW5hbHlzaXMvUGxkdEFzdFZpc2l0b3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vYW5hbHlzaXMvUGxkdEFzdFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1NTc2MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2FuYWx5c2lzL1BsZHRBc3RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uSU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURmlsZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVElkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RMaXRlcmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RNYWNyb0V4cGFuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3Nvck1hY3JvRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5jLkNBU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uU2NhblJldHVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5Tb3VyY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBkb20td2Fsa2VyIGhlbHBlciBjb2xsZWN0cyBpbnRlcmVzdGluZyBjb25zdHJ1Y3RzIChjdXJyZW50bHkKLSAqIGZ1bmN0aW9uIGNhbGxzIGFuZCBjb25zdGFudHMpLCBhbmQgYWRkcyBtYXJrZXJzIHRvIHRoZSBzb3VyY2UgZmlsZSBmb3IKLSAqIEMvQysrIGNvZGUuIDxicj4KLSAqIFRoaXMgYmFzZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGNvbW1vbiBiZWhhdmlvcnMgZm9yIGJvdGggQyBhbmQgQysrCi0gKiBjb2RlIGFuZCBmb3IgdmlzaXRvcnMgbG9va2luZyBmb3IgTVBJLCBPcGVuTVAsIExBUEksIGV0Yy4gZXRjLiB0eXBlcyBvZiBhcnRpZmFjdHMKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBsZHRBc3RWaXNpdG9yIGV4dGVuZHMgQ0FTVFZpc2l0b3IgewotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBBUlRJRkFDVF9DQUxMID0gIkFydGlmYWN0IENhbGwiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEFSVElGQUNUX0NPTlNUQU5UID0gIkFydGlmYWN0IENvbnN0YW50IjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBBUlRJRkFDVF9OQU1FID0gIkFydGlmYWN0IE5hbWUiOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFBSRUZJWCA9ICIiOwotCXByaXZhdGUgc3RhdGljIC8qZmluYWwqLyBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb250QXNrVG9Nb2RpZnlJbmNsdWRlUGF0aEFnYWluPWZhbHNlOwotCi0JLyoqCi0JICogTGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgd2UnbGwgcHJvYmFibHkgd2FudCB0byBjb25zaWRlciBpbiB0aGUgd29yayB0aGF0IHRoaXMgdmlzaXRvciBkb2VzLgotCSAqIEZvciBleGFtcGxlLCBvbmx5IHBhdGhzIGZvdW5kIGluIHRoaXMgbGlzdCAoc3BlY2lmaWVkIGluIFBMRFQgcHJlZmVyZW5jZXMpIHdvdWxkIGJlIGNvbnNpZGVyZWQKLQkgKiB0byBiZSBhIHBhdGggZnJvbSB3aGljaCBkZWZpbml0aW9ucyBvZiAiQXJ0aWZhY3RzIiB3b3VsZCBiZSBmb3VuZC4KLQkgKiA8YnI+Ci0JICogTm90ZSB0aGF0IHRoaXMgY2FuIG5vdyBiZSBkeW5hbWljYWxseSBtb2RpZmllZCBkdXJpbmcgYXJ0aWZhY3QgYW5hbHlzaXMsIHRodXMgbm8gbG9uZ2VyIGZpbmFsCi0JICovCi0JcHJpdmF0ZSAvKmZpbmFsKi8gTGlzdDxTdHJpbmc+IGluY2x1ZGVzXzsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsKLQlwcml2YXRlIGZpbmFsIFNjYW5SZXR1cm4gc2NhblJldHVybjsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgd2UnbGwgcHJvYmFibHkgd2FudCB0byBjb25zaWRlciBpbgotCSAqICAgICAgICAgICAgdGhlIHdvcmsgdGhhdCB0aGlzIHZpc2l0b3IgZG9lcwotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB0aGlzIHZpc2l0b3IgaXMgdmlzaXRpbmcoPykKLQkgKiBAcGFyYW0gc2NhblJldHVybgotCSAqICAgICAgICAgICAgdGhlIFNjYW5SZXR1cm4gb2JqZWN0IHRvIHdoaWNoIHRoZSBhcnRpZmFjdHMgdGhhdCB3ZSBmaW5kIHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGFwcGVuZGVkLgotCSAqLwotCXB1YmxpYyBQbGR0QXN0VmlzaXRvcihMaXN0PFN0cmluZz4gaW5jbHVkZXMsIFN0cmluZyBmaWxlTmFtZSwgU2NhblJldHVybiBzY2FuUmV0dXJuKSB7Ci0JCXRoaXMuaW5jbHVkZXNfID0gaW5jbHVkZXM7Ci0JCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJdGhpcy5zY2FuUmV0dXJuID0gc2NhblJldHVybjsKLQkJZG9udEFza1RvTW9kaWZ5SW5jbHVkZVBhdGhBZ2Fpbj1mYWxzZTsKLQkJaWYoIXRyYWNlT24pIHRyYWNlT249Q29tbW9uUGx1Z2luLmdldFRyYWNlT24oKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlBsZHRBc3RWaXNpdG9yLCB0cmFjZU9uPSIrdHJhY2VPbik7Ci0JfQotCi0JLyoqCi0JICogU2tpcCBzdGF0ZW1lbnRzIHRoYXQgYXJlIGluY2x1ZGVkLgotCSAqLwotCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsgCi0JCWlmIChwcmVwcm9jZXNzb3JJbmNsdWRlZChzdGF0ZW1lbnQpKSB7Ci0JCQlyZXR1cm4gQVNUVmlzaXRvci5QUk9DRVNTX1NLSVA7Ci0JCX0KLQkJcmV0dXJuIEFTVFZpc2l0b3IuUFJPQ0VTU19DT05USU5VRTsgCi0JfQotCi0JLyoqCi0JICogU2tpcCBkZWNscyB0aGF0IGFyZSBpbmNsdWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjbGFyYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCB2aXNpdChJQVNURGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsvL2NhbGxlZDsgYm90aCBwYXRocyBnZXQgdGFrZW4KLQkJaWYgKHByZXByb2Nlc3NvckluY2x1ZGVkKGRlY2xhcmF0aW9uKSkgewotCQkJcmV0dXJuIEFTVFZpc2l0b3IuUFJPQ0VTU19TS0lQOwotCQl9Ci0JCXJldHVybiBBU1RWaXNpdG9yLlBST0NFU1NfQ09OVElOVUU7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyBhIGZ1bmN0aW9uIG5hbWUgZnJvbSBhbiBleHByZXNzaW9uIGFuZCBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGJlCi0JICogbWFya2VkIGFzIGFuIEFydGlmYWN0LiBJZiBzbywgYXBwZW5kIGl0IHRvIHRoZSBzY2FuUmV0dXJuIG9iamVjdCB0aGF0Ci0JICogdGhpcyB2aXNpdG9yIGlzIHBvcHVsYXRpbmcuCi0JICogCi0JICogQW4gYXJ0aWZhY3QgaXMgYSBmdW5jdGlvbiBuYW1lIHRoYXQgd2FzIGZvdW5kIGluIHRoZSBNUEkgaW5jbHVkZSBwYXRoLAotCSAqIGFzIGRlZmluZWQgaW4gdGhlIE1QSSBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYXN0RXhwcgotCSAqIEBwYXJhbSBmdW5jTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NGdW5jTmFtZShJQVNUTmFtZSBmdW5jTmFtZSwgSUFTVEV4cHJlc3Npb24gYXN0RXhwcikgewotCQkvL0lBU1RUcmFuc2xhdGlvblVuaXQgdHUgPSBmdW5jTmFtZS5nZXRUcmFuc2xhdGlvblVuaXQoKTsKLQotCQlpZiAoaXNBcnRpZmFjdChmdW5jTmFtZSkpIHsKLQkJCVNvdXJjZUluZm8gc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm8oYXN0RXhwciwgQXJ0aWZhY3QuRlVOQ1RJT05fQ0FMTCk7Ci0JCQlpZiAoc291cmNlSW5mbyAhPSBudWxsKSB7Ci0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBhcnRpZmFjdDogIiArIGZ1bmNOYW1lLnRvU3RyaW5nKCkpOwotCQkJCS8vIE5vdGU6IHdlJ3JlIGRldGVybWluaW5nIHRoZSBhcnRpZmFjdCBuYW1lIHR3aWNlLiAoYWxzbyBpbiBjaG9vc2VOYW1lKCkpCi0JCQkJU3RyaW5nIGFydE5hbWU9ZnVuY05hbWUudG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcmF3TmFtZT1mdW5jTmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQkvL1N0cmluZyBiTmFtZT1mdW5jTmFtZS5nZXRCaW5kaW5nKCkuZ2V0TmFtZSgpOwotCQkJCWlmKCFhcnROYW1lLmVxdWFscyhyYXdOYW1lKSkgewotCQkJCQlpZihyYXdOYW1lLmxlbmd0aCgpPT0wKXJhd05hbWU9IiAgIjsKLQkJCQkJYXJ0TmFtZT1hcnROYW1lKyIgICgiK3Jhd05hbWUrIikiOyAvLyBpbmRpY2F0ZSBvcmlnIHByZS1wcmUtcHJvY2Vzc29yIHZhbHVlIGluIHBhcmVucwotCQkJCQkvLyBub3RlOiBjdXJyZW50bHkgcmF3TmFtZSBzZWVtcyB0byBhbHdheXMgYmUgZW1wdHkuCi0JCQkJfQotCQkJCXNjYW5SZXR1cm4uYWRkQXJ0aWZhY3QobmV3IEFydGlmYWN0KGZpbGVOYW1lLCBzb3VyY2VJbmZvLmdldFN0YXJ0aW5nTGluZSgpLCAxLAotCQkJCQkJYXJ0TmFtZSwgQVJUSUZBQ1RfQ0FMTCwgc291cmNlSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFzdEV4cHIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRXhwcldpdGhDb25zdGFudChJQVNURXhwcmVzc2lvbiBhc3RFeHByKSB7Ci0JCUlBU1ROYW1lIGZ1bmNOYW1lID0gKChJQVNUSWRFeHByZXNzaW9uKSBhc3RFeHByKS5nZXROYW1lKCk7Ci0JCS8vSUFTVFRyYW5zbGF0aW9uVW5pdCB0dSA9IGZ1bmNOYW1lLmdldFRyYW5zbGF0aW9uVW5pdCgpOwotCi0JCWlmIChpc0FydGlmYWN0KGZ1bmNOYW1lKSkgewotCQkJU291cmNlSW5mbyBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mbyhhc3RFeHByLCBBcnRpZmFjdC5GVU5DVElPTl9DQUxMKTsKLQkJCWlmIChzb3VyY2VJbmZvICE9IG51bGwpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgTVBJIGFydGlmYWN0OiAiICsgZnVuY05hbWUudG9TdHJpbmcoKSk7Ci0JCQkJc2NhblJldHVybi5hZGRBcnRpZmFjdChuZXcgQXJ0aWZhY3QoZmlsZU5hbWUsIHNvdXJjZUluZm8uZ2V0U3RhcnRpbmdMaW5lKCksIDEsCi0JCQkJCQlmdW5jTmFtZS50b1N0cmluZygpLCBBUlRJRkFDVF9DQUxMLCBzb3VyY2VJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBmdW5jTmFtZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBvZiBhcnRpZmFjdCBpbgotCSAqIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkLiA8YnI+Ci0JICogQW4gYXJ0aWZhY3QgaXMgYSBmdW5jdGlvbiBuYW1lIHRoYXQgd2FzIGZvdW5kIGluIHRoZSAgaW5jbHVkZSBwYXRoIChlLmcuIE1QSSBvciBPcGVuTVApLAotCSAqIGFzIGRlZmluZWQgaW4gdGhlIFBMRFQgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIGZ1bmNOYW1lCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcnRpZmFjdChJQVNUTmFtZSBmdW5jTmFtZSkgewotCQlJQmluZGluZyBiaW5kaW5nID0gZnVuY05hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJU3RyaW5nIG5hbWU9YmluZGluZy5nZXROYW1lKCk7IAotCQlTdHJpbmcgcmF3U2lnPWZ1bmNOYW1lLmdldFJhd1NpZ25hdHVyZSgpOwotCQluYW1lID0gY2hvb3NlTmFtZShuYW1lLCByYXdTaWcpOwotCi0JCUlBU1RUcmFuc2xhdGlvblVuaXQgdHUgPSBmdW5jTmFtZS5nZXRUcmFuc2xhdGlvblVuaXQoKTsKLQotCQkvLyBVc2UgaW5kZXggaW5zdGVhZCBvZiBmdWxsIEFTVCBmb3IgdGhlIGhlYWRlciBmaWxlIGluY2x1c2lvbiBzdHVmZgotCQkvLyBXaXRob3V0IGZ1bGwgQVNULCBmdXJ0aGVyIGludHJvc3BlY3Rpb24gaW50byBBUElzIHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGFzayBmb3IgaXQgZnJvbSB0aGUgSW5kZXgKLQkJSU5hbWVbXSBuYW1lcyA9IHR1LmdldERlY2xhcmF0aW9ucyhiaW5kaW5nKTsgIC8vIGdldCBmcm9tIHRoZSBpbmRleCBub3QgYXN0IG9mIGUuZy4gaGVhZGVyIGZpbGVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIElOYW1lIG5hbWUyID0gbmFtZXNbaV07Ci0gICAgICBJQVNURmlsZUxvY2F0aW9uIGZsb2MgPSBuYW1lMi5nZXRGaWxlTG9jYXRpb24oKTsKLSAgICAgIGlmKGZsb2M9PW51bGwpIHsKLSAgICAgICAgaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlBsZHRBc3RWaXNpdG9yICBJQVNURmlsZUxvY24gbnVsbCBmb3IgIituYW1lMisiICgiK2Z1bmNOYW1lKyIpIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgIC8vKGUuZy4gJ3B0cicgICkKLSAgICAgIH0KLSAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZsb2MuZ2V0RmlsZU5hbWUoKTsKLSAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0gICAgICBpZihpc0luSW5jbHVkZVBhdGgocGF0aCkpIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3VuZCAiK3BhdGgrIiAgaW4gYXJ0aWZhY3QgcGF0aCAodmlhIGluZGV4KSEiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKHRyYWNlT24pIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICIgd2FzIGZvdW5kIGluICIgKyBwYXRoCi0gICAgICAgICAgICAgICsgIiBidXQgIFBMRFQgcHJlZmVyZW5jZXMgaGF2ZSBiZWVuIHNldCB0byBvbmx5IGluY2x1ZGU6ICIgKyBpbmNsdWRlc18udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIHRoZW0gaGVyZT8KLSAgICAgICAgaWYoYWxsb3dJbmNsdWRlUGF0aEFkZCgpKSB7Ci0gICAgICAgICAgYm9vbGVhbiBhZGRpdCA9IGFkZEluY2x1ZGVQYXRoKHBhdGgsIG5hbWUsIGRvbnRBc2tUb01vZGlmeUluY2x1ZGVQYXRoQWdhaW4pOwotICAgICAgICAgIGlmKGFkZGl0KXJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENob29zZSBob3cgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBiaW5kaW5nIG5hbWUsIGFuZCByYXcgc2lnbmF0dXJlLjxicj4KLQkgKiBDb3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgaWYsIGZvciBleGFtcGxlLCBhIG5hbWUgd2l0aCBhIHByZWZpeCBlLmcuICJNUEk6OmZvbyIgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyICJmb28iLjxicj4KLQkgKiBIZXJlLCB0aGUgZGVmYXVsdCBjYXNlIGlzIHRoYXQgd2UgYWx3YXlzIGNob29zZSB0aGUgcmVndWxhci9iaW5kaW5nIG5hbWUsIHVubGVzcyBpdCdzIGVtcHR5LCBpbiB3aGljaCBjYXNlIHdlIGNob29zZSB0aGUgcmF3U2lnbmF0dXJlLgotCSAqIEBwYXJhbSBiaW5kaW5nTmFtZQotCSAqIEBwYXJhbSByYXdTaWduYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaG9vc2VOYW1lKFN0cmluZyBiaW5kaW5nTmFtZSwgU3RyaW5nIHJhd1NpZ25hdHVyZSl7Ci0JCVN0cmluZyBuYW1lPWJpbmRpbmdOYW1lOwotCQlpZihiaW5kaW5nTmFtZS5sZW5ndGgoKT09MCkgewotCQkJbmFtZT1yYXdTaWduYXR1cmU7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotIAotCXB1YmxpYyB2b2lkIHByb2Nlc3NNYWNyb0xpdGVyYWwoSUFTVExpdGVyYWxFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJSUFTVE5vZGVMb2NhdGlvbltdIGxvY2F0aW9ucyA9IGV4cHJlc3Npb24uZ2V0Tm9kZUxvY2F0aW9ucygpOwotCQlpZiAoKGxvY2F0aW9ucy5sZW5ndGggPT0gMSkgJiYgKGxvY2F0aW9uc1swXSBpbnN0YW5jZW9mIElBU1RNYWNyb0V4cGFuc2lvbikpIHsvL3BhdGggdGFrZW4gJm5vdAotCQkJLy8gZm91bmQgYSBtYWNybywgZG9lcyBpdCBjb21lIGZyb20gdGhlIGluY2x1ZGUgcGF0aCByZXF1aXJlZCB0byBiZSAib25lIG9mIG91cnMiPwotCQkJSUFTVE1hY3JvRXhwYW5zaW9uIGFzdE1hY3JvRXhwYW5zaW9uID0gKElBU1RNYWNyb0V4cGFuc2lvbikgbG9jYXRpb25zWzBdOwotCQkJSUFTVFByZXByb2Nlc3Nvck1hY3JvRGVmaW5pdGlvbiBwcmVwcm9jZXNzb3JNYWNyb0RlZmluaXRpb24gPSBhc3RNYWNyb0V4cGFuc2lvbgotCQkJCQkuZ2V0TWFjcm9EZWZpbml0aW9uKCk7Ci0JCQkvLyBTdHJpbmcgc2hvcnROYW1lID0KLQkJCS8vIHByZXByb2Nlc3Nvck1hY3JvRGVmaW5pdGlvbi5nZXROYW1lKCkudG9TdHJpbmcoKSsnPScrbGl0ZXJhbDsKLQkJCVN0cmluZyBzaG9ydE5hbWUgPSBwcmVwcm9jZXNzb3JNYWNyb0RlZmluaXRpb24uZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQlJQVNUTm9kZUxvY2F0aW9uW10gcHJlcHJvY2Vzc29yTG9jYXRpb25zID0gcHJlcHJvY2Vzc29yTWFjcm9EZWZpbml0aW9uCi0JCQkJCS5nZXROb2RlTG9jYXRpb25zKCk7Ci0JCQl3aGlsZSAoKHByZXByb2Nlc3NvckxvY2F0aW9ucy5sZW5ndGggPT0gMSkKLQkJCQkJJiYgKHByZXByb2Nlc3NvckxvY2F0aW9uc1swXSBpbnN0YW5jZW9mIElBU1RNYWNyb0V4cGFuc2lvbikpIHsKLQkJCQlwcmVwcm9jZXNzb3JMb2NhdGlvbnMgPSAoKElBU1RNYWNyb0V4cGFuc2lvbikgcHJlcHJvY2Vzc29yTG9jYXRpb25zWzBdKQotCQkJCQkJLmdldE1hY3JvRGVmaW5pdGlvbigpLmdldE5vZGVMb2NhdGlvbnMoKTsKLQkJCX0KLQotCQkJaWYgKChwcmVwcm9jZXNzb3JMb2NhdGlvbnMubGVuZ3RoID09IDEpCi0JCQkJCSYmIGlzSW5JbmNsdWRlUGF0aChuZXcgUGF0aChwcmVwcm9jZXNzb3JMb2NhdGlvbnNbMF0uYXNGaWxlTG9jYXRpb24oKQotCQkJCQkJCS5nZXRGaWxlTmFtZSgpKSkpIHsKLQkJCQlTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvKGFzdE1hY3JvRXhwYW5zaW9uKTsKLQkJCQlpZiAoc291cmNlSW5mbyAhPSBudWxsKSB7Ci0JCQkJCXNjYW5SZXR1cm4uYWRkQXJ0aWZhY3QobmV3IEFydGlmYWN0KGZpbGVOYW1lLCBzb3VyY2VJbmZvLmdldFN0YXJ0aW5nTGluZSgpLCAxLCAvLyBjb2x1bW46Ci0JCQkJCQkJc2hvcnROYW1lLCBBUlRJRkFDVF9DT05TVEFOVCwgc291cmNlSW5mbykpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBwYXRoIGZvdW5kIGluIHRoZSBpbmNsdWRlIHBhdGggaW4gd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQ/Ci0JICogRS5nLiBpcyBpdCBpbiB0aGUgIGluY2x1ZGUgcGF0aCBzcGVjaWZpZWQgaW4gUExEVCBwcmVmZXJlbmNlcywKLQkgKiB3aGljaCB3b3VsZCBpZGVudGlmeSBpdCBhcyBhbiAgYXJ0aWZhY3Qgb2YgaW50ZXJlc3Q/Ci0JICogCi0JICogQHBhcmFtIGluY2x1ZGVGaWxlUGF0aCB1bmRlciBjb25zaWRlcmF0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgZm91bmQgaW4gdGhlIGluY2x1ZGUgcGF0aCBmcm9tIFBMRFQgcHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbkluY2x1ZGVQYXRoKElQYXRoIGluY2x1ZGVGaWxlUGF0aCkgewotCQlpZiAoaW5jbHVkZUZpbGVQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoU3RyaW5nIGluY2x1ZGVEaXIgOiBpbmNsdWRlc18pIHsKLQkJCUlQYXRoIGluY2x1ZGVQYXRoID0gbmV3IFBhdGgoaW5jbHVkZURpcik7Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUGxkdEFzdFZpc2l0b3I6IGlzICIraW5jbHVkZUZpbGVQYXRoKyIgZm91bmQgaW4gIitpbmNsdWRlRGlyKyI/Iik7Ci0JCQlpZiAoaW5jbHVkZVBhdGguaXNQcmVmaXhPZihpbmNsdWRlRmlsZVBhdGgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZXhhY3Qgc291cmNlIGxvY2F0aW9uIGluZm8gZm9yIGEgZnVuY3Rpb24gY2FsbAotCSAqIAotCSAqIEBwYXJhbSBhc3RFeHByCi0JICogQHBhcmFtIGNvbnN0cnVjdFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VJbmZvIGdldFNvdXJjZUluZm8oSUFTVEV4cHJlc3Npb24gYXN0RXhwciwgaW50IGNvbnN0cnVjdFR5cGUpIHsKLQkJU291cmNlSW5mbyBzb3VyY2VJbmZvID0gbnVsbDsKLQkJSUFTVE5vZGVMb2NhdGlvbltdIGxvY2F0aW9ucyA9IGFzdEV4cHIuZ2V0Tm9kZUxvY2F0aW9ucygpOwotCQlpZiAobG9jYXRpb25zLmxlbmd0aCA9PSAxKSB7Ci0JCQlJQVNURmlsZUxvY2F0aW9uIGFzdEZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAobG9jYXRpb25zWzBdIGluc3RhbmNlb2YgSUFTVEZpbGVMb2NhdGlvbikgewotCQkJCWFzdEZpbGVMb2NhdGlvbiA9IChJQVNURmlsZUxvY2F0aW9uKSBsb2NhdGlvbnNbMF07Ci0JCQl9Ci0JCQkvLyBoYW5kbGUgdGhlIGNhc2UgZS5nLiAjZGVmaW5lIGZvbyBNUElfZm4gLSByZWNvZ25pemUgZm9vKCkgYXMgTVBJX2ZuKCkKLQkJCWVsc2UgaWYgKGxvY2F0aW9uc1swXSBpbnN0YW5jZW9mIElBU1RNYWNyb0V4cGFuc2lvbikgewotCQkJCUlBU1RNYWNyb0V4cGFuc2lvbiBtZT0oSUFTVE1hY3JvRXhwYW5zaW9uKWxvY2F0aW9uc1swXTsKLQkJCQlhc3RGaWxlTG9jYXRpb249bWUuYXNGaWxlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWlmKGFzdEZpbGVMb2NhdGlvbiE9bnVsbCkgewotCQkJCXNvdXJjZUluZm8gPSBuZXcgU291cmNlSW5mbygpOwotCQkJCXNvdXJjZUluZm8uc2V0U3RhcnRpbmdMaW5lKGFzdEZpbGVMb2NhdGlvbi5nZXRTdGFydGluZ0xpbmVOdW1iZXIoKSk7Ci0JCQkJc291cmNlSW5mby5zZXRTdGFydChhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZU9mZnNldCgpKTsKLQkJCQlzb3VyY2VJbmZvLnNldEVuZChhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZU9mZnNldCgpICsgYXN0RmlsZUxvY2F0aW9uLmdldE5vZGVMZW5ndGgoKSk7Ci0JCQkJc291cmNlSW5mby5zZXRDb25zdHJ1Y3RUeXBlKGNvbnN0cnVjdFR5cGUpOwkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VJbmZvOwotCX0KLQotCS8qKgotCSAqIEdldCBleGFjdCBzb3VyY2UgbG9jYXRpb24gaW5mbyBmb3IgYSBjb25zdGFudCBvcmlnaW5hdGVkIGZyb20gTWFjcm8KLQkgKiBleHBhbnNpb24ocykKLQkgKiAKLQkgKiBAcGFyYW0gaUFTVE1hY3JvRXhwYW5zaW9uCi0JICogICAgICAgICAgICByZXByZXNlbnRzIHRoZSBvcmlnaW5hbCBtYWNybwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFNvdXJjZUluZm8gZ2V0U291cmNlSW5mbyhJQVNUTWFjcm9FeHBhbnNpb24gaUFTVE1hY3JvRXhwYW5zaW9uKSB7Ci0JCVNvdXJjZUluZm8gc291cmNlSW5mbyA9IG51bGw7Ci0JCUlBU1RGaWxlTG9jYXRpb24gaUFTVEZpbGVMb2NhdGlvbiA9IGlBU1RNYWNyb0V4cGFuc2lvbi5hc0ZpbGVMb2NhdGlvbigpOwotCQlzb3VyY2VJbmZvID0gbmV3IFNvdXJjZUluZm8oKTsKLQkJc291cmNlSW5mby5zZXRTdGFydGluZ0xpbmUoaUFTVEZpbGVMb2NhdGlvbi5nZXRTdGFydGluZ0xpbmVOdW1iZXIoKSk7Ci0JCXNvdXJjZUluZm8uc2V0U3RhcnQoaUFTVEZpbGVMb2NhdGlvbi5nZXROb2RlT2Zmc2V0KCkpOwotCQlzb3VyY2VJbmZvLnNldEVuZChpQVNURmlsZUxvY2F0aW9uLmdldE5vZGVPZmZzZXQoKSArIGlBU1RGaWxlTG9jYXRpb24uZ2V0Tm9kZUxlbmd0aCgpKTsKLQkJc291cmNlSW5mby5zZXRDb25zdHJ1Y3RUeXBlKEFydGlmYWN0LkNPTlNUQU5UKTsKLQotCQlyZXR1cm4gc291cmNlSW5mbzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHByZXByb2Nlc3NvckluY2x1ZGVkKElBU1ROb2RlIGFzdE5vZGUpIHsKLQkJaWYgKGFzdE5vZGUuZ2V0RmlsZUxvY2F0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGxvY2F0aW9uID0gYXN0Tm9kZS5nZXRGaWxlTG9jYXRpb24oKS5nZXRGaWxlTmFtZSgpOwotCQlTdHJpbmcgdHVGaWxlUGF0aCA9IGFzdE5vZGUuZ2V0VHJhbnNsYXRpb25Vbml0KCkuZ2V0RmlsZVBhdGgoKTsKLQkJcmV0dXJuICFsb2NhdGlvbi5lcXVhbHModHVGaWxlUGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc0lkRXhwckFzTGl0ZXJhbChJQVNUSWRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJSUFTVE5hbWUgbmFtZSA9IGV4cHJlc3Npb24uZ2V0TmFtZSgpOwotCi0JCWlmIChpc0FydGlmYWN0KG5hbWUpKSB7Ci0JCQlTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvKGV4cHJlc3Npb24sIEFydGlmYWN0LkNPTlNUQU5UKTsKLQkJCWlmIChzb3VyY2VJbmZvICE9IG51bGwpIHsKLQkJCQlzY2FuUmV0dXJuLmFkZEFydGlmYWN0KG5ldyBBcnRpZmFjdChmaWxlTmFtZSwgc291cmNlSW5mby5nZXRTdGFydGluZ0xpbmUoKSwgMSwgLy8gY29sdW1uOgotCQkJCQkJbmFtZS50b1N0cmluZygpLCBBUlRJRkFDVF9DT05TVEFOVCwgc291cmNlSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgZHluYW1pYyBhZGRpbmcgdG8gaW5jbHVkZSBwYXRoPyAgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVyaXZlZCBjbGFzc2VzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd0luY2x1ZGVQYXRoQWRkKCkgewotCQlyZXR1cm4gIWRvbnRBc2tUb01vZGlmeUluY2x1ZGVQYXRoQWdhaW47Ci0JfQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGluY2x1ZGVzIGxpc3QgaW4gdGhpcyB2aXNpdG9yIHNvIHRoZSBjaGFuZ2Ugd2lsbCBiZSByZWNvZ25pemVkLgotCSAqIEBwYXJhbSBpbmNsdWRlcwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcm90ZWN0ZWQgdm9pZCByZXBsYWNlSW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7Ci0JCWluY2x1ZGVzXz1jb252ZXJ0VG9MaXN0KGluY2x1ZGVzKTsKLQl9Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIn0pCi0JcHVibGljIExpc3QgY29udmVydFRvTGlzdChTdHJpbmcgc3RyaW5nTGlzdCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nTGlzdCwgRmlsZS5wYXRoU2VwYXJhdG9yICsgIlxuXHIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIExpc3QgZGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBkaXJzLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcnM7Ci0gICAgfQotCS8qKiAKLQkgKiBBZGQgYW4gaW5jbHVkZSBwYXRoIHRvIHRoZSBwcmVmcyAtIHByb2JhYmx5IGZvdW5kIGR5bmFtaWNhbGx5IGR1cmluZyBhbmFseXNpcwotCSAqIGFuZCByZXF1ZXN0ZWQgdG8gYmUgYWRkZWQgYnkgdGhlIHVzZXIKLQkgKiA8YnI+Ci0JICogTm90ZSB0aGF0IHRoZSBwYXRoIHdpbGwgYmUgdG8gdGhlIGFjdHVhbCBmaWxlIGluIHdoaWNoIHRoZSBuYW1lIHdhcyBmb3VuZDsKLQkgKiB0aGUgcGF0aCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHByZWZzIGlzIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoYXQgZmlsZS4KLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIChmdW5jdGlvbiBldGMpIHRoYXQgd2FzIGZvdW5kIGluIHRoZSBwYXRoCi0JICogQHBhcmFtIGRvbnRBc2tBZ2FpbiAgaW5pdGlhbCB2YWx1ZSBvZiB0b2dnbGUgImRvbid0IGFzayBhZ2FpbiIKLQkgKiAKLQkgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSB1c2VyIGNob3NlIHRvIGFkZCB0aGUgcGF0aCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRJbmNsdWRlUGF0aCggSVBhdGggcGF0aCwgIFN0cmluZyBuYW1lLyosIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBpZCovLCBib29sZWFuIGRvbnRBc2tBZ2FpbikgewotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmU9Z2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCVN0cmluZyBpZD1nZXRJbmNsdWRlc1ByZWZJRCgpOwotCQlTdHJpbmcgdHlwZT1nZXRUeXBlTmFtZSgpOwotCQlib29sZWFuIGRvaXRUaGlzVGltZT1mYWxzZTsKLQkJCi0JCWlmKHN0b3JlPT1udWxsIHx8IGlkID09IG51bGwpIHsKLQkJCUNvbW1vblBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIlBMRFQ6IFZpc2l0b3Igc3ViY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IGdldFByZWZlcmVuY2VTdG9yZSgpIG9yICIrCi0JCQkJCSJnZXRJbmNsdWRlc1ByZWZJRCgpIHRvIHJldHVybiBub24tbnVsbCB2YWx1ZXMuIik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCSBTdHJpbmcgdmFsdWUgPSBzdG9yZS5nZXRTdHJpbmcoaWQpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigidmFsdWU6ICIrdmFsdWUpOwotCQkKLQkJaWYgKCFkb250QXNrQWdhaW4pIHsKLSAgICAgICAgLy8gcHJvYmFibHkgaW5lZmZpY2llbnQgc3RyaW5nIGNvbnN0cnVjdGlvbiwgYnV0IHJhcmVseSBjYWxsZWQuCi0gICAgICAgIFN0cmluZyBtc2cgPSAiVGhlIGZvbGxvd2luZyBBUEk6IFxuICAiCi0gICAgICAgICAgICArIG5hbWUKLSAgICAgICAgICAgICsgIlxud2FzIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgcGF0aDogXG4gICIKLSAgICAgICAgICAgICsgcGF0aC50b1N0cmluZygpCi0gICAgICAgICAgICArICJcbndoaWNoIGlzIG5vdCBpbiB0aGUgIgotICAgICAgICAgICAgKyB0eXBlCi0gICAgICAgICAgICArICIgcHJlZmVyZW5jZXMgcGF0aCBsaXN0IG9mOiBcbiAgIgotICAgICAgICAgICAgKyB2YWx1ZQotICAgICAgICAgICAgKyAiLlxuRG8geW91IHdhbnQgdG8gYWRkIGl0PyAgSWYgc28sIGZ1cnRoZXIgQVBJcyBmb3VuZCBoZXJlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNvZ25pemVkLiI7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJBZGQgIiArIHR5cGUgKyAiIGluY2x1ZGUgcGF0aD8iOwotICAgICAgICBib29sZWFuW10gdHdvQW5zd2VycyA9IGFza1VJKHRpdGxlLCBtc2csIGRvbnRBc2tUb01vZGlmeUluY2x1ZGVQYXRoQWdhaW4pOwotICAgICAgICBkb2l0VGhpc1RpbWUgPSB0d29BbnN3ZXJzWzBdOwotICAgICAgICBkb250QXNrQWdhaW4gPSB0d29BbnN3ZXJzWzFdOwotICAgICAgICBkb250QXNrVG9Nb2RpZnlJbmNsdWRlUGF0aEFnYWluID0gZG9udEFza0FnYWluOwotICAgICAgfQotCi0gICAgICBpZiAoZG9pdFRoaXNUaW1lKSB7Ci0gICAgICAgIFN0cmluZyBzID0gamF2YS5pby5GaWxlLnBhdGhTZXBhcmF0b3I7Ci0gICAgICAgIFN0cmluZyBwYXJlbnQgPSBwYXRoLnRvRmlsZSgpLmdldFBhcmVudCgpOwotICAgICAgICAvLyBhZGQgcGF0aCBzZXBhcmF0b3IgKDogb3IgOyA/KSBpZiBuZWNlc3NhcnkKLSAgICAgICAgaWYgKCF2YWx1ZS5lbmRzV2l0aChzKSkgewotICAgICAgICAgIHZhbHVlICs9IHM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIHRoaXMgbmV3IGluY2x1ZGUgcGF0aCBsb2NhdGlvbiB0byB0aGUgdmFsdWUgc3RvcmVkIGluCi0gICAgICAgIC8vIHByZWZlcmVuY2VzLCBhbmQgYWRkIGl0IHRvIHRoZSB2YWx1ZSB3aXRoaW4gdGhpcyBjbGFzcyBhcyB3ZWxsLgotICAgICAgICB2YWx1ZSArPSBwYXJlbnQgKyBzOwotICAgICAgICBzdG9yZS5wdXRWYWx1ZShpZCwgdmFsdWUpOwotICAgICAgICByZXBsYWNlSW5jbHVkZXModmFsdWUpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQkJcmV0dXJuIGRvaXRUaGlzVGltZTsKLQl9Ci0KLQkvKioKLQkgKiBuZWVkcyB0byBiZSBvdmVycnJpZGRlbiBmb3IgZGVyaXZlZCBjbGFzc2VzIHRoYXQgbmVlZCB0byBkeW5hbWljYWxseSB1cGRhdGUgdGhlIHByZWYgc3RvcmUgCi0JICogZS5nLiBmb3IgdGhlIGluY2x1ZGVzIHBhdGguICBUaGlzIHR5cGUgbmFtZSBpcyB1c2VkIGZvciBtZXNzYWdlcywgZXRjLgotCSAqIEByZXR1cm4gYXJ0aWZhY3QgdHlwZSBuYW1lIHN1Y2ggYXMgIk1QSSIsICJPcGVuTVAiIGV0Yy4KLQkgKi8JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIG5lZWRzIHRvIGJlIG92ZXJycmlkZGVuIGZvciBkZXJpdmVkIGNsYXNzZXMgdGhhdCBuZWVkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgcHJlZiBzdG9yZSAKLQkgKiBlLmcuIGZvciB0aGUgaW5jbHVkZXMgcGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluY2x1ZGVzUHJlZklEKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogbmVlZHMgdG8gYmUgb3ZlcnJyaWRkZW4gZm9yIGRlcml2ZWQgY2xhc3NlcyB0aGF0IG5lZWQgdG8gZHluYW1pY2FsbHkgdXBkYXRlIHRoZSBwcmVmIHN0b3JlIAotCSAqIGUuZy4gZm9yIHRoZSBpbmNsdWRlcyBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBEaWFsb2cgdG8gYXNrIGEgcXVlc3Rpb24gaW4gdGhlIFVJIHRocmVhZAotCSAqIEBhdXRob3IgYmV0aAotCSAqCi0JICovCQotCXB1YmxpYyBib29sZWFuW10gYXNrVUkoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBkb250QXNrQWdhaW4pIHsKLQkgIGJvb2xlYW5bXSB0d29BbnN3ZXJzID0gbmV3IGJvb2xlYW5bMl07Ci0JCVJ1bkdldEFuc3dlciBydW5uZXIgPSBuZXcgUnVuR2V0QW5zd2VyKHRpdGxlLG1lc3NhZ2UsZG9udEFza0FnYWluKTsKLQkJCi0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHJ1bm5lcik7Ci0JCWJvb2xlYW4gYW5zd2VyPXJ1bm5lci5nZXRBbnN3ZXIoKTsKLQkJZG9udEFza0FnYWluPXJ1bm5lci5nZXREb250QXNrQWdhaW4oKTsKLQkJdHdvQW5zd2Vyc1swXT1hbnN3ZXI7Ci0JCXR3b0Fuc3dlcnNbMV09ZG9udEFza0FnYWluOwotCQlyZXR1cm4gdHdvQW5zd2VyczsKLQl9Ci0JLyoqCi0JICogUnVubmFibGUgdXNlZCBieSBhc2tVSSB0byBhc2sgYSBxdWVzdGlvbiBpbiB0aGUgVUkgdGhyZWFkCi0JICogQGF1dGhvciBiZXRoCi0JICoKLQkgKi8KLQkgIGNsYXNzIFJ1bkdldEFuc3dlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkgICAgYm9vbGVhbiBhbnN3ZXIsIGRvbnRBc2tBZ2FpbjsKLQkgICAgU3RyaW5nIHRpdGxlLCBtZXNzYWdlOwotCi0JICAgIFJ1bkdldEFuc3dlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGluaXRpYWxUb2dnbGVTdGF0ZSkgewotCSAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLQkgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCSAgICAgIHRoaXMuZG9udEFza0FnYWluPWluaXRpYWxUb2dnbGVTdGF0ZTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAgICBJV29ya2JlbmNoIHdiID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkgICAgICBJV29ya2JlbmNoV2luZG93IHcgPSB3Yi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkgICAgICBTaGVsbCBzaGVsbCA9IHcuZ2V0U2hlbGwoKTsKLQkgICAgICBpZiAoc2hlbGwgPT0gbnVsbCkgewotCSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gQ29tbW9uUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpOwotCSAgICAgICAgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0JICAgICAgfQotCSAgICAgIAotCSAgICAgIC8vIHNlZSBhbHNvOiBvcGVuWWVzTm9DYW5jZWxRdWVzdGlvbgotCSAgICAgIFN0cmluZyB0b2dnbGVNZXNzYWdlPSJEb24ndCBhc2sgYWdhaW4iOwotCSAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBudWxsOwotCSAgICAgIFN0cmluZyBrZXkgPSBudWxsOwotCSAgICAgIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIG1kOwotCSAgICAgIG1kPU1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLm9wZW5ZZXNOb1F1ZXN0aW9uKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgdG9nZ2xlTWVzc2FnZSwgZG9udEFza0FnYWluLCBzdG9yZSwga2V5KTsKLQkgICAgICBpbnQgcmV0Q29kZT1tZC5nZXRSZXR1cm5Db2RlKCk7ICAvLyB5ZXM9MgotCSAgICAgIGFuc3dlciA9IChyZXRDb2RlPT0yKTsKLQkgICAgICBkb250QXNrQWdhaW49IG1kLmdldFRvZ2dsZVN0YXRlKCk7ICAKLQkgICAgfQotCi0JICAgIHB1YmxpYyBib29sZWFuIGdldEFuc3dlcigpIHsKLQkgICAgICByZXR1cm4gYW5zd2VyOwotCSAgICB9Ci0JICAgIHB1YmxpYyBib29sZWFuIGdldERvbnRBc2tBZ2FpbigpIHsKLQkgICAgICByZXR1cm4gZG9udEFza0FnYWluOwotCSAgICB9Ci0JICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvQWxsRnVuY3Rpb25zLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvQWxsRnVuY3Rpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTU5NWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0FsbEZ1bmN0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnVpLklGdW5jdGlvblN1bW1hcnk7Ci0KLS8qKgotICogVW51c2VkPz8/PyAzLzEzLzA4Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQWxsRnVuY3Rpb25zIHsKLQlwcml2YXRlIExpc3Q8SUZ1bmN0aW9uU3VtbWFyeT4gYWxsRnVuY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxJRnVuY3Rpb25TdW1tYXJ5PigpOwotCi0JcHVibGljIExpc3Q8SUZ1bmN0aW9uU3VtbWFyeT4gZ2V0QWxsRnVuY3Rpb25MaXN0KCkgewotCQlyZXR1cm4gYWxsRnVuY3Rpb25MaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbEZ1bmN0aW9uTGlzdChMaXN0PElGdW5jdGlvblN1bW1hcnk+IGFsbEZ1bmN0aW9uTGlzdCkgewotCQl0aGlzLmFsbEZ1bmN0aW9uTGlzdCA9IGFsbEZ1bmN0aW9uTGlzdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRnVuY3Rpb24oSUZ1bmN0aW9uU3VtbWFyeSBmdW5jdGlvblN1bW1hcnkpCi0JewotCQlhbGxGdW5jdGlvbkxpc3QuYWRkKGZ1bmN0aW9uU3VtbWFyeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0NIZWxwQm9va0ltcGwuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vZWRpdG9ySGVscC9DSGVscEJvb2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMGViOGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0NIZWxwQm9va0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudWkuSUNIZWxwQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudWkuSUNIZWxwUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZXh0LklDSGVscEludm9jYXRpb25Db250ZXh0OwotCi0vKioKLSAqIEMgSGVscCBCb29rIGltcGxlbWVudGF0aW9uIGZvciBob3ZlciBoZWxwLCBldGMuIGV0Yy4KLSAqIEBhdXRob3IgYmV0aAotICoKLSAqLwotcHVibGljIGNsYXNzIENIZWxwQm9va0ltcGwgaW1wbGVtZW50cyBJQ0hlbHBCb29rIHsKLQlwcml2YXRlIFN0cmluZyB0aXRsZSA9ICJHZW5lcmljIEMgSGVscCBCb29rIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLElGdW5jdGlvblN1bW1hcnk+IGZ1bmNOYW1lMkZ1bmNJbmZvID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJRnVuY3Rpb25TdW1tYXJ5PigpOwotCi0JLyoqCi0JICogRGlzYWxsb3cgZGVmYXVsdCBjdG9yOyBtdXN0IHByb3ZpZGUgcGx1Z2luIGlkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBDSGVscEJvb2tJbXBsKCkgewotCX0KLQotCXB1YmxpYyBDSGVscEJvb2tJbXBsKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRDSGVscFR5cGUoKSB7Ci0JCXJldHVybiBJQ0hlbHBCb29rLkhFTFBfVFlQRV9DOwotCX0KLQotCXB1YmxpYyBJRnVuY3Rpb25TdW1tYXJ5IGdldEZ1bmN0aW9uSW5mbyhJQ0hlbHBJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJSUZ1bmN0aW9uU3VtbWFyeSBmcyA9IGZ1bmNOYW1lMkZ1bmNJbmZvLmdldChuYW1lKTsKLQkJaWYodHJhY2VPbil7Ci0JCQkKLQkJCVN0cmluZyBjbj10aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCQkJU3RyaW5nIGZpbmZvPShmcyE9bnVsbCk/KGZzLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsMjUpKTpudWxsOwotCQkJaWYoZmluZm8hPW51bGwpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDSGVscEJvb2tJbXBsICIrY24rIiBnZXRGdW5jdGlvbkluZm8gZm9yICIrbmFtZSsgIj0gIitmaW5mbyk7Ci0JCX0KLQkJcmV0dXJuIGZzOwotCX0KLQotCXB1YmxpYyBJRnVuY3Rpb25TdW1tYXJ5W10gZ2V0TWF0Y2hpbmdGdW5jdGlvbnMoCi0JCQlJQ0hlbHBJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcHJlZml4KSB7Ci0JCUxpc3Q8SUZ1bmN0aW9uU3VtbWFyeT4gZnVuY3Rpb25TdW1tYXJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZ1bmN0aW9uU3VtbWFyeT4oKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ID0gZnVuY05hbWUyRnVuY0luZm8ua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGZ1bmNOYW1lID0gaXQubmV4dCgpOwotCQkJaWYgKGZ1bmNOYW1lICE9IG51bGwKLQkJCQkJJiYgZnVuY05hbWUudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKHByZWZpeC50b1VwcGVyQ2FzZSgpKSkgewotCQkJCWZ1bmN0aW9uU3VtbWFyeUxpc3QuYWRkKGZ1bmNOYW1lMkZ1bmNJbmZvLmdldChmdW5jTmFtZSkpOwotCQkJfQotCQl9Ci0KLQkJSUZ1bmN0aW9uU3VtbWFyeVtdIGZ1bmN0aW9uU3VtbWFyeUFycmF5ID0gbnVsbDsKLQotCQkvLyBwb3B1bGF0ZSBhcnJheQotCQlpZiAoIWZ1bmN0aW9uU3VtbWFyeUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmdW5jdGlvblN1bW1hcnlBcnJheSA9IG5ldyBJRnVuY3Rpb25TdW1tYXJ5W2Z1bmN0aW9uU3VtbWFyeUxpc3QKLQkJCQkJLnNpemUoKV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yPElGdW5jdGlvblN1bW1hcnk+IGl0ID0gZnVuY3Rpb25TdW1tYXJ5TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykgewotCQkJCWZ1bmN0aW9uU3VtbWFyeUFycmF5W2ldID0gaXQubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZ1bmN0aW9uU3VtbWFyeUFycmF5OwotCX0KLQotCXB1YmxpYyBJQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3JbXSBnZXRIZWxwUmVzb3VyY2VzKAotCQkJSUNIZWxwSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUpIHsKLQkJSUZ1bmN0aW9uU3VtbWFyeSBmdW5jdGlvblN1bW1hcnkgPSBnZXRGdW5jdGlvbkluZm8oY29udGV4dCwgbmFtZSk7Ci0JCWlmIChmdW5jdGlvblN1bW1hcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlDSGVscFJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3JbXSA9IG5ldyBJQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3JbMV07Ci0JCUNIZWxwUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCBocmQgPSBuZXcgQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3JJbXBsKHRoaXMsCi0JCQkJZnVuY3Rpb25TdW1tYXJ5LCB0aGlzLnBsdWdpbklkKTsKLQkJcmVzb3VyY2VEZXNjcmlwdG9yWzBdID0gaHJkOyAvLyBodG1sIGZpbGUgcGF0aCBpcyBpbiBoZXJlCi0JCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0NIZWxwUHJvdmlkZXJJbXBsLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvQ0hlbHBQcm92aWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMjcxNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvQ0hlbHBQcm92aWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JQ0hlbHBCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JQ0hlbHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudWkuSUNIZWxwUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZXh0LklDSGVscEludm9jYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIElDSGVscFByb3ZpZGVyIGFuZCBwcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDSGVscFByb3ZpZGVySW1wbCBpbXBsZW1lbnRzIElDSGVscFByb3ZpZGVyCi17Ci0gICAgcHJvdGVjdGVkIENIZWxwQm9va0ltcGwgaGVscEJvb2s7Ci0gICAgCi0KLQotICAgIHB1YmxpYyBJQ0hlbHBCb29rW10gZ2V0Q0hlbHBCb29rcygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElDSGVscEJvb2tbXSB7aGVscEJvb2t9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNhbGxlZCBvbiBob3ZlcgotICAgICAqLwotICAgIHB1YmxpYyBJRnVuY3Rpb25TdW1tYXJ5IGdldEZ1bmN0aW9uSW5mbyhJQ0hlbHBJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJQ0hlbHBCb29rW10gaGVscEJvb2tzLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaGVscEJvb2tzLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBoZWxwQm9vay5nZXRGdW5jdGlvbkluZm8oY29udGV4dCwgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIElGdW5jdGlvblN1bW1hcnlbXSBnZXRNYXRjaGluZ0Z1bmN0aW9ucyhJQ0hlbHBJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJQ0hlbHBCb29rW10gaGVscEJvb2tzLAotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaGVscEJvb2tzLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBoZWxwQm9vay5nZXRNYXRjaGluZ0Z1bmN0aW9ucyhjb250ZXh0LCBwcmVmaXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNhbGxlZCBvbiBGMQotICAgICAqLwotICAgIHB1YmxpYyBJQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3JbXSBnZXRIZWxwUmVzb3VyY2VzKElDSGVscEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElDSGVscEJvb2tbXSBoZWxwQm9va3MsCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaGVscEJvb2tzLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBoZWxwQm9vay5nZXRIZWxwUmVzb3VyY2VzKGNvbnRleHQsIG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vZWRpdG9ySGVscC9DSGVscFJlc291cmNlRGVzY3JpcHRvckltcGwuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vZWRpdG9ySGVscC9DSGVscFJlc291cmNlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5ZjIwMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JQ0hlbHBCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnVpLklGdW5jdGlvblN1bW1hcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaGVscC5JSGVscFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgQ0hlbHBSZXNvdXJjZURlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgSUNIZWxwUmVzb3VyY2VEZXNjcmlwdG9yCi17Ci0gICAgSUNIZWxwQm9vayAgYm9vazsKLSAgICBTdHJpbmcgICAgICAgIG5hbWU7Ci0gICAgU3RyaW5nICAgICAgICBsYWJlbDsKLSAgICBTdHJpbmcgICAgICAgIGhyZWY7Ci0gICAgSUhlbHBSZXNvdXJjZSBbXSByZXNvdXJjZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHdoZXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaHRtbCBoZWxwIGZpbGUgKHRvIGJlIGRpc3BsYXllZCBmb3IgYW4gQVBJKSBpcyBsb2NhdGVkCi0gICAgICogQHBhcmFtIGhlbHBCb29rCi0gICAgICogQHBhcmFtIGZ1bmN0aW9uU3VtbWFyeQotICAgICAqIEBwYXJhbSBwbHVnaW5JZAotICAgICAqLwotICAgIHB1YmxpYyBDSGVscFJlc291cmNlRGVzY3JpcHRvckltcGwoSUNIZWxwQm9vayBoZWxwQm9vaywgSUZ1bmN0aW9uU3VtbWFyeSBmdW5jdGlvblN1bW1hcnksIFN0cmluZyBwbHVnaW5JZCkKLSAgICB7Ci0gICAgICAgIGJvb2sgPSBoZWxwQm9vazsKLSAgICAgICAgbmFtZSA9IGZ1bmN0aW9uU3VtbWFyeS5nZXROYW1lKCk7Ci0gICAgICAgIC8vaHJlZiA9ICIvIitwbHVnaW5JZCArICIvaHRtbC8iICsgbmFtZSArICIuaHRtbCI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWY9bmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWYuYXBwZW5kKCIvIikuYXBwZW5kKHBsdWdpbklkKS5hcHBlbmQoIi9odG1sLyIpLmFwcGVuZChuYW1lKS5hcHBlbmQoIi5odG1sIik7Ci0gICAgICAgIGhyZWY9YnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGZvciBoZWxwIGZpbGU6ICIraHJlZik7Ci0gICAgICAgIC8vIGhyZWY9ImZpbGU6Ly9jOi90ZW1wL2Zvby5odG1sIjsgICAgICAKLSAgICAgICAgbGFiZWwgPSBmdW5jdGlvblN1bW1hcnkuZ2V0UHJvdG90eXBlKCkuZ2V0UHJvdG90eXBlU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgcmVzb3VyY2VzID0gbmV3IElIZWxwUmVzb3VyY2VbMV07Ci0gICAgICAgIHJlc291cmNlc1swXSA9IG5ldyBJSGVscFJlc291cmNlKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIcmVmKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaHJlZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBJQ0hlbHBCb29rIGdldENIZWxwQm9vaygpCi0gICAgewotICAgICAgICByZXR1cm4gYm9vazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUhlbHBSZXNvdXJjZVtdIGdldEhlbHBSZXNvdXJjZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlczsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAJcmV0dXJuIG5hbWUrIiAtPiAiK2hyZWY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0Z1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vZWRpdG9ySGVscC9GdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZWQxNDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0Z1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5LklGdW5jdGlvblByb3RvdHlwZVN1bW1hcnk7Ci0KLXB1YmxpYyBjbGFzcyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsIGltcGxlbWVudHMgSUZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeQotewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmV0dXJuVHlwZTsgLy8gInZvaWQiOwotICAgIHByaXZhdGUgU3RyaW5nIGFyZ3VtZW50czsgLy8gImludCBhcmdjLCBjaGFyKiogYXJndiI7Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgpCi0gICAgewotICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoU3RyaW5nIG5hbWUsIFN0cmluZyByZXR1cm5UeXBlLCBTdHJpbmcgYXJndW1lbnRzKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKLSAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXR1cm5UeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJndW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcmd1bWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm90b3R5cGVTdHJpbmcoYm9vbGVhbiBuYW1lZmlyc3QpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZWZpcnN0ID8gbmFtZSArICIoIiArIGFyZ3VtZW50cyArICIpICIgKyByZXR1cm5UeXBlIDogcmV0dXJuVHlwZSArICIgIgotICAgICAgICAgICAgICAgICsgbmFtZSArICIoIiArIGFyZ3VtZW50cyArICIpIjsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoU3RyaW5nIGFyZ3VtZW50cykgewotCQl0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShTdHJpbmcgcmV0dXJuVHlwZSkgewotCQl0aGlzLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvRnVuY3Rpb25TdW1tYXJ5SW1wbC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9lZGl0b3JIZWxwL0Z1bmN0aW9uU3VtbWFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNzVkZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL2VkaXRvckhlbHAvRnVuY3Rpb25TdW1tYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JUmVxdWlyZWRJbmNsdWRlOwotCi0vKioKLSAqIFVzZWQgYnkgYWxsIGZvdXIgUExEVCB0eXBlcyBNUEksIE9wZW5NUCwgTEFQSSBhbmQgVVBDLCB0byBjcmVhdGUgdGhlIHN0cnVjdHVyZXMgdGhhdCBob3ZlciBoZWxwIG5lZWRzCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGdW5jdGlvblN1bW1hcnlJbXBsIGltcGxlbWVudHMgSUZ1bmN0aW9uU3VtbWFyeQotewotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgSUZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeSBwcm90b3R5cGU7Ci0gICAgcHJpdmF0ZSBJUmVxdWlyZWRJbmNsdWRlW10gICAgICAgIGluY2x1ZGVzOwotCi0gICAgcHVibGljIEZ1bmN0aW9uU3VtbWFyeUltcGwoKQotICAgIHsKLSAgICAJCi0gICAgfQotICAgIHB1YmxpYyBGdW5jdGlvblN1bW1hcnlJbXBsKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICBJRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5IHByb3RvdHlwZSwgSVJlcXVpcmVkSW5jbHVkZVtdIGluY2x1ZGVzKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgdGhpcy5wcm90b3R5cGUgPSBwcm90b3R5cGU7Ci0gICAgICAgIHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeSBnZXRQcm90b3R5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVxdWlyZWRJbmNsdWRlW10gZ2V0SW5jbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKElSZXF1aXJlZEluY2x1ZGVbXSBpbmNsdWRlcykKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3RvdHlwZShJRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5IHByb3RvdHlwZSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvdG90eXBlID0gcHJvdG90eXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIm5hbWU9IikuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKS5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIm5hbWVzcGFjZT0iKS5hcHBlbmQodGhpcy5nZXROYW1lc3BhY2UoKSkuYXBwZW5kKCdcbicpOwotICAgICAgICBidWYuYXBwZW5kKCJkZXNjPSIpLmFwcGVuZCh0aGlzLmdldERlc2NyaXB0aW9uKCkpLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiLi4uIik7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3ByZWZzL1BMRFRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9wcmVmcy9QTERUUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2NDFiNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3ByZWZzL1BMRFRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24ucHJlZnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uSURzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQKLSAqIGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuIEJ5IAotICogc3ViY2xhc3NpbmcgPHNhbXA+RmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTwvc2FtcD4sIHdlCi0gKiBjYW4gdXNlIHRoZSBmaWVsZCBzdXBwb3J0IGJ1aWx0IGludG8gSkZhY2UgdGhhdCBhbGxvd3MKLSAqIHVzIHRvIGNyZWF0ZSBhIHBhZ2UgdGhhdCBpcyBzbWFsbCBhbmQga25vd3MgaG93IHRvIAotICogc2F2ZSwgcmVzdG9yZSBhbmQgYXBwbHkgaXRzZWxmLgotICogPHA+Ci0gKiBUaGlzIHBhZ2UgaXMgdXNlZCB0byBtb2RpZnkgcHJlZmVyZW5jZXMgb25seS4gVGhleQotICogYXJlIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGJlbG9uZ3MgdG8KLSAqIHRoZSBtYWluIHBsdWctaW4gY2xhc3MuIFRoYXQgd2F5LCBwcmVmZXJlbmNlcyBjYW4KLSAqIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHZpYSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUExEVFByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIFBMRFRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoR1JJRCk7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0RGVzY3JpcHRpb24oIlBUUCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scyIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YKLQkgKiB0aGUgY29tbW9uIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcwotCSAqIG9mIHByZWZlcmVuY2VzLiBFYWNoIGZpZWxkIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQKLQkgKiByZXN0b3JlIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCVN0cmluZyBjb25mID0gIlNob3cgQW5hbHlzaXMgQ29uZmlybWF0aW9uIHdpdGggY291bnQgb2YgbnVtYmVyIG9mIGFydGlmYWN0cyBmb3VuZCI7Ci0gICAgICAgIEJvb2xlYW5GaWVsZEVkaXRvciBiZWQgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKElEcy5TSE9XX0FOQUxZU0lTX0NPTkZJUk1BVElPTixjb25mLGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICAvL1N0cmluZ0ZpZWxkRWRpdG9yIHNlZCA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcihNcGlJRHMuTVBJX0JVSUxEX0NNRCwgTVBJX0JVSUxEX0NPTU1BTkRfTEFCRUwsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKGJlZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTNlZjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5wcmVmczsKLQotLyoqCi0gKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BBVEggPSAicGF0aFByZWZlcmVuY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9CT09MRUFOID0gImJvb2xlYW5QcmVmZXJlbmNlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ0hPSUNFID0gImNob2ljZVByZWZlcmVuY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TVFJJTkcgPSAic3RyaW5nUHJlZmVyZW5jZSI7Ci0JCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3ByZWZzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi9wcmVmcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhNmYzZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3ByZWZzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24ucHJlZnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotLy8JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0vLwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdXRpbC9BbmFseXNpc1V0aWwuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdXRpbC9BbmFseXNpc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyNzgyNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3V0aWwvQW5hbHlzaXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLkNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhcnNlci5QYXJzZXJMYW5ndWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci0KLS8qKgotICogVmFyaW91cyB1dGlsaXR5IG1ldGhvZHMgZm9yIHByb2plY3QKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQW5hbHlzaXNVdGlsIHsKLSAKLQlwcml2YXRlIEFuYWx5c2lzVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgYSB2YWxpZCBmaWxlIGZvciBhbmFseXNpcyBwcm9jZXNzaW5nPyA8YnI+Ci0JICogQ3VycmVudGx5IHRoaXMgbWVhbnMsIGlzIGl0IGEgLmMgb3IgLmNwcCBldGMgZmlsZSwgb3IgLmggb3IgLmhwcD8gPGJyPgotCSAqIERvbid0IHBvbGx1dGUgdGhpcyB3aXRoIGZvcnRyYW4gaW5mbyAtIGN1cnJlbnRseSBmb3J0cmFuIHByb2Nlc3NpbmcgaXMgaW4KLQkgKiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRm9yQW5hbHlzaXMoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIGlzQ1BQKSB7Ci0JCWludCBsb2MgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCQlpZiAobG9jIDw9IDApIC8vIGlmIG5vIGRvdCwgb3IgZmlsZW5hbWUgaXMgIi5mb28iLCBub3QgdmFsaWQgZm9yCi0JCQkJCQkvLyBhbmFseXNpcy4KLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGV4dCA9IGZpbGVuYW1lLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChleHQuc3RhcnRzV2l0aCgiYyIpLyogfHxleHQuc3RhcnRzV2l0aCgiZiIpICovKSAvLyBjIG9yIGZvcnRyYW4KLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UKLQkJCWlmKGlzQ1BQICYmIGV4dC5zdGFydHNXaXRoKCJoIikpIC8vIEMrKyBjYW4gaGF2ZSBjb2RlIGluIGhlYWRlciBmaWxlcwotCQkJICByZXN1bHQ9dHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIEMvQysrIHNvdXJjZSwgZGVjaWRlIGlmIGl0IGlzIEMgb3IgQysrLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBtdXN0IGJlIGVpdGhlciBDIG9yIENQUCBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGFyc2VyTGFuZ3VhZ2UgZ2V0TGFuZ3VhZ2VGcm9tRmlsZShJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsgLy8gYXNzdW1lIENQUAotCQkJcmV0dXJuIFBhcnNlckxhbmd1YWdlLkNQUDsKLQkJfQotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJU3RyaW5nIGxpZCA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSB0eXBlID0gQ0NvcmVQbHVnaW4uZ2V0Q29udGVudFR5cGUocHJvamVjdCwgZmlsZS5nZXRGdWxsUGF0aCgpLmxhc3RTZWdtZW50KCkpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlsaWQgPSB0eXBlLmdldElkKCk7Ci0JCX0KLQkJaWYgKGxpZCAhPSBudWxsCi0JCQkJJiYgKGxpZC5lcXVhbHMoQ0NvcmVQbHVnaW4uQ09OVEVOVF9UWVBFX0NYWFNPVVJDRSkgfHwgbGlkLmVxdWFscyhDQ29yZVBsdWdpbi5DT05URU5UX1RZUEVfQ1hYSEVBREVSKSkpIHsKLQkJCXJldHVybiBQYXJzZXJMYW5ndWFnZS5DUFA7Ci0JCX0KLQotCQlyZXR1cm4gUGFyc2VyTGFuZ3VhZ2UuQzsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3V0aWwvU291cmNlSW5mby5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi91dGlsL1NvdXJjZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiNmM3Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3V0aWwvU291cmNlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWw7Ci0KLS8qKgotICogQ2xhc3MgZW5jYXBzdWxhdGVzIGxvY2F0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNyZWF0aW5nICBtYXJrZXJzIHJlcHJlc2VudGluZyBBcnRpZmFjdHMuCi0gKiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlSW5mbwotewotCS8qKiBzdGFydGluZyBsaW5lIGxvY2F0aW9uIHdpdGhpbiBpbiB0aGUgZmlsZSAqLwotICAgIHByaXZhdGUgaW50IHN0YXJ0aW5nTGluZTsKLSAgICAvKiogbGluZSBudW1iZXIgd2l0aGluIHRoZSBmaWxlICovCi0gICAgcHJpdmF0ZSBpbnQgc3RhcnQ7Ci0gICAgLyoqIGVuZCBwb3NpdGlvbiAoY2hhcmFjdGVyIHBvc2l0aW9uKSByZWxhdGl2ZSB0byBzdGFydCBvZiBmaWxlICovCi0gICAgcHJpdmF0ZSBpbnQgZW5kOwotICAgIC8qKiB0eXBlIG9mIGNvbnN0cnVjdCwgZS5nLiBBcnRpZmFjdC5DT05TVEFOVCwgZXRjLiAqLwotICAgIHByaXZhdGUgaW50IGNvbnN0cnVjdFR5cGU7Ci0KLSAgICAvKiogZXhwbGljaXQgZGVmYXVsdCBjb250c3RydWN0b3Igd2l0aCBubyBpbmZvOyBhc3N1bWVkIHRvCi0gICAgICogYmUgZmlsbGVkIGluIHdpdGggc2V0IG1ldGhvZHMuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlSW5mbygpewotICAgIH0KLSAgICAKLSAgICAvKiogY3RvciB3aXRoIGluZm8gYWxyZWFkeSBmaWxsZWQgaW4gKi8KLSAgICBwdWJsaWMgU291cmNlSW5mbyhpbnQgc3RhcnRMaW5lLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb25zdHJ1Y3QpewotICAgIAl0aGlzLnN0YXJ0aW5nTGluZT1zdGFydExpbmU7Ci0gICAgCXRoaXMuc3RhcnQ9c3RhcnQ7Ci0gICAgCXRoaXMuZW5kPWVuZDsKLSAgICAJdGhpcy5jb25zdHJ1Y3RUeXBlPWNvbnN0cnVjdDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5kKGludCBlbmQpCi0gICAgewotICAgICAgICB0aGlzLmVuZCA9IGVuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0IHBvc2l0aW9uLCByZWxhdGl2ZSB0byBzdGFydCBvZiBmaWxlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdGFydCgpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IHN0YXJ0KQotICAgIHsKLSAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnRpbmdMaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRpbmdMaW5lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGFydGluZ0xpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0YXJ0aW5nTGluZSBUaGUgc3RhcnRpbmdMaW5lIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFydGluZ0xpbmUoaW50IHN0YXJ0aW5nTGluZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuc3RhcnRpbmdMaW5lID0gc3RhcnRpbmdMaW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29uc3RydWN0VHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbnN0cnVjdFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnN0cnVjdFR5cGUgVGhlIGNvbnN0cnVjdFR5cGUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cnVjdFR5cGUoaW50IGNvbnN0cnVjdFR5cGUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnN0cnVjdFR5cGUgPSBjb25zdHJ1Y3RUeXBlOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpewotICAgIAlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAJcy5hcHBlbmQoIlNvdXJjZUluZm8gbGluZToiKS5hcHBlbmQoZ2V0U3RhcnRpbmdMaW5lKCkpOwotICAgIAlzLmFwcGVuZCgiIHN0YXJ0UG9zOiIpLmFwcGVuZChnZXRTdGFydCgpKTsKLSAgICAJcy5hcHBlbmQoIiBlbmRQb3M6IikuYXBwZW5kKGdldEVuZCgpKTsKLSAgICAJcy5hcHBlbmQoIiBjb25zdHJ1Y3RUeXBlOiIpLmFwcGVuZChnZXRDb25zdHJ1Y3RUeXBlKCkpOwotICAgIAlyZXR1cm4gcy50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdXRpbC9VdGlsaXR5LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3V0aWwvVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGVhNGJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdXRpbC9VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZpbGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5wYXJzZXIuUGFyc2VyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIFZhcmlvdXMgZnVuY3Rpb24vbWV0aG9kcyBvZiB1c2UsIE9yaWdpbmFsbHkgaW4gT3Blbk1QIGFuYWx5c2lzIGJ1dCB1c2VkIG1vcmUgZ2VuZXJhbGx5IG5vdwotICogCi0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVXRpbGl0eQotewotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIGNvbXB1dGUgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIGZpbGUsIGlnbm9yaW5nIGluY2x1ZGVzCi0gICAgICogQHBhcmFtIG5vZGUgLSBJQVNUTm9kZQotICAgICAqIEByZXR1cm4gTG9jYXRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKS8vIG5lZWQgZ2V0TGVuZ3RoKCkgZnJvbSBBU1ROb2RlIChhcyBvcHBvc2VkIHRvIElBU1ROb2RlKQotCXB1YmxpYyBzdGF0aWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oSUFTVE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICAgIEFTVE5vZGUgYXN0bm9kZSA9IChub2RlIGluc3RhbmNlb2YgQVNUTm9kZSA/IChBU1ROb2RlKW5vZGUgOiBudWxsKTsKLSAgICAgICAgaWYgKGFzdG5vZGU9PW51bGwpICByZXR1cm4gbnVsbDsKLQotICAgICAgICBJQVNURmlsZUxvY2F0aW9uIGlmbCAgICAgICAgID0gbm9kZS5nZXRGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgLy8gb2Zmc2V0IGNhbGN1bGF0aW9uIGlzIHRyaWNreSAtIHdlIHVzZWQgdGhlIGZvbGxvd2luZyBzaW5jZSBpdCBzZWVtcyB0byBjb3ZlciB0aGUgbW9zdCBjYXNlcwotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmIChpZmwhPW51bGwpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IGlmbC5nZXROb2RlT2Zmc2V0KCk7ICAgCi0gICAgICAgICAgICBsZW5ndGggPSBpZmwuZ2V0Tm9kZUxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeyAgLy8gdGhpcyBoYXBwZW5zIGluICJvbXAgc2VjdGlvbnMiLCBhcHBhcmVudGx5IGR1ZSB0byBwcmFnbWFzIHNwbGl0dGluZyB0aGUgcmVnaW9uCi0gICAgICAgICAgICBJQVNUTm9kZUxvY2F0aW9uIFtdIGxvY3MgPSBub2RlLmdldE5vZGVMb2NhdGlvbnMoKTsgCi0gICAgICAgICAgICBpZiAobG9jcz09bnVsbCB8fCBsb2NzLmxlbmd0aD09MCkgIHJldHVybiBudWxsOwotICAgICAgICAgICAgb2Zmc2V0ID0gbG9jc1swXS5nZXROb2RlT2Zmc2V0KCk7Ci0gICAgICAgICAgICBsZW5ndGggPSBhc3Rub2RlLmdldExlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTG9jYXRpb24obm9kZSwgb2Zmc2V0LCBvZmZzZXQrbGVuZ3RoLTEpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1lbWJlcgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9jYXRpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJQVNUTm9kZSBub2RlXyA9IG51bGw7Ci0gICAgICAgIHB1YmxpYyBpbnQgbG93Xz0wOwotICAgICAgICBwdWJsaWMgaW50IGhpZ2hfPTA7Ci0gICAgCi0gICAgICAgIHB1YmxpYyBMb2NhdGlvbihJQVNUTm9kZSBub2RlLCBpbnQgbG93LCBpbnQgaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgbm9kZV8gPSBub2RlOwotICAgICAgICAgICAgbG93XyAgPSBsb3c7Ci0gICAgICAgICAgICBoaWdoXyA9IGhpZ2g7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TG93KCkgIHsgcmV0dXJuIGxvd187ICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SGlnaCgpIHsgcmV0dXJuIGhpZ2hfOyB9Ci0gICAgfQotICAgIAotIAotICAgIAotICAgIC8qKgotICAgICAqIGdldCBkb2N1bWVudCB1c2luZyBmdWxsIHBhdGggbmFtZQotICAgICAqIEBwYXJhbSBmdWxsUGF0aE5hbWUgLSBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIElEb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSURvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBmdWxsUGF0aE5hbWUpCi0gICAgewotICAgICAgICBJUmVzb3VyY2UgciA9IFBhcnNlclV0aWwuZ2V0UmVzb3VyY2VGb3JGaWxlbmFtZShmdWxsUGF0aE5hbWUpOwotICAgICAgICBJRmlsZSAgICAgZiA9IChyIGluc3RhbmNlb2YgSUZpbGUgPyAoSUZpbGUpciA6IG51bGwpOwotICAgICAgICBpZiAoZj09bnVsbCkgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoZik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldERvY3VtZW50IC0gZ2V0IGRvY3VtZW50IHVzaW5nIElGaWxlCi0gICAgICogQHBhcmFtIGZpbGUgLSBJRmlsZQotICAgICAqIEByZXR1cm4gSURvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkKLSAgICB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlcj0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlciB0ZXh0RmlsZUJ1ZmZlcj0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihmaWxlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICBpZiAodGV4dEZpbGVCdWZmZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9jdW1lbnQ9IHRleHRGaWxlQnVmZmVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQkvKioKLQkgKiBGcm9tIGFuIGVkaXRvciwgZGV0ZXJtaW5lIHRoZSBmaWxlIChhYnNvbHV0ZSBwYXRoIG5hbWUpIG9wZW4gaW4gdGhlIGVkaXRvci4KLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHJldHVybiBudWxsIGlmIG5vbmUsIGJ1dCB0aGUgc3RyaW5nIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBpZiBhdmFpbGFibGUKLQkgKiAKLQkgKi8KLSAgICAvL2NkdDQwIHNpbmNlIGVkaXRvci5nZXRJbnB1dEZpbGUoKSBpcyBub3cgbWlzc2luZywgdGhpcyBjb21wZW5zYXRlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0RmlsZShJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0PSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlGaWxlIGZpbGU9IFJlc291cmNlVXRpbC5nZXRGaWxlKGlucHV0KTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotCQkJSVBhdGggbG9jYXRpb249ICgoSVBhdGhFZGl0b3JJbnB1dClpbnB1dCkuZ2V0UGF0aCgpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbG9jYXRpb24udG9PU1N0cmluZygpOwotCQkJfQotCQl9Ci0JCUlMb2NhdGlvblByb3ZpZGVyIGxvY2F0aW9uUHJvdmlkZXI9IChJTG9jYXRpb25Qcm92aWRlcilpbnB1dC5nZXRBZGFwdGVyKElMb2NhdGlvblByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGxvY2F0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJSVBhdGggbG9jYXRpb249IGxvY2F0aW9uUHJvdmlkZXIuZ2V0UGF0aChpbnB1dCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBsb2NhdGlvbi50b09TU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdXRpbC9WaWV3QWN0aXZhdGVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3V0aWwvVmlld0FjdGl2YXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGEzYTU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdXRpbC9WaWV3QWN0aXZhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3QWN0aXZhdGVyCi17Ci0gICAgLyoqCi0gICAgICogQWN0aXZhdGUgdGhlIHZpZXcgaWRlbnRpZmllZCBieSB0aGUgdmlldyBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyVmlld0lkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFjdGl2YXRlVmlldyhTdHJpbmcgc3RyVmlld0lkKQotICAgIHsKLSAgICAgICAgYXNzZXJ0IHN0clZpZXdJZCE9bnVsbDsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFnZS5zaG93VmlldyhzdHJWaWV3SWQpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhZ2UuYWN0aXZhdGUocGFnZS5maW5kVmlldyhzdHJWaWV3SWQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3ZpZXdzL1NpbXBsZVRhYmxlTWFya2VyVmlldy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi92aWV3cy9TaW1wbGVUYWJsZU1hcmtlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYTYxMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvY29tbW9uL3ZpZXdzL1NpbXBsZVRhYmxlTWFya2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi52aWV3czsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uSUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5JRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyB2aWV3IHNob3dzIGdlbmVyaWMgYXJ0aWZhY3RzLCByZXByZXNlbnRlZCBieSBhIG1hcmtlciwgdGhhdCBhcmUgZm91bmQgaW4KLSAqIGEgKHNvdXJjZSkgZmlsZS4gPGJyPgotICogSXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGFjdGlvbnMuIFRoZSBvYmplY3QgbW9kZWwgaXMgdGhlIG1hcmtlci4KLSAqIAotICogSXQgcHJvdmlkZXMgc3RhbmRhcmQgY29sdW1ucyBvZiBuYW1lLCBmaWxlbmFtZSwgbGluZU5vLCBhbmQgb25lIG1vcmUuIDxicj4KLSAqIE5hbWVzIGFuZCBsYXN0IGNvbHVtbiBuYW1lIHByb3ZpZGVkIG9uIGN0b3IuIEludGVuZGVkIGZvciBxdWljayByZXVzZS4KLSAqIAotICogQWxsIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIG1hcmtlci4gQXJ0aWZhY3Qgb2JqZWN0cyBjb250YWluaW5nIGFyYml0cmFyeQotICogaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgKG5vdCBleHRlbnNpdmVseSB0ZXN0ZWQgaGVyZSB5ZXQpLgotICogCi0gKiBCUlQgbm90ZTogbmVlZCBhIFNpbXBsZVRhYmxlVmlldyAiY2xlYXIgYWxsIG1hcmtlcnMiIGFjdGlvbgotICogCi0gKiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGFibGVNYXJrZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uIGluZm9BY3Rpb247Ci0JcHJvdGVjdGVkIEFjdGlvbiByZW1vdmVNYXJrZXJBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBmaWx0ZXJBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBkb3VibGVDbGlja0FjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZVN0YXR1c0xpbmUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBWaWV3ZXJTb3J0ZXIgbmFtZVNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIGxpbmVOb1NvcnRlcjsKLQotCXByb3RlY3RlZCBGaWxlbmFtZVNvcnRlciBmaWxlbmFtZVNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIG9yZGVyU29ydGVyOyAvLyBieSAiaWNvbiIKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIG5hbWVBcnRpZmFjdFNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIGNvbnN0cnVjdFNvcnRlcjsKLQotCXByaXZhdGUgSU1hcmtlciBzZWxlY3RlZE1hcmtlcl8gPSBudWxsOwotCi0JLyoqCi0JICogTGlzdCBvZiBhcnRpZmFjdHMgdGhhdCB3ZXJlIGNoYW5nZWQgZHVlIHRvIHNvbWUgYWN0aW9uIHVwb24gdGhlbSBpbiB0aGUKLQkgKiB2aWV3IChjdXJyZW50bHkgdW51c2VkKQotCSAqLwotCXByb3RlY3RlZCBTdGFja0xpc3QgY2hhbmdlZEFydHNfID0gbmV3IFN0YWNrTGlzdCgpOwotCi0JLyoqCi0JICogTGlzdCBvZiBtYXJrZXJzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiBhIGNoYW5nZSBvbiB0aGUgdGhlIGFzc29jaWF0ZWQKLQkgKiBhcnRpZmFjdCBkdWUgdG8gc29tZSBhY3Rpb24gdXBvbiB0aGVtIGhlcmUgaW4gdGhlIHZpZXcgKGN1cnJlbnRseSB1bnVzZWQpCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrTGlzdCBjaGFuZ2VkTWFya2Vyc18gPSBuZXcgU3RhY2tMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgVXBkYXRlVmlzaXRvciB2aXNpdG9yXyA9IG5ldyBVcGRhdGVWaXNpdG9yKCk7Ci0KLQkvKioKLQkgKiBCZSBjb25zaXN0ZW50IGFib3V0IHdoYXQgd2UgY2FsbCB0aGVzZSB0aGluZ3M7IGdlbmVyaWMgdmFsdWVzIChjYW4gYmUpCi0JICogcmVwbGFjZWQgb24gY3Rvci4gPGJyPgotCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gcGx1Z2luLnhtbCBpZiBub3QgcGFzc2VkIG9uIGN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRoaW5nbmFtZV8gPSAiQXJ0aWZhY3QiOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0aGluZ25hbWVzXyA9ICJBcnRpZmFjdHMiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29sdW1uTmFtZV8gPSAiVmFsdWUiOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbl87Ci0KLQlwcml2YXRlIFN0cmluZyBpY29uTmFtZV8gPSAiaWNvbnMvc2FtcGxlLmdpZiI7Ci0KLQlwcml2YXRlIFN0cmluZyB2aWV3TmFtZV87Ci0KLQlwcml2YXRlIFN0cmluZ1tdIG1hcmtlcklEc187Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtbk5hbWVzXzsKLQotCXByaXZhdGUgU3RyaW5nW10gbWFya2VyQXR0ck5hbWVzXzsKLQotCS8qKgotCSAqIFRoZSBJRCB1c2VkIGluIHRoZSBtYXJrZXIgZm9yIHRoZSB1bmlxdWUgSUQgZm9yIGVhY2ggYXJ0aWZhY3QuIEVuYWJsZXMKLQkgKiBtYXBwaW5nIGJhY2sgdG8gdGhlIEFydGlmYWN0IG9iamVjdCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1bmlxdWVJRF8gPSBJRHMuVU5JUVVFX0lEOwotCi0JLyoqCi0JICogVGhlIElEIHVzZWQgaW4gdGhlIG1hcmtlciBmb3IgdGhlIGV4dHJhIGNvbHVtbiBvZiBpbmZvcm1hdGlvbiAobGFzdAotCSAqIGNvbHVtbikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbklEXyA9ICJjb25zdHJ1Y3RUeXBlIjsgLy8gaWQgZm9yICh2YXJpYWJsZSkKLQotCS8qKiBNYXJrZXIgSUQgZm9yIGFydGlmYWN0IG5hbWUgLSBlLmcuIEFQSSBuYW1lLCBwcmFnbWEgbmFtZSwgZXRjLiAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLQkvKiogTWFya2VyIElEIGZvciBzdG9yYWdlIG9mIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgYXJ0aWZhY3QgaXMgZm91bmQgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRSA9ICJmaWxlbmFtZSI7Ci0KLQkvKioKLQkgKiBNYXJrZXIgaWQgZm9yIHN0b3JhZ2Ugb2YgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGFydGlmYWN0IGlzIGZvdW5kLgotCSAqIFJldXNlIG9mIGRlZmF1bHQgSUQgdXNlZCBieSBJTWFya2VyLCByZXBlYXRlZCBoZXJlIGZvciBlYXNlIG9mIHVzZSBhbmQKLQkgKiBmb3IgY2xhcml0eSB0aGF0IFRISVMgaXMgdGhlIG1hcmtlciBJRCBmb3IgbGluZSBudW1iZXIuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0KLQkvKiogTWFya2VyIGlkIGZvciBzdG9yYWdlIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFydGlmYWN0ICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVU5DVElPTl9DQUxMID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UID0gMjsKLQotCS8qKiB0eXBlcyBvZiBjb25zdHJ1Y3RzLCBmb3IgdGhlIGRlZmF1bHQgY2FzZSAqLwotCXB1YmxpYyBzdGF0aWMgICBTdHJpbmdbXSBDT05TVFJVQ1RfVFlQRV9OQU1FUyA9IHsgIk5vbmUiLAotCQkJIkZ1bmN0aW9uIENhbGwiLCAiQ29uc3RhbnQiIH07Ci0KLQkvKioKLQkgKiBTaW1wbGUgQXJ0aWZhY3QgVGFibGUgVmlldyBjb25zdHJ1Y3RvcgotCSAqIDxwPgotCSAqIEV2ZXJ5dGhpbmcgY2FuIGJlIG51bGwsIGFuZCBkZWZhdWx0cyB3aWxsIGJlIHRha2VuLCBvciByZWFkIGZyb20KLQkgKiBwbHVnaW4ueG1sIGZvciB0aGUgdmlldy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBpZiBhIG51bGwgcGx1Z0luIGluc3RhbmNlIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBwbHVnaW4gKHRoaXMKLQkgKiBvbmUpIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCByZXNvdXJjZXMgKGUuZy4gaWNvbiBpbWFnZXMpIGlmIHRoZSBkZXJpdmVkCi0JICogY2xhc3MgaXMgaW4gaXRzIG93biBwbHVnLWluLCBhbmQgaXRzIGljb25zIGFyZSwgdG9vLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUYWJsZU1hcmtlclZpZXcoQWJzdHJhY3RVSVBsdWdpbiB0aGVQbHVnaW4sIFN0cmluZyB0aGluZ25hbWUsCi0JCQlTdHJpbmcgdGhpbmduYW1lcywgU3RyaW5nIGNvbHVtbk5hbWUsIFN0cmluZ1tdIG1hcmtlcklEcykgewotCi0JCWlmICh0aGVQbHVnaW4gPT0gbnVsbCkgewotCQkJdGhlUGx1Z2luXyA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnRoZVBsdWdpbl8gPSB0aGVQbHVnaW47Ci0JCX0KLQkJaWYgKHRoaW5nbmFtZSAhPSBudWxsKQotCQkJdGhpcy50aGluZ25hbWVfID0gdGhpbmduYW1lOwotCQlpZiAodGhpbmduYW1lcyAhPSBudWxsKQotCQkJdGhpcy50aGluZ25hbWVzXyA9IHRoaW5nbmFtZXM7Ci0JCWlmIChjb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uTmFtZV8gPSBjb2x1bW5OYW1lOyAvLyBsYXN0IGNvbHVtbiBuYW1lZCBieSBzdWJjbGFzcwotCQl9Ci0JCXRoaXMubWFya2VySURzXyA9IG1hcmtlcklEczsvLyBpZiBudWxsLCB3aWxsIHVzZSB2aWV3IGlkLgotCi0JCWZpbmRWaWV3SW5mbygpOwotCi0JfQotCXB1YmxpYyBTaW1wbGVUYWJsZU1hcmtlclZpZXcoQWJzdHJhY3RVSVBsdWdpbiB0aGVQbHVnaW4sIFN0cmluZyB0aGluZ25hbWUsCi0JCQlTdHJpbmcgdGhpbmduYW1lcywgU3RyaW5nIGNvbHVtbk5hbWUsIFN0cmluZyBtYXJrZXJJRCkgewotCQl0aGlzKHRoZVBsdWdpbiwgdGhpbmduYW1lLCB0aGluZ25hbWVzLCBjb2x1bW5OYW1lLCBuZXcgU3RyaW5nW117bWFya2VySUR9KTsKLQkJCi0JCi0JfQotCi0JLyoqCi0JICogU2ltcGxlIHRhYmxlIHZpZXcgd2l0aCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGV4dHJhIGNvbHVtbnMKLQkgKiAKLQkgKiBAcGFyYW0gdGhlUGx1Z2luCi0JICogQHBhcmFtIHRoaW5nbmFtZQotCSAqIEBwYXJhbSB0aGluZ25hbWVzCi0JICogQHBhcmFtIGF0dHJOYW1lcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBtYXJrZXIgYXR0cmlidXRlcywgZm9yIHdoaWNoIHRoZSBjb2x1bW4gdmFsdWVzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGV4dHJhY3RkCi0JICogQHBhcmFtIGNvbE5hbWVzCi0JICogICAgICAgICAgICBsaXN0IG9mIENvbHVtbiBuYW1lcywgdXNlZCBhcyBoZWFkZXJzIGZvciB0aGUgdmFsdWVzIGZvdW5kIGluCi0JICogICAgICAgICAgICB0aGUgbWFya2VyIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gbWFya2VySURfCi0JICovCi0JcHVibGljIFNpbXBsZVRhYmxlTWFya2VyVmlldyhBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbiwgU3RyaW5nIHRoaW5nbmFtZSwKLQkJCVN0cmluZyB0aGluZ25hbWVzLCBTdHJpbmdbXSBhdHRyTmFtZXMsIFN0cmluZ1tdIGNvbE5hbWVzLAotCQkJU3RyaW5nW10gbWFya2VySURzKSB7Ci0JCXRoaXModGhlUGx1Z2luLCB0aGluZ25hbWUsIHRoaW5nbmFtZXMsIG51bGwsIG1hcmtlcklEcyk7Ci0JCWNvbHVtbk5hbWVzXyA9IGNvbE5hbWVzOwotCQljb2x1bW5OYW1lXyA9IG51bGw7Ly8gc2V0IHRoaXMgc28gd2UgY2FuIHRlbGwgd2UgYXJlIHVzaW5nIGFycmF5IG9mCi0JCQkJCQkJLy8gYXR0cnMvY29scwotCQltYXJrZXJBdHRyTmFtZXNfID0gYXR0ck5hbWVzOwotCi0JfQotCi0JLyoqCi0JICogQ3RvciB0aGF0IHVzZXMgZGVmYXVsdHMgZm9yIGV2ZXJ5dGhpbmcgKHRlc3Rpbmc/IHRoZW9yZXRpY2FsbHksIHRoaXMKLQkgKiBzaG91bGQgd29yaywgYW5kIHNob3VsZCBiZSByZXVzYWJsZSBzaW5jZSBpbmZvIHRoYXQgbXVzdCBiZSB1bmlxdWUgaXMKLQkgKiByZWFkIGZyb20gZnJvbSBwbHVnaW4ueG1sLikKLQkgKiAKLQkgKi8KLS8vCXB1YmxpYyBTaW1wbGVUYWJsZU1hcmtlclZpZXcoKSB7Ci0vLwkJdGhpcyhudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLS8vCX0KLQotCS8qKgotCSAqIEZpbmQgaW5mbyBmcm9tIHRoZSB2aWV3IGluZm8gaW4gdGhlIG1hbmlmZXN0LiBUaGlzIGluY2x1ZGVzIHRoZSBpY29uCi0JICogbmFtZSwgdGhlIHZpZXcgaWQgKHVzZWQgYXMgbWFya2VyIGlkIGlmIG5vbmUgZ2l2ZW4gb24gY3RvciksIGFuZAotCSAqIGNvbnN0cnVjdHMgYW4gYXJ0aWZhY3QgbWFuYWdlciBmb3IgdGhpcyB2aWV3J3MgYXJ0aWZhY3Qgb2JqZWN0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRWaWV3SW5mbygpIHsKLQkJU3RyaW5nIGNsYXNzbmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCS8vIHRyeSB0byBmaW5kIHRoZSBpY29uIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmb3IgdGhpcwotCQkvLyBleHRlbnNpb24vdmlldwotCQlJRXh0ZW5zaW9uW10gZXh0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MiKS5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dFtpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNlcyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNFbGVtZW50ID0gY2VzW2pdOwotCQkJCVN0cmluZyBpY29uTmFtZSA9IGNFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWNvbiIpOwotCQkJCVN0cmluZyBjbGFzc04gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCQlpZiAoY2xhc3NuYW1lLmVxdWFscyhjbGFzc04pKSB7Ci0JCQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpY29uTmFtZV8gPSBpY29uTmFtZTsKLQkJCQkJfQotCQkJCQl0aGlzLnZpZXdOYW1lXyA9IG5hbWU7Ci0JCQkJCWlmIChtYXJrZXJJRHNfID09IG51bGwpIHsKLQkJCQkJCS8vIHVzZSBwbHVnLWluIGlkIGZvciBtYXJrZXIgaWQsIGlmIG5vdCBzcGVjaWZpZWQKLQkJCQkJCW1hcmtlcklEc18gPSBuZXcgU3RyaW5nWzFdOwotCQkJCQkJU3RyaW5nIHBsdWdpbklEPWNFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCQkJCW1hcmtlcklEc19bMV09cGx1Z2luSUQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQgbWlnaHQgYmUgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIHRoaXMsIHRvIHNheSB3aGljaAotCSAqIGZpbGVuYW1lcyBzaG91bGQgYWxsb3cgdGhlIGFjdGlvbiAicnVuIGFuYWx5c2lzIiB0byBjcmVhdGUgbmV3IGFydGlmYWN0cwotCSAqIGFuZCB0aHVzIG5ldyBtYXJrZXJzLiA8YnI+Ci0JICogVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRGb3JBbmFseXNpcyhTdHJpbmcgZmlsZW5hbWUpIHsKLQkJLy8gcmV0dXJuIE1waVV0aWwudmFsaWRGb3JBbmFseXNpcyhmaWxlbmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBvYmplY3RzIHRvIHRoZQotCSAqIHZpZXcuIEl0IGNhbiB3cmFwIGV4aXN0aW5nIG9iamVjdHMgaW4gYWRhcHRlcnMgb3Igc2ltcGx5IHJldHVybiBvYmplY3RzCi0JICogYXMtaXMuIFRoZXNlIG9iamVjdHMgbWF5IGJlIHNlbnNpdGl2ZSB0byB0aGUgY3VycmVudCBpbnB1dCBvZiB0aGUgdmlldywKLQkgKiBvciBpZ25vcmUgaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgKGxpa2UgVGFzayBMaXN0LCBmb3IKLQkgKiBleGFtcGxlKS4KLQkgKi8KLQljbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsCi0JCQlJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgSVJlc291cmNlIGlucHV0OwotCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNSZWdpc3RlcmVkID0gZmFsc2U7Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2LCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy8gY291bGQgdXNlIHRoaXMgdG8gY2hhbmdlIHRoZSBsaXN0IHRvIGp1c3QgYXJ0aWZhY3RzIGZyb20gb25lCi0JCQkvLyByZXNvdXJjZSwKLQkJCS8vIGV0Yy4uLgotCQkJLy8gY291bGQgY2FjaGUgdmlld2VyIGhlcmUgdGhpcy52aWV3ZXI9djsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWIGlucHV0Q2hhbmdlZCgpLi4uIik7Ci0JCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBnaXZlbiBhbiBpbnB1dAotCQkJaWYgKCFoYXNSZWdpc3RlcmVkKSB7Ci0JCQkJLy8gYWRkIG1lIGFzIGEgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyIHNvIGkgY2FuIHJlZnJlc2ggYXQKLQkJCQkvLyBsZWFzdCB3aGVuIG1hcmtlcnMgYXJlIGNoYW5nZWQKLQkJCQkvLyBQT1NUX0NIQU5HRTogb25seSB3YW50IGV2ZW50IG5vdGlmaWNhdGlvbnMgZm9yIGFmdGVyLXRoZS1mYWN0Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywKLQkJCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCQloYXNSZWdpc3RlcmVkID0gdHJ1ZTsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJBVFY6IFJlZ2lzdGVyZWQgUkNMIGZvciBWaWV3Q29udGVudFByb3ZpZGVyIik7Ci0JCQl9Ci0JCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQl0aGlzLmlucHV0ID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVi5WaWV3Q29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKSIpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBwb3B1bGF0ZSB0aGlzIHZpZXcuCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJT2JqZWN0W10gb2JqcyA9IG51bGw7Ci0JCQlMaXN0PElNYXJrZXI+ICBhbGxPYmpzPW5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLQkJCXRyeSB7Ci0JCQkJLy9TdHJpbmcgaWQgPSBtYXJrZXJJRHNfOwotCQkJCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnB1dCBpcyBudWxsIGluIGdldEVsZW1lbnRzLi4uIik7Ci0JCQkJfQotCQkJCS8vIHVzZSB0aGUgY2FjaGVkIGlucHV0IG9iamVjdCBpbnN0ZWFkIG9mIHF1ZXJ5aW5nIGZyb20KLQkJCQkvLyB3b3Jrc3BhY2Ugb2JqcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1hcmtlcnMoaWQsCi0JCQkJLy8gZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJJRHNfLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBpZD0gbWFya2VySURzX1tpXTsKLQkJCQkJb2JqcyA9IGlucHV0LmZpbmRNYXJrZXJzKGlkLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJTGlzdCAgbWFya0xpc3Q9IEFycmF5cy5hc0xpc3Qob2Jqcyk7Ci0JCQkJCS8vYWxsT2Jqcy5hZGRBbGwoKExpc3Q8SU1hcmtlcj4pIEFycmF5cy5hc0xpc3Qob2JqcykpOwotCQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgIisob2Jqcy5sZW5ndGgpKyAiIG1hcmtlcnMgb2YgdHlwZSAiCi0JCQkJCQkJK2lkKTsKLQkJCQkJYWxsT2Jqcy5hZGRBbGwobWFya0xpc3QpOwotCQkJCQkgCi0JCQkJCS8vU3RyaW5nW10gc2wgPSAoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJCQl9Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kICIrYWxsT2Jqcy5zaXplKCkrIiB0b3RhbCBtYXJrZXJzIik7Ci0JCQkJIAotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkFUViwgZXhjZXB0aW9uIGdldHRpbmcgbW9kZWwgZWxlbWVudHMgKG1hcmtlcnMgZm9yIFRhYmxlIHZpZXcpIik7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWLmdldC0tLUVsZW1lbnRzLCBmb3VuZCAiICsgb2Jqcy5sZW5ndGgKLQkJCQkJCSsgIiBtYXJrZXJzIik7Ci0JCQlyZXR1cm4gYWxsT2Jqcy50b0FycmF5KCk7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiByZWFjdCB0byBhIHJlc291cmNlIGNoYW5nZSBldmVudAotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLXJlc291cmNlQ2hhbmdlZCgpIik7Ci0JCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFJlc291cmNlc0NoYW5nZWQoZGVsdGEsIDEpOwotCQkJLy8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgd2hlbiByZXNvdXJjZSBkZWx0YSB2aXNpdG9yIGRvZXMgaXQgYWxsPwotCQkJQ29udHJvbCBjdHJsID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCWlmIChjdHJsICE9IG51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY3RybC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oInZpZXdlci51cGRhdGUgZWEgbWtyIGluIGRlbHRhLS0gZnJvbSByZXNvdXJjZUNoYW5nZWQoKS4uLiIpOwotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIi0tLS1wcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YSgpLi4uIik7Ci0JCQkJCQkJcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoZGVsdGEpOwotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIi0tLS1FTkQgcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoKS4uLiIpOwotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZpZXdlci5yZWZyZXNoKCkiKTsKLQkJCQkJCQkvLyB3ZSBzaG91bGQgaGF2ZSB1cGRhdGVkIHRoZSBpbmRpdi4gcm93cyB3ZSBjYXJlCi0JCQkJCQkJLy8gYWJvdXQsCi0JCQkJCQkJLy8gYnV0IG5lZWQgdGhpcyBmb3IgTWFya2VyIGRpc3BsYXkgYWZ0ZXIgaW5pdGlhbAotCQkJCQkJCS8vIGFuYWx5c2lzLAotCQkJCQkJCS8vIGFuZCBmb3IgbWFya2VycyBkZWxldGVkLCBldGMuIENhbiByZW1vdmUgd2hlbiB3ZQotCQkJCQkJCS8vIG1vcmUgY29tcGxldGVseQotCQkJCQkJCS8vIGhhbmRsZSB0aGluZ3MgaW4gcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEKLQkJCQkJCQkvLyAocmVtb3ZlcyBldGMuKQotCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkFUVjogRXhjZXB0aW9uIHJlZnJlc2hpbmcgdmlld2VyOiAiCi0JCQkJCQkJCQkJCSsgZSk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tRU5EIHJlc291cmNlQ2hhbmdlZCgpXG4iKTsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIERlYnVnZ2luZyBzdGF0ZW1lbnQgaGVscCAtIHByaW50cyB0aGUgZXZlbnRzLCBpbmRlbnRlZCBieSBuZXN0aW5nCi0JCSAqIGxldmVsCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICogQHBhcmFtIGluZGVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHByaW50UmVzb3VyY2VzQ2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGluZGVudCkgewotCQkJcHJpbnRPbmVSZXNvdXJjZUNoYW5nZWQoZGVsdGEsIGluZGVudCk7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlwcmludFJlc291cmNlc0NoYW5nZWQoY2hpbGRyZW5baV0sIGluZGVudCArIDEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNvbWUgZGVidWdnaW5nIHN0YXRlbWVudCBoZWxwCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICogQHBhcmFtIGluZGVudCBudW1iZXIgb2YgbGV2ZWxzIG9mIGluZGVudCB3ZSBzaG91bGQgY29uc2lkZXIgb3Vyc2VsdmVzIGFzIGJlaW5nIGluCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcHJpbnRPbmVSZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBpbmRlbnQpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0JCQkJYnVmLmFwcGVuZCgiICAiKTsKLQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCWJ1Zi5hcHBlbmQoIkFEREVEIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJYnVmLmFwcGVuZCgiUkVNT1ZFRCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCWJ1Zi5hcHBlbmQoIkNIQU5HRUQiKTsKLQkJCQl0ZXN0RGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlidWYuYXBwZW5kKCJbIik7Ci0JCQkJYnVmLmFwcGVuZChkZWx0YS5nZXRLaW5kKCkpOwotCQkJCWJ1Zi5hcHBlbmQoIl0iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoIiAiKTsKLQkJCWJ1Zi5hcHBlbmQoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVmKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaG93IGRlYnVnZ2luZyBpbmZvIGZvciBhIHJlc291cmNlIGRlbHRhIGNoYW5nZQotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdGVzdERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkvLyAtLSBjb2RlIGZyb20gZWNsaXBzZSBoZWxwOgotCQkJLy8gY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJU3lzdGVtLm91dC5wcmludCgiUmVzb3VyY2UgIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KGRlbHRhLmdldEZ1bGxQYXRoKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgaGFzIGNoYW5nZWQuIik7Ci0JCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQkJaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpICE9IDApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tPiBDb250ZW50IENoYW5nZSIpOwotCQkJfQotCQkJaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSAhPSAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLT4gQ29udGVudCBSZXBsYWNlZCIpOwotCQkJfQotCQkJaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpICE9IDApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tPiBNYXJrZXIgQ2hhbmdlIik7Ci0JCQkJLy8gSU1hcmtlckRlbHRhW10gbWFya2VycyA9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJCS8vIGlmIGludGVyZXN0ZWQgaW4gbWFya2VycywgY2hlY2sgdGhlc2UgZGVsdGFzCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUHJvY2VzcyB0aGUgcmVzb3VyY2UgY2hhbmdlIC0ganVzdCB0aGUgZGVsdGEKLQkJICogCi0JCSAqIEBwYXJhbSBkZWx0YQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3JfKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMikgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJFcnJvciBpbiBQSVRWLnByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKCkuLiIpOwotCQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9IC8vIGVuZCBWaWV3Q29udGVudFByb3ZpZGVyCi0KLQkvKioKLQkgKiBnZXQgYXJ0aWZhY3QgZnJvbSBtYXJrZXIKLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJQXJ0aWZhY3QgZ2V0U2ltcGxlQXJ0aWZhY3QoSU1hcmtlciBtYXJrZXIpIHsKLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJSUFydGlmYWN0IGFydGlmYWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZSh1bmlxdWVJRF8pOwotCQkJYXJ0aWZhY3QgPUFydGlmYWN0TWFuYWdlci5nZXRBcnRpZmFjdChtYXJrZXIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkKLQkJCQkJKyAiIC4uLiBTVFYsIENvcmVFeGNlcHRpb24gZ2V0dGluZyBhcnRpZmFjdCBmcm9tIGhhc2hNYXA7ICIKLQkJCQkJKyB0aGluZ25hbWVfICsgIiBpZD0iICsgaWQpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBuZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG5lLmdldE1lc3NhZ2UoKQotCQkJCQkrICIgLi4uIFNUViwgTnVsbFB0ckV4Y3AgZ2V0dGluZyBhcnRpZmFjdCBmcm9tIGhhc2hNYXA7IgotCQkJCQkrIHRoaW5nbmFtZV8gKyAiIGlkPSIgKyBpZCk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0OwotCi0JfQotCi0JLyoqCi0JICogR2V0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgY29uc3RydWN0Ci0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnN0cnVjdFN0cihJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnRlZ2VyIHRlbXAgPSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShjb2x1bW5JRF8pOwotCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQlJbnRlZ2VyIGNvbnN0cnVjdFR5cGUgPSAoSW50ZWdlcikgdGVtcDsKLQkJCXJldHVybiBDT05TVFJVQ1RfVFlQRV9OQU1FU1tjb25zdHJ1Y3RUeXBlLmludFZhbHVlKCldOwotCQl9IGVsc2UKLQkJCXJldHVybiAiICI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogVmlld0xhYmVsUHJvdmlkZXIgLSBwcm92aWRlcyB0aGUgdGV4dCBhbmQgaW1hZ2VzIGZvciB0aGUgYXJ0aWZhY3RzIGluIHRoZQotCSAqIFRhYmxlIFZpZXcKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKiAKLQkgKiAKLQkgKi8KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQkJSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCS8qKgotCQkgKiBLZWVwIGljb25zIGFscmVhZHkgY3JlYXRlZCwgYW5kIHJldXNlIHRoZSBpbWFnZXMKLQkJICovCi0JCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEltYWdlPiBpY29uSGFzaCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2U+KCk7Ci0KLQkJcHJpdmF0ZSBJQXJ0aWZhY3QgYXJ0aWZhY3Q7Ci0KLQkJLyoqCi0JCSAqIHByb3ZpZGUgd2hhdCBnb2VzIGluIGVhY2ggY29sdW1uOyBnZXQgdGhlIGluZm8gZnJvbSB0aGUgbWFya2VyCi0JCSAqLwotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvKSB7Ci0JCQlTdHJpbmcgdGVtcCA9IHN1cGVyLmdldFRleHQobyk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQ6ICIgKyB0ZW1wKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZSB0aGUgdGV4dCB0byBnbyBpbiBlYWNoIGNvbHVtbgotCQkgKiAKLQkJICogQHBhcmFtIG9iagotCQkgKiAgICAgICAgICAgIHRoZSBNYXJrZXIgKHdlIGhvcGUpIHRoYXQgZ29lcyBvbiB0aGUgY3VycmVudCByb3cKLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqICAgICAgICAgICAgdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIHRhYmxlCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkFUVjogTGFiZWxQcm92IG9iaiBpcyBudWxsOyBpbmRleD0iICsgaW5kZXgpOwotCQkJCXJldHVybiAiQVRWIG9iaiBudWxsIjsKLQkJCX0KLQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG9iajsKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoIChpbmRleCkgewotCQkJCWNhc2UgMDoKLQkJCQkJcmV0dXJuICIiOwotCQkJCWNhc2UgMToKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJCQkJcmV0dXJuIGlkOwotCQkJCWNhc2UgMjoKLQotCQkJCQlyZXR1cm4gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJY2FzZSAzOgotCQkJCQlTdHJpbmcgbGluZSA9IChtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpKQotCQkJCQkJCS50b1N0cmluZygpOwotCi0JCQkJCWlmICh0cmFjZU9uKSB7IC8vIGFsbCB0aGlzIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgc28KLQkJCQkJCWFydGlmYWN0ID0gZ2V0U2ltcGxlQXJ0aWZhY3QobWFya2VyKTsKLQkJCQkJCVN0cmluZyBjb21wTGluZSA9IGxpbmUgKyAiLSI7Ci0JCQkJCQlpZiAoYXJ0aWZhY3QgPT0gbnVsbCkgewotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkFUViBnZXRDb2x1bW5UZXh0LSBudWxsIGFydGlmYWN0Iik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBsaW5lQXJ0aWZhY3QgPSBhcnRpZmFjdC5nZXRMaW5lKCk7Ci0JCQkJCQkJY29tcExpbmUgPSBjb21wTGluZSArIGxpbmVBcnRpZmFjdDsKLQkJCQkJCX0KLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkFUVi5WaWV3TGFiZWxQcm92aWRlciBnZXRzIG1hcmtlciBsaW5lOiBta3ItYXJ0aWZhY3Q6ICIKLQkJCQkJCQkJCQkrIGNvbXBMaW5lKTsKLQkJCQkJCXNob3dNYXJrZXIobWFya2VyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbGluZTsKLQkJCQljYXNlIDQ6Ci0JCQkJCWlmIChjb2x1bW5OYW1lXyAhPSBudWxsKSB7Ly8gd2UncmUgbm90IHVzaW5nIGFycmF5Ci0JCQkJCQlyZXR1cm4gZ2V0Q29uc3RydWN0U3RyKG1hcmtlcik7Ci0JCQkJCX0KLQkJCQkvLyBlbHNlIGRyb3AgdGhyb3VnaC4uLgotCi0JCQkJZGVmYXVsdDoKLQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gbWFya2VyQXR0ck5hbWVzX1tpbmRleCAtIDRdOwotCQkJCQlTdHJpbmcgdmFsID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIiIpOwotCQkJCQlyZXR1cm4gdmFsOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkvLyBnZXQgdGhpcyBlcnJvciAzeCAiTWFya2VyIGlkOiA5OTkgbm90IGZvdW5kLiIgd2hpbGUgZGVsZXRpbmcKLQkJCQkvLyBtYXJrZXJzLiB3aHk/Ci0JCQkJLy8gV2h5IGlzIHRoaXMgZXZlbiBnZXR0aW5nIGNhbGxlZCwgYW5kIHdoeSBkb2VzIGl0IG1hdHRlcj8KLQkJCQkvLyBTdHJpbmcgdG1wID0gY2UuZ2V0TWVzc2FnZSgpOwotCQkJCS8vIGNlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJldHVybiAoIkFUViBlcnJvciIpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFByb3ZpZGUgdGhlIGltYWdlIHRoYXQgZ29lcyBpbiBhIGNvbHVtbiwgaWYgYW55IChOb3RlIHRoYXQgYSB0YWJsZQotCQkgKiBjZWxsIGNhbiBjb250YWluIGJvdGgsIGFuIGltYWdlIGFuZCB0ZXh0LCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZAotCQkgKiBzaWRlLWJ5LXNpZGUpCi0JCSAqIAotCQkgKiBAcGFyYW0gb2JqIC0KLQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IHdlJ3JlIGdldHRpbmcgdGhlIGltYWdlIGZvcgotCQkgKiBAcGFyYW0gaW5kZXggLQotCQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gdGhhdCB0aGlzIGltYWdlIGlzIHRvIGdvIGluCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQkvLyB3ZSBvbmx5IHB1dCBpbWFnZSBpY29uIGluIHRoZSBmaXJzdCBjb2x1bW4KLQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9tSW1hZ2Uob2JqKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IGltYWdlIGZvciBhcnRpZmFjdC4gTm90ZSB0aGF0IGRpZmZlcmVudCBpbWFnZXMgY291bGQgYmUgdXNlZCBmb3IKLQkJICogZGlmZmVyZW50IHR5cGVzIG9mIGFydGlmYWN0cy4gRm9yIG5vdyB3ZSBoYXZlIGEgc2luZ2xlIGltYWdlLgotCQkgKiAKLQkJICogQHBhcmFtIG9iagotCQkgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgb2JqZWN0IHRoYXQgdGhpcyBhcnRpZmFjdCBpcyByZXByZXNlbnRlZCBieQotCQkgKiBAcmV0dXJuIGltYWdlIGZvciBtYXJrZXIKLQkJICogICAgICAgICA8cD4KLQkJICogICAgICAgICBOb3RlOiBpZiBhIG51bGwgcGx1Z0luIGluc3RhbmNlIGlzIHByb3ZpZGVkIG9uIHRoZSB2aWV3IGN0b3IsCi0JCSAqICAgICAgICAgdGhlIGRlZmF1bHQgcGx1Z2luICh0aGlzIG9uZSkgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kCi0JCSAqICAgICAgICAgcmVzb3VyY2VzIChlLmcuIGljb24gaW1hZ2VzKSBpZiB0aGUgZGVyaXZlZCBjbGFzcyBpcyBpbiBpdHMKLQkJICogICAgICAgICBvd24gcGx1Zy1pbiwgYW5kIGl0cyBpY29ucyBhcmUsIHRvby4KLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0Q3VzdG9tSW1hZ2UoT2JqZWN0IG9iaikgewotCQkJLy8gaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIG9uZSBvZiB0aGlzIHR5cGUgb2YgaWNvbiwgcmV1c2UgaXQuCi0JCQkvLyBOb3RlOiB1c2UgSW1hZ2VSZWdpc3RyeSBpbnN0ZWFkPwotCQkJSW1hZ2UgaW1nID0gaWNvbkhhc2guZ2V0KGljb25OYW1lXyk7Ci0JCQlpZiAoaW1nID09IG51bGwpIHsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChpY29uTmFtZV8pOwotCQkJCS8vIEJSVCBtYWtlIHN1cmUgdGhlIHNwZWNpZmljIHBsdWdpbiBpcyBiZWluZyB1c2VkIGhlcmUgdG8gZmluZAotCQkJCS8vIGl0cyBPV04gaWNvbnMKLQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZCh0aGVQbHVnaW5fLmdldEJ1bmRsZSgpLCBwYXRoLCBudWxsKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkJCWltZyA9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiAqKioqKiBjcmVhdGVkIGltYWdlIGZvciAiCi0JCQkJCQkJKyBpY29uTmFtZV8pOwotCQkJCWljb25IYXNoLnB1dChpY29uTmFtZV8sIGltZyk7Ly8gc2F2ZSBmb3IgcmV1c2UKLQkJCX0KLQkJCXJldHVybiBpbWc7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZSBvZiBhbnl0aGluZyB0aGF0IHdvdWxkIGhhbmcgYXJvdW5kIHJ1ZGVseSBvdGhlcndpc2UgKHN1Y2ggYXMKLQkJICogaW1hZ2Ugb2JqZWN0cyBmcm9tIHRoZSBpY29ucykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQVRWLlZpZXdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsgZGlzcG9zZSBvZiBpY29uIGltYWdlcyIpOwotCQkJZm9yIChJdGVyYXRvcjxJbWFnZT4gaXRlciA9IGljb25IYXNoLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUltYWdlIGltZyA9IGl0ZXIubmV4dCgpOwotCQkJCWltZy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgc29ydGVyIGZvciBpdGVtcyAtIHRoZSBvcmRlciB0aGV5IHdlcmUgY3JlYXRlZCwgd2hpY2ggdGVuZHMgdG8KLQkgKiBncm91cCBpdGVtcyB3aXRoIHRoZWlyIHNvdXJjZSBjb2RlIGxvY2F0aW9ucwotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqLwotCWNsYXNzIE5hbWVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgb25lIG9yIG1vcmUgb2Y6IGFydGlmYWN0LCBmaWxlbmFtZSwgbGluZU5vLAotCSAqIHZhcmlhYmxlQ29sdW1uTmFtZS48YnI+Ci0JICogVGhlIGRlcml2ZWQgY2xhc3NlcyB3aWxsIGltcGxlbWVudCBjb21iaW5lKCkgdG8gc2F5IGhvdyB0aGUgYXR0cmlidXRlcwotCSAqIGFyZSBjb21iaW5lZCB0byBnZXQgdGhlIHNvcnQgZGVzaXJlZC4KLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBHZW5lcmljU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYXNjZW5kaW5nID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQ29tcGFyZSB0d28gaXRlbXMgdG8gZGV0ZXJtaW5lIHNvcnQgb3JkZXIuIFNvcnQgaXRlbXMgYnkgb25lIG9yIG1vcmUKLQkJICogb2Y6IGFydGlmYWN0IG5hbWUsIHRoZW4gZmlsZSwgdGhlbiBsaW5lIG51bWJlciwgdGhlbiBjb25zdHJ1Y3QKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJaW50IHJlc3VsdCA9IDA7Ci0KLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCi0JCQlqYXZhLnRleHQuQ29sbGF0b3IgY29sbGF0b3IgPSB0aGlzLmdldENvbGxhdG9yKCk7Ci0KLQkJCWlmIChlMSBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyIG0xID0gKElNYXJrZXIpIGUxOwotCQkJCQlJTWFya2VyIG0yID0gKElNYXJrZXIpIGUyOwotCQkJCQlTdHJpbmcgbmFtZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQkJCVN0cmluZyBmaWxlMSA9IChTdHJpbmcpIG0xLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0KLQkJCQkJU3RyaW5nIGxpbmUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBjb25zdHJ1Y3QxID0gZ2V0Q29uc3RydWN0U3RyKG0xKTsKLQkJCQkJU3RyaW5nIHNvcnQxID0gY29tYmluZShuYW1lMSwgZmlsZTEsIGxpbmUxLCBjb25zdHJ1Y3QxKTsKLQotCQkJCQlTdHJpbmcgbmFtZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQkJCVN0cmluZyBmaWxlMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJCVN0cmluZyBsaW5lMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShMSU5FKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgY29uc3RydWN0MiA9IGdldENvbnN0cnVjdFN0cihtMik7Ci0JCQkJCVN0cmluZyBzb3J0MiA9IGNvbWJpbmUobmFtZTIsIGZpbGUyLCBsaW5lMiwgY29uc3RydWN0Mik7Ci0KLQkJCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUoc29ydDEsIHNvcnQyKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShzb3J0Miwgc29ydDEpOwotCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBDb21iaW5lIG5hbWUsIGZpbGUsIGFuZC9vciBsaW5lIG51bWJlciB0byBwcm92aWRlIHRoZSBzdHJpbmcgdG8gc29ydAotCQkgKiBieS4gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3NlcyBhcyBuZWVkZWQKLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEBwYXJhbSBmaWxlCi0JCSAqIEBwYXJhbSBsaW5lCi0JCSAqIEBwYXJhbSBjb25zdHJ1Y3QKLQkJICogQHJldHVybiBhbHdheXMgcmV0dXJuIG51bGwsIHN1YmNsYXNzIGNhbiBjaG9vc2UgdG8gaW1wbC4gdGhpcyBtZXRob2QuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmUoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSwKLQkJCQlTdHJpbmcgY29uc3RydWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBzd2l0Y2ggdG8gdGhpcyBzb3J0ZXIuIElmIGl0IHdhcyBhbHJlYWR5IHRoaXMgc29ydGVyLCB0aGVuIHRvZ2dsZSB0aGUKLQkJICogc29ydCBvcmRlcgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNvcnQoKSB7Ci0JCQkvLyBTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUrIi5zb3J0KCkgYXNjZW5kaW5nPSIrYXNjZW5kaW5nKTsKLQkJCWlmICh0aGlzID09IHZpZXdlci5nZXRTb3J0ZXIoKSkgewotCQkJCWFzY2VuZGluZyA9ICFhc2NlbmRpbmc7Ci0JCQkJdmlld2VyLnNldFNvcnRlcihudWxsKTsgLy8gdHVybiBvZmYgdG8gZm9yY2UgcmUtc29ydAotCQkJfSBlbHNlIHsKLQkJCQlhc2NlbmRpbmcgPSB0cnVlOwotCQkJfQotCQkJdmlld2VyLnNldFNvcnRlcih0aGlzKTsKLQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBTb3J0ZXIgdG8gc29ydCBieSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgU2ltcGxlQXJ0aWZhY3QgaXMgRm91bmQKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMgY3JlYXRlZAotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIExpbmVOb1NvcnRlciBleHRlbmRzIEdlbmVyaWNTb3J0ZXIgewotCQkvKioKLQkJICogc29ydCBpdGVtcyBieSBsaW5lIG51bWJlcgotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCi0JCQlpZiAoZTEgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSU1hcmtlciBtMSA9IChJTWFya2VyKSBlMTsKLQkJCQkJT2JqZWN0IHRlbXBPYmogPSBtMS5nZXRBdHRyaWJ1dGUoTElORSk7Ci0JCQkJCWludCBsaW5lMT0wOwotCQkJCQlpbnQgbGluZTI9MDsKLQkJCQkJaWYgKHRlbXBPYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQlsaW5lMSA9ICgoSW50ZWdlcil0ZW1wT2JqKS5pbnRWYWx1ZSgpOwotCQkJCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQkJCXRlbXBPYmo9IG0yLmdldEF0dHJpYnV0ZShMSU5FKTsKLQkJCQkJCS8vIHdlIGFzc3VtZSBpZiB0aGUgZmlyc3Qgd2FzIEludGVnZXIsIHRoaXMgb25lIGlzLCB0b28uCi0JCQkJCQlhc3NlcnQgdGVtcE9iaiBpbnN0YW5jZW9mIEludGVnZXI7Ci0JCQkJCQlsaW5lMiA9ICgoSW50ZWdlcil0ZW1wT2JqKS5pbnRWYWx1ZSgpOwotCi0JCQkJCX0KLQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCQlyZXN1bHQgPSBsaW5lMSAtIGxpbmUyOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBsaW5lMiAtIGxpbmUxOwotCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgbmFtZQotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIE5hbWVBcnRpZmFjdFNvcnRlciBleHRlbmRzIEdlbmVyaWNTb3J0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcGFyYW0gZmlsZQotCQkgKiBAcGFyYW0gbGluZQotCQkgKiBAcGFyYW0gY29uc3RydWN0Ci0JCSAqIEByZXR1cm4gQlJUIG5vdGU6IFNvcnQgaXNuJ3QgcXVpdGUgcmlnaHQ6IGlmIG5hbWUsZmlsZW5hbWUgaWRlbnRpY2FsLAotCQkgKiAgICAgICAgICIxMCIgd291bGQgc29ydCBiZWZvcmUgIjIiIGUuZy4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgY29tYmluZShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGUsIFN0cmluZyBsaW5lLAotCQkJCVN0cmluZyBjb25zdHJ1Y3QpIHsKLQkJCWZpbmFsIFN0cmluZyBkZWxpbSA9ICIgLSAiOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoZmlsZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQobGluZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoY29uc3RydWN0KTsKLQkJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgZmlsZW5hbWUgKHRoZW4gbGluZSBudW1iZXIpCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgRmlsZW5hbWVTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCQkJaW50IHJlcyA9IDA7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQlTdHJpbmcgZmlsZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCVN0cmluZyBmaWxlMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImFzY2VuZGluZz0iICsgYXNjZW5kaW5nKTsKLQkJCQlpZiAoYXNjZW5kaW5nKQotCQkJCQlyZXMgPSBjb2xsYXRvci5jb21wYXJlKGZpbGUxLCBmaWxlMik7Ci0JCQkJZWxzZQotCQkJCQlyZXMgPSBjb2xsYXRvci5jb21wYXJlKGZpbGUyLCBmaWxlMSk7Ci0JCQkJLy8gaWYgdGhlIGZpbGVuYW1lIGlzIHRoZSBzYW1lLCBvbmx5IHRoZW4gZG8gd2UgbG9vayBhdCBsaW5lCi0JCQkJLy8gbnVtYmVyCi0JCQkJaWYgKHJlcyA9PSAwKSB7Ci0JCQkJCVN0cmluZyBsaW5lMSA9IG0xLmdldEF0dHJpYnV0ZShMSU5FKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgbGluZTIgPSBtMi5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJaW50IGwxID0gSW50ZWdlci5wYXJzZUludChsaW5lMSk7Ci0JCQkJCWludCBsMiA9IEludGVnZXIucGFyc2VJbnQobGluZTIpOwotCQkJCQlpZiAoYXNjZW5kaW5nKQotCQkJCQkJcmVzID0gbDEgLSBsMjsKLQkJCQkJZWxzZQotCQkJCQkJcmVzID0gbDIgLSBsMTsKLQkJCQl9Ci0JCQkJLy8gaWYgdGhlIGZpbGVuYW1lIGFuZCBsaW5lIG5vIGFyZSB0aGUgc2FtZSwgb25seSB0aGVuIGRvIHdlCi0JCQkJLy8gbG9vayBhdCBjb25zdHJ1Y3QKLQkJCQlpZiAocmVzID09IDApIHsKLQkJCQkJaWYgKGFzY2VuZGluZykgewotCQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShnZXRDb25zdHJ1Y3RTdHIobTEpLAotCQkJCQkJCQlnZXRDb25zdHJ1Y3RTdHIobTIpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlcyA9IGNvbGxhdG9yLmNvbXBhcmUoZ2V0Q29uc3RydWN0U3RyKG0yKSwKLQkJCQkJCQkJZ2V0Q29uc3RydWN0U3RyKG0xKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlczsKLQkJfQotCX0KLQotCWNsYXNzIENvbnN0cnVjdFNvcnRlciBleHRlbmRzIEdlbmVyaWNTb3J0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcGFyYW0gZmlsZQotCQkgKiBAcGFyYW0gbGluZQotCQkgKiBAcGFyYW0gY29uc3RydWN0Ci0JCSAqIEByZXR1cm4gQlJUIG5vdGU6IFNvcnQgaXNuJ3QgcXVpdGUgcmlnaHQ6IGlmIG5hbWUsZmlsZW5hbWUgaWRlbnRpY2FsLAotCQkgKiAgICAgICAgICIxMCIgd291bGQgc29ydCBiZWZvcmUgIjIiIGUuZy4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgY29tYmluZShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGUsIFN0cmluZyBsaW5lLAotCQkJCVN0cmluZyBjb25zdHJ1Y3QpIHsKLQkJCWZpbmFsIFN0cmluZyBkZWxpbSA9ICIgLSAiOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29uc3RydWN0KTsKLQkJCXJlc3VsdC5hcHBlbmQoZGVsaW0pOwotCQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJCXJlc3VsdC5hcHBlbmQoZGVsaW0pOwotCQkJcmVzdWx0LmFwcGVuZChmaWxlKTsKLQkJCXJlc3VsdC5hcHBlbmQoZGVsaW0pOwotCQkJcmVzdWx0LmFwcGVuZChsaW5lKTsKLQkJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYWxsb3cgdXMgdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUKLQkgKiBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIFdpZGdldCBjcmVhdGVkIGFuZCBjdXN0b21pemVkIGFuZCB0aGVuIHBhc3NlZCB0byB2aWV3ZXIgZHVyaW5nCi0JCS8vIGNyZWF0aW9uIDoKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlTdHJpbmdbXSBTVERfSEVBRElOR1MgPSB7ICIgIiwgdGhpbmduYW1lXywgIkZpbGVuYW1lIiwgIkxpbmVObyIsCi0JCQkJdGhpcy5jb2x1bW5OYW1lXyB9OwotCi0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDEsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gdGMwID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXRjMC5zZXRUZXh0KFNURF9IRUFESU5HU1swXSk7Ci0JCXRjMC5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl0YzAuc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIHRjMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl0YzEuc2V0VGV4dChTVERfSEVBRElOR1NbMV0pOwotCQl0YzEuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJdGMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiB0YzIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJdGMyLnNldFRleHQoU1REX0hFQURJTkdTWzJdKTsKLQkJdGMyLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCXRjMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiB0YzMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJdGMzLnNldFRleHQoU1REX0hFQURJTkdTWzNdKTsKLQkJdGMzLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCXRjMy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gdGM0ID0gbnVsbDsKLQkJaWYgKHRoaXMuY29sdW1uTmFtZV8gIT0gbnVsbCkgewotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgdHJ1ZSkpOwotCQkJdGM0ID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQl0YzQuc2V0VGV4dChTVERfSEVBRElOR1NbNF0pOwotCQkJdGM0LnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQl0YzQuc2V0UmVzaXphYmxlKHRydWUpOwotCQl9IGVsc2UgewotCQkJaW50IG51bUNvbHMgPSBjb2x1bW5OYW1lc18ubGVuZ3RoOwotCQkJVGFibGVDb2x1bW5bXSB0YWJsZUNvbHMgPSBuZXcgVGFibGVDb2x1bW5bbnVtQ29sc107Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHM7IGkrKykgewotCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUsIHRydWUpKTsKLQkJCQlUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoY29sdW1uTmFtZXNfW2ldKTsKLQkJCQl0Yy5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQl0YWJsZUNvbHNbaV0gPSB0YzsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBsaXN0ZW5lcnMgZm9yIHRhYmxlIHNvcnRpbmcKLQkJLy8gU29ydCBieSAiaWNvbiIgKHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyLCBhY3R1YWxseSkKLQkJdGMwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdmlld2VyLnNldFNvcnRlcihudWxsKTsKLQkJCQl2aWV3ZXIuc2V0U29ydGVyKG5hbWVTb3J0ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCS8vIFNvcnQgYnkgYXJ0aWZhY3QgbmFtZQotCQl0YzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQluYW1lQXJ0aWZhY3RTb3J0ZXIuc29ydCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCS8vIFNvcnQgYnkgZmlsZSBuYW1lICh0aGVuIGJ5IGxpbmVObykKLQkJdGMyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmlsZW5hbWVTb3J0ZXIuc29ydCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCS8vIFNvcnQgYnkgTGluZSBudW1iZXIKLQkJdGMzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbGluZU5vU29ydGVyLnNvcnQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQkvLyBTb3J0IGJ5IENvbnN0cnVjdCAoaWYgd2UncmUgbm90IGRvaW5nIGFuIGFycmF5IG9mIGV4dHJhIGNvbHVtbnMpCi0JCWlmICh0YzQgIT0gbnVsbCkgewotCQkJdGM0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQljb25zdHJ1Y3RTb3J0ZXIuc29ydCgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLy8gU2VsZWN0aW9uIGxpc3RlbmVyIHRvIGtub3cgd2hlbiBhIHRhYmxlIHJvdyBpcyBzZWxlY3RlZC4KLQotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndpZGdldERlZmF1bHRTZWxlY3RlZCIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGUuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhYmxlKSB7Ci0JCQkJCVRhYmxlIHQgPSAoVGFibGUpIG9iajsKLQkJCQkJaW50IHJvdyA9IHQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkJLy8gcm93U2VsZWN0ZWRfID0gcm93OwotCQkJCQkvLyBwcmludCBtYXJrZXIgaW5mbyB3aGVuIHNlbGVjdGVkIGluIHRhYmxlCi0JCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGkgPSB0LmdldEl0ZW0ocm93KTsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHRpLmdldERhdGEoKTsKLQkJCQkJCUlBcnRpZmFjdCBhcnRpZmFjdCA9IGdldFNpbXBsZUFydGlmYWN0KG1hcmtlcik7Ci0JCQkJCQlTdHJpbmcgaWQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXywgIihlcnJvcikiKTsKLQkJCQkJCWludCBtTGluZSA9IE1hcmtlclV0aWxpdGllcy5nZXRMaW5lTnVtYmVyKG1hcmtlcik7Ci0JCQkJCQlpbnQgbGluZU5vID0gMDsKLQkJCQkJCWlmIChhcnRpZmFjdCAhPSBudWxsKQotCQkJCQkJCWxpbmVObyA9IGFydGlmYWN0LmdldExpbmUoKTsKLQotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNQVJLRVIgaWQ9IiArIGlkCi0JCQkJCQkJCQkrICIgbWtyTGluZU5vPSIgKyBtTGluZQotCQkJCQkJCQkJKyAiIGFydGlmYWN0TGluZU5vPSIgKyBsaW5lTm8pOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3TGFiZWxQcm92aWRlcigpKTsKLQkJLy8gU2V0IHVwIHRoZSBzb3J0ZXJzLgotCQluYW1lU29ydGVyID0gbmV3IE5hbWVTb3J0ZXIoKTsKLQkJdmlld2VyLnNldFNvcnRlcihuYW1lU29ydGVyKTsKLQkJbGluZU5vU29ydGVyID0gbmV3IExpbmVOb1NvcnRlcigpOwotCQluYW1lQXJ0aWZhY3RTb3J0ZXIgPSBuZXcgTmFtZUFydGlmYWN0U29ydGVyKCk7Ci0JCWZpbGVuYW1lU29ydGVyID0gbmV3IEZpbGVuYW1lU29ydGVyKCk7Ci0JCWNvbnN0cnVjdFNvcnRlciA9IG5ldyBDb25zdHJ1Y3RTb3J0ZXIoKTsKLQotCQl2aWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCS8vIG1hcmtlcnMgZnJvbSB3b3Jrc3BhY2UKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCQlzZWxlY3RlZE1hcmtlcl8gPSAoSU1hcmtlcikgb2JqOwotCQkJCX0KLQkJCQlzaG93U3RhdHVzTWVzc2FnZSgiIiwgInNlbGVjdGlvbkNoYW5nZWQiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbWFrZUFjdGlvbnMoKTsKLQkJaG9va0NvbnRleHRNZW51KCk7Ci0JCWhvb2tEb3VibGVDbGlja0FjdGlvbigpOwotCQljb250cmlidXRlVG9BY3Rpb25CYXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tDb250ZXh0TWVudSgpIHsKLQkJTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOwotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQlTaW1wbGVUYWJsZU1hcmtlclZpZXcudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIHZpZXdlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZmlsbExvY2FsUHVsbERvd24oYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJZmlsbExvY2FsVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxQdWxsRG93bihJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChpbmZvQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQoZmlsdGVyQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVpciBhY3Rpb25zIGhlcmUKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiQWRkaXRpb25zIikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxUb29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZW1vdmVNYXJrZXJBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChmaWx0ZXJBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE1ha2UgdGhlIGFjdGlvbiBvYmplY3RzIGZvciB0aGUgbWVudXMgYW5kIHRvb2xiYXIuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQltYWtlU2hvd0luZm9BY3Rpb24oKTsKLQkJbWFrZVJlbW92ZU1hcmtlckFjdGlvbigpOwotCQltYWtlRmlsdGVyQWN0aW9uKCk7Ci0JCW1ha2VEb3VibGVDbGlja0FjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIE1ha2UgInNob3cgaW5mbyIgYWN0aW9uIHRvIGRpc3BsYXkgYXJ0aWZhY3QgaW5mb3JtYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlU2hvd0luZm9BY3Rpb24oKSB7Ci0JCWluZm9BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IHRoaW5nbmFtZV8gKyAiIGluZm9ybWF0aW9uIjsKLQkJCQlpZiAoc2VsZWN0ZWRNYXJrZXJfICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkRnJvbU1hcmtlciA9IChTdHJpbmcpIHNlbGVjdGVkTWFya2VyXwotCQkJCQkJCS5nZXRBdHRyaWJ1dGUodW5pcXVlSURfLCBudWxsKTsKLQkJCQkJaWYgKGlkRnJvbU1hcmtlciA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVjogZXhjZXB0aW9uIHJlYWRpbmcgbWFya2VyIElEIik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nQnVmZmVyIGluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCQkJSUFydGlmYWN0IGFydGlmYWN0PW51bGw7OwotCQkJCQl0cnkgewotCQkJCQkJYXJ0aWZhY3QgPSBBcnRpZmFjdE1hbmFnZXIuZ2V0QXJ0aWZhY3Qoc2VsZWN0ZWRNYXJrZXJfKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChhcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJCQlpbmZvLmFwcGVuZCgiXG5GaWxlIG5hbWU6ICIpLmFwcGVuZChhcnRpZmFjdC5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCWluZm8uYXBwZW5kKCJcbkxpbmUgbnVtYmVyOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0TGluZSgpKTsKLQkJCQkJCWluZm8uYXBwZW5kKCJcbk5hbWU6ICIpLmFwcGVuZChhcnRpZmFjdC5nZXRTaG9ydE5hbWUoKSk7Ci0JCQkJCQlTdHJpbmcgZGVzYz1hcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCQkJaWYgKGRlc2MhPW51bGwpewotCQkJCQkJCWluZm8uYXBwZW5kKCJcbkRlc2NyaXB0aW9uOiAiKS5hcHBlbmQoZGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZXsKLQkJCQkJCWluZm8uYXBwZW5kKCJcbk5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4iKTsKLQkJCQkJfQotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihudWxsLCB0aXRsZSwgaW5mby50b1N0cmluZygpKTsKLQkJCQl9Ly8gZW5kIGlmIHNlbGVjdGVkTWFya2VyIT1udWxsCi0JCQkJZWxzZSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsIHRpdGxlLCAiTm8gIgotCQkJCQkJCSsgdGhpbmduYW1lXyArICIgc2VsZWN0ZWQuIik7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlpbmZvQWN0aW9uLnNldFRleHQoIlNob3cgSW5mbyIpOwotCQlpbmZvQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJTaG93IGRldGFpbGVkIGluZm8gZm9yIHNlbGVjdGVkICIKLQkJCQkrIHRoaW5nbmFtZV8pOwotCQlpbmZvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlICJyZW1vdmUgbWFya2VyIiBhY3Rpb24gdG8gZGlzcGxheSBhcnRpZmFjdCBpbmZvcm1hdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VSZW1vdmVNYXJrZXJBY3Rpb24oKSB7Ci0JCXJlbW92ZU1hcmtlckFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gYmF0Y2ggY2hhbmdlcyBzbyB3ZSBnZXQgb25seSBvbmUgcmVzb3VyY2UgY2hhbmdlIGV2ZW50Ci0JCQkJZmluYWwgSVdvcmtzcGFjZVJvb3Qgd3NSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJCi0JCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnQgZGVwdGggPSBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEU7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VySURzXy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVN0cmluZyBtYXJrZXJJRCA9IG1hcmtlcklEc19baV07Ci0JCQkJCQkJd3NSZXNvdXJjZS5kZWxldGVNYXJrZXJzKG1hcmtlcklELGZhbHNlLGRlcHRoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIm1hcmtlcnMgcmVtb3ZlZC4iKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJNOiBleGNlcHRpb24gZGVsZXRpbmcgbWFya2Vycy4iKTsKLQkJCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJfX07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlydW5uYWJsZS5ydW4obnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCi0JCQkJIAotCQkJfS8vZW5kIHJ1bigpCi0JCX07Ly8gZW5kIG5ldyBhY3Rpb24KLQkJcmVtb3ZlTWFya2VyQWN0aW9uLnNldFRleHQoIlJlbW92ZSBNYXJrZXJzIik7Ci0JCXJlbW92ZU1hcmtlckFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVtb3ZlIE1hcmtlcnMiKTsKLQkJcmVtb3ZlTWFya2VyQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ly8gbmljZSAicmVkIFgiIGltYWdlCi0KLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGZpbHRlciBhY3Rpb24sIGFsbG93aW5nIHVzZXIgdG8gY3VzdG9taXplIHRoZSBpbmZvcm1hdGlvbgotCSAqIHNob3duIGluIHRoZSB2aWV3LgotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlRmlsdGVyQWN0aW9uKCkgewotCQlmaWx0ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNob3dNZXNzYWdlKCJGaWx0ZXIgIiArIHRoaW5nbmFtZXNfICsgIlxuRGV0ZXJtaW5lIHdoaWNoICIKLQkJCQkJCSsgdGhpbmduYW1lc18gKyAiIGFyZSBzaG93biBpbiB0aGlzIHZpZXcuIik7Ci0JCQl9Ci0JCX07Ci0JCWZpbHRlckFjdGlvbi5zZXRUZXh0KCJGaWx0ZXIgIiArIHRoaW5nbmFtZXNfKTsKLQkJZmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJGaWx0ZXIgd2hpY2ggIiArIHRoaW5nbmFtZXNfCi0JCQkJKyAiIGFyZSBzaG93biBpbiB0aGlzIHZpZXciKTsKLQkJLy8gZnJvbSBvcmcuZWNsaXBzZS51aS52aWV3cyBwbHVnaW4KLQkJUGF0aCBwYXRoPW5ldyBQYXRoKCJpY29ucy9maWx0ZXJfcHMuZ2lmIik7Ci0JCUJ1bmRsZSBiID0gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJU3RyaW5nIHRlbXA9Yi5nZXRTeW1ib2xpY05hbWUoKTsKLQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgcGF0aCwgbnVsbCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCSAKLQkJSW1hZ2UgaW1nID0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJCi0JCWZpbHRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaWQpOwotCX0KLQotCS8qKgotCSAqIE1ha2UgZG91YmxlLWNsaWNrIGFjdGlvbiwgd2hpY2ggbW92ZXMgZWRpdG9yIHRvIHRoZSBhcnRpZmFjdCBpbnN0YW5jZSBpbgotCSAqIHRoZSBzb3VyY2UgY29kZSAoZWRpdG9yIHRvIGxpbmUgaW4gc291cmNlIGNvZGUpCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VEb3VibGVDbGlja0FjdGlvbigpIHsKLQotCQlkb3VibGVDbGlja0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvYmo7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZpbGUgZiA9IChJRmlsZSkgbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBnZXRNYXJrZXJMaW5lTm8obWFya2VyKTsKLQkJCQkJaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSB3YnAgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJCQkJLy8gSUVkaXRvcklucHV0IGlldSA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZik7Ci0JCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcih3YnAsIGYpOwotCi0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRjYTogbWFya2VyIGxpbmVObyBiZWZvcmUgIgotCQkJCQkJCQkJKyBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpKTsKLQkJCQkJCS8vIG5vdGU6IChyZT8pIHNldHRpbmcgbGluZW51bWJlciBoZXJlIGlzIHJlcXVpcmVkIHRvCi0JCQkJCQkvLyBwdXQgbWFya2VyIGluIGVkaXRvciE/IQotCQkJCQkJTWFya2VyVXRpbGl0aWVzLnNldExpbmVOdW1iZXIobWFya2VyLCBsaW5lTm8pOwotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYWZ0ZXIgIgotCQkJCQkJCQkJKyBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpKTsKLQkJCQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJBVFY6IERvdWJsZUNsaWNrQWN0aW9uLCBjbGVhciBzdGF0dXMiKTsKLQkJCQkJCXNob3dTdGF0dXNNZXNzYWdlKCIiLCAiZG91YmxlIGNsaWNrIGFjdGlvbiIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJBVFYuZG91YmxlY2xpY2tBY3Rpb246IEVycm9yIHBvc2l0aW9uaW5nIGVkaXRvciBwYWdlIGZyb20gbWFya2VyIGxpbmUgbnVtYmVyIik7Ci0JCQkJCXNob3dTdGF0dXNNZXNzYWdlKAotCQkJCQkJCSJFcnJvciBwb3NpdGlvbmluZyBlZGl0b3IgZnJvbSBtYXJrZXIgbGluZSBudW1iZXIiLAotCQkJCQkJCSJlcnJvciBtYXJrZXIgZ290byIpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaG9va0RvdWJsZUNsaWNrQWN0aW9uKCkgewotCQl2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJZG91YmxlQ2xpY2tBY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQkJdmlld05hbWVfLCBtZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd1N0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWJ1Z01lc3NhZ2UpIHsKLQkJaWYgKHRyYWNlU3RhdHVzTGluZSkgewotCQkJbWVzc2FnZSArPSAiIC0gIjsKLQkJCW1lc3NhZ2UgKz0gZGVidWdNZXNzYWdlOwotCQl9Ci0JCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS51cGRhdGUodHJ1ZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzaG93U3RhdHVzTWVzc2FnZSgiIiwgInNldEZvY3VzIik7IC8vIHJlc2V0IHN0YXR1cyBtZXNzYWdlCi0JCWlmICghdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRyYWNlT24pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNpbXBsZVRhYmxlVmlldy5kaXNwb3NlKCkiKTsKLQkJLy8gQlJUIGRvIHdlIG5lZWQgdG8gZGlzcG9zZSBvZiBpbWFnZURlc2NyaXB0b3JzIHdlIG1hZGU/IG9yIGp1c3QKLQkJLy8gaW1hZ2VzPwotCi0JfQotCi0JcHVibGljIHZvaWQgc2hvd01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1hcmtlci0tLS0tLS0gIElNYXJrZXIuTElORV9OVU1CRVI9IgotCQkJCSsgSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCXRyeSB7Ci0JCQlNYXAgYXR0cnMgPSBtYXJrZXIuZ2V0QXR0cmlidXRlcygpOwotCQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiICsgZS5nZXRLZXkoKSArICIgIiArIGUuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIG1ha2VJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCVVSTCB1cmw9RmlsZUxvY2F0b3IuZmluZCh0aGVQbHVnaW5fLmdldEJ1bmRsZSgpLCBuZXcgUGF0aChpY29uTmFtZSksIG51bGwpOwotCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogUHVzaCBjaGFuZ2UgaW5mbyAoYXJ0aWZhY3QgYW5kIG1hcmtlcikgb250byBhIHN0YWNrIHNvIHdlIGNhbiByZW1lbWJlcgotCSAqIGl0LCBmb3IgcG9zc2libGUgdW5kbyBhY3Rpb24uIEFsc28gZW5hYmxlcy9kaXNhYmxlcyB0aGUgVW5kbyBhY3Rpb24KLQkgKiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIGFydGlmYWN0Ci0JICogQHBhcmFtIG1hcmtlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDaGFuZ2VkSW5mbyhJQXJ0aWZhY3QgYXJ0aWZhY3QsIElNYXJrZXIgbWFya2VyKSB7Ci0JCWNoYW5nZWRBcnRzXy5wdXNoKGFydGlmYWN0KTsKLQkJY2hhbmdlZE1hcmtlcnNfLnB1c2gobWFya2VyKTsKLQkJY2hlY2tVbmRvU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHN0YXR1cyBvZiB1bmRvIGFjdGlvbiAoZW5hYmxlZCBvciBkaXNhYmxlZCkgYmFzZWQgb24gaWYgdGhlcmUgYXJlIGFueQotCSAqIGFydGlmYWN0IGNoYW5nZXMsIG9yIG90aGVyIGNoYW5nZXMsIGF2YWlsYWJsZSB0byB1bmRvCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tVbmRvU3RhdHVzKCkgewotCi0JfQotCi0JLyoqCi0JICogR2V0IG1hcmtlciBsaW5lIG51bWJlcnMuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1hcmtlckxpbmVObyhJTWFya2VyIG1hcmtlcikgewotCQlpbnQgbGluZU5vID0gZ2V0SW50QXR0cihtYXJrZXIsIElNYXJrZXIuTElORV9OVU1CRVIpOwotCQlyZXR1cm4gbGluZU5vOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBpbnQgdmFsdWUgdGhhdCBpcyBhc3N1bWVkIHRvIGJlIHN0b3JlZCBpbiBhIG1hcmtlciBpbiBhIGdpdmVuCi0JICogYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lCi0JICogCi0JICogQHJldHVybiB0aGUgaW50IHZhbHVlLCBvciAwIGlmIG5vbmUgZm91bmQsIG9yIGludmFsaWQgdmFsdWUgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEludEF0dHIoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyKSB7Ci0JCVN0cmluZyB0ZW1wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlbXAgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKGF0dHIpLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8vIENvcmVFeGNlcHRpb24gb3IgQ2xhc3NDYXN0RXhjZXB0aW9uIHBvc3NpYmxlCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFY6IE1hcmtlciBsaW5lTm8oIiArIGF0dHIKLQkJCQkJKyAiKSBpbnZhbGlkOyB1c2luZyAwIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgbGluZU5vID0gMDsKLQkJdHJ5IHsKLQkJCWxpbmVObyA9IEludGVnZXIucGFyc2VJbnQodGVtcCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiBNYXJrZXIgbGluZU5vKCIgKyB0ZW1wICsgIiBmcm9tIGF0dHIgIgotCQkJCQkrIGF0dHIgKyAiKSBpbnZhbGlkIChOdW1iZXJGb3JtYXRFeGNlcHRpb24pOyB1c2luZyAwIik7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYXR0cmlidXRlIFN0cmluZyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHBhcmFtIGF0dHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogRXhjZXB0aW9uIGdldHRpbmcgbWFya2VyIGF0dHJpYnV0ZSAiICsgZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBhIFN0YWNrIHRoYXQgaXNuJ3QgYmFzZWQgb24gVmVjdG9yIC0gR2VuZXJpYyBMSUZPIHN0YWNrCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFN0YWNrTGlzdCB7Ci0JCXByaXZhdGUgTGlua2VkTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7Ci0KLQkJcHVibGljIHZvaWQgcHVzaChPYmplY3QgdikgewotCQkJbGlzdC5hZGRGaXJzdCh2KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgdG9wKCkgewotCQkJcmV0dXJuIGxpc3QuZ2V0Rmlyc3QoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcG9wKCkgewotCQkJcmV0dXJuIGxpc3QucmVtb3ZlRmlyc3QoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gbGlzdC5pc0VtcHR5KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFZpc2l0IHRoZSByZXNvdXJjZSBkZWx0YSB0byBsb29rIGZvciB0aGUgbWFya2VyIGNoYW5nZXMgd2UgYXJlIGludGVyZXN0ZWQKLQkgKiBpbgotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqLwotCXB1YmxpYyBjbGFzcyBVcGRhdGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCQkvKioKLQkJICogVmlzaXQgYXBwcm9wcmlhdGUgcGFydHMgb2YgdGhlIHJlc291cmNlIGRlbHRhIHRvIGZpbmQgdGhlIG1hcmtlcnMKLQkJICogdGhhdCBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dC4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0ZVZpc2l0b3I6IGZpbGUgY2hhbmdlZDogIgotCQkJCQkJCQkrIG5hbWUpOwotCi0JCQkJCS8vIEhhbmRsZSBmaWxlIGNoYW5nZXMgKHNhdmVzKSBieSByZXBvcnRpbmcgdGhlIGNoYW5nZXMKLQkJCQkJLy8gbWFkZSB0byB0aGUgZmlsZSwgdG8gdXBkYXRlIGJhY2tlbmQgYW5hbHlzaXMKLQkJCQkJLy8gcmVwcmVzZW50YXRpb24KLQkJCQkJSUZpbGUgZiA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCWludCBjb250ZW50Q2hhbmdlZCA9IGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVDsKLQotCQkJCQlpZiAodmFsaWRGb3JBbmFseXNpcyhmLmdldE5hbWUoKSkpIHsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJGaWxlICIKLQkJCQkJCQkJCQkJKyBmLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICIgaXMgdmFsaWQgZm9yIGFuYWx5c2lzIHNvIHdpbGwgcHJvY2VzcyB0aGUgY2hhbmdlLi4uIik7Ci0JCQkJCQlpZiAoY29udGVudENoYW5nZWQgIT0gMCkgewotCQkJCQkJCS8vIGRvIHdlIG5lZWQgdG8gdGVsbCBiYWNrIGVuZCAoYW5hbHlzaXMgZW5naW5lKQotCQkJCQkJCS8vIHRoYXQgZmlsZSBjaGFuZ2VkPwotCQkJCQkJfQotCi0JCQkJCQkvLyByZWZyZXNoIG1hcmtlcnMgZm9yIHRoYXQgZmlsZT8KLQkJCQkJCUlNYXJrZXJEZWx0YVtdIG1EZWx0YXMgPSBkZWx0YS5nZXRNYXJrZXJEZWx0YXMoKTsKLQkJCQkJCWludCBsZW4gPSBtRGVsdGFzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuOyBqKyspIHsKLQkJCQkJCQlJTWFya2VyRGVsdGEgZGVsdGEzID0gbURlbHRhc1tqXTsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJc2hvd01hcmtlckRlbHRhS2luZChkZWx0YTMpOwotCQkJCQkJCUlNYXJrZXIgbSA9IGRlbHRhMy5nZXRNYXJrZXIoKTsKLQkJCQkJCQlTdHJpbmcgbG4gPSBJTWFya2VyLkxJTkVfTlVNQkVSOwotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIi0tLVVwZGF0ZVZpc2l0b3IudmlzaXQoKTp2aWV3ZXIgdXBkYXRlIG1hcmtlcjogKGxpbmVObykiKTsKLQkJCQkJCQkvLyBzaG93TWFya2VyKG0pOwotCQkJCQkJCVN0cmluZ1tdIHByb3BzID0gbmV3IFN0cmluZ1sxXTsgLy8gYXdrd2FyZC4gd2h5Pz8/Ci0JCQkJCQkJcHJvcHNbMF0gPSBsbjsKLQkJCQkJCQkvLyBqdXN0IHVwZGF0ZSB2aWV3ZXIgaXRlbSwgbm90IHRoZSB3aG9sZSB2aWV3Ci0JCQkJCQkJLy8gdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl2aWV3ZXIudXBkYXRlKG0sIHByb3BzKTsKLQkJCQkJCX0gLy8gZW5kIGxvb3AKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJGaWxlICIKLQkJCQkJCQkJCQkJKyBmLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICIgaXMgTk9UIHZhbGlkIGZvciBhbmFseXNpcyBzbyB3aWxsIGlnbm9yZSBjaGFuZ2UuLi4iKTsKLQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgaWYgQ0hBTkdFRAotCQkJCWVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgYWRkZWQuIik7Ci0JCQkJCWNoZWNrTWFya2VyRGVsdGFzKGRlbHRhKTsKLQkJCQl9IGVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgcmVwbGFjZWQuIik7Ci0JCQkJCWNoZWNrTWFya2VyRGVsdGFzKGRlbHRhKTsKLQkJCQl9IGVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSByZW1vdmVkLiIpOwotCQkJCQljaGVja01hcmtlckRlbHRhcyhkZWx0YSk7Ci0JCQkJfQotCQkJfSAvLyBlbmQgaWYgRklMRQotCQkJcmV0dXJuIHRydWU7IC8vIGtlZXAgZ29pbmcKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjaGVja01hcmtlckRlbHRhcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSU1hcmtlckRlbHRhW10gbWQxID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQlpbnQgbGVuID0gbWQxLmxlbmd0aDsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgLi4uIGZvdW5kICIgKyBsZW4gKyAiIG1hcmtlckRlbHRhcy4iKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaG93IGluZm8gYWJvdXQgdGhlIG1hcmtlciBpbiB0aGUgbWFya2VyIGRlbHRhLiBUaGlzIGlzIGp1c3QgdHJhY2luZwotCQkgKiB0aGUgaW5mbyBhdmFpbGFibGUgdW50aWwgd2UgZG8gc29tZXRoaW5nIHdpdGggaXQuIEZvciBub3csIHdlJ3JlIGp1c3QKLQkJICogZG9pbmcgYSAoYmlnKSB2aWV3ZXIucmVmcmVzaCgpIHRvIHJlZnJlc2ggYWxsIHRoZSBtYXJrZXJzLiBXaGVuIHdlCi0JCSAqIGdldCBtb3JlIGludGVsbGlnZW50IGFib3V0IGp1c3QgdXBkYXRpbmcgdGhlIG9uZXMgdGhhdCBjaGFuZ2VkLCB3ZQotCQkgKiBjYW4gcmVtb3ZlIHRoYXQuIFNob3VsZG4ndCBtYWtlIG11Y2ggZGlmZmVyZW50IGZvciBzbWFsbCBzZXRzIG9mCi0JCSAqIG1hcmtlcnMsIGJ1dCBmb3IgbWFueSBtYXJrZXJzLCB0aGlzIGNvdWxkIGJlIGEgc2lnbmlmaWNhbnQKLQkJICogcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEzCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2hvd01hcmtlckRlbHRhS2luZChJTWFya2VyRGVsdGEgZGVsdGEzKSB7Ci0KLQkJCS8vIGludCBtZEtpbmQgPSBkZWx0YTMuZ2V0S2luZCgpOwotCQkJSU1hcmtlciBtID0gZGVsdGEzLmdldE1hcmtlcigpOwotCi0JCQlTdHJpbmcga2luZCA9ICJVTktOT1dOIjsKLQkJCXN3aXRjaCAoZGVsdGEzLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQlraW5kID0gIkFEREVEIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQlraW5kID0gIkNIQU5HRUQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCWtpbmQgPSAiUkVNT1ZFRCI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWtpbmQgPSAiVU5LTk9XTiI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIG1hcmtlckRlbHRhS2luZD0iICsga2luZCk7Ci0JCQlTdHJpbmcgbWlkID0gIiIsIG1sID0gIiIsIG1scGkgPSAiIjsKLQkJCXRyeSB7Ci0JCQkJLy8gbm90ZTogd2UncmUgZ2V0dGluZyBtYXJrZXIgZGVsdGFzIG9uIEFMTCBtYXJrZXJzLAotCQkJCS8vIG5vdCBqdXN0IGFydGlmYWN0IG1hcmtlcnMsIHdoaWNoIGNhbiB0aHJvdyB1cyBvZmYuCi0JCQkJLy8gaW4gcGFydGljdWxhciwgdGVtcCBtYXJrZXJzIHVzZWQgYnkgYWN0aW9ucz8KLQotCQkJCW1pZCA9IG0uZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXykudG9TdHJpbmcoKTsKLQkJCQltbCA9IG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpLnRvU3RyaW5nKCk7Ci0JCQkJLy8gbWxwaSA9IG0uZ2V0QXR0cmlidXRlKElEcy5MSU5FKS50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gaWdub3JlIGVycm9yczsgb25seSB0cmFjaW5nIGZvciBub3cuCi0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkFUVi5VcGRhdGVWaXNpdG9yIGVycm9yIGdldHRpbmcgbWFya2VyIGluZm8gIik7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBtYXJrZXJJRF89IiArIG1pZAotCQkJCQkJKyAiICBsaW5lTm8obWtyLW1waUEpPSIgKyBtbCArICItIiArIG1scGkpOwotCQl9Ci0KLQl9IC8vIGVuZCBjbGFzcyBVcGRhdGVWaXNpdG9yCi0JCi0JY2xhc3MgQXJ0aWZhY3RGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXJ7Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKXsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKWVsZW1lbnQ7Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IG9iaj1tYXJrZXIuZ2V0QXR0cmlidXRlKCJmb28iKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJvYmo9IitvYmopOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9jb21tb24vdmlld3MvU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi92aWV3cy9TaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjcxOWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24vc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2NvbW1vbi92aWV3cy9TaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnZpZXdzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5JQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci0KLS8qKgotICogTGlrZSBTaW1wbGVUYWJsZU1hcmtlclZpZXcgLSBlYXN5IHZpZXcgdGhhdCBzaG93cyBtYXJrZXJzIC0gYnV0IHVzZXMgYSBUcmVlVGFibGUgdG8KLSAqIHNob3cgc29tZSBoaWVyYXJjaHkuIEN1cnJlbnRseSBsaW1pdGVkIHRvIG9uZSBsZXZlbCBvZiBoaWVyYXJjaHkKLSAqIAotICogSW50ZW50OiBNYXJrZXJzIGFyZSB0aGUgbGVhZiBub2Rlcy48YnI+Ci0gKiBBbiBhdHRyaWJ1dGUgaW4gdGhlIG1hcmtlcnMgaW5kaWNhdGVzIHRoZSAoYXJ0aWZpY2lhbCkgcGFyZW50IG5vZGUsIGZvcgotICogZ3JvdXBpbmcuCi0gKiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBtYXJrZXIgYXR0cmlidXRlIGluZGljYXRpbmcgcGFyZW50IG5vZGUuIEFsbCBtYXJrZXJzIHdpdGggdGhpcyBwYXJlbnRBdHRyCi0JICogd2lsbCBiZSB0aGUgY2hpbGRyZW4gb2YgdGhlIHNhbWUgcGFyZW50LCBhbmQgYSBub2RlIGZvciB0aGF0IHBhcmVudCB3aWxsCi0JICogYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSBwb29yIHRoaW5ncyB3b24ndCBiZSBvcnBoYW5zLiBJdCdzIDRhbSB3aGF0IGNhbiBJCi0JICogc2F5PwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50TWFya2VyQXR0cmliID0gInBhcmVudCI7Ci0KLQlwcml2YXRlIFRyZWUgdHJlZTsgLy8ga2VlcCBzbyB3ZSBjYW4gZGlzcG9zZSBvZiBsaXN0ZW5lcnMgaW4gZGlzcG9zZSgpPwotCi0JcHJvdGVjdGVkIEFjdGlvbiBpbmZvQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gZmlsdGVyQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gZG91YmxlQ2xpY2tBY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT24gPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VTdGF0dXNMaW5lID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgVmlld2VyU29ydGVyIG5hbWVTb3J0ZXI7Ci0KLQlwcm90ZWN0ZWQgR2VuZXJpY1NvcnRlciBsaW5lTm9Tb3J0ZXI7Ci0KLQlwcm90ZWN0ZWQgRmlsZW5hbWVTb3J0ZXIgZmlsZW5hbWVTb3J0ZXI7Ci0KLQlwcm90ZWN0ZWQgR2VuZXJpY1NvcnRlciBvcmRlclNvcnRlcjsgLy8gYnkgImljb24iCi0KLQlwcm90ZWN0ZWQgR2VuZXJpY1NvcnRlciBuYW1lQXJ0aWZhY3RTb3J0ZXI7Ci0KLQlwcm90ZWN0ZWQgR2VuZXJpY1NvcnRlciBjb25zdHJ1Y3RTb3J0ZXI7Ci0KLQlwcml2YXRlIElNYXJrZXIgc2VsZWN0ZWRNYXJrZXJfID0gbnVsbDsKLQotCS8qKgotCSAqIExpc3Qgb2YgYXJ0aWZhY3RzIHRoYXQgd2VyZSBjaGFuZ2VkIGR1ZSB0byBzb21lIGFjdGlvbiB1cG9uIHRoZW0gaW4gdGhlCi0JICogdmlldyAoY3VycmVudGx5IHVudXNlZCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhY2tMaXN0IGNoYW5nZWRBcnRzXyA9IG5ldyBTdGFja0xpc3QoKTsKLQotCS8qKgotCSAqIExpc3Qgb2YgbWFya2VycyB0aGF0IHdlcmUgaW52b2x2ZWQgaW4gYSBjaGFuZ2Ugb24gdGhlIHRoZSBhc3NvY2lhdGVkCi0JICogYXJ0aWZhY3QgZHVlIHRvIHNvbWUgYWN0aW9uIHVwb24gdGhlbSBoZXJlIGluIHRoZSB2aWV3IChjdXJyZW50bHkgdW51c2VkKQotCSAqLwotCXByb3RlY3RlZCBTdGFja0xpc3QgY2hhbmdlZE1hcmtlcnNfID0gbmV3IFN0YWNrTGlzdCgpOwotCi0JcHJvdGVjdGVkIFVwZGF0ZVZpc2l0b3IgdmlzaXRvcl8gPSBuZXcgVXBkYXRlVmlzaXRvcigpOwotCi0JLyoqCi0JICogQmUgY29uc2lzdGVudCBhYm91dCB3aGF0IHdlIGNhbGwgdGhlc2UgdGhpbmdzOyBnZW5lcmljIHZhbHVlcyAoY2FuIGJlKQotCSAqIHJlcGxhY2VkIG9uIGN0b3IuIDxicj4KLQkgKiBUaGVzZSBhcmUgcmVhZCBmcm9tIHBsdWdpbi54bWwgaWYgbm90IHBhc3NlZCBvbiBjdG9yCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aGluZ25hbWVfID0gIkFydGlmYWN0IjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGhpbmduYW1lc18gPSAiQXJ0aWZhY3RzIjsKLQotCXByaXZhdGUgU3RyaW5nIGNvbHVtbk5hbWVfID0gIlZhbHVlIjsKLQotCXByaXZhdGUgQWJzdHJhY3RVSVBsdWdpbiB0aGVQbHVnaW5fOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWNvbk5hbWVfID0gImljb25zL3NhbXBsZS5naWYiOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld05hbWVfOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWFya2VySURfOwotCi0JcHJvdGVjdGVkIEFydGlmYWN0TWFuYWdlciBhcnRpZmFjdE1hbmFnZXJfOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5OYW1lc187Ci0KLQlwcml2YXRlIFN0cmluZ1tdIG1hcmtlckF0dHJOYW1lc187Ci0KLQkvKioKLQkgKiBUaGUgSUQgdXNlZCBpbiB0aGUgbWFya2VyIGZvciB0aGUgdW5pcXVlIElEIGZvciBlYWNoIGFydGlmYWN0LiBFbmFibGVzCi0JICogbWFwcGluZyBiYWNrIHRvIHRoZSBBcnRpZmFjdCBvYmplY3QgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdW5pcXVlSURfID0gInVuaXF1ZUlEIjsKLQotCS8qKgotCSAqIFRoZSBJRCB1c2VkIGluIHRoZSBtYXJrZXIgZm9yIHRoZSBleHRyYSBjb2x1bW4gb2YgaW5mb3JtYXRpb24gKGxhc3QKLQkgKiBjb2x1bW4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5JRF8gPSAiY29uc3RydWN0VHlwZSI7IC8vIGlkIGZvciAodmFyaWFibGUpCi0KLQkvKiogTWFya2VyIElEIGZvciBhcnRpZmFjdCBuYW1lIC0gZS5nLiBBUEkgbmFtZSwgcHJhZ21hIG5hbWUsIGV0Yy4gKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotCi0JLyoqIE1hcmtlciBJRCBmb3Igc3RvcmFnZSBvZiB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdGhlIGFydGlmYWN0IGlzIGZvdW5kICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSAiZmlsZW5hbWUiOwotCi0JLyoqCi0JICogTWFya2VyIGlkIGZvciBzdG9yYWdlIG9mIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBhcnRpZmFjdCBpcyBmb3VuZC4KLQkgKiBSZXVzZSBvZiBkZWZhdWx0IElEIHVzZWQgYnkgSU1hcmtlciwgcmVwZWF0ZWQgaGVyZSBmb3IgZWFzZSBvZiB1c2UgYW5kCi0JICogZm9yIGNsYXJpdHkgdGhhdCBUSElTIGlzIHRoZSBtYXJrZXIgSUQgZm9yIGxpbmUgbnVtYmVyLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkUgPSBJTWFya2VyLkxJTkVfTlVNQkVSOwotCi0JLyoqIE1hcmtlciBpZCBmb3Igc3RvcmFnZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhcnRpZmFjdCAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ1RJT05fQ0FMTCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVCA9IDI7Ci0KLQkvKiogdHlwZXMgb2YgY29uc3RydWN0cywgZm9yIHRoZSBkZWZhdWx0IGNhc2UgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlNUUlVDVF9UWVBFX05BTUVTID0geyAiTm9uZSIsICJGdW5jdGlvbiBDYWxsIiwgIkNvbnN0YW50IiB9OwotCi0JLyoqCi0JICogU2ltcGxlIEFydGlmYWN0IFRhYmxlIFZpZXcgY29uc3RydWN0b3IKLQkgKiA8cD4KLQkgKiBFdmVyeXRoaW5nIGNhbiBiZSBudWxsLCBhbmQgZGVmYXVsdHMgd2lsbCBiZSB0YWtlbiwgb3IgcmVhZCBmcm9tCi0JICogcGx1Z2luLnhtbCBmb3IgdGhlIHZpZXcuCi0JICogPHA+Ci0JICogTm90ZTogaWYgYSBudWxsIHBsdWdJbiBpbnN0YW5jZSBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgcGx1Z2luICh0aGlzCi0JICogb25lKSB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgcmVzb3VyY2VzIChlLmcuIGljb24gaW1hZ2VzKSBpZiB0aGUgZGVyaXZlZAotCSAqIGNsYXNzIGlzIGluIGl0cyBvd24gcGx1Zy1pbiwgYW5kIGl0cyBpY29ucyBhcmUsIHRvby4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldyhBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbiwgU3RyaW5nIHRoaW5nbmFtZSwgU3RyaW5nIHRoaW5nbmFtZXMsCi0JCQlTdHJpbmcgY29sdW1uTmFtZSwgU3RyaW5nIG1hcmtlcklELCBTdHJpbmcgcGFyZW50TWFya2VyQXR0ck5hbWUpIHsKLQotCQlpZiAodGhlUGx1Z2luID09IG51bGwpIHsKLQkJCXRoZVBsdWdpbl8gPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy50aGVQbHVnaW5fID0gdGhlUGx1Z2luOwotCQl9Ci0JCWlmICh0aGluZ25hbWUgIT0gbnVsbCkKLQkJCXRoaXMudGhpbmduYW1lXyA9IHRoaW5nbmFtZTsKLQkJaWYgKHRoaW5nbmFtZXMgIT0gbnVsbCkKLQkJCXRoaXMudGhpbmduYW1lc18gPSB0aGluZ25hbWVzOwotCQlpZiAoY29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVfID0gY29sdW1uTmFtZTsgLy8gbGFzdCBjb2x1bW4gbmFtZWQgYnkgc3ViY2xhc3MKLQkJfQotCQl0aGlzLm1hcmtlcklEXyA9IG1hcmtlcklEOy8vIGlmIG51bGwsIHdpbGwgdXNlIHZpZXcgaWQuCi0JCXRoaXMucGFyZW50TWFya2VyQXR0cmliPXBhcmVudE1hcmtlckF0dHJOYW1lOwotCi0JCWZpbmRWaWV3SW5mbygpOwotCi0JfQotCi0JLyoqCi0JICogU2ltcGxlIHRhYmxlIHZpZXcgd2l0aCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGV4dHJhIGNvbHVtbnMKLQkgKiAKLQkgKiBAcGFyYW0gdGhlUGx1Z2luCi0JICogQHBhcmFtIHRoaW5nbmFtZQotCSAqIEBwYXJhbSB0aGluZ25hbWVzCi0JICogQHBhcmFtIGF0dHJOYW1lcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBtYXJrZXIgYXR0cmlidXRlcywgZm9yIHdoaWNoIHRoZSBjb2x1bW4gdmFsdWVzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGV4dHJhY3RkCi0JICogQHBhcmFtIGNvbE5hbWVzCi0JICogICAgICAgICAgICBsaXN0IG9mIENvbHVtbiBuYW1lcywgdXNlZCBhcyBoZWFkZXJzIGZvciB0aGUgdmFsdWVzIGZvdW5kIGluCi0JICogICAgICAgICAgICB0aGUgbWFya2VyIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gbWFya2VySURfCi0JICovCi0JcHVibGljIFNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcoQWJzdHJhY3RVSVBsdWdpbiB0aGVQbHVnaW4sIFN0cmluZyB0aGluZ25hbWUsIFN0cmluZyB0aGluZ25hbWVzLAotCQkJU3RyaW5nW10gYXR0ck5hbWVzLCBTdHJpbmdbXSBjb2xOYW1lcywgU3RyaW5nIG1hcmtlcklELCBTdHJpbmcgcGFyZW50TWFya2VyQXR0cmliTmFtZSkgewotCQl0aGlzKHRoZVBsdWdpbiwgdGhpbmduYW1lLCB0aGluZ25hbWVzLCBudWxsLCBtYXJrZXJJRCwgcGFyZW50TWFya2VyQXR0cmliTmFtZSk7Ci0JCWNvbHVtbk5hbWVzXyA9IGNvbE5hbWVzOwotCQljb2x1bW5OYW1lXyA9IG51bGw7Ly8gc2V0IHRoaXMgc28gd2UgY2FuIHRlbGwgd2UgYXJlIHVzaW5nIGFycmF5IG9mCi0JCS8vIGF0dHJzL2NvbHMKLQkJbWFya2VyQXR0ck5hbWVzXyA9IGF0dHJOYW1lczsKLQotCX0KLQotCS8qKgotCSAqIEN0b3IgdGhhdCB1c2VzIGRlZmF1bHRzIGZvciBldmVyeXRoaW5nICh0ZXN0aW5nPyB0aGVvcmV0aWNhbGx5LCB0aGlzCi0JICogc2hvdWxkIHdvcmssIGFuZCBzaG91bGQgYmUgcmV1c2FibGUgc2luY2UgaW5mbyB0aGF0IG11c3QgYmUgdW5pcXVlIGlzCi0JICogcmVhZCBmcm9tIGZyb20gcGx1Z2luLnhtbC4pCi0JICogCi0JICovCi0JcHVibGljIFNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcoKSB7Ci0JCXRoaXMobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCxudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGluZm8gZnJvbSB0aGUgdmlldyBpbmZvIGluIHRoZSBtYW5pZmVzdC4gVGhpcyBpbmNsdWRlcyB0aGUgaWNvbgotCSAqIG5hbWUsIHRoZSB2aWV3IGlkICh1c2VkIGFzIG1hcmtlciBpZCBpZiBub25lIGdpdmVuIG9uIGN0b3IpLCBhbmQKLQkgKiBjb25zdHJ1Y3RzIGFuIGFydGlmYWN0IG1hbmFnZXIgZm9yIHRoaXMgdmlldydzIGFydGlmYWN0IG9iamVjdHMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kVmlld0luZm8oKSB7Ci0JCVN0cmluZyBjbGFzc25hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkvLyB0cnkgdG8gZmluZCB0aGUgaWNvbiBzcGVjaWZpZWQgaW4gdGhlIHBsdWdpbi54bWwgZm9yIHRoaXMKLQkJLy8gZXh0ZW5zaW9uL3ZpZXcKLQkJSUV4dGVuc2lvbltdIGV4dCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLnVpLnZpZXdzIikuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dC5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRbaV07Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZXMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNlcy5sZW5ndGg7IGorKykgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjRWxlbWVudCA9IGNlc1tqXTsKLQkJCQlTdHJpbmcgaWNvbk5hbWUgPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImljb24iKTsKLQkJCQlTdHJpbmcgY2xhc3NOID0gY0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwotCQkJCVN0cmluZyBuYW1lID0gY0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCQkJaWYgKGNsYXNzbmFtZS5lcXVhbHMoY2xhc3NOKSkgewotCQkJCQlpZiAoaWNvbk5hbWUgIT0gbnVsbCkgewotCQkJCQkJaWNvbk5hbWVfID0gaWNvbk5hbWU7Ci0JCQkJCX0KLQkJCQkJdGhpcy52aWV3TmFtZV8gPSBuYW1lOwotCQkJCQlpZiAobWFya2VySURfID09IG51bGwpIHsKLQkJCQkJCS8vIHVzZSBwbHVnaW4gaWQgZm9yIG1hcmtlciBpZCwgaWYgbm90IHNwZWNpZmllZAotCQkJCQkJbWFya2VySURfID0gY0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJCQl9Ci0JCQkJCWFydGlmYWN0TWFuYWdlcl8gPSBBcnRpZmFjdE1hbmFnZXIuZ2V0TWFuYWdlcihtYXJrZXJJRF8pOwotCQkJCQlpZiAoYXJ0aWZhY3RNYW5hZ2VyXyA9PSBudWxsKSB7Ci0JCQkJCQlhcnRpZmFjdE1hbmFnZXJfID0gbmV3IEFydGlmYWN0TWFuYWdlcihtYXJrZXJJRF8pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEl0IG1pZ2h0IGJlIHVzZWZ1bCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGlzLCB0byBzYXkgd2hpY2gKLQkgKiBmaWxlbmFtZXMgc2hvdWxkIGFsbG93IHRoZSBhY3Rpb24gInJ1biBhbmFseXNpcyIgdG8gY3JlYXRlIG5ldyBhcnRpZmFjdHMKLQkgKiBhbmQgdGh1cyBuZXcgbWFya2Vycy4gPGJyPgotCSAqIFRoaXMgaXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkRm9yQW5hbHlzaXMoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCS8vIHJldHVybiBNcGlVdGlsLnZhbGlkRm9yQW5hbHlzaXMoZmlsZW5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgb2JqZWN0cyB0byB0aGUKLQkgKiB2aWV3LiBJdCBjYW4gd3JhcCBleGlzdGluZyBvYmplY3RzIGluIGFkYXB0ZXJzIG9yIHNpbXBseSByZXR1cm4gb2JqZWN0cwotCSAqIGFzLWlzLiBUaGVzZSBvYmplY3RzIG1heSBiZSBzZW5zaXRpdmUgdG8gdGhlIGN1cnJlbnQgaW5wdXQgb2YgdGhlIHZpZXcsCi0JICogb3IgaWdub3JlIGl0IGFuZCBhbHdheXMgc2hvdyB0aGUgc2FtZSBjb250ZW50IChsaWtlIFRhc2sgTGlzdCwgZm9yCi0JICogZXhhbXBsZSkuCi0JICovCi0JY2xhc3MgVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIElSZXNvdXJjZSBpbnB1dDsKLQotCQlwcml2YXRlIExpc3Q8UGFyZW50Tm9kZT4gcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyZW50Tm9kZT4oKTsKLQotCQlwcml2YXRlIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZCA9IGZhbHNlOwotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdiwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vIGNvdWxkIHVzZSB0aGlzIHRvIGNoYW5nZSB0aGUgbGlzdCB0byBqdXN0IGFydGlmYWN0cyBmcm9tIG9uZQotCQkJLy8gcmVzb3VyY2UsCi0JCQkvLyBldGMuLi4KLQkJCS8vIGNvdWxkIGNhY2hlIHZpZXdlciBoZXJlIHRoaXMudmlld2VyPXY7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUViBpbnB1dENoYW5nZWQoKS4uLiIpOwotCQkJLy8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gaW5wdXQKLQkJCWlmICghaGFzUmVnaXN0ZXJlZCkgewotCQkJCS8vIGFkZCBtZSBhcyBhIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciBzbyBpIGNhbiByZWZyZXNoIGF0Ci0JCQkJLy8gbGVhc3Qgd2hlbiBtYXJrZXJzIGFyZSBjaGFuZ2VkCi0JCQkJLy8gUE9TVF9DSEFOR0U6IG9ubHkgd2FudCBldmVudCBub3RpZmljYXRpb25zIGZvciBhZnRlci10aGUtZmFjdAotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCQloYXNSZWdpc3RlcmVkID0gdHJ1ZTsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFY6IFJlZ2lzdGVyZWQgUkNMIGZvciBWaWV3Q29udGVudFByb3ZpZGVyIik7Ci0JCQl9Ci0JCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQl0aGlzLmlucHV0ID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVi5WaWV3Q29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKSIpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBwb3B1bGF0ZSB0aGlzIHZpZXcuCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJT2JqZWN0W10gb2JqcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBpZCA9IG1hcmtlcklEXzsKLQkJCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5wdXQgaXMgbnVsbCBpbiBnZXRFbGVtZW50cy4uLiIpOwotCQkJCX0KLQkJCQlvYmpzID0gaW5wdXQuZmluZE1hcmtlcnMoaWQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCXBhcmVudExpc3Q9Y3JlYXRlUGFyZW50cyhvYmpzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWLCBleGNlcHRpb24gZ2V0dGluZyBtb2RlbCBlbGVtZW50cyAobWFya2VycyBmb3IgVGFibGUgdmlldykiKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFYuZ2V0LS0tRWxlbWVudHMsIGZvdW5kICIgKyBvYmpzLmxlbmd0aCArICIgbWFya2VycyIpOwotCQkJcmV0dXJuIHBhcmVudExpc3QudG9BcnJheSgpOwotCi0JCX0KLQotCQkvKioKLQkJICogY3JlYXRlIHRoZSBwYXJlbnQgb2JqZWN0cyBuZWVkZWQgZm9yIHRoZXNlIG1hcmtlcnMKLQkJICogCi0JCSAqIEBwYXJhbSBvYmpzCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgTGlzdDxQYXJlbnROb2RlPiBjcmVhdGVQYXJlbnRzKE9iamVjdFtdIG9ianMpIHsKLQkJCS8vIHJlbW92ZSAob2xkKSBwYXJlbnQgb2JqZWN0cwotCQkJcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyZW50Tm9kZT4oKTsKLQotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSAoSU1hcmtlcltdKSBvYmpzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCVN0cmluZyBwYXJlbnROYW1lID0gZ2V0UGFyZW50QXR0cihtYXJrZXIpOwotCQkJCS8vIG1ha2Ugb25lIHNpbmdsZSBwYXJlbnQsIGlmIGF0dHJzIGRvbid0IGhhdmUgcGFyZW50IGluZm8gKHlldCkKLQkJCQlpZihwYXJlbnROYW1lPT1udWxsKSB7Ci0JCQkJCXBhcmVudE5hbWU9ImR1bW15IjsKLQkJCQl9Ci0JCQkJZ2V0UGFyZW50Tm9kZShwYXJlbnROYW1lKTsKLQkJCX0KLQkJCXJldHVybiBwYXJlbnRMaXN0OwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyZW50QXR0cihJTWFya2VyIG1hcmtlcikgewotCQkJU3RyaW5nIHBhcmVudE5hbWUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwYXJlbnROYW1lID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShwYXJlbnRNYXJrZXJBdHRyaWIpOwotCQkJCS8vIHRlbXBvcmFyeSBvdmVycmlkZSB0byBjcmVhdGUgYW4gaW50aWFsIHBhcmVudCBmb3IgYWxsCi0JCQkJaWYoIHBhcmVudE5hbWU9PW51bGwpCi0JCQkJCXBhcmVudE5hbWU9ImR1bW15IjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gcGFyZW50TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBnZXQgdGhlIHBhcmVudCBub2RlIHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIG9uZSBkb2Vzbid0IGV4aXN0LCBjYW4gY3JlYXRlCi0JCSAqIGl0LgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudE5hbWUKLQkJICogICAgICAgICAgICB0aGUgbWFya2VyIGF0dHJpYnV0ZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgcmVxdWlyZWQKLQkJICogQHBhcmFtIGNyZWF0ZUlmTmVlZGVkIHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSB0aGUgcGFyZW50IG5vZGUgaWYgd2UgZG9uJ3QKLQkJICogZmluZCBvbmUgYWxyZWFkeSBleGlzdHMKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBQYXJlbnROb2RlIGdldFBhcmVudE5vZGUoU3RyaW5nIHBhcmVudE5hbWUsIGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJCVBhcmVudE5vZGUgcGFyZW50Tm9kZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJcGFyZW50Tm9kZSA9IChQYXJlbnROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocGFyZW50Tm9kZS5wYXJlbnRBdHRyTmFtZS5lcXVhbHMocGFyZW50TmFtZSkpIHsKLQkJCQkJcmV0dXJuIHBhcmVudE5vZGU7Ci0JCQkJfQotCQkJfQotCQkJLy8gbm90IGZvdW5kOyBtYWtlIGEgbmV3IG9uZQotCQkJcGFyZW50Tm9kZT1udWxsOwotCQkJaWYgKGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJcGFyZW50Tm9kZSA9IG5ldyBQYXJlbnROb2RlKHBhcmVudE5hbWUpOwotCQkJCXBhcmVudExpc3QuYWRkKHBhcmVudE5vZGUpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudE5vZGU7Ci0JCX0KLQotCQlwcml2YXRlIFBhcmVudE5vZGUgZ2V0UGFyZW50Tm9kZShTdHJpbmcgcGFyZW50TmFtZSkgewotCQkJZmluYWwgYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCA9IGZhbHNlOwotCQkJcmV0dXJuIGdldFBhcmVudE5vZGUocGFyZW50TmFtZSwgY3JlYXRlSWZOZWVkZWQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHJlYWN0IHRvIGEgcmVzb3VyY2UgY2hhbmdlIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkJICovCi0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tcmVzb3VyY2VDaGFuZ2VkKCkiKTsKLQkJCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50UmVzb3VyY2VzQ2hhbmdlZChkZWx0YSwgMSk7Ci0JCQkvLyByZW1vdmUgdGhlIGZvbGxvd2luZyB3aGVuIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgZG9lcyBpdCBhbGw/Ci0JCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmlld2VyLnVwZGF0ZSBlYSBta3IgaW4gZGVsdGEtLSBmcm9tIHJlc291cmNlQ2hhbmdlZCgpLi4uIik7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLXByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKCkuLi4iKTsKLQkJCQkJCQlwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YShkZWx0YSk7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLUVORCBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YSgpLi4uIik7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmlld2VyLnJlZnJlc2goKSIpOwotCQkJCQkJCS8vIHdlIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGluZGl2LiByb3dzIHdlIGNhcmUKLQkJCQkJCQkvLyBhYm91dCwKLQkJCQkJCQkvLyBidXQgbmVlZCB0aGlzIGZvciBNYXJrZXIgZGlzcGxheSBhZnRlciBpbml0aWFsCi0JCQkJCQkJLy8gYW5hbHlzaXMsCi0JCQkJCQkJLy8gYW5kIGZvciBtYXJrZXJzIGRlbGV0ZWQsIGV0Yy4gQ2FuIHJlbW92ZSB3aGVuIHdlCi0JCQkJCQkJLy8gbW9yZSBjb21wbGV0ZWx5Ci0JCQkJCQkJLy8gaGFuZGxlIHRoaW5ncyBpbiBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YQotCQkJCQkJCS8vIChyZW1vdmVzIGV0Yy4pCi0JCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVjogRXhjZXB0aW9uIHJlZnJlc2hpbmcgdmlld2VyOiAiICsgZSk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tRU5EIHJlc291cmNlQ2hhbmdlZCgpXG4iKTsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIERlYnVnZ2luZyBzdGF0ZW1lbnQgaGVscCAtIHByaW50cyB0aGUgZXZlbnRzLCBpbmRlbnRlZCBieSBuZXN0aW5nCi0JCSAqIGxldmVsCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICogQHBhcmFtIGluZGVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHByaW50UmVzb3VyY2VzQ2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGluZGVudCkgewotCQkJcHJpbnRPbmVSZXNvdXJjZUNoYW5nZWQoZGVsdGEsIGluZGVudCk7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlwcmludFJlc291cmNlc0NoYW5nZWQoY2hpbGRyZW5baV0sIGluZGVudCArIDEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNvbWUgZGVidWdnaW5nIHN0YXRlbWVudCBoZWxwCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICogQHBhcmFtIGluZGVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHByaW50T25lUmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgaW5kZW50KSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotCQkJCWJ1Zi5hcHBlbmQoIiAgIik7Ci0JCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQlidWYuYXBwZW5kKCJBRERFRCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCWJ1Zi5hcHBlbmQoIlJFTU9WRUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQlidWYuYXBwZW5kKCJDSEFOR0VEIik7Ci0JCQkJdGVzdERlbHRhKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnVmLmFwcGVuZCgiWyIpOwotCQkJCWJ1Zi5hcHBlbmQoZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQlidWYuYXBwZW5kKCJdIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWYuYXBwZW5kKCIgIik7Ci0JCQlidWYuYXBwZW5kKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGJ1Zik7Ci0JCX0KLQotCQkvKioKLQkJICogU2hvdyBkZWJ1Z2dpbmcgaW5mbyBmb3IgYSByZXNvdXJjZSBkZWx0YSBjaGFuZ2UKLQkJICogCi0JCSAqIEBwYXJhbSBkZWx0YQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHRlc3REZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gLS0gY29kZSBmcm9tIGVjbGlwc2UgaGVscDoKLQkJCS8vIGNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlJlc291cmNlICIpOwotCQkJU3lzdGVtLm91dC5wcmludChkZWx0YS5nZXRGdWxsUGF0aCgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIGhhcyBjaGFuZ2VkLiIpOwotCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLT4gQ29udGVudCBDaGFuZ2UiKTsKLQkJCX0KLQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0+IENvbnRlbnQgUmVwbGFjZWQiKTsKLQkJCX0KLQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSAhPSAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLT4gTWFya2VyIENoYW5nZSIpOwotCQkJCS8vIElNYXJrZXJEZWx0YVtdIG1hcmtlcnMgPSBkZWx0YS5nZXRNYXJrZXJEZWx0YXMoKTsKLQkJCQkvLyBpZiBpbnRlcmVzdGVkIGluIG1hcmtlcnMsIGNoZWNrIHRoZXNlIGRlbHRhcwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIHJlc291cmNlIGNoYW5nZSAtIGp1c3QgdGhlIGRlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yXyk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIFBJVFYucHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoKS4uIik7Ci0JCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogZ2V0IHRoZSBjaGlsZHJlbiAobWFya2Vycykgb2YgYSBwYXJlbnQgbm9kZQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlQYXJlbnROb2RlIHBhcmVudG5vZGUgPSAoUGFyZW50Tm9kZSkgcGFyZW50RWxlbWVudDsKLQkJCVN0cmluZyBwYXJlbnROYW1lID0gcGFyZW50bm9kZS5nZXRQYXJlbnRBdHRyTmFtZSgpOwotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltYXJrZXJzID0gaW5wdXQuZmluZE1hcmtlcnMobWFya2VySURfLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJTGlzdDxJTWFya2VyPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQlTdHJpbmcgcGFyZW50QXR0ciA9IGdldFBhcmVudEF0dHIobWFya2VyKTsKLQkJCQlpZiAocGFyZW50QXR0ci5lcXVhbHMocGFyZW50TmFtZSkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKG1hcmtlcik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBlbGVtZW50OwotCQkJU3RyaW5nIHBhcmVudE5hbWUgPSBnZXRQYXJlbnRBdHRyKG1hcmtlcik7Ci0JCQlQYXJlbnROb2RlIHBhcmVudCA9IGdldFBhcmVudChtYXJrZXIsIGZhbHNlKTsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwcml2YXRlIFBhcmVudE5vZGUgZ2V0UGFyZW50KElNYXJrZXIgbWFya2VyLCBib29sZWFuIGIpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIGtpZHM9Z2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlyZXR1cm4ga2lkcy5sZW5ndGg+MDsKLQkJfQotCi0JfSAvLyBlbmQgVmlld0NvbnRlbnRQcm92aWRlcgotCi0JY2xhc3MgUGFyZW50Tm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIHBhcmVudEF0dHJOYW1lOwotCi0JCXB1YmxpYyBQYXJlbnROb2RlKFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JCQl0aGlzLnBhcmVudEF0dHJOYW1lID0gcGFyZW50TmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50QXR0ck5hbWUoKSB7Ci0JCQlyZXR1cm4gcGFyZW50QXR0ck5hbWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCBhcnRpZmFjdCBmcm9tIG1hcmtlcgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcnRpZmFjdCBnZXRTaW1wbGVBcnRpZmFjdChJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJQXJ0aWZhY3QgYXJ0aWZhY3QgPSBudWxsOwotCQl0cnkgewotCQkJaWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXyk7Ci0JCQlhcnRpZmFjdCA9IGFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3QoaWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSArICIgLi4uIFNUViwgQ29yZUV4Y2VwdGlvbiBnZXR0aW5nIGFydGlmYWN0IGZyb20gaGFzaE1hcDsgIiArIHRoaW5nbmFtZV8KLQkJCQkJKyAiIGlkPSIgKyBpZCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5lKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmUuZ2V0TWVzc2FnZSgpICsgIiAuLi4gU1RWLCBOdWxsUHRyRXhjcCBnZXR0aW5nIGFydGlmYWN0IGZyb20gaGFzaE1hcDsiICsgdGhpbmduYW1lXwotCQkJCQkrICIgaWQ9IiArIGlkKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3Q7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBjb25zdHJ1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uc3RydWN0U3RyKElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUludGVnZXIgdGVtcCA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKGNvbHVtbklEXyk7Ci0JCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCUludGVnZXIgY29uc3RydWN0VHlwZSA9IChJbnRlZ2VyKSB0ZW1wOwotCQkJcmV0dXJuIENPTlNUUlVDVF9UWVBFX05BTUVTW2NvbnN0cnVjdFR5cGUuaW50VmFsdWUoKV07Ci0JCX0gZWxzZQotCQkJcmV0dXJuICIgIjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBWaWV3TGFiZWxQcm92aWRlciAtIHByb3ZpZGVzIHRoZSB0ZXh0IGFuZCBpbWFnZXMgZm9yIHRoZSBhcnRpZmFjdHMgaW4gdGhlCi0JICogVGFibGUgVmlldwotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIFZpZXdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkvKioKLQkJICogS2VlcCBpY29ucyBhbHJlYWR5IGNyZWF0ZWQsIGFuZCByZXVzZSB0aGUgaW1hZ2VzCi0JCSAqLwotCQlwcml2YXRlIEhhc2hNYXAgaWNvbkhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgSUFydGlmYWN0IGFydGlmYWN0OwotCi0JCS8qKgotCQkgKiBwcm92aWRlIHdoYXQgZ29lcyBpbiBlYWNoIGNvbHVtbjsgZ2V0IHRoZSBpbmZvIGZyb20gdGhlIG1hcmtlcgotCQkgKi8KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQkJU3RyaW5nIHRlbXAgPSBzdXBlci5nZXRUZXh0KG8pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUZXh0OiAiICsgdGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmUgdGhlIHRleHQgdG8gZ28gaW4gZWFjaCBjb2x1bW4KLQkJICogCi0JCSAqIEBwYXJhbSBvYmoKLQkJICogICAgICAgICAgICB0aGUgTWFya2VyICh3ZSBob3BlKSB0aGF0IGdvZXMgb24gdGhlIGN1cnJlbnQgcm93Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB0YWJsZQotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCWlmIChvYmogPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiBMYWJlbFByb3Ygb2JqIGlzIG51bGw7IGluZGV4PSIgKyBpbmRleCk7Ci0JCQkJcmV0dXJuICJBVFYgb2JqIG51bGwiOwotCQkJfQotCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZXR1cm4gIiI7Ci0JCQkJY2FzZSAxOgotCQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQkJCQlyZXR1cm4gaWQ7Ci0JCQkJY2FzZSAyOgotCi0JCQkJCXJldHVybiAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEZJTEVOQU1FKTsKLQkJCQljYXNlIDM6Ci0JCQkJCVN0cmluZyBsaW5lID0gKG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUikpLnRvU3RyaW5nKCk7Ci0KLQkJCQkJaWYgKHRyYWNlT24pIHsgLy8gYWxsIHRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBzbwotCQkJCQkJYXJ0aWZhY3QgPSBnZXRTaW1wbGVBcnRpZmFjdChtYXJrZXIpOwotCQkJCQkJU3RyaW5nIGNvbXBMaW5lID0gbGluZSArICItIjsKLQkJCQkJCWlmIChhcnRpZmFjdCA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWIGdldENvbHVtblRleHQtIG51bGwgYXJ0aWZhY3QiKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGxpbmVBcnRpZmFjdCA9IGFydGlmYWN0LmdldExpbmUoKTsKLQkJCQkJCQljb21wTGluZSA9IGNvbXBMaW5lICsgbGluZUFydGlmYWN0OwotCQkJCQkJfQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFYuVmlld0xhYmVsUHJvdmlkZXIgZ2V0cyBtYXJrZXIgbGluZTogbWtyLWFydGlmYWN0OiAiICsgY29tcExpbmUpOwotCQkJCQkJc2hvd01hcmtlcihtYXJrZXIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBsaW5lOwotCQkJCWNhc2UgNDoKLQkJCQkJaWYgKGNvbHVtbk5hbWVfICE9IG51bGwpIHsvLyB3ZSdyZSBub3QgdXNpbmcgYXJyYXkKLQkJCQkJCXJldHVybiBnZXRDb25zdHJ1Y3RTdHIobWFya2VyKTsKLQkJCQkJfQotCQkJCQkvLyBlbHNlIGRyb3AgdGhyb3VnaC4uLgotCi0JCQkJZGVmYXVsdDoKLQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gbWFya2VyQXR0ck5hbWVzX1tpbmRleCAtIDRdOwotCQkJCQlTdHJpbmcgdmFsID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIiIpOwotCQkJCQlyZXR1cm4gdmFsOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkvLyBnZXQgdGhpcyBlcnJvciAzeCAiTWFya2VyIGlkOiA5OTkgbm90IGZvdW5kLiIgd2hpbGUgZGVsZXRpbmcKLQkJCQkvLyBtYXJrZXJzLiB3aHk/Ci0JCQkJLy8gV2h5IGlzIHRoaXMgZXZlbiBnZXR0aW5nIGNhbGxlZCwgYW5kIHdoeSBkb2VzIGl0IG1hdHRlcj8KLQkJCQkvLyBTdHJpbmcgdG1wID0gY2UuZ2V0TWVzc2FnZSgpOwotCQkJCS8vIGNlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJldHVybiAoIkFUViBlcnJvciIpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFByb3ZpZGUgdGhlIGltYWdlIHRoYXQgZ29lcyBpbiBhIGNvbHVtbiwgaWYgYW55IChOb3RlIHRoYXQgYSB0YWJsZQotCQkgKiBjZWxsIGNhbiBjb250YWluIGJvdGgsIGFuIGltYWdlIGFuZCB0ZXh0LCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZAotCQkgKiBzaWRlLWJ5LXNpZGUpCi0JCSAqIAotCQkgKiBAcGFyYW0gb2JqIC0KLQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IHdlJ3JlIGdldHRpbmcgdGhlIGltYWdlIGZvcgotCQkgKiBAcGFyYW0gaW5kZXggLQotCQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gdGhhdCB0aGlzIGltYWdlIGlzIHRvIGdvIGluCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQkvLyB3ZSBvbmx5IHB1dCBpbWFnZSBpY29uIGluIHRoZSBmaXJzdCBjb2x1bW4KLQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9tSW1hZ2Uob2JqKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IGltYWdlIGZvciBhcnRpZmFjdC4gTm90ZSB0aGF0IGRpZmZlcmVudCBpbWFnZXMgY291bGQgYmUgdXNlZCBmb3IKLQkJICogZGlmZmVyZW50IHR5cGVzIG9mIGFydGlmYWN0cy4gRm9yIG5vdyB3ZSBoYXZlIGEgc2luZ2xlIGltYWdlLgotCQkgKiAKLQkJICogQHBhcmFtIG9iagotCQkgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgb2JqZWN0IHRoYXQgdGhpcyBhcnRpZmFjdCBpcyByZXByZXNlbnRlZCBieQotCQkgKiBAcmV0dXJuIGltYWdlIGZvciBtYXJrZXIKLQkJICogICAgICAgICA8cD4KLQkJICogICAgICAgICBOb3RlOiBpZiBhIG51bGwgcGx1Z0luIGluc3RhbmNlIGlzIHByb3ZpZGVkIG9uIHRoZSB2aWV3IGN0b3IsCi0JCSAqICAgICAgICAgdGhlIGRlZmF1bHQgcGx1Z2luICh0aGlzIG9uZSkgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kCi0JCSAqICAgICAgICAgcmVzb3VyY2VzIChlLmcuIGljb24gaW1hZ2VzKSBpZiB0aGUgZGVyaXZlZCBjbGFzcyBpcyBpbiBpdHMKLQkJICogICAgICAgICBvd24gcGx1Zy1pbiwgYW5kIGl0cyBpY29ucyBhcmUsIHRvby4KLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0Q3VzdG9tSW1hZ2UoT2JqZWN0IG9iaikgewotCQkJLy8gaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIG9uZSBvZiB0aGlzIHR5cGUgb2YgaWNvbiwgcmV1c2UgaXQuCi0JCQkvLyBOb3RlOiB1c2UgSW1hZ2VSZWdpc3RyeSBpbnN0ZWFkPwotCQkJSW1hZ2UgaW1nID0gKEltYWdlKSBpY29uSGFzaC5nZXQoaWNvbk5hbWVfKTsKLQkJCWlmIChpbWcgPT0gbnVsbCkgewotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGljb25OYW1lXyk7Ci0JCQkJLy8gQlJUIG1ha2Ugc3VyZSB0aGUgc3BlY2lmaWMgcGx1Z2luIGlzIGJlaW5nIHVzZWQgaGVyZSB0byBmaW5kCi0JCQkJLy8gaXRzIE9XTiBpY29ucwotCQkJCVVSTCB1cmwgPSB0aGVQbHVnaW5fLmZpbmQocGF0aCk7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJCQlpbWcgPSBpZC5jcmVhdGVJbWFnZSgpOwotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVjogKioqKiogY3JlYXRlZCBpbWFnZSBmb3IgIiArIGljb25OYW1lXyk7Ci0JCQkJaWNvbkhhc2gucHV0KGljb25OYW1lXywgaW1nKTsvLyBzYXZlIGZvciByZXVzZQotCQkJfQotCQkJcmV0dXJuIGltZzsKLQkJfQotCi0JCS8qKgotCQkgKiBEaXNwb3NlIG9mIGFueXRoaW5nIHRoYXQgd291bGQgaGFuZyBhcm91bmQgcnVkZWx5IG90aGVyd2lzZSAoc3VjaCBhcwotCQkgKiBpbWFnZSBvYmplY3RzIGZyb20gdGhlIGljb25zKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWLlZpZXdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsgZGlzcG9zZSBvZiBpY29uIGltYWdlcyIpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaWNvbkhhc2gudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW1hZ2UgaW1nID0gKEltYWdlKSBpdGVyLm5leHQoKTsKLQkJCQlpbWcuZGlzcG9zZSgpOwotCQkJfQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHNvcnRlciBmb3IgaXRlbXMgLSB0aGUgb3JkZXIgdGhleSB3ZXJlIGNyZWF0ZWQsIHdoaWNoIHRlbmRzIHRvCi0JICogZ3JvdXAgaXRlbXMgd2l0aCB0aGVpciBzb3VyY2UgY29kZSBsb2NhdGlvbnMKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKi8KLQljbGFzcyBOYW1lU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGl0ZW1zIGJ5IG9uZSBvciBtb3JlIG9mOiBhcnRpZmFjdCwgZmlsZW5hbWUsIGxpbmVObywKLQkgKiB2YXJpYWJsZUNvbHVtbk5hbWUuPGJyPgotCSAqIFRoZSBkZXJpdmVkIGNsYXNzZXMgd2lsbCBpbXBsZW1lbnQgY29tYmluZSgpIHRvIHNheSBob3cgdGhlIGF0dHJpYnV0ZXMKLQkgKiBhcmUgY29tYmluZWQgdG8gZ2V0IHRoZSBzb3J0IGRlc2lyZWQuCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1NvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGFzY2VuZGluZyA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIENvbXBhcmUgdHdvIGl0ZW1zIHRvIGRldGVybWluZSBzb3J0IG9yZGVyLiBTb3J0IGl0ZW1zIGJ5IG9uZSBvciBtb3JlCi0JCSAqIG9mOiBhcnRpZmFjdCBuYW1lLCB0aGVuIGZpbGUsIHRoZW4gbGluZSBudW1iZXIsIHRoZW4gY29uc3RydWN0Ci0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCWludCByZXN1bHQgPSAwOwotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQotCQkJamF2YS50ZXh0LkNvbGxhdG9yIGNvbGxhdG9yID0gdGhpcy5nZXRDb2xsYXRvcigpOwotCi0JCQlpZiAoZTEgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSU1hcmtlciBtMSA9IChJTWFya2VyKSBlMTsKLQkJCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQkJU3RyaW5nIG5hbWUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQkJCQlTdHJpbmcgZmlsZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCi0JCQkJCVN0cmluZyBsaW5lMSA9IChTdHJpbmcpIG0xLmdldEF0dHJpYnV0ZShMSU5FKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgY29uc3RydWN0MSA9IGdldENvbnN0cnVjdFN0cihtMSk7Ci0JCQkJCVN0cmluZyBzb3J0MSA9IGNvbWJpbmUobmFtZTEsIGZpbGUxLCBsaW5lMSwgY29uc3RydWN0MSk7Ci0KLQkJCQkJU3RyaW5nIG5hbWUyID0gKFN0cmluZykgbTIuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQkJCQlTdHJpbmcgZmlsZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCQlTdHJpbmcgbGluZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGNvbnN0cnVjdDIgPSBnZXRDb25zdHJ1Y3RTdHIobTIpOwotCQkJCQlTdHJpbmcgc29ydDIgPSBjb21iaW5lKG5hbWUyLCBmaWxlMiwgbGluZTIsIGNvbnN0cnVjdDIpOwotCi0JCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHNvcnQxLCBzb3J0Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUoc29ydDIsIHNvcnQxKTsKLQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCX0KLQotCQkvKioKLQkJICogQ29tYmluZSBuYW1lLCBmaWxlLCBhbmQvb3IgbGluZSBudW1iZXIgdG8gcHJvdmlkZSB0aGUgc3RyaW5nIHRvIHNvcnQKLQkJICogYnkuIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMgYXMgbmVlZGVkCi0JCSAqIAotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcGFyYW0gZmlsZQotCQkgKiBAcGFyYW0gbGluZQotCQkgKiBAcGFyYW0gY29uc3RydWN0Ci0JCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybiBudWxsLCBzdWJjbGFzcyBjYW4gY2hvb3NlIHRvIGltcGwuIHRoaXMgbWV0aG9kLgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBjb21iaW5lKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGxpbmUsIFN0cmluZyBjb25zdHJ1Y3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN3aXRjaCB0byB0aGlzIHNvcnRlci4gSWYgaXQgd2FzIGFscmVhZHkgdGhpcyBzb3J0ZXIsIHRoZW4gdG9nZ2xlIHRoZQotCQkgKiBzb3J0IG9yZGVyCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIHZvaWQgc29ydCgpIHsKLQkJCS8vIFN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSsiLnNvcnQoKSBhc2NlbmRpbmc9Iithc2NlbmRpbmcpOwotCQkJaWYgKHRoaXMgPT0gdmlld2VyLmdldFNvcnRlcigpKSB7Ci0JCQkJYXNjZW5kaW5nID0gIWFzY2VuZGluZzsKLQkJCQl2aWV3ZXIuc2V0U29ydGVyKG51bGwpOyAvLyB0dXJuIG9mZiB0byBmb3JjZSByZS1zb3J0Ci0JCQl9IGVsc2UgewotCQkJCWFzY2VuZGluZyA9IHRydWU7Ci0JCQl9Ci0JCQl2aWV3ZXIuc2V0U29ydGVyKHRoaXMpOwotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNvcnRlciB0byBzb3J0IGJ5IGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBTaW1wbGVBcnRpZmFjdCBpcyBGb3VuZAotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cyBjcmVhdGVkCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgTGluZU5vU29ydGVyIGV4dGVuZHMgR2VuZXJpY1NvcnRlciB7Ci0JCS8qKgotCQkgKiBzb3J0IGl0ZW1zIGJ5IGxpbmUgbnVtYmVyCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0KLQkJCWlmIChlMSBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyIG0xID0gKElNYXJrZXIpIGUxOwotCQkJCQlPYmplY3QgdGVtcE9iaiA9IG0xLmdldEF0dHJpYnV0ZShMSU5FKTsKLQkJCQkJaW50IGxpbmUxID0gMDsKLQkJCQkJaW50IGxpbmUyID0gMDsKLQkJCQkJaWYgKHRlbXBPYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQlsaW5lMSA9ICgoSW50ZWdlcikgdGVtcE9iaikuaW50VmFsdWUoKTsKLQkJCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJCQl0ZW1wT2JqID0gbTIuZ2V0QXR0cmlidXRlKExJTkUpOwotCQkJCQkJLy8gd2UgYXNzdW1lIGlmIHRoZSBmaXJzdCB3YXMgSW50ZWdlciwgdGhpcyBvbmUgaXMsIHRvby4KLQkJCQkJCWFzc2VydCB0ZW1wT2JqIGluc3RhbmNlb2YgSW50ZWdlcjsKLQkJCQkJCWxpbmUyID0gKChJbnRlZ2VyKSB0ZW1wT2JqKS5pbnRWYWx1ZSgpOwotCi0JCQkJCX0KLQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCQlyZXN1bHQgPSBsaW5lMSAtIGxpbmUyOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBsaW5lMiAtIGxpbmUxOwotCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgbmFtZQotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIE5hbWVBcnRpZmFjdFNvcnRlciBleHRlbmRzIEdlbmVyaWNTb3J0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcGFyYW0gZmlsZQotCQkgKiBAcGFyYW0gbGluZQotCQkgKiBAcGFyYW0gY29uc3RydWN0Ci0JCSAqIEByZXR1cm4gQlJUIG5vdGU6IFNvcnQgaXNuJ3QgcXVpdGUgcmlnaHQ6IGlmIG5hbWUsZmlsZW5hbWUgaWRlbnRpY2FsLAotCQkgKiAgICAgICAgICIxMCIgd291bGQgc29ydCBiZWZvcmUgIjIiIGUuZy4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgY29tYmluZShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGUsIFN0cmluZyBsaW5lLCBTdHJpbmcgY29uc3RydWN0KSB7Ci0JCQlmaW5hbCBTdHJpbmcgZGVsaW0gPSAiIC0gIjsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGZpbGUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGNvbnN0cnVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGl0ZW1zIGJ5IGZpbGVuYW1lICh0aGVuIGxpbmUgbnVtYmVyKQotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIEZpbGVuYW1lU29ydGVyIGV4dGVuZHMgR2VuZXJpY1NvcnRlciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJCWludCByZXMgPSAwOwotCQkJdHJ5IHsKLQkJCQlJTWFya2VyIG0xID0gKElNYXJrZXIpIGUxOwotCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJU3RyaW5nIGZpbGUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKEZJTEVOQU1FKTsKLQkJCQlTdHJpbmcgZmlsZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJhc2NlbmRpbmc9IiArIGFzY2VuZGluZyk7Ci0JCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShmaWxlMSwgZmlsZTIpOwotCQkJCWVsc2UKLQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShmaWxlMiwgZmlsZTEpOwotCQkJCS8vIGlmIHRoZSBmaWxlbmFtZSBpcyB0aGUgc2FtZSwgb25seSB0aGVuIGRvIHdlIGxvb2sgYXQgbGluZQotCQkJCS8vIG51bWJlcgotCQkJCWlmIChyZXMgPT0gMCkgewotCQkJCQlTdHJpbmcgbGluZTEgPSBtMS5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGxpbmUyID0gbTIuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCWludCBsMSA9IEludGVnZXIucGFyc2VJbnQobGluZTEpOwotCQkJCQlpbnQgbDIgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUyKTsKLQkJCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJCXJlcyA9IGwxIC0gbDI7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlcyA9IGwyIC0gbDE7Ci0JCQkJfQotCQkJCS8vIGlmIHRoZSBmaWxlbmFtZSBhbmQgbGluZSBubyBhcmUgdGhlIHNhbWUsIG9ubHkgdGhlbiBkbyB3ZQotCQkJCS8vIGxvb2sgYXQgY29uc3RydWN0Ci0JCQkJaWYgKHJlcyA9PSAwKSB7Ci0JCQkJCWlmIChhc2NlbmRpbmcpIHsKLQkJCQkJCXJlcyA9IGNvbGxhdG9yLmNvbXBhcmUoZ2V0Q29uc3RydWN0U3RyKG0xKSwgZ2V0Q29uc3RydWN0U3RyKG0yKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXMgPSBjb2xsYXRvci5jb21wYXJlKGdldENvbnN0cnVjdFN0cihtMiksIGdldENvbnN0cnVjdFN0cihtMSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQl9Ci0KLQljbGFzcyBDb25zdHJ1Y3RTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQotCQkvKioKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHBhcmFtIGZpbGUKLQkJICogQHBhcmFtIGxpbmUKLQkJICogQHBhcmFtIGNvbnN0cnVjdAotCQkgKiBAcmV0dXJuIEJSVCBub3RlOiBTb3J0IGlzbid0IHF1aXRlIHJpZ2h0OiBpZiBuYW1lLGZpbGVuYW1lIGlkZW50aWNhbCwKLQkJICogICAgICAgICAiMTAiIHdvdWxkIHNvcnQgYmVmb3JlICIyIiBlLmcuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmUoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSwgU3RyaW5nIGNvbnN0cnVjdCkgewotCQkJZmluYWwgU3RyaW5nIGRlbGltID0gIiAtICI7Ci0JCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihjb25zdHJ1Y3QpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGZpbGUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBhbGxvdyB1cyB0byBjcmVhdGUgdGhlIHZpZXdlciBhbmQgaW5pdGlhbGl6ZQotCSAqIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJVHJlZUNvbHVtbiBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsgLy8gY29sIDEKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOyAvLyBjb2wgMgotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7IC8vIGNvbCAzCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsgLy8gY29sIDQKLQotCQkvLyBXaWRnZXQgY3JlYXRlZCBhbmQgY3VzdG9taXplZCBhbmQgdGhlbiBwYXNzZWQgdG8gdmlld2VyIGR1cmluZwotCQkvLyBjcmVhdGlvbiA6Ci0vKgkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJU3RyaW5nW10gU1REX0hFQURJTkdTID0geyAiICIsIHRoaW5nbmFtZV8sICJGaWxlbmFtZSIsICJMaW5lTm8iLCB0aGlzLmNvbHVtbk5hbWVfIH07Ci0KLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSwgMSwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiB0YzAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJdGMwLnNldFRleHQoU1REX0hFQURJTkdTWzBdKTsKLQkJdGMwLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCXRjMC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gdGMxID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXRjMS5zZXRUZXh0KFNURF9IRUFESU5HU1sxXSk7Ci0JCXRjMS5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl0YzEuc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIHRjMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl0YzIuc2V0VGV4dChTVERfSEVBRElOR1NbMl0pOwotCQl0YzIuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJdGMyLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIHRjMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl0YzMuc2V0VGV4dChTVERfSEVBRElOR1NbM10pOwotCQl0YzMuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJdGMzLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiB0YzQgPSBudWxsOwotCQlpZiAodGhpcy5jb2x1bW5OYW1lXyAhPSBudWxsKSB7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCB0cnVlKSk7Ci0JCQl0YzQgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCXRjNC5zZXRUZXh0KFNURF9IRUFESU5HU1s0XSk7Ci0JCQl0YzQuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCXRjNC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbnVtQ29scyA9IGNvbHVtbk5hbWVzXy5sZW5ndGg7Ci0JCQlUYWJsZUNvbHVtbltdIHRhYmxlQ29scyA9IG5ldyBUYWJsZUNvbHVtbltudW1Db2xzXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sczsgaSsrKSB7Ci0JCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgdHJ1ZSkpOwotCQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdGMuc2V0VGV4dChjb2x1bW5OYW1lc19baV0pOwotCQkJCXRjLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJCXRhYmxlQ29sc1tpXSA9IHRjOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGxpc3RlbmVycyBmb3IgdGFibGUgc29ydGluZwotCQkvLyBTb3J0IGJ5ICJpY29uIiAodGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIsIGFjdHVhbGx5KQotCQl0YzAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl2aWV3ZXIuc2V0U29ydGVyKG51bGwpOwotCQkJCXZpZXdlci5zZXRTb3J0ZXIobmFtZVNvcnRlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJLy8gU29ydCBieSBhcnRpZmFjdCBuYW1lCi0JCXRjMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW5hbWVBcnRpZmFjdFNvcnRlci5zb3J0KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJLy8gU29ydCBieSBmaWxlIG5hbWUgKHRoZW4gYnkgbGluZU5vKQotCQl0YzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaWxlbmFtZVNvcnRlci5zb3J0KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJLy8gU29ydCBieSBMaW5lIG51bWJlcgotCQl0YzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlsaW5lTm9Tb3J0ZXIuc29ydCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCS8vIFNvcnQgYnkgQ29uc3RydWN0IChpZiB3ZSdyZSBub3QgZG9pbmcgYW4gYXJyYXkgb2YgZXh0cmEgY29sdW1ucykKLQkJaWYgKHRjNCAhPSBudWxsKSB7Ci0JCQl0YzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWNvbnN0cnVjdFNvcnRlci5zb3J0KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLSovCi0JCS8vIFNlbGVjdGlvbiBsaXN0ZW5lciB0byBrbm93IHdoZW4gYSB0YWJsZSByb3cgaXMgc2VsZWN0ZWQuCi0KLQkJLy90YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJdHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJLy8gcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigid2lkZ2V0RGVmYXVsdFNlbGVjdGVkIik7Ci0JCQkvLyB9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlPYmplY3Qgb2JqID0gZS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFibGUpIHsKLQkJCQkJVGFibGUgdCA9IChUYWJsZSkgb2JqOwotCQkJCQlpbnQgcm93ID0gdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkvLyByb3dTZWxlY3RlZF8gPSByb3c7Ci0JCQkJCS8vIHByaW50IG1hcmtlciBpbmZvIHdoZW4gc2VsZWN0ZWQgaW4gdGFibGUKLQkJCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJCVRhYmxlSXRlbSB0aSA9IHQuZ2V0SXRlbShyb3cpOwotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgdGkuZ2V0RGF0YSgpOwotCQkJCQkJSUFydGlmYWN0IGFydGlmYWN0ID0gZ2V0U2ltcGxlQXJ0aWZhY3QobWFya2VyKTsKLQkJCQkJCVN0cmluZyBpZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUodW5pcXVlSURfLCAiKGVycm9yKSIpOwotCQkJCQkJaW50IG1MaW5lID0gTWFya2VyVXRpbGl0aWVzLmdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQkJCWludCBsaW5lTm8gPSAwOwotCQkJCQkJaWYgKGFydGlmYWN0ICE9IG51bGwpCi0JCQkJCQkJbGluZU5vID0gYXJ0aWZhY3QuZ2V0TGluZSgpOwotCi0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1BUktFUiBpZD0iICsgaWQgKyAiIG1rckxpbmVObz0iICsgbUxpbmUgKyAiIGFydGlmYWN0TGluZU5vPSIgKyBsaW5lTm8pOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld0xhYmVsUHJvdmlkZXIoKSk7Ci0JCS8vIFNldCB1cCB0aGUgc29ydGVycy4KLQkJbmFtZVNvcnRlciA9IG5ldyBOYW1lU29ydGVyKCk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmFtZVNvcnRlcik7Ci0JCWxpbmVOb1NvcnRlciA9IG5ldyBMaW5lTm9Tb3J0ZXIoKTsKLQkJbmFtZUFydGlmYWN0U29ydGVyID0gbmV3IE5hbWVBcnRpZmFjdFNvcnRlcigpOwotCQlmaWxlbmFtZVNvcnRlciA9IG5ldyBGaWxlbmFtZVNvcnRlcigpOwotCQljb25zdHJ1Y3RTb3J0ZXIgPSBuZXcgQ29uc3RydWN0U29ydGVyKCk7Ci0KLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkvLyBtYXJrZXJzIGZyb20gd29ya3NwYWNlCi0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJCXNlbGVjdGVkTWFya2VyXyA9IChJTWFya2VyKSBvYmo7Ci0JCQkJfQotCQkJCXNob3dTdGF0dXNNZXNzYWdlKCIiLCAic2VsZWN0aW9uQ2hhbmdlZCIpOwotCQkJfQotCQl9KTsKLQotCQltYWtlQWN0aW9ucygpOwotCQlob29rQ29udGV4dE1lbnUoKTsKLQkJaG9va0RvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JCWNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaG9va0NvbnRleHRNZW51KCkgewotCQlNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7Ci0JCW1lbnVNZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCVNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIHZpZXdlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZmlsbExvY2FsUHVsbERvd24oYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJZmlsbExvY2FsVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxQdWxsRG93bihJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChpbmZvQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQoZmlsdGVyQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVpciBhY3Rpb25zIGhlcmUKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiQWRkaXRpb25zIikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxUb29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE1ha2UgdGhlIGFjdGlvbiBvYmplY3RzIGZvciB0aGUgbWVudXMgYW5kIHRvb2xiYXIuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQltYWtlU2hvd0luZm9BY3Rpb24oKTsKLQkJbWFrZUZpbHRlckFjdGlvbigpOwotCQltYWtlRG91YmxlQ2xpY2tBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlICJzaG93IGluZm8iIGFjdGlvbiB0byBkaXNwbGF5IGFydGlmYWN0IGluZm9ybWF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZVNob3dJbmZvQWN0aW9uKCkgewotCQlpbmZvQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSB0aGluZ25hbWVfICsgIiBpbmZvcm1hdGlvbiI7Ci0JCQkJaWYgKHNlbGVjdGVkTWFya2VyXyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpZEZyb21NYXJrZXIgPSAoU3RyaW5nKSBzZWxlY3RlZE1hcmtlcl8uZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXywgbnVsbCk7Ci0JCQkJCWlmIChpZEZyb21NYXJrZXIgPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFY6IGV4Y2VwdGlvbiByZWFkaW5nIG1hcmtlciBJRCIpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZ0J1ZmZlciBpbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCQkJCUlBcnRpZmFjdCBhcnRpZmFjdCA9IGFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3QoaWRGcm9tTWFya2VyKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuRmlsZSBuYW1lOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCWluZm8uYXBwZW5kKCJcbkxpbmUgbnVtYmVyOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0TGluZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuTmFtZTogIikuYXBwZW5kKGFydGlmYWN0LmdldFNob3J0TmFtZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuRGVzY3JpcHRpb246ICIpLmFwcGVuZChhcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpKTsKLQotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihudWxsLCB0aXRsZSwgaW5mby50b1N0cmluZygpKTsKLQkJCQl9Ly8gZW5kIGlmIHNlbGVjdGVkTWFya2VyIT1udWxsCi0JCQkJZWxzZSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsIHRpdGxlLCAiTm8gIiArIHRoaW5nbmFtZV8gKyAiIHNlbGVjdGVkLiIpOwotCQkJCX0KLQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLQkJCX0KLQkJfTsKLQkJaW5mb0FjdGlvbi5zZXRUZXh0KCJTaG93IEluZm8iKTsKLQkJaW5mb0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiU2hvdyBkZXRhaWxlZCBpbmZvIGZvciBzZWxlY3RlZCAiICsgdGhpbmduYW1lXyk7Ci0JCWluZm9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGZpbHRlciBhY3Rpb24gKFRCRCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZUZpbHRlckFjdGlvbigpIHsKLQkJZmlsdGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzaG93TWVzc2FnZSgiRmlsdGVyICIgKyB0aGluZ25hbWVzXyArICJcbkRldGVybWluZSB3aGljaCAiICsgdGhpbmduYW1lc18gKyAiIGFyZSBzaG93biBpbiB0aGlzIHZpZXcuIik7Ci0JCQl9Ci0JCX07Ci0JCWZpbHRlckFjdGlvbi5zZXRUZXh0KCJGaWx0ZXIgIiArIHRoaW5nbmFtZXNfKTsKLQkJZmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJGaWx0ZXIgd2hpY2ggIiArIHRoaW5nbmFtZXNfICsgIiBhcmUgc2hvd24gaW4gdGhpcyB2aWV3Iik7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBkb3VibGUtY2xpY2sgYWN0aW9uLCB3aGljaCBtb3ZlcyBlZGl0b3IgdG8gdGhlIGFydGlmYWN0IGluc3RhbmNlIGluCi0JICogdGhlIHNvdXJjZSBjb2RlIChlZGl0b3IgdG8gbGluZSBpbiBzb3VyY2UgY29kZSkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZURvdWJsZUNsaWNrQWN0aW9uKCkgewotCi0JCWRvdWJsZUNsaWNrQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkvLyBUaGlzIGFjdGlvbiBvbmx5IG1ha2VzIHNlbnNlIG9uIGNoaWxkIG5vZGVzIChtYXJrZXJzKQotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlIGYgPSAoSUZpbGUpIG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpbnQgbGluZU5vID0gZ2V0TWFya2VyTGluZU5vKG1hcmtlcik7Ci0JCQkJCWlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd2JwID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCQkJCS8vIElFZGl0b3JJbnB1dCBpZXUgPSBuZXcgRmlsZUVkaXRvcklucHV0KGYpOwotCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3Iod2JwLCBmKTsKLQotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYmVmb3JlICIgKyBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpKTsKLQkJCQkJCS8vIG5vdGU6IChyZT8pIHNldHRpbmcgbGluZW51bWJlciBoZXJlIGlzIHJlcXVpcmVkIHRvCi0JCQkJCQkvLyBwdXQgbWFya2VyIGluIGVkaXRvciE/IQotCQkJCQkJTWFya2VyVXRpbGl0aWVzLnNldExpbmVOdW1iZXIobWFya2VyLCBsaW5lTm8pOwotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYWZ0ZXIgIiArIE1hcmtlclV0aWxpdGllcy5nZXRMaW5lTnVtYmVyKG1hcmtlcikpOwotCQkJCQkJSURFLmdvdG9NYXJrZXIoZWRpdG9yLCBtYXJrZXIpOwotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFY6IERvdWJsZUNsaWNrQWN0aW9uLCBjbGVhciBzdGF0dXMiKTsKLQkJCQkJCXNob3dTdGF0dXNNZXNzYWdlKCIiLCAiZG91YmxlIGNsaWNrIGFjdGlvbiIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFYuZG91YmxlY2xpY2tBY3Rpb246IEVycm9yIHBvc2l0aW9uaW5nIGVkaXRvciBwYWdlIGZyb20gbWFya2VyIGxpbmUgbnVtYmVyIik7Ci0JCQkJCXNob3dTdGF0dXNNZXNzYWdlKCJFcnJvciBwb3NpdGlvbmluZyBlZGl0b3IgZnJvbSBtYXJrZXIgbGluZSBudW1iZXIiLCAiZXJyb3IgbWFya2VyIGdvdG8iKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb3VibGVDbGlja0FjdGlvbigpIHsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24odmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB2aWV3TmFtZV8sIG1lc3NhZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93U3RhdHVzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGRlYnVnTWVzc2FnZSkgewotCQlpZiAodHJhY2VTdGF0dXNMaW5lKSB7Ci0JCQltZXNzYWdlICs9ICIgLSAiOwotCQkJbWVzc2FnZSArPSBkZWJ1Z01lc3NhZ2U7Ci0JCX0KLQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQlnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnVwZGF0ZSh0cnVlKTsKLQotCX0KLQotCS8qKgotCSAqIFBhc3NpbmcgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXNob3dTdGF0dXNNZXNzYWdlKCIiLCAic2V0Rm9jdXMiKTsgLy8gcmVzZXQgc3RhdHVzIG1lc3NhZ2UKLQkJaWYgKCF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodHJhY2VPbikKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2ltcGxlVGFibGVWaWV3LmRpc3Bvc2UoKSIpOwotCQkvLyBCUlQgZG8gd2UgbmVlZCB0byBkaXNwb3NlIG9mIGltYWdlRGVzY3JpcHRvcnMgd2UgbWFkZT8gb3IganVzdAotCQkvLyBpbWFnZXM/Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93TWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTWFya2VyLS0tLS0tLSAgSU1hcmtlci5MSU5FX05VTUJFUj0iICsgSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCXRyeSB7Ci0JCQlNYXAgYXR0cnMgPSBtYXJrZXIuZ2V0QXR0cmlidXRlcygpOwotCQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiICsgZS5nZXRLZXkoKSArICIgIiArIGUuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIG1ha2VJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCVVSTCB1cmwgPSB0aGVQbHVnaW5fLmZpbmQobmV3IFBhdGgoaWNvbk5hbWUpKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFB1c2ggY2hhbmdlIGluZm8gKGFydGlmYWN0IGFuZCBtYXJrZXIpIG9udG8gYSBzdGFjayBzbyB3ZSBjYW4gcmVtZW1iZXIKLQkgKiBpdCwgZm9yIHBvc3NpYmxlIHVuZG8gYWN0aW9uLiBBbHNvIGVuYWJsZXMvZGlzYWJsZXMgdGhlIFVuZG8gYWN0aW9uCi0JICogYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBhcnRpZmFjdAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ2hhbmdlZEluZm8oSUFydGlmYWN0IGFydGlmYWN0LCBJTWFya2VyIG1hcmtlcikgewotCQljaGFuZ2VkQXJ0c18ucHVzaChhcnRpZmFjdCk7Ci0JCWNoYW5nZWRNYXJrZXJzXy5wdXNoKG1hcmtlcik7Ci0JCWNoZWNrVW5kb1N0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFNldCBzdGF0dXMgb2YgdW5kbyBhY3Rpb24gKGVuYWJsZWQgb3IgZGlzYWJsZWQpIGJhc2VkIG9uIGlmIHRoZXJlIGFyZSBhbnkKLQkgKiBhcnRpZmFjdCBjaGFuZ2VzLCBvciBvdGhlciBjaGFuZ2VzLCBhdmFpbGFibGUgdG8gdW5kbwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrVW5kb1N0YXR1cygpIHsKLQotCX0KLQotCS8qKgotCSAqIEdldCBtYXJrZXIgbGluZSBudW1iZXJzLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRNYXJrZXJMaW5lTm8oSU1hcmtlciBtYXJrZXIpIHsKLQkJaW50IGxpbmVObyA9IGdldEludEF0dHIobWFya2VyLCBJTWFya2VyLkxJTkVfTlVNQkVSKTsKLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW50IHZhbHVlIHRoYXQgaXMgYXNzdW1lZCB0byBiZSBzdG9yZWQgaW4gYSBtYXJrZXIgaW4gYSBnaXZlbgotCSAqIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSwgb3IgMCBpZiBub25lIGZvdW5kLCBvciBpbnZhbGlkIHZhbHVlIGZvdW5kCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJbnRBdHRyKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgYXR0cikgewotCQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0ZW1wID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyKS50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyBDb3JlRXhjZXB0aW9uIG9yIENsYXNzQ2FzdEV4Y2VwdGlvbiBwb3NzaWJsZQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiBNYXJrZXIgbGluZU5vKCIgKyBhdHRyICsgIikgaW52YWxpZDsgdXNpbmcgMCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGxpbmVObyA9IDA7Ci0JCXRyeSB7Ci0JCQlsaW5lTm8gPSBJbnRlZ2VyLnBhcnNlSW50KHRlbXApOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVjogTWFya2VyIGxpbmVObygiICsgdGVtcCArICIgZnJvbSBhdHRyICIgKyBhdHRyCi0JCQkJCSsgIikgaW52YWxpZCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uKTsgdXNpbmcgMCIpOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGF0dHJpYnV0ZSBTdHJpbmcgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSBhdHRyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgYXR0cikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIEV4Y2VwdGlvbiBnZXR0aW5nIG1hcmtlciBhdHRyaWJ1dGUgIiArIGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogYSBTdGFjayB0aGF0IGlzbid0IGJhc2VkIG9uIFZlY3RvciAtIEdlbmVyaWMgTElGTyBzdGFjawotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdGFja0xpc3QgewotCQlwcml2YXRlIExpbmtlZExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQkJcHVibGljIHZvaWQgcHVzaChPYmplY3QgdikgewotCQkJbGlzdC5hZGRGaXJzdCh2KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgdG9wKCkgewotCQkJcmV0dXJuIGxpc3QuZ2V0Rmlyc3QoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcG9wKCkgewotCQkJcmV0dXJuIGxpc3QucmVtb3ZlRmlyc3QoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gbGlzdC5pc0VtcHR5KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFZpc2l0IHRoZSByZXNvdXJjZSBkZWx0YSB0byBsb29rIGZvciB0aGUgbWFya2VyIGNoYW5nZXMgd2UgYXJlIGludGVyZXN0ZWQKLQkgKiBpbgotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqLwotCXB1YmxpYyBjbGFzcyBVcGRhdGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCQkvKioKLQkJICogVmlzaXQgYXBwcm9wcmlhdGUgcGFydHMgb2YgdGhlIHJlc291cmNlIGRlbHRhIHRvIGZpbmQgdGhlIG1hcmtlcnMKLQkJICogdGhhdCBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dC4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0ZVZpc2l0b3I6IGZpbGUgY2hhbmdlZDogIiArIG5hbWUpOwotCi0JCQkJCS8vIEhhbmRsZSBmaWxlIGNoYW5nZXMgKHNhdmVzKSBieSByZXBvcnRpbmcgdGhlIGNoYW5nZXMKLQkJCQkJLy8gbWFkZSB0byB0aGUgZmlsZSwgdG8gdXBkYXRlIGJhY2tlbmQgYW5hbHlzaXMKLQkJCQkJLy8gcmVwcmVzZW50YXRpb24KLQkJCQkJSUZpbGUgZiA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCWludCBjb250ZW50Q2hhbmdlZCA9IGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVDsKLQotCQkJCQlpZiAodmFsaWRGb3JBbmFseXNpcyhmLmdldE5hbWUoKSkpIHsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSAiICsgZi5nZXROYW1lKCkKLQkJCQkJCQkJCSsgIiBpcyB2YWxpZCBmb3IgYW5hbHlzaXMgc28gd2lsbCBwcm9jZXNzIHRoZSBjaGFuZ2UuLi4iKTsKLQkJCQkJCWlmIChjb250ZW50Q2hhbmdlZCAhPSAwKSB7Ci0JCQkJCQkJLy8gZG8gd2UgbmVlZCB0byB0ZWxsIGJhY2sgZW5kIChhbmFseXNpcyBlbmdpbmUpCi0JCQkJCQkJLy8gdGhhdCBmaWxlIGNoYW5nZWQ/Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlZnJlc2ggbWFya2VycyBmb3IgdGhhdCBmaWxlPwotCQkJCQkJSU1hcmtlckRlbHRhW10gbURlbHRhcyA9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJCQkJaW50IGxlbiA9IG1EZWx0YXMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW47IGorKykgewotCQkJCQkJCUlNYXJrZXJEZWx0YSBkZWx0YTMgPSBtRGVsdGFzW2pdOwotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlzaG93TWFya2VyRGVsdGFLaW5kKGRlbHRhMyk7Ci0JCQkJCQkJSU1hcmtlciBtID0gZGVsdGEzLmdldE1hcmtlcigpOwotCQkJCQkJCVN0cmluZyBsbiA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tVXBkYXRlVmlzaXRvci52aXNpdCgpOnZpZXdlciB1cGRhdGUgbWFya2VyOiAobGluZU5vKSIpOwotCQkJCQkJCS8vIHNob3dNYXJrZXIobSk7Ci0JCQkJCQkJU3RyaW5nW10gcHJvcHMgPSBuZXcgU3RyaW5nWzFdOyAvLyBhd2t3YXJkLiB3aHk/Pz8KLQkJCQkJCQlwcm9wc1swXSA9IGxuOwotCQkJCQkJCS8vIGp1c3QgdXBkYXRlIHZpZXdlciBpdGVtLCBub3QgdGhlIHdob2xlIHZpZXcKLQkJCQkJCQkvLyB2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCXZpZXdlci51cGRhdGUobSwgcHJvcHMpOwotCQkJCQkJfSAvLyBlbmQgbG9vcAotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlICIgKyBmLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiIGlzIE5PVCB2YWxpZCBmb3IgYW5hbHlzaXMgc28gd2lsbCBpZ25vcmUgY2hhbmdlLi4uIik7Ci0KLQkJCQkJfQotCQkJCX0gLy8gZW5kIGlmIENIQU5HRUQKLQkJCQllbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIGFkZGVkLiIpOwotCQkJCQljaGVja01hcmtlckRlbHRhcyhkZWx0YSk7Ci0JCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIHJlcGxhY2VkLiIpOwotCQkJCQljaGVja01hcmtlckRlbHRhcyhkZWx0YSk7Ci0JCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgcmVtb3ZlZC4iKTsKLQkJCQkJY2hlY2tNYXJrZXJEZWx0YXMoZGVsdGEpOwotCQkJCX0KLQkJCX0gLy8gZW5kIGlmIEZJTEUKLQkJCXJldHVybiB0cnVlOyAvLyBrZWVwIGdvaW5nCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY2hlY2tNYXJrZXJEZWx0YXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUlNYXJrZXJEZWx0YVtdIG1kMSA9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJaW50IGxlbiA9IG1kMS5sZW5ndGg7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC4uLiBmb3VuZCAiICsgbGVuICsgIiBtYXJrZXJEZWx0YXMuIik7Ci0JCX0KLQotCQkvKioKLQkJICogU2hvdyBpbmZvIGFib3V0IHRoZSBtYXJrZXIgaW4gdGhlIG1hcmtlciBkZWx0YS4gVGhpcyBpcyBqdXN0IHRyYWNpbmcKLQkJICogdGhlIGluZm8gYXZhaWxhYmxlIHVudGlsIHdlIGRvIHNvbWV0aGluZyB3aXRoIGl0LiBGb3Igbm93LCB3ZSdyZSBqdXN0Ci0JCSAqIGRvaW5nIGEgKGJpZykgdmlld2VyLnJlZnJlc2goKSB0byByZWZyZXNoIGFsbCB0aGUgbWFya2Vycy4gV2hlbiB3ZQotCQkgKiBnZXQgbW9yZSBpbnRlbGxpZ2VudCBhYm91dCBqdXN0IHVwZGF0aW5nIHRoZSBvbmVzIHRoYXQgY2hhbmdlZCwgd2UKLQkJICogY2FuIHJlbW92ZSB0aGF0LiBTaG91bGRuJ3QgbWFrZSBtdWNoIGRpZmZlcmVudCBmb3Igc21hbGwgc2V0cyBvZgotCQkgKiBtYXJrZXJzLCBidXQgZm9yIG1hbnkgbWFya2VycywgdGhpcyBjb3VsZCBiZSBhIHNpZ25pZmljYW50Ci0JCSAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhMwotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNob3dNYXJrZXJEZWx0YUtpbmQoSU1hcmtlckRlbHRhIGRlbHRhMykgewotCi0JCQkvLyBpbnQgbWRLaW5kID0gZGVsdGEzLmdldEtpbmQoKTsKLQkJCUlNYXJrZXIgbSA9IGRlbHRhMy5nZXRNYXJrZXIoKTsKLQotCQkJU3RyaW5nIGtpbmQgPSAiVU5LTk9XTiI7Ci0JCQlzd2l0Y2ggKGRlbHRhMy5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJa2luZCA9ICJBRERFRCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJa2luZCA9ICJDSEFOR0VEIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLQkJCQlraW5kID0gIlJFTU9WRUQiOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlraW5kID0gIlVOS05PV04iOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBtYXJrZXJEZWx0YUtpbmQ9IiArIGtpbmQpOwotCQkJU3RyaW5nIG1pZCA9ICIiLCBtbCA9ICIiLCBtbHBpID0gIiI7Ci0JCQl0cnkgewotCQkJCS8vIG5vdGU6IHdlJ3JlIGdldHRpbmcgbWFya2VyIGRlbHRhcyBvbiBBTEwgbWFya2VycywKLQkJCQkvLyBub3QganVzdCBhcnRpZmFjdCBtYXJrZXJzLCB3aGljaCBjYW4gdGhyb3cgdXMgb2ZmLgotCQkJCS8vIGluIHBhcnRpY3VsYXIsIHRlbXAgbWFya2VycyB1c2VkIGJ5IGFjdGlvbnM/Ci0KLQkJCQltaWQgPSBtLmdldEF0dHJpYnV0ZSh1bmlxdWVJRF8pLnRvU3RyaW5nKCk7Ci0JCQkJbWwgPSBtLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKS50b1N0cmluZygpOwotCQkJCS8vIG1scGkgPSBtLmdldEF0dHJpYnV0ZShJRHMuTElORSkudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCS8vIGlnbm9yZSBlcnJvcnM7IG9ubHkgdHJhY2luZyBmb3Igbm93LgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWLlVwZGF0ZVZpc2l0b3IgZXJyb3IgZ2V0dGluZyBtYXJrZXIgaW5mbyAiKTsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIG1hcmtlcklEXz0iICsgbWlkICsgIiAgbGluZU5vKG1rci1tcGlBKT0iICsgbWwgKyAiLSIgKyBtbHBpKTsKLQkJfQotCi0JfSAvLyBlbmQgY2xhc3MgVXBkYXRlVmlzaXRvcgotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci8uY2xhc3NwYXRoIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjODEzZi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTE0YzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHA8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhODMyNTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAuSGVscFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmhlbHAKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2Fib3V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMzAyZjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBodG1sLyxcCi0gICAgICAgICAgICAgICB0b2MueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGludHJvLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBodG1sLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uZXhjbHVkZXMgPSBodG1sL2ltYWdlc09sZC8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9iYXJyaWVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvYmFycmllci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY4Mjk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9iYXJyaWVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TVBJIEJhcnJpZXIgQW5hbHlzaXM8L3RpdGxlPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48aW1nIHNyYz0iaW1hZ2VzL2JhcnJpZXIuZ2lmIj4gUExEVCBNUEkgQmFycmllciBBbmFseXNpczwvaDE+Ci08aDI+PGltZyBzcmM9ImltYWdlcy9iYXJyaWVyLmdpZiI+IE92ZXJ2aWV3IG9mIFBMRFQgTVBJIEJhcnJpZXIgQW5hbHlzaXM8L2gyPgotPHA+TVBJIEJhcnJpZXIgQW5hbHlzaXMgZGV0ZWN0cyBwb3RlbnRpYWwgZGVhZGxvY2tzIGluIE1QSSBhcHBsaWNhdGlvbnMsCi1hbmQgc2hvd3MgYmFycmllciBtYXRjaGVzLCBiYXJyaWVyIGVycm9ycywgYW5kIHBhdGhzIG9mIGFsbCBiYXJyaWVyCi1tYXRjaGluZyBzZXRzLiAgSW5jbHVkZXMgZGV0ZWN0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgZnVuY3Rpb25zIGFuZCBzb3VyY2UgZmlsZXMuCi08YnI+PGltZyBzcmM9ImltYWdlcy9iYXJyaWVyTWF0Y2hlcy5naWYiPgotPGJyPiZuYnNwOwotPGJyPjxpbWcgc3JjPSJpbWFnZXMvYmFycmllckVycm9ycy5naWYiPgotPGJyPiZuYnNwOwotCi08aDI+PGltZyBzcmM9ImltYWdlcy9iYXJyaWVyLmdpZiI+IEJhcnJpZXIgQW5hbHlzaXM6IEEgU2hvcnQgSW50cm9kdWN0aW9uPC9oMj4KLTxwPkEgY29tbW9uIHNvdXJjZSBvZiBlcnJvcnMgaW4gU1BNRCAoU2luZ2xlIFByb2dyYW0gTXVsdGlwbGUgRGF0YSkgcHJvZ3JhbW1pbmcgY2F1c2VzIGRlYWRsb2NrcyB3aGVuIGJhcnJpZXIKLXN0YXRlbWVudHMsIGluIHdoaWNoIGFsbCB0YXNrcyBtdXN0IHN5bmNocm9uaXplLCBhcmUgbm90IG1hdGNoZWQgcHJvcGVybHkuCi1JZiBvbmUgTVBJIHRhc2sgaW4gYSBjb21tdW5pY2F0b3IgZG9lcyBub3QgcGFzcyB0aHJvdWdoIHRoZSBzYW1lIG51bWJlciBvZiBNUElfQmFycmllciBzdGF0ZW1lbnRzIGFzIHRoZQotb3RoZXIgdGFza3MgaW4gdGhlIHNhbWUgY29tbXVuaWNhdG9yLAotdGhlIG90aGVyIHRhc2tzIHdpbGwgZGVhZGxvY2sgd2hpbGUgd2FpdGluZy4KLQotPHA+Ci1UaGUgUExEVCBNUEkgQmFycmllciBhbmFseXNpcyBjaGVja3MgYW4gU1BNRCBwcm9ncmFtIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgYXJlIGRlYWRsb2NrcwotZHVlIHRvIHRoZSBtaXNwbGFjZW1lbnQgb2YgYmFycmllcnMuIFdlIHdpbGwgcmVwb3J0IGVycm9ycyBpZiBhbnksIGFuZCBzaG93ICJtYXRjaGluZyBzZXRzIiAKLWZvciBlYWNoIGJhcnJpZXIgaWYgZXJyb3ItZnJlZS4gVGhlIG1hdGNoaW5nIHNldCBvZiBhIGJhcnJpZXIgY29udGFpbnMgYWxsIGJhcnJpZXJzIHRoYXQKLXN5bmNocm9uaXplIHdpdGggaXQgYXQgcnVuIHRpbWUuIAotCi08cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIHNlY29uZCBpZi1icmFuY2ggaW4gCi08YSBocmVmPSJzYW1wbGVzL3Rlc3RNUEliYXJyaWVyLmMiPnRlc3RNUEliYXJyaWVyLmM8L2E+LiAKLTxwcmU+Ci0JaWYobXlfcmFuayA9PSAwKXsKLQkJcHJpbnRmKCJ0ZXN0IGVycm9yc1xuIik7Ci0JCU1QSV9CYXJyaWVyKE1QSV9DT01NX1dPUkxEKTsKLQl9Ci0KLTwvcHJlPgotVGhlIHByb2dyYW0gd2lsbCBiZWNvbWUgZGVhZGxvY2tlZCBvbiB0aGUgYWJvdmUgYnJhbmNoIGJlY2F1c2Ugc29tZSBwcm9jZXNzb3JzCi13aWxsIGV4ZWN1dGUgdGhlIGdsb2JhbCBiYXJyaWVyIGluIHRoZSBicmFuY2ggd2hpbGUgdGhlIG90aGVycyB3aWxsIHNraXAgaXQuIAotSG93ZXZlciwKLWl0IGlzIGRpZmZpY3VsdCB0byB2aXN1YWxseSBkZXRlY3QgYW4gZXJyb3IgaWYgYmFycmllcnMgYXJlIG5vdCAidGV4dHVhbGx5IiBhbGlnbmVkLiAKLTxwPgotTm93LCBjb25zaWRlciB0aGUKLXRoaXJkIGlmLWJyYW5jaCBpbiA8YSBocmVmPSJzYW1wbGVzL3Rlc3RNUEliYXJyaWVyLmMiPnRlc3RNUEliYXJyaWVyLmM8L2E+LiAKLTxwcmU+Ci0JaWYoeCA8IDMpewotCQlwcmludGYoIkl0IGlzIG5vdCBhbiBlcnJvclxuIik7Ci0JCU1QSV9CYXJyaWVyKE1QSV9DT01NX1dPUkxEKTsKLQl9Ci0KLTwvcHJlPgotRXZlbiBpZiB3ZSBvbmx5IGhhdmUgYSBiYXJyaWVyIGluIHRoZSB0aGVuIGNsYXVzZSBidXQKLW5vdCBpbiB0aGUgZWxzZSBjbGF1c2UsIHRoZXJlIGlzIG5vIGVycm9yIHNpbmNlIGFsbCBwcm9jZXNzb3JzIGFncmVlIG9uIHRoZSBicmFuY2gKLXByZWRpY2F0ZSwgYW5kIHRoZXkgd2lsbCBjaG9vc2UgdGhlIHNhbWUgd2F5IHRvIGdvLgotPGgyPlJ1bm5pbmcgQmFycmllciBBbmFseXNpczwvaDI+Ci08cD5UbyBydW4gdGhlIGJhcnJpZXIgYW5hbHlzaXMsIHNlbGVjdCBhIHByb2plY3QsIGNvbnRhaW5lciwgb3Igc291cmNlIGZpbGUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgCi1hbmQgY2xpY2sgdGhlICBNUEkgYmFycmllciBhbmFseXNpcyBhY3Rpb24gaW4gdGhlIFBMRFQgaWNvbiBtZW51LiAKLU5vdGUgdGhhdCB0aGlzIHNpbXBsZSBleGFtcGxlIGhhcyBhbGwgY29kZSBpbiBhIHNpbmdsZSBmaWxlLCBidXQgYnkgcnVubmluZyB0aGUgYW5hbHlzaXMgb24gYSAKLWNvbnRhaW5lciAoZm9sZGVyKSBvciB0aGUgZW50aXJlIHByb2plY3QsIGludGVyLXByb2NlZHVyYWwgYmFycmllcnMgZnJvbSBvdGhlciBpbmNsdWRlZCBmaWxlcyBhcmUgYWxzbyBjb25zaWRlcmVkLgotPGJyPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvYmFycmllckFjdGlvbkFubi5naWYiLDMwMCk8L3NjcmlwdD4KLTxwPlRoZSBiYXJyaWVyIGFuYWx5c2lzIHByb2R1Y2VzIHRocmVlIHZpZXdzIG9mIGluZm9ybWF0aW9uOgotPHVsPgotPGxpPjxhIGhyZWY9IiNiYXJWaWV3Ij5NUEkgQmFycmllcnMgVmlldzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNiYXJNYXRjaCI+QmFycmllciBNYXRjaGVzIFZpZXc8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYmFyRXJyb3IiPkJhcnJpZXIgRXJyb3JzIFZpZXc8L2E+PC9saT4KLTwvdWw+Ci08cD5UaGUgdGhyZWUgdmlld3Mgc2hvdWxkIHNob3cgYXV0b21hdGljYWxseSBhZnRlciBwZXJmb3JtaW5nIGJhcnJpZXIgYW5hbHlzaXMsCi1idXQgdG8gYnJpbmcgdGhlbSB1cCBvdGhlcndpc2UsIHNlbGVjdCBXaW5kb3cgPiBTaG93IFZpZXcgPiBPdGhlci4uLiBhbmQgdW5kZXIKLTxiPlBUUCBNUEkgVmlld3M8L2I+LCBzZWxlY3QgdGhlIHZpZXcgeW91IHdhbnQgdG8gc2hvdy4KLQotPGgyIGlkPSJiYXJWaWV3Ij5NUEkgQmFycmllcnMgVmlldyA8L2gyPgotPHA+VGhlIDxiPk1QSSBCYXJyaWVyczwvYj4gdmlldyBsaXN0cyBhbGwgYmFycmllcnMgaW4gdGhlIHByb2dyYW0ocyksIHRoZWlyCi1lbmNsb3NpbmcgZnVuY3Rpb24gbmFtZXMsIGZpbGVuYW1lcywgbGluZSBudW1iZXJzLCBhbmQgaW5kZXggbnVtYmVycyAKLShiZWdpbm5pbmcgZnJvbSAxKS4gSW4gdGhlIG90aGVyIHR3byB2aWV3cywgYmFycmllcnMgYXJlIHJlZmVycmVkIHRvIGFjY29yZGluZyB0bwotdGhlaXIgaW5kZXggbnVtYmVycyAoZS5nLiwgdGhlIGJhcnJpZXIgd2l0aCBpbmRleCBudW1iZXIgMSBpcyBjYWxsZWQgCi0iYmFycmllciAxIikuCi08cD5UbyBmaW5kIHRoZSBzb3VyY2UgY29kZSBsaW5lIGZvciBhIGJhcnJpZXIgaW4gdGhlIHZpZXcsIGRvdWJsZS1jbGljayBvbiB0aGUgbGluZQotaW4gdGhlIHZpZXcsIGFuZCB0aGUgZWRpdG9yIHdpbGwgb3BlbiBvbiB0aGF0IHNvdXJjZSBmaWxlIChpZiBub3QgYWxyZWFkeSBvcGVuZWQpIGFuZAotaXQgd2lsbCBzY3JvbGwgdG8gdGhlIGxpbmUgY29udGFpbmluZyB0aGUgYmFycmllci48L3A+Ci08cD4gCi08aW1nIHNyYz0iaW1hZ2VzL0JhcnJpZXJWaWV3LmdpZiI+Ci08YnI+Ci08aDIgaWQ9ImJhck1hdGNoIj5CYXJyaWVyIE1hdGNoZXMgVmlldyA8L2gyPgotPHA+QnkgcnVubmluZyB0aGUgYW5hbHlzaXMsIHdlIHdpbGwgc2hvdyB0d28ga2luZHMKLW9mIHJlc3VsdHM6IAotCi08b2w+Ci08bGk+Ci1Gb3IgZWFjaCBiYXJyaWVyIGIsIGFsbCBiYXJyaWVycyB0aGF0IG1hdGNoIHRvIGIgYXJlIHNob3duLiA8L2xpPgotPGxpPgotQmFycmllciBzeW5jaHJvbml6YXRpb24gZXJyb3JzIGFyZSBzaG93biwgaWYgYW55LiA8L2xpPgotPC9vbD4KLTxwPlRoZSBtYXRjaGluZyBzZXRzIGFyZSBzaG93biBpbiB0aGUgPGI+QmFycmllciBNYXRjaGVzPC9iPiB2aWV3LiAKLVRoZXkgYXJlIGdyb3VwZWQgaW4gdGhpcyB2aWV3IGFzIGEgdHJlZSB2aWV3IHdpdGggInBhcmVudCIgbm9kZXMgYW5kICJjaGlsZCIgbm9kZXMuCi1UaGUgbWF0Y2hpbmcgc2V0IG9mIGEgYmFycmllciBjb250YWlucyBhbGwgYmFycmllcnMgdGhhdAotc3luY2hyb25pemUgd2l0aCBpdCBhdCBydW4gdGltZS4gVGhhdCBpcywgYWxsIHByb2Nlc3NlcyBpbiB0aGUgTVBJIHByb2dyYW0gbXVzdCBhcnJpdmUKLWF0IG9uZSBvZiB0aGUgYmFycmllciBzdGF0ZW1lbnRzIGluIGEgbWF0Y2hpbmcgc2V0LCBiZWZvcmUgYW55IG9mIHRoZSBwcm9jZXNzZXMgY2FuIHByb2NlZWQuCi1Gb3IgZWFjaCBiYXJyaWVyIHN0YXRlbWVudCBpbiB0aGUgcHJvZ3JhbSBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgYW5hbHl6ZWQsIGEgbWF0Y2hpbmcgc2V0IGlzIGNhbGN1bGF0ZWQgYW5kIHNob3duLiAgCi1TbyBmb3IgYSBtYXRjaGluZyBzZXQKLXdpdGggdHdvIG1lbWJlcnMsIHRoaXMgdmlldyB3aWxsIHNob3cgYm90aCBhIG1hdGNoaW5nIHNldCB3aXRoIHRoZSBmaXJzdCBiYXJyaWVyIGFzIHRoZSBwYXJlbnQsCi1hbmQgYW5vdGhlciBtYXRjaGluZyBzZXQgd2l0aCB0aGUgc2Vjb25kIGJhcnJpZXIgYXMgdGhlIHBhcmVudC4KLVRoZSBwYXJlbnQgYmFycmllciBub2RlIGluIHRoZSB2aWV3IHNob3dzIHRoZSBzaXplIG9mIGl0cyBtYXRjaGluZyBzZXQgaW4gcGFyZW50aGVzZXMuCi08cD4KLU5vdGUgdGhhdCBpZiBhIG1hdGNoaW5nIGVycm9yIG9jY3VycyBpbiBhIHN0YXRlbWVudCwgIAotdGhlbiBiYXJyaWVycyB1c2VkIGluIHRoaXMgc3RhdGVtZW50IDxpPm1pZ2h0PC9pPiBoYXZlIGFuIGVtcHR5IG1hdGNoaW5nIHNldCAodGhleSA8aT5taWdodDwvaT4KLXN0aWxsIGhhdmUgYSBub24tZW1wdHkgbWF0Y2hpbmcgc2V0IGlmIHRoZXkgYXJlIGFsc28gdXNlZCBpbiBvdGhlciBwb3J0aW9ucyBvZiB0aGUKLXByb2dyYW0pLiBUaGlzIGlzIG9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBvdXIgYW5hbHlzaXM6IGlmIGFuIGVycm9yIG9jY3Vycywgb3VyCi1hbmFseXNpcyBjYW4gInJlY292ZXIiIGZyb20gc3VjaCBhbiBlcnJvciBieSBjb250aW51aW5nIHRvIGFuYWx5emUgb3RoZXIgcG9ydGlvbnMgb2YgCi10aGUgcHJvZ3JhbSB0aGF0IGFyZSBub3QgYWZmZWN0ZWQgYnkgc3VjaCBlcnJvci4KLTwvcD4KLTxwPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIG1hdGNoaW5nIHNldCBmb3IgIkJhcnJpZXIgMSIgCi0odGhlIGJhcnJpZXIgc2V0IGhpZ2hsaWdodCBpbiBibHVlIGJlbG93KSBjb250YWlucyB0d28gKDIpIGJhcnJpZXJzLgotVGhlIGZpcnN0IGlzIGluIHRoZSA8Y29kZT5iYXJyaWVyKCk8L2NvZGU+IGZ1bmN0aW9uIGFuZCB0aGUgc2Vjb25kIGlzIGluIHRoZSAKLTxjb2RlPm1haW4oKTwvY29kZT4gZnVuY3Rpb24uCi08L3A+Ci08cD5MaWtlIHRoZSBvdGhlciB2aWV3cywgdG8gZmluZCBhIGJhcnJpZXIgc291cmNlIGNvZGUgbGluZSBmcm9tIHRoZSB2aWV3LCBkb3VibGUtY2xpY2sgb24gdGhlCi1saW5lIGluIHRoZSB2aWV3LiAgQmFycmllciBtYXJrZXJzIGFyZSBzaG93biBpbiB0aGUgbWFya2VyIGJhciBvZiB0aGUgZWRpdG9yIHRvIHBpbnBvaW50IHRoZQotYmFycmllciBzdGF0ZW1lbnRzIGZvdW5kLgotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvQmFycmllck1hdGNoaW5nU2V0Vmlldy5naWYiPgotCi08aDIgaWQ9ImJhckVycm9yIj5CYXJyaWVyIEVycm9ycyBWaWV3IDwvaDI+Ci08cD5XaGVuIGEgYmFycmllciBlcnJvciBpcyBkZXRlY3RlZCwgaXQgaXMgaGlnaGxpZ2h0ZWQgaW4KLXRoZSBlZGl0b3IgaW4gcmVkLiBJbiBhZGRpdGlvbiwgdGhlIEJhcnJpZXIgRXJyb3JzIHZpZXcgc2hvd3MgYSBjb3VudGVyIGV4YW1wbGUgd2hpY2ggY29udGFpbnMgCi10d28gc2VxdWVuY2VzIG9mIGJhcnJpZXJzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGFsb25nIHR3bwotcGF0aHMgc3RhcnRpbmcgZnJvbSB0aGUgaGlnaGxpZ2h0ZWQgZXJyb3IgcG9zaXRpb24uIFRoaXMgY291bnRlciBleGFtcGxlCi1zaW11bGF0ZXMgYW4gZXhlY3V0aW9uIGFuZCBpbGx1c3RyYXRlcyB0aGUgcmVhc29uIGZvciB0aGUgCi1zeW5jaHJvbml6YXRpb24gZXJyb3IuIE5vdGUgdGhhdCBhIHN5bmNocm9uaXphdGlvbiBlcnJvciBvY2N1cnMgaWYgZGlmZmVyZW50IAotTVBJIHRhc2tzIG1lZXQgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGJhcnJpZXJzLiAgSWYgYSBiYXJyaWVyIGIgaXMgaW4gYSBsb29wLCBhbmQKLWFsbCB0YXNrcyBleGVjdXRlIHRoZSBzYW1lIG51bWJlciBvZiBpdGVyYXRpb25zLCB0aGVuIGJhcnJpZXIgYiBpcyBtYXJrZWQgYnkgCi0iKiIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN0YXRpYyBiYXJyaWVyIGluIHRoZSBjb3VudGVyIGV4YW1wbGUgcmVwcmVzZW50cyBhIAotZHluYW1pYyBudW1iZXIgb2YgYmFycmllcnMgYXQgcnVudGltZS4gSWYgYSBzeW5jaHJvbml6YXRpb24gZXJyb3Igb2NjdXJzIAotb24gYSBsb29wIChpLmUuLCBkaWZmZXJlbnQgdGFza3Mgd2lsbCBleGVjdXRlIGEgZGlmZmVyZW50IG51bWJlciBvZiBpdGVyYXRpb25zIAotb2Ygc3VjaCBsb29wKSwgdGhlbiB3ZSBzaG93IHRoZSBjb3VudGVyIGV4YW1wbGUgYXMgdGhlIHNlcXVlbmNlIG9mIGJhcnJpZXJzCi1pbiB0aGUgbG9vcCBib2R5LiAKLTxicj48c2NyaXB0PiB0aHVtYigiaW1hZ2VzL2JhcnJpZXJFcnJvclZpZXcuZ2lmIiwzMDApPC9zY3JpcHQ+Ci08cD5JZiBhIGZpbGVuYW1lIGFuZCBMaW5lTm8gYXJlIHNob3duLCBkb3VibGUtY2xpY2sgb24gdGhhdCBsaW5lIGluCi10aGUgQmFycmllciBFcnJvcnMgdmlldyB0byBsb2NhdGUgdGhhdCBCYXJyaWVyIG9yIGVycm9yLgotVGhlIGluaXRpYWwgRXJyb3IgbGluZSBpbiB0aGUgdmlldyBzaG91bGQgcG9pbnQgdG8gdGhlIHBvaW50IGluIHRoZSBwYXRoIG9mCi1leGVjdXRpb24gdGhhdCBmb3JrcyAoc3VjaCBhcyBhbiBpZiBzdGF0ZW1lbnQpIHN1Y2ggdGhhdCBvbmUgcGF0aCBlbmNvdW50ZXJzIAotYSBiYXJyaWVyIHRoYXQgdGhlIG90aGVyIHBhdGggZG9lcyBub3QuCi08cD4KLVRvIHNob3cgdGhlIHBhdGggb2YgYSBjb3VudGVyZXhhbXBsZSAoZS5nLiBhIHBhdGggd2l0aG91dCBiYXJyaWVycyksCi1kb3VibGUtY2xpY2sgb24gdGhlIFBhdGggbGluZSBpbiB0aGUgdmlldywgYXMgc2hvd24gYmVsb3cuIElmIHRoZXJlCi1pcyBhIHBhdGggYXZhaWxhYmxlIGl0IHNob3VsZCBiZSBzaG93bi4KLTxicj48c2NyaXB0PiB0aHVtYigiaW1hZ2VzL2JhcnJpZXJQYXRoU2VsZWN0aW9uLnBuZyIsMzUwKTwvc2NyaXB0PgotCi0KLTxoMz5TYW1wbGUgcHJvZ3JhbSB0ZXN0TVBJYmFycmllci5jIDwvaDM+Ci08cD4gV2UgdXNlIHRoaXMgc2ltcGxlIHByb2dyYW0gPGEgaHJlZj0ic2FtcGxlcy90ZXN0TVBJYmFycmllci5jIj50ZXN0TVBJYmFycmllci5jPC9hPiAKLXRvIGlsbHVzdHJhdGUgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgdGhlCi1hbmFseXNpcyBhbmQgdGhyZWUgdmlld3MuIAotVGhlIGNvZGUgaXMgY29uZGVuc2VkIGhlcmU6Ci08cHJlPgotICAgIGlmIChteV9yYW5rICE9MCl7Ci0JCS4uLgotCQlNUElfU2VuZCguLi4pOwotCQlNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7Ci0JfQotCWVsc2V7Ci0JCWZvciAoc291cmNlID0gMTsgc291cmNlIDwgcDsgc291cmNlKyspIHsKLQkJCU1QSV9SZWN2KC4uLik7Ci0JCX0KLQkJYmFycmllcigpOwotCX0KLQlpZihteV9yYW5rID09IDApewotCQlNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7Ci0JfQotCWVsc2V7Ci0JICAgIHByaW50ZigidGhpcyBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYSBiYXJyaWVyXG4iKTsKLQl9Ci0JCi0JaWYoeCA8IDMpewotCQkuLi4KLQkJTVBJX0JhcnJpZXIoTVBJX0NPTU1fV09STEQpOwotCX0KLQkKLQl3aGlsZSh4IDwgbXlfcmFuayl7Ci0JCU1QSV9CYXJyaWVyKE1QSV9DT01NX1dPUkxEKTsKLQkJeCArKzsKLQl9Ci08L3ByZT4KLVRoZXJlIGFyZSB0aHJlZSBicmFuY2hlcyBhbmQgb25lIGxvb3AgaW4gdGhlIHByb2dyYW0uCi1UaGUgZmlyc3QgYnJhbmNoICggdGhlIDxjb2RlPmlmKCBteV9yYW5rIT0wKTwvY29kZT4gc3RhdGVtZW50ICkgaXMgZnJlZSBvZiBzeW5jaHJvbml6YXRpb24gCi1lcnJvcnM7IHR3byBiYXJyaWVycyAob25lIGVuY29kZWQgZGlyZWN0bHkgaW4gCi10aGUgbG9vcCwgCi1hbmQgdGhlIG90aGVyIGluIHRoZSBiYXJyaWVyKCkgZnVuY3Rpb24gY2FsbGVkIGluIHRoZSBlbHNlIGNsYXVzZSkgbWF0Y2ggdG8gZWFjaCBvdGhlci4gCi1UaGUgc2Vjb25kIGJyYW5jaCAoPGNvZGU+aWYobXlfcmFuayA9PSAwKTwvY29kZT4pCi1jb250YWlucyBhbiBlcnJvciBiZWNhdXNlIHNvbWUgdGFza3Mgd291bGQgZXhlY3V0ZSB0aGUgYmFycmllciBpbiBpdCwgd2hpbGUgdGhlCi1vdGhlciB0YXNrcyB3b3VsZCBza2lwIGl0LiBUaGUgZWxzZSBjbGF1c2UgaGVyZSBpcyBhZGRlZCBmb3IgZW1waGFzaXMuCi1UaGUgbmV4dCBicmFuY2ggKDxjb2RlPmlmKHg8Myk8L2NvZGU+KSBkb2VzIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gcHJvY2Vzc29yCi1yYW5rICh4IGRvZXMgbm90IGRlcGVuZCBvbiByYW5rKSBzbyBwcm9jZXNzZXMgc2hvdWxkIHByb2NlZWQgc2ltaWxhciB0byBlYWNoIG90aGVyLgotVGhlIGxvb3AgKDxjb2RlPndoaWxlKHggPCBteV9yYW5rKTwvY29kZT4pCi1jb250YWlucyBhbiBlcnJvciBhbHNvLCBzaW5jZSBkaWZmZXJlbnQgCi10YXNrcyBtYXkgZXhlY3V0ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgaXRlcmF0aW9ucywgYW5kIHRodXMgZW5jb3VudGVyIGEgZGlmZmVyZW50IG51bWJlciBvZgotYmFycmllcnMuCi08aDM+UmVtb3ZpbmcgQmFycmllciBNYXJrZXJzPC9oMz4KLTxwPlRvIHJlbW92ZSBiYXJyaWVyIG1hcmtlcnMsIHNpbXBseSBydW4gYmFycmllciBhbmFseXNpcyBvbiBhbnkgZmlsZSB3aXRob3V0IGJhcnJpZXIgZXJyb3JzIChldmVuIGEgdHJpdmlhbCBub24tc291cmNlIGZpbGUpLgotIDwhLS0gc2luY2UgdGhpcyBjb2RlIGlzbid0IGluY2x1ZGVkLCBkb24ndCByZWZlciB0byBpdCBoZXJlICAKLTxoMz4gTVBCIDwvaDM+Ci08cD5NUEIgaXMgYSBzY2llbnRpZmljIGFwcGxpY2F0aW9uIHdoaWNoIGNvbXB1dGVzIHRoZSBlbGVjdHJvbWFnbmV0aWMgbW9kZWwgdXNpbmcKLW1heHdlbGwgZXF1YXRpb25zLiBXZSB1c2UgdGhpcyBleGFtcGxlIHRvIHNob3cgdGhlIGZvbGxvd2luZyBwb2ludHM6Ci08cD4oMSkgT3VyIGFuYWx5c2lzIGhhcyBpbnRlci1wcm9jZWR1cmFsIGFuYWx5c2lzLiBUaGlzIG1ha2VzIG91ciBhbmFseXNpcyB0b29sIAotb3V0cGVyZm9ybSBwcmV2aW91cyBpbnRyYS1wcm9jZWR1cmFsIGFuYWx5c2lzIGFsZ29yaXRobXMuCi08cD4oMikgVHJ5IHRoaXMgdG8gc2hvdyB0aGUgbmVjZXNzaXR5IGFuZCBlZmZlY3RpdmVuZXNzIG9mIHRoZSBpbnRlci1wcm9jZWR1cmFsIAotYW5hbHlzaXMuIEluIHRoZSBvcmlnaW5hbCBjb2RlLCB0aGVyZSBhcmUgdGhyZWUgYmFycmllcnM6IHR3byBpbiBmdW5jdGlvbiAKLW1hdHJpeGlvX2NyZWF0ZV9zdWIoKSwgYW5kIG9uZSBpbiBtYXRyaXhpb19jcmVhdGVfZGF0YXNldCgpLiBPYnZpb3VzbHkgdHdvIGJhcnJpZXJzCi1pbiBtYXRyaXhpb19jcmVhdGVfc3ViKCkgbWF0Y2ggdG8gZWFjaCBvdGhlci4gTm93IGNvbW1lbnQgb3V0ICJiYXJyaWVyIDEiICh0aGUgb25lIAotaW4gdGhlIHRoZW4gY2xhdXNlIG9mIHRoZSBpZi1icmFuY2ggaW4gbWF0cml4aW9fY3JlYXRlX3N1YigpKSwgYWRkIGEgYmFycmllciBpbiBmdW5jdGlvbgotbXBpX2lzX21hc3RlcigpLCByaWdodCBhZnRlciB0aGUgTVBJX0NvbW1fcmFuayBjYWxsLCB0aGVuIHJ1biB0aGUgYW5hbHlzaXMuCi1PbmUgbWF5IGV4cGVjdCBhIHN5bmNocm9uaXphdGlvbiBlcnJvciBpbiB0aGlzIGJyYW5jaCwgaG93ZXZlciBpdCBpcyBzdGlsbCBlcnJvciBmcmVlLCAKLXNpbmNlIHRoZSBmdW5jdGlvbiBtYXRyaXhpb193cml0ZV9zdHJpbmdfYXR0cigpIHdpbGwgY2FsbCBtcGlfaXNfbWFzdGVyKCkgc29tZXdoZXJlLgotKG1hdHJpeGlvX3dyaXRlX3N0cmluZ19hdHRyIGNhbGxzICB3cml0ZV9hdHRyIHdoaWNoIGNhbGxzIG1waV9pc19tYXN0ZXIpCi0KLTxoMz4gVGNnbXNnIDwvaDM+Ci0KLVRjZ21zZyBpcyBhbiBNUEkgdG9vbGtpdC4gQXMgd2l0aCB0aGUgTVBCIGFwcGxpY2F0aW9uLCB3ZSB1c2UgaXQgdG8gZGVtb25zdHJhdGUgdGhlIGludGVyLXByb2NlZHVyYWwKLWFuYWx5c2lzLiBUaGVyZSBhcmUgc29tZSBpbnRlcmVzdGluZyBwb2ludHMgaW4gdGhlIGZ1bmN0aW9uIHRlc3RfbWFpbigpOgotCi0oMSkgQXQgdGhlIGJlZ2lubmluZyBvZiB0ZXN0X21haW4oKSwgdGhlIG1hc3RlciB0aHJlYWQgcmVhZHMgYSBwYXJhbWV0ZXIgIm9wdCIKLWZyb20gc3Rkb3V0ICh0aGUgZmlyc3Qgd2hpbGUgbG9vcCksIGFuZCBicm9hZGNhc3RzIGl0IHRvIG90aGVyIHRocmVhZHMgCi0oYnkgQlJEQ1NUXykgc28gdGhhdCB0aGV5IG9idGFpbiB0aGUgc2FtZSAib3B0Ii4gQWxsIHRocmVhZHMgdGhlbiBjaG9vc2UgCi1zb21lIGpvYiB0byBkbyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mICJvcHQiLiBObyBzeW5jaHJvbml6YXRpb24gb2NjdXJzIGluIHRoZSBvcmlnaW5hbAotY29kZS4gSWYgdGhlIG1hc3RlciB0aHJlYWQgZG9lc24ndCBicm9hZGNhc3QgdGhlICJvcHQiIHZhbHVlLCB0aGVuIGRpZmZlcmVudCBwcm9jZXNzb3JzCi13aWxsIGNob29zZSBkaWZmZXJlbnQgam9icywgYW5kIGFuIGVycm9yIG9jY3VycyAobm8gYmFycmllciBhcmUgdXNlZCBpbiBjYXN0IDAtNCwgd2hpbGUKLXNvbWUgYmFycmllcnMgYXJlIHVzZWQgaW4gY2FzZSA1KS4KLQotKDIpIFRoaXMgcHJvZ3JhbSBhbHNvIGlsbHVzdHJhdGVzIGhvdyBlcnJvcnMgKGFuZCBjb3VudGVyIGV4YW1wbGVzKSBhcmUgcmVwb3J0ZWQgZm9yCi10aGUgInN3aXRjaCIgc3RhdGVtZW50LiBCcmllZmx5LCB3ZSB3aWxsIG9ubHkgc2hvdyB0aGUgImZpcnN0IiBlcnJvciwgaS5lLiwgaWYKLXRoZSBzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zIG4gY2FzZXMsIHdlIHdpbGwgYWx3YXlzIGJlZ2luIGZyb20gdGhlIGZpcnN0IHR3byBjYXNlcywgCi1hbmQgbW92ZSB0byB0aGUgbmV4dCBjYXNlIE9OTFkgSUYgdGhlIGZpcnN0IHR3byBjYXNlcyBhcmUgZXJyb3ItZnJlZS4gVG8gdGVzdCBpdCwgaWYKLXdlIGFkZCBhIGJhcnJpZXIgaW4gY2FzZSAwIGNsYXVzZSwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkLCBhbmQgb25lIHBhdGgKLWluIHRoZSBjb3VudGVyIGV4YW1wbGUgY29udGFpbnMgMSBiYXJyaWVyICh0aGUgYmFycmllciB3ZSd2ZSBqdXN0IGFkZGVkIGluKSwgYW5kIHRoZQotb3RoZXIgcGF0aCBjb250YWlucyBubyBiYXJyaWVyIChjYXNlIDEgY2xhdXNlKS4KLS0tPgotCi08cD4mbmJzcDsKLTxwPiZuYnNwOwotPHA+Jm5ic3A7Ci0KLTxwPjxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFBMRFQgSGVscCBUYWJsZSBvZiBDb250ZW50czwvYT4KLTxwPiZuYnNwOwotPHA+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2hlbHAuY3NzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2hlbHAuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjA5ZjkwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9oZWxwLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLw0KLQ0KLQ0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBwLCB0YWJsZSwgdGQsIGNhcHRpb24sIHRoLCB1bCwgb2wsIGRsLCBsaSwgZGQsIGR0IHtmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IGNvbG9yOiAjMDAwMDAwfQ0KLXByZQkJCQl7IGZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2V9DQotDQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi0vKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8NCi1ib2R5LCBoMSwgaDIsIGgzLCBoNCwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1zaXplOiAxMHB0OyB9DQotcHJlCQkJCXsgZm9udC1zaXplOiAxMHB0fQ0KLQ0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovDQotDQotYm9keQkgICAgIHsgYmFja2dyb3VuZDogI0ZGRkZGRn0NCi1oMSAgICAgICAgICAgeyBmb250LXNpemU6IDE4cHQ7IG1hcmdpbi10b3A6IDU7IG1hcmdpbi1ib3R0b206IDEgfQkNCi1oMiAgICAgICAgICAgeyBmb250LXNpemU6IDE0cHQ7IG1hcmdpbi10b3A6IDI1OyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oMyAgICAgICAgICAgeyBmb250LXNpemU6IDExcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oNCAgICAgICAgICAgeyBmb250LXNpemU6IDEwcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzOyBmb250LXN0eWxlOiBpdGFsaWMgfQ0KLXAgCSAgICAgeyBmb250LXNpemU6IDEwcHQ7IH0NCi1wcmUJICAgICB7IG1hcmdpbi1sZWZ0OiA2OyBmb250LXNpemU6IDlwdCB9DQotDQotYTpsaW5rIHsgY29sb3I6ICMwMDY2OTkgfQ0KLWE6dmlzaXRlZCB7IGNvbG9yOiAjOTk2Njk5IH0NCi1hOmhvdmVyICB7IGNvbG9yOiAjMDA2Njk5IH0NCi0NCi11bAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWxpCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gDQotbGkgcAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IA0KLW9sCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotZGwJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1kdAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KLWRkCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0NCi1zdHJvbmcJICAgICB7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KLWVtCSAgICAgeyBmb250LXN0eWxlOiBpdGFsaWN9DQotdmFyCSAgICAgeyBmb250LXN0eWxlOiBpdGFsaWN9DQotZGl2LnJldmlzaW9uIHsgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkOyBib3JkZXItbGVmdC13aWR0aDogdGhpbjsgDQotCQkJCSAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOyBwYWRkaW5nLWxlZnQ6NSB9DQotdGgJICAgICB7IGZvbnQtd2VpZ2h0OiBib2xkIH0NCi0NCi0vKiBNaWtlIEJlaG0ncyBhZGRpdGlvbiB0byB0aGUgc3R5bGUgc2hlZXQgKi8NCi0udXNlcmlucHV0IHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgfQ0KLS5ndWl0YWIsIC5pbXBvcnRhbnQsIC5ndWlidXR0b24sIC5zZWxlY3RibHVlLCAuZ3VpbWVudSwgLmd1aWxhYmVsLCANCi0ubm90ZXRpdGxlICB7DQotICAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgIGZvbnQtZmFtaWx5OiBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOw0KLSAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgICB9DQotZGl2LmxpbnV4ICB7ZGlzcGxheTpub25lO30NCi0uZmlyc3Rlcm0ge2ZvbnQtc3R5bGU6aXRhbGljO30NCi0NCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL0JhcnJpZXJNYXRjaGluZ1NldFZpZXcuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9CYXJyaWVyTWF0Y2hpbmdTZXRWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjZDkzNi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL0JhcnJpZXJNYXRjaGluZ1NldFZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9CYXJyaWVyVmlldy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL0JhcnJpZXJWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMjQwYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL0JhcnJpZXJWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvYW5hbHl6ZS5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2FuYWx5emUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ1NDJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvYW5hbHl6ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXIuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhOTc2MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyQWN0aW9uQW5uLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvYmFycmllckFjdGlvbkFubi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTMyMDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyQWN0aW9uQW5uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvYmFycmllckVycm9yVmlldy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXJFcnJvclZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdiOGYwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvYmFycmllckVycm9yVmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXJFcnJvcnMuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyRXJyb3JzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0OWMwYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXJFcnJvcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyTWF0Y2hlcy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXJNYXRjaGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkZTQ2Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2JhcnJpZXJNYXRjaGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvYmFycmllclBhdGhTZWxlY3Rpb24ucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyUGF0aFNlbGVjdGlvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmQzYzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9iYXJyaWVyUGF0aFNlbGVjdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2NsZWFyTWFya2Vycy5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2NsZWFyTWFya2Vycy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZGVkNTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9jbGVhck1hcmtlcnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9jb250ZW50QXNzaXN0LmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvY29udGVudEFzc2lzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWQzZmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9jb250ZW50QXNzaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaGVhZGVyT01QLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaGVhZGVyT01QLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4MTI5Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hlYWRlck9NUC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hlbHBDb250U2Vucy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hlbHBDb250U2Vucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDViNDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9oZWxwQ29udFNlbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9oZWxwQ29udFNlbnNIaXRGMS5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hlbHBDb250U2Vuc0hpdEYxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljYTlhYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hlbHBDb250U2Vuc0hpdEYxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaGVscENvbnRTZW5zSGl0RjFjbGljay5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hlbHBDb250U2Vuc0hpdEYxY2xpY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM3OGZlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaGVscENvbnRTZW5zSGl0RjFjbGljay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2hvdmVyLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaG92ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRlM2M2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaG92ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9pbmNsdWRlLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvaW5jbHVkZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODk2N2IuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9pbmNsdWRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbGliLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbGliLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmM2RkZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL2xpYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21ha2VmaWxlUHJvalByb3BzLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbWFrZWZpbGVQcm9qUHJvcHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc1ZmRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbWFrZWZpbGVQcm9qUHJvcHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tYWtlZmlsZVByb2plY3QucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tYWtlZmlsZVByb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MwNDIzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbWFrZWZpbGVQcm9qZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbWVudVNob3dPcGVuTVBhcnRpZmFjdHMuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tZW51U2hvd09wZW5NUGFydGlmYWN0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YmEwM2IuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tZW51U2hvd09wZW5NUGFydGlmYWN0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21lbnVTaG93VVBDYXJ0aWZhY3RzLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbWVudVNob3dVUENhcnRpZmFjdHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzRmNDlhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbWVudVNob3dVUENhcnRpZmFjdHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlCdWlsZENvbW1hbmQucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlCdWlsZENvbW1hbmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjRkODIzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpQnVpbGRDb21tYW5kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpQnV0dG9ucy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waUJ1dHRvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWFhMGU1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpQnV0dG9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waU1lbnUucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlNZW51LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyZWVhMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waU1lbnUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlOZXdQcm9qZWN0V29ya2JlbmNoLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpTmV3UHJvamVjdFdvcmtiZW5jaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmVmZTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlOZXdQcm9qZWN0V29ya2JlbmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpUHJlZnNIYXZlTm90QmVlblNldC5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVByZWZzSGF2ZU5vdEJlZW5TZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZkNDE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpUHJlZnNIYXZlTm90QmVlblNldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVRlbXBsYXRlcy5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVRlbXBsYXRlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmE2ZDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlUZW1wbGF0ZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlUZW1wbGF0ZXNNb2QucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlUZW1wbGF0ZXNNb2QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzEyNmRhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpVGVtcGxhdGVzTW9kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpVmlld0Fubi5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVZpZXdBbm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2VlOWQ0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpVmlld0Fubi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVdpemFyZC5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVdpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTViYmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlXaXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlXaXphcmQyLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpV2l6YXJkMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjM2ZGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9tcGlXaXphcmQyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpV2l6YXJkMy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL21waVdpemFyZDMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWVlZjA4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbXBpV2l6YXJkMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL25ld1Byb2pPcGVuTVAuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9uZXdQcm9qT3Blbk1QLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3MGZhYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL25ld1Byb2pPcGVuTVAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9uZXdQcm9qT3Blbk1Qc2V0dGluZ3MuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9uZXdQcm9qT3Blbk1Qc2V0dGluZ3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjI2MGI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvbmV3UHJvak9wZW5NUHNldHRpbmdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvb21wQ29tcGlsZXJPcHQucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9vbXBDb21waWxlck9wdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTEwZmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9vbXBDb21waWxlck9wdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL29wZW5tcEFydGlmYWN0c2ZvdW5kLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvb3Blbm1wQXJ0aWZhY3RzZm91bmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRiYmUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvb3Blbm1wQXJ0aWZhY3RzZm91bmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9vcGVubXBQcmVmcy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL29wZW5tcFByZWZzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5OTliNi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL29wZW5tcFByZWZzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcGxkdC1tZW51LnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcGxkdC1tZW51LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNjNlZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3BsZHQtbWVudS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3BsZHQtcHJlZnMxLnBuZyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcGxkdC1wcmVmczEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdhMWRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcGxkdC1wcmVmczEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9wbGR0SWNvbk1pc3BsYWNlZC5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3BsZHRJY29uTWlzcGxhY2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhNjU1Yi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3BsZHRJY29uTWlzcGxhY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcHRwLW9wZW5NUHByYWdtYUFubi5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3B0cC1vcGVuTVBwcmFnbWFBbm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRkMDU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcHRwLW9wZW5NUHByYWdtYUFubi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3B0cC1vcGVuTVBwcm9ibGVtcy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3B0cC1vcGVuTVBwcm9ibGVtcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTdjYWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9wdHAtb3Blbk1QcHJvYmxlbXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9wdHAtb3Blbk1Qc2hvd0NvbmN1cnJlbmN5LmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcHRwLW9wZW5NUHNob3dDb25jdXJyZW5jeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzAxMzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9wdHAtb3Blbk1Qc2hvd0NvbmN1cnJlbmN5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvcHRwLW9wZW5NUHNob3dDb25jdXJyZW5jeW1lbnUuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9wdHAtb3Blbk1Qc2hvd0NvbmN1cnJlbmN5bWVudS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTZjODAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy9wdHAtb3Blbk1Qc2hvd0NvbmN1cnJlbmN5bWVudS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY0FydGlmYWN0cy5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY0FydGlmYWN0cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNTRjN2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy91cGNBcnRpZmFjdHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy91cGNQcmVmcy5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY1ByZWZzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyZDY3NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY1ByZWZzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvdXBjUHJvcGVydGllcy5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY1Byb3BlcnRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI0YTA3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvdXBjUHJvcGVydGllcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY19lZGl0b3JBbmRBcnRpZmFjdHMucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy91cGNfZWRpdG9yQW5kQXJ0aWZhY3RzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YmE4Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3VwY19lZGl0b3JBbmRBcnRpZmFjdHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy91cGNfZWRpdG9yVnNBcnRpZmFjdHMucG5nIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy91cGNfZWRpdG9yVnNBcnRpZmFjdHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODUyMDBkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvdXBjX2VkaXRvclZzQXJ0aWZhY3RzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvd2VsY29tZUMtcGxkdC5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3dlbGNvbWVDLXBsZHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDI3ZGNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9pbWFnZXMvd2VsY29tZUMtcGxkdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3dlbGNvbWVPdmVydmlldy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvaW1hZ2VzL3dlbGNvbWVPdmVydmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjczMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL2ltYWdlcy93ZWxjb21lT3ZlcnZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL21waVRlbXBsYXRlcy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL21waVRlbXBsYXRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTMzNWEyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9tcGlUZW1wbGF0ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPk1QSSBUZW1wbGF0ZXM8L3RpdGxlPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMSBpZD0idG9wIj4gPGltZyBzcmM9ImltYWdlcy9hbmFseXplLmdpZiI+IE1QSSAgVGVtcGxhdGVzPC9oMT4KLTxwPlRvIGVhc2Ugd2l0aCBjb21tb24gcGF0dGVybnMgb2YgTVBJIHByb2dyYW1taW5nLCBjb2RlIHRlbXBsYXRlcyBhcmUgcHJvdmlkZWQgZm9yCi1hIHNtYWxsIG51bWJlciBvZiBwYXR0ZXJucy4gIE1vcmUgY2FuIGJlIGVhc2lseSBhZGRlZC4KLTxwPlRoaXMgYWxsb3dzIHF1aWNrIGVudHJ5IG9mIGNvbW1vbiBwYXR0ZXJucyBpbiBNUEkgcHJvZ3JhbW1pbmcuCi08cD5Gb3IgZXhhbXBsZSwgZm9yIE1QSSBzZW5kLXJlY2VpdmUsCi08dWw+Ci08bGk+RWRpdCBhIEMgc291cmNlIGNvZGUgZmlsZSBpbiB0aGUgQ0RUIGVkaXRvci4KLTxsaT5FbnRlcjogIDxjb2RlPm1waXNyPC9jb2RlPiBhbmQgaGl0IEN0cmwtc3BhY2UKLTxicj5Ob3RlOiBPbiBNYWMsIHlvdSBtYXkgbmVlZCB0byBoaXQgQ3RybC1zcGFjZSB0d2ljZS4KLTwvbGk+Ci08bGk+U2VsZWN0IHRoZSB0ZW1wbGF0ZSB5b3Ugd2FudCAobXBpc3IgaXMgcHJvYmFibHkgdGhlIG9ubHkgb25lKSBhbmQgaGl0IEVudGVyLiBUaGlzIGV4cGFuZHMgdG8gdGhlIGZvbGxvd2luZzoKLQotPHA+PGltZyBzcmM9ImltYWdlcy9tcGlUZW1wbGF0ZXMucG5nIj4KLTwvdWw+Ci08cD5UeXBlIG92ZXIgYW55IG9mIHRoZSBpbmNsdWRlZCBzYW1wbGUgdmFyaWFibGUgbmFtZXMsIGFuZCBhbGwgb2NjdXJyZW5jZXMgb2YgdGhhdCBuYW1lIHdpdGhpbiB0aGUgdGVtcGxhdGUgY29kZSB3aWxsCi1iZSBjaGFuZ2VkIGFjY29yZGluZ2x5LgotPHA+T25lIG90aGVyIHBhdHRlcm4gaXMgYWxzbyBpbmNsdWRlZC4gIFR5cGUgIDxjb2RlPm1waWlmPC9jb2RlPiBhbmQgaGl0IEN0cmwtc3BhY2UKLXRvIHNlZSBpbml0aWFsaXplIGFuZCBmaW5hbGl6ZSBBUEkgY2FsbHMuCi08cD5UbyBzZWUgdGhlIGNvZGUgdGVtcGxhdGVzLCBhbmQgYWRkIHlvdXIgb3duOgotPHVsPgotPGxpPkJyaW5nIHVwIEVjbGlwc2UgcHJlZmVyZW5jZXMgKFdpbmRvd3MvTGludXg6IFdpbmRvdyA+IFByZWZlcmVuY2VzOyAgTWFjOiAgRWNsaXBzZSA+IFByZWZlcmVuY2VzKQotPGxpPk9wZW4gQy9DKyssIEVkaXRvciwgVGVtcGxhdGVzCi08L2xpPgotPGxwPgotPGltZyBzcmM9ImltYWdlcy9tcGlUZW1wbGF0ZXNNb2QucG5nIj48L2xwPgotPGxpPlRoZSBzYW1wbGUgZm9yIE1QSSBTZW5kIFJlY2VpdmUgaXMgc2hvd24uICBZb3UgY2FuIGFkZCB5b3VyIG93biBvciBtb2RpZnkgYW55IHlvdSBsaWtlLgotCi08L3VsPgotPHA+SWYgeW91IGhhdmUgaWRlYXMgZm9yIG1vcmUgTVBJIChvciBvdGhlcikgdGVtcGxhdGVzLCBwbGVhc2UgY29uc2lkZXIgY29udHJpYnV0aW5nIHRoZXNlIHRvIFBUUCEKLVNlbmQgZW1haWwgdG8gcHRwLWRldkBlY2xpcHNlLm9yZyAoPGEgaHJlZj0iaHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvbWFpbG1hbi9saXN0aW5mby9wdHAtZGV2Ij5EZXZlbG9wZXIgbWFpbGluZyBsaXN0PC9hPikuICAKLQotCi08cD4mbmJzcDsKLTxwPiZuYnNwOzxwPiZuYnNwOzxwPiZuYnNwOwotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvb3Blbk1QZXh0cmEuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9vcGVuTVBleHRyYS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ5Njc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9vcGVuTVBleHRyYS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT4KLVJ1bm5pbmcgUFRQIE9wZW5NUCBUb29scyBQbHVnLWluCi08L3RpdGxlPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotCTwvaGVhZD4KLTxib2R5PgotPGgxIGlkPSJ0b3AiPiBSdW5uaW5nIFBUUCBPcGVuTVAgVG9vbHMgPC9oMT4KLTxwPkZvciB0aGUgbW9zdCBwYXJ0LCB0aGUgT3Blbk1QIHRvb2xzIGFyZSBzaW1pbGFyIHRvIHRoZSBNUEkKLXRvb2xzLiAgU2VlIHRoZSA8YSBocmVmPSJzZXR1cC5odG1sIj5zZXR1cDwvYT4gYW5kIDxhIGhyZWY9InJ1bi5odG1sIj5ydW48L2E+IGluc3RydWN0aW9ucyBmb3IgdGhlIE1QSSB0b29scyB0bwotc2VlIGhvdyB0byBjb25maWd1cmUgQ0RUIHRvIGZpbmQgdGhlIGhlYWRlciBmaWxlcywgYW5kIGNvbXBpbGUKLWFuZCBydW4uCi08cD5Zb3UgY2FuIGZpbmQgT3Blbk1QIGFydGlmYWN0cywgc29ydCB0aGUgYXJ0aWZhY3RzIGluIHRoZQotT3Blbk1QIGFydGlmYWN0IHZpZXcsIG5hdmlnYXRlIHRvIHNvdXJjZSBjb2RlIGxpbmVzLAotdXNlIGhvdmVyIGhlbHAsIGNvbnRlbnQgYXNzaXN0LCBhbmQgYnJpbmcgdXAgYSBoZWxwIHZpZXcKLW9uIHRoZSBBUElzIGFzIHdlbGwuCi0KLTxwPlRoZSBQVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgZG8gYWRkIGEgZmV3Ci1zcGVjaWZpYyBmdW5jdGlvbnMgdW5pcXVlbHkgZm9yIE9wZW5NUCBkZXZlbG9wbWVudDoKLTx1bD4KLTxsaT48YSBocmVmPSIjcHJhZ21hIj5TaG93ICNwcmFnbWEgcmVnaW9uczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNjb25jdXIiPlNob3cgY29uY3VycmVuY3k8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcHJvYiI+U2hvdyBDb21tb24gT3Blbk1QIHByb2JsZW1zPC9hPjwvbGk+Ci08L3VsPgotCi0KLQotPGgyIGlkPSJwcmFnbWEiPlNob3cgI3ByYWdtYSByZWdpb25zPC9oMj4KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvcHRwLW9wZW5NUHByYWdtYUFubi5naWYiLDMwMCk8L3NjcmlwdD4KLTwvcD4KLTxwPkluIHRoZSBleGFtcGxlIHNjcmVlbnNob3QgYWJvdmUsIE9wZW5NUCBhbmFseXNpcyBoYXMgYmVlbiBydW4KLW9uIHRoZSBzb3VyY2UgZmlsZSBhbmQgdHdvIGFydGlmYWN0cyB3ZXJlIGZvdW5kLCBvbmUgQVBJIGFuZAotb25lICNwcmFnbWEuICAKLVRoZXkgYXJlIHNob3duIGluIHRoZSAiT3Blbk1QIEFydGlmYWN0IFZpZXciIG5lYXIgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLgotSW4gdGhlIE9wZW5NUCBhcnRpZmFjdCB2aWV3LCB1c2UgdGhlIGNvbnRleHQgbWVudSBvbiB0aGUgI3ByYWdtYSBpdGVtCi1hbmQgc2VsZWN0ICJTaG93IHByYWdtYSByZWdpb24iIGFuZCB0aGUgcmVnaW9uIHRoYXQgdGhlICNwcmFnbWEKLWVuY29tcGFzc2VzIGlzIHNlbGVjdGVkIGFuZCBzaG93biBpbiBncmV5IGluIHRoZSBlZGl0b3IuCi0KLQotCi08aDIgaWQ9ImNvbmN1ciI+U2hvdyBjb25jdXJyZW5jeTwvaDI+Ci08cD48aW1nIHNyYz0iaW1hZ2VzL3B0cC1vcGVuTVBzaG93Q29uY3VycmVuY3ltZW51LmdpZiI+IAotPGJyPlNlbGVjdCBhIHN0YXRlbWVudCwgZS5nLiB0aGUgc3RhdGVtZW50IGhpZ2hsaWdodGVkIGluIGdyZXkgYWJvdmUuCi1TZWxlY3QgdGhlIGNvbnRleHQgbWVudSBvbiB0aGUgaGlnaGxpZ2h0ZWQgc3RhdGVtZW50LCBhbmQgY2xpY2sgIlNob3cgQ29uY3VycmVuY3kiCi1hcyBpbmRpY2F0ZWQgYWJvdmUuICBUaGUgcmVzdWx0cyBhcmUgc2hvd24gYmVsb3c6Ci08cD48aW1nIHNyYz0iaW1hZ2VzL3B0cC1vcGVuTVBzaG93Q29uY3VycmVuY3kuZ2lmIj4gCi08cD5BYm92ZSBhcmUgdGhlIHNjcmVlbi1zaG90IHJlc3VsdHMgb2YgYW4gYW5hbHlzaXMsIHBlcmhhcHMgb24gYSBub3Qgc28gcmVhbCwgCi1idXQgYXQgbGVhc3QgaW50ZXJlc3RpbmcgZXhhbXBsZS4gIAotQWZ0ZXIgaW5kaWNhdGluZyB2aWEgdGhlIGNvbnRleHQgbWVudSB0aGUgc3RhdGVtZW50IHVwb24gd2hpY2gKLXRoZSAiU2hvdyBDb25jdXJyZW5jeSIgYWN0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkLAotb3RoZXIgc3RhdGVtZW50cyB3aWxsIGJlIGhpZ2hsaWdodGVkIGluIHllbGxvdy4KLVRoZSBtZWFuaW5nIGlzIHRoZSBmb2xsb3dpbmc6Ci1UaGUgZ3JheSBzZWxlY3RlZCBzdGF0ZW1lbnQgaXMgYW5hbHlzZWQgZm9yIHRoZSBmb2xsb3dpbmc6IHdoaWNoIAotc3RhdGVtZW50cyBjYW4gZXhlY3V0ZSBjb25jdXJyZW50bHkgdG8gaXQuICAKLVRoZSByZXN1bHQgaW5jbHVkZXMgYWxsIGhpZ2hsaWdodGVkIHN0YXRlbWVudHMgYmV0d2VlbiB0aGUgdHdvIGJhcnJpZXJzLiAgQnV0IGJlY2F1c2Ugb2YgdGhlIGNvbmRpdGlvbmFsIGp1bXAgYXJvdW5kIHRoZSBsb3dlciBiYXJyaWVyLCBleGVjdXRpb24gY291bGQgYWxzbyByZWFjaCB0aGUgdG9wIG9mIHRoZSBsb29wIC0gaGl0dGluZyB0aGUgY29uZGl0aW9uIGFuZCB0aGUgbG9vcCBpbmNyZW1lbnQsIGFzIHdlbGwgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgbG9vcCBib2R5LiAgQWxsIG9mIHRob3NlIHN0YXRlbWVudHMgYXJlIGhpZ2hsaWdodGVkIGFzIHdlbGwuIElmIGNvcnJlY3QsIHRoaXMgZXhhbXBsZSB3b3VsZCB1c2VmdWxseSBwb2ludCBvdXQgYSBidWcgIC0gYmVpbmcgdGhhdCB0aGUgc2Vjb25kIGJhcnJpZXIgc2hvdWxkIGJlIG91dHNpZGUgdGhhdCBpZiBzdGF0ZW1lbnQhCi0KLQotPGgyIGlkPSJwcm9iIj5TaG93IENvbW1vbiBPcGVuTVAgUHJvYmxlbXM8L2gyPgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy9wdHAtb3Blbk1QcHJvYmxlbXMuZ2lmIiwzMDApPC9zY3JpcHQ+Ci08cD5BbG9uZyB3aXRoIHRoZSBhbmFseXNpcyBmb3IgZmluZGluZyBPcGVuTVAgYXJ0aWZhY3RzLAotY29tbW9uIHByb2JsZW1zIGFyZSBhbHNvIGxvY2F0ZWQsIGFuZCBzaG93biBpbiB0aGUgT3Blbk1QIFByb2JsZW1zIHZpZXcuCi08cD5UeXBlcyBvZiBwcm9ibGVtcyByZWNvZ25pemVkIGluY2x1ZGU6Ci08IS0tICBwcm9ibGVtcyBpZGVudGlmaWVkIGluIFBBU1RTZW1hbnRpY0NoZWNrLmphdmEgLS0+Ci08dWw+Ci08bGk+UGFyYWxsZWwgZGlyZWN0aXZlIGR5bmFtaWNhbGx5IGluc2lkZSBhbm90aGVyIHBhcmFsbGVsLCBlc3RhYmxpc2hlcyBzaW5nbGUgdGhyZWFkIGNvbnRleHQ8L2xpPgotPGxpPkZvciBkaXJlY3RpdmUgZW1iZWRkZWQgd2l0aGluIGNyaXRpY2FsLCBvcmRlcmVkLCBvciBtYXN0ZXIgZXh0ZW50czwvbGk+Ci08bGk+Rm9yIGRpcmVjdGl2ZSBlbWJlZGRlZCB3aXRoaW4gYW5vdGhlciBwYXJhbGxlbCBmb3Igb3IgcGFyYWxsZWwgc2VjdGlvbnM8L2xpPgotPGxpPlBhcmFsbGVsIGRpcmVjdGl2ZSBkeW5hbWljYWxseSBpbnNpZGUgYW5vdGhlciBwYXJhbGxlbCwgZXN0YWJsaXNoZXMgc2luZ2xlIHRocmVhZCBjb250ZXh0PC9saT4KLTxsaT5Gb3IgZGlyZWN0aXZlIGVtYmVkZGVkIHdpdGhpbiBhbm90aGVyIGZvciwgc2VjdGlvbnMsIG9yIHNpbmdsZSBkaXJlY3RpdmU8L2xpPgotPGxpPkJhcnJpZXIgZGlyZWN0aXZlIG5vdCBwZXJtaXR0ZWQgaW4gcmVnaW9uIGV4dGVudCBvZiBmb3IsIG9yZGVyZWQsIHNlY3Rpb25zLCBzaW5nbGUsIG1hc3RlciwgYW5kIGNyaXRpY2FsPC9saT4KLTxsaT5NYXN0ZXIgZGlyZWN0aXZlIG5vdCBwZXJtaXR0ZWQgaW4gZHluYW1pYyBleHRlbnQgb2YgZm9yLCBzZWN0aW9ucywgb3Igc2luZ2xlIGRpcmVjdGl2ZXM8L2xpPgotPGxpPk9yZGVyZWQgZGlyZWN0aXZlIG5vdCBwZXJtaXR0ZWQgaW4gZHluYW1pYyBleHRlbnQgb2YgY3JpdGljYWwgcmVnaW9uPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8cD4mbmJzcDs8cD4mbmJzcDsKLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL292ZXJ2aWV3Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxNmNhMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotUFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIAotPC90aXRsZT4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLQk8L2hlYWQ+Ci08Ym9keT4KLTxoMSBpZD0idG9wIj4gPGltZyBzcmM9ImltYWdlcy9hbmFseXplLmdpZiI+IFBUUCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scyA8L2gxPgotPHA+UmVsZWFzZSAyLjEKLTxwPlRoZSBQVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgKFBMRFQpIHByb3ZpZGUKLXRvb2xzIHRvIGFpZCBpbiBNUEksIE9wZW5NUCwgVVBDIFByb2dyYW1taW5nIGFuZCBvdGhlciBwYXJhbGxlbCBsYW5ndWFnZXMgYW5kIHRvb2xzLgotPGJyPkZlYXR1cmVzIG9mIHRoZSBQTERUIGluY2x1ZGU6Ci08dWw+Ci08bGk+QW5hbHlzaXMgb2YgQyBhbmQgQysrIGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiBhcnRpZmFjdHMgKEFQSXMgYW5kIG90aGVyIGFwcHJvcHJpYXRlIGl0ZW1zIGluIGNvZGUpIGZvciB0aGUgZm9sbG93aW5nIHBhcmFsbGVsIHByb2dyYW1taW5nIHN5c3RlbXM6Ci08dWw+Ci08bGk+TVBJCi08bGk+T3Blbk1QCi08bGk+TEFQSQotPGxpPlVQQwotPC91bD4KLTxsaT4iQXJ0aWZhY3QgVmlldyIgaW5kaWNhdGVzIGxvY2F0aW9ucyBvZiBBcnRpZmFjdHMgZm91bmQKLWluIHNvdXJjZSBjb2RlCi08bGk+TmF2aWdhdGlvbiB0byBzb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBhcnRpZmFjdHMKLTxsaT5Db250ZW50IGFzc2lzdCB2aWEgQ250bC1TcGFjZSBjb21wbGV0ZXMgQVBJIG5hbWVzCi13aGlsZSB0eXBpbmcsIGFuZCBmaWxscyBpbiBhcmd1bWVudHMgdG9vLgotPGxpPkhvdmVyIGhlbHAgc2hvd3MgQVBJIG5hbWVzLCBhcmd1bWVudHMsIGFuZCBkZXNjcmlwdGlvbnMuCi08bGk+UmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IEFQSXMgdmlhIEYxIChDbnRsLUYxIG9uIExpbnV4OyBIZWxwIGtleSBvbiBNYWMpCi08bGk+TVBJIEJhcnJpZXIgQW5hbHlzaXMgZGV0ZWN0cyBwb3RlbnRpYWwgZGVhZGxvY2tzIGluIE1QSSBhcHBsaWNhdGlvbnMsCi1hbmQgc2hvd3MgYmFycmllciBtYXRjaGVzLCBiYXJyaWVyIGVycm9ycywgYW5kIHBhdGhzIG9mIGFsbCBiYXJyaWVyCi1tYXRjaGluZyBzZXRzLiAgSW5jbHVkZXMgZGV0ZWN0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgZnVuY3Rpb25zIGFuZCBzb3VyY2UgZmlsZXMuCi08bGk+T3Blbk1QIHByb2JsZW1zIHZpZXcgb2YgY29tbW9uIGVycm9ycywgT3Blbk1QICJzaG93ICNwcmFnbWEgcmVnaW9uIiBhY3Rpb24sCi1PcGVuTVAgIlNob3cgQ29uY3VycmVuY3kiIGFjdGlvbi4KLQotCi0KLTxsaT5DRFQgIk5ldyBDIFByb2plY3QiIHdpemFyZCBpbmNsdWRlcyBhICB3aXphcmQgcGFnZSB0aGF0IGNhbiAKLWF1dG9tYXRpY2FsbHkgYWRkIGluIHRoZSBpbmNsdWRlIHBhdGhzIGV0Yy4gZm9yIE1QSSBhbmQgT3Blbk1QIHByb2plY3RzLgotPGxpPk5ldyBwcm9qZWN0IHdpemFyZCBjYW4gaW5jbHVkZSBzYW1wbGUgTVBJIGFuZCBPcGVuTVAgc291cmNlIGZpbGVzIAotYW5kIHNldCB1cCB0aGUgcHJvamVjdHMgdG8gc2F2ZSB0aW1lLgotPGxpPldlbGNvbWUgcGFnZXMgaW50cm9kdWNlIG5ldyBFY2xpcHNlIHVzZXJzIHRvIFBMRFQuCi08bGk+U2luZ2xlLW1lbnUgVUkgZm9yIFBMRFQgYW5hbHlzaXMgZmVhdHVyZXMgc2ltcGxpZmllcyB0aGUgZWRpdG9yIHRvb2xiYXIuCi08YnI+PGltZyBzcmM9ImltYWdlcy9wbGR0LW1lbnUucG5nIj4KLTxicj4mbmJzcDsKLTxwPlRoZSBmZWF0dXJlcyBhZGRlZCBpbiBQTERUIDIuMSBpbmNsdWRlOgotPGxpPlN1cHBvcnQgZm9yIEVjbGlwc2UgMy40IGFuZCBDRFQgNS4wCi08bGk+VVBDIHN1cHBvcnQKLTxsaT5NUEkgY29kZSB0ZW1wbGF0ZXMKLTwvdWw+Ci1TZWUgYWxzbyA8YSBocmVmPSJ3aGF0c25ldy5odG1sIj5OZXcgYW5kIE5vdGV3b3J0aHkgPC9hPiAtIHdoYXQncyBuZXcgaW4gUExEVCAyLjEKLTxoMj4KLVByZS1yZXF1aXNpdGVzOgotPC9oMj4KLTxwPlBMRFQgMi4xIHJlcXVpcmVzIHRoZSBiYXNlIEVjbGlwc2UgcGxhdGZvcm0sIHRoZSBDRFQsIGFuZCBNUEkgYW5kL29yIE9wZW5NUC4KLTx1bD4KLTxsaT48Yj5FY2xpcHNlPC9iPiBwbGF0Zm9ybTogVmVyc2lvbiAgMy40IG9yIGxhdGVyCi08bGk+PGI+Q0RUOjwvYj4KLVZlcnNpb24gNS4wLjEgb3IgbGF0ZXIgZm9yIEMvQysrIGZpbGVzLiAgKFdoZXJldmVyIENEVCBpcyBtZW50aW9uZWQsIFBob3RyYW4gcHJvamVjdHMgYW5kIGZpbGVzLAotZm9yIEMvQysrLCBpZiBiYXNlZCBvbiBFY2xpcHNlIDMuNC9DRFQgNS4wLjEgb3IgbGF0ZXIsIHNob3VsZCBhbHNvIHdvcmssIGJ1dCBub3QgbXVjaCB0ZXN0aW5nIGhhcyB5ZXQgYmVlbiBkb25lLikKLQotPGxpPjxiPk1QSTo8L2I+Ci1HZXQgTVBJIGFuZCBpdHMgaGVhZGVyIGZpbGUsIGEgdmVyc2lvbiB0aGF0IHJ1bnMgb24KLXlvdXIgc3lzdGVtIChlLmcuIE9wZW5NUEkgZm9yIExpbnV4L01hYzsgTVBJQ0gyIGZvciB3aW4zMikKLTx1bD4KLTxsaT5NYWtlIHN1cmUgaXQncyBpbiB5b3VyIHBhdGggCi08bGk+WW91IG1heSBuZWVkIHRvIGluc3RhbGwgaXQgaW4gYSBkaXJlY3Rvcnkgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBzcGFjZXMgaW4gdGhlIHBhdGgKLSh0aGF0IGlzLCBub3QgaW4gJ1Byb2dyYW0gRmlsZXMnIGV0Yy4pCi08L3VsPgotPGxpPjxiPk9wZW5NUDo8L2I+Ci1UaGUgUFRQIFBMRFQgT3Blbk1QIHRvb2xzIGFsc28gIG5lZWQgdGhlIE9wZW5NUCBoZWFkZXIgZmlsZSwgc2ltaWxhciB0byB0aGUgTVBJCi1wcmUtcmVxdWlzaXRlcyBhYm92ZS4KLTxsaT48Yj5VUEM6PC9iPgotSGVhZGVyIGZpbGUgcmVxdWlyZWQKLTxsaT48Yj5MQVBJOjwvYj4KLUhlYWRlciBmaWxlIHJlcXVpcmVkCi0KLTwvdWw+Ci08cD5Ob3RlIHRoYXQgPGk+cnVubmluZzwvaT4gTVBJIG9yIE9wZW5NUCAob3IgVVBDLCBvciBMQVBJKSBpcyBub3QgcmVhbGx5IHJlcXVpcmVkIGZvciB0aGUgUExEVAotdG8gZnVuY3Rpb24gYW5kIHByb3ZpZGUgYW5hbHlzaXMgYW5kIGhlbHAgd2l0aCBNUEkgYW5kIE9wZW5NUCBkZXZlbG9wbWVudC4KLUp1c3QgdGhlIGhlYWRlciBmaWxlcyBhcmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8ga25vdyB3aGljaCAiYXJ0aWZhY3RzIiBzaG91bGQKLWJlIGxvY2F0ZWQuCi08cD5UbyBydW4gdGhlIGNvcmUgcGFydCBvZiBQVFAgKFBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtLCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvcHRwIj5odHRwOi8vZWNsaXBzZS5vcmcvcHRwPC9hPiwKLXRvIHJ1biBhbmQgZGVidWcgcGFyYWxsZWwgcHJvZ3JhbXMgb24gdGhlIGxvY2FsIG1hY2hpbmUpLCB5b3UgbmVlZCB3aGF0ZXZlciBydW50aW1lIGl0IHJlcXVpcmVzLiAgQ3VycmVudGx5IAotKDIuMSwgT2N0b2JlciAyMDA4KSB0aGlzIGluY2x1ZGVzIE9wZW5NUEksIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3IgTGludXggYW5kIE1hYyBPbmx5LCBidXQgdmlhIFBUUCBSZW1vdGUgVG9vbHMgYW5kL29yIFJEVCAoUmVtb3RlIERldmVsb3BtZW50IFRvb2xzKSwKLW90aGVyICBzeXN0ZW1zIGNhbiBiZSBhY2Nlc3NlZCByZW1vdGVseSwgYW5kIGRvbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBzYW1lIG1hY2hpbmUgd2hlcmUgRWNsaXBzZSBpcyBpbnN0YWxsZWQuCi08cD5Gb3IgUExEVCwgYSBydW50aW1lIHN5c3RlbSBpcyBub3QgcmVxdWlyZWQsIGFuZCBQTERUIHdpbGwgd29yayAoZS5nLiBmb3IgZGV2ZWxvcG1lbnQgYW5kIGFuYWx5c2lzIG9ubHkpIG9uIFdpbmRvd3MgYXMgd2VsbC4KLQotPGgyPk1pc2NlbGxhbmVvdXMgVG9waWNzPC9oMj4KLTxoMz5NaXNwbGFjZWQgaWNvbj88L2gzPgotPHA+Tm90ZTogaWYsIGFmdGVyIGluc3RhbGxpbmcgUExEVCwgdGhlIFBMRFQgbWVudSBpY29uIGlzIG1pc3BsYWNlZCBvdmVyIG9uIHRoZSBsZWZ0IHNpZGUKLW9mIHRoZSBFY2xpcHNlIHRvb2xiYXI6Ci08YnI+PGltZyBzcmM9ImltYWdlcy9wbGR0SWNvbk1pc3BsYWNlZC5naWYiPgotPGJyPllvdSBjYW4gcHV0IGl0IGluIGl0cyBwcm9wZXIgcGxhY2UgYnkgc2VsZWN0aW5nIFdpbmRvdyA+IFJlc2V0IFBlcnNwZWN0aXZlLgotPHA+Jm5ic3A7Ci08bGk+RWNsaXBzZSBXZWxjb21lIHBhZ2UgaW5jbHVkZXMgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gZm9yIFBMRFQuCi08YnI+PGltZyBzcmM9ImltYWdlcy93ZWxjb21lT3ZlcnZpZXcuZ2lmIj4KLTxicj48aW1nIHNyYz0iaW1hZ2VzL3dlbGNvbWVDLXBsZHQuZ2lmIj4KLTxicj4mbmJzcDsKLTxoMz5UcmFjaW5nIGluIFBMRFQ8L2gzPgotPHA+VHJhY2luZyBpcyBlbmFibGVkIGZvciBzb21lIHBhcnRzIG9mIFBMRFQuICA8YSBocmVmPSJ0cmFjaW5nLmh0bWwiPlNlZSB0cmFjaW5nIGluc3RydWN0aW9ucyBmb3IgaG93IHRvIHR1cm4gdGhpcyBvbi48L2E+Ci08cD4mbmJzcDsKLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9ydW4uaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9ydW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0NmE1Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvcnVuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT4KLVJ1bm5pbmcgdGhlIE1QSSBUb29scyB3aXRoaW4gdGhlIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzCi08L3RpdGxlPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLQk8L2hlYWQ+Ci08Ym9keT4KLTxoMSBpZD0idG9wIj4gUnVubmluZyB0aGUgTVBJIFRvb2xzIHdpdGhpbiB0aGUgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHM8L2gxPgotPHA+VG8gcnVuIHRoZSBQVFAgUExEVCBNUEkgVG9vbHMsIAotY3JlYXRlIGEgcHJvamVjdCAoZS5nIGEgTWFuYWdlZCBNYWtlIEMgcHJvamVjdCksIGFuZAotc2V0IHRoZSBwcmVmZXJlbmNlcyBhbmQgaW5jbHVkZSBwYXRocyBhcyBkZXNjcmliZWQgaW4KLTxhIGhyZWY9InNldHVwLmh0bWwiPlNldHVwIGZvciBQVFAgTVBJIFRvb2xzPC9hPi4KLQotPHA+VGhlIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIHNob3VsZCB3b3JrIG9uIFN0YW5kYXJkIE1ha2UgQyBwcm9qZWN0cyBhcyB3ZWxsLCBhbmQKLW9uIEMrKyBwcm9qZWN0cyAoU3RhbmRhcmQgTWFrZSBhbmQgTWFuYWdlZCBNYWtlKS4gIFRoZSBkZXNjcmlwdGlvbiBoZXJlIGlzIGZvcgotYSBNYW5hZ2VkIE1ha2UgQyBQcm9qZWN0LgotCi08cD5Ob3RlOiB0aGUgdGVybXMgIk1hbmFnZWQgTWFrZSIgYW5kICJTdGFuZGFyZCBNYWtlIiBwcm9qZWN0cyB3ZXJlIG1vcmUgdmlzaWJseSB1c2VkIGluIENEVCAzLjEuCi1UaGV5IGFyZSBzdGlsbCB0aGVyZSBpbiBDRFQgNC4wIGJ1dCB0aGUgbmFtZXMgYXJlIHVzdWFsbHkgaGlkZGVuLiAgQnkgZGVmYXVsdCBhIHByb2plY3QgIk5ldyBDIHByb2plY3QiCi13aWxsIGNyZWF0ZSBhIG1ha2VmaWxlIGZvciB5b3UsIGFuZCB0aHVzIGlzIGEgIk1hbmFnZWQgTWFrZSIgcHJvamVjdDsgaWYgeW91IGNyZWF0ZSBhICJNYWtlZmlsZSBwcm9qZWN0IgotdGhlbiB0aGF0IGlzIHdoYXQgd2FzIGZvcm1lcmx5IGNhbGxlZCBhICJTdGFuZGFyZCBNYWtlIiBwcm9qZWN0LiAgQ29uZnVzZWQgZW5vdWdoPyBHb29kLgotCi0KLTxvbD4KLTxsaT5XaXRoaW4gdGhlIHByb2plY3QsIGNyZWF0ZSBhIEMgZmlsZSB0aGF0IGluY2x1ZGVzIE1QSSBjb2RlLiBBIHNhbXBsZSBpcyA8YSBocmVmPSJzYW1wbGVzL3Rlc3RNUEkuYyI+dGVzdE1QSS5jPC9hPiAKLUlmIHlvdSB1c2VkIHRoZSBQTERUIG5ldyBwcm9qZWN0IHdpemFyZCB0byBjcmVhdGUgYW4gTVBJIHByb2plY3QsIHRoZW4geW91IHByb2JhYmx5IGFscmVhZHkgaGF2ZSBvbmUuCi0KLTxwPk5vdGU6IEEgc2FtcGxlIEMrKyBmaWxlIHdpdGggTVBJIGNhbGxzIAotaXMgPGEgaHJlZj0ic2FtcGxlcy90ZXN0TVBJY3BwLmNwcCI+dGVzdE1QSWNwcC5jcHA8L2E+LgotPGJyPkEgc2FtcGxlIEMrKyBmaWxlIHdpdGggTVBJIGNhbGxzIGluIG9yZGluYXJ5IEMgc3R5bGUgCi1pcyA8YSBocmVmPSJzYW1wbGVzL2hlbGxvTVBJX2Nfc3R5bGUuY3BwIj5oZWxsb01QSV9jX3N0eWxlLmNwcDwvYT4uCi0KLQotPC91bD4KLTxwPiZuYnNwOwotCi0KLTxsaT5TZWxlY3QgdGhlIHNvdXJjZSBmaWxlIHRvIGFuYWx5c2UsIHRvIGZpbmQgdGhlIE1QSSBhcnRpZmFjdHMuCi1DbGljayBvbiB0aGUgc291cmNlIGZpbGUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgb24gdGhlIGxlZnQgdG8gaGlnaGxpZ2h0IGl0LgotPHA+Q2xpY2sgdGhlICJTaG93IE1QSSBBcnRpZmFjdHMiIG1lbnUgaXRlbSBpbiB0aGUgUExEVCBpY29uIG1lbnUgIGluIHRoZSB0b29sIGJhci4KLTxicj4gPGltZyBzcmM9ImltYWdlcy9tcGlNZW51LnBuZyI+Ci08YnI+KE5vdGU6IGlmIGl0IGNvbXBsYWlucyB0aGF0IGEgc291cmNlIGZpbGUgaXMgbm90IHNlbGVjdGVkIHRoZSBmaXJzdCB0aW1lLCBzZWxlY3QgaXQgYWdhaW4gYW5kIHJldHJ5LikKLTxwPlRoZSB3b3JrYmVuY2ggd2l0aCB0aGUgc2VsZWN0aW9uIGFuZCBtZW51IGl0ZW0gaXMgc2hvd24gYmVsb3c6Ci0KLTxwPjxzY3JpcHQ+IHRodW1iKCJpbWFnZXMvbXBpQnV0dG9ucy5naWYiLDMwMCk8L3NjcmlwdD4KLTxsaT5UaGUgTVBJIEFydGlmYWN0IFZpZXcgaXMgb3BlbmVkLCBpZiBpdCB3YXMgbm90IHByZXNlbnQuCi1JdCBpcyBwb3B1bGF0ZWQgd2l0aCBNUEkgYXJ0aWZhY3RzIGZvdW5kLgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy9tcGlWaWV3QW5uLmdpZiIsMzAwKTwvc2NyaXB0PgotCi0KLTxwPklmIG5vIGFydGlmYWN0cyBhcmUgZm91bmQsIGNoZWNrIHRoYXQ6Ci08b2w+Ci08bGk+VGhlIE1QSSBwcmVmZXJlbmNlcyBwYWdlIGxpc3RzIHRoZSBpbmNsdWRlIGZpbGUgZm9yIHRoZSBNUEkgaW5zdGFsbGF0aW9uCi10aGF0IHlvdXIgc291cmNlIGNvZGUgdXNlcy4gIFRoaXMgbGlzdCBpcyBob3cgdGhlIGFuYWx5c2lzIGRldGVybWluZXMgd2hhdCBpcwotYW4gIk1QSSBhcnRpZmFjdC4iICAKLTxsaT5Zb3VyIHByb2plY3QgcHJvcGVydGllcyBoYXZlIHRoZSBpbmNsdWRlIHBhdGggKHRoZSBzYW1lIG9uZSBsaXN0ZWQKLWluIHRoZSBNUEkgcHJlZmVyZW5jZXMgcGFnZSkgbGlzdGVkLgotTm90ZSB0aGF0IHRoZSBNUEkgYW5hbHlzaXMgbWF5IHJlcXVpcmUgdGhpcyBldmVuIGlmIAotdGhlIGJ1aWxkIHByb2NlZHVyZSAtIHN1Y2ggYXMgIGEgYnVpbGQgY29tbWFuZCBsaWtlICdtcGljYycgLSAKLWltcGxpY2l0bHkgZG9lcyB0aGlzIGluY2x1ZGUgZm9yIHlvdSBkdXJpbmcgYnVpbGQuCi08L29sPgotPHA+Jm5ic3A7Ci08bGk+RG91YmxlIGNsaWNrIG9uIGFueSBsaW5lIGluIHRoZSBNUEkgQXJ0aWZhY3QgVmlldwotdG8gbmF2aWdhdGUgdGhlIGVkaXRvciB0byB0aGF0IGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlLgotPHA+Jm5ic3A7Ci08bGk+SG92ZXIgb3ZlciB0aGUgTVBJIEFydGlmYWN0IGlkZW50aWZpZWQgaW4gdGhlIHNvdXJjZSBmaWxlCi0oYnkgYmx1ZSBzcXVpZ2dsZXMpIHRvIHNlZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoYXQKLWZ1bmN0aW9uIGNhbGwsIGZvciBleGFtcGxlLiAKLTxicj48aW1nIHNyYz0iaW1hZ2VzL2hvdmVyLmdpZiIgYm9yZGVyPTE+Ci08bGk+Um93cyBpbiB0aGUgTVBJIEFydGlmYWN0IFZpZXcgY2FuIGJlIHNvcnRlZCBieSBhbnkgb2YgdGhlIGNvbHVtbnMuCi1DbGljayBvbiB0aGUgY29sdW1uIGhlYWRpbmcgdG8gc29ydC4KLTxsaT5DbGljayB0aGUgIkNsZWFyIE1QSSBBcnRpZmFjdHMgTWFya2VycyIgYnV0dG9uIChyZWQgWCkKLWluIHRoZSB0b29sIGJhciA8aT5vZiB0aGUgTVBJIEFydGlmYWN0IFZpZXc8L2k+IHRvIHJlbW92ZSBhbGwKLXRoZSBNUEkgYXJ0aWZhY3RzLgotPGJyPjxpbWcgc3JjPSJpbWFnZXMvY2xlYXJNYXJrZXJzLnBuZyIgYm9yZGVyPTE+IAotPGxpPllvdSBjYW4gcnVuIHRoZSBhbmFseXNpcyBvbiBhbm90aGVyIGZpbGUgYW5kIGl0cyBtYXJrZXJzCi13aWxsIGJlIGFkZGVkIHRvIHRoZSB2aWV3LgotPGxpPllvdSBjYW4gcnVuIHRoZSBhbmFseXNpcyBvbiBtb3JlIHRoYW4gb25lIGZpbGUgKG11bHRpcGxlIHNlbGVjdGlvbikKLW9yIGEgY29udGFpbmVyIChmb2xkZXIgb3IgcHJvamVjdCksIHRvIGFuYWx5c2UgbW9yZSB0aGFuIG9uZSBmaWxlIGF0IGEgdGltZS4KLUNsaWNrIG9uIGEgcHJvamVjdCBvciBhIGZvbGRlciwgdGhlbiBzZWxlY3QgdGhlCi0iU2hvdyBNUEkgQXJ0aWZhY3RzIiBhY3Rpb24KLSB0byBydW4gaXQgb24gYWxsIEMgc291cmNlIGZpbGVzIGluIHRoYXQgZm9sZGVyLgotPGJyPiA8aW1nIHNyYz0iaW1hZ2VzL21waU1lbnUucG5nIj4KLTxwPgotPGxpPjxiPkNvbnRlbnQgQXNzaXN0PC9iPjxicj4KLVR5cGUgYW4gaW5jb21wbGV0ZSBNUEkgZnVuY3Rpb24gbmFtZSBlLmcuICJNUElfSW5pIgotYW5kIGhpdCBDdHJsLVNwYWNlLiBUaGUgaW5mb3JtYXRpb24gdGhhdCBpcyBzaG93bgotaXMgcG9wdWxhdGVkIHdpdGggQ0RUIGNvbXBsZXRpb25zIGluY2x1ZGluZyBhcmd1bWVudAotdHlwZXMsIGJ1dCBpbiBhZGRpdGlvbiwgdGhlIFBUUC1NUEkgdG9vbHMgYWxzbyBwcm92aWRlCi1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBhY3R1YWwgTVBJIGNvbnN0YW50IHZhbHVlcywgZXRjLgotd2hlcmUgYXBwcm9wcmlhdGUsIGFuZCBhIHllbGxvdyBwb3B1cCB3aXRoIGFkZGl0aW9uYWwgCi10ZXh0dWFsIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdW5jdGlvbi4KLVBpY2sgdGhlIG9uZSB5b3Ugd2FudCB3aXRoIHRoZSBhcnJvdyBrZXlzIG9yIHRoZSBtb3VzZSwgdG8gYWRkIHRoZSBBUEkgdG8geW91ciBzb3VyY2UgZmlsZS4KLTxicj48aW1nIHNyYz0iaW1hZ2VzL2NvbnRlbnRBc3Npc3QuZ2lmIiBib3JkZXI9MT4KLTxwPgotPGxpPjxiPkNvbnRleHQgc2Vuc2l0aXZlIGhlbHA8L2I+PGJyPgotQWxzbywgaWYgRjEgaXMgcHJlc3NlZCB3aGVuIHRoZSBjdXJzb3IgaXMgd2l0aGluCi1hIGZ1bmN0aW9uIG5hbWUsIGEgaGVscCB2aWV3IGFwcGVhcnMgd2hpY2ggc2hvd3MgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLShJbiBMaW51eCBwcmVzcyBDdHJsLUYxOyBpbiBNYWMgVXNlIEhlbHAgYnV0dG9uIG9yIHVzZSBtZW51IEhlbHAgPiBEeW5hbWljIEhlbHApCi0KLTxicj48aW1nIHNyYz0iaW1hZ2VzL2hlbHBDb250U2Vuc0hpdEYxLmdpZiIgYm9yZGVyPTE+Ci08cD5IZWxwIFZpZXcgYXBwZWFyczoKLTxicj48aW1nIHNyYz0iaW1hZ2VzL2hlbHBDb250U2Vucy5naWYiIGJvcmRlcj0xPgotPHA+Q2xpY2sgb24gdGhlIGZ1bmN0aW9uIG5hbWUgdG8gc2VlIG1vcmUgaW5mb3JtYXRpb246Ci08YnI+PGltZyBzcmM9ImltYWdlcy9oZWxwQ29udFNlbnNIaXRGMWNsaWNrLmdpZiIgYm9yZGVyPTE+Ci0KLTwvb2w+Ci08cD4mbmJzcDsKLTxwPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJiYXJyaWVyLmh0bWwiPk1QSSBCYXJyaWVyIEFuYWx5c2lzPC9hPiBleHBsYW5hdGlvbi4KLQotPHA+U2VlIGFsc28gPGEgaHJlZj0ibXBpVGVtcGxhdGVzLmh0bWwiPk1QSSBDb2RlIFRlbXBsYXRlczwvYT4uCi0KLTxwPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJzZXR1cE9NUC5odG1sIj5PcGVuTVAgc2V0dXAgaW5mb3JtYXRpb248L2E+Ci1vciB0aGUgPGEgaHJlZj0icnVuT01QLmh0bWwiPk9wZW5NUCBydW4gaW5mb3JtYXRpb248L2E+LgotPHA+Jm5ic3A7PHA+Jm5ic3A7PHA+Jm5ic3A7Ci08cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIFRvcDwvYT4gfCA8YSBocmVmPSJ0b2MuaHRtbCI+QmFjayB0byBUYWJsZSBvZiBDb250ZW50czwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9ydW5PTVAuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9ydW5PTVAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiNjYwZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvcnVuT01QLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotUnVubmluZyBQVFAgT3Blbk1QIFRvb2xzIAotPC90aXRsZT4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLQk8L2hlYWQ+Ci08Ym9keT4KLTxoMSBpZD0idG9wIj4gUnVubmluZyBQVFAgT3Blbk1QIFRvb2xzIDwvaDE+Ci0KLTxwPlRoZSBiYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHJ1bm5pbmcgdGhlIE9wZW5NUCB0b29scyAKLShmaW5kaW5nIE9wZW5NUCBhcnRpZmFjdHMsIG5hdmlnYXRpbmcgdG8gc291cmNlIGNvZGUsIHVzaW5nIEhlbHApCi1hcmUgdGhlIHNhbWUKLWFzIGZvciA8YSBocmVmPSJydW4uaHRtbCI+cnVubmluZyB0aGUgTVBJIHRvb2xzLjwvYT4uCi08cD5GaW5kaW5nIE9wZW5NUCBhcnRpZmFjdHM6Ci08YnI+PGltZyBzcmM9ImltYWdlcy9tZW51U2hvd09wZW5NUGFydGlmYWN0cy5naWYiPgotPHA+T3Blbk1QIGFydGlmYWN0cyBmb3VuZCBhbmQgc2hvd24gaW4gdGhlIE9wZW5NUCBBcnRpZmFjdCBWaWV3OgotPHA+PHNjcmlwdD4gdGh1bWIoImltYWdlcy9vcGVubXBBcnRpZmFjdHNmb3VuZC5naWYiLDMwMCk8L3NjcmlwdD4KLTxwPgotVGhlcmUgYXJlIGEgZmV3IDxhIGhyZWY9Im9wZW5NUGV4dHJhLmh0bWwiPmV4dHJhIE9wZW5NUCBhbmFseXNpcyBmdW5jdGlvbnM8L2E+IGJleW9uZCB0aG9zZSBhdmFpbGFibGUgZm9yIE1QSSwgdG9vLgotCi0KLTxwPiZuYnNwOzxwPiZuYnNwOzxwPiZuYnNwOwotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvcnVuVVBDLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvcnVuVVBDLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzIyMTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3J1blVQQy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT4KLVJ1bm5pbmcgUFRQIFVQQyBUb29scyAKLTwvdGl0bGU+Ci0JPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaGVscC5jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRodW1iLmpzIj4gPC9zY3JpcHQ+Ci0JPC9oZWFkPgotPGJvZHk+Ci08aDEgaWQ9InRvcCI+IFJ1bm5pbmcgUFRQIFVQQyBUb29scyBQbHVnLWluPC9oMT4KLQotPHA+VGhlIGJhc2ljIGluc3RydWN0aW9ucyBmb3IgcnVubmluZyB0aGUgVVBDIHRvb2xzIAotKGZpbmRpbmcgVVBDIGFydGlmYWN0cywgbmF2aWdhdGluZyB0byBzb3VyY2UgY29kZSwgdXNpbmcgSGVscCkKLWFyZSB0aGUgc2FtZQotYXMgZm9yIDxhIGhyZWY9InJ1bi5odG1sIj5ydW5uaW5nIHRoZSBNUEkgdG9vbHMuPC9hPi4KLQotPHA+U2V0IHVwIFVQQyBQcmVmZXJlbmNlcwotPGJyPjxpbWcgc3JjPSJpbWFnZXMvdXBjUHJlZnMucG5nIj4KLTxicj4mbmJzcDsKLQotPHA+U2V0IHVwIFVQQyBwcm9qZWN0IGluY2x1ZGUgcGF0aHMsIGNvbXBpbGVyIG9wdGlvbnMsIGV0Yy4gaW4gUHJvamVjdCBQcm9wZXJ0aWVzCi08YnI+PGltZyBzcmM9ImltYWdlcy91cGNQcm9wZXJ0aWVzLnBuZyI+Ci08YnI+Jm5ic3A7Ci0KLTxwPkZpbmRpbmcgVVBDIGFydGlmYWN0czoKLTxicj48aW1nIHNyYz0iaW1hZ2VzL21lbnVTaG93VVBDYXJ0aWZhY3RzLnBuZyI+Ci08cD5VUEMgYXJ0aWZhY3RzIGZvdW5kIGFuZCBzaG93biBpbiB0aGUgVVBDIEFydGlmYWN0IFZpZXc6Ci08cD48aW1nIHNyYz0iaW1hZ2VzL3VwY19lZGl0b3JBbmRBcnRpZmFjdHMucG5nIj4KLTxwPk5vdGUgdGhhdCBjdXJyZW50bHkgb25seSBVUEMgQVBJcyAoZnVuY3Rpb24gY2FsbHMpIGFyZSBpZGVudGlmaWVkIGFzIGFydGlmYWN0cy4KLVVQQyBsYW5ndWFnZSBmZWF0dXJlcyBhcmUgaGlnaGxpZ2h0ZWQgYnkgQ0RULgotPHA+PGltZyBzcmM9ImltYWdlcy91cGNfZWRpdG9yVnNBcnRpZmFjdHMucG5nIj4KLQotCi0KLTxwPiZuYnNwOzxwPiZuYnNwOzxwPiZuYnNwOwotPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byBUb3A8L2E+IHwgPGEgaHJlZj0idG9jLmh0bWwiPkJhY2sgdG8gVGFibGUgb2YgQ29udGVudHM8L2E+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvc2FtcGxlcy9oZWxsb01QSV9jX3N0eWxlLmNwcCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL2hlbGxvTVBJX2Nfc3R5bGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzU2OWRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL2hlbGxvTVBJX2Nfc3R5bGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI2luY2x1ZGUgIm1waS5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLy8gZnJvbSBld3MvZ3JpZG1waS9tcGlFeGFtcGxlMi9zcmMvaGVsbG9NUEkuYwotCi1jbGFzcyBIZWxsb1dvcmxkIHsKLQlwdWJsaWM6Ci0JCWludCBzYXlIZWxsbyhpbnQgYXJnYywgY2hhciogYXJndltdKTsKLX07Ci0KLWludCBIZWxsb1dvcmxkOjpzYXlIZWxsbyhpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0JaW50ICBteV9yYW5rOyAvKiByYW5rIG9mIHByb2Nlc3MgKi8KLQlpbnQgIHA7ICAgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlpbnQgc291cmNlOyAgIC8qIHJhbmsgb2Ygc2VuZGVyICovCi0JaW50IGRlc3Q7ICAgICAvKiByYW5rIG9mIHJlY2VpdmVyICovCi0JaW50IHRhZz0wOyAgICAvKiB0YWcgZm9yIG1lc3NhZ2VzICovCi0JY2hhciBtZXNzYWdlWzEwMF07ICAgICAgICAvKiBzdG9yYWdlIGZvciBtZXNzYWdlICovCi0JTVBJX1N0YXR1cyBzdGF0dXMgOyAgIC8qIHJldHVybiBzdGF0dXMgZm9yIHJlY2VpdmUgKi8KLQkKLQljb3V0IDw8ICJIZWxsbyBNUEkgV29ybGQgdGhlIG9yaWdpbmFsLiIgPDwgZW5kbDsKLQkKLQkvKiBzdGFydCB1cCBNUEkgKi8KLQlNUElfSW5pdCgmYXJnYywgKGNoYXIqKiopKCZhcmd2KSk7Ci0JCi0JLyogZmluZCBvdXQgcHJvY2VzcyByYW5rICovCi0JTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJm15X3JhbmspOyAKLQkKLQkvKiBmaW5kIG91dCBudW1iZXIgb2YgcHJvY2Vzc2VzICovCi0JTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnApOyAKLQkKLQkKLQlpZiAobXlfcmFuayAhPTApewotCQkvKiBjcmVhdGUgbWVzc2FnZSAqLwotCQlzcHJpbnRmKG1lc3NhZ2UsICJHcmVldGluZ3MgZnJvbSBwcm9jZXNzICVkISIsIG15X3JhbmspOwotCQlkZXN0ID0gMDsKLQkJLyogdXNlIHN0cmxlbisxIHNvIHRoYXQgJ1wwJyBnZXQgdHJhbnNtaXR0ZWQgKi8KLQkJTVBJX1NlbmQobWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpKzEsIE1QSV9DSEFSLAotCQkgICBkZXN0LCB0YWcsIE1QSV9DT01NX1dPUkxEKTsKLQl9Ci0JZWxzZXsKLQkJcHJpbnRmKCJGcm9tIHByb2Nlc3MgMDogTnVtIHByb2Nlc3NlczogJWRcbiIscCk7Ci0JCWZvciAoc291cmNlID0gMTsgc291cmNlIDwgcDsgc291cmNlKyspIHsKLQkJCU1QSV9SZWN2KG1lc3NhZ2UsIDEwMCwgTVBJX0lOVEVHRVIsIHNvdXJjZSwgdGFnLAotCQkJICAgICAgTVBJX0NPTU1fV09STEQsICZzdGF0dXMpOwotCQkJY291dCA8PCBtZXNzYWdlIDw8IGVuZGw7Ci0JCX0KLQl9Ci0JLyogc2h1dCBkb3duIE1QSSAqLwotCU1QSV9GaW5hbGl6ZSgpOyAKLQkKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1haW4gKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgSGVsbG9Xb3JsZCBoZWxsbzsKLSAgaGVsbG8uc2F5SGVsbG8oYXJnYywgYXJndik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NhbXBsZXMvcGkuY3BwIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NhbXBsZXMvcGkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzE2YTI0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL3BpLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSNpbmNsdWRlIDxtYXRoLmg+IAotI2luY2x1ZGUgIm1waS5oIiAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gCi0gLyogCi0gICogQ2FsY3VsYXRpb24gb2YgUEkgaW4gTVBJIHZpYSBDKysKLSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgCi17IAotICAgIGludCBuLCByYW5rLCBzaXplLCBpOyAKLSAgICBkb3VibGUgUEkyNURUID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDM7IAotICAgIGRvdWJsZSBteXBpLCBwaSwgaCwgc3VtLCB4OyAKLSAKLSAgICBNUEk6OkluaXQoYXJnYywgYXJndik7IAotICAgIHNpemUgPSBNUEk6OkNPTU1fV09STEQuR2V0X3NpemUoKTsgCi0gICAgcmFuayA9IE1QSTo6Q09NTV9XT1JMRC5HZXRfcmFuaygpOyAKLSAKLSAgICB3aGlsZSAoMSkgeyAKLQlpZiAocmFuayA9PSAwKSB7IAotCSAgICBjb3V0IDw8ICJFbnRlciB0aGUgbnVtYmVyIG9mIGludGVydmFsczogKDAgcXVpdHMpIiAKLQkJIDw8IGVuZGw7IAotCSAgICBjaW4gPj4gbjsgCi0JfSAKLSAKLQlNUEk6OkNPTU1fV09STEQuQmNhc3QoJm4sIDEsIE1QSTo6SU5ULCAwKTsgCi0JaWYgKG49PTApIAotCSAgICBicmVhazsgCi0JZWxzZSB7IAotCSAgICBoID0gMS4wIC8gKGRvdWJsZSkgbjsgCi0JICAgIHN1bSA9IDAuMDsgCi0JICAgIGZvciAoaSA9IHJhbmsgKyAxOyBpIDw9IG47IGkgKz0gc2l6ZSkgeyAKLQkJeCA9IGggKiAoKGRvdWJsZSlpIC0gMC41KTsgCi0JCXN1bSArPSAoNC4wIC8gKDEuMCArIHgqeCkpOyAKLQkgICAgfSAKLQkgICAgbXlwaSA9IGggKiBzdW07IAotIAotCSAgICBNUEk6OkNPTU1fV09STEQuUmVkdWNlKCZteXBpLCAmcGksIDEsIE1QSTo6RE9VQkxFLCAKLQkJCQkgICBNUEk6OlNVTSwgMCk7IAotCSAgICBpZiAocmFuayA9PSAwKSAKLQkJY291dCA8PCAicGkgaXMgYXBwcm94aW1hdGVseSAiIDw8IHBpIAotCQkgICAgIDw8ICIsIEVycm9yIGlzICIgPDwgZmFicyhwaSAtIFBJMjVEVCkgCi0JCSAgICAgPDwgZW5kbDsgCi0JfSAKLSAgICB9IAotICAgIE1QSTo6RmluYWxpemUoKTsgCi0gICAgcmV0dXJuIDA7IAotfSAKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NhbXBsZXMvdGVzdE1QSS5jIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NhbXBsZXMvdGVzdE1QSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWJkY2QzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL3Rlc3RNUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIm1waS5oIgotLy8gU2FtcGxlIE1QSSBwcm9ncmFtCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKXsKLQlwcmludGYoIkhlbGxvIE1QSSBXb3JsZCB0aGUgb3JpZ2luYWwuXG4iKTsJCi0JaW50ICBteV9yYW5rOyAvKiByYW5rIG9mIHByb2Nlc3MgKi8KLQlpbnQgIHA7ICAgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlpbnQgc291cmNlOyAgIC8qIHJhbmsgb2Ygc2VuZGVyICovCi0JaW50IGRlc3Q7ICAgICAvKiByYW5rIG9mIHJlY2VpdmVyICovCi0JaW50IHRhZz0wOyAgICAvKiB0YWcgZm9yIG1lc3NhZ2VzICovCi0JY2hhciBtZXNzYWdlWzEwMF07ICAgICAgICAvKiBzdG9yYWdlIGZvciBtZXNzYWdlICovCi0JTVBJX1N0YXR1cyBzdGF0dXMgOyAgIC8qIHJldHVybiBzdGF0dXMgZm9yIHJlY2VpdmUgKi8KLQkKLQkvKiBzdGFydCB1cCBNUEkgKi8KLQkKLQlNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwotCQotCS8qIGZpbmQgb3V0IHByb2Nlc3MgcmFuayAqLwotCU1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZteV9yYW5rKTsgCi0JCi0JLyogZmluZCBvdXQgbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwotCU1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZwKTsgCi0JCi0JCi0JaWYgKG15X3JhbmsgIT0wKXsKLQkJLyogY3JlYXRlIG1lc3NhZ2UgKi8KLQkJc3ByaW50ZihtZXNzYWdlLCAiR3JlZXRpbmdzIGZyb20gcHJvY2VzcyAlZCEiLCBteV9yYW5rKTsKLQkJZGVzdCA9IDA7Ci0JCS8qIHVzZSBzdHJsZW4rMSBzbyB0aGF0ICdcMCcgZ2V0IHRyYW5zbWl0dGVkICovCi0JCU1QSV9TZW5kKG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSsxLCBNUElfQ0hBUiwKLQkJICAgZGVzdCwgdGFnLCBNUElfQ09NTV9XT1JMRCk7Ci0JfQotCWVsc2V7Ci0JCXByaW50ZigiRnJvbSBwcm9jZXNzIDA6IE51bSBwcm9jZXNzZXM6ICVkXG4iLHApOwotCQlmb3IgKHNvdXJjZSA9IDE7IHNvdXJjZSA8IHA7IHNvdXJjZSsrKSB7Ci0JCQlNUElfUmVjdihtZXNzYWdlLCAxMDAsIE1QSV9DSEFSLCBzb3VyY2UsIHRhZywKLQkJCSAgICAgIE1QSV9DT01NX1dPUkxELCAmc3RhdHVzKTsKLQkJCXByaW50ZigiJXNcbiIsbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JLyogc2h1dCBkb3duIE1QSSAqLwotCU1QSV9GaW5hbGl6ZSgpOyAKLQkKLQkKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL3Rlc3RNUEliYXJyaWVyLmMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvc2FtcGxlcy90ZXN0TVBJYmFycmllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmFiN2YyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL3Rlc3RNUEliYXJyaWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJtcGkuaCIKLS8vIFNhbXBsZSBNUEkgcHJvZ3JhbQotCi0KLXZvaWQgYmFycmllcigpewotCU1QSV9CYXJyaWVyKE1QSV9DT01NX1dPUkxEKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7CQotCWludCAgbXlfcmFuazsgLyogcmFuayBvZiBwcm9jZXNzICovCi0JaW50ICBwOyAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc2VzICovCi0JaW50IHNvdXJjZTsgICAvKiByYW5rIG9mIHNlbmRlciAqLwotCWludCBkZXN0OyAgICAgLyogcmFuayBvZiByZWNlaXZlciAqLwotCWludCB0YWc9MCwgeCA9IDM7ICAgIC8qIHRhZyBmb3IgbWVzc2FnZXMgKi8KLQljaGFyIG1lc3NhZ2VbMTAwXTsgICAgICAgIC8qIHN0b3JhZ2UgZm9yIG1lc3NhZ2UgKi8KLQlNUElfU3RhdHVzIHN0YXR1cyA7ICAgLyogcmV0dXJuIHN0YXR1cyBmb3IgcmVjZWl2ZSAqLwotCSAKLQkvKiBzdGFydCB1cCBNUEkgKi8KLQkKLQlNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwotCQotCS8qIGZpbmQgb3V0IHByb2Nlc3MgcmFuayAqLwotCU1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZteV9yYW5rKTsgCi0JCi0JLyogZmluZCBvdXQgbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwotCU1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZwKTsgCi0JCi0JTVBJX0JhcnJpZXIoTVBJX0NPTU1fV09STEQpOwotCQotCQotCWlmIChteV9yYW5rICE9MCl7Ci0JCS8qIGNyZWF0ZSBtZXNzYWdlICovCi0JCXNwcmludGYobWVzc2FnZSwgIkdyZWV0aW5ncyBmcm9tIHByb2Nlc3MgJWQhIiwgbXlfcmFuayk7Ci0JCWRlc3QgPSAwOwotCQkvKiB1c2Ugc3RybGVuKzEgc28gdGhhdCAnXDAnIGdldCB0cmFuc21pdHRlZCAqLwotCQlNUElfU2VuZChtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkrMSwgTVBJX0NIQVIsCi0JCSAgIGRlc3QsIHRhZywgTVBJX0NPTU1fV09STEQpOwotCQlNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7Ci0JfQotCWVsc2V7Ci0JCXByaW50ZigiRnJvbSBwcm9jZXNzIDA6IE51bSBwcm9jZXNzZXM6ICVkXG4iLHApOwotCQlmb3IgKHNvdXJjZSA9IDE7IHNvdXJjZSA8IHA7IHNvdXJjZSsrKSB7Ci0JCQlNUElfUmVjdihtZXNzYWdlLCAxMDAsIE1QSV9DSEFSLCBzb3VyY2UsIHRhZywKLQkJCSAgICAgIE1QSV9DT01NX1dPUkxELCAmc3RhdHVzKTsKLQkJCXByaW50ZigiJXNcbiIsbWVzc2FnZSk7Ci0JCX0KLQkJLy9NUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7Ci0JCWJhcnJpZXIoKTsKLQl9Ci0KLQotCWlmKG15X3JhbmsgPT0gMCl7Ci0JCXByaW50ZigidGVzdCBlcnJvcnNcbiIpOwotCQlNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7Ci0JfQotCWVsc2V7Ci0JCXByaW50ZigidGhpcyBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYSBiYXJyaWVyIik7Ci0JfQotCQotCWlmKHggPCAzKXsKLQkJcHJpbnRmKCJJdCBpcyBub3QgYW4gZXJyb3JcbiIpOwotCQlNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7Ci0JfQotCQotCXdoaWxlKHggPCBteV9yYW5rKXsKLQkJTVBJX0JhcnJpZXIoTVBJX0NPTU1fV09STEQpOwotCQl4ICsrOwotCX0KLQkKLQkvKiBzaHV0IGRvd24gTVBJICovCi0JTVBJX0ZpbmFsaXplKCk7IAotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zYW1wbGVzL3Rlc3RNUEljcHAuY3BwIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NhbXBsZXMvdGVzdE1QSWNwcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjE4YzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NhbXBsZXMvdGVzdE1QSWNwcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jaW5jbHVkZSA8bWF0aC5oPiAKLSNpbmNsdWRlICJtcGkuaCIgCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgCi17IAotICAgIGludCBuLCByYW5rLCBzaXplLCBpOyAKLSAgICBkb3VibGUgUEkyNURUID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDM7IAotICAgIGRvdWJsZSBteXBpLCBwaSwgaCwgc3VtLCB4OyAKLSAKLSAgICBNUEk6OkluaXQoYXJnYywgYXJndik7IAotICAgIHNpemUgPSBNUEk6OkNPTU1fV09STEQuR2V0X3NpemUoKTsgCi0gICAgcmFuayA9IE1QSTo6Q09NTV9XT1JMRC5HZXRfcmFuaygpOyAKLSAKLSAgICB3aGlsZSAoMSkgeyAKLQlpZiAocmFuayA9PSAwKSB7IAotCSAgICBjb3V0IDw8ICJFbnRlciB0aGUgbnVtYmVyIG9mIGludGVydmFsczogKDAgcXVpdHMpIiAKLQkJIDw8IGVuZGw7IAotCSAgICBjaW4gPj4gbjsgCi0JfSAKLSAKLQlNUEk6OkNPTU1fV09STEQuQmNhc3QoJm4sIDEsIE1QSTo6SU5ULCAwKTsgCi0JaWYgKG49PTApIAotCSAgICBicmVhazsgCi0JZWxzZSB7IAotCSAgICBoID0gMS4wIC8gKGRvdWJsZSkgbjsgCi0JICAgIHN1bSA9IDAuMDsgCi0JICAgIGZvciAoaSA9IHJhbmsgKyAxOyBpIDw9IG47IGkgKz0gc2l6ZSkgeyAKLQkJeCA9IGggKiAoKGRvdWJsZSlpIC0gMC41KTsgCi0JCXN1bSArPSAoNC4wIC8gKDEuMCArIHgqeCkpOyAKLQkgICAgfSAKLQkgICAgbXlwaSA9IGggKiBzdW07IAotIAotCSAgICBNUEk6OkNPTU1fV09STEQuUmVkdWNlKCZteXBpLCAmcGksIDEsIE1QSTo6RE9VQkxFLCAKLQkJCQkgICBNUEk6OlNVTSwgMCk7IAotCSAgICBpZiAocmFuayA9PSAwKSAKLQkJY291dCA8PCAicGkgaXMgYXBwcm94aW1hdGVseSAiIDw8IHBpIAotCQkgICAgIDw8ICIsIEVycm9yIGlzICIgPDwgZmFicyhwaSAtIFBJMjVEVCkgCi0JCSAgICAgPDwgZW5kbDsgCi0JfSAKLSAgICB9IAotICAgIE1QSTo6RmluYWxpemUoKTsgCi0gICAgcmV0dXJuIDA7IAotfSAKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NldHVwLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvc2V0dXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyNGNiMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvc2V0dXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotU2V0dXAgZm9yIE1QSSBUb29scyB3aXRoaW4gdGhlIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzCi08L3RpdGxlPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotPGJvZHk+Ci08aDEgaWQ9InRvcCI+U2V0dXAgZm9yIE1QSSBUb29scyB3aXRoaW4gdGhlIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzPC9oMT4KLTxoMj5UZXJtaW5vbG9neSBvZiBDRFQgcHJvamVjdHM8L2gyPgotPHA+Tm90ZTogdGhlIG9sZGVyCi1DRFQgNC4wIHJlZmVycyB0byBhIEMgcHJvamVjdCBpbiB3aGljaCBpdCBtYW5hZ2VzIHRoZSBtYWtlZmlsZSBhcyAgYSAiTWFuYWdlZCBNYWtlIFByb2plY3QiIG9yIGEgIk1hbmFnZWQgQnVpbGQgUHJvamVjdCIKLWFuZCBhIHByb2plY3Qgd2hpY2ggCi15b3Ugc3VwcGx5IHRoZSBtYWtlZmlsZSBpcyBhICJTdGFuZGFyZCBNYWtlIHByb2plY3QuIgotPHA+Q0RUIDUuMCByZWZlcnMgdG8gYSBDIHByb2plY3QgaW4gd2hpY2ggaXQgbWFuYWdlcyB0aGUgbWFrZWZpbGUgYXMganVzdCBhICJDIFByb2plY3QiIGFuZCBhIHByb2plY3Qgd2hpY2ggCi15b3Ugc3VwcGx5IHRoZSBtYWtlZmlsZSBpcyBhIDxhIGhyZWY9InNldHVwTWFrZWZpbGVQcm9qZWN0Lmh0bWwiPiJNYWtlZmlsZSBwcm9qZWN0LiI8L2E+Ci08cD5Cb3RoIHRlcm1pbm9sb2dpZXMgYXJlIHNvbWV0aW1lcyB1c2VkIGluIHRoZXNlIGluc3RydWN0aW9ucy4KLTxoMj5Qcm9qZWN0IFNldHVwPC9oMj4KLTxwPlRvIHVzZSAgdGhlIFBUUCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudAotVG9vbHMgZmVhdHVyZSBmb3IgTVBJIGRldmVsb3BtZW50LCB5b3UgbmVlZCB0byAKLTxvbD4KLTxsaT48YSBocmVmPSIjcHJlZnMiPlNwZWNpZnkgdGhlIE1QSSBpbmNsdWRlIHBhdGggaW4gcHJlZmVyZW5jZXM8L2E+LCBhbmQ8L2xpPgotPGxpPjxhIGhyZWY9IiNwcm9qZWN0Ij5BZGQgdGhlIE1QSSBpbmNsdWRlIGZpbGVzIGV0Yy4gIHRvIHRoZSBidWlsZCBpbmZvcm1hdGlvbiBmb3IgZWFjaCAgcHJvamVjdC48L2E+Ci08L29sPgotCi08aDIgaWQ9InByZWZzIj5TcGVjaWZ5aW5nIHRoZSBNUEkgSW5jbHVkZSBwYXRoIGluIFByZWZlcmVuY2VzPC9oMj4KLTxwPk5vdGU6IEFzIG9mIFBMRFQgMi4xLCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBpZiB0aGUgTVBJIChvciBPcGVuTVApIGluY2x1ZGUgcGF0aCBoYXNuJ3QgYmVlbiBzZXQgdXAgaW4gUExEVCBQcmVmZXJlbmNlcy4KLVRoZSBmaXJzdCB0aW1lIHlvdSB1c2UgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCB0byBjcmVhdGUgYW4gTVBJIG9yIE9wZW5NUCBwcm9qZWN0LCAKLXlvdSdsbCBiZSBwcm9tcHRlZCB0byBzZXQgdXAgdGhlIHByZWZlcmVuY2VzIHRvIHBvaW50IHRvIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXIgZmlsZXMuCi08cD5PciwgeW91IGNhbiBzZXQgaXQgdXAgYWhlYWQgb2YgdGltZSBhcyBzcGVjaWZpZWQgYmVsb3cuCi08cD5UbyBzcGVjaWZ5IHRoZSBNUEkgaW5jbHVkZSBwYXRoLCB1c2UgV2luZG93ID4gUHJlZmVyZW5jZXMuIChGb3IgTWFjLCB1c2UgRWNsaXBzZSA+IFByZWZlcmVuY2VzKQotVW5kZXIgUFRQLCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scywgTVBJLi4uCi0oTm90ZTogSWYgeW91IGRvIG5vdCBoYXZlIGNvcmUgUFRQIGluc3RhbGxlZCwgdGhlICJQYXJhbGxlbCBMYW5ndWFnZSAKLURldmVsb3BtZW50IFRvb2xzIiBzZWN0aW9uIGluIHRoZSBwcmVmZXJlbmNlcyB3aWxsIGJlIGluIHRoZSBtYWluIGxpc3QuKQotCi08cD5BZGQgdGhlIHBhdGggdG8gTVBJIGluY2x1ZGUgcGF0aHMgIC0gdGhpcyB0ZWxscyBQTERUIHdoYXQgc3ltYm9scyB0byBsb29rCi1mb3IgaW4gdGhlIE1QSSBBcnRpZmFjdCB2aWV3LiAgWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIGRlZmF1bHQgTVBJIGJ1aWxkIGNvbW1hbmQuCi1UaGVzZSB2YWx1ZXMgd2lsbCBtYWtlIHRoZSBNUEkgTmV3IFByb2plY3QgV2l6YXJkIHBhZ2UgbWFrZSBtb3JlCi1hY2N1cmF0ZSBwcmVkaWN0aW9ucyBvZiBzZXR0aW5ncyBmb3IgbmV3IHByb2plY3RzLgotPGJyPjxpbWcgc3JjPSJpbWFnZXMvcGxkdC1wcmVmczEucG5nIj4KLQotPHA+VGhlICJQcm9tcHQgdG8gaW5jbHVkZSBNUEkgQVBJcyBmb3VuZCBpbiBvdGhlciBsb2NhdGlvbnMgKEMgb25seSkiIGluZGljYXRlcyB3aGV0aGVyIAotaXQgd2lsbCBhc2sgeW91IGlmIE1QSSBBUElTIGZvdW5kIGVsc2V3aGVyZSAKLXdpbGwgYmUgY29uc2lkZXJlZCBhcyBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHBvaW50IHRvICZsdDtpbnN0YWxsLWxvYyZndDsvaW5jbHVkZSBpbiB0aGUgTVBJIGluY2x1ZGUgcGF0aHMgaGVyZSwKLWJ1dCB5b3VyIHNvdXJjZSBmaWxlcyBhY3R1YWxseSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmcm9tIC91c3IvbG9jYWwvaW5jbHVkZSwgaXQgd2lsbCBwcm9tcHQgeW91IHRvIGNvbnNpZGVyIHRoZXNlIGFzIHdlbGwgCi1kdXJpbmcgdGhlIGFuYWx5c2lzLgotVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBDIHByb2plY3RzLCBub3QgQysrIHByb2plY3RzLgotPHA+SGl0IE9LIHRvIGNsb3NlIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuCi0KLQotCi08aDIgaWQ9InByb2plY3QiPkFkZCBNUEkgSW5jbHVkZSBwYXRocyB0byBlYWNoIHByb2plY3Q8L2gyPgotPHA+VGhlIE1QSSBpbmNsdWRlIHBhdGhzIG11c3QgYWxzbyBiZSBhZGRlZCB0byBlYWNoIHByb2plY3QuCi1UaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gdGhpcy4KLTxvbD4KLTxsaT48YSBocmVmPSIjd2l6YXJkIj5Vc2UgdGhlIFBMRFQgbmV3IHByb2plY3Qgd2l6YXJkczwvYT4sIG9yCi08L2xpPgotPGxpPjxhIGhyZWY9IiNtYW51YWwiPkFkZCB0aGUgYnVpbGQgaW5mb3JtYXRpb24gbWFudWFsbHk8L2E+LgotPC9vbD4KLTxoMiBpZD0id2l6YXJkIj5Vc2UgdGhlIFBMRFQgbmV3IHByb2plY3Qgd2l6YXJkczwvaDI+Ci08cD5DcmVhdGUgYSBuZXcgIkMgcHJvamVjdCIKLTxicj5PbmUgd2F5IGlzIHRvIHVzZSB0aGUgbWVudTogRmlsZS0+TmV3LT5DIHByb2plY3QgKGlmIHlvdSBhcmUgYWxyZWFkeSBpbiB0aGUgQy9DKysgcGVyc3BlY3RpdmUgdGhpcyBtYXkgYmUgdGhlIHNpbXBsZXN0KS4KLTxicj5UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGdldCB0byB0aGlzIHdpemFyZCAoaW5jbHVkaW5nIGNvbnRleHQgbWVudSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3KS4gCi1FbnRlciBhIHByb2plY3QgbmFtZTsgdW5kZXIgUHJvamVjdCB0eXBlcywgZXhwYW5kICdleGVjdXRhYmxlJyBhbmQgc2VsZWN0LCBlLmcuICJNUEkgSGVsbG8gV29ybGQgQyBwcm9qZWN0IgotPGJyPgotPGltZyBzcmM9ImltYWdlcy9tcGlXaXphcmQucG5nIj4KLTxwPk5vdGU6IGlmIHlvdSBoYXZlIG5vdCBzZXQgdGhlIE1QSSBQcmVmZXJlbmNlcyB5ZXQsIHlvdSdsbCBiZSBwcm9tcHRlZCBhdCB0aGlzIHBvaW50OgotPGJyPjxpbWcgc3JjPSJpbWFnZXMvbXBpUHJlZnNIYXZlTm90QmVlblNldC5wbmciPgotPHA+Jm5ic3A7Ci08cD5TZWUgdGhlIGFib3ZlIDxhIGhyZWY9IiNwcmVmcyI+U3BlY2lmeSB0aGUgTVBJIGluY2x1ZGUgcGF0aCBpbiBwcmVmZXJlbmNlczwvYT4gZm9yIGhvdyB0byBmaWxsIHRoaXMgaW4uCi08cD5BZnRlciBzcGVjaWZ5aW5nIHRoZSBwcmVmZXJlbmNlcywgb3IgaWYgaXQgd2Fzbid0IHJlcXVpcmVkLCBzZWxlY3QgTmV4dCB0byBnbyB0byB0aGUgbmV4dCBwYWdlIG9mIHRoZSBOZXcgUHJvamVjdCBXaXphcmQuCi0KLTxicj5PbiB0aGUgbmV4dCBwYWdlLCB0aGUgQmFzaWMgU2V0dGluZ3MgcGFnZSBvZiB0aGUgd2l6YXJkLCBmaWxsIGluIGFueSBwcm9qZWN0IHRlbXBsYXRlIHZhbHVlcywgZS5nLiB5b3VyIG5hbWUuCi08YnI+VGhlbiBzZWxlY3QgTmV4dC4KLTxicj48aW1nIHNyYz0iaW1hZ2VzL21waVdpemFyZDIuZ2lmIj4KLTxwPk9uIHRoZSBuZXh0IHBhZ2UsICJNUEkgUHJvamVjdCBTZXR0aW5ncyIgcGFnZSwgIHRoZSAiQWRkIE1QSSBwcm9qZWN0IHNldHRpbmdzIHRvIHRoaXMgcHJvamVjdCIgc2hvdWxkIGJlIGNoZWNrZWQuCi1JZiB5b3Ugd2FudCB0byBjaGFuZ2UgYW55IG9mIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBwcm9qZWN0LCB5b3UgY2FuIGRvIHNvCi1oZXJlIGJ5IHVuY2hlY2tpbmcgdGhlICJVc2UgZGVmYXVsdCBpbmZvcm1hdGlvbiIgYW5kIGFsdGVyaW5nIHRoZSB2YWx1ZXMuCi1UaGUgZGVmYXVsdCB2YWx1ZXMgd2VyZSBjaG9zZW4gYmFzZWQgb24geW91ciBpbnB1dCB0byB0aGUgUExEVCBQcmVmZXJlbmNlcyBhYm92ZS4KLQotPGJyPjxpbWcgc3JjPSJpbWFnZXMvbXBpV2l6YXJkMy5naWYiPgotPHA+U2VsZWN0IEZpbmlzaC4KLTxwPlRoZSBwcm9qZWN0IGlzIGNyZWF0ZWQgYW5kIHNob3VsZCBidWlsZCBhdXRvbWF0aWNhbGx5LgotVGhlIEVjbGlwc2Ugd29ya2JlbmNoIGlzIHNob3duIGJlbG93IGFmdGVyIGNyZWF0aW5nIHRoZSBuZXcgIk1QSSBoZWxsbyB3b3JsZCIgcHJvamVjdC4KLVRoZSBwcm9qZWN0IGV4cGxvcmVyIHZpZXcgb24gdGhlIGxlZnQgc2hvd3MgdGhlIHByb2plY3QgY29udGVudHMuCi1UaGUgc291cmNlIGZpbGUgaXMgdW5kZXIgdGhlICdzcmMnIGRpcmVjdG9yeTsgZXhwYW5kIHRoaXMgdG8gc2VlIGl0LgotRG91YmxlLWNsaWNrIG9uIHRoZSBzb3VyY2UgZmlsZSBuYW1lIHRvIGVkaXQgdGhlIHNvdXJjZSBmaWxlLiAgVGhlIG91dGxpbmUgdmlldyBvbiB0aGUKLXJpZ2h0IHNob3dzIHRoZSBvdXRsaW5lIG9mIHRoZSBmaWxlIGN1cnJlbnRseSBzaG93biBpbiB0aGUgZWRpdG9yLgotVGhlIENvbnNvbGUgdmlldyBhdCB0aGUgYm90dG9tIHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9qZWN0IGJ1aWxkLgotCi08YnI+PGltZyBzcmM9ImltYWdlcy9tcGlOZXdQcm9qZWN0V29ya2JlbmNoLmdpZiI+Ci08cD4KLTxwPjxwPk5vdyBjb250aW51ZSB0byBzZXQgdXAgdG8gPGEgaHJlZj0icnVuLmh0bWwiPnJ1biB0aGUgTVBJIHRvb2xzPC9hPgotPHA+Ci08aDIgaWQ9Im1hbnVhbCI+QWRkIHRoZSBCdWlsZCBJbmZvcm1hdGlvbiBNYW51YWxseTwvaDI+Ci08cD5JZiB0aGUgbmV3IHByb2plY3Qgd2l6YXJkIGlzbid0IHVzZWQgYXMgZGVzY3JpYmVkIAotYWJvdmUgdG8gc2V0IHRoZSBNUEkgaW5mb3JtYXRpb24gZm9yIGEgcHJvamVjdCwKLXRoZSBNUEkgaW5mb3JtYXRpb24gY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0IG1hbnVhbGx5IGFzIGZvbGxvd3MuCi08b2w+Ci08bGk+Q3JlYXRlIGEgQyBwcm9qZWN0IAotPHVsPgotCi08bGk+Tm90ZTogdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBpcyBmb3IgYSByZWd1bGFyIEMgcHJvamVjdCAoYWxzbyBrbm93biBhcyBhICJNYW5hZ2VkIEJ1aWxkIiBDRFQgcHJvamVjdCkuCi1Gb3IgaW5mb3JtYXRpb24gYWJvdXQgTWFrZWZpbGUgcHJvamVjdHMsIGluIHdoaWNoIHlvdSBwcm92aWRlIHRoZSBtYWtlZmlsZSB5b3Vyc2VsZiwgCi1zZWUgPGEgaHJlZj0ic2V0dXBNYWtlZmlsZVByb2plY3QuaHRtbCI+U2V0dXAgZm9yIE1ha2VmaWxlIHByb2plY3RzPC9hPi4KLTwvbGk+Ci08L3VsPgotPGxpPlNldCB1cCB0aGUgaW5jbHVkZSBwYXRocyBldGM6Ci08YnI+VG8gYnJpbmcgdXAgdGhlIFByb2plY3QgUHJvcGVydGllcywgcmlnaHRNb3VzZSBvbiB0aGUgcHJvamVjdCBuYW1lLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIiAoYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGV4dCBtZW51IGxpc3QpCi08YnI+UHJvamVjdCBQcm9wZXJ0aWVzLCBDL0MrKyBCdWlsZCwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncywKLVRvb2wgU2V0dGluZ3MgdGFiLCBEaXJlY3RvcmllcwotPGJyPi0tPiBBZGQgaW5jbHVkZSBwYXRoIGZvciBtcGkgaGVhZGVyIGZpbGVzIGV0Yy4gLSBwYXRoIHRvIHRoZSAnaW5jbHVkZScgZGlyCi08YnI+PGltZyBzcmM9ImltYWdlcy9pbmNsdWRlLnBuZyI+Ci08cD4mbmJzcDsKLTxwPgotUHJvamVjdCBQcm9wZXJ0aWVzLCBDL0MrKyBCdWlsZCwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncywKLVRvb2wgU2V0dGluZ3MgdGFiLCBHQ0MgQyBMaW5rZXIsIExpYnJhcmllcwotPG9sPgotPGxpPlVuZGVyICJMaWJyYXJpZXMgKC1sKSIgIGFkZCB0aGUgc3ltYm9sICJtcGkiICAKLTxsaT4gVW5kZXIgIkxpYnJhcnkgc2VhcmNoIHBhdGggKC1MKSIgYWRkIHRoZSBwYXRoIHRvIHRoZSAnbGliJyBkaXIgaW4gTVBJIGRpci4KLTxicj48aW1nIHNyYz0iaW1hZ2VzL2xpYi5wbmciPgotPHA+Jm5ic3A7Ci08bGk+PGI+TVBJIEJ1aWxkIENvbW1hbmQ6PC9iPiBOb3RlOiBJZiB5b3UgaGF2ZSBhbiBNUEkgaW5zdGFsbGVkIHRoYXQgcmVxdWlyZXMgYSBkaWZmZXJlbnQKLWJ1aWxkIGNvbW1hbmQsIHN1Y2ggYXMgJ21waWNjJyBpbnN0ZWFkIG9mICdnY2MnLCBzcGVjaWZ5IGl0IGhlcmUgYXMgd2VsbC4KLVNlbGVjdCB0aGUgY29tcGlsZXIgdG9vbCBvbiB0aGUgbGVmdCBhbmQgbW9kaWZ5IHRoZSAnQ29tbWFuZDonIHZhbHVlLgotWW91IHByb2JhYmx5IGFsc28gbmVlZCB0byBkbyB0aGUgc2FtZSBmb3IgdGhlIGxpbmtlciB0b29sLgotPGJyPjxpbWcgc3JjPSJpbWFnZXMvbXBpQnVpbGRDb21tYW5kLnBuZyI+Ci08L29sPgotPHA+Ci0KLTwvb2w+Ci08cD5Ob3RlIHRoYXQgdGhlIGFib3ZlIGluc3RydWN0aW9ucyBkZXNjcmliZSBob3cgdG8gYWRkIGluZm9ybWF0aW9uIHRvIEMgcHJvamVjdHMgaW4gd2hpY2ggdGhlIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBmb3IgeW91LAotcHJldmlvdXNseSBrbm93biBhcyAiTWFuYWdlZCBCdWlsZCIgcHJvamVjdHMuICBJZiB5b3UgcHJvdmlkZSB5b3VyIG93biBtYWtlZmlsZSwgeW91IHdpbGwgY3JlYXRlIGEgIk1ha2VmaWxlIHByb2plY3QiCi1hbmQgY3JlYXRlIHRoZSBtYWtlZmlsZSB3aXRoaW4gdGhhdCBwcm9qZWN0LgotU2VlIDxhIGhyZWY9Im1ha2VmaWxlU2V0dXAuaHRtbCI+U2V0dGluZyB1cCBwcm9qZWN0IHByb3BlcnRpZXMgZm9yIGEgTWFrZWZpbGUgcHJvamVjdDwvYT4uCi08cD5Ob3cgY29udGludWUgdG8gc2V0IHVwIHRvIDxhIGhyZWY9InJ1bi5odG1sIj5ydW4gdGhlIE1QSSB0b29sczwvYT4KLQotPHA+Jm5ic3A7Ci08cD4mbmJzcDs8cD4mbmJzcDs8cD4mbmJzcDsKLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gVG9wPC9hPiB8IDxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NldHVwTWFrZWZpbGVQcm9qZWN0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvc2V0dXBNYWtlZmlsZVByb2plY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiZmZhZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvc2V0dXBNYWtlZmlsZVByb2plY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+Ci1QTERUIHNldHVwIGZvciBNYWtlZmlsZSBwcm9qZWN0cwotPC90aXRsZT4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPGgxIGlkPSJ0b3AiPlBMRFQgc2V0dXAgZm9yIE1ha2VmaWxlIHByb2plY3RzPC9oMT4KLTxoMj5NYWtlZmlsZSB2cy4gQyBwcm9qZWN0czwvaDI+Ci08cD5XaGVuIHlvdSB1c2UgdGhlIENEVCBuZXcgcHJvamVjdCB3aXphcmRzLAoteW91IHdpbGwgc2VlIHNldmVyYWwgdHlwZXMgb2YgcHJvamVjdHMuCi1BIHJlZ3VsYXIgIkMgUHJvamVjdCwiIGZvciBleGFtcGxlLCB3aWxsIGNyZWF0ZSBhbmQgbWFuYWdlIHRoZSBtYWtlZmlsZSBhbmQgYnVpbGRpbmcgZm9yIHlvdS4KLVRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBhICJNYW5hZ2VkIEJ1aWxkIiBQcm9qZWN0LgotPHA+SWYgeW91IHdhbnQgdG8gcHJvdmlkZSB5b3VyIG93biBtYWtlZmlsZSwgeW91IHdpbGwgY3JlYXRlIGEgIk1ha2VmaWxlIHByb2plY3QiCi1hbmQgY3JlYXRlIHRoZSBtYWtlZmlsZSB3aXRoaW4gdGhhdCBwcm9qZWN0LgotPHA+PGltZyBzcmM9ImltYWdlcy9tYWtlZmlsZVByb2plY3QucG5nIj4KLTxwPkZvciBhIE1ha2VmaWxlIHByb2plY3QsIHRoZSBQcm9qZWN0IFByb3BlcnRpZXMgbG9vayBhIGJpdCBkaWZmZXJlbnQuCi1UbyBicmluZyB1cCB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIGRpYWxvZywgcmlnaHRNb3VzZSBvbiB0aGUgcHJvamVjdCBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LAotYW5kIGNob29zZSAiUHJvcGVydGllcyIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGV4dCBtZW51LgotPHA+Jm5ic3A7Ci08cD48aW1nIHNyYz0iaW1hZ2VzL21ha2VmaWxlUHJvalByb3BzLnBuZyI+Ci08cD5TZXQgdXAgdGhlIGluY2x1ZGVzIHRvIHBvaW50IHRvIHlvdXIgTVBJIChvciBPcGVuTVAsIG9yIFVQQywgb3IgTEFQSSkgaW5jbHVkZSBwYXRoLgotPHA+WW91IHNldCB1cCB0aGUgUExEVCBwcmVmZXJlbmNlcyB0aGUgc2FtZSB3YXkgYXMgZm9yIHJlZ3VsYXIgQyAoTWFuYWdlZCBCdWlsZCkgcHJvamVjdHMuCi0KLTxwPiZuYnNwOwotPHA+Jm5ic3A7PHA+Jm5ic3A7PHA+Jm5ic3A7Ci08cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIFRvcDwvYT4gfCA8YSBocmVmPSJ0b2MuaHRtbCI+QmFjayB0byBUYWJsZSBvZiBDb250ZW50czwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC9zZXR1cE9NUC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NldHVwT01QLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmY0MTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3NldHVwT01QLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotU2V0dXAgZm9yIFBUUCBQTERUIE9wZW5NUCBUb29scwotPC90aXRsZT4KLTwvaGVhZD4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLTxib2R5PgotCi08aDEgaWQ9InRvcCI+IFNldHVwIGZvciBQVFAgT3Blbk1QIFRvb2xzIDwvaDE+Ci0KLTxwPlRoZSBiYXNpYyBzZXR1cCBmb3IgdGhlIE9wZW5NUCB0b29scyBpcyB0aGUgc2FtZQotYXMgZm9yIHRoZSA8YSBocmVmPSJzZXR1cC5odG1sIj5NUEkgdG9vbHMgc2V0dXA8L2E+LgotRXNzZW50aWFsbHksIHBvaW50IENEVCBhdCB0aGUgaGVhZGVyIGZpbGVzIGFuZCBhdCB0aGUgY29tbWFuZAotdG8gY2FsbCB5b3VyIGNvbXBpbGVyIHdpdGggdGhlIE9wZW5NUCBpbmZvcm1hdGlvbi4KLTxwPlRoZSBPcGVuTVAgcHJlZmVyZW5jZXMgc2hvdWxkIGJlIHNldCB0byBwb2ludCB0byB5b3VyIE9wZW5NUCBoZWFkZXIgZmlsZS4KLUlmIHlvdSBkb24ndCBzZXQgdGhpcyB1cCBwcmlvciB0byB1c2luZyB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIG1ha2UgYW4KLU9wZW5NUCBwcm9qZWN0LCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBkbyBzbyBhdCB0aGF0IHRpbWUuCi08YnI+PGltZyBzcmM9ImltYWdlcy9vcGVubXBQcmVmcy5naWYiPgotPHA+VGhlIFBMRFQgbmV3IHByb2plY3Qgd2l6YXJkcyBub3cgY29udGFpbiB3aXphcmRzIGZvciBjcmVhdGluZyBPcGVuTVAgcHJvamVjdHMgYXMgd2VsbC4KLTxicj48aW1nIHNyYz0iaW1hZ2VzL25ld1Byb2pPcGVuTVAuZ2lmIj4KLTxwPkJlIHN1cmUgb24gdGhlIHByb2plY3Qgc2V0dGluZ3MgcGFnZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmlsbGVkIGluLCBpbmNsdWRpbmcgdGhlIGJ1aWxkIGNvbW1hbmQuCi1Nb3N0IG9mIHRoZXNlIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB5b3VyIGVudHJpZXMgaW4gdGhlIFBMRFQgcHJlZmVyZW5jZXMgcGFnZXMuCi08YnI+PGltZyBzcmM9ImltYWdlcy9uZXdQcm9qT3Blbk1Qc2V0dGluZ3MuZ2lmIj4KLQotCi0KLTxicj5Zb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgYWx0ZXIgdGhlIHByb2plY3QgYnVpbGQgcHJvcGVydGllcyAoaW4gdGhlIHByb2plY3QgcHJvcGVydGllcykgdG8gYWRkIGNvbXBpbGVyIGZsYWdzCi1zcGVjaWZpYyB0byBPcGVuTVAgdG8geW91ciBwcm9qZWN0LgotPGJyPjxpbWcgc3JjPSJpbWFnZXMvb21wQ29tcGlsZXJPcHQucG5nIj4KLTxwPllvdSBwcm9iYWJseSBuZWVkIHRvIGRvIHRoaXMgZm9yIHRoZSBMaW5rZXIgYXMgd2VsbCBhcyB0aGUgQ29tcGlsZXIgb3B0aW9uLgotPHA+Tm90ZSB0aGUgaGVhZGVyIGZpbGUgbmFtZSBpbiB5b3VyIHN5c3RlbSwgZS5nLiA8Y29kZT5vcGVubXAuaDwvY29kZT4gdnMgPGNvZGU+b21wLmg8L2NvZGU+OyB5b3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBpbmNsdWRlIGZpbGUKLWxpbmUgaW4gdGhlIHNhbXBsZSBzb3VyY2UgZmlsZSB0byBtYXRjaCB5b3VyIHN5c3RlbS4KLTxicj48aW1nIHNyYz0iaW1hZ2VzL2hlYWRlck9NUC5wbmciCi08cD4mbmJzcDsKLTxwPk5vdyBzZXQgdXAgdG8gPGEgaHJlZj0icnVuT01QLmh0bWwiPnJ1biB0aGUgT3Blbk1QIGZlYXR1cmVzPC9hPi4KLTxwPiZuYnNwOwotPHA+Jm5ic3A7PHA+Jm5ic3A7PHA+Jm5ic3A7Ci08cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIFRvcDwvYT4gfCA8YSBocmVmPSJ0b2MuaHRtbCI+QmFjayB0byBUYWJsZSBvZiBDb250ZW50czwvYT4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC90aHVtYi5qcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC90aHVtYi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljMjdlYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvdGh1bWIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLS8vIEphdmFzY3JpcHQgdG8gcHJvdmlkZSBhIGNvbnZlbmllbnQgd2F5IHRvIHNob3cgYSB0aHVtYm5haWwgb2YgYW4gaW1hZ2UsIHdpdGggYSBsaW5rIHRvIHRoZSBmdWxsLXNpemUgaW1hZ2UKLS8vIERlZmF1bHQgaGVpZ2h0IGlzIDEyMCBpZiB0aGUgc2Vjb25kIGFyZyBpcyBvbWl0dGVkCi0vL05vdGUgdGhhdCBJRSB1c2VzIHRoZSBhbHQgdGFnIGZvciBob3ZlciBidXQgRmlyZWZveCBtb3JlIGNvcnJlY3RseSB1c2VzIHRoZSB0aXRsZSB0YWcgZm9yIGhvdmVyIHRleHQuCi0vL1VzYWdlOiA8c2NyaXB0PiB0aHVtYigiaW1hZ2VzL2Zvby5naWYiKTwvc2NyaXB0PgotZnVuY3Rpb24gdGh1bWIodXJsLGhlaWdodCl7Ci0gICBpZiAoIWhlaWdodCkge2hlaWdodD0xMjA7fQotICAgZG9jdW1lbnQud3JpdGUgKCI8YSBocmVmPSciK3VybCsiJz48aW1nIHNyYz0nIit1cmwrIicgaGVpZ2h0PSIraGVpZ2h0KyIgdGl0bGU9J0NsaWNrIGZvciBhIGZ1bGwtc2l6ZSBpbWFnZScgYWx0PSdDbGljayBmb3IgYSBmdWxsLXNpemUgaW1hZ2UnPjwvYT4iKTsKLX0KLS8vIHNpbXBsZSBpbWJlZGRpbmcgb2YgaW1hZ2UsIGluIGRlZmF1bHQgZnVsbCBzaXplLCB3aXRoIGJyZWFrIHByZWNlZWRpbmcKLS8vIChlYXN5IHRvIHJlcGxhY2UgdGhlIGFib3ZlIHdpdGggdGhpcyBvbmUpCi0vL1VzYWdlOiA8c2NyaXB0PiBmdWxsKCJpbWFnZXMvZm9vLmdpZiIpPC9zY3JpcHQ+Ci1mdW5jdGlvbiBmdWxsKHVybCl7Ci0gICBkb2N1bWVudC53cml0ZSAoIjxpbWcgc3JjPSciK3VybCsiJz4iKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3RvYy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3RvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzVhNjdiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC90b2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+Ci1QVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgCi08L3RpdGxlPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImhlbHAuY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0aHVtYi5qcyI+IDwvc2NyaXB0PgotCTwvaGVhZD4KLTxib2R5PgotPGgxIGlkPSJ0b3AiPiA8aW1nIHNyYz0iaW1hZ2VzL2FuYWx5emUuZ2lmIj4gUFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIDwvaDE+Ci08cD5SZWxlYXNlIDIuMQotCi08aDI+SGVscCBUb3BpY3M8L2gyPgotPGEgaHJlZj0ib3ZlcnZpZXcuaHRtbCI+UExEVCBPdmVydmlldywgcHJlLXJlcXVpc2l0ZXMsIGV0Yy48L2E+Ci08cD48YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9QVFAvcmVsZWFzZV9ub3Rlcy8yLjEiPkJhc2ljIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nIEVjbGlwc2UsIENEVCwgUFRQLCBhbmQgUExEVDwvYT4KLWZyb20gdGhlIEVjbGlwc2UgUFRQIHdlYiBzaXRlLgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgZGVzY3JpYmUgc2V0dXAgYW5kIHJ1biBpbmZvcm1hdGlvbi4KLTxoMz5NUEk8L2gzPgotPHVsPjxsaT4KLTxhIGhyZWY9InNldHVwLmh0bWwiPlNldHVwIGZvciBidWlsZGluZyBhbmQgcnVubmluZyBQVFAgTVBJIFRvb2xzPC9hPgotPC9saT4KLTxsaT4KLTxhIGhyZWY9InJ1bi5odG1sIj5SdW5uaW5nIFBUUCBNUEkgVG9vbHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJiYXJyaWVyLmh0bWwiPk1QSSBCYXJyaWVyIEFuYWx5c2lzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBpVGVtcGxhdGVzLmh0bWwiPk1QSSBUZW1wbGF0ZXM8L2E+PC9saT4KLTwvdWw+Ci08cD4KLTxoMz5PcGVuTVA8L2gzPgotPHVsPjxsaT4KLTxhIGhyZWY9InNldHVwT01QLmh0bWwiPlNldHVwIGZvciBidWlsZGluZyBhbmQgcnVubmluZyBQVFAgT3Blbk1QIFRvb2xzPC9hPgotPC9saT4KLTxsaT4KLTxhIGhyZWY9InJ1bk9NUC5odG1sIj5SdW5uaW5nIFBUUCBPcGVuTVAgVG9vbHM8L2E+PC9saT4KLTxsaT4KLTxhIGhyZWY9Im9wZW5NUGV4dHJhLmh0bWwiPkFkZGl0aW9uYWwgT3Blbk1QIFRvb2xzIDwvYT4KLTwvbGk+Ci08L3VsPgotPGgzPlVQQzwvaDM+Ci08dWw+Ci08bGk+Ci08YSBocmVmPSJydW5VUEMuaHRtbCI+U2V0dGluZyB1cCBhbmQgUnVubmluZyBVUEMgVG9vbHM8L2E+PC9saT4KLTwvbGk+Ci08L3VsPgotPGgzPk1ha2VmaWxlIHZzLiBNYW5hZ2VkIEJ1aWxkIHByb2plY3RzPC9oMz4KLTx1bD4KLTxsaT48YSBocmVmPSJzZXR1cE1ha2VmaWxlUHJvamVjdC5odG1sIj5TZXR0aW5nIHVwIE1ha2VmaWxlIHByb2plY3RzPC9hPjwvbGk+Ci08L3VsPgotPGEgaHJlZj0id2hhdHNuZXcuaHRtbCI+TmV3IGFuZCBOb3Rld29ydGh5IDwvYT48L2xpPiAtIHdoYXQncyBuZXcgaW4gUExEVCAyLjEKLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC90cmFjaW5nLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2h0bWwvdHJhY2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdkZTEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC90cmFjaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotUFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIC0gVHJhY2luZwotPC90aXRsZT4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLQk8L2hlYWQ+Ci08Ym9keT4KLTxoMSBpZD0idG9wIj4gPGltZyBzcmM9ImltYWdlcy9hbmFseXplLmdpZiI+IFBMRFQgVHJhY2luZzwvaDE+Ci0KLTxsaT5UcmFjaW5nIGlzIGVuYWJsZWQgaW4gUExEVC4gIFRvIHVzZSB0aGlzOgotPHA+Ci1DcmVhdGUgYSBmaWxlICIub3B0aW9ucyIgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgZWNsaXBzZSBleGVjdXRhYmxlLgotUHV0IHRoaXMgaW4gdGhlIGZpbGU6Ci08cHJlPgotICAgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2RlYnVnID0gdHJ1ZQotICAgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uL2RlYnVnL3BsZHRUcmFjZSA9IHRydWUKLTwvcHJlPgotVGhlbiBsYXVuY2ggZWNsaXBzZSBpbiBkZWJ1ZyBtb2RlIHVzaW5nIHRoZSAtZGVidWcgb3B0aW9uLCBhbmQgbWlycm9yIHRoZQotQ29uc29sZSB2aWV3IG91dHB1dAotdG8gdGhlIGNvbW1hbmQgbGluZSBjb25zb2xlIHVzaW5nIHRoZSAtY29uc29sZUxvZyBvcHRpb24uICAoTWF5YmUgTGludXggYWxyZWFkeQotc3BpdHMgb3V0IHRoZSBjb25zb2xlLCBub3Qgc3VyZS4pCi08cHJlPgotICAgZWNsaXBzZSAtZGVidWcgLWNvbnNvbGVMb2cKLTwvcHJlPgotV2hlbiB5b3UgcnVuIHdpdGggdGhpcyB0cmFjaW5nIGVuYWJsZWQsICBpdCB3aWxsIHByaW50IG91dCBhIGJ1bmNoIG9mCi10cmFjZSBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS4gIEF0IGxlYXN0IE1QSSBhcnRpZmFjdCBhbmFseXNpcwotaGFzIGJlZW4gZW5hYmxlZCBmb3IgdXNlci1kaXJlY3RlZCB0cmFjaW5nLgotPHA+Jm5ic3A7Ci0gCi08cD5CYWNrIHRvIDxhIGhyZWY9InRvYy5odG1sIj5QTERUIFRhYmxlIG9mIENvbnRlbnRzPC9hPiBwYWdlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaHRtbC93aGF0c25ldy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3doYXRzbmV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOThmZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9odG1sL3doYXRzbmV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPgotUFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIAotPC90aXRsZT4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWxwLmNzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGh1bWIuanMiPiA8L3NjcmlwdD4KLQk8L2hlYWQ+Ci08Ym9keT4KLTxoMT4gPGltZyBzcmM9ImltYWdlcy9hbmFseXplLmdpZiI+IFBMRFQgLSBOZXcgYW5kIE5vdGV3b3J0aHkgPC9oMT4KLTxwPldoYXQncyBuZXcgaW4gMi4xCi08dWw+Ci08bGk+U21hcnRlciBOZXcgUHJvamVjdCBXaXphcmRzIHNldCB1cCBtb3JlIG9wdGlvbnMsIGFuZCBwcm9tcHQgdG8gc2V0IHVwCi1QTERUIHByZWZlcmVuY2VzIGlmIG5lZWRlZC4KLTxsaT48YSBocmVmPSJtcGlUZW1wbGF0ZXMuaHRtbCI+TVBJIFRlbXBsYXRlczwvYT4KLTxsaT48YSBocmVmPSJydW5VUEMuaHRtbCI+VVBDIGFzc2lzdGFuY2UgdG9vbHM8L2E+Ci08L3VsPgotCi0KLTwvdWw+Ci08cD4mbmJzcDsKLTxwPjxhIGhyZWY9InRvYy5odG1sIj5CYWNrIHRvIFRhYmxlIG9mIENvbnRlbnRzPC9hPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vY3NzL2dyYXBoaWNzLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODVlOGJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vY3NzL2dyYXBoaWNzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaHVtYnMuZGIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vY3NzL2dyYXBoaWNzL2NkdF9pY29uX2NyZWF0ZV9jcHJvamVjdC5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9jZHRfaWNvbl9jcmVhdGVfY3Byb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzUxMmQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vY3NzL2dyYXBoaWNzL2NkdF9pY29uX2NyZWF0ZV9jcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9zYW1wbGUuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9pbnRyby9jc3MvZ3JhcGhpY3Mvc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmMWZmYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9pbnRyby9jc3MvZ3JhcGhpY3Mvc2FtcGxlX2hvdi5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9zYW1wbGVfaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3NDE2NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9ncmFwaGljcy9zYW1wbGVfaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vY3NzL3NhbXBsZS5jc3MgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL2Nzcy9zYW1wbGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJhODQzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vY3NzL3NhbXBsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYSNvcmdlY2xpcHNlcHRwcGxkdHdlbGNvbWUtaW50cm9MaW5rIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3Mvc2FtcGxlLmdpZik7IH0KLWEjb3JnZWNsaXBzZXB0cHBsZHR3ZWxjb21lLWludHJvTGluazpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL3NhbXBsZV9ob3YuZ2lmKTsgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vcGxkdE92ZXJ2aWV3LnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vcGxkdE92ZXJ2aWV3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2Y2Y5Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL3BsZHRPdmVydmlldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTxpbnRyb0NvbnRlbnQ+Ci0gIAk8ZXh0ZW5zaW9uQ29udGVudCBpZD0ib3JnZWNsaXBzZXB0cHBsZHR3ZWxjb21lLWludHJvRXh0ZW5zaW9uIiBzdHlsZT0iY3NzL3NhbXBsZS5jc3MiIAotICAJbmFtZT0iUExEVCBXZWxjb21lIEV4dGVuc2lvbiIgcGF0aD0ib3ZlcnZpZXcvQCI+Ci0JCTxncm91cCBzdHlsZS1pZD0iY29udGVudC1ncm91cCIgaWQ9Im9yZ2VjbGlwc2VwdHBwbGR0d2VsY29tZS1pbnRyb0xpbmstZ3JvdXAiPgotCQkJPGxpbmsgbGFiZWw9IlBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIiBpZD0ib3JnZWNsaXBzZXB0cHBsZHR3ZWxjb21lLWludHJvTGluayIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayIKLSAgICAgICAJCSAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAvaHRtbC90b2MuaHRtbCIgPgotICAgICAgIAkJPHRleHQ+TGVhcm4gbW9yZSBhYm91dCBQTERULCB0byBoZWxwIGluIGRldmVsb3BpbmcgTVBJIGFuZCBPcGVuTVAgcHJvZ3JhbXMuPC90ZXh0PgotICAgICAgICAgIAk8L2xpbms+Ci0gICAgICAgCTwvZ3JvdXA+Ci0gIAk8L2V4dGVuc2lvbkNvbnRlbnQ+Ci08L2ludHJvQ29udGVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL3BsZHRUdXRvcmlhbC54bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL3BsZHRUdXRvcmlhbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGM2NDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9pbnRyby9wbGR0VHV0b3JpYWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Ci08aW50cm9Db250ZW50PgotICAJPGV4dGVuc2lvbkNvbnRlbnQgaWQ9Im9yZ2VjbGlwc2VwdHBwbGR0d2VsY29tZS1pbnRyb0V4dGVuc2lvbiIgc3R5bGU9ImNzcy9zYW1wbGUuY3NzIiBuYW1lPSJTYW1wbGUgRXh0ZW5zaW9uIiBwYXRoPSJ0dXRvcmlhbHMvQCI+Ci0JCTxncm91cCBzdHlsZS1pZD0iY29udGVudC1ncm91cCIgaWQ9Im9yZ2VjbGlwc2VwdHBwbGR0d2VsY29tZS1pbnRyb0xpbmstZ3JvdXAiPgotICAgICAgIAkJPGxpbmsgbGFiZWw9IlBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIiAKLSAgICAgICAJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAvaHRtbC9zZXR1cC5odG1sIiAKLSAgICAgICAJCWlkPSJvcmdlY2xpcHNlcHRwcGxkdHdlbGNvbWUtaW50cm9MaW5rIiBzdHlsZS1pZD0iY29udGVudC1saW5rIj4KLSAgICAgICAgICAJCTx0ZXh0PkxlYXJuIGhvdyB0byB1c2UgdGhlIGRldmVsb3BtZW50IHRvb2xzIGZvciBwYXJhbGxlbCBwcm9ncmFtbWluZyBpbiBQTERULjwvdGV4dD4KLSAgICAgICAJCTwvbGluaz4KLSAgICAgICAJPC9ncm91cD4KLSAgCTwvZXh0ZW5zaW9uQ29udGVudD4KLTwvaW50cm9Db250ZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vcGxkdFdoYXRzbmV3LnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvaW50cm8vcGxkdFdoYXRzbmV3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4OTRlZi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL2ludHJvL3BsZHRXaGF0c25ldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTxpbnRyb0NvbnRlbnQ+Ci0gIAk8ZXh0ZW5zaW9uQ29udGVudCBpZD0ib3JnZWNsaXBzZXB0cHBsZHR3ZWxjb21lLWludHJvRXh0ZW5zaW9uIiBzdHlsZT0iY3NzL3NhbXBsZS5jc3MiIAotICAJbmFtZT0iUExEVCB3aGF0cyBuZXcgRXh0ZW5zaW9uIiBwYXRoPSJ3aGF0c25ldy9AIj4KLQkJPGdyb3VwIHN0eWxlLWlkPSJjb250ZW50LWdyb3VwIiBpZD0ib3JnZWNsaXBzZXB0cHBsZHR3ZWxjb21lLWludHJvTGluay1ncm91cCI+Ci0gICAgICAgCQk8bGluayBsYWJlbD0iUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMiIAotICAgICAgIAkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucHRwLnBsZHQuaGVscC9odG1sL3doYXRzbmV3Lmh0bWwiIAotICAgICAgIAkJaWQ9Im9yZ2VjbGlwc2VwdHBwbGR0d2VsY29tZS1pbnRyb0xpbmsiIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiPgotICAgICAgICAgIAkJPHRleHQ+RmluZCBvdXQgdGhlIG5ldyBmZWF0dXJlcyBpbiBQTERUIDIuMC48L3RleHQ+Ci0gICAgICAgCQk8L2xpbms+Ci0gICAgICAgCTwvZ3JvdXA+Ci0gIAk8L2V4dGVuc2lvbkNvbnRlbnQ+Ci08L2ludHJvQ29udGVudD4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWRkYmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgVXNlciBHdWlkZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiZDQxNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi0KLQotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYwotICAgICAgICAgICAgZmlsZT0idG9jLnhtbCIKLSAgICAgICAgICAgIHByaW1hcnk9InRydWUiLz4KLSAgICAgIDxpbmRleCBwYXRoPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwLmluZGV4MSIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZ0V4dGVuc2lvbiI+Ci0gICAgICA8Y29uZmlnRXh0ZW5zaW9uCi0gICAgICAgICAgICBjb250ZW50PSJpbnRyby9wbGR0T3ZlcnZpZXcueG1sIgotICAgICAgICAgICAgY29uZmlnSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbENvbmZpZyI+Ci0gICAgICA8L2NvbmZpZ0V4dGVuc2lvbj4KLSAgIAotICAgICAgPGNvbmZpZ0V4dGVuc2lvbgotICAgICAgICAgICAgY29uZmlnSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbENvbmZpZyIKLSAgICAgICAgICAgIGNvbnRlbnQ9ImludHJvL3BsZHRXaGF0c25ldy54bWwiPgotICAgICAgPC9jb25maWdFeHRlbnNpb24+Ci0gIAotICAgICAgPGNvbmZpZ0V4dGVuc2lvbgotICAgICAgICAgICAgY29uZmlnSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbENvbmZpZyIKLSAgICAgICAgICAgIGNvbnRlbnQ9ImludHJvL3BsZHRUdXRvcmlhbC54bWwiPgotICAgICAgPC9jb25maWdFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5kb2MudXNlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvaGVscC9IZWxwUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9oZWxwL0hlbHBQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkZDEwNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9oZWxwL0hlbHBQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuaGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEhlbHBQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gICAgLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2UuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGVscFBsdWdpbiBwbHVnaW47Ci0gICAgLyoqIFJlc291cmNlIGJ1bmRsZSAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgICAgcmVzb3VyY2VCdW5kbGU7Ci0gICAgLyoqIHRoZSBwbHVnLWluIElEICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGVscFBsdWdpbigpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSGVscFBsdWdpbiBnZXREZWZhdWx0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBIZWxwUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnB0cC5wbGR0LmhlbHAuSGVscFBsdWdpblJlc291cmNlcyIpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvdXJjZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvdG9jLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQuZG9jLnVzZXIvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNGZkYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iUFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIiB0b3BpYz0iaHRtbC90b2MuaHRtbCI+Ci0gICA8dG9waWMgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIiBsYWJlbD0iT3ZlcnZpZXciLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iU2V0dXAgZm9yIFBUUCBNUEkgdG9vbHMiICBocmVmPSJodG1sL3NldHVwLmh0bWwiLz4gCi0gICAgICA8dG9waWMgbGFiZWw9IlJ1bm5pbmcgUFRQIE1QSSB0b29scyIgIGhyZWY9Imh0bWwvcnVuLmh0bWwiLz4gCi0gICAgICAgICAgIDx0b3BpYyBsYWJlbD0iU2V0dXAgZm9yIFBUUCBPcGVuTVAgdG9vbHMiICBocmVmPSJodG1sL3NldHVwT01QLmh0bWwiLz4gCi0gICAgICA8dG9waWMgbGFiZWw9IlJ1bm5pbmcgUFRQIE9wZW5NUCB0b29scyIgIGhyZWY9Imh0bWwvcnVuT01QLmh0bWwiLz4gCi0gICA8dG9waWMgaHJlZj0iaHRtbC9iYXJyaWVyLmh0bWwiIGxhYmVsPSJNUEkgQmFycmllciBBbmFseXNpcyI+Ci0gICA8L3RvcGljPiAKLSAgICAgIDx0b3BpYyBocmVmPSJodG1sL3J1blVQQy5odG1sIiBsYWJlbD0iVVBDIHRvb2xzIi8+Ci0gICA8dG9waWMgaHJlZj0iaHRtbC93aGF0c25ldy5odG1sIiBsYWJlbD0iTmV3IGFuZCBOb3Rld29ydGh5Ii8+Ci0KLQotCi0KLQotPC90b2M+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOGRkMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1pY29ucy1vbGQKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmOTljMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwNjUxOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLkxhcGlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24sCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS5jZHQuZG9jLnVzZXIKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvYWJvdXQuaW5pIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvYWJvdXQubWFwcGluZ3MgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9hYm91dC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDc3YWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTkxTX01FU1NBR0VGT1JNQVRfTk9ORQotIyBOTFNfRU5DT0RJTkc9VVRGLTgKLQotYmx1cmI9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIExBUEkgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLUNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3B0cFxuCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Nzc5ZGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2VjbGlwc2UzMi5wbmcgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQWRkcl9nZXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQWRkcl9nZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjYTA1ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJfZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aDIgaWQ9ImxhZGRnIj5MQVBJX0FkZHJfZ2V0PC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5SZXRyaWV2ZXMKLWEgZnVuY3Rpb24gYWRkcmVzcyB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdXNpbmcgPHNwYW4gY2xhc3M9InBrIj5MQVBJX0FkZHJfc2V0PC9zcGFuPi4gIDxhIGlkPSJpZHgxMjYiIG5hbWU9ImlkeDEyNiI+PC9hPiA8YSBpZD0iaWR4MTI3IiBuYW1lPSJpZHgxMjciPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJfc2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJfc2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmJmYmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9BZGRyX3NldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJsYWRkcyI+TEFQSV9BZGRyX3NldDwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+UmVnaXN0ZXJzCi10aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLiAgPGEgaWQ9ImlkeDEyOCIgbmFtZT0iaWR4MTI4Ij48L2E+ICA8YSBpZD0iaWR4MTI5IiBuYW1lPSJpZHgxMjkiPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJlc3MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQWRkcmVzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDA0OTczLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQWRkcmVzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJhZGRyZXMiPkxBUElfQWRkcmVzczwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+UmV0dXJucyBhbgotdW5zaWduZWQgbG9uZyB2YWx1ZSBmb3IgYSBzcGVjaWZpZWQgdXNlciBhZGRyZXNzLiAgPGEgaWQ9ImlkeDEzMCIgbmFtZT0iaWR4MTMwIj48L2E+IDxhIGlkPSJpZHgxMzEiIG5hbWU9ImlkeDEzMSI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQWRkcmVzc19pbml0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJlc3NfaW5pdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDc1MWE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQWRkcmVzc19pbml0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08aDIgaWQ9ImxhZGRzaW5pdCI+TEFQSV9BZGRyZXNzX2luaXQ8L2gyPgotIDxoND5QdXJwb3NlPC9oND4KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+Q3JlYXRlcyBhIHJlbW90ZSBhZGRyZXNzIHRhYmxlLgotPC9wPgotPC9kaXY+Ci08aDQ+TGlicmFyeTwvaDQ+Ci08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPkF2YWlsYWJpbGl0eSBMaWJyYXJ5ICg8c3BhbiBjbGFzcz0icGsiPmxpYmxhcGlfci5hPC9zcGFuPik8L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJlc3NfaW5pdDY0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0FkZHJlc3NfaW5pdDY0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDcyMTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9BZGRyZXNzX2luaXQ2NC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJhZGRyZXNpNjQiPkxBUElfQWRkcmVzc19pbml0NjQ8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPkNyZWF0ZXMKLWEgNjQtYml0IHJlbW90ZSBhZGRyZXNzIHRhYmxlLiAgPGEgaWQ9ImlkeDEzNCIgbmFtZT0iaWR4MTM0Ij48L2E+PGEgaWQ9ImlkeDEzNSIgbmFtZT0iaWR4MTM1Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9BbXNlbmQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfQW1zZW5kLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODZiOWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9BbXNlbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxoMiBpZD0iYW1zZW5kIj5MQVBJX0Ftc2VuZDwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+VHJhbnNmZXJzCi1hIHVzZXIgbWVzc2FnZSB0byBhIHJlbW90ZSB0YXNrLCBvYnRhaW5pbmcgdGhlIHRhcmdldCBhZGRyZXNzIG9uIHRoZSByZW1vdGUKLXRhc2sgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGhlYWRlciBoYW5kbGVyLiA8YSBpZD0iaWR4MTM2IiBuYW1lPSJpZHgxMzYiPjwvYT4gPGEgaWQ9ImlkeDEzNyIgbmFtZT0iaWR4MTM3Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9BbXNlbmR2Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0Ftc2VuZHYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljYzJhNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0Ftc2VuZHYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxoMiBpZD0ibGFtc2VuZHYiPkxBUElfQW1zZW5kdjwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+VHJhbnNmZXJzCi1hIHVzZXIgdmVjdG9yIHRvIGEgcmVtb3RlIHRhc2ssIG9idGFpbmluZyB0aGUgdGFyZ2V0IGFkZHJlc3Mgb24gdGhlIHJlbW90ZQotdGFzayBmcm9tIGEgdXNlci1zcGVjaWZpZWQgaGVhZGVyIGhhbmRsZXIuIDxhIGlkPSJpZHgxMzgiIG5hbWU9ImlkeDEzOCI+PC9hPiA8YSBpZD0iaWR4MTM5IiBuYW1lPSJpZHgxMzkiPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0ZlbmNlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0ZlbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTNmYzAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9GZW5jZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJsZmVuY2UiPkxBUElfRmVuY2U8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPkVuZm9yY2VzIG9yZGVyCi1vbiBMQVBJIGNhbGxzLiAgPGEgaWQ9ImlkeDE0MCIgbmFtZT0iaWR4MTQwIj48L2E+ICA8YSBpZD0iaWR4MTQxIiBuYW1lPSJpZHgxNDEiPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0dldC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9HZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmNTk0NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0dldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJsZ2V0Ij5MQVBJX0dldDwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+Q29waWVzIGRhdGEgZnJvbQotYSByZW1vdGUgdGFzayB0byBhIGxvY2FsIHRhc2suICA8YSBpZD0iaWR4MTQyIiBuYW1lPSJpZHgxNDIiPjwvYT4gIDxhIGlkPSJpZHgxNDMiIG5hbWU9ImlkeDE0MyI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfR2V0Y250ci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9HZXRjbnRyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOGZiNzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9HZXRjbnRyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aDIgaWQ9ImxnZXRjIj5MQVBJX0dldGNudHI8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPkdldHMgdGhlCi1pbnRlZ2VyIHZhbHVlIG9mICBhIHNwZWNpZmllZCBMQVBJIGNvdW50ZXIuICAgPGEgaWQ9ImlkeDE0NCIgbmFtZT0iaWR4MTQ0Ij48L2E+ICA8YSBpZD0iaWR4MTQ1IiBuYW1lPSJpZHgxNDUiPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0dldHYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfR2V0di5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjBmNGZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfR2V0di5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJsZ2V0diI+TEFQSV9HZXR2PC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5Db3BpZXMgdmVjdG9ycwotb2YgZGF0YSBmcm9tIGEgcmVtb3RlIHRhc2sgdG8gYSBsb2NhbCB0YXNrLiA8YSBpZD0iaWR4MTQ2IiBuYW1lPSJpZHgxNDYiPjwvYT4gIDxhIGlkPSJpZHgxNDciIG5hbWU9ImlkeDE0NyI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfR2ZlbmNlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX0dmZW5jZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2UxNTQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfR2ZlbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08aDIgaWQ9ImxnZmVuY2UiPkxBUElfR2ZlbmNlPC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5FbmZvcmNlcyBvcmRlcgotb24gTEFQSSBjYWxscyBhY3Jvc3MgYWxsIHRhc2tzIGFuZCBwcm92aWRlcyBiYXJyaWVyIHN5bmNocm9uaXphdGlvbiBhbW9uZwotdGhlbS4gICA8YSBpZD0iaWR4MTQ4IiBuYW1lPSJpZHgxNDgiPjwvYT4gIDxhIGlkPSJpZHgxNDkiIG5hbWU9ImlkeDE0OSI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfSW5pdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Jbml0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTBkOGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Jbml0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aDIgaWQ9Imxpbml0Ij5MQVBJX0luaXQ8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPkluaXRpYWxpemVzCi1hIExBUEkgY29udGV4dC4gIDxhIGlkPSJpZHgxNTAiIG5hbWU9ImlkeDE1MCI+PC9hPiAgPGEgaWQ9ImlkeDE1MSIgbmFtZT0iaWR4MTUxIj48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Nc2dfc3RyaW5nLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX01zZ19zdHJpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNGQ2ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX01zZ19zdHJpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxoMiBpZD0ibHBtc2ciPkxBUElfTXNnX3N0cmluZzwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+UmV0cmlldmVzCi10aGUgbWVzc2FnZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhICBzdWJyb3V0aW5lIHJldHVybiBjb2RlLiAgPGEgaWQ9ImlkeDE1MiIgbmFtZT0iaWR4MTUyIj48L2E+IDxhIGlkPSJpZHgxNTMiIG5hbWU9ImlkeDE1MyI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfTXNncG9sbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Nc2dwb2xsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWRkOWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Nc2dwb2xsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aDIgaWQ9Imxtc2dwb2xsIj5MQVBJX01zZ3BvbGw8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPkFsbG93cyB0aGUKLWNhbGxpbmcgdGhyZWFkIHRvIGNoZWNrIGNvbW11bmljYXRpb24gcHJvZ3Jlc3MuICAgIDxhIGlkPSJpZHgxNTQiIG5hbWU9ImlkeDE1NCI+PC9hPiAgPGEgaWQ9ImlkeDE1NSIgbmFtZT0iaWR4MTU1Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Ob3BvbGxfd2FpdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Ob3BvbGxfd2FpdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWJiZTI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfTm9wb2xsX3dhaXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxoMiBpZD0ibG5wdyI+TEFQSV9Ob3BvbGxfd2FpdDwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+V2FpdHMKLWZvciBhIGNvdW50ZXIgdXBkYXRlIHdpdGhvdXQgcG9sbGluZy4gPGEgaWQ9ImlkeDE4MyIgbmFtZT0iaWR4MTgzIj48L2E+IDxhIGlkPSJpZHgxODQiIG5hbWU9ImlkeDE4NCI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Byb2JlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Byb2JlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDRhOWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9Qcm9iZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJscHJvYiI+TEFQSV9Qcm9iZTwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+VHJhbnNmZXJzIGNvbnRyb2wKLXRvIHRoZSBjb21tdW5pY2F0aW9uIHN1YnN5c3RlbSB0byBjaGVjayBmb3IgYXJyaXZpbmcgbWVzc2FnZXMgYW5kIHRvIG1ha2UKLXByb2dyZXNzIGluIHBvbGxpbmcgbW9kZS4gPGEgaWQ9ImlkeDE1NiIgbmFtZT0iaWR4MTU2Ij48L2E+IDxhIGlkPSJpZHgxNTciIG5hbWU9ImlkeDE1NyI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1B1cmdlX3RvdGFzay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9QdXJnZV90b3Rhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwN2Q5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1B1cmdlX3RvdGFzay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGgyIGlkPSJscHRyIj5MQVBJX1B1cmdlX3RvdGFzazwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+QWxsb3dzCi1hIHRhc2sgdG8gY2FuY2VsIG1lc3NhZ2VzIHRvIGEgZ2l2ZW4gZGVzdGluYXRpb24uICA8YSBpZD0iaWR4MTg1IiBuYW1lPSJpZHgxODUiPjwvYT4gPGEgaWQ9ImlkeDE4NiIgbmFtZT0iaWR4MTg2Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfUHV0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1B1dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNlYWY5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfUHV0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aDIgaWQ9ImxwdXQiPkxBUElfUHV0PC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5UcmFuc2ZlcnMgZGF0YQotZnJvbSBhIGxvY2FsIHRhc2sgdG8gYSByZW1vdGUgdGFzay4gIDxhIGlkPSJpZHgxNTgiIG5hbWU9ImlkeDE1OCI+PC9hPiA8YSBpZD0iaWR4MTU5IiBuYW1lPSJpZHgxNTkiPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9QdXR2Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1B1dHYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyZDcyYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1B1dHYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxoMiBpZD0ibHB1dHYiPkxBUElfUHV0djwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+VHJhbnNmZXJzIHZlY3RvcnMKLW9mIGRhdGEgZnJvbSBhIGxvY2FsIHRhc2sgdG8gYSByZW1vdGUgdGFzay4gICA8YSBpZD0iaWR4MTYwIiBuYW1lPSJpZHgxNjAiPjwvYT4gPGEgaWQ9ImlkeDE2MSIgbmFtZT0iaWR4MTYxIj48L2E+PC9wPgotPC9kaXY+Ci1UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfUWVudi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9RZW52Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZmE4NTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9RZW52Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08aDIgaWQ9InFlbnYiPkxBUElfUWVudjwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+VXNlZCB0byBxdWVyeQotTEFQSSBmb3IgcnVudGltZSB0YXNrIGluZm9ybWF0aW9uLiAgPGEgaWQ9ImlkeDE2MiIgbmFtZT0iaWR4MTYyIj48L2E+IDxhIGlkPSJpZHgxNjMiIG5hbWU9ImlkeDE2MyI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9SZXN1bWVfdG90YXNrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Jlc3VtZV90b3Rhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NmZhYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Jlc3VtZV90b3Rhc2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxoMiBpZD0ibHJ0dCI+TEFQSV9SZXN1bWVfdG90YXNrPC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5SZS1lbmFibGVzCi10aGUgc2VuZGluZyBvZiBtZXNzYWdlcyB0byB0aGUgdGFzay4gIDxhIGlkPSJpZHgxODciIG5hbWU9ImlkeDE4NyI+PC9hPiA8YSBpZD0iaWR4MTg4IiBuYW1lPSJpZHgxODgiPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Jtdy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9SbXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyYzE0My4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Jtdy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJscm13Ij5MQVBJX1JtdzwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+UHJvdmlkZXMgZGF0YQotc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuICA8YSBpZD0iaWR4MTY0IiBuYW1lPSJpZHgxNjQiPjwvYT4gPGEgaWQ9ImlkeDE2NSIgbmFtZT0iaWR4MTY1Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9SbXc2NC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9SbXc2NC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZhZTZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfUm13NjQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxoMiBpZD0ibHJtd2IiPkxBUElfUm13NjQ8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPlByb3ZpZGVzIGRhdGEKLXN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGZvciA2NC1iaXQgYXBwbGljYXRpb25zLiAgIDxhIGlkPSJpZHgxNjYiIG5hbWU9ImlkeDE2NiI+PC9hPiA8YSBpZD0iaWR4MTY3IiBuYW1lPSJpZHgxNjciPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1NlbnYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfU2Vudi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTY2YjNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfU2Vudi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJsc2VudiI+TEFQSV9TZW52PC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5Vc2VkIHRvIHNldAotYSBydW50aW1lIHZhcmlhYmxlLiAgPGEgaWQ9ImlkeDE2OCIgbmFtZT0iaWR4MTY4Ij48L2E+PGEgaWQ9ImlkeDE2OSIgbmFtZT0iaWR4MTY5Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9TZXRjbnRyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1NldGNudHIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ODg3Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1NldGNudHIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxoMiBpZD0ic2V0Y250Ij5MQVBJX1NldGNudHI8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPlVzZWQgdG8gc2V0Ci1hIGNvdW50ZXIgdG8gYSBzcGVjaWZpZWQgIHZhbHVlLiAgPGEgaWQ9ImlkeDE3MCIgbmFtZT0iaWR4MTcwIj48L2E+IDxhIGlkPSJpZHgxNzEiIG5hbWU9ImlkeDE3MSI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfU2V0Y250cl93c3RhdHVzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1NldGNudHJfd3N0YXR1cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTc0YWU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfU2V0Y250cl93c3RhdHVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08aDIgaWQ9InNldGNudHciPkxBUElfU2V0Y250cl93c3RhdHVzPC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5Vc2VkCi10byBzZXQgYSBjb3VudGVyIHRvIGEgc3BlY2lmaWVkIHZhbHVlIGFuZCB0byBzZXQgdGhlIGFzc29jaWF0ZWQgZGVzdGluYXRpb24KLWxpc3QgYXJyYXkgYW5kIGRlc3RpbmF0aW9uIHN0YXR1cyBhcnJheSB0byB0aGUgY291bnRlci4gICA8YSBpZD0iaWR4MTg5IiBuYW1lPSJpZHgxODkiPjwvYT4gPGEgaWQ9ImlkeDE5MCIgbmFtZT0iaWR4MTkwIj48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9UZXJtLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Rlcm0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZTk5Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1Rlcm0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxoMiBpZD0ibHRlcm0iPkxBUElfVGVybTwvaDI+Ci08aDQ+UHVycG9zZTwvaDQ+Ci0KLTxkaXYgY2xhc3M9ImxlZGkiPgotPHA+VGVybWluYXRlcyBhbmQKLWNsZWFucyB1cCBhIExBUEkgY29udGV4dC4gPGEgaWQ9ImlkeDE3MiIgbmFtZT0iaWR4MTcyIj48L2E+IDxhIGlkPSJpZHgxNzMiIG5hbWU9ImlkeDE3MyI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfVXRpbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9VdGlsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTYwOGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9VdGlsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08aDIgaWQ9Imx1dGlsIj5MQVBJX1V0aWw8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPlNlcnZlcyBhcyBhCi13cmFwcGVyIGZ1bmN0aW9uIGZvciAgPHNwYW4+c3VjaCBkYXRhIGdhdGhlci9zY2F0dGVyIG9wZXJhdGlvbnMgYXMgcmVnaXN0cmF0aW9uCi1hbmQgcmVzZXJ2YXRpb24sPC9zcGFuPiAgPHNwYW4+Zm9yIHVwZGF0aW5nIFVEUCBwb3J0IGluZm9ybWF0aW9uLCBhbmQgZm9yIG9idGFpbmluZwotcG9pbnRlcnMgdG8gbG9ja2luZyBhbmQgc2lnbmFsaW5nIGZ1bmN0aW9ucyB0aGF0IGFyZSAgYXNzb2NpYXRlZCB3aXRoIGEgc2hhcmVkCi1MQVBJIGxvY2s8L3NwYW4+LiA8YSBpZD0iaWR4MTc0IiBuYW1lPSJpZHgxNzQiPjwvYT4gPGEgaWQ9ImlkeDE3NSIgbmFtZT0iaWR4MTc1Ij48L2E+PC9wPgotPC9kaXY+Ci08cD5UbyBjb21wbGV0ZSB0aGUgaGVscCBpbmZvcm1hdGlvbiBpbiB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW5zLAotY29udGFjdCBJQk0gSFBDIENsdXN0ZXIgc3VwcG9ydCBmb3IgZXhhY3QgbG9jYXRpb24gb2YgbW9yZSBleHRlbnNpdmUgaGVscAotZmlsZXMgZm9yIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbi4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9XYWl0Y250ci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2h0bWwvTEFQSV9XYWl0Y250ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU4MmI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfV2FpdGNudHIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxoMiBpZD0ibHdhaXQiPkxBUElfV2FpdGNudHI8L2gyPgotPGg0PlB1cnBvc2U8L2g0PgotCi08ZGl2IGNsYXNzPSJsZWRpIj4KLTxwPldhaXRzIHVudGlsCi1hIHNwZWNpZmllZCBjb3VudGVyIHJlYWNoZXMgdGhlIHZhbHVlIHNwZWNpZmllZC4gIDxhIGlkPSJpZHgxNzYiIG5hbWU9ImlkeDE3NiI+PC9hPiA8YSBpZD0iaWR4MTc3IiBuYW1lPSJpZHgxNzciPjwvYT48L3A+Ci08L2Rpdj4KLTxwPlRvIGNvbXBsZXRlIHRoZSBoZWxwIGluZm9ybWF0aW9uIGluIHRoZSBMQVBJIEVjbGlwc2UgcGx1Zy1pbnMsCi1jb250YWN0IElCTSBIUEMgQ2x1c3RlciBzdXBwb3J0IGZvciBleGFjdCBsb2NhdGlvbiBvZiBtb3JlIGV4dGVuc2l2ZSBoZWxwCi1maWxlcyBmb3IgdGhlIExBUEkgRWNsaXBzZSBwbHVnLWluLgotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaHRtbC9MQVBJX1hmZXIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfWGZlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM5YzkyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9odG1sL0xBUElfWGZlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGgyIGlkPSJseGZlciI+TEFQSV9YZmVyPC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLQotPGRpdiBjbGFzcz0ibGVkaSI+Ci08cD5TZXJ2ZXMgYXMgYQotd3JhcHBlciBmdW5jdGlvbiBmb3IgTEFQSSBkYXRhIHRyYW5zZmVyIGZ1bmN0aW9ucy4gPGEgaWQ9ImlkeDE3OCIgbmFtZT0iaWR4MTc4Ij48L2E+IDxhIGlkPSJpZHgxNzkiIG5hbWU9ImlkeDE3OSI+PC9hPjwvcD4KLTwvZGl2PgotPHA+VG8gY29tcGxldGUgdGhlIGhlbHAgaW5mb3JtYXRpb24gaW4gdGhlIExBUEkgRWNsaXBzZSBwbHVnLWlucywKLWNvbnRhY3QgSUJNIEhQQyBDbHVzdGVyIHN1cHBvcnQgZm9yIGV4YWN0IGxvY2F0aW9uIG9mIG1vcmUgZXh0ZW5zaXZlIGhlbHAKLWZpbGVzIGZvciB0aGUgTEFQSSBFY2xpcHNlIHBsdWctaW4uCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9pY29ucy8uY3ZzaWdub3JlIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2ljb25zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjJlYjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL2ljb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wc3BicndzZS5qYmYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9pY29ucy9sYXBpLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9pY29ucy9sYXBpLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0MzdkMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvaWNvbnMvbGFwaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvcGx1Z2luLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmUwOWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyAgICB0ZXN0IHBsdWdpbi5wcm9wZXJ0aWVzCi0jIFRoZXNlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbiBwbHVnaW4ueG1sIAotIwotCi1wbHVnaW5OYW1lPVBUUCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scyBMQVBJIFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCi0KLXZpZXcubmFtZT1MQVBJIEFydGlmYWN0IFZpZXcKLXZpZXdjYXQubmFtZT1QVFAgTEFQSSBWaWV3cwotcnVuLmxhYmVsPVJ1biBMQVBJIEFuYWx5c2lzCi1ydW4udG9vbHRpcD1SdW4gTEFQSSBBbmFseXNpcyBvbiBzZWxlY3RlZCBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QgdG8gZmluZCBMQVBJIEFydGlmYWN0cwotCi0jbmVlZCB0byBhZGQgbW9yZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9wbHVnaW4ueG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzBkYTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICAgICA8cGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkucHJlZnMuTEFQSVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkucHJlZnBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnByZWZzLlBMRFRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IkxBUEkiLz4KLSAgICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gIExBUEkgbWFya2VycyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0JCWlkPSJsYXBpTWFya2VyIgotICAgICAgICBuYW1lPSJMQVBJIEFydGlmYWN0IE1hcmtlciI+Ci0gICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSB0aGlzIGNoYW5nZXMgdGhlIG1hcmtlciBpbWFnZSBpbiB0aGUgZWRpdG9yIG1hcmtlciBiYXIgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLmxhcGlNYXJrZXIiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLmxhcGlNYXJrZXJBbm5vdGF0aW9uIj4KLSAgICAgIDwvdHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLmxhcGlNYXJrZXJBbm5vdGF0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGFwaS5naWYiIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmVzZW50YXRpb25MYXllcj0iMyIKLSAgICAgICAgICAgIGxhYmVsPSJMQVBJIEFubm90YXRpb24gTWFya2VyIgotICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0ibGFwaUluZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIxMjgsMTI4LDE5MiIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotCQkJc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dQb3J0aW5nSW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbiIKLSAgICAgICAgICAgIHNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0idHJ1ZSIKLSAgICAgICAgICAgIGlzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleT0iaXNQb3J0aW5nR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldCIKLQotICAgICAgICAgICAgaXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ1JlY29yZEdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLSAgICAgICAgICAgID4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4gIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIldmlld2NhdC5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGFwaS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLnZpZXdzLkxhcGlBcnRpZmFjdFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS52aWV3cy5MYXBpQXJ0aWZhY3RWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC51aS5DSGVscFByb3ZpZGVyIj4KLSAgICAgIDxwcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuZWRpdG9ySGVscC5MYXBpQ0hlbHBJbmZvUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS5lZGl0b3JIZWxwLkxhcGlDSGVscEluZm9Qcm92aWRlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuYWN0aW9ucy5SdW5BbmFseXNlTEFQSWNvbW1hbmRIYW5kbGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuY29tbWFuZDIiCi0gICAgICAgICAgICBuYW1lPSJmaW5kIGxhcGkgYXJ0aWZhY3RzIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhci5jb21tYW5kMSAiPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS5jb21tYW5kMiIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2xhcGkuZ2lmIgotICAgICAgICAgICAgICAgbGFiZWw9IlNob3cgTEFQSSBBcnRpZmFjdHMiPgotICAgICAgICAgPC9jb21tYW5kPgotICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9MQVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL0xBUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzI1ZGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL0xBUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3RNYXJraW5nVmlzaXRvcjsKLQotcHVibGljIGNsYXNzIExBUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yIGV4dGVuZHMgQXJ0aWZhY3RNYXJraW5nVmlzaXRvcgotewotICAgIHB1YmxpYyBMQVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihTdHJpbmcgbWFya2VySWQpCi0gICAgewotICAgICAgICBzdXBlcihtYXJrZXJJZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL0xhcGlJRHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9MYXBpSURzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWVjM2IuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL0xhcGlJRHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaTsKLQotLyoqCi0gKiBMQVBJIFBsdWdpbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBMYXBpSURzCi17Ci0gICAgLy8gcHJlZmVyZW5jZSBwYWdlIG5hbWUgZm9yIExBUEkKLSAgICBTdHJpbmcgTEFQSV9JTkNMVURFUyAgICA9ICJMQVBJIEluY2x1ZGVzIjsKLSAgICAKLSAgICBTdHJpbmcgTUFSS0VSX0lEICAgICAgID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkubGFwaU1hcmtlciI7Ci0gICAgU3RyaW5nIE1BUktFUl9FUlJPUl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAubGFwLmxhcGlFcnJvck1hcmtlciI7Ci0gICAgCi0gICAgLy8gYXJ0aWZhY3QgdmlldyBpZAotICAgIFN0cmluZyBMQVBJX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS52aWV3cy5MYXBpQXJ0aWZhY3RWaWV3IjsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9MYXBpUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvTGFwaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM3ZWNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9MYXBpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgTGFwaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExhcGlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTGFwaVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExhcGlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpIiwgcGF0aCk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWZlcmVuY2Ugc2V0dGluZyBmb3IgTEFQSSBpbmNsdWRlIHBhdGhzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TGFwaUluY2x1ZGVEaXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdMaXN0ID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoTGFwaUlEcy5MQVBJX0lOQ0xVREVTKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmdMaXN0LCBGaWxlLnBhdGhTZXBhcmF0b3IgKyAiXG5cciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgTGlzdDxTdHJpbmc+IGRpcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBkaXJzLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL2FjdGlvbnMvUnVuQW5hbHlzZUxBUEljb21tYW5kSGFuZGxlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL2FjdGlvbnMvUnVuQW5hbHlzZUxBUEljb21tYW5kSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWUwYjJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9hY3Rpb25zL1J1bkFuYWx5c2VMQVBJY29tbWFuZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5nbnUuYy5HQ0NMYW5ndWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSVRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uU2NhblJldHVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYWN0aW9ucy5SdW5BbmFseXNlSGFuZGxlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuVmlld0FjdGl2YXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLkxBUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuTGFwaUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLkxhcGlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS5hbmFseXNpcy5MYXBpQ0FTVFZpc2l0b3I7Ci0KLS8qKgotICogQGF1dGhvciB0aWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFuYWx5c2VMQVBJY29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBSdW5BbmFseXNlSGFuZGxlckJhc2UKLXsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlICJSdW4gQW5hbHlzaXMiIGFjdGlvbgotCSAqLwotCXB1YmxpYyBSdW5BbmFseXNlTEFQSWNvbW1hbmRIYW5kbGVyKCkgewotCQlzdXBlcigiTEFQSSIsIG5ldyBMQVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihMYXBpSURzLk1BUktFUl9JRCksIExhcGlJRHMuTUFSS0VSX0lEKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgTEFQSSBhbmFseXNpcyBhcnRpZmFjdHMgZm9yIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gdHUgdGhlIHRyYW5zbGF0aW9uIHVuaXQgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHRvIGJlIGFuYWx5emVkCi0JICogQHBhcmFtIGluY2x1ZGVzIGxpc3Qgb2YgTGFwaSBpbmNsdWRlIHBhdGhzCi0JICogQHJldHVybiBhbmFseXNpcyByZXN1bHRzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNjYW5SZXR1cm4gZG9BcnRpZmFjdEFuYWx5c2lzKGZpbmFsIElUcmFuc2xhdGlvblVuaXQgdHUsCWZpbmFsIExpc3Q8U3RyaW5nPiBpbmNsdWRlcykgewotCQlmaW5hbCBTY2FuUmV0dXJuIG1zciA9IG5ldyBTY2FuUmV0dXJuKCk7Ci0JCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IHR1LmdldEVsZW1lbnROYW1lKCk7Ci0JCUlMYW5ndWFnZSBsYW5nOwotCQl0cnkgewotCQkJbGFuZyA9IHR1LmdldExhbmd1YWdlKCk7Ci0gICAgICAgICAgICAKLQkJCUlBU1RUcmFuc2xhdGlvblVuaXQgYXR1ID0gdHUuZ2V0QVNUKCk7Ci0JCQlpZiAobGFuZy5nZXRJZCgpLmVxdWFscyhHQ0NMYW5ndWFnZS5JRCkpIHsvLyBjZHQ0MAotCQkJCWF0dS5hY2NlcHQobmV3IExhcGlDQVNUVmlzaXRvcihpbmNsdWRlcywgZmlsZU5hbWUsIG1zcikpOwotCQkJfSAKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG1zcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZVBhdGgoKSB7Ci0JCXJldHVybiBMYXBpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXBpSW5jbHVkZURpcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUFydGlmYWN0VmlldygpIHsKLQkJVmlld0FjdGl2YXRlci5hY3RpdmF0ZVZpZXcoTGFwaUlEcy5MQVBJX1ZJRVdfSUQpOwotCX0KLQotCS8qKgotCSAqIExBUEkgZG9lc24ndCBoYXZlIGEgcHJvYmxlbXMgdmlldyAob25seSBPcGVuTVAgYW5hbHlzaXMgZG9lcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVByb2JsZW1zVmlldygpIHsKLQotCX0JCi0JIAotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvYW5hbHlzaXMvTGFwaUNBU1RWaXNpdG9yLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvYW5hbHlzaXMvTGFwaUNBU1RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjJkNDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL2FuYWx5c2lzL0xhcGlDQVNUVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuYW5hbHlzaXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVElkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RMaXRlcmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5TY2FuUmV0dXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hbmFseXNpcy5QbGR0QXN0VmlzaXRvcjsKLQotLyoqCi0gKiBUaGlzIGRvbS13YWxrZXIgY29sbGVjdHMgImFydGlmYWN0cyIgcmVsYXRlZCB0byB0aGUgc3BlY2lmaWMgZG9tYWluIDxicj4KLSAqIChlLmcuIExBUEkpLiBDdXJyZW50bHkgdGhlc2UgYXJ0aWZhY3RzIGluY2x1ZGUgZnVuY3Rpb24gY2FsbHMKLSAqIGFuZCBjb25zdGFudHMuIEl0IGFkZCBtYXJrZXJzIHRvIHRoZSBzb3VyY2UgZmlsZSBmb3IgQyBjb2RlLCBtYXJraW5nIHRoZQotICogcG9zaXRpb24gb2YgdGhlIGFydGlmYWN0cyBmb3VuZC4KLSAqIAotICogVGhpcyB2ZXJzaW9uIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgaW5zdGVhZCBvZiBkZWxlZ2F0aW5nIHRvPGJyPgotICogTXBpR2VuZXJhbEFTVFZpc2l0b3JCZWhhdmlvci4KLSAqCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExhcGlDQVNUVmlzaXRvciBleHRlbmRzIFBsZHRBc3RWaXNpdG9yIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVg9IkxBUElfIjsKLQotICAgIHsKLSAgICAgICAgdGhpcy5zaG91bGRWaXNpdEV4cHJlc3Npb25zID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotICAgICAgICB0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5zaG91bGRWaXNpdFRyYW5zbGF0aW9uVW5pdCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIExhcGlDQVNUVmlzaXRvcihMaXN0IG1waUluY2x1ZGVzLCBTdHJpbmcgZmlsZU5hbWUsIFNjYW5SZXR1cm4gbXNyKQotICAgIHsKLSAgICAgICAgc3VwZXIobXBpSW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpOwotCQlBUlRJRkFDVF9DQUxMID0gIkxBUEkgQ2FsbCI7Ci0JCUFSVElGQUNUX0NPTlNUQU5UPSJMQVBJIENvbnN0YW50IjsKLSAgICB9Ci0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHZpc2l0KElBU1RFeHByZXNzaW9uIGV4cHJlc3Npb24pCi0gICAgewotICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICBJQVNURXhwcmVzc2lvbiBhc3RFeHByID0gKChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGFzdEV4cHIuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZnVuYyBzaWduYXR1cmU9IiArIHNpZ25hdHVyZSk7Ci0gICAgICAgICAgICBpZiAoc2lnbmF0dXJlLnN0YXJ0c1dpdGgoUFJFRklYKSkgewotICAgICAgICAgICAgICAgIGlmIChhc3RFeHByIGluc3RhbmNlb2YgSUFTVElkRXhwcmVzc2lvbikgewotICAgICAgICAgICAgICAgICAgICBJQVNUTmFtZSBmdW5jTmFtZSA9ICgoSUFTVElkRXhwcmVzc2lvbikgYXN0RXhwcikuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRnVuY05hbWUoZnVuY05hbWUsIGFzdEV4cHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSUFTVExpdGVyYWxFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTWFjcm9MaXRlcmFsKChJQVNUTGl0ZXJhbEV4cHJlc3Npb24pIGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvZWRpdG9ySGVscC9MYXBpQ0hlbHBCb29rLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvZWRpdG9ySGVscC9MYXBpQ0hlbHBCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTkyNWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9sYXBpL2VkaXRvckhlbHAvTGFwaUNIZWxwQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5DSGVscEJvb2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuRnVuY3Rpb25TdW1tYXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLkxhcGlQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIExhcGlDSGVscEJvb2sgZXh0ZW5kcyBDSGVscEJvb2tJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiTEFQSSBDIEhlbHAgQm9vayI7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGFwaUNIZWxwQm9vaygpIHsKLSAgICAgICAgc3VwZXIoTGFwaVBsdWdpbi5nZXRQbHVnaW5JZCgpKTsKLQkJLy8gcG9wdWxhdGUgZnVuYyBtYXAKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX0FkZHJfZ2V0IiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfQWRkcl9nZXQiLCAiIiwgIlJldHJpZXZlcyBhIGZ1bmN0aW9uIGFkZHJlc3MgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHVzaW5nIExBUElfQWRkcl9zZXQuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9BZGRyX2dldCIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCB2b2lkICoqYWRkciwgaW50IGFkZHJfaG5kbCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9BZGRyX3NldCIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX0FkZHJfc2V0IiwgIiIsICJSZWdpc3RlcnMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX0FkZHJfc2V0IiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIHZvaWQgKiphZGRyLCBpbnQgYWRkcl9obmRsIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX0FkZHJlc3MiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9BZGRyZXNzIiwgIiIsICJSZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcgdmFsdWUgZm9yIGEgc3BlY2lmaWVkIHVzZXIgYWRkcmVzcy4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX0FkZHJlc3MiLCAiaW50IiwgInZvaWQgICpteV9hZGRyLCB1bG9uZyAqcmV0X2FkZHIiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfQWRkcmVzc19pbml0IiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfQWRkcmVzc19pbml0IiwgIiIsICJDcmVhdGVzIGEgcmVtb3RlIGFkZHJlc3MgdGFibGUuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9BZGRyZXNzX2luaXQiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgIGhuZGwsIHZvaWQgKm15X2FkZHIsIHZvaWQgKmFkZF90YWJbIF0iKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfQWRkcmVzc19pbml0NjQiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9BZGRyZXNzX2luaXQ2NCIsICIiLCAiQ3JlYXRlcyBhIDY0LWJpdCByZW1vdGUgYWRkcmVzcyB0YWJsZS4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX0FkZHJlc3NfaW5pdDY0IiwgImludCIsICJsYXBpX2hhbmRsZV90ICBobmRsLCBsYXBpX2xvbmdfdCBteV9hZGRyLCBsYXBpX2xvbmdfdCAqYWRkX3RhYiIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9BbXNlbmQiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9BbXNlbmQiLCAiIiwgIlRyYW5zZmVycyBhIHVzZXIgbWVzc2FnZSB0byBhIHJlbW90ZSB0YXNrLCBvYnRhaW5pbmcgdGhlIHRhcmdldCBhZGRyZXNzIG9uIHRoZSByZW1vdGUgdGFzayBmcm9tIGEgdXNlci1zcGVjaWZpZWQgaGVhZGVyIGhhbmRsZXIuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9BbXNlbmQiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCwgdWludCB0Z3QsIHZvaWQgKmhkcl9oZGwsIHZvaWQgKnVoZHIsIHVpbnQgdWhkcl9sZW4sIHZvaWQgKnVkYXRhLCB1bG9uZyB1ZGF0YV9sZW4sIGxhcGlfY250cl90ICp0Z3RfY250ciwgbGFwaV9jbnRyX3QgKm9yZ19jbnRyLCBsYXBpX2NudHJfdCAqY21wbF9jbnRyIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX0Ftc2VuZHYiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9BbXNlbmR2IiwgIiIsICJUcmFuc2ZlcnMgYSB1c2VyIHZlY3RvciB0byBhIHJlbW90ZSB0YXNrLCBvYnRhaW5pbmcgdGhlIHRhcmdldCBhZGRyZXNzIG9uIHRoZSByZW1vdGUgdGFzayBmcm9tIGEgdXNlci1zcGVjaWZpZWQgaGVhZGVyIGhhbmRsZXIuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9BbXNlbmR2IiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIHVpbnQgdGd0LCB2b2lkICpoZHJfaGRsLCB2b2lkICp1aGRyLCB1aW50IHVoZHJfbGVuLCBsYXBpX3ZlY190ICpvcmdfdmVjLCBsYXBpX2NudHJfdCAqdGd0X2NudHIsIGxhcGlfY250cl90ICpvcmdfY250ciwgbGFwaV9jbnRyX3QgKmNtcGxfY250ciIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9GZW5jZSIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX0ZlbmNlIiwgIiIsICJFbmZvcmNlcyBvcmRlciBvbiBMQVBJIGNhbGxzLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfRmVuY2UiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9HZXQiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9HZXQiLCAiIiwgIkNvcGllcyBkYXRhIGZyb20gYSByZW1vdGUgdGFzayB0byBhIGxvY2FsIHRhc2suIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9HZXQiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCwgdWludCB0Z3QsIHVsb25nIGxlbiwgdm9pZCAqdGd0X2FkZHIsIHZvaWQgKm9yZ19hZGRyLCBsYXBpX2NudHJfdCAqdGd0X2NudHIsIGxhcGlfY250cl90ICpvcmdfY250ciIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9HZXRjbnRyIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfR2V0Y250ciIsICIiLCAiR2V0cyB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIHNwZWNpZmllZCBMQVBJIGNvdW50ZXIuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9HZXRjbnRyIiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIGxhcGlfY250cl90ICpjbnRyLCBpbnQgKnZhbCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9HZXR2IiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfR2V0diIsICIiLCAiQ29waWVzIHZlY3RvcnMgb2YgZGF0YSBmcm9tIGEgcmVtb3RlIHRhc2sgdG8gYSBsb2NhbCB0YXNrLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfR2V0diIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCB1aW50IHRndCwgbGFwaV92ZWNfdCAqdGd0X3ZlYywgbGFwaV92ZWNfdCAqb3JnX3ZlYywgbGFwaV9jbnRyX3QgKnRndF9jbnRyLCBsYXBpX2NudHJfdCAqb3JnX2NudHIiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfR2ZlbmNlIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfR2ZlbmNlIiwgIiIsICJFbmZvcmNlcyBvcmRlciBvbiBMQVBJIGNhbGxzIGFjcm9zcyBhbGwgdGFza3MgYW5kIHByb3ZpZGVzIGJhcnJpZXIgc3luY2hyb25pemF0aW9uIGFtb25nIHRoZW0uIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9HZmVuY2UiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9Jbml0IiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfSW5pdCIsICIiLCAiSW5pdGlhbGl6ZXMgYSBMQVBJIGNvbnRleHQuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9Jbml0IiwgImludCIsICJsYXBpX2hhbmRsZV90ICpobmRsLCBsYXBpX2luZm9fdCAqbGFwaV9pbmZvIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX01zZ19zdHJpbmciLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9Nc2dfc3RyaW5nIiwgIiIsICJSZXRyaWV2ZXMgdGhlIG1lc3NhZ2UgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzdWJyb3V0aW5lIHJldHVybiBjb2RlLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfTXNnX3N0cmluZyIsICJpbnQiLCAiaW50IGVycm9yX2NvZGUsIHZvaWQgKmJ1ZiIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9Nc2dwb2xsIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfTXNncG9sbCIsICIiLCAiQWxsb3dzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBjaGVjayBjb21tdW5pY2F0aW9uIHByb2dyZXNzLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfTXNncG9sbCIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCB1aW50IGNudCwgbGFwaV9tc2dfaW5mb190ICAqaW5mbyIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9Qcm9iZSIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX1Byb2JlIiwgIiIsICJUcmFuc2ZlcnMgY29udHJvbCB0byB0aGUgY29tbXVuaWNhdGlvbiBzdWJzeXN0ZW0gdG8gY2hlY2sgZm9yIGFycml2aW5nIG1lc3NhZ2VzIGFuZCB0byBtYWtlIHByb2dyZXNzIGluIHBvbGxpbmcgbW9kZS4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1Byb2JlIiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfUHV0IiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfUHV0IiwgIiIsICJUcmFuc2ZlcnMgZGF0YSBmcm9tIGEgbG9jYWwgdGFzayB0byBhIHJlbW90ZSB0YXNrLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfUHV0IiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIHVpbnQgdGd0LCB1bG9uZyBsZW4sIHZvaWQgKnRndF9hZGRyLCB2b2lkICpvcmdfYWRkciwgbGFwaV9jbnRyX3QgKnRndF9jbnRyLCBsYXBpX2NudHJfdCAqb3JnX2NudHIsIGxhcGlfY250cl90ICpjbXBsX2NudHIiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfUHV0diIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX1B1dHYiLCAiIiwgIlRyYW5zZmVycyB2ZWN0b3JzIG9mIGRhdGEgZnJvbSBhIGxvY2FsIHRhc2sgdG8gYSByZW1vdGUgdGFzay4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1B1dHYiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCwgdWludCB0Z3QsIGxhcGlfdmVjX3QgKnRndF92ZWMsIGxhcGlfdmVjX3QgKm9yZ192ZWMsIGxhcGlfY250cl90ICp0Z3RfY250ciwgbGFwaV9jbnRyX3QgKm9yZ19jbnRyLCBsYXBpX2NudHJfdCAqY21wbF9jbnRyIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX1FlbnYiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9RZW52IiwgIiIsICJVc2VkIHRvIHF1ZXJ5IExBUEkgZm9yIHJ1bnRpbWUgdGFzayBpbmZvcm1hdGlvbi4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1FlbnYiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCwgbGFwaV9xdWVyeV90IHF1ZXJ5LCBpbnQgKnJldF92YWwiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfUm13IiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfUm13IiwgIiIsICJQcm92aWRlcyBkYXRhIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfUm13IiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIFJNV19vcHNfdCBvcCwgdWludCB0Z3QsIGludCAqdGd0X3ZhciwgaW50ICppbl92YWwsIGludCAqcHJldl90Z3RfdmFsLCBsYXBpX2NudHJfdCAqb3JnX2NudHIiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfUm13NjQiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9SbXc2NCIsICIiLCAiUHJvdmlkZXMgZGF0YSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBmb3IgNjQtYml0IGFwcGxpY2F0aW9ucy4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1JtdzY0IiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIFJtd19vcHNfdCBvcCwgdWludCB0Z3QsIGxvbmcgbG9uZyAqdGd0X3ZhciwgbG9uZyBsb25nICppbl92YWwsIGxvbmcgbG9uZyAqcHJldl90Z3RfdmFsLCBsYXBpX2NudHJfdCAqb3JnX2NudHIiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfU2VudiIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX1NlbnYiLCAiIiwgIlVzZWQgdG8gc2V0IGEgcnVudGltZSB2YXJpYWJsZS4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1NlbnYiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCwgbGFwaV9xdWVyeV90IHF1ZXJ5LCBpbnQgc2V0X3ZhbCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9TZXRjbnRyIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfU2V0Y250ciIsICIiLCAiVXNlZCB0byBzZXQgYSBjb3VudGVyIHRvIGEgc3BlY2lmaWVkIHZhbHVlLiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfU2V0Y250ciIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCBsYXBpX2NudHJfdCAqY250ciwgaW50IHZhbCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9UZXJtIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoIkxBUElfVGVybSIsICIiLCAiVGVybWluYXRlcyBhbmQgY2xlYW5zIHVwIGEgTEFQSSBjb250ZXh0LiIsCi0gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfVGVybSIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX1V0aWwiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9VdGlsIiwgIiIsICJERVNDIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9VdGlsIiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIGxhcGlfdXRpbF90ICp1dGlsX2NtZCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9XYWl0Y250ciIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX1dhaXRjbnRyIiwgIiIsICJXYWl0cyB1bnRpbCBhIHNwZWNpZmllZCBjb3VudGVyIHJlYWNoZXMgdGhlIHZhbHVlIHNwZWNpZmllZC4iLAotICAgIAkJICAJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIkxBUElfV2FpdGNudHIiLCAiaW50IiwgImxhcGlfaGFuZGxlX3QgaG5kbCwgbGFwaV9jbnRyX3QgKmNudHIsIGludCB2YWwsIGludCAqY3VyX2NudHJfdmFsIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX1hmZXIiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9YZmVyIiwgIiIsICJTZXJ2ZXMgYXMgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBMQVBJIGRhdGEgdHJhbnNmZXIgZnVuY3Rpb25zLiIsCi0gICAgCQkgIAluZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9YZmVyIiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIGxhcGlfeGZlcl90ICp4ZmVyX2NtZCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9Ob3BvbGxfd2FpdCIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX05vcG9sbF93YWl0IiwgIiIsICJXYWl0cyBmb3IgYSBjb3VudGVyIHVwZGF0ZSB3aXRob3V0IHBvbGxpbmcuIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9Ob3BvbGxfd2FpdCIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCBsYXBpX2NudHJfdCAqY250cl9wdHIsIGludCB2YWwsIGludCAqY3VyX2NudHJfdmFsIiksIG51bGwpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJMQVBJX1B1cmdlX3RvdGFzayIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX1B1cmdlX3RvdGFzayIsICIiLCAiQWxsb3dzIGEgdGFzayB0byBjYW5jZWwgbWVzc2FnZXMgdG8gYSBnaXZlbiBkZXN0aW5hdGlvbi4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1B1cmdlX3RvdGFzayIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCB1aW50IGRlc3QiKSwgbnVsbCkpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoIkxBUElfUmVzdW1lX3RvdGFzayIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKCJMQVBJX1Jlc3VtZV90b3Rhc2siLCAiIiwgIlJlLWVuYWJsZXMgdGhlIHNlbmRpbmcgb2YgbWVzc2FnZXMgdG8gdGhlIHRhc2suIiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgiTEFQSV9SZXN1bWVfdG90YXNrIiwgImludCIsICJsYXBpX2hhbmRsZV90IGhuZGwsIHVpbnQgZGVzdCIpLCBudWxsKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9TZXRjbnRyX3dzdGF0dXMiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgiTEFQSV9TZXRjbnRyX3dzdGF0dXMiLCAiIiwgIlVzZWQgdG8gc2V0IGEgY291bnRlciB0byBhIHNwZWNpZmllZCB2YWx1ZSBhbmQgdG8gc2V0IHRoZSBhc3NvY2lhdGVkIGRlc3RpbmF0aW9uIGxpc3QgYXJyYXkgYW5kIGRlc3RpbmF0aW9uIHN0YXR1cyBhcnJheSB0byB0aGUgY291bnRlci4iLAotICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJMQVBJX1NldGNudHJfd3N0YXR1cyIsICJpbnQiLCAibGFwaV9oYW5kbGVfdCBobmRsLCBsYXBpX2NudHJfdCAqY250ciwgaW50IG51bV9kZXN0LCB1aW50ICpkZXN0X2xpc3QsIGludCAqZGVzdF9zdGF0dXMiKSwgbnVsbCkpOwotLy8gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgiTEFQSV9GZW5jZSIsIG5ldyBGdW5jdGlvblN1bW1hcnkoIkxBUElfRmVuY2UiLCAiIiwgIkRFU0MiLAotLy8gICAgICAgICAgICAgICAgbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeSgiTEFQSV9GZW5jZSIsICJpbnQiLCAiQVJHUyIpLCBudWxsKSk7Ci0KLSAgICAgICAgLy8gc2V0IHRpdGxlCi0gICAgICAgIHNldFRpdGxlKFRJVExFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvZWRpdG9ySGVscC9MYXBpQ0hlbHBJbmZvUHJvdmlkZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9lZGl0b3JIZWxwL0xhcGlDSGVscEluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmMzM2MxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9lZGl0b3JIZWxwL0xhcGlDSGVscEluZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5DSGVscFByb3ZpZGVySW1wbDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBJQ0hlbHBQcm92aWRlciBhbmQgcHJvdmlkZXMgTEFQSSBpbmZvcm1hdGlvbiA8YnI+Ci0gKiAoRjEsIGhvdmVyLCBjb250ZW50IGFzc2lzdCwgZXRjLikKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBMYXBpQ0hlbHBJbmZvUHJvdmlkZXIgZXh0ZW5kcyBDSGVscFByb3ZpZGVySW1wbCB7Ci0KLQlwdWJsaWMgTGFwaUNIZWxwSW5mb1Byb3ZpZGVyKCkgewotCQkvLyBmb3IgZGVidWcgdXNlIG9ubHksIHRvIHNlZSB3aGVyZSBpdCdzIGNhbGxlZC4uCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJMYXBpQ0hlbHBJbmZvUHJvdmlkZXIgY3RvcigpLi4uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaGVscEJvb2sgPSBuZXcgTGFwaUNIZWxwQm9vaygpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTGFwaUNIZWxwSW5mb1Byb3ZpZGVyIGluaXRpYWxpemUoKS4uLiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9wcmVmcy9MQVBJUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS9wcmVmcy9MQVBJUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiMzllMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvcHJlZnMvTEFQSVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLnByZWZzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQm9vbGVhbkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QYXRoRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuTGFwaUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLkxhcGlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgYmFzZWQgb24gRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotICogCi0gKiBAYXV0aG9yIHh1ZQotICovCi0KLXB1YmxpYyBjbGFzcyBMQVBJUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVTX1BSRUZFUkVOQ0VfTEFCRUwgID0gIkxBUEkgaW5jbHVkZSBwYXRoczoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFU19QUkVGRVJFTkNFX0JST1dTRSA9ICJQbGVhc2UgY2hvb3NlIGEgZGlyZWN0b3J5IGZvciBMQVBJIGluY2x1ZGVzOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBUElfSEVMUD0iTG9jYXRpb24gb2YgTEFQSSBoZWxwIGZpbGVzOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBUElfSEVMUF9ERUZBVUxUPSJVc2UgZGVmYXVsdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBUElfSEVMUF9ERUZBVUxUX0lEPSJsYXBpSGVscFVzZURlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVBJX0hFTFBfTElOVVg9IlVzZSBMaW51eCBsb2NhdGlvbjogIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFQSV9IRUxQX0FJWD0iVXNlIEFJWCBsb2NhdGlvbjogIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFQSV9IRUxQX09USEVSPSJPdGhlcjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVBJX0hFTFBfT1RIRVJfSUQ9ImxhcGlIZWxwT3RoZXIiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVBJX0xPQ0FUSU9OX0FJWD0iL29wdC9yc2N0L2xhcGkvZWNsaXBzZS9oZWxwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFQSV9MT0NBVElPTl9MSU5VWD0ib3B0L2libWhwYy9sYXBpL2VjbGlwc2UvaGVscCI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBUElfV0hJQ0hfSEVMUF9JRD0iZGVmYXVsdCI7ICAvLyBhbHRlcm5hdGl2ZXMgYXJlOiBkZWZhdWx0LCBhaXgsIGxpbnV4LCBvdGhlcgotCi0gICAgcHVibGljIExBUElQcmVmZXJlbmNlUGFnZSgpCi0gICAgewotICAgICAgICBzdXBlcihGTEFUKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMQVBJUHJlZmVyZW5jZVBhZ2UoaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIoc3R5bGUpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExBUElQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSwgaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIGltYWdlLCBzdHlsZSk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTEFQSVByZWZlcmVuY2VQYWdlKFN0cmluZyB0aXRsZSwgaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIHN0eWxlKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXQgcHJlZmVyZW5jZSBzdG9yZSBhbmQgc2V0IHRoZSBwcmVmZXJlbmNlIHN0b3JlIGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcmVmZXJlbmNlU3RvcmUoKQotICAgIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IExhcGlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBzZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gICAgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpCi0gICAgewotICAgICAgICBQYXRoRWRpdG9yIHBhdGhFZGl0b3IgPSBuZXcgUGF0aEVkaXRvcihMYXBpSURzLkxBUElfSU5DTFVERVMsIElOQ0xVREVTX1BSRUZFUkVOQ0VfTEFCRUwsCi0gICAgICAgICAgICAgICAgSU5DTFVERVNfUFJFRkVSRU5DRV9CUk9XU0UsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICBhZGRGaWVsZChwYXRoRWRpdG9yKTsKLQotICAgICAgICAvLyJVc2UgZGVmYXVsdD8iCi0vLyAgICAgICAgQm9vbGVhbkZpZWxkRWRpdG9yIGJlZCA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoTEFQSV9IRUxQX0RFRkFVTFRfSUQsTEFQSV9IRUxQX0RFRkFVTFQsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0vLyAgICAgICAgYWRkRmllbGQoYmVkKTsKLSAgLyogICAgICAKLSAgICAgICAgaW50IG51bUNvbD0xOwotICAgIAlSYWRpb0dyb3VwRmllbGRFZGl0b3IgY2hvaWNlRkUgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKExBUElfV0hJQ0hfSEVMUF9JRCwgTEFQSV9IRUxQLCBudW1Db2wsIG5ldyBTdHJpbmdbXVtdIHsKLQkJCQl7IExBUElfSEVMUF9ERUZBVUxULCAiY2hvaWNlMSIgfSwgCi0JCQkJeyBMQVBJX0hFTFBfQUlYK0xBUElfTE9DQVRJT05fQUlYLCAiY2hvaWNlMiIgfSwgCi0JCQkJeyBMQVBJX0hFTFBfTElOVVgrTEFQSV9MT0NBVElPTl9MSU5VWCwgIkNob2ljZTMiIH0sCi0JCQkJeyBMQVBJX0hFTFBfT1RIRVIsICJDaG9pY2U0IiB9fSwKLQkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAJYWRkRmllbGQoY2hvaWNlRkUpOwotICAgIAkKLSAgICAJU3RyaW5nRmllbGRFZGl0b3Igb3RoZXJMb2M9bmV3IFN0cmluZ0ZpZWxkRWRpdG9yKExBUElfSEVMUF9PVEhFUl9JRCwgTEFQSV9IRUxQX09USEVSLGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgIAlhZGRGaWVsZChvdGhlckxvYyk7Ci0gICAgCSovCi0gICAgCQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS92aWV3cy9MYXBpQXJ0aWZhY3RWaWV3LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L2xhcGkvdmlld3MvTGFwaUFydGlmYWN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzBiMDAxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbGFwaS92aWV3cy9MYXBpQXJ0aWZhY3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udmlld3MuU2ltcGxlVGFibGVNYXJrZXJWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkuTGFwaUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLkxhcGlQbHVnaW47Ci0KLQotCi0vKioKLSAqIEEgTEFQSSBhcnRpZmFjdCB2aWV3IGJhc2VkIG9uIFNpbXBsZVRhYmxlVmlldyBOb3RlIHRoYXQgdGhlIElEIG11c3QgYmUgdW5pcXVlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXBpQXJ0aWZhY3RWaWV3IGV4dGVuZHMgU2ltcGxlVGFibGVNYXJrZXJWaWV3Ci17Ci0gICAgcHVibGljIExhcGlBcnRpZmFjdFZpZXcoKQotICAgIHsKLSAgICAgICAgLy8gaWYgeW91IG5lZWQgdG8gcmVhZCBpY29uIGltYWdlcywgZXRjLiBmcm9tIHRoZSBwbHVnLWluLCBiZSBzdXJlIHRvIHBhc3MKLSAgICAgICAgLy8gaW4gYW4gYWN0dWFsIFBsdWdpbiBjbGFzcyBpbnN0YW5jZSBmb3IgZmlyc3QgYXJnCi0gICAgICAgIHN1cGVyKExhcGlQbHVnaW4uZ2V0RGVmYXVsdCgpLCAiTEFQSSBBcnRpZmFjdCIsICJMQVBJIEFydGlmYWN0cyIsICJDb25zdHJ1Y3QiLCBMYXBpSURzLk1BUktFUl9JRCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0Ly5jbGFzc3BhdGggYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmYjNkYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMGJlMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdAotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5pbXBsCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWEwMDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWZiNWJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgQ0RUIEFuYWx5c2lzCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L0FjdGl2YXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMGU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9HcmFwaENyZWF0b3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvR3JhcGhDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTkyM2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9HcmFwaENyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuaW1wbC5DYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuaW1wbC5SZXNvdXJjZUNvbGxlY3RvcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIHZhcmlvdXMgZ3JhcGhzIGZyb20gQyBzb3VyY2UgZmlsZXMKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhDcmVhdG9yIHsKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGluaXRpYWxpemluZyBhbmQgY29tcHV0aW5nIHRoZSBjYWxsIGdyYXBoIGluIG9uZSBwbGFjZS4KLQkgKiA8YnI+VGhpcyBpcyBkb25lIGluIHR3byBzdGVwczoKLQkgKiA8YnI+KDEpIGluaXRDYWxsR3JhcGgoKTogaW5pdGlhbGl6ZSBjYWxsIGdyYXBoIHdpdGggZnVuY3Rpb24gaW5mb3JtYXRpb24KLQkgKiA8YnI+KDIpIGNvbXB1dGVDYWxsR3JhcGgoKTogY29tcHV0ZSBjYWxsZXIvY2FsbGVlL3JlY3Vyc2l2ZSBldGMuIGluZm8gb24gdGhlIGdyYXBoCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQ2FsbEdyYXBoIGNyZWF0ZUNhbGxHcmFwaChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUNhbGxHcmFwaCBjZyA9IGluaXRDYWxsR3JhcGgocmVzb3VyY2UpOwotCQljb21wdXRlQ2FsbEdyYXBoKGNnKTsKLQkJcmV0dXJuIGNnOwotCQkKLQl9Ci0JLyoqCi0JICogQ3JlYXRlIGNhbGwgZ3JhcGggc3RydWN0dXJlIGZyb20gcmVzb3VyY2VzIChDIHNvdXJjZSBmaWxlcykgYnV0IGNhbGxlci9jYWxsZWUgCi0JICogY2FsY3VsYXRpb25zIGFyZSBub3QgZG9uZSB5ZXQ7IHdpbGwgZGVzY2VuZCB0byBjaGlsZHJlbiBvZiBhIGNvbnRhaW5lciBpZgotCSAqIGNhbGxlZCB3aXRoIGEgZm9sZGVyIG9yIHByb2plY3QgYXJndW1lbnQuCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBjYWxsIGdyYXBoIGluaXRpYWxpemVkIHdpdGggYmFzaWMgZnVuY3Rpb24gaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaCBpbml0Q2FsbEdyYXBoKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJQ2FsbEdyYXBoIGNhbGxHcmFwaCA9IG5ldyBDYWxsR3JhcGgoKTsKLQkJY2FsbEdyYXBoID0gaW5pdENhbGxHcmFwaChyZXNvdXJjZSwgY2FsbEdyYXBoKTsKLQkJcmV0dXJuIGNhbGxHcmFwaDsKLQotCX0KLQkvKioKLQkgKiBBZGQgaW5mb3JtYXRpb24gdG8gYW4gZXhpc3RpbmcgY2FsbCBncmFwaC4KLQkgKiAgPGJyPldpbGwgZGVzY2VuZCB0byBjaGlsZHJlbiBpZiB0aGlzIGlzIGEgY29udGFpbmVyIChmb2xkZXIgb3IgcHJvamVjdCkKLQkgKiAgCi0JICogQHBhcmFtIHJlc291cmNlIGNvbnRhaW5zIHNvdXJjZSBmaWxlKHMpIHdob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIGZvdW5kIGFuZCBhZGRlZCB0byB0aGUgY2FsbCBncmFwaC4gIAotCSAqIEBwYXJhbSBjYWxsR3JhcGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElDYWxsR3JhcGggaW5pdENhbGxHcmFwaChJUmVzb3VyY2UgcmVzb3VyY2UsIElDYWxsR3JhcGggY2FsbEdyYXBoKSB7Ci0JCWJvb2xlYW4gZm91bmRFcnJvciA9IHJlc291cmNlQ29sbGVjdG9yKHJlc291cmNlLCBjYWxsR3JhcGgpOwotCQlpZihmb3VuZEVycm9yKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9jY3VycmVkIGR1cmluZyBjYWxsIGdyYXBoIGNyZWF0aW9uLiIpOwotCQl9Ci0JCXJldHVybiBjYWxsR3JhcGg7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbXB0eSBjYWxsIGdyYXBoLCByZWFkeSB0byBmaWxsIHdpdGggZnVuY3Rpb24gaW5mb3JtYXRpb24KLQkgKiBsYXRlciB3aXRoIHN1YnNlcXVlbnQgY2FsbHMgdG8gaW5pdENhbGxHcmFwaChyZXNvdXJjZSwgY2FsbEdyYXBoKQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaCBpbml0Q2FsbEdyYXBoKCkgewotCQlyZXR1cm4gbmV3IENhbGxHcmFwaCgpOwotCX0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGNhbGxlci9jYWxsZWUgYW5kIHJlY3Vyc2l2ZSBwcm9wZXJ0aWVzIG9mIHRoZSBjYWxsIGdyYXBoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQ2FsbEdyYXBoIGNvbXB1dGVDYWxsR3JhcGgoSUNhbGxHcmFwaCBjYWxsR3JhcGgpIHsKLQkJY2FsbEdyYXBoLmJ1aWxkQ0coKTsKLQkJcmV0dXJuIGNhbGxHcmFwaDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSdW4gYW5hbHlzaXMgKCJSZXNvdXJjZSBjb2xsZWN0b3IiKSBvbiBhIHJlc291cmNlIChlLmcuIEZpbGUgb3IgRm9sZGVyKSAKLQkgKiBhbmQgYWRkIHRoZSBmdW5jdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbi91bmRlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgKGZpbGUgb3IgY29udGFpbmVyKQotCSAqIHRvIHRoZSBnaXZlbiBjYWxsIGdyYXBoCi0JICogPGJyPldpbGwgZGVzY2VuZCB0byBtZW1iZXJzIG9mIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyCi0JICogQHBhcmFtIGNhbGxHcmFwaCB0aGUgY2FsbCBncmFwaCB0byB3aGljaCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBhcHBlbmRlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXNvdXJjZUNvbGxlY3RvcihJUmVzb3VyY2UgcmVzb3VyY2UsIElDYWxsR3JhcGggY2FsbEdyYXBoKSB7Ci0KLQkJYm9vbGVhbiBmb3VuZEVycm9yID0gZmFsc2U7Ci0KLQkJLy8gaWYgaXQncyBhIEMgZmlsZSwgY29sbGVjdCBpbmZvIGluIHRoZSBjYWxsIGdyYXBoIGZvciB0aGlzIGZpbGUKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQlpZiAoZmlsZW5hbWUuZW5kc1dpdGgoIi5jIikpIHsKLQkJCQlSZXNvdXJjZUNvbGxlY3RvciByYyA9IG5ldyBSZXNvdXJjZUNvbGxlY3RvcihjYWxsR3JhcGgsIGZpbGUpOwotCQkJCXJjLnJ1bigpOwotCQkJfQotCQkJLy8gaWYgaXQncyBhIGNvbnRhaW5lciwgcnVuIHJlc291cmNlQ29sbGVjdG9yIG9uIGVhY2ggb2YgaXRzIG1lbWJlcnMKLQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJdHJ5IHsKLQkJCQlJUmVzb3VyY2VbXSBtZW1zID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYm9vbGVhbiBlcnIgPSByZXNvdXJjZUNvbGxlY3RvcihtZW1zW2ldLCBjYWxsR3JhcGgpOwotCQkJCQlmb3VuZEVycm9yID0gZm91bmRFcnJvciB8fCBlcnI7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlmb3VuZEVycm9yPXRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyA/Pz8/PwotCQkJU3RyaW5nIG5hbWUgPSAiIjsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSByZXNvdXJjZTsKLQkJCQkvLyBuYW1lPXJlcy5nZXROYW1lKCk7IC8vIHNpbXBsZSBmaWxlbmFtZSBvbmx5LCBubyBwYXRoIGluZm8KLQkJCQlJUGF0aCBwYXRoID0gcmVzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQluYW1lID0gcGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5jZWxsZWQgYnkgVXNlciwgYWJvcnRpbmcgYW5hbHlzaXMgb24gc3Vic2VxdWVudCBmaWxlcy4uLiAiCi0JCQkJCQkJKyBuYW1lKTsKLQkJfQotCi0JCXJldHVybiBmb3VuZEVycm9yOwotCX0KLQkvKioKLQkgKiBQcmludCBhIGNhbGwgZ3JhcGggc3RydWN0dXJlCi0JICogQHBhcmFtIGNnIHRoZSBjYWxsIGdyYXBoIHRvIHByaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2hvd0NhbGxHcmFwaChJQ2FsbEdyYXBoIGNnKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU2hvdyBjYWxsIGdyYXBoIik7Ci0JCUxpc3Q8SUNhbGxHcmFwaE5vZGU+IG5vZGVzID0gY2cuZ2V0QWxsTm9kZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxJQ2FsbEdyYXBoTm9kZT4gaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJQ2FsbEdyYXBoTm9kZSBjZ05vZGUgPSAgaXRlcmF0b3IubmV4dCgpOwotCQkJcHJpbnRDR05vZGUoY2dOb2RlLCAiIik7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICBjYWxsZXJzOiA9PT4iKTsKLQkKLQkJCWZvciAoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGl0ZXJhdG9yMiA9IGNnTm9kZS5nZXRDYWxsZXJzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IyLmhhc05leHQoKTspIHsKLQkJCQlJQ2FsbEdyYXBoTm9kZSBjYWxsZXIgPSBpdGVyYXRvcjIubmV4dCgpOwotCQkJCXByaW50Q0dOb2RlKGNhbGxlciwiICAgIGNhbGxlcjogIik7CQkJCi0JCQl9Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICA8PT0gY2FsbGVlczoiKTsKLQkJCWZvciAoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGl0ZXJhdG9yMyA9IGNnTm9kZS5nZXRDYWxsZWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IzLmhhc05leHQoKTspIHsKLQkJCQlJQ2FsbEdyYXBoTm9kZSBjYWxsZWUgPSAgaXRlcmF0b3IzLm5leHQoKTsKLQkJCQlwcmludENHTm9kZShjYWxsZWUsIiAgICBjYWxsZWU6ICIpOwotCQkJCQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0JCQkKLQkJfQotCQlMaXN0PExpc3Q8SUNhbGxHcmFwaE5vZGU+PmN5Y2xlcyA9IGNnLmdldEN5Y2xlcygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY3Vyc2l2ZSBjeWNsZXM6Iik7Ci0JCWZvciAoTGlzdDxJQ2FsbEdyYXBoTm9kZT4gY3ljbGUgOiBjeWNsZXMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3ljbGU6ICIpOwotCQkJZm9yIChJdGVyYXRvcjxJQ2FsbEdyYXBoTm9kZT4gaXRlcmF0b3IgPSBjeWNsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNhbGxHcmFwaE5vZGUgZm4gPSAgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAiK2ZuLmdldEZ1bmNOYW1lKCkpOwotCQkJCQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXG4iKTsKLQkJfQotCQlMaXN0PFN0cmluZz4gdmFycz0gY2cuZ2V0RW52KCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiR2xvYmFsIHZhcmlhYmxlczoiKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHZhcml0PSB2YXJzLml0ZXJhdG9yKCk7IHZhcml0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB2YXIgPSB2YXJpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdsb2JhbCB2YXI6ICIrdmFyKTsKLQkJCQotCQl9Ci0JCQotCX0KLQlwdWJsaWMgdm9pZCBwcmludENHTm9kZShJQ2FsbEdyYXBoTm9kZSBjZ05vZGUsIFN0cmluZyBwcmVmaXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHByZWZpeCsiICIrY2dOb2RlLmdldEZ1bmNOYW1lKCkrIiBpbiAiK2NnTm9kZS5nZXRGaWxlTmFtZSgpKTsKLQkJY2dOb2RlLmdldENGRygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvSUJsb2NrLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL0lCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFiODc5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvSUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci0KLS8qKgotICogQSAiQmxvY2siIGNvbnRhaW5zIGVpdGhlciBhIHNpbmdsZSBzdGF0ZW1lbnQgb3IgYSBwcmVkaWNhdGUgZXhwcmVzc2lvbiwgCi0gKiBhbmQgaXQgY2FuIGJlIGVudGVyZWQgb25seSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBleGl0ZWQgb25seSBhdCB0aGUgZW5kLgotICogCi0gKiBAYXV0aG9yIFl1YW4gWmhhbmcKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJsb2NrIHsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgSUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldElEKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHN1Y2Nlc3NvcnMgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaAotCSAqLwotCXB1YmxpYyBMaXN0PElCbG9jaz4gZ2V0U3VjY3MoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHByZWRlY2Vzc29ycyBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoCi0JICovCi0JcHVibGljIExpc3Q8SUJsb2NrPiBnZXRQcmVkcygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5leHQgIGJsb2NrIGluIENGRyBhY2NvcmRpbmcgdG8gdGhlIHRvcG9sb2dpY2FsIAotCSAqIG9yZGVyICh0b3AtZG93biBvcmRlcikKLQkgKi8KLQlwdWJsaWMgSUJsb2NrIHRvcE5leHQoKTsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuZXh0ICBibG9jayBpbiBDRkcgYWNjb3JkaW5nIHRvIHRoZSB0b3BvbG9naWNhbCAKLQkgKiBvcmRlciAodG9wLWRvd24gb3JkZXIpCi0JICovCi0JcHVibGljIElCbG9jayBnZXRUb3BOZXh0KCk7Ci0JLyoqCi0JICogU2V0IHRoZSBuZXh0ICBibG9jayBpbiBDRkcgYWNjb3JkaW5nIHRvIHRoZSB0b3BvbG9naWNhbCAKLQkgKiBvcmRlciAodG9wLWRvd24gb3JkZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wTmV4dChJQmxvY2sgYik7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGJsb2NrIGluIENGRyBhY2NvcmRpbmcgdG8gdGhlIHJldmVyc2UKLQkgKiB0b3BvbG9naWNhbCBvcmRlciAoYm90dG9tLXVwIG9yZGVyKQotCSAqLwotCXB1YmxpYyBJQmxvY2sgYm90TmV4dCgpOwotCS8qKgotCSAqIEdldCB0aGUgbmV4dCBibG9jayBpbiBDRkcgYWNjb3JkaW5nIHRvIHRoZSByZXZlcnNlCi0JICogdG9wb2xvZ2ljYWwgb3JkZXIgKGJvdHRvbS11cCBvcmRlcikKLQkgKi8KLQlwdWJsaWMgSUJsb2NrIGdldEJvdE5leHQoKTsKLQkvKioKLQkgKiBTZXQgdGhlIG5leHQgYmxvY2sgaW4gQ0ZHIGFjY29yZGluZyB0byB0aGUgcmV2ZXJzZQotCSAqIHRvcG9sb2dpY2FsIG9yZGVyIChib3R0b20tdXAgb3JkZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm90TmV4dChJQmxvY2sgYik7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IChhIHByZWRpY2F0ZSBleHByZXNzaW9uIG9yIGEgc3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyBJQVNUTm9kZSBnZXRDb250ZW50KCk7Ci0JCi0JLyoqCi0JICogU2VhcmNoIHRvIGRldGVybWluZSBpZiBhIGJsb2NrIGNvbnRhaW5zIGFuIGV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBibG9jayBjb250YWlucyBleHByZXNzaW9uIGV4cHIKLQkgKiB3aGljaCBpcyB0aGUgcHJlZGljYXRlIG9mIHN0YXRlbWVudCA8cGFyZW50PiwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlYXJjaChJQVNURXhwcmVzc2lvbiBleHByLCBJQVNUU3RhdGVtZW50IHBhcmVudCk7Ci0JLyoqIAotCSAqIFNlYXJjaCB0byBkZXRlcm1pbmUgaWYgYSBibG9jayBjb250YWlucyBhIHN0YXRlbWVudAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGJsb2NrIGNvbnRhaW5zIHN0YXRlbWVudCBzdG10LAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWFyY2goSUFTVFN0YXRlbWVudCBzdG10KTsKLQkvKioKLQkgKiBTZWFyY2ggdG8gZGV0ZXJtaW5lIGlmIGEgYmxvY2sgY29udGFpbnMgYSBnaXZlbiBsYWJlbAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGJsb2NrIGNvbnRhaW5zIGxhYmVsLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWFyY2goSUFTVE5hbWUgbGFiZWwpOwotCQotCS8qKgotCSAqIEdldCBEb21pbmF0b3JzPGJyPgotCSAqIEJsb2NrIEEgZG9taW5hdGVzIGFub3RoZXIgYmxvY2sgQiBpZiBldmVyeSBwYXRoIGZyb20gdGhlIGVudHJ5IHRoYXQgCi0JICogcmVhY2hlcyAgYmxvY2sgQiBoYXMgdG8gcGFzcyB0aHJvdWdoICBibG9jayBBLgotCSAqIFRoZSBlbnRyeSBibG9jayBkb21pbmF0ZXMgYWxsIGJsb2Nrcy4KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgZG9taW5hdG9yIElCbG9ja3MKLQkgKi8KLQlwdWJsaWMgTGlzdDxJQmxvY2s+IGdldERPTSgpOwotCS8qKgotCSAqIFNldCBkb21pbmF0b3JzCi0JICogQHBhcmFtIHNldCBsaXN0IG9mIGRvbWluYXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRET00oTGlzdDxJQmxvY2s+IHNldCk7Ci0JCi0JLyoqCi0JICogR2V0IHBvc3QtZG9taW5hdG9yczxicj4KLQkgKiBCbG9jayBBIHBvc3Rkb21pbmF0ZXMgYmxvY2sgQiBpZiBldmVyeSBwYXRoIGZyb20gQiB0byB0aGUgZXhpdCBoYXMgdG8gcGFzcyB0aHJvdWdoIGJsb2NrIEEuICAKLQkgKiBUaGUgZXhpdCBibG9jayBwb3N0ZG9taW5hdGVzIGFsbCBibG9ja3MuCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIHBvc3QtZG9taW5hdG9yIElCbG9ja3MKLQkgKi8KLQlwdWJsaWMgTGlzdDxJQmxvY2s+IGdldFBET00oKTsKLQkvKioKLQkgKiBzZXQgcG9zdC1kb21pbmF0b3JzCi0JICogQHBhcmFtIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBET00oTGlzdDxJQmxvY2s+IHNldCk7Ci0KLQkvKiogCi0JICogQW4gYXR0cmlidXRlIChpZGVudGlmaWVkIGJ5IGl0cyBuYW1lKSBvZiBhIGJsb2NrIGNvdWxkIGJlIGFueSAKLQkgKiBwcm9wZXJ0eSBvZiBpdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBhdHRyCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cihTdHJpbmcgbmFtZSwgT2JqZWN0IGF0dHIpOwotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgb2YgYSBibG9jawotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cihTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogUHJpbnQgSUJsb2NrIGluZm9ybWF0aW9uLCBpbmNsdWRlIGlkLCBjb250ZW50LCBhbmQgc3VjY2Vzc29ycwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9JQ2FsbEdyYXBoLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL0lDYWxsR3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhMDM5MS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL0lDYWxsR3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBoczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25EZWZpbml0aW9uOwotCi0vKioKLSAqIEEgY2FsbCBncmFwaCBpcyBhIGRpcmVjdGVkIGdyYXBoIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNhbGxpbmcgcmVsYXRpb24KLSAqIGFtb25nIHN1YnJvdXRpbmVzIGluIGEgcHJvZ3JhbS4gSW4gQ0RULCBpdCBpcyBwYXJ0aWFsbHkgZGV0ZXJtaW5lZAotICogYnkgc3RhdGljIGFuYWx5c2lzLgotICogCi0gKiBAYXV0aG9yIFl1YW4gWmhhbmcKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxHcmFwaCB7Ci0JCi0JLyoqCi0JICogQHJldHVybiBhbGwgZnVuY3Rpb25zIGluIHRoZSBjYWxsIGdyYXBoCi0JICovCi0JcHVibGljIExpc3Q8SUNhbGxHcmFwaE5vZGU+IGdldEFsbE5vZGVzKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBhbGwgZ2xvYmFsIHZhcmlhYmxlcwotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RW52KCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBvbmUgcm9vdCBmdW5jdGlvbi4gQSByb290IGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCBieSAKLQkgKiBvdGhlciBmdW5jdGlvbnMuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSByb290IGZ1bmN0aW9ucyBpbiBhIGNhbGwKLQkgKiBncmFwaC4gCi0JICovCi0JcHVibGljIElDYWxsR3JhcGhOb2RlIHRvcEVudHJ5KCk7Ci0JcHVibGljIHZvaWQgc2V0VG9wRW50cnkoSUNhbGxHcmFwaE5vZGUgbm9kZSk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBvbmUgbGVhZiBmdW5jdGlvbi4gQSBsZWFmIGZ1bmN0aW9uIG5ldmVyIGNhbGxzIGFueSBvdGhlcgotCSAqIGZ1bmN0aW9ucy4gVGhlcmUgbWF5IGJlIG11bHRpcGxlIGxlYWYgZnVuY3Rpb25zIGluIGEgY2FsbCBncmFwaC4KLQkgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgYm90RW50cnkoKTsKLQlwdWJsaWMgdm9pZCBzZXRCb3RFbnRyeShJQ2FsbEdyYXBoTm9kZSBub2RlKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgcmVjdXJzaXZlIGZ1bmN0aW9uIGNhbGxzCi0JICovCi0JcHVibGljIExpc3Q8TGlzdDxJQ2FsbEdyYXBoTm9kZT4+IGdldEN5Y2xlcygpOwotCQotCS8qKgotCSAqIFNlYXJjaCBmb3IgYSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gaXRzIGZpbGVuYW1lIGFuZCBmdW5jdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEBwYXJhbSBmdW5jTmFtZQotCSAqIEByZXR1cm4gaXRzIGNhbGwgZ3JhcGggbm9kZSBpZiBpdCBpcyBmb3VuZDsgbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIElDYWxsR3JhcGhOb2RlIGdldE5vZGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZnVuY05hbWUpOwotCQotCS8qKgotCSAqIFNlYXJjaCBmb3IgYSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gaXRzIGRlY2xhcmF0aW9uLgotCSAqIEBwYXJhbSBmZGVmCi0JICogQHJldHVybiBpdHMgY2FsbCBncmFwaCBub2RlIGlmIGl0IGlzIGZvdW5kOyBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgZ2V0Tm9kZShJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZkZWYpOwotCQotCS8qKgotCSAqIEFkZCBhIGZ1bmN0aW9uIG5vZGUgdG8gdGhlIGNhbGwgZ3JhcGguIEl0cyBjYWxsaW5nIHJlbGF0aW9uCi0JICogaXMgbm90IGNvbnN0cnVjdGVkIHlldC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5vZGUoSUNhbGxHcmFwaE5vZGUgbm9kZSk7Ci0JCi0JLyoqCi0JICogQnVpbGQgdGhlIGNhbGxpbmcgcmVsYXRpb25zLiBUaGlzIG1ldGhvZCBpcyBub3QgcmVwb25zaWJsZSBmb3IKLQkgKiBjb2xsZWN0aW5nIGZ1bmN0aW9ucyBpbiBhIHByb2dyYW0uCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRDRygpOwotCQotCXB1YmxpYyB2b2lkIHByaW50KCk7Ci0JCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL0lDYWxsR3JhcGhOb2RlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL0lDYWxsR3JhcGhOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzQ2NjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9JQ2FsbEdyYXBoTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIEEgY2FsbCBncmFwaCBub2RlIGNvcnJlc3BvbmRzIHRvIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uLgotICogCi0gKiBAYXV0aG9yIFl1YW4gWmhhbmcKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxHcmFwaE5vZGUgewotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGZ1bmN0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmNOYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZW5jbG9zaW5nIGZpbGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKTsKLQkKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBnZXRGdW5jRGVmKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0PElDYWxsR3JhcGhOb2RlPiBnZXRDYWxsZXJzKCk7Ci0JcHVibGljIHZvaWQgYWRkQ2FsbGVyKElDYWxsR3JhcGhOb2RlIGNhbGxlcik7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0PElDYWxsR3JhcGhOb2RlPglnZXRDYWxsZWVzKCk7Ci0JcHVibGljIHZvaWQgYWRkQ2FsbGVlKElDYWxsR3JhcGhOb2RlIGNhbGxlZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggb2YgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBJQ29udHJvbEZsb3dHcmFwaCBnZXRDRkcoKTsKLQlwdWJsaWMgdm9pZCBzZXRDRkcoSUNvbnRyb2xGbG93R3JhcGggY2ZnKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGFjY29yZGluZyB0byB0aGUgdG9wb2xvZ2ljYWwgb3JkZXIKLQkgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgdG9wTmV4dCgpOwotCXB1YmxpYyB2b2lkIHNldFRvcE5leHQoSUNhbGxHcmFwaE5vZGUgbm9kZSk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHJldmVyc2UgdG9wb2xvZ2ljYWwgb3JkZXIKLQkgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgYm90TmV4dCgpOwotCXB1YmxpYyB2b2lkIHNldEJvdE5leHQoSUNhbGxHcmFwaE5vZGUgbm9kZSk7Ci0JCi0JcHVibGljIHZvaWQgc2V0QXR0cihTdHJpbmcgbmFtZSwgT2JqZWN0IGF0dHIpOwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cihTdHJpbmcgbmFtZSk7Ci0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cihTdHJpbmcgbmFtZSk7Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gdmFsKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1JlY3Vyc2l2ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9JQ29udHJvbEZsb3dHcmFwaC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9JQ29udHJvbEZsb3dHcmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2M0NDQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvSUNvbnRyb2xGbG93R3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBoczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci0KLS8qKgotICogQSBjb250cm9sIGZsb3cgZ3JhcGggaXMgZGlyZWN0ZWQgZ3JhcGguIEVhY2ggbm9kZSBpcyBhIGJsb2NrLCBhbmQKLSAqIGVhY2ggZWRnZSByZXByZXNlbnRzIHRoZSBqdW1wIGluIHRoZSBjb250cm9sIGZsb3cuCi0gKiAKLSAqIEBhdXRob3IgWXVhbiBaaGFuZwotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250cm9sRmxvd0dyYXBoIHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVudHJ5IGJsb2NrCi0JICovCi0JcHVibGljIElCbG9jayBnZXRFbnRyeSgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGV4aXQgYmxvY2sKLQkgKi8KLQlwdWJsaWMgSUJsb2NrIGdldEV4aXQoKTsKLQkKLQkKLQkvKiogU2VhcmNoIGZvciB0aGUgYmxvY2sgd2hpY2ggY29udGFpbnMgdGhlIHN0YXRlbWVudCA8c3RtdD4KLQkgKi8KLQlwdWJsaWMgSUJsb2NrIGdldEJsb2NrKElBU1RTdGF0ZW1lbnQgc3RtdCk7Ci0JLyoqCi0JICogU2VhcmNoIGZvciB0aGUgYmxvY2sgd2hpY2ggY29udGFpbnMgdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uCi0JICogPGV4cHI+LCBhbmQgPGV4cHI+IGlzIHRoZSBwcmVkaWNhdGUgb2Ygc3RhdGVtZW50IDxwYXJlbnQ+Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQmxvY2sgZ2V0QmxvY2soSUFTVEV4cHJlc3Npb24gZXhwciwgSUFTVFN0YXRlbWVudCBwYXJlbnQpOwotCQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIGJsb2NrIHdoaWNoIGNvbnRhaW5zIHRoZSA8bGFiZWw+IAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUJsb2NrIGdldEJsb2NrKElBU1ROYW1lIGxhYmVsKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRCbG9jayhJQmxvY2sgYmIpOwotCQotCS8qKgotCSAqIEJ1aWxkIHRoZSBjb250cm9sIGZsb3cgcmVsYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENGRygpOwotCQotCXB1YmxpYyB2b2lkIHByaW50KCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL2ltcGwvQmxvY2suamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMwMGMwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQmxvY2s7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFl1YW4gWmhhbmcKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9jayBpbXBsZW1lbnRzIElCbG9jayB7Ci0JcHJvdGVjdGVkIExpc3Q8SUJsb2NrPiBzdWNjc187Ci0JcHJvdGVjdGVkIExpc3Q8SUJsb2NrPiBwcmVkc187Ci0JcHJvdGVjdGVkIElCbG9jayB0b3BOZXh0XyA9IG51bGw7Ci0JcHJvdGVjdGVkIElCbG9jayBib3ROZXh0XyA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3Q8SUJsb2NrPiBET01fID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdDxJQmxvY2s+IFBET01fID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBjb3VudGVyID0gMDsKLQlwcm90ZWN0ZWQgaW50IGlkOwotCQotCS8qKiAidHlwZSIgdGVsbHMgdGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgaW4gdGhpcyBibG9jay4gCi0JICogQSBibG9jayB3aXRoIGV4cHJfdHlwZS9zdG10X3R5cGUvbGFiZWxfdHlwZSBzdG9yZXMgYW4gCi0JICogZXhwcmVzc2lvbi9zdGF0ZW1lbnQvbGFiZWxuYW1lLCByZXNwZWN0aXZlbHkuIEEgYmxvY2sKLQkgKiB3aXRoIGNvbnRpbnVlX2pvaW5fdHlwZSBpcyBhbiBlbXB0eSBibG9jayBpbiBhIGxvb3AgCi0JICogam9pbmluZyByZWd1bGFyIGZsb3dzIGFuZCBmbG93cyBmcm9tIGNvbnRpbnVlIHN0YXRlbWVudHMuCi0JICogQSBibG9jayB3aXRoIGV4aXRfam9pbl90eXBlIGlzIGFuIGVtcHR5IGJsb2NrIGpvaW5pbmcKLQkgKiAoMSkgdHdvIGJyYW5jaGVzIG9mIGFuIGlmIHN0YXRlbWVudCAoMikgYWxsIGxlYXZpbmcKLQkgKiBlZGdlcyAodGhyb3VnaCBicmVhayBvciBkZWZhdWx0IHN0YXRlbWVudHMpIG9mIGEKLQkgKiBzd2l0Y2ggc3RhdGVtZW50ICgzKSB0aGUgcmVndWxhciBleGl0IGZyb20gYSBsb29wIGFuZAotCSAqIGlycmVndWxhciBleGl0cyBmcm9tIGJyZWFrIHN0YXRlbWVudHMgb2YgdGhpcyBsb29wLiAgCi0JICovCi0JcHJvdGVjdGVkIGludCB0eXBlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cHJfdHlwZSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RtdF90eXBlID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYWJlbF90eXBlID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb250aW51ZV9qb2luX3R5cGUgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4aXRfam9pbl90eXBlID0gNTsKLQkKLQlwcm90ZWN0ZWQgSUFTVE5vZGUgY29udGVudF87Ci0JCi0JLyoqIFRoZSBwYXJlbnQgb2YgYSBibG9jayBzdG9yaW5nIGEgc3RhdGVtZW50IGlzIHRoZSBzdGF0ZW1lbnQgaXRzZWxmOwotCSAqICBUaGUgcGFyZW50IG9mIGEgYmxvY2sgd2l0aCBhIHByZWRpY2F0ZSBleHByZXNzaW9uIGlzIHRoZSBjb3JyZXNwb25kaW5nCi0JICogIGlmL2xvb3Avc3dpdGNoIHN0YXRlbWVudDsKLQkgKiAgVGhlIHBhcmVudCBvZiBhIGJsb2NrIHdpdGggYSBsYWJlbCBpcyB0aGUgbGFiZWwgc3RhdGVtZW50OwotCSAqICBUaGUgcGFyZW50IG9mIGEgYmxvY2sgd2l0aCBjb250aW51ZV9qb2luX3R5cGUgb3IgZXhpdF9qb2luX3R5cGUKLQkgKiAgaXMgdGhlIGNvcnJlc3BvbmRpbmcgaWYvbG9vcC9zd2l0Y2ggc3RhdGVtZW50OwotCSAqLwotCXByb3RlY3RlZCBJQVNUU3RhdGVtZW50IHBhcmVudF87Ci0JCi0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsT2JqZWN0PiBhdHRyc187Ci0JCi0JaW50IGNvbG9yOyAvLyB3aGl0ZSA9IDAsIGdyYXkgPSAxLCBibGFjayA9IDIKLQkKLQlwdWJsaWMgQmxvY2soKXsKLQkJaWQgPSBjb3VudGVyICsrOwotCQl0eXBlID0gMDsKLQkJY29udGVudF8gPSBudWxsOwotCQlwYXJlbnRfID0gbnVsbDsKLQkJYmxvY2tJbml0KCk7Ci0JfQotCi0JcHVibGljIEJsb2NrKElBU1ROb2RlIGNvbnRlbnQsIElBU1RTdGF0ZW1lbnQgcGFyZW50LCBpbnQgdHlwZSl7Ci0JCXRoaXMoKTsKLQkJY29udGVudF8gPSBjb250ZW50OwotCQlwYXJlbnRfID0gcGFyZW50OwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQlibG9ja0luaXQoKTsKLQl9Ci0JCi0JLyoqIFNob3J0LWN1dCBjb25zdHJ1Y3RvciBmb3Igc3RtdF90eXBlIGJsb2NrICovCi0JcHVibGljIEJsb2NrKElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCXRoaXMoc3RtdCwgc3RtdCwgc3RtdF90eXBlKTsKLQl9Ci0JCi0JLyoqIFNob3J0LWN1dCBjb25zdHJ1Y3RvciBmb3IgZXhwcl90eXBlIGJsb2NrICovCi0JcHVibGljIEJsb2NrKElBU1RFeHByZXNzaW9uIGV4cHIsIElBU1RTdGF0ZW1lbnQgcGFyZW50KXsKLQkJdGhpcyhleHByLCBwYXJlbnQsIGV4cHJfdHlwZSk7Ci0JfQotCQotCS8qKiBTaG9ydC1jdXQgY29uc3RydWN0b3IgZm9yIGxhYmVsX3R5cGUgYmxvY2sgKi8KLQlwdWJsaWMgQmxvY2soSUFTVE5hbWUgbGFiZWwpewotCQl0aGlzKGxhYmVsLCBudWxsLCBsYWJlbF90eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYmxvY2tJbml0KCl7Ci0JCXN1Y2NzXyA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQlwcmVkc18gPSBuZXcgQXJyYXlMaXN0PElCbG9jaz4oKTsKLQkJRE9NXyA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQlQRE9NXyA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQlhdHRyc18gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxPYmplY3Q+KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJRCgpewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyBJQVNUTm9kZSBnZXRDb250ZW50KCl7Ci0JCXJldHVybiBjb250ZW50XzsKLQl9Ci0JCi0JcHVibGljIElBU1RTdGF0ZW1lbnQgZ2V0UGFyZW50KCl7Ci0JCXJldHVybiBwYXJlbnRfOwotCX0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7cmV0dXJuIHR5cGU7fQotCi0JcHVibGljIGJvb2xlYW4gc2VhcmNoKElBU1ROb2RlIGNvbnRlbnQsIElBU1RTdGF0ZW1lbnQgcGFyZW50LCBpbnQgdHlwZSl7Ci0JCWlmKHRoaXMudHlwZSAhPSB0eXBlKSByZXR1cm4gZmFsc2U7Ci0JCWlmKHR5cGUgPT0gc3RtdF90eXBlKXsKLQkJCWlmKGNvbnRlbnQgPT0gY29udGVudF8pIHJldHVybiB0cnVlOwotCQkJZWxzZSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZih0eXBlID09IGxhYmVsX3R5cGUpewotCQkJaWYoY29udGVudCBpbnN0YW5jZW9mIElBU1ROYW1lKXsKLQkJCQlJQVNUTmFtZSBuYW1lID0gKElBU1ROYW1lKWNvbnRlbnQ7Ci0JCQkJSUFTVE5hbWUgbGFiZWxOYW1lID0gKElBU1ROYW1lKWNvbnRlbnRfOwotCQkJCWlmKG5hbWUudG9TdHJpbmcoKS5lcXVhbHMobGFiZWxOYW1lLnRvU3RyaW5nKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYodHlwZSA9PSBleHByX3R5cGUpewotCQkJaWYoY29udGVudCAhPSBudWxsICYmIGNvbnRlbnQgPT0gY29udGVudF8pIHJldHVybiB0cnVlOwotCQkJaWYoY29udGVudCA9PSBudWxsICYmIGNvbnRlbnRfID09IG51bGwgJiYgcGFyZW50XyA9PSBwYXJlbnQpIAotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZih0eXBlID09IGNvbnRpbnVlX2pvaW5fdHlwZSB8fCB0eXBlID09IGV4aXRfam9pbl90eXBlKXsKLQkJCWlmKGNvbnRlbnQgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJaWYocGFyZW50ID09IHBhcmVudF8pIHJldHVybiB0cnVlOwotCQkJZWxzZSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2VhcmNoKElBU1RFeHByZXNzaW9uIGV4cHIsIElBU1RTdGF0ZW1lbnQgcGFyZW50KXsKLQkJcmV0dXJuIHNlYXJjaChleHByLCBwYXJlbnQsIGV4cHJfdHlwZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNlYXJjaChJQVNUU3RhdGVtZW50IHN0bXQpewotCQlyZXR1cm4gc2VhcmNoKHN0bXQsIHN0bXQsIHN0bXRfdHlwZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNlYXJjaChJQVNUTmFtZSBsYWJlbCl7Ci0JCXJldHVybiBzZWFyY2gobGFiZWwsIG51bGwsIGxhYmVsX3R5cGUpOwotCX0KLQkKLQlwdWJsaWMgSUJsb2NrIHRvcE5leHQoKSB7Ci0JCXJldHVybiB0b3BOZXh0XzsKLQl9Ci0JcHVibGljIElCbG9jayBnZXRUb3BOZXh0KCkgewotCQlyZXR1cm4gdG9wTmV4dF87Ci0JfQotCXB1YmxpYyB2b2lkIHNldFRvcE5leHQoSUJsb2NrIGIpewotCQl0b3BOZXh0XyA9IGI7Ci0JfQotCQotCXB1YmxpYyBJQmxvY2sgYm90TmV4dCgpIHsKLQkJcmV0dXJuIGJvdE5leHRfOwotCX0KLQlwdWJsaWMgSUJsb2NrIGdldEJvdE5leHQoKSB7Ci0JCXJldHVybiBib3ROZXh0XzsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Qm90TmV4dChJQmxvY2sgYil7Ci0JCWJvdE5leHRfID0gYjsKLQl9Ci0JCi0JcHVibGljIExpc3Q8SUJsb2NrPiBnZXRQcmVkcygpIHsKLQkJcmV0dXJuIHByZWRzXzsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJQmxvY2s+IGdldFN1Y2NzKCkgewotCQlyZXR1cm4gc3VjY3NfOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxJQmxvY2s+IGdldERPTSgpewotCQlyZXR1cm4gRE9NXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RE9NKExpc3Q8SUJsb2NrPiBzZXQpewotCQlET01fID0gc2V0OwotCX0KLQkKLQlwdWJsaWMgTGlzdDxJQmxvY2s+IGdldFBET00oKXsKLQkJcmV0dXJuIFBET01fOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQRE9NKExpc3Q8SUJsb2NrPiBzZXQpewotCQlQRE9NXyA9IHNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyKFN0cmluZyBuYW1lLCBPYmplY3QgYXR0cil7Ci0JCWF0dHJzXy5wdXQobmFtZSwgYXR0cik7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cihTdHJpbmcgbmFtZSl7Ci0JCXJldHVybiBhdHRyc18uZ2V0KG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBJQmxvY2sgaW5mb3JtYXRpb24sIGluY2x1ZGUgaWQsIGNvbnRlbnQgKHR5cGUgJiByYXcgc2lnbmF0dXJlKSwgYW5kIHN1Y2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpewotCQlTeXN0ZW0ub3V0LnByaW50KCJCbG9jayAiICsgaWQgKyAiOiAiKTsKLQkJSUFTVE5vZGUgY29udGVudCA9IGdldENvbnRlbnQoKTsKLQkJaWYoY29udGVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZT1jb250ZW50LnRvU3RyaW5nKCk7IC8vIGEuYi5jLk5hbWVAYWJjZAotCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKHR5cGUubGFzdEluZGV4T2YoJy4nKSsxKTsgIC8vIE5hbWVAYWJjZAotCQkJdHlwZT10eXBlLnN1YnN0cmluZygwLHR5cGUuaW5kZXhPZignQCcpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAiK3R5cGUrIiAgIitjb250ZW50LmdldFJhd1NpZ25hdHVyZSgpKTsKLQkJfQotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgRW1wdHkgYmxvY2siKTsKLQkJU3lzdGVtLm91dC5wcmludCgiICBmbG93cyB0bzogIik7Ci0JCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBzdWNjc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCVN5c3RlbS5vdXQucHJpbnQoaS5uZXh0KCkuZ2V0SUQoKSArICIsICIpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCQkvKgotCQlTeXN0ZW0ub3V0LnByaW50KCJEb21pbmF0b3I6ICIpOwotCQlmb3IoSXRlcmF0b3IgaSA9IERPTV8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUJsb2NrIGRvbSA9IChCbG9jaylpLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoZG9tLmdldElEKCkgKyAiLCAiKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAiKTsKLQkJKi8KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL2ltcGwvQ2FsbEdyYXBoLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL2ltcGwvQ2FsbEdyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTNhZjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9pbXBsL0NhbGxHcmFwaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotCi1wdWJsaWMgY2xhc3MgQ2FsbEdyYXBoIGltcGxlbWVudHMgSUNhbGxHcmFwaCB7Ci0JLyoqbGlzdCBvZiBjYWxsIGdyYXBoIG5vZGVzICovCi0JcHJvdGVjdGVkIExpc3Q8SUNhbGxHcmFwaE5vZGU+IG5vZGVzXzsKLQkvKipsaXN0IG9mIGdsb2JhbCB2YXJpYWJsZSBuYW1lcyovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBlbnZfOyAKLQkKLQkvKiogdGhlIGVudHJ5IG5vZGUgYWNjb3JkaW5nIHRvIHRvcG9sb2dpY2FsIG9yZGVyICovCi0JcHJvdGVjdGVkIElDYWxsR3JhcGhOb2RlIHRvcEVudHJ5XzsKLQkvKiogdGhlIGVudHJ5IG5vZGUgYWNjb3JkaW5nIHRvIHRoZSByZXZlcnNlIHRvcG9sb2dpY2FsIG9yZGVyICovCi0JcHJvdGVjdGVkIElDYWxsR3JhcGhOb2RlIGJvdEVudHJ5XzsKLQkvKiogbGlzdCBvZiBjeWNsZXMgaW4gdGhlIGNhbGwgZ3JhcGggKi8KLQlwcm90ZWN0ZWQgTGlzdDxMaXN0PElDYWxsR3JhcGhOb2RlPj4gY3ljbGVzXzsKLQkKLQlwdWJsaWMgQ2FsbEdyYXBoKCl7Ci0JCW5vZGVzXyA9IG5ldyBBcnJheUxpc3Q8SUNhbGxHcmFwaE5vZGU+KCk7Ci0JCWVudl8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdG9wRW50cnlfID0gbnVsbDsKLQkJYm90RW50cnlfID0gbnVsbDsKLQkJY3ljbGVzXyA9IG5ldyBBcnJheUxpc3Q8TGlzdDxJQ2FsbEdyYXBoTm9kZT4+KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE5vZGUoSUNhbGxHcmFwaE5vZGUgbm9kZSkgewotCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGkgPSBub2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlDYWxsR3JhcGhOb2RlIG4gPSBpLm5leHQoKTsKLQkJCWlmKG4uZ2V0RnVuY05hbWUoKS5lcXVhbHMobm9kZS5nZXRGdW5jTmFtZSgpKSAmJiAKLQkJCQkJbi5nZXRGaWxlTmFtZSgpLmVxdWFscyhub2RlLmdldEZpbGVOYW1lKCkpKQotCQkJCXJldHVybjsKLQkJfQotCQlub2Rlc18uYWRkKG5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0PElDYWxsR3JhcGhOb2RlPiBnZXRBbGxOb2RlcygpIHsKLQkJcmV0dXJuIG5vZGVzXzsKLQl9Ci0KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgYm90RW50cnkoKSB7Ci0JCXJldHVybiBib3RFbnRyeV87Ci0JfQotCi0JcHVibGljIExpc3Q8TGlzdDxJQ2FsbEdyYXBoTm9kZT4+IGdldEN5Y2xlcygpIHsKLQkJcmV0dXJuIGN5Y2xlc187Ci0JfQotCi0JLyoqIEByZXR1cm4gdGhlIGVuY2xvc2luZyBmdW5jdGlvbiBvZiBhbiBBU1Qgbm9kZSAqLwotCXByb3RlY3RlZCBJQ2FsbEdyYXBoTm9kZSBnZXRFbmNsb3NpbmdGdW5jKElBU1ROb2RlIG4pIHsKLQkJSUFTVE5vZGUgcGFyZW50ID0gbi5nZXRQYXJlbnQoKTsKLQkJd2hpbGUocGFyZW50ICE9IG51bGwpewotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gZ2V0Tm9kZSgoSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbilwYXJlbnQpOwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEVudigpIHsKLQkJcmV0dXJuIGVudl87Ci0JfQotCi0JLyoqIEByZXR1cm4gdGhlIGNhbGwgZ3JhcGggbm9kZSB3aXRoIHRoZSBmdW5jdGlvbiBuYW1lICJmdW5jTmFtZSIuCi0JICogSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAoYnV0Ci0JICogd2l0aCBkaWZmZXJlbnQgc2NvcGVzKSwgYW5kIHRoZXJlIGlzIG9uZSBzdWNoIGZ1bmN0aW9uIGluIHRoZQotCSAqIGZpbGUgImZpbGVOYW1lIiwgdGhlbiByZXR1cm4gdGhpcyBmdW5jdGlvbiBub2RlICovCi0JcHVibGljIElDYWxsR3JhcGhOb2RlIGdldE5vZGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZnVuY05hbWUpIHsKLQkJSUNhbGxHcmFwaE5vZGUgdG1wID0gbnVsbDsKLQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlJQ2FsbEdyYXBoTm9kZSBub2RlID0gaS5uZXh0KCk7Ci0JCQlpZihub2RlLmdldEZ1bmNOYW1lKCkuZXF1YWxzKGZ1bmNOYW1lKSl7Ci0JCQkJdG1wID0gbm9kZTsKLQkJCQlpZihub2RlLmdldEZpbGVOYW1lKCkuZXF1YWxzKGZpbGVOYW1lKSkKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRtcDsKLQl9Ci0KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgZ2V0Tm9kZShJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZkZWYpIHsKLQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlJQ2FsbEdyYXBoTm9kZSBub2RlID0gaS5uZXh0KCk7Ci0JCQlpZihub2RlLmdldEZ1bmNEZWYoKSA9PSBmZGVmKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ2FsbEdyYXBoTm9kZSB0b3BFbnRyeSgpIHsKLQkJcmV0dXJuIHRvcEVudHJ5XzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3RFbnRyeShJQ2FsbEdyYXBoTm9kZSBub2RlKSB7Ci0JCWJvdEVudHJ5XyA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9wRW50cnkoSUNhbGxHcmFwaE5vZGUgbm9kZSkgewotCQl0b3BFbnRyeV8gPSBub2RlOwotCX0KLQkKLQkvKiogQ29uc3RydWN0aW5nIHRoZSBjYWxsIGdyYXBoIGNvbnNpc3RzIG9mIHRocmVlIHN0ZXBzOgotCSAqICAoMSkgY2FsY3VsYXRpbmcgY2FsbGVyIGFuZCBjYWxsZWUgcmVsYXRpb25zIGFtb25nIGZ1bmN0aW9ucy4gCi0JICogIE5vdGUgdGhhdCBjYWxsIGdyYXBoIG5vZGVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQgYmVmb3JlIAotCSAqICBjb25zdHJ1Y3RpbmcgdGhlIGNhbGwgZ3JhcGgKLQkgKiAgKDIpIGNoZWNrIHRoZSByZWN1cnNpdmUgZnVuY3Rpb24gY2FsbHMgYW5kIGNvbGxlY3RpbmcgYWxsIGN5Y2xlcwotCSAqICAoMykgb3RoZXIgb3B0aW9ucyBmb3IgZnV0dXJlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ0coKXsKLQkJQ0dCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ0dCdWlsZGVyKCk7Ci0JCWJ1aWxkZXIucnVuKCk7Ci0JCWNoZWNrUmVjdXJzaXZlKCk7Ci0JCW90aGVyT1AoKTsKLQl9Ci0KLQljbGFzcyBDR0J1aWxkZXIgZXh0ZW5kcyBBU1RWaXNpdG9yewotCQlJQ2FsbEdyYXBoTm9kZSBjdXJyZW50Tm9kZV87Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKQotCQl7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQkKLQkJCWZvcihJdGVyYXRvcjxJQ2FsbEdyYXBoTm9kZT4gaSA9IG5vZGVzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCWN1cnJlbnROb2RlXyA9IGkubmV4dCgpOwotCQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZnVuYyA9IGN1cnJlbnROb2RlXy5nZXRGdW5jRGVmKCk7Ci0JCQkJZnVuYy5hY2NlcHQodGhpcyk7Ci0JCQkJSUNhbGxHcmFwaE5vZGUgZW5jbG9zaW5nRnVuY05vZGUgPSBnZXRFbmNsb3NpbmdGdW5jKGZ1bmMpOwotCQkJCWlmKGVuY2xvc2luZ0Z1bmNOb2RlICE9IG51bGwpeyAKLQkJCQkJLy8gZmQgaXMgbmVzdGVkIGRlY2xhcmVkIGZ1bmN0aW9uCi0JCQkJCWVuY2xvc2luZ0Z1bmNOb2RlLmFkZENhbGxlZShjdXJyZW50Tm9kZV8pOwotCQkJCQljdXJyZW50Tm9kZV8uYWRkQ2FsbGVyKGVuY2xvc2luZ0Z1bmNOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbikgCi0JCXsKLQkJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIHsKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jRXhwciA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByZXNzaW9uOwotCQkJCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZnVuY0V4cHIuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihzaWduYXR1cmUpOwotCQkJCUlDYWxsR3JhcGhOb2RlIGZub2RlID0gZ2V0Tm9kZShjdXJyZW50Tm9kZV8uZ2V0RmlsZU5hbWUoKSwgc2lnbmF0dXJlKTsKLQkJCQlpZiAoZm5vZGUgIT0gbnVsbCl7IAotCQkJCQkvKiBUaGlzIGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGNhbGwgKi8KLQkJCQkJY3VycmVudE5vZGVfLmFkZENhbGxlZShmbm9kZSk7Ci0JCQkJCWZub2RlLmFkZENhbGxlcihjdXJyZW50Tm9kZV8pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgU3RhY2s8SUNhbGxHcmFwaE5vZGU+IG9yZGVyOwotCQotCXB1YmxpYyB2b2lkIGNoZWNrUmVjdXJzaXZlKCl7Ci0JCW9yZGVyID0gbmV3IFN0YWNrPElDYWxsR3JhcGhOb2RlPigpOwotCQlERlMoKTsKLQkJUlZfREZTKCk7Ci0JCQotCQlIYXNodGFibGU8SUNhbGxHcmFwaE5vZGUsTGlzdDxJQ2FsbEdyYXBoTm9kZT4+IHJlY3Vyc2lvbnMgPSAKLQkJCW5ldyBIYXNodGFibGU8SUNhbGxHcmFwaE5vZGUsTGlzdDxJQ2FsbEdyYXBoTm9kZT4+KCk7Ci0JCWZvcihJQ2FsbEdyYXBoTm9kZSBub2RlID0gYm90RW50cnlfOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmJvdE5leHQoKSl7Ci0JCQlJQ2FsbEdyYXBoTm9kZSBwaSA9IChJQ2FsbEdyYXBoTm9kZSlub2RlLmdldEF0dHIoInBpIik7Ci0JCQlpZihwaSAhPSBudWxsKXsKLQkJCQlpZihyZWN1cnNpb25zLmNvbnRhaW5zS2V5KHBpKSl7Ci0JCQkJCUxpc3Q8SUNhbGxHcmFwaE5vZGU+IGxpc3QgPSByZWN1cnNpb25zLmdldChwaSk7Ci0JCQkJCWxpc3QuYWRkKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3Q8SUNhbGxHcmFwaE5vZGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElDYWxsR3JhcGhOb2RlPigpOwotCQkJCQlsaXN0LmFkZChub2RlKTsKLQkJCQkJcmVjdXJzaW9ucy5wdXQocGksIGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IoRW51bWVyYXRpb248SUNhbGxHcmFwaE5vZGU+IGUgPSByZWN1cnNpb25zLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJSUNhbGxHcmFwaE5vZGUgcm9vdCA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCUxpc3Q8SUNhbGxHcmFwaE5vZGU+IGxpc3QgPSByZWN1cnNpb25zLmdldChyb290KTsKLQkJCWlmKCFsaXN0LmNvbnRhaW5zKHJvb3QpKSAKLQkJCQlsaXN0LmFkZChyb290KTsKLQkJCWN5Y2xlc18uYWRkKGxpc3QpOwotCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCWkubmV4dCgpLnNldFJlY3Vyc2l2ZSh0cnVlKTsKLQkJCX0KLQkJfQotCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGkgPSBub2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlDYWxsR3JhcGhOb2RlIG5vZGUgPSBpLm5leHQoKTsKLQkJCWlmKG5vZGUuZ2V0Q2FsbGVlcygpLmNvbnRhaW5zKG5vZGUpKXsgLy9zZWxmLXJlY3Vyc2lvbgotCQkJCUxpc3Q8SUNhbGxHcmFwaE5vZGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElDYWxsR3JhcGhOb2RlPigpOwotCQkJCWxpc3QuYWRkKG5vZGUpOwotCQkJCWN5Y2xlc18uYWRkKGxpc3QpOwotCQkJCW5vZGUuc2V0UmVjdXJzaXZlKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIERGUygpewotCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGkgPSBub2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlDYWxsR3JhcGhOb2RlIG5vZGUgPSBpLm5leHQoKTsKLQkJCW5vZGUuc2V0QXR0cigiY29sb3IiLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQlub2RlLnJlbW92ZUF0dHIoInBpIik7Ci0JCX0KLQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlJQ2FsbEdyYXBoTm9kZSBub2RlID0gaS5uZXh0KCk7Ci0JCQlpbnQgY29sb3IgPSAoKEludGVnZXIpbm9kZS5nZXRBdHRyKCJjb2xvciIpKS5pbnRWYWx1ZSgpOwotCQkJaWYoY29sb3IgPT0gMCkKLQkJCQlERlNWaXNpdChub2RlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBERlNWaXNpdChJQ2FsbEdyYXBoTm9kZSBub2RlKXsKLQkJbm9kZS5zZXRBdHRyKCJjb2xvciIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZS5nZXRDYWxsZWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlDYWxsR3JhcGhOb2RlIGNhbGxlZSA9IGkubmV4dCgpOwotCQkJaW50IGNvbG9yID0gKChJbnRlZ2VyKWNhbGxlZS5nZXRBdHRyKCJjb2xvciIpKS5pbnRWYWx1ZSgpOwotCQkJaWYoY29sb3IgPT0gMCl7IC8vd2hpdGUKLQkJCQljYWxsZWUuc2V0QXR0cigicGkiLCBub2RlKTsKLQkJCQlERlNWaXNpdChjYWxsZWUpOwotCQkJfQotCQl9Ci0JCW9yZGVyLnB1c2gobm9kZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIFJWX0RGUygpewotCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGkgPSBub2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlDYWxsR3JhcGhOb2RlIG5vZGUgPSBpLm5leHQoKTsKLQkJCW5vZGUuc2V0QXR0cigiY29sb3IiLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQlub2RlLnJlbW92ZUF0dHIoInBpIik7Ci0JCX0KLQkJCi0JCUlDYWxsR3JhcGhOb2RlIG4gPSBudWxsOwotCQlJQ2FsbEdyYXBoTm9kZSBtID0gbnVsbDsKLQkJdG9wRW50cnlfID0gb3JkZXIucGVlaygpOwotCQl3aGlsZSghb3JkZXIuZW1wdHkoKSl7Ci0JCQluID0gb3JkZXIucG9wKCk7Ci0JCQluLnNldEJvdE5leHQobSk7Ci0JCQlpZihtICE9IG51bGwpIG0uc2V0VG9wTmV4dChuKTsKLQkJCW0gPSBuOwotCQkJaW50IGNvbG9yID0gKChJbnRlZ2VyKW4uZ2V0QXR0cigiY29sb3IiKSkuaW50VmFsdWUoKTsKLQkJCWlmKGNvbG9yID09IDApewotCQkJCVJWX0RGU1Zpc2l0KG4pOwotCQkJfQotCQl9Ci0JCWJvdEVudHJ5XyA9IG07Ci0JCQotCQlmb3IobiA9IGJvdEVudHJ5XzsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJSUNhbGxHcmFwaE5vZGUgcHJlZCA9IChJQ2FsbEdyYXBoTm9kZSluLmdldEF0dHIoInBpIik7Ci0JCQlJQ2FsbEdyYXBoTm9kZSB0ZW1wID0gbnVsbDsKLQkJCXdoaWxlKHByZWQgIT0gbnVsbCl7Ci0JCQkJdGVtcCA9IHByZWQ7Ci0JCQkJcHJlZCA9IChJQ2FsbEdyYXBoTm9kZSlwcmVkLmdldEF0dHIoInBpIik7Ci0JCQl9Ci0JCQlpZih0ZW1wICE9IG51bGwpIG4uc2V0QXR0cigicGkiLCB0ZW1wKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBSVl9ERlNWaXNpdChJQ2FsbEdyYXBoTm9kZSBub2RlKXsKLQkJbm9kZS5zZXRBdHRyKCJjb2xvciIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZS5nZXRDYWxsZXJzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlDYWxsR3JhcGhOb2RlIGNhbGxlciA9IGkubmV4dCgpOwotCQkJaW50IGNvbG9yID0gKChJbnRlZ2VyKWNhbGxlci5nZXRBdHRyKCJjb2xvciIpKS5pbnRWYWx1ZSgpOwotCQkJaWYoY29sb3IgPT0gMCl7IC8vd2hpdGUKLQkJCQljYWxsZXIuc2V0QXR0cigicGkiLCBub2RlKTsKLQkJCQlSVl9ERlNWaXNpdChjYWxsZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIG90aGVyT1AoKXsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnQoKXsKLQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpPW5vZGVzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJSUNhbGxHcmFwaE5vZGUgbm9kZSA9IGkubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludChub2RlLmdldEZ1bmNOYW1lKCkgKyAiIGNhbGxzOiAiKTsKLQkJCWZvcihJdGVyYXRvcjxJQ2FsbEdyYXBoTm9kZT4gaWkgPSBub2RlLmdldENhbGxlZXMoKS5pdGVyYXRvcigpOyBpaS5oYXNOZXh0KCk7KXsKLQkJCQlJQ2FsbEdyYXBoTm9kZSBjYWxsZWUgPSBpaS5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGNhbGxlZS5nZXRGdW5jTmFtZSgpICsgIiwgIik7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9DYWxsR3JhcGhOb2RlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL2ltcGwvQ2FsbEdyYXBoTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWJmNTBkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9DYWxsR3JhcGhOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ29udHJvbEZsb3dHcmFwaDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGNhbGwgZ3JhcGggbm9kZSwgd2hpY2ggcmVwcmVzZW50cyBhIHVzZXItZGVmaW5lZAotICogZnVuY3Rpb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsR3JhcGhOb2RlIGltcGxlbWVudHMgSUNhbGxHcmFwaE5vZGUgewotCXByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2VfOwotCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWVfOwotCXByb3RlY3RlZCBTdHJpbmcgZnVuY05hbWVfOwotCXByb3RlY3RlZCBJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZkZWZfOwotCXByb3RlY3RlZCBMaXN0PElDYWxsR3JhcGhOb2RlPiBjYWxsZXJzXzsKLQlwcm90ZWN0ZWQgTGlzdDxJQ2FsbEdyYXBoTm9kZT4gY2FsbGVlc187Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmVzdGVkOyAvL25lc3RlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbj8KLQlwcm90ZWN0ZWQgSUNvbnRyb2xGbG93R3JhcGggQ0ZHXzsKLQkKLQkvKiogbmV4dCBub2RlIGluIHJldmVyc2UtdG9wb2xvZ2ljYWwgKGJvdHRvbS11cCkgb3JkZXIgKi8KLQlwcm90ZWN0ZWQgSUNhbGxHcmFwaE5vZGUgYm90TmV4dF87Ci0JLyoqIG5leHQgbm9kZSBpbiB0b3BvbG9naWNhbCAodG9wLWRvd24pIG9yZGVyICovCi0JcHJvdGVjdGVkIElDYWxsR3JhcGhOb2RlIHRvcE5leHRfOyAKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxPYmplY3Q+IGF0dHJzXzsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlY3Vyc2l2ZTsKLQkKLQlwdWJsaWMgQ2FsbEdyYXBoTm9kZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBmaWxlbmFtZSwgCi0JCQkJU3RyaW5nIGZ1bmNuYW1lLCBJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZkZWYpewotCQlyZXNvdXJjZV8gPSByZXNvdXJjZTsKLQkJZmlsZU5hbWVfID0gZmlsZW5hbWU7Ci0JCWZ1bmNOYW1lXyA9IGZ1bmNuYW1lOwotCQlmZGVmXyA9IGZkZWY7Ci0JCWluaXQoKTsKLQl9Ci0JCi0JcHVibGljIENhbGxHcmFwaE5vZGUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgZmlsZW5hbWUsIAotCQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmRlZil7Ci0JCXJlc291cmNlXyA9IHJlc291cmNlOwotCQlmaWxlTmFtZV8gPSBmaWxlbmFtZTsKLQkJZmRlZl8gPSBmZGVmOwotCQlmdW5jTmFtZV8gPSBnZXRGdW5jTmFtZShmZGVmKTsJCi0JCWluaXQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQkJY2FsbGVyc18gPSBuZXcgQXJyYXlMaXN0PElDYWxsR3JhcGhOb2RlPigpOwotCQljYWxsZWVzXyA9IG5ldyBBcnJheUxpc3Q8SUNhbGxHcmFwaE5vZGU+KCk7Ci0JCW5lc3RlZCA9IGZhbHNlOwotCQlDRkdfID0gbnVsbDsgCi0JCXRvcE5leHRfID0gbnVsbDsKLQkJYm90TmV4dF8gPSBudWxsOwotCQlhdHRyc18gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxPYmplY3Q+KCk7Ci0JCXJlY3Vyc2l2ZSA9IGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGdW5jTmFtZShJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZkZWYpewotCQlJQVNURGVjbGFyYXRvciBmZGVjbCA9IChJQVNURGVjbGFyYXRvcilmZGVmLmdldERlY2xhcmF0b3IoKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoKChJQVNUTmFtZSlmZGVjbC5nZXROYW1lKCkpLnRvQ2hhckFycmF5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmNOYW1lKCl7Ci0JCXJldHVybiBmdW5jTmFtZV87Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKXsKLQkJcmV0dXJuIGZpbGVOYW1lXzsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpewotCQlyZXR1cm4gcmVzb3VyY2VfOwotCX0KLQkKLQlwdWJsaWMgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBnZXRGdW5jRGVmKCl7Ci0JCXJldHVybiBmZGVmXzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWQoKXsKLQkJcmV0dXJuIG5lc3RlZDsKLQl9Ci0JCi0JcHVibGljIExpc3Q8SUNhbGxHcmFwaE5vZGU+IGdldENhbGxlcnMoKXsKLQkJcmV0dXJuIGNhbGxlcnNfOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDYWxsZXIoSUNhbGxHcmFwaE5vZGUgY2FsbGVyKXsKLQkJaWYoIWNhbGxlcnNfLmNvbnRhaW5zKGNhbGxlcikpCi0JCQljYWxsZXJzXy5hZGQoY2FsbGVyKTsKLQl9Ci0JCi0JcHVibGljIExpc3Q8SUNhbGxHcmFwaE5vZGU+CWdldENhbGxlZXMoKXsKLQkJcmV0dXJuIGNhbGxlZXNfOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDYWxsZWUoSUNhbGxHcmFwaE5vZGUgY2FsbGVlKXsKLQkJaWYoIWNhbGxlZXNfLmNvbnRhaW5zKGNhbGxlZSkpCi0JCQljYWxsZWVzXy5hZGQoY2FsbGVlKTsKLQl9Ci0JLyoqIFJldHVybnMgbmV4dCBub2RlIGluIHJldmVyc2UtdG9wb2xvZ2ljYWwgKGJvdHRvbS11cCkgb3JkZXIgKi8KLQlwdWJsaWMgSUNhbGxHcmFwaE5vZGUgYm90TmV4dCgpIHsKLQkJcmV0dXJuIGJvdE5leHRfOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvdE5leHQoSUNhbGxHcmFwaE5vZGUgbm9kZSl7Ci0JCWJvdE5leHRfID0gbm9kZTsKLQl9Ci0JCi0JcHVibGljIElDb250cm9sRmxvd0dyYXBoIGdldENGRygpIHsKLQkJcmV0dXJuIENGR187Ci0JfQotCS8qKiBSZXR1cm5zIG5leHQgbm9kZSBpbiB0b3BvbG9naWNhbCAodG9wLWRvd24pIG9yZGVyICovCi0JcHVibGljIElDYWxsR3JhcGhOb2RlIHRvcE5leHQoKSB7Ci0JCXJldHVybiB0b3BOZXh0XzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb3BOZXh0KElDYWxsR3JhcGhOb2RlIG5vZGUpewotCQl0b3BOZXh0XyA9IG5vZGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENGRyhJQ29udHJvbEZsb3dHcmFwaCBjZmcpIHsKLQkJQ0ZHXyA9IGNmZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXR0cihTdHJpbmcgbmFtZSwgT2JqZWN0IGF0dHIpewotCQlhdHRyc18ucHV0KG5hbWUsIGF0dHIpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHIoU3RyaW5nIG5hbWUpewotCQlyZXR1cm4gYXR0cnNfLmdldChuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cihTdHJpbmcgbmFtZSl7Ci0JCWF0dHJzXy5yZW1vdmUobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIHZhbCl7Ci0JCXJlY3Vyc2l2ZSA9IHZhbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWN1cnNpdmUoKXsKLQkJcmV0dXJuIHJlY3Vyc2l2ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9Db250cm9sRmxvd0dyYXBoLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9jZHQvZ3JhcGhzL2ltcGwvQ29udHJvbEZsb3dHcmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWUwMDcyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9Db250cm9sRmxvd0dyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RCcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDYXNlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbXBvdW5kU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbnRpbnVlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlZmF1bHRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURG9TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZvclN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEdvdG9TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUSWZTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTGFiZWxTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE51bGxTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJvYmxlbVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RSZXR1cm5TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN3aXRjaFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RXaGlsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNvbnRyb2xGbG93R3JhcGg7Ci0KLS8qKgotICogQ29udHJvbCBGbG93IEdyYXBoIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqIEBhdXRob3IgWXVhbiBaaGFuZwotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dHcmFwaCBpbXBsZW1lbnRzIElDb250cm9sRmxvd0dyYXBoIHsKLQlwcm90ZWN0ZWQgSUFTVFN0YXRlbWVudCBwcm9nXzsKLQlwcm90ZWN0ZWQgTGlzdDxJQmxvY2s+IEJCc187Ci0JcHJvdGVjdGVkIElCbG9jayBlbnRyeV87Ci0JcHJvdGVjdGVkIElCbG9jayBleGl0XzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT24gPSBmYWxzZTsKLQkKLQlwdWJsaWMgQ29udHJvbEZsb3dHcmFwaChJQVNUU3RhdGVtZW50IHByb2cpewotCQl0aGlzLnByb2dfID0gcHJvZzsKLQkJQkJzXyA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCX0KLQotCS8qKiBDb25zdHJ1Y3RpbmcgYSBDRkcgY29uc2lzdHMgb2Ygc2V2ZXJhbCBzdGVwczoKLQkgKiBTdGVwIDE6IGNvbGxlY3RpbmcgYWxsIGJsb2NrcyBpbiBhIGZ1bmN0aW9uCi0JICogU3RlcCAyOiBjYWxjdWxhdGluZyBjb250cm9sIGZsb3dzIGFtb25nIGJsb2NrcwotCSAqIFN0ZXAgMzogY2FsY3VsYXRpbmcgZG9taW5hdG9yIGFuZCBwb3N0LWRvbWluYXRvciByZWxhdGlvbnMKLQkgKiBTdGVwIDQ6IFNvcnQgYWxsIGJsb2NrcyBhY2NvcmRpbmcgdG8gdGhlIHRvcG9sb2dpY2FsIG9yZGVyCi0JICogU3RlcCA1OiBPdGhlciBhZGRpdGlvbmFsIG9wZXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENGRygpewotCQljb2xsZWN0QmxvY2tzKCk7Ci0JCXNldEJsb2NrRmxvdygpOwotCQlidWlsZERPTSgpOwotCQlidWlsZFBET00oKTsKLQkJc29ydCgpOwotCQlvdGhlck9QcygpOwotCX0KLQkKLQkvKiogQ29sbGVjdGluZyBhbGwgYmxvY2tzIGluIGEgZnVuY3Rpb24gKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0QmxvY2tzKCl7Ci0JCWVudHJ5XyA9IG5ldyBCbG9jaygpOwotCQlleGl0XyA9IG5ldyBCbG9jaygpOwotCQlCYXNpY0Jsb2NrQ29sbGVjdG9yIGJjID0gbmV3IEJhc2ljQmxvY2tDb2xsZWN0b3IoKTsKLQkJYmMucnVuKCk7Ci0JfQotCQotCS8qKiBDYWxjdWxhdGluZyBjb250cm9sIGZsb3dzIGFtb25nIGJsb2NrcyAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJsb2NrRmxvdygpewotCQlGbG93QnVpbGRlciBmbG93QnVpbGRlciA9IG5ldyBGbG93QnVpbGRlcigpOwotCQlmbG93QnVpbGRlci5ydW4oKTsKLQl9Ci0JCi0JY2xhc3MgQmFzaWNCbG9ja0NvbGxlY3RvciBleHRlbmRzIEFTVFZpc2l0b3J7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCXByb2dfLmFjY2VwdCh0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0bXQpIAotCQl7Ci0JCQlJQmxvY2sgYmxvY2s7Ci0JCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVEJyZWFrU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVENhc2VTdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IEJsb2NrKHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29tcG91bmRTdGF0ZW1lbnQpewotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDb250aW51ZVN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REZWNsYXJhdGlvblN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REZWZhdWx0U3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCQlJQVNURG9TdGF0ZW1lbnQgZG9TdG10ID0gKElBU1REb1N0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IEJsb2NrKGRvU3RtdC5nZXRDb25kaXRpb24oKSwgc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJCUlCbG9jayBleGl0am9pbiA9IG5ldyBCbG9jayhudWxsLCBzdG10LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soZXhpdGpvaW4pOwotCQkJCUlCbG9jayBjb250aW51ZWpvaW4gPSBuZXcgQmxvY2sobnVsbCwgc3RtdCwgQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCQlhZGRCbG9jayhjb250aW51ZWpvaW4pOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RFeHByZXNzaW9uU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCl7Ci0JCQkJSUFTVEZvclN0YXRlbWVudCBmb3JTdG10ID0gKElBU1RGb3JTdGF0ZW1lbnQpc3RtdDsKLQkJCQkvKiBUaGUgaW5pdGlhbGl6YXRpb24gaXMgYSBzdGF0ZW1lbnQsIGFuZCB3aWxsIGJlIGFkZGVkIGxhdGVyICovCi0JCQkJYmxvY2sgPSBuZXcgQmxvY2soZm9yU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCQlpZihmb3JTdG10LmdldEl0ZXJhdGlvbkV4cHJlc3Npb24oKSAhPSBudWxsKXsKLQkJCQkJYmxvY2sgPSBuZXcgQmxvY2soZm9yU3RtdC5nZXRJdGVyYXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQkJfQotCQkJCUlCbG9jayBjb250aW51ZWpvaW4gPSBuZXcgQmxvY2sobnVsbCwgc3RtdCwgQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCQlhZGRCbG9jayhjb250aW51ZWpvaW4pOwotCQkJCUlCbG9jayBleGl0am9pbiA9IG5ldyBCbG9jayhudWxsLCBzdG10LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soZXhpdGpvaW4pOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RHb3RvU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KXsKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZTdG10ID0gKElBU1RJZlN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IEJsb2NrKGlmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCQlJQmxvY2sgam9pbiA9IG5ldyBCbG9jayhudWxsLCBzdG10LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soam9pbik7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVExhYmVsU3RhdGVtZW50KXsKLQkJCQlJQVNUTGFiZWxTdGF0ZW1lbnQgbGFiZWxTID0gKElBU1RMYWJlbFN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IEJsb2NrKGxhYmVsUy5nZXROYW1lKCksIHN0bXQsIEJsb2NrLmxhYmVsX3R5cGUpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUTnVsbFN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RQcm9ibGVtU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9Ci0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUUmV0dXJuU3RhdGVtZW50KXsKLQkJCQlJQVNUUmV0dXJuU3RhdGVtZW50IHJ0U3RtdCA9IChJQVNUUmV0dXJuU3RhdGVtZW50KXN0bXQ7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2socnRTdG10LmdldFJldHVyblZhbHVlKCksIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KXsKLQkJCQlJQVNUU3dpdGNoU3RhdGVtZW50IHN3U3RtdCA9IChJQVNUU3dpdGNoU3RhdGVtZW50KXN0bXQ7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2soc3dTdG10LmdldENvbnRyb2xsZXJFeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCQlJQmxvY2sgam9pbiA9IG5ldyBCbG9jayhudWxsLCBzdG10LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soam9pbik7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQlJQVNUV2hpbGVTdGF0ZW1lbnQgd2hTdG10ID0gKElBU1RXaGlsZVN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IEJsb2NrKHdoU3RtdC5nZXRDb25kaXRpb24oKSwgc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJCUlCbG9jayBqb2luID0gbmV3IEJsb2NrKG51bGwsIHN0bXQsIEJsb2NrLmNvbnRpbnVlX2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soam9pbik7Ci0JCQkJSUJsb2NrIGV4aXRqb2luID0gbmV3IEJsb2NrKG51bGwsIHN0bXQsIEJsb2NrLmV4aXRfam9pbl90eXBlKTsKLQkJCQlhZGRCbG9jayhleGl0am9pbik7Ci0JCQl9IAotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIEZsb3dCdWlsZGVyIGV4dGVuZHMgQVNUVmlzaXRvcnsJCQotCQlwcml2YXRlIGJvb2xlYW4gZXhpdEJsb2NrID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdFRyYW5zbGF0aW9uVW5pdCA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJSUJsb2NrIGZpcnN0ID0gZmlyc3RCbG9jayhwcm9nXyk7Ci0JCQlDb250cm9sRmxvd0VkZ2UoZW50cnlfLCBmaXJzdCk7Ci0JCQlwcm9nXy5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQnJlYWtTdGF0ZW1lbnQpewotCQkJCS8qKiBBIGJyZWFrIHN0YXRlbWVudCBmbG93cyB0byBhIGJsb2NrIHdpdGggZXhpdF9qb2luX3R5cGUgKi8KLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50Iik7Ci0JCQkJSUJsb2NrIGJsb2NrID0gZ2V0QmxvY2soc3RtdCk7Ci0JCQkJSUFTVE5vZGUgcGFyZW50ID0gc3RtdC5nZXRQYXJlbnQoKTsKLQkJCQl3aGlsZSh0cnVlKXsKLQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50IHx8Ci0JCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50IHx8Ci0JCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQgfHwKLQkJCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJCQkJSUJsb2NrIGV4aXRqb2luID0gZ2V0QmxvY2sobnVsbCwgKElBU1RTdGF0ZW1lbnQpcGFyZW50LAotCQkJCQkJCQlCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJCQlDb250cm9sRmxvd0VkZ2UoYmxvY2ssIGV4aXRqb2luKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2V7Ci0JCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVENhc2VTdGF0ZW1lbnQgfHwgCi0JCQkJCXN0bXQgaW5zdGFuY2VvZiBJQVNURGVmYXVsdFN0YXRlbWVudCl7Ci0JCQkJLyoqIEEgY2FzZShkZWZhdWx0KSBzdGF0ZW1lbnQgZmxvd3MgZnJvbSB0aGUgc3dpdGNoIAotCQkJCSAqIGNvbmRpdGlvbiBibG9jayBvciB0aGUgcHJldmlvdXMgY2FzZSBzdGF0ZW1lbnQsIGFuZCAKLQkJCQkgKiBmbG93cyB0byB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjYXNlKGRlZmF1bHQpIGJvZHkuCi0JCQkJICovCi0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJDYXNlU3RhdGVtZW50IC8gRGVmYXVsdFN0YXRlbWVudCIpOwotCQkJCUlBU1ROb2RlIHBhcmVudCA9IHN0bXQuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUodHJ1ZSl7Ci0JCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpIGJyZWFrOwotCQkJCQllbHNlIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJSUJsb2NrIHN3YmxvY2sgPSBnZXRCbG9jayhzd1N0bXQuZ2V0Q29udHJvbGxlckV4cHJlc3Npb24oKSwgCi0JCQkJCQkJCQkoSUFTVFN0YXRlbWVudClwYXJlbnQpOwotCQkJCUlCbG9jayBjYXNlYmxvY2sgPSBnZXRCbG9jayhzdG10KTsKLQkJCQlDb250cm9sRmxvd0VkZ2Uoc3dibG9jaywgY2FzZWJsb2NrKTsKLQkJCQlJQmxvY2sgbmV4dCA9IG5leHRCbG9jayhzdG10KTsKLQkJCQlDb250cm9sRmxvd0VkZ2UoY2FzZWJsb2NrLCBuZXh0KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29tcG91bmRTdGF0ZW1lbnQpewotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDb250aW51ZVN0YXRlbWVudCl7Ci0JCQkJLyoqIEEgY29udGludWUgc3RhdGVtZW50IGZsb3dzIHRvIHRoZSBjb250aW51ZV9qb2luX3R5cGUgYmxvY2sgKi8KLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRpbnVlU3RhdGVtZW50Iik7Ci0JCQkJSUJsb2NrIGJsb2NrID0gZ2V0QmxvY2soc3RtdCk7Ci0JCQkJSUFTVE5vZGUgcGFyZW50ID0gc3RtdC5nZXRQYXJlbnQoKTsKLQkJCQl3aGlsZSh0cnVlKXsKLQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50IHx8Ci0JCQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCB8fAotCQkJCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJCQlJQmxvY2sgY29udGludWVqb2luID0gZ2V0QmxvY2sobnVsbCwgKElBU1RTdGF0ZW1lbnQpcGFyZW50LCAKLQkJCQkJCQkJQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCQkJCUNvbnRyb2xGbG93RWRnZShibG9jaywgY29udGludWVqb2luKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2V7Ci0JCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50KXsKLQkJCQkvKiogRXhjZXB0IHRoZSByZWd1bGFyIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMsIHRoZQotCQkJCSAqIGluaXRpYWxpemVyIG9mIGEgZm9yIHN0YXRlbWVudCBjb3VsZCBhbHNvIGJlIGEKLQkJCQkgKiBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGZsb3cKLQkJCQkgKiByZWxhdGlvbiBpcyBhbHJlYWR5IGNhbGN1bGF0ZWQgYW5kIHRoZXJlZm9yZSBub3RoaW5nCi0JCQkJICogaXMgZG9uZSBoZXJlLiAqLwotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiRGVjbGFyYXRpb25TdGF0ZW1lbnQiKTsKLQkJCQlJQVNUTm9kZSBwYXJlbnQgPSBzdG10LmdldFBhcmVudCgpOwotCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCQlJQVNURm9yU3RhdGVtZW50IGZvclN0bXQgPSAoSUFTVEZvclN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJCWlmKGZvclN0bXQuZ2V0SW5pdGlhbGl6ZXJTdGF0ZW1lbnQoKSA9PSBzdG10KQotCQkJCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCQkJfQotCQkJCUlCbG9jayBibG9jayA9IGdldEJsb2NrKHN0bXQpOwotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShibG9jaywgbmV4dCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCQkvKiogV2UgY2FsY3VsYXRlIGZvdXIgdHlwZXMgb2YgY29udHJvbCBmbG93cyBoZXJlOgotCQkJCSAqICgxKSB0aGUgY29uZGl0aW9uIGJsb2NrIGZsb3dzIHRvIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgbG9vcCBib2R5Ci0JCQkJICogKDIpIHRoZSBjb25kaXRpb24gYmxvY2sgZmxvd3MgdG8gdGhlIGV4aXRfam9pbl90eXBlIGJsb2NrCi0JCQkJICogKDMpIHRoZSBjb250aW51ZV9qb2luX3R5cGUgYmxvY2sgZmxvd3MgdG8gdGhlIGNvbmRpdGlvbiBibG9jawotCQkJCSAqICg0KSB0aGUgZXhpdF9qb2luX3R5cGUgYmxvY2sgZmxvd3MgdG8gdGhlIG5leHQgc3RhdGVtZW50IGFmdGVyCi0JCQkJICogdGhpcyBkbyBsb29wCi0JCQkJICovCi0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJEb1N0YXRlbWVudCIpOwotCQkJCUlBU1REb1N0YXRlbWVudCBkb1N0bXQgPSAoSUFTVERvU3RhdGVtZW50KXN0bXQ7Ci0JCQkJSUJsb2NrIGNvbmQgPSBnZXRCbG9jayhkb1N0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpOwotCQkJCWlmKGRvU3RtdC5nZXRCb2R5KCkgPT0gbnVsbCl7Ci0JCQkJCUNvbnRyb2xGbG93RWRnZShjb25kLCBjb25kKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJQmxvY2sgZmlyc3QgPSBmaXJzdEJsb2NrKGRvU3RtdC5nZXRCb2R5KCkpOwotCQkJCQlDb250cm9sRmxvd0VkZ2UoY29uZCwgZmlyc3QpOwotCQkJCQlJQmxvY2sgY29udGludWVqb2luID0gZ2V0QmxvY2sobnVsbCwgc3RtdCwgQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCQkJQ29udHJvbEZsb3dFZGdlKGNvbnRpbnVlam9pbiwgY29uZCk7Ci0JCQkJfQotCQkJCUlCbG9jayBleGl0am9pbiA9IGdldEJsb2NrKG51bGwsIHN0bXQsIEJsb2NrLmV4aXRfam9pbl90eXBlKTsKLQkJCQlDb250cm9sRmxvd0VkZ2UoY29uZCwgZXhpdGpvaW4pOwotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShleGl0am9pbiwgbmV4dCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25TdGF0ZW1lbnQpewotCQkJCS8qKiBJZiB0aGUgZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaXMgdGhlIGluaXRpYWxpemVyIG9mIGEgZm9yCi0JCQkJICogbG9vcCwgZG8gbm90aGluZyBoZXJlLiBJZiB0aGlzIHN0YXRlbWVudCBjb250YWlucyBhbgotCQkJCSAqICJleGl0IiBmdW5jdGlvbiBjYWxsLCBpdCBmbG93cyB0byB0aGUgZXhpdCBibG9jayBvZiB0aGUKLQkJCQkgKiBjdXJyZW50IGZ1bmN0aW9uICovCi0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9uU2F0ZW1lbnQiKTsKLQkJCQlJQVNUTm9kZSBwYXJlbnQgPSBzdG10LmdldFBhcmVudCgpOwotCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCQlJQVNURm9yU3RhdGVtZW50IGZvclN0bXQgPSAoSUFTVEZvclN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJCWlmKGZvclN0bXQuZ2V0SW5pdGlhbGl6ZXJTdGF0ZW1lbnQoKSA9PSBzdG10KQotCQkJCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCQkJfQotCQkJCUlCbG9jayBibG9jayA9IGdldEJsb2NrKHN0bXQpOwotCQkJCUlBU1RFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJTdG10ID0gKElBU1RFeHByZXNzaW9uU3RhdGVtZW50KXN0bXQ7Ci0JCQkJZXhpdEJsb2NrID0gZmFsc2U7Ci0JCQkJZXhwclN0bXQuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJCQlpZihleGl0QmxvY2spewotCQkJCQlDb250cm9sRmxvd0VkZ2UoYmxvY2ssIGV4aXRfKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCQlDb250cm9sRmxvd0VkZ2UoYmxvY2ssIG5leHQpOwotCQkJCX0KLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQkvKiogSW4gYSBmb3IgbG9vcCwgdGhlIGluaXRpYWxpemVyIGZsb3dzIHRvIHRoZSBsb29wIGNvbmRpdGlvbiwKLQkJCQkgKiB0aGUgbG9vcCBjb25kaXRpb24gZmxvd3MgdG8gdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgbG9vcAotCQkJCSAqIGJvZHkgYW5kIHRoZSBibG9jayB3aXRoIGV4aXRfam9pbl90eXBlLiBUaGUgY29udGludWVfam9pbl90eXBlCi0JCQkJICogYmxvY2sgZmxvd3MgdG8gdGhlIGl0ZXJhdG9yLCBhbmQgdGhlIGl0ZXJhdG9yIGZsb3dzIHRvIHRoZQotCQkJCSAqIGNvbmRpdGlvbiBibG9jayAqLwotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yU3RhdGVtZW50Iik7Ci0JCQkJSUFTVEZvclN0YXRlbWVudCBmb3JTdG10ID0gKElBU1RGb3JTdGF0ZW1lbnQpc3RtdDsKLQkJCQlJQVNUU3RhdGVtZW50IGluaXRTdG10ID0gZm9yU3RtdC5nZXRJbml0aWFsaXplclN0YXRlbWVudCgpOwotCQkJCUlCbG9jayBpbml0ID0gZ2V0QmxvY2soaW5pdFN0bXQpOwotCQkJCUlCbG9jayBjb25kID0gZ2V0QmxvY2soZm9yU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCUlCbG9jayBpdGVyID0gbnVsbDsKLQkJCQlJQmxvY2sgY29udGludWVqb2luID0gZ2V0QmxvY2sobnVsbCwgc3RtdCwgQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCQlJQmxvY2sgZXhpdGpvaW4gPSBnZXRCbG9jayhudWxsLCBzdG10LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJCi0JCQkJaWYoZm9yU3RtdC5nZXRJdGVyYXRpb25FeHByZXNzaW9uKCkgIT0gbnVsbCkKLQkJCQkJaXRlciA9IGdldEJsb2NrKGZvclN0bXQuZ2V0SXRlcmF0aW9uRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQkKLQkJCQkvKiBUaGUgZW1wdHkgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBhIE51bGwgc3RhdGVtZW50ICovCi0JCQkJQ29udHJvbEZsb3dFZGdlKGluaXQsIGNvbmQpOwotCQkJCQotCQkJCWlmKGZvclN0bXQuZ2V0Qm9keSgpICE9IG51bGwpewotCQkJCQlJQmxvY2sgZmlyc3QgPSBmaXJzdEJsb2NrKGZvclN0bXQuZ2V0Qm9keSgpKTsKLQkJCQkJQ29udHJvbEZsb3dFZGdlKGNvbmQsIGZpcnN0KTsKLQkJCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQkJCUNvbnRyb2xGbG93RWRnZShjb250aW51ZWpvaW4sIGl0ZXIpOwotCQkJCQkJQ29udHJvbEZsb3dFZGdlKGl0ZXIsIGNvbmQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCUNvbnRyb2xGbG93RWRnZShjb250aW51ZWpvaW4sIGNvbmQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKGl0ZXIgIT0gbnVsbCl7Ci0JCQkJCQlDb250cm9sRmxvd0VkZ2UoY29uZCwgaXRlcik7Ci0JCQkJCQlDb250cm9sRmxvd0VkZ2UoaXRlciwgY29uZCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlDb250cm9sRmxvd0VkZ2UoY29uZCwgY29uZCk7Ci0JCQkJCX0KLQkJCQl9CQkKLQkJCQlDb250cm9sRmxvd0VkZ2UoY29uZCwgZXhpdGpvaW4pOwotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShleGl0am9pbiwgbmV4dCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEdvdG9TdGF0ZW1lbnQpewotCQkJCS8qKiBHb3RvIHN0YXRlbWVudCBmbG93cyB0byB0aGUgY29ycmVzcG9uZGluZyBsYWJlbCBzdGF0ZW1lbnQgKi8KLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdG9TdGF0ZW1lbnQiKTsKLQkJCQlJQVNUR290b1N0YXRlbWVudCBnb3RvU3RtdCA9IChJQVNUR290b1N0YXRlbWVudClzdG10OwotCQkJCUlCbG9jayBsYWJlbCA9IGdldEJsb2NrKGdvdG9TdG10LmdldE5hbWUoKSwgZ290b1N0bXQsIEJsb2NrLmxhYmVsX3R5cGUpOwotCQkJCWlmKGxhYmVsID09IG51bGwpewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bGwgTGFiZWwgRXJyb3IiKTsKLQkJCQl9Ci0JCQkJSUJsb2NrIGJsb2NrID0gZ2V0QmxvY2soZ290b1N0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShibG9jaywgbGFiZWwpOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQkJLyoqIFRoZSBpZiBjb25kaXRpb24gYmxvY2sgZmxvd3MgdG8gdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSAKLQkJCQkgKiB0aGVuKGVsc2UpIGNsYXVzZSBpZiBpdCBpcyBub3QgZW1wdHksIHRoZSBleGl0X2pvaW5fdHlwZQotCQkJCSAqIGJsb2NrIG90aGVyd2lzZSAqLwotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiSWZTdGF0ZW1lbnQiKTsKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZTdG10ID0gKElBU1RJZlN0YXRlbWVudClzdG10OwotCQkJCUlCbG9jayBjb25kYiA9IGdldEJsb2NrKGlmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCUlCbG9jayBqb2luID0gZ2V0QmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCWlmKGlmU3RtdC5nZXRUaGVuQ2xhdXNlKCkgIT0gbnVsbCl7Ci0JCQkJCUlCbG9jayB0aGVuYiA9IGZpcnN0QmxvY2soaWZTdG10LmdldFRoZW5DbGF1c2UoKSk7Ci0JCQkJCUNvbnRyb2xGbG93RWRnZShjb25kYiwgdGhlbmIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUNvbnRyb2xGbG93RWRnZShjb25kYiwgam9pbik7Ci0JCQkJfQotCQkJCQotCQkJCWlmKGlmU3RtdC5nZXRFbHNlQ2xhdXNlKCkgIT0gbnVsbCl7Ci0JCQkJCUlCbG9jayBlbHNlYiA9IGZpcnN0QmxvY2soaWZTdG10LmdldEVsc2VDbGF1c2UoKSk7Ci0JCQkJCUNvbnRyb2xGbG93RWRnZShjb25kYiwgZWxzZWIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUNvbnRyb2xGbG93RWRnZShjb25kYiwgam9pbik7Ci0JCQkJfQotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShqb2luLCBuZXh0KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUTGFiZWxTdGF0ZW1lbnQpewotCQkJCS8qKiBJZiB0aGVyZSBpcyBhIG5lc3RlZCBzdGF0ZW1lbnQsIHRoZSBsYWJlbCBzdGF0ZW1lbnQgZmxvd3MKLQkJCQkgKiB0byB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIG5lc3RlZCBzdGF0ZW1lbnQKLQkJCQkgKi8KLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsU3RhdGVtZW50Iik7Ci0JCQkJSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsID0gKElBU1RMYWJlbFN0YXRlbWVudClzdG10OwotCQkJCUlCbG9jayBibG9jayA9IGdldEJsb2NrKGxhYmVsLmdldE5hbWUoKSwgc3RtdCwgQmxvY2subGFiZWxfdHlwZSk7Ci0JCQkJaWYobGFiZWwuZ2V0TmVzdGVkU3RhdGVtZW50KCkgPT0gbnVsbCl7Ci0JCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCQlDb250cm9sRmxvd0VkZ2UoYmxvY2ssIG5leHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlCbG9jayBuZXh0ID0gZmlyc3RCbG9jayhsYWJlbC5nZXROZXN0ZWRTdGF0ZW1lbnQoKSk7Ci0JCQkJCUNvbnRyb2xGbG93RWRnZShibG9jaywgbmV4dCk7Ci0JCQkJfQotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1ROdWxsU3RhdGVtZW50KXsKLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIk51bGxTdGF0ZW1lbnQiKTsKLQkJCQlJQVNUTm9kZSBwYXJlbnQgPSBzdG10LmdldFBhcmVudCgpOwotCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCQlJQVNURm9yU3RhdGVtZW50IGZvclN0bXQgPSAoSUFTVEZvclN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJCWlmKGZvclN0bXQuZ2V0SW5pdGlhbGl6ZXJTdGF0ZW1lbnQoKSA9PSBzdG10KQotCQkJCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCQkJfQotCQkJCUlCbG9jayBibG9jayA9IGdldEJsb2NrKHN0bXQpOwotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShibG9jaywgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUUHJvYmxlbVN0YXRlbWVudCl7Ci0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtU3RhdGVtZW50Iik7Ci0JCQkJSUJsb2NrIGJsb2NrID0gZ2V0QmxvY2soc3RtdCk7Ci0JCQkJSUJsb2NrIG5leHQgPSBuZXh0QmxvY2soc3RtdCk7Ci0JCQkJQ29udHJvbEZsb3dFZGdlKGJsb2NrLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RSZXR1cm5TdGF0ZW1lbnQpewotCQkJCS8qIFRoZSByZXR1cm4gc3RhdGVtZW50IGZsb3dzIHRvIHRoZSBleGl0IGJsb2NrICovCi0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQiKTsKLQkJCQlJQVNUUmV0dXJuU3RhdGVtZW50IHJ0U3RtdCA9IChJQVNUUmV0dXJuU3RhdGVtZW50KXN0bXQ7Ci0JCQkJSUJsb2NrIHJ2ID0gZ2V0QmxvY2socnRTdG10LmdldFJldHVyblZhbHVlKCksIHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShydiwgZXhpdF8pOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJCS8qKiBUaGUgZXhpdF9qb2luIGJsb2NrIG9mIGEgc3dpdGNoIHN0YXRlbWVudCBmbG93cyB0byB0aGUKLQkJCQkgKiBmaXJzdCBibG9jayBvZiB0aGUgbmV4dCBzdGF0ZW1lbnQKLQkJCQkgKi8KLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaFN0YXRlbWVudCIpOwotCQkJCUlCbG9jayBqb2luID0gZ2V0QmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShqb2luLCBuZXh0KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQpewotCQkJCS8qKiBUaGUgY29uZGl0aW9uIGJsb2NrIG9mIGEgd2hpbGUgbG9vcCBmbG93cyB0byB0aGUgZmlyc3QKLQkJCQkgKiBzdGF0ZW1lbnQgaW4gdGhlIGxvb3AgYm9keSBhbmQgdGhlIGV4aXRfam9pbiBibG9jay4gCi0JCQkJICogVGhlIGNvbmRpdGlvbl9qb2luIGJsb2NrIGZsb3dzIHRvIHRoZSBjb25kaXRpb24gYmxvY2suCi0JCQkJICovCi0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJXaGlsZVN0YXRlbWVudCIpOwotCQkJCUlBU1RXaGlsZVN0YXRlbWVudCB3aFN0bXQgPSAoSUFTVFdoaWxlU3RhdGVtZW50KXN0bXQ7Ci0JCQkJSUJsb2NrIGNvbmQgPSBnZXRCbG9jayh3aFN0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpOwotCQkJCUlCbG9jayBjb250aW51ZWpvaW4gPSBnZXRCbG9jayhudWxsLCBzdG10LCBCbG9jay5jb250aW51ZV9qb2luX3R5cGUpOwotCQkJCUlCbG9jayBleGl0am9pbiA9IGdldEJsb2NrKG51bGwsIHN0bXQsIEJsb2NrLmV4aXRfam9pbl90eXBlKTsKLQkJCQlpZih3aFN0bXQuZ2V0Qm9keSgpID09IG51bGwpewotCQkJCQlDb250cm9sRmxvd0VkZ2UoY29uZCwgY29uZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSUJsb2NrIGZpcnN0ID0gZmlyc3RCbG9jayh3aFN0bXQuZ2V0Qm9keSgpKTsKLQkJCQkJQ29udHJvbEZsb3dFZGdlKGNvbmQsIGZpcnN0KTsKLQkJCQkJQ29udHJvbEZsb3dFZGdlKGNvbnRpbnVlam9pbiwgY29uZCk7Ci0JCQkJfQotCQkJCUlCbG9jayBuZXh0ID0gbmV4dEJsb2NrKHN0bXQpOwotCQkJCUNvbnRyb2xGbG93RWRnZShjb25kLCBleGl0am9pbik7Ci0JCQkJQ29udHJvbEZsb3dFZGdlKGV4aXRqb2luLCBuZXh0KTsKLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JCQotCQkvKgotCQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBibG9jayBvZiBzdG10Ci0JCSAqLwotCQlwdWJsaWMgSUJsb2NrIGZpcnN0QmxvY2soSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJCQotCQkJaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RCcmVha1N0YXRlbWVudCl7CQotCQkJCXJldHVybiBnZXRCbG9jayhzdG10KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ2FzZVN0YXRlbWVudCl7Ci0JCQkJcmV0dXJuIGdldEJsb2NrKHN0bXQpOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCl7Ci0JCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IGNtcFN0bXQgPSAoSUFTVENvbXBvdW5kU3RhdGVtZW50KXN0bXQ7Ci0JCQkJSUFTVFN0YXRlbWVudFtdIHN0bXRzID0gY21wU3RtdC5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQkJZm9yKGludCBpPTA7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCQlpZihzdG10c1tpXSAhPSBudWxsKSByZXR1cm4gZmlyc3RCbG9jayhzdG10c1tpXSk7Ci0JCQkJfQotCQkJCS8qIFRoZSBjb21wb3VuZCBzdGF0ZW1lbnQgaXMgZW1wdHkuIFJldHVybiB0aGUgZmlyc3QgYmxvY2sKLQkJCQkgKiBvZiB0aGUgbmV4dCBTdGF0ZW1lbnQuCi0JCQkJICovCi0JCQkJcmV0dXJuIG5leHRCbG9jayhzdG10KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpewotCQkJCXJldHVybiBnZXRCbG9jayhzdG10KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpewotCQkJCXJldHVybiBnZXRCbG9jayhzdG10KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVmYXVsdFN0YXRlbWVudCl7Ci0JCQkJcmV0dXJuIGdldEJsb2NrKHN0bXQpOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQkJSUFTVERvU3RhdGVtZW50IGRvU3RtdCA9IChJQVNURG9TdGF0ZW1lbnQpc3RtdDsKLQkJCQlpZihkb1N0bXQuZ2V0Qm9keSgpICE9IG51bGwpCi0JCQkJCXJldHVybiBmaXJzdEJsb2NrKGRvU3RtdC5nZXRCb2R5KCkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGdldEJsb2NrKGRvU3RtdC5nZXRDb25kaXRpb24oKSwgc3RtdCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25TdGF0ZW1lbnQpewotCQkJCXJldHVybiBnZXRCbG9jayhzdG10KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQlJQVNURm9yU3RhdGVtZW50IGZvclN0bXQgPSAoSUFTVEZvclN0YXRlbWVudClzdG10OwotCQkJCUlBU1RTdGF0ZW1lbnQgaW5pdFMgPSBmb3JTdG10LmdldEluaXRpYWxpemVyU3RhdGVtZW50KCk7Ci0JCQkJaWYoaW5pdFMgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGdldEJsb2NrKGluaXRTKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBnZXRCbG9jayhmb3JTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgc3RtdCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEdvdG9TdGF0ZW1lbnQpewotCQkJCXJldHVybiBnZXRCbG9jayhzdG10KTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJCUlBU1RJZlN0YXRlbWVudCBpZlN0bXQgPSAoSUFTVElmU3RhdGVtZW50KXN0bXQ7Ci0JCQkJcmV0dXJuIGdldEJsb2NrKGlmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RMYWJlbFN0YXRlbWVudCl7Ci0JCQkJSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsID0gKElBU1RMYWJlbFN0YXRlbWVudClzdG10OwotCQkJCXJldHVybiBnZXRCbG9jayhsYWJlbC5nZXROYW1lKCksIHN0bXQsIEJsb2NrLmxhYmVsX3R5cGUpOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1ROdWxsU3RhdGVtZW50KXsKLQkJCQlyZXR1cm4gZ2V0QmxvY2soc3RtdCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUUHJvYmxlbVN0YXRlbWVudCl7Ci0JCQkJcmV0dXJuIGdldEJsb2NrKHN0bXQpOwotCQkJfQotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFJldHVyblN0YXRlbWVudCl7Ci0JCQkJSUFTVFJldHVyblN0YXRlbWVudCBydFN0bXQgPSAoSUFTVFJldHVyblN0YXRlbWVudClzdG10OwotCQkJCXJldHVybiBnZXRCbG9jayhydFN0bXQuZ2V0UmV0dXJuVmFsdWUoKSwgc3RtdCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCl7Ci0JCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClzdG10OwotCQkJCXJldHVybiBnZXRCbG9jayhzd1N0bXQuZ2V0Q29udHJvbGxlckV4cHJlc3Npb24oKSwgc3RtdCk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQlJQVNUV2hpbGVTdGF0ZW1lbnQgd2hTdG10ID0gKElBU1RXaGlsZVN0YXRlbWVudClzdG10OwotCQkJCXJldHVybiBnZXRCbG9jayh3aFN0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkKLQkJLyoKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIElCbG9jayBuZXh0QmxvY2soSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJCQotCQkJSUFTVE5vZGUgbm9kZSA9IHN0bXQuZ2V0UGFyZW50KCk7Ci0JCQlpZighKG5vZGUgaW5zdGFuY2VvZiBJQVNUU3RhdGVtZW50KSl7Ci0JCQkJLyogZW1wdHkgcmV0dXJuIHN0YXRlbWVudCBmb3Igdm9pZC10eXBlZCBmdW5jdGlvbnMgKi8KLQkJCQlyZXR1cm4gZXhpdF87Ci0JCQl9Ci0JCQkKLQkJCUlBU1RTdGF0ZW1lbnQgcGFyZW50ID0gKElBU1RTdGF0ZW1lbnQpbm9kZTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCl7Ci0JCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IGNtcFN0bXQgPSAoSUFTVENvbXBvdW5kU3RhdGVtZW50KXBhcmVudDsKLQkJCQlJQVNUU3RhdGVtZW50W10gc3RtdHMgPSBjbXBTdG10LmdldFN0YXRlbWVudHMoKTsKLQkJCQlpbnQgaTsKLQkJCQlmb3IoaT0wOyBpPHN0bXRzLmxlbmd0aDsgaSsrKXsKLQkJCQkJaWYoc3RtdHNbaV0gPT0gc3RtdCkgYnJlYWs7Ci0JCQkJfQotCQkJCWZvcihpPWkrMTsgaTxzdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQkJCWlmKHN0bXRzW2ldICE9IG51bGwpIHJldHVybiBmaXJzdEJsb2NrKHN0bXRzW2ldKTsKLQkJCQl9Ci0JCQkJLypzdG10IGlzIHRoZSBsYXN0IG9uZSBpbiBjb21wb3VuZCBzdGF0ZW1lbnQgKi8KLQkJCQlyZXR1cm4gbmV4dEJsb2NrKHBhcmVudCk7Ci0JCQl9IAotCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpewotCQkJCXJldHVybiBuZXh0QmxvY2socGFyZW50KTsKLQkJCX0gCi0JCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQkJLyogInN0bXQiIGlzIHRoZSBib2R5IG9mIERvIHN0YXRlbWVudCwgY29udHJvbCBmbG93cyB0byAKLQkJCQkgKiB0aGUgY29udGludWUgam9pbiBibG9jawotCQkJCSAqLwotCQkJCXJldHVybiBnZXRCbG9jayhudWxsLCBwYXJlbnQsIEJsb2NrLmNvbnRpbnVlX2pvaW5fdHlwZSk7Ci0JCQl9IAotCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQkvKiBjb250cm9sIGZsb3dzIHRvIHRoZSBmb3IgbG9vcCBjb250aW51ZSBqb2luIGJsb2NrICovCi0JCQkJcmV0dXJuIGdldEJsb2NrKG51bGwsIHBhcmVudCwgQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCX0gCi0JCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQkJcmV0dXJuIGdldEJsb2NrKG51bGwsIHBhcmVudCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJfSAKLQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVExhYmVsU3RhdGVtZW50KXsKLQkJCQlyZXR1cm4gbmV4dEJsb2NrKHBhcmVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJCXJldHVybiBnZXRCbG9jayhudWxsLCBwYXJlbnQsIEJsb2NrLmV4aXRfam9pbl90eXBlKTsKLQkJCX0gCi0JCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJcmV0dXJuIGdldEJsb2NrKG51bGwsIHBhcmVudCwgQmxvY2suY29udGludWVfam9pbl90eXBlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV4dEJsb2NrKHBhcmVudCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBDb250cm9sRmxvd0VkZ2UoSUJsb2NrIGZyb20sIElCbG9jayB0byl7Ci0JCQlpZighZnJvbS5nZXRTdWNjcygpLmNvbnRhaW5zKHRvKSkKLQkJCQlmcm9tLmdldFN1Y2NzKCkuYWRkKHRvKTsKLQkJCWlmKCF0by5nZXRQcmVkcygpLmNvbnRhaW5zKGZyb20pKQotCQkJCXRvLmdldFByZWRzKCkuYWRkKGZyb20pOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RFeHByZXNzaW9uIGV4cHIpewotCQkJaWYgKGV4cHIgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikgewotCQkJCUlBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZ1bmNFeHByID0gKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKWV4cHI7Ci0JCQkJSUFTVEV4cHJlc3Npb24gZnVuY25hbWUgPSBmdW5jRXhwci5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCk7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmNuYW1lLmdldFJhd1NpZ25hdHVyZSgpOwotCQkJCWlmKHNpZ25hdHVyZS5lcXVhbHMoImV4aXQiKSl7Ci0JCQkJCWV4aXRCbG9jayA9IHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBQUk9DRVNTX1NLSVA7Ci0JCQl9Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2ljQmxvY2soSUJsb2NrIGJsb2NrKXsKLQkJaWYoIUJCc18uY29udGFpbnMoYmxvY2spKQotCQkJQkJzXy5hZGQoYmxvY2spOwotCX0KLQkKLQlwdWJsaWMgSUJsb2NrIGdldEJsb2NrKElBU1RFeHByZXNzaW9uIGV4cHIsIElBU1RTdGF0ZW1lbnQgcGFyZW50KSB7Ci0JCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBCQnNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlJQmxvY2sgYmIgPSBpLm5leHQoKTsKLQkJCWlmKGJiLnNlYXJjaChleHByLCBwYXJlbnQpKSByZXR1cm4gYmI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElCbG9jayBnZXRCbG9jayhJQVNUU3RhdGVtZW50IHN0bXQpewotCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gQkJzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJSUJsb2NrIGJiID0gaS5uZXh0KCk7Ci0JCQlpZihiYi5zZWFyY2goc3RtdCkpIHJldHVybiBiYjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElCbG9jayBnZXRCbG9jayhJQVNUTmFtZSBsYWJlbCl7Ci0JCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBCQnNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlJQmxvY2sgYmIgPSBpLm5leHQoKTsKLQkJCWlmKGJiLnNlYXJjaChsYWJlbCkpIHJldHVybiBiYjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElCbG9jayBnZXRCbG9jayhJQVNUTm9kZSBjb250ZW50LCBJQVNUU3RhdGVtZW50IHBhcmVudCwgaW50IHR5cGUpewotCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gQkJzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJQmxvY2sgYmIgPSAoQmxvY2spaS5uZXh0KCk7Ci0JCQlpZihiYi5zZWFyY2goY29udGVudCwgcGFyZW50LCB0eXBlKSkgcmV0dXJuIGJiOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSUJsb2NrIGdldEVudHJ5KCkgewotCQlyZXR1cm4gZW50cnlfOwotCX0KLQotCXB1YmxpYyBJQmxvY2sgZ2V0RXhpdCgpIHsKLQkJcmV0dXJuIGV4aXRfOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRCbG9jayhJQmxvY2sgYmIpewotCQlpZighQkJzXy5jb250YWlucyhiYikpCi0JCQlCQnNfLmFkZChiYik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgYnVpbGRET00oKXsKLQkJTGlzdDxJQmxvY2s+IGFsbCA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQlhbGwuYWRkKGVudHJ5Xyk7Ci0JCWFsbC5hZGRBbGwoQkJzXyk7Ci0JCWFsbC5hZGQoZXhpdF8pOwotCQkKLQkJZW50cnlfLmdldERPTSgpLmFkZChlbnRyeV8pOwotCQkKLQkJSXRlcmF0b3I8SUJsb2NrPiBpOwotCQlmb3IoaSA9IEJCc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCWkubmV4dCgpLnNldERPTShhbGwpOwotCQl9Ci0JCWV4aXRfLnNldERPTShhbGwpOwotCQkKLQkJYm9vbGVhbiBjaGFuZ2UgPSB0cnVlOwotCQl3aGlsZShjaGFuZ2UpewotCQkJY2hhbmdlID0gZmFsc2U7Ci0JCQlmb3IoaSA9IGFsbC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCUlCbG9jayBibG9jayA9IGkubmV4dCgpOwotCQkJCWlmKGJsb2NrID09IGVudHJ5XykgY29udGludWU7Ci0JCQkJTGlzdDxJQmxvY2s+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PElCbG9jaz4oYWxsKTsKLQkJCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpaSA9IGJsb2NrLmdldFByZWRzKCkuaXRlcmF0b3IoKTsgaWkuaGFzTmV4dCgpOyl7Ci0JCQkJCUlCbG9jayBwcmVkID0gaWkubmV4dCgpOwotCQkJCQl0ZW1wID0gaW50ZXJzZWN0KHRlbXAsIHByZWQuZ2V0RE9NKCkpOwotCQkJCX0KLQkJCQlMaXN0PElCbG9jaz4gRCA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPih0ZW1wKTsKLQkJCQlpZighRC5jb250YWlucyhibG9jaykpIEQuYWRkKGJsb2NrKTsKLQkJCQlpZighZXF1YWxzKEQsIGJsb2NrLmdldERPTSgpKSl7Ci0JCQkJCWNoYW5nZSA9IHRydWU7Ci0JCQkJCWJsb2NrLnNldERPTShEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYnVpbGRQRE9NKCl7Ci0JCS8qIFRPRE8gKi8KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3QgaW50ZXJzZWN0KExpc3QgQSwgTGlzdCBCKXsKLQkJaWYoQSA9PSBudWxsIHx8IEIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKEl0ZXJhdG9yIGkgPSBBLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJaWYoQi5jb250YWlucyhvKSkgbGlzdC5hZGQobyk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhMaXN0IEEsIExpc3QgQil7Ci0JCWlmKEEgPT0gbnVsbCAmJiBCID09IG51bGwpIHJldHVybiB0cnVlOwotCQlpZihBID09IG51bGwgJiYgQiAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmKEEgIT0gbnVsbCAmJiBCID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJaWYoQS5zaXplKCkgIT0gQi5zaXplKCkpIHJldHVybiBmYWxzZTsKLQkJZm9yKEl0ZXJhdG9yIGkgPSBBLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlpZighQi5jb250YWlucyhpLm5leHQoKSkpIHJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU29ydCBCbG9ja3MgaW4gdG9wb2xvZ2ljYWwgb3JkZXIKLQkgKi8KLQlwcml2YXRlIFN0YWNrPElCbG9jaz4gb3JkZXI7Ci0JcHJvdGVjdGVkIHZvaWQgc29ydCgpewotCQlMaXN0PElCbG9jaz4gYWxsID0gbmV3IEFycmF5TGlzdDxJQmxvY2s+KCk7Ci0JCWFsbC5hZGQoZW50cnlfKTsKLQkJYWxsLmFkZEFsbChCQnNfKTsKLQkJYWxsLmFkZChleGl0Xyk7Ci0JCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBhbGwuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlCbG9jayBibG9jayA9IGkubmV4dCgpOwotCQkJYmxvY2suc2V0QXR0cigiY29sb3IiLCBuZXcgSW50ZWdlcigwKSk7Ci0JCX0KLQkJb3JkZXIgPSBuZXcgU3RhY2s8SUJsb2NrPigpOwotCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gYWxsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlJQmxvY2sgYmxvY2sgPSAoSUJsb2NrKWkubmV4dCgpOwotCQkJaW50IGNvbG9yID0gKChJbnRlZ2VyKWJsb2NrLmdldEF0dHIoImNvbG9yIikpLmludFZhbHVlKCk7Ci0JCQlpZihjb2xvciA9PSAwKQotCQkJCURGU1Zpc2l0KGJsb2NrKTsKLQkJfQotCi0JCUlCbG9jayBiMSA9IG9yZGVyLnBvcCgpOwotCQlJQmxvY2sgYjIgPSBudWxsOwotCQl3aGlsZSghb3JkZXIuZW1wdHkoKSl7Ci0JCQliMiA9IG9yZGVyLnBvcCgpOwotCQkJYjEuc2V0VG9wTmV4dChiMik7Ci0JCQliMSA9IGIyOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIERGU1Zpc2l0KElCbG9jayBibG9jayl7Ci0JCWJsb2NrLnNldEF0dHIoImNvbG9yIiwgbmV3IEludGVnZXIoMSkpOyAvL2dyYXkKLQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IGJsb2NrLmdldFN1Y2NzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCUlCbG9jayBzdWNjID0gaS5uZXh0KCk7Ci0JCQlpZihpc0JhY2tFZGdlU3VjYyhibG9jaywgc3VjYykpIGNvbnRpbnVlOwotCQkJaW50IGNvbG9yID0gKChJbnRlZ2VyKXN1Y2MuZ2V0QXR0cigiY29sb3IiKSkuaW50VmFsdWUoKTsKLQkJCWlmKGNvbG9yID09IDApIC8vd2hpdGUKLQkJCQlERlNWaXNpdChzdWNjKTsKLQkJfQotCQlvcmRlci5wdXNoKGJsb2NrKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiAidHJ1ZSIgaWYgZWRnZSAoZnJvbSwgdG8pIGlzIGEgYmFjayBlZGdlLiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0JhY2tFZGdlU3VjYyhJQmxvY2sgZnJvbSwgSUJsb2NrIHRvKXsKLQkJcmV0dXJuIGZyb20uZ2V0U3VjY3MoKS5jb250YWlucyh0bykgJiYgZnJvbS5nZXRET00oKS5jb250YWlucyh0byk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG90aGVyT1BzKCl7Ci0JCS8qIEVtcHR5IG1ldGhvZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnQoKXsKLQkJZm9yKElCbG9jayBiID0gZW50cnlfOyBiICE9IG51bGw7IGIgPSBiLnRvcE5leHQoKSkKLQkJCWIucHJpbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2NkdC9ncmFwaHMvaW1wbC9SZXNvdXJjZUNvbGxlY3Rvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9pbXBsL1Jlc291cmNlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWQ3OTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvY2R0L2dyYXBocy9pbXBsL1Jlc291cmNlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLkNET007Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLklBU1RTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbXBvc2l0ZVR5cGVTcGVjaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURGVjbFNwZWNpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEVsYWJvcmF0ZWRUeXBlU3BlY2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEVudW1lcmF0aW9uU3BlY2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVjbGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTaW1wbGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoTm9kZTsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UgY29sbGVjdG9yIGNvbGxlY3RzIGFsbCBmdW5jdGlvbnMgZm9yIHRoZSBjYWxsIGdyYXBoLCBidXQgZG9lcyBub3QKLSAqIGNhbGN1bGF0ZSB0aGUgY2FsbGVyIGFuZCBjYWxsZWUgcmVsYXRpb25zLgotICogCi0gKiBAYXV0aG9yIFl1YW4gWmhhbmcsIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbGxlY3RvciBleHRlbmRzIEFTVFZpc2l0b3IgewotCXByb3RlY3RlZCBJQ2FsbEdyYXBoIENHXzsgCi0JcHJvdGVjdGVkIElGaWxlIGZpbGVfOwotCXByb3RlY3RlZCBpbnQgZGVwdGg7Ci0JCi0JLyoqCi0JICogUmVzb3VyY2UgY29sbGVjdG9yIGZpbmRzIGFsbCBmdW5jdGlvbnMgaW4gYSBnaXZlbiBzb3VyY2UgZmlsZSwKLQkgKiBhbmQgYWRkcyB0aGVtIHRvIHRoZSBnaXZlbiBjYWxsIGdyYXBoCi0JICogQHBhcmFtIGNnIGNhbGwgZ3JhcGggdGhhdCB3aWxsIGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBhZGRlZCB0byBpdAotCSAqIEBwYXJhbSBmaWxlIHNvdXJjZSBmaWxlIHdob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIGRpc2NvdmVyZWQgYW5kIGNhdGFsb2d1ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VDb2xsZWN0b3IoSUNhbGxHcmFwaCBjZywgSUZpbGUgZmlsZSl7Ci0JCUNHXyA9IGNnOwotCQlmaWxlXyA9IGZpbGU7Ci0JfQotCQotCS8qKgotCSAqIFVzZSBhbiBBU1RWaXNpdG9yIHRvIGRpc2NvdmVyIHRoZSBmdW5jdGlvbnMgaW4gdGhlIHRoZSBnaXZlbiBzb3VyY2UgYW5kIGFkZCB0aGVtIHRvIHRoZSBjYWxsIGdyYXBoCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCl7Ci0JCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQl0aGlzLnNob3VsZFZpc2l0VHJhbnNsYXRpb25Vbml0ID0gdHJ1ZTsKLQkJSUFTVFRyYW5zbGF0aW9uVW5pdCBhc3RfID0gbnVsbDsKLQkJdHJ5IHsKLSAgICAgICAgICAgIGFzdF8gPSBDRE9NLmdldEluc3RhbmNlKCkuZ2V0QVNUU2VydmljZSgpLmdldFRyYW5zbGF0aW9uVW5pdChmaWxlXywKLSAgICAgICAgICAgICAgICAgICAgQ0RPTS5nZXRJbnN0YW5jZSgpLmdldENvZGVSZWFkZXJGYWN0b3J5KENET00uUEFSU0VfU0FWRURfUkVTT1VSQ0VTKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElBU1RTZXJ2aWNlUHJvdmlkZXIuVW5zdXBwb3J0ZWREaWFsZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBkZXB0aCA9IDA7Ci0gICAgICAgIGFzdF8uYWNjZXB0KHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiB2aXNpdHMgZGVjbGFyYXRpb24gbm9kZXMgdG8gY2F0YWxvZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0JICovCi0JcHVibGljIGludCB2aXNpdChJQVNURGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZGVjbGFyYXRpb24uZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCk7Ci0JCS8vIGlmKCFmaWxlbmFtZS5lbmRzV2l0aCgiLmMiKSB8fCAhZmlsZW5hbWUuZW5kc1dpdGgoIi5DIikpCi0JCWlmIChmaWxlbmFtZS5lbmRzV2l0aCgiLmgiKSkKLQkJCXJldHVybiBQUk9DRVNTX1NLSVA7Ci0KLQkJaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbikgewotCQkJZGVwdGgrKzsKLQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmQgPSAoSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbikgZGVjbGFyYXRpb247Ci0JCQlJQ2FsbEdyYXBoTm9kZSBub2RlID0gYWRkQ2FsbEdyYXBoTm9kZShmaWxlXywgZmlsZW5hbWUsIGZkKTsKLQkJCUNHXy5hZGROb2RlKG5vZGUpOwotCQkJcmV0dXJuIFBST0NFU1NfU0tJUDsKLQkJfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIElBU1RTaW1wbGVEZWNsYXJhdGlvbikgewotCQkJaWYgKGRlcHRoID4gMCkKLQkJCQlyZXR1cm4gUFJPQ0VTU19TS0lQOyAvLyBub3QgZ2xvYmFsCi0JCQlJQVNUU2ltcGxlRGVjbGFyYXRpb24gc2RlY2wgPSAoSUFTVFNpbXBsZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLQkJCS8qIGlmIHRoZSBkZWNsYXJhdG9yIGlzIG51bGwsIHRoZW4gaXQgaXMgYSBzdHJ1Y3R1cmUgc3BlY2lmaWVyICovCi0JCQlpZiAoc2RlY2wuZ2V0RGVjbGFyYXRvcnMoKSA9PSBudWxsKQotCQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQkJSUFTVERlY2xTcGVjaWZpZXIgc3BlYyA9IHNkZWNsLmdldERlY2xTcGVjaWZpZXIoKTsKLQkJCWlmIChzcGVjIGluc3RhbmNlb2YgSUFTVENvbXBvc2l0ZVR5cGVTcGVjaWZpZXIKLQkJCQkJfHwgc3BlYyBpbnN0YW5jZW9mIElBU1RFbGFib3JhdGVkVHlwZVNwZWNpZmllcgotCQkJCQl8fCBzcGVjIGluc3RhbmNlb2YgSUFTVEVudW1lcmF0aW9uU3BlY2lmaWVyKQotCQkJCXJldHVybiBQUk9DRVNTX1NLSVA7Ci0KLQkJCUxpc3Q8U3RyaW5nPiBlbnYgPSBDR18uZ2V0RW52KCk7Ci0JCQlJQVNURGVjbGFyYXRvcltdIGRlY2xhcmF0b3JzID0gc2RlY2wuZ2V0RGVjbGFyYXRvcnMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVjbGFyYXRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoZGVjbGFyYXRvcnNbal0gaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25EZWNsYXJhdG9yKQotCQkJCQljb250aW51ZTsKLQkJCQlJQVNUTmFtZSBuID0gZGVjbGFyYXRvcnNbal0uZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB2YXIgPSBuLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKGRvUXVpY2tPcHRpb25hbFRlc3QodmFyKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFlbnYuY29udGFpbnModmFyKSkKLQkJCQkJZW52LmFkZCh2YXIpOwotCQkJCWRvT3RoZXJEZUNsYXJhdG9yU3R1ZmYoZGVjbGFyYXRvcnNbal0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCX0KLQkKLQotCXB1YmxpYyBpbnQgbGVhdmUoSUFTVERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSAKLQl7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGRlY2xhcmF0aW9uLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpOwotCQkvL2lmKCFmaWxlbmFtZS5lbmRzV2l0aCgiLmMiKSB8fCAhZmlsZW5hbWUuZW5kc1dpdGgoIi5DIikpCi0JCWlmKGZpbGVuYW1lLmVuZHNXaXRoKCIuaCIpKQotCQkJcmV0dXJuIFBST0NFU1NfU0tJUDsKLQkJCi0JCWlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pIHsKLQkJCWRlcHRoIC0tOwotCQkJcmV0dXJuIFBST0NFU1NfU0tJUDsKLQkJfQotCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQl9Ci0JLyoqCi0JICogQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBjcmVhdGUgYSBzcGVjaWZpYyBraW5kIG9mIGNhbGwgZ3JhcGgKLQkgKiBub2RlIGlmIHJlcXVpcmVkCi0JICogCi0JICogQHJldHVybiBjYWxsIGdyYXBoIG5vZGUgY3JlYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2FsbEdyYXBoTm9kZSBhZGRDYWxsR3JhcGhOb2RlKElGaWxlIGZpbGUsIFN0cmluZyBmaWxlbmFtZSwKLQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmQpIHsKLQkJSUNhbGxHcmFwaE5vZGUgY2dub2RlID0gbmV3IENhbGxHcmFwaE5vZGUoZmlsZSwgZmlsZW5hbWUsIGZkKTsKLQkJcmV0dXJuIGNnbm9kZTsKLQl9Ci0JLyoqIAotICAgICAqIGV4dHJhIG9wdGlvbmFsIHRlc3QgdGhhdCBkZXJpdmVkIGNsYXNzIGNhbiBkbwotICAgICAqLwotCXByb3RlY3RlZCBib29sZWFuIGRvUXVpY2tPcHRpb25hbFRlc3QoU3RyaW5nIHZhcil7Ci0JIHJldHVybiB0cnVlOwotCSB9Ci0JIAotCS8qKgotCSAqIG9wdGlvbmFsIHN0dWZmIHRoYXQgZGVyaXZlZCBjbGFzcyBtYXkgd2FudCB0byBkbyBhdCB0aGlzIHBvaW50Ci0JICogQHBhcmFtIGRlY2xhcmF0b3IKLQkgKi8KLQkgcHJvdGVjdGVkIHZvaWQgZG9PdGhlckRlQ2xhcmF0b3JTdHVmZihJQVNURGVjbGFyYXRvciBkZWNsYXJhdG9yKXt9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy8uY2xhc3NwYXRoIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvLnByb2plY3QgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3OWQ0Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk5ODJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpczsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLnZpZXcKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UuY2R0LnVpLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gY29tLmlibS5pY3UsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4MzU5Yi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL2ljb25zL2JhcnJpZXIuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvaWNvbnMvYmFycmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTk3NjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvaWNvbnMvYmFycmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9pY29ucy9jb2xsYXBzZWFsbC5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9pY29ucy9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTIzZjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvaWNvbnMvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvaWNvbnMvZXhwYW5kYWxsLmdpZiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL2ljb25zL2V4cGFuZGFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTY3YmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvaWNvbnMvZXhwYW5kYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDU3NTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIE1QSSBCYXJyaWVyIEFuYWx5c2lzCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NWJkOTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IlBUUCBNUEkgVmlld3MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iTVBJIEJhcnJpZXJzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYmFycmllci5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUJhcnJpZXJWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUJhcnJpZXJUYWJsZVZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IlBUUCBNUEkgVmlld3MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iQmFycmllciBNYXRjaGVzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYmFycmllci5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUJhcnJpZXJNYXRjaGluZ1NldFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLnZpZXcuTVBJQmFycmllck1hdGNoaW5nU2V0VGFibGVWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJQVFAgTVBJIFZpZXdzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IkJhcnJpZXIgRXJyb3JzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYmFycmllci5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUVycm9yVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldy5NUElFcnJvclZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gIE1QSSBCYXJyaWVyIG1hcmtlcnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIgotCQlpZD0ibXBpQmFycmllck1hcmtlciIKLSAgICAgICAgbmFtZT0iTVBJIEJhcnJpZXIgQXJ0aWZhY3QgTWFya2VyIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVOYW1lIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRoZUxpbmVObyIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aGVOZXdMaW5lTm8iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sdW1uTm8iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25zdHJ1Y3RUeXBlIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVuaXF1ZUlEIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0gdGhpcyBjaGFuZ2VzIHRoZSBtYXJrZXIgaW1hZ2UgaW4gdGhlIGVkaXRvciBtYXJrZXIgYmFyICAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmFubm90YXRpb25UeXBlcyI+Ci0gICAgICA8dHlwZQotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLm1waUJhcnJpZXJNYXJrZXIiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMubXBpQmFycmllck1hcmtlckFubm90YXRpb24iPgotICAgICAgPC90eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5tcGlCYXJyaWVyTWFya2VyQW5ub3RhdGlvbiIKLSAgICAgICAgICAgIGljb249Imljb25zL2JhcnJpZXIuZ2lmIiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJlc2VudGF0aW9uTGF5ZXI9IjMiCi0gICAgICAgICAgICBsYWJlbD0iTVBJIEJhcnJpZXIgQW5ub3RhdGlvbiBNYXJrZXIiCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRleHRQcmVmZXJlbmNlS2V5PSJtcGlJbmRpY2F0aW9uIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VLZXk9ImFydGlmYWN0SGlnaGxpZ2h0aW5nIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZVZhbHVlPSJmYWxzZSIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RJbmRpY2F0aW9uQ29sb3IiCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VWYWx1ZT0iMCwxMjgsMTkyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VLZXk9ImFydGlmYWN0SW5kaWNhdGlvbkluVmVydGljYWxSdWxlciIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0JCQlzaG93SW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbktleT0ic2hvd1BvcnRpbmdJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uIgotICAgICAgICAgICAgc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb249ImZhbHNlIgotICAgICAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VLZXk9ImFydGlmYWN0SW5kaWNhdGlvbkluT3ZlcnZpZXdSdWxlciIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluY2x1ZGVPblByZWZlcmVuY2VQYWdlPSJ0cnVlIgotICAgICAgICAgICAgaXNHb1RvUHJldmlvdXNOYXZpZ2F0aW9uVGFyZ2V0S2V5PSJpc1BvcnRpbmdHb1RvUHJldmlvdXNOYXZpZ2F0aW9uVGFyZ2V0IgotCi0gICAgICAgICAgICBpc0dvVG9OZXh0TmF2aWdhdGlvblRhcmdldEtleT0iaXNQb3J0aW5nUmVjb3JkR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0IgotICAgICAgICAgICAgPgotICAgICAgPC9zcGVjaWZpY2F0aW9uPiAgCi0gICA8L2V4dGVuc2lvbj4KLQotCQotICAgPCEtLSBNYXRjaGluZyBTZXQgQXJ0aWZhY3RzIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9Im1waUJhcnJpZXJNYXRjaGluZ1NldE1hcmtlciIKLSAgICAgICAgbmFtZT0iTVBJIEJhcnJpZXIgTWF0Y2hpbmcgU2V0IE1hcmtlciI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlTmFtZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aGVMaW5lTm8iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGhlTmV3TGluZU5vIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHVtbk5vIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uc3RydWN0VHlwZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWVJRCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tIHRoaXMgY2hhbmdlcyB0aGUgbWFya2VyIGltYWdlIGluIHRoZSBlZGl0b3IgbWFya2VyIGJhciAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5hbm5vdGF0aW9uVHlwZXMiPgotICAgICAgPHR5cGUKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5tcGlCYXJyaWVyTWF0Y2hpbmdTZXRNYXJrZXIiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMubXBpQmFycmllck1hdGNoaW5nU2V0TWFya2VyQW5ub3RhdGlvbiI+Ci0gICAgICA8L3R5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLm1hcmtlckFubm90YXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLm1waUJhcnJpZXJNYXRjaGluZ1NldE1hcmtlckFubm90YXRpb24iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9iYXJyaWVyLmdpZiIgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSIzIgotICAgICAgICAgICAgbGFiZWw9Ik1QSSBCYXJyaWVyIE1hdGNoaW5nIFNldCBBbm5vdGF0aW9uIE1hcmtlciIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9Im1waUluZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIwLDEyOCwxOTIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLQkJCXNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uS2V5PSJzaG93UG9ydGluZ0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb24iCi0gICAgICAgICAgICBzaG93SW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbj0iZmFsc2UiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RJbmRpY2F0aW9uSW5PdmVydmlld1J1bGVyIgotICAgICAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW5jbHVkZU9uUHJlZmVyZW5jZVBhZ2U9InRydWUiCi0gICAgICAgICAgICBpc0dvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ0dvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXQiCi0KLSAgICAgICAgICAgIGlzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0S2V5PSJpc1BvcnRpbmdSZWNvcmRHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXQiCi0gICAgICAgICAgICA+Ci0gICAgICA8L3NwZWNpZmljYXRpb24+ICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIEJhcnJpZXIgRXJyb3IgQXJ0aWZhY3RzIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9Im1waUVycm9yTWFya2VyIgotICAgICAgICBuYW1lPSJNUEkgQmFycmllciBFcnJvciBNYXJrZXIiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZU5hbWUiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGhlTGluZU5vIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRoZU5ld0xpbmVObyIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2x1bW5ObyIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnN0cnVjdFR5cGUiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5pcXVlSUQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSB0aGlzIGNoYW5nZXMgdGhlIG1hcmtlciBpbWFnZSBpbiB0aGUgZWRpdG9yIG1hcmtlciBiYXIgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMubXBpQmFycmllckVycm9yTWFya2VyIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLm1waUJhcnJpZXJFcnJvck1hcmtlckFubm90YXRpb24iPgotICAgICAgPC90eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5tcGlCYXJyaWVyRXJyb3JNYXJrZXJBbm5vdGF0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYmFycmllci5naWYiIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmVzZW50YXRpb25MYXllcj0iMyIKLSAgICAgICAgICAgIGxhYmVsPSJNUEkgQmFycmllciBFcnJvciBBbm5vdGF0aW9uIE1hcmtlciIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9Im1waUluZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIwLDEyOCwxOTIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLQkJCXNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uS2V5PSJzaG93UG9ydGluZ0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb24iCi0gICAgICAgICAgICBzaG93SW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbj0iZmFsc2UiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RJbmRpY2F0aW9uSW5PdmVydmlld1J1bGVyIgotICAgICAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW5jbHVkZU9uUHJlZmVyZW5jZVBhZ2U9InRydWUiCi0gICAgICAgICAgICBpc0dvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ0dvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXQiCi0KLSAgICAgICAgICAgIGlzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0S2V5PSJpc1BvcnRpbmdSZWNvcmRHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXQiCi0gICAgICAgICAgICA+Ci0gICAgICA8L3NwZWNpZmljYXRpb24+ICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYWN0aW9ucy5SdW5BbmFseXNlTVBJQW5hbHlzaXNjb21tYW5kSGFuZGxlciIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY29tbWFuZDIiCi0gICAgICAgICAgICAgICBuYW1lPSJNUEkgQmFycmllciBBbmFseXNpcyI+Ci0gICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhci5jb21tYW5kMT9hZnRlcj1zZXBhcmF0b3I0LmJhcnJpZXIiPgotICAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNvbW1hbmQyIgotICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvYmFycmllci5naWYiCi0gICAgICAgICAgICAgICAgICBsYWJlbD0iTVBJIEJhcnJpZXIgQW5hbHlzaXMiCi0gICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IlJ1biBNUEkgQmFycmllciBBbmFseXNpcyBvbiBzZWxlY3RlZCBwcm9qZWN0LCBmb2xkZXIsIG9yIGZpbGUiPgotICAgICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotCi0gICAgICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL0FjdGl2YXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjY2Q1ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9JRHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvSURzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzFmMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9JRHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXM7Ci0KLS8qKgotICogSUQgdmFsdWVzIHNoYXJlZCBieSBzZXZlcmFsIGNsYXNzZXMgaW4gdGhpcyBwbHVnLWluCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIElEcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmFycmllck1hcmtlcklEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5tcGlCYXJyaWVyTWFya2VyIjsKLQotCS8qKgotCSAqIFRoZSBtYXJrZXIgaWQgZm9yIGJhcnJpZXIgbWF0Y2hpbmcgc2V0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1hdGNoaW5nU2V0TWFya2VySUQgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLm1waUJhcnJpZXJNYXRjaGluZ1NldE1hcmtlciI7Ci0JLyoqCi0JICogdGhlIG1hcmtlciBhdHRyaWJ1dGUgbmFtZSBmb3IgYSBwYXJlbnQgbm9kZS4KLQkgKiBBbGwgbWFya2VycyB3aXRoIHRoZSBzYW1lIHBhcmVudCB2YWx1ZSBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mCi0JICogdGhlIHNhbWUgQmFycmllciBtYXRjaGluZyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFyZW50QXR0cmliTmFtZT0icGFyZW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBwYXJlbnROYW1lID0gInBhcmVudE5hbWUiOwotCQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1hdGNoaW5nU2V0Vmlld0lEPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldy5NUElCYXJyaWVyTWF0Y2hpbmdTZXRUYWJsZVZpZXciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVycm9yVmlld0lEID0gICAgICJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldy5NUElFcnJvclZpZXciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGJhcnJpZXJWaWV3SUQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUJhcnJpZXJUYWJsZVZpZXciOwotICAgIAotICAgIC8qIEZvciBlcnJvciBjb3VudGVyIGV4YW1wbGVzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyb3JNYXJrZXJJRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuZXJyb3JNYXJrZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHBhcmVudElEQXR0ciA9ICJwYXJlbnRJRCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlJREF0dHIgPSAibXlJRCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlOYW1lQXR0ciA9ICJteU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG15SW5kZXhBdHRyID0gIm15SW5kZXgiOwotLy8gdGVzdCAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYWN0aW9ucy9NUElBbmFseXNpc01hbmFnZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYWN0aW9ucy9NUElBbmFseXNpc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2ODhiYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FjdGlvbnMvTVBJQW5hbHlzaXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4ICBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuVmlld0FjdGl2YXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpcy5CYXJyaWVyVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLk1QSUJhcnJpZXJBbmFseXNpc1Jlc3VsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLk1QSUJhcnJpZXJFeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpcy5NUElCYXJyaWVyTWF0Y2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLk1QSUNGR0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLk1QSUNhbGxHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuTVBJRFVDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuTVBJTVZBbmFseXNpczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldy5CYXJyaWVyQXJ0aWZhY3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLnZpZXcuTWF0Y2hpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLnZpZXcuU2hvd0Vycm9yczsKLQotcHVibGljIGNsYXNzIE1QSUFuYWx5c2lzTWFuYWdlcnsKLQlwcm90ZWN0ZWQgQmFycmllclRhYmxlIGJ0YWJsZV87Ci0JcHJvdGVjdGVkIE1QSUNhbGxHcmFwaCBjZ187Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZU9uPWZhbHNlOwotCQotCQotCXB1YmxpYyBNUElBbmFseXNpc01hbmFnZXIoTVBJQ2FsbEdyYXBoIGNnKQotCXsKLQkJY2dfID0gY2c7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgYW5hbHlzaXMgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbnkgZXJyb3JzIHdlcmUgZm91bmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKCkKLQl7CQotCSAgaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk1QSSBBTTogMS4gYnVpbGQgQ0ciKTsKLQkJY2dfLmJ1aWxkQ0coKTsKLQkJLy9jZ18ucHJpbnQoKTsKLQkJLyoKLQkJaWYoY2dfLmhhc0Vycm9yKCkpewotCQkJU3RyaW5nIG1hcmtlcklEID0gSURzLmJhcnJpZXJNYXJrZXJJRDsKLQkJCU1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3IgdmlzaXRvciA9IG5ldyBNUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKG1hcmtlcklEKTsKLQkJCUJhcnJpZXJBcnRpZmFjdHMgYmEgPSBuZXcgQmFycmllckFydGlmYWN0cyhjZ18sIHZpc2l0b3IpOwotCQkJYmEucnVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJKi8KLSAgICAKLQkJYnRhYmxlXyA9IGNnXy5nZXRCYXJyaWVyVGFibGUoKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIjIuIENhbGwgR3JhcGggZmluaXNoZWQgISIpOwotCQkKLQkJTVBJQmFycmllckV4cHIgQkUgPSBuZXcgTVBJQmFycmllckV4cHIoYnRhYmxlXywgY2dfKTsgCi0JCUJFLnJ1bigpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiMy4gQmFycmllciBFeHByZXNzaW9uIENvbnN0cnVjdGlvbiBmaW5pc2hlZCAhIik7Ci0JCQotCQlNUElDRkdCdWlsZGVyIGNmZyA9IG5ldyBNUElDRkdCdWlsZGVyKGNnXyk7Ci0JCWNmZy5ydW4oKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIjQuIENvbnRyb2wgRmxvdyBHcmFwaCBDb25zdHJ1Y3Rpb24gZmluaXNoZWQgISIpOwotCQkKLQkJTVBJRFVDaGFpbiByZCA9IG5ldyBNUElEVUNoYWluKGNnXyk7Ci0JCXJkLnJ1bigpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiNS4gUmVhY2hpbmcgRGVmaW5pdGlvbiBhbmQgUGhpIFBsYWNlbWVudCBmaW5pc2hlZCAhIik7Ci0JCQotCQlNUElNVkFuYWx5c2lzIG12YSA9IG5ldyBNUElNVkFuYWx5c2lzKGNnXyk7Ci0JCW12YS5ydW4oKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIjYuIE11bHRpLXZhbHVlZCBBbmFseXNpcyBmaW5pc2hlZCAhIik7Ci0JCQotCQlNUElCYXJyaWVyTWF0Y2hpbmcgYm0gPSBuZXcgTVBJQmFycmllck1hdGNoaW5nKGNnXywgYnRhYmxlXyk7Ci0JCWJtLnJ1bigpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiNy4gQmFycmllciBNYXRjaGluZyBmaW5pc2hlZCEgIik7Ci0JCQkJCi0JCU1QSUJhcnJpZXJBbmFseXNpc1Jlc3VsdHMgcmVzdWx0cyA9IG5ldyBNUElCYXJyaWVyQW5hbHlzaXNSZXN1bHRzKCk7Ci0JCXJlc3VsdHMuc2V0QmFycmllclRhYmxlKGJ0YWJsZV8pOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiOC4gLi4uZ290IGJhcnJpZXIgdGFibGUgIik7Ci0JCQotCQlTdHJpbmcgbWFya2VySUQgPSBJRHMuYmFycmllck1hcmtlcklEOwotCQlNUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihtYXJrZXJJRCk7Ci0JCUJhcnJpZXJBcnRpZmFjdHMgYmEgPSBuZXcgQmFycmllckFydGlmYWN0cyhjZ18sIHZpc2l0b3IpOwotCQliYS5ydW4oKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIjkuIC4uLiBnb3QgYmFycmllciBhcnRpZmFjdHMgIik7Ci0JCQotCQlNYXRjaGluZ1NldCBtc3YgPSBuZXcgTWF0Y2hpbmdTZXQoYnRhYmxlXyk7Ci0JCW1zdi5ydW4oKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIjEwLiAuLi5nb3QgbWF0Y2hpbmcgc2V0ICIpOwotCQkKLQkJU2hvd0Vycm9ycyBzZSA9IG5ldyBTaG93RXJyb3JzKGJtLmdldEVycm9ycygpKTsKLQkJYm9vbGVhbiBmb3VuZEVycm9yID0gc2UucnVuKCk7CQotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiMTEuICAuLi4gZ290IGVycm9ycyAoaWYgYW55KSAiKTsKLQotCQlyZXR1cm4gZm91bmRFcnJvcjsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FjdGlvbnMvUnVuQW5hbHlzZU1QSUFuYWx5c2lzY29tbWFuZEhhbmRsZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYWN0aW9ucy9SdW5BbmFseXNlTVBJQW5hbHlzaXNjb21tYW5kSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkxNzZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYWN0aW9ucy9SdW5BbmFseXNlTVBJQW5hbHlzaXNjb21tYW5kSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnMuQW5hbHlzaXNEcm9wZG93bkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnMuUnVuQW5hbHlzZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuVmlld0FjdGl2YXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpcy5NUElDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLk1QSVJlc291cmNlQ29sbGVjdG9yOwotCi0KLS8qKgotICogRG8gTVBJIGJhcnJpZXIgYW5hbHlzaXMgZnJvbSBkcm9wZG93biB0b29sYmFyIG1lbnUKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFuYWx5c2VNUElBbmFseXNpc2NvbW1hbmRIYW5kbGVyIGV4dGVuZHMgUnVuQW5hbHlzZUhhbmRsZXIgIHsKLQlwcm90ZWN0ZWQgTVBJQ2FsbEdyYXBoIGNhbGxHcmFwaF87Ci0JYm9vbGVhbiB0cmFjZU9uPWZhbHNlOwotCQotCXB1YmxpYyBSdW5BbmFseXNlTVBJQW5hbHlzaXNjb21tYW5kSGFuZGxlcigpeyAKLQkJY2FsbEdyYXBoXyA9IG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEV4ZWN1dGUgdGhlIGFjdGlvbiBmb3IgTVBJIGJhcnJpZXIgYW5hbHlzaXMKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlib29sZWFuIGZvdW5kRXJyb3I9ZmFsc2U7Ci0JCWdldFNlbGVjdGlvbihldmVudCk7Ci0JCUFuYWx5c2lzRHJvcGRvd25IYW5kbGVyLnNldExhc3RIYW5kbGVkQW5hbHlzaXModGhpcyxzZWxlY3Rpb24pOwotCQlpZiAoKHNlbGVjdGlvbiA9PSBudWxsKSB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkJCS5vcGVuV2FybmluZyhudWxsLCAiTm8gZmlsZXMgc2VsZWN0ZWQgZm9yIGFuYWx5c2lzLiIsCi0JCQkJCQkJIlBsZWFzZSBzZWxlY3QgYSBzb3VyY2UgZmlsZSAgb3IgY29udGFpbmVyIChmb2xkZXIgb3IgcHJvamVjdCkgdG8gYW5hbHl6ZS4iKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJY2FsbEdyYXBoXyA9IG5ldyBNUElDYWxsR3JhcGgoKTsKLQkJCS8vaW50IG51bUZpbGVzPXRoaXMuY291bnRGaWxlc1NlbGVjdGVkKCk7Ci0JCQkvLyBCUlQgdXNlIG51bWZpbGVzIGZvciBhIHByb2dyZXNzIG1vbml0b3I/Ci0KLQkJCWZvcihJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IG9iaiA9ICBpdGVyLm5leHQoKTsKLQkJCQkvLyBJdCBjYW4gYmUgYSBQcm9qZWN0LCBGb2xkZXIsIEZpbGUsIGV0Yy4uLgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCWZpbmFsIElSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikKLQkJCQkJCQkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigicmVzb3VyY2VDb2xsZWN0b3Igb24gIityZXMuZ2V0TmFtZSgpKTsKLQkJCQkJLy8gRklYTUUgcHV0IHRoaXMgaW4gYSBydW5uYWJsZSB0byBiYXRjaCByZXNvdXJjZSBjaGFuZ2VzPwotCQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlQ29sbGVjdG9yKHJlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IC8vIGVuZCBmb3IKLQkJCU1QSUFuYWx5c2lzTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1QSUFuYWx5c2lzTWFuYWdlcihjYWxsR3JhcGhfKTsKLQkJCWZvdW5kRXJyb3I9bWFuYWdlci5ydW4oKTsKLQkJfQotCQlWaWV3QWN0aXZhdGVyLmFjdGl2YXRlVmlldyhJRHMubWF0Y2hpbmdTZXRWaWV3SUQpOwotCQlWaWV3QWN0aXZhdGVyLmFjdGl2YXRlVmlldyhJRHMuYmFycmllclZpZXdJRCk7Ci0JCS8vIGlmIGVycm9yIGZvdW5kLCBhc3N1cmUgaXRzIHZpZXcgaGFzIGZvY3VzCi0JCWlmKGZvdW5kRXJyb3IpIHsKLQkJCVZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KElEcy5lcnJvclZpZXdJRCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLyoJLy9Qcm9ncmVzc01vbml0b3JEaWFsb2cgZXhhbXBsZT8KLXB1YmxpYyBPYmplY3QgZXhlY3V0ZTIoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpbnQgbnVtRmlsZXM9dGhpcy5jb3VudEZpbGVzU2VsZWN0ZWQoKTsKLQkJLy8gYmF0Y2ggd3MgbW9kaWZpY2F0aW9ucyAqYW5kKiByZXBvcnQgcHJvZ3Jlc3MKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHdtbyA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWVyciA9IHJ1blJlc291cmNlcyhtb25pdG9yLCBpbmRlbnQsIGluY2x1ZGVzKTsKLQkJCX0KLQkJfTsKLQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQlzaGVsbCk7Ci0JCXRyeSB7Ci0JCQlwbWRpYWxvZy5ydW4odHJ1ZSwgdHJ1ZSwgd21vKTsgLy8gZm9yaz10cnVlOyBpZiBmYWxzZSwgbm90Ci0JCQkJCQkJCQkJCS8vIGNhbmNlbGFibGUKLQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWVyciA9IHRydWU7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHJ1bm5pbmcgYW5hbHlzaXM6IElURTogIgotCQkJCQkrIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBjYXVzZTogIiArIGUuZ2V0Q2F1c2UoKSArICIgLSAiCi0JCQkJCSsgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7Ci0JCQlUaHJvd2FibGUgdGggPSBlLmdldENhdXNlKCk7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJY2FuY2VsbGVkQnlVc2VyID0gdHJ1ZTsKLQkJfQotCX0KLQkqLwotCS8qKgotCSAqIFJ1biBhbmFseXNpcyAoY29sbGVjdCByZXNvdXJjZSBpbmZvIGluIHRoZSBjYWxsIGdyYXBoKSBvbiBhIHJlc291cmNlIChlLmcuIEZpbGUgb3IgRm9sZGVyKSAKLQkgKiA8YnI+V2lsbCBkZXNjZW5kIHRvIG1lbWJlcnMgb2YgZm9sZGVyCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgdXBvbiB3aGljaCBiYXJyaWVyIGFuYWx5c2lzIHdhcyBpbml0aWF0ZWQ6IGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZUNvbGxlY3RvcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotCQlib29sZWFuIGZvdW5kRXJyb3IgPSBmYWxzZTsKLQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdHJ5ewotCQkJCS8vIEJSVCBiYXJyaWVyTWFya2VyIGNoYW5nZSB0byBub24tcHJvYmxlbSBtYXJrZXIgaGVyZT8KLQkJCQlyZXNvdXJjZS5kZWxldGVNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkvL3Jlc291cmNlLmRlbGV0ZU1hcmtlcnMoSURzLmVycm9yTWFya2VySUQsdHJ1ZSxJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSTTogZXhjZXB0aW9uIGRlbGV0aW5nIG1hcmtlcnMuIik7Ci0JCQkJLy9lLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCWlmKGZpbGVuYW1lLmVuZHNXaXRoKCIuYyIpKXsKLQkJCSAgaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oInJlc291cmNlQ29sbGVjdG9yIG9uIGMgZmlsZTogIitmaWxlLmdldE5hbWUoKSk7Ci0JCQkJTVBJUmVzb3VyY2VDb2xsZWN0b3IgcmMgPSBuZXcgTVBJUmVzb3VyY2VDb2xsZWN0b3IoY2FsbEdyYXBoXywgZmlsZSk7IC8vIEJSVCB3aHkgJ25ldycgZWFjaCB0aW1lPwotCQkJCXJjLnJ1bigpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlW10gbWVtcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJICBpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiZGVzY2VuZCB0byAiK21lbXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQkJYm9vbGVhbiBlcnIgPSByZXNvdXJjZUNvbGxlY3RvcihtZW1zW2ldKTsKLQkJCQkJZm91bmRFcnJvciA9IGZvdW5kRXJyb3IgfHwgZXJyOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICIiOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIHJlc291cmNlOwotCQkJCS8vIG5hbWU9cmVzLmdldE5hbWUoKTsgLy8gc2ltcGxlIGZpbGVuYW1lIG9ubHksIG5vIHBhdGggaW5mbwotCQkJCUlQYXRoIHBhdGggPSByZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCW5hbWUgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbmNlbGxlZCBieSBVc2VyLCBhYm9ydGluZyBhbmFseXNpcyBvbiBzdWJzZXF1ZW50IGZpbGVzLi4uICIgKyBuYW1lKTsKLQkJfQotCi0JCXJldHVybiBmb3VuZEVycm9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9CYXJyaWVyQ0ZHLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0JhcnJpZXJDRkcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzN2FhOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0JhcnJpZXJDRkcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuaW1wbC5Db250cm9sRmxvd0dyYXBoOwotCi1wdWJsaWMgY2xhc3MgQmFycmllckNGRyBleHRlbmRzIENvbnRyb2xGbG93R3JhcGggewotCQotCXB1YmxpYyBCYXJyaWVyQ0ZHKElBU1RTdGF0ZW1lbnQgcHJvZyl7Ci0JCXN1cGVyKHByb2cpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0QmxvY2tzKCl7Ci0JCWVudHJ5XyA9IG5ldyBCbG9jaygpOwotCQlleGl0XyA9IG5ldyBCbG9jaygpOwotCQlCYXJyaWVyQ0ZHQmxvY2tDb2xsZWN0b3IgYmMgPSBuZXcgQmFycmllckNGR0Jsb2NrQ29sbGVjdG9yKCk7Ci0JCWJjLnJ1bigpOwotCX0KLQkKLQljbGFzcyBCYXJyaWVyQ0ZHQmxvY2tDb2xsZWN0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQlwcm9nXy5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJCi0JCS8qCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdG10KSAKLQkJewotCQkJSUJsb2NrIGJsb2NrOwotCQkJaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RCcmVha1N0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmFycmllckNGR0Jsb2NrKHN0bXQsIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ2FzZVN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmFycmllckNGR0Jsb2NrKHN0bXQsIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29tcG91bmRTdGF0ZW1lbnQpewotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDb250aW51ZVN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmFycmllckNGR0Jsb2NrKHN0bXQsIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IEJhcnJpZXJDRkdCbG9jayhzdG10LCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERlZmF1bHRTdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IEJhcnJpZXJDRkdCbG9jayhzdG10LCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCYXJyaWVyQ0ZHQmxvY2soc3RtdCwgc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJCXJldHVybiBQUk9DRVNTX1NLSVA7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25TdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IEJhcnJpZXJDRkdCbG9jayhzdG10LCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmFycmllckNGR0Jsb2NrKHN0bXQsIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUR290b1N0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQkJSUFTVElmU3RhdGVtZW50IGlmU3RtdCA9IChJQVNUSWZTdGF0ZW1lbnQpc3RtdDsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhpZlN0bXQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQkJSUJsb2NrIGpvaW4gPSBuZXcgQmxvY2sobnVsbCwgc3RtdCk7Ci0JCQkJYWRkQmxvY2soam9pbik7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVExhYmVsU3RhdGVtZW50KXsKLQkJCQlJQVNUTGFiZWxTdGF0ZW1lbnQgbGFiZWwgPSAoSUFTVExhYmVsU3RhdGVtZW50KXN0bXQ7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2sobGFiZWwuZ2V0TmFtZSgpLCBzdG10LCBCbG9jay5sYWJlbF90eXBlKTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVE51bGxTdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IEJsb2NrKHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUUHJvYmxlbVN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfQotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFJldHVyblN0YXRlbWVudCl7Ci0JCQkJSUFTVFJldHVyblN0YXRlbWVudCBydFN0bXQgPSAoSUFTVFJldHVyblN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IEJsb2NrKHJ0U3RtdC5nZXRSZXR1cm5WYWx1ZSgpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCl7Ci0JCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IEJsb2NrKHN3U3RtdC5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQkJSUJsb2NrIGpvaW4gPSBuZXcgQmxvY2sobnVsbCwgc3RtdCk7Ci0JCQkJYWRkQmxvY2soam9pbik7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0gKi8KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0JhcnJpZXJDRkdCbG9jay5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9CYXJyaWVyQ0ZHQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZjFiZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0JhcnJpZXJDRkdCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQmxvY2s7Ci0KLXB1YmxpYyBjbGFzcyBCYXJyaWVyQ0ZHQmxvY2sgZXh0ZW5kcyBCbG9jayB7Ci0JcHJvdGVjdGVkIEJhcnJpZXJFeHByZXNzaW9uIEJFXzsKLQkKLQlwdWJsaWMgQmFycmllckNGR0Jsb2NrKElBU1ROb2RlIGNvbnRlbnQsIElBU1RTdGF0ZW1lbnQgcGFyZW50LCBpbnQgdHlwZSl7Ci0JCXN1cGVyKGNvbnRlbnQsIHBhcmVudCwgdHlwZSk7Ci0JCUJFXyA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBCYXJyaWVyRXhwcmVzc2lvbiBnZXRCRSgpe3JldHVybiBCRV87fQotCXB1YmxpYyB2b2lkIHNldEJFKEJhcnJpZXJFeHByZXNzaW9uIGJlKSB7QkVfID0gYmU7fQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9CYXJyaWVyRXhwcmVzc2lvbi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9CYXJyaWVyRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjAzYzQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvQmFycmllckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBCYXJyaWVyRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIEJhcnJpZXJFeHByZXNzaW9uT1Agb3BfOwotCXByb3RlY3RlZCBCYXJyaWVyRXhwcmVzc2lvbiBvcGVyYW5kMV87Ci0JcHJvdGVjdGVkIEJhcnJpZXJFeHByZXNzaW9uIG9wZXJhbmQyXzsKLQkKLQlwcm90ZWN0ZWQgaW50IGxlbmd0aDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1AgPSAtMzsKLQkKLQkvKiBGb3IgaW5zdHJ1bWVudGF0aW9uICovCi0JcHVibGljIHN0YXRpYyBpbnQgY291bnRfYnJhbmNoID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBjb3VudF9yZXBlYXQgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IGNvdW50X25vZGUgPSAwOwotCQotCWJvb2xlYW4gdmlzaXRlZDsKLQlib29sZWFuIGNlVmlzaXRlZDsgLy8gdmlzaXRlZCBpbiBjb3VudGVyIGV4YW1wbGUgY29uc3RydWN0aW9uCi0JCi0JLyogVGhlcmUgYXJlIGZvdXIgdGVybWluYWxzOiAKLQkgKiBiYXJyaWVyIGlkKGludCA+IDApCi0JICogZnVuY3Rpb24gbmFtZSAoU3RyaW5nKQotCSAqIFx0b3AgLS0gdW5kZWNpZGFibGUKLQkgKiBcYm90IC0tIG5vIGJhcnJpZXIKLQkgKi8gIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFX2JvdCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVfSUQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFX2Z1bmMgPSAzOwotCXByb3RlY3RlZCBpbnQgdHlwZTsKLQkKLQlwcm90ZWN0ZWQgaW50IGJhcnJpZXJJRDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bmNOYW1lXzsgCi0JCi0JcHJvdGVjdGVkIEJhcnJpZXJFeHByZXNzaW9uIHBhcmVudF87Ci0JCi0JLyogSGFzIHRoZSBtaXNtYXRjaGluZyBlcnJvciBhbHJlYWR5IHJlcG9ydGVkPyAqLwotCXByb3RlY3RlZCBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCi0JcHVibGljIEJhcnJpZXJFeHByZXNzaW9uKCl7Ci0JCWluaXQoKTsKLQl9Ci0JCi0JcHVibGljIEJhcnJpZXJFeHByZXNzaW9uKGludCBvcGVyYXRvciwgSUFTVEV4cHJlc3Npb24gY29uZCwgCi0JCQlJQVNUU3RhdGVtZW50IHN0bXQpewotCQlpbml0KCk7Ci0JCW9wXyA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbk9QKG9wZXJhdG9yLCBjb25kLCBzdG10KTsKLQkJaWYob3BfLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpCi0JCQljb3VudF9icmFuY2ggKys7Ci0JCWVsc2UgaWYob3BfLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9yZXBlYXQpCi0JCQljb3VudF9yZXBlYXQgKys7Ci0JfQotCQotCXB1YmxpYyBCYXJyaWVyRXhwcmVzc2lvbihTdHJpbmcgZnVuYyl7Ci0JCWluaXQoKTsKLQkJdHlwZSA9IEJFX2Z1bmM7Ci0JCWZ1bmNOYW1lXyA9IGZ1bmM7Ci0JCWNvdW50X25vZGUgKys7Ci0JfQotCQotCXB1YmxpYyBCYXJyaWVyRXhwcmVzc2lvbihpbnQgaWQpewotCQlpbml0KCk7Ci0JCWlmKGlkID09IEJFX2JvdCkgdHlwZSA9IGlkOwotCQllbHNlIHsKLQkJCXR5cGUgPSBCRV9JRDsKLQkJCWJhcnJpZXJJRCA9IGlkOwotCQl9Ci0JCWNvdW50X25vZGUgKys7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBpbml0KCl7Ci0JCW9wXyA9IG51bGw7Ci0JCW9wZXJhbmQxXyA9IG51bGw7Ci0JCW9wZXJhbmQyXyA9IG51bGw7Ci0JCWxlbmd0aCA9IC0xOwotCQl0eXBlID0gLTE7Ci0JCWJhcnJpZXJJRCA9IDA7Ci0JCWZ1bmNOYW1lXyA9IG51bGw7Ci0JCXBhcmVudF8gPSBudWxsOwotCQl2aXNpdGVkID0gZmFsc2U7Ci0JCWNlVmlzaXRlZCA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPcGVyYW5kMShCYXJyaWVyRXhwcmVzc2lvbiBvcDEpewotCQlvcDEuc2V0UGFyZW50KHRoaXMpOwotCQlvcGVyYW5kMV8gPSBvcDE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wZXJhbmQyKEJhcnJpZXJFeHByZXNzaW9uIG9wMil7Ci0JCW9wMi5zZXRQYXJlbnQodGhpcyk7Ci0JCW9wZXJhbmQyXyA9IG9wMjsKLQl9Ci0JCi0JcHVibGljIEJhcnJpZXJFeHByZXNzaW9uIGdldE9QMSgpe3JldHVybiBvcGVyYW5kMV87fQotCXB1YmxpYyBCYXJyaWVyRXhwcmVzc2lvbiBnZXRPUDIoKXtyZXR1cm4gb3BlcmFuZDJfO30KLQlwdWJsaWMgQmFycmllckV4cHJlc3Npb24gZ2V0UGFyZW50KCl7cmV0dXJuIHBhcmVudF87fQotCQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkge3JldHVybiBsZW5ndGg7fQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbCl7bGVuZ3RoID0gbDt9IAotCQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChCYXJyaWVyRXhwcmVzc2lvbiBwYXJlbnQpewotCQl0aGlzLnBhcmVudF8gPSBwYXJlbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQm90KCkge3JldHVybiB0eXBlID09IEJFX2JvdDt9Ci0JcHVibGljIGJvb2xlYW4gaXNCYXJyaWVyKCkge3JldHVybiB0eXBlID09IEJFX0lEO30KLQlwdWJsaWMgYm9vbGVhbiBpc0Z1bmMoKSB7cmV0dXJuIHR5cGUgPT0gQkVfZnVuYzt9Ci0JCi0JcHVibGljIEJhcnJpZXJFeHByZXNzaW9uT1AgZ2V0T1AoKXtyZXR1cm4gb3BfO30KLQlwdWJsaWMgaW50IGdldEJhcnJpZXJJRCgpIHtyZXR1cm4gYmFycmllcklEO30KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmNOYW1lKCkge3JldHVybiBmdW5jTmFtZV87fQotCQotCXB1YmxpYyB2b2lkIHNldEVycm9yRmxhZyhib29sZWFuIHZhbCkge2Vycm9yID0gdmFsO30KLQlwdWJsaWMgYm9vbGVhbiBnZXRFcnJvckZsYWcoKSB7cmV0dXJuIGVycm9yO30KLQkKLQkvKgotCSAqIEByZXR1cm46IEJFID0gQkUxLkJFMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmFycmllckV4cHJlc3Npb24gY29uY2F0QkUoQmFycmllckV4cHJlc3Npb24gQkUxLCBCYXJyaWVyRXhwcmVzc2lvbiBCRTIpewotCQlCYXJyaWVyRXhwcmVzc2lvbiBiZSA9IG51bGw7Ci0JCWlmKEJFMS5pc0JvdCgpKXsKLQkJCWJlID0gQkUyOwotCQl9IGVsc2UgaWYoQkUyLmlzQm90KCkpewotCQkJYmUgPSBCRTE7Ci0JCX0gZWxzZXsKLQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfY29uY2F0LCBudWxsLCBudWxsKTsKLQkJCWJlLnNldE9wZXJhbmQxKEJFMSk7Ci0JCQliZS5zZXRPcGVyYW5kMihCRTIpOwotCQl9IAotCQlyZXR1cm4gYmU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQmFycmllckV4cHJlc3Npb24gY29uY2F0QkUoQmFycmllckV4cHJlc3Npb24gQkUxLCAKLQkJCQkJCQkJCQkJIEJhcnJpZXJFeHByZXNzaW9uIEJFMiwKLQkJCQkJCQkJCQkJIEJhcnJpZXJFeHByZXNzaW9uIEJFMyl7Ci0JCXJldHVybiBjb25jYXRCRShjb25jYXRCRShCRTEsIEJFMiksIEJFMyk7Ci0JfQotCi0JLyoKLQkgKiBAcmV0dXJuOiBCRScgPSBCRSoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJhcnJpZXJFeHByZXNzaW9uIHJlcGVhdEJFKEJhcnJpZXJFeHByZXNzaW9uIEJFLCAKLQkJCUlBU1RFeHByZXNzaW9uIGNvbmQsIElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIGJlID0gbnVsbDsKLQkJaWYoQkUuaXNCb3QoKSl7Ci0JCQliZSA9IEJFOwotCQl9IGVsc2UgewotCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oCi0JCQkJCUJhcnJpZXJFeHByZXNzaW9uT1Aub3BfcmVwZWF0LCBjb25kLCBzdG10KTsKLQkJCWJlLnNldE9wZXJhbmQxKEJFKTsKLQkJfQotCQlyZXR1cm4gYmU7Ci0JfQotCQotCS8qCi0JICogQHJldHVybjogQkUgPSBCRTEgfCBCRTIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJhcnJpZXJFeHByZXNzaW9uIGJyYW5jaEJFKEJhcnJpZXJFeHByZXNzaW9uIEJFMSwgCi0JCQkJCQkJCQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBCRTIsIAotCQkJCQkJCQkJCQkJSUFTVEV4cHJlc3Npb24gY29uZCwgCi0JCQkJCQkJCQkJCQlJQVNUU3RhdGVtZW50IHN0bXQpewotCQlCYXJyaWVyRXhwcmVzc2lvbiBiZSA9IG51bGw7Ci0JCWlmKEJFMS5pc0JvdCgpICYmIEJFMi5pc0JvdCgpKXsKLQkJCWJlID0gQkUyOwotCQl9IGVsc2V7Ci0JCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbigKLQkJCQkJQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gsIGNvbmQsIHN0bXQpOwotCQkJYmUuc2V0T3BlcmFuZDEoQkUxKTsKLQkJCWJlLnNldE9wZXJhbmQyKEJFMik7Ci0JCX0KLQkJcmV0dXJuIGJlOwkJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHByZXR0eVByaW50ZXIoKXsKLQkJaWYob3BfICE9IG51bGwgJiYgb3BfLm9wZXJhdG9yID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfY29uY2F0KXsKLQkJCXJldHVybiBvcGVyYW5kMV8ucHJldHR5UHJpbnRlcigpICsgIi4iICsgb3BlcmFuZDJfLnByZXR0eVByaW50ZXIoKTsKLQkJfSBlbHNlIGlmKG9wXyAhPSBudWxsICYmIG9wXy5vcGVyYXRvciA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX3JlcGVhdCl7Ci0JCQlyZXR1cm4gIigiICsgb3BlcmFuZDFfLnByZXR0eVByaW50ZXIoKSArICIpKiI7Ci0JCX0gZWxzZSBpZihvcF8gIT0gbnVsbCAmJiBvcF8ub3BlcmF0b3IgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpewotCQkJcmV0dXJuICIoKCIgKyBvcGVyYW5kMV8ucHJldHR5UHJpbnRlcigpICsgIikgfCAoIiArIG9wZXJhbmQyXy5wcmV0dHlQcmludGVyKCkgKyAiKSkiOwotCQl9IGVsc2UgaWYodHlwZSA9PSBCRV9JRCl7Ci0JCQlJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcihiYXJyaWVySUQpOwotCQkJcmV0dXJuIGkudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmKHR5cGUgPT0gQkVfZnVuYyl7Ci0JCQlyZXR1cm4gZnVuY05hbWVfOwotCQl9IGVsc2UgaWYodHlwZSA9PSBCRV9ib3QpewotCQkJcmV0dXJuICIoXGJvdCkiOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEJhcnJpZXIgRXhwcmVzc2lvbiBPcGVyYXRvcgotCSAqLwotCXB1YmxpYyBjbGFzcyBCYXJyaWVyRXhwcmVzc2lvbk9QCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcF9jb25jYXQgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcF9yZXBlYXQgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcF9icmFuY2ggPSAzOwotCQlwcml2YXRlIGludCBvcGVyYXRvcjsKLQkJcHJpdmF0ZSBJQVNURXhwcmVzc2lvbiBjb25kaXRpb25fOwotCQlwcml2YXRlIElBU1RTdGF0ZW1lbnQgY29uZFN0bXRfOwotCQkKLQkJcHVibGljIEJhcnJpZXJFeHByZXNzaW9uT1AoKXsKLQkJCW9wZXJhdG9yID0gMDsKLQkJCWNvbmRpdGlvbl8gPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgQmFycmllckV4cHJlc3Npb25PUChpbnQgb3AsIElBU1RFeHByZXNzaW9uIGNvbmQsIElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCQlvcGVyYXRvciA9IG9wOwotCQkJY29uZGl0aW9uXyA9IGNvbmQ7Ci0JCQljb25kU3RtdF8gPSBzdG10OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB3aXRoQ29uZGl0aW9uKCl7IAotCQkJcmV0dXJuIG9wZXJhdG9yID09IG9wX2JyYW5jaCB8IG9wZXJhdG9yID09IG9wX3JlcGVhdCA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7cmV0dXJuIG9wZXJhdG9yO30KLQkJcHVibGljIElBU1RFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHtyZXR1cm4gY29uZGl0aW9uXzt9Ci0JCXB1YmxpYyBJQVNUU3RhdGVtZW50IGdldFN0YXRlbWVudCgpIHtyZXR1cm4gY29uZFN0bXRfO30KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvQmFycmllclRhYmxlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0JhcnJpZXJUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdiZWRmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvQmFycmllclRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGaWxlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTGl0ZXJhbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuU291cmNlSW5mbzsKLQotcHVibGljIGNsYXNzIEJhcnJpZXJUYWJsZSB7Ci0JLyoqIAotCSAqIFNldCBvZiBiYXJyaWVycyBmb3IgYSBjb21tdW5pY2F0b3IuCi0JICogS2V5OiA8U3RyaW5nPmNvbW11bmljYXRvciwgVmFsdWU6IHNldCBvZiA8QmFycmllckluZm8+YmFycmllcnMgCi0JICovCi0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxCYXJyaWVySW5mbz4+IHRhYmxlXzsgCi0JcHJvdGVjdGVkIGludCBjb21tQ291bnRlciA9IDA7Ci0JCi0JcHVibGljIEJhcnJpZXJUYWJsZSgpewotCQl0YWJsZV8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxMaXN0PEJhcnJpZXJJbmZvPj4oKTsKLQl9Ci0JCi0JcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxCYXJyaWVySW5mbz4+IGdldFRhYmxlKCl7Ci0JCXJldHVybiB0YWJsZV87Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7cmV0dXJuIHRhYmxlXy5pc0VtcHR5KCk7fQotCQotCXB1YmxpYyBCYXJyaWVySW5mbyBhZGRCYXJyaWVyKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGJhckUsIAotCQkJaW50IGlkLCBJUmVzb3VyY2UgcmVzLCBTdHJpbmcgZnVuYyl7Ci0JCUJhcnJpZXJJbmZvIGJhciA9IG5ldyBCYXJyaWVySW5mbyhiYXJFLCBpZCwgcmVzLCBmdW5jKTsKLQkJaWYodGFibGVfLmNvbnRhaW5zS2V5KGJhci5nZXRDb21tKCkpKXsKLQkJCUxpc3Q8QmFycmllckluZm8+IGxpc3QgPSB0YWJsZV8uZ2V0KGJhci5nZXRDb21tKCkpOwotCQkJbGlzdC5hZGQoYmFyKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8QmFycmllckluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEJhcnJpZXJJbmZvPigpOwotCQkJbGlzdC5hZGQoYmFyKTsKLQkJCXRhYmxlXy5wdXQoYmFyLmdldENvbW0oKSwgbGlzdCk7Ci0JCX0KLQkJcmV0dXJuIGJhcjsKLQl9Ci0JCi0JLyoKLQkgKiBAcmV0dXJuOiBiYXJyaWVyIElEIGlmIGl0IGlzIGEgYmFycmllcjsgLTEgb3RoZXJ3aXNlCi0JICovIAotCXB1YmxpYyBpbnQgaXNCYXJyaWVyKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZ1bmNFKXsKLQkJSUFTVEV4cHJlc3Npb24gZnVuY25hbWUgPSBmdW5jRS5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCk7Ci0JCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJaWYoIXNpZ25hdHVyZS5lcXVhbHMoIk1QSV9CYXJyaWVyIikpIHJldHVybiAtMTsKLQkJZm9yKEVudW1lcmF0aW9uIGUgPSB0YWJsZV8uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KWUubmV4dEVsZW1lbnQoKTsKLQkJCWZvcihJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCUJhcnJpZXJJbmZvIGJhciA9IChCYXJyaWVySW5mbylpLm5leHQoKTsKLQkJCQlpZihiYXIuZ2V0RnVuYygpID09IGZ1bmNFKQotCQkJCQlyZXR1cm4gYmFyLmdldElEKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbShpbnQgaWQpewotCQlmb3IoRW51bWVyYXRpb24gZSA9IHRhYmxlXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IChBcnJheUxpc3QpZS5uZXh0RWxlbWVudCgpOwotCQkJZm9yKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJQmFycmllckluZm8gYmFyID0gKEJhcnJpZXJJbmZvKWkubmV4dCgpOwotCQkJCWlmKGJhci5nZXRJRCgpID09IGlkKQotCQkJCQlyZXR1cm4gYmFyLmdldENvbW0oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEJhcnJpZXJJbmZvIHNlYXJjaEJhcnJpZXJieUlEKGludCBpZCl7Ci0JCWZvcihFbnVtZXJhdGlvbiBlID0gdGFibGVfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCllLm5leHRFbGVtZW50KCk7Ci0JCQlmb3IoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlCYXJyaWVySW5mbyBiYXIgPSAoQmFycmllckluZm8paS5uZXh0KCk7Ci0JCQkJaWYoYmFyLmdldElEKCkgPT0gaWQpCi0JCQkJCXJldHVybiBiYXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCQotCXB1YmxpYyBjbGFzcyBCYXJyaWVySW5mb3sKLQkJcHJvdGVjdGVkIFN0cmluZyBjb21tXyA9IG51bGw7Ci0JCXByb3RlY3RlZCBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBiYXJyaWVyXyA9IG51bGw7Ci0JCXByb3RlY3RlZCBpbnQgaWQgPSAtMTsKLQkJcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZV8gPSBudWxsOwotCQlwcm90ZWN0ZWQgU291cmNlSW5mbyBzb3VyY2VJbmZvXyA9IG51bGw7Ci0JCXByb3RlY3RlZCBMaXN0PEJhcnJpZXJJbmZvPiBtYXRjaGluZ1NldF8gPSBudWxsOwotCQlwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlXyA9IG51bGw7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZW5jbG9zaW5nRnVuY18gPSBudWxsOwotCQkKLQkJcHVibGljIEJhcnJpZXJJbmZvKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZ1bmNFLCBpbnQgaWQsIElSZXNvdXJjZSByZXMsIFN0cmluZyBmdW5jKXsKLQkJCWJhcnJpZXJfID0gZnVuY0U7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCQlzZXRDb21tKCk7Ci0JCQlzZXRTb3VyY2VJbmZvKCk7Ci0JCQltYXRjaGluZ1NldF8gPSBuZXcgQXJyYXlMaXN0PEJhcnJpZXJJbmZvPigpOwotCQkJcmVzb3VyY2VfID0gcmVzOwotCQkJZW5jbG9zaW5nRnVuY18gPSBmdW5jOwotCQl9Ci0JCQotCQkvKioKLQkJICogRGV0ZXJtaW5lIHRoZSBjb21tdW5pY2F0b3IgZnJvbSB0aGUgdGhlIGJhcnJpZXIgZnVuY3Rpb24gY2FsbAotCQkgKiAoIk1QSV9CYXJyaWVyKGNvbW11bmljYXRvcikiKS4gPGJyPgotCQkgKiBJZiB0aGUgY29tbXVuaWNhdG9yIGlzIHRoZSBkZWZhdWx0IChNUElfQ09NTV9XT1JMRCksIHRoZW4gdGhlIHR5cGUgb2YKLQkJICogdGhlIHJldHVybmVkIG9iamVjdCBmcm9tIGdldE9wZXJhbmQoKSBkZXBlbmRzIG9uIGhvdyB0aGUgaGVhZGVyIGZpbGUKLQkJICogZGVmaW5lcyBpdCAoSW4gd2luZG93cywgaXQgaXMgSUFTVExpdGVyYWxFeHByZXNzaW9uLCBhbmQgaW4gTGludXgsIGl0Ci0JCSAqIGJlY29tZXMgSUFTVElkRXhwcmVzc2lvbikuIFNvIHdlIGFjY291bnQgZm9yIHRoYXQgaGVyZS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldENvbW0oKSB7IAotCQkJSUFTVEV4cHJlc3Npb24gcGFyYW1ldGVyID0gYmFycmllcl8uZ2V0UGFyYW1ldGVyRXhwcmVzc2lvbigpOwotCi0JCQlpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgSUFTVFVuYXJ5RXhwcmVzc2lvbikgewotCQkJCUlBU1RVbmFyeUV4cHJlc3Npb24gY29tbUV4cHIgPSAoSUFTVFVuYXJ5RXhwcmVzc2lvbikgcGFyYW1ldGVyOwotCQkJCWlmIChjb21tRXhwci5nZXRPcGVyYW5kKCkgaW5zdGFuY2VvZiBJQVNUVW5hcnlFeHByZXNzaW9uKSB7Ci0JCQkJCUlBU1RVbmFyeUV4cHJlc3Npb24gY29tbU9wcmQgPSAoSUFTVFVuYXJ5RXhwcmVzc2lvbikgY29tbUV4cHIKLQkJCQkJCQkuZ2V0T3BlcmFuZCgpOwotCQkJCQlpZiAoY29tbU9wcmQuZ2V0T3BlcmFuZCgpIGluc3RhbmNlb2YgSUFTVExpdGVyYWxFeHByZXNzaW9uKSB7Ci0JCQkJCQlJQVNUTGl0ZXJhbEV4cHJlc3Npb24gY29tbSA9IChJQVNUTGl0ZXJhbEV4cHJlc3Npb24pIGNvbW1PcHJkLmdldE9wZXJhbmQoKTsKLQkJCQkJCWNvbW1fID0gY29tbS50b1N0cmluZygpOwotCQkJCQl9IGVsc2UgaWYgKGNvbW1PcHJkLmdldE9wZXJhbmQoKSBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLQkJCQkJCUlBU1RJZEV4cHJlc3Npb24gY29tbSA9IChJQVNUSWRFeHByZXNzaW9uKSBjb21tT3ByZC5nZXRPcGVyYW5kKCk7Ci0JCQkJCQljb21tXyA9IGNvbW0uZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0gZWxzZSBpZiAoY29tbU9wcmQuZ2V0T3BlcmFuZCgpIGluc3RhbmNlb2YgSUFTVE5hbWUpIHsKLQkJCQkJCWNvbW1fID0gY29tbU9wcmQuZ2V0T3BlcmFuZCgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb21tXyA9ICJDT01NXyIgKyBjb21tQ291bnRlcjsKLQkJCQkJCWNvbW1Db3VudGVyKys7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljb21tXyA9ICJDT01NXyIgKyBjb21tQ291bnRlcjsKLQkJCQkJY29tbUNvdW50ZXIrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBhcmFtZXRlciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLQkJCQlJQVNUSWRFeHByZXNzaW9uIGlkRSA9IChJQVNUSWRFeHByZXNzaW9uKSBwYXJhbWV0ZXI7Ci0JCQkJY29tbV8gPSBpZEUuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKCFjb21tXy5lcXVhbHMoIk1QSV9DT01NX1dPUkxEIikpIHsKLQkJCQkJY29tbV8gPSAiQ09NTV8iICsgY29tbUNvdW50ZXI7Ci0JCQkJCWNvbW1Db3VudGVyKys7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb21tXyA9ICJDT01NXyIgKyBjb21tQ291bnRlcjsKLQkJCQljb21tQ291bnRlcisrOwotCQkJfQotCQl9Ci0JCi0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VJbmZvKCkgewotCQkJSUFTVEV4cHJlc3Npb24gZnVuY05hbWVFID0gYmFycmllcl8uZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJSUFTVE5vZGVMb2NhdGlvbltdIGxvY2F0aW9ucyA9IGZ1bmNOYW1lRS5nZXROb2RlTG9jYXRpb25zKCk7Ci0JCQlpZiAobG9jYXRpb25zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJSUFTVEZpbGVMb2NhdGlvbiBhc3RGaWxlTG9jYXRpb24gPSBudWxsOwotCQkJCWlmIChsb2NhdGlvbnNbMF0gaW5zdGFuY2VvZiBJQVNURmlsZUxvY2F0aW9uKSB7Ci0JCQkJCWFzdEZpbGVMb2NhdGlvbiA9IChJQVNURmlsZUxvY2F0aW9uKSBsb2NhdGlvbnNbMF07Ci0JCQkJCWZpbGVOYW1lXyA9IGFzdEZpbGVMb2NhdGlvbi5nZXRGaWxlTmFtZSgpOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihmaWxlTmFtZV8pOwotCQkJCQlzb3VyY2VJbmZvXyA9IG5ldyBTb3VyY2VJbmZvKCk7Ci0JCQkJCXNvdXJjZUluZm9fLnNldFN0YXJ0aW5nTGluZShhc3RGaWxlTG9jYXRpb24uZ2V0U3RhcnRpbmdMaW5lTnVtYmVyKCkpOwotCQkJCQlzb3VyY2VJbmZvXy5zZXRTdGFydChhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZU9mZnNldCgpKTsKLQkJCQkJc291cmNlSW5mb18uc2V0RW5kKGFzdEZpbGVMb2NhdGlvbi5nZXROb2RlT2Zmc2V0KCkgKyBhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZUxlbmd0aCgpKTsKLQkJCQkJc291cmNlSW5mb18uc2V0Q29uc3RydWN0VHlwZShBcnRpZmFjdC5GVU5DVElPTl9DQUxMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbSgpIHtyZXR1cm4gY29tbV87fQotCQlwdWJsaWMgSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZ2V0RnVuYygpIHtyZXR1cm4gYmFycmllcl87fQotCQlwdWJsaWMgaW50IGdldElEKCkge3JldHVybiBpZDt9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7cmV0dXJuIGZpbGVOYW1lXzt9Ci0JCXB1YmxpYyBTb3VyY2VJbmZvIGdldFNvdXJjZUluZm8oKSB7cmV0dXJuIHNvdXJjZUluZm9fO30KLQkJcHVibGljIExpc3Q8QmFycmllckluZm8+IGdldE1hdGNoaW5nU2V0KCkge3JldHVybiBtYXRjaGluZ1NldF87fQotCQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkge3JldHVybiByZXNvdXJjZV87fQotCQlwdWJsaWMgU3RyaW5nIGdldEVuY2xvc2luZ0Z1bmMoKSB7cmV0dXJuIGVuY2xvc2luZ0Z1bmNfO30KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0dvdG9FbGltaW5hdG9yLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL0dvdG9FbGltaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTU3OWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9Hb3RvRWxpbWluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RCaW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEJyZWFrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENhc2VTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQ29tcG91bmRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURGVjbFNwZWNpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERvU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEdvdG9TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUSWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVElmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEluaXRpYWxpemVyRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RMYWJlbFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RMaXRlcmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU2ltcGxlRGVjbFNwZWNpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTaW1wbGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3dpdGNoU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFVuYXJ5RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RXaGlsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVEJpbmFyeUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1RCcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVENvbXBvdW5kU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuYy5DQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1REb1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1RGb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1RJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1RJZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVEluaXRpYWxpemVyRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVExpdGVyYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuYy5DQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVFNpbXBsZURlY2xTcGVjaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1RTaW1wbGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVFN3aXRjaFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVFVuYXJ5RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVFdoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBHb3RvRWxpbWluYXRvcnsKLQotCXByaXZhdGUgSUNhbGxHcmFwaCBjZ187Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0IGdvdG9MaXN0XzsKLQlwcml2YXRlIExpbmtlZExpc3QgbGFiZWxMaXN0XzsKLQkKLQlwcml2YXRlIElDYWxsR3JhcGhOb2RlIGN1cnJlbnROb2RlXzsKLQkKLQlwcml2YXRlIGludCBzd2l0Y2hfY291bnQgPSAwOwotCQotCXB1YmxpYyBHb3RvRWxpbWluYXRvcihJQ2FsbEdyYXBoIGNnKXsKLQkJY2dfID0gY2c7Ci0JCWdvdG9MaXN0XyA9IG51bGw7Ci0JCWxhYmVsTGlzdF8gPSBudWxsOwotCQljdXJyZW50Tm9kZV8gPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJZm9yKElDYWxsR3JhcGhOb2RlIG5vZGUgPSBjZ18uYm90RW50cnkoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5ib3ROZXh0KCkpewotCQkJY3VycmVudE5vZGVfID0gbm9kZTsKLQkJCW5vcm1hbGl6ZUNvbXBvdW5kU3RtdChub2RlLmdldEZ1bmNEZWYoKS5nZXRCb2R5KCkpOwotCQkJR290b0xhYmVsQ29sbGVjdG9yIGdsYyA9IG5ldyBHb3RvTGFiZWxDb2xsZWN0b3Iobm9kZSk7Ci0JCQlnb3RvTGlzdF8gPSBnbGMuZ2V0R290b0xpc3QoKTsKLQkJCWxhYmVsTGlzdF8gPSBnbGMuZ2V0TGFiZWxMaXN0KCk7Ci0JCQlpZihnb3RvTGlzdF8uc2l6ZSgpID09IDApIGNvbnRpbnVlOwotCQkJCi0JCQlnb3RvUHJlcHJvY2Vzc2luZygpOwotCQkJbGFiZWxQcmVwcm9jZXNzaW5nKCk7Ci0JCQl3aGlsZShnb3RvTGlzdF8uc2l6ZSgpID4gMCl7Ci0JCQkJSUFTVEdvdG9TdGF0ZW1lbnQgZ290b1MgPSAoSUFTVEdvdG9TdGF0ZW1lbnQpZ290b0xpc3RfLnJlbW92ZSgpOwotCQkJCUlBU1RMYWJlbFN0YXRlbWVudCBsYWJlbCA9IGZpbmRMYWJlbChnb3RvUyk7Ci0JCQkJaWYobGFiZWwgPT0gbnVsbCl7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW1wdHkgZ290byBsYWJlbCEiKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCXdoaWxlKCFpc0RpcmVjdGVkUmVsYXRlZChnb3RvUywgbGFiZWwpICYmICFpc1NpYmxpbmcoZ290b1MsIGxhYmVsKSl7Ci0JCQkJCW1vdmVPdXR3YXJkKGdvdG9TKTsKLQkJCQl9Ci0JCQkJaWYoaXNEaXJlY3RlZFJlbGF0ZWQoZ290b1MsIGxhYmVsKSl7Ci0JCQkJCWlmKExldmVsKGdvdG9TKSA+IExldmVsKGxhYmVsKSl7Ci0JCQkJCQl3aGlsZShMZXZlbChnb3RvUykgPiBMZXZlbChsYWJlbCkpCi0JCQkJCQkJbW92ZU91dHdhcmQoZ290b1MpOwotCQkJCQl9Ci0JCQkJCWVsc2V7Ci0JCQkJCQl3aGlsZSghT2Zmc2V0KGdvdG9TLCBsYWJlbCkpCi0JCQkJCQkJbGlmdGluZyhnb3RvUyk7Ci0JCQkJCQl3aGlsZShMZXZlbChnb3RvUykgPCBMZXZlbChsYWJlbCkpCi0JCQkJCQkJbW92ZUlud2FyZChnb3RvUyk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCQotCQkJCWVsaW1pbmF0aW5nR290byhnb3RvUyk7Ci0JCQl9Ci0JCQkKLQkJCXdoaWxlKGxhYmVsTGlzdF8uc2l6ZSgpID4gMCl7Ci0JCQkJSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsID0gKElBU1RMYWJlbFN0YXRlbWVudClsYWJlbExpc3RfLnJlbW92ZSgpOwotCQkJCWVsaW1pbmF0aW5nU3RhdGVtZW50KGxhYmVsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbGFiZWxQcmVwcm9jZXNzaW5nKCl7Ci0JCWZvcihMaXN0SXRlcmF0b3IgbGkgPSBsYWJlbExpc3RfLmxpc3RJdGVyYXRvcigpOyBsaS5oYXNOZXh0KCk7KXsKLQkJCUlBU1RMYWJlbFN0YXRlbWVudCBsYWJlbCA9IChJQVNUTGFiZWxTdGF0ZW1lbnQpbGkubmV4dCgpOwotCQkJSUFTVE5hbWUgbGFiZWxuYW1lID0gbGFiZWwuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGxhYmVsdmFyID0gImdvdG9fIiArIGxhYmVsbmFtZS50b1N0cmluZygpOwotCQkJY3JlYXRlRGVjbGFyYXRpb24obGFiZWx2YXIpOwotCQkJc2V0TGFiZWxWYXJpYWJsZShsYWJlbHZhciwgbGFiZWwpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnb3RvUHJlcHJvY2Vzc2luZygpewotCQlmb3IoTGlzdEl0ZXJhdG9yIGxpID0gZ290b0xpc3RfLmxpc3RJdGVyYXRvcigpOyBsaS5oYXNOZXh0KCk7KXsKLQkJCUlBU1RHb3RvU3RhdGVtZW50IGdvdG9TID0gKElBU1RHb3RvU3RhdGVtZW50KWxpLm5leHQoKTsKLQkJCWlmKCEoZ290b1MuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpKXsKLQkJCQlJQVNUTGl0ZXJhbEV4cHJlc3Npb24gY29uZEUgPSBuZXcgQ0FTVExpdGVyYWxFeHByZXNzaW9uKCk7Ci0JCQkJY29uZEUuc2V0VmFsdWUoInRydWUiKTsKLQkJCQkKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZTID0gbmV3IENBU1RJZlN0YXRlbWVudCgpOwotCQkJCWlmUy5zZXRDb25kaXRpb25FeHByZXNzaW9uKGNvbmRFKTsKLQkJCQljb25kRS5zZXRQYXJlbnQoaWZTKTsKLQkJCQlpZlMuc2V0VGhlbkNsYXVzZShnb3RvUyk7Ci0JCQkJaWZTLnNldEVsc2VDbGF1c2UobnVsbCk7Ci0JCQkJZ290b1Muc2V0UGFyZW50KGlmUyk7Ci0JCQkJCi0JCQkJcmVwbGFjZVN0YXRlbWVudChnb3RvUywgaWZTKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVjbGFyYXRpb24oU3RyaW5nIHZhcil7Ci0JCUlBU1RTaW1wbGVEZWNsYXJhdGlvbiBkZWNsID0gbmV3IENBU1RTaW1wbGVEZWNsYXJhdGlvbigpOwotCQkKLQkgICAgSUFTVFNpbXBsZURlY2xTcGVjaWZpZXIgZGVjbFNwZWMgPSBuZXcgQ0FTVFNpbXBsZURlY2xTcGVjaWZpZXIoKTsKLSAgICAgICAgZGVjbFNwZWMuc2V0Q29uc3QoZmFsc2UpOwotICAgICAgICBkZWNsU3BlYy5zZXRWb2xhdGlsZShmYWxzZSk7Ci0gICAgICAgIGRlY2xTcGVjLnNldElubGluZShmYWxzZSk7Ci0gICAgICAgIGRlY2xTcGVjLnNldFN0b3JhZ2VDbGFzcyhJQVNURGVjbFNwZWNpZmllci5zY191bnNwZWNpZmllZCk7Ci0gICAgICAgIGRlY2xTcGVjLnNldFR5cGUoSUFTVFNpbXBsZURlY2xTcGVjaWZpZXIudF9pbnQpOwotICAgICAgICBkZWNsU3BlYy5zZXRMb25nKGZhbHNlKTsKLSAgICAgICAgZGVjbFNwZWMuc2V0VW5zaWduZWQoZmFsc2UpOwotICAgICAgICBkZWNsU3BlYy5zZXRTaWduZWQodHJ1ZSk7Ci0gICAgICAgIGRlY2xTcGVjLnNldFNob3J0KGZhbHNlKTsKLQkgICAgCi0JICAgIGRlY2wuc2V0RGVjbFNwZWNpZmllcihkZWNsU3BlYyk7Ci0JICAgIGRlY2xTcGVjLnNldFBhcmVudChkZWNsKTsKLQkgICAgZGVjbFNwZWMuc2V0UHJvcGVydHlJblBhcmVudChJQVNUU2ltcGxlRGVjbGFyYXRpb24uREVDTF9TUEVDSUZJRVIpOwotCSAgICBJQVNURGVjbGFyYXRvciBbXSBkZWNsYXJhdG9ycyA9IG5ldyBJQVNURGVjbGFyYXRvclsxXTsKLQkgICAgSUFTVE5hbWUgbmFtZSA9IG5ldyBDQVNUTmFtZSh2YXIudG9DaGFyQXJyYXkoKSk7Ci0JICAgIGRlY2xhcmF0b3JzWzBdLnNldE5hbWUobmFtZSk7Ci0JICAgIElBU1RMaXRlcmFsRXhwcmVzc2lvbiBpbml0ID0gbmV3IENBU1RMaXRlcmFsRXhwcmVzc2lvbigpOwotCSAgICBpbml0LnNldFZhbHVlKCIwIik7Ci0JICAgIElBU1RJbml0aWFsaXplckV4cHJlc3Npb24gaW5pdEUgPSBuZXcgQ0FTVEluaXRpYWxpemVyRXhwcmVzc2lvbigpOwotCSAgICBpbml0RS5zZXRFeHByZXNzaW9uKGluaXQpOwotCSAgICBkZWNsYXJhdG9yc1swXS5zZXRJbml0aWFsaXplcihpbml0RSk7Ci0JICAgIAotCSAgICBkZWNsLmFkZERlY2xhcmF0b3IoZGVjbGFyYXRvcnNbMF0pOwotICAgICAgICBkZWNsYXJhdG9yc1swXS5zZXRQYXJlbnQoZGVjbCk7Ci0gICAgICAgIGRlY2xhcmF0b3JzWzBdLnNldFByb3BlcnR5SW5QYXJlbnQoSUFTVFNpbXBsZURlY2xhcmF0aW9uLkRFQ0xBUkFUT1IpOwotICAgICAgICAKLSAgICAgICAgSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50IGRlY2xTdG10ID0gbmV3IENBU1REZWNsYXJhdGlvblN0YXRlbWVudCgpOwotICAgICAgICBkZWNsU3RtdC5zZXREZWNsYXJhdGlvbihkZWNsKTsKLSAgICAgICAgCi0gICAgICAgIElBU1RDb21wb3VuZFN0YXRlbWVudCBib2R5ID0gKElBU1RDb21wb3VuZFN0YXRlbWVudCljdXJyZW50Tm9kZV8uZ2V0RnVuY0RlZigpLmdldEJvZHkoKTsKLSAgICAgICAgSUFTVFN0YXRlbWVudFtdIHN0bXRzID0gYm9keS5nZXRTdGF0ZW1lbnRzKCk7Ci0gICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KHN0bXRzW3N0bXRzLmxlbmd0aC0xXSk7Ci0gICAgICAgIGZvcihpbnQgaT1zdG10cy5sZW5ndGgtMTsgaT4wOyBpLS0pewotICAgICAgICAJc3RtdHNbaV0gPSBzdG10c1tpLTFdOwotICAgICAgICB9Ci0gICAgICAgIHN0bXRzWzBdID0gZGVjbFN0bXQ7Ci0gICAgICAgIHN0bXRzWzBdLnNldFBhcmVudChzdG10c1sxXS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIHN0bXRzWzBdLnNldFByb3BlcnR5SW5QYXJlbnQoc3RtdHNbMV0uZ2V0UHJvcGVydHlJblBhcmVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldExhYmVsVmFyaWFibGUoU3RyaW5nIHZhciwgSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsKXsKLQkJSUFTVE5hbWUgbmFtZSA9IG5ldyBDQVNUTmFtZSh2YXIudG9DaGFyQXJyYXkoKSk7Ci0JCUlBU1RJZEV4cHJlc3Npb24gaWQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQlpZC5zZXROYW1lKG5hbWUpOwotCQluYW1lLnNldFBhcmVudChpZCk7Ci0KLQkJSUFTVExpdGVyYWxFeHByZXNzaW9uIHZhbHVlID0gbmV3IENBU1RMaXRlcmFsRXhwcmVzc2lvbigpOwotCQl2YWx1ZS5zZXRWYWx1ZSgiMCIpOwotCi0JCUlBU1RCaW5hcnlFeHByZXNzaW9uIGJpRSA9IG5ldyBDQVNUQmluYXJ5RXhwcmVzc2lvbigpOwotCQliaUUuc2V0T3BlcmFuZDEoaWQpOwotCQliaUUuc2V0T3BlcmFuZDIodmFsdWUpOwotCQlpZC5zZXRQYXJlbnQoYmlFKTsKLQkJdmFsdWUuc2V0UGFyZW50KGJpRSk7Ci0JCWJpRS5zZXRPcGVyYXRvcihJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9hc3NpZ24pOwotCQkKLQkJSUFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclN0bXQgPSBuZXcgQ0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQoKTsKLQkJZXhwclN0bXQuc2V0RXhwcmVzc2lvbihiaUUpOwotCQliaUUuc2V0UGFyZW50KGV4cHJTdG10KTsKLQkJCi0JCUlBU1RDb21wb3VuZFN0YXRlbWVudCBjb21wU3RtdCA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJaWYobGFiZWwuZ2V0TmVzdGVkU3RhdGVtZW50KCkgIT0gbnVsbCl7Ci0JCQlJQVNUU3RhdGVtZW50IG5lc3RlZFN0bXQgPSBsYWJlbC5nZXROZXN0ZWRTdGF0ZW1lbnQoKTsKLQkJCWNvbXBTdG10LnNldFBhcmVudChuZXN0ZWRTdG10LmdldFBhcmVudCgpKTsKLQkJCWNvbXBTdG10LnNldFByb3BlcnR5SW5QYXJlbnQobmVzdGVkU3RtdC5nZXRQcm9wZXJ0eUluUGFyZW50KCkpOwotCQkJY29tcFN0bXQuYWRkU3RhdGVtZW50KGV4cHJTdG10KTsKLQkJCWNvbXBTdG10LmFkZFN0YXRlbWVudChuZXN0ZWRTdG10KTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbXBTdG10LmFkZFN0YXRlbWVudChleHByU3RtdCk7Ci0JCQljb21wU3RtdC5zZXRQYXJlbnQobGFiZWwpOwotCQl9Ci0JCWxhYmVsLnNldE5lc3RlZFN0YXRlbWVudChjb21wU3RtdCk7Ci0JfQotCQotCQotCXByaXZhdGUgSUFTVExhYmVsU3RhdGVtZW50IGZpbmRMYWJlbChJQVNUR290b1N0YXRlbWVudCBnb3RvUyl7Ci0JCUlBU1ROYW1lIGxhYmVsbmFtZSA9IGdvdG9TLmdldE5hbWUoKTsKLQkJZm9yKExpc3RJdGVyYXRvciBsaSA9IGxhYmVsTGlzdF8ubGlzdEl0ZXJhdG9yKCk7IGxpLmhhc05leHQoKTspewotCQkJSUFTVExhYmVsU3RhdGVtZW50IHMgPSAoSUFTVExhYmVsU3RhdGVtZW50KWxpLm5leHQoKTsKLQkJCWlmKHMuZ2V0TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKGxhYmVsbmFtZS50b1N0cmluZygpKSkKLQkJCQlyZXR1cm4gczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTaWJsaW5nKElBU1ROb2RlIHMxLCBJQVNUTm9kZSBzMil7Ci0JCUlBU1ROb2RlIHAxID0gczEuZ2V0UGFyZW50KCk7Ci0JCUlBU1ROb2RlIHAyID0gczIuZ2V0UGFyZW50KCk7Ci0JCWlmKHAxID09IHAyICYmIHAxIGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlyZWN0ZWRSZWxhdGVkKElBU1RHb3RvU3RhdGVtZW50IGdvdG9TLCAKLQkJCUlBU1RMYWJlbFN0YXRlbWVudCBsYWJlbFMpewotCQlJQVNUTm9kZSBwYXJlbnQ7Ci0JCXBhcmVudCA9IGdvdG9TLmdldFBhcmVudCgpOwotCQl3aGlsZSghKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pKXsKLQkJCWlmKGlzU2libGluZyhsYWJlbFMsIHBhcmVudCkpIHJldHVybiB0cnVlOwotCQkJZWxzZSBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcGFyZW50ID0gbGFiZWxTLmdldFBhcmVudCgpOwotCQl3aGlsZSghKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pKXsKLQkJCWlmKGlzU2libGluZyhnb3RvUywgcGFyZW50KSkgcmV0dXJuIHRydWU7Ci0JCQllbHNlIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIERlbGV0ZSByZWR1bmRhbnRseSBuZXN0ZWQgY29tcG91bmRTdGF0ZW1lbnQgCi0JICogZS5nLiB7e3tzfX19IC0tPiB7c30KLQkgKiBlLmcuIHt7czF9e3MyfX0gLS0+IHtzMSBzMn0gCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZUNvbXBvdW5kU3RtdChJQVNUU3RhdGVtZW50IHN0bXQpewotCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KXsKLQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBuZXdDb21wUyA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCUlBU1RTdGF0ZW1lbnQgc3RtdHNbXSA9ICgoSUFTVENvbXBvdW5kU3RhdGVtZW50KXN0bXQpLmdldFN0YXRlbWVudHMoKTsKLQkJCWZvcihpbnQgaSA9IDA7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCW5vcm1hbGl6ZUNvbXBvdW5kU3RtdChzdG10c1tpXSk7Ci0JCQkJaWYoc3RtdHNbaV0gaW5zdGFuY2VvZiBJQVNUQ29tcG91bmRTdGF0ZW1lbnQpewotCQkJCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgc3ViQ29tcFMgPSAoSUFTVENvbXBvdW5kU3RhdGVtZW50KXN0bXRzW2ldOwotCQkJCQlJQVNUU3RhdGVtZW50IHN1YlN0bXRzW10gPSBzdWJDb21wUy5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQkJCWZvcihpbnQgaj0wOyBqPHN1YlN0bXRzLmxlbmd0aDsgaisrKXsKLQkJCQkJCW5ld0NvbXBTLmFkZFN0YXRlbWVudChzdWJTdG10c1tqXSk7Ci0JCQkJCQlzdWJTdG10c1tqXS5zZXRQYXJlbnQobmV3Q29tcFMpOyAvLyBUT0RPOiBjaGVjayBoZXJlCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQluZXdDb21wUy5hZGRTdGF0ZW1lbnQoc3RtdHNbaV0pOwotCQkJCQlzdG10c1tpXS5zZXRQYXJlbnQobmV3Q29tcFMpOyAvLyBUT0RPOiBjaGVjayBoZXJlCi0JCQkJfQotCQkJfQotCQkJcmVwbGFjZVN0YXRlbWVudChzdG10LCBuZXdDb21wUyk7Ci0JCX0gCi0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQlub3JtYWxpemVDb21wb3VuZFN0bXQoKChJQVNURG9TdGF0ZW1lbnQpc3RtdCkuZ2V0Qm9keSgpKTsKLQkJfSAKLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCl7Ci0JCQlub3JtYWxpemVDb21wb3VuZFN0bXQoKChJQVNURm9yU3RhdGVtZW50KXN0bXQpLmdldEJvZHkoKSk7Ci0JCX0gCi0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQlub3JtYWxpemVDb21wb3VuZFN0bXQoKChJQVNUSWZTdGF0ZW1lbnQpc3RtdCkuZ2V0VGhlbkNsYXVzZSgpKTsKLQkJCW5vcm1hbGl6ZUNvbXBvdW5kU3RtdCgoKElBU1RJZlN0YXRlbWVudClzdG10KS5nZXRFbHNlQ2xhdXNlKCkpOwotCQl9IAotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KXsKLQkJCW5vcm1hbGl6ZUNvbXBvdW5kU3RtdCgoKElBU1RTd2l0Y2hTdGF0ZW1lbnQpc3RtdCkuZ2V0Qm9keSgpKTsKLQkJfSAKLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCW5vcm1hbGl6ZUNvbXBvdW5kU3RtdCgoKElBU1RXaGlsZVN0YXRlbWVudClzdG10KS5nZXRCb2R5KCkpOwotCQl9Ci0JfQotCQotCQotCS8qIFRPRE86IGNoZWNrIHRoZSBvcmRlciBvZiByZXBsYWNlIGFuZCBwYXJlbnQgc2V0dGluZyAqLwkKLQlwcml2YXRlIHZvaWQgbW92ZU91dHdhcmQoSUFTVEdvdG9TdGF0ZW1lbnQgZ290b1MpewotCQlTdHJpbmcgbGFiZWxuYW1lID0gImdvdG9fIiArIGdvdG9TLmdldE5hbWUoKS50b1N0cmluZygpOwotCQlJQVNUTm9kZSBwYXJlbnQgPSBnb3RvUy5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKLQkJSUFTVE5vZGUgYm9keSA9IGdvdG9TLmdldFBhcmVudCgpOwotCQlJQVNUSWZTdGF0ZW1lbnQgZ290b0lmU3RtdCA9IChJQVNUSWZTdGF0ZW1lbnQpYm9keTsKLQkJCi0JCXdoaWxlKCEocGFyZW50IGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbikpewotCQkJCi0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQgfHwgCi0JCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQgfHwKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50IHx8IAotCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KXsKLQkJCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbmV3Ym9keSA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCQlpZihib2R5IGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KXsKLQkJCQkJSUFTVFN0YXRlbWVudFtdIHN0bXRzID0gKChJQVNUQ29tcG91bmRTdGF0ZW1lbnQpYm9keSkuZ2V0U3RhdGVtZW50cygpOwotCQkJCQlpbnQgaW5kZXg7Ci0JCQkJCWZvcihpbmRleD0wOyBpbmRleDxzdG10cy5sZW5ndGg7IGluZGV4KyspewotCQkJCQkJaWYoc3RtdHNbaW5kZXhdID09IGdvdG9JZlN0bXQpIGJyZWFrOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlmb3IoaW50IGo9MDsgajxpbmRleDsgaisrKXsKLQkJCQkJCW5ld2JvZHkuYWRkU3RhdGVtZW50KHN0bXRzW2pdKTsKLQkJCQkJfQotCQkJCQlJQVNUU3RhdGVtZW50IGFzc2lnblMgPSBtYWtlR290b0lmQ29uZFN0b3JlU3RtdChnb3RvSWZTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgbGFiZWxuYW1lKTsKLQkJCQkJbmV3Ym9keS5hZGRTdGF0ZW1lbnQoYXNzaWduUyk7Ci0JCQkJCQotCQkJCQlJQVNUTmFtZSBjb25kbmFtZSA9IG5ldyBDQVNUTmFtZShsYWJlbG5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCQkJCUlBU1RJZEV4cHJlc3Npb24gY29uZEUgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJCQljb25kRS5zZXROYW1lKGNvbmRuYW1lKTsKLQkJCQkJY29uZG5hbWUuc2V0UGFyZW50KGNvbmRFKTsKLQkJCQkJCi0JCQkJCUlBU1RJZlN0YXRlbWVudCBpZlMgPSBuZXcgQ0FTVElmU3RhdGVtZW50KCk7Ci0JCQkJCWlmUy5zZXRDb25kaXRpb25FeHByZXNzaW9uKGNvbmRFKTsKLQkJCQkJSUFTVEJyZWFrU3RhdGVtZW50IGJyZWFrUyA9IG5ldyBDQVNUQnJlYWtTdGF0ZW1lbnQoKTsKLQkJCQkJaWZTLnNldFRoZW5DbGF1c2UoYnJlYWtTKTsKLQkJCQkJaWZTLnNldEVsc2VDbGF1c2UobnVsbCk7Ci0JCQkJCWNvbmRFLnNldFBhcmVudChpZlMpOwotCQkJCQlicmVha1Muc2V0UGFyZW50KGlmUyk7Ci0JCQkJCQotCQkJCQluZXdib2R5LmFkZFN0YXRlbWVudChpZlMpOwotCQkJCQkKLQkJCQkJZm9yKGludCBqPWluZGV4KzE7IGo8c3RtdHMubGVuZ3RoOyBqKyspewotCQkJCQkJbmV3Ym9keS5hZGRTdGF0ZW1lbnQoc3RtdHNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYoYm9keSA9PSBnb3RvSWZTdG10KXsKLQkJCQkJSUFTVFN0YXRlbWVudCBhc3NpZ25TID0gbWFrZUdvdG9JZkNvbmRTdG9yZVN0bXQoZ290b0lmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIGxhYmVsbmFtZSk7Ci0JCQkJCW5ld2JvZHkuYWRkU3RhdGVtZW50KGFzc2lnblMpOwotCQkJCQkKLQkJCQkJSUFTVE5hbWUgY29uZG5hbWUgPSBuZXcgQ0FTVE5hbWUobGFiZWxuYW1lLnRvQ2hhckFycmF5KCkpOwotCQkJCQlJQVNUSWRFeHByZXNzaW9uIGNvbmRFID0gbmV3IENBU1RJZEV4cHJlc3Npb24oKTsKLQkJCQkJY29uZEUuc2V0TmFtZShjb25kbmFtZSk7Ci0JCQkJCWNvbmRuYW1lLnNldFBhcmVudChjb25kRSk7Ci0JCQkJCQotCQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZTID0gbmV3IENBU1RJZlN0YXRlbWVudCgpOwotCQkJCQlpZlMuc2V0Q29uZGl0aW9uRXhwcmVzc2lvbihjb25kRSk7Ci0JCQkJCUlBU1RCcmVha1N0YXRlbWVudCBicmVha1MgPSBuZXcgQ0FTVEJyZWFrU3RhdGVtZW50KCk7Ci0JCQkJCWlmUy5zZXRUaGVuQ2xhdXNlKGJyZWFrUyk7Ci0JCQkJCWlmUy5zZXRFbHNlQ2xhdXNlKG51bGwpOwotCQkJCQljb25kRS5zZXRQYXJlbnQoaWZTKTsKLQkJCQkJYnJlYWtTLnNldFBhcmVudChpZlMpOwotCQkJCQkKLQkJCQkJbmV3Ym9keS5hZGRTdGF0ZW1lbnQoaWZTKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCQkJKChDQVNURG9TdGF0ZW1lbnQpcGFyZW50KS5yZXBsYWNlKGJvZHksIG5ld2JvZHkpOwotCQkJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQkJKChDQVNURm9yU3RhdGVtZW50KXBhcmVudCkucmVwbGFjZShib2R5LCBuZXdib2R5KTsKLQkJCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQkJKChDQVNUV2hpbGVTdGF0ZW1lbnQpcGFyZW50KS5yZXBsYWNlKGJvZHksIG5ld2JvZHkpOwotCQkJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KXsKLQkJCQkJKChDQVNUU3dpdGNoU3RhdGVtZW50KXBhcmVudCkucmVwbGFjZShib2R5LCBuZXdib2R5KTsKLQkJCQl9Ci0KLQkJCQlJQVNUU3RhdGVtZW50IG5ld0lmU3RtdCA9IG1ha2VOZXdHb3RvSWZTdG10KGxhYmVsbmFtZSwgZ290b1MpOwotCQkJCWFwcGVuZFN0YXRlbWVudChuZXdJZlN0bXQsIChJQVNUU3RhdGVtZW50KXBhcmVudCk7Ci0JCQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQkJaWYoYm9keSBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCl7Ci0JCQkJCUlBU1RTdGF0ZW1lbnRbXSBzdG10cyA9ICgoSUFTVENvbXBvdW5kU3RhdGVtZW50KWJvZHkpLmdldFN0YXRlbWVudHMoKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlmb3IoaW5kZXg9MDsgaW5kZXg8c3RtdHMubGVuZ3RoOyBpbmRleCsrKXsKLQkJCQkJCWlmKHN0bXRzW2luZGV4XSA9PSBnb3RvSWZTdG10KSBicmVhazsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IG5ld2JvZHkgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCQkJCWZvcihpbnQgaj0wOyBqPGluZGV4OyBqKyspewotCQkJCQkJbmV3Ym9keS5hZGRTdGF0ZW1lbnQoc3RtdHNbal0pOwotCQkJCQl9Ci0JCQkJCUlBU1RTdGF0ZW1lbnQgYXNzaWduUyA9IG1ha2VHb3RvSWZDb25kU3RvcmVTdG10KGdvdG9JZlN0bXQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBsYWJlbG5hbWUpOwotCQkJCQluZXdib2R5LmFkZFN0YXRlbWVudChhc3NpZ25TKTsKLQkJCQkJCi0JCQkJCWlmKGluZGV4IDwgc3RtdHMubGVuZ3RoLTEpeyAvL3NvbWUgc3RhdGVtZW50cyBhZnRlciB0aGUgZ290bwotCQkJCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IGlmYm9keSA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCQkJCWZvcihpbnQgaiA9IGluZGV4KzE7IGo8c3RtdHMubGVuZ3RoOyBqKyspewotCQkJCQkJCWlmYm9keS5hZGRTdGF0ZW1lbnQoc3RtdHNbal0pOwotCQkJCQkJfQotCQkJCQkJSUFTVE5hbWUgY29uZG5hbWUgPSBuZXcgQ0FTVE5hbWUobGFiZWxuYW1lLnRvQ2hhckFycmF5KCkpOwotCQkJCQkJSUFTVElkRXhwcmVzc2lvbiBjb25kaWQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJCQkJY29uZGlkLnNldE5hbWUoY29uZG5hbWUpOwotCQkJCQkJY29uZG5hbWUuc2V0UGFyZW50KGNvbmRpZCk7Ci0JCQkJCQkKLQkJCQkJCUlBU1RVbmFyeUV4cHJlc3Npb24gY29uZEUgPSBuZXcgQ0FTVFVuYXJ5RXhwcmVzc2lvbigpOwotCQkJCQkJY29uZEUuc2V0T3BlcmFuZChjb25kaWQpOwotCQkJCQkJY29uZEUuc2V0T3BlcmF0b3IoSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9ub3QpOwotCQkJCQkJY29uZGlkLnNldFBhcmVudChjb25kRSk7Ci0JCQkJCQkKLQkJCQkJCUlBU1RJZlN0YXRlbWVudCBpZlN0bXQgPSBuZXcgQ0FTVElmU3RhdGVtZW50KCk7Ci0JCQkJCQlpZlN0bXQuc2V0Q29uZGl0aW9uRXhwcmVzc2lvbihjb25kRSk7Ci0JCQkJCQlpZlN0bXQuc2V0VGhlbkNsYXVzZShpZmJvZHkpOwotCQkJCQkJaWZTdG10LnNldEVsc2VDbGF1c2UobnVsbCk7Ci0JCQkJCQljb25kRS5zZXRQYXJlbnQoaWZTdG10KTsKLQkJCQkJCWlmYm9keS5zZXRQYXJlbnQoaWZTdG10KTsKLQkJCQkJCQotCQkJCQkJbmV3Ym9keS5hZGRTdGF0ZW1lbnQoaWZTdG10KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJKChDQVNUSWZTdGF0ZW1lbnQpcGFyZW50KS5yZXBsYWNlKGJvZHksIG5ld2JvZHkpOwotCQkJCX0KLQkJCQllbHNlIGlmKGJvZHkgPT0gZ290b0lmU3RtdCl7Ci0JCQkJCUlBU1RTdGF0ZW1lbnQgYXNzaWduUyA9IG1ha2VHb3RvSWZDb25kU3RvcmVTdG10KGdvdG9JZlN0bXQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBsYWJlbG5hbWUpOwotCQkJCQkoKENBU1RJZlN0YXRlbWVudClwYXJlbnQpLnJlcGxhY2UoZ290b0lmU3RtdCwgYXNzaWduUyk7Ci0JCQkJfQotCQkJCQkKLQkJCQlJQVNUU3RhdGVtZW50IG5ld2lmU3RtdCA9IG1ha2VOZXdHb3RvSWZTdG10KGxhYmVsbmFtZSwgZ290b1MpOwotCQkJCWFwcGVuZFN0YXRlbWVudChuZXdpZlN0bXQsIChJQVNUU3RhdGVtZW50KXBhcmVudCk7IAotCQkJCSAKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJvZHkgPSBwYXJlbnQ7Ci0JCQkJcGFyZW50ID0gYm9keS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgbW92ZUlud2FyZChJQVNUR290b1N0YXRlbWVudCBnb3RvUyl7Ci0JCUlBU1RJZlN0YXRlbWVudCBnb3RvSWZTdG10ID0gKElBU1RJZlN0YXRlbWVudClnb3RvUy5nZXRQYXJlbnQoKTsKLQkJU3RyaW5nIGxhYmVsbmFtZSA9ICJnb3RvXyIgKyBnb3RvUy5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkJSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsID0gZmluZExhYmVsKGdvdG9TKTsKLQkJSUFTVFN0YXRlbWVudCBlbmNsb3NpbmdTdG10ID0gbnVsbDsKLQkJSUFTVFN0YXRlbWVudCBjbGF1c2UgPSBudWxsOwotCQlJQVNUTm9kZSBwYXJlbnQgPSBsYWJlbC5nZXRQYXJlbnQoKTsKLQkJSUFTVE5vZGUgdGVtcCA9IGxhYmVsOwotCQl3aGlsZSghKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pKXsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCB8fCAKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCB8fAotCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQgfHwKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCB8fAotCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJCWVuY2xvc2luZ1N0bXQgPSAoSUFTVFN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KQotCQkJCQljbGF1c2UgPSAoSUFTVFN0YXRlbWVudCl0ZW1wOwotCQkJfQotCQkJaWYocGFyZW50ID09IGdvdG9JZlN0bXQuZ2V0UGFyZW50KCkpIGJyZWFrOwotCQkJZWxzZXsKLQkJCQl0ZW1wID0gcGFyZW50OwotCQkJCXBhcmVudCA9IHRlbXAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGVuY2xvc2luZ1N0bXQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQgfHwKLQkJCQllbmNsb3NpbmdTdG10IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCB8fAotCQkJCWVuY2xvc2luZ1N0bXQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQgKXsKLQkJCS8qIHBhcmVudCBzaG91bGQgYmUgYSBDb21wb3VuZFN0YXRlbWVudCAqLwotCQkJaW50IGdvdG9pbmRleCA9IC0xOwotCQkJaW50IGxvb3BpbmRleCA9IC0xOwotCQkJSUFTVFN0YXRlbWVudFtdIHN0bXRzID0gKChJQVNUQ29tcG91bmRTdGF0ZW1lbnQpcGFyZW50KS5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQlmb3IoaW50IGkgPSAwOyBpPHN0bXRzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZihzdG10c1tpXSA9PSBnb3RvSWZTdG10KSBnb3RvaW5kZXggPSBpOwotCQkJCWVsc2UgaWYoc3RtdHNbaV0gPT0gZW5jbG9zaW5nU3RtdCkgbG9vcGluZGV4ID0gaTsKLQkJCX0KLQkJCQotCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IG5ld1BhcmVudFN0bXQgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpPGdvdG9pbmRleDsgaSsrKXsKLQkJCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJc3RtdHNbaV0uc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJfQotCQkJSUFTVFN0YXRlbWVudCBhc3NpZ25TID0gbWFrZUdvdG9JZkNvbmRTdG9yZVN0bXQoZ290b0lmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIGxhYmVsbmFtZSk7Ci0JCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChhc3NpZ25TKTsKLQkJCWFzc2lnblMuc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJCi0JCQlpZihsb29waW5kZXggLSBnb3RvaW5kZXggPiAxKXsKLQkJCQlJQVNUTmFtZSBjb25kbmFtZSA9IG5ldyBDQVNUTmFtZShsYWJlbG5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCQkJSUFTVElkRXhwcmVzc2lvbiBjb25kaWQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJCWNvbmRpZC5zZXROYW1lKGNvbmRuYW1lKTsKLQkJCQljb25kbmFtZS5zZXRQYXJlbnQoY29uZGlkKTsKLQkJCQlJQVNUVW5hcnlFeHByZXNzaW9uIGNvbmRFID0gbmV3IENBU1RVbmFyeUV4cHJlc3Npb24oKTsKLQkJCQljb25kRS5zZXRPcGVyYW5kKGNvbmRpZCk7Ci0JCQkJY29uZEUuc2V0T3BlcmF0b3IoSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9ub3QpOwotCQkJCWNvbmRpZC5zZXRQYXJlbnQoY29uZEUpOwotCQkJCQotCQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBpZmJvZHkgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCQkJZm9yKGludCBpPWdvdG9pbmRleCsxOyBpPGxvb3BpbmRleDsgaSsrKXsKLQkJCQkJaWZib2R5LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJCXN0bXRzW2ldLnNldFBhcmVudChpZmJvZHkpOwotCQkJCX0KLQkJCQkKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgbmV3SWZTdG10ID0gbmV3IENBU1RJZlN0YXRlbWVudCgpOwotCQkJCW5ld0lmU3RtdC5zZXRDb25kaXRpb25FeHByZXNzaW9uKGNvbmRFKTsKLQkJCQluZXdJZlN0bXQuc2V0VGhlbkNsYXVzZShpZmJvZHkpOwotCQkJCW5ld0lmU3RtdC5zZXRFbHNlQ2xhdXNlKG51bGwpOwotCQkJCWNvbmRFLnNldFBhcmVudChuZXdJZlN0bXQpOwotCQkJCWlmYm9keS5zZXRQYXJlbnQobmV3SWZTdG10KTsKLQkJCQkKLQkJCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChuZXdJZlN0bXQpOwotCQkJCW5ld0lmU3RtdC5zZXRQYXJlbnQobmV3UGFyZW50U3RtdCk7Ci0JCQl9CQotCQkJCi0JCQlJQVNUTmFtZSBsb29wY29uZG5hbWUgPSBuZXcgQ0FTVE5hbWUobGFiZWxuYW1lLnRvQ2hhckFycmF5KCkpOwotCQkJSUFTVElkRXhwcmVzc2lvbiBsb29wY29uZGlkID0gbmV3IENBU1RJZEV4cHJlc3Npb24oKTsKLQkJCWxvb3Bjb25kaWQuc2V0TmFtZShsb29wY29uZG5hbWUpOwotCQkJbG9vcGNvbmRuYW1lLnNldFBhcmVudChsb29wY29uZGlkKTsKLQkJCQotCQkJSUFTVFN0YXRlbWVudCBsb29wYm9keSA9IG51bGw7Ci0JCQlpZihlbmNsb3NpbmdTdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCQlJQVNURG9TdGF0ZW1lbnQgZG9sb29wID0gKElBU1REb1N0YXRlbWVudCllbmNsb3NpbmdTdG10OwotCQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIG5ld0NvbmRFID0gbmV3IENBU1RCaW5hcnlFeHByZXNzaW9uKCk7Ci0JCQkJSUFTVEV4cHJlc3Npb24gb2xkQ29uZEUgPSBkb2xvb3AuZ2V0Q29uZGl0aW9uKCk7Ci0JCQkJbmV3Q29uZEUuc2V0T3BlcmFuZDEob2xkQ29uZEUpOwotCQkJCW5ld0NvbmRFLnNldE9wZXJhbmQyKGxvb3Bjb25kaWQpOwotCQkJCW5ld0NvbmRFLnNldE9wZXJhdG9yKElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2xvZ2ljYWxPcik7Ci0JCQkJb2xkQ29uZEUuc2V0UGFyZW50KG5ld0NvbmRFKTsKLQkJCQlsb29wY29uZGlkLnNldFBhcmVudChuZXdDb25kRSk7Ci0JCQkJKChDQVNURG9TdGF0ZW1lbnQpZG9sb29wKS5yZXBsYWNlKG9sZENvbmRFLCBuZXdDb25kRSk7Ci0JCQkJbG9vcGJvZHkgPSBkb2xvb3AuZ2V0Qm9keSgpOwotCQkJfSBlbHNlIGlmKGVuY2xvc2luZ1N0bXQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQlJQVNURm9yU3RhdGVtZW50IGZvcmxvb3AgPSAoSUFTVEZvclN0YXRlbWVudCllbmNsb3NpbmdTdG10OwotCQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIG5ld0NvbmRFID0gbmV3IENBU1RCaW5hcnlFeHByZXNzaW9uKCk7Ci0JCQkJSUFTVEV4cHJlc3Npb24gb2xkQ29uZEUgPSBmb3Jsb29wLmdldENvbmRpdGlvbkV4cHJlc3Npb24oKTsKLQkJCQluZXdDb25kRS5zZXRPcGVyYW5kMShvbGRDb25kRSk7Ci0JCQkJbmV3Q29uZEUuc2V0T3BlcmFuZDIobG9vcGNvbmRpZCk7Ci0JCQkJbmV3Q29uZEUuc2V0T3BlcmF0b3IoSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfbG9naWNhbE9yKTsKLQkJCQlvbGRDb25kRS5zZXRQYXJlbnQobmV3Q29uZEUpOwotCQkJCWxvb3Bjb25kaWQuc2V0UGFyZW50KG5ld0NvbmRFKTsKLQkJCQkoKENBU1RGb3JTdGF0ZW1lbnQpZm9ybG9vcCkucmVwbGFjZShvbGRDb25kRSwgbmV3Q29uZEUpOwotCQkJCWxvb3Bib2R5ID0gZm9ybG9vcC5nZXRCb2R5KCk7Ci0JCQl9IGVsc2UgaWYoZW5jbG9zaW5nU3RtdCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJSUFTVFdoaWxlU3RhdGVtZW50IHdoaWxlbG9vcCA9IChJQVNUV2hpbGVTdGF0ZW1lbnQpZW5jbG9zaW5nU3RtdDsKLQkJCQlJQVNUQmluYXJ5RXhwcmVzc2lvbiBuZXdDb25kRSA9IG5ldyBDQVNUQmluYXJ5RXhwcmVzc2lvbigpOwotCQkJCUlBU1RFeHByZXNzaW9uIG9sZENvbmRFID0gd2hpbGVsb29wLmdldENvbmRpdGlvbigpOwotCQkJCW5ld0NvbmRFLnNldE9wZXJhbmQxKG9sZENvbmRFKTsKLQkJCQluZXdDb25kRS5zZXRPcGVyYW5kMihsb29wY29uZGlkKTsKLQkJCQluZXdDb25kRS5zZXRPcGVyYXRvcihJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9sb2dpY2FsT3IpOwotCQkJCW9sZENvbmRFLnNldFBhcmVudChuZXdDb25kRSk7Ci0JCQkJbG9vcGNvbmRpZC5zZXRQYXJlbnQobmV3Q29uZEUpOwotCQkJCSgoQ0FTVFdoaWxlU3RhdGVtZW50KXdoaWxlbG9vcCkucmVwbGFjZShvbGRDb25kRSwgbmV3Q29uZEUpOwotCQkJCWxvb3Bib2R5ID0gd2hpbGVsb29wLmdldEJvZHkoKTsKLQkJCX0KLQkJCQotCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IG5ld2xvb3Bib2R5ID0gbmV3IENBU1RDb21wb3VuZFN0YXRlbWVudCgpOwotCQkJSUFTVFN0YXRlbWVudCBuZXdHb3RvUyA9IG1ha2VOZXdHb3RvSWZTdG10KGxhYmVsbmFtZSwgZ290b1MpOwotCQkJbmV3bG9vcGJvZHkuYWRkU3RhdGVtZW50KG5ld0dvdG9TKTsKLQkJCW5ld0dvdG9TLnNldFBhcmVudChuZXdsb29wYm9keSk7Ci0JCQlpZihsb29wYm9keSBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCl7Ci0JCQkJSUFTVFN0YXRlbWVudFtdIGJvZHlTdG10cyA9ICgoSUFTVENvbXBvdW5kU3RhdGVtZW50KWxvb3Bib2R5KS5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaTxib2R5U3RtdHMubGVuZ3RoOyBpKyspewotCQkJCQluZXdsb29wYm9keS5hZGRTdGF0ZW1lbnQoYm9keVN0bXRzW2ldKTsKLQkJCQkJYm9keVN0bXRzW2ldLnNldFBhcmVudChuZXdsb29wYm9keSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihsb29wYm9keSA9PSBsYWJlbCl7Ci0JCQkJbmV3bG9vcGJvZHkuYWRkU3RhdGVtZW50KGxhYmVsKTsKLQkJCQlsYWJlbC5zZXRQYXJlbnQobmV3bG9vcGJvZHkpOwotCQkJfQotCQkJCi0JCQlpZihlbmNsb3NpbmdTdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCQkoKENBU1REb1N0YXRlbWVudCllbmNsb3NpbmdTdG10KS5yZXBsYWNlKGxvb3Bib2R5LCBuZXdsb29wYm9keSk7Ci0JCQl9IGVsc2UgaWYoZW5jbG9zaW5nU3RtdCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCSgoQ0FTVEZvclN0YXRlbWVudCllbmNsb3NpbmdTdG10KS5yZXBsYWNlKGxvb3Bib2R5LCBuZXdsb29wYm9keSk7Ci0JCQl9IGVsc2UgaWYoZW5jbG9zaW5nU3RtdCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJKChDQVNUV2hpbGVTdGF0ZW1lbnQpZW5jbG9zaW5nU3RtdCkucmVwbGFjZShsb29wYm9keSwgbmV3bG9vcGJvZHkpOwotCQkJfQotCQkJCi0JCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChlbmNsb3NpbmdTdG10KTsKLQkJCWVuY2xvc2luZ1N0bXQuc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJCi0JCQlmb3IoaW50IGkgPSBsb29waW5kZXgrMTsgaTxzdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQkJbmV3UGFyZW50U3RtdC5hZGRTdGF0ZW1lbnQoc3RtdHNbaV0pOwotCQkJCXN0bXRzW2ldLnNldFBhcmVudChuZXdQYXJlbnRTdG10KTsKLQkJCX0KLQkJCXJlcGxhY2VTdGF0ZW1lbnQoKElBU1RTdGF0ZW1lbnQpcGFyZW50LCBuZXdQYXJlbnRTdG10KTsKLQotCQl9Ci0JCWVsc2UgaWYoZW5jbG9zaW5nU3RtdCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQkvKiBwYXJlbnQgbXVzdCBiZSBhIGNvbXBvdW5kU3RhdGVtZW50ICovCi0JCQlJQVNUU3RhdGVtZW50W10gc3RtdHMgPSAoKElBU1RDb21wb3VuZFN0YXRlbWVudClwYXJlbnQpLmdldFN0YXRlbWVudHMoKTsKLQkJCWludCBnb3RvaW5kZXggPSAtMTsKLQkJCWludCBpZmluZGV4ID0gLTE7Ci0JCQlmb3IoaW50IGk9MDsgaTxzdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYoc3RtdHNbaV0gPT0gZ290b0lmU3RtdCkgZ290b2luZGV4ID0gaTsKLQkJCQllbHNlIGlmKHN0bXRzW2ldID09IGVuY2xvc2luZ1N0bXQpIGlmaW5kZXggPSBpOwotCQkJfQotCQkJCi0JCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbmV3UGFyZW50U3RtdCA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCQotCQkJZm9yKGludCBpPTA7IGk8Z290b2luZGV4OyBpKyspewotCQkJCW5ld1BhcmVudFN0bXQuYWRkU3RhdGVtZW50KHN0bXRzW2ldKTsKLQkJCQlzdG10c1tpXS5zZXRQYXJlbnQobmV3UGFyZW50U3RtdCk7Ci0JCQl9Ci0JCQlJQVNUU3RhdGVtZW50IGFzc2lnblMgPSBtYWtlR290b0lmQ29uZFN0b3JlU3RtdChnb3RvSWZTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgbGFiZWxuYW1lKTsKLQkJCW5ld1BhcmVudFN0bXQuYWRkU3RhdGVtZW50KGFzc2lnblMpOwotCQkJYXNzaWduUy5zZXRQYXJlbnQobmV3UGFyZW50U3RtdCk7Ci0JCQkKLQkJCWlmKGlmaW5kZXggLSBnb3RvaW5kZXggPiAxKXsKLQkJCQlJQVNUTmFtZSBjb25kbmFtZSA9IG5ldyBDQVNUTmFtZShsYWJlbG5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCQkJSUFTVElkRXhwcmVzc2lvbiBjb25kaWQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJCWNvbmRpZC5zZXROYW1lKGNvbmRuYW1lKTsKLQkJCQljb25kbmFtZS5zZXRQYXJlbnQoY29uZGlkKTsKLQkJCQlJQVNUVW5hcnlFeHByZXNzaW9uIGNvbmRFID0gbmV3IENBU1RVbmFyeUV4cHJlc3Npb24oKTsKLQkJCQljb25kRS5zZXRPcGVyYW5kKGNvbmRpZCk7Ci0JCQkJY29uZEUuc2V0T3BlcmF0b3IoSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9ub3QpOwotCQkJCWNvbmRpZC5zZXRQYXJlbnQoY29uZEUpOwotCQkJCQotCQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBpZmJvZHkgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCQkJZm9yKGludCBpPWdvdG9pbmRleCsxOyBpPGlmaW5kZXg7IGkrKyl7Ci0JCQkJCWlmYm9keS5hZGRTdGF0ZW1lbnQoc3RtdHNbaV0pOwotCQkJCQlzdG10c1tpXS5zZXRQYXJlbnQoaWZib2R5KTsKLQkJCQl9Ci0JCQkJCi0JCQkJSUFTVElmU3RhdGVtZW50IG5ld0lmU3RtdCA9IG5ldyBDQVNUSWZTdGF0ZW1lbnQoKTsKLQkJCQluZXdJZlN0bXQuc2V0Q29uZGl0aW9uRXhwcmVzc2lvbihjb25kRSk7Ci0JCQkJbmV3SWZTdG10LnNldFRoZW5DbGF1c2UoaWZib2R5KTsKLQkJCQluZXdJZlN0bXQuc2V0RWxzZUNsYXVzZShudWxsKTsKLQkJCQljb25kRS5zZXRQYXJlbnQobmV3SWZTdG10KTsKLQkJCQlpZmJvZHkuc2V0UGFyZW50KG5ld0lmU3RtdCk7Ci0JCQkJCi0JCQkJbmV3UGFyZW50U3RtdC5hZGRTdGF0ZW1lbnQobmV3SWZTdG10KTsKLQkJCQluZXdJZlN0bXQuc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJfQotCQkJCi0JCQlJQVNURXhwcmVzc2lvbiBvbGRJZkNvbmQgPSAoKElBU1RJZlN0YXRlbWVudCllbmNsb3NpbmdTdG10KS5nZXRDb25kaXRpb25FeHByZXNzaW9uKCk7Ci0JCQlJQVNUTmFtZSBpZmNvbmRuYW1lID0gbmV3IENBU1ROYW1lKGxhYmVsbmFtZS50b0NoYXJBcnJheSgpKTsKLQkJCUlBU1RJZEV4cHJlc3Npb24gaWZjb25kaWQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJaWZjb25kaWQuc2V0TmFtZShpZmNvbmRuYW1lKTsKLQkJCWlmY29uZG5hbWUuc2V0UGFyZW50KGlmY29uZGlkKTsKLQkJCQotCQkJSUFTVFVuYXJ5RXhwcmVzc2lvbiBpZmNvbmRQYXJ0MSA9IG5ldyBDQVNUVW5hcnlFeHByZXNzaW9uKCk7Ci0JCQlpZmNvbmRQYXJ0MS5zZXRPcGVyYW5kKGlmY29uZGlkKTsKLQkJCWlmY29uZFBhcnQxLnNldE9wZXJhdG9yKElBU1RVbmFyeUV4cHJlc3Npb24ub3Bfbm90KTsKLQkJCWlmY29uZGlkLnNldFBhcmVudChpZmNvbmRQYXJ0MSk7Ci0JCQkKLQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIG5ld0lmQ29uZCA9IG5ldyBDQVNUQmluYXJ5RXhwcmVzc2lvbigpOwotCQkJbmV3SWZDb25kLnNldE9wZXJhdG9yKElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2xvZ2ljYWxBbmQpOwotCQkJbmV3SWZDb25kLnNldE9wZXJhbmQxKGlmY29uZFBhcnQxKTsKLQkJCW5ld0lmQ29uZC5zZXRPcGVyYW5kMihvbGRJZkNvbmQpOwotCQkJaWZjb25kUGFydDEuc2V0UGFyZW50KG5ld0lmQ29uZCk7Ci0JCQlvbGRJZkNvbmQuc2V0UGFyZW50KG5ld0lmQ29uZCk7Ci0JCQkKLQkJCSgoQ0FTVElmU3RhdGVtZW50KWVuY2xvc2luZ1N0bXQpLnJlcGxhY2Uob2xkSWZDb25kLCBuZXdJZkNvbmQpOwotCQkJCi0JCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbmV3Q2xhdXNlID0gbmV3IENBU1RDb21wb3VuZFN0YXRlbWVudCgpOwotCQkJSUFTVFN0YXRlbWVudCBuZXdHb3RvUyA9IG1ha2VOZXdHb3RvSWZTdG10KGxhYmVsbmFtZSwgZ290b1MpOwotCQkJbmV3Q2xhdXNlLmFkZFN0YXRlbWVudChuZXdHb3RvUyk7Ci0JCQluZXdHb3RvUy5zZXRQYXJlbnQobmV3Q2xhdXNlKTsKLQkJCWlmKGNsYXVzZSBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCl7Ci0JCQkJSUFTVFN0YXRlbWVudFtdIGNsYXVzZVN0bXRzID0gKChJQVNUQ29tcG91bmRTdGF0ZW1lbnQpY2xhdXNlKS5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaTxjbGF1c2VTdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQkJCW5ld0NsYXVzZS5hZGRTdGF0ZW1lbnQoY2xhdXNlU3RtdHNbaV0pOwotCQkJCQljbGF1c2VTdG10c1tpXS5zZXRQYXJlbnQobmV3Q2xhdXNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXVzZSA9PSBsYWJlbCl7Ci0JCQkJbmV3Q2xhdXNlLmFkZFN0YXRlbWVudChsYWJlbCk7Ci0JCQkJbGFiZWwuc2V0UGFyZW50KG5ld0NsYXVzZSk7Ci0JCQl9Ci0JCQkKLQkJCSgoQ0FTVElmU3RhdGVtZW50KWVuY2xvc2luZ1N0bXQpLnJlcGxhY2UoY2xhdXNlLCBuZXdDbGF1c2UpOwotCQkJCi0JCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChlbmNsb3NpbmdTdG10KTsKLQkJCWVuY2xvc2luZ1N0bXQuc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJCi0JCQlmb3IoaW50IGkgPSBpZmluZGV4KzE7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCW5ld1BhcmVudFN0bXQuYWRkU3RhdGVtZW50KHN0bXRzW2ldKTsKLQkJCQlzdG10c1tpXS5zZXRQYXJlbnQobmV3UGFyZW50U3RtdCk7Ci0JCQl9Ci0JCQlyZXBsYWNlU3RhdGVtZW50KChJQVNUU3RhdGVtZW50KXBhcmVudCwgbmV3UGFyZW50U3RtdCk7Ci0JCX0KLQkJZWxzZSBpZihlbmNsb3NpbmdTdG10IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCl7Ci0JCQkvKiBwYXJlbnQgbXVzdCBiZSBhIGNvbXBvdW5kU3RhdGVtZW50ICovCi0JCQlJQVNUU3RhdGVtZW50W10gc3RtdHMgPSAoKElBU1RDb21wb3VuZFN0YXRlbWVudClwYXJlbnQpLmdldFN0YXRlbWVudHMoKTsKLQkJCWludCBnb3RvaW5kZXggPSAtMTsKLQkJCWludCBzd2l0Y2hpbmRleCA9IC0xOwotCQkJSUFTVENhc2VTdGF0ZW1lbnQgY2FzZVN0bXQgPSBudWxsOwotCQkJYm9vbGVhbiBjYXNlZm91bmQgPSBmYWxzZTsKLQkJCQotCQkJZm9yKGludCBpPTA7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCWlmKHN0bXRzW2ldID09IGdvdG9JZlN0bXQpIGdvdG9pbmRleCA9IGk7Ci0JCQkJZWxzZSBpZihzdG10c1tpXSA9PSBlbmNsb3NpbmdTdG10KXsKLQkJCQkJc3dpdGNoaW5kZXggPSBpOwotCQkJCQljYXNlZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKHN0bXRzW2ldIGluc3RhbmNlb2YgSUFTVENhc2VTdGF0ZW1lbnQgJiYgIWNhc2Vmb3VuZCl7Ci0JCQkJCWNhc2VTdG10ID0gKElBU1RDYXNlU3RhdGVtZW50KXN0bXRzW2ldOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IG5ld1BhcmVudFN0bXQgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpPGdvdG9pbmRleDsgaSsrKXsKLQkJCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJc3RtdHNbaV0uc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJfQotCQkJSUFTVFN0YXRlbWVudCBhc3NpZ25TID0gbWFrZUdvdG9JZkNvbmRTdG9yZVN0bXQoZ290b0lmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIGxhYmVsbmFtZSk7Ci0JCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChhc3NpZ25TKTsKLQkJCWFzc2lnblMuc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJCi0JCQkvKiBtYWtpbmcgbmV3IGlmIHN0YXRlbWVudCAqLwotCQkJSUFTVE5hbWUgY29uZG5hbWUgPSBuZXcgQ0FTVE5hbWUobGFiZWxuYW1lLnRvQ2hhckFycmF5KCkpOwotCQkJSUFTVElkRXhwcmVzc2lvbiBjb25kaWQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJY29uZGlkLnNldE5hbWUoY29uZG5hbWUpOwotCQkJY29uZG5hbWUuc2V0UGFyZW50KGNvbmRpZCk7Ci0JCQlJQVNUVW5hcnlFeHByZXNzaW9uIGNvbmRFID0gbmV3IENBU1RVbmFyeUV4cHJlc3Npb24oKTsKLQkJCWNvbmRFLnNldE9wZXJhbmQoY29uZGlkKTsKLQkJCWNvbmRFLnNldE9wZXJhdG9yKElBU1RVbmFyeUV4cHJlc3Npb24ub3Bfbm90KTsKLQkJCWNvbmRpZC5zZXRQYXJlbnQoY29uZEUpOwotCQkJCi0JCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgaWZUaGVuQm9keSA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCWZvcihpbnQgaT1nb3RvaW5kZXgrMTsgaTxzd2l0Y2hpbmRleDsgaSsrKXsKLQkJCQlpZlRoZW5Cb2R5LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJc3RtdHNbaV0uc2V0UGFyZW50KGlmVGhlbkJvZHkpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgc3dpdGNodmFyID0gInRfc3dpdGNoXyIgKyBzd2l0Y2hfY291bnQ7Ci0JCQlzd2l0Y2hfY291bnQgKys7Ci0JCQljcmVhdGVEZWNsYXJhdGlvbihzd2l0Y2h2YXIpOyAvKiBUT0RPOiBmaXggdHlwZSBpbmZvcm1hdGlvbiAqLwotCQkJSUFTVE5hbWUgc3dpdGNoQ29uZEFzc2lnbk5hbWUgPSBuZXcgQ0FTVE5hbWUoc3dpdGNodmFyLnRvQ2hhckFycmF5KCkpOwotCQkJSUFTVElkRXhwcmVzc2lvbiBzd2l0Y2hDb25kQXNzaWduSUQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJc3dpdGNoQ29uZEFzc2lnbklELnNldE5hbWUoc3dpdGNoQ29uZEFzc2lnbk5hbWUpOwotCQkJc3dpdGNoQ29uZEFzc2lnbk5hbWUuc2V0UGFyZW50KHN3aXRjaENvbmRBc3NpZ25JRCk7Ci0JCQlJQVNURXhwcmVzc2lvbiBvbGRTd2l0Y2hDb25kRSA9ICgoSUFTVFN3aXRjaFN0YXRlbWVudCllbmNsb3NpbmdTdG10KS5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpOwotCQkJCi0JCQlJQVNUQmluYXJ5RXhwcmVzc2lvbiBzd2l0Y2hDb25kQXNzaWduRSA9IG5ldyBDQVNUQmluYXJ5RXhwcmVzc2lvbigpOwotCQkJc3dpdGNoQ29uZEFzc2lnbkUuc2V0T3BlcmFuZDEoc3dpdGNoQ29uZEFzc2lnbklEKTsKLQkJCXN3aXRjaENvbmRBc3NpZ25FLnNldE9wZXJhbmQyKG9sZFN3aXRjaENvbmRFKTsKLQkJCXN3aXRjaENvbmRBc3NpZ25FLnNldE9wZXJhdG9yKElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2Fzc2lnbik7Ci0JCQlzd2l0Y2hDb25kQXNzaWduSUQuc2V0UGFyZW50KHN3aXRjaENvbmRBc3NpZ25FKTsKLQkJCW9sZFN3aXRjaENvbmRFLnNldFBhcmVudChzd2l0Y2hDb25kQXNzaWduRSk7Ci0JCQkKLQkJCUlBU1RFeHByZXNzaW9uU3RhdGVtZW50IHN3aXRjaENvbmRBc3NpZ25TdG10ID0gbmV3IENBU1RFeHByZXNzaW9uU3RhdGVtZW50KCk7Ci0JCQlzd2l0Y2hDb25kQXNzaWduU3RtdC5zZXRFeHByZXNzaW9uKHN3aXRjaENvbmRBc3NpZ25FKTsKLQkJCXN3aXRjaENvbmRBc3NpZ25FLnNldFBhcmVudChzd2l0Y2hDb25kQXNzaWduU3RtdCk7Ci0JCQkKLQkJCWlmVGhlbkJvZHkuYWRkU3RhdGVtZW50KHN3aXRjaENvbmRBc3NpZ25TdG10KTsKLQkJCXN3aXRjaENvbmRBc3NpZ25TdG10LnNldFBhcmVudChpZlRoZW5Cb2R5KTsKLQkJCQotCQkJSUFTVE5hbWUgZWxzZVN3aXRjaENvbmROYW1lID0gbmV3IENBU1ROYW1lKHN3aXRjaHZhci50b0NoYXJBcnJheSgpKTsKLQkJCUlBU1RJZEV4cHJlc3Npb24gZWxzZVN3aXRjaENvbmRJRCA9IG5ldyBDQVNUSWRFeHByZXNzaW9uKCk7Ci0JCQllbHNlU3dpdGNoQ29uZElELnNldE5hbWUoZWxzZVN3aXRjaENvbmROYW1lKTsKLQkJCWVsc2VTd2l0Y2hDb25kTmFtZS5zZXRQYXJlbnQoZWxzZVN3aXRjaENvbmRJRCk7Ci0JCQkKLQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIGVsc2VTd2l0Y2hDb25kRSA9IG5ldyBDQVNUQmluYXJ5RXhwcmVzc2lvbigpOwotCQkJZWxzZVN3aXRjaENvbmRFLnNldE9wZXJhdG9yKElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2Fzc2lnbik7Ci0JCQllbHNlU3dpdGNoQ29uZEUuc2V0T3BlcmFuZDEoZWxzZVN3aXRjaENvbmRJRCk7Ci0JCQllbHNlU3dpdGNoQ29uZEUuc2V0T3BlcmFuZDIoY2FzZVN0bXQuZ2V0RXhwcmVzc2lvbigpKTsKLQkJCWVsc2VTd2l0Y2hDb25kSUQuc2V0UGFyZW50KGVsc2VTd2l0Y2hDb25kRSk7Ci0JCQljYXNlU3RtdC5nZXRFeHByZXNzaW9uKCkuc2V0UGFyZW50KGVsc2VTd2l0Y2hDb25kRSk7Ci0JCQkKLQkJCUlBU1RFeHByZXNzaW9uU3RhdGVtZW50IGVsc2VTd2l0Y2hDb25kU3RtdCA9IG5ldyBDQVNURXhwcmVzc2lvblN0YXRlbWVudCgpOwotCQkJZWxzZVN3aXRjaENvbmRTdG10LnNldEV4cHJlc3Npb24oZWxzZVN3aXRjaENvbmRFKTsKLQkJCWVsc2VTd2l0Y2hDb25kRS5zZXRQYXJlbnQoZWxzZVN3aXRjaENvbmRTdG10KTsKLQkJCQotCQkJSUFTVElmU3RhdGVtZW50IG5ld0lmU3RtdCA9IG5ldyBDQVNUSWZTdGF0ZW1lbnQoKTsKLQkJCW5ld0lmU3RtdC5zZXRDb25kaXRpb25FeHByZXNzaW9uKGNvbmRFKTsKLQkJCW5ld0lmU3RtdC5zZXRUaGVuQ2xhdXNlKGlmVGhlbkJvZHkpOwotCQkJbmV3SWZTdG10LnNldEVsc2VDbGF1c2UoZWxzZVN3aXRjaENvbmRTdG10KTsKLQkJCWNvbmRFLnNldFBhcmVudChuZXdJZlN0bXQpOwotCQkJaWZUaGVuQm9keS5zZXRQYXJlbnQobmV3SWZTdG10KTsKLQkJCQotCQkJbmV3UGFyZW50U3RtdC5hZGRTdGF0ZW1lbnQobmV3SWZTdG10KTsKLQkJCW5ld0lmU3RtdC5zZXRQYXJlbnQobmV3UGFyZW50U3RtdCk7Ci0JCQkvKiBlbmQgbWFraW5nIG5ldyBpZiBzdGF0ZW1lbnQgKi8KLQkJCQotCQkJLyogbWFrZSBuZXcgc3dpdGNoIGNvbmRpdGlvbiAqLwotCQkJSUFTVE5hbWUgc3dpdGNoQ29uZE5hbWUgPSBuZXcgQ0FTVE5hbWUoc3dpdGNodmFyLnRvQ2hhckFycmF5KCkpOwotCQkJSUFTVElkRXhwcmVzc2lvbiBzd2l0Y2hDb25kSUQgPSBuZXcgQ0FTVElkRXhwcmVzc2lvbigpOwotCQkJc3dpdGNoQ29uZElELnNldE5hbWUoc3dpdGNoQ29uZE5hbWUpOwotCQkJc3dpdGNoQ29uZE5hbWUuc2V0UGFyZW50KHN3aXRjaENvbmRJRCk7Ci0JCQkKLQkJCSgoQ0FTVFN3aXRjaFN0YXRlbWVudCllbmNsb3NpbmdTdG10KS5yZXBsYWNlKG9sZFN3aXRjaENvbmRFLCBzd2l0Y2hDb25kSUQpOwotCQkJLyogZW5kIG1ha2UgbmV3IHN3aXRjaCBjb25kaXRpb24gKi8KLQkJCQotCQkJLyogbWFrZSBuZXcgc3dpdGNoIGJvZHkgKi8KLQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBuZXdTd2l0Y2hCb2R5ID0gbmV3IENBU1RDb21wb3VuZFN0YXRlbWVudCgpOwotCQkJSUFTVFN0YXRlbWVudCBvbGRTd2l0Y2hCb2R5ID0gKChJQVNUU3dpdGNoU3RhdGVtZW50KWVuY2xvc2luZ1N0bXQpLmdldEJvZHkoKTsKLQkJCUlBU1RTdGF0ZW1lbnRbXSBvbGRTd2l0Y2hCb2R5U3RtdHMgPSAoKElBU1RDb21wb3VuZFN0YXRlbWVudClvbGRTd2l0Y2hCb2R5KS5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpPG9sZFN3aXRjaEJvZHlTdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYob2xkU3dpdGNoQm9keVN0bXRzW2ldICE9IGNhc2VTdG10KXsKLQkJCQkJbmV3U3dpdGNoQm9keS5hZGRTdGF0ZW1lbnQob2xkU3dpdGNoQm9keVN0bXRzW2ldKTsKLQkJCQkJb2xkU3dpdGNoQm9keVN0bXRzW2ldLnNldFBhcmVudChuZXdTd2l0Y2hCb2R5KTsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdTd2l0Y2hCb2R5LmFkZFN0YXRlbWVudChjYXNlU3RtdCk7Ci0JCQkJCWNhc2VTdG10LnNldFBhcmVudChuZXdTd2l0Y2hCb2R5KTsKLQkJCQkJSUFTVFN0YXRlbWVudCBuZXdHb3RvUyA9IG1ha2VOZXdHb3RvSWZTdG10KGxhYmVsbmFtZSwgZ290b1MpOwotCQkJCQluZXdTd2l0Y2hCb2R5LmFkZFN0YXRlbWVudChuZXdHb3RvUyk7Ci0JCQkJCW5ld0dvdG9TLnNldFBhcmVudChuZXdTd2l0Y2hCb2R5KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCSgoQ0FTVFN3aXRjaFN0YXRlbWVudCllbmNsb3NpbmdTdG10KS5yZXBsYWNlKG9sZFN3aXRjaEJvZHksIG5ld1N3aXRjaEJvZHkpOwotCQkJCi0JCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChlbmNsb3NpbmdTdG10KTsKLQkJCWVuY2xvc2luZ1N0bXQuc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJCi0JCQlmb3IoaW50IGkgPSBzd2l0Y2hpbmRleCsxOyBpPHN0bXRzLmxlbmd0aDsgaSsrKXsKLQkJCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJc3RtdHNbaV0uc2V0UGFyZW50KG5ld1BhcmVudFN0bXQpOwotCQkJfQotCQkJcmVwbGFjZVN0YXRlbWVudCgoSUFTVFN0YXRlbWVudClwYXJlbnQsIG5ld1BhcmVudFN0bXQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsaWZ0aW5nKElBU1RHb3RvU3RhdGVtZW50IGdvdG9TKXsKLQkJSUFTVElmU3RhdGVtZW50IGdvdG9JZlN0bXQgPSAoSUFTVElmU3RhdGVtZW50KWdvdG9TLmdldFBhcmVudCgpOwotCQlTdHJpbmcgbGFiZWxuYW1lID0gImdvdG9fIiArIGdvdG9TLmdldE5hbWUoKS50b1N0cmluZygpOwotCQlJQVNUTGFiZWxTdGF0ZW1lbnQgbGFiZWwgPSBmaW5kTGFiZWwoZ290b1MpOwotCQlJQVNUU3RhdGVtZW50IGVuY2xvc2luZ1N0bXQgPSBudWxsOwotCi0JCUlBU1ROb2RlIHBhcmVudCA9IGxhYmVsLmdldFBhcmVudCgpOwotCQl3aGlsZSghKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pKXsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCB8fCAKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCB8fAotCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQgfHwKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCB8fAotCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJCWVuY2xvc2luZ1N0bXQgPSAoSUFTVFN0YXRlbWVudClwYXJlbnQ7Ci0JCQl9Ci0JCQlpZihwYXJlbnQgPT0gZ290b0lmU3RtdC5nZXRQYXJlbnQoKSkgYnJlYWs7Ci0JCQllbHNlewotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJfQotCQkKLQkJLyogcGFyZW50IHNob3VsZCBiZSBhIENvbXBvdW5kU3RhdGVtZW50ICovCi0JCUlBU1RTdGF0ZW1lbnRbXSBzdG10cyA9ICgoSUFTVENvbXBvdW5kU3RhdGVtZW50KXBhcmVudCkuZ2V0U3RhdGVtZW50cygpOwotCQlpbnQgbGFiZWxpbmRleCA9IC0xOwotCQlpbnQgZ290b2luZGV4ID0gLTE7Ci0JCWZvcihpbnQgaT0wOyBpPHN0bXRzLmxlbmd0aDsgaSsrKXsKLQkJCWlmKHN0bXRzW2ldID09IGVuY2xvc2luZ1N0bXQpIGxhYmVsaW5kZXggPSBpOwotCQkJZWxzZSBpZihzdG10c1tpXSA9PSBnb3RvSWZTdG10KSBnb3RvaW5kZXggPSBpOwotCQl9Ci0JCQotCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbmV3UGFyZW50U3RtdCA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJZm9yKGludCBpPTA7IGk8bGFiZWxpbmRleDsgaSsrKXsKLQkJCW5ld1BhcmVudFN0bXQuYWRkU3RhdGVtZW50KHN0bXRzW2ldKTsKLQkJCXN0bXRzW2ldLnNldFBhcmVudChuZXdQYXJlbnRTdG10KTsKLQkJfQotCQkKLQkJLyogbWFrZSB0aGUgZG8gbG9vcCAqLwotCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbG9vcGJvZHkgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCUlBU1RTdGF0ZW1lbnQgaWZTdG10ID0gbWFrZU5ld0dvdG9JZlN0bXQobGFiZWxuYW1lLCBnb3RvUyk7Ci0JCWxvb3Bib2R5LmFkZFN0YXRlbWVudChpZlN0bXQpOwotCQlpZlN0bXQuc2V0UGFyZW50KGxvb3Bib2R5KTsKLQkJCi0JCWZvcihpbnQgaT1sYWJlbGluZGV4OyBpPGdvdG9pbmRleDsgaSsrKXsKLQkJCWxvb3Bib2R5LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQlzdG10c1tpXS5zZXRQYXJlbnQobG9vcGJvZHkpOwotCQl9Ci0JCQotCQlJQVNUU3RhdGVtZW50IGdvdG9JZkNvbmRTdG10ID0gbWFrZUdvdG9JZkNvbmRTdG9yZVN0bXQoZ290b0lmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIGxhYmVsbmFtZSk7Ci0JCWxvb3Bib2R5LmFkZFN0YXRlbWVudChnb3RvSWZDb25kU3RtdCk7Ci0JCWdvdG9JZkNvbmRTdG10LnNldFBhcmVudChsb29wYm9keSk7Ci0JCQotCQlJQVNUTmFtZSBjb25kbmFtZSA9IG5ldyBDQVNUTmFtZShsYWJlbG5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCUlBU1RJZEV4cHJlc3Npb24gY29uZElEID0gbmV3IENBU1RJZEV4cHJlc3Npb24oKTsKLQkJY29uZElELnNldE5hbWUoY29uZG5hbWUpOwotCQljb25kbmFtZS5zZXRQYXJlbnQoY29uZElEKTsKLQkJCi0JCUlBU1REb1N0YXRlbWVudCBkb1N0bXQgPSBuZXcgQ0FTVERvU3RhdGVtZW50KCk7Ci0JCWRvU3RtdC5zZXRCb2R5KGxvb3Bib2R5KTsKLQkJZG9TdG10LnNldENvbmRpdGlvbihjb25kSUQpOwotCQlsb29wYm9keS5zZXRQYXJlbnQoZG9TdG10KTsKLQkJY29uZElELnNldFBhcmVudChkb1N0bXQpOwotCQkvKiBlbmQgbWFrZSB0aGUgZG8gbG9vcCAqLwotCQkKLQkJbmV3UGFyZW50U3RtdC5hZGRTdGF0ZW1lbnQoZG9TdG10KTsKLQkJZG9TdG10LnNldFBhcmVudChuZXdQYXJlbnRTdG10KTsKLQkJCi0JCWZvcihpbnQgaT1nb3RvaW5kZXgrMTsgaTxzdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQluZXdQYXJlbnRTdG10LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQlzdG10c1tpXS5zZXRQYXJlbnQobmV3UGFyZW50U3RtdCk7Ci0JCX0KLQkJCi0JCXJlcGxhY2VTdGF0ZW1lbnQoKElBU1RTdGF0ZW1lbnQpcGFyZW50LCBuZXdQYXJlbnRTdG10KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVsaW1pbmF0aW5nR290byhJQVNUR290b1N0YXRlbWVudCBnb3RvUyl7Ci0JCS8qIGdvdG9TIGFuZCBsYWJlbCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBwYXJlbnQsIGFuZCB0aGUgcGFyZW50Ci0JCSAqIHNob3VsZCBiZSBhIGNvbXBvdW5kU3RhdGVtZW50Ci0JCSAqLwotCQlJQVNUTGFiZWxTdGF0ZW1lbnQgbGFiZWwgPSBmaW5kTGFiZWwoZ290b1MpOwotCQlJQVNUSWZTdGF0ZW1lbnQgZ290b0lmU3RtdCA9IChJQVNUSWZTdGF0ZW1lbnQpZ290b1MuZ2V0UGFyZW50KCk7Ci0JCUlBU1RDb21wb3VuZFN0YXRlbWVudCBwYXJlbnQgPSAoSUFTVENvbXBvdW5kU3RhdGVtZW50KWdvdG9TLmdldFBhcmVudCgpOwotCQlJQVNUU3RhdGVtZW50W10gc3RtdHMgPSBwYXJlbnQuZ2V0U3RhdGVtZW50cygpOwotCQlpbnQgZ290b2luZGV4ID0gLTE7Ci0JCWludCBsYWJlbGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaT0wOyBpPHN0bXRzLmxlbmd0aDsgaSsrKXsKLQkJCWlmKHN0bXRzW2ldID09IGdvdG9JZlN0bXQpIGdvdG9pbmRleCA9IGk7Ci0JCQllbHNlIGlmKHN0bXRzW2ldID09IGxhYmVsKSBsYWJlbGluZGV4ID0gaTsKLQkJfQotCQkKLQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IG5ld0NvbXBTID0gbmV3IENBU1RDb21wb3VuZFN0YXRlbWVudCgpOwotCQlpZihnb3RvaW5kZXggPCBsYWJlbGluZGV4KXsKLQkJCWZvcihpbnQgaT0wOyBpPGdvdG9pbmRleDsgaSsrKXsKLQkJCQluZXdDb21wUy5hZGRTdGF0ZW1lbnQoc3RtdHNbaV0pOwotCQkJCXN0bXRzW2ldLnNldFBhcmVudChuZXdDb21wUyk7Ci0JCQl9Ci0JCQlpZihsYWJlbGluZGV4IC0gZ290b2luZGV4ID4gMSl7Ci0JCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IG5ld0lmQm9keSA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCQlmb3IoaW50IGk9Z290b2luZGV4KzE7IGk8bGFiZWxpbmRleDsgaSsrKXsKLQkJCQkJbmV3SWZCb2R5LmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJCXN0bXRzW2ldLnNldFBhcmVudChuZXdJZkJvZHkpOwotCQkJCX0KLQkJCQlJQVNUVW5hcnlFeHByZXNzaW9uIG5ld0NvbmRFID0gbmV3IENBU1RVbmFyeUV4cHJlc3Npb24oKTsKLQkJCQluZXdDb25kRS5zZXRPcGVyYXRvcihJQVNUVW5hcnlFeHByZXNzaW9uLm9wX25vdCk7Ci0JCQkJbmV3Q29uZEUuc2V0T3BlcmFuZChnb3RvSWZTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSk7Ci0JCQkJZ290b0lmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCkuc2V0UGFyZW50KG5ld0NvbmRFKTsKLQkJCQkKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgbmV3SWZTID0gbmV3IENBU1RJZlN0YXRlbWVudCgpOwotCQkJCW5ld0lmUy5zZXRDb25kaXRpb25FeHByZXNzaW9uKG5ld0NvbmRFKTsKLQkJCQluZXdJZlMuc2V0VGhlbkNsYXVzZShuZXdJZkJvZHkpOwotCQkJCW5ld0lmUy5zZXRFbHNlQ2xhdXNlKG51bGwpOwotCQkJCW5ld0lmQm9keS5zZXRQYXJlbnQobmV3SWZTKTsKLQkJCQluZXdDb25kRS5zZXRQYXJlbnQobmV3SWZTKTsKLQkJCQkKLQkJCQluZXdDb21wUy5hZGRTdGF0ZW1lbnQobmV3SWZTKTsKLQkJCQluZXdJZlMuc2V0UGFyZW50KG5ld0NvbXBTKTsKLQkJCX0KLQkJCQotCQkJZm9yKGludCBpPWxhYmVsaW5kZXg7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCW5ld0NvbXBTLmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJc3RtdHNbaV0uc2V0UGFyZW50KG5ld0NvbXBTKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy9nb3RvUyBvY2N1cnMgbGF0ZXIgdGhhbiBsYWJlbAotCQkJZm9yKGludCBpPTA7IGk8bGFiZWxpbmRleDsgaSsrKXsKLQkJCQluZXdDb21wUy5hZGRTdGF0ZW1lbnQoc3RtdHNbaV0pOwotCQkJCXN0bXRzW2ldLnNldFBhcmVudChuZXdDb21wUyk7Ci0JCQl9Ci0KLQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBsb29wYm9keSA9IG5ldyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQoKTsKLQkJCWxvb3Bib2R5LmFkZFN0YXRlbWVudChsYWJlbCk7Ci0JCQlsYWJlbC5zZXRQYXJlbnQobG9vcGJvZHkpOwotCQkJZm9yKGludCBpPWxhYmVsaW5kZXgrMTsgaTxnb3RvaW5kZXg7IGkrKyl7Ci0JCQkJbG9vcGJvZHkuYWRkU3RhdGVtZW50KHN0bXRzW2ldKTsKLQkJCQlzdG10c1tpXS5zZXRQYXJlbnQobG9vcGJvZHkpOwotCQkJfQotCQkJCi0JCQlJQVNURG9TdGF0ZW1lbnQgbmV3TG9vcFMgPSBuZXcgQ0FTVERvU3RhdGVtZW50KCk7Ci0JCQluZXdMb29wUy5zZXRCb2R5KGxvb3Bib2R5KTsKLQkJCW5ld0xvb3BTLnNldENvbmRpdGlvbihnb3RvSWZTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSk7Ci0JCQlsb29wYm9keS5zZXRQYXJlbnQobmV3TG9vcFMpOwotCQkJZ290b0lmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCkuc2V0UGFyZW50KG5ld0xvb3BTKTsKLQkJCQotCQkJbmV3Q29tcFMuYWRkU3RhdGVtZW50KG5ld0xvb3BTKTsKLQkJCW5ld0xvb3BTLnNldFBhcmVudChuZXdDb21wUyk7Ci0JCQkKLQkJCWZvcihpbnQgaT1nb3RvaW5kZXgrMTsgaTxzdG10cy5sZW5ndGg7IGkrKyl7Ci0JCQkJbmV3Q29tcFMuYWRkU3RhdGVtZW50KHN0bXRzW2ldKTsKLQkJCQlzdG10c1tpXS5zZXRQYXJlbnQobmV3Q29tcFMpOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VTdGF0ZW1lbnQocGFyZW50LCBuZXdDb21wUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbGltaW5hdGluZ1N0YXRlbWVudChJQVNUU3RhdGVtZW50IHN0bXQpewotCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KXsKLQkJCUlBU1RTdGF0ZW1lbnRbXSBzdG10cyA9ICgoSUFTVENvbXBvdW5kU3RhdGVtZW50KXN0bXQpLmdldFN0YXRlbWVudHMoKTsKLQkJCWludCB2YWxpZFN0bXQgPSAwOwotCQkJZm9yKGludCBpPTA7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCWlmKHN0bXRzW2ldICE9IG51bGwpIHZhbGlkU3RtdCArKzsKLQkJCX0KLQkJCWlmKHZhbGlkU3RtdCA9PSAwKXsgLy8gbm8gdmFsaWQgc3RhdGVtZW50Ci0JCQkJcmVwbGFjZVN0YXRlbWVudChzdG10LCBudWxsKTsKLQkJCQllbGltaW5hdGluZ1N0YXRlbWVudCgoSUFTVFN0YXRlbWVudClzdG10LmdldFBhcmVudCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYodmFsaWRTdG10IDwgc3RtdHMubGVuZ3RoKXsgLy8gc29tZSBzdGF0ZW1lbnRzIGFyZSBub3QgdmFsaWQKLQkJCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbmV3Q29tcFMgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCQkJZm9yKGludCBpPTA7IGk8c3RtdHMubGVuZ3RoOyBpKyspewotCQkJCQlpZihzdG10c1tpXSAhPSBudWxsKXsKLQkJCQkJCW5ld0NvbXBTLmFkZFN0YXRlbWVudChzdG10c1tpXSk7Ci0JCQkJCQlzdG10c1tpXS5zZXRQYXJlbnQobmV3Q29tcFMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlcGxhY2VTdGF0ZW1lbnQoc3RtdCwgbmV3Q29tcFMpOwotCQkJfQotCQkJCi0JCX0gZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCUlBU1REb1N0YXRlbWVudCBkb1MgPSAoSUFTVERvU3RhdGVtZW50KXN0bXQ7Ci0JCQlpZihkb1MuZ2V0Qm9keSgpID09IG51bGwgJiYgZG9TLmdldENvbmRpdGlvbigpID09IG51bGwpewotCQkJCXJlcGxhY2VTdGF0ZW1lbnQoc3RtdCwgbnVsbCk7Ci0JCQkJZWxpbWluYXRpbmdTdGF0ZW1lbnQoKElBU1RTdGF0ZW1lbnQpc3RtdC5nZXRQYXJlbnQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCl7Ci0JCQkKLQkJfSBlbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJSUFTVElmU3RhdGVtZW50IGlmUyA9IChJQVNUSWZTdGF0ZW1lbnQpc3RtdDsKLQkJCWlmKGlmUy5nZXRUaGVuQ2xhdXNlKCkgPT0gbnVsbCAmJiBpZlMuZ2V0RWxzZUNsYXVzZSgpID09IG51bGwpewotCQkJCXJlcGxhY2VTdGF0ZW1lbnQoc3RtdCwgbnVsbCk7Ci0JCQkJZWxpbWluYXRpbmdTdGF0ZW1lbnQoKElBU1RTdGF0ZW1lbnQpc3RtdC5nZXRQYXJlbnQoKSk7Ci0JCQl9IGVsc2UgaWYoaWZTLmdldFRoZW5DbGF1c2UoKSA9PSBudWxsICYmIGlmUy5nZXRFbHNlQ2xhdXNlKCkgIT0gbnVsbCl7Ci0JCQkJSUFTVElmU3RhdGVtZW50IG5ld0lmUyA9IG5ldyBDQVNUSWZTdGF0ZW1lbnQoKTsKLQkJCQlJQVNUVW5hcnlFeHByZXNzaW9uIG5ld0NvbmRFID0gbmV3IENBU1RVbmFyeUV4cHJlc3Npb24oKTsKLQkJCQluZXdDb25kRS5zZXRPcGVyYXRvcihJQVNUVW5hcnlFeHByZXNzaW9uLm9wX25vdCk7Ci0JCQkJbmV3Q29uZEUuc2V0T3BlcmFuZChpZlMuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpKTsKLQkJCQlpZlMuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLnNldFBhcmVudChuZXdDb25kRSk7Ci0JCQkJCi0JCQkJbmV3SWZTLnNldENvbmRpdGlvbkV4cHJlc3Npb24obmV3Q29uZEUpOwotCQkJCW5ld0lmUy5zZXRUaGVuQ2xhdXNlKGlmUy5nZXRFbHNlQ2xhdXNlKCkpOwotCQkJCW5ld0lmUy5zZXRFbHNlQ2xhdXNlKG51bGwpOwotCQkJCWlmUy5nZXRFbHNlQ2xhdXNlKCkuc2V0UGFyZW50KG5ld0lmUyk7Ci0JCQkJbmV3Q29uZEUuc2V0UGFyZW50KG5ld0lmUyk7Ci0JCQkJCi0JCQkJcmVwbGFjZVN0YXRlbWVudChpZlMsIG5ld0lmUyk7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUTGFiZWxTdGF0ZW1lbnQpewotCQkJSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsUyA9IChJQVNUTGFiZWxTdGF0ZW1lbnQpc3RtdDsKLQkJCUlBU1RTdGF0ZW1lbnQgbmVzdGVkUyA9IGxhYmVsUy5nZXROZXN0ZWRTdGF0ZW1lbnQoKTsKLQkJCWlmKG5lc3RlZFMgPT0gbnVsbCl7Ci0JCQkJcmVwbGFjZVN0YXRlbWVudChzdG10LCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVwbGFjZVN0YXRlbWVudChzdG10LCBuZXN0ZWRTKTsKLQkJCX0KLQkJCWVsaW1pbmF0aW5nU3RhdGVtZW50KChJQVNUU3RhdGVtZW50KXN0bXQuZ2V0UGFyZW50KCkpOwotCQl9IGVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJCi0JCX0gZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQotCQl9IGVsc2UgewotCQkJCi0JCX0KLQl9Ci0JCi0JLyogcmV0dXJuIHN0YXRlbWVudCAibGFiZWxuYW1lID0gY29uZDsiICovCi0JcHJpdmF0ZSBJQVNUU3RhdGVtZW50IG1ha2VHb3RvSWZDb25kU3RvcmVTdG10KElBU1RFeHByZXNzaW9uIGNvbmQsIFN0cmluZyBsYWJlbG5hbWUpewotCQlJQVNUTmFtZSBhc3NpZ25OYW1lID0gbmV3IENBU1ROYW1lKGxhYmVsbmFtZS50b0NoYXJBcnJheSgpKTsKLQkJSUFTVElkRXhwcmVzc2lvbiBhc3NpZ25JRCA9IG5ldyBDQVNUSWRFeHByZXNzaW9uKCk7Ci0JCWFzc2lnbklELnNldE5hbWUoYXNzaWduTmFtZSk7Ci0JCWFzc2lnbk5hbWUuc2V0UGFyZW50KGFzc2lnbklEKTsKLQkJCi0JCUlBU1RCaW5hcnlFeHByZXNzaW9uIGFzc2lnbkUgPSBuZXcgQ0FTVEJpbmFyeUV4cHJlc3Npb24oKTsKLQkJYXNzaWduRS5zZXRPcGVyYW5kMShhc3NpZ25JRCk7Ci0JCWFzc2lnbkUuc2V0T3BlcmFuZDIoY29uZCk7Ci0JCWFzc2lnbkUuc2V0T3BlcmF0b3IoSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfYXNzaWduKTsKLQkJYXNzaWduSUQuc2V0UGFyZW50KGFzc2lnbkUpOwotCQljb25kLnNldFBhcmVudChhc3NpZ25FKTsKLQkJCi0JCUlBU1RFeHByZXNzaW9uU3RhdGVtZW50IGFzc2lnblMgPSBuZXcgQ0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQoKTsKLQkJYXNzaWduUy5zZXRFeHByZXNzaW9uKGFzc2lnbkUpOwotCQlhc3NpZ25FLnNldFBhcmVudChhc3NpZ25TKTsKLQkJCi0JCXJldHVybiBhc3NpZ25TOwotCX0KLQkKLQlwcml2YXRlIElBU1RTdGF0ZW1lbnQgbWFrZU5ld0dvdG9JZlN0bXQoU3RyaW5nIGxhYmVsbmFtZSwgCi0JCQkJCQlJQVNUR290b1N0YXRlbWVudCBnb3RvUyl7Ci0JCUlBU1ROYW1lIGNvbmRuYW1lID0gbmV3IENBU1ROYW1lKGxhYmVsbmFtZS50b0NoYXJBcnJheSgpKTsKLQkJSUFTVElkRXhwcmVzc2lvbiBjb25kRSA9IG5ldyBDQVNUSWRFeHByZXNzaW9uKCk7Ci0JCWNvbmRFLnNldE5hbWUoY29uZG5hbWUpOwotCQljb25kbmFtZS5zZXRQYXJlbnQoY29uZEUpOwotCQkKLQkJSUFTVElmU3RhdGVtZW50IG5ld2lmU3RtdCA9IG5ldyBDQVNUSWZTdGF0ZW1lbnQoKTsKLQkJbmV3aWZTdG10LnNldENvbmRpdGlvbkV4cHJlc3Npb24oY29uZEUpOwotCQluZXdpZlN0bXQuc2V0VGhlbkNsYXVzZShnb3RvUyk7Ci0JCW5ld2lmU3RtdC5zZXRFbHNlQ2xhdXNlKG51bGwpOwotCQljb25kRS5zZXRQYXJlbnQobmV3aWZTdG10KTsKLQkJZ290b1Muc2V0UGFyZW50KG5ld2lmU3RtdCk7Ci0JCQotCQlyZXR1cm4gbmV3aWZTdG10OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVwbGFjZVN0YXRlbWVudChJQVNUU3RhdGVtZW50IG9sZFMsIElBU1RTdGF0ZW1lbnQgbmV3Uyl7Ci0JCUlBU1ROb2RlIHBhcmVudCA9IG9sZFMuZ2V0UGFyZW50KCk7Ci0JCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCl7Ci0JCQlDQVNUQ29tcG91bmRTdGF0ZW1lbnQgY29tcFMgPSAoQ0FTVENvbXBvdW5kU3RhdGVtZW50KXBhcmVudDsKLQkJCWNvbXBTLnJlcGxhY2Uob2xkUywgbmV3Uyk7Ci0JCX0KLQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQpewotCQkJQ0FTVERvU3RhdGVtZW50IGRvUyA9IChDQVNURG9TdGF0ZW1lbnQpcGFyZW50OwotCQkJZG9TLnJlcGxhY2Uob2xkUywgbmV3Uyk7Ci0JCX0KLQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCUNBU1RGb3JTdGF0ZW1lbnQgZm9yUyA9IChDQVNURm9yU3RhdGVtZW50KXBhcmVudDsKLQkJCWZvclMucmVwbGFjZShvbGRTLCBuZXdTKTsKLQkJfQotCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQlDQVNUSWZTdGF0ZW1lbnQgaWZTID0gKENBU1RJZlN0YXRlbWVudClwYXJlbnQ7Ci0JCQlpZlMucmVwbGFjZShvbGRTLCBuZXdTKTsKLQkJfQotCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJQ0FTVFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTID0gKENBU1RTd2l0Y2hTdGF0ZW1lbnQpcGFyZW50OwotCQkJc3dpdGNoUy5yZXBsYWNlKG9sZFMsIG5ld1MpOwotCQl9Ci0JCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCUNBU1RXaGlsZVN0YXRlbWVudCB3aGlsZVMgPSAoQ0FTVFdoaWxlU3RhdGVtZW50KXBhcmVudDsKLQkJCXdoaWxlUy5yZXBsYWNlKG9sZFMsIG5ld1MpOwotCQl9Ci0JfQotCQotCS8qIGFwcGVuZCAic3RtdCIgcmlnaHQgYWZ0ZXIgdGhlICJwcmV2IiAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRTdGF0ZW1lbnQoSUFTVFN0YXRlbWVudCBzdG10LCBJQVNUU3RhdGVtZW50IHByZXYpewotCQlJQVNUQ29tcG91bmRTdGF0ZW1lbnQgbmV3Y29tcFMgPSBuZXcgQ0FTVENvbXBvdW5kU3RhdGVtZW50KCk7Ci0JCW5ld2NvbXBTLmFkZFN0YXRlbWVudChwcmV2KTsKLQkJbmV3Y29tcFMuYWRkU3RhdGVtZW50KHN0bXQpOwotCQlwcmV2LnNldFBhcmVudChuZXdjb21wUyk7Ci0JCXN0bXQuc2V0UGFyZW50KG5ld2NvbXBTKTsKLQkJcmVwbGFjZVN0YXRlbWVudChwcmV2LCBuZXdjb21wUyk7Ci0JfQotCQotCQotCXByaXZhdGUgaW50IExldmVsKElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUlBU1ROb2RlIHBhcmVudCA9IHN0bXQuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlKCEgKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pKXsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCB8fCAKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCB8fAotCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQgfHwKLQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50IHx8Ci0JCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpCi0JCQkJY291bnQgKys7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQkKLQkvKiByZXR1cm4gdHJ1ZSBpZiBnb3RvUyBoYXMgbG93ZXIgb2Zmc2V0IHRoYW4gbGFiZWwsIGZhbHNlIG90aGVyd2lzZSAqLwotCXByaXZhdGUgYm9vbGVhbiBPZmZzZXQoSUFTVEdvdG9TdGF0ZW1lbnQgZ290b1MsIElBU1RMYWJlbFN0YXRlbWVudCBsYWJlbCl7Ci0JCU9mZnNldENhbGN1bGF0b3Igb2MgPSBuZXcgT2Zmc2V0Q2FsY3VsYXRvcihjdXJyZW50Tm9kZV8sIGdvdG9TLCBsYWJlbCk7Ci0JCXJldHVybiBvYy5nb3RvQkZsYWJlbCgpOwotCX0KLQkKLQkKLQljbGFzcyBHb3RvTGFiZWxDb2xsZWN0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yewotCQlwcml2YXRlIElDYWxsR3JhcGhOb2RlIG5vZGVfOwotCQlwcml2YXRlIExpbmtlZExpc3Q8SUFTVFN0YXRlbWVudD4gZ290b0xpc3RfOwotCQlwcml2YXRlIExpbmtlZExpc3Q8SUFTVFN0YXRlbWVudD4gbGFiZWxMaXN0XzsKLQkJCi0JCXB1YmxpYyBHb3RvTGFiZWxDb2xsZWN0b3IoSUNhbGxHcmFwaE5vZGUgbm9kZSl7Ci0JCQlub2RlXyA9IG5vZGU7Ci0JCQlnb3RvTGlzdF8gPSBuZXcgTGlua2VkTGlzdDxJQVNUU3RhdGVtZW50PigpOwotCQkJbGFiZWxMaXN0XyA9IG5ldyBMaW5rZWRMaXN0PElBU1RTdGF0ZW1lbnQ+KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQlJQVNUU3RhdGVtZW50IGJvZHkgPSBub2RlXy5nZXRGdW5jRGVmKCkuZ2V0Qm9keSgpOwotCQkJYm9keS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUR290b1N0YXRlbWVudCkKLQkJCQlnb3RvTGlzdF8uYWRkKHN0bXQpOwotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVExhYmVsU3RhdGVtZW50KQotCQkJCWxhYmVsTGlzdF8uYWRkKHN0bXQpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaW5rZWRMaXN0IGdldEdvdG9MaXN0KCl7cmV0dXJuIGdvdG9MaXN0Xzt9Ci0JCXB1YmxpYyBMaW5rZWRMaXN0IGdldExhYmVsTGlzdCgpIHtyZXR1cm4gbGFiZWxMaXN0Xzt9Ci0JfQotCQotCWNsYXNzIE9mZnNldENhbGN1bGF0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yewotCQlwcml2YXRlIElDYWxsR3JhcGhOb2RlIG5vZGVfOwotCQlwcml2YXRlIElBU1RHb3RvU3RhdGVtZW50IGdvdG9TXzsKLQkJcHJpdmF0ZSBJQVNUTGFiZWxTdGF0ZW1lbnQgbGFiZWxTXzsKLQkJcHJpdmF0ZSBpbnQgZ290b01ldDsKLQkJcHJpdmF0ZSBpbnQgbGFiZWxNZXQ7Ci0JCXByaXZhdGUgaW50IGNvdW50OwotCQkKLQkJcHVibGljIE9mZnNldENhbGN1bGF0b3IoSUNhbGxHcmFwaE5vZGUgbm9kZSwgSUFTVEdvdG9TdGF0ZW1lbnQgZ290b1MsIElBU1RMYWJlbFN0YXRlbWVudCBsYWJlbCl7Ci0JCQlub2RlXyA9IG5vZGU7Ci0JCQlnb3RvU18gPSBnb3RvUzsKLQkJCWxhYmVsU18gPSBsYWJlbDsKLQkJCWdvdG9NZXQgPSAtMTsKLQkJCWxhYmVsTWV0ID0gLTE7Ci0JCQljb3VudCA9IDA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGdvdG9CRmxhYmVsKCl7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQlJQVNUU3RhdGVtZW50IGJvZHkgPSBub2RlXy5nZXRGdW5jRGVmKCkuZ2V0Qm9keSgpOwotCQkJYm9keS5hY2NlcHQodGhpcyk7Ci0JCQlpZihnb3RvTWV0ID09IC0xIHx8IGxhYmVsTWV0ID09IC0xKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdvdG8gb3IgbGFiZWwgbm90IGZvdW5kISIpOwotCQkJfSBlbHNlIGlmKGdvdG9NZXQgPiAxIHx8IGxhYmVsTWV0ID4gMSl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsZSBnb3RvcyBhbmQgbGFiZWxzIGFyZSBtZXQhIik7Ci0JCQl9Ci0JCQlyZXR1cm4gZ290b01ldCA8IGxhYmVsTWV0OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVEdvdG9TdGF0ZW1lbnQgJiYgc3RtdCA9PSBnb3RvU18pewotCQkJCWdvdG9NZXQgPSBjb3VudDsKLQkJCQljb3VudCArKzsKLQkJCX0gZWxzZSBpZiAoc3RtdCBpbnN0YW5jZW9mIElBU1RMYWJlbFN0YXRlbWVudCAmJiBzdG10ID09IGxhYmVsU18pewotCQkJCWxhYmVsTWV0ID0gY291bnQ7Ci0JCQkJY291bnQgKys7Ci0JCQl9Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQmFycmllckFuYWx5c2lzUmVzdWx0cy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCYXJyaWVyQW5hbHlzaXNSZXN1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTIyYWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCYXJyaWVyQW5hbHlzaXNSZXN1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1wdWJsaWMgY2xhc3MgTVBJQmFycmllckFuYWx5c2lzUmVzdWx0cyB7Ci0JcHJvdGVjdGVkIEJhcnJpZXJUYWJsZSBiYXJyaWVyVGFibGVfID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIE1QSUJhcnJpZXJBbmFseXNpc1Jlc3VsdHMgcmVzdWx0c18gPSBudWxsOwotCQotCXB1YmxpYyBNUElCYXJyaWVyQW5hbHlzaXNSZXN1bHRzKCl7Ci0JCXJlc3VsdHNfID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNUElCYXJyaWVyQW5hbHlzaXNSZXN1bHRzIGdldEFuYWx5c2lzUmVzdWx0cygpewotCQlyZXR1cm4gcmVzdWx0c187Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhcnJpZXJUYWJsZShCYXJyaWVyVGFibGUgdGFibGUpewotCQliYXJyaWVyVGFibGVfID0gdGFibGU7Ci0JfQotCQotCXB1YmxpYyBCYXJyaWVyVGFibGUgZ2V0QmFycmllclRhYmxlKCl7Ci0JCXJldHVybiBiYXJyaWVyVGFibGVfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQmFycmllckV4cHIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQmFycmllckV4cHIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2NWMzNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUJhcnJpZXJFeHByLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLklBU1RBbWJpZ3VvdXNFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuSUFTVEFtYmlndW91c1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuQmFycmllckV4cHJlc3Npb24uQmFycmllckV4cHJlc3Npb25PUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotCi1wdWJsaWMgY2xhc3MgTVBJQmFycmllckV4cHIgZXh0ZW5kcyBBU1RWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgQmFycmllclRhYmxlIGJUYWJsZV87Ci0JcHJvdGVjdGVkIElDYWxsR3JhcGggY2dfOwotCS8qIE9uZSBzdGFjayBmb3IgZWFjaCBjb21tdW5pY2F0b3IgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IHN0YWNrc187IAotCQotCXByb3RlY3RlZCBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnROb2RlXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0JCi0JLyogCi0JICogc3dpdGNoIHN0YXRlbWVudCBtYXkgYmUgbmVzdGVkIAotCSAqLwotCXByb3RlY3RlZCBpbnQgZGVwdGggPSAwOwotCQotCS8qIAotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byByZWNvZ25pemUgdGhlIGFzc29jaWF0ZWQgY2FzZSBib2R5LiBUaGUgaWRlYSBpcyAKLQkgKiB0aGUgY2FzZSBib2R5IHNob3VsZCBoYXZlIHRoZSBzYW1lIHBhcmVudCB3aXRoIHRoZSAiY2FzZSIgc3RhdGVtZW50LiAKLQkgKiBPbmUgZWxlbWVudCBpbiB0aGlzIHN0YWNrIGlzIHNoYXJlZCBieSBhbGwgY2FzZXMgKGFuZCBkZWZhdWx0KSBpbiBvbmUgCi0JICogc3dpdGNoIHN0YXRlbWVudC4gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG9mIHRoZSB0cmVlIHN0cnVjdHVyZS4gCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrPElBU1ROb2RlPiBjYXNlUGFyZW50ID0gbnVsbDsKLQkKLQkvKiAKLQkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gcmVjb3JkIHdoZXRoZXIgdGhlIGN1cnJlbnQgY2FzZSBoYXMgImJyZWFrIgotCSAqIHN0YXRlbWVudC4gU2FtZSBhcyBhYm92ZSwgb25lIGVsZW1lbnQgaXMgc2hhcmVkIGJ5IGFsbCBjYXNlcyBhbmQgZGVmYXVsdCAKLQkgKiBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrPEJvb2xlYW4+IHdpdGhCcmVhayA9IG51bGw7Ci0JCi0JLyogRWFjaCBidWNrZXQgaW4gdGhpcyBoYXNodGFibGUgaXMgYSBMaXN0LCBoYXNoZWQgYnkgY29tbXVuaWNhdG9yLgotCSAqIFRoZSBMaXN0IHJlY29yZHMgdGhlIGN1cnJlbnQgYmFycmllciAKLQkgKiBleHByZXNzaW9uIGZvciBlYWNoIGNhc2Ugc3RhdGVtZW50IGluIHRoZSBjdXJyZW50IChuZXN0ZWQpc3dpdGNoIHN0YXRlbWVudC4KLQkgKiBTbzogSGFzaHRhYmxlKGZvciBlYWNoIGNvbW11bmljYXRvcikgLS0+Ci0JICogICAgIFN0YWNrKGZvciBlYWNoIG5lc3RlZCBzd2l0Y2ggc3RhdGVtZW50KSAtLT4KLQkgKiAgICAgQXJyYXlMaXN0KGZvciBlYWNoIGNhc2UgYm9keSkgLS0+IAotCSAqICAgICBUdXBsZShjYXNlU3RhdGVtZW50LCBDYXNlQmFycmllckV4cHIpIAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLFN0YWNrPExpc3Q+PiBjYXNlQkUgPSBudWxsOwotCQotCXB1YmxpYyBNUElCYXJyaWVyRXhwcihCYXJyaWVyVGFibGUgYnRhYmxlLCBJQ2FsbEdyYXBoIGNnKXsKLQkJYlRhYmxlXyA9IGJ0YWJsZTsKLQkJY2dfID0gY2c7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KCl7Ci0JCXN0YWNrc18gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+KCk7Ci0JCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBiVGFibGVfLmdldFRhYmxlKCkua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCXN0YWNrc18ucHV0KGNvbW0sIG5ldyBTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4oKSk7Ci0JCX0KLQkJCi0JCWRlcHRoID0gMDsKLQkJY2FzZVBhcmVudCA9IG5ldyBTdGFjazxJQVNUTm9kZT4oKTsKLQkJd2l0aEJyZWFrID0gbmV3IFN0YWNrPEJvb2xlYW4+KCk7Ci0JCWNhc2VCRSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLFN0YWNrPExpc3Q+PigpOwotCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gYlRhYmxlXy5nZXRUYWJsZSgpLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQljYXNlQkUucHV0KGNvbW0sIG5ldyBTdGFjazxMaXN0PigpKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJaWYoYlRhYmxlXy5pc0VtcHR5KCkpIHJldHVybjsKLQkJdGhpcy5zaG91bGRWaXNpdEV4cHJlc3Npb25zID0gdHJ1ZTsKLQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQl0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJY3VycmVudE5vZGVfID0gKE1QSUNhbGxHcmFwaE5vZGUpbjsKLQkJCWlmKCFjdXJyZW50Tm9kZV8ubWFya2VkKSBjb250aW51ZTsKLQkJCWlmKCFjdXJyZW50Tm9kZV8uYmFycmllclJlbGF0ZWQoKSkgY29udGludWU7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQmFycmllciByZWxhdGVkIGZ1bmN0aW9uICIgKyBjdXJyZW50Tm9kZV8uZ2V0RnVuY05hbWUoKSk7Ci0JCQlpbml0KCk7Ci0JCQlJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZ1bmMgPSBjdXJyZW50Tm9kZV8uZ2V0RnVuY0RlZigpOwotCQkJZnVuYy5hY2NlcHQodGhpcyk7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBiZSA9IHNrLnBvcCgpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKGN1cnJlbnROb2RlXy5nZXRGdW5jTmFtZSgpICsgIigiICsgY29tbSArICIpOiAiICsgYmUucHJldHR5UHJpbnRlcigpKTsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCQkJCWN1cnJlbnROb2RlXy5zZXRCYXJyaWVyRXhwcihjb21tLCBiZSk7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIG51bWJlciBvZiByZXBlYXQgc3VidHJlZXM6ICIgKyBCYXJyaWVyRXhwcmVzc2lvbi5jb3VudF9yZXBlYXQpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgbnVtYmVyIG9mIGJyYW5jaCBzdWJ0cmVlczogIiArIEJhcnJpZXJFeHByZXNzaW9uLmNvdW50X2JyYW5jaCk7Ci0JCSovCi0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBudW1iZXIgb2Ygbm9kZXM6ICIgKyBCYXJyaWVyRXhwcmVzc2lvbi5jb3VudF9ub2RlKTsKLQkJLyoKLQkJQmFycmllckV4cHJlc3Npb24uY291bnRfYnJhbmNoID0gMDsKLQkJQmFycmllckV4cHJlc3Npb24uY291bnRfcmVwZWF0ID0gMDsKLQkJKi8KLQl9Ci0JCi0JcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0bXQpewotCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCl7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8TGlzdD4+IGUgPSBjYXNlQkUuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPExpc3Q+IGNhc2VCRXNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWNhc2VCRXNrLnB1c2gobmV3IEFycmF5TGlzdDxPYmplY3Q+KCkpOwotCQkJfQotCQkJd2l0aEJyZWFrLnB1c2gobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCWRlcHRoICsrOwotCQl9Ci0JCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCX0KLQkKLQlwdWJsaWMgaW50IGxlYXZlKElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIGJlID0gbnVsbDsKLQkJQmFycmllckV4cHJlc3Npb24gb3BlcmFuZDEgPSBudWxsOwotCQlCYXJyaWVyRXhwcmVzc2lvbiBvcGVyYW5kMiA9IG51bGw7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIGNvbmRCRSA9IG51bGw7Ci0JCQotCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVEFtYmlndW91c1N0YXRlbWVudCl7Ci0JCQkKLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQnJlYWtTdGF0ZW1lbnQpewotCQkJSUFTVEJyZWFrU3RhdGVtZW50IGJrU3RtdCA9IChJQVNUQnJlYWtTdGF0ZW1lbnQpc3RtdDsKLQkJCWlmKGluQ2FzZVN0bXQoYmtTdG10KSl7Ci0JCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGNhc2VCRS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJCVN0YWNrPExpc3Q+IGNhc2VCRXNrID0gY2FzZUJFLmdldChjb21tKTsKLQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJCXNrLnB1c2goYmUpOwotCQkJCQlMaXN0IGxpc3QgPSBjYXNlQkVzay5wZWVrKCk7Ci0JCQkJCWZvcihpbnQgaT0xOyBpPGxpc3Quc2l6ZSgpOyBpKz0yKXsKLQkJCQkJCUNhc2VCYXJyaWVyRXhwciBjYmUgPSAoQ2FzZUJhcnJpZXJFeHByKWxpc3QuZ2V0KGkpOwotCQkJCQkJY2JlLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlewotCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBjYXNlQkUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkJc2sucHVzaChiZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDYXNlU3RhdGVtZW50KXsKLQkJCUlBU1RDYXNlU3RhdGVtZW50IGNhc2VTdG10ID0gKElBU1RDYXNlU3RhdGVtZW50KXN0bXQ7Ci0JCQkvKiBPdmVycmlkZSB0aGUgb2xkIHBhcmVudCBpZiBpdCBleGlzdHMgKi8KLQkJCWlmKCFjYXNlUGFyZW50LmVtcHR5KCkpIGNhc2VQYXJlbnQucG9wKCk7Ci0JCQljYXNlUGFyZW50LnB1c2goY2FzZVN0bXQuZ2V0UGFyZW50KCkpOwotCQkJCi0JCQlmb3IoRW51bWVyYXRpb24gZSA9IGNhc2VCRS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotCQkJCVN0YWNrPExpc3Q+IGNhc2VCRXNrID0gY2FzZUJFLmdldChjb21tKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJCUxpc3QgbGlzdCA9IGNhc2VCRXNrLnBlZWsoKTsKLQkJCQlsaXN0LmFkZChjYXNlU3RtdCk7Ci0JCQkJbGlzdC5hZGQobmV3IENhc2VCYXJyaWVyRXhwcihiZSwgY2FzZVN0bXQuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCQl9Ci0JCQkKLQkJCS8qIFRvZ2dsZSB0aGUgd2l0aEJyZWFrIHNpZ24gb2YgdGhlIHByZXZpb3VzIGNhc2UgKi8KLQkJCWlmKCF3aXRoQnJlYWsuZW1wdHkoKSkgd2l0aEJyZWFrLnBvcCgpOwotCQkJd2l0aEJyZWFrLnB1c2gobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29tcG91bmRTdGF0ZW1lbnQpewotCQkJSUFTVENvbXBvdW5kU3RhdGVtZW50IGNtcFN0bXQgPSAoSUFTVENvbXBvdW5kU3RhdGVtZW50KXN0bXQ7Ci0JCQlJQVNUU3RhdGVtZW50IFtdIHMgPSBjbXBTdG10LmdldFN0YXRlbWVudHMoKTsKLQkJCWlmKHMubGVuZ3RoID09IDApIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCi0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkvKiBUaGUgY29uY2F0ZW5hdGUgb3BlcmF0b3IgaXMgbGVmdC1hc3NvY2lhdGl2ZSAqLwotCQkJCWludCBjb3VudCA9IDA7Ci0JCQkJaW50IGk7Ci0JCQkJQmFycmllckV4cHJlc3Npb25bXSBCRWxpc3QgPSBuZXcgQmFycmllckV4cHJlc3Npb25bcy5sZW5ndGhdOwotCQkJCWZvcihpPTA7IGk8cy5sZW5ndGg7IGkrKyl7Ci0JCQkJCWlmKHNbaV0gPT0gbnVsbCkgY29udGludWU7Ci0JCQkJCUJFbGlzdFtjb3VudF0gPSBzay5wb3AoKTsKLQkJCQkJY291bnQgKys7Ci0JCQkJfQotCQkJCW9wZXJhbmQxID0gQkVsaXN0W2NvdW50LTFdOwotCQkJCWZvciAoaSA9IGNvdW50LTI7IGkgPj0gMDsgaS0tICkgewotCQkJCQlvcGVyYW5kMiA9IEJFbGlzdFtpXTsKLQkJCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMSwgb3BlcmFuZDIpOwotCQkJCQlvcGVyYW5kMSA9IGJlOwotCQkJCX0KLQkJCQlzay5wdXNoKG9wZXJhbmQxKTsKLQkJCQlmaXhTd2l0Y2goY29tbSwgY21wU3RtdCwgb3BlcmFuZDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDb250aW51ZVN0YXRlbWVudCl7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gY2FzZUJFLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50KXsKLQkJCWJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJCUlBU1REZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsU3RtdCA9IChJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpc3RtdDsKLQkJCUlBU1REZWNsYXJhdGlvbiBkZWNsID0gZGVjbFN0bXQuZ2V0RGVjbGFyYXRpb24oKTsKLQkJCWlmKGRlY2wgaW5zdGFuY2VvZiBJQVNUU2ltcGxlRGVjbGFyYXRpb24pewotCQkJCUlBU1RTaW1wbGVEZWNsYXJhdGlvbiBzaW1wbGVEZWNsID0gKElBU1RTaW1wbGVEZWNsYXJhdGlvbilkZWNsOwotCQkJCUlBU1REZWNsYXJhdG9yW10gZGVjbGFyYXRvcnMgPSBzaW1wbGVEZWNsLmdldERlY2xhcmF0b3JzKCk7Ci0JCQkJZm9yKGludCBpPTA7IGk8ZGVjbGFyYXRvcnMubGVuZ3RoOyBpKyspewotCQkJCQlJQVNUSW5pdGlhbGl6ZXIgaW5pdCA9IGRlY2xhcmF0b3JzW2ldLmdldEluaXRpYWxpemVyKCk7Ci0JCQkJCWlmKGluaXQgIT0gbnVsbCl7Ci0JCQkJCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkJCQliZSA9IGdldEluaXRpYWxpemVyQkUoc2ssIGluaXQpOwotCQkJCQkJCXNrLnB1c2goYmUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoIWluaXRpYWxpemVkKXsKLQkJCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCQlzay5wdXNoKGJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERlZmF1bHRTdGF0ZW1lbnQpewotCQkJLyogRGVmYXVsdFN0YXRlbWVudCA9IENhc2VTdGF0ZW1lbnQgKyBCcmVha1N0YXRlbWVudCAqLwotCQkJSUFTVERlZmF1bHRTdGF0ZW1lbnQgZGZTdG10ID0gKElBU1REZWZhdWx0U3RhdGVtZW50KXN0bXQ7Ci0JCQkvKiBPdmVycmlkZSB0aGUgb2xkIHBhcmVudCBpZiBpdCBleGlzdHMgKi8KLQkJCWlmKCFjYXNlUGFyZW50LmVtcHR5KCkpIGNhc2VQYXJlbnQucG9wKCk7Ci0JCQljYXNlUGFyZW50LnB1c2goZGZTdG10LmdldFBhcmVudCgpKTsKLQkJCQotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGNhc2VCRS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxMaXN0PiBjYXNlQkVzayA9IGNhc2VCRS5nZXQoY29tbSk7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQlMaXN0IGxpc3QgPSBjYXNlQkVzay5wZWVrKCk7Ci0JCQkJbGlzdC5hZGQoZGZTdG10KTsKLQkJCQlsaXN0LmFkZChuZXcgQ2FzZUJhcnJpZXJFeHByKGJlLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KXsKLQkJCUlBU1REb1N0YXRlbWVudCBkb1N0bXQgPSAoSUFTVERvU3RhdGVtZW50KXN0bXQ7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkvKiBjb25kaXRpb24gKi8KLQkJCQlpZihkb1N0bXQuZ2V0Q29uZGl0aW9uKCkgIT0gbnVsbCkKLQkJCQkJY29uZEJFID0gKEJhcnJpZXJFeHByZXNzaW9uKXNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJY29uZEJFID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJLyogbG9vcCBib2R5ICovCi0JCQkJaWYoZG9TdG10LmdldEJvZHkoKSAhPSBudWxsKQotCQkJCQlvcGVyYW5kMSA9IChCYXJyaWVyRXhwcmVzc2lvbilzay5wb3AoKTsKLQkJCQllbHNlCi0JCQkJCW9wZXJhbmQxID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJLyogQkUgPSBib2R5IC4gY29uZC4gKGJvZHkgLiBjb25kKSogKi8KLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQxLCBjb25kQkUsIAotCQkJCQkJQmFycmllckV4cHJlc3Npb24ucmVwZWF0QkUoCi0JCQkJCQkJQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUob3BlcmFuZDEsIGNvbmRCRSksIAotCQkJCQkJCQlkb1N0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpKTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCQlmaXhTd2l0Y2goY29tbSwgc3RtdCwgYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RFeHByZXNzaW9uU3RhdGVtZW50KXsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBzdGFja3NfLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCWJlID0gc2sucG9wKCk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQkJZml4U3dpdGNoKGNvbW0sIHN0bXQsIGJlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCUlBU1RGb3JTdGF0ZW1lbnQgZm9yU3RtdCA9IChJQVNURm9yU3RhdGVtZW50KXN0bXQ7Ci0JCQlCYXJyaWVyRXhwcmVzc2lvbiBpbml0QkUgPSBudWxsOwotCQkJQmFycmllckV4cHJlc3Npb24gaXRlckJFID0gbnVsbDsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBzdGFja3NfLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCS8qIGxvb3AgYm9keSAqLwotCQkJCWlmKGZvclN0bXQuZ2V0Qm9keSgpICE9IG51bGwpCi0JCQkJCW9wZXJhbmQxID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQlvcGVyYW5kMSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIGl0ZXJhdG9yICovCi0JCQkJaWYoZm9yU3RtdC5nZXRJdGVyYXRpb25FeHByZXNzaW9uKCkgIT0gbnVsbCkKLQkJCQkJaXRlckJFID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQlpdGVyQkUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBjb25kaXRpb24gKi8KLQkJCQlpZihmb3JTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSAhPSBudWxsKQotCQkJCQljb25kQkUgPSBzay5wb3AoKTsKLQkJCQllbHNlCi0JCQkJCWNvbmRCRSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIGluaXRpYWxpemVyICovCi0JCQkJaWYoZm9yU3RtdC5nZXRJbml0aWFsaXplclN0YXRlbWVudCgpICE9IG51bGwpCi0JCQkJCWluaXRCRSA9IHNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJaW5pdEJFID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJLyogQkUgPSBpbml0IC4gY29uZC4gKGJvZHkgLiBpdGVyIC4gY29uZCkqICovCi0JCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShpbml0QkUsIGNvbmRCRSwgCi0JCQkJCQlCYXJyaWVyRXhwcmVzc2lvbi5yZXBlYXRCRSgKLQkJCQkJCQlCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMSwgaXRlckJFLCBjb25kQkUpLCAKLQkJCQkJCQlmb3JTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgc3RtdCkpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJCWZpeFN3aXRjaChjb21tLCBzdG10LCBiZSk7Ci0JCQl9Ci0JCX0gCi0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RHb3RvU3RhdGVtZW50KXsKLQkJCS8qIFRPRE8gKi8KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJSUFTVElmU3RhdGVtZW50IGlmU3RtdCA9IChJQVNUSWZTdGF0ZW1lbnQpc3RtdDsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBzdGFja3NfLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCS8qIGVsc2UgY2xhdXNlICovCi0JCQkJaWYoaWZTdG10LmdldEVsc2VDbGF1c2UoKSAhPSBudWxsKQotCQkJCQlvcGVyYW5kMiA9IHNrLnBvcCgpOwotCQkJCWVsc2UgCi0JCQkJCW9wZXJhbmQyID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJLyogdGhlbiBjbGF1c2UgKi8KLQkJCQlpZihpZlN0bXQuZ2V0VGhlbkNsYXVzZSgpICE9IG51bGwpCi0JCQkJCW9wZXJhbmQxID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQlvcGVyYW5kMSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIGNvbmRpdGlvbiovCi0JCQkJaWYoaWZTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSAhPSBudWxsKQotCQkJCQljb25kQkUgPSBzay5wb3AoKTsKLQkJCQllbHNlCi0JCQkJCWNvbmRCRSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIEJFID0gY29uZC4gKHRoZW4gfCBlbHNlKSAqLwotCQkJCWJlID0gQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUoY29uZEJFLCAKLQkJCQkJCUJhcnJpZXJFeHByZXNzaW9uLmJyYW5jaEJFKG9wZXJhbmQxLCBvcGVyYW5kMiwgCi0JCQkJCQkJaWZTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgc3RtdCkpOwotCQkJCXNrLnB1c2goYmUpOyAJCQotCQkJCWZpeFN3aXRjaChjb21tLCBzdG10LCBiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVExhYmVsU3RhdGVtZW50KXsKLQkJCS8qIFRPRE8gKi8KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUTnVsbFN0YXRlbWVudCl7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFByb2JsZW1TdGF0ZW1lbnQpewotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RSZXR1cm5TdGF0ZW1lbnQpewotCQkJSUFTVFJldHVyblN0YXRlbWVudCByU3RtdCA9IChJQVNUUmV0dXJuU3RhdGVtZW50KXN0bXQ7Ci0JCQlpZihyU3RtdC5nZXRSZXR1cm5WYWx1ZSgpID09IG51bGwpewotCQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCQlzay5wdXNoKGJlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBjYXNlQkUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkJYmUgPSBzay5wb3AoKTsKLQkJCQkJc2sucHVzaChiZSk7Ci0JCQkJCWlmKCF3aXRoQnJlYWsuZW1wdHkoKSl7Ci0JCQkJCQl3aXRoQnJlYWsucG9wKCk7Ci0JCQkJCQl3aXRoQnJlYWsucHVzaChuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCX0KLQkJCQkJZml4U3dpdGNoKGNvbW0sIHJTdG10LCBiZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClzdG10OwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGNhc2VCRS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxMaXN0PiBjYXNlQkVzayA9IGNhc2VCRS5nZXQoY29tbSk7Ci0JCQkJTGlzdCBsaXN0ID0gY2FzZUJFc2sucG9wKCk7Ci0JCQkJQ2FzZUJhcnJpZXJFeHByIGNiZSA9IChDYXNlQmFycmllckV4cHIpbGlzdC5nZXQoMSk7Ci0JCQkJb3BlcmFuZDEgPSAoQmFycmllckV4cHJlc3Npb24pY2JlLmdldEJFKCk7Ci0JCQkJZm9yKGludCBpPTM7IGk8bGlzdC5zaXplKCk7IGkrPTIpewotCQkJCQljYmUgPSAoQ2FzZUJhcnJpZXJFeHByKWxpc3QuZ2V0KGkpOwotCQkJCQlvcGVyYW5kMiA9IChCYXJyaWVyRXhwcmVzc2lvbiljYmUuZ2V0QkUoKTsKLQkJCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5icmFuY2hCRShvcGVyYW5kMSwgb3BlcmFuZDIsIAotCQkJCQkJCXN3U3RtdC5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQkJb3BlcmFuZDEgPSBiZTsKLQkJCQl9Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJc2sucG9wKCk7Ci0JCQkJc2sucHVzaChvcGVyYW5kMSk7Ci0JCQl9Ci0JCQl3aXRoQnJlYWsucG9wKCk7Ci0JCQljYXNlUGFyZW50LnBvcCgpOwotCQkJZGVwdGggLS07Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCUlBU1RXaGlsZVN0YXRlbWVudCB3aFN0bXQgPSAoSUFTVFdoaWxlU3RhdGVtZW50KXN0bXQ7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkvKiBsb29wIGJvZHkgKi8KLQkJCQlpZih3aFN0bXQuZ2V0Qm9keSgpICE9IG51bGwpCi0JCQkJCW9wZXJhbmQxID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQlvcGVyYW5kMSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIGNvbmRpdGlvbiAqLwotCQkJCWlmKHdoU3RtdC5nZXRDb25kaXRpb24oKSAhPSBudWxsKSAKLQkJCQkJY29uZEJFID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQljb25kQkUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBCRSA9IGNvbmQgLiAoYm9keSAuIGNvbmQpKiAgKi8KLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKGNvbmRCRSwgCi0JCQkJCQlCYXJyaWVyRXhwcmVzc2lvbi5yZXBlYXRCRSgKLQkJCQkJCQlCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMSwgY29uZEJFKSwgCi0JCQkJCQkJCXdoU3RtdC5nZXRDb25kaXRpb24oKSwgc3RtdCkpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJCWZpeFN3aXRjaChjb21tLCBzdG10LCBiZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQl9Ci0JCi0JLyogCi0JICogSWYgdGhlIGN1cnJlbnQgc3RhdGVtZW50IGlzIGEgY2FzZSBib2R5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeFN3aXRjaChTdHJpbmcga2V5LCBJQVNUU3RhdGVtZW50IHN0bXQsIEJhcnJpZXJFeHByZXNzaW9uIEJFKXsKLQkJaWYoZGVwdGggPD0gMCkgcmV0dXJuOwotCQlpZihzdG10LmdldFBhcmVudCgpID09IGNhc2VQYXJlbnQucGVlaygpKXsKLQkJCVN0YWNrPExpc3Q+IGNhc2VCRXNrID0gY2FzZUJFLmdldChrZXkpOwotCQkJTGlzdCBsaXN0ID0gY2FzZUJFc2sucGVlaygpOwotCQkJYm9vbGVhbiBmbGFnID0gKChCb29sZWFuKXdpdGhCcmVhay5wZWVrKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJZm9yKGludCBpID0gMTsgaTxsaXN0LnNpemUoKTsgaSs9Mil7Ci0JCQkJQ2FzZUJhcnJpZXJFeHByIGNiZSA9IChDYXNlQmFycmllckV4cHIpbGlzdC5nZXQoaSk7Ci0JCQkJaWYoZmxhZykKLQkJCQkJY2JlLmFkZEZpbmFsQkVFbGVtZW50KEJFKTsKLQkJCQllbHNlIAotCQkJCQljYmUuYWRkQkVFbGVtZW50KEJFKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaW5DYXNlU3RtdChJQVNUQnJlYWtTdGF0ZW1lbnQgc3RtdCl7Ci0JCUlBU1ROb2RlIHBhcmVudCA9IHN0bXQuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlKHBhcmVudCAhPSBudWxsKXsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQgfHwKLQkJCSAgIHBhcmVudCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCB8fAotCQkJICAgcGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBCYXJyaWVyRXhwcmVzc2lvbiBnZXRJbml0aWFsaXplckJFKFN0YWNrIHNrLCBJQVNUSW5pdGlhbGl6ZXIgaW5pdCl7CQkKLQkJQmFycmllckV4cHJlc3Npb24gQkUgPSBudWxsOwotCQlpZihpbml0IGluc3RhbmNlb2YgSUFTVEluaXRpYWxpemVyRXhwcmVzc2lvbil7Ci0JCQlCRSA9IChCYXJyaWVyRXhwcmVzc2lvbilzay5wb3AoKTsKLQkJfQotCQllbHNlIGlmKGluaXQgaW5zdGFuY2VvZiBJQVNUSW5pdGlhbGl6ZXJMaXN0KXsKLQkJCUlBU1RJbml0aWFsaXplckxpc3QgbGlzdCA9IChJQVNUSW5pdGlhbGl6ZXJMaXN0KWluaXQ7Ci0JCQlJQVNUSW5pdGlhbGl6ZXJbXSBpbml0cyA9IGxpc3QuZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQlmb3IoaW50IGogPSAwOyBqPGluaXRzLmxlbmd0aDsgaisrKXsKLQkJCQlpZihCRSA9PSBudWxsKQotCQkJCQlCRSA9IGdldEluaXRpYWxpemVyQkUoc2ssIGluaXRzW2pdKTsKLQkJCQllbHNlCi0JCQkJCUJFID0gQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUoQkUsIAotCQkJCQkJCWdldEluaXRpYWxpemVyQkUoc2ssIGluaXRzW2pdKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEJFOwotCX0KLQkKLQkvKgotCSAqIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lc24ndCBoYXZlIGFueSAiZXhwcmVzc2lvbiIgCi0JICogZmllbGQgaXMgYSB0ZXJtaW5hbC4gCi0JICovCi0JcHVibGljIGludCBsZWF2ZShJQVNURXhwcmVzc2lvbiBleHByKXsKLQkJQmFycmllckV4cHJlc3Npb24gYmUgPSBudWxsOwotCQlCYXJyaWVyRXhwcmVzc2lvbiBvcGVyYW5kMSA9IG51bGw7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIG9wZXJhbmQyID0gbnVsbDsKLQkJQmFycmllckV4cHJlc3Npb24gb3BlcmFuZDMgPSBudWxsOwotCQkKLQkJaWYoZXhwciBpbnN0YW5jZW9mIElBU1RBbWJpZ3VvdXNFeHByZXNzaW9uKXsKLQkJCS8qIG5vdGhpbmcgKi8KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQXJyYXlTdWJzY3JpcHRFeHByZXNzaW9uKXsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJb3BlcmFuZDIgPSBzay5wb3AoKTsgIC8vc3Vic2NyaXB0Ci0JCQkJb3BlcmFuZDEgPSBzay5wb3AoKTsgIC8vYXJyYXkKLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQxLCBvcGVyYW5kMik7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEJpbmFyeUV4cHJlc3Npb24pewotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlvcGVyYW5kMiA9IHNrLnBvcCgpOwotCQkJCW9wZXJhbmQxID0gc2sucG9wKCk7Ci0JCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMSwgb3BlcmFuZDIpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RDYXN0RXhwcmVzc2lvbil7Ci0JCQkvKiBIYXMgb25seSBvbmUgb3BlcmF0b3IsIGxlYXZlIGl0IHRoZXJlICovCi0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbil7Ci0JCQlJQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNFeHByID0gKElBU1RDb25kaXRpb25hbEV4cHJlc3Npb24pZXhwcjsKLQkJCUlBU1ROb2RlIHBhcmVudCA9IGV4cHIuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSghIChwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3RhdGVtZW50KSApCi0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlvcGVyYW5kMiA9IHNrLnBvcCgpOyAvKiBuZWdhdGl2ZSAqLwotCQkJCW9wZXJhbmQxID0gc2sucG9wKCk7IC8qIHBvc2l0aXZlICovCi0JCQkJb3BlcmFuZDMgPSBzay5wb3AoKTsgLyogY29uZGl0aW9uICovCi0JCQkJLyogRSA9IEMgKCBQIHwgTiApICovCi0JCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMywgCi0JCQkJCQlCYXJyaWVyRXhwcmVzc2lvbi5icmFuY2hCRShvcGVyYW5kMSwgb3BlcmFuZDIsIAotCQkJCQkJCQljRXhwci5nZXRMb2dpY2FsQ29uZGl0aW9uRXhwcmVzc2lvbigpLCAKLQkJCQkJCQkJKElBU1RTdGF0ZW1lbnQpcGFyZW50KSk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCUlBU1RFeHByZXNzaW9uTGlzdCBleHByTGlzdCA9IChJQVNURXhwcmVzc2lvbkxpc3QpZXhwcjsKLQkJCUlBU1RFeHByZXNzaW9uW10gZXhwcyA9IGV4cHJMaXN0LmdldEV4cHJlc3Npb25zKCk7Ci0JCQlpZihleHBzLmxlbmd0aCA9PSAwKSByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaW50IGNvdW50ID0gMDsKLQkJCQlpbnQgaTsKLQkJCQlCYXJyaWVyRXhwcmVzc2lvbltdIEJFbGlzdCA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbltleHBzLmxlbmd0aF07Ci0JCQkJZm9yKGk9MDsgaTxleHBzLmxlbmd0aDsgaSsrKXsKLQkJCQkJaWYoZXhwc1tpXSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJQkVsaXN0W2NvdW50XSA9IHNrLnBvcCgpOwotCQkJCQljb3VudCArKzsKLQkJCQl9Ci0JCQkJb3BlcmFuZDEgPSBCRWxpc3RbY291bnQtMV07Ci0JCQkJZm9yIChpID0gY291bnQtMjsgaSA+PSAwOyBpLS0gKSB7Ci0JCQkJCW9wZXJhbmQyID0gQkVsaXN0W2ldOwotCQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQxLCBvcGVyYW5kMik7Ci0JCQkJCW9wZXJhbmQxID0gYmU7Ci0JCQkJfQotCQkJCXNrLnB1c2gob3BlcmFuZDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGaWVsZFJlZmVyZW5jZSl7Ci0JCQkvKgotCQkJZm9yKEVudW1lcmF0aW9uIGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjayBzayA9IChTdGFjayllLm5leHRFbGVtZW50KCk7Ci0JCQkJb3BlcmFuZDIgPSAoQmFycmllckV4cHJlc3Npb24pc2sucG9wKCk7IC8vbmFtZQotCQkJCW9wZXJhbmQxID0gKEJhcnJpZXJFeHByZXNzaW9uKXNrLnBvcCgpOyAvL293bmVyCi0JCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMSwgb3BlcmFuZDIpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJfQotCQkJKi8KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbil7Ci0JCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmRXhwciA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByOwotCQkJSUFTVEV4cHJlc3Npb24gZnVuY25hbWUgPSBmRXhwci5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCk7Ci0JCQlJQVNURXhwcmVzc2lvbiBwYXJhbWV0ZXIgPSBmRXhwci5nZXRQYXJhbWV0ZXJFeHByZXNzaW9uKCk7Ci0JCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQlpbnQgaWQgPSBiVGFibGVfLmlzQmFycmllcihmRXhwcik7Ci0JCQlpZihpZCAhPSAtMSl7IC8qIGJhcnJpZXIgKi8KLQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihpZCk7Ci0JCQkJU3RyaW5nIGNvbW0gPSBiVGFibGVfLmdldENvbW0oaWQpOwotCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBzdGFja3NfLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCQlTdHJpbmcgY29tbWtleSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbWtleSk7Ci0JCQkJCWlmKHBhcmFtZXRlciAhPSBudWxsKSBzay5wb3AoKTsgLy9wYXJhbWV0ZXIgCi0JCQkJCXNrLnBvcCgpOyAvL2Z1bmN0aW9uTmFtZQotCQkJCQlpZihjb21ta2V5LmVxdWFscyhjb21tKSkgc2sucHVzaChiZSk7Ci0JCQkJCWVsc2Ugc2sucHVzaChuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZXsKLQkJCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSljZ18uZ2V0Tm9kZShjdXJyZW50Tm9kZV8uZ2V0RmlsZU5hbWUoKSwgc2lnbmF0dXJlKTsKLQkJCQlpZihub2RlICE9IG51bGwgJiYgbm9kZS5iYXJyaWVyUmVsYXRlZCgpKXsgCi0JCQkJCS8qIGEgZnVuY3Rpb24gKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHdpdGggYmFycmllcnMgKi8KLQkJCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCQkJQmFycmllckV4cHJlc3Npb24gZnVuY0JFID0gbm9kZS5nZXRCYXJyaWVyRXhwcigpLmdldChjb21tKTsKLQkJCQkJCWlmKHBhcmFtZXRlciAhPSBudWxsKSBzay5wb3AoKTsgLy9wYXJhbWV0ZXIKLQkJCQkJCXNrLnBvcCgpOyAvL2Z1bmN0aW9uTmFtZQotCQkJCQkJaWYobm9kZSA9PSBjdXJyZW50Tm9kZV8peyAvL3JlY3Vyc2l2ZSBmdW5jdGlvbnMKLQkJCQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihub2RlLmdldEZ1bmNOYW1lKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihmdW5jQkUuaXNCb3QoKSl7Ci0JCQkJCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkJCX0gCi0JCQkJCQllbHNlewotCQkJCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKHNpZ25hdHVyZSk7Ci0JCQkJCQl9Ci0JCQkJCQlzay5wdXNoKGJlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vbm90IGEgYmFycmllciByZWxhdGVkIGZ1bmN0aW9uCi0JCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJCWlmKHBhcmFtZXRlciAhPSBudWxsKSBzay5wb3AoKTsgLy9wYXJhbWV0ZXIKLQkJCQkJCXNrLnBvcCgpOyAvL2Z1bmN0aW9uTmFtZQotCQkJCQkJc2sucHVzaChiZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVElkRXhwcmVzc2lvbil7IC8vdGVybWluYWwKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCgoSUFTVElkRXhwcmVzc2lvbilleHByKS5nZXROYW1lKCkudG9TdHJpbmcoKSk7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVExpdGVyYWxFeHByZXNzaW9uKXsgLy90ZXJtaW5hbAotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oKChJQVNUTGl0ZXJhbEV4cHJlc3Npb24pZXhwcikudG9TdHJpbmcoKSk7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFByb2JsZW1FeHByZXNzaW9uKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSUFTVFByb2JsZW1FeHByZXNzaW9uIik7Ci0JCX0KLQkJKi8KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFR5cGVJZEV4cHJlc3Npb24pewotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RVbmFyeUV4cHJlc3Npb24pewotCQkJLyogaGFzIG9ubHkgb25lIG9wZXJhbmQsIGxlYXZlIGl0IHRoZXJlICovCi0JCX0KLQkJLyoKLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUNBU1RUeXBlSWRJbml0aWFsaXplckV4cHJlc3Npb24pewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJQ0FTVFR5cGVJZEluaXRpYWxpemVyRXhwcmVzc2lvbiIpOwotCQl9Ci0JCSovCi0JCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCX0KLQotCWNsYXNzIENhc2VCYXJyaWVyRXhwcnsKLQkJcHJvdGVjdGVkIEJhcnJpZXJFeHByZXNzaW9uIEJFOwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZWQ7Ci0JCXByb3RlY3RlZCBJQVNURXhwcmVzc2lvbiBjb25kOwotCQkKLQkJQ2FzZUJhcnJpZXJFeHByKEJhcnJpZXJFeHByZXNzaW9uIGJlLCBJQVNURXhwcmVzc2lvbiBjb25kKXsKLQkJCUJFID0gYmU7Ci0JCQljbG9zZWQgPSBmYWxzZTsKLQkJCXRoaXMuY29uZCA9IGNvbmQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgeyBjbG9zZWQgPSB0cnVlOyB9Ci0JCXB1YmxpYyBCYXJyaWVyRXhwcmVzc2lvbiBnZXRCRSgpIHtyZXR1cm4gQkU7fQotCQlwdWJsaWMgSUFTVEV4cHJlc3Npb24gZ2V0Q29uZCgpIHtyZXR1cm4gY29uZDt9Ci0KLQkJcHVibGljIHZvaWQgYWRkQkVFbGVtZW50KEJhcnJpZXJFeHByZXNzaW9uIGJlKXsKLQkJCWlmKGNsb3NlZCkgcmV0dXJuOwotCQkJaWYoQkUgPT0gbnVsbCl7Ci0JCQkJQkUgPSBiZTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShCRSwgYmUpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRGaW5hbEJFRWxlbWVudChCYXJyaWVyRXhwcmVzc2lvbiBiZSl7Ci0JCQlhZGRCRUVsZW1lbnQoYmUpOwotCQkJY2xvc2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0JhcnJpZXJSZWN1cnNpb24oKXsKLQkJZm9yKEl0ZXJhdG9yPExpc3Q8SUNhbGxHcmFwaE5vZGU+PiBpPWNnXy5nZXRDeWNsZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJTGlzdDxJQ2FsbEdyYXBoTm9kZT4gY3ljbGUgPSBpLm5leHQoKTsKLQkJCWJvb2xlYW4gYmFycmllclJlbGF0ZWQgPSBmYWxzZTsKLQkJCWZvcihJdGVyYXRvcjxJQ2FsbEdyYXBoTm9kZT4gaWkgPSBjeWNsZS5pdGVyYXRvcigpOyBpaS5oYXNOZXh0KCk7KXsKLQkJCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSlpaS5uZXh0KCk7Ci0JCQkJaWYobm9kZS5iYXJyaWVyUmVsYXRlZCl7Ci0JCQkJCWJhcnJpZXJSZWxhdGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYoIWJhcnJpZXJSZWxhdGVkKSBjb250aW51ZTsKLQkJCWlmKGN5Y2xlLnNpemUoKSA+IDEpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGktRnVuY3Rpb24gYmFycmllciByZWxhdGVkIGN5Y2xlcyIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWN1cnJlbnROb2RlXyA9IChNUElDYWxsR3JhcGhOb2RlKWN5Y2xlLmdldCgwKTsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBjdXJyZW50Tm9kZV8uZ2V0QmFycmllckV4cHIoKS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBCRSA9IGN1cnJlbnROb2RlXy5nZXRCYXJyaWVyRXhwcigpLmdldChjb21tKTsKLQkJCQlpZihyZWN1cnNpb24oQkUpID09IHJlY3Vyc2lvbkVycm9yKXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWN1cnNpb24gRXJyb3IgaW4gIiArIGNvbW0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBpbnQgcmVjdXJzaW9uQ29ycmVjdCA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCByZWN1cnNpb25FcnJvciA9IDE7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBub1JlY3Vyc2lvbiA9IDI7Ci0JCi0JcHJvdGVjdGVkIGludCByZWN1cnNpb24oQmFycmllckV4cHJlc3Npb24gQkUpewotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbihCRS5wcmV0dHlQcmludGVyKCkpOwotCQlCYXJyaWVyRXhwcmVzc2lvbk9QIE9QID0gQkUuZ2V0T1AoKTsKLQkJaWYoT1AgPT0gbnVsbCl7Ci0JCQlpZihCRS5pc0Z1bmMoKSl7IC8vZnVuY3Rpb24gY2FsbAotCQkJCVN0cmluZyBmdW5jTmFtZSA9IEJFLmdldEZ1bmNOYW1lKCk7Ci0JCQkJTVBJQ2FsbEdyYXBoTm9kZSBmbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnROb2RlXy5nZXRGaWxlTmFtZSgpLCBmdW5jTmFtZSk7Ci0JCQkJaWYoZm5vZGUgPT0gY3VycmVudE5vZGVfKQotCQkJCQlyZXR1cm4gcmVjdXJzaW9uQ29ycmVjdDsKLQkJCQllbHNlIAotCQkJCQlyZXR1cm4gbm9SZWN1cnNpb247Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vUmVjdXJzaW9uOwotCQl9Ci0JCWVsc2UgaWYoT1AuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2NvbmNhdCl7Ci0JCQlpbnQgdjEgPSByZWN1cnNpb24oQkUuZ2V0T1AxKCkpOwotCQkJaW50IHYyID0gcmVjdXJzaW9uKEJFLmdldE9QMigpKTsKLQkJCWlmKHYxID09IHJlY3Vyc2lvbkVycm9yIHx8IHYyID09IHJlY3Vyc2lvbkVycm9yKQotCQkJCXJldHVybiByZWN1cnNpb25FcnJvcjsKLQkJCWVsc2UgaWYodjEgPT0gcmVjdXJzaW9uQ29ycmVjdCB8fCB2MiA9PSByZWN1cnNpb25Db3JyZWN0KQotCQkJCXJldHVybiByZWN1cnNpb25Db3JyZWN0OwotCQkJZWxzZSAKLQkJCQlyZXR1cm4gbm9SZWN1cnNpb247Ci0KLQkJfQotCQllbHNlIGlmKE9QLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpewotCQkJaW50IHYxID0gcmVjdXJzaW9uKEJFLmdldE9QMSgpKTsKLQkJCWludCB2MiA9IHJlY3Vyc2lvbihCRS5nZXRPUDIoKSk7Ci0JCQlpZih2MSA9PSBub1JlY3Vyc2lvbiAmJiB2MiA9PSBub1JlY3Vyc2lvbikKLQkJCQlyZXR1cm4gbm9SZWN1cnNpb247Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHJlY3Vyc2lvbkVycm9yOwotCQl9Ci0JCWVsc2UgeyAvL0JhcnJpZXJFeHByZXNzaW9uT1Aub3BfcmVwZWF0Ci0JCQlyZXR1cm4gcmVjdXJzaW9uKEJFLmdldE9QMSgpKTsKLQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQmFycmllckV4cHJNb2RpZmllZC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCYXJyaWVyRXhwck1vZGlmaWVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YmYzYTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCYXJyaWVyRXhwck1vZGlmaWVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQmluYXJ5RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RCcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDYXNlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENhc3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbXBvdW5kU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDb250aW51ZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlZmF1bHRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURG9TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZpZWxkUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZvclN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RHb3RvU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVElkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJbml0aWFsaXplckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUSW5pdGlhbGl6ZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVExhYmVsU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVExpdGVyYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTnVsbFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcm9ibGVtU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFJldHVyblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTaW1wbGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3dpdGNoU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFR5cGVJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFdoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuSUFTVEFtYmlndW91c0V4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5JQVNUQW1iaWd1b3VzU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpcy5CYXJyaWVyRXhwcmVzc2lvbi5CYXJyaWVyRXhwcmVzc2lvbk9QOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNUElCYXJyaWVyRXhwck1vZGlmaWVkIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0JcHJvdGVjdGVkIEJhcnJpZXJUYWJsZSBiVGFibGVfOwotCXByb3RlY3RlZCBJQ2FsbEdyYXBoIGNnXzsKLQkvKiogT25lIHN0YWNrIGZvciBlYWNoIGNvbW11bmljYXRvciAqLwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gc3RhY2tzXzsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZU9uPWZhbHNlOwotCQotCXByb3RlY3RlZCBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnROb2RlXzsKLQkKLQkvKiogCi0JICogc3dpdGNoIHN0YXRlbWVudCBtYXkgYmUgbmVzdGVkIAotCSAqLwotCXByb3RlY3RlZCBpbnQgZGVwdGggPSAwOwotCQotCS8qKiAKLQkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gcmVjb2duaXplIHRoZSBhc3NvY2lhdGVkIGNhc2UgYm9keS4gVGhlIGlkZWEgaXMgCi0JICogdGhlIGNhc2UgYm9keSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBwYXJlbnQgd2l0aCB0aGUgImNhc2UiIHN0YXRlbWVudC4gCi0JICogT25lIGVsZW1lbnQgaW4gdGhpcyBzdGFjayBpcyBzaGFyZWQgYnkgYWxsIGNhc2VzIChhbmQgZGVmYXVsdCkgaW4gb25lIAotCSAqIHN3aXRjaCBzdGF0ZW1lbnQuIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBvZiB0aGUgdHJlZSBzdHJ1Y3R1cmUuIAotCSAqLwotCXByb3RlY3RlZCBTdGFjazxJQVNUTm9kZT4gY2FzZVBhcmVudCA9IG51bGw7Ci0JCi0JLyoqIAotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byByZWNvcmQgd2hldGhlciB0aGUgY3VycmVudCBjYXNlIGhhcyAiYnJlYWsiCi0JICogc3RhdGVtZW50LiBTYW1lIGFzIGFib3ZlLCBvbmUgZWxlbWVudCBpcyBzaGFyZWQgYnkgYWxsIGNhc2VzIGFuZCBkZWZhdWx0IAotCSAqIGluIGEgc3dpdGNoIHN0YXRlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RhY2s8Qm9vbGVhbj4gd2l0aEJyZWFrID0gbnVsbDsKLQkKLQkvKioKLQkgKiAgRWFjaCBidWNrZXQgaW4gdGhpcyBoYXNodGFibGUgaXMgYSBMaXN0LCBoYXNoZWQgYnkgY29tbXVuaWNhdG9yLgotCSAqIFRoZSBMaXN0IHJlY29yZHMgdGhlIGN1cnJlbnQgYmFycmllciAKLQkgKiBleHByZXNzaW9uIGZvciBlYWNoIGNhc2Ugc3RhdGVtZW50IGluIHRoZSBjdXJyZW50IChuZXN0ZWQpc3dpdGNoIHN0YXRlbWVudC4KLQkgKiBTbzogSGFzaHRhYmxlKGZvciBlYWNoIGNvbW11bmljYXRvcikgLS0+Ci0JICogICAgIFN0YWNrKGZvciBlYWNoIG5lc3RlZCBzd2l0Y2ggc3RhdGVtZW50KSAtLT4KLQkgKiAgICAgQXJyYXlMaXN0KGZvciBlYWNoIGNhc2UgYm9keSkgLS0+IAotCSAqICAgICBUdXBsZShjYXNlU3RhdGVtZW50LCBDYXNlQmFycmllckV4cHIpIAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLFN0YWNrPExpc3Q+PiBjYXNlQkUgPSBudWxsOwotCQotCXB1YmxpYyBNUElCYXJyaWVyRXhwck1vZGlmaWVkKEJhcnJpZXJUYWJsZSBidGFibGUsIElDYWxsR3JhcGggY2cpewotCQliVGFibGVfID0gYnRhYmxlOwotCQljZ18gPSBjZzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQkJc3RhY2tzXyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4oKTsKLQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGJUYWJsZV8uZ2V0VGFibGUoKS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJc3RhY2tzXy5wdXQoY29tbSwgbmV3IFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPigpKTsKLQkJfQotCQkKLQkJZGVwdGggPSAwOwotCQljYXNlUGFyZW50ID0gbmV3IFN0YWNrPElBU1ROb2RlPigpOwotCQl3aXRoQnJlYWsgPSBuZXcgU3RhY2s8Qm9vbGVhbj4oKTsKLQkJY2FzZUJFID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsU3RhY2s8TGlzdD4+KCk7Ci0JCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBiVGFibGVfLmdldFRhYmxlKCkua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCWNhc2VCRS5wdXQoY29tbSwgbmV3IFN0YWNrPExpc3Q+KCkpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlpZihiVGFibGVfLmlzRW1wdHkoKSkgcmV0dXJuOwotCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQlmb3IoSUNhbGxHcmFwaE5vZGUgbiA9IGNnXy5ib3RFbnRyeSgpOyBuICE9IG51bGw7IG4gPSBuLmJvdE5leHQoKSl7Ci0JCQljdXJyZW50Tm9kZV8gPSAoTVBJQ2FsbEdyYXBoTm9kZSluOwotCQkJaWYoIWN1cnJlbnROb2RlXy5tYXJrZWQpIGNvbnRpbnVlOwotCQkJaWYoIWN1cnJlbnROb2RlXy5iYXJyaWVyUmVsYXRlZCgpKSBjb250aW51ZTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJCYXJyaWVyIHJlbGF0ZWQgZnVuY3Rpb24gIiArIGN1cnJlbnROb2RlXy5nZXRGdW5jTmFtZSgpKTsKLQkJCWluaXQoKTsKLQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZnVuYyA9IGN1cnJlbnROb2RlXy5nZXRGdW5jRGVmKCk7Ci0JCQlmdW5jLmFjY2VwdCh0aGlzKTsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBzdGFja3NfLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCUJhcnJpZXJFeHByZXNzaW9uIGJlID0gc2sucG9wKCk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oY3VycmVudE5vZGVfLmdldEZ1bmNOYW1lKCkgKyAiKCIgKyBjb21tICsgIik6ICIgKyBiZS5wcmV0dHlQcmludGVyKCkpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0JCQkJY3VycmVudE5vZGVfLnNldEJhcnJpZXJFeHByKGNvbW0sIGJlKTsKLQkJCX0KLQkJfQotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgbnVtYmVyIG9mIG5vZGVzOiAiICsgQmFycmllckV4cHJlc3Npb24uY291bnRfbm9kZSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpewotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPExpc3Q+PiBlID0gY2FzZUJFLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjazxMaXN0PiBjYXNlQkVzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQljYXNlQkVzay5wdXNoKG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpKTsKLQkJCX0KLQkJCXdpdGhCcmVhay5wdXNoKG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQlkZXB0aCArKzsKLQkJfQotCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQl9Ci0JCi0JcHVibGljIGludCBsZWF2ZShJQVNUU3RhdGVtZW50IHN0bXQpewotCQlCYXJyaWVyRXhwcmVzc2lvbiBiZSA9IG51bGw7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIG9wZXJhbmQxID0gbnVsbDsKLQkJQmFycmllckV4cHJlc3Npb24gb3BlcmFuZDIgPSBudWxsOwotCQlCYXJyaWVyRXhwcmVzc2lvbiBjb25kQkUgPSBudWxsOwotCQkKLQkJaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RBbWJpZ3VvdXNTdGF0ZW1lbnQpewotCQkJCi0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEJyZWFrU3RhdGVtZW50KXsKLQkJCUlBU1RCcmVha1N0YXRlbWVudCBia1N0bXQgPSAoSUFTVEJyZWFrU3RhdGVtZW50KXN0bXQ7Ci0JCQlpZihpbkNhc2VTdG10KGJrU3RtdCkpewotCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBjYXNlQkUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdGFjazxMaXN0PiBjYXNlQkVzayA9IGNhc2VCRS5nZXQoY29tbSk7Ci0JCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCQlzay5wdXNoKGJlKTsKLQkJCQkJTGlzdCBsaXN0ID0gY2FzZUJFc2sucGVlaygpOwotCQkJCQlmb3IoaW50IGk9MTsgaTxsaXN0LnNpemUoKTsgaSs9Mil7Ci0JCQkJCQlDYXNlQmFycmllckV4cHIgY2JlID0gKENhc2VCYXJyaWVyRXhwcilsaXN0LmdldChpKTsKLQkJCQkJCWNiZS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZXsKLQkJCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gY2FzZUJFLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJCXNrLnB1c2goYmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ2FzZVN0YXRlbWVudCl7Ci0JCQlJQVNUQ2FzZVN0YXRlbWVudCBjYXNlU3RtdCA9IChJQVNUQ2FzZVN0YXRlbWVudClzdG10OwotCQkJLyogT3ZlcnJpZGUgdGhlIG9sZCBwYXJlbnQgaWYgaXQgZXhpc3RzICovCi0JCQlpZighY2FzZVBhcmVudC5lbXB0eSgpKSBjYXNlUGFyZW50LnBvcCgpOwotCQkJY2FzZVBhcmVudC5wdXNoKGNhc2VTdG10LmdldFBhcmVudCgpKTsKLQkJCQotCQkJZm9yKEVudW1lcmF0aW9uIGUgPSBjYXNlQkUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIGNvbW0gPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxMaXN0PiBjYXNlQkVzayA9IGNhc2VCRS5nZXQoY29tbSk7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCQlMaXN0IGxpc3QgPSBjYXNlQkVzay5wZWVrKCk7Ci0JCQkJbGlzdC5hZGQoY2FzZVN0bXQpOwotCQkJCWxpc3QuYWRkKG5ldyBDYXNlQmFycmllckV4cHIoYmUsIGNhc2VTdG10LmdldEV4cHJlc3Npb24oKSkpOwotCQkJfQotCQkJCi0JCQkvKiBUb2dnbGUgdGhlIHdpdGhCcmVhayBzaWduIG9mIHRoZSBwcmV2aW91cyBjYXNlICovCi0JCQlpZighd2l0aEJyZWFrLmVtcHR5KCkpIHdpdGhCcmVhay5wb3AoKTsKLQkJCXdpdGhCcmVhay5wdXNoKG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KXsKLQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBjbXBTdG10ID0gKElBU1RDb21wb3VuZFN0YXRlbWVudClzdG10OwotCQkJSUFTVFN0YXRlbWVudCBbXSBzID0gY21wU3RtdC5nZXRTdGF0ZW1lbnRzKCk7Ci0JCQlpZihzLmxlbmd0aCA9PSAwKSByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJLyogVGhlIGNvbmNhdGVuYXRlIG9wZXJhdG9yIGlzIGxlZnQtYXNzb2NpYXRpdmUgKi8KLQkJCQlpbnQgY291bnQgPSAwOwotCQkJCWludCBpOwotCQkJCUJhcnJpZXJFeHByZXNzaW9uW10gQkVsaXN0ID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uW3MubGVuZ3RoXTsKLQkJCQlmb3IoaT0wOyBpPHMubGVuZ3RoOyBpKyspewotCQkJCQlpZihzW2ldID09IG51bGwpIGNvbnRpbnVlOwotCQkJCQlCRWxpc3RbY291bnRdID0gc2sucG9wKCk7Ci0JCQkJCWNvdW50ICsrOwotCQkJCX0KLQkJCQlvcGVyYW5kMSA9IEJFbGlzdFtjb3VudC0xXTsKLQkJCQlmb3IgKGkgPSBjb3VudC0yOyBpID49IDA7IGktLSApIHsKLQkJCQkJb3BlcmFuZDIgPSBCRWxpc3RbaV07Ci0JCQkJCWJlID0gQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUob3BlcmFuZDEsIG9wZXJhbmQyKTsKLQkJCQkJb3BlcmFuZDEgPSBiZTsKLQkJCQl9Ci0JCQkJc2sucHVzaChvcGVyYW5kMSk7Ci0JCQkJZml4U3dpdGNoKGNvbW0sIGNtcFN0bXQsIG9wZXJhbmQxKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpewotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGNhc2VCRS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REZWNsYXJhdGlvblN0YXRlbWVudCl7Ci0JCQlib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JCQlJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQgZGVjbFN0bXQgPSAoSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50KXN0bXQ7Ci0JCQlJQVNURGVjbGFyYXRpb24gZGVjbCA9IGRlY2xTdG10LmdldERlY2xhcmF0aW9uKCk7Ci0JCQlpZihkZWNsIGluc3RhbmNlb2YgSUFTVFNpbXBsZURlY2xhcmF0aW9uKXsKLQkJCQlJQVNUU2ltcGxlRGVjbGFyYXRpb24gc2ltcGxlRGVjbCA9IChJQVNUU2ltcGxlRGVjbGFyYXRpb24pZGVjbDsKLQkJCQlJQVNURGVjbGFyYXRvcltdIGRlY2xhcmF0b3JzID0gc2ltcGxlRGVjbC5nZXREZWNsYXJhdG9ycygpOwotCQkJCWZvcihpbnQgaT0wOyBpPGRlY2xhcmF0b3JzLmxlbmd0aDsgaSsrKXsKLQkJCQkJSUFTVEluaXRpYWxpemVyIGluaXQgPSBkZWNsYXJhdG9yc1tpXS5nZXRJbml0aWFsaXplcigpOwotCQkJCQlpZihpbml0ICE9IG51bGwpewotCQkJCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJCQkJYmUgPSBnZXRJbml0aWFsaXplckJFKHNrLCBpbml0KTsKLQkJCQkJCQlzay5wdXNoKGJlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKCFpbml0aWFsaXplZCl7Ci0JCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkJc2sucHVzaChiZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REZWZhdWx0U3RhdGVtZW50KXsKLQkJCS8qIERlZmF1bHRTdGF0ZW1lbnQgPSBDYXNlU3RhdGVtZW50ICsgQnJlYWtTdGF0ZW1lbnQgKi8KLQkJCUlBU1REZWZhdWx0U3RhdGVtZW50IGRmU3RtdCA9IChJQVNURGVmYXVsdFN0YXRlbWVudClzdG10OwotCQkJLyogT3ZlcnJpZGUgdGhlIG9sZCBwYXJlbnQgaWYgaXQgZXhpc3RzICovCi0JCQlpZighY2FzZVBhcmVudC5lbXB0eSgpKSBjYXNlUGFyZW50LnBvcCgpOwotCQkJY2FzZVBhcmVudC5wdXNoKGRmU3RtdC5nZXRQYXJlbnQoKSk7Ci0JCQkKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBjYXNlQkUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RhY2s8TGlzdD4gY2FzZUJFc2sgPSBjYXNlQkUuZ2V0KGNvbW0pOwotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJTGlzdCBsaXN0ID0gY2FzZUJFc2sucGVlaygpOwotCQkJCWxpc3QuYWRkKGRmU3RtdCk7Ci0JCQkJbGlzdC5hZGQobmV3IENhc2VCYXJyaWVyRXhwcihiZSwgbnVsbCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQlJQVNURG9TdGF0ZW1lbnQgZG9TdG10ID0gKElBU1REb1N0YXRlbWVudClzdG10OwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJLyogY29uZGl0aW9uICovCi0JCQkJaWYoZG9TdG10LmdldENvbmRpdGlvbigpICE9IG51bGwpCi0JCQkJCWNvbmRCRSA9IChCYXJyaWVyRXhwcmVzc2lvbilzay5wb3AoKTsKLQkJCQllbHNlCi0JCQkJCWNvbmRCRSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIGxvb3AgYm9keSAqLwotCQkJCWlmKGRvU3RtdC5nZXRCb2R5KCkgIT0gbnVsbCkKLQkJCQkJb3BlcmFuZDEgPSAoQmFycmllckV4cHJlc3Npb24pc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQlvcGVyYW5kMSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIEJFID0gYm9keSAuIGNvbmQuIChib2R5IC4gY29uZCkqICovCi0JCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShvcGVyYW5kMSwgY29uZEJFLCAKLQkJCQkJCUJhcnJpZXJFeHByZXNzaW9uLnJlcGVhdEJFKAotCQkJCQkJCUJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQxLCBjb25kQkUpLCAKLQkJCQkJCQkJZG9TdG10LmdldENvbmRpdGlvbigpLCBzdG10KSk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQkJZml4U3dpdGNoKGNvbW0sIHN0bXQsIGJlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvblN0YXRlbWVudCl7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQliZSA9IHNrLnBvcCgpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJCWZpeFN3aXRjaChjb21tLCBzdG10LCBiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCl7Ci0JCQlJQVNURm9yU3RhdGVtZW50IGZvclN0bXQgPSAoSUFTVEZvclN0YXRlbWVudClzdG10OwotCQkJQmFycmllckV4cHJlc3Npb24gaW5pdEJFID0gbnVsbDsKLQkJCUJhcnJpZXJFeHByZXNzaW9uIGl0ZXJCRSA9IG51bGw7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkvKiBsb29wIGJvZHkgKi8KLQkJCQlpZihmb3JTdG10LmdldEJvZHkoKSAhPSBudWxsKQotCQkJCQlvcGVyYW5kMSA9IHNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJb3BlcmFuZDEgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBpdGVyYXRvciAqLwotCQkJCWlmKGZvclN0bXQuZ2V0SXRlcmF0aW9uRXhwcmVzc2lvbigpICE9IG51bGwpCi0JCQkJCWl0ZXJCRSA9IHNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJaXRlckJFID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJLyogY29uZGl0aW9uICovCi0JCQkJaWYoZm9yU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCkgIT0gbnVsbCkKLQkJCQkJY29uZEJFID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQljb25kQkUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBpbml0aWFsaXplciAqLwotCQkJCWlmKGZvclN0bXQuZ2V0SW5pdGlhbGl6ZXJTdGF0ZW1lbnQoKSAhPSBudWxsKQotCQkJCQlpbml0QkUgPSBzay5wb3AoKTsKLQkJCQllbHNlCi0JCQkJCWluaXRCRSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIEJFID0gaW5pdCAuIGNvbmQuIChib2R5IC4gaXRlciAuIGNvbmQpKiAqLwotCQkJCWJlID0gQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUoaW5pdEJFLCBjb25kQkUsIAotCQkJCQkJQmFycmllckV4cHJlc3Npb24ucmVwZWF0QkUoCi0JCQkJCQkJQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUob3BlcmFuZDEsIGl0ZXJCRSwgY29uZEJFKSwgCi0JCQkJCQkJZm9yU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpKTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCQlmaXhTd2l0Y2goY29tbSwgc3RtdCwgYmUpOwotCQkJfQotCQl9IAotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUR290b1N0YXRlbWVudCl7Ci0JCQkvKiBUT0RPICovCi0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KXsKLQkJCUlBU1RJZlN0YXRlbWVudCBpZlN0bXQgPSAoSUFTVElmU3RhdGVtZW50KXN0bXQ7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21tKTsKLQkJCQkvKiBlbHNlIGNsYXVzZSAqLwotCQkJCWlmKGlmU3RtdC5nZXRFbHNlQ2xhdXNlKCkgIT0gbnVsbCkKLQkJCQkJb3BlcmFuZDIgPSBzay5wb3AoKTsKLQkJCQllbHNlIAotCQkJCQlvcGVyYW5kMiA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCS8qIHRoZW4gY2xhdXNlICovCi0JCQkJaWYoaWZTdG10LmdldFRoZW5DbGF1c2UoKSAhPSBudWxsKQotCQkJCQlvcGVyYW5kMSA9IHNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJb3BlcmFuZDEgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBjb25kaXRpb24qLwotCQkJCWlmKGlmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCkgIT0gbnVsbCkKLQkJCQkJY29uZEJFID0gc2sucG9wKCk7Ci0JCQkJZWxzZQotCQkJCQljb25kQkUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBCRSA9IGNvbmQuICh0aGVuIHwgZWxzZSkgKi8KLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKGNvbmRCRSwgCi0JCQkJCQlCYXJyaWVyRXhwcmVzc2lvbi5icmFuY2hCRShvcGVyYW5kMSwgb3BlcmFuZDIsIAotCQkJCQkJCWlmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpKTsKLQkJCQlzay5wdXNoKGJlKTsgCQkKLQkJCQlmaXhTd2l0Y2goY29tbSwgc3RtdCwgYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RMYWJlbFN0YXRlbWVudCl7Ci0JCQkvKiBUT0RPICovCi0JCX0KLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVE51bGxTdGF0ZW1lbnQpewotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCXNrLnB1c2goYmUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RQcm9ibGVtU3RhdGVtZW50KXsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUUmV0dXJuU3RhdGVtZW50KXsKLQkJCUlBU1RSZXR1cm5TdGF0ZW1lbnQgclN0bXQgPSAoSUFTVFJldHVyblN0YXRlbWVudClzdG10OwotCQkJaWYoclN0bXQuZ2V0UmV0dXJuVmFsdWUoKSA9PSBudWxsKXsKLQkJCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkJc2sucHVzaChiZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gY2FzZUJFLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCQlTdHJpbmcgY29tbSA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJCWJlID0gc2sucG9wKCk7Ci0JCQkJCXNrLnB1c2goYmUpOwotCQkJCQlpZighd2l0aEJyZWFrLmVtcHR5KCkpewotCQkJCQkJd2l0aEJyZWFrLnBvcCgpOwotCQkJCQkJd2l0aEJyZWFrLnB1c2gobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCQl9Ci0JCQkJCWZpeFN3aXRjaChjb21tLCByU3RtdCwgYmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KXsKLQkJCUlBU1RTd2l0Y2hTdGF0ZW1lbnQgc3dTdG10ID0gKElBU1RTd2l0Y2hTdGF0ZW1lbnQpc3RtdDsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBjYXNlQkUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RhY2s8TGlzdD4gY2FzZUJFc2sgPSBjYXNlQkUuZ2V0KGNvbW0pOwotCQkJCUxpc3QgbGlzdCA9IGNhc2VCRXNrLnBvcCgpOwotCQkJCUNhc2VCYXJyaWVyRXhwciBjYmUgPSAoQ2FzZUJhcnJpZXJFeHByKWxpc3QuZ2V0KDEpOwotCQkJCW9wZXJhbmQxID0gKEJhcnJpZXJFeHByZXNzaW9uKWNiZS5nZXRCRSgpOwotCQkJCWZvcihpbnQgaT0zOyBpPGxpc3Quc2l6ZSgpOyBpKz0yKXsKLQkJCQkJY2JlID0gKENhc2VCYXJyaWVyRXhwcilsaXN0LmdldChpKTsKLQkJCQkJb3BlcmFuZDIgPSAoQmFycmllckV4cHJlc3Npb24pY2JlLmdldEJFKCk7Ci0JCQkJCWJlID0gQmFycmllckV4cHJlc3Npb24uYnJhbmNoQkUob3BlcmFuZDEsIG9wZXJhbmQyLCAKLQkJCQkJCQlzd1N0bXQuZ2V0Q29udHJvbGxlckV4cHJlc3Npb24oKSwgc3RtdCk7Ci0JCQkJCW9wZXJhbmQxID0gYmU7Ci0JCQkJfQotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IHN0YWNrc18uZ2V0KGNvbW0pOwotCQkJCXNrLnBvcCgpOwotCQkJCXNrLnB1c2gob3BlcmFuZDEpOwotCQkJfQotCQkJd2l0aEJyZWFrLnBvcCgpOwotCQkJY2FzZVBhcmVudC5wb3AoKTsKLQkJCWRlcHRoIC0tOwotCQl9Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQlJQVNUV2hpbGVTdGF0ZW1lbnQgd2hTdG10ID0gKElBU1RXaGlsZVN0YXRlbWVudClzdG10OwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIGNvbW0gPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJLyogbG9vcCBib2R5ICovCi0JCQkJaWYod2hTdG10LmdldEJvZHkoKSAhPSBudWxsKQotCQkJCQlvcGVyYW5kMSA9IHNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJb3BlcmFuZDEgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkvKiBjb25kaXRpb24gKi8KLQkJCQlpZih3aFN0bXQuZ2V0Q29uZGl0aW9uKCkgIT0gbnVsbCkgCi0JCQkJCWNvbmRCRSA9IHNrLnBvcCgpOwotCQkJCWVsc2UKLQkJCQkJY29uZEJFID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJLyogQkUgPSBjb25kIC4gKGJvZHkgLiBjb25kKSogICovCi0JCQkJYmUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShjb25kQkUsIAotCQkJCQkJQmFycmllckV4cHJlc3Npb24ucmVwZWF0QkUoCi0JCQkJCQkJQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUob3BlcmFuZDEsIGNvbmRCRSksIAotCQkJCQkJCQl3aFN0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpKTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCQlmaXhTd2l0Y2goY29tbSwgc3RtdCwgYmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JfQotCQotCS8qKiAKLQkgKiBJZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQgaXMgYSBjYXNlIGJvZHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4U3dpdGNoKFN0cmluZyBrZXksIElBU1RTdGF0ZW1lbnQgc3RtdCwgQmFycmllckV4cHJlc3Npb24gQkUpewotCQlpZihkZXB0aCA8PSAwKSByZXR1cm47Ci0JCWlmKHN0bXQuZ2V0UGFyZW50KCkgPT0gY2FzZVBhcmVudC5wZWVrKCkpewotCQkJU3RhY2s8TGlzdD4gY2FzZUJFc2sgPSBjYXNlQkUuZ2V0KGtleSk7Ci0JCQlMaXN0IGxpc3QgPSBjYXNlQkVzay5wZWVrKCk7Ci0JCQlib29sZWFuIGZsYWcgPSAoKEJvb2xlYW4pd2l0aEJyZWFrLnBlZWsoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlmb3IoaW50IGkgPSAxOyBpPGxpc3Quc2l6ZSgpOyBpKz0yKXsKLQkJCQlDYXNlQmFycmllckV4cHIgY2JlID0gKENhc2VCYXJyaWVyRXhwcilsaXN0LmdldChpKTsKLQkJCQlpZihmbGFnKQotCQkJCQljYmUuYWRkRmluYWxCRUVsZW1lbnQoQkUpOwotCQkJCWVsc2UgCi0JCQkJCWNiZS5hZGRCRUVsZW1lbnQoQkUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpbkNhc2VTdG10KElBU1RCcmVha1N0YXRlbWVudCBzdG10KXsKLQkJSUFTVE5vZGUgcGFyZW50ID0gc3RtdC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUocGFyZW50ICE9IG51bGwpewotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVEZvclN0YXRlbWVudCB8fAotCQkJICAgcGFyZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50IHx8Ci0JCQkgICBwYXJlbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25EZWZpbml0aW9uKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIEJhcnJpZXJFeHByZXNzaW9uIGdldEluaXRpYWxpemVyQkUoU3RhY2sgc2ssIElBU1RJbml0aWFsaXplciBpbml0KXsJCQotCQlCYXJyaWVyRXhwcmVzc2lvbiBCRSA9IG51bGw7Ci0JCWlmKGluaXQgaW5zdGFuY2VvZiBJQVNUSW5pdGlhbGl6ZXJFeHByZXNzaW9uKXsKLQkJCUJFID0gKEJhcnJpZXJFeHByZXNzaW9uKXNrLnBvcCgpOwotCQl9Ci0JCWVsc2UgaWYoaW5pdCBpbnN0YW5jZW9mIElBU1RJbml0aWFsaXplckxpc3QpewotCQkJSUFTVEluaXRpYWxpemVyTGlzdCBsaXN0ID0gKElBU1RJbml0aWFsaXplckxpc3QpaW5pdDsKLQkJCUlBU1RJbml0aWFsaXplcltdIGluaXRzID0gbGlzdC5nZXRJbml0aWFsaXplcnMoKTsKLQkJCWZvcihpbnQgaiA9IDA7IGo8aW5pdHMubGVuZ3RoOyBqKyspewotCQkJCWlmKEJFID09IG51bGwpCi0JCQkJCUJFID0gZ2V0SW5pdGlhbGl6ZXJCRShzaywgaW5pdHNbal0pOwotCQkJCWVsc2UKLQkJCQkJQkUgPSBCYXJyaWVyRXhwcmVzc2lvbi5jb25jYXRCRShCRSwgCi0JCQkJCQkJZ2V0SW5pdGlhbGl6ZXJCRShzaywgaW5pdHNbal0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQkU7Ci0JfQotCQotCS8qCi0JICogQW4gZXhwcmVzc2lvbiB3aGljaCBkb2Vzbid0IGhhdmUgYW55ICJleHByZXNzaW9uIiAKLQkgKiBmaWVsZCBpcyBhIHRlcm1pbmFsLiAKLQkgKi8KLQlwdWJsaWMgaW50IGxlYXZlKElBU1RFeHByZXNzaW9uIGV4cHIpewotCQlCYXJyaWVyRXhwcmVzc2lvbiBiZSA9IG51bGw7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIG9wZXJhbmQxID0gbnVsbDsKLQkJQmFycmllckV4cHJlc3Npb24gb3BlcmFuZDIgPSBudWxsOwotCQlCYXJyaWVyRXhwcmVzc2lvbiBvcGVyYW5kMyA9IG51bGw7Ci0JCQotCQlpZihleHByIGluc3RhbmNlb2YgSUFTVEFtYmlndW91c0V4cHJlc3Npb24pewotCQkJLyogbm90aGluZyAqLwotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24pewotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlvcGVyYW5kMiA9IHNrLnBvcCgpOyAgLy9zdWJzY3JpcHQKLQkJCQlvcGVyYW5kMSA9IHNrLnBvcCgpOyAgLy9hcnJheQotCQkJCWJlID0gQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUob3BlcmFuZDEsIG9wZXJhbmQyKTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQmluYXJ5RXhwcmVzc2lvbil7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCW9wZXJhbmQyID0gc2sucG9wKCk7Ci0JCQkJb3BlcmFuZDEgPSBzay5wb3AoKTsKLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQxLCBvcGVyYW5kMik7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVENhc3RFeHByZXNzaW9uKXsKLQkJCS8qIEhhcyBvbmx5IG9uZSBvcGVyYXRvciwgbGVhdmUgaXQgdGhlcmUgKi8KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uKXsKLQkJCUlBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gY0V4cHIgPSAoSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbilleHByOwotCQkJSUFTVE5vZGUgcGFyZW50ID0gZXhwci5nZXRQYXJlbnQoKTsKLQkJCXdoaWxlKCEgKHBhcmVudCBpbnN0YW5jZW9mIElBU1RTdGF0ZW1lbnQpICkKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCW9wZXJhbmQyID0gc2sucG9wKCk7IC8qIG5lZ2F0aXZlICovCi0JCQkJb3BlcmFuZDEgPSBzay5wb3AoKTsgLyogcG9zaXRpdmUgKi8KLQkJCQlvcGVyYW5kMyA9IHNrLnBvcCgpOyAvKiBjb25kaXRpb24gKi8KLQkJCQkvKiBFID0gQyAoIFAgfCBOICkgKi8KLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQzLCAKLQkJCQkJCUJhcnJpZXJFeHByZXNzaW9uLmJyYW5jaEJFKG9wZXJhbmQxLCBvcGVyYW5kMiwgCi0JCQkJCQkJCWNFeHByLmdldExvZ2ljYWxDb25kaXRpb25FeHByZXNzaW9uKCksIAotCQkJCQkJCQkoSUFTVFN0YXRlbWVudClwYXJlbnQpKTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvbkxpc3QpewotCQkJSUFTVEV4cHJlc3Npb25MaXN0IGV4cHJMaXN0ID0gKElBU1RFeHByZXNzaW9uTGlzdClleHByOwotCQkJSUFTVEV4cHJlc3Npb25bXSBleHBzID0gZXhwckxpc3QuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJCWlmKGV4cHMubGVuZ3RoID09IDApIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzayA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpbnQgY291bnQgPSAwOwotCQkJCWludCBpOwotCQkJCUJhcnJpZXJFeHByZXNzaW9uW10gQkVsaXN0ID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uW2V4cHMubGVuZ3RoXTsKLQkJCQlmb3IoaT0wOyBpPGV4cHMubGVuZ3RoOyBpKyspewotCQkJCQlpZihleHBzW2ldID09IG51bGwpIGNvbnRpbnVlOwotCQkJCQlCRWxpc3RbY291bnRdID0gc2sucG9wKCk7Ci0JCQkJCWNvdW50ICsrOwotCQkJCX0KLQkJCQlvcGVyYW5kMSA9IEJFbGlzdFtjb3VudC0xXTsKLQkJCQlmb3IgKGkgPSBjb3VudC0yOyBpID49IDA7IGktLSApIHsKLQkJCQkJb3BlcmFuZDIgPSBCRWxpc3RbaV07Ci0JCQkJCWJlID0gQmFycmllckV4cHJlc3Npb24uY29uY2F0QkUob3BlcmFuZDEsIG9wZXJhbmQyKTsKLQkJCQkJb3BlcmFuZDEgPSBiZTsKLQkJCQl9Ci0JCQkJc2sucHVzaChvcGVyYW5kMSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEZpZWxkUmVmZXJlbmNlKXsKLQkJCS8qCi0JCQlmb3IoRW51bWVyYXRpb24gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0YWNrIHNrID0gKFN0YWNrKWUubmV4dEVsZW1lbnQoKTsKLQkJCQlvcGVyYW5kMiA9IChCYXJyaWVyRXhwcmVzc2lvbilzay5wb3AoKTsgLy9uYW1lCi0JCQkJb3BlcmFuZDEgPSAoQmFycmllckV4cHJlc3Npb24pc2sucG9wKCk7IC8vb3duZXIKLQkJCQliZSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKG9wZXJhbmQxLCBvcGVyYW5kMik7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCQkqLwotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCUlBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZFeHByID0gKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKWV4cHI7Ci0JCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZFeHByLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCUlBU1RFeHByZXNzaW9uIHBhcmFtZXRlciA9IGZFeHByLmdldFBhcmFtZXRlckV4cHJlc3Npb24oKTsKLQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCWludCBpZCA9IGJUYWJsZV8uaXNCYXJyaWVyKGZFeHByKTsKLQkJCWlmKGlkICE9IC0xKXsgLyogYmFycmllciAqLwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKGlkKTsKLQkJCQlTdHJpbmcgY29tbSA9IGJUYWJsZV8uZ2V0Q29tbShpZCk7Ci0JCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHN0YWNrc18ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0cmluZyBjb21ta2V5ID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBzdGFja3NfLmdldChjb21ta2V5KTsKLQkJCQkJaWYocGFyYW1ldGVyICE9IG51bGwpIHNrLnBvcCgpOyAvL3BhcmFtZXRlciAKLQkJCQkJc2sucG9wKCk7IC8vZnVuY3Rpb25OYW1lCi0JCQkJCWlmKGNvbW1rZXkuZXF1YWxzKGNvbW0pKSBzay5wdXNoKGJlKTsKLQkJCQkJZWxzZSBzay5wdXNoKG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnROb2RlXy5nZXRGaWxlTmFtZSgpLCBzaWduYXR1cmUpOwotCQkJCWlmKG5vZGUgIT0gbnVsbCAmJiBub2RlLmJhcnJpZXJSZWxhdGVkKCkpeyAKLQkJCQkJLyogYSBmdW5jdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgd2l0aCBiYXJyaWVycyAqLwotCQkJCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gc3RhY2tzXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gc3RhY2tzXy5nZXQoY29tbSk7Ci0JCQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBmdW5jQkUgPSBub2RlLmdldEJhcnJpZXJFeHByKCkuZ2V0KGNvbW0pOwotCQkJCQkJaWYocGFyYW1ldGVyICE9IG51bGwpIHNrLnBvcCgpOyAvL3BhcmFtZXRlcgotCQkJCQkJc2sucG9wKCk7IC8vZnVuY3Rpb25OYW1lCi0JCQkJCQlpZihub2RlID09IGN1cnJlbnROb2RlXyl7IC8vcmVjdXJzaXZlIGZ1bmN0aW9ucwotCQkJCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKG5vZGUuZ2V0RnVuY05hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKGZ1bmNCRS5pc0JvdCgpKXsKLQkJCQkJCQliZSA9IG5ldyBCYXJyaWVyRXhwcmVzc2lvbihCYXJyaWVyRXhwcmVzc2lvbi5CRV9ib3QpOwotCQkJCQkJfSAKLQkJCQkJCWVsc2V7Ci0JCQkJCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oc2lnbmF0dXJlKTsKLQkJCQkJCX0KLQkJCQkJCXNrLnB1c2goYmUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy9ub3QgYSBiYXJyaWVyIHJlbGF0ZWQgZnVuY3Rpb24KLQkJCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQkJZm9yKEVudW1lcmF0aW9uPFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPj4gZSA9IHN0YWNrc18uZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQkJaWYocGFyYW1ldGVyICE9IG51bGwpIHNrLnBvcCgpOyAvL3BhcmFtZXRlcgotCQkJCQkJc2sucG9wKCk7IC8vZnVuY3Rpb25OYW1lCi0JCQkJCQlzay5wdXNoKGJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUSWRFeHByZXNzaW9uKXsgLy90ZXJtaW5hbAotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oKChJQVNUSWRFeHByZXNzaW9uKWV4cHIpLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUTGl0ZXJhbEV4cHJlc3Npb24peyAvL3Rlcm1pbmFsCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigoKElBU1RMaXRlcmFsRXhwcmVzc2lvbilleHByKS50b1N0cmluZygpKTsKLQkJCWZvcihFbnVtZXJhdGlvbjxTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4+IGUgPSBzdGFja3NfLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4gc2sgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJYmUgPSBuZXcgQmFycmllckV4cHJlc3Npb24oQmFycmllckV4cHJlc3Npb24uQkVfYm90KTsKLQkJCQlzay5wdXNoKGJlKTsKLQkJCX0KLQkJfQotCQkvKgotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUUHJvYmxlbUV4cHJlc3Npb24pewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJQVNUUHJvYmxlbUV4cHJlc3Npb24iKTsKLQkJfQotCQkqLwotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUVHlwZUlkRXhwcmVzc2lvbil7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RhY2s8QmFycmllckV4cHJlc3Npb24+PiBlID0gc3RhY2tzXy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RhY2s8QmFycmllckV4cHJlc3Npb24+IHNrID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWJlID0gbmV3IEJhcnJpZXJFeHByZXNzaW9uKEJhcnJpZXJFeHByZXNzaW9uLkJFX2JvdCk7Ci0JCQkJc2sucHVzaChiZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFVuYXJ5RXhwcmVzc2lvbil7Ci0JCQkvKiBoYXMgb25seSBvbmUgb3BlcmFuZCwgbGVhdmUgaXQgdGhlcmUgKi8KLQkJfQotCQkvKgotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQ0FTVFR5cGVJZEluaXRpYWxpemVyRXhwcmVzc2lvbil7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklDQVNUVHlwZUlkSW5pdGlhbGl6ZXJFeHByZXNzaW9uIik7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JfQotCi0JY2xhc3MgQ2FzZUJhcnJpZXJFeHByewotCQlwcm90ZWN0ZWQgQmFycmllckV4cHJlc3Npb24gQkU7Ci0JCXByb3RlY3RlZCBib29sZWFuIGNsb3NlZDsKLQkJcHJvdGVjdGVkIElBU1RFeHByZXNzaW9uIGNvbmQ7Ci0JCQotCQlDYXNlQmFycmllckV4cHIoQmFycmllckV4cHJlc3Npb24gYmUsIElBU1RFeHByZXNzaW9uIGNvbmQpewotCQkJQkUgPSBiZTsKLQkJCWNsb3NlZCA9IGZhbHNlOwotCQkJdGhpcy5jb25kID0gY29uZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xvc2UoKSB7IGNsb3NlZCA9IHRydWU7IH0KLQkJcHVibGljIEJhcnJpZXJFeHByZXNzaW9uIGdldEJFKCkge3JldHVybiBCRTt9Ci0JCXB1YmxpYyBJQVNURXhwcmVzc2lvbiBnZXRDb25kKCkge3JldHVybiBjb25kO30KLQotCQlwdWJsaWMgdm9pZCBhZGRCRUVsZW1lbnQoQmFycmllckV4cHJlc3Npb24gYmUpewotCQkJaWYoY2xvc2VkKSByZXR1cm47Ci0JCQlpZihCRSA9PSBudWxsKXsKLQkJCQlCRSA9IGJlOwotCQkJfSBlbHNlIHsKLQkJCQlCRSA9IEJhcnJpZXJFeHByZXNzaW9uLmNvbmNhdEJFKEJFLCBiZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEZpbmFsQkVFbGVtZW50KEJhcnJpZXJFeHByZXNzaW9uIGJlKXsKLQkJCWFkZEJFRWxlbWVudChiZSk7Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQmFycmllclJlY3Vyc2lvbigpewotCQlmb3IoSXRlcmF0b3I8TGlzdDxJQ2FsbEdyYXBoTm9kZT4+IGk9Y2dfLmdldEN5Y2xlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlMaXN0PElDYWxsR3JhcGhOb2RlPiBjeWNsZSA9IGkubmV4dCgpOwotCQkJYm9vbGVhbiBiYXJyaWVyUmVsYXRlZCA9IGZhbHNlOwotCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpaSA9IGN5Y2xlLml0ZXJhdG9yKCk7IGlpLmhhc05leHQoKTspewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWlpLm5leHQoKTsKLQkJCQlpZihub2RlLmJhcnJpZXJSZWxhdGVkKXsKLQkJCQkJYmFycmllclJlbGF0ZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZighYmFycmllclJlbGF0ZWQpIGNvbnRpbnVlOwotCQkJaWYoY3ljbGUuc2l6ZSgpID4gMSl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aS1GdW5jdGlvbiBiYXJyaWVyIHJlbGF0ZWQgY3ljbGVzIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY3VycmVudE5vZGVfID0gKE1QSUNhbGxHcmFwaE5vZGUpY3ljbGUuZ2V0KDApOwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGN1cnJlbnROb2RlXy5nZXRCYXJyaWVyRXhwcigpLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyBjb21tID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCUJhcnJpZXJFeHByZXNzaW9uIEJFID0gY3VycmVudE5vZGVfLmdldEJhcnJpZXJFeHByKCkuZ2V0KGNvbW0pOwotCQkJCWlmKHJlY3Vyc2lvbihCRSkgPT0gcmVjdXJzaW9uRXJyb3IpewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY3Vyc2lvbiBFcnJvciBpbiAiICsgY29tbSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIGludCByZWN1cnNpb25Db3JyZWN0ID0gMDsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHJlY3Vyc2lvbkVycm9yID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IG5vUmVjdXJzaW9uID0gMjsKLQkKLQlwcm90ZWN0ZWQgaW50IHJlY3Vyc2lvbihCYXJyaWVyRXhwcmVzc2lvbiBCRSl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihCRS5wcmV0dHlQcmludGVyKCkpOwotCQlCYXJyaWVyRXhwcmVzc2lvbk9QIE9QID0gQkUuZ2V0T1AoKTsKLQkJaWYoT1AgPT0gbnVsbCl7Ci0JCQlpZihCRS5pc0Z1bmMoKSl7IC8vZnVuY3Rpb24gY2FsbAotCQkJCVN0cmluZyBmdW5jTmFtZSA9IEJFLmdldEZ1bmNOYW1lKCk7Ci0JCQkJTVBJQ2FsbEdyYXBoTm9kZSBmbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnROb2RlXy5nZXRGaWxlTmFtZSgpLCBmdW5jTmFtZSk7Ci0JCQkJaWYoZm5vZGUgPT0gY3VycmVudE5vZGVfKQotCQkJCQlyZXR1cm4gcmVjdXJzaW9uQ29ycmVjdDsKLQkJCQllbHNlIAotCQkJCQlyZXR1cm4gbm9SZWN1cnNpb247Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vUmVjdXJzaW9uOwotCQl9Ci0JCWVsc2UgaWYoT1AuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2NvbmNhdCl7Ci0JCQlpbnQgdjEgPSByZWN1cnNpb24oQkUuZ2V0T1AxKCkpOwotCQkJaW50IHYyID0gcmVjdXJzaW9uKEJFLmdldE9QMigpKTsKLQkJCWlmKHYxID09IHJlY3Vyc2lvbkVycm9yIHx8IHYyID09IHJlY3Vyc2lvbkVycm9yKQotCQkJCXJldHVybiByZWN1cnNpb25FcnJvcjsKLQkJCWVsc2UgaWYodjEgPT0gcmVjdXJzaW9uQ29ycmVjdCB8fCB2MiA9PSByZWN1cnNpb25Db3JyZWN0KQotCQkJCXJldHVybiByZWN1cnNpb25Db3JyZWN0OwotCQkJZWxzZSAKLQkJCQlyZXR1cm4gbm9SZWN1cnNpb247Ci0KLQkJfQotCQllbHNlIGlmKE9QLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpewotCQkJaW50IHYxID0gcmVjdXJzaW9uKEJFLmdldE9QMSgpKTsKLQkJCWludCB2MiA9IHJlY3Vyc2lvbihCRS5nZXRPUDIoKSk7Ci0JCQlpZih2MSA9PSBub1JlY3Vyc2lvbiAmJiB2MiA9PSBub1JlY3Vyc2lvbikKLQkJCQlyZXR1cm4gbm9SZWN1cnNpb247Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHJlY3Vyc2lvbkVycm9yOwotCQl9Ci0JCWVsc2UgeyAvL0JhcnJpZXJFeHByZXNzaW9uT1Aub3BfcmVwZWF0Ci0JCQlyZXR1cm4gcmVjdXJzaW9uKEJFLmdldE9QMSgpKTsKLQotCQl9Ci0JfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCYXJyaWVyTWF0Y2hpbmcuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQmFycmllck1hdGNoaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTI4ZjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCYXJyaWVyTWF0Y2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURG9TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGaWxlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVElmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTd2l0Y2hTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUV2hpbGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jLkNBU1RDb21wb3VuZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlNvdXJjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLkJhcnJpZXJFeHByZXNzaW9uLkJhcnJpZXJFeHByZXNzaW9uT1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLkJhcnJpZXJUYWJsZS5CYXJyaWVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDb250cm9sRmxvd0dyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5wb3B1cC5hY3Rpb25zLlNob3dNYXRjaFNldDsKLQotcHVibGljIGNsYXNzIE1QSUJhcnJpZXJNYXRjaGluZyB7Ci0JcHJvdGVjdGVkIElDYWxsR3JhcGggY2dfOwotCXByb3RlY3RlZCBJQ29udHJvbEZsb3dHcmFwaCBjZmdfOwotCXByb3RlY3RlZCBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnRGdW5jXzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRDb21tXzsKLQkKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPEJhcnJpZXJFeHByZXNzaW9uLExpc3Q8QmFycmllckV4cHJlc3Npb24+PiB2aXNpdGVkXzsKLQlwcm90ZWN0ZWQgQmFycmllclRhYmxlIGJhcnJpZXJUYWJsZV87IAotCXByb3RlY3RlZCBMaXN0PEVycm9yTWVzc2FnZT4gYmFycmllckVycm9yc187Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3I7Ci0JCi0JcHJvdGVjdGVkIGludCBtdiA9IDA7Ci0JcHJvdGVjdGVkIGludCBzdiA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZU9uPWZhbHNlOwotCQotCXB1YmxpYyBNUElCYXJyaWVyTWF0Y2hpbmcoSUNhbGxHcmFwaCBjZywgQmFycmllclRhYmxlIHRhYmxlKXsKLQkJY2dfID0gY2c7Ci0JCWJhcnJpZXJUYWJsZV8gPSB0YWJsZTsKLQkJdmlzaXRlZF8gPSBuZXcgSGFzaHRhYmxlPEJhcnJpZXJFeHByZXNzaW9uLExpc3Q8QmFycmllckV4cHJlc3Npb24+PigpOwotCQliYXJyaWVyRXJyb3JzXyA9IG5ldyBBcnJheUxpc3Q8RXJyb3JNZXNzYWdlPigpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxFcnJvck1lc3NhZ2U+IGdldEVycm9ycygpewotCQlyZXR1cm4gYmFycmllckVycm9yc187Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlib29sZWFuIGVycm9yQWxyZWFkeVJlcG9ydGVkPWZhbHNlOwotCQlmb3IoSUNhbGxHcmFwaE5vZGUgbiA9IGNnXy5ib3RFbnRyeSgpOyBuICE9IG51bGw7IG4gPSBuLmJvdE5leHQoKSl7Ci0JCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSluOwotCQkJaWYoIW5vZGUubWFya2VkIHx8ICFub2RlLmJhcnJpZXJSZWxhdGVkKCkpIGNvbnRpbnVlOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obm9kZS5nZXRGdW5jTmFtZSgpKTsKLQkJCWN1cnJlbnRGdW5jXyA9IG5vZGU7Ci0JCQljZmdfID0gbm9kZS5nZXRDRkcoKTsKLQkJCUhhc2h0YWJsZTxTdHJpbmcsQmFycmllckV4cHJlc3Npb24+IGJhcnJpZXJFeHByID0gbm9kZS5nZXRCYXJyaWVyRXhwcigpOwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGJhcnJpZXJFeHByLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCWN1cnJlbnRDb21tXyA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotCQkJCUJhcnJpZXJFeHByZXNzaW9uIGJlID0gYmFycmllckV4cHIuZ2V0KGN1cnJlbnRDb21tXyk7Ci0JCQkJZXJyb3IgPSBmYWxzZTsKLQkJCQlmaXhlZExlbmd0aChiZSk7Ci0JCQkJaWYoZXJyb3Ipey8vIEJSVCB0aGlzIHJlcG9ydHMgYW4gZXJyb3IgZGlhbG9nIGZvciAqZWFjaCogYmFycmllciBtYXRjaGluZyBlcnJvciBmb3VuZCEKLQkJCQkJaWYgKCFlcnJvckFscmVhZHlSZXBvcnRlZCkgewotCQkJCQkJZXJyb3JBbHJlYWR5UmVwb3J0ZWQ9dHJ1ZTsKLQkJCQkJCVN0cmluZyBlcnJvck1zZyA9ICJGb3VuZCBiYXJyaWVyIHN5bmNocm9uaXphdGlvbiBlcnJvcihzKSEiOwotCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oU2hvd01hdGNoU2V0Ci0JCQkJCQkJCS5nZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCQkiTVBJIEJhcnJpZXIgQW5hbHlzaXMiLCBlcnJvck1zZyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJCWZpbmRNYXRjaGVzKGJlKTsKLQkJCX0KLQkJfQotCQkvL3N5bW1NYXRjaGVzKCk7Ci0JCWlmKHRyYWNlT24pcHJpbnRNYXRjaGVzKCk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJtdiA9ICIgKyBtdiArICIsIHN2ID0gIiArIHN2KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZml4ZWRMZW5ndGgoQmFycmllckV4cHJlc3Npb24gQkUpewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihCRS5wcmV0dHlQcmludGVyKCkpOwotCQlCYXJyaWVyRXhwcmVzc2lvbk9QIE9QID0gQkUuZ2V0T1AoKTsKLQkJaWYoT1AgPT0gbnVsbCl7Ci0JCQlpZihCRS5pc0JvdCgpKXsKLQkJCQlCRS5zZXRMZW5ndGgoMCk7Ci0JCQl9Ci0JCQllbHNlIGlmKEJFLmlzQmFycmllcigpKXsKLQkJCQlCRS5zZXRMZW5ndGgoMSk7Ci0JCQl9Ci0JCQllbHNlIHsgLy9mdW5jdGlvbiBjYWxsCi0JCQkJU3RyaW5nIGZ1bmNOYW1lID0gQkUuZ2V0RnVuY05hbWUoKTsKLQkJCQlNUElDYWxsR3JhcGhOb2RlIGZub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpY2dfLmdldE5vZGUoY3VycmVudEZ1bmNfLmdldEZpbGVOYW1lKCksIGZ1bmNOYW1lKTsKLQkJCQlpZihmbm9kZSAhPSBudWxsICYmIGZub2RlLmJhcnJpZXJSZWxhdGVkKCkpewotCQkJCQlpZihmbm9kZS5pc1JlY3Vyc2l2ZSgpKQotCQkJCQkJQkUuc2V0TGVuZ3RoKEJhcnJpZXJFeHByZXNzaW9uLlRPUCk7Ci0JCQkJCWVsc2V7Ci0JCQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBmQkUgPSBmbm9kZS5nZXRCYXJyaWVyRXhwcigpLmdldChjdXJyZW50Q29tbV8pOwotCQkJCQkJQkUuc2V0TGVuZ3RoKGZCRS5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlCRS5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoT1AuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2NvbmNhdCl7Ci0JCQlCYXJyaWVyRXhwcmVzc2lvbiBvcHJkMSA9IEJFLmdldE9QMSgpOwotCQkJQmFycmllckV4cHJlc3Npb24gb3ByZDIgPSBCRS5nZXRPUDIoKTsKLQkJCWZpeGVkTGVuZ3RoKG9wcmQxKTsKLQkJCWZpeGVkTGVuZ3RoKG9wcmQyKTsKLQkJCWludCBsZW5ndGgxID0gb3ByZDEuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgbGVuZ3RoMiA9IG9wcmQyLmdldExlbmd0aCgpOwotCi0JCQlpZihsZW5ndGgxID09IEJhcnJpZXJFeHByZXNzaW9uLlRPUCB8fCBsZW5ndGgyID09IEJhcnJpZXJFeHByZXNzaW9uLlRPUCl7Ci0JCQkJQkUuc2V0TGVuZ3RoKEJhcnJpZXJFeHByZXNzaW9uLlRPUCk7Ci0JCQl9IGVsc2UgewotCQkJCUJFLnNldExlbmd0aChsZW5ndGgxICsgbGVuZ3RoMik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihPUC5nZXRPcGVyYXRvcigpID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfYnJhbmNoKXsKLQkJCS8qIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gKi8KLQkJCUJhcnJpZXJFeHByZXNzaW9uIG9wcmQxID0gQkUuZ2V0T1AxKCk7Ci0JCQlCYXJyaWVyRXhwcmVzc2lvbiBvcHJkMiA9IEJFLmdldE9QMigpOwotCQkJZml4ZWRMZW5ndGgob3ByZDEpOwotCQkJZml4ZWRMZW5ndGgob3ByZDIpOwotCQkJaW50IGxlbmd0aDEgPSBvcHJkMS5nZXRMZW5ndGgoKTsKLQkJCWludCBsZW5ndGgyID0gb3ByZDIuZ2V0TGVuZ3RoKCk7Ci0JCQlNUElCbG9jayBjb25kID0gKE1QSUJsb2NrKWNmZ18uZ2V0QmxvY2soT1AuZ2V0Q29uZGl0aW9uKCksIE9QLmdldFN0YXRlbWVudCgpKTsKLQkJCWlmKGNvbmQuZ2V0TVYoKSkgbXYgKys7Ci0JCQllbHNlIHN2ICsrOwotCQkJaWYobGVuZ3RoMSA9PSBCYXJyaWVyRXhwcmVzc2lvbi5UT1AgfHwgbGVuZ3RoMiA9PSBCYXJyaWVyRXhwcmVzc2lvbi5UT1ApewotCQkJCUJFLnNldExlbmd0aChCYXJyaWVyRXhwcmVzc2lvbi5UT1ApOwotCQkJCWlmKGNvbmQuZ2V0TVYoKSl7Ci0JCQkJCUJFLnNldEVycm9yRmxhZyh0cnVlKTsKLQkJCQkJaWYoIShvcHJkMS5nZXRFcnJvckZsYWcoKSB8fCBvcHJkMi5nZXRFcnJvckZsYWcoKSkpewotCQkJCQkJLy8gV2Ugb25seSByZXBvcnQgZXJyb3JzIGluIHRoZSBsb3dlc3QgbGV2ZWwKLQkJCQkJCXJlcG9ydFdhcm5pbmcoQkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmKGxlbmd0aDEgPT0gbGVuZ3RoMil7Ci0JCQkJQkUuc2V0TGVuZ3RoKGxlbmd0aDEpOwotCQkJfSBlbHNlIHsgLy8gbGVuZ3RoMSAhPSBUT1AgJiYgbGVuZ3RoMiAhPSBUT1AgJiYgbGVuZ3RoMSAhPSBsZW5ndGgyCi0JCQkJQkUuc2V0TGVuZ3RoKEJhcnJpZXJFeHByZXNzaW9uLlRPUCk7Ci0JCQkJaWYoY29uZC5nZXRNVigpKXsKLQkJCQkJQkUuc2V0RXJyb3JGbGFnKHRydWUpOwotCQkJCQlpZighKG9wcmQxLmdldEVycm9yRmxhZygpIHx8IG9wcmQyLmdldEVycm9yRmxhZygpKSl7Ci0JCQkJCQlyZXBvcnRXYXJuaW5nKEJFKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vQmFycmllckV4cHJlc3Npb25PUC5vcF9yZXBlYXQKLQkJCUJhcnJpZXJFeHByZXNzaW9uIG9wcmQgPSBCRS5nZXRPUDEoKTsKLQkJCWZpeGVkTGVuZ3RoKG9wcmQpOwotCQkJTVBJQmxvY2sgY29uZCA9IChNUElCbG9jayljZmdfLmdldEJsb2NrKE9QLmdldENvbmRpdGlvbigpLCBPUC5nZXRTdGF0ZW1lbnQoKSk7Ci0JCQlpZihjb25kLmdldE1WKCkpIG12ICsrOwotCQkJZWxzZSBzdiArKzsKLQkJCWlmKG9wcmQuZ2V0TGVuZ3RoKCkgPT0gMCl7Ci0JCQkJQkUuc2V0TGVuZ3RoKDApOwotCQkJfSBlbHNlIHsKLQkJCQlCRS5zZXRMZW5ndGgoQmFycmllckV4cHJlc3Npb24uVE9QKTsKLQkJCQlpZihjb25kLmdldE1WKCkpewotCQkJCQlCRS5zZXRFcnJvckZsYWcodHJ1ZSk7Ci0JCQkJCWlmKCFvcHJkLmdldEVycm9yRmxhZygpKXsKLQkJCQkJCXJlcG9ydFdhcm5pbmcoQkUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXBvcnRXYXJuaW5nKEJhcnJpZXJFeHByZXNzaW9uIEJFKXsKLQkJZXJyb3IgPSB0cnVlOwotCQkKLQkJSUFTVFN0YXRlbWVudCBzdG10ID0gQkUuZ2V0T1AoKS5nZXRTdGF0ZW1lbnQoKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkJhcnJpZXIgbWlzbWF0Y2hpbmcgZm91bmQgaW4gIiArIHN0bXQpOwotCQlJQVNURXhwcmVzc2lvbiBjb25kID0gbnVsbDsKLQkJCi0JCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpCi0JCQljb25kID0gKChJQVNUSWZTdGF0ZW1lbnQpc3RtdCkuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpOwotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQpCi0JCQljb25kID0gKChJQVNURG9TdGF0ZW1lbnQpc3RtdCkuZ2V0Q29uZGl0aW9uKCk7Ci0JCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpCi0JCQljb25kID0gKChJQVNURm9yU3RhdGVtZW50KXN0bXQpLmdldENvbmRpdGlvbkV4cHJlc3Npb24oKTsKLQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KQotCQkJY29uZCA9ICgoSUFTVFdoaWxlU3RhdGVtZW50KXN0bXQpLmdldENvbmRpdGlvbigpOwotCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KQotCQkJY29uZCA9ICgoSUFTVFN3aXRjaFN0YXRlbWVudClzdG10KS5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpOwotCQllbHNlewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCYXJyaWVyIEV4cHJlc3Npb24gZG9lc24ndCBoYXZlIHZhbGlkIGNvbmRpdGlvbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgbGluZSA9IC0xOwotCQlJQVNUTm9kZUxvY2F0aW9uW10gbG9jYXRpb25zID0gY29uZC5nZXROb2RlTG9jYXRpb25zKCk7Ci0JCWlmIChsb2NhdGlvbnMubGVuZ3RoID09IDEpIHsKLQkJCUlBU1RGaWxlTG9jYXRpb24gYXN0RmlsZUxvY2F0aW9uID0gbnVsbDsKLQkJCWlmIChsb2NhdGlvbnNbMF0gaW5zdGFuY2VvZiBJQVNURmlsZUxvY2F0aW9uKXsKLQkJCQlhc3RGaWxlTG9jYXRpb24gPSAoSUFTVEZpbGVMb2NhdGlvbikgbG9jYXRpb25zWzBdOwotCQkJCWxpbmUgPSBhc3RGaWxlTG9jYXRpb24uZ2V0U3RhcnRpbmdMaW5lTnVtYmVyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeXsKLQkJCS8vIEJSVCBiYXJyaWVyTWFya2VyIGNoYW5nZSB0byBwcm9ibGVtIG1hcmtlciBoZXJlPwotCQkJSU1hcmtlciBtID0gY3VycmVudEZ1bmNfLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKElNYXJrZXIuUFJPQkxFTSk7Ci0JCQkvL0lNYXJrZXIgbSA9IGN1cnJlbnRGdW5jXy5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihJRHMuZXJyb3JNYXJrZXJJRCk7Ci0JCQltLnNldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCBsaW5lKTsKLQkJCW0uc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgIkJhcnJpZXIgU3luY2hyb25pemF0aW9uIEVycm9yIik7Ci0JCQltLnNldEF0dHJpYnV0ZShJTWFya2VyLlBSSU9SSVRZLCBJTWFya2VyLlBSSU9SSVRZX0hJR0gpOwotCQkJbS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCX1jYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSTTogZXhjZXB0aW9uIGNyZWF0aW5nIG1hcmtlcnMuIik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJRXJyb3JNZXNzYWdlIGVyciA9IG5ldyBFcnJvck1lc3NhZ2UoY29uZCwgc3RtdCwgY3VycmVudEZ1bmNfLmdldEZ1bmNOYW1lKCksIAotCQkJCWN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpLCBjdXJyZW50RnVuY18uZ2V0UmVzb3VyY2UoKSk7Ci0JCWNvdW50ZXJFeGFtcGxlKEJFLCBlcnIpOwotCQliYXJyaWVyRXJyb3JzXy5hZGQoZXJyKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCB2b2lkIGNvdW50ZXJFeGFtcGxlKEJhcnJpZXJFeHByZXNzaW9uIEJFLCBFcnJvck1lc3NhZ2UgZXJyKXsKLQkJQmFycmllckV4cHJlc3Npb25PUCBvcCA9IEJFLmdldE9QKCk7Ci0JCWlmKG9wLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpewotCQkJTGlzdDxQYXRoTm9kZT4gcGF0aDEgPSBuZXcgQXJyYXlMaXN0PFBhdGhOb2RlPigpOwotCQkJTGlzdDxQYXRoTm9kZT4gcGF0aDIgPSBuZXcgQXJyYXlMaXN0PFBhdGhOb2RlPigpOwotCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQl3aGlsZSh0cnVlKXsKLQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJdHJhdmVyc2VCYXJyaWVyRXhwcihwYXRoMSwgQkUuZ2V0T1AxKCksIGNmZ18pOwotCQkJCXRyYXZlcnNlQmFycmllckV4cHIocGF0aDIsIEJFLmdldE9QMigpLCBjZmdfKTsKLQkJCQlpZihkaWZmZXJlbnRMZW5ndGgocGF0aDEsIHBhdGgyKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYoIWNoYW5nZWQgJiYgIWZpcnN0KXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXZSBjYW5ub3QgZmluZCB0aGUgY291bnRlciBleGFtcGxlISIpOwotCQkJCX0KLQkJCQlpZihmaXJzdCkgZmlyc3QgPSB0cnVlOwotCQkJCXBhdGgxID0gbmV3IEFycmF5TGlzdDxQYXRoTm9kZT4oKTsKLQkJCQlwYXRoMiA9IG5ldyBBcnJheUxpc3Q8UGF0aE5vZGU+KCk7Ci0JCQl9Ci0JCQllcnIuc2V0UGF0aDEocGF0aDEpOwotCQkJZXJyLnNldFBhdGgyKHBhdGgyKTsKLQkJCQotCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlBhdGggMTogIik7Ci0JCQlmb3IoSXRlcmF0b3I8UGF0aE5vZGU+IGk9cGF0aDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlQYXRoTm9kZSBwbiA9IGkubmV4dCgpOwotCQkJCXBuLnByaW50KCk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50KCIsICIpOwotCQkJfQotCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIiAiKTsKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJQYXRoIDI6ICIpOwotCQkJZm9yKEl0ZXJhdG9yPFBhdGhOb2RlPiBpPXBhdGgyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJUGF0aE5vZGUgcG4gPSBpLm5leHQoKTsKLQkJCQlwbi5wcmludCgpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludCgiLCAiKTsKLQkJCX0KLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0JCX0KLQkJZWxzZSBpZihvcC5nZXRPcGVyYXRvcigpID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfcmVwZWF0KXsKLQkJCUxpc3Q8UGF0aE5vZGU+IHBhdGgxID0gbmV3IEFycmF5TGlzdDxQYXRoTm9kZT4oKTsKLQkJCXRyYXZlcnNlQmFycmllckV4cHIocGF0aDEsIEJFLmdldE9QMSgpLCBjZmdfKTsKLQkJCWZvcihJdGVyYXRvcjxQYXRoTm9kZT4gaSA9IHBhdGgxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJUGF0aE5vZGUgcG4gPSBpLm5leHQoKTsKLQkJCQlwbi5zZXRSZXBlYXQodHJ1ZSk7Ci0JCQl9Ci0JCQllcnIuc2V0UGF0aDEocGF0aDEpOwotCQkJCi0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUGF0aDogIik7Ci0JCQlmb3IoSXRlcmF0b3I8UGF0aE5vZGU+IGk9cGF0aDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlQYXRoTm9kZSBwbiA9IGkubmV4dCgpOwotCQkJCXBuLnByaW50KCk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50KCIsICIpOwotCQkJfQotCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIiAiKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZUJhcnJpZXJFeHByKExpc3Q8UGF0aE5vZGU+IHBhdGgsIEJhcnJpZXJFeHByZXNzaW9uIEJFLCAKLQkJCUlDb250cm9sRmxvd0dyYXBoIGNmZyl7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKEJFLnByZXR0eVByaW50ZXIoKSk7Ci0JCUJhcnJpZXJFeHByZXNzaW9uT1Agb3AgPSBCRS5nZXRPUCgpOwotCQlpZihvcCA9PSBudWxsKXsKLQkJCWlmKEJFLmlzQm90KCkpewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYoQkUuaXNCYXJyaWVyKCkpewotCQkJCUJhcnJpZXJJbmZvIGJhcnJpZXIgPSBiYXJyaWVyVGFibGVfLnNlYXJjaEJhcnJpZXJieUlEKEJFLmdldEJhcnJpZXJJRCgpKTsKLQkJCQlQYXRoTm9kZSBwbiA9IG5ldyBQYXRoTm9kZShiYXJyaWVyLCBmYWxzZSk7Ci0JCQkJcGF0aC5hZGQocG4pOwotCQkJfQotCQkJZWxzZSB7IC8vZnVuY3Rpb24gY2FsbAotCQkJCVN0cmluZyBmdW5jTmFtZSA9IEJFLmdldEZ1bmNOYW1lKCk7Ci0JCQkJTVBJQ2FsbEdyYXBoTm9kZSBmbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpLCBmdW5jTmFtZSk7Ci0JCQkJaWYoZm5vZGUgIT0gbnVsbCAmJiBmbm9kZS5iYXJyaWVyUmVsYXRlZCgpKXsKLQkJCQkJQmFycmllckV4cHJlc3Npb24gZkJFID0gKEJhcnJpZXJFeHByZXNzaW9uKWZub2RlLmdldEJhcnJpZXJFeHByKCkuZ2V0KGN1cnJlbnRDb21tXyk7Ci0JCQkJCXRyYXZlcnNlQmFycmllckV4cHIocGF0aCwgZkJFLCBmbm9kZS5nZXRDRkcoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKG9wLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpewotCQkJTVBJQmxvY2sgY29uZCA9IChNUElCbG9jayljZmcuZ2V0QmxvY2sob3AuZ2V0Q29uZGl0aW9uKCksIG9wLmdldFN0YXRlbWVudCgpKTsKLQkJCWlmKGNvbmQuZ2V0TVYoKSl7IAotCQkJCS8qIENvbmN1cnJlbnQgYnJhbmNoLiBCb3RoIGJyYW5jaGVzIHNob3VsZCBoYXZlIHNhbWUgbGVuZ3RocywgCi0JCQkJICogdGh1cyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBicmFuY2ggdG8gY2hvb3NlLiBCeSBkZWZhdWx0IAotCQkJCSAqIHdlIGNob29zZSB0aGUgbGVmdCBicmFuY2guIAotCQkJCSAqLwotCQkJCXRyYXZlcnNlQmFycmllckV4cHIocGF0aCwgQkUuZ2V0T1AxKCksIGNmZyk7Ci0JCQl9IGVsc2UgaWYoQkUuZ2V0TGVuZ3RoKCkgIT0gQmFycmllckV4cHJlc3Npb24uVE9QKXsKLQkJCQkvKiBCb3RoIGJyYW5jaGVzIGhhdmUgc2FtZSBsZW5ndGggdGhhdCBhcmUgbm90IFxUT1AgKi8KLQkJCQl0cmF2ZXJzZUJhcnJpZXJFeHByKHBhdGgsIEJFLmdldE9QMSgpLCBjZmcpOwotCQkJfSBlbHNlIGlmKGNoYW5nZWQpewotCQkJCS8qIFNvbWUgY2hhbmdlIGhhcyBiZWVuIG1hZGUgc29tZXdoZXJlIGVsc2UuIFNvIGtlZXAgdGhlIAotCQkJCSAqIHByZXZpb3VzIGNob2ljZSBhdCB0aGlzIHBvaW50Ci0JCQkJICovCi0JCQkJaWYoQkUuZ2V0T1AyKCkuY2VWaXNpdGVkKQotCQkJCQl0cmF2ZXJzZUJhcnJpZXJFeHByKHBhdGgsIEJFLmdldE9QMigpLCBjZmcpOwotCQkJCWVsc2UKLQkJCQkJdHJhdmVyc2VCYXJyaWVyRXhwcihwYXRoLCBCRS5nZXRPUDEoKSwgY2ZnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogTm90aGluZyBjaGFuZ2VkIHRpbGwgbm93ICovCi0JCQkJaWYoQkUuZ2V0T1AyKCkuY2VWaXNpdGVkKXsKLQkJCQkJLyogV2UgY2Fubm90IG1ha2UgYW55IGNoYW5nZS4gS2VlcCB0aGUgcHJldmlvdXMgY2hvaWNlICovCi0JCQkJCXRyYXZlcnNlQmFycmllckV4cHIocGF0aCwgQkUuZ2V0T1AyKCksIGNmZyk7Ci0JCQkJfSBlbHNlIGlmKEJFLmdldE9QMSgpLmNlVmlzaXRlZCl7Ci0JCQkJCS8qIE1ha2UgY2hhbmdlIGhlcmUgKi8KLQkJCQkJdHJhdmVyc2VCYXJyaWVyRXhwcihwYXRoLCBCRS5nZXRPUDIoKSwgY2ZnKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogVGhpcyBCRSBpcyB2aXNpdGVkIHRoZSBmaXJzdCB0aW1lICovCi0JCQkJCXRyYXZlcnNlQmFycmllckV4cHIocGF0aCwgQkUuZ2V0T1AxKCksIGNmZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYob3AuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2NvbmNhdCl7Ci0JCQl0cmF2ZXJzZUJhcnJpZXJFeHByKHBhdGgsIEJFLmdldE9QMSgpLCBjZmcpOwotCQkJdHJhdmVyc2VCYXJyaWVyRXhwcihwYXRoLCBCRS5nZXRPUDIoKSwgY2ZnKTsKLQkJfQotCQllbHNlIGlmKG9wLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9yZXBlYXQpewotCQkJdHJhdmVyc2VCYXJyaWVyRXhwcihwYXRoLCBCRS5nZXRPUDEoKSwgY2ZnKTsKLQkJCWZvcihJdGVyYXRvcjxQYXRoTm9kZT4gaSA9IHBhdGguaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlQYXRoTm9kZSBwbiA9IGkubmV4dCgpOwotCQkJCXBuLnNldFJlcGVhdCh0cnVlKTsKLQkJCX0KLQkJfQotCQlCRS5jZVZpc2l0ZWQgPSB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaWZmZXJlbnRMZW5ndGgoTGlzdDxQYXRoTm9kZT4gcGF0aDEsIExpc3Q8UGF0aE5vZGU+IHBhdGgyKXsKLQkJaWYocGF0aDEuc2l6ZSgpICE9IHBhdGgyLnNpemUoKSkgcmV0dXJuIHRydWU7Ci0JCWZvcihpbnQgaSA9IDA7IGk8cGF0aDEuc2l6ZSgpOyBpKyspewotCQkJaWYocGF0aDEuZ2V0KGkpLmlzUmVwZWF0KCkgfHwgcGF0aDIuZ2V0KGkpLmlzUmVwZWF0KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUGF0aE5vZGV7Ci0JCXByaXZhdGUgQmFycmllckluZm8gYmFycmllcl87Ci0JCXByaXZhdGUgYm9vbGVhbiByZXBlYXQ7Ci0JCQotCQlwdWJsaWMgUGF0aE5vZGUoQmFycmllckluZm8gYmFycmllciwgYm9vbGVhbiByZXBlYXQpewotCQkJdGhpcy5iYXJyaWVyXyA9IGJhcnJpZXI7Ci0JCQl0aGlzLnJlcGVhdCA9IHJlcGVhdDsKLQkJfQotCQkKLQkJcHVibGljIFBhdGhOb2RlKEJhcnJpZXJJbmZvIGJhcnJpZXIpewotCQkJdGhpcy5iYXJyaWVyXyA9IGJhcnJpZXI7Ci0JCQlyZXBlYXQgPSBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0UmVwZWF0KGJvb2xlYW4gdmFsKXsKLQkJCXJlcGVhdCA9IHZhbDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNSZXBlYXQoKXsKLQkJCXJldHVybiByZXBlYXQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBCYXJyaWVySW5mbyBnZXRCYXJyaWVyKCl7Ci0JCQlyZXR1cm4gYmFycmllcl87Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHByaW50KCl7Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnQoYmFycmllcl8uZ2V0SUQoKSk7Ci0JCQlpZihyZXBlYXQpCi0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50KCIoKikiKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlewotCQlwcml2YXRlIElBU1RFeHByZXNzaW9uIHBvc2l0aW9uXzsKLQkJcHJpdmF0ZSBJQVNUU3RhdGVtZW50IGVyclN0bXRfOwotCQlwcml2YXRlIFN0cmluZyBmdW5jTmFtZV87Ci0JCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lXzsKLQkJcHJpdmF0ZSBTb3VyY2VJbmZvIHNvdXJjZUluZm9fOwotCQlwcml2YXRlIFNvdXJjZUluZm8gcGF0aDFTb3VyY2VJbmZvXzsKLQkJcHJpdmF0ZSBTb3VyY2VJbmZvIHBhdGgyU291cmNlSW5mb187Ci0JCXByaXZhdGUgSVJlc291cmNlIHJlc291cmNlXzsKLQkJcHJpdmF0ZSBMaXN0PFBhdGhOb2RlPiBwYXRoMV8gPSBudWxsOwotCQlwcml2YXRlIExpc3Q8UGF0aE5vZGU+IHBhdGgyXyA9IG51bGw7Ci0JCXByaXZhdGUgaW50IGxlbmd0aDEgPSAwOwotCQlwcml2YXRlIGludCBsZW5ndGgyID0gMDsKLQkJCi0JCXB1YmxpYyBFcnJvck1lc3NhZ2UoSUFTVEV4cHJlc3Npb24gcG9zLCBJQVNUU3RhdGVtZW50IHN0bXQsIFN0cmluZyBmdW5jTmFtZSwgCi0JCQkJU3RyaW5nIGZpbGVOYW1lLCBJUmVzb3VyY2UgcmVzKXsKLQkJCXBvc2l0aW9uXyA9IHBvczsKLQkJCWVyclN0bXRfID0gc3RtdDsKLQkJCWZ1bmNOYW1lXyA9IGZ1bmNOYW1lOwotCQkJZmlsZU5hbWVfID0gZmlsZU5hbWU7Ci0JCQlyZXNvdXJjZV8gPSByZXM7Ci0JCQlzb3VyY2VJbmZvXyA9IGdldFNvdXJjZUluZm8ocG9zaXRpb25fKTsKLQkJCWlmKGVyclN0bXRfIGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KXsKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZTID0gKElBU1RJZlN0YXRlbWVudCllcnJTdG10XzsKLQkJCQlwYXRoMVNvdXJjZUluZm9fID0gZ2V0U291cmNlSW5mbyhpZlMuZ2V0VGhlbkNsYXVzZSgpKTsKLQkJCQlwYXRoMlNvdXJjZUluZm9fID0gZ2V0U291cmNlSW5mbyhpZlMuZ2V0RWxzZUNsYXVzZSgpKTsKLQkJCX0gZWxzZSBpZihlcnJTdG10XyBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQkJSUFTVERvU3RhdGVtZW50IGRvUyA9IChJQVNURG9TdGF0ZW1lbnQpZXJyU3RtdF87Ci0JCQkJcGF0aDFTb3VyY2VJbmZvXyA9IGdldFNvdXJjZUluZm8oZG9TLmdldEJvZHkoKSk7Ci0JCQkJcGF0aDJTb3VyY2VJbmZvXyA9IG51bGw7Ci0JCQl9IGVsc2UgaWYoZXJyU3RtdF8gaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQlJQVNURm9yU3RhdGVtZW50IGZvclMgPSAoSUFTVEZvclN0YXRlbWVudCllcnJTdG10XzsKLQkJCQlwYXRoMVNvdXJjZUluZm9fID0gZ2V0U291cmNlSW5mbyhmb3JTLmdldEJvZHkoKSk7Ci0JCQkJcGF0aDJTb3VyY2VJbmZvXyA9IG51bGw7Ci0JCQl9IGVsc2UgaWYoZXJyU3RtdF8gaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQpewotCQkJCUlBU1RXaGlsZVN0YXRlbWVudCB3aGlsZVMgPSAoSUFTVFdoaWxlU3RhdGVtZW50KWVyclN0bXRfOwotCQkJCXBhdGgxU291cmNlSW5mb18gPSBnZXRTb3VyY2VJbmZvKHdoaWxlUy5nZXRCb2R5KCkpOwotCQkJCXBhdGgyU291cmNlSW5mb18gPSBudWxsOwotCQkJfSBlbHNlIGlmKGVyclN0bXRfIGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCl7Ci0JCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTID0gKElBU1RTd2l0Y2hTdGF0ZW1lbnQpZXJyU3RtdF87Ci0JCQkJcGF0aDFTb3VyY2VJbmZvXyA9IGdldFNvdXJjZUluZm8oc3dpdGNoUy5nZXRCb2R5KCkpOwotCQkJCXBhdGgyU291cmNlSW5mb18gPSBwYXRoMVNvdXJjZUluZm9fOwotCQkJfQotCQl9Ci0JCQotCQlTb3VyY2VJbmZvIGdldFNvdXJjZUluZm8oSUFTVE5vZGUgbm9kZSl7Ci0JCQlTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBuZXcgU291cmNlSW5mbygpOwotCQkJaWYobm9kZSA9PSBudWxsKSByZXR1cm4gc291cmNlSW5mbzsKLQkJCUlBU1ROb2RlTG9jYXRpb25bXSBsb2NhdGlvbnMgPSBub2RlLmdldE5vZGVMb2NhdGlvbnMoKTsKLQkJCWlmIChsb2NhdGlvbnMubGVuZ3RoID09IDEpIHsKLQkJCQlJQVNURmlsZUxvY2F0aW9uIGFzdEZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQkJaWYgKGxvY2F0aW9uc1swXSBpbnN0YW5jZW9mIElBU1RGaWxlTG9jYXRpb24pewotCQkJCQlhc3RGaWxlTG9jYXRpb24gPSAoSUFTVEZpbGVMb2NhdGlvbikgbG9jYXRpb25zWzBdOwotCQkJCQlzb3VyY2VJbmZvLnNldFN0YXJ0aW5nTGluZShhc3RGaWxlTG9jYXRpb24uZ2V0U3RhcnRpbmdMaW5lTnVtYmVyKCkpOwotCQkJCQlzb3VyY2VJbmZvLnNldFN0YXJ0KGFzdEZpbGVMb2NhdGlvbi5nZXROb2RlT2Zmc2V0KCkpOwotCQkJCQlzb3VyY2VJbmZvLnNldEVuZChhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZU9mZnNldCgpICsgYXN0RmlsZUxvY2F0aW9uLmdldE5vZGVMZW5ndGgoKSk7Ci0JCQkJCXNvdXJjZUluZm8uc2V0Q29uc3RydWN0VHlwZShBcnRpZmFjdC5OT05FKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTVBJQmFycmllck1hdGNoaW5nLmdldFNvdXJjZUluZm8oKS4uICEgTW9yZSB0aGFuIG9uZSBJQVNUTm9kZUxvY2F0aW9uICEiKTsKLQkJCQkvLyBDQVNUQ29tcG91bmRTdGF0ZW1lbnQgY2F1c2VzIHRoaXMuICBQcm9iYWJseSBvaz8gYXNzdW1pbmcgaXQgZGVzY2VuZHMgaW50byB0aGUgY2hpbGQgbm9kZXMKLQkJCQlpZih0cmFjZU9uKSB7Ci0JCQkJaWYobm9kZSBpbnN0YW5jZW9mIENBU1RDb21wb3VuZFN0YXRlbWVudCkgewotCQkJCQlDQVNUQ29tcG91bmRTdGF0ZW1lbnQgY3N0bXQgPSAoQ0FTVENvbXBvdW5kU3RhdGVtZW50KW5vZGU7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29tcG91bmQgc3RtdDogIitjc3RtdC5nZXRSYXdTaWduYXR1cmUoKSk7Ci0JCQkJCUlBU1ROb2RlTG9jYXRpb25bXSBsb2NzID0gY3N0bXQuZ2V0Tm9kZUxvY2F0aW9ucygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlBU1ROb2RlTG9jYXRpb24gbG9jID0gbG9jc1tpXTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBzdWJub2RlOiAiK2xvYy50b1N0cmluZygpKTsJCQkKLQkJCQkJfQotCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZUluZm87IAotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXRoMShMaXN0PFBhdGhOb2RlPiBwYXRoKXsKLQkJCXBhdGgxXyA9IHBhdGg7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yKEl0ZXJhdG9yPFBhdGhOb2RlPiBpID0gcGF0aC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCVBhdGhOb2RlIHBuID0gaS5uZXh0KCk7Ci0JCQkJaWYocG4uaXNSZXBlYXQoKSl7Ci0JCQkJCWxlbmd0aDEgPSAtMTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50ICsrOwotCQkJCX0KLQkJCX0KLQkJCWxlbmd0aDEgPSBjb3VudDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0UGF0aDIoTGlzdDxQYXRoTm9kZT4gcGF0aCl7Ci0JCQlwYXRoMl8gPSBwYXRoOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvcihJdGVyYXRvcjxQYXRoTm9kZT4gaSA9IHBhdGguaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlQYXRoTm9kZSBwbiA9IGkubmV4dCgpOwotCQkJCWlmKHBuLmlzUmVwZWF0KCkpewotCQkJCQlsZW5ndGgyID0gLTE7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQljb3VudCArKzsKLQkJCQl9Ci0JCQl9Ci0JCQlsZW5ndGgyID0gY291bnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQVNURXhwcmVzc2lvbiBnZXRQb3NpdGlvbigpewotCQkJcmV0dXJuIHBvc2l0aW9uXzsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRGdW5jTmFtZSgpewotCQkJcmV0dXJuIGZ1bmNOYW1lXzsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpewotCQkJcmV0dXJuIGZpbGVOYW1lXzsKLQkJfQotCQkKLQkJcHVibGljIFNvdXJjZUluZm8gZ2V0U291cmNlSW5mbygpewotCQkJcmV0dXJuIHNvdXJjZUluZm9fOwotCQl9Ci0JCQotCQlwdWJsaWMgU291cmNlSW5mbyBnZXRQYXRoMVNvdXJjZUluZm8oKXsKLQkJCXJldHVybiBwYXRoMVNvdXJjZUluZm9fOwotCQl9Ci0JCQotCQlwdWJsaWMgU291cmNlSW5mbyBnZXRQYXRoMlNvdXJjZUluZm8oKXsKLQkJCXJldHVybiBwYXRoMlNvdXJjZUluZm9fOwotCQl9Ci0JCQotCQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCl7Ci0JCQlyZXR1cm4gcmVzb3VyY2VfOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDxQYXRoTm9kZT4gZ2V0UGF0aDEoKXsKLQkJCXJldHVybiBwYXRoMV87Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PFBhdGhOb2RlPiBnZXRQYXRoMigpewotCQkJcmV0dXJuIHBhdGgyXzsKLQkJfQotCQkKLQkJcHVibGljIGludCBnZXRMZW5ndGgxKCl7Ci0JCQlyZXR1cm4gbGVuZ3RoMTsKLQkJfQotCQkKLQkJcHVibGljIGludCBnZXRMZW5ndGgyKCl7Ci0JCQlyZXR1cm4gbGVuZ3RoMjsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaW5kTWF0Y2hlcyhCYXJyaWVyRXhwcmVzc2lvbiBCRSl7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKEJFLnByZXR0eVByaW50ZXIoKSk7Ci0JCUJhcnJpZXJFeHByZXNzaW9uT1AgT1AgPSBCRS5nZXRPUCgpOwotCQlpZihCRS52aXNpdGVkKSByZXR1cm47Ci0JCUJFLnZpc2l0ZWQgPSB0cnVlOwotCQlpZihPUCA9PSBudWxsKXsKLQkJCWlmKEJFLmlzRnVuYygpKXsKLQkJCQlTdHJpbmcgZnVuY05hbWUgPSBCRS5nZXRGdW5jTmFtZSgpOwotCQkJCU1QSUNhbGxHcmFwaE5vZGUgZm5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSljZ18uZ2V0Tm9kZShjdXJyZW50RnVuY18uZ2V0RmlsZU5hbWUoKSwgZnVuY05hbWUpOwotCQkJCWlmKGZub2RlICE9IG51bGwgJiYgZm5vZGUuYmFycmllclJlbGF0ZWQoKSl7Ci0JCQkJCUJhcnJpZXJFeHByZXNzaW9uIGZCRSA9IChCYXJyaWVyRXhwcmVzc2lvbilmbm9kZS5nZXRCYXJyaWVyRXhwcigpLmdldChjdXJyZW50Q29tbV8pOwotCQkJCQlmaW5kTWF0Y2hlcyhmQkUpOwotCQkJCX0gCi0JCQl9IGVsc2UgewotCQkJCWxzdGFja18gPSBuZXcgU3RhY2s8QmFycmllckV4cHJlc3Npb24+KCk7Ci0JCQkJc3N0YWNrXyA9IG5ldyBTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4oKTsKLQkJCQl3b3JrTGlzdF8gPSBuZXcgTGlua2VkTGlzdDxXb3JrPigpOwotCQkJCW1hdGNoKEJFLCBCRSwgZG93bik7Ci0JCQkJd2hpbGUoIXdvcmtMaXN0Xy5pc0VtcHR5KCkpewotCQkJCQlXb3JrIHcgPSB3b3JrTGlzdF8ucmVtb3ZlKCk7Ci0JCQkJCW1hdGNoKHcuQkUxXywgdy5CRTJfLCB3LmRpcmVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoT1AuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2NvbmNhdCl7Ci0JCQlCYXJyaWVyRXhwcmVzc2lvbiBvcHJkMSA9IEJFLmdldE9QMSgpOwotCQkJQmFycmllckV4cHJlc3Npb24gb3ByZDIgPSBCRS5nZXRPUDIoKTsKLQkJCWZpbmRNYXRjaGVzKG9wcmQxKTsKLQkJCWZpbmRNYXRjaGVzKG9wcmQyKTsKLQkJfQotCQllbHNlIGlmKE9QLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpewotCQkJQmFycmllckV4cHJlc3Npb24gb3ByZDEgPSBCRS5nZXRPUDEoKTsKLQkJCUJhcnJpZXJFeHByZXNzaW9uIG9wcmQyID0gQkUuZ2V0T1AyKCk7Ci0JCQlNUElCbG9jayBjb25kID0gKE1QSUJsb2NrKWNmZ18uZ2V0QmxvY2soT1AuZ2V0Q29uZGl0aW9uKCksIE9QLmdldFN0YXRlbWVudCgpKTsKLQkJCWlmKGNvbmQuZ2V0TVYoKSl7IC8vIGNvbmN1cnJlbnQgYnJhbmNoCi0JCQkJaWYoIUJFLmdldEVycm9yRmxhZygpKXsKLQkJCQkJbHN0YWNrXyA9IG5ldyBTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4oKTsKLQkJCQkJc3N0YWNrXyA9IG5ldyBTdGFjazxCYXJyaWVyRXhwcmVzc2lvbj4oKTsKLQkJCQkJd29ya0xpc3RfID0gbmV3IExpbmtlZExpc3Q8V29yaz4oKTsKLQkJCQkJbWF0Y2gob3ByZDEsIG9wcmQyLCBkb3duKTsKLQkJCQkJd2hpbGUoIXdvcmtMaXN0Xy5pc0VtcHR5KCkpewotCQkJCQkJV29yayB3ID0gd29ya0xpc3RfLnJlbW92ZSgpOwotCQkJCQkJbWF0Y2gody5CRTFfLCB3LkJFMl8sIHcuZGlyZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKCFCRS5nZXRFcnJvckZsYWcoKSl7Ci0JCQkJZmluZE1hdGNoZXMob3ByZDEpOwotCQkJCWZpbmRNYXRjaGVzKG9wcmQyKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy9CYXJyaWVyRXhwcmVzc2lvbk9QLm9wX3JlcGVhdAotCQkJaWYoIUJFLmdldEVycm9yRmxhZygpKXsKLQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBvcHJkID0gQkUuZ2V0T1AxKCk7Ci0JCQkJZmluZE1hdGNoZXMob3ByZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIGludCBkb3duID0gMDsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHVwID0gMTsKLQlwcm90ZWN0ZWQgU3RhY2s8QmFycmllckV4cHJlc3Npb24+IGxzdGFja187Ci0JcHJvdGVjdGVkIFN0YWNrPEJhcnJpZXJFeHByZXNzaW9uPiBzc3RhY2tfOwotCXByb3RlY3RlZCBMaW5rZWRMaXN0PFdvcms+IHdvcmtMaXN0XzsKLQkKLQljbGFzcyBXb3JrewotCQlCYXJyaWVyRXhwcmVzc2lvbiBCRTFfOwotCQlCYXJyaWVyRXhwcmVzc2lvbiBCRTJfOwotCQlpbnQgZGlyZWN0aW9uOwotCQkKLQkJV29yayhCYXJyaWVyRXhwcmVzc2lvbiBiZTEsIEJhcnJpZXJFeHByZXNzaW9uIGJlMiwgaW50IGRpcmVjdGlvbil7Ci0JCQlCRTFfID0gYmUxOwotCQkJQkUyXyA9IGJlMjsKLQkJCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1hdGNoKEJhcnJpZXJFeHByZXNzaW9uIEJFMSwgQmFycmllckV4cHJlc3Npb24gQkUyLCBpbnQgZGlyKXsKLQkJQmFycmllckV4cHJlc3Npb24gVDEgPSBCRTE7Ci0JCUJhcnJpZXJFeHByZXNzaW9uIFQyID0gQkUyOwotCQlpbnQgZGlyZWN0aW9uID0gZGlyOwotCQl3aGlsZSh0cnVlKXsKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKFQxLnByZXR0eVByaW50ZXIoKSk7Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbihUMi5wcmV0dHlQcmludGVyKCkpOwotCQkJaWYoZGlyZWN0aW9uID09IGRvd24pIHtpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiZG93biIpO30KLQkJCWVsc2Uge2lmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJ1cCIpO30KLQkJCQotCQkJaWYoZGlyZWN0aW9uID09IGRvd24gJiYgIXBhaXJWaXNpdGVkKFQxLCBUMikpCi0JCQkJYWRkVmlzaXRlZFBhaXIoVDEsIFQyKTsKLQkJCi0JCQlCYXJyaWVyRXhwcmVzc2lvbk9QIE9QMSA9IFQxLmdldE9QKCk7Ci0JCQlCYXJyaWVyRXhwcmVzc2lvbk9QIE9QMiA9IFQyLmdldE9QKCk7Ci0JCQkKLQkJCWlmKGRpcmVjdGlvbiA9PSB1cCAmJiBUMSA9PSBCRTEgJiYgVDIgPT0gQkUyKSBicmVhazsKLQkJCWVsc2UgaWYoZGlyZWN0aW9uID09IGRvd24gJiYgT1AxID09IG51bGwgJiYgT1AyID09IG51bGwgJiYgCi0JCQkJCVQxLmlzQm90KCkgJiYgVDIuaXNCb3QoKSkKLQkJCQlkaXJlY3Rpb24gPSB1cDsKLQkJCWVsc2UgaWYoZGlyZWN0aW9uID09IGRvd24gJiYgT1AxID09IG51bGwgJiYgT1AyID09IG51bGwgJiYgCi0JCQkJCVQxLmlzQmFycmllcigpICYmIFQyLmlzQmFycmllcigpKXsKLQkJCQlhZGRNYXRjaGVkUGFpcihUMSwgVDIpOwotCQkJCWFkZE1hdGNoZWRQYWlyKFQxLCBUMSk7Ci0JCQkJYWRkTWF0Y2hlZFBhaXIoVDIsIFQyKTsKLQkJCQlkaXJlY3Rpb24gPSB1cDsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gZG93biAmJiBPUDEgPT0gbnVsbCAmJiBUMS5pc0Z1bmMoKSl7IC8vcnVsZSA3Ci0JCQkJU3RyaW5nIGZ1bmNOYW1lID0gVDEuZ2V0RnVuY05hbWUoKTsKLQkJCQlNUElDYWxsR3JhcGhOb2RlIGZub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpY2dfLmdldE5vZGUoY3VycmVudEZ1bmNfLmdldEZpbGVOYW1lKCksIGZ1bmNOYW1lKTsKLQkJCQlpZihmbm9kZSA9PSBudWxsIHx8ICFmbm9kZS5iYXJyaWVyUmVsYXRlZCgpKXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBjYWxsIGdyYXBoIik7Ci0JCQkJfQotCQkJCUJhcnJpZXJFeHByZXNzaW9uIGZCRSA9IChCYXJyaWVyRXhwcmVzc2lvbilmbm9kZS5nZXRCYXJyaWVyRXhwcigpLmdldChjdXJyZW50Q29tbV8pOwotCQkJCWxzdGFja18ucHVzaChUMSk7Ci0JCQkJVDEgPSBmQkU7Ci0JCQl9IGVsc2UgaWYoZGlyZWN0aW9uID09IGRvd24gJiYgT1AyID09IG51bGwgJiYgVDIuaXNGdW5jKCkpeyAvL3J1bGUgNwotCQkJCVN0cmluZyBmdW5jTmFtZSA9IFQyLmdldEZ1bmNOYW1lKCk7Ci0JCQkJTVBJQ2FsbEdyYXBoTm9kZSBmbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpLCBmdW5jTmFtZSk7Ci0JCQkJaWYoZm5vZGUgPT0gbnVsbCB8fCAhZm5vZGUuYmFycmllclJlbGF0ZWQoKSl7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgaW4gY2FsbCBncmFwaCIpOwotCQkJCX0KLQkJCQlCYXJyaWVyRXhwcmVzc2lvbiBmQkUgPSAoQmFycmllckV4cHJlc3Npb24pZm5vZGUuZ2V0QmFycmllckV4cHIoKS5nZXQoY3VycmVudENvbW1fKTsKLQkJCQlzc3RhY2tfLnB1c2goVDIpOwotCQkJCVQyID0gZkJFOwotCQkJfSBlbHNlIGlmKGRpcmVjdGlvbiA9PSBkb3duICYmIE9QMSAhPSBudWxsICYmIAotCQkJCQlPUDEuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2NvbmNhdCl7IC8vcnVsZSAyCi0JCQkJVDEgPSBUMS5nZXRPUDEoKTsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gZG93biAmJiBPUDIgIT0gbnVsbCAmJiAKLQkJCQkJT1AyLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9jb25jYXQpeyAvL3J1bGUgMgotCQkJCVQyID0gVDIuZ2V0T1AxKCk7Ci0JCQl9IGVsc2UgaWYoZGlyZWN0aW9uID09IHVwICYmIFQxLmdldFBhcmVudCgpID09IG51bGwpeyAvL3J1bGUgOAotCQkJCVQxID0gbHN0YWNrXy5wb3AoKTsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gdXAgJiYgVDIuZ2V0UGFyZW50KCkgPT0gbnVsbCl7IC8vcnVsZSA4Ci0JCQkJVDIgPSBzc3RhY2tfLnBvcCgpOwotCQkJfSBlbHNlIGlmKGRpcmVjdGlvbiA9PSB1cCAmJiAKLQkJCQkJVDEuZ2V0UGFyZW50KCkuZ2V0T1AoKS5nZXRPcGVyYXRvcigpID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfY29uY2F0Ci0JCQkJCSYmIFQxID09IFQxLmdldFBhcmVudCgpLmdldE9QMigpKXsgLy9ydWxlIDMKLQkJCQlUMSA9IFQxLmdldFBhcmVudCgpOwotCQkJCWRpcmVjdGlvbiA9IHVwOwotCQkJfSBlbHNlIGlmKGRpcmVjdGlvbiA9PSB1cCAmJiAKLQkJCQkJVDIuZ2V0UGFyZW50KCkuZ2V0T1AoKS5nZXRPcGVyYXRvcigpID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfY29uY2F0Ci0JCQkJCSYmIFQyID09IFQyLmdldFBhcmVudCgpLmdldE9QMigpKXsgLy9ydWxlIDMKLQkJCQlUMiA9IFQyLmdldFBhcmVudCgpOwotCQkJCWRpcmVjdGlvbiA9IHVwOwotCQkJfSBlbHNlIGlmKGRpcmVjdGlvbiA9PSB1cCAmJiBUMS5nZXRQYXJlbnQoKS5nZXRPUCgpLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9jb25jYXQKLQkJCQkJJiYgVDEgPT0gVDEuZ2V0UGFyZW50KCkuZ2V0T1AxKCkKLQkJCQkJJiYgVDIuZ2V0UGFyZW50KCkuZ2V0T1AoKS5nZXRPcGVyYXRvcigpID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfY29uY2F0Ci0JCQkJCSYmIFQyID09IFQyLmdldFBhcmVudCgpLmdldE9QMSgpKXsgLy9ydWxlIDQKLQkJCQlUMSA9IFQxLmdldFBhcmVudCgpLmdldE9QMigpOwotCQkJCVQyID0gVDIuZ2V0UGFyZW50KCkuZ2V0T1AyKCk7Ci0JCQkJZGlyZWN0aW9uID0gZG93bjsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gZG93biAmJiBPUDEgIT0gbnVsbCAmJiAKLQkJCQkJT1AxLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpeyAvL3J1bGUgNQotCQkJCXdvcmtMaXN0Xy5hZGQobmV3IFdvcmsoVDEuZ2V0T1AyKCksIFQyLCBkb3duKSk7Ci0JCQkJVDEgPSBUMS5nZXRPUDEoKTsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gZG93biAmJiBPUDIgIT0gbnVsbCAmJiAKLQkJCQkJT1AyLmdldE9wZXJhdG9yKCkgPT0gQmFycmllckV4cHJlc3Npb25PUC5vcF9icmFuY2gpeyAvL3J1bGUgNQotCQkJCXdvcmtMaXN0Xy5hZGQobmV3IFdvcmsoVDEsIFQyLmdldE9QMigpLCBkb3duKSk7Ci0JCQkJVDIgPSBUMi5nZXRPUDEoKTsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gdXAgJiYgCi0JCQkJCVQxLmdldFBhcmVudCgpLmdldE9QKCkuZ2V0T3BlcmF0b3IoKSA9PSBCYXJyaWVyRXhwcmVzc2lvbk9QLm9wX2JyYW5jaCl7IAotCQkJCS8vcnVsZSA2Ci0JCQkJVDEgPSBUMS5nZXRQYXJlbnQoKTsKLQkJCX0gZWxzZSBpZihkaXJlY3Rpb24gPT0gdXAgJiYKLQkJCQkJVDIuZ2V0UGFyZW50KCkuZ2V0T1AoKS5nZXRPcGVyYXRvcigpID09IEJhcnJpZXJFeHByZXNzaW9uT1Aub3BfYnJhbmNoKXsgCi0JCQkJLy9ydWxlIDYKLQkJCQlUMiA9IFQyLmdldFBhcmVudCgpOwotCQkJfSBlbHNlewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2Fubm90IGZpbmQgcnVsZXMgZm9yICIgKyBUMS5wcmV0dHlQcmludGVyKCkgCi0JCQkJCSsgIiBhbmQgIiArIFQyLnByZXR0eVByaW50ZXIoKSArICIgYW5kIGRpcmVjdGlvbiA9ICIgKyBkaXJlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFZpc2l0ZWRQYWlyKEJhcnJpZXJFeHByZXNzaW9uIGIxLCBCYXJyaWVyRXhwcmVzc2lvbiBiMil7Ci0JCUxpc3Q8QmFycmllckV4cHJlc3Npb24+IHZpc2l0ZWRQYWlyID0gdmlzaXRlZF8uZ2V0KGIxKTsKLQkJaWYodmlzaXRlZFBhaXIgPT0gbnVsbCl7Ci0JCQl2aXNpdGVkUGFpciA9IG5ldyBBcnJheUxpc3Q8QmFycmllckV4cHJlc3Npb24+KCk7Ci0JCQl2aXNpdGVkUGFpci5hZGQoYjIpOwotCQkJdmlzaXRlZF8ucHV0KGIxLCB2aXNpdGVkUGFpcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZighdmlzaXRlZFBhaXIuY29udGFpbnMoYjIpKSB2aXNpdGVkUGFpci5hZGQoYjIpOwotCQl9Ci0JCQotCQl2aXNpdGVkUGFpciA9IHZpc2l0ZWRfLmdldChiMik7Ci0JCWlmKHZpc2l0ZWRQYWlyID09IG51bGwpewotCQkJdmlzaXRlZFBhaXIgPSBuZXcgQXJyYXlMaXN0PEJhcnJpZXJFeHByZXNzaW9uPigpOwotCQkJdmlzaXRlZFBhaXIuYWRkKGIxKTsKLQkJCXZpc2l0ZWRfLnB1dChiMiwgdmlzaXRlZFBhaXIpOwotCQl9IGVsc2UgewotCQkJaWYoIXZpc2l0ZWRQYWlyLmNvbnRhaW5zKGIxKSkgdmlzaXRlZFBhaXIuYWRkKGIxKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFpclZpc2l0ZWQoQmFycmllckV4cHJlc3Npb24gYjEsIEJhcnJpZXJFeHByZXNzaW9uIGIyKXsKLQkJTGlzdDxCYXJyaWVyRXhwcmVzc2lvbj4gcGFpciA9IHZpc2l0ZWRfLmdldChiMSk7Ci0JCWlmKHBhaXIgPT0gbnVsbCB8fCAhcGFpci5jb250YWlucyhiMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXRjaGVkUGFpcihCYXJyaWVyRXhwcmVzc2lvbiBiMSwgQmFycmllckV4cHJlc3Npb24gYjIpewotCQlCYXJyaWVySW5mbyBiYXIxID0gYmFycmllclRhYmxlXy5zZWFyY2hCYXJyaWVyYnlJRChiMS5nZXRCYXJyaWVySUQoKSk7Ci0JCUJhcnJpZXJJbmZvIGJhcjIgPSBiYXJyaWVyVGFibGVfLnNlYXJjaEJhcnJpZXJieUlEKGIyLmdldEJhcnJpZXJJRCgpKTsKLQkJTGlzdDxCYXJyaWVySW5mbz4gc2V0MSA9IGJhcjEuZ2V0TWF0Y2hpbmdTZXQoKTsKLQkJTGlzdDxCYXJyaWVySW5mbz4gc2V0MiA9IGJhcjIuZ2V0TWF0Y2hpbmdTZXQoKTsKLQkJaWYoIXNldDEuY29udGFpbnMoYmFyMikpIHNldDEuYWRkKGJhcjIpOwotCQlpZighc2V0Mi5jb250YWlucyhiYXIxKSkgc2V0Mi5hZGQoYmFyMSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bW1NYXRjaGVzKCl7Ci0JCWZvcihFbnVtZXJhdGlvbjxMaXN0PEJhcnJpZXJJbmZvPj4gZSA9IGJhcnJpZXJUYWJsZV8uZ2V0VGFibGUoKS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlMaXN0PEJhcnJpZXJJbmZvPiBsaXN0ID0gZS5uZXh0RWxlbWVudCgpOwotCQkJZm9yKEl0ZXJhdG9yPEJhcnJpZXJJbmZvPiBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCUJhcnJpZXJJbmZvIGJhciA9IGkubmV4dCgpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJiYXIgPSAiICsgYmFyLmdldElEKCkpOwotCQkJCWZvcihJdGVyYXRvcjxCYXJyaWVySW5mbz4gaWkgPSBiYXIuZ2V0TWF0Y2hpbmdTZXQoKS5pdGVyYXRvcigpOyBpaS5oYXNOZXh0KCk7KXsKLQkJCQkJQmFycmllckluZm8gbWF0Y2hlZEJhciA9IGlpLm5leHQoKTsKLQkJCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoZWRCYXIgPSAiICsgbWF0Y2hlZEJhci5nZXRJRCgpKTsKLQkJCQkJaWYoIW1hdGNoZWRCYXIuZ2V0TWF0Y2hpbmdTZXQoKS5jb250YWlucyhiYXIpKXsKLQkJCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJiYXIgPSAiICsgYmFyLmdldElEKCkgKyAiLCBtYXRjaGVkQmFyID0gIiArIG1hdGNoZWRCYXIuZ2V0SUQoKSk7Ci0JCQkJCQltYXRjaGVkQmFyLmdldE1hdGNoaW5nU2V0KCkuYWRkKGJhcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRNYXRjaGVzKCl7Ci0JCWZvcihFbnVtZXJhdGlvbjxMaXN0PEJhcnJpZXJJbmZvPj4gZSA9IGJhcnJpZXJUYWJsZV8uZ2V0VGFibGUoKS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlMaXN0PEJhcnJpZXJJbmZvPiBsaXN0ID0gZS5uZXh0RWxlbWVudCgpOwotCQkJZm9yKEl0ZXJhdG9yPEJhcnJpZXJJbmZvPiBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCUJhcnJpZXJJbmZvIGJhciA9IGkubmV4dCgpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludCgiQmFycmllciAiICsgYmFyLmdldElEKCkgKyAiIG1hdGNoZXMgdG8gOiAiKTsKLQkJCQlmb3IoSXRlcmF0b3I8QmFycmllckluZm8+IGlpID0gYmFyLmdldE1hdGNoaW5nU2V0KCkuaXRlcmF0b3IoKTsgaWkuaGFzTmV4dCgpOyl7Ci0JCQkJCUJhcnJpZXJJbmZvIG1hdGNoZWRCYXIgPSBpaS5uZXh0KCk7Ci0JCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludChtYXRjaGVkQmFyLmdldElEKCkgKyAiLCAiKTsKLQkJCQl9Ci0JCQl9CQkKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUJsb2NrLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTJjZTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuaW1wbC5CbG9jazsKLQotCi1wdWJsaWMgY2xhc3MgTVBJQmxvY2sgZXh0ZW5kcyBCbG9ja3sKLQkKLQkvKiogVXNlZCAgdmFyaWFibGVzIGluIHRoaXMgYmxvY2sgKi8KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHVzZV87Ci0KLQkvKiogRGVmaW5lZCB2YXJpYWJsZXMgaW4gdGhpcyBibG9jayAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZGVmXzsKLQkKLQkvKiogSW4sIE91dCwgR2VuIGFuZCBLaWxsIGZvciBlYWNoIHZhcmlhYmxlICovCi0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBpbl87Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBvdXRfOwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gZ2VuXzsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IGtpbGxfOwotCQotCS8qKiBSZWFjaGluZyBkZWZpbml0aW9ucyAoZmxvdyBkZXBlbmRlbmNlKSAqLwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLyp2YXIqLyxMaXN0PElCbG9jaz4+IGR1UHJlZF87Ci0JLyoqIFJlYWNoaW5nIHVzZXMgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZy8qdmFyKi8sTGlzdDxJQmxvY2s+PiBkdVN1Y2NfOyAKLQkKLQkvKiogRG9taW5hdG9yIEZyb250aWVyICovCi0JcHJvdGVjdGVkIExpc3Q8SUJsb2NrPiBkZl87Ci0KLQkvKiogVGhpcyByZWNvcmRzIHRoZSBjb25kaXRpb24gYmxvY2sgZnJvbSB3aGljaCBkaWZmZXJlbnQgcGF0aHMgCi0JICogYXJlIGdlbmVyYXRlZC4gU2ltaWxhciBhcyBHYXRlZCBTU0EuIE5vdGUgdGhhdCB0aGVyZSBtYXkgb3IgbWF5IAotCSAqIG5vdCBiZSBhIFxwaGkgbm9kZSBpbiAidGhpcyIgYmxvY2ssIGRlcGVuZHMgb24gd2hldGhlciB0aGVyZSBpcwotCSAqIHZhcmlhYmxlIGRlZmluaXRpb24gYWxvbmcgdGhlIHBhdGhzIGZyb20gY29uZF8gdG8gdGhpcyBibG9jay4gCi0JICovIAotCXByb3RlY3RlZCBMaXN0PElCbG9jaz4gY29uZEJsb2NrXzsKLQkvL3Byb3RlY3RlZCBJQmxvY2sgY29uZEJsb2NrXzsKLQlwcm90ZWN0ZWQgTGlzdDxJQmxvY2s+IGpvaW5CbG9ja3NfOwotCQotCS8qKiBBIHNldCBvZiB2YXJpYWJsZXMgaW50cm9kdWNlZCBieSBcUGhpIGZ1bmN0aW9ucy4gU3VjaCB2YXJpYWJsZXMKLQkgKiBhcmUgcmVnYXJkZWQgYXMgYmVpbmcgYm90aCB1c2VkIGFuZCBkZWZpbmVkIGluIHRoaXMgYmxvY2sgKi8KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHBoaVZhcl87Ci0JLyoqIEEgc2V0IHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGFuZCBhbHNvIGludHJvZHVjZWQgYnkgcGxhY2luZyBhCi0JICogXHBoaSBmdW5jdGlvbiwgdGhhdCBpcywgdGhlcmUgaXMgYSBkYXRhIGRlcGVuZGVuY2UgZnJvbSB0aGUgCi0JICogXHBoaSBmdW5jdGlvbiB0byB0aGUgb3JpZ2luYWxseSB1c2VkIHZhcmlhYmxlLiAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gdXNlZFBoaVZhcl87Ci0JLyoqIFRoaXMgYmxvY2sgY29udGFpbnMgYSBccGhpIG5vZGUgPyAqLwotCXByb3RlY3RlZCBib29sZWFuIHBoaTsKLQkKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IG12VmFyXzsKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IG9sZE1WdmFyXzsKLQkKLQlwcml2YXRlIGJvb2xlYW4gbXY7Ci0JCi0JYm9vbGVhbiBzbGljZWQ7Ci0JLyoqIEZvciBccGhpIG5vZGUgcGxhY2VtZW50ICovCi0JaW50IGhhc0FscmVhZHk7Ci0JaW50IHdvcms7Ci0JCi0JYm9vbGVhbiB3aXRoQnJlYWsgPSBmYWxzZTsKLQlib29sZWFuIHdpdGhDb250aW51ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBNUElCbG9jaygpewotCQlzdXBlcigpOwotCQlpbml0KCk7Ci0JfQotCQkKLQlwdWJsaWMgTVBJQmxvY2soSUFTVE5vZGUgY29udGVudCwgSUFTVFN0YXRlbWVudCBwYXJlbnQsIGludCB0eXBlKXsKLQkJc3VwZXIoY29udGVudCwgcGFyZW50LCB0eXBlKTsKLQkJaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgTVBJQmxvY2soSUFTVEV4cHJlc3Npb24gZXhwciwgSUFTVFN0YXRlbWVudCBwYXJlbnQpewotCQlzdXBlcihleHByLCBwYXJlbnQpOwotCQlpbml0KCk7Ci0JfQotCQotCXB1YmxpYyBNUElCbG9jayhJQVNUU3RhdGVtZW50IHN0bXQpewotCQlzdXBlcihzdG10KTsKLQkJaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgTVBJQmxvY2soSUFTVE5hbWUgbGFiZWwpewotCQlzdXBlcihsYWJlbCk7Ci0JCWluaXQoKTsKLQl9Ci0JCi0JCQotCXByaXZhdGUgdm9pZCBpbml0KCl7Ci0JCQotCQl1c2VfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWRlZl8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlpbl8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+KCk7Ci0JCW91dF8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+KCk7Ci0JCWdlbl8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+KCk7Ci0JCWtpbGxfID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PigpOwotCQkKLQkJZHVQcmVkXyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4oKTsKLQkJZHVTdWNjXyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4oKTsKLQkJCi0JCWRmXyA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQljb25kQmxvY2tfID0gbmV3IEFycmF5TGlzdDxJQmxvY2s+KCk7Ci0JCS8vY29uZEJsb2NrXyA9IG51bGw7Ci0JCWpvaW5CbG9ja3NfID0gbmV3IEFycmF5TGlzdDxJQmxvY2s+KCk7Ci0JCXBoaSA9IGZhbHNlOwotCQlwaGlWYXJfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXVzZWRQaGlWYXJfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQltdlZhcl8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJb2xkTVZ2YXJfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlzbGljZWQgPSBmYWxzZTsKLQkJbXYgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25kKExpc3Q8SUJsb2NrPiBiKXtjb25kQmxvY2tfID0gYjt9Ci0JcHVibGljIExpc3Q8SUJsb2NrPiBnZXRDb25kKCl7cmV0dXJuIGNvbmRCbG9ja187fQotCXB1YmxpYyBMaXN0PElCbG9jaz4gZ2V0Sm9pbigpe3JldHVybiBqb2luQmxvY2tzXzt9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFVzZSgpe3JldHVybiB1c2VfO30KLQlwdWJsaWMgdm9pZCBzZXRVc2UoTGlzdDxTdHJpbmc+IHNldCl7dXNlXyA9IHNldDt9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXREZWYoKXtyZXR1cm4gZGVmXzt9Ci0JcHVibGljIHZvaWQgc2V0RGVmKExpc3Q8U3RyaW5nPiBzZXQpe2RlZl8gPSBzZXQ7fQotCi0JcHVibGljIHZvaWQgc2V0SW4oSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IGluKXtpbl8gPSBpbjt9Ci0JcHVibGljIHZvaWQgc2V0T3V0KEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBvdXQpIHtvdXRfID0gb3V0O30KLQlwdWJsaWMgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IGdldEluKCkge3JldHVybiBpbl87fQotCXB1YmxpYyBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gZ2V0T3V0KCkge3JldHVybiBvdXRfO30KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW4oSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IGdlbil7Z2VuXyA9IGdlbjt9Ci0JcHVibGljIHZvaWQgc2V0S2lsbChIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4ga2lsbCkge2tpbGxfID0ga2lsbDt9Ci0JcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBnZXRHZW4oKSB7cmV0dXJuIGdlbl87fQotCXB1YmxpYyBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gZ2V0S2lsbCgpIHtyZXR1cm4ga2lsbF87fQotCQotCXB1YmxpYyB2b2lkIHNldERVUHJlZChIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gcHJlZCl7ZHVQcmVkXyA9IHByZWQ7fQotCXB1YmxpYyB2b2lkIHNldERVU3VjYyhIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gc3VjYykge2R1U3VjY18gPSBzdWNjO30KLQlwdWJsaWMgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IGdldERVUHJlZCgpIHtyZXR1cm4gZHVQcmVkXzt9Ci0JcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBnZXREVVN1Y2MoKSB7cmV0dXJuIGR1U3VjY187fQotCQotCXB1YmxpYyB2b2lkIHNldERGKExpc3Q8SUJsb2NrPiBsaXN0KXtkZl8gPSBsaXN0O30KLQlwdWJsaWMgTGlzdDxJQmxvY2s+IGdldERGKCl7cmV0dXJuIGRmXzt9Ci0JcHVibGljIHZvaWQgc2V0UGhpKCl7cGhpID0gdHJ1ZTt9Ci0JcHVibGljIGJvb2xlYW4gaGFzUGhpKCl7cmV0dXJuIHBoaTt9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQaGlWYXIoKXtyZXR1cm4gcGhpVmFyXzt9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRVc2VkUGhpVmFyKCl7cmV0dXJuIHVzZWRQaGlWYXJfO30KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1WdmFyKCkge3JldHVybiBtdlZhcl87fQotCXB1YmxpYyB2b2lkIHNldE1WdmFyKExpc3Q8U3RyaW5nPiBsaXN0KXttdlZhcl8gPSBsaXN0O30KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE9sZE1WdmFyKCkge3JldHVybiBvbGRNVnZhcl87fQotCXB1YmxpYyB2b2lkIHNldE9sZE1WdmFyKExpc3Q8U3RyaW5nPiBsaXN0KSB7b2xkTVZ2YXJfID0gbGlzdDt9Ci0JCi0JcHVibGljIHZvaWQgc2V0TVYoYm9vbGVhbiB2YWwpe212ID0gdmFsO30KLQlwdWJsaWMgYm9vbGVhbiBnZXRNVigpe3JldHVybiBtdjt9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnQoKXsKLQkJc3VwZXIucHJpbnQoKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnQoImpvaW5zIHRvOiAiKTsKLQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IGpvaW5CbG9ja3NfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KGkubmV4dCgpLmdldElEKCkgKyAiLCAiKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAiKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnQoIiB1c2UgPSAiKTsKLQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHVzZV8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCVN5c3RlbS5vdXQucHJpbnQoaS5uZXh0KCkgKyAiLCAiKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50KCIgZGVmID0gIik7Ci0JCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSBkZWZfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KGkubmV4dCgpICsgIiwgIik7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJGbG93IGRlcGVuZGVuY2U6ICIpOwotCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gZHVTdWNjXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCVN0cmluZyB2YXIgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQlMaXN0PElCbG9jaz4gbGlzdCA9IGR1U3VjY18uZ2V0KHZhcik7Ci0JCQlpZihsaXN0LmlzRW1wdHkoKSkgY29udGludWU7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KHZhciArICIgdG86ICIpOwotCQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGkubmV4dCgpLmdldElEKCkgKyAiLCAiKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCQkKLQkJaWYobXYpIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIE11bHRpLXZhbHVlZCAtLS0tLS0iKTsKLQkJZWxzZSBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBTaW5nbGUtdmFsdWVkIC0tLS0tLSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0JfQotCQotCS8qKiByZXNldCB0aGUgYmxvY2sgSUQgY291bnRlciAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbigpewotCQljb3VudGVyID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUNGR0J1aWxkZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQ0ZHQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RlZWQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQ0ZHQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNUElDRkdCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgSUNhbGxHcmFwaCBjZ187Ci0JCi0JcHVibGljIE1QSUNGR0J1aWxkZXIoSUNhbGxHcmFwaCBjZyl7Ci0JCWNnXyA9IGNnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18udG9wRW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi50b3BOZXh0KCkpewotCQkJTVBJQ2FsbEdyYXBoTm9kZSBub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpbjsKLQkJCWlmKCFub2RlLm1hcmtlZCkgY29udGludWU7Ci0JCQkvL2lmKG5vZGUuZ2V0RnVuY05hbWUoKS5lcXVhbHMoInl5cGFyc2UiKSkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihub2RlLmdldEZ1bmNOYW1lKCkpOwotCQkJTVBJQ29udHJvbEZsb3dHcmFwaCBjZmcgPSBuZXcgTVBJQ29udHJvbEZsb3dHcmFwaChub2RlLmdldEZ1bmNEZWYoKS5nZXRCb2R5KCkpOwotCQkJY2ZnLmJ1aWxkQ0ZHKCk7Ci0JCQluLnNldENGRyhjZmcpOwotCQkJLy9jZmcucHJpbnQoKTsKLQkJfQotCQlNUElCbG9jay5jbGVhbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQ2FsbEdyYXBoLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUNhbGxHcmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMyOGI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQ2FsbEdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuQmFycmllclRhYmxlLkJhcnJpZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQ2FsbEdyYXBoOwotCi1wdWJsaWMgY2xhc3MgTVBJQ2FsbEdyYXBoIGV4dGVuZHMgQ2FsbEdyYXBoewotCS8qKiBJcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHBvaW50ZXIgdHlwZT8gKi8KLQlwcm90ZWN0ZWQgTGlzdDxCb29sZWFuPiBndlBvaW50ZXJfOwotCXByb3RlY3RlZCBCYXJyaWVyVGFibGUgYnRhYmxlXzsKLQlwcm90ZWN0ZWQgaW50IGNvdW50OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbj1mYWxzZTsKLQkKLQlwdWJsaWMgTVBJQ2FsbEdyYXBoKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCWJ0YWJsZV8gPSBuZXcgQmFycmllclRhYmxlKCk7Ci0JCWNvdW50ID0gNDsgLy8gMC0zIGFyZSB0eXBlcyBpbiBCYXJyaWVyRXhwcmVzc2lvbgotCQlndlBvaW50ZXJfID0gbmV3IEFycmF5TGlzdDxCb29sZWFuPigpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxCb29sZWFuPiBnZXRHVlBvaW50ZXIoKXtyZXR1cm4gZ3ZQb2ludGVyXzt9Ci0JCi0JcHVibGljIEJhcnJpZXJUYWJsZSBnZXRCYXJyaWVyVGFibGUoKXtyZXR1cm4gYnRhYmxlXzt9Ci0JCi0JcHVibGljIHZvaWQgb3RoZXJPUCgpewotCQkvL0Z1bmN0aW9uUG9pbnRlckNoZWNrZXIgZnBjID0gbmV3IEZ1bmN0aW9uUG9pbnRlckNoZWNrZXIoKTsKLQkJLy9mcGMucnVuKCk7Ci0JCUZ1bmN0aW9uTWFya2VyIGZtID0gbmV3IEZ1bmN0aW9uTWFya2VyKCk7Ci0JCWZtLnJ1bigpOwotCQljaGVja0JhcnJpZXJSZWxhdGVkQ3ljbGVzKCk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKChidGFibGVfLmNvbW1Db3VudGVyICsgMSkgKyAiIGNvbW11bmljYXRvcnMgIik7Ci0JfQkKLQkKLQljbGFzcyBGdW5jdGlvblBvaW50ZXJDaGVja2VyIGV4dGVuZHMgQVNUVmlzaXRvcnsKLQkJcHJvdGVjdGVkIElDYWxsR3JhcGhOb2RlIGN1cnJlbnRGdW5jXzsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gZnVuY1BvaW50ZXIgPSBmYWxzZTsKLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc0Z1bmNQb2ludGVyKCl7cmV0dXJuIGZ1bmNQb2ludGVyO30KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJY3VycmVudEZ1bmNfID0gaS5uZXh0KCk7Ci0JCQkJY3VycmVudEZ1bmNfLmdldEZ1bmNEZWYoKS5hY2NlcHQodGhpcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdGFjazxTdHJpbmc+IGZ1bmNDYWxsID0gbmV3IFN0YWNrPFN0cmluZz4oKTsKLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVEV4cHJlc3Npb24gZXhwcil7Ci0JCQlpZihleHByIGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pewotCQkJCUlBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZ1bmNFID0gKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKWV4cHI7Ci0JCQkJSUFTVEV4cHJlc3Npb24gZnVuY25hbWUgPSBmdW5jRS5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCk7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmNuYW1lLmdldFJhd1NpZ25hdHVyZSgpOwotCQkJCWZ1bmNDYWxsLnB1c2goc2lnbmF0dXJlKTsKLQkJCX0gCi0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUSWRFeHByZXNzaW9uKXsKLQkJCQlJQVNUSWRFeHByZXNzaW9uIGlkRSA9IChJQVNUSWRFeHByZXNzaW9uKWV4cHI7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpZEUuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYoIWZ1bmNDYWxsLmVtcHR5KCkgJiYgbmFtZS5lcXVhbHMoZnVuY0NhbGwucGVlaygpKSl7Ci0JCQkJCWZ1bmNDYWxsLnBvcCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlDYWxsR3JhcGhOb2RlIG5vZGUgPSBnZXROb2RlKGN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpLCBuYW1lKTsKLQkJCQkJaWYobm9kZSAhPSBudWxsKXsKLQkJCQkJCWZ1bmNQb2ludGVyID0gdHJ1ZTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRnVuY3Rpb24gUG9pbnRlciAiICsgbmFtZSArICIgaW4gIiArIAotCQkJCQkJCQljdXJyZW50RnVuY18uZ2V0RnVuY05hbWUoKSArICIoIiArIGN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpICsgIikiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JfQotCQotCWNsYXNzIEZ1bmN0aW9uTWFya2VyIGV4dGVuZHMgQVNUVmlzaXRvcnsKLQkJcHJvdGVjdGVkIE1QSUNhbGxHcmFwaE5vZGUgY3VycmVudE5vZGVfID0gbnVsbDsKLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpCi0JCXsKLQkJCXRoaXMuc2hvdWxkVmlzaXRFeHByZXNzaW9ucyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCQotCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gbm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJY3VycmVudE5vZGVfID0gKE1QSUNhbGxHcmFwaE5vZGUpaS5uZXh0KCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY3VycmVudE5vZGVfLmdldEZ1bmNOYW1lKCkpOwotCQkJCWN1cnJlbnROb2RlXy5nZXRGdW5jRGVmKCkuYWNjZXB0KHRoaXMpOwotCQkJfQotCQkJCi0JCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGkgPSBub2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQljdXJyZW50Tm9kZV8gPSAoTVBJQ2FsbEdyYXBoTm9kZSlpLm5leHQoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjdXJyZW50Tm9kZV8uZ2V0RnVuY05hbWUoKSk7Ci0JCQkJbWFya0JhcnJpZXJSZWxhdGVkKGN1cnJlbnROb2RlXyk7Ci0JCQl9Ci0JCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGkgPSBub2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQljdXJyZW50Tm9kZV8gID0gKE1QSUNhbGxHcmFwaE5vZGUpaS5uZXh0KCk7Ci0JCQkJbWFya01QSUluaXQoY3VycmVudE5vZGVfKTsKLQkJCX0KLQkJCQotCQkJbWFya0Z1bmN0aW9uKCk7Ci0JCQljb3VudCA9IGNvdW50IC00OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RFeHByZXNzaW9uIGV4cHJlc3Npb24pIAotCQl7Ci0JCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKSB7Ci0JCQkJSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZnVuY0V4cHIgPSAoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pZXhwcmVzc2lvbjsKLQkJCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmNFeHByLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQkJaWYoc2lnbmF0dXJlLmVxdWFscygiTVBJX0JhcnJpZXIiKSl7Ci0JCQkJCWNvdW50ICsrOwotCQkJCQlCYXJyaWVySW5mbyBuZXdiYXIgPSBidGFibGVfLmFkZEJhcnJpZXIoZnVuY0V4cHIsIGNvdW50LCAKLQkJCQkJCQljdXJyZW50Tm9kZV8uZ2V0UmVzb3VyY2UoKSwgY3VycmVudE5vZGVfLmdldEZ1bmNOYW1lKCkpOwotCQkJCQljdXJyZW50Tm9kZV8uc2V0QmFycmllclJlbGF0ZWQodHJ1ZSk7Ci0JCQkJCWN1cnJlbnROb2RlXy5nZXRBbGxCYXJyaWVycygpLmFkZChuZXdiYXIpOwotCQkJCX0KLQkJCQllbHNlIGlmKHNpZ25hdHVyZS5lcXVhbHMoIk1QSV9Jbml0IikpewotCQkJCQljdXJyZW50Tm9kZV8ubXBpSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQkJCi0JCS8qIEZ1bmN0aW9ucyB0aGF0IGRpcmVjdGx5IGNhbGwgYmFycmllcnMgKE1QSV9CYXJyaWVyKCkpIGFuZCB0aGVpcgotCQkgKiBhbmNlc3RvcnMgYXJlIGJhcnJpZXItcmVsYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgbWFya0JhcnJpZXJSZWxhdGVkKE1QSUNhbGxHcmFwaE5vZGUgbm9kZSl7Ci0JCQlpZihub2RlLmJhcnJpZXJSZWxhdGVkKCkpewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG5vZGUuZ2V0TmFtZSgpKTsKLQkJCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGlpID0gbm9kZS5nZXRDYWxsZXJzKCkuaXRlcmF0b3IoKTsgaWkuaGFzTmV4dCgpOyl7Ci0JCQkJCU1QSUNhbGxHcmFwaE5vZGUgY2FsbGVyID0gKE1QSUNhbGxHcmFwaE5vZGUpaWkubmV4dCgpOwotCQkJCQlpZighY2FsbGVyLmJhcnJpZXJSZWxhdGVkKCkpewotCQkJCQkJY2FsbGVyLnNldEJhcnJpZXJSZWxhdGVkKHRydWUpOwotCQkJCQkJbWFya0JhcnJpZXJSZWxhdGVkKGNhbGxlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgbWFya01QSUluaXQoTVBJQ2FsbEdyYXBoTm9kZSBub2RlKXsKLQkJCWlmKG5vZGUubXBpSW5pdCl7Ci0JCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpaSA9IG5vZGUuZ2V0Q2FsbGVycygpLml0ZXJhdG9yKCk7IGlpLmhhc05leHQoKTspewotCQkJCQlNUElDYWxsR3JhcGhOb2RlIGNhbGxlciA9IChNUElDYWxsR3JhcGhOb2RlKWlpLm5leHQoKTsKLQkJCQkJaWYoIWNhbGxlci5tcGlJbml0KXsKLQkJCQkJCWNhbGxlci5tcGlJbml0ID0gdHJ1ZTsKLQkJCQkJCW1hcmtNUElJbml0KGNhbGxlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKiBBIGZ1bmN0aW9uIGlzIG1hcmtlZCBpZjo8YnI+Ci0JCSAqICgxKSBJdCBpcyBhIGJhcnJpZXItcmVsYXRlZCBmdW5jdGlvbjxicj4KLQkJICogKDIpIEl0IGlzIGNhbGxlZCBieSAoMSk8YnI+Ci0JCSAqICgzKSBJdCBpcyBhbiBNUEkgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKGNhbGwgTVBJX0luaXQpPGJyPgotCQkgKiAoNCkgSXQgaXMgYW4gYW5jZXN0b3Igb2YgKDMpPGJyPgotCQkgKiAoNSkgSXQgaXMgY2FsbGVkIGJ5ICg0KQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgbWFya0Z1bmN0aW9uKCl7Ci0JCQlpbnQgdG90YWwgPSBub2Rlc18uc2l6ZSgpOwotCQkJaW50IG1hcmtlZCA9IDA7Ci0JCQkKLQkJCWZvcihJQ2FsbEdyYXBoTm9kZSBub2RlID0gdG9wRW50cnlfOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLnRvcE5leHQoKSl7Ci0JCQkJY3VycmVudE5vZGVfID0gKE1QSUNhbGxHcmFwaE5vZGUpbm9kZTsKLQkJCQlpZihjdXJyZW50Tm9kZV8uYmFycmllclJlbGF0ZWQoKSB8fCBjdXJyZW50Tm9kZV8ubXBpSW5pdCl7Ci0JCQkJCWN1cnJlbnROb2RlXy5tYXJrZWQgPSB0cnVlOwotCQkJCQltYXJrZWQgKys7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlib29sZWFuIGNoYW5nZWQgPSB0cnVlOwotCQkJd2hpbGUoY2hhbmdlZCl7Ci0JCQkJY2hhbmdlZCA9IGZhbHNlOwotCQkJCWZvcihJQ2FsbEdyYXBoTm9kZSBub2RlID0gdG9wRW50cnlfOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLnRvcE5leHQoKSl7Ci0JCQkJCWN1cnJlbnROb2RlXyA9IChNUElDYWxsR3JhcGhOb2RlKW5vZGU7Ci0JCQkJCWlmKGN1cnJlbnROb2RlXy5tYXJrZWQpewotCQkJCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpID0gY3VycmVudE5vZGVfLmdldENhbGxlZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQkJCU1QSUNhbGxHcmFwaE5vZGUgY2FsbGVlID0gKE1QSUNhbGxHcmFwaE5vZGUpaS5uZXh0KCk7Ci0JCQkJCQkJaWYoIWNhbGxlZS5tYXJrZWQpewotCQkJCQkJCQljYWxsZWUubWFya2VkID0gdHJ1ZTsKLQkJCQkJCQkJbWFya2VkICsrOwotCQkJCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbihtYXJrZWQgKyAiIG91dCBvZiAiICsgdG90YWwgKyAiIGZ1bmN0aW9ucyBhcmUgbWFya2VkIik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tCYXJyaWVyUmVsYXRlZEN5Y2xlcygpewotCi0JCWZvcihJdGVyYXRvcjxMaXN0PElDYWxsR3JhcGhOb2RlPj4gaT1jeWNsZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlMaXN0PElDYWxsR3JhcGhOb2RlPiBjeWNsZSA9IGkubmV4dCgpOwotCQkJYm9vbGVhbiBiYXJyaWVyUmVsYXRlZCA9IGZhbHNlOwotCQkJZm9yKEl0ZXJhdG9yPElDYWxsR3JhcGhOb2RlPiBpaSA9IGN5Y2xlLml0ZXJhdG9yKCk7IGlpLmhhc05leHQoKTspewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWlpLm5leHQoKTsKLQkJCQlpZihub2RlLmJhcnJpZXJSZWxhdGVkKXsKLQkJCQkJYmFycmllclJlbGF0ZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZighYmFycmllclJlbGF0ZWQpIGNvbnRpbnVlOwotCQkJU3RyaW5nIGVycm9yTXNnID0gbmV3IFN0cmluZygiQmFycmllciByZWxhdGVkIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYWxscyBvbjogIik7Ci0JCQlmb3IoSXRlcmF0b3I8SUNhbGxHcmFwaE5vZGU+IGlpID0gY3ljbGUuaXRlcmF0b3IoKTsgaWkuaGFzTmV4dCgpOyl7Ci0JCQkJSUNhbGxHcmFwaE5vZGUgZnVuYyA9IGlpLm5leHQoKTsKLQkJCQllcnJvck1zZyA9IGVycm9yTXNnICsgZnVuYy5nZXRGdW5jTmFtZSgpICsgIigiICsgZnVuYy5nZXRGaWxlTmFtZSgpICsgIiksICI7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3JNc2cpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElDYWxsR3JhcGhOb2RlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUNhbGxHcmFwaE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3NzJjOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSUNhbGxHcmFwaE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuQmFycmllclRhYmxlLkJhcnJpZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5pbXBsLkNhbGxHcmFwaE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNUElDYWxsR3JhcGhOb2RlIGV4dGVuZHMgQ2FsbEdyYXBoTm9kZSB7Ci0KLQkvKiBVc2VkIChkZWZpbmVkKSBnbG9iYWwgdmFyaWFibGVzIGluIHRoaXMgZnVuY3Rpb24gKi8KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdsb2JhbFVzZV87Ci0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnbG9iYWxEZWZfOwotCS8qIERlZmluZWQgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBwcm9wYWdhdGVkIHRvIGl0cyBjYWxsZXJzICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBwYXJhbURlZl87Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYmFycmllclJlbGF0ZWQ7Ci0JLyogT25lIGJhcnJpZXIgZXhwcmVzc2lvbiBmb3IgZWFjaCBjb21tdW5pY2F0b3IgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxCYXJyaWVyRXhwcmVzc2lvbj4gYmFycmllckV4cHJfOwotCS8qIFRoZSBsaXN0IG9mIGFsbCBiYXJyaWVycyAqLwotCXByb3RlY3RlZCBMaXN0PEJhcnJpZXJJbmZvPiBiYXJyaWVyc187Ci0JCi0JLyogSXMgdGhlIHBhcmFtZXRlciBtdWx0aS12YWx1ZWQgaW4gYW55IGNhbGwgPyAKLQkgKiBPbmUgZW50cnkgZm9yIGVhY2ggcGFyYW1ldGVyCi0JICovCi0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsQm9vbGVhbj4gcGFyYW1NVl87Ci0JLyogSXMgdGhlIHJldHVybiB2YWx1ZSBtdWx0aS12YWx1ZWQ/ICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXY7Ci0JCi0JLyogRm9yIGVhY2ggcGFyYW1ldGVyIG9yIHVzZWQgZ2xvYmFsIHZhcmlhYmxlICJWIiwgc3VtbWFyaXplCi0JICogYSBzZXQgb2YgTVYgZGF0YSAocGFzc2FibGUgcGFyYW1ldGVycywgZGVmaW5lZCBnbG9iYWwgdmFycywKLQkgKiBhbmQgcmV0dXJuZWQgdmFsdWUpIGlmIFYgaXMgTVYuIAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLExpc3Q8U3RyaW5nPj4gbXZTdW1tYXJ5XzsgCi0JCi0JLyoKLQkgKiBBIHRhYmxlIHN0b3JpbmcgZWFjaCBkZWZpbmVkIHZhcmlhYmxlIFYgaW4gdGhpcyBmdW5jdGlvbiBhbmQgCi0JICogdGhlIHNldCBvZiBibG9ja3MgdGhhdCBjb250YWluIHRoZSBkZWZpbml0aW9ucyBvZiBWLiBUaGlzIGlzCi0JICogdXNlZCBpbiBccGhpIG5vZGUgcGxhY2VtZW50LgotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gZGVmVGFibGVfOwotCQotCS8qIE51bWJlciBvZiBhc3NpZ25tZW50cyBmb3IgZWFjaCB2YXJpYWJsZSAobG9jYWwgdmFycywgZ2xvYmFsIHZhcnMsIAotCSAqIGFuZCBwYXJhbWV0ZXJzKSAKLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxJbnRlZ2VyPiBzYVZhcl87Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsQm9vbGVhbj4gc2FWYXJQb2ludGVyXzsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTZWVkOwotCQotCWJvb2xlYW4gbXBpSW5pdCA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIG1hcmtlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBNUElDYWxsR3JhcGhOb2RlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGZpbGVuYW1lLCAKLQkJCVN0cmluZyBmdW5jbmFtZSwgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBmZGVmKXsKLQkJc3VwZXIocmVzb3VyY2UsIGZpbGVuYW1lLCBmdW5jbmFtZSwgZmRlZik7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgTVBJQ2FsbEdyYXBoTm9kZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBmaWxlbmFtZSwgCi0JCQlJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZkZWYpewotCQlzdXBlcihyZXNvdXJjZSwgZmlsZW5hbWUsIGZkZWYpOwotCQlpbml0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KCl7Ci0JCWdsb2JhbFVzZV8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZ2xvYmFsRGVmXyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwYXJhbURlZl8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZGVmVGFibGVfID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PigpOwotCQkKLQkJYmFycmllclJlbGF0ZWQgPSBmYWxzZTsKLQkJYmFycmllckV4cHJfID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsQmFycmllckV4cHJlc3Npb24+KCk7Ci0JCWJhcnJpZXJzXyA9IG5ldyBBcnJheUxpc3Q8QmFycmllckluZm8+KCk7Ci0JCQotCQlwYXJhbU1WXyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLEJvb2xlYW4+KCk7Ci0JCW12U3VtbWFyeV8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxMaXN0PFN0cmluZz4+KCk7Ci0JCQotCQlzYVZhcl8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxJbnRlZ2VyPigpOwotCQlzYVZhclBvaW50ZXJfID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsQm9vbGVhbj4oKTsKLQkJCi0JCW12ID0gZmFsc2U7Ci0JCWhhc1NlZWQgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYmFycmllclJlbGF0ZWQoKXsKLQkJcmV0dXJuIGJhcnJpZXJSZWxhdGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCYXJyaWVyUmVsYXRlZChib29sZWFuIHZhbCl7Ci0JCWJhcnJpZXJSZWxhdGVkID0gdmFsOwotCX0KLQkKLQlwdWJsaWMgSGFzaHRhYmxlPFN0cmluZyxCYXJyaWVyRXhwcmVzc2lvbj4gZ2V0QmFycmllckV4cHIoKXsKLQkJcmV0dXJuIGJhcnJpZXJFeHByXzsKLQl9Ci0JCi0JcHVibGljIExpc3Q8QmFycmllckluZm8+IGdldEFsbEJhcnJpZXJzKCl7Ci0JCXJldHVybiBiYXJyaWVyc187Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhcnJpZXJFeHByKFN0cmluZyBjb21tLCBCYXJyaWVyRXhwcmVzc2lvbiBiZSl7Ci0JCWJhcnJpZXJFeHByXy5wdXQoY29tbSwgYmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWxVc2UoTGlzdDxTdHJpbmc+IGxpc3QpewotCQlnbG9iYWxVc2VfID0gbGlzdDsKLQl9Ci0JCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHbG9iYWxVc2UoKXsKLQkJcmV0dXJuIGdsb2JhbFVzZV87Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEdsb2JhbERlZihMaXN0PFN0cmluZz4gbGlzdCl7Ci0JCWdsb2JhbERlZl8gPSBsaXN0OwotCX0KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEdsb2JhbERlZigpewotCQlyZXR1cm4gZ2xvYmFsRGVmXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyYW1EZWYoTGlzdDxTdHJpbmc+IGxpc3QpewotCQlwYXJhbURlZl8gPSBsaXN0OwotCX0KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmFtRGVmKCl7Ci0JCXJldHVybiBwYXJhbURlZl87Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZlRhYmxlKEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBkZWZzKXsKLQkJZGVmVGFibGVfID0gZGVmczsKLQl9Ci0JCi0JcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBnZXREZWZUYWJsZSgpewotCQlyZXR1cm4gZGVmVGFibGVfOwotCX0KLQkKLQlwdWJsaWMgSGFzaHRhYmxlPFN0cmluZyxCb29sZWFuPiBnZXRQYXJhbU1WKCl7Ci0JCXJldHVybiBwYXJhbU1WXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNVihib29sZWFuIHZhbCl7Ci0JCW12ID0gdmFsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRNVigpewotCQlyZXR1cm4gbXY7Ci0JfQotCQotCXB1YmxpYyBIYXNodGFibGU8U3RyaW5nLExpc3Q8U3RyaW5nPj4gZ2V0TVZTdW1tYXJ5KCl7Ci0JCXJldHVybiBtdlN1bW1hcnlfOwotCX0JCi0JCi0JcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsSW50ZWdlcj4gZ2V0U0FWYXIoKXtyZXR1cm4gc2FWYXJfO30KLQlwdWJsaWMgSGFzaHRhYmxlPFN0cmluZyxCb29sZWFuPiBnZXRTQVZhclBvaW50ZXIoKXtyZXR1cm4gc2FWYXJQb2ludGVyXzt9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzU2VlZCgpe3JldHVybiBoYXNTZWVkO30KLQlwdWJsaWMgdm9pZCBzZXRTZWVkKGJvb2xlYW4gdmFsKXtoYXNTZWVkID0gdmFsO30KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJQ29udHJvbEZsb3dHcmFwaC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElDb250cm9sRmxvd0dyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzU1YzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElDb250cm9sRmxvd0dyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5pbXBsLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQ29udHJvbEZsb3dHcmFwaDsKLQotCi1wdWJsaWMgY2xhc3MgTVBJQ29udHJvbEZsb3dHcmFwaCBleHRlbmRzIENvbnRyb2xGbG93R3JhcGh7Ci0KLQkvKiogYSBzZXQgb2YgcmV0dXJuIHN0YXRlbWVudCBmbG93aW5nIHRvIHRoZSBleGl0IGJsb2NrICovCi0JcHJvdGVjdGVkIExpc3Q8SUJsb2NrPiByZXR1cm5CbG9ja3NfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotCQotCXB1YmxpYyBNUElDb250cm9sRmxvd0dyYXBoKElBU1RTdGF0ZW1lbnQgZnVuY0JvZHkpewotCQlzdXBlcihmdW5jQm9keSk7Ci0JfQotCi0JcHVibGljIExpc3Q8SUJsb2NrPiBnZXRSZXR1cm5CbG9ja3MoKXtyZXR1cm4gcmV0dXJuQmxvY2tzXzt9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEJsb2NrcygpewotCQllbnRyeV8gPSBuZXcgTVBJQmxvY2soKTsKLQkJZXhpdF8gPSBuZXcgTVBJQmxvY2soKTsKLQkJTVBJQmxvY2tDb2xsZWN0b3IgbWJjID0gbmV3IE1QSUJsb2NrQ29sbGVjdG9yKCk7Ci0JCW1iYy5ydW4oKTsKLQl9Ci0JCi0JY2xhc3MgTVBJQmxvY2tDb2xsZWN0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yewotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQkJcHJvZ18uYWNjZXB0KHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCkgCi0JCXsKLQkJCU1QSUJsb2NrIGJsb2NrOwotCQkJaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RCcmVha1N0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgTVBJQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RDYXNlU3RhdGVtZW50KXsKLQkJCQlibG9jayA9IG5ldyBNUElCbG9jayhzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KXsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVmYXVsdFN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgTVBJQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQkJSUFTVERvU3RhdGVtZW50IGRvU3RtdCA9IChJQVNURG9TdGF0ZW1lbnQpc3RtdDsKLQkJCQlibG9jayA9IG5ldyBNUElCbG9jayhkb1N0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCQlJQmxvY2sgZXhpdGpvaW4gPSBuZXcgTVBJQmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCWFkZEJsb2NrKGV4aXRqb2luKTsKLQkJCQlJQmxvY2sgY29udGludWVqb2luID0gbmV3IE1QSUJsb2NrKG51bGwsIHN0bXQsIEJsb2NrLmNvbnRpbnVlX2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soY29udGludWVqb2luKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvblN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgTVBJQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCUlBU1RGb3JTdGF0ZW1lbnQgZm9yU3RtdCA9IChJQVNURm9yU3RhdGVtZW50KXN0bXQ7Ci0JCQkJLyogVGhlIGluaXRpYWxpemF0aW9uIGlzIGEgc3RhdGVtZW50LCBhbmQgd2lsbCBiZSBhZGRlZCBsYXRlciAqLwotCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKGZvclN0bXQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQkJaWYoZm9yU3RtdC5nZXRJdGVyYXRpb25FeHByZXNzaW9uKCkgIT0gbnVsbCl7Ci0JCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKGZvclN0bXQuZ2V0SXRlcmF0aW9uRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQkJYWRkQmxvY2soYmxvY2spOwotCQkJCX0KLQkJCQlJQmxvY2sgY29udGludWVqb2luID0gbmV3IE1QSUJsb2NrKG51bGwsIHN0bXQsIEJsb2NrLmNvbnRpbnVlX2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soY29udGludWVqb2luKTsKLQkJCQlJQmxvY2sgZXhpdGpvaW4gPSBuZXcgTVBJQmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCWFkZEJsb2NrKGV4aXRqb2luKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUR290b1N0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgTVBJQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCl7Ci0JCQkJSUFTVElmU3RhdGVtZW50IGlmU3RtdCA9IChJQVNUSWZTdGF0ZW1lbnQpc3RtdDsKLQkJCQlibG9jayA9IG5ldyBNUElCbG9jayhpZlN0bXQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQkJSUJsb2NrIGpvaW4gPSBuZXcgTVBJQmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCWFkZEJsb2NrKGpvaW4pOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RMYWJlbFN0YXRlbWVudCl7Ci0JCQkJSUFTVExhYmVsU3RhdGVtZW50IGxhYmVsUyA9IChJQVNUTGFiZWxTdGF0ZW1lbnQpc3RtdDsKLQkJCQlibG9jayA9IG5ldyBNUElCbG9jayhsYWJlbFMuZ2V0TmFtZSgpLCBzdG10LCBCbG9jay5sYWJlbF90eXBlKTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVE51bGxTdGF0ZW1lbnQpewotCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUUHJvYmxlbVN0YXRlbWVudCl7Ci0JCQkJYmxvY2sgPSBuZXcgTVBJQmxvY2soc3RtdCk7Ci0JCQkJYWRkQmxvY2soYmxvY2spOwotCQkJfQotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFJldHVyblN0YXRlbWVudCl7Ci0JCQkJSUFTVFJldHVyblN0YXRlbWVudCBydFN0bXQgPSAoSUFTVFJldHVyblN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKHJ0U3RtdC5nZXRSZXR1cm5WYWx1ZSgpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCl7Ci0JCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClzdG10OwotCQkJCWJsb2NrID0gbmV3IE1QSUJsb2NrKHN3U3RtdC5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpLCBzdG10KTsKLQkJCQlhZGRCbG9jayhibG9jayk7Ci0JCQkJSUJsb2NrIGpvaW4gPSBuZXcgTVBJQmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCWFkZEJsb2NrKGpvaW4pOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJSUFTVFdoaWxlU3RhdGVtZW50IHdoU3RtdCA9IChJQVNUV2hpbGVTdGF0ZW1lbnQpc3RtdDsKLQkJCQlibG9jayA9IG5ldyBNUElCbG9jayh3aFN0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpOwotCQkJCWFkZEJsb2NrKGJsb2NrKTsKLQkJCQlJQmxvY2sgam9pbiA9IG5ldyBNUElCbG9jayhudWxsLCBzdG10LCBCbG9jay5jb250aW51ZV9qb2luX3R5cGUpOwotCQkJCWFkZEJsb2NrKGpvaW4pOwotCQkJCUlCbG9jayBleGl0am9pbiA9IG5ldyBNUElCbG9jayhudWxsLCBzdG10LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJYWRkQmxvY2soZXhpdGpvaW4pOwotCQkJfSAKLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG90aGVyT1BzKCl7Ci0JCXJldHVybkJsb2Nrc18gPSBuZXcgQXJyYXlMaXN0PElCbG9jaz4oKTsKLQkJUGhpRmxvd0J1aWxkZXIgcGhpID0gbmV3IFBoaUZsb3dCdWlsZGVyKCk7Ci0JCXBoaS5ydW4oKTsKLQkJQnJlYWtDb250aW51ZUNoZWNrZXIgYmNjID0gbmV3IEJyZWFrQ29udGludWVDaGVja2VyKCk7Ci0JCWJjYy5ydW4oKTsKLQl9Ci0JCi0JY2xhc3MgUGhpRmxvd0J1aWxkZXIgZXh0ZW5kcyBGbG93QnVpbGRlcnsKLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0VHJhbnNsYXRpb25Vbml0ID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXRFeHByZXNzaW9ucyA9IHRydWU7Ci0JCQlwcm9nXy5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQnJlYWtTdGF0ZW1lbnQpewotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQiKTsKLQkJCQlJQVNUTm9kZSBwYXJlbnQgPSBzdG10LmdldFBhcmVudCgpOwotCQkJCUxpc3Q8SUFTVElmU3RhdGVtZW50PiBicmFuY2hlcyA9IG5ldyBBcnJheUxpc3Q8SUFTVElmU3RhdGVtZW50PigpOwotCQkJCXdoaWxlKHRydWUpewotCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQgfHwKLQkJCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQgfHwKLQkJCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJCQlNUElCbG9jayBleGl0am9pbiA9IChNUElCbG9jaylnZXRCbG9jayhudWxsLCAKLQkJCQkJCQkJKElBU1RTdGF0ZW1lbnQpcGFyZW50LCBCbG9jay5leGl0X2pvaW5fdHlwZSk7Ci0JCQkJCQlmb3IoSXRlcmF0b3I8SUFTVElmU3RhdGVtZW50PiBpID0gYnJhbmNoZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZzdG10ID0gaS5uZXh0KCk7Ci0JCQkJCQkJTVBJQmxvY2sgaWZjb25kYmxvY2sgPSAoTVBJQmxvY2spZ2V0QmxvY2soaWZzdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgaWZzdG10KTsKLQkJCQkJCQlQaGlFZGdlKGlmY29uZGJsb2NrLCBleGl0am9pbik7Ci0JCQkJCQl9Ci0JCQkJCQlNUElCbG9jayBsb29wY29uZGJsb2NrID0gbnVsbDsKLQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQkJCQkJSUFTVERvU3RhdGVtZW50IGRvUyA9IChJQVNURG9TdGF0ZW1lbnQpcGFyZW50OwotCQkJCQkJCWxvb3Bjb25kYmxvY2sgPSAoTVBJQmxvY2spZ2V0QmxvY2soZG9TLmdldENvbmRpdGlvbigpLCBkb1MpOwotCQkJCQkJfSBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCQkJCUlBU1RGb3JTdGF0ZW1lbnQgZm9yUyA9IChJQVNURm9yU3RhdGVtZW50KXBhcmVudDsKLQkJCQkJCQlsb29wY29uZGJsb2NrID0gKE1QSUJsb2NrKWdldEJsb2NrKGZvclMuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBmb3JTKTsKLQkJCQkJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQpewotCQkJCQkJCUlBU1RXaGlsZVN0YXRlbWVudCB3aGlsZVMgPSAoSUFTVFdoaWxlU3RhdGVtZW50KXBhcmVudDsKLQkJCQkJCQlsb29wY29uZGJsb2NrID0gKE1QSUJsb2NrKWdldEJsb2NrKHdoaWxlUy5nZXRDb25kaXRpb24oKSwgd2hpbGVTKTsKLQkJCQkJCX0KLQkJCQkJCVBoaUVkZ2UobG9vcGNvbmRibG9jaywgZXhpdGpvaW4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KXsKLQkJCQkJCU1QSUJsb2NrIGV4aXRqb2luID0gKE1QSUJsb2NrKWdldEJsb2NrKG51bGwsIChJQVNUU3RhdGVtZW50KXBhcmVudCwKLQkJCQkJCQkJQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJCQlNUElCbG9jayBzd2NvbmQgPSAoTVBJQmxvY2spZ2V0QmxvY2soc3dTdG10LmdldENvbnRyb2xsZXJFeHByZXNzaW9uKCksIAotCQkJCQkJCQkoSUFTVFN0YXRlbWVudClwYXJlbnQpOwotCQkJCQkJUGhpRWRnZShzd2NvbmQsIGV4aXRqb2luKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KXsKLQkJCQkJCWJyYW5jaGVzLmFkZCgoSUFTVElmU3RhdGVtZW50KXBhcmVudCk7Ci0JCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZXsKLQkJCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ2FzZVN0YXRlbWVudCB8fCAKLQkJCQkJc3RtdCBpbnN0YW5jZW9mIElBU1REZWZhdWx0U3RhdGVtZW50KXsKLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNhc2VTdGF0ZW1lbnQgb3IgRGVmYXVsdFN0YXRlbWVudCIpOwotCQkJCUlBU1ROb2RlIHBhcmVudCA9IHN0bXQuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUodHJ1ZSl7Ci0JCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpIGJyZWFrOwotCQkJCQllbHNlIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJSUFTVFN3aXRjaFN0YXRlbWVudCBzd1N0bXQgPSAoSUFTVFN3aXRjaFN0YXRlbWVudClwYXJlbnQ7Ci0JCQkJTVBJQmxvY2sgc3dibG9jayA9IChNUElCbG9jaylnZXRCbG9jayhzd1N0bXQuZ2V0Q29udHJvbGxlckV4cHJlc3Npb24oKSwgCi0JCQkJCQkJCQkoSUFTVFN0YXRlbWVudClwYXJlbnQpOwotCQkJCU1QSUJsb2NrIGNhc2VibG9jayA9IChNUElCbG9jaylnZXRCbG9jayhzdG10KTsKLQkJCQlpZihjYXNlYmxvY2suZ2V0UHJlZHMoKS5zaXplKCkgPiAxKXsKLQkJCQkJLyogUHJldmlvdXMgY2FzZSB3aXRob3V0IGJyZWFrIGpvaW5zIGhlcmUgKi8KLQkJCQkJUGhpRWRnZShzd2Jsb2NrLCBjYXNlYmxvY2spOwotCQkJCX0KLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpewotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGludWVTdGF0ZW1lbnQiKTsKLQkJCQlJQVNUTm9kZSBwYXJlbnQgPSBzdG10LmdldFBhcmVudCgpOwotCQkJCUxpc3Q8SUFTVElmU3RhdGVtZW50PiBicmFuY2hlcyA9IG5ldyBBcnJheUxpc3Q8SUFTVElmU3RhdGVtZW50PigpOwotCQkJCXdoaWxlKHRydWUpewotCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQgfHwKLQkJCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50IHx8Ci0JCQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQkJCU1QSUJsb2NrIGNvbnRpbnVlam9pbiA9IChNUElCbG9jaylnZXRCbG9jayhudWxsLCAKLQkJCQkJCQkJKElBU1RTdGF0ZW1lbnQpcGFyZW50LCBCbG9jay5jb250aW51ZV9qb2luX3R5cGUpOwotCQkJCQkJZm9yKEl0ZXJhdG9yPElBU1RJZlN0YXRlbWVudD4gaSA9IGJyYW5jaGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJSUFTVElmU3RhdGVtZW50IGlmUyA9IGkubmV4dCgpOwotCQkJCQkJCU1QSUJsb2NrIGlmY29uZGJsb2NrID0gKE1QSUJsb2NrKWdldEJsb2NrKAotCQkJCQkJCQkJaWZTLmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgaWZTKTsKLQkJCQkJCQlQaGlFZGdlKGlmY29uZGJsb2NrLCBjb250aW51ZWpvaW4pOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJCQkJYnJhbmNoZXMuYWRkKChJQVNUSWZTdGF0ZW1lbnQpcGFyZW50KTsKLQkJCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCQkJfQotCQkJCQllbHNlewotCQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCl7Ci0JCQkJaWYodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJEb1N0YXRlbWVudCIpOwotCQkJCUlBU1REb1N0YXRlbWVudCBkb1N0bXQgPSAoSUFTVERvU3RhdGVtZW50KXN0bXQ7Ci0JCQkJTVBJQmxvY2sgY29uZCA9IChNUElCbG9jaylnZXRCbG9jayhkb1N0bXQuZ2V0Q29uZGl0aW9uKCksIHN0bXQpOwotCQkJCWlmKGRvU3RtdC5nZXRCb2R5KCkgIT0gbnVsbCl7Ci0JCQkJCU1QSUJsb2NrIGZpcnN0ID0gKE1QSUJsb2NrKWZpcnN0QmxvY2soZG9TdG10LmdldEJvZHkoKSk7Ci0JCQkJCVBoaUVkZ2UoY29uZCwgZmlyc3QpOwotCQkJCX0KLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KXsKLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclN0YXRlbWVudCIpOwotCQkJCUlBU1RGb3JTdGF0ZW1lbnQgZm9yU3RtdCA9IChJQVNURm9yU3RhdGVtZW50KXN0bXQ7Ci0JCQkJTVBJQmxvY2sgY29uZCA9IChNUElCbG9jaylnZXRCbG9jayhmb3JTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSwgc3RtdCk7Ci0JCQkJUGhpRWRnZShjb25kLCBjb25kKTsKLQkJCQkKLQkJCX0gCi0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpewotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiSWZTdGF0ZW1lbnQiKTsKLQkJCQlJQVNUSWZTdGF0ZW1lbnQgaWZTdG10ID0gKElBU1RJZlN0YXRlbWVudClzdG10OwotCQkJCU1QSUJsb2NrIGNvbmRiID0gKE1QSUJsb2NrKWdldEJsb2NrKGlmU3RtdC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJCU1QSUJsb2NrIGpvaW4gPSAoTVBJQmxvY2spZ2V0QmxvY2sobnVsbCwgc3RtdCwgQmxvY2suZXhpdF9qb2luX3R5cGUpOwotCQkJCVBoaUVkZ2UoY29uZGIsIGpvaW4pOwotCQkJfSAKLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RSZXR1cm5TdGF0ZW1lbnQpewotCQkJCWlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuU3RhdGVtZW50Iik7Ci0JCQkJSUFTVFJldHVyblN0YXRlbWVudCBydFN0bXQgPSAoSUFTVFJldHVyblN0YXRlbWVudClzdG10OwotCQkJCU1QSUJsb2NrIHJ2ID0gKE1QSUJsb2NrKWdldEJsb2NrKHJ0U3RtdC5nZXRSZXR1cm5WYWx1ZSgpLCBzdG10KTsKLQkJCQlyZXR1cm5CbG9ja3NfLmFkZChydik7Ci0JCQl9IAotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQlpZih0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIldoaWxlU3RhdGVtZW50Iik7Ci0JCQkJSUFTVFdoaWxlU3RhdGVtZW50IHdoU3RtdCA9IChJQVNUV2hpbGVTdGF0ZW1lbnQpc3RtdDsKLQkJCQlNUElCbG9jayBjb25kID0gKE1QSUJsb2NrKWdldEJsb2NrKHdoU3RtdC5nZXRDb25kaXRpb24oKSwgc3RtdCk7Ci0JCQkJUGhpRWRnZShjb25kLCBjb25kKTsKLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBQaGlFZGdlKE1QSUJsb2NrIGZyb20sIE1QSUJsb2NrIHRvKXsKLQkJCWlmKCF0by5nZXRDb25kKCkuY29udGFpbnMoZnJvbSkpIAotCQkJCXRvLmdldENvbmQoKS5hZGQoZnJvbSk7Ci0JCQlMaXN0PElCbG9jaz4gam9pbnMgPSBmcm9tLmdldEpvaW4oKTsKLQkJCWlmKCFqb2lucy5jb250YWlucyh0bykpeyAKLQkJCQlqb2lucy5hZGQodG8pOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJQaGkgZWRnZSBpcyBhZGRlZCBmcm9tICIgKyBmcm9tLmdldElEKCkgKyAiIHRvICIgKyB0by5nZXRJRCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQljbGFzcyBCcmVha0NvbnRpbnVlQ2hlY2tlciBleHRlbmRzIEFTVFZpc2l0b3J7Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQkJcHJvZ18uYWNjZXB0KHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVEJyZWFrU3RhdGVtZW50IHx8Ci0JCQkJCXN0bXQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpewotCQkJCUlBU1ROb2RlIHBhcmVudCA9IHN0bXQuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUocGFyZW50ICE9IHByb2dfKXsKLQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KXsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCEocGFyZW50IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KSkgCi0JCQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQkJCUlBU1RJZlN0YXRlbWVudCBpZlMgPSAoSUFTVElmU3RhdGVtZW50KXBhcmVudDsKLQkJCQlJQVNURXhwcmVzc2lvbiBjb25kID0gaWZTLmdldENvbmRpdGlvbkV4cHJlc3Npb24oKTsKLQkJCQlNUElCbG9jayBjb25kQmxvY2sgPSAoTVBJQmxvY2spZ2V0QmxvY2soY29uZCwgaWZTKTsKLQkJCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVEJyZWFrU3RhdGVtZW50KQotCQkJCQljb25kQmxvY2sud2l0aEJyZWFrID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWNvbmRCbG9jay53aXRoQ29udGludWUgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnQoKXsKLQkJZm9yKElCbG9jayBiID0gZW50cnlfOyBiICE9IG51bGw7IGIgPSBiLnRvcE5leHQoKSl7Ci0JCQlNUElCbG9jayBibG9jayA9IChNUElCbG9jayliOwotCQkJYmxvY2sucHJpbnQoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElEVUNoYWluLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSURVQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2ODRhOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSURVQ2hhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ29udHJvbEZsb3dHcmFwaDsKLQotLyoqCi0gKiBDYWxjdWxhdGUgdGhlIERVY2hhaW4gLS0gZGF0YSBkZXBlbmRlbmNlCi0gKiBAYXV0aG9yIFl1YW4gWmhhbmcKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElEVUNoYWluewotCXByb3RlY3RlZCBJQ2FsbEdyYXBoIGNnXzsKLQkKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IGRlZlRhYmxlXzsKLQlwcm90ZWN0ZWQgSUNvbnRyb2xGbG93R3JhcGggY2ZnXzsKLQkKLQlwdWJsaWMgTVBJRFVDaGFpbihJQ2FsbEdyYXBoIGNnKXsKLQkJY2dfID0gY2c7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBEVWNoYWluIGNhbGN1bGF0aW9uIGNvbnRhaW5zIHRocmVlIHN0ZXBzOjxicj4KLQkgKiAoMSkgQ2FsY3VsYXRlIHRoZSBzZXQgb2YgdXNlZCBhbmQgZGVmaW5lZCB2YXJpYWJsZXMgaW4gZWFjaCBibG9jazxicj4KLQkgKiAoMikgQWRkIFxwaGkgZnVuY3Rpb25zPGJyPgotCSAqICgzKSBDb25zdHJ1Y3QgdGhlIERVY2hhaW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJVXNlRGVmQnVpbGRlciB1ZCA9IG5ldyBVc2VEZWZCdWlsZGVyKGNnXyk7Ci0JCXVkLnJ1bigpOwotCQlNUElTU0Egc3NhID0gbmV3IE1QSVNTQShjZ18pOwotCQlzc2EucnVuKCk7Ci0JCURVQ2hhaW4oKTsKLQl9Ci0KLQkvKiogQ2FsY3VsYXRlIHRoZSBHZW4gYW5kIEtpbGwgc2V0cyBmb3IgZWFjaCBibG9jayAqLwotCXByb3RlY3RlZCB2b2lkIEdlbktpbGxTZXQoKXsKLQkJZm9yKElCbG9jayBiID0gY2ZnXy5nZXRFbnRyeSgpOyBiICE9IG51bGw7IGIgPSBiLnRvcE5leHQoKSl7Ci0JCQlNUElCbG9jayBibG9jayA9IChNUElCbG9jayliOwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGRlZlRhYmxlXy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQlTdHJpbmcgdmFyID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWJsb2NrLmdldEdlbigpLnB1dCh2YXIsIG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpKTsKLQkJCQlibG9jay5nZXRLaWxsKCkucHV0KHZhciwgbmV3IEFycmF5TGlzdDxJQmxvY2s+KCkpOwotCQkJCWJsb2NrLmdldEluKCkucHV0KHZhciwgbmV3IEFycmF5TGlzdDxJQmxvY2s+KCkpOwotCQkJCWJsb2NrLmdldE91dCgpLnB1dCh2YXIsIG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpKTsKLQkJCQlibG9jay5nZXREVVByZWQoKS5wdXQodmFyLCBuZXcgQXJyYXlMaXN0PElCbG9jaz4oKSk7Ci0JCQkJYmxvY2suZ2V0RFVTdWNjKCkucHV0KHZhciwgbmV3IEFycmF5TGlzdDxJQmxvY2s+KCkpOwotCQkJfQotCQkJTGlzdDxTdHJpbmc+IGRlZiA9IGJsb2NrLmdldERlZigpOwotCQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGRlZi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCVN0cmluZyB2YXIgPSBpLm5leHQoKTsKLQkJCQlMaXN0PElCbG9jaz4gZ2VubGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQkJCWdlbmxpc3QuYWRkKGJsb2NrKTsKLQkJCQlibG9jay5nZXRHZW4oKS5wdXQodmFyLCBnZW5saXN0KTsKLQkJCQlMaXN0PElCbG9jaz4ga2lsbGxpc3QgPSAoTGlzdDxJQmxvY2s+KSgoQXJyYXlMaXN0PElCbG9jaz4pZGVmVGFibGVfLmdldCh2YXIpKS5jbG9uZSgpOwotCQkJCWtpbGxsaXN0LnJlbW92ZShibG9jayk7Ci0JCQkJYmxvY2suZ2V0S2lsbCgpLnB1dCh2YXIsIGtpbGxsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogQ2FsY3VsYXRlIHRoZSByZWFjaGluZyBkZWZpbml0aW9uICovCi0JcHJvdGVjdGVkIHZvaWQgUmVhY2hpbmdEZWZpbml0aW9uKCl7Ci0JCWZvcihJQmxvY2sgYiA9IGNmZ18uZ2V0RW50cnkoKTsgYiAhPSBudWxsOyBiID0gYi50b3BOZXh0KCkpewotCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCWJsb2NrLnNldE91dCgoSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+KWJsb2NrLmdldEdlbigpLmNsb25lKCkpOwotCQl9Ci0JCWJvb2xlYW4gY2hhbmdlID0gdHJ1ZTsKLQkJd2hpbGUoY2hhbmdlKXsKLQkJCWNoYW5nZSA9IGZhbHNlOwotCQkJZm9yKElCbG9jayBiID0gY2ZnXy5nZXRFbnRyeSgpOyBiICE9IG51bGw7IGIgPSBiLnRvcE5leHQoKSl7Ci0JCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCQlIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gaW4gPSBibG9jay5nZXRJbigpOwotCQkJCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBibG9jay5nZXRQcmVkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCU1QSUJsb2NrIHByZWQgPSAoTVBJQmxvY2spaS5uZXh0KCk7Ci0JCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBpbi5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KXsKLQkJCQkJCVN0cmluZyB2YXIgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJCQlpbi5wdXQodmFyLCBVdGlsLlVuaW9uKGluLmdldCh2YXIpLCBwcmVkLmdldE91dCgpLmdldCh2YXIpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IG91dCA9IGJsb2NrLmdldE91dCgpOwotCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBvdXQua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJCVN0cmluZyB2YXIgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJCUxpc3Qgb3V0bGlzdCA9IFV0aWwuVW5pb24oYmxvY2suZ2V0R2VuKCkuZ2V0KHZhciksIAotCQkJCQkJCVV0aWwuTWludXMoaW4uZ2V0KHZhciksIAotCQkJCQkJCQkJYmxvY2suZ2V0S2lsbCgpLmdldCh2YXIpKSk7Ci0JCQkJCWlmKCFVdGlsLmVxdWFscyhvdXRsaXN0LCBvdXQuZ2V0KHZhcikpKXsgCi0JCQkJCQljaGFuZ2UgPSB0cnVlOwotCQkJCQkJb3V0LnB1dCh2YXIsIG91dGxpc3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKiBDb25zdHJ1Y3QgdGhlIERVY2hhaW4gKi8KLQlwcm90ZWN0ZWQgdm9pZCBGbG93RGVwZW5kZW5jZSgpewotCQlmb3IoSUJsb2NrIGIgPSBjZmdfLmdldEVudHJ5KCk7IGIgIT0gbnVsbDsgYiA9IGIudG9wTmV4dCgpKXsKLQkJCU1QSUJsb2NrIGJsb2NrID0gKE1QSUJsb2NrKWI7Ci0JCQlIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gaW4gPSBibG9jay5nZXRJbigpOwotCQkJZm9yKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGluLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCVN0cmluZyB2YXIgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYoIWJsb2NrLmdldFVzZSgpLmNvbnRhaW5zKHZhcikpIGNvbnRpbnVlOwotCQkJCUxpc3Q8SUJsb2NrPiBwcmVkID0gYmxvY2suZ2V0RFVQcmVkKCkuZ2V0KHZhcik7Ci0JCQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IGluLmdldCh2YXIpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCU1QSUJsb2NrIHJkID0gKE1QSUJsb2NrKWkubmV4dCgpOwotCQkJCQlMaXN0PElCbG9jaz4gc3VjYyA9IHJkLmdldERVU3VjYygpLmdldCh2YXIpOwotCQkJCQlwcmVkLmFkZChyZCk7Ci0JCQkJCXN1Y2MuYWRkKGJsb2NrKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgRFVDaGFpbigpewotCQlmb3IoSUNhbGxHcmFwaE5vZGUgbiA9IGNnXy5ib3RFbnRyeSgpOyBuICE9IG51bGw7IG4gPSBuLmJvdE5leHQoKSl7Ci0JCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSluOwotCQkJaWYoIW5vZGUubWFya2VkKSBjb250aW51ZTsKLQkJCWlmKG5vZGUuZ2V0RnVuY05hbWUoKS5lcXVhbHMoIk1vY19LV2F5Rk0iKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1QSURVQ2hhaW4uRFVDaGFpbigpOiBNb2NfS1dheUZNICIrbm9kZS5nZXRGdW5jTmFtZSgpKTsKLQkJCWNmZ18gPSBub2RlLmdldENGRygpOwotCQkJZGVmVGFibGVfID0gbm9kZS5nZXREZWZUYWJsZSgpOwotCQkJR2VuS2lsbFNldCgpOwotCQkJUmVhY2hpbmdEZWZpbml0aW9uKCk7Ci0JCQlGbG93RGVwZW5kZW5jZSgpOwotCQkJLy8oKE1QSUNvbnRyb2xGbG93R3JhcGgpY2ZnXykucHJpbnQoKTsKLQkJfQotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElNVkFuYWx5c2lzLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSU1WQW5hbHlzaXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlOWExYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSU1WQW5hbHlzaXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LmMuSUNBU1RUeXBlSWRJbml0aWFsaXplckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5nbnUuYy5JQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLklBU1RBbWJpZ3VvdXNFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDb250cm9sRmxvd0dyYXBoOwotCi0vKioKLSAqIAotICogQGF1dGhvciB6aGFuZ3l1YQotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSU1WQW5hbHlzaXN7Ci0JcHJvdGVjdGVkIElDYWxsR3JhcGggY2dfOwotCXByb3RlY3RlZCBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnROb2RlXzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgaW50IGxocyA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCByaHMgPSAxOwotCQotCXByb3RlY3RlZCBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgTVBJTVZBbmFseXNpcyhJQ2FsbEdyYXBoIGNnKXsKLQkJY2dfID0gY2c7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlpbml0KCk7Ci0JCVNlZWRzQ29sbGVjdG9yIHNjID0gbmV3IFNlZWRzQ29sbGVjdG9yKCk7Ci0JCXNjLnJ1bigpOwotCQlmdW5jdGlvbk1WU3VtbWFyeSgpOwotCQlmdW5jdGlvblNsaWNpbmcoKTsKLQkJZXhwck1WQW5hbHlzaXMoKTsKLQkJCi0JCWZvcihJQ2FsbEdyYXBoTm9kZSBuID0gY2dfLnRvcEVudHJ5KCk7IG4gIT0gbnVsbDsgbiA9IG4udG9wTmV4dCgpKXsKLQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKW47Ci0JCQlpZighbm9kZS5tYXJrZWQpIGNvbnRpbnVlOwotCQkJSUNvbnRyb2xGbG93R3JhcGggY2ZnID0gbm9kZS5nZXRDRkcoKTsKLQkJCWZvcihJQmxvY2sgYiA9IGNmZy5nZXRFbnRyeSgpOyBiICE9IG51bGw7IGIgPSBiLnRvcE5leHQoKSl7Ci0JCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCQlpZihibG9jay5nZXRNVigpICYmIChibG9jay53aXRoQnJlYWsgfHwgYmxvY2sud2l0aENvbnRpbnVlKSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKiogIE11bHRpLXZhbHVlZCBicmFuY2ggd2l0aCBCcmVhay9Db250aW51ZSBpbiAiICsgCi0JCQkJCQkJbm9kZS5nZXRGdW5jTmFtZSgpICsgIigiICsgbm9kZS5nZXRGaWxlTmFtZSgpICsgIikiKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gYXMgc2luZ2xlLXZhbHVlZDsgCi0JICogSW5pdGlhbGl6ZSBpdHMgTVYgYW5kIFNWIHN1bW1hcnkgYXMgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpewotCQlmb3IoSUNhbGxHcmFwaE5vZGUgbiA9IGNnXy50b3BFbnRyeSgpOyBuICE9IG51bGw7IG4gPSBuLnRvcE5leHQoKSl7Ci0JCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSluOwotCQkJaWYoIW5vZGUubWFya2VkKSBjb250aW51ZTsKLQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmQgPSBub2RlLmdldEZ1bmNEZWYoKTsKLQkJCUlBU1RGdW5jdGlvbkRlY2xhcmF0b3IgZmRlY2wgPSBmZC5nZXREZWNsYXJhdG9yKCk7Ci0JCQlpZihmZGVjbCBpbnN0YW5jZW9mIElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcil7Ci0JCQkJSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIHNmdW5jID0gKElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCQlJQVNUUGFyYW1ldGVyRGVjbGFyYXRpb25bXSBwYXJhbXMgPSBzZnVuYy5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQkJCUlBU1ROYW1lIHBhcmFtID0gcGFyYW1zW2ldLmdldERlY2xhcmF0b3IoKS5nZXROYW1lKCk7Ci0JCQkJCWlmKHBhcmFtLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSkgY29udGludWU7IC8vdm9pZCBwYXJhbWV0ZXIKLQkJCQkJbm9kZS5nZXRQYXJhbU1WKCkucHV0KHBhcmFtLnRvU3RyaW5nKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJCW5vZGUuZ2V0TVZTdW1tYXJ5KCkucHV0KHBhcmFtLnRvU3RyaW5nKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlDQVNUS25SRnVuY3Rpb25EZWNsYXJhdG9yIGtyZnVuYyA9IChJQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCQlJQVNUTmFtZVtdIHBhcmFtcyA9IGtyZnVuYy5nZXRQYXJhbWV0ZXJOYW1lcygpOwotCQkJCWZvcihpbnQgaT0wOyBpPHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQkJCW5vZGUuZ2V0UGFyYW1NVigpLnB1dChwYXJhbXNbaV0udG9TdHJpbmcoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQkJbm9kZS5nZXRNVlN1bW1hcnkoKS5wdXQocGFyYW1zW2ldLnRvU3RyaW5nKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gbm9kZS5nZXRHbG9iYWxVc2UoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCVN0cmluZyB2YXIgPSBpLm5leHQoKTsKLQkJCQlub2RlLmdldE1WU3VtbWFyeSgpLnB1dCh2YXIsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCX0KLQkJCS8qIEFub3RoZXIgZW50cnkgaWYgKDEpIHRoZSBmdW5jdGlvbiBoYXMgbm8gcGFyYW1ldGVyIGFuZCBubyBnbG9iYWwgdXNlOwotCQkJICogKDIpIGFsbCBwYXJhbWV0ZXJzIGFuZCBnbG9iYWwgdXNlcyBhcmUgU1YuIAotCQkJICogKFdlIGNhbGwgdGhpcyBmdW5jdGlvbihjb250ZXh0KSBhcyAiZW1wdHkgTVYgaW5wdXQiIGZ1bmN0aW9uKGNvbnRleHQpLikKLQkJCSAqIFVzZSB0aGUgZnVuY3Rpb24gbmFtZSBhcyB0aGUga2V5IGluIHRoZXNlIGNhc2VzCi0JCQkgKi8gCi0JCQlub2RlLmdldE1WU3VtbWFyeSgpLnB1dChub2RlLmdldEZ1bmNOYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZnVuY3Rpb25NVlN1bW1hcnkoKXsKLQkJY2hhbmdlZCA9IHRydWU7Ci0JCXdoaWxlKGNoYW5nZWQpewotCQkJY2hhbmdlZCA9IGZhbHNlOwotCQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKW47Ci0JCQkJaWYoIW5vZGUubWFya2VkKSBjb250aW51ZTsKLQkJCQljdXJyZW50Tm9kZV8gPSBub2RlOwotCQkJCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBub2RlLmdldE1WU3VtbWFyeSgpLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotCQkJCQlTdHJpbmcgdmFyID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlzaW5nbGVWYXJpYWJsZVNsaWNpbmcodmFyKTsKLQkJCQkJLyoKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiU3VtbWFyeTogIik7Ci0JCQkJCWZvcihJdGVyYXRvciBpID0gKChBcnJheUxpc3Qpbm9kZS5nZXRNVlN1bW1hcnkoKS5nZXQodmFyKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoKFN0cmluZylpLm5leHQoKSArICIsICIpOwotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCQkJCQkqLwotCQkJCQljbGVhbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiAgRm9yIGVhY2ggZnVuY3Rpb24sIGFzc3VtZSBhbGwgcGFyYW1ldGVycyBhcmUgTVYsIGZpbmQgb3V0IHdoaWNoIGdsb2JhbAotCSAqIHZhcmlhYmxlcyAoYW5kIHBhc3NhYmxlIHBhcmFtZXRlcnMpIGFyZSBNVgotCSAqLwotCXByaXZhdGUgdm9pZCBzaW5nbGVWYXJpYWJsZVNsaWNpbmcoU3RyaW5nIHZhcil7Ci0JCUlDb250cm9sRmxvd0dyYXBoIGNmZyA9IGN1cnJlbnROb2RlXy5nZXRDRkcoKTsKLQkJCi0JCVdvcmtMaXN0Q29sbGVjdG9yIHdsYyA9IG5ldyBXb3JrTGlzdENvbGxlY3RvcihjdXJyZW50Tm9kZV8pOwotCQlMaW5rZWRMaXN0PElCbG9jaz4gc2VlZHMgPSB3bGMuZ2V0V29ya0xpc3QoKTsKLQkJaWYoIXZhci5lcXVhbHMoY3VycmVudE5vZGVfLmdldEZ1bmNOYW1lKCkpKXsKLQkJCXNlZWRzLmFkZChjZmcuZ2V0RW50cnkoKSk7Ci0JCQkoKE1QSUJsb2NrKWNmZy5nZXRFbnRyeSgpKS5nZXRNVnZhcigpLmFkZCh2YXIpOwotCQl9Ci0JCQotCQl3aGlsZSghc2VlZHMuaXNFbXB0eSgpKXsKLQkJCU1QSUJsb2NrIGJsb2NrID0gKE1QSUJsb2NrKXNlZWRzLnJlbW92ZSgpOwotCQkJaWYoYmxvY2suc2xpY2VkKSBjb250aW51ZTsKLQkJCWJsb2NrLnNsaWNlZCA9IHRydWU7Ci0JCQkKLQkJCWlmKGJsb2NrLmdldENvbnRlbnQoKSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQotCQkJSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+IERVU3VjYyA9IGJsb2NrLmdldERVU3VjYygpOwotCQkJTGlzdDxTdHJpbmc+IG12ID0gYmxvY2suZ2V0TVZ2YXIoKTsKLQkJCUxpc3Q8U3RyaW5nPiBuZXdNViA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCi0JCQloYW5kbGVQb2ludGVycyhibG9jaywgbXYpOwotCQkJCi0JCQlpZighYmxvY2suZ2V0UGhpVmFyKCkuaXNFbXB0eSgpKXsKLQkJCQlMaXN0PElCbG9jaz4gY29uZCA9IGJsb2NrLmdldENvbmQoKTsKLQkJCQlpbnQgYmxvY2tjYXNlID0gMDsKLQkJCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gY29uZC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQlpZihibG9ja2Nhc2UgPT0gMikgYnJlYWs7Ci0JCQkJCU1QSUJsb2NrIGNvbmRibG9jayA9IChNUElCbG9jaylpLm5leHQoKTsKLQkJCQkJSUFTVFN0YXRlbWVudCBwYXJlbnQgPSBjb25kYmxvY2suZ2V0UGFyZW50KCk7Ci0JCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCB8fCAKLQkJCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KQotCQkJCQkJYmxvY2tjYXNlID0gMTsKLQkJCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50IHx8Ci0JCQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50IHx8Ci0JCQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQkJCWlmKGJsb2NrLmdldFR5cGUoKSA9PSBNUElCbG9jay5leGl0X2pvaW5fdHlwZSkKLQkJCQkJCQlibG9ja2Nhc2UgPSAxOwotCQkJCQkJZWxzZSBpZihibG9jay5nZXRUeXBlKCkgPT0gTVBJQmxvY2suZXhwcl90eXBlKQotCQkJCQkJCWJsb2NrY2FzZSA9IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoYmxvY2tjYXNlID09IDEpewotCQkJCQluZXdNViA9IFV0aWwuVW5pb24obmV3TVYsIGJsb2NrLmdldFBoaVZhcigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihibG9ja2Nhc2UgPT0gMil7Ci0JCQkJCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBjb25kLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQlNUElCbG9jayBjb25kYmxvY2sgPSAoTVBJQmxvY2spaS5uZXh0KCk7Ci0JCQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpaSA9IGNvbmRibG9jay5nZXRVc2VkUGhpVmFyKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQkJaWkuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJU3RyaW5nIHYgPSBpaS5uZXh0KCk7Ci0JCQkJCQkJaWYobXYuY29udGFpbnModikpCi0JCQkJCQkJCW5ld01WLmFkZCh2KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0JCi0JCQkKLQkJCS8qKiBJbnRyYS1ibG9jayBzbGljaW5nIChDYXNlICMxKSAtLS0gCi0JCQkgKiBHaXZlbiBNVi9TViB1c2VkIHZhcmlhYmxlLCBkZXRlcm1pbmUgd2hldGhlciBkZWZpbmVkIHZhcmlhYmxlcwotCQkJICogYXJlIE1WIG9yIFNWLiAgCi0JCQkgKi8KLQkJCQotCQkJSUFTVE5vZGUgY29udGVudCA9IGJsb2NrLmdldENvbnRlbnQoKTsKLQkJCUV4cHJNVkFuYWx5emVyIGVtdmEgPSBuZXcgRXhwck1WQW5hbHl6ZXIoY29udGVudCwgbXYsIGJsb2NrKTsKLQkJCWVtdmEucnVuKCk7Ci0JCQluZXdNViA9IFV0aWwuVW5pb24obmV3TVYsIGVtdmEuZ2V0TVZMaXN0KCkpOwotCQkJCi0JCQkvKiogSW50cmEtYmxvY2sgc2xpY2luZyAoQ2FzZSAjMykgLS0gCi0JCQkgKiAgYW55IHVzZWQgb25seSBtdWx0aS12YWx1ZWQgdmFyaWFibGUgaXMgc3RpbGwgbXVsdGktdmFsdWVkCi0JCQkgKi8KLQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSBtdi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCVN0cmluZyB2ID0gaS5uZXh0KCk7Ci0JCQkJaWYoYmxvY2suZ2V0VXNlKCkuY29udGFpbnModikgJiYgIWJsb2NrLmdldERlZigpLmNvbnRhaW5zKHYpKXsKLQkJCQkJaWYoIW5ld01WLmNvbnRhaW5zKHYpKQotCQkJCQkJbmV3TVYuYWRkKHYpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaGFuZGxlUG9pbnRlcnMoYmxvY2ssIG5ld01WKTsKLQkJCWhhbmRsZUJyb2FkQ2FzdChibG9jaywgbmV3TVYpOwotCQkJYmxvY2suc2V0TVZ2YXIobmV3TVYpOwotCQkJCi0JCQkvKiogSW50ZXItYmxvY2sgc2xpY2luZyBiYXNlZCBvbiBkYXRhIGRlcGVuZGVuY2VzICovCi0JCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gbmV3TVYuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlTdHJpbmcgTVZ2YXIgPSBpLm5leHQoKTsKLQkJCQlMaXN0PElCbG9jaz4gRFVuZXh0ID0gRFVTdWNjLmdldChNVnZhcik7Ci0JCQkJaWYoRFVuZXh0ICE9IG51bGwpewotCQkJCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpaSA9IERVbmV4dC5pdGVyYXRvcigpOyBpaS5oYXNOZXh0KCk7KXsKLQkJCQkJCU1QSUJsb2NrIGIgPSAoTVBJQmxvY2spaWkubmV4dCgpOwotCQkJCQkJaWYoYi5zbGljZWQgPT0gdHJ1ZSkgY29udGludWU7Ci0JCQkJCQlpZighc2VlZHMuY29udGFpbnMoYikpewotCQkJCQkJCXNlZWRzLmFkZChiKTsKLQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYmxvY2sgIiArIGIuZ2V0SUQoKSArICIgaXMgYWRkZWQgdG8gc2VlZHMiKTsKLQkJCQkJCX0KLQkJCQkJCWlmKCFiLmdldE1WdmFyKCkuY29udGFpbnMoTVZ2YXIpKQotCQkJCQkJCWIuZ2V0TVZ2YXIoKS5hZGQoTVZ2YXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKiogSW50ZXItYmxvY2sgc2xpY2luZyBiYXNlZCBvbiBcUGhpIGVkZ2VzICovCi0JCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gYmxvY2suZ2V0Sm9pbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJTVBJQmxvY2sgam9pbiA9IChNUElCbG9jaylpLm5leHQoKTsKLQkJCQlpZighc2VlZHMuY29udGFpbnMoam9pbikgJiYgIWpvaW4uc2xpY2VkKSAKLQkJCQkJc2VlZHMuYWRkKGpvaW4pOwotCQkJfQotCQl9Ci0JCQotCQlMaXN0PFN0cmluZz4gTVZsaXN0ID0gY3VycmVudE5vZGVfLmdldE1WU3VtbWFyeSgpLmdldCh2YXIpOwotCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gY3VycmVudE5vZGVfLmdldEdsb2JhbERlZigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlTdHJpbmcgdiA9IGkubmV4dCgpOwotCQkJaWYoKChNUElCbG9jayljZmcuZ2V0RXhpdCgpKS5nZXRNVnZhcigpLmNvbnRhaW5zKHYpKXsKLQkJCQlpZighTVZsaXN0LmNvbnRhaW5zKHYpKSBNVmxpc3QuYWRkKHYpOwotCQkJfQotCQl9Ci0JCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSBjdXJyZW50Tm9kZV8uZ2V0UGFyYW1EZWYoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJU3RyaW5nIHYgPSAoU3RyaW5nKWkubmV4dCgpOwotCQkJaWYoKChNUElCbG9jayljZmcuZ2V0RXhpdCgpKS5nZXRNVnZhcigpLmNvbnRhaW5zKHYpKXsKLQkJCQlpZighTVZsaXN0LmNvbnRhaW5zKHYpKSBNVmxpc3QuYWRkKHYpOwotCQkJfQotCQl9Ci0JCQotCi0JCWlmKHJldHVybk1WKCkpCi0JCQlpZighTVZsaXN0LmNvbnRhaW5zKGN1cnJlbnROb2RlXy5nZXRGdW5jTmFtZSgpKSkKLQkJCQlNVmxpc3QuYWRkKGN1cnJlbnROb2RlXy5nZXRGdW5jTmFtZSgpKTsKLQl9Ci0KLQkvKiogVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIG11bHRpLXZhbHVlZCBpZiBhbnkgb2YgaXRzIAotCSAqIHJldHVybiBzdGF0ZW1lbnQgaXMgbXVsdGktdmFsdWVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZXR1cm5NVigpewotCQlib29sZWFuIHJldHVybm12ID0gZmFsc2U7Ci0JCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSAoKE1QSUNvbnRyb2xGbG93R3JhcGgpY3VycmVudE5vZGVfLmdldENGRygpKS5nZXRSZXR1cm5CbG9ja3MoKS5pdGVyYXRvcigpOyAKLQkJCWkuaGFzTmV4dCgpOyl7Ci0JCQlNUElCbG9jayByZXR1cm5CbG9jayA9IChNUElCbG9jaylpLm5leHQoKTsKLQkJCUV4cHJNVkFuYWx5emVyIGVtYSA9IG5ldyBFeHByTVZBbmFseXplcihyZXR1cm5CbG9jay5nZXRDb250ZW50KCksIAotCQkJCQkJCQkJCQkJcmV0dXJuQmxvY2suZ2V0TVZ2YXIoKSwgcmV0dXJuQmxvY2spOwotCQkJZW1hLnJ1bigpOwotCQkJcmV0dXJubXYgPSByZXR1cm5tdiB8IGVtYS5pc01WKCk7Ci0JCQlyZXR1cm5CbG9jay5zZXRNVihmYWxzZSk7IC8vcmVzZXQgaXQKLQkJfQotCQlyZXR1cm4gcmV0dXJubXY7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVBvaW50ZXJzKE1QSUJsb2NrIGJsb2NrLCBMaXN0PFN0cmluZz4gc2V0KXsKLQkJUG9pbnRlckFuYWx5emVyIHBhID0gbmV3IFBvaW50ZXJBbmFseXplcihibG9jayk7Ci0JCXBhLnJ1bigpOwotCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gcGEuZ2V0QWRkcigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlTdHJpbmcgdmFyID0gaS5uZXh0KCk7Ci0JCQlpZihibG9jay5nZXRVc2UoKS5jb250YWlucyh2YXIpKXsKLQkJCQlpZighc2V0LmNvbnRhaW5zKHZhcikpIHNldC5hZGQodmFyKTsKLQkJCX0KLQkJfQotCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gcGEuZ2V0RGVyZWYoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJU3RyaW5nIHZhciA9IGkubmV4dCgpOwotCQkJaWYoYmxvY2suZ2V0VXNlKCkuY29udGFpbnModmFyKSl7Ci0JCQkJaWYoIXNldC5jb250YWlucyh2YXIpKSBzZXQuYWRkKHZhcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb2FkQ2FzdChNUElCbG9jayBibG9jaywgTGlzdDxTdHJpbmc+IHNldCl7Ci0JCUJyb2FkQ2FzdEFuYWx5emVyIGJjYSA9IG5ldyBCcm9hZENhc3RBbmFseXplcihibG9jayk7Ci0JCWJjYS5ydW4oKTsKLQkJU3RyaW5nIGJjZGF0YSA9IGJjYS5nZXRCQ2RhdGEoKTsKLQkJaWYoYmNkYXRhICE9IG51bGwpewotCQkJaWYoc2V0LmNvbnRhaW5zKGJjZGF0YSkpCi0JCQkJc2V0LnJlbW92ZShiY2RhdGEpOwotCQl9Ci0JCWJsb2NrLnNldE1WdmFyKHNldCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjbGVhbigpewotCQlmb3IoSUJsb2NrIGIgPSBjdXJyZW50Tm9kZV8uZ2V0Q0ZHKCkuZ2V0RW50cnkoKTsgYiAhPSBudWxsOyBiID0gYi50b3BOZXh0KCkpewotCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCWJsb2NrLnNsaWNlZCA9IGZhbHNlOwotCQkJYmxvY2suc2V0TVZ2YXIobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQl9Ci0JfQotCQotCQotCWNsYXNzIEV4cHJNVkFuYWx5emVyewotCQlwcml2YXRlIElBU1RTdGF0ZW1lbnQgc3RtdF87Ci0JCXByaXZhdGUgSUFTVEV4cHJlc3Npb24gZXhwcl87Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbnRleHRfOwotCQlwcml2YXRlIE1QSUJsb2NrIGN1cnJlbnRCbG9ja187Ci0KLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gTVZ2YXJfOwotCQlwcml2YXRlIFN0YWNrPGJvb2xlYW5bXT4gZXhwckxpc3RNVkNvbnRleHRfOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotCQotCQlwdWJsaWMgRXhwck1WQW5hbHl6ZXIoSUFTVFN0YXRlbWVudCBzdG10LCBMaXN0PFN0cmluZz4gY29udGV4dCwgTVBJQmxvY2sgYmxvY2spewotCQkJc3RtdF8gPSBzdG10OwotCQkJZXhwcl8gPSBudWxsOwotCQkJY29udGV4dF8gPSBjb250ZXh0OwotCQkJY3VycmVudEJsb2NrXyA9IGJsb2NrOwotCQkJTVZ2YXJfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlleHByTGlzdE1WQ29udGV4dF8gPSBuZXcgU3RhY2s8Ym9vbGVhbltdPigpOwotCQkJdmFsdWUgPSBmYWxzZTsKLQkJfQotCQotCQlwdWJsaWMgRXhwck1WQW5hbHl6ZXIoSUFTVEV4cHJlc3Npb24gZXhwciwgTGlzdDxTdHJpbmc+IGNvbnRleHQsIE1QSUJsb2NrIGJsb2NrKXsKLQkJCXN0bXRfID0gbnVsbDsKLQkJCWV4cHJfID0gZXhwcjsKLQkJCWNvbnRleHRfID0gY29udGV4dDsKLQkJCWN1cnJlbnRCbG9ja18gPSBibG9jazsKLQkJCU1WdmFyXyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZXhwckxpc3RNVkNvbnRleHRfID0gbmV3IFN0YWNrPGJvb2xlYW5bXT4oKTsKLQkJCXZhbHVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFeHByTVZBbmFseXplcihJQVNUTm9kZSBub2RlLCBMaXN0PFN0cmluZz4gY29udGV4dCwgTVBJQmxvY2sgYmxvY2spewotCQkJaWYobm9kZSBpbnN0YW5jZW9mIElBU1RFeHByZXNzaW9uKXsKLQkJCQlzdG10XyA9IG51bGw7Ci0JCQkJZXhwcl8gPSAoSUFTVEV4cHJlc3Npb24pbm9kZTsKLQkJCX0gCi0JCQllbHNlIGlmKG5vZGUgaW5zdGFuY2VvZiBJQVNUU3RhdGVtZW50KXsKLQkJCQlzdG10XyA9IChJQVNUU3RhdGVtZW50KW5vZGU7Ci0JCQkJZXhwcl8gPSBudWxsOwotCQkJfQotCQkJY29udGV4dF8gPSBjb250ZXh0OwotCQkJY3VycmVudEJsb2NrXyA9IGJsb2NrOwotCQkJTVZ2YXJfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlleHByTGlzdE1WQ29udGV4dF8gPSBuZXcgU3RhY2s8Ym9vbGVhbltdPigpOwotCQkJdmFsdWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQlpZihzdG10XyAhPSBudWxsKXsKLQkJCQl2YWx1ZSA9IFVzZURlZk1WTWFwcGluZyhzdG10Xyk7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHJfICE9IG51bGwpewotCQkJCUxpc3Q8U3RyaW5nPiBkZWZzZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQl2YWx1ZSA9IHVzZURlZk1WTWFwcGluZyhleHByXywgcmhzLCBudWxsLCBkZWZzZXQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc01WKCl7cmV0dXJuIHZhbHVlO30KLQkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNVkxpc3QoKSB7cmV0dXJuIE1WdmFyXzt9Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gVXNlRGVmTVZNYXBwaW5nKElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50KXsKLQkJCQlib29sZWFuIHZhbHVlID0gZmFsc2U7Ci0JCQkJSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50IGRlY2xTdG10ID0gKElBU1REZWNsYXJhdGlvblN0YXRlbWVudClzdG10OwotCQkJCUlBU1REZWNsYXJhdGlvbiBkZWNsID0gZGVjbFN0bXQuZ2V0RGVjbGFyYXRpb24oKTsKLQkJCQlpZihkZWNsIGluc3RhbmNlb2YgSUFTVFNpbXBsZURlY2xhcmF0aW9uKXsKLQkJCQkJSUFTVFNpbXBsZURlY2xhcmF0aW9uIHNpbXBsZURlY2wgPSAoSUFTVFNpbXBsZURlY2xhcmF0aW9uKWRlY2w7Ci0JCQkJCUlBU1REZWNsYXJhdG9yW10gZGVjbGFyYXRvcnMgPSBzaW1wbGVEZWNsLmdldERlY2xhcmF0b3JzKCk7Ci0JCQkJCWZvcihpbnQgaT0wOyBpPGRlY2xhcmF0b3JzLmxlbmd0aDsgaSsrKXsKLQkJCQkJCWJvb2xlYW4gdjEgPSBmYWxzZTsKLQkJCQkJCUlBU1RJbml0aWFsaXplciBpbml0ID0gZGVjbGFyYXRvcnNbaV0uZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJCQkJCWlmKGluaXQgIT0gbnVsbCl7Ci0JCQkJCQkJSUFTVE5hbWUgbmFtZSA9IGRlY2xhcmF0b3JzW2ldLmdldE5hbWUoKTsKLQkJCQkJCQl2MSA9IGhhbmRsZUluaXRpYWxpemVyKGluaXQpOwotCQkJCQkJCWlmKHYxKXsKLQkJCQkJCQkJaWYoIU1WdmFyXy5jb250YWlucyhuYW1lLnRvU3RyaW5nKCkpKQotCQkJCQkJCQkJTVZ2YXJfLmFkZChuYW1lLnRvU3RyaW5nKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXZhbHVlID0gdmFsdWUgfCB2MTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQllbHNlIGlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvblN0YXRlbWVudCl7Ci0JCQkJSUFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclMgPSAoSUFTVEV4cHJlc3Npb25TdGF0ZW1lbnQpc3RtdDsKLQkJCQlJQVNURXhwcmVzc2lvbiBleHByID0gZXhwclMuZ2V0RXhwcmVzc2lvbigpOwotCQkJCUxpc3Q8U3RyaW5nPiBtdmxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQl2YWx1ZSA9IHVzZURlZk1WTWFwcGluZyhleHByLCByaHMsIG51bGwsIG12bGlzdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVJbml0aWFsaXplcihJQVNUSW5pdGlhbGl6ZXIgaW5pdCl7Ci0JCQlpZihpbml0IGluc3RhbmNlb2YgSUFTVEluaXRpYWxpemVyRXhwcmVzc2lvbil7Ci0JCQkJSUFTVEluaXRpYWxpemVyRXhwcmVzc2lvbiBpbml0RSA9IChJQVNUSW5pdGlhbGl6ZXJFeHByZXNzaW9uKWluaXQ7Ci0JCQkJSUFTVEV4cHJlc3Npb24gZXhwciA9IGluaXRFLmdldEV4cHJlc3Npb24oKTsKLQkJCQlMaXN0PFN0cmluZz4gbXZsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJcmV0dXJuIHVzZURlZk1WTWFwcGluZyhleHByLCByaHMsIG51bGwsIG12bGlzdCk7Ci0JCQl9Ci0JCQllbHNlIGlmKGluaXQgaW5zdGFuY2VvZiBJQVNUSW5pdGlhbGl6ZXJMaXN0KXsKLQkJCQlJQVNUSW5pdGlhbGl6ZXJMaXN0IGluaXRMaXN0ID0gKElBU1RJbml0aWFsaXplckxpc3QpaW5pdDsKLQkJCQlJQVNUSW5pdGlhbGl6ZXJbXSBsaXN0ID0gaW5pdExpc3QuZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQkJYm9vbGVhbiBsaXN0dmFsdWUgPSBmYWxzZTsKLQkJCQlmb3IoaW50IGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKXsKLQkJCQkJbGlzdHZhbHVlID0gbGlzdHZhbHVlIHwgaGFuZGxlSW5pdGlhbGl6ZXIobGlzdFtpXSk7Ci0JCQkJfQotCQkJCXJldHVybiBsaXN0dmFsdWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQkvKiogUmV0dXJuIHRydWUgaWYgImV4cHIiIGlzIG11bHRpX3ZhbHVlZC4KLQkJICogInNldCIgY29udGFpbnMgYWxsIGRlZmluZWQgdmFyaWFibGVzIGluICJleHByIiB0aHJvdWdoIGFzc2lnbm1lbnQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZNVk1hcHBpbmcoSUFTVEV4cHJlc3Npb24gZXhwciwgaW50IHNpZGUsIAotCQkJCUlBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZ1bmMsIExpc3Q8U3RyaW5nPiBzZXQpewotCQkJYm9vbGVhbiB2MSA9IGZhbHNlLCB2MiA9IGZhbHNlLCB2MyA9IGZhbHNlOwotCQkJTGlzdDxTdHJpbmc+IGwxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IAotCQkJTGlzdDxTdHJpbmc+IGwyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlMaXN0PFN0cmluZz4gbDMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWlmKGV4cHIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAKLQkJCWlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQW1iaWd1b3VzRXhwcmVzc2lvbil7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQXJyYXlTdWJzY3JpcHRFeHByZXNzaW9uKXsKLQkJCQlJQVNUQXJyYXlTdWJzY3JpcHRFeHByZXNzaW9uIGFzRSA9IChJQVNUQXJyYXlTdWJzY3JpcHRFeHByZXNzaW9uKWV4cHI7Ci0JCQkJaWYoc2lkZSA9PSByaHMpewotCQkJCQkvLyA9IGFbaW5kZXhfZXhwcl0KLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcoYXNFLmdldEFycmF5RXhwcmVzc2lvbigpLCByaHMsIGZ1bmMsIGwxKTsgCi0JCQkJCXYyID0gdXNlRGVmTVZNYXBwaW5nKGFzRS5nZXRTdWJzY3JpcHRFeHByZXNzaW9uKCksIHJocywgZnVuYywgbDIpOwotCQkJCX0gZWxzZSB7IC8vbGhzCi0JCQkJCS8vIGFbYltpXV0gPSAuLi4gLCBhIGlzIGRlZmluZWQsIGIgYW5kIGkgYXJlIHVzZWQKLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcoYXNFLmdldFN1YnNjcmlwdEV4cHJlc3Npb24oKSwgcmhzLCBmdW5jLCBsMSk7Ci0JCQkJCXYyID0gdXNlRGVmTVZNYXBwaW5nKGFzRS5nZXRBcnJheUV4cHJlc3Npb24oKSwgbGhzLCBmdW5jLCBsMik7Ci0JCQkJfQotCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCVV0aWwuYWRkQWxsKHNldCwgbDIpOwotCQkJCXJldHVybiB2MSB8IHYyOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEJpbmFyeUV4cHJlc3Npb24pewotCQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIGJpRSA9IChJQVNUQmluYXJ5RXhwcmVzc2lvbilleHByOwotCQkJCWludCBvcCA9IGJpRS5nZXRPcGVyYXRvcigpOwotCQkJCWlmKG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2Fzc2lnbil7Ci0JCQkJCS8vIHggPSB5ID0geiBpcyByaWdodCBhc3NvY2lhdGl2ZSAtLT4geCA9ICh5ID0geikKLQkJCQkJLy8gU28gdGhlICJzaWRlIiB3aWxsIGJlIGFsd2F5cyByaHMKLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcoYmlFLmdldE9wZXJhbmQxKCksIGxocywgZnVuYywgbDEpOwotCQkJCQl2MiA9IHVzZURlZk1WTWFwcGluZyhiaUUuZ2V0T3BlcmFuZDIoKSwgcmhzLCBmdW5jLCBsMik7Ci0JCQkJCWlmKHYyKXsKLQkJCQkJCVV0aWwuYWRkQWxsKE1WdmFyXywgbDEpOwotCQkJCQl9Ci0JCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCQlVdGlsLmFkZEFsbChzZXQsIGwyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiggb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfbXVsdGlwbHlBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9kaXZpZGVBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9tb2R1bG9Bc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9wbHVzQXNzaWduIHx8Ci0JCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfbWludXNBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9zaGlmdExlZnRBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9zaGlmdFJpZ2h0QXNzaWduIHx8Ci0JCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfYmluYXJ5QW5kQXNzaWduIHx8Ci0JCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfYmluYXJ5WG9yQXNzaWduIHx8Ci0JCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfYmluYXJ5T3JBc3NpZ24pewotCQkJCQl2MSA9IHVzZURlZk1WTWFwcGluZyhiaUUuZ2V0T3BlcmFuZDEoKSwgcmhzLCBmdW5jLCBsMSk7Ci0JCQkJCXYyID0gdXNlRGVmTVZNYXBwaW5nKGJpRS5nZXRPcGVyYW5kMigpLCByaHMsIGZ1bmMsIGwyKTsKLQkJCQkJdjMgPSB1c2VEZWZNVk1hcHBpbmcoYmlFLmdldE9wZXJhbmQxKCksIGxocywgZnVuYywgbDMpOwotCQkJCQlpZih2MSB8IHYyKXsKLQkJCQkJCVV0aWwuYWRkQWxsKE1WdmFyXywgbDMpOwotCQkJCQl9Ci0JCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCQlVdGlsLmFkZEFsbChzZXQsIGwyKTsKLQkJCQkJVXRpbC5hZGRBbGwoc2V0LCBsMyk7Ci0JCQkJfSAKLQkJCQllbHNlIHsKLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcoYmlFLmdldE9wZXJhbmQxKCksIHJocywgZnVuYywgbDEpOwotCQkJCQl2MiA9IHVzZURlZk1WTWFwcGluZyhiaUUuZ2V0T3BlcmFuZDIoKSwgcmhzLCBmdW5jLCBsMik7Ci0JCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCQlVdGlsLmFkZEFsbChzZXQsIGwyKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHYxIHwgdjIgfCB2MzsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RDYXN0RXhwcmVzc2lvbil7Ci0JCQkJSUFTVENhc3RFeHByZXNzaW9uIGNhc3RFID0gKElBU1RDYXN0RXhwcmVzc2lvbilleHByOwotCQkJCXYxID0gdXNlRGVmTVZNYXBwaW5nKGNhc3RFLmdldE9wZXJhbmQoKSwgc2lkZSwgZnVuYywgbDEpOwotCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCXJldHVybiB2MTsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RDb25kaXRpb25hbEV4cHJlc3Npb24pewotCQkJCUlBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZEUgPSAoSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbilleHByOwotCQkJCWlmKHNpZGUgPT0gcmhzKXsKLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcoY29uZEUuZ2V0TG9naWNhbENvbmRpdGlvbkV4cHJlc3Npb24oKSwgcmhzLCBmdW5jLCBsMSk7IAotCQkJCQl2MiA9IHVzZURlZk1WTWFwcGluZyhjb25kRS5nZXRQb3NpdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgcmhzLCBmdW5jLCBsMik7IAotCQkJCQl2MyA9IHVzZURlZk1WTWFwcGluZyhjb25kRS5nZXROZWdhdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgcmhzLCBmdW5jLCBsMyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZWcuICh4ID4geSA/IHggOiB5KSA9IDEKLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcoY29uZEUuZ2V0TG9naWNhbENvbmRpdGlvbkV4cHJlc3Npb24oKSwgcmhzLCBmdW5jLCBsMSk7IAotCQkJCQl2MiA9IHVzZURlZk1WTWFwcGluZyhjb25kRS5nZXRQb3NpdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgbGhzLCBmdW5jLCBsMik7IAotCQkJCQl2MyA9IHVzZURlZk1WTWFwcGluZyhjb25kRS5nZXROZWdhdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgbGhzLCBmdW5jLCBsMyk7Ci0JCQkJfQotCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCVV0aWwuYWRkQWxsKHNldCwgbDIpOwotCQkJCVV0aWwuYWRkQWxsKHNldCwgbDMpOwotCQkJCXJldHVybiB2MSB8IHYyIHwgdjM7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvbkxpc3QpewotCQkJCUlBU1RFeHByZXNzaW9uTGlzdCBleHByTGlzdCA9IChJQVNURXhwcmVzc2lvbkxpc3QpZXhwcjsKLQkJCQlJQVNURXhwcmVzc2lvbltdIGV4cHJzID0gZXhwckxpc3QuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJCQlib29sZWFuW10gbmV3Q29udGV4dF8gPSBuZXcgYm9vbGVhbltleHBycy5sZW5ndGhdOwotCQkJCWZvcihpbnQgaSA9IDA7IGk8ZXhwcnMubGVuZ3RoOyBpKyspewotCQkJCQl2MSA9IHYxIHwgdXNlRGVmTVZNYXBwaW5nKGV4cHJzW2ldLCBzaWRlLCBmdW5jLCBsMSk7Ci0JCQkJCW5ld0NvbnRleHRfW2ldID0gdjE7Ci0JCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCX0KLQkJCQlpZihmdW5jICE9IG51bGwpIAotCQkJCQlleHByTGlzdE1WQ29udGV4dF8ucHVzaChuZXdDb250ZXh0Xyk7Ci0JCQkJcmV0dXJuIHYxOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEZpZWxkUmVmZXJlbmNlKXsKLQkJCQlJQVNURmllbGRSZWZlcmVuY2UgZnJFID0gKElBU1RGaWVsZFJlZmVyZW5jZSlleHByOwotCQkJCXYxID0gdXNlRGVmTVZNYXBwaW5nKGZyRS5nZXRGaWVsZE93bmVyKCksIHNpZGUsIGZ1bmMsIGwxKTsKLQkJCQlVdGlsLmFkZEFsbChzZXQsIGwxKTsKLQkJCQlyZXR1cm4gdjE7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbil7Ci0JCQkJSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZnVuY0UgPSAoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pZXhwcjsKLQkJCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmNFLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQkJSUFTVEV4cHJlc3Npb24gcGFyYW1ldGVyID0gZnVuY0UuZ2V0UGFyYW1ldGVyRXhwcmVzc2lvbigpOwotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbiA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnROb2RlXy5nZXRGaWxlTmFtZSgpLCBzaWduYXR1cmUpOwotCQkJCWlmKG4gIT0gbnVsbCl7Ci0JCQkJCS8qIDEuIERldGVybWluZSB3aGV0aGVyIGVhY2ggcGFyYW1ldGVyIGlzIE1WIG9yIFNWCi0JCQkJCSAqIDIuIFJlZmVyIHRvIHRoZSBNVnN1bW1hcnksIGZpbmQgdGhlIHNldCBvZiBNViB2YXJpYWJsZXMgCi0JCQkJCSAqIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVyIE1WIGNvbnRleHQsIGFuZCBmaW5kIG91dCAKLQkJCQkJICogd2hldGhlciB0aGUgcmV0dXJuIHZhbHVlIGlzIE1WIG9yIFNWCi0JCQkJCSAqLwotCQkJCQlib29sZWFuIHJldHVybnZhbCA9IGZhbHNlOwotCQkJCQlpZihwYXJhbWV0ZXIgIT0gbnVsbCl7Ci0JCQkJCQl2MSA9IHVzZURlZk1WTWFwcGluZyhwYXJhbWV0ZXIsIHNpZGUsIGZ1bmNFLCBsMSk7Ci0JCQkJCQlpZihwYXJhbWV0ZXIgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvbkxpc3QpeyAvLyA+MSBwYXJhbWV0ZXIKLQkJCQkJCQlib29sZWFuW10gcGFyYW1Db250ZXh0ID0gKGJvb2xlYW5bXSlleHByTGlzdE1WQ29udGV4dF8ucG9wKCk7Ci0JCQkJCQkJZm9yKGludCBpPTA7IGk8cGFyYW1Db250ZXh0Lmxlbmd0aDsgaSsrKXsKLQkJCQkJCQkJaWYocGFyYW1Db250ZXh0W2ldKXsKLQkJCQkJCQkJCVN0cmluZyBwYXJhbSA9IGdldEZvcm1hbFBhcmFtTmFtZShuLCBpKTsKLQkJCQkJCQkJCWlmKHBhcmFtICE9IG51bGwpewotCQkJCQkJCQkJCUxpc3Q8U3RyaW5nPiBtdmxpc3QgPSBuLmdldE1WU3VtbWFyeSgpLmdldChwYXJhbSk7Ci0JCQkJCQkJCQkJVXRpbC5hZGRBbGwoTVZ2YXJfLCBtdmxpc3QpOwotCQkJCQkJCQkJCWlmKG12bGlzdC5jb250YWlucyhuLmdldEZ1bmNOYW1lKCkpKXsgLy9yZXR1cm4gTVYgdmFsdWUKLQkJCQkJCQkJCQkJTVZ2YXJfLnJlbW92ZShuLmdldEZ1bmNOYW1lKCkpOwotCQkJCQkJCQkJCQlyZXR1cm52YWwgPSB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7IC8vIHNpbmdsZSBwYXJhbWV0ZXIKLQkJCQkJCQlTdHJpbmcgcGFyYW0gPSBnZXRGb3JtYWxQYXJhbU5hbWUobiwgMCk7Ci0JCQkJCQkJaWYocGFyYW0gIT0gbnVsbCl7Ci0JCQkJCQkJCUxpc3Q8U3RyaW5nPiBtdmxpc3QgPSBuLmdldE1WU3VtbWFyeSgpLmdldChwYXJhbSk7Ci0JCQkJCQkJCVV0aWwuYWRkQWxsKE1WdmFyXywgbXZsaXN0KTsKLQkJCQkJCQkJaWYobXZsaXN0LmNvbnRhaW5zKG4uZ2V0RnVuY05hbWUoKSkpeyAvL3JldHVybiBNViB2YWx1ZQotCQkJCQkJCQkJTVZ2YXJfLnJlbW92ZShuLmdldEZ1bmNOYW1lKCkpOwotCQkJCQkJCQkJcmV0dXJudmFsID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gbi5nZXRHbG9iYWxVc2UoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQkJU3RyaW5nIGd1c2UgPSBpLm5leHQoKTsKLQkJCQkJCWlmKGNvbnRleHRfLmNvbnRhaW5zKGd1c2UpKXsKLQkJCQkJCQlMaXN0PFN0cmluZz4gbXZsaXN0ID0gbi5nZXRNVlN1bW1hcnkoKS5nZXQoZ3VzZSk7Ci0JCQkJCQkJVXRpbC5hZGRBbGwoTVZ2YXJfLCBtdmxpc3QpOwotCQkJCQkJCWlmKG12bGlzdC5jb250YWlucyhuLmdldEZ1bmNOYW1lKCkpKXsgLy9yZXR1cm4gTVYgdmFsdWUKLQkJCQkJCQkJTVZ2YXJfLnJlbW92ZShuLmdldEZ1bmNOYW1lKCkpOwotCQkJCQkJCQlyZXR1cm52YWwgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihuLmdldE1WU3VtbWFyeSgpLnNpemUoKSA9PSAxKXsvL25vIHBhcmFtZXRlciwgbm8gZ2xvYmFsIHVzZQotCQkJCQkJTGlzdDxTdHJpbmc+IG12bGlzdCA9IG4uZ2V0TVZTdW1tYXJ5KCkuZ2V0KG4uZ2V0RnVuY05hbWUoKSk7Ci0JCQkJCQlpZihtdmxpc3Quc2l6ZSgpID09IDEgJiYgbXZsaXN0LmNvbnRhaW5zKG4uZ2V0RnVuY05hbWUoKSkpCi0JCQkJCQkJcmV0dXJudmFsID0gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm52YWwgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmV0dXJudmFsOwotCQkJCX0KLQkJCQllbHNleyAKLQkJCQkJaWYocGFyYW1ldGVyICE9IG51bGwpewotCQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcocGFyYW1ldGVyLCBzaWRlLCBmdW5jRSwgbDEpOwotCQkJCQkJaWYocGFyYW1ldGVyIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KQotCQkJCQkJCWV4cHJMaXN0TVZDb250ZXh0Xy5wb3AoKTsKLQkJCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCQkJcmV0dXJuIHYxOwotCQkJCQl9Ci0JCQkJCWVsc2UgCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVElkRXhwcmVzc2lvbil7Ci0JCQkJSUFTVElkRXhwcmVzc2lvbiBpZCA9IChJQVNUSWRFeHByZXNzaW9uKWV4cHI7Ci0JCQkJSUFTVE5hbWUgbmFtZSA9IGlkLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgdmFyID0gbmFtZS50b1N0cmluZygpOwotCQkJCWlmKHZhci5zdGFydHNXaXRoKCJNUElfIikpIHJldHVybiBmYWxzZTsKLQkJCQlpZihzaWRlID09IHJocyl7Ci0JCQkJCWlmKGZ1bmMgIT0gbnVsbCl7IC8vZnVuY3Rpb24gcGFyYW1ldGVyCi0JCQkJCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmMuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCQkJU3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmNuYW1lLmdldFJhd1NpZ25hdHVyZSgpOwotCQkJCQkJSUNhbGxHcmFwaE5vZGUgbiA9IGNnXy5nZXROb2RlKGN1cnJlbnROb2RlXy5nZXRGaWxlTmFtZSgpLCBzaWduYXR1cmUpOwotCQkJCQkJaWYobiA9PSBudWxsKSB7IC8vbGlicmFyeSBmdW5jdGlvbiBjYWxsCi0JCQkJCQkJaWYoY3VycmVudEJsb2NrXy5nZXREZWYoKS5jb250YWlucyh2YXIpKXsKLQkJCQkJCQkJaWYoIXNldC5jb250YWlucyh2YXIpKSBzZXQuYWRkKHZhcik7Ci0JCQkJCQkJCWlmKGNvbnRleHRfLmNvbnRhaW5zKHZhcikgJiYgIU1WdmFyXy5jb250YWlucyh2YXIpKQotCQkJCQkJCQkJTVZ2YXJfLmFkZCh2YXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihjb250ZXh0Xy5jb250YWlucyh2YXIpKSAKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7IC8vbGhzCi0JCQkJCWlmKCFzZXQuY29udGFpbnModmFyKSkKLQkJCQkJCXNldC5hZGQodmFyKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RMaXRlcmFsRXhwcmVzc2lvbil7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUUHJvYmxlbUV4cHJlc3Npb24pewotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFR5cGVJZEV4cHJlc3Npb24pewotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFVuYXJ5RXhwcmVzc2lvbil7Ci0JCQkJSUFTVFVuYXJ5RXhwcmVzc2lvbiB1RSA9IChJQVNUVW5hcnlFeHByZXNzaW9uKWV4cHI7Ci0JCQkJaW50IG9wID0gdUUuZ2V0T3BlcmF0b3IoKTsKLQkJCQlpZihvcCA9PSBJQVNUVW5hcnlFeHByZXNzaW9uLm9wX3ByZWZpeEluY3IgfHwKLQkJCQkJICBvcCA9PSBJQVNUVW5hcnlFeHByZXNzaW9uLm9wX3ByZWZpeERlY3IgfHwKLQkJCQkJICBvcCA9PSBJQVNUVW5hcnlFeHByZXNzaW9uLm9wX3Bvc3RGaXhJbmNyIHx8Ci0JCQkJCSAgb3AgPT0gSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9wb3N0Rml4RGVjcikgewotCQkJCQl2MSA9IHVzZURlZk1WTWFwcGluZyh1RS5nZXRPcGVyYW5kKCksIHJocywgZnVuYywgbDEpOwotCQkJCQl2MiA9IHVzZURlZk1WTWFwcGluZyh1RS5nZXRPcGVyYW5kKCksIGxocywgZnVuYywgbDIpOwotCQkJCQlpZih2MSl7Ci0JCQkJCQlVdGlsLmFkZEFsbChNVnZhcl8sIGwyKTsKLQkJCQkJfQotCQkJCQlVdGlsLmFkZEFsbChzZXQsIGwxKTsKLQkJCQkJVXRpbC5hZGRBbGwoc2V0LCBsMik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdjEgPSB1c2VEZWZNVk1hcHBpbmcodUUuZ2V0T3BlcmFuZCgpLCBzaWRlLCBmdW5jLCBsMSk7Ci0JCQkJCVV0aWwuYWRkQWxsKHNldCwgbDEpOwotCQkJCX0KLQkJCQlyZXR1cm4gdjEgfCB2MjsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElDQVNUVHlwZUlkSW5pdGlhbGl6ZXJFeHByZXNzaW9uKXsKLQkJCX0KLQkJCWVsc2V7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9ybWFsUGFyYW1OYW1lKElDYWxsR3JhcGhOb2RlIGZ1bmMsIGludCBpbmRleCl7Ci0JCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmQgPSBmdW5jLmdldEZ1bmNEZWYoKTsKLQkJSUFTVEZ1bmN0aW9uRGVjbGFyYXRvciBmZGVjbCA9IGZkLmdldERlY2xhcmF0b3IoKTsKLQkJaWYoZmRlY2wgaW5zdGFuY2VvZiBJQVNUU3RhbmRhcmRGdW5jdGlvbkRlY2xhcmF0b3IpewotCQkJSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIHNmdW5jID0gKElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCUlBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbltdIHBhcmFtcyA9IHNmdW5jLmdldFBhcmFtZXRlcnMoKTsKLQkJCWlmKGluZGV4ID49IHBhcmFtcy5sZW5ndGgpIC8vIGFkZGl0aW9uYWwgcGFyYW1ldGVycwotCQkJCXJldHVybiBudWxsOwotCQkJSUFTVE5hbWUgcGFyYW0gPSBwYXJhbXNbaW5kZXhdLmdldERlY2xhcmF0b3IoKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gcGFyYW0udG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCUlDQVNUS25SRnVuY3Rpb25EZWNsYXJhdG9yIGtyZnVuYyA9IChJQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCUlBU1ROYW1lW10gcGFyYW1zID0ga3JmdW5jLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCQlpZihpbmRleCA+PSBwYXJhbXMubGVuZ3RoKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBhcmFtc1tpbmRleF0udG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQkvKiogRGV0ZXJtaW5lcyBhIHNldCBvZiBtdWx0aS12YWx1ZWQgIlZBUklBQkxFUyIgKGxvY2FsIGFuZCBnbG9iYWwpIAotCSAqIGluIGVhY2ggcHJvZ3JhbSBwb2ludCAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZnVuY3Rpb25TbGljaW5nKCl7Ci0JCWZvcihJQ2FsbEdyYXBoTm9kZSBuID0gY2dfLnRvcEVudHJ5KCk7IG4gIT0gbnVsbDsgbiA9IG4udG9wTmV4dCgpKXsKLQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKW47Ci0JCQlpZighbm9kZS5tYXJrZWQpIGNvbnRpbnVlOwotCQkJY3VycmVudE5vZGVfID0gbm9kZTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG5vZGUuZ2V0RnVuY05hbWUoKSk7Ci0JCQlJQ29udHJvbEZsb3dHcmFwaCBjZmcgPSBub2RlLmdldENGRygpOwotCQkJCi0JCQkvKiogVGhlIGluaXRpYWwgd29ya2xpc3QgY29udGFpbnMgc2VlZHMgYmxvY2tzIGluIHRoaXMgZnVuY3Rpb24gYW5kIAotCQkJICogdGhlIGVudHJ5IGJsb2NrIGlmIGFueSBvZiBpdHMgcGFyYW1ldGVycyBpcyBtdWx0aS12YWx1ZWQuIAotCQkJICovCi0JCQlXb3JrTGlzdENvbGxlY3RvciB3bGMgPSBuZXcgV29ya0xpc3RDb2xsZWN0b3IoY3VycmVudE5vZGVfKTsKLQkJCUxpbmtlZExpc3Q8SUJsb2NrPiBzZWVkcyA9IHdsYy5nZXRXb3JrTGlzdCgpOwotCQkJYm9vbGVhbiBoYXNNVnBhcmFtID0gZmFsc2U7Ci0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gbm9kZS5nZXRQYXJhbU1WKCkua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIHBhcmFtID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gdmFsID0gbm9kZS5nZXRQYXJhbU1WKCkuZ2V0KHBhcmFtKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlpZih2YWwpeyAvLyBtdWx0aS12YWx1ZWQgcGFyYW1ldGVyCi0JCQkJCSgoTVBJQmxvY2spY2ZnLmdldEVudHJ5KCkpLmdldE1WdmFyKCkuYWRkKHBhcmFtKTsKLQkJCQkJaGFzTVZwYXJhbSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYoaGFzTVZwYXJhbSkgc2VlZHMuYWRkKGNmZy5nZXRFbnRyeSgpKTsKLQkJCQotCQkJLyoqIFNsaWNpbmcgKi8KLQkJCXdoaWxlKCFzZWVkcy5pc0VtcHR5KCkpewotCQkJCU1QSUJsb2NrIGJsb2NrID0gKE1QSUJsb2NrKXNlZWRzLnJlbW92ZSgpOwotCQkJCWlmKGJsb2NrLnNsaWNlZCkgY29udGludWU7Ci0JCQkJYmxvY2suc2xpY2VkID0gdHJ1ZTsKLQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50IHNlZWQgaXMgIiArIGJsb2NrLmdldElEKCkpOwotCQkJCUhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBEVVN1Y2MgPSBibG9jay5nZXREVVN1Y2MoKTsKLQkJCQlMaXN0PFN0cmluZz4gbXYgPSBibG9jay5nZXRNVnZhcigpOwotCQkJCUxpc3Q8U3RyaW5nPiBuZXdNViA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCQotCQkJCWhhbmRsZVBvaW50ZXJzKGJsb2NrLCBtdik7Ci0KLQkJCQkvKiBJbnRyYS1ibG9jayBzbGljaW5nIChDYXNlICMxKSAtLS0KLQkJCQkgKiBJZiB0aGVyZSBpcyBhIFxwaGkgZnVuY3Rpb24gaW4gdGhpcyBibG9jaywgY29uc2lkZXIgdHdvIGNhc2VzOgotCQkJCSAqICgxKSBJZiB0aGlzIGJsb2NrIGlzIGEgam9pbiBibG9jayBmb3IgSWYgc3RhdGVtZW50IG9yIFN3aXRjaAotCQkJCSAqIHN0YXRlbWVudCwgb3IgaWYgdGhpcyBibG9jayBpcyBicmVhayBleGl0IGpvaW4gYmxvY2sgb2YgYSBsb29wLAotCQkJCSAqIHRoZW4gYWxsIFxwaGkgdmFyaWFibGVzIGluIHRoaXMgYmxvY2sgYXJlIG11bHRpLXZhbHVlZDsKLQkJCQkgKiAoMikgSWYgdGhpcyBibG9jayBpcyBhIGpvaW4gYmxvY2sgKGkuZS4sIGNvbmQgYmxvY2spIGZvciBGb3IgCi0JCQkJICogc3RhdGVtZW50LCBXaGlsZSBzdGF0ZW1lbnQgb3IgRG8gc3RhdGVtZW50LCB0aGVuIGl0cyBtdWx0aS12YWx1ZWQgCi0JCQkJICogXHBoaSB2YXJpYWJsZXMgaGF2ZSBiZWVuIGFscmVhZHkgbWFya2VkIHRocm91Z2ggZGF0YSBkZXBlbmRlbmNlcywgCi0JCQkJICogYW5kIGFsbCB1c2VkIFxwaGkgdmFyaWFibGVzIGFyZSBrZXB0IG11bHRpLXZhbHVlZC4KLQkJCQkgKiBOb3RlOiBhIGJsb2NrIGZhbGxzIGludG8gb25lIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSB0d28gY2FzZXMuCi0JCQkJICovCi0JCQkJaWYoIWJsb2NrLmdldFBoaVZhcigpLmlzRW1wdHkoKSl7Ci0JCQkJCUxpc3Q8SUJsb2NrPiBjb25kID0gYmxvY2suZ2V0Q29uZCgpOwotCQkJCQlpbnQgYmxvY2tjYXNlID0gMDsKLQkJCQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IGNvbmQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJCWlmKGJsb2NrY2FzZSA9PSAyKSBicmVhazsKLQkJCQkJCU1QSUJsb2NrIGNvbmRibG9jayA9IChNUElCbG9jaylpLm5leHQoKTsKLQkJCQkJCUlBU1RTdGF0ZW1lbnQgcGFyZW50ID0gY29uZGJsb2NrLmdldFBhcmVudCgpOwotCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50IHx8IAotCQkJCQkJCQlwYXJlbnQgaW5zdGFuY2VvZiBJQVNUU3dpdGNoU3RhdGVtZW50KQotCQkJCQkJCWJsb2NrY2FzZSA9IDE7Ci0JCQkJCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQgfHwKLQkJCQkJCQkJcGFyZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50IHx8Ci0JCQkJCQkJCXBhcmVudCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCl7Ci0JCQkJCQkJaWYoYmxvY2suZ2V0VHlwZSgpID09IE1QSUJsb2NrLmV4aXRfam9pbl90eXBlKQotCQkJCQkJCQlibG9ja2Nhc2UgPSAxOwotCQkJCQkJCWVsc2UgaWYoYmxvY2suZ2V0VHlwZSgpID09IE1QSUJsb2NrLmV4cHJfdHlwZSkKLQkJCQkJCQkJYmxvY2tjYXNlID0gMjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihibG9ja2Nhc2UgPT0gMSl7Ci0JCQkJCQluZXdNViA9IFV0aWwuVW5pb24obmV3TVYsIGJsb2NrLmdldFBoaVZhcigpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGJsb2NrY2FzZSA9PSAyKXsKLQkJCQkJCWZvcihJdGVyYXRvcjxJQmxvY2s+IGkgPSBjb25kLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJTVBJQmxvY2sgY29uZGJsb2NrID0gKE1QSUJsb2NrKWkubmV4dCgpOwotCQkJCQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGlpID0gY29uZGJsb2NrLmdldFVzZWRQaGlWYXIoKS5pdGVyYXRvcigpOwotCQkJCQkJCQkJaWkuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJCVN0cmluZyB2YXIgPSBpaS5uZXh0KCk7Ci0JCQkJCQkJCWlmKG12LmNvbnRhaW5zKHZhcikpCi0JCQkJCQkJCQluZXdNVi5hZGQodmFyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQotCQkJCQotCQkJCS8qKiBJbnRyYS1ibG9jayBzbGljaW5nIChDYXNlICMxKSAtLS0gCi0JCQkJICogR2l2ZW4gTVYvU1YgdXNlZCB2YXJpYWJsZSwgZGV0ZXJtaW5lIHdoZXRoZXIgZGVmaW5lZCB2YXJpYWJsZXMKLQkJCQkgKiBhcmUgTVYgb3IgU1YuICAKLQkJCQkgKi8KLQkJCQkKLQkJCQlJQVNUTm9kZSBjb250ZW50ID0gYmxvY2suZ2V0Q29udGVudCgpOwotCQkJCUV4cHJNVkFuYWx5emVyIGVtdmEgPSBuZXcgRXhwck1WQW5hbHl6ZXIoY29udGVudCwgbXYsIGJsb2NrKTsKLQkJCQllbXZhLnJ1bigpOwotCQkJCW5ld01WID0gVXRpbC5VbmlvbihuZXdNViwgZW12YS5nZXRNVkxpc3QoKSk7Ci0JCQkJCi0JCQkJLyoqIEludHJhLWJsb2NrIHNsaWNpbmcgKENhc2UgIzMpIC0tIAotCQkJCSAqICBhbnkgdXNlZCBvbmx5IG11bHRpLXZhbHVlZCB2YXJpYWJsZSBpcyBzdGlsbCBtdWx0aS12YWx1ZWQKLQkJCQkgKi8KLQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gbXYuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJU3RyaW5nIHZhciA9IGkubmV4dCgpOwotCQkJCQlpZihibG9jay5nZXRVc2UoKS5jb250YWlucyh2YXIpICYmICFibG9jay5nZXREZWYoKS5jb250YWlucyh2YXIpKXsKLQkJCQkJCWlmKCFuZXdNVi5jb250YWlucyh2YXIpKQotCQkJCQkJCW5ld01WLmFkZCh2YXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWhhbmRsZVBvaW50ZXJzKGJsb2NrLCBuZXdNVik7Ci0JCQkJaGFuZGxlQnJvYWRDYXN0KGJsb2NrLCBuZXdNVik7Ci0JCQkJYmxvY2suc2V0TVZ2YXIobmV3TVYpOwotCQkJCQotCQkJCS8qKiBJbnRlci1ibG9jayBzbGljaW5nIGJhc2VkIG9uIGRhdGEgZGVwZW5kZW5jZXMgKi8KLQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gbmV3TVYuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJU3RyaW5nIE1WdmFyID0gaS5uZXh0KCk7Ci0JCQkJCUxpc3Q8SUJsb2NrPiBEVW5leHQgPSBEVVN1Y2MuZ2V0KE1WdmFyKTsKLQkJCQkJaWYoRFVuZXh0ICE9IG51bGwpewotCQkJCQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaWkgPSBEVW5leHQuaXRlcmF0b3IoKTsgaWkuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJTVBJQmxvY2sgYiA9IChNUElCbG9jaylpaS5uZXh0KCk7Ci0JCQkJCQkJaWYoYi5zbGljZWQgPT0gdHJ1ZSkgY29udGludWU7Ci0JCQkJCQkJaWYoIXNlZWRzLmNvbnRhaW5zKGIpKXsKLQkJCQkJCQkJc2VlZHMuYWRkKGIpOwotCQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYmxvY2sgIiArIGIuZ2V0SUQoKSArICIgaXMgYWRkZWQgdG8gc2VlZHMiKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoIWIuZ2V0TVZ2YXIoKS5jb250YWlucyhNVnZhcikpCi0JCQkJCQkJCWIuZ2V0TVZ2YXIoKS5hZGQoTVZ2YXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8qKiBJbnRlci1ibG9jayBzbGljaW5nIGJhc2VkIG9uIFxQaGkgZWRnZXMgKi8KLQkJCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gYmxvY2suZ2V0Sm9pbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCU1QSUJsb2NrIGpvaW4gPSAoTVBJQmxvY2spaS5uZXh0KCk7Ci0JCQkJCWlmKCFzZWVkcy5jb250YWlucyhqb2luKSAmJiAham9pbi5zbGljZWQpIAotCQkJCQkJc2VlZHMuYWRkKGpvaW4pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogRnVuY3Rpb24gTXVsdGktdmFsdWVkIFN1bW1hcnkgLS0tICgxKSB3aGV0aGVyIGEgZnVuY3Rpb24ncyBSRUFMCi0JCQkgKiBwYXJhbXRlcnMgYXJlIG11bHRpLXZhbHVlZCAoQSByZWFsIHBhcmFtZXRlciBvZiBmdW5jdGlvbiBmb28gaXMgCi0JCQkgKiBtdWx0aS12YWx1ZWQgaWYgaW4gYW55IG9mIGZvbydzIGNhbGwgc2l0ZXMgdGhlIHBhcmFtZXRlciBpcyAKLQkJCSAqIG11bHRpLXZhbHVlZCkKLQkJCSAqLwotCQkJZm9yKElCbG9jayBibG9jayA9IGNmZy5nZXRFbnRyeSgpOyBibG9jayAhPSBudWxsOyBibG9jayA9IGJsb2NrLnRvcE5leHQoKSl7Ci0JCQkJRnVuY1BhcmFtTVZDaGVja2VyIGZwYyA9IG5ldyBGdW5jUGFyYW1NVkNoZWNrZXIobm9kZSwgKE1QSUJsb2NrKWJsb2NrKTsKLQkJCQlmcGMucnVuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgU2VlZHNDb2xsZWN0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yewkKLQkJcHJpdmF0ZSBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnRGdW5jXzsKLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdEV4cHJlc3Npb25zID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLQkJCQotCQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKW47Ci0JCQkJaWYoIW5vZGUubWFya2VkKSBjb250aW51ZTsKLQkJCQljdXJyZW50RnVuY18gPSBub2RlOwotCQkJCUlDb250cm9sRmxvd0dyYXBoIGNmZyA9IG5vZGUuZ2V0Q0ZHKCk7Ci0JCQkJZm9yKElCbG9jayBiID0gY2ZnLmdldEVudHJ5KCk7IGIgIT0gbnVsbDsgYiA9IGIudG9wTmV4dCgpKXsKLQkJCQkJSUFTVE5vZGUgY29udGVudCA9IGIuZ2V0Q29udGVudCgpOwotCQkJCQlpZihjb250ZW50ICE9IG51bGwpIAotCQkJCQkJY29udGVudC5hY2NlcHQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKW47Ci0JCQkJaWYoIW5vZGUubWFya2VkKSBjb250aW51ZTsKLQkJCQlpZihub2RlLmhhc1NlZWQoKSl7Ci0JCQkJCWZvcihJdGVyYXRvcjxJQ2FsbEdyYXBoTm9kZT4gaSA9IG5vZGUuZ2V0Q2FsbGVycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQlNUElDYWxsR3JhcGhOb2RlIGNhbGxlciA9IChNUElDYWxsR3JhcGhOb2RlKWkubmV4dCgpOwotCQkJCQkJY2FsbGVyLnNldFNlZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByKXsKLQkJCWlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbil7Ci0JCQkJSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZnVuY0V4cHIgPSAoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pZXhwcjsKLQkJCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmNFeHByLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQkJaWYoc2lnbmF0dXJlLmVxdWFscygiTVBJX0NvbW1fcmFuayIpKXsKLQkJCQkJY3VycmVudEZ1bmNfLnNldFNlZWQodHJ1ZSk7Ci0JCQkJfSAKLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JfQotCQotCQotCS8qKiBXb3JrIGxpc3QgY29udGFpbnMgdHdvIGtpbmRzIG9mIGJsb2NrczoKLQkgKiAoMSkgd2hlcmUgTVBJX0NvbW1fcmFuaygpIGlzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY2FsbGVkOyAKLQkgKiAoMikgdGhlIGVudHJ5IGJsb2NrIG9mIGEgZnVuY3Rpb24gdGhhdCBoYXMgc29tZSBNViByZWFsIHBhcmFtZXRlcnM7Ci0JICogCi0JICogKDEpIGlzIG1hcmtlZCBpbiBTZWVkc0NvbGxlY3RvciBhbmQgY29sbGVjdGVkIGluIFdvcmtMaXN0Q29sbGVjdG9yIAotCSAqICgyKSBpcyBjb2xsZWN0ZWQgaW4gdGhlIHNsaWNpbmcgZnVuY3Rpb24uIAotCSAqLwotCWNsYXNzIFdvcmtMaXN0Q29sbGVjdG9yIGV4dGVuZHMgQVNUVmlzaXRvcnsJCi0JCXByaXZhdGUgSUNhbGxHcmFwaE5vZGUgZnVuY187Ci0JCXByaXZhdGUgYm9vbGVhbiBpblJhbmtGdW5jOwotCQlwcml2YXRlIElBU1RFeHByZXNzaW9uTGlzdCBwYXJhbXM7Ci0JCXByaXZhdGUgTGlua2VkTGlzdDxJQmxvY2s+IHdsaXN0OwotCQlwcml2YXRlIE1QSUJsb2NrIGN1cnJlbnRCbG9ja187Ci0JCQotCQlwdWJsaWMgV29ya0xpc3RDb2xsZWN0b3IoSUNhbGxHcmFwaE5vZGUgZnVuYyl7Ci0JCQlmdW5jXyA9IGZ1bmM7Ci0JCQlpblJhbmtGdW5jID0gZmFsc2U7Ci0JCQl3bGlzdCA9IG5ldyBMaW5rZWRMaXN0PElCbG9jaz4oKTsKLQkJfQotCQkKLQkJcHVibGljIExpbmtlZExpc3Q8SUJsb2NrPiBnZXRXb3JrTGlzdCgpewotCQkJaWYoISgoTVBJQ2FsbEdyYXBoTm9kZSlmdW5jXykuaGFzU2VlZCgpKSAgcmV0dXJuIHdsaXN0OwotCQkJCi0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJZm9yKElCbG9jayBiID0gZnVuY18uZ2V0Q0ZHKCkuZ2V0RW50cnkoKTsgYiAhPSBudWxsOyBiID0gYi50b3BOZXh0KCkpewotCQkJCWN1cnJlbnRCbG9ja18gPSAoTVBJQmxvY2spYjsKLQkJCQlJQVNUTm9kZSBjb250ZW50ID0gYi5nZXRDb250ZW50KCk7Ci0JCQkJaWYoY29udGVudCAhPSBudWxsKSAKLQkJCQkJY29udGVudC5hY2NlcHQodGhpcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gd2xpc3Q7Ci0JCX0KLQkKLQkJcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByKXsKLQkJCWlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbil7Ci0JCQkJSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZnVuY0V4cHIgPSAoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pZXhwcjsKLQkJCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmNFeHByLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQkJaWYoc2lnbmF0dXJlLmVxdWFscygiTVBJX0NvbW1fcmFuayIpKXsKLQkJCQkJaW5SYW5rRnVuYyA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTVBJQ2FsbEdyYXBoTm9kZSBuID0gKE1QSUNhbGxHcmFwaE5vZGUpY2dfLmdldE5vZGUoY3VycmVudE5vZGVfLmdldEZpbGVOYW1lKCksIHNpZ25hdHVyZSk7Ci0JCQkJCWlmKG4gIT0gbnVsbCAmJiBuLmhhc1NlZWQoKSl7Ci0JCQkJCQlpZighd2xpc3QuY29udGFpbnMoY3VycmVudEJsb2NrXykpCi0JCQkJCQkJd2xpc3QuYWRkKGN1cnJlbnRCbG9ja18pOwotCQkJCQkJTGlzdDxTdHJpbmc+IGdlbk1WID0gbi5nZXRNVlN1bW1hcnkoKS5nZXQoc2lnbmF0dXJlKTsKLQkJCQkJCVV0aWwuYWRkQWxsKGN1cnJlbnRCbG9ja18uZ2V0TVZ2YXIoKSwgZ2VuTVYpOwotCQkJCQkJaWYoY3VycmVudEJsb2NrXy5nZXRNVnZhcigpLmNvbnRhaW5zKG4uZ2V0RnVuY05hbWUoKSkpCi0JCQkJCQkJY3VycmVudEJsb2NrXy5nZXRNVnZhcigpLnJlbW92ZShuLmdldEZ1bmNOYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUSWRFeHByZXNzaW9uKXsKLQkJCQlpZihpblJhbmtGdW5jKXsKLQkJCQkJSUFTVE5vZGUgbWUgPSBleHByOwotCQkJCQlJQVNUTm9kZSBwYXJlbnQgPSBtZS5nZXRQYXJlbnQoKTsKLQkJCQkJd2hpbGUodHJ1ZSl7Ci0JCQkJCQlpZihwYXJlbnQgPT0gcGFyYW1zKSBicmVhazsKLQkJCQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIGJyZWFrOwotCQkJCQkJZWxzZXsKLQkJCQkJCQltZSA9IHBhcmVudDsKLQkJCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoIShwYXJlbnQgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvbkxpc3QpKQotCQkJCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCQkJCUlBU1RFeHByZXNzaW9uW10gcmFua1BhcmFtcyA9IHBhcmFtcy5nZXRFeHByZXNzaW9ucygpOwotCQkJCQlpbnQgaW5kZXg7Ci0JCQkJCWZvcihpbmRleD0wOyBpbmRleDxyYW5rUGFyYW1zLmxlbmd0aDsgaW5kZXgrKyl7Ci0JCQkJCQlpZihtZSA9PSByYW5rUGFyYW1zW2luZGV4XSkgYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYoaW5kZXggPT0gMSl7Ci0JCQkJCQlJQVNUSWRFeHByZXNzaW9uIGlkID0gKElBU1RJZEV4cHJlc3Npb24pZXhwcjsKLQkJCQkJCVN0cmluZyB2YXIgPSBpZC5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkJCQkJCS8vaWYodmFyLmVxdWFscygiTVBJX0NvbW1fcmFuayIpKSByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJCQkJCWlmKCFjdXJyZW50QmxvY2tfLmdldE1WdmFyKCkuY29udGFpbnModmFyKSkKLQkJCQkJCQljdXJyZW50QmxvY2tfLmdldE1WdmFyKCkuYWRkKHZhcik7Ci0JCQkJCQlpZighd2xpc3QuY29udGFpbnMoY3VycmVudEJsb2NrXykpIHdsaXN0LmFkZChjdXJyZW50QmxvY2tfKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCQlpZihpblJhbmtGdW5jKXsKLQkJCQkJcGFyYW1zID0gKElBU1RFeHByZXNzaW9uTGlzdClleHByOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGxlYXZlKElBU1RFeHByZXNzaW9uIGV4cHIpewotCQkJaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jRXhwciA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByOwotCQkJCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZnVuY0V4cHIuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQlpZihzaWduYXR1cmUuZXF1YWxzKCJNUElfQ29tbV9yYW5rIikpewotCQkJCQlpblJhbmtGdW5jID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCQlwYXJhbXMgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgQnJvYWRDYXN0QW5hbHl6ZXIgZXh0ZW5kcyBBU1RWaXNpdG9yewotCQlwcml2YXRlIElCbG9jayBibG9ja187Ci0JCXByaXZhdGUgU3RyaW5nIHZhcjsKLQkJCi0JCXB1YmxpYyBCcm9hZENhc3RBbmFseXplcihJQmxvY2sgYmxvY2spewotCQkJYmxvY2tfID0gYmxvY2s7Ci0JCQl2YXIgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0QkNkYXRhKCkge3JldHVybiB2YXI7fQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJSUFTVE5vZGUgY29udGVudCA9IGJsb2NrXy5nZXRDb250ZW50KCk7Ci0JCQlpZihjb250ZW50ICE9IG51bGwpIAotCQkJCWNvbnRlbnQuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RFeHByZXNzaW9uIGV4cHIpewotCQkJaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jRSA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByOwotCQkJCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZnVuY0UuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQlpZihzaWduYXR1cmUuZXF1YWxzKCJNUElfQmNhc3QiKSl7Ci0JCQkJCUlBU1RFeHByZXNzaW9uIHBhcmFtRSA9IGZ1bmNFLmdldFBhcmFtZXRlckV4cHJlc3Npb24oKTsKLQkJCQkJSUFTVEV4cHJlc3Npb25bXSBwYXJhbXMgPSAoKElBU1RFeHByZXNzaW9uTGlzdClwYXJhbUUpLmdldEV4cHJlc3Npb25zKCk7Ci0JCQkJCUlBU1RFeHByZXNzaW9uIGRhdGFFID0gcGFyYW1zWzBdOwotCQkJCQlpZihkYXRhRSBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pewotCQkJCQkJSUFTVElkRXhwcmVzc2lvbiBJRCA9IChJQVNUSWRFeHByZXNzaW9uKWRhdGFFOwotCQkJCQkJdmFyID0gSUQuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihkYXRhRSBpbnN0YW5jZW9mIElBU1RVbmFyeUV4cHJlc3Npb24pewotCQkJCQkJSUFTVFVuYXJ5RXhwcmVzc2lvbiB1RSA9IChJQVNUVW5hcnlFeHByZXNzaW9uKWRhdGFFOwotCQkJCQkJaWYodUUuZ2V0T3BlcmF0b3IoKSA9PSBJQVNUVW5hcnlFeHByZXNzaW9uLm9wX2FtcGVyICYmCi0JCQkJCQkJCXVFLmdldE9wZXJhbmQoKSBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pewotCQkJCQkJCUlBU1RJZEV4cHJlc3Npb24gSUQgPSAoSUFTVElkRXhwcmVzc2lvbil1RS5nZXRPcGVyYW5kKCk7Ci0JCQkJCQkJdmFyID0gSUQuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFBST0NFU1NfU0tJUDsKLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0KLQl9Ci0JCi0JY2xhc3MgUG9pbnRlckFuYWx5emVyIGV4dGVuZHMgQVNUVmlzaXRvcnsKLQkJcHJvdGVjdGVkIElCbG9jayBibG9ja187Ci0JCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZGVyZWZfOwotCQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGFkZHJfOwotCQkKLQkJcHVibGljIFBvaW50ZXJBbmFseXplcihJQmxvY2sgYil7Ci0JCQlibG9ja18gPSBiOwotCQkJZGVyZWZfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlhZGRyXyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERlcmVmKCkge3JldHVybiBkZXJlZl87fQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFkZHIoKSB7cmV0dXJuIGFkZHJfO30KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdEV4cHJlc3Npb25zID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLQkJCUlBU1ROb2RlIGNvbnRlbnQgPSBibG9ja18uZ2V0Q29udGVudCgpOwotCQkJaWYoY29udGVudCAhPSBudWxsKSAKLQkJCQljb250ZW50LmFjY2VwdCh0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByKXsKLQkJCXZpc2l0b3IoZXhwciwgZmFsc2UsIGZhbHNlKTsKLQkJCXJldHVybiBQUk9DRVNTX1NLSVA7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB2aXNpdG9yKElBU1RFeHByZXNzaW9uIGV4cHIsIGJvb2xlYW4gaW5EZXJlZiwgYm9vbGVhbiBpbkFkZHIpewotCQkJaWYoZXhwciBpbnN0YW5jZW9mIElBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24pewotCQkJCUlBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24gYXJyYXlFID0gKElBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24pZXhwcjsKLQkJCQl2aXNpdG9yKGFycmF5RS5nZXRBcnJheUV4cHJlc3Npb24oKSwgaW5EZXJlZiwgaW5BZGRyKTsKLQkJCQl2aXNpdG9yKGFycmF5RS5nZXRTdWJzY3JpcHRFeHByZXNzaW9uKCksIGZhbHNlLCBmYWxzZSk7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQmluYXJ5RXhwcmVzc2lvbil7Ci0JCQkJSUFTVEJpbmFyeUV4cHJlc3Npb24gYmlFID0gKElBU1RCaW5hcnlFeHByZXNzaW9uKWV4cHI7Ci0JCQkJdmlzaXRvcihiaUUuZ2V0T3BlcmFuZDEoKSwgaW5EZXJlZiwgaW5BZGRyKTsKLQkJCQl2aXNpdG9yKGJpRS5nZXRPcGVyYW5kMigpLCBpbkRlcmVmLCBpbkFkZHIpOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbil7Ci0JCQkJSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kRSA9IChJQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uKWV4cHI7Ci0JCQkJdmlzaXRvcihjb25kRS5nZXRMb2dpY2FsQ29uZGl0aW9uRXhwcmVzc2lvbigpLCBpbkRlcmVmLCBpbkFkZHIpOwotCQkJCXZpc2l0b3IoY29uZEUuZ2V0UG9zaXRpdmVSZXN1bHRFeHByZXNzaW9uKCksIGluRGVyZWYsIGluQWRkcik7Ci0JCQkJdmlzaXRvcihjb25kRS5nZXROZWdhdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgaW5EZXJlZiwgaW5BZGRyKTsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RFeHByZXNzaW9uTGlzdCl7Ci0JCQkJSUFTVEV4cHJlc3Npb25MaXN0IGxpc3RFID0gKElBU1RFeHByZXNzaW9uTGlzdClleHByOwotCQkJCUlBU1RFeHByZXNzaW9uW10gZXhwcnMgPSBsaXN0RS5nZXRFeHByZXNzaW9ucygpOwotCQkJCWZvcihpbnQgaT0wOyBpPGV4cHJzLmxlbmd0aDsgaSsrKXsKLQkJCQkJdmlzaXRvcihleHByc1tpXSwgaW5EZXJlZiwgaW5BZGRyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURmllbGRSZWZlcmVuY2UpewotCQkJCUlBU1RGaWVsZFJlZmVyZW5jZSBmciA9IChJQVNURmllbGRSZWZlcmVuY2UpZXhwcjsKLQkJCQl2aXNpdG9yKGZyLmdldEZpZWxkT3duZXIoKSwgaW5EZXJlZiwgaW5BZGRyKTsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jRSA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByOwotCQkJCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZnVuY0UuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQlJQ2FsbEdyYXBoTm9kZSBuID0gY2dfLmdldE5vZGUoY3VycmVudE5vZGVfLmdldEZpbGVOYW1lKCksIHNpZ25hdHVyZSk7Ci0JCQkJaWYobiAhPSBudWxsKSByZXR1cm47Ci0JCQkJdmlzaXRvcihmdW5jRS5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCksIGZhbHNlLCBmYWxzZSk7Ci0JCQkJdmlzaXRvcihmdW5jRS5nZXRQYXJhbWV0ZXJFeHByZXNzaW9uKCksIGluRGVyZWYsIGluQWRkcik7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUSWRFeHByZXNzaW9uKXsKLQkJCQlJQVNUSWRFeHByZXNzaW9uIElEID0gKElBU1RJZEV4cHJlc3Npb24pZXhwcjsKLQkJCQlTdHJpbmcgdmFyID0gSUQuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYoaW5EZXJlZil7Ci0JCQkJCWlmKCFkZXJlZl8uY29udGFpbnModmFyKSkgCi0JCQkJCQlkZXJlZl8uYWRkKHZhcik7Ci0JCQkJfSAKLQkJCQlpZihpbkFkZHIpewotCQkJCQlpZighYWRkcl8uY29udGFpbnModmFyKSkKLQkJCQkJCWFkZHJfLmFkZCh2YXIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RVbmFyeUV4cHJlc3Npb24pewotCQkJCUlBU1RVbmFyeUV4cHJlc3Npb24gdUUgPSAoSUFTVFVuYXJ5RXhwcmVzc2lvbilleHByOwotCQkJCWludCBvcCA9IHVFLmdldE9wZXJhdG9yKCk7Ci0JCQkJYm9vbGVhbiBhZGRyZmxhZyA9IGluQWRkcjsKLQkJCQlib29sZWFuIGRlcmVmZmxhZyA9IGluRGVyZWY7Ci0JCQkJaWYob3AgPT0gSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9hbXBlcil7IC8vICZFCi0JCQkJCWFkZHJmbGFnID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYob3AgPT0gSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9zdGFyKXsgLy8gKkUKLQkJCQkJZGVyZWZmbGFnID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJdmlzaXRvcih1RS5nZXRPcGVyYW5kKCksIGFkZHJmbGFnLCBkZXJlZmZsYWcpOwotCQkJfQotCQl9Ci0JfQotCQotCWNsYXNzIEZ1bmNQYXJhbU1WQ2hlY2tlciBleHRlbmRzIEFTVFZpc2l0b3J7Ci0JCXByb3RlY3RlZCBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnROb2RlXzsKLQkJcHJvdGVjdGVkIE1QSUJsb2NrIGJsb2NrXzsKLQkJcHJvdGVjdGVkIE1QSUNhbGxHcmFwaE5vZGUgZnVuYzsKLQkJCi0JCXB1YmxpYyBGdW5jUGFyYW1NVkNoZWNrZXIoTVBJQ2FsbEdyYXBoTm9kZSBmdW5jLCBNUElCbG9jayBibG9jayl7Ci0JCQljdXJyZW50Tm9kZV8gPSBmdW5jOwotCQkJYmxvY2tfID0gYmxvY2s7Ci0JCQlmdW5jID0gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJCi0JCQlJQVNUTm9kZSBjb250ZW50ID0gYmxvY2tfLmdldENvbnRlbnQoKTsKLQkJCWlmKGNvbnRlbnQgIT0gbnVsbCkgCi0JCQkJY29udGVudC5hY2NlcHQodGhpcyk7Ci0JCX0KLQkKLQkJcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByKXsKLQkJCWlmKGV4cHIgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbil7Ci0JCQkJSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZnVuY0V4cHIgPSAoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pZXhwcjsKLQkJCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmNFeHByLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQkJZnVuYyA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnROb2RlXy5nZXRGaWxlTmFtZSgpLCBzaWduYXR1cmUpOwotCQkJCWlmKGZ1bmMgIT0gbnVsbCl7Ci0JCQkJCUlBU1RFeHByZXNzaW9uIHBhcmFtZXRlciA9IGZ1bmNFeHByLmdldFBhcmFtZXRlckV4cHJlc3Npb24oKTsKLQkJCQkJaWYocGFyYW1ldGVyIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCQkJCUlBU1RFeHByZXNzaW9uTGlzdCBwYXJhbUxpc3RFID0gKElBU1RFeHByZXNzaW9uTGlzdClwYXJhbWV0ZXI7Ci0JCQkJCQlJQVNURXhwcmVzc2lvbltdIHBhcmFtcyA9IHBhcmFtTGlzdEUuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJCQkJCWZvcihpbnQgaT0wOyBpPHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQkJCQkJRXhwck1WQW5hbHl6ZXIgZW1hID0gbmV3IEV4cHJNVkFuYWx5emVyKHBhcmFtc1tpXSwgCi0JCQkJCQkJCQlibG9ja18uZ2V0TVZ2YXIoKSwgYmxvY2tfKTsKLQkJCQkJCQllbWEucnVuKCk7Ci0JCQkJCQkJaWYoZW1hLmlzTVYoKSl7Ci0JCQkJCQkJCVN0cmluZyBwYXJhbU5hbWUgPSBnZXRGb3JtYWxQYXJhbU5hbWUoZnVuYywgaSk7Ci0JCQkJCQkJCWlmKHBhcmFtTmFtZSAhPSBudWxsKQotCQkJCQkJCQkJZnVuYy5nZXRQYXJhbU1WKCkucHV0KHBhcmFtTmFtZSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmKHBhcmFtZXRlciAhPSBudWxsKXsKLQkJCQkJCUV4cHJNVkFuYWx5emVyIGVtYSA9IG5ldyBFeHByTVZBbmFseXplcihwYXJhbWV0ZXIsIAotCQkJCQkJCQlibG9ja18uZ2V0TVZ2YXIoKSwgYmxvY2tfKTsKLQkJCQkJCWVtYS5ydW4oKTsKLQkJCQkJCWlmKGVtYS5pc01WKCkpewotCQkJCQkJCVN0cmluZyBwYXJhbU5hbWUgPSBnZXRGb3JtYWxQYXJhbU5hbWUoZnVuYywgMCk7Ci0JCQkJCQkJaWYocGFyYW1OYW1lICE9IG51bGwpCi0JCQkJCQkJCWZ1bmMuZ2V0UGFyYW1NVigpLnB1dChwYXJhbU5hbWUsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGxlYXZlKElBU1RFeHByZXNzaW9uIGV4cHIpewotCQkJaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jRXhwciA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByOwotCQkJCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZnVuY0V4cHIuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQlpZihjZ18uZ2V0Tm9kZShjdXJyZW50Tm9kZV8uZ2V0RmlsZU5hbWUoKSwgc2lnbmF0dXJlKSA9PSBmdW5jKXsKLQkJCQkJZnVuYyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQl9Ci0JCi0JLyoqIERldGVybWluZSB3aGV0aGVyIGFuICJFWFBSRVNTSU9OIiBpcyBtdWx0aS12YWx1ZWQgKi8KLQlwcml2YXRlIHZvaWQgZXhwck1WQW5hbHlzaXMoKXsKLQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJTVBJQ2FsbEdyYXBoTm9kZSBub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpbjsKLQkJCWlmKCFub2RlLm1hcmtlZCkgY29udGludWU7Ci0JCQlJQ29udHJvbEZsb3dHcmFwaCBjZmcgPSBub2RlLmdldENGRygpOwotCQkJZm9yKElCbG9jayBiID0gY2ZnLmdldEVudHJ5KCk7IGIgIT0gbnVsbDsgYiA9IGIudG9wTmV4dCgpKXsKLQkJCQlNUElCbG9jayBibG9jayA9IChNUElCbG9jayliOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJCbG9jayAiICsgYmxvY2suZ2V0SUQoKSk7Ci0JCQkJRXhwck1WQW5hbHl6ZXIgRUEgPSBuZXcgRXhwck1WQW5hbHl6ZXIoYmxvY2suZ2V0Q29udGVudCgpLCBibG9jay5nZXRNVnZhcigpLCBibG9jayk7Ci0JCQkJRUEucnVuKCk7Ci0JCQkJYmxvY2suc2V0TVYoRUEuaXNNVigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJUmVzb3VyY2VDb2xsZWN0b3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJUmVzb3VyY2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3OTM5MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSVJlc291cmNlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQb2ludGVyT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5pbXBsLlJlc291cmNlQ29sbGVjdG9yOwotCi0vKioKLSAqIFJlc291cmNlIGNvbGxlY3Rpb24gZnVuY3Rpb25zIHNwZWNpZmljIGZvciBNUEkgYW5hbHlzaXMKLSAqIEBhdXRob3IgWXVhbiBaaGFuZywgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSVJlc291cmNlQ29sbGVjdG9yIGV4dGVuZHMgUmVzb3VyY2VDb2xsZWN0b3J7Ci0KLQlwdWJsaWMgTVBJUmVzb3VyY2VDb2xsZWN0b3IoSUNhbGxHcmFwaCBjZywgSUZpbGUgZmlsZSl7Ci0JCXN1cGVyKGNnLCBmaWxlKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzcGVjaWZpYyBraW5kIG9mIGNhbGwgZ3JhcGggbm9kZSAsIHRoZSBNUElDYWxsR3JhcGhOb2RlCi0JICogCi0JICogQHJldHVybiBjYWxsIGdyYXBoIG5vZGUgY3JlYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2FsbEdyYXBoTm9kZSBhZGRDYWxsR3JhcGhOb2RlKElGaWxlIGZpbGUsIFN0cmluZyBmaWxlbmFtZSwKLQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmQpIHsKLQkJSUNhbGxHcmFwaE5vZGUgY2dub2RlID0gbmV3IE1QSUNhbGxHcmFwaE5vZGUoZmlsZSwgZmlsZW5hbWUsIGZkKTsKLQkJcmV0dXJuIGNnbm9kZTsKLQl9Ci0JLyoqIAotCSAqIGV4dHJhIG9wdGlvbmFsIHRlc3QgdGhhdCBkZXJpdmVkIGNsYXNzIGNhbiBkbwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRvUXVpY2tPcHRpb25hbFRlc3QoU3RyaW5nIHZhcil7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFyLnN0YXJ0c1dpdGgoIk1QSV8iKSB8fCB2YXIuc3RhcnRzV2l0aCgiUE1QSV8iKSB8fAotCQkJdmFyLnN0YXJ0c1dpdGgoIk1QSU9fIikgfHwgdmFyLnN0YXJ0c1dpdGgoIlBNUElPXyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCSB9Ci0JIHByb3RlY3RlZCB2b2lkIGRvT3RoZXJEZWNsYXJhdG9yU3R1ZmYoSUFTVERlY2xhcmF0b3IgZGVjbGFyYXRvcikgewotCQlJQVNUUG9pbnRlck9wZXJhdG9yW10gcG9wcyA9IGRlY2xhcmF0b3IuZ2V0UG9pbnRlck9wZXJhdG9ycygpOwotCQlpZiAocG9wcyAhPSBJQVNUUG9pbnRlck9wZXJhdG9yLkVNUFRZX0FSUkFZKQotCQkJKChNUElDYWxsR3JhcGgpIENHXykuZ2V0R1ZQb2ludGVyKCkuYWRkKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJZWxzZQotCQkJKChNUElDYWxsR3JhcGgpIENHXykuZ2V0R1ZQb2ludGVyKCkuYWRkKG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSVNTQS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9NUElTU0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkOTdjYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSVNTQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REb1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFdoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDb250cm9sRmxvd0dyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQmxvY2s7Ci0KLXB1YmxpYyBjbGFzcyBNUElTU0EgewotCXByb3RlY3RlZCBJQ2FsbEdyYXBoIGNnXzsKLQlwcm90ZWN0ZWQgTVBJQ2FsbEdyYXBoTm9kZSBjdXJyZW50RnVuY187Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsTGlzdDxJQmxvY2s+PiBkZWZUYWJsZV87Ci0JcHJvdGVjdGVkIElDb250cm9sRmxvd0dyYXBoIGNmZ187Ci0JCi0JcHVibGljIE1QSVNTQShJQ2FsbEdyYXBoIGNnKXsKLQkJY2dfID0gY2c7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlmb3IoSUNhbGxHcmFwaE5vZGUgbiA9IGNnXy5ib3RFbnRyeSgpOyBuICE9IG51bGw7IG4gPSBuLmJvdE5leHQoKSl7Ci0JCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSluOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obm9kZS5nZXRGdW5jTmFtZSgpKTsKLQkJCWlmKCFub2RlLm1hcmtlZCkgY29udGludWU7Ci0JCQljdXJyZW50RnVuY18gPSBub2RlOwotCQkJY2ZnXyA9IG5vZGUuZ2V0Q0ZHKCk7Ci0JCQlkZWZUYWJsZV8gPSBub2RlLmdldERlZlRhYmxlKCk7Ci0JCQlkb21Gcm9udGllcigpOwotCQkJcGxhY2VQSEkoKTsKLQkJCUV4aXRCbG9ja1BoaSBlYnAgPSBuZXcgRXhpdEJsb2NrUGhpKCk7Ci0JCQllYnAucnVuKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9tRnJvbnRpZXIoKXsKLQkJZm9yKElCbG9jayBieCA9IGNmZ18uZ2V0RW50cnkoKTsgYnggIT0gbnVsbDsgYnggPSBieC50b3BOZXh0KCkpewotCQkJTVBJQmxvY2sgeCA9IChNUElCbG9jaylieDsKLQkJCUxpc3Q8SUJsb2NrPiBERiA9IG5ldyBBcnJheUxpc3Q8SUJsb2NrPigpOwotCQkJZm9yKElCbG9jayBieSA9IGNmZ18uZ2V0RW50cnkoKTsgYnkgIT0gbnVsbDsgYnkgPSBieS50b3BOZXh0KCkpewotCQkJCU1QSUJsb2NrIHkgPSAoTVBJQmxvY2spYnk7Ci0JCQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IHkuZ2V0UHJlZHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQlNUElCbG9jayBwcmVkID0gKE1QSUJsb2NrKWkubmV4dCgpOwotCQkJCQlpZihwcmVkLmdldERPTSgpLmNvbnRhaW5zKHgpICYmICEoeS5nZXRET00oKS5jb250YWlucyh4KSAmJiB4ICE9IHkpKXsKLQkJCQkJCWlmKCFERi5jb250YWlucyh5KSkgREYuYWRkKHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJeC5zZXRERihERik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcGxhY2VQSEkoKXsKLQkJaW50IGl0ZXJDb3VudCA9IDA7Ci0JCWZvcihJQmxvY2sgYiA9IGNmZ18uZ2V0RW50cnkoKTsgYiAhPSBudWxsOyBiID0gYi50b3BOZXh0KCkpewotCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCWJsb2NrLmhhc0FscmVhZHkgPSAwOwotCQkJYmxvY2sud29yayA9IDA7Ci0JCX0KLQkJTGlua2VkTGlzdDxJQmxvY2s+IFcgPSBuZXcgTGlua2VkTGlzdDxJQmxvY2s+KCk7Ci0JCWZvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBkZWZUYWJsZV8ua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlTdHJpbmcgdmFyID0gZS5uZXh0RWxlbWVudCgpOwotCQkJaXRlckNvdW50ICsrOwotCQkJTGlzdDxJQmxvY2s+IGRlZnMgPSBkZWZUYWJsZV8uZ2V0KHZhcik7Ci0JCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gZGVmcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCU1QSUJsb2NrIGRlZmJsb2NrID0gKE1QSUJsb2NrKWkubmV4dCgpOwotCQkJCWRlZmJsb2NrLndvcmsgPSBpdGVyQ291bnQ7Ci0JCQkJVy5hZGQoZGVmYmxvY2spOwotCQkJfQotCQkJd2hpbGUoIVcuaXNFbXB0eSgpKXsKLQkJCQlNUElCbG9jayBuZXh0ID0gKE1QSUJsb2NrKVcucmVtb3ZlKCk7Ci0JCQkJZm9yKEl0ZXJhdG9yPElCbG9jaz4gaSA9IG5leHQuZ2V0REYoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQlNUElCbG9jayBkZiA9IChNUElCbG9jaylpLm5leHQoKTsKLQkJCQkJaWYoZGYuaGFzQWxyZWFkeSA8IGl0ZXJDb3VudCl7Ci0JCQkJCQlpZihkZi5nZXRDb25kKCkgPT0gbnVsbCAmJiBkZiAhPSBjZmdfLmdldEV4aXQoKSl7IAotCQkJCQkJCS8vbm8gYXNzb2NpYXRlZCBjb25kaXRpb24/Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogcGhpIE5vZGUgaGFzIG5vIGNvbmRpdGlvbiEiICsgCi0JCQkJCQkJCQljdXJyZW50RnVuY18uZ2V0RnVuY05hbWUoKSArICIgQmxvY2sgIiArIGRmLmdldElEKCkpOwotCQkJCQkJCS8vcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZGYuc2V0UGhpKCk7Ci0JCQkJCQlpZighZGYuZ2V0RGVmKCkuY29udGFpbnModmFyKSkgZGYuZ2V0RGVmKCkuYWRkKHZhcik7Ci0JCQkJCQkvL2lmKCFkZi5nZXRVc2UoKS5jb250YWlucyh2YXIpKSBkZi5nZXRVc2UoKS5hZGQodmFyKTsKLQkJCQkJCWlmKGRmLmdldFVzZSgpLmNvbnRhaW5zKHZhcikgJiYgIWRmLmdldFVzZWRQaGlWYXIoKS5jb250YWlucyh2YXIpKQotCQkJCQkJCWRmLmdldFVzZWRQaGlWYXIoKS5hZGQodmFyKTsKLQkJCQkJCWlmKCFkZi5nZXRQaGlWYXIoKS5jb250YWlucyh2YXIpKSBkZi5nZXRQaGlWYXIoKS5hZGQodmFyKTsKLQkJCQkJCWlmKCFkZWZzLmNvbnRhaW5zKGRmKSkgZGVmcy5hZGQoZGYpOwotCQkJCQkJdXBkYXRlRGVmVGFibGUoZGYsIHZhcik7Ci0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQmxvY2sgIiArIGRmLmdldElEKCkgKyAiIGhhcyBQaGkgZm9yICIgKyB2YXIpOwotCQkJCQkJZGYuaGFzQWxyZWFkeSA9IGl0ZXJDb3VudDsKLQkJCQkJCWlmKGRmLndvcmsgPCBpdGVyQ291bnQpewotCQkJCQkJCWRmLndvcmsgPSBpdGVyQ291bnQ7Ci0JCQkJCQkJVy5hZGQoZGYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZvcihJQmxvY2sgYiA9IGNmZ18uZ2V0RW50cnkoKTsgYiAhPSBudWxsOyBiID0gYi50b3BOZXh0KCkpewotCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCWlmKGJsb2NrLmhhc1BoaSgpKQotCQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSBibG9jay5nZXRQaGlWYXIoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQlTdHJpbmcgdmFyID0gaS5uZXh0KCk7Ci0JCQkJCWlmKCFibG9jay5nZXRVc2UoKS5jb250YWlucyh2YXIpKQotCQkJCQkJYmxvY2suZ2V0VXNlKCkuYWRkKHZhcik7Ci0JCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZlRhYmxlKElCbG9jayBibG9jaywgU3RyaW5nIHZhcil7Ci0JCUxpc3Q8SUJsb2NrPiBsaXN0ID0gZGVmVGFibGVfLmdldCh2YXIpOwotCQlpZihsaXN0ID09IG51bGwpewotCQkJU3lzdGVtLm91dC5wcmludCgiRXJyb3IgaW4gU1NBISIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKCFsaXN0LmNvbnRhaW5zKGJsb2NrKSkKLQkJCWxpc3QuYWRkKGJsb2NrKTsKLQl9Ci0JCi0JY2xhc3MgRXhpdEJsb2NrUGhpIGV4dGVuZHMgQVNUVmlzaXRvcnsKLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQljdXJyZW50RnVuY18uZ2V0RnVuY0RlZigpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0bXQpewotCQkJTVBJQmxvY2sgY29uZGJsb2NrID0gbnVsbDsKLQkJCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQpewotCQkJCUlBU1REb1N0YXRlbWVudCBkb1MgPSAoSUFTVERvU3RhdGVtZW50KXN0bXQ7Ci0JCQkJY29uZGJsb2NrID0gKE1QSUJsb2NrKWNmZ18uZ2V0QmxvY2soZG9TLmdldENvbmRpdGlvbigpLCBzdG10KTsKLQkJCX0KLQkJCWVsc2UgaWYoc3RtdCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpewotCQkJCUlBU1RGb3JTdGF0ZW1lbnQgZm9yUyA9IChJQVNURm9yU3RhdGVtZW50KXN0bXQ7Ci0JCQkJY29uZGJsb2NrID0gKE1QSUJsb2NrKWNmZ18uZ2V0QmxvY2soZm9yUy5nZXRDb25kaXRpb25FeHByZXNzaW9uKCksIHN0bXQpOwotCQkJfQotCQkJZWxzZSBpZihzdG10IGluc3RhbmNlb2YgSUFTVFdoaWxlU3RhdGVtZW50KXsKLQkJCQlJQVNUV2hpbGVTdGF0ZW1lbnQgd2hpbGVTID0gKElBU1RXaGlsZVN0YXRlbWVudClzdG10OwotCQkJCWNvbmRibG9jayA9IChNUElCbG9jayljZmdfLmdldEJsb2NrKHdoaWxlUy5nZXRDb25kaXRpb24oKSwgc3RtdCk7Ci0JCQl9IAotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCQl9Ci0JCQkKLQkJCU1QSUJsb2NrIGV4aXRibG9jayA9IG51bGw7Ci0JCQlmb3IoSXRlcmF0b3I8SUJsb2NrPiBpID0gY29uZGJsb2NrLmdldFN1Y2NzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlNUElCbG9jayBzdWNjID0gKE1QSUJsb2NrKWkubmV4dCgpOwotCQkJCWlmKHN1Y2MuZ2V0VHlwZSgpID09IEJsb2NrLmV4aXRfam9pbl90eXBlKQotCQkJCQlleGl0YmxvY2sgPSBzdWNjOwotCQkJfQotCQkJCi0JCQlleGl0YmxvY2suc2V0UGhpKCk7Ci0JCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gY29uZGJsb2NrLmdldFBoaVZhcigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJU3RyaW5nIHBoaXZhciA9IGkubmV4dCgpOwotCQkJCWlmKCFleGl0YmxvY2suZ2V0RGVmKCkuY29udGFpbnMocGhpdmFyKSkKLQkJCQkJZXhpdGJsb2NrLmdldERlZigpLmFkZChwaGl2YXIpOwotCQkJCWlmKCFleGl0YmxvY2suZ2V0VXNlKCkuY29udGFpbnMocGhpdmFyKSkKLQkJCQkJZXhpdGJsb2NrLmdldFVzZSgpLmFkZChwaGl2YXIpOwotCQkJCWlmKCFleGl0YmxvY2suZ2V0UGhpVmFyKCkuY29udGFpbnMocGhpdmFyKSkKLQkJCQkJZXhpdGJsb2NrLmdldFBoaVZhcigpLmFkZChwaGl2YXIpOwotCQkJCXVwZGF0ZURlZlRhYmxlKGV4aXRibG9jaywgcGhpdmFyKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJU2luZ2xlQXNzaWduQW5hbHlzaXMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvTVBJU2luZ2xlQXNzaWduQW5hbHlzaXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjNTZhMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL01QSVNpbmdsZUFzc2lnbkFuYWx5c2lzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuYy5JQ0FTVERlc2lnbmF0ZWRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LmdudS5jLklDQVNUS25SRnVuY3Rpb25EZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNvbnRyb2xGbG93R3JhcGg7Ci0KLXB1YmxpYyBjbGFzcyBNUElTaW5nbGVBc3NpZ25BbmFseXNpcyB7Ci0JcHJvdGVjdGVkIElDYWxsR3JhcGggY2dfOwotCXByb3RlY3RlZCBJQ29udHJvbEZsb3dHcmFwaCBjZmdfOwotCXByb3RlY3RlZCBNUElDYWxsR3JhcGhOb2RlIGN1cnJlbnROb2RlXzsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZyxJbnRlZ2VyPiBhc3NpZ25OdW1fOwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLEJvb2xlYW4+IHR5cGVfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbj1mYWxzZTsKLQkKLQlwdWJsaWMgTVBJU2luZ2xlQXNzaWduQW5hbHlzaXMoSUNhbGxHcmFwaCBjZyl7Ci0JCWNnXyA9IGNnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJTVBJQ2FsbEdyYXBoTm9kZSBjdXJyZW50Tm9kZV8gPSAoTVBJQ2FsbEdyYXBoTm9kZSluOwotCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oY3VycmVudE5vZGVfLmdldEZ1bmNOYW1lKCkpOwotCQkJY2ZnXyA9IGN1cnJlbnROb2RlXy5nZXRDRkcoKTsKLQkJCWFzc2lnbk51bV8gPSBjdXJyZW50Tm9kZV8uZ2V0U0FWYXIoKTsKLQkJCXR5cGVfID0gY3VycmVudE5vZGVfLmdldFNBVmFyUG9pbnRlcigpOwotCQkJZGF0YUNvbGxlY3RvciBkYyA9IG5ldyBkYXRhQ29sbGVjdG9yKCk7Ci0JCQlkYy5ydW4oKTsKLQkJCVNpbmdsZUFzc2lnbkFuYWx5emVyIHNhYSA9IG5ldyBTaW5nbGVBc3NpZ25BbmFseXplcigpOwotCQkJc2FhLnJ1bigpOwotCQkJCi0JCQlmb3IoRW51bWVyYXRpb248U3RyaW5nPiBlID0gY3VycmVudE5vZGVfLmdldFNBVmFyKCkua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQkJU3RyaW5nIHZhciA9IGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbih2YXIgKyAiIGlzIGRlZmluZWQgIiArIGN1cnJlbnROb2RlXy5nZXRTQVZhcigpLmdldCh2YXIpLmludFZhbHVlKCkgKyAiIHRpbWVzIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgZGF0YUNvbGxlY3RvciBleHRlbmRzIEFTVFZpc2l0b3J7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQkvKiBnbG9iYWwgdmFyaWFibGVzICovCi0JCQlmb3IoaW50IGk9MDsgaTxjZ18uZ2V0RW52KCkuc2l6ZSgpOyBpKyspewotCQkJCVN0cmluZyB2YXIgPSBjZ18uZ2V0RW52KCkuZ2V0KGkpOwotCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIoMCkpOwotCQkJCXR5cGVfLnB1dCh2YXIsICgoTVBJQ2FsbEdyYXBoKWNnXykuZ2V0R1ZQb2ludGVyKCkuZ2V0KGkpKTsKLQkJCX0KLQkJCS8qIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLQkJCUxpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlMaXN0PEJvb2xlYW4+IHBvaW50ZXJzID0gbmV3IEFycmF5TGlzdDxCb29sZWFuPigpOwotCQkJZ2V0UGFyYW1ldGVycyhjdXJyZW50Tm9kZV8uZ2V0RnVuY0RlZigpLCBwYXJhbWV0ZXJzLCBwb2ludGVycyk7Ci0JCQlmb3IoaW50IGk9MDsgaTxwYXJhbWV0ZXJzLnNpemUoKTsgaSsrKXsKLQkJCQlTdHJpbmcgdmFyID0gcGFyYW1ldGVycy5nZXQoaSk7Ci0JCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQkJdHlwZV8ucHV0KHZhciwgcG9pbnRlcnMuZ2V0KGkpKTsKLQkJCX0KLQkJCS8qIGxvY2FsIHZhcmlhYmxlcyAqLwotCQkJY3VycmVudE5vZGVfLmdldEZ1bmNEZWYoKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGdldFBhcmFtZXRlcnMoSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBmZCwKLQkJCQlMaXN0PFN0cmluZz4gcGFyYW1MaXN0LCBMaXN0PEJvb2xlYW4+IHBvaW50ZXJMaXN0KXsKLQkJCUlBU1RGdW5jdGlvbkRlY2xhcmF0b3IgZmRlY2wgPSBmZC5nZXREZWNsYXJhdG9yKCk7Ci0JCQlpZihmZGVjbCBpbnN0YW5jZW9mIElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcil7Ci0JCQkJSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIHNmdW5jID0gKElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCQlJQVNUUGFyYW1ldGVyRGVjbGFyYXRpb25bXSBwYXJhbXMgPSBzZnVuYy5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJZm9yKGludCBpPTA7IGk8cGFyYW1zLmxlbmd0aDsgaSsrKXsKLQkJCQkJcGFyYW1MaXN0LmFkZChwYXJhbXNbaV0uZ2V0RGVjbGFyYXRvcigpLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJCQkJSUFTVFBvaW50ZXJPcGVyYXRvcltdIHBvcHMgPSBwYXJhbXNbaV0uZ2V0RGVjbGFyYXRvcigpLmdldFBvaW50ZXJPcGVyYXRvcnMoKTsKLQkJCQkJaWYocG9wcyAhPSBJQVNUUG9pbnRlck9wZXJhdG9yLkVNUFRZX0FSUkFZKQotCQkJCQkJcG9pbnRlckxpc3QuYWRkKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQkJZWxzZQotCQkJCQkJcG9pbnRlckxpc3QuYWRkKG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvciBrcmZ1bmMgPSAoSUNBU1RLblJGdW5jdGlvbkRlY2xhcmF0b3IpZmRlY2w7Ci0JCQkJSUFTVE5hbWVbXSBwYXJhbXMgPSBrcmZ1bmMuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJCQlmb3IoaW50IGk9MDsgaTxwYXJhbXMubGVuZ3RoOyBpKyspewotCQkJCQlwYXJhbUxpc3QuYWRkKHBhcmFtc1tpXS50b1N0cmluZygpKTsKLQkJCQkJSUFTVERlY2xhcmF0b3IgZGVjbCA9IGtyZnVuYy5nZXREZWNsYXJhdG9yRm9yUGFyYW1ldGVyTmFtZShwYXJhbXNbaV0pOwotCQkJCQlpZihkZWNsLmdldFBvaW50ZXJPcGVyYXRvcnMoKSAhPSBJQVNUUG9pbnRlck9wZXJhdG9yLkVNUFRZX0FSUkFZKQotCQkJCQkJcG9pbnRlckxpc3QuYWRkKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQkJZWxzZQotCQkJCQkJcG9pbnRlckxpc3QuYWRkKG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCQlpZihzdG10IGluc3RhbmNlb2YgSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50KXsKLQkJCQlJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQgZGVjbFN0bXQgPSAoSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50KXN0bXQ7Ci0JCQkJSUFTVERlY2xhcmF0aW9uIGRlY2wgPSBkZWNsU3RtdC5nZXREZWNsYXJhdGlvbigpOwotCQkJCWlmKGRlY2wgaW5zdGFuY2VvZiBJQVNUU2ltcGxlRGVjbGFyYXRpb24pewotCQkJCQlJQVNUU2ltcGxlRGVjbGFyYXRpb24gc2ltcGxlRGVjbCA9IChJQVNUU2ltcGxlRGVjbGFyYXRpb24pZGVjbDsKLQkJCQkJSUFTVERlY2xhcmF0b3JbXSBkZWNsYXJhdG9ycyA9IHNpbXBsZURlY2wuZ2V0RGVjbGFyYXRvcnMoKTsKLQkJCQkJZm9yKGludCBpPTA7IGk8ZGVjbGFyYXRvcnMubGVuZ3RoOyBpKyspewotCQkJCQkJU3RyaW5nIHZhciA9IGRlY2xhcmF0b3JzW2ldLmdldE5hbWUoKS50b1N0cmluZygpOwotCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQkJCQlpZihkZWNsYXJhdG9yc1tpXS5nZXRQb2ludGVyT3BlcmF0b3JzKCkgIT0gSUFTVFBvaW50ZXJPcGVyYXRvci5FTVBUWV9BUlJBWSkKLQkJCQkJCQl0eXBlXy5wdXQodmFyLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdHlwZV8ucHV0KHZhciwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gUFJPQ0VTU19TS0lQOwotCQkJfQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgU2luZ2xlQXNzaWduQW5hbHl6ZXIgZXh0ZW5kcyBBU1RWaXNpdG9yewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdG10KXsKLQkJCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpewotCQkJCUlBU1REZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsU3RtdCA9IChJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpc3RtdDsKLQkJCQlJQVNURGVjbGFyYXRpb24gZGVjbCA9IGRlY2xTdG10LmdldERlY2xhcmF0aW9uKCk7Ci0JCQkJaWYoZGVjbCBpbnN0YW5jZW9mIElBU1RTaW1wbGVEZWNsYXJhdGlvbil7Ci0JCQkJCUlBU1RTaW1wbGVEZWNsYXJhdGlvbiBzaW1wbGVEZWNsID0gKElBU1RTaW1wbGVEZWNsYXJhdGlvbilkZWNsOwotCQkJCQlJQVNURGVjbGFyYXRvcltdIGRlY2xhcmF0b3JzID0gc2ltcGxlRGVjbC5nZXREZWNsYXJhdG9ycygpOwotCQkJCQlmb3IoaW50IGk9MDsgaTxkZWNsYXJhdG9ycy5sZW5ndGg7IGkrKyl7Ci0JCQkJCQlJQVNUTmFtZSBuYW1lID0gZGVjbGFyYXRvcnNbaV0uZ2V0TmFtZSgpOwotCQkJCQkJSUFTVEluaXRpYWxpemVyIGluaXQgPSBkZWNsYXJhdG9yc1tpXS5nZXRJbml0aWFsaXplcigpOwotCQkJCQkJaWYoaW5pdCAhPSBudWxsKXsKLQkJCQkJCQlwcm9jZXNzSW5pdGlhbGl6ZXIoaW5pdCwgbmFtZS50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gUFJPQ0VTU19TS0lQOwotCQkJfQotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbml0aWFsaXplcihJQVNUSW5pdGlhbGl6ZXIgaW5pdCwgU3RyaW5nIHZhcil7Ci0JCQlpZihpbml0ICE9IG51bGwpewotCQkJCWlmKGluaXQgaW5zdGFuY2VvZiBJQVNUSW5pdGlhbGl6ZXJFeHByZXNzaW9uKXsKLQkJCQkJSUFTVEluaXRpYWxpemVyRXhwcmVzc2lvbiBpbml0RSA9IChJQVNUSW5pdGlhbGl6ZXJFeHByZXNzaW9uKWluaXQ7Ci0JCQkJCUlBU1RFeHByZXNzaW9uIGUgPSBpbml0RS5nZXRFeHByZXNzaW9uKCk7Ci0JCQkJCUxpc3Q8U3RyaW5nPiBkZWYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQkJTGlzdDxTdHJpbmc+IHVzZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCQlMaXN0PFN0cmluZz4gbGRmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJCUxpc3Q8U3RyaW5nPiByZGYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQkJYm9vbGVhbiB2YWx1ZSA9IHNhRXhwcihlLCByaHMsIG51bGwsIC0xLCBkZWYsIHVzZSwgbGRmLCByZGYpOwotCQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gdXNlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQlTdHJpbmcgdiA9IGkubmV4dCgpOwotCQkJCQkJaW50IG51bSA9IGFzc2lnbk51bV8uZ2V0KHYpLmludFZhbHVlKCk7Ci0JCQkJCQlib29sZWFuIHBvaW50ZXJUeXBlID0gdHlwZV8uZ2V0KHYpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJaWYocG9pbnRlclR5cGUpIC8vcG9pbnRlcnMgYXJlIHVzZWQgZm9yIG1hdGggb3BlcmF0aW9ucwotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHYsIG5ldyBJbnRlZ2VyKG51bSArIDIpKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIHBvaW50ZXJUeXBlID0gdHlwZV8uZ2V0KHZhcikuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmKHBvaW50ZXJUeXBlKXsKLQkJCQkJCWlmKHZhbHVlKSAvLyBpbml0IGJ5IG1hbGxvYwotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIoMSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIoMikpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcigxKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihpbml0IGluc3RhbmNlb2YgSUFTVEluaXRpYWxpemVyTGlzdCl7Ci0JCQkJCUlBU1RJbml0aWFsaXplckxpc3QgbGlzdCA9IChJQVNUSW5pdGlhbGl6ZXJMaXN0KWluaXQ7Ci0JCQkJCUlBU1RJbml0aWFsaXplcltdIGluaXRzID0gbGlzdC5nZXRJbml0aWFsaXplcnMoKTsKLQkJCQkJZm9yKGludCBqID0gMDsgajxpbml0cy5sZW5ndGg7IGorKyl7Ci0JCQkJCQlwcm9jZXNzSW5pdGlhbGl6ZXIoaW5pdHNbal0sIHZhcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihpbml0IGluc3RhbmNlb2YgSUNBU1REZXNpZ25hdGVkSW5pdGlhbGl6ZXIpewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklDQVNURGVzaWduYXRlZEluaXRpYWxpemVyIGZvdW5kICEiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVEV4cHJlc3Npb24gZXhwcil7Ci0JCQlzYUV4cHIoZXhwciwgcmhzLCBudWxsLCAtMSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIAotCQkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIAotCQkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCQlyZXR1cm4gUFJPQ0VTU19TS0lQOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgZmluYWwgaW50IGxocyA9IDA7Ci0JCXByb3RlY3RlZCBmaW5hbCBpbnQgcmhzID0gMTsKLQkJcHJvdGVjdGVkIGZpbmFsIGludCBsZGVyZWYgPSAyOyAvL2xocyBhbmQgZGVyZWZlcmVuY2UKLQkJcHJvdGVjdGVkIGZpbmFsIGludCByZGVyZWYgPSAzOyAvL3JocyBhbmQgZGVyZWZlcmVuY2UKLQkJCi0JCS8qKiByZXR1cm46IGlzIGEgbWFsbG9jKGNhbGxvYywgcmVhbGxvYykgbWV0PyA8YnI+Ci0JCSAqIFBhcmFtczogZGVmIC0tIHRoZSBzZXQgb2YgZGVmaW5lZCB2YXJpYWJsZXMgPGJyPgotCQkgKiAgICAgICAgIHVzZSAtLSB0aGUgc2V0IG9mIHVzZWQgKG90aGVyIHRoYW4gZGUtcmVmZXJlbmNlZCkgdmFyaWFibGVzIDxicj4KLQkJICogICAgICAgICByZWYgLS0gdGhlIHNldCBvZiBkZS1yZWZlcmVuY2VkIHZhcmlhYmxlcwotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2FFeHByKElBU1RFeHByZXNzaW9uIGV4cHIsIGludCBzaWRlLCAKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jLCBpbnQgaW5kZXgsIAotCQkJCUxpc3Q8U3RyaW5nPiBkZWYsIExpc3Q8U3RyaW5nPiB1c2UsIAotCQkJCUxpc3Q8U3RyaW5nPiBsZGYsIExpc3Q8U3RyaW5nPiByZGYpewotCQkJTGlzdDxTdHJpbmc+IGQxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IAotCQkJTGlzdDxTdHJpbmc+IGQyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlMaXN0PFN0cmluZz4gZDMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUxpc3Q8U3RyaW5nPiB1MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyAKLQkJCUxpc3Q8U3RyaW5nPiB1MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJTGlzdDxTdHJpbmc+IHUzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlMaXN0PFN0cmluZz4gbHIxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IAotCQkJTGlzdDxTdHJpbmc+IGxyMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJTGlzdDxTdHJpbmc+IGxyMyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJTGlzdDxTdHJpbmc+IHJyMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyAKLQkJCUxpc3Q8U3RyaW5nPiBycjIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUxpc3Q8U3RyaW5nPiBycjMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWJvb2xlYW4gdjEgPSBmYWxzZSwgdjIgPSBmYWxzZSwgdjMgPSBmYWxzZTsKLQkJCWlmKGV4cHIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJaWYoZXhwciBpbnN0YW5jZW9mIElBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24pewotCQkJCUlBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24gYXNFID0gKElBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24pZXhwcjsKLQkJCQlpZihzaWRlID09IHJocyB8fCBzaWRlID09IHJkZXJlZil7Ci0JCQkJCXYxID0gc2FFeHByKGFzRS5nZXRBcnJheUV4cHJlc3Npb24oKSwgcmRlcmVmLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCXYyID0gc2FFeHByKGFzRS5nZXRTdWJzY3JpcHRFeHByZXNzaW9uKCksIHJocywgZnVuYywgaW5kZXgsIGQyLCB1MiwgbHIyLCBycjIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXYxID0gc2FFeHByKGFzRS5nZXRBcnJheUV4cHJlc3Npb24oKSwgbGRlcmVmLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCXYyID0gc2FFeHByKGFzRS5nZXRTdWJzY3JpcHRFeHByZXNzaW9uKCksIHJocywgZnVuYywgaW5kZXgsIGQyLCB1MiwgbHIyLCBycjIpOwotCQkJCX0KLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQxKTsKLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQyKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUyKTsKLQkJCQlVdGlsLmFkZEFsbChsZGYsIGxyMSk7Ci0JCQkJVXRpbC5hZGRBbGwobGRmLCBscjIpOwotCQkJCVV0aWwuYWRkQWxsKHJkZiwgcnIxKTsKLQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMik7CQotCQkJCXJldHVybiB2MSB8IHYyOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEJpbmFyeUV4cHJlc3Npb24pewotCQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIGJpRSA9IChJQVNUQmluYXJ5RXhwcmVzc2lvbilleHByOwotCQkJCWludCBvcCA9IGJpRS5nZXRPcGVyYXRvcigpOwotCQkJCWlmKG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2Fzc2lnbil7Ci0JCQkJCXYxID0gc2FFeHByKGJpRS5nZXRPcGVyYW5kMSgpLCBsaHMsIGZ1bmMsIGluZGV4LCBkMSwgdTEsIGxyMSwgcnIxKTsKLQkJCQkJdjIgPSBzYUV4cHIoYmlFLmdldE9wZXJhbmQyKCksIHJocywgZnVuYywgaW5kZXgsIGQyLCB1MiwgbHIyLCBycjIpOwotCQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gZDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJCVN0cmluZyB2YXIgPSBpLm5leHQoKTsKLQkJCQkJCWludCBudW0gPSBhc3NpZ25OdW1fLmdldCh2YXIpLmludFZhbHVlKCk7Ci0JCQkJCQlib29sZWFuIHBvaW50ZXJUeXBlID0gdHlwZV8uZ2V0KHZhcikuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlpZihwb2ludGVyVHlwZSl7Ci0JCQkJCQkJaWYodjIpIC8vIGluaXQgYnkgbWFsbG9jCi0JCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIobnVtICsgMSkpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAyKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIobnVtICsgMSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSB1MS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQkJU3RyaW5nIHZhciA9IGkubmV4dCgpOwotCQkJCQkJaW50IG51bSA9IGFzc2lnbk51bV8uZ2V0KHZhcikuaW50VmFsdWUoKTsKLQkJCQkJCWJvb2xlYW4gcG9pbnRlclR5cGUgPSB0eXBlXy5nZXQodmFyKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCWlmKHBvaW50ZXJUeXBlKSAvL3BvaW50ZXJzIGFyZSB1c2VkIGZvciBtYXRoIG9wZXJhdGlvbnMKLQkJCQkJCQlhc3NpZ25OdW1fLnB1dCh2YXIsIG5ldyBJbnRlZ2VyKG51bSArIDIpKTsKLQkJCQkJfQkKLQkJCQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHUyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQlTdHJpbmcgdmFyID0gaS5uZXh0KCk7Ci0JCQkJCQlpbnQgbnVtID0gYXNzaWduTnVtXy5nZXQodmFyKS5pbnRWYWx1ZSgpOwotCQkJCQkJYm9vbGVhbiBwb2ludGVyVHlwZSA9IHR5cGVfLmdldCh2YXIpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJaWYocG9pbnRlclR5cGUpIC8vcG9pbnRlcnMgYXJlIHVzZWQgZm9yIG1hdGggb3BlcmF0aW9ucwotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIobnVtICsgMikpOwotCQkJCQl9CQotCQkJCX1lbHNlIGlmKCBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9tdWx0aXBseUFzc2lnbiB8fAotCQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2RpdmlkZUFzc2lnbiB8fAotCQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX21vZHVsb0Fzc2lnbiB8fAotCQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX3BsdXNBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9taW51c0Fzc2lnbiB8fAotCQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX3NoaWZ0TGVmdEFzc2lnbiB8fAotCQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX3NoaWZ0UmlnaHRBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9iaW5hcnlBbmRBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9iaW5hcnlYb3JBc3NpZ24gfHwKLQkJCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9iaW5hcnlPckFzc2lnbil7Ci0JCQkJCXYxID0gc2FFeHByKGJpRS5nZXRPcGVyYW5kMSgpLCBsaHMsIGZ1bmMsIGluZGV4LCBkMSwgdTEsIGxyMSwgcnIxKTsKLQkJCQkJdjIgPSBzYUV4cHIoYmlFLmdldE9wZXJhbmQxKCksIHJocywgZnVuYywgaW5kZXgsIGQyLCB1MiwgbHIyLCBycjIpOwotCQkJCQl2MyA9IHNhRXhwcihiaUUuZ2V0T3BlcmFuZDIoKSwgcmhzLCBmdW5jLCBpbmRleCwgZDMsIHUzLCBscjIsIHJyMyk7Ci0JCQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSBkMS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQkJU3RyaW5nIHZhciA9IGkubmV4dCgpOwotCQkJCQkJaW50IG51bSA9IGFzc2lnbk51bV8uZ2V0KHZhcikuaW50VmFsdWUoKTsKLQkJCQkJCWJvb2xlYW4gcG9pbnRlclR5cGUgPSB0eXBlXy5nZXQodmFyKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCWlmKHBvaW50ZXJUeXBlKXsKLQkJCQkJCQlpZih2MikgLy8gaW5pdCBieSBtYWxsb2MKLQkJCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAxKSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlhc3NpZ25OdW1fLnB1dCh2YXIsIG5ldyBJbnRlZ2VyKG51bSArIDIpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAxKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHUyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQlTdHJpbmcgdmFyID0gaS5uZXh0KCk7Ci0JCQkJCQlpbnQgbnVtID0gYXNzaWduTnVtXy5nZXQodmFyKS5pbnRWYWx1ZSgpOwotCQkJCQkJYm9vbGVhbiBwb2ludGVyVHlwZSA9IHR5cGVfLmdldChpbmRleCkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlpZihwb2ludGVyVHlwZSkgLy9wb2ludGVycyBhcmUgdXNlZCBmb3IgbWF0aCBvcGVyYXRpb25zCi0JCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAyKSk7Ci0JCQkJCX0JCi0JCQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSB1My5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQkJU3RyaW5nIHZhciA9IGkubmV4dCgpOwotCQkJCQkJaW50IG51bSA9IGFzc2lnbk51bV8uZ2V0KHZhcikuaW50VmFsdWUoKTsKLQkJCQkJCWJvb2xlYW4gcG9pbnRlclR5cGUgPSB0eXBlXy5nZXQoaW5kZXgpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJaWYocG9pbnRlclR5cGUpIC8vcG9pbnRlcnMgYXJlIHVzZWQgZm9yIG1hdGggb3BlcmF0aW9ucwotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIobnVtICsgMikpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdjEgPSBzYUV4cHIoYmlFLmdldE9wZXJhbmQxKCksIHJocywgZnVuYywgaW5kZXgsIGQxLCB1MSwgbHIxLCBycjEpOwotCQkJCQl2MiA9IHNhRXhwcihiaUUuZ2V0T3BlcmFuZDIoKSwgcmhzLCBmdW5jLCBpbmRleCwgZDIsIHUyLCBscjIsIHJyMik7Ci0JCQkJfQotCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDEpOwotCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDIpOwotCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDMpOwotCQkJCVV0aWwuYWRkQWxsKHVzZSwgdTEpOwotCQkJCVV0aWwuYWRkQWxsKHVzZSwgdTIpOwotCQkJCVV0aWwuYWRkQWxsKHVzZSwgdTMpOwotCQkJCVV0aWwuYWRkQWxsKGxkZiwgbHIxKTsKLQkJCQlVdGlsLmFkZEFsbChsZGYsIGxyMik7Ci0JCQkJVXRpbC5hZGRBbGwobGRmLCBscjMpOwotCQkJCVV0aWwuYWRkQWxsKHJkZiwgcnIxKTsKLQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMik7Ci0JCQkJVXRpbC5hZGRBbGwocmRmLCBycjMpOwotCQkJCXJldHVybiB2MSB8IHYyIHwgdjM7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQ2FzdEV4cHJlc3Npb24pewotCQkJCUlBU1RDYXN0RXhwcmVzc2lvbiBjYXN0RSA9IChJQVNUQ2FzdEV4cHJlc3Npb24pZXhwcjsKLQkJCQl2MSA9IHNhRXhwcihjYXN0RS5nZXRPcGVyYW5kKCksIHNpZGUsIGZ1bmMsIGluZGV4LCBkMSwgdTEsIGxyMSwgcnIxKTsKLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQxKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQlVdGlsLmFkZEFsbChsZGYsIGxyMSk7Ci0JCQkJVXRpbC5hZGRBbGwocmRmLCBycjEpOwotCQkJCXJldHVybiB2MTsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RDb25kaXRpb25hbEV4cHJlc3Npb24pewotCQkJCUlBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZEUgPSAoSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbilleHByOwotCQkJCWlmKHNpZGUgPT0gcmhzIHx8IHNpZGUgPT0gcmRlcmVmKXsKLQkJCQkJdjEgPSBzYUV4cHIoY29uZEUuZ2V0TG9naWNhbENvbmRpdGlvbkV4cHJlc3Npb24oKSwgc2lkZSwgZnVuYywgaW5kZXgsIGQxLCB1MSwgbHIxLCBycjEpOyAKLQkJCQkJdjIgPSBzYUV4cHIoY29uZEUuZ2V0UG9zaXRpdmVSZXN1bHRFeHByZXNzaW9uKCksIHNpZGUsIGZ1bmMsIGluZGV4LCBkMiwgdTIsIGxyMiwgcnIyKTsgCi0JCQkJCXYzID0gc2FFeHByKGNvbmRFLmdldE5lZ2F0aXZlUmVzdWx0RXhwcmVzc2lvbigpLCBzaWRlLCBmdW5jLCBpbmRleCwgZDMsIHUzLCBscjMsIHJyMyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZWcuIHggPiB5ID8geCA6IHkgPSAxCi0JCQkJCWlmKHNpZGUgPT0gbGhzKQotCQkJCQkJdjEgPSBzYUV4cHIoY29uZEUuZ2V0TG9naWNhbENvbmRpdGlvbkV4cHJlc3Npb24oKSwgcmhzLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCWVsc2UgLy8gc2lkZSA9IGxkZXJlZgotCQkJCQkJdjEgPSBzYUV4cHIoY29uZEUuZ2V0TG9naWNhbENvbmRpdGlvbkV4cHJlc3Npb24oKSwgcmRlcmVmLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCXYyID0gc2FFeHByKGNvbmRFLmdldFBvc2l0aXZlUmVzdWx0RXhwcmVzc2lvbigpLCBzaWRlLCBmdW5jLCBpbmRleCwgZDIsIHUyLCBscjIsIHJyMik7IAotCQkJCQl2MyA9IHNhRXhwcihjb25kRS5nZXROZWdhdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgc2lkZSwgZnVuYywgaW5kZXgsIGQzLCB1MywgbHIzLCBycjMpOwotCQkJCX0KLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQxKTsKLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQyKTsKLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQzKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUyKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUzKTsKLQkJCQlVdGlsLmFkZEFsbChsZGYsIGxyMSk7Ci0JCQkJVXRpbC5hZGRBbGwobGRmLCBscjIpOwotCQkJCVV0aWwuYWRkQWxsKGxkZiwgbHIzKTsKLQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMSk7Ci0JCQkJVXRpbC5hZGRBbGwocmRmLCBycjIpOwotCQkJCVV0aWwuYWRkQWxsKHJkZiwgcnIzKTsKLQkJCQlyZXR1cm4gdjEgfCB2MiB8IHYzOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCQlJQVNURXhwcmVzc2lvbkxpc3QgZXhwckxpc3QgPSAoSUFTVEV4cHJlc3Npb25MaXN0KWV4cHI7Ci0JCQkJSUFTVEV4cHJlc3Npb25bXSBleHBycyA9IGV4cHJMaXN0LmdldEV4cHJlc3Npb25zKCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaTxleHBycy5sZW5ndGg7IGkrKyl7Ci0JCQkJCWlmKGZ1bmMgIT0gbnVsbCkKLQkJCQkJCXYxID0gdjEgfCBzYUV4cHIoZXhwcnNbaV0sIHNpZGUsIGZ1bmMsIGksIGQxLCB1MSwgbHIxLCBycjEpOwotCQkJCQllbHNlCi0JCQkJCQl2MSA9IHYxIHwgc2FFeHByKGV4cHJzW2ldLCBzaWRlLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDEpOwotCQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQkJVXRpbC5hZGRBbGwobGRmLCBscjEpOwotCQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMSk7Ci0JCQkJfQotCQkJCXJldHVybiB2MTsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGaWVsZFJlZmVyZW5jZSl7Ci0JCQkJSUFTVEZpZWxkUmVmZXJlbmNlIGZyRSA9IChJQVNURmllbGRSZWZlcmVuY2UpZXhwcjsKLQkJCQlpZihzaWRlID09IGxocyB8fCBzaWRlID09IGxkZXJlZikKLQkJCQkJdjEgPSBzYUV4cHIoZnJFLmdldEZpZWxkT3duZXIoKSwgbGRlcmVmLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJZWxzZQotCQkJCQl2MSA9IHNhRXhwcihmckUuZ2V0RmllbGRPd25lcigpLCByZGVyZWYsIGZ1bmMsIGluZGV4LCBkMSwgdTEsIGxyMSwgcnIxKTsKLQkJCQlVdGlsLmFkZEFsbChkZWYsIGQxKTsKLQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQlVdGlsLmFkZEFsbChsZGYsIGxyMSk7Ci0JCQkJVXRpbC5hZGRBbGwocmRmLCBycjEpOwotCQkJCXJldHVybiB2MTsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jRSA9IChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbilleHByOwotCQkJCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZnVuY0UuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQlpZihzaWduYXR1cmUuZXF1YWxzKCJtYWxsb2MiKSB8fCBzaWduYXR1cmUuZXF1YWxzKCJjYWxsb2MiKSB8fAotCQkJCQkJc2lnbmF0dXJlLmVxdWFscygicmVhbGxvYyIpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlJQVNURXhwcmVzc2lvbiBwYXJhbUUgPSBmdW5jRS5nZXRQYXJhbWV0ZXJFeHByZXNzaW9uKCk7Ci0JCQkJaWYocGFyYW1FID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCQlpZihwYXJhbUUgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvbkxpc3QpCi0JCQkJCXYxID0gc2FFeHByKHBhcmFtRSwgc2lkZSwgZnVuY0UsIC0xLCBkMSwgdTEsIGxyMSwgcnIxKTsKLQkJCQllbHNlCi0JCQkJCXYxID0gc2FFeHByKHBhcmFtRSwgc2lkZSwgZnVuY0UsIDAsIGQxLCB1MSwgbHIxLCBycjEpOwotCQkJCS8qIHVwZGF0ZSBhc3NpZ25tZW50IG51bWJlciBvZiBnbG9iYWwgdmFyICovCi0JCQkJTVBJQ2FsbEdyYXBoTm9kZSBub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpY2dfLmdldE5vZGUoY3VycmVudE5vZGVfLmdldEZpbGVOYW1lKCksIHNpZ25hdHVyZSk7Ci0JCQkJaWYobm9kZSAhPSBudWxsKXsKLQkJCQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaT1jZ18uZ2V0RW52KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJCVN0cmluZyBndmFyID0gaS5uZXh0KCk7Ci0JCQkJCQlpZighdTEuY29udGFpbnMoZ3ZhcikgJiYgIXJyMS5jb250YWlucyhndmFyKSl7Ci0JCQkJCQkJaW50IGZudW0gPSBub2RlLmdldFNBVmFyKCkuZ2V0KGd2YXIpLmludFZhbHVlKCk7Ci0JCQkJCQkJaW50IG51bSA9IGFzc2lnbk51bV8uZ2V0KGd2YXIpLmludFZhbHVlKCk7Ci0JCQkJCQkJYXNzaWduTnVtXy5wdXQoZ3ZhciwgbmV3IEludGVnZXIoZm51bSArIG51bSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDEpOwotCQkJCVV0aWwuYWRkQWxsKHVzZSwgdTEpOwotCQkJCVV0aWwuYWRkQWxsKGxkZiwgbHIxKTsKLQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMSk7Ci0JCQkJcmV0dXJuIHYxOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVElkRXhwcmVzc2lvbil7Ci0JCQkJSUFTVElkRXhwcmVzc2lvbiBpZCA9IChJQVNUSWRFeHByZXNzaW9uKWV4cHI7Ci0JCQkJSUFTVE5hbWUgbmFtZSA9IGlkLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgdmFyID0gbmFtZS50b1N0cmluZygpOwotCQkJCWlmKHZhci5zdGFydHNXaXRoKCJNUElfIikpIHJldHVybiBmYWxzZTsKLQkJCQlpbnQgZm51bSA9IDA7Ci0JCQkJaWYoZnVuYyAhPSBudWxsKXsKLQkJCQkJZm51bSA9IGdldFBhcmFtQXNzaWduTnVtKGZ1bmMsIGluZGV4KTsKLQkJCQl9Ci0JCQkJaWYoc2lkZSA9PSByaHMpewotCQkJCQlpZighdXNlLmNvbnRhaW5zKHZhcikpCi0JCQkJCQl1c2UuYWRkKHZhcik7Ci0JCQkJCWludCBudW0gPSBhc3NpZ25OdW1fLmdldCh2YXIpLmludFZhbHVlKCk7Ci0JCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIobnVtICsgZm51bSkpOwotCQkJCX0gZWxzZSBpZihzaWRlID09IGxocyl7Ci0JCQkJCWlmKCFkZWYuY29udGFpbnModmFyKSkKLQkJCQkJCWRlZi5hZGQodmFyKTsKLQkJCQl9IGVsc2UgaWYoc2lkZSA9PSBsZGVyZWYpewotCQkJCQlpZighbGRmLmNvbnRhaW5zKHZhcikpCi0JCQkJCQlsZGYuYWRkKHZhcik7Ci0JCQkJfSBlbHNlIHsgLy9yZGVyZWYKLQkJCQkJaWYoIXJkZi5jb250YWlucyh2YXIpKQotCQkJCQkJcmRmLmFkZCh2YXIpOwotCQkJCQlpbnQgbnVtID0gYXNzaWduTnVtXy5nZXQodmFyKS5pbnRWYWx1ZSgpOwotCQkJCQlhc3NpZ25OdW1fLnB1dCh2YXIsIG5ldyBJbnRlZ2VyKG51bSArIGZudW0pKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVExpdGVyYWxFeHByZXNzaW9uKXsKLQkJCX0KLQkJCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RQcm9ibGVtRXhwcmVzc2lvbil7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUVHlwZUlkRXhwcmVzc2lvbil7Ci0JCQl9Ci0JCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUVW5hcnlFeHByZXNzaW9uKXsKLQkJCQlJQVNUVW5hcnlFeHByZXNzaW9uIHVFID0gKElBU1RVbmFyeUV4cHJlc3Npb24pZXhwcjsKLQkJCQlpbnQgb3AgPSB1RS5nZXRPcGVyYXRvcigpOwotCQkJCWlmKG9wID09IElBU1RVbmFyeUV4cHJlc3Npb24ub3BfcHJlZml4SW5jciB8fAotCQkJCQkgIG9wID09IElBU1RVbmFyeUV4cHJlc3Npb24ub3BfcHJlZml4RGVjciB8fAotCQkJCQkgIG9wID09IElBU1RVbmFyeUV4cHJlc3Npb24ub3BfcG9zdEZpeEluY3IgfHwKLQkJCQkJICBvcCA9PSBJQVNUVW5hcnlFeHByZXNzaW9uLm9wX3Bvc3RGaXhEZWNyKSB7Ci0JCQkJCXYxID0gc2FFeHByKHVFLmdldE9wZXJhbmQoKSwgcmhzLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCXYyID0gc2FFeHByKHVFLmdldE9wZXJhbmQoKSwgbGhzLCBmdW5jLCBpbmRleCwgZDIsIHUyLCBscjIsIHJyMik7Ci0JCQkJCWZvcihJdGVyYXRvcjxTdHJpbmc+IGkgPSBkMS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJCQkJU3RyaW5nIHZhciA9IGkubmV4dCgpOwotCQkJCQkJaW50IG51bSA9IGFzc2lnbk51bV8uZ2V0KHZhcikuaW50VmFsdWUoKTsKLQkJCQkJCWJvb2xlYW4gcG9pbnRlclR5cGUgPSB0eXBlXy5nZXQodmFyKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCWlmKHBvaW50ZXJUeXBlKXsKLQkJCQkJCQlpZih2MikgLy8gaW5pdCBieSBtYWxsb2MKLQkJCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAxKSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlhc3NpZ25OdW1fLnB1dCh2YXIsIG5ldyBJbnRlZ2VyKG51bSArIDIpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAxKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHUxLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCQlTdHJpbmcgdmFyID0gaS5uZXh0KCk7Ci0JCQkJCQlpbnQgbnVtID0gYXNzaWduTnVtXy5nZXQodmFyKS5pbnRWYWx1ZSgpOwotCQkJCQkJYm9vbGVhbiBwb2ludGVyVHlwZSA9IHR5cGVfLmdldCh2YXIpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJaWYocG9pbnRlclR5cGUpIC8vcG9pbnRlcnMgYXJlIHVzZWQgZm9yIG1hdGggb3BlcmF0aW9ucwotCQkJCQkJCWFzc2lnbk51bV8ucHV0KHZhciwgbmV3IEludGVnZXIobnVtICsgMikpOwotCQkJCQl9CQotCQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gdTIuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQkJCVN0cmluZyB2YXIgPSBpLm5leHQoKTsKLQkJCQkJCWludCBudW0gPSBhc3NpZ25OdW1fLmdldCh2YXIpLmludFZhbHVlKCk7Ci0JCQkJCQlib29sZWFuIHBvaW50ZXJUeXBlID0gdHlwZV8uZ2V0KHZhcikuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlpZihwb2ludGVyVHlwZSkgLy9wb2ludGVycyBhcmUgdXNlZCBmb3IgbWF0aCBvcGVyYXRpb25zCi0JCQkJCQkJYXNzaWduTnVtXy5wdXQodmFyLCBuZXcgSW50ZWdlcihudW0gKyAyKSk7Ci0JCQkJCX0KLQkJCQkJVXRpbC5hZGRBbGwoZGVmLCBkMSk7Ci0JCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDIpOwotCQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQkJVXRpbC5hZGRBbGwodXNlLCB1Mik7Ci0JCQkJCVV0aWwuYWRkQWxsKGxkZiwgbHIxKTsKLQkJCQkJVXRpbC5hZGRBbGwobGRmLCBscjIpOwotCQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMSk7Ci0JCQkJCVV0aWwuYWRkQWxsKHJkZiwgcnIyKTsJCi0JCQkJfSBlbHNlIHsKLQkJCQkJdjEgPSBzYUV4cHIodUUuZ2V0T3BlcmFuZCgpLCBzaWRlLCBmdW5jLCBpbmRleCwgZDEsIHUxLCBscjEsIHJyMSk7Ci0JCQkJCVV0aWwuYWRkQWxsKGRlZiwgZDEpOwotCQkJCQlVdGlsLmFkZEFsbCh1c2UsIHUxKTsKLQkJCQkJVXRpbC5hZGRBbGwobGRmLCBscjEpOwotCQkJCQlVdGlsLmFkZEFsbChyZGYsIHJyMSk7Ci0JCQkJfQotCQkJCXJldHVybiB2MSB8IHYyOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgaW50IGdldFBhcmFtQXNzaWduTnVtKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZFLCBpbnQgaW5kZXgpewotCQkJaWYoaW5kZXggPT0gLTEpIHJldHVybiAwOwotCQkJSUFTVEV4cHJlc3Npb24gZnVuY25hbWUgPSBmRS5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCk7Ci0JCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQlNUElDYWxsR3JhcGhOb2RlIG5vZGUgPSAoTVBJQ2FsbEdyYXBoTm9kZSljZ18uZ2V0Tm9kZShjdXJyZW50Tm9kZV8uZ2V0RmlsZU5hbWUoKSwgc2lnbmF0dXJlKTsKLQkJCWlmKG5vZGUgIT0gbnVsbCl7Ci0JCQkJSGFzaHRhYmxlPFN0cmluZyxJbnRlZ2VyPiBmdW5jQXNzaWduTnVtID0gbm9kZS5nZXRTQVZhcigpOwotCQkJCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmRlZiA9IG5vZGUuZ2V0RnVuY0RlZigpOwotCQkJCUlBU1RGdW5jdGlvbkRlY2xhcmF0b3IgZmRlY2wgPSBmZGVmLmdldERlY2xhcmF0b3IoKTsKLQkJCQlpZihmZGVjbCBpbnN0YW5jZW9mIElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcil7Ci0JCQkJCUlBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvciBzZnVuYyA9IChJQVNUU3RhbmRhcmRGdW5jdGlvbkRlY2xhcmF0b3IpZmRlY2w7Ci0JCQkJCUlBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbltdIHBhcmFtcyA9IHNmdW5jLmdldFBhcmFtZXRlcnMoKTsKLQkJCQkJaWYocGFyYW1zLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuIDA7Ci0JCQkJCUlBU1ROYW1lIHBhcmFtID0gcGFyYW1zW2luZGV4XS5nZXREZWNsYXJhdG9yKCkuZ2V0TmFtZSgpOwotCQkJCQlyZXR1cm4gZnVuY0Fzc2lnbk51bS5nZXQocGFyYW0udG9TdHJpbmcoKSkuaW50VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvciBrcmZ1bmMgPSAoSUNBU1RLblJGdW5jdGlvbkRlY2xhcmF0b3IpZmRlY2w7Ci0JCQkJCUlBU1ROYW1lW10gcGFyYW1zID0ga3JmdW5jLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCQkJCWlmKHBhcmFtcy5sZW5ndGggPD0gaW5kZXgpIHJldHVybiAwOwotCQkJCQlJQVNUTmFtZSBwYXJhbSA9IHBhcmFtc1tpbmRleF07Ci0JCQkJCXJldHVybiBmdW5jQXNzaWduTnVtLmdldChwYXJhbS50b1N0cmluZygpKS5pbnRWYWx1ZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogTGlicmFyeSBmdW5jdGlvbiBjYWxscy4gQW55IHBhcmFtZXRlciB3aG9zZSBhZGRyZXNzCi0JCQkJICogaXMgdGFrZW4gKHBvaW50ZXIgb3IgYXJyYXkpIGlzIGJvdGggZGVmaW5lZCBhbmQgdXNlZC4KLQkJCQkgKi8KLQkJCQlJQVNURXhwcmVzc2lvbiBwYXJhbWV0ZXJFID0gZkUuZ2V0UGFyYW1ldGVyRXhwcmVzc2lvbigpOwotCQkJCWlmKHBhcmFtZXRlckUgaW5zdGFuY2VvZiBJQVNURXhwcmVzc2lvbkxpc3QpewotCQkJCQlJQVNURXhwcmVzc2lvbkxpc3QgcGFyYW1FTGlzdCA9IChJQVNURXhwcmVzc2lvbkxpc3QpcGFyYW1ldGVyRTsKLQkJCQkJSUFTVEV4cHJlc3Npb24gcGFyYW0gPSAocGFyYW1FTGlzdC5nZXRFeHByZXNzaW9ucygpKVtpbmRleF07Ci0JCQkJCUlUeXBlIHR5cGUgPSBwYXJhbS5nZXRFeHByZXNzaW9uVHlwZSgpOwotCQkJCQlpZih0eXBlIGluc3RhbmNlb2YgSUFycmF5VHlwZSB8fCAKLQkJCQkJCQl0eXBlIGluc3RhbmNlb2YgSVBvaW50ZXJUeXBlKSByZXR1cm4gMjsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJSVR5cGUgdHlwZSA9IHBhcmFtZXRlckUuZ2V0RXhwcmVzc2lvblR5cGUoKTsKLQkJCQkJaWYodHlwZSBpbnN0YW5jZW9mIElBcnJheVR5cGUgfHwgCi0JCQkJCQkJdHlwZSBpbnN0YW5jZW9mIElQb2ludGVyVHlwZSkgcmV0dXJuIDI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL2FuYWx5c2lzL1VzZURlZkJ1aWxkZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvVXNlRGVmQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFlZWViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvVXNlRGVmQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuYy5JQ0FTVERlc2lnbmF0ZWRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LmMuSUNBU1RUeXBlSWRJbml0aWFsaXplckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5nbnUuYy5JQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLklBU1RBbWJpZ3VvdXNFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDb250cm9sRmxvd0dyYXBoOwotCi0KLS8qKiAKLSAqIENhbGN1bGF0ZSB0aGUgKGludGVyLXByb2NlZHVyYWwpIHVzZSBzZXQgYW5kIGRlZiBzZXQgb2YgZWFjaCBibG9jay4KLSAqIEBhdXRob3IgWXVhbiBaaGFuZwotICoKLSAqLwotcHVibGljIGNsYXNzIFVzZURlZkJ1aWxkZXIgZXh0ZW5kcyBBU1RWaXNpdG9yewotCXByb3RlY3RlZCBJQ2FsbEdyYXBoIGNnXzsKLQlwcm90ZWN0ZWQgSUNvbnRyb2xGbG93R3JhcGggY2ZnXyA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiB1c2VfID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGRlZl8gPSBudWxsOwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ3VzZV8gPSBudWxsOwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2RlZl8gPSBudWxsOwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gcGFkZWZfID0gbnVsbDsKLQotCXByb3RlY3RlZCBmaW5hbCBpbnQgbGhzID0gMDsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHJocyA9IDE7Ci0JCi0JcHJvdGVjdGVkIE1QSUNhbGxHcmFwaE5vZGUgY3VycmVudEZ1bmNfOwotCXByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLExpc3Q8SUJsb2NrPj4gZGVmVGFibGVfID0gbnVsbDsKLQkKLQlwdWJsaWMgVXNlRGVmQnVpbGRlcihJQ2FsbEdyYXBoIGNnKXsKLQkJY2dfID0gY2c7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQl0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJdGhpcy5zaG91bGRWaXNpdEV4cHJlc3Npb25zID0gdHJ1ZTsKLQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotCQkKLQkJLyogRml4IHBvaW50IHRvIGRlYWwgd2l0aCB0aGUgcmVjdXJzaW9uICovCi0JCWJvb2xlYW4gY2hhbmdlID0gdHJ1ZTsKLQkJd2hpbGUoY2hhbmdlKXsKLQkJCWNoYW5nZSA9IGZhbHNlOwotCQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKW47Ci0JCQkJLy9pZihub2RlLmdldEZ1bmNOYW1lKCkuZXF1YWxzKCJ5eXRuYW1lcnIiKSkKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obm9kZS5nZXRGdW5jTmFtZSgpKTsKLQkJCQlpZighbm9kZS5tYXJrZWQpIGNvbnRpbnVlOwotCQkJCUxpc3Q8U3RyaW5nPiBvbGRndXNlXyA9IG5vZGUuZ2V0R2xvYmFsVXNlKCk7Ci0JCQkJTGlzdDxTdHJpbmc+IG9sZGdkZWZfID0gbm9kZS5nZXRHbG9iYWxEZWYoKTsKLQkJCQlMaXN0PFN0cmluZz4gb2xkcGFkZWZfID0gbm9kZS5nZXRQYXJhbURlZigpOwotCQkJCWd1c2VfID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJZ2RlZl8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQlwYWRlZl8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQljZmdfID0gbm9kZS5nZXRDRkcoKTsKLQkJCQljdXJyZW50RnVuY18gPSBub2RlOwotCQkJCWZvcihJQmxvY2sgYiA9IGNmZ18uZ2V0RW50cnkoKS50b3BOZXh0KCk7IGIgIT0gbnVsbDsgYiA9IGIudG9wTmV4dCgpKXsKLQkJCQkJTVBJQmxvY2sgYmxvY2sgPSAoTVBJQmxvY2spYjsKLQkJCQkJSUFTVE5vZGUgY29udGVudCA9IGJsb2NrLmdldENvbnRlbnQoKTsKLQkJCQkJaWYoY29udGVudCA9PSBudWxsIHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBJQVNUTmFtZSkgY29udGludWU7Ci0JCQkJCUxpc3Q8U3RyaW5nPiBvbGR1c2VfID0gYmxvY2suZ2V0VXNlKCk7Ci0JCQkJCUxpc3Q8U3RyaW5nPiBvbGRkZWZfID0gYmxvY2suZ2V0RGVmKCk7Ci0JCQkJCXVzZV8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQkJZGVmXyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCQlpZihjb250ZW50IGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb24pewotCQkJCQkJSUFTVEV4cHJlc3Npb24gZXhwciA9IChJQVNURXhwcmVzc2lvbiljb250ZW50OwotCQkJCQkJZXhwci5hY2NlcHQodGhpcyk7Ci0JCQkJCX0gZWxzZSB7IC8vc3RhdGVtZW50Ci0JCQkJCQlJQVNUU3RhdGVtZW50IHN0bXQgPSAoSUFTVFN0YXRlbWVudCljb250ZW50OwotCQkJCQkJc3RtdC5hY2NlcHQodGhpcyk7Ci0JCQkJCX0KLQkJCQkJaWYoIVV0aWwuZXF1YWxzKHVzZV8sIG9sZHVzZV8pKXsKLQkJCQkJCWJsb2NrLnNldFVzZSh1c2VfKTsKLQkJCQkJCWNoYW5nZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYoIVV0aWwuZXF1YWxzKGRlZl8sIG9sZGRlZl8pKXsKLQkJCQkJCWJsb2NrLnNldERlZihkZWZfKTsKLQkJCQkJCWNoYW5nZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIVV0aWwuZXF1YWxzKGd1c2VfLCBvbGRndXNlXykpewotCQkJCQlub2RlLnNldEdsb2JhbFVzZShndXNlXyk7Ci0JCQkJCWNoYW5nZSA9IHRydWU7Ci0JCQkJfQotCQkJCWlmKCFVdGlsLmVxdWFscyhnZGVmXywgb2xkZ2RlZl8pKXsKLQkJCQkJbm9kZS5zZXRHbG9iYWxEZWYoZ2RlZl8pOwotCQkJCQljaGFuZ2UgPSB0cnVlOwotCQkJCX0KLQkJCQlpZighVXRpbC5lcXVhbHMocGFkZWZfLCBvbGRwYWRlZl8pKXsKLQkJCQkJbm9kZS5zZXRQYXJhbURlZihwYWRlZl8pOwotCQkJCQljaGFuZ2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yKElDYWxsR3JhcGhOb2RlIG4gPSBjZ18uYm90RW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi5ib3ROZXh0KCkpewotCQkJTVBJQ2FsbEdyYXBoTm9kZSBub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpbjsKLQkJCWlmKCFub2RlLm1hcmtlZCkgY29udGludWU7Ci0JCQljdXJyZW50RnVuY18gPSBub2RlOwotCQkJY2ZnXyA9IG5vZGUuZ2V0Q0ZHKCk7Ci0JCQlzZXRFbnRyeUJsb2NrKChNUElCbG9jaylub2RlLmdldENGRygpLmdldEVudHJ5KCkpOwotCQkJc2V0RXhpdEJsb2NrKChNUElCbG9jaylub2RlLmdldENGRygpLmdldEV4aXQoKSk7Ci0JCQlkZWZUYWJsZV8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZyxMaXN0PElCbG9jaz4+KCk7Ci0JCQlmb3IoSUJsb2NrIGIgPSBjZmdfLmdldEVudHJ5KCk7IGIgIT0gbnVsbDsgYiA9IGIudG9wTmV4dCgpKXsKLQkJCQlNUElCbG9jayBibG9jayA9IChNUElCbG9jayliOwotCQkJCUxpc3Q8U3RyaW5nPiBkZWYgPSBibG9jay5nZXREZWYoKTsKLQkJCQlpZihkZWYuaXNFbXB0eSgpKSBjb250aW51ZTsKLQkJCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gZGVmLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCVN0cmluZyB2YXIgPSBpLm5leHQoKTsKLQkJCQkJTGlzdDxJQmxvY2s+IGRlZmJsb2NrcyA9IGRlZlRhYmxlXy5nZXQodmFyKTsKLQkJCQkJaWYoZGVmYmxvY2tzID09IG51bGwpewotCQkJCQkJZGVmYmxvY2tzID0gbmV3IEFycmF5TGlzdDxJQmxvY2s+KCk7Ci0JCQkJCQlkZWZibG9ja3MuYWRkKGJsb2NrKTsKLQkJCQkJCWRlZlRhYmxlXy5wdXQodmFyLCBkZWZibG9ja3MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZGVmYmxvY2tzLmFkZChibG9jayk7Ci0JCQkJCQlkZWZUYWJsZV8ucHV0KHZhciwgZGVmYmxvY2tzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW5vZGUuc2V0RGVmVGFibGUoZGVmVGFibGVfKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCl7Ci0JCWlmKHN0bXQgaW5zdGFuY2VvZiBJQVNURGVjbGFyYXRpb25TdGF0ZW1lbnQpewotCQkJSUFTVERlY2xhcmF0aW9uU3RhdGVtZW50IGRlY2xTdG10ID0gKElBU1REZWNsYXJhdGlvblN0YXRlbWVudClzdG10OwotCQkJSUFTVERlY2xhcmF0aW9uIGRlY2wgPSBkZWNsU3RtdC5nZXREZWNsYXJhdGlvbigpOwotCQkJaWYoZGVjbCBpbnN0YW5jZW9mIElBU1RTaW1wbGVEZWNsYXJhdGlvbil7Ci0JCQkJSUFTVFNpbXBsZURlY2xhcmF0aW9uIHNpbXBsZURlY2wgPSAoSUFTVFNpbXBsZURlY2xhcmF0aW9uKWRlY2w7Ci0JCQkJSUFTVERlY2xhcmF0b3JbXSBkZWNsYXJhdG9ycyA9IHNpbXBsZURlY2wuZ2V0RGVjbGFyYXRvcnMoKTsKLQkJCQlmb3IoaW50IGk9MDsgaTxkZWNsYXJhdG9ycy5sZW5ndGg7IGkrKyl7Ci0JCQkJCUlBU1ROYW1lIG5hbWUgPSBkZWNsYXJhdG9yc1tpXS5nZXROYW1lKCk7Ci0JCQkJCUlBU1RJbml0aWFsaXplciBpbml0ID0gZGVjbGFyYXRvcnNbaV0uZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJCQkJaWYoaW5pdCAhPSBudWxsKQotCQkJCQkJZGVmXy5hZGQobmFtZS50b1N0cmluZygpKTsKLQkJCQkJcHJvY2Vzc0luaXRpYWxpemVyKGluaXQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBQUk9DRVNTX1NLSVA7Ci0JCX0KLQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5pdGlhbGl6ZXIoSUFTVEluaXRpYWxpemVyIGluaXQpewotCQlpZihpbml0ICE9IG51bGwpewotCQkJaWYoaW5pdCBpbnN0YW5jZW9mIElBU1RJbml0aWFsaXplckV4cHJlc3Npb24pewotCQkJCUlBU1RJbml0aWFsaXplckV4cHJlc3Npb24gaW5pdEUgPSAoSUFTVEluaXRpYWxpemVyRXhwcmVzc2lvbilpbml0OwotCQkJCUlBU1RFeHByZXNzaW9uIGUgPSBpbml0RS5nZXRFeHByZXNzaW9uKCk7Ci0JCQkJdXNlRGVmU2V0KGUsIHJocywgbnVsbCwgLTEpOwotCQkJfQotCQkJZWxzZSBpZihpbml0IGluc3RhbmNlb2YgSUFTVEluaXRpYWxpemVyTGlzdCl7Ci0JCQkJSUFTVEluaXRpYWxpemVyTGlzdCBsaXN0ID0gKElBU1RJbml0aWFsaXplckxpc3QpaW5pdDsKLQkJCQlJQVNUSW5pdGlhbGl6ZXJbXSBpbml0cyA9IGxpc3QuZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQkJZm9yKGludCBqID0gMDsgajxpbml0cy5sZW5ndGg7IGorKyl7Ci0JCQkJCXByb2Nlc3NJbml0aWFsaXplcihpbml0c1tqXSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihpbml0IGluc3RhbmNlb2YgSUNBU1REZXNpZ25hdGVkSW5pdGlhbGl6ZXIpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSUNBU1REZXNpZ25hdGVkSW5pdGlhbGl6ZXIgZm91bmQgISIpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBUaGUgdHJhdmVyc2UgaXMgc3RvcHBlZCAoYnkgUFJPQ0VTU19TS0lQKSB3aGVuIHRoZSBleHByZXNzaW9uIG9mIAotCSAqIHRoZSBzdGF0ZW1lbnQgaXMgdmlzaXRlZC4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmaW5kIHRoZSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBpbnQgdmlzaXQoSUFTVEV4cHJlc3Npb24gZXhwcil7Ci0JCXVzZURlZlNldChleHByLCByaHMsIG51bGwsIC0xKTsKLQkJcmV0dXJuIFBST0NFU1NfU0tJUDsKLQl9Ci0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGV4cHIgVGhlIGV4cHJlc3Npb24gYmVpbmcgYW5hbHl6ZWQKLQkgKiBAcGFyYW0gc2lkZSBsaHMgaWYgaXQgaXMgZGVmaW5lZCwgcmhzIG90aGVyd2lzZSAocmhzKQotCSAqIEBwYXJhbSBmdW5jYWxsIHRoZSBmdW5jdGlvbiBjYWxsIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIgaW4gZnVuY2FsbAotCSAqLwotCXB1YmxpYyB2b2lkIHVzZURlZlNldChJQVNURXhwcmVzc2lvbiBleHByLCBpbnQgc2lkZSwgCi0JCQlJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbiBmdW5jYWxsLCBpbnQgaW5kZXgpewotCQkvLyBOdWxsIGV4cHJlc3Npb24gZm9yIGVtcHR5IGZ1bmN0aW9uIHBhcmFtZXRlciAKLQkJaWYoZXhwciA9PSBudWxsKSByZXR1cm47IAotCQlpZihleHByIGluc3RhbmNlb2YgSUFTVEFtYmlndW91c0V4cHJlc3Npb24pewotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RBcnJheVN1YnNjcmlwdEV4cHJlc3Npb24pewotCQkJSUFTVEFycmF5U3Vic2NyaXB0RXhwcmVzc2lvbiBhc0UgPSAoSUFTVEFycmF5U3Vic2NyaXB0RXhwcmVzc2lvbilleHByOwotCQkJaWYoc2lkZSA9PSByaHMpewotCQkJCS8vID0gYVtpbmRleF9leHByXQotCQkJCXVzZURlZlNldChhc0UuZ2V0QXJyYXlFeHByZXNzaW9uKCksIHJocywgZnVuY2FsbCwgaW5kZXgpOyAKLQkJCQl1c2VEZWZTZXQoYXNFLmdldFN1YnNjcmlwdEV4cHJlc3Npb24oKSwgcmhzLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQl9IGVsc2UgeyAvL2xocwotCQkJCS8vIGFbYltpXV0gPSAuLi4gLCBhIGlzIGRlZmluZWQsIGIgYW5kIGkgYXJlIHVzZWQKLQkJCQl1c2VEZWZTZXQoYXNFLmdldFN1YnNjcmlwdEV4cHJlc3Npb24oKSwgcmhzLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQkJdXNlRGVmU2V0KGFzRS5nZXRBcnJheUV4cHJlc3Npb24oKSwgbGhzLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEJpbmFyeUV4cHJlc3Npb24pewotCQkJSUFTVEJpbmFyeUV4cHJlc3Npb24gYmlFID0gKElBU1RCaW5hcnlFeHByZXNzaW9uKWV4cHI7Ci0JCQlpbnQgb3AgPSBiaUUuZ2V0T3BlcmF0b3IoKTsKLQkJCWlmKG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2Fzc2lnbil7Ci0JCQkJLy8geCA9IHkgPSB6IGlzIHJpZ2h0IGFzc29jaWF0aXZlIC0tPiB4ID0gKHkgPSB6KQotCQkJCS8vIFNvIHRoZSAic2lkZSIgd2lsbCBiZSBhbHdheXMgcmhzCi0JCQkJdXNlRGVmU2V0KGJpRS5nZXRPcGVyYW5kMSgpLCBsaHMsIGZ1bmNhbGwsIGluZGV4KTsKLQkJCQl1c2VEZWZTZXQoYmlFLmdldE9wZXJhbmQyKCksIHJocywgZnVuY2FsbCwgaW5kZXgpOwotCQkJfQotCQkJZWxzZSBpZiggb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfbXVsdGlwbHlBc3NpZ24gfHwKLQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2RpdmlkZUFzc2lnbiB8fAotCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfbW9kdWxvQXNzaWduIHx8Ci0JCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9wbHVzQXNzaWduIHx8Ci0JCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9taW51c0Fzc2lnbiB8fAotCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3Bfc2hpZnRMZWZ0QXNzaWduIHx8Ci0JCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9zaGlmdFJpZ2h0QXNzaWduIHx8Ci0JCQkJCSBvcCA9PSBJQVNUQmluYXJ5RXhwcmVzc2lvbi5vcF9iaW5hcnlBbmRBc3NpZ24gfHwKLQkJCQkJIG9wID09IElBU1RCaW5hcnlFeHByZXNzaW9uLm9wX2JpbmFyeVhvckFzc2lnbiB8fAotCQkJCQkgb3AgPT0gSUFTVEJpbmFyeUV4cHJlc3Npb24ub3BfYmluYXJ5T3JBc3NpZ24pewotCQkJCXVzZURlZlNldChiaUUuZ2V0T3BlcmFuZDEoKSwgcmhzLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQkJdXNlRGVmU2V0KGJpRS5nZXRPcGVyYW5kMigpLCByaHMsIGZ1bmNhbGwsIGluZGV4KTsKLQkJCQl1c2VEZWZTZXQoYmlFLmdldE9wZXJhbmQxKCksIGxocywgZnVuY2FsbCwgaW5kZXgpOwotCQkJfSAKLQkJCWVsc2UgewotCQkJCXVzZURlZlNldChiaUUuZ2V0T3BlcmFuZDEoKSwgcmhzLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQkJdXNlRGVmU2V0KGJpRS5nZXRPcGVyYW5kMigpLCByaHMsIGZ1bmNhbGwsIGluZGV4KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUQ2FzdEV4cHJlc3Npb24pewotCQkJSUFTVENhc3RFeHByZXNzaW9uIGNhc3RFID0gKElBU1RDYXN0RXhwcmVzc2lvbilleHByOwotCQkJdXNlRGVmU2V0KGNhc3RFLmdldE9wZXJhbmQoKSwgc2lkZSwgZnVuY2FsbCwgaW5kZXgpOwotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RDb25kaXRpb25hbEV4cHJlc3Npb24pewotCQkJSUFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kRSA9IChJQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uKWV4cHI7Ci0JCQlpZihzaWRlID09IHJocyl7Ci0JCQkJdXNlRGVmU2V0KGNvbmRFLmdldExvZ2ljYWxDb25kaXRpb25FeHByZXNzaW9uKCksIHJocywgZnVuY2FsbCwgaW5kZXgpOyAKLQkJCQl1c2VEZWZTZXQoY29uZEUuZ2V0UG9zaXRpdmVSZXN1bHRFeHByZXNzaW9uKCksIHJocywgZnVuY2FsbCwgaW5kZXgpOyAKLQkJCQl1c2VEZWZTZXQoY29uZEUuZ2V0TmVnYXRpdmVSZXN1bHRFeHByZXNzaW9uKCksIHJocywgZnVuY2FsbCwgaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBlZy4geCA+IHkgPyB4IDogeSA9IDEKLQkJCQl1c2VEZWZTZXQoY29uZEUuZ2V0TG9naWNhbENvbmRpdGlvbkV4cHJlc3Npb24oKSwgcmhzLCBmdW5jYWxsLCBpbmRleCk7IAotCQkJCXVzZURlZlNldChjb25kRS5nZXRQb3NpdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgbGhzLCBmdW5jYWxsLCBpbmRleCk7IAotCQkJCXVzZURlZlNldChjb25kRS5nZXROZWdhdGl2ZVJlc3VsdEV4cHJlc3Npb24oKSwgbGhzLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCUlBU1RFeHByZXNzaW9uTGlzdCBleHByTGlzdCA9IChJQVNURXhwcmVzc2lvbkxpc3QpZXhwcjsKLQkJCUlBU1RFeHByZXNzaW9uW10gZXhwcnMgPSBleHByTGlzdC5nZXRFeHByZXNzaW9ucygpOwotCQkJZm9yKGludCBpID0gMDsgaTxleHBycy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYoZnVuY2FsbCAhPSBudWxsKQotCQkJCQl1c2VEZWZTZXQoZXhwcnNbaV0sIHNpZGUsIGZ1bmNhbGwsIGkpOwotCQkJCWVsc2UKLQkJCQkJdXNlRGVmU2V0KGV4cHJzW2ldLCBzaWRlLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVEZpZWxkUmVmZXJlbmNlKXsKLQkJCUlBU1RGaWVsZFJlZmVyZW5jZSBmckUgPSAoSUFTVEZpZWxkUmVmZXJlbmNlKWV4cHI7Ci0JCQl1c2VEZWZTZXQoZnJFLmdldEZpZWxkT3duZXIoKSwgc2lkZSwgZnVuY2FsbCwgaW5kZXgpOwotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKXsKLQkJCUlBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGZ1bmNFID0gKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKWV4cHI7Ci0JCQlJQVNURXhwcmVzc2lvbiBmdW5jbmFtZSA9IGZ1bmNFLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLQkJCVN0cmluZyBzaWduYXR1cmUgPSBmdW5jbmFtZS5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCU1QSUNhbGxHcmFwaE5vZGUgbiA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpLCBzaWduYXR1cmUpOwotCQkJaWYobiAhPSBudWxsKXsKLQkJCQlnZGVmXyA9IFV0aWwuVW5pb24oZ2RlZl8sIG4uZ2V0R2xvYmFsRGVmKCkpOwotCQkJCWd1c2VfID0gVXRpbC5VbmlvbihndXNlXywgbi5nZXRHbG9iYWxVc2UoKSk7Ci0JCQkJZGVmXyA9IFV0aWwuVW5pb24oZGVmXywgbi5nZXRHbG9iYWxEZWYoKSk7Ci0JCQkJdXNlXyA9IFV0aWwuVW5pb24odXNlXywgbi5nZXRHbG9iYWxVc2UoKSk7Ci0JCQl9Ci0JCQlJQVNURXhwcmVzc2lvbiBwYXJhbUUgPSBmdW5jRS5nZXRQYXJhbWV0ZXJFeHByZXNzaW9uKCk7Ci0JCQlpZihwYXJhbUUgPT0gbnVsbCkgcmV0dXJuOwotCQkJaWYocGFyYW1FIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KQotCQkJCXVzZURlZlNldChmdW5jRS5nZXRQYXJhbWV0ZXJFeHByZXNzaW9uKCksIHNpZGUsIGZ1bmNFLCAtMSk7Ci0JCQllbHNlCi0JCQkJdXNlRGVmU2V0KGZ1bmNFLmdldFBhcmFtZXRlckV4cHJlc3Npb24oKSwgc2lkZSwgZnVuY0UsIDApOwotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pewotCQkJSUFTVElkRXhwcmVzc2lvbiBpZCA9IChJQVNUSWRFeHByZXNzaW9uKWV4cHI7Ci0JCQlJQVNUTmFtZSBuYW1lID0gaWQuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHZhciA9IG5hbWUudG9TdHJpbmcoKTsKLQkJCWlmKHZhci5zdGFydHNXaXRoKCJNUElfIikpIHJldHVybjsKLQkJCWlmKHNpZGUgPT0gcmhzKXsKLQkJCQlpZighdXNlXy5jb250YWlucyh2YXIpKSAKLQkJCQkJdXNlXy5hZGQodmFyKTsKLQkJCQlpZihjZ18uZ2V0RW52KCkuY29udGFpbnModmFyKSAmJiAhZ3VzZV8uY29udGFpbnModmFyKSkgCi0JCQkJCWd1c2VfLmFkZCh2YXIpOwotCQkJCWlmKGZ1bmNhbGwgIT0gbnVsbCl7Ci0JCQkJCWlmKGlzRGVmaW5lZFBhcmFtKGZ1bmNhbGwsIGluZGV4KSl7Ci0JCQkJCQlpZighZGVmXy5jb250YWlucyh2YXIpKQotCQkJCQkJCWRlZl8uYWRkKHZhcik7Ci0JCQkJCQlpZihjZ18uZ2V0RW52KCkuY29udGFpbnModmFyKSAmJiAhZ2RlZl8uY29udGFpbnModmFyKSkKLQkJCQkJCQlnZGVmXy5hZGQodmFyKTsKLQkJCQkJCWlmKGlzUGFzc2FibGVQYXJhbSh2YXIpICYmICFwYWRlZl8uY29udGFpbnModmFyKSkKLQkJCQkJCQlwYWRlZl8uYWRkKHZhcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgeyAvL2xocwotCQkJCWlmKCFkZWZfLmNvbnRhaW5zKHZhcikpIAotCQkJCQlkZWZfLmFkZCh2YXIpOwotCQkJCWlmKGNnXy5nZXRFbnYoKS5jb250YWlucyh2YXIpICYmICFnZGVmXy5jb250YWlucyh2YXIpKSAKLQkJCQkJZ2RlZl8uYWRkKHZhcik7Ci0JCQkJaWYoaXNQYXNzYWJsZVBhcmFtKHZhcikgJiYgIXBhZGVmXy5jb250YWlucyh2YXIpKSAKLQkJCQkJcGFkZWZfLmFkZCh2YXIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoZXhwciBpbnN0YW5jZW9mIElBU1RMaXRlcmFsRXhwcmVzc2lvbil7Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFByb2JsZW1FeHByZXNzaW9uKXsKLQkJfQotCQllbHNlIGlmKGV4cHIgaW5zdGFuY2VvZiBJQVNUVHlwZUlkRXhwcmVzc2lvbil7Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUFTVFVuYXJ5RXhwcmVzc2lvbil7Ci0JCQlJQVNUVW5hcnlFeHByZXNzaW9uIHVFID0gKElBU1RVbmFyeUV4cHJlc3Npb24pZXhwcjsKLQkJCWludCBvcCA9IHVFLmdldE9wZXJhdG9yKCk7Ci0JCQlpZihvcCA9PSBJQVNUVW5hcnlFeHByZXNzaW9uLm9wX3ByZWZpeEluY3IgfHwKLQkJCQkgIG9wID09IElBU1RVbmFyeUV4cHJlc3Npb24ub3BfcHJlZml4RGVjciB8fAotCQkJCSAgb3AgPT0gSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9wb3N0Rml4SW5jciB8fAotCQkJCSAgb3AgPT0gSUFTVFVuYXJ5RXhwcmVzc2lvbi5vcF9wb3N0Rml4RGVjcikgewotCQkJCXVzZURlZlNldCh1RS5nZXRPcGVyYW5kKCksIHJocywgZnVuY2FsbCwgaW5kZXgpOwotCQkJCXVzZURlZlNldCh1RS5nZXRPcGVyYW5kKCksIGxocywgZnVuY2FsbCwgaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VEZWZTZXQodUUuZ2V0T3BlcmFuZCgpLCBzaWRlLCBmdW5jYWxsLCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihleHByIGluc3RhbmNlb2YgSUNBU1RUeXBlSWRJbml0aWFsaXplckV4cHJlc3Npb24pewotCQl9Ci0JCWVsc2V7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFzc2FibGVQYXJhbShTdHJpbmcgbmFtZSl7Ci0JCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmRlZiA9IGN1cnJlbnRGdW5jXy5nZXRGdW5jRGVmKCk7Ci0JCUlBU1RGdW5jdGlvbkRlY2xhcmF0b3IgZmRlY2wgPSBmZGVmLmdldERlY2xhcmF0b3IoKTsKLQkJaWYoZmRlY2wgaW5zdGFuY2VvZiBJQVNUU3RhbmRhcmRGdW5jdGlvbkRlY2xhcmF0b3IpewotCQkJSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIHNmdW5jID0gKElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCUlBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbltdIHBhcmFtcyA9IHNmdW5jLmdldFBhcmFtZXRlcnMoKTsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspewotCQkJCUlBU1ROYW1lIHBhcmFtID0gcGFyYW1zW2ldLmdldERlY2xhcmF0b3IoKS5nZXROYW1lKCk7Ci0JCQkJSUFTVFBvaW50ZXJPcGVyYXRvcltdIHBvcHMgPSBwYXJhbXNbaV0uZ2V0RGVjbGFyYXRvcigpLmdldFBvaW50ZXJPcGVyYXRvcnMoKTsKLQkJCQlpZihuYW1lLmVxdWFscyhwYXJhbS50b1N0cmluZygpKSAmJiBwb3BzICE9IElBU1RQb2ludGVyT3BlcmF0b3IuRU1QVFlfQVJSQVkpewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJQ0FTVEtuUkZ1bmN0aW9uRGVjbGFyYXRvciBrcmZ1bmMgPSAoSUNBU1RLblJGdW5jdGlvbkRlY2xhcmF0b3IpZmRlY2w7Ci0JCQlJQVNUTmFtZVtdIHBhcmFtcyA9IGtyZnVuYy5nZXRQYXJhbWV0ZXJOYW1lcygpOwotCQkJZm9yKGludCBpPTA7IGk8cGFyYW1zLmxlbmd0aDsgaSsrKXsKLQkJCQlpZihuYW1lLmVxdWFscyhwYXJhbXNbaV0udG9TdHJpbmcoKSkpewotCQkJCQlJQVNURGVjbGFyYXRvciBkZWNsID0ga3JmdW5jLmdldERlY2xhcmF0b3JGb3JQYXJhbWV0ZXJOYW1lKHBhcmFtc1tpXSk7Ci0JCQkJCWlmKGRlY2wuZ2V0UG9pbnRlck9wZXJhdG9ycygpICE9IElBU1RQb2ludGVyT3BlcmF0b3IuRU1QVFlfQVJSQVkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZpbmVkUGFyYW0oSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24gZkUsIGludCBpbmRleCl7Ci0JCWlmKGluZGV4ID09IC0xKSByZXR1cm4gZmFsc2U7Ci0JCUlBU1RFeHByZXNzaW9uIGZ1bmNuYW1lID0gZkUuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQlTdHJpbmcgc2lnbmF0dXJlID0gZnVuY25hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCU1QSUNhbGxHcmFwaE5vZGUgbm9kZSA9IChNUElDYWxsR3JhcGhOb2RlKWNnXy5nZXROb2RlKGN1cnJlbnRGdW5jXy5nZXRGaWxlTmFtZSgpLCBzaWduYXR1cmUpOwotCQlpZihub2RlICE9IG51bGwpewotCQkJTGlzdDxTdHJpbmc+IHBhZGVmID0gbm9kZS5nZXRQYXJhbURlZigpOwotCQkJSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBmZGVmID0gbm9kZS5nZXRGdW5jRGVmKCk7Ci0JCQlJQVNURnVuY3Rpb25EZWNsYXJhdG9yIGZkZWNsID0gZmRlZi5nZXREZWNsYXJhdG9yKCk7Ci0JCQlpZihmZGVjbCBpbnN0YW5jZW9mIElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcil7Ci0JCQkJSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIHNmdW5jID0gKElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCQlJQVNUUGFyYW1ldGVyRGVjbGFyYXRpb25bXSBwYXJhbXMgPSBzZnVuYy5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJaWYocGFyYW1zLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuIGZhbHNlOwotCQkJCUlBU1ROYW1lIHBhcmFtID0gcGFyYW1zW2luZGV4XS5nZXREZWNsYXJhdG9yKCkuZ2V0TmFtZSgpOwotCQkJCWlmKHBhZGVmLmNvbnRhaW5zKHBhcmFtLnRvU3RyaW5nKCkpKSByZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSUNBU1RLblJGdW5jdGlvbkRlY2xhcmF0b3Iga3JmdW5jID0gKElDQVNUS25SRnVuY3Rpb25EZWNsYXJhdG9yKWZkZWNsOwotCQkJCUlBU1ROYW1lW10gcGFyYW1zID0ga3JmdW5jLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCQkJaWYocGFyYW1zLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuIGZhbHNlOwotCQkJCUlBU1ROYW1lIHBhcmFtID0gcGFyYW1zW2luZGV4XTsKLQkJCQlpZihwYWRlZi5jb250YWlucyhwYXJhbS50b1N0cmluZygpKSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBMaWJyYXJ5IGZ1bmN0aW9uIGNhbGxzLiBBbnkgcGFyYW1ldGVyIHdob3NlIGFkZHJlc3MKLQkJCSAqIGlzIHRha2VuIChwb2ludGVyIG9yIGFycmF5KSBpcyBib3RoIGRlZmluZWQgYW5kIHVzZWQuCi0JCQkgKi8KLQkJCUlBU1RFeHByZXNzaW9uIHBhcmFtZXRlckUgPSBmRS5nZXRQYXJhbWV0ZXJFeHByZXNzaW9uKCk7Ci0JCQlpZihwYXJhbWV0ZXJFIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KXsKLQkJCQlJQVNURXhwcmVzc2lvbkxpc3QgcGFyYW1FTGlzdCA9IChJQVNURXhwcmVzc2lvbkxpc3QpcGFyYW1ldGVyRTsKLQkJCQlJQVNURXhwcmVzc2lvbiBwYXJhbSA9IChwYXJhbUVMaXN0LmdldEV4cHJlc3Npb25zKCkpW2luZGV4XTsKLQkJCQlJVHlwZSB0eXBlID0gcGFyYW0uZ2V0RXhwcmVzc2lvblR5cGUoKTsKLQkJCQlpZih0eXBlIGluc3RhbmNlb2YgSUFycmF5VHlwZSB8fCAKLQkJCQkJCXR5cGUgaW5zdGFuY2VvZiBJUG9pbnRlclR5cGUpIHJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZXsKLQkJCQlJVHlwZSB0eXBlID0gcGFyYW1ldGVyRS5nZXRFeHByZXNzaW9uVHlwZSgpOwotCQkJCWlmKHR5cGUgaW5zdGFuY2VvZiBJQXJyYXlUeXBlIHx8IAotCQkJCQkJdHlwZSBpbnN0YW5jZW9mIElQb2ludGVyVHlwZSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBBbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGFuZCB1c2VkIGdsb2JhbHMgYXJlIGFzc3VtZWQgdG8gYmUgCi0JICogZGVmaW5lZCBhdCB0aGUgZW50cnkgYmxvY2suCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEVudHJ5QmxvY2soTVBJQmxvY2sgZW50cnkpewotCQlMaXN0PFN0cmluZz4gZGVmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUlBU1RGdW5jdGlvbkRlZmluaXRpb24gZmRlZiA9IGN1cnJlbnRGdW5jXy5nZXRGdW5jRGVmKCk7Ci0JCUlBU1RGdW5jdGlvbkRlY2xhcmF0b3IgZmRlY2wgPSBmZGVmLmdldERlY2xhcmF0b3IoKTsKLQkJaWYoZmRlY2wgaW5zdGFuY2VvZiBJQVNUU3RhbmRhcmRGdW5jdGlvbkRlY2xhcmF0b3IpewotCQkJSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIHNmdW5jID0gKElBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcilmZGVjbDsKLQkJCUlBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbltdIHBhcmFtcyA9IHNmdW5jLmdldFBhcmFtZXRlcnMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQkJSUFTVE5hbWUgcGFyYW0gPSBwYXJhbXNbaV0uZ2V0RGVjbGFyYXRvcigpLmdldE5hbWUoKTsKLQkJCQlkZWYuYWRkKHBhcmFtLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUNBU1RLblJGdW5jdGlvbkRlY2xhcmF0b3Iga3JmdW5jID0gKElDQVNUS25SRnVuY3Rpb25EZWNsYXJhdG9yKWZkZWNsOwotCQkJSUFTVE5hbWVbXSBwYXJhbXMgPSBrcmZ1bmMuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQkJSUFTVE5hbWUgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCQkJZGVmLmFkZChwYXJhbS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlmb3IoSXRlcmF0b3I8U3RyaW5nPiBpID0gY3VycmVudEZ1bmNfLmdldEdsb2JhbFVzZSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlkZWYuYWRkKGkubmV4dCgpKTsKLQkJfQotCQllbnRyeS5zZXREZWYoZGVmKTsKLQkJZW50cnkuc2V0VXNlKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQl9CQotCQotCS8qKgotCSAqICBBbGwgZGVmaW5lZCBnbG9iYWwgdmFyaWFibGVzIGFuZCBkZWZpbmVkIHBhc3NhYmxlIHBhcmFtZXRlcnMgYXJlIGFzc3VtZWQgCi0JICogdG8gYmUgdXNlZCBpbiB0aGUgZXhpdCBibG9jawotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRFeGl0QmxvY2soTVBJQmxvY2sgZXhpdCl7Ci0JCUxpc3Q8U3RyaW5nPiB1c2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGN1cnJlbnRGdW5jXy5nZXRHbG9iYWxEZWYoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJdXNlLmFkZChpLm5leHQoKSk7Ci0JCX0KLQkJZm9yKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGN1cnJlbnRGdW5jXy5nZXRQYXJhbURlZigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQl1c2UuYWRkKGkubmV4dCgpKTsKLQkJfQotCQkKLQkJZXhpdC5zZXRVc2UodXNlKTsKLQkJZXhpdC5zZXREZWYobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvYW5hbHlzaXMvVXRpbC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2E3ODUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy9hbmFseXNpcy9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgSW50ZXJzZWN0KExpc3QgQSwgTGlzdCBCKXsKLQkJaWYoQSA9PSBudWxsIHx8IEIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKEl0ZXJhdG9yIGkgPSBBLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJaWYoQi5jb250YWlucyhvKSkgbGlzdC5hZGQobyk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoTGlzdCBBLCBMaXN0IEIpewotCQlpZihBID09IG51bGwgJiYgQiA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLQkJaWYoQSA9PSBudWxsICYmIEIgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZihBICE9IG51bGwgJiYgQiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmKEEuc2l6ZSgpICE9IEIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0JCWZvcihJdGVyYXRvciBpID0gQS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJaWYoIUIuY29udGFpbnMoaS5uZXh0KCkpKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBVbmlvbihMaXN0IEEsIExpc3QgQil7Ci0JCWlmKEEgPT0gbnVsbCkgcmV0dXJuIEI7Ci0JCWlmKEIgPT0gbnVsbCkgcmV0dXJuIEE7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoQSk7Ci0JCWZvcihJdGVyYXRvciBpID0gQi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCWlmKCFsaXN0LmNvbnRhaW5zKG8pKSBsaXN0LmFkZChvKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IFVuaW9uKExpc3QgQSwgTGlzdCBCLCBMaXN0IEMpewotCQlyZXR1cm4gVW5pb24oVW5pb24oQSwgQiksIEMpOwotCX0KLQkKLQkvKiAKLQkgKiBAIHJldHVybjogQSAtIEIgCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IE1pbnVzKExpc3QgQSwgTGlzdCBCKXsKLQkJaWYoQi5pc0VtcHR5KCkpIHJldHVybiBBOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihJdGVyYXRvciBpID0gQS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCWlmKCFCLmNvbnRhaW5zKG8pKSBsaXN0LmFkZChvKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyogdG8gPSBVbmlvbih0bywgZnJvbSkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsKExpc3QgdG8sIExpc3QgZnJvbSl7Ci0JCWlmKGZyb20gPT0gbnVsbCkgcmV0dXJuOwotCQlpZihmcm9tLnNpemUoKSA9PSAwKSByZXR1cm47Ci0JCWZvcihJdGVyYXRvciBpID0gZnJvbS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJU3RyaW5nIHMgPSAoU3RyaW5nKWkubmV4dCgpOwotCQkJaWYoIXRvLmNvbnRhaW5zKHMpKQotCQkJCXRvLmFkZChzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgY29weShMaXN0IG9sZGxpc3QpewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihJdGVyYXRvciBpID0gb2xkbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotCQkJbGlzdC5hZGQoaS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvcG9wdXAvYWN0aW9ucy9TaG93TWF0Y2hTZXQuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvcG9wdXAvYWN0aW9ucy9TaG93TWF0Y2hTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2ZWUzMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3BvcHVwL2FjdGlvbnMvU2hvd01hdGNoU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5wb3B1cC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwudWkuZWRpdG9yLkNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5TY2FuUmV0dXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlNvdXJjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5WaWV3QWN0aXZhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5JRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLkJhcnJpZXJUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuTVBJQmFycmllckFuYWx5c2lzUmVzdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuQmFycmllclRhYmxlLkJhcnJpZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3Lk1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBBY3Rpb24gdG8gc2hvdyB0aGUgbWF0Y2hpbmcgc2V0IGZvciBhIGJhcnJpZXIuPGJyPgotICogIE1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBib3Jyb3dlZCBmcm9tIAotICogb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLnRleHR2aWV3LlNob3dDb25jdXJyZW5jeUFjdGlvbi5qYXZhCi0gKi8KLQotcHVibGljIGNsYXNzIFNob3dNYXRjaFNldCBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIAotCQkJCQkJICBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZXsKLQotCXByb3RlY3RlZCBDRWRpdG9yIGVkaXRvcl8gPSBudWxsOwotCXByb3RlY3RlZCBNUElCYXJyaWVyQW5hbHlzaXNSZXN1bHRzIHJlc3VsdHNfID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJTaG93IE1hdGNoIFNldCI7Ci0JCi0JcHVibGljIFNob3dNYXRjaFNldCgpewotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiU2hvd01hdGNoU2V0KCkgY29uc3RydWN0ZWQuLi4iKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcil7Ci0gICAgICAgIGlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBDRWRpdG9yKQotICAgICAgICAgICAgZWRpdG9yXyA9IChDRWRpdG9yKXRhcmdldEVkaXRvcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotICAgICAgICBUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChlZGl0b3JfIT1udWxsICYmIAotICAgICAgICAgICAgZWRpdG9yXy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgc2VsZWN0aW9uID0gKFRleHRTZWxlY3Rpb24pZWRpdG9yXy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VsZWN0aW9uIT1udWxsKSB7Ci0gICAgICAgICAgICBzaG93TWF0Y2hTZXQoc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICAgICAgc2hvd01lc3NhZ2UoVElUTEUsICJObyBzZWxlY3Rpb25zIG1hZGUiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd01lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSl7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGxheT0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpc3BsYXk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd01hdGNoU2V0KFRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKXsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5nZXRPZmZzZXQoKT09MCAmJiBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk9PTApIHsKLSAgICAgICAgICAgIHNob3dNZXNzYWdlKFRJVExFLCAiTm8gc2VsZWN0aW9ucyBtYWRlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCS8qIGZpcnN0IGNsZWFyIGFsbCBleGlzdGluZyBtYXJrZXJzICovCi0JCUlXb3Jrc3BhY2VSb290IHdzUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl0cnkgewotCQkJaW50IGRlcHRoID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCQkJd3NSZXNvdXJjZS5kZWxldGVNYXJrZXJzKElEcy5tYXRjaGluZ1NldE1hcmtlcklELCBmYWxzZSwgZGVwdGgpOwotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSTTogZXhjZXB0aW9uIGRlbGV0aW5nIG1hcmtlcnMuIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHRzXyA9IE1QSUJhcnJpZXJBbmFseXNpc1Jlc3VsdHMuZ2V0QW5hbHlzaXNSZXN1bHRzKCk7Ci0gICAgICAgIGlmIChyZXN1bHRzXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzaG93TWVzc2FnZShUSVRMRSwgIk5vIEJhcnJpZXIgQW5hbHlzaXMgaGFzIGJlZW4gcGVyZm9ybWVkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSUVkaXRvcklucHV0IGlldSA9IGVkaXRvcl8uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgSUZpbGUgZmlsZT0gbnVsbDsKLSAgICAgICAgaWYoaWV1IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCl7Ci0gICAgICAgIAlmaWxlPSgoSUZpbGVFZGl0b3JJbnB1dClpZXUpLmdldEZpbGUoKTsgIC8vIGNkdDQwCi0gICAgICAgIH0KLSAgICAgICAgLy9JRmlsZSBmaWxlID0gZWRpdG9yXy5nZXRJbnB1dEZpbGUoKTsvL2NkdDMxCi0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0gICAgICAgIC8vU3RyaW5nIGZpbGVuYW1lMiA9IFV0aWxpdHkuZ2V0SW5wdXRGaWxlKGVkaXRvcl8pOwotICAgICAgICAvKiBUaGlzIGZpbGVuYW1lIG1heSBub3QgY29udGFpbiB0aGUgRlVMTCBwYXRoIGluZm9ybWF0aW9uICovCi0KLSAgICAgICAgQmFycmllckluZm8gYmFycmllciA9IGZpbmRTZWxlY3RlZEJhcnJpZXIoZmlsZU5hbWUsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0gICAgICAgIGlmKGJhcnJpZXIgPT0gbnVsbCl7Ci0gICAgICAgIAlzaG93TWVzc2FnZShUSVRMRSwgIlBsZWFzZSBzZWxlY3QgYSBiYXJyaWVyIik7Ci0gICAgICAgIAlyZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlbW92ZU1hcmtlcnMoZWRpdG9yXy5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0QW5ub3RhdGlvbk1vZGVsKGVkaXRvcl8uZ2V0RWRpdG9ySW5wdXQoKSkpOwotICAgICAgICAvL3JlZnJlc2ggdGhlIHZpZXcgbGF0ZXIgYW5kIHRoZXNlIGRlbGV0ZWQgbWFya2VycyBzaG91bGQgZGlzYXBwZWFyCi0gICAgICAgIC8vVXNlIGNvbW1vbiBzaGFyZWQgdmFyaWFibGUgZm9yIG1hcmtlcklECi0JCS8vU3RyaW5nIG1hcmtlcklEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5tcGlCYXJyaWVyTWF0Y2hpbmdTZXRNYXJrZXIiOwotIAkJTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvciB2aXNpdG9yID0gbmV3IE1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3IoSURzLm1hdGNoaW5nU2V0TWFya2VySUQpOwotCQkKLSAgICAgICAgLyogRGlzcGxheSBhbGwgbWF0Y2hlZCBiYXJyaWVycyAqLwotIAkJLy8gY3JlYXRlIHRoZSBtYXJrZXJzIGZvciBhbGwgdGhlIG1hdGNoZWQgYmFycmllcnMKLSAJCVN0cmluZyBwYXJlbnROYW1lPSJCYXJyaWVyU2V0TmFtZSI7IC8vIGNoYW5nZSB0byBzb21ldGhpbmcgdGhhdCBtYWtlcyBzZW5zZQotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGJhcnJpZXIuZ2V0TWF0Y2hpbmdTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotICAgICAgICAJQmFycmllckluZm8gbWF0Y2hlZEJhciA9IChCYXJyaWVySW5mbylpLm5leHQoKTsKLSAgICAgICAgCXNob3dOb2RlKG1hdGNoZWRCYXIuZ2V0RnVuYygpLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKSwgIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5tYXRjaHNldCIpOwotICAgICAgICAgICAgU2NhblJldHVybiBzciA9IG5ldyBTY2FuUmV0dXJuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgCVNvdXJjZUluZm8gc291cmNlSW5mbyA9IG1hdGNoZWRCYXIuZ2V0U291cmNlSW5mbygpOwotICAgICAgICAJaW50IGNvbD0xOwotICAgICAgICAJU3RyaW5nIGZpbGVuYW1lPW1hdGNoZWRCYXIuZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgCWludCBsaW5lPXNvdXJjZUluZm8uZ2V0U3RhcnRpbmdMaW5lKCk7Ci0gICAgICAgIAlTdHJpbmcgZm49bWF0Y2hlZEJhci5nZXRFbmNsb3NpbmdGdW5jKCk7Ci0gICAgICAgIAkvL0FydGlmYWN0V2l0aFBhcmVudCBhID0gbmV3IEFydGlmYWN0V2l0aFBhcmVudChmaWxlbmFtZSwgbGluZSwgY29sLCBmbiwiQXJ0aWZhY3QgQ2FsbCIsc291cmNlSW5mbyxwYXJlbnROYW1lKTsKLSAgICAgICAgCS8vc3IuYWRkQXJ0aWZhY3QoYSk7Ci0gICAgICAgIAl2aXNpdG9yLnZpc2l0RmlsZShtYXRjaGVkQmFyLmdldFJlc291cmNlKCksIHNyLmdldEFydGlmYWN0TGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBEb25lIGNyZWF0aW5nIG1hcmtlcnMsIG5vdyBzaG93IHRoZSB2aWV3Ci0gICAgICAgIFZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KElEcy5tYXRjaGluZ1NldFZpZXdJRCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBCYXJyaWVySW5mbyBmaW5kU2VsZWN0ZWRCYXJyaWVyKFN0cmluZyBmaWxlbmFtZSwgaW50IG9mZnNldCl7Ci0gICAgCUJhcnJpZXJUYWJsZSB0YWJsZSA9IHJlc3VsdHNfLmdldEJhcnJpZXJUYWJsZSgpOwotICAgIAlmb3IoRW51bWVyYXRpb24gZSA9IHRhYmxlLmdldFRhYmxlKCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspewotICAgIAkJQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KWUubmV4dEVsZW1lbnQoKTsKLSAgICAJCWZvcihJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspewotICAgIAkJCUJhcnJpZXJJbmZvIGJhciA9IChCYXJyaWVySW5mbylpLm5leHQoKTsKLSAgICAJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbihiYXIuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oYmFyLmdldFNvdXJjZUluZm8oKS5nZXRTdGFydCgpKTsKLSAgICAJCQlpZighYmFyLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgoZmlsZW5hbWUpKSBjb250aW51ZTsKLSAgICAJCQlpZihiYXIuZ2V0U291cmNlSW5mbygpLmdldFN0YXJ0KCkgPT0gb2Zmc2V0KQotICAgIAkJCQlyZXR1cm4gYmFyOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKiBEb24gUGF6ZWwncyBjb2RlIFV0aWxpdHkucmVtb3ZlQ29uY3VycmVuY3lNYXJrZXJzKCkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXJrZXJzKElBbm5vdGF0aW9uTW9kZWwgYW0pCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGFpcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIGZvcihJdGVyYXRvciBhaT1hbS5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsgYWkuaGFzTmV4dCgpOykgeyBhaXMuYWRkKGFpLm5leHQoKSk7IH0KLSAgICAgICAgZm9yKEl0ZXJhdG9yIGl0PWFpcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbilpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMubWF0Y2hzZXQiKSkgewotICAgICAgICAgICAgICAgIGFtLnJlbW92ZUFubm90YXRpb24oYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd05vZGUoSUFTVE5vZGUgbm9kZSwgU3RyaW5nIG1hcmtlclR5cGUpCi0gICAgewotICAgICAgICBVdGlsaXR5LkxvY2F0aW9uIGwgPSBVdGlsaXR5LmdldExvY2F0aW9uKG5vZGUpOyAKLQotICAgICAgICAKLSAgICAgICAgSUFubm90YXRpb25Nb2RlbCBhbSA9IGVkaXRvcl8uZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChlZGl0b3JfLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2UgbmVlZCB0byBhZGQgYW4gYW5ub3RhdGlvbiB0eXBlIHRvIHRoZSBhbm5vdGF0aW9uIHBhaW50ZXIgKHNlZSBTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCkKLSAgICAgICAgQW5ub3RhdGlvbiBhID0gbmV3IEFubm90YXRpb24obWFya2VyVHlwZSwgdHJ1ZSwgIkhpIik7Ci0gICAgICAgIGludCBlbmQgPSBsLmhpZ2hfLWwubG93XysxOwotICAgICAgICBQb3NpdGlvbiAgIHAgPSBuZXcgUG9zaXRpb24obC5sb3dfLCBlbmQpOwotICAgICAgICBhbS5hZGRBbm5vdGF0aW9uKGEsIHApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9BcnRpZmFjdFdpdGhQYXJlbnQuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9BcnRpZmFjdFdpdGhQYXJlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjMmY2ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvQXJ0aWZhY3RXaXRoUGFyZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5Tb3VyY2VJbmZvOwotCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RXaXRoUGFyZW50IGV4dGVuZHMgQXJ0aWZhY3QgewotCXByaXZhdGUgaW50IHBhcmVudElEOwotCXByaXZhdGUgaW50IG15SUQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGludCBpbmRleDsKLQotCXB1YmxpYyBBcnRpZmFjdFdpdGhQYXJlbnQoU3RyaW5nIGZpbGVOYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGZ1bmNOYW1lLCBTdHJpbmcgZGVzYywgIC8qU3RyaW5nIHByaW1hcnlGaWxlTmFtZSwqLwotCQkJU291cmNlSW5mbyBzb3VyY2VJbmZvLCBpbnQgcGFyZW50SUQsIGludCBteUlELCBTdHJpbmcgbmFtZSwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKGZpbGVOYW1lLCBsaW5lLCBjb2x1bW4sIGZ1bmNOYW1lLCBkZXNjLCBzb3VyY2VJbmZvKTsKLQkJdGhpcy5wYXJlbnRJRCA9IHBhcmVudElEOwotCQl0aGlzLm15SUQgPSBteUlEOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0JcHVibGljIGludCBnZXRQYXJlbnRJRCgpIHsKLQkJcmV0dXJuIHBhcmVudElEOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE15SUQoKXsKLQkJcmV0dXJuIG15SUQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TXlOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRJbmRleCgpewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L0JhcnJpZXJBcnRpZmFjdHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9CYXJyaWVyQXJ0aWZhY3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODYzNzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L0JhcnJpZXJBcnRpZmFjdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuU291cmNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpcy5NUElDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5hbmFseXNpcy5CYXJyaWVyVGFibGUuQmFycmllckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuSUNhbGxHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoTm9kZTsKLQotcHVibGljIGNsYXNzIEJhcnJpZXJBcnRpZmFjdHMgewotCXByaXZhdGUgSUNhbGxHcmFwaCBDR187Ci0JcHJpdmF0ZSBTY2FuUmV0dXJuIHNjYW5SZXR1cm5fOwotCXByaXZhdGUgTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvciB2aXNpdG9yXzsKLQlwcml2YXRlIFN0cmluZyBtYXJrZXJJRCA9IElEcy5iYXJyaWVyTWFya2VySUQ7Ci0JcHVibGljIEJhcnJpZXJBcnRpZmFjdHMoSUNhbGxHcmFwaCBjZywgTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvciB2aXNpdG9yKXsKLQkJQ0dfID0gY2c7Ci0JCXZpc2l0b3JfID0gdmlzaXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCl7Ci0JCS8qIGZpcnN0IGNsZWFyIGFsbCBleGlzdGluZyBtYXJrZXJzICovCi0JCUlXb3Jrc3BhY2VSb290IHdzUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl0cnkgewotCQkJaW50IGRlcHRoID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCQkJd3NSZXNvdXJjZS5kZWxldGVNYXJrZXJzKG1hcmtlcklELCBmYWxzZSwgZGVwdGgpOwotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSTTogZXhjZXB0aW9uIGRlbGV0aW5nIG1hcmtlcnMuIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotCQlmb3IoSUNhbGxHcmFwaE5vZGUgbiA9ICBDR18udG9wRW50cnkoKTsgbiAhPSBudWxsOyBuID0gbi50b3BOZXh0KCkpewotCQkJTVBJQ2FsbEdyYXBoTm9kZSBub2RlID0gKE1QSUNhbGxHcmFwaE5vZGUpbjsKLQkJCUxpc3Q8QmFycmllckluZm8+IGJhcnJpZXJzID0gbm9kZS5nZXRBbGxCYXJyaWVycygpOwotCQkJc2NhblJldHVybl8gPSBuZXcgU2NhblJldHVybigpOwotCQkJZm9yKEl0ZXJhdG9yPEJhcnJpZXJJbmZvPiBpID0gYmFycmllcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KXsKLQkJCQlCYXJyaWVySW5mbyBiYXIgPSBpLm5leHQoKTsKLQkJCQlTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBiYXIuZ2V0U291cmNlSW5mbygpOwotCQkJCUFydGlmYWN0V2l0aFBhcmVudCBhd3AgPSBuZXcgQXJ0aWZhY3RXaXRoUGFyZW50KG5vZGUuZ2V0RmlsZU5hbWUoKSwgCi0JCQkJCQlzb3VyY2VJbmZvLmdldFN0YXJ0aW5nTGluZSgpLCAxLCBub2RlLmdldEZ1bmNOYW1lKCksIAotCQkJCQkJIkFydGlmYWN0IENhbGwiLCBzb3VyY2VJbmZvLCAwLCAwLCAiIiwKLQkJCQkJCWJhci5nZXRJRCgpLTQpOwotCQkJCXNjYW5SZXR1cm5fLmFkZEFydGlmYWN0KGF3cCk7Ci0JCQl9Ci0JCQl2aXNpdG9yXy52aXNpdEZpbGUobm9kZS5nZXRSZXNvdXJjZSgpLCBzY2FuUmV0dXJuXy5nZXRBcnRpZmFjdExpc3QoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L01QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0MzNlOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3RNYXJraW5nVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvciBleHRlbmRzIEFydGlmYWN0TWFya2luZ1Zpc2l0b3J7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotCQotCXB1YmxpYyBNUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKFN0cmluZyBtYXJrZXJJRCl7Ci0JCXN1cGVyKG1hcmtlcklEKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXJrZXJJRCgpIHtyZXR1cm4gbWFya2VySURfO30KLQkKLQkvKioKLQkgKiAgVmlzaXQgZmlsZSwgYnV0IGRvbid0IHJlbW92ZSBleGlzdGluZyBtYXJrZXJzIAotCSAqICAqLwotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0RmlsZShJUmVzb3VyY2UgcmVzb3VyY2UsIEFydGlmYWN0W10gYXJ0aWZhY3RzKQotICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3RNYXJraW5nVmlzaXRvci52aXNpdEZpbGU6ICIgKyByZXNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgLy9yZW1vdmVNYXJrZXJzKHJlc291cmNlLCB0aGlzLm1hcmtlcklEXyk7Ci0gICAgICAgICAgICBpbnQgbnVtQXJ0aWZhY3RzPWFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3RzKCkubGVuZ3RoOwotICAgICAgICAgICAgaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIm51bUFydGlmYWN0czogIitudW1BcnRpZmFjdHMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgZm4gPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgaWYgKGFydGlmYWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlTWFya2VycyhyZXNvdXJjZSwgZm4sIGFydGlmYWN0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgbWFya2VyIGZvciB0aGUgYXJ0aWZhY3Q7IGxpa2UgdGhlIHN1cGVyIGNsYXNzIAotICAgICAqIHZlcnNpb24gb2YgdGhpcywgYnV0IGFsc28gYWRkcyB0aGUgcGFyZW50IG5hbWUgZnJvbSBBcnRpZmFjdFdpdGhQYXJlbnQgLSBmb3IgdXNlIGluIHRoZSB0cmVlIHZpZXcKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiBAcGFyYW0gZm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBcnRpZmFjdE1hcmtlcihJUmVzb3VyY2UgcmVzb3VyY2UsIEFydGlmYWN0IGFydGlmYWN0LCBTdHJpbmcgZm4pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCSAgICBpZiAodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdCBkZXNjPSIgKyBhcnRpZmFjdC5nZXRTaG9ydE5hbWUoKSArICIgIGZuPSIgKyBmbik7Ci0JICAgIE1hcCBhdHRycyA9IGNyZWF0ZUNvbW1vbk1hcmtlckF0dHJzKHJlc291cmNlLCBhcnRpZmFjdCwgZm4pOwotCSAgICAvLyBtZXNzYWdlIGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgZm9yIGhvdmVyIG92ZXIgZWRpdG9yIGxvY2F0aW9uCi0JICAgIGF0dHJzLnB1dChJTWFya2VyLk1FU1NBR0UsIGFydGlmYWN0LmdldFNob3J0TmFtZSgpKTsKLQkgICAgCi0JICAgIC8vIEdldCB0aGUgcGFyZW50IG5hbWUgb3V0IG9mIHRoZSBhcnRpZmFjdCwgdG8gcGxhY2UgaW4gdGhlIG1hcmtlcgotCSAgICBBcnRpZmFjdFdpdGhQYXJlbnQgYXdwPShBcnRpZmFjdFdpdGhQYXJlbnQpYXJ0aWZhY3Q7Ci0JICAgIFN0cmluZyBwYXJlbnRBdHRyPUlEcy5wYXJlbnRBdHRyaWJOYW1lOwotCSAgICAvL1N0cmluZyBwYXJlbnROYW1lPWF3cC5nZXRQYXJlbnROYW1lKCk7Ci0JICAgIC8vYXR0cnMucHV0KHBhcmVudEF0dHIsIHBhcmVudE5hbWUpOwotICAgIAlhdHRycy5wdXQoSURzLnBhcmVudElEQXR0ciwgbmV3IEludGVnZXIoYXdwLmdldFBhcmVudElEKCkpKTsKLSAgICAJYXR0cnMucHV0KElEcy5teUlEQXR0ciwgbmV3IEludGVnZXIoYXdwLmdldE15SUQoKSkpOwotICAgIAlhdHRycy5wdXQoSURzLm15TmFtZUF0dHIsIGF3cC5nZXRNeU5hbWUoKSk7Ci0gICAgCWF0dHJzLnB1dChJRHMubXlJbmRleEF0dHIsIG5ldyBJbnRlZ2VyKGF3cC5nZXRJbmRleCgpKSk7Ci0JICAgIAotCSAgICAvLyBjcmVhdGUgdGhlIG1hcmtlciBhbGwgYXQgb25jZSwgc28gZ2V0IE9OTFkgYSBzaW5nbGUgcmVzb3VyY2VDaGFuZ2UgZXZlbnQuCi0JICAgIE1hcmtlclV0aWxpdGllcy5jcmVhdGVNYXJrZXIocmVzb3VyY2UsIGF0dHJzLCB0aGlzLm1hcmtlcklEXyk7ICAvLyAxNTQKLQkgICAgaWYgKHRyYWNlT24pCi0JICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1hcmtlciBjcmVhdGVkOiBmb3IgIiArIGZuICsgIiAtICIgKyBhcnRpZmFjdC5nZXRTaG9ydE5hbWUoKSArICIgbGluZSAiCi0JICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0TGluZSgpICsgIiBzdGFydCAiICsgYXJ0aWZhY3QuZ2V0U291cmNlSW5mbygpLmdldFN0YXJ0KCkgKyAiIGVuZCAiCi0JICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0U291cmNlSW5mbygpLmdldEVuZCgpKTsKLQkgICAgCi0JICAgIGFydGlmYWN0TWFuYWdlcl8uYWRkQXJ0aWZhY3RUb0hhc2goYXJ0aWZhY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9NUElCYXJyaWVyTWF0Y2hpbmdTZXRWaWV3LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTVBJQmFycmllck1hdGNoaW5nU2V0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDY1MWUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9NUElCYXJyaWVyTWF0Y2hpbmdTZXRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLnZpZXc7Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi52aWV3cy5TaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLklEczsKLQotCi0vKioKLSAqIFNob3cgdGhlIG1lbWJlcnMgb2YgYSBiYXJyaWVyIG1hdGNoaW5nIHNldCwgaW4gYSB0cmVlIHRhYmxlIHZpZXcuCi0gKiAKLSAqIFRPRE86IHRyeSB0byB1c2UgIGNsYXNzIGZyb20gJ2NvbW1vbicgcGFja2FnZSBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElCYXJyaWVyTWF0Y2hpbmdTZXRWaWV3IGV4dGVuZHMgU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldyB7Ci0JcHVibGljIE1QSUJhcnJpZXJNYXRjaGluZ1NldFZpZXcoKSB7Ci0KLQkJc3VwZXIoQWN0aXZhdG9yLmdldERlZmF1bHQoKSwgIkZ1bmN0aW9uTmFtZSIsICJNYXRjaGluZyBTZXQgQXJ0aWZhY3RzIiwgCi0JCQkJIkluZGV4TnVtIiwgSURzLm1hdGNoaW5nU2V0TWFya2VySUQgLyosICBjb21tb24gdmVyIG5lZWRzOiJwYXJlbnQiKi8gKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTVBJQmFycmllclZpZXcuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9NUElCYXJyaWVyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEzOTY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9NUElCYXJyaWVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3OwotCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udmlld3MuU2ltcGxlVGFibGVWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLklEczsKLSAvKioKLSAgKiBWaWV3IHRvIHNob3cgbGlzdCBvZiBiYXJyaWVycyAKLSAgKiAKLSAgKiBUT0RPOiB0aGlzIHNob3VsZCB1c2UgdGhlIFNpbXBsZVRhYmxlVmlldyBmcm9tIHRoZSAnY29tbW9uJyBwYWNrYWdlLAotICAqIHdoaWNoIEknbSBob3BpbmcgdGhlIG90aGVyIHZpZXcgY2FuIGV2ZW50dWFsbHkgZG8gYXMgd2VsbCAocmV1c2UgdmlldwotICAqIGNsYXNzZXMgZnJvbSB0aGF0IHBhY2thZ2UpCi0gICogVE9ETzogcmVwbGFjZSBjb2x1bW4gaGVhZGVyIGZyb20gJ2NvbW1vbicgcGFja2FnZSB2aWV3IGNsYXNzCi0gICovCi0vL3B1YmxpYyBjbGFzcyBNUElCYXJyaWVyVmlldyBleHRlbmRzIFNpbXBsZVRhYmxlVmlldyB7Ly8gdXNlIGNvbW1vbiBjbGFzcwotcHVibGljIGNsYXNzIE1QSUJhcnJpZXJWaWV3IGV4dGVuZHMgU2ltcGxlVGFibGVCYXJyaWVyVmlldyB7Ly9vcmlnaW5hbAotCXB1YmxpYyBNUElCYXJyaWVyVmlldygpIHsKLQotCQlzdXBlcihBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLCAiRnVuY3Rpb24iLCAiQmFycmllciBBcnRpZmFjdHMiLAotCQkJCSJJbmRleE5vIiwgSURzLmJhcnJpZXJNYXJrZXJJRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTVBJRXJyb3JWaWV3LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTVBJRXJyb3JWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YmE3OGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L01QSUVycm9yVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3OwotCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udmlld3MuU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5JRHM7Ci0KLS8vcHVibGljIGNsYXNzIE1QSUVycm9yVmlldyBleHRlbmRzIFNpbXBsZVRyZWVUYWJsZUVycm9yVmlldyB7Ci0vKioKLSAqIFZpZXcgdG8gc2hvdyBsaXN0IG9mIGJhcnJpZXIgZXJyb3JzIFtuZXcgdmlldyBhcmNoaXRlY3R1cmVdCi0gKiAKLSAqIFRPRE86IHRyeSB0byByZXBsYWNlIHdpdGggdmlldyBjbGFzcyBmcm9tICdjb21tb24nIHBhY2thZ2UKLSAqLwotcHVibGljIGNsYXNzIE1QSUVycm9yVmlldyBleHRlbmRzIFNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcgewotCXB1YmxpYyBNUElFcnJvclZpZXcoKSB7Ci0KLQkJc3VwZXIoQWN0aXZhdG9yLmdldERlZmF1bHQoKSwgIkZ1bmN0aW9uTmFtZSIsICJNYXRjaGluZyBTZXQgQXJ0aWZhY3RzIiwgIkluZGV4TnVtIiwKLQkJCQlJRHMuZXJyb3JNYXJrZXJJRC8qIGNvbW1vbiBuZWVkczosIElEcy5wYXJlbnRJREF0dHIqLyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvTWF0Y2hpbmdTZXQuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9NYXRjaGluZ1NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjEzNmY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9NYXRjaGluZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuU291cmNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5WaWV3QWN0aXZhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5JRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLkJhcnJpZXJUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuQmFycmllclRhYmxlLkJhcnJpZXJJbmZvOwotCi1wdWJsaWMgY2xhc3MgTWF0Y2hpbmdTZXQgewotCXByb3RlY3RlZCBCYXJyaWVyVGFibGUgYnRhYmxlXyA9IG51bGw7Ci0JCi0JcHVibGljIE1hdGNoaW5nU2V0KEJhcnJpZXJUYWJsZSB0YWJsZSl7Ci0JCWJ0YWJsZV8gPSB0YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCl7Ci0JCUlXb3Jrc3BhY2VSb290IHdzUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl0cnkgewotCQkJaW50IGRlcHRoID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCQkJd3NSZXNvdXJjZS5kZWxldGVNYXJrZXJzKElEcy5tYXRjaGluZ1NldE1hcmtlcklELCBmYWxzZSwgZGVwdGgpOwotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSTTogZXhjZXB0aW9uIGRlbGV0aW5nIG1hcmtlcnMuIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0JCQotCQlNUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihJRHMubWF0Y2hpbmdTZXRNYXJrZXJJRCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIG1hcmtlcnMgZm9yIGFsbCB0aGUgbWF0Y2hlZCBiYXJyaWVycwotCQlmb3IoRW51bWVyYXRpb24gZSA9IGJ0YWJsZV8uZ2V0VGFibGUoKS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyl7Ci0JCQlBcnJheUxpc3QgYmFycmllckxpc3QgPSAoQXJyYXlMaXN0KWUubmV4dEVsZW1lbnQoKTsKLQkJCWZvcihJdGVyYXRvciBpaSA9IGJhcnJpZXJMaXN0Lml0ZXJhdG9yKCk7IGlpLmhhc05leHQoKTspewotCQkJCUJhcnJpZXJJbmZvIGJhcnJpZXIgPSAoQmFycmllckluZm8paWkubmV4dCgpOwotCQkJCWNvdW50ICsrOwotCQkJCWludCBwYXJlbnRJRCA9IGNvdW50OwotCQkJCVN0cmluZyBuYW1lID0gIkJhcnJpZXIgIiArIChiYXJyaWVyLmdldElEKCktNCkgKyAiICgiICsgYmFycmllci5nZXRNYXRjaGluZ1NldCgpLnNpemUoKSArICIpIjsKLQkJCQkvLyBjcmVhdGUgYSBtYXJrZXIgZm9yIGVhY2ggcGFyZW50KGJhcnJpZXIpCi0JCQkJU2NhblJldHVybiBzciA9IG5ldyBTY2FuUmV0dXJuKCk7Ci0JICAgICAgICAJU291cmNlSW5mbyBzb3VyY2VJbmZvID0gYmFycmllci5nZXRTb3VyY2VJbmZvKCk7Ci0JICAgICAgICAJU3RyaW5nIGZpbGVuYW1lID0gYmFycmllci5nZXRGaWxlTmFtZSgpOwotCSAgICAgICAgCWludCBsaW5lID0gc291cmNlSW5mby5nZXRTdGFydGluZ0xpbmUoKTsKLQkgICAgICAgIAlTdHJpbmcgZm4gPSBiYXJyaWVyLmdldEVuY2xvc2luZ0Z1bmMoKTsKLQkgICAgICAgIAlBcnRpZmFjdFdpdGhQYXJlbnQgYSA9IG5ldyBBcnRpZmFjdFdpdGhQYXJlbnQoZmlsZW5hbWUsIGxpbmUsIDEsIGZuLAotCSAgICAgICAgCQkJIkFydGlmYWN0IENhbGwiLCBzb3VyY2VJbmZvLCAwLCBwYXJlbnRJRCwgbmFtZSwgYmFycmllci5nZXRJRCgpLTQpOwotCSAgICAgICAgCXNyLmFkZEFydGlmYWN0KGEpOwotCSAgICAgICAgCXZpc2l0b3IudmlzaXRGaWxlKGJhcnJpZXIuZ2V0UmVzb3VyY2UoKSwgc3IuZ2V0QXJ0aWZhY3RMaXN0KCkpOwotCQkJCQotCQkJCWZvcihJdGVyYXRvciBpID0gYmFycmllci5nZXRNYXRjaGluZ1NldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQkJCUJhcnJpZXJJbmZvIG1hdGNoZWRCYXIgPSAoQmFycmllckluZm8paS5uZXh0KCk7Ci0JCQkJCWNvdW50ICsrOwotCQkJCQlpbnQgbXlJRCA9IGNvdW50OwotCQkJCQluYW1lID0gIkJhcnJpZXIgIiArIChtYXRjaGVkQmFyLmdldElEKCktNCk7Ci0JCQkJCXNyID0gbmV3IFNjYW5SZXR1cm4oKTsKLQkJICAgICAgICAJc291cmNlSW5mbyA9IG1hdGNoZWRCYXIuZ2V0U291cmNlSW5mbygpOwotCQkgICAgICAgIAlmaWxlbmFtZSA9IG1hdGNoZWRCYXIuZ2V0RmlsZU5hbWUoKTsKLQkJICAgICAgICAJbGluZSA9IHNvdXJjZUluZm8uZ2V0U3RhcnRpbmdMaW5lKCk7Ci0JCSAgICAgICAgCWZuID0gbWF0Y2hlZEJhci5nZXRFbmNsb3NpbmdGdW5jKCk7Ci0JCSAgICAgICAgCWEgPSBuZXcgQXJ0aWZhY3RXaXRoUGFyZW50KGZpbGVuYW1lLCBsaW5lLCAxLCBmbiwiQXJ0aWZhY3QgQ2FsbCIsCi0JCSAgICAgICAgCQkJc291cmNlSW5mbywgcGFyZW50SUQsIG15SUQsIG5hbWUsIG1hdGNoZWRCYXIuZ2V0SUQoKS00KTsKLQkJICAgICAgICAJc3IuYWRkQXJ0aWZhY3QoYSk7Ci0JCSAgICAgICAgCXZpc2l0b3IudmlzaXRGaWxlKG1hdGNoZWRCYXIuZ2V0UmVzb3VyY2UoKSwgc3IuZ2V0QXJ0aWZhY3RMaXN0KCkpOwotCQkgICAgICAgIH0KLQkJICAgICAgICAKLQkJCX0KLQkJfQotICAgICAgICAvLyBEb25lIGNyZWF0aW5nIG1hcmtlcnMsIG5vdyBzaG93IHRoZSB2aWV3Ci0gICAgICAgIFZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KElEcy5tYXRjaGluZ1NldFZpZXdJRCk7Ci0JfQotCQotCS8qCi0JICAgcHJvdGVjdGVkIHZvaWQgc2hvd05vZGUoSUFTVE5vZGUgbm9kZSwgU3RyaW5nIG1hcmtlclR5cGUpCi0JICAgIHsKLQkgICAgICAgIFV0aWxpdHkuTG9jYXRpb24gbCA9IFV0aWxpdHkuZ2V0TG9jYXRpb24obm9kZSk7Ci0JICAgICAgICAKLQkgICAgICAgIElBbm5vdGF0aW9uTW9kZWwgYW0gPSBlZGl0b3JfLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZWRpdG9yXy5nZXRFZGl0b3JJbnB1dCgpKTsKLQkgICAgICAgIAotCSAgICAgICAgLy8gV2UgbmVlZCB0byBhZGQgYW4gYW5ub3RhdGlvbiB0eXBlIHRvIHRoZSBhbm5vdGF0aW9uIHBhaW50ZXIgKHNlZSBTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCkKLQkgICAgICAgIEFubm90YXRpb24gYSA9IG5ldyBBbm5vdGF0aW9uKG1hcmtlclR5cGUsIHRydWUsICJIaSIpOwotCSAgICAgICAgaW50IGVuZCA9IGwuaGlnaF8tbC5sb3dfKzE7Ci0JICAgICAgICBQb3NpdGlvbiAgIHAgPSBuZXcgUG9zaXRpb24obC5sb3dfLCBlbmQpOwotCSAgICAgICAgYW0uYWRkQW5ub3RhdGlvbihhLCBwKTsKLQkgICAgfQotCSovCi0JCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvU2hvd0Vycm9ycy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L1Nob3dFcnJvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5YTI5Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvU2hvd0Vycm9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuU291cmNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5WaWV3QWN0aXZhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5JRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmFuYWx5c2lzLkJhcnJpZXJUYWJsZS5CYXJyaWVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuTVBJQmFycmllck1hdGNoaW5nLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuYW5hbHlzaXMuTVBJQmFycmllck1hdGNoaW5nLlBhdGhOb2RlOwotCi0vKioKLSAqIEZvciB0aGUgbGlzdCBvZiBFcnJvck1lc3NhZ2Ugb2JqZWN0cyBnaXZlbiB0byB0aGlzIGNsYXNzLAotICogaXRlcmF0ZSB0aHJvdWdoIHRoZW0gYW5kIGNyZWF0ZSBwYXJlbnQgYW5kIGNoaWxkIG5vZGUgZ3JvdXBzIG9mCi0gKiBtYXJrZXJzIGZvciBlYWNoIGVycm9yLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNob3dFcnJvcnMgewotCXByb3RlY3RlZCBMaXN0PEVycm9yTWVzc2FnZT4gZXJyb3JzXzsKLQlwcm90ZWN0ZWQgaW50IGNvdW50ZXIgPSAwOwotCQotCXB1YmxpYyBTaG93RXJyb3JzKExpc3Q8RXJyb3JNZXNzYWdlPiBlcnJvcnMpewotCQl0aGlzLmVycm9yc18gPSBlcnJvcnM7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlcnJvcnMgZm91bmQKLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIHJ1bigpewotCQlib29sZWFuIGZvdW5kRXJyb3JzPWZhbHNlOwotCQlJV29ya3NwYWNlUm9vdCB3c1Jlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IElSZXNvdXJjZS5ERVBUSF9JTkZJTklURTsKLQkJCXdzUmVzb3VyY2UuZGVsZXRlTWFya2VycyhJRHMuZXJyb3JNYXJrZXJJRCwgZmFsc2UsIGRlcHRoKTsKLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUk06IGV4Y2VwdGlvbiBkZWxldGluZyBtYXJrZXJzLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCQkKLSAgICAgICAgLy9UT0RPOiBjaGFuZ2UgdGhpcyB2aXNpdG9yCi0JCU1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3IgdmlzaXRvciA9IG5ldyBNUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKElEcy5lcnJvck1hcmtlcklEKTsKLQkJCi0JCS8qIFR3byBraW5kcyBvZiBBcnRpZmFjdHM6IAotCQkgKiAoMSkgZXJyb3JvdXMgY29uZGl0aW9ucwotCQkgKiAoMikgYmFycmllcnMgaW4gY291bnRlciBleGFtcGxlcwotCQkgKi8KLQkJCi0JCWZvcihJdGVyYXRvcjxFcnJvck1lc3NhZ2U+IGkgPSBlcnJvcnNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyl7Ci0JCQlFcnJvck1lc3NhZ2UgZXJyID0gaS5uZXh0KCk7Ci0JCQkKLQkJCS8qIEVycm9yIGNvbmRpdGlvbiAqLwotCQkJY291bnRlciArKzsKLQkJCWludCBjb25kSUQgPSBjb3VudGVyOwotCQkJU2NhblJldHVybiBzciA9IG5ldyBTY2FuUmV0dXJuKCk7Ci0JCQlTdHJpbmcgZnVuY05hbWUgPSBlcnIuZ2V0RnVuY05hbWUoKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGVyci5nZXRGaWxlTmFtZSgpOwotCQkJU291cmNlSW5mbyBzb3VyY2VJbmZvID0gZXJyLmdldFNvdXJjZUluZm8oKTsKLQkJCUFydGlmYWN0V2l0aFBhcmVudCBlYSA9IG5ldyBBcnRpZmFjdFdpdGhQYXJlbnQoZmlsZU5hbWUsIAotCQkJCQlzb3VyY2VJbmZvLmdldFN0YXJ0aW5nTGluZSgpLCAxLCAKLQkJCQkJZnVuY05hbWUsICJFcnJvbmVvdXMgQ29uZGl0aW9uIiwgc291cmNlSW5mbywgMCwgY29uZElELCAiRXJyb3IiLCAwKTsKLQkJCXNyLmFkZEFydGlmYWN0KGVhKTsKLSAgICAgICAgCXZpc2l0b3IudmlzaXRGaWxlKGVyci5nZXRSZXNvdXJjZSgpLCBzci5nZXRBcnRpZmFjdExpc3QoKSk7Ci0gICAgICAgIAkKLSAgICAgICAgCS8qIFBhdGggMSAoYW5kIDIpICovCi0gICAgICAgIAljb3VudGVyICsrOwotICAgICAgICAJaW50IHBhdGgxSUQgPSBjb3VudGVyOwotICAgICAgICAJU3RyaW5nIHBhdGgxbmFtZSA9IChTdHJpbmcpbnVsbDsKLSAgICAgICAgCWlmKGVyci5nZXRMZW5ndGgxKCkgPT0gLTEpewotICAgICAgICAJCWlmKGVyci5nZXRQYXRoMigpICE9IG51bGwpCi0gICAgICAgIAkJCXBhdGgxbmFtZSA9ICJQYXRoIDEgKGR5bmFtaWMgbnVtYmVyIG9mIGJhcnJpZXJzKSI7Ci0gICAgICAgIAkJZWxzZQotICAgICAgICAJCQlwYXRoMW5hbWUgPSAiTG9vcCAoZHluYW1pYyBudW1iZXIgb2YgYmFycmllcnMpIjsKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJcGF0aDFuYW1lID0gIlBhdGggMSAoIiArIGVyci5nZXRMZW5ndGgxKCkgKyAiIGJhcnJpZXIocykpIjsKLSAgICAgICAgCX0KLSAgICAgICAgCXNyID0gbmV3IFNjYW5SZXR1cm4oKTsKLSAgICAgICAgCWVhID0gbmV3IEFydGlmYWN0V2l0aFBhcmVudCgiIiwgMCwgMCwgIiIsICJDb3VudGVyIEV4YW1wbGUiLAotICAgICAgICAJCQllcnIuZ2V0UGF0aDFTb3VyY2VJbmZvKCksIGNvbmRJRCwgcGF0aDFJRCwgcGF0aDFuYW1lLCAwKTsKLSAgICAgICAgCXNyLmFkZEFydGlmYWN0KGVhKTsKLSAgICAgICAgCQotICAgICAgICAJaW50IHBhdGgySUQgPSAwOwotICAgICAgICAJaWYoZXJyLmdldFBhdGgyKCkgIT0gbnVsbCl7Ci0JICAgIAkJY291bnRlciArKzsKLQkgICAgCQlwYXRoMklEID0gY291bnRlcjsKLQkgICAgICAgICAgIAlTdHJpbmcgcGF0aDJuYW1lID0gKFN0cmluZyludWxsOwotCSAgICAgICAgCWlmKGVyci5nZXRMZW5ndGgyKCkgPT0gLTEpewotCSAgICAgICAgCQlwYXRoMm5hbWUgPSAiUGF0aCAyIChkeW5hbWljIG51bWJlciBvZiBiYXJyaWVycykiOwotCSAgICAgICAgCX0gZWxzZSB7Ci0JICAgICAgICAJCXBhdGgybmFtZSA9ICJQYXRoIDIgKCIgKyBlcnIuZ2V0TGVuZ3RoMigpICsgIiBiYXJyaWVyKHMpKSI7Ci0JICAgICAgICAJfQotCSAgICAJCWVhID0gbmV3IEFydGlmYWN0V2l0aFBhcmVudCgiIiwgMCwgMCwgIiIsICJDb3VudGVyIEV4YW1wbGUiLAotCSAgICAJCQkJZXJyLmdldFBhdGgyU291cmNlSW5mbygpLCBjb25kSUQsIHBhdGgySUQsIHBhdGgybmFtZSwgMCk7Ci0JICAgIAkJc3IuYWRkQXJ0aWZhY3QoZWEpOwotCSAgICAgICAgCX0KLSAgICAgICAgCXZpc2l0b3IudmlzaXRGaWxlKGVyci5nZXRSZXNvdXJjZSgpLCBzci5nZXRBcnRpZmFjdExpc3QoKSk7Ci0KLSAgICAgICAgCS8qIENvdW50ZXIgZXhhbXBsZSBjb250ZW50ICovCi0gICAgICAgIAlmb3IoSXRlcmF0b3I8UGF0aE5vZGU+IGlpID0gZXJyLmdldFBhdGgxKCkuaXRlcmF0b3IoKTsgaWkuaGFzTmV4dCgpOyl7Ci0gICAgICAgIAkJUGF0aE5vZGUgcG4gPSBpaS5uZXh0KCk7Ci0gICAgICAgIAkJQmFycmllckluZm8gYmFycmllciA9IHBuLmdldEJhcnJpZXIoKTsKLSAgICAgICAgCQljb3VudGVyICsrOwotCQkJCXNyID0gbmV3IFNjYW5SZXR1cm4oKTsKLQkgICAgICAgIAlzb3VyY2VJbmZvID0gYmFycmllci5nZXRTb3VyY2VJbmZvKCk7Ci0JICAgICAgICAJZmlsZU5hbWUgPSBiYXJyaWVyLmdldEZpbGVOYW1lKCk7Ci0JICAgICAgICAJZnVuY05hbWUgPSBiYXJyaWVyLmdldEVuY2xvc2luZ0Z1bmMoKTsKLQkgICAgICAgIAlTdHJpbmcgYmFycmllck5hbWUgPSAoU3RyaW5nKW51bGw7Ci0JICAgICAgICAJLy8gQlJUIE5vdGUhIFRoaXMgaXMgd2hlcmUgdGhlIGJhcnJpZXIgbWF0Y2hpbmcgc2V0IGxhYmVscyBhcmUuCi0JICAgICAgICAJLy8gQ29uc2lkZXIgY2hhbmdpbmcgdGhlIHBhcmVudCBub2RlIHRvICJCYXJyaWVyIFNldCIKLQkgICAgICAgIAlpZihwbi5pc1JlcGVhdCgpKQotCSAgICAgICAgCQliYXJyaWVyTmFtZSA9ICJCYXJyaWVyICIgKyAoYmFycmllci5nZXRJRCgpIC00KSArICIoKikiOwotCSAgICAgICAgCWVsc2UKLQkgICAgICAgIAkJYmFycmllck5hbWUgPSAiQmFycmllciAiICsgKGJhcnJpZXIuZ2V0SUQoKSAtNCk7Ci0JICAgICAgICAJQXJ0aWZhY3RXaXRoUGFyZW50IGEgPSBuZXcgQXJ0aWZhY3RXaXRoUGFyZW50KGZpbGVOYW1lLAotCSAgICAgICAgCQkJc291cmNlSW5mby5nZXRTdGFydGluZ0xpbmUoKSwgMSwgZnVuY05hbWUsIAotCSAgICAgICAgCQkJIkJhcnJpZXIiLCBzb3VyY2VJbmZvLCBwYXRoMUlELCBjb3VudGVyLCBiYXJyaWVyTmFtZSwgCi0JICAgICAgICAJCQliYXJyaWVyLmdldElEKCktNCk7Ci0JICAgICAgICAJc3IuYWRkQXJ0aWZhY3QoYSk7Ci0JICAgICAgICAJdmlzaXRvci52aXNpdEZpbGUoYmFycmllci5nZXRSZXNvdXJjZSgpLCBzci5nZXRBcnRpZmFjdExpc3QoKSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLSAgICAgICAgCWlmKGVyci5nZXRQYXRoMigpID09IG51bGwpIGNvbnRpbnVlOwotICAgICAgICAJZm9yKEl0ZXJhdG9yPFBhdGhOb2RlPiBpaSA9IGVyci5nZXRQYXRoMigpLml0ZXJhdG9yKCk7IGlpLmhhc05leHQoKTspewotICAgICAgICAJCVBhdGhOb2RlIHBuID0gaWkubmV4dCgpOwotICAgICAgICAJCUJhcnJpZXJJbmZvIGJhcnJpZXIgPSBwbi5nZXRCYXJyaWVyKCk7Ci0gICAgICAgIAkJY291bnRlciArKzsKLQkJCQlzciA9IG5ldyBTY2FuUmV0dXJuKCk7Ci0JICAgICAgICAJc291cmNlSW5mbyA9IGJhcnJpZXIuZ2V0U291cmNlSW5mbygpOwotCSAgICAgICAgCWZpbGVOYW1lID0gYmFycmllci5nZXRGaWxlTmFtZSgpOwotCSAgICAgICAgCWZ1bmNOYW1lID0gYmFycmllci5nZXRFbmNsb3NpbmdGdW5jKCk7Ci0JICAgICAgICAJU3RyaW5nIGJhcnJpZXJOYW1lID0gKFN0cmluZyludWxsOwotCSAgICAgICAgCWlmKHBuLmlzUmVwZWF0KCkpCi0JICAgICAgICAJCWJhcnJpZXJOYW1lID0gIkJhcnJpZXIgIiArIChiYXJyaWVyLmdldElEKCkgLTQpICsgIigqKSI7Ci0JICAgICAgICAJZWxzZQotCSAgICAgICAgCQliYXJyaWVyTmFtZSA9ICJCYXJyaWVyICIgKyAoYmFycmllci5nZXRJRCgpIC00KTsKLQkgICAgICAgIAlBcnRpZmFjdFdpdGhQYXJlbnQgYSA9IG5ldyBBcnRpZmFjdFdpdGhQYXJlbnQoZmlsZU5hbWUsCi0JICAgICAgICAJCQlzb3VyY2VJbmZvLmdldFN0YXJ0aW5nTGluZSgpLCAxLCBmdW5jTmFtZSwKLQkgICAgICAgIAkJCSJCYXJyaWVyIiwgc291cmNlSW5mbywgcGF0aDJJRCwgY291bnRlciwgYmFycmllck5hbWUsCi0JICAgICAgICAJCQliYXJyaWVyLmdldElEKCktNCk7Ci0JICAgICAgICAJc3IuYWRkQXJ0aWZhY3QoYSk7Ci0JICAgICAgICAJdmlzaXRvci52aXNpdEZpbGUoYmFycmllci5nZXRSZXNvdXJjZSgpLCBzci5nZXRBcnRpZmFjdExpc3QoKSk7Ci0gICAgICAgIAl9Ci0JCX0KLQotICAgICAgICAvLyBEb25lIGNyZWF0aW5nIG1hcmtlcnMsIG5vdyBzaG93IHRoZSB2aWV3cwotICAgICAgICBWaWV3QWN0aXZhdGVyLmFjdGl2YXRlVmlldyhJRHMubWF0Y2hpbmdTZXRWaWV3SUQpOwotICAgICAgICBpZihlcnJvcnNfLnNpemUoKT4wKSB7Ci0gICAgICAgIAlWaWV3QWN0aXZhdGVyLmFjdGl2YXRlVmlldyhJRHMuZXJyb3JWaWV3SUQpOwotICAgICAgICAJZm91bmRFcnJvcnM9dHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm91bmRFcnJvcnM7Ci0gICAgICAgIAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L1NpbXBsZVRhYmxlQmFycmllclZpZXcuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9TaW1wbGVUYWJsZUJhcnJpZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzUwYzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L1NpbXBsZVRhYmxlQmFycmllclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5JQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLklEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci0KLS8qKgotKiBUT0RPOiBUaGlzIGlzIGJhc2ljYWxseSBhIGNvcHkgb2YgY2xhc3MgZnJvbSBjb21tb24gcGx1Z2luCi0qIChvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24pOyBuZWVkIHRvIHdvcmsgdG93YXJkIHJlcGxhY2luZyB0aGlzIHdpdGggdGhhdCBvbmUgLQotKiBob3dldmVyIHNvbWUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGlzIG9uZQotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRhYmxlQmFycmllclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCXByb3RlY3RlZCBBY3Rpb24gaW5mb0FjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIGZpbHRlckFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIGRvdWJsZUNsaWNrQWN0aW9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZU9uID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlU3RhdHVzTGluZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFZpZXdlclNvcnRlciBuYW1lU29ydGVyOwotCi0JcHJvdGVjdGVkIEdlbmVyaWNTb3J0ZXIgbGluZU5vU29ydGVyOwotCi0JcHJvdGVjdGVkIEZpbGVuYW1lU29ydGVyIGZpbGVuYW1lU29ydGVyOwotCi0JcHJvdGVjdGVkIEdlbmVyaWNTb3J0ZXIgb3JkZXJTb3J0ZXI7IC8vIGJ5ICJpY29uIgotCi0JcHJvdGVjdGVkIEdlbmVyaWNTb3J0ZXIgbmFtZUFydGlmYWN0U29ydGVyOwotCi0JcHJvdGVjdGVkIEdlbmVyaWNTb3J0ZXIgY29uc3RydWN0U29ydGVyOwotCi0JcHJpdmF0ZSBJTWFya2VyIHNlbGVjdGVkTWFya2VyXyA9IG51bGw7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIGFydGlmYWN0cyB0aGF0IHdlcmUgY2hhbmdlZCBkdWUgdG8gc29tZSBhY3Rpb24gdXBvbiB0aGVtIGluIHRoZQotCSAqIHZpZXcgKGN1cnJlbnRseSB1bnVzZWQpCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrTGlzdCBjaGFuZ2VkQXJ0c18gPSBuZXcgU3RhY2tMaXN0KCk7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIG1hcmtlcnMgdGhhdCB3ZXJlIGludm9sdmVkIGluIGEgY2hhbmdlIG9uIHRoZSB0aGUgYXNzb2NpYXRlZAotCSAqIGFydGlmYWN0IGR1ZSB0byBzb21lIGFjdGlvbiB1cG9uIHRoZW0gaGVyZSBpbiB0aGUgdmlldyAoY3VycmVudGx5IHVudXNlZCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhY2tMaXN0IGNoYW5nZWRNYXJrZXJzXyA9IG5ldyBTdGFja0xpc3QoKTsKLQotCXByb3RlY3RlZCBVcGRhdGVWaXNpdG9yIHZpc2l0b3JfID0gbmV3IFVwZGF0ZVZpc2l0b3IoKTsKLQotCS8qKgotCSAqIEJlIGNvbnNpc3RlbnQgYWJvdXQgd2hhdCB3ZSBjYWxsIHRoZXNlIHRoaW5nczsgZ2VuZXJpYyB2YWx1ZXMgKGNhbiBiZSkKLQkgKiByZXBsYWNlZCBvbiBjdG9yLiA8YnI+Ci0JICogVGhlc2UgYXJlIHJlYWQgZnJvbSBwbHVnaW4ueG1sIGlmIG5vdCBwYXNzZWQgb24gY3RvcgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGhpbmduYW1lXyA9ICJBcnRpZmFjdCI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRoaW5nbmFtZXNfID0gIkFydGlmYWN0cyI7Ci0KLQlwcml2YXRlIFN0cmluZyBjb2x1bW5OYW1lXyA9ICJWYWx1ZSI7Ci0KLQlwcml2YXRlIEFic3RyYWN0VUlQbHVnaW4gdGhlUGx1Z2luXzsKLQotCXByaXZhdGUgU3RyaW5nIGljb25OYW1lXyA9ICJpY29ucy9zYW1wbGUuZ2lmIjsKLQotCXByaXZhdGUgU3RyaW5nIHZpZXdOYW1lXzsKLQotCXByaXZhdGUgU3RyaW5nIG1hcmtlcklEXzsKLQotCXByb3RlY3RlZCBBcnRpZmFjdE1hbmFnZXIgYXJ0aWZhY3RNYW5hZ2VyXzsKLQotCXByaXZhdGUgU3RyaW5nW10gY29sdW1uTmFtZXNfOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBtYXJrZXJBdHRyTmFtZXNfOwotCi0JLyoqCi0JICogVGhlIElEIHVzZWQgaW4gdGhlIG1hcmtlciBmb3IgdGhlIHVuaXF1ZSBJRCBmb3IgZWFjaCBhcnRpZmFjdC4gRW5hYmxlcwotCSAqIG1hcHBpbmcgYmFjayB0byB0aGUgQXJ0aWZhY3Qgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVuaXF1ZUlEXyA9ICJ1bmlxdWVJRCI7Ci0KLQkvKioKLQkgKiBUaGUgSUQgdXNlZCBpbiB0aGUgbWFya2VyIGZvciB0aGUgZXh0cmEgY29sdW1uIG9mIGluZm9ybWF0aW9uIChsYXN0Ci0JICogY29sdW1uKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uSURfID0gImNvbnN0cnVjdFR5cGUiOyAvLyBpZCBmb3IgKHZhcmlhYmxlKQotCi0JLyoqIE1hcmtlciBJRCBmb3IgYXJ0aWZhY3QgbmFtZSAtIGUuZy4gQVBJIG5hbWUsIHByYWdtYSBuYW1lLCBldGMuICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLQotCS8qKiBNYXJrZXIgSUQgZm9yIHN0b3JhZ2Ugb2YgdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRoZSBhcnRpZmFjdCBpcyBmb3VuZCAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FID0gImZpbGVuYW1lIjsKLQotCS8qKgotCSAqIE1hcmtlciBpZCBmb3Igc3RvcmFnZSBvZiBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgYXJ0aWZhY3QgaXMgZm91bmQuCi0JICogUmV1c2Ugb2YgZGVmYXVsdCBJRCB1c2VkIGJ5IElNYXJrZXIsIHJlcGVhdGVkIGhlcmUgZm9yIGVhc2Ugb2YgdXNlIGFuZAotCSAqIGZvciBjbGFyaXR5IHRoYXQgVEhJUyBpcyB0aGUgbWFya2VyIElEIGZvciBsaW5lIG51bWJlci4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLQotCS8qKiBNYXJrZXIgaWQgZm9yIHN0b3JhZ2Ugb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXJ0aWZhY3QgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNUSU9OX0NBTEwgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlQgPSAyOwotCi0JLyoqIHR5cGVzIG9mIGNvbnN0cnVjdHMsIGZvciB0aGUgZGVmYXVsdCBjYXNlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05TVFJVQ1RfVFlQRV9OQU1FUyA9IHsgIk5vbmUiLAotCQkJIkZ1bmN0aW9uIENhbGwiLCAiQ29uc3RhbnQiIH07Ci0KLQkvKioKLQkgKiBTaW1wbGUgQXJ0aWZhY3QgVGFibGUgVmlldyBjb25zdHJ1Y3RvcgotCSAqIDxwPgotCSAqIEV2ZXJ5dGhpbmcgY2FuIGJlIG51bGwsIGFuZCBkZWZhdWx0cyB3aWxsIGJlIHRha2VuLCBvciByZWFkIGZyb20KLQkgKiBwbHVnaW4ueG1sIGZvciB0aGUgdmlldy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBpZiBhIG51bGwgcGx1Z0luIGluc3RhbmNlIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBwbHVnaW4gKHRoaXMKLQkgKiBvbmUpIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCByZXNvdXJjZXMgKGUuZy4gaWNvbiBpbWFnZXMpIGlmIHRoZSBkZXJpdmVkCi0JICogY2xhc3MgaXMgaW4gaXRzIG93biBwbHVnLWluLCBhbmQgaXRzIGljb25zIGFyZSwgdG9vLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUYWJsZUJhcnJpZXJWaWV3KEFic3RyYWN0VUlQbHVnaW4gdGhlUGx1Z2luLCBTdHJpbmcgdGhpbmduYW1lLAotCQkJU3RyaW5nIHRoaW5nbmFtZXMsIFN0cmluZyBjb2x1bW5OYW1lLCBTdHJpbmcgbWFya2VySUQpIHsKLQotCQlpZiAodGhlUGx1Z2luID09IG51bGwpIHsKLQkJCXRoZVBsdWdpbl8gPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy50aGVQbHVnaW5fID0gdGhlUGx1Z2luOwotCQl9Ci0JCWlmICh0aGluZ25hbWUgIT0gbnVsbCkKLQkJCXRoaXMudGhpbmduYW1lXyA9IHRoaW5nbmFtZTsKLQkJaWYgKHRoaW5nbmFtZXMgIT0gbnVsbCkKLQkJCXRoaXMudGhpbmduYW1lc18gPSB0aGluZ25hbWVzOwotCQlpZiAoY29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVfID0gY29sdW1uTmFtZTsgLy8gbGFzdCBjb2x1bW4gbmFtZWQgYnkgc3ViY2xhc3MKLQkJfQotCQl0aGlzLm1hcmtlcklEXyA9IG1hcmtlcklEOy8vIGlmIG51bGwsIHdpbGwgdXNlIHZpZXcgaWQuCi0KLQkJZmluZFZpZXdJbmZvKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdGFibGUgdmlldyB3aXRoIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZXh0cmEgY29sdW1ucwotCSAqIAotCSAqIEBwYXJhbSB0aGVQbHVnaW4KLQkgKiBAcGFyYW0gdGhpbmduYW1lCi0JICogQHBhcmFtIHRoaW5nbmFtZXMKLQkgKiBAcGFyYW0gYXR0ck5hbWVzCi0JICogICAgICAgICAgICBsaXN0IG9mIG1hcmtlciBhdHRyaWJ1dGVzLCBmb3Igd2hpY2ggdGhlIGNvbHVtbiB2YWx1ZXMgd2lsbCBiZQotCSAqICAgICAgICAgICAgZXh0cmFjdGQKLQkgKiBAcGFyYW0gY29sTmFtZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgQ29sdW1uIG5hbWVzLCB1c2VkIGFzIGhlYWRlcnMgZm9yIHRoZSB2YWx1ZXMgZm91bmQgaW4KLQkgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgYXR0cmlidXRlcwotCSAqIEBwYXJhbSBtYXJrZXJJRF8KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVGFibGVCYXJyaWVyVmlldyhBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbiwgU3RyaW5nIHRoaW5nbmFtZSwKLQkJCVN0cmluZyB0aGluZ25hbWVzLCBTdHJpbmdbXSBhdHRyTmFtZXMsIFN0cmluZ1tdIGNvbE5hbWVzLAotCQkJU3RyaW5nIG1hcmtlcklEKSB7Ci0JCXRoaXModGhlUGx1Z2luLCB0aGluZ25hbWUsIHRoaW5nbmFtZXMsIG51bGwsIG1hcmtlcklEKTsKLQkJY29sdW1uTmFtZXNfID0gY29sTmFtZXM7Ci0JCWNvbHVtbk5hbWVfID0gbnVsbDsvLyBzZXQgdGhpcyBzbyB3ZSBjYW4gdGVsbCB3ZSBhcmUgdXNpbmcgYXJyYXkgb2YKLQkJCQkJCQkvLyBhdHRycy9jb2xzCi0JCW1hcmtlckF0dHJOYW1lc18gPSBhdHRyTmFtZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDdG9yIHRoYXQgdXNlcyBkZWZhdWx0cyBmb3IgZXZlcnl0aGluZyAodGVzdGluZz8gdGhlb3JldGljYWxseSwgdGhpcwotCSAqIHNob3VsZCB3b3JrLCBhbmQgc2hvdWxkIGJlIHJldXNhYmxlIHNpbmNlIGluZm8gdGhhdCBtdXN0IGJlIHVuaXF1ZSBpcwotCSAqIHJlYWQgZnJvbSBmcm9tIHBsdWdpbi54bWwuKQotCSAqIAotCSAqLwotCXB1YmxpYyBTaW1wbGVUYWJsZUJhcnJpZXJWaWV3KCkgewotCQl0aGlzKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgaW5mbyBmcm9tIHRoZSB2aWV3IGluZm8gaW4gdGhlIG1hbmlmZXN0LiBUaGlzIGluY2x1ZGVzIHRoZSBpY29uCi0JICogbmFtZSwgdGhlIHZpZXcgaWQgKHVzZWQgYXMgbWFya2VyIGlkIGlmIG5vbmUgZ2l2ZW4gb24gY3RvciksIGFuZAotCSAqIGNvbnN0cnVjdHMgYW4gYXJ0aWZhY3QgbWFuYWdlciBmb3IgdGhpcyB2aWV3J3MgYXJ0aWZhY3Qgb2JqZWN0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRWaWV3SW5mbygpIHsKLQkJU3RyaW5nIGNsYXNzbmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCS8vIHRyeSB0byBmaW5kIHRoZSBpY29uIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmb3IgdGhpcwotCQkvLyBleHRlbnNpb24vdmlldwotCQlJRXh0ZW5zaW9uW10gZXh0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MiKS5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dFtpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNlcyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNFbGVtZW50ID0gY2VzW2pdOwotCQkJCVN0cmluZyBpY29uTmFtZSA9IGNFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWNvbiIpOwotCQkJCVN0cmluZyBjbGFzc04gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCQlpZiAoY2xhc3NuYW1lLmVxdWFscyhjbGFzc04pKSB7Ci0JCQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpY29uTmFtZV8gPSBpY29uTmFtZTsKLQkJCQkJfQotCQkJCQl0aGlzLnZpZXdOYW1lXyA9IG5hbWU7Ci0JCQkJCWlmIChtYXJrZXJJRF8gPT0gbnVsbCkgewotCQkJCQkJLy8gdXNlIHBsdWdpbiBpZCBmb3IgbWFya2VyIGlkLCBpZiBub3Qgc3BlY2lmaWVkCi0JCQkJCQltYXJrZXJJRF8gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQkJCX0KLQkJCQkJYXJ0aWZhY3RNYW5hZ2VyXyA9IEFydGlmYWN0TWFuYWdlci5nZXRNYW5hZ2VyKG1hcmtlcklEXyk7Ci0JCQkJCWlmIChhcnRpZmFjdE1hbmFnZXJfID09IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0TWFuYWdlcl8gPSBuZXcgQXJ0aWZhY3RNYW5hZ2VyKG1hcmtlcklEXyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQgbWlnaHQgYmUgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIHRoaXMsIHRvIHNheSB3aGljaAotCSAqIGZpbGVuYW1lcyBzaG91bGQgYWxsb3cgdGhlIGFjdGlvbiAicnVuIGFuYWx5c2lzIiB0byBjcmVhdGUgbmV3IGFydGlmYWN0cwotCSAqIGFuZCB0aHVzIG5ldyBtYXJrZXJzLiA8YnI+Ci0JICogVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRGb3JBbmFseXNpcyhTdHJpbmcgZmlsZW5hbWUpIHsKLQkJLy8gcmV0dXJuIE1waVV0aWwudmFsaWRGb3JBbmFseXNpcyhmaWxlbmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBvYmplY3RzIHRvIHRoZQotCSAqIHZpZXcuIEl0IGNhbiB3cmFwIGV4aXN0aW5nIG9iamVjdHMgaW4gYWRhcHRlcnMgb3Igc2ltcGx5IHJldHVybiBvYmplY3RzCi0JICogYXMtaXMuIFRoZXNlIG9iamVjdHMgbWF5IGJlIHNlbnNpdGl2ZSB0byB0aGUgY3VycmVudCBpbnB1dCBvZiB0aGUgdmlldywKLQkgKiBvciBpZ25vcmUgaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgKGxpa2UgVGFzayBMaXN0LCBmb3IKLQkgKiBleGFtcGxlKS4KLQkgKi8KLQljbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsCi0JCQlJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgSVJlc291cmNlIGlucHV0OwotCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNSZWdpc3RlcmVkID0gZmFsc2U7Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2LCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy8gY291bGQgdXNlIHRoaXMgdG8gY2hhbmdlIHRoZSBsaXN0IHRvIGp1c3QgYXJ0aWZhY3RzIGZyb20gb25lCi0JCQkvLyByZXNvdXJjZSwKLQkJCS8vIGV0Yy4uLgotCQkJLy8gY291bGQgY2FjaGUgdmlld2VyIGhlcmUgdGhpcy52aWV3ZXI9djsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWIGlucHV0Q2hhbmdlZCgpLi4uIik7Ci0JCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBnaXZlbiBhbiBpbnB1dAotCQkJaWYgKCFoYXNSZWdpc3RlcmVkKSB7Ci0JCQkJLy8gYWRkIG1lIGFzIGEgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyIHNvIGkgY2FuIHJlZnJlc2ggYXQKLQkJCQkvLyBsZWFzdCB3aGVuIG1hcmtlcnMgYXJlIGNoYW5nZWQKLQkJCQkvLyBQT1NUX0NIQU5HRTogb25seSB3YW50IGV2ZW50IG5vdGlmaWNhdGlvbnMgZm9yIGFmdGVyLXRoZS1mYWN0Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywKLQkJCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCQloYXNSZWdpc3RlcmVkID0gdHJ1ZTsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJBVFY6IFJlZ2lzdGVyZWQgUkNMIGZvciBWaWV3Q29udGVudFByb3ZpZGVyIik7Ci0JCQl9Ci0JCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQl0aGlzLmlucHV0ID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVi5WaWV3Q29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKSIpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBwb3B1bGF0ZSB0aGlzIHZpZXcuCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJT2JqZWN0W10gb2JqcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBpZCA9IG1hcmtlcklEXzsKLQkJCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5wdXQgaXMgbnVsbCBpbiBnZXRFbGVtZW50cy4uLiIpOwotCQkJCX0KLQkJCQkvLyB1c2UgdGhlIGNhY2hlZCBpbnB1dCBvYmplY3QgaW5zdGVhZCBvZiBxdWVyeWluZyBmcm9tCi0JCQkJLy8gd29ya3NwYWNlCi0JCQkJLy8gb2JqcyA9Ci0JCQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWFya2VycyhpZCwKLQkJCQkvLyBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQlvYmpzID0gaW5wdXQuZmluZE1hcmtlcnMoaWQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkFUViwgZXhjZXB0aW9uIGdldHRpbmcgbW9kZWwgZWxlbWVudHMgKG1hcmtlcnMgZm9yIFRhYmxlIHZpZXcpIik7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWLmdldC0tLUVsZW1lbnRzLCBmb3VuZCAiICsgb2Jqcy5sZW5ndGgKLQkJCQkJCSsgIiBtYXJrZXJzIik7Ci0JCQlyZXR1cm4gb2JqczsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIHJlYWN0IHRvIGEgcmVzb3VyY2UgY2hhbmdlIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkJICovCi0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tcmVzb3VyY2VDaGFuZ2VkKCkiKTsKLQkJCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50UmVzb3VyY2VzQ2hhbmdlZChkZWx0YSwgMSk7Ci0JCQkvLyByZW1vdmUgdGhlIGZvbGxvd2luZyB3aGVuIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgZG9lcyBpdCBhbGw/Ci0JCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigidmlld2VyLnVwZGF0ZSBlYSBta3IgaW4gZGVsdGEtLSBmcm9tIHJlc291cmNlQ2hhbmdlZCgpLi4uIik7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiLS0tLXByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKCkuLi4iKTsKLQkJCQkJCQlwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YShkZWx0YSk7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiLS0tLUVORCBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YSgpLi4uIik7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmlld2VyLnJlZnJlc2goKSIpOwotCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkFUVjogRXhjZXB0aW9uIHJlZnJlc2hpbmcgdmlld2VyOiAiCi0JCQkJCQkJCQkJCSsgZSk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tRU5EIHJlc291cmNlQ2hhbmdlZCgpXG4iKTsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIERlYnVnZ2luZyBzdGF0ZW1lbnQgaGVscCAtIHByaW50cyB0aGUgZXZlbnRzLCBpbmRlbnRlZCBieSBuZXN0aW5nCi0JCSAqIGxldmVsCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICogQHBhcmFtIGluZGVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHByaW50UmVzb3VyY2VzQ2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGluZGVudCkgewotCQkJcHJpbnRPbmVSZXNvdXJjZUNoYW5nZWQoZGVsdGEsIGluZGVudCk7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlwcmludFJlc291cmNlc0NoYW5nZWQoY2hpbGRyZW5baV0sIGluZGVudCArIDEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNvbWUgZGVidWdnaW5nIHN0YXRlbWVudCBoZWxwCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICogQHBhcmFtIGluZGVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHByaW50T25lUmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgaW5kZW50KSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotCQkJCWJ1Zi5hcHBlbmQoIiAgIik7Ci0JCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQlidWYuYXBwZW5kKCJBRERFRCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCWJ1Zi5hcHBlbmQoIlJFTU9WRUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQlidWYuYXBwZW5kKCJDSEFOR0VEIik7Ci0JCQkJdGVzdERlbHRhKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnVmLmFwcGVuZCgiWyIpOwotCQkJCWJ1Zi5hcHBlbmQoZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQlidWYuYXBwZW5kKCJdIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWYuYXBwZW5kKCIgIik7Ci0JCQlidWYuYXBwZW5kKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGJ1Zik7Ci0JCX0KLQotCQkvKioKLQkJICogU2hvdyBkZWJ1Z2dpbmcgaW5mbyBmb3IgYSByZXNvdXJjZSBkZWx0YSBjaGFuZ2UKLQkJICogCi0JCSAqIEBwYXJhbSBkZWx0YQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHRlc3REZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gLS0gY29kZSBmcm9tIGVjbGlwc2UgaGVscDoKLQkJCS8vIGNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlJlc291cmNlICIpOwotCQkJU3lzdGVtLm91dC5wcmludChkZWx0YS5nZXRGdWxsUGF0aCgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIGhhcyBjaGFuZ2VkLiIpOwotCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLT4gQ29udGVudCBDaGFuZ2UiKTsKLQkJCX0KLQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0+IENvbnRlbnQgUmVwbGFjZWQiKTsKLQkJCX0KLQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSAhPSAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLT4gTWFya2VyIENoYW5nZSIpOwotCQkJCS8vIElNYXJrZXJEZWx0YVtdIG1hcmtlcnMgPSBkZWx0YS5nZXRNYXJrZXJEZWx0YXMoKTsKLQkJCQkvLyBpZiBpbnRlcmVzdGVkIGluIG1hcmtlcnMsIGNoZWNrIHRoZXNlIGRlbHRhcwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIHJlc291cmNlIGNoYW5nZSAtIGp1c3QgdGhlIGRlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yXyk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRXJyb3IgaW4gUElUVi5wcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YSgpLi4iKTsKLQkJCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfSAvLyBlbmQgVmlld0NvbnRlbnRQcm92aWRlcgotCi0JLyoqCi0JICogZ2V0IGFydGlmYWN0IGZyb20gbWFya2VyCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFydGlmYWN0IGdldFNpbXBsZUFydGlmYWN0KElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCUlBcnRpZmFjdCBhcnRpZmFjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUodW5pcXVlSURfKTsKLQkJCWFydGlmYWN0ID0gYXJ0aWZhY3RNYW5hZ2VyXy5nZXRBcnRpZmFjdChpZCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpCi0JCQkJCSsgIiAuLi4gU1RWLCBDb3JlRXhjZXB0aW9uIGdldHRpbmcgYXJ0aWZhY3QgZnJvbSBoYXNoTWFwOyAiCi0JCQkJCSsgdGhpbmduYW1lXyArICIgaWQ9IiArIGlkKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbmUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuZS5nZXRNZXNzYWdlKCkKLQkJCQkJKyAiIC4uLiBTVFYsIE51bGxQdHJFeGNwIGdldHRpbmcgYXJ0aWZhY3QgZnJvbSBoYXNoTWFwOyIKLQkJCQkJKyB0aGluZ25hbWVfICsgIiBpZD0iICsgaWQpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdDsKLQotCX0KLQotCS8qKgotCSAqIEdldCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGNvbnN0cnVjdAotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb25zdHJ1Y3RTdHIoSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW50ZWdlciB0ZW1wID0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoY29sdW1uSURfKTsKLQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJSW50ZWdlciBjb25zdHJ1Y3RUeXBlID0gKEludGVnZXIpIHRlbXA7Ci0JCQlyZXR1cm4gQ09OU1RSVUNUX1RZUEVfTkFNRVNbY29uc3RydWN0VHlwZS5pbnRWYWx1ZSgpXTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIiAiOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFZpZXdMYWJlbFByb3ZpZGVyIC0gcHJvdmlkZXMgdGhlIHRleHQgYW5kIGltYWdlcyBmb3IgdGhlIGFydGlmYWN0cyBpbiB0aGUKLQkgKiBUYWJsZSBWaWV3Ci0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkvKioKLQkJICogS2VlcCBpY29ucyBhbHJlYWR5IGNyZWF0ZWQsIGFuZCByZXVzZSB0aGUgaW1hZ2VzCi0JCSAqLwotCQlwcml2YXRlIEhhc2hNYXAgaWNvbkhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgSUFydGlmYWN0IGFydGlmYWN0OwotCi0JCS8qKgotCQkgKiBwcm92aWRlIHdoYXQgZ29lcyBpbiBlYWNoIGNvbHVtbjsgZ2V0IHRoZSBpbmZvIGZyb20gdGhlIG1hcmtlcgotCQkgKi8KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQkJU3RyaW5nIHRlbXAgPSBzdXBlci5nZXRUZXh0KG8pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUZXh0OiAiICsgdGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmUgdGhlIHRleHQgdG8gZ28gaW4gZWFjaCBjb2x1bW4KLQkJICogCi0JCSAqIEBwYXJhbSBvYmoKLQkJICogICAgICAgICAgICB0aGUgTWFya2VyICh3ZSBob3BlKSB0aGF0IGdvZXMgb24gdGhlIGN1cnJlbnQgcm93Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB0YWJsZQotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCWlmIChvYmogPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJBVFY6IExhYmVsUHJvdiBvYmogaXMgbnVsbDsgaW5kZXg9IiArIGluZGV4KTsKLQkJCQlyZXR1cm4gIkFUViBvYmogbnVsbCI7Ci0JCQl9Ci0JCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvYmo7Ci0JCQl0cnkgewotCQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXJldHVybiAiIjsKLQkJCQljYXNlIDE6Ci0JCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQkJCXJldHVybiBpZDsKLQkJCQljYXNlIDI6Ci0KLQkJCQkJcmV0dXJuIChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCWNhc2UgMzoKLQkJCQkJU3RyaW5nIGxpbmUgPSAobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKSkKLQkJCQkJCQkudG9TdHJpbmcoKTsKLQotCQkJCQlpZiAodHJhY2VPbikgeyAvLyBhbGwgdGhpcyBpcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHNvCi0JCQkJCQlhcnRpZmFjdCA9IGdldFNpbXBsZUFydGlmYWN0KG1hcmtlcik7Ci0JCQkJCQlTdHJpbmcgY29tcExpbmUgPSBsaW5lICsgIi0iOwotCQkJCQkJaWYgKGFydGlmYWN0ID09IG51bGwpIHsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJBVFYgZ2V0Q29sdW1uVGV4dC0gbnVsbCBhcnRpZmFjdCIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgbGluZUFydGlmYWN0ID0gYXJ0aWZhY3QuZ2V0TGluZSgpOwotCQkJCQkJCWNvbXBMaW5lID0gY29tcExpbmUgKyBsaW5lQXJ0aWZhY3Q7Ci0JCQkJCQl9Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJBVFYuVmlld0xhYmVsUHJvdmlkZXIgZ2V0cyBtYXJrZXIgbGluZTogbWtyLWFydGlmYWN0OiAiCi0JCQkJCQkJCQkJKyBjb21wTGluZSk7Ci0JCQkJCQlzaG93TWFya2VyKG1hcmtlcik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGxpbmU7Ci0JCQkJY2FzZSA0OgotCQkJCQlJbnRlZ2VyIGluZGV4TnVtID0gKEludGVnZXIpbWFya2VyLmdldEF0dHJpYnV0ZShJRHMubXlJbmRleEF0dHIpOwotCQkJCQlyZXR1cm4gaW5kZXhOdW0udG9TdHJpbmcoKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBtYXJrZXJBdHRyTmFtZXNfW2luZGV4IC0gNF07Ci0JCQkJCVN0cmluZyB2YWwgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKGF0dHJOYW1lLCAiIik7Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGdldCB0aGlzIGVycm9yIDN4ICJNYXJrZXIgaWQ6IDk5OSBub3QgZm91bmQuIiB3aGlsZSBkZWxldGluZwotCQkJCS8vIG1hcmtlcnMuIHdoeT8KLQkJCQkvLyBXaHkgaXMgdGhpcyBldmVuIGdldHRpbmcgY2FsbGVkLCBhbmQgd2h5IGRvZXMgaXQgbWF0dGVyPwotCQkJCS8vIFN0cmluZyB0bXAgPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQkJLy8gY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuICgiQVRWIGVycm9yIik7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUHJvdmlkZSB0aGUgaW1hZ2UgdGhhdCBnb2VzIGluIGEgY29sdW1uLCBpZiBhbnkgKE5vdGUgdGhhdCBhIHRhYmxlCi0JCSAqIGNlbGwgY2FuIGNvbnRhaW4gYm90aCwgYW4gaW1hZ2UgYW5kIHRleHQsIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkCi0JCSAqIHNpZGUtYnktc2lkZSkKLQkJICogCi0JCSAqIEBwYXJhbSBvYmogLQotCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2UncmUgZ2V0dGluZyB0aGUgaW1hZ2UgZm9yCi0JCSAqIEBwYXJhbSBpbmRleCAtCi0JCSAqICAgICAgICAgICAgdGhlIGNvbHVtbiB0aGF0IHRoaXMgaW1hZ2UgaXMgdG8gZ28gaW4KLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCS8vIHdlIG9ubHkgcHV0IGltYWdlIGljb24gaW4gdGhlIGZpcnN0IGNvbHVtbgotCQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSAwOgotCQkJCXJldHVybiBnZXRDdXN0b21JbWFnZShvYmopOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgaW1hZ2UgZm9yIGFydGlmYWN0LiBOb3RlIHRoYXQgZGlmZmVyZW50IGltYWdlcyBjb3VsZCBiZSB1c2VkIGZvcgotCQkgKiBkaWZmZXJlbnQgdHlwZXMgb2YgYXJ0aWZhY3RzLiBGb3Igbm93IHdlIGhhdmUgYSBzaW5nbGUgaW1hZ2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gb2JqCi0JCSAqICAgICAgICAgICAgdGhlIG1hcmtlciBvYmplY3QgdGhhdCB0aGlzIGFydGlmYWN0IGlzIHJlcHJlc2VudGVkIGJ5Ci0JCSAqIEByZXR1cm4gaW1hZ2UgZm9yIG1hcmtlcgotCQkgKiAgICAgICAgIDxwPgotCQkgKiAgICAgICAgIE5vdGU6IGlmIGEgbnVsbCBwbHVnSW4gaW5zdGFuY2UgaXMgcHJvdmlkZWQgb24gdGhlIHZpZXcgY3RvciwKLQkJICogICAgICAgICB0aGUgZGVmYXVsdCBwbHVnaW4gKHRoaXMgb25lKSB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQKLQkJICogICAgICAgICByZXNvdXJjZXMgKGUuZy4gaWNvbiBpbWFnZXMpIGlmIHRoZSBkZXJpdmVkIGNsYXNzIGlzIGluIGl0cwotCQkgKiAgICAgICAgIG93biBwbHVnLWluLCBhbmQgaXRzIGljb25zIGFyZSwgdG9vLgotCQkgKiAKLQkJICovCi0JCXByb3RlY3RlZCBJbWFnZSBnZXRDdXN0b21JbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgb25lIG9mIHRoaXMgdHlwZSBvZiBpY29uLCByZXVzZSBpdC4KLQkJCS8vIE5vdGU6IHVzZSBJbWFnZVJlZ2lzdHJ5IGluc3RlYWQ/Ci0JCQlJbWFnZSBpbWcgPSAoSW1hZ2UpIGljb25IYXNoLmdldChpY29uTmFtZV8pOwotCQkJaWYgKGltZyA9PSBudWxsKSB7Ci0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoaWNvbk5hbWVfKTsKLQkJCQkvLyBCUlQgbWFrZSBzdXJlIHRoZSBzcGVjaWZpYyBwbHVnaW4gaXMgYmVpbmcgdXNlZCBoZXJlIHRvIGZpbmQKLQkJCQkvLyBpdHMgT1dOIGljb25zCi0JCQkJVVJMIHVybCA9IHRoZVBsdWdpbl8uZmluZChwYXRoKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkJCWltZyA9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiAqKioqKiBjcmVhdGVkIGltYWdlIGZvciAiCi0JCQkJCQkJKyBpY29uTmFtZV8pOwotCQkJCWljb25IYXNoLnB1dChpY29uTmFtZV8sIGltZyk7Ly8gc2F2ZSBmb3IgcmV1c2UKLQkJCX0KLQkJCXJldHVybiBpbWc7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZSBvZiBhbnl0aGluZyB0aGF0IHdvdWxkIGhhbmcgYXJvdW5kIHJ1ZGVseSBvdGhlcndpc2UgKHN1Y2ggYXMKLQkJICogaW1hZ2Ugb2JqZWN0cyBmcm9tIHRoZSBpY29ucykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQVRWLlZpZXdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsgZGlzcG9zZSBvZiBpY29uIGltYWdlcyIpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaWNvbkhhc2gudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW1hZ2UgaW1nID0gKEltYWdlKSBpdGVyLm5leHQoKTsKLQkJCQlpbWcuZGlzcG9zZSgpOwotCQkJfQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHNvcnRlciBmb3IgaXRlbXMgLSB0aGUgb3JkZXIgdGhleSB3ZXJlIGNyZWF0ZWQsIHdoaWNoIHRlbmRzIHRvCi0JICogZ3JvdXAgaXRlbXMgd2l0aCB0aGVpciBzb3VyY2UgY29kZSBsb2NhdGlvbnMKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKi8KLQljbGFzcyBOYW1lU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGl0ZW1zIGJ5IG9uZSBvciBtb3JlIG9mOiBhcnRpZmFjdCwgZmlsZW5hbWUsIGxpbmVObywKLQkgKiB2YXJpYWJsZUNvbHVtbk5hbWUuPGJyPgotCSAqIFRoZSBkZXJpdmVkIGNsYXNzZXMgd2lsbCBpbXBsZW1lbnQgY29tYmluZSgpIHRvIHNheSBob3cgdGhlIGF0dHJpYnV0ZXMKLQkgKiBhcmUgY29tYmluZWQgdG8gZ2V0IHRoZSBzb3J0IGRlc2lyZWQuCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1NvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGFzY2VuZGluZyA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIENvbXBhcmUgdHdvIGl0ZW1zIHRvIGRldGVybWluZSBzb3J0IG9yZGVyLiBTb3J0IGl0ZW1zIGJ5IG9uZSBvciBtb3JlCi0JCSAqIG9mOiBhcnRpZmFjdCBuYW1lLCB0aGVuIGZpbGUsIHRoZW4gbGluZSBudW1iZXIsIHRoZW4gY29uc3RydWN0Ci0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCWludCByZXN1bHQgPSAwOwotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQotCQkJamF2YS50ZXh0LkNvbGxhdG9yIGNvbGxhdG9yID0gdGhpcy5nZXRDb2xsYXRvcigpOwotCi0JCQlpZiAoZTEgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSU1hcmtlciBtMSA9IChJTWFya2VyKSBlMTsKLQkJCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQkJU3RyaW5nIG5hbWUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQkJCQlTdHJpbmcgZmlsZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCi0JCQkJCVN0cmluZyBsaW5lMSA9IChTdHJpbmcpIG0xLmdldEF0dHJpYnV0ZShMSU5FKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgY29uc3RydWN0MSA9IGdldENvbnN0cnVjdFN0cihtMSk7Ci0JCQkJCVN0cmluZyBzb3J0MSA9IGNvbWJpbmUobmFtZTEsIGZpbGUxLCBsaW5lMSwgY29uc3RydWN0MSk7Ci0KLQkJCQkJU3RyaW5nIG5hbWUyID0gKFN0cmluZykgbTIuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQkJCQlTdHJpbmcgZmlsZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCQlTdHJpbmcgbGluZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGNvbnN0cnVjdDIgPSBnZXRDb25zdHJ1Y3RTdHIobTIpOwotCQkJCQlTdHJpbmcgc29ydDIgPSBjb21iaW5lKG5hbWUyLCBmaWxlMiwgbGluZTIsIGNvbnN0cnVjdDIpOwotCi0JCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHNvcnQxLCBzb3J0Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUoc29ydDIsIHNvcnQxKTsKLQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCX0KLQotCQkvKioKLQkJICogQ29tYmluZSBuYW1lLCBmaWxlLCBhbmQvb3IgbGluZSBudW1iZXIgdG8gcHJvdmlkZSB0aGUgc3RyaW5nIHRvIHNvcnQKLQkJICogYnkuIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMgYXMgbmVlZGVkCi0JCSAqIAotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcGFyYW0gZmlsZQotCQkgKiBAcGFyYW0gbGluZQotCQkgKiBAcGFyYW0gY29uc3RydWN0Ci0JCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybiBudWxsLCBzdWJjbGFzcyBjYW4gY2hvb3NlIHRvIGltcGwuIHRoaXMgbWV0aG9kLgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBjb21iaW5lKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGxpbmUsCi0JCQkJU3RyaW5nIGNvbnN0cnVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogc3dpdGNoIHRvIHRoaXMgc29ydGVyLiBJZiBpdCB3YXMgYWxyZWFkeSB0aGlzIHNvcnRlciwgdGhlbiB0b2dnbGUgdGhlCi0JCSAqIHNvcnQgb3JkZXIKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzb3J0KCkgewotCQkJLy8gU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NOYW1lKyIuc29ydCgpIGFzY2VuZGluZz0iK2FzY2VuZGluZyk7Ci0JCQlpZiAodGhpcyA9PSB2aWV3ZXIuZ2V0U29ydGVyKCkpIHsKLQkJCQlhc2NlbmRpbmcgPSAhYXNjZW5kaW5nOwotCQkJCXZpZXdlci5zZXRTb3J0ZXIobnVsbCk7IC8vIHR1cm4gb2ZmIHRvIGZvcmNlIHJlLXNvcnQKLQkJCX0gZWxzZSB7Ci0JCQkJYXNjZW5kaW5nID0gdHJ1ZTsKLQkJCX0KLQkJCXZpZXdlci5zZXRTb3J0ZXIodGhpcyk7Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogU29ydGVyIHRvIHNvcnQgYnkgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIFNpbXBsZUFydGlmYWN0IGlzIEZvdW5kCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzIGNyZWF0ZWQKLQkgKiAKLQkgKiAKLQkgKi8KLQljbGFzcyBMaW5lTm9Tb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQkJLyoqCi0JCSAqIHNvcnQgaXRlbXMgYnkgbGluZSBudW1iZXIKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQotCQkJaWYgKGUxIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCXRyeSB7Ci0JCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJCU9iamVjdCB0ZW1wT2JqID0gbTEuZ2V0QXR0cmlidXRlKExJTkUpOwotCQkJCQlpbnQgbGluZTE9MDsKLQkJCQkJaW50IGxpbmUyPTA7Ci0JCQkJCWlmICh0ZW1wT2JqIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkJbGluZTEgPSAoKEludGVnZXIpdGVtcE9iaikuaW50VmFsdWUoKTsKLQkJCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJCQl0ZW1wT2JqPSBtMi5nZXRBdHRyaWJ1dGUoTElORSk7Ci0JCQkJCQkvLyB3ZSBhc3N1bWUgaWYgdGhlIGZpcnN0IHdhcyBJbnRlZ2VyLCB0aGlzIG9uZSBpcywgdG9vLgotCQkJCQkJYXNzZXJ0IHRlbXBPYmogaW5zdGFuY2VvZiBJbnRlZ2VyOwotCQkJCQkJbGluZTIgPSAoKEludGVnZXIpdGVtcE9iaikuaW50VmFsdWUoKTsKLQotCQkJCQl9Ci0JCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQlpZiAoYXNjZW5kaW5nKQotCQkJCQkJcmVzdWx0ID0gbGluZTEgLSBsaW5lMjsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0ID0gbGluZTIgLSBsaW5lMTsKLQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGl0ZW1zIGJ5IG5hbWUKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKiAKLQkgKiAKLQkgKi8KLQljbGFzcyBOYW1lQXJ0aWZhY3RTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQotCQkvKioKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHBhcmFtIGZpbGUKLQkJICogQHBhcmFtIGxpbmUKLQkJICogQHBhcmFtIGNvbnN0cnVjdAotCQkgKiBAcmV0dXJuIEJSVCBub3RlOiBTb3J0IGlzbid0IHF1aXRlIHJpZ2h0OiBpZiBuYW1lLGZpbGVuYW1lIGlkZW50aWNhbCwKLQkJICogICAgICAgICAiMTAiIHdvdWxkIHNvcnQgYmVmb3JlICIyIiBlLmcuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmUoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSwKLQkJCQlTdHJpbmcgY29uc3RydWN0KSB7Ci0JCQlmaW5hbCBTdHJpbmcgZGVsaW0gPSAiIC0gIjsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGZpbGUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGNvbnN0cnVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGl0ZW1zIGJ5IGZpbGVuYW1lICh0aGVuIGxpbmUgbnVtYmVyKQotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIEZpbGVuYW1lU29ydGVyIGV4dGVuZHMgR2VuZXJpY1NvcnRlciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJCWludCByZXMgPSAwOwotCQkJdHJ5IHsKLQkJCQlJTWFya2VyIG0xID0gKElNYXJrZXIpIGUxOwotCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJU3RyaW5nIGZpbGUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKEZJTEVOQU1FKTsKLQkJCQlTdHJpbmcgZmlsZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYXNjZW5kaW5nPSIgKyBhc2NlbmRpbmcpOwotCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCXJlcyA9IGNvbGxhdG9yLmNvbXBhcmUoZmlsZTEsIGZpbGUyKTsKLQkJCQllbHNlCi0JCQkJCXJlcyA9IGNvbGxhdG9yLmNvbXBhcmUoZmlsZTIsIGZpbGUxKTsKLQkJCQkvLyBpZiB0aGUgZmlsZW5hbWUgaXMgdGhlIHNhbWUsIG9ubHkgdGhlbiBkbyB3ZSBsb29rIGF0IGxpbmUKLQkJCQkvLyBudW1iZXIKLQkJCQlpZiAocmVzID09IDApIHsKLQkJCQkJU3RyaW5nIGxpbmUxID0gbTEuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBsaW5lMiA9IG0yLmdldEF0dHJpYnV0ZShMSU5FKS50b1N0cmluZygpOwotCQkJCQlpbnQgbDEgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUxKTsKLQkJCQkJaW50IGwyID0gSW50ZWdlci5wYXJzZUludChsaW5lMik7Ci0JCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCQlyZXMgPSBsMSAtIGwyOwotCQkJCQllbHNlCi0JCQkJCQlyZXMgPSBsMiAtIGwxOwotCQkJCX0KLQkJCQkvLyBpZiB0aGUgZmlsZW5hbWUgYW5kIGxpbmUgbm8gYXJlIHRoZSBzYW1lLCBvbmx5IHRoZW4gZG8gd2UKLQkJCQkvLyBsb29rIGF0IGNvbnN0cnVjdAotCQkJCWlmIChyZXMgPT0gMCkgewotCQkJCQlpZiAoYXNjZW5kaW5nKSB7Ci0JCQkJCQlyZXMgPSBjb2xsYXRvci5jb21wYXJlKGdldENvbnN0cnVjdFN0cihtMSksCi0JCQkJCQkJCWdldENvbnN0cnVjdFN0cihtMikpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShnZXRDb25zdHJ1Y3RTdHIobTIpLAotCQkJCQkJCQlnZXRDb25zdHJ1Y3RTdHIobTEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JfQotCi0JY2xhc3MgQ29uc3RydWN0U29ydGVyIGV4dGVuZHMgR2VuZXJpY1NvcnRlciB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEBwYXJhbSBmaWxlCi0JCSAqIEBwYXJhbSBsaW5lCi0JCSAqIEBwYXJhbSBjb25zdHJ1Y3QKLQkJICogQHJldHVybiBCUlQgbm90ZTogU29ydCBpc24ndCBxdWl0ZSByaWdodDogaWYgbmFtZSxmaWxlbmFtZSBpZGVudGljYWwsCi0JCSAqICAgICAgICAgIjEwIiB3b3VsZCBzb3J0IGJlZm9yZSAiMiIgZS5nLgotCQkgKi8KLQkJLyoKLQkJcHJvdGVjdGVkIFN0cmluZyBjb21iaW5lKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGxpbmUsCi0JCQkJU3RyaW5nIGNvbnN0cnVjdCkgewotCQkJZmluYWwgU3RyaW5nIGRlbGltID0gIiAtICI7Ci0JCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihjb25zdHJ1Y3QpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGZpbGUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9Ci0JCSovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQotCQkJaWYgKGUxIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCXRyeSB7Ci0JCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJCU9iamVjdCB0ZW1wT2JqID0gbTEuZ2V0QXR0cmlidXRlKElEcy5teUluZGV4QXR0cik7Ci0JCQkJCWludCBpbmRleDEgPSAwOwotCQkJCQlpbnQgaW5kZXgyID0gMDsKLQkJCQkJaWYgKHRlbXBPYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQlpbmRleDEgPSAoKEludGVnZXIpdGVtcE9iaikuaW50VmFsdWUoKTsKLQkJCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJCQl0ZW1wT2JqPSBtMi5nZXRBdHRyaWJ1dGUoSURzLm15SW5kZXhBdHRyKTsKLQkJCQkJCS8vIHdlIGFzc3VtZSBpZiB0aGUgZmlyc3Qgd2FzIEludGVnZXIsIHRoaXMgb25lIGlzLCB0b28uCi0JCQkJCQlhc3NlcnQgdGVtcE9iaiBpbnN0YW5jZW9mIEludGVnZXI7Ci0JCQkJCQlpbmRleDIgPSAoKEludGVnZXIpdGVtcE9iaikuaW50VmFsdWUoKTsKLQotCQkJCQl9Ci0JCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQlpZiAoYXNjZW5kaW5nKQotCQkJCQkJcmVzdWx0ID0gaW5kZXgxIC0gaW5kZXgyOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBpbmRleDIgLSBpbmRleDE7Ci0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzIHRvIGNyZWF0ZSB0aGUgdmlld2VyIGFuZCBpbml0aWFsaXplCi0JICogaXQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBXaWRnZXQgY3JlYXRlZCBhbmQgY3VzdG9taXplZCBhbmQgdGhlbiBwYXNzZWQgdG8gdmlld2VyIGR1cmluZwotCQkvLyBjcmVhdGlvbiA6Ci0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULk1VTFRJCi0JCQkJfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJU3RyaW5nW10gU1REX0hFQURJTkdTID0geyAiICIsIHRoaW5nbmFtZV8sICJGaWxlbmFtZSIsICJMaW5lTm8iLAotCQkJCXRoaXMuY29sdW1uTmFtZV8gfTsKLQotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCAxLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIHRjMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl0YzAuc2V0VGV4dChTVERfSEVBRElOR1NbMF0pOwotCQl0YzAuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJdGMwLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiB0YzEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJdGMxLnNldFRleHQoU1REX0hFQURJTkdTWzFdKTsKLQkJdGMxLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCXRjMS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gdGMyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXRjMi5zZXRUZXh0KFNURF9IRUFESU5HU1syXSk7Ci0JCXRjMi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl0YzIuc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gdGMzID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXRjMy5zZXRUZXh0KFNURF9IRUFESU5HU1szXSk7Ci0JCXRjMy5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl0YzMuc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIHRjNCA9IG51bGw7Ci0JCWlmICh0aGlzLmNvbHVtbk5hbWVfICE9IG51bGwpIHsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUsIHRydWUpKTsKLQkJCXRjNCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJdGM0LnNldFRleHQoU1REX0hFQURJTkdTWzRdKTsKLQkJCXRjNC5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJdGM0LnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRjNC5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWludCBudW1Db2xzID0gY29sdW1uTmFtZXNfLmxlbmd0aDsKLQkJCVRhYmxlQ29sdW1uW10gdGFibGVDb2xzID0gbmV3IFRhYmxlQ29sdW1uW251bUNvbHNdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIHsKLQkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCB0cnVlKSk7Ci0JCQkJVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCQl0Yy5zZXRUZXh0KGNvbHVtbk5hbWVzX1tpXSk7Ci0JCQkJdGMuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQkJdGFibGVDb2xzW2ldID0gdGM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbGlzdGVuZXJzIGZvciB0YWJsZSBzb3J0aW5nCi0JCS8vIFNvcnQgYnkgImljb24iICh0aGUgb3JpZ2luYWwgc29ydCBvcmRlciwgYWN0dWFsbHkpCi0JCXRjMC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXZpZXdlci5zZXRTb3J0ZXIobnVsbCk7Ci0JCQkJdmlld2VyLnNldFNvcnRlcihuYW1lU29ydGVyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQkvLyBTb3J0IGJ5IGFydGlmYWN0IG5hbWUKLQkJdGMxLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbmFtZUFydGlmYWN0U29ydGVyLnNvcnQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQkvLyBTb3J0IGJ5IGZpbGUgbmFtZSAodGhlbiBieSBsaW5lTm8pCi0JCXRjMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbGVuYW1lU29ydGVyLnNvcnQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQkvLyBTb3J0IGJ5IExpbmUgbnVtYmVyCi0JCXRjMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWxpbmVOb1NvcnRlci5zb3J0KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJLy8gU29ydCBieSBDb25zdHJ1Y3QgKGlmIHdlJ3JlIG5vdCBkb2luZyBhbiBhcnJheSBvZiBleHRyYSBjb2x1bW5zKQotCQlpZiAodGM0ICE9IG51bGwpIHsKLQkJCXRjNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJY29uc3RydWN0U29ydGVyLnNvcnQoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCS8vIFNlbGVjdGlvbiBsaXN0ZW5lciB0byBrbm93IHdoZW4gYSB0YWJsZSByb3cgaXMgc2VsZWN0ZWQuCi0KLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ3aWRnZXREZWZhdWx0U2VsZWN0ZWQiKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU9iamVjdCBvYmogPSBlLmdldFNvdXJjZSgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYWJsZSkgewotCQkJCQlUYWJsZSB0ID0gKFRhYmxlKSBvYmo7Ci0JCQkJCWludCByb3cgPSB0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCS8vIHJvd1NlbGVjdGVkXyA9IHJvdzsKLQkJCQkJLy8gcHJpbnQgbWFya2VyIGluZm8gd2hlbiBzZWxlY3RlZCBpbiB0YWJsZQotCQkJCQlpZiAodHJhY2VPbikgewotCQkJCQkJVGFibGVJdGVtIHRpID0gdC5nZXRJdGVtKHJvdyk7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSB0aS5nZXREYXRhKCk7Ci0JCQkJCQlJQXJ0aWZhY3QgYXJ0aWZhY3QgPSBnZXRTaW1wbGVBcnRpZmFjdChtYXJrZXIpOwotCQkJCQkJU3RyaW5nIGlkID0gbWFya2VyLmdldEF0dHJpYnV0ZSh1bmlxdWVJRF8sICIoZXJyb3IpIik7Ci0JCQkJCQlpbnQgbUxpbmUgPSBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJCQkJaW50IGxpbmVObyA9IDA7Ci0JCQkJCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCkKLQkJCQkJCQlsaW5lTm8gPSBhcnRpZmFjdC5nZXRMaW5lKCk7Ci0KLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTUFSS0VSIGlkPSIgKyBpZAotCQkJCQkJCQkJKyAiIG1rckxpbmVObz0iICsgbUxpbmUKLQkJCQkJCQkJCSsgIiBhcnRpZmFjdExpbmVObz0iICsgbGluZU5vKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld0xhYmVsUHJvdmlkZXIoKSk7Ci0JCS8vIFNldCB1cCB0aGUgc29ydGVycy4KLQkJbmFtZVNvcnRlciA9IG5ldyBOYW1lU29ydGVyKCk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmFtZVNvcnRlcik7Ci0JCWxpbmVOb1NvcnRlciA9IG5ldyBMaW5lTm9Tb3J0ZXIoKTsKLQkJbmFtZUFydGlmYWN0U29ydGVyID0gbmV3IE5hbWVBcnRpZmFjdFNvcnRlcigpOwotCQlmaWxlbmFtZVNvcnRlciA9IG5ldyBGaWxlbmFtZVNvcnRlcigpOwotCQljb25zdHJ1Y3RTb3J0ZXIgPSBuZXcgQ29uc3RydWN0U29ydGVyKCk7Ci0KLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkvLyBtYXJrZXJzIGZyb20gd29ya3NwYWNlCi0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBvYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQkJc2VsZWN0ZWRNYXJrZXJfID0gKElNYXJrZXIpIG9iajsKLQkJCQl9Ci0JCQkJc2hvd1N0YXR1c01lc3NhZ2UoIiIsICJzZWxlY3Rpb25DaGFuZ2VkIik7Ci0JCQl9Ci0JCX0pOwotCi0JCW1ha2VBY3Rpb25zKCk7Ci0JCWhvb2tDb250ZXh0TWVudSgpOwotCQlob29rRG91YmxlQ2xpY2tBY3Rpb24oKTsKLQkJY29udHJpYnV0ZVRvQWN0aW9uQmFycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJU2ltcGxlVGFibGVCYXJyaWVyVmlldy50aGlzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1nciwgdmlld2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZVRvQWN0aW9uQmFycygpIHsKLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlmaWxsTG9jYWxQdWxsRG93bihiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQlmaWxsTG9jYWxUb29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFB1bGxEb3duKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltYW5hZ2VyLmFkZChmaWx0ZXJBY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoaW5mb0FjdGlvbik7Ci0JCS8vIE90aGVyIHBsdWctaW5zIGNhbiBjb250cmlidXRlIHRoZWlyIGFjdGlvbnMgaGVyZQotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJBZGRpdGlvbnMiKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoaW5mb0FjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTWFrZSB0aGUgYWN0aW9uIG9iamVjdHMgZm9yIHRoZSBtZW51cyBhbmQgdG9vbGJhci4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCW1ha2VTaG93SW5mb0FjdGlvbigpOwotCQltYWtlRmlsdGVyQWN0aW9uKCk7Ci0JCW1ha2VEb3VibGVDbGlja0FjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIE1ha2UgInNob3cgaW5mbyIgYWN0aW9uIHRvIGRpc3BsYXkgYXJ0aWZhY3QgaW5mb3JtYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlU2hvd0luZm9BY3Rpb24oKSB7Ci0JCWluZm9BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IHRoaW5nbmFtZV8gKyAiIGluZm9ybWF0aW9uIjsKLQkJCQlpZiAoc2VsZWN0ZWRNYXJrZXJfICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkRnJvbU1hcmtlciA9IChTdHJpbmcpIHNlbGVjdGVkTWFya2VyXwotCQkJCQkJCS5nZXRBdHRyaWJ1dGUodW5pcXVlSURfLCBudWxsKTsKLQkJCQkJaWYgKGlkRnJvbU1hcmtlciA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVjogZXhjZXB0aW9uIHJlYWRpbmcgbWFya2VyIElEIik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nQnVmZmVyIGluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCQkJSUFydGlmYWN0IGFydGlmYWN0ID0gYXJ0aWZhY3RNYW5hZ2VyXwotCQkJCQkJCS5nZXRBcnRpZmFjdChpZEZyb21NYXJrZXIpOwotCQkJCQlpbmZvLmFwcGVuZCgiXG5GaWxlIG5hbWU6ICIpLmFwcGVuZChhcnRpZmFjdC5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuTGluZSBudW1iZXI6ICIpLmFwcGVuZChhcnRpZmFjdC5nZXRMaW5lKCkpOwotCQkJCQlpbmZvLmFwcGVuZCgiXG5OYW1lOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0U2hvcnROYW1lKCkpOwotCQkJCQlpbmZvLmFwcGVuZCgiXG5EZXNjcmlwdGlvbjogIikuYXBwZW5kKAotCQkJCQkJCWFydGlmYWN0LmdldERlc2NyaXB0aW9uKCkpOwotCi0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsIHRpdGxlLCBpbmZvLnRvU3RyaW5nKCkpOwotCQkJCX0vLyBlbmQgaWYgc2VsZWN0ZWRNYXJrZXIhPW51bGwKLQkJCQllbHNlIHsKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obnVsbCwgdGl0bGUsICJObyAiCi0JCQkJCQkJKyB0aGluZ25hbWVfICsgIiBzZWxlY3RlZC4iKTsKLQkJCQl9Ci0JCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQl9Ci0JCX07Ci0JCWluZm9BY3Rpb24uc2V0VGV4dCgiU2hvdyBJbmZvIik7Ci0JCWluZm9BY3Rpb24uc2V0VG9vbFRpcFRleHQoIlNob3cgZGV0YWlsZWQgaW5mbyBmb3Igc2VsZWN0ZWQgIgotCQkJCSsgdGhpbmduYW1lXyk7Ci0JCWluZm9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOwotCX0KLQotCS8qKgotCSAqIG1ha2UgZmlsdGVyIGFjdGlvbiAoVEJEKQotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlRmlsdGVyQWN0aW9uKCkgewotCQlmaWx0ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNob3dNZXNzYWdlKCJGaWx0ZXIgIiArIHRoaW5nbmFtZXNfICsgIlxuRGV0ZXJtaW5lIHdoaWNoICIKLQkJCQkJCSsgdGhpbmduYW1lc18gKyAiIGFyZSBzaG93biBpbiB0aGlzIHZpZXcuIik7Ci0JCQl9Ci0JCX07Ci0JCWZpbHRlckFjdGlvbi5zZXRUZXh0KCJGaWx0ZXIgIiArIHRoaW5nbmFtZXNfKTsKLQkJZmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJGaWx0ZXIgd2hpY2ggIiArIHRoaW5nbmFtZXNfCi0JCQkJKyAiIGFyZSBzaG93biBpbiB0aGlzIHZpZXciKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIGRvdWJsZS1jbGljayBhY3Rpb24sIHdoaWNoIG1vdmVzIGVkaXRvciB0byB0aGUgYXJ0aWZhY3QgaW5zdGFuY2UgaW4KLQkgKiB0aGUgc291cmNlIGNvZGUgKGVkaXRvciB0byBsaW5lIGluIHNvdXJjZSBjb2RlKQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlRG91YmxlQ2xpY2tBY3Rpb24oKSB7Ci0KLQkJZG91YmxlQ2xpY2tBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlIGYgPSAoSUZpbGUpIG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpbnQgbGluZU5vID0gZ2V0TWFya2VyTGluZU5vKG1hcmtlcik7Ci0JCQkJCWlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd2JwID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCQkJCS8vIElFZGl0b3JJbnB1dCBpZXUgPSBuZXcgRmlsZUVkaXRvcklucHV0KGYpOwotCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3Iod2JwLCBmKTsKLQotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYmVmb3JlICIKLQkJCQkJCQkJCSsgTWFya2VyVXRpbGl0aWVzLmdldExpbmVOdW1iZXIobWFya2VyKSk7Ci0JCQkJCQkvLyBub3RlOiAocmU/KSBzZXR0aW5nIGxpbmVudW1iZXIgaGVyZSBpcyByZXF1aXJlZCB0bwotCQkJCQkJLy8gcHV0IG1hcmtlciBpbiBlZGl0b3IhPyEKLQkJCQkJCU1hcmtlclV0aWxpdGllcy5zZXRMaW5lTnVtYmVyKG1hcmtlciwgbGluZU5vKTsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGNhOiBtYXJrZXIgbGluZU5vIGFmdGVyICIKLQkJCQkJCQkJCSsgTWFya2VyVXRpbGl0aWVzLmdldExpbmVOdW1iZXIobWFya2VyKSk7Ci0JCQkJCQlJREUuZ290b01hcmtlcihlZGl0b3IsIG1hcmtlcik7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiQVRWOiBEb3VibGVDbGlja0FjdGlvbiwgY2xlYXIgc3RhdHVzIik7Ci0JCQkJCQlzaG93U3RhdHVzTWVzc2FnZSgiIiwgImRvdWJsZSBjbGljayBhY3Rpb24iKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQVRWLmRvdWJsZWNsaWNrQWN0aW9uOiBFcnJvciBwb3NpdGlvbmluZyBlZGl0b3IgcGFnZSBmcm9tIG1hcmtlciBsaW5lIG51bWJlciIpOwotCQkJCQlzaG93U3RhdHVzTWVzc2FnZSgKLQkJCQkJCQkiRXJyb3IgcG9zaXRpb25pbmcgZWRpdG9yIGZyb20gbWFya2VyIGxpbmUgbnVtYmVyIiwKLQkJCQkJCQkiZXJyb3IgbWFya2VyIGdvdG8iKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb3VibGVDbGlja0FjdGlvbigpIHsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24odmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCXZpZXdOYW1lXywgbWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dTdGF0dXNNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVidWdNZXNzYWdlKSB7Ci0JCWlmICh0cmFjZVN0YXR1c0xpbmUpIHsKLQkJCW1lc3NhZ2UgKz0gIiAtICI7Ci0JCQltZXNzYWdlICs9IGRlYnVnTWVzc2FnZTsKLQkJfQotCQlnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkudXBkYXRlKHRydWUpOwotCi0JfQotCi0JLyoqCi0JICogUGFzc2luZyB0aGUgZm9jdXMgcmVxdWVzdCB0byB0aGUgdmlld2VyJ3MgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc2hvd1N0YXR1c01lc3NhZ2UoIiIsICJzZXRGb2N1cyIpOyAvLyByZXNldCBzdGF0dXMgbWVzc2FnZQotCQlpZiAoIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0cmFjZU9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTaW1wbGVUYWJsZVZpZXcuZGlzcG9zZSgpIik7Ci0JCS8vIEJSVCBkbyB3ZSBuZWVkIHRvIGRpc3Bvc2Ugb2YgaW1hZ2VEZXNjcmlwdG9ycyB3ZSBtYWRlPyBvciBqdXN0Ci0JCS8vIGltYWdlcz8KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dNYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJNYXJrZXItLS0tLS0tICBJTWFya2VyLkxJTkVfTlVNQkVSPSIKLQkJCQkrIElNYXJrZXIuTElORV9OVU1CRVIpOwotCQl0cnkgewotCQkJTWFwIGF0dHJzID0gbWFya2VyLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIiArIGUuZ2V0S2V5KCkgKyAiICIgKyBlLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBtYWtlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlVUkwgdXJsID0gdGhlUGx1Z2luXy5maW5kKG5ldyBQYXRoKGljb25OYW1lKSk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIGNoYW5nZSBpbmZvIChhcnRpZmFjdCBhbmQgbWFya2VyKSBvbnRvIGEgc3RhY2sgc28gd2UgY2FuIHJlbWVtYmVyCi0JICogaXQsIGZvciBwb3NzaWJsZSB1bmRvIGFjdGlvbi4gQWxzbyBlbmFibGVzL2Rpc2FibGVzIHRoZSBVbmRvIGFjdGlvbgotCSAqIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiBAcGFyYW0gbWFya2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENoYW5nZWRJbmZvKElBcnRpZmFjdCBhcnRpZmFjdCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJY2hhbmdlZEFydHNfLnB1c2goYXJ0aWZhY3QpOwotCQljaGFuZ2VkTWFya2Vyc18ucHVzaChtYXJrZXIpOwotCQljaGVja1VuZG9TdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc3RhdHVzIG9mIHVuZG8gYWN0aW9uIChlbmFibGVkIG9yIGRpc2FibGVkKSBiYXNlZCBvbiBpZiB0aGVyZSBhcmUgYW55Ci0JICogYXJ0aWZhY3QgY2hhbmdlcywgb3Igb3RoZXIgY2hhbmdlcywgYXZhaWxhYmxlIHRvIHVuZG8KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1VuZG9TdGF0dXMoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgbWFya2VyIGxpbmUgbnVtYmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWFya2VyTGluZU5vKElNYXJrZXIgbWFya2VyKSB7Ci0JCWludCBsaW5lTm8gPSBnZXRJbnRBdHRyKG1hcmtlciwgSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGludCB2YWx1ZSB0aGF0IGlzIGFzc3VtZWQgdG8gYmUgc3RvcmVkIGluIGEgbWFya2VyIGluIGEgZ2l2ZW4KLQkgKiBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUsIG9yIDAgaWYgbm9uZSBmb3VuZCwgb3IgaW52YWxpZCB2YWx1ZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SW50QXR0cihJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHIpIHsKLQkJU3RyaW5nIHRlbXAgPSBudWxsOwotCQl0cnkgewotCQkJdGVtcCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cikudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gQ29yZUV4Y2VwdGlvbiBvciBDbGFzc0Nhc3RFeGNlcHRpb24gcG9zc2libGUKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFUVjogTWFya2VyIGxpbmVObygiICsgYXR0cgotCQkJCQkrICIpIGludmFsaWQ7IHVzaW5nIDAiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBsaW5lTm8gPSAwOwotCQl0cnkgewotCQkJbGluZU5vID0gSW50ZWdlci5wYXJzZUludCh0ZW1wKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBVFY6IE1hcmtlciBsaW5lTm8oIiArIHRlbXAgKyAiIGZyb20gYXR0ciAiCi0JCQkJCSsgYXR0ciArICIpIGludmFsaWQgKE51bWJlckZvcm1hdEV4Y2VwdGlvbik7IHVzaW5nIDAiKTsKLQkJfQotCQlyZXR1cm4gbGluZU5vOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhdHRyaWJ1dGUgU3RyaW5nIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcGFyYW0gYXR0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHIpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKGF0dHIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBFeGNlcHRpb24gZ2V0dGluZyBtYXJrZXIgYXR0cmlidXRlICIgKyBlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIGEgU3RhY2sgdGhhdCBpc24ndCBiYXNlZCBvbiBWZWN0b3IgLSBHZW5lcmljIExJRk8gc3RhY2sKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgU3RhY2tMaXN0IHsKLQkJcHJpdmF0ZSBMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIHB1c2goT2JqZWN0IHYpIHsKLQkJCWxpc3QuYWRkRmlyc3Qodik7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHRvcCgpIHsKLQkJCXJldHVybiBsaXN0LmdldEZpcnN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHBvcCgpIHsKLQkJCXJldHVybiBsaXN0LnJlbW92ZUZpcnN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIGxpc3QuaXNFbXB0eSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBWaXNpdCB0aGUgcmVzb3VyY2UgZGVsdGEgdG8gbG9vayBmb3IgdGhlIG1hcmtlciBjaGFuZ2VzIHdlIGFyZSBpbnRlcmVzdGVkCi0JICogaW4KLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVXBkYXRlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQkJLyoqCi0JCSAqIFZpc2l0IGFwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSByZXNvdXJjZSBkZWx0YSB0byBmaW5kIHRoZSBtYXJrZXJzCi0JCSAqIHRoYXQgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXQuCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVcGRhdGVWaXNpdG9yOiBmaWxlIGNoYW5nZWQ6ICIKLQkJCQkJCQkJKyBuYW1lKTsKLQotCQkJCQkvLyBIYW5kbGUgZmlsZSBjaGFuZ2VzIChzYXZlcykgYnkgcmVwb3J0aW5nIHRoZSBjaGFuZ2VzCi0JCQkJCS8vIG1hZGUgdG8gdGhlIGZpbGUsIHRvIHVwZGF0ZSBiYWNrZW5kIGFuYWx5c2lzCi0JCQkJCS8vIHJlcHJlc2VudGF0aW9uCi0JCQkJCUlGaWxlIGYgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQkJCQlpbnQgY29udGVudENoYW5nZWQgPSBmbGFncyAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQ7Ci0KLQkJCQkJaWYgKHZhbGlkRm9yQW5hbHlzaXMoZi5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRmlsZSAiCi0JCQkJCQkJCQkJCSsgZi5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiIGlzIHZhbGlkIGZvciBhbmFseXNpcyBzbyB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZS4uLiIpOwotCQkJCQkJaWYgKGNvbnRlbnRDaGFuZ2VkICE9IDApIHsKLQkJCQkJCQkvLyBkbyB3ZSBuZWVkIHRvIHRlbGwgYmFjayBlbmQgKGFuYWx5c2lzIGVuZ2luZSkKLQkJCQkJCQkvLyB0aGF0IGZpbGUgY2hhbmdlZD8KLQkJCQkJCX0KLQotCQkJCQkJLy8gcmVmcmVzaCBtYXJrZXJzIGZvciB0aGF0IGZpbGU/Ci0JCQkJCQlJTWFya2VyRGVsdGFbXSBtRGVsdGFzID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQkJCQlpbnQgbGVuID0gbURlbHRhcy5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0JCQkJCQkJSU1hcmtlckRlbHRhIGRlbHRhMyA9IG1EZWx0YXNbal07Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCXNob3dNYXJrZXJEZWx0YUtpbmQoZGVsdGEzKTsKLQkJCQkJCQlJTWFya2VyIG0gPSBkZWx0YTMuZ2V0TWFya2VyKCk7Ci0JCQkJCQkJU3RyaW5nIGxuID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCItLS1VcGRhdGVWaXNpdG9yLnZpc2l0KCk6dmlld2VyIHVwZGF0ZSBtYXJrZXI6IChsaW5lTm8pIik7Ci0JCQkJCQkJLy8gc2hvd01hcmtlcihtKTsKLQkJCQkJCQlTdHJpbmdbXSBwcm9wcyA9IG5ldyBTdHJpbmdbMV07IC8vIGF3a3dhcmQuIHdoeT8/PwotCQkJCQkJCXByb3BzWzBdID0gbG47Ci0JCQkJCQkJLy8ganVzdCB1cGRhdGUgdmlld2VyIGl0ZW0sIG5vdCB0aGUgd2hvbGUgdmlldwotCQkJCQkJCS8vIHZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJdmlld2VyLnVwZGF0ZShtLCBwcm9wcyk7Ci0JCQkJCQl9IC8vIGVuZCBsb29wCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRmlsZSAiCi0JCQkJCQkJCQkJCSsgZi5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiIGlzIE5PVCB2YWxpZCBmb3IgYW5hbHlzaXMgc28gd2lsbCBpZ25vcmUgY2hhbmdlLi4uIik7Ci0KLQkJCQkJfQotCQkJCX0gLy8gZW5kIGlmIENIQU5HRUQKLQkJCQllbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIGFkZGVkLiIpOwotCQkJCQljaGVja01hcmtlckRlbHRhcyhkZWx0YSk7Ci0JCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIHJlcGxhY2VkLiIpOwotCQkJCQljaGVja01hcmtlckRlbHRhcyhkZWx0YSk7Ci0JCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgcmVtb3ZlZC4iKTsKLQkJCQkJY2hlY2tNYXJrZXJEZWx0YXMoZGVsdGEpOwotCQkJCX0KLQkJCX0gLy8gZW5kIGlmIEZJTEUKLQkJCXJldHVybiB0cnVlOyAvLyBrZWVwIGdvaW5nCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY2hlY2tNYXJrZXJEZWx0YXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUlNYXJrZXJEZWx0YVtdIG1kMSA9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJaW50IGxlbiA9IG1kMS5sZW5ndGg7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC4uLiBmb3VuZCAiICsgbGVuICsgIiBtYXJrZXJEZWx0YXMuIik7Ci0JCX0KLQotCQkvKioKLQkJICogU2hvdyBpbmZvIGFib3V0IHRoZSBtYXJrZXIgaW4gdGhlIG1hcmtlciBkZWx0YS4gVGhpcyBpcyBqdXN0IHRyYWNpbmcKLQkJICogdGhlIGluZm8gYXZhaWxhYmxlIHVudGlsIHdlIGRvIHNvbWV0aGluZyB3aXRoIGl0LiBGb3Igbm93LCB3ZSdyZSBqdXN0Ci0JCSAqIGRvaW5nIGEgKGJpZykgdmlld2VyLnJlZnJlc2goKSB0byByZWZyZXNoIGFsbCB0aGUgbWFya2Vycy4gV2hlbiB3ZQotCQkgKiBnZXQgbW9yZSBpbnRlbGxpZ2VudCBhYm91dCBqdXN0IHVwZGF0aW5nIHRoZSBvbmVzIHRoYXQgY2hhbmdlZCwgd2UKLQkJICogY2FuIHJlbW92ZSB0aGF0LiBTaG91bGRuJ3QgbWFrZSBtdWNoIGRpZmZlcmVudCBmb3Igc21hbGwgc2V0cyBvZgotCQkgKiBtYXJrZXJzLCBidXQgZm9yIG1hbnkgbWFya2VycywgdGhpcyBjb3VsZCBiZSBhIHNpZ25pZmljYW50Ci0JCSAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhMwotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNob3dNYXJrZXJEZWx0YUtpbmQoSU1hcmtlckRlbHRhIGRlbHRhMykgewotCi0JCQkvLyBpbnQgbWRLaW5kID0gZGVsdGEzLmdldEtpbmQoKTsKLQkJCUlNYXJrZXIgbSA9IGRlbHRhMy5nZXRNYXJrZXIoKTsKLQotCQkJU3RyaW5nIGtpbmQgPSAiVU5LTk9XTiI7Ci0JCQlzd2l0Y2ggKGRlbHRhMy5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJa2luZCA9ICJBRERFRCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJa2luZCA9ICJDSEFOR0VEIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLQkJCQlraW5kID0gIlJFTU9WRUQiOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlraW5kID0gIlVOS05PV04iOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBtYXJrZXJEZWx0YUtpbmQ9IiArIGtpbmQpOwotCQkJU3RyaW5nIG1pZCA9ICIiLCBtbCA9ICIiLCBtbHBpID0gIiI7Ci0JCQl0cnkgewotCQkJCS8vIG5vdGU6IHdlJ3JlIGdldHRpbmcgbWFya2VyIGRlbHRhcyBvbiBBTEwgbWFya2VycywKLQkJCQkvLyBub3QganVzdCBhcnRpZmFjdCBtYXJrZXJzLCB3aGljaCBjYW4gdGhyb3cgdXMgb2ZmLgotCQkJCS8vIGluIHBhcnRpY3VsYXIsIHRlbXAgbWFya2VycyB1c2VkIGJ5IGFjdGlvbnM/Ci0KLQkJCQltaWQgPSBtLmdldEF0dHJpYnV0ZSh1bmlxdWVJRF8pLnRvU3RyaW5nKCk7Ci0JCQkJbWwgPSBtLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKS50b1N0cmluZygpOwotCQkJCS8vIG1scGkgPSBtLmdldEF0dHJpYnV0ZShJRHMuTElORSkudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCS8vIGlnbm9yZSBlcnJvcnM7IG9ubHkgdHJhY2luZyBmb3Igbm93LgotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJBVFYuVXBkYXRlVmlzaXRvciBlcnJvciBnZXR0aW5nIG1hcmtlciBpbmZvICIpOwotCQkJCS8vZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBtYXJrZXJJRF89IiArIG1pZAotCQkJCQkJKyAiICBsaW5lTm8obWtyLW1waUEpPSIgKyBtbCArICItIiArIG1scGkpOwotCQl9Ci0KLQl9IC8vIGVuZCBjbGFzcyBVcGRhdGVWaXNpdG9yCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L1NpbXBsZVRyZWVUYWJsZUVycm9yVmlldy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9hbmFseXNpcy92aWV3L1NpbXBsZVRyZWVUYWJsZUVycm9yVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWI3ZDg4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9TaW1wbGVUcmVlVGFibGVFcnJvclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy52aWV3OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5JQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLklEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci0vKioKLSogVE9ETzogVGhpcyBpcyBiYXNpY2FsbHkgYSBjb3B5IG9mIGNsYXNzIGZyb20gY29tbW9uIHBsdWdpbgotKiAob3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uKTsgbmVlZCB0byB3b3JrIHRvd2FyZCByZXBsYWNpbmcgdGhpcyB3aXRoIHRoYXQgb25lIC0KLSogaG93ZXZlciBzb21lIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhpcyBvbmUKLSovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHJlZVRhYmxlRXJyb3JWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByb3RlY3RlZCBUcmVlVmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgVHJlZSB0cmVlOyAvLyBrZWVwIHNvIHdlIGNhbiBkaXNwb3NlIG9mIGxpc3RlbmVycyBpbiBkaXNwb3NlKCk/Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uIGluZm9BY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBmaWx0ZXJBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBkb3VibGVDbGlja0FjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZVN0YXR1c0xpbmUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBWaWV3ZXJTb3J0ZXIgbmFtZVNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIGxpbmVOb1NvcnRlcjsKLQotCXByb3RlY3RlZCBGaWxlbmFtZVNvcnRlciBmaWxlbmFtZVNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIG9yZGVyU29ydGVyOyAvLyBieSAiaWNvbiIKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIG5hbWVBcnRpZmFjdFNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIGNvbnN0cnVjdFNvcnRlcjsKLQotCXByaXZhdGUgSU1hcmtlciBzZWxlY3RlZE1hcmtlcl8gPSBudWxsOwotCi0JLyoqCi0JICogTGlzdCBvZiBhcnRpZmFjdHMgdGhhdCB3ZXJlIGNoYW5nZWQgZHVlIHRvIHNvbWUgYWN0aW9uIHVwb24gdGhlbSBpbiB0aGUKLQkgKiB2aWV3IChjdXJyZW50bHkgdW51c2VkKQotCSAqLwotCXByb3RlY3RlZCBTdGFja0xpc3QgY2hhbmdlZEFydHNfID0gbmV3IFN0YWNrTGlzdCgpOwotCi0JLyoqCi0JICogTGlzdCBvZiBtYXJrZXJzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiBhIGNoYW5nZSBvbiB0aGUgdGhlIGFzc29jaWF0ZWQKLQkgKiBhcnRpZmFjdCBkdWUgdG8gc29tZSBhY3Rpb24gdXBvbiB0aGVtIGhlcmUgaW4gdGhlIHZpZXcgKGN1cnJlbnRseSB1bnVzZWQpCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrTGlzdCBjaGFuZ2VkTWFya2Vyc18gPSBuZXcgU3RhY2tMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgVXBkYXRlVmlzaXRvciB2aXNpdG9yXyA9IG5ldyBVcGRhdGVWaXNpdG9yKCk7Ci0KLQkvKioKLQkgKiBCZSBjb25zaXN0ZW50IGFib3V0IHdoYXQgd2UgY2FsbCB0aGVzZSB0aGluZ3M7IGdlbmVyaWMgdmFsdWVzIChjYW4gYmUpCi0JICogcmVwbGFjZWQgb24gY3Rvci4gPGJyPgotCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gcGx1Z2luLnhtbCBpZiBub3QgcGFzc2VkIG9uIGN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRoaW5nbmFtZV8gPSAiQXJ0aWZhY3QiOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0aGluZ25hbWVzXyA9ICJBcnRpZmFjdHMiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29sdW1uTmFtZV8gPSAiVmFsdWUiOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbl87Ci0KLQlwcml2YXRlIFN0cmluZyBpY29uTmFtZV8gPSAiaWNvbnMvc2FtcGxlLmdpZiI7Ci0KLQlwcml2YXRlIFN0cmluZyB2aWV3TmFtZV87Ci0KLQlwcml2YXRlIFN0cmluZyBtYXJrZXJJRF87Ci0KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RNYW5hZ2VyIGFydGlmYWN0TWFuYWdlcl87Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtbk5hbWVzXzsKLQotCXByaXZhdGUgU3RyaW5nW10gbWFya2VyQXR0ck5hbWVzXzsKLQotCS8qKgotCSAqIFRoZSBJRCB1c2VkIGluIHRoZSBtYXJrZXIgZm9yIHRoZSB1bmlxdWUgSUQgZm9yIGVhY2ggYXJ0aWZhY3QuIEVuYWJsZXMKLQkgKiBtYXBwaW5nIGJhY2sgdG8gdGhlIEFydGlmYWN0IG9iamVjdCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1bmlxdWVJRF8gPSAidW5pcXVlSUQiOwotCi0JLyoqCi0JICogVGhlIElEIHVzZWQgaW4gdGhlIG1hcmtlciBmb3IgdGhlIGV4dHJhIGNvbHVtbiBvZiBpbmZvcm1hdGlvbiAobGFzdAotCSAqIGNvbHVtbikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbklEXyA9ICJjb25zdHJ1Y3RUeXBlIjsgLy8gaWQgZm9yICh2YXJpYWJsZSkKLQotCS8qKiBNYXJrZXIgSUQgZm9yIGFydGlmYWN0IG5hbWUgLSBlLmcuIEFQSSBuYW1lLCBwcmFnbWEgbmFtZSwgZXRjLiAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLQkvKiogTWFya2VyIElEIGZvciBzdG9yYWdlIG9mIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgYXJ0aWZhY3QgaXMgZm91bmQgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRSA9ICJmaWxlbmFtZSI7Ci0KLQkvKioKLQkgKiBNYXJrZXIgaWQgZm9yIHN0b3JhZ2Ugb2YgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGFydGlmYWN0IGlzIGZvdW5kLgotCSAqIFJldXNlIG9mIGRlZmF1bHQgSUQgdXNlZCBieSBJTWFya2VyLCByZXBlYXRlZCBoZXJlIGZvciBlYXNlIG9mIHVzZSBhbmQKLQkgKiBmb3IgY2xhcml0eSB0aGF0IFRISVMgaXMgdGhlIG1hcmtlciBJRCBmb3IgbGluZSBudW1iZXIuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0KLQkvKiogTWFya2VyIGlkIGZvciBzdG9yYWdlIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFydGlmYWN0ICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVU5DVElPTl9DQUxMID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UID0gMjsKLQotCS8qKiB0eXBlcyBvZiBjb25zdHJ1Y3RzLCBmb3IgdGhlIGRlZmF1bHQgY2FzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OU1RSVUNUX1RZUEVfTkFNRVMgPSB7ICJOb25lIiwgIkZ1bmN0aW9uIENhbGwiLCAiQ29uc3RhbnQiIH07Ci0KLQkvKioKLQkgKiBTaW1wbGUgQXJ0aWZhY3QgVGFibGUgVmlldyBjb25zdHJ1Y3RvcgotCSAqIDxwPgotCSAqIEV2ZXJ5dGhpbmcgY2FuIGJlIG51bGwsIGFuZCBkZWZhdWx0cyB3aWxsIGJlIHRha2VuLCBvciByZWFkIGZyb20KLQkgKiBwbHVnaW4ueG1sIGZvciB0aGUgdmlldy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBpZiBhIG51bGwgcGx1Z0luIGluc3RhbmNlIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBwbHVnaW4gKHRoaXMKLQkgKiBvbmUpIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCByZXNvdXJjZXMgKGUuZy4gaWNvbiBpbWFnZXMpIGlmIHRoZSBkZXJpdmVkCi0JICogY2xhc3MgaXMgaW4gaXRzIG93biBwbHVnLWluLCBhbmQgaXRzIGljb25zIGFyZSwgdG9vLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmVlVGFibGVFcnJvclZpZXcoQWJzdHJhY3RVSVBsdWdpbiB0aGVQbHVnaW4sIFN0cmluZyB0aGluZ25hbWUsIAotCQkJU3RyaW5nIHRoaW5nbmFtZXMsIFN0cmluZyBjb2x1bW5OYW1lLCBTdHJpbmcgbWFya2VySUQpIHsKLQotCQlpZiAodGhlUGx1Z2luID09IG51bGwpIHsKLQkJCXRoZVBsdWdpbl8gPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy50aGVQbHVnaW5fID0gdGhlUGx1Z2luOwotCQl9Ci0JCWlmICh0aGluZ25hbWUgIT0gbnVsbCkKLQkJCXRoaXMudGhpbmduYW1lXyA9IHRoaW5nbmFtZTsKLQkJaWYgKHRoaW5nbmFtZXMgIT0gbnVsbCkKLQkJCXRoaXMudGhpbmduYW1lc18gPSB0aGluZ25hbWVzOwotCQlpZiAoY29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVfID0gY29sdW1uTmFtZTsgLy8gbGFzdCBjb2x1bW4gbmFtZWQgYnkgc3ViY2xhc3MKLQkJfQotCQl0aGlzLm1hcmtlcklEXyA9IG1hcmtlcklEOy8vIGlmIG51bGwsIHdpbGwgdXNlIHZpZXcgaWQuCi0KLQkJZmluZFZpZXdJbmZvKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdGFibGUgdmlldyB3aXRoIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZXh0cmEgY29sdW1ucwotCSAqIAotCSAqIEBwYXJhbSB0aGVQbHVnaW4KLQkgKiBAcGFyYW0gdGhpbmduYW1lCi0JICogQHBhcmFtIHRoaW5nbmFtZXMKLQkgKiBAcGFyYW0gYXR0ck5hbWVzCi0JICogICAgICAgICAgICBsaXN0IG9mIG1hcmtlciBhdHRyaWJ1dGVzLCBmb3Igd2hpY2ggdGhlIGNvbHVtbiB2YWx1ZXMgd2lsbCBiZQotCSAqICAgICAgICAgICAgZXh0cmFjdGQKLQkgKiBAcGFyYW0gY29sTmFtZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgQ29sdW1uIG5hbWVzLCB1c2VkIGFzIGhlYWRlcnMgZm9yIHRoZSB2YWx1ZXMgZm91bmQgaW4KLQkgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgYXR0cmlidXRlcwotCSAqIEBwYXJhbSBtYXJrZXJJRF8KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHJlZVRhYmxlRXJyb3JWaWV3KEFic3RyYWN0VUlQbHVnaW4gdGhlUGx1Z2luLCBTdHJpbmcgdGhpbmduYW1lLCAKLQkJCVN0cmluZyB0aGluZ25hbWVzLCBTdHJpbmdbXSBhdHRyTmFtZXMsIFN0cmluZ1tdIGNvbE5hbWVzLCBTdHJpbmcgbWFya2VySUQpIHsgCi0JCXRoaXModGhlUGx1Z2luLCB0aGluZ25hbWUsIHRoaW5nbmFtZXMsIG51bGwsIG1hcmtlcklEKTsKLQkJY29sdW1uTmFtZXNfID0gY29sTmFtZXM7Ci0JCWNvbHVtbk5hbWVfID0gbnVsbDsvLyBzZXQgdGhpcyBzbyB3ZSBjYW4gdGVsbCB3ZSBhcmUgdXNpbmcgYXJyYXkgb2YKLQkJLy8gYXR0cnMvY29scwotCQltYXJrZXJBdHRyTmFtZXNfID0gYXR0ck5hbWVzOwotCi0JfQotCi0JLyoqCi0JICogQ3RvciB0aGF0IHVzZXMgZGVmYXVsdHMgZm9yIGV2ZXJ5dGhpbmcgKHRlc3Rpbmc/IHRoZW9yZXRpY2FsbHksIHRoaXMKLQkgKiBzaG91bGQgd29yaywgYW5kIHNob3VsZCBiZSByZXVzYWJsZSBzaW5jZSBpbmZvIHRoYXQgbXVzdCBiZSB1bmlxdWUgaXMKLQkgKiByZWFkIGZyb20gZnJvbSBwbHVnaW4ueG1sLikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHJlZVRhYmxlRXJyb3JWaWV3KCkgewotCQl0aGlzKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgaW5mbyBmcm9tIHRoZSB2aWV3IGluZm8gaW4gdGhlIG1hbmlmZXN0LiBUaGlzIGluY2x1ZGVzIHRoZSBpY29uCi0JICogbmFtZSwgdGhlIHZpZXcgaWQgKHVzZWQgYXMgbWFya2VyIGlkIGlmIG5vbmUgZ2l2ZW4gb24gY3RvciksIGFuZAotCSAqIGNvbnN0cnVjdHMgYW4gYXJ0aWZhY3QgbWFuYWdlciBmb3IgdGhpcyB2aWV3J3MgYXJ0aWZhY3Qgb2JqZWN0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRWaWV3SW5mbygpIHsKLQkJU3RyaW5nIGNsYXNzbmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCS8vIHRyeSB0byBmaW5kIHRoZSBpY29uIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmb3IgdGhpcwotCQkvLyBleHRlbnNpb24vdmlldwotCQlJRXh0ZW5zaW9uW10gZXh0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UudWkudmlld3MiKS5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dFtpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNlcyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNFbGVtZW50ID0gY2VzW2pdOwotCQkJCVN0cmluZyBpY29uTmFtZSA9IGNFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWNvbiIpOwotCQkJCVN0cmluZyBjbGFzc04gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCQlpZiAoY2xhc3NuYW1lLmVxdWFscyhjbGFzc04pKSB7Ci0JCQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpY29uTmFtZV8gPSBpY29uTmFtZTsKLQkJCQkJfQotCQkJCQl0aGlzLnZpZXdOYW1lXyA9IG5hbWU7Ci0JCQkJCWlmIChtYXJrZXJJRF8gPT0gbnVsbCkgewotCQkJCQkJLy8gdXNlIHBsdWdpbiBpZCBmb3IgbWFya2VyIGlkLCBpZiBub3Qgc3BlY2lmaWVkCi0JCQkJCQltYXJrZXJJRF8gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQkJCX0KLQkJCQkJYXJ0aWZhY3RNYW5hZ2VyXyA9IEFydGlmYWN0TWFuYWdlci5nZXRNYW5hZ2VyKG1hcmtlcklEXyk7Ci0JCQkJCWlmIChhcnRpZmFjdE1hbmFnZXJfID09IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0TWFuYWdlcl8gPSBuZXcgQXJ0aWZhY3RNYW5hZ2VyKG1hcmtlcklEXyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQgbWlnaHQgYmUgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIHRoaXMsIHRvIHNheSB3aGljaAotCSAqIGZpbGVuYW1lcyBzaG91bGQgYWxsb3cgdGhlIGFjdGlvbiAicnVuIGFuYWx5c2lzIiB0byBjcmVhdGUgbmV3IGFydGlmYWN0cwotCSAqIGFuZCB0aHVzIG5ldyBtYXJrZXJzLiA8YnI+Ci0JICogVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRGb3JBbmFseXNpcyhTdHJpbmcgZmlsZW5hbWUpIHsKLQkJLy8gcmV0dXJuIE1waVV0aWwudmFsaWRGb3JBbmFseXNpcyhmaWxlbmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBvYmplY3RzIHRvIHRoZQotCSAqIHZpZXcuIEl0IGNhbiB3cmFwIGV4aXN0aW5nIG9iamVjdHMgaW4gYWRhcHRlcnMgb3Igc2ltcGx5IHJldHVybiBvYmplY3RzCi0JICogYXMtaXMuIFRoZXNlIG9iamVjdHMgbWF5IGJlIHNlbnNpdGl2ZSB0byB0aGUgY3VycmVudCBpbnB1dCBvZiB0aGUgdmlldywKLQkgKiBvciBpZ25vcmUgaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgKGxpa2UgVGFzayBMaXN0LCBmb3IKLQkgKiBleGFtcGxlKS4KLQkgKi8KLQljbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUcmVlQ29udGVudFByb3ZpZGVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgSVJlc291cmNlIGlucHV0OwotCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNSZWdpc3RlcmVkID0gZmFsc2U7Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2LCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy8gY291bGQgdXNlIHRoaXMgdG8gY2hhbmdlIHRoZSBsaXN0IHRvIGp1c3QgYXJ0aWZhY3RzIGZyb20gb25lCi0JCQkvLyByZXNvdXJjZSwKLQkJCS8vIGV0Yy4uLgotCQkJLy8gY291bGQgY2FjaGUgdmlld2VyIGhlcmUgdGhpcy52aWV3ZXI9djsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVYgaW5wdXRDaGFuZ2VkKCkuLi4iKTsKLQkJCS8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGdpdmVuIGFuIGlucHV0Ci0JCQlpZiAoIWhhc1JlZ2lzdGVyZWQpIHsKLQkJCQkvLyBhZGQgbWUgYXMgYSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIgc28gaSBjYW4gcmVmcmVzaCBhdAotCQkJCS8vIGxlYXN0IHdoZW4gbWFya2VycyBhcmUgY2hhbmdlZAotCQkJCS8vIFBPU1RfQ0hBTkdFOiBvbmx5IHdhbnQgZXZlbnQgbm90aWZpY2F0aW9ucyBmb3IgYWZ0ZXItdGhlLWZhY3QKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQkJaGFzUmVnaXN0ZXJlZCA9IHRydWU7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6IFJlZ2lzdGVyZWQgUkNMIGZvciBWaWV3Q29udGVudFByb3ZpZGVyIik7Ci0JCQl9Ci0JCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQl0aGlzLmlucHV0ID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WLlZpZXdDb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpIik7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIHBvcHVsYXRlIHRoaXMgdmlldy4KLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlPYmplY3RbXSBvYmpzID0gbnVsbDsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaWQgPSBtYXJrZXJJRF87Ci0JCQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImlucHV0IGlzIG51bGwgaW4gZ2V0RWxlbWVudHMuLi4iKTsKLQkJCQl9Ci0JCQkJb2JqcyA9IGlucHV0LmZpbmRNYXJrZXJzKGlkLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gKElNYXJrZXJbXSkgb2JqczsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgbXlOYW1lID0gZ2V0TXlOYW1lKG1hcmtlcik7Ci0JCQkJCWlmKG15TmFtZS5lcXVhbHMoIkVycm9yIikpewotCQkJCQkJbGlzdC5hZGQobWFya2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVYsIGV4Y2VwdGlvbiBnZXR0aW5nIG1vZGVsIGVsZW1lbnRzIChtYXJrZXJzIGZvciBUYWJsZSB2aWV3KSIpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WLmdldC0tLUVsZW1lbnRzLCBmb3VuZCAiICsgb2Jqcy5sZW5ndGggKyAiIG1hcmtlcnMvcGFyZW50Tm9kZXMiKTsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQotCQl9Ci0JCQotCQlwcml2YXRlIGludCBnZXRQYXJlbnRJRChJTWFya2VyIG1hcmtlcil7Ci0JCQlpbnQgcGFyZW50SUQgPSAwOwotCQkJdHJ5ewotCQkJCXBhcmVudElEID0gKChJbnRlZ2VyKW1hcmtlci5nZXRBdHRyaWJ1dGUoSURzLnBhcmVudElEQXR0cikpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50SUQ7Ci0JCX0KLQkJCi0JCXByaXZhdGUgaW50IGdldE15SUQoSU1hcmtlciBtYXJrZXIpewotCQkJaW50IHBhcmVudElEID0gMDsKLQkJCXRyeXsKLQkJCQlwYXJlbnRJRCA9ICgoSW50ZWdlciltYXJrZXIuZ2V0QXR0cmlidXRlKElEcy5teUlEQXR0cikpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50SUQ7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRNeU5hbWUoSU1hcmtlciBtYXJrZXIpewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW51bGw7Ci0JCQl0cnl7Ci0JCQkJbmFtZSA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJRHMubXlOYW1lQXR0cik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIGdldCB0aGUgY2hpbGRyZW4gKG1hcmtlcnMpIG9mIGEgcGFyZW50IG5vZGUKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCUlNYXJrZXIgcGFyZW50TWFya2VyID0gKElNYXJrZXIpcGFyZW50OwotCQkJCWludCBwYXJlbnRJRCA9IGdldE15SUQocGFyZW50TWFya2VyKTsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbWFya2VycyA9IGlucHV0LmZpbmRNYXJrZXJzKG1hcmtlcklEXywgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJTGlzdDxJTWFya2VyPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlpbnQgaWQgPSBnZXRQYXJlbnRJRChtYXJrZXIpOwotCQkJCQlpZiAoaWQgPT0gcGFyZW50SUQpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQl9Ci0JCQkvLyBtYXJrZXJzIGFyZSBsZWFmIG5vZGVzLCB0aGV5IGRvbid0IGhhdmUgY2hpbGRyZW4KLQkJCS8vIGlmIG5vdCBhIFBhcmVudE5vZGUsIHRoZW4gaXQgc2hvdWxkIGJlIGEgbGVhZiBub2RlIChtYXJrZXIpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJSU1hcmtlciBjaGlsZCA9IChJTWFya2VyKSBlbGVtZW50OwotCQkJCWludCBwYXJlbnRJRCA9IGdldFBhcmVudElEKGNoaWxkKTsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbWFya2VycyA9IGlucHV0LmZpbmRNYXJrZXJzKG1hcmtlcklEXywgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJaW50IGlkID0gZ2V0TXlJRChtYXJrZXIpOwotCQkJCQlpZiAoaWQgPT0gcGFyZW50SUQpIHsKLQkJCQkJCXJldHVybiBtYXJrZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlPYmplY3RbXSBraWRzID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlib29sZWFuIGhhc0tpZHMgPSBraWRzLmxlbmd0aCA+IDA7Ci0JCQlyZXR1cm4gaGFzS2lkczsKLQkJfQotCi0JCQotCQkvKioKLQkJICogcmVhY3QgdG8gYSByZXNvdXJjZSBjaGFuZ2UgZXZlbnQKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkgKi8KLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS1yZXNvdXJjZUNoYW5nZWQoKSIpOwotCQkJZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRSZXNvdXJjZXNDaGFuZ2VkKGRlbHRhLCAxKTsKLQkJCS8vIHJlbW92ZSB0aGUgZm9sbG93aW5nIHdoZW4gcmVzb3VyY2UgZGVsdGEgdmlzaXRvciBkb2VzIGl0IGFsbD8KLQkJCUNvbnRyb2wgY3RybCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQlpZiAoY3RybCAhPSBudWxsICYmICFjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2aWV3ZXIudXBkYXRlIGVhIG1rciBpbiBkZWx0YS0tIGZyb20gcmVzb3VyY2VDaGFuZ2VkKCkuLi4iKTsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoKS4uLiIpOwotCQkJCQkJCXByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKGRlbHRhKTsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tRU5EIHByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKCkuLi4iKTsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2aWV3ZXIucmVmcmVzaCgpIik7Ci0JCQkJCQkJLy8gd2Ugc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgaW5kaXYuIHJvd3Mgd2UgY2FyZQotCQkJCQkJCS8vIGFib3V0LAotCQkJCQkJCS8vIGJ1dCBuZWVkIHRoaXMgZm9yIE1hcmtlciBkaXNwbGF5IGFmdGVyIGluaXRpYWwKLQkJCQkJCQkvLyBhbmFseXNpcywKLQkJCQkJCQkvLyBhbmQgZm9yIG1hcmtlcnMgZGVsZXRlZCwgZXRjLiBDYW4gcmVtb3ZlIHdoZW4gd2UKLQkJCQkJCQkvLyBtb3JlIGNvbXBsZXRlbHkKLQkJCQkJCQkvLyBoYW5kbGUgdGhpbmdzIGluIHByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhCi0JCQkJCQkJLy8gKHJlbW92ZXMgZXRjLikKLQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6IEV4Y2VwdGlvbiByZWZyZXNoaW5nIHZpZXdlcjogIiArIGUpOwotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLUVORCByZXNvdXJjZUNoYW5nZWQoKVxuIik7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBEZWJ1Z2dpbmcgc3RhdGVtZW50IGhlbHAgLSBwcmludHMgdGhlIGV2ZW50cywgaW5kZW50ZWQgYnkgbmVzdGluZwotCQkgKiBsZXZlbAotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqIEBwYXJhbSBpbmRlbnQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBwcmludFJlc291cmNlc0NoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBpbmRlbnQpIHsKLQkJCXByaW50T25lUmVzb3VyY2VDaGFuZ2VkKGRlbHRhLCBpbmRlbnQpOwotCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJcHJpbnRSZXNvdXJjZXNDaGFuZ2VkKGNoaWxkcmVuW2ldLCBpbmRlbnQgKyAxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnQgaGVscAotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqIEBwYXJhbSBpbmRlbnQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBwcmludE9uZVJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGluZGVudCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoODApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQkJCQlidWYuYXBwZW5kKCIgICIpOwotCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJYnVmLmFwcGVuZCgiQURERUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLQkJCQlidWYuYXBwZW5kKCJSRU1PVkVEIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJYnVmLmFwcGVuZCgiQ0hBTkdFRCIpOwotCQkJCXRlc3REZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJ1Zi5hcHBlbmQoIlsiKTsKLQkJCQlidWYuYXBwZW5kKGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJYnVmLmFwcGVuZCgiXSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnVmLmFwcGVuZCgiICIpOwotCQkJYnVmLmFwcGVuZChkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihidWYpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNob3cgZGVidWdnaW5nIGluZm8gZm9yIGEgcmVzb3VyY2UgZGVsdGEgY2hhbmdlCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICovCi0JCXByaXZhdGUgdm9pZCB0ZXN0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIC0tIGNvZGUgZnJvbSBlY2xpcHNlIGhlbHA6Ci0JCQkvLyBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJSZXNvdXJjZSAiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoZGVsdGEuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBoYXMgY2hhbmdlZC4iKTsKLQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0+IENvbnRlbnQgQ2hhbmdlIik7Ci0JCQl9Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tPiBDb250ZW50IFJlcGxhY2VkIik7Ci0JCQl9Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gMCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0+IE1hcmtlciBDaGFuZ2UiKTsKLQkJCQkvLyBJTWFya2VyRGVsdGFbXSBtYXJrZXJzID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQkJLy8gaWYgaW50ZXJlc3RlZCBpbiBtYXJrZXJzLCBjaGVjayB0aGVzZSBkZWx0YXMKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBQcm9jZXNzIHRoZSByZXNvdXJjZSBjaGFuZ2UgLSBqdXN0IHRoZSBkZWx0YQotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcl8pOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBQSVRWLnByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKCkuLiIpOwotCQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9IC8vIGVuZCBWaWV3Q29udGVudFByb3ZpZGVyCi0KLQotCS8qKgotCSAqIGdldCBhcnRpZmFjdCBmcm9tIG1hcmtlcgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcnRpZmFjdCBnZXRTaW1wbGVBcnRpZmFjdChJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJQXJ0aWZhY3QgYXJ0aWZhY3QgPSBudWxsOwotCQl0cnkgewotCQkJaWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXyk7Ci0JCQlhcnRpZmFjdCA9IGFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3QoaWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSArICIgLi4uIFNUViwgQ29yZUV4Y2VwdGlvbiBnZXR0aW5nIGFydGlmYWN0IGZyb20gaGFzaE1hcDsgIiArIHRoaW5nbmFtZV8KLQkJCQkJKyAiIGlkPSIgKyBpZCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5lKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmUuZ2V0TWVzc2FnZSgpICsgIiAuLi4gU1RWLCBOdWxsUHRyRXhjcCBnZXR0aW5nIGFydGlmYWN0IGZyb20gaGFzaE1hcDsiICsgdGhpbmduYW1lXwotCQkJCQkrICIgaWQ9IiArIGlkKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3Q7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBjb25zdHJ1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uc3RydWN0U3RyKElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUludGVnZXIgdGVtcCA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKGNvbHVtbklEXyk7Ci0JCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCUludGVnZXIgY29uc3RydWN0VHlwZSA9IChJbnRlZ2VyKSB0ZW1wOwotCQkJLy9yZXR1cm4gQ09OU1RSVUNUX1RZUEVfTkFNRVNbY29uc3RydWN0VHlwZS5pbnRWYWx1ZSgpXTsKLQkJCUludGVnZXIgaW5kZXggPSBuZXcgSW50ZWdlcihjb25zdHJ1Y3RUeXBlLmludFZhbHVlKCkgLSA0KTsKLQkJCXJldHVybiBpbmRleC50b1N0cmluZygpOwotCQl9IGVsc2UKLQkJCXJldHVybiAiICI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogVmlld0xhYmVsUHJvdmlkZXIgLSBwcm92aWRlcyB0aGUgdGV4dCBhbmQgaW1hZ2VzIGZvciB0aGUgYXJ0aWZhY3RzIGluIHRoZQotCSAqIFRhYmxlIFZpZXcKLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKiAKLQkgKiAKLQkgKi8KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJLyoqCi0JCSAqIEtlZXAgaWNvbnMgYWxyZWFkeSBjcmVhdGVkLCBhbmQgcmV1c2UgdGhlIGltYWdlcwotCQkgKi8KLQkJcHJpdmF0ZSBIYXNoTWFwIGljb25IYXNoID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcml2YXRlIElBcnRpZmFjdCBhcnRpZmFjdDsKLQotCQkvKioKLQkJICogcHJvdmlkZSB3aGF0IGdvZXMgaW4gZWFjaCBjb2x1bW47IGdldCB0aGUgaW5mbyBmcm9tIHRoZSBtYXJrZXIKLQkJICovCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG8pIHsKLQkJCVN0cmluZyB0ZW1wID0gc3VwZXIuZ2V0VGV4dChvKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGV4dDogIiArIHRlbXApOwotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQotCQkvKioKLQkJICogRGV0ZXJtaW5lIHRoZSB0ZXh0IHRvIGdvIGluIGVhY2ggY29sdW1uLiAKLQkJICogCi0JCSAqIEBwYXJhbSBvYmoKLQkJICogICAgICAgICAgICB0aGUgTWFya2VyICh3ZSBob3BlKSB0aGF0IGdvZXMgb24gdGhlIGN1cnJlbnQgcm93Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB0YWJsZQotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCWlmIChvYmogPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6IExhYmVsUHJvdiBvYmogaXMgbnVsbDsgaW5kZXg9IiArIGluZGV4KTsKLQkJCQlyZXR1cm4gIlNUVE1WIG9iaiBudWxsIjsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwkJCQotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBteU5hbWUgPSAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSURzLm15TmFtZUF0dHIpOwotCQkJCQlpZighbXlOYW1lLnN0YXJ0c1dpdGgoIlBhdGgiKSB8fCAhbXlOYW1lLnN0YXJ0c1dpdGgoIkxvb3AiKSl7Ci0JCQkJCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJCQljYXNlIDA6Ci0JCQkJCQkJcmV0dXJuIG15TmFtZTsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQkJCQkJCXJldHVybiBpZDsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlyZXR1cm4gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJCQljYXNlIDM6Ci0JCQkJCQkJU3RyaW5nIGxpbmUgPSAobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKSkudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJZGVidWdNYXJrZXJJbmZvKG1hcmtlciwgbGluZSk7Ci0JCQkJCQkJcmV0dXJuIGxpbmU7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJaWYobXlOYW1lLmVxdWFscygiRXJyb3IiKSkgcmV0dXJuICIiOwotCQkJCQkJCUludGVnZXIgaW5kZXhOdW0gPSAoSW50ZWdlciltYXJrZXIuZ2V0QXR0cmlidXRlKElEcy5teUluZGV4QXR0cik7Ci0JCQkJCQkJcmV0dXJuIGluZGV4TnVtLnRvU3RyaW5nKCk7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG1hcmtlckF0dHJOYW1lc19baW5kZXggLSA0XTsKLQkJCQkJCQlTdHJpbmcgdmFsID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyTmFtZSwgIiIpOwotCQkJCQkJCXJldHVybiB2YWw7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzd2l0Y2ggKGluZGV4KXsKLQkJCQkJCWNhc2UgMDoKLQkJCQkJCQlyZXR1cm4gbXlOYW1lOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlyZXR1cm4gIiI7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJcmV0dXJuICgiU1RUTVYgZXJyb3IgaW4gVmlld0NvbnRlbnRQcm92aWRlciBvZiBTaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3Iik7Ci0JCQkJfQotCQkJfSAKLQkJCXJldHVybiAiU1RUTVYsIHZjcD8/PyI7Ci0JCX0KLQotCQkvKioKLQkJICogUHVyZWx5IGZvciBkZWJ1Z2dpbmcgbWFya2VyIGluZm8gaW4gVmlld0xhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dCgpCi0JCSAqIAotCQkgKiBAcGFyYW0gbWFya2VyCi0JCSAqIEBwYXJhbSBsaW5lCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgZGVidWdNYXJrZXJJbmZvKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgbGluZSkgewotCQkJYXJ0aWZhY3QgPSBnZXRTaW1wbGVBcnRpZmFjdChtYXJrZXIpOwotCQkJU3RyaW5nIGNvbXBMaW5lID0gbGluZSArICItIjsKLQkJCWlmIChhcnRpZmFjdCA9PSBudWxsKSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVYgZ2V0Q29sdW1uVGV4dC0gbnVsbCBhcnRpZmFjdCIpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgbGluZUFydGlmYWN0ID0gYXJ0aWZhY3QuZ2V0TGluZSgpOwotCQkJCWNvbXBMaW5lID0gY29tcExpbmUgKyBsaW5lQXJ0aWZhY3Q7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WLlZpZXdMYWJlbFByb3ZpZGVyIGdldHMgbWFya2VyIGxpbmU6IG1rci1hcnRpZmFjdDogIiArIGNvbXBMaW5lKTsKLQkJCXNob3dNYXJrZXIobWFya2VyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQcm92aWRlIHRoZSBpbWFnZSB0aGF0IGdvZXMgaW4gYSBjb2x1bW4sIGlmIGFueSAoTm90ZSB0aGF0IGEgdGFibGUKLQkJICogY2VsbCBjYW4gY29udGFpbiBib3RoLCBhbiBpbWFnZSBhbmQgdGV4dCwgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQKLQkJICogc2lkZS1ieS1zaWRlKQotCQkgKiAKLQkJICogQHBhcmFtIG9iaiAtCi0JCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB3ZSdyZSBnZXR0aW5nIHRoZSBpbWFnZSBmb3IKLQkJICogQHBhcmFtIGluZGV4IC0KLQkJICogICAgICAgICAgICB0aGUgY29sdW1uIHRoYXQgdGhpcyBpbWFnZSBpcyB0byBnbyBpbgotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQkJLy8gd2Ugb25seSBwdXQgaW1hZ2UgaWNvbiBpbiB0aGUgZmlyc3QgY29sdW1uCi0JCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuIGdldEN1c3RvbUltYWdlKG9iaik7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCBpbWFnZSBmb3IgYXJ0aWZhY3QuIE5vdGUgdGhhdCBkaWZmZXJlbnQgaW1hZ2VzIGNvdWxkIGJlIHVzZWQgZm9yCi0JCSAqIGRpZmZlcmVudCB0eXBlcyBvZiBhcnRpZmFjdHMuIEZvciBub3cgd2UgaGF2ZSBhIHNpbmdsZSBpbWFnZS4KLQkJICogCi0JCSAqIEBwYXJhbSBvYmoKLQkJICogICAgICAgICAgICB0aGUgbWFya2VyIG9iamVjdCB0aGF0IHRoaXMgYXJ0aWZhY3QgaXMgcmVwcmVzZW50ZWQgYnkKLQkJICogQHJldHVybiBpbWFnZSBmb3IgbWFya2VyCi0JCSAqICAgICAgICAgPHA+Ci0JCSAqICAgICAgICAgTm90ZTogaWYgYSBudWxsIHBsdWdJbiBpbnN0YW5jZSBpcyBwcm92aWRlZCBvbiB0aGUgdmlldyBjdG9yLAotCQkgKiAgICAgICAgIHRoZSBkZWZhdWx0IHBsdWdpbiAodGhpcyBvbmUpIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZAotCQkgKiAgICAgICAgIHJlc291cmNlcyAoZS5nLiBpY29uIGltYWdlcykgaWYgdGhlIGRlcml2ZWQgY2xhc3MgaXMgaW4gaXRzCi0JCSAqICAgICAgICAgb3duIHBsdWctaW4sIGFuZCBpdHMgaWNvbnMgYXJlLCB0b28uCi0JCSAqIAotCQkgKi8KLQkJcHJvdGVjdGVkIEltYWdlIGdldEN1c3RvbUltYWdlKE9iamVjdCBvYmopIHsKLQkJCS8vIGlmIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBvbmUgb2YgdGhpcyB0eXBlIG9mIGljb24sIHJldXNlIGl0LgotCQkJLy8gTm90ZTogdXNlIEltYWdlUmVnaXN0cnkgaW5zdGVhZD8KLQkJCUltYWdlIGltZyA9IChJbWFnZSkgaWNvbkhhc2guZ2V0KGljb25OYW1lXyk7Ci0JCQlpZiAoaW1nID09IG51bGwpIHsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChpY29uTmFtZV8pOwotCQkJCS8vIEJSVCBtYWtlIHN1cmUgdGhlIHNwZWNpZmljIHBsdWdpbiBpcyBiZWluZyB1c2VkIGhlcmUgdG8gZmluZAotCQkJCS8vIGl0cyBPV04gaWNvbnMKLQkJCQlVUkwgdXJsID0gdGhlUGx1Z2luXy5maW5kKHBhdGgpOwotCQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQkJaW1nID0gaWQuY3JlYXRlSW1hZ2UoKTsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFRNVjogKioqKiogY3JlYXRlZCBpbWFnZSBmb3IgIiArIGljb25OYW1lXyk7Ci0JCQkJaWNvbkhhc2gucHV0KGljb25OYW1lXywgaW1nKTsvLyBzYXZlIGZvciByZXVzZQotCQkJfQotCQkJcmV0dXJuIGltZzsKLQkJfQotCi0JCS8qKgotCQkgKiBEaXNwb3NlIG9mIGFueXRoaW5nIHRoYXQgd291bGQgaGFuZyBhcm91bmQgcnVkZWx5IG90aGVyd2lzZSAoc3VjaCBhcwotCQkgKiBpbWFnZSBvYmplY3RzIGZyb20gdGhlIGljb25zKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVYuVmlld0xhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOyBkaXNwb3NlIG9mIGljb24gaW1hZ2VzIik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpY29uSGFzaC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJbWFnZSBpbWcgPSAoSW1hZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWltZy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgc29ydGVyIGZvciBpdGVtcyAtIHRoZSBvcmRlciB0aGV5IHdlcmUgY3JlYXRlZCwgd2hpY2ggdGVuZHMgdG8KLQkgKiBncm91cCBpdGVtcyB3aXRoIHRoZWlyIHNvdXJjZSBjb2RlIGxvY2F0aW9ucwotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqLwotCWNsYXNzIE5hbWVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgb25lIG9yIG1vcmUgb2Y6IGFydGlmYWN0LCBmaWxlbmFtZSwgbGluZU5vLAotCSAqIHZhcmlhYmxlQ29sdW1uTmFtZS48YnI+Ci0JICogVGhlIGRlcml2ZWQgY2xhc3NlcyB3aWxsIGltcGxlbWVudCBjb21iaW5lKCkgdG8gc2F5IGhvdyB0aGUgYXR0cmlidXRlcwotCSAqIGFyZSBjb21iaW5lZCB0byBnZXQgdGhlIHNvcnQgZGVzaXJlZC4KLQkgKiAKLQkgKiBAYXV0aG9yIEJldGggVGliYml0dHMKLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBHZW5lcmljU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYXNjZW5kaW5nID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQ29tcGFyZSB0d28gaXRlbXMgdG8gZGV0ZXJtaW5lIHNvcnQgb3JkZXIuIFNvcnQgaXRlbXMgYnkgb25lIG9yIG1vcmUKLQkJICogb2Y6IGFydGlmYWN0IG5hbWUsIHRoZW4gZmlsZSwgdGhlbiBsaW5lIG51bWJlciwgdGhlbiBjb25zdHJ1Y3QKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJaW50IHJlc3VsdCA9IDA7Ci0KLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCi0JCQlqYXZhLnRleHQuQ29sbGF0b3IgY29sbGF0b3IgPSB0aGlzLmdldENvbGxhdG9yKCk7Ci0KLQkJCWlmIChlMSBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyIG0xID0gKElNYXJrZXIpIGUxOwotCQkJCQlJTWFya2VyIG0yID0gKElNYXJrZXIpIGUyOwotCQkJCQlTdHJpbmcgbmFtZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQkJCVN0cmluZyBmaWxlMSA9IChTdHJpbmcpIG0xLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0KLQkJCQkJU3RyaW5nIGxpbmUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBjb25zdHJ1Y3QxID0gZ2V0Q29uc3RydWN0U3RyKG0xKTsKLQkJCQkJU3RyaW5nIHNvcnQxID0gY29tYmluZShuYW1lMSwgZmlsZTEsIGxpbmUxLCBjb25zdHJ1Y3QxKTsKLQotCQkJCQlTdHJpbmcgbmFtZTIgPSAoU3RyaW5nKSBtMi5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCQkJCVN0cmluZyBmaWxlMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJCVN0cmluZyBsaW5lMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShMSU5FKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgY29uc3RydWN0MiA9IGdldENvbnN0cnVjdFN0cihtMik7Ci0JCQkJCVN0cmluZyBzb3J0MiA9IGNvbWJpbmUobmFtZTIsIGZpbGUyLCBsaW5lMiwgY29uc3RydWN0Mik7Ci0KLQkJCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUoc29ydDEsIHNvcnQyKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShzb3J0Miwgc29ydDEpOwotCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBDb21iaW5lIG5hbWUsIGZpbGUsIGFuZC9vciBsaW5lIG51bWJlciB0byBwcm92aWRlIHRoZSBzdHJpbmcgdG8gc29ydAotCQkgKiBieS4gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3NlcyBhcyBuZWVkZWQKLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEBwYXJhbSBmaWxlCi0JCSAqIEBwYXJhbSBsaW5lCi0JCSAqIEBwYXJhbSBjb25zdHJ1Y3QKLQkJICogQHJldHVybiBhbHdheXMgcmV0dXJuIG51bGwsIHN1YmNsYXNzIGNhbiBjaG9vc2UgdG8gaW1wbC4gdGhpcyBtZXRob2QuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmUoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSwgU3RyaW5nIGNvbnN0cnVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogc3dpdGNoIHRvIHRoaXMgc29ydGVyLiBJZiBpdCB3YXMgYWxyZWFkeSB0aGlzIHNvcnRlciwgdGhlbiB0b2dnbGUgdGhlCi0JCSAqIHNvcnQgb3JkZXIKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzb3J0KCkgewotCQkJLy8gU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NOYW1lKyIuc29ydCgpIGFzY2VuZGluZz0iK2FzY2VuZGluZyk7Ci0JCQlpZiAodGhpcyA9PSB2aWV3ZXIuZ2V0U29ydGVyKCkpIHsKLQkJCQlhc2NlbmRpbmcgPSAhYXNjZW5kaW5nOwotCQkJCXZpZXdlci5zZXRTb3J0ZXIobnVsbCk7IC8vIHR1cm4gb2ZmIHRvIGZvcmNlIHJlLXNvcnQKLQkJCX0gZWxzZSB7Ci0JCQkJYXNjZW5kaW5nID0gdHJ1ZTsKLQkJCX0KLQkJCXZpZXdlci5zZXRTb3J0ZXIodGhpcyk7Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogU29ydGVyIHRvIHNvcnQgYnkgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIFNpbXBsZUFydGlmYWN0IGlzIEZvdW5kCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzIGNyZWF0ZWQKLQkgKiAKLQkgKiAKLQkgKi8KLQljbGFzcyBMaW5lTm9Tb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQkJLyoqCi0JCSAqIHNvcnQgaXRlbXMgYnkgbGluZSBudW1iZXIKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQotCQkJaWYgKGUxIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCXRyeSB7Ci0JCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJCU9iamVjdCB0ZW1wT2JqID0gbTEuZ2V0QXR0cmlidXRlKExJTkUpOwotCQkJCQlpbnQgbGluZTEgPSAwOwotCQkJCQlpbnQgbGluZTIgPSAwOwotCQkJCQlpZiAodGVtcE9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJCWxpbmUxID0gKChJbnRlZ2VyKSB0ZW1wT2JqKS5pbnRWYWx1ZSgpOwotCQkJCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQkJCXRlbXBPYmogPSBtMi5nZXRBdHRyaWJ1dGUoTElORSk7Ci0JCQkJCQkvLyB3ZSBhc3N1bWUgaWYgdGhlIGZpcnN0IHdhcyBJbnRlZ2VyLCB0aGlzIG9uZSBpcywgdG9vLgotCQkJCQkJYXNzZXJ0IHRlbXBPYmogaW5zdGFuY2VvZiBJbnRlZ2VyOwotCQkJCQkJbGluZTIgPSAoKEludGVnZXIpIHRlbXBPYmopLmludFZhbHVlKCk7Ci0KLQkJCQkJfQotCQkJCQlpbnQgcmVzdWx0ID0gMDsKLQkJCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJCXJlc3VsdCA9IGxpbmUxIC0gbGluZTI7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlc3VsdCA9IGxpbmUyIC0gbGluZTE7Ci0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydCBpdGVtcyBieSBuYW1lCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgTmFtZUFydGlmYWN0U29ydGVyIGV4dGVuZHMgR2VuZXJpY1NvcnRlciB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEBwYXJhbSBmaWxlCi0JCSAqIEBwYXJhbSBsaW5lCi0JCSAqIEBwYXJhbSBjb25zdHJ1Y3QKLQkJICogQHJldHVybiBCUlQgbm90ZTogU29ydCBpc24ndCBxdWl0ZSByaWdodDogaWYgbmFtZSxmaWxlbmFtZSBpZGVudGljYWwsCi0JCSAqICAgICAgICAgIjEwIiB3b3VsZCBzb3J0IGJlZm9yZSAiMiIgZS5nLgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBjb21iaW5lKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGxpbmUsIFN0cmluZyBjb25zdHJ1Y3QpIHsKLQkJCWZpbmFsIFN0cmluZyBkZWxpbSA9ICIgLSAiOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoZmlsZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQobGluZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoY29uc3RydWN0KTsKLQkJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgZmlsZW5hbWUgKHRoZW4gbGluZSBudW1iZXIpCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgRmlsZW5hbWVTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCQkJaW50IHJlcyA9IDA7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQlTdHJpbmcgZmlsZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCVN0cmluZyBmaWxlMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhc2NlbmRpbmc9IiArIGFzY2VuZGluZyk7Ci0JCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShmaWxlMSwgZmlsZTIpOwotCQkJCWVsc2UKLQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShmaWxlMiwgZmlsZTEpOwotCQkJCS8vIGlmIHRoZSBmaWxlbmFtZSBpcyB0aGUgc2FtZSwgb25seSB0aGVuIGRvIHdlIGxvb2sgYXQgbGluZQotCQkJCS8vIG51bWJlcgotCQkJCWlmIChyZXMgPT0gMCkgewotCQkJCQlTdHJpbmcgbGluZTEgPSBtMS5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGxpbmUyID0gbTIuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCWludCBsMSA9IEludGVnZXIucGFyc2VJbnQobGluZTEpOwotCQkJCQlpbnQgbDIgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUyKTsKLQkJCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJCXJlcyA9IGwxIC0gbDI7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlcyA9IGwyIC0gbDE7Ci0JCQkJfQotCQkJCS8vIGlmIHRoZSBmaWxlbmFtZSBhbmQgbGluZSBubyBhcmUgdGhlIHNhbWUsIG9ubHkgdGhlbiBkbyB3ZQotCQkJCS8vIGxvb2sgYXQgY29uc3RydWN0Ci0JCQkJaWYgKHJlcyA9PSAwKSB7Ci0JCQkJCWlmIChhc2NlbmRpbmcpIHsKLQkJCQkJCXJlcyA9IGNvbGxhdG9yLmNvbXBhcmUoZ2V0Q29uc3RydWN0U3RyKG0xKSwgZ2V0Q29uc3RydWN0U3RyKG0yKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXMgPSBjb2xsYXRvci5jb21wYXJlKGdldENvbnN0cnVjdFN0cihtMiksIGdldENvbnN0cnVjdFN0cihtMSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQl9Ci0KLQljbGFzcyBDb25zdHJ1Y3RTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQotCQkvKioKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHBhcmFtIGZpbGUKLQkJICogQHBhcmFtIGxpbmUKLQkJICogQHBhcmFtIGNvbnN0cnVjdAotCQkgKiBAcmV0dXJuIEJSVCBub3RlOiBTb3J0IGlzbid0IHF1aXRlIHJpZ2h0OiBpZiBuYW1lLGZpbGVuYW1lIGlkZW50aWNhbCwKLQkJICogICAgICAgICAiMTAiIHdvdWxkIHNvcnQgYmVmb3JlICIyIiBlLmcuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmUoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSwgU3RyaW5nIGNvbnN0cnVjdCkgewotCQkJZmluYWwgU3RyaW5nIGRlbGltID0gIiAtICI7Ci0JCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihjb25zdHJ1Y3QpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGZpbGUpOwotCQkJcmVzdWx0LmFwcGVuZChkZWxpbSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBhbGxvdyB1cyB0byBjcmVhdGUgdGhlIHZpZXdlciBhbmQgaW5pdGlhbGl6ZQotCSAqIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJY3JlYXRlVHJlZUNvbHVtbnMoKTsKLQkJaWYgKGZhbHNlKSB7Ci0JCQlTZWxlY3Rpb25MaXN0ZW5lciB0cmVlU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3Qgc3JjID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCWlmICghdHJhY2VPbikKLQkJCQkJCXJldHVybjsKLQkJCQkJaWYgKHNyYyBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRyZWVJdGVtIHNlbGVjdGVkIik7Ci0JCQkJCX0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgVHJlZUNvbHVtbikgewotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUcmVlQ29sdW1uIHNlbGVjdGVkIik7Ci0KLQkJCQkJfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBUcmVlKSB7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRyZWUgc2VsZWN0ZWQiKTsKLQkJCQkJCVRyZWUgdHJlZSA9IChUcmVlKSBzcmM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJdHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0cmVlU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld0xhYmVsUHJvdmlkZXIoKSk7Ci0JCS8vIFNldCB1cCB0aGUgc29ydGVycy4KLQkJbmFtZVNvcnRlciA9IG5ldyBOYW1lU29ydGVyKCk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmFtZVNvcnRlcik7Ci0JCWxpbmVOb1NvcnRlciA9IG5ldyBMaW5lTm9Tb3J0ZXIoKTsKLQkJbmFtZUFydGlmYWN0U29ydGVyID0gbmV3IE5hbWVBcnRpZmFjdFNvcnRlcigpOwotCQlmaWxlbmFtZVNvcnRlciA9IG5ldyBGaWxlbmFtZVNvcnRlcigpOwotCQljb25zdHJ1Y3RTb3J0ZXIgPSBuZXcgQ29uc3RydWN0U29ydGVyKCk7Ci0KLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkvLyBtYXJrZXJzIGZyb20gd29ya3NwYWNlCi0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJCXNlbGVjdGVkTWFya2VyXyA9IChJTWFya2VyKSBvYmo7Ci0JCQkJfQotCQkJCXNob3dTdGF0dXNNZXNzYWdlKCIiLCAic2VsZWN0aW9uQ2hhbmdlZCIpOwotCQkJfQotCQl9KTsKLQotCQltYWtlQWN0aW9ucygpOwotCQlob29rQ29udGV4dE1lbnUoKTsKLQkJaG9va0RvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JCWNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJlZUNvbHVtbnMoKSB7Ci0JCVRyZWVDb2x1bW4gY29sdW1uOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7IC8vIGNvbCAxIGJhcnJpZXIgbmFtZQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7IC8vIGNvbCAyIGZuIG5hbWUKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOyAvLyBjb2wgMyBmaWxlbmFtZQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7IC8vIGNvbCA0IGxpbmVubwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7IC8vIGNvbCA1IGNvbnN0cnVjdAotCi0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JCWludCBudW1Db2x1bW5zID0gY29sdW1ucy5sZW5ndGg7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyW10gY29sdW1uTGlzdGVuZXJzID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyW251bUNvbHVtbnNdOwotCQlTdHJpbmdbXSBoZWFkaW5ncyA9IG5ldyBTdHJpbmdbXSB7ICJFcnJvciBNZXNzYWdlIiwgIkZ1bmN0aW9uIiwgIkZpbGVuYW1lIiwgIkxpbmVObyIsICJJbmRleE5vIiB9OwotCQlpbnRbXSB3aWR0aHMgPSBuZXcgaW50W10geyAxMjAsIDEwMCwgMTAwLCAxMDAsIDEwMCB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7Ci0JCQlpbnQgY29sTm8gPSBpOyAvLyBjb3VsZCBiZSByZS1vcmRlcmVkIGxhdGVyCi0JCQkvLyBpbnQgY29sTm8gPSBjb2x1bW5PcmRlcltpXTsKLQkJCWNvbHVtbnNbY29sTm9dLnNldFRleHQoaGVhZGluZ3NbY29sTm9dKTsKLQkJCWNvbHVtbnNbY29sTm9dLnNldFdpZHRoKHdpZHRoc1tjb2xOb10pOwotCQkJY29sdW1uc1tjb2xOb10uc2V0UmVzaXphYmxlKHRydWUpOwotCQkJY29sdW1uc1tjb2xOb10uc2V0TW92ZWFibGUodHJ1ZSk7IC8vIGNhbiByZW9yZGVyIGNvbHVtbnMgYnkKLQkJCQkJCQkJCQkJCS8vIGRyYWdnaW5nCi0JCQlTZWxlY3Rpb25MaXN0ZW5lciBjb2x1bW5MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9iamVjdCBzcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKHNyYyBpbnN0YW5jZW9mIFRyZWVDb2x1bW4pIHsKLQkJCQkJCVRyZWVDb2x1bW4gdGMgPSAoVHJlZUNvbHVtbikgc3JjOwotCQkJCQkJU3RyaW5nIHRleHQgPSB0Yy5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAodHJ1ZSkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRyZWUgY29sdW1uIHNlbGVjdGVkOiAiICsgdGV4dCk7Ci0JCQkJCQlPYmplY3QgZGF0YSA9IHRjLmdldERhdGEoKTsKLQkJCQkJCWlmIChkYXRhIGluc3RhbmNlb2YgVmlld2VyU29ydGVyKSB7Ci0JCQkJCQkJR2VuZXJpY1NvcnRlciBzb3J0ZXIgPSAoR2VuZXJpY1NvcnRlcikgZGF0YTsKLQkJCQkJCQlzb3J0ZXIuc29ydCgpOwotCi0JCQkJCQl9IGVsc2UKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIG5vdCBhIHNvcnRlciAqKiAiICsgZGF0YSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCWNvbHVtbnNbY29sTm9dLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbHVtbkxpc3RlbmVyKTsKLQkJCWNvbHVtbkxpc3RlbmVyc1tjb2xOb10gPSBjb2x1bW5MaXN0ZW5lcjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJU2ltcGxlVHJlZVRhYmxlRXJyb3JWaWV3LnRoaXMuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQkJfQotCQl9KTsKLQkJTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb250cmlidXRlVG9BY3Rpb25CYXJzKCkgewotCQlJQWN0aW9uQmFycyBiYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWZpbGxMb2NhbFB1bGxEb3duKGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWZpbGxMb2NhbFRvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsUHVsbERvd24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoaW5mb0FjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW1hbmFnZXIuYWRkKGZpbHRlckFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChpbmZvQWN0aW9uKTsKLQkJLy8gT3RoZXIgcGx1Zy1pbnMgY2FuIGNvbnRyaWJ1dGUgdGhlaXIgYWN0aW9ucyBoZXJlCi0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIkFkZGl0aW9ucyIpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChpbmZvQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHRoZSBhY3Rpb24gb2JqZWN0cyBmb3IgdGhlIG1lbnVzIGFuZCB0b29sYmFyLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJbWFrZVNob3dJbmZvQWN0aW9uKCk7Ci0JCW1ha2VGaWx0ZXJBY3Rpb24oKTsKLQkJbWFrZURvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSAic2hvdyBpbmZvIiBhY3Rpb24gdG8gZGlzcGxheSBhcnRpZmFjdCBpbmZvcm1hdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VTaG93SW5mb0FjdGlvbigpIHsKLQkJaW5mb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gdGhpbmduYW1lXyArICIgaW5mb3JtYXRpb24iOwotCQkJCWlmIChzZWxlY3RlZE1hcmtlcl8gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWRGcm9tTWFya2VyID0gKFN0cmluZykgc2VsZWN0ZWRNYXJrZXJfLmdldEF0dHJpYnV0ZSh1bmlxdWVJRF8sIG51bGwpOwotCQkJCQlpZiAoaWRGcm9tTWFya2VyID09IG51bGwpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6IGV4Y2VwdGlvbiByZWFkaW5nIG1hcmtlciBJRCIpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZ0J1ZmZlciBpbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCQkJCUlBcnRpZmFjdCBhcnRpZmFjdCA9IGFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3QoaWRGcm9tTWFya2VyKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuRmlsZSBuYW1lOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCWluZm8uYXBwZW5kKCJcbkxpbmUgbnVtYmVyOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0TGluZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuTmFtZTogIikuYXBwZW5kKGFydGlmYWN0LmdldFNob3J0TmFtZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuRGVzY3JpcHRpb246ICIpLmFwcGVuZChhcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpKTsKLQotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihudWxsLCB0aXRsZSwgaW5mby50b1N0cmluZygpKTsKLQkJCQl9Ly8gZW5kIGlmIHNlbGVjdGVkTWFya2VyIT1udWxsCi0JCQkJZWxzZSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsIHRpdGxlLCAiTm8gIiArIHRoaW5nbmFtZV8gKyAiIHNlbGVjdGVkLiIpOwotCQkJCX0KLQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLQkJCX0KLQkJfTsKLQkJaW5mb0FjdGlvbi5zZXRUZXh0KCJTaG93IEluZm8iKTsKLQkJaW5mb0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiU2hvdyBkZXRhaWxlZCBpbmZvIGZvciBzZWxlY3RlZCAiICsgdGhpbmduYW1lXyk7Ci0JCWluZm9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGZpbHRlciBhY3Rpb24gKFRCRCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZUZpbHRlckFjdGlvbigpIHsKLQkJZmlsdGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzaG93TWVzc2FnZSgiRmlsdGVyICIgKyB0aGluZ25hbWVzXyArICJcbkRldGVybWluZSB3aGljaCAiICsgdGhpbmduYW1lc18gKyAiIGFyZSBzaG93biBpbiB0aGlzIHZpZXcuIik7Ci0JCQl9Ci0JCX07Ci0JCWZpbHRlckFjdGlvbi5zZXRUZXh0KCJGaWx0ZXIgIiArIHRoaW5nbmFtZXNfKTsKLQkJZmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJGaWx0ZXIgd2hpY2ggIiArIHRoaW5nbmFtZXNfICsgIiBhcmUgc2hvd24gaW4gdGhpcyB2aWV3Iik7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBkb3VibGUtY2xpY2sgYWN0aW9uLCB3aGljaCBtb3ZlcyBlZGl0b3IgdG8gdGhlIGFydGlmYWN0IGluc3RhbmNlIGluCi0JICogdGhlIHNvdXJjZSBjb2RlIChlZGl0b3IgdG8gbGluZSBpbiBzb3VyY2UgY29kZSkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZURvdWJsZUNsaWNrQWN0aW9uKCkgewotCi0JCWRvdWJsZUNsaWNrQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkvLyBUaGlzIGFjdGlvbiBvbmx5IG1ha2VzIHNlbnNlIG9uIGNoaWxkIG5vZGVzIChtYXJrZXJzKQotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlIGYgPSAoSUZpbGUpIG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpbnQgbGluZU5vID0gZ2V0TWFya2VyTGluZU5vKG1hcmtlcik7Ci0JCQkJCWlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd2JwID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCQkJCS8vIElFZGl0b3JJbnB1dCBpZXUgPSBuZXcgRmlsZUVkaXRvcklucHV0KGYpOwotCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3Iod2JwLCBmKTsKLQotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYmVmb3JlICIgKyBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpKTsKLQkJCQkJCS8vIG5vdGU6IChyZT8pIHNldHRpbmcgbGluZW51bWJlciBoZXJlIGlzIHJlcXVpcmVkIHRvCi0JCQkJCQkvLyBwdXQgbWFya2VyIGluIGVkaXRvciE/IQotCQkJCQkJTWFya2VyVXRpbGl0aWVzLnNldExpbmVOdW1iZXIobWFya2VyLCBsaW5lTm8pOwotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYWZ0ZXIgIiArIE1hcmtlclV0aWxpdGllcy5nZXRMaW5lTnVtYmVyKG1hcmtlcikpOwotCQkJCQkJSURFLmdvdG9NYXJrZXIoZWRpdG9yLCBtYXJrZXIpOwotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFRNVjogRG91YmxlQ2xpY2tBY3Rpb24sIGNsZWFyIHN0YXR1cyIpOwotCQkJCQkJc2hvd1N0YXR1c01lc3NhZ2UoIiIsICJkb3VibGUgY2xpY2sgYWN0aW9uIik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIlNUVE1WLmRvdWJsZWNsaWNrQWN0aW9uOiBFcnJvciBwb3NpdGlvbmluZyBlZGl0b3IgcGFnZSBmcm9tIG1hcmtlciBsaW5lIG51bWJlciIpOwotCQkJCQlzaG93U3RhdHVzTWVzc2FnZSgiRXJyb3IgcG9zaXRpb25pbmcgZWRpdG9yIGZyb20gbWFya2VyIGxpbmUgbnVtYmVyIiwgImVycm9yIG1hcmtlciBnb3RvIik7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rRG91YmxlQ2xpY2tBY3Rpb24oKSB7Ci0JCXZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlkb3VibGVDbGlja0FjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgdmlld05hbWVfLCBtZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd1N0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWJ1Z01lc3NhZ2UpIHsKLQkJaWYgKHRyYWNlU3RhdHVzTGluZSkgewotCQkJbWVzc2FnZSArPSAiIC0gIjsKLQkJCW1lc3NhZ2UgKz0gZGVidWdNZXNzYWdlOwotCQl9Ci0JCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS51cGRhdGUodHJ1ZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzaG93U3RhdHVzTWVzc2FnZSgiIiwgInNldEZvY3VzIik7IC8vIHJlc2V0IHN0YXR1cyBtZXNzYWdlCi0JCWlmICghdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRyYWNlT24pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNpbXBsZVRhYmxlVmlldy5kaXNwb3NlKCkiKTsKLQkJLy8gQlJUIGRvIHdlIG5lZWQgdG8gZGlzcG9zZSBvZiBpbWFnZURlc2NyaXB0b3JzIHdlIG1hZGU/IG9yIGp1c3QKLQkJLy8gaW1hZ2VzPwotCi0JfQotCi0JcHVibGljIHZvaWQgc2hvd01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1hcmtlci0tLS0tLS0gIElNYXJrZXIuTElORV9OVU1CRVI9IiArIElNYXJrZXIuTElORV9OVU1CRVIpOwotCQl0cnkgewotCQkJTWFwIGF0dHJzID0gbWFya2VyLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIiArIGUuZ2V0S2V5KCkgKyAiICIgKyBlLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBtYWtlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlVUkwgdXJsID0gdGhlUGx1Z2luXy5maW5kKG5ldyBQYXRoKGljb25OYW1lKSk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIGNoYW5nZSBpbmZvIChhcnRpZmFjdCBhbmQgbWFya2VyKSBvbnRvIGEgc3RhY2sgc28gd2UgY2FuIHJlbWVtYmVyCi0JICogaXQsIGZvciBwb3NzaWJsZSB1bmRvIGFjdGlvbi4gQWxzbyBlbmFibGVzL2Rpc2FibGVzIHRoZSBVbmRvIGFjdGlvbgotCSAqIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiBAcGFyYW0gbWFya2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENoYW5nZWRJbmZvKElBcnRpZmFjdCBhcnRpZmFjdCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJY2hhbmdlZEFydHNfLnB1c2goYXJ0aWZhY3QpOwotCQljaGFuZ2VkTWFya2Vyc18ucHVzaChtYXJrZXIpOwotCQljaGVja1VuZG9TdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc3RhdHVzIG9mIHVuZG8gYWN0aW9uIChlbmFibGVkIG9yIGRpc2FibGVkKSBiYXNlZCBvbiBpZiB0aGVyZSBhcmUgYW55Ci0JICogYXJ0aWZhY3QgY2hhbmdlcywgb3Igb3RoZXIgY2hhbmdlcywgYXZhaWxhYmxlIHRvIHVuZG8KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1VuZG9TdGF0dXMoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgbWFya2VyIGxpbmUgbnVtYmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWFya2VyTGluZU5vKElNYXJrZXIgbWFya2VyKSB7Ci0JCWludCBsaW5lTm8gPSBnZXRJbnRBdHRyKG1hcmtlciwgSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGludCB2YWx1ZSB0aGF0IGlzIGFzc3VtZWQgdG8gYmUgc3RvcmVkIGluIGEgbWFya2VyIGluIGEgZ2l2ZW4KLQkgKiBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUsIG9yIDAgaWYgbm9uZSBmb3VuZCwgb3IgaW52YWxpZCB2YWx1ZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SW50QXR0cihJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHIpIHsKLQkJU3RyaW5nIHRlbXAgPSBudWxsOwotCQl0cnkgewotCQkJdGVtcCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cikudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gQ29yZUV4Y2VwdGlvbiBvciBDbGFzc0Nhc3RFeGNlcHRpb24gcG9zc2libGUKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WOiBNYXJrZXIgbGluZU5vKCIgKyBhdHRyICsgIikgaW52YWxpZDsgdXNpbmcgMCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGxpbmVObyA9IDA7Ci0JCXRyeSB7Ci0JCQlsaW5lTm8gPSBJbnRlZ2VyLnBhcnNlSW50KHRlbXApOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WOiBNYXJrZXIgbGluZU5vKCIgKyB0ZW1wICsgIiBmcm9tIGF0dHIgIiArIGF0dHIKLQkJCQkJKyAiKSBpbnZhbGlkIChOdW1iZXJGb3JtYXRFeGNlcHRpb24pOyB1c2luZyAwIik7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYXR0cmlidXRlIFN0cmluZyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHBhcmFtIGF0dHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogRXhjZXB0aW9uIGdldHRpbmcgbWFya2VyIGF0dHJpYnV0ZSAiICsgZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBhIFN0YWNrIHRoYXQgaXNuJ3QgYmFzZWQgb24gVmVjdG9yIC0gR2VuZXJpYyBMSUZPIHN0YWNrCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFN0YWNrTGlzdCB7Ci0JCXByaXZhdGUgTGlua2VkTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBwdXNoKE9iamVjdCB2KSB7Ci0JCQlsaXN0LmFkZEZpcnN0KHYpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCB0b3AoKSB7Ci0JCQlyZXR1cm4gbGlzdC5nZXRGaXJzdCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBwb3AoKSB7Ci0JCQlyZXR1cm4gbGlzdC5yZW1vdmVGaXJzdCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiBsaXN0LmlzRW1wdHkoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVmlzaXQgdGhlIHJlc291cmNlIGRlbHRhIHRvIGxvb2sgZm9yIHRoZSBtYXJrZXIgY2hhbmdlcyB3ZSBhcmUgaW50ZXJlc3RlZAotCSAqIGluCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICovCi0JcHVibGljIGNsYXNzIFVwZGF0ZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCS8qKgotCQkgKiBWaXNpdCBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgcmVzb3VyY2UgZGVsdGEgdG8gZmluZCB0aGUgbWFya2VycwotCQkgKiB0aGF0IGNoYW5nZWQgdGhhdCB3ZSBjYXJlIGFib3V0LgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXBkYXRlVmlzaXRvcjogZmlsZSBjaGFuZ2VkOiAiICsgbmFtZSk7Ci0KLQkJCQkJLy8gSGFuZGxlIGZpbGUgY2hhbmdlcyAoc2F2ZXMpIGJ5IHJlcG9ydGluZyB0aGUgY2hhbmdlcwotCQkJCQkvLyBtYWRlIHRvIHRoZSBmaWxlLCB0byB1cGRhdGUgYmFja2VuZCBhbmFseXNpcwotCQkJCQkvLyByZXByZXNlbnRhdGlvbgotCQkJCQlJRmlsZSBmID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQkJaW50IGNvbnRlbnRDaGFuZ2VkID0gZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UOwotCi0JCQkJCWlmICh2YWxpZEZvckFuYWx5c2lzKGYuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlICIgKyBmLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiIGlzIHZhbGlkIGZvciBhbmFseXNpcyBzbyB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZS4uLiIpOwotCQkJCQkJaWYgKGNvbnRlbnRDaGFuZ2VkICE9IDApIHsKLQkJCQkJCQkvLyBkbyB3ZSBuZWVkIHRvIHRlbGwgYmFjayBlbmQgKGFuYWx5c2lzIGVuZ2luZSkKLQkJCQkJCQkvLyB0aGF0IGZpbGUgY2hhbmdlZD8KLQkJCQkJCX0KLQotCQkJCQkJLy8gcmVmcmVzaCBtYXJrZXJzIGZvciB0aGF0IGZpbGU/Ci0JCQkJCQlJTWFya2VyRGVsdGFbXSBtRGVsdGFzID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQkJCQlpbnQgbGVuID0gbURlbHRhcy5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0JCQkJCQkJSU1hcmtlckRlbHRhIGRlbHRhMyA9IG1EZWx0YXNbal07Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCXNob3dNYXJrZXJEZWx0YUtpbmQoZGVsdGEzKTsKLQkJCQkJCQlJTWFya2VyIG0gPSBkZWx0YTMuZ2V0TWFya2VyKCk7Ci0JCQkJCQkJU3RyaW5nIGxuID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLQkJCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS1VcGRhdGVWaXNpdG9yLnZpc2l0KCk6dmlld2VyIHVwZGF0ZSBtYXJrZXI6IChsaW5lTm8pIik7Ci0JCQkJCQkJLy8gc2hvd01hcmtlcihtKTsKLQkJCQkJCQlTdHJpbmdbXSBwcm9wcyA9IG5ldyBTdHJpbmdbMV07IC8vIGF3a3dhcmQuIHdoeT8/PwotCQkJCQkJCXByb3BzWzBdID0gbG47Ci0JCQkJCQkJLy8ganVzdCB1cGRhdGUgdmlld2VyIGl0ZW0sIG5vdCB0aGUgd2hvbGUgdmlldwotCQkJCQkJCS8vIHZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJdmlld2VyLnVwZGF0ZShtLCBwcm9wcyk7Ci0JCQkJCQl9IC8vIGVuZCBsb29wCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgIiArIGYuZ2V0TmFtZSgpCi0JCQkJCQkJCQkrICIgaXMgTk9UIHZhbGlkIGZvciBhbmFseXNpcyBzbyB3aWxsIGlnbm9yZSBjaGFuZ2UuLi4iKTsKLQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgaWYgQ0hBTkdFRAotCQkJCWVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgYWRkZWQuIik7Ci0JCQkJCWNoZWNrTWFya2VyRGVsdGFzKGRlbHRhKTsKLQkJCQl9IGVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgcmVwbGFjZWQuIik7Ci0JCQkJCWNoZWNrTWFya2VyRGVsdGFzKGRlbHRhKTsKLQkJCQl9IGVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSByZW1vdmVkLiIpOwotCQkJCQljaGVja01hcmtlckRlbHRhcyhkZWx0YSk7Ci0JCQkJfQotCQkJfSAvLyBlbmQgaWYgRklMRQotCQkJcmV0dXJuIHRydWU7IC8vIGtlZXAgZ29pbmcKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjaGVja01hcmtlckRlbHRhcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSU1hcmtlckRlbHRhW10gbWQxID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQlpbnQgbGVuID0gbWQxLmxlbmd0aDsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgLi4uIGZvdW5kICIgKyBsZW4gKyAiIG1hcmtlckRlbHRhcy4iKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaG93IGluZm8gYWJvdXQgdGhlIG1hcmtlciBpbiB0aGUgbWFya2VyIGRlbHRhLiBUaGlzIGlzIGp1c3QgdHJhY2luZwotCQkgKiB0aGUgaW5mbyBhdmFpbGFibGUgdW50aWwgd2UgZG8gc29tZXRoaW5nIHdpdGggaXQuIEZvciBub3csIHdlJ3JlIGp1c3QKLQkJICogZG9pbmcgYSAoYmlnKSB2aWV3ZXIucmVmcmVzaCgpIHRvIHJlZnJlc2ggYWxsIHRoZSBtYXJrZXJzLiBXaGVuIHdlCi0JCSAqIGdldCBtb3JlIGludGVsbGlnZW50IGFib3V0IGp1c3QgdXBkYXRpbmcgdGhlIG9uZXMgdGhhdCBjaGFuZ2VkLCB3ZQotCQkgKiBjYW4gcmVtb3ZlIHRoYXQuIFNob3VsZG4ndCBtYWtlIG11Y2ggZGlmZmVyZW50IGZvciBzbWFsbCBzZXRzIG9mCi0JCSAqIG1hcmtlcnMsIGJ1dCBmb3IgbWFueSBtYXJrZXJzLCB0aGlzIGNvdWxkIGJlIGEgc2lnbmlmaWNhbnQKLQkJICogcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEzCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2hvd01hcmtlckRlbHRhS2luZChJTWFya2VyRGVsdGEgZGVsdGEzKSB7Ci0KLQkJCS8vIGludCBtZEtpbmQgPSBkZWx0YTMuZ2V0S2luZCgpOwotCQkJSU1hcmtlciBtID0gZGVsdGEzLmdldE1hcmtlcigpOwotCi0JCQlTdHJpbmcga2luZCA9ICJVTktOT1dOIjsKLQkJCXN3aXRjaCAoZGVsdGEzLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQlraW5kID0gIkFEREVEIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQlraW5kID0gIkNIQU5HRUQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCWtpbmQgPSAiUkVNT1ZFRCI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWtpbmQgPSAiVU5LTk9XTiI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIG1hcmtlckRlbHRhS2luZD0iICsga2luZCk7Ci0JCQlTdHJpbmcgbWlkID0gIiIsIG1sID0gIiIsIG1scGkgPSAiIjsKLQkJCXRyeSB7Ci0JCQkJLy8gbm90ZTogd2UncmUgZ2V0dGluZyBtYXJrZXIgZGVsdGFzIG9uIEFMTCBtYXJrZXJzLAotCQkJCS8vIG5vdCBqdXN0IGFydGlmYWN0IG1hcmtlcnMsIHdoaWNoIGNhbiB0aHJvdyB1cyBvZmYuCi0JCQkJLy8gaW4gcGFydGljdWxhciwgdGVtcCBtYXJrZXJzIHVzZWQgYnkgYWN0aW9ucz8KLQotCQkJCW1pZCA9IG0uZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXykudG9TdHJpbmcoKTsKLQkJCQltbCA9IG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpLnRvU3RyaW5nKCk7Ci0JCQkJLy8gbWxwaSA9IG0uZ2V0QXR0cmlidXRlKElEcy5MSU5FKS50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gaWdub3JlIGVycm9yczsgb25seSB0cmFjaW5nIGZvciBub3cuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFRNVi5VcGRhdGVWaXNpdG9yIGVycm9yIGdldHRpbmcgbWFya2VyIGluZm8gZm9yIGNoYW5nZSB0eXBlOiAiICsga2luZCk7Ci0JCQkJLy8gZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBtYXJrZXJJRF89IiArIG1pZCArICIgIGxpbmVObyhta3ItbXBpQSk9IiArIG1sICsgIi0iICsgbWxwaSk7Ci0JCX0KLQotCX0gLy8gZW5kIGNsYXNzIFVwZGF0ZVZpc2l0b3IKLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9TaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2FuYWx5c2lzL3ZpZXcvU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzM1NjdlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvYW5hbHlzaXMvdmlldy9TaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMudmlldzsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLklBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLQotLyoqCi0gKiBMaWtlIFNpbXBsZVRhYmxlVmlldyAtIGVhc3kgdmlldyB0aGF0IHNob3dzIG1hcmtlcnMgLSBidXQgdXNlcyBhIFRyZWVUYWJsZSB0bwotICogc2hvdyBzb21lIGhpZXJhcmNoeS4gQ3VycmVudGx5IGxpbWl0ZWQgdG8gb25lIGxldmVsIG9mIGhpZXJhcmNoeSA8YnI+Ci0gKiBNYXJrZXJzIGFyZSB0aGUgbGVhZiBub2Rlcy48YnI+Ci0gKiBBbiBhdHRyaWJ1dGUgaW4gdGhlIG1hcmtlcnMgaW5kaWNhdGVzIHRoZSAoYXJ0aWZpY2lhbCkgcGFyZW50IG5vZGUsIGZvcgotICogZ3JvdXBpbmcuCi0gKiAKLSAqIFRPRE86IFRoaXMgaXMgYmFzaWNhbGx5IGEgY29weSBvZiBjbGFzcyBmcm9tIGNvbW1vbiBwbHVnaW4KLSAqIChvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24pOyBuZWVkIHRvIHdvcmsgdG93YXJkIHJlcGxhY2luZyB0aGlzIHdpdGggdGhhdCBvbmUgLQotICogaG93ZXZlciBzb21lIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhpcyBvbmUKLSAqIAotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdmlld2VyOwotCi0JLyoqCi0JICogbWFya2VyIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHBhcmVudCBub2RlLiBBbGwgbWFya2VycyB3aXRoIHRoaXMgcGFyZW50QXR0cgotCSAqIHdpbGwgYmUgdGhlIGNoaWxkcmVuIG9mIHRoZSBzYW1lIHBhcmVudCwgYW5kIGEgbm9kZSBmb3IgdGhhdCBwYXJlbnQgd2lsbAotCSAqIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgcG9vciB0aGluZ3Mgd29uJ3QgYmUgb3JwaGFucy4KLQkgKi8KLQkvLyBTaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3LnBhcmVudE1hcmtlckF0dHJpYjsKLQlwcml2YXRlIFN0cmluZyBwYXJlbnRNYXJrZXJBdHRyaWIgPSAicGFyZW50IjsKLQotCXByaXZhdGUgVHJlZSB0cmVlOyAvLyBrZWVwIHNvIHdlIGNhbiBkaXNwb3NlIG9mIGxpc3RlbmVycyBpbiBkaXNwb3NlKCk/Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uIGluZm9BY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBmaWx0ZXJBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBkb3VibGVDbGlja0FjdGlvbjsKLQlwcm90ZWN0ZWQgQWN0aW9uIHJlbW92ZU1hcmtlckFjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZVN0YXR1c0xpbmUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBWaWV3ZXJTb3J0ZXIgbmFtZVNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIGxpbmVOb1NvcnRlcjsKLQotCXByb3RlY3RlZCBGaWxlbmFtZVNvcnRlciBmaWxlbmFtZVNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIG9yZGVyU29ydGVyOyAvLyBieSAiaWNvbiIKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIG5hbWVBcnRpZmFjdFNvcnRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmljU29ydGVyIGNvbnN0cnVjdFNvcnRlcjsKLQotCXByaXZhdGUgSU1hcmtlciBzZWxlY3RlZE1hcmtlcl8gPSBudWxsOwotCi0JLyoqCi0JICogTGlzdCBvZiBhcnRpZmFjdHMgdGhhdCB3ZXJlIGNoYW5nZWQgZHVlIHRvIHNvbWUgYWN0aW9uIHVwb24gdGhlbSBpbiB0aGUKLQkgKiB2aWV3IChjdXJyZW50bHkgdW51c2VkKQotCSAqLwotCXByb3RlY3RlZCBTdGFja0xpc3QgY2hhbmdlZEFydHNfID0gbmV3IFN0YWNrTGlzdCgpOwotCi0JLyoqCi0JICogTGlzdCBvZiBtYXJrZXJzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiBhIGNoYW5nZSBvbiB0aGUgdGhlIGFzc29jaWF0ZWQKLQkgKiBhcnRpZmFjdCBkdWUgdG8gc29tZSBhY3Rpb24gdXBvbiB0aGVtIGhlcmUgaW4gdGhlIHZpZXcgKGN1cnJlbnRseSB1bnVzZWQpCi0JICovCi0JcHJvdGVjdGVkIFN0YWNrTGlzdCBjaGFuZ2VkTWFya2Vyc18gPSBuZXcgU3RhY2tMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgVXBkYXRlVmlzaXRvciB2aXNpdG9yXyA9IG5ldyBVcGRhdGVWaXNpdG9yKCk7Ci0KLQkvKioKLQkgKiBCZSBjb25zaXN0ZW50IGFib3V0IHdoYXQgd2UgY2FsbCB0aGVzZSB0aGluZ3M7IGdlbmVyaWMgdmFsdWVzIChjYW4gYmUpCi0JICogcmVwbGFjZWQgb24gY3Rvci4gPGJyPgotCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gcGx1Z2luLnhtbCBpZiBub3QgcGFzc2VkIG9uIGN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRoaW5nbmFtZV8gPSAiQXJ0aWZhY3QiOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0aGluZ25hbWVzXyA9ICJBcnRpZmFjdHMiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29sdW1uTmFtZV8gPSAiVmFsdWUiOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbl87Ci0KLQlwcml2YXRlIFN0cmluZyBpY29uTmFtZV8gPSAiaWNvbnMvc2FtcGxlLmdpZiI7Ci0KLQlwcml2YXRlIFN0cmluZyB2aWV3TmFtZV87Ci0KLQlwcml2YXRlIFN0cmluZyBtYXJrZXJJRF87Ci0KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RNYW5hZ2VyIGFydGlmYWN0TWFuYWdlcl87Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtbk5hbWVzXzsKLQotCXByaXZhdGUgU3RyaW5nW10gbWFya2VyQXR0ck5hbWVzXzsKLQotCS8qKgotCSAqIFRoZSBJRCB1c2VkIGluIHRoZSBtYXJrZXIgZm9yIHRoZSB1bmlxdWUgSUQgZm9yIGVhY2ggYXJ0aWZhY3QuIEVuYWJsZXMKLQkgKiBtYXBwaW5nIGJhY2sgdG8gdGhlIEFydGlmYWN0IG9iamVjdCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1bmlxdWVJRF8gPSAidW5pcXVlSUQiOwotCi0JLyoqCi0JICogVGhlIElEIHVzZWQgaW4gdGhlIG1hcmtlciBmb3IgdGhlIGV4dHJhIGNvbHVtbiBvZiBpbmZvcm1hdGlvbiAobGFzdAotCSAqIGNvbHVtbikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbklEXyA9ICJjb25zdHJ1Y3RUeXBlIjsgLy8gaWQgZm9yICh2YXJpYWJsZSkKLQotCS8qKiBNYXJrZXIgSUQgZm9yIGFydGlmYWN0IG5hbWUgLSBlLmcuIEFQSSBuYW1lLCBwcmFnbWEgbmFtZSwgZXRjLiAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLQkvKiogTWFya2VyIElEIGZvciBzdG9yYWdlIG9mIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgYXJ0aWZhY3QgaXMgZm91bmQgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRSA9ICJmaWxlbmFtZSI7Ci0KLQkvKioKLQkgKiBNYXJrZXIgaWQgZm9yIHN0b3JhZ2Ugb2YgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGFydGlmYWN0IGlzIGZvdW5kLgotCSAqIFJldXNlIG9mIGRlZmF1bHQgSUQgdXNlZCBieSBJTWFya2VyLCByZXBlYXRlZCBoZXJlIGZvciBlYXNlIG9mIHVzZSBhbmQKLQkgKiBmb3IgY2xhcml0eSB0aGF0IFRISVMgaXMgdGhlIG1hcmtlciBJRCBmb3IgbGluZSBudW1iZXIuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0KLQkvKiogTWFya2VyIGlkIGZvciBzdG9yYWdlIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFydGlmYWN0ICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVU5DVElPTl9DQUxMID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UID0gMjsKLQotCS8qKiB0eXBlcyBvZiBjb25zdHJ1Y3RzLCBmb3IgdGhlIGRlZmF1bHQgY2FzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OU1RSVUNUX1RZUEVfTkFNRVMgPSB7ICJOb25lIiwKLQkJCSJGdW5jdGlvbiBDYWxsIiwgIkNvbnN0YW50IiB9OwotCi0JLyoqCi0JICogU2ltcGxlIEFydGlmYWN0IFRhYmxlIFZpZXcgY29uc3RydWN0b3IKLQkgKiA8cD4KLQkgKiBFdmVyeXRoaW5nIGNhbiBiZSBudWxsLCBhbmQgZGVmYXVsdHMgd2lsbCBiZSB0YWtlbiwgb3IgcmVhZCBmcm9tCi0JICogcGx1Z2luLnhtbCBmb3IgdGhlIHZpZXcuCi0JICogPHA+Ci0JICogTm90ZTogaWYgYSBudWxsIHBsdWdJbiBpbnN0YW5jZSBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgcGx1Z2luICh0aGlzCi0JICogb25lKSB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgcmVzb3VyY2VzIChlLmcuIGljb24gaW1hZ2VzKSBpZiB0aGUgZGVyaXZlZAotCSAqIGNsYXNzIGlzIGluIGl0cyBvd24gcGx1Zy1pbiwgYW5kIGl0cyBpY29ucyBhcmUsIHRvby4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHJlZVRhYmxlTWFya2VyVmlldyhBYnN0cmFjdFVJUGx1Z2luIHRoZVBsdWdpbiwKLQkJCVN0cmluZyB0aGluZ25hbWUsIFN0cmluZyB0aGluZ25hbWVzLCBTdHJpbmcgY29sdW1uTmFtZSwKLQkJCVN0cmluZyBtYXJrZXJJRCkgewotCi0JCWlmICh0aGVQbHVnaW4gPT0gbnVsbCkgewotCQkJdGhlUGx1Z2luXyA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnRoZVBsdWdpbl8gPSB0aGVQbHVnaW47Ci0JCX0KLQkJaWYgKHRoaW5nbmFtZSAhPSBudWxsKQotCQkJdGhpcy50aGluZ25hbWVfID0gdGhpbmduYW1lOwotCQlpZiAodGhpbmduYW1lcyAhPSBudWxsKQotCQkJdGhpcy50aGluZ25hbWVzXyA9IHRoaW5nbmFtZXM7Ci0JCWlmIChjb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uTmFtZV8gPSBjb2x1bW5OYW1lOyAvLyBsYXN0IGNvbHVtbiBuYW1lZCBieSBzdWJjbGFzcwotCQl9Ci0JCXRoaXMubWFya2VySURfID0gbWFya2VySUQ7Ly8gaWYgbnVsbCwgd2lsbCB1c2UgdmlldyBpZC4KLQotCQlmaW5kVmlld0luZm8oKTsKLQotCX0KLQotCS8qKgotCSAqIFNpbXBsZSB0YWJsZSB2aWV3IHdpdGggYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBleHRyYSBjb2x1bW5zCi0JICogCi0JICogQHBhcmFtIHRoZVBsdWdpbgotCSAqIEBwYXJhbSB0aGluZ25hbWUKLQkgKiBAcGFyYW0gdGhpbmduYW1lcwotCSAqIEBwYXJhbSBhdHRyTmFtZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgbWFya2VyIGF0dHJpYnV0ZXMsIGZvciB3aGljaCB0aGUgY29sdW1uIHZhbHVlcyB3aWxsIGJlCi0JICogICAgICAgICAgICBleHRyYWN0ZAotCSAqIEBwYXJhbSBjb2xOYW1lcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBDb2x1bW4gbmFtZXMsIHVzZWQgYXMgaGVhZGVycyBmb3IgdGhlIHZhbHVlcyBmb3VuZCBpbgotCSAqICAgICAgICAgICAgdGhlIG1hcmtlciBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIG1hcmtlcklEXwotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3KEFic3RyYWN0VUlQbHVnaW4gdGhlUGx1Z2luLAotCQkJU3RyaW5nIHRoaW5nbmFtZSwgU3RyaW5nIHRoaW5nbmFtZXMsIFN0cmluZ1tdIGF0dHJOYW1lcywKLQkJCVN0cmluZ1tdIGNvbE5hbWVzLCBTdHJpbmcgbWFya2VySUQpIHsKLQkJdGhpcyh0aGVQbHVnaW4sIHRoaW5nbmFtZSwgdGhpbmduYW1lcywgbnVsbCwgbWFya2VySUQpOwotCQljb2x1bW5OYW1lc18gPSBjb2xOYW1lczsKLQkJY29sdW1uTmFtZV8gPSBudWxsOy8vIHNldCB0aGlzIHNvIHdlIGNhbiB0ZWxsIHdlIGFyZSB1c2luZyBhcnJheSBvZgotCQkvLyBhdHRycy9jb2xzCi0JCW1hcmtlckF0dHJOYW1lc18gPSBhdHRyTmFtZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDdG9yIHRoYXQgdXNlcyBkZWZhdWx0cyBmb3IgZXZlcnl0aGluZyAodGVzdGluZz8gdGhlb3JldGljYWxseSwgdGhpcwotCSAqIHNob3VsZCB3b3JrLCBhbmQgc2hvdWxkIGJlIHJldXNhYmxlIHNpbmNlIGluZm8gdGhhdCBtdXN0IGJlIHVuaXF1ZSBpcwotCSAqIHJlYWQgZnJvbSBmcm9tIHBsdWdpbi54bWwuKQotCSAqIAotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmVlVGFibGVNYXJrZXJWaWV3KCkgewotCQl0aGlzKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgaW5mbyBmcm9tIHRoZSB2aWV3IGluZm8gaW4gdGhlIG1hbmlmZXN0LiBUaGlzIGluY2x1ZGVzIHRoZSBpY29uCi0JICogbmFtZSwgdGhlIHZpZXcgaWQgKHVzZWQgYXMgbWFya2VyIGlkIGlmIG5vbmUgZ2l2ZW4gb24gY3RvciksIGFuZAotCSAqIGNvbnN0cnVjdHMgYW4gYXJ0aWZhY3QgbWFuYWdlciBmb3IgdGhpcyB2aWV3J3MgYXJ0aWZhY3Qgb2JqZWN0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRWaWV3SW5mbygpIHsKLQkJU3RyaW5nIGNsYXNzbmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCS8vIHRyeSB0byBmaW5kIHRoZSBpY29uIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmb3IgdGhpcwotCQkvLyBleHRlbnNpb24vdmlldwotCQlJRXh0ZW5zaW9uW10gZXh0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MiKS5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dFtpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNlcyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNFbGVtZW50ID0gY2VzW2pdOwotCQkJCVN0cmluZyBpY29uTmFtZSA9IGNFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWNvbiIpOwotCQkJCVN0cmluZyBjbGFzc04gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJCQlpZiAoY2xhc3NuYW1lLmVxdWFscyhjbGFzc04pKSB7Ci0JCQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpY29uTmFtZV8gPSBpY29uTmFtZTsKLQkJCQkJfQotCQkJCQl0aGlzLnZpZXdOYW1lXyA9IG5hbWU7Ci0JCQkJCWlmIChtYXJrZXJJRF8gPT0gbnVsbCkgewotCQkJCQkJLy8gdXNlIHBsdWdpbiBpZCBmb3IgbWFya2VyIGlkLCBpZiBub3Qgc3BlY2lmaWVkCi0JCQkJCQltYXJrZXJJRF8gPSBjRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQkJCX0KLQkJCQkJYXJ0aWZhY3RNYW5hZ2VyXyA9IEFydGlmYWN0TWFuYWdlci5nZXRNYW5hZ2VyKG1hcmtlcklEXyk7Ci0JCQkJCWlmIChhcnRpZmFjdE1hbmFnZXJfID09IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0TWFuYWdlcl8gPSBuZXcgQXJ0aWZhY3RNYW5hZ2VyKG1hcmtlcklEXyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQgbWlnaHQgYmUgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIHRoaXMsIHRvIHNheSB3aGljaAotCSAqIGZpbGVuYW1lcyBzaG91bGQgYWxsb3cgdGhlIGFjdGlvbiAicnVuIGFuYWx5c2lzIiB0byBjcmVhdGUgbmV3IGFydGlmYWN0cwotCSAqIGFuZCB0aHVzIG5ldyBtYXJrZXJzLiA8YnI+Ci0JICogVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRGb3JBbmFseXNpcyhTdHJpbmcgZmlsZW5hbWUpIHsKLQkJLy8gcmV0dXJuIE1waVV0aWwudmFsaWRGb3JBbmFseXNpcyhmaWxlbmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBvYmplY3RzIHRvIHRoZQotCSAqIHZpZXcuIEl0IGNhbiB3cmFwIGV4aXN0aW5nIG9iamVjdHMgaW4gYWRhcHRlcnMgb3Igc2ltcGx5IHJldHVybiBvYmplY3RzCi0JICogYXMtaXMuIFRoZXNlIG9iamVjdHMgbWF5IGJlIHNlbnNpdGl2ZSB0byB0aGUgY3VycmVudCBpbnB1dCBvZiB0aGUgdmlldywKLQkgKiBvciBpZ25vcmUgaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgKGxpa2UgVGFzayBMaXN0LCBmb3IKLQkgKiBleGFtcGxlKS4KLQkgKi8KLQljbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIElSZXNvdXJjZSBpbnB1dDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc1JlZ2lzdGVyZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBjb3VsZCB1c2UgdGhpcyB0byBjaGFuZ2UgdGhlIGxpc3QgdG8ganVzdCBhcnRpZmFjdHMgZnJvbSBvbmUKLQkJCS8vIHJlc291cmNlLAotCQkJLy8gZXRjLi4uCi0JCQkvLyBjb3VsZCBjYWNoZSB2aWV3ZXIgaGVyZSB0aGlzLnZpZXdlcj12OwotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFRNViBpbnB1dENoYW5nZWQoKS4uLiIpOwotCQkJLy8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gaW5wdXQKLQkJCWlmICghaGFzUmVnaXN0ZXJlZCkgewotCQkJCS8vIGFkZCBtZSBhcyBhIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciBzbyBpIGNhbiByZWZyZXNoIGF0Ci0JCQkJLy8gbGVhc3Qgd2hlbiBtYXJrZXJzIGFyZSBjaGFuZ2VkCi0JCQkJLy8gUE9TVF9DSEFOR0U6IG9ubHkgd2FudCBldmVudCBub3RpZmljYXRpb25zIGZvciBhZnRlci10aGUtZmFjdAotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsCi0JCQkJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQkJaGFzUmVnaXN0ZXJlZCA9IHRydWU7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiU1RUTVY6IFJlZ2lzdGVyZWQgUkNMIGZvciBWaWV3Q29udGVudFByb3ZpZGVyIik7Ci0JCQl9Ci0JCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQl0aGlzLmlucHV0ID0gKElSZXNvdXJjZSkgbmV3SW5wdXQ7Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WLlZpZXdDb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpIik7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIHBvcHVsYXRlIHRoaXMgdmlldy4KLQkJICovCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlPYmplY3RbXSBvYmpzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGlkID0gbWFya2VySURfOwotCQkJCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnB1dCBpcyBudWxsIGluIGdldEVsZW1lbnRzLi4uIik7Ci0JCQkJfQotCQkJCS8vIHVzZSB0aGUgY2FjaGVkIGlucHV0IG9iamVjdCBpbnN0ZWFkIG9mIHF1ZXJ5aW5nIGZyb20KLQkJCQkvLyB3b3Jrc3BhY2UKLQkJCQkvLyBvYmpzID0KLQkJCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNYXJrZXJzKGlkLAotCQkJCS8vIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCW9ianMgPSBpbnB1dC5maW5kTWFya2VycyhpZCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IChJTWFya2VyW10pIG9ianM7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJaW50IHBhcmVudElEID0gZ2V0UGFyZW50SUQobWFya2VyKTsKLQkJCQkJaWYgKHBhcmVudElEID09IDApIHsKLQkJCQkJCWxpc3QuYWRkKG1hcmtlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiU1RUTVYsIGV4Y2VwdGlvbiBnZXR0aW5nIG1vZGVsIGVsZW1lbnRzIChtYXJrZXJzIGZvciBUYWJsZSB2aWV3KSIpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WLmdldC0tLUVsZW1lbnRzLCBmb3VuZCAiICsgb2Jqcy5sZW5ndGgKLQkJCQkJCSsgIiBtYXJrZXJzL3BhcmVudE5vZGVzIik7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0KLQkJfQotCi0JCXByaXZhdGUgaW50IGdldFBhcmVudElEKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlpbnQgcGFyZW50SUQgPSAwOwotCQkJdHJ5IHsKLQkJCQlwYXJlbnRJRCA9ICgoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShJRHMucGFyZW50SURBdHRyKSkKLQkJCQkJCS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJCYXJyaWVyIFNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcuZ2V0UGFyZW50SUQsICAiK2UuZ2V0TWVzc2FnZSgpKTsKLQkJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50SUQ7Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRNeUlEKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlpbnQgcGFyZW50SUQgPSAwOwotCQkJdHJ5IHsKLQkJCQlwYXJlbnRJRCA9ICgoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShJRHMubXlJREF0dHIpKQotCQkJCQkJLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudElEOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0TXlOYW1lKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG51bGw7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElEcy5teU5hbWVBdHRyKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCUlNYXJrZXIgcGFyZW50TWFya2VyID0gKElNYXJrZXIpIHBhcmVudDsKLQkJCQlpbnQgcGFyZW50SUQgPSBnZXRNeUlEKHBhcmVudE1hcmtlcik7Ci0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1hcmtlcnMgPSBpbnB1dC5maW5kTWFya2VycyhtYXJrZXJJRF8sIGZhbHNlLAotCQkJCQkJCUlSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUxpc3Q8SU1hcmtlcj4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PElNYXJrZXI+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJaW50IGlkID0gZ2V0UGFyZW50SUQobWFya2VyKTsKLQkJCQkJaWYgKGlkID09IHBhcmVudElEKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQobWFya2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJfQotCQkJLy8gbWFya2VycyBhcmUgbGVhZiBub2RlcywgdGhleSBkb24ndCBoYXZlIGNoaWxkcmVuCi0JCQkvLyBpZiBub3QgYSBQYXJlbnROb2RlLCB0aGVuIGl0IHNob3VsZCBiZSBhIGxlYWYgbm9kZSAobWFya2VyKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQlJTWFya2VyIGNoaWxkID0gKElNYXJrZXIpIGVsZW1lbnQ7Ci0JCQkJaW50IHBhcmVudElEID0gZ2V0UGFyZW50SUQoY2hpbGQpOwotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltYXJrZXJzID0gaW5wdXQuZmluZE1hcmtlcnMobWFya2VySURfLCBmYWxzZSwKLQkJCQkJCQlJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlpbnQgaWQgPSBnZXRNeUlEKG1hcmtlcik7Ci0JCQkJCWlmIChpZCA9PSBwYXJlbnRJRCkgewotCQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIGtpZHMgPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCWJvb2xlYW4gaGFzS2lkcyA9IGtpZHMubGVuZ3RoID4gMDsKLQkJCXJldHVybiBoYXNLaWRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHJlYWN0IHRvIGEgcmVzb3VyY2UgY2hhbmdlIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkJICovCi0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tcmVzb3VyY2VDaGFuZ2VkKCkiKTsKLQkJCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50UmVzb3VyY2VzQ2hhbmdlZChkZWx0YSwgMSk7Ci0JCQkvLyByZW1vdmUgdGhlIGZvbGxvd2luZyB3aGVuIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgZG9lcyBpdCBhbGw/Ci0JCQlDb250cm9sIGN0cmwgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJaWYgKGN0cmwgIT0gbnVsbCAmJiAhY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigidmlld2VyLnVwZGF0ZSBlYSBta3IgaW4gZGVsdGEtLSBmcm9tIHJlc291cmNlQ2hhbmdlZCgpLi4uIik7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiLS0tLXByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKCkuLi4iKTsKLQkJCQkJCQlwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YShkZWx0YSk7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiLS0tLUVORCBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YSgpLi4uIik7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmlld2VyLnJlZnJlc2goKSIpOwotCQkJCQkJCS8vIHdlIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGluZGl2LiByb3dzIHdlIGNhcmUKLQkJCQkJCQkvLyBhYm91dCwKLQkJCQkJCQkvLyBidXQgbmVlZCB0aGlzIGZvciBNYXJrZXIgZGlzcGxheSBhZnRlciBpbml0aWFsCi0JCQkJCQkJLy8gYW5hbHlzaXMsCi0JCQkJCQkJLy8gYW5kIGZvciBtYXJrZXJzIGRlbGV0ZWQsIGV0Yy4gQ2FuIHJlbW92ZSB3aGVuIHdlCi0JCQkJCQkJLy8gbW9yZSBjb21wbGV0ZWx5Ci0JCQkJCQkJLy8gaGFuZGxlIHRoaW5ncyBpbiBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YQotCQkJCQkJCS8vIChyZW1vdmVzIGV0Yy4pCi0JCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiU1RUTVY6IEV4Y2VwdGlvbiByZWZyZXNoaW5nIHZpZXdlcjogIgotCQkJCQkJCQkJCQkrIGUpOwotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLUVORCByZXNvdXJjZUNoYW5nZWQoKVxuIik7Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBEZWJ1Z2dpbmcgc3RhdGVtZW50IGhlbHAgLSBwcmludHMgdGhlIGV2ZW50cywgaW5kZW50ZWQgYnkgbmVzdGluZwotCQkgKiBsZXZlbAotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqIEBwYXJhbSBpbmRlbnQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBwcmludFJlc291cmNlc0NoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBpbmRlbnQpIHsKLQkJCXByaW50T25lUmVzb3VyY2VDaGFuZ2VkKGRlbHRhLCBpbmRlbnQpOwotCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJcHJpbnRSZXNvdXJjZXNDaGFuZ2VkKGNoaWxkcmVuW2ldLCBpbmRlbnQgKyAxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnQgaGVscAotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqIEBwYXJhbSBpbmRlbnQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBwcmludE9uZVJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGluZGVudCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoODApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQkJCQlidWYuYXBwZW5kKCIgICIpOwotCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJYnVmLmFwcGVuZCgiQURERUQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLQkJCQlidWYuYXBwZW5kKCJSRU1PVkVEIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJYnVmLmFwcGVuZCgiQ0hBTkdFRCIpOwotCQkJCXRlc3REZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJ1Zi5hcHBlbmQoIlsiKTsKLQkJCQlidWYuYXBwZW5kKGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJYnVmLmFwcGVuZCgiXSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnVmLmFwcGVuZCgiICIpOwotCQkJYnVmLmFwcGVuZChkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihidWYpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNob3cgZGVidWdnaW5nIGluZm8gZm9yIGEgcmVzb3VyY2UgZGVsdGEgY2hhbmdlCi0JCSAqIAotCQkgKiBAcGFyYW0gZGVsdGEKLQkJICovCi0JCXByaXZhdGUgdm9pZCB0ZXN0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIC0tIGNvZGUgZnJvbSBlY2xpcHNlIGhlbHA6Ci0JCQkvLyBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJSZXNvdXJjZSAiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoZGVsdGEuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBoYXMgY2hhbmdlZC4iKTsKLQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0+IENvbnRlbnQgQ2hhbmdlIik7Ci0JCQl9Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tPiBDb250ZW50IFJlcGxhY2VkIik7Ci0JCQl9Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gMCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0+IE1hcmtlciBDaGFuZ2UiKTsKLQkJCQkvLyBJTWFya2VyRGVsdGFbXSBtYXJrZXJzID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQkJLy8gaWYgaW50ZXJlc3RlZCBpbiBtYXJrZXJzLCBjaGVjayB0aGVzZSBkZWx0YXMKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBQcm9jZXNzIHRoZSByZXNvdXJjZSBjaGFuZ2UgLSBqdXN0IHRoZSBkZWx0YQotCQkgKiAKLQkJICogQHBhcmFtIGRlbHRhCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVzb3VyY2VDaGFuZ2VEZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcl8pOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkVycm9yIGluIFBJVFYucHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoKS4uIik7Ci0JCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9IC8vIGVuZCBWaWV3Q29udGVudFByb3ZpZGVyCi0KLQljbGFzcyBQYXJlbnROb2RlIHsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBJRDsKLQkJcHJpdmF0ZSBJTWFya2VyIG1hcmtlcl87Ci0KLQkJcHVibGljIFBhcmVudE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQlJRCA9IDA7Ci0JCQltYXJrZXJfID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBQYXJlbnROb2RlKGludCBJRCkgewotCQkJbmFtZSA9IChTdHJpbmcpIG51bGw7Ci0JCQl0aGlzLklEID0gSUQ7Ci0JCQltYXJrZXJfID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBQYXJlbnROb2RlKElNYXJrZXIgbWFya2VyKSB7Ci0JCQluYW1lID0gKFN0cmluZykgbnVsbDsKLQkJCUlEID0gMDsKLQkJCW1hcmtlcl8gPSBtYXJrZXI7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gSUQ7Ci0JCX0KLQotCQlwdWJsaWMgSU1hcmtlciBnZXRNYXJrZXIoKSB7Ci0JCQlyZXR1cm4gbWFya2VyXzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQkJbWFya2VyXyA9IG1hcmtlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogZm9yIGR1bW15IHRlc3Rpbmcgb25seQotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiUGFyZW50Tm9kZTogIiArIG5hbWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCBhcnRpZmFjdCBmcm9tIG1hcmtlcgotCSAqIAotCSAqIEBwYXJhbSBtYXJrZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcnRpZmFjdCBnZXRTaW1wbGVBcnRpZmFjdChJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJQXJ0aWZhY3QgYXJ0aWZhY3QgPSBudWxsOwotCQl0cnkgewotCQkJaWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXyk7Ci0JCQlhcnRpZmFjdCA9IGFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3QoaWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKQotCQkJCQkrICIgLi4uIFNUViwgQ29yZUV4Y2VwdGlvbiBnZXR0aW5nIGFydGlmYWN0IGZyb20gaGFzaE1hcDsgIgotCQkJCQkrIHRoaW5nbmFtZV8gKyAiIGlkPSIgKyBpZCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5lKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmUuZ2V0TWVzc2FnZSgpCi0JCQkJCSsgIiAuLi4gU1RWLCBOdWxsUHRyRXhjcCBnZXR0aW5nIGFydGlmYWN0IGZyb20gaGFzaE1hcDsiCi0JCQkJCSsgdGhpbmduYW1lXyArICIgaWQ9IiArIGlkKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3Q7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBjb25zdHJ1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uc3RydWN0U3RyKElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUludGVnZXIgdGVtcCA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKGNvbHVtbklEXyk7Ci0JCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCUludGVnZXIgY29uc3RydWN0VHlwZSA9IChJbnRlZ2VyKSB0ZW1wOwotCQkJLy8gcmV0dXJuIENPTlNUUlVDVF9UWVBFX05BTUVTW2NvbnN0cnVjdFR5cGUuaW50VmFsdWUoKV07Ci0JCQlJbnRlZ2VyIGluZGV4ID0gbmV3IEludGVnZXIoY29uc3RydWN0VHlwZS5pbnRWYWx1ZSgpIC0gNCk7Ci0JCQlyZXR1cm4gaW5kZXgudG9TdHJpbmcoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIiAiOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFZpZXdMYWJlbFByb3ZpZGVyIC0gcHJvdmlkZXMgdGhlIHRleHQgYW5kIGltYWdlcyBmb3IgdGhlIGFydGlmYWN0cyBpbiB0aGUKLQkgKiBUYWJsZSBWaWV3Ci0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkvKioKLQkJICogS2VlcCBpY29ucyBhbHJlYWR5IGNyZWF0ZWQsIGFuZCByZXVzZSB0aGUgaW1hZ2VzCi0JCSAqLwotCQlwcml2YXRlIEhhc2hNYXAgaWNvbkhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgSUFydGlmYWN0IGFydGlmYWN0OwotCi0JCS8qKgotCQkgKiBwcm92aWRlIHdoYXQgZ29lcyBpbiBlYWNoIGNvbHVtbjsgZ2V0IHRoZSBpbmZvIGZyb20gdGhlIG1hcmtlcgotCQkgKi8KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQkJU3RyaW5nIHRlbXAgPSBzdXBlci5nZXRUZXh0KG8pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUZXh0OiAiICsgdGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmUgdGhlIHRleHQgdG8gZ28gaW4gZWFjaCBjb2x1bW4uIE5vdGU6IHRoZSBwYXJlbnQgbm9kZXMgd2lsbAotCQkgKiBiZSBQYXJlbnROb2RlIG9iamVjdHMsIGFuZCB0aGUgY2hpbGQgbm9kZXMgd2lsbCBiZSBJTWFya2Vycy4KLQkJICogCi0JCSAqIEBwYXJhbSBvYmoKLQkJICogICAgICAgICAgICB0aGUgTWFya2VyICh3ZSBob3BlKSB0aGF0IGdvZXMgb24gdGhlIGN1cnJlbnQgcm93Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB0YWJsZQotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCWlmIChvYmogPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6IExhYmVsUHJvdiBvYmogaXMgbnVsbDsgaW5kZXg9IgotCQkJCQkJKyBpbmRleCk7Ci0JCQkJcmV0dXJuICJTVFRNViBvYmogbnVsbCI7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG9iajsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbXlOYW1lID0gKFN0cmluZykgbWFya2VyCi0JCQkJCQkJLmdldEF0dHJpYnV0ZShJRHMubXlOYW1lQXR0cik7Ci0JCQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIG15TmFtZTsKLQkJCQkJY2FzZSAxOgotCQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJCQkJCXJldHVybiBpZDsKLQkJCQkJY2FzZSAyOgotCQkJCQkJcmV0dXJuIChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCQljYXNlIDM6Ci0JCQkJCQlTdHJpbmcgbGluZSA9IChtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpKQotCQkJCQkJCQkudG9TdHJpbmcoKTsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCWRlYnVnTWFya2VySW5mbyhtYXJrZXIsIGxpbmUpOwotCQkJCQkJcmV0dXJuIGxpbmU7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCS8qCi0JCQkJCQkgKiBpZiAoY29sdW1uTmFtZV8gIT0gbnVsbCkgey8vIHdlJ3JlIG5vdCB1c2luZyBhcnJheQotCQkJCQkJICogcmV0dXJuIGdldENvbnN0cnVjdFN0cihtYXJrZXIpOyB9IC8vIGVsc2UgZHJvcAotCQkJCQkJICogdGhyb3VnaC4uLgotCQkJCQkJICovCi0JCQkJCQlJbnRlZ2VyIGluZGV4TnVtID0gKEludGVnZXIpIG1hcmtlcgotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKElEcy5teUluZGV4QXR0cik7Ci0JCQkJCQlyZXR1cm4gaW5kZXhOdW0udG9TdHJpbmcoKTsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG1hcmtlckF0dHJOYW1lc19baW5kZXggLSA0XTsKLQkJCQkJCVN0cmluZyB2YWwgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKGF0dHJOYW1lLCAiIik7Ci0JCQkJCQlyZXR1cm4gdmFsOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlyZXR1cm4gKCJTVFRNViBlcnJvciBpbiBWaWV3Q29udGVudFByb3ZpZGVyIG9mIFNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXciKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gIlNUVE1WLCB2Y3A/Pz8iOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1cmVseSBmb3IgZGVidWdnaW5nIG1hcmtlciBpbmZvIGluIFZpZXdMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoKQotCQkgKiAKLQkJICogQHBhcmFtIG1hcmtlcgotCQkgKiBAcGFyYW0gbGluZQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGRlYnVnTWFya2VySW5mbyhJTWFya2VyIG1hcmtlciwgU3RyaW5nIGxpbmUpIHsKLQkJCWFydGlmYWN0ID0gZ2V0U2ltcGxlQXJ0aWZhY3QobWFya2VyKTsKLQkJCVN0cmluZyBjb21wTGluZSA9IGxpbmUgKyAiLSI7Ci0JCQlpZiAoYXJ0aWZhY3QgPT0gbnVsbCkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WIGdldENvbHVtblRleHQtIG51bGwgYXJ0aWZhY3QiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGxpbmVBcnRpZmFjdCA9IGFydGlmYWN0LmdldExpbmUoKTsKLQkJCQljb21wTGluZSA9IGNvbXBMaW5lICsgbGluZUFydGlmYWN0OwotCQkJfQotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiU1RUTVYuVmlld0xhYmVsUHJvdmlkZXIgZ2V0cyBtYXJrZXIgbGluZTogbWtyLWFydGlmYWN0OiAiCi0JCQkJCQkJKyBjb21wTGluZSk7Ci0JCQlzaG93TWFya2VyKG1hcmtlcik7Ci0JCX0KLQotCQkvKioKLQkJICogUHJvdmlkZSB0aGUgaW1hZ2UgdGhhdCBnb2VzIGluIGEgY29sdW1uLCBpZiBhbnkgKE5vdGUgdGhhdCBhIHRhYmxlCi0JCSAqIGNlbGwgY2FuIGNvbnRhaW4gYm90aCwgYW4gaW1hZ2UgYW5kIHRleHQsIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkCi0JCSAqIHNpZGUtYnktc2lkZSkKLQkJICogCi0JCSAqIEBwYXJhbSBvYmogLQotCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2UncmUgZ2V0dGluZyB0aGUgaW1hZ2UgZm9yCi0JCSAqIEBwYXJhbSBpbmRleCAtCi0JCSAqICAgICAgICAgICAgdGhlIGNvbHVtbiB0aGF0IHRoaXMgaW1hZ2UgaXMgdG8gZ28gaW4KLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJCS8vIHdlIG9ubHkgcHV0IGltYWdlIGljb24gaW4gdGhlIGZpcnN0IGNvbHVtbgotCQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSAwOgotCQkJCXJldHVybiBnZXRDdXN0b21JbWFnZShvYmopOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgaW1hZ2UgZm9yIGFydGlmYWN0LiBOb3RlIHRoYXQgZGlmZmVyZW50IGltYWdlcyBjb3VsZCBiZSB1c2VkIGZvcgotCQkgKiBkaWZmZXJlbnQgdHlwZXMgb2YgYXJ0aWZhY3RzLiBGb3Igbm93IHdlIGhhdmUgYSBzaW5nbGUgaW1hZ2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gb2JqCi0JCSAqICAgICAgICAgICAgdGhlIG1hcmtlciBvYmplY3QgdGhhdCB0aGlzIGFydGlmYWN0IGlzIHJlcHJlc2VudGVkIGJ5Ci0JCSAqIEByZXR1cm4gaW1hZ2UgZm9yIG1hcmtlcgotCQkgKiAgICAgICAgIDxwPgotCQkgKiAgICAgICAgIE5vdGU6IGlmIGEgbnVsbCBwbHVnSW4gaW5zdGFuY2UgaXMgcHJvdmlkZWQgb24gdGhlIHZpZXcgY3RvciwKLQkJICogICAgICAgICB0aGUgZGVmYXVsdCBwbHVnaW4gKHRoaXMgb25lKSB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQKLQkJICogICAgICAgICByZXNvdXJjZXMgKGUuZy4gaWNvbiBpbWFnZXMpIGlmIHRoZSBkZXJpdmVkIGNsYXNzIGlzIGluIGl0cwotCQkgKiAgICAgICAgIG93biBwbHVnLWluLCBhbmQgaXRzIGljb25zIGFyZSwgdG9vLgotCQkgKiAKLQkJICovCi0JCXByb3RlY3RlZCBJbWFnZSBnZXRDdXN0b21JbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgb25lIG9mIHRoaXMgdHlwZSBvZiBpY29uLCByZXVzZSBpdC4KLQkJCS8vIE5vdGU6IHVzZSBJbWFnZVJlZ2lzdHJ5IGluc3RlYWQ/Ci0JCQlJbWFnZSBpbWcgPSAoSW1hZ2UpIGljb25IYXNoLmdldChpY29uTmFtZV8pOwotCQkJaWYgKGltZyA9PSBudWxsKSB7Ci0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoaWNvbk5hbWVfKTsKLQkJCQkvLyBCUlQgbWFrZSBzdXJlIHRoZSBzcGVjaWZpYyBwbHVnaW4gaXMgYmVpbmcgdXNlZCBoZXJlIHRvIGZpbmQKLQkJCQkvLyBpdHMgT1dOIGljb25zCi0JCQkJVVJMIHVybCA9IHRoZVBsdWdpbl8uZmluZChwYXRoKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkJCWltZyA9IGlkLmNyZWF0ZUltYWdlKCk7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6ICoqKioqIGNyZWF0ZWQgaW1hZ2UgZm9yICIKLQkJCQkJCQkrIGljb25OYW1lXyk7Ci0JCQkJaWNvbkhhc2gucHV0KGljb25OYW1lXywgaW1nKTsvLyBzYXZlIGZvciByZXVzZQotCQkJfQotCQkJcmV0dXJuIGltZzsKLQkJfQotCi0JCS8qKgotCQkgKiBEaXNwb3NlIG9mIGFueXRoaW5nIHRoYXQgd291bGQgaGFuZyBhcm91bmQgcnVkZWx5IG90aGVyd2lzZSAoc3VjaCBhcwotCQkgKiBpbWFnZSBvYmplY3RzIGZyb20gdGhlIGljb25zKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJTVFRNVi5WaWV3TGFiZWxQcm92aWRlci5kaXNwb3NlKCk7IGRpc3Bvc2Ugb2YgaWNvbiBpbWFnZXMiKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGljb25IYXNoLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUltYWdlIGltZyA9IChJbWFnZSkgaXRlci5uZXh0KCk7Ci0JCQkJaW1nLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBzb3J0ZXIgZm9yIGl0ZW1zIC0gdGhlIG9yZGVyIHRoZXkgd2VyZSBjcmVhdGVkLCB3aGljaCB0ZW5kcyB0bwotCSAqIGdyb3VwIGl0ZW1zIHdpdGggdGhlaXIgc291cmNlIGNvZGUgbG9jYXRpb25zCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICovCi0JY2xhc3MgTmFtZVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JfQotCi0JLyoqCi0JICogU29ydCBpdGVtcyBieSBvbmUgb3IgbW9yZSBvZjogYXJ0aWZhY3QsIGZpbGVuYW1lLCBsaW5lTm8sCi0JICogdmFyaWFibGVDb2x1bW5OYW1lLjxicj4KLQkgKiBUaGUgZGVyaXZlZCBjbGFzc2VzIHdpbGwgaW1wbGVtZW50IGNvbWJpbmUoKSB0byBzYXkgaG93IHRoZSBhdHRyaWJ1dGVzCi0JICogYXJlIGNvbWJpbmVkIHRvIGdldCB0aGUgc29ydCBkZXNpcmVkLgotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqLwotCWFic3RyYWN0IGNsYXNzIEdlbmVyaWNTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhc2NlbmRpbmcgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBDb21wYXJlIHR3byBpdGVtcyB0byBkZXRlcm1pbmUgc29ydCBvcmRlci4gU29ydCBpdGVtcyBieSBvbmUgb3IgbW9yZQotCQkgKiBvZjogYXJ0aWZhY3QgbmFtZSwgdGhlbiBmaWxlLCB0aGVuIGxpbmUgbnVtYmVyLCB0aGVuIGNvbnN0cnVjdAotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQlpbnQgcmVzdWx0ID0gMDsKLQotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0KLQkJCWphdmEudGV4dC5Db2xsYXRvciBjb2xsYXRvciA9IHRoaXMuZ2V0Q29sbGF0b3IoKTsKLQotCQkJaWYgKGUxIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCXRyeSB7Ci0JCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJCVN0cmluZyBuYW1lMSA9IChTdHJpbmcpIG0xLmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJCQkJU3RyaW5nIGZpbGUxID0gKFN0cmluZykgbTEuZ2V0QXR0cmlidXRlKEZJTEVOQU1FKTsKLQotCQkJCQlTdHJpbmcgbGluZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGNvbnN0cnVjdDEgPSBnZXRDb25zdHJ1Y3RTdHIobTEpOwotCQkJCQlTdHJpbmcgc29ydDEgPSBjb21iaW5lKG5hbWUxLCBmaWxlMSwgbGluZTEsIGNvbnN0cnVjdDEpOwotCi0JCQkJCVN0cmluZyBuYW1lMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJCQkJU3RyaW5nIGZpbGUyID0gKFN0cmluZykgbTIuZ2V0QXR0cmlidXRlKEZJTEVOQU1FKTsKLQkJCQkJU3RyaW5nIGxpbmUyID0gKFN0cmluZykgbTIuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBjb25zdHJ1Y3QyID0gZ2V0Q29uc3RydWN0U3RyKG0yKTsKLQkJCQkJU3RyaW5nIHNvcnQyID0gY29tYmluZShuYW1lMiwgZmlsZTIsIGxpbmUyLCBjb25zdHJ1Y3QyKTsKLQotCQkJCQlpZiAoYXNjZW5kaW5nKQotCQkJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShzb3J0MSwgc29ydDIpOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHNvcnQyLCBzb3J0MSk7Ci0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbWJpbmUgbmFtZSwgZmlsZSwgYW5kL29yIGxpbmUgbnVtYmVyIHRvIHByb3ZpZGUgdGhlIHN0cmluZyB0byBzb3J0Ci0JCSAqIGJ5LiBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgZGVyaXZlZCBjbGFzc2VzIGFzIG5lZWRlZAotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHBhcmFtIGZpbGUKLQkJICogQHBhcmFtIGxpbmUKLQkJICogQHBhcmFtIGNvbnN0cnVjdAotCQkgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm4gbnVsbCwgc3ViY2xhc3MgY2FuIGNob29zZSB0byBpbXBsLiB0aGlzIG1ldGhvZC4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgY29tYmluZShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGUsIFN0cmluZyBsaW5lLAotCQkJCVN0cmluZyBjb25zdHJ1Y3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN3aXRjaCB0byB0aGlzIHNvcnRlci4gSWYgaXQgd2FzIGFscmVhZHkgdGhpcyBzb3J0ZXIsIHRoZW4gdG9nZ2xlIHRoZQotCQkgKiBzb3J0IG9yZGVyCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIHZvaWQgc29ydCgpIHsKLQkJCS8vIFN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSsiLnNvcnQoKSBhc2NlbmRpbmc9Iithc2NlbmRpbmcpOwotCQkJaWYgKHRoaXMgPT0gdmlld2VyLmdldFNvcnRlcigpKSB7Ci0JCQkJYXNjZW5kaW5nID0gIWFzY2VuZGluZzsKLQkJCQl2aWV3ZXIuc2V0U29ydGVyKG51bGwpOyAvLyB0dXJuIG9mZiB0byBmb3JjZSByZS1zb3J0Ci0JCQl9IGVsc2UgewotCQkJCWFzY2VuZGluZyA9IHRydWU7Ci0JCQl9Ci0JCQl2aWV3ZXIuc2V0U29ydGVyKHRoaXMpOwotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNvcnRlciB0byBzb3J0IGJ5IGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBTaW1wbGVBcnRpZmFjdCBpcyBGb3VuZAotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cyBjcmVhdGVkCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgTGluZU5vU29ydGVyIGV4dGVuZHMgR2VuZXJpY1NvcnRlciB7Ci0JCS8qKgotCQkgKiBzb3J0IGl0ZW1zIGJ5IGxpbmUgbnVtYmVyCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0KLQkJCWlmIChlMSBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyIG0xID0gKElNYXJrZXIpIGUxOwotCQkJCQlPYmplY3QgdGVtcE9iaiA9IG0xLmdldEF0dHJpYnV0ZShMSU5FKTsKLQkJCQkJaW50IGxpbmUxID0gMDsKLQkJCQkJaW50IGxpbmUyID0gMDsKLQkJCQkJaWYgKHRlbXBPYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQlsaW5lMSA9ICgoSW50ZWdlcikgdGVtcE9iaikuaW50VmFsdWUoKTsKLQkJCQkJCUlNYXJrZXIgbTIgPSAoSU1hcmtlcikgZTI7Ci0JCQkJCQl0ZW1wT2JqID0gbTIuZ2V0QXR0cmlidXRlKExJTkUpOwotCQkJCQkJLy8gd2UgYXNzdW1lIGlmIHRoZSBmaXJzdCB3YXMgSW50ZWdlciwgdGhpcyBvbmUgaXMsIHRvby4KLQkJCQkJCWFzc2VydCB0ZW1wT2JqIGluc3RhbmNlb2YgSW50ZWdlcjsKLQkJCQkJCWxpbmUyID0gKChJbnRlZ2VyKSB0ZW1wT2JqKS5pbnRWYWx1ZSgpOwotCi0JCQkJCX0KLQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCWlmIChhc2NlbmRpbmcpCi0JCQkJCQlyZXN1bHQgPSBsaW5lMSAtIGxpbmUyOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBsaW5lMiAtIGxpbmUxOwotCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgbmFtZQotCSAqIAotCSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotCSAqIAotCSAqIAotCSAqLwotCWNsYXNzIE5hbWVBcnRpZmFjdFNvcnRlciBleHRlbmRzIEdlbmVyaWNTb3J0ZXIgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcGFyYW0gZmlsZQotCQkgKiBAcGFyYW0gbGluZQotCQkgKiBAcGFyYW0gY29uc3RydWN0Ci0JCSAqIEByZXR1cm4gQlJUIG5vdGU6IFNvcnQgaXNuJ3QgcXVpdGUgcmlnaHQ6IGlmIG5hbWUsZmlsZW5hbWUgaWRlbnRpY2FsLAotCQkgKiAgICAgICAgICIxMCIgd291bGQgc29ydCBiZWZvcmUgIjIiIGUuZy4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgY29tYmluZShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGUsIFN0cmluZyBsaW5lLAotCQkJCVN0cmluZyBjb25zdHJ1Y3QpIHsKLQkJCWZpbmFsIFN0cmluZyBkZWxpbSA9ICIgLSAiOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoZmlsZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQobGluZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoY29uc3RydWN0KTsKLQkJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnQgaXRlbXMgYnkgZmlsZW5hbWUgKHRoZW4gbGluZSBudW1iZXIpCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JY2xhc3MgRmlsZW5hbWVTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCQkJaW50IHJlcyA9IDA7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXIgbTEgPSAoSU1hcmtlcikgZTE7Ci0JCQkJSU1hcmtlciBtMiA9IChJTWFya2VyKSBlMjsKLQkJCQlTdHJpbmcgZmlsZTEgPSAoU3RyaW5nKSBtMS5nZXRBdHRyaWJ1dGUoRklMRU5BTUUpOwotCQkJCVN0cmluZyBmaWxlMiA9IChTdHJpbmcpIG0yLmdldEF0dHJpYnV0ZShGSUxFTkFNRSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhc2NlbmRpbmc9IiArIGFzY2VuZGluZyk7Ci0JCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShmaWxlMSwgZmlsZTIpOwotCQkJCWVsc2UKLQkJCQkJcmVzID0gY29sbGF0b3IuY29tcGFyZShmaWxlMiwgZmlsZTEpOwotCQkJCS8vIGlmIHRoZSBmaWxlbmFtZSBpcyB0aGUgc2FtZSwgb25seSB0aGVuIGRvIHdlIGxvb2sgYXQgbGluZQotCQkJCS8vIG51bWJlcgotCQkJCWlmIChyZXMgPT0gMCkgewotCQkJCQlTdHJpbmcgbGluZTEgPSBtMS5nZXRBdHRyaWJ1dGUoTElORSkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGxpbmUyID0gbTIuZ2V0QXR0cmlidXRlKExJTkUpLnRvU3RyaW5nKCk7Ci0JCQkJCWludCBsMSA9IEludGVnZXIucGFyc2VJbnQobGluZTEpOwotCQkJCQlpbnQgbDIgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUyKTsKLQkJCQkJaWYgKGFzY2VuZGluZykKLQkJCQkJCXJlcyA9IGwxIC0gbDI7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlcyA9IGwyIC0gbDE7Ci0JCQkJfQotCQkJCS8vIGlmIHRoZSBmaWxlbmFtZSBhbmQgbGluZSBubyBhcmUgdGhlIHNhbWUsIG9ubHkgdGhlbiBkbyB3ZQotCQkJCS8vIGxvb2sgYXQgY29uc3RydWN0Ci0JCQkJaWYgKHJlcyA9PSAwKSB7Ci0JCQkJCWlmIChhc2NlbmRpbmcpIHsKLQkJCQkJCXJlcyA9IGNvbGxhdG9yLmNvbXBhcmUoZ2V0Q29uc3RydWN0U3RyKG0xKSwKLQkJCQkJCQkJZ2V0Q29uc3RydWN0U3RyKG0yKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXMgPSBjb2xsYXRvci5jb21wYXJlKGdldENvbnN0cnVjdFN0cihtMiksCi0JCQkJCQkJCWdldENvbnN0cnVjdFN0cihtMSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQl9Ci0KLQljbGFzcyBDb25zdHJ1Y3RTb3J0ZXIgZXh0ZW5kcyBHZW5lcmljU29ydGVyIHsKLQotCQkvKioKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHBhcmFtIGZpbGUKLQkJICogQHBhcmFtIGxpbmUKLQkJICogQHBhcmFtIGNvbnN0cnVjdAotCQkgKiBAcmV0dXJuIEJSVCBub3RlOiBTb3J0IGlzbid0IHF1aXRlIHJpZ2h0OiBpZiBuYW1lLGZpbGVuYW1lIGlkZW50aWNhbCwKLQkJICogICAgICAgICAiMTAiIHdvdWxkIHNvcnQgYmVmb3JlICIyIiBlLmcuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmUoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlLCBTdHJpbmcgbGluZSwKLQkJCQlTdHJpbmcgY29uc3RydWN0KSB7Ci0JCQlmaW5hbCBTdHJpbmcgZGVsaW0gPSAiIC0gIjsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnN0cnVjdCk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQoZmlsZSk7Ci0JCQlyZXN1bHQuYXBwZW5kKGRlbGltKTsKLQkJCXJlc3VsdC5hcHBlbmQobGluZSk7Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzIHRvIGNyZWF0ZSB0aGUgdmlld2VyIGFuZCBpbml0aWFsaXplCi0JICogaXQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cmVlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQljcmVhdGVUcmVlQ29sdW1ucygpOwotCQlpZiAoZmFsc2UpIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIHRyZWVTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9iamVjdCBzcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKCF0cmFjZU9uKQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoc3JjIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVHJlZUl0ZW0gc2VsZWN0ZWQiKTsKLQkJCQkJfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBUcmVlQ29sdW1uKSB7Ci0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRyZWVDb2x1bW4gc2VsZWN0ZWQiKTsKLQotCQkJCQl9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIFRyZWUpIHsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVHJlZSBzZWxlY3RlZCIpOwotCQkJCQkJVHJlZSB0cmVlID0gKFRyZWUpIHNyYzsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRyZWVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3TGFiZWxQcm92aWRlcigpKTsKLQkJLy8gU2V0IHVwIHRoZSBzb3J0ZXJzLgotCQluYW1lU29ydGVyID0gbmV3IE5hbWVTb3J0ZXIoKTsKLQkJdmlld2VyLnNldFNvcnRlcihuYW1lU29ydGVyKTsKLQkJbGluZU5vU29ydGVyID0gbmV3IExpbmVOb1NvcnRlcigpOwotCQluYW1lQXJ0aWZhY3RTb3J0ZXIgPSBuZXcgTmFtZUFydGlmYWN0U29ydGVyKCk7Ci0JCWZpbGVuYW1lU29ydGVyID0gbmV3IEZpbGVuYW1lU29ydGVyKCk7Ci0JCWNvbnN0cnVjdFNvcnRlciA9IG5ldyBDb25zdHJ1Y3RTb3J0ZXIoKTsKLQotCQl2aWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCS8vIG1hcmtlcnMgZnJvbSB3b3Jrc3BhY2UKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJCQlzZWxlY3RlZE1hcmtlcl8gPSAoSU1hcmtlcikgb2JqOwotCQkJCX0KLQkJCQlzaG93U3RhdHVzTWVzc2FnZSgiIiwgInNlbGVjdGlvbkNoYW5nZWQiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbWFrZUFjdGlvbnMoKTsKLQkJaG9va0NvbnRleHRNZW51KCk7Ci0JCWhvb2tEb3VibGVDbGlja0FjdGlvbigpOwotCQljb250cmlidXRlVG9BY3Rpb25CYXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWVDb2x1bW5zKCkgewotCQlUcmVlQ29sdW1uIGNvbHVtbjsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOyAvLyBjb2wgMSBiYXJyaWVyIG5hbWUKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOyAvLyBjb2wgMiBmbiBuYW1lCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsgLy8gY29sIDMgZmlsZW5hbWUKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOyAvLyBjb2wgNCBsaW5lbm8KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOyAvLyBjb2wgNSBjb25zdHJ1Y3QKLQotCQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlpbnQgbnVtQ29sdW1ucyA9IGNvbHVtbnMubGVuZ3RoOwotCQlTZWxlY3Rpb25MaXN0ZW5lcltdIGNvbHVtbkxpc3RlbmVycyA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcltudW1Db2x1bW5zXTsKLQkJU3RyaW5nW10gaGVhZGluZ3MgPSBuZXcgU3RyaW5nW10geyAiQmFycmllciBNYXRjaGluZyBTZXQiLCAiRnVuY3Rpb24iLAotCQkJCSJGaWxlbmFtZSIsICJMaW5lTm8iLCAiSW5kZXhObyIgfTsKLQkJaW50W10gd2lkdGhzID0gbmV3IGludFtdIHsgMTIwLCAxMDAsIDEwMCwgMTAwLCAxMDAgfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotCQkJaW50IGNvbE5vID0gaTsgLy8gY291bGQgYmUgcmUtb3JkZXJlZCBsYXRlcgotCQkJLy8gaW50IGNvbE5vID0gY29sdW1uT3JkZXJbaV07Ci0JCQljb2x1bW5zW2NvbE5vXS5zZXRUZXh0KGhlYWRpbmdzW2NvbE5vXSk7Ci0JCQljb2x1bW5zW2NvbE5vXS5zZXRXaWR0aCh3aWR0aHNbY29sTm9dKTsKLQkJCWNvbHVtbnNbY29sTm9dLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbY29sTm9dLnNldE1vdmVhYmxlKHRydWUpOyAvLyBjYW4gcmVvcmRlciBjb2x1bW5zIGJ5Ci0JCQkvLyBkcmFnZ2luZwotCQkJU2VsZWN0aW9uTGlzdGVuZXIgY29sdW1uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3Qgc3JjID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCWlmIChzcmMgaW5zdGFuY2VvZiBUcmVlQ29sdW1uKSB7Ci0JCQkJCQlUcmVlQ29sdW1uIHRjID0gKFRyZWVDb2x1bW4pIHNyYzsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gdGMuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKHRydWUpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmVlIGNvbHVtbiBzZWxlY3RlZDogIiArIHRleHQpOwotCQkJCQkJT2JqZWN0IGRhdGEgPSB0Yy5nZXREYXRhKCk7Ci0JCQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFZpZXdlclNvcnRlcikgewotCQkJCQkJCUdlbmVyaWNTb3J0ZXIgc29ydGVyID0gKEdlbmVyaWNTb3J0ZXIpIGRhdGE7Ci0JCQkJCQkJc29ydGVyLnNvcnQoKTsKLQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBub3QgYSBzb3J0ZXIgKiogIiArIGRhdGEpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQljb2x1bW5zW2NvbE5vXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb2x1bW5MaXN0ZW5lcik7Ci0JCQljb2x1bW5MaXN0ZW5lcnNbY29sTm9dID0gY29sdW1uTGlzdGVuZXI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaG9va0NvbnRleHRNZW51KCkgewotCQlNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7Ci0JCW1lbnVNZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCVNpbXBsZVRyZWVUYWJsZU1hcmtlclZpZXcudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIHZpZXdlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZmlsbExvY2FsUHVsbERvd24oYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJZmlsbExvY2FsVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxQdWxsRG93bihJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChpbmZvQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQoZmlsdGVyQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVpciBhY3Rpb25zIGhlcmUKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiQWRkaXRpb25zIikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxUb29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGluZm9BY3Rpb24pOwotCQkvL21hbmFnZXIuYWRkKHJlbW92ZU1hcmtlckFjdGlvbik7IC8vIEJSVCBiYXJyaWVyTWFya2VyIC0gcHV0IHJlbW92ZSBtYXJrZXIgYWN0aW9uIGluIGhlcmUKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHRoZSBhY3Rpb24gb2JqZWN0cyBmb3IgdGhlIG1lbnVzIGFuZCB0b29sYmFyLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJbWFrZVNob3dJbmZvQWN0aW9uKCk7Ci0JCW1ha2VGaWx0ZXJBY3Rpb24oKTsKLQkJbWFrZURvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JCS8vbWFrZVJlbW92ZU1hcmtlckFjdGlvbigpOyAvLyBCUlQgYmFycmllck1hcmtlciByZW1vdmVNYXJrZXJBY3Rpb24KLQl9Ci0KLQkvKioKLQkgKiBNYWtlICJzaG93IGluZm8iIGFjdGlvbiB0byBkaXNwbGF5IGFydGlmYWN0IGluZm9ybWF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZVNob3dJbmZvQWN0aW9uKCkgewotCQlpbmZvQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSB0aGluZ25hbWVfICsgIiBpbmZvcm1hdGlvbiI7Ci0JCQkJaWYgKHNlbGVjdGVkTWFya2VyXyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpZEZyb21NYXJrZXIgPSAoU3RyaW5nKSBzZWxlY3RlZE1hcmtlcl8KLQkJCQkJCQkuZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXywgbnVsbCk7Ci0JCQkJCWlmIChpZEZyb21NYXJrZXIgPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiU1RUTVY6IGV4Y2VwdGlvbiByZWFkaW5nIG1hcmtlciBJRCIpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZ0J1ZmZlciBpbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCQkJCUlBcnRpZmFjdCBhcnRpZmFjdCA9IGFydGlmYWN0TWFuYWdlcl8KLQkJCQkJCQkuZ2V0QXJ0aWZhY3QoaWRGcm9tTWFya2VyKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuRmlsZSBuYW1lOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCWluZm8uYXBwZW5kKCJcbkxpbmUgbnVtYmVyOiAiKS5hcHBlbmQoYXJ0aWZhY3QuZ2V0TGluZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuTmFtZTogIikuYXBwZW5kKGFydGlmYWN0LmdldFNob3J0TmFtZSgpKTsKLQkJCQkJaW5mby5hcHBlbmQoIlxuRGVzY3JpcHRpb246ICIpLmFwcGVuZCgKLQkJCQkJCQlhcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpKTsKLQotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihudWxsLCB0aXRsZSwgaW5mby50b1N0cmluZygpKTsKLQkJCQl9Ly8gZW5kIGlmIHNlbGVjdGVkTWFya2VyIT1udWxsCi0JCQkJZWxzZSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsIHRpdGxlLCAiTm8gIgotCQkJCQkJCSsgdGhpbmduYW1lXyArICIgc2VsZWN0ZWQuIik7Ci0JCQkJfQotCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLQotCQkJfQotCQl9OwotCQlpbmZvQWN0aW9uLnNldFRleHQoIlNob3cgSW5mbyIpOwotCQlpbmZvQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJTaG93IGRldGFpbGVkIGluZm8gZm9yIHNlbGVjdGVkICIKLQkJCQkrIHRoaW5nbmFtZV8pOwotCQlpbmZvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGZpbHRlciBhY3Rpb24gKFRCRCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZUZpbHRlckFjdGlvbigpIHsKLQkJZmlsdGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzaG93TWVzc2FnZSgiRmlsdGVyICIgKyB0aGluZ25hbWVzXyArICJcbkRldGVybWluZSB3aGljaCAiCi0JCQkJCQkrIHRoaW5nbmFtZXNfICsgIiBhcmUgc2hvd24gaW4gdGhpcyB2aWV3LiIpOwotCQkJfQotCQl9OwotCQlmaWx0ZXJBY3Rpb24uc2V0VGV4dCgiRmlsdGVyICIgKyB0aGluZ25hbWVzXyk7Ci0JCWZpbHRlckFjdGlvbi5zZXRUb29sVGlwVGV4dCgiRmlsdGVyIHdoaWNoICIgKyB0aGluZ25hbWVzXwotCQkJCSsgIiBhcmUgc2hvd24gaW4gdGhpcyB2aWV3Iik7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBkb3VibGUtY2xpY2sgYWN0aW9uLCB3aGljaCBtb3ZlcyBlZGl0b3IgdG8gdGhlIGFydGlmYWN0IGluc3RhbmNlIGluCi0JICogdGhlIHNvdXJjZSBjb2RlIChlZGl0b3IgdG8gbGluZSBpbiBzb3VyY2UgY29kZSkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFrZURvdWJsZUNsaWNrQWN0aW9uKCkgewotCi0JCWRvdWJsZUNsaWNrQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCS8vIFRoaXMgYWN0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugb24gY2hpbGQgbm9kZXMgKG1hcmtlcnMpCi0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1hcmtlcikpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvYmo7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZpbGUgZiA9IChJRmlsZSkgbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBnZXRNYXJrZXJMaW5lTm8obWFya2VyKTsKLQkJCQkJaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSB3YnAgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJCQkJLy8gSUVkaXRvcklucHV0IGlldSA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZik7Ci0JCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcih3YnAsIGYpOwotCi0JCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRjYTogbWFya2VyIGxpbmVObyBiZWZvcmUgIgotCQkJCQkJCQkJKyBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpKTsKLQkJCQkJCS8vIG5vdGU6IChyZT8pIHNldHRpbmcgbGluZW51bWJlciBoZXJlIGlzIHJlcXVpcmVkIHRvCi0JCQkJCQkvLyBwdXQgbWFya2VyIGluIGVkaXRvciE/IQotCQkJCQkJTWFya2VyVXRpbGl0aWVzLnNldExpbmVOdW1iZXIobWFya2VyLCBsaW5lTm8pOwotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkY2E6IG1hcmtlciBsaW5lTm8gYWZ0ZXIgIgotCQkJCQkJCQkJKyBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcihtYXJrZXIpKTsKLQkJCQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJTVFRNVjogRG91YmxlQ2xpY2tBY3Rpb24sIGNsZWFyIHN0YXR1cyIpOwotCQkJCQkJc2hvd1N0YXR1c01lc3NhZ2UoIiIsICJkb3VibGUgY2xpY2sgYWN0aW9uIik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIlNUVE1WLmRvdWJsZWNsaWNrQWN0aW9uOiBFcnJvciBwb3NpdGlvbmluZyBlZGl0b3IgcGFnZSBmcm9tIG1hcmtlciBsaW5lIG51bWJlciIpOwotCQkJCQlzaG93U3RhdHVzTWVzc2FnZSgKLQkJCQkJCQkiRXJyb3IgcG9zaXRpb25pbmcgZWRpdG9yIGZyb20gbWFya2VyIGxpbmUgbnVtYmVyIiwKLQkJCQkJCQkiZXJyb3IgbWFya2VyIGdvdG8iKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb3VibGVDbGlja0FjdGlvbigpIHsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24odmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCXZpZXdOYW1lXywgbWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dTdGF0dXNNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVidWdNZXNzYWdlKSB7Ci0JCWlmICh0cmFjZVN0YXR1c0xpbmUpIHsKLQkJCW1lc3NhZ2UgKz0gIiAtICI7Ci0JCQltZXNzYWdlICs9IGRlYnVnTWVzc2FnZTsKLQkJfQotCQlnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkudXBkYXRlKHRydWUpOwotCi0JfQotCi0JLyoqCi0JICogUGFzc2luZyB0aGUgZm9jdXMgcmVxdWVzdCB0byB0aGUgdmlld2VyJ3MgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc2hvd1N0YXR1c01lc3NhZ2UoIiIsICJzZXRGb2N1cyIpOyAvLyByZXNldCBzdGF0dXMgbWVzc2FnZQotCQlpZiAoIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0cmFjZU9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTaW1wbGVUYWJsZVZpZXcuZGlzcG9zZSgpIik7Ci0JCS8vIEJSVCBkbyB3ZSBuZWVkIHRvIGRpc3Bvc2Ugb2YgaW1hZ2VEZXNjcmlwdG9ycyB3ZSBtYWRlPyBvciBqdXN0Ci0JCS8vIGltYWdlcz8KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dNYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJNYXJrZXItLS0tLS0tICBJTWFya2VyLkxJTkVfTlVNQkVSPSIKLQkJCQkrIElNYXJrZXIuTElORV9OVU1CRVIpOwotCQl0cnkgewotCQkJTWFwIGF0dHJzID0gbWFya2VyLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIiArIGUuZ2V0S2V5KCkgKyAiICIgKyBlLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBtYWtlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlVUkwgdXJsID0gdGhlUGx1Z2luXy5maW5kKG5ldyBQYXRoKGljb25OYW1lKSk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIGNoYW5nZSBpbmZvIChhcnRpZmFjdCBhbmQgbWFya2VyKSBvbnRvIGEgc3RhY2sgc28gd2UgY2FuIHJlbWVtYmVyCi0JICogaXQsIGZvciBwb3NzaWJsZSB1bmRvIGFjdGlvbi4gQWxzbyBlbmFibGVzL2Rpc2FibGVzIHRoZSBVbmRvIGFjdGlvbgotCSAqIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiBAcGFyYW0gbWFya2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENoYW5nZWRJbmZvKElBcnRpZmFjdCBhcnRpZmFjdCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJY2hhbmdlZEFydHNfLnB1c2goYXJ0aWZhY3QpOwotCQljaGFuZ2VkTWFya2Vyc18ucHVzaChtYXJrZXIpOwotCQljaGVja1VuZG9TdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc3RhdHVzIG9mIHVuZG8gYWN0aW9uIChlbmFibGVkIG9yIGRpc2FibGVkKSBiYXNlZCBvbiBpZiB0aGVyZSBhcmUgYW55Ci0JICogYXJ0aWZhY3QgY2hhbmdlcywgb3Igb3RoZXIgY2hhbmdlcywgYXZhaWxhYmxlIHRvIHVuZG8KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1VuZG9TdGF0dXMoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgbWFya2VyIGxpbmUgbnVtYmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWFya2VyTGluZU5vKElNYXJrZXIgbWFya2VyKSB7Ci0JCWludCBsaW5lTm8gPSBnZXRJbnRBdHRyKG1hcmtlciwgSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGludCB2YWx1ZSB0aGF0IGlzIGFzc3VtZWQgdG8gYmUgc3RvcmVkIGluIGEgbWFya2VyIGluIGEgZ2l2ZW4KLQkgKiBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUsIG9yIDAgaWYgbm9uZSBmb3VuZCwgb3IgaW52YWxpZCB2YWx1ZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SW50QXR0cihJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHIpIHsKLQkJU3RyaW5nIHRlbXAgPSBudWxsOwotCQl0cnkgewotCQkJdGVtcCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cikudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gQ29yZUV4Y2VwdGlvbiBvciBDbGFzc0Nhc3RFeGNlcHRpb24gcG9zc2libGUKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WOiBNYXJrZXIgbGluZU5vKCIgKyBhdHRyCi0JCQkJCSsgIikgaW52YWxpZDsgdXNpbmcgMCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGxpbmVObyA9IDA7Ci0JCXRyeSB7Ci0JCQlsaW5lTm8gPSBJbnRlZ2VyLnBhcnNlSW50KHRlbXApOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUVE1WOiBNYXJrZXIgbGluZU5vKCIgKyB0ZW1wICsgIiBmcm9tIGF0dHIgIgotCQkJCQkrIGF0dHIgKyAiKSBpbnZhbGlkIChOdW1iZXJGb3JtYXRFeGNlcHRpb24pOyB1c2luZyAwIik7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYXR0cmlidXRlIFN0cmluZyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHBhcmFtIGF0dHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogRXhjZXB0aW9uIGdldHRpbmcgbWFya2VyIGF0dHJpYnV0ZSAiICsgZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBNYWtlICJyZW1vdmUgbWFya2VyIiBhY3Rpb24gdG8gZGlzcGxheSByZW1vdmUgYmFycmllciBtYXJrZXJzIGFuZCBiYXJyaWVyIGVycm9yIG1hcmtlcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlUmVtb3ZlTWFya2VyQWN0aW9uKCkgewotCQlyZW1vdmVNYXJrZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIGJhdGNoIGNoYW5nZXMgc28gd2UgZ2V0IG9ubHkgb25lIHJlc291cmNlIGNoYW5nZSBldmVudAotCQkJCWZpbmFsIElXb3Jrc3BhY2VSb290IHdzUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCQotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbnQgZGVwdGggPSBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEU7Ci0JCQkJCQkJd3NSZXNvdXJjZS5kZWxldGVNYXJrZXJzKElEcy5iYXJyaWVyTWFya2VySUQsZmFsc2UsIGRlcHRoKTsKLQkJCQkJCQl3c1Jlc291cmNlLmRlbGV0ZU1hcmtlcnMoSURzLmVycm9yTWFya2VySUQsIGZhbHNlLCBkZXB0aCk7Ci0JCQkJCQkJaWYgKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJtYXJrZXJzIHJlbW92ZWQuIik7Ci0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RUTVY6IGV4Y2VwdGlvbiBkZWxldGluZyBCQVJSSUVSIG1hcmtlcnMuIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCQl0cnkgewotCQkJCQkJcnVubmFibGUucnVuKG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkKLQkJCQkgCi0JCQl9Ly9lbmQgcnVuKCkKLQkJfTsvLyBlbmQgbmV3IGFjdGlvbgotCQlyZW1vdmVNYXJrZXJBY3Rpb24uc2V0VGV4dCgiUmVtb3ZlIE1hcmtlcnMiKTsKLQkJcmVtb3ZlTWFya2VyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZW1vdmUgTWFya2VycyIpOwotCQlyZW1vdmVNYXJrZXJBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsvLyBuaWNlICJyZWQgWCIgaW1hZ2UKLQkKLQl9Ci0KLQkvKioKLQkgKiBhIFN0YWNrIHRoYXQgaXNuJ3QgYmFzZWQgb24gVmVjdG9yIC0gR2VuZXJpYyBMSUZPIHN0YWNrCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICogCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFN0YWNrTGlzdCB7Ci0JCXByaXZhdGUgTGlua2VkTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBwdXNoKE9iamVjdCB2KSB7Ci0JCQlsaXN0LmFkZEZpcnN0KHYpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCB0b3AoKSB7Ci0JCQlyZXR1cm4gbGlzdC5nZXRGaXJzdCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBwb3AoKSB7Ci0JCQlyZXR1cm4gbGlzdC5yZW1vdmVGaXJzdCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiBsaXN0LmlzRW1wdHkoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVmlzaXQgdGhlIHJlc291cmNlIGRlbHRhIHRvIGxvb2sgZm9yIHRoZSBtYXJrZXIgY2hhbmdlcyB3ZSBhcmUgaW50ZXJlc3RlZAotCSAqIGluCi0JICogCi0JICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0JICovCi0JcHVibGljIGNsYXNzIFVwZGF0ZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCS8qKgotCQkgKiBWaXNpdCBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgcmVzb3VyY2UgZGVsdGEgdG8gZmluZCB0aGUgbWFya2VycwotCQkgKiB0aGF0IGNoYW5nZWQgdGhhdCB3ZSBjYXJlIGFib3V0LgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXBkYXRlVmlzaXRvcjogZmlsZSBjaGFuZ2VkOiAiCi0JCQkJCQkJCSsgbmFtZSk7Ci0KLQkJCQkJLy8gSGFuZGxlIGZpbGUgY2hhbmdlcyAoc2F2ZXMpIGJ5IHJlcG9ydGluZyB0aGUgY2hhbmdlcwotCQkJCQkvLyBtYWRlIHRvIHRoZSBmaWxlLCB0byB1cGRhdGUgYmFja2VuZCBhbmFseXNpcwotCQkJCQkvLyByZXByZXNlbnRhdGlvbgotCQkJCQlJRmlsZSBmID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQkJaW50IGNvbnRlbnRDaGFuZ2VkID0gZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UOwotCi0JCQkJCWlmICh2YWxpZEZvckFuYWx5c2lzKGYuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkZpbGUgIgotCQkJCQkJCQkJCQkrIGYuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIiBpcyB2YWxpZCBmb3IgYW5hbHlzaXMgc28gd2lsbCBwcm9jZXNzIHRoZSBjaGFuZ2UuLi4iKTsKLQkJCQkJCWlmIChjb250ZW50Q2hhbmdlZCAhPSAwKSB7Ci0JCQkJCQkJLy8gZG8gd2UgbmVlZCB0byB0ZWxsIGJhY2sgZW5kIChhbmFseXNpcyBlbmdpbmUpCi0JCQkJCQkJLy8gdGhhdCBmaWxlIGNoYW5nZWQ/Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlZnJlc2ggbWFya2VycyBmb3IgdGhhdCBmaWxlPwotCQkJCQkJSU1hcmtlckRlbHRhW10gbURlbHRhcyA9IGRlbHRhLmdldE1hcmtlckRlbHRhcygpOwotCQkJCQkJaW50IGxlbiA9IG1EZWx0YXMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW47IGorKykgewotCQkJCQkJCUlNYXJrZXJEZWx0YSBkZWx0YTMgPSBtRGVsdGFzW2pdOwotCQkJCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJCQlzaG93TWFya2VyRGVsdGFLaW5kKGRlbHRhMyk7Ci0JCQkJCQkJSU1hcmtlciBtID0gZGVsdGEzLmdldE1hcmtlcigpOwotCQkJCQkJCVN0cmluZyBsbiA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0JCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiLS0tVXBkYXRlVmlzaXRvci52aXNpdCgpOnZpZXdlciB1cGRhdGUgbWFya2VyOiAobGluZU5vKSIpOwotCQkJCQkJCS8vIHNob3dNYXJrZXIobSk7Ci0JCQkJCQkJU3RyaW5nW10gcHJvcHMgPSBuZXcgU3RyaW5nWzFdOyAvLyBhd2t3YXJkLiB3aHk/Pz8KLQkJCQkJCQlwcm9wc1swXSA9IGxuOwotCQkJCQkJCS8vIGp1c3QgdXBkYXRlIHZpZXdlciBpdGVtLCBub3QgdGhlIHdob2xlIHZpZXcKLQkJCQkJCQkvLyB2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCXZpZXdlci51cGRhdGUobSwgcHJvcHMpOwotCQkJCQkJfSAvLyBlbmQgbG9vcAotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkZpbGUgIgotCQkJCQkJCQkJCQkrIGYuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIiBpcyBOT1QgdmFsaWQgZm9yIGFuYWx5c2lzIHNvIHdpbGwgaWdub3JlIGNoYW5nZS4uLiIpOwotCi0JCQkJCX0KLQkJCQl9IC8vIGVuZCBpZiBDSEFOR0VECi0JCQkJZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBhZGRlZC4iKTsKLQkJCQkJY2hlY2tNYXJrZXJEZWx0YXMoZGVsdGEpOwotCQkJCX0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSByZXBsYWNlZC4iKTsKLQkJCQkJY2hlY2tNYXJrZXJEZWx0YXMoZGVsdGEpOwotCQkJCX0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIHJlbW92ZWQuIik7Ci0JCQkJCWNoZWNrTWFya2VyRGVsdGFzKGRlbHRhKTsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBpZiBGSUxFCi0JCQlyZXR1cm4gdHJ1ZTsgLy8ga2VlcCBnb2luZwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrTWFya2VyRGVsdGFzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlJTWFya2VyRGVsdGFbXSBtZDEgPSBkZWx0YS5nZXRNYXJrZXJEZWx0YXMoKTsKLQkJCWludCBsZW4gPSBtZDEubGVuZ3RoOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAuLi4gZm91bmQgIiArIGxlbiArICIgbWFya2VyRGVsdGFzLiIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNob3cgaW5mbyBhYm91dCB0aGUgbWFya2VyIGluIHRoZSBtYXJrZXIgZGVsdGEuIFRoaXMgaXMganVzdCB0cmFjaW5nCi0JCSAqIHRoZSBpbmZvIGF2YWlsYWJsZSB1bnRpbCB3ZSBkbyBzb21ldGhpbmcgd2l0aCBpdC4gRm9yIG5vdywgd2UncmUganVzdAotCQkgKiBkb2luZyBhIChiaWcpIHZpZXdlci5yZWZyZXNoKCkgdG8gcmVmcmVzaCBhbGwgdGhlIG1hcmtlcnMuIFdoZW4gd2UKLQkJICogZ2V0IG1vcmUgaW50ZWxsaWdlbnQgYWJvdXQganVzdCB1cGRhdGluZyB0aGUgb25lcyB0aGF0IGNoYW5nZWQsIHdlCi0JCSAqIGNhbiByZW1vdmUgdGhhdC4gU2hvdWxkbid0IG1ha2UgbXVjaCBkaWZmZXJlbnQgZm9yIHNtYWxsIHNldHMgb2YKLQkJICogbWFya2VycywgYnV0IGZvciBtYW55IG1hcmtlcnMsIHRoaXMgY291bGQgYmUgYSBzaWduaWZpY2FudAotCQkgKiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBkZWx0YTMKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzaG93TWFya2VyRGVsdGFLaW5kKElNYXJrZXJEZWx0YSBkZWx0YTMpIHsKLQotCQkJLy8gaW50IG1kS2luZCA9IGRlbHRhMy5nZXRLaW5kKCk7Ci0JCQlJTWFya2VyIG0gPSBkZWx0YTMuZ2V0TWFya2VyKCk7Ci0KLQkJCVN0cmluZyBraW5kID0gIlVOS05PV04iOwotCQkJc3dpdGNoIChkZWx0YTMuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCWtpbmQgPSAiQURERUQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCWtpbmQgPSAiQ0hBTkdFRCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJa2luZCA9ICJSRU1PVkVEIjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJa2luZCA9ICJVTktOT1dOIjsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgbWFya2VyRGVsdGFLaW5kPSIgKyBraW5kKTsKLQkJCVN0cmluZyBtaWQgPSAiIiwgbWwgPSAiIiwgbWxwaSA9ICIiOwotCQkJdHJ5IHsKLQkJCQkvLyBub3RlOiB3ZSdyZSBnZXR0aW5nIG1hcmtlciBkZWx0YXMgb24gQUxMIG1hcmtlcnMsCi0JCQkJLy8gbm90IGp1c3QgYXJ0aWZhY3QgbWFya2Vycywgd2hpY2ggY2FuIHRocm93IHVzIG9mZi4KLQkJCQkvLyBpbiBwYXJ0aWN1bGFyLCB0ZW1wIG1hcmtlcnMgdXNlZCBieSBhY3Rpb25zPwotCi0JCQkJbWlkID0gbS5nZXRBdHRyaWJ1dGUodW5pcXVlSURfKS50b1N0cmluZygpOwotCQkJCW1sID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUikudG9TdHJpbmcoKTsKLQkJCQkvLyBtbHBpID0gbS5nZXRBdHRyaWJ1dGUoSURzLkxJTkUpLnRvU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBpZ25vcmUgZXJyb3JzOyBvbmx5IHRyYWNpbmcgZm9yIG5vdy4KLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiU1RUTVYuVXBkYXRlVmlzaXRvciBlcnJvciBnZXR0aW5nIG1hcmtlciBpbmZvIGZvciBjaGFuZ2UgdHlwZTogIgotCQkJCQkJCQkrIGtpbmQpOwotCQkJCS8vIGUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgbWFya2VySURfPSIgKyBtaWQKLQkJCQkJCSsgIiAgbGluZU5vKG1rci1tcGlBKT0iICsgbWwgKyAiLSIgKyBtbHBpKTsKLQkJfQotCi0JfSAvLyBlbmQgY2xhc3MgVXBkYXRlVmlzaXRvcgotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS8uY2xhc3NwYXRoIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvLmN2c2lnbm9yZSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3MzQ4NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotaWNvbnMtb2xkCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLy5wcm9qZWN0IGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxMzk5OC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjAwYzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5hbmFseXNpcywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5lZGl0b3JIZWxwLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnByZWZzLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnZpZXdzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5zZWFyY2gsCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS5jZHQuZG9jLnVzZXIsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9hYm91dC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhlMGQzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIG1waXJlZi54bWwsXAotICAgICAgICAgICAgICAgc2FtcGxlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLwotc3JjLmluY2x1ZGVzID0gaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIG1waXJlZi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzYW1wbGVzLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWJvcnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWJvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmMDNmMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0Fib3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQWJvcnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0Fib3J0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0Fib3J0KE1QSV9Db21tLCBpbnQpOwotPC9QUkU+Ci08REw+PEREPgotRm9yY2VzIGFsbCB0YXNrcyBvZiBhbiBNUEkgam9iIHRvIHRlcm1pbmF0ZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FjY3VtdWxhdGUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWNjdW11bGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdhY2QxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWNjdW11bGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FjY3VtdWxhdGU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0FjY3VtdWxhdGU8L0gzPgotPFBSRT4KLWludCBNUElfQWNjdW11bGF0ZSh2b2lkICosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIE1QSV9BaW50LCBpbnQsIE1QSV9EYXRhdHlwZSwgIE1QSV9PcCwgTVBJX1dpbik7Ci08L1BSRT4KLTxETD48REQ+Ci1BY2N1bXVsYXRlcywgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcmVkdWN0aW9uIG9wZXJhdGlvbiwgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW4gYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGJ1ZmZlci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FkZF9lcnJvcl9jbGFzcy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BZGRfZXJyb3JfY2xhc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlYjM5Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FkZF9lcnJvcl9jbGFzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FkZF9lcnJvcl9jbGFzczwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQWRkX2Vycm9yX2NsYXNzPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0FkZF9lcnJvcl9jbGFzcyhpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgbmV3IGVycm9yIGNsYXNzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgaXQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BZGRfZXJyb3JfY29kZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BZGRfZXJyb3JfY29kZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzkyOGJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWRkX2Vycm9yX2NvZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9BZGRfZXJyb3JfY29kZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQWRkX2Vycm9yX2NvZGU8L0gzPgotPFBSRT4KLWludCBNUElfQWRkX2Vycm9yX2NvZGUoaW50LCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgbmV3IGVycm9yIGNvZGUgYW5kIHJldHVybnMgdGhlIHZhbHVlIGZvciBpdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FkZF9lcnJvcl9zdHJpbmcuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWRkX2Vycm9yX3N0cmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGU5ZmUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWRkX2Vycm9yX3N0cmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FkZF9lcnJvcl9zdHJpbmc8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0FkZF9lcnJvcl9zdHJpbmc8L0gzPgotPFBSRT4KLWludCBNUElfQWRkX2Vycm9yX3N0cmluZyhpbnQsIGNoYXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1Bc3NvY2lhdGVzIGFuIGVycm9yIHN0cmluZyB3aXRoIGFuIGVycm9yIGNvZGUgb3IgY2xhc3MuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BZGRyZXNzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FkZHJlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5N2ZjOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FkZHJlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9BZGRyZXNzPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9BZGRyZXNzPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0FkZHJlc3Modm9pZCosIE1QSV9BaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIGxvY2F0aW9uIGluIG1lbW9yeS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbGdhdGhlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGxnYXRoZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMzNmNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbGdhdGhlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FsbGdhdGhlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQWxsZ2F0aGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0FsbGdhdGhlcih2b2lkKiAsIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLUNvbGxlY3RzIG1lc3NhZ2VzIGZyb20gZWFjaCB0YXNrIGFuZCBkaXN0cmlidXRlcyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgdG8gZWFjaC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbGdhdGhlcnYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWxsZ2F0aGVydi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk4MzEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWxsZ2F0aGVydi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FsbGdhdGhlcnY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0FsbGdhdGhlcnY8L0gzPgotPFBSRT4KLWludCBNUElfQWxsZ2F0aGVydih2b2lkKiAsIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50ICosIGludCAqLCBNUElfRGF0YXR5cGUsIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLUNvbGxlY3RzIG1lc3NhZ2VzIGZyb20gZWFjaCB0YXNrIGFuZCBkaXN0cmlidXRlcyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgdG8gYWxsIHRhc2tzLiBNZXNzYWdlcyBjYW4gaGF2ZSB2YXJpYWJsZSBzaXplcyBhbmQgZGlzcGxhY2VtZW50cy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbG9jX21lbS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGxvY19tZW0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwNDRiMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbG9jX21lbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FsbG9jX21lbTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQWxsb2NfbWVtPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0FsbG9jX21lbShNUElfQWludCwgTVBJX0luZm8gaW5mbywgdm9pZCAqYmFzZXB0cik7Ci08L1BSRT4KLTxETD48REQ+Ci1BbGxvY2F0ZXMgc3RvcmFnZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGxyZWR1Y2UuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWxscmVkdWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTZjYmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGxyZWR1Y2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9BbGxyZWR1Y2U8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0FsbHJlZHVjZTwvSDM+Ci08UFJFPgotaW50IE1QSV9BbGxyZWR1Y2Uodm9pZCogLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9PcCwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotQXBwbGllcyBhIHJlZHVjdGlvbiBvcGVyYXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGx0b2FsbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGx0b2FsbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY3M2IzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWxsdG9hbGwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9BbGx0b2FsbDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQWxsdG9hbGw8L0gzPgotPFBSRT4KLWludCBNUElfQWxsdG9hbGwodm9pZCogLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfQ29tbSk7Ci08L1BSRT4KLTxETD48REQ+Ci1TZW5kcyBhIGRpc3RpbmN0IG1lc3NhZ2UgZnJvbSBlYWNoIHRhc2sgdG8gZXZlcnkgdGFzay4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbHRvYWxsdi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGx0b2FsbHYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1OTk1MS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0FsbHRvYWxsdi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0FsbHRvYWxsdjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQWxsdG9hbGx2PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0FsbHRvYWxsdih2b2lkKiAsIGludCAqLCBpbnQgKiwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50ICosIGludCAqLCBNUElfRGF0YXR5cGUsIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLVNlbmRzIGEgZGlzdGluY3QgbWVzc2FnZSBmcm9tIGVhY2ggdGFzayB0byBldmVyeSB0YXNrLiBNZXNzYWdlcyBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGRpc3BsYWNlbWVudHMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGx0b2FsbHcuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQWxsdG9hbGx3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTEwNmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BbGx0b2FsbHcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9BbGx0b2FsbHc8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0FsbHRvYWxsdzwvSDM+Ci08UFJFPgotaW50IE1QSV9BbGx0b2FsbHcodm9pZCAqLCBpbnQgW10sIGludCBbXSwgTVBJX0RhdGF0eXBlIFtdLCB2b2lkICosIGludCBbXSwgaW50IFtdLCBNUElfRGF0YXR5cGUgW10sIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLVNlbmRzIGEgZGlzdGluY3QgbWVzc2FnZSBmcm9tIGVhY2ggdGFzayB0byBldmVyeSB0YXNrLiBNZXNzYWdlcyBjYW4gaGF2ZSBkaWZmZXJlbnQgZGF0YXR5cGVzLCBzaXplcywgYW5kIGRpc3BsYWNlbWVudHMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BdHRyX2RlbGV0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9BdHRyX2RlbGV0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U0NzQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQXR0cl9kZWxldGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9BdHRyX2RlbGV0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQXR0cl9kZWxldGU8L0gzPgotPFBSRT4KLWludCBNUElfQXR0cl9kZWxldGUoTVBJX0NvbW0sIGludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1SZW1vdmVzIGFuIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQXR0cl9nZXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQXR0cl9nZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3ZmFmOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0F0dHJfZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQXR0cl9nZXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0F0dHJfZ2V0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0F0dHJfZ2V0KE1QSV9Db21tLCBpbnQsIHZvaWQgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0cmlldmVzIGFuIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQXR0cl9wdXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQXR0cl9wdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlYzExZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0F0dHJfcHV0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQXR0cl9wdXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0F0dHJfcHV0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0F0dHJfcHV0KE1QSV9Db21tLCBpbnQsIHZvaWQqKTsKLTwvUFJFPgotPERMPjxERD4KLUFzc29jaWF0ZXMgYW4gYXR0cmlidXRlIHZhbHVlIHdpdGggYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9CYXJyaWVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0JhcnJpZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlOWM3Yi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0JhcnJpZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9CYXJyaWVyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9CYXJyaWVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0JhcnJpZXIoTVBJX0NvbW0gKTsKLTwvUFJFPgotPERMPjxERD4KLUJsb2NrcyBlYWNoIHRhc2sgdW50aWwgYWxsIHRhc2tzIGhhdmUgY2FsbGVkIGl0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQmNhc3QuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQmNhc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMzcyZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0JjYXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQmNhc3Q8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0JjYXN0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0JjYXN0KHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBNUElfQ29tbSApOwotPC9QUkU+Ci08REw+PEREPgotQnJvYWRjYXN0cyBhIG1lc3NhZ2UgZnJvbSByb290IHRvIGFsbCB0YXNrcyBpbiB0aGUgZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Cc2VuZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Cc2VuZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ2N2Q0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQnNlbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Cc2VuZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQnNlbmQ8L0gzPgotPFBSRT4KLWludCBNUElfQnNlbmQodm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotUGVyZm9ybXMgYSBibG9ja2luZyBidWZmZXJlZCBtb2RlIHNlbmQgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQnNlbmRfaW5pdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Cc2VuZF9pbml0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjEzYWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Cc2VuZF9pbml0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQnNlbmRfaW5pdDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQnNlbmRfaW5pdDwvSDM+Ci08UFJFPgotaW50IE1QSV9Cc2VuZF9pbml0KHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LGludCwgTVBJX0NvbW0sIE1QSV9SZXF1ZXN0ICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIHBlcnNpc3RlbnQgYnVmZmVyZWQgbW9kZSBzZW5kIHJlcXVlc3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9CdWZmZXJfYXR0YWNoLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0J1ZmZlcl9hdHRhY2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1YmZjMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0J1ZmZlcl9hdHRhY2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9CdWZmZXJfYXR0YWNoPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9CdWZmZXJfYXR0YWNoPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0J1ZmZlcl9hdHRhY2goIHZvaWQqLCBpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUHJvdmlkZXMgTVBJIHdpdGggYSBtZXNzYWdlIGJ1ZmZlciBmb3Igc2VuZGluZy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0J1ZmZlcl9kZXRhY2guaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQnVmZmVyX2RldGFjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTRhOWI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQnVmZmVyX2RldGFjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0J1ZmZlcl9kZXRhY2g8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0J1ZmZlcl9kZXRhY2g8L0gzPgotPFBSRT4KLWludCBNUElfQnVmZmVyX2RldGFjaCggdm9pZCosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLURldGFjaGVzIHRoZSBjdXJyZW50IGJ1ZmZlci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhbmNlbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYW5jZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1ZWIyOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhbmNlbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NhbmNlbDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ2FuY2VsPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NhbmNlbChNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLU1hcmtzIGEgbm9uLWJsb2NraW5nIG9wZXJhdGlvbiBmb3IgY2FuY2VsbGF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydF9jb29yZHMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydF9jb29yZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzYmE0OC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhcnRfY29vcmRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ2FydF9jb29yZHM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NhcnRfY29vcmRzPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NhcnRfY29vcmRzKE1QSV9Db21tLCBpbnQsIGludCwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotVHJhbnNsYXRlcyB0YXNrIHJhbmsgaW4gYSBjb21tdW5pY2F0b3IgaW50byBDYXJ0ZXNpYW4gdGFzayBjb29yZGluYXRlcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhcnRfY3JlYXRlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhcnRfY3JlYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDcwZTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X2NyZWF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NhcnRfY3JlYXRlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9DYXJ0X2NyZWF0ZTwvSDM+Ci08UFJFPgotaW50IE1QSV9DYXJ0X2NyZWF0ZShNUElfQ29tbSwgaW50LCBpbnQgKiwgaW50ICosIGludCwgTVBJX0NvbW0gKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgY29tbXVuaWNhdG9yIGNvbnRhaW5pbmcgdG9wb2xvZ3kgaW5mb3JtYXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X2dldC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X2dldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTBlZjViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydF9nZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9DYXJ0X2dldDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ2FydF9nZXQ8L0gzPgotPFBSRT4KLWludCBNUElfQ2FydF9nZXQoTVBJX0NvbW0sIGludCwgaW50ICosIGludCAqLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXRyaWV2ZXMgQ2FydGVzaWFuIHRvcG9sb2d5IGluZm9ybWF0aW9uIGZyb20gYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X21hcC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X21hcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2E3ZTc1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydF9tYXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9DYXJ0X21hcDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ2FydF9tYXA8L0gzPgotPFBSRT4KLWludCBNUElfQ2FydF9tYXAoTVBJX0NvbW0sIGludCwgaW50ICosIGludCAqLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1Db21wdXRlcyBwbGFjZW1lbnQgb2YgdGFza3Mgb24gdGhlIHBoeXNpY2FsIHByb2Nlc3Nvci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhcnRfcmFuay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X3JhbmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1N2QyNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhcnRfcmFuay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NhcnRfcmFuazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ2FydF9yYW5rPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NhcnRfcmFuayhNUElfQ29tbSwgaW50ICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVRyYW5zbGF0ZXMgdGFzayBjb29yZGluYXRlcyBpbnRvIGEgdGFzayByYW5rLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydF9zaGlmdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X3NoaWZ0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjRiMzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X3NoaWZ0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ2FydF9zaGlmdDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ2FydF9zaGlmdDwvSDM+Ci08UFJFPgotaW50IE1QSV9DYXJ0X3NoaWZ0KE1QSV9Db21tLCBpbnQsIGludCwgaW50ICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgc2hpZnRlZCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJhbmtzIGZvciBhIHRhc2suCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X3N1Yi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9DYXJ0X3N1Yi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZiNzYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydF9zdWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9DYXJ0X3N1YjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ2FydF9zdWI8L0gzPgotPFBSRT4KLWludCBNUElfQ2FydF9zdWIoTVBJX0NvbW0sIGludCAqLCBNUElfQ29tbSAqKTsKLTwvUFJFPgotPERMPjxERD4KLVBhcnRpdGlvbnMgYSBDYXJ0ZXNpYW4gY29tbXVuaWNhdG9yIGludG8gbG93ZXItZGltZW5zaW9uYWwgc3ViZ3JvdXBzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydGRpbV9nZXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ2FydGRpbV9nZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZGEzMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NhcnRkaW1fZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ2FydGRpbV9nZXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NhcnRkaW1fZ2V0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NhcnRkaW1fZ2V0KE1QSV9Db21tLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBDYXJ0ZXNpYW4gZGltZW5zaW9ucyBmcm9tIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jMmYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jMmYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiMWNhNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fYzJmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9jMmY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fYzJmPC9IMz4KLTxQUkU+Ci1NUElfRmludCBNUElfQ29tbV9jMmYoTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotVHJhbnNsYXRlcyBhIEMgY29tbXVuaWNhdG9yIGhhbmRsZSBpbnRvIGEgRk9SVFJBTiBoYW5kbGUgdG8gdGhlIHNhbWUgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jYWxsX2VycmhhbmRsZXIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jYWxsX2VycmhhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNDQ1NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fY2FsbF9lcnJoYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9jYWxsX2VycmhhbmRsZXI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fY2FsbF9lcnJoYW5kbGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fY2FsbF9lcnJoYW5kbGVyKE1QSV9Db21tLCBpbnQpOwotPC9QUkU+Ci08REw+PEREPgotQ2FsbHMgdGhlIGVycm9yIGhhbmRsZXIgYXNzaWduZWQgdG8gdGhlIGNvbW11bmljYXRvciB3aXRoIHRoZSBlcnJvciBjb2RlIHN1cHBsaWVkLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jb21wYXJlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fY29tcGFyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTliMDY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jb21wYXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9jb21wYXJlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX2NvbXBhcmU8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9jb21wYXJlKE1QSV9Db21tLCBNUElfQ29tbSwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotQ29tcGFyZXMgdGhlIGdyb3VwcyBhbmQgY29udGV4dHMgb2YgdHdvIGNvbW11bmljYXRvcnMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2NyZWF0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2NyZWF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTExN2E5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jcmVhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2NyZWF0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9jcmVhdGU8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9jcmVhdGUoTVBJX0NvbW0sIE1QSV9Hcm91cCwgTVBJX0NvbW0gKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgbmV3IGNvbW11bmljYXRvciB3aXRoIGEgZ2l2ZW4gZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2NyZWF0ZV9lcnJoYW5kbGVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2OGVlNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2NyZWF0ZV9lcnJoYW5kbGVyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX2NyZWF0ZV9lcnJoYW5kbGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXIoTVBJX0NvbW1fZXJyaGFuZGxlcl9mbiAqLCBNUElfRXJyaGFuZGxlciAqKTsKLTwvUFJFPgotPERMPjxERD4KLUNyZWF0ZXMgYW4gZXJyb3IgaGFuZGxlciB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBjb21tdW5pY2F0b3JzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jcmVhdGVfa2V5dmFsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fY3JlYXRlX2tleXZhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIxYjQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9jcmVhdGVfa2V5dmFsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9jcmVhdGVfa2V5dmFsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX2NyZWF0ZV9rZXl2YWw8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9jcmVhdGVfa2V5dmFsKE1QSV9Db21tX2NvcHlfYXR0cl9mdW5jdGlvbiAqLCBNUElfQ29tbV9kZWxldGVfYXR0cl9mdW5jdGlvbiAqLCBpbnQgKiwgdm9pZCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUdlbmVyYXRlcyBhIG5ldyBjb21tdW5pY2F0b3IgYXR0cmlidXRlIGtleS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZGVsZXRlX2F0dHIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9kZWxldGVfYXR0ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTk4MTdhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9kZWxldGVfYXR0ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NvbW1fZGVsZXRlX2F0dHI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fZGVsZXRlX2F0dHI8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9kZWxldGVfYXR0cihNUElfQ29tbSwgaW50KTsKLTwvUFJFPgotPERMPjxERD4KLVJlbW92ZXMgYW4gYXR0cmlidXRlIHZhbHVlIGZyb20gYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2R1cC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2R1cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE5YmNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9kdXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2R1cDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9kdXA8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9kdXAoTVBJX0NvbW0sIE1QSV9Db21tICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIG5ldyBjb21tdW5pY2F0b3IgdGhhdCBpcyBhIGR1cGxpY2F0ZSBvZiBhbiBleGlzdGluZyBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2YyYy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2YyYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmYyYjRiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9mMmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2YyYzwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9mMmM8L0gzPgotPFBSRT4KLU1QSV9Db21tIE1QSV9Db21tX2YyYyhNUElfRmludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIGEgQyBoYW5kbGUgdG8gYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2ZyZWUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9mcmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGUyNTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2ZyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2ZyZWU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fZnJlZTwvSDM+Ci08UFJFPgotaW50IE1QSV9Db21tX2ZyZWUoTVBJX0NvbW0gKik7Ci08L1BSRT4KLTxETD48REQ+Ci1NYXJrcyBhIGNvbW11bmljYXRvciBmb3IgZGVhbGxvY2F0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9mcmVlX2tleXZhbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2ZyZWVfa2V5dmFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDYwZmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2ZyZWVfa2V5dmFsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9mcmVlX2tleXZhbDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9mcmVlX2tleXZhbDwvSDM+Ci08UFJFPgotaW50IE1QSV9Db21tX2ZyZWVfa2V5dmFsKGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLU1hcmtzIGEgY29tbXVuaWNhdG9yIGF0dHJpYnV0ZSBrZXkgZm9yIGRlYWxsb2NhdGlvbi4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZ2V0X2F0dHIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9nZXRfYXR0ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkwZGVkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9nZXRfYXR0ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NvbW1fZ2V0X2F0dHI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fZ2V0X2F0dHI8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9nZXRfYXR0cihNUElfQ29tbSwgaW50LCB2b2lkICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHJpZXZlcyB0aGUgY29tbXVuaWNhdG9yIGF0dHJpYnV0ZSB2YWx1ZSBpZGVudGlmaWVkIGJ5IHRoZSBrZXkuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2dldF9lcnJoYW5kbGVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZ2V0X2VycmhhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkMTgxMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZ2V0X2VycmhhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2dldF9lcnJoYW5kbGVyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX2dldF9lcnJoYW5kbGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fZ2V0X2VycmhhbmRsZXIoTVBJX0NvbW0sIE1QSV9FcnJoYW5kbGVyICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0cmlldmVzIHRoZSBlcnJvciBoYW5kbGVyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX2dldF9uYW1lLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZ2V0X25hbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzN2M2NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZ2V0X25hbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX2dldF9uYW1lPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX2dldF9uYW1lPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fZ2V0X25hbWUoTVBJX0NvbW0sIGNoYXIgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgbmFtZSB0aGF0IHdhcyBsYXN0IGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRvci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fZ3JvdXAuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9ncm91cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRmZjdiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9ncm91cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NvbW1fZ3JvdXA8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fZ3JvdXA8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9ncm91cChNUElfQ29tbSwgTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgZ3JvdXAgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRvci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fcmFuay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3JhbmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjOTJiNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fcmFuay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NvbW1fcmFuazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9yYW5rPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fcmFuayhNUElfQ29tbSwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgcmFuayBvZiB0aGUgbG9jYWwgdGFzayBpbiB0aGUgZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9yZW1vdGVfZ3JvdXAuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9yZW1vdGVfZ3JvdXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhOWJhNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fcmVtb3RlX2dyb3VwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9yZW1vdGVfZ3JvdXA8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fcmVtb3RlX2dyb3VwPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fcmVtb3RlX2dyb3VwKE1QSV9Db21tLCBNUElfR3JvdXAgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIHJlbW90ZSBncm91cCBvZiBhbiBpbnRlci1jb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3JlbW90ZV9zaXplLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fcmVtb3RlX3NpemUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0OWIxMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fcmVtb3RlX3NpemUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX3JlbW90ZV9zaXplPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX3JlbW90ZV9zaXplPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fcmVtb3RlX3NpemUoTVBJX0NvbW0sIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlbW90ZSBncm91cCBvZiBhbiBpbnRlci1jb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NldF9hdHRyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fc2V0X2F0dHIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5NTcwZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fc2V0X2F0dHIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX3NldF9hdHRyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Db21tX3NldF9hdHRyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0NvbW1fc2V0X2F0dHIoTVBJX0NvbW0sIGludCwgdm9pZCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUF0dGFjaGVzIHRoZSBjb21tdW5pY2F0b3IgYXR0cmlidXRlIHZhbHVlIHRvIHRoZSBjb21tdW5pY2F0b3IgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUga2V5LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9zZXRfZXJyaGFuZGxlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NldF9lcnJoYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWFiNzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NldF9lcnJoYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9zZXRfZXJyaGFuZGxlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9zZXRfZXJyaGFuZGxlcjwvSDM+Ci08UFJFPgotaW50IE1QSV9Db21tX3NldF9lcnJoYW5kbGVyKE1QSV9Db21tLCBNUElfRXJyaGFuZGxlcik7Ci08L1BSRT4KLTxETD48REQ+Ci1BdHRhY2hlcyBhIG5ldyBlcnJvciBoYW5kbGVyIHRvIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9zZXRfbmFtZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NldF9uYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZGY4ZGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NldF9uYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfQ29tbV9zZXRfbmFtZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfQ29tbV9zZXRfbmFtZTwvSDM+Ci08UFJFPgotaW50IE1QSV9Db21tX3NldF9uYW1lKE1QSV9Db21tLCBjaGFyICopOwotPC9QUkU+Ci08REw+PEREPgotQXNzb2NpYXRlcyBhIG5hbWUgc3RyaW5nIHdpdGggYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NpemUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9zaXplLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjBiNjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3NpemUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX3NpemU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fc2l6ZTwvSDM+Ci08UFJFPgotaW50IE1QSV9Db21tX3NpemUoTVBJX0NvbW0sIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIHNpemUgb2YgdGhlIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRvci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0NvbW1fc3BsaXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9zcGxpdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RjYmE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV9zcGxpdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0NvbW1fc3BsaXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fc3BsaXQ8L0gzPgotPFBSRT4KLWludCBNUElfQ29tbV9zcGxpdChNUElfQ29tbSwgaW50LCBpbnQsIE1QSV9Db21tICopOwotPC9QUkU+Ci08REw+PEREPgotU3BsaXRzIGEgY29tbXVuaWNhdG9yIGludG8gbXVsdGlwbGUgY29tbXVuaWNhdG9ycyBiYXNlZCBvbiBjb2xvciBhbmRrZXkuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3Rlc3RfaW50ZXIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfQ29tbV90ZXN0X2ludGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZjY5M2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Db21tX3Rlc3RfaW50ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Db21tX3Rlc3RfaW50ZXI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0NvbW1fdGVzdF9pbnRlcjwvSDM+Ci08UFJFPgotaW50IE1QSV9Db21tX3Rlc3RfaW50ZXIoTVBJX0NvbW0sIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIHR5cGUgb2YgYSBjb21tdW5pY2F0b3IgKGludHJhLWNvbW11bmljYXRvciBvciBpbnRlci1jb21tdW5pY2F0b3IpLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRGltc19jcmVhdGUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRGltc19jcmVhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwOWQyYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0RpbXNfY3JlYXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRGltc19jcmVhdGU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0RpbXNfY3JlYXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0RpbXNfY3JlYXRlKGludCwgaW50LCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1EZWZpbmVzIGEgQ2FydGVzaWFuIGdyaWQgdG8gYmFsYW5jZSB0YXNrcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0VycmhhbmRsZXJfY3JlYXRlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0VycmhhbmRsZXJfY3JlYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDg3NDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9FcnJoYW5kbGVyX2NyZWF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0VycmhhbmRsZXJfY3JlYXRlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9FcnJoYW5kbGVyX2NyZWF0ZTwvSDM+Ci08UFJFPgotaW50IE1QSV9FcnJoYW5kbGVyX2NyZWF0ZShNUElfSGFuZGxlcl9mdW5jdGlvbiAqLCBNUElfRXJyaGFuZGxlciAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJlZ2lzdGVycyBhIHVzZXItZGVmaW5lZCBlcnJvciBoYW5kbGVyLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyaGFuZGxlcl9mcmVlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0VycmhhbmRsZXJfZnJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDUzODkyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyaGFuZGxlcl9mcmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRXJyaGFuZGxlcl9mcmVlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9FcnJoYW5kbGVyX2ZyZWU8L0gzPgotPFBSRT4KLWludCBNUElfRXJyaGFuZGxlcl9mcmVlKE1QSV9FcnJoYW5kbGVyICopOwotPC9QUkU+Ci08REw+PEREPgotTWFya3MgYW4gZXJyb3IgaGFuZGxlciBmb3IgZGVhbGxvY2F0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyaGFuZGxlcl9nZXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyaGFuZGxlcl9nZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3YmI5NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0VycmhhbmRsZXJfZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRXJyaGFuZGxlcl9nZXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0VycmhhbmRsZXJfZ2V0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0VycmhhbmRsZXJfZ2V0KE1QSV9Db21tLCBNUElfRXJyaGFuZGxlciAqKTsKLTwvUFJFPgotPERMPjxERD4KLUdldHMgYW4gZXJyb3IgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggYSBjb21tdW5pY2F0b3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9FcnJoYW5kbGVyX3NldC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9FcnJoYW5kbGVyX3NldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmRmMjliLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyaGFuZGxlcl9zZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9FcnJoYW5kbGVyX3NldDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRXJyaGFuZGxlcl9zZXQ8L0gzPgotPFBSRT4KLWludCBNUElfRXJyaGFuZGxlcl9zZXQoTVBJX0NvbW0sIE1QSV9FcnJoYW5kbGVyKTsKLTwvUFJFPgotPERMPjxERD4KLUFzc29jaWF0ZXMgYSBuZXcgZXJyb3IgaGFuZGxlciB3aXRoIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyb3JfY2xhc3MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyb3JfY2xhc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlM2M5MS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0Vycm9yX2NsYXNzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRXJyb3JfY2xhc3M8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0Vycm9yX2NsYXNzPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0Vycm9yX2NsYXNzKGludCwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgZXJyb3IgY2xhc3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9FcnJvcl9zdHJpbmcuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXJyb3Jfc3RyaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YmY4YzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9FcnJvcl9zdHJpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9FcnJvcl9zdHJpbmc8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0Vycm9yX3N0cmluZzwvSDM+Ci08UFJFPgotaW50IE1QSV9FcnJvcl9zdHJpbmcoaW50LCBjaGFyICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIGVycm9yIHN0cmluZyBmb3IgYSBnaXZlbiBlcnJvciBjb2RlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXhzY2FuLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0V4c2Nhbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDUzZTY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRXhzY2FuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRXhzY2FuPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9FeHNjYW48L0gzPgotPFBSRT4KLWludCBNUElfRXhzY2FuKHZvaWQgKiwgdm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSwgTVBJX09wLCBNUElfQ29tbSkgOy8qIEV4dGVybmFsIEludGVyZmFjZXMgKi9pbnQgTVBJX0FkZF9lcnJvcl9jbGFzcyhpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1QZXJmb3JtcyBhIHByZWZpeCByZWR1Y3Rpb24gb24gZGF0YSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIGdyb3VwLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9jMmYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9jMmYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwMWM0Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ZpbGVfYzJmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRmlsZV9jMmY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0ZpbGVfYzJmPC9IMz4KLTxQUkU+Ci1NUElfRmludCBNUElfRmlsZV9jMmYoTVBJX0ZpbGUpOwotPC9QUkU+Ci08REw+PEREPgotVHJhbnNsYXRlcyBhIEMgZmlsZSBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIGZpbGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaWxlX2NhbGxfZXJyaGFuZGxlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaWxlX2NhbGxfZXJyaGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA1MWNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9jYWxsX2VycmhhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9GaWxlX2NhbGxfZXJyaGFuZGxlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRmlsZV9jYWxsX2VycmhhbmRsZXI8L0gzPgotPFBSRT4KLWludCBNUElfRmlsZV9jYWxsX2VycmhhbmRsZXIoTVBJX0ZpbGUsIGludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1DYWxscyB0aGUgZXJyb3IgaGFuZGxlciBhc3NpZ25lZCB0byB0aGUgZmlsZSB3aXRoIHRoZSBlcnJvciBjb2RlIHN1cHBsaWVkLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9jcmVhdGVfZXJyaGFuZGxlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaWxlX2NyZWF0ZV9lcnJoYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZWI3YjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaWxlX2NyZWF0ZV9lcnJoYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRmlsZV9jcmVhdGVfZXJyaGFuZGxlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRmlsZV9jcmVhdGVfZXJyaGFuZGxlcjwvSDM+Ci08UFJFPgotaW50IE1QSV9GaWxlX2NyZWF0ZV9lcnJoYW5kbGVyKE1QSV9GaWxlX2VycmhhbmRsZXJfZm4gKiwgTVBJX0VycmhhbmRsZXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZWdpc3RlcnMgYSB1c2VyLWRlZmluZWQgZXJyb3IgaGFuZGxlciB0aGF0IHlvdSBjYW4gYXNzb2NpYXRlIHdpdGggYW4gb3BlbiBmaWxlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9mMmMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9mMmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0N2NkNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ZpbGVfZjJjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRmlsZV9mMmM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0ZpbGVfZjJjPC9IMz4KLTxQUkU+Ci1NUElfRmlsZSBNUElfRmlsZV9mMmMoTVBJX0ZpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIEMgaGFuZGxlIHRvIGEgZmlsZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ZpbGVfZ2V0X2VycmhhbmRsZXIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9nZXRfZXJyaGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU1ZDNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9nZXRfZXJyaGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0ZpbGVfZ2V0X2VycmhhbmRsZXI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0ZpbGVfZ2V0X2VycmhhbmRsZXI8L0gzPgotPFBSRT4KLWludCBNUElfRmlsZV9nZXRfZXJyaGFuZGxlcihNUElfRmlsZSwgTVBJX0VycmhhbmRsZXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXRyaWV2ZXMgdGhlIGVycm9yIGhhbmRsZXIgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgaGFuZGxlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmlsZV9zZXRfZXJyaGFuZGxlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaWxlX3NldF9lcnJoYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZmU1ODMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaWxlX3NldF9lcnJoYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfRmlsZV9zZXRfZXJyaGFuZGxlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRmlsZV9zZXRfZXJyaGFuZGxlcjwvSDM+Ci08UFJFPgotaW50IE1QSV9GaWxlX3NldF9lcnJoYW5kbGVyKE1QSV9GaWxlLCBNUElfRXJyaGFuZGxlcik7Ci08L1BSRT4KLTxETD48REQ+Ci1Bc3NvY2lhdGVzIGEgbmV3IGVycm9yIGhhbmRsZXIgd2l0aCBhIGZpbGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaW5hbGl6ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaW5hbGl6ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWRmOGY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRmluYWxpemUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9GaW5hbGl6ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRmluYWxpemU8L0gzPgotPFBSRT4KLWludCBNUElfRmluYWxpemUodm9pZCk7Ci08L1BSRT4KLTxETD48REQ+Ci1UZXJtaW5hdGVzIGFsbCBNUEkgcHJvY2Vzc2luZy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ZpbmFsaXplZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GaW5hbGl6ZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0YzQ0ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ZpbmFsaXplZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0ZpbmFsaXplZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRmluYWxpemVkPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0ZpbmFsaXplZChpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRydWUgaWYgTVBJX0ZJTkFMSVpFIGhhcyBjb21wbGV0ZWQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GcmVlX21lbS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9GcmVlX21lbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTRjNDYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfRnJlZV9tZW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9GcmVlX21lbTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfRnJlZV9tZW08L0gzPgotPFBSRT4KLWludCBNUElfRnJlZV9tZW0odm9pZCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUZyZWVzIGEgYmxvY2sgb2Ygc3RvcmFnZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dhdGhlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HYXRoZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4MTFjMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dhdGhlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dhdGhlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR2F0aGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dhdGhlcih2b2lkKiAsIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0NvbW0pOyBpbnQgTVBJX0dhdGhlcnYodm9pZCogLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCosIGludCAqLCBpbnQgKiwgTVBJX0RhdGF0eXBlLCBpbnQsIE1QSV9Db21tKTtpbnQgTVBJX1NjYXR0ZXIodm9pZCogLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLUNvbGxlY3RzIGluZGl2aWR1YWwgbWVzc2FnZXMgZnJvbSBlYWNoIHRhc2sgaW4gYSBncm91cCBhdCB0aGUgcm9vdCB0YXNrLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR2F0aGVydi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HYXRoZXJ2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNDZkYjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HYXRoZXJ2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR2F0aGVydjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR2F0aGVydjwvSDM+Ci08UFJFPgotaW50IE1QSV9HYXRoZXJ2KHZvaWQqICwgaW50LCBNUElfRGF0YXR5cGUsIHZvaWQqLCBpbnQgKiwgaW50ICosIE1QSV9EYXRhdHlwZSwgaW50LCBNUElfQ29tbSk7IGludCBNUElfU2NhdHRlcih2b2lkKiAsIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotQ29sbGVjdHMgaW5kaXZpZHVhbCBtZXNzYWdlcyBmcm9tIGVhY2ggdGFzayBpbmNvbW0gYXQgdGhlIHJvb3QgdGFzay4gTWVzc2FnZXMgY2FuIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCBkaXNwbGFjZW1lbnRzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQwOWRjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR2V0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9HZXQ8L0gzPgotPFBSRT4KLWludCBNUElfR2V0KHZvaWQgKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0FpbnQsIGludCwgTVBJX0RhdGF0eXBlLCBNUElfV2luKTsKLTwvUFJFPgotPERMPjxERD4KLVRyYW5zZmVycyBkYXRhIGZyb20gYSB3aW5kb3cgYXQgdGhlIHRhcmdldCB0YXNrIHRvIHRoZSBvcmlnaW4gdGFzay4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9hZGRyZXNzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9hZGRyZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTVlZDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HZXRfYWRkcmVzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dldF9hZGRyZXNzPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9HZXRfYWRkcmVzczwvSDM+Ci08UFJFPgotaW50IE1QSV9HZXRfYWRkcmVzcyh2b2lkICosIE1QSV9BaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIGxvY2F0aW9uIGluIG1lbW9yeS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9jb3VudC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HZXRfY291bnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4MGFhMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9jb3VudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dldF9jb3VudDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR2V0X2NvdW50PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dldF9jb3VudChNUElfU3RhdHVzICosIE1QSV9EYXRhdHlwZSwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgbWVzc2FnZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9lbGVtZW50cy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HZXRfZWxlbWVudHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNjIzZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9lbGVtZW50cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dldF9lbGVtZW50czwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR2V0X2VsZW1lbnRzPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dldF9lbGVtZW50cyhNUElfU3RhdHVzICosIE1QSV9EYXRhdHlwZSwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJhc2ljIGVsZW1lbnRzIGluIGEgbWVzc2FnZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9wcm9jZXNzb3JfbmFtZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HZXRfcHJvY2Vzc29yX25hbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2ZGU4Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF9wcm9jZXNzb3JfbmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dldF9wcm9jZXNzb3JfbmFtZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR2V0X3Byb2Nlc3Nvcl9uYW1lPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dldF9wcm9jZXNzb3JfbmFtZShjaGFyICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHByb2Nlc3Nvci4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF92ZXJzaW9uLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dldF92ZXJzaW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2ZiZTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HZXRfdmVyc2lvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dldF92ZXJzaW9uPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9HZXRfdmVyc2lvbjwvSDM+Ci08UFJFPgotaW50IE1QSV9HZXRfdmVyc2lvbihpbnQgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgTVBJIHN0YW5kYXJkIHN1cHBvcnRlZC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyYXBoX2NyZWF0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HcmFwaF9jcmVhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiMDBjYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyYXBoX2NyZWF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dyYXBoX2NyZWF0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR3JhcGhfY3JlYXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyYXBoX2NyZWF0ZShNUElfQ29tbSwgaW50LCBpbnQgKiwgaW50ICosIGludCwgTVBJX0NvbW0gKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgbmV3IGNvbW11bmljYXRvciBjb250YWluaW5nIGdyYXBoIHRvcG9sb2d5IGluZm9ybWF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhfZ2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyYXBoX2dldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM4NWZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhfZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JhcGhfZ2V0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9HcmFwaF9nZXQ8L0gzPgotPFBSRT4KLWludCBNUElfR3JhcGhfZ2V0KE1QSV9Db21tLCBpbnQsIGludCwgaW50ICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHJpZXZlcyBncmFwaCB0b3BvbG9neSBpbmZvcm1hdGlvbiBmcm9tIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhfbWFwLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyYXBoX21hcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhhZmUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhfbWFwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JhcGhfbWFwPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9HcmFwaF9tYXA8L0gzPgotPFBSRT4KLWludCBNUElfR3JhcGhfbWFwKE1QSV9Db21tLCBpbnQsIGludCAqLCBpbnQgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotQ29tcHV0ZXMgcGxhY2VtZW50IG9mIHRhc2tzIG9uIHRoZSBwaHlzaWNhbCBwcm9jZXNzb3IuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HcmFwaF9uZWlnaGJvcnMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhfbmVpZ2hib3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzhmYmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HcmFwaF9uZWlnaGJvcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9HcmFwaF9uZWlnaGJvcnM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyYXBoX25laWdoYm9yczwvSDM+Ci08UFJFPgotaW50IE1QSV9HcmFwaF9uZWlnaGJvcnMoTVBJX0NvbW0sIGludCwgaW50LCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBuZWlnaGJvcnMgb2YgdGhlIGdpdmVuIHRhc2suCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HcmFwaF9uZWlnaGJvcnNfY291bnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhfbmVpZ2hib3JzX2NvdW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGEwNDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9HcmFwaF9uZWlnaGJvcnNfY291bnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9HcmFwaF9uZWlnaGJvcnNfY291bnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyYXBoX25laWdoYm9yc19jb3VudDwvSDM+Ci08UFJFPgotaW50IE1QSV9HcmFwaF9uZWlnaGJvcnNfY291bnQoTVBJX0NvbW0sIGludCwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5laWdoYm9ycyBvZiB0aGUgZ2l2ZW4gdGFzay4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyYXBoZGltc19nZXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhkaW1zX2dldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZiNjFhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JhcGhkaW1zX2dldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dyYXBoZGltc19nZXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyYXBoZGltc19nZXQ8L0gzPgotPFBSRT4KLWludCBNUElfR3JhcGhkaW1zX2dldChNUElfQ29tbSwgaW50ICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHJpZXZlcyBncmFwaCB0b3BvbG9neSBpbmZvcm1hdGlvbiBmcm9tIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JlcXVlc3RfY29tcGxldGUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JlcXVlc3RfY29tcGxldGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5M2Q4MS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyZXF1ZXN0X2NvbXBsZXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JlcXVlc3RfY29tcGxldGU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyZXF1ZXN0X2NvbXBsZXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyZXF1ZXN0X2NvbXBsZXRlKE1QSV9SZXF1ZXN0KTsKLTwvUFJFPgotPERMPjxERD4KLU1hcmtzIHRoZSBnZW5lcmFsaXplZCByZXF1ZXN0IGNvbXBsZXRlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JlcXVlc3Rfc3RhcnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JlcXVlc3Rfc3RhcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4N2FiZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyZXF1ZXN0X3N0YXJ0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JlcXVlc3Rfc3RhcnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyZXF1ZXN0X3N0YXJ0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyZXF1ZXN0X3N0YXJ0KE1QSV9HcmVxdWVzdF9xdWVyeV9mdW5jdGlvbiAqLCBNUElfR3JlcXVlc3RfZnJlZV9mdW5jdGlvbiAqLE1QSV9HcmVxdWVzdF9jYW5jZWxfZnVuY3Rpb24gKiwgdm9pZCAqLCBNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUluaXRpYWxpemVzIGEgZ2VuZXJhbGl6ZWQgcmVxdWVzdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX2MyZi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9jMmYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzNGU1Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX2MyZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dyb3VwX2MyZjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR3JvdXBfYzJmPC9IMz4KLTxQUkU+Ci1NUElfRmludCBNUElfR3JvdXBfYzJmKE1QSV9Hcm91cCk7Ci08L1BSRT4KLTxETD48REQ+Ci1UcmFuc2xhdGVzIGEgQyBncm91cCBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIGdyb3VwLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfY29tcGFyZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9jb21wYXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDU3M2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9jb21wYXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JvdXBfY29tcGFyZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR3JvdXBfY29tcGFyZTwvSDM+Ci08UFJFPgotaW50IE1QSV9Hcm91cF9jb21wYXJlKE1QSV9Hcm91cCwgTVBJX0dyb3VwLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1Db21wYXJlcyB0aGUgY29udGVudHMgb2YgdHdvIHRhc2sgZ3JvdXBzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfZGlmZmVyZW5jZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9kaWZmZXJlbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDUzOTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9kaWZmZXJlbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JvdXBfZGlmZmVyZW5jZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR3JvdXBfZGlmZmVyZW5jZTwvSDM+Ci08UFJFPgotaW50IE1QSV9Hcm91cF9kaWZmZXJlbmNlKE1QSV9Hcm91cCwgTVBJX0dyb3VwLCBNUElfR3JvdXAgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgbmV3IGdyb3VwIHRoYXQgaXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGV4aXN0aW5nIGdyb3Vwcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX2V4Y2wuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfZXhjbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTYzOWE3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfZXhjbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dyb3VwX2V4Y2w8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyb3VwX2V4Y2w8L0gzPgotPFBSRT4KLWludCBNUElfR3JvdXBfZXhjbChNUElfR3JvdXAsIGludCwgaW50ICosIE1QSV9Hcm91cCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJlbW92ZXMgc2VsZWN0ZWQgdGFza3MgZnJvbSBhbiBleGlzdGluZyBncm91cCB0byBjcmVhdGUgYSBuZXcgZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9mMmMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfZjJjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTc2YzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9mMmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Hcm91cF9mMmM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyb3VwX2YyYzwvSDM+Ci08UFJFPgotTVBJX0dyb3VwIE1QSV9Hcm91cF9mMmMoTVBJX0ZpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIEMgaGFuZGxlIHRvIGEgZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9mcmVlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX2ZyZWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4NmIwYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX2ZyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Hcm91cF9mcmVlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Hcm91cF9mcmVlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyb3VwX2ZyZWUoTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotTWFya3MgYSBncm91cCBmb3IgZGVhbGxvY2F0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfaW5jbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9pbmNsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDkzNTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9pbmNsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JvdXBfaW5jbDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR3JvdXBfaW5jbDwvSDM+Ci08UFJFPgotaW50IE1QSV9Hcm91cF9pbmNsKE1QSV9Hcm91cCwgaW50LCBpbnQgKiwgTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIG5ldyBncm91cCBjb25zaXN0aW5nIG9mIHNlbGVjdGVkIHRhc2tzIGZyb20gYW4gZXhpc3RpbmcgZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9pbnRlcnNlY3Rpb24uaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfaW50ZXJzZWN0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjkxYzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9pbnRlcnNlY3Rpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Hcm91cF9pbnRlcnNlY3Rpb248L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0dyb3VwX2ludGVyc2VjdGlvbjwvSDM+Ci08UFJFPgotaW50IE1QSV9Hcm91cF9pbnRlcnNlY3Rpb24oTVBJX0dyb3VwLCBNUElfR3JvdXAsIE1QSV9Hcm91cCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUNyZWF0ZXMgYSBuZXcgZ3JvdXAgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBleGlzdGluZyBncm91cHMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9yYW5nZV9leGNsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3JhbmdlX2V4Y2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2MzNkNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3JhbmdlX2V4Y2wuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Hcm91cF9yYW5nZV9leGNsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Hcm91cF9yYW5nZV9leGNsPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyb3VwX3JhbmdlX2V4Y2woTVBJX0dyb3VwLCBpbnQsIGludCBbXVszXSwgTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIG5ldyBncm91cCBieSBleGNsdWRpbmcgc2VsZWN0ZWQgdGFza3Mgb2YgYW4gZXhpc3RpbmcgZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9yYW5nZV9pbmNsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3JhbmdlX2luY2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjMTE3NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3JhbmdlX2luY2wuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Hcm91cF9yYW5nZV9pbmNsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Hcm91cF9yYW5nZV9pbmNsPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyb3VwX3JhbmdlX2luY2woTVBJX0dyb3VwLCBpbnQsIGludCBbXVszXSwgTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIG5ldyBncm91cCBjb25zaXN0aW5nIG9mIHNlbGVjdGVkIHJhbmdlcyBvZiB0YXNrcyBmcm9tIGFuIGV4aXN0aW5nIGdyb3VwLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfR3JvdXBfcmFuay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9yYW5rLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjE0M2IuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9yYW5rLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfR3JvdXBfcmFuazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfR3JvdXBfcmFuazwvSDM+Ci08UFJFPgotaW50IE1QSV9Hcm91cF9yYW5rKE1QSV9Hcm91cCwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgcmFuayBvZiB0aGUgbG9jYWwgdGFzayB3aXRoIHJlc3BlY3QgdG8gZ3JvdXAuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF9zaXplLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3NpemUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZjAxYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3NpemUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Hcm91cF9zaXplPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Hcm91cF9zaXplPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0dyb3VwX3NpemUoTVBJX0dyb3VwLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBudW1iZXIgb2YgdGFza3MgaW4gYSBncm91cC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3VuaW9uLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0dyb3VwX3VuaW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmQ2YjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Hcm91cF91bmlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0dyb3VwX3VuaW9uPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Hcm91cF91bmlvbjwvSDM+Ci08UFJFPgotaW50IE1QSV9Hcm91cF91bmlvbihNUElfR3JvdXAsIE1QSV9Hcm91cCwgTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIG5ldyBncm91cCB0aGF0IGlzIHRoZSB1bmlvbiBvZiB0d28gZXhpc3RpbmcgZ3JvdXBzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSWJzZW5kLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lic2VuZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U0MjUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSWJzZW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSWJzZW5kPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JYnNlbmQ8L0gzPgotPFBSRT4KLWludCBNUElfSWJzZW5kKHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgbm9uLWJsb2NraW5nIGJ1ZmZlcmVkIHNlbmQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2MyZi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2MyZi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTgzMTQ4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19jMmYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9JbmZvX2MyZjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfSW5mb19jMmY8L0gzPgotPFBSRT4KLU1QSV9GaW50IE1QSV9JbmZvX2MyZihNUElfSW5mbyk7Ci08L1BSRT4KLTxETD48REQ+Ci1UcmFuc2xhdGVzIGEgQyBJbmZvIG9iamVjdCBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIEluZm8gb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19jcmVhdGUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19jcmVhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2ZjM0MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fY3JlYXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSW5mb19jcmVhdGU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0luZm9fY3JlYXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0luZm9fY3JlYXRlKE1QSV9JbmZvICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIG5ldywgZW1wdHkgSW5mbyBvYmplY3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2RlbGV0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2RlbGV0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkzMTJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19kZWxldGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9JbmZvX2RlbGV0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfSW5mb19kZWxldGU8L0gzPgotPFBSRT4KLWludCBNUElfSW5mb19kZWxldGUoTVBJX0luZm8sIGNoYXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1EZWxldGVzIGEgKGtleSwgdmFsdWUpIHBhaXIgZnJvbSBhbiBJbmZvIG9iamVjdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZHVwLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZHVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmFhYjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2R1cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0luZm9fZHVwPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JbmZvX2R1cDwvSDM+Ci08UFJFPgotaW50IE1QSV9JbmZvX2R1cChNUElfSW5mbywgTVBJX0luZm8gKik7Ci08L1BSRT4KLTxETD48REQ+Ci1EdXBsaWNhdGVzIGFuIEluZm8gb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19mMmMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19mMmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhOGM1NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZjJjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSW5mb19mMmM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0luZm9fZjJjPC9IMz4KLTxQUkU+Ci1NUElfSW5mbyBNUElfSW5mb19mMmMoTVBJX0ZpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIEMgaGFuZGxlIHRvIGFuIEluZm8gb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19mcmVlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZnJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZhZjUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19mcmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSW5mb19mcmVlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JbmZvX2ZyZWU8L0gzPgotPFBSRT4KLWludCBNUElfSW5mb19mcmVlKE1QSV9JbmZvICppbmZvKTsKLTwvUFJFPgotPERMPjxERD4KLUZyZWVzIGFuIEluZm8gb2JqZWN0IGFuZCBzZXRzIGl0cyBoYW5kbGUgdG8gTVBJX0lORk9fTlVMTC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZ2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZ2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWVlMTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2dldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0luZm9fZ2V0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JbmZvX2dldDwvSDM+Ci08UFJFPgotaW50IE1QSV9JbmZvX2dldChNUElfSW5mbywgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGhrZXkgaW4gYW4gSW5mbyBvYmplY3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2dldF9ua2V5cy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2dldF9ua2V5cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTA3M2FkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19nZXRfbmtleXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9JbmZvX2dldF9ua2V5czwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfSW5mb19nZXRfbmtleXM8L0gzPgotPFBSRT4KLWludCBNUElfSW5mb19nZXRfbmtleXMoTVBJX0luZm8sIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIG51bWJlciBvZiBrZXlzIGRlZmluZWQgaW4gYW4gSW5mbyBvYmplY3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2dldF9udGhrZXkuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19nZXRfbnRoa2V5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGZkY2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbmZvX2dldF9udGhrZXkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9JbmZvX2dldF9udGhrZXk8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0luZm9fZ2V0X250aGtleTwvSDM+Ci08UFJFPgotaW50IE1QSV9JbmZvX2dldF9udGhrZXkoTVBJX0luZm8sIGludCwgY2hhciAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHJpZXZlcyB0aGUgbnRoIGtleSBkZWZpbmVkIGluIGFuIEluZm8gb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19nZXRfdmFsdWVsZW4uaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19nZXRfdmFsdWVsZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExMmEwYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fZ2V0X3ZhbHVlbGVuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSW5mb19nZXRfdmFsdWVsZW48L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0luZm9fZ2V0X3ZhbHVlbGVuPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0luZm9fZ2V0X3ZhbHVlbGVuKE1QSV9JbmZvLCBjaGFyICosIGludCAqLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXRyaWV2ZXMgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEga2V5IG9mIGFuIEluZm8gb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19zZXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5mb19zZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ODgxOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luZm9fc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSW5mb19zZXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0luZm9fc2V0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0luZm9fc2V0KE1QSV9JbmZvLCBjaGFyICosIGNoYXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1BZGRzIGEgKGtleSwgdmFsdWUpIHBhaXIgdG8gYW4gSW5mbyBvYmplY3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jbml0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luaXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4YTM4YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luaXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Jbml0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Jbml0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0luaXQoaW50ICosIGNoYXIgKioqKTsKLTwvUFJFPgotPERMPjxERD4KLUluaXRpYWxpemVzIE1QSS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luaXRfdGhyZWFkLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0luaXRfdGhyZWFkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDc0ZDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jbml0X3RocmVhZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0luaXRfdGhyZWFkPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Jbml0X3RocmVhZDwvSDM+Ci08UFJFPgotaW50IE1QSV9Jbml0X3RocmVhZChpbnQgKiwgY2hhciAqKiosIGludCwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotSW5pdGlhbGl6ZXMgTVBJIGFuZCB0aGUgTVBJIHRocmVhZHMgZW52aXJvbm1lbnQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jbml0aWFsaXplZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jbml0aWFsaXplZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE4OGViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW5pdGlhbGl6ZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Jbml0aWFsaXplZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfSW5pdGlhbGl6ZWQ8L0gzPgotPFBSRT4KLWludCBNUElfSW5pdGlhbGl6ZWQoaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotRGV0ZXJtaW5lcyBpZiBNUEkgaXMgaW5pdGlhbGl6ZWQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9JbnRlcmNvbW1fY3JlYXRlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ludGVyY29tbV9jcmVhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1ODY0Yi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ludGVyY29tbV9jcmVhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9JbnRlcmNvbW1fY3JlYXRlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JbnRlcmNvbW1fY3JlYXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0ludGVyY29tbV9jcmVhdGUoTVBJX0NvbW0sIGludCwgTVBJX0NvbW0sIGludCwgaW50LCBNUElfQ29tbSAqICk7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGFuIGludGVyLWNvbW11bmljYXRvciBmcm9tIHR3byBpbnRyYS1jb21tdW5pY2F0b3JzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW50ZXJjb21tX21lcmdlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0ludGVyY29tbV9tZXJnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ0ZjM0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSW50ZXJjb21tX21lcmdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSW50ZXJjb21tX21lcmdlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JbnRlcmNvbW1fbWVyZ2U8L0gzPgotPFBSRT4KLWludCBNUElfSW50ZXJjb21tX21lcmdlKE1QSV9Db21tLCBpbnQsIE1QSV9Db21tICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhbiBpbnRyYS1jb21tdW5pY2F0b3IgYnkgbWVyZ2luZyB0aGUgbG9jYWwgYW5kIHJlbW90ZSBncm91cHMgb2YgYW4gaW50ZXItY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXByb2JlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lwcm9iZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU2YTJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXByb2JlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSXByb2JlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JcHJvYmU8L0gzPgotPFBSRT4KLWludCBNUElfSXByb2JlKGludCwgaW50LCBNUElfQ29tbSwgaW50ICosIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DaGVja3MgdG8gc2VlIGlmIGEgbWVzc2FnZSBtYXRjaGluZ3NvdXJjZSwgdGFnLCBhbmRjb21tIGhhcyBhcnJpdmVkLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXJlY3YuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXJlY3YuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1MGJlMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lyZWN2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSXJlY3Y8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0lyZWN2PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0lyZWN2KHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgbm9uLWJsb2NraW5nIHJlY2VpdmUgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXJzZW5kLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lyc2VuZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGNiMmYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXJzZW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSXJzZW5kPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9JcnNlbmQ8L0gzPgotPFBSRT4KLWludCBNUElfSXJzZW5kKHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgbm9uLWJsb2NraW5nIHJlYWR5IHNlbmQgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXNfdGhyZWFkX21haW4uaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXNfdGhyZWFkX21haW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlZDA0Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lzX3RocmVhZF9tYWluLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfSXNfdGhyZWFkX21haW48L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX0lzX3RocmVhZF9tYWluPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0lzX3RocmVhZF9tYWluKGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLURldGVybWluZXMgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIHRocmVhZCB0aGF0IGNhbGxlZCBNUElfSU5JVCBvciBNUElfSU5JVF9USFJFQUQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jc2VuZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jc2VuZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFjZWY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfSXNlbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Jc2VuZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfSXNlbmQ8L0gzPgotPFBSRT4KLWludCBNUElfSXNlbmQodm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0sIE1QSV9SZXF1ZXN0ICopOwotPC9QUkU+Ci08REw+PEREPgotUGVyZm9ybXMgYSBub24tYmxvY2tpbmcgc3RhbmRhcmQgbW9kZSBzZW5kIG9wZXJhdGlvbi4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lzc2VuZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Jc3NlbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3YWIyNi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0lzc2VuZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0lzc2VuZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfSXNzZW5kPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX0lzc2VuZCh2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1QZXJmb3JtcyBhIG5vbi1ibG9ja2luZyBzeW5jaHJvbm91cyBtb2RlIHNlbmQgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfS2V5dmFsX2NyZWF0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9LZXl2YWxfY3JlYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTQ3MzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9LZXl2YWxfY3JlYXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfS2V5dmFsX2NyZWF0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfS2V5dmFsX2NyZWF0ZTwvSDM+Ci08UFJFPgotaW50IE1QSV9LZXl2YWxfY3JlYXRlKE1QSV9Db3B5X2Z1bmN0aW9uICosIE1QSV9EZWxldGVfZnVuY3Rpb24gKiwgaW50ICosIHZvaWQqKTsKLTwvUFJFPgotPERMPjxERD4KLUdlbmVyYXRlcyBhIG5ldyBjb21tdW5pY2F0b3IgYXR0cmlidXRlIGtleS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0tleXZhbF9mcmVlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX0tleXZhbF9mcmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDNjNGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9LZXl2YWxfZnJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX0tleXZhbF9mcmVlPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9LZXl2YWxfZnJlZTwvSDM+Ci08UFJFPgotaW50IE1QSV9LZXl2YWxfZnJlZShpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1NYXJrcyBhIGNvbW11bmljYXRvciBhdHRyaWJ1dGUga2V5IGZvciBkZWFsbG9jYXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9jMmYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfT3BfYzJmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTYzNGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9jMmYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9PcF9jMmY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX09wX2MyZjwvSDM+Ci08UFJFPgotTVBJX0ZpbnQgTVBJX09wX2MyZihNUElfT3ApOwotPC9QUkU+Ci08REw+PEREPgotVHJhbnNsYXRlcyBhIEMgcmVkdWN0aW9uIG9wZXJhdGlvbiBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIG9wZXJhdGlvbi4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX09wX2NyZWF0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9jcmVhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0ODg1ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX09wX2NyZWF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX09wX2NyZWF0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfT3BfY3JlYXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX09wX2NyZWF0ZShNUElfVXNlcl9mdW5jdGlvbiAqLCBpbnQsIE1QSV9PcCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUJpbmRzIGEgdXNlci1kZWZpbmVkIHJlZHVjdGlvbiBvcGVyYXRpb24gdG8gYW5vcCBoYW5kbGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9mMmMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfT3BfZjJjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWNmYWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9mMmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9PcF9mMmM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX09wX2YyYzwvSDM+Ci08UFJFPgotTVBJX09wIE1QSV9PcF9mMmMoTVBJX0ZpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIEMgcmVkdWN0aW9uIG9wZXJhdGlvbiBoYW5kbGUgdG8gYW4gb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfT3BfZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9mcmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjA2N2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9PcF9mcmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfT3BfZnJlZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfT3BfZnJlZTwvSDM+Ci08UFJFPgotaW50IE1QSV9PcF9mcmVlKCBNUElfT3AgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1NYXJrcyBhIHVzZXItZGVmaW5lZCByZWR1Y3Rpb24gb3BlcmF0aW9uIGZvciBkZWFsbG9jYXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9QYWNrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1BhY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxYmNlNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1BhY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9QYWNrPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9QYWNrPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1BhY2sodm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkICosIGludCwgaW50ICosICBNUElfQ29tbSk7Ci08L1BSRT4KLTxETD48REQ+Ci1QYWNrcyB0aGUgbWVzc2FnZSBpbiB0aGUgc3BlY2lmaWVkIHNlbmQgYnVmZmVyIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIgc3BhY2UuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9QYWNrX2V4dGVybmFsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1BhY2tfZXh0ZXJuYWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5MDhkNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1BhY2tfZXh0ZXJuYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9QYWNrX2V4dGVybmFsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9QYWNrX2V4dGVybmFsPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1BhY2tfZXh0ZXJuYWwoY2hhciAqLCB2b2lkICosIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkICosIE1QSV9BaW50LCBNUElfQWludCAqKTtpbnQgTVBJX1BhY2tfZXh0ZXJuYWxfc2l6ZShjaGFyICosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfQWludCAqKTtpbnQgTVBJX1JlcXVlc3RfZ2V0X3N0YXR1cyhNUElfUmVxdWVzdCwgaW50ICosIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1QYWNrcyB0aGUgbWVzc2FnZSBpbiB0aGUgc3BlY2lmaWVkIHNlbmQgYnVmZmVyIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIgc3BhY2UsIHVzaW5nIHRoZSBleHRlcm5hbDMyIGRhdGEgZm9ybWF0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUGFja19leHRlcm5hbF9zaXplLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1BhY2tfZXh0ZXJuYWxfc2l6ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNhMTllLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUGFja19leHRlcm5hbF9zaXplLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfUGFja19leHRlcm5hbF9zaXplPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9QYWNrX2V4dGVybmFsX3NpemU8L0gzPgotPFBSRT4KLWludCBNUElfUGFja19leHRlcm5hbF9zaXplKGNoYXIgKiwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9BaW50ICopOyBpbnQgTVBJX1JlcXVlc3RfZ2V0X3N0YXR1cyhNUElfUmVxdWVzdCwgaW50ICosIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZGF0YSwgdXNpbmcgdGhlIGV4dGVybmFsMzIgZGF0YSBmb3JtYXQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9QYWNrX3NpemUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUGFja19zaXplLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODUwNzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9QYWNrX3NpemUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9QYWNrX3NpemU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1BhY2tfc2l6ZTwvSDM+Ci08UFJFPgotaW50IE1QSV9QYWNrX3NpemUoaW50LCBNUElfRGF0YXR5cGUsIE1QSV9Db21tLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZGF0YS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1Bjb250cm9sLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1Bjb250cm9sLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDdjYWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9QY29udHJvbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1Bjb250cm9sPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9QY29udHJvbDwvSDM+Ci08UFJFPgotaW50IE1QSV9QY29udHJvbChjb25zdCBpbnQsIC4uLik7Ci08L1BSRT4KLTxETD48REQ+Ci1Qcm92aWRlcyBwcm9maWxlIGNvbnRyb2wuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Qcm9iZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Qcm9iZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGMzNDY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUHJvYmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Qcm9iZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfUHJvYmU8L0gzPgotPFBSRT4KLWludCBNUElfUHJvYmUoaW50LCBpbnQsIE1QSV9Db21tLCBNUElfU3RhdHVzICopOwotPC9QUkU+Ci08REw+PEREPgotV2FpdHMgdW50aWwgYSBtZXNzYWdlIG1hdGNoaW5nIHNvdXJjZSwgdGFnLCBhbmQgY29tbSBhcnJpdmVzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUHV0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1B1dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFlNzY4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUHV0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfUHV0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9QdXQ8L0gzPgotPFBSRT4KLWludCBNUElfUHV0KHZvaWQgKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0FpbnQsIGludCwgTVBJX0RhdGF0eXBlLCBNUElfV2luKTsKLTwvUFJFPgotPERMPjxERD4KLVRyYW5zZmVycyBkYXRhIGZyb20gdGhlIG9yaWdpbiB0YXNrIHRvIGEgd2luZG93IGF0IHRoZSB0YXJnZXQgdGFzay4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1F1ZXJ5X3RocmVhZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9RdWVyeV90aHJlYWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjZWVkMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1F1ZXJ5X3RocmVhZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1F1ZXJ5X3RocmVhZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfUXVlcnlfdGhyZWFkPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1F1ZXJ5X3RocmVhZChpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGxldmVsIG9mIHRocmVhZHMgc3VwcG9ydC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlY3YuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVjdi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBhYzdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVjdi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1JlY3Y8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1JlY3Y8L0gzPgotPFBSRT4KLWludCBNUElfUmVjdih2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1N0YXR1cyAqKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgYmxvY2tpbmcgcmVjZWl2ZSBvcGVyYXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9SZWN2X2luaXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVjdl9pbml0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzY2NiN2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9SZWN2X2luaXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9SZWN2X2luaXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1JlY3ZfaW5pdDwvSDM+Ci08UFJFPgotaW50IE1QSV9SZWN2X2luaXQodm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgcGVyc2lzdGVudCByZWNlaXZlIHJlcXVlc3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9SZWR1Y2UuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVkdWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjc4MmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9SZWR1Y2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9SZWR1Y2U8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1JlZHVjZTwvSDM+Ci08UFJFPgotaW50IE1QSV9SZWR1Y2Uodm9pZCogLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9PcCwgaW50LCBNUElfQ29tbSk7Ci08L1BSRT4KLTxETD48REQ+Ci1BcHBsaWVzIGEgcmVkdWN0aW9uIG9wZXJhdGlvbiB0byB0aGUgdmVjdG9yc2VuZGJ1ZiBvdmVyIHRoZSBzZXQgb2YgdGFza3Mgc3BlY2lmaWVkIGJ5Y29tbSBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gcmVjdmJ1ZiBvbiByb290LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVkdWNlX3NjYXR0ZXIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVkdWNlX3NjYXR0ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzNDRjMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlZHVjZV9zY2F0dGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfUmVkdWNlX3NjYXR0ZXI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1JlZHVjZV9zY2F0dGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1JlZHVjZV9zY2F0dGVyKHZvaWQqICwgdm9pZCosIGludCAqLCBNUElfRGF0YXR5cGUsIE1QSV9PcCwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotQXBwbGllcyBhIHJlZHVjdGlvbiBvcGVyYXRpb24gdG8gdGhlIHZlY3RvcnNlbmRidWYgb3ZlciB0aGUgc2V0IG9mIHRhc2tzIHNwZWNpZmllZCBieWNvbW0gYW5kIHNjYXR0ZXJzIHRoZSByZXN1bHQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZXMgaW4gcmVjdmNvdW50cy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlcXVlc3RfYzJmLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlcXVlc3RfYzJmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTExMzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9SZXF1ZXN0X2MyZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1JlcXVlc3RfYzJmPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9SZXF1ZXN0X2MyZjwvSDM+Ci08UFJFPgotTVBJX0ZpbnQgTVBJX1JlcXVlc3RfYzJmKE1QSV9SZXF1ZXN0KTsKLTwvUFJFPgotPERMPjxERD4KLVRyYW5zbGF0ZXMgYSBDIHJlcXVlc3QgaGFuZGxlIGludG8gYSBGT1JUUkFOIGhhbmRsZSB0byB0aGUgc2FtZSByZXF1ZXN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVxdWVzdF9mMmMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVxdWVzdF9mMmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5OWFiMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlcXVlc3RfZjJjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfUmVxdWVzdF9mMmM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1JlcXVlc3RfZjJjPC9IMz4KLTxQUkU+Ci1NUElfUmVxdWVzdCBNUElfUmVxdWVzdF9mMmMoTVBJX0ZpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIEMgaGFuZGxlIHRvIGEgcmVxdWVzdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlcXVlc3RfZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9SZXF1ZXN0X2ZyZWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyOTJlOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlcXVlc3RfZnJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1JlcXVlc3RfZnJlZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfUmVxdWVzdF9mcmVlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1JlcXVlc3RfZnJlZShNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLU1hcmtzIGEgcmVxdWVzdCBmb3IgZGVhbGxvY2F0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVxdWVzdF9nZXRfc3RhdHVzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1JlcXVlc3RfZ2V0X3N0YXR1cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGU2ZDUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUmVxdWVzdF9nZXRfc3RhdHVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfUmVxdWVzdF9nZXRfc3RhdHVzPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9SZXF1ZXN0X2dldF9zdGF0dXM8L0gzPgotPFBSRT4KLWludCBNUElfUmVxdWVzdF9nZXRfc3RhdHVzKE1QSV9SZXF1ZXN0LCBpbnQgKiwgTVBJX1N0YXR1cyAqKTsKLTwvUFJFPgotPERMPjxERD4KLUFjY2Vzc2VzIHRoZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSByZXF1ZXN0LCB3aXRob3V0IGZyZWVpbmcgdGhlIHJlcXVlc3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Sc2VuZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Sc2VuZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDU3MGFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUnNlbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9Sc2VuZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfUnNlbmQ8L0gzPgotPFBSRT4KLWludCBNUElfUnNlbmQodm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotUGVyZm9ybXMgYSBibG9ja2luZyByZWFkeSBtb2RlIHNlbmQgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfUnNlbmRfaW5pdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Sc2VuZF9pbml0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDNjMzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9Sc2VuZF9pbml0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfUnNlbmRfaW5pdDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfUnNlbmRfaW5pdDwvSDM+Ci08UFJFPgotaW50IE1QSV9Sc2VuZF9pbml0KHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LGludCwgTVBJX0NvbW0sIE1QSV9SZXF1ZXN0ICopOwotPC9QUkU+Ci08REw+PEREPgotQ3JlYXRlcyBhIHBlcnNpc3RlbnQgcmVhZHkgbW9kZSBzZW5kIHJlcXVlc3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TY2FuLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NjYW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNGI0Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NjYW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9TY2FuPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9TY2FuPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1NjYW4odm9pZCogLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9PcCwgTVBJX0NvbW0gKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgcGFyYWxsZWwgcHJlZml4IHJlZHVjdGlvbiBvbiBkYXRhIGRpc3RyaWJ1dGVkIGFjcm9zcyBhIGdyb3VwLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU2NhdHRlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TY2F0dGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmM3NDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TY2F0dGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU2NhdHRlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfU2NhdHRlcjwvSDM+Ci08UFJFPgotaW50IE1QSV9TY2F0dGVyKHZvaWQqICwgaW50LCBNUElfRGF0YXR5cGUsIHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBNUElfQ29tbSk7Ci08L1BSRT4KLTxETD48REQ+Ci1EaXN0cmlidXRlcyBpbmRpdmlkdWFsIG1lc3NhZ2VzIGZyb21yb290IHRvIGVhY2ggdGFzayBpbiBjb21tLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU2NhdHRlcnYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU2NhdHRlcnYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyMTIyZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NjYXR0ZXJ2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU2NhdHRlcnY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1NjYXR0ZXJ2PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1NjYXR0ZXJ2KHZvaWQqICwgaW50ICosIGludCAqLCAgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotRGlzdHJpYnV0ZXMgaW5kaXZpZHVhbCBtZXNzYWdlcyBmcm9tcm9vdCB0byBlYWNoIHRhc2sgaW4gY29tbS4gTWVzc2FnZXMgY2FuIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCBkaXNwbGFjZW1lbnRzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU2VuZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TZW5kLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmUzMGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TZW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU2VuZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfU2VuZDwvSDM+Ci08UFJFPgotaW50IE1QSV9TZW5kKHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLUJsb2NraW5nIHN0YW5kYXJkIG1vZGUgc2VuZC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NlbmRfaW5pdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TZW5kX2luaXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiNjYyNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NlbmRfaW5pdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1NlbmRfaW5pdDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfU2VuZF9pbml0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1NlbmRfaW5pdCh2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGEgcGVyc2lzdGVudCBzdGFuZGFyZCBtb2RlIHNlbmQgcmVxdWVzdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NlbmRyZWN2Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NlbmRyZWN2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjNkMTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TZW5kcmVjdi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1NlbmRyZWN2PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9TZW5kcmVjdjwvSDM+Ci08UFJFPgotaW50IE1QSV9TZW5kcmVjdih2b2lkICosIGludCwgTVBJX0RhdGF0eXBlLGludCwgaW50LCB2b2lkICosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0sIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1QZXJmb3JtcyBhIGJsb2NraW5nIHNlbmQgYW5kIHJlY2VpdmUgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU2VuZHJlY3ZfcmVwbGFjZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TZW5kcmVjdl9yZXBsYWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGExOTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TZW5kcmVjdl9yZXBsYWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU2VuZHJlY3ZfcmVwbGFjZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfU2VuZHJlY3ZfcmVwbGFjZTwvSDM+Ci08UFJFPgotaW50IE1QSV9TZW5kcmVjdl9yZXBsYWNlKHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1N0YXR1cyAqKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgYmxvY2tpbmcgc2VuZCBhbmQgcmVjZWl2ZSBvcGVyYXRpb24gdXNpbmcgYSBjb21tb24gYnVmZmVyLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3NlbmQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3NlbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3OWE2YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NzZW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU3NlbmQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1NzZW5kPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1NzZW5kKHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tKTsKLTwvUFJFPgotPERMPjxERD4KLVBlcmZvcm1zIGEgYmxvY2tpbmcgc3luY2hyb25vdXMgbW9kZSBzZW5kIG9wZXJhdGlvbi4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1NzZW5kX2luaXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3NlbmRfaW5pdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE1ZDI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3NlbmRfaW5pdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1NzZW5kX2luaXQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1NzZW5kX2luaXQ8L0gzPgotPFBSRT4KLWludCBNUElfU3NlbmRfaW5pdCh2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCxpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqKTsKLTwvUFJFPgotPERMPjxERD4KLUNyZWF0ZXMgYSBwZXJzaXN0ZW50IHN5bmNocm9ub3VzIG1vZGUgc2VuZCByZXF1ZXN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhcnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNGFhZi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXJ0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU3RhcnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1N0YXJ0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1N0YXJ0KE1QSV9SZXF1ZXN0ICopOwotPC9QUkU+Ci08REw+PEREPgotQWN0aXZhdGVzIGEgcGVyc2lzdGVudCByZXF1ZXN0IG9wZXJhdGlvbi4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXJ0YWxsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXJ0YWxsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzQ3ZTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TdGFydGFsbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1N0YXJ0YWxsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9TdGFydGFsbDwvSDM+Ci08UFJFPgotaW50IE1QSV9TdGFydGFsbChpbnQsIE1QSV9SZXF1ZXN0ICopOwotPC9QUkU+Ci08REw+PEREPgotQWN0aXZhdGVzIGEgY29sbGVjdGlvbiBvZiBwZXJzaXN0ZW50IHJlcXVlc3Qgb3BlcmF0aW9ucy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXR1c19jMmYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhdHVzX2MyZi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRlYzc0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhdHVzX2MyZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1N0YXR1c19jMmY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1N0YXR1c19jMmY8L0gzPgotPFBSRT4KLWludCBNUElfU3RhdHVzX2MyZihNUElfU3RhdHVzICosIE1QSV9GaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotVHJhbnNsYXRlcyBhIEMgc3RhdHVzIG9iamVjdCBpbnRvIGEgRk9SVFJBTiBzdGF0dXMgb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhdHVzX2YyYy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TdGF0dXNfZjJjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTZkNjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TdGF0dXNfZjJjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU3RhdHVzX2YyYzwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfU3RhdHVzX2YyYzwvSDM+Ci08UFJFPgotaW50IE1QSV9TdGF0dXNfZjJjKE1QSV9GaW50ICosIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1Db252ZXJ0cyBhIEZPUlRSQU4gc3RhdHVzIG9iamVjdCBpbnRvIGEgQyBzdGF0dXMgb2JqZWN0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhdHVzX3NldF9jYW5jZWxsZWQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfU3RhdHVzX3NldF9jYW5jZWxsZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmZWZiMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXR1c19zZXRfY2FuY2VsbGVkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfU3RhdHVzX3NldF9jYW5jZWxsZWQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1N0YXR1c19zZXRfY2FuY2VsbGVkPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1N0YXR1c19zZXRfY2FuY2VsbGVkKE1QSV9TdGF0dXMgKiwgaW50KTsKLTwvUFJFPgotPERMPjxERD4KLURlZmluZXMgY2FuY2VsbGF0aW9uIGluZm9ybWF0aW9uIGZvciBhIHJlcXVlc3QuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9TdGF0dXNfc2V0X2VsZW1lbnRzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXR1c19zZXRfZWxlbWVudHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiNzBjNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1N0YXR1c19zZXRfZWxlbWVudHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9TdGF0dXNfc2V0X2VsZW1lbnRzPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9TdGF0dXNfc2V0X2VsZW1lbnRzPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1N0YXR1c19zZXRfZWxlbWVudHMoTVBJX1N0YXR1cyAqLCBNUElfRGF0YXR5cGUsIGludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1EZWZpbmVzIGVsZW1lbnQgaW5mb3JtYXRpb24gZm9yIGEgcmVxdWVzdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1Rlc3QuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVGVzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGE3ODBmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVGVzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1Rlc3Q8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1Rlc3Q8L0gzPgotPFBSRT4KLWludCBNUElfVGVzdChNUElfUmVxdWVzdCAqLCBpbnQgKiwgTVBJX1N0YXR1cyAqKTsKLTwvUFJFPgotPERMPjxERD4KLUNoZWNrcyB0byBzZWUgaWYgYSBub24tYmxvY2tpbmcgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UZXN0X2NhbmNlbGxlZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UZXN0X2NhbmNlbGxlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTZiNDAyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVGVzdF9jYW5jZWxsZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UZXN0X2NhbmNlbGxlZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVGVzdF9jYW5jZWxsZWQ8L0gzPgotPFBSRT4KLWludCBNUElfVGVzdF9jYW5jZWxsZWQoTVBJX1N0YXR1cyAqLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1UZXN0cyB3aGV0aGVyIGEgbm9uLWJsb2NraW5nIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVGVzdGFsbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UZXN0YWxsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTQ2MTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UZXN0YWxsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVGVzdGFsbDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVGVzdGFsbDwvSDM+Ci08UFJFPgotaW50IE1QSV9UZXN0YWxsKGludCwgTVBJX1JlcXVlc3QgKiwgaW50ICosIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1UZXN0cyBhIGNvbGxlY3Rpb24gb2Ygbm9uLWJsb2NraW5nIG9wZXJhdGlvbnMgZm9yIGNvbXBsZXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UZXN0YW55Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1Rlc3RhbnkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4YmQyMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1Rlc3RhbnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UZXN0YW55PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UZXN0YW55PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1Rlc3RhbnkoaW50LCBNUElfUmVxdWVzdCAqLCBpbnQgKiwgaW50ICosIE1QSV9TdGF0dXMgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1UZXN0cyBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYW55IHNwZWNpZmllZCBub24tYmxvY2tpbmcgb3BlcmF0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVGVzdHNvbWUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVGVzdHNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlZmYwNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1Rlc3Rzb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVGVzdHNvbWU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1Rlc3Rzb21lPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1Rlc3Rzb21lKGludCwgTVBJX1JlcXVlc3QgKiwgaW50ICosIGludCAqLCBNUElfU3RhdHVzICopOwotPC9QUkU+Ci08REw+PEREPgotVGVzdHMgYSBjb2xsZWN0aW9uIG9mIG5vbi1ibG9ja2luZyBvcGVyYXRpb25zIGZvciBjb21wbGV0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVG9wb190ZXN0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1RvcG9fdGVzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE2N2M2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVG9wb190ZXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVG9wb190ZXN0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9Ub3BvX3Rlc3Q8L0gzPgotPFBSRT4KLWludCBNUElfVG9wb190ZXN0KE1QSV9Db21tLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSB0eXBlIG9mIHZpcnR1YWwgdG9wb2xvZ3kgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdG9yLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jMmYuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jMmYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiNTdmZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfYzJmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9jMmY8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfYzJmPC9IMz4KLTxQUkU+Ci1NUElfRmludCBNUElfVHlwZV9jMmYoTVBJX0RhdGF0eXBlKTsKLTwvUFJFPgotPERMPjxERD4KLVRyYW5zbGF0ZXMgYSBDIGRhdGF0eXBlIGhhbmRsZSBpbnRvIGEgRk9SVFJBTiBoYW5kbGUgdG8gdGhlIHNhbWUgZGF0YXR5cGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NvbW1pdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NvbW1pdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzYwNmIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jb21taXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NvbW1pdDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9jb21taXQ8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9jb21taXQoTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotTWFrZXMgYSBkYXRhdHlwZSByZWFkeSBmb3IgdXNlIGluIGNvbW11bmljYXRpb24uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NvbnRpZ3VvdXMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jb250aWd1b3VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTlhZTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NvbnRpZ3VvdXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NvbnRpZ3VvdXM8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfY29udGlndW91czwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2NvbnRpZ3VvdXMoaW50LCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGNvdW50IGluc3RhbmNlcyBvZm9sZHR5cGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9kYXJyYXkuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfZGFycmF5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhN2NiY2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9kYXJyYXkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NyZWF0ZV9kYXJyYXk8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfY3JlYXRlX2RhcnJheTwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2NyZWF0ZV9kYXJyYXkoaW50LCBpbnQsIGludCwgaW50IFtdLCBpbnQgW10sIGludCBbXSwgaW50IFtdLCBpbnQsTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1HZW5lcmF0ZXMgdGhlIGRhdGF0eXBlcyBjb3JyZXNwb25kaW5nIHRvIGFuIEhQRi1saWtlIGRpc3RyaWJ1dGlvbiBvZiBhbiBuZGltcy1kaW1lbnNpb25hbCBhcnJheSBvZiBvbGR0eXBlIGVsZW1lbnRzIG9udG8gYW5uZGltcy1kaW1lbnNpb25hbCBncmlkIG9mIGxvZ2ljYWwgdGFza3MuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9mOTBfY29tcGxleC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9mOTBfY29tcGxleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVmYzM2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfZjkwX2NvbXBsZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NyZWF0ZV9mOTBfY29tcGxleDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9jcmVhdGVfZjkwX2NvbXBsZXg8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9jcmVhdGVfZjkwX2NvbXBsZXgoIGludCwgaW50LCBNUElfRGF0YXR5cGUgKiApOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIHByZWRlZmluZWQgTVBJIGRhdGF0eXBlIHRoYXQgbWF0Y2hlcyBhIENPTVBMRVggdmFyaWFibGUgb2YgS0lORCBzZWxlY3RlZF9yZWFsX2tpbmQocCwgcikuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9mOTBfaW50ZWdlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9mOTBfaW50ZWdlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDRmZjY5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfZjkwX2ludGVnZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NyZWF0ZV9mOTBfaW50ZWdlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9jcmVhdGVfZjkwX2ludGVnZXI8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9jcmVhdGVfZjkwX2ludGVnZXIoIGludCwgTVBJX0RhdGF0eXBlICogKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgYSBwcmVkZWZpbmVkIE1QSSBkYXRhdHlwZSB0aGF0IG1hdGNoZXMgYW4gSU5URUdFUiB2YXJpYWJsZSBvZiBLSU5EIHNlbGVjdGVkX2ludGVnZXJfa2luZChyKS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2Y5MF9yZWFsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2Y5MF9yZWFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkN2E4ZGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9mOTBfcmVhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfY3JlYXRlX2Y5MF9yZWFsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX2NyZWF0ZV9mOTBfcmVhbDwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2NyZWF0ZV9mOTBfcmVhbCggaW50LCBpbnQsIE1QSV9EYXRhdHlwZSAqICk7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIGEgcHJlZGVmaW5lZCBNUEkgZGF0YXR5cGUgdGhhdCBtYXRjaGVzIGEgUkVBTCB2YXJpYWJsZSBvZiBLSU5EIHNlbGVjdGVkX3JlYWxfa2luZChwLCByKS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2hpbmRleGVkLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2hpbmRleGVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTZhZmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9oaW5kZXhlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfY3JlYXRlX2hpbmRleGVkPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX2NyZWF0ZV9oaW5kZXhlZDwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2NyZWF0ZV9oaW5kZXhlZChpbnQsIGludCBbXSwgTVBJX0FpbnQgW10sIE1QSV9EYXRhdHlwZSwgTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIG5ldyBkYXRhdHlwZSB0aGF0IHJlcHJlc2VudHNjb3VudCBibG9ja3MuIEVhY2ggYmxvY2sgaXMgZGVmaW5lZCBieSBhbiBlbnRyeSBpbiBhcnJheV9vZl9ibG9ja2xlbmd0aHMgYW5kYXJyYXlfb2ZfZGlzcGxhY2VtZW50cy4gRGlzcGxhY2VtZW50cyBhcmUgZXhwcmVzc2VkIGluIGJ5dGVzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfaHZlY3Rvci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9odmVjdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWE5YmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9odmVjdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9jcmVhdGVfaHZlY3RvcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9jcmVhdGVfaHZlY3RvcjwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2NyZWF0ZV9odmVjdG9yKGludCwgaW50LCBNUElfQWludCwgTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50cyBlcXVhbGx5LXNwYWNlZCBibG9ja3MuIFRoZSBzcGFjaW5nIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2sgaXMgZ2l2ZW4gaW4gYnl0ZXMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9pbmRleGVkX2Jsb2NrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2luZGV4ZWRfYmxvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4MjU3Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2luZGV4ZWRfYmxvY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NyZWF0ZV9pbmRleGVkX2Jsb2NrPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX2NyZWF0ZV9pbmRleGVkX2Jsb2NrPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfY3JlYXRlX2luZGV4ZWRfYmxvY2soaW50LCBpbnQsIGludCBbXSwgTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50c2NvdW50IGJsb2Nrcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2tleXZhbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9rZXl2YWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYzYyMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX2tleXZhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfY3JlYXRlX2tleXZhbDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9jcmVhdGVfa2V5dmFsPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfY3JlYXRlX2tleXZhbChNUElfVHlwZV9jb3B5X2F0dHJfZnVuY3Rpb24gKiwgTVBJX1R5cGVfZGVsZXRlX2F0dHJfZnVuY3Rpb24gKiwgaW50ICosIHZvaWQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1HZW5lcmF0ZXMgYSBuZXcgYXR0cmlidXRlIGtleSBmb3IgYSBkYXRhdHlwZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX3Jlc2l6ZWQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfcmVzaXplZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWU4YTNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfcmVzaXplZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfY3JlYXRlX3Jlc2l6ZWQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfY3JlYXRlX3Jlc2l6ZWQ8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9jcmVhdGVfcmVzaXplZChNUElfRGF0YXR5cGUsIE1QSV9BaW50LCBNUElfQWludCwgTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotRHVwbGljYXRlcyBhIGRhdGF0eXBlIGFuZCBjaGFuZ2VzIHRoZSB1cHBlciBib3VuZCwgbG93ZXIgYm91bmQsIGFuZCBleHRlbnQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3QuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfc3RydWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjIxZGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3Q8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfY3JlYXRlX3N0cnVjdDwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3QoaW50LCBpbnQgW10sIE1QSV9BaW50IFtdLCBNUElfRGF0YXR5cGUgW10sIE1QSV9EYXRhdHlwZSAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzY291bnQgYmxvY2tzLiBFYWNoIGJsb2NrIGlzIGRlZmluZWQgYnkgYW4gZW50cnkgaW4gYXJyYXlfb2ZfYmxvY2tsZW5ndGhzLGFycmF5X29mX2Rpc3BsYWNlbWVudHMsIGFuZCBhcnJheV9vZl90eXBlcy4gRGlzcGxhY2VtZW50cyBhcmUgZXhwcmVzc2VkIGluIGJ5dGVzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfc3ViYXJyYXkuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9jcmVhdGVfc3ViYXJyYXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3NWFkNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfY3JlYXRlX3N1YmFycmF5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9jcmVhdGVfc3ViYXJyYXk8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfY3JlYXRlX3N1YmFycmF5PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfY3JlYXRlX3N1YmFycmF5KGludCwgaW50IFtdLCBpbnQgW10sIGludCBbXSwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzIGFubmRpbXMtZGltZW5zaW9uYWwgc3ViYXJyYXkgb2YgYW5uZGltcy1kaW1lbnNpb25hbCBhcnJheS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZGVsZXRlX2F0dHIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9kZWxldGVfYXR0ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDNkMzEyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9kZWxldGVfYXR0ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfZGVsZXRlX2F0dHI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZGVsZXRlX2F0dHI8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9kZWxldGVfYXR0cihNUElfRGF0YXR5cGUsIGludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1EZWxldGVzIGFuIGF0dHJpYnV0ZSBmcm9tIGEgZGF0YXR5cGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2R1cC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2R1cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjc0NzI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9kdXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2R1cDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9kdXA8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9kdXAoTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1EdXBsaWNhdGVzIHRoZSBleGlzdGluZyB0eXBlIHdpdGggYXNzb2NpYXRlZCBrZXkgdmFsdWVzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9leHRlbnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9leHRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwYzNiYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZXh0ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9leHRlbnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZXh0ZW50PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfZXh0ZW50KE1QSV9EYXRhdHlwZSwgTVBJX0FpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBleHRlbnQgb2YgYW55IGRlZmluZWQgZGF0YXR5cGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2YyYy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2YyYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2U4MzBiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9mMmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2YyYzwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9mMmM8L0gzPgotPFBSRT4KLU1QSV9EYXRhdHlwZSBNUElfVHlwZV9mMmMoTVBJX0ZpbnQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIEMgaGFuZGxlIHRvIGEgZGF0YXR5cGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2ZyZWUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9mcmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDBiNmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2ZyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2ZyZWU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZnJlZTwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2ZyZWUoTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotTWFya3MgYSBkZXJpdmVkIGRhdGF0eXBlIGZvciBkZWFsbG9jYXRpb24gYW5kIHNldHMgaXRzIGhhbmRsZSB0byBNUElfREFUQVRZUEVfTlVMTC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZnJlZV9rZXl2YWwuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9mcmVlX2tleXZhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdmY2UxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9mcmVlX2tleXZhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfZnJlZV9rZXl2YWw8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZnJlZV9rZXl2YWw8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9mcmVlX2tleXZhbChpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1GcmVlcyBhIGRhdGF0eXBlIGtleSB2YWx1ZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X2F0dHIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfYXR0ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTg5ZDU2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfYXR0ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfZ2V0X2F0dHI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZ2V0X2F0dHI8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9nZXRfYXR0cihNUElfRGF0YXR5cGUsIGludCwgdm9pZCAqLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1BdHRhY2hlcyBhbiBhdHRyaWJ1dGUgdG8gYSBkYXRhdHlwZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X2NvbnRlbnRzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X2NvbnRlbnRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWJhNjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2dldF9jb250ZW50cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfZ2V0X2NvbnRlbnRzPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX2dldF9jb250ZW50czwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2dldF9jb250ZW50cyhNUElfRGF0YXR5cGUsIGludCwgaW50LCBpbnQsIGludCBbXSwgTVBJX0FpbnQgW10sIE1QSV9EYXRhdHlwZSBbXSk7Ci08L1BSRT4KLTxETD48REQ+Ci1PYnRhaW5zIHRoZSBhcmd1bWVudHMgdXNlZCBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIGRhdGF0eXBlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfZW52ZWxvcGUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfZW52ZWxvcGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzYzFmMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X2VudmVsb3BlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9nZXRfZW52ZWxvcGU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZ2V0X2VudmVsb3BlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfZ2V0X2VudmVsb3BlKE1QSV9EYXRhdHlwZSwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotRGV0ZXJtaW5lcyB0aGUgY29uc3RydWN0b3IgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGRhdGF0eXBlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfZXh0ZW50Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X2V4dGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDdiYmQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfZXh0ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9nZXRfZXh0ZW50PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX2dldF9leHRlbnQ8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9nZXRfZXh0ZW50KE1QSV9EYXRhdHlwZSwgTVBJX0FpbnQgKiwgTVBJX0FpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBsb3dlciBib3VuZCBhbmQgdGhlIGV4dGVudCBvZiBhbnkgZGVmaW5lZCBkYXRhdHlwZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X25hbWUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfbmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZiNTYwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfbmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfZ2V0X25hbWU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZ2V0X25hbWU8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9nZXRfbmFtZShNUElfRGF0YXR5cGUsIGNoYXIgKiwgaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgbmFtZSB0aGF0IHdhcyBsYXN0IGFzc29jaWF0ZWQgd2l0aCBhIGRhdGF0eXBlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfdHJ1ZV9leHRlbnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9nZXRfdHJ1ZV9leHRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2YWJjOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfZ2V0X3RydWVfZXh0ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9nZXRfdHJ1ZV9leHRlbnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfZ2V0X3RydWVfZXh0ZW50PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfZ2V0X3RydWVfZXh0ZW50KE1QSV9EYXRhdHlwZSwgTVBJX0FpbnQgKiwgTVBJX0FpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSB0cnVlIGV4dGVudCBvZiBhbnkgZGVmaW5lZCBkYXRhdHlwZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfaGluZGV4ZWQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9oaW5kZXhlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2UzZGYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9oaW5kZXhlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfaGluZGV4ZWQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfaGluZGV4ZWQ8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9oaW5kZXhlZChpbnQsIGludCAqLCBNUElfQWludCAqLCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzY291bnQgZGlzdGluY3QgYmxvY2tzIHdpdGggb2Zmc2V0cyBleHByZXNzZWQgaW4gYnl0ZXMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2h2ZWN0b3IuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9odmVjdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWVjYWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2h2ZWN0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX2h2ZWN0b3I8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfaHZlY3RvcjwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2h2ZWN0b3IoaW50LCBpbnQsIE1QSV9BaW50LCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgYSBuZXcgZGF0YXR5cGUgb2YgY291bnQgYmxvY2tzIHdpdGggc3RyaWRlIGV4cHJlc3NlZCBpbiBieXRlcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfaW5kZXhlZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2luZGV4ZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1ZGY5MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfaW5kZXhlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfaW5kZXhlZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9pbmRleGVkPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfaW5kZXhlZChpbnQsIGludCAqLCBpbnQgKiwgTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50c2NvdW50IGJsb2NrcyB3aXRoIHN0cmlkZSBpbiB0ZXJtcyBvZiBkZWZpbmluZyB0eXBlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9sYi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2xiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZmI4MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX2xiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9sYjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9sYjwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX2xiKE1QSV9EYXRhdHlwZSwgTVBJX0FpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBsb3dlciBib3VuZCBvZiBhIGRhdGF0eXBlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9tYXRjaF9zaXplLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfbWF0Y2hfc2l6ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTEyMGFlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV9tYXRjaF9zaXplLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV9tYXRjaF9zaXplPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX21hdGNoX3NpemU8L0gzPgotPFBSRT4KLWludCBNUElfVHlwZV9tYXRjaF9zaXplKCBpbnQsIGludCwgTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIHJlZmVyZW5jZSAoaGFuZGxlKSB0byBvbmUgb2YgdGhlIHByZWRlZmluZWQgbmFtZWQgZGF0YXR5cGVzLCBub3QgYSBkdXBsaWNhdGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX3NldF9hdHRyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc2V0X2F0dHIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlNmZlNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc2V0X2F0dHIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX3NldF9hdHRyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX3NldF9hdHRyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfc2V0X2F0dHIoTVBJX0RhdGF0eXBlLCBpbnQsIHZvaWQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1BdHRhY2hlcyB0aGUgZGF0YXR5cGUgYXR0cmlidXRlIHZhbHVlIHRvIHRoZSBkYXRhdHlwZSBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBrZXkuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX3NldF9uYW1lLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc2V0X25hbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZjI1YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc2V0X25hbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9UeXBlX3NldF9uYW1lPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX3NldF9uYW1lPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfc2V0X25hbWUoTVBJX0RhdGF0eXBlLCBjaGFyICopOwotPC9QUkU+Ci08REw+PEREPgotQXNzb2NpYXRlcyBhIG5hbWUgc3RyaW5nIHdpdGggYSBkYXRhdHlwZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc2l6ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX3NpemUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzNGFmZi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc2l6ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfc2l6ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV9zaXplPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfc2l6ZShNUElfRGF0YXR5cGUsIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXByZXNlbnRlZCBieSBhbnkgZGVmaW5lZCBkYXRhdHlwZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc3RydWN0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfc3RydWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjBiMGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX3N0cnVjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1R5cGVfc3RydWN0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9UeXBlX3N0cnVjdDwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX3N0cnVjdChpbnQsIGludCAqLCBNUElfQWludCAqLCBNUElfRGF0YXR5cGUgKiwgTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIG5ldyBkYXRhdHlwZSB0aGF0IHJlcHJlc2VudHNjb3VudCBibG9ja3MsIGVhY2ggd2l0aCBhIGRpc3RpbmN0IGZvcm1hdCBhbmQgb2Zmc2V0LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV91Yi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX3ViLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDdhM2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9UeXBlX3ViLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV91YjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVHlwZV91YjwvSDM+Ci08UFJFPgotaW50IE1QSV9UeXBlX3ViKE1QSV9EYXRhdHlwZSwgTVBJX0FpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSB1cHBlciBib3VuZCBvZiBhIGRhdGF0eXBlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV92ZWN0b3IuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVHlwZV92ZWN0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhMDc1OS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1R5cGVfdmVjdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfVHlwZV92ZWN0b3I8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1R5cGVfdmVjdG9yPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1R5cGVfdmVjdG9yKGludCwgaW50LCBpbnQsIE1QSV9EYXRhdHlwZSwgTVBJX0RhdGF0eXBlICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIG5ldyBkYXRhdHlwZSB0aGF0IHJlcHJlc2VudHMgZXF1YWxseS1zcGFjZWQgYmxvY2tzIG9mIHJlcGxpY2F0ZWQgZGF0YS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1VucGFjay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9VbnBhY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkZmNlMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1VucGFjay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1VucGFjazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfVW5wYWNrPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1VucGFjayh2b2lkKiwgaW50LCBpbnQgKiwgdm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSwgTVBJX0NvbW0pOwotPC9QUkU+Ci08REw+PEREPgotVW5wYWNrcyB0aGUgbWVzc2FnZSBpbnRvIHRoZSBzcGVjaWZpZWQgcmVjZWl2ZSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIHBhY2tlZCBidWZmZXIuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9VbnBhY2tfZXh0ZXJuYWwuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfVW5wYWNrX2V4dGVybmFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OGFkNDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9VbnBhY2tfZXh0ZXJuYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9VbnBhY2tfZXh0ZXJuYWw8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1VucGFja19leHRlcm5hbDwvSDM+Ci08UFJFPgotaW50IE1QSV9VbnBhY2tfZXh0ZXJuYWwoY2hhciAqLCB2b2lkICosIE1QSV9BaW50LCBNUElfQWludCAqLCB2b2lkICosIGludCwgTVBJX0RhdGF0eXBlKTtpbnQgTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcihNUElfV2luX2VycmhhbmRsZXJfZm4gKiwgTVBJX0VycmhhbmRsZXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1VbnBhY2tzIHRoZSBtZXNzYWdlIGludG8gdGhlIHNwZWNpZmllZCByZWNlaXZlIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgcGFja2VkIGJ1ZmZlciwgdXNpbmcgdGhlIGV4dGVybmFsMzIgZGF0YSBmb3JtYXQuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XYWl0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MmU5My4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XYWl0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XYWl0PC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dhaXQoTVBJX1JlcXVlc3QgKiwgTVBJX1N0YXR1cyAqKTsKLTwvUFJFPgotPERMPjxERD4KLVdhaXRzIGZvciBhIG5vbi1ibG9ja2luZyBvcGVyYXRpb24gdG8gY29tcGxldGUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XYWl0YWxsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXRhbGwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4ZjQ3NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXRhbGwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XYWl0YWxsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XYWl0YWxsPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dhaXRhbGwoaW50LCBNUElfUmVxdWVzdCAqLCBNUElfU3RhdHVzICopOwotPC9QUkU+Ci08REw+PEREPgotV2FpdHMgZm9yIGEgY29sbGVjdGlvbiBvZiBub24tYmxvY2tpbmcgb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXRhbnkuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2FpdGFueS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGIxNjBhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2FpdGFueS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dhaXRhbnk8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dhaXRhbnk8L0gzPgotPFBSRT4KLWludCBNUElfV2FpdGFueShpbnQsIE1QSV9SZXF1ZXN0ICosIGludCAqLCBNUElfU3RhdHVzICopOwotPC9QUkU+Ci08REw+PEREPgotV2FpdHMgZm9yIGFueSBzcGVjaWZpZWQgbm9uLWJsb2NraW5nIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXRzb21lLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dhaXRzb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjdmYmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XYWl0c29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dhaXRzb21lPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XYWl0c29tZTwvSDM+Ci08UFJFPgotaW50IE1QSV9XYWl0c29tZShpbnQsIE1QSV9SZXF1ZXN0ICosIGludCAqLCBpbnQgKiwgTVBJX1N0YXR1cyAqKTsKLTwvUFJFPgotPERMPjxERD4KLVdhaXRzIGZvciBhdCBsZWFzdCBvbmUgb2YgYSBsaXN0IG9mIG5vbi1ibG9ja2luZyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2MyZi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fYzJmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYmVmMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fYzJmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfV2luX2MyZjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2MyZjwvSDM+Ci08UFJFPgotTVBJX0ZpbnQgTVBJX1dpbl9jMmYoTVBJX1dpbik7Ci08L1BSRT4KLTxETD48REQ+Ci1UcmFuc2xhdGVzIGEgQyB3aW5kb3cgaGFuZGxlIGludG8gYSBGT1JUUkFOIGhhbmRsZSB0byB0aGUgc2FtZSB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fY2FsbF9lcnJoYW5kbGVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jYWxsX2VycmhhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4ZTliOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jYWxsX2VycmhhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fY2FsbF9lcnJoYW5kbGVyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fY2FsbF9lcnJoYW5kbGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl9jYWxsX2VycmhhbmRsZXIoTVBJX1dpbiwgaW50KTsKLTwvUFJFPgotPERMPjxERD4KLUNhbGxzIHRoZSBlcnJvciBoYW5kbGVyIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgd2l0aCB0aGUgZXJyb3IgY29kZSBzdXBwbGllZC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jb21wbGV0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fY29tcGxldGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMjI1ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jb21wbGV0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl9jb21wbGV0ZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2NvbXBsZXRlPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl9jb21wbGV0ZShNUElfV2luKTsKLTwvUFJFPgotPERMPjxERD4KLUNvbXBsZXRlcyBhbiBSTUEgYWNjZXNzIGVwb2NoIG9uIGEgd2luZG93IG9iamVjdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jcmVhdGUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2NyZWF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDdhYzdmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2NyZWF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl9jcmVhdGU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dpbl9jcmVhdGU8L0gzPgotPFBSRT4KLWludCBNUElfV2luX2NyZWF0ZSh2b2lkICosIE1QSV9BaW50LCBpbnQsIE1QSV9JbmZvLCBNUElfQ29tbSwgTVBJX1dpbiAqKTsKLTwvUFJFPgotPERMPjxERD4KLUFsbG93cyBlYWNoIHRhc2sgaW4gYW4gaW50cmEtY29tbXVuaWNhdG9yIGdyb3VwIHRvIHNwZWNpZnkgYSAid2luZG93IiBpbiBpdHMgbWVtb3J5IHRoYXQgaXMgbWFkZSBhY2Nlc3NpYmxlIHRvIGFjY2Vzc2VzIGJ5IHJlbW90ZSB0YXNrcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fY3JlYXRlX2VycmhhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MDdiNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcjwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2NyZWF0ZV9lcnJoYW5kbGVyPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcihNUElfV2luX2VycmhhbmRsZXJfZm4gKiwgTVBJX0VycmhhbmRsZXIgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1DcmVhdGVzIGFuIGVycm9yIGhhbmRsZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gd2luZG93cy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jcmVhdGVfa2V5dmFsLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9jcmVhdGVfa2V5dmFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjA1NmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fY3JlYXRlX2tleXZhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl9jcmVhdGVfa2V5dmFsPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fY3JlYXRlX2tleXZhbDwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fY3JlYXRlX2tleXZhbChNUElfV2luX2NvcHlfYXR0cl9mdW5jdGlvbiAqLCBNUElfV2luX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uICosIGludCAqLCB2b2lkICopOwotPC9QUkU+Ci08REw+PEREPgotR2VuZXJhdGVzIGEgbmV3IHdpbmRvdyBhdHRyaWJ1dGUga2V5LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2RlbGV0ZV9hdHRyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9kZWxldGVfYXR0ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDhkMWU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2RlbGV0ZV9hdHRyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfV2luX2RlbGV0ZV9hdHRyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fZGVsZXRlX2F0dHI8L0gzPgotPFBSRT4KLWludCBNUElfV2luX2RlbGV0ZV9hdHRyKE1QSV9XaW4sIGludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1EZWxldGVzIGFuIGF0dHJpYnV0ZSBmcm9tIGEgd2luZG93LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2YyYy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZjJjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTZkY2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZjJjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfV2luX2YyYzwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2YyYzwvSDM+Ci08UFJFPgotTVBJX1dpbiBNUElfV2luX2YyYyhNUElfRmludCk7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIGEgQyBoYW5kbGUgdG8gYSB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZmVuY2UuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2ZlbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTg2NGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZmVuY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fZmVuY2U8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dpbl9mZW5jZTwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fZmVuY2UoaW50LCBNUElfV2luKTsKLTwvUFJFPgotPERMPjxERD4KLVN5bmNocm9uaXplcyBSTUEgY2FsbHMgb24gYSB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZnJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc5NGUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2ZyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fZnJlZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2ZyZWU8L0gzPgotPFBSRT4KLWludCBNUElfV2luX2ZyZWUoTVBJX1dpbiAqKTsKLTwvUFJFPgotPERMPjxERD4KLUZyZWVzIHRoZSB3aW5kb3cgb2JqZWN0IGFuZCByZXR1cm5zIGEgbnVsbCBoYW5kbGUgKGVxdWFsIHRvIE1QSV9XSU5fTlVMTCkuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZnJlZV9rZXl2YWwuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2ZyZWVfa2V5dmFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjNkM2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZnJlZV9rZXl2YWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fZnJlZV9rZXl2YWw8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dpbl9mcmVlX2tleXZhbDwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fZnJlZV9rZXl2YWwoaW50ICopOwotPC9QUkU+Ci08REw+PEREPgotTWFya3MgYSB3aW5kb3cgYXR0cmlidXRlIGtleSBmb3IgZGVhbGxvY2F0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2dldF9hdHRyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9nZXRfYXR0ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdiY2RjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2dldF9hdHRyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfV2luX2dldF9hdHRyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fZ2V0X2F0dHI8L0gzPgotPFBSRT4KLWludCBNUElfV2luX2dldF9hdHRyKE1QSV9XaW4sIGludCwgdm9pZCAqLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXRyaWV2ZXMgdGhlIHdpbmRvdyBhdHRyaWJ1dGUgdmFsdWUgaWRlbnRpZmllZCBieSB0aGUga2V5LgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2dldF9lcnJoYW5kbGVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9nZXRfZXJyaGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODRkMWJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2dldF9lcnJoYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfV2luX2dldF9lcnJoYW5kbGVyPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fZ2V0X2VycmhhbmRsZXI8L0gzPgotPFBSRT4KLWludCBNUElfV2luX2dldF9lcnJoYW5kbGVyKE1QSV9XaW4sIE1QSV9FcnJoYW5kbGVyICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0cmlldmVzIHRoZSBlcnJvciBoYW5kbGVyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYSB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZ2V0X2dyb3VwLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9nZXRfZ3JvdXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3ZDkyYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9nZXRfZ3JvdXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fZ2V0X2dyb3VwPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fZ2V0X2dyb3VwPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl9nZXRfZ3JvdXAoTVBJX1dpbiwgTVBJX0dyb3VwICopOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ3JvdXAgb2YgdGhlIGNvbW11bmljYXRvciB1c2VkIHRvIGNyZWF0ZSBhIHdpbmRvdy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9nZXRfbmFtZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fZ2V0X25hbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5Y2I2Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9nZXRfbmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl9nZXRfbmFtZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2dldF9uYW1lPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl9nZXRfbmFtZShNUElfV2luLCBjaGFyICosIGludCAqKTsKLTwvUFJFPgotPERMPjxERD4KLVJldHVybnMgdGhlIG5hbWUgdGhhdCB3YXMgbGFzdCBhc3NvY2lhdGVkIHdpdGggYSB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fbG9jay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fbG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTJkYWQ2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX2xvY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX2xvY2s8L0gzPgotPFBSRT4KLWludCBNUElfV2luX2xvY2soaW50LCBpbnQsIGludCwgTVBJX1dpbik7Ci08L1BSRT4KLTxETD48REQ+Ci1TdGFydHMgYW4gUk1BIGFjY2VzcyBlcG9jaCBhdCB0aGUgdGFyZ2V0IHRhc2suCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fcG9zdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fcG9zdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjc3MGFiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX3Bvc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fcG9zdDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX3Bvc3Q8L0gzPgotPFBSRT4KLWludCBNUElfV2luX3Bvc3QoTVBJX0dyb3VwLCBpbnQsIE1QSV9XaW4pOwotPC9QUkU+Ci08REw+PEREPgotU3RhcnRzIGFuIFJNQSBleHBvc3VyZSBlcG9jaCBmb3IgYSBsb2NhbCB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc2V0X2F0dHIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX3NldF9hdHRyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTkwODMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc2V0X2F0dHIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fc2V0X2F0dHI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dpbl9zZXRfYXR0cjwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fc2V0X2F0dHIoTVBJX1dpbiwgaW50LCB2b2lkICopOwotPC9QUkU+Ci08REw+PEREPgotQXR0YWNoZXMgdGhlIHdpbmRvdyBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIHdpbmRvdyBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBrZXkuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc2V0X2VycmhhbmRsZXIuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX3NldF9lcnJoYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYWExMDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc2V0X2VycmhhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fc2V0X2VycmhhbmRsZXI8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dpbl9zZXRfZXJyaGFuZGxlcjwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fc2V0X2VycmhhbmRsZXIoTVBJX1dpbiwgTVBJX0VycmhhbmRsZXIpOwotPC9QUkU+Ci08REw+PEREPgotQXR0YWNoZXMgYSBuZXcgZXJyb3IgaGFuZGxlciB0byBhIHdpbmRvdy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9zZXRfbmFtZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc2V0X25hbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlNmY0MS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl9zZXRfbmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl9zZXRfbmFtZTwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV2luX3NldF9uYW1lPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl9zZXRfbmFtZShNUElfV2luLCBjaGFyICopOwotPC9QUkU+Ci08REw+PEREPgotQXNzb2NpYXRlcyBhIG5hbWUgc3RyaW5nIHdpdGggYSB3aW5kb3cuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc3RhcnQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV2luX3N0YXJ0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzFiMDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fc3RhcnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fc3RhcnQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1dpbl9zdGFydDwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fc3RhcnQoTVBJX0dyb3VwLCBpbnQsIE1QSV9XaW4pOwotPC9QUkU+Ci08REw+PEREPgotU3RhcnRzIGFuIFJNQSBhY2Nlc3MgZXBvY2ggZm9yIGEgd2luZG93IG9iamVjdC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl90ZXN0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl90ZXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMjkyMWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fdGVzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl90ZXN0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fdGVzdDwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fdGVzdChNUElfV2luLCBpbnQgKik7Ci08L1BSRT4KLTxETD48REQ+Ci1UcmllcyB0byBjb21wbGV0ZSBhbiBSTUEgZXhwb3N1cmUgZXBvY2guCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fdW5sb2NrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl91bmxvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjNGU0NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl91bmxvY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XaW5fdW5sb2NrPC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fdW5sb2NrPC9IMz4KLTxQUkU+Ci1pbnQgTVBJX1dpbl91bmxvY2soaW50LCBNUElfV2luKTsKLTwvUFJFPgotPERMPjxERD4KLUNvbXBsZXRlcyBhbiBSTUEgYWNjZXNzIGVwb2NoIGF0IHRoZSB0YXJnZXQgdGFzay4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl93YWl0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1dpbl93YWl0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTZjOGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XaW5fd2FpdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TVBJX1dpbl93YWl0PC90aXRsZT4KLTxib2R5PgotPEgzPk1QSV9XaW5fd2FpdDwvSDM+Ci08UFJFPgotaW50IE1QSV9XaW5fd2FpdChNUElfV2luKTsKLTwvUFJFPgotPERMPjxERD4KLUNvbXBsZXRlcyBhbiBSTUEgZXhwb3N1cmUgZXBvY2guCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XdGljay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9odG1sL01QSV9XdGljay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGMwZTBkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV3RpY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1QSV9XdGljazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5NUElfV3RpY2s8L0gzPgotPFBSRT4KLWRvdWJsZSBNUElfV3RpY2sodm9pZCk7Ci08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIE1QSV9XVElNRSBpbiBzZWNvbmRzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV3RpbWUuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaHRtbC9NUElfV3RpbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzMGEyMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL2h0bWwvTVBJX1d0aW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NUElfV3RpbWU8L3RpdGxlPgotPGJvZHk+Ci08SDM+TVBJX1d0aW1lPC9IMz4KLTxQUkU+Ci1kb3VibGUgTVBJX1d0aW1lKHZvaWQpOwotPC9QUkU+Ci08REw+PEREPgotUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aW1lIGFzIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9pY29ucy8uY3ZzaWdub3JlIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9pY29ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmYyZWI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaWNvbnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBzcGJyd3NlLmpiZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9pY29ucy9tcGkuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9pY29ucy9tcGkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTJiMjhhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvaWNvbnMvbXBpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvbXBpcmVmLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvbXBpcmVmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZTY4Yy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL21waXJlZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGFsbEZ1bmN0aW9ucz4KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQWJvcnQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpBYm9ydDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQUJPUlQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Gb3JjZXMgYWxsIHRhc2tzIG9mIGFuIE1QSSBqb2IgdG8gdGVybWluYXRlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0Fib3J0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50PC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQWNjdW11bGF0ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Oldpbjo6QWNjdW11bGF0ZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQUNDVU1VTEFURTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFjY3VtdWxhdGVzLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCByZWR1Y3Rpb24gb3BlcmF0aW9uLCB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbiBidWZmZXIgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgYnVmZmVyLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0FjY3VtdWxhdGU8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQgKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0FpbnQsIGludCwgTVBJX0RhdGF0eXBlLCAgTVBJX09wLCBNUElfV2luPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQWRkX2Vycm9yX2NsYXNzPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6QWRkX2Vycm9yX2NsYXNzPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9BRERfRVJST1JfQ0xBU1M8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgbmV3IGVycm9yIGNsYXNzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgaXQuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQWRkX2Vycm9yX2NsYXNzPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0FkZF9lcnJvcl9jb2RlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6QWRkX2Vycm9yX2NvZGU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0FERF9FUlJPUl9DT0RFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIG5ldyBlcnJvciBjb2RlIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgaXQuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQWRkX2Vycm9yX2NvZGU8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9BZGRfZXJyb3Jfc3RyaW5nPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6QWRkX2Vycm9yX3N0cmluZzwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQUREX0VSUk9SX1NUUklORzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFzc29jaWF0ZXMgYW4gZXJyb3Igc3RyaW5nIHdpdGggYW4gZXJyb3IgY29kZSBvciBjbGFzcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BZGRfZXJyb3Jfc3RyaW5nPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQsIGNoYXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0FkZHJlc3M8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9BRERSRVNTPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIGxvY2F0aW9uIGluIG1lbW9yeS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BZGRyZXNzPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiwgTVBJX0FpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0FsbGdhdGhlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkFsbGdhdGhlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQUxMR0FUSEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q29sbGVjdHMgbWVzc2FnZXMgZnJvbSBlYWNoIHRhc2sgYW5kIGRpc3RyaWJ1dGVzIHRoZSByZXN1bHRpbmcgbWVzc2FnZSB0byBlYWNoLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0FsbGdhdGhlcjwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCogLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfQ29tbTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0FsbGdhdGhlcnY8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpBbGxnYXRoZXJ2PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9BTExHQVRIRVJWPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q29sbGVjdHMgbWVzc2FnZXMgZnJvbSBlYWNoIHRhc2sgYW5kIGRpc3RyaWJ1dGVzIHRoZSByZXN1bHRpbmcgbWVzc2FnZSB0byBhbGwgdGFza3MuIE1lc3NhZ2VzIGNhbiBoYXZlIHZhcmlhYmxlIHNpemVzIGFuZCBkaXNwbGFjZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0FsbGdhdGhlcnY8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqICwgaW50LCBNUElfRGF0YXR5cGUsIHZvaWQqLCBpbnQgKiwgaW50ICosIE1QSV9EYXRhdHlwZSwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9BbGxvY19tZW08L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpBbGxvY19tZW08L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0FMTE9DX01FTTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFsbG9jYXRlcyBzdG9yYWdlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BbGxvY19tZW08L25hbWU+Ci08YXJndW1lbnRzPk1QSV9BaW50LCBNUElfSW5mbyBpbmZvLCB2b2lkICpiYXNlcHRyPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQWxscmVkdWNlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6QWxscmVkdWNlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9BTExSRURVQ0U8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5BcHBsaWVzIGEgcmVkdWN0aW9uIG9wZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BbGxyZWR1Y2U8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqICwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfT3AsIE1QSV9Db21tPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQWxsdG9hbGw8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpBbGx0b2FsbDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQUxMVE9BTEw8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5TZW5kcyBhIGRpc3RpbmN0IG1lc3NhZ2UgZnJvbSBlYWNoIHRhc2sgdG8gZXZlcnkgdGFzay48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BbGx0b2FsbDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCogLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfQ29tbTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0FsbHRvYWxsdjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkFsbHRvYWxsdjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQUxMVE9BTExWPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+U2VuZHMgYSBkaXN0aW5jdCBtZXNzYWdlIGZyb20gZWFjaCB0YXNrIHRvIGV2ZXJ5IHRhc2suIE1lc3NhZ2VzIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcyBhbmQgZGlzcGxhY2VtZW50cy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BbGx0b2FsbHY8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqICwgaW50ICosIGludCAqLCBNUElfRGF0YXR5cGUsIHZvaWQqLCBpbnQgKiwgaW50ICosIE1QSV9EYXRhdHlwZSwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9BbGx0b2FsbHc8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpBbGx0b2FsbHc8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0FMTFRPQUxMVzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlNlbmRzIGEgZGlzdGluY3QgbWVzc2FnZSBmcm9tIGVhY2ggdGFzayB0byBldmVyeSB0YXNrLiBNZXNzYWdlcyBjYW4gaGF2ZSBkaWZmZXJlbnQgZGF0YXR5cGVzLCBzaXplcywgYW5kIGRpc3BsYWNlbWVudHMuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQWxsdG9hbGx3PC9uYW1lPgotPGFyZ3VtZW50cz52b2lkICosIGludCBbXSwgaW50IFtdLCBNUElfRGF0YXR5cGUgW10sIHZvaWQgKiwgaW50IFtdLCBpbnQgW10sIE1QSV9EYXRhdHlwZSBbXSwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9BdHRyX2RlbGV0ZTwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0FUVFJfREVMRVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmVtb3ZlcyBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BdHRyX2RlbGV0ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0F0dHJfZ2V0PC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQVRUUl9HRVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgYW4gYXR0cmlidXRlIHZhbHVlIGZyb20gYSBjb21tdW5pY2F0b3IuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQXR0cl9nZXQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQsIHZvaWQgKiwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9BdHRyX3B1dDwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0FUVFJfUFVUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgdmFsdWUgd2l0aCBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9BdHRyX3B1dDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgdm9pZCo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9CYXJyaWVyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6QmFycmllcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQkFSUklFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkJsb2NrcyBlYWNoIHRhc2sgdW50aWwgYWxsIHRhc2tzIGhhdmUgY2FsbGVkIGl0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0JhcnJpZXI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tIDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0JjYXN0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6QmNhc3Q8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0JDQVNUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QnJvYWRjYXN0cyBhIG1lc3NhZ2UgZnJvbSByb290IHRvIGFsbCB0YXNrcyBpbiB0aGUgZ3JvdXAuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQmNhc3Q8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBNUElfQ29tbSA8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Cc2VuZDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkJzZW5kPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9CU0VORDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlBlcmZvcm1zIGEgYmxvY2tpbmcgYnVmZmVyZWQgbW9kZSBzZW5kIG9wZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Cc2VuZDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Cc2VuZF9pbml0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6QnNlbmRfaW5pdDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQlNFTkRfSU5JVDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBwZXJzaXN0ZW50IGJ1ZmZlcmVkIG1vZGUgc2VuZCByZXF1ZXN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0JzZW5kX2luaXQ8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LGludCwgTVBJX0NvbW0sIE1QSV9SZXF1ZXN0ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9CdWZmZXJfYXR0YWNoPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6QXR0YWNoX2J1ZmZlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQlVGRkVSX0FUVEFDSDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlByb3ZpZGVzIE1QSSB3aXRoIGEgbWVzc2FnZSBidWZmZXIgZm9yIHNlbmRpbmcuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQnVmZmVyX2F0dGFjaDwvbmFtZT4KLTxhcmd1bWVudHM+IHZvaWQqLCBpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9CdWZmZXJfZGV0YWNoPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGV0YWNoX2J1ZmZlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQlVGRkVSX0RFVEFDSDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkRldGFjaGVzIHRoZSBjdXJyZW50IGJ1ZmZlci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9CdWZmZXJfZGV0YWNoPC9uYW1lPgotPGFyZ3VtZW50cz4gdm9pZCosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ2FuY2VsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6UmVxdWVzdDo6Q2FuY2VsPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DQU5DRUw8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5NYXJrcyBhIG5vbi1ibG9ja2luZyBvcGVyYXRpb24gZm9yIGNhbmNlbGxhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9DYW5jZWw8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9SZXF1ZXN0ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9DYXJ0X2Nvb3JkczwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNhcnRjb21tOjpHZXRfY29vcmRzPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DQVJUX0NPT1JEUzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlRyYW5zbGF0ZXMgdGFzayByYW5rIGluIGEgY29tbXVuaWNhdG9yIGludG8gQ2FydGVzaWFuIHRhc2sgY29vcmRpbmF0ZXMuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ2FydF9jb29yZHM8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQsIGludCwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9DYXJ0X2NyZWF0ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkludHJhY29tbTo6Q3JlYXRlX2NhcnQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0NBUlRfQ1JFQVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIGNvbW11bmljYXRvciBjb250YWluaW5nIHRvcG9sb2d5IGluZm9ybWF0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NhcnRfY3JlYXRlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50LCBpbnQgKiwgaW50ICosIGludCwgTVBJX0NvbW0gKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NhcnRfZ2V0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q2FydGNvbW06OkdldF90b3BvPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DQVJUX0dFVDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHJpZXZlcyBDYXJ0ZXNpYW4gdG9wb2xvZ3kgaW5mb3JtYXRpb24gZnJvbSBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9DYXJ0X2dldDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgaW50ICosIGludCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NhcnRfbWFwPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q2FydGNvbW06Ok1hcDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ0FSVF9NQVA8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Db21wdXRlcyBwbGFjZW1lbnQgb2YgdGFza3Mgb24gdGhlIHBoeXNpY2FsIHByb2Nlc3Nvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9DYXJ0X21hcDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgaW50ICosIGludCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NhcnRfcmFuazwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNhcnRjb21tOjpHZXRfY2FydF9yYW5rPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DQVJUX1JBTks8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5UcmFuc2xhdGVzIHRhc2sgY29vcmRpbmF0ZXMgaW50byBhIHRhc2sgcmFuay48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9DYXJ0X3Jhbms8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQgKiwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9DYXJ0X3NoaWZ0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q2FydGNvbW06OlNoaWZ0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DQVJUX1NISUZUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBzaGlmdGVkIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmFua3MgZm9yIGEgdGFzay48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9DYXJ0X3NoaWZ0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50LCBpbnQsIGludCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NhcnRfc3ViPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q2FydGNvbW06OlN1YjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ0FSVF9TVUI8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QYXJ0aXRpb25zIGEgQ2FydGVzaWFuIGNvbW11bmljYXRvciBpbnRvIGxvd2VyLWRpbWVuc2lvbmFsIHN1Ymdyb3Vwcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9DYXJ0X3N1YjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCAqLCBNUElfQ29tbSAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ2FydGRpbV9nZXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDYXJ0Y29tbTo6R2V0X2RpbTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ0FSVERJTV9HRVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBDYXJ0ZXNpYW4gZGltZW5zaW9ucyBmcm9tIGEgY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NhcnRkaW1fZ2V0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Db21tX2MyZjwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+KG5vbmUpPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJhbnNsYXRlcyBhIEMgY29tbXVuaWNhdG9yIGhhbmRsZSBpbnRvIGEgRk9SVFJBTiBoYW5kbGUgdG8gdGhlIHNhbWUgY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+TVBJX0ZpbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9jMmY8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9jYWxsX2VycmhhbmRsZXI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpDYWxsX2VycmhhbmRsZXI8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0NPTU1fQ0FMTF9FUlJIQU5ETEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q2FsbHMgdGhlIGVycm9yIGhhbmRsZXIgYXNzaWduZWQgdG8gdGhlIGNvbW11bmljYXRvciB3aXRoIHRoZSBlcnJvciBjb2RlIHN1cHBsaWVkLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NvbW1fY2FsbF9lcnJoYW5kbGVyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50PC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9jb21wYXJlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6Q29tcGFyZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9DT01QQVJFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q29tcGFyZXMgdGhlIGdyb3VwcyBhbmQgY29udGV4dHMgb2YgdHdvIGNvbW11bmljYXRvcnMuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9jb21wYXJlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgTVBJX0NvbW0sIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9jcmVhdGU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbnRlcmNvbW06OkNyZWF0ZSw8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJOjpJbnRyYWNvbW06OkNyZWF0ZTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBuZXcgY29tbXVuaWNhdG9yIHdpdGggYSBnaXZlbiBncm91cC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX2NyZWF0ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIE1QSV9Hcm91cCwgTVBJX0NvbW0gKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpDcmVhdGVfZXJyaGFuZGxlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9DUkVBVEVfRVJSSEFORExFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYW4gZXJyb3IgaGFuZGxlciB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBjb21tdW5pY2F0b3JzLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tX2VycmhhbmRsZXJfZm4gKiwgTVBJX0VycmhhbmRsZXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fY3JlYXRlX2tleXZhbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkNyZWF0ZV9rZXl2YWw8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0NPTU1fQ1JFQVRFX0tFWVZBTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkdlbmVyYXRlcyBhIG5ldyBjb21tdW5pY2F0b3IgYXR0cmlidXRlIGtleS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX2NyZWF0ZV9rZXl2YWw8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tX2NvcHlfYXR0cl9mdW5jdGlvbiAqLCBNUElfQ29tbV9kZWxldGVfYXR0cl9mdW5jdGlvbiAqLCBpbnQgKiwgdm9pZCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9kZWxldGVfYXR0cjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkRlbGV0ZV9hdHRyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DT01NX0RFTEVURV9BVFRSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmVtb3ZlcyBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX2RlbGV0ZV9hdHRyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50PC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9kdXA8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDYXJ0Y29tbTo6RHVwLDwvY3BwbmFtZT4KLTxmbmFtZT5NUEk6OkdyYXBoY29tbTo6RHVwLDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBuZXcgY29tbXVuaWNhdG9yIHRoYXQgaXMgYSBkdXBsaWNhdGUgb2YgYW4gZXhpc3RpbmcgY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NvbW1fZHVwPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgTVBJX0NvbW0gKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fZjJjPC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT4obm9uZSk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgQyBoYW5kbGUgdG8gYSBjb21tdW5pY2F0b3IuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5NUElfQ29tbTwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX2YyYzwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Db21tX2ZyZWU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpGcmVlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DT01NX0ZSRUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5NYXJrcyBhIGNvbW11bmljYXRvciBmb3IgZGVhbGxvY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NvbW1fZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0gKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fZnJlZV9rZXl2YWw8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpGcmVlX2tleXZhbDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9GUkVFX0tFWVZBTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPk1hcmtzIGEgY29tbXVuaWNhdG9yIGF0dHJpYnV0ZSBrZXkgZm9yIGRlYWxsb2NhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX2ZyZWVfa2V5dmFsPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fZ2V0X2F0dHI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpHZXRfYXR0cjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9HRVRfQVRUUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHJpZXZlcyB0aGUgY29tbXVuaWNhdG9yIGF0dHJpYnV0ZSB2YWx1ZSBpZGVudGlmaWVkIGJ5IHRoZSBrZXkuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9nZXRfYXR0cjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgdm9pZCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fZ2V0X2VycmhhbmRsZXI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpHZXRfZXJyaGFuZGxlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9HRVRfRVJSSEFORExFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHJpZXZlcyB0aGUgZXJyb3IgaGFuZGxlciBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NvbW1fZ2V0X2VycmhhbmRsZXI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBNUElfRXJyaGFuZGxlciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9nZXRfbmFtZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkdldF9uYW1lPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DT01NX0dFVF9OQU1FPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgbmFtZSB0aGF0IHdhcyBsYXN0IGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX2dldF9uYW1lPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgY2hhciAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fZ3JvdXA8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpHZXRfZ3JvdXA8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0NPTU1fR1JPVVA8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBncm91cCBoYW5kbGUgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0NvbW1fZ3JvdXA8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBNUElfR3JvdXAgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fcmFuazwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkdldF9yYW5rPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DT01NX1JBTks8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSByYW5rIG9mIHRoZSBsb2NhbCB0YXNrIGluIHRoZSBncm91cCBhc3NvY2lhdGVkIHdpdGggYSBjb21tdW5pY2F0b3IuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9yYW5rPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Db21tX3JlbW90ZV9ncm91cDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkludGVyY29tbTo6R2V0X3JlbW90ZV9ncm91cDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9SRU1PVEVfR1JPVVA8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIHJlbW90ZSBncm91cCBvZiBhbiBpbnRlci1jb21tdW5pY2F0b3IuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9yZW1vdGVfZ3JvdXA8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBNUElfR3JvdXAgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fcmVtb3RlX3NpemU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbnRlcmNvbW06OkdldF9yZW1vdGVfc2l6ZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9SRU1PVEVfU0laRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlbW90ZSBncm91cCBvZiBhbiBpbnRlci1jb21tdW5pY2F0b3IuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9yZW1vdGVfc2l6ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9zZXRfYXR0cjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlNldF9hdHRyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DT01NX1NFVF9BVFRSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXR0YWNoZXMgdGhlIGNvbW11bmljYXRvciBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIGNvbW11bmljYXRvciBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBrZXkuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV9zZXRfYXR0cjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgdm9pZCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9zZXRfZXJyaGFuZGxlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlNldF9lcnJoYW5kbGVyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9DT01NX1NFVF9FUlJIQU5ETEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXR0YWNoZXMgYSBuZXcgZXJyb3IgaGFuZGxlciB0byBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX3NldF9lcnJoYW5kbGVyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgTVBJX0VycmhhbmRsZXI8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Db21tX3NldF9uYW1lPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6U2V0X25hbWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0NPTU1fU0VUX05BTUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Bc3NvY2lhdGVzIGEgbmFtZSBzdHJpbmcgd2l0aCBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX3NldF9uYW1lPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgY2hhciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfQ29tbV9zaXplPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6R2V0X3NpemU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0NPTU1fU0laRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIHNpemUgb2YgdGhlIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX3NpemU8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0NvbW1fc3BsaXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbnRlcmNvbW06OlNwbGl0LDwvY3BwbmFtZT4KLTxmbmFtZT5NUEk6OkludHJhY29tbTo6U3BsaXQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5TcGxpdHMgYSBjb21tdW5pY2F0b3IgaW50byBtdWx0aXBsZSBjb21tdW5pY2F0b3JzIGJhc2VkIG9uIGNvbG9yIGFuZGtleS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Db21tX3NwbGl0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50LCBpbnQsIE1QSV9Db21tICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Db21tX3Rlc3RfaW50ZXI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpJc19pbnRlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfQ09NTV9URVNUX0lOVEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgdHlwZSBvZiBhIGNvbW11bmljYXRvciAoaW50cmEtY29tbXVuaWNhdG9yIG9yIGludGVyLWNvbW11bmljYXRvcikuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfQ29tbV90ZXN0X2ludGVyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9EaW1zX2NyZWF0ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbXB1dGVfZGltczwvY3BwbmFtZT4KLTxmbmFtZT5NUElfRElNU19DUkVBVEU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5EZWZpbmVzIGEgQ2FydGVzaWFuIGdyaWQgdG8gYmFsYW5jZSB0YXNrcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9EaW1zX2NyZWF0ZTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQsIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRXJyaGFuZGxlcl9jcmVhdGU8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9FUlJIQU5ETEVSX0NSRUFURTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJlZ2lzdGVycyBhIHVzZXItZGVmaW5lZCBlcnJvciBoYW5kbGVyLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0VycmhhbmRsZXJfY3JlYXRlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSGFuZGxlcl9mdW5jdGlvbiAqLCBNUElfRXJyaGFuZGxlciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRXJyaGFuZGxlcl9mcmVlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RXJyaGFuZGxlcjo6RnJlZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfRVJSSEFORExFUl9GUkVFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+TWFya3MgYW4gZXJyb3IgaGFuZGxlciBmb3IgZGVhbGxvY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0VycmhhbmRsZXJfZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0VycmhhbmRsZXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0VycmhhbmRsZXJfZ2V0PC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfRVJSSEFORExFUl9HRVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5HZXRzIGFuIGVycm9yIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIGEgY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0VycmhhbmRsZXJfZ2V0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgTVBJX0VycmhhbmRsZXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0VycmhhbmRsZXJfc2V0PC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfRVJSSEFORExFUl9TRVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Bc3NvY2lhdGVzIGEgbmV3IGVycm9yIGhhbmRsZXIgd2l0aCBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9FcnJoYW5kbGVyX3NldDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIE1QSV9FcnJoYW5kbGVyPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRXJyb3JfY2xhc3M8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHZXRfZXJyb3JfY2xhc3M8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0VSUk9SX0NMQVNTPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgZXJyb3IgY2xhc3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfRXJyb3JfY2xhc3M8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9FcnJvcl9zdHJpbmc8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHZXRfZXJyb3Jfc3RyaW5nPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9FUlJPUl9TVFJJTkc8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBlcnJvciBzdHJpbmcgZm9yIGEgZ2l2ZW4gZXJyb3IgY29kZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9FcnJvcl9zdHJpbmc8L25hbWU+Ci08YXJndW1lbnRzPmludCwgY2hhciAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0V4c2NhbjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkludHJhY29tbTo6RXhzY2FuPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9FWFNDQU48L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QZXJmb3JtcyBhIHByZWZpeCByZWR1Y3Rpb24gb24gZGF0YSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIGdyb3VwLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0V4c2NhbjwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCAqLCB2b2lkICosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfT3AsIE1QSV9Db21tPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRmlsZV9jMmY8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlRyYW5zbGF0ZXMgYSBDIGZpbGUgaGFuZGxlIGludG8gYSBGT1JUUkFOIGhhbmRsZSB0byB0aGUgc2FtZSBmaWxlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+TVBJX0ZpbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfRmlsZV9jMmY8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9GaWxlPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRmlsZV9jYWxsX2VycmhhbmRsZXI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpGaWxlOjpDYWxsX2VycmhhbmRsZXI8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0ZJTEVfQ0FMTF9FUlJIQU5ETEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q2FsbHMgdGhlIGVycm9yIGhhbmRsZXIgYXNzaWduZWQgdG8gdGhlIGZpbGUgd2l0aCB0aGUgZXJyb3IgY29kZSBzdXBwbGllZC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9GaWxlX2NhbGxfZXJyaGFuZGxlcjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbGUsIGludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0ZpbGVfY3JlYXRlX2VycmhhbmRsZXI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpGaWxlOjpDcmVhdGVfZXJyaGFuZGxlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfRklMRV9DUkVBVEVfRVJSSEFORExFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJlZ2lzdGVycyBhIHVzZXItZGVmaW5lZCBlcnJvciBoYW5kbGVyIHRoYXQgeW91IGNhbiBhc3NvY2lhdGUgd2l0aCBhbiBvcGVuIGZpbGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfRmlsZV9jcmVhdGVfZXJyaGFuZGxlcjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbGVfZXJyaGFuZGxlcl9mbiAqLCBNUElfRXJyaGFuZGxlciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRmlsZV9mMmM8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBDIGhhbmRsZSB0byBhIGZpbGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5NUElfRmlsZTwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9GaWxlX2YyYzwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9GaWxlX2dldF9lcnJoYW5kbGVyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RmlsZTo6R2V0X2VycmhhbmRsZXI8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0ZJTEVfR0VUX0VSUkhBTkRMRVI8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgdGhlIGVycm9yIGhhbmRsZXIgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgaGFuZGxlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0ZpbGVfZ2V0X2VycmhhbmRsZXI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9GaWxlLCBNUElfRXJyaGFuZGxlciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRmlsZV9zZXRfZXJyaGFuZGxlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkZpbGU6OlNldF9lcnJoYW5kbGVyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9GSUxFX1NFVF9FUlJIQU5ETEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXNzb2NpYXRlcyBhIG5ldyBlcnJvciBoYW5kbGVyIHdpdGggYSBmaWxlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0ZpbGVfc2V0X2VycmhhbmRsZXI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9GaWxlLCBNUElfRXJyaGFuZGxlcjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0ZpbmFsaXplPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RmluYWxpemU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0ZJTkFMSVpFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VGVybWluYXRlcyBhbGwgTVBJIHByb2Nlc3NpbmcuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfRmluYWxpemU8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9GaW5hbGl6ZWQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJc19maW5hbGl6ZWQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0ZJTkFMSVpFRDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdHJ1ZSBpZiBNUElfRklOQUxJWkUgaGFzIGNvbXBsZXRlZC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9GaW5hbGl6ZWQ8L25hbWU+Ci08YXJndW1lbnRzPmludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfRnJlZV9tZW08L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpGcmVlX21lbTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfRlJFRV9NRU08L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5GcmVlcyBhIGJsb2NrIG9mIHN0b3JhZ2UuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfRnJlZV9tZW08L25hbWU+Ci08YXJndW1lbnRzPnZvaWQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dhdGhlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkdhdGhlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR0FUSEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q29sbGVjdHMgaW5kaXZpZHVhbCBtZXNzYWdlcyBmcm9tIGVhY2ggdGFzayBpbiBhIGdyb3VwIGF0IHRoZSByb290IHRhc2suPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR2F0aGVyPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiAsIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9HYXRoZXJ2PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6R2F0aGVydjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR0FUSEVSVjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNvbGxlY3RzIGluZGl2aWR1YWwgbWVzc2FnZXMgZnJvbSBlYWNoIHRhc2sgaW5jb21tIGF0IHRoZSByb290IHRhc2suIE1lc3NhZ2VzIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcyBhbmQgZGlzcGxhY2VtZW50cy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9HYXRoZXJ2PC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiAsIGludCwgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50ICosIGludCAqLCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9HZXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OkdldDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR0VUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJhbnNmZXJzIGRhdGEgZnJvbSBhIHdpbmRvdyBhdCB0aGUgdGFyZ2V0IHRhc2sgdG8gdGhlIG9yaWdpbiB0YXNrLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dldDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBNUElfQWludCwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9XaW48L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9HZXRfYWRkcmVzczwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkdldF9hZGRyZXNzPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HRVRfQUREUkVTUzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhdGlvbiBpbiBtZW1vcnkuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR2V0X2FkZHJlc3M8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQgKiwgTVBJX0FpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dldF9jb3VudDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlN0YXR1czo6R2V0X2NvdW50PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HRVRfQ09VTlQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBtZXNzYWdlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dldF9jb3VudDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1N0YXR1cyAqLCBNUElfRGF0YXR5cGUsIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR2V0X2VsZW1lbnRzPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6U3RhdHVzOjpHZXRfZWxlbWVudHM8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dFVF9FTEVNRU5UUzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIG51bWJlciBvZiBiYXNpYyBlbGVtZW50cyBpbiBhIG1lc3NhZ2UuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR2V0X2VsZW1lbnRzPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfU3RhdHVzICosIE1QSV9EYXRhdHlwZSwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9HZXRfcHJvY2Vzc29yX25hbWU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHZXRfcHJvY2Vzc29yX25hbWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dFVF9QUk9DRVNTT1JfTkFNRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHByb2Nlc3Nvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9HZXRfcHJvY2Vzc29yX25hbWU8L25hbWU+Ci08YXJndW1lbnRzPmNoYXIgKiwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9HZXRfdmVyc2lvbjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkdldF92ZXJzaW9uPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HRVRfVkVSU0lPTjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIE1QSSBzdGFuZGFyZCBzdXBwb3J0ZWQuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR2V0X3ZlcnNpb248L25hbWU+Ci08YXJndW1lbnRzPmludCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dyYXBoX2NyZWF0ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkludHJhY29tbTo6Q3JlYXRlX2dyYXBoPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HUkFQSF9DUkVBVEU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgbmV3IGNvbW11bmljYXRvciBjb250YWluaW5nIGdyYXBoIHRvcG9sb2d5IGluZm9ybWF0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyYXBoX2NyZWF0ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgaW50ICosIGludCAqLCBpbnQsIE1QSV9Db21tICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9HcmFwaF9nZXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHcmFwaGNvbW06OkdldF90b3BvPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HUkFQSF9HRVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgZ3JhcGggdG9wb2xvZ3kgaW5mb3JtYXRpb24gZnJvbSBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9HcmFwaF9nZXQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQsIGludCwgaW50ICosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JhcGhfbWFwPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JhcGhjb21tOjpNYXA8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dSQVBIX01BUDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNvbXB1dGVzIHBsYWNlbWVudCBvZiB0YXNrcyBvbiB0aGUgcGh5c2ljYWwgcHJvY2Vzc29yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyYXBoX21hcDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgaW50ICosIGludCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dyYXBoX25laWdoYm9yczwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkdyYXBoY29tbTo6R2V0X25laWdoYm9yczwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR1JBUEhfTkVJR0hCT1JTPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgbmVpZ2hib3JzIG9mIHRoZSBnaXZlbiB0YXNrLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyYXBoX25laWdoYm9yczwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgaW50LCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dyYXBoX25laWdoYm9yc19jb3VudDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkdyYXBoY29tbTo6R2V0X25laWdoYm9yc19jb3VudDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR1JBUEhfTkVJR0hCT1JTX0NPVU5UPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgbnVtYmVyIG9mIG5laWdoYm9ycyBvZiB0aGUgZ2l2ZW4gdGFzay48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9HcmFwaF9uZWlnaGJvcnNfY291bnQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQsIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JhcGhkaW1zX2dldDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkdyYXBoY29tbTo6R2V0X2RpbXM8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dSQVBIRElNU19HRVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgZ3JhcGggdG9wb2xvZ3kgaW5mb3JtYXRpb24gZnJvbSBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9HcmFwaGRpbXNfZ2V0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50ICosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JlcXVlc3RfY29tcGxldGU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHcmVxdWVzdDo6Q29tcGxldGU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dSRVFVRVNUX0NPTVBMRVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+TWFya3MgdGhlIGdlbmVyYWxpemVkIHJlcXVlc3QgY29tcGxldGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR3JlcXVlc3RfY29tcGxldGU8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9SZXF1ZXN0PC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JlcXVlc3Rfc3RhcnQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHcmVxdWVzdDo6U3RhcnQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dSRVFVRVNUX1NUQVJUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+SW5pdGlhbGl6ZXMgYSBnZW5lcmFsaXplZCByZXF1ZXN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyZXF1ZXN0X3N0YXJ0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfR3JlcXVlc3RfcXVlcnlfZnVuY3Rpb24gKiwgTVBJX0dyZXF1ZXN0X2ZyZWVfZnVuY3Rpb24gKixNUElfR3JlcXVlc3RfY2FuY2VsX2Z1bmN0aW9uICosIHZvaWQgKiwgTVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dyb3VwX2MyZjwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+KG5vbmUpPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJhbnNsYXRlcyBhIEMgZ3JvdXAgaGFuZGxlIGludG8gYSBGT1JUUkFOIGhhbmRsZSB0byB0aGUgc2FtZSBncm91cC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPk1QSV9GaW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyb3VwX2MyZjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0dyb3VwPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JvdXBfY29tcGFyZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Okdyb3VwOjpDb21wYXJlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HUk9VUF9DT01QQVJFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q29tcGFyZXMgdGhlIGNvbnRlbnRzIG9mIHR3byB0YXNrIGdyb3Vwcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Hcm91cF9jb21wYXJlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfR3JvdXAsIE1QSV9Hcm91cCwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Hcm91cF9kaWZmZXJlbmNlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OkRpZmZlcmVuY2U8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dST1VQX0RJRkZFUkVOQ0U8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgbmV3IGdyb3VwIHRoYXQgaXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGV4aXN0aW5nIGdyb3Vwcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Hcm91cF9kaWZmZXJlbmNlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfR3JvdXAsIE1QSV9Hcm91cCwgTVBJX0dyb3VwICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Hcm91cF9leGNsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OkV4Y2w8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dST1VQX0VYQ0w8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZW1vdmVzIHNlbGVjdGVkIHRhc2tzIGZyb20gYW4gZXhpc3RpbmcgZ3JvdXAgdG8gY3JlYXRlIGEgbmV3IGdyb3VwLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyb3VwX2V4Y2w8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgaW50LCBpbnQgKiwgTVBJX0dyb3VwICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Hcm91cF9mMmM8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBDIGhhbmRsZSB0byBhIGdyb3VwLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+TVBJX0dyb3VwPC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyb3VwX2YyYzwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Hcm91cF9mcmVlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OkZyZWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dST1VQX0ZSRUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5NYXJrcyBhIGdyb3VwIGZvciBkZWFsbG9jYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR3JvdXBfZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0dyb3VwICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Hcm91cF9pbmNsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OkluY2w8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0dST1VQX0lOQ0w8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgbmV3IGdyb3VwIGNvbnNpc3Rpbmcgb2Ygc2VsZWN0ZWQgdGFza3MgZnJvbSBhbiBleGlzdGluZyBncm91cC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Hcm91cF9pbmNsPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfR3JvdXAsIGludCwgaW50ICosIE1QSV9Hcm91cCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JvdXBfaW50ZXJzZWN0aW9uPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OkludGVyc2VjdDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR1JPVVBfSU5URVJTRUNUSU9OPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIG5ldyBncm91cCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIGV4aXN0aW5nIGdyb3Vwcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Hcm91cF9pbnRlcnNlY3Rpb248L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgTVBJX0dyb3VwLCBNUElfR3JvdXAgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dyb3VwX3JhbmdlX2V4Y2w8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpHcm91cDo6UmFuZ2VfZXhjbDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR1JPVVBfUkFOR0VfRVhDTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBuZXcgZ3JvdXAgYnkgZXhjbHVkaW5nIHNlbGVjdGVkIHRhc2tzIG9mIGFuIGV4aXN0aW5nIGdyb3VwLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyb3VwX3JhbmdlX2V4Y2w8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgaW50LCBpbnQgW11bM10sIE1QSV9Hcm91cCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JvdXBfcmFuZ2VfaW5jbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Okdyb3VwOjpSYW5nZV9pbmNsPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HUk9VUF9SQU5HRV9JTkNMPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIG5ldyBncm91cCBjb25zaXN0aW5nIG9mIHNlbGVjdGVkIHJhbmdlcyBvZiB0YXNrcyBmcm9tIGFuIGV4aXN0aW5nIGdyb3VwLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyb3VwX3JhbmdlX2luY2w8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgaW50LCBpbnQgW11bM10sIE1QSV9Hcm91cCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfR3JvdXBfcmFuazwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Okdyb3VwOjpHZXRfcmFuazwvY3BwbmFtZT4KLTxmbmFtZT5NUElfR1JPVVBfUkFOSzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIHJhbmsgb2YgdGhlIGxvY2FsIHRhc2sgd2l0aCByZXNwZWN0IHRvIGdyb3VwLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0dyb3VwX3Jhbms8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Hcm91cF9zaXplPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OkdldF9zaXplPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HUk9VUF9TSVpFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgbnVtYmVyIG9mIHRhc2tzIGluIGEgZ3JvdXAuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfR3JvdXBfc2l6ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0dyb3VwLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0dyb3VwX3VuaW9uPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6R3JvdXA6OlVuaW9uPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9HUk9VUF9VTklPTjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBuZXcgZ3JvdXAgdGhhdCBpcyB0aGUgdW5pb24gb2YgdHdvIGV4aXN0aW5nIGdyb3Vwcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Hcm91cF91bmlvbjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0dyb3VwLCBNUElfR3JvdXAsIE1QSV9Hcm91cCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSWJzZW5kPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6SWJzZW5kPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JQlNFTkQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QZXJmb3JtcyBhIG5vbi1ibG9ja2luZyBidWZmZXJlZCBzZW5kLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0lic2VuZDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0sIE1QSV9SZXF1ZXN0ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9JbmZvX2MyZjwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+KG5vbmUpPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJhbnNsYXRlcyBhIEMgSW5mbyBvYmplY3QgaGFuZGxlIGludG8gYSBGT1JUUkFOIGhhbmRsZSB0byB0aGUgc2FtZSBJbmZvIG9iamVjdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPk1QSV9GaW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0luZm9fYzJmPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSW5mbzwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0luZm9fY3JlYXRlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6SW5mbzo6Q3JlYXRlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTkZPX0NSRUFURTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBuZXcsIGVtcHR5IEluZm8gb2JqZWN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0luZm9fY3JlYXRlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSW5mbyAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSW5mb19kZWxldGU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbmZvOjpEZWxldGU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0lORk9fREVMRVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+RGVsZXRlcyBhIChrZXksIHZhbHVlKSBwYWlyIGZyb20gYW4gSW5mbyBvYmplY3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfSW5mb19kZWxldGU8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9JbmZvLCBjaGFyICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9JbmZvX2R1cDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkluZm86OkR1cDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSU5GT19EVVA8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5EdXBsaWNhdGVzIGFuIEluZm8gb2JqZWN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0luZm9fZHVwPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSW5mbywgTVBJX0luZm8gKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0luZm9fZjJjPC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT4obm9uZSk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgQyBoYW5kbGUgdG8gYW4gSW5mbyBvYmplY3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5NUElfSW5mbzwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9JbmZvX2YyYzwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9JbmZvX2ZyZWU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbmZvOjpGcmVlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTkZPX0ZSRUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5GcmVlcyBhbiBJbmZvIG9iamVjdCBhbmQgc2V0cyBpdHMgaGFuZGxlIHRvIE1QSV9JTkZPX05VTEwuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfSW5mb19mcmVlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSW5mbyAqaW5mbzwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0luZm9fZ2V0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6SW5mbzo6R2V0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTkZPX0dFVDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoa2V5IGluIGFuIEluZm8gb2JqZWN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0luZm9fZ2V0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSW5mbywgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9JbmZvX2dldF9ua2V5czwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkluZm86OkdldF9ua2V5czwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSU5GT19HRVRfTktFWVM8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBkZWZpbmVkIGluIGFuIEluZm8gb2JqZWN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0luZm9fZ2V0X25rZXlzPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfSW5mbywgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9JbmZvX2dldF9udGhrZXk8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbmZvOjpHZXRfbnRoa2V5PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTkZPX0dFVF9OVEhLRVk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgdGhlIG50aCBrZXkgZGVmaW5lZCBpbiBhbiBJbmZvIG9iamVjdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9JbmZvX2dldF9udGhrZXk8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9JbmZvLCBpbnQsIGNoYXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0luZm9fZ2V0X3ZhbHVlbGVuPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6SW5mbzo6R2V0X3ZhbHVlbGVuPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTkZPX0dFVF9WQUxVRUxFTjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHJpZXZlcyB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBrZXkgb2YgYW4gSW5mbyBvYmplY3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfSW5mb19nZXRfdmFsdWVsZW48L25hbWU+Ci08YXJndW1lbnRzPk1QSV9JbmZvLCBjaGFyICosIGludCAqLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0luZm9fc2V0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6SW5mbzo6U2V0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTkZPX1NFVDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFkZHMgYSAoa2V5LCB2YWx1ZSkgcGFpciB0byBhbiBJbmZvIG9iamVjdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9JbmZvX3NldDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0luZm8sIGNoYXIgKiwgY2hhciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSW5pdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkluaXQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0lOSVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Jbml0aWFsaXplcyBNUEkuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfSW5pdDwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICosIGNoYXIgKioqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSW5pdF90aHJlYWQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbml0X3RocmVhZDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSU5JVF9USFJFQUQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Jbml0aWFsaXplcyBNUEkgYW5kIHRoZSBNUEkgdGhyZWFkcyBlbnZpcm9ubWVudC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Jbml0X3RocmVhZDwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICosIGNoYXIgKioqLCBpbnQsIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSW5pdGlhbGl6ZWQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJc19pbml0aWFsaXplZDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSU5JVElBTElaRUQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5EZXRlcm1pbmVzIGlmIE1QSSBpcyBpbml0aWFsaXplZC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Jbml0aWFsaXplZDwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9JbnRlcmNvbW1fY3JlYXRlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6SW50cmFjb21tOjpDcmVhdGVfaW50ZXJjb21tPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JTlRFUkNPTU1fQ1JFQVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhbiBpbnRlci1jb21tdW5pY2F0b3IgZnJvbSB0d28gaW50cmEtY29tbXVuaWNhdG9ycy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9JbnRlcmNvbW1fY3JlYXRlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfQ29tbSwgaW50LCBNUElfQ29tbSwgaW50LCBpbnQsIE1QSV9Db21tICogPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSW50ZXJjb21tX21lcmdlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6SW50ZXJjb21tOjpNZXJnZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSU5URVJDT01NX01FUkdFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhbiBpbnRyYS1jb21tdW5pY2F0b3IgYnkgbWVyZ2luZyB0aGUgbG9jYWwgYW5kIHJlbW90ZSBncm91cHMgb2YgYW4gaW50ZXItY29tbXVuaWNhdG9yLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0ludGVyY29tbV9tZXJnZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0NvbW0sIGludCwgTVBJX0NvbW0gKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0lwcm9iZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06Oklwcm9iZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSVBST0JFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q2hlY2tzIHRvIHNlZSBpZiBhIG1lc3NhZ2UgbWF0Y2hpbmdzb3VyY2UsIHRhZywgYW5kY29tbSBoYXMgYXJyaXZlZC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9JcHJvYmU8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50LCBNUElfQ29tbSwgaW50ICosIE1QSV9TdGF0dXMgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0lyZWN2PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6SXJlY3Y8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0lSRUNWPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UGVyZm9ybXMgYSBub24tYmxvY2tpbmcgcmVjZWl2ZSBvcGVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfSXJlY3Y8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSXJzZW5kPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6SXJzZW5kPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9JUlNFTkQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QZXJmb3JtcyBhIG5vbi1ibG9ja2luZyByZWFkeSBzZW5kIG9wZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9JcnNlbmQ8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfSXNfdGhyZWFkX21haW48L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJc190aHJlYWRfbWFpbjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfSVNfVEhSRUFEX01BSU48L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQgTVBJX0lOSVQgb3IgTVBJX0lOSVRfVEhSRUFELjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0lzX3RocmVhZF9tYWluPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0lzZW5kPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6SXNlbmQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0lTRU5EPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UGVyZm9ybXMgYSBub24tYmxvY2tpbmcgc3RhbmRhcmQgbW9kZSBzZW5kIG9wZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Jc2VuZDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0sIE1QSV9SZXF1ZXN0ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Jc3NlbmQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpJc3NlbmQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX0lTU0VORDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlBlcmZvcm1zIGEgbm9uLWJsb2NraW5nIHN5bmNocm9ub3VzIG1vZGUgc2VuZCBvcGVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfSXNzZW5kPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX0tleXZhbF9jcmVhdGU8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9LRVlWQUxfQ1JFQVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+R2VuZXJhdGVzIGEgbmV3IGNvbW11bmljYXRvciBhdHRyaWJ1dGUga2V5LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX0tleXZhbF9jcmVhdGU8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db3B5X2Z1bmN0aW9uICosIE1QSV9EZWxldGVfZnVuY3Rpb24gKiwgaW50ICosIHZvaWQqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfS2V5dmFsX2ZyZWU8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9LRVlWQUxfRlJFRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPk1hcmtzIGEgY29tbXVuaWNhdG9yIGF0dHJpYnV0ZSBrZXkgZm9yIGRlYWxsb2NhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9LZXl2YWxfZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9PcF9jMmY8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlRyYW5zbGF0ZXMgYSBDIHJlZHVjdGlvbiBvcGVyYXRpb24gaGFuZGxlIGludG8gYSBGT1JUUkFOIGhhbmRsZSB0byB0aGUgc2FtZSBvcGVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5NUElfRmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9PcF9jMmY8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9PcDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX09wX2NyZWF0ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Ok9wOjpJbml0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9PUF9DUkVBVEU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5CaW5kcyBhIHVzZXItZGVmaW5lZCByZWR1Y3Rpb24gb3BlcmF0aW9uIHRvIGFub3AgaGFuZGxlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX09wX2NyZWF0ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1VzZXJfZnVuY3Rpb24gKiwgaW50LCBNUElfT3AgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX09wX2YyYzwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+KG5vbmUpPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIEMgcmVkdWN0aW9uIG9wZXJhdGlvbiBoYW5kbGUgdG8gYW4gb3BlcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+TVBJX09wPC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX09wX2YyYzwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9PcF9mcmVlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6T3A6OkZyZWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX09QX0ZSRUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5NYXJrcyBhIHVzZXItZGVmaW5lZCByZWR1Y3Rpb24gb3BlcmF0aW9uIGZvciBkZWFsbG9jYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfT3BfZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+IE1QSV9PcCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfUGFjazwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpQYWNrPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9QQUNLPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UGFja3MgdGhlIG1lc3NhZ2UgaW4gdGhlIHNwZWNpZmllZCBzZW5kIGJ1ZmZlciBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHNwYWNlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1BhY2s8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCAqLCBpbnQsIGludCAqLCAgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9QYWNrX2V4dGVybmFsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OlBhY2tfZXh0ZXJuYWw8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1BBQ0tfRVhURVJOQUw8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QYWNrcyB0aGUgbWVzc2FnZSBpbiB0aGUgc3BlY2lmaWVkIHNlbmQgYnVmZmVyIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIgc3BhY2UsIHVzaW5nIHRoZSBleHRlcm5hbDMyIGRhdGEgZm9ybWF0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1BhY2tfZXh0ZXJuYWw8L25hbWU+Ci08YXJndW1lbnRzPmNoYXIgKiwgdm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCAqLCBNUElfQWludCwgTVBJX0FpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1BhY2tfZXh0ZXJuYWxfc2l6ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpQYWNrX2V4dGVybmFsX3NpemU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1BBQ0tfRVhURVJOQUxfU0laRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBkYXRhLCB1c2luZyB0aGUgZXh0ZXJuYWwzMiBkYXRhIGZvcm1hdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9QYWNrX2V4dGVybmFsX3NpemU8L25hbWU+Ci08YXJndW1lbnRzPmNoYXIgKiwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9BaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9QYWNrX3NpemU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpEYXRhdHlwZTo6UGFja19zaXplPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9QQUNLX1NJWkU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZGF0YS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9QYWNrX3NpemU8L25hbWU+Ci08YXJndW1lbnRzPmludCwgTVBJX0RhdGF0eXBlLCBNUElfQ29tbSwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9QY29udHJvbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlBjb250cm9sPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9QQ09OVFJPTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlByb3ZpZGVzIHByb2ZpbGUgY29udHJvbC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9QY29udHJvbDwvbmFtZT4KLTxhcmd1bWVudHM+Y29uc3QgaW50LCAuLi48L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9Qcm9iZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlByb2JlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9QUk9CRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPldhaXRzIHVudGlsIGEgbWVzc2FnZSBtYXRjaGluZyBzb3VyY2UsIHRhZywgYW5kIGNvbW0gYXJyaXZlcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Qcm9iZTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQsIE1QSV9Db21tLCBNUElfU3RhdHVzICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9QdXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OlB1dDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfUFVUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJhbnNmZXJzIGRhdGEgZnJvbSB0aGUgb3JpZ2luIHRhc2sgdG8gYSB3aW5kb3cgYXQgdGhlIHRhcmdldCB0YXNrLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1B1dDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBNUElfQWludCwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9XaW48L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9RdWVyeV90aHJlYWQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpRdWVyeV90aHJlYWQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1FVRVJZX1RIUkVBRDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgdGhyZWFkcyBzdXBwb3J0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1F1ZXJ5X3RocmVhZDwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9SZWN2PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6UmVjdjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfUkVDVjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlBlcmZvcm1zIGEgYmxvY2tpbmcgcmVjZWl2ZSBvcGVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfUmVjdjwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIGludCwgTVBJX0NvbW0sIE1QSV9TdGF0dXMgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1JlY3ZfaW5pdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlJlY3ZfaW5pdDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfUkVDVl9JTklUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIHBlcnNpc3RlbnQgcmVjZWl2ZSByZXF1ZXN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1JlY3ZfaW5pdDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1JlZHVjZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlJlZHVjZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfUkVEVUNFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXBwbGllcyBhIHJlZHVjdGlvbiBvcGVyYXRpb24gdG8gdGhlIHZlY3RvcnNlbmRidWYgb3ZlciB0aGUgc2V0IG9mIHRhc2tzIHNwZWNpZmllZCBieWNvbW0gYW5kIHBsYWNlcyB0aGUgcmVzdWx0IGluIHJlY3ZidWYgb24gcm9vdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9SZWR1Y2U8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqICwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfT3AsIGludCwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9SZWR1Y2Vfc2NhdHRlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlJlZHVjZV9zY2F0dGVyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9SRURVQ0VfU0NBVFRFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFwcGxpZXMgYSByZWR1Y3Rpb24gb3BlcmF0aW9uIHRvIHRoZSB2ZWN0b3JzZW5kYnVmIG92ZXIgdGhlIHNldCBvZiB0YXNrcyBzcGVjaWZpZWQgYnljb21tIGFuZCBzY2F0dGVycyB0aGUgcmVzdWx0IGFjY29yZGluZyB0byB0aGUgdmFsdWVzIGluIHJlY3Zjb3VudHMuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfUmVkdWNlX3NjYXR0ZXI8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqICwgdm9pZCosIGludCAqLCBNUElfRGF0YXR5cGUsIE1QSV9PcCwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9SZXF1ZXN0X2MyZjwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+KG5vbmUpPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJhbnNsYXRlcyBhIEMgcmVxdWVzdCBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIHJlcXVlc3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5NUElfRmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9SZXF1ZXN0X2MyZjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1JlcXVlc3Q8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9SZXF1ZXN0X2YyYzwvY25hbWU+Ci08Y3BwbmFtZT4obm9uZSk8L2NwcG5hbWU+Ci08Zm5hbWU+KG5vbmUpPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIEMgaGFuZGxlIHRvIGEgcmVxdWVzdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPk1QSV9SZXF1ZXN0PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1JlcXVlc3RfZjJjPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRmludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1JlcXVlc3RfZnJlZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlJlcXVlc3Q6OkZyZWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1JFUVVFU1RfRlJFRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPk1hcmtzIGEgcmVxdWVzdCBmb3IgZGVhbGxvY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1JlcXVlc3RfZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1JlcXVlc3RfZ2V0X3N0YXR1czwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlJlcXVlc3Q6OkdldF9zdGF0dXM8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1JFUVVFU1RfR0VUX1NUQVRVUzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFjY2Vzc2VzIHRoZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSByZXF1ZXN0LCB3aXRob3V0IGZyZWVpbmcgdGhlIHJlcXVlc3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfUmVxdWVzdF9nZXRfc3RhdHVzPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfUmVxdWVzdCwgaW50ICosIE1QSV9TdGF0dXMgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1JzZW5kPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6UnNlbmQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1JTRU5EPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UGVyZm9ybXMgYSBibG9ja2luZyByZWFkeSBtb2RlIHNlbmQgb3BlcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1JzZW5kPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1JzZW5kX2luaXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpSc2VuZF9pbml0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9SU0VORF9JTklUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIHBlcnNpc3RlbnQgcmVhZHkgbW9kZSBzZW5kIHJlcXVlc3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfUnNlbmRfaW5pdDwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1NjYW48L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpJbnRyYWNvbW06OlNjYW48L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1NDQU48L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QZXJmb3JtcyBhIHBhcmFsbGVsIHByZWZpeCByZWR1Y3Rpb24gb24gZGF0YSBkaXN0cmlidXRlZCBhY3Jvc3MgYSBncm91cC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9TY2FuPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiAsIHZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgTVBJX09wLCBNUElfQ29tbSA8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9TY2F0dGVyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6U2NhdHRlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfU0NBVFRFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkRpc3RyaWJ1dGVzIGluZGl2aWR1YWwgbWVzc2FnZXMgZnJvbXJvb3QgdG8gZWFjaCB0YXNrIGluIGNvbW0uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU2NhdHRlcjwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCogLCBpbnQsIE1QSV9EYXRhdHlwZSwgdm9pZCosIGludCwgTVBJX0RhdGF0eXBlLCBpbnQsIE1QSV9Db21tPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfU2NhdHRlcnY8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpTY2F0dGVydjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfU0NBVFRFUlY8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5EaXN0cmlidXRlcyBpbmRpdmlkdWFsIG1lc3NhZ2VzIGZyb21yb290IHRvIGVhY2ggdGFzayBpbiBjb21tLiBNZXNzYWdlcyBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGRpc3BsYWNlbWVudHMuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU2NhdHRlcnY8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqICwgaW50ICosIGludCAqLCAgTVBJX0RhdGF0eXBlLCB2b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgTVBJX0NvbW08L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9TZW5kPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6U2VuZDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfU0VORDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkJsb2NraW5nIHN0YW5kYXJkIG1vZGUgc2VuZC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9TZW5kPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1NlbmRfaW5pdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlNlbmRfaW5pdDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfU0VORF9JTklUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIHBlcnNpc3RlbnQgc3RhbmRhcmQgbW9kZSBzZW5kIHJlcXVlc3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU2VuZF9pbml0PC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1NlbmRyZWN2PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6U2VuZHJlY3Y8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1NFTkRSRUNWPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UGVyZm9ybXMgYSBibG9ja2luZyBzZW5kIGFuZCByZWNlaXZlIG9wZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9TZW5kcmVjdjwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSxpbnQsIGludCwgdm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tLCBNUElfU3RhdHVzICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9TZW5kcmVjdl9yZXBsYWNlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6Q29tbTo6U2VuZHJlY3ZfcmVwbGFjZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfU0VORFJFQ1ZfUkVQTEFDRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlBlcmZvcm1zIGEgYmxvY2tpbmcgc2VuZCBhbmQgcmVjZWl2ZSBvcGVyYXRpb24gdXNpbmcgYSBjb21tb24gYnVmZmVyLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1NlbmRyZWN2X3JlcGxhY2U8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIGludCwgaW50LCBNUElfQ29tbSwgTVBJX1N0YXR1cyAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfU3NlbmQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpDb21tOjpTc2VuZDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfU1NFTkQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5QZXJmb3JtcyBhIGJsb2NraW5nIHN5bmNocm9ub3VzIG1vZGUgc2VuZCBvcGVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU3NlbmQ8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIE1QSV9EYXRhdHlwZSwgaW50LCBpbnQsIE1QSV9Db21tPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfU3NlbmRfaW5pdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OlNzZW5kX2luaXQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1NTRU5EX0lOSVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgcGVyc2lzdGVudCBzeW5jaHJvbm91cyBtb2RlIHNlbmQgcmVxdWVzdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Tc2VuZF9pbml0PC9uYW1lPgotPGFyZ3VtZW50cz52b2lkKiwgaW50LCBNUElfRGF0YXR5cGUsIGludCxpbnQsIE1QSV9Db21tLCBNUElfUmVxdWVzdCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfU3RhcnQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpQcmVxdWVzdDo6U3RhcnQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1NUQVJUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QWN0aXZhdGVzIGEgcGVyc2lzdGVudCByZXF1ZXN0IG9wZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9TdGFydDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1N0YXJ0YWxsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6UHJlcXVlc3Q6OlN0YXJ0YWxsPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9TVEFSVEFMTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFjdGl2YXRlcyBhIGNvbGxlY3Rpb24gb2YgcGVyc2lzdGVudCByZXF1ZXN0IG9wZXJhdGlvbnMuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU3RhcnRhbGw8L25hbWU+Ci08YXJndW1lbnRzPmludCwgTVBJX1JlcXVlc3QgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1N0YXR1c19jMmY8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlRyYW5zbGF0ZXMgYSBDIHN0YXR1cyBvYmplY3QgaW50byBhIEZPUlRSQU4gc3RhdHVzIG9iamVjdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9TdGF0dXNfYzJmPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfU3RhdHVzICosIE1QSV9GaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9TdGF0dXNfZjJjPC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT4obm9uZSk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Db252ZXJ0cyBhIEZPUlRSQU4gc3RhdHVzIG9iamVjdCBpbnRvIGEgQyBzdGF0dXMgb2JqZWN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1N0YXR1c19mMmM8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9GaW50ICosIE1QSV9TdGF0dXMgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1N0YXR1c19zZXRfY2FuY2VsbGVkPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6U3RhdHVzOjpTZXRfY2FuY2VsbGVkPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9TVEFUVVNfU0VUX0NBTkNFTExFRDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkRlZmluZXMgY2FuY2VsbGF0aW9uIGluZm9ybWF0aW9uIGZvciBhIHJlcXVlc3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU3RhdHVzX3NldF9jYW5jZWxsZWQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9TdGF0dXMgKiwgaW50PC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfU3RhdHVzX3NldF9lbGVtZW50czwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlN0YXR1czo6U2V0X2VsZW1lbnRzPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9TVEFUVVNfU0VUX0VMRU1FTlRTPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+RGVmaW5lcyBlbGVtZW50IGluZm9ybWF0aW9uIGZvciBhIHJlcXVlc3QuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfU3RhdHVzX3NldF9lbGVtZW50czwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1N0YXR1cyAqLCBNUElfRGF0YXR5cGUsIGludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1Rlc3Q8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpSZXF1ZXN0OjpUZXN0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9URVNUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q2hlY2tzIHRvIHNlZSBpZiBhIG5vbi1ibG9ja2luZyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UZXN0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfUmVxdWVzdCAqLCBpbnQgKiwgTVBJX1N0YXR1cyAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVGVzdF9jYW5jZWxsZWQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpTdGF0dXM6OklzX2NhbmNlbGxlZDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVEVTVF9DQU5DRUxMRUQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5UZXN0cyB3aGV0aGVyIGEgbm9uLWJsb2NraW5nIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1Rlc3RfY2FuY2VsbGVkPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfU3RhdHVzICosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVGVzdGFsbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlJlcXVlc3Q6OlRlc3RhbGw8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RFU1RBTEw8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5UZXN0cyBhIGNvbGxlY3Rpb24gb2Ygbm9uLWJsb2NraW5nIG9wZXJhdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVGVzdGFsbDwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBNUElfUmVxdWVzdCAqLCBpbnQgKiwgTVBJX1N0YXR1cyAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVGVzdGFueTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlJlcXVlc3Q6OlRlc3Rhbnk8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RFU1RBTlk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5UZXN0cyBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYW55IHNwZWNpZmllZCBub24tYmxvY2tpbmcgb3BlcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1Rlc3Rhbnk8L25hbWU+Ci08YXJndW1lbnRzPmludCwgTVBJX1JlcXVlc3QgKiwgaW50ICosIGludCAqLCBNUElfU3RhdHVzICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UZXN0c29tZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OlJlcXVlc3Q6OlRlc3Rzb21lPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9URVNUU09NRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlRlc3RzIGEgY29sbGVjdGlvbiBvZiBub24tYmxvY2tpbmcgb3BlcmF0aW9ucyBmb3IgY29tcGxldGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UZXN0c29tZTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBNUElfUmVxdWVzdCAqLCBpbnQgKiwgaW50ICosIE1QSV9TdGF0dXMgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1RvcG9fdGVzdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkNvbW06OkdldF90b3BvbG9neTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVE9QT19URVNUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgdHlwZSBvZiB2aXJ0dWFsIHRvcG9sb2d5IGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRvci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9Ub3BvX3Rlc3Q8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Db21tLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfYzJmPC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT4obm9uZSk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5UcmFuc2xhdGVzIGEgQyBkYXRhdHlwZSBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIGRhdGF0eXBlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+TVBJX0ZpbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9jMmY8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9EYXRhdHlwZTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfY29tbWl0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkNvbW1pdDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9DT01NSVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5NYWtlcyBhIGRhdGF0eXBlIHJlYWR5IGZvciB1c2UgaW4gY29tbXVuaWNhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2NvbW1pdDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2NvbnRpZ3VvdXM8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpEYXRhdHlwZTo6Q3JlYXRlX2NvbnRpZ3VvdXM8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfQ09OVElHVU9VUzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGNvdW50IGluc3RhbmNlcyBvZm9sZHR5cGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9jb250aWd1b3VzPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQsIE1QSV9EYXRhdHlwZSwgTVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2NyZWF0ZV9kYXJyYXk8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpEYXRhdHlwZTo6Q3JlYXRlX2RhcnJheTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9DUkVBVEVfREFSUkFZPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+R2VuZXJhdGVzIHRoZSBkYXRhdHlwZXMgY29ycmVzcG9uZGluZyB0byBhbiBIUEYtbGlrZSBkaXN0cmlidXRpb24gb2YgYW4gbmRpbXMtZGltZW5zaW9uYWwgYXJyYXkgb2Ygb2xkdHlwZSBlbGVtZW50cyBvbnRvIGFubmRpbXMtZGltZW5zaW9uYWwgZ3JpZCBvZiBsb2dpY2FsIHRhc2tzLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfY3JlYXRlX2RhcnJheTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQsIGludCwgaW50IFtdLCBpbnQgW10sIGludCBbXSwgaW50IFtdLCBpbnQsTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfY3JlYXRlX2Y5MF9jb21wbGV4PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkNyZWF0ZV9mOTBfY29tcGxleDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9DUkVBVEVfRjkwX0NPTVBMRVg8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgcHJlZGVmaW5lZCBNUEkgZGF0YXR5cGUgdGhhdCBtYXRjaGVzIGEgQ09NUExFWCB2YXJpYWJsZSBvZiBLSU5EIHNlbGVjdGVkX3JlYWxfa2luZChwLCByKS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2NyZWF0ZV9mOTBfY29tcGxleDwvbmFtZT4KLTxhcmd1bWVudHM+IGludCwgaW50LCBNUElfRGF0YXR5cGUgKiA8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2NyZWF0ZV9mOTBfaW50ZWdlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfZjkwX2ludGVnZXI8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfQ1JFQVRFX0Y5MF9JTlRFR0VSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIHByZWRlZmluZWQgTVBJIGRhdGF0eXBlIHRoYXQgbWF0Y2hlcyBhbiBJTlRFR0VSIHZhcmlhYmxlIG9mIEtJTkQgc2VsZWN0ZWRfaW50ZWdlcl9raW5kKHIpLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfY3JlYXRlX2Y5MF9pbnRlZ2VyPC9uYW1lPgotPGFyZ3VtZW50cz4gaW50LCBNUElfRGF0YXR5cGUgKiA8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2NyZWF0ZV9mOTBfcmVhbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfZjkwX3JlYWw8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfQ1JFQVRFX0Y5MF9SRUFMPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIHByZWRlZmluZWQgTVBJIGRhdGF0eXBlIHRoYXQgbWF0Y2hlcyBhIFJFQUwgdmFyaWFibGUgb2YgS0lORCBzZWxlY3RlZF9yZWFsX2tpbmQocCwgcikuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9jcmVhdGVfZjkwX3JlYWw8L25hbWU+Ci08YXJndW1lbnRzPiBpbnQsIGludCwgTVBJX0RhdGF0eXBlICogPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9jcmVhdGVfaGluZGV4ZWQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpEYXRhdHlwZTo6Q3JlYXRlX2hpbmRleGVkPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0NSRUFURV9ISU5ERVhFRDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzY291bnQgYmxvY2tzLiBFYWNoIGJsb2NrIGlzIGRlZmluZWQgYnkgYW4gZW50cnkgaW4gYXJyYXlfb2ZfYmxvY2tsZW5ndGhzIGFuZGFycmF5X29mX2Rpc3BsYWNlbWVudHMuIERpc3BsYWNlbWVudHMgYXJlIGV4cHJlc3NlZCBpbiBieXRlcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2NyZWF0ZV9oaW5kZXhlZDwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQgW10sIE1QSV9BaW50IFtdLCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9jcmVhdGVfaHZlY3RvcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfaHZlY3RvcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9DUkVBVEVfSFZFQ1RPUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzIGVxdWFsbHktc3BhY2VkIGJsb2Nrcy4gVGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCBibG9jayBpcyBnaXZlbiBpbiBieXRlcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2NyZWF0ZV9odmVjdG9yPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQsIGludCwgTVBJX0FpbnQsIE1QSV9EYXRhdHlwZSwgTVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2NyZWF0ZV9pbmRleGVkX2Jsb2NrPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkNyZWF0ZV9pbmRleGVkX2Jsb2NrPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0NSRUFURV9JTkRFWEVEX0JMT0NLPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIG5ldyBkYXRhdHlwZSB0aGF0IHJlcHJlc2VudHNjb3VudCBibG9ja3MuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9jcmVhdGVfaW5kZXhlZF9ibG9jazwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQsIGludCBbXSwgTVBJX0RhdGF0eXBlLCBNUElfRGF0YXR5cGUgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfY3JlYXRlX2tleXZhbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfa2V5dmFsPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0NSRUFURV9LRVlWQUw8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5HZW5lcmF0ZXMgYSBuZXcgYXR0cmlidXRlIGtleSBmb3IgYSBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2NyZWF0ZV9rZXl2YWw8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9UeXBlX2NvcHlfYXR0cl9mdW5jdGlvbiAqLCBNUElfVHlwZV9kZWxldGVfYXR0cl9mdW5jdGlvbiAqLCBpbnQgKiwgdm9pZCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9jcmVhdGVfcmVzaXplZDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfcmVzaXplZDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9DUkVBVEVfUkVTSVpFRDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkR1cGxpY2F0ZXMgYSBkYXRhdHlwZSBhbmQgY2hhbmdlcyB0aGUgdXBwZXIgYm91bmQsIGxvd2VyIGJvdW5kLCBhbmQgZXh0ZW50LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfY3JlYXRlX3Jlc2l6ZWQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9EYXRhdHlwZSwgTVBJX0FpbnQsIE1QSV9BaW50LCBNUElfRGF0YXR5cGUgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfY3JlYXRlX3N0cnVjdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfc3RydWN0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0NSRUFURV9TVFJVQ1Q8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50c2NvdW50IGJsb2Nrcy4gRWFjaCBibG9jayBpcyBkZWZpbmVkIGJ5IGFuIGVudHJ5IGluIGFycmF5X29mX2Jsb2NrbGVuZ3RocyxhcnJheV9vZl9kaXNwbGFjZW1lbnRzLCBhbmQgYXJyYXlfb2ZfdHlwZXMuIERpc3BsYWNlbWVudHMgYXJlIGV4cHJlc3NlZCBpbiBieXRlcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3Q8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50IFtdLCBNUElfQWludCBbXSwgTVBJX0RhdGF0eXBlIFtdLCBNUElfRGF0YXR5cGUgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfY3JlYXRlX3N1YmFycmF5PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkNyZWF0ZV9zdWJhcnJheTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9DUkVBVEVfU1VCQVJSQVk8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50cyBhbm5kaW1zLWRpbWVuc2lvbmFsIHN1YmFycmF5IG9mIGFubmRpbXMtZGltZW5zaW9uYWwgYXJyYXkuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9jcmVhdGVfc3ViYXJyYXk8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50IFtdLCBpbnQgW10sIGludCBbXSwgaW50LCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9kZWxldGVfYXR0cjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpEZWxldGVfYXR0cjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9ERUxFVEVfQVRUUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkRlbGV0ZXMgYW4gYXR0cmlidXRlIGZyb20gYSBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2RlbGV0ZV9hdHRyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRGF0YXR5cGUsIGludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfZHVwPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkR1cDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9EVVA8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5EdXBsaWNhdGVzIHRoZSBleGlzdGluZyB0eXBlIHdpdGggYXNzb2NpYXRlZCBrZXkgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfZHVwPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9leHRlbnQ8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0VYVEVOVDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIGV4dGVudCBvZiBhbnkgZGVmaW5lZCBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2V4dGVudDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlLCBNUElfQWludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9mMmM8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBDIGhhbmRsZSB0byBhIGRhdGF0eXBlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+TVBJX0RhdGF0eXBlPC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfZjJjPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRmludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfZnJlZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpGcmVlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0ZSRUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5NYXJrcyBhIGRlcml2ZWQgZGF0YXR5cGUgZm9yIGRlYWxsb2NhdGlvbiBhbmQgc2V0cyBpdHMgaGFuZGxlIHRvIE1QSV9EQVRBVFlQRV9OVUxMLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2ZyZWVfa2V5dmFsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkZyZWVfa2V5dmFsPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0ZSRUVfS0VZVkFMPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+RnJlZXMgYSBkYXRhdHlwZSBrZXkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9mcmVlX2tleXZhbDwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2dldF9hdHRyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkdldF9hdHRyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0dFVF9BVFRSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXR0YWNoZXMgYW4gYXR0cmlidXRlIHRvIGEgZGF0YXR5cGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9nZXRfYXR0cjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlLCBpbnQsIHZvaWQgKiwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2dldF9jb250ZW50czwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpHZXRfY29udGVudHM8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfR0VUX0NPTlRFTlRTPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+T2J0YWlucyB0aGUgYXJndW1lbnRzIHVzZWQgaW4gdGhlIGNyZWF0aW9uIG9mIHRoZSBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2dldF9jb250ZW50czwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlLCBpbnQsIGludCwgaW50LCBpbnQgW10sIE1QSV9BaW50IFtdLCBNUElfRGF0YXR5cGUgW108L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2dldF9lbnZlbG9wZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpHZXRfZW52ZWxvcGU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfR0VUX0VOVkVMT1BFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+RGV0ZXJtaW5lcyB0aGUgY29uc3RydWN0b3IgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGRhdGF0eXBlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfZ2V0X2VudmVsb3BlPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRGF0YXR5cGUsIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9nZXRfZXh0ZW50PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkdldF9leHRlbnQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfR0VUX0VYVEVOVDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIGxvd2VyIGJvdW5kIGFuZCB0aGUgZXh0ZW50IG9mIGFueSBkZWZpbmVkIGRhdGF0eXBlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfZ2V0X2V4dGVudDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlLCBNUElfQWludCAqLCBNUElfQWludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9nZXRfbmFtZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpHZXRfbmFtZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9HRVRfTkFNRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIG5hbWUgdGhhdCB3YXMgbGFzdCBhc3NvY2lhdGVkIHdpdGggYSBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2dldF9uYW1lPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRGF0YXR5cGUsIGNoYXIgKiwgaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2dldF90cnVlX2V4dGVudDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpHZXRfdHJ1ZV9leHRlbnQ8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfR0VUX1RSVUVfRVhURU5UPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgdHJ1ZSBleHRlbnQgb2YgYW55IGRlZmluZWQgZGF0YXR5cGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9nZXRfdHJ1ZV9leHRlbnQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9EYXRhdHlwZSwgTVBJX0FpbnQgKiwgTVBJX0FpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfaGluZGV4ZWQ8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0hJTkRFWEVEPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIG5ldyBkYXRhdHlwZSB0aGF0IHJlcHJlc2VudHNjb3VudCBkaXN0aW5jdCBibG9ja3Mgd2l0aCBvZmZzZXRzIGV4cHJlc3NlZCBpbiBieXRlcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX2hpbmRleGVkPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQsIGludCAqLCBNUElfQWludCAqLCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9odmVjdG9yPC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9IVkVDVE9SPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIG5ldyBkYXRhdHlwZSBvZiBjb3VudCBibG9ja3Mgd2l0aCBzdHJpZGUgZXhwcmVzc2VkIGluIGJ5dGVzLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfaHZlY3RvcjwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQsIE1QSV9BaW50LCBNUElfRGF0YXR5cGUsIE1QSV9EYXRhdHlwZSAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9pbmRleGVkPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OkNyZWF0ZV9pbmRleGVkPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX0lOREVYRUQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50c2NvdW50IGJsb2NrcyB3aXRoIHN0cmlkZSBpbiB0ZXJtcyBvZiBkZWZpbmluZyB0eXBlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfaW5kZXhlZDwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBpbnQgKiwgaW50ICosIE1QSV9EYXRhdHlwZSwgTVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX2xiPC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9MQjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIGxvd2VyIGJvdW5kIG9mIGEgZGF0YXR5cGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9sYjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlLCBNUElfQWludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfVHlwZV9tYXRjaF9zaXplPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6Ok1hdGNoX3NpemU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1RZUEVfQ1JFQVRFX01BVENIX1NJWkU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgcmVmZXJlbmNlIChoYW5kbGUpIHRvIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBuYW1lZCBkYXRhdHlwZXMsIG5vdCBhIGR1cGxpY2F0ZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX21hdGNoX3NpemU8L25hbWU+Ci08YXJndW1lbnRzPiBpbnQsIGludCwgTVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX3NldF9hdHRyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OlNldF9hdHRyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX1NFVF9BVFRSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXR0YWNoZXMgdGhlIGRhdGF0eXBlIGF0dHJpYnV0ZSB2YWx1ZSB0byB0aGUgZGF0YXR5cGUgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUga2V5LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfc2V0X2F0dHI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9EYXRhdHlwZSwgaW50LCB2b2lkICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX3NldF9uYW1lPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6RGF0YXR5cGU6OlNldF9uYW1lPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX1NFVF9OQU1FPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXNzb2NpYXRlcyBhIG5hbWUgc3RyaW5nIHdpdGggYSBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX3NldF9uYW1lPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRGF0YXR5cGUsIGNoYXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfc2l6ZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpHZXRfc2l6ZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9TSVpFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcHJlc2VudGVkIGJ5IGFueSBkZWZpbmVkIGRhdGF0eXBlLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1R5cGVfc2l6ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0RhdGF0eXBlLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfc3RydWN0PC9jbmFtZT4KLTxjcHBuYW1lPihub25lKTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfVFlQRV9TVFJVQ1Q8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIGEgbmV3IGRhdGF0eXBlIHRoYXQgcmVwcmVzZW50c2NvdW50IGJsb2NrcywgZWFjaCB3aXRoIGEgZGlzdGluY3QgZm9ybWF0IGFuZCBvZmZzZXQuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV9zdHJ1Y3Q8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50ICosIE1QSV9BaW50ICosIE1QSV9EYXRhdHlwZSAqLCBNUElfRGF0YXR5cGUgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1R5cGVfdWI8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX1VCPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyB0aGUgdXBwZXIgYm91bmQgb2YgYSBkYXRhdHlwZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9UeXBlX3ViPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfRGF0YXR5cGUsIE1QSV9BaW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9UeXBlX3ZlY3RvcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpDcmVhdGVfdmVjdG9yPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9UWVBFX1ZFQ1RPUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBuZXcgZGF0YXR5cGUgdGhhdCByZXByZXNlbnRzIGVxdWFsbHktc3BhY2VkIGJsb2NrcyBvZiByZXBsaWNhdGVkIGRhdGEuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfVHlwZV92ZWN0b3I8L25hbWU+Ci08YXJndW1lbnRzPmludCwgaW50LCBpbnQsIE1QSV9EYXRhdHlwZSwgTVBJX0RhdGF0eXBlICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9VbnBhY2s8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpEYXRhdHlwZTo6VW5wYWNrPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9VTlBBQ0s8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5VbnBhY2tzIHRoZSBtZXNzYWdlIGludG8gdGhlIHNwZWNpZmllZCByZWNlaXZlIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgcGFja2VkIGJ1ZmZlci48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9VbnBhY2s8L25hbWU+Ci08YXJndW1lbnRzPnZvaWQqLCBpbnQsIGludCAqLCB2b2lkICosIGludCwgTVBJX0RhdGF0eXBlLCBNUElfQ29tbTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1VucGFja19leHRlcm5hbDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6OkRhdGF0eXBlOjpVbnBhY2tfZXh0ZXJuYWw8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1VOUEFDS19FWFRFUk5BTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlVucGFja3MgdGhlIG1lc3NhZ2UgaW50byB0aGUgc3BlY2lmaWVkIHJlY2VpdmUgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBwYWNrZWQgYnVmZmVyLCB1c2luZyB0aGUgZXh0ZXJuYWwzMiBkYXRhIGZvcm1hdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9VbnBhY2tfZXh0ZXJuYWw8L25hbWU+Ci08YXJndW1lbnRzPmNoYXIgKiwgdm9pZCAqLCBNUElfQWludCwgTVBJX0FpbnQgKiwgdm9pZCAqLCBpbnQsIE1QSV9EYXRhdHlwZTwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dhaXQ8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpSZXF1ZXN0OjpXYWl0PC9jcHBuYW1lPgotPGZuYW1lPk1QSV9XQUlUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+V2FpdHMgZm9yIGEgbm9uLWJsb2NraW5nIG9wZXJhdGlvbiB0byBjb21wbGV0ZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XYWl0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfUmVxdWVzdCAqLCBNUElfU3RhdHVzICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9XYWl0YWxsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6UmVxdWVzdDo6V2FpdGFsbDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0FJVEFMTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPldhaXRzIGZvciBhIGNvbGxlY3Rpb24gb2Ygbm9uLWJsb2NraW5nIG9wZXJhdGlvbnMgdG8gY29tcGxldGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2FpdGFsbDwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBNUElfUmVxdWVzdCAqLCBNUElfU3RhdHVzICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9XYWl0YW55PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6UmVxdWVzdDo6V2FpdGFueTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0FJVEFOWTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPldhaXRzIGZvciBhbnkgc3BlY2lmaWVkIG5vbi1ibG9ja2luZyBvcGVyYXRpb24gdG8gY29tcGxldGUuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2FpdGFueTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBNUElfUmVxdWVzdCAqLCBpbnQgKiwgTVBJX1N0YXR1cyAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2FpdHNvbWU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpSZXF1ZXN0OjpXYWl0c29tZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0FJVFNPTUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5XYWl0cyBmb3IgYXQgbGVhc3Qgb25lIG9mIGEgbGlzdCBvZiBub24tYmxvY2tpbmcgb3BlcmF0aW9ucyB0byBjb21wbGV0ZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XYWl0c29tZTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBNUElfUmVxdWVzdCAqLCBpbnQgKiwgaW50ICosIE1QSV9TdGF0dXMgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9jMmY8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlRyYW5zbGF0ZXMgYSBDIHdpbmRvdyBoYW5kbGUgaW50byBhIEZPUlRSQU4gaGFuZGxlIHRvIHRoZSBzYW1lIHdpbmRvdy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPk1QSV9GaW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9jMmY8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9XaW48L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9XaW5fY2FsbF9lcnJoYW5kbGVyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpDYWxsX2VycmhhbmRsZXI8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9DQUxMX0VSUkhBTkRMRVI8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5DYWxscyB0aGUgZXJyb3IgaGFuZGxlciBhc3NpZ25lZCB0byB0aGUgd2luZG93IHdpdGggdGhlIGVycm9yIGNvZGUgc3VwcGxpZWQuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX2NhbGxfZXJyaGFuZGxlcjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1dpbiwgaW50PC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2NvbXBsZXRlPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpDb21wbGV0ZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX0NPTVBMRVRFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q29tcGxldGVzIGFuIFJNQSBhY2Nlc3MgZXBvY2ggb24gYSB3aW5kb3cgb2JqZWN0LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9jb21wbGV0ZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1dpbjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9jcmVhdGU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OkNyZWF0ZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX0NSRUFURTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFsbG93cyBlYWNoIHRhc2sgaW4gYW4gaW50cmEtY29tbXVuaWNhdG9yIGdyb3VwIHRvIHNwZWNpZnkgYSAid2luZG93IiBpbiBpdHMgbWVtb3J5IHRoYXQgaXMgbWFkZSBhY2Nlc3NpYmxlIHRvIGFjY2Vzc2VzIGJ5IHJlbW90ZSB0YXNrcy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fY3JlYXRlPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkICosIE1QSV9BaW50LCBpbnQsIE1QSV9JbmZvLCBNUElfQ29tbSwgTVBJX1dpbiAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2NyZWF0ZV9lcnJoYW5kbGVyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpDcmVhdGVfZXJyaGFuZGxlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX0NSRUFURV9FUlJIQU5ETEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+Q3JlYXRlcyBhbiBlcnJvciBoYW5kbGVyIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIHdpbmRvd3MuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX2NyZWF0ZV9lcnJoYW5kbGVyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luX2VycmhhbmRsZXJfZm4gKiwgTVBJX0VycmhhbmRsZXIgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9jcmVhdGVfa2V5dmFsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpDcmVhdGVfa2V5dmFsPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9XSU5fQ1JFQVRFX0tFWVZBTDwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkdlbmVyYXRlcyBhIG5ldyB3aW5kb3cgYXR0cmlidXRlIGtleS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fY3JlYXRlX2tleXZhbDwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1dpbl9jb3B5X2F0dHJfZnVuY3Rpb24gKiwgTVBJX1dpbl9kZWxldGVfYXR0cl9mdW5jdGlvbiAqLCBpbnQgKiwgdm9pZCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2RlbGV0ZV9hdHRyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpEZWxldGVfYXR0cjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX0RFTEVURV9BVFRSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+RGVsZXRlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhIHdpbmRvdy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fZGVsZXRlX2F0dHI8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9XaW4sIGludDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9mMmM8L2NuYW1lPgotPGNwcG5hbWU+KG5vbmUpPC9jcHBuYW1lPgotPGZuYW1lPihub25lKTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgYSBDIGhhbmRsZSB0byBhIHdpbmRvdy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPk1QSV9XaW48L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX2YyYzwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX0ZpbnQ8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9XaW5fZmVuY2U8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OkZlbmNlPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9XSU5fRkVOQ0U8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5TeW5jaHJvbml6ZXMgUk1BIGNhbGxzIG9uIGEgd2luZG93LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9mZW5jZTwvbmFtZT4KLTxhcmd1bWVudHM+aW50LCBNUElfV2luPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2ZyZWU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OkZyZWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9GUkVFPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+RnJlZXMgdGhlIHdpbmRvdyBvYmplY3QgYW5kIHJldHVybnMgYSBudWxsIGhhbmRsZSAoZXF1YWwgdG8gTVBJX1dJTl9OVUxMKS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fZnJlZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1dpbiAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2ZyZWVfa2V5dmFsPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpGcmVlX2tleXZhbDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX0ZSRUVfS0VZVkFMPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+TWFya3MgYSB3aW5kb3cgYXR0cmlidXRlIGtleSBmb3IgZGVhbGxvY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9mcmVlX2tleXZhbDwvbmFtZT4KLTxhcmd1bWVudHM+aW50ICo8L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9XaW5fZ2V0X2F0dHI8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OkdldF9hdHRyPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9XSU5fR0VUX0FUVFI8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXRyaWV2ZXMgdGhlIHdpbmRvdyBhdHRyaWJ1dGUgdmFsdWUgaWRlbnRpZmllZCBieSB0aGUga2V5LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9nZXRfYXR0cjwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1dpbiwgaW50LCB2b2lkICosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2dldF9lcnJoYW5kbGVyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpHZXRfZXJyaGFuZGxlcjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX0dFVF9FUlJIQU5ETEVSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0cmlldmVzIHRoZSBlcnJvciBoYW5kbGVyIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYSB3aW5kb3cuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX2dldF9lcnJoYW5kbGVyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luLCBNUElfRXJyaGFuZGxlciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2dldF9ncm91cDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Oldpbjo6R2V0X2dyb3VwPC9jcHBuYW1lPgotPGZuYW1lPk1QSV9XSU5fR0VUX0dST1VQPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+UmV0dXJucyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ3JvdXAgb2YgdGhlIGNvbW11bmljYXRvciB1c2VkIHRvIGNyZWF0ZSBhIHdpbmRvdy48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fZ2V0X2dyb3VwPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luLCBNUElfR3JvdXAgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9nZXRfbmFtZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Oldpbjo6R2V0X25hbWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9HRVRfTkFNRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPlJldHVybnMgdGhlIG5hbWUgdGhhdCB3YXMgbGFzdCBhc3NvY2lhdGVkIHdpdGggYSB3aW5kb3cuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX2dldF9uYW1lPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luLCBjaGFyICosIGludCAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX2xvY2s8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OkxvY2s8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9MT0NLPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+U3RhcnRzIGFuIFJNQSBhY2Nlc3MgZXBvY2ggYXQgdGhlIHRhcmdldCB0YXNrLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9sb2NrPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQsIGludCwgaW50LCBNUElfV2luPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX3Bvc3Q8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OlBvc3Q8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9QT1NUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+U3RhcnRzIGFuIFJNQSBleHBvc3VyZSBlcG9jaCBmb3IgYSBsb2NhbCB3aW5kb3cuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX3Bvc3Q8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgaW50LCBNUElfV2luPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX3NldF9hdHRyPC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpTZXRfYXR0cjwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX1NFVF9BVFRSPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+QXR0YWNoZXMgdGhlIHdpbmRvdyBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIHdpbmRvdyBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBrZXkuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX3NldF9hdHRyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luLCBpbnQsIHZvaWQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9zZXRfZXJyaGFuZGxlcjwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Oldpbjo6U2V0X2VycmhhbmRsZXI8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9TRVRfRVJSSEFORExFUjwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkF0dGFjaGVzIGEgbmV3IGVycm9yIGhhbmRsZXIgdG8gYSB3aW5kb3cuPC9kZXNjcmlwdGlvbj4KLTxwcm90b3R5cGU+Ci08cmV0dXJuVHlwZT5pbnQ8L3JldHVyblR5cGU+Ci08bmFtZT5NUElfV2luX3NldF9lcnJoYW5kbGVyPC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luLCBNUElfRXJyaGFuZGxlcjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl9zZXRfbmFtZTwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Oldpbjo6U2V0X25hbWU8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9TRVRfTkFNRTwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkFzc29jaWF0ZXMgYSBuYW1lIHN0cmluZyB3aXRoIGEgd2luZG93LjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl9zZXRfbmFtZTwvbmFtZT4KLTxhcmd1bWVudHM+TVBJX1dpbiwgY2hhciAqPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX3N0YXJ0PC9jbmFtZT4KLTxjcHBuYW1lPk1QSTo6V2luOjpTdGFydDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX1NUQVJUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+U3RhcnRzIGFuIFJNQSBhY2Nlc3MgZXBvY2ggZm9yIGEgd2luZG93IG9iamVjdC48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fc3RhcnQ8L25hbWU+Ci08YXJndW1lbnRzPk1QSV9Hcm91cCwgaW50LCBNUElfV2luPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV2luX3Rlc3Q8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OlRlc3Q8L2NwcG5hbWU+Ci08Zm5hbWU+TVBJX1dJTl9URVNUPC9mbmFtZT4KLTxuYW1lc3BhY2U+PC9uYW1lc3BhY2U+Ci08ZGVzY3JpcHRpb24+VHJpZXMgdG8gY29tcGxldGUgYW4gUk1BIGV4cG9zdXJlIGVwb2NoLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl90ZXN0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luLCBpbnQgKjwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08ZnVuY3Rpb24+Ci08Y25hbWU+TVBJX1dpbl91bmxvY2s8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXaW46OlVubG9jazwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX1VOTE9DSzwvZm5hbWU+Ci08bmFtZXNwYWNlPjwvbmFtZXNwYWNlPgotPGRlc2NyaXB0aW9uPkNvbXBsZXRlcyBhbiBSTUEgYWNjZXNzIGVwb2NoIGF0IHRoZSB0YXJnZXQgdGFzay48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmludDwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XaW5fdW5sb2NrPC9uYW1lPgotPGFyZ3VtZW50cz5pbnQsIE1QSV9XaW48L2FyZ3VtZW50cz4KLTwvcHJvdG90eXBlPgotPC9mdW5jdGlvbj4KLQotPGZ1bmN0aW9uPgotPGNuYW1lPk1QSV9XaW5fd2FpdDwvY25hbWU+Ci08Y3BwbmFtZT5NUEk6Oldpbjo6V2FpdDwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV0lOX1dBSVQ8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5Db21wbGV0ZXMgYW4gUk1BIGV4cG9zdXJlIGVwb2NoLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+aW50PC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1dpbl93YWl0PC9uYW1lPgotPGFyZ3VtZW50cz5NUElfV2luPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV3RpY2s8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXdGljazwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV1RJQ0s8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIE1QSV9XVElNRSBpbiBzZWNvbmRzLjwvZGVzY3JpcHRpb24+Ci08cHJvdG90eXBlPgotPHJldHVyblR5cGU+ZG91YmxlPC9yZXR1cm5UeXBlPgotPG5hbWU+TVBJX1d0aWNrPC9uYW1lPgotPGFyZ3VtZW50cz52b2lkPC9hcmd1bWVudHM+Ci08L3Byb3RvdHlwZT4KLTwvZnVuY3Rpb24+Ci0KLTxmdW5jdGlvbj4KLTxjbmFtZT5NUElfV3RpbWU8L2NuYW1lPgotPGNwcG5hbWU+TVBJOjpXdGltZTwvY3BwbmFtZT4KLTxmbmFtZT5NUElfV1RJTUU8L2ZuYW1lPgotPG5hbWVzcGFjZT48L25hbWVzcGFjZT4KLTxkZXNjcmlwdGlvbj5SZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRpbWUgYXMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotPHByb3RvdHlwZT4KLTxyZXR1cm5UeXBlPmRvdWJsZTwvcmV0dXJuVHlwZT4KLTxuYW1lPk1QSV9XdGltZTwvbmFtZT4KLTxhcmd1bWVudHM+dm9pZDwvYXJndW1lbnRzPgotPC9wcm90b3R5cGU+Ci08L2Z1bmN0aW9uPgotCi08L2FsbEZ1bmN0aW9ucz4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzJjZmFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIE1QSSBTdXBwb3J0Ci1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9wbHVnaW4ueG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRhNzIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iUFRQIE1QSSBWaWV3cyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJNUEkgQXJ0aWZhY3QgVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL21waS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnZpZXdzLk1QSVRhYmxlVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS52aWV3cy5NUElUYWJsZVZpZXciPgotICAgICAgPC92aWV3PgotCi0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0gIE1QSSBtYXJrZXJzIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9Im1waU1hcmtlciIKLSAgICAgICAgbmFtZT0iTVBJIEFydGlmYWN0IE1hcmtlciI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlTmFtZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aGVMaW5lTm8iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGhlTmV3TGluZU5vIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHVtbk5vIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uc3RydWN0VHlwZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWVJRCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tIHRoaXMgY2hhbmdlcyB0aGUgbWFya2VyIGltYWdlIGluIHRoZSBlZGl0b3IgbWFya2VyIGJhciAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5hbm5vdGF0aW9uVHlwZXMiPgotICAgICAgPHR5cGUKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLm1waU1hcmtlciIKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLm1waU1hcmtlckFubm90YXRpb24iPgotICAgICAgPC90eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLm1waU1hcmtlckFubm90YXRpb24iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9tcGkuZ2lmIiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJlc2VudGF0aW9uTGF5ZXI9IjMiCi0gICAgICAgICAgICBsYWJlbD0iTVBJIEFubm90YXRpb24gTWFya2VyIgotICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0ibXBpSW5kaWNhdGlvbiIKLSAgICAgICAgICAgIHRleHRQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEhpZ2hsaWdodGluZyIKLSAgICAgICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VLZXk9ImFydGlmYWN0SW5kaWNhdGlvbkNvbG9yIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlVmFsdWU9IjAsMTI4LDE5MiIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotCQkJc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dQb3J0aW5nSW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbiIKLSAgICAgICAgICAgIHNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0idHJ1ZSIKLSAgICAgICAgICAgIGlzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleT0iaXNQb3J0aW5nR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldCIKLQotICAgICAgICAgICAgaXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ1JlY29yZEdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLSAgICAgICAgICAgID4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4gIAotICAgPC9leHRlbnNpb24+Ci0gIAotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQotICAgICA8cGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnByZWZzLk1QSVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnByZWZwYWdlIgotICAgICAgICAgICAgbmFtZT0iTVBJIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5wcmVmcy5QTERUUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICAvPgotIDwhLS0gICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5wdHBQcmVmZXJlbmNlc1BhZ2Uvb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnByZWZzLlBMRFRQcmVmZXJlbmNlUGFnZSIKLSAtLT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LnVpLkNIZWxwUHJvdmlkZXIiPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuZWRpdG9ySGVscC5NcGlDSGVscFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLmVkaXRvckhlbHAuTXBpQ0hlbHBQcm92aWRlciIvPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuZWRpdG9ySGVscC5NcGlDUFBIZWxwUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuZWRpdG9ySGVscC5NcGlDUFBIZWxwUHJvdmlkZXIiPgotICAgICAgPC9wcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5wcmVmcy5NUElQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPC9pbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuYWN0aW9ucy5SdW5BbmFseXNlTVBJY29tbWFuZEhhbmRsZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuY29tbWFuZDIiCi0gICAgICAgICAgICBuYW1lPSJmaW5kIG1waSBhcnRpZmFjdHMiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tIHRoZXNlIGdvIHVuZGVyIHRoZSBkcm9wZG93biBtZW51OyBjb3VsZCBjb21lIGZyb20gYW5vdGhlciBwbHVnaW4gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idGVtcElEIgotICAgICAgICAgbmFtZT0idGVtcE5BTUUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi50b29sYmFyLmNvbW1hbmQxP2FmdGVyPXNlcGFyYXRvcjEubXBpIj4KLSAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLmNvbW1hbmQyIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvbXBpLmdpZiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJTaG93IE1QSSBBcnRpZmFjdHMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0gICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgIAotICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAgIDwhLS0gQ29kZSB0ZW1wbGF0ZXMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0gICA8aW5jbHVkZSBmaWxlPSJ0ZW1wbGF0ZXMvbXBpX3RlbXBsYXRlcy54bWwiIC8+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc2FtcGxlcy90ZXN0TVBJLmMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NhbXBsZXMvdGVzdE1QSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWJkY2QzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc2FtcGxlcy90ZXN0TVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJtcGkuaCIKLS8vIFNhbXBsZSBNUEkgcHJvZ3JhbQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0JcHJpbnRmKCJIZWxsbyBNUEkgV29ybGQgdGhlIG9yaWdpbmFsLlxuIik7CQotCWludCAgbXlfcmFuazsgLyogcmFuayBvZiBwcm9jZXNzICovCi0JaW50ICBwOyAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc2VzICovCi0JaW50IHNvdXJjZTsgICAvKiByYW5rIG9mIHNlbmRlciAqLwotCWludCBkZXN0OyAgICAgLyogcmFuayBvZiByZWNlaXZlciAqLwotCWludCB0YWc9MDsgICAgLyogdGFnIGZvciBtZXNzYWdlcyAqLwotCWNoYXIgbWVzc2FnZVsxMDBdOyAgICAgICAgLyogc3RvcmFnZSBmb3IgbWVzc2FnZSAqLwotCU1QSV9TdGF0dXMgc3RhdHVzIDsgICAvKiByZXR1cm4gc3RhdHVzIGZvciByZWNlaXZlICovCi0JCi0JLyogc3RhcnQgdXAgTVBJICovCi0JCi0JTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKLQkKLQkvKiBmaW5kIG91dCBwcm9jZXNzIHJhbmsgKi8KLQlNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmbXlfcmFuayk7IAotCQotCS8qIGZpbmQgb3V0IG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmcCk7IAotCQotCQotCWlmIChteV9yYW5rICE9MCl7Ci0JCS8qIGNyZWF0ZSBtZXNzYWdlICovCi0JCXNwcmludGYobWVzc2FnZSwgIkdyZWV0aW5ncyBmcm9tIHByb2Nlc3MgJWQhIiwgbXlfcmFuayk7Ci0JCWRlc3QgPSAwOwotCQkvKiB1c2Ugc3RybGVuKzEgc28gdGhhdCAnXDAnIGdldCB0cmFuc21pdHRlZCAqLwotCQlNUElfU2VuZChtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkrMSwgTVBJX0NIQVIsCi0JCSAgIGRlc3QsIHRhZywgTVBJX0NPTU1fV09STEQpOwotCX0KLQllbHNlewotCQlwcmludGYoIkZyb20gcHJvY2VzcyAwOiBOdW0gcHJvY2Vzc2VzOiAlZFxuIixwKTsKLQkJZm9yIChzb3VyY2UgPSAxOyBzb3VyY2UgPCBwOyBzb3VyY2UrKykgewotCQkJTVBJX1JlY3YobWVzc2FnZSwgMTAwLCBNUElfQ0hBUiwgc291cmNlLCB0YWcsCi0JCQkgICAgICBNUElfQ09NTV9XT1JMRCwgJnN0YXR1cyk7Ci0JCQlwcmludGYoIiVzXG4iLG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qIHNodXQgZG93biBNUEkgKi8KLQlNUElfRmluYWxpemUoKTsgCi0JCi0JCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9NUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9NUElBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDQzNTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdE1hcmtpbmdWaXNpdG9yOwotCi0vKioKLSAqIAotICogQGF1dGhvciB0aWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3IgZXh0ZW5kcyBBcnRpZmFjdE1hcmtpbmdWaXNpdG9yCi17Ci0gICAgcHVibGljIE1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3IoU3RyaW5nIG1hcmtlcklkKQotICAgIHsKLSAgICAgICAgc3VwZXIobWFya2VySWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL01lc3NhZ2VzLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNhYzY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvTXBpQXJ0aWZhY3RNYW5hZ2VyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9NcGlBcnRpZmFjdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmYTYyZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9NcGlBcnRpZmFjdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0OwotCi0vKioKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1waUFydGlmYWN0TWFuYWdlcgotewotICAgIHN0YXRpYyBMaXN0ICAgIHJlcG9zaXRvcnk7Ci0gICAgc3RhdGljIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vIHRvIGJlIGFibGUgdG8gbG9vayB1cCBieSB1bmlxdWUgSUQgKGZpbmRpbmcKLSAgICBzdGF0aWMgU3RyaW5nICBpbnB1dEZpbGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIE1QSSBhcnRpZmFjdCB0byB0aGUgcmVwb3NpdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBwaQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNcGlBcnRpZmFjdChBcnRpZmFjdCBwaSkKLSAgICB7Ci0gICAgICAgIHJlcG9zaXRvcnkuYWRkKHBpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gTVBJIGFydGlmYWN0IHRvIHRoZSBoYXNodGFibGUgZm9yIGZ1dHVyZSBsb29rdXAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTXBpQXJ0aWZhY3RUb0hhc2goQXJ0aWZhY3QgcGkpCi0gICAgewotICAgICAgICBTdHJpbmcgaWQgPSBwaS5nZXRJZCgpOyAvLyBmb3IgZGVidWdnaW5nIGFjY2VzcyBvbmx5Ci0gICAgICAgIGhhc2hNYXAucHV0KGlkLCBwaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0cmlldmUgTVBJIGFydGlmYWN0IGJ5IHVuaXF1ZSBJRC4gVXNlZCBmb3IgcmV0cmlldmluZyBhcnRpZmFjdHMgd2hlbiBuZWVkZWQgZnJvbSB0aGUgTWFya2VycyAtIHNpbmNlIG1hcmtlcnMKLSAgICAgKiBjYW4ndCBob2xkIG9uIHRvIHRoZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBcnRpZmFjdCBnZXRNcGlBcnRpZmFjdChTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBBcnRpZmFjdCBwaSA9IChBcnRpZmFjdCkgaGFzaE1hcC5nZXQoaWQpOwotICAgICAgICByZXR1cm4gcGk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRNcGlBcnRpZmFjdHMoKQotICAgIHsKLSAgICAgICAgT2JqZWN0W10gcGlzID0gaGFzaE1hcC52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgICAgIHJldHVybiBwaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBIYXNoTWFwIGdldE1waUFydGlmYWN0TWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBoYXNoTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldExpc3QgLSBnZXQgdGhlIGxpc3Qgb2YgbXBpIGFydGlmYWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldElucHV0RmlsZSAtIGdldCB0aGUgaW5wdXQgZmlsZSAoIG9uIHdoaWNoIGFuYWx5c2lzIGlzIGludm9rZWQgKQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0RmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5wdXRGaWxlTmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL01waUlEcy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvTXBpSURzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzVkN2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvTXBpSURzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZTsKLQotLyoqCi0gKiBNaXNjLiBJRHMgZm9yIHByZWZlcmVuY2VzLCBtYXJrZXJzLCBldGMuCi0gKiAKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1waUlEcwotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfUlVOX0FOQUxZU0lTICA9ICJydW5BbmFseXNpcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9FQ0hPX0ZPUkNFICAgID0gImZvcmNlRWNobyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0VSUk9SX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLm1waUVycm9yTWFya2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgICAgICAgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUubXBpTWFya2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRSAgICAgICAgPSAiZmlsZW5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgICAgICAgICAgICA9ICJuYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiAgICAgPSAiZGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEICAgICAgICAgICAgICA9ICJ1bmlxdWVJRCI7Ci0KLSAgICAvLyBub3RlIGJ1aWx0LWluIG1hcmtlciBpZCB0b28uLi4gbm90IHN1cmUgdGhpcyBpcyB1c2VkLAotICAgIC8vIGNvbXBhcmUgd2l0aCBJTWFya2VyLkxJTkVfTlVNQkVSIHdoaWNoIGlzIHByb2JhYmx5IHVzZWQgaW5zdGVhZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FICAgICAgICAgICAgPSAidGhlTGluZU5vIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FICAgICAgICAgPSAidGhlTmV3TGluZU5vIjsKLQotICAgIC8qKiBQcmVmZXJlbmNlIHBhZ2UgbmFtZSBmb3IgTVBJIEluY2x1ZGVzIGZpZWxkIGxhYmVsICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgTVBJX0lOQ0xVREVTICAgID0gIk1QSSBJbmNsdWRlcyI7Ci0gICAgLyoqIFByZWZlcmVuY2Ugc2V0dGluZyBmb3IgZGVmYXVsdCBtcGkgYnVpbGQgY29tbWFuZCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9CVUlMRF9DTUQgPSAibXBpQnVpbGRDb21tYW5kIjsKLQkvKiogUHJlZmVyZW5jZSBzZXR0aW5nIGZvciBkZWZhdWx0IGMrKyBtcGkgYnVpbGQgY29tbWFuZCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9DUFBfQlVJTERfQ01EID0gIm1waUNwcEJ1aWxkQ29tbWFuZCI7Ci0JLyoqIFByZWZlcmVuY2Ugc2V0dGluZyBmb3Igd2hldGhlciBvciBub3QgdG8gcHJvbXB0IHRoZSB1c2VyIHdoZW4gTVBJIGFwaXMgYXJlIGZvdW5kIGluIG90aGVyIGxvY2F0aW9ucyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9QUk9NUFRfRk9SX09USEVSX0lOQ0xVREVTPSJtcGlQcm9tcHRGb3JPdGhlckluY2x1ZGVzIjsKLQotICAgIC8qKiBNYXJrZXIgYXR0cmlidXRlIGZvciB0aGUgZXh0cmEgaW5mbyBzYXZlZCBmb3IgZWFjaCBtYXJrZXIvYXJ0aWZhY3QgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJVQ1RfVFlQRSAgPSAiY29uc3RydWN0VHlwZSI7Ci0gICAgCi0gICAgLyoqIGlkIGZvciBNUEkgQXJ0aWZhY3QgdmlldyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnZpZXdzLk1QSVRhYmxlVmlldyI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL01waVBsdWdpbi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvTXBpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2RmYzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvTXBpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGZvciBNUEkgZGV2ZWxvcG1lbnQgVG9vbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNcGlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gICAgLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2UgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNcGlQbHVnaW4gcGx1Z2luOwotICAgIC8qKiBSZXNvdXJjZSBidW5kbGUgKi8KLSAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlICAgcmVzb3VyY2VCdW5kbGU7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXBpUGx1Z2luKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHJlc291cmNlQnVuZGxlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNcGlQbHVnaW4gZ2V0RGVmYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gTXBpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICByZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKE1waUlEcy5NUElfVklFV19JRCwgcGF0aCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIHNvIHRoYXQgb3RoZXIgcGx1Z2lucyBjYW4gYWNjZXNzIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyB0aGlzIHBsdWdpbgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEljb25JbWFnZURlc2NyaXB0b3IoKXsKLSAgICAJSW1hZ2VEZXNjcmlwdG9yIGlkID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9tcGkuZ2lmIik7Ci0gICAgCXJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4KLSAgICAgKiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkKLSAgICB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheTsKLSAgICAgICAgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVmZXJlbmNlIHNldHRpbmcgZm9yIE1QSSBpbmNsdWRlIHBhdGhzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TXBpSW5jbHVkZURpcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZ0xpc3QgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhNcGlJRHMuTVBJX0lOQ0xVREVTKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmdMaXN0LCBGaWxlLnBhdGhTZXBhcmF0b3IgKyAiXG5cciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgTGlzdDxTdHJpbmc+IGRpcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBkaXJzLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQTFVHSU5fSUQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvYWN0aW9ucy9SdW5BbmFseXNlTVBJY29tbWFuZEhhbmRsZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL2FjdGlvbnMvUnVuQW5hbHlzZU1QSWNvbW1hbmRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDk1ZjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvYWN0aW9ucy9SdW5BbmFseXNlTVBJY29tbWFuZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LmdudS5jLkdDQ0xhbmd1YWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuZ251LmNwcC5HUFBMYW5ndWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSVRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5TY2FuUmV0dXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hY3Rpb25zLlJ1bkFuYWx5c2VIYW5kbGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5WaWV3QWN0aXZhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1QSUFydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuTXBpSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5hbmFseXNpcy5NcGlDQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5hbmFseXNpcy5NcGlDUFBBU1RWaXNpdG9yOwotCi0vKioKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5BbmFseXNlTVBJY29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBSdW5BbmFseXNlSGFuZGxlckJhc2UKLXsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlICJSdW4gQW5hbHlzaXMiIGFjdGlvbgotCSAqLwotCXB1YmxpYyBSdW5BbmFseXNlTVBJY29tbWFuZEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCJNUEkiLCBuZXcgTVBJQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihNcGlJRHMuTUFSS0VSX0lEKSwgTXBpSURzLk1BUktFUl9JRCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIE1QSSBhbmFseXNpcyBhcnRpZmFjdHMgZm9yIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBpbmNsdWRlcwotCSAqICAgICAgICAgICAgTVBJIGluY2x1ZGUgcGF0aHMKLQkgKiBAcmV0dXJuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNjYW5SZXR1cm4gZG9BcnRpZmFjdEFuYWx5c2lzKGZpbmFsIElUcmFuc2xhdGlvblVuaXQgdHUsCWZpbmFsIExpc3Q8U3RyaW5nPiBpbmNsdWRlcykgewotCQlmaW5hbCBTY2FuUmV0dXJuIG1zciA9IG5ldyBTY2FuUmV0dXJuKCk7Ci0JCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IHR1LmdldEVsZW1lbnROYW1lKCk7Ci0JCUlMYW5ndWFnZSBsYW5nOwotCQl0cnkgewotCQkJbGFuZyA9IHR1LmdldExhbmd1YWdlKCk7IAotICAgICAgICAgICAgCi0JCQkvL2xvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBJQVNUVHJhbnNsYXRpb25Vbml0IGF0dSA9IGdldEFTVCh0dSk7IC8vIHVzZSBpbmRleDsgd2FzIHR1LmdldEFTVCgpOwotCQkJLy9sb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSdW5BbmFseXNlTVBJQ29tbWFuZEhhbmRsZXI6IHRpbWUgdG8gYnVpbGQgQVNUIGZvciAiK3R1KyI6ICIrKGVuZFRpbWUtc3RhcnRUaW1lKS8xMDAwLjArIiBzZWMiKTsKLQkJCVN0cmluZyBsYW5ndWFnZUlEPWxhbmcuZ2V0SWQoKTsKLQkJCWlmIChsYW5ndWFnZUlELmVxdWFscyhHQ0NMYW5ndWFnZS5JRCkpIHsvLyBDCi0JCQkJYXR1LmFjY2VwdChuZXcgTXBpQ0FTVFZpc2l0b3IoaW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxhbmd1YWdlSUQuZXF1YWxzKEdQUExhbmd1YWdlLklEKSkgeyAvLyBDKysKLQkJCSAgYXR1LmFjY2VwdChuZXcgTXBpQ1BQQVNUVmlzaXRvcihpbmNsdWRlcywgZmlsZU5hbWUsIG1zcikpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCUNvbW1vblBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwiUnVuQW5hbHlzZU1QSUNvbW1hbmRIYW5kbGVyLmdldEFTVCgpOkVycm9yIHNldHRpbmcgdXAgdmlzaXRvciBmb3IgcHJvamVjdCAiK3R1LmdldENQcm9qZWN0KCkrIiBlcnJvcj0iK2UuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gbXNyOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlUGF0aCgpIHsKLQkJcmV0dXJuIE1waVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXBpSW5jbHVkZURpcnMoKTsKLQl9Ci0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVBcnRpZmFjdFZpZXcoKSB7Ci0JCVZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KE1waUlEcy5NUElfVklFV19JRCk7Ci0JfQotCi0JCi0JIAotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9hbmFseXNpcy9NcGlDQVNUVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvYW5hbHlzaXMvTXBpQ0FTVFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlMWI5YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9hbmFseXNpcy9NcGlDQVNUVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTGl0ZXJhbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5TY2FuUmV0dXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hbmFseXNpcy5QbGR0QXN0VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlJRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuTXBpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgZG9tLXdhbGtlciBjb2xsZWN0cyAiYXJ0aWZhY3RzIiByZWxhdGVkIHRvIHRoZSBzcGVjaWZpYyBkb21haW4gPGJyPgotICogKGUuZy4gTVBJLCBPcGVuTVAsIGV0Yy4pLiBDdXJyZW50bHkgdGhlc2UgYXJ0aWZhY3RzIGluY2x1ZGUgZnVuY3Rpb24gY2FsbHMKLSAqIGFuZCBjb25zdGFudHMuIEl0IGFkZHMgbWFya2VycyB0byB0aGUgc291cmNlIGZpbGUgZm9yIEMgY29kZSwgbWFya2luZyB0aGUKLSAqIHBvc2l0aW9uIG9mIHRoZSBhcnRpZmFjdHMgZm91bmQuCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNcGlDQVNUVmlzaXRvciBleHRlbmRzIFBsZHRBc3RWaXNpdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIk1QSV8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYy8qIGZpbmFsICovYm9vbGVhbiB0cmFjZU9uID0gZmFsc2U7Ci0KLQl7Ci0JCXRoaXMuc2hvdWxkVmlzaXRFeHByZXNzaW9ucyA9IHRydWU7Ci0JCXRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLQkJdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0JCXRoaXMuc2hvdWxkVmlzaXRUcmFuc2xhdGlvblVuaXQgPSB0cnVlOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBNcGlDQVNUVmlzaXRvcihMaXN0IG1waUluY2x1ZGVzLCBTdHJpbmcgZmlsZU5hbWUsIFNjYW5SZXR1cm4gbXNyKSB7Ci0JCXN1cGVyKG1waUluY2x1ZGVzLCBmaWxlTmFtZSwgbXNyKTsKLQkJQVJUSUZBQ1RfQ0FMTCA9IE1lc3NhZ2VzLmdldFN0cmluZygiTXBpQ0FTVFZpc2l0b3IubXBpQ2FsbCIpOyAvLyROT04tTkxTLTEkCi0JCUFSVElGQUNUX0NPTlNUQU5UID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJNcGlDQVNUVmlzaXRvci5tcGlDb25zdGFudCIpOyAvLyROT04tTkxTLTEkCi0JCUFSVElGQUNUX05BTUU9Ik1QSSI7Ci0KLQkJdHJhY2VPbiA9IENvbW1vblBsdWdpbi5nZXRUcmFjZU9uKCk7Ci0JCWlmICh0cmFjZU9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNcGlDQVNUVmlzaXRvci5jdG9yOiB0cmFjZU9uPSIgKyB0cmFjZU9uKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICogVmlzaXQgYW4gZXhwcmVzc2lvbiBub2RlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIHsKLQkJCS8vIGluIHN0ZG1ha2UgdGhpcyBpcyBhIENBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uIGJ1dCBpbXBsZW1lbnRzCi0JCQkvLyBJQVNURlVuY3Rpb25DYWxsRXhwciwgc28gb2sKLQkJCUlBU1RFeHByZXNzaW9uIGFzdEV4cHIgPSAoKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKSBleHByZXNzaW9uKQotCQkJCQkuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCQkJU3RyaW5nIHNpZ25hdHVyZSA9IGFzdEV4cHIuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQkvLyBub3RlOiBnZXRSYXdTaWcgaXMgdGhlIG5hbWUgQkVGT1JFIGJlaW5nIHByb2Nlc3NlZCBieQotCQkJLy8gcHJlcHJvY2Vzc29yIQotCQkJLy8gYnV0IGl0IHNlZW1zIHRvIGJlIGVtcHR5IGlmIGl0J3MgZGlmZmVyZW50LgotCQkJLy8gSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24KLQkJCS8vIGZjZT0oSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pZXhwcmVzc2lvbjsKLQkJCS8vIElBU1RFeHByZXNzaW9uIGZuZT1mY2UuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotCi0JCQkvLyBjYW4gd2UgZ2V0IHBvc3QtcHJlLXByb2Nlc3NvciBuYW1lIGhlcmU/Ci0JCQlpZiAoYXN0RXhwciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLQkJCQlJQVNUTmFtZSB0ZW1wRk4gPSAoKElBU1RJZEV4cHJlc3Npb24pIGFzdEV4cHIpLmdldE5hbWUoKTsKLQkJCQlJQmluZGluZyB0ZW1wQklORCA9IHRlbXBGTi5yZXNvbHZlQmluZGluZygpOwotCQkJCVN0cmluZyB0ZW1wTkFNRSA9IHRlbXBCSU5ELmdldE5hbWUoKTsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNQ0FWIG5hbWU6ICIgKyB0ZW1wTkFNRSArICIgcmF3c2lnOiAiICsgc2lnbmF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy8gaWYgZS5nLiBwcmVwcm9jZXNzb3Igc3Vic3RpdHV0aW9uIHVzZWQsIHVzZSB0aGF0IGZvciBmdW5jdGlvbgotCQkJCS8vIG5hbWUKLQkJCQlib29sZWFuIHByZVByb2NVc2VkID0gIXNpZ25hdHVyZS5lcXVhbHModGVtcE5BTUUpOwotCQkJCWlmIChwcmVQcm9jVXNlZCkgewotCQkJCQlzaWduYXR1cmUgPSB0ZW1wTkFNRTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2lnbmF0dXJlLnN0YXJ0c1dpdGgoUFJFRklYKSkgewotCQkJCWlmIChhc3RFeHByIGluc3RhbmNlb2YgSUFTVElkRXhwcmVzc2lvbikgewotCQkJCQlJQVNUTmFtZSBmdW5jTmFtZSA9ICgoSUFTVElkRXhwcmVzc2lvbikgYXN0RXhwcikuZ2V0TmFtZSgpOwotCQkJCQkvLyBJQmluZGluZyBiaW5kaW5nID0gZnVuY05hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJCQkJLy8gU3RyaW5nIG5hbWU9YmluZGluZy5nZXROYW1lKCk7Ly8gbmFtZSBvayBmb3Igc3RkTWFrZQotCQkJCQlwcm9jZXNzRnVuY05hbWUoZnVuY05hbWUsIGFzdEV4cHIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSUFTVExpdGVyYWxFeHByZXNzaW9uKSB7Ci0JCQlwcm9jZXNzTWFjcm9MaXRlcmFsKChJQVNUTGl0ZXJhbEV4cHJlc3Npb24pIGV4cHJlc3Npb24pOwotCQl9IGVsc2UgewotCQkJLy8gT3RoZXIgcG9zc2liaWxpdGllcz8gRG8gd2UgY2FyZT8gQXNzdW1lIG5vdC4KLQkJCS8vIGlmKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDQVNUVW5hcnlFeHByZXNzaW9uKQotCQkJLy8gaWYoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENBU1RJZEV4cHJlc3Npb24pCi0KLQkJfQotCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBkeW5hbWljIGFkZGluZyB0byBpbmNsdWRlIHBhdGg/Ci0JICogPGJyPk5vdGU6IGlmIHRoaXMgcmV0dXJucyB0cnVlLCBiZSBjZXJ0YWluIHRvIG92ZXJyaWRlIGdldEluY2x1ZGVzUHJlZklEKCkgYW5kCi0JICogZ2V0UHJlZmVyZW5jZVN0b3JlKCkgd2hpY2ggd2lsbCBiZSBuZWVkZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvIGRvIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYWxsb3dJbmNsdWRlUGF0aEFkZCgpIHsKLQkJYm9vbGVhbiBjYW5Bc2sgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKE1waUlEcy5NUElfUFJPTVBUX0ZPUl9PVEhFUl9JTkNMVURFUyk7Ci0JCXJldHVybiBjYW5Bc2s7Ci0JfQotCS8qKgotCSAqIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4gZm9yIGRlcml2ZWQgY2xhc3NlcyB0aGF0IG5lZWQgdG8gZHluYW1pY2FsbHkgdXBkYXRlIHRoZSBwcmVmIHN0b3JlIAotCSAqIGUuZy4gZm9yIHRoZSBpbmNsdWRlcyBwYXRoCi0JICogQHJldHVybgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5jbHVkZXNQcmVmSUQoKSB7Ci0JCXJldHVybiBNcGlJRHMuTVBJX0lOQ0xVREVTOwotCX0KLQkvKioKLQkgKiBuZWVkcyB0byBiZSBvdmVycmlkZGVuIGZvciBkZXJpdmVkIGNsYXNzZXMgdGhhdCBuZWVkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgcHJlZiBzdG9yZSAKLQkgKiBlLmcuIGZvciB0aGUgaW5jbHVkZXMgcGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBNcGlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4gZm9yIGRlcml2ZWQgY2xhc3NlcyB0aGF0IG5lZWQgdG8gZHluYW1pY2FsbHkgdXBkYXRlIHRoZSBwcmVmIHN0b3JlIAotCSAqIGUuZy4gZm9yIHRoZSBpbmNsdWRlcyBwYXRoLiAgVGhpcyB0eXBlIG5hbWUgaXMgdXNlZCBmb3IgbWVzc2FnZXMsIGV0Yy4KLQkgKiBAcmV0dXJuIGFydGlmYWN0IHR5cGUgbmFtZSBzdWNoIGFzICJNUEkiLCAiT3Blbk1QIiBldGMuCi0JICovCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBBUlRJRkFDVF9OQU1FOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL2FuYWx5c2lzL01waUNQUEFTVFZpc2l0b3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL2FuYWx5c2lzL01waUNQUEFTVFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzOTc5YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9hbmFseXNpcy9NcGlDUFBBU1RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUSWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVExpdGVyYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jcHAuQ1BQQVNURmllbGRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5jcHAuQ1BQQVNUSWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuY3BwLkNQUEFTVExpbmthZ2VTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuY3BwLkNQUEFTVFVzaW5nRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uU2NhblJldHVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYW5hbHlzaXMuUGxkdEFzdFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBkb20td2Fsa2VyIGNvbGxlY3RzIGFydGlmYWN0cyAoY3VycmVudGx5IGZ1bmN0aW9uIGNhbGxzIGFuZCBjb25zdGFudHMpLAotICogYW5kIGFkZHMgbWFya2VycyB0byB0aGUgc291cmNlIGZpbGUgZm9yIEMrKyBjb2RlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNcGlDUFBBU1RWaXNpdG9yIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWDEgPSAiTVBJXyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVgyID0gIk1QSTo6IjsgLy8kTk9OLU5MUy0xJAotCi0JewotCQl0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQl0aGlzLnNob3VsZFZpc2l0VHJhbnNsYXRpb25Vbml0ID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNpbmdOYW1lc3BhY2VNUEk7Ci0KLQlwdWJsaWMgTXBpQ1BQQVNUVmlzaXRvcihMaXN0IG1waUluY2x1ZGVzLCBTdHJpbmcgZmlsZU5hbWUsIFNjYW5SZXR1cm4gbXNyKSB7Ci0JCXN1cGVyKG1waUluY2x1ZGVzLCBmaWxlTmFtZSwgbXNyKTsKLQkJdXNpbmdOYW1lc3BhY2VNUEkgPSBmYWxzZTsKLQkJQVJUSUZBQ1RfQ0FMTCA9IE1lc3NhZ2VzLmdldFN0cmluZygiTXBpQ1BQQVNUVmlzaXRvci5tcGlDYWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJQVJUSUZBQ1RfQ09OU1RBTlQgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIk1waUNQUEFTVFZpc2l0b3IubXBpQ29uc3RhbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgdmlzaXQoSUFTVERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENQUEFTVFVzaW5nRGlyZWN0aXZlKSB7Ci0JCQlDUFBBU1RVc2luZ0RpcmVjdGl2ZSBjcHBBU1RVc2luZ0RpcmVjdGl2ZSA9IChDUFBBU1RVc2luZ0RpcmVjdGl2ZSkgZGVjbGFyYXRpb247Ci0JCQlpZiAoIk1QSSIuZXF1YWxzKGNwcEFTVFVzaW5nRGlyZWN0aXZlLmdldFF1YWxpZmllZE5hbWUoKS5nZXRSYXdTaWduYXR1cmUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXVzaW5nTmFtZXNwYWNlTVBJID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIFdvcmthcm91bmQgb2YgYSBDRFQgcHJvYmxlbSB3aGVyZSBkZWNsYXJhdGlvbiBmb3IgW2V4dGVybiAiQyIuLi5dIGluCi0JCS8vIEMrKyBjb2RlIGhhcyBudWxsIGZpbGUgbG9jYXRpb24KLQkJaWYgKChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENQUEFTVExpbmthZ2VTcGVjaWZpY2F0aW9uKSAmJiAoZGVjbGFyYXRpb24uZ2V0RmlsZUxvY2F0aW9uKCkgPT0gbnVsbCkpCi0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQotCQlpZiAoZGVjbGFyYXRpb24uZ2V0RmlsZUxvY2F0aW9uKCkgPT0gbnVsbCkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNcGlDUFBBU1RWaXNpdG9yLnZpc2l0KGRlY2wpOiBudWxsIGRlY2wiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLnZpc2l0KGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBWaXNpdCBhbiBleHByZXNzaW9uIG5vZGUKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBpbnQgdmlzaXQoSUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCi0JCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIHsKLQkJCUlBU1RFeHByZXNzaW9uIGFzdEV4cHIgPSAoKElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRGdW5jdGlvbk5hbWVFeHByZXNzaW9uKCk7Ci0JCQlTdHJpbmcgc2lnbmF0dXJlID0gYXN0RXhwci5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCS8vIG5vdGU6IGdldFJhd1NpZyBpcyBCRUZPUkUgcHJvY2Vzc2VkIGJ5IHByZXByb2Nlc3NvciEKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmdW5jIHNpZ25hdHVyZT0iICsgc2lnbmF0dXJlKTsKLQkJCS8vIHNpbmNlIGFsbCBNUEkgc3ltYm9scyBzdGFydCB3aXRoIGEgY2VydGFpbiBwcmVmaXgsCi0JCQkvLyB3ZSdsbCBkbyBhIHF1aWNrIHRlc3QgdG8gY3VsbCB0aGUgc2VhcmNoCi0JCQlpZiAodXNpbmdOYW1lc3BhY2VNUEkgfHwgc2lnbmF0dXJlLnN0YXJ0c1dpdGgoUFJFRklYMSkgfHwgc2lnbmF0dXJlLnN0YXJ0c1dpdGgoUFJFRklYMikpIHsKLQkJCQlJQVNUTmFtZSBmdW5jTmFtZSA9IG51bGw7Ci0JCQkJaWYgKGFzdEV4cHIgaW5zdGFuY2VvZiBDUFBBU1RGaWVsZFJlZmVyZW5jZSkgewotCQkJCQkvLyBUaGlzIGlzIG1ldGhvZCBjYWxsIHRocm91Z2ggQysrIG1lbWJlciBmdW5jdGlvbnMgKGUuZy4KLQkJCQkJLy8gTVBJOjpDT01NX1dPUkxELkdldF9zaXplKQotCQkJCQlDUFBBU1RGaWVsZFJlZmVyZW5jZSBjcHBGaWVsZFJlZmVyZW5jZSA9IChDUFBBU1RGaWVsZFJlZmVyZW5jZSkgYXN0RXhwcjsKLQkJCQkJZnVuY05hbWUgPSBjcHBGaWVsZFJlZmVyZW5jZS5nZXRGaWVsZE5hbWUoKTsKLQotCQkJCX0gZWxzZSBpZiAoYXN0RXhwciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLQkJCQkJLy8gVGhpcyBpcyBDLXN0eWxlIGRpcmVjdCBtZXRob2QgY2FsbCAoZS5nLiBNUElfSW5pdCwgb3IKLQkJCQkJLy8gTVBJOjpJbml0KQotCi0JCQkJCS8vIElBU1ROYW1lIHRlbXBGTiA9ICgoSUFTVElkRXhwcmVzc2lvbikgYXN0RXhwcikuZ2V0TmFtZSgpOwotCQkJCQkvLyBJQmluZGluZyB0ZW1wQklORCA9IHRlbXBGTi5yZXNvbHZlQmluZGluZygpOwotCQkJCQkvLyBTdHJpbmcgdGVtcE5BTUU9dGVtcEJJTkQuZ2V0TmFtZSgpOyAvLwotCQkJCQkvLyBzaWduYXR1cmU9Ik1QSTo6SW5pdCIgYnV0IHRoaXMgaXMgIkluaXQiCi0KLQkJCQkJZnVuY05hbWUgPSAoKElBU1RJZEV4cHJlc3Npb24pIGFzdEV4cHIpLmdldE5hbWUoKTsKLQkJCQkJLy8gU3RyaW5nIGZ1bmNOYW1lU3RyaW5nPWZ1bmNOYW1lLnRvU3RyaW5nKCk7Ly9NUEk6OkluaXQKLQkJCQl9Ci0JCQkJcHJvY2Vzc0Z1bmNOYW1lKGZ1bmNOYW1lLCBhc3RFeHByKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENQUEFTVElkRXhwcmVzc2lvbikKLQkJCQkmJiAhKGV4cHJlc3Npb24uZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikpIHsgLy8gdGhpcwotCQkJLy8gZXhjbHVkZXMgYSBDUFBBU1RJZEV4cHJlc3Npb24gYWN0aW5nIGFzIG1ldGhvZCBjYWxsIChlLmcuCi0JCQkvLyBNUElfSW5pdCkKLQkJCXByb2Nlc3NJZEV4cHJBc0xpdGVyYWwoKENQUEFTVElkRXhwcmVzc2lvbikgZXhwcmVzc2lvbik7Ci0JCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RMaXRlcmFsRXhwcmVzc2lvbikgewotCQkJcHJvY2Vzc01hY3JvTGl0ZXJhbCgoSUFTVExpdGVyYWxFeHByZXNzaW9uKSBleHByZXNzaW9uKTsKLQkJfQotCi0JCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNob29zZU5hbWUoU3RyaW5nIGJpbmRpbmdOYW1lLCBTdHJpbmcgcmF3U2lnbmF0dXJlKXsKLQkJU3RyaW5nIG5hbWU9YmluZGluZ05hbWU7Ci0JCWlmKGJpbmRpbmdOYW1lLmxlbmd0aCgpPT0wKSB7Ci0JCQluYW1lPXJhd1NpZ25hdHVyZTsKLQkJfQotCQlpZihyYXdTaWduYXR1cmUuc3RhcnRzV2l0aChQUkVGSVgyKSl7Ci0JCQluYW1lPXJhd1NpZ25hdHVyZTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JLyoqCi0JICogRG9uJ3QgYWxsb3cgZHluYW1pYyBpbmNsdWRlIHBhdGggYWRkaW5nIGZvciBDKysgLS0gdG9vIGNvbXBsaWNhdGVkIHRvIGtub3cgaWYgc29tZXRoaW5nIGlzIGFuIE1QSSBhcnRpZmFjdC4KLQkgKiBDb25zaWRlciBpbXBsZW1lbnRpbmcgdGhpcyBsYXRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQkgcHVibGljIGJvb2xlYW4gYWxsb3dJbmNsdWRlUGF0aEFkZCgpIHsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCUBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBhZGRJbmNsdWRlUGF0aCggSVBhdGggcGF0aCwgIFN0cmluZyBuYW1lLCBib29sZWFuIGRvbnRBc2tBZ2FpbikgewotCSAgcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9lZGl0b3JIZWxwL01QSURvY1hNTFBhcnNlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NUElEb2NYTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2OThjYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9lZGl0b3JIZWxwL01QSURvY1hNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5lZGl0b3JIZWxwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuRnVuY3Rpb25TdW1tYXJ5SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElEb2NYTUxQYXJzZXIgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKQotCXsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JCXRyeSB7Ci0JCQlMaXN0PEZ1bmN0aW9uU3VtbWFyeUltcGw+IGZ1bmN0aW9ucyA9IHBhcnNlRE9NKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksICJjbmFtZSIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJudW0gb2YgZnVuY3Rpb25zIGdhdGhlcmVkOiAiK2Z1bmN0aW9ucy5zaXplKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaXJzdCBmdW5jdGlvbiBzdW1tYXJ5OiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChGdW5jdGlvblN1bW1hcnlJbXBsKShmdW5jdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCkpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHhtbEluIGlucHV0IHN0cmVhbSBmb3IgWE1MIGZpbGUKLQkgKiBAcGFyYW0gY09yQ3BwTmFtZSB0aGUgbmFtZSBvZiB0aGUgJ25hbWUnIG5vZGU6ICJjbmFtZSIgZm9yIEMsICJjcHBOYW1lIiBmb3IgQysrCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxGdW5jdGlvblN1bW1hcnlJbXBsPiBwYXJzZURPTShJbnB1dFN0cmVhbSB4bWxJbiwgU3RyaW5nIGNPckNwcE5hbWUpIHsKLQkJTGlzdDxGdW5jdGlvblN1bW1hcnlJbXBsPiBtcGlGdW5jTGlzdCA9IG5ldyBBcnJheUxpc3Q8RnVuY3Rpb25TdW1tYXJ5SW1wbD4oKTsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlpZiAoeG1sSW4gIT0gbnVsbCkKLQkJCQlkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoeG1sSW4pOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCU5vZGVMaXN0IGZ1bmN0aW9uTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmdW5jdGlvbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbkxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgZnVuYyA9IGZ1bmN0aW9uTGlzdC5pdGVtKGkpOwotCQkJCU5vZGVMaXN0IGNoaWxkID0gZnVuYy5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJU3RyaW5nIGNuYW1lID0gbnVsbDsKLQkJCQlTdHJpbmcgZGVzYyA9IG51bGw7Ci0JCQkJRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCBwcm90b3R5cGVTdW1tYXJ5ID0gbnVsbDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJTm9kZSBzdWIgPSBjaGlsZC5pdGVtKGopOwotCQkJCQlpZiAoc3ViLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNPckNwcE5hbWUpKSB7Ci0gCQkJCQkJY25hbWUgPSBzdWIuZ2V0VGV4dENvbnRlbnQoKTsgLy8gamF2YSA1IAotLy8gICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSA9IHN1Yi5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAoc3ViLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKSB7Ci0JCQkJCQlkZXNjID0gc3ViLmdldFRleHRDb250ZW50KCk7IC8vIGphdmEgNQotLy8gICAgICAgICAgICAgICAgICAgICBkZXNjID0gc3ViLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChzdWIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInByb3RvdHlwZSIpKSB7Ci0JCQkJCQlOb2RlTGlzdCBwcm90b1N1YiA9IHN1Yi5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhIDUKLQkJCQkJCXByb3RvdHlwZVN1bW1hcnkgPSBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgKLQkJCQkJCQkJcHJvdG9TdWIuaXRlbSgzKS5nZXRUZXh0Q29udGVudCgpLCBwcm90b1N1YgotCQkJCQkJCQkJCS5pdGVtKDEpLmdldFRleHRDb250ZW50KCksIHByb3RvU3ViCi0JCQkJCQkJCQkJLml0ZW0oNSkuZ2V0VGV4dENvbnRlbnQoKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVN1bW1hcnkgPSBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9TdWIuaXRlbSgzKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCksIHByb3RvU3ViCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZW0oMSkuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpLCBwcm90b1N1YgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtKDUpLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRnVuY3Rpb25TdW1tYXJ5SW1wbCBmdW5jdGlvblN1bW1hcnkgPSBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbChjbmFtZSwKLQkJCQkJCSIiLCBkZXNjLCBwcm90b3R5cGVTdW1tYXJ5LCBudWxsKTsKLQkJCQltcGlGdW5jTGlzdC5hZGQoZnVuY3Rpb25TdW1tYXJ5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbXBpRnVuY0xpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NcGlDSGVscEJvb2suamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL2VkaXRvckhlbHAvTXBpQ0hlbHBCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmNhMDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NcGlDSGVscEJvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5lZGl0b3JIZWxwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkNIZWxwQm9va0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuRnVuY3Rpb25TdW1tYXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwIGJvb2sgZm9yIEMgTVBJIGZ1bmN0aW9ucwotICogQGF1dGhvciB0aWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIE1waUNIZWxwQm9vayBleHRlbmRzIENIZWxwQm9va0ltcGwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJNUEkgQyBIZWxwIEJvb2siOwotICAgIAotCS8qKgotCSAqIGJ1aWxkcyB0aGUgbGlzdCBvZiBmdW5jdGlvbiBzdW1tYXJpZXMgYnkgcGFyc2luZyBhbiBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBNcGlDSGVscEJvb2soKSB7Ci0JCXN1cGVyKE1waVBsdWdpbi5nZXRQbHVnaW5JZCgpKTsKLQkJLy8gcG9wdWxhdGUgZnVuYyBtYXAKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShNcGlQbHVnaW4uZ2V0UGx1Z2luSWQoKSk7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCJtcGlyZWYueG1sIik7Ci0JCS8vLy8KLQkJLy9VUkwgZmlsZVVSTCA9IFBsYXRmb3JtLmZpbmQoYnVuZGxlLCBwYXRoKTsgLy8gb2xkCi0JCVVSTCBmaWxlVVJMID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQlJbnB1dFN0cmVhbSB4bWxJbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxJbiA9IGZpbGVVUkwub3BlblN0cmVhbSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJTGlzdDxGdW5jdGlvblN1bW1hcnlJbXBsPiBtcGlGdW5jTGlzdCA9IE1QSURvY1hNTFBhcnNlci5wYXJzZURPTSh4bWxJbiwgImNuYW1lIik7Ci0JCWZvciAoSXRlcmF0b3I8RnVuY3Rpb25TdW1tYXJ5SW1wbD4gaXQgPSBtcGlGdW5jTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlGdW5jdGlvblN1bW1hcnlJbXBsIGZ1bmN0aW9uU3VtbWFyeSA9IGl0Lm5leHQoKTsKLQkJCWZ1bmNOYW1lMkZ1bmNJbmZvLnB1dChmdW5jdGlvblN1bW1hcnkuZ2V0TmFtZSgpLCBmdW5jdGlvblN1bW1hcnkpOwotCQl9Ci0JCQotCQkvLyBzZXQgdGl0bGUKLQkJc2V0VGl0bGUoVElUTEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL2VkaXRvckhlbHAvTXBpQ0hlbHBQcm92aWRlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NcGlDSGVscFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGZiN2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NcGlDSGVscFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuZWRpdG9ySGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkNIZWxwUHJvdmlkZXJJbXBsOwotCi0KLS8qKgotICogCi0gKiBQcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uIGZvciBNUEkgQVBJcyBmb3IgQyAoRjEsIGhvdmVyLCBjb250ZW50IGFzc2lzdCwgZXRjLikKLSAqLwotcHVibGljIGNsYXNzIE1waUNIZWxwUHJvdmlkZXIgZXh0ZW5kcyBDSGVscFByb3ZpZGVySW1wbAoteyAgICAKLQkvKioKLQkgKiBEZWZhdWx0IGN0b3IgcmVxdWlyZWQsIG9yIGVsc2UgZm9yIHNvbWUgcmVhc29uIHRoaXMKLQkgKiBjbGFzcyBuZXZlciBnZXRzIGluc3RhbnRpYXRlZC4KLQkgKgotCSAqLwotCXB1YmxpYyBNcGlDSGVscFByb3ZpZGVyKCkgewotCQkvLyBkZWZhdWx0IGN0b3IgZm9yIHRlc3RpbmcgdGhhdCBpdCBnZXRzIGNhbGxlZAotCSAgICAvLyAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXBpQ0hlbHBQcm92aWRlciBjdG9yKCkuLi4iKTsKLQotCX0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgICB7Ci0gICAgICAgIGhlbHBCb29rID0gbmV3IE1waUNIZWxwQm9vaygpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiTXBpQ0hlbHBQcm92aWRlciBpbml0aWFsaXplKCkuLi4iKTsKLSAgICB9Ci19Ci0KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9lZGl0b3JIZWxwL01waUNQUEhlbHBCb29rLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9lZGl0b3JIZWxwL01waUNQUEhlbHBCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2N2MxMzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NcGlDUFBIZWxwQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JQ0hlbHBCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuQ0hlbHBCb29rSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5GdW5jdGlvblN1bW1hcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEhlbHAgYm9vayBmb3IgQysrIE1QSSBmdW5jdGlvbnMKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNcGlDUFBIZWxwQm9vayBleHRlbmRzIENIZWxwQm9va0ltcGwKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiTVBJIEMrKyBIZWxwIEJvb2siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbj1mYWxzZTsKLQotICAgIHB1YmxpYyBNcGlDUFBIZWxwQm9vaygpCi0gICAgewotCQlzdXBlcihNcGlQbHVnaW4uZ2V0UGx1Z2luSWQoKSk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJNUEkgQ1BQIGhlbHAgYm9vayBjdG9yKCkuLi4iKTsKLQkJLy8gcG9wdWxhdGUgZnVuYyBtYXAKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShNcGlQbHVnaW4uZ2V0UGx1Z2luSWQoKSk7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCJtcGlyZWYueG1sIik7Ci0KLQkJVVJMIGZpbGVVUkwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCUlucHV0U3RyZWFtIHhtbEluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbEluID0gZmlsZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlMaXN0PEZ1bmN0aW9uU3VtbWFyeUltcGw+IG1waUZ1bmNMaXN0ID0gTVBJRG9jWE1MUGFyc2VyLnBhcnNlRE9NKHhtbEluLCAiY3BwbmFtZSIpOwotCQlpbnQgdGVtcD0wOwotCQlmb3IgKEl0ZXJhdG9yPEZ1bmN0aW9uU3VtbWFyeUltcGw+IGl0ID0gbXBpRnVuY0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRnVuY3Rpb25TdW1tYXJ5SW1wbCBmdW5jdGlvblN1bW1hcnkgPSBpdC5uZXh0KCk7Ci0JCQlpZih0cmFjZU9uKWlmKDI+dGVtcCsrKVN5c3RlbS5vdXQucHJpbnRsbigiICAiK2Z1bmN0aW9uU3VtbWFyeS5nZXROYW1lKCkrIi0iK2Z1bmN0aW9uU3VtbWFyeS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCWZ1bmNOYW1lMkZ1bmNJbmZvLnB1dChmdW5jdGlvblN1bW1hcnkuZ2V0TmFtZSgpLCBmdW5jdGlvblN1bW1hcnkpOwotCQl9OwotICAgIAkvLyBzZXQgdGl0bGUKLSAgICAJc2V0VGl0bGUoVElUTEUpOwotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0Q0hlbHBUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJQ0hlbHBCb29rLkhFTFBfVFlQRV9DUFA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9lZGl0b3JIZWxwL01waUNQUEhlbHBQcm92aWRlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvZWRpdG9ySGVscC9NcGlDUFBIZWxwUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkNWQyNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9lZGl0b3JIZWxwL01waUNQUEhlbHBQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5DSGVscFByb3ZpZGVySW1wbDsKLQotCi0vKioKLSAqIAotICogUHJvdmlkZXMgaGVscCBpbmZvcm1hdGlvbiBmb3IgTVBJIEFQSXMgZm9yIEMrKyhGMSwgaG92ZXIsIGNvbnRlbnQgYXNzaXN0LCBldGMuKQotICovCi1wdWJsaWMgY2xhc3MgTXBpQ1BQSGVscFByb3ZpZGVyIGV4dGVuZHMgQ0hlbHBQcm92aWRlckltcGwKLXsgICAgCi0JLyoqCi0JICogRGVmYXVsdCBjdG9yIHJlcXVpcmVkLCBvciBlbHNlIGZvciBzb21lIHJlYXNvbiB0aGlzCi0JICogY2xhc3MgbmV2ZXIgZ2V0cyBpbnN0YW50aWF0ZWQuCi0JICoKLQkgKi8KLQlwdWJsaWMgTXBpQ1BQSGVscFByb3ZpZGVyKCkgewotCQkvLyBkZWZhdWx0IGN0b3IgZm9yIHRlc3RpbmcgdGhhdCBpdCBnZXRzIGNhbGxlZAotCSAgICAvLyAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXBpQ0hlbHBQcm92aWRlciBjdG9yKCkuLi4iKTsKLQotCX0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgICB7Ci0gICAgICAgIGhlbHBCb29rID0gbmV3IE1waUNQUEhlbHBCb29rKCk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJNcGlDSGVscFByb3ZpZGVyIGluaXRpYWxpemUoKS4uLiIpOwotICAgIH0KLX0KLQotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjIxZGZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1waUNBU1RWaXNpdG9yLm1waUNhbGw9TVBJIENhbGwKLU1waUNBU1RWaXNpdG9yLm1waUNvbnN0YW50PU1QSSBDb25zdGFudAotTXBpQ1BQQVNUVmlzaXRvci5tcGlDYWxsPU1QSSBDYWxsCi1NcGlDUFBBU1RWaXNpdG9yLm1waUNvbnN0YW50PU1QSSBDb25zdGFudAotTVBJUHJlZmVyZW5jZVBhZ2UubXBpSW5jbHVkZVBhdGhzPU1QSSBpbmNsdWRlIHBhdGhzOgotTVBJUHJlZmVyZW5jZVBhZ2UucGxlYXNlQ2hvb3NlQWRpcmVjdG9yeT1QbGVhc2UgY2hvb3NlIGEgZGlyZWN0b3J5IGZvciBNUEkgaW5jbHVkZXM6Ci1NUElQcmVmZXJlbmNlUGFnZS5tcGlCdWlsZENvbW1hbmQ9TVBJIGJ1aWxkIGNvbW1hbmQgKEMpOgotTVBJUHJlZmVyZW5jZVBhZ2UubXBpQ3BwQnVpbGRDb21tYW5kPU1QSSBidWlsZCBjb21tYW5kIChDKyspOgotTVBJUHJlZmVyZW5jZVBhZ2UucHJvbXB0VG9JbmNsdWRlT3RoZXJMb2NhdGlvbnM9UHJvbXB0IHRvIGluY2x1ZGUgTVBJIEFQSXMgZm91bmQgaW4gb3RoZXIgbG9jYXRpb25zIChDIG9ubHkpPwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvcHJlZnMvTVBJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9wcmVmcy9NUElQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmZTE5NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9wcmVmcy9NUElQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnByZWZzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlJRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuTXBpUGx1Z2luOwotCi0vKioKLSAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGRlZmF1bHQgTVBJIHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IE1waVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQoTXBpSURzLk1QSV9CVUlMRF9DTUQsICJtcGljYyIpOwotICAgIAlzdG9yZS5zZXREZWZhdWx0KE1waUlEcy5NUElfQ1BQX0JVSUxEX0NNRCwgIm1waWMrKyIpOwotICAgIAlzdG9yZS5zZXREZWZhdWx0KE1waUlEcy5NUElfUFJPTVBUX0ZPUl9PVEhFUl9JTkNMVURFUywgdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9wcmVmcy9NUElQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvcHJlZnMvTVBJUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMzU0MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9tcGkvY29yZS9wcmVmcy9NUElQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQm9vbGVhbkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QYXRoRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBNUEkgc2V0dGluZ3MKLSAqIDxicj4KLSAqIE5vdGUgdGhhdCAiUHJvbXB0IHRvIGluY2x1ZGUgTVBJIEFQSXMgZm91bmQgaW4gb3RoZXIgbG9jYXRpb25zIiBpcyBvbmx5IGFwcGxpY2FibGUKLSAqIHRvIEMgY29kZSwgbm90IEMrKzogYmVjYXVzZSBDKysgTVBJIEFQSXMgYXJlIG5vdCBhcyBlYXNpbHkgcmVjb2duaXphYmxlIC0gd2hlbgotICogZGlzY292ZXJlZCB2aWEgQ0RUIEFTVCwgdGhleSBzb21ldGltZXMgZG8gbm90IGhhdmUgdGhlICJNUEkiIHByZWZpeC4KLSAqIEMrKyBNUEkgQVBJcyBpbmNsdWRlIGUuZy4gTVBJX0JjYXN0LCBNUEk6OkluaXQsIGFuZCBHZXRfc2l6ZSAoY29kZWQgYXMgIk1QSTo6Q09NTV9XT1JMRC5HZXRfc2l6ZSgpIikKLSAqIHRodXMgd2UgZG9uJ3QgY3VsbCBieSBleGNsdWRpbmcgYWxsIEFQSXMgZm9yIEMrKyBjb2RlIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBhIHByZWZpeC4KLSAqIFRoYXQgc2FpZCwgc2luY2Ugd2UgZG8gdGhpcywgd2UgZW5kIHVwIGxvb2tpbmcgYXQgYWxsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluY2x1ZGluZwotICogdGhvc2UgZm91bmQgb25seSBpbiB1c2VyIGNvZGUsIGUuZy4gYXJnYyBhbmQgYXJndi4gIElmIHdlIGFza2VkIHRoZSB1c2VyIGFib3V0IGFsbCBvZiB0aGVzZSwKLSAqIGl0IHdvdWxkIGJlIGFubm95aW5nIGFuZCB0b28gc2xvdy4KLSAqIDxwPlRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHJlLWV2YWx1YXRlZCBpbiB0aGUgZnV0dXJlLgotICogQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgYSAiZG9uJ3QgYXNrIG1lIGFnYWluIGR1cmluZyB0aGlzIHJ1biIgY2hlY2tib3gKLSAqIG9uIHRoZSBwb3B1cCBhc2tpbmcgdG8gYWRkIHRoZSBBUEksIHRoYXQgYXBwZWFycyBkdXJpbmcgZXhlY3V0aW9uLgotICogVGhhdCB3b3VsZCByZW1vdmUgdGhlIGFubm95aW5nIHBhcnQ7IGJ1dCBwZXJmb3JtYW5jZSBtYXkgc3RpbGwgc3VmZmVyIGZyb20gdGhpcyBleHRyYSB0ZXN0PwotICogPHA+Q3J1ZGUgd29ya2Fyb3VuZDogUnVuIE1QSSBhbmFseXNpcyBhdCBsZWFzdCBvbmNlIG9uIHBsYWluIEMgY29kZSwgdG8gYXNzdXJlIGl0J3MgZmluZGluZyB0aGUKLSAqIGhlYWRlciBmaWxlcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGF0IGFyZSBzcGVjaWZpZWQgaGVyZSBpbiB0aGUgcHJlZmVyZW5jZXMuCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTVBJUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9JTkNMVURFU19QUkVGRVJFTkNFX0xBQkVMICA9IE1lc3NhZ2VzLmdldFN0cmluZygiTVBJUHJlZmVyZW5jZVBhZ2UubXBpSW5jbHVkZVBhdGhzIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBJX0lOQ0xVREVTX1BSRUZFUkVOQ0VfQlJPV1NFID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJNUElQcmVmZXJlbmNlUGFnZS5wbGVhc2VDaG9vc2VBZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBJX0JVSUxEX0NPTU1BTkRfTEFCRUwgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIk1QSVByZWZlcmVuY2VQYWdlLm1waUJ1aWxkQ29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9DUFBfQlVJTERfQ09NTUFORF9MQUJFTCA9IE1lc3NhZ2VzLmdldFN0cmluZygiTVBJUHJlZmVyZW5jZVBhZ2UubXBpQ3BwQnVpbGRDb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX0ZPUl9PVEhFUlNfTEFCRUw9TWVzc2FnZXMuZ2V0U3RyaW5nKCJNUElQcmVmZXJlbmNlUGFnZS5wcm9tcHRUb0luY2x1ZGVPdGhlckxvY2F0aW9ucyIpOwotCi0gICAgcHVibGljIE1QSVByZWZlcmVuY2VQYWdlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKEZMQVQpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1QSVByZWZlcmVuY2VQYWdlKGludCBzdHlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0eWxlKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNUElQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSwgaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIGltYWdlLCBzdHlsZSk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTVBJUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLCBpbnQgc3R5bGUpCi0gICAgewotICAgICAgICBzdXBlcih0aXRsZSwgc3R5bGUpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdCBwcmVmZXJlbmNlIHN0b3JlIGFuZCBzZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByZWZlcmVuY2VTdG9yZSgpCi0gICAgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gTXBpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKQotICAgIHsKLSAgICAgICAgUGF0aEVkaXRvciBwYXRoRWRpdG9yID0gbmV3IFBhdGhFZGl0b3IoTXBpSURzLk1QSV9JTkNMVURFUywgTVBJX0lOQ0xVREVTX1BSRUZFUkVOQ0VfTEFCRUwsCi0gICAgICAgICAgICAgICAgTVBJX0lOQ0xVREVTX1BSRUZFUkVOQ0VfQlJPV1NFLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgYWRkRmllbGQocGF0aEVkaXRvcik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdGaWVsZEVkaXRvciBzZWQgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoTXBpSURzLk1QSV9CVUlMRF9DTUQsIE1QSV9CVUlMRF9DT01NQU5EX0xBQkVMLGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICBhZGRGaWVsZChzZWQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nRmllbGRFZGl0b3Igc2VkQ3BwID0gbmV3IFN0cmluZ0ZpZWxkRWRpdG9yKE1waUlEcy5NUElfQ1BQX0JVSUxEX0NNRCwgTVBJX0NQUF9CVUlMRF9DT01NQU5EX0xBQkVMLGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICBhZGRGaWVsZChzZWRDcHApOwotICAgICAgICAKLSAgICAgICAgQm9vbGVhbkZpZWxkRWRpdG9yIGJlZCA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoTXBpSURzLk1QSV9QUk9NUFRfRk9SX09USEVSX0lOQ0xVREVTLCBQUk9NUFRfRk9SX09USEVSU19MQUJFTCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKGJlZCk7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L21waS9jb3JlL3ZpZXdzL01QSVRhYmxlVmlldy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvdmlld3MvTVBJVGFibGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjAyMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvbXBpL2NvcmUvdmlld3MvTVBJVGFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnZpZXdzLlNpbXBsZVRhYmxlTWFya2VyVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlJRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuTXBpUGx1Z2luOwotCi0vKioKLSAqIEFuIE1QSSBhcnRpZmFjdCB2aWV3IGJhc2VkIG9uIFNpbXBsZVRhYmxlVmlldyA8YnI+Ci0gKiBOb3RlIHRoYXQgdGhlIElEIG11c3QgYmUgdW5pcXVlLgotICogPHA+Ci0gKiBJZiB5b3UgbmVlZCB0byByZWFkIGljb24gaW1hZ2VzLCBldGMuIGZyb20gdGhlIHBsdWctaW4sIGJlIHN1cmUgdG8gcGFzcyBpbiBhbgotICogYWN0dWFsIFBsdWdpbiBjbGFzcyBpbnN0YW5jZSBmb3IgZmlyc3QgYXJnCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElUYWJsZVZpZXcgZXh0ZW5kcyBTaW1wbGVUYWJsZU1hcmtlclZpZXcgewotCXB1YmxpYyBNUElUYWJsZVZpZXcoKSB7Ci0KLQkJc3VwZXIoTXBpUGx1Z2luLmdldERlZmF1bHQoKSwgIkFydGlmYWN0IiwgIkFydGlmYWN0cyIsCi0JCQkJIkNvbnN0cnVjdCIsIE1waUlEcy5NQVJLRVJfSUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUvdGVtcGxhdGVzL21waV90ZW1wbGF0ZXMueG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS90ZW1wbGF0ZXMvbXBpX3RlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjJiZjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS90ZW1wbGF0ZXMvbXBpX3RlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRlbXBsYXRlcz4KLTx0ZW1wbGF0ZSBuYW1lPSJtcGlpZiIgCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS50ZW1wbGF0ZXMuYy5tcGlpZiIKLSAgICAgICAgICBhdXRvaW5zZXJ0PSJ0cnVlIiBjb250ZXh0PSJvcmcuZWNsaXBzZS5jZHQudWkudGV4dC50ZW1wbGF0ZXMuYyIgZGVsZXRlZD0iZmFsc2UiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJNUElfSW5pdCBhbmQgRmluYWxpemUiIGVuYWJsZWQ9InRydWUiID4KLU1QSV9Jbml0KCZhbXA7YXJnYywgJmFtcDthcmd2KTsKLQotTVBJX0ZpbmFsaXplKCk7Ci08L3RlbXBsYXRlPgotPHRlbXBsYXRlIG5hbWU9Im1waXNyIgotICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkudGVtcGxhdGVzLmMubXBpc3IiCi0JYXV0b2luc2VydD0idHJ1ZSIgY29udGV4dD0ib3JnLmVjbGlwc2UuY2R0LnVpLnRleHQudGVtcGxhdGVzLmMiIGRlbGV0ZWQ9ImZhbHNlIiAKLQlkZXNjcmlwdGlvbj0iTVBJIFNlbmQgUmVjZWl2ZSIgZW5hYmxlZD0idHJ1ZSIgPgotTVBJX0NvbW1fcmFuaygke01QSV9DT01NX1dPUkxEfSwgJmFtcDske3Jhbmt9KTsgCi1NUElfQ29tbV9zaXplKCR7TVBJX0NPTU1fV09STER9LCAmYW1wOyR7cH0pOyAJCi0KLWlmICgke3Jhbmt9ID09IDApeyAvLyB0aGUgbWFzdGVyIHRhc2sKLQkJJHtjdXJzb3J9cHJpbnRmKCJIZWxsbyBGcm9tIHByb2Nlc3MgMDogTnVtIHByb2Nlc3NlczogJWRcbiIsJHtwfSk7Ci0JICAgIGZvciAoJHtzb3VyY2V9ID0gMTsgJHtzb3VyY2V9ICZsdDsgcDsgJHtzb3VyY2V9KyspIHsKLQkJICAgIE1QSV9SZWN2KCR7bWVzc2FnZX0sIDEwMCwgJHtNUElfQ0hBUn0sICR7c291cmNlfSwgJHt0YWd9LAotCQkgICAgICAgICAgJHtNUElfQ09NTV9XT1JMRH0sICZhbXA7c3RhdHVzKTsKLQkJICAgIHByaW50ZigiJXNcbiIsJHttZXNzYWdlfSk7Ci0JICAgIH0KLQl9Ci0JZWxzZXsgIC8vIHdvcmtlciB0YXNrcwotCQkvKiBjcmVhdGUgbWVzc2FnZSAqLwotCQkJc3ByaW50Zigke21lc3NhZ2V9LCAiSGVsbG8gZnJvbSBwcm9jZXNzICVkISIsICR7cmFua30pOwotCQkJZGVzdCA9IDA7Ci0JCQkvKiB1c2Ugc3RybGVuKzEgc28gdGhhdCAnXDAnIGdldCB0cmFuc21pdHRlZCAqLwotCQkJTVBJX1NlbmQoJHttZXNzYWdlfSwgc3RybGVuKCR7bWVzc2FnZX0pKzEsICR7TVBJX0NIQVJ9LAotCQkJICAgZGVzdCwgJHt0YWd9LCAke01QSV9DT01NX1dPUkxEfSk7Ci0JfTwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2UzMTAzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotQGRvdApkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvLnByb2plY3QgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiNWRjMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjRhNzZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpczsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVCwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuZGljdGlvbmFyeSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuZmFjdG9yeSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMucGFyc2VyLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy50ZXh0dmlldwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuY2R0LnVpLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvYWJvdXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGU5ZjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YmZkNjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIE9wZW5NUCBBbmFseXNpcwotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3BsdWdpbi54bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGRhOWRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8dmlld2VyQ29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLkNFZGl0b3JDb250cmlidXRpb24iCi0gICAgICAgICAgICB0YXJnZXRJRD0iI0NFZGl0b3JDb250ZXh0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMudGV4dHZpZXcuU2hvd0NvbmN1cnJlbmN5QWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5zaG93Q29uY3VycmVuY3kiCi0gICAgICAgICAgICAgICBsYWJlbD0iU2hvdyBDb25jdXJyZW5jeSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiLz4KLSAgICAgIDwvdmlld2VyQ29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3Blbk1QQ29uY3VycmVuY3lNYXJrZXIiCi0gICAgICAgICBuYW1lPSJvcGVuTVBDb25jdXJyZW5jeU1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLm1hcmtlckFubm90YXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLmNvbmN1cnJlbmN5IgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJjb25jdXJyZW5jeUluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIyNTAsMjMwLDExMCIKLSAgICAgICAgICAgIGNvbnRyaWJ1dGVzVG9IZWFkZXI9ImZhbHNlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iY29uY3VycmVuY3lIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICBpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0idHJ1ZSIKLSAgICAgICAgICAgIGlzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0PSJmYWxzZSIKLSAgICAgICAgICAgIGlzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0S2V5PSJpc0NvbmN1cnJlbmN5UmVjb3JkR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0IgotICAgICAgICAgICAgbGFiZWw9IkNvbmN1cnJlbmN5IE1hcmtlciIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJjb25jdXJyZW5jeUluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJmYWxzZSIKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSI1IgotICAgICAgICAgICAgc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb249ImZhbHNlIgotICAgICAgICAgICAgc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dDb25jdXJyZW5jeUluTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0iY29uY3VycmVuY3lJbmRpY2F0aW9uIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJjb25jdXJyZW5jeUluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJmYWxzZSIvPgotICAgICAgPHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMubm9uY29uY3VycmVuY3kiCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VLZXk9Im5vbkNvbmN1cnJlbmN5SW5kaWNhdGlvbkNvbG9yIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlVmFsdWU9IjI1MCwxNTAsMTQwIgotICAgICAgICAgICAgY29udHJpYnV0ZXNUb0hlYWRlcj0iZmFsc2UiCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlS2V5PSJub25Db25jdXJyZW5jeUhpZ2hsaWdodGluZyIKLSAgICAgICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIGluY2x1ZGVPblByZWZlcmVuY2VQYWdlPSJ0cnVlIgotICAgICAgICAgICAgaXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXQ9ImZhbHNlIgotICAgICAgICAgICAgbGFiZWw9Ik5vbkNvbmN1cnJlbmN5IE1hcmtlciIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJub25Db25jdXJyZW5jeUluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJmYWxzZSIKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSI1IgotICAgICAgICAgICAgc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb249ImZhbHNlIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9Im5vbkNvbmN1cnJlbmN5SW5kaWNhdGlvbiIKLSAgICAgICAgICAgIHRleHRQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ibm9uQ29uY3VycmVuY3lJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLmNvbmN1cnJlbmN5Ii8+Ci0gICAgICA8dHlwZQotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5ub25jb25jdXJyZW5jeSIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9PcGVuTVBBbmFseXNpc0V4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9PcGVuTVBBbmFseXNpc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJmZjg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1QQW5hbHlzaXNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXM7Ci0vKioKLSAqIEBhdXRob3IgcGF6ZWwKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUEFuYWx5c2lzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIAotewotICAgIHB1YmxpYyBPcGVuTVBBbmFseXNpc0V4Y2VwdGlvbihTdHJpbmcgdGV4dCkKLSAgICB7Ci0gICAgCXN1cGVyKHRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1QQW5hbHlzaXNNYW5hZ2VyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL09wZW5NUEFuYWx5c2lzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiNzFiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1QQW5hbHlzaXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLkNET007Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLklBU1RTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVEVsaWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVEVsc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVEVuZGlmOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RJZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUSWZkZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVElmbmRlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUT01QRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUT01QUHJhZ21hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RQcmFnbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLmRpY3Rpb25hcnkuRGljdGlvbmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuZGljdGlvbmFyeS5EaWN0aW9uYXJ5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLmZhY3RvcnkuRmlsZUNvbmN1cnJlbmN5QW5hbHlzaXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5mYWN0b3J5LkZpbGVTdGF0ZW1lbnRNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5mYWN0b3J5LkZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpczsKLQotLyoqCi0gKiBAYXV0aG9yIHBhemVsCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBBbmFseXNpc01hbmFnZXIgCi17Ci0JcHJvdGVjdGVkIElBU1RUcmFuc2xhdGlvblVuaXQgICAgICAgICBhc3RUcmFuc1VuaXRfID0gbnVsbDsKLQlwcm90ZWN0ZWQgSUZpbGUgICAgICAgICAgICAgICAgICAgICAgIGlGaWxlXyAgICAgICAgPSBudWxsOwotCXByb3RlY3RlZCBQQVNUTm9kZSBbXSAgICAgICAgICAgICAgICAgcGFzdF8gICAgICAgICA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFBBU1RPTVBQcmFnbWEgW10gICAgICAgICAgICBvbXBQcmFnbWFzXyAgID0gbnVsbDsgCi0gICAgCi0gICAgcHJvdGVjdGVkIEZpbGVDb25jdXJyZW5jeUFuYWx5c2lzICAgICBmaWxlQW5hbHlzaXNfID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgRnVuY3Rpb25Db25jdXJyZW5jeUFuYWx5c2lzICAgW10gYW5hbHlzZXNfICAgICA9IG51bGw7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEZpbGVTdGF0ZW1lbnRNYXAgICAgICAgICAgICBmaWxlTWFwXyAgICAgID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuICAgICAgICAgIHRyYWNlT24gICAgICAgPSBmYWxzZTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgRGljdGlvbmFyeSAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlfICAgPSBudWxsOwotICAgIHByb3RlY3RlZCBPcGVuTVBFcnJvck1hbmFnZXIgICAgICAgICAgZXJyb3JNYW5hZ2VyXyA9IG5ldyBPcGVuTVBFcnJvck1hbmFnZXIoKTsKLSAgICAKLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBPcGVuTVBBbmFseXNpc01hbmFnZXIgICBjdXJyZW50TWFuYWdlcl8gPSBudWxsOwotICAgIAotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGJ5IGVjbGlwc2UKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqIEB0aHJvd3MgT3Blbk1QQW5hbHlzaXNFeGNlcHRpb24KLSAgICAgKi8KLQlwdWJsaWMgT3Blbk1QQW5hbHlzaXNNYW5hZ2VyKGZpbmFsIElGaWxlIGlGaWxlKSB0aHJvd3MgT3Blbk1QQW5hbHlzaXNFeGNlcHRpb24KLQl7Ci0JCXRyeSB7Ci0JICAgICAgIGFzdFRyYW5zVW5pdF8gPSBDRE9NLmdldEluc3RhbmNlKCkuZ2V0QVNUU2VydmljZSgpLmdldFRyYW5zbGF0aW9uVW5pdChpRmlsZSwgCi0JCQkgICBDRE9NLmdldEluc3RhbmNlKCkuZ2V0Q29kZVJlYWRlckZhY3RvcnkoQ0RPTS5QQVJTRV9TQVZFRF9SRVNPVVJDRVMpKTsKLQkJfQotCQljYXRjaChJQVNUU2VydmljZVByb3ZpZGVyLlVuc3VwcG9ydGVkRGlhbGVjdEV4Y2VwdGlvbiBlKSB7Ci0JCSAgdGhyb3cgbmV3IE9wZW5NUEFuYWx5c2lzRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CQotCQl9Ci0JCWlGaWxlXyA9IGlGaWxlOwotICAgICAgICBpbml0KCk7Ci0gICAgICAgIAotICAgICAgICBjdXJyZW50TWFuYWdlcl8gPSB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGJ5IHRlc3RpbmcgbWVjaGFuaXNtCi0gICAgICogQHBhcmFtIGFzdFRyYW5zVW5pdAotICAgICAqLwotICAgIHB1YmxpYyBPcGVuTVBBbmFseXNpc01hbmFnZXIoSUFTVFRyYW5zbGF0aW9uVW5pdCBhc3RUcmFuc1VuaXQsIElGaWxlIGlGaWxlKQotICAgIHsKLSAgICAgICAgYXN0VHJhbnNVbml0XyA9IGFzdFRyYW5zVW5pdDsKLSAgICAgICAgaUZpbGVfICAgID0gaUZpbGU7Ci0gICAgICAgIGluaXQoKTsKLSAgICAgICAgY3VycmVudE1hbmFnZXJfID0gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsYXN0IGFuYWx5c2lzIG1hbmFnZXIgYnVpbHQKLSAgICAgKiBAcmV0dXJuIE9wZW5NUEFuYWx5c2lzTWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT3Blbk1QQW5hbHlzaXNNYW5hZ2VyIGdldEN1cnJlbnRNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50TWFuYWdlcl87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIG1haW4gbG9naWMgaW52b2tlZCBieSBib3RoIGNvbnN0cnVjdG9ycwotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgLy8gTm90ZTogdGhyb3VnaG91dCBhbGwgdGhpcywgaXQgaXMgYmVzdCB0byB1c2UgdGhlIHNhbWUgQVNUIGluc3RhbmNlLCBpLmUuCi0gICAgICAgIC8vICAgICAgIGRvbid0IHJlLWdlbiBpdCwgYXMgcmVmZXJlbmNlcyB0byBub2RlcyBtYXkgYmUgbWFkZSBieSB2YXJpb3VzIGNvbXBvbmVudHMKLSAgICAgICAgLy8gICAgICAgdGhhdCBzaG91bGQgaG9sZCB1cCB1bmRlciBlcXVhbGl0eS4KLSAgICAgICAgYnVpbGRQcmVwcm9jZXNzb3JBU1QoKTsKLSAgICAgICAgCi0gICAgICAgIGJ1aWxkRGljdGlvbmFyeSgpOwotICAgICAgICAKLSAgICAgICAgYnVpbGRPTVBQcmFnbWFzKCk7Ci0gICAgICAgIAotICAgICAgICBidWlsZE9NUENvbmN1cnJlbmN5QW5hbHlzaXMoKTsKLSAgICAgICAgCi0gICAgICAgIGJ1aWxkRmlsZU1hcCgpOwotICAgICAgICAKLSAgICAgICAgLy9idWlsZERvbW9DRFQoKTsKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogQnVpbGQgYWxsIHRoZSBub2RlcywgY29tcHV0ZSB3aGljaCBjb21waWxlZAotICAgICAqCi0gICAgICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJlcHJvY2Vzc29yQVNUKCkKLQl7Ci0gICAgICAgIElBU1RQcmVwcm9jZXNzb3JTdGF0ZW1lbnRbXSBwbGlzdCA9IGFzdFRyYW5zVW5pdF8uZ2V0QWxsUHJlcHJvY2Vzc29yU3RhdGVtZW50cygpOwotICAgICAgICAKLSAgICAgICAgcGFzdF8gPSBuZXcgUEFTVE5vZGVbcGxpc3QubGVuZ3RoXTsKLSAgICAgICAgCi0gICAgICAgIGZvcihpbnQgaT0wOyBpPHBsaXN0Lmxlbmd0aDsgaSsrKSAKLSAgICAgICAgICBwYXN0X1tpXSA9IFBBU1RGYWN0b3J5LlBBU1RGYWN0b3J5TWFrZShwbGlzdFtpXSk7CQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IHRoZSBjb21waWxlZCBmbGFncyB0byBzaG93IGxpdmUgYW5kIGRlYWQgcHJlcHJvY2Vzc29yIHN0YXRlbWVudHMKLSAgICAgICAgY29tcHV0ZUNvbXBpbGVkKCk7Ci0gICAgICAgIAotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBCdWlsZCB0aGUgInZhcmlhYmxlIiBkaWN0aW9uYXJ5Ci0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGREaWN0aW9uYXJ5KCkKLSAgICB7Ci0gICAgICAgIGRpY3Rpb25hcnlfID0gRGljdGlvbmFyeUZhY3RvcnkuYnVpbGREaWN0aW9uYXJ5KGFzdFRyYW5zVW5pdF8pOwotICAgIH0KLSAgICAKLS8vICAgIHByaXZhdGUgdm9pZCBidWlsZERvbW9DRFQoKQotLy8gICAgewotLy8gICAgICAgIENEVFRyYW5zbGF0ZVRvQ0FzdCBjdHJhbnMgPSBuZXcgQ0RUQVNUMkNBc3RUcmFuc2xhdG9yKG5ldyBJQVNUTm9kZUZhY3RvcnlfYygpKTsKLS8vICAgICAgICBDQXN0RW50aXR5IGVudGl0eSA9IGN0cmFucy50cmFuc2xhdGUoYXN0VHJhbnNVbml0Xyk7Ci0vLwotLy8gICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7Ci0vLwotLy8gICAgICAgIENBc3RQcmludGVyLnByaW50VG8oZW50aXR5LCBwcmludFdyaXRlcik7Ci0vLyAgICAgICAgcHJpbnRXcml0ZXIuZmx1c2goKTsKLS8vCi0vLyAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGQgdGhlIE9NUCBzdHlsZSBwcmFnbWFzCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRPTVBQcmFnbWFzKCkKLSAgICB7Ci0gICAgICAgIGludCAgICAgICAgcENvdW50ICAgPSAwOwotICAgICAgICBJRG9jdW1lbnQgIHByYWdtYURvYyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyAgICAgZmlsZW5hbWUgID0gIiI7Ci0gICAgICAgIAotICAgICAgICBmb3IoaW50IGk9MDsgaTxwYXN0Xy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICBpZiAocGFzdF9baV0gaW5zdGFuY2VvZiBQQVNUUHJhZ21hKSB7Ci0gICAgICAgICAgICAgICBQQVNUUHJhZ21hIHByYWdtYSA9IChQQVNUUHJhZ21hKXBhc3RfW2ldOwotICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIG9mIHRoZXNlLCBnZXQgdGhlIGNvbnRlbnQKLSAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICBTdHJpbmcgbmV3RmlsZU5hbWUgPSAoKFBBU1RQcmFnbWEpcGFzdF9baV0pLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgaWYgKCFmaWxlbmFtZS5lcXVhbHMobmV3RmlsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBuZXdGaWxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICBwcmFnbWFEb2MgPSBVdGlsaXR5LmdldERvY3VtZW50KGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChwcmFnbWFEb2MhPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBwcmFnbWFEb2MuZ2V0KHByYWdtYS5nZXRMb2NhbE9mZnNldCgpLCBwcmFnbWEuZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgcHJhZ21hLnNldENvbnRlbnQoY29udGVudCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBwYXN0X1tpXSA9IFBBU1RPTVBGYWN0b3J5Lm1ha2VQQVNUT01QKChQQVNUUHJhZ21hKXBhc3RfW2ldLCBhc3RUcmFuc1VuaXRfLCBkaWN0aW9uYXJ5Xyk7Ci0gICAgICAgICAgICAgICAvLyBpZiBzdWNjZXNzZnVsLCB3b3VsZCBiZSBhbiBvbXAKLSAgICAgICAgICAgICAgIGlmIChwYXN0X1tpXSBpbnN0YW5jZW9mIFBBU1RPTVBQcmFnbWEpCi0gICAgICAgICAgICAgICAgIHBDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBwcmFnbWEgbGlzdAotICAgICAgICBpbnQgIGluZGV4ID0gMDsKLSAgICAgICAgb21wUHJhZ21hc18gPSBuZXcgUEFTVE9NUFByYWdtYVtwQ291bnRdOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxwYXN0Xy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHBhc3RfW2ldIGluc3RhbmNlb2YgUEFTVE9NUFByYWdtYSkgCi0gICAgICAgICAgICAgICAgb21wUHJhZ21hc19baW5kZXgrK10gPSAoUEFTVE9NUFByYWdtYSlwYXN0X1tpXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYodHJhY2VPbilwcmludFBBU1RSZXN1bHRzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEJ1aWxkIGNvbmN1cnJlbmN5IGFuYWx5c2lzCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRPTVBDb25jdXJyZW5jeUFuYWx5c2lzKCkKLSAgICB7Ci0gICAgICAgIGZpbGVBbmFseXNpc18gPSBuZXcgRmlsZUNvbmN1cnJlbmN5QW5hbHlzaXMoYXN0VHJhbnNVbml0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T01QUHJhZ21hcygpKTsKLSAgICAgICAgLypEZWZWaXNpdG9yIGR2ID0gbmV3IERlZlZpc2l0b3IoYXN0VHJhbnNVbml0XywgaUZpbGVfLCBnZXRPTVBQcmFnbWFzKCkpOwotICAgICAgICBhbmFseXNlc18gPSBkdi5idWlsZEFuYWx5c2VzKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCB0aGUgcGhhc2UgYW5hbHlzaXMKLSAgICAgICAgZm9yKGludCBpPTA7IGk8YW5hbHlzZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGdW5jdGlvbkNvbmN1cnJlbmN5QW5hbHlzaXMgb2NhID0gYW5hbHlzZXNfW2ldOwotICAgICAgICAgICAgb2NhLmRvUGhhc2VBbmFseXNpcygpOwotICAgICAgICAgICAgaWYgKHRyYWNlT24pIG9jYS5wcmludEFuYWx5c2lzKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ki8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZCB0aGUgbG9jYXRpb24tLT5zdG10L2V4cHIgbWFwCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBidWlsZEZpbGVNYXAoKQotICAgIHsKLSAgICAgICAgLy8gTm90ZSAtIGltcG9ydGFudCB0aGF0IHdlIHVzZSBTQU1FIEFTVCBmb3IgYWxsIGFuYWx5c2lzIGFuZCBsb29rdXAKLSAgICAgICAgZmlsZU1hcF8gPSBuZXcgRmlsZVN0YXRlbWVudE1hcChhc3RUcmFuc1VuaXRfKTsgCi0gICAgICAgIGZpbGVNYXBfLmJ1aWxkTWFwKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJhZ21hIEFTVCB0cmVlCi0gICAgICogQHJldHVybiBQQVNUTm9kZSBbXQotICAgICAqLwotICAgIHB1YmxpYyBQQVNUTm9kZSBbXSBnZXRQQVNUKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXN0XzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBQQVNUT01QUHJhZ21hcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgUEFTVE9NUFByYWdtYSBbXSBnZXRPTVBQcmFnbWFzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvbXBQcmFnbWFzXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIElBU1RUcmFuc2xhdGlvblVuaXQKLSAgICAgKiBAcmV0dXJuIElBU1RUcmFuc2xhdGlvblVuaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFTVFRyYW5zbGF0aW9uVW5pdCBnZXRUVSgpCi0gICAgewotICAgICAgICByZXR1cm4gYXN0VHJhbnNVbml0XzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWNjZXNzb3IgdG8gdGhlIGZpbGUgbWFwIGZvciBhbmFseXplZCBmaWxlCi0gICAgICogQHJldHVybiBGaWxlU3RhdGVtZW50TWFwCi0gICAgICovCi0gICAgcHVibGljIEZpbGVTdGF0ZW1lbnRNYXAgZ2V0RmlsZU1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZU1hcF87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgYW5hbHlzaXMgZm9yIGVhY2ggZnVuY3Rpb24KLSAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcyBbXQotICAgICAqLwotICAgIHB1YmxpYyBGdW5jdGlvbkNvbmN1cnJlbmN5QW5hbHlzaXMgW10gZ2V0QW5hbHlzZXMoKSAKLSAgICB7IHJldHVybiBhbmFseXNlc187IH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIG5vZGVzIGNvbmN1cnJlbnQgdG8gZ2l2ZW4gbm9kZQotICAgICAqIEBwYXJhbSBub2RlIC0gSUFTVE5vZGUKLSAgICAgKiBAcmV0dXJuIFNldAotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZ2V0Tm9kZXNDb25jdXJyZW50VG8oSUFTVE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlQW5hbHlzaXNfLmdldE5vZGVzQ29uY3VycmVudFRvKG5vZGUpOwotICAgIH0KLSAgIAotICAgIC8qKgotICAgICAqIFByaW50cyBvdXQgcmVzdWx0cyBmb3IgZGVidWdnaW5nCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFBBU1RSZXN1bHRzKCkKLSAgICB7Ci0gICAgICAgIC8vIG91dHB1dCB0aGUgcmVzdWx0cwotICAgICAgICBmb3IoaW50IGk9MDsgaTxwYXN0Xy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChwYXN0X1tpXS5nZXRUeXBlKCkrIiAiKyhwYXN0X1tpXS5pc0NvbXBpbGVkKCkgPyAiY29tcGlsZWQiOiAibm90IGNvbXBpbGVkIikpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiIGF0ICgiKyBwYXN0X1tpXS5nZXRGaWxlbmFtZSgpKyIsIitwYXN0X1tpXS5nZXRTdGFydGluZ0xpbmUoKSsiLCIrCi0gICAgICAgICAgICAgICAgICAgIHBhc3RfW2ldLmdldFN0YXJ0TG9jYXRpb24oKSsiLCIrcGFzdF9baV0uZ2V0RW5kTG9jYXRpb24oKSsiKSAiKTsKLSAgICAgICAgICAgIGlmIChwYXN0X1tpXSBpbnN0YW5jZW9mIFBBU1RPTVBQcmFnbWEpIHsKLSAgICAgICAgICAgICAgICBpbnQgdCA9ICgoUEFTVE9NUFByYWdtYSlwYXN0X1tpXSkuZ2V0T01QVHlwZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIE9NUFByYWdtYSB0eXBlPSIrdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZSB3aGljaCBzdGF0ZW1lbnRzIGNvbXBpbGVkCi0gICAgICoKLSAgICAgKi8KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUNvbXBpbGVkKCkKLQl7Ci0JCVN0YWNrICAgY29udGV4dCA9IG5ldyBTdGFjaygpOwotICAgICAgICBib29sZWFuIGN1cnJlbnRFdmFsdWF0aW9uID0gdHJ1ZTsKLSAgICAgICAgaW50ICAgICBjdXJyZW50TGV2ZWwgICAgICA9IDA7Ci0gICAgICAgIGludCAgICAgbGFzdE5vbklnbm9yZWRJZiAgPSBjdXJyZW50TGV2ZWw7Ci0JCWNvbnRleHQucHVzaChuZXcgQ29tcGlsZWRDb250ZXh0KGN1cnJlbnRMZXZlbCwgY3VycmVudEV2YWx1YXRpb24pKTsKLSAgICAgICAgCi0gICAgICAgIGludCAgIGlmY291bnQ9MDsKLSAgICAgICAgaW50ICAgZW5kaWZjb3VudD0wOwotCi0gICAgICAgIGludCBpPTA7Ci0gICAgICAgIGZvcihpPTA7IGk8cGFzdF8ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCVBBU1ROb2RlIG5vZGUgPSBwYXN0X1tpXTsKLSAgICAgICAgCWlmKG5vZGU9PW51bGwpewotICAgICAgICAJCWludCBzdG9wSGVyZT0wOwotICAgICAgICAJfQotICAgICAgICAJaWYgKGN1cnJlbnRFdmFsdWF0aW9uKSB7Ci0gICAgICAgIAkJaWYgKGlzSWYobm9kZSkpIHsKLSAgICAgICAgCQkJY3VycmVudEV2YWx1YXRpb24gPSBpZkRlY2lzaW9uKG5vZGUpOwotICAgICAgICAJCQljdXJyZW50TGV2ZWwrKzsgIGxhc3ROb25JZ25vcmVkSWYrKzsKLSAgICAgICAgCQkJY29udGV4dC5wdXNoKG5ldyBDb21waWxlZENvbnRleHQoY3VycmVudExldmVsLCBjdXJyZW50RXZhbHVhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBpZmNvdW50Kys7Ci0gICAgICAgIAkJfQotICAgICAgICAJCWVsc2UgaWYgKGlzRWxzZShub2RlKSkgewotICAgICAgIAkJCQljdXJyZW50RXZhbHVhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5lbXB0eSgpKSAgYnJlYWs7Ci0gICAgICAJCQkJKChDb21waWxlZENvbnRleHQpKGNvbnRleHQucGVlaygpKSkuc2V0RXZhbHVhdGlvbihjdXJyZW50RXZhbHVhdGlvbik7Ci0gICAgICAgIAkJfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRWxzZWlmKG5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBpbGVkQ29udGV4dCBjYyA9ICgoQ29tcGlsZWRDb250ZXh0KShjb250ZXh0LnBlZWsoKSkpOwotICAgICAgICAgICAgICAgICAgICBjYy5zZXRXYXNUcnVlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RXZhbHVhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBidW1wIHRoZSBsZXZlbAotICAgICAgICAgICAgICAgICAgICBjYy5zZXRFdmFsdWF0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIAkJZWxzZSBpZiAoaXNFbmQobm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZW1wdHkoKSkgYnJlYWs7Ci0gICAgICAJCQkJY29udGV4dC5wb3AoKTsKLSAgICAgICAJCQkJY3VycmVudExldmVsLS07ICBsYXN0Tm9uSWdub3JlZElmLS07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmVtcHR5KCkpICBicmVhazsKLSAgICAgICAJCQkJY3VycmVudEV2YWx1YXRpb24gPSAoKENvbXBpbGVkQ29udGV4dCkoY29udGV4dC5wZWVrKCkpKS5nZXRFdmFsdWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZGlmY291bnQrKzsKLSAgICAgICAgCQl9Ci0gICAgICAgIAkJbm9kZS5zZXRDb21waWxlZCh0cnVlKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UgeyAvLyBjdXJyZW50IGV2YWx1YXRpb24gPT0gZmFsc2UKLSAgICAgICAgCQlpZiAoY3VycmVudExldmVsPT1sYXN0Tm9uSWdub3JlZElmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0lmKG5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGV2ZWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0Q29tcGlsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWZjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRWxzZShub2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZWRDb250ZXh0IGNjID0gKChDb21waWxlZENvbnRleHQpKGNvbnRleHQucGVlaygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Mud2FzVHJ1ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFdmFsdWF0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgIAkJCQkgIGN1cnJlbnRFdmFsdWF0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmVtcHR5KCkpIGJyZWFrOwotICAgICAgICAJCQkJKChDb21waWxlZENvbnRleHQpKGNvbnRleHQucGVlaygpKSkuc2V0RXZhbHVhdGlvbihjdXJyZW50RXZhbHVhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldENvbXBpbGVkKHRydWUpOyAgLy8gbWVhbnMgd2FzIG5vdCBpZ25vcmVkIC0gaGFkIGVmZmVjdAotICAgICAgICAJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRWxzZWlmKG5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlZENvbnRleHQgY2MgPSAoKENvbXBpbGVkQ29udGV4dCkoY29udGV4dC5wZWVrKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYy53YXNUcnVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFdmFsdWF0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEV2YWx1YXRpb24gPSBpZkRlY2lzaW9uKG5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEV2YWx1YXRpb24pIGNjLnNldFdhc1RydWUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBidW1wIHRoZSBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgY2Muc2V0RXZhbHVhdGlvbihjdXJyZW50RXZhbHVhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCQkJZWxzZSBpZiAoaXNFbmQobm9kZSkpIHsKLSAgICAgICAgCQkJCWNvbnRleHQucG9wKCk7Ci0gICAgICAgIAkJCQljdXJyZW50TGV2ZWwtLTsgIGxhc3ROb25JZ25vcmVkSWYtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmVtcHR5KCkpIGJyZWFrOwotICAgICAgICAJCQkJY3VycmVudEV2YWx1YXRpb24gPSAoKENvbXBpbGVkQ29udGV4dCkoY29udGV4dC5wZWVrKCkpKS5nZXRFdmFsdWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldENvbXBpbGVkKGN1cnJlbnRFdmFsdWF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmY291bnQrKzsKLSAgICAgICAgCQkJfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAJCSAgbm9kZS5zZXRDb21waWxlZChmYWxzZSk7Ci0gICAgICAgIAkJfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIAlpZiAoaXNJZihub2RlKSkgewotICAgICAgICAgICAgICAgIAkJY3VycmVudExldmVsKys7Ci0gICAgICAgICAgICAgICAgCQlpZmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAJZWxzZSBpZiAoaXNFbmQobm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZXZlbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kaWZjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0Q29tcGlsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCX0KLQotICAgICAgICB9Ci0JfQotCQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiBub2RlIGlzIGEgYnJhbmNoCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSWYoUEFTVE5vZGUgbm9kZSkKLQl7Ci0JCXJldHVybiAobm9kZSBpbnN0YW5jZW9mIFBBU1RJZikgfHwgKG5vZGUgaW5zdGFuY2VvZiBQQVNUSWZkZWYpIHx8IChub2RlIGluc3RhbmNlb2YgUEFTVElmbmRlZik7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBjb21waWxlIGRlY2lzaW9uIG9mIHRoZSAnaWYnIGNvbmRpdGlvbgotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybgotICAgICAqLwotCXByaXZhdGUgYm9vbGVhbiBpZkRlY2lzaW9uKFBBU1ROb2RlIG5vZGUpCi0JewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFBBU1RJZikgcmV0dXJuICgoUEFTVElmKW5vZGUpLnRha2VuKCk7Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQQVNUSWZkZWYpIHJldHVybiAoKFBBU1RJZmRlZilub2RlKS50YWtlbigpOwotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUEFTVElmbmRlZikgcmV0dXJuICgoUEFTVElmbmRlZilub2RlKS50YWtlbigpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgbm9kZSBpcyBvZiAnZWxzZScga2luZAotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybgotICAgICAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0Vsc2UoUEFTVE5vZGUgbm9kZSkKLQl7Ci0JCXJldHVybiAobm9kZSBpbnN0YW5jZW9mIFBBU1RFbHNlKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBub2RlIGlzIG9mICdlbHNlaWYnIGtpbmQKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbHNlaWYoUEFTVE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAobm9kZSBpbnN0YW5jZW9mIFBBU1RFbGlmKTsKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIG5vZGUgaXMgb2YgJ2VuZCcga2luZAotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybgotICAgICAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuZChQQVNUTm9kZSBub2RlKQotCXsKLQkJcmV0dXJuIChub2RlIGluc3RhbmNlb2YgUEFTVEVuZGlmKTsKLQl9Ci0JCi0JCi0gICAgLyoqCi0gICAgKiBTdGFjayBvYmplY3QgdXNlZCBmb3IgZXZhbHVhdGluZyAiY29tcGlsZWQiIHN0YXRlIG9mIFBQJ3MKLSAgICAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBpbGVkQ29udGV4dAotCXsKLQkJcHJpdmF0ZSBib29sZWFuIGV2YWx1YXRpb25fICA9IGZhbHNlOwotCQlwcml2YXRlIGludCAgICAgbmVzdGVkTGV2ZWxfID0gMDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHdhc1RydWVfICAgICA9IGZhbHNlOyAgLy8gdXNlZCBmb3IgZWxpZiBzaXR1YXRpb25zCi0JCQotCQlwdWJsaWMgQ29tcGlsZWRDb250ZXh0KGludCBuZXN0ZWRMZXZlbCwgYm9vbGVhbiBldmFsdWF0aW9uKQotCQl7Ci0JCQlldmFsdWF0aW9uXyAgPSBldmFsdWF0aW9uOwotCQkJbmVzdGVkTGV2ZWxfID0gbmVzdGVkTGV2ZWw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGdldEV2YWx1YXRpb24oKQotCQl7Ci0JCQlyZXR1cm4gZXZhbHVhdGlvbl87Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEV2YWx1YXRpb24oYm9vbGVhbiBldmFsdWF0aW9uKQotCQl7Ci0JCQlldmFsdWF0aW9uXyA9IGV2YWx1YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0TmVzdGVkTGV2ZWwoKQotCQl7Ci0JCQlyZXR1cm4gbmVzdGVkTGV2ZWxfOwotCQl9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNUcnVlKCkgICAgICAgICAgICAgIHsgcmV0dXJuIHdhc1RydWVfOyB9Ci0gICAgICAgIHB1YmxpYyB2b2lkICAgIHNldFdhc1RydWUoYm9vbGVhbiB0ZikgeyB3YXNUcnVlXz10ZjsgfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1QRXJyb3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1QRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1NDMwOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL09wZW5NUEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpczsKLS8qKgotICogQGF1dGhvciBwYXplbAotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QRXJyb3IKLXsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uXyA9ICIiOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmlsZW5hbWVfICAgID0gIiI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoXyAgICAgICAgPSAiIjsKLSAgICBwcm90ZWN0ZWQgaW50ICAgIGxpbmVub18gICAgICA9IDA7Ci0gICAgcHJvdGVjdGVkIGludCAgICBzZXZlcml0eV8gICAgPSBJTkZPOwotICAgIAotICAgIC8vIHNldmVyaXR5IGNvZGVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTiAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgICA9IDI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3Blbk1QRXJyb3IgLSBob2xkcyBlcnJvciBpbmZvcm1hdGlvbgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIG9mIHByb2JsZW0KLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgICAgLSBvZiBwcm9ibGVtCi0gICAgICogQHBhcmFtIHBhdGggICAgICAgIC0gb2YgZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gbGluZW5vICAgICAgLSBvZiBwcm9ibGVtCi0gICAgICogQHBhcmFtIHNldmVyaXR5ICAgIC0gb2YgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBPcGVuTVBFcnJvcihTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHBhdGgsIGludCBsaW5lbm8sIGludCBzZXZlcml0eSkKLSAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwotICAgICAgICBmaWxlbmFtZV8gICAgPSBmaWxlbmFtZTsKLSAgICAgICAgcGF0aF8gICAgICAgID0gcGF0aDsKLSAgICAgICAgbGluZW5vXyAgICAgID0gbGluZW5vOwotICAgICAgICBzZXZlcml0eV8gICAgPSBzZXZlcml0eTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3Blbk1QRXJyb3IgLSBob2xkcyBlcnJvciBpbmZvcm1hdGlvbgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIFN0cmluZwotICAgICAqIEBwYXJhbSBmcW4gICAgICAgICAtIFN0cmluZyAocGF0aCtmaWxlbmFtZSkKLSAgICAgKiBAcGFyYW0gbGluZW5vICAgICAgLSBvZiBwcm9ibGVtCi0gICAgICogQHBhcmFtIHNldmVyaXR5ICAgIC0gb2YgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBPcGVuTVBFcnJvcihTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBmcW4sIGludCBsaW5lbm8sIGludCBzZXZlcml0eSkKLSAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwotICAgICAgICAKLSAgICAgICAgaW50IGwxID0gZnFuLmxhc3RJbmRleE9mKCcvJyk7ICAgaW50IGwyID0gZnFuLmxhc3RJbmRleE9mKCdcXCcpOwotICAgICAgICBpbnQgbGFzdEluZGV4ID0gTWF0aC5tYXgobDEsIGwyKTsKLSAgICAgICAgaWYgKGxhc3RJbmRleD09LTEgfHwgbGFzdEluZGV4PmZxbi5sZW5ndGgoKSsxKSAKLSAgICAgICAgICAgIGZpbGVuYW1lXz1mcW47Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsZW5hbWVfPWZxbi5zdWJzdHJpbmcobGFzdEluZGV4KzEpOwotICAgICAgICAgICAgcGF0aF89ZnFuLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsaW5lbm9fICAgICAgPSBsaW5lbm87Ci0gICAgICAgIHNldmVyaXR5XyAgICA9IHNldmVyaXR5OwotICAgIH0KLQotICAgIAotICAgIC8vIGFjY2Vzc29ycwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7IHJldHVybiBkZXNjcmlwdGlvbl87IH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgICAgeyByZXR1cm4gZmlsZW5hbWVfOyAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgICAgICAgIHsgcmV0dXJuIHBhdGhfOyAgICAgICAgfQotICAgIHB1YmxpYyBpbnQgICAgZ2V0TGluZW5vKCkgICAgICB7IHJldHVybiBsaW5lbm9fOyAgICAgIH0KLSAgICBwdWJsaWMgaW50ICAgIGdldFNldmVyaXR5KCkgICAgeyByZXR1cm4gc2V2ZXJpdHlfOyAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL09wZW5NUEVycm9yTWFuYWdlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9PcGVuTVBFcnJvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkYjk1MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL09wZW5NUEVycm9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotLyoqCi0gKiBIb2xkcyBhbGwgdGhlIGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgYW5hbHlzaXMsIHJlZi4gT3Blbk1QQW5hbHlzaXNNYW5hZ2VyCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBFcnJvck1hbmFnZXIKLXsKLSAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBlcnJvcnNfID0gbmV3IExpbmtlZExpc3QoKTsgICAgLy8gaG9sZHMgdGhlIGVycm9ycwotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgT3Blbk1QRXJyb3JNYW5hZ2VyIGN1cnJlbnRNYW5hZ2VyXyA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3Blbk1QRXJyb3JNYW5hZ2VyIC0gY29uc3RydWN0b3IKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBPcGVuTVBFcnJvck1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgY3VycmVudE1hbmFnZXJfID0gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IGVycm9yIG1hbmFnZXIKLSAgICAgKiBAcmV0dXJuIE9wZW5NUEVycm9yTWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT3Blbk1QRXJyb3JNYW5hZ2VyIGdldEN1cnJlbnRFcnJvck1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRNYW5hZ2VyXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGVycm9yCi0gICAgICogQHBhcmFtIGVycm9yIC0gT3Blbk1QRXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihPcGVuTVBFcnJvciBlcnJvcikKLSAgICB7Ci0gICAgICAgIGVycm9yc18uYWRkKGVycm9yKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGxpc3Qgb2YgYWxsIGVycm9ycwotICAgICAqIEByZXR1cm4gTGlua2VkTGlzdAotICAgICAqLwotICAgIHB1YmxpYyBMaW5rZWRMaXN0IGdldEVycm9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyb3JzXzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1wSURzLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL09wZW5NcElEcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTZjNTZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvT3Blbk1wSURzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpczsKLQotLyoqCi0gKiBJRHMgZS5nLiBmb3IgbWFya2VycwotICogCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NcElEcyB7Ci0JLyoqCi0JICogVGhlc2UgYXJlIHRoZSBtYXJrZXIgdHlwZSB1c2VkIGZvciBzaG93aW5nIGNvbmN1cnJlbmN5Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDb25jdXJyZW5jeVR5cGUgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLmNvbmN1cnJlbmN5IjsKLQkvKioKLQkgKiBUaGVzZSBhcmUgdGhlIG1hcmtlciB0eXBlIHVzZWQgZm9yIHNob3dpbmcgbm9uLWNvbmN1cnJlbmN5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTm9uQ29uY3VycmVuY3lUeXBlID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5ub25jb25jdXJyZW5jeSI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNURWxpZi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RFbGlmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmVlODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RFbGlmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yRWxpZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLkFTVE5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBwYXplbAotICovCi1wdWJsaWMgY2xhc3MgUEFTVEVsaWYgZXh0ZW5kcyBQQVNUTm9kZSAgaW1wbGVtZW50cyBJQVNUUHJlcHJvY2Vzc29yRWxpZlN0YXRlbWVudAotewotCXByb3RlY3RlZCBJQVNUUHJlcHJvY2Vzc29yRWxpZlN0YXRlbWVudCBlbGlmXyA9IG51bGw7Ci0JCi0gICAgLyoqCi0gICAgICogUEFTVEVsaWYgLSBFbGlmIHByZXByb2Nlc3NvciBzdGF0ZW1lbnQgKGNvbnN0cnVjdG9yKQotICAgICAqIEBwYXJhbSBlbGlmOiBBU1RFbGlmCi0gICAgICovCi0JcHVibGljIFBBU1RFbGlmKElBU1RQcmVwcm9jZXNzb3JFbGlmU3RhdGVtZW50IGVsaWYpCi0JewotCQlzdXBlcigoQVNUTm9kZSllbGlmKTsKLQkJZWxpZl8gPSBlbGlmOwotCX0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIjZWxpZiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGFrZW4gLSByZWZsZWN0cyBBU1RFbGlmIGNob2ljZQotICAgICAqLwotCXB1YmxpYyBib29sZWFuIHRha2VuKCkgewotCQlyZXR1cm4gZWxpZl8udGFrZW4oKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENvbmRpdGlvbigpIHsKLQkJcmV0dXJuIGVsaWZfLmdldENvbmRpdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpIHsKLQkJcmV0dXJuIGVsaWZfLmlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RFbHNlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEVsc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNTViZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEVsc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvckVsc2VTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1ROb2RlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIFBBU1RFbHNlIGV4dGVuZHMgUEFTVE5vZGUgaW1wbGVtZW50cyBJQVNUUHJlcHJvY2Vzc29yRWxzZVN0YXRlbWVudAotewotCXByb3RlY3RlZCBJQVNUUHJlcHJvY2Vzc29yRWxzZVN0YXRlbWVudCBlbHNlXyA9IG51bGw7Ci0JCi0gICAgLyoqCi0gICAgICogUEFTVEVsc2UgLSBFbHNlIHByZXByb2Nlc3NvciBzdGF0ZW1lbnQgKENvbnN0cnVjdG9yKQotICAgICAqIEBwYXJhbSBlbHNlZQotICAgICAqLwotCXB1YmxpYyBQQVNURWxzZShJQVNUUHJlcHJvY2Vzc29yRWxzZVN0YXRlbWVudCBlbHNlZSkKLQl7Ci0JCXN1cGVyKChBU1ROb2RlKWVsc2VlKTsKLQkJZWxzZV8gPSBlbHNlZTsKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiI2Vsc2UiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRha2VuIC0gcmVmbGVjdHMgQVNURWxzZSBjaG9pY2UKLSAgICAgKi8KLQlwdWJsaWMgYm9vbGVhbiB0YWtlbigpIHsKLQkJcmV0dXJuIGVsc2VfLnRha2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCkgewotCQlyZXR1cm4gZWxzZV8uaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEVuZGlmLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEVuZGlmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzUyNDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RFbmRpZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvckVuZGlmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuQVNUTm9kZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQVNURW5kaWYgZXh0ZW5kcyBQQVNUTm9kZSBpbXBsZW1lbnRzIElBU1RQcmVwcm9jZXNzb3JFbmRpZlN0YXRlbWVudAotewotCXByaXZhdGUgSUFTVFByZXByb2Nlc3NvckVuZGlmU3RhdGVtZW50ICAgZW5kaWZfID0gbnVsbDsKLQkKLSAgICAvKioKLSAgICAgKiBQQVNURW5kaWYgLSBFbmRpZiBwcm9wcm9jZXNzb3Igc3RhdG1lbnQgKENvbnN0cnVjdG9yKQotICAgICAqIEBwYXJhbSBlbmRpZjogQVNURW5kaWYKLSAgICAgKi8KLSAgICBwdWJsaWMgUEFTVEVuZGlmKElBU1RQcmVwcm9jZXNzb3JFbmRpZlN0YXRlbWVudCBlbmRpZikKLSAgICB7Ci0gICAgCXN1cGVyKChBU1ROb2RlKWVuZGlmKTsKLSAgICAJZW5kaWZfID0gZW5kaWY7Ci0gICAgfQotICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIjZW5kaWYiOwotICAgIH0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpIHsKLQkJcmV0dXJuIGVuZGlmXy5pc1BhcnRPZlRyYW5zbGF0aW9uVW5pdEZpbGUoKTsKLQl9Ci0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNURXJyb3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNURXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4ZGM4ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yRXJyb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1ROb2RlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIFBBU1RFcnJvciBleHRlbmRzIFBBU1ROb2RlIGltcGxlbWVudHMgSUFTVFByZXByb2Nlc3NvckVycm9yU3RhdGVtZW50Ci17Ci0JcHJvdGVjdGVkIElBU1RQcmVwcm9jZXNzb3JFcnJvclN0YXRlbWVudCBlcnJvcl8gPSBudWxsOwotCQotICAgIC8qKgotICAgICAqIFBBU1RFcnJvciAtIEVycm9yIHByZXByb2Nlc3NvciBzdGF0bWVudCAoQ29uc3RydWN0b3IpCi0gICAgICogQHBhcmFtIGVycm9yOiBBU1RFcnJvcgotICAgICAqLwotCXB1YmxpYyBQQVNURXJyb3IoSUFTVFByZXByb2Nlc3NvckVycm9yU3RhdGVtZW50IGVycm9yKQotCXsKLQkJc3VwZXIoKEFTVE5vZGUpZXJyb3IpOwotCQllcnJvcl8gPSBlcnJvcjsKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiI2Vycm9yIjsKLSAgICB9Ci0KLQlwdWJsaWMgY2hhcltdIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvcl8uZ2V0TWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpIHsKLQkJcmV0dXJuIGVycm9yXy5pc1BhcnRPZlRyYW5zbGF0aW9uVW5pdEZpbGUoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RGYWN0b3J5LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2ZDk5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JFbGlmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvckVsc2VTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yRW5kaWZTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yRXJyb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yRnVuY3Rpb25TdHlsZU1hY3JvRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JJZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JJZmRlZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JJZm5kZWZTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29ySW5jbHVkZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JPYmplY3RTdHlsZU1hY3JvRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JQcmFnbWFTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvclVuZGVmU3RhdGVtZW50OwotCi0KLQotLyoqCi0gKiBDcmVhdGUgb3VyIG5ldyBQQVNUIHR5cGVzIGZyb20gb2xkIEFTVCB0eXBlcwotICogQGF1dGhvciBwYXplbAotICovCi1wdWJsaWMgY2xhc3MgUEFTVEZhY3RvcnkgCi17Ci0gICAgLyoqCi0gICAgICogUEFTVEZhY3RvcnlNYWtlIC0gQ29udmVyc2lvbiBmcm9tIEFTVCB0byBQQVNUCi0gICAgICogQHBhcmFtIG5vZGU6IElBU1RQcmVwcm9jZXNzb3JTdGF0ZW1lbnQKLSAgICAgKiBAcmV0dXJuIFBBU1ROb2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQQVNUTm9kZSBQQVNURmFjdG9yeU1ha2UoSUFTVFByZXByb2Nlc3NvclN0YXRlbWVudCBub2RlKQotICAgIHsKLSAgICAJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNUUHJlcHJvY2Vzc29yRW5kaWZTdGF0ZW1lbnQpCi0gICAgCQlyZXR1cm4gbmV3IFBBU1RFbmRpZigoSUFTVFByZXByb2Nlc3NvckVuZGlmU3RhdGVtZW50KW5vZGUpOwotICAgIAllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUFTVFByZXByb2Nlc3NvckVsaWZTdGF0ZW1lbnQpCi0gICAgCQlyZXR1cm4gbmV3IFBBU1RFbGlmKChJQVNUUHJlcHJvY2Vzc29yRWxpZlN0YXRlbWVudClub2RlKTsKLSAgICAJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElBU1RQcmVwcm9jZXNzb3JFbHNlU3RhdGVtZW50KQotICAgIAkJcmV0dXJuIG5ldyBQQVNURWxzZSgoSUFTVFByZXByb2Nlc3NvckVsc2VTdGF0ZW1lbnQpbm9kZSk7Ci0gICAgCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNUUHJlcHJvY2Vzc29ySWZuZGVmU3RhdGVtZW50KQotICAgIAkJcmV0dXJuIG5ldyBQQVNUSWZuZGVmKChJQVNUUHJlcHJvY2Vzc29ySWZuZGVmU3RhdGVtZW50KW5vZGUpOwotICAgIAllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUFTVFByZXByb2Nlc3NvcklmZGVmU3RhdGVtZW50KQotICAgIAkJcmV0dXJuIG5ldyBQQVNUSWZkZWYoKElBU1RQcmVwcm9jZXNzb3JJZmRlZlN0YXRlbWVudClub2RlKTsKLSAgICAJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElBU1RQcmVwcm9jZXNzb3JJZlN0YXRlbWVudCkKLSAgICAJCXJldHVybiBuZXcgUEFTVElmKChJQVNUUHJlcHJvY2Vzc29ySWZTdGF0ZW1lbnQpbm9kZSk7Ci0gICAgCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNUUHJlcHJvY2Vzc29yRXJyb3JTdGF0ZW1lbnQpCi0gICAgCQlyZXR1cm4gbmV3IFBBU1RFcnJvcigoSUFTVFByZXByb2Nlc3NvckVycm9yU3RhdGVtZW50KW5vZGUpOwotICAgIAllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUFTVFByZXByb2Nlc3NvclByYWdtYVN0YXRlbWVudCkKLSAgICAJCXJldHVybiBuZXcgUEFTVFByYWdtYSgoSUFTVFByZXByb2Nlc3NvclByYWdtYVN0YXRlbWVudClub2RlKTsKLSAgICAJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElBU1RQcmVwcm9jZXNzb3JVbmRlZlN0YXRlbWVudCkKLSAgICAJCXJldHVybiBuZXcgUEFTVFVuZGVmKChJQVNUUHJlcHJvY2Vzc29yVW5kZWZTdGF0ZW1lbnQpbm9kZSk7Ci0gICAgCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNUUHJlcHJvY2Vzc29ySW5jbHVkZVN0YXRlbWVudCkKLSAgICAJCXJldHVybiBuZXcgUEFTVEluY2x1c2lvblN0YXRlbWVudCgoSUFTVFByZXByb2Nlc3NvckluY2x1ZGVTdGF0ZW1lbnQpbm9kZSk7Ci0gICAgCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNUUHJlcHJvY2Vzc29yRnVuY3Rpb25TdHlsZU1hY3JvRGVmaW5pdGlvbikKLSAgICAJCXJldHVybiBuZXcgUEFTVEZ1bmN0aW9uTWFjcm8oKElBU1RQcmVwcm9jZXNzb3JGdW5jdGlvblN0eWxlTWFjcm9EZWZpbml0aW9uKW5vZGUpOwotICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUFTVFByZXByb2Nlc3Nvck9iamVjdFN0eWxlTWFjcm9EZWZpbml0aW9uKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQQVNUT2JqZWN0TWFjcm8oKElBU1RQcmVwcm9jZXNzb3JPYmplY3RTdHlsZU1hY3JvRGVmaW5pdGlvbilub2RlKTsKLSAgICAgICAgZWxzZXsKLSAgICAgICAgCXJldHVybiBudWxsOy8vd2hhdCBpcyBub2RlPyAgIExvY2F0aW9uTWFwJEFTVFdhcm5pbmcuCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVEZ1bmN0aW9uTWFjcm8uamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNURnVuY3Rpb25NYWNyby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNlNjdiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNURnVuY3Rpb25NYWNyby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZpbGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvblN0eWxlTWFjcm9QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQcmVwcm9jZXNzb3JGdW5jdGlvblN0eWxlTWFjcm9EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuQVNUTm9kZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQVNURnVuY3Rpb25NYWNybyBleHRlbmRzIFBBU1ROb2RlIGltcGxlbWVudHMgSUFTVFByZXByb2Nlc3NvckZ1bmN0aW9uU3R5bGVNYWNyb0RlZmluaXRpb24KLXsKLQlwcm90ZWN0ZWQgSUFTVFByZXByb2Nlc3NvckZ1bmN0aW9uU3R5bGVNYWNyb0RlZmluaXRpb24gbWFjcm9fID0gbnVsbDsKLQkKLSAgICAvKioKLSAgICAgKiBQQVNURnVuY3Rpb25NYWNybyAtICJkZWZpbmUiIGZ1bmN0aW9uIG1hY3JvIChDb25zdHJ1Y3RvcikKLSAgICAgKiBAcGFyYW0gbWFjcm8KLSAgICAgKi8KLQlwdWJsaWMgUEFTVEZ1bmN0aW9uTWFjcm8oSUFTVFByZXByb2Nlc3NvckZ1bmN0aW9uU3R5bGVNYWNyb0RlZmluaXRpb24gbWFjcm8pCi0JewotCQlzdXBlcigoQVNUTm9kZSltYWNybyk7Ci0JCW1hY3JvXyA9IG1hY3JvOwotCX0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIjZGVmaW5lIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxlZ2F0ZWQgbWV0aG9kcyBmb3IgaW50ZXJmYWNlIElBU1RQcmVwcm9jZXNzb3JGdW5jdGlvblN0eWxlTWFjcm9EZWZpbml0aW9uCi0gICAgICovCi0JcHVibGljIFN0cmluZyBnZXRFeHBhbnNpb24oKSB7Ci0JCXJldHVybiBtYWNyb18uZ2V0RXhwYW5zaW9uKCk7Ci0JfQotCi0JcHVibGljIElBU1ROYW1lIGdldE5hbWUoKSB7Ci0JCXJldHVybiBtYWNyb18uZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGFuc2lvbihTdHJpbmcgZXhwKSB7Ci0JICBtYWNyb18uc2V0RXhwYW5zaW9uKGV4cCk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoSUFTVE5hbWUgbmFtZSkgewotICAgICAgbWFjcm9fLnNldE5hbWUobmFtZSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoSUFTVEZ1bmN0aW9uU3R5bGVNYWNyb1BhcmFtZXRlciBwYXJtKSB7Ci0gICAgICBtYWNyb18uYWRkUGFyYW1ldGVyKHBhcm0pOwkJCi0JfQotCi0JcHVibGljIElBU1RGdW5jdGlvblN0eWxlTWFjcm9QYXJhbWV0ZXJbXSBnZXRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gbWFjcm9fLmdldFBhcmFtZXRlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJvbGVGb3JOYW1lKElBU1ROYW1lIG4pIHsKLQkJcmV0dXJuIG1hY3JvXy5nZXRSb2xlRm9yTmFtZShuKTsKLQl9Ci0KLQlwdWJsaWMgSUFTVEZpbGVMb2NhdGlvbiBnZXRFeHBhbnNpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIG1hY3JvXy5nZXRFeHBhbnNpb25Mb2NhdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpIHsKLQkJcmV0dXJuIG1hY3JvXy5pc1BhcnRPZlRyYW5zbGF0aW9uVW5pdEZpbGUoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVElmLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVElmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTJhY2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvcklmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuQVNUTm9kZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQVNUSWYgZXh0ZW5kcyBQQVNUTm9kZSBpbXBsZW1lbnRzIElBU1RQcmVwcm9jZXNzb3JJZlN0YXRlbWVudAotewotCXByb3RlY3RlZCBJQVNUUHJlcHJvY2Vzc29ySWZTdGF0ZW1lbnQgaWZfID0gbnVsbDsKLQkKLSAgICAvKioKLSAgICAgKiBQQVNUSWYgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBpZngKLSAgICAgKi8KLQlwdWJsaWMgUEFTVElmKElBU1RQcmVwcm9jZXNzb3JJZlN0YXRlbWVudCBpZngpCi0JewotCQlzdXBlcigoQVNUTm9kZSlpZngpOwotCQlpZl8gPSBpZng7Ci0JfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIiNpZiI7Ci0gICAgfQotCi0JcHVibGljIGJvb2xlYW4gdGFrZW4oKSB7Ci0JCXJldHVybiBpZl8udGFrZW4oKTsKLQl9Ci0KLQkvL2NkdDQwCi0JcHVibGljIGNoYXJbXSBnZXRDb25kaXRpb24oKSB7Ci0JCXJldHVybiBpZl8uZ2V0Q29uZGl0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCkgewotCQlyZXR1cm4gaWZfLmlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJZmRlZi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJZmRlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI1Y2E4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNUSWZkZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvcklmZGVmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuQVNUTm9kZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQVNUSWZkZWYgZXh0ZW5kcyBQQVNUTm9kZSBpbXBsZW1lbnRzIElBU1RQcmVwcm9jZXNzb3JJZmRlZlN0YXRlbWVudAotewotCXByb3RlY3RlZCBJQVNUUHJlcHJvY2Vzc29ySWZkZWZTdGF0ZW1lbnQgaWZkZWZfID0gbnVsbDsKLQkKLSAgICAvKioKLSAgICAgKiBQQVNUSWZkZWYgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBpZmRlZgotICAgICAqLwotCXB1YmxpYyBQQVNUSWZkZWYoSUFTVFByZXByb2Nlc3NvcklmZGVmU3RhdGVtZW50IGlmZGVmKQotCXsKLQkJc3VwZXIoKEFTVE5vZGUpaWZkZWYpOwotCQlpZmRlZl8gPSBpZmRlZjsKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiI2lmZGVmIjsKLSAgICB9Ci0KLQotCXB1YmxpYyBib29sZWFuIHRha2VuKCkgewotCQlyZXR1cm4gaWZkZWZfLnRha2VuKCk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDb25kaXRpb24oKSB7Ci0JCXJldHVybiBpZmRlZl8uZ2V0Q29uZGl0aW9uKCk7Ci0JfQotCi0JcHVibGljIElBU1ROYW1lIGdldE1hY3JvUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gaWZkZWZfLmdldE1hY3JvUmVmZXJlbmNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCkgewotCQlyZXR1cm4gaWZkZWZfLmlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJZm5kZWYuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNUSWZuZGVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjlhNWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJZm5kZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvcklmbmRlZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLkFTVE5vZGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUEFTVElmbmRlZiBleHRlbmRzIFBBU1ROb2RlIGltcGxlbWVudHMgSUFTVFByZXByb2Nlc3NvcklmbmRlZlN0YXRlbWVudAotewotCXByb3RlY3RlZCBJQVNUUHJlcHJvY2Vzc29ySWZuZGVmU3RhdGVtZW50IGlmbmRlZl8gPSBudWxsOwotCQotICAgIC8qKgotICAgICAqIFBBU1RJZm5kZWYgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBpZm5kZWYKLSAgICAgKi8KLQlwdWJsaWMgUEFTVElmbmRlZihJQVNUUHJlcHJvY2Vzc29ySWZuZGVmU3RhdGVtZW50IGlmbmRlZikKLQl7Ci0JCXN1cGVyKChBU1ROb2RlKWlmbmRlZik7Ci0JCWlmbmRlZl8gPSBpZm5kZWY7Ci0JfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIiNpZm5kZWYiOwotICAgIH0KLQotCi0JcHVibGljIGJvb2xlYW4gdGFrZW4oKSB7Ci0JCXJldHVybiBpZm5kZWZfLnRha2VuKCk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDb25kaXRpb24oKSB7Ci0JCXJldHVybiBpZm5kZWZfLmdldENvbmRpdGlvbigpOwotCX0KLQotCXB1YmxpYyBJQVNUTmFtZSBnZXRNYWNyb1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGlmbmRlZl8uZ2V0TWFjcm9SZWZlcmVuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRPZlRyYW5zbGF0aW9uVW5pdEZpbGUoKSB7Ci0JCXJldHVybiBpZm5kZWZfLmlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJbmNsdXNpb25TdGF0ZW1lbnQuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNUSW5jbHVzaW9uU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGU3YjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RJbmNsdXNpb25TdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvckluY2x1ZGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1ROb2RlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIFBBU1RJbmNsdXNpb25TdGF0ZW1lbnQgZXh0ZW5kcyBQQVNUTm9kZSBpbXBsZW1lbnRzIElBU1RQcmVwcm9jZXNzb3JJbmNsdWRlU3RhdGVtZW50Ci17Ci0JcHJvdGVjdGVkIElBU1RQcmVwcm9jZXNzb3JJbmNsdWRlU3RhdGVtZW50IGluY2xfID0gbnVsbDsKLQkKLSAgICAvKioKLSAgICAgKiBQQVNUSW5jbHVzaW9uU3RhdGVtZW50IC0gY29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gaW5jbDogQVNUSW5jbHVzaW9uU3RhdGVtZW50Ci0gICAgICovCi0JcHVibGljIFBBU1RJbmNsdXNpb25TdGF0ZW1lbnQoSUFTVFByZXByb2Nlc3NvckluY2x1ZGVTdGF0ZW1lbnQgaW5jbCkKLQl7Ci0JCXN1cGVyKChBU1ROb2RlKWluY2wpOwotCQlpbmNsXyA9IGluY2w7Ci0JfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIiNpbmNsdWRlIjsKLSAgICB9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIGluY2xfLmdldFBhdGgoKTsKLQl9Ci0KLQkvLyBjZHQ0MAotCXB1YmxpYyBJQVNUTmFtZSBnZXROYW1lKCkgewotCQlyZXR1cm4gaW5jbF8uZ2V0TmFtZSgpOwotCX0KLQotCS8vIGNkdDQwCi0JcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1JbmNsdWRlKCkgewotCQlyZXR1cm4gaW5jbF8uaXNTeXN0ZW1JbmNsdWRlKCk7Ci0JfQotCS8vIGNkdDQwCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiBpbmNsXy5pc0FjdGl2ZSgpOwotCX0KLQkvLyBjZHQ0MAotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiBpbmNsXy5pc1Jlc29sdmVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCkgewotCQlyZXR1cm4gaW5jbF8uaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1ROb2RlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzMTRmZi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1ROb2RlUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZpbGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1ROb2RlOwotCi0vKioKLSAqIFByZXByb2Nlc3NvciBub2RlLCBwc2V1ZG8gZm9yIElBU1ROb2RlLCB1c2VkIGZvciBhbmFseXNpcwotICogCi0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUEFTVE5vZGUgaW1wbGVtZW50cyBJQVNUTm9kZSAKLXsKLQotICAgIHByb3RlY3RlZCBBU1ROb2RlICAgYXN0Tm9kZV8gID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZF8gPSBmYWxzZTsKLSAgICAKLSAgICAvLyBMb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgIHByb3RlY3RlZCBpbnQgc3RhcnRpbmdMaW5lXyAgICAgPSAtMTsKLSAgICBwcm90ZWN0ZWQgaW50IHN0YXJ0TG9jYXRpb25fICAgID0gLTE7Ci0gICAgcHJvdGVjdGVkIGludCBlbmRMb2NhdGlvbl8gICAgICA9IC0xOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmlsZW5hbWVfICAgICAgPSAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQQVNUTm9kZSAtIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIGFzdE5vZGU6IExvY2F0aW9uTWFwLlNjYW5uZXJBU1ROb2RlCi0gICAgICovCi0gICAgcHVibGljIFBBU1ROb2RlKEFTVE5vZGUgYXN0Tm9kZSkKLSAgICB7Ci0gICAgCWFzdE5vZGVfID0gYXN0Tm9kZTsKLSAgICAgICAgCi0gICAgICAgIGdldExvY2F0aW9uSW5mbygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQQVNUTm9kZSAtIENvcHkgQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gbgotICAgICAqLwotICAgIHB1YmxpYyBQQVNUTm9kZShQQVNUTm9kZSBuKQotICAgIHsKLSAgICAgICBhc3ROb2RlXyAgICAgICA9IG4uYXN0Tm9kZV87Ci0gICAgICAgY29tcGlsZWRfICAgICAgPSBuLmNvbXBpbGVkXzsKLSAgICAgICBzdGFydGluZ0xpbmVfICA9IG4uc3RhcnRpbmdMaW5lXzsKLSAgICAgICBzdGFydExvY2F0aW9uXyA9IG4uc3RhcnRMb2NhdGlvbl87Ci0gICAgICAgZmlsZW5hbWVfICAgICAgPSBuLmZpbGVuYW1lXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0TG9jYXRpb25JbmZvIC0gTGluZSBudW1iZXIsIG9mZnNldCwgZXRjCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZXRMb2NhdGlvbkluZm8oKQotICAgIHsKLSAgICAgICAgSUFTVE5vZGVMb2NhdGlvbltdIGxvY2F0aW9ucyA9IGFzdE5vZGVfLmdldE5vZGVMb2NhdGlvbnMoKTsKLSAgICAgICAgZmlsZW5hbWVfID0gYXN0Tm9kZV8uZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCk7Ci0gICAgICAgIGlmIChsb2NhdGlvbnMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIElBU1RGaWxlTG9jYXRpb24gYXN0RmlsZUxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbnNbMF0gaW5zdGFuY2VvZiBJQVNURmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYXN0RmlsZUxvY2F0aW9uID0gKElBU1RGaWxlTG9jYXRpb24pIGxvY2F0aW9uc1swXTsKLSAgICAgICAgICAgICAgICBzdGFydGluZ0xpbmVfICA9IGFzdEZpbGVMb2NhdGlvbi5nZXRTdGFydGluZ0xpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICBzdGFydExvY2F0aW9uXyA9IGFzdEZpbGVMb2NhdGlvbi5nZXROb2RlT2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgZW5kTG9jYXRpb25fICAgPSBhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZU9mZnNldCgpICsgYXN0RmlsZUxvY2F0aW9uLmdldE5vZGVMZW5ndGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRGaWxlbmFtZSAtIGFjY2Vzc29yCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgeyByZXR1cm4gZmlsZW5hbWVfOyB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0U3RhcnRpbmdMaW5lIC0gYWNjZXNzb3IKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgICAgZ2V0U3RhcnRpbmdMaW5lKCkgeyByZXR1cm4gc3RhcnRpbmdMaW5lXzsgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFN0YXJ0TG9jYXRpb24gLSBhY2Nlc3NvcgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCAgICBnZXRTdGFydExvY2F0aW9uKCkgeyByZXR1cm4gc3RhcnRMb2NhdGlvbl87IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRFbmRMb2NhdGlvbiAtIGFjY2Vzc29yCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ICAgIGdldEVuZExvY2F0aW9uKCkgICB7IHJldHVybiBlbmRMb2NhdGlvbl87IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRUeXBlIC0gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdHlwZSBvZiBub2RlCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBzZXRDb21waWxlZCAtIHNldHRlcgotICAgICAqIEBwYXJhbSBjb21waWxlZDogYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVkKGJvb2xlYW4gY29tcGlsZWQpCi0gICAgewotICAgIAljb21waWxlZF8gPSBjb21waWxlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXNDb21waWxlZCAtIGFjY2Vzc29yCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21waWxlZCgpCi0gICAgewotICAgIAlyZXR1cm4gY29tcGlsZWRfOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRlbGVnYXRlZCBtZXRob2RzIGZvciBpbnRlcmZhY2UgSUFTVE5vZGUKLSAgICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQVNUVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXJldHVybiBhc3ROb2RlXy5hY2NlcHQodmlzaXRvcik7Ci0JfQotCS8qKiAgQHNpbmNlIGNkdDQwKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQVNUTm9kZSBub2RlKSB7Ci0gICAgCXJldHVybiBhc3ROb2RlXy5jb250YWlucyhub2RlKTsKLSAgICB9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCkgewotCQlyZXR1cm4gYXN0Tm9kZV8uZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCk7Ci0JfQotCi0JcHVibGljIElBU1RGaWxlTG9jYXRpb24gZ2V0RmlsZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gYXN0Tm9kZV8uZ2V0RmlsZUxvY2F0aW9uKCk7Ci0JfQotCi0JcHVibGljIElBU1ROb2RlTG9jYXRpb25bXSBnZXROb2RlTG9jYXRpb25zKCkgewotCQlyZXR1cm4gYXN0Tm9kZV8uZ2V0Tm9kZUxvY2F0aW9ucygpOwotCX0KLQotCXB1YmxpYyBJQVNUTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBhc3ROb2RlXy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZVByb3BlcnR5IGdldFByb3BlcnR5SW5QYXJlbnQoKSB7Ci0JCXJldHVybiBhc3ROb2RlXy5nZXRQcm9wZXJ0eUluUGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSYXdTaWduYXR1cmUoKSB7Ci0JCXJldHVybiBhc3ROb2RlXy5nZXRSYXdTaWduYXR1cmUoKTsKLQl9Ci0KLQlwdWJsaWMgSUFTVFRyYW5zbGF0aW9uVW5pdCBnZXRUcmFuc2xhdGlvblVuaXQoKSB7Ci0JCXJldHVybiBhc3ROb2RlXy5nZXRUcmFuc2xhdGlvblVuaXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUFTVE5vZGUgbm9kZSkgewotCQlhc3ROb2RlXy5zZXRQYXJlbnQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlJblBhcmVudChBU1ROb2RlUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJYXN0Tm9kZV8uc2V0UHJvcGVydHlJblBhcmVudChwcm9wZXJ0eSk7Ci0JfQotCQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RPTVBGYWN0b3J5LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVE9NUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkYmY0YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVE9NUEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDb21wb3VuZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGaWxlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLkFTVEludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ1Njb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuY3BwLkNQUFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5PcGVuTVBFcnJvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLmRpY3Rpb25hcnkuRGljdGlvbmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuZGljdGlvbmFyeS5TeW1ib2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLnBhcnNlci5PcGVuTVBTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5wYXJzZXIuT3Blbk1QVG9rZW47Ci0KLS8qKgotICogRmFjdG9yeSB0byBjb252ZXJ0IFBBU1RQcmFnbWEtLT5QQVNUT01QUHJhZ21hCi0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUEFTVE9NUEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgUEFTVFByYWdtYSAgICAgICAgICBwcmFnbWFfICAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgUEFTVE9NUFByYWdtYSAgICAgICBvbXBQcmFnbWFfICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgSUFTVFRyYW5zbGF0aW9uVW5pdCBhc3RfICAgICAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgRGljdGlvbmFyeSAgICAgICAgICBkaWN0aW9uYXJ5XyAgID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gICAgICB0cmFjZU9uXyAgICAgID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZU9uPWZhbHNlOwotICAgIAotICAgIHByb3RlY3RlZCBPcGVuTVBTY2FubmVyIHNjYW5uZXJfID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gICB0b2tlbl8gICA9IG51bGw7Ci0gICAgCi0gICAgLy9wcm90ZWN0ZWQgU2Nhbm5lckNhbGxiYWNrTWFuYWdlciBjYWxsYmFja01hbmFnZXJfID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IHVzZWQgb25seSBieSB0aGlzIGNsYXNzCi0gICAgICogQHBhcmFtIHByYWdtYSAtIFBBU1RQcmFnbWEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUEFTVE9NUEZhY3RvcnkoUEFTVFByYWdtYSAgICAgICAgICBwcmFnbWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSAgICAgICAgICBkaWN0aW9uYXJ5KQotICAgIHsKLSAgICAgICAgcHJhZ21hXyAgICAgPSBwcmFnbWE7Ci0gICAgICAgIHNjYW5uZXJfICAgID0gbmV3IE9wZW5NUFNjYW5uZXIocHJhZ21hXy5nZXRDb250ZW50KCkpOwotICAgICAgICBhc3RfICAgICAgICA9IGFzdDsKLSAgICAgICAgZGljdGlvbmFyeV8gPSBkaWN0aW9uYXJ5OwotICAgICAgICAKLSAgICAgICAgLy9leHBlcmltZW50KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodHJhY2VPbl8pCi0gICAgICAgICAgcmVhZFRva2VucygpOwotICAgICAgICAKLSAgICAgICAgLy9vdGhlcmluaXQobnVsbCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleHBlcmltZW50KCkKLSAgICB7Ci0gICAgICAgIElBU1RGaWxlTG9jYXRpb24gbG9jID0gcHJhZ21hXy5nZXRGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvYyE9bnVsbCkgewotICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gVXRpbGl0eS5nZXREb2N1bWVudChsb2MuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgdHh0ID0gZG9jdW1lbnQuZ2V0KHByYWdtYV8uZ2V0TG9jYWxPZmZzZXQoKSwgcHJhZ21hXy5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gZWl0aGVyIG9tcCBvciBub24tb21wIHByYWdtYQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUEFTVFByYWdtYSByZXRyaWV2ZVByYWdtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKG9tcFByYWdtYV8hPW51bGwgPyBvbXBQcmFnbWFfIDogcHJhZ21hXyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgZm9yIG1ha2luZyB0aGUgUEFTVE9NUFByYWdtYSBzdHJ1Y3R1cmUKLSAgICAgKiAgICAgICAgICAgICAgIGlmIHBvc3NpYmxlCi0gICAgICogQHBhcmFtIHByYWdtYSAgICAgOiBQQVNUUHJhZ21hIAotICAgICAqIEBwYXJhbSBhc3QgICAgICAgIDogSUFTVFRyYW5zbGF0aW9uVW5pdAotICAgICAqIEBwYXJhbSBkaWN0aW9uYXJ5IDogRGljdGlvbmFyeQotICAgICAqIEByZXR1cm46IFBBU1RQcmFnbWEgKG9yIFBBU1RPTVBQcmFnbWEgaWYgZG8tYWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBBU1RQcmFnbWEgbWFrZVBBU1RPTVAoUEFTVFByYWdtYSAgICAgICAgICBwcmFnbWEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnkgICAgICAgICAgZGljdGlvbmFyeSkKLSAgICB7Ci0gICAgICAgIFBBU1RPTVBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgUEFTVE9NUEZhY3RvcnkocHJhZ21hLCBhc3QsIGRpY3Rpb25hcnkpOwotICAgICAgICBmYWN0b3J5LnBhcnNlKCk7Ci0gICAgICAgIGZhY3RvcnkubG9jYXRlUmVnaW9uKCk7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5LnJldHJpZXZlUHJhZ21hKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBwcmFnbWEgY29udGV4dCBmb3IgT01QCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2UoKSAKLSAgICB7Ci0gICAgICAgIC8vIFRoZSBmaXJzdCB0d28gdG9rZW5zIHNob3VsZCBiZSAjIGFuZCBwcmFnbWEKLSAgICAJT3Blbk1QVG9rZW4gdG9rPW5leHRUb2tlbigpOwotICAgIAlpZih0b2s9PW51bGwpewotICAgIAkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlBBU1RPTVBGYWN0b3J5LnBhcnNlcigpLi5udWxsIHRva2VuLCBpZ25vcmVkLiIpOwotICAgIAkJcmV0dXJuIGZhbHNlOyAvL3JvYnVzdGx5IGhhbmRsZSBlbXB0eSB0b2tlbnMKLSAgICAJfQotICAgICAgICBpZiAodG9rLmdldFR5cGUoKSE9T3Blbk1QU2Nhbm5lci5tcFBvdW5kKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHRvaz1uZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKHRvay5nZXRUeXBlKCkhPU9wZW5NUFNjYW5uZXIubXBQcmFnbWEpIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8vIGlmIG5leHQgaXMgbm90IG9tcCAtIHRoaXMgaXMgbm90IGFuIG9wZW5tcCBkaXJlY3RpdmUKLSAgICAgICAgaWYgKG5leHRUb2tlbigpLmdldFR5cGUoKSE9T3Blbk1QU2Nhbm5lci5tcE9tcCkgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIE9wZW5NUCBwcmFnbWEKLSAgICAgICAgb21wUHJhZ21hXyA9IG5ldyBQQVNUT01QUHJhZ21hKHByYWdtYV8pOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIG5leHQgdG9rZW4gc2V0cyB0aGUgdHlwZQotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgT3Blbk1QVG9rZW4gdHlwZVRva2VuID0gdG9rZW5fOyAgIC8vIGRldGVybWluZXMgdHlwZSwgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZQotICAgICAgICBpZiAodG9rZW5fPT1udWxsKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICBvbXBQcmFnbWFfLnNldE9NUFR5cGUoc2V0T01QVHlwZSh0b2tlbl8uZ2V0VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodG9rZW5fPT1udWxsKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoKG9tcFByYWdtYV8uZ2V0T01QVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWw6Ci0gICAgICAgICAgICAgICAgY29tcGxldGVQYXJhbGxlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcEZvcjoKLSAgICAgICAgICAgICAgICBjb21wbGV0ZUZvcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsRm9yOgotICAgICAgICAgICAgICAgIGNvbXBsZXRlUGFyYWxsZWxGb3IoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBTZWN0aW9uczoKLSAgICAgICAgICAgICAgICBjb21wbGV0ZVNlY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxTZWN0aW9uczoKLSAgICAgICAgICAgICAgICBjb21wbGV0ZVBhcmFsbGVsU2VjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBTaW5nbGU6Ci0gICAgICAgICAgICAgICAgY29tcGxldGVTaW5nbGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBNYXN0ZXI6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wQ3JpdGljYWw6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wQmFycmllcjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBBdG9taWM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wU2VjdGlvbjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBGbHVzaDoKLSAgICAgICAgICAgICAgICBjb21wbGV0ZUZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wT3JkZXJlZDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBUaHJlYWRQcml2YXRlOgotICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyZWFkUHJpdmF0ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFVua25vd246Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVTdHJpbmcgPSAodHlwZVRva2VuIT1udWxsID8gdHlwZVRva2VuLmdldEltYWdlKCk6ICIiKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKCJVbmV4cGVjdGVkIHRva2VuICciK3R5cGVTdHJpbmcrIiciLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGFsbCByZW1haW5pbmcgdG9rZW5zIGFyZSBib2d1cwotICAgICAgICB3aGlsZSh0b2tlbl8hPW51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZVByb2JsZW0oIlVuZXhwZWN0ZWQgdG9rZW4gJyIrdG9rZW5fLmdldEltYWdlKCkrIiciLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdHlwZSBvZiBPcGVuTVAgc3RhdGVtZW50IGJhc2VkIG9uIGtleXdvcmQKLSAgICAgKiBAcGFyYW0gdAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICBOb3RlOiBhbHdheXMgZXhpdCB3aXRoIHRoZSBjdXJyZW50IHRva2VuIGJlaW5nIHRoZSBuZXh0IHRvIHByb2Nlc3MsIGkuZS4KLSAgICAgKiAgICAgICAgICBjYWxsIG5leHRUb2tlbigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBzZXRPTVBUeXBlKGludCB0KQotICAgIHsKLSAgICAgICBuZXh0VG9rZW4oKTsgICAgLy8gYWR2YW5jZSB0byBuZXh0IHRva2VuIAotICAgICAgIHN3aXRjaCh0KSB7Ci0gICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcFBhcmFsbGVsOgotICAgICAgICAgICAgICAgaWYgKHRva2VuXz09bnVsbCkgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWw7Ci0gICAgICAgICAgICAgICBpZiAodG9rZW5fLmdldFR5cGUoKT09T3Blbk1QU2Nhbm5lci5tcEZvcikgewotICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOyByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbEZvcjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuXy5nZXRUeXBlKCk9PU9wZW5NUFNjYW5uZXIubXBTZWN0aW9ucykgewotICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOyByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbFNlY3Rpb25zOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWw7Ci0gICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcEZvcjoKLSAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcEZvcjsKLSAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wU2VjdGlvbnM6Ci0gICAgICAgICAgICAgICByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBTZWN0aW9uczsKLSAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wU2VjdGlvbjoKLSAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcFNlY3Rpb247Ci0gICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcFNpbmdsZToKLSAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcFNpbmdsZTsKLSAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wTWFzdGVyOgotICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wTWFzdGVyOwotICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBDcml0aWNhbDoKLSAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcENyaXRpY2FsOwotICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBCYXJyaWVyOgotICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wQmFycmllcjsKLSAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wQXRvbWljOgotICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wQXRvbWljOwotICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBGbHVzaDoKLSAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcEZsdXNoOwotICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBPcmRlcmVkOgotICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wT3JkZXJlZDsKLSAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wVGhyZWFkUHJpdmF0ZToKLSAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcFRocmVhZFByaXZhdGU7Ci0gICAgICAgfQotICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcFVua25vd247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlIGEgbGlzdCBvZiBpZGVudGlmaWVycywgZS5nLiBhcyBmcm9tIHNoYXJlZCguLi4pCi0gICAgICogQHJldHVybiBPcGVuTVBUb2tlbiBbXQotICAgICAqLwotICAgIHByb3RlY3RlZCBPcGVuTVBUb2tlbiBbXSBnZXRJZGVudGlmaWVyTGlzdCgpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGwgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHRva2VuXz09bnVsbCkgIHJldHVybiBudWxsOwotICAgICAgICAvL2lmICh0b2tlbl8uZ2V0VHlwZSgpIT1JVG9rZW4udExQQVJFTikgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBsb29rIGZvciBsaXN0cyBsaWtlIGEsYixjCi0gICAgICAgIGJvb2xlYW4gY29tbWFOZXh0ID0gZmFsc2U7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICB3aGlsZSh0b2tlbl8hPW51bGwpIHsKLSAgICAgICAgICAgaWYgKGNvbW1hTmV4dCkgewotICAgICAgICAgICAgICAgaWYgKHRva2VuXy5nZXRUeXBlKCkhPUlUb2tlbi50Q09NTUEpICAgYnJlYWs7IAotICAgICAgICAgICAgICAgZWxzZSAgeyBjb21tYU5leHQ9ZmFsc2U7ICBuZXh0VG9rZW4oKTsgY29udGludWU7IH0KLSAgICAgICAgICAgfQotICAgICAgICAgICAvLyB3aGF0ZXZlciBpdCBpcywgYWRkIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgIGwuYWRkKHRva2VuXyk7Ci0gICAgICAgICAgIGNvbW1hTmV4dD10cnVlOwotICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgdGhlIGxpc3QKLSAgICAgICAgT3Blbk1QVG9rZW4gW10gb21wbCA9IG5ldyBPcGVuTVBUb2tlbltsLnNpemUoKV07Ci0gICAgICAgIGludCBjb3VudD0wOwotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGwuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvbXBsW2NvdW50KytdID0gKE9wZW5NUFRva2VuKWkubmV4dCgpOwotICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGluIGRpY3Rpb25hcnkKLSAgICAgICAgICAgIFN5bWJvbCBbXSBzeW1ib2xzID0gZGljdGlvbmFyeV8uZ2V0U3ltYm9sc0ZvcihvbXBsW2NvdW50LTFdLmdldEltYWdlKCkpOwotICAgICAgICAgICAgaWYgKHN5bWJvbHMubGVuZ3RoPT0wKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUHJvYmxlbSgiVW5kZWZpbmVkIHN5bWJvbCAnIitvbXBsW2NvdW50LTFdLmdldEltYWdlKCkrIiciLCBPcGVuTVBFcnJvci5FUlJPUik7ICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGF0IGxlYXN0IG9uZSAobm9uLWdsb2JhbCB0aGF0IGlzIGluIHNhbWUgc2NvcGUgYXMgcHJhZ21hCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZD1mYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGo9MDsgajxzeW1ib2xzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElBU1ROb2RlIGZjdG4gPSBzeW1ib2xzW2pdLmdldERlZmluaW5nRnVuY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZjdG49PW51bGwgfHwgIShmY3RuIGluc3RhbmNlb2YgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbikpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeW1ib2xSZWxldmFudChzeW1ib2xzW2pdKSkgeyBmb3VuZD10cnVlOyBicmVhazsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKCJTeW1ib2wgb3V0IG9mIHNjb3BlOiAnIitvbXBsW2NvdW50LTFdLmdldEltYWdlKCkrIiciLCBPcGVuTVBFcnJvci5FUlJPUik7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBydWxlOiBhbHdheXMgbGVhdmUgb25lIGFoZWFkCi0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9tcGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlZSBpZiBzeW1ib2wgaXMgYSBsb2NhbCB2YXJpYWJsZSBpbiBzY29wZSB0byBwcmFnbWEKLSAgICAgKiBAcGFyYW0gc3ltYm9sIC0gU3ltYm9sCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW1ib2xSZWxldmFudChTeW1ib2wgc3ltYm9sKQotICAgIHsgICAKLSAgICAJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlN5bWJvbDogIitzeW1ib2wuZ2V0TmFtZSgpKyIgIFBBU1RPTVBGYWN0b3J5LmlzU3ltYm9sUmVsZXZhbnQoKSIpOwotICAgICAgICBJQVNUTm9kZSBub2RlID0gbnVsbDsKLSAgICAgICAgSUFTVE5vZGUgcGFyZW50LGdwPW51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBub2RlPXN5bWJvbC5nZXRTY29wZSgpLmdldFBoeXNpY2FsTm9kZSgpOyAvLyBubyBsb25nZXIgaW4gQ0RUIDQuMAotCQkJLy8gQlJUIHJlcGxhY2VtZW50IGZvciBnZXRQaHlzaWNhbE5vZGUoKSBmb3IgQ0RUIDQuMAotCQkJLy8gVGhlIGZvbGxvd2luZyBwcm9iYWJseSBpc24ndCBhbiBpZGVhbCBzb2x1dGlvbiAodXNpbmcgRGlzY291cmFnZWQgYWNjZXNzIG1ldGhvZHMpCi0JCQkvLyBidXQgc2VlbXMgdG8gd29yayBmb3Igbm93LiAKLQkJCS8vIGFsdGVybmF0aXZlbHkgSSB0cmllZCBpbXBsZW1lbnRpbmc6IHN5bWJvbC5nZXRQaHlzaWNhbE5vZGUoKSBidXQgY291bGQgbm90IGdldCB0aGUgc2FtZSBhbnN3ZXIgZnJvbSB0aGVyZS4KLQkJCQotCQkJSVNjb3BlIHNjb3BlPXN5bWJvbC5nZXRTY29wZSgpOwotCQkJLy8gc2VlOiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL21ob25hcmMvbGlzdHMvY2R0LWRldi9tc2cwODY1My5odG1sCi0JCQkvLyBBbm90aGVyIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIGNhc3QgdG8gQ1Njb3BlIGFuZCBkbyBjU2NvcGUuZ2V0UGh5c2ljYWxOb2RlKCkgZnJvbSB0aGVyZS4KLQkJCW5vZGUgPSBBU1RJbnRlcm5hbC5nZXRQaHlzaWNhbE5vZGVPZlNjb3BlKHNjb3BlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0gICAgICAgIAotICAgICAgICBVdGlsaXR5LkxvY2F0aW9uIGwgPSBVdGlsaXR5LmdldExvY2F0aW9uKG5vZGUpOwotICAgICAgICBpbnQgbm9kZU9mZnNldCA9IChsIT1udWxsID8gbC5nZXRMb3coKSAgOiAwKTsgICAgIC8vNzI4Ci0gICAgICAgIGludCBub2RlRW5kc2V0ID0gKGwhPW51bGwgPyBsLmdldEhpZ2goKSA6IDApOyAgICAgICAvLzc0NQotICAgICAgICBpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigibm9kZTogIitub2RlLmdldFJhd1NpZ25hdHVyZSgpKyIgbm9kZU9mZnNldDogIitub2RlT2Zmc2V0KyIgbm9kZUVuZHNldD0gIitub2RlRW5kc2V0KTsKLSAgICAgICAgCi0gICAgICAgIGludCBwT2Zmc2V0ID0gcHJhZ21hXy5nZXRMb2NhbE9mZnNldCgpOyAgICAgICAgICAgIC8vODIyCi0gICAgICAgIGludCBwRW5kc2V0ID0gcE9mZnNldCtwcmFnbWFfLmdldExlbmd0aCgpLTE7ICAgICAgIC8vODY0Ci0gICAgICAgIGlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCgicHJhZ21hIHBPZmZzZXQ9ICIrcE9mZnNldCsiIHBFbmRzZXQ9ICIrcEVuZHNldCkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiB0ZiA9ICgobm9kZUVuZHNldDxwT2Zmc2V0IHx8IHBFbmRzZXQ8bm9kZU9mZnNldCkgPyBmYWxzZSA6IHRydWUpOyAgLy9mYWxzZQotICAgICAgICBpZiAoIXRmKSAgcmV0dXJuIHRmOwotICAgICAgICAKLSAgICAgICAgLy8gU2VlIGlmIHRoZSBkZWNsYXJhdGlvbiBzdWNjZWVkcyB0aGUgcHJhZ21hCi0gICAgICAgIFV0aWxpdHkuTG9jYXRpb24gZGwgPSBVdGlsaXR5LmdldExvY2F0aW9uKHN5bWJvbC5nZXREZWNsYXJhdG9yKCkpOwotICAgICAgICBpZiAoZGw9PW51bGwpICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJkbC5nZXRMb3coKT0iK2RsLmdldExvdygpKyIgcE9mZnNldD0iK3BPZmZzZXQrCi0gICAgICAgIAkJIiA+IGlzOiAiKyhkbC5nZXRMb3coKT5wT2Zmc2V0KSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKGRsLmdldExvdygpPnBPZmZzZXQgPyBmYWxzZSA6IHRydWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBY3F1aXJlIHRoZSBuZXh0IHRva2VuCi0gICAgICogQHJldHVybiBPcGVuTVBUb2tlbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPcGVuTVBUb2tlbiBuZXh0VG9rZW4oKQotICAgIHsKLSAgICAgICAgLy8gRm9sbG93aW5nIGluIGNhc2Ugb2YgYmFja3VwCi0gICAgICAgIGlmICh0b2tlbl8hPW51bGwgJiYgdG9rZW5fLmdldE5leHQoKSE9bnVsbCkgewotICAgICAgICAgICAgdG9rZW5fID0gdG9rZW5fLmdldE5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiB0b2tlbl87Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoYWluIHRvIGxhc3Qgb25lIGFuZCBtb3ZlIG9uCi0gICAgICAgIE9wZW5NUFRva2VuIHRva2VuID0gc2Nhbm5lcl8ubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmICh0b2tlbl8hPW51bGwpCi0gICAgICAgICAgICB0b2tlbl8uc2V0TmV4dCh0b2tlbik7Ci0gICAgICAgIHRva2VuXyA9IHRva2VuOwotICAgICAgICByZXR1cm4gdG9rZW5fOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgY3VycmVudCB0b2tlbiBzbyBhcyB0byBtYXJrIChpbiBjb2RlKSB3aGVyZSB3ZSB3ZXJlCi0gICAgICogQHJldHVybiBPcGVuTVBUb2tlbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPcGVuTVBUb2tlbiBtYXJrKCkKLSAgICB7Ci0gICAgICAgIGlmICh0b2tlbl89PW51bGwpCi0gICAgICAgICAgICB0b2tlbl8gPSBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIHRva2VuXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzZXQgdG9rZW4gcXVldWUgKG5leHRUb2tlbigpIGdldCBvbmUgYWZ0ZXIgdGhpcyBvbmUpCi0gICAgICogQHBhcmFtIHRva2VuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmFja3VwVG8oT3Blbk1QVG9rZW4gdG9rZW4pCi0gICAgewotICAgICAgICB0b2tlbl8gPSB0b2tlbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgcGFyc2VyCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFRva2VucygpCi0gICAgewotICAgICAgICBPcGVuTVBTY2FubmVyIHNjYW5uZXIgPSBuZXcgT3Blbk1QU2Nhbm5lcihwcmFnbWFfLmdldENvbnRlbnQoKSk7Ci0gICAgICAgIAotICAgICAgICBPcGVuTVBUb2tlbiB0b2tlbiA9IG51bGw7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHRva2VuID0gc2Nhbm5lci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmICh0b2tlbiE9bnVsbCkKLSAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb2tlbjoiK3Rva2VuLmdldEltYWdlKCkrIiB0eXBlPSIrdG9rZW4uZ2V0VHlwZSgpKTsKLSAgICAgICAgIH0gd2hpbGUodG9rZW4hPW51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSB0aGUgcGFyc2luZyBvZiAjcHJhZ21hIG9tcCBwYXJhbGxlbAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBsZXRlUGFyYWxsZWwoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBiU2hhcmVkICAgICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYlByaXZhdGUgICAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJGaXJzdFByaXZhdGUgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiRGVmYXVsdCAgICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYlJlZHVjdGlvbiAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJDb3B5aW4gICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiSWYgICAgICAgICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYk51bXRocmVhZHMgICA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgd2hpbGUodG9rZW5fIT1udWxsKSB7Ci0gICAgICAgICAgICBzd2l0Y2godG9rZW5fLmdldFR5cGUoKSl7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wU2hhcmVkOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJTaGFyZWQpIAotICAgICAgICAgICAgICAgICAgICAgICAgYlNoYXJlZCA9IHNldFNoYXJlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBQcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJQcml2YXRlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJQcml2YXRlID0gc2V0UHJpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBGaXJzdHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkZpcnN0UHJpdmF0ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RQcml2YXRlID0gc2V0Rmlyc3RQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wRGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiRGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJEZWZhdWx0ID0gc2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcFJlZHVjdGlvbjoKLSAgICAgICAgICAgICAgICAgICBpZiAoIWJSZWR1Y3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgIGJSZWR1Y3Rpb24gPSBzZXRSZWR1Y3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcENvcHlpbjoKLSAgICAgICAgICAgICAgICAgICBpZiAoIWJDb3B5aW4pIAotICAgICAgICAgICAgICAgICAgICAgICBiQ29weWluID0gc2V0Q29weWluKCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBJZjoKLSAgICAgICAgICAgICAgICAgICBpZiAoIWJJZikgIAotICAgICAgICAgICAgICAgICAgICAgICBiSWYgPSBzZXRJZigpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wTnVtdGhyZWFkczoKLSAgICAgICAgICAgICAgICAgICBpZiAoIWJOdW10aHJlYWRzKQotICAgICAgICAgICAgICAgICAgICAgICBiTnVtdGhyZWFkcyA9IHNldE51bVRocmVhZHMoKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvYmxlbSgiVW5leHBlY3RlZCB0b2tlbiAiK3Rva2VuXy5nZXRJbWFnZSgpLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgcGFyc2luZyAjcGFyYWdtYSBvbXAgZm9yCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGxldGVGb3IoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBiUHJpdmF0ZSAgICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkZpcnN0UHJpdmF0ZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJMYXN0UHJpdmF0ZSAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiUmVkdWN0aW9uICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYk9yZGVyZWQgICAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJTY2hlZHVsZSAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiTm93YWl0ICAgICAgID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSh0b2tlbl8hPW51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCh0b2tlbl8uZ2V0VHlwZSgpKXsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBQcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJQcml2YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgYlByaXZhdGUgPSBzZXRQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcEZpcnN0cHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmlyc3RQcml2YXRlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdFByaXZhdGUgPSBzZXRGaXJzdFByaXZhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wTGFzdHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkxhc3RQcml2YXRlKSAgCi0gICAgICAgICAgICAgICAgICAgICAgICBiTGFzdFByaXZhdGUgPSBzZXRMYXN0UHJpdmF0ZSgpOyAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wUmVkdWN0aW9uOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZWR1Y3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBiUmVkdWN0aW9uID0gc2V0UmVkdWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBPcmRlcmVkOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJPcmRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXRPcmRlcmVkKHRydWUpOyAgYk9yZGVyZWQ9dHJ1ZTsgfQotICAgICAgICAgICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wU2NoZWR1bGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYlNjaGVkdWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgYlNjaGVkdWxlID0gc2V0U2NoZWR1bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wTm93YWl0OgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJOb3dhaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tcFByYWdtYV8uc2V0Tm9XYWl0KHRydWUpOyAgYk5vd2FpdD10cnVlOyAgfQotICAgICAgICAgICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvYmxlbSgiVW5leHBlY3RlZCB0b2tlbiAiK3Rva2VuXy5nZXRJbWFnZSgpLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSBwYXJzaW5nICNwYXJhZ21hIG9tcCBwYXJhbGxlbCBmb3IKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb21wbGV0ZVBhcmFsbGVsRm9yKCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gYlNoYXJlZCAgICAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJQcml2YXRlICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiRmlyc3RQcml2YXRlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkxhc3RQcml2YXRlICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJEZWZhdWx0ICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiUmVkdWN0aW9uICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkNvcHlpbiAgICAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJJZiAgICAgICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiT3JkZXJlZCAgICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYlNjaGVkdWxlICAgICA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgd2hpbGUodG9rZW5fIT1udWxsKSB7Ci0gICAgICAgICAgICBzd2l0Y2godG9rZW5fLmdldFR5cGUoKSl7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wU2hhcmVkOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJTaGFyZWQpIAotICAgICAgICAgICAgICAgICAgICAgICAgYlNoYXJlZCA9IHNldFNoYXJlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBQcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJQcml2YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgYlByaXZhdGUgPSBzZXRQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcEZpcnN0cHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmlyc3RQcml2YXRlKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdFByaXZhdGUgPSBzZXRGaXJzdFByaXZhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wTGFzdHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkxhc3RQcml2YXRlKSAgCi0gICAgICAgICAgICAgICAgICAgICAgICBiTGFzdFByaXZhdGUgPSBzZXRMYXN0UHJpdmF0ZSgpOyAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wRGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiRGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJEZWZhdWx0ID0gc2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBSZWR1Y3Rpb246Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYlJlZHVjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGJSZWR1Y3Rpb24gPSBzZXRSZWR1Y3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcENvcHlpbjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiQ29weWluKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJDb3B5aW4gPSBzZXRDb3B5aW4oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wSWY6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYklmKSAgCi0gICAgICAgICAgICAgICAgICAgICAgICBiSWYgPSBzZXRJZigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBPcmRlcmVkOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJPcmRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXRPcmRlcmVkKHRydWUpOyAgYk9yZGVyZWQ9dHJ1ZTsgfQotICAgICAgICAgICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wU2NoZWR1bGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYlNjaGVkdWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgYlNjaGVkdWxlID0gc2V0U2NoZWR1bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvYmxlbSgiVW5leHBlY3RlZCB0b2tlbiAiK3Rva2VuXy5nZXRJbWFnZSgpLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSBwYXJzaW5nICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGxldGVQYXJhbGxlbFNlY3Rpb25zKCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gYlNoYXJlZCAgICAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJQcml2YXRlICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiRmlyc3RQcml2YXRlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkxhc3RQcml2YXRlICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJEZWZhdWx0ICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiUmVkdWN0aW9uICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkNvcHlpbiAgICAgICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJJZiAgICAgICAgICAgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlKHRva2VuXyE9bnVsbCkgewotICAgICAgICAgICAgc3dpdGNoKHRva2VuXy5nZXRUeXBlKCkpewotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcFNoYXJlZDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiU2hhcmVkKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTaGFyZWQgPSBzZXRTaGFyZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wUHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiUHJpdmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJQcml2YXRlID0gc2V0UHJpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBGaXJzdHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkZpcnN0UHJpdmF0ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RQcml2YXRlID0gc2V0Rmlyc3RQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcExhc3Rwcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJMYXN0UHJpdmF0ZSkgIAotICAgICAgICAgICAgICAgICAgICAgICAgYkxhc3RQcml2YXRlID0gc2V0TGFzdFByaXZhdGUoKTsgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcERlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkRlZmF1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICBiRGVmYXVsdCA9IHNldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wUmVkdWN0aW9uOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZWR1Y3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBiUmVkdWN0aW9uID0gc2V0UmVkdWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBDb3B5aW46Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkNvcHlpbikgCi0gICAgICAgICAgICAgICAgICAgICAgICBiQ29weWluID0gc2V0Q29weWluKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcElmOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJJZikgIAotICAgICAgICAgICAgICAgICAgICAgICAgYklmID0gc2V0SWYoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvYmxlbSgiVW5leHBlY3RlZCB0b2tlbiAiK3Rva2VuXy5nZXRJbWFnZSgpLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIENvbXBsZXRlIHBhcnNlIG9mICNwcmFnbWEgb21wIHNlY3Rpb25zCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGxldGVTZWN0aW9ucygpCi0gICAgewotICAgICAgICBib29sZWFuIGJQcml2YXRlICAgICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiRmlyc3RQcml2YXRlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkxhc3RQcml2YXRlICA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJSZWR1Y3Rpb24gICAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiTm93YWl0ICAgICAgID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSh0b2tlbl8hPW51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCh0b2tlbl8uZ2V0VHlwZSgpKXsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBQcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJQcml2YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgYlByaXZhdGUgPSBzZXRQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBGaXJzdHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkZpcnN0UHJpdmF0ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RQcml2YXRlID0gc2V0Rmlyc3RQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wTGFzdHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYkxhc3RQcml2YXRlKSAgCi0gICAgICAgICAgICAgICAgICAgICAgICBiTGFzdFByaXZhdGUgPSBzZXRMYXN0UHJpdmF0ZSgpOyAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wUmVkdWN0aW9uOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZWR1Y3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBiUmVkdWN0aW9uID0gc2V0UmVkdWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcE5vd2FpdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiTm93YWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbXBQcmFnbWFfLnNldE5vV2FpdCh0cnVlKTsgIGJOb3dhaXQ9dHJ1ZTsgIH0KLSAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKCJVbmV4cGVjdGVkIHRva2VuICIrdG9rZW5fLmdldEltYWdlKCksIE9wZW5NUEVycm9yLkVSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSBvcHRpb25zIGZvciB0aGUgI3ByYWdtYSBvbXAgc2luZ2xlCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGxldGVTaW5nbGUoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBiUHJpdmF0ZSAgICAgID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYkZpcnN0UHJpdmF0ZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGJDb3B5UHJpdmF0ZSAgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBiTm93YWl0ICAgICAgID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSh0b2tlbl8hPW51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCh0b2tlbl8uZ2V0VHlwZSgpKXsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBQcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJQcml2YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgYlByaXZhdGUgPSBzZXRQcml2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVuTVBTY2FubmVyLm1wRmlyc3Rwcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBpZiAoIWJGaXJzdFByaXZhdGUpIAotICAgICAgICAgICAgICAgICAgICAgICAgYkZpcnN0UHJpdmF0ZSA9IHNldEZpcnN0UHJpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBDb3B5cHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiQ29weVByaXZhdGUpIAotICAgICAgICAgICAgICAgICAgICAgICBiQ29weVByaXZhdGUgPSBzZXRDb3B5UHJpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBOb3dhaXQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYk5vd2FpdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXROb1dhaXQodHJ1ZSk7ICBiTm93YWl0PXRydWU7ICB9Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKCJVbmV4cGVjdGVkIHRva2VuICIrdG9rZW5fLmdldEltYWdlKCksIE9wZW5NUEVycm9yLkVSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSB0aGUgb3B0aW9ucyBmb3IgdGhlICNwcmFnbWEgb21wIGZsdXNoCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGxldGVGbHVzaCgpCi0gICAgewotICAgICAgICBpZiAodG9rZW5fPT1udWxsIHx8IHRva2VuXy5nZXRUeXBlKCkhPUlUb2tlbi50TFBBUkVOKSAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgT3Blbk1QVG9rZW4gW10gICBsaXN0ID0gZ2V0SWRlbnRpZmllckxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIG9tcFByYWdtYV8uc2V0UHJpdmF0ZUxpc3QobGlzdCk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIG9wdGlvbnMgZm9yIHRoZSAjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGxldGVUaHJlYWRQcml2YXRlKCkKLSAgICB7Ci0gICAgICAgIGlmICh0b2tlbl89PW51bGwgfHwgdG9rZW5fLmdldFR5cGUoKSE9SVRva2VuLnRMUEFSRU4pICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBPcGVuTVBUb2tlbiBbXSAgIGxpc3QgPSBnZXRJZGVudGlmaWVyTGlzdCgpOwotICAgICAgICAKLSAgICAgICAgb21wUHJhZ21hXy5zZXRUaHJlYWRQcml2YXRlTGlzdChsaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJhbnNsYXRlIHRoZSB0eXBlIG9mIHJlZHVjdGlvbiBvcGVyYXRvCi0gICAgICogQHJldHVybiBpbnQgKHRoYXQgUEFTVE9NUFByYWdtYSB1bmRlcnN0YW5kcykKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRSZWR1Y3Rpb25PcGVyYXRvcigpCi0gICAgewotICAgICAgICBzd2l0Y2godG9rZW5fLmdldFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBJVG9rZW4udFBMVVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wT3BQbHVzOwotICAgICAgICAgICAgY2FzZSBJVG9rZW4udFNUQVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wT3BNdWx0OwotICAgICAgICAgICAgY2FzZSBJVG9rZW4udE1JTlVTOgotICAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcE9wTWludXM7Ci0gICAgICAgICAgICBjYXNlIElUb2tlbi50QU1QRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wT3BCQW5kOwotICAgICAgICAgICAgY2FzZSBJVG9rZW4udFhPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBPcEJYb3I7Ci0gICAgICAgICAgICBjYXNlIElUb2tlbi50QklUT1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wT3BCT3I7Ci0gICAgICAgICAgICBjYXNlIElUb2tlbi50QU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcE9wTEFuZDsKLSAgICAgICAgICAgIGNhc2UgSVRva2VuLnRPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBPcExPcjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wT3BVbmtub3duOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZSB0aGUga2luZCBvZiBzY2hlZHVsZQotICAgICAqIEByZXR1cm4gaW50ICh0aGF0IFBBU1RPTVBQcmFnbWEgdW5kZXJzdGFuZHMpCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2NoZWR1bGVLaW5kKCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCh0b2tlbl8uZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBTdGF0aWM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wU0tTdGF0aWM7Ci0gICAgICAgICAgICBjYXNlIE9wZW5NUFNjYW5uZXIubXBEeW5hbWljOgotICAgICAgICAgICAgICAgIHJldHVybiBQQVNUT01QUHJhZ21hLk9tcFNLRHluYW1pYzsKLSAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcEd1aWRlZDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBTS0d1aWRlZDsKLSAgICAgICAgICAgIGNhc2UgT3Blbk1QU2Nhbm5lci5tcFJ1bnRpbWU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBU1RPTVBQcmFnbWEuT21wU0tSdW50aW1lOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFTVE9NUFByYWdtYS5PbXBTS1Vua25vd247Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzY2hlZHVsZSBleHByZXNzaW9uCi0gICAgICogQHJldHVybiBPcGVuTVBUb2tlbiBbXQotICAgICAqLwotICAgIHByaXZhdGUgT3Blbk1QVG9rZW4gW10gZ2V0RXhwcmVzc2lvbigpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGwgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICBpbnQgICAgICAgIHBhcmVuQ3Q9MTsKLSAgICAgICAgCi0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICB3aGlsZSh0b2tlbl8hPW51bGwpIHsKLSAgICAgICAgICAgIGlmICh0b2tlbl8uZ2V0VHlwZSgpPT1JVG9rZW4udFJQQVJFTil7Ci0gICAgICAgICAgICAgICAgcGFyZW5DdC0tOyAgaWYgKHBhcmVuQ3Q9PTApICBicmVhazsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge2wuYWRkKHRva2VuXyk7IH0gIC8vIGVuZCBvZiBzY2hlZHVsZSBjbGF1c2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuXy5nZXRUeXBlKCk9PUlUb2tlbi50Q09NTUEpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW5DdD09MSkgIGJyZWFrOyBlbHNlIGwuYWRkKHRva2VuXyk7ICAgICAgICAgICAgICAgLy8gYW5vdGhlciB3YXkgdG8gZXhpdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5fLmdldFR5cGUoKT09SVRva2VuLnRMUEFSRU4pIAotICAgICAgICAgICAgeyBwYXJlbkN0Kys7ICBsLmFkZCh0b2tlbl8pOyAgfQotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBsLmFkZCh0b2tlbl8pOwotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9wZW5NUFRva2VuIFtdIGxpc3QgPSBuZXcgT3Blbk1QVG9rZW5bbC5zaXplKCldOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxsLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgbGlzdFtpXSA9IChPcGVuTVBUb2tlbilsLmdldChpKTsKLSAgICAgICAgCi0gICAgICAgIG5leHRUb2tlbigpOyAgIC8vIG1vdmUgYWhlYWQKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRJZigpCi0gICAgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgT3Blbk1QVG9rZW4gW10gbGlzdCA9IGdldEV4cHJlc3Npb24oKTsKLSAgICAgICAgb21wUHJhZ21hXy5zZXRJZkV4cHJlc3Npb24obGlzdCk7IAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFByaXZhdGUoKQotICAgIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIE9wZW5NUFRva2VuIFtdIGxpc3QgPSBnZXRJZGVudGlmaWVyTGlzdCgpOwotICAgICAgICBvbXBQcmFnbWFfLnNldFByaXZhdGVMaXN0KGxpc3QpOyAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRGaXJzdFByaXZhdGUoKQotICAgIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIE9wZW5NUFRva2VuIFtdIGxpc3QgPSBnZXRJZGVudGlmaWVyTGlzdCgpOwotICAgICAgICBvbXBQcmFnbWFfLnNldEZpcnN0UHJpdmF0ZUxpc3QobGlzdCk7IAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldExhc3RQcml2YXRlKCkKLSAgICB7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICBPcGVuTVBUb2tlbiBbXSBsaXN0ID0gZ2V0SWRlbnRpZmllckxpc3QoKTsKLSAgICAgICAgb21wUHJhZ21hXy5zZXRMYXN0UHJpdmF0ZUxpc3QobGlzdCk7IAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0U2hhcmVkKCkKLSAgICB7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICBPcGVuTVBUb2tlbiBbXSBsaXN0ID0gZ2V0SWRlbnRpZmllckxpc3QoKTsKLSAgICAgICAgb21wUHJhZ21hXy5zZXRTaGFyZWRMaXN0KGxpc3QpOyAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRDb3B5aW4oKQotICAgIHsKLSAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICBPcGVuTVBUb2tlbiBbXSBsaXN0ID0gZ2V0SWRlbnRpZmllckxpc3QoKTsKLSAgICAgICBvbXBQcmFnbWFfLnNldENvcHlpbkxpc3QobGlzdCk7IAotICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0Q29weVByaXZhdGUoKQotICAgIHsKLSAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICBPcGVuTVBUb2tlbiBbXSBsaXN0ID0gZ2V0SWRlbnRpZmllckxpc3QoKTsKLSAgICAgICBvbXBQcmFnbWFfLnNldENvcHlQcml2YXRlTGlzdChsaXN0KTsgCi0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldERlZmF1bHQoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBzaGFyZWQgPSBmYWxzZTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIGlmICh0b2tlbl8uZ2V0VHlwZSgpPT1JVG9rZW4udExQQVJFTikgewotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAodG9rZW5fLmdldFR5cGUoKT09T3Blbk1QU2Nhbm5lci5tcFNoYXJlZCkgICAgc2hhcmVkPXRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0b2tlbl8uZ2V0VHlwZSgpPT1PcGVuTVBTY2FubmVyLm1wTm9uZSkgc2hhcmVkPWZhbHNlOwotICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBuZXh0VG9rZW4oKTsgIC8vIGdldCB0aGUgcGFyZW4KLSAgICAgICAgICAgIGlmICh0b2tlbl89PW51bGwgfHwgdG9rZW5fLmdldFR5cGUoKSE9SVRva2VuLnRSUEFSRU4pICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBvbXBQcmFnbWFfLnNldERlZmF1bHQoc2hhcmVkID8gUEFTVE9NUFByYWdtYS5PbXBTaGFyZWQgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVNUT01QUHJhZ21hLk9tcE5vbmUpOwotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRSZWR1Y3Rpb24oKQotICAgIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIGlmICh0b2tlbl8uZ2V0VHlwZSgpPT1JVG9rZW4udExQQVJFTikgewotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpbnQgcm8gPSBnZXRSZWR1Y3Rpb25PcGVyYXRvcigpOwotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAodG9rZW5fIT1udWxsICYmIHRva2VuXy5nZXRUeXBlKCk9PUlUb2tlbi50Q09MT04pIHsKLSAgICAgICAgICAgICAgICBPcGVuTVBUb2tlbiBbXSBybGlzdCA9IGdldElkZW50aWZpZXJMaXN0KCk7Ci0gICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXRSZWR1Y3Rpb25PcGVyYXRvcihybyk7Ci0gICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXRSZWR1Y3Rpb25MaXN0KHJsaXN0KTsgIAotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE51bVRocmVhZHMoKQotICAgIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIGlmICh0b2tlbl8uZ2V0VHlwZSgpPT1JVG9rZW4udExQQVJFTikgewotICAgICAgICAgICAgT3Blbk1QVG9rZW4gW10gZXhwciA9IGdldEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIGlmICh0b2tlbl89PW51bGwgfHwgdG9rZW5fLmdldFR5cGUoKSE9SVRva2VuLnRSUEFSRU4pIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIG9tcFByYWdtYV8uc2V0TnVtVGhyZWFkc0V4cHIoZXhwcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRTY2hlZHVsZSgpCi0gICAgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKHRva2VuXy5nZXRUeXBlKCk9PUlUb2tlbi50TFBBUkVOKSB7Ci0gICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGludCBraW5kID0gZ2V0U2NoZWR1bGVLaW5kKCk7Ci0gICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmICh0b2tlbl8hPW51bGwgJiYgdG9rZW5fLmdldFR5cGUoKT09SVRva2VuLnRDT01NQSkgewotICAgICAgICAgICAgICAgIE9wZW5NUFRva2VuIFtdIGV4cHIgPSBnZXRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXRTY2hlZHVsZUtpbmQoa2luZCk7Ci0gICAgICAgICAgICAgICAgb21wUHJhZ21hXy5zZXRDaHVua0V4cHJlc3Npb24oZXhwcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvLyBXZSBhcmUgcHJlc2VudGx5IHVuc3VyZSBvZiB3aGF0IHRvIGRvIHdpdGggYWxsIHRoZSBmb2xsb3dpbmcgc3R1ZmY6Ci0vLyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNjYW5uZXJQcm9ibGVtRmFjdG9yeSBzcGYgPSBuZXcgU2Nhbm5lclByb2JsZW1GYWN0b3J5KCk7Ci0vLyAgICBwcm90ZWN0ZWQgU2Nhbm5lckNhbGxiYWNrTWFuYWdlciBjYWxsYmFja01hbmFnZXI7Ci0vLyAgICBwcm90ZWN0ZWQgc3RhdGljIGNoYXJbXSBFTVBUWV9DSEFSX0FSUkFZID0gbmV3IGNoYXJbMF07Ci0vLyAgICAKLS8vICAgIHByb3RlY3RlZCB2b2lkIG90aGVyaW5pdChJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IpCi0vLyAgICB7Ci0vLyAgICAgICAgY2FsbGJhY2tNYW5hZ2VyID0gbmV3IFNjYW5uZXJDYWxsYmFja01hbmFnZXIobmV3IE51bGxTb3VyY2VFbGVtZW50UmVxdWVzdG9yKCkpOwotLy8gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGhhbmRsZVByb2JsZW0KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBTdHJpbmcKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgICAgLSBpbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9ibGVtKFN0cmluZyAgZGVzY3JpcHRpb24sIGludCBzZXZlcml0eSkKLSAgICB7Ci0gICAgICAgIE9wZW5NUEVycm9yIGVycm9yID0gbmV3IE9wZW5NUEVycm9yKGRlc2NyaXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJhZ21hXy5nZXRDb250YWluaW5nRmlsZW5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJhZ21hXy5nZXRTdGFydGluZ0xpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHkpOwotICAgICAgICBPcGVuTVBFcnJvck1hbmFnZXIuZ2V0Q3VycmVudEVycm9yTWFuYWdlcigpLmFkZEVycm9yKGVycm9yKTsKLSAgICAgICAgb21wUHJhZ21hXy5hZGRQcm9ibGVtKGVycm9yKTsgIC8vIHdlIHJlYWxseSBkb24ndCBuZWVkIHRoaXMsIGJ1dCBtYXkgYmUgdXNlZnVsIGxhdGVyCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGxGaW5kIHRoZSBhc3NvY2lhdGVkIHJlZ2lvbiB0byB0aGUgY3VycmVudCBwcmFnbWEKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2NhdGVSZWdpb24oKQotICAgIHsKLSAgICAgICAgaWYgKG9tcFByYWdtYV89PW51bGwpICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKG9tcFByYWdtYV8uZ2V0T01QVHlwZSgpKSB7Ci0gICAgICAgICAgICAvLyBmb2xsb3dlZCBieSBzdHJ1Y3R1cmVkIHJlZ2lvbgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsOgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFNlY3Rpb25zOgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFNlY3Rpb246Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxTZWN0aW9uczoKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBTaW5nbGU6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wTWFzdGVyOgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcENyaXRpY2FsOgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcE9yZGVyZWQ6Ci0gICAgICAgICAgICAgICAgZGV0ZXJtaW5lUmVnaW9uKFNUUlVDVFVSRURfQkxPQ0ssIG9tcFByYWdtYV8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTXVzdCBiZSBmb2xsb3dlZCBieSBGT1IKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBGb3I6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxGb3I6Ci0gICAgICAgICAgICAgICAgZGV0ZXJtaW5lUmVnaW9uKEZPUl9CTE9DSywgb21wUHJhZ21hXyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFN0YW5kcyBhbG9uZQotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcEJhcnJpZXI6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wRmx1c2g6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wVGhyZWFkUHJpdmF0ZToKLSAgICAgICAgICAgICAgICBkZXRlcm1pbmVSZWdpb24oTE9DQVRJT05fT05MWSwgb21wUHJhZ21hXyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZvbGxvd2VkIGJ5IGV4cHJlc3Npb24KLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBBdG9taWM6Ci0gICAgICAgICAgICAgICAgZGV0ZXJtaW5lUmVnaW9uKEVYUFJFU1NJT05fQkxPQ0ssIG9tcFByYWdtYV8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFVua25vd246Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSVUNUVVJFRF9CTE9DSyAgID0gUmVnaW9uRGV0ZXJtaW5hdGlvblZpc2l0b3IuU1RSVUNUVVJFRF9CTE9DSzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JfQkxPQ0sgICAgICAgICAgPSBSZWdpb25EZXRlcm1pbmF0aW9uVmlzaXRvci5GT1JfQkxPQ0s7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQUkVTU0lPTl9CTE9DSyAgID0gUmVnaW9uRGV0ZXJtaW5hdGlvblZpc2l0b3IuRVhQUkVTU0lPTl9CTE9DSzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBVElPTl9PTkxZICAgICAgPSBSZWdpb25EZXRlcm1pbmF0aW9uVmlzaXRvci5MT0NBVElPTl9PTkxZOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZSB0aGF0IGNvZGUgcmVnaW9uIGFmZmlsYXRlZCB3aXRoIGEgcHJhZ21hICYgdGhlIHBlZXIgbm9kZQotICAgICAqIEBwYXJhbSB0eXBlIC0gaW50IChzZWUgY29uc3RhdG5zIGFib3ZlKQotICAgICAqIEBwYXJhbSBvbXBQcmFnbWEgLSBQQVNUT01QUHJhZ21hCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGV0ZXJtaW5lUmVnaW9uKGludCB0eXBlLCBQQVNUT01QUHJhZ21hIG9tcFByYWdtYSkKLSAgICB7Ci0gICAgICAgIFJlZ2lvbkRldGVybWluYXRpb25WaXNpdG9yIHJkdiA9IG5ldyBSZWdpb25EZXRlcm1pbmF0aW9uVmlzaXRvcih0eXBlLCBvbXBQcmFnbWEpOwotICAgICAgICBhc3RfLmFjY2VwdChyZHYpOwotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgcmVnaW9uIGZvciBzdHJ1Y3R1cmVkIGJsb2NrIGlzIGEgY29tcG91bmQgc3RhdGVtZW50Ci0gICAgICAgIGlmICh0eXBlPT1TVFJVQ1RVUkVEX0JMT0NLKSB7Ci0gICAgICAgICAgICBJQVNUTm9kZSByZWdpb24gPSBvbXBQcmFnbWEuZ2V0UmVnaW9uKCk7Ci0gICAgICAgICAgICBpZiAocmVnaW9uPT1udWxsIHx8ICEocmVnaW9uIGluc3RhbmNlb2YgSUFTVENvbXBvdW5kU3RhdGVtZW50KSkKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKCJQcmFnbWEgZXhwZWN0cyBzdHJ1Y3R1cmVkIGJsb2NrIHRvIGZvbGxvdyBpdCIsIE9wZW5NUEVycm9yLkVSUk9SKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0eXBlPT1GT1JfQkxPQ0spIHsKLSAgICAgICAgICAgIElBU1ROb2RlIHJlZ2lvbiA9IG9tcFByYWdtYS5nZXRSZWdpb24oKTsKLSAgICAgICAgICAgIGlmIChyZWdpb249PW51bGwgfHwgIShyZWdpb24gaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KSkKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKCJQcmFnbWEgZXhwZWN0cyBmb3IgbG9vcCB0byBmb2xsb3cgaXQiLCBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAKLSAgICAvKioKLSAgICAgKiBSZWdpb25EZXRlcm1pbmF0aW9uVmlzaXRvciBpcyB1c2VkIHRvIHRyYXZlcnNlIEFTVCB0byBmaW5kIHJlZ2lvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBSZWdpb25EZXRlcm1pbmF0aW9uVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgICAgICAgICAgIHNlYXJjaFR5cGVfICAgICAgICA9IFNUUlVDVFVSRURfQkxPQ0s7Ci0gICAgICAgIHByb3RlY3RlZCBQQVNUT01QUHJhZ21hIG9QcmFnbWFfICAgICAgICAgICA9IG51bGw7IAotICAgICAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgICBwcmFnbWFMaW5lXyAgICAgICAgPSAwOwotICAgICAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgICBwcmFnbWFMb2NhdGlvbl8gICAgPSAwOwotICAgICAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgICBwcmFnbWFMZW5ndGhfICAgICAgPSAwOwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgY2xvc2VuZXNzXyAgICAgICAgID0gLTE7Ci0gICAgICAgIAotICAgICAgICAvLyBmb3Igc3RhdGVtZW50IGxvY2F0aW9uCi0gICAgICAgIC8vcHJvdGVjdGVkIElBU1RTdGF0ZW1lbnQgbGFzdFN0YXRlbWVudF8gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RSVUNUVVJFRF9CTE9DSyAgID0gMDsKLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRk9SX0JMT0NLICAgICAgICAgID0gMTsKLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVhQUkVTU0lPTl9CTE9DSyAgID0gMjsKLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTE9DQVRJT05fT05MWSAgICAgID0gMzsgIC8vIHRlbGwgbWUgd2hhdCBpbW1lZGlhdGVseSBwcmVjZWRlcwotICAgICAgICAKLSAgICAgICAgcHVibGljIFJlZ2lvbkRldGVybWluYXRpb25WaXNpdG9yKGludCB0eXBlLCBQQVNUT01QUHJhZ21hIG9tcFByYWdtYSkKLSAgICAgICAgewotICAgICAgICAgICAgc2VhcmNoVHlwZV8gPSB0eXBlOyAKLSAgICAgICAgICAgIHN3aXRjaChzZWFyY2hUeXBlXykgewotICAgICAgICAgICAgICAgIGNhc2UgU1RSVUNUVVJFRF9CTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1JfQkxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFWFBSRVNTSU9OX0JMT0NLOgotICAgICAgICAgICAgICAgICAgICBzaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOyAgICAvLyB3ZSB3YW50IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTE9DQVRJT05fT05MWToKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9QcmFnbWFfICAgICAgICA9IG9tcFByYWdtYTsKLSAgICAgICAgICAgIHByYWdtYUxpbmVfICAgICA9IG9QcmFnbWFfLmdldFN0YXJ0aW5nTGluZSgpOwotICAgICAgICAgICAgcHJhZ21hTG9jYXRpb25fID0gb1ByYWdtYV8uZ2V0T2Zmc2V0KCk7IC8vb1ByYWdtYV8uZ2V0U3RhcnRMb2NhdGlvbigpOwotICAgICAgICAgICAgcHJhZ21hTGVuZ3RoXyAgID0gb1ByYWdtYV8uZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBvdmVycmlkZSBmdW5jdGlvbiB0byB2aXNpdCBzdGF0ZW1lbnRzIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqICAgICAgICAgTk9URTogUmVnaW9uIGlzIGZpcnN0IHN0YXRlbWVudCBmb2xsb3dpbmcgcHJhZ21hCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc3RhdGVtZW50IC0gSUFTVFN0YXRlbWVudAotICAgICAgICAgKiBAcmV0dXJuIGludAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0YXRlbWVudCkgewotICAgICAgICAgICAgQVNUTm9kZSBub2RlID0gKHN0YXRlbWVudCBpbnN0YW5jZW9mIEFTVE5vZGUgPyAoQVNUTm9kZSlzdGF0ZW1lbnQgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChub2RlPT1udWxsKSAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgbm9kZSBpcyBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZSBwcmFnbWEKLSAgICAgICAgICAgIGlmIChub2RlLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpLmVxdWFscyhvUHJhZ21hXy5nZXRGaWxlTG9jYXRpb24oKS5nZXRGaWxlTmFtZSgpKSkgewotICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHRvdGFsT2Zmc2V0ID0gbm9kZS5nZXRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgVXRpbGl0eS5Mb2NhdGlvbiBsb2MgPSBVdGlsaXR5LmdldExvY2F0aW9uKG5vZGUpOwotICAgICAgICAgICAgICBhc3NlcnQobG9jIT1udWxsKTsKLSAgICAgICAgICAgICAgaW50IGxvY2FsT2Zmc2V0ID0gbG9jLmdldExvdygpOyAgLy8gdGhpcyBpcyB0aGUgb2Zmc2V0IGxvY2FsIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgIGludCBsZW5ndGggICAgICA9IGxvYy5nZXRIaWdoKCktbG9jLmdldExvdygpKzE7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBXZSBsb29rIGF0IGFsbCBub2RlcyB0aGF0IG9jY3VyIGJlZm9yZSB0aGUgcHJhZ21hIC0gMiBjYXNlcwotICAgICAgICAgICAgICAvLyAxKSBpZiB0aGUgbm9kZSBzY29wZSBlbmNvbXBhc2VzIHRoZSBwcmFnYW0sIHByYWdtYSBpcyBhIGNoaWxkIG9mIG5vZGUKLSAgICAgICAgICAgICAgLy8gMikgb3RoZXJ3aXNlIHdlIGNhbGwgaXQgYSBwZWVyIChldmVuIHdoZW4gaXQgaXNuJ3QpCi0gICAgICAgICAgICAgIC8vIENvcnJlY3Rpb25zIG9jY3VyIGJ5IGNvbnRpbnVpbmcgZm9yIHRoZSB0aWdodGVzdCBmaXQKLSAgICAgICAgICAgICAgaWYgKHRvdGFsT2Zmc2V0PHByYWdtYUxvY2F0aW9uXykgewotICAgICAgICAgICAgICAgICAgaWYgKHByYWdtYUxvY2F0aW9uXytwcmFnbWFMZW5ndGhfPHRvdGFsT2Zmc2V0K2xlbmd0aCkgeyAvLyBlbmNvbXBhc3NpbmcKLSAgICAgICAgICAgICAgICAgICAgICBvUHJhZ21hXy5zZXRMb2NhdGlvbihzdGF0ZW1lbnQsIFBBU1RPTVBQcmFnbWEuQ2hpbGRQcm94aW1pdHkpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsT2Zmc2V0K2xlbmd0aDxwcmFnbWFMb2NhdGlvbl8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbG9zZW5lc3MgPSBwcmFnbWFMb2NhdGlvbl8tKHRvdGFsT2Zmc2V0K2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2VuZXNzXz09LTEgfHwgY2xvc2VuZXNzPGNsb3NlbmVzc18pICAgeyAgLy8gZ2V0IGNsb3Nlc3Qgc3RhdGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9QcmFnbWFfLnNldExvY2F0aW9uKHN0YXRlbWVudCwgUEFTVE9NUFByYWdtYS5OZWlnaGJvclByb3hpbWl0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlbmVzc18gPSBjbG9zZW5lc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgLy8ga2VlcCBnb2luZyB0byBmaW5kIHRpZ2h0ZXN0IGZpdAotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgcHJhZ21hIC0gaWYgc28sIGNvdWxkIGJlIG91ciByZWdpb24KLSAgICAgICAgICAgICAgaWYgKHRvdGFsT2Zmc2V0PnByYWdtYUxvY2F0aW9uXykgewotICAgICAgICAgICAgICAgIGlmIChzZWFyY2hUeXBlXyE9TE9DQVRJT05fT05MWSkgewotICAgICAgICAgICAgICAgICAgLy8gV2l0aCB0aGlzIHdlIGdvdCB0byB0aGUgbmV4dCBzdG10OgotICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFR5cGVfPT1GT1JfQkxPQ0sgJiYgIShzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19BQk9SVDsgIC8vIGVycm9yIGhhbmRsZWQgaW4gZGV0ZXJtaW5lUmVnaW9uCi0gICAgICAgICAgICAgICAgICAvLyBTZXQgcmVnaW9uIGluZm9ybWF0aW9uIChyZWYuIE9wZW5NUEFydGlmYWN0VmlldyB0byBzZWUgaG93IHVzZWQpCi0gICAgICAgICAgICAgICAgICBvUHJhZ21hXy5zZXRSZWdpb25GaWxlbmFtZShub2RlLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpKTsgCi0gICAgICAgICAgICAgICAgICBvUHJhZ21hXy5zZXRSZWdpb25MZW5ndGgobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgIG9QcmFnbWFfLnNldFJlZ2lvbk9mZnNldChsb2NhbE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICBvUHJhZ21hXy5zZXRSZWdpb24oc3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICAgIGlmICh0cmFjZU9uXykKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChzZWFyY2hUeXBlXz09Rk9SX0JMT0NLID8gIihmb3IpIiA6ICIocmVnaW9uKSIpICsgInByYWdtYSBhdCAiKyBwcmFnbWFMb2NhdGlvbl8rCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyBzdGF0ZW1lbnQgYXQgIisgbG9jYWxPZmZzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19BQk9SVDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RPTVBQcmFnbWEuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvUEFTVC9QQVNUT01QUHJhZ21hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOTgwMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RPTVBQcmFnbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNUOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvclByYWdtYVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5wYXJzZXIuT3Blbk1QVG9rZW47Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUEFTVE9NUFByYWdtYSBleHRlbmRzIFBBU1RQcmFnbWEKLXsKLSAgICBwcm90ZWN0ZWQgaW50IG9tcFR5cGVfID0gT21wVW5rbm93bjsKLSAgICAKLSAgICAvLyBPbXBQYXJhbGxlbCwgT21wUGFyYWxsZWxGb3IsIE9tcFBhcmFsbGVsU2VjdGlvbnMKLSAgICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gW10gc2hhcmVkTGlzdF8gICAgICAgID0gbnVsbDsKLSAgICAvLyBPbXBQYXJhbGxlbCwgT21wRm9yLCBPbXBTZWN0aW9ucywgT21wU2luZ2xlLCBPbXBQYXJhbGxlbEZvciwgT21wUGFyYWxsZWxTZWN0aW9ucwotICAgIHByb3RlY3RlZCBPcGVuTVBUb2tlbiBbXSBwcml2YXRlTGlzdF8gICAgICAgPSBudWxsOwotICAgIC8vIE9tcFBhcmFsbGVsLCBPbXBGb3IsIE9tcFNlY3Rpb25zLCBPbXBTaW5nbGUsIE9tcFBhcmFsbGVsRm9yLCBPbXBQYXJhbGxlbFNlY3Rpb25zCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIFtdIGZpcnN0UHJpdmF0ZUxpc3RfICA9IG51bGw7Ci0gICAgLy8gT21wRm9yLCBPbXBTZWN0aW9ucywgT21wUGFyYWxsZWxGb3IsIE9tcFBhcmFsbGVsU2VjdGlvbnMKLSAgICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gW10gbGFzdFByaXZhdGVMaXN0XyAgID0gbnVsbDsKLSAgICAvLyBPbXBQYXJhbGxlbCwgT21wUGFyYWxsZWxGb3IsIE9tcFBhcmFsbGVsU2VjdGlvbnMKLSAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgICAgZGVmYXVsdF8gICAgICAgICAgID0gT21wU2hhcmVkOyAgLy8gb3IgT21wTm9uZQotICAgIC8vIE9tcFBhcmFsbGVsLCBPbXBGb3IsIE9tcFNlY3Rpb25zLCBPbXBQYXJhbGxlbEZvciwgT21wUGFyYWxsZWxTZWN0aW9ucwotICAgIHByb3RlY3RlZCBpbnQgICAgICAgICAgICByZWR1Y3Rpb25PcGVyYXRvcl8gPSBPbXBPcFVua25vd247Ci0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIFtdIHJlZHVjdGlvbkxpc3RfICAgICA9IG51bGw7Ci0gICAgLy8gT21wUGFyYWxsZWwsIE9tcFBhcmFsbGVsRm9yLCBPbXBQYXJhbGxlbFNlY3Rpb25zCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIFtdIGNvcHlpbkxpc3RfICAgICAgICA9IG51bGw7Ci0gICAgLy8gT21wUGFyYWxsZWwsIE9tcFBhcmFsbGVsRm9yLCBPbXBQYXJhbGxlbFNlY3Rpb25zCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIFtdIGlmRXhwcmVzc2lvbl8gICAgICAgICAgICA9IG51bGw7Ci0gICAgLy8gT21wRm9yLCBPbXBQYXJhbGxlbEZvcgotICAgIHByb3RlY3RlZCBib29sZWFuICAgICAgICBvcmRlcmVkXyAgICAgICAgICAgPSBmYWxzZTsKLSAgICAvLyBPbXBGb3IsIE9tcFBhcmFsbGVsRm9yCi0gICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgIHNjaGVkdWxlS2luZF8gICAgICA9IE9tcFNLVW5rbm93bjsKLSAgICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gW10gY2h1bmtFeHByZXNzaW9uXyAgID0gbnVsbDsKLSAgICAvLyBPbXBGb3IsIE9tcFNlY3Rpb25zLCBPbXBTaW5nbGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgICAgbm93YWl0XyAgICAgICAgICAgID0gZmFsc2U7Ci0KLSAgICAvLyBPbXBUaHJlYWRQcml2YXRlCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIFtdIHRocmVhZFByaXZhdGVMaXN0XyA9IG51bGw7Ci0gICAgLy8gT21wUGFyYWxsZWwKLSAgICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gW10gbnVtVGhyZWFkc0V4cHJfICAgID0gbnVsbDsKLSAgICAvLyBPbXBTaW5nbGUKLSAgICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gW10gY29weVByaXZhdGVMaXN0XyAgID0gbnVsbDsKLSAgICAvLyBPbXBGbHVzaAotICAgIHByb3RlY3RlZCBPcGVuTVBUb2tlbiBbXSBmbHVzaExpc3RfICAgICAgICAgPSBudWxsOwotICAgIC8vIFJlZ2lvbgotICAgIHByb3RlY3RlZCBJQVNUTm9kZSAgICAgIHJlZ2lvbl8gID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgICByZWdpb25GaWxlbmFtZV8gPSBudWxsOwotICAgIHByb3RlY3RlZCBpbnQgICAgICAgICAgIHJlZ2lvbk9mZnNldF8gICA9IDA7ICAgICAvLyBsb2NhbCB0byBmaWxlIChub3QgYWNjdGcgZm9yIGluY2x1ZGVzKQotICAgIHByb3RlY3RlZCBpbnQgICAgICAgICAgIHJlZ2lvbkxlbmd0aF8gICA9IDA7Ci0gICAgLy8gUHJvYmxlbSBsaXN0IGZvciB0aGlzIG9tcCBwcmFnbWEKLSAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCAgICBwcm9ibGVtTGlzdF8gID0gbmV3IExpbmtlZExpc3QoKTsgIC8vIG9mIE9wZW5NUEVycm9yJ3MKLSAgICAKLSAgICBwcm90ZWN0ZWQgSUFTVFN0YXRlbWVudCBsb2NhdGlvbk5vZGVfID0gbnVsbDsgICAvLyBqdXN0IHByZWNlZGluZyBzdG10IC0gaWYgY21wZCBzdG10Ci0gICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgbG9jYXRpb25Qcm94aW1pdHlfID0gTm9Qcm94aW1pdHk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTm9Qcm94aW1pdHkgICAgICAgPSAtMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOZWlnaGJvclByb3hpbWl0eSA9IDA7ICAvLyBjc3QgaW5kaWNhdGluZyBwcmFnbWEgYXQgc2FtZSBsZXZlbCBhbmQgc3VjY2VlZGluZyBwcmFnbWEKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDaGlsZFByb3hpbWl0eSAgICA9IDE7ICAvLyBjc3QgaW5kaWNhdGluZyBwcmFnbWEgaXMgY2hpbGQgb2YgYXN0IG5vZGUKLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcFVua25vd24gID0gLTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wUGFyYWxsZWwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcEZvciAgICAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBTZWN0aW9uICA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wU2VjdGlvbnMgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcFNpbmdsZSAgID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBQYXJhbGxlbEZvciAgICAgID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBQYXJhbGxlbFNlY3Rpb25zID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBNYXN0ZXIgICA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wQ3JpdGljYWwgPSA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcEJhcnJpZXIgID0gOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBBdG9taWMgICA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcEZsdXNoICAgID0gMTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wT3JkZXJlZCAgPSAxMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBUaHJlYWRQcml2YXRlID0gMTM7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wU2hhcmVkICAgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcE5vbmUgICAgID0gMTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBPcFVua25vd24gPSAtMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBPcFBsdXMgICAgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcE9wTXVsdCAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wT3BNaW51cyAgID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBPcEJBbmQgICAgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcE9wQlhvciAgICA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wT3BCT3IgICAgID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBPcExBbmQgICAgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcE9wTE9yICAgICA9IDc7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wU0tVbmtub3duID0gLTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wU0tTdGF0aWMgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbXBTS0R5bmFtaWMgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9tcFNLR3VpZGVkICA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT21wU0tSdW50aW1lID0gMzsKLQkKLSAgICAvKioKLSAgICAgKiBQQVNUT01QUHJhZ21hIC0gY29uc3RydWN0b3IgdXNpbmcgQVNUUHJhZ21hCi0gICAgICogQHBhcmFtIHByYWdtYSAtIEFTVFByYWdtYQotICAgICAqLwotCXB1YmxpYyBQQVNUT01QUHJhZ21hKElBU1RQcmVwcm9jZXNzb3JQcmFnbWFTdGF0ZW1lbnQgcHJhZ21hKQotCXsKLQkJc3VwZXIocHJhZ21hKTsKLQkJLy9wcmFnbWFfID0gcHJhZ21hOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQQVNUT01QUHJhZ21hIC0gY29uc3RydWN0b3IgdXNpbmcgUEFTVFByYWdtYQotICAgICAqIEBwYXJhbSBwcmFnbWEgLSBQQVNUUHJhZ21hCi0gICAgICovCi0gICAgcHVibGljIFBBU1RPTVBQcmFnbWEoUEFTVFByYWdtYSBwcmFnbWEpCi0gICAgewotICAgICAgICBzdXBlcihwcmFnbWEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHQgPSAiIjsKLSAgICAgICAgc3dpdGNoKG9tcFR5cGVfKSB7Ci0gICAgICAgICAgICBjYXNlIE9tcFVua25vd246Ci0gICAgICAgICAgICAgICAgdD0iLS11bmtub3duPT0iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPbXBQYXJhbGxlbDoKLSAgICAgICAgICAgICAgICB0PSJwYXJhbGxlbCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9tcEZvcjoKLSAgICAgICAgICAgICAgICB0PSJmb3IiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPbXBTZWN0aW9uczoKLSAgICAgICAgICAgICAgICB0PSJzZWN0aW9ucyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9tcFNlY3Rpb246Ci0gICAgICAgICAgICAgICAgdD0ic2VjdGlvbiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9tcFNpbmdsZToKLSAgICAgICAgICAgICAgICB0PSJzaW5nbGUiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPbXBQYXJhbGxlbEZvcjoKLSAgICAgICAgICAgICAgICB0PSJwYXJhbGxlbCBmb3IiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPbXBQYXJhbGxlbFNlY3Rpb25zOgotICAgICAgICAgICAgICAgIHQ9InBhcmFsbGVsIHNlY3Rpb25zIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT21wTWFzdGVyOgotICAgICAgICAgICAgICAgIHQ9Im1hc3RlciI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9tcENyaXRpY2FsOgotICAgICAgICAgICAgICAgIHQ9ImNyaXRpY2FsIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT21wQmFycmllcjoKLSAgICAgICAgICAgICAgICB0PSJiYXJyaWVyIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT21wQXRvbWljOgotICAgICAgICAgICAgICAgIHQ9ImF0b21pYyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9tcEZsdXNoOgotICAgICAgICAgICAgICAgIHQ9ImZsdXNoIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT21wT3JkZXJlZDoKLSAgICAgICAgICAgICAgICB0PSJvcmRlcmVkIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT21wVGhyZWFkUHJpdmF0ZToKLSAgICAgICAgICAgICAgICB0PSJ0aHJlYWQgcHJpdmF0ZSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIjcHJhZ21hIG9tcCAiK3Q7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldE9NUFR5cGUgLSBnZXQgdGhlIHR5cGUgY29kZSBmb3IgdGhlIE9wZW5NUCBkaXJlY3RpdmUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRPTVBUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvbXBUeXBlXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9wZW5NUFRva2VuIFtdIGdldFRocmVhZFByaXZhdGVMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aHJlYWRQcml2YXRlTGlzdF87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcGVuTVBUb2tlbiBbXSBnZXRJZkV4cHJlc3Npb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlmRXhwcmVzc2lvbl87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcGVuTVBUb2tlbiBbXSBnZXRQcml2YXRlTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJpdmF0ZUxpc3RfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3Blbk1QVG9rZW4gW10gZ2V0Rmlyc3RQcml2YXRlTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3RQcml2YXRlTGlzdF87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVmYXVsdF87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcGVuTVBUb2tlbiBbXSBnZXRTaGFyZWRMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzaGFyZWRMaXN0XzsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgT3Blbk1QVG9rZW4gW10gZ2V0Q29weWluTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29weWluTGlzdF87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0UmVkdWN0aW9uT3BlcmF0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlZHVjdGlvbk9wZXJhdG9yXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9wZW5NUFRva2VuIFtdIGdldFJlZHVjdGlvbkxpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlZHVjdGlvbkxpc3RfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcmRlcmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvcmRlcmVkXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9XYWl0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBub3dhaXRfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNjaGVkdWxlS2luZCgpCi0gICAgewotICAgICAgICByZXR1cm4gc2NoZWR1bGVLaW5kXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9wZW5NUFRva2VuIFtdIGdldENodW5rRXhwcmVzc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gY2h1bmtFeHByZXNzaW9uXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9wZW5NUFRva2VuIFtdIGdldENvcHlQcml2YXRlTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29weVByaXZhdGVMaXN0XzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9wZW5NUFRva2VuIFtdIGdldEZsdXNoTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmx1c2hMaXN0XzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9wZW5NUFRva2VuIFtdIGdldE51bVRocmVhZHNFeHByKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudW1UaHJlYWRzRXhwcl87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcGVuTVBUb2tlbiBbXSBnZXRMYXN0UHJpdmF0ZUxpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3RQcml2YXRlTGlzdF87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFJlZ2lvbiAtIGFjY2Vzc29yCi0gICAgICogQHJldHVybiBJQVNUTm9kZQotICAgICAqLwotICAgIHB1YmxpYyBJQVNUTm9kZSBnZXRSZWdpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlZ2lvbl87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaW9uRmlsZW5hbWUoKQotICAgIHsgcmV0dXJuIHJlZ2lvbkZpbGVuYW1lXzsgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0UmVnaW9uT2Zmc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWdpb25PZmZzZXRfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFJlZ2lvbkxlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gcmVnaW9uTGVuZ3RoXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpbmtlZExpc3QgZ2V0UHJvYmxlbXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2JsZW1MaXN0XzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElBU1RTdGF0ZW1lbnQgZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uTm9kZV87Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQcm94aW1pdHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uUHJveGltaXR5XzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogc2V0T01QVHlwZSAtIHNldCB0aGUgT01QIHR5cGUgY29kZQotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0T01QVHlwZShpbnQgdHlwZSkgeyBvbXBUeXBlXyA9IHR5cGU7IH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBzZXRUaHJlYWRQcml2YXRlTGlzdCAtIHNldCB0aGUgdGhyZWFkcHJpdmF0ZSBsaXN0IG9mIHZhcmlhYmxlcwotICAgICAqIEBwYXJhbSBsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGhyZWFkUHJpdmF0ZUxpc3QoT3Blbk1QVG9rZW4gW10gbCkgeyB0aHJlYWRQcml2YXRlTGlzdF8gPSBsOyB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJZkV4cHJlc3Npb24oT3Blbk1QVG9rZW4gW10gbCkgeyBpZkV4cHJlc3Npb25fID0gbDsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFByaXZhdGVMaXN0KE9wZW5NUFRva2VuIFtdIGwpIHsgcHJpdmF0ZUxpc3RfID0gbDsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldEZpcnN0UHJpdmF0ZUxpc3QoT3Blbk1QVG9rZW4gW10gbCkgeyBmaXJzdFByaXZhdGVMaXN0XyA9IGw7IH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0KGludCBzbikgeyBkZWZhdWx0XyA9IHNuOyB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2hhcmVkTGlzdChPcGVuTVBUb2tlbiBbXSBsKSB7IHNoYXJlZExpc3RfID0gbDsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldENvcHlpbkxpc3QoT3Blbk1QVG9rZW4gW10gbCkgeyBjb3B5aW5MaXN0XyA9IGw7IH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZWR1Y3Rpb25PcGVyYXRvcihpbnQgb3ApIHsgcmVkdWN0aW9uT3BlcmF0b3JfID0gb3A7IH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlZHVjdGlvbkxpc3QoT3Blbk1QVG9rZW4gW10gbCkgeyByZWR1Y3Rpb25MaXN0XyA9IGw7IH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRPcmRlcmVkKGJvb2xlYW4gdGYpIHsgb3JkZXJlZF8gPSB0ZjsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldE5vV2FpdChib29sZWFuIHRmKSB7IG5vd2FpdF8gPSB0ZjsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFNjaGVkdWxlS2luZChpbnQga2luZCkgeyBzY2hlZHVsZUtpbmRfID0ga2luZDsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldENodW5rRXhwcmVzc2lvbihPcGVuTVBUb2tlbiBbXSBleHByZXNzaW9uKSB7IGNodW5rRXhwcmVzc2lvbl8gPSBleHByZXNzaW9uOyB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29weVByaXZhdGVMaXN0KE9wZW5NUFRva2VuIFtdIGwpIHsgY29weVByaXZhdGVMaXN0XyA9IGw7IH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGbHVzaExpc3QoT3Blbk1QVG9rZW4gW10gbCkgeyBmbHVzaExpc3RfID0gbDsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldE51bVRocmVhZHNFeHByKE9wZW5NUFRva2VuIFtdIGwpIHsgbnVtVGhyZWFkc0V4cHJfID0gbDsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldExhc3RQcml2YXRlTGlzdChPcGVuTVBUb2tlbiBbXSBsKSB7IGxhc3RQcml2YXRlTGlzdF8gPSBsOyB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UmVnaW9uKElBU1ROb2RlIHJlZ2lvbikgeyByZWdpb25fID0gcmVnaW9uOyAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlZ2lvbkZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkgeyByZWdpb25GaWxlbmFtZV8gPSBmaWxlbmFtZTsgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlZ2lvbk9mZnNldChpbnQgb2Zmc2V0KSAgeyByZWdpb25PZmZzZXRfID0gb2Zmc2V0OyAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlZ2lvbkxlbmd0aChpbnQgbGVuZ3RoKSAgeyByZWdpb25MZW5ndGhfID0gbGVuZ3RoOyAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2JsZW0oT3Blbk1QRXJyb3IgZXJyb3IpCi0gICAgeyBwcm9ibGVtTGlzdF8uYWRkKGVycm9yKTsgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSUFTVFN0YXRlbWVudCBsb2NhdGlvbiwgaW50IHByb3hpbWl0eSkgCi0gICAgeyBsb2NhdGlvbk5vZGVfPWxvY2F0aW9uOyAgIGxvY2F0aW9uUHJveGltaXR5Xz1wcm94aW1pdHk7ICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVE9iamVjdE1hY3JvLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVE9iamVjdE1hY3JvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2I2YjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RPYmplY3RNYWNyby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZpbGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3Nvck9iamVjdFN0eWxlTWFjcm9EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuQVNUTm9kZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUEFTVE9iamVjdE1hY3JvIGV4dGVuZHMgUEFTVE5vZGUgaW1wbGVtZW50cyBJQVNUUHJlcHJvY2Vzc29yT2JqZWN0U3R5bGVNYWNyb0RlZmluaXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgSUFTVFByZXByb2Nlc3Nvck9iamVjdFN0eWxlTWFjcm9EZWZpbml0aW9uIG9iak1hY3JvXyA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUEFTVE9iamVjdE1hY3JvIC0gY29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gb2JqTWFjcm86IEFTVE9iamVjdE1hY3JvCi0gICAgICovCi0gICAgcHVibGljIFBBU1RPYmplY3RNYWNybyhJQVNUUHJlcHJvY2Vzc29yT2JqZWN0U3R5bGVNYWNyb0RlZmluaXRpb24gb2JqTWFjcm8pCi0gICAgewotICAgICAgICBzdXBlcigoQVNUTm9kZSlvYmpNYWNybyk7Ci0gICAgICAgIG9iak1hY3JvXyA9IG9iak1hY3JvOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIjZGVmaW5lIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxlZ2F0ZWQgbWV0aG9kcyBmb3IgaW50ZXJmYWNlIElBU1RQcmVwcm9jZXNzb3JPYmplY3RTdHlsZU1hY3JvRGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Um9sZUZvck5hbWUoSUFTVE5hbWUgbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBvYmpNYWNyb18uZ2V0Um9sZUZvck5hbWUobik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHBhbnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9iak1hY3JvXy5nZXRFeHBhbnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUFTVE5hbWUgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb2JqTWFjcm9fLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbnNpb24oU3RyaW5nIGV4cCkKLSAgICB7Ci0gICAgICAgIG9iak1hY3JvXy5zZXRFeHBhbnNpb24oZXhwKTsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoSUFTVE5hbWUgbmFtZSkKLSAgICB7Ci0gICAgICAgIG9iak1hY3JvXy5zZXROYW1lKG5hbWUpOyAgICAgICAgCi0gICAgfQotCi0JcHVibGljIElBU1RGaWxlTG9jYXRpb24gZ2V0RXhwYW5zaW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiBvYmpNYWNyb18uZ2V0RXhwYW5zaW9uTG9jYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRPZlRyYW5zbGF0aW9uVW5pdEZpbGUoKSB7Ci0JCXJldHVybiBvYmpNYWNyb18uaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVFByYWdtYS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RQcmFnbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1YjVmMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVFByYWdtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvclByYWdtYVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuVXRpbGl0eTsKLQotLyoqCi0gKiBQc2V1ZG8gbm9kZSBmb3IgSUFTVCBwcmFnbWEgbm9kZXMKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQVNUUHJhZ21hIGV4dGVuZHMgUEFTVE5vZGUgaW1wbGVtZW50cyBJQVNUUHJlcHJvY2Vzc29yUHJhZ21hU3RhdGVtZW50Ci17Ci0JcHJvdGVjdGVkIElBU1RQcmVwcm9jZXNzb3JQcmFnbWFTdGF0ZW1lbnQgcHJhZ21hXyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyAgICBjb250ZW50XyA9ICIiOwotCQotICAgIC8qKgotICAgICAqIFBBU1RQcmFnbWEgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBwcmFnbWEKLSAgICAgKi8KLQlwdWJsaWMgUEFTVFByYWdtYShJQVNUUHJlcHJvY2Vzc29yUHJhZ21hU3RhdGVtZW50IHByYWdtYSkKLQl7Ci0JCXN1cGVyKChBU1ROb2RlKXByYWdtYSk7Ci0JCXByYWdtYV8gPSBwcmFnbWE7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFBBU1RQcmFnbWEgLSBDb3B5IGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHBQcmFnbWE6IFBBU1RQcmFnbWEKLSAgICAgKi8KLSAgICBwdWJsaWMgUEFTVFByYWdtYShQQVNUUHJhZ21hIHBQcmFnbWEpCi0gICAgewotICAgICAgICBzdXBlcihwUHJhZ21hKTsKLSAgICAgICAgcHJhZ21hXyAgPSBwUHJhZ21hLmdldEFTVFByYWdtYSgpOwotICAgICAgICBjb250ZW50XyA9IHBQcmFnbWEuZ2V0Q29udGVudCgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSUFTVFByZXByb2Nlc3NvclByYWdtYVN0YXRlbWVudCBnZXRBU1RQcmFnbWEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByYWdtYV87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gIiNwcmFnbWEiOwotICAgIH0KLQotCS8qKgotCSAqICpOT1RFKiBtdXN0IGdldCBEb24ncyBDRFQgcGFyc2VyIGNoYW5nZXMKLQkgKiBmb3IgdGhpcyB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSEKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkKLQl7Ci0JCS8vcmV0dXJuIHByYWdtYV8uZ2V0Q29udGVudCgpOwotCQlyZXR1cm4gY29udGVudF87Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIGdldE9mZnNldCAtIHJlbGF0aXZlIHRvIHRoZSBBU1QsIGkuZS4gaW5jbHVkZSBmaWxlcyBmYWN0b3JlZCBpbnRvIG9mZnNldAotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN0YXJ0TG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0TGVuZ3RoIC0gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIHByYWdtYSAKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbmRMb2NhdGlvbigpIC0gZ2V0U3RhcnRMb2NhdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRMb2NhbE9mZnNldCAtIHJlbGF0aXZlIHRvIGNvbnRhaW5pbmcgZmlsZSwgaS5lLiBpbmNsdWRlIGZpbGVzIGZhY3RvcmVkIG91dCBvZmZzZXQKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxPZmZzZXQoKQotICAgIHsKLSAgICAgICAgVXRpbGl0eS5Mb2NhdGlvbiBsID0gVXRpbGl0eS5nZXRMb2NhdGlvbihwcmFnbWFfKTsKLSAgICAgICAgcmV0dXJuIGwubG93XzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgeyBjb250ZW50XyA9IGNvbnRlbnQ7IH0KLQotCXB1YmxpYyBjaGFyW10gZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIHByYWdtYV8uZ2V0TWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpIHsKLQkJcmV0dXJuIHByYWdtYV8uaXNQYXJ0T2ZUcmFuc2xhdGlvblVuaXRGaWxlKCk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVFVuZGVmLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL1BBU1QvUEFTVFVuZGVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2MyNDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9QQVNUL1BBU1RVbmRlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yVW5kZWZTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1ROb2RlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIFBBU1RVbmRlZiBleHRlbmRzIFBBU1ROb2RlIGltcGxlbWVudHMgSUFTVFByZXByb2Nlc3NvclVuZGVmU3RhdGVtZW50Ci17Ci0JcHJvdGVjdGVkIElBU1RQcmVwcm9jZXNzb3JVbmRlZlN0YXRlbWVudCB1bmRlZl8gPSBudWxsOwotCQotICAgIC8qKgotICAgICAqIFBBU1RVbmRlZiAtIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHVuZGVmCi0gICAgICovCi0JcHVibGljIFBBU1RVbmRlZihJQVNUUHJlcHJvY2Vzc29yVW5kZWZTdGF0ZW1lbnQgdW5kZWYpCi0JewotCQlzdXBlcigoQVNUTm9kZSl1bmRlZik7Ci0JCXVuZGVmXyA9IHVuZGVmOwotCX0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIjdW5kZWYiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGVnYXRlIG1ldGhvZHMgZm9yIElBU1RQcmVwcm9jZXNzb3JVbmRlZlN0YXRlbWVudCAKLSAgICAgKi8KLQlwdWJsaWMgSUFTVE5hbWUgZ2V0TWFjcm9OYW1lKCkgewotCQlyZXR1cm4gdW5kZWZfLmdldE1hY3JvTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVHJhbnNsYXRpb25Vbml0RmlsZSgpIHsKLQkJcmV0dXJuIHVuZGVmXy5pc1BhcnRPZlRyYW5zbGF0aW9uVW5pdEZpbGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvZGljdGlvbmFyeS9EaWN0aW9uYXJ5LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL2RpY3Rpb25hcnkvRGljdGlvbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTgyOTAwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvZGljdGlvbmFyeS9EaWN0aW9uYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5kaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU2ltcGxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JU2NvcGU7Ci0KLQotLyoqCi0gKiBEaWN0aW9uYXJ5IGZvciBlbnRpcmUgZmlsZSAtIGdsb2JhbCBzY29wZSBhbmQgZnVuY3Rpb24gc2NvcGVzCi0gKiA8YnI+Ci0gKiAgVGhlIGRpY3Rpb25hcnkgaXMgbWFpbmx5IHVzZWQgdG8gcXVlcnkgZm9yIHN5bWJvbHMgd2l0aGluIGNlcnRhaW4gc2NvcGVzCi0gKiBhbmQgZWFjaCBzeW1ib2wgdGVsbHMgd2hlcmUgaXQgaXMgZGVmaW5lZCwgc2VlIGdldFN5bWJvbHNGb3IoKS48YnI+Ci0gKiBXb3VsZCBiZSBnb29kIHRvIGRldmVsb3AgZnVydGhlciB3aXRoICJ3aGVyZSB1c2VkIiBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIHBhemVsCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWN0aW9uYXJ5Ci17Ci0gICAgLy8gbWFwcyBzdHJpbmcgdG8gbGlua2VkIGxpc3Qgb2Ygc3ltYm9scyBoYXZpbmcgdGhlIHNhbWUgbmFtZQotICAgIHByb3RlY3RlZCBIYXNodGFibGUgICAgIHRleHRUb1N5bWJvbHNfICAgICAgICAgID0gbmV3IEhhc2h0YWJsZSgpOyAKLSAgICAvLyBtYXBzIGZ1bmN0aW9uIChvciBhc3QgZm9yIGdsb2JhbHMpIHRvIGxpbmtlZCBsaXN0IG9mIGFsbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhhdCBmdW5jdGlvbgotICAgIHByb3RlY3RlZCBIYXNodGFibGUgICAgIGZ1bmN0aW9uVG9TeW1ib2xzXyAgICAgID0gbmV3IEhhc2h0YWJsZSgpOyAKLSAgICAKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlICAgICBzdHJpbmdTY29wZUtleVRvU3ltYm9sXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgSUFTVFRyYW5zbGF0aW9uVW5pdCAgIGFzdF8gPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIERpY3Rpb25hcnkgLSBGaWxlIGRpY3Rpb25hcnkKLSAgICAgKiBAcGFyYW0gYXN0IC0gSUFTVFRyYW5zbGF0aW9uVW5pdAotICAgICAqLwotICAgIHB1YmxpYyBEaWN0aW9uYXJ5KElBU1RUcmFuc2xhdGlvblVuaXQgYXN0KQotICAgIHsKLSAgICAgICAgYXN0XyA9IGFzdDsKLSAgICAgICAgCi0gICAgICAgIGZ1bmN0aW9uVG9TeW1ib2xzXy5wdXQoYXN0XywgbmV3IExpbmtlZExpc3QoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGluc2VydCAtIGluc2VydCBhIHNldCBvZiBzeW1ib2wgc3BlY2lmaWNhdGlvbnMgdXNpbmcgYSBzaW1wbGUgZGVjbGFydGlvbgotICAgICAqIEBwYXJhbSBkZWNsICAgIC0gSUFTVFNpbXBsZURlY2xhcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0KElBU1RTaW1wbGVEZWNsYXJhdGlvbiBkZWNsKQotICAgIHsKLSAgICAgICAgSUFTVERlY2xhcmF0b3IgW10gZGVjbHMgPSBkZWNsLmdldERlY2xhcmF0b3JzKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGRlY2xzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgaW5zZXJ0KGRlY2xzW2ldLCBkZWNsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaW5zZXJ0IC0gaW5zZXJ0IGEgZGVjbGFyYXRvciBpbnRvIHRoZSBkaWN0aW9uYXJpZXMKLSAgICAgKiBAcGFyYW0gZGVjbGFyYXRvciAtIElBU1REZWNsYXJhdG9yCi0gICAgICogQHBhcmFtIGRlY2wgICAgICAgLSBJQVNURGVjbGFyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnQoSUFTVERlY2xhcmF0b3IgZGVjbGFyYXRvciwgSUFTVERlY2xhcmF0aW9uIGRlY2wpewotICAgICAgICBTeW1ib2wgc3ltYm9sID0gbmV3IFN5bWJvbChkZWNsYXJhdG9yLCBkZWNsKTsKLSAgICAgICAgaW5zZXJ0TWVtYmVyKHN5bWJvbCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIGluc2VydCAtIGluc2VydCBhIGRlY2xhcmF0b3IgaW50byB0aGUgZGljdGlvbmFyaWVzCi0gICAgICogQHBhcmFtIGRlY2xhcmF0b3IgLSBJQVNURGVjbGFyYXRvcgotICAgICAqIEBwYXJhbSBkZWNsICAgICAgIC0gSUFTVERlY2xhcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0KElBU1REZWNsYXJhdG9yIGRlY2xhcmF0b3IsIElBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbiBkZWNsKXsKLSAgICAgICAgU3ltYm9sIHN5bWJvbCA9IG5ldyBTeW1ib2woZGVjbGFyYXRvciwgZGVjbCk7Ci0gICAgICAgIGluc2VydE1lbWJlcihzeW1ib2wpOwotICAgIH0KLQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluc2VydE1lbWJlcihTeW1ib2wgc3ltYm9sKQotICAgIHsKLSAgICAgICAgSUFTVE5vZGUgbm9kZSAgID0gc3ltYm9sLmdldERlZmluaW5nRnVuY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0byBzdHJpbmcvc2NvcGUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBTdHJpbmdTY29wZUtleSBzc2tleSA9IG5ldyBTdHJpbmdTY29wZUtleShzeW1ib2wuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBzdHJpbmdTY29wZUtleVRvU3ltYm9sXy5wdXQoc3NrZXksIHN5bWJvbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRE9NRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGljdGlvbmFyeS5pbnNlcnQgZXhjZXB0aW9uICIrZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0byBmdW5jdGlvbiBnbG9iYWwgbGlzdHMKLSAgICAgICAgaWYgKG5vZGU9PW51bGwpIG5vZGUgPSBhc3RfOyAgLy8gPz8gbWF5YmUgc2hvdWxkIGV4aXQgaW5zdGVhZD8/Ci0gICAgICAgIExpbmtlZExpc3QgbGwgPSAoTGlua2VkTGlzdClmdW5jdGlvblRvU3ltYm9sc18uZ2V0KG5vZGUpOwotICAgICAgICBpZiAobGw9PW51bGwpIHsKLSAgICAgICAgICAgIGxsID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgICAgIGZ1bmN0aW9uVG9TeW1ib2xzXy5wdXQobm9kZSwgbGwpOwotICAgICAgICB9Ci0gICAgICAgIGxsLmFkZChzeW1ib2wpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRvIHRleHQgbGlzdAotICAgICAgICBTdHJpbmcgc3RybmFtZSA9IHN5bWJvbC5nZXROYW1lKCkudG9TdHJpbmcoKTsKLSAgICAgICAgTGlua2VkTGlzdCBubCA9IChMaW5rZWRMaXN0KXRleHRUb1N5bWJvbHNfLmdldChzdHJuYW1lKTsKLSAgICAgICAgaWYgKG5sPT1udWxsKSB7Ci0gICAgICAgICAgICBubCA9IG5ldyBMaW5rZWRMaXN0KCk7ICAvLyBkZWZpbml0aW9ucyBmb3IgdGhpcyB0ZXh0IG5hbWUKLSAgICAgICAgICAgIHRleHRUb1N5bWJvbHNfLnB1dChzdHJuYW1lLCBubCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmwuYWRkKHN5bWJvbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFN5bWJvbHNGb3IgLSBmb3IgYSBuYW1lIHN0cmluZywgdXNpbmcgdGhlIGdsb2JhbCBkaWNhdGlvbmFyeQotICAgICAqIEBwYXJhbSB0ZXh0IC0gU3RyaW5nCi0gICAgICogQHJldHVybiBTeW1ib2wgW10KLSAgICAgKi8KLSAgICBwdWJsaWMgU3ltYm9sIFtdIGdldFN5bWJvbHNGb3IoU3RyaW5nIHRleHQpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGxsID0gKExpbmtlZExpc3QpdGV4dFRvU3ltYm9sc18uZ2V0KHRleHQpOwotICAgICAgICBpZiAobGw9PW51bGwpICByZXR1cm4gbmV3IFN5bWJvbFswXTsKLSAgICAgICAgU3ltYm9sIFtdIGFucyA9IG5ldyBTeW1ib2xbbGwuc2l6ZSgpXTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bGwuc2l6ZSgpOyBpKyspICBhbnNbaV0gPSAoU3ltYm9sKWxsLmdldChpKTsKLSAgICAgICAgcmV0dXJuIGFuczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0U3ltYm9sc0ZvciAtIHVzaW5nIGEgZ2l2ZW4gZnVuY3Rpb24gc2NvcGUKLSAgICAgKiBAcGFyYW0gZmN0bkRlZiAtIElBU1RGdW5jdGlvbkRlZmluaXRpb24KLSAgICAgKiBAcmV0dXJuIFN5bWJvbCBbXQotICAgICAqLwotICAgIHB1YmxpYyBTeW1ib2wgW10gZ2V0U3ltYm9sc0ZvcihJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZjdG5EZWYpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGxsID0gKExpbmtlZExpc3QpZnVuY3Rpb25Ub1N5bWJvbHNfLmdldChmY3RuRGVmKTsKLSAgICAgICAgaWYgKGxsPT1udWxsKSAgcmV0dXJuIG5ldyBTeW1ib2xbMF07Ci0gICAgICAgIFN5bWJvbCBbXSBhbnMgPSBuZXcgU3ltYm9sW2xsLnNpemUoKV07Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGxsLnNpemUoKTsgaSsrKSAgYW5zW2ldID0gKFN5bWJvbClsbC5nZXQoaSk7Ci0gICAgICAgIHJldHVybiBhbnM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFN5bWJvbHNGb3IgLSB1c2luZyB0aGUgZ2xvYmFsIHNjb3BlCi0gICAgICogQHJldHVybiBTeW1ib2wgW10KLSAgICAgKi8KLSAgICBwdWJsaWMgU3ltYm9sIFtdIGdldFN5bWJvbHNGb3IoKQotICAgIHsKLSAgICAgICAgTGlua2VkTGlzdCBsbCA9IChMaW5rZWRMaXN0KWZ1bmN0aW9uVG9TeW1ib2xzXy5nZXQoYXN0Xyk7Ci0gICAgICAgIGlmIChsbD09bnVsbCkgIHJldHVybiBuZXcgU3ltYm9sWzBdOwotICAgICAgICBTeW1ib2wgW10gYW5zID0gbmV3IFN5bWJvbFtsbC5zaXplKCldOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxsbC5zaXplKCk7IGkrKykgIGFuc1tpXSA9IChTeW1ib2wpbGwuZ2V0KGkpOwotICAgICAgICByZXR1cm4gYW5zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBmaW5kIC0gZ2l2ZW4gYW4gSUFTVE5hbWUgKHJlZmVyZW5jZXMsIGZvciBleGFtcGxlKQotICAgICAqIEBwYXJhbSBuYW1lIC0gSUFTVE5hbWUKLSAgICAgKiBAcmV0dXJuIFN5bWJvbAotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN5bWJvbCBmaW5kKElBU1ROYW1lIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ1Njb3BlS2V5IGtleSA9IG5ldyBTdHJpbmdTY29wZUtleShuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoU3ltYm9sKXN0cmluZ1Njb3BlS2V5VG9TeW1ib2xfLmdldChrZXkpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDbGFzczogU3RyaW5nU2NvcGVLZXkgLSBiaW5kaW5nIGlkZW50aXR5IG9mIG5hbWUgYW5kIHNjb3BlIHdoZXJlIGRlZmluZWQKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFN0cmluZ1Njb3BlS2V5Ci0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ0tleV8gPSAiIjsKLSAgICAgICAgcHVibGljIElTY29wZSBzY29wZUtleV8gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZ1Njb3BlS2V5KFN0cmluZyBzdHJpbmdLZXksIElTY29wZSBzY29wZUtleSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nS2V5XyA9IHN0cmluZ0tleTsKLSAgICAgICAgICAgIHNjb3BlS2V5XyAgPSBzY29wZUtleTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZ1Njb3BlS2V5KElBU1ROYW1lIG5hbWVOb2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZ0tleV8gPSBuYW1lTm9kZS50b1N0cmluZygpOwotICAgICAgICAgICAgLy9JQmluZGluZyBiID0gbmFtZU5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKLSAgICAgICAgICAgIC8vaWYgKGIgaW5zdGFuY2VvZiBJVmFyaWFibGUpIHsKLSAgICAgICAgICAgIC8vICAgSVZhcmlhYmxlIGJpdiA9IChJVmFyaWFibGUpYjsgCi0gICAgICAgICAgICAvLyAgIElUeXBlIHQgPSBiaXYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgLy8gICB0PW51bGw7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIElCaW5kaW5nIGJpbmRpbmc9bmFtZU5vZGUucmVzb2x2ZUJpbmRpbmcoKTsvL2NkdDQwIGZpeDogd2FzIGdldEJpbmRpbmcoKTsgY291bGQgaGF2ZSBiZWVuIG51bGwKLSAgICAgICAgICAgIHNjb3BlS2V5XyA9IGJpbmRpbmcuZ2V0U2NvcGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGVxdWFscwotICAgICAgICAgKiAgICBOT1RFIC0gVGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBzdHJpbmdTY29wZUtleVRvU3ltYm9sXyBoYXNodGFibGUgd29yay4KLSAgICAgICAgICogICAgICAgICAgIGFsbG93aW5nIHR3byBTdHJpbmdTY29wZUtleXMgd2l0aCBpZGVudGljYWwgZGF0YSBmaWVsZHMgdG8gYmUgImlkZW50aWZpZWQiCi0gICAgICAgICAqICAgICAgICAgICBieSB0aGUgaGFzaHRhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCB0aGlzID09IHRoYXQgKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmICggISh0aGF0IGluc3RhbmNlb2YgU3RyaW5nU2NvcGVLZXkpICkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nU2NvcGVLZXkgdGhhdFN0cmluZ1Njb3BlS2V5ID0gIChTdHJpbmdTY29wZUtleSl0aGF0OwotICAgICAgICAgICAgaWYgKHRoYXRTdHJpbmdTY29wZUtleS5zdHJpbmdLZXlfLmVxdWFscyhzdHJpbmdLZXlfKSAmJiB0aGF0U3RyaW5nU2NvcGVLZXkuc2NvcGVLZXlfPT1zY29wZUtleV8pICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBlcXVhbHMKLSAgICAgICAgICogICAgTk9URSAtIFRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgc3RyaW5nU2NvcGVLZXlUb1N5bWJvbF8gaGFzaHRhYmxlIHdvcmsKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nS2V5Xy5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9kaWN0aW9uYXJ5L0RpY3Rpb25hcnlGYWN0b3J5LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL2RpY3Rpb25hcnkvRGljdGlvbmFyeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhMjljYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL2RpY3Rpb25hcnkvRGljdGlvbmFyeUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5kaWN0aW9uYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlY2xhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25EZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTaW1wbGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGFuZGFyZEZ1bmN0aW9uRGVjbGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci0KLS8qKgotICogVGhlIERpY3Rpb25hcnlGYWN0b3J5IHZpc2l0cyBhbiBBU1QgYW5kIGJ1aWxkIFN5bWJvbHMgZm9yIGFsbCB2YXJpYWJsZXMKLSAqIAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIERpY3Rpb25hcnlGYWN0b3J5IGV4dGVuZHMgQVNUVmlzaXRvciAKLXsKLSAgICBwcm90ZWN0ZWQgSUFTVFRyYW5zbGF0aW9uVW5pdCAgICBhc3RfICAgPSBudWxsOwotICAgIHByb3RlY3RlZCBEaWN0aW9uYXJ5ICAgICAgICAgICAgIGZEaWN0XyA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogYnVpbGREaWN0aW9uYXJ5IC0gc3RhdGljIG1ldGhvZCB0byBidWlsZCBkaWN0aW9uYXJ5Ci0gICAgICogQHBhcmFtIGFzdCAtIElBU1RUcmFuc2xhdGlvblVuaXQKLSAgICAgKiBAcmV0dXJuIERpY3Rpb25hcnkKLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIERpY3Rpb25hcnkgYnVpbGREaWN0aW9uYXJ5KElBU1RUcmFuc2xhdGlvblVuaXQgYXN0KQotCXsKLQkJRGljdGlvbmFyeUZhY3RvcnkgZGYgPSBuZXcgRGljdGlvbmFyeUZhY3RvcnkoYXN0KTsKLQkJZGYuYnVpbGREaWN0aW9uYXJ5KCk7Ci0JCXJldHVybiBkZi5nZXREaWN0aW9uYXJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIERpY3Rpb25hcnlGYWN0b3J5IC0gY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gYXN0IC0gSUFTVFRyYW5zbGF0aW9uVW5pdAotCSAqLwotCXByb3RlY3RlZCBEaWN0aW9uYXJ5RmFjdG9yeShJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCkKLQl7Ci0JCWFzdF8gPSBhc3Q7Ci0JCQotCQlmRGljdF8gPSBuZXcgRGljdGlvbmFyeShhc3RfKTsKLQl9Ci0JCi0JLyoqCi0JICogRGljdGlvbmFyeSAtIGFjY2Vzc29yIHRvIERpY3Rpb25hcnkKLQkgKiBAcmV0dXJuIERpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgRGljdGlvbmFyeSBnZXREaWN0aW9uYXJ5KCkKLQl7Ci0JCXJldHVybiBmRGljdF87Ci0JfQotCQotCS8qKgotCSAqIGJ1aWxkRGljdGlvbmFyeSAtIGJ1aWxkIHRoZSBkaWN0aW9uYXJ5Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZERpY3Rpb25hcnkoKQotCXsKLQkJc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQlhc3RfLmFjY2VwdCh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogdmlzaXQgLSBBU1RWaXNpdG9yIG1ldGhvZCBjYXB0dXJlIHRvIGZlZWQgaW5mb3JtYXRpb24gaW50byBkaWNhdGlvbmFyeQotCSAqIEBwYXJhbSBkZWNsYXJhdGlvbiAtIElBU1REZWNsYXJhdGlvbgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0gICAgcHVibGljIGludCB2aXNpdChJQVNURGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIAotICAgIHsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlZmluaXRpb24sIGFjY3QgZm9yIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIElBU1RGdW5jdGlvbkRlY2xhcmF0b3IgaWZkID0gKChJQVNURnVuY3Rpb25EZWZpbml0aW9uKWRlY2xhcmF0aW9uKS5nZXREZWNsYXJhdG9yKCk7Ci0gICAgICAgICAgICBpZiAoaWZkIGluc3RhbmNlb2YgSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yKSB7Ci0gICAgICAgICAgICAgICAgSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yIGlmZGMgPSAoSUFTVFN0YW5kYXJkRnVuY3Rpb25EZWNsYXJhdG9yKWlmZDsKLSAgICAgICAgICAgICAgICBJQVNUUGFyYW1ldGVyRGVjbGFyYXRpb24gW10gcGFyYW1zID0gaWZkYy5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8cGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElBU1REZWNsYXJhdG9yIGlkID0gcGFyYW1zW2ldLmdldERlY2xhcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgZkRpY3RfLmluc2VydChpZCwgcGFyYW1zW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NGRyBjZmcgPSBDRkdGYWN0b3J5LmJ1aWxkQ0ZHKChJQVNURnVuY3Rpb25EZWZpbml0aW9uKWRlY2xhcmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIElBU1RTaW1wbGVEZWNsYXJhdGlvbikKLSAgICAJewotICAgIAkJZkRpY3RfLmluc2VydCgoSUFTVFNpbXBsZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uKTsKLSAgICAJfQotICAgIAlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL2RpY3Rpb25hcnkvU3ltYm9sLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL2RpY3Rpb25hcnkvU3ltYm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDZjMzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9kaWN0aW9uYXJ5L1N5bWJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLmRpY3Rpb25hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1RJbnRlcm5hbDsKLQotLyoqCi0gKiBIb2xkcyBhIHN5bWJvbCBkZWZpbml0aW9uCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBTeW1ib2wgewotCS8qKiB3aGF0IGlzIGJlaW5nIGRlZmluZWQgKi8KLQlwcm90ZWN0ZWQgSUFTVERlY2xhcmF0b3IgZGVjbGFyYXRvcl8gPSBudWxsOwotCS8qKgotCSAqIGRlY2xhcmF0aW9uIGNhbiBiZSBlaXRoZXIgSUFTVERlY2xhcmF0aW9uIG9yIElBU1RQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLQkgKiB0aGlzIGlzIHRoZSBicm9hZGVyIGNvbnRhaW5pbmcgc3RhdGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIElBU1ROb2RlIGRlY2xhcmF0aW9uXyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0cmFjZU9uID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBkZWNsYXJhdG9yIC0KLQkgKiAgICAgICAgICAgIElBU1REZWNsYXJhdG9yCi0JICogQHBhcmFtIGRlY2xhcmF0aW9uIC0KLQkgKiAgICAgICAgICAgIElBU1REZWNsYXJ0aW9uIChmb3IgdGhpcyBkZWNsYXJhdG9yIC0gYW5kIHBvc3NpYmx5IG90aGVycwotCSAqLwotCXB1YmxpYyBTeW1ib2woSUFTVERlY2xhcmF0b3IgZGVjbGFyYXRvciwgSUFTVERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWRlY2xhcmF0b3JfID0gZGVjbGFyYXRvcjsKLQkJZGVjbGFyYXRpb25fID0gZGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVjbGFyYXRvciAtCi0JICogICAgICAgICAgICBJQVNURGVjbGFyYXRvcgotCSAqIEBwYXJhbSBkZWNsYXJhdGlvbiAtCi0JICogICAgICAgICAgICBJQVNUUGFyYW1ldGVyRGVjbGFydGlvbiAoZm9yIHRoaXMgZGVjbGFyYXRvciAtIGFuZCBwb3NzaWJseQotCSAqICAgICAgICAgICAgb3RoZXJzCi0JICovCi0JcHVibGljIFN5bWJvbChJQVNURGVjbGFyYXRvciBkZWNsYXJhdG9yLAotCQkJSUFTVFBhcmFtZXRlckRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWRlY2xhcmF0b3JfID0gZGVjbGFyYXRvcjsKLQkJZGVjbGFyYXRpb25fID0gZGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSAtIGdldCB0aGUgbmFtZSBvZiB0aGUgZGVjbGFyYXRvcgotCSAqIAotCSAqIEByZXR1cm4gSUFTVE5hbWUKLQkgKi8KLQlwdWJsaWMgSUFTVE5hbWUgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGRlY2xhcmF0b3JfLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREZWNsYXJhdG9yIC0gYWNjZXNzb3IgdG8gZGVjbGFyYXRvcgotCSAqIAotCSAqIEByZXR1cm4gLSBJQVNURGVjbGFyYXRvcgotCSAqLwotCXB1YmxpYyBJQVNURGVjbGFyYXRvciBnZXREZWNsYXJhdG9yKCkgewotCQlyZXR1cm4gZGVjbGFyYXRvcl87Ci0JfQotCi0JLyoqCi0JICogZ2V0RGVjbGFyYXRpb24gLSBnZXQgdGhlIHJlbGF0ZWQgZGVjbGFyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIC0gSUFTVE5vZGUgKGNhbiBiZSBJQVNURGVjbGFyYXRpb24gb3IgSUFTVFBhcmFtZXRlckRlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyBJQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uXzsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTY29wZSAtIGdldCB0aGUgc2NvcGUgZm9yIHRoaXMgZGVjbGFyYXRvcgotCSAqIAotCSAqIEByZXR1cm4gSVNjb3BlCi0JICovCi0JcHVibGljIElTY29wZSBnZXRTY29wZSgpIHsKLQkJLy8gZmluZCB0aGUgdW5pcXVlIHNjb3BlIGZvciB0aGlzIG5hbWUKLQkJSUFTVE5hbWUgbmFtZSA9IGRlY2xhcmF0b3JfLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJLy9JQmluZGluZyBiaW5kaW5nID0gbmFtZS5nZXRCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU2NvcGUgc2NvcGUgPSBudWxsOwotCQl0cnkgewotCQkJc2NvcGUgPSBiaW5kaW5nLmdldFNjb3BlKCk7Ci0JCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN5bWJvbEJ1Y2tldC5maW5kOiBleGNlcHRpb24gIiArIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogZ2V0RGVmaW5pbmdGdW5jdGlvbiAtIGdldCB0aGUgZnVuY3Rpb24gaW4gd2hpY2ggZGVjbGFydG9yIGlzIGRlZmluZWQKLSAgICAgKiBAcmV0dXJuIElBU1ROb2RlIC0gZWl0aGVyIElBU1RUcmFuc2xhdGlvblVuaXQgb3IgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJQVNUTm9kZSBnZXREZWZpbmluZ0Z1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIElTY29wZSBzY29wZSA9IGdldFNjb3BlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2NvcGU9PW51bGwpICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIElBU1ROb2RlIG5vZGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9ub2RlID0gc2NvcGUuZ2V0UGh5c2ljYWxOb2RlKCk7IC8vIGNkdCAzLjEKLSAgICAgICAgICAgIG5vZGUgPSBBU1RJbnRlcm5hbC5nZXRQaHlzaWNhbE5vZGVPZlNjb3BlKHNjb3BlKTsgLy8gY2R0NDAKLSAgICAgICAgfQotICAgICAgICBjYXRjaChET01FeGNlcHRpb24gZSkgeyAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3ltYm9sLmdldERlZmluaW5nRnVuY3Rpb24gZXhjZXB0aW9uICIrZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8ga2VlcCBtb3ZpbmcgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCB0aGUgbm9kZQotICAgICAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAobm9kZT09bnVsbCkgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNUVHJhbnNsYXRpb25Vbml0KSByZXR1cm4gbm9kZTsgICAgICAvLyBnbG9iYWwgZGljdAotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25EZWZpbml0aW9uKSAgcmV0dXJuIG5vZGU7ICAvLyBvdXIgZnVuY3Rpb24KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QQmFzaWNCbG9jay5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QQmFzaWNCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Q0MDgwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL09NUEJhc2ljQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQnJlYWtTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQ2FzZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDb21wb3VuZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDb250aW51ZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REb1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZvclN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFJldHVyblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3dpdGNoU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFdoaWxlU3RhdGVtZW50OwotCi0KLQotLyoqCi0gKiBIb2xkcyBhIGNvbnNvbGlkYXRlZCAoY29hcnNlKSBiYXNpYyBibG9jayBmb3IgY29uY3VycmVuY3kgYW5hbHlzaXMKLSAqIEBhdXRob3IgcGF6ZWwKLSAqLwotcHVibGljIGNsYXNzIE9NUEJhc2ljQmxvY2sgZXh0ZW5kcyBPTVBDRkdOb2RlCi17Ci0gICAgcHJvdGVjdGVkIExpbmtlZExpc3QgICAgIHN0YXRlbWVudHNfID0gbmV3IExpbmtlZExpc3QoKTsgIC8vIGNvbnRhaW5lZCBzdG10cyAKLSAgICAKLSAgICBwcm90ZWN0ZWQgSUFTVE5hbWUgICAgICAgbGFiZWxfICAgICAgPSBudWxsOyAgIC8vIG5vbi1udWxsIGlmIGxhYmVsZWQgYmxvY2sKLSAgICAKLSAgICBwcm90ZWN0ZWQgSUFTVEV4cHJlc3Npb24gYnJhbmNoaW5nRXhwcmVzc2lvbl8gPSBudWxsOwotICAgIHByb3RlY3RlZCBpbnQgICAgICAgICAgICBicmFuY2hpbmdUeXBlXyAgICAgICA9IE5vQnJhbmNoOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5vQnJhbmNoICAgICAgPSAtMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJZkJyYW5jaCAgICAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTd2l0Y2hCcmFuY2ggID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaGlsZUJyYW5jaCAgID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb0JyYW5jaCAgICAgID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGb3JCcmFuY2ggICAgID0gNDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBPTVBCYXNpY0Jsb2NrIC0gQmFzaWMgYmxvY2sgZm9yIE9NUCBDRkcKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBPTVBCYXNpY0Jsb2NrKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZFN0YXRlbWVudCAtIGFkZCBhbiBlbGVtZW50IHRvIHRoaXMgYmFzaWMgYmxvY2sKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIElBU1ROb2RlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU3RhdGVtZW50KElBU1RTdGF0ZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICAgIHN0YXRlbWVudHNfLmFkZChlbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElBU1ROYW1lIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYWJlbF87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGlzQ2FzZSAtIGluZm9ybXMgaWYgZmlyc3Qgc3RhdGVtZW50IGlzIGEgQ0FTRSAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2UoKQotICAgIHsKLSAgICAgICAgaWYgKHN0YXRlbWVudHNfLmlzRW1wdHkoKSkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoKElBU1RTdGF0ZW1lbnQpc3RhdGVtZW50c18uZ2V0Rmlyc3QoKSk7Ci0gICAgICAgIHJldHVybiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVENhc2VTdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJyYW5jaGluZ0V4cHJlc3Npb24oSUFTVEV4cHJlc3Npb24gYnJhbmNoLCBpbnQgdHlwZSkKLSAgICB7Ci0gICAgICAgIGJyYW5jaGluZ0V4cHJlc3Npb25fID0gYnJhbmNoOwotICAgICAgICBicmFuY2hpbmdUeXBlXyAgICAgICA9IHR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFN0YXRlbWVudHMgLSBnZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBzdGF0ZW1lbnQgZm9yIHRoZSBub2RlCi0gICAgICogQHJldHVybiBJQVNUU3RhdGVtZW50IFtdCi0gICAgICovCi0gICAgcHVibGljIElBU1RTdGF0ZW1lbnQgW10gZ2V0U3RhdGVtZW50cygpCi0gICAgewotICAgICAgICBJQVNUU3RhdGVtZW50IFtdIGxpc3QgPSBuZXcgSUFTVFN0YXRlbWVudFtzdGF0ZW1lbnRzXy5zaXplKCldOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgaT1zdGF0ZW1lbnRzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICBsaXN0W2NvdW50KytdID0gKElBU1RTdGF0ZW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUFTVEV4cHJlc3Npb24gZ2V0QnJhbmNoaW5nRXhwcmVzc2lvbigpIHsgcmV0dXJuIGJyYW5jaGluZ0V4cHJlc3Npb25fOyB9Ci0gICAgcHVibGljIGludCAgICAgICAgICAgIGdldEJyYW5jaGluZ1R5cGUoKSAgICAgICB7IHJldHVybiBicmFuY2hpbmdUeXBlXzsgICAgICAgfQotICAgIAotICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0IGZ1bmRTdG10c0V4cHJzXyA9IG51bGw7IAotICAgIAotICAgIC8qKgotICAgICAqIGdldEZ1bmRhbWVudGFscyAtIGJyZWFrIGRvd24gYWxsIHN0YXRlbWVudHMvZXhwcnMgdG8gYmFzaWNzIGZvciBjb25jdXJyZW5jeSBtYXAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpbmtlZExpc3QgZ2V0RnVuZGFtZW50YWxzKCkKLSAgICB7Ci0gICAgICAgIGlmIChmdW5kU3RtdHNFeHByc18hPW51bGwpIHJldHVybiBmdW5kU3RtdHNFeHByc187Ci0gICAgICAgIGZ1bmRTdG10c0V4cHJzXyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoSXRlcmF0b3IgaT1zdGF0ZW1lbnRzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElBU1RTdGF0ZW1lbnQgc3RtdCA9IChJQVNUU3RhdGVtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgRnVuZFZpc2l0b3IgZnYgPSBuZXcgRnVuZFZpc2l0b3IoZnVuZFN0bXRzRXhwcnNfKTsKLSAgICAgICAgICAgIHN0bXQuYWNjZXB0KGZ2KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZ1bmRTdG10c0V4cHJzXzsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRnVuZFZpc2l0b3IKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgY2xhc3MgRnVuZFZpc2l0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBsaXN0XyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRnVuZFZpc2l0b3IoTGlua2VkTGlzdCBsaXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0XyA9IGxpc3Q7Ci0gICAgICAgICAgICBzaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOwotICAgICAgICB9Ci0gCi0gICAgICAgIHB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RJZlN0YXRlbWVudCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NJZlN0YXRlbWVudCgoSUFTVElmU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RTd2l0Y2hTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzU3dpdGNoU3RhdGVtZW50KChJQVNUU3dpdGNoU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RDYXNlU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0Nhc2VTdGF0ZW1lbnQoKElBU1RDYXNlU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNURm9yU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZvclN0YXRlbWVudCgoSUFTVEZvclN0YXRlbWVudClzdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX1NLSVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzV2hpbGVTdGF0ZW1lbnQoKElBU1RXaGlsZVN0YXRlbWVudClzdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX1NLSVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNURG9TdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRG9TdGF0ZW1lbnQoKElBU1REb1N0YXRlbWVudClzdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX1NLSVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUQ29tcG91bmRTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RCcmVha1N0YXRlbWVudCkgewotICAgICAgICAgICAgICAgIGxpc3RfLmFkZChzdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVENvbnRpbnVlU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgbGlzdF8uYWRkKHN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUUmV0dXJuU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgbGlzdF8uYWRkKHN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICBsaXN0Xy5hZGQoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0lmU3RhdGVtZW50KElBU1RJZlN0YXRlbWVudCBzdGF0ZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RfLmFkZChzdGF0ZW1lbnQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0VGhlbkNsYXVzZSgpIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgRnVuZFZpc2l0b3IgdGhlblZpc2l0b3IgPSBuZXcgRnVuZFZpc2l0b3IobGlzdF8pOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5nZXRUaGVuQ2xhdXNlKCkuYWNjZXB0KHRoZW5WaXNpdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0RWxzZUNsYXVzZSgpIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgRnVuZFZpc2l0b3IgZWxzZVZpc2l0b3IgPSBuZXcgRnVuZFZpc2l0b3IobGlzdF8pOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5nZXRFbHNlQ2xhdXNlKCkuYWNjZXB0KGVsc2VWaXNpdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1N3aXRjaFN0YXRlbWVudChJQVNUU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdF8uYWRkKHN0YXRlbWVudC5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpKTsKLSAgICAgICAgICAgIEZ1bmRWaXNpdG9yICBib2R5VmlzaXRvciA9IG5ldyBGdW5kVmlzaXRvcihsaXN0Xyk7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuZ2V0Qm9keSgpLmFjY2VwdChib2R5VmlzaXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDYXNlU3RhdGVtZW50KElBU1RDYXNlU3RhdGVtZW50IHN0YXRlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdF8uYWRkKHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRm9yU3RhdGVtZW50KElBU1RGb3JTdGF0ZW1lbnQgc3RhdGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0Xy5hZGQoc3RhdGVtZW50LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKSk7Ci0gICAgICAgICAgICBsaXN0Xy5hZGQoc3RhdGVtZW50LmdldEl0ZXJhdGlvbkV4cHJlc3Npb24oKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldEluaXRpYWxpemVyU3RhdGVtZW50KCkhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBGdW5kVmlzaXRvciAgaW5pdFZpc2l0b3IgPSBuZXcgRnVuZFZpc2l0b3IobGlzdF8pOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5nZXRJbml0aWFsaXplclN0YXRlbWVudCgpLmFjY2VwdChpbml0VmlzaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldEJvZHkoKSE9bnVsbCkgewotICAgICAgICAgICAgICAgIEZ1bmRWaXNpdG9yICBib2R5VmlzaXRvciA9IG5ldyBGdW5kVmlzaXRvcihsaXN0Xyk7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmdldEJvZHkoKS5hY2NlcHQoYm9keVZpc2l0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzV2hpbGVTdGF0ZW1lbnQoSUFTVFdoaWxlU3RhdGVtZW50IHN0YXRlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdF8uYWRkKHN0YXRlbWVudC5nZXRDb25kaXRpb24oKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldEJvZHkoKSE9bnVsbCkgewotICAgICAgICAgICAgICAgIEZ1bmRWaXNpdG9yIGJvZHlWaXNpdG9yID0gbmV3IEZ1bmRWaXNpdG9yKGxpc3RfKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuZ2V0Qm9keSgpLmFjY2VwdChib2R5VmlzaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NEb1N0YXRlbWVudChJQVNURG9TdGF0ZW1lbnQgc3RhdGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0Xy5hZGQoc3RhdGVtZW50LmdldENvbmRpdGlvbigpKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0Qm9keSgpIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgRnVuZFZpc2l0b3IgYm9keVZpc2l0b3IgPSBuZXcgRnVuZFZpc2l0b3IobGlzdF8pOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5nZXRCb2R5KCkuYWNjZXB0KGJvZHlWaXNpdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QQ0ZHLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBDRkcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkODIxOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBDRkcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmc7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RPTVBQcmFnbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5mYWN0b3J5Lk9NUENGR1Jlc3VsdDsKLQotLyoqCi0gKiBDb250cm9sIEZsb3cgR3JhcGggcmVsYXRlZCB0byBPTVAgQW5hbHlzaXMKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPTVBDRkcKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFBBU1RPTVBQcmFnbWEgICAgICAgICAgcHJhZ21hXyAgICAgICAgPSBudWxsOwotICAgIHByb3RlY3RlZCBJQVNUU3RhdGVtZW50ICAgICAgICAgIHN0YXRlbWVudF8gICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgT01QQ0ZHTm9kZSAgICAgICAgICAgICByb290Tm9kZV8gICAgICA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIE9NUENGR05vZGUgICAgICAgICAgICAgdGVybU5vZGVfICAgICAgPSBudWxsOwotICAgIAotICAgIHByb3RlY3RlZCBPTVBDRkdSZXN1bHQuQ2hhaW4gICAgIHJvb3RDaGFpbl8gPSBudWxsOwotICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0ICAgICAgICAgICAgIHVuY29ubmVjdGVkQ2hhaW5zXyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpbmtlZExpc3QgICAgICAgICAgICAgdW5yZXNvbHZlZENoYWluc18gID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlICAgICAgICAgICAgICBsYWJlbE1hcF8gICAgICAgICAgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBPTVBDRkcoUEFTVE9NUFByYWdtYSAgICAgIHByYWdtYSwgCi0gICAgICAgICAgICAgICAgICBJQVNUU3RhdGVtZW50ICAgICAgc3RhdGVtZW50LCAKLSAgICAgICAgICAgICAgICAgIE9NUENGR1Jlc3VsdC5DaGFpbiByb290Q2hhaW4sCi0gICAgICAgICAgICAgICAgICBMaW5rZWRMaXN0ICAgICAgICAgdW5jb25uZWN0ZWRDaGFpbnMsIAotICAgICAgICAgICAgICAgICAgTGlua2VkTGlzdCAgICAgICAgIHVucmVzb2x2ZWRDaGFpbnMsIAotICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlICAgICAgICAgIGxhYmVsTWFwKQotICAgIHsKLSAgICAgICAgcHJhZ21hXyAgICAgICAgPSBwcmFnbWE7Ci0gICAgICAgIHN0YXRlbWVudF8gICAgID0gc3RhdGVtZW50OwotICAgICAgICByb290Tm9kZV8gICAgICA9IHJvb3RDaGFpbi5nZXRIZWFkTm9kZSgpOwotICAgICAgICB0ZXJtTm9kZV8gICAgICA9IHJvb3RDaGFpbi5nZXRUYWlsTm9kZSgpOwotICAgICAgICAKLSAgICAgICAgcm9vdENoYWluXyAgICAgICAgID0gcm9vdENoYWluOwotICAgICAgICB1bmNvbm5lY3RlZENoYWluc18gPSB1bmNvbm5lY3RlZENoYWluczsKLSAgICAgICAgdW5yZXNvbHZlZENoYWluc18gID0gdW5yZXNvbHZlZENoYWluczsKLSAgICAgICAgbGFiZWxNYXBfICAgICAgICAgID0gbGFiZWxNYXA7Ci0gICAgICAgIAotICAgICAgICBudW1iZXJOb2RlcygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRTdGF0ZW1lbnQgLSBhY2Nlc3NvciB0byBzdGF0ZW1lbnQgZm9yIHRoaXMgY2ZnCi0gICAgICogQHJldHVybiBJQVNUU3RhdGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIElBU1RTdGF0ZW1lbnQgZ2V0U3RhdGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGF0ZW1lbnRfOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRQcmFnbWEgLSBnZXQgdGhlIHByYWdtZSBmb3IgdGhlIGNmZwotICAgICAqIEByZXR1cm4gUEFTVE9NUFByYWdtYQotICAgICAqLwotICAgIHB1YmxpYyBQQVNUT01QUHJhZ21hIGdldFByYWdtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJhZ21hXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0Um9vdCAtIGFjY2VzcyB0aGUgcm9vdCBvZiB0aGUgY2ZnCi0gICAgICogQHJldHVybiAtIE9NUENGR05vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT01QQ0ZHTm9kZSBnZXRSb290KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByb290Tm9kZV87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFRlcm1Ob2RlIC0gZ2V0IHRoZSB0ZXJtaW5hbCBub2RlIChhc3N1bWluZyBvbmUpCi0gICAgICogQHJldHVybiBPTVBDRkdOb2RlCi0gICAgICovCi0gICAgcHVibGljIE9NUENGR05vZGUgZ2V0VGVybU5vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRlcm1Ob2RlXzsKLSAgICB9Ci0gICAgCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmb3IgcHJpbnRpbmcgb3V0IHRoZSBncmFwaAotICAgIAotICAgIHByb3RlY3RlZCBTdGFjayAgICAgICBncmFwaFN0YWNrXyAgICA9IG5ldyBTdGFjaygpOwotICAgIHByb3RlY3RlZCBIYXNoU2V0ICAgICB1c2VkTm9kZXNfICAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcHJvdGVjdGVkIFByaW50U3RyZWFtIGdyYXBoT3V0XyAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgY3VycmVudE51bWJlcl8gPSAwOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHByaW50Q0ZHKFByaW50U3RyZWFtIHByaW50T3V0KQotICAgIHsKLSAgICAgICAgZ3JhcGhPdXRfID0gcHJpbnRPdXQ7Ci0KLSAgICAgICAgdXNlZE5vZGVzXy5jbGVhcigpOwotICAgICAgICAKLSAgICAgICAgbnVtYmVyTm9kZXMoKTsKLSAgICAgICAgCi0gICAgICAgIHZpc2l0R3JhcGgoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG51bWJlck5vZGVzKCkKLSAgICB7Ci0gICAgICAgIGN1cnJlbnROdW1iZXJfID0gMDsKLSAgICAgICAgZ3JhcGhTdGFja18uY2xlYXIoKTsKLSAgICAgICAgZ3JhcGhTdGFja18ucHVzaChyb290Tm9kZV8pOwotICAgICAgICB3aGlsZSghZ3JhcGhTdGFja18uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBPTVBDRkdOb2RlIG5vZGUgPSAoT01QQ0ZHTm9kZSlncmFwaFN0YWNrXy5wb3AoKTsKLSAgICAgICAgICAgIG5vZGUuc2V0SWQoY3VycmVudE51bWJlcl8rKyk7Ci0gICAgICAgICAgICAvLyBBZGQgaW4gb3RoZXIgbm9kZXMKLSAgICAgICAgICAgIE9NUENGR05vZGUgW10gbm9kZXMgPSBub2RlLmdldE91dE5vZGVzKCk7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChub2Rlc1tpXS5nZXRJZCgpPT0tMSkgIC8vIG9ubHkgaWYgbm90IGFzc2lnbmVkIG51bWJlcgotICAgICAgICAgICAgICAgICAgICBncmFwaFN0YWNrXy5wdXNoKG5vZGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmlzaXRHcmFwaCgpCi0gICAgewotICAgICAgICBncmFwaFN0YWNrXy5jbGVhcigpOwotICAgICAgICBncmFwaFN0YWNrXy5wdXNoKHJvb3ROb2RlXyk7Ci0gICAgICAgIHdoaWxlKCFncmFwaFN0YWNrXy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIE9NUENGR05vZGUgbm9kZSA9IChPTVBDRkdOb2RlKWdyYXBoU3RhY2tfLnBvcCgpOwotICAgICAgICAgICAgcHJpbnROb2RlKG5vZGUpOwotICAgICAgICAgICAgdXNlZE5vZGVzXy5hZGQobm9kZSk7Ci0gICAgICAgICAgICAvLyBBZGQgaW4gb3RoZXIgbm9kZXMKLSAgICAgICAgICAgIE9NUENGR05vZGUgW10gbm9kZXMgPSBub2RlLmdldE91dE5vZGVzKCk7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghKG5vZGVzW2ldIGluc3RhbmNlb2YgT01QQ0ZHTm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgIiArIG5vZGVzW2ldLmdldElkKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyBvdXQgbm9kZSBvZiB0eXBlOiAiK25vZGVzW2ldLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF1c2VkTm9kZXNfLmNvbnRhaW5zKG5vZGVzW2ldKSkgIC8vIG9ubHkgaWYgbm90IHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICBncmFwaFN0YWNrXy5wdXNoKG5vZGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcmludE5vZGUoT01QQ0ZHTm9kZSBub2RlKQotICAgIHsKLSAgICAgICAgaW50IG51bSA9IG5vZGUuZ2V0SWQoKTsKLSAgICAgICAgaWYodHJhY2VPbilncmFwaE91dF8ucHJpbnRsbigiTm9kZSAiK251bSsiIC0tLS0tLS0tLS0tLS0tLS0tLSAiK2dldFNob3J0Q2xhc3NOYW1lKG5vZGUuZ2V0Q2xhc3MoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gc29tZSBjb250ZW50cyBvZiB0aGUgbm9kZQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE9NUEJhc2ljQmxvY2spIHsKLSAgICAgICAgICAgIE9NUEJhc2ljQmxvY2sgb2JiID0gKE9NUEJhc2ljQmxvY2spbm9kZTsKLSAgICAgICAgICAgIElBU1RTdGF0ZW1lbnQgW10gc3RtdHMgPSBvYmIuZ2V0U3RhdGVtZW50cygpOwotICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8c3RtdHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtLS0tLS0tLSAiK2dldFNob3J0Q2xhc3NOYW1lKHN0bXRzW2ldLmdldENsYXNzKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBPTVBDRkdOb2RlIFtdIG5vZGVzID0gbm9kZS5nZXRPdXROb2RlcygpOwotICAgICAgICBpZih0cmFjZU9uKWdyYXBoT3V0Xy5wcmludCgiICAgICAgb3V0IHRvIHRoZSBmb2xsb3dpbmcgIitub2Rlcy5sZW5ndGgrIiBub2RlczoiKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IG5vZGVzW2ldLmdldElkKCk7Ci0gICAgICAgICAgICBpZih0cmFjZU9uKWdyYXBoT3V0Xy5wcmludCgiICIraW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIE9NUENGR05vZGUgW10gaW5vZGVzID0gbm9kZS5nZXRJbk5vZGVzKCk7Ci0gICAgICAgIGlmKHRyYWNlT24pZ3JhcGhPdXRfLnByaW50KCIgICAgICBpbiBmcm9tIHRoZSBmb2xsb3dpbmcgIitpbm9kZXMubGVuZ3RoKyIgbm9kZXM6Iik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGlub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gaW5vZGVzW2ldLmdldElkKCk7Ci0gICAgICAgICAgICBpZih0cmFjZU9uKWdyYXBoT3V0Xy5wcmludCgiICIraW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2hvcnRDbGFzc05hbWUoQ2xhc3MgYykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuID0gYy50b1N0cmluZygpOwotICAgICAgICBpbnQgbGFzdEluZGV4ID0gbi5sYXN0SW5kZXhPZignLicpOwotICAgICAgICByZXR1cm4gbi5zdWJzdHJpbmcobGFzdEluZGV4KzEpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBDRkdOb2RlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBDRkdOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjViMTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QQ0ZHTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIG9mIE9NUCBDRkcKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPTVBDRkdOb2RlCi17Ci0gICAgLy8gVXNlIHRoZXNlIHdoaWxlIGJlaW5nIGJ1aWx0Ci0gICAgcHJvdGVjdGVkIExpbmtlZExpc3QgaW5Ob2Rlc18gID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBvdXROb2Rlc18gPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIAotICAgIHByb3RlY3RlZCBpbnQgICAgICAgIGlkXyAgICAgICA9IC0xOyAgIC8vIHVzZWZ1bCBmb3IgY29ycmVsYXRpbmcgcGhhc2UgZGlzcGxheXMKLSAgICAKLSAgICBwcm90ZWN0ZWQgT01QUHJhZ21hTm9kZSAgcHJhZ21hQ29udGV4dF8gPSBudWxsOyAgIC8vIHByYWdtYSBjaGFpbiBoZWFkIGZvciB0aGlzIG5vZGUKLQotICAgIC8qKgotICAgICAqIE9NUENGR05vZGUgLSBjb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIE9NUENGR05vZGUoKQotICAgIHsKLSAgICAgICAgCi0gICAgfQotICAgICAKLSAgICAvKioKLSAgICAgKiBjb25uZWN0VG8gLSBtYWtlICJ0aGlzIiBwb2ludCBmb3J3YXJkIHRvIGlucHV0IG5vZGUgKGZvcndhcmQgY29udHJvbCBmbG93KQotICAgICAqIEBwYXJhbSBub2RlIC0gT01QQ0ZHTm9kZSAodGhhdCBzdWNjZWVkcyB0aGlzIGluIGNvbnRyb2wgZmxvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RUbyhPTVBDRkdOb2RlIG5vZGUpCi0gICAgewotICAgICAgICBpZiAobm9kZT09bnVsbCkgcmV0dXJuOwotICAgICAgICBhZGRPdXROb2RlKG5vZGUpOwotICAgICAgICBub2RlLmFkZEluTm9kZSh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkSW5Ob2RlIC0gYWRkIGFuIGlucHV0IG5vZGUKLSAgICAgKiBAcGFyYW0gaW5Ob2RlIC0gT01QQ0ZHTm9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEluTm9kZShPTVBDRkdOb2RlIGluTm9kZSkKLSAgICB7Ci0gICAgICAgIGlmICghaW5Ob2Rlc18uY29udGFpbnMoaW5Ob2RlKSkKLSAgICAgICAgICAgIGluTm9kZXNfLmFkZChpbk5vZGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBhZGRPdXROb2RlIC0gYWRkIGFuIG91dHB1dCBub2RlCi0gICAgICogQHBhcmFtIG91dE5vZGUgLSBPTVBDRkdOb2RlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3V0Tm9kZShPTVBDRkdOb2RlIG91dE5vZGUpCi0gICAgewotICAgICAgICBpZiAoIW91dE5vZGVzXy5jb250YWlucyhvdXROb2RlKSkKLSAgICAgICAgICAgIG91dE5vZGVzXy5hZGQob3V0Tm9kZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFN1Y2Nlc3NvciAtIHVzZWZ1bCBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gaXQgaXMga25vd24gdGhhdCB0aGVyZSBpcyAxIHN1Y2Nlc3NvcgotICAgICAqICAgICAgICAgICAgICAgIG5vIGNoZWNrIG1hZGUgZm9yIG1vcmUgdGhhbiAxIC0gdXNlZCBpbiBmb2xsb3dpbmcgY2hhaW5zCi0gICAgICogQHJldHVybiBPTVBDRkdOb2RlCi0gICAgICovCi0gICAgcHVibGljIE9NUENGR05vZGUgZ2V0U3VjY2Vzc29yKCkKLSAgICB7Ci0gICAgICAgIGlmIChvdXROb2Rlc18uc2l6ZSgpIT0wKQotICAgICAgICAgICAgcmV0dXJuIChPTVBDRkdOb2RlKShvdXROb2Rlc18uZ2V0KDApKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGhhc1ByZWRlY2Vzc29ycyAtIHRlbGwgaWYgbm9kZSBoYXMgcHJlZGVjZXNzb3JzCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJlZGVjZXNzb3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW5Ob2Rlc18uc2l6ZSgpIT0wKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0SW5Ob2RlcyAtIGFjY2Vzc29yIHRvIGlucHV0IG5vZGVzCi0gICAgICogQHJldHVybiBPTVBDRkdOb2RlIFtdCi0gICAgICovCi0gICAgcHVibGljIE9NUENGR05vZGUgW10gZ2V0SW5Ob2RlcygpCi0gICAgewotICAgICAgIE9NUENGR05vZGUgW10gaW5Ob2Rlc0FycmF5ID0gbmV3IE9NUENGR05vZGVbaW5Ob2Rlc18uc2l6ZSgpXTsKLSAgICAgICBpbnQgY291bnQ9MDsKLSAgICAgICBmb3IoSXRlcmF0b3IgaT1pbk5vZGVzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgeyBpbk5vZGVzQXJyYXlbY291bnQrK10gPSAoT01QQ0ZHTm9kZSlpLm5leHQoKTsgIH0KLSAgICAgICByZXR1cm4gaW5Ob2Rlc0FycmF5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRPdXROb2RlcyAtIGFjY2Vzc29yIHRvIG91dHB1dCBub2RlcwotICAgICAqIEByZXR1cm4gT01QQ0ZHTm9kZSBbXQotICAgICAqLwotICAgIHB1YmxpYyBPTVBDRkdOb2RlIFtdIGdldE91dE5vZGVzKCkKLSAgICB7Ci0gICAgICAgIE9NUENGR05vZGUgW10gb3V0Tm9kZXNBcnJheSA9IG5ldyBPTVBDRkdOb2RlW291dE5vZGVzXy5zaXplKCldOwotICAgICAgICBpbnQgY291bnQ9MDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9b3V0Tm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgeyBvdXROb2Rlc0FycmF5W2NvdW50KytdID0gKE9NUENGR05vZGUpaS5uZXh0KCk7ICB9Ci0gICAgICAgIHJldHVybiBvdXROb2Rlc0FycmF5OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKQotICAgIHsKLSAgICAgICAgaWRfID0gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IHJldHVybiBpZF87IH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcmFnbWFDb250ZXh0KE9NUFByYWdtYU5vZGUgcE5vZGUpIHsgcHJhZ21hQ29udGV4dF8gPSBwTm9kZTsgfQotICAgIAotICAgIHB1YmxpYyBPTVBQcmFnbWFOb2RlIGdldFByYWdtYUNvbnRleHQoKSB7IHJldHVybiBwcmFnbWFDb250ZXh0XzsgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL09NUERGUy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QREZTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Yjk5MWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QREZTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBEb2VzIGEgZGVwdGggZmlyc3Qgc2VhcmNoIHRocm91Z2ggYW4gT01QQ0ZHLAotICogZ2l2ZW4gdGhlIGluaXRpYWwgbm9kZQotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9NUERGUwotewotICAgIHByb3RlY3RlZCBPTVBDRkdOb2RlICAgIHN0YXJ0Tm9kZV8gICAgPSBudWxsOwotICAgIHByb3RlY3RlZCBIYXNoU2V0ICAgICAgIHZpc2l0ZWRfICAgICAgPSBuZXcgSGFzaFNldCgpOwotICAgIAotICAgIHByb3RlY3RlZCBTdGFjayAgICAgICAgIGN1cnJlbnROb2Rlc18gPSBuZXcgU3RhY2soKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05USU5VRSAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTS0lQICAgICAgID0gMTsgIC8vIFNLSVAgZm9sbG93aW5nIGN1cnJlbnQgbm9kZSBmdXJ0aGVyCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJPUlQgICAgICA9IDI7ICAvLyBhYm9yZCBERlMKLSAgICAKLSAgICAvKioKLSAgICAgKiBPTVBERlMgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBzdGFydE5vZGUgLSBPTVBDRkdOb2RlCi0gICAgICovCi0gICAgcHVibGljIE9NUERGUyhPTVBDRkdOb2RlIHN0YXJ0Tm9kZSkKLSAgICB7Ci0gICAgICAgIHN0YXJ0Tm9kZV8gPSBzdGFydE5vZGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHN0YXJ0V2Fsa2luZyAtIG1ldGhvZCB0byBzdGFydCB0aGUgZGZzIHdhbGtpbmcKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2Fsa2luZygpCi0gICAgewotICAgICAgICB3YWxrREZTKHN0YXJ0Tm9kZV8pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB3YWxrREZTIC0gcmVjdXJzaXZlbHkgd2FsayB0aGUgdHJlZSB2aXNpdGluZyBlYWNoIG5vZGUgMSB0aW1lCi0gICAgICogICAgICAgICAgIE5PVEU6IG9ubHkgY29ubmVjdGVkIGNvbXBvbmVudCB0byBzdGFydCBub2RlCi0gICAgICogQHBhcmFtIG5vZGUgLSBPTVBDRkdOb2RlCi0gICAgICogQHJldHVybiBpbnQgICAgKGNvZGUgdG8gY29udGludWUsIHNraXAsIG9yIGFib3J0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgd2Fsa0RGUyhPTVBDRkdOb2RlIG5vZGUpCi0gICAgewotICAgICAgICBpZiAodmlzaXRlZF8uY29udGFpbnMobm9kZSkpICByZXR1cm4gQ09OVElOVUU7Ci0gICAgICAgIAotICAgICAgICBjdXJyZW50Tm9kZXNfLnB1c2gobm9kZSk7ICAvLyBzZXRzIHRoZSBuZXcgY29udGV4dCBvbiB0aGUgc3RhY2sKLSAgICAgICAgaW50IGNvZGUgPSB2aXNpdChub2RlKTsKLSAgICAgICAgdmlzaXRlZF8uYWRkKG5vZGUpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvZGU9PVNLSVApICB7IGN1cnJlbnROb2Rlc18ucG9wKCk7ICByZXR1cm4gQ09OVElOVUU7IH0gIC8vIHdlIG9ubHkgc2tpcCB0aGlzIGxldmVsLCBjb250aW51ZSBvdGhlcnMKLSAgICAgICAgaWYgKGNvZGU9PUFCT1JUKSB7IGN1cnJlbnROb2Rlc18ucG9wKCk7ICByZXR1cm4gQUJPUlQ7ICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9NUENGR05vZGUgW10gb3V0Tm9kZXMgPSBub2RlLmdldE91dE5vZGVzKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPG91dE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgIGludCBpQ29kZSA9IHdhbGtERlMob3V0Tm9kZXNbaV0pOwotICAgICAgICAgICBpZiAoaUNvZGU9PUFCT1JUKSB7IGN1cnJlbnROb2Rlc18ucG9wKCk7ICByZXR1cm4gQUJPUlQ7ICB9IC8vIGNvZGUgY2Fubm90IGJlIHNraXAKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50Tm9kZXNfLnBvcCgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIENPTlRJTlVFOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXROb2RlU3RhY2sgLSBnZXQgdGhlIGN1cnJlbnQgbm9kZSBzdGFjayBjb250ZXh0Ci0gICAgICogQHJldHVybiBPTVBDRkdOb2RlIFtdCi0gICAgICovCi0gICAgcHVibGljIE9NUENGR05vZGUgW10gZ2V0Tm9kZVN0YWNrKCkKLSAgICB7Ci0gICAgICAgIE9NUENGR05vZGUgW10gbCA9IG5ldyBPTVBDRkdOb2RlW2N1cnJlbnROb2Rlc18uc2l6ZSgpXTsKLSAgICAgICAgaW50IGNvdW50PTA7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpPWN1cnJlbnROb2Rlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgICAgICAgIGxbY291bnQrK10gPSAoT01QQ0ZHTm9kZSlpLm5leHQoKTsKLSAgICAgICAgcmV0dXJuIGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldE5vZGVTdGFja1NpemUgLSBnZXQgdGhlIHNpemUgb2YgdGhlIHN0YWNrCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVTdGFja1NpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnROb2Rlc18uc2l6ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBpc1Zpc2l0ZWQgLSBkZXRlcm1pbmUgaWYgbm9kZSBoYXMgYmVlbiB2aXNpdGVkIG9uIHdhbGsKLSAgICAgKiBAcGFyYW0gbm9kZSAtIE9NUENGR05vZGUKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2l0ZWQoT01QQ0ZHTm9kZSBub2RlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZpc2l0ZWRfLmNvbnRhaW5zKG5vZGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2aXNpdCAtIHZpc2l0IG1ldGhvZCAtIHdoYXQgdGhlIHVzZXIgdXN1YWxseSBvdmVycmlkZXMKLSAgICAgKiBAcGFyYW0gbm9kZSAtIE9NUENGR05vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHZpc2l0KE9NUENGR05vZGUgbm9kZSk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QRXhwcmVzc2lvbkJsb2NrLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBFeHByZXNzaW9uQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzNzg4Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBFeHByZXNzaW9uQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbkxpc3Q7Ci0vKioKLSAqIEhvbGRzIGEgY29uc29saWRhdGVkIChjb2Fyc2UpIGJhc2ljIGJsb2NrIGZvciBjb25jdXJyZW5jeSBhbmFseXNpcwotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIE9NUEV4cHJlc3Npb25CbG9jayBleHRlbmRzIE9NUENGR05vZGUKLXsKLSAgICAvKiogVXNlIHRoaXMgd2hpbGUgYnVpbGRpbmcgKi8KLSAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBleHByZXNzaW9uc18gPSBuZXcgTGlua2VkTGlzdCgpOyAvLyBvZiBJQVNURXhwcmVzc2lvbnMgKGZvciBub3cpCi0KLSAgICBwdWJsaWMgT01QRXhwcmVzc2lvbkJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZEV4cHJlc3Npb24gLSBhZGQgYSBzdGF0ZW1lbnQgdG8gdGhlIGJhc2ljIGJsb2NrCi0gICAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBJQVNURXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEV4cHJlc3Npb24oSUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIGV4cHJlc3Npb25zXy5hZGQoZXhwcmVzc2lvbik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZEV4cHJlc3Npb24gLSBidXQgZm9yIGFuIGV4cHJlc3Npb24gbGlzdAotICAgICAqIEBwYXJhbSBleHByZXNzaW9uIC0gSUFTVEV4cHJlc3Npb25MaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXhwcmVzc2lvbihJQVNURXhwcmVzc2lvbkxpc3QgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIElBU1RFeHByZXNzaW9uIFtdIGxpc3QgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChsaXN0W2ldIGluc3RhbmNlb2YgSUFTVEV4cHJlc3Npb25MaXN0KQotICAgICAgICAgICAgICAgIGFkZEV4cHJlc3Npb24oKElBU1RFeHByZXNzaW9uTGlzdClsaXN0W2ldKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uKGxpc3RbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldEV4cHJlc3Npb25zIC0gYWNjZXNzb3IgdG8gYXJyYXkgb2Ygc3RhdGVtZW50cwotICAgICAqIEByZXR1cm4gSUFTVEV4cHJlc3Npb24gW10KLSAgICAgKi8KLSAgICBwdWJsaWMgSUFTVEV4cHJlc3Npb24gW10gZ2V0RXhwcmVzc2lvbnMoKQotICAgIHsKLSAgICAgICBJQVNURXhwcmVzc2lvbiBbXSBsaXN0ID0gbmV3IElBU1RFeHByZXNzaW9uW2V4cHJlc3Npb25zXy5zaXplKCldOwotICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgZm9yKEl0ZXJhdG9yIGk9ZXhwcmVzc2lvbnNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgbGlzdFtjb3VudCsrXSA9IChJQVNURXhwcmVzc2lvbilpLm5leHQoKTsKLSAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBQcmFnbWFOb2RlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9PTVBQcmFnbWFOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZWZhZmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvT01QUHJhZ21hTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RPTVBQcmFnbWE7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPTVBQcmFnbWFOb2RlIGV4dGVuZHMgT01QQ0ZHTm9kZQotewotICAgIHByb3RlY3RlZCBQQVNUT01QUHJhZ21hICAgICBwcmFnbWFfICAgICAgICAgID0gbnVsbDsgICAvLyBwcmFnbWEgd2UgYXJlIGhvbGRpbmcKLSAgICBwcm90ZWN0ZWQgT01QUHJhZ21hTm9kZSAgICAgY29udGV4dFByZWRfICAgICA9IG51bGw7ICAgLy8gYmFja3dhcmQgY2hhaW4gb2YgY29udGV4dAotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuICAgICAgICAgICBpbXBsaWNpdEJhcnJpZXJfID0gZmFsc2U7ICAgLy8gdXNlZCB0byB0aWUgcGFyYWxsZWwvZm9yL3NlY3Rpb25zIGVuZAotICAgIAotICAgIC8qKgotICAgICAqIE9NUFByYWdtYU5vZGUgLSBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBwcmFnbWEgLSBQQVNUT01QUHJhZ21hCi0gICAgICogQHBhcmFtIGNvbnRleHRQcmVkZWNlc3NvciAtIE9NUFByYWdtYU5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT01QUHJhZ21hTm9kZShQQVNUT01QUHJhZ21hIHByYWdtYSwgT01QUHJhZ21hTm9kZSBjb250ZXh0UHJlZGVjZXNzb3IpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBwcmFnbWFfICAgICAgID0gcHJhZ21hOwotICAgICAgICBjb250ZXh0UHJlZF8gPSBjb250ZXh0UHJlZGVjZXNzb3I7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE9NUFByYWdtYU5vZGUgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBwcmFnbWEgLSBQQVNUT01QUHJhZ21hCi0gICAgICovCi0gICAgcHVibGljIE9NUFByYWdtYU5vZGUoUEFTVE9NUFByYWdtYSBwcmFnbWEpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBwcmFnbWFfICAgICA9IHByYWdtYTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9NUFByYWdtYU5vZGUoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW1wbGljaXRCYXJyaWVyXyA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldFByYWdtYSAtIGFjY2Vzc29yIHRvIHByYWdtYQotICAgICAqIEByZXR1cm4gUEFTVE9NUFByYWdtYQotICAgICAqLwotICAgIHB1YmxpYyBQQVNUT01QUHJhZ21hIGdldFByYWdtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJhZ21hXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXNJbXBsaWNpdEJhcnJpZXIgLSByZXR1cm5zIHdoZXRoZXIgaWYgaXMgaW1wbGljaXQgYmFycmllcgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRCYXJyaWVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsaWNpdEJhcnJpZXJfOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRDb250ZXh0UHJlZGVjZXNzb3IgLSBnZXQgdGhlIHByYWdtYSBjb250ZXh0IHByZWRlY2Vzc29yCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPTVBQcmFnbWFOb2RlIGdldENvbnRleHRQcmVkZWNlc3NvcigpCi0gICAgewotICAgICAgICByZXR1cm4gY29udGV4dFByZWRfOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRDb250ZXh0IC0gZ2V0IHRoZSBsaXN0IG9mIHJlbGF0ZWQgcHJhZ21hIC0gbW9zdCByZWNlbnQgdG8gb2xkZXN0IFswLS1OXQotICAgICAqIEByZXR1cm4gT01QUHJhZ21hTm9kZSBbXQotICAgICAqLwotICAgIHB1YmxpYyBPTVBQcmFnbWFOb2RlIFtdIGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgT01QUHJhZ21hTm9kZSBwcmVkID0gdGhpczsKLSAgICAgICAgd2hpbGUocHJlZCE9bnVsbCkgewotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIHByZWQ9cHJlZC5nZXRDb250ZXh0UHJlZGVjZXNzb3IoKTsgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBPTVBQcmFnbWFOb2RlIFtdIGxpc3QgPSBuZXcgT01QUHJhZ21hTm9kZVtjb3VudF07Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgcHJlZCA9IHRoaXM7Ci0gICAgICAgIHdoaWxlKHByZWQhPW51bGwpIHsKLSAgICAgICAgICAgIGxpc3RbaSsrXSA9IHByZWQ7Ci0gICAgICAgICAgICBwcmVkPXByZWQuZ2V0Q29udGV4dFByZWRlY2Vzc29yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgaWYgKHByYWdtYV8hPW51bGwpICByZXR1cm4gcHJhZ21hXy5nZXRUeXBlKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGltcGxpY2l0QmFycmllcl8pICByZXR1cm4gImltcGxpY2l0IGJhcnJpZXIiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvRmlsZUNvbmN1cnJlbmN5QW5hbHlzaXMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvRmlsZUNvbmN1cnJlbmN5QW5hbHlzaXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwMmVmNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L0ZpbGVDb25jdXJyZW5jeUFuYWx5c2lzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLmZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGdW5jdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVE9NUFByYWdtYTsKLQotCi0vKioKLSAqIEJ1aWxkIGFuIGFuYWx5c2lzIGZvciBhIGdpdmVuIGZpbGUKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlQ29uY3VycmVuY3lBbmFseXNpcwotewotICAgIHByb3RlY3RlZCBJQVNUVHJhbnNsYXRpb25Vbml0ICAgICAgICAgYXN0VHJhbnNVbml0XyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIElGaWxlICAgICAgICAgICAgICAgICAgICAgICBpRmlsZV8gICAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgUEFTVE9NUFByYWdtYSAgICAgW10gICAgICAgIHByYWdtYXNfICAgICAgPSBudWxsOwotICAgIHByb3RlY3RlZCBGdW5jdGlvbkNvbmN1cnJlbmN5QW5hbHlzaXMgICBbXSBhbmFseXNlc18gICAgID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbiA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIEZpbGVDb25jdXJyZW5jeUFuYWx5c2lzIC0gSG9sZHMgYW5hbHlzaXMgZm9yIGFuIGVudGlyZSBmaWxlCi0gICAgICogQHBhcmFtIGFzdFRyYW5zVW5pdAotICAgICAqIEBwYXJhbSBpRmlsZQotICAgICAqIEBwYXJhbSBvbXBQcmFnbWFzCi0gICAgICovCi0gICAgcHVibGljIEZpbGVDb25jdXJyZW5jeUFuYWx5c2lzKElBU1RUcmFuc2xhdGlvblVuaXQgYXN0VHJhbnNVbml0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgICAgICAgICAgICAgICBpRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFTVE9NUFByYWdtYSBbXSAgICBvbXBQcmFnbWFzKQotICAgIHsKLSAgICAgICAgYXN0VHJhbnNVbml0XyAgID0gYXN0VHJhbnNVbml0OwotICAgICAgICBpRmlsZV8gICAgICAgICAgPSBpRmlsZTsKLSAgICAgICAgcHJhZ21hc18gICAgICAgID0gb21wUHJhZ21hczsKLSAgICAgICAgYnVpbGRGaWxlQW5hbHlzaXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0Tm9kZXNDb25jdXJyZW50VG8gLSBnZXQgYWxsIG5vZGVzIGNvbmN1cnJlbnQgdG8gZ2l2ZW4gbm9kZQotICAgICAqIEBwYXJhbSBub2RlIC0gSUFTVE5vZGUKLSAgICAgKiBAcmV0dXJuIFNldAotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZ2V0Tm9kZXNDb25jdXJyZW50VG8oSUFTVE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICAgIC8vIGRlc2lnbmVkIHNvIHdlIHVzZSB0aGUgMXN0IG5vbi1udWxsLiAKLSAgICAgICAgZm9yKGludCBpPTA7IGk8YW5hbHlzZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTZXQgcyA9IGFuYWx5c2VzX1tpXS5nZXROb2Rlc0NvbmN1cnJlbnRUbyhub2RlKTsKLSAgICAgICAgICAgIGlmIChzIT1udWxsKSAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogYnVpbGRGaWxlQW5hbHlzaXMgLSBjb25jdXJyZW5jeSBhbmFseXNpcwotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRGaWxlQW5hbHlzaXMoKQotICAgIHsKLSAgICAgICAgRGVmVmlzaXRvciBkdiA9IG5ldyBEZWZWaXNpdG9yKGFzdFRyYW5zVW5pdF8sIGlGaWxlXywgcHJhZ21hc18pOwotICAgICAgICBhbmFseXNlc18gPSBkdi5idWlsZEFuYWx5c2VzKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCB0aGUgcGhhc2UgYW5hbHlzaXMKLSAgICAgICAgZm9yKGludCBpPTA7IGk8YW5hbHlzZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGdW5jdGlvbkNvbmN1cnJlbmN5QW5hbHlzaXMgb2NhID0gYW5hbHlzZXNfW2ldOwotICAgICAgICAgICAgb2NhLmRvUGhhc2VBbmFseXNpcygpOwotICAgICAgICAgICAgaWYgKHRyYWNlT24pIG9jYS5wcmludEFuYWx5c2lzKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ2xhc3M6IERlZlZpc2l0b3IgLSB1c2VkIHRvIGxvY2F0ZSBmdW5jdGlvbnMgd2l0aGluIGZpbGUsIGZvciAKLSAgICAvLyAgICAgICAgY29uY3VycmVuY3kgYW5hbHlzaXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJQVNUVHJhbnNsYXRpb25Vbml0ICAgICB0cmFuc1VuaXRfICAgID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBJRmlsZSAgICAgICAgICAgICAgICAgICBpRmlsZV8gICAgICAgID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBQQVNUT01QUHJhZ21hICAgICAgIFtdICBwTGlzdF8gICAgICAgID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0ICAgICAgICAgICAgICBhbmFseXNpc0xpc3RfID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBEZWZWaXNpdG9yKElBU1RUcmFuc2xhdGlvblVuaXQgdHJhbnNVbml0LCBJRmlsZSBpRmlsZSwgUEFTVE9NUFByYWdtYSBbXSBwTGlzdCkKLSAgICAgICAgeyB0cmFuc1VuaXRfID0gdHJhbnNVbml0OyBwTGlzdF8gPSBwTGlzdDsgaUZpbGVfPWlGaWxlOyB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogYnVpbGRBbmFseXNlcyAtIGJ1aWxkIG9uZSBhbmFseXNpcyBvYmplY3QgcGVyIGZ1bmN0aW9uIGZvdW5kIGluIGZpbGUKLSAgICAgICAgICogQHJldHVybgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcyBbXSBidWlsZEFuYWx5c2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotICAgICAgICAgICAgdHJhbnNVbml0Xy5hY2NlcHQodGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcyBbXSBsaXN0ID0gbmV3IEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpc1thbmFseXNpc0xpc3RfLnNpemUoKV07Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGk9YW5hbHlzaXNMaXN0Xy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICAgICAgbGlzdFtjb3VudCsrXSA9IChGdW5jdGlvbkNvbmN1cnJlbmN5QW5hbHlzaXMpaS5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHZpc2l0IC0gQVNUVmlzaXRvciBtZXRob2QgY2FwdHVyZSB0byBmZWVkIGluZm9ybWF0aW9uIGludG8gYW5hbHlzaXMKLSAgICAgICAgICogQHBhcmFtIGRlY2xhcmF0aW9uIC0gSUFTVERlY2xhcmF0aW9uCi0gICAgICAgICAqIEByZXR1cm4gaW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IHZpc2l0KElBU1REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkRlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICBJQVNURnVuY3Rpb25EZWZpbml0aW9uIGZEZWYgPSAoSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbilkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyMSA9IGZEZWYuZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0cjIgPSBpRmlsZV8uZ2V0UmF3TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyMS5lcXVhbHMoc3RyMikpIHsKLSAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Db25jdXJyZW5jeUFuYWx5c2lzIGFuYWx5c2lzID0gbmV3IEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcyhmRGVmLCBwTGlzdF8pOwotICAgICAgICAgICAgICAgICAgICBhbmFseXNpc0xpc3RfLmFkZChhbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L0ZpbGVTdGF0ZW1lbnRNYXAuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvRmlsZVN0YXRlbWVudE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNhY2E0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvRmlsZVN0YXRlbWVudE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5mYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5DRE9NOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5JQVNUU2VydmljZVByb3ZpZGVyLlVuc3VwcG9ydGVkRGlhbGVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQnJlYWtTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQ2FzZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDb21wb3VuZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDb250aW51ZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1REb1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUSWZTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RSZXR1cm5TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN3aXRjaFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUV2hpbGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQnVpbGRzIGFuZCBpbnRlcmZhY2VzIG1hcCBmcm9tIGZpbGUgbG9jYXRpb24gdG8gc3RhdGVtZW50Ci0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN0YXRlbWVudE1hcCBleHRlbmRzIFN0YXRlbWVudE1hcAotewotICAgIHByb3RlY3RlZCBJQVNUVHJhbnNsYXRpb25Vbml0IHR1XyAgICAgICA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyAgICAgICAgICAgICAgZmlsZW5hbWVfID0gIiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlU3RhdGVtZW50TWFwIC0gY29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gZmlsZSAgIC0gSUZpbGUKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRGlhbGVjdEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU3RhdGVtZW50TWFwKElGaWxlIGZpbGUpIHRocm93cyBVbnN1cHBvcnRlZERpYWxlY3RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHR1XyA9IENET00uZ2V0SW5zdGFuY2UoKS5nZXRUcmFuc2xhdGlvblVuaXQoZmlsZSk7Ci0gICAgICAgIGZpbGVuYW1lXz10dV8uZ2V0RmlsZVBhdGgoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmlsZVN0YXRlbWVudE1hcCAtIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHR1IC0gSUFTVFRyYW5zbGF0aW9uVW5pdAotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU3RhdGVtZW50TWFwKElBU1RUcmFuc2xhdGlvblVuaXQgdHUpCi0gICAgewotICAgICAgICB0dV8gPSB0dTsKLSAgICAgICAgZmlsZW5hbWVfPXR1Xy5nZXRGaWxlUGF0aCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBidWlsZE1hcCAtIGJ1aWxkIHRoZSBhY3R1YWwgbWFwCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZE1hcCgpCi0gICAgewotICAgICAgICBWaXNpdG9yIHYgPSBuZXcgVmlzaXRvcigpOwotICAgICAgICB0dV8uYWNjZXB0KHYpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRTaG9ydENsYXNzTmFtZShDbGFzcyBjKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG4gPSBjLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBsYXN0SW5kZXggPSBuLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIHJldHVybiBuLnN1YnN0cmluZyhsYXN0SW5kZXgrMSk7Ci0gICAgfQotCi0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gVmlzaXRvciAtIHRvIHZpc2l0IGFsbCBzdGF0ZW1lbnRzIGFuZCBzb21lIGV4cHJlc3Npb25zCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJvdGVjdGVkIGNsYXNzIFZpc2l0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yCi0gICAgewotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpc2l0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaG91bGRWaXNpdFN0YXRlbWVudHMgID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQpIAotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChmaWxlbmFtZV89PW51bGwgfHwgIShmaWxlbmFtZV8uZXF1YWxzKHN0YXRlbWVudC5nZXRDb250YWluaW5nRmlsZW5hbWUoKSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVElmU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0lmU3RhdGVtZW50KChJQVNUSWZTdGF0ZW1lbnQpc3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19TS0lQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTd2l0Y2hTdGF0ZW1lbnQoKElBU1RTd2l0Y2hTdGF0ZW1lbnQpc3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19TS0lQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVENhc2VTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQ2FzZVN0YXRlbWVudCgoSUFTVENhc2VTdGF0ZW1lbnQpc3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRm9yU3RhdGVtZW50KChJQVNURm9yU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RXaGlsZVN0YXRlbWVudCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NXaGlsZVN0YXRlbWVudCgoSUFTVFdoaWxlU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1REb1N0YXRlbWVudCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NEb1N0YXRlbWVudCgoSUFTVERvU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVEJyZWFrU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgYWRkKHN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBhZGQoc3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RSZXR1cm5TdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBhZGQoc3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkKHN0YXRlbWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0lmU3RhdGVtZW50KElBU1RJZlN0YXRlbWVudCBzdGF0ZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChzdGF0ZW1lbnQuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0VGhlbkNsYXVzZSgpIT1udWxsKSB7Ci0gICAgICAgICAgICAgIFZpc2l0b3IgdGhlblZpc2l0b3IgPSBuZXcgVmlzaXRvcigpOwotICAgICAgICAgICAgICBzdGF0ZW1lbnQuZ2V0VGhlbkNsYXVzZSgpLmFjY2VwdCh0aGVuVmlzaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldEVsc2VDbGF1c2UoKSE9bnVsbCkgewotICAgICAgICAgICAgICBWaXNpdG9yIGVsc2VWaXNpdG9yID0gbmV3IFZpc2l0b3IoKTsKLSAgICAgICAgICAgICAgc3RhdGVtZW50LmdldEVsc2VDbGF1c2UoKS5hY2NlcHQoZWxzZVZpc2l0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU3dpdGNoU3RhdGVtZW50KElBU1RTd2l0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoc3RhdGVtZW50LmdldENvbnRyb2xsZXJFeHByZXNzaW9uKCkpOwotICAgICAgICAgICAgVmlzaXRvciAgYm9keVZpc2l0b3IgPSBuZXcgVmlzaXRvcigpOwotICAgICAgICAgICAgc3RhdGVtZW50LmdldEJvZHkoKS5hY2NlcHQoYm9keVZpc2l0b3IpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2FzZVN0YXRlbWVudChJQVNUQ2FzZVN0YXRlbWVudCBzdGF0ZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZvclN0YXRlbWVudChJQVNURm9yU3RhdGVtZW50IHN0YXRlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKHN0YXRlbWVudC5nZXRDb25kaXRpb25FeHByZXNzaW9uKCkpOwotICAgICAgICAgICAgYWRkKHN0YXRlbWVudC5nZXRJdGVyYXRpb25FeHByZXNzaW9uKCkpOwotICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5nZXRJbml0aWFsaXplclN0YXRlbWVudCgpIT1udWxsKSB7Ci0gICAgICAgICAgICAgIFZpc2l0b3IgaW5pdFZpc2l0b3IgPSBuZXcgVmlzaXRvcigpOwotICAgICAgICAgICAgICBzdGF0ZW1lbnQuZ2V0SW5pdGlhbGl6ZXJTdGF0ZW1lbnQoKS5hY2NlcHQoaW5pdFZpc2l0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5nZXRCb2R5KCkhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBWaXNpdG9yIGJvZHlWaXNpdG9yID0gbmV3IFZpc2l0b3IoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuZ2V0Qm9keSgpLmFjY2VwdChib2R5VmlzaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NXaGlsZVN0YXRlbWVudChJQVNUV2hpbGVTdGF0ZW1lbnQgc3RhdGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoc3RhdGVtZW50LmdldENvbmRpdGlvbigpKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0Qm9keSgpIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgVmlzaXRvciBib2R5VmlzaXRvciA9IG5ldyBWaXNpdG9yKCk7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmdldEJvZHkoKS5hY2NlcHQoYm9keVZpc2l0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRG9TdGF0ZW1lbnQoSUFTVERvU3RhdGVtZW50IHN0YXRlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKHN0YXRlbWVudC5nZXRDb25kaXRpb24oKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldEJvZHkoKSE9bnVsbCkgewotICAgICAgICAgICAgICAgIFZpc2l0b3IgYm9keVZpc2l0b3IgPSBuZXcgVmlzaXRvcigpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5nZXRCb2R5KCkuYWNjZXB0KGJvZHlWaXNpdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRJbmZvcm1hdGlvbihJQVNUTm9kZSBub2RlLCBQcmludFN0cmVhbSBvdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY2F0aW9uIGw9Z2V0TG9jYXRpb24obm9kZSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlbWVudDogIitnZXRTaG9ydENsYXNzTmFtZShub2RlLmdldENsYXNzKCkpKwotICAgICAgICAgICAgICAgICAgICAiIGxvYz0oIitsLmxvd18rIiwiK2wuaGlnaF8rIikgICBmaWxlPSIrbm9kZS5nZXRDb250YWluaW5nRmlsZW5hbWUoKSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvRnVuY3Rpb25Db25jdXJyZW5jeUFuYWx5c2lzLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L0Z1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU1MTA2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvRnVuY3Rpb25Db25jdXJyZW5jeUFuYWx5c2lzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLmZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RPTVBQcmFnbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVFByYWdtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUENGRzsKLQotCi0vKioKLSAqIENvbmN1cnJlbmN5IEFuYWx5c2lzIGZvciBhIGdpdmVuIGZ1bmN0aW9uCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcyBleHRlbmRzIEFTVFZpc2l0b3IKLXsKLSAgICBwcm90ZWN0ZWQgSUFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBmRGVmXyAgICAgICAgICAgICAgPSBudWxsOwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgICAgICAgICAgICAgIHByYWdtYVJlZ2lvbk1hcF8gICA9IG51bGw7ICAvLyBtYXBzIHJlZ2lvbiB0byBvbXAgcHJhZ21hCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSAgICAgICAgICAgICAgcHJhZ21hTG9jYXRpb25NYXBfID0gbnVsbDsgIC8vIG1hcHMgc3RtdCB0byBzZXQgb2YgcHJhZ21hcwotICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0ICAgICAgICAgICAgIGNvbXBvbmVudHNfICAgICAgICA9IG5ldyBMaW5rZWRMaXN0KCk7ICAgLy8gb2YgUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcydzCi0KLSAgICBwdWJsaWMgRnVuY3Rpb25Db25jdXJyZW5jeUFuYWx5c2lzKElBU1RGdW5jdGlvbkRlZmluaXRpb24gZkRlZiwgUEFTVE9NUFByYWdtYSBbXSBwTGlzdCkKLSAgICB7Ci0gICAgICAgIGZEZWZfICAgID0gZkRlZjsKLSAgICAgICAgcHJhZ21hUmVnaW9uTWFwXyAgID0gYnVpbGRSZWdpb25NYXAocExpc3QpOwotICAgICAgICBwcmFnbWFMb2NhdGlvbk1hcF8gPSBidWlsZExvY2F0aW9uTWFwKHBMaXN0KTsKLSAgICAgICAgCi0gICAgICAgIHNob3VsZFZpc2l0U3RhdGVtZW50cyAgID0gdHJ1ZTsKLSAgICAgICAgZkRlZl8uYWNjZXB0KHRoaXMpOwotICAgIH0KLSAgICAgCi0gICAgLyoqCi0gICAgICogYWRkQ29tcG9uZW50IC0gYWRkIGEgY29tcG9uZW50IHRvIHRoaXMgYW5hbHlzaXMKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IC0gUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRDb21wb25lbnQoUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoIWNvbXBvbmVudHNfLmNvbnRhaW5zKGNvbXBvbmVudCkpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHNfLmFkZChjb21wb25lbnQpOwotICAgICAgICAgICAgY29tcG9uZW50LnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRDb21wb25lbnRzIC0gZ2V0IHRoZSBsaXN0IG9mIGV4aXN0aW5nIGNvbXBvbmVudHMKLSAgICAgKiBAcmV0dXJuIFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyBbXSBnZXRDb21wb25lbnRzKCkKLSAgICB7Ci0gICAgICAgIFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMgW10gbGlzdCA9IG5ldyBSZWdpb25Db25jdXJyZW5jeUFuYWx5c2lzW2NvbXBvbmVudHNfLnNpemUoKV07Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBsaXN0W2ldID0gKFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMpY29tcG9uZW50c18uZ2V0KGkpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZG9QaGFzZUFuYWx5c2lzIC0gZm9yIGVhY2ggY29tcG9uZW50Ci0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1BoYXNlQW5hbHlzaXMoKQotICAgIHsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9Y29tcG9uZW50c18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgIFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMgb2NjID0gKFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMpaS5uZXh0KCk7Ci0gICAgICAgICAgIG9jYy5kb1BoYXNlQW5hbHlzaXMoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXROb2Rlc0NvbmN1cnJlbnRUbyAtIGdldCBhbGwgbm9kZXMgY29uY3VycmVudCB0byBnaXZlbiBub2RlCi0gICAgICogQHBhcmFtIG5vZGUgLSBJQVNUTm9kZQotICAgICAqIEByZXR1cm4gU2V0Ci0gICAgICovCi0gICAgcHVibGljIFNldCBnZXROb2Rlc0NvbmN1cnJlbnRUbyhJQVNUTm9kZSBub2RlKQotICAgIHsKLSAgICAgICAgLy8gZGVzaWduZWQgc28gd2UgdXNlIHRoZSAxc3Qgbm9uLW51bGwuICBDb21wb25lbnRzIGFyZSBhc3N1bWVkIGRpc2pvaW50IG5vdy4KLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9Y29tcG9uZW50c18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZWdpb25Db25jdXJyZW5jeUFuYWx5c2lzIGNvbXBvbmVudCA9IChSZWdpb25Db25jdXJyZW5jeUFuYWx5c2lzKWkubmV4dCgpOwotICAgICAgICAgICAgU2V0IHMgPSBjb21wb25lbnQuZ2V0Tm9kZXNDb25jdXJyZW50VG8obm9kZSk7Ci0gICAgICAgICAgICBpZiAocyE9bnVsbCkgIHJldHVybiBzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByaW50QW5hbHlzaXMoUHJpbnRTdHJlYW0gcHMpCi0gICAgewotICAgICAgICBpbnQgY291bnQ9MDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9Y29tcG9uZW50c18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZWdpb25Db25jdXJyZW5jeUFuYWx5c2lzIG9jYyA9IChSZWdpb25Db25jdXJyZW5jeUFuYWx5c2lzKWkubmV4dCgpOwotICAgICAgICAgICAgcHMucHJpbnRsbigiQ29tcG9uZW50ICIrY291bnQrIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgICAgICBvY2MucHJpbnRDb21wb25lbnQocHMpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogYnVpbGRSZWdpb25NYXAgLSBidWlsZCB0aGUgcmVnaW9uLS0+cHJhZ21hIG1hcCBmb3IgdGhpcyBmdW5jdGlvbgotICAgICAqIEBwYXJhbSBwTGlzdCAtIFBBU1RQcmFnbWEgW10gcExpc3QgW29idGFpbmFibGUgZnJvbSBPcGVuTVBBbmFseXNpc01hbmFnZXJdCi0gICAgICogQHJldHVybiBIYXNodGFibGUgKG1hcHBpbmcgSUFTVE5vZGUtLT5QQVNUT01QUHJhZ21hIGZvciB0aGlzIGZ1bmN0aW9uKQotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgYnVpbGRSZWdpb25NYXAoUEFTVFByYWdtYSBbXSBwTGlzdCkgCi0gICAgewotICAgICAgICBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAKLSAgICAgICAgZm9yKGludCBpPTA7IGk8cExpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwTGlzdFtpXSBpbnN0YW5jZW9mIFBBU1RPTVBQcmFnbWEpIHsKLSAgICAgICAgICAgICAgICBQQVNUT01QUHJhZ21hIHByYWdtYSA9IChQQVNUT01QUHJhZ21hKXBMaXN0W2ldOwotICAgICAgICAgICAgICAgIElBU1ROb2RlICAgICAgcmVnaW9uID0gcHJhZ21hLmdldFJlZ2lvbigpOwotICAgICAgICAgICAgICAgIGlmIChyZWdpb24hPW51bGwgJiYgcHJhZ21hLmlzQ29tcGlsZWQoKSAmJiBpc1JlZ2lvbkRlZmluZWRJbkZjdG4ocmVnaW9uKSkKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChyZWdpb24sIHByYWdtYSk7ICAvLyBhZGQgdG8gdGhlIG1hcAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBidWlsZExvY2F0aW9uTWFwIC0gYnVpbGQgYSBtYXAgZnJvbSBsb2NhdGlvbiB0byBzZXQgb2YgcHJhZ21hcyAiZm9sbG93aW5nIiBpdAotICAgICAqIEBwYXJhbSBwTGlzdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGJ1aWxkTG9jYXRpb25NYXAoUEFTVFByYWdtYSBbXSBwTGlzdCkKLSAgICB7Ci0gICAgICAgIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoaW50IGk9MDsgaTxwTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHBMaXN0W2ldIGluc3RhbmNlb2YgUEFTVE9NUFByYWdtYSkgewotICAgICAgICAgICAgICAgIFBBU1RPTVBQcmFnbWEgcHJhZ21hID0gKFBBU1RPTVBQcmFnbWEpcExpc3RbaV07Ci0gICAgICAgICAgICAgICAgSUFTVE5vZGUgICAgICBsb2NhdGlvbiA9IHByYWdtYS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiE9bnVsbCAmJiBwcmFnbWEuaXNDb21waWxlZCgpICYmIGlzUmVnaW9uRGVmaW5lZEluRmN0bihsb2NhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlua2VkTGlzdCBsID0gKExpbmtlZExpc3QpbWFwLmdldChsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsPT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQobG9jYXRpb24sIGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGwuYWRkKHByYWdtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXNSZWdpb25EZWZpbmVkSW5GY3RuIC0gZGV0ZXJtaW5lcyBpbiBub2RlIGluIHNjb3BlIG9mIGZ1bmN0aW9uCi0gICAgICogQHBhcmFtIG5vZGUgLSBJQVNUTm9kZQotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVnaW9uRGVmaW5lZEluRmN0bihJQVNUTm9kZSBub2RlKQotICAgIHsKLSAgICAgICAgd2hpbGUobm9kZSE9bnVsbCkgewotICAgICAgICAgICAgaWYgKG5vZGU9PWZEZWZfKSAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogdmlzaXQgLSB2aXNpdCBzdGF0ZW1lbnRzCi0gICAgICogICAgICAgICBOT1RFOiB3ZSBrZWVwIGxvb2tpbmcgZm9yIHN0bXRzIGFzc29jaWF0ZWQgd2l0aCBwcmFnbWFzIC0gdG8gYnVpbGQgYSBuZXcgUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcwotICAgICAqIEBwYXJhbSBzdGF0ZW1lbnQgLSBJQVNUU3RhdGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0YXRlbWVudCkgCi0gICAgewotICAgICAgICBQQVNUT01QUHJhZ21hIHByYWdtYSA9IChQQVNUT01QUHJhZ21hKXByYWdtYVJlZ2lvbk1hcF8uZ2V0KHN0YXRlbWVudCk7Ci0gICAgICAgIGlmIChwcmFnbWEhPW51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkUmVnaW9uQW5hbHlzaXMocHJhZ21hLCBzdGF0ZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsgICAvLyBTa2lwIHRoZSBwYXJ0IHRoYXQgd2lsbCBiZSBoYW5kbGVkIGluIG1vcmUgZGV0YWlsCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGJ1aWxkUmVnaW9uQW5hbHlzaXMgLSBidWlsZCBhbiBhbmFseXNpcyBvZiB0aGlzICJwcmFnbWEiIHJlZ2lvbiBvZiB0aGUgcHJvZ3JhbQotICAgICAqIEBwYXJhbSBwcmFnbWEgICAgLSBQQVNUT01QUHJhZ21hCi0gICAgICogQHBhcmFtIHN0YXRlbWVudCAtIElBU1RTdGF0ZW1lbnQ7Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRSZWdpb25BbmFseXNpcyhQQVNUT01QUHJhZ21hIHByYWdtYSwgSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQpCi0gICAgewotICAgICAgICAvLyBidWlsZCB0aGUgY2ZnCi0gICAgICAgIE9NUENGRyBjZmcgPSBPTVBDRkdNYWtlci5jb25zdHJ1Y3RDRkcocHJhZ21hLCBzdGF0ZW1lbnQsIHByYWdtYVJlZ2lvbk1hcF8sIHByYWdtYUxvY2F0aW9uTWFwXyk7Ci0gICAgICAgCi0gICAgICAgIGNmZy5wcmludENGRyhTeXN0ZW0ub3V0KTsKLQotICAgICAgICBhZGRDb21wb25lbnQobmV3IFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMoY2ZnKSk7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9PTVBDRkdNYWtlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9PTVBDRkdNYWtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjI1NTU0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvT01QQ0ZHTWFrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuZmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RCcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RDYXNlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbXBvdW5kU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbnRpbnVlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVERvU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVElmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUmV0dXJuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTd2l0Y2hTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUV2hpbGVTdGF0ZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUT01QUHJhZ21hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QQmFzaWNCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUENGRzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUENGR05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBFeHByZXNzaW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBQcmFnbWFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuZmFjdG9yeS5PTVBDRkdSZXN1bHQuQ2hhaW47Ci0KLQotLyoqCi0gKiBCdWlsZHMgYSBzZWN0aW9uIG9mIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggKGxpa2UgQ0ZHTWFrZXIpCi0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT01QQ0ZHTWFrZXIgZXh0ZW5kcyBBU1RWaXNpdG9yCi17Ci0gICAgcHJvdGVjdGVkIElBU1ROb2RlICAgICAgdE5vZGVfICAgICAgID0gbnVsbDsKLSAgICAKLSAgICAvLyBUaGlzIGlzIHRoZSByZXR1cm4gc3RydWN0dXJlCi0gICAgcHJvdGVjdGVkIE9NUENGR1Jlc3VsdCAgcmVzdWx0XyAgICAgID0gbmV3IE9NUENGR1Jlc3VsdCgpOwotCi0gICAgCi0gICAgLy8gVGhlc2UgZ2V0IHBhc3NlZCBkb3duIHRvIGVhY2ggbGV2ZWwgLSAKLSAgICAvLyAgICAgcHJhZ21hUmVnaW9uTWFwXyBuZXZlciBjaGFuZ2VzCi0gICAgLy8gICAgIHByYWdtYUNvbnRleHQgaW5jcmVhc2VzL2RlY3JlYXNlcyBvbiBlbmNvdW50ZXJpbmcgcHJhZ21hIHN0YXRlbWVudHMgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBIYXNodGFibGUgIHByYWdtYVJlZ2lvbk1hcF8gICA9IG51bGw7ICAvLyBtYXBzIElBU1ROb2RlIHRvIHByYWdtYSwgaWYgbm9kZSBpcyBhIHByYWdtYSByZWdpb24KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEhhc2h0YWJsZSAgcHJhZ21hTG9jYXRpb25NYXBfID0gbnVsbDsgIC8vIG1hcHMgSUFTVG5vZGUgdG8gbGlzdCBvZiBwcmFnbWFzIHRoYXQgbWF5IGltbWVkLiBzdWNjZWVkIGl0Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdGFjayAgICAgIHByYWdtYUNvbnRleHRfICAgICA9IG51bGw7ICAvLyBzdGFjayBvZiBwcmFnbWEgLSBpbmRpY2F0aW5nIGRlcHRoIG9mIE9NUCBjb250cm9sCi0gICAgCi0gICAgLy8gQWdhaW4gdGhlIHBlcnNwZWN0aXZlIGlzIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIGEgbGlzdCBvZiBhIG1peCBvZiAKLSAgICAvLyAgICAgYmFzaWMgYmxvY2tzIGFuZCBwcmFnbWEgbm9kZXMgLSBuZXN0ZWQgcHJvY2Vzc2luZyBkb25lIHJlY3Vyc2l2ZWx5Ci0gICAgLy8gVGhpcyB0d28gaXRlbXMgbWFuYWdlIHRoZSBwcm9ncmVzcyBvbiB0aGUgY3VycmVudCBjaGFpbgotICAgIHByb3RlY3RlZCBPTVBDRkdOb2RlICAgIGZpcnN0Tm9kZV8gICA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIE9NUENGR05vZGUgICAgY3VycmVudE5vZGVfID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gIHRyYWNlT25fICAgICA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdENGRyAtIHN0YXRpYyBtZXRob2QgdG8gYnVpbGQgdGhlIGNmZwotICAgICAqIEBwYXJhbSBwcmFnbWEgICAgICAgICAgICAgICAgLSBQQVNUT01QUHJhZ21hIChmb2N1cyBwcmFnbWEgZm9yIHRoaXMgZ3JhcGgKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50ICAgICAgICAgICAgIC0gSUFTVFN0YXRlbWVudCAocmVnaW9uIGZvciBwcmFnbWEpCi0gICAgICogQHBhcmFtIHByYWdtYVJlZ2lvbk1hcCAgICAgICAtIEhhc2h0YWJsZSAobWFwcGluZyByZWdpb24gdG8gcHJhZ21hKQotICAgICAqIEBwYXJhbSBwcmFnbWFMb2NhdGlvbk1hcCAgICAgLSBIYXNodGFibGUgKG1hcHBpbmcgSUFTVE5vZGUgdG8gbGlzdCBvZiBpbW1lZC4gc3VjYy4gcHJhZ21hcykKLSAgICAgKiBAcmV0dXJuIE9NUENGRwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01QQ0ZHIGNvbnN0cnVjdENGRyhQQVNUT01QUHJhZ21hIHByYWdtYSwgSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQsIEhhc2h0YWJsZSBwcmFnbWFSZWdpb25NYXAsIEhhc2h0YWJsZSBwcmFnbWFMb2NhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIHByYWdtYVJlZ2lvbk1hcF8gICA9IHByYWdtYVJlZ2lvbk1hcDsKLSAgICAgICAgcHJhZ21hTG9jYXRpb25NYXBfID0gcHJhZ21hTG9jYXRpb25NYXA7Ci0gICAgICAgIHByYWdtYUNvbnRleHRfICAgICA9IG5ldyBTdGFjaygpOwotICAgICAgICAKLSAgICAgICAgT01QQ0ZHTWFrZXIgbWFrZXIgPSBuZXcgT01QQ0ZHTWFrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgbWFrZXIuYnVpbGRDRkcoKTsKLSAgICAgICAgT01QQ0ZHUmVzdWx0IHJlc3VsdCA9IG1ha2VyLmdldFJlc3VsdCgpOwotICAgICAgICByZXN1bHQucmVzb2x2ZSgpOwotICAgICAgICAKLSAgICAgICAgT01QQ0ZHIGNmZyA9IG5ldyBPTVBDRkcocHJhZ21hLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldEZpcnN0Q2hhaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRVbmNvbm5lY3RlZENoYWlucygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFVucmVzb2x2ZWRDb250cm9sRmxvdygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldExhYmVsTWFwKCkpOwotCi0gICAgICAgIAotICAgICAgICBwcmFnbWFSZWdpb25NYXBfICAgPSBudWxsOwotICAgICAgICBwcmFnbWFMb2NhdGlvbk1hcF8gPSBudWxsOwotICAgICAgICBwcmFnbWFDb250ZXh0XyAgICAgPSBudWxsOwotICAgICAgICByZXR1cm4gY2ZnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9NT1BDRkdNYWtlciAtIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHROb2RlIC0gSUFTVE5vZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT01QQ0ZHTWFrZXIoSUFTVFN0YXRlbWVudCB0Tm9kZSkKLSAgICB7Ci0gICAgICAgIHROb2RlXyAgICAgPSB0Tm9kZTsKLSAgICAgICAgc2hvdWxkVmlzaXRTdGF0ZW1lbnRzICAgPSB0cnVlOwotICAgICAgICBzaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE9NUENGR01ha2VyICAtIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHROb2RlIC0gSUFTVE5vZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT01QQ0ZHTWFrZXIoSUFTVEV4cHJlc3Npb24gdE5vZGUpCi0gICAgewotICAgICAgICB0Tm9kZV8gICAgICAgICAgICAgICAgICAgPSB0Tm9kZTsKLSAgICAgICAgc2hvdWxkVmlzaXRFeHByZXNzaW9ucyAgID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYnVpbGRDRkcgLSBtZXRob2QgdG8gaW5pdGlhdGUgYnVpbGRpbmcgdHJlZSB1c2luZyB0cmVlIHdhbGtlcgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnVpbGRDRkcoKQotICAgIHsKLSAgICAgICAgaWYgKHROb2RlXz09bnVsbCkgICAvLyB0aGlzIGNhbiBvY2N1ciwgZS5nLiBibGFuayBlbHNlIHBhcnQgb2YgaWYKLSAgICAgICAgICAgIGZpcnN0Tm9kZV89Y3VycmVudE5vZGVfPW5ldyBPTVBCYXNpY0Jsb2NrKCk7ICAgLy8gd2l0aCBub3RoaW5nIGluIGl0Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgdE5vZGVfLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHB1dCB0aGUgbGFzdCBjaGFpbiBvbiB0aGUgbGlzdAotICAgICAgICBpZiAoY3VycmVudE5vZGVfIT1udWxsKSB7Ci0gICAgICAgICAgICByZXN1bHRfLmFkZENoYWluKGZpcnN0Tm9kZV8sIGN1cnJlbnROb2RlXywgT01QQ0ZHUmVzdWx0LlRlcm1Gb3J3YXJkLCBudWxsKTsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlXyA9IG51bGw7Ci0gICAgICAgICAgICBmaXJzdE5vZGVfICAgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9NUENGR1Jlc3VsdCBnZXRSZXN1bHQoKSB7IHJldHVybiByZXN1bHRfOyAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZpc2l0IC0gZm9yIGFuIGV4cHJlc3Npb24gYmxvY2sKLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIElBU1RFeHByZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgIHsKLSAgICAgICAgLy8gc2ltcGxlIGZvciBub3cgLSBtYXkgbmVlZCB0byBkcmlsbCBkb3duIGxhdGVyCi0gICAgICAgIE9NUEV4cHJlc3Npb25CbG9jayBiID0gbmV3IE9NUEV4cHJlc3Npb25CbG9jaygpOwotICAgICAgICBiLnNldFByYWdtYUNvbnRleHQoZ2V0TGFzdFByYWdtYSgpKTsKLSAgICAgICAgYi5hZGRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotICAgICAgICBmaXJzdE5vZGVfPWN1cnJlbnROb2RlXz1iOwotCi0gICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IHZpc2l0KElBU1REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgIH0KLSAgICAKLQotICAgIHB1YmxpYyBpbnQgdmlzaXQoSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQpIAotICAgIHsKLSAgICAgICAgLy8gZmlyc3QsIGNoZWNrIGlmIHN0YXRlbWVudCBpcyBhIHJlZ2lvbiBmb3IgYSBwcmFnbWEKLSAgICAgICAgaW50IGNoZWNrVmFsdWUgPSBwcmFnbWFSZWdpb25DaGVjayhzdGF0ZW1lbnQpOwotICAgICAgICBpZiAoY2hlY2tWYWx1ZSE9LTEpICByZXR1cm4gY2hlY2tWYWx1ZTsgIC8vIC0xIG1lYW5zIGNhcnJ5IGZvd2FyZCBpbiB0aGlzIGNvZGUKLSAgICAgICAgCi0gICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUSWZTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NJZlN0YXRlbWVudCgoSUFTVElmU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICBwcmFnbWFSZWdpb25sZXNzQ2hlY2soc3RhdGVtZW50LCBQQVNUT01QUHJhZ21hLk5laWdoYm9yUHJveGltaXR5KTsKLSAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX1NLSVA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVFN3aXRjaFN0YXRlbWVudCkgewotICAgICAgICAgICAgcHJvY2Vzc1N3aXRjaFN0YXRlbWVudCgoSUFTVFN3aXRjaFN0YXRlbWVudClzdGF0ZW1lbnQpOwotICAgICAgICAgICAgcHJhZ21hUmVnaW9ubGVzc0NoZWNrKHN0YXRlbWVudCwgUEFTVE9NUFByYWdtYS5OZWlnaGJvclByb3hpbWl0eSk7Ci0gICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19TS0lQOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RDYXNlU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICBwcm9jZXNzQ2FzZVN0YXRlbWVudCgoSUFTVENhc2VTdGF0ZW1lbnQpc3RhdGVtZW50KTsKLSAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RGb3JTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NGb3JTdGF0ZW1lbnQoKElBU1RGb3JTdGF0ZW1lbnQpc3RhdGVtZW50KTsKLSAgICAgICAgICAgIHByYWdtYVJlZ2lvbmxlc3NDaGVjayhzdGF0ZW1lbnQsIFBBU1RPTVBQcmFnbWEuTmVpZ2hib3JQcm94aW1pdHkpOwotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUV2hpbGVTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NXaGlsZVN0YXRlbWVudCgoSUFTVFdoaWxlU3RhdGVtZW50KXN0YXRlbWVudCk7Ci0gICAgICAgICAgICBwcmFnbWFSZWdpb25sZXNzQ2hlY2soc3RhdGVtZW50LCBQQVNUT01QUHJhZ21hLk5laWdoYm9yUHJveGltaXR5KTsKLSAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX1NLSVA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVERvU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICBwcm9jZXNzRG9TdGF0ZW1lbnQoKElBU1REb1N0YXRlbWVudClzdGF0ZW1lbnQpOwotICAgICAgICAgICAgcHJhZ21hUmVnaW9ubGVzc0NoZWNrKHN0YXRlbWVudCwgUEFTVE9NUFByYWdtYS5OZWlnaGJvclByb3hpbWl0eSk7Ci0gICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19TS0lQOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCkgewotICAgICAgICAgICAgcHJhZ21hUmVnaW9ubGVzc0NoZWNrKHN0YXRlbWVudCwgUEFTVE9NUFByYWdtYS5DaGlsZFByb3hpbWl0eSk7Ci0gICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUQnJlYWtTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgIGFkZFRvQmFzaWNCbG9ja0FuZENoYWluKHN0YXRlbWVudCwgT01QQ0ZHUmVzdWx0LlRlcm1CcmVhayk7Ci0gICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBJQVNUQ29udGludWVTdGF0ZW1lbnQpIHsKLSAgICAgICAgICAgIGFkZFRvQmFzaWNCbG9ja0FuZENoYWluKHN0YXRlbWVudCwgT01QQ0ZHUmVzdWx0LlRlcm1Db250aW51ZSk7IAotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgSUFTVFJldHVyblN0YXRlbWVudCkgewotICAgICAgICAgICAgYWRkVG9CYXNpY0Jsb2NrQW5kQ2hhaW4oc3RhdGVtZW50LCBPTVBDRkdSZXN1bHQuVGVybVJldHVybik7IAotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGp1c3QgYWRkIHRvIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrIGlmIHRoZXJlIGlzIG9uZQotICAgICAgICBhZGRUb0Jhc2ljQmxvY2soc3RhdGVtZW50KTsKLSAgICAgICAgcHJhZ21hUmVnaW9ubGVzc0NoZWNrKHN0YXRlbWVudCwgUEFTVE9NUFByYWdtYS5OZWlnaGJvclByb3hpbWl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwcmFnbWFSZWdpb25DaGVjayAtIGlmIHN0bXQgaXMgcmVnaW9uIGZvciBhIHByZWNlZGluZyBwcmFnbWEsIGFkZCBwcmFnbWEgCi0gICAgICogQHBhcmFtIHN0YXRlbWVudCAtIElBU1RTdGF0ZW1lbnQKLSAgICAgKiBAcmV0dXJuIGludCAgKC0xIG1lYW5zIG5vdGhpbmcgZG9uZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHByYWdtYVJlZ2lvbkNoZWNrKElBU1RTdGF0ZW1lbnQgc3RhdGVtZW50KQotICAgIHsKLSAgICAgICAgUEFTVE9NUFByYWdtYSBwcmFnbWEgPSAoUEFTVE9NUFByYWdtYSlwcmFnbWFSZWdpb25NYXBfLmdldChzdGF0ZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhdm9pZHMgYSBuYXN0eSByZWN1cnNpb24gbG9vcCwgcmVzdWx0aW5nIGZyb20KLSAgICAgICAgLy8gICAgdGhlIHJlY3Vyc2lvbiB3ZSBpbnZlc3Qgb24gdGhlIGZvbGxvd2luZyBsaW5lcywgaS5lLgotICAgICAgICAvLyAgICB3ZSBrZWVwIGJ1aWxkaW5nIG1ha2VycyBmb3IgdGhlIHNhbWUgc3RhdGVtZW50Ci0gICAgICAgIGlmIChwcmFnbWFDb250ZXh0Xy5zaXplKCkhPTAgJiYgKChPTVBQcmFnbWFOb2RlKXByYWdtYUNvbnRleHRfLnBlZWsoKSkuZ2V0UHJhZ21hKCk9PXByYWdtYSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcmFnbWEhPW51bGwpIHsKLSAgICAgICAgICAgIE9NUENGR05vZGUgcE5vZGUgPSBuZXcgT01QUHJhZ21hTm9kZShwcmFnbWEsIGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgICAgICBwTm9kZS5zZXRQcmFnbWFDb250ZXh0KGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgICAgICBhZGRUb0NoYWluKHBOb2RlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETzogQW5hbHlzZSB0aGUgY29udGV4dCBoZXJlIHRvIHNlZSBpZiBsZWdhbCBPTVAgcHJhZ21hIG1ha2VzIHNlbnNlIChyZXQgLTEpCi0gICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmFnbWFDb250ZXh0Xy5wdXNoKHBOb2RlKTsgICAvLyBidW1wIHRoZSBjb250ZXh0Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIERvIGEgMSBsZXZlbCByZWN1cnNpb24gdG8gcHJvY2VzcyB0aGlzIHN0YXRlbWVudCAtIHNvIHdlIGNhbiBwb3AgdGhpcyBjb250ZXh0Ci0gICAgICAgICAgICBPTVBDRkdNYWtlciBtYWtlciA9IG5ldyBPTVBDRkdNYWtlcihzdGF0ZW1lbnQpOwotICAgICAgICAgICAgbWFrZXIuYnVpbGRDRkcoKTsKLSAgICAgICAgICAgIHByYWdtYUNvbnRleHRfLnBvcCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHRfLm1lcmdlKG1ha2VyLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIG51bGwgY29tcG91bmQgc3RhdGVtZW50cywgdGhlcmUgaXMgbm90aGluZyBoZXJlCi0gICAgICAgICAgICBpZiAobWFrZXIuZ2V0UmVzdWx0KCkuZ2V0Rmlyc3RDaGFpbigpIT1udWxsKSB7Ci0gICAgICAgICAgICAgIHBOb2RlLmNvbm5lY3RUbyhtYWtlci5nZXRSZXN1bHQoKS5nZXRGaXJzdENoYWluKCkuZ2V0SGVhZE5vZGUoKSk7Ci0gICAgICAgICAgICAgIGN1cnJlbnROb2RlXyA9IG1ha2VyLmdldFJlc3VsdCgpLmdldEZpcnN0Q2hhaW4oKS5nZXRUYWlsTm9kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBGb3IgY2VydGFpbiBwcmFnbWFzLCB3ZSB3aWxsIGFwcGVuZCBhbiBpbXBsaWNpdCBiYXJyaWVyCi0gICAgICAgICAgICBpbnQgdHlwZSA9IHByYWdtYS5nZXRPTVBUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoKHR5cGU9PVBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWwgfHwgdHlwZT09UEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbEZvciB8fAotICAgICAgICAgICAgICAgIHR5cGU9PVBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxTZWN0aW9ucyB8fCB0eXBlPT1QQVNUT01QUHJhZ21hLk9tcFNpbmdsZSkgJiYKLSAgICAgICAgICAgICAgICBwcmFnbWEuZ2V0Tm9XYWl0KCk9PWZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgYWRkVG9DaGFpbihuZXcgT01QUHJhZ21hTm9kZSgpLCB0cnVlKTsgIC8vIGNvbnN0cnVjdG9yIHNldCBpbXBsaWNpdCBiYXJyaWVyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIFBST0NFU1NfU0tJUDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwcmFnbWFSZWdpb25sZXNzQ2hlY2sgLSBhZGQgdGhpbmdzIGxpa2UgYmFycmllciwgZXRjLiBhcyBhIHNlcGFyYXRlIG5vZGUKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50ICAgLSBJQVNUU3RhdGVtZW50IChwcmVjZWVkaW5nIHRoZSBwcmFnbWEpCi0gICAgICogQHBhcmFtIHByb3hpbWl0eSAgIC0gaW50IChzZWUgUEFTVE9NUFByYWdtYSBjb25zdGFudHMsIGNoaWxkLCBuZWlnaGJvcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmFnbWFSZWdpb25sZXNzQ2hlY2soSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBwcm94aW1pdHkpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGwgPSAoTGlua2VkTGlzdClwcmFnbWFMb2NhdGlvbk1hcF8uZ2V0KHN0YXRlbWVudCk7Ci0gICAgICAgIGlmIChsPT1udWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9bC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFBBU1RPTVBQcmFnbWEgb1ByYWdtYSA9IChQQVNUT01QUHJhZ21hKWkubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9QcmFnbWEuZ2V0UHJveGltaXR5KCk9PXByb3hpbWl0eSAmJiBvUHJhZ21hLmdldFJlZ2lvbigpPT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgT01QQ0ZHTm9kZSBwTm9kZSA9IG5ldyBPTVBQcmFnbWFOb2RlKG9QcmFnbWEsIGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgICAgICAgICAgcE5vZGUuc2V0UHJhZ21hQ29udGV4dChnZXRMYXN0UHJhZ21hKCkpOwotICAgICAgICAgICAgICAgIGFkZFRvQ2hhaW4ocE5vZGUpOwotICAgICAgICAgICAgICAgIC8vIG5vIHBvcCBub3IgcHVzaCBuZWVkcyB0byBiZSBkb25lIGhlcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwcm9jZXNzSWZTdGF0ZW1lbnQgLSBwcm9jZXNzIHRoZSB0aGUgdGhlbiBhbmQgZWxzZSBpbnRvIGEgdW5pZmllZCByZXN1bHQKLSAgICAgKiBAcGFyYW0gaWZzIC0gSUFTQVRJZlN0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSWZTdGF0ZW1lbnQoSUFTVElmU3RhdGVtZW50IGlmcykKLSAgICB7Ci0KLSAgICAgICAgT01QQ0ZHTWFrZXIgIGlmdCA9IG5ldyBPTVBDRkdNYWtlcihpZnMuZ2V0VGhlbkNsYXVzZSgpKTsKLSAgICAgICAgT01QQ0ZHTWFrZXIgIGlmZSA9IG5ldyBPTVBDRkdNYWtlcihpZnMuZ2V0RWxzZUNsYXVzZSgpKTsKLSAgICAgICAgaWZ0LmJ1aWxkQ0ZHKCk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJPTVBDRkdNYWtlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRWxzZSIpOwotICAgICAgICBpZmUuYnVpbGRDRkcoKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIk9NUENGR01ha2VyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FbmRpZiIpOwotICAgICAgICBDaGFpbiB0aGVuQ2hhaW4gPSBpZnQuZ2V0UmVzdWx0KCkuZ2V0Rmlyc3RDaGFpbigpOwotICAgICAgICBDaGFpbiBlbHNlQ2hhaW4gPSBpZmUuZ2V0UmVzdWx0KCkuZ2V0Rmlyc3RDaGFpbigpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIE9NUCBDRkcgZWxpZGVzIGEgbG90IG9mIGNvbmRpdGlvbmFscyB0byBzYXZlIGV4cGVuc2UgaW4gYW5hbHlzaXMKLSAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFueSByZWFzb24gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUsIGlmIG5vdCBqdXN0IGFkZAotICAgICAgICAvLyB0aGUgc3RhdGVtZW50IHRvIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrCi0gICAgICAgIGlmICghZ2V0UmVsZXZhbmNlKGlmdC5nZXRSZXN1bHQoKSkgJiYgIWdldFJlbGV2YW5jZShpZmUuZ2V0UmVzdWx0KCkpKSB7Ci0gICAgICAgICAgICAgICBhZGRUb0Jhc2ljQmxvY2soaWZzKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWRkQmFzaWNCbG9ja0JyYW5jaChpZnMuZ2V0Q29uZGl0aW9uRXhwcmVzc2lvbigpLCBPTVBCYXNpY0Jsb2NrLklmQnJhbmNoKTsKLSAgICAgICAgaWYgKHRyYWNlT25fKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDRkdGYWN0b3J5OiBDcmVhdGUgSUYgQnJhbmNoTm9kZSIpOwotICAgICAgICAKLSAgICAgICAgY3VycmVudE5vZGVfLmNvbm5lY3RUbyh0aGVuQ2hhaW4uZ2V0SGVhZE5vZGUoKSk7Ci0gICAgICAgIGN1cnJlbnROb2RlXy5jb25uZWN0VG8oZWxzZUNoYWluLmdldEhlYWROb2RlKCkpOwotICAgICAgICAvLyBCdWlsZCBhIGpvaW4gbm9kZSB0byBjb2xsZWN0IHJlc3VsdHMgLSBtYWtlcyB0aGluZ3MgZWFzaWVyCi0gICAgICAgIE9NUEJhc2ljQmxvY2sgam4gPSBuZXcgT01QQmFzaWNCbG9jaygpOwotICAgICAgICBqbi5zZXRQcmFnbWFDb250ZXh0KGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgIGlmICh0cmFjZU9uXykKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ0ZHRmFjdG9yeTogQ3JlYXRlIEpvaW5Ob2RlIik7Ci0gICAgICAgIC8vIGNvbm5lY3Qgd2hhdCB0aGV5IGdvIHRocm91Z2gKLSAgICAgICAgaWYgKHRoZW5DaGFpbi5nZXRUZXJtaW5hdGlvblJlYXNvbigpPT1PTVBDRkdSZXN1bHQuVGVybUZvcndhcmQpCi0gICAgICAgICAgdGhlbkNoYWluLmdldFRhaWxOb2RlKCkuY29ubmVjdFRvKGpuKTsKLSAgICAgICAgaWYgKGVsc2VDaGFpbi5nZXRUZXJtaW5hdGlvblJlYXNvbigpPT1PTVBDRkdSZXN1bHQuVGVybUZvcndhcmQpCi0gICAgICAgICAgZWxzZUNoYWluLmdldFRhaWxOb2RlKCkuY29ubmVjdFRvKGpuKTsKLSAgICAgICAKLSAgICAgICAgLy8gbWVyZ2UgdGhlIG5lc3RlZCByZXN1bHRzIGludG8gdGhlIGhpZ2hlciByZXN1bHRzCi0gICAgICAgIC8vIG5vdGUgdGhhdCBJRiBkb2VzIG5vdCBzZXR0bGUgYW55IHVucmVzb2x2ZWQgaXNzdWVzCi0gICAgICAgIHJlc3VsdF8ubWVyZ2UoaWZ0LmdldFJlc3VsdCgpKTsKLSAgICAgICAgcmVzdWx0Xy5tZXJnZShpZmUuZ2V0UmVzdWx0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gYWRkIHRoZSBqb2luIHRvIHRoZSBjaGFpbgotICAgICAgICBpZiAoam4uaGFzUHJlZGVjZXNzb3JzKCkpICAvLyBvbmx5IGlmIHVzZWQKLSAgICAgICAgICBhZGRUb0NoYWluKGpuLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIHByb2Nlc3NTd2l0Y2hTdGF0ZW1lbnQgLSBidWlsZCB0aGUgY2ZnIGZvciBhIHN3aXRjaCBzdGF0ZW1lbnQKLSAgICAgKiBAcGFyYW0gaXNzIC0gSUFTVFN3aXRjaFN0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU3dpdGNoU3RhdGVtZW50KElBU1RTd2l0Y2hTdGF0ZW1lbnQgaXNzKQotICAgIHsKLSAgICAgICAgSUFTVFN0YXRlbWVudCBib2R5ID0gaXNzLmdldEJvZHkoKTsKLSAgICAgICAgCi0gICAgICAgIE9NUENGR01ha2VyIGNhc2VCb2R5RmFjdG9yeSA9IG5ldyBPTVBDRkdNYWtlcihib2R5KTsKLSAgICAgICAgY2FzZUJvZHlGYWN0b3J5LmJ1aWxkQ0ZHKCk7Ci0gICAgICAgIE9NUENGR1Jlc3VsdCBjQm9keSA9IGNhc2VCb2R5RmFjdG9yeS5nZXRSZXN1bHQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdlIHRyeSB0byBjb21wbGV0ZSB0aGUgc3RydWN0dXJlIHRvIGdldCByaWQgb2YgYWxsIGJyZWFrYWdlcwotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm9uZSwgYW5kIG5vIGJhcnJpZXJzLCB3ZSBjYW4ganVzdCBmb2xkIHRoZSB3aG9sZSBzd2l0Y2ggaW50byB0aGUgY2FzZSBzdGF0ZW1lbnQuCi0gICAgICAgIC8vICAgIG90aGVyd2lzZSwgd2UgYXR0YWNoIHRoZSB3aG9sZSBtZXNzIHRvIHRoZSBjZmcuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIGV4cGVjdCBhIHNldCBvZiBjaGFpbnMuCi0gICAgICAgIC8vIEluIGVhY2ggY2hhaW4sIHdlIHdpbGwgbG9vayBmb3Igbm9kZXMgdGhhdCBiZWdpbiB3aXRoIGEgY2FzZSBzdGF0ZW1lbnQuCi0gICAgICAgIC8vIElmIHRoZXkgZW5kIGluIGEgYnJlYWsgb3IgcmV0dXJuLCB0aGV5IGFyZSBkaXN0aW5jdCBwYXRocyBpbiB0aGUgY2FzZQotICAgICAgICAvLyAgICBvdGhlcndpc2UgdGhleSBtZXJnZSBpbnRvIGVhY2ggb3RoZXIuCi0gICAgICAgIC8vIAotICAgICAgICAvLyBCdWlsZCBmaXJzdCwgdG9rZW4gYmFzaWMgYmxvY2tzIGZvciB0aGUgc3BsaXQgYW5kIGpvaW4KLSAgICAgICAgT01QQmFzaWNCbG9jayAgYm4gPSBuZXcgT01QQmFzaWNCbG9jaygpOwotICAgICAgICBibi5zZXRQcmFnbWFDb250ZXh0KGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgIE9NUEJhc2ljQmxvY2sgIGpuID0gbmV3IE9NUEJhc2ljQmxvY2soKTsKLSAgICAgICAgam4uc2V0UHJhZ21hQ29udGV4dChnZXRMYXN0UHJhZ21hKCkpOwotICAgICAgICBibi5zZXRCcmFuY2hpbmdFeHByZXNzaW9uKGlzcy5nZXRDb250cm9sbGVyRXhwcmVzc2lvbigpLCBPTVBCYXNpY0Jsb2NrLlN3aXRjaEJyYW5jaCk7Ci0gICAgICAgIExpbmtlZExpc3QgY2hhaW5zICAgICAgPSBjQm9keS5nZXRDaGFpbnMoKTsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9Y2hhaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ2hhaW4gICBjaGFpbiA9IChDaGFpbilpLm5leHQoKTsKLSAgICAgICAgICAgIE9NUENGR05vZGUgcCAgPSBjaGFpbi5nZXRIZWFkTm9kZSgpOwotICAgICAgICAgICAgd2hpbGUocCE9bnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgT01QQmFzaWNCbG9jaykgewotICAgICAgICAgICAgICAgICAgICBpZiAoKChPTVBCYXNpY0Jsb2NrKXApLmlzQ2FzZSgpKQotICAgICAgICAgICAgICAgICAgICAgIGJuLmNvbm5lY3RUbyhwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcCA9IHAuZ2V0U3VjY2Vzc29yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGZvciBhbGwgdGhlIGJyZWFrcywgbG9vayBhdCB1bnJlc29sdmVkIGNvbnRyb2wgZmxvdyBsaXN0IGFuZCBkZWFsIHdpdGggaXQKLSAgICAgICAgTGlua2VkTGlzdCB1Y2YgPSBjQm9keS5nZXRVbnJlc29sdmVkQ29udHJvbEZsb3coKTsKLSAgICAgICAgT2JqZWN0ICAgIFtdIHVjZkxpc3QgPSB1Y2YudG9BcnJheSgpOyAgLy8gbmVlZCB0aGlzIGZvcm0gaW5zdGVhZCBvZiBpdGVyYXRvciwgZHVlIHRvIHJlbW92YWwgY29uZmxpY3QKLSAgICAgICAgZm9yKGludCBpPTA7IGk8dWNmTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ2hhaW4gdXJjZiA9IChDaGFpbil1Y2ZMaXN0W2ldOwotICAgICAgICAgICAgaWYgKHVyY2YuZ2V0VGVybWluYXRpb25SZWFzb24oKT09T01QQ0ZHUmVzdWx0LlRlcm1CcmVhaykgewotICAgICAgICAgICAgICAgIHVyY2YuZ2V0VGFpbE5vZGUoKS5jb25uZWN0VG8oam4pOwotICAgICAgICAgICAgICAgIGNCb2R5LnJlbW92ZVVucmVzb2x2ZWRDb250cm9sRmxvdyh1cmNmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB3ZSBzZWUgaWYgd2UgaGF2ZSBhbnl0aGluZyBvZiBpbnRlcmVzdCBpbiB0aGlzIHN0YXRlbWVudCwgaWYgbm90LCBqdXN0IGZvbGQgaXQgaW50byB0aGUgQkIKLSAgICAgICAgaWYgKCFnZXRSZWxldmFuY2UoY0JvZHkpKSB7Ci0gICAgICAgICAgICBhZGRUb0Jhc2ljQmxvY2soaXNzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFdlIG5lZWQgdGhpcyBzdHJ1Y3R1cmUsIGZvbGQgaW50byB0aGUgZXhpc2luZyBibG9jayBzdHJ1Y3R1cmUKLSAgICAgICAgLy8gbWVyZ2UgcmVzdWx0cyBmb3IgYWxsIGNoYWlucwotICAgICAgICByZXN1bHRfLm1lcmdlKGNCb2R5KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0byBjdXJyZW50IGNoYWluCi0gICAgICAgIGFkZFRvQ2hhaW4oYm4sIHRydWUpOwotICAgICAgICAvLyB0aGUgam9pbiBkb2VzIG5vdCBmb2xsb3cgdGhlIGJyYW5jaCBkaXJlY3RseSAtIHRoZXJlIGlzIHN0dWZmIGluYmV0d2VlbiwgbWFrZSBpdCB0aGUgY3VycmVudCBub2RlCi0gICAgICAgIGFkZFRvQ2hhaW4oam4sIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcHJvY2Vzc1doaWxlU3RhdGVtZW50IC0gcHJvY2VzcyB0aGUgd2hpbGUgc3RhdGVtZW50IGludG8gY2ZnCi0gICAgICogQHBhcmFtIHdoaWxlU3RtdCAtIElBU1RXaGlsZVN0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzV2hpbGVTdGF0ZW1lbnQoSUFTVFdoaWxlU3RhdGVtZW50IHdoaWxlU3RtdCkKLSAgICB7Ci0gICAgICAgIElBU1RFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHdoaWxlU3RtdC5nZXRDb25kaXRpb24oKTsKLSAgICAgICAgSUFTVFN0YXRlbWVudCAgYm9keSAgICAgID0gd2hpbGVTdG10LmdldEJvZHkoKTsKLSAgICAgICAgCi0gICAgICAgIE9NUENGR01ha2VyICAgICAgIGJvZHlCdWlsZGVyID0gbmV3IE9NUENGR01ha2VyKGJvZHkpOwotICAgICAgICBib2R5QnVpbGRlci5idWlsZENGRygpOwotICAgICAgICBPTVBDRkdSZXN1bHQgICAgICBjQm9keSAgICAgICA9IGJvZHlCdWlsZGVyLmdldFJlc3VsdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQXMgaW4gb3RoZXIgc3RtdHMsIGJ1aWxkIGl0IGFsbCwgZG8gYSBjaGVjayBpZiB3ZSBzaG91bGQgZm9sZCBpbiwKLSAgICAgICAgLy8gICAgb3RoZXJ3aXNlLCB1c2UgdGhlIG5vZGVzCi0gICAgICAgIE9NUEJhc2ljQmxvY2sgIGJuICAgICAgICA9IG5ldyBPTVBCYXNpY0Jsb2NrKCk7Ci0gICAgICAgIGJuLnNldFByYWdtYUNvbnRleHQoZ2V0TGFzdFByYWdtYSgpKTsKLSAgICAgICAgYm4uc2V0QnJhbmNoaW5nRXhwcmVzc2lvbihjb25kaXRpb24sIE9NUEJhc2ljQmxvY2suV2hpbGVCcmFuY2gpOwotICAgICAgICBPTVBCYXNpY0Jsb2NrICBqbiAgICAgICAgPSBuZXcgT01QQmFzaWNCbG9jaygpOwotICAgICAgICBqbi5zZXRQcmFnbWFDb250ZXh0KGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBCdWlsZCB0aGUgY29udHJvbCBmbG93Ci0gICAgICAgIGJuLmNvbm5lY3RUbyhqbik7Ci0gICAgICAgIGJuLmNvbm5lY3RUbyhjQm9keS5nZXRGaXJzdENoYWluKCkuZ2V0SGVhZE5vZGUoKSk7Ci0gICAgICAgIGNCb2R5LmdldExhc3RDaGFpbigpLmdldFRhaWxOb2RlKCkuY29ubmVjdFRvKGJuKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGZvciBhbGwgdGhlIGJyZWFrcyBhbmQgY29udGludWVzLCBsb29rIGF0IHVucmVzb2x2ZWQgY29udHJvbCBmbG93IGxpc3QgYW5kIGRlYWwgd2l0aCBpdAotICAgICAgICBMaW5rZWRMaXN0IHVjZiA9IGNCb2R5LmdldFVucmVzb2x2ZWRDb250cm9sRmxvdygpOwotICAgICAgICBmb3IoSXRlcmF0b3IgaT11Y2YuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBDaGFpbiB1cmNmID0gKENoYWluKWkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHVyY2YuZ2V0VGVybWluYXRpb25SZWFzb24oKT09T01QQ0ZHUmVzdWx0LlRlcm1CcmVhaykgewotICAgICAgICAgICAgICAgIHVyY2YuZ2V0VGFpbE5vZGUoKS5jb25uZWN0VG8oam4pOwotICAgICAgICAgICAgICAgIGNCb2R5LnJlbW92ZVVucmVzb2x2ZWRDb250cm9sRmxvdyh1cmNmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHVyY2YuZ2V0VGVybWluYXRpb25SZWFzb24oKT09T01QQ0ZHUmVzdWx0LlRlcm1Db250aW51ZSkgewotICAgICAgICAgICAgICAgIHVyY2YuZ2V0VGFpbE5vZGUoKS5jb25uZWN0VG8oYm4pOwotICAgICAgICAgICAgICAgIGNCb2R5LnJlbW92ZVVucmVzb2x2ZWRDb250cm9sRmxvdyh1cmNmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB3ZSBzZWUgaWYgd2UgaGF2ZSBhbnl0aGluZyBvZiBpbnRlcmVzdCBpbiB0aGlzIHN0YXRlbWVudCwgaWYgbm90LCBqdXN0IGZvbGQgaXQgaW50byB0aGUgQkIKLSAgICAgICAgaWYgKCFnZXRSZWxldmFuY2UoY0JvZHkpKSB7Ci0gICAgICAgICAgICBhZGRUb0Jhc2ljQmxvY2sod2hpbGVTdG10KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbWVyZ2UgcmVzdWx0cyBmb3IgYWxsIGNoYWlucwotICAgICAgICByZXN1bHRfLm1lcmdlKGNCb2R5KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0byBjdXJyZW50IGNoYWluCi0gICAgICAgIGFkZFRvQ2hhaW4oYm4sIHRydWUpOwotICAgICAgICBhZGRUb0NoYWluKGpuLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHByb2Nlc3NEb1N0YXRlbWVudCAtIHByb2Nlc3MgRG8gc3RhdGVtZW50IGludG8gY2ZnCi0gICAgICogQHBhcmFtIGRvU3RtdCAtIElBU1REb1N0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRG9TdGF0ZW1lbnQoSUFTVERvU3RhdGVtZW50IGRvU3RtdCkKLSAgICB7Ci0gICAgICAgIElBU1RFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGRvU3RtdC5nZXRDb25kaXRpb24oKTsKLSAgICAgICAgSUFTVFN0YXRlbWVudCAgYm9keSAgICAgID0gZG9TdG10LmdldEJvZHkoKTsKLSAgICAgICAgCi0gICAgICAgIE9NUEJhc2ljQmxvY2sgIGJuICAgPSBuZXcgT01QQmFzaWNCbG9jaygpOwotICAgICAgICBibi5zZXRQcmFnbWFDb250ZXh0KGdldExhc3RQcmFnbWEoKSk7Ci0gICAgICAgIGJuLnNldEJyYW5jaGluZ0V4cHJlc3Npb24oY29uZGl0aW9uLCBPTVBCYXNpY0Jsb2NrLkRvQnJhbmNoKTsKLSAgICAgICAgT01QQmFzaWNCbG9jayAgam4gICA9IG5ldyBPTVBCYXNpY0Jsb2NrKCk7Ci0gICAgICAgIGpuLnNldFByYWdtYUNvbnRleHQoZ2V0TGFzdFByYWdtYSgpKTsKLSAgICAgICAgCi0gICAgICAgIE9NUENGR01ha2VyICAgICAgIGJvZHlCdWlsZGVyID0gbmV3IE9NUENGR01ha2VyKGJvZHkpOwotICAgICAgICBib2R5QnVpbGRlci5idWlsZENGRygpOwotICAgICAgICBPTVBDRkdSZXN1bHQgICAgICBjQm9keSAgICAgICA9IGJvZHlCdWlsZGVyLmdldFJlc3VsdCgpOwotIAotICAgICAgICAvLyBCdWlsZCB0aGUgZ3JhcGggIFsgd2Ugc3RpbGwgcHV0IHRoZSBqb2luIHJpZ2h0IGFmdGVyIGJyYW5jaCwgdG8gaGF2ZSBhICJicmVhayIgdGFyZ2V0Ci0gICAgICAgIGNCb2R5LmdldExhc3RDaGFpbigpLmdldFRhaWxOb2RlKCkuY29ubmVjdFRvKGJuKTsKLSAgICAgICAgYm4uY29ubmVjdFRvKGNCb2R5LmdldEZpcnN0Q2hhaW4oKS5nZXRIZWFkTm9kZSgpKTsKLSAgICAgICAgYm4uY29ubmVjdFRvKGpuKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB3ZSBzZWUgaWYgd2UgaGF2ZSBhbnl0aGluZyBvZiBpbnRlcmVzdCBpbiB0aGlzIHN0YXRlbWVudCwgaWYgbm90LCBqdXN0IGZvbGQgaXQgaW50byB0aGUgQkIKLSAgICAgICAgaWYgKCFnZXRSZWxldmFuY2UoY0JvZHkpKSB7Ci0gICAgICAgICAgICBhZGRUb0Jhc2ljQmxvY2soZG9TdG10KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotIAotICAgICAgICAKLSAgICAgICAgLy8gbWVyZ2UgcmVzdWx0cyBmb3IgYWxsIGNoYWlucwotICAgICAgICByZXN1bHRfLm1lcmdlKGNCb2R5KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0byBjdXJyZW50IGNoYWluCi0gICAgICAgIGFkZFRvQ2hhaW4oY0JvZHkuZ2V0Rmlyc3RDaGFpbigpLmdldEhlYWROb2RlKCksIHRydWUpOwotICAgICAgICBhZGRUb0NoYWluKGpuLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogcHJvY2Vzc0Nhc2VTdGF0ZW1lbnQgLSBTdGFydCBhIG5ldyBiYXNpYyBibG9jayBiZWdpbm5pbmcgd2l0aCB0aGlzIGNhc2UKLSAgICAgKiBAcGFyYW0gaWNzIC0gSUFTVENhc2VTdGF0ZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nhc2VTdGF0ZW1lbnQoSUFTVENhc2VTdGF0ZW1lbnQgaWNzKQotICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJhc2ljIGJsb2NrOyBidXQgbm90IGEgbmV3IGNoYWluCi0gICAgICAgIE9NUEJhc2ljQmxvY2sgYiA9IG5ldyBPTVBCYXNpY0Jsb2NrKCk7Ci0gICAgICAgIGIuc2V0UHJhZ21hQ29udGV4dChnZXRMYXN0UHJhZ21hKCkpOwotICAgICAgICBhZGRUb0NoYWluKGIpOwotICAgICAgICBpZiAodHJhY2VPbl8pCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNGR0ZhY3Rvcnk6IENyZWF0ZSBCYXNpY0Jsb2NrIGR1ZSB0byBjYXNlIHN0YXRlbWVudCIpOwotICAgICAgICAoKE9NUEJhc2ljQmxvY2spY3VycmVudE5vZGVfKS5hZGRTdGF0ZW1lbnQoaWNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcHJvY2Vzc0ZvclN0YXRlbWVudCAtIGJ1aWxkIHRoZSBncmFwaCBmb3IgdGhlIEZvciBzdGF0ZW1lbnQKLSAgICAgKiBAcGFyYW0gaWZzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGb3JTdGF0ZW1lbnQoSUFTVEZvclN0YXRlbWVudCBmb3JTdG10KQotICAgIHsKLSAgICAgICAgLy8gVE9ETzogdGhlcmUgYXJlIGNhc2VzIHdoZXJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhbiBiZSBlbXB0eSAtIHRvIGhhbmRsZQotICAgICAgICBJQVNUU3RhdGVtZW50ICBpbml0aWFsaXplciA9IGZvclN0bXQuZ2V0SW5pdGlhbGl6ZXJTdGF0ZW1lbnQoKTsKLSAgICAgICAgSUFTVEV4cHJlc3Npb24gY29uZGl0aW9uICAgPSBmb3JTdG10LmdldENvbmRpdGlvbkV4cHJlc3Npb24oKTsKLSAgICAgICAgSUFTVEV4cHJlc3Npb24gaXRlcmF0aW9uICAgPSBmb3JTdG10LmdldEl0ZXJhdGlvbkV4cHJlc3Npb24oKTsKLSAgICAgICAgSUFTVFN0YXRlbWVudCAgYm9keSAgICAgICAgPSBmb3JTdG10LmdldEJvZHkoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdlIHdpbGwgYnVpbGQgdGhlIGZpbmFsIHJlc3VsdCwgdGhhbiBhbmFseXNlIGlmIHdlIGFjdHVhbGx5IG5lZWQgdGhpcwotICAgICAgICBPTVBCYXNpY0Jsb2NrICAgICAgIGJuID0gbmV3IE9NUEJhc2ljQmxvY2soKTsKLSAgICAgICAgYm4uc2V0QnJhbmNoaW5nRXhwcmVzc2lvbihjb25kaXRpb24sIE9NUEJhc2ljQmxvY2suRm9yQnJhbmNoKTsKLSAgICAgICAgT01QQmFzaWNCbG9jayAgICAgICBqbiA9IG5ldyBPTVBCYXNpY0Jsb2NrKCk7Ci0gICAgICAgCi0gICAgICAgIE9NUENGR01ha2VyICBpbml0QnVpbGRlciA9IG5ldyBPTVBDRkdNYWtlcihpbml0aWFsaXplcik7Ci0gICAgICAgIGluaXRCdWlsZGVyLmJ1aWxkQ0ZHKCk7Ci0gICAgICAgIE9NUENGR1Jlc3VsdCBjSW5pdCA9IGluaXRCdWlsZGVyLmdldFJlc3VsdCgpOyAKLSAgICAgICAgCi0gICAgICAgIE9NUENGR01ha2VyIGZvckJvZHlGYWN0b3J5ID0gbmV3IE9NUENGR01ha2VyKGJvZHkpOwotICAgICAgICBmb3JCb2R5RmFjdG9yeS5idWlsZENGRygpOwotICAgICAgICBPTVBDRkdSZXN1bHQgY0JvZHkgPSBmb3JCb2R5RmFjdG9yeS5nZXRSZXN1bHQoKTsKLSAgICAgICAgCi0gICAgICAgIE9NUENGR01ha2VyIGl0ZXJCb2R5RmFjdG9yeSA9IG5ldyBPTVBDRkdNYWtlcihpdGVyYXRpb24pOwotICAgICAgICBpdGVyQm9keUZhY3RvcnkuYnVpbGRDRkcoKTsKLSAgICAgICAgT01QQ0ZHUmVzdWx0IGNJdGVyID0gaXRlckJvZHlGYWN0b3J5LmdldFJlc3VsdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQnVpbGQgdGhlIHByaW1hcnkgc3RydWN0dXJlIG9mIHRoZSBsb29wCi0gICAgICAgIGNJbml0LmdldExhc3RDaGFpbigpLmdldFRhaWxOb2RlKCkuY29ubmVjdFRvKGJuKTsKLSAgICAgICAgYm4uY29ubmVjdFRvKGpuKTsKLSAgICAgICAgYm4uY29ubmVjdFRvKGNCb2R5LmdldEZpcnN0Q2hhaW4oKS5nZXRIZWFkTm9kZSgpKTsKLSAgICAgICAgY0JvZHkuZ2V0TGFzdENoYWluKCkuZ2V0VGFpbE5vZGUoKS5jb25uZWN0VG8oY0l0ZXIuZ2V0Rmlyc3RDaGFpbigpLmdldEhlYWROb2RlKCkpOwotICAgICAgICBjSXRlci5nZXRMYXN0Q2hhaW4oKS5nZXRUYWlsTm9kZSgpLmNvbm5lY3RUbyhibik7Ci0gICAgICAgIAotICAgICAgICAvLyBmb3IgYWxsIHRoZSBicmVha3MgYW5kIGNvbnRpbnVlcywgbG9vayBhdCB1bnJlc29sdmVkIGNvbnRyb2wgZmxvdyBsaXN0IGFuZCBkZWFsIHdpdGggaXQKLSAgICAgICAgTGlua2VkTGlzdCB1Y2YgPSBjQm9keS5nZXRVbnJlc29sdmVkQ29udHJvbEZsb3coKTsKLSAgICAgICAgT2JqZWN0IFtdIHVMaXN0ID0gdWNmLnRvQXJyYXkoKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8dUxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENoYWluIHVyY2YgPSAoQ2hhaW4pdUxpc3RbaV07Ci0gICAgICAgICAgICBpZiAodXJjZi5nZXRUZXJtaW5hdGlvblJlYXNvbigpPT1PTVBDRkdSZXN1bHQuVGVybUJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgdXJjZi5nZXRUYWlsTm9kZSgpLmNvbm5lY3RUbyhqbik7Ci0gICAgICAgICAgICAgICAgY0JvZHkucmVtb3ZlVW5yZXNvbHZlZENvbnRyb2xGbG93KHVyY2YpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodXJjZi5nZXRUZXJtaW5hdGlvblJlYXNvbigpPT1PTVBDRkdSZXN1bHQuVGVybUNvbnRpbnVlKSB7Ci0gICAgICAgICAgICAgICAgdXJjZi5nZXRUYWlsTm9kZSgpLmNvbm5lY3RUbyhjSXRlci5nZXRGaXJzdENoYWluKCkuZ2V0SGVhZE5vZGUoKSk7Ci0gICAgICAgICAgICAgICAgY0JvZHkucmVtb3ZlVW5yZXNvbHZlZENvbnRyb2xGbG93KHVyY2YpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm93IHdlIGNoZWNrIGlmIHdlIGFyZSBhbGwgcmVzb2x2ZWQgLSBvbmx5IGNoZWNrIHRoZSBib2R5Ci0gICAgICAgIGlmICghZ2V0UmVsZXZhbmNlKGNCb2R5KSkgewotICAgICAgICAgICAgYWRkVG9CYXNpY0Jsb2NrKGZvclN0bXQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGFkZCBhbGwgdGhpcyBpbnRvIHRoZSBjb250cm9sIGZsb3cgZ3JhcGgKLSAgICAgICAgCi0gICAgICAgIC8vIG1lcmdlIHJlc3VsdHMgZm9yIGFsbCBjaGFpbnMKLSAgICAgICAgcmVzdWx0Xy5tZXJnZShjSW5pdCk7Ci0gICAgICAgIHJlc3VsdF8ubWVyZ2UoY0l0ZXIpOwotICAgICAgICByZXN1bHRfLm1lcmdlKGNCb2R5KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0byBjdXJyZW50IGNoYWluCi0gICAgICAgIGFkZFRvQ2hhaW4oY0luaXQuZ2V0Rmlyc3RDaGFpbigpLmdldEhlYWROb2RlKCksIHRydWUpOwotICAgICAgICBhZGRUb0NoYWluKGJuLCB0cnVlKTsKLSAgICAgICAgYWRkVG9DaGFpbihqbiwgZmFsc2UpOyAgICAvLyBibiBhbHJlYWR5IGNvbm5lY3RlZCB0byBqbgotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRSZWxldmFuY2UgLSBMb29rIGF0IHJlc3VsdCBmb3IgZXhpc3RlbmNlIG9mIHByYWdtYXMsIG9yIAotICAgICAqICAgICAgICAgICAgICAgIG9mIGxhYmVscywgb3Igb2YgdW5yZXNvbHZlZCBjb250cm9sIGZsb3cKLSAgICAgKiBAcGFyYW0gcmVzdWx0IC0gT01QQ0ZHUmVzdWx0Ci0gICAgICogQHJldHVybiAtIGJvb2xlYW4gKHRydWUgbWVhbnMgYW55IG9mIHRoZSBhYm92ZSBleGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFJlbGV2YW5jZShPTVBDRkdSZXN1bHQgcmVzdWx0KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB0ZiA9IChyZXN1bHQuZ2V0TnVtYmVyT2ZQcmFnbWFzKCkhPTAgfHwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TnVtYmVyT2ZMYWJlbHMoKSE9MCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VW5yZXNvbHZlZENvbnRyb2xGbG93KCkuc2l6ZSgpIT0wKTsKLSAgICAgICAgcmV0dXJuIHRmOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgT01QUHJhZ21hTm9kZSBnZXRMYXN0UHJhZ21hKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAocHJhZ21hQ29udGV4dF8uaXNFbXB0eSgpID8gbnVsbCA6IChPTVBQcmFnbWFOb2RlKXByYWdtYUNvbnRleHRfLnBlZWsoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZFRvQmFzaWNCbG9jayAtIGFkZCBhIHN0YXRlbWVudCB0byB0aGUgYmFzaWMgYmxvY2sKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50IC0gSUFTVFN0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUb0Jhc2ljQmxvY2soSUFTVFN0YXRlbWVudCBzdGF0ZW1lbnQpCi0gICAgewotICAgICAgICAvLyBkZWZhdWx0IGNhc2UsIHdlIGFyZSBlaXRoZXIgYWRkaW5nIGEgc3RhdGVtZW50IHRvIGEgY3VycmVudCBiYXNpYyBibG9jawotICAgICAgICBpZiAoY3VycmVudE5vZGVfPT1udWxsIHx8ICEoY3VycmVudE5vZGVfIGluc3RhbmNlb2YgT01QQmFzaWNCbG9jaykpIHsKLSAgICAgICAgICAgIE9NUEJhc2ljQmxvY2sgYiA9IG5ldyBPTVBCYXNpY0Jsb2NrKCk7Ci0gICAgICAgICAgICBiLnNldFByYWdtYUNvbnRleHQoZ2V0TGFzdFByYWdtYSgpKTsKLSAgICAgICAgICAgIGFkZFRvQ2hhaW4oYik7Ci0gICAgICAgICAgIC8vIGN1cnJlbnROb2RlXyA9IG5ldyBCYXNpY0Jsb2NrKCk7Ci0gICAgICAgICAgICBpZiAodHJhY2VPbl8pCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDRkdGYWN0b3J5OiBDcmVhdGUgQmFzaWNCbG9jayIpOwotICAgICAgICAgICAgLy9maXJzdE5vZGVfICAgPSBjdXJyZW50Tm9kZV87Ci0gICAgICAgIH0KLSAgICAgICAgKChPTVBCYXNpY0Jsb2NrKWN1cnJlbnROb2RlXykuYWRkU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkQmFzaWNCbG9ja0JyYW5jaChJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgdHlwZSkKLSAgICB7Ci0gICAgICAgIC8vIEFkZCBhIG5ldyBCQiBpZiB0aGUgY3VycmVudCBpcyBudWxsLCBvciBpcyBub3QgYSBiYXNpYyBibG9jawotICAgICAgICBpZiAoY3VycmVudE5vZGVfPT1udWxsIHx8ICEoY3VycmVudE5vZGVfIGluc3RhbmNlb2YgT01QQmFzaWNCbG9jaykpIHsKLSAgICAgICAgICAgIGFkZFRvQ2hhaW4obmV3IE9NUEJhc2ljQmxvY2soKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAodHJhY2VPbl8pCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDRkdGYWN0b3J5OiBDcmVhdGUgQmFzaWNCbG9jayIpOwotICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KCgoT01QQmFzaWNCbG9jayljdXJyZW50Tm9kZV8pLmdldEJyYW5jaGluZ0V4cHJlc3Npb24oKT09bnVsbCk7Ci0gICAgICAgKChPTVBCYXNpY0Jsb2NrKWN1cnJlbnROb2RlXykuc2V0QnJhbmNoaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLCB0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGRUb0N1cnJlbnRDaGFpbiAtIGFkZCB0aGUgQ0ZHTm9kZSB0byB0aGUgY3VycmVudCBjaGFpbgotICAgICAqIEBwYXJhbSBub2RlIC0gT01QQ0ZHTm9kZQotICAgICAqIEBwYXJhbSBjb25uZWN0IC0gY29ubmVjdCB0byBwcmlvciBub2RlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvQ2hhaW4oT01QQ0ZHTm9kZSBub2RlLCBib29sZWFuIGNvbm5lY3QpCi0gICAgewotICAgICAgICBpZiAoZmlyc3ROb2RlXz09bnVsbCkgewotICAgICAgICAgICAgZmlyc3ROb2RlXyAgID0gbm9kZTsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlXyA9IG5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdCkKLSAgICAgICAgICAgICAgY3VycmVudE5vZGVfLmNvbm5lY3RUbyhub2RlKTsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlXyA9IG5vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGRUb0NoYWluIC0gc2hvcnQgaGFuZCB0byBhZGQgYW5kIGNvbm5lY3QgdG8gY2hhaW4KLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUb0NoYWluKE9NUENGR05vZGUgbm9kZSkgeyBhZGRUb0NoYWluKG5vZGUsIHRydWUpOyB9Ci0gICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRUb0Jhc2ljQmxvY2tBbmRDaGFpbihJQVNUU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IHRlcm1SZWFzb24pCi0gICAgewotICAgICAgICBhZGRUb0Jhc2ljQmxvY2soc3RhdGVtZW50KTsKLSAgICAgICAgQ2hhaW4gY2hhaW4gPSByZXN1bHRfLmFkZENoYWluKGZpcnN0Tm9kZV8sIGN1cnJlbnROb2RlXywgdGVybVJlYXNvbiwgc3RhdGVtZW50KTsKLSAgICAgICAgaWYgKHRlcm1SZWFzb249PU9NUENGR1Jlc3VsdC5UZXJtQnJlYWsgfHwgdGVybVJlYXNvbj09T01QQ0ZHUmVzdWx0LlRlcm1Db250aW51ZSB8fAotICAgICAgICAgICAgdGVybVJlYXNvbj09T01QQ0ZHUmVzdWx0LlRlcm1SZXR1cm4pCi0gICAgICAgICAgICByZXN1bHRfLmFkZFVucmVzb2x2ZWRDb250cm9sRmxvdyhjaGFpbik7Ci0gICAgICAgIGN1cnJlbnROb2RlXyA9IG51bGw7Ci0gICAgICAgIGZpcnN0Tm9kZV8gICA9IG51bGw7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9PTVBDRkdSZXN1bHQuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvT01QQ0ZHUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGY3Y2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9PTVBDRkdSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuZmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEdvdG9TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RTdGF0ZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUEJhc2ljQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBDRkdOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QUHJhZ21hTm9kZTsKLQotLyoqCi0gKiBDb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHBhc3Mgb2YgT01QQ0ZHbWFrZXIKLSAqIAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIE9NUENGR1Jlc3VsdAotewotICAgIC8qKiBMaXN0IG9mIHNlcXVlbnRpYWwgY2hhaW5zIGluIDEtbGV2ZWwgcGFzczogdGhlIGNvbnRyb2wgZmxvdyBiZXR3ZWVuCi0gICAgKiBjaGFpbnMgaXMgYnJva2VuIGJ5IGNvbnRpbnVlLCBicmVhaywgcmV0dXJuLCBvciBnb3RvCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBjaGFpbnNfICAgICAgICAgICAgPSBuZXcgTGlua2VkTGlzdCgpOyAgLy8gb2YgQ2hhaW4KLSAgICAvKiogTGlzdCBvZiBjaGFpbnMgd2l0aCBubyBzZXF1ZW50aWFsIGZsb3cgdG8gZW50cnkgcG9pbnQgLSB0aGVzZSBnZXQgCi0gICAgKiBhZ2dyZWdhdGVkLiAgIENvdWxkIGJlIGRlYWQgY29kZSwgYnV0IGNvdWxkIGJlIGJyYW5jaGVkIGludG8uCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCB1bmNvbm5lY3RlZENoYWluc18gPSBuZXcgTGlua2VkTGlzdCgpOyAgLy8gb2YgQ2hhaW4KLSAgICAvKiogTGlzdCBvZiBibG9ja3MgZW5kaW5nIGluIGNvbnRpbnVlLCBicmVhaywgcmV0dXJuLCBvciBnb3RvIHdob3NlIGZ1cnRoZXIKLSAgICAqIGNvbnRpbnVhdGlvbiBuZWVkcyB0byBiZSByZXNvbHZlZAotICAgICovCi0gICAgcHJvdGVjdGVkIExpbmtlZExpc3QgdW5yZXNvbHZlZENvbnRyb2xGbG93XyA9IG5ldyBMaW5rZWRMaXN0KCk7ICAvLyBvZiBDaGFpbgotICAgIC8qKiBsaXN0IG9mIGxhYmVsZWQgYmxvY2tzIChhbmQgcmVsYXRlZCBjaGFpbikgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGxhYmVsTWFwXyAgICAgICAgICAgICAgPSBuZXcgSGFzaHRhYmxlKCk7ICAvLyBJQVNUTmFtZS0+TGFiZWxlZEJsb2NrCi0gICAgLyoqIGxpc3Qgb2YgcHJhZ21hIG5vZGVzIGVuY291bnRlcmVkICovCi0gICAgcHJvdGVjdGVkIExpbmtlZExpc3QgcHJhZ21hTm9kZUxpc3RfICAgICAgID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAKLSAgICAvKiogYmxvY2sgdGVybWluYXRpb24gcmVhc29uIC0gdW5rbm93biAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRlcm1Vbmtub3duID0gLTE7Ci0gICAgLyoqIGJsb2NrIHRlcm1pbmF0aW9uIHJlYXNvbiAtIG5vIHRlcm1pbmF0aW9uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGVybUZvcndhcmQgPSAwOyAgICAvLyBubyB0ZXJtaW5hdGlvbgotICAgIC8qKiBibG9jayB0ZXJtaW5hdGlvbiByZWFzb24gLSBjb250aW51ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRlcm1Db250aW51ZSA9IDE7ICAgLy8gY29udGludWUKLSAgICAvKiogYmxvY2sgdGVybWluYXRpb24gcmVhc29uIC0gYnJlYWsgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXJtQnJlYWsgICAgPSAyOyAgIC8vIGJyZWFrCi0gICAgLyoqIGJsb2NrIHRlcm1pbmF0aW9uIHJlYXNvbiAtIHJldHVybiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRlcm1SZXR1cm4gICA9IDM7ICAgLy8gcmV0dXJuCi0gICAgLyoqIGJsb2NrIHRlcm1pbmF0aW9uIHJlYXNvbiAtIGdvdG8gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXJtR290byAgICAgPSA0OyAgIC8vIGdvdG8KLSAgICAKLSAgICAvKioKLSAgICAgKiBPTVBDRkdSZXN1bHQgLSBjb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIE9NUENGR1Jlc3VsdCgpIHsgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZENoYWluIC0gYWRkIGEgY2hhaW4gdG8gdGhlIGNoYWluTGlzdAotICAgICAqIEBwYXJhbSBoZWFkTm9kZQotICAgICAqIEBwYXJhbSB0YWlsTm9kZQotICAgICAqIEBwYXJhbSB0ZXJtaW5hdGlvblJlYXNvbgotICAgICAqIEBwYXJhbSB0ZXJtU3RtdAotICAgICAqLwotICAgIHB1YmxpYyBDaGFpbiBhZGRDaGFpbihPTVBDRkdOb2RlIGhlYWROb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT01QQ0ZHTm9kZSB0YWlsTm9kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXJtaW5hdGlvblJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSUFTVFN0YXRlbWVudCB0ZXJtU3RtdCkKLSAgICB7Ci0gICAgICAgIENoYWluIGNoYWluID0gbmV3IENoYWluKGhlYWROb2RlLCB0YWlsTm9kZSwgdGVybWluYXRpb25SZWFzb24sIHRlcm1TdG10KTsKLSAgICAgICAgY2hhaW5zXy5hZGQoY2hhaW4pOwotICAgICAgICAKLSAgICAgICAgLy8gcnVuIHRocm91Z2ggY2hhaW4gdG8gZmluZCBhbGwgbGFiZWxlZCBibG9ja3MgYW5kIGFkZCB0byBsYWJlbG1hcAotICAgICAgICBhZGRMYWJlbHMoY2hhaW4pOwotICAgICAgICBhZGRQcmFnbWFzKGNoYWluKTsKLSAgICAgICAgcmV0dXJuIGNoYWluOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBhZGRDaGFpbiAtIGFkZCBhIGNoYWluIHRvIHRoaXMgcmVzdWx0Ci0gICAgICogQHBhcmFtIGNoYWluIC0gQ2hhaW4KLSAgICAgKiBAcmV0dXJuIENoYWluCi0gICAgICovCi0gICAgcHVibGljIENoYWluIGFkZENoYWluKENoYWluIGNoYWluKQotICAgIHsKLSAgICAgICAgY2hhaW5zXy5hZGQoY2hhaW4pOwotICAgICAgICBhZGRMYWJlbHMoY2hhaW4pOwotICAgICAgICBhZGRQcmFnbWFzKGNoYWluKTsKLSAgICAgICAgcmV0dXJuIGNoYWluOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkTGFiZWxzKENoYWluIGNoYWluKQotICAgIHsKLSAgICAgICAgT01QQ0ZHTm9kZSBub2RlID0gY2hhaW4uZ2V0SGVhZE5vZGUoKTsKLSAgICAgICAgd2hpbGUobm9kZSE9bnVsbCkgewotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPTVBCYXNpY0Jsb2NrKSB7Ci0gICAgICAgICAgICAgICAgSUFTVE5hbWUgbGFiZWwgPSAoKE9NUEJhc2ljQmxvY2spbm9kZSkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgICAgICBpZiAobGFiZWwhPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFsYWJlbE1hcF8uY29udGFpbnNLZXkobGFiZWwpKQotICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE1hcF8ucHV0KGxhYmVsLCBuZXcgTGFiZWxlZEJsb2NrKG5vZGUsIGNoYWluKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZT1ub2RlLmdldFN1Y2Nlc3NvcigpOyAgLy8gdXNlIHRoaXMga25vd2luZyBlYWNoIG5vZGUgaGFzIGEgZm9sbG93ZXIKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkUHJhZ21hcyhDaGFpbiBjaGFpbikKLSAgICB7Ci0gICAgICAgIE9NUENGR05vZGUgbm9kZSA9IGNoYWluLmdldEhlYWROb2RlKCk7Ci0gICAgICAgIHdoaWxlKG5vZGUhPW51bGwpIHsKLSAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgT01QUHJhZ21hTm9kZSkgewotICAgICAgICAgICAgICAgIGlmICghcHJhZ21hTm9kZUxpc3RfLmNvbnRhaW5zKG5vZGUpKQotICAgICAgICAgICAgICAgICAgIHByYWdtYU5vZGVMaXN0Xy5hZGQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlPW5vZGUuZ2V0U3VjY2Vzc29yKCk7ICAvLyB1c2UgdGhpcyBrbm93aW5nIGVhY2ggbm9kZSBoYXMgYSBmb2xsb3dlcgotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1lcmdlKE9NUENGR1Jlc3VsdCByZXN1bHQpCi0gICAgewotICAgICAgICAvLyB3ZSBkb24ndCBtZXJnZSBjaGFpbnNfOwotICAgICAgICAKLSAgICAgICAgLy8gd2UgbWVyZ2UgYWxsIHRoZSBvdGhlcnMKLSAgICAgICAgdW5jb25uZWN0ZWRDaGFpbnNfLmFkZEFsbChyZXN1bHQuZ2V0VW5jb25uZWN0ZWRDaGFpbnMoKSk7Ci0gICAgICAgIHVucmVzb2x2ZWRDb250cm9sRmxvd18uYWRkQWxsKHJlc3VsdC5nZXRVbnJlc29sdmVkQ29udHJvbEZsb3coKSk7Ci0gICAgICAgIGxhYmVsTWFwXy5wdXRBbGwocmVzdWx0LmdldExhYmVsTWFwKCkpOwotICAgICAgICBwcmFnbWFOb2RlTGlzdF8uYWRkQWxsKHJlc3VsdC5nZXRQcmFnbWFOb2RlTGlzdCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCi0gICAgewotICAgICAgICAvLyBVc3VhbGx5IGRvbmUgdG8gdGhlIGZpbmFsIGNmZyByZXN1bHRzCi0gICAgICAgIC8vIHdlIHRyeSB0byByZXNvbHZlIGFsbCB1bnJlc29sdmVkIGNvbnRyb2wgZmxvdyAoZ290bydzKSBhbmQgCi0gICAgICAgIC8vIHJldHVybi9leGl0IG5vZGVzIChzaW5rKQotICAgICAgICAvLyBhbmQgbWF5YmUgZmxhZyBhbGwgdW5jb25uZWN0ZWQgY2hhaW5zIGFzIGRlYWQgY29kZQotICAgICAgICAKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9dW5yZXNvbHZlZENvbnRyb2xGbG93Xy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBDaGFpbiB1Q2hhaW4gPSAoQ2hhaW4paS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodUNoYWluLmdldFRlcm1pbmF0aW9uUmVhc29uKCk9PVRlcm1Hb3RvKSB7Ci0gICAgICAgICAgICAgICAgSUFTVFN0YXRlbWVudCB0U3RtdCA9IHVDaGFpbi5nZXRUZXJtaW5hdGlvblN0bXQoKTsKLSAgICAgICAgICAgICAgICBpZiAodFN0bXQhPW51bGwgJiYgKHRTdG10IGluc3RhbmNlb2YgSUFTVEdvdG9TdGF0ZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElBU1ROYW1lIHRhcmdldExhYmVsID0gKChJQVNUR290b1N0YXRlbWVudCl0U3RtdCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBPTVBDRkdOb2RlIGxOb2RlID0gKE9NUENGR05vZGUpbGFiZWxNYXBfLmdldCh0YXJnZXRMYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsTm9kZSE9bnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdUNoYWluLmdldFRhaWxOb2RlKCkuY29ubmVjdFRvKGxOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVVucmVzb2x2ZWRDb250cm9sRmxvdyh1Q2hhaW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFVuY29ubmVjdGVkQ2hhaW4oQ2hhaW4gY2hhaW4pCi0gICAgewotICAgICAgICB1bmNvbm5lY3RlZENoYWluc18uYWRkKGNoYWluKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVW5yZXNvbHZlZENvbnRyb2xGbG93KENoYWluIGNoYWluKQotICAgIHsKLSAgICAgICAgdW5yZXNvbHZlZENvbnRyb2xGbG93Xy5hZGQoY2hhaW4pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVVbnJlc29sdmVkQ29udHJvbEZsb3coQ2hhaW4gY2hhaW4pCi0gICAgewotICAgICAgICB1bnJlc29sdmVkQ29udHJvbEZsb3dfLnJlbW92ZShjaGFpbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMYWJlbHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhYmVsTWFwXy5zaXplKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQcmFnbWFzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcmFnbWFOb2RlTGlzdF8uc2l6ZSgpOwotICAgIH0KLSAgICAKLSAgICAvLyBhY2Nlc3NvcnMKLSAgICBwdWJsaWMgTGlua2VkTGlzdCBnZXRDaGFpbnMoKSAgeyAgcmV0dXJuIGNoYWluc187ICB9Ci0gICAgcHVibGljIExpbmtlZExpc3QgZ2V0VW5jb25uZWN0ZWRDaGFpbnMoKSB7IHJldHVybiB1bmNvbm5lY3RlZENoYWluc187IH0KLSAgICBwdWJsaWMgTGlua2VkTGlzdCBnZXRVbnJlc29sdmVkQ29udHJvbEZsb3coKSB7IHJldHVybiB1bnJlc29sdmVkQ29udHJvbEZsb3dfOyB9Ci0gICAgcHVibGljIEhhc2h0YWJsZSAgZ2V0TGFiZWxNYXAoKSB7IHJldHVybiBsYWJlbE1hcF87IH0KLSAgICBwdWJsaWMgTGlua2VkTGlzdCBnZXRQcmFnbWFOb2RlTGlzdCgpIHsgcmV0dXJuIHByYWdtYU5vZGVMaXN0XzsgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmVyeSBmaXJzdCBjaGFpbiAtIGEgY29tbW9uIHdhbnQgaW4gdGhlIGNvZGUgKG90aGVyIGFyZSBkZWFkIGNvZGUpCi0gICAgICogQHJldHVybiBDaGFpbgotICAgICAqLwotICAgIHB1YmxpYyBDaGFpbiAgICAgIGdldEZpcnN0Q2hhaW4oKSB7IHJldHVybiAoY2hhaW5zXy5zaXplKCk+MCA/IChDaGFpbikoY2hhaW5zXy5nZXRGaXJzdCgpKSA6IG51bGwpOyB9Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2ZXJ5IGxhc3QgY2hhaW4gLSBhIGNvbW1vbiB3YW50IGluIHRoZSBjb2RlIChvdGhlciBhcmUgZGVhZCBjb2RlKQotICAgICAqIEByZXR1cm4gQ2hhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hhaW4gICAgICBnZXRMYXN0Q2hhaW4oKSAgeyByZXR1cm4gKGNoYWluc18uc2l6ZSgpPjAgPyAoQ2hhaW4pKGNoYWluc18uZ2V0TGFzdCgpKSAgOiBudWxsKTsgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiAgQ2hhaW4gLSBxdWFsaWZpZXMgYSBjb2RlIGNoYWluCi0gICAgICoKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIENoYWluCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgT01QQ0ZHTm9kZSAgICBoZWFkTm9kZV8gPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgT01QQ0ZHTm9kZSAgICB0YWlsTm9kZV8gPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgICB0ZXJtaW5hdGlvblJlYXNvbl8gPSBUZXJtVW5rbm93bjsKLSAgICAgICAgcHJvdGVjdGVkIElBU1RTdGF0ZW1lbnQgdGVybWluYXRpb25TdG10XyAgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIENoYWluKE9NUENGR05vZGUgaGVhZE5vZGUsIE9NUENGR05vZGUgdGFpbE5vZGUsIGludCB0ZXJtaW5hdGlvblJlYXNvbiwgSUFTVFN0YXRlbWVudCB0ZXJtU3RhdGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBoZWFkTm9kZV89aGVhZE5vZGU7ICB0YWlsTm9kZV89dGFpbE5vZGU7ICAKLSAgICAgICAgICAgIHRlcm1pbmF0aW9uUmVhc29uXyA9IHRlcm1pbmF0aW9uUmVhc29uOyB0ZXJtaW5hdGlvblN0bXRfID0gdGVybVN0YXRlbWVudDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIEdldCBoZWFkIG5vZGUgaW4gdGhlIENoYWluICovCi0gICAgICAgIHB1YmxpYyBPTVBDRkdOb2RlIGdldEhlYWROb2RlKCkgeyByZXR1cm4gaGVhZE5vZGVfOyB9Ci0gICAgICAgIAotICAgICAgICAvKiogR2V0IHRhaWwgbm9kZSBpbiB0aGUgQ2hhaW4gKi8KLSAgICAgICAgcHVibGljIE9NUENGR05vZGUgZ2V0VGFpbE5vZGUoKSB7IHJldHVybiB0YWlsTm9kZV87IH0KLSAgICAgICAgcHVibGljIGludCAgICAgZ2V0VGVybWluYXRpb25SZWFzb24oKSB7IHJldHVybiB0ZXJtaW5hdGlvblJlYXNvbl87IH0KLSAgICAgICAgcHVibGljIElBU1RTdGF0ZW1lbnQgZ2V0VGVybWluYXRpb25TdG10KCkgeyByZXR1cm4gdGVybWluYXRpb25TdG10XzsgfQotICAgIH0KLSAgICAKLSAgICAvKiogTGFiZWxlZEJsb2NrIC0gcXVhbGlmaWVzIGEgYmxvY2sgd2l0aCBhIGxhYmVsICovCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBMYWJlbGVkQmxvY2sKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBPTVBDRkdOb2RlIGxhYmVsZWRCbG9ja18gPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgQ2hhaW4gICAgICByZWxhdGVkQ2hhaW5fID0gbnVsbDsgIC8vIGNoYWluIGhvbGRpbmcgYmxvY2sKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMYWJlbGVkQmxvY2soT01QQ0ZHTm9kZSBsYWJlbGVkQmxvY2ssIENoYWluIHJlbGF0ZWRDaGFpbikKLSAgICAgICAgewotICAgICAgICAgICAgbGFiZWxlZEJsb2NrXyA9IGxhYmVsZWRCbG9jazsKLSAgICAgICAgICAgIHJlbGF0ZWRDaGFpbl8gPSByZWxhdGVkQ2hhaW47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPTVBDRkdOb2RlIGdldExhYmVsZWRCbG9jaygpICB7IHJldHVybiBsYWJlbGVkQmxvY2tfOyB9Ci0gICAgICAgIHB1YmxpYyBDaGFpbiAgICAgIGdldFJlbGF0ZWRDaGFpbigpICB7IHJldHVybiByZWxhdGVkQ2hhaW5fOyB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1BBU1RTZW1hbnRpY0NoZWNrLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1BBU1RTZW1hbnRpY0NoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTFmZWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9QQVNUU2VtYW50aWNDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5mYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5PcGVuTVBFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuT3Blbk1QRXJyb3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5QQVNULlBBU1RPTVBQcmFnbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBDRkc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBDRkdOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QREZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QUHJhZ21hTm9kZTsKLQotLyoqCi0gKiBMb29rIGZvciBjb21tb24gc2VtYW50aWMgZXJyb3JzCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQQVNUU2VtYW50aWNDaGVjawotewotICAgIHByb3RlY3RlZCBpbnQgbnVtRXJyb3JzXyA9IDA7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFBBU1RTZW1hbnRpY0NoZWNrKE9NUENGRyBjZmcpCi0gICAgewotICAgICAgICBTZW1hbnRpY0RGUyBkZnMgPSBuZXcgU2VtYW50aWNERlMoY2ZnLmdldFJvb3QoKSk7Ci0gICAgICAgIGRmcy5zdGFydFdhbGtpbmcoKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrU2VtYW50aWNzKE9NUENGRyBjZmcpCi0gICAgewotICAgICAgICBQQVNUU2VtYW50aWNDaGVjayBwc2MgPSBuZXcgUEFTVFNlbWFudGljQ2hlY2soY2ZnKTsKLSAgICAgICAgcmV0dXJuIHBzYy5nZXROdW1FcnJvcnMoKT09MCA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXROdW1FcnJvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bUVycm9yc187Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja1ByYWdtYVNlbWFudGljcyhPTVBQcmFnbWFOb2RlIHBub2RlKQotICAgIHsKLSAgICAgICAgUEFTVE9NUFByYWdtYSBwcmFnbWEgPSBwbm9kZS5nZXRQcmFnbWEoKTsKLSAgICAgICAgaWYgKHByYWdtYT09bnVsbCkgIC8vIGltcGxpY2l0IGJhcnJpZXIKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaChwcmFnbWEuZ2V0T01QVHlwZSgpKSB7Ci0gICAgICAgICAgICAvLyBmb2xsb3dlZCBieSBzdHJ1Y3R1cmVkIHJlZ2lvbgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsOgotICAgICAgICAgICAgICAgcGFyYWxsZWxDaGVjayhwbm9kZSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBTZWN0aW9uczoKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBTZWN0aW9uOgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsU2VjdGlvbnM6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wU2luZ2xlOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcE1hc3RlcjoKLSAgICAgICAgICAgICAgICBtYXN0ZXJDaGVjayhwbm9kZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wQ3JpdGljYWw6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wT3JkZXJlZDoKLSAgICAgICAgICAgICAgICBvcmRlcmVkQ2hlY2socG5vZGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTXVzdCBiZSBmb2xsb3dlZCBieSBGT1IKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBGb3I6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxGb3I6Ci0gICAgICAgICAgICAgICAgZm9yQ2hlY2socG5vZGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBTdGFuZHMgYWxvbmUKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBCYXJyaWVyOgotICAgICAgICAgICAgICAgIGJhcnJpZXJDaGVjayhwbm9kZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wRmx1c2g6Ci0gICAgICAgICAgICBjYXNlIFBBU1RPTVBQcmFnbWEuT21wVGhyZWFkUHJpdmF0ZToKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRm9sbG93ZWQgYnkgZXhwcmVzc2lvbgotICAgICAgICAgICAgY2FzZSBQQVNUT01QUHJhZ21hLk9tcEF0b21pYzoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFTVE9NUFByYWdtYS5PbXBVbmtub3duOgotICAgICAgICAgICAgICAgIHJldHVybjsgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcGFyYWxsZWxDaGVjayAtIHNlbWFudGljIGNoZWNrIGZvciBQYXJhbGxlbCBzdGF0ZW1lbnRzCi0gICAgICogQHBhcmFtIHBub2RlIC0gT01QUHJhZ21hTm9kZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJhbGxlbENoZWNrKE9NUFByYWdtYU5vZGUgcG5vZGUpCi0gICAgewotICAgICAgICAvLyBBIHBhcmFsbGVsIGRpcmVjdGl2ZSBkeW5hbWljYWxseSBpbnNpZGUgYW5vdGhlciBwYXJhbGxlbAotICAgICAgICAvLyBsb2dpY2FsbHkgZXRhYmxpc2hlcyBhIG5ldyB0ZWFtIHdoaWNoIGlzIGNvbXBvc2VkIG9mIG9ubHkgdGhlIGN1cnJlbnQgdGhyZWFkLAotICAgICAgICAvLyB1bmxlc3MgbmVzdGVkIHBhcmFsbGVsaXNtIGlzIGVuYWJsZWQuCi0gICAgICAgIE9NUFByYWdtYU5vZGUgcGFyZW50ID0gcG5vZGUuZ2V0Q29udGV4dFByZWRlY2Vzc29yKCk7Ci0gICAgICAgIHdoaWxlKHBhcmVudCE9bnVsbCkgewotICAgICAgICAgICAgaW50IHBUeXBlID0gcGFyZW50LmdldFByYWdtYSgpLmdldE9NUFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbCB8fAotICAgICAgICAgICAgICAgIHBUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsRm9yIHx8Ci0gICAgICAgICAgICAgICAgcFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxTZWN0aW9ucykgewotICAgICAgICAgICAgICAgIGhhbmRsZVByb2JsZW0ocG5vZGUuZ2V0UHJhZ21hKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFsbGVsIGRpcmVjdGl2ZSBkeW5hbWljYWxseSBpbnNpZGUgYW5vdGhlciBwYXJhbGxlbCwgZXN0YWJsaXNoZXMgc2luZ2xlIHRocmVhZCBjb250ZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUEVycm9yLldBUk4pOwotICAgICAgICAgICAgICAgIG51bUVycm9yc18rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250ZXh0UHJlZGVjZXNzb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGZvckNoZWNrIC0gU2VtYW50aWMgY2hlY2sgZm9yIEZvci9wYXJhbGxlbEZvciBzZW1hbnRpYyBtaXN0YWtlcwotICAgICAqIEBwYXJhbSBwbm9kZSAtIE9NUFByYWdtYU5vZGUgKGZvciBmb3IvcGFyYWxsZWxGb3IpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZvckNoZWNrKE9NUFByYWdtYU5vZGUgcG5vZGUpCi0gICAgewotICAgICAgICAvLyBBIGZvciBkaXJlY3RpdmUgaXMgbm90IGFsbG93ZWQgdG8gbmVzdCB3aXRoIGFub3RoZXIgZm9yLCBzZWN0aW9ucywgCi0gICAgICAgIC8vIGFuZCBzaW5nbGUgZGlyZWN0aXZlIGJvdW5kIHRvIHRoZSBzYW1lIHBhcmFsbGVsIAotICAgICAgICAvLyBuZWl0aGVyIGZvciByaXRpY2FsLCBvcmRlcmVkLCBhbmQgbWFzdGVyIHJlZ2lvbnMKLSAgICAgICAgUEFTVE9NUFByYWdtYSBwcmFnbWEgPSBwbm9kZS5nZXRQcmFnbWEoKTsKLSAgICAgICAgYm9vbGVhbiAgICAgICBpc1BhcmFsbGVsID0gKHByYWdtYS5nZXRPTVBUeXBlKCk9PVBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWxGb3IpOwotICAgICAgICBPTVBQcmFnbWFOb2RlIHBhcmVudCA9IHBub2RlLmdldENvbnRleHRQcmVkZWNlc3NvcigpOwotICAgICAgICBib29sZWFuICAgICAgIGVycm9yRm91bmQ9ZmFsc2U7Ci0gICAgICAgIHdoaWxlKHBhcmVudCE9bnVsbCkgewotICAgICAgICAgICAgaW50IHBhcmVudFR5cGUgPSBwYXJlbnQuZ2V0UHJhZ21hKCkuZ2V0T01QVHlwZSgpOwotICAgICAgICAgICAgaWYgKCFlcnJvckZvdW5kKSB7IAotICAgICAgICAgICAgICAgaWYgKHBhcmVudFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wRm9yIHx8Ci0gICAgICAgICAgICAgICAgICAgcGFyZW50VHlwZT09UEFTVE9NUFByYWdtYS5PbXBTZWN0aW9ucyB8fAotICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wU2luZ2xlKSB7Ci0gICAgICAgICAgICAgICAgIGVycm9yRm91bmQ9dHJ1ZTsgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChwYXJlbnRUeXBlPT1QQVNUT01QUHJhZ21hLk9tcENyaXRpY2FsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlPT1QQVNUT01QUHJhZ21hLk9tcE9yZGVyZWQgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlPT1QQVNUT01QUHJhZ21hLk9tcE1hc3RlcikgewotICAgICAgICAgICAgICAgICAgIGhhbmRsZVByb2JsZW0ocG5vZGUuZ2V0UHJhZ21hKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvciBkaXJlY3RpdmUgZW1iZWRkZWQgd2l0aGluIGNyaXRpY2FsLCBvcmRlcmVkLCBvciBtYXN0ZXIgZXh0ZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzXysrOwotICAgICAgICAgICAgICAgICAgIGVycm9yRm91bmQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChwYXJlbnRUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsRm9yIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsU2VjdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKHBub2RlLmdldFByYWdtYSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3IgZGlyZWN0aXZlIGVtYmVkZGVkIHdpdGhpbiBhbm90aGVyIHBhcmFsbGVsIGZvciBvciBwYXJhbGxlbCBzZWN0aW9ucyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzXysrOwotICAgICAgICAgICAgICAgICAgIGVycm9yRm91bmQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzUGFyYWxsZWwgJiYgcGFyZW50VHlwZT09UEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbCkgewotICAgICAgICAgICAgICAgICAgIGhhbmRsZVByb2JsZW0ocG5vZGUuZ2V0UHJhZ21hKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFsbGVsIGRpcmVjdGl2ZSBkeW5hbWljYWxseSBpbnNpZGUgYW5vdGhlciBwYXJhbGxlbCwgZXN0YWJsaXNoZXMgc2luZ2xlIHRocmVhZCBjb250ZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUEVycm9yLldBUk4pOwotICAgICAgICAgICAgICAgICAgIG51bUVycm9yc18rKzsKLSAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVycm9yRm91bmQgJiYgKHBhcmVudFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wUGFyYWxsZWwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsRm9yIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VHlwZT09UEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbFNlY3Rpb25zKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKHBub2RlLmdldFByYWdtYSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJGb3IgZGlyZWN0aXZlIGVtYmVkZGVkIHdpdGhpbiBhbm90aGVyIGZvciwgc2VjdGlvbnMsIG9yIHNpbmdsZSBkaXJlY3RpdmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QRXJyb3IuRVJST1IpOwotICAgICAgICAgICAgICAgIG51bUVycm9yc18rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0Q29udGV4dFByZWRlY2Vzc29yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBiYXJyaWVyQ2hlY2sgLSBzZW1hbnRpYyBjaGVjayBvbiBiYXJyaWVyIHN0YXRlbWVudAotICAgICAqIEBwYXJhbSBwbm9kZSAtIE9NUFByYWdtYU5vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYmFycmllckNoZWNrKE9NUFByYWdtYU5vZGUgcG5vZGUpCi0gICAgewotICAgICAgICAvLyBCYXJyaWVyIGRpcmVjdGl2ZXMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGR5bmFtaWMgZXh0ZW50IG9mIGZvciwgb3JkZXJlZCwgc2VjdGlvbnMsIHNpbmdsZSwKLSAgICAgICAgLy8gbWFzdGVyLCBhbmQgY3JpdGljYWwgcmVnaW9ucwotICAgICAgICBPTVBQcmFnbWFOb2RlIHBhcmVudCA9IHBub2RlLmdldENvbnRleHRQcmVkZWNlc3NvcigpOwotICAgICAgICB3aGlsZShwYXJlbnQhPW51bGwpIHsKLSAgICAgICAgICAgIGludCBwVHlwZSA9IHBhcmVudC5nZXRQcmFnbWEoKS5nZXRPTVBUeXBlKCk7Ci0gICAgICAgICAgICBpZiAocFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wRm9yIHx8IHBUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsRm9yIHx8Ci0gICAgICAgICAgICAgICAgcFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wT3JkZXJlZCB8fCBwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBTZWN0aW9ucyB8fAotICAgICAgICAgICAgICAgIHBUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFNpbmdsZSAgfHwgcFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wTWFzdGVyIHx8Ci0gICAgICAgICAgICAgICAgcFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wQ3JpdGljYWwpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKHBub2RlLmdldFByYWdtYSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJCYXJyaWVyIGRpcmVjdGl2ZSBub3QgcGVybWl0dGVkIGluIHJlZ2lvbiBleHRlbnQgb2YgZm9yLCBvcmRlcmVkLCBzZWN0aW9ucywgc2luZ2xlLCBtYXN0ZXIsIGFuZCBjcml0aWNhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBFcnJvci5FUlJPUik7Ci0gICAgICAgICAgICAgICAgbnVtRXJyb3JzXysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250ZXh0UHJlZGVjZXNzb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIG1hc3RlckNoZWNrIC0gc2VtYW50aWMgY2hlY2sgZm9yIHVzZSBvZiBtYXN0ZXIgZGlyZWN0aXZlCi0gICAgICogQHBhcmFtIHBub2RlIC0gT01QUHJhZ21hTm9kZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXN0ZXJDaGVjayhPTVBQcmFnbWFOb2RlIHBub2RlKQotICAgIHsKLSAgICAgICAgLy8gTWFzdGVyIGRpcmVjdGl2ZXMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGR5bmFtaWMgZXh0ZW50IG9mIAotICAgICAgICAvLyBmb3IsIHNlY3Rpb25zLCBhbmQgc2luZ2xlCi0gICAgICAgIE9NUFByYWdtYU5vZGUgcGFyZW50ID0gcG5vZGUuZ2V0Q29udGV4dFByZWRlY2Vzc29yKCk7Ci0gICAgICAgIHdoaWxlKHBhcmVudCE9bnVsbCkgewotICAgICAgICAgICAgaW50IHBUeXBlID0gcGFyZW50LmdldFByYWdtYSgpLmdldE9NUFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBGbHVzaCB8fCBwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBQYXJhbGxlbEZvciB8fAotICAgICAgICAgICAgICAgIHBUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFNlY3Rpb25zIHx8IHBUeXBlPT1QQVNUT01QUHJhZ21hLk9tcFBhcmFsbGVsU2VjdGlvbnMgfHwKLSAgICAgICAgICAgICAgICBwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBTaW5nbGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9ibGVtKHBub2RlLmdldFByYWdtYSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJNYXN0ZXIgZGlyZWN0aXZlIG5vdCBwZXJtaXR0ZWQgaW4gZHluYW1pYyBleHRlbnQgb2YgZm9yLCBzZWN0aW9ucywgb3Igc2luZ2xlIGRpcmVjdGl2ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QRXJyb3IuRVJST1IpOwotICAgICAgICAgICAgICAgIG51bUVycm9yc18rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250ZXh0UHJlZGVjZXNzb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIG9yZGVyZWRDaGVjayAtIHNlbWFudGljIGNoZWNrIG9uIG9yZGVyZWQgZGlyZWN0aXZlCi0gICAgICogQHBhcmFtIHBub2RlIC0gT01QUHJhZ21hTm9kZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvcmRlcmVkQ2hlY2soT01QUHJhZ21hTm9kZSBwbm9kZSkKLSAgICB7Ci0gICAgICAgIC8vIE9yZGVyZWQgZGlyZWN0aXZlcyBhcmUgbm90IHBlcm1pdHRlZCBpbiB0aGUgZHluYW1pYyBleHRlbmQgb2YgY3JpdGljYWwgcmVnaW9ucyAKLSAgICAgICAgT01QUHJhZ21hTm9kZSBwYXJlbnQgPSBwbm9kZS5nZXRDb250ZXh0UHJlZGVjZXNzb3IoKTsKLSAgICAgICAgd2hpbGUocGFyZW50IT1udWxsKSB7Ci0gICAgICAgICAgICBpbnQgcFR5cGUgPSBwYXJlbnQuZ2V0UHJhZ21hKCkuZ2V0T01QVHlwZSgpOwotICAgICAgICAgICAgaWYgKHBUeXBlPT1QQVNUT01QUHJhZ21hLk9tcENyaXRpY2FsKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUHJvYmxlbShwbm9kZS5nZXRQcmFnbWEoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAiT3JkZXJlZCBkaXJlY3RpdmUgbm90IHBlcm1pdHRlZCBpbiBkeW5hbWljIGV4dGVudCBvZiBjcml0aWNhbCByZWdpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QRXJyb3IuRVJST1IpOwotICAgICAgICAgICAgICAgIG51bUVycm9yc18rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250ZXh0UHJlZGVjZXNzb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIGhhbmRsZVByb2JsZW0KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBTdHJpbmcKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgICAgLSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUHJvYmxlbShQQVNUT01QUHJhZ21hIHByYWdtYSwgU3RyaW5nICBkZXNjcmlwdGlvbiwgaW50IHNldmVyaXR5KQotICAgIHsKLSAgICAgICAgT3Blbk1QRXJyb3IgZXJyb3IgPSBuZXcgT3Blbk1QRXJyb3IoZGVzY3JpcHRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmFnbWEuZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByYWdtYS5nZXRTdGFydGluZ0xpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHkpOwotICAgICAgICBPcGVuTVBFcnJvck1hbmFnZXIuZ2V0Q3VycmVudEVycm9yTWFuYWdlcigpLmFkZEVycm9yKGVycm9yKTsKLSAgICAgICAgcHJhZ21hLmFkZFByb2JsZW0oZXJyb3IpOyAgLy8gd2UgcmVhbGx5IGRvbid0IG5lZWQgdGhpcywgYnV0IG1heSBiZSB1c2VmdWwgbGF0ZXIKLSAgICB9Ci0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIFNlbWFudGljREZTIGV4dGVuZHMgT01QREZTCi0gICAgewotICAgICAgICAKLSAgICAgICAgcHVibGljIFNlbWFudGljREZTKE9NUENGR05vZGUgc3RhcnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihzdGFydE5vZGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgaW50IHZpc2l0KE9NUENGR05vZGUgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPTVBQcmFnbWFOb2RlKSAKLSAgICAgICAgICAgICAgICBjaGVja1ByYWdtYVNlbWFudGljcygoT01QUHJhZ21hTm9kZSlub2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9QaGFzZUFuYWx5c2lzRmFjdG9yeS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9QaGFzZUFuYWx5c2lzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQxMTRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvUGhhc2VBbmFseXNpc0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5mYWN0b3J5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUT01QUHJhZ21hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QQ0ZHOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QQ0ZHTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUERGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUFByYWdtYU5vZGU7Ci0KLS8qKgotICogTWFpbiBBbGdvcml0aG0gLSAKLSAqIAotICogR2l2ZW46IHRoZSBzdGFydCBub2RlIG9mIGEgY29udHJvbCBmbG93IGdyYXBoIChPTVBDRkcpCi0gKiBPdXRwdXQ6IGEgc2V0IG9mIGJhcnJpZXIgcGhhc2VzCi0gKiAKLSAqIDEpIFN0YXJ0IHRoZSBhbGdvcml0aG0gdXNpbmcgdGhlIHN0YXJ0IG5vZGUgb2YgdGhlIGNmZwotICogMikgRm9yIGVhY2ggYmFycmllciByZWFjaGVkIGJ5IGEgREZTLCBzYWlkIGJhcnJpZXIgbmVpdGhlciBwcmlvciBwcm9jZXNzZWQgCi0gKiAgICBub3Igb24gdGhlIHN0YWNrLCBwdXNoIG9udG8gc3RhY2ssIGFuZCBzdGFydCBmcmVzaCBERlMgb24gbmV3IGJhcnJpZXIKLSAqIDMpIEZvciBlYWNoIG5vZGUgZW5jb3VudGVyZWQKLSAqICAgIGEpIGlmIG5vZGUgaXMgaW4gYSBwaGFzZSBoYXZpbmcgaXRzIGluaXRpYWwgYmFycmllciBtYXRjaCB3aXRoIHRvcCBiYXJyaWVyCi0gKiAgICAgICBvbiB0aGUgc3RhY2ssIGFkZCBhbGwgbm9kZXMgYWZ0ZXIgdGhhdCB0b3AgYmFycmllciB0byB0aGF0IHBoYXNlLgotICogICAgYikgaWYgbm9kZSBpcyBhIGJhcnJpZXIsIGJ1aWxkIHBoYXNlLCBhZGQgbm9kZXMgb24gc3RhY2sgZnJvbSBwZW51bHRpbWF0ZSAKLSAqICAgICAgIGJhcnJpZXIKLSAqIDQpIFdoZW4gYSBERlMgY29tcGxldGVzLCBwb3AgdGhlIHN0YWNrCi0gKiA1KSBUZXJtaW5hdGUgd2hlbiB0aGUgc3RhY2sgaXMgZW1wdHkgICAgICAgICAgICAKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBQaGFzZUFuYWx5c2lzRmFjdG9yeQotewotICAgIHByb3RlY3RlZCBPTVBDRkcgICAgIGNmZ18gICAgICAgICAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgT01QQ0ZHTm9kZSB0ZXJtTm9kZV8gICAgICAgICA9IG51bGw7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0YWNrICAgICAgYmFycmllclN0YWNrXyAgICAgPSBuZXcgU3RhY2soKTsgICAgICAgLy8gb2YgREZTV2FsaydzCi0gICAgcHJvdGVjdGVkIEhhc2hTZXQgICAgZmluaXNoZWRCYXJyaWVyc18gPSBuZXcgSGFzaFNldCgpOyAgICAgLy8gb2YgYmFycmllcnMgdGhhdCBhcmUgZmluaXNoZWQgYmVpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0cmF2ZXJzZWQgZnJvbQotICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0IHBoYXNlc18gICAgICAgICAgID0gbmV3IExpbmtlZExpc3QoKTsgIC8vIG9mIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcydzCi0gICAgCi0gICAgLy8gQSBjb21tb24gc2VhcmNoIHdlIGRvIGlzLCBmb3IgYSBnaXZlbiBub2RlLCBhbmQgYSBnaXZlbiBiYXJyaWVyLCBmaW5kIGFsbCAKLSAgICAvLyBwaGFzZXMgdGhhdCAKLSAgICAvLyAgIGEpIGNvbnRhaW4gdGhhdCBub2RlCi0gICAgLy8gICBiKSBoYXZlIHRoYXQgYmFycmllciBhcyB0aGUgc3RhcnRpbmcgYmFycmllciBvZiB0aGUgcGhhc2UKLSAgICAvLyBTb2x1dGlvbjogbWFwIGVhY2ggbm9kZSB0byBhIGxpc3Qgb2YgcGhhc2VzIHRvIHdoaWNoIGl0IGJlbG9uZ3MuCi0gICAgLy8gICAgICAgICAgIFRoZSBsaXN0IHNob3VsZCBiZSBzcGFyc2UsIGZvciBmaWx0ZXJpbmcgb3V0IHRoZSBwaGFzZXMgdGhhdCAKLSAgICAvLyAgICAgICAgICAgYmVnaW4gd2l0aCBhIHBhcnRpY3VsYXIgYmFycmllciBzaG91bGQgYmUgaW5leHBlbnNpdmUuCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSAgbm9kZVRvUGhhc2VzXyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIFBoYXNlQW5hbHlzaXNGYWN0b3J5IC0gQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gY2ZnIC0gT01QQ0ZHCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlQW5hbHlzaXNGYWN0b3J5KE9NUENGRyBjZmcpCi0gICAgewotICAgICAgICBjZmdfICAgICAgPSBjZmc7Ci0gICAgICAgIHRlcm1Ob2RlXyA9IGNmZ18uZ2V0VGVybU5vZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYnVpbGRQaGFzZXMoKQotICAgIHsKLSAgICAgICAgLy8gU2V0IHVwIHRoZSBmaXJzdCBzdGF0ZW1lbnQKLSAgICAgICAgT01QQ0ZHTm9kZSBub2RlID0gY2ZnXy5nZXRSb290KCk7Ci0gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBPTVBQcmFnbWFOb2RlKSkgIHJldHVybjsgICAvLyByZXF1aXJlZAotICAgICAgICBERlNXYWxrIHBjID0gbmV3IERGU1dhbGsoKE9NUFByYWdtYU5vZGUpbm9kZSk7Ci0gICAgICAgIGJhcnJpZXJTdGFja18ucHVzaChwYyk7Ci0gICAgICAgIHBjLnRyaWdnZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZmluZFBoYXNlIC0gZmluZCBhIHNwZWNpZmllZCBwaGFzZSBhbmQgYWRkIGl0Ci0gICAgICogQHBhcmFtIGJOb2RlIC0gT01QUHJhZ21hTm9kZQotICAgICAqIEBwYXJhbSBlTm9kZSAtIE9NUFByYWdtYU5vZGUKLSAgICAgKiBAcGFyYW0gYWRkTmV3IC0gYm9vbGVhbgotICAgICAqIEByZXR1cm4gUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcyBmaW5kUGhhc2UoT01QUHJhZ21hTm9kZSBiTm9kZSwgT01QUHJhZ21hTm9kZSBlTm9kZSwgYm9vbGVhbiBhZGROZXcpCi0gICAgewotICAgICAgICAvLyBGaW5kIHRoZSBwaGFzZSB0aGF0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIHRoZXNlIFRPRE86IG1ha2UgbW9yZSBlZmZpY2llbnQKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9cGhhc2VzXy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcyBwaGFzZSA9IChQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocGhhc2UuZ2V0QmVnaW5Ob2RlKCk9PWJOb2RlICYmIHBoYXNlLmdldEVuZE5vZGUoKT09ZU5vZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBoYXNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYWRkTmV3KSByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcyBwaGFzZSA9IG5ldyBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMoYk5vZGUsIGVOb2RlKTsKLSAgICAgICAgcGhhc2VzXy5hZGQocGhhc2UpOwotICAgICAgICByZXR1cm4gcGhhc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGFkZE5vZGVzVG9QaGFzZSAtIGFkZCBhIGxpc3Qgb2Ygbm9kZXMgdG8gYSBzcGVjaWZpYyBwaGFzZQotICAgICAqIEBwYXJhbSBwaGFzZSAtIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcwotICAgICAqIEBwYXJhbSBub2RlcyAtIE9NUENGR05vZGUgW10KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGROb2Rlc1RvUGhhc2UoUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzIHBoYXNlLCBPTVBDRkdOb2RlIFtdIG5vZGVzKQotICAgIHsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHBoYXNlLmFkZChub2Rlc1tpXSk7Ci0gICAgICAgICAgICBtYXBOb2RlVG9QaGFzZShub2Rlc1tpXSwgcGhhc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoT01QUHJhZ21hTm9kZSBwTm9kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaW5pc2hlZEJhcnJpZXJzXy5jb250YWlucyhwTm9kZSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzT25CYXJyaWVyU3RhY2soT01QUHJhZ21hTm9kZSBwTm9kZSkKLSAgICB7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpPWJhcnJpZXJTdGFja18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBERlNXYWxrIGR3ID0gKERGU1dhbGspaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZHcuZ2V0UHJhZ21hTm9kZSgpPT1wTm9kZSkgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpbmtlZExpc3QgbWVtYmVyUGhhc2VzKE9NUENGR05vZGUgbm9kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTGlua2VkTGlzdClub2RlVG9QaGFzZXNfLmdldChub2RlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogbWFwTm9kZVRvUGhhc2UgLSBtYXAgYSBnaXZlbiBub2RlIHRvIGEgZ2l2ZW4gcGhhc2UgaW4gdGhlIG5vZGUtcGhhc2UgbWFwCi0gICAgICogQHBhcmFtIG5vZGUgICAtIE9NUENGR05vZGUKLSAgICAgKiBAcGFyYW0gcGhhc2UgIC0gUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFwTm9kZVRvUGhhc2UoT01QQ0ZHTm9kZSBub2RlLCBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMgcGhhc2UpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGwgPSAoTGlua2VkTGlzdClub2RlVG9QaGFzZXNfLmdldChub2RlKTsKLSAgICAgICAgaWYgKGw9PW51bGwpIHsKLSAgICAgICAgICAgIGw9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgICAgICBub2RlVG9QaGFzZXNfLnB1dChub2RlLCBsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWwuY29udGFpbnMocGhhc2UpKQotICAgICAgICAgIGwuYWRkKHBoYXNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0UGhhc2VzIC0gcHJvZHVjZSBhIGxpc3Qgb2YgYWxsIHBoYXNlcyBwcm9kdWNlZCBmcm9tIHRoaXMgYW5hbHlzaXMKLSAgICAgKiBAcmV0dXJuIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcyBbXQotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMgW10gZ2V0UGhhc2VzKCkKLSAgICB7Ci0gICAgICAgIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcyBbXSBsID0gbmV3IFBoYXNlQ29uY3VycmVuY3lBbmFseXNpc1twaGFzZXNfLnNpemUoKV07Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpPXBoYXNlc18uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgbFtjb3VudCsrXSA9IChQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMpaS5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBsOwotICAgIH0KLSAgICAKLSAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAvLyBERlNXYWxrCi0gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgcHJvdGVjdGVkIGNsYXNzIERGU1dhbGsgZXh0ZW5kcyBPTVBERlMKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBPTVBQcmFnbWFOb2RlICAgIHBoYXNlQmVnaW5Ob2RlXyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgREZTV2FsayhPTVBQcmFnbWFOb2RlIHBoYXNlQmVnaW5Ob2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihwaGFzZUJlZ2luTm9kZSk7Ci0gICAgICAgICAgICBwaGFzZUJlZ2luTm9kZV8gPSBwaGFzZUJlZ2luTm9kZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9NUFByYWdtYU5vZGUgZ2V0UHJhZ21hTm9kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwaGFzZUJlZ2luTm9kZV87Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiB0cmlnZ2VyIC0gYmVnaW4gdGhlIHByb2Nlc3Mgb2Ygd2Fsa2luZyB0aGUgZ3JhcGgKLSAgICAgICAgICoKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRyaWdnZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnN0YXJ0V2Fsa2luZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogdmlzaXQgLSB2aXNpdCBtZXRob2QgLSB3aGF0IHRoZSB1c2VyIHVzdWFsbHkgb3ZlcnJpZGVzCi0gICAgICAgICAqIEBwYXJhbSBub2RlIC0gT01QQ0ZHTm9kZQotICAgICAgICAgKiBAcmV0dXJuIGludCAgKHNlZSBPTVBERlMgY29kZXMpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IHZpc2l0KE9NUENGR05vZGUgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPTVBQcmFnbWFOb2RlKSB7IAotICAgICAgICAgICAgICAgIE9NUFByYWdtYU5vZGUgcHJhZ21hTm9kZSA9IChPTVBQcmFnbWFOb2RlKW5vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKHByYWdtYU5vZGUuZ2V0UHJhZ21hKCkhPW51bGwgJiYgcHJhZ21hTm9kZS5nZXRQcmFnbWEoKS5nZXRPTVBUeXBlKCkhPVBBU1RPTVBQcmFnbWEuT21wQmFycmllcikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NUERGUy5DT05USU5VRTsKLSAgICAgICAgICAgICAgICAvLyBJZiBhdCBiZWdpbm5pbmcgb2Ygc3RhY2sgYWdhaW4sIGtlZXAgbW92aW5nIG9uCi0gICAgICAgICAgICAgICAgaWYgKGdldE5vZGVTdGFja1NpemUoKT09MSkgIHJldHVybiBPTVBERlMuQ09OVElOVUU7Ci0gICAgICAgICAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCBjcmVhdGUgYSBuZXcgcGhhc2UgYW5kIGFkZCB0byBsaXN0IG9mIHBoYXNlcwotICAgICAgICAgICAgICAgIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpcyBwaGFzZSA9IGZpbmRQaGFzZShwaGFzZUJlZ2luTm9kZV8sIHByYWdtYU5vZGUsIHRydWUpOwotICAgICAgICAgICAgICAgIGFkZE5vZGVzVG9QaGFzZShwaGFzZSwgZ2V0Tm9kZVN0YWNrKCkpOwotICAgICAgICAgICAgICAgIC8vIElmIGJhcnJpZXIgaXMgY29tcGxldGVkIG9yIGlzIG9uIHN0YWNrLCB3ZSBza2lwIHNlYXJjaGluZyBmb3J3YXJkCi0gICAgICAgICAgICAgICAgaWYgKGlzRmluaXNoZWQocHJhZ21hTm9kZSkgfHwgaXNPbkJhcnJpZXJTdGFjayhwcmFnbWFOb2RlKSkgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVBERlMuU0tJUDsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2FsayB0byB0aGUgbmV4dCBzZWdtZW50cyAtIGluY3JlYXNlIHRoZSBzdGFjawotICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIG1heSBoYXZlIHRvIHNraXAgdGhlIGZvbGxvd2luIGZvciBpbXBsaWN0IGJhcnJpZXIKLSAgICAgICAgICAgICAgICBERlNXYWxrIHBjID0gbmV3IERGU1dhbGsocHJhZ21hTm9kZSk7Ci0gICAgICAgICAgICAgICAgYmFycmllclN0YWNrXy5wdXNoKHBjKTsKLSAgICAgICAgICAgICAgICBwYy50cmlnZ2VyKCk7Ci0gICAgICAgICAgICAgICAgLy8gYWJvdmUgZmluaXNoZWQgd2Fsa2luZywgcG9wIHRoZSBzdGFjaywgYW5kIHNraXAgb24gdGhpcyBsZXZlbAotICAgICAgICAgICAgICAgIGJhcnJpZXJTdGFja18ucG9wKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NUERGUy5TS0lQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobm9kZT09dGVybU5vZGVfKSB7ICAvLyB0aGlzIGlzIGFuIGltcGxpY2l0IGJhcnJpZXIsIGJ1dCBub3QgZnVydGhlciBkZnMKLSAgICAgICAgICAgICAgICBpZiAoZ2V0Tm9kZVN0YWNrU2l6ZSgpPT0xKSAgcmV0dXJuIE9NUERGUy5DT05USU5VRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01QREZTLkNPTlRJTlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBGb3IgZWFjaCB2aXNpdGVkIHN1Y2Nlc3NvciBub2RlLCBhZGQgbm9kZSBzdGFjayB0byBhbGwgcGhhc2VzIHRoZSBzdWNjZXNzb3IKLSAgICAgICAgICAgIC8vICAgIGJlbG9uZ3MgdG8sIHNhaWQgc3VjY2Vzc29yIHBoYXNlIGJlZ2lubmluZyB3aXRoIHBoYXNlQmVnaW5Ob2RlXwotICAgICAgICAgICAgLy8gTm90ZTogd2Ugc2hvdWxkIG5vdCBib3RoZXIgd2l0aCBwaGFzZXMgdGhhdCBiZWdpbiB3aXRoIG90aGVyIHRoYW4gcGhhc2VCZWdpbk5vZGVfIC0gCi0gICAgICAgICAgICAvLyAgICAgICBhcyB0aGVuIHdlIHdvdWxkIGhhdmUgdG8gYWNjb3VudCBmb3IgcGFydGlhbCBwYXRocyBmcm9tIG90aGVyIHN1Y2ggcGhhc2VzLAotICAgICAgICAgICAgLy8gICAgICAgd2hpY2ggd2UgZG8gbm90IGhhdmUgKHdlIGdsb20gYWxsIG5vZGVzIHRvZ2V0aGVyLCBubyBwYXRocykuICBUaGF0IHdhcyB3aHkKLSAgICAgICAgICAgIC8vICAgICAgIHdlIGRvIGZyZXNoIHNlYXJjaGVzIHN0YXJ0aW5nIGF0IG5ldyBiYXJyaWVycy4KLSAgICAgICAgICAgIE9NUENGR05vZGUgW10gbm9kZXMgPSBub2RlLmdldE91dE5vZGVzKCk7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpc1Zpc2l0ZWQobm9kZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpbmtlZExpc3QgbCA9IG1lbWJlclBoYXNlcyhub2Rlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIE9NUENGR05vZGUgW10gbm9kZVN0YWNrID0gZ2V0Tm9kZVN0YWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBbXSBsaXN0QXJyYXkgPSBsLnRvQXJyYXkoKTsgIC8vIHNhZmVyIHRvIHVzZSB0aGlzLCBsIG1heSBnZXQgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgZm9yKGludCBqPTA7IGo8bGlzdEFycmF5Lmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMgcGhhc2UgPSAoUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzKWxpc3RBcnJheVtqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaGFzZS5nZXRCZWdpbk5vZGUoKT09cGhhc2VCZWdpbk5vZGVfKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGROb2Rlc1RvUGhhc2UocGhhc2UsIG5vZGVTdGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBPTVBERlMuQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBhdFN0YXJ0Tm9kZSAtIGNoZWNrIGlmIHdlIGFyZSBhdCB0aGUgMXN0IG5vZGUgb2YgdGhlIHNlYXJjaAotICAgICAgICAgKiBAcGFyYW0gbm9kZQotICAgICAgICAgKiBAcmV0dXJuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdFN0YXJ0Tm9kZShPTVBDRkdOb2RlIG5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAobm9kZT09cGhhc2VCZWdpbk5vZGVfICYmIGdldE5vZGVTdGFja1NpemUoKT09MSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1BoYXNlQ29uY3VycmVuY3lBbmFseXNpcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE2NjhhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuZmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBDRkdOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QUHJhZ21hTm9kZTsKLQotLyoqCi0gKiBJZGVudGlmaWVzIGEgcGFpciBvZiBiYXJyaWVycywgYW5kIGEgc2V0IG9mIGFsbCBub2RlcyBpbi1iZXR3ZWVuCi0KLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMKLXsKLSAgICAvLyBUaGUgYm91bmRzIG9mIHRoaXMgcGhhc2UKLSAgICBwcm90ZWN0ZWQgT01QUHJhZ21hTm9kZSAgICBiZWdpbk5vZGVfID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgT01QUHJhZ21hTm9kZSAgICBlbmROb2RlXyAgID0gbnVsbDsKLSAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSB0aGUgY29uY3VycmVudCBPTVBDRkdub2RlJ3MgdG8gdGhpcyBwaGFzZQotICAgIHByb3RlY3RlZCBMaW5rZWRIYXNoU2V0ICAgIG5vZGVzXyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAKLSAgICAvKioKLSAgICAgKiBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMgLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBiZWdpbk5vZGUgLSBPTVBQcmFnbWFOb2RlCi0gICAgICogQHBhcmFtIGVuZE5vZGUgICAtIE9NUFByYWdtYU5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzKE9NUFByYWdtYU5vZGUgYmVnaW5Ob2RlLCBPTVBQcmFnbWFOb2RlIGVuZE5vZGUpCi0gICAgewotICAgICAgICBiZWdpbk5vZGVfID0gYmVnaW5Ob2RlOwotICAgICAgICBlbmROb2RlXyAgID0gZW5kTm9kZTsKLSAgICB9Ci0gICAgIAotICAgIC8qKgotICAgICAqIGdldEJlZ2luTm9kZSAtIGdldCB0aGUgZmlyc3QgZGVsaW1pdGluZyBiYXJyaWVyIG5vZGUKLSAgICAgKiBAcmV0dXJuIE9NUFByYWdtYU5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT01QUHJhZ21hTm9kZSBnZXRCZWdpbk5vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlZ2luTm9kZV87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldEVuZE5vZGUgLSBnZXQgdGhlIGVuZCBkZWxpbWl0aW5nIGJhcnJpZXIgbm9kZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgT01QUHJhZ21hTm9kZSBnZXRFbmROb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmROb2RlXzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYWRkIC0gYWRkIGEgbm9kZSB0byB0aGUgcGhhc2UKLSAgICAgKiBAcGFyYW0gbm9kZSAtIE9NUENGR05vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT01QQ0ZHTm9kZSBub2RlKQotICAgIHsKLSAgICAgICAgaWYgKCFub2Rlc18uY29udGFpbnMobm9kZSkpCi0gICAgICAgICAgICBub2Rlc18uYWRkKG5vZGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXROb2RlcyAtIGdldCB0aGUgc2V0IG9mIG5vZGVzCi0gICAgICogQHJldHVybiBTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGdldE5vZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBub2Rlc187Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByaW50UGhhc2UoUHJpbnRTdHJlYW0gcHMpCi0gICAgewotICAgICAgICBwcy5wcmludGxuKCJCZWdpbiBwcmFnbWEgKCIrYmVnaW5Ob2RlXy5nZXRJZCgpKyIpPSIrYmVnaW5Ob2RlXy5nZXRUeXBlKCkpOwotICAgICAgICBwcy5wcmludGxuKCJFbmQgICBwcmFnbWEgKCIrZW5kTm9kZV8uZ2V0SWQoKSsiKT0iK2VuZE5vZGVfLmdldFR5cGUoKSk7Ci0gICAgICAgIHBzLnByaW50KCIgICBub2Rlcz0iKTsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGk9bm9kZXNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgT01QQ0ZHTm9kZSBuID0gKE9NUENGR05vZGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBwcy5wcmludChuLmdldElkKCkrIiAiKTsKLSAgICAgICAgfQotICAgICAgICBwcy5wcmludGxuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9SZWdpb25Db25jdXJyZW5jeUFuYWx5c2lzLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1JlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzOWY2Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1JlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuZmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QQ0ZHOwotCi0vKioKLSAqIEhvbGRzIHRoZSBhbmFseXNpcyBmb3IgYSBwb3J0aW9uIG9mIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhbiBvbXAgcHJhZ21hCi0gKiAKLSAqIEBhdXRob3IgcGF6ZWwKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyB7Ci0JcHJvdGVjdGVkIEZ1bmN0aW9uQ29uY3VycmVuY3lBbmFseXNpcyBhbmFseXNpc18gPSBudWxsOyAvLyBvd25pbmcgYW5hbHlzaXMKLQotCXByb3RlY3RlZCBPTVBDRkcgY2ZnXyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzW10gcGhhc2VzXyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uQ29uY3VycmVuY3lNYXAgY01hcF8gPSBudWxsOwotCi0JLyoqCi0JICogUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyAtIENvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGNmZyAtCi0JICogICAgICAgICAgICBPTVBDRkcKLQkgKi8KLQlwdWJsaWMgUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyhPTVBDRkcgY2ZnKSB7Ci0JCWNmZ18gPSBjZmc7Ci0KLQkJc2VtYW50aWNDaGVjaygpOwotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudCAtIHNldCB0aGUgRnVuY3Rpb25Db25jdXJyZW5jeUFuYWx5c2lzIGZvciB0aGlzIGNmZwotCSAqIAotCSAqIEBwYXJhbSBhbmFseXNpcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChGdW5jdGlvbkNvbmN1cnJlbmN5QW5hbHlzaXMgYW5hbHlzaXMpIHsKLQkJYW5hbHlzaXNfID0gYW5hbHlzaXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q0ZHIC0gYWNjZXNzb3IgdGhlIE9NUENGRwotCSAqIAotCSAqIEByZXR1cm4gT01QQ0ZHCi0JICovCi0JcHVibGljIE9NUENGRyBnZXRDRkcoKSB7Ci0JCXJldHVybiBjZmdfOwotCX0KLQotCS8qKgotCSAqIGdldFBoYXNlcyAtIGdldCBhbGwgdGhlIHBoYXNlcyBvZiB0aGlzIGNvbXBvbmVudAotCSAqIAotCSAqIEByZXR1cm4gUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzIFtdCi0JICovCi0JcHVibGljIFBoYXNlQ29uY3VycmVuY3lBbmFseXNpc1tdIGdldFBoYXNlcygpIHsKLQkJcmV0dXJuIHBoYXNlc187Ci0JfQotCi0JLyoqCi0JICogZG9QaGFzZUFuYWx5c2lzIC0gYW5hbHlzZSBmb3IgcGhhc2VzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZG9QaGFzZUFuYWx5c2lzKCkgewotCQlQaGFzZUFuYWx5c2lzRmFjdG9yeSBwYWYgPSBuZXcgUGhhc2VBbmFseXNpc0ZhY3RvcnkoY2ZnXyk7Ci0JCXBhZi5idWlsZFBoYXNlcygpOwotCQlwaGFzZXNfID0gcGFmLmdldFBoYXNlcygpOwotCi0JCWNNYXBfID0gbmV3IFJlZ2lvbkNvbmN1cnJlbmN5TWFwKHRoaXMpOwotCQljTWFwXy5idWlsZE1hcCgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVzQ29uY3VycmVudFRvIC0gZ2V0IGFsbCBub2RlcyBjb25jdXJyZW50IHRvIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICBJQVNUTm9kZQotCSAqIEByZXR1cm4gU2V0Ci0JICovCi0JcHVibGljIFNldCBnZXROb2Rlc0NvbmN1cnJlbnRUbyhJQVNUTm9kZSBub2RlKSB7Ci0JCXJldHVybiBjTWFwXy5nZXROb2Rlc0NvbmN1cnJlbnRUbyhub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmludFBoYXNlcyAtIHByaW50IG91dCBhbGwgdGhlIHBoYXNlcwotCSAqIAotCSAqIEBwYXJhbSBwcwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50Q29tcG9uZW50KFByaW50U3RyZWFtIHBzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzXy5sZW5ndGg7IGkrKykgewotCQkJcHMucHJpbnRsbigiQ29tcG9uZW50IFBoYXNlICIgKyBpCi0JCQkJCSsgIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0JCQlwaGFzZXNfW2ldLnByaW50UGhhc2UocHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2VtYW50aWNDaGVjayAtIGNoZWNrIGZvciBzZW1hbnRpYyBtaXN0YWtlcyB1c2luZyBwcmFnbWFzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbWFudGljQ2hlY2soKSB7Ci0JCVBBU1RTZW1hbnRpY0NoZWNrLmNoZWNrU2VtYW50aWNzKGNmZ18pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvUmVnaW9uQ29uY3VycmVuY3lNYXAuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvb21wY2ZnL2ZhY3RvcnkvUmVnaW9uQ29uY3VycmVuY3lNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlZjBhMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1JlZ2lvbkNvbmN1cnJlbmN5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLmZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVE9NUFByYWdtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLk9NUEJhc2ljQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBDRkc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLm9tcGNmZy5PTVBDRkdOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QREZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QRXhwcmVzc2lvbkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy5vbXBjZmcuT01QUHJhZ21hTm9kZTsKLQotLyoqCi0gKiBCdWlsZHMgdGhlIGNvbmN1cnJlbmN5IG1hcCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGl0IAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbkNvbmN1cnJlbmN5TWFwCi17Ci0KLSAgICBwcm90ZWN0ZWQgUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyByZWdpb25fID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgT01QQ0ZHICAgICAgICAgICAgICAgICAgICBjZmdfICAgICAgID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzIFtdICBwaGFzZXNfICAgID0gbnVsbDsKLSAgICAKLSAgICAvLyBUaGUgYWN0dWFsIG1hcAotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgICAgICAgICAgICAgICBpbmRleE1hcF8gPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGluZGV4LT5zdG10Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSAgICAgICAgICAgICAgIHN0bXRNYXBfICA9IG5ldyBIYXNodGFibGUoKTsgLy8gc3RtdC0+aW5kZXgKLSAgICAvLyBzdG10IHRvIEJpdFNldCwgcmVwcmVzZW50aW5nIGFsbCBzdGF0bWVudHMgY29uY3VycmVudCB0byBzdG10Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5TWFwXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICAvLyBVc2VkIGluIGVhY2ggcGhhc2UgcHJvY2VzcyB0byBsaXN0IGFsbCBub2RlcyBmb3VuZAotICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0ICAgICAgICAgICAgICBwaGFzZVN0bXRzXyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgCi0gICAgCi0gICAgLy8gU29tZSBzdWItcmVnaW9ucyBuZWVkIHRvIGV4Y2x1ZGUgd2l0aGluIHRoZW1zZWx2ZXMuICBUbyBoZWxwIHdpdGggdGhpcywKLSAgICAvLyB3ZSBidWlsZCBhIGlhc3Rub2RlLS0+T01QUHJhZ21hTm9kZSBoYXNobWFwLCB1c2VkIGJ5IHRoZSBzZWNvbmQgcGFydCBvZiBwcm9jZXNzQ29uY3VycmVuY3kKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlICAgICAgICAgICAgICAgZXhjbHVzaW9uTWFwXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdpb25Db25jdXJyZW5jeU1hcCAtIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCAtIFJlZ2lvbkNvbmN1cnJlbmN5QW5hbHlzaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVnaW9uQ29uY3VycmVuY3lNYXAoUmVnaW9uQ29uY3VycmVuY3lBbmFseXNpcyByZWdpb24pCi0gICAgewotICAgICAgICByZWdpb25fICAgID0gcmVnaW9uOwotICAgICAgICBjZmdfICAgICAgID0gcmVnaW9uXy5nZXRDRkcoKTsKLSAgICAgICAgcGhhc2VzXyAgICA9IHJlZ2lvbl8uZ2V0UGhhc2VzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGJ1aWxkTWFwIC0gYnVpbGQgdGhlIGNvbmN1cnJlbmN5TWFwXyBhbmQgb3RoZXIgYXJ0aWZhY3RzIGZvciB0aGUgbWFwCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZE1hcCgpCi0gICAgewotICAgICAgICBmb3IoaW50IGk9MDsgaTxwaGFzZXNfLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgICAgIHByb2Nlc3NQaGFzZShwaGFzZXNfW2ldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcHJvY2Vzc1BoYXNlIC0gcHJvY2VzcyBnaXZlbiBwaGFzZSBpbnRvIHRoZSBjb25jdXJyZW5jeSBtYXAKLSAgICAgKiBAcGFyYW0gcGhhc2UgLSBQaGFzZUNvbmN1cnJlbmN5QW5hbHlzaXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGhhc2UoUGhhc2VDb25jdXJyZW5jeUFuYWx5c2lzIHBoYXNlKQotICAgIHsKLSAgICAgICAgU2V0IG5vZGVzID0gcGhhc2UuZ2V0Tm9kZXMoKTsgIC8vIG9mIE9NUENGR05vZGUncwotICAgICAgICBwaGFzZVN0bXRzXy5jbGVhcigpOwotICAgICAgICBleGNsdXNpb25NYXBfLmNsZWFyKCk7Ci0gICAgICAgIAotICAgICAgICBPTVBQcmFnbWFOb2RlIGVQcmFnbWEgPSBudWxsOyAgICAvLyBleGNsdXNpb24gcHJhZ21hCi0gICAgICAgIAotICAgICAgICBmb3IoSXRlcmF0b3IgaT1ub2Rlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9NUENGR05vZGUgbm9kZSA9IChPTVBDRkdOb2RlKWkubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFc3RhYmxpc2ggdGhlIGV4Y2x1c2lvbiBjb250ZXh0IGlmIGFueQotICAgICAgICAgICAgZVByYWdtYSA9IG5vZGUuZ2V0UHJhZ21hQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKGVQcmFnbWEhPW51bGwgJiYgZVByYWdtYS5nZXRQcmFnbWEoKSE9bnVsbCkgewotICAgICAgICAgICAgICAgIGludCBwVHlwZSA9IGVQcmFnbWEuZ2V0UHJhZ21hKCkuZ2V0T01QVHlwZSgpOwotICAgICAgICAgICAgICAgIC8vIGlmIG5vbmUgb2YgdGhlc2Ugc2l0dWF0aW9ucywgYWxsIHRoZSBzdG10cyBpbiB0aGUgbm9kZSBjYW4gZXhlY3V0ZSBjb25jdXJyZW50bHkgdG8gZWFjaCBvdGhlcgotICAgICAgICAgICAgICAgIC8vIChub3RlOiBpZiBzaW5nbGUgYW5kIGhhcyBiYXJyaWVyIGZyZWUgcGF0aCB0byBzZWxmLCBzdG10cyBjYW4gZXhlY3V0ZSBjb25jdXJyZW50bHkgdG8gZWFjaCBvdGhlcgotICAgICAgICAgICAgICAgIGlmICghKChwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBTaW5nbGUgJiYgIWhhc0JhcnJpZXJGcmVlUGF0aFRvU2VsZigoT01QQmFzaWNCbG9jaylub2RlKSkgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgcFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wTWFzdGVyIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgcFR5cGU9PVBBU1RPTVBQcmFnbWEuT21wT3JkZXJlZCB8fCAKLSAgICAgICAgICAgICAgICAgICAgICBwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBDcml0aWNhbCB8fCAKLSAgICAgICAgICAgICAgICAgICAgICBwVHlwZT09UEFTVE9NUFByYWdtYS5PbXBTZWN0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgZVByYWdtYT1udWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBlUHJhZ21hPW51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgT01QQmFzaWNCbG9jaykgewotICAgICAgICAgICAgICAgIExpbmtlZExpc3Qgc3RtdHMgPSAoKE9NUEJhc2ljQmxvY2spbm9kZSkuZ2V0RnVuZGFtZW50YWxzKCk7Ci0gICAgICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGo9c3RtdHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIElBU1ROb2RlIG4gPSAoSUFTVE5vZGUpai5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4Tm9kZShuLCBlUHJhZ21hKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXhOb2RlKCgoT01QQmFzaWNCbG9jaylub2RlKS5nZXRCcmFuY2hpbmdFeHByZXNzaW9uKCksIGVQcmFnbWEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE9NUEV4cHJlc3Npb25CbG9jaykgewotICAgICAgICAgICAgICAgIElBU1RFeHByZXNzaW9uIFtdIGVMaXN0ID0gKChPTVBFeHByZXNzaW9uQmxvY2spbm9kZSkuZ2V0RXhwcmVzc2lvbnMoKTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGo9MDsgajxlTGlzdC5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgaW5kZXhOb2RlKGVMaXN0W2pdLCBlUHJhZ21hKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gR28gdGhvdWdoIHRoZSBsaXN0IG9mIHBoYXNlIG5vZGVzLCBhbmQgCi0gICAgICAgIC8vICAgIEFTU1VNSU5HIFRIRVkgQVJFIEFMTCBDT05DVVJSRU5UIFdJVEggRUFDSCBPVEhFUiAod2lsbCBjaGFuZ2UgbGF0ZXIpCi0gICAgICAgIC8vIG1ha2UgdGhlbSBhbGwgY29uY3VycmVudCB0byBlYWNoIG90aGVyCi0gICAgICAgIGZvcihJdGVyYXRvciBpPXBoYXNlU3RtdHNfLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSUFTVE5vZGUgIG4gPSAoSUFTVE5vZGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBPTVBQcmFnbWFOb2RlIGVQcmFnbWFTID0gKE9NUFByYWdtYU5vZGUpZXhjbHVzaW9uTWFwXy5nZXQobik7Ci0gICAgICAgICAgICBpbnQgICAgICAgbkluZGV4ID0gKChJbnRlZ2VyKShzdG10TWFwXy5nZXQobikpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGo9cGhhc2VTdG10c18uaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSUFTVE5vZGUgbSA9IChJQVNUTm9kZSlqLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTVBQcmFnbWFOb2RlIGVQcmFnbWFUID0gKE9NUFByYWdtYU5vZGUpZXhjbHVzaW9uTWFwXy5nZXQobSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc3RtdHMgaW4gdGhlIHNhbWUgZXhjbHVzaW9uIGNhbm5vdCBiZSBjb25jdXJyZW50Ci0gICAgICAgICAgICAgICAgaWYgKCEoZVByYWdtYVQ9PWVQcmFnbWFTICYmIGVQcmFnbWFUIT1udWxsKSkgewotICAgICAgICAgICAgICAgICAgQml0U2V0ICAgYiA9IChCaXRTZXQpKGNvbmN1cnJlbmN5TWFwXy5nZXQobSkpOwotICAgICAgICAgICAgICAgICAgYi5zZXQobkluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaW5kZXhOb2RlIC0gaW5kZXggYSBub2RlIGlmIG5vZGUgbm90IHNlZW4gdG8gdGhpcyBwcm9jZXNzCi0gICAgICogQHBhcmFtIG4gLSBJQVNUTm9kZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluZGV4Tm9kZShJQVNUTm9kZSBuLCBPTVBQcmFnbWFOb2RlIGVQcmFnbWEpCi0gICAgewotICAgICAgICBpZiAobj09bnVsbCkgIHJldHVybjsKLSAgICAgICAgaWYgKCFzdG10TWFwXy5jb250YWluc0tleShuKSkgewotICAgICAgICAgICAgaW5kZXhNYXBfLmFkZChuKTsKLSAgICAgICAgICAgIHN0bXRNYXBfLnB1dChuLCBuZXcgSW50ZWdlcihpbmRleE1hcF8uaW5kZXhPZihuKSkpOwotICAgICAgICAgICAgY29uY3VycmVuY3lNYXBfLnB1dChuLCBuZXcgQml0U2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcGhhc2VTdG10c18uY29udGFpbnMobikpCi0gICAgICAgICAgICBwaGFzZVN0bXRzXy5hZGQobik7Ci0gICAgICAgIC8vIFNldCB1cCB0aGUgZXhjbHVzaW9uIG1hcAotICAgICAgICBpZiAoZVByYWdtYSE9bnVsbCAmJiAhZXhjbHVzaW9uTWFwXy5jb250YWlucyhuKSkKLSAgICAgICAgICAgIGV4Y2x1c2lvbk1hcF8ucHV0KG4sIGVQcmFnbWEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXROb2Rlc0NvbmN1cnJlbnRUbyAtIGdldCBhbGwgbm9kZXMgY29uY3VycmVudCB0byBnaXZlbiBub2RlCi0gICAgICogQHBhcmFtIG5vZGUgLSBJQVNUTm9kZQotICAgICAqIEByZXR1cm4gU2V0Ci0gICAgICovCi0gICAgcHVibGljIFNldCBnZXROb2Rlc0NvbmN1cnJlbnRUbyhJQVNUTm9kZSBub2RlKQotICAgIHsKLSAgICAgICAgQml0U2V0IGIgPSAoQml0U2V0KWNvbmN1cnJlbmN5TWFwXy5nZXQobm9kZSk7Ci0gICAgICAgIGlmIChiPT1udWxsKSAgcmV0dXJuIG51bGw7ICAgIC8vIHN0bXQgbmV2ZXIgcmVnaXN0ZXJlZCAtIGluZC4gY2FsbGVkIGZvciB3cm9uZyBjb21wb25lbnQKLSAgICAgICAgCi0gICAgICAgIEhhc2hTZXQgYW5zID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yKGludCBpPWIubmV4dFNldEJpdCgwKTsgaT49MDsgaT1iLm5leHRTZXRCaXQoaSsxKSkgCi0gICAgICAgICAgIGFucy5hZGQoaW5kZXhNYXBfLmdldChpKSk7Ci0gICAgICAgIHJldHVybiBhbnM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNCYXJyaWVyRnJlZVBhdGhUb1NlbGYoT01QQmFzaWNCbG9jayBzaW5nbGVCbG9jaykKLSAgICB7Ci0gICAgICAgIEJhcnJpZXJQYXRoREZTICBkZnMgPSBuZXcgQmFycmllclBhdGhERlMoc2luZ2xlQmxvY2spOwotICAgICAgICBkZnMuc3RhcnRXYWxraW5nKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGZzLmhhc0JhcnJpZXJGcmVlUGF0aCgpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgQmFycmllclBhdGhERlMgLSBmaW5kIGJhcnJpZXIgZnJlZSBwYXRoIHRvIHByYWdtYQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgY2xhc3MgQmFycmllclBhdGhERlMgZXh0ZW5kcyBPTVBERlMKLSAgICB7Ci0gICAgICAgIC8vIGZpbmQgYSBiYXJyaWVyIGZyZWUgcGF0aCB0byB0aGlzIG5vZGUKLSAgICAgICAgcHJvdGVjdGVkIE9NUFByYWdtYU5vZGUgdGFyZ2V0XyAgICAgICAgICAgID0gbnVsbDsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gICAgICAgYmFycmllckZyZWVFeGlzdHNfID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgQmFycmllclBhdGhERlMoT01QQmFzaWNCbG9jayBibG9jaykKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoYmxvY2spOwotICAgICAgICAgICAgdGFyZ2V0XyA9IGJsb2NrLmdldFByYWdtYUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQmFycmllckZyZWVQYXRoKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJhcnJpZXJGcmVlRXhpc3RzXzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHZpc2l0IC0gdmlzaXQgbWV0aG9kIC0gd2hhdCB0aGUgdXNlciB1c3VhbGx5IG92ZXJyaWRlcwotICAgICAgICAgKiBAcGFyYW0gbm9kZSAtIE9NUENGR05vZGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgdmlzaXQoT01QQ0ZHTm9kZSBub2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE9NUFByYWdtYU5vZGUpIHsKLSAgICAgICAgICAgICAgICBPTVBQcmFnbWFOb2RlIHRoaXNOb2RlID0gKE9NUFByYWdtYU5vZGUpbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpc05vZGUuaXNJbXBsaWNpdEJhcnJpZXIoKSB8fCB0aGlzTm9kZS5nZXRQcmFnbWEoKS5nZXRPTVBUeXBlKCk9PVBBU1RPTVBQcmFnbWEuT21wQmFycmllcikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNLSVA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpc05vZGU9PXRhcmdldF8pIHsKLSAgICAgICAgICAgICAgICAgICAgYmFycmllckZyZWVFeGlzdHNfPXRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBQk9SVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1N0YXRlbWVudE1hcC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9vbXBjZmcvZmFjdG9yeS9TdGF0ZW1lbnRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhYWVkMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL29tcGNmZy9mYWN0b3J5L1N0YXRlbWVudE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMub21wY2ZnLmZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnV0aWwuVXRpbGl0eTsKLQotLyoqCi0gKiBJbnRlcnZhbCB0cmVlLCBtYXBwaW5nIHN0YXRlbWVudCAocG9zaXRpb24sIGxlbmd0aCktPnN0YXRlbWVudAotICogQGF1dGhvciBwYXplbAotICoKLSAqLwotcHVibGljIGNsYXNzIFN0YXRlbWVudE1hcAotewotICAgIHByb3RlY3RlZCBNZW1iZXIgICAgIHJvb3RfICAgICAgICAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlICBpYXN0bm9kZVRvTWVtYmVyXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICBwdWJsaWMgU3RhdGVtZW50TWFwKCkKLSAgICB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoSUFTVE5vZGUgICBub2RlKQotICAgIHsKLSAgICAgICAgaWYgKG5vZGU9PW51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIE1lbWJlciBtID0gbmV3IE1lbWJlcihub2RlKTsKLSAgICAgICAgUkJJbnNlcnQobSk7Ci0gICAgICAgIAotICAgICAgICBpYXN0bm9kZVRvTWVtYmVyXy5wdXQobm9kZSwgbSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGdldExvY2F0aW9uIC0gZ2V0IG9mZnNldC9sZW5ndGggcmVsYXRpdmUgdG8gY29udGFpbmluZyBmaWxlCi0gICAgICogQHBhcmFtIG5vZGUgLSBJQVNUTm9kZQotICAgICAqIEByZXR1cm4gTG9jYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oSUFTVE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICAgIFV0aWxpdHkuTG9jYXRpb24gIGwgPSBVdGlsaXR5LmdldExvY2F0aW9uKG5vZGUpOyAgLy8gVXNlIGNvbW1vbiBmdW5jdGlvbgotICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKGwubG93XywgbC5oaWdoXyk7Ci0gICAgICAgIC8qQVNUTm9kZSBhc3Rub2RlID0gKG5vZGUgaW5zdGFuY2VvZiBBU1ROb2RlID8gKEFTVE5vZGUpbm9kZSA6IG51bGwpOwotICAgICAgICBpZiAoYXN0bm9kZT09bnVsbCkgIHJldHVybiBudWxsOwotCi0gICAgICAgIElBU1RGaWxlTG9jYXRpb24gaWZsICAgICAgICAgPSBub2RlLmdldEZpbGVMb2NhdGlvbigpOwotICAgICAgICAvLyBvZmZzZXQgY2FsY3VsYXRpb24gaXMgdHJpY2t5IC0gd2UgdXNlZCB0aGUgZm9sbG93aW5nIHNpbmNlIGl0IHNlZW1zIHRvIGNvdmVyIHRoZSBtb3N0IGNhc2VzCi0gICAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKGlmbCE9bnVsbCkgewotICAgICAgICAgICAgb2Zmc2V0ID0gaWZsLmdldE5vZGVPZmZzZXQoKTsgICAKLSAgICAgICAgICAgIGxlbmd0aCA9IGlmbC5nZXROb2RlTGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7ICAvLyB0aGlzIGhhcHBlbnMgaW4gIm9tcCBzZWN0aW9ucyIsIGFwcGFyZW50bHkgZHVlIHRvIHByYWdtYXMgc3BsaXR0aW5nIHRoZSByZWdpb24KLSAgICAgICAgICAgIElBU1ROb2RlTG9jYXRpb24gW10gbG9jcyA9IG5vZGUuZ2V0Tm9kZUxvY2F0aW9ucygpOyAKLSAgICAgICAgICAgIGlmIChsb2NzPT1udWxsIHx8IGxvY3MubGVuZ3RoPT0wKSAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBvZmZzZXQgPSBsb2NzWzBdLmdldE5vZGVPZmZzZXQoKTsKLSAgICAgICAgICAgIGxlbmd0aCA9IGFzdG5vZGUuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhdGlvbihvZmZzZXQsIG9mZnNldCtsZW5ndGgtMSk7ICovCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShJQVNUTm9kZSAgIG5vZGUpCi0gICAgewotICAgICAgICBNZW1iZXIgbSA9IChNZW1iZXIpaWFzdG5vZGVUb01lbWJlcl8uZ2V0KG5vZGUpOwotICAgICAgICBpZiAobT09bnVsbCkgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgUkJEZWxldGUobSk7Ci0gICAgICAgIAotICAgICAgICBpYXN0bm9kZVRvTWVtYmVyXy5yZW1vdmUobm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIElBU1ROb2RlIGZpbmQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaW5kSW50ZXJ2YWwob2Zmc2V0LCBvZmZzZXQrbGVuZ3RoLTEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUFTVE5vZGUgZmluZEludGVydmFsKGludCBvZmZzZXQsIGludCBlbmRzZXQpCi0gICAgewotICAgICAgICBNZW1iZXIgeD1maW5kSW50ZXJ2YWxNZW1iZXIob2Zmc2V0LCBlbmRzZXQpOwotICAgICAgICBpZiAoeCE9bnVsbCkKLSAgICAgICAgICAgIHJldHVybiB4Lm5vZGVfOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE1lbWJlciBmaW5kSW50ZXJ2YWxNZW1iZXIoaW50IG9mZnNldCwgaW50IGVuZHNldCkKLSAgICB7Ci0gICAgICAgIE1lbWJlciB4PXJvb3RfOwotICAgICAgICB3aGlsZSh4IT1udWxsICYmICFvdmVybGFwKHgubG93XywgeC5oaWdoXywgb2Zmc2V0LCBlbmRzZXQpKSB7Ci0gICAgICAgICAgICBpZiAoeC5sZWZ0XyE9bnVsbCAmJiB4LmxlZnRfLm1heF8+PW9mZnNldCkKLSAgICAgICAgICAgICAgICB4PXgubGVmdF87Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeD14LnJpZ2h0XzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geDsgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIG92ZXJsYXAoaW50IG9mZnNldDEsIGludCBlbmRzZXQxLCBpbnQgb2Zmc2V0MiwgaW50IGVuZHNldDIpCi0gICAgewotICAgICAgICBpZiAoZW5kc2V0MTxvZmZzZXQyIHx8IGVuZHNldDI8b2Zmc2V0MSkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gTk9URTogZG8gbm90IHVzZSB1bnRpbCB3ZSB1bmRlcnN0YW5kCi0gICAgLy8gICAxKSBpZiBudWxsIHNob3VsZCBiZSByZXBsYWNlZCBieSBhIE5JTCBvYmplY3QKLSAgICAvLyAgIDIpIHdoZXJlL2hvdyB0byBkbyB0aGUgbWF4IHVwZGF0ZSBjb3JyZWN0aW9ucwotICAgIHByb3RlY3RlZCB2b2lkIFJCRGVsZXRlKE1lbWJlciB6KQotICAgIHsKLSAgICAgICAgTWVtYmVyIHk9bnVsbCwgeD1udWxsOwotICAgICAgICAKLSAgICAgICAgeT0oKHoubGVmdF89PW51bGwgfHwgei5yaWdodF89PW51bGwpID8geiA6IHRyZWVTdWNjZXNzb3IoeikpOwotICAgICAgICB4PSAoeS5sZWZ0XyE9bnVsbCA/IHkubGVmdF8gOiB5LnJpZ2h0Xyk7Ci0gICAgICAgIHgucGFyZW50Xz15LnBhcmVudF87Ci0gICAgICAgIGlmICh5LnBhcmVudF89PW51bGwpCi0gICAgICAgICAgICByb290Xz14OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICh5PT15LnBhcmVudF8ubGVmdF8pCi0gICAgICAgICAgICAgICAgeS5wYXJlbnRfLmxlZnRfPXg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeS5wYXJlbnRfLnJpZ2h0Xz14OwotICAgICAgICB9Ci0gICAgICAgIGlmICh5IT16KQotICAgICAgICAgICAgei5jb3B5RnJvbSh5KTsKLSAgICAgICAgaWYgKHkuY29sb3JfPT1NZW1iZXIuQkxBQ0spCi0gICAgICAgICAgICBSQkRlbGV0ZUZpeHVwKHgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBSQkRlbGV0ZUZpeHVwKE1lbWJlciB4KQotICAgIHsKLSAgICAgICAgTWVtYmVyIHc9bnVsbDsKLSAgICAgICAgd2hpbGUoeCE9cm9vdF8gJiYgeC5jb2xvcl89PU1lbWJlci5CTEFDSykgewotICAgICAgICAgICAgaWYgKHg9PXgucGFyZW50Xy5sZWZ0XykgewotICAgICAgICAgICAgICAgIHc9eC5wYXJlbnRfLnJpZ2h0XzsKLSAgICAgICAgICAgICAgICBpZiAody5jb2xvcl89PU1lbWJlci5SRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgdy5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8uY29sb3JfPU1lbWJlci5SRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5sZWZ0Um90YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHc9eC5wYXJlbnRfLnJpZ2h0XzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHcubGVmdF8uY29sb3JfPT1NZW1iZXIuQkxBQ0sgJiYgdy5yaWdodF8uY29sb3JfPT1NZW1iZXIuQkxBQ0spewotICAgICAgICAgICAgICAgICAgICB3LmNvbG9yXz1NZW1iZXIuUkVEOwotICAgICAgICAgICAgICAgICAgICB4PXgucGFyZW50XzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7IAotICAgICAgICAgICAgICAgICAgICBpZiAody5yaWdodF8uY29sb3JfPT1NZW1iZXIuQkxBQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICB3LmxlZnRfLmNvbG9yXz1NZW1iZXIuQkxBQ0s7Ci0gICAgICAgICAgICAgICAgICAgICAgdy5jb2xvcl89TWVtYmVyLlJFRDsKLSAgICAgICAgICAgICAgICAgICAgICB3LnJpZ2h0Um90YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgdz14LnBhcmVudF8ucmlnaHRfOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHcuY29sb3JfPXgucGFyZW50Xy5jb2xvcl87Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgICAgICAgICAgICAgICAgICB3LnJpZ2h0Xy5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8ubGVmdFJvdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB4PXJvb3RfOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzYW1lIHdpdGggbGVmdC9yaWdodCBleGNoYW5nZWQKLSAgICAgICAgICAgICAgICB3PXgucGFyZW50Xy5sZWZ0XzsKLSAgICAgICAgICAgICAgICBpZiAody5jb2xvcl89PU1lbWJlci5SRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgdy5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8uY29sb3JfPU1lbWJlci5SRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5yaWdodFJvdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB3PXgucGFyZW50Xy5sZWZ0XzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHcucmlnaHRfLmNvbG9yXz09TWVtYmVyLkJMQUNLICYmIHcubGVmdF8uY29sb3JfPT1NZW1iZXIuQkxBQ0spewotICAgICAgICAgICAgICAgICAgICB3LmNvbG9yXz1NZW1iZXIuUkVEOwotICAgICAgICAgICAgICAgICAgICB4PXgucGFyZW50XzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7IAotICAgICAgICAgICAgICAgICAgICBpZiAody5sZWZ0Xy5jb2xvcl89PU1lbWJlci5CTEFDSykgewotICAgICAgICAgICAgICAgICAgICAgIHcucmlnaHRfLmNvbG9yXz1NZW1iZXIuQkxBQ0s7Ci0gICAgICAgICAgICAgICAgICAgICAgdy5jb2xvcl89TWVtYmVyLlJFRDsKLSAgICAgICAgICAgICAgICAgICAgICB3LmxlZnRSb3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICB3PXgucGFyZW50Xy5sZWZ0XzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3LmNvbG9yXz14LnBhcmVudF8uY29sb3JfOwotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8uY29sb3JfPU1lbWJlci5CTEFDSzsKLSAgICAgICAgICAgICAgICAgICAgdy5sZWZ0Xy5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8ucmlnaHRSb3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgeD1yb290XzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgeC5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBSQkluc2VydChNZW1iZXIgeCkKLSAgICB7Ci0gICAgICAgIE1lbWJlciB5PW51bGw7Ci0gICAgICAgIHRyZWVJbnNlcnQoeCk7Ci0gICAgICAgIHgudXBkYXRlTWF4KCk7Ci0gICAgICAgIHguY29sb3JfPU1lbWJlci5SRUQ7Ci0gICAgICAgIHdoaWxlKHghPXJvb3RfICYmIHgucGFyZW50Xy5jb2xvcl89PU1lbWJlci5SRUQpIHsKLSAgICAgICAgICAgIGlmICh4LnBhcmVudF89PXgucGFyZW50Xy5wYXJlbnRfLmxlZnRfKSB7Ci0gICAgICAgICAgICAgICAgeT14LnBhcmVudF8ucGFyZW50Xy5sZWZ0XzsKLSAgICAgICAgICAgICAgICBpZiAoeS5jb2xvcl89PU1lbWJlci5SRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRfLmNvbG9yXz1NZW1iZXIuQkxBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIHkuY29sb3JfPU1lbWJlci5CTEFDSzsKLSAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRfLnBhcmVudF8uY29sb3JfPU1lbWJlci5SRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHg9eC5wYXJlbnRfLnBhcmVudF87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoeD09eC5wYXJlbnRfLnJpZ2h0XykgewotICAgICAgICAgICAgICAgICAgICAgICAgeD14LnBhcmVudF87Ci0gICAgICAgICAgICAgICAgICAgICAgICB4LmxlZnRSb3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8uY29sb3JfPU1lbWJlci5CTEFDSzsKLSAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRfLnBhcmVudF8uY29sb3JfPU1lbWJlci5SRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5wYXJlbnRfLnJpZ2h0Um90YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgeT14LnBhcmVudF8ucGFyZW50Xy5yaWdodF87Ci0gICAgICAgICAgICAgICAgaWYgKHkuY29sb3JfPT1NZW1iZXIuUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5jb2xvcl89TWVtYmVyLkJMQUNLOwotICAgICAgICAgICAgICAgICAgICB5LmNvbG9yXz1NZW1iZXIuQkxBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5wYXJlbnRfLmNvbG9yXz1NZW1iZXIuUkVEOwotICAgICAgICAgICAgICAgICAgICB4PXgucGFyZW50Xy5wYXJlbnRfOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHg9PXgucGFyZW50Xy5sZWZ0XykgewotICAgICAgICAgICAgICAgICAgICAgICAgeD14LnBhcmVudF87Ci0gICAgICAgICAgICAgICAgICAgICAgICB4LnJpZ2h0Um90YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRfLmNvbG9yXz1NZW1iZXIuQkxBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIHgucGFyZW50Xy5wYXJlbnRfLmNvbG9yXz1NZW1iZXIuUkVEOwotICAgICAgICAgICAgICAgICAgICB4LnBhcmVudF8ucGFyZW50Xy5sZWZ0Um90YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgfSAgLy8gZW5kIHdoaWxlCi0gICAgICAgIHJvb3RfLmNvbG9yXz1NZW1iZXIuQkxBQ0s7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHRyZWVJbnNlcnQoTWVtYmVyIHopCi0gICAgewotICAgICAgICBNZW1iZXIgeT1udWxsOwotICAgICAgICBNZW1iZXIgeD1yb290XzsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlKHghPW51bGwpIHsKLSAgICAgICAgICAgIHk9eDsKLSAgICAgICAgICAgIHg9KHoubG93Xzx4Lmxvd18gPyB4LmxlZnRfIDogeC5yaWdodF8pOwotICAgICAgICB9Ci0gICAgICAgIHoucGFyZW50Xz15OwotICAgICAgICBpZiAoeT09bnVsbCkKLSAgICAgICAgICAgIHJvb3RfPXo7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKHoubG93Xzx5Lmxvd18pCi0gICAgICAgICAgICAgICAgeS5sZWZ0Xz16OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHkucmlnaHRfPXo7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE1lbWJlciB0cmVlU3VjY2Vzc29yKE1lbWJlciB4KQotICAgIHsKLSAgICAgICAgaWYgKHgucmlnaHRfIT1udWxsKQotICAgICAgICAgICAgcmV0dXJuIHRyZWVNaW5pbXVtKHgucmlnaHRfKTsKLSAgICAgICAgTWVtYmVyIHk9eC5wYXJlbnRfOwotICAgICAgICB3aGlsZSh5IT1udWxsICYmIHg9PXkucmlnaHRfKSB7Ci0gICAgICAgICAgICB4PXk7Ci0gICAgICAgICAgICB5PXkucGFyZW50XzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE1lbWJlciB0cmVlTWF4aW11bShNZW1iZXIgeCkKLSAgICB7Ci0gICAgICAgIHdoaWxlKHgucmlnaHRfIT1udWxsKQotICAgICAgICAgICAgeD14LnJpZ2h0XzsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBNZW1iZXIgdHJlZU1pbmltdW0oTWVtYmVyIHgpCi0gICAgewotICAgICAgICB3aGlsZSh4LmxlZnRfIT1udWxsKQotICAgICAgICAgICAgeD14LmxlZnRfOwotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0gICAgCi0gICAgLy8gZm9yIHRlc3RpbmcKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IG9mZnNldCwgaW50IGVuZHNldCkKLSAgICB7Ci0gICAgICAgIE1lbWJlciBtID0gbmV3IE1lbWJlcihvZmZzZXQsIGVuZHNldCk7Ci0gICAgICAgIFJCSW5zZXJ0KG0pOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZW1iZXIKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgY2xhc3MgTWVtYmVyCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgaW50ICAgIGxvd18gID0gMDsKLSAgICAgICAgcHJvdGVjdGVkIGludCAgICBoaWdoXyA9IDA7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgICAgbWF4XyAgPSAwOwotICAgICAgICBwcm90ZWN0ZWQgaW50ICAgIGNvbG9yXyA9IDA7Ci0gICAgICAgIHByb3RlY3RlZCBJQVNUTm9kZSBub2RlXyA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBNZW1iZXIgbGVmdF8gICA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBNZW1iZXIgcmlnaHRfICA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBNZW1iZXIgcGFyZW50XyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUQgICAgPSAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTEFDSyAgPSAxOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE1lbWJlcihpbnQgbG93LCBpbnQgaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgbG93XyAgPSBsb3c7Ci0gICAgICAgICAgICBoaWdoXyA9IGhpZ2g7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNZW1iZXIoTG9jYXRpb24gbCwgSUFTVE5vZGUgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG93XyAgPSBsLmxvd187Ci0gICAgICAgICAgICBoaWdoXyA9IGwuaGlnaF87Ci0gICAgICAgICAgICBub2RlXyA9IG5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNZW1iZXIoSUFTVE5vZGUgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcyhnZXRMb2NhdGlvbihub2RlKSwgbm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvcHlGcm9tKE1lbWJlciB5KQotICAgICAgICB7Ci0gICAgICAgICAgICBsb3dfICA9IHkubG93XzsKLSAgICAgICAgICAgIGhpZ2hfID0geS5oaWdoXzsKLSAgICAgICAgICAgIG5vZGVfID0geS5ub2RlXzsgICAvLyBpcyB0aGlzIHJpZ2h0PwotICAgICAgICAgICAgLy8gVE9ETzogY29tcHV0ZSBtYXgKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgbGVmdFJvdGF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lbWJlciB5ID0gdGhpcy5yaWdodF87ICAgLy9hc3N1bWVkIHRvIGJlIG5vbi1udWxsOwotICAgICAgICAgICAgdGhpcy5yaWdodF8gPSB5LmxlZnRfOwotICAgICAgICAgICAgaWYgKHkubGVmdF8hPW51bGwpCi0gICAgICAgICAgICAgICAgeS5sZWZ0Xy5wYXJlbnRfID0gdGhpczsKLSAgICAgICAgICAgIHkucGFyZW50XyA9IHRoaXMucGFyZW50XzsKLSAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudF89PW51bGwpIAotICAgICAgICAgICAgICAgIHJvb3RfPXk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcz09dGhpcy5wYXJlbnRfLmxlZnRfKQotICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudF8ubGVmdF89eTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Xy5yaWdodF89eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHkubGVmdF89dGhpczsKLSAgICAgICAgICAgIHRoaXMucGFyZW50Xz15OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTZXQgdGhlIG1heCdzIC0gb3JkZXIgaXMgaW1wb3J0YW50Ci0gICAgICAgICAgICB0aGlzLnVwZGF0ZU1heCgpOwotICAgICAgICAgICAgeS51cGRhdGVNYXgoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcmlnaHRSb3RhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBNZW1iZXIgeCA9IHRoaXMubGVmdF87ICAgLy9hc3N1bWVkIHRvIGJlIG5vbi1udWxsOwotICAgICAgICAgICAgdGhpcy5sZWZ0XyA9IHgucmlnaHRfOwotICAgICAgICAgICAgaWYgKHgucmlnaHRfIT1udWxsKQotICAgICAgICAgICAgICAgIHgucmlnaHRfLnBhcmVudF8gPSB0aGlzOwotICAgICAgICAgICAgeC5wYXJlbnRfID0gdGhpcy5wYXJlbnRfOwotICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Xz09bnVsbCkgCi0gICAgICAgICAgICAgICAgcm9vdF89eDsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0aGlzPT10aGlzLnBhcmVudF8ubGVmdF8pCi0gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Xy5sZWZ0Xz14OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRfLnJpZ2h0Xz14OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeC5yaWdodF89dGhpczsKLSAgICAgICAgICAgIHRoaXMucGFyZW50Xz14OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTZXQgdGhlIG1heCdzIC0gb3JkZXIgaXMgaW1wb3J0YW50Ci0gICAgICAgICAgICB0aGlzLnVwZGF0ZU1heCgpOwotICAgICAgICAgICAgeC51cGRhdGVNYXgoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWF4KCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGwgPSAobGVmdF8hPW51bGwgPyBsZWZ0Xy5tYXhfIDogMCk7Ci0gICAgICAgICAgICBpbnQgciA9IChyaWdodF8hPW51bGwgPyByaWdodF8ubWF4XyA6IDApOwotICAgICAgICAgICAgbWF4XyA9IE1hdGgubWF4KGhpZ2hfLCBNYXRoLm1heChsLCByKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZW1iZXIKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2F0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IGxvd189MDsKLSAgICAgICAgcHVibGljIGludCBoaWdoXz0wOwotICAgICAgICAKLSAgICAgICAgcHVibGljIExvY2F0aW9uKGludCBsb3csIGludCBoaWdoKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb3dfICA9IGxvdzsKLSAgICAgICAgICAgIGhpZ2hfID0gaGlnaDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykKLSAgICB7Ci0gICAgICAgIFN0YXRlbWVudE1hcCBzbSA9IG5ldyBTdGF0ZW1lbnRNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIHNtLmFkZCgxMiwgMTUpOwotICAgICAgICBzbS5hZGQoMSwgNik7Ci0gICAgICAgIHNtLmFkZCgxNCwgMjQpOwotICAgICAgICAKLSAgICAgICAgTWVtYmVyIG0gPSBzbS5maW5kSW50ZXJ2YWxNZW1iZXIoMTIsMTIpOwotICAgICAgICBpZiAobT09bnVsbCkKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY291bGQgbm90IGZpbmQgMTIiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGluICIrbS5sb3dfKyI6IittLmhpZ2hfKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3BhcnNlci9PcGVuTVBLZXl3b3Jkcy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9wYXJzZXIvT3Blbk1QS2V5d29yZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhMTRhMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3BhcnNlci9PcGVuTVBLZXl3b3Jkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMucGFyc2VyOwotLyoqCi0gKiBPcGVuTVAga2V5d29yZHMKLSAqIEBhdXRob3IgcGF6ZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBLZXl3b3JkcwotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEFUT01JQyA9ICJhdG9taWMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBCQVJSSUVSID0gImJhcnJpZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDT1BZSU4gPSAiY29weWluIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ09QWVBSSVZBVEUgPSAiY29weXByaXZhdGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDUklUSUNBTCA9ICJjcml0aWNhbCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIERFRkFVTFQgPSAiZGVmYXVsdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEZJUlNUUFJJVkFURSA9ICJmaXJzdHByaXZhdGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBGTFVTSCA9ICJmbHVzaCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEZPUiA9ICJmb3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBJRiA9ICJpZiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIExBU1RQUklWQVRFID0gImxhc3Rwcml2YXRlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gTUFTVEVSID0gIm1hc3RlciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIE5PTkUgICAgICAgPSAibm9uZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIE5PV0FJVCA9ICJub3dhaXQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBOVU1USFJFQURTID0gIm51bV90aHJlYWRzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gT01QID0gIm9tcCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIE9SREVSRUQgPSAib3JkZXJlZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFBBUkFMTEVMID0gInBhcmFsbGVsIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUFJJVkFURSA9ICJwcml2YXRlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUkVEVUNUSU9OID0gInJlZHVjdGlvbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFNDSEVEVUxFID0gInNjaGVkdWxlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VDVElPTiA9ICJzZWN0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VDVElPTlMgPSAic2VjdGlvbnMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTSEFSRUQgPSAic2hhcmVkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU0lOR0xFID0gInNpbmdsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFRIUkVBRFBSSVZBVEUgPSAidGhyZWFkcHJpdmF0ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIERZTkFNSUMgPSAiZHluYW1pYyIudG9DaGFyQXJyYXkoKTsgIC8vICROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU1RBVElDICA9ICJzdGF0aWMiLnRvQ2hhckFycmF5KCk7ICAgLy8gJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBQT1VORCA9ICIjIi50b0NoYXJBcnJheSgpOyAgICAgICAvLyAkTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFBSQUdNQSA9ICJwcmFnbWEiLnRvQ2hhckFycmF5KCk7ICAgICAgIC8vICROT04tTkxTLTEkCi19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvcGFyc2VyL09wZW5NUFNjYW5uZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvYW5hbHlzaXMvcGFyc2VyL09wZW5NUFNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2YzI4NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3BhcnNlci9PcGVuTVBTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5wYXJzZXIuSUdDQ1Rva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhcnNlci5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLnV0aWwuQ2hhckFycmF5SW50TWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhcnNlci51dGlsLkNoYXJBcnJheVV0aWxzOwotCi0KLS8qKgotICogQ2xhc3MgdG8gc2NhbiAjcHJhZ21hIHN0cmluZyBmb3IgT3Blbk1QIHN5bnRheCAoYWRhcHRlZCBmcm9tIGNkdCdzIEJhc2VTY2FubmVyKQotICogCi0gKiBAYXV0aG9yIFBhemVsCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgT3Blbk1QU2Nhbm5lcgotewotICAgIC8vICBDaGFyIGJ1ZmZlcgotICAgIHByaXZhdGUgY2hhciBbXSBpbnB1dEJ1ZmZlcl8gPSBudWxsOwotICAgIC8vICBDdXJyZW50IHBvc2l0aW9uIGludG8gYnVmZmVyCi0gICAgcHJpdmF0ZSBpbnQgICAgY3VycmVudFBvc18gICA9IC0xOwotICAgIHByaXZhdGUgaW50ICAgIGVuZFBvc18gICAgICAgPSAwOyAgIC8vIGluZGV4IGp1c3QgcGFzdCBsYXN0IGNoYXIKLSAgICAKLSAgICAvLyBUaGVzZSBuZWVkIHRvIGJlIHNldAotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHN1cHBvcnRNaW5BbmRNYXggPSB0cnVlOwotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHN1cHBvcnQkSW5pdGlhbGl6ZXJzID0gdHJ1ZTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNoYXJbXSBFTVBUWV9DSEFSX0FSUkFZID0gbmV3IGNoYXJbMF07Ci0gICAgCi0gICAgLy9wcm90ZWN0ZWQgU2Nhbm5lckNhbGxiYWNrTWFuYWdlciBjYWxsYmFja01hbmFnZXJfID0gbnVsbDsgIC8vIHVudXNlZDsgcmVtb3ZlZCBmb3IgQ0RUNS4wCi0gICAgCi0gICAgLy8qKgotICAgIC8vICBPcGVuTVBTY2FubmVyIC0gT2JqZWN0IHRvIHNjYW4gT3Blbk1QIHByYWdtYSBsaW5lCi0gICAgLy8qKgotICAgIHB1YmxpYyBPcGVuTVBTY2FubmVyKFN0cmluZyBpbnB1dEJ1ZmZlcikKLSAgICB7Ci0gICAgICAgaW5wdXRCdWZmZXJfID0gaW5wdXRCdWZmZXIudG9DaGFyQXJyYXkoKTsgCi0gICAgICAgZW5kUG9zXyAgICAgID0gaW5wdXRCdWZmZXIubGVuZ3RoKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcGVuTVBUb2tlbiBuZXh0VG9rZW4oKSAKLSAgICB7Ci0gICAgICAgIAotICAgICAgcmV0dXJuIGZldGNoVG9rZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIGZldGNoVG9rZW4oKQotICAgIHsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChjdXJyZW50UG9zXzxlbmRQb3NfKSAgewotCi0gICAgICAgICAgc2tpcE92ZXJXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgY3VycmVudFBvc18rKzsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoY3VycmVudFBvc18+PWVuZFBvc18pCi0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgCi0gICAgICAgICAgc3dpdGNoIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc19dKSB7Ci0gICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBjYXNlICdMJzoKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NfICsgMSA8IGVuZFBvc18gJiYgaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJyInKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjYW5TdHJpbmcoKTsKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NfICsgMSA8IGVuZFBvc18gJiYgaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJ1wnJykKLSAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FuQ2hhckxpdGVyYWwoKTsKLQotICAgICAgICAgICAgICByZXR1cm4gc2NhbklkZW50aWZpZXIoKTsKLQotICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICByZXR1cm4gc2NhblN0cmluZygpOwotCi0gICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgIHJldHVybiBzY2FuQ2hhckxpdGVyYWwoKTsKLQotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgY2FzZSAnYic6Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgIGNhc2UgJ2YnOgotICAgICAgICBjYXNlICdnJzoKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgIGNhc2UgJ2knOgotICAgICAgICBjYXNlICdqJzoKLSAgICAgICAgY2FzZSAnayc6Ci0gICAgICAgIGNhc2UgJ2wnOgotICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgIGNhc2UgJ28nOgotICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgY2FzZSAncSc6Ci0gICAgICAgIGNhc2UgJ3InOgotICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgIGNhc2UgJ3UnOgotICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgY2FzZSAndyc6Ci0gICAgICAgIGNhc2UgJ3gnOgotICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgY2FzZSAneic6Ci0gICAgICAgIGNhc2UgJ0EnOgotICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgIGNhc2UgJ0QnOgotICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgIGNhc2UgJ0cnOgotICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgIGNhc2UgJ0onOgotICAgICAgICBjYXNlICdLJzoKLSAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgIGNhc2UgJ04nOgotICAgICAgICBjYXNlICdPJzoKLSAgICAgICAgY2FzZSAnUCc6Ci0gICAgICAgIGNhc2UgJ1EnOgotICAgICAgICBjYXNlICdSJzoKLSAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgIGNhc2UgJ1QnOgotICAgICAgICBjYXNlICdVJzoKLSAgICAgICAgY2FzZSAnVic6Ci0gICAgICAgIGNhc2UgJ1cnOgotICAgICAgICBjYXNlICdYJzoKLSAgICAgICAgY2FzZSAnWSc6Ci0gICAgICAgIGNhc2UgJ1onOgotICAgICAgICBjYXNlICdfJzoKLSAgICAgICAgICAgIHJldHVybiAgc2NhbklkZW50aWZpZXIoKTsKLQotICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXwotICAgICAgICAgICAgICAgICAgICAmJiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJ3UnIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJ1UnKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzY2FuSWRlbnRpZmllcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9oYW5kbGVQcm9ibGVtKElQcm9ibGVtLlNDQU5ORVJfQkFEX0NIQVJBQ1RFUiwKLSAgICAgICAgICAgIC8vICAgICAgICBidWZmZXJQb3NbYnVmZmVyU3RhY2tQb3NdLCBuZXcgY2hhcltdIHsgJ1xcJyB9KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGNhc2UgJzAnOgotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgcmV0dXJuIHNjYW5OdW1iZXIoKTsKLQotICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSkgewotICAgICAgICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICAgIGNhc2UgJzInOgotICAgICAgICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Nhbk51bWJlcigpOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnLic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDIgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMl0gPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc18gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRFTExJUFNJUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICcqJzoKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50RE9UU1RBUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50RE9UKTsKLQotICAgICAgICBjYXNlICcjJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfICYmIGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICcjJykgewotICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NfKys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50UE9VTkRQT1VORCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4obXBQb3VuZCk7Ci0KLSAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICBjdXJyZW50UG9zXysrOwotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50TEJSQUNFKTsKLQotICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgIGN1cnJlbnRQb3NfKys7Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRSQlJBQ0UpOwotCi0gICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgY3VycmVudFBvc18rKzsKLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udExCUkFDS0VUKTsKLQotICAgICAgICBjYXNlICddJzoKLSAgICAgICAgICAgIGN1cnJlbnRQb3NfKys7Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRSQlJBQ0tFVCk7Ci0KLSAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRMUEFSRU4pOwotCi0gICAgICAgIGNhc2UgJyknOgotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50UlBBUkVOKTsKLQotICAgICAgICBjYXNlICc7JzoKLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udFNFTUkpOwotCi0gICAgICAgIGNhc2UgJzonOgotICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NfICsgMSA8IGVuZFBvc18pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udENPTE9OQ09MT04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udENPTE9OKTsKLQotICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udFFVRVNUSU9OKTsKLQotICAgICAgICBjYXNlICcrJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICcrJykgewotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRJTkNSKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRQTFVTQVNTSUdOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRQTFVTKTsKLQotICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAyIDwgZW5kUG9zXykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDJdID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NfICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50QVJST1dTVEFSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRBUlJPVyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50REVDUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50TUlOVVNBU1NJR04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udE1JTlVTKTsKLQotICAgICAgICBjYXNlICcqJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRTVEFSQVNTSUdOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRTVEFSKTsKLQotICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRESVZBU1NJR04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udERJVik7Ci0KLSAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXykgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50TU9EQVNTSUdOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRNT0QpOwotCi0gICAgICAgIGNhc2UgJ14nOgotICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NfICsgMSA8IGVuZFBvc18pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udFhPUkFTU0lHTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50WE9SKTsKLQotICAgICAgICBjYXNlICcmJzoKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICcmJykgewotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRBTkQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udEFNUEVSQVNTSUdOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRBTVBFUik7Ci0KLSAgICAgICAgY2FzZSAnfCc6Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXykgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnfCcpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50T1IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udEJJVE9SQVNTSUdOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRCSVRPUik7Ci0KLSAgICAgICAgY2FzZSAnfic6Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRDT01QTCk7Ci0KLSAgICAgICAgY2FzZSAnISc6Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXykgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50Tk9URVFVQUwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udE5PVCk7Ci0KLSAgICAgICAgY2FzZSAnPSc6Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXykgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50RVFVQUwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udEFTU0lHTik7Ci0KLSAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXykgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50TFRFUVVBTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NfICsgMiA8IGVuZFBvc18pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAyXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zXyArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udFNISUZUTEFTU0lHTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50U0hJRlRMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zXyArIDFdID09ICc/JyAmJiBzdXBwb3J0TWluQW5kTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihDaGFyQXJyYXlVdGlscy5leHRyYWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyXywgY3VycmVudFBvc18sIDIpLCBJR0NDVG9rZW4udE1JTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50TFQpOwotCi0gICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NfICsgMSA8IGVuZFBvc18pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udEdURVFVQUwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMV0gPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDIgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJfW2N1cnJlbnRQb3NfICsgMl0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc18gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oSVRva2VuLnRTSElGVFJBU1NJR04pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUb2tlbihJVG9rZW4udFNISUZUUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc18gKyAxXSA9PSAnPycgJiYgc3VwcG9ydE1pbkFuZE1heCkgewotICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4oQ2hhckFycmF5VXRpbHMuZXh0cmFjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlcl8sIGN1cnJlbnRQb3NfLCAyKSwgSUdDQ1Rva2VuLnRNQVgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50R1QpOwotCi0gICAgICAgIGNhc2UgJywnOgotICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50Q09NTUEpOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGlucHV0QnVmZmVyX1tjdXJyZW50UG9zX10pIHx8IGlucHV0QnVmZmVyX1tjdXJyZW50UG9zX10gPT0gJ18nCi0gICAgICAgICAgICAgICAgICAgIHx8IChzdXBwb3J0JEluaXRpYWxpemVycyAmJiBpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc19dID09ICckJykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2NhbklkZW50aWZpZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAvLyBza2lwIG92ZXIgYW55dGhpbmcgd2UgZG9uJ3QgaGFuZGxlCi0gICAgICAgICAgICAvL2NoYXIgW10geCA9IG5ldyBjaGFyIFsxXTsKLSAgICAgICAgICAgIC8veFswXSA9IGJ1ZmZlcltwb3NdOwotICAgICAgICAgICAgLy9oYW5kbGVQcm9ibGVtKCBJQVNUUHJvYmxlbS5TQ0FOTkVSX0JBRF9DSEFSQUNURVIsIHBvcywgeCApOwotICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIC8vIFdlJ3ZlIHJ1biBvdXQgb2YgY29udGV4dHMsIG91ciB3b3JrIGlzIGRvbmUgaGVyZQotICAgIC8vcmV0dXJuIGNvbnRlbnRBc3Npc3RNb2RlID8gZW9jVG9rZW4gOiBudWxsOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gc2NhblN0cmluZygpIAotICB7Ci0gICAgY2hhcltdIGJ1ZmZlciA9IGlucHV0QnVmZmVyXzsKLQotICAgIGludCB0b2tlblR5cGUgPSBJVG9rZW4udFNUUklORzsKLSAgICBpZiAoYnVmZmVyW2N1cnJlbnRQb3NfXSA9PSAnTCcpIHsKLSAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgdG9rZW5UeXBlID0gSVRva2VuLnRMU1RSSU5HOwotICAgIH0KLQotICAgIGludCBzdHJpbmdTdGFydCA9IGN1cnJlbnRQb3NfICsgMTsKLSAgICBpbnQgc3RyaW5nTGVuID0gMDsKLSAgICBib29sZWFuIGVzY2FwZWQgPSBmYWxzZTsKLSAgICBib29sZWFuIGZvdW5kQ2xvc2luZ1F1b3RlID0gZmFsc2U7Ci0gICAgbG9vcDogd2hpbGUgKCsrY3VycmVudFBvc18gPCBlbmRQb3NfKSB7Ci0gICAgICAgICsrc3RyaW5nTGVuOwotICAgICAgICBjaGFyIGMgPSBidWZmZXJbY3VycmVudFBvc19dOwotICAgICAgICBpZiAoYyA9PSAnIicpIHsKLSAgICAgICAgICAgIGlmICghZXNjYXBlZCkgewotICAgICAgICAgICAgICAgIGZvdW5kQ2xvc2luZ1F1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcpIHsKLSAgICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgLy91bmVzY2FwZWQgZW5kIG9mIGxpbmUgYmVmb3JlIGVuZCBvZiBzdHJpbmcKLSAgICAgICAgICAgIGlmICghZXNjYXBlZCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdccicpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfCi0gICAgICAgICAgICAgICAgICAgICYmIGJ1ZmZlcltjdXJyZW50UG9zXyArIDFdID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgIGlmICghZXNjYXBlZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZXNjYXBlZCA9IGZhbHNlOwotICAgIH0KLSAgICAtLXN0cmluZ0xlbjsKLQotICAgIC8vIFdlIHNob3VsZCByZWFsbHkgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHdlIGRpZG4ndCBnZXQgdGhlIHRlcm1pbmF0aW5nCi0gICAgLy8gcXVvdGUgYmVmb3JlIHRoZSBlbmQgb2YgYnVmZmVyCi0gICAgY2hhcltdIHJlc3VsdCA9IENoYXJBcnJheVV0aWxzLmV4dHJhY3QoYnVmZmVyLCBzdHJpbmdTdGFydCwgc3RyaW5nTGVuKTsKLSAgICAvL2lmICghZm91bmRDbG9zaW5nUXVvdGUpIHsKLSAgICAvLyAgICBoYW5kbGVQcm9ibGVtKElQcm9ibGVtLlNDQU5ORVJfVU5CT1VOREVEX1NUUklORywgc3RyaW5nU3RhcnQsCi0gICAgLy8gICAgICAgICAgICByZXN1bHQpOwotICAgIC8vfQotICAgIHJldHVybiBuZXdUb2tlbihyZXN1bHQsIHRva2VuVHlwZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gc2NhbkNoYXJMaXRlcmFsKCkgCi0gIHsKLSAgICBjaGFyW10gYnVmZmVyID0gaW5wdXRCdWZmZXJfOwotICAgIGludCBzdGFydCA9IGN1cnJlbnRQb3NfOwotICAgIGludCBsaW1pdCA9IGVuZFBvc187Ci0KLSAgICBpbnQgdG9rZW5UeXBlID0gSVRva2VuLnRDSEFSOwotICAgIGludCBsZW5ndGggPSAxOwotICAgIGlmIChpbnB1dEJ1ZmZlcl9bY3VycmVudFBvc19dID09ICdMJykgewotICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICB0b2tlblR5cGUgPSBJVG9rZW4udExDSEFSOwotICAgICAgICArK2xlbmd0aDsKLSAgICB9Ci0KLSAgICBpZiAoc3RhcnQgPj0gbGltaXQpIHsKLSAgICAgICAgcmV0dXJuIG5ld1Rva2VuKEVNUFRZX0NIQVJfQVJSQVksIHRva2VuVHlwZSk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBlc2NhcGVkID0gZmFsc2U7Ci0gICAgd2hpbGUgKCsrY3VycmVudFBvc18gPCBlbmRQb3NfKSB7Ci0gICAgICAgICsrbGVuZ3RoOwotICAgICAgICBpbnQgcG9zID0gY3VycmVudFBvc187Ci0gICAgICAgIGlmIChidWZmZXJbcG9zXSA9PSAnXCcnKSB7Ci0gICAgICAgICAgICBpZiAoIWVzY2FwZWQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyW3Bvc10gPT0gJ1xcJykgewotICAgICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZXNjYXBlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChjdXJyZW50UG9zXyA9PSBlbmRQb3NfKSB7Ci0gICAgICAgIC8vaGFuZGxlUHJvYmxlbShJUHJvYmxlbS5TQ0FOTkVSX0JBRF9DSEFSQUNURVIsIHN0YXJ0LCBDaGFyQXJyYXlVdGlscwotICAgICAgICAvLyAgICAgICAgLmV4dHJhY3QoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiBuZXdUb2tlbihFTVBUWV9DSEFSX0FSUkFZLCB0b2tlblR5cGUpOwotICAgIH0KLQotICAgIGNoYXJbXSBpbWFnZSA9IGxlbmd0aCA+IDAgPyBDaGFyQXJyYXlVdGlscy5leHRyYWN0KGJ1ZmZlciwgc3RhcnQsCi0gICAgICAgICAgICBsZW5ndGgpIDogRU1QVFlfQ0hBUl9BUlJBWTsKLQotICAgIHJldHVybiBuZXdUb2tlbihpbWFnZSwgdG9rZW5UeXBlKTsKLX0KLQotICBwcm90ZWN0ZWQgT3Blbk1QVG9rZW4gc2Nhbk51bWJlcigpCi0gIHsKLSAgICAgIGNoYXJbXSBidWZmZXIgPSBpbnB1dEJ1ZmZlcl87Ci0gICAgICBpbnQgc3RhcnQgPSBjdXJyZW50UG9zXzsKLSAgICAgIGludCBsaW1pdCA9IGVuZFBvc187Ci0KLSAgICAgIGJvb2xlYW4gaXNGbG9hdCA9IGJ1ZmZlcltzdGFydF0gPT0gJy4nOwotICAgICAgYm9vbGVhbiBoYXNFeHBvbmVudCA9IGZhbHNlOwotCi0gICAgICBib29sZWFuIGlzSGV4ID0gZmFsc2U7Ci0gICAgICBib29sZWFuIGlzT2N0YWwgPSBmYWxzZTsKLSAgICAgIGJvb2xlYW4gaXNNYWxmb3JtZWRPY3RhbCA9IGZhbHNlOwotCi0gICAgICBpZiAoYnVmZmVyW3N0YXJ0XSA9PSAnMCcgJiYgc3RhcnQgKyAxIDwgbGltaXQpIHsKLSAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlcltzdGFydCArIDFdKSB7Ci0gICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgIGlzSGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgKytjdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltzdGFydCArIDFdID4gJzAnICYmIGJ1ZmZlcltzdGFydCArIDFdIDwgJzcnKQotICAgICAgICAgICAgICAgICAgaXNPY3RhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlcltzdGFydCArIDFdID09ICc4JyB8fCBidWZmZXJbc3RhcnQgKyAxXSA9PSAnOScpIHsKLSAgICAgICAgICAgICAgICAgIGlzT2N0YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgaXNNYWxmb3JtZWRPY3RhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHdoaWxlICgrK2N1cnJlbnRQb3NfIDwgbGltaXQpIHsKLSAgICAgICAgICBpbnQgcG9zID0gY3VycmVudFBvc187Ci0gICAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zXSkgewotICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgIGNhc2UgJzInOgotICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgICBpZiAoKGJ1ZmZlcltwb3NdID09ICc4JyB8fCBidWZmZXJbcG9zXSA9PSAnOScpICYmIGlzT2N0YWwpIHsKLSAgICAgICAgICAgICAgICAgIGlzTWFsZm9ybWVkT2N0YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgICAvL2lmIChpc0xpbWl0UmVhY2hlZCgpKQotICAgICAgICAgICAgICAvLyAgICBoYW5kbGVOb1N1Y2hDb21wbGV0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgaWYgKGlzRmxvYXQpIHsKLSAgICAgICAgICAgICAgICAgIC8vIHNlY29uZCBkb3QKLSAgICAgICAgICAgICAgICAgIC8vaGFuZGxlUHJvYmxlbShJUHJvYmxlbS5TQ0FOTkVSX0JBRF9GTE9BVElOR19QT0lOVCwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAvLyAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlzRmxvYXQgPSB0cnVlOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGNhc2UgJ0UnOgotICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICBpZiAoaXNIZXgpCi0gICAgICAgICAgICAgICAgICAvLyBhIGhleCAnZScKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgIGlmIChoYXNFeHBvbmVudCkKLSAgICAgICAgICAgICAgICAgIC8vIHNlY29uZCBlCi0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkKLSAgICAgICAgICAgICAgICAgIC8vIGVuZGluZyBvbiB0aGUgZT8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIHN3aXRjaCAoYnVmZmVyW3BvcyArIDFdKSB7Ci0gICAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIGEgZ29vZCBleHBvbmVudAotICAgICAgICAgICAgICAgICAgaXNGbG9hdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICBoYXNFeHBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAvLyBubyBleHBvbmVudCBudW1iZXI/Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICBpZiAoaXNIZXgpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAvLyBub3Qgb3VycwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgIGNhc2UgJ0YnOgotICAgICAgICAgICAgICBpZiAoaXNIZXgpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAvLyBtdXN0IGJlIGZsb2F0IHN1ZmZpeAotICAgICAgICAgICAgICArK2N1cnJlbnRQb3NfOwotCi0gICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyA8IGJ1ZmZlci5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAmJiBidWZmZXJbY3VycmVudFBvc19dID09ICdpJykKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBoYW5kbGUgR0NDIGV4dGVuc2lvbiA1LjEwIENvbXBsZXggTnVtYmVycwotCi0gICAgICAgICAgICAgIGJyZWFrOyAvLyBmaXggZm9yIDc3MjgxICh1c2VkIHRvIGJlIGNvbnRpbnVlKQotCi0gICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICAgICAgIC8vIEhleCBmbG9hdCBleHBvbmVudCBwcmVmaXgKLSAgICAgICAgICAgICAgaWYgKCFpc0Zsb2F0IHx8ICFpc0hleCkgewotICAgICAgICAgICAgICAgICAgLS1jdXJyZW50UG9zXzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKGhhc0V4cG9uZW50KQotICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHAKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KQotICAgICAgICAgICAgICAgICAgLy8gZW5kaW5nIG9uIHRoZSBwPwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zICsgMV0pIHsKLSAgICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgIGNhc2UgJzInOgotICAgICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBnb29kIGV4cG9uZW50Ci0gICAgICAgICAgICAgICAgICBpc0Zsb2F0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGhhc0V4cG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIC8vIG5vIGV4cG9uZW50IG51bWJlcj8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgY2FzZSAnVSc6Ci0gICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgIC8vIHVuc2lnbmVkIHN1ZmZpeAotICAgICAgICAgICAgICBzdWZmaXhMb29wOiB3aGlsZSAoKytjdXJyZW50UG9zXyA8IGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlcltjdXJyZW50UG9zX10pIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLQotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHN1ZmZpeExvb3A7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAvKmJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IHN1ZmZpeGVzLmxlbmd0aDsgaXRlcisrKQotICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltwb3NdID09IHN1ZmZpeGVzW2l0ZXJdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChzdWNjZXNzKQotICAgICAgICAgICAgICAgICAgY29udGludWU7ICovCi0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGNvbnRpbnVlIGluIHRoZSBzd2l0Y2gsIHdlJ3JlIGRvbmUKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLS1jdXJyZW50UG9zXzsKLQotICAgICAgY2hhcltdIHJlc3VsdCA9IENoYXJBcnJheVV0aWxzLmV4dHJhY3QoYnVmZmVyLCBzdGFydCwKLSAgICAgICAgICAgICAgY3VycmVudFBvc18gLSBzdGFydCArIDEpOwotICAgICAgaW50IHRva2VuVHlwZSA9IGlzRmxvYXQgPyBJVG9rZW4udEZMT0FUSU5HUFQgOiBJVG9rZW4udElOVEVHRVI7Ci0KLSAgICAgIC8vaWYgKHRva2VuVHlwZSA9PSBJVG9rZW4udElOVEVHRVIgJiYgaXNIZXggJiYgcmVzdWx0Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAvLyAgICBoYW5kbGVQcm9ibGVtKElQcm9ibGVtLlNDQU5ORVJfQkFEX0hFWF9GT1JNQVQsIHN0YXJ0LCByZXN1bHQpOwotICAgICAgLy99IGVsc2UgaWYgKHRva2VuVHlwZSA9PSBJVG9rZW4udElOVEVHRVIgJiYgaXNPY3RhbCAmJiBpc01hbGZvcm1lZE9jdGFsKSB7Ci0gICAgICAvLyAgICBoYW5kbGVQcm9ibGVtKElQcm9ibGVtLlNDQU5ORVJfQkFEX09DVEFMX0ZPUk1BVCwgc3RhcnQsIHJlc3VsdCk7Ci0gICAgICAvL30KLQotICAgICAgcmV0dXJuIG5ld1Rva2VuKHJlc3VsdCwgdG9rZW5UeXBlKTsKLSAgfQotCi0KLSAgICAvLyoqCi0gICAgLy8gIHNraXBPdmVyV2hpdGVTcGFjZSAtIGJhc2VkIG9uIG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5wYXJzZXIuc2Nhbm5lcjIuQmFzZVNjYW5uZXIKLSAgICAvLyoqCi0gICAgcHJvdGVjdGVkIHZvaWQgc2tpcE92ZXJXaGl0ZVNwYWNlKCkgewotCi0gICAgICAgIGNoYXJbXSBidWZmZXIgPSBpbnB1dEJ1ZmZlcl87Ci0KLSAgICAgICAgIHdoaWxlICgrK2N1cnJlbnRQb3NfIDwgZW5kUG9zXykgewotICAgICAgICAgICAgc3dpdGNoIChidWZmZXJbY3VycmVudFBvc19dKSB7Ci0gICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJbY3VycmVudFBvc18gKyAxXSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKyBjb21tZW50LCBza2lwIHJlc3Qgb2YgbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc18gPSBlbmRQb3NfOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltjdXJyZW50UG9zXyArIDFdID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQyBjb21tZW50LCBmaW5kIGNsb3NpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRFbmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY3VycmVudFBvc18gKz0gMjsgY3VycmVudFBvc18gPCBlbmRQb3NfOyArK2N1cnJlbnRQb3NfKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltjdXJyZW50UG9zX10gPT0gJyonICYmIGN1cnJlbnRQb3NfICsgMSA8IGVuZFBvc18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJ1ZmZlcltjdXJyZW50UG9zXyArIDFdID09ICcvJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zXys9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kRW5kKSAgLy8gd2UgYXJlIGF0IGVuZCBvZiBsaW5lICAtIG5vdGhpbmcgdG8gZG8gKG9kZCBjYXNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfICYmIGJ1ZmZlcltjdXJyZW50UG9zXyArIDFdID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gXG4gaXMgYSB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXyAmJiBidWZmZXJbY3VycmVudFBvc18gKyAxXSA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zXyArIDIgPCBlbmRQb3NfICYmIGJ1ZmZlcltjdXJyZW50UG9zXyArIDJdID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NfICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmVsbCBvdXQgb2Ygc3dpdGNoIHdpdGhvdXQgY29udGludWluZywgd2UncmUgZG9uZQotICAgICAgICAgICAgLS1jdXJyZW50UG9zXzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC0tY3VycmVudFBvc187Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIHNjYW5JZGVudGlmaWVyKCkgCi0gICAgewotICAgICAgICBjaGFyW10gYnVmZmVyID0gaW5wdXRCdWZmZXJfOwotICAgICAgICBib29sZWFuIGVzY2FwZWROZXdsaW5lID0gZmFsc2U7Ci0gICAgICAgIGludCAgICAgc3RhcnQgICAgICAgICAgPSBjdXJyZW50UG9zXzsKLSAgICAgICAgaW50IGxlbiA9IDE7Ci0KLSAgICAgICAgd2hpbGUgKCsrY3VycmVudFBvc18gPCBlbmRQb3NfKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBidWZmZXJbY3VycmVudFBvc19dOwotICAgICAgICAgICAgaWYgKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCBjID09ICdfJwotICAgICAgICAgICAgICAgICAgICB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICAgICAgICAgIHx8IENoYXJhY3Rlci5pc1VuaWNvZGVJZGVudGlmaWVyUGFydChjKSkgewotICAgICAgICAgICAgICAgICsrbGVuOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcgJiYgY3VycmVudFBvc18gKyAxIDwgZW5kUG9zXwotICAgICAgICAgICAgICAgICAgICAmJiBidWZmZXJbY3VycmVudFBvc18gKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXNjYXBlZCBuZXdsaW5lCi0gICAgICAgICAgICAgICAgKytlbmRQb3NfOwotICAgICAgICAgICAgICAgIGxlbiArPSAyOwotICAgICAgICAgICAgICAgIGVzY2FwZWROZXdsaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXFwnICYmIChjdXJyZW50UG9zXyArIDEgPCBlbmRQb3NfKSkgewotICAgICAgICAgICAgICAgIGlmICgoYnVmZmVyW2N1cnJlbnRQb3NfICsgMV0gPT0gJ3UnKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgYnVmZmVyW2N1cnJlbnRQb3NfICsgMV0gPT0gJ1UnKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3VycmVudFBvc187Ci0gICAgICAgICAgICAgICAgICAgIGxlbiArPSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL30gZWxzZSBpZiAoKHN1cHBvcnQkSW5pdGlhbGl6ZXJzICYmIGMgPT0gJyQnKSkgewotICAgICAgICAgICAgLy8gICAgKytsZW47Ci0gICAgICAgICAgICAvLyAgICBjb250aW51ZTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAtLWN1cnJlbnRQb3NfOwotCi0gICAgICAgIGNoYXJbXSByZXN1bHQgPSBlc2NhcGVkTmV3bGluZSA/IHJlbW92ZWRFc2NhcGVkTmV3bGluZShidWZmZXIsIHN0YXJ0LAotICAgICAgICAgICAgICAgIGxlbikgOiBDaGFyQXJyYXlVdGlscy5leHRyYWN0KGJ1ZmZlciwgc3RhcnQsIGxlbik7Ci0gICAgICAgIGludCB0b2tlblR5cGUgPSBlc2NhcGVkTmV3bGluZSA/IG1wS2V5d29yZHMuZ2V0KHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCkKLSAgICAgICAgICAgICAgICA6IG1wS2V5d29yZHMuZ2V0KGJ1ZmZlciwgc3RhcnQsIGxlbik7Ci0KLSAgICAgICAgLyppZiAodG9rZW5UeXBlID09IENoYXJBcnJheUludE1hcC51bmRlZmluZWQpIHsKLSAgICAgICAgICAgIHRva2VuVHlwZSA9IGVzY2FwZWROZXdsaW5lID8gYWRkaXRpb25hbEtleXdvcmRzLmdldChyZXN1bHQsIDAsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5sZW5ndGgpIDogYWRkaXRpb25hbEtleXdvcmRzLmdldChidWZmZXIsIHN0YXJ0LCBsZW4pOwotCi0gICAgICAgICAgICBpZiAodG9rZW5UeXBlID09IGFkZGl0aW9uYWxLZXl3b3Jkcy51bmRlZmluZWQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICE9IG51bGwpID8gcmVzdWx0IDogQ2hhckFycmF5VXRpbHMuZXh0cmFjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc3RhcnQsIGxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Rva2VuKElUb2tlbi50SURFTlRJRklFUiwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiBDaGFyQXJyYXlVdGlscy5leHRyYWN0KGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGxlbik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9rZW4ocmVzdWx0LCB0b2tlblR5cGUpOwotICAgICAgICB9Ki8KLSAgICAgICAgcmV0dXJuIG5ld1Rva2VuKHJlc3VsdCwgdG9rZW5UeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIG5ld1Rva2VuKGludCBzaWduYWwpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPcGVuTVBUb2tlbihzaWduYWwsIGN1cnJlbnRQb3NfKTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9wZW5NUFRva2VuIG5ld1Rva2VuKGNoYXIgW10gaW1hZ2UsIGludCBzaWduYWwpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPcGVuTVBUb2tlbihuZXcgU3RyaW5nKGltYWdlKSwgY3VycmVudFBvc18sIHNpZ25hbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGV4dAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2hhcltdIHJlbW92ZWRFc2NhcGVkTmV3bGluZShjaGFyW10gdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7Ci0gICAgICAgIGlmIChDaGFyQXJyYXlVdGlscy5pbmRleE9mKCdcbicsIHRleHQsIHN0YXJ0LCBsZW4pID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIGNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclt0ZXh0Lmxlbmd0aF07Ci0gICAgICAgIEFycmF5cy5maWxsKHJlc3VsdCwgJyAnKTsKLSAgICAgICAgaW50IGNvdW50ZXIgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0ZXh0W2ldID09ICdcXCcgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0W2kgKyAxXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRleHRbaV0gPT0gJ1xcJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICYmIHRleHRbaSArIDFdID09ICdccicgJiYgaSArIDIgPCB0ZXh0Lmxlbmd0aAotICAgICAgICAgICAgICAgICAgICAmJiB0ZXh0W2kgKyAyXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXN1bHRbY291bnRlcisrXSA9IHRleHRbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENoYXJBcnJheVV0aWxzLnRyaW0ocmVzdWx0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaGFuZGxlUHJvYmxlbSAtIHdpbGwgY3JlYXRlIHByb2JsZW1zIHRvIHJlcG9ydCB0aHJvdWdoIGVjbGlwc2UKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUHJvYmxlbShpbnQgaWQsIGludCBzdGFydE9mZnNldCkgCi0gICAgewotICAgICAgIC8vIFRCRAotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBBdG9taWMgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtcEJhcnJpZXIgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1wQ29weWluICA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBDb3B5cHJpdmF0ZSAgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1wQ3JpdGljYWwgICAgID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtcERlZmF1bHQgICAgICA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBGaXJzdHByaXZhdGUgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1wRmx1c2ggID0gNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtcEZvciAgICA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBJZiAgICAgPSA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1wTGFzdHByaXZhdGUgID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBNYXN0ZXIgICAgICAgPSAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtcE5vbmUgICAgICAgICA9IDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1wTm93YWl0ICAgICAgID0gMTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBOdW10aHJlYWRzICAgPSAxNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtcE9tcCAgICAgID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBPcmRlcmVkICA9IDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1wUGFyYWxsZWwgPSAxNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtcFByaXZhdGUgID0gMTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBSZWR1Y3Rpb24gID0gMTk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBTY2hlZHVsZSAgID0gMjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBTZWN0aW9uICAgID0gMjE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBTZWN0aW9ucyAgID0gMjI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBTaGFyZWQgID0gMjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBTaW5nbGUgID0gMjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBUaHJlYWRQcml2YXRlID0gMjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBQb3VuZCAgID0gMjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBQcmFnbWEgID0gMjc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBEeW5hbWljID0gMjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBHdWlkZWQgID0gMjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBSdW50aW1lID0gMzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbXBTdGF0aWMgID0gMzE7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyQXJyYXlJbnRNYXAgbXBLZXl3b3JkczsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBtcEtleXdvcmRzID0gbmV3IENoYXJBcnJheUludE1hcCgxNiwgLTEpOwotCi0gICAgICAgIC8vIENvbW1vbiBrZXl3b3JkcwotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5BVE9NSUMsICBtcEF0b21pYyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuQkFSUklFUiwgbXBCYXJyaWVyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5DT1BZSU4sICBtcENvcHlpbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuQ09QWVBSSVZBVEUsICBtcENvcHlwcml2YXRlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5DUklUSUNBTCwgIG1wQ3JpdGljYWwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLkRFRkFVTFQsICBtcERlZmF1bHQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLkZJUlNUUFJJVkFURSwgIG1wRmlyc3Rwcml2YXRlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5GTFVTSCwgIG1wRmx1c2gpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLkZPUiwgIG1wRm9yKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5JRiwgIG1wSWYpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLkxBU1RQUklWQVRFLCAgbXBMYXN0cHJpdmF0ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuTUFTVEVSLCAgbXBNYXN0ZXIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLk5PTkUsICBtcE5vbmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLk5PV0FJVCwgIG1wTm93YWl0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5OVU1USFJFQURTLCAgbXBOdW10aHJlYWRzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5PTVAsICBtcE9tcCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuT1JERVJFRCwgIG1wT3JkZXJlZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuUEFSQUxMRUwsICBtcFBhcmFsbGVsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5QUklWQVRFLCAgbXBQcml2YXRlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5SRURVQ1RJT04sICBtcFJlZHVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuU0NIRURVTEUsICBtcFNjaGVkdWxlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5TRUNUSU9OLCAgbXBTZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5TRUNUSU9OUywgIG1wU2VjdGlvbnMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1wS2V5d29yZHMucHV0KE9wZW5NUEtleXdvcmRzLlNIQVJFRCwgIG1wU2hhcmVkKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5TSU5HTEUsICBtcFNpbmdsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuUE9VTkQsIG1wUG91bmQpOwotICAgICAgICBtcEtleXdvcmRzLnB1dChPcGVuTVBLZXl3b3Jkcy5QUkFHTUEsIG1wUHJhZ21hKTsKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuVEhSRUFEUFJJVkFURSwgbXBUaHJlYWRQcml2YXRlKTsKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuRFlOQU1JQywgbXBEeW5hbWljKTsKLSAgICAgICAgbXBLZXl3b3Jkcy5wdXQoT3Blbk1QS2V5d29yZHMuU1RBVElDLCAgbXBTdGF0aWMpOyAgIC8vIG5vdCBzdXJlIG9mIHRoaXMgLSBEUFAKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3BhcnNlci9PcGVuTVBUb2tlbi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy9wYXJzZXIvT3Blbk1QVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3N2M5MS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3BhcnNlci9PcGVuTVBUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLnBhcnNlcjsKLQotCi0vKioKLSAqIFRva2VuIHVzZWQgaW4gcGFyc2luZyBPcGVuTVAgcHJhZ21hIGxpbmUKLSAqIAotICogQGF1dGhvciBwYXplbAotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QVG9rZW4KLXsKLSAgICBwcml2YXRlIGludCAgICB0eXBlXyAgPSB0VU5ERUZJTkVEOwotICAgIHByaXZhdGUgU3RyaW5nIGltYWdlXyA9ICIiOwotICAgIHByaXZhdGUgaW50ICAgIG9uc2V0XyA9IC0xOwotICAgIAotICAgIC8vIGZvciBiYWNrdHJhY2tpbmcKLSAgICBwcml2YXRlIE9wZW5NUFRva2VuIG5leHRfID0gbnVsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBPcGVuTVBUb2tlbiAtIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIGltYWdlOiBTdHJpbmcKLSAgICAgKiBAcGFyYW0gb25zZXQ6IGludAotICAgICAqIEBwYXJhbSB0eXBlOiAgaW50Ci0gICAgICovCi0gICAgcHVibGljIE9wZW5NUFRva2VuKFN0cmluZyBpbWFnZSwgaW50IG9uc2V0LCBpbnQgdHlwZSkKLSAgICB7Ci0gICAgICAgIGltYWdlXyA9IGltYWdlOwotICAgICAgICBvbnNldF8gPSBvbnNldDsKLSAgICAgICAgdHlwZV8gID0gdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3Blbk1QVG9rZW4gLSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB0eXBlOiAgaW50Ci0gICAgICogQHBhcmFtIG9uc2V0OiBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3Blbk1QVG9rZW4oaW50IHR5cGUsIGludCBvbnNldCkKLSAgICB7Ci0gICAgICAgIHR5cGVfICA9IHR5cGU7Ci0gICAgICAgIG9uc2V0XyA9IG9uc2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdHlwZV87Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltYWdlXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRPbnNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gb25zZXRfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gaW1hZ2VfLmxlbmd0aCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEVuZE9uc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvbnNldF8rZ2V0TGVuZ3RoKCktMTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TmV4dChPcGVuTVBUb2tlbiBuZXh0KQotICAgIHsKLSAgICAgICAgbmV4dF8gPSBuZXh0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3Blbk1QVG9rZW4gZ2V0TmV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV4dF87Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIC8vIFRva2VuIHR5cGVzCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdFVOREVGSU5FRCAgPSAtMTsKLSAgICAKLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0SURFTlRJRklFUiA9IDE7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0SU5URUdFUiA9IDI7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0Q09MT05DT0xPTiA9IDM7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0Q09MT04gPSA0OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdFNFTUkgPSA1OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdENPTU1BID0gNjsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRRVUVTVElPTiA9IDc7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0TFBBUkVOID0gODsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRSUEFSRU4gPSA5OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdExCUkFDS0VUID0gMTA7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0UkJSQUNLRVQgPSAxMTsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRMQlJBQ0UgPSAxMjsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRSQlJBQ0UgPSAxMzsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRQTFVTQVNTSUdOID0gMTQ7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0SU5DUiA9IDE1OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdFBMVVMgPSAxNjsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRNSU5VU0FTU0lHTiA9IDE3OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdERFQ1IgPSAxODsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRBUlJPV1NUQVIgPSAxOTsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRBUlJPVyA9IDIwOwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdE1JTlVTID0gMjE7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0U1RBUkFTU0lHTiA9IDIyOwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdFNUQVIgPSAyMzsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRNT0RBU1NJR04gPSAyNDsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRNT0QgPSAyNTsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRYT1JBU1NJR04gPSAyNjsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRYT1IgPSAyNzsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRBTVBFUkFTU0lHTiA9IDI4OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdEFORCA9IDI5OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdEFNUEVSID0gMzA7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0QklUT1JBU1NJR04gPSAzMTsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRPUiA9IDMyOwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdEJJVE9SID0gMzM7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0Q09NUEwgPSAzNDsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHROT1RFUVVBTCA9IDM1OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdE5PVCA9IDM2OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdEVRVUFMID0gMzc7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0QVNTSUdOID0gMzg7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0U0hJRlRMID0gNDA7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0TFRFUVVBTCA9IDQxOwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdExUID0gNDI7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0U0hJRlRSQVNTSUdOID0gNDM7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0U0hJRlRSID0gNDQ7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0R1RFUVVBTCA9IDQ1OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdEdUID0gNDY7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0U0hJRlRMQVNTSUdOID0gNDc7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0RUxMSVBTSVMgPSA0ODsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRET1RTVEFSID0gNDk7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0RE9UID0gNTA7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0RElWQVNTSUdOID0gNTE7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0RElWID0gNTI7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCB0X2FuZCA9IDU0OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgdF9hbmRfZXEgPSA1NTsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IHRfYXNtID0gNTY7Ci0KLQotfQotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3RleHR2aWV3L1Nob3dDb25jdXJyZW5jeUFjdGlvbi5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9hbmFseXNpcy90ZXh0dmlldy9TaG93Q29uY3VycmVuY3lBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0NDUxMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2FuYWx5c2lzL3RleHR2aWV3L1Nob3dDb25jdXJyZW5jeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLnRleHR2aWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS5lZGl0b3IuQ0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEFuYWx5c2lzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuT3Blbk1wSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQWN0aW9uIHRvIFNlbGVjdCBhIGxpbmUgYW5kIHNob3cgdGhlIGNvbmN1cnJlbmN5Ci0gKiBAYXV0aG9yIHBhemVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2hvd0NvbmN1cnJlbmN5QWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlCi17Ci0gICAgcHJvdGVjdGVkIENFZGl0b3IgIGVkaXRvcl8gPSBudWxsOwotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gIlNob3cgQ29uY3VycmVuY3kiOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgZm9yIHRoZSBkZWxlZ2F0ZS4gIAotICAgICAqIEltcGxlbWVudG9ycyBzaG91bGQgZGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgZWRpdG9yLCBjb25uZWN0IHRvIHRoZSAKLSAgICAgKiBuZXcgZWRpdG9yLCBhbmQgdXBkYXRlIHRoZSBhY3Rpb24gdG8gcmVmbGVjdCB0aGUgbmV3IGVkaXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotICAgICAqIEBwYXJhbSB0YXJnZXRFZGl0b3IgdGhlIG5ldyBlZGl0b3IgdGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpCi0gICAgewotICAgICAgICBpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgQ0VkaXRvcikKLSAgICAgICAgICAgIGVkaXRvcl8gPSAoQ0VkaXRvcil0YXJnZXRFZGl0b3I7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkFjdGlvbkRlbGVnYXRlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+SUFjdGlvbkRlbGVnYXRlMjwvY29kZT4gbWV0aG9kIHJlZGlyZWN0cyB0byB0aGUgPGNvZGU+cnVuPC9jb2RlPgotICAgICAqIG1ldGhvZC4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotICAgICAgICBUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChlZGl0b3JfIT1udWxsICYmIAotICAgICAgICAgICAgZWRpdG9yXy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgc2VsZWN0aW9uID0gKFRleHRTZWxlY3Rpb24pZWRpdG9yXy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3Rpb24hPW51bGwpIHsKLSAgICAgICAgICAgIHNob3dDb25jdXJyZW5jeShzZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgICBzaG93TWVzc2FnZShUSVRMRSwgIk5vIHNlbGVjdGlvbnMgbWFkZSIpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U3RhbmRhcmREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotICAgICAgICBEaXNwbGF5IGRpc3BsYXk9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwbGF5PSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlzcGxheTsgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBzaG93Q29uY3VycmVuY3kgLSB0cmlnZ2VyZWQgYnkgdGhlIGNvbnRleHQgbWVudSBhY3Rpb24KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIC0gVGV4dFNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dDb25jdXJyZW5jeShUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCk9PTAgJiYgc2VsZWN0aW9uLmdldExlbmd0aCgpPT0wKSB7Ci0gICAgICAgICAgICBzaG93TWVzc2FnZShUSVRMRSwgIk5vIHNlbGVjdGlvbnMgbWFkZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGFuYWx5c2lzCi0gICAgICAgIE9wZW5NUEFuYWx5c2lzTWFuYWdlciBvYW0gPSBPcGVuTVBBbmFseXNpc01hbmFnZXIuZ2V0Q3VycmVudE1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9hbT09bnVsbCkgewotICAgICAgICAgICAgc2hvd01lc3NhZ2UoVElUTEUsICJObyBPcGVuTVAgQW5hbHlzaXMgaGFzIGJlZW4gcGVyZm9ybWVkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGUgYW5hbHlzaXMgaXMgZm9yIHRoaXMgZmlsZQotICAgICAgICBpZiAob2FtLmdldFRVKCk9PW51bGwgKSB7Ci0gICAgICAgICAgICBzaG93TWVzc2FnZShUSVRMRSwgIkVycm9yIGluIGxhc3QgT3Blbk1QIEFuYWx5c2lzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy9TdHJpbmcgZjEgPSBvYW0uZ2V0VFUoKS5nZXRGaWxlUGF0aCgpOwotICAgICAgICAvL1N0cmluZyBmMiA9IGVkaXRvcl8uZ2V0SW5wdXRGaWxlKCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpZXUgPSBlZGl0b3JfLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIElGaWxlIGlucHV0RmlsZT1udWxsOwotICAgICAgICBpZihpZXUgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KXsKLSAgICAgICAgCWlucHV0RmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dClpZXUpLmdldEZpbGUoKTsvL2NkdDQwCi0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgCXNob3dNZXNzYWdlKFRJVExFLCAiQ2Fubm90IGxvY2F0ZSBmaWxlIGluIGVkaXRvciIpOy8vY2R0NDAKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghb2FtLmdldFRVKCkuZ2V0RmlsZVBhdGgoKS5lcXVhbHMoaW5wdXRGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKSkgey8vY2R0NDAKLSAgICAgICAgICAgIHNob3dNZXNzYWdlKFRJVExFLCAiT3Blbk1QIGFuYWx5c2lzIHJlcXVpcmVkIG9uIGVkaXRvciBmaWxlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChvYW0uZ2V0RmlsZU1hcCgpPT1udWxsKSB7Ci0gICAgICAgICAgICBzaG93TWVzc2FnZShUSVRMRSwgIkludGVybmFsIEVycm9yOiBubyBmaWxlIG1hcCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJQVNUTm9kZSBub2RlID0gb2FtLmdldEZpbGVNYXAoKS5maW5kKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgMSk7ICAvLyBvbmx5IDEgLSB3aGVyZSB3ZSBhcmUKLSAgICAgICAgaWYgKG5vZGU9PW51bGwpIHsKLSAgICAgICAgICAgIHNob3dNZXNzYWdlKFRJVExFLCAiQ2Fubm90IGxvY2F0ZSBzdGF0ZW1lbnQgYXQgZ2l2ZW4gc2VsZWN0aW9uIHBvaW50Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlbW92ZUNvbmN1cnJlbmN5TWFya2VycyhlZGl0b3JfLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZWRpdG9yXy5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0gICAgICAgIAotICAgICAgICBTZXQgY1NldCA9IG9hbS5nZXROb2Rlc0NvbmN1cnJlbnRUbyhub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERpc3BsYXkgYWxsIGNvbmN1cnJlbnQgc3RhdGVtZW50cwotICAgICAgICBmb3IoSXRlcmF0b3IgaT1jU2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSUFTVE5vZGUgbiA9IChJQVNUTm9kZSlpLm5leHQoKTsKLSAgICAgICAgICAgIHNob3dOb2RlKG4sIE9wZW5NcElEcy5Db25jdXJyZW5jeVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBub2RlIGlzIG5vdCBjb25jdXJyZW50IHRvIGl0c2VsZiwgd2UgYWRvcHQgYSBkaWZmZXJlbnQgbWFya2VyIGNvbG9yCi0gICAgICAgIGlmICghY1NldC5jb250YWlucyhub2RlKSkKLSAgICAgICAgICAgc2hvd05vZGUobm9kZSwgT3Blbk1wSURzLk5vbkNvbmN1cnJlbmN5VHlwZSk7IAotICAgICAgICAKLSAgICAgICAgLy8gc2VsZWN0IHRoZSBrZXkgc3RtdAotICAgICAgICBVdGlsaXR5LkxvY2F0aW9uIGwgPSBVdGlsaXR5LmdldExvY2F0aW9uKG5vZGUpOwotICAgICAgICBlZGl0b3JfLnNlbGVjdEFuZFJldmVhbChsLmxvd18sIGwuaGlnaF8tbC5sb3dfKzEpOyAKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBzaG93Tm9kZSAtIFNob3cgdGhlIG5vZGUgb2YgdGhlIHJpZ2h0IG1hcmtlciB0eXBlCi0gICAgICogQHBhcmFtIG5vZGUgICAgICAgLSBJQVNUTm9kZQotICAgICAqIEBwYXJhbSBtYXJrZXJUeXBlIC0gU3RyaW5nIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dOb2RlKElBU1ROb2RlIG5vZGUsIFN0cmluZyBtYXJrZXJUeXBlKQotICAgIHsKLSAgICAgICAgVXRpbGl0eS5Mb2NhdGlvbiBsID0gVXRpbGl0eS5nZXRMb2NhdGlvbihub2RlKTsKLQotICAgICAgICAKLSAgICAgICAgSUFubm90YXRpb25Nb2RlbCBhbSA9IGVkaXRvcl8uZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChlZGl0b3JfLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2UgbmVlZCB0byBhZGQgYW4gYW5ub3RhdGlvbiB0eXBlIHRvIHRoZSBhbm5vdGF0aW9uIHBhaW50ZXIgKHNlZSBTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCkKLSAgICAgICAgQW5ub3RhdGlvbiBhID0gbmV3IEFubm90YXRpb24obWFya2VyVHlwZSwgdHJ1ZSwgIkhpIik7Ci0gICAgICAgIGludCBlbmQgPSBsLmhpZ2hfLWwubG93XysxOwotICAgICAgICBQb3NpdGlvbiAgIHAgPSBuZXcgUG9zaXRpb24obC5sb3dfLCBlbmQpOwotICAgICAgICBhbS5hZGRBbm5vdGF0aW9uKGEsIHApOwotICAgICAgICAKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFubm90YXRlIG5vZGU9Iitub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSsiIGJlZ2luPSIrbC5sb3dfKyIgZW5kPSIrZW5kKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIHRoZSBjb25jdXJyZW5jeSBtYXJrZXJzIGZyb20gdGhlIHNjcmVlbgotICAgICAqIEBwYXJhbSBhbSAtIElBbm5vdGF0aW9uTW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ29uY3VycmVuY3lNYXJrZXJzKElBbm5vdGF0aW9uTW9kZWwgYW0pCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0IGFpcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIGZvcihJdGVyYXRvciBhaT1hbS5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsgYWkuaGFzTmV4dCgpOykgeyBhaXMuYWRkKGFpLm5leHQoKSk7IH0KLSAgICAgICAgZm9yKEl0ZXJhdG9yIGl0PWFpcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbilpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYS5nZXRUeXBlKCkuZXF1YWxzKE9wZW5NcElEcy5Db25jdXJyZW5jeVR5cGUpIHx8IGEuZ2V0VHlwZSgpLmVxdWFscyhPcGVuTXBJRHMuTm9uQ29uY3VycmVuY3lUeXBlKSkgewotICAgICAgICAgICAgICAgIGFtLnJlbW92ZUFubm90YXRpb24oYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTMxMDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLUBkb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvLnByb2plY3QgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDMxZGQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZTM4Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLk9wZW5NUFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmUsCi0gb3JnLmVjbGlwc2UuY2R0LnVpLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Ci1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLnByZWZzCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2Fib3V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODEwOTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDU1ZWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHNhbXBsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGh0bWwvCi1iaW4uZXhjbHVkZXMgPSBpY29ucy8uY3ZzaWdub3JlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvZ2V0X251bV9wcm9jcy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL2dldF9udW1fcHJvY3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5ZmI5NS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvZ2V0X251bV9wcm9jcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+Z2V0X251bV9wcm9jczwvdGl0bGU+Ci08Ym9keT4KLTxIMz5nZXRfbnVtX3Byb2NzPC9IMz4KLTxQUkU+Ci1pbnQgZ2V0X251bV9wcm9jcyh2b2lkKQotPC9QUkU+Ci08REw+PEREPgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQgY291bGQgYmUgYXNzaWduZWQgdG8gdGhlIHByb2dyYW0uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL2dldF90aHJlYWRfbnVtLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvZ2V0X3RocmVhZF9udW0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZDQ1NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvZ2V0X3RocmVhZF9udW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPmdldF90aHJlYWRfbnVtPC90aXRsZT4KLTxib2R5PgotPEgzPmdldF90aHJlYWRfbnVtPC9IMz4KLTxQUkU+Ci1pbnQgZ2V0X3RocmVhZF9udW0odm9pZCkKLTwvUFJFPgotPERMPjxERD4KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGhyZWFkIG51bWJlciwgd2l0aGluIGl0cyB0ZWFtLCBvZiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24uIFRoZSB0aHJlYWQgbnVtYmVyIGxpZXMgYmV0d2VlbiAwIGFuZCBvbXBfZ2V0X251bV90aHJlYWRzKCktMSwgaW5jbHVzaXZlLiBUaGUgbWFzdGVyIHRocmVhZCBvZiB0aGUgdGVhbSBpcyB0aHJlYWQgMC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2Rlc3Ryb3lfbG9jay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9kZXN0cm95X2xvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0Nzc5Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2Rlc3Ryb3lfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX2Rlc3Ryb3lfbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfZGVzdHJveV9sb2NrPC9IMz4KLTxQUkU+Ci12b2lkIG9tcF9kZXN0cm95X2xvY2sob21wX2xvY2tfdCAqbG9jaykKLTwvUFJFPgotPERMPjxERD4KLUVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkIGxvY2sgdmFyaWFibGUgbG9jayBpcyB1bmluaXRpYWxpemVkLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZGVzdHJveV9uZXN0X2xvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZGVzdHJveV9uZXN0X2xvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhNDUxMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2Rlc3Ryb3lfbmVzdF9sb2NrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfZGVzdHJveV9uZXN0X2xvY2s8L3RpdGxlPgotPGJvZHk+Ci08SDM+b21wX2Rlc3Ryb3lfbmVzdF9sb2NrPC9IMz4KLTxQUkU+Ci12b2lkIG9tcF9kZXN0cm95X25lc3RfbG9jayhvbXBfbmVzdF9sb2NrX3QgKmxvY2spCi08L1BSRT4KLTxETD48REQ+Ci1FbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZCBsb2NrIHZhcmlhYmxlIGxvY2sgaXMgdW5pbml0aWFsaXplZC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF9keW5hbWljLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF9keW5hbWljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2NjY2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9nZXRfZHluYW1pYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPm9tcF9nZXRfZHluYW1pYzwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfZ2V0X2R5bmFtaWM8L0gzPgotPFBSRT4KLWludCBvbXBfZ2V0X2R5bmFtaWModm9pZCkKLTwvUFJFPgotPERMPjxERD4KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBkeW5hbWljIHRocmVhZCBhZGp1c3RtZW50cyAKLWFyZSBlbmFibGVkIGFuZCByZXR1cm5zIDAgb3RoZXJ3aXNlLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X21heF90aHJlYWRzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF9tYXhfdGhyZWFkcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFjZjdhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X21heF90aHJlYWRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfZ2V0X21heF90aHJlYWRzPC90aXRsZT4KLTxib2R5PgotPEgzPm9tcF9nZXRfbWF4X3RocmVhZHM8L0gzPgotPFBSRT4KLWludCBvbXBfZ2V0X21heF90aHJlYWRzKHZvaWQpCi08L1BSRT4KLTxETD48REQ+Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8gb21wX2dldF9udW1fdGhyZWFkcy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF9uZXN0ZWQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X25lc3RlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ3ZGIzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X25lc3RlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX2dldF9uZXN0ZWQ8L3RpdGxlPgotPGJvZHk+Ci08SDM+b21wX2dldF9uZXN0ZWQ8L0gzPgotPFBSRT4KLWludCBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgbmVzdGVkIHBhcmFsbGVsaXNtIGlzIGVuYWJsZWQgYW5kIDAgaWYgaXQgaXMgZGlzYWJsZWQuKHZvaWQpCi08L1BSRT4KLTxETD48REQ+Ci1vbXBfZ2V0X25lc3RlZCBkZXNjcmlwdGlvbgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X251bV90aHJlYWRzLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF9udW1fdGhyZWFkcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q0ZTYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X251bV90aHJlYWRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfZ2V0X251bV90aHJlYWRzPC90aXRsZT4KLTxib2R5PgotPEgzPm9tcF9nZXRfbnVtX3RocmVhZHM8L0gzPgotPFBSRT4KLWludCBvbXBfZ2V0X251bV90aHJlYWRzKGludCBudW1fdGhyZWFkcykKLTwvUFJFPgotPERMPjxERD4KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgY3VycmVudGx5IGluIHRoZSB0ZWFtIGV4ZWN1dGluZyB0aGUgcGFyYWxsZWwgcmVnaW9uIGZyb20gd2hpY2ggaXQgaXMgY2FsbGVkLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X3d0aWNrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF93dGljay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdkODY5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X3d0aWNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfZ2V0X3d0aWNrPC90aXRsZT4KLTxib2R5PgotPEgzPm9tcF9nZXRfd3RpY2s8L0gzPgotPFBSRT4KLWRvdWJsZSBvbXBfZ2V0X3d0aWNrKHZvaWQpCi08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGNsb2NrIHRpY2tzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X3d0aW1lLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2dldF93dGltZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGZjNzFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfZ2V0X3d0aW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfZ2V0X3d0aW1lPC90aXRsZT4KLTxib2R5PgotPEgzPm9tcF9nZXRfd3RpbWU8L0gzPgotPFBSRT4KLWRvdWJsZSBvbXBfZ2V0X3d0aW1lKHZvaWQpCi08L1BSRT4KLTxETD48REQ+Ci1SZXR1cm5zIHRoZSB0aW1lIGVsYXBzZWQgZnJvbSBhIGZpeGVkIHN0YXJ0aW5nIHRpbWUuIFRoZSB2YWx1ZSBvZiB0aGUgZml4ZWQgc3RhcnRpbmcgdGltZSBpcyBkZXRlcm1pbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBwcm9ncmFtLCBhbmQgcmVtYWlucyBjb25zdGFudCB0aHJvdWdob3V0IHByb2dyYW0gZXhlY3V0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfaW5fcGFyYWxsZWwuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfaW5fcGFyYWxsZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwNjgzNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2luX3BhcmFsbGVsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfaW5fcGFyYWxsZWw8L3RpdGxlPgotPGJvZHk+Ci08SDM+b21wX2luX3BhcmFsbGVsPC9IMz4KLTxQUkU+Ci1pbnQgb21wX2luX3BhcmFsbGVsKHZvaWQpCi08L1BSRT4KLTxETD48REQ+Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgaXQgaXMgY2FsbGVkIHdpdGhpbiB0aGUgZHluYW1pYyBleHRlbnQgb2YgYSBwYXJhbGxlbCByZWdpb24gZXhlY3V0aW5nIGluIHBhcmFsbGVsOyBvdGhlcndpc2UsIGl0IHJldHVybnMgMC4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2luaXRfbG9jay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9pbml0X2xvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlNzQ5Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX2luaXRfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX2luaXRfbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfaW5pdF9sb2NrPC9IMz4KLTxQUkU+Ci12b2lkIG9tcF9pbml0X2xvY2sob21wX2xvY2tfdCAqbG9jaykKLTwvUFJFPgotPERMPjxERD4KLVRoZXNlIGZ1bmN0aW9ucyAodGhpcyBhbmQgb21wX2luaXRfbmVzdF9sb2NrKSBwcm92aWRlIHRoZSBvbmx5IG1lYW5zIG9mIGluaXRpYWxpemluZyBhIGxvY2suIEVhY2ggZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgbG9jayBmb3IgdXNlIGluIHN1YnNlcXVlbnQgY2FsbHMuCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9pbml0X25lc3RfbG9jay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9pbml0X25lc3RfbG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVjNjgzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfaW5pdF9uZXN0X2xvY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPm9tcF9pbml0X25lc3RfbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfaW5pdF9uZXN0X2xvY2s8L0gzPgotPFBSRT4KLXZvaWQgb21wX2luaXRfbmVzdF9sb2NrKG9tcF9uZXN0X2xvY2tfdCAqbG9jaykKLTwvUFJFPgotPERMPjxERD4KLVRoZXNlIGZ1bmN0aW9ucyAodGhpcyBhbmQgb21wX2luaXRfbG9jaykgcHJvdmlkZSB0aGUgb25seSBtZWFucyBvZiBpbml0aWFsaXppbmcgYSBsb2NrLiBFYWNoIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyIGxvY2sgZm9yIHVzZSBpbiBzdWJzZXF1ZW50IGNhbGxzLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfc2V0X2R5bmFtaWMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfc2V0X2R5bmFtaWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3ZTJiOS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3NldF9keW5hbWljLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfc2V0X2R5bmFtaWM8L3RpdGxlPgotPGJvZHk+Ci08SDM+b21wX3NldF9keW5hbWljPC9IMz4KLTxQUkU+Ci12b2lkIG9tcF9zZXRfZHluYW1pYyhpbnQgZHluYW1pY190aHJlYWRzKQotPC9QUkU+Ci08REw+PEREPgotVGhpcyBmdW5jdGlvbiBlbmFibGVzIG9yIGRpc2FibGVzIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciBleGVjdXRpb24gb2YgcGFyYWxsZWwgcmVnaW9ucy4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3NldF9sb2NrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3NldF9sb2NrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjMwOWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9zZXRfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPm9tcF9zZXRfbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfc2V0X2xvY2s8L0gzPgotPFBSRT4KLXZvaWQgb21wX3NldF9sb2NrKG9tcF9sb2NrX3QgKmxvY2spCi08L1BSRT4KLTxETD48REQ+Ci1CbG9ja3MgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uIHVudGlsIHRoZSAKLXNwZWNpZmllZCBsb2NrIGlzIGF2YWlsYWJsZSBhbmQgdGhlbiBzZXRzIHRoZSBsb2NrLiAKLUEgc2ltcGxlIGxvY2sgaXMgYXZhaWxhYmxlIGlmIGl0IGlzIHVubG9ja2VkLiAKLUEgbmVzdGFibGUgbG9jayBpcyBhdmFpbGFibGUgaWYgaXQgaXMgdW5sb2NrZWQgb3IgaWYgaXQgaXMgCi1hbHJlYWR5IG93bmVkIGJ5IHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbi4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3NldF9uZXN0X2xvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfc2V0X25lc3RfbG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ0ZTg3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfc2V0X25lc3RfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX3NldF9uZXN0X2xvY2s8L3RpdGxlPgotPGJvZHk+Ci08SDM+b21wX3NldF9uZXN0X2xvY2s8L0gzPgotPFBSRT4KLXZvaWQgb21wX3NldF9uZXN0X2xvY2sob21wX25lc3RfbG9ja190ICpsb2NrKQotPC9QUkU+Ci08REw+PEREPgotQmxvY2tzIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbiB1bnRpbCB0aGUgc3BlY2lmaWVkIGxvY2sgaXMgYXZhaWxhYmxlIGFuZCB0aGVuIHNldHMgdGhlIGxvY2suIEEgc2ltcGxlIGxvY2sgaXMgYXZhaWxhYmxlIGlmIGl0IGlzIHVubG9ja2VkLiBBIG5lc3RhYmxlIGxvY2sgaXMgYXZhaWxhYmxlIGlmIGl0IGlzIHVubG9ja2VkIG9yIGlmIGl0IGlzIGFscmVhZHkgb3duZWQgYnkgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfc2V0X25lc3RlZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9zZXRfbmVzdGVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDBjZmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9zZXRfbmVzdGVkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfc2V0X25lc3RlZDwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfc2V0X25lc3RlZDwvSDM+Ci08UFJFPgotdm9pZCBvbXBfc2V0X25lc3RlZChpbnQgbmVzdGVkKQotPC9QUkU+Ci08REw+PEREPgotVGhpcyBmdW5jdGlvbiBlbmFibGVzIG9yIGRpc2FibGVzIG5lc3RlZCBwYXJhbGxlbGlzbS4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3NldF9udW1fdGhyZWFkcy5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF9zZXRfbnVtX3RocmVhZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3ZjcxZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3NldF9udW1fdGhyZWFkcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX3NldF9udW1fdGhyZWFkczwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfc2V0X251bV90aHJlYWRzPC9IMz4KLTxQUkU+Ci12b2lkIG9tcF9zZXRfbnVtX3RocmVhZHMoaW50IG51bV90aHJlYWRzKQotPC9QUkU+Ci08REw+PEREPgotU2V0cyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uCi08UD48L0RMPjwvZm9udD48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF90ZXN0X2xvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfdGVzdF9sb2NrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMGNlNDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF90ZXN0X2xvY2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5vbXBfdGVzdF9sb2NrPC90aXRsZT4KLTxib2R5PgotPEgzPm9tcF90ZXN0X2xvY2s8L0gzPgotPFBSRT4KLWludCBvbXBfdGVzdF9sb2NrKG9tcF9sb2NrX3QgKmxvY2syKQotPC9QUkU+Ci08REw+PEREPgotQXR0ZW1wdHMgdG8gc2V0IGEgbG9jayBidXQgZG9lcyBub3QgYmxvY2sgZXhlY3V0aW9uIG9mIHRoZSB0aHJlYWQuCi08IS0tICBCUlQgcmV0dXJuIHZhbHVlPyAtLT4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3Rlc3RfbmVzdF9sb2NrLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3Rlc3RfbmVzdF9sb2NrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjhlNjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF90ZXN0X25lc3RfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPm9tcF90ZXN0X25lc3RfbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfdGVzdF9uZXN0X2xvY2s8L0gzPgotPFBSRT4KLWludCBvbXBfdGVzdF9uZXN0X2xvY2sob21wX25lc3RfbG9ja190ICpsb2NrKQotPC9QUkU+Ci08REw+PEREPgotQXR0ZW1wdHMgdG8gc2V0IGEgbG9jayBidXQgZG9lcyBub3QgYmxvY2sgZXhlY3V0aW9uIG9mIHRoZSB0aHJlYWQuCi08IS0tICBCUlQgcmV0dXJuIHZhbHVlPyAtLT4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3Vuc2V0X2xvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfdW5zZXRfbG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQyN2RiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaHRtbC9vbXBfdW5zZXRfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX3Vuc2V0X2xvY2s8L3RpdGxlPgotPGJvZHk+Ci08SDM+b21wX3Vuc2V0X2xvY2s8L0gzPgotPFBSRT4KLXZvaWQgb21wX3Vuc2V0X2xvY2sob21wX2xvY2tfdCAqbG9jaykKLTwvUFJFPgotPERMPjxERD4KLVByb3ZpZGVzIHRoZSBtZWFucyBvZiByZWxlYXNpbmcgb3duZXJzaGlwIG9mIGEgbG9jay4KLTxQPjwvREw+PC9mb250PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3Vuc2V0X25lc3RfbG9jay5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9odG1sL29tcF91bnNldF9uZXN0X2xvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5NzIyYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2h0bWwvb21wX3Vuc2V0X25lc3RfbG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+b21wX3Vuc2V0X25lc3RfbG9jazwvdGl0bGU+Ci08Ym9keT4KLTxIMz5vbXBfdW5zZXRfbmVzdF9sb2NrPC9IMz4KLTxQUkU+Ci12b2lkIG9tcF91bnNldF9uZXN0X2xvY2sob21wX25lc3RfbG9ja190ICpsb2NrKQotPC9QUkU+Ci08REw+PEREPgotUHJvdmlkZXMgdGhlIG1lYW5zIG9mIHJlbGVhc2luZyBvd25lcnNoaXAgb2YgYSBsb2NrLgotPFA+PC9ETD48L2ZvbnQ+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaWNvbnMvLmN2c2lnbm9yZSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaWNvbnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2MDQzYy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2ljb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1jb21wdW5pdHlfbG9nbzIuZ2lmCi1sbGwuZ2lmCi1ub0xMTC5naWYKLW9wZW5tcF9sb2dvLmdpZgotb3Blbm1wX2xvZ29UZW1wLmdpZgotb3Blbk1QSS1pY29uLmdpZgotb3Blbk1Qd2ViTG9nby5naWYKLXBzcGJyd3NlLmpiZgotdGVtcC5naWYKLXp6bm9PcGVuTVAuZ2lmCi16em9wZW5NUC5naWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaWNvbnMvbm9PcGVuTVAuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pY29ucy9ub09wZW5NUC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOGQ1Y2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pY29ucy9ub09wZW5NUC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2ljb25zL29wZW5NUC5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2ljb25zL29wZW5NUC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTA5OTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pY29ucy9vcGVuTVAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pY29ucy9vcGVuTVBlcnIuZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pY29ucy9vcGVuTVBlcnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzg2MDEyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaWNvbnMvb3Blbk1QZXJyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaWNvbnMvb3Blbk1QcHJvYmxlbS5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2ljb25zL29wZW5NUHByb2JsZW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJkYzNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaWNvbnMvb3Blbk1QcHJvYmxlbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2ljb25zL3Byb2JsZW0uZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pY29ucy9wcm9ibGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlZjkzMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL2ljb25zL3Byb2JsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pbmNsdWRlL29tcHRlc3QuaCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvaW5jbHVkZS9vbXB0ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGIwYTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9pbmNsdWRlL29tcHRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIGZyb20gaHR0cDovL2RvY3MuaHAuY29tL2VuL0IzOTAxLTkwMDE1L2NoMDhzMDMuaHRtbCAoZ29vZCBkb2NzIGhlcmUgdG9vKQotI2lmbmRlZiBfT1BFTk1QX0gKLSNkZWZpbmUgX09QRU5NUF9IIAotCi12b2lkIG9tcF9zZXRfbnVtX3RocmVhZHMoaW50IG51bV90aHJlYWRzKTsKLWludCBvbXBfZ2V0X251bV90aHJlYWRzKHZvaWQpOwotaW50IG9tcF9nZXRfbWF4X3RocmVhZHModm9pZCk7Ci1pbnQgb21wX2dldF90aHJlYWRfbnVtKHZvaWQpOwotaW50IG9tcF9nZXRfbnVtX3Byb2NzKHZvaWQpOwotaW50IG9tcF9pbl9wYXJhbGxlbCh2b2lkKTsKLXZvaWQgb21wX3NldF9keW5hbWljKGludCBkeW5hbWljX3RocmVhZHMpOwotaW50IG9tcF9nZXRfZHluYW1pYyh2b2lkKTsKLXZvaWQgb21wX3NldF9uZXN0ZWQoaW50IG5lc3RlZCk7Ci1pbnQgb21wX2dldF9uZXN0ZWQodm9pZCk7Ci0KLS8vIHR5cGVkZWYgdG8gcXVpZXQgdGhlIGVycm9ycyBvbmx5LiBURVNUSU5HIE9OTFkKLXR5cGVkZWYgaW50IG9tcF9sb2NrX3Q7Ci10eXBlZGVmIGludCBvbXBfbmVzdF9sb2NrX3Q7Ci0KLXZvaWQgb21wX2luaXRfbG9jayhvbXBfbG9ja190ICpsb2NrKTsKLXZvaWQgb21wX2luaXRfbmVzdF9sb2NrKG9tcF9uZXN0X2xvY2tfdCAqbG9jayk7Ci12b2lkIG9tcF9kZXN0cm95X2xvY2sob21wX2xvY2tfdCAqbG9jayk7Ci12b2lkIG9tcF9kZXN0cm95X25lc3RfbG9jayhvbXBfbmVzdF9sb2NrX3QgKmxvY2spOwotdm9pZCBvbXBfc2V0X2xvY2sob21wX2xvY2tfdCAqbG9jayk7Ci12b2lkIG9tcF9zZXRfbmVzdF9sb2NrKG9tcF9uZXN0X2xvY2tfdCAqbG9jayk7Ci12b2lkIG9tcF91bnNldF9sb2NrKG9tcF9sb2NrX3QgKmxvY2spOwotdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrKG9tcF9uZXN0X2xvY2tfdCAqbG9jayk7Ci1pbnQgb21wX3Rlc3RfbG9jayhvbXBfbG9ja190ICpsb2NrKTsKLWludCBvbXBfdGVzdF9uZXN0X2xvY2sob21wX25lc3RfbG9ja190ICpsb2NrKTsKLWRvdWJsZSBvbXBfZ2V0X3d0aW1lKHZvaWQpOwotZG91YmxlIG9tcF9nZXRfd3RpY2sodm9pZCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTkyN2VlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jICAgIHRlc3QgcGx1Z2luLnByb3BlcnRpZXMKLSMgVGhlc2UgbmFtZXMgd2lsbCBiZSB1c2VkIGluIHBsdWdpbi54bWwgCi0jCi0KLXBsdWdpbk5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIE9wZW5NUCBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwotCi1PcGVuTVAubmFtZT1PcGVuTVAKLQotdmlldy5uYW1lPU9wZW5NUCBBcnRpZmFjdCBWaWV3Ci12aWV3Y2F0Lm5hbWU9UFRQIE9wZW5NUCBWaWV3cwotcnVuLmxhYmVsPVJ1biBPcGVuTVAgQW5hbHlzaXMKLXJ1bi50b29sdGlwPVJ1biBPcGVuTVAgQW5hbHlzaXMgb24gc2VsZWN0ZWQgZmlsZSwgZm9sZGVyLCBvciBwcm9qZWN0IHRvIGZpbmQgIEFydGlmYWN0cwotCi0jbmVlZCB0byBhZGQgbW9yZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlOWNiZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIldmlld2NhdC5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcCI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Lm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9vcGVuTVAuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS52aWV3cy5PcGVuTVBBcnRpZmFjdFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUudmlld3MuT3Blbk1QQXJ0aWZhY3RWaWV3Ij4KLSAgICAgIDwvdmlldz4KLQotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tICBvcGVuTVAgbWFya2VycyAtLT4KLSAgIDwhLS0gTUFSS0VSX0lEICAgICAgID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLm9wZW5NUE1hcmtlciIgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIgotCQlpZD0ib3Blbk1QTWFya2VyIgotICAgICAgICBuYW1lPSJPcGVuTVAgQXJ0aWZhY3QgTWFya2VyIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVOYW1lIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRoZUxpbmVObyIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2x1bW5ObyIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnN0cnVjdFR5cGUiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5pcXVlSUQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSB0aGlzIGNoYW5nZXMgdGhlIG1hcmtlciBpbWFnZSBpbiB0aGUgZWRpdG9yIG1hcmtlciBiYXIgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5vcGVuTVBNYXJrZXIiCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5vcGVuTVBNYXJrZXJBbm5vdGF0aW9uIj4KLSAgICAgIDwvdHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5vcGVuTVBNYXJrZXJBbm5vdGF0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvb3Blbk1QLmdpZiIgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSI1IgotICAgICAgICAgICAgbGFiZWw9Ik9wZW5NUCBBbm5vdGF0aW9uIE1hcmtlciIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9Im9wZW5vcGVubXBuZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIwLDEyOCwxOTIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLQkJCXNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uS2V5PSJzaG93T3Blbm9wZW5tcG5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbiIKLSAgICAgICAgICAgIHNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Jbk9wbGR0LnZlcnZpZXdSdWxlciIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluY2x1ZGVPblByZWZlcmVuY2VQYWdlPSJ0cnVlIgotICAgICAgICAgICAgaXNHb1RvUHJldmlvdXNOYXZpZ2F0aW9uVGFyZ2V0S2V5PSJpc29wZW5tcEdvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXQiCi0KLSAgICAgICAgICAgIGlzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0S2V5PSJpc29wZW5tcFJlY29yZEdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLSAgICAgICAgICAgID4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4gIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgICAgICA8cGFnZSBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUucHJlZnBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUucHJlZnMuT3Blbk1QUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJPcGVuTVAiCi0gICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24ucHJlZnMuUExEVFByZWZlcmVuY2VQYWdlIgotICAvPgotICAgPC9leHRlbnNpb24+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LnVpLkNIZWxwUHJvdmlkZXIiPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuZWRpdG9ySGVscC5PcGVuTVBDSGVscFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLmVkaXRvckhlbHAuT3Blbk1QQ0hlbHBQcm92aWRlciIvPgotICAgPC9leHRlbnNpb24+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5hY3Rpb25zLlJ1bkFuYWx5c2VPcGVuTVBjb21tYW5kSGFuZGxlciIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5jb21tYW5kMiIKLSAgICAgICAgICAgICAgIG5hbWU9IlNob3cgT3Blbk1QIGFydGlmYWN0cyI+Ci0gICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJ0ZW9wZW5tcEQiCi0gICAgICAgICAgICBuYW1lPSJ0ZW1wTkFNRSIKLSAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0gICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnRvb2xiYXIuY29tbWFuZDE/YWZ0ZXI9c2VwYXJhdG9yMi5vcGVubXAiPgotICAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuY29tbWFuZDIiCi0gICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9vcGVuTVAuZ2lmIgotICAgICAgICAgICAgICAgICAgbGFiZWw9IlNob3cgT3Blbk1QIEFydGlmYWN0cyIKLSAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLSAgICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5wcmVmcy5PcGVuTVBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgICAgPC9pbml0aWFsaXplcj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NhbXBsZXMvQ0ZpbGUuYyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc2FtcGxlcy9DRmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZiYmY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc2FtcGxlcy9DRmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCi0KLXZvaWQgY29tcHV0ZUZ1bmN0aW9uKGRvdWJsZSBbXVtdIHZhbHVlLCBpbnQgbSwgaW50IG4pCi17Ci0gIGludCBpLGosbWF4aXRlcix4LHk7Ci0gIGRvdWJsZSB0b3RhbF9pdGVycz0wOwotI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUoaiwgeCwgeSkgcmVkdWN0aW9uKCs6dG90YWxfaXRlcnMpCi0gIGZvcihpPTA7IGk8bTsgaSsrKSAgIHsKLSAgCWZvcihqPTA7IGo8bjsgaisrKSB7Ci0gIAkJeCA9IGkvKGRvdWJsZSltOwotICAJCXkgPSBqLyhkb3VibGUpbjsKLSAgCQl2YWx1ZVtpLGpdID0gbWFuZGVsX3ZhbCh4LHksbWF4aXRlcik7Ci0gIAkJdG90YWxfaXRlcnMgPSB0b3RhbF9pdGVycyt2YWx1ZVtpLGpdOwotICAJfQotICB9Ci0gIAotICAjcHJhZ21hIG9tcCBzZWN0aW9ucwotICB7Ci0gIAkjcHJhZ21hIG9tcCBzZWN0aW9uCi0gICAgeyAgaT10b3RhbF9pdGVyczsgfQotICAJCi0gIAkjcHJhZ21hIG9tcCBzZWN0aW9uCi0gIAl7ICBqPXRvdGFsX2l0ZXJzK20qbjsgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc2FtcGxlcy90ZXN0T3Blbk1QLmMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NhbXBsZXMvdGVzdE9wZW5NUC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjlhYWFhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc2FtcGxlcy90ZXN0T3Blbk1QLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBvbXAgc2FtcGxlCi0jaW5jbHVkZSA8bWF0aC5oPiAgICAvLyBmb3Igb21wCi0jaW5jbHVkZSAib21wLmgiCi0KLQotLy8gU2FtcGxlIGR1bW15IE9wZW5NUCBwcm9ncmFtCi0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0JaW50ICAgIGksYXJyYXlTaXplOwotCWRvdWJsZSAqeCwgKnk7ICAgICAvKiB0aGUgYXJyYXlzICAgICAgICAgICAgICAgICAqLwotCXByaW50ZigiSGVsbG8gT3Blbk1QIFdvcmxkLlxuIik7Ci0KLS8vIHNhbXBsZSBvcGVuTVAgQVBJCi0JaWYgKG9tcF9pbl9wYXJhbGxlbCgpKXsKLQkJcHJpbnRmKCJ0cnVlIik7Ci0JfQotCSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXJyYXlzLiAqLwotICB4ID0gKGRvdWJsZSAqKSBtYWxsb2MoIChzaXplX3QpICggIGFycmF5U2l6ZSAqIHNpemVvZihkb3VibGUpICkgKTsKLSAgeSA9IChkb3VibGUgKikgbWFsbG9jKCAoc2l6ZV90KSAoICBhcnJheVNpemUgKiBzaXplb2YoZG91YmxlKSApICk7Ci0KLSAgLyogSGVyZSdzIHRoZSBPcGVuTVAgcHJhZ21hIHRoYXQgcGFyYWxsZWxpemVzIHRoZSBmb3ItbG9vcC4gKi8KLSNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgotICBmb3IgKCBpID0gMDsgaSA8IGFycmF5U2l6ZTsgaSsrICkKLSAgICB7Ci0gICAgICB5W2ldID0gc2luKCBleHAoIGNvcyggLSBleHAoIHNpbih4W2ldKSApICkgKSApOwotICAgIH0KLQotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL09wZW5NUEFydGlmYWN0TWFya2luZ1Zpc2l0b3IuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL09wZW5NUEFydGlmYWN0TWFya2luZ1Zpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwOTNjZi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9PcGVuTVBBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3RNYXJraW5nVmlzaXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBPcGVuTVBBcnRpZmFjdE1hcmtpbmdWaXNpdG9yIGV4dGVuZHMgQXJ0aWZhY3RNYXJraW5nVmlzaXRvcgotewotICAgIHB1YmxpYyBPcGVuTVBBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKFN0cmluZyBtYXJrZXJJZCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1hcmtlcklkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9PcGVuTVBJRHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL09wZW5NUElEcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJmNjU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL09wZW5NUElEcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBJRHMgewotIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9wZW5NUF9JTkNMVURFUyA9ICJPcGVuTVAgSW5jbHVkZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9wZW5NUF9CVUlMRF9DTUQgPSAiZ2NjIjsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvT3Blbk1QUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9PcGVuTVBQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyOTQ5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9PcGVuTVBQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBPcGVuTVBQbHVnaW4gcGx1Z2luOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZSI7Ci0JCi0gICAgLy8gQ29uc3RhbnRzCi0gICAgLy8gcHJlZmVyZW5jZSBwYWdlIG5hbWUgZm9yIE9wZW5NUAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTVBfSU5DTFVERVMgICAgPSAiT3Blbk1QIEluY2x1ZGVzIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgICAgICAgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUub3Blbk1QTWFya2VyIjsKLSAgIAotICAgIC8vIGFydGlmYWN0IHZpZXcgaWQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLnZpZXdzLk9wZW5NUEFydGlmYWN0VmlldyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBPcGVuTVBQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPcGVuTVBQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZSIsIHBhdGgpOwotCX0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVmZXJlbmNlIHNldHRpbmcgZm9yIE9wZW5NUCBpbmNsdWRlIHBhdGhzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZURpcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZ0xpc3QgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhPUEVOX01QX0lOQ0xVREVTKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmdMaXN0LCBGaWxlLnBhdGhTZXBhcmF0b3IgKyAiXG5cciIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgTGlzdDxTdHJpbmc+IGRpcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBkaXJzLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcnM7Ci0gICAgfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQTFVHSU5fSUQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9PcGVuTVBTY2FuUmV0dXJuLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9PcGVuTVBTY2FuUmV0dXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODI3OTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvT3Blbk1QU2NhblJldHVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEVycm9yOwotCi0vKioKLSAqIFNhdmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gT3Blbk1QIGFydGlmYWN0cyBhbmQgcHJvYmxlbXMKLSAqIAotICogQGF1dGhvciBEb25hbGQgUCBQYXplbAotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QU2NhblJldHVybiBleHRlbmRzIFNjYW5SZXR1cm4KLXsKLSAgICBwcml2YXRlIExpbmtlZExpc3Q8T3Blbk1QRXJyb3I+IHByb2JsZW1zXyA9IG5ldyBMaW5rZWRMaXN0PE9wZW5NUEVycm9yPigpOyAgCi0gICAgCi0gICAgLyoqCi0gICAgICogT3Blbk1QU2NhblJldHVybiAtIGNvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgT3Blbk1QU2NhblJldHVybigpCi0gICAgewotICAgICAgIHN1cGVyKCk7ICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkT3Blbk1QQXJ0aWZhY3QgLSBhZGQgYSBwcmFnbWEgdG8gdGhlIHByYWdtYSBsaXN0Ci0gICAgICogQHBhcmFtIGEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVuTVBBcnRpZmFjdChBcnRpZmFjdCBhKQotICAgIHsKLSAgICAgICAgYWRkQXJ0aWZhY3QoYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0T3Blbk1QTGlzdCAtIGdldCB0aGUgcHJhZ21hIGxpc3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QXJ0aWZhY3Q+IGdldE9wZW5NUExpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEFydGlmYWN0TGlzdCgpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIGFkZFByb2JsZW1zdCAtIGFkZCBhIHNldCBvZiBwcm9ibGVtcyB0byB0aGUgbGlzdAotICAgICAqIEBwYXJhbSBlcnJvcnMgLSBMaW5rZWRMaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvYmxlbXMoTGlua2VkTGlzdDxPcGVuTVBFcnJvcj4gZXJyb3JzKQotICAgIHsKLSAgICAgICAgaWYgKGVycm9ycy5zaXplKCk+MCkgIC8vIDAgc2l6ZWQgYXBwZW5kcyBzZWVtIHRvIGFkZCBqdW5rIHRvIHByb2JsZW1zXwotICAgICAgICAgIHByb2JsZW1zXy5hZGRBbGwoZXJyb3JzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRQcm9ibGVtcyAtIGFjY2Vzc29yIHRvIHByb2JsZW1zIGxpc3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpbmtlZExpc3Q8T3Blbk1QRXJyb3I+IGdldFByb2JsZW1zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9ibGVtc187Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9hY3Rpb25zL1J1bkFuYWx5c2VPcGVuTVBjb21tYW5kSGFuZGxlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvYWN0aW9ucy9SdW5BbmFseXNlT3Blbk1QY29tbWFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5MjYxNy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9hY3Rpb25zL1J1bkFuYWx5c2VPcGVuTVBjb21tYW5kSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RGaWxlTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LmdudS5jLkdDQ0xhbmd1YWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklMYW5ndWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmRvbS5wYXJzZXIuY3BwLkNQUEFTVFRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5TY2FuUmV0dXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5hY3Rpb25zLlJ1bkFuYWx5c2VIYW5kbGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udXRpbC5Tb3VyY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlZpZXdBY3RpdmF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEFuYWx5c2lzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuT3Blbk1QRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEVycm9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuYW5hbHlzaXMuUEFTVC5QQVNUT01QUHJhZ21hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLk9wZW5NUEFydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuT3Blbk1QUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLk9wZW5NUFNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuYW5hbHlzaXMuT3Blbk1QQ0FTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2LlB2UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi52aWV3cy5Qcm9ibGVtTWFya2VyQXR0cklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLQotLyoqCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUnVuQW5hbHlzZU9wZW5NUGNvbW1hbmRIYW5kbGVyIGV4dGVuZHMgUnVuQW5hbHlzZUhhbmRsZXJCYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTk1QX0RJUkVDVElWRSA9ICJPcGVuTVAgZGlyZWN0aXZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSAiUnVuIEFuYWx5c2lzIiBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgUnVuQW5hbHlzZU9wZW5NUGNvbW1hbmRIYW5kbGVyKCkgewotCQlzdXBlcigiT3Blbk1QIiwgbmV3IE9wZW5NUEFydGlmYWN0TWFya2luZ1Zpc2l0b3IoT3Blbk1QUGx1Z2luLk1BUktFUl9JRCksIE9wZW5NUFBsdWdpbi5NQVJLRVJfSUQpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFJldHVybnMgT3Blbk1QIGFuYWx5c2lzIGFydGlmYWN0cyBmb3IgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzCi0JICogICAgICAgICAgICBPcGVuTVAgaW5jbHVkZSBwYXRocwotCSAqIEByZXR1cm4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NhblJldHVybiBkb0FydGlmYWN0QW5hbHlzaXMoZmluYWwgSVRyYW5zbGF0aW9uVW5pdCB0dSwKLQkJCWZpbmFsIExpc3Q8U3RyaW5nPiBpbmNsdWRlcykgewotCQlPcGVuTVBTY2FuUmV0dXJuIG1zciA9IG5ldyBPcGVuTVBTY2FuUmV0dXJuKCk7Ci0JCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IHR1LmdldEVsZW1lbnROYW1lKCk7Ci0JCUlBU1RUcmFuc2xhdGlvblVuaXQgYXR1ID0gbnVsbDsKLQkJSUxhbmd1YWdlIGxhbmc7Ci0JCXRyeSB7Ci0JCQlsYW5nID0gdHUuZ2V0TGFuZ3VhZ2UoKTsKLQotCQkJYXR1ID0gdHUuZ2V0QVNUKCk7Ci0JCQlpZiAobGFuZy5nZXRJZCgpLmVxdWFscyhHQ0NMYW5ndWFnZS5JRCkpIHsvLyBjZHQ0MAotCQkJCWF0dS5hY2NlcHQobmV3IE9wZW5NUENBU1RWaXNpdG9yKGluY2x1ZGVzLCBmaWxlTmFtZSwgbXNyKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlJUmVzb3VyY2UgcmVzID0gdHUuZ2V0UmVzb3VyY2UoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJZmlsZSA9IChJRmlsZSkgcmVzOwotCQl9Ci0JCWVsc2V7IAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSdW5BbmFseXNlT3Blbk1QLmRvQXJ0aWZhY3RBbmFseXNpcywgZmlsZSBjYXN0IHdvbid0IHdvcmsuLi4iKTsKLQkJfQotCQkvLyBGaW5kIHRoZSBPcGVuTVAgI3ByYWdtYXMKLQkJcHJvY2Vzc09wZW5NUFByYWdtYXMobXNyLCBhdHUsIGZpbGUpOwotCQlyZXR1cm4gbXNyOwotCX0KLQkvKioKLQkgKiBTcGVjaWFsIHByb2Nlc3NpbmcgdG8gZmluZCAjcHJhZ21hcywgc2luY2UgdGhlIENEVCBBU1QKLQkgKiBkb2VzIG5vdCBub3JtYWxseSBpbmNsdWRlIHRoZW0uPGJyPgotCSAqIEFsc28gYWRkcyB0aGUgIk9wZW5NUCBQcm9ibGVtcyIgIAotCSAqIEBwYXJhbSBtc3IKLQkgKiBAcGFyYW0gYXN0VHJhbnNVbml0Ci0JICogQHBhcmFtIGlGaWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc09wZW5NUFByYWdtYXMoT3Blbk1QU2NhblJldHVybiBtc3IsCi0JCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdFRyYW5zVW5pdCwgSUZpbGUgaUZpbGUpIHsKLQkJT3Blbk1QQW5hbHlzaXNNYW5hZ2VyIG9tZ3IgPSBuZXcgT3Blbk1QQW5hbHlzaXNNYW5hZ2VyKGFzdFRyYW5zVW5pdCwKLQkJCQlpRmlsZSk7Ci0JCVBBU1ROb2RlW10gcExpc3QgPSBvbWdyLmdldFBBU1QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocExpc3RbaV0gaW5zdGFuY2VvZiBQQVNUT01QUHJhZ21hKSB7Ci0JCQkJUEFTVE9NUFByYWdtYSBwb3AgPSAoUEFTVE9NUFByYWdtYSkgcExpc3RbaV07Ci0JCQkJU291cmNlSW5mbyBzaSA9IGdldFNvdXJjZUluZm8ocG9wLCAwKTsKLQkJCQlBcnRpZmFjdCBhID0gbmV3IEFydGlmYWN0KHBvcC5nZXRGaWxlbmFtZSgpLCBwb3AKLQkJCQkJCS5nZXRTdGFydGluZ0xpbmUoKSwgcG9wLmdldFN0YXJ0TG9jYXRpb24oKSwgcG9wCi0JCQkJCQkuZ2V0Q29udGVudCgpLCBPUEVOTVBfRElSRUNUSVZFLCBzaSwgcG9wKTsKLQkJCQltc3IuYWRkQXJ0aWZhY3QoYSk7Ci0JCQl9Ci0JCX0KLQotCQltc3IuYWRkUHJvYmxlbXMoT3Blbk1QRXJyb3JNYW5hZ2VyLmdldEN1cnJlbnRFcnJvck1hbmFnZXIoKQotCQkJCQkJLmdldEVycm9ycygpKTsKLQl9Ci0JLyoqCi0JICogR2V0IGV4YWN0IHNvdXJjZSBsb2NhdGlvbmFsIGluZm8gZm9yIGEgZnVuY3Rpb24gY2FsbAotCSAqIAotCSAqIEBwYXJhbSBwYXN0Tm9kZQotCSAqIEBwYXJhbSBjb25zdHJ1Y3RUeXBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU291cmNlSW5mbyBnZXRTb3VyY2VJbmZvKFBBU1ROb2RlIHBhc3ROb2RlLCBpbnQgY29uc3RydWN0VHlwZSkgewotCQlTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBudWxsOwotCQlJQVNUTm9kZUxvY2F0aW9uW10gbG9jYXRpb25zID0gcGFzdE5vZGUuZ2V0Tm9kZUxvY2F0aW9ucygpOwotCQlpZiAobG9jYXRpb25zLmxlbmd0aCA9PSAxKSB7Ci0JCQlJQVNURmlsZUxvY2F0aW9uIGFzdEZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAobG9jYXRpb25zWzBdIGluc3RhbmNlb2YgSUFTVEZpbGVMb2NhdGlvbikgewotCQkJCWFzdEZpbGVMb2NhdGlvbiA9IChJQVNURmlsZUxvY2F0aW9uKSBsb2NhdGlvbnNbMF07Ci0JCQkJc291cmNlSW5mbyA9IG5ldyBTb3VyY2VJbmZvKCk7Ci0JCQkJc291cmNlSW5mby5zZXRTdGFydGluZ0xpbmUoYXN0RmlsZUxvY2F0aW9uCi0JCQkJCQkuZ2V0U3RhcnRpbmdMaW5lTnVtYmVyKCkpOwotCQkJCXNvdXJjZUluZm8uc2V0U3RhcnQoYXN0RmlsZUxvY2F0aW9uLmdldE5vZGVPZmZzZXQoKSk7Ci0JCQkJc291cmNlSW5mby5zZXRFbmQoYXN0RmlsZUxvY2F0aW9uLmdldE5vZGVPZmZzZXQoKQotCQkJCQkJKyBhc3RGaWxlTG9jYXRpb24uZ2V0Tm9kZUxlbmd0aCgpKTsKLQkJCQlzb3VyY2VJbmZvLnNldENvbnN0cnVjdFR5cGUoY29uc3RydWN0VHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUluZm87Ci0JfQotCS8qKgotCSAqIHByb2Nlc3NSZXN1bHRzIC0gb3ZlcnJpZGUgZnJvbSBSdW5BbmFseXNlIGJhc2UsIHRvIHByb2Nlc3MgYm90aCBwcmFnbWEKLQkgKiBhcnRpZmFjdHMgYW5kIHByb2JsZW1zCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc3VsdHMoU2NhblJldHVybiByZXN1bHRzLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJYXNzZXJ0IChyZXN1bHRzIGluc3RhbmNlb2YgT3Blbk1QU2NhblJldHVybik7Ci0KLQkJT3Blbk1QU2NhblJldHVybiBvc3IgPSAoT3Blbk1QU2NhblJldHVybikgcmVzdWx0czsKLQotCQkvLyBUaGlzIGlzIGZvciB0aGUgb3Blbm1wIHByYWdtYSB2aWV3Ci0JCUxpc3Q8QXJ0aWZhY3Q+IGFydGlmYWN0cyA9IG9zci5nZXRPcGVuTVBMaXN0KCk7Ci0JCXZpc2l0b3IudmlzaXRGaWxlKHJlc291cmNlLCBhcnRpZmFjdHMpOwotCi0JCS8vIHJlbW92ZSBwcm9ibGVtcwotCQlyZW1vdmVQcm9ibGVtTWFya2VycyhyZXNvdXJjZSk7Ci0KLQkJLy8gRFBQIC0gcHV0IGluIHN0dWZmIGZvciBwcm9ibGVtcyB2aWV3Ci0JCS8vIEp1c3Qgc3ViY2xhc3Mgc2NhbnJldHVybiBhbmQgY3JlYXRlIG1hcmtlcnMgZm9yIHByb2JsZW1zIHZpZXcgaGVyZQotCQlMaXN0PE9wZW5NUEVycm9yPiBwcm9ibGVtcyA9IG9zci5nZXRQcm9ibGVtcygpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUnVuQW5hbHlzZU9wZW5NUC5wcm9jZXNzUmVzdWx0cywgaGF2ZSAiK3Byb2JsZW1zLnNpemUoKSsgIiBwcm9ibGVtcy4iKTsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3I8T3Blbk1QRXJyb3I+IGkgPSBwcm9ibGVtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJcHJvY2Vzc1Byb2JsZW0oKE9wZW5NUEVycm9yKSBpLm5leHQoKSwgcmVzb3VyY2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUnVuQW5hbHlzaXNPcGVuTVAucHJvY2Vzc1Jlc3VsdHMgZXhjZXB0aW9uOiAiCi0JCQkJCSsgZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBwcm9ibGVtIG1hcmtlciB3aGljaCB3aWxsIHB1dCBhIHByb2JsZW0gb24gdGhlIE9wZW5NUCBwcm9ibGVtcyB2aWV3Ci0JICogCi0JICogQHBhcmFtIHByb2JsZW0gLQotCSAqICAgICAgICAgICAgT3Blbk1QRXJyb3IKLQkgKiBAcGFyYW0gcmVzb3VyY2UgLQotCSAqICAgICAgICAgICAgSVJlc291cmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcm9ibGVtKE9wZW5NUEVycm9yIHByb2JsZW0sIElSZXNvdXJjZSByZXNvdXJjZSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYWxsIHRoZSBhdHRyaWJ1dGVzCi0JCU1hcCBhdHRycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJzLnB1dChQcm9ibGVtTWFya2VyQXR0cklkcy5ERVNDUklQVElPTiwgcHJvYmxlbS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXR0cnMucHV0KFByb2JsZW1NYXJrZXJBdHRySWRzLlJFU09VUkNFLCBwcm9ibGVtLmdldEZpbGVuYW1lKCkpOwotCQlhdHRycy5wdXQoUHJvYmxlbU1hcmtlckF0dHJJZHMuSU5GT0xERVIsIHByb2JsZW0uZ2V0UGF0aCgpKTsKLQkJYXR0cnMucHV0KFByb2JsZW1NYXJrZXJBdHRySWRzLkxPQ0FUSU9OLCBuZXcgSW50ZWdlcihwcm9ibGVtCi0JCQkJLmdldExpbmVubygpKSk7Ci0JCS8vIHVzZWQgdG8gcmVmZXJlbmNlIHByb2JsZW0gaWYgbmVlZAotCQlhdHRycy5wdXQoUHJvYmxlbU1hcmtlckF0dHJJZHMuUFJPQkxFTU9CSkVDVCwgcHJvYmxlbSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBtYXJrZXIgYWxsIGF0IG9uY2UsIHNvIGdldCBPTkxZIGEgc2luZ2xlIHJlc291cmNlQ2hhbmdlCi0JCS8vIGV2ZW50LgotCQlNYXJrZXJVdGlsaXRpZXMuY3JlYXRlTWFya2VyKHJlc291cmNlLCBhdHRycywKLQkJCQlQcm9ibGVtTWFya2VyQXR0cklkcy5NQVJLRVJfRVJST1JfSUQpOwotCi0JfQotCS8qKgotCSAqIFJlbW92ZSB0aGUgT3Blbk1QIHByb2JsZW0gbWFya2VycyBjdXJyZW50bHkgc2V0IG9uIGEgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIC0KLQkgKiAgICAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVQcm9ibGVtTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXJlc291cmNlLmRlbGV0ZU1hcmtlcnMoUHJvYmxlbU1hcmtlckF0dHJJZHMuTUFSS0VSX0VSUk9SX0lELCBmYWxzZSwKLQkJCQkJSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSBkZWxldGluZyBtYXJrZXJzIG9uIE9NUCBQcm9ibGVtczogIgotCQkJCQkrIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZVBhdGgoKSB7Ci0JCXJldHVybiBPcGVuTVBQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluY2x1ZGVEaXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVBcnRpZmFjdFZpZXcoKSB7Ci0JCVZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KE9wZW5NUFBsdWdpbi5WSUVXX0lEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVByb2JsZW1zVmlldygpIHsKLQkJVmlld0FjdGl2YXRlci5hY3RpdmF0ZVZpZXcoUHZQbHVnaW4uVklFV19JRCk7Ci0JfQkKLQkgCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL2FuYWx5c2lzL09wZW5NUENBU1RWaXNpdG9yLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9hbmFseXNpcy9PcGVuTVBDQVNUVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWVmMDNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL2FuYWx5c2lzL09wZW5NUENBU1RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUSWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVExpdGVyYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFuYWx5c2lzLlBsZHRBc3RWaXNpdG9yOwotCi0KLS8qKgotICogVGhpcyBkb20td2Fsa2VyIGNvbGxlY3RzIE9wZW5NUCByZWxhdGVkIGNvbnN0cnVjdHMgKGN1cnJlbnRseSBmdW5jdGlvbiBjYWxscyBhbmQgY29uc3RhbnRzKSwgYW5kIGFkZCBtYXJrZXJzIHRvIHRoZQotICogc291cmNlIGZpbGUgZm9yIEMgY29kZS4gQ3VycmVudGx5LCBpdCBkZWxlZ2F0ZXMgd29yayB0byBNcGlHZW5lcmFsQVNUVmlzaXRvckJlaGF2aW9yLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBDQVNUVmlzaXRvciBleHRlbmRzIFBsZHRBc3RWaXNpdG9yCi17Ci0gICAgewotICAgICAgICB0aGlzLnNob3VsZFZpc2l0RXhwcmVzc2lvbnMgPSB0cnVlOwotICAgICAgICB0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotICAgICAgICB0aGlzLnNob3VsZFZpc2l0VHJhbnNsYXRpb25Vbml0ID0gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBPcGVuTVBDQVNUVmlzaXRvcihMaXN0PFN0cmluZz4gaW5jbHVkZXMsIFN0cmluZyBmaWxlTmFtZSwgU2NhblJldHVybiBtc3IpCi0gICAgewotICAgICAgICBzdXBlcihpbmNsdWRlcywgZmlsZU5hbWUsIG1zcik7Ci0gICAgICAgIEFSVElGQUNUX0NBTEwgPSAiT3Blbk1QIENhbGwiOwotCQlBUlRJRkFDVF9DT05TVEFOVD0iT3Blbk1QIENvbnN0YW50IjsKLSAgICB9Ci0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYPSJvbXBfIjsKLSAgICBwdWJsaWMgaW50IHZpc2l0KElBU1RFeHByZXNzaW9uIGV4cHJlc3Npb24pCi0gICAgewotICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RGdW5jdGlvbkNhbGxFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICBJQVNURXhwcmVzc2lvbiBhc3RFeHByID0gKChJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0RnVuY3Rpb25OYW1lRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGFzdEV4cHIuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZnVuYyBzaWduYXR1cmU9IiArIHNpZ25hdHVyZSk7Ci0gICAgICAgICAgICBpZiAoc2lnbmF0dXJlLnN0YXJ0c1dpdGgoUFJFRklYKSkgewotICAgICAgICAgICAgICAgIGlmIChhc3RFeHByIGluc3RhbmNlb2YgSUFTVElkRXhwcmVzc2lvbikgewotICAgICAgICAgICAgICAgICAgICBJQVNUTmFtZSBmdW5jTmFtZSA9ICgoSUFTVElkRXhwcmVzc2lvbikgYXN0RXhwcikuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRnVuY05hbWUoZnVuY05hbWUsIGFzdEV4cHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSUFTVExpdGVyYWxFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTWFjcm9MaXRlcmFsKChJQVNUTGl0ZXJhbEV4cHJlc3Npb24pIGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9lZGl0b3JIZWxwL09wZW5NUENIZWxwQm9vay5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvZWRpdG9ySGVscC9PcGVuTVBDSGVscEJvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4N2MwNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9lZGl0b3JIZWxwL09wZW5NUENIZWxwQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5lZGl0b3JIZWxwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5LklGdW5jdGlvblByb3RvdHlwZVN1bW1hcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuQ0hlbHBCb29rSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5GdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkZ1bmN0aW9uU3VtbWFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuT3Blbk1QUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGUgaGVscCBmb3IgT3Blbk1QIEFQSXMuPGJyPgotICogVGhpcyBpbmNsdWRlcyBob3ZlciBoZWxwLCBGMSBoZWxwLCBhbmQgY29udGVudCBhc3Npc3QgKGN0cmwtc3BhY2UpCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk1QQ0hlbHBCb29rIGV4dGVuZHMgQ0hlbHBCb29rSW1wbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gIk9wZW5NUCBDIGFuZCBGb3J0cmFuIEhlbHAgQm9vayI7Ci0KLQlwdWJsaWMgT3Blbk1QQ0hlbHBCb29rKCkgewotCQlzdXBlcihPcGVuTVBQbHVnaW4uZ2V0UGx1Z2luSWQoKSk7Ci0JCS8vIHBvcHVsYXRlIGZ1bmMgbWFwCi0JCWZ1bmNOYW1lMkZ1bmNJbmZvPW1ha2VGdW5jdGlvbk1hcCgpOwotCi0JCS8vIHNldCB0aXRsZQotCQlzZXRUaXRsZShUSVRMRSk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBmdW5jdGlvbiBtYXAgb2YgQVBJIG5hbWVzIGFuZCBpbmZvLjxicj4KLQkgKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGZvciAob25lLXRpbWUpIGdlbmVyYXRpb24gb2YgdGhlIGh0bWwKLQkgKiBmaWxlcyBieSB0aGUgbWFpbigpIGFuZCBnZW5lcmF0ZUhUTUwoKSBtZXRob2RzIGJlbG93LgotCSAqIEByZXR1cm4gaGFzaG1hcCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYW5kIGFzc29jaWF0ZWQgaW5mbwotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBtYWtlRnVuY3Rpb25NYXAoKSB7Ci0JCU1hcCBmdW5jTWFwPSBuZXcgSGFzaE1hcCgpOwotCQlmdW5jTWFwLnB1dCgib21wX3NldF9udW1fdGhyZWFkcyIsCi0JCQkJCQluZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgib21wX3NldF9udW1fdGhyZWFkcyIsIiIsCi0JCQkJCQkJCSJTZXRzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24iLAotCQkJCQkJCQluZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgKLQkJCQkJCQkJCQkib21wX3NldF9udW1fdGhyZWFkcyIsICJ2b2lkIiwKLQkJCQkJCQkJCQkiaW50IG51bV90aHJlYWRzIiksIG51bGwpKTsKLQotCQlmdW5jTWFwLnB1dCgib21wX2dldF9udW1fdGhyZWFkcyIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJvbXBfZ2V0X251bV90aHJlYWRzIiwgIiIsICJUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGN1cnJlbnRseSBpbiB0aGUgdGVhbSBleGVjdXRpbmcgdGhlIHBhcmFsbGVsIHJlZ2lvbiBmcm9tIHdoaWNoIGl0IGlzIGNhbGxlZC4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJvbXBfZ2V0X251bV90aHJlYWRzIiwKLQkJCQkJCSJpbnQiLCAiaW50IG51bV90aHJlYWRzIiksIG51bGwpKTsKLQkJCi0JCWZ1bmNNYXAucHV0KCJvbXBfZ2V0X21heF90aHJlYWRzIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9nZXRfbWF4X3RocmVhZHMiLCAiIiwgIlRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSBjYWxscyB0byBvbXBfZ2V0X251bV90aHJlYWRzLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF9nZXRfbWF4X3RocmVhZHMiLAotCQkJCQkJImludCIsICJ2b2lkIiksIG51bGwpKTsKLQkJZnVuY01hcC5wdXQoIm9tcF9nZXRfdGhyZWFkX251bSIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJnZXRfdGhyZWFkX251bSIsICIiLCAiVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aHJlYWQgbnVtYmVyLCB3aXRoaW4gaXRzIHRlYW0sIG9mIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbi4gVGhlIHRocmVhZCBudW1iZXIgbGllcyBiZXR3ZWVuIDAgYW5kIG9tcF9nZXRfbnVtX3RocmVhZHMoKS0xLCBpbmNsdXNpdmUuIFRoZSBtYXN0ZXIgdGhyZWFkIG9mIHRoZSB0ZWFtIGlzIHRocmVhZCAwLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoImdldF90aHJlYWRfbnVtIiwKLQkJCQkJCSJpbnQiLCAidm9pZCIpLCBudWxsKSk7Ci0JCWZ1bmNNYXAucHV0KCJvbXBfZ2V0X251bV9wcm9jcyIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJnZXRfbnVtX3Byb2NzIiwgIiIsICJUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NvcnMgdGhhdCBjb3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgcHJvZ3JhbS4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJnZXRfbnVtX3Byb2NzIiwgImludCIsCi0JCQkJCQkidm9pZCIpLCBudWxsKSk7Ci0JCWZ1bmNNYXAucHV0KCJvbXBfaW5fcGFyYWxsZWwiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgKLQkJCQkib21wX2luX3BhcmFsbGVsIiwgIiIsCi0JCQkJIlRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBpdCBpcyBjYWxsZWQgd2l0aGluIHRoZSBkeW5hbWljIGV4dGVudCBvZiBhIHBhcmFsbGVsIHJlZ2lvbiBleGVjdXRpbmcgaW4gcGFyYWxsZWw7IG90aGVyd2lzZSwgaXQgcmV0dXJucyAwLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF9pbl9wYXJhbGxlbCIsICJpbnQiLAotCQkJCQkJInZvaWQiKSwgbnVsbCkpOwotCi0JCWZ1bmNNYXAucHV0KCJvbXBfc2V0X2R5bmFtaWMiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgKLQkJCQkib21wX3NldF9keW5hbWljIiwgIiIsICJUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgb3IgZGlzYWJsZXMgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIGV4ZWN1dGlvbiBvZiBwYXJhbGxlbCByZWdpb25zLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF9zZXRfZHluYW1pYyIsCi0JCQkJCQkidm9pZCIsICJpbnQgZHluYW1pY190aHJlYWRzIiksIG51bGwpKTsKLQkJZnVuY01hcC5wdXQoIm9tcF9nZXRfZHluYW1pYyIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJvbXBfZ2V0X2R5bmFtaWMiLCAiIiwgIlRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBkeW5hbWljIHRocmVhZCBhZGp1c3RtZW50cyBlbmFibGVkIGFuZCByZXR1cm5zIDAgb3RoZXJ3aXNlLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF9nZXRfZHluYW1pYyIsCi0JCQkJCQkiaW50IiwgInZvaWQiKSwgbnVsbCkpOwotCi0JCWZ1bmNNYXAucHV0KCJvbXBfc2V0X25lc3RlZCIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJvbXBfc2V0X25lc3RlZCIsICIiLCAiVGhpcyBmdW5jdGlvbiBlbmFibGVzIG9yIGRpc2FibGVzIG5lc3RlZCBwYXJhbGxlbGlzbS4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJvbXBfc2V0X25lc3RlZCIsCi0JCQkJCQkidm9pZCIsICJpbnQgbmVzdGVkIiksIG51bGwpKTsKLQkJZnVuY01hcC5wdXQoIm9tcF9nZXRfbmVzdGVkIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9nZXRfbmVzdGVkIiwgIiIsICJvbXBfZ2V0X25lc3RlZCBkZXNjcmlwdGlvbiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIlRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBuZXN0ZWQgcGFyYWxsZWxpc20gaXMgZW5hYmxlZCBhbmQgMCBpZiBpdCBpcyBkaXNhYmxlZC4iLAotCQkJCQkJImludCIsICJ2b2lkIiksIG51bGwpKTsKLQkJZnVuY01hcC5wdXQoIm9tcF9pbml0X2xvY2siLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgKLQkJCQkib21wX2luaXRfbG9jayIsICIiLCAiVGhlc2UgZnVuY3Rpb25zICh0aGlzIGFuZCBvbXBfaW5pdF9uZXN0X2xvY2spIHByb3ZpZGUgdGhlIG9ubHkgbWVhbnMgb2YgaW5pdGlhbGl6aW5nIGEgbG9jay4gRWFjaCBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlciBsb2NrIGZvciB1c2UgaW4gc3Vic2VxdWVudCBjYWxscy4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJvbXBfaW5pdF9sb2NrIiwgInZvaWQiLAotCQkJCQkJIm9tcF9sb2NrX3QgKmxvY2siKSwgbnVsbCkpOwotCQlmdW5jTWFwLnB1dCgib21wX2luaXRfbmVzdF9sb2NrIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9pbml0X25lc3RfbG9jayIsICIiLCAiVGhlc2UgZnVuY3Rpb25zICh0aGlzIGFuZCBvbXBfaW5pdF9sb2NrKSBwcm92aWRlIHRoZSBvbmx5IG1lYW5zIG9mIGluaXRpYWxpemluZyBhIGxvY2suIEVhY2ggZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgbG9jayBmb3IgdXNlIGluIHN1YnNlcXVlbnQgY2FsbHMuIiwKLQkJCQluZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgib21wX2luaXRfbmVzdF9sb2NrIiwgInZvaWQiLAotCQkJCQkJIm9tcF9uZXN0X2xvY2tfdCAqbG9jayIpLCBudWxsKSk7Ci0JCQotCQlmdW5jTWFwLnB1dCgib21wX2Rlc3Ryb3lfbG9jayIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJvbXBfZGVzdHJveV9sb2NrIiwgIiIsICJFbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZCBsb2NrIHZhcmlhYmxlIGxvY2sgaXMgdW5pbml0aWFsaXplZC4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJvbXBfZGVzdHJveV9sb2NrIiwKLQkJCQkJCSJ2b2lkIiwgIm9tcF9sb2NrX3QgKmxvY2siKSwgbnVsbCkpOwotCQlmdW5jTWFwLnB1dCgib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9kZXN0cm95X25lc3RfbG9jayIsICIiLCAiRW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQgbG9jayB2YXJpYWJsZSBsb2NrIGlzIHVuaW5pdGlhbGl6ZWQuIiwKLQkJCQluZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIiwKLQkJCQkJCSJ2b2lkIiwgIm9tcF9uZXN0X2xvY2tfdCAqbG9jayIpLCBudWxsKSk7Ci0JCQotCQlmdW5jTWFwLnB1dCgib21wX3NldF9sb2NrIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9zZXRfbG9jayIsICIiLCAiQmxvY2tzIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbiB1bnRpbCB0aGUgc3BlY2lmaWVkIGxvY2sgaXMgYXZhaWxhYmxlIGFuZCB0aGVuIHNldHMgdGhlIGxvY2suIEEgc2ltcGxlIGxvY2sgaXMgYXZhaWxhYmxlIGlmIGl0IGlzIHVubG9ja2VkLiBBIG5lc3RhYmxlIGxvY2sgaXMgYXZhaWxhYmxlIGlmIGl0IGlzIHVubG9ja2VkIG9yIGlmIGl0IGlzIGFscmVhZHkgb3duZWQgYnkgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF9zZXRfbG9jayIsICJ2b2lkIiwKLQkJCQkJCSJvbXBfbG9ja190ICpsb2NrIiksIG51bGwpKTsKLQkJZnVuY01hcC5wdXQoIm9tcF9zZXRfbmVzdF9sb2NrIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9zZXRfbmVzdF9sb2NrIiwgIiIsICJCbG9ja3MgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uIHVudGlsIHRoZSBzcGVjaWZpZWQgbG9jayBpcyBhdmFpbGFibGUgYW5kIHRoZW4gc2V0cyB0aGUgbG9jay4gQSBzaW1wbGUgbG9jayBpcyBhdmFpbGFibGUgaWYgaXQgaXMgdW5sb2NrZWQuIEEgbmVzdGFibGUgbG9jayBpcyBhdmFpbGFibGUgaWYgaXQgaXMgdW5sb2NrZWQgb3IgaWYgaXQgaXMgYWxyZWFkeSBvd25lZCBieSB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24uIiwKLQkJCQluZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgib21wX3NldF9uZXN0X2xvY2siLCAidm9pZCIsCi0JCQkJCQkib21wX25lc3RfbG9ja190ICpsb2NrIiksIG51bGwpKTsKLQkJCi0JCWZ1bmNNYXAucHV0KCJvbXBfdGVzdF9sb2NrIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF90ZXN0X2xvY2siLCAiIiwgIkF0dGVtcHRzIHRvIHNldCBhIGxvY2sgYnV0IGRvIG5vdCBibG9jayBleGVjdXRpb24gb2YgdGhlIHRocmVhZC4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJvbXBfdGVzdF9sb2NrIiwgImludCIsCi0JCQkJCQkib21wX2xvY2tfdCAqbG9jazIiKSwgbnVsbCkpOwotCQlmdW5jTWFwLnB1dCgib21wX3Rlc3RfbmVzdF9sb2NrIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF90ZXN0X25lc3RfbG9jayIsICIiLCAiQXR0ZW1wdHMgdG8gc2V0IGEgbG9jayBidXQgZG8gbm90IGJsb2NrIGV4ZWN1dGlvbiBvZiB0aGUgdGhyZWFkLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF90ZXN0X25lc3RfbG9jayIsICJpbnQiLAotCQkJCQkJIm9tcF9uZXN0X2xvY2tfdCAqbG9jayIpLCBudWxsKSk7Ci0JCQotCQlmdW5jTWFwLnB1dCgib21wX3Vuc2V0X2xvY2siLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgKLQkJCQkib21wX3Vuc2V0X2xvY2siLCAiIiwgIlByb3ZpZGVzIHRoZSBtZWFucyBvZiByZWxlYXNpbmcgb3duZXJzaGlwIG9mIGEgbG9jay4iLAotCQkJCW5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJvbXBfdW5zZXRfbG9jayIsCi0JCQkJCQkidm9pZCIsICJvbXBfbG9ja190ICpsb2NrIiksIG51bGwpKTsKLQkJZnVuY01hcC5wdXQoIm9tcF91bnNldF9uZXN0X2xvY2siLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgKLQkJCQkib21wX3Vuc2V0X25lc3RfbG9jayIsICIiLCAiUHJvdmlkZXMgdGhlIG1lYW5zIG9mIHJlbGVhc2luZyBvd25lcnNoaXAgb2YgYSBsb2NrLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF91bnNldF9uZXN0X2xvY2siLAotCQkJCQkJInZvaWQiLCAib21wX25lc3RfbG9ja190ICpsb2NrIiksIG51bGwpKTsKLQkJCi0JCWZ1bmNNYXAucHV0KCJvbXBfZ2V0X3d0aW1lIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoCi0JCQkJIm9tcF9nZXRfd3RpbWUiLCAiIiwgIlJldHVybnMgdGhlIHRpbWUgZWxhcHNlZCBmcm9tIGEgZml4ZWQgc3RhcnRpbmcgdGltZS4gVGhlIHZhbHVlIG9mIHRoZSBmaXhlZCBzdGFydGluZyB0aW1lIGlzIGRldGVybWluZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHByb2dyYW0sIGFuZCByZW1haW5zIGNvbnN0YW50IHRocm91Z2hvdXQgcHJvZ3JhbSBleGVjdXRpb24uIiwKLQkJCQluZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbCgib21wX2dldF93dGltZSIsICJkb3VibGUiLAotCQkJCQkJInZvaWQiKSwgbnVsbCkpOwotCQlmdW5jTWFwLnB1dCgib21wX2dldF93dGljayIsIG5ldyBGdW5jdGlvblN1bW1hcnlJbXBsKAotCQkJCSJvbXBfZ2V0X3d0aWNrIiwgIiIsICJSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGNsb2NrIHRpY2tzLiIsCi0JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIm9tcF9nZXRfd3RpY2siLCAiZG91YmxlIiwKLQkJCQkJCSJ2b2lkIiksIG51bGwpKTsKLQotCQkvLyB0cnkgdG8gZGVmaW5lIGNvbnN0YW50cyB0b28uLi4KLS8vCQlmdW5jTWFwLnB1dCgiT01QX0RZTkFNSUMiLCBuZXcgRnVuY3Rpb25TdW1tYXJ5SW1wbCgKLS8vCQkJCSJPTVBfRFlOQU1JQyIsICIiLCAiT01QX0RZTkFNSUMgZGVzY3JpcHRpb24iLAotLy8JCQkJbmV3IEZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeUltcGwoIk9NUF9EWU5BTUlDIiwgInJldCIsCi0vLwkJCQkJCSJpbnQgYXJnMSwgaW50IGFyZzIiKSwgbnVsbCkpOwotCQkKLQkJcmV0dXJuIGZ1bmNNYXA7Ci0JCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9ESVIgPSAiQzpcXGV3c1xccHRwSmFuMDZcXG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlXFxodG1sXFwiOwotCi0JLyoqCi0JICogZ2VuZXJhdGUgaHRtbCBkb2N1bWVudHMgKG9uZS10aW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUhUTUwoTWFwIGZNYXApIHsKLQkJaW50IGNvdW50PTA7Ci0JCUNvbGxlY3Rpb24gZkNvbGwgPSBmTWFwLnZhbHVlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmQ29sbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZ1bmN0aW9uU3VtbWFyeUltcGwgZnNpID0gKEZ1bmN0aW9uU3VtbWFyeUltcGwpIGl0ZXIubmV4dCgpOwotCQkJSUZ1bmN0aW9uUHJvdG90eXBlU3VtbWFyeSBmc3BpID0gZnNpLmdldFByb3RvdHlwZSgpOwotCQkJU3RyaW5nIHByb3RvID0gZnNwaS5nZXRQcm90b3R5cGVTdHJpbmcoZmFsc2UpOwotCQkJU3RyaW5nIGFyZ3MgPSBmc3BpLmdldEFyZ3VtZW50cygpOwotCQkJU3RyaW5nIHJ0ID0gZnNwaS5nZXRSZXR1cm5UeXBlKCk7Ci0KLQkJCWlmIChmc2kgIT0gbnVsbCkgewotCQkJCVByaW50U3RyZWFtIGh0bWwgPSBudWxsOwotCQkJCVN0cmluZyBmaWxlbmFtZT1IVE1MX0RJUitmc2kuZ2V0TmFtZSgpICsgIi5odG1sIjsKLQkJCQl0cnkgewotCQkJCQlodG1sID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCQkJCWh0bWwucHJpbnQoIjxodG1sPjxoZWFkPjx0aXRsZT4iKTsKLQkJCQkJaHRtbC5wcmludChmc2kuZ2V0TmFtZSgpKTsKLQkJCQkJaHRtbC5wcmludGxuKCI8L3RpdGxlPiIpOwotCQkJCQlodG1sLnByaW50bG4oIjxib2R5PiIpOwotCQkJCQlodG1sLnByaW50KCI8SDM+Iik7Ci0JCQkJCWh0bWwucHJpbnQoZnNpLmdldE5hbWUoKSk7Ci0JCQkJCWh0bWwucHJpbnRsbigiPC9IMz4iKTsKLQkJCQkJaHRtbC5wcmludGxuKCI8UFJFPiIpOwotCQkJCQlodG1sLnByaW50bG4oZnNwaS5nZXRQcm90b3R5cGVTdHJpbmcoZmFsc2UpKTsKLQkJCQkJaHRtbC5wcmludGxuKCI8L1BSRT4iKTsKLQkJCQkJaHRtbC5wcmludGxuKCI8REw+PEREPiIpOwotCQkJCQlodG1sLnByaW50bG4oZnNpLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCQlodG1sLnByaW50bG4oIjxQPjwvREw+PC9ib2R5PjwvaHRtbD4iKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGh0bWwgIT0gbnVsbCkKLQkJCQkJCWh0bWwuY2xvc2UoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3cm90ZSAiK2ZpbGVuYW1lKTsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSAiK2NvdW50KyIgaHRtbCBmaWxlcy4iKTsKLQl9Ci0JLyoqCi0JICogUnVuIGFzIEphdmEgYXBwIHRvIGdlbmVyYXRlIHRoZSBIVE1MIGZpbGVzIHRoYXQgd2lsbCBiZSB1c2VkCi0JICogZm9yIEYxIGhlbHAuCi0JICogQHBhcmFtIGFyZ3MgdW51c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlNYXAgbWFwID0gbWFrZUZ1bmN0aW9uTWFwKCk7Ci0JCWdlbmVyYXRlSFRNTChtYXApOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL2VkaXRvckhlbHAvT3Blbk1QQ0hlbHBQcm92aWRlci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvZWRpdG9ySGVscC9PcGVuTVBDSGVscFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDI3YTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvZWRpdG9ySGVscC9PcGVuTVBDSGVscFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuZWRpdG9ySGVscDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkNIZWxwUHJvdmlkZXJJbXBsOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIElDSGVscFByb3ZpZGVyIGFuZCBwcm92aWRlcyBPcGVuTVAgaW5mb3JtYXRpb24gPGJyPgotICogKEYxLCBob3ZlciwgY29udGVudCBhc3Npc3QsIGV0Yy4pCi0gKiAKLSAqIEBhdXRob3IgdGliYml0dHMKLSAqLwotCi1wdWJsaWMgY2xhc3MgT3Blbk1QQ0hlbHBQcm92aWRlciBleHRlbmRzIENIZWxwUHJvdmlkZXJJbXBsIHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWhlbHBCb29rID0gbmV3IE9wZW5NUENIZWxwQm9vaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE4ZmU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jcHJvcGVydGllcyBzdHJpbmdzIHVzZWQgYnkgcGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJrZXkiKQotI3doZXJlIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBrZXk9dmFsdWUgcGFpcnMKLQotT3Blbk1QQXJ0aWZhY3RWaWV3LnRoaW5nbmFtZT1PcGVuTVAgQXJ0aWZhY3QKLU9wZW5NUEFydGlmYWN0Vmlldy50aGluZ25hbWVzPU9wZW5NUCBBcnRpZmFjdHMKLU9wZW5NUEFydGlmYWN0Vmlldy5leHRyYUNvbE5hbWU9Q29uc3RydWN0Ci0KLSN0aGUgZm9sbG93aW5nIGFyZSBwcm9iYWJseSBub3QgdXNlZCAoeWV0KQotT3Blbk1QQXJ0aWZhY3RWaWV3LnZhbHVlSXM9dmFsdWUgaXMgCi1PcGVuTVBBcnRpZmFjdFZpZXcuT3Blbk1QcHJhZ21hPU9wZW5NUCBQcmFnbWEKLU9wZW5NUEFydGlmYWN0Vmlldy5mdW5jdGlvbkNhbGw9RnVuY3Rpb24gQ2FsbAotT3Blbk1QUGx1Z2luLnByZWZlcmVuY2VQYWdlTmFtZT1PcGVuTVAgSW5jbHVkZXMKLVJ1bkFuYWx5c2VPcGVuTVAuT3Blbk1QZGlyZWN0aXZlPU9wZW5NUCBkaXJlY3RpdmUKLVJ1bkFuYWx5c2VPcGVuTVAuT3Blbk1QPU9wZW5NUAotCi1SZW1vdmVNYXJrZXJBY3Rpb24uT3Blbk1QYXJ0aWZhY3RzQ2xlYXJlZD1PcGVuTVAgYXJ0aWZhY3RzIGNsZWFyZWQKLVJlbW92ZU1hcmtlckFjdGlvbi50aGluZ25hbWU9XCBPcGVuTVAgQXJ0aWZhY3QKLVJlbW92ZU1hcmtlckFjdGlvbi5hbmQ9XCBhbmQgCi1SZW1vdmVNYXJrZXJBY3Rpb24uT3Blbk1QQXJ0aWZhY3RFcnJvcj1cIE9wZW5NUCBBcnRpZmFjdCBFcnJvcgotUmVtb3ZlTWFya2VyQWN0aW9uLmhhdmVCZWVuUmVtb3ZlZD1oYXZlIGJlZW4gcmVtb3ZlZC5cbgotCi1SdW5BbmFseXNlT3Blbk1QLk9wZW5NUGRpcmVjdGl2ZT1PcGVuTVAgZGlyZWN0aXZlCi1SdW5BbmFseXNlT3Blbk1QLk9wZW5NUD1PcGVuTVAKLQotT3Blbk1QUHJlZmVyZW5jZVBhZ2UuT3Blbk1QaW5jbHVkZVBhdGhzPU9wZW5NUCBpbmNsdWRlIHBhdGhzOgotT3Blbk1QUHJlZmVyZW5jZVBhZ2UucGxlYXNlQ2hvb3NlRGlyZWN0b3J5PVBsZWFzZSBjaG9vc2UgYSBkaXJlY3Rvcnk6Ci0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvcHJlZnMvT3Blbk1QUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9wcmVmcy9PcGVuTVBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2MTY2Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvY29yZS9wcmVmcy9PcGVuTVBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUuT3Blbk1QSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLk9wZW5NUFBsdWdpbjsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgZGVmYXVsdCBNUEkgcHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gT3Blbk1QUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChPcGVuTVBJRHMuT3Blbk1QX0JVSUxEX0NNRCwgImdjYyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvcHJlZnMvT3Blbk1QUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL3ByZWZzL09wZW5NUFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTVlMzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvcHJlZnMvT3Blbk1QUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QYXRoRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5PcGVuTVBQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGJhc2VkIG9uIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBPcGVuTVBQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCAgPSAiT3Blbk1QIGluY2x1ZGUgcGF0aHM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9CUk9XU0UgPSAiUGxlYXNlIGNob29zZSBhIGRpcmVjdG9yeSBmb3IgT3Blbk1QIGluY2x1ZGVzOiI7Ci0KLSAgICBwdWJsaWMgT3Blbk1QUHJlZmVyZW5jZVBhZ2UoKQotICAgIHsKLSAgICAgICAgc3VwZXIoR1JJRCk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3Blbk1QUHJlZmVyZW5jZVBhZ2UoaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIoc3R5bGUpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZW5NUFByZWZlcmVuY2VQYWdlKFN0cmluZyB0aXRsZSwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlLCBpbnQgc3R5bGUpCi0gICAgewotICAgICAgICBzdXBlcih0aXRsZSwgaW1hZ2UsIHN0eWxlKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVuTVBQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIGludCBzdHlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHRpdGxlLCBzdHlsZSk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0IHByZWZlcmVuY2Ugc3RvcmUgYW5kIHNldCB0aGUgcHJlZmVyZW5jZSBzdG9yZSBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBPcGVuTVBQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBzZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gICAgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpCi0gICAgewotICAgICAgICBQYXRoRWRpdG9yIHBhdGhFZGl0b3IgPSBuZXcgUGF0aEVkaXRvcihPcGVuTVBQbHVnaW4uT1BFTl9NUF9JTkNMVURFUywgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCwKLSAgICAgICAgICAgICAgICBJTkNMVURFU19QUkVGRVJFTkNFX0JST1dTRSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKHBhdGhFZGl0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L29wZW5tcC9jb3JlL3ZpZXdzL09wZW5NUEFydGlmYWN0Vmlldy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvdmlld3MvT3Blbk1QQXJ0aWZhY3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMmRjMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL2NvcmUvdmlld3MvT3Blbk1QQXJ0aWZhY3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLlBBU1QuUEFTVE9NUFByYWdtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLkFydGlmYWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udmlld3MuU2ltcGxlVGFibGVNYXJrZXJWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLk9wZW5NUFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5DTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLlBhcnNlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuZG9tLnBhcnNlci5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3I7Ci0KLS8qKgotICogQW4gT3Blbk1QIGFydGlmYWN0IHZpZXcgYmFzZWQgb24gU2ltcGxlVGFibGVWaWV3IDxicj4KLSAqIE5vdGUgdGhhdCB0aGUgSUQgbXVzdCBiZSB1bmlxdWUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5NUEFydGlmYWN0VmlldyBleHRlbmRzIFNpbXBsZVRhYmxlTWFya2VyVmlldyB7Ci0JcHVibGljIE9wZW5NUEFydGlmYWN0VmlldygpIHsKLQkJLy8gaWYgeW91IG5lZWQgdG8gcmVhZCBpY29uIGltYWdlcywgZXRjLiBmcm9tIHRoZSBwbHVnLWluLCBiZSBzdXJlIHRvCi0JCS8vIHBhc3MgaW4gYW4gYWN0dWFsIFBsdWdpbiBjbGFzcyBpbnN0YW5jZSBmb3IgZmlyc3QgYXJnCi0JCS8vIHN1cGVyKE9wZW5NUFBsdWdpbi5nZXREZWZhdWx0KCksICJPcGVuTVAgQXJ0aWZhY3QiLCAiT3Blbk1QIEFydGlmYWN0cyIsICJDb25zdHJ1Y3QiLCBPcGVuTVBQbHVnaW4uTUFSS0VSX0lEKTsKLQkJc3VwZXIoCi0JCQkJT3Blbk1QUGx1Z2luLmdldERlZmF1bHQoKSwKLQkJCQlPcGVuTVBQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIk9wZW5NUEFydGlmYWN0Vmlldy50aGluZ25hbWUiKSwKLQkJCQlPcGVuTVBQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIk9wZW5NUEFydGlmYWN0Vmlldy50aGluZ25hbWVzIiksCi0JCQkJT3Blbk1QUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJPcGVuTVBBcnRpZmFjdFZpZXcuZXh0cmFDb2xOYW1lIiksCi0JCQkJT3Blbk1QUGx1Z2luLk1BUktFUl9JRCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGN1c3RvbSBpbmZvIGZvciBmaWxsaW5nIGluIHRoZSBsYXN0IGNvbHVtbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uc3RydWN0U3RyKElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUludGVnZXIgdGVtcCA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKGNvbHVtbklEXyk7Ci0JCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCUludGVnZXIgY29uc3RydWN0VHlwZSA9IChJbnRlZ2VyKSB0ZW1wOwotCQkJaW50IGkgPSBjb25zdHJ1Y3RUeXBlLmludFZhbHVlKCk7Ci0JCQlTdHJpbmcgdmFsOy8vID0gQ09OU1RSVUNUX1RZUEVfTkFNRVNbaV07Ci0JCQl2YWwgPSAidmFsdWUgaXMgIiArIGk7IC8vIEJSVCBuZWVkIGEgbW9yZSByb2J1c3QgbG9va3VwCi0JCQlpZiAoaSA9PSAwKQotCQkJCXZhbCA9ICJPcGVuTVAgUHJhZ21hIjsKLQkJCWlmIChpID09IDEpCi0JCQkJdmFsID0gIkZ1bmN0aW9uIENhbGwiOwotCi0JCQlyZXR1cm4gdmFsOwotCQl9IGVsc2UKLQkJCXJldHVybiAiICI7Ci0JfQotICAgIAotCi0gICAgLyoqCi0gICAgICogTWFrZSAic2hvdyBpbmZvIiBhY3Rpb24gdG8gZGlzcGxheSBhcnRpZmFjdCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1ha2VTaG93SW5mb0FjdGlvbigpCi0gICAgewotICAgICAgICBpbmZvQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvYmo7Ci0gICAgICAgICAgICAgICAgaWYobWFya2VyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obnVsbCwgIk5vIHNlbGVjdGlvbiIsICJObyBhcnRpZmFjdCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIAlyZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy9PYmplY3QgbyA9IGFydGlmYWN0TWFuYWdlcl8uZ2V0QXJ0aWZhY3QoKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElEcy5JRCkpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IEFydGlmYWN0TWFuYWdlci5nZXRBcnRpZmFjdChtYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobz09bnVsbCB8fCAhKG8gaW5zdGFuY2VvZiBBcnRpZmFjdCkpICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KW87Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBwID0gYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RBc3Npc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHA9PW51bGwgfHwgIShwIGluc3RhbmNlb2YgUEFTVE9NUFByYWdtYSkpICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIFBBU1RPTVBQcmFnbWEgb21wUHJhZ21hID0gKFBBU1RPTVBQcmFnbWEpcDsKLSAgICAgICAgICAgICAgICAgICAgSUFTVE5vZGUgICAgICBpUmVnaW9uICAgID0gb21wUHJhZ21hLmdldFJlZ2lvbigpOwotICAgICAgICAgICAgICAgICAgICBBU1ROb2RlICAgICAgIHJlZ2lvbiAgICAgPSAoaVJlZ2lvbiBpbnN0YW5jZW9mIEFTVE5vZGUgPyAoQVNUTm9kZSlpUmVnaW9uIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWdpb249PW51bGwpICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgd2UgY29sbGVjdGVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIG9tcCBwcmFnbWEKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gb21wUHJhZ21hLmdldFJlZ2lvbkZpbGVuYW1lKCk7IC8vcmVnaW9uLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpOyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lPT1udWxsKSAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHIgPSBQYXJzZXJVdGlsLmdldFJlc291cmNlRm9yRmlsZW5hbWUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgYVBhcnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAociE9bnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQYXJ0ID0gRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3Iocik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsgcmV0dXJuOyB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChDTW9kZWxFeGNlcHRpb24gZSkgICAgIHsgcmV0dXJuOyB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChhUGFydCBpbnN0YW5jZW9mIEFic3RyYWN0VGV4dEVkaXRvcikgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBvbXBQcmFnbWEuZ2V0UmVnaW9uT2Zmc2V0KCk7IC8vaWZsLmdldE5vZGVPZmZzZXQoKTsgIC8vbG9jc1swXS5nZXROb2RlT2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gb21wUHJhZ21hLmdldFJlZ2lvbkxlbmd0aCgpOyAvL2lmbC5nZXROb2RlTGVuZ3RoKCk7ICAvL3JlZ2lvbi5nZXRMZW5ndGgoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKChBYnN0cmFjdFRleHRFZGl0b3IpYVBhcnQpLnNlbGVjdEFuZFJldmVhbCggb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFUVi5kb3VibGVjbGlja0FjdGlvbjogRXJyb3IgcG9zaXRpb25pbmcgZWRpdG9yIHBhZ2UgZnJvbSBtYXJrZXIgbGluZSBudW1iZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgLy9zaG93U3RhdHVzTWVzc2FnZSgiRXJyb3IgcG9zaXRpb25pbmcgZWRpdG9yIGZyb20gbWFya2VyIGxpbmUgbnVtYmVyIiwgImVycm9yIG1hcmtlciBnb3RvIik7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgaW5mb0FjdGlvbi5zZXRUZXh0KCJTaG93IHByYWdtYSByZWdpb24iKTsKLSAgICAgICAgaW5mb0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiU2hvdyByZWdpb24gZm9yIHNlbGVjdGVkICIgKyB0aGluZ25hbWVfKTsKLSAgICAgICAgaW5mb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi8uY2xhc3NwYXRoIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvLmN2c2lnbm9yZSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTMxMDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1AZG90CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTliZmIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L01FVEEtSU5GL01BTklGRVNULk1GIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjE5ZTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi5QdlBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNkdCwKLSBvcmcuZWNsaXBzZS5jZHQudWksCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24KLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2LAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi52aWV3cwotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9hYm91dC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4MzU5Yi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L2ljb25zL29wZW5NUHByb2JsZW0uZ2lmIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvaWNvbnMvb3Blbk1QcHJvYmxlbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmRjM2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYvaWNvbnMvb3Blbk1QcHJvYmxlbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVlODk0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scyBPcGVuTVAgUHJvYmxlbXMgVmlldwotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3BsdWdpbi54bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFkYTkwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iUFRQIE9wZW5NUCBWaWV3cyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSJPcGVuTVAgUHJvYmxlbXMiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9vcGVuTVBwcm9ibGVtLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAiIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi52aWV3cy5PcGVuTVBQcm9ibGVtc1ZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2LnZpZXdzLk9wZW5NUFByb2JsZW1zVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0gIG9wZW5NUCBtYXJrZXJzIC0tPgotICAgPCEtLSBNQVJLRVJfSUQgICAgICAgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Lm9wZW5NUFByb2JsZW1NYXJrZXIiIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9Im9wZW5NUFByb2JsZW1NYXJrZXIiCi0gICAgICAgIG5hbWU9Ik9wZW5NUCBQcm9ibGVtIE1hcmtlciI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmZvbGRlcm5hbWUiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvYmxlbSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHJhdGlvPSIwLjUiCi0gICAgICAgICAgICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9InJpZ2h0IgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi52aWV3cy5PcGVuTVBQcm9ibGVtc1ZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvdWkvcHYvUHZQbHVnaW4uamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvdWkvcHYvUHZQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkZGIzZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL3VpL3B2L1B2UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFB2UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUHZQbHVnaW4gcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCAgICAgICA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYub3Blbk1QUHJvYmxlbU1hcmtlciI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCAgICAgICAgID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi52aWV3cy5PcGVuTVBQcm9ibGVtc1ZpZXciOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUHZQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdlBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdiIsIHBhdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvdWkvcHYvdmlld3MvT3Blbk1QUHJvYmxlbXNWaWV3LmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL3VpL3B2L3ZpZXdzL09wZW5NUFByb2JsZW1zVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2U3NjFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvdWkvcHYvdmlld3MvT3Blbk1QUHJvYmxlbXNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA3IElCTSBDb3JwLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycC4gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2LnZpZXdzOwotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzLk9wZW5NUEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnBhcnNlci5QYXJzZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi5QdlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYudmlld3MuUHJvYmxlbU1hcmtlckF0dHJJZHM7Ci0KLS8qKgotICogT3Blbk1QIFByb2JsZW1zIFZpZXcKLSAqIDxwPgotICovCi0KLXB1YmxpYyBjbGFzcyBPcGVuTVBQcm9ibGVtc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBBY3Rpb24gYWN0aW9uMTsKLQkvL3ByaXZhdGUgQWN0aW9uIGFjdGlvbjI7Ci0JcHJpdmF0ZSBBY3Rpb24gZG91YmxlQ2xpY2tBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gcmVtb3ZlTWFya2VyQWN0aW9uOwotICAgIAotICAgIHByaXZhdGUgICBTdHJpbmcgICAgICAgICAgICAgICAgICBtYXJrZXJJRF8gICA9IFB2UGx1Z2luLk1BUktFUl9JRDsKLSAgICBwcm90ZWN0ZWQgVXBkYXRlVmlzaXRvciAgICAgICAgICAgdmlzaXRvcl8gICAgPSBuZXcgVXBkYXRlVmlzaXRvcigpOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICBpY29uTmFtZV8gICAgICAgICAgPSAiaWNvbnMvb3Blbk1QcHJvYmxlbS5naWYiOwotICAgIHByaXZhdGUgQWJzdHJhY3RVSVBsdWdpbiAgICAgICAgICB0aGVQbHVnaW5fOwotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuICAgICAgICAgICAgICAgICB0cmFjZU9uICAgICA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBbXSBjb2x1bW5zXyA9IHsiICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBGb2xkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jYXRpb24iCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIE9wZW5NUFByb2JsZW1zVmlldyAtIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgT3Blbk1QUHJvYmxlbXNWaWV3KCkgewotICAgICAgICB0aGVQbHVnaW5fID0gUHZQbHVnaW4uZ2V0RGVmYXVsdCgpOyAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzCi0gICAgICogdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUgaXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUYWJsZSAgICAgICB0YWJsZSAgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIGZvcihpbnQgaT0wOyBpPGNvbHVtbnNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShjb2x1bW5zX1tpXS5sZW5ndGgoKSwgY29sdW1uc19baV0ubGVuZ3RoKCksIHRydWUpKTsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICB0Yy5zZXRUZXh0KGNvbHVtbnNfW2ldKTsKLSAgICAgICAgICAgIHRjLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICAgICAgICB0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOyAvL25ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldFNvcnRlcihuZXcgTmFtZVNvcnRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICAvLyBtYXJrZXJzIGZyb20gd29ya3NwYWNlCi0gICAgICAgIAotICAgICAgICBtYWtlQWN0aW9ucygpOwotICAgICAgICBob29rQ29udGV4dE1lbnUoKTsKLSAgICAgICAgaG9va0RvdWJsZUNsaWNrQWN0aW9uKCk7Ci0gICAgICAgIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKTsKLSAgICB9Ci0gICAKLQotICAgIC8qKgotICAgICAqIEl0IG1pZ2h0IGJlIHVzZWZ1bCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGlzLCB0byBzYXkgd2hpY2ggZmlsZW5hbWVzIHNob3VsZCBhbGxvdyB0aGUgYWN0aW9uICJydW4gYW5hbHlzaXMiICB0byBjcmVhdGUKLSAgICAgKiBuZXcgYXJ0aWZhY3RzIGFuZCB0aHVzIG5ldyBtYXJrZXJzLiA8YnI+Ci0gICAgICogVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRGb3JBbmFseXNpcyhTdHJpbmcgZmlsZW5hbWUpCi0gICAgewotICAgICAgICAvL3JldHVybiBNcGlVdGlsLnZhbGlkRm9yQW5hbHlzaXMoZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLQotCi0JLyoKLQkgKiBUaGUgY29udGVudCBwcm92aWRlciBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIG9iamVjdHMgdG8gdGhlIHZpZXcuIEl0IGNhbiB3cmFwCi0JICogZXhpc3Rpbmcgb2JqZWN0cyBpbiBhZGFwdGVycyBvciBzaW1wbHkgcmV0dXJuIG9iamVjdHMgYXMtaXMuIFRoZXNlIG9iamVjdHMgbWF5IGJlIHNlbnNpdGl2ZQotCSAqIHRvIHRoZSBjdXJyZW50IGlucHV0IG9mIHRoZSB2aWV3LCBvciBpZ25vcmUgaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgCi0JICogKGxpa2UgVGFzayBMaXN0LCBmb3IgZXhhbXBsZSkuCi0JICovCi0JY2xhc3MgVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgSVJlc291cmNlICAgIGlucHV0ICAgICAgICAgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICBoYXNSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIAotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICAgIGlmICghaGFzUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgLy8gYWRkIG1lIGFzIGEgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyIHNvIGkgY2FuIHJlZnJlc2ggYXQKLSAgICAgICAgICAgICAgICAgIC8vIGxlYXN0IHdoZW4gbWFya2VycyBhcmUgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotICAgICAgICAgICAgICAgICAgaGFzUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICAgICAgICAgICAgaW5wdXQgPSAoSVJlc291cmNlKW5ld0lucHV0OwotCQl9Ci0gICAgICAgIAotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLSAgICAgICAgCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSAKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IFtdIG9ianMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBtYXJrZXJJRF87Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0IT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGNhY2hlZCBpbnB1dCBvYmplY3QgaW5zdGVhZCBvZiBxdWVyeWluZyBmcm9tIHdvcmtzcGFjZQotICAgICAgICAgICAgICAgICAgICAgb2JqcyA9IGlucHV0LmZpbmRNYXJrZXJzKGlkLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5NUFByb2JsZW1zVmlldyBleGNlcHRpb24gZ2V0dHRpbmcgbW9kZWwgZWxlbWVudHMgKG1hcmtlcnMiKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9ianM7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgcmVzb3VyY2VDaGFuZ2VkIC0gcmVhY3QgdG8gYSByZXNvdXJjZSBjaGFuZ2UgZXZlbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICAgICAgQ29udHJvbCAgICAgICAgICAgICAgY3RybCAgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgaWYgKGN0cmwhPW51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY3RybC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NSZXNvdXJjZUNoYW5nZURlbHRhKGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGluZGl2LiByb3dzIHdlIGNhcmUgYWJvdXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbmVlZCB0aGlzIGZvciBNYXJrZXIgZGlzcGxheSBhZnRlciBpbml0aWFsIGFuYWx5c2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGZvciBtYXJrZXJzIGRlbGV0ZWQsIGV0Yy4gIENhbiByZW1vdmUgd2hlbiB3ZSBtb3JlIGNvbXBsZXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGluZ3MgaW4gcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc291cmNlQ2hhbmdlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVsdGEuYWNjZXB0KHZpc2l0b3JfKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3Blbk1QUHJvYmxlbXNWaWV3IGVycm9yIGluIHByb2Nlc3NSZXNvcnVjZUNoYW5nZURlbHRhIik7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBIYXNoTWFwICAgaWNvbkhhc2ggPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2Ugb25seSBwdXQgaW1hZ2UgaWNvbiBpbiB0aGUgZmlyc3QgY29sdW1uCi0gICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VzdG9tSW1hZ2Uob2JqKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0Q3VzdG9tSW1hZ2UoT2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIG9uZSBvZiB0aGlzIHR5cGUgb2YgaWNvbiwgcmV1c2UgaXQuCi0gICAgICAgICAgICBJbWFnZSBpbWcgPSAoSW1hZ2UpIGljb25IYXNoLmdldChpY29uTmFtZV8pOwotICAgICAgICAgICAgaWYgKGltZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGF0aCBwYXRoPSBuZXcgUGF0aChpY29uTmFtZV8pOwotICAgICAgICAgICAgICAgIC8vIEJSVCBtYWtlIHN1cmUgdGhlIHNwZWNpZmljIHBsdWdpbiBpcyBiZWluZyB1c2VkIGhlcmUgdG8gZmluZCBpdHMgT1dOIGljb25zCi0gICAgICAgICAgICAgICAgVVJMIHVybCA9IHRoZVBsdWdpbl8uZmluZChwYXRoKTsKLSAgICAgICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotICAgICAgICAgICAgICAgIGltZyA9IGlkLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiAqKioqKiBjcmVhdGVkIGltYWdlIGZvciAiICsgaWNvbk5hbWVfKTsKLSAgICAgICAgICAgICAgICBpY29uSGFzaC5wdXQoaWNvbk5hbWVfLCBpbWcpOy8vIHNhdmUgZm9yIHJldXNlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW1nOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiQVRWLlZpZXdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsgZGlzcG9zZSBvZiBpY29uIGltYWdlcyIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaWNvbkhhc2gudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2UgaW1nID0gKEltYWdlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpbWcuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRGV0ZXJtaW5lIHRoZSB0ZXh0IHRvIGdvIGluIGVhY2ggY29sdW1uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gb2JqIHRoZSBNYXJrZXIgKHdlIGhvcGUpIHRoYXQgZ29lcyBvbiB0aGUgY3VycmVudCByb3cKLSAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB0YWJsZQotICAgICAgICAgKiAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQVRWOiBMYWJlbFByb3Ygb2JqIGlzIG51bGw7IGluZGV4PSIgKyBpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJBVFYgb2JqIG51bGwiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQcm9ibGVtTWFya2VyQXR0cklkcy5ERVNDUklQVElPTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFByb2JsZW1NYXJrZXJBdHRySWRzLlJFU09VUkNFKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUHJvYmxlbU1hcmtlckF0dHJJZHMuSU5GT0xERVIpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKChQcm9ibGVtTWFya2VyQXR0cklkcy5MT0NBVElPTikpKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKCJWaWV3TGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0IGVycm9yOiAiK2NlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JfQotCWNsYXNzIE5hbWVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCX0KLQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJT3Blbk1QUHJvYmxlbXNWaWV3LnRoaXMuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQkJfQotCQl9KTsKLQkJTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb250cmlidXRlVG9BY3Rpb25CYXJzKCkgewotCQlJQWN0aW9uQmFycyBiYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWZpbGxMb2NhbFB1bGxEb3duKGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWZpbGxMb2NhbFRvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsUHVsbERvd24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWN0aW9uMSk7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCS8vbWFuYWdlci5hZGQoYWN0aW9uMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChhY3Rpb24xKTsKLQkJLy9tYW5hZ2VyLmFkZChhY3Rpb24yKTsKLQkJLy8gT3RoZXIgcGx1Zy1pbnMgY2FuIGNvbnRyaWJ1dGUgdGhlcmUgYWN0aW9ucyBoZXJlCi0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWN0aW9uMSk7Ci0JCW1hbmFnZXIuYWRkKHJlbW92ZU1hcmtlckFjdGlvbik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0gICAgICAgIC8vbWFrZVNob3dJbmZvQWN0aW9uKCk7Ci0JCWFjdGlvbjEgPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNob3dNZXNzYWdlKCJBY3Rpb24gMSBleGVjdXRlZCIpOwotCQkJfQotCQl9OwotCQlhY3Rpb24xLnNldFRleHQoIkFjdGlvbiAxIik7Ci0JCWFjdGlvbjEuc2V0VG9vbFRpcFRleHQoIkFjdGlvbiAxIHRvb2x0aXAiKTsKLQkJYWN0aW9uMS5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KLQkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7Ci0gICAgICAgIAotICAgICAgICBkb3VibGVDbGlja0FjdGlvbiA9IG5ldyBHb3RvTGluZUFjdGlvbih0aGlzLCB2aWV3ZXIpOwotICAgICAgICBtYWtlUmVtb3ZlTWFya2VyQWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb3VibGVDbGlja0FjdGlvbigpIHsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyoqCi0JICogTWFrZSAicmVtb3ZlIG1hcmtlciIgYWN0aW9uIHRvIGRpc3BsYXkgYXJ0aWZhY3QgaW5mb3JtYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlUmVtb3ZlTWFya2VyQWN0aW9uKCkgewotCQlyZW1vdmVNYXJrZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIGJhdGNoIGNoYW5nZXMgc28gd2UgZ2V0IG9ubHkgb25lIHJlc291cmNlIGNoYW5nZSBldmVudAotCQkJCWZpbmFsIElXb3Jrc3BhY2VSb290IHdzUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCQotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKXsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQl0cnkgewotCQkJCQkJaW50IGRlcHRoID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCQkJCQkJd3NSZXNvdXJjZS5kZWxldGVNYXJrZXJzKG1hcmtlcklEXyxmYWxzZSxkZXB0aCk7Ci0JCQkJCQlpZih0cmFjZU9uKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWFya2VycyByZW1vdmVkIGlkPSIrbWFya2VySURfKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJNOiBleGNlcHRpb24gZGVsZXRpbmcgbWFya2Vycy4iKTsKLQkJCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJfX07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlydW5uYWJsZS5ydW4obnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCi0JCQkJIAotCQkJfS8vZW5kIHJ1bigpCi0JCX07Ly8gZW5kIG5ldyBhY3Rpb24KLQkJcmVtb3ZlTWFya2VyQWN0aW9uLnNldFRleHQoIlJlbW92ZSBNYXJrZXJzIik7Ci0JCXJlbW92ZU1hcmtlckFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVtb3ZlIGFsbCBtYXJrZXJzIik7Ci0JCXJlbW92ZU1hcmtlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOy8vIG5pY2UgInJlZCBYIiBpbWFnZQotCi0JfQotCXByaXZhdGUgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLQkJCSJTYW1wbGUgVmlldyIsCi0JCQltZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotICAgIAotCi0gICAgLyoqCi0gICAgICogVmlzaXQgdGhlIHJlc291cmNlIGRlbHRhIHRvIGxvb2sgZm9yIHRoZSBtYXJrZXIgY2hhbmdlcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotICAgICAqIAotICAgICAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBVcGRhdGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yCi0gICAgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBWaXNpdCBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgcmVzb3VyY2UgZGVsdGEgdG8gZmluZCB0aGUgbWFya2VycyB0aGF0IGNoYW5nZWQgdGhhdCB3ZSBjYXJlIGFib3V0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIC8vU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKHRyYWNlT24pIFN5c3RlbS5vdXQucHJpbnRsbigiVXBkYXRlVmlzaXRvcjogZmlsZSBjaGFuZ2VkOiAiICsgbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGZpbGUgY2hhbmdlcyAoc2F2ZXMpIGJ5IHJlcG9ydGluZyB0aGUgY2hhbmdlcwotICAgICAgICAgICAgICAgICAgICAvLyBtYWRlIHRvIHRoZSBmaWxlLCB0byB1cGRhdGUgYmFja2VuZCBhbmFseXNpcwotICAgICAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbgotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmID0gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRlbnRDaGFuZ2VkID0gZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEZvckFuYWx5c2lzKGYuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlT24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlICIgKyBmLmdldE5hbWUoKSArICIgaXMgdmFsaWQgZm9yIGFuYWx5c2lzIHNvIHdpbGwgcHJvY2VzcyB0aGUgY2hhbmdlLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudENoYW5nZWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gdGVsbCBiYWNrIGVuZCAoYW5hbHlzaXMgZW5naW5lKSB0aGF0IGZpbGUgY2hhbmdlZD8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCBtYXJrZXJzIGZvciB0aGF0IGZpbGU/Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyRGVsdGFbXSBtRGVsdGFzID0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gbURlbHRhcy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlckRlbHRhIGRlbHRhMyA9IG1EZWx0YXNbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlT24pIHNob3dNYXJrZXJEZWx0YUtpbmQoZGVsdGEzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyIG0gPSBkZWx0YTMuZ2V0TWFya2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxuID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VPbikgU3lzdGVtLm91dC5wcmludGxuKCItLS1VcGRhdGVWaXNpdG9yLnZpc2l0KCk6dmlld2VyIHVwZGF0ZSBtYXJrZXI6IChsaW5lTm8pIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvd01hcmtlcihtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9wcyA9IG5ldyBTdHJpbmdbMV07IC8vIGF3a3dhcmQuIHdoeT8/PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzWzBdID0gbG47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB1cGRhdGUgdmlld2VyIGl0ZW0sIG5vdCB0aGUgd2hvbGUgdmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2VyLnVwZGF0ZShtLCBwcm9wcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBsb29wCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VPbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgIiArIGYuZ2V0TmFtZSgpICsgIiBpcyBOT1QgdmFsaWQgZm9yIGFuYWx5c2lzIHNvIHdpbGwgaWdub3JlIGNoYW5nZS4uLiIpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiBDSEFOR0VECi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBhZGRlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tNYXJrZXJEZWx0YXMoZGVsdGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSByZXBsYWNlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tNYXJrZXJEZWx0YXMoZGVsdGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIHJlbW92ZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrTWFya2VyRGVsdGFzKGRlbHRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZCBpZiBGSUxFCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8ga2VlcCBnb2luZwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWFya2VyRGVsdGFzKElSZXNvdXJjZURlbHRhIGRlbHRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTWFya2VyRGVsdGFbXSBtZDEgPSBkZWx0YS5nZXRNYXJrZXJEZWx0YXMoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBtZDEubGVuZ3RoOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAuLi4gZm91bmQgIiArIGxlbiArICIgbWFya2VyRGVsdGFzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3cgaW5mbyBhYm91dCB0aGUgbWFya2VyIGluIHRoZSBtYXJrZXIgZGVsdGEuIFRoaXMgaXMganVzdCB0cmFjaW5nIHRoZSBpbmZvIGF2YWlsYWJsZSB1bnRpbCB3ZSBkbyBzb21ldGhpbmcKLSAgICAgICAgICogd2l0aCBpdC4gRm9yIG5vdywgd2UncmUganVzdCBkb2luZyBhIChiaWcpIHZpZXdlci5yZWZyZXNoKCkgdG8gcmVmcmVzaCBhbGwgdGhlIG1hcmtlcnMuIFdoZW4gd2UgZ2V0IG1vcmUKLSAgICAgICAgICogaW50ZWxsaWdlbnQgYWJvdXQganVzdCB1cGRhdGluZyB0aGUgb25lcyB0aGF0IGNoYW5nZWQsIHdlIGNhbiByZW1vdmUgdGhhdC4gU2hvdWxkbid0IG1ha2UgbXVjaCBkaWZmZXJlbnQgZm9yCi0gICAgICAgICAqIHNtYWxsIHNldHMgb2YgbWFya2VycywgYnV0IGZvciBtYW55IG1hcmtlcnMsIHRoaXMgY291bGQgYmUgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YTMKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBzaG93TWFya2VyRGVsdGFLaW5kKElNYXJrZXJEZWx0YSBkZWx0YTMpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgU3RyaW5nIG1pZCA9ICIiLCBtbCA9ICIiLCBtbHBpID0gIiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIG5vdGU6IHdlJ3JlIGdldHRpbmcgbWFya2VyIGRlbHRhcyBvbiBBTEwgbWFya2VycywKLSAgICAgICAgICAgICAgICAvLyBub3QganVzdCBhcnRpZmFjdCBtYXJrZXJzLCB3aGljaCBjYW4gdGhyb3cgdXMgb2ZmLgotICAgICAgICAgICAgICAgIC8vIGluIHBhcnRpY3VsYXIsIHRlbXAgbWFya2VycyB1c2VkIGJ5IGFjdGlvbnM/Ci0KLSAgICAgICAgICAgICAgICAvL21pZCA9IG0uZ2V0QXR0cmlidXRlKHVuaXF1ZUlEXykudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvL21sID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUikudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvL21scGkgPSBtLmdldEF0dHJpYnV0ZShJRHMuTElORSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnM7IG9ubHkgdHJhY2luZyBmb3Igbm93LgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQVRWLlVwZGF0ZVZpc2l0b3IgZXJyb3IgZ2V0dGluZyBtYXJrZXIgaW5mbyAiKTsKLSAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0cmFjZU9uKSBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBtYXJrZXJJRF89IiArIG1pZCArICIgIGxpbmVObyhta3ItbXBpQSk9IiArIG1sICsgIi0iICsgbWxwaSk7Ci0gICAgICAgIH0KLQotICAgIH0gLy8gZW5kIGNsYXNzIFVwZGF0ZVZpc2l0b3IKLSAgICAKLSAgICAKLSAgICAvLyBBY3Rpb24gZm9yIGRibGNsaWNrIGFuZCBnbyB0byBsaW5lCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHb3RvTGluZUFjdGlvbiBleHRlbmRzIEFjdGlvbgotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkICAgVmlld1BhcnQgICB2aWV3UGFydF8gPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgICBWaWV3ZXIgICAgIHZpZXdlcl8gICA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgR290b0xpbmVBY3Rpb24oVmlld1BhcnQgdmlld1BhcnQsIFZpZXdlciB2aWV3ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZXdQYXJ0XyA9IHZpZXdQYXJ0OwotICAgICAgICAgICAgdmlld2VyXyAgID0gdmlld2VyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgb2JqOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPcGVuTVBFcnJvciBlcnJvciA9IChPcGVuTVBFcnJvciltYXJrZXIuZ2V0QXR0cmlidXRlKFByb2JsZW1NYXJrZXJBdHRySWRzLlBST0JMRU1PQkpFQ1QpOwotICAgICAgICAgICAgICAgIGlmIChlcnJvcj09bnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGVycm9yLmdldFBhdGgoKSsiLyIrZXJyb3IuZ2V0RmlsZW5hbWUoKTsgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSVJlc291cmNlIHIgPSBQYXJzZXJVdGlsLmdldFJlc291cmNlRm9yRmlsZW5hbWUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIElGaWxlICAgICBmID0gKHIgaW5zdGFuY2VvZiBJRmlsZSA/IChJRmlsZSlyIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGY9PW51bGwpICByZXR1cm47Ci0gICAgICAgICAgICAgICAgLy8gSUZpbGUgZmFrZWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmcXN0cikpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdicCA9IHZpZXdQYXJ0Xy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHdicCwgZik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nICAgICAgbWFya2VySUQgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZS50ZXh0bWFya2VyIjsKLSAgICAgICAgICAgICAgICBJTWFya2VyICAgICBtYXJrZXIxID0gZi5jcmVhdGVNYXJrZXIobWFya2VySUQpOwotICAgICAgICAgICAgICAgIG1hcmtlcjEuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIGVycm9yLmdldExpbmVubygpKTsKLSAgICAgICAgICAgICAgICBtYXJrZXIxLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBJREUuZ290b01hcmtlcihlZGl0b3IsIG1hcmtlcjEpOwotICAgICAgICAgICAgICAgIG1hcmtlcjEuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkge2UucHJpbnRTdGFja1RyYWNlKCk7fQotICAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvdWkvcHYvdmlld3MvUHJvYmxlbU1hcmtlckF0dHJJZHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2L3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9vcGVubXAvdWkvcHYvdmlld3MvUHJvYmxlbU1hcmtlckF0dHJJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3MWQ5Yi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC51aS5wdi9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvb3Blbm1wL3VpL3B2L3ZpZXdzL1Byb2JsZW1NYXJrZXJBdHRySWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDcgSUJNIENvcnAuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3JwLiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYudmlld3M7Ci0KLQotLyoqCi0gKiBJRHMgZm9yIE9wZW5NUCBwcm9ibGVtIG1hcmtlcnMKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1NYXJrZXJBdHRySWRzCi17Ci0gICAgCi0gICAgLyoqIGlkZW50aWZpZXMgdGhlIE9wZW5NUCBFcnJvciBtYXJrZXIgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfRVJST1JfSUQgICAgICAgPSAib3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2Lm9wZW5NUFByb2JsZW1NYXJrZXIiOwotIAotICAgIAotICAgIC8qKiBNYXJrZXIgaWQgZm9yIHN0b3JhZ2Ugb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXJ0aWZhY3QgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgIERFU0NSSVBUSU9OICAgICAgICA9ICJkZXNjcmlwdGlvbiI7Ci0gICAgLyoqIE1hcmtlciBJRCBmb3Igc3RvcmFnZSBvZiB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdGhlIGFydGlmYWN0IGlzIGZvdW5kICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgICBSRVNPVVJDRSAgICAgICAgICAgPSAicmVzb3VyY2UiOwotICAgIC8qKiBNYXJrZXIgSUQgZm9yIGZvbGRlciBpbiB3aGljaCBhcnRpZmFjdCBpcyBmb3VuZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nICAgSU5GT0xERVIgICAgICAgICAgID0gImluZm9sZGVybmFtZSI7Ci0gICAgLyoqIE1hcmtlciBJRCBmb3IgbG9jYXRpb24gKGxpbmUgbnVtYmVyKSBpbiB3aGljaCB0aGUgYXJ0aWZhY3QgaXMgZm91bmQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgIExPQ0FUSU9OICAgICAgICAgICA9ICJsb2NhdGlvbiI7Ci0gICAgLyoqIE1hcmtlciBJRCB0aGF0IGhvbGRzIHRoZSBwcm9ibGVtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgICBQUk9CTEVNT0JKRUNUICAgICAgPSAicHJvYmxlbSI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLy5jbGFzc3BhdGggYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY3ZzaWdub3JlIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOGRkMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWljb25zLW9sZApkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvLnByb2plY3QgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0OTM2Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ0YTA5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogVVBDIHN1cHBvcnQgZm9yIFBMRFQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IElCTSBSZXNlYXJjaAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24sCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS5jZHQuZG9jLnVzZXIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLnVwYztidW5kbGUtdmVyc2lvbj0iNS4wLjAiCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzJjNjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX01ZVEhSRUFELmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX01ZVEhSRUFELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzIyMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC9pZF9NWVRIUkVBRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPGgyPjxjb2RlPk1ZVEhSRUFEPC9jb2RlPiBrZXl3b3JkPC9oMj4KLQotCi08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT5NWVRIUkVBRDwvY29kZT4gIGlzIGFuIGV4cHJlc3Npb24gd2l0aCBhIHZhbHVlIG9mIHR5cGUgaW50OyBpdCBzcGVjaWZpZXMgdGhlIHVuaXF1ZQotdGhyZWFkIGluZGV4LiAKLTxicj5UaGUgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzIGlzIDxjb2RlPjAuLlRIUkVBRFMtMTY8L2NvZGU+LgotPGg0PkV4YW1wbGU8L2g0PgotPHA+VGhlIGZvbGxvd2luZyBwcm9ncmFtIHByaW50cyB0aGUgbnVtYmVycyAwCi10aHJvdWdoIDxjb2RlPlRIUkVBRFMtMTwvY29kZT4sIGluIHNvbWUgb3JkZXIuCi08cHJlPgotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBtYWluKCl7IAotICAgICAgcHJpbnRmKCIlZCAiLE1ZVEhSRUFEKTsgCi0gICAgfQotPC9wcmU+Ci08cD5TZWUgYWxzbyA8YSBocmVmPSJpZF9USFJFQURTLmh0bWwiPjxjb2RlPlRIUkVBRFM8L2NvZGU+PC9hPiwKLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX1RIUkVBRFMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVEhSRUFEUy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAwMzgzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVEhSRUFEUy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPGgyPjxjb2RlPjxjb2RlPlRIUkVBRFM8L2NvZGU+PC9jb2RlPiBrZXl3b3JkPC9oMj4KLQotCi08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT5USFJFQURTPC9jb2RlPiBpcyBhbiBleHByZXNzaW9uIHdpdGggYSB2YWx1ZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT47IGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCi10aHJlYWRzIGFuZCBoYXMgdGhlIHNhbWUgdmFsdWUgb24gZXZlcnkgdGhyZWFkLiBVbmRlciB0aGUgc3RhdGljIDxjb2RlPlRIUkVBRFM8L2NvZGU+Ci10cmFuc2xhdGlvbiBlbnZpcm9ubWVudCwgPGNvZGU+VEhSRUFEUzwvY29kZT4gaXMgYW4gPGNvZGU+aW50PC9jb2RlPmVnZXIgY29uc3RhbnQgc3VpdGFibGUgZm9yIHVzZSBpbgotI2lmIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcy4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVVBDX01BWF9CTE9DS19TSVpFLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX1VQQ19NQVhfQkxPQ0tfU0laRS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTFmNTljLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVVBDX01BWF9CTE9DS19TSVpFLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08aDI+PGNvZGU+VVBDX01BWF9CTE9DS19TSVpFPC9jb2RlPiBpZGVudGlmaWVyPC9oMj4KLQotCi08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT5VUENfTUFYX0JMT0NLX1NJWkU8L2NvZGU+ICBpcyBhIHByZWRlZmluZWQgaW50ZWdlciBjb25zdGFudCB2YWx1ZS4gSXQgaW5kaWNhdGVzIHRoZQotbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGluIGEgbGF5b3V0IHF1YWxpZmllciBmb3Igc2hhcmVkIGRhdGEuIEl0IHNoYWxsIGJlCi1zdWl0YWJsZSBmb3IgdXNlIGluIDxjb2RlPiNpZjwvY29kZT4gcHJlcHJvY2Vzc2luZyBkaXJlY3RpdmVzLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaW5kZXguaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiYjQ3Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08aDIgaWQ9InRvcCI+VVBDIFN0YXRlbWVudHM8L2gyPgotPHVsPgotPGxpPjxhIGhyZWY9ImtleXdvcmRzLmh0bWwiPktleXdvcmRzL0lkZW50aWZpZXJzPC9hPgotPGxpPjxhIGhyZWY9ImtleXdvcmRzLmh0bWwiPktleXdvcmRzPC9hPgotCi08L3VsPgotPGgyIGlkPSJ0b3AiPlVQQyBmdW5jdGlvbnM8L2gyPgotPHA+VGVybWluYXRpb24gb2YgYWxsIHRocmVhZHMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfZ2xvYmFsX2V4aXQuaHRtbCI+IDxjb2RlPnVwY19nbG9iYWxfZXhpdDwvY29kZT4gPC9hPgotPC91bD4KLTxwPlNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfZ2xvYmFsX2FsbG9jLmh0bWwiPiA8Y29kZT51cGNfZ2xvYmFsX2FsbG9jPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2FsbF9hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2FsbF9hbGxvYzwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2FsbG9jPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2xvY2FsX2FsbG9jLmh0bWwiPiA8Y29kZT51cGNfbG9jYWxfYWxsb2M8L2NvZGU+IDwvYT4gIDxpPmRlcHJlY2F0ZWQ8L2k+Ci08bGk+PGEgaHJlZj0idXBjX2ZyZWUuaHRtbCI+IDxjb2RlPnVwY19mcmVlPC9jb2RlPiA8L2E+Ci08L3VsPgotCi08cD5Qb2ludGVyLXRvLXNoYXJlZCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zCi08dWw+Ci08bGk+PGEgaHJlZj0idXBjX3RocmVhZG9mLmh0bWwiPiA8Y29kZT51cGNfdGhyZWFkb2Y8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfcGhhc2VvZi5odG1sIj4gPGNvZGU+dXBjX3BoYXNlb2Y8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfcmVzZXRwaGFzZS5odG1sIj4gPGNvZGU+dXBjX3Jlc2V0cGhhc2U8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfYWRkcmZpZWxkLmh0bWwiPiA8Y29kZT51cGNfYWRkcmZpZWxkPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2FmZmluaXR5c2l6ZS5odG1sIj4gPGNvZGU+dXBjX2FmZmluaXR5c2l6ZTwvY29kZT4gPC9hPgotPC91bD4KLQotPHA+TG9jayBmdW5jdGlvbnMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfbG9ja190Lmh0bWwiPiA8Y29kZT51cGNfbG9ja190PC9jb2RlPiA8L2E+ICZuYnNwOyB0eXBlIAotPGxpPjxhIGhyZWY9InVwY19nbG9iYWxfbG9ja19hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2dsb2JhbF9sb2NrX2FsbG9jPC9jb2RlPiAgPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfbG9ja19hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2FsbF9sb2NrX2FsbG9jPC9jb2RlPiAgPC9hPgotPGxpPjxhIGhyZWY9InVwY19sb2NrX2ZyZWUuaHRtbCI+IDxjb2RlPnVwY19sb2NrX2ZyZWU8L2NvZGU+ICA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2xvY2suaHRtbCI+IDxjb2RlPnVwY19sb2NrPC9jb2RlPiAgPC9hPgotPGxpPjxhIGhyZWY9InVwY19sb2NrX2F0dGVtcHQuaHRtbCI+IDxjb2RlPnVwY19sb2NrX2F0dGVtcHQ8L2NvZGU+ICA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX3VubG9jay5odG1sIj4gPGNvZGU+dXBjX3VubG9jazwvY29kZT4gIDwvYT4KLTwvdWw+Ci0KLTxwPlNoYXJlZCBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zCi08dWw+Ci08bGk+PGEgaHJlZj0idXBjX21lbWNweS5odG1sIj4gPGNvZGU+dXBjX21lbWNweTwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19tZW1nZXQuaHRtbCI+IDxjb2RlPnVwY19tZW1nZXQ8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfbWVtY3B5Lmh0bWwiPiA8Y29kZT51cGNfbWVtY3B5PC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX21lbXNldC5odG1sIj4gPGNvZGU+dXBjX21lbXNldDwvY29kZT4gPC9hPgotPC91bD4KLQotPHA+Q29sbGVjdGl2ZSBVdGlsaXRpZXMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfYWxsX2Jyb2FkY2FzdC5odG1sIj4gPGNvZGU+dXBjX2FsbF9icm9hZGNhc3Q8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfYWxsX3NjYXR0ZXIuaHRtbCI+IDxjb2RlPnVwY19hbGxfc2NhdHRlcjwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfZ2F0aGVyLmh0bWwiPiA8Y29kZT51cGNfYWxsX2dhdGhlcjwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfZ2F0aGVyX2FsbC5odG1sIj4gPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2FsbF9leGNoYW5nZS5odG1sIj4gPGNvZGU+dXBjX2FsbF9leGNoYW5nZTwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfcGVybXV0ZS5odG1sIj4gPGNvZGU+dXBjX2FsbF9wZXJtdXRlPC9jb2RlPiA8L2E+Ci0KLTwvdWw+Ci08cD4KLVNlZSBhbHNvIDxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+Ci08cD4KLTxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwva2V5d29yZHMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwva2V5d29yZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMWFjMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2tleXdvcmRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08aDI+VVBDIEtleXdvcmRzL0lkZW50aWZpZXJzPC9oMj4KLTxjb2RlPgotPHVsPiAgICAKLTxsaT48YSBocmVmPSJpZF9NWVRIUkVBRC5odG1sIj5NWVRIUkVBRCAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9yZWxheGVkLmh0bWwiPnJlbGF4ZWQgICAgICAgPC9hPgotPGxpPjxhIGhyZWY9ImlkX3NoYXJlZC5odG1sIj5zaGFyZWQgICAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9zdHJpY3QuaHRtbCI+c3RyaWN0ICAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9USFJFQURTLmh0bWwiPlRIUkVBRFMgICAgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2JhcnJpZXIuaHRtbCI+dXBjX2JhcnJpZXIgICAgICAgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2Jsb2Nrc2l6ZW9mLmh0bWwiPnVwY19ibG9ja3NpemVvZiAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF91cGNfZWxlbXNpemVvZi5odG1sIj51cGNfZWxlbXNpemVvZiAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF91cGNfZmVuY2UuaHRtbCI+dXBjX2ZlbmNlICAgICAgICAgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2xvY2Fsc2l6ZW9mLmh0bWwiPnVwY19sb2NhbHNpemVvZiAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9VUENfTUFYX0JMT0NLU0laRS5odG1sIj5VUENfTUFYX0JMT0NLU0laRSAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF91cGNfbm90aWZ5Lmh0bWwiPnVwY19ub3RpZnkgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX3dhaXQuaHRtbCI+dXBjX3dhaXQgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2ZvcmFsbC5odG1sIj51cGNfZm9yYWxsICAgICAgICA8L2E+ICAgICAKLTwvdWw+Ci08L2NvZGU+Ci0KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3NoYXJlZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC9zaGFyZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZTM4ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3NoYXJlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPGgyPjxjb2RlPjxjb2RlPnNoYXJlZDwvY29kZT48L2NvZGU+IGtleXdvcmQ8L2gyPgotCi0KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLTxjb2RlPnNoYXJlZDwvY29kZT4gaW5kaWNhdGVzIGEgdmFyaWFibGUgaXMgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4KLTxwPgotPHByZT4KLXNoYXJlZCBpbnQgaTsKLXNoYXJlZCBbMl0gaW50IGFbMjAwXTsKLXN0cmljdCBzaGFyZWQgaW50IGk7Ci08L3ByZT4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdGVybXMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdGVybXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTI1MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3Rlcm1zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08aDQgaWQ9InRvcCI+VVBDIFRlcm1zLCBkZWZpbml0aW9ucyBhbmQgc3ltYm9sczwvaDQ+Ci08cD4KLUZvciB0aGUgcHVycG9zZSBvZiB0aGVzZSBzcGVjaWZpY2F0aW9ucyB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFwcGx5LgotCi08ZGw+Ci08ZHQ+PHN0cm9uZz48c3Ryb25nPnRocmVhZDwvc3Ryb25nPjwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hbiBpbnN0YW5jZSBvZiBleGVjdXRpb24gaW5pdGlhdGVkIGJ5IHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgYXQgcHJvZ3JhbQotc3RhcnR1cC48L2RkPgotCi08ZHQ+PHN0cm9uZz4gPC9zdHJvbmc+PC9kdD4KLTxkZD4gPC9kZD4KLQotPGR0PjxzdHJvbmc+b2JqZWN0PC9zdHJvbmc+PC9kdD4KLTxkZD4KLXJlZ2lvbiBvZiBkYXRhIHN0b3JhZ2UgaW4gdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB3aGljaCBjYW4gcmVwcmVzZW50Ci12YWx1ZXMuPC9kZD4KLQotPGR0PjxzdHJvbmc+c2hhcmVkIG9iamVjdCA8L3N0cm9uZz48L2R0PgotPGRkPgotYW4gb2JqZWN0IGFsbG9jYXRlZCB1c2luZyBhIHNoYXJlZC1xdWFsaWZpZWQgZGVjbGFyYXRvciBvciBieSBhIGxpYnJhcnkgZnVuY3Rpb24KLWRlZmluZWQgdG8gY3JlYXRlIHNoYXJlZCBvYmplY3RzLiAKLTxwPk5vdGU6IAotQWxsIHRocmVhZHMgbWF5IGFjY2VzcyBzaGFyZWQgb2JqZWN0cy48L2RkPgotCi08ZHQ+PHN0cm9uZz5wcml2YXRlIG9iamVjdDwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hbnkgb2JqZWN0IHdoaWNoIGlzIG5vdCBhIHNoYXJlZCBvYmplY3QuCi08cD5Ob3RlOiBFYWNoIHRocmVhZCBkZWNsYXJlcyBhbmQgY3JlYXRlcyBpdHMgb3duIHByaXZhdGUgb2JqZWN0cyB3aGljaCBubwotb3RoZXIgdGhyZWFkIGNhbiBhY2Nlc3MuPC9kZD4KLTxkdD48c3Ryb25nPiBzaGFyZWQgYXJyYXk8L3N0cm9uZz48L2R0PgotPGRkPgotYW4gYXJyYXkgd2l0aCBlbGVtZW50cyB0aGF0IGhhdmUgc2hhcmVkIHF1YWxpZmllZCB0eXBlLgotPC9kZD4KLTxkdD48c3Ryb25nPmFmZmluaXR5PC9zdHJvbmc+PC9kdD4KLTxkZD4KLWxvZ2ljYWwgYXNzb2NpYXRpb24gYmV0d2VlbiBzaGFyZWQgb2JqZWN0cyBhbmQgdGhyZWFkcy4gRWFjaCBlbGVtZW50IG9mIGRhdGEKLXN0b3JhZ2UgdGhhdCBjb250YWlucyBzaGFyZWQgb2JqZWN0cyBoYXMgYWZmaW5pdHkgdG8gZXhhY3RseSBvbmUgdGhyZWFkLgotPC9kZD4KLTxkdD48c3Ryb25nPnBvaW50ZXItdG8tc2hhcmVkPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWEgcG9pbnRlciB3aG9zZSByZWZlcmVuY2VkIHR5cGUgaXMgc2hhcmVkLXF1YWxpZmllZC4KLTwvZGQ+Ci08ZHQ+PHN0cm9uZz4gcG9pbnRlci10by1sb2NhbDwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHBvaW50ZXIgd2hvc2UgcmVmZXJlbmNlZCB0eXBlIGlzIG5vdCBzaGFyZWQtcXVhbGlmaWVkLgotPC9kZD4KLTxkdD48c3Ryb25nPmFjY2Vzczwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci0mbHQ7ZXhlY3V0aW9uLXRpbWUgYWN0aW9uJmd0OyB0byByZWFkIG9yIG1vZGlmeSB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGJ5IGEgdGhyZWFkLgotPHA+VGhlIGZpbGUgc2NvcGUgZGVjbGFyYXRpb24gaW50IHk7IGNyZWF0ZXMgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIGVhY2ggdGhyZWFkIHRvIGFjY2Vzcy4KLTwvZGQ+Ci08ZHQ+PHN0cm9uZz5zaGFyZWQgYWNjZXNzPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIGFjY2VzcyB1c2luZyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgc2hhcmVkLXF1YWxpZmllZC48L2RkPgotPGR0PjxzdHJvbmc+IHN0cmljdCBzaGFyZWQgcmVhZDwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHNoYXJlZCByZWFkIGFjY2VzcyB3aGljaCBpcyBkZXRlcm1pbmVkIHRvIGJlIHN0cmljdC48L2RkPgotPGR0PjxzdHJvbmc+c3RyaWN0IHNoYXJlZCB3cml0ZTwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHNoYXJlZCBtb2RpZnkgYWNjZXNzIHdoaWNoIGlzIGRldGVybWluZWQgdG8gYmUgc3RyaWN0IDwvZGQ+Ci08ZHQ+PHN0cm9uZz5yZWxheGVkIHNoYXJlZCByZWFkPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWEgc2hhcmVkIHJlYWQgYWNjZXNzIHdoaWNoIGlzIGRldGVybWluZWQgdG8gYmUgcmVsYXhlZDwvZGQ+Ci08ZHQ+PHN0cm9uZz5yZWxheGVkIHNoYXJlZCB3cml0ZTwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHNoYXJlZCBtb2RpZnkgYWNjZXNzIHdoaWNoIGlzIGRldGVybWluZWQgdG8gYmUgcmVsYXhlZCA8L2RkPgotPGR0PjxzdHJvbmc+bG9jYWwgYWNjZXNzPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIGFjY2VzcyB1c2luZyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgbm90IHNoYXJlZC1xdWFsaWZpZWQuCi08L2RkPgotPGR0PjxzdHJvbmc+Y29sbGVjdGl2ZTwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIGNvbnN0cmFpbnQgcGxhY2VkIG9uIHNvbWUgbGFuZ3VhZ2Ugb3BlcmF0aW9ucyB3aGljaCByZXF1aXJlcyBldmFsdWF0aW9uCi1vZiBzdWNoIG9wZXJhdGlvbnMgdG8gYmUgbWF0Y2hlZCBhY3Jvc3MgYWxsIHRocmVhZHMuIFRoZSBiZWhhdmlvciBvZiBjb2xsZWN0aXZlCi1vcGVyYXRpb25zIGlzIHVuZGVmaW5lZCB1bmxlc3MgYWxsIHRocmVhZHMgZXhlY3V0ZSB0aGUgc2FtZSBzZXF1ZW5jZSBvZgotY29sbGVjdGl2ZSBvcGVyYXRpb25zLjwvZGQ+Ci08ZHQ+PHN0cm9uZz5zaW5nbGUtdmFsdWVkPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIG9wZXJhbmQgdG8gYSBjb2xsZWN0aXZlIG9wZXJhdGlvbiwgd2hpY2ggaGFzIHRoZSBzYW1lIHZhbHVlIG9uIGV2ZXJ5Ci10aHJlYWQuIFRoZSBiZWhhdmlvciBvZiB0aGUgb3BlcmF0aW9uIGlzIG90aGVyd2lzZSB1bmRlZmluZWQuPC9kZD4KLTxkdD48c3Ryb25nPnBoYXNlPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIHVuc2lnbmVkIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcG9pbnRlci10by1zaGFyZWQgd2hpY2ggaW5kaWNhdGVzCi10aGUgZWxlbWVudC1vZmZzZXQgd2l0aGluIGFuIGFmZmluaXR5IGJsb2NrOyB1c2VkIGluIHBvaW50ZXItdG8tc2hhcmVkCi1hcml0aG1ldGljIHRvIGRldGVybWluZSBhZmZpbml0eSBib3VuZGFyaWVzPC9kZD4KLTwvZGw+Ci08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gIHRvcDwvYT4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWRkcmZpZWxkLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hZGRyZmllbGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxMzNlNjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWRkcmZpZWxkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19hZGRyZmllbGQ8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaXplX3QgdXBjX2FkZHJmaWVsZChzaGFyZWQgdm9pZCAqcHRyKTsgICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSA8Y29kZT51cGNfYWRkcmZpZWxkIDwvY29kZT4gIGZ1bmN0aW9uIHJldHVybnMgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZSByZWZsZWN0aW5nCi10aGUgPHE+bG9jYWwgYWRkcmVzczwvcT5vZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXItdG8tc2hhcmVkCi1hcmd1bWVudC4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FmZmluaXR5c2l6ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWZmaW5pdHlzaXplLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmI4MWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWZmaW5pdHlzaXplLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19hZmZpbml0eXNpemU8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaXplX3QgdXBjX2FmZmluaXR5c2l6ZShzaXplX3QgdG90YWxzaXplLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aHJlYWRpZCk7ICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSA8Y29kZT51cGNfYWZmaW5pdHlzaXplIDwvY29kZT4gIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyB0aGUgZXhhY3Qgc2l6ZQotb2YgdGhlIGxvY2FsIHBvcnRpb24gb2YgdGhlIGRhdGEgaW4gYSBzaGFyZWQgb2JqZWN0IHdpdGggYWZmaW5pdHkgdG8gPGNvZGU+dGhyZWFkaWQ8L2NvZGU+LgotPHA+SW4gdGhlIGNhc2Ugb2YgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc2hhcmVkIG9iamVjdCwgdGhlIDxjb2RlPnRvdGFsc2l6ZTwvY29kZT4gYXJndW1lbnQKLXNoYWxsIGJlIDxjb2RlPm5ieXRlcypuYmxvY2tzPC9jb2RlPiBhbmQgdGhlIDxjb2RlPm5ieXRlczwvY29kZT4gYXJndW1lbnQgc2hhbGwgYmUgPGNvZGU+bmJ5dGVzPC9jb2RlPiwKLXdoZXJlIDxjb2RlPm5ibG9ja3M8L2NvZGU+IGFuZCA8Y29kZT5uYnl0ZXM8L2NvZGU+IGFyZSBleGFjdGx5IGFzIHBhc3NlZCB0byA8Y29kZT51cGNfZ2xvYmFsX2FsbG9jPC9jb2RlPiBvcgotPGNvZGU+dXBjX2FsbF9hbGxvYzwvY29kZT4gd2hlbiB0aGUgb2JqZWN0IHdhcyBhbGxvY2F0ZWQuCi08cD5JbiB0aGUgY2FzZSBvZiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHNoYXJlZCBvYmplY3Qgd2l0aCBkZWNsYXJhdGlvbjoKLTxwcmU+Ci0gICBzaGFyZWQgW2JdIHQgZFtzXTsKLSAgIDwvcHJlPgotdGhlIDxjb2RlPnRvdGFsc2l6ZTwvY29kZT4gYXJndW1lbnQgc2hhbGwgYmUgPGNvZGU+cyAqIHNpemVvZih0KTwvY29kZT4gYW5kIHRoZSA8Y29kZT5uYnl0ZXM8L2NvZGU+IGFyZ3VtZW50Ci1zaGFsbCBiZSA8Y29kZT5iICogc2l6ZW9mKHQpPC9jb2RlPi4gSWYgdGhlIGJsb2NrIHNpemUgaXMgaW5kZWZpbml0ZSwgPGNvZGU+bmJ5dGVzPC9jb2RlPiBzaGFsbCBiZSAwLgotPHA+PGNvZGU+dGhyZWFkaWQ8L2NvZGU+IHNoYWxsIGJlIGEgdmFsdWUgaW4gPGNvZGU+MC4uKFRIUkVBRFMtMSk8L2NvZGU+LgotCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2FsbG9jLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfYWxsb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiMDk0My4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19hbGxfYWxsb2M8L2NvZGU+ICAgICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHNoYXJlZCB2b2lkICp1cGNfYWxsX2FsbG9jKHNpemVfdCBuYmxvY2tzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGVzKTsgICAKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2FsbG9jICAgPC9jb2RlPiBmdW5jdGlvbiBhbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIGNvbXBhdGlibGUgd2l0aCB0aGUgZm9sbG93aW5nCi1kZWNsYXJhdGlvbjoKLTxwPjxjb2RlPgotc2hhcmVkIFtuYnl0ZXNdIGNoYXJbbmJsb2NrcyAqIG5ieXRlc10uCi08L2NvZGU+PC9wPgotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbF9hbGxvYyAgIDwvY29kZT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBwb2ludGVyIHZhbHVlIG9uIGFsbCB0aHJlYWRzLgotSWYgbmJsb2NrcypuYnl0ZXMgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhIG51bGwgcG9pbnRlci10by1zaGFyZWQuCi08cD5UaGUgZHluYW1pYyBsaWZldGltZSBvZiBhbiBhbGxvY2F0ZWQgb2JqZWN0IGV4dGVuZHMgZnJvbSB0aGUgdGltZSBhbnkgdGhyZWFkCi1jb21wbGV0ZXMgdGhlIGNhbGwgdG8gPGNvZGU+dXBjX2FsbF9hbGxvYyAgIDwvY29kZT4gdW50aWwgYW55IHRocmVhZCBoYXMgZGVhbGxvY2F0ZWQgdGhlCi1vYmplY3QuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2Jyb2FkY2FzdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2Jyb2FkY2FzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQ5MDNjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbF9icm9hZGNhc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTxoMj5UaGUgPGNvZGU+dXBjX2FsbF9icm9hZGNhc3Q8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLTxwPkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfYnJvYWRjYXN0KHNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG5ieXRlcywgdXBjX2ZsYWdfdCBmbGFncyk7ICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2Jyb2FkY2FzdCA8L2NvZGU+ICBmdW5jdGlvbiAgCi1jb3BpZXMgYSBibG9jayBvZiBtZW1vcnkgd2l0aCBhZmZpbml0eSB0bwotYSBzaW5nbGUgdGhyZWFkIHRvIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeSBvbiBlYWNoIHRocmVhZC4gVGhlIG51bWJlciBvZgotYnl0ZXMgaW4gZWFjaCBibG9jayBpcyA8Y29kZT5uYnl0ZXM8L2NvZGU+LgotPHA+PGNvZGU+bmJ5dGVzPC9jb2RlPiBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLgotPHA+PGNvZGU+dXBjX2FsbF9icm9hZGNhc3QgPC9jb2RlPiBmdW5jdGlvbiB0cmVhdHMgdGhlIDxjb2RlPnNyYzwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEKLXNoYXJlZCBtZW1vcnkgYXJlYSB3aXRoIHRoZSB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW10gY2hhcltuYnl0ZXNdCi0gICAgPC9wcmU+Ci08cD5UaGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgZW50aXJlIGFycmF5IHBvaW50ZWQgdG8gYnkgPGNvZGU+c3JjPC9jb2RlPiB0byBlYWNoCi1ibG9jayBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIG9mIGEgc2hhcmVkIGFycmF5IDxjb2RlPmRzdDwvY29kZT4gd2l0aCB0aGUgdHlwZToKLTxwcmU+Ci0gICAgc2hhcmVkIFtuYnl0ZXNdIGNoYXJbbmJ5dGVzICogVEhSRUFEU10KLTwvcHJlPgotPHA+VGhlIHRhcmdldCBvZiB0aGUgPGNvZGU+ZHN0PC9jb2RlPiBwb2ludGVyIG11c3QgaGF2ZSBhZmZpbml0eSB0byB0aHJlYWQgMC4KLTxwPlRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIgaXMgdHJlYXRlZCBhcyBpZiBpdCBoYXMgcGhhc2UgMC4KLQotPHVsPgotPGxpPkVYQU1QTEUgMSBzaG93cyB1cGNfYWxsX2Jyb2FkY2FzdAotCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci1zaGFyZWQgaW50IEFbVEhSRUFEU107Ci1zaGFyZWQgaW50IEJbVEhSRUFEU107Ci0vLyBJbml0aWFsaXplIEEuCi11cGNfYmFycmllcjsKLXVwY19hbGxfYnJvYWRjYXN0KCBCLCAmQVsxXSwgc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICAgICAgVVBDX0lOX05PU1lOQyB8IFVQQ19PVVRfTk9TWU5DICk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotCi08bGk+RVhBTVBMRSAyOgotCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtdIGludCBBW05FTEVNU107Ci1zaGFyZWQgW05FTEVNU10gaW50IEJbTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2FsbF9icm9hZGNhc3QoIEIsIEEsIHNpemVvZihpbnQpKk5FTEVNUywKLSAgICAgICAgICAgICAgICAgICBVUENfSU5fQUxMU1lOQyB8IFVQQ19PVVRfQUxMU1lOQyApOwotPC9wcmU+Ci08bGk+RVhBTVBMRSAzIHNob3dzIDxjb2RlPihBWzNdLEFbNF0pPC9jb2RlPiBpcyBicm9hZGNhc3QgdG8gPGNvZGU+KEJbMF0sQlsxXSksIChCWzEwXSxCWzExXSksCi0oQlsyMF0sQlsyMV0pLCAuLi4sIChCW05FTEVNUyooVEhSRUFEUy0xKV0sQltORUxFTVMqKFRIUkVBRFMtMSkrMV0pLjwvY29kZT4KLQotPHByZT4KLSNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSNpbmNsdWRlICZsdDt1cGNfY29sbGVjdGl2ZS5oJmd0OwotI2RlZmluZSBORUxFTVMgMTAKLXNoYXJlZCBbTkVMRU1TXSBpbnQgQVtORUxFTVMqVEhSRUFEU107Ci1zaGFyZWQgW05FTEVNU10gaW50IEJbTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2JhcnJpZXI7Ci11cGNfYWxsX2Jyb2FkY2FzdCggQiwgJkFbM10sIHNpemVvZihpbnQpKjIsCi0gICAgICAgICAgICAgICAgICAgVVBDX0lOX05PU1lOQyB8IFVQQ19PVVRfTk9TWU5DICk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotPC91bD4KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2V4Y2hhbmdlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZXhjaGFuZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1MDMzOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZXhjaGFuZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTxoMj5UaGUgPGNvZGU+dXBjX2FsbF9leGNoYW5nZTwvY29kZT4gZnVuY3Rpb24gICAgIDwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0gICAgdm9pZCB1cGNfYWxsX2V4Y2hhbmdlKHNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzKTsgIAotICAgIDwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2V4Y2hhbmdlICAgPC9jb2RlPiBmdW5jdGlvbiAgIGNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkCi1tZW1vcnkgYXJlYSB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaiB0byB0aGUganRoIGJsb2NrIG9mIGEgc2hhcmVkIG1lbW9yeQotYXJlYSB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaS4gVGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIGlzCi08Y29kZT5uYnl0ZXM8L2NvZGU+LgotPHA+PGNvZGU+bmJ5dGVzPC9jb2RlPiBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLgotPHA+Ci08cD5UaGUgPGNvZGU+dXBjX2FsbF9leGNoYW5nZSAgIDwvY29kZT4gZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgYW5kIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIKLWFzIGlmIGVhY2ggcG9pbnRlZCB0byBhIHNoYXJlZCBtZW1vcnkgYXJlYSBvZiA8Y29kZT5uYnl0ZXMgKiBUSFJFQURTPC9jb2RlPgMgYnl0ZXMgb24gZWFjaAotdGhyZWFkIGFuZCB0aGVyZWZvcmUgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbbmJ5dGVzICogVEhSRUFEU10gY2hhcltuYnl0ZXMgKiBUSFJFQURTICogVEhSRUFEU10KLTwvcHJlPgotPHA+VGhlIHRhcmdldHMgb2YgdGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgbXVzdCBoYXZlIGFmZmluaXR5IHRvIHRocmVhZCAwLgotPHA+VGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYXZlIHBoYXNlIDAuCi08cD5Gb3IgZWFjaCBwYWlyIG9mIHRocmVhZHMgaSBhbmQgaiwgdGhlIGVmZmVjdCBpcyBlcXVpdmFsZW50IHRvIGNvcHlpbmcgdGhlIGl0aAotYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaiBwb2ludGVkIHRvIGJ5IDxjb2RlPnNyYzwvY29kZT4gdG8gdGhlCi1qdGggYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaSBwb2ludGVkIHRvIGJ5IDxjb2RlPmRzdDwvY29kZT4uCi08dWw+Ci08bGk+RVhBTVBMRSAxIDxjb2RlPnVwY19hbGxfZXhjaGFuZ2UgICA8L2NvZGU+IGZvciB0aGUgc3RhdGljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtORUxFTVMqVEhSRUFEU10gaW50IEFbVEhSRUFEU11bTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtORUxFTVMqVEhSRUFEU10gaW50IEJbVEhSRUFEU11bTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2JhcnJpZXI7Ci11cGNfYWxsX2V4Y2hhbmdlKCBCLCBBLCBORUxFTVMqc2l6ZW9mKGludCksCi1VUENfSU5fTk9TWU5DIHwgVVBDX09VVF9OT1NZTkMgKTsKLXVwY19iYXJyaWVyOwotPC9wcmU+Ci0KLTxsaT5FWEFNUExFIDIgPGNvZGU+dXBjX2FsbF9leGNoYW5nZSAgIDwvY29kZT4gZm9yIHRoZSBkeW5hbWljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIGludCAqQWRhdGEsICpCZGF0YTsKLXNoYXJlZCBbXSBpbnQgKm15QSwgKm15QjsKLWludCBpOwotCi1BZGF0YSA9IHVwY19hbGxfYWxsb2MoVEhSRUFEUypUSFJFQURTLCBORUxFTVMqc2l6ZW9mKGludCkpOwotbXlBID0gKHNoYXJlZCBbXSBpbnQgKikmQWRhdGFbTVlUSFJFQURdOwotQmRhdGEgPSB1cGNfYWxsX2FsbG9jKFRIUkVBRFMqVEhSRUFEUywgTkVMRU1TKnNpemVvZihpbnQpKTsKLW15QiA9IChzaGFyZWQgW10gaW50ICopJkJkYXRhW01ZVEhSRUFEXTsKLS8vIEFkYXRhIGFuZCBCZGF0YSBjb250YWluIFRIUkVBRFMqVEhSRUFEUypORUxFTVMgZWxlbWVudHMuCi0vLyBteUEgYW5kIG15QiBhcmUgTVlUSFJFQUQncyByb3dzIG9mIEFkYXRhIGFuZCBCZGF0YSwgcmVzcC4KLS8vIEluaXRpYWxpemUgTVlUSFJFQUQncyByb3cgb2YgQS4gRm9yIGV4YW1wbGUsCi1mb3IgKGk9MDsgaSZsdDtORUxFTVMqVEhSRUFEUzsgaSsrKQotbXlBW2ldID0gTVlUSFJFQUQqMTAgKyBpOwotdXBjX2FsbF9leGNoYW5nZSggQmRhdGEsIEFkYXRhLCBORUxFTVMqc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICAgICBVUENfSU5fQUxMU1lOQyB8IFVQQ19PVVRfQUxMU1lOQyApOwotPC9wcmU+Ci08L3VsPgotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTU1Y2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2dhdGhlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX2dhdGhlcjwvY29kZT4gZnVuY3Rpb248L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHByZT4gICAgCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgICNpbmNsdWRlICZsdDt1cGNfY29sbGVjdGl2ZS5oJmd0OwotICAgIHZvaWQgdXBjX2FsbF9nYXRoZXIoc2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ieXRlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGNfZmxhZ190IGZsYWdzKTsgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLTxwPgotVGhlIDxjb2RlPnVwY19hbGxfZ2F0aGVyIDwvY29kZT4gIGZ1bmN0aW9uIAotY29waWVzIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeSB0aGF0IGhhcwotYWZmaW5pdHkgdG8gdGhlIGl0aCB0aHJlYWQgdG8gdGhlIGl0aCBibG9jayBvZiBhIHNoYXJlZCBtZW1vcnkgYXJlYSB0aGF0IGhhcwotYWZmaW5pdHkgdG8gYSBzaW5nbGUgdGhyZWFkLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggYmxvY2sgaXMgPGNvZGU+bmJ5dGVzPC9jb2RlPi4KLTxwPjxjb2RlPm5ieXRlczwvY29kZT4gbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC4KLTxwPlRoZSB1cGMgYWxsIGdhdGhlciBmdW5jdGlvbiB0cmVhdHMgdGhlIDxjb2RlPnNyYzwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEKLXNoYXJlZCBtZW1vcnkgYXJlYSBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIG9uIGVhY2ggdGhyZWFkIGFuZCB0aGVyZWZvcmUgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbbmJ5dGVzXSBjaGFyW25ieXRlcyAqIFRIUkVBRFNdCi08L3ByZT4KLTxwPmFuZCBpdCB0cmVhdHMgdGhlIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHdpdGgKLXRoZSB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW10gY2hhcltuYnl0ZXMgKiBUSFJFQURTXQotICAgIDwvcHJlPgotPHA+VGhlIHRhcmdldCBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVyIG11c3QgaGF2ZSBhZmZpbml0eSB0byB0aHJlYWQgMC4KLTxwPlRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgaXMgdHJlYXRlZCBhcyBpZiBpdCBoYXMgcGhhc2UgMC4KLTxwPkZvciBlYWNoIHRocmVhZCBpLCB0aGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcwotcG9pbnRlZCB0byBieSA8Y29kZT5zcmM8L2NvZGU+IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBpIHRvIHRoZSBpdGggYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPgotYnl0ZXMgcG9pbnRlZCB0byBieSA8Y29kZT5kc3Q8L2NvZGU+LgotPHA+Ci08dWw+Ci08bGk+RVhBTVBMRSAxIDxjb2RlPnVwY19hbGxfZ2F0aGVyIDwvY29kZT4gZm9yIHRoZSBzdGF0aWMgVEhSRUFEUyB0cmFuc2xhdGlvbiBlbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW05FTEVNU10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtdIGludCBCW05FTEVNUypUSFJFQURTXTsKLS8vIEluaXRpYWxpemUgQS4KLXVwY19hbGxfZ2F0aGVyKCBCLCBBLCBzaXplb2YoaW50KSpORUxFTVMsCi1VUENfSU5fQUxMU1lOQyB8IFVQQ19PVVRfQUxMU1lOQyApOwotPC9wcmU+Ci08bGk+RVhBTVBMRSAyIDxjb2RlPnVwY19hbGxfZ2F0aGVyIDwvY29kZT4gZm9yIHRoZSBkeW5hbWljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtORUxFTVNdIGludCBBW05FTEVNUypUSFJFQURTXTsKLXNoYXJlZCBbXSBpbnQgKkI7Ci1CID0gKHNoYXJlZCBbXSBpbnQgKikgdXBjX2FsbF9hbGxvYygxLE5FTEVNUypUSFJFQURTKnNpemVvZihpbnQpKTsKLS8vIEluaXRpYWxpemUgQS4KLXVwY19iYXJyaWVyOwotdXBjX2FsbF9nYXRoZXIoIEIsIEEsIHNpemVvZihpbnQpKk5FTEVNUywKLVVQQ19JTl9OT1NZTkMgfCBVUENfT1VUX05PU1lOQyApOwotdXBjX2JhcnJpZXI7Ci08L3ByZT4KLTxsaT4KLTxsaT4KLTwvdWw+Ci08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPjxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyX2FsbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2dhdGhlcl9hbGwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMTk5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyX2FsbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX2dhdGhlcl9hbGw8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfZ2F0aGVyX2FsbChzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGNfZmxhZ190IGZsYWdzKTsKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsIDwvY29kZT4gIGZ1bmN0aW9uIAotY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gb25lIHNoYXJlZAotbWVtb3J5IGFyZWEgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZCB0byB0aGUgaXRoIGJsb2NrIG9mIGEgc2hhcmVkCi1tZW1vcnkgYXJlYSBvbiBlYWNoIHRocmVhZC4gVGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIGlzIDxjb2RlPm5ieXRlczwvY29kZT4uCi08cD48Y29kZT5uYnl0ZXM8L2NvZGU+IG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIDAuCi08cD5UaGUgdXBjX2FsbF9nYXRoZXJfYWxsIGZ1bmN0aW9uIHRyZWF0cyB0aGUgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVyIGFzIGlmIGl0IHBvaW50ZWQgdG8gYQotc2hhcmVkIG1lbW9yeSBhcmVhIG9mIDxjb2RlPm5ieXRlczwvY29kZT4gYnl0ZXMgb24gZWFjaCB0aHJlYWQgYW5kIHRoZXJlZm9yZSBoYWQgdHlwZToKLTxwcmU+Ci1zaGFyZWQgW25ieXRlc10gY2hhcltuYnl0ZXMgKiBUSFJFQURTXQotPC9wcmU+Ci08cD5hbmQgaXQgdHJlYXRzIHRoZSA8Y29kZT5kc3Q8L2NvZGU+ICBwb2ludGVyIGFzIGlmIGl0IHBvaW50ZWQgdG8gYSBzaGFyZWQgbWVtb3J5IGFyZWEgd2l0aAotdGhlIHR5cGU6Ci1zaGFyZWQgW25ieXRlcyAqIFRIUkVBRFNdIGNoYXJbbmJ5dGVzICogVEhSRUFEUyAqIFRIUkVBRFNdCi08cD5UaGUgdGFyZ2V0cyBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiBhbmQgPGNvZGU+ZHN0PC9jb2RlPiBwb2ludGVycyBtdXN0IGhhdmUgYWZmaW5pdHkgdG8gdGhyZWFkIDAuCi08cD5UaGUgPGNvZGU+c3JjPC9jb2RlPiBhbmQgPGNvZGU+ZHN0PC9jb2RlPiAgcG9pbnRlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYXZlIHBoYXNlIDAuCi08cD5UaGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgaXRoIGJsb2NrIG9mIDxjb2RlPm5ieXRlczwvY29kZT4gYnl0ZXMgcG9pbnRlZCB0bwotYnkgPGNvZGU+c3JjPC9jb2RlPiB0byB0aGUgaXRoIGJsb2NrIG9mIDxjb2RlPm5ieXRlczwvY29kZT4gYnl0ZXMgcG9pbnRlZCB0byBieSA8Y29kZT5kc3Q8L2NvZGU+IHRoYXQgaGFzIGFmZmluaXR5Ci10byBlYWNoIHRocmVhZC4KLQotCi0KLTxwPgotPHVsPgotPGxpPiBFWEFNUExFIDEgPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsIDwvY29kZT4gZm9yIHRoZSBzdGF0aWMgVEhSRUFEUyB0cmFuc2xhdGlvbiBlbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW05FTEVNU10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtORUxFTVMqVEhSRUFEU10gaW50IEJbVEhSRUFEU11bTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2JhcnJpZXI7Ci11cGNfYWxsX2dhdGhlcl9hbGwoIEIsIEEsIHNpemVvZihpbnQpKk5FTEVNUywKLVVQQ19JTl9OT1NZTkMgfCBVUENfT1VUX05PU1lOQyApOwotdXBjX2JhcnJpZXI7Ci08L3ByZT4KLTxsaT5FWEFNUExFIDIgPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsIDwvY29kZT4gYWxsIGZvciB0aGUgZHluYW1pYyBUSFJFQURTIHRyYW5zbGF0aW9uCi1lbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW05FTEVNU10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIGludCAqQmRhdGE7Ci1zaGFyZWQgW10gaW50ICpteUI7Ci1CZGF0YSA9IHVwY19hbGxfYWxsb2MoVEhSRUFEUypUSFJFQURTLCBORUxFTVMqc2l6ZW9mKGludCkpOwotbXlCID0gKHNoYXJlZCBbXSBpbnQgKikmQmRhdGFbTVlUSFJFQURdOwotLy8gQmRhdGEgY29udGFpbnMgVEhSRUFEUypUSFJFQURTKk5FTEVNUyBlbGVtZW50cy4KLS8vIG15QiBpcyBNWVRIUkVBRNVzIHJvdyBvZiBCZGF0YS4KLS8vIEluaXRpYWxpemUgQS4KLXVwY19hbGxfZ2F0aGVyX2FsbCggQmRhdGEsIEEsIE5FTEVNUypzaXplb2YoaW50KSwKLVVQQ19JTl9BTExTWU5DIHwgVVBDX09VVF9BTExTWU5DICk7Ci08L3ByZT4KLTxsaT4KLTxsaT4KLTwvdWw+Ci08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbF9sb2NrX2FsbG9jLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfbG9ja19hbGxvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjYyOTEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbF9sb2NrX2FsbG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08aDIgPlRoZSA8Y29kZT51cGNfYWxsX2xvY2tfYWxsb2M8L2NvZGU+IGZ1bmN0aW9uICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB1cGNfbG9ja190ICp1cGNfYWxsX2xvY2tfYWxsb2Modm9pZCk7ICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2xvY2tfYWxsb2M8L2NvZGU+ICAgIGZ1bmN0aW9uIGR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhIGxvY2sgYW5kIHJldHVybnMKLWEgcG9pbnRlciB0byBpdC4gVGhlIGxvY2sgaXMgY3JlYXRlZCBpbiBhbiB1bmxvY2tlZCBzdGF0ZS4KLTxwPlRoZSA8Y29kZT51cGNfYWxsX2xvY2tfYWxsb2M8L2NvZGU+ICBmdW5jdGlvbiBpcyAgYSA8aT5jb2xsZWN0aXZlPC9pPiBmdW5jdGlvbi4gCi1UaGUgcmV0dXJuIHZhbHVlIG9uIGV2ZXJ5Ci10aHJlYWQgcG9pbnRzIHRvIHRoZSBzYW1lIGxvY2sgb2JqZWN0LgotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfcGVybXV0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX3Blcm11dGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiOTNiNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfcGVybXV0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX3Blcm11dGU8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfcGVybXV0ZShzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwKLSAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsCi0gICAgICAgIHNoYXJlZCBjb25zdCBpbnQgKiByZXN0cmljdCBwZXJtLAotICAgICAgICBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzKTsKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbF9wZXJtdXRlIDwvY29kZT4gIGZ1bmN0aW9uIAotY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gYSBzaGFyZWQgbWVtb3J5Ci1hcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIGEgYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5Ci10aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgcGVybVtpXS4gVGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIGlzCi08Y29kZT5uYnl0ZXM8L2NvZGU+LgotPHA+PGNvZGU+bmJ5dGVzPC9jb2RlPiBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLgotPHA+PGNvZGU+cGVybVswLi5USFJFQURTLTFdPC9jb2RlPiBtdXN0IGNvbnRhaW4gPGNvZGU+VEhSRUFEUzwvY29kZT4KLWRpc3RpbmN0IHZhbHVlczogCi08Y29kZT4wLCAxLCAuLi4sIFRIUkVBRFMtMS48L2NvZGU+Ci08cD5UaGUgPGNvZGU+dXBjX2FsbF9wZXJtdXRlIDwvY29kZT4gZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgYW5kIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIKLWFzIGlmIGVhY2ggcG9pbnRlZCB0byBhIHNoYXJlZCBtZW1vcnkgYXJlYSBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIG9uIGVhY2ggdGhyZWFkCi1hbmQgdGhlcmVmb3JlIGhhZCB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgWzxjb2RlPm5ieXRlczwvY29kZT5dIGNoYXJbPGNvZGU+bmJ5dGVzPC9jb2RlPiAqIFRIUkVBRFNdCi0gICAgPC9wcmU+Ci08cD5UaGUgdGFyZ2V0cyBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiwgcGVybSwgYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgbXVzdCBoYXZlIGFmZmluaXR5IHRvIHRocmVhZCAwLgotPHA+VGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYXZlIHBoYXNlIDAuCi08cD5UaGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB0aGF0IGhhcyBhZmZpbml0eQotdG8gdGhyZWFkIGkgcG9pbnRlZCB0byBieSA8Y29kZT5zcmM8L2NvZGU+IHRvIHRoZSBibG9jayBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIHRoYXQgaGFzIGFmZmluaXR5Ci10byB0aHJlYWQgcGVybVtpXSBwb2ludGVkIHRvIGJ5IDxjb2RlPmRzdDwvY29kZT4uCi08dWw+Ci08bGk+RVhBTVBMRSAxOiA8Y29kZT51cGNfYWxsX3Blcm11dGU8L2NvZGU+Ci08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtORUxFTVNdIGludCBBW05FTEVNUypUSFJFQURTXSwgQltORUxFTVMqVEhSRUFEU107Ci1zaGFyZWQgaW50IFBbVEhSRUFEU107Ci0vLyBJbml0aWFsaXplIEEgYW5kIFAuCi11cGNfYmFycmllcjsKLXVwY19hbGxfcGVybXV0ZSggQiwgQSwgUCwgc2l6ZW9mKGludCkqTkVMRU1TLAotVVBDX0lOX05PU1lOQyB8IFVQQ19PVVRfTk9TWU5DICk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotCi08L3VsPgotCi0gCi08L3VsPgotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfc2NhdHRlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX3NjYXR0ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMWU5Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfc2NhdHRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX3NjYXR0ZXI8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfc2NhdHRlcihzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwY19mbGFnX3QgZmxhZ3MpOwotICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLTxwPgotVGhlIDxjb2RlPnVwY19hbGxfc2NhdHRlciA8L2NvZGU+ICBmdW5jdGlvbiAKLWNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIGFuIGFyZWEgb2Ygc2hhcmVkCi1tZW1vcnkgd2l0aCBhZmZpbml0eSB0byBhIHNpbmdsZSB0aHJlYWQgdG8gYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5IHdpdGgKLWFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggYmxvY2sgaXMgPGNvZGU+bmJ5dGVzPC9jb2RlPi4KLTxwPjxjb2RlPm5ieXRlczwvY29kZT4gbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC4KLTxwPlRoZSA8Y29kZT51cGNfYWxsX3NjYXR0ZXIgPC9jb2RlPiAgZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgYXMgaWYgaXQgcG9pbnRlZCB0byBhCi1zaGFyZWQgbWVtb3J5IGFyZWEgd2l0aCB0aGUgdHlwZToKLTxwcmU+Ci0gICAgc2hhcmVkIFtdIGNoYXJbbmJ5dGVzICogVEhSRUFEU10KLSA8L3ByZT4KLTxwPmFuZCBpdCB0cmVhdHMgdGhlIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHdpdGgKLXRoZSB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW25ieXRlc10gY2hhcltuYnl0ZXMgKiBUSFJFQURTXQotPC9wcmU+Ci08cD5UaGUgdGFyZ2V0IG9mIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIgbXVzdCBoYXZlIGFmZmluaXR5IHRvIHRocmVhZCAwLgotPHA+VGhlIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlciBpcyB0cmVhdGVkIGFzIGlmIGl0IGhhcyBwaGFzZSAwLgotPHA+Rm9yIGVhY2ggdGhyZWFkIGksIHRoZSBlZmZlY3QgaXMgZXF1aXZhbGVudCB0byBjb3B5aW5nIHRoZSBpdGggYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPgotYnl0ZXMgcG9pbnRlZCB0byBieSA8Y29kZT5zcmM8L2NvZGU+IHRvIHRoZSBibG9jayBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIHBvaW50ZWQgdG8gYnkgCi08Y29kZT5kc3Q8L2NvZGU+IHRoYXQKLWhhcyBhZmZpbml0eSB0byB0aHJlYWQgaS4KLTx1bD4KLTxsaT5FWEFNUExFIDE6IDxjb2RlPnVwY19hbGxfc2NhdHRlcjwvY29kZT4gZm9yIHRoZSBkeW5hbWljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5VTUVMRU1TIDEwCi0jZGVmaW5lIFNSQ19USFJFQUQgMQotc2hhcmVkIGludCAqQTsKLXNoYXJlZCBbXSBpbnQgKm15QSwgKnNyY0E7Ci1zaGFyZWQgW05VTUVMRU1TXSBpbnQgQltOVU1FTEVNUypUSFJFQURTXTsKLS8vIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGFycmF5IGRpc3RyaWJ1dGVkIGFjcm9zcyBhbGwgdGhyZWFkcwotQSA9IHVwY19hbGxfYWxsb2MoVEhSRUFEUywgVEhSRUFEUypOVU1FTEVNUypzaXplb2YoaW50KSk7Ci1teUEgPSAoc2hhcmVkIFtdIGludCAqKSAmQVtNWVRIUkVBRF07Ci1mb3IgKGk9MDsgaTxOVU1FTEVNUypUSFJFQURTOyBpKyspCi1teUFbaV0gPSBpICsgTlVNRUxFTVMqVEhSRUFEUypNWVRIUkVBRDsgLy8gKGZvciBleGFtcGxlKQotLy8gc2NhdHRlciB0aGUgU1JDX1RIUkVBRNVzIHJvdyBvZiB0aGUgYXJyYXkKLXNyY0EgPSAoc2hhcmVkIFtdIGludCAqKSAmQVtTUkNfVEhSRUFEXTsKLXVwY19iYXJyaWVyOwotdXBjX2FsbF9zY2F0dGVyKCBCLCBzcmNBLCBzaXplb2YoaW50KSpOVU1FTEVNUywKLVVQQ19JTl9OT1NZTkMgfCBVUENfT1VUX05PU1lOQyk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotPGxpPkVYQU1QTEUgMjogPGNvZGU+dXBjX2FsbF9zY2F0dGVyPC9jb2RlPiAgZm9yIHRoZSBzdGF0aWMgVEhSRUFEUyB0cmFuc2xhdGlvbiBlbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtORUxFTVNdIGludCBCW05FTEVNUypUSFJFQURTXTsKLSAKLS8vIEluaXRpYWxpemUgQS4KLXVwY19hbGxfc2NhdHRlciggQiwgQSwgc2l6ZW9mKGludCkqTkVMRU1TLAotVVBDX0lOX0FMTFNZTkMgfCBVUENfT1VUX0FMTFNZTkMgKTsKLTwvcHJlPgotIAotPC91bD4KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTRiYjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19hbGxvYzwvY29kZT4gZnVuY3Rpb24gICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaGFyZWQgdm9pZCAqdXBjX2FsbG9jKHNpemVfdCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbG9jICA8L2NvZGU+IGFsbG9jYXRlcyBzaGFyZWQgc3BhY2Ugb2YgYXQgbGVhc3QgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB3aXRoCi1hZmZpbml0eSB0byB0aGUgY2FsbGluZyB0aHJlYWQuCi08cD4KLTxjb2RlPnVwY19hbGxvYzwvY29kZT4gaXMgc2ltaWxhciB0byBtYWxsb2MoKSBleGNlcHQgdGhhdCBpdCByZXR1cm5zIGEgcG9pbnRlci10by1zaGFyZWQKLXZhbHVlLiBJdCBpcyBub3QgYSA8aT5jb2xsZWN0aXZlPC9pPiBmdW5jdGlvbi4gSWYgPGNvZGU+bmJ5dGVzPC9jb2RlPiBpcyB6ZXJvLCB0aGUgcmVzdWx0IGlzIGEgbnVsbAotcG9pbnRlci10by1zaGFyZWQuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZnJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJmNjc5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2ZyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19mcmVlPC9jb2RlPiBmdW5jdGlvbiAgIDwvaDI+Ci08aDQ+U3lub3BzaXM8L2g0PgotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHZvaWQgdXBjX2ZyZWUoc2hhcmVkIHZvaWQgKnB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19mcmVlIDwvY29kZT4gICBmdW5jdGlvbiBmcmVlcyB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHNoYXJlZCBzdG9yYWdlIHBvaW50ZWQKLXRvIGJ5IDxjb2RlPnB0cjwvY29kZT4uIElmIDxjb2RlPnB0cjwvY29kZT4gaXMgYSBudWxsIHBvaW50ZXIsIG5vIGFjdGlvbiBvY2N1cnMuIE90aGVyd2lzZSwgaWYgdGhlCi1hcmd1bWVudCBkb2VzIG5vdCBtYXRjaCBhIHBvaW50ZXIgZWFybGllciByZXR1cm5lZCBieSB0aGUgCi08YSBocmVmPSJ1cGNfYWxsb2MuaHRtbCI+PGNvZGU+dXBjX2FsbG9jPC9jb2RlPjwvYT4sCi08YSBocmVmPSJ1cGNfZ2xvYmFsX2FsbG9jLmh0bWwiPjxjb2RlPnVwY19nbG9iYWxfYWxsb2M8L2NvZGU+PC9hPiwKLTxhIGhyZWY9InVwY19hbGxfYWxsb2MuaHRtbCI+PGNvZGU+dXBjX2FsbF9hbGxvYzwvY29kZT48L2E+LCBvciAKLTxhIGhyZWY9InVwY19sb2NhbF9hbGxvYy5odG1sIj48Y29kZT51cGNfbG9jYWxfYWxsb2M8L2NvZGU+PC9hPgotZnVuY3Rpb24sIG9yIGlmIHRoZQotc3BhY2UgaGFzIGJlZW4gZGVhbGxvY2F0ZWQgYnkgYSBwcmV2aW91cyBjYWxsLCBieSBhbnkgdGhyZWFkIAotKGkuZS4sIG9ubHkgb25lIHRocmVhZCBtYXkgY2FsbCA8Y29kZT51cGNfZnJlZSA8L2NvZGU+IGZvciBlYWNoIGFsbG9jYXRpb24pLAotdG8gPGNvZGU+dXBjX2ZyZWU8L2NvZGU+LAotdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19nbG9iYWxfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9hbGxvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzczNTI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9hbGxvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPGgyID51cGNfZ2xvYmFsX2FsbG9jPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotPHByZT4KLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgc2hhcmVkIHZvaWQgKnVwY19nbG9iYWxfYWxsb2Moc2l6ZV90IG5ibG9ja3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMpOwotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19nbG9iYWxfYWxsb2M8L2NvZGU+IGFsbG9jYXRlcyBzaGFyZWQgc3BhY2UgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJhdGlvbjoKLTxwPgotPGNvZGU+Ci1zaGFyZWQgW25ieXRlc10gY2hhcltuYmxvY2tzICogbmJ5dGVzXTwvY29kZT4KLTxwPgotPGNvZGU+dXBjX2dsb2JhbF9hbGxvYzwvY29kZT4gZnVuY3Rpb24gaXMgbm90IGEgY29sbGVjdGl2ZSBmdW5jdGlvbi4gSWYgY2FsbGVkIGJ5Ci1tdWx0aXBsZSB0aHJlYWRzLCBhbGwgdGhyZWFkcyB3aGljaCBtYWtlIHRoZSBjYWxsIGdldCBkaWZmZXJlbnQgYWxsb2NhdGlvbnMuIElmCi08Y29kZT5uYmxvY2tzKm5ieXRlczwvY29kZT4gaXMgemVybywgdGhlIHJlc3VsdCBpcyBhIG51bGwgcG9pbnRlci10by1zaGFyZWQuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2V4aXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9leGl0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmY5OTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2V4aXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19nbG9iYWxfZXhpdDwvY29kZT4gZnVuY3Rpb24gPC9oMj4KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPgotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY19nbG9iYWxfZXhpdChpbnQgc3RhdHVzKTsKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT51cGNfZ2xvYmFsX2V4aXQoKSA8L2NvZGU+Ci1mbHVzaGVzIGFsbCBJL08sIHJlbGVhc2VzIGFsbCBzdG9yYWdlLCBhbmQgdGVybWluYXRlcyB0aGUKLWV4ZWN1dGlvbiBmb3IgYWxsIGFjdGl2ZSB0aHJlYWRzLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2xvY2tfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9sb2NrX2FsbG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTM1ZmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2xvY2tfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19nbG9iYWxfbG9ja19hbGxvYzwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotCi08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgdXBjX2xvY2tfdCAqdXBjX2dsb2JhbF9sb2NrX2FsbG9jKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAKLTwvcHJlPgotCi08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19nbG9iYWxfbG9ja19hbGxvYyA8L2NvZGU+ICAgZnVuY3Rpb24gZHluYW1pY2FsbHkgYWxsb2NhdGVzIGEgbG9jayBhbmQgcmV0dXJucwotYSBwb2ludGVyIHRvIGl0LiBUaGUgbG9jayBpcyBjcmVhdGVkIGluIGFuIHVubG9ja2VkIHN0YXRlLgotPHA+VGhlIDxjb2RlPnVwY19nbG9iYWxfbG9ja19hbGxvYyA8L2NvZGU+IGZ1bmN0aW9uIGlzIG5vdCBhIDxpPmNvbGxlY3RpdmU8L2k+IGZ1bmN0aW9uLiAgSWYgY2FsbGVkCi1ieSBtdWx0aXBsZSB0aHJlYWRzLCBhbGwgdGhyZWFkcyB3aGljaCBtYWtlIHRoZSBjYWxsIGdldCBkaWZmZXJlbnQgYWxsb2NhdGlvbnMuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9jYWxfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2FsX2FsbG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDdhMWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9jYWxfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19sb2NhbF9hbGxvYzwvY29kZT4gZnVuY3Rpb24gJm5ic3A7Jm5ic3A7IDxpPmRlcHJlY2F0ZWQ8L2k+IDwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cD4KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaGFyZWQgdm9pZCAqdXBjX2xvY2FsX2FsbG9jKHNpemVfdCBuYmxvY2tzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX2xvY2FsX2FsbG9jIDwvY29kZT4gZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBVUEMKLXByb2dyYW1zIHNob3VsZCB1c2UgdGhlIDxjb2RlPnVwY19hbGxvYyA8L2NvZGU+IGZ1bmN0aW9uIGluc3RlYWQuIFN1cHBvcnQgbWF5IGJlIHJlbW92ZWQKLWluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb24uCi08cD4KLVRoZSA8Y29kZT51cGNfbG9jYWxfYWxsb2MgPC9jb2RlPiBmdW5jdGlvbiBhbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIG9mIGF0IGxlYXN0IAotPGNvZGU+bmJsb2NrcyAqIG5ieXRlcyA8L2NvZGU+IGJ5dGVzIHdpdGggYWZmaW5pdHkgdG8gdGhlIGNhbGxpbmcgdGhyZWFkLiBJZiAKLTxjb2RlPm5ibG9ja3MgKiBuYnl0ZXMgPC9jb2RlPiAgaXMgemVybywKLXRoZSByZXN1bHQgaXMgYSBudWxsIHBvaW50ZXItdG8tc2hhcmVkLgotPHA+Ci08Y29kZT51cGNfbG9jYWxfYWxsb2MgPC9jb2RlPiBpcyBzaW1pbGFyIHRvIG1hbGxvYygpIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSBwb2ludGVyLXRvLXNoYXJlZAotdmFsdWUuIEl0IGlzIG5vdCBhIDxpPmNvbGxlY3RpdmU8L2k+IGZ1bmN0aW9uLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwOTE5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19sb2NrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08aDIgPlRoZSA8Y29kZT51cGNfbG9jazwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY19sb2NrKHVwY19sb2NrX3QgKnB0cik7ICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbG9jazwvY29kZT4gICAgZnVuY3Rpb24gIHNldHMgdGhlIHN0YXRlIG9mIHRoZSBsb2NrIHBvaW50ZWQgdG8gYnkgPGNvZGU+cHRyPC9jb2RlPiB0byBsb2NrZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSBkdWUgdG8gdGhlIGNhbGxpbmcgdGhyZWFkIHNldHRpbmcgaXQgdG8KLWxvY2tlZCBzdGF0ZSwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSwgdGhlbiB0aGUgY2FsbGluZyB0aHJlYWQgd2FpdHMgZm9yIHNvbWUKLW90aGVyIHRocmVhZCB0byBzZXQgdGhlIHN0YXRlIHRvIHVubG9ja2VkLiAKLTxwPk9uY2UgdGhlIGxvY2sgaXMgaW4gc3RhdGUgdW5sb2NrZWQsIGEgc2luZ2xlIGNhbGxpbmcgdGhyZWFkIHNldHMgdGhlIHN0YXRlIHRvCi1sb2NrZWQgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zLgotPHA+QSBudWxsIHN0cmljdCBhY2Nlc3MgaXMgaW1wbGllZCBhZnRlciBhIGNhbGwgdG8gdXBjX2xvY2soKS4KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19sb2NrX2F0dGVtcHQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfYXR0ZW1wdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkyYTliLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfYXR0ZW1wdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX2xvY2tfYXR0ZW1wdDwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBpbnQgdXBjX2xvY2tfYXR0ZW1wdCh1cGNfbG9ja190ICpwdHIpOyAgICAgICAgICAgICAgIAotPC9wcmU+Ci0KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX2xvY2tfYXR0ZW1wdDwvY29kZT4gICAgZnVuY3Rpb24gIGF0dGVtcHRzIHRvIHNldCB0aGUgc3RhdGUgb2YgdGhlIGxvY2sgcG9pbnRlZAotdG8gYnkgPGNvZGU+cHRyPC9jb2RlPiB0byBsb2NrZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSBkdWUgdG8gdGhlIGNhbGxpbmcgdGhyZWFkIHNldHRpbmcgaXQgdG8KLWxvY2tlZCBzdGF0ZSwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLgotPHA+SWYgdGhlIGxvY2sgaXMgaW4gc3RhdGUgdW5sb2NrZWQsIGEgc2luZ2xlIGNhbGxpbmcgdGhyZWFkIHNldHMgdGhlIHN0YXRlIHRvIGxvY2tlZAotYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuCi08cD5BIG51bGwgc3RyaWN0IGFjY2VzcyBpcyBpbXBsaWVkIGFmdGVyIGEgY2FsbCB0byB1cGNfbG9ja19hdHRlbXB0KCkgdGhhdCByZXR1cm5zCi0xLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja19mcmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmQzZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja19mcmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08aDIgPlRoZSA8Y29kZT51cGNfbG9ja19mcmVlPC9jb2RlPiBmdW5jdGlvbiAgIDwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cD4KLQotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHVwY19sb2NrX3QgKnVwY19sb2NrX2ZyZWUodXBjX2xvY2tfdCAqcHRyKTsgICAgICAgICAgICAgICAgICAgICAKLTwvcHJlPgotCi08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19sb2NrX2ZyZWU8L2NvZGU+ICAgIGZ1bmN0aW9uICBmcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pY2FsbHkKLWFsbG9jYXRlZCA8Y29kZT51cGNfbG9ja190PC9jb2RlPiBwb2ludGVkIHRvIGJ5IDxjb2RlPnB0cjwvY29kZT4uIAotSWYgPGNvZGU+cHRyPC9jb2RlPiBpcyBhIG51bGwgcG9pbnRlciwgbm8KLWFjdGlvbiBvY2N1cnMuIAotT3RoZXJ3aXNlLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgbWF0Y2ggYSBwb2ludGVyIGVhcmxpZXIKLXJldHVybmVkIGJ5IHRoZSA8Y29kZT51cGNfZ2xvYmFsX2xvY2tfYWxsb2M8L2NvZGU+IG9yIAotPGNvZGU+dXBjX2FsbF9sb2NrX2FsbG9jPC9jb2RlPiBmdW5jdGlvbiwKLW9yIGlmIHRoZSBsb2NrIGhhcyBiZWVuIGRlYWxsb2NhdGVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byA8Y29kZT51cGNfbG9ja19mcmVlPC9jb2RlPiwKLXRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCi08cD4KLTxjb2RlPnVwY19sb2NrX2ZyZWU8L2NvZGU+IHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVmZXJlbmNlZCBsb2NrIGlzIGN1cnJlbnRseQotdW5sb2NrZWQgb3IgY3VycmVudGx5IGxvY2tlZCAoYnkgYW55IHRocmVhZCkuCi08cD5Bbnkgc3Vic2VxdWVudCBjYWxscyB0byBsb2NraW5nIGZ1bmN0aW9ucyBmcm9tIGFueSB0aHJlYWQgdXNpbmcgPGNvZGU+cHRyPC9jb2RlPiBoYXZlCi11bmRlZmluZWQgZWZmZWN0cy4gVGhpcyBhbHNvIGFwcGxpZXMgdG8gYW55IHRocmVhZCBjdXJyZW50bHkgY2FsbGluZyA8Y29kZT51cGNfbG9jazwvY29kZT4uCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja190Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWE1OTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja190Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19sb2NrX3Q8L2NvZGU+IHR5cGU8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+VGhlIHR5cGUgZGVjbGFyZWQgaXMKLTxwcmU+ICAgCi0gICAgdXBjX2xvY2tfdCAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSB0eXBlIDxjb2RlPnVwY19sb2NrX3QgPC9jb2RlPiAgaXMgYW4gb3BhcXVlIFVQQyB0eXBlLiA8Y29kZT51cGNfbG9ja190IDwvY29kZT4gaXMgYSBzaGFyZWQKLWRhdGF0eXBlIHdpdGggaW5jb21wbGV0ZSB0eXBlIChhcyBkZWZpbmVkIGluIFtJU08vSUVDMDAgU2VjIDYuMi41XSkuIAotT2JqZWN0cwotb2YgdHlwZSA8Y29kZT51cGNfbG9ja190IDwvY29kZT4gbWF5IHRoZXJlZm9yZSBvbmx5IGJlIG1hbmlwdWxhdGVkIHRocm91Z2ggcG9pbnRlcnMuCi1TdWNoIG9iamVjdHMgaGF2ZSB0d28gc3RhdGVzIGNhbGxlZCBsb2NrZWQgYW5kIHVubG9ja2VkLgotPHA+VHdvIHBvaW50ZXJzIHRvIHRoYXQgcmVmZXJlbmNlIHRoZSBzYW1lIGxvY2sgb2JqZWN0IHdpbGwgY29tcGFyZSBhcyBlcXVhbC4KLVRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHVwY19waGFzZW9mKCksIHVwY190aHJlYWRvZigpLCBhbmQgdXBjX2FkZHJmaWVsZCgpCi10byBzdWNoIHBvaW50ZXJzIGFyZSB1bmRlZmluZWQuCi0KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1jcHkuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX21lbWNweS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU0YWY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX21lbWNweS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX21lbWNweTwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY19tZW1jcHkoc2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIAotICAgICAgICAgICAgICAgICAgICBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuKTsKLSAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbWVtY3B5PC9jb2RlPiAgICBmdW5jdGlvbiAgY29waWVzIG4gY2hhcmFjdGVycyBmcm9tIGEgc2hhcmVkIG9iamVjdCBoYXZpbmcKLWFmZmluaXR5IHdpdGggb25lIHRocmVhZCB0byBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggdGhlIHNhbWUgb3IKLWFub3RoZXIgdGhyZWFkLgotPHA+VGhlIDxjb2RlPnVwY19tZW1jcHk8L2NvZGU+IGZ1bmN0aW9uIHRyZWF0cyB0aGUgPGNvZGU+ZHN0PC9jb2RlPiBhbmQgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVycyBhcyBpZiAKLXRoZXkgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbXSBjaGFyW25dCi08L3ByZT4KLVRoZSBlZmZlY3QgaXMgZXF1aXZhbGVudCB0byBjb3B5aW5nIHRoZSBlbnRpcmUgY29udGVudHMgZnJvbSBvbmUgc2hhcmVkIGFycmF5Ci1vYmplY3Qgd2l0aCB0aGlzIHR5cGUgKHRoZSA8Y29kZT5zcmM8L2NvZGU+IGFycmF5KSB0byBhbm90aGVyIHNoYXJlZCBhcnJheSBvYmplY3Qgd2l0aAotdGhpcyB0eXBlICh0aGUgPGNvZGU+ZHN0PC9jb2RlPiBhcnJheSkuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbWVtZ2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1nZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiYzQ0NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1nZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19tZW1nZXQ8L2NvZGU+IGZ1bmN0aW9uICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotCi08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgdm9pZCB1cGNfbWVtZ2V0KHZvaWQgKiByZXN0cmljdCBkc3QsIAotICAgICAgICAgICAgICAgICAgICBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuKTsKLSAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbWVtZ2V0PC9jb2RlPiAgICBmdW5jdGlvbiAgY29waWVzIG4gY2hhcmFjdGVycyBmcm9tIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5Ci10byBhbnkgc2luZ2xlIHRocmVhZCB0byBhbiBvYmplY3Qgb24gdGhlIGNhbGxpbmcgdGhyZWFkLgotPHA+VGhlIDxjb2RlPnVwY19tZW1nZXQ8L2NvZGU+IGZ1bmN0aW9uIHRyZWF0cyB0aGUgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVyIGFzIGlmIGl0IGhhZCB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW10gY2hhcltuXQotICAgIDwvcHJlPgotVGhlIGVmZmVjdCBpcyBlcXVpdmFsZW50IHRvIGNvcHlpbmcgdGhlIGVudGlyZSBjb250ZW50cyBmcm9tIG9uZSBzaGFyZWQgYXJyYXkKLW9iamVjdCB3aXRoIHRoaXMgdHlwZSAodGhlIDxjb2RlPnNyYzwvY29kZT4gYXJyYXkpIHRvIGFuIGFycmF5IG9iamVjdCAodGhlIDxjb2RlPmRzdDwvY29kZT4gYXJyYXkpCi1kZWNsYXJlZCB3aXRoIHRoZSB0eXBlCi08cHJlPgotICAgIGNoYXJbbl0KLTwvcHJlPgotCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbWVtc2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1zZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0ZDgyMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1zZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19tZW1zZXQ8L2NvZGU+IGZ1bmN0aW9uICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotCi08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgdm9pZCB1cGNfbWVtc2V0KHNoYXJlZCB2b2lkICpkc3QsIAotICAgICAgICAgICAgICAgICAgICBpbnQgYywgCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuKTsKLSAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbWVtc2V0PC9jb2RlPiAgICBmdW5jdGlvbiAgY29waWVzIHRoZSB2YWx1ZSBvZiBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQKLWNoYXIsIHRvIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5IHRvIGFueSBzaW5nbGUgdGhyZWFkLiBUaGUgbnVtYmVyIG9mCi1ieXRlcyBzZXQgaXMgbi4KLTxwPlRoZSA8Y29kZT51cGNfbWVtc2V0PC9jb2RlPiAgZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIgYXMgaWYgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbXSBjaGFyW25dCi08L3ByZT4KLSAgICAKLVRoZSBlZmZlY3QgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBzaGFyZWQgYXJyYXkgb2JqZWN0Ci13aXRoIHRoaXMgdHlwZSAodGhlIDxjb2RlPmRzdDwvY29kZT4gYXJyYXkpIHRvIHRoZSB2YWx1ZSBjLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3BoYXNlb2YuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3BoYXNlb2YuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNGJmYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19waGFzZW9mLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19waGFzZW9mPC9jb2RlPiBmdW5jdGlvbjwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPiAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgc2l6ZV90IHVwY19waGFzZW9mKHNoYXJlZCB2b2lkICpwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX3BoYXNlb2YgPC9jb2RlPiBmdW5jdGlvbiAgcmV0dXJucyB0aGUgcGhhc2UgY29tcG9uZW50IG9mIHRoZSBwb2ludGVyLXRvLXNoYXJlZAotYXJndW1lbnQuCi08cD5JZiA8Y29kZT5wdHI8L2NvZGU+IGlzIGEgbnVsbCBwb2ludGVyLXRvLXNoYXJlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3Jlc2V0cGhhc2UuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3Jlc2V0cGhhc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyNzgwMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19yZXNldHBoYXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19yZXNldHBoYXNlPC9jb2RlPiBmdW5jdGlvbjwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPiAgICAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgc2hhcmVkIHZvaWQgKnVwY19yZXNldHBoYXNlKHNoYXJlZCB2b2lkICpwdHIpOyAgICAgICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19yZXNldHBoYXNlIDwvY29kZT4gZnVuY3Rpb24gICByZXR1cm5zIGEgcG9pbnRlci10by1zaGFyZWQgd2hpY2ggaXMgaWRlbnRpY2FsCi10byBpdHMgaW5wdXQgZXhjZXB0IHRoYXQgaXQgaGFzIHplcm8gcGhhc2UuCi0KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY190aHJlYWRvZi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfdGhyZWFkb2YuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiNDEwYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY190aHJlYWRvZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX3RocmVhZG9mPC9jb2RlPiBmdW5jdGlvbiAmbmJzcDsmbmJzcDsgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHNpemVfdCB1cGNfdGhyZWFkb2Yoc2hhcmVkIHZvaWQgKnB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLTxwPgotVGhlIDxjb2RlPnVwY190aHJlYWRvZiA8L2NvZGU+ZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRocmVhZCB0aGF0IGhhcyBhZmZpbml0eQotdG8gdGhlIHNoYXJlZCBvYmplY3QgcG9pbnRlZCB0byBieSA8Y29kZT5wdHI8L2NvZGU+LgotPHA+Ci1JZiA8Y29kZT5wdHI8L2NvZGU+IGlzIGEgbnVsbCBwb2ludGVyLXRvLXNoYXJlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY191bmxvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3VubG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTJkMGFiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3VubG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX3VubG9jazwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY191bmxvY2sodXBjX2xvY2tfdCAqcHRyKTsgICAgICAgICAgICAgIAotPC9wcmU+Ci0KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX3VubG9jazwvY29kZT4gICAgZnVuY3Rpb24gIHNldHMgdGhlIHN0YXRlIG9mIHRoZSBsb2NrIHBvaW50ZWQgdG8gYnkgPGNvZGU+cHRyPC9jb2RlPiB0bwotdW5sb2NrZWQuCi08cD5Vbmxlc3MgdGhlIGxvY2sgaXMgaW4gbG9ja2VkIHN0YXRlIGFuZCB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIGxvY2tpbmcgdGhyZWFkLAotdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi08cD5BIG51bGwgc3RyaWN0IGFjY2VzcyBpcyBpbXBsaWVkIGJlZm9yZSBhIGNhbGwgdG8gdXBjIHVubG9jaygpLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9pY29ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmYyZWI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wc3BicndzZS5qYmYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zL3VwYy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9pY29ucy91cGMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE4NzMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zL3VwYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmRmZmI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyAgICB0ZXN0IHBsdWdpbi5wcm9wZXJ0aWVzCi0jIFRoZXNlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbiBwbHVnaW4ueG1sIAotIwotCi12aWV3Lm5hbWU9VVBDIEFydGlmYWN0IFZpZXcKLXZpZXdjYXQubmFtZT1QVFAgVVBDIFZpZXdzCi1ydW4ubGFiZWw9UnVuIFVQQyBBbmFseXNpcwotcnVuLnRvb2x0aXA9UnVuIFVQQyBBbmFseXNpcyBvbiBzZWxlY3RlZCBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QgdG8gZmluZCBVUEMgQXJ0aWZhY3RzCi0KLSNuZWVkIHRvIGFkZCBtb3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZmY0NDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzLlVQQ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5wcmVmcGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24ucHJlZnMuUExEVFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iVVBDIi8+Ci0gICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tICBVUEMgbWFya2VycyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0JCWlkPSJ1cGNNYXJrZXIiCi0gICAgICAgIG5hbWU9InVwYyBBcnRpZmFjdCBNYXJrZXIiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSB0aGlzIGNoYW5nZXMgdGhlIG1hcmtlciBpbWFnZSBpbiB0aGUgZWRpdG9yIG1hcmtlciBiYXIgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudXBjTWFya2VyIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnVwY01hcmtlckFubm90YXRpb24iPgotICAgICAgPC90eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy51cGNNYXJrZXJBbm5vdGF0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdXBjLmdpZiIgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSIzIgotICAgICAgICAgICAgbGFiZWw9InVwYyBBbm5vdGF0aW9uIE1hcmtlciIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9InVwY0luZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIxMjgsMTI4LDE5MiIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotCQkJc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dQb3J0aW5nSW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbiIKLSAgICAgICAgICAgIHNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0idHJ1ZSIKLSAgICAgICAgICAgIGlzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleT0iaXNQb3J0aW5nR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldCIKLQotICAgICAgICAgICAgaXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ1JlY29yZEdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLSAgICAgICAgICAgID4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4gIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIldmlld2NhdC5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Lm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy91cGMuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudmlld3MuVVBDQXJ0aWZhY3RWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy52aWV3cy51cGNBcnRpZmFjdFZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LnVpLkNIZWxwUHJvdmlkZXIiPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAuVVBDQ0hlbHBJbmZvUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAuVVBDQ0hlbHBJbmZvUHJvdmlkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9ucy5SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmNvbW1hbmQyIgotICAgICAgICAgICAgbmFtZT0iZmluZCB1cGMgYXJ0aWZhY3RzIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhci5jb21tYW5kMSAiPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmNvbW1hbmQyIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvdXBjLmdpZiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJTaG93IFVQQyBBcnRpZmFjdHMiPgotICAgICAgICAgPC9jb21tYW5kPgotICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGY1MDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdE1hcmtpbmdWaXNpdG9yOwotCi1wdWJsaWMgY2xhc3MgVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvciBleHRlbmRzIEFydGlmYWN0TWFya2luZ1Zpc2l0b3IKLXsKLSAgICBwdWJsaWMgVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihTdHJpbmcgbWFya2VySWQpCi0gICAgewotICAgICAgICBzdXBlcihtYXJrZXJJZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENJRHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDSURzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzRlZTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENJRHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjOwotCi0vKioKLSAqIFVQQyBQbHVnaW4gY29uc3RhbnRzCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVQQ0lEcwotewotICAgIC8vIHByZWZlcmVuY2UgcGFnZSBuYW1lIGZvciBVUEMKLSAgICBTdHJpbmcgVVBDX0lOQ0xVREVTICAgID0gIlVQQyBJbmNsdWRlcyI7Ci0gICAgCi0gICAgU3RyaW5nIE1BUktFUl9JRCAgICAgICA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudXBjTWFya2VyIjsKLSAgICBTdHJpbmcgTUFSS0VSX0VSUk9SX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy51cGNFcnJvck1hcmtlciI7Ci0gICAgCi0gICAgLy8gYXJ0aWZhY3QgdmlldyBpZAotICAgIFN0cmluZyBVUENfVklFV19JRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudmlld3MudXBjQXJ0aWZhY3RWaWV3IjsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL1VQQ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjY3ZjA3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUENQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8qKiBUaGUgc2hhcmVkIGluc3RhbmNlLiAqLwotCXByaXZhdGUgc3RhdGljIFVQQ1BsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyI7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVUENQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUENQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiLCBwYXRoKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzZXR0aW5nIGZvciBVUEMgaW5jbHVkZSBwYXRocwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFVQQ0luY2x1ZGVEaXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdMaXN0ID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVVBDSURzLlVQQ19JTkNMVURFUyk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nTGlzdCwgRmlsZS5wYXRoU2VwYXJhdG9yICsgIlxuXHIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkaXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgZGlycy5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXJzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUExVR0lOX0lEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYWN0aW9ucy9SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYWN0aW9ucy9SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjOTM1Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2FjdGlvbnMvUnVuQW5hbHlzZVVQQ2NvbW1hbmRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS51cGMuVVBDTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUxhbmd1YWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnMuUnVuQW5hbHlzZUhhbmRsZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlZpZXdBY3RpdmF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLlVQQ0FydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLlVQQ0lEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5hbmFseXNpcy5VUENDQVNUVmlzaXRvcjsKLQotLyoqCi0gKiBUaGUgIkZpbmQgVVBDIEFydGlmYWN0cyIgYWN0aW9uL2NvbW1hbmQKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFuYWx5c2VVUENjb21tYW5kSGFuZGxlciBleHRlbmRzIFJ1bkFuYWx5c2VIYW5kbGVyQmFzZQotewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgIlJ1biBBbmFseXNpcyIgYWN0aW9uCi0JICovCi0JcHVibGljIFJ1bkFuYWx5c2VVUENjb21tYW5kSGFuZGxlcigpIHsKLQkJc3VwZXIoIlVQQyIsIG5ldyBVUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKFVQQ0lEcy5NQVJLRVJfSUQpLCBVUENJRHMuTUFSS0VSX0lEKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgVVBDIGFuYWx5c2lzIGFydGlmYWN0cyBmb3IgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzCi0JICogICAgICAgICAgICBVUEMgaW5jbHVkZSBwYXRocwotCSAqIEByZXR1cm4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NhblJldHVybiBkb0FydGlmYWN0QW5hbHlzaXMoZmluYWwgSVRyYW5zbGF0aW9uVW5pdCB0dSwJZmluYWwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzKSB7Ci0JCWZpbmFsIFNjYW5SZXR1cm4gbXNyID0gbmV3IFNjYW5SZXR1cm4oKTsKLQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gdHUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJSUxhbmd1YWdlIGxhbmc7Ci0JCXRyeSB7Ci0JCQlsYW5nID0gdHUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgIAotCQkJSUFTVFRyYW5zbGF0aW9uVW5pdCBhdHUgPSB0dS5nZXRBU1QoKTsKLQkJCWlmIChsYW5nLmdldElkKCkuZXF1YWxzKFVQQ0xhbmd1YWdlLklEKSkgey8vIGNkdDQwCi0JCQkJYXR1LmFjY2VwdChuZXcgVVBDQ0FTVFZpc2l0b3IoaW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpKTsKLQkJCX0gCi0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBtc3I7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIGZpbGVuYW1lIGlzIHZhbGlkIGZvciBVUEMgYXJ0aWZhY3QgYW5hbHlzaXMKLQkgKiA8YnI+VE9ETyAgQ29uc2lkZXIgdXNpbmcgbGFuZ3VhZ2Ugb3IgY29udGVudC10eXBlIGluc3RlYWQgb2YgZmlsZSBleHRlbnNpb24/Ci0JICogUmUtdmlzaXQgYWZ0ZXIgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMSBpcyByZXNvbHZlZCAoVVBDICBjb250ZW50LXR5cGUgbm90IHJlY29nbml6ZWQpCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGlzQ1BQICBpcyB0aGUgcHJvamVjdCBhIEMrKyBwcm9qZWN0IG9yIG5vdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZEZvckFuYWx5c2lzKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBpc0NQUCkgewotCQlpbnQgbG9jID0gZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJaWYgKGxvYyA8PSAwKSAvLyBpZiBubyBkb3QsIG9yIGZpbGVuYW1lIGlzICIuZm9vIiwgbm90IHZhbGlkIGZvcgotCQkJCQkJLy8gYW5hbHlzaXMuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBleHQgPSBmaWxlbmFtZS5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCWV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWlmIChleHQuZXF1YWxzKCJ1cGMiKSkgCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlUGF0aCgpIHsKLQkJcmV0dXJuIFVQQ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VVBDSW5jbHVkZURpcnMoKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVBcnRpZmFjdFZpZXcoKSB7Ci0JCVZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KFVQQ0lEcy5VUENfVklFV19JRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9hbmFseXNpcy9VUENDQVNUVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9hbmFseXNpcy9VUENDQVNUVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWU3MmI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYW5hbHlzaXMvVVBDQ0FTVFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmFuYWx5c2lzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTGl0ZXJhbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uU2NhblJldHVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYW5hbHlzaXMuUGxkdEFzdFZpc2l0b3I7Ci0KLS8qKgotICogVGhpcyBkb20td2Fsa2VyIGNvbGxlY3RzICJhcnRpZmFjdHMiIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmljIGRvbWFpbiA8YnI+Ci0gKiAoZS5nLiBVUEMpLiBDdXJyZW50bHkgdGhlc2UgYXJ0aWZhY3RzIGluY2x1ZGUgZnVuY3Rpb24gY2FsbHMKLSAqIGFuZCBjb25zdGFudHMuIEl0IGFkZCBtYXJrZXJzIHRvIHRoZSBzb3VyY2UgZmlsZSBmb3IgQyBjb2RlLCBtYXJraW5nIHRoZQotICogcG9zaXRpb24gb2YgdGhlIGFydGlmYWN0cyBmb3VuZC4KLSAqIAotICogVGhpcyB2ZXJzaW9uIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgaW5zdGVhZCBvZiBkZWxlZ2F0aW5nIHRvPGJyPgotICogTXBpR2VuZXJhbEFTVFZpc2l0b3JCZWhhdmlvci4KLSAqCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVQQ0NBU1RWaXNpdG9yIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWD0idXBjXyI7Ci0KLSAgICB7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRFeHByZXNzaW9ucyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRUcmFuc2xhdGlvblVuaXQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVUENDQVNUVmlzaXRvcihMaXN0IHVwY0luY2x1ZGVzLCBTdHJpbmcgZmlsZU5hbWUsIFNjYW5SZXR1cm4gbXNyKQotICAgIHsKLSAgICAgICAgc3VwZXIodXBjSW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpOwotCQlBUlRJRkFDVF9DQUxMID0gIlVQQyBDYWxsIjsKLQkJQVJUSUZBQ1RfQ09OU1RBTlQ9IlVQQyBDb25zdGFudCI7Ci0gICAgfQotCi0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb24pCi0gICAgICovCi0gICAgcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikgewotICAgICAgICAgICAgSUFTVEV4cHJlc3Npb24gYXN0RXhwciA9ICgoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBhc3RFeHByLmdldFJhd1NpZ25hdHVyZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZ1bmMgc2lnbmF0dXJlPSIgKyBzaWduYXR1cmUpOwotICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5zdGFydHNXaXRoKFBSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXN0RXhwciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSUFTVE5hbWUgZnVuY05hbWUgPSAoKElBU1RJZEV4cHJlc3Npb24pIGFzdEV4cHIpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmNOYW1lKGZ1bmNOYW1lLCBhc3RFeHByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RMaXRlcmFsRXhwcmVzc2lvbikgewotICAgICAgICAgICAgcHJvY2Vzc01hY3JvTGl0ZXJhbCgoSUFTVExpdGVyYWxFeHByZXNzaW9uKSBleHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwQm9vay5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJhOTM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvZWRpdG9ySGVscC9VUENDSGVscEJvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5lZGl0b3JIZWxwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkNIZWxwQm9va0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5GdW5jdGlvblN1bW1hcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci0KLS8qKgotICogVVBDIGhlbHAgYm9vayAtIHRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGhvdmVyIGhlbHAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgKGFuZCBGMS9keW5hbWljIGhlbHAgYXMgd2VsbCkgcmVxdWlyZXMgYSBmaXggdG8gQ0RUIHBvc3QtNS4wLjAgcmVsZWFzZQotICogdG8gb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuVHJhbnNsYXRpb25Vbml0ICAtIHRvIHJlY29nbml6ZSBjb250ZW50LXR5cGUgb2YgVVBDIHRvIGJlIGEgZGVyaXZpYXRpdmUgKCJraW5kT2YiKSB0aGUgQyBjb250ZW50IHR5cGUuCi0gKiA8cD5TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMSAgCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUENDSGVscEJvb2sgZXh0ZW5kcyBDSGVscEJvb2tJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVVBDIEMgSGVscCBCb29rIjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsU3RyaW5nPiBkZXNjPW5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JCi0JcHVibGljIFVQQ0NIZWxwQm9vaygpIHsKLSAgICAgICAgc3VwZXIoVVBDUGx1Z2luLmdldFBsdWdpbklkKCkpOwotICAgICAgICAvLyBwb3B1bGF0ZSBkZXNjcmlwdGlvbiBtYXAgLSB0aGlzIGp1c3QgbWFrZXMgdGhlIGZ1bmNOYW1lMkZ1bmNJbmZvIGluaXQgbGluZXMgYSBiaXQgbW9yZSB0ZXJzZQotICAgICAgCi0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWRkcmZpZWxkIiwgIlJldHVybnMgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZSByZWZsZWN0aW5nIHRoZSA8cT5sb2NhbCBhZGRyZXNzPC9xPm9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci10by1zaGFyZWQgYXJndW1lbnQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWZmaW5pdHlzaXplIiwgIkEgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgbG9jYWwgcG9ydGlvbiBvZiB0aGUgZGF0YSBpbiBhIHNoYXJlZCBvYmplY3Qgd2l0aCBhZmZpbml0eSB0byA8Y29kZT50aHJlYWRpZDwvY29kZT4uIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2FsbG9jIiwgIkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxfYnJvYWRjYXN0IiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSB3aXRoIGFmZmluaXR5IHRvIGEgc2luZ2xlIHRocmVhZCB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgb24gZWFjaCB0aHJlYWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2xvY2tfYWxsb2MiLCAiRHluYW1pY2FsbHkgYWxsb2NhdGVzIGEgbG9jayBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuIFRoZSBsb2NrIGlzIGNyZWF0ZWQgaW4gYW4gdW5sb2NrZWQgc3RhdGUuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2V4Y2hhbmdlIiwgIkNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBqIHRvIHRoZSBqdGggYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBoYXMgYWZmaW5pdHkgdG8gdGhyZWFkIGkiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxfZ2F0aGVyIiwgICAgICJDb3BpZXMgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIHRoZSBpdGggYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBoYXMgYWZmaW5pdHkgdG8gYSBzaW5nbGUgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9nYXRoZXJfYWxsIiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIG9uZSBzaGFyZWQgbWVtb3J5IGFyZWEgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZCB0byB0aGUgaXRoIGJsb2NrIG9mIGEgc2hhcmVkIG1lbW9yeSBhcmVhIG9uIGVhY2ggdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9sb2NrX2FsbG9jIiwgIkR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhIGxvY2sgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGl0LiBUaGUgbG9jayBpcyBjcmVhdGVkIGluIGFuIHVubG9ja2VkIHN0YXRlLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9wZXJtdXRlIiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIGEgYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBwZXJtW2ldLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9zY2F0dGVyIiwgIkNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIGFuIGFyZWEgb2Ygc2hhcmVkIG1lbW9yeSB3aXRoIGFmZmluaXR5IHRvIGEgc2luZ2xlIHRocmVhZCB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxvYyIsICJBbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIG9mIGF0IGxlYXN0IG5ieXRlcyB3aXRoIGFmZmluaXR5IHRvIHRoZSBjYWxsaW5nIHRocmVhZC4iKTsgICAgICAKLSAgICAgICAgZGVzYy5wdXQoInVwY19mcmVlIiwgIkZyZWVzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzaGFyZWQgc3RvcmFnZSIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2dsb2JhbF9hbGxvYyIsIkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19nbG9iYWxfZXhpdCIsIkZsdXNoZXMgYWxsIEkvTywgcmVsZWFzZXMgYWxsIHN0b3JhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBleGVjdXRpb24gZm9yIGFsbCBhY3RpdmUgdGhyZWFkcy4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19nbG9iYWxfbG9ja19hbGxvYyIsICJEeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBsb2NrIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdC4gVGhlIGxvY2sgaXMgY3JlYXRlZCBpbiBhbiB1bmxvY2tlZCBzdGF0ZS4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19sb2NhbF9hbGxvYyIsIkRlcHJlY2F0ZWQuIFVzZSB1cGNfYWxsb2MgaW5zdGVhZC5cbkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UuIik7ICAgICAgCi0gICAgICAgIGRlc2MucHV0KCJ1cGNfbG9ja19hdHRlbXB0IiwgIkF0dGVtcHRzIHRvIHNldCB0aGUgc3RhdGUgb2YgYSBsb2NrIHRvIGxvY2tlZC4gUmV0dXJuIGNvZGUgaW5kaWNhdGVzIHByZXZpb3VzIHN0YXRlLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2xvY2tfZnJlZSIsICJGcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2suIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbG9ja190IiwgIlVQQyB0eXBlIGZvciBhIGxvY2siKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19sb2NrIiwgIlNldHMgdGhlIHN0YXRlIG9mIGEgbG9jayB0byBsb2NrZWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbWVtY3B5IiwgIkNvcGllcyBuIGNoYXJhY3RlcnMgZnJvbSBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggb25lIHRocmVhZCB0byBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggdGhlIHNhbWUgb3IgYW5vdGhlciB0aHJlYWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbWVtZ2V0IiwgIkNvcGllcyBuIGNoYXJhY3RlcnMgZnJvbSBhIHNoYXJlZCBvYmplY3Qgd2l0aCBhZmZpbml0eSB0byBhbnkgc2luZ2xlIHRocmVhZCB0byBhbiBvYmplY3Qgb24gdGhlIGNhbGxpbmcgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX21lbXNldCIsICJDb3BpZXMgYSB2YWx1ZSwgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIHRvIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5IHRvIGFueSBzaW5nbGUgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX3BoYXNlb2YiLCAiUmV0dXJucyB0aGUgcGhhc2UgY29tcG9uZW50IG9mIHRoZSBwb2ludGVyLXRvLXNoYXJlZCBhcmd1bWVudC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19yZXNldHBoYXNlIiwgIlJldHVybnMgYSBwb2ludGVyLXRvLXNoYXJlZCB3aGljaCBpcyBpZGVudGljYWwgdG8gaXRzIGlucHV0IGV4Y2VwdCB0aGF0IGl0IGhhcyB6ZXJvIHBoYXNlIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfdGhyZWFkb2YiLCAiUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRocmVhZCB0aGF0IGhhcyBhZmZpbml0eSB0byB0aGUgc2hhcmVkIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBhcmd1bWVudC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY191bmxvY2siLCAiU2V0cyB0aGUgc3RhdGUgb2YgYSBsb2NrIHRvIHVubG9ja2VkLiIpOyAKLSAgICAgICAgZGVzYy5wdXQoInNoYXJlZCIsICJ0aGlzIGlzIGEgc2hhcmVkIFVQQyBrZXl3b3JkIik7Ci0gICAgICAgIAotICAgICAgICAKLQkJLy8gcG9wdWxhdGUgZnVuYyBtYXAKLSAgICAgICAgLy9mdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19mcmVlIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoInVwY19mcmVlIiwgIiIsICJ1cGNfZnJlZSB0ZXN0IGRlc2NyaXB0aW9uIiwKLSAgICAgICAgLy8gICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJ1cGNfZnJlZSIsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSwgbnVsbCkpOwotICAgICAgICBTdHJpbmcgZGVzYyA9ICIiOyAvLyB3aWxsIGRvIG1hcCBsb29rdXAgZm9yIGRlc2NyaXB0aW9uIGluIGZwcyBtZXRob2QuCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FkZHJmaWVsZCIsIGZwcygidXBjX2FkZHJmaWVsZCIsICIiLCBkZXNjLCAic2l6ZV90IiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FmZmluaXR5c2l6ZSIsIGZwcygidXBjX2FmZmluaXR5c2l6ZSIsICIiLCBkZXNjLCAic2l6ZV90IiwgInNpemVfdCB0b3RhbHNpemUsIHNpemVfdCBuYnl0ZXMsIHNpemVfdCB0aHJlYWRpZCIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfYWxsX2FsbG9jIiwgZnBzKCJ1cGNfYWxsX2FsbG9jIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNpemVfdCBuYmxvY2tzLCBzaXplX3QgbmJ5dGVzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfYnJvYWRjYXN0IiwgZnBzKCJ1cGNfYWxsX2Jyb2FkY2FzdCIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9leGNoYW5nZSIsIGZwcygidXBjX2FsbF9leGNoYW5nZSIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9nYXRoZXJfYWxsIiwgZnBzKCJ1cGNfYWxsX2dhdGhlcl9hbGwiLCAiIiwgZGVzYywgInZvaWQiLCAic2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIHNoYXJlZCBjb25zdCB2b2lkICogcmVzdHJpY3Qgc3JjLCBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfZ2F0aGVyIiwgZnBzKCJ1cGNfYWxsX2dhdGhlciIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7ICAgICAgCQkKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfYWxsX2xvY2tfYWxsb2MiLCBmcHMoInVwY19hbGxfbG9ja19hbGxvYyIsICIiLCBkZXNjLCAidXBjX2xvY2tfdCIsICJ2b2lkIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfcGVybXV0ZSIsIGZwcygidXBjX2FsbF9wZXJtdXRlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2hhcmVkIGNvbnN0IGludCAqIHJlc3RyaWN0IHBlcm0sIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9zY2F0dGVyIiwgZnBzKCJ1cGNfYWxsX3NjYXR0ZXIiLCAiIiwgZGVzYywgInZvaWQiLCAic2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIHNoYXJlZCBjb25zdCB2b2lkICogcmVzdHJpY3Qgc3JjLCBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxvYyIsIGZwcygidXBjX2FsbG9jIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNpemVfdCBuYnl0ZXMiKSk7ICAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2ZyZWUiLCBmcHMoInVwY19mcmVlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2dsb2JhbF9hbGxvYyIsIGZwcygidXBjX2dsb2JhbF9hbGxvYyIsICIiLCBkZXNjLCAidm9pZCIsICJpbnQgc3RhdHVzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19nbG9iYWxfZXhpdCIsIGZwcygidXBjX2dsb2JhbF9leGl0IiwgIiIsIGRlc2MsICJ2b2lkIiwgImludCBzdGF0dXMiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2dsb2JhbF9sb2NrX2FsbG9jIiwgZnBzKCJ1cGNfZ2xvYmFsX2xvY2tfYWxsb2MiLCAiIiwgZGVzYywgInVwY19sb2NrX3QiLCAidm9pZCIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbG9jYWxfYWxsb2MiLCBmcHMoInVwY19sb2NhbF9hbGxvYyIsICIiLCBkZXNjLCAidm9pZCIsICJzaXplX3QgbmJsb2Nrcywgc2l6ZV90IG5ieXRlcyIpKTsgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2xvY2tfYXR0ZW1wdCIsIGZwcygidXBjX2xvY2tfYXR0ZW1wdCIsICIiLCBkZXNjLCAiaW50IiwgInVwY19sb2NrX3QgKnB0ciIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbG9ja19mcmVlIiwgZnBzKCJ1cGNfbG9ja19mcmVlIiwgIiIsIGRlc2MsICJ1cGNfbG9ja190IiwgInZvaWQiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2xvY2siLCBmcHMoInVwY19sb2NrIiwgIiIsIGRlc2MsICJ2b2lkIiwgInVwY19sb2NrX3QgKnB0ciIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbWVtY3B5IiwgZnBzKCJ1cGNfbWVtY3B5IiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG4iKSk7ICAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX21lbWdldCIsIGZwcygidXBjX21lbWdldCIsICIiLCBkZXNjLCAidm9pZCIsICJ2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG4iKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX21lbXNldCIsIGZwcygidXBjX21lbXNldCIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IG4iKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3BoYXNlb2YiLCBmcHMoInVwY19tZW1zZXQiLCAiIiwgZGVzYywgInNpemVfdCIsICJzaGFyZWQgdm9pZCAqcHRyIikpOyAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3Jlc2V0cGhhc2UiLCBmcHMoInVwY19yZXNldHBoYXNlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3RocmVhZG9mIiwgZnBzKCJ1cGNfdGhyZWFkb2YiLCAiIiwgZGVzYywgInNpemVfdCIsICJzaGFyZWQgdm9pZCAqcHRyIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY191bmxvY2siLCBmcHMoInVwY191bmxvY2siLCAiIiwgZGVzYywgInZvaWQiLCAidXBjX2xvY2tfdCAqcHRyIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInNoYXJlZCIsIGZwcygic2hhcmVkIiwgIiIsIGRlc2MsICIiLCAiIikpOwotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHRpdGxlCi0gICAgICAgIHNldFRpdGxlKFRJVExFKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGlucHV0dGluZyB0aGVzZSBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnkgYW5kIEZ1bmN0aW9uU3VtbWFyeSBhcmd1bWVudHMuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbmFtZXNwYWNlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIGlmIGVtcHR5IHdpbGwgZG8gbG9va3VwIGluIE1hcAotCSAqIEBwYXJhbSByZXR1cm5UeXBlCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElGdW5jdGlvblN1bW1hcnkgZnBzKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyByZXR1cm5UeXBlLCBTdHJpbmcgYXJncyl7Ci0JCWlmKGRlc2NyaXB0aW9uPT1udWxsIHx8IGRlc2NyaXB0aW9uLmxlbmd0aCgpPT0wKSB7Ci0JCQlkZXNjcmlwdGlvbj1nZXREZXNjKG5hbWUpOwotCQl9Ci0JCUlGdW5jdGlvblN1bW1hcnkgZnBzID0gbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwobmFtZSwgbmFtZXNwYWNlLCBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbChuYW1lLCByZXR1cm5UeXBlLCBhcmdzKSwgbnVsbCk7Ci0JCXJldHVybiBmcHM7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzYyhTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpZGVzYy5nZXQoa2V5KTsKLQkJaWYoZGVzY3JpcHRpb249PW51bGwpCi0JCQlkZXNjcmlwdGlvbj1rZXkrIiBkZXNjcmlwdGlvbiI7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMQotCSAqICgiQ0hlbHBQcm92aWRlciBub3QgY2FsbGVkIGZvciBVUEMiKQotCSAqIHNvIHRoYXQgVVBDIGhlbHAgd2lsbCBnZXQgY2FsbGVkLgotCSAqIENEVCBidWcgZml4IHJlcXVpcmVkIGZvciB0aGlzIHRvIHdvcmsgb3RoZXJ3aXNlLgotCSAqIEZvciBleGFtcGxlLCBpbiBUcmFuc2xhdGlvblVuaXQgdG8gbWFrZSB0aGUgVVBDIHR5cGUgJ2luaGVyaXQnIGZyb20gdGhlIEMgdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHJldHVybnMgYW4gaW52YWxpZCBudW1iZXIgYXMgYSB3b3JrYXJvdW5kLgotCSAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBwYXJ0IG9mIHRoZSBzd2l0Y2ggaW4gQ0hlbHBCb29rRGVzY3JpcHRvci5tYXRjaGVzKCkKLQkgKiB0byBleGVjdXRlIGFuZCB0aGUgVVBDIGhlbHAgd2lsbAotCSAqIG1hdGNoIGZvciBhbGwgZmlsZXMuIE5vdCBwcmV0dHkgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuVHJhbnNsYXRpb25Vbml0Ci0JICogCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikvLyBqdXN0IGZvciB0aGUgamF2YWRvYyBjb21tZW50IHRvIG5vdCBnZXQgd2FybmluZyA6KQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0Q0hlbHBUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwSW5mb1Byb3ZpZGVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2VkaXRvckhlbHAvVVBDQ0hlbHBJbmZvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2OGIzNi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2VkaXRvckhlbHAvVVBDQ0hlbHBJbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5DSGVscFByb3ZpZGVySW1wbDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBJQ0hlbHBQcm92aWRlciBhbmQgcHJvdmlkZXMgVVBDIGluZm9ybWF0aW9uIDxicj4KLSAqIChGMSwgaG92ZXIsIGNvbnRlbnQgYXNzaXN0LCBldGMuKQotICAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgIHJlcXVpcmVzIGEgZml4IHRvIENEVCBwb3N0LTUuMC4wIHJlbGVhc2UKLSAqIHRvIG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLm1vZGVsLlRyYW5zbGF0aW9uVW5pdCAgLSB0byByZWNvZ25pemUgY29udGVudC10eXBlIG9mIFVQQyB0byBiZSBhIGRlcml2aWF0aXZlICgia2luZE9mIikgdGhlIEMgY29udGVudCB0eXBlLgotICogPHA+U2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzczMzEgIAotICogPHA+RnVydGhlciBub3RlOiBhIHdvcmthcm91bmQgaGFzIGJlZW4gYXBwbGllZCBpbiBVQ0NDSGVscEJvb2sgdG8gbm90IHJlcXVpcmUgdGhlIENEVCBwYXRjaAotICogCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFVQQ0NIZWxwSW5mb1Byb3ZpZGVyIGV4dGVuZHMgQ0hlbHBQcm92aWRlckltcGwgewotCi0JcHVibGljIFVQQ0NIZWxwSW5mb1Byb3ZpZGVyKCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVVBDQ0hlbHBJbmZvUHJvdmlkZXIgY3RvcigpLi4uIik7Ly9kZWJ1ZyBvbmx5ICwgdG8gc2VlIHdoZW4gY2FsbGVkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaGVscEJvb2sgPSBuZXcgVVBDQ0hlbHBCb29rKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJVUENDSGVscEluZm9Qcm92aWRlciBpbml0aWFsaXplKCkuLi4iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL3ByZWZzL1VQQ1ByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL3ByZWZzL1VQQ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDQ5YjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9wcmVmcy9VUENQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QYXRoRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgYmFzZWQgb24gRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotICogCi0gKiBAYXV0aG9yIHh1ZQotICovCi0KLXB1YmxpYyBjbGFzcyBVUENQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCAgPSAiVVBDIGluY2x1ZGUgcGF0aHM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9CUk9XU0UgPSAiUGxlYXNlIGNob29zZSBhIGRpcmVjdG9yeToiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUD0iTG9jYXRpb24gb2YgVVBDIGhlbHAgZmlsZXM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfREVGQVVMVD0iVXNlIGRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUF9ERUZBVUxUX0lEPSJ1cGNIZWxwVXNlRGVmYXVsdCI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfTElOVVg9IlVzZSBMaW51eCBsb2NhdGlvbjogIjsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUF9BSVg9IlVzZSBBSVggbG9jYXRpb246ICI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfT1RIRVI9Ik90aGVyOiI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfT1RIRVJfSUQ9InVwY0hlbHBPdGhlciI7Ci0gICAgCi0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0xPQ0FUSU9OX0FJWD0iL29wdC9yc2N0L2xhcGkvZWNsaXBzZS9oZWxwIjsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfTE9DQVRJT05fTElOVVg9Im9wdC9pYm1ocGMvbGFwaS9lY2xpcHNlL2hlbHAiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfV0hJQ0hfSEVMUF9JRD0iZGVmYXVsdCI7ICAvLyBhbHRlcm5hdGl2ZXMgYXJlOiBkZWZhdWx0LCBhaXgsIGxpbnV4LCBvdGhlcgotCi0gICAgcHVibGljIFVQQ1ByZWZlcmVuY2VQYWdlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKEZMQVQpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVQQ1ByZWZlcmVuY2VQYWdlKGludCBzdHlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0eWxlKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUENQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSwgaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIGltYWdlLCBzdHlsZSk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVBDUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLCBpbnQgc3R5bGUpCi0gICAgewotICAgICAgICBzdXBlcih0aXRsZSwgc3R5bGUpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdCBwcmVmZXJlbmNlIHN0b3JlIGFuZCBzZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByZWZlcmVuY2VTdG9yZSgpCi0gICAgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gVVBDUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKQotICAgIHsKLSAgICAgICAgUGF0aEVkaXRvciBwYXRoRWRpdG9yID0gbmV3IFBhdGhFZGl0b3IoVVBDSURzLlVQQ19JTkNMVURFUywgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCwKLSAgICAgICAgICAgICAgICBJTkNMVURFU19QUkVGRVJFTkNFX0JST1dTRSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKHBhdGhFZGl0b3IpOwotCi0gICAgICAgIC8vIlVzZSBkZWZhdWx0PyIKLS8vICAgICAgICBCb29sZWFuRmllbGRFZGl0b3IgYmVkID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcihVUENfSEVMUF9ERUZBVUxUX0lELFVQQ19IRUxQX0RFRkFVTFQsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0vLyAgICAgICAgYWRkRmllbGQoYmVkKTsKLSAgLyogICAgICAKLSAgICAgICAgaW50IG51bUNvbD0xOwotICAgIAlSYWRpb0dyb3VwRmllbGRFZGl0b3IgY2hvaWNlRkUgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFVQQ19XSElDSF9IRUxQX0lELCBVUENfSEVMUCwgbnVtQ29sLCBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJeyBVUENfSEVMUF9ERUZBVUxULCAiY2hvaWNlMSIgfSwgCi0JCQkJeyBVUENfSEVMUF9BSVgrVVBDX0xPQ0FUSU9OX0FJWCwgImNob2ljZTIiIH0sIAotCQkJCXsgVVBDX0hFTFBfTElOVVgrVVBDX0xPQ0FUSU9OX0xJTlVYLCAiQ2hvaWNlMyIgfSwKLQkJCQl7IFVQQ19IRUxQX09USEVSLCAiQ2hvaWNlNCIgfX0sCi0JCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgCWFkZEZpZWxkKGNob2ljZUZFKTsKLSAgICAJCi0gICAgCVN0cmluZ0ZpZWxkRWRpdG9yIG90aGVyTG9jPW5ldyBTdHJpbmdGaWVsZEVkaXRvcihVUENfSEVMUF9PVEhFUl9JRCwgVVBDX0hFTFBfT1RIRVIsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgCWFkZEZpZWxkKG90aGVyTG9jKTsKLSAgICAJKi8KLSAgICAJCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy92aWV3cy9VUENBcnRpZmFjdFZpZXcuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvdmlld3MvVVBDQXJ0aWZhY3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzI4ZDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy92aWV3cy9VUENBcnRpZmFjdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnZpZXdzLlNpbXBsZVRhYmxlTWFya2VyVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci0KLQotCi0vKioKLSAqIEEgVVBDIGFydGlmYWN0IHZpZXcgYmFzZWQgb24gU2ltcGxlVGFibGVWaWV3IDxicj4KLSAqIE5vdGUgdGhhdCB0aGUgSUQgbXVzdCBiZSB1bmlxdWUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVQQ0FydGlmYWN0VmlldyBleHRlbmRzIFNpbXBsZVRhYmxlTWFya2VyVmlldwotewotICAgIHB1YmxpYyBVUENBcnRpZmFjdFZpZXcoKQotICAgIHsKLSAgICAgICAgLy8gaWYgeW91IG5lZWQgdG8gcmVhZCBpY29uIGltYWdlcywgZXRjLiBmcm9tIHRoZSBwbHVnLWluLCBiZSBzdXJlIHRvIHBhc3MKLSAgICAgICAgLy8gaW4gYW4gYWN0dWFsIFBsdWdpbiBjbGFzcyBpbnN0YW5jZSBmb3IgZmlyc3QgYXJnCi0gICAgICAgIHN1cGVyKFVQQ1BsdWdpbi5nZXREZWZhdWx0KCksICJVUEMgQXJ0aWZhY3QiLCAiVVBDIEFydGlmYWN0cyIsICJDb25zdHJ1Y3QiLCBVUENJRHMuTUFSS0VSX0lEKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Q4YjQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSJvcmcvZWNsaXBzZS9jZHQvbWFuYWdlZGJ1aWxkZXIvdWkvdGVzdHMvd2l6YXJkUGFnZXMvTVBJUHJvamVjdFNldHVwUnVubmFibGUuamF2YSIga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5N2ZjNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1AZG90Ci1ub3Rlcy50eHQKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNTdiMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzNmI3ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMuTXBpV2l6YXJkc1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLnVpLAotIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5jZHQudWksCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmUKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuY2R0LnVpLndpemFyZHMsCi0gb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMsCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL2Fib3V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3YmEwYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjx0aXRsZT5BYm91dDwvdGl0bGU+PC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWE3YzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFRleGFzIEluc3RydW1lbnRzIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgc2FtcGxlcy8sXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjN2UyNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzIE5ldyBQcm9qZWN0IFdpemFyZHMKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY1NjY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAKLSAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlbXBsYXRlcyI+Ci0gICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIGZpbHRlclBhdHRlcm49Ii4qIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnByb2plY3RzLk1QSWhlbGxvV29ybGRDUHJvamVjdCIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJ0ZW1wbGF0ZXMvTVBJaGVsbG9Xb3JsZENwcm9qZWN0L3RlbXBsYXRlLnhtbCIKLSAgICAgICAgICAgIHBhZ2VzQWZ0ZXJUZW1wbGF0ZVNlbGVjdGlvblByb3ZpZGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzLk1QSVByb2plY3RQcm9jZXNzUGFnZXMiCi0gICAgICAgICAgICBwcm9qZWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuZXhlIj4KLSAgICAgIDwvdGVtcGxhdGU+Ci0gICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgIGZpbHRlclBhdHRlcm49Ii4qIgotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnByb2plY3RzLk1QSXBpQ1Byb2plY3QiCi0gICAgICAgICAgICAgICAgICBsb2NhdGlvbj0idGVtcGxhdGVzL01QSXBpQ3Byb2plY3QvdGVtcGxhdGUueG1sIgotICAgICAgICAgICAgICAgICAgcGFnZXNBZnRlclRlbXBsYXRlU2VsZWN0aW9uUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMud2l6YXJkUGFnZXMuTVBJUHJvamVjdFByb2Nlc3NQYWdlcyIKLSAgICAgICAgICAgICAgICAgIHByb2plY3RUeXBlPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZS5leGUiPgotICAgICAgPC90ZW1wbGF0ZT4KLSAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgICAgICAgZmlsdGVyUGF0dGVybj0iLioiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQucHJvamVjdHMuTVBJcGlDUFBwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgbG9jYXRpb249InRlbXBsYXRlcy9NUElwaUNQUHByb2plY3QvdGVtcGxhdGUueG1sIgotICAgICAgICAgICAgICAgICAgcGFnZXNBZnRlclRlbXBsYXRlU2VsZWN0aW9uUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMud2l6YXJkUGFnZXMuTVBJUHJvamVjdFByb2Nlc3NQYWdlc0NQUCIKLSAgICAgICAgICAgICAgICAgIHByb2plY3RUeXBlPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZS5leGUiPgotICAgICAgPC90ZW1wbGF0ZT4KLSAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgZmlsdGVyUGF0dGVybj0iLioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQucHJvamVjdHMuTVBJZW1wdHlDcHJvamVjdCIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJ0ZW1wbGF0ZXMvTVBJZW1wdHlDcHJvamVjdC90ZW1wbGF0ZS54bWwiCi0gICAgICAgICAgICBwYWdlc0FmdGVyVGVtcGxhdGVTZWxlY3Rpb25Qcm92aWRlcj0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlcy5NUElQcm9qZWN0UHJvY2Vzc1BhZ2VzIgotICAgICAgICAgICAgcHJvamVjdFR5cGU9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLmV4ZSI+Ci0gICAgICA8L3RlbXBsYXRlPgotICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICBmaWx0ZXJQYXR0ZXJuPSIuKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5wcm9qZWN0cy5PcGVuTVBoZWxsb1dvcmxkQ1Byb2plY3QiCi0gICAgICAgICAgICBsb2NhdGlvbj0idGVtcGxhdGVzL09wZW5NUGhlbGxvV29ybGRDcHJvamVjdC90ZW1wbGF0ZS54bWwiCi0gICAgICAgICAgICBwYWdlc0FmdGVyVGVtcGxhdGVTZWxlY3Rpb25Qcm92aWRlcj0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlcy5PcGVuTVBQcm9qZWN0UHJvY2Vzc1BhZ2VzIgotICAgICAgICAgICAgcHJvamVjdFR5cGU9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLmV4ZSI+Ci0gICAgICA8L3RlbXBsYXRlPgotICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICBmaWx0ZXJQYXR0ZXJuPSIuKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5wcm9qZWN0cy5PcGVuTVBlbXB0eUNwcm9qZWN0IgotICAgICAgICAgICAgbG9jYXRpb249InRlbXBsYXRlcy9PcGVuTVBlbXB0eUNwcm9qZWN0L3RlbXBsYXRlLnhtbCIKLSAgICAgICAgICAgIHBhZ2VzQWZ0ZXJUZW1wbGF0ZVNlbGVjdGlvblByb3ZpZGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzLk9wZW5NUFByb2plY3RQcm9jZXNzUGFnZXMiCi0gICAgICAgICAgICBwcm9qZWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuZXhlIj4KLSAgICAgIDwvdGVtcGxhdGU+Ci0gICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUudGVtcGxhdGVQcm9jZXNzVHlwZXMiPgotICAgICAgICAgPHByb2Nlc3NUeXBlCi0gICAgICAgICAgICAgICBuYW1lPSJtcGlQcm9qZWN0UHJvY2VzcyIKLSAgICAgICAgICAgICAgIHByb2Nlc3NSdW5uZXI9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMud2l6YXJkUGFnZXMuTVBJUHJvamVjdFByb2Nlc3MiPgotICAgICAgICAgPC9wcm9jZXNzVHlwZT4KLSAgICAgICAgIDxwcm9jZXNzVHlwZQotICAgICAgICAgICAgICAgbmFtZT0ib3Blbk1QUHJvamVjdFByb2Nlc3MiCi0gICAgICAgICAgICAgICBwcm9jZXNzUnVubmVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzLk9wZW5NUFByb2plY3RQcm9jZXNzIj4KLSAgICAgICAgIDwvcHJvY2Vzc1R5cGU+Ci0gICAgICAgICA8cHJvY2Vzc1R5cGUKLSAgICAgICAgICAgICAgIG5hbWU9Im1waVByb2plY3RQcm9jZXNzQ1BQIgotICAgICAgICAgICAgICAgcHJvY2Vzc1J1bm5lcj0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlcy5NUElQcm9qZWN0UHJvY2Vzc0NQUCI+Ci0gICAgICAgICA8L3Byb2Nlc3NUeXBlPgotICAgICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NhbXBsZXMvdGVzdE1QSS5jIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NhbXBsZXMvdGVzdE1QSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmExNmNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zYW1wbGVzL3Rlc3RNUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIm1waS5oIgotLy8gU2FtcGxlIE1QSSBwcm9ncmFtCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKXsKLQlwcmludGYoIkhlbGxvIE1QSSBQVFAgV29ybGQhXG4iKTsJCi0JaW50ICBteV9yYW5rOyAvKiByYW5rIG9mIHByb2Nlc3MgKi8KLQlpbnQgIHA7ICAgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlpbnQgc291cmNlOyAgIC8qIHJhbmsgb2Ygc2VuZGVyICovCi0JaW50IGRlc3Q7ICAgICAvKiByYW5rIG9mIHJlY2VpdmVyICovCi0JaW50IHRhZz0wOyAgICAvKiB0YWcgZm9yIG1lc3NhZ2VzICovCi0JY2hhciBtZXNzYWdlWzEwMF07ICAgICAgICAvKiBzdG9yYWdlIGZvciBtZXNzYWdlICovCi0JTVBJX1N0YXR1cyBzdGF0dXMgOyAgIC8qIHJldHVybiBzdGF0dXMgZm9yIHJlY2VpdmUgKi8KLQkKLQkvKiBzdGFydCB1cCBNUEkgKi8KLQkKLQlNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwotCQotCS8qIGZpbmQgb3V0IHByb2Nlc3MgcmFuayAqLwotCU1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZteV9yYW5rKTsgCi0JCi0JLyogZmluZCBvdXQgbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwotCU1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZwKTsgCi0JCi0JCi0JaWYgKG15X3JhbmsgIT0wKXsKLQkJLyogY3JlYXRlIG1lc3NhZ2UgKi8KLQkJc3ByaW50ZihtZXNzYWdlLCAiR3JlZXRpbmdzIGZyb20gcHJvY2VzcyAlZCEiLCBteV9yYW5rKTsKLQkJZGVzdCA9IDA7Ci0JCS8qIHVzZSBzdHJsZW4rMSBzbyB0aGF0ICdcMCcgZ2V0IHRyYW5zbWl0dGVkICovCi0JCU1QSV9TZW5kKG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSsxLCBNUElfQ0hBUiwKLQkJICAgZGVzdCwgdGFnLCBNUElfQ09NTV9XT1JMRCk7Ci0JfQotCWVsc2V7Ci0JCXByaW50ZigiRnJvbSBwcm9jZXNzIDA6IE51bSBwcm9jZXNzZXM6ICVkXG4iLHApOwotCQlmb3IgKHNvdXJjZSA9IDE7IHNvdXJjZSA8IHA7IHNvdXJjZSsrKSB7Ci0JCQlNUElfUmVjdihtZXNzYWdlLCAxMDAsIE1QSV9DSEFSLCBzb3VyY2UsIHRhZywKLQkJCSAgICAgIE1QSV9DT01NX1dPUkxELCAmc3RhdHVzKTsKLQkJCXByaW50ZigiJXNcbiIsbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JLyogc2h1dCBkb3duIE1QSSAqLwotCU1QSV9GaW5hbGl6ZSgpOyAKLQkKLQkKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy9NcGlXaXphcmRzUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvTXBpV2l6YXJkc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlkZjY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy9NcGlXaXphcmRzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gUmVzZWFyY2ggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyBmb3IgUExEVCBXaXphcmRzIChNUEkgJiBPcGVuTVApCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICovCi1wdWJsaWMgY2xhc3MgTXBpV2l6YXJkc1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBNcGlXaXphcmRzUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTXBpV2l6YXJkc1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXBpV2l6YXJkc1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gTXBpV2l6YXJkc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLnVpLnRlc3RzLlRlc3RzUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci51aS50ZXN0cyIsIHBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9BYnN0cmFjdFByb2plY3RXaXphcmRQYWdlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvd2l6YXJkUGFnZXMvQWJzdHJhY3RQcm9qZWN0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgzY2YyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9BYnN0cmFjdFByb2plY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3JwLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3JwLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZW1wbGF0ZWVuZ2luZS5BYnN0cmFjdFdpemFyZERhdGFQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQ29tbW9uIGJlaGF2aW9yIGJldHdlZW4gdGhlIGRpZmZlcmVudCBQTERUIG5ldyBwcm9qZWN0IHdpemFyZCBwYWdlcwotICogQGF1dGhvciBiZXRoCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9qZWN0V2l6YXJkUGFnZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkRGF0YVBhZ2V7Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmU7Ci0JcHJvdGVjdGVkIElQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZJRGluY2x1ZGVzOwotCi0JcHVibGljIEFic3RyYWN0UHJvamVjdFdpemFyZFBhZ2UoU3RyaW5nIHN0cmluZykgewotCQlzdXBlcihzdHJpbmcpOwotCX0KLQkvKioKLQkgKiBJbmZvcm0gdGhlIHVzZXIgdGhhdCBQTERUIHByZWZlcmVuY2VzIGhhdmUgbm90IGJlZW4gc2V0LCBhbmQgb2ZmZXIgdG8gc2V0IHRoZW0gbm93LAotCSAqIGFuZCByZXR1cm4gdGhlIGluY2x1ZGUgcGF0aC4KLQkgKiBAcGFyYW0gdHlwZSAtIGUuZy4gIk1QSSIgb3IgIk9wZW5NUCIgdGhlIHR5cGUgb2YgcHJlZmVyZW5jZXMgdGhhdCBhcmVuJ3Qgc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCAgU3RyaW5nIHNob3dOb1ByZWZzKFN0cmluZyB0eXBlLCBTdHJpbmcgcHJlZklEKSB7Ci0JCVNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkKLQkJLy9JUHJlZmVyZW5jZVBhZ2UgcHAgPSBuZXcgTVBJUHJlZmVyZW5jZVBhZ2UoKTsKLQkJLy9NZXNzYWdlRGlhbG9nV2l0aExpbmsgbWQgPSBuZXcgTWVzc2FnZURpYWxvZ1dpdGhMaW5rKHNoZWxsLCJNUEkiLCAiTVBJIHByZWZlcmVuY2VzIGhhdmUgbm90IGJlZW4gc2V0LiBDbGljayBiZWxvdyB0byBkbyBpdCBub3cuIiwiQ2xpY2sgaGVyZSB0byBhZGQgTVBJIHByZWZlcmVuY2VzcyBub3ciLHBwKTsKLQkJLy9pbnQgcmVzdWx0ID0gbWQub3BlbigpOwotCQkKLQkJU3RyaW5nIG1zZyA9IHR5cGUrIiBQcmVmZXJlbmNlcyBoYXZlIG5vdCBiZWVuIHNldC4gIERvIHlvdSB3YW50IHRvIHNldCB0aGVtIG5vdz8iOwotCQlib29sZWFuIGRvaXQgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgIk5vICIrdHlwZSsiIFByZWZlcmVuY2VzIiwgbXNnKTsKLQkJaWYoZG9pdCkgewotCQkJc2hvd1ByZWZlcmVuY2VEaWFsb2codHlwZSk7Ci0JCX0KLQkJU3RyaW5nIG1pcCA9IHByZWZlcmVuY2VTdG9yZS5nZXRTdHJpbmcocHJlZklEKTsKLQkJcmV0dXJuIG1pcDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNob3dQcmVmZXJlbmNlRGlhbG9nKFN0cmluZyB0eXBlKSB7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1nciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZVBhZ2UgcHJlZmVyZW5jZVBhZ2UgPSBnZXRQcmVmZXJlbmNlUGFnZSgpOwotCQlwcmVmZXJlbmNlUGFnZS5zZXRUaXRsZSh0eXBlKTsKLQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSBuZXcgUHJlZmVyZW5jZU5vZGUoIjEiLCBwcmVmZXJlbmNlUGFnZSk7Ci0JCW1nci5hZGRUb1Jvb3Qobm9kZSk7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhzaGVsbCwgbWdyKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkvLyBtdXN0IGRvIGRpYWxvZy5jcmVhdGUoKSBiZWZvcmUgc2V0dGluZyBtZXNzYWdlCi0JCWRpYWxvZy5zZXRNZXNzYWdlKHByZWZlcmVuY2VQYWdlLmdldFRpdGxlKCkpOyAKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0JYWJzdHJhY3QgSVByZWZlcmVuY2VQYWdlIGdldFByZWZlcmVuY2VQYWdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9NUElQcm9qZWN0UHJvY2Vzcy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWM0M2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA4IElCTSBDb3JwLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycC4gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUudGVtcGxhdGVlbmdpbmUuVGVtcGxhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlbXBsYXRlZW5naW5lLnByb2Nlc3MuUHJvY2Vzc0FyZ3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlbXBsYXRlZW5naW5lLnByb2Nlc3MuUHJvY2Vzc0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUudGVtcGxhdGVlbmdpbmUucHJvY2Vzcy5Qcm9jZXNzUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklNYW5hZ2VkQnVpbGRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklNYW5hZ2VkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLk1hbmFnZWRCdWlsZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMuTXBpV2l6YXJkc1BsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEFmdGVyIHRoZSBNUElQcm9qZWN0V2l6YXJkUGFnZSBydW5zLCBhbmQgd2UgZ2V0IE1QSSBpbmNsdWRlIHBhdGggZnJvbSB0aGUgdXNlciwKLSAqIHdlIGhhdmUgdGhpcyBvcHBvcnR1bml0eSB0byB1c2UgdGhhdCBpbmZvcm1hdGlvbiB0byBtb2RpZnkgdGhlIGluY2x1ZGUgcGF0aHMsIGJ1aWxkIGNtZCwgIGV0Yy4KLSAqIGluIHRoZSBwcm9qZWN0Ci0gKiAKLSAqIDxwPlRoaXMgaGFuZGxlcyBwbGFpbiBDIHByb2plY3RzOyBNUElQcm9qZWN0UHJvY2Vzc0NQUCBleHRlbmRzIHRoaXMgdG8gaGFuZGxlIEMrKyBwcm9qZWN0cwotICogCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElQcm9qZWN0UHJvY2VzcyBleHRlbmRzIFByb2Nlc3NSdW5uZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbj1mYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gd2l6VHJhY2VPbj1NUElQcm9qZWN0V2l6YXJkUGFnZS53aXphcmRUcmFjZU9uOwotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgdGVtcGxhdGVJRD0KLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLFN0cmluZz4gdmFsdWVTdG9yZTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9jZXNzKFRlbXBsYXRlQ29yZSB0ZW1wbGF0ZSwgUHJvY2Vzc0FyZ3VtZW50W10gYXJncywKLQkJCVN0cmluZyBwcm9jZXNzSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBQcm9jZXNzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmKHdpelRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJNUElQcm9qZWN0UHJvY2VzcygpLnJ1bigpLi4uIik7Ci0JCQotCQl2YWx1ZVN0b3JlPSB0ZW1wbGF0ZS5nZXRWYWx1ZVN0b3JlKCk7Ci0JCVN0cmluZyBwYWdlSUQgPSBNUElQcm9qZWN0V2l6YXJkUGFnZS5QQUdFX0lEOwotCi0JCU9iamVjdCBvYmogPSBnZXROZXdQcm9wVmFsdWUocGFnZUlELCBNUElQcm9qZWN0V2l6YXJkUGFnZS5ET19NUElfSU5DTFVERVMsIG51bGwpOwotCQkvLyB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm90aGluZyB3YXMgc2V0IGluIHRoZSBwYWdlRGF0YSBieSB0aGUgdXNlcgotCQlib29sZWFuIGRvTXBpSW5jbHVkZXMgPSBNUElQcm9qZWN0V2l6YXJkUGFnZS5nZXREZWZhdWx0VXNlTXBpSW5jbHVkZXMoKTsKLQkJaWYgKG9iaiAhPSBudWxsKQotCQkJZG9NcGlJbmNsdWRlcyA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSBvYmopOwotCQlpZiAoIWRvTXBpSW5jbHVkZXMpIHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG8gbm90IHNhdmUgTVBJIGluZm8gaW4gdGhpcyBwcm9qZWN0LiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLSAJCS8vIHRoaXMgcHJvY2VzcyBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGEgc2VwYXJhdGUgcHJvY2VzcyB3aGljaCBjcmVhdGVzIHRoZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2o9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh2YWx1ZVN0b3JlLmdldCgicHJvamVjdE5hbWUiKSk7Ci0JCWlmKCFwcm9qLmV4aXN0cygpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3QgZG9lcyBub3QgZXhpc3QhLiBRdWl0dGluZy4gTm8gTVBJIGluZm8gYWRkZWQgdG8gcHJvamVjdC4iKTsKLQkJCXJldHVybjsJCi0JCX0KLQotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdDogIiArIHByb2ouZ2V0TmFtZSgpKTsKLQotCQkvLyBDb2xsZWN0IHRoZSB2YWx1ZXMgdGhhdCB0aGUgdXNlciBlbnRlcmVkIG9uIHRoZSB3aXphcmQgcGFnZQotCQlTdHJpbmcgcHJvcElEID0gTVBJUHJvamVjdFdpemFyZFBhZ2UuSU5DTFVERV9QQVRIX1BST1BfSUQ7Ci0JCVN0cmluZyBuZXdJbmNsdWRlUGF0aCA9IGdldE5ld1Byb3BWYWx1ZShwYWdlSUQsIHByb3BJRCwiYzovbXBpY2gyL2luY2x1ZGUiKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBwcm9wOiAiK3Byb3BJRCsiPSIrbmV3SW5jbHVkZVBhdGgpOwotCQkKLQkJcHJvcElEID0gTVBJUHJvamVjdFdpemFyZFBhZ2UuTElCX1BST1BfSUQ7Ci0JCVN0cmluZyBuZXdMaWI9Z2V0TmV3UHJvcFZhbHVlKHBhZ2VJRCxwcm9wSUQsImxpYiIpOwotCQkKLQkJcHJvcElEPU1QSVByb2plY3RXaXphcmRQYWdlLkxJQlJBUllfU0VBUkNIX1BBVEhfUFJPUF9JRDsKLQkJU3RyaW5nIG5ld0xpYlNlYXJjaFBhdGg9Z2V0TmV3UHJvcFZhbHVlKHBhZ2VJRCxwcm9wSUQsImM6L21waWNoMi9saWIiKTsKLQkJCi0JCXByb3BJRD1NUElQcm9qZWN0V2l6YXJkUGFnZS5NUElfQ09NUElMRV9DT01NQU5EX1BST1BfSUQ7Ci0JCVN0cmluZyBtcGlDb21waWxlQ29tbWFuZD1nZXROZXdQcm9wVmFsdWUocGFnZUlELHByb3BJRCwibXBpY2MiKTsKLQkJCi0JCXByb3BJRD1NUElQcm9qZWN0V2l6YXJkUGFnZS5NUElfTElOS19DT01NQU5EX1BST1BfSUQ7Ci0JCVN0cmluZyBtcGlMaW5rQ29tbWFuZD1nZXROZXdQcm9wVmFsdWUocGFnZUlELHByb3BJRCwibXBpY2MiKTsKLQotCQlJTWFuYWdlZEJ1aWxkSW5mbyBpbmZvID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluZm8gPSBNYW5hZ2VkQnVpbGRNYW5hZ2VyLmdldEJ1aWxkSW5mbyhwcm9qKTsKLQkJCS8vIG5vdGU6IGFzc3VtZWQgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIG1hbmFnZWQgYnVpbGQgcHJvamVjdD8gd2lsbCB3ZSBnZXQgaGVyZSBpbiB0aGF0IGNhc2U/Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGQgaW5mbzogIiArIGluZm8pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNUElQcm9qZWN0UHJvY2Vzcy5ydW4oKSwgIitlLmdldE1lc3NhZ2UoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydChpbmZvIT1udWxsKTsKLQkJCi0JCUlNYW5hZ2VkUHJvamVjdCBtUHJvaiA9IGluZm8uZ2V0TWFuYWdlZFByb2plY3QoKTsKLQkJaWYodHJhY2VPbilzaG93T3B0aW9ucyhtUHJvaik7Ci0JCQotCQkvLyBhZGQgdGhlIGluY2x1ZGUgcGF0aCwgbGlua2VyLCBidWlsZCBjbWQsIGV0Yy4gIHZhbHVlcyB0byBhbGwgdGhlIGNvbmZpZ3VyYXRpb25zCi0JCUlDb25maWd1cmF0aW9uW10gY29uZmlncyA9IG1Qcm9qLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb24gY2YgPSBjb25maWdzW2ldOwotCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmZpZyAiICsgaSArICI6ICIgKyBjZi5nZXROYW1lKCkpOwotCQkJYWRkSW5jbHVkZVBhdGgoY2YsIG5ld0luY2x1ZGVQYXRoKTsKLQkJCWFkZExpbmtlck9wdChjZixuZXdMaWIsbmV3TGliU2VhcmNoUGF0aCk7Ci0JCQlzZXRDb21waWxlQ29tbWFuZChjZixtcGlDb21waWxlQ29tbWFuZCk7Ci0JCQlzZXRMaW5rQ29tbWFuZChjZixtcGlMaW5rQ29tbWFuZCk7CQkKLQkJfQotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiTVBJUHJvamVjdFByb2Nlc3MsIG5ld0luY2x1ZGVQYXRoOiAiK25ld0luY2x1ZGVQYXRoKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIiAgIG5ld0xpYjogIituZXdMaWIrIiAgbmV3TGliU3JjaFB0aDogIituZXdMaWJTZWFyY2hQYXRoKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGNvbXBpbGVDbWQ6ICIrbXBpQ29tcGlsZUNvbW1hbmQpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiICAgbGlua0NtZDogIittcGlMaW5rQ29tbWFuZCk7Ci0JCS8vIE1hbmFnZWRCdWlsZE1hbmdlci5zYXZlQnVpbGRJbmZvKC4uLikgYXNzdXJlcyB0aGF0IHRoZQotCQkvLyB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBpbiB0aGUgYnVpbGQgbW9kZWwsIG90aGVyd2lzZSB0aGV5IHdpbGwKLQkJLy8gYmUgbG9zdCB3aGVuIHlvdSBzaHV0IGRvd24gRWNsaXBzZS4KLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk1hbmFnZWRCdWlsZE1hbmFnZXIuc2F2ZUJ1aWxkSW5mby4uLiIpOwotCQkKLQkJTWFuYWdlZEJ1aWxkTWFuYWdlci5zYXZlQnVpbGRJbmZvKHByb2osIHRydWUpOwotCi0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gTXBpV2l6YXJkc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhIHZhbHVlIHRoYXQgd2FzIHBvc3NpYmx5IG9idGFpbmVkIGZyb20gdGhlIHVzZXIgb24gdGhlIGFzc29jaWF0ZWQgd2l6YXJkIHBhZ2UuCi0JICogQHBhcmFtIHBhZ2VJRCBUaGUgcGFnZUlEIGZvciBvdXIgd2l6YXJkIHBhZ2UKLQkgKiBAcGFyYW0gcHJvcElEIFRoZSBwcm9wSUQgb2YgdGhlIHZhbHVlIHdlIHdhbnQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbCBUaGUgZGVmYXVsdCB2YWx1ZSB0byB1c2UgaWYgdGhlIHVzZXIgZGlkbid0IHNlbGVjdCBhbnl0aGluZywKLQkgKiBvciBpZiB3ZSBoYXZlbid0IGdvdHRlbiBhcm91bmQgdG8gTEVUVElORyB0aGUgdXNlciBzZWxlY3QgYW55dGhpbmcgeWV0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld1Byb3BWYWx1ZShTdHJpbmcgcGFnZUlELCBTdHJpbmcgcHJvcElELCBTdHJpbmcgZGVmYXVsdFZhbCkgewotCQlPYmplY3Qgb2JqID0gdmFsdWVTdG9yZS5nZXQocGFnZUlEK01QSVByb2plY3RXaXphcmRQYWdlLkRPVCtwcm9wSUQpOwotCQkvLyBpZiBzZWxlY3Rpb24gbWFkZSBvbiBwYWdlLCBvYmogaXMgbm9uLW51bGwuCi0JCVN0cmluZyBuZXdWYWx1ZSA9IGRlZmF1bHRWYWw7Ci0JCVN0cmluZyBtc2c9IiAoIHVzZWQgZGVmYXVsdCB2YWx1ZSkiOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQltc2c9IiI7Ci0JCX0KLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oInByb3BJRD0iICsgcHJvcElEICsgIiAgdmFsdWU9IiArIG5ld1ZhbHVlK21zZyk7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEFkZCBhbiBpbmNsdWRlIHBhdGggZm9yIEMgY29tcGlsaW5nIHRvIHRoZSBleGlzdGluZyBpbmNsdWRlIHBhdGhzIG9mIHRoZSBnaXZlbgotCSAqIENvbmZpZ3VyYXRpb24uICBYTEMgaXMgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBmaW5kIGl0cyBpbmNsdWRlIHBhdGggb3B0aW9uOwotCSAqIGZvciBvdGhlciB0b29scywgd2UgYXNzdW1lIHRoZXJlIGlzIGEgc2luZ2xlIG9wdGlvbiBmb3IgaW5jbHVkZSBwYXRocywgc28gd2UgdGFrZQotCSAqIHRoZSBmaXJzdCBvbmUuCi0JICogCi0JICogQHBhcmFtIGNmCi0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvamVjdCAoZS5nLiBSZWxlYXNlLCBEZWJ1ZywgZXRjLikKLQkgKiBAcGFyYW0gbmV3SW5jbHVkZVBhdGgKLQkgKiAgICAgICAgICAgIGluY2x1ZGUgcGF0aChzKSB0byBhZGQuICBJZiBtb3JlIHRoYW4gb25lLCBzZXBhcmF0ZSBieQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlLnBhdGhTZXBhcmF0b3IsIHdoaWNoIGlzIHNlbWljb2xvbiBmb3IgV2luZG93cywgY29sb24gZm9yIE1hYy9MaW51eAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY2x1ZGVQYXRoKElDb25maWd1cmF0aW9uIGNmLCBTdHJpbmcgbmV3SW5jbHVkZVBhdGgpIHsKLQkJLy8gbm90ZTogY291bGQgYmUgPiAxIHBhdGggaW4gJ25ld0luY2x1ZGVQYXRoJwotCQlTdHJpbmcgZXh0ID0gImMiOwotCQlJVG9vbCBjZlRvb2wgPSBjZi5nZXRUb29sRnJvbUlucHV0RXh0ZW5zaW9uKGV4dCk7Ci0KLQkJLy9TdHJpbmcgaWQgPSBjZlRvb2wuZ2V0SWQoKTsgLy8gImNkdC5tYW5hZ2VkYnVpbGQudG9vbC54bGMuYy5jb21waWxlci5leGUuZGVidWcuMTQyMzI3MDc0NSIKLQkJU3RyaW5nIG5hbWUgPSBjZlRvb2wuZ2V0TmFtZSgpOy8vICJYTCBDIENvbXBpbGVyIgotCQlJT3B0aW9uIG9wdGlvbiA9IG51bGw7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoIlhMIEMiKSkgeyAvLyBzcGVjaWFsIGNhc2UgZm9yIFhMIEMgY29tcGlsZXIKLQkJCW9wdGlvbiA9IGNmVG9vbC5nZXRPcHRpb25CeUlkKCJ4bGMuYy5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocyIpOwotCQl9IGVsc2UgeyAvLyBvdGhlcndpc2Ugd2UgYXNzdW1lIHRoZXJlIGlzIG9ubHkgb25lIGluY2x1ZGUgcGF0aCBvcHRpb24uCi0JCQlvcHRpb24gPSBnZXRGaXJzdE9wdGlvbkJ5VHlwZShjZiwgY2ZUb29sLCBJT3B0aW9uLklOQ0xVREVfUEFUSCk7Ci0JCX0KLQkJaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBpbmNsdWRlUGF0aHMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbmNsdWRlUGF0aHMgPSBvcHRpb24uZ2V0SW5jbHVkZVBhdGhzKCk7Ci0JCQl9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCVN0cmluZ1tdIG5ld0luY2x1ZGVQYXRocyA9IGFkZChpbmNsdWRlUGF0aHMsIG5ld0luY2x1ZGVQYXRoKTsKLQkJCWlmICh0cmFjZU9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBhZGQgIiArIG5ld0luY2x1ZGVQYXRoICsgIiB0byBleGlzdGluZyBpbmNsdWRlUGF0aHM6ICIKLQkJCQkJCSsgdW5yb2xsKGluY2x1ZGVQYXRocykpOwotCQkJTWFuYWdlZEJ1aWxkTWFuYWdlci5zZXRPcHRpb24oY2YsIGNmVG9vbCwgb3B0aW9uLCBuZXdJbmNsdWRlUGF0aHMpOwotCQl9Ci0JCWVsc2V7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1QSVByb2plY3RQcm9jZXNzLCBubyBvcHRpb24gZm9yIGluY2x1ZGUgcGF0aHMgZm91bmQuIik7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEFkZCBhIG5ldyBsaW5rZXIgb3B0aW9uLiAgQXNzdW1lcyB0aGF0IHRoZXJlIGlzIE9ORSBpbnN0YW5jZSBvZiBhbiBvcHRpb24KLQkgKiBvZiB0eXBlIDxjb2RlPklPcHRpb24uTElCUkFSWV9QQVRIUzwvY29kZT4gYW5kIDxjb2RlPklPcHRpb24uTElCUkFSSUVTPC9jb2RlPi4KLQkgKiBUaGlzIG1ldGhvZCBhZGRzIHRoZSBsaWJOYW1lIGFuZCBsaWJQYXRoIHRvIHRoZXNlIHR3byBvcHRpb25zLgotCSAqIEBwYXJhbSBjZiB0aGUgQ29uZmlndXJhdGlvbiB0byB3aGljaCB3ZSB3YW50IHRvIGFkZCB0byBsaW5rZXIgb3B0aW9ucwotCSAqIEBwYXJhbSBsaWJOYW1lIHRoZSBsaWIgbmFtZSAoZS5nLiAibGliIikKLQkgKiBAcGFyYW0gbGliUGF0aCB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCBuYW1lIChlLmcuICJjOi9teXBhdGgvbGliIikKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaW5rZXJPcHQoSUNvbmZpZ3VyYXRpb24gY2YsIFN0cmluZyBsaWJOYW1lLCBTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgZXh0ID0gIm8iOwotCQlJVG9vbCBjZlRvb2wgPSBjZi5nZXRUb29sRnJvbUlucHV0RXh0ZW5zaW9uKGV4dCk7Ci0KLQkJSU9wdGlvbiBscE9wdCA9IGdldEZpcnN0T3B0aW9uQnlUeXBlKGNmLCBjZlRvb2wsIElPcHRpb24uTElCUkFSWV9QQVRIUyk7Ci0JCWFkZE9wdGlvblZhbHVlKGNmLCBjZlRvb2wsIGxwT3B0LCBsaWJQYXRoKTsKLQotCQlJT3B0aW9uIGxpYk9wdCA9IGdldEZpcnN0T3B0aW9uQnlUeXBlKGNmLCBjZlRvb2wsIElPcHRpb24uTElCUkFSSUVTKTsKLQkJYWRkT3B0aW9uVmFsdWUoY2YsIGNmVG9vbCwgbGliT3B0LCBsaWJOYW1lKTsKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb21waWxlQ29tbWFuZChJQ29uZmlndXJhdGlvbiBjZiwgU3RyaW5nIGJ1aWxkQ21kKSB7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJjb21waWxlIGNtZDogIitidWlsZENtZCk7Ci0JCUlUb29sIGNvbXBpbGVyID0gY2YuZ2V0VG9vbEZyb21JbnB1dEV4dGVuc2lvbigiYyIpOwotCQljb21waWxlci5zZXRUb29sQ29tbWFuZChidWlsZENtZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldExpbmtDb21tYW5kKElDb25maWd1cmF0aW9uIGNmLCBTdHJpbmcgYnVpbGRDbWQpIHsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImxpbmsgY21kOiAiK2J1aWxkQ21kKTsKLQkJSVRvb2wgbGlua2VyPWNmLmdldFRvb2xGcm9tSW5wdXRFeHRlbnNpb24oIm8iKTsKLQkJbGlua2VyLnNldFRvb2xDb21tYW5kKGJ1aWxkQ21kKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIEFkZCBhIHZhbHVlIHRvIGEgbXVsdGktdmFsdWVkIHRvb2wgb3B0aW9uPGJyPgotCSAqIChGb3IgZXhhbXBsZSwgYWRkIGEgcGF0aCB0byBpbmNsdWRlIHBhdGhzLCBvciBhIGxpYiB0byBsaWJyYXJpZXMgbGlzdCkKLQkgKiBAcGFyYW0gY2YgdGhlIENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gdG9vbCB0aGUgdG9vbCBpbiB3aGljaCB0byB1cGRhdGUgdGhlIG9wdGlvbgotCSAqIEBwYXJhbSBvcHRpb24gdGhlIG9wdGlvbiB0byB1cGRhdGUgCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgdG8gYWRkIHRvIHRoZSBsaXN0IG9mIGV4aXN0aW5nIHZhbHVlcyBpbiB0aGUgb3B0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3B0aW9uVmFsdWUoSUNvbmZpZ3VyYXRpb24gY2YsIElUb29sIHRvb2wsIElPcHRpb24gb3B0aW9uLCBTdHJpbmcgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWludCB0eXBlID0gb3B0aW9uLmdldFZhbHVlVHlwZSgpOwotCQkJU3RyaW5nW10gdmFsdWVMaXN0ID0gbnVsbDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJT3B0aW9uLklOQ0xVREVfUEFUSDoKLQkJCQl2YWx1ZUxpc3QgPSBvcHRpb24uZ2V0SW5jbHVkZVBhdGhzKCk7Ci0JCQkJdmFsdWVMaXN0ID0gYWRkKHZhbHVlTGlzdCx2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElPcHRpb24uTElCUkFSSUVTOgotCQkJCXZhbHVlTGlzdCA9IG9wdGlvbi5nZXRMaWJyYXJpZXMoKTsKLQkJCQl2YWx1ZUxpc3Q9YWRkTm90UGF0aCh2YWx1ZUxpc3QsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU9wdGlvbi5MSUJSQVJZX1BBVEhTOi8vIHRoaXMgaXMgdHlwZSBmb3IgbGlicmFyeSBzZWFyY2ggcGF0aCBjZHQgNC4wIAotCQkJCXZhbHVlTGlzdD1vcHRpb24uZ2V0QmFzaWNTdHJpbmdMaXN0VmFsdWUoKTsKLQkJCQl2YWx1ZUxpc3Q9YWRkTm90UGF0aCh2YWx1ZUxpc3QsdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJCi0JCQlkZWZhdWx0OgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTVBJUHJvamVjdFdpemFyZCBQcm9jZXNzIHBvc3Rwcm9jZXNzaW5nIChNUElQcm9qZWN0UHJvY2VzcyksIGNhbid0IGdldCB0eXBlIG9mIG9wdGlvbiBmb3IgIiArIG9wdGlvbi5nZXROYW1lKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIHVwZGF0ZSB0aGUgb3B0aW9uIGluIHRoZSBtYW5hZ2VkIGJ1aWxkZXIgb3B0aW9ucwotCQkJTWFuYWdlZEJ1aWxkTWFuYWdlci5zZXRPcHRpb24oY2YsIHRvb2wsIG9wdGlvbiwgdmFsdWVMaXN0KTsKLQotCQl9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1QSVByb2plY3RQcm9jZXNzLmFkZE9wdGlvblZhbHVlKCksICIrZS5nZXRNZXNzYWdlKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBvcHRpb25zIGZvciBhIHByb2plY3QuPGJyPgotCSAqIGUuZy4gZm9yIERlYnVnIGFuZCBSZWxlYXNlIGNvbmZpZ3VyYXRpb25zLCBnZXQgYWxsIHRoZSB0b29scyAoY29tcGlsZXIsIGxpbmtlciBldGMuKSB0aGVuIGZvciBlYWNoIHRvb2wsIAotCSAqIGdldCBhbGwgdGhlIG9wdGlvbnMgYW5kIHByaW50IHRoZW0uCi0JICogCi0JICogSVJlc291cmNlIHJlc291cmNlPSAuLi4gOy8vIGNhbiBiZSBhbnkgcmVzb3VyY2UsIEkgdXNlIHByb2plY3QuCi0gICAgICogSU1hbmFnZWRCdWlsZEluZm8gbWJvID0gTWFuYWdlZEJ1aWxkTWFuYWdlci5nZXRCdWlsZEluZm8ocmVzb3VyY2UpOwotICAgICAqIElNYW5hZ2VkUHJvamVjdCBtcD1tYm8uZ2V0TWFuYWdlZFByb2plY3QoKTsKLQkgKiA8YnI+Ci0JICogVGhpcyBoZWxwcyBpbiBmaWd1cmluZyBvdXQgd2hhdCB0aGV5IGFyZSwgYW5kIHdoYXQgeW91IHdhbnQgdG8gY2hhbmdlLgotCSAqIFNvbWUgc2FtcGxlIG91dHB1dCBpcyBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvaiB0aGUgKG1hbmFnZWQpIHByb2plY3QgZm9yIHdoaWNoIHByaW50IGFsbCB0aGlzIHN0dWZmLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dPcHRpb25zKElNYW5hZ2VkUHJvamVjdCBwcm9qKSB7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJNYW5hZ2VkIFByb2plY3Q6ICIrcHJvai5nZXROYW1lKCkpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUGF0aC5TRVBBUkFUT1I9IitQYXRoLlNFUEFSQVRPUik7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJQYXRoLkRFVklDRV9TRVBBUkFUT1I9IitQYXRoLkRFVklDRV9TRVBBUkFUT1IpOwotCQlJQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBwcm9qLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbiBjZiA9IGNvbmZpZ3NbaV07Ci0JCQkJSVRvb2xbXSBhbGxUb29scyA9IGNmLmdldFRvb2xzKCk7Ci0KLQkJCQlpbnQgbnVtVG9vbHMgPSBhbGxUb29scy5sZW5ndGg7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb25maWcgIiArIGkgKyAiOiAiICsgY2YuZ2V0TmFtZSgpKyAiIGhhcyAiK251bVRvb2xzKyIgdG9vbHMuIik7Ci0KLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGFsbFRvb2xzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCUlUb29sIHRvb2wgPSBhbGxUb29sc1trXTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIFRvb2wgIiArIGsgKyAiOiAiICsgdG9vbC5nZXROYW1lKCkpOwotCQkJCQkvL2Jvb2xlYW4gcmM9dG9vbC5zZXRUb29sQ29tbWFuZCgiZm9vIik7Ci0JCQkJCVN0cmluZyB0b29sQ21kPXRvb2wuZ2V0VG9vbENvbW1hbmQoKTsKLQkJCQkJU3RyaW5nIHRvb2xJRD10b29sLmdldElkKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBjbWQ9Iit0b29sQ21kKyIgIHRvb2xJRD0iK3Rvb2xJRCk7Ci0JCQkJCQotCQkJCQkKLQkJCQkJSU9wdGlvbltdIG9wdGlvbnMgPSB0b29sLmdldE9wdGlvbnMoKTsKLQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlPcHRpb24gb3B0ID0gb3B0aW9uc1tqXTsKLQkJCQkJCVN0cmluZyBmb3VuZE9wdGlvbklEID0gb3B0LmdldElkKCk7Ci0JCQkJCQlpbnQgdHlwZT1vcHQuZ2V0VmFsdWVUeXBlKCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBvcHRpb24gIiArIGogKyAiICIgKyBvcHQuZ2V0TmFtZSgpICsgIiBpZD0iCi0JCQkJCQkJCSsgZm91bmRPcHRpb25JRCsiICB0eXBlPSIrc2hvd1R5cGUodHlwZSkpOwotCQkJCQkJaWYob3B0LmdldFZhbHVlVHlwZSgpPT1JT3B0aW9uLklOQ0xVREVfUEFUSCkgewotCQkJCQkJCXNob3dJbmNsdWRlUGF0aHMob3B0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29uZmlnICIgKyBpICsgIjogIiArIGNmLmdldE5hbWUoKQotCQkJCQkJKyAiPT09PT09PSBFbmQgb2YgQUxMIHRvb2xzICIpOwotCQkJCQotCQkJCS8vIGFub3RoZXIgd2F5IHRvIGFjY2VzcyBUb29sCi0JCQkJU3RyaW5nIGV4dCA9ICJjIjsKLQkJCQlJVG9vbCBjZlRvb2wgPSBjZi5nZXRUb29sRnJvbUlucHV0RXh0ZW5zaW9uKGV4dCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb29sIGJ5IGV4dDogIiArIGV4dCArICIgaXM6ICIgKyBjZlRvb2wuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJCQkvLyBMb29rIGZvciBpbmNsdWRlIHBhdGgKLQkJCQlJT3B0aW9uIG9wdGlvbiA9IGdldEZpcnN0T3B0aW9uQnlUeXBlKGNmLCBjZlRvb2wsIElPcHRpb24uSU5DTFVERV9QQVRIKTsKLQkJCQlpZiAob3B0aW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9uYW1lID0gb3B0aW9uLmdldE5hbWUoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJPcHRpb24gIiArIG9wdGlvbi5nZXRJZCgpICsgIiBpcyAiICsgb25hbWUpOwotCQkJCQlzaG93SW5jbHVkZVBhdGhzKG9wdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgU3lzdGVtLm91dC5wcmludGxuKCJObyBpbmNsdWRlIHBhdGggb3B0aW9uIGZvdW5kLiAiKTsKLQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCXByb3RlY3RlZCBTdHJpbmcgc2hvd1R5cGUoaW50IHR5cGUpewotCQlpZih0eXBlPT1JT3B0aW9uLklOQ0xVREVfUEFUSCkgcmV0dXJuIHR5cGUrIiAoSU9wdGlvbi5JTkNMVURFX1BBVEgpIjsKLQkJaWYodHlwZT09SU9wdGlvbi5MSUJSQVJZX1BBVEhTKSByZXR1cm4gdHlwZSsiIChJT3B0aW9uLkxJQlJBUllfUEFUSFMpIjsKLQkJaWYodHlwZT09SU9wdGlvbi5MSUJSQVJJRVMpICAgICByZXR1cm4gdHlwZSsiIChJT3B0aW9uLkxJQlJBUklFUykiOwotCQlyZXR1cm4gdHlwZSsiICI7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIGluIGFuIG9wdGlvbiB3aGljaCBpcyBwcmVzdW1lZAotCSAqIHRvIGJlIHRoZSBpbmNsdWRlIHBhdGhzIG9wdGlvbi4KLQkgKiBAcGFyYW0gb3B0Ci0JICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dJbmNsdWRlUGF0aHMoSU9wdGlvbiBvcHQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCWFzc2VydCBvcHQuZ2V0VmFsdWVUeXBlKCkgPT0gSU9wdGlvbi5JTkNMVURFX1BBVEggOwotCQkvLyBpZiB0aGUgb3B0aW9uIGlzIGEgbGlzdCBvZiBpbmNsdWRlIHBhdGhzLCBkaXNwbGF5IHRoZW0uCi0JCVN0cmluZ1tdIGluY2x1ZGVQYXRocyA9IG9wdC5nZXRJbmNsdWRlUGF0aHMoKTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGluY2x1ZGVQYXRocy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCVN0cmluZyBwYXRoID0gaW5jbHVkZVBhdGhzW2luZGV4XTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgaW5jbHVkZSBwYXRoICIgKyBpbmRleCArICI6ICIgKyBwYXRoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWRkIG9uZSBvciBtb3JlIHBhdGhzIHRvIHRoZSBsaXN0IG9mIHBhdGhzCi0JICogCi0JICogQHBhcmFtIGV4aXN0aW5nUGF0aHMgdGhlIGV4aXN0aW5nIGxpc3Qgb2YgcGF0aHMgdG8gYWRkIHRvCi0JICogQHBhcmFtIG5ld1BhdGggdGhlIG5ldyBwYXRoIHRvIGFkZDsgbWF5IGJlID4xIGRpcmVjdG9yeSwgd2l0aCBwYXRoIGRlbGltaXRlciBqYXZhLmlvLkZpbGUucGF0aFNlcGFyYXRvciAKLQkgKiAodXN1YWxseSBzZW1pY29sb24gb3IgY29sb24pCi0JICogQHJldHVybiB0aGUgbWVyZ2VkIGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gYWRkKFN0cmluZ1tdIGV4aXN0aW5nUGF0aHMsIFN0cmluZyBuZXdQYXRoKSB7Ci0JCVN0cmluZyBwYXRoU2VwPWphdmEuaW8uRmlsZS5wYXRoU2VwYXJhdG9yOyAgLy8gc2VtaWNvbG9uIGZvciB3aW5kb3dzLCBjb2xvbiBmb3IgTWFjL0xpbnV4Ci0JCUxpc3Q8U3RyaW5nPiBuZXdQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmcgcGF0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ1BhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoID0gZXhpc3RpbmdQYXRoc1tpXTsKLQkJCW5ld1BhdGhMaXN0LmFkZChwYXRoKTsKLQkJfQotCQlTdHJpbmdbXSBuZXdQYXRoQXJyYXk9bmV3UGF0aC5zcGxpdChwYXRoU2VwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdQYXRoQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGggPSBuZXdQYXRoQXJyYXlbaV07Ci0JCQluZXdQYXRoTGlzdC5hZGQocGF0aCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIG5ld0FycmF5PShTdHJpbmdbXSluZXdQYXRoTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQlyZXR1cm4gbmV3QXJyYXk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgc2luZ2xlIHN0cmluZyB0byBhbiBhcnJheSBvZiBzdHJpbmdzCi0JICogQHBhcmFtIHN0ckxpc3QKLQkgKiBAcGFyYW0gbmV3U3RyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBhZGROb3RQYXRoKFN0cmluZ1tdIHN0ckxpc3QsIFN0cmluZyBuZXdTdHIpIHsKLQkJaW50IGxlbiA9IHN0ckxpc3QubGVuZ3RoOwotCQlTdHJpbmcgbmV3TGlzdFtdID0gbmV3IFN0cmluZ1tsZW4gKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJMaXN0LCAwLCBuZXdMaXN0LCAwLCBsZW4pOwotCQluZXdMaXN0W2xlbl0gPSBuZXdTdHI7Ci0JCXJldHVybiBuZXdMaXN0OwotCX0KLQkvKioKLQkgKiBTaW1wbGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGl0ZW1zIGluIGEgc3RyaW5nIGFycmF5Ci0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1bnJvbGwgKFN0cmluZ1tdIGxpc3QpewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0PW5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy9saXN0ID0gbmV3IFN0cmluZ1tdeyJvbmUiLCJ0d28ifTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obGlzdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0cmluZyA9IGxpc3RbaV07Ci0JCQlyZXN1bHQuYXBwZW5kKHN0cmluZyk7Ci0JCQlyZXN1bHQuYXBwZW5kKCIsICIpOwotCQl9Ci0JCWlmIChyZXN1bHQubGVuZ3RoKCkgPiAyKSB7Ci0JCQlyZXN1bHQuZGVsZXRlKHJlc3VsdC5sZW5ndGgoKSAtIDIsIHJlc3VsdC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBvcHRpb25zIG9mIGEgc3BlY2lmaWMgdHlwZS48YnI+Ci0JICogV2UgcmVhbGx5IG5lZWQgYW4gSVRvb2wuZ2V0T3B0aW9uc0J5VHlwZShpbnQpIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8KLQkgKiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBjZgotCSAqICAgICAgICAgICAgdGhlIElDb25maWd1cmF0aW9uIGluIHdoaWNoIHRvIHNlYXJjaAotCSAqIEBwYXJhbSBjZlRvb2wKLQkgKiAgICAgICAgICAgIHRoZSBJVG9vbCB3aG9zZSBvcHRpb25zIGFyZSBiZWluZyBzZWFyY2hlZAotCSAqIEBwYXJhbSBvcHRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgb3B0aW9uIHR5cGUgd2UgYXJlIGxvb2tpbmcgZm9yLCBlLmcuIElPcHRpb24uU09NRVRISU5HCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMaXN0PElPcHRpb24+IGdldE9wdGlvbnNCeVR5cGUoSUNvbmZpZ3VyYXRpb24gY2YsIElUb29sIGNmVG9vbCwgaW50IG9wdGlvblR5cGUpIHsKLQotCQkvLyBydW4gdGhydSBBTEwgb3B0aW9ucyBhbmQgY2hlY2sgdHlwZSBmb3IgZWFjaCwgcmV0dXJuaW5nIHRoZSBvbmVzIHRoYXQgbWF0Y2gKLQkJSU9wdGlvbltdIGFsbE9wdGlvbnMgPSBjZlRvb2wuZ2V0T3B0aW9ucygpOwotCQlMaXN0PElPcHRpb24+IGZvdW5kT3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SU9wdGlvbj4oKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE9wdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlPcHRpb24gb3B0aW9uID0gYWxsT3B0aW9uc1tpXTsKLQotCQkJaW50IG9UeXBlID0gMDsKLQkJCXRyeSB7Ci0JCQkJb1R5cGUgPSBvcHRpb24uZ2V0VmFsdWVUeXBlKCk7Ci0JCQl9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChvcHRpb25UeXBlID09IG9UeXBlKSB7Ci0JCQkJLy8gYWRkIGl0IHRvIHRoZSBsaXN0Ci0JCQkJZm91bmRPcHRpb25zLmFkZChvcHRpb24pOwotCQkJfQotCi0JCX0KLQkJLy9JT3B0aW9uW10gcmV0PSBmb3VuZE9wdGlvbnMudG9BcnJheShuZXcgSU9wdGlvbltmb3VuZE9wdGlvbnMuc2l6ZSgpXSk7Ci0JCXJldHVybiBmb3VuZE9wdGlvbnM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxpPmZpcnN0PC9pPiBvcHRpb24gb2YgdGhlIHNwZWNpZmllZCB0eXBlIGZyb20gdGhlIHRvb2wKLQkgKiBAcGFyYW0gY2YKLQkgKiBAcGFyYW0gY2ZUb29sCi0JICogQHBhcmFtIG9wdGlvblR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElPcHRpb24gZ2V0Rmlyc3RPcHRpb25CeVR5cGUoSUNvbmZpZ3VyYXRpb24gY2YsIElUb29sIGNmVG9vbCwgaW50IG9wdGlvblR5cGUpewotCQlMaXN0PElPcHRpb24+IGFsbE9wdGlvbnM9Z2V0T3B0aW9uc0J5VHlwZShjZixjZlRvb2wsb3B0aW9uVHlwZSk7Ci0JCWlmKGFsbE9wdGlvbnMuc2l6ZSgpPjApewotCQkJcmV0dXJuIGFsbE9wdGlvbnMuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotLyoqCi0gKiAKLSAqIFNvbWUgc2FtcGxlIHRvb2wgZGF0YSBmcm9tIHNob3dPcHRpb25zKCkgb24gV2luZG93cyBYUCB3aXRoIGN5Z3dpbiBUb29sIDE6Ci0gKiBHQ0MgQyBDb21waWxlcgotICogPHA+Ci0gKiAKLSAqIG9wdGlvbiAwIERvIG5vdCBzZWFyY2ggc3lzdGVtIGRpcmVjdG9yaWVzICgtbm9zdGRpbmMpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ucHJlcHJvY2Vzc29yLm5vc3RkaW5jPGJyPgotICogb3B0aW9uIDEgUHJlcHJvY2VzcyBvbmx5ICgtRSkKLSAqIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IucHJlcHJvY2Vzczxicj4KLSAqIG9wdGlvbiAyIERlZmluZWQgc3ltYm9scyAoLUQpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ucHJlcHJvY2Vzc29yLmRlZi5zeW1ib2xzPGJyPgotICogb3B0aW9uIDMgVW5kZWZpbmVkIHN5bWJvbHMgKC1VKQotICogaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZi5zeW1ib2w8YnI+Ci0gKiBvcHRpb24gNCBJbmNsdWRlIHBhdGhzICgtSSkgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUucGF0aHM8YnI+Ci0gKiBvcHRpb24gNSBPcHRpbWl6YXRpb24gTGV2ZWwKLSAqIGlkPWdudS5jLmNvbXBpbGVyLmN5Z3dpbi5leGUucmVsZWFzZS5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsPGJyPgotICogb3B0aW9uIDYgT3RoZXIgb3B0aW1pemF0aW9uIGZsYWdzIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24uZmxhZ3M8YnI+Ci0gKiBvcHRpb24gNyBEZWJ1ZyBMZXZlbAotICogaWQ9Z251LmMuY29tcGlsZXIuY3lnd2luLmV4ZS5yZWxlYXNlLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWw8YnI+Ci0gKiBvcHRpb24gOCBPdGhlciBkZWJ1Z2dpbmcgZmxhZ3MgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5vdGhlcjxicj4KLSAqIG9wdGlvbiA5IEdlbmVyYXRlIGdwcm9mIGluZm9ybWF0aW9uICgtcGcpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLmdwcm9mPGJyPgotICogb3B0aW9uIDEwIEdlbmVyYXRlIHByb2YgaW5mb3JtYXRpb24gKC1wKQotICogaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5wcm9mPGJyPgotICogb3B0aW9uIDExIENoZWNrIHN5bnRheCBvbmx5ICgtZnN5bnRheC1vbmx5KQotICogaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLndhcm5pbmdzLnN5bnRheDxicj4KLSAqIG9wdGlvbiAxMiBQZWRhbnRpYyAoLXBlZGFudGljKSBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3MucGVkYW50aWM8YnI+Ci0gKiBvcHRpb24gMTMgUGVkYW50aWMgd2FybmluZ3MgYXMgZXJyb3JzICgtcGVkYW50aWMtZXJyb3JzKQotICogaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLndhcm5pbmdzLnBlZGFudGljLmVycm9yPGJyPgotICogb3B0aW9uIDE0IEluaGliaXQgYWxsIHdhcm5pbmdzICgtdykgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLndhcm5pbmdzLm5vd2Fybjxicj4KLSAqIG9wdGlvbiAxNSBBbGwgd2FybmluZ3MgKC1XYWxsKSBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3MuYWxsd2Fybjxicj4KLSAqIG9wdGlvbiAxNiBXYXJuaW5ncyBhcyBlcnJvcnMgKC1XZXJyb3IpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3MudG9lcnJvcnM8YnI+Ci0gKiBvcHRpb24gMTcgT3RoZXIgZmxhZ3MgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLm1pc2Mub3RoZXI8YnI+Ci0gKiBvcHRpb24gMTggVmVyYm9zZSAoLXYpIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi5taXNjLnZlcmJvc2U8YnI+Ci0gKiBvcHRpb24gMTkgU3VwcG9ydCBBTlNJIHByb2dyYW1zICgtYW5zaSkgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLm1pc2MuYW5zaTxicj4KLSAqIAotICogVG9vbCAyOiBHQ0MgQyBMaW5rZXIgPGJyPgotICogb3B0aW9uIDUgTGlicmFyaWVzICgtbCkgaWQ9Z251LmMubGluay5vcHRpb24ubGliczxicj4KLSAqIG9wdGlvbiA2IExpYnJhcnkgc2VhcmNoIHBhdGggKC1MKSBpZD1nbnUuYy5saW5rLm9wdGlvbi5wYXRoczxicj4KLSAqIAotICovCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9NUElQcm9qZWN0UHJvY2Vzc0NQUC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzQ1BQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NGJkZDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzQ1BQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3JwLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycC4gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuSUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuSVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlQbHVnaW47Ci0KLS8qKgotICogCi0gKiBBZnRlciB0aGUgTVBJUHJvamVjdFdpemFyZFBhZ2VDUFAgcnVucywgYW5kIHdlIGdldCBNUEkgaW5jbHVkZSBwYXRoIGZyb20gdGhlIHVzZXIsCi0gKiB3ZSBoYXZlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gdXNlIHRoYXQgaW5mb3JtYXRpb24gdG8gbW9kaWZ5IHRoZSBpbmNsdWRlIHBhdGhzLCBidWlsZCBjbWRzIGV0Yy4KLSAqIGluIHRoZSBwcm9qZWN0Ci0gKiAKLSAqIDxwPlRoaXMgaGFuZGxlcyB0aGUgc3BlY2lhbCBkaWZmZXJlbmNlcyBmb3IgQysrIHByb2plY3RzLCBvdmVyIGFuZCBhYm92ZSBwbGFpbiBDIHByb2plY3RzLgotICogCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElQcm9qZWN0UHJvY2Vzc0NQUCBleHRlbmRzIE1QSVByb2plY3RQcm9jZXNzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0KLQkvKioKLQkgKiBOZWVkIHRvIHNldCBib3RoIEMgYW5kIEMrKyBidWlsZCBjb21tYW5kczsgdGhlIEMrKyBidWlsZCBjb21tYW5kIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmcuCi0JICogVGhlIEMgYnVpbGQgY29tbWFuZCB3YXMgbm90IHNvbGljaXRlZCBmcm9tIHRoZSB1c2VyIG9uIHRoZSB3aXphcmQgcGFnZSwgc28gd2UganVzdAotCSAqIGdldCB0aGUgZGVmYXVsdCB2YWx1ZSB0byB1c2UgaGVyZS4KLQkgKiA8cD5DKysgcHJvamVjdHMgdXNlIGJvdGggYSBDIGJ1aWxkIGNvbW1hbmQgYW5kIGEgQysrIGJ1aWxkIGNvbW1hbmQgaW4gdGhlaXIgc2V0dGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29tcGlsZUNvbW1hbmQoSUNvbmZpZ3VyYXRpb24gY2YsIFN0cmluZyBidWlsZENtZCkgewotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGlsZSBjbWQ6ICIrYnVpbGRDbWQpOwotCQkvLyBhY2Nlc3MgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZnJvbSB0aGUgTVBJIHBsdWdpbiBzbyB3ZSBjYW4gZ2V0IGMgY29tcGlsZXIgdG9vCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gTXBpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGNfYnVpbGRfY21kID0gcHJlZmVyZW5jZVN0b3JlLmdldFN0cmluZyhNcGlJRHMuTVBJX0JVSUxEX0NNRCk7Ci0JCQotCQkvLyAnYnVpbGRDbWQnIGFyZyB3ZSBhc3N1bWUgdG8gYmUgdGhlIHNhbWUgYXMgY3BwX2J1aWxkX2NtZCB1bmxlc3MgdGhlIHVzZXIgY2hhbmdlZCBpdCBpbiB0aGUgd2l6YXJkIHBhZ2UsIHNvIHdlIHVzZSB0aGF0Ci0JCS8vIGFuZCBzbyB3ZSBkb24ndCB1c2UgdGhpcwotCQkvL1N0cmluZyBjcHBfYnVpbGRfY21kID0gcHJlZmVyZW5jZVN0b3JlLmdldFN0cmluZyhNcGlJRHMuTVBJX0NQUF9CVUlMRF9DTUQpOwotCQkKLQkJSVRvb2wgY19jb21waWxlciA9IGNmLmdldFRvb2xGcm9tSW5wdXRFeHRlbnNpb24oImMiKTsKLQkJSVRvb2wgY3BwX2NvbXBpbGVyID0gY2YuZ2V0VG9vbEZyb21JbnB1dEV4dGVuc2lvbigiY3BwIik7CQotCQkKLQkJY19jb21waWxlci5zZXRUb29sQ29tbWFuZChjX2J1aWxkX2NtZCk7Ci0JCWNwcF9jb21waWxlci5zZXRUb29sQ29tbWFuZChidWlsZENtZCk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJDIGNvbXBpbGVyIGNtZDogIitjX2J1aWxkX2NtZCsiICBDKysgY29tcGlsZXIgY21kOiAiK2J1aWxkQ21kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvd2l6YXJkUGFnZXMvTVBJUHJvamVjdFByb2Nlc3NQYWdlcy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzUGFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3Nzc4ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvd2l6YXJkUGFnZXMvTVBJUHJvamVjdFByb2Nlc3NQYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycC4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnAuIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZW1wbGF0ZWVuZ2luZS5JUGFnZXNBZnRlclRlbXBsYXRlU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnVpLnRlbXBsYXRlZW5naW5lLklXaXphcmREYXRhUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLQotLyoqCi0gKiBXaXphcmQgUGFnZXMgZm9yIE1QSSBDIHByb2plY3RzCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElQcm9qZWN0UHJvY2Vzc1BhZ2VzIGltcGxlbWVudHMgSVBhZ2VzQWZ0ZXJUZW1wbGF0ZVNlbGVjdGlvblByb3ZpZGVyIHsKLQlJV2l6YXJkRGF0YVBhZ2VbXSBwYWdlczsKLQkKLQlwdWJsaWMgSVdpemFyZERhdGFQYWdlW10gY3JlYXRlQWRkaXRpb25hbFBhZ2VzKElXb3JrYmVuY2hXaXphcmQgd2l6YXJkLAotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0cnkgewotCQkJcGFnZXM9IG5ldyBJV2l6YXJkRGF0YVBhZ2VbXSB7bmV3IE1QSVByb2plY3RXaXphcmRQYWdlQygpfTsKLQkJCS8vIFRPRE8gLSBsb2cgZXJyb3IKLQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlwYWdlcz0gbmV3IElXaXphcmREYXRhUGFnZVswXTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCi0JcHVibGljIElXaXphcmREYXRhUGFnZVtdIGdldENyZWF0ZWRQYWdlcyhJV29ya2JlbmNoV2l6YXJkIHdpemFyZCkgewotCQlyZXR1cm4gcGFnZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzUGFnZXNDUFAuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9NUElQcm9qZWN0UHJvY2Vzc1BhZ2VzQ1BQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmI1YmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RQcm9jZXNzUGFnZXNDUFAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnAuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3JwLiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudWkudGVtcGxhdGVlbmdpbmUuSVBhZ2VzQWZ0ZXJUZW1wbGF0ZVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZW1wbGF0ZWVuZ2luZS5JV2l6YXJkRGF0YVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci0KLS8qKgotICogV2l6YXJkIFBhZ2VzIGZvciBNUEkgQysrIHByb2plY3RzIGFzIG9wcG9zZWQgdG8gQyBwcm9qZWN0cwotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJUHJvamVjdFByb2Nlc3NQYWdlc0NQUCBpbXBsZW1lbnRzIElQYWdlc0FmdGVyVGVtcGxhdGVTZWxlY3Rpb25Qcm92aWRlciB7Ci0JSVdpemFyZERhdGFQYWdlW10gcGFnZXM7Ci0JCi0JcHVibGljIElXaXphcmREYXRhUGFnZVtdIGNyZWF0ZUFkZGl0aW9uYWxQYWdlcyhJV29ya2JlbmNoV2l6YXJkIHdpemFyZCwKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCXBhZ2VzPSBuZXcgSVdpemFyZERhdGFQYWdlW10ge25ldyBNUElQcm9qZWN0V2l6YXJkUGFnZUNQUCgpfTsKLQkJCS8vIFRPRE8gLSBsb2cgZXJyb3IKLQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlwYWdlcz0gbmV3IElXaXphcmREYXRhUGFnZVswXTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCi0JcHVibGljIElXaXphcmREYXRhUGFnZVtdIGdldENyZWF0ZWRQYWdlcyhJV29ya2JlbmNoV2l6YXJkIHdpemFyZCkgewotCQlyZXR1cm4gcGFnZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RXaXphcmRQYWdlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvd2l6YXJkUGFnZXMvTVBJUHJvamVjdFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwMzA2Zi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvd2l6YXJkUGFnZXMvTVBJUHJvamVjdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3JwLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3JwLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5NcGlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUucHJlZnMuTVBJUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFdpemFyZCBQYWdlIGZvciBjb2xsZWN0aW5nIGluZm8gYWJvdXQgTVBJIHByb2plY3QgLSBhcHBlbmRlZCB0byBlbmQgb2YKLSAqICJDIHByb2plY3QiIG9yICJDKysgcHJvamVjdCIgd2l6YXJkLgotICogCi0gKiBBYnN0cmFjdCBjbGFzcyBlbmNhcHN1bGF0ZXMgY29tbW9uIGJlaGF2aW9yIGJldHdlZW4gQyBhbmQgQysrIAotICogPHA+Ci0gKiBUT0RPIHJlbW92ZSBkdXAgY29kZSwgc2hhcmUgTVBJJk9wZW5NUCB2ZXJzaW9uIGluIGEgY29tbW9uIGNsYXNzIGV0Yy4KLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNUElQcm9qZWN0V2l6YXJkUGFnZSBleHRlbmRzIEFic3RyYWN0UHJvamVjdFdpemFyZFBhZ2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHdpemFyZFRyYWNlT249ZmFsc2U7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9JRD0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlcy5NUElQcm9qZWN0V2l6YXJkUGFnZSI7Ci0KLQkvLyBUaGUgZm9sbG93aW5nIGFyZSBJRHMgZm9yIHN0b3JpbmcgaW5mbyBpbiBNQlNQYWdlRGF0YSBzbyBpdCBjYW4gYmUgcmV0cmlldmVkIGluIE1waVByb2plY3RQcm9jZXNzIChQcm9jZXNzUnVubmVyKQotCS8vIHdoZW4gdGhlIHdpemFyZCBpcyBkb25lLgotCS8qKgotCSAqIFN0b3JlIGluIE1CU1BhZ2VEYXRhICAod2l0aCB0aGlzIElEKSB3aGV0aGVyIHVzZXIgd2FudHMgdG8gaW5jbHVkZSBNUEkgaW5mbyBpbiB0aGUgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19NUElfSU5DTFVERVMgPSAiZG9NUElpbmNsdWRlcyI7Ci0JLyoqCi0JICogc3RvcmUgaW4gTUJTUGFnZURhdGEgKHdpdGggdGhpcyBJRCkgd2hhdCB0aGUgaW5jbHVkZSBwYXRoIHRvIE1QSSB3aWxsIGJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfUEFUSF9QUk9QX0lEID0gImluY2x1ZGVQYXRoIjsKLQkvKioKLQkgKiBzdG9yZSBpbiBNQlNQYWdlRGF0YSAod2l0aCB0aGlzIElEKSB3aGF0IHRoZSBsaWJyYXJ5IG5hbWUgZm9yIHRoZSBsaW5rZXIgaXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCX1BST1BfSUQgPSAibGliIjsKLQkvKioKLQkgKiBzdG9yZSBpbiBNQlNQYWdlRGF0YSAod2l0aCB0aGlzIElEKSB3aGF0IHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfU0VBUkNIX1BBVEhfUFJPUF9JRCA9ICJsaWJQYXRoIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNUElfQ09NUElMRV9DT01NQU5EX1BST1BfSUQgPSAibXBpQ29tcGlsZUNvbW1hbmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9MSU5LX0NPTU1BTkRfUFJPUF9JRCA9ICJtcGlMaW5rQ29tbWFuZCI7Ci0KLQlwcml2YXRlIFN0cmluZyBjdXJyZW50TXBpSW5jbHVkZVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExpYk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExpYlBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudE1waUNvbXBpbGVDb21tYW5kOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRNcGlMaW5rQ29tbWFuZDsKLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRNcGlJbmNsdWRlUGF0aDsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TXBpTGliTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TXBpTGliUGF0aDsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TXBpQnVpbGRDb21tYW5kOwotCQotCXByaXZhdGUgVGV4dCBpbmNsdWRlUGF0aEZpZWxkOwotCXByaXZhdGUgVGV4dCBsaWJOYW1lRmllbGQ7Ci0JcHJpdmF0ZSBUZXh0IGxpYlBhdGhGaWVsZDsKLQlwcml2YXRlIFRleHQgbXBpQ29tcGlsZUNvbW1hbmRGaWVsZCwgbXBpTGlua0NvbW1hbmRGaWVsZDsKLQkKLQlwcml2YXRlIExhYmVsIGluY2x1ZGVQYXRoTGFiZWwsIGxpYkxhYmVsLCBsaWJQYXRoTGFiZWwsIG1waUNvbXBpbGVDb21tYW5kTGFiZWwsIG1waUxpbmtDb21tYW5kTGFiZWw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uMjsKLQotCXByaXZhdGUgQnV0dG9uIHVzZURlZmF1bHRzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHVzZU1waVByb2plY3RTZXR0aW5nc0J1dHRvbjsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRVc2VNcGlJbmNsdWRlcz10cnVlOwotCQotCXByaXZhdGUgQnV0dG9uIG1waVNhbXBsZUJ1dHRvbjsKLQotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAyNTA7Ci0JLyoqCi0JICogQnkgZGVmYXVsdCB3ZSBETyB1c2UgTVBJIHByb2plY3Qgc2V0dGluZ3MgaW4gdGhpcyBwcm9qZWN0Ljxicj4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXNlTXBpUHJvamVjdFNldHRpbmdzPXRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzYyA9ICJNUEkgUHJvamVjdCBQYWdlIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNUElfUFJPSkVDVF9UWVBFX0M9IkMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QSV9QUk9KRUNUX1RZUEVfQ1BQPSJDKysiOwotCQotCS8qKgotCSAqIFRoZSBDRFQgbmV3IHByb2plY3Qgd2l6YXJkIHBhZ2UgZm9yIE1QSSBwcm9qZWN0cy4gIAotCSAqIEFkZHMgdGhlIGluY2x1ZGUgcGF0aHMsIGxpYnJhcnkgaW5mb3JtYXRpb24sIGV0Yy4gZm9yIGFuIE1QSSBwcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTVBJUHJvamVjdFdpemFyZFBhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCJNUEkgUHJvamVjdCBTZXR0aW5ncyIpOwotCQlwcmVmSURpbmNsdWRlcz1NcGlJRHMuTVBJX0lOQ0xVREVTOwotCQlpZih3aXphcmRUcmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiTVBJUHJvamVjdFdpemFyZFBhZ2UoKS5jdG9yLi4uIik7Ci0KLQkJLy9Db21tb25QbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsIlRlc3QgZXJyb3IiKTsKLQkJLy9Db21tb25QbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywiVGVzdCB3YXJuaW5nIik7Ci0JCQotCQkvLyBhY2Nlc3MgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZnJvbSB0aGUgTVBJIHBsdWdpbgotCQlwcmVmZXJlbmNlU3RvcmUgPSBNcGlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgbWlwPXByZWZlcmVuY2VTdG9yZS5nZXRTdHJpbmcocHJlZklEaW5jbHVkZXMpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiR290IG1waSBpbmNsdWRlIHByZWYgZnJvbSBvdGhlciBwbHVnaW46ICIrbWlwKTsKLQotCQkvLyBTZXQgdGhlIGRlZmF1bHRzIGhlcmUgaW4gdGhlIHdpemFyZCBwYWdlIGNvbnN0cnVjdG9yIGFuZCBqdXN0Ci0JCS8vIG92ZXJ3cml0ZSB0aGVtIGlmIHRoZSB1c2VyIGNoYW5nZXMgdGhlbS4KLQkJZGVmYXVsdE1waUluY2x1ZGVQYXRoID0gbWlwOwotCQlpZihkZWZhdWx0TXBpSW5jbHVkZVBhdGgubGVuZ3RoKCk9PTApIHsKLQkJCS8vIHdhcm4gaWYgbm8gTVBJIHByZWZlcmVuY2VzIGhhdmUgYmVlbiBzZXQgYW5kIGFsbG93IHVzZXIgdG8gc2V0IHRoZW0gcmlnaHQgdGhlcmUKLQkJCVN0cmluZyBuZXdNaXA9c2hvd05vUHJlZnMoIk1QSSIscHJlZklEaW5jbHVkZXMpOwotCQkJZGVmYXVsdE1waUluY2x1ZGVQYXRoPW5ld01pcDsKLQkJfQotCQlzZXREZWZhdWx0T3RoZXJOYW1lcyhkZWZhdWx0TXBpSW5jbHVkZVBhdGgpOwotCQkvLyB0aGUgZm9sbG93aW5nIHNldHMgd2hhdCB3aWxsIGJlIHJlbWVtYmVyZWQgd2hlbiB3ZSBsZWF2ZSB0aGUgcGFnZS4KLQkJc2V0Q3VycmVudE1waUluY2x1ZGVQYXRoKGRlZmF1bHRNcGlJbmNsdWRlUGF0aCk7Ci0KLQkJLy8gZGVmYXVsdE1waUJ1aWxkQ29tbWFuZCBkZXBlbmRzIG9uIHByb2plY3QgdHlwZSAod2lsbCBiZSBkaWZmZXJlbnQgZm9yIEMgdnMgQysrIGZvciBleGFtcGxlKQotCQlkZWZhdWx0TXBpQnVpbGRDb21tYW5kPWdldERlZmF1bHRNcGlCdWlsZENvbW1hbmQoKTsKLQkJc2V0Q3VycmVudE1waUNvbXBpbGVDb21tYW5kKGRlZmF1bHRNcGlCdWlsZENvbW1hbmQpOwotCQlzZXRDdXJyZW50TXBpTGlua0NvbW1hbmQoZGVmYXVsdE1waUJ1aWxkQ29tbWFuZCk7CQkKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRNcGlCdWlsZENvbW1hbmQoKTsKLQotCS8qKgotCSAqIFdhcm4gdXNlciB0aGF0IHRoZSBNUEkgcHJvamVjdCBwcmVmZXJlbmNlcyBhcmVuJ3Qgc2V0LCBhbmQgdGh1cyB0aGUgbmV3IHByb2plY3Qgd2l6YXJkIHdpbGwgbm90IGJlIHZlcnkgdXNlZnVsLgotCSAqIDxicj4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFscmVhZHlTaG93bjsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNob3dOb1ByZWZzMSgpIHsKLQkJaWYoIWFscmVhZHlTaG93bikgewotCQkJU2hlbGwgc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmPW5ldyBTdHJpbmdCdWZmZXIoIk5vIE1QSSBQcmVmZXJlbmNlcyBzZXQ7ICIpOwotCQkJYnVmLmFwcGVuZCgiRGVmYXVsdCBwcm9qZWN0IHNldHRpbmcgd2lsbCBiZSBtb3JlIHVzZWZ1bCBpZiBNUEkgcHJlZmVyZW5jZXMgYXJlIHNldCBmaXJzdC4gIik7Ci0JCQlidWYuYXBwZW5kKCJcblVzZSBXaW5kb3cgPiBQcmVmZXJlbmNlcyBhbmQgc2VsZWN0IFBhcmFsbGVsIExhbmd1YWdlIERldmVsb3BtZW50IFRvb2xzLCB3aGljaCBtYXkgYmUgdW5kZXIgUFRQIHByZWZlcmVuY2VzLiIpOwotCQkJYnVmLmFwcGVuZCgiWW91IGNhbiBjYW5jZWwgb3V0IG9mIG5ldyBwcm9qZWN0IHdpemFyZCB0byBlbnRlciBNUEkgcHJlZmVyZW5jZXMgbm93LiIpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhzaGVsbCwgIk5vIE1QSSBQcmVmZXJlbmNlcyBzZXQiLCBidWYudG9TdHJpbmcoKSk7Ci0JCQlhbHJlYWR5U2hvd249IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgbGliIG5hbWUgYW5kIGxpYiBwYXRoIGJhc2VkIG9uIHdoYXQgdGhlIAotCSAqIGluY2x1ZGUgcGF0aCBpcy4gIFdlIGFzc3VtZSBzb21ldGhpbmcgbGlrZQotCSAqIDxjb2RlPm1waUluY2x1ZGVwYXRoPS9teS9wYXRoL2luY2x1ZGU8L2NvZGU+Ci0JICogaW4gd2hpY2ggY2FzZSB3ZSBzZXQKLQkgKiA8Y29kZT5saWJOYW1lPSJsaWIiIDwvY29kZT5hbmQgPGNvZGU+IGRlZmF1bHRNcGlMaWJQYXRoPS9teS9wYXRoL2xpYjwvY29kZT4uCi0JICogPHA+Ci0JICogQWxzbywgc2V0IHRoZSBpbml0aWFsIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBNQlMgcGFnZSBkYXRhLAotCSAqIHNvIGlmIHVzZXIgY2hhbmdlcyBub3RoaW5nIG9uIHRoaXMgcGFnZSwgdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogd2lsbCBiZSBwaWNrZWQgdXAuCi0JICogCi0JICogQHBhcmFtIG1waUluY2x1ZGVQYXRoCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRPdGhlck5hbWVzKFN0cmluZyBtcGlJbmNsdWRlUGF0aCkgewotCQlkZWZhdWx0TXBpTGliTmFtZT0ibXBpIjsKLQkJc2V0Q3VycmVudE1waUxpYk5hbWUoZGVmYXVsdE1waUxpYk5hbWUpOwotCQkKLQkJLy8gaWYgPjEgcGF0aCBpbiBtcGkgaW5jbHVkZSBwYXRoLCB1c2UganVzdCB0aGUgZmlyc3QKLQkJLy8gb25lIHRvIGd1ZXNzIGF0IHRoZSBsaWJwYXRoCi0JCVN0cmluZyB0ZW1wUGF0aD1tcGlJbmNsdWRlUGF0aDsKLQkJaW50IHNlcExvYz10ZW1wUGF0aC5pbmRleE9mKGphdmEuaW8uRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0JCWlmKC0xIT1zZXBMb2MpIHsKLQkJCXRlbXBQYXRoPW1waUluY2x1ZGVQYXRoLnN1YnN0cmluZygwLCBzZXBMb2MpOwotCQl9Ci0JCUlQYXRoIHBhdGggPSBQYXRoLmZyb21PU1N0cmluZyh0ZW1wUGF0aCk7Ci0JCXBhdGg9cGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXBhdGg9cGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCi0JCWRlZmF1bHRNcGlMaWJQYXRoPXBhdGgudG9TdHJpbmcoKSsibGliIjsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImRlZmF1bHRNcGlMaWJQYXRoPSIrZGVmYXVsdE1waUxpYlBhdGgpOwotCQlzZXRDdXJyZW50TXBpTGliUGF0aChkZWZhdWx0TXBpTGliUGF0aCk7Ci0JCQotCQkvL3N0YW5kYXJkaXplIGZvcm1hdCBmb3IgbXBpIGluY2x1ZGUgcGF0aCwgdG9vCi0JCXBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhtcGlJbmNsdWRlUGF0aCk7Ci0JCVN0cmluZyB0ZW1wPXBhdGgudG9TdHJpbmcoKTsKLQkJdGVtcD1zdHJpcFRyYWlsaW5nU2VwYXJhdG9yKHRlbXApOwotCQlkZWZhdWx0TXBpSW5jbHVkZVBhdGg9dGVtcDsKLQkJc2V0Q3VycmVudE1waUluY2x1ZGVQYXRoKGRlZmF1bHRNcGlJbmNsdWRlUGF0aCk7CQotCQkJCi0JCXNldEN1cnJlbnRNcGlDb21waWxlQ29tbWFuZChkZWZhdWx0TXBpQnVpbGRDb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgd2hhdCB3aWxsIGJlIHJlbWVtYmVyZWQgZm9yIE1QSSBpbmNsdWRlIHBhdGggd2hlbiB3ZSBsZWF2ZSB0aGUgd2l6YXJkIHBhZ2UKLQkgKiAoc28gd2UgY2FuIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBQcm9jZXNzUnVubmVyIHRvIGFjdHVhbGx5IGRvIHRoZSBjaGFuZ2UKLQkgKiB0byB0aGUgcHJvamVjdCBpbmZvKQotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRNcGlJbmNsdWRlUGF0aChTdHJpbmcgcGF0aCkgewotCQljdXJyZW50TXBpSW5jbHVkZVBhdGggPSBwYXRoOwotCQlwYWdlRGF0YS5wdXQoUEFHRV9JRCtET1QrSU5DTFVERV9QQVRIX1BST1BfSUQsIHBhdGgpOwotCX0KLQkvKioKLQkgKiBUaGlzIHNldHMgd2hhdCB3aWxsIGJlIHJlbWVtYmVyZWQgZm9yIGxpYnJhcnkgbmFtZSB3aGVuIHdlIGxlYXZlIHRoZSB3aXphcmQgcGFnZQotCSAqIChzbyB3ZSBjYW4gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFByb2Nlc3NSdW5uZXIgdG8gYWN0dWFsbHkgZG8gdGhlIGNoYW5nZQotCSAqIHRvIHRoZSBwcm9qZWN0IGluZm8pCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudE1waUxpYk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJY3VycmVudE1waUluY2x1ZGVQYXRoID0gbmFtZTsKLQkJcGFnZURhdGEucHV0KFBBR0VfSUQrRE9UK0xJQl9QUk9QX0lELCBuYW1lKTsKLQl9Ci0JCi0JTWFwPFN0cmluZywgU3RyaW5nPiBwYWdlRGF0YT0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCi0JLyoqCi0JICogVGhpcyBzZXRzIHdoYXQgd2lsbCBiZSByZW1lbWJlcmVkIGZvciBsaWJyYXJ5IHNlYXJjaCBwYXRoIHdoZW4gd2UgbGVhdmUgdGhlIHdpemFyZCBwYWdlCi0JICogKHNvIHdlIGNhbiByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgUHJvY2Vzc1J1bm5lciB0byBhY3R1YWxseSBkbyB0aGUgY2hhbmdlCi0JICogdG8gdGhlIHByb2plY3QgaW5mbykKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50TXBpTGliUGF0aChTdHJpbmcgcGF0aCkgewotCQljdXJyZW50TXBpSW5jbHVkZVBhdGggPSBwYXRoOwotCQlwYWdlRGF0YS5wdXQoUEFHRV9JRCtET1QrTElCUkFSWV9TRUFSQ0hfUEFUSF9QUk9QX0lELCBwYXRoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRNcGlDb21waWxlQ29tbWFuZChTdHJpbmcgYnVpbGRDb21tYW5kKSB7Ci0JCWN1cnJlbnRNcGlDb21waWxlQ29tbWFuZCA9IGJ1aWxkQ29tbWFuZDsKLQkJcGFnZURhdGEucHV0KFBBR0VfSUQrRE9UK01QSV9DT01QSUxFX0NPTU1BTkRfUFJPUF9JRCwgYnVpbGRDb21tYW5kKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRNcGlMaW5rQ29tbWFuZChTdHJpbmcgYnVpbGRDb21tYW5kKSB7Ci0JCWN1cnJlbnRNcGlMaW5rQ29tbWFuZCA9IGJ1aWxkQ29tbWFuZDsKLQkJcGFnZURhdGEucHV0KFBBR0VfSUQrRE9UK01QSV9MSU5LX0NPTU1BTkRfUFJPUF9JRCwgYnVpbGRDb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGRlc2MgKyAiIG5hbWUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggaW4gb25lIG9mIHRoZSBwYXRoIGZpZWxkcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhdGhGcm9tUGF0aEZpZWxkKFRleHQgdGV4dEZpZWxkKSB7Ci0JCVVSSSBmaWVsZFVSSTsKLQkJdHJ5IHsKLQkJCWZpZWxkVVJJID0gbmV3IFVSSSh0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0ZXh0RmllbGQuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiBmaWVsZFVSSS5nZXRQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBpbmNsdWRlIHBhdGggZmllbGQgYmFzZWQgb24gdGhlIHNlbGVjdGVkIHBhdGguCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkUGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVJbmNsdWRlUGF0aEZpZWxkKFN0cmluZyBzZWxlY3RlZFBhdGgpIHsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk1QV1AudXBkYXRlTG9jYXRpb25GaWVsZCB0byAiICsgc2VsZWN0ZWRQYXRoKTsKLQkJaW5jbHVkZVBhdGhGaWVsZC5zZXRUZXh0KHNlbGVjdGVkUGF0aCk7Ci0JfQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbGliIHBhdGggZmllbGQgYmFzZWQgb24gdGhlIHNlbGVjdGVkIHBhdGguCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkUGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVMaWJQYXRoRmllbGQoU3RyaW5nIHNlbGVjdGVkUGF0aCkgewotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiTVBXUC51cGRhdGVMb2NhdGlvbkZpZWxkIHRvICIgKyBzZWxlY3RlZFBhdGgpOwotCQlsaWJQYXRoRmllbGQuc2V0VGV4dChzZWxlY3RlZFBhdGgpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIgYW5kIGdldCBzZWxlY3RlZCBkaXJlY3RvcnkgPGJyPgotCSAqIFRPRE86IGNhbiB3ZSB1c2UgdGhlIGRpYWxvZyB0aGF0IENEVCB1c2VzIGhlcmU/IEFsbG93cyBkaXJlY3QgdHlwaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gbnVsbDsKLQkJU3RyaW5nIGRpck5hbWUgPSBnZXRQYXRoRnJvbVBhdGhGaWVsZChpbmNsdWRlUGF0aEZpZWxkKTsKLQotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhpbmNsdWRlUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiTVBJIEluY2x1ZGUgcGF0aDoiKTsKLQotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLQotCQlzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCXVwZGF0ZUluY2x1ZGVQYXRoRmllbGQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCi0JCQlpbmNsdWRlUGF0aEZpZWxkLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkRpcmVjdG9yeSBmb3VuZCB2aWEgYnJvd3NlOiAiICsgc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJLy8gc2V0IHZhbHVlIHRvIHdoZXJlIHdlIGNhbiBmaW5kIGl0IGluIHRoZSBQcm9jZXNzUnVubmVyIGxhdGVyCi0JCQlzZXRDdXJyZW50TXBpSW5jbHVkZVBhdGgoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvbjJQcmVzc2VkKCkgewotCi0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IG51bGw7Ci0JCVN0cmluZyBkaXJOYW1lID0gZ2V0UGF0aEZyb21QYXRoRmllbGQobGliUGF0aEZpZWxkKTsKLQotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhsaWJQYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJNUEkgbGlicmFyeSBzZWFyY2ggcGF0aDoiKTsKLQotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLQotCQlzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCXVwZGF0ZUxpYlBhdGhGaWVsZChzZWxlY3RlZERpcmVjdG9yeSk7Ci0KLQkJCWxpYlBhdGhGaWVsZC5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJEaXJlY3RvcnkgZm91bmQgdmlhIGJyb3dzZTogIiArIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCS8vIHNldCB2YWx1ZSB0byB3aGVyZSB3ZSBjYW4gZmluZCBpdCBpbiB0aGUgUHJvY2Vzc1J1bm5lciBsYXRlcgotCQkJc2V0Q3VycmVudE1waUxpYlBhdGgoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFueSB0cmFpbGluZyBkZXZpY2Ugc2VwYXJhdG9yIGNoYXJhY3RoZXIgKGUuZy4gOyBvbiB3aW5kb3dzIG9yIDogb24gTGludXgpCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRob3V0IGFueSB0cmFpbGluZyBzZXBhcmF0b3IKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdHJpcFRyYWlsaW5nU2VwYXJhdG9yKFN0cmluZyBzdHIpIHsKLQkJaWYoc3RyLmxlbmd0aCgpPT0wKXJldHVybiBzdHI7Ci0JCWNoYXIgbGFzdENoYXIgPSBzdHIuY2hhckF0KHN0ci5sZW5ndGgoKSAtIDEpOwotCQlpZiAobGFzdENoYXIgPT0gamF2YS5pby5GaWxlLnBhdGhTZXBhcmF0b3JDaGFyKSB7Ci0JCQlTdHJpbmcgdGVtcCA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCgpIC0gMSk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQlyZXR1cm4gc3RyOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcmVhIGluIHdoaWNoIHRoZSB1c2VyIGNhbiBlbnRlciBNUEkgaW5jbHVkZSBwYXRoIGFuZCBvdGhlciBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdG8gcHV0IGl0IGluCi0JICogQHBhcmFtIGRlZmF1bHRFbmFibGVkIGluZGljYXRlcyBpZiB0aGUgInVzZSBkZWZhdWx0cyIgY2hlY2tib3ggaXMgdG8gYmUgaW5pdGlhbGx5IHNlbGVjdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVVc2VyRW50cnlBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZGVmYXVsdEVuYWJsZWQpIHsKLQkJaWYod2l6YXJkVHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk1QSVByb2plY3RXaXphcmRQYWdlLmNyZWF0ZVVzZXJFbnRyeUFyZWEoKSAiICk7Ci0JCQotCQlpbmNsdWRlUGF0aExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlpbmNsdWRlUGF0aExhYmVsLnNldFRleHQoIkluY2x1ZGUgcGF0aDoiKTsKLQkJaW5jbHVkZVBhdGhMYWJlbC5zZXRUb29sVGlwVGV4dCgiTG9jYXRpb24gb2YgTVBJIGluY2x1ZGUgcGF0aChzKSIpOwotCi0JCS8vIEluY2x1ZGUgcGF0aCBsb2NhdGlvbiAgZW50cnkgZmllbGQKLQkJaW5jbHVkZVBhdGhGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWluY2x1ZGVQYXRoRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaW5jbHVkZVBhdGhGaWVsZC5zZXRUZXh0KGRlZmF1bHRNcGlJbmNsdWRlUGF0aCk7Ci0JCWluY2x1ZGVQYXRoRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0Q3VycmVudE1waUluY2x1ZGVQYXRoKGluY2x1ZGVQYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigibG9jYXRpb25GaWVsZC5tb2RpZnlUZXh0KCk6ICIgKyBjdXJyZW50TXBpSW5jbHVkZVBhdGgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBicm93c2UgYnV0dG9uCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KCJCcm93c2UuLi4iKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiQnJvd3NlIGJ1dHRvbiBwcmVzc2VkLiIpOwotCQkJCWhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCS8vIGhvdyBkbyB3ZSBrbm93IHdoZW4gbmV4dC9maW5pc2ggYnV0dG9uIHB1c2hlZD8gd2UgZG9uJ3QuCi0JCS8vIHdlIGp1c3Qgc3RvcmUgYWxsIGluZm8gd2hlcmUgd2UgY2FuIGZpbmQgaXQgd2hlbiB0aGUgTVBJUHJvamVjdFByb2Nlc3MgKFByb2Nlc3NSdW5uZXIpIHJ1bnMgYWZ0ZXIgYWxsIHRoZSB3aXphcmQgcGFnZXMgYXJlIGRvbmUuCi0JCQotCQlsaWJMYWJlbD1uZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpYkxhYmVsLnNldFRleHQoIkxpYnJhcnkgbmFtZToiKTsKLQkJbGliTGFiZWwuc2V0VG9vbFRpcFRleHQoIkxpYnJhcnkgbmFtZToiKTsKLQkJCi0JCWxpYk5hbWVGaWVsZD1uZXcgVGV4dChjb21wb3NpdGUsU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludD1TSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW49MjsKLQkJbGliTmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlsaWJOYW1lRmllbGQuc2V0VGV4dChkZWZhdWx0TXBpTGliTmFtZSk7Ci0JCWxpYk5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRDdXJyZW50TXBpTGliTmFtZShsaWJOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigibGliTmFtZUZpZWxkLm1vZGlmeVRleHQoKTogIiArIGN1cnJlbnRMaWJOYW1lKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkobmV3IExhYmVsKGNvbXBvc2l0ZSxTV1QuTk9ORSkpLnNldFRleHQoIiAiKTsvL3NwYWNlcgotCQkKLQkJbGliUGF0aExhYmVsPW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGliUGF0aExhYmVsLnNldFRleHQoIkxpYnJhcnkgc2VhcmNoIHBhdGg6Iik7Ci0JCWxpYlBhdGhMYWJlbC5zZXRUb29sVGlwVGV4dCgiTGlicmFyeSBuYW1lOiIpOwotCQkKLQkJCi0JCWxpYlBhdGhGaWVsZD1uZXcgVGV4dChjb21wb3NpdGUsU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZDIud2lkdGhIaW50PVNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlnZDIuaG9yaXpvbnRhbFNwYW49MjsKLQkJbGliUGF0aEZpZWxkLnNldExheW91dERhdGEoZ2QyKTsKLQkJbGliUGF0aEZpZWxkLnNldFRleHQoZGVmYXVsdE1waUxpYlBhdGgpOwotCQlsaWJQYXRoRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0Q3VycmVudE1waUxpYlBhdGgobGliUGF0aEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImxpYlBhdGhGaWVsZC5tb2RpZnlUZXh0KCk6ICIgKyBjdXJyZW50TGliUGF0aCk7Ci0JCQl9Ci0JCX0pOwotCQkKLS8vCQkgYnJvd3NlIGJ1dHRvbgotCi0JCWJyb3dzZUJ1dHRvbjIgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24yLnNldFRleHQoIkJyb3dzZS4uLiIpOwotCQlicm93c2VCdXR0b24yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiQnJvd3NlIGJ1dHRvbiBwcmVzc2VkLiBETyBTT01FVEhJTkcgSEVSRS4iKTsKLQkJCQloYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvbjJQcmVzc2VkKCk7Ci0KLQkJCX0KLQkJfSk7Ci0JCW1waUNvbXBpbGVDb21tYW5kTGFiZWw9IG5ldyBMYWJlbChjb21wb3NpdGUsU1dULk5PTkUpOwotCQltcGlDb21waWxlQ29tbWFuZExhYmVsLnNldFRleHQoIk1QSSBjb21waWxlIGNvbW1hbmQ6ICIpOwotCQltcGlDb21waWxlQ29tbWFuZEZpZWxkPW5ldyBUZXh0KGNvbXBvc2l0ZSxTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QzID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkMy53aWR0aEhpbnQ9U0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWdkMy5ob3Jpem9udGFsU3Bhbj0yOwotCQltcGlDb21waWxlQ29tbWFuZEZpZWxkLnNldExheW91dERhdGEoZ2QzKTsKLQkJbXBpQ29tcGlsZUNvbW1hbmRGaWVsZC5zZXRUZXh0KGRlZmF1bHRNcGlCdWlsZENvbW1hbmQpOwotCQltcGlDb21waWxlQ29tbWFuZEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldEN1cnJlbnRNcGlDb21waWxlQ29tbWFuZChtcGlDb21waWxlQ29tbWFuZEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIm1waUNvbXBpbGVDb21tYW5kRmllbGQubW9kaWZ5VGV4dCgpOiAiICsgY3VycmVudE1waUNvbXBpbGVDb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0JCShuZXcgTGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKSkuc2V0VGV4dCgiICIpOy8vc3BhY2VyCi0JCQotCQltcGlMaW5rQ29tbWFuZExhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKTsKLQkJbXBpTGlua0NvbW1hbmRMYWJlbC5zZXRUZXh0KCJNUEkgbGluayBjb21tYW5kOiAiKTsKLQkJbXBpTGlua0NvbW1hbmRGaWVsZD1uZXcgVGV4dChjb21wb3NpdGUsU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkNCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZDQud2lkdGhIaW50PVNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlnZDQuaG9yaXpvbnRhbFNwYW49MjsKLQkJbXBpTGlua0NvbW1hbmRGaWVsZC5zZXRMYXlvdXREYXRhKGdkMyk7Ci0JCW1waUxpbmtDb21tYW5kRmllbGQuc2V0VGV4dChkZWZhdWx0TXBpQnVpbGRDb21tYW5kKTsKLQkJbXBpTGlua0NvbW1hbmRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRDdXJyZW50TXBpTGlua0NvbW1hbmQobXBpTGlua0NvbW1hbmRGaWVsZC5nZXRUZXh0KCkpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJtcGlMaW5rQ29tbWFuZEZpZWxkLm1vZGlmeVRleHQoKTogIiArIGN1cnJlbnRNcGlMaW5rQ29tbWFuZCk7Ci0JCQl9Ci0JCX0pOwotCQkobmV3IExhYmVsKGNvbXBvc2l0ZSxTV1QuTk9ORSkpLnNldFRleHQoIiAiKTsvL3NwYWNlcgotCi0JCQotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSBwYXJlbnQgY29tcG9zaXRlIGluIHdoaWNoIHRoZXNlIHdpZGdldHMgd2lsbCByZXNpZGUKLQkgKiAKLQkgKiBAcGFyYW0gZGVmYXVsdEVuYWJsZWQgZG8gd2UgdXNlIGRlZmF1bHQgbXBpIGluY2x1ZGUgcGF0aD8KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBkZWZhdWx0RW5hYmxlZCkgewotCi0JCWludCBjb2x1bW5zID0gNDsKLQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IGNvbHVtbnM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCXVzZU1waVByb2plY3RTZXR0aW5nc0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXVzZU1waVByb2plY3RTZXR0aW5nc0J1dHRvbi5zZXRUZXh0KCJBZGQgTVBJIHByb2plY3Qgc2V0dGluZ3MgdG8gdGhpcyBwcm9qZWN0Iik7Ci0JCUdyaWREYXRhIGdkPW5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3Bhbj1jb2x1bW5zOwotCQl1c2VNcGlQcm9qZWN0U2V0dGluZ3NCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZU1waVByb2plY3RTZXR0aW5nc0J1dHRvbi5zZXRTZWxlY3Rpb24odXNlTXBpUHJvamVjdFNldHRpbmdzKTsKLQkJdXNlTXBpUHJvamVjdFNldHRpbmdzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVzZU1waVByb2plY3RTZXR0aW5ncyA9IHVzZU1waVByb2plY3RTZXR0aW5nc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQkvLyBzZXQgdmFsdWUgc28gd2UgY2FuIHJlYWQgaXQgbGF0ZXIKLQkJCQlwYWdlRGF0YS5wdXQoUEFHRV9JRCtET1QrRE9fTVBJX0lOQ0xVREVTLCBCb29sZWFuLnRvU3RyaW5nKHVzZU1waVByb2plY3RTZXR0aW5ncykpOwotCQkJCQotCQkJCXVzZURlZmF1bHRzQnV0dG9uLnNldEVuYWJsZWQodXNlTXBpUHJvamVjdFNldHRpbmdzKTsKLQkJCQlpZihtcGlTYW1wbGVCdXR0b24hPW51bGwpCi0JCQkJICAgbXBpU2FtcGxlQnV0dG9uLnNldEVuYWJsZWQodXNlTXBpUHJvamVjdFNldHRpbmdzKTsKLQkJCQlpZih1c2VNcGlQcm9qZWN0U2V0dGluZ3MpIHsKLQkJCQkgIGJvb2xlYW4gdXNlRGVmYXVsdHM9dXNlRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJICBzZXRVc2VyQXJlYUVuYWJsZWQoIXVzZURlZmF1bHRzKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZWxzZQotCQkJCQlzZXRVc2VyQXJlYUVuYWJsZWQoZmFsc2UpOwotCQkJCQotCQkJfQotCQl9KTsKLQotCQl1c2VEZWZhdWx0c0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldFRleHQoIlVzZSBkZWZhdWx0IGluZm9ybWF0aW9uIik7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldFNlbGVjdGlvbihkZWZhdWx0RW5hYmxlZCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldEVuYWJsZWQodXNlTXBpUHJvamVjdFNldHRpbmdzKTsKLQkJR3JpZERhdGEgYnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlidXR0b25EYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJdXNlRGVmYXVsdHNCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25EYXRhKTsKLQkJdXNlRGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIHVzZURlZmF1bHRzID0gdXNlRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlpZiAodXNlRGVmYXVsdHMpIHsgCi0JCQkJCS8vIHJlc2V0IGFsbCBmaWVsZHMgYW5kIHZhbHVlcyBiYWNrIHRvIHRoZSBkZWZhdWx0cwotCQkJCQlpbmNsdWRlUGF0aEZpZWxkLnNldFRleHQoZGVmYXVsdE1waUluY2x1ZGVQYXRoKTsKLQkJCQkJc2V0Q3VycmVudE1waUluY2x1ZGVQYXRoKGRlZmF1bHRNcGlJbmNsdWRlUGF0aCk7Ci0JCQkJCQotCQkJCQlsaWJQYXRoRmllbGQuc2V0VGV4dChkZWZhdWx0TXBpTGliTmFtZSk7Ci0JCQkJCXNldEN1cnJlbnRNcGlMaWJOYW1lKGRlZmF1bHRNcGlMaWJOYW1lKTsKLQkJCQkJCi0JCQkJCWxpYk5hbWVGaWVsZC5zZXRUZXh0KGRlZmF1bHRNcGlMaWJOYW1lKTsKLQkJCQkJc2V0Q3VycmVudE1waUxpYk5hbWUoZGVmYXVsdE1waUxpYk5hbWUpOwotCQkJCQkKLQkJCQkJbGliUGF0aEZpZWxkLnNldFRleHQoZGVmYXVsdE1waUxpYlBhdGgpOwotCQkJCQlzZXRDdXJyZW50TXBpTGliUGF0aChkZWZhdWx0TXBpTGliUGF0aCk7Ci0JCQkJCQotCQkJCQltcGlDb21waWxlQ29tbWFuZEZpZWxkLnNldFRleHQoZGVmYXVsdE1waUJ1aWxkQ29tbWFuZCk7Ci0JCQkJCXNldEN1cnJlbnRNcGlDb21waWxlQ29tbWFuZChkZWZhdWx0TXBpQnVpbGRDb21tYW5kKTsKLQkJCQkJCi0JCQkJCW1waUxpbmtDb21tYW5kRmllbGQuc2V0VGV4dChkZWZhdWx0TXBpQnVpbGRDb21tYW5kKTsKLQkJCQkJc2V0Q3VycmVudE1waUxpbmtDb21tYW5kKGRlZmF1bHRNcGlCdWlsZENvbW1hbmQpOwotCQkJCX0KLQkJCQlzZXRVc2VyQXJlYUVuYWJsZWQoIXVzZURlZmF1bHRzKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlVXNlckVudHJ5QXJlYShncm91cCwgZGVmYXVsdEVuYWJsZWQpOwotCQlzZXRVc2VyQXJlYUVuYWJsZWQoIWRlZmF1bHRFbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJYm9vbGVhbiBkZWZhdWx0RW5hYmxlZCA9IHRydWU7Ci0JCWNyZWF0ZUNvbnRlbnRzKGNvbXBvc2l0ZSwgZGVmYXVsdEVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHRtcD0iU2VsZWN0IHRoZSBNUEkgaW5jbHVkZSBwYXRoLCBsaWIgbmFtZSwgbGlicmFyeSBzZWFyY2ggcGF0aCwgYW5kIGJ1aWxkIGNvbW1hbmQgaW5mb3JtYXRpb24gdG8gYmUgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byB0aGUgbmV3IHByb2plY3QuIjsKLQkJcmV0dXJuIHRtcDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0V2l6YXJkKCkuZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuICJNUEkgUHJvamVjdCBTZXR0aW5ncyI7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUhlbHAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQkvKioKLQkgKiBJZiB5b3UgbmVlZCB0byBpbml0IGRhdGEvd2lkZ2V0cyBvbiB0aGUgcGFnZSB3aGVuIGl0IGlzIGRpc3BsYXllZCBiYXNlZAotCSAqIG9uIHRoZSBkYXRhIHNldCBpbiBwcmV2aW91cyBwYWdlcywgeW91IGNhbiBvdmVycmlkZQotCSAqIElEaWFsb2dQYWdlLnNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSBhbmQgc2V0dXAgZXZlcnl0aGluZyB3aGVuIHZpc2libGUgPT0KLQkgKiB0cnVlLgotCSAqIAotCSAqIE90aGVyd2lzZSwgZG8gaW5pdHMgaW4gdGhlIGN0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJY29tcG9zaXRlLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJNUElQcm9qZWN0V2l6YXJkUGFnZS5zZXRWaXNpYmxlOiAiICsgdmlzaWJsZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBzdGF0dXMgb2YgdGhlIHdpemFyZCdzIGZpbmlzaCBidXR0b24uIElmIHdlIGRvbid0IHdhbnQgdGhlCi0JICogdXNlciB0byBwcmVzcyBmaW5pc2ggeWV0LCBzZXQgdGhpcyB0byBmYWxzZS4gPGJyPgotCSAqIFRoZSBOZXh0L0ZpbmlzaC9DYW5jZWwgbWV0aG9kcyBiZWxvbmcgdG8gdGhlIHdpemFyZCBpdHNlbGYgYW5kIG5vdCB0aGUKLQkgKiBwYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBmaW5pc2ggYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXN0b21QYWdlQ29tcGxldGUoKSB7Ci0JCS8vIEJSVCBpZiBpc0RlZmF1bHRzIGlzIG5vdCBjaGVja2VkIHRoZW4gaW5jbHVkZVBhdGhGaWVsZCBldGMuIHNob3VsZCBiZQotCQkvLyBmaWxsZWQgaW4uCi0JCS8vIEJSVCBpZiBpc0RlZmF1bHRzIGlzIGNoZWNrZWQgdGhlbiB0aGVyZSBzaG91bGQgYWN0dWFsbHkgQkUgc29tZQotCQkvLyBkZWZhdWx0cyB0byB1c2UuCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlICJ1c2VyIGFyZWEiIHdoaWNoIGlzIHRoZSBwbGFjZSB1c2VyIGNhbiB0eXBlIGFuZCBtYWtlCi0JICogY2hhbmdlcyAoaW5jbHVkZVBhdGhGaWVsZCwgaXRzIGxhYmVsIGFuZCBidXR0b24sIGV0Yy4pCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VXNlckFyZWFFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQkKLQkJaW5jbHVkZVBhdGhGaWVsZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJYnJvd3NlQnV0dG9uMi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlsaWJOYW1lRmllbGQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJbGliUGF0aEZpZWxkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQotCQlpbmNsdWRlUGF0aExhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWxpYlBhdGhMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlsaWJMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkKLQkJbXBpQ29tcGlsZUNvbW1hbmRMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQltcGlDb21waWxlQ29tbWFuZEZpZWxkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCW1waUxpbmtDb21tYW5kTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJbXBpTGlua0NvbW1hbmRGaWVsZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLQkvKioKLQkgKiBXaGF0J3MgdGhlIGRlZmF1bHQsIGRvIHdlIGluY2x1ZGUgTVBJIGluY2x1ZGVzIG9yIG5vdD8KLQkgKiBJZiB0aGVyZSBpcyBhbnkgZGlmZmljdWx0eSBnZXR0aW5nIGluZm9ybWF0aW9uLCB1c2UgdGhpcyBkZWZhdWx0Ci0JICogc2V0dGluZy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRVc2VNcGlJbmNsdWRlcygpIHsKLQkJcmV0dXJuIGRlZmF1bHRVc2VNcGlJbmNsdWRlczsKLQl9Ci0KLQlwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gcGFnZURhdGE7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB3ZSBhcmUgaW4gYSBDIG9yIEMrKyBwcm9qZWN0IHRlbXBsYXRlCi0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0TXBpUHJvamVjdFR5cGUoKTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VQYWdlIGdldFByZWZlcmVuY2VQYWdlKCkgewotCQlpZihwcmVmZXJlbmNlUGFnZSA9PSBudWxsKSB7Ci0JCQlwcmVmZXJlbmNlUGFnZSA9IG5ldyBNUElQcmVmZXJlbmNlUGFnZSgpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9NUElQcm9qZWN0V2l6YXJkUGFnZUMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9NUElQcm9qZWN0V2l6YXJkUGFnZUMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzOGViNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3dpemFyZHMvd2l6YXJkUGFnZXMvTVBJUHJvamVjdFdpemFyZFBhZ2VDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDc4IElCTSBDb3JwLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3JwLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waUlEczsKLQotCi0vKioKLSAqIFdpemFyZCBQYWdlIGZvciBjb2xsZWN0aW5nIGluZm8gYWJvdXQgTVBJIEMgcHJvamVjdCAtIHNwZWNpZmljcyBmb3IgQyB2cyBDKysKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1QSVByb2plY3RXaXphcmRQYWdlQyBleHRlbmRzIE1QSVByb2plY3RXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBNUElQcm9qZWN0V2l6YXJkUGFnZUMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNcGlQcm9qZWN0VHlwZSgpIHsKLQkJcmV0dXJuIE1QSV9QUk9KRUNUX1RZUEVfQzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRNcGlCdWlsZENvbW1hbmQoKSB7Ci0JCVN0cmluZyBjbWQgPSBwcmVmZXJlbmNlU3RvcmUuZ2V0U3RyaW5nKE1waUlEcy5NUElfQlVJTERfQ01EKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9NUElQcm9qZWN0V2l6YXJkUGFnZUNQUC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RXaXphcmRQYWdlQ1BQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNjJlYWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL01QSVByb2plY3RXaXphcmRQYWdlQ1BQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDggSUJNIENvcnAuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnAuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmNvcmUuTXBpSURzOwotCi0KLS8qKgotICogV2l6YXJkIFBhZ2UgZm9yIGNvbGxlY3RpbmcgaW5mbyBhYm91dCBNUEkgQysrIHByb2plY3QgCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElQcm9qZWN0V2l6YXJkUGFnZUNQUCBleHRlbmRzIE1QSVByb2plY3RXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBNUElQcm9qZWN0V2l6YXJkUGFnZUNQUCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1waVByb2plY3RUeXBlKCkgewotCQlyZXR1cm4gTVBJX1BST0pFQ1RfVFlQRV9DUFA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdE1waUJ1aWxkQ29tbWFuZCgpIHsKLQkJU3RyaW5nIGNtZCA9IHByZWZlcmVuY2VTdG9yZS5nZXRTdHJpbmcoTXBpSURzLk1QSV9DUFBfQlVJTERfQ01EKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9PcGVuTVBQcm9qZWN0UHJvY2Vzcy5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL09wZW5NUFByb2plY3RQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmQ3M2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL09wZW5NUFByb2plY3RQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA3IElCTSBDb3JwLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycC4gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLndpemFyZFBhZ2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUudGVtcGxhdGVlbmdpbmUuVGVtcGxhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlbXBsYXRlZW5naW5lLnByb2Nlc3MuUHJvY2Vzc0FyZ3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlbXBsYXRlZW5naW5lLnByb2Nlc3MuUHJvY2Vzc0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUudGVtcGxhdGVlbmdpbmUucHJvY2Vzcy5Qcm9jZXNzUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklNYW5hZ2VkQnVpbGRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklNYW5hZ2VkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5JT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLklUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLk1hbmFnZWRCdWlsZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMuTXBpV2l6YXJkc1BsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEFmdGVyIHRoZSBNUElQcm9qZWN0V2l6YXJkUGFnZSBydW5zLCBhbmQgd2UgZ2V0IE1QSSBpbmNsdWRlIHBhdGggZnJvbSB0aGUgdXNlciwKLSAqIHdlIGhhdmUgdGhpcyBvcHBvcnR1bml0eSB0byB1c2UgdGhhdCBpbmZvcm1hdGlvbiB0byBtb2RpZnkgdGhlIGluY2x1ZGUgcGF0aHMgZXRjLgotICogaW4gdGhlIHByb2plY3QKLSAqIAotICogCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBQcm9qZWN0UHJvY2VzcyBleHRlbmRzIFByb2Nlc3NSdW5uZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdHJhY2VPbj1mYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gd2l6VHJhY2VPbj1PcGVuTVBQcm9qZWN0V2l6YXJkUGFnZS53aXphcmRUcmFjZU9uOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLFN0cmluZz4gdmFsdWVTdG9yZTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9jZXNzKFRlbXBsYXRlQ29yZSB0ZW1wbGF0ZSwgUHJvY2Vzc0FyZ3VtZW50W10gYXJncywKLQkJCVN0cmluZyBwcm9jZXNzSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBQcm9jZXNzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmKHdpelRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJPcGVuTVBQcm9qZWN0UHJvY2VzcygpLnJ1bigpLi4uIik7Ci0JCQotCQl2YWx1ZVN0b3JlPSB0ZW1wbGF0ZS5nZXRWYWx1ZVN0b3JlKCk7Ci0JCVN0cmluZyBwYWdlSUQgPSBPcGVuTVBQcm9qZWN0V2l6YXJkUGFnZS5QQUdFX0lEOwotCQkKLQkJT2JqZWN0IG9iaiA9IGdldE5ld1Byb3BWYWx1ZShwYWdlSUQsIE9wZW5NUFByb2plY3RXaXphcmRQYWdlLkRPX09wZW5NUF9JTkNMVURFUywgbnVsbCk7Ci0JCWJvb2xlYW4gZG9PcGVuTVBJbmNsdWRlcyA9IE9wZW5NUFByb2plY3RXaXphcmRQYWdlLmdldERlZmF1bHRVc2VPcGVuTVBJbmNsdWRlcygpOwotCQlpZiAob2JqICE9IG51bGwpCi0JCQlkb09wZW5NUEluY2x1ZGVzID0gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIG9iaik7Ci0JCWlmICghZG9PcGVuTVBJbmNsdWRlcykgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEbyBub3Qgc2F2ZSBPcGVuTVAgaW5mbyBpbiB0aGlzIHByb2plY3QuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLSAJCS8vIHRoaXMgcHJvY2VzcyBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGEgc2VwYXJhdGUgcHJvY2VzcyB3aGljaCBjcmVhdGVzIHRoZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2o9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh2YWx1ZVN0b3JlLmdldCgicHJvamVjdE5hbWUiKSk7Ci0JCWlmKCFwcm9qLmV4aXN0cygpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3QgZG9lcyBub3QgZXhpc3QhLiBRdWl0dGluZy4gTm8gT3Blbk1QIGluZm8gYWRkZWQgdG8gcHJvamVjdC4iKTsKLQkJCXJldHVybjsJCi0JCX0KLQotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdDogIiArIHByb2ouZ2V0TmFtZSgpKTsKLQotCQkvLyBDb2xsZWN0IHRoZSB2YWx1ZXMgdGhhdCB0aGUgdXNlciBlbnRlcmVkIG9uIHRoZSB3aXphcmQgcGFnZQotCQlTdHJpbmcgcHJvcElEID0gT3Blbk1QUHJvamVjdFdpemFyZFBhZ2UuSU5DTFVERV9QQVRIX1BST1BfSUQ7Ci0JCVN0cmluZyBuZXdJbmNsdWRlUGF0aCA9IGdldE5ld1Byb3BWYWx1ZShwYWdlSUQsIHByb3BJRCwiYzovb3Blbm1wL2luY2x1ZGUiKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBwcm9wOiAiK3Byb3BJRCsiPSIrbmV3SW5jbHVkZVBhdGgpOwotCQkKLQkJcHJvcElEID0gT3Blbk1QUHJvamVjdFdpemFyZFBhZ2UuTElCX1BST1BfSUQ7Ci0JCVN0cmluZyBuZXdMaWI9Z2V0TmV3UHJvcFZhbHVlKHBhZ2VJRCxwcm9wSUQsImxpYiIpOwotCQkKLQkJcHJvcElEPU9wZW5NUFByb2plY3RXaXphcmRQYWdlLkxJQlJBUllfU0VBUkNIX1BBVEhfUFJPUF9JRDsKLQkJU3RyaW5nIG5ld0xpYlNlYXJjaFBhdGg9Z2V0TmV3UHJvcFZhbHVlKHBhZ2VJRCxwcm9wSUQsImM6L29wZW5tcC9saWIiKTsKLQkJCi0JCXByb3BJRD1PcGVuTVBQcm9qZWN0V2l6YXJkUGFnZS5PcGVuTVBfQ09NUElMRV9DT01NQU5EX1BST1BfSUQ7Ci0JCVN0cmluZyBPcGVuTVBDb21waWxlQ29tbWFuZD1nZXROZXdQcm9wVmFsdWUocGFnZUlELHByb3BJRCwiZ2NjIik7Ci0JCQotCQlwcm9wSUQ9T3Blbk1QUHJvamVjdFdpemFyZFBhZ2UuT3Blbk1QX0xJTktfQ09NTUFORF9QUk9QX0lEOwotCQlTdHJpbmcgT3Blbk1QTGlua0NvbW1hbmQ9Z2V0TmV3UHJvcFZhbHVlKHBhZ2VJRCxwcm9wSUQsImdjY2NjIik7Ci0JCQotCQlJTWFuYWdlZEJ1aWxkSW5mbyBpbmZvID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluZm8gPSBNYW5hZ2VkQnVpbGRNYW5hZ2VyLmdldEJ1aWxkSW5mbyhwcm9qKTsKLQkJCS8vIG5vdGU6IGFzc3VtZWQgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIG1hbmFnZWQgYnVpbGQgcHJvamVjdD8gd2lsbCB3ZSBnZXQgaGVyZSBpbiB0aGF0IGNhc2U/Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGQgaW5mbzogIiArIGluZm8pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJPcGVuTVBQcm9qZWN0UHJvY2Vzcy5ydW4oKSwgIitlLmdldE1lc3NhZ2UoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydChpbmZvIT1udWxsKTsKLQkJCi0JCUlNYW5hZ2VkUHJvamVjdCBtUHJvaiA9IGluZm8uZ2V0TWFuYWdlZFByb2plY3QoKTsKLQkJaWYodHJhY2VPbilzaG93T3B0aW9ucyhtUHJvaik7Ci0JCQotCQkvLyBhZGQgdGhlIGluY2x1ZGUgcGF0aCAmIGxpbmtlciB2YWx1ZXMgdG8gYWxsIHRoZSBjb25maWd1cmF0aW9ucwotCQlJQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBtUHJvai5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uIGNmID0gY29uZmlnc1tpXTsKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJDb25maWcgIiArIGkgKyAiOiAiICsgY2YuZ2V0TmFtZSgpKTsKLQkJCWFkZEluY2x1ZGVQYXRoKGNmLCBuZXdJbmNsdWRlUGF0aCk7Ci0JCQlhZGRMaW5rZXJPcHQoY2YsbmV3TGliLG5ld0xpYlNlYXJjaFBhdGgpOwotCQkJc2V0Q29tcGlsZUNvbW1hbmQoY2YsT3Blbk1QQ29tcGlsZUNvbW1hbmQpOwotCQkJc2V0TGlua0NvbW1hbmQoY2YsT3Blbk1QTGlua0NvbW1hbmQpOwkJCi0JCX0KLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5NUFByb2plY3RQcm9jZXNzLCBuZXdJbmNsdWRlUGF0aDogIituZXdJbmNsdWRlUGF0aCk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCIgICBuZXdMaWI6ICIrbmV3TGliKyIgIG5ld0xpYlNyY2hQdGg6ICIrbmV3TGliU2VhcmNoUGF0aCk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCIgICBjb21waWxlQ21kOiAiK09wZW5NUENvbXBpbGVDb21tYW5kKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGxpbmtDbWQ6ICIrT3Blbk1QTGlua0NvbW1hbmQpOwotCQkvLyBNYW5hZ2VkQnVpbGRNYW5nZXIuc2F2ZUJ1aWxkSW5mbyguLi4pIGFzc3VyZXMgdGhhdCB0aGUKLQkJLy8gdmFsdWVzIGFyZSBwZXJzaXN0ZWQgaW4gdGhlIGJ1aWxkIG1vZGVsLCBvdGhlcndpc2UgdGhleSB3aWxsCi0JCS8vIGJlIGxvc3Qgd2hlbiB5b3Ugc2h1dCBkb3duIEVjbGlwc2UuCi0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJNYW5hZ2VkQnVpbGRNYW5hZ2VyLnNhdmVCdWlsZEluZm8uLi4iKTsKLQkKLQkJTWFuYWdlZEJ1aWxkTWFuYWdlci5zYXZlQnVpbGRJbmZvKHByb2osIHRydWUpOwotCi0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gTXBpV2l6YXJkc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhIHZhbHVlIHRoYXQgd2FzIHBvc3NpYmx5IG9idGFpbmVkIGZyb20gdGhlIHVzZXIgb24gdGhlIGFzc29jaWF0ZWQgd2l6YXJkIHBhZ2UuCi0JICogQHBhcmFtIHBhZ2VJRCBUaGUgcGFnZUlEIGZvciBvdXIgd2l6YXJkIHBhZ2UKLQkgKiBAcGFyYW0gcHJvcElEIFRoZSBwcm9wSUQgb2YgdGhlIHZhbHVlIHdlIHdhbnQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbCBUaGUgZGVmYXVsdCB2YWx1ZSB0byB1c2UgaWYgdGhlIHVzZXIgZGlkbid0IHNlbGVjdCBhbnl0aGluZywKLQkgKiBvciBpZiB3ZSBoYXZlbid0IGdvdHRlbiBhcm91bmQgdG8gTEVUVElORyB0aGUgdXNlciBzZWxlY3QgYW55dGhpbmcgeWV0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXROZXdQcm9wVmFsdWUoU3RyaW5nIHBhZ2VJRCwgU3RyaW5nIHByb3BJRCwgU3RyaW5nIGRlZmF1bHRWYWwpIHsKLQkJT2JqZWN0IG9iaiA9IHZhbHVlU3RvcmUuZ2V0KHBhZ2VJRCtNUElQcm9qZWN0V2l6YXJkUGFnZS5ET1QrcHJvcElEKTsKLQkJLy8gaWYgc2VsZWN0aW9uIG1hZGUgb24gcGFnZSwgb2JqIGlzIG5vbi1udWxsLgotCQlTdHJpbmcgbmV3VmFsdWUgPSBkZWZhdWx0VmFsOwotCQlTdHJpbmcgbXNnPSIgKCB1c2VkIGRlZmF1bHQgdmFsdWUpIjsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQluZXdWYWx1ZSA9IG9iai50b1N0cmluZygpOwotCQkJbXNnPSIiOwotCQl9Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJwcm9wSUQ9IiArIHByb3BJRCArICIgIHZhbHVlPSIgKyBuZXdWYWx1ZSttc2cpOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGQgYW4gaW5jbHVkZSBwYXRoIGZvciBDIGNvbXBpbGluZyB0byB0aGUgZXhpc3RpbmcgaW5jbHVkZSBwYXRocyBvZiB0aGUgZ2l2ZW4KLQkgKiBDb25maWd1cmF0aW9uLiAgWExDIGlzIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UgdG8gZmluZCBpdHMgaW5jbHVkZSBwYXRoIG9wdGlvbjsKLQkgKiBmb3Igb3RoZXIgdG9vbHMsIHdlIGFzc3VtZSB0aGVyZSBpcyBhIHNpbmdsZSBvcHRpb24gZm9yIGluY2x1ZGUgcGF0aHMsIHNvIHdlIHRha2UKLQkgKiB0aGUgZmlyc3Qgb25lLgotCSAqIAotCSAqIEBwYXJhbSBjZgotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb2plY3QgKGUuZy4gUmVsZWFzZSwgRGVidWcsIGV0Yy4pCi0JICogQHBhcmFtIG5ld0luY2x1ZGVQYXRoCi0JICogICAgICAgICAgICBpbmNsdWRlIHBhdGgocykgdG8gYWRkLiAgSWYgbW9yZSB0aGFuIG9uZSwgc2VwYXJhdGUgYnkKLQkgKiAgICAgICAgICAgIGphdmEuaW8uRmlsZS5wYXRoU2VwYXJhdG9yLCB3aGljaCBpcyBzZW1pY29sb24gZm9yIFdpbmRvd3MsIGNvbG9uIGZvciBNYWMvTGludXgKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSW5jbHVkZVBhdGgoSUNvbmZpZ3VyYXRpb24gY2YsIFN0cmluZyBuZXdJbmNsdWRlUGF0aCkgewotCQkvLyBub3RlOiBjb3VsZCBiZSA+IDEgcGF0aCBpbiAnbmV3SW5jbHVkZVBhdGgnCi0JCVN0cmluZyBleHQgPSAiYyI7Ci0JCUlUb29sIGNmVG9vbCA9IGNmLmdldFRvb2xGcm9tSW5wdXRFeHRlbnNpb24oZXh0KTsKLQkJLy8gZG8gd2UgbmVlZCB0byBhbHNvIGhhbmRsZSBjKysgY2FzZSBhcyB3ZWxsPwotCi0JCS8vU3RyaW5nIGlkID0gY2ZUb29sLmdldElkKCk7IC8vICJjZHQubWFuYWdlZGJ1aWxkLnRvb2wueGxjLmMuY29tcGlsZXIuZXhlLmRlYnVnLjE0MjMyNzA3NDUiCi0JCVN0cmluZyBuYW1lID0gY2ZUb29sLmdldE5hbWUoKTsvLyAiWEwgQyBDb21waWxlciIKLQkJSU9wdGlvbiBvcHRpb24gPSBudWxsOwotCQlpZiAobmFtZS5zdGFydHNXaXRoKCJYTCBDIikpIHsgLy8gc3BlY2lhbCBjYXNlIGZvciBYTCBDIGNvbXBpbGVyCi0JCQlvcHRpb24gPSBjZlRvb2wuZ2V0T3B0aW9uQnlJZCgieGxjLmMuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUucGF0aHMiKTsKLQkJfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGVyZSBpcyBvbmx5IG9uZSBpbmNsdWRlIHBhdGggb3B0aW9uLgotCQkJb3B0aW9uID0gZ2V0Rmlyc3RPcHRpb25CeVR5cGUoY2YsIGNmVG9vbCwgSU9wdGlvbi5JTkNMVURFX1BBVEgpOwotCQl9Ci0JCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nW10gaW5jbHVkZVBhdGhzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW5jbHVkZVBhdGhzID0gb3B0aW9uLmdldEluY2x1ZGVQYXRocygpOwotCQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJU3RyaW5nW10gbmV3SW5jbHVkZVBhdGhzID0gYWRkKGluY2x1ZGVQYXRocywgbmV3SW5jbHVkZVBhdGgpOwotCQkJaWYgKHRyYWNlT24pCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIGFkZCAiICsgbmV3SW5jbHVkZVBhdGggKyAiIHRvIGV4aXN0aW5nIGluY2x1ZGVQYXRoczogIgotCQkJCQkJKyB1bnJvbGwoaW5jbHVkZVBhdGhzKSk7Ci0JCQlNYW5hZ2VkQnVpbGRNYW5hZ2VyLnNldE9wdGlvbihjZiwgY2ZUb29sLCBvcHRpb24sIG5ld0luY2x1ZGVQYXRocyk7Ci0JCX0KLQkJZWxzZXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTVBJUHJvamVjdFByb2Nlc3MsIG5vIG9wdGlvbiBmb3IgaW5jbHVkZSBwYXRocyBmb3VuZC4iKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQWRkIGEgbmV3IGxpbmtlciBvcHRpb24uICBBc3N1bWVzIHRoYXQgdGhlcmUgaXMgT05FIGluc3RhbmNlIG9mIGFuIG9wdGlvbgotCSAqIG9mIHR5cGUgPGNvZGU+SU9wdGlvbi5MSUJSQVJZX1BBVEhTPC9jb2RlPiBhbmQgPGNvZGU+SU9wdGlvbi5MSUJSQVJJRVM8L2NvZGU+LgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgdGhlIGxpYk5hbWUgYW5kIGxpYlBhdGggdG8gdGhlc2UgdHdvIG9wdGlvbnMuCi0JICogQHBhcmFtIGNmIHRoZSBDb25maWd1cmF0aW9uIHRvIHdoaWNoIHdlIHdhbnQgdG8gYWRkIHRvIGxpbmtlciBvcHRpb25zCi0JICogQHBhcmFtIGxpYk5hbWUgdGhlIGxpYiBuYW1lIChlLmcuICJsaWIiKQotCSAqIEBwYXJhbSBsaWJQYXRoIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIG5hbWUgKGUuZy4gImM6L215cGF0aC9saWIiKQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaW5rZXJPcHQoSUNvbmZpZ3VyYXRpb24gY2YsIFN0cmluZyBsaWJOYW1lLCBTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgZXh0ID0gIm8iOwotCQlJVG9vbCBjZlRvb2wgPSBjZi5nZXRUb29sRnJvbUlucHV0RXh0ZW5zaW9uKGV4dCk7Ci0KLQkJSU9wdGlvbiBscE9wdCA9IGdldEZpcnN0T3B0aW9uQnlUeXBlKGNmLCBjZlRvb2wsIElPcHRpb24uTElCUkFSWV9QQVRIUyk7Ci0JCWFkZE9wdGlvblZhbHVlKGNmLCBjZlRvb2wsIGxwT3B0LCBsaWJQYXRoKTsKLQotCQlJT3B0aW9uIGxpYk9wdCA9IGdldEZpcnN0T3B0aW9uQnlUeXBlKGNmLCBjZlRvb2wsIElPcHRpb24uTElCUkFSSUVTKTsKLQkJYWRkT3B0aW9uVmFsdWUoY2YsIGNmVG9vbCwgbGliT3B0LCBsaWJOYW1lKTsKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q29tcGlsZUNvbW1hbmQoSUNvbmZpZ3VyYXRpb24gY2YsIFN0cmluZyBidWlsZENtZCkgewotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGlsZSBjbWQ6ICIrYnVpbGRDbWQpOwotCQlJVG9vbCBjb21waWxlciA9IGNmLmdldFRvb2xGcm9tSW5wdXRFeHRlbnNpb24oImMiKTsKLQkJY29tcGlsZXIuc2V0VG9vbENvbW1hbmQoYnVpbGRDbWQpOwotCQkKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldExpbmtDb21tYW5kKElDb25maWd1cmF0aW9uIGNmLCBTdHJpbmcgYnVpbGRDbWQpIHsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImxpbmsgY21kOiAiK2J1aWxkQ21kKTsKLQkJSVRvb2wgbGlua2VyPWNmLmdldFRvb2xGcm9tSW5wdXRFeHRlbnNpb24oIm8iKTsKLQkJbGlua2VyLnNldFRvb2xDb21tYW5kKGJ1aWxkQ21kKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIEFkZCBhIHZhbHVlIHRvIGEgbXVsdGktdmFsdWVkIHRvb2wgb3B0aW9uPGJyPgotCSAqIChGb3IgZXhhbXBsZSwgYWRkIGEgcGF0aCB0byBpbmNsdWRlIHBhdGhzLCBvciBhIGxpYiB0byBsaWJyYXJpZXMgbGlzdCkKLQkgKiBAcGFyYW0gY2YgdGhlIENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gdG9vbCB0aGUgdG9vbCBpbiB3aGljaCB0byB1cGRhdGUgdGhlIG9wdGlvbgotCSAqIEBwYXJhbSBvcHRpb24gdGhlIG9wdGlvbiB0byB1cGRhdGUgCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgdG8gYWRkIHRvIHRoZSBsaXN0IG9mIGV4aXN0aW5nIHZhbHVlcyBpbiB0aGUgb3B0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdGlvblZhbHVlKElDb25maWd1cmF0aW9uIGNmLCBJVG9vbCB0b29sLCBJT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgdHlwZSA9IG9wdGlvbi5nZXRWYWx1ZVR5cGUoKTsKLQkJCVN0cmluZ1tdIHZhbHVlTGlzdCA9IG51bGw7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSU9wdGlvbi5JTkNMVURFX1BBVEg6Ci0JCQkJdmFsdWVMaXN0ID0gb3B0aW9uLmdldEluY2x1ZGVQYXRocygpOwotCQkJCXZhbHVlTGlzdCA9IGFkZCh2YWx1ZUxpc3QsdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJT3B0aW9uLkxJQlJBUklFUzoKLQkJCQl2YWx1ZUxpc3QgPSBvcHRpb24uZ2V0TGlicmFyaWVzKCk7Ci0JCQkJdmFsdWVMaXN0PWFkZE5vdFBhdGgodmFsdWVMaXN0LCB2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElPcHRpb24uTElCUkFSWV9QQVRIUzovLyB0aGlzIGlzIHR5cGUgZm9yIGxpYnJhcnkgc2VhcmNoIHBhdGggY2R0IDQuMCAKLQkJCQl2YWx1ZUxpc3Q9b3B0aW9uLmdldEJhc2ljU3RyaW5nTGlzdFZhbHVlKCk7Ci0JCQkJdmFsdWVMaXN0PWFkZE5vdFBhdGgodmFsdWVMaXN0LHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCQotCQkJZGVmYXVsdDoKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5NUFByb2plY3RXaXphcmQgUHJvY2VzcyBwb3N0cHJvY2Vzc2luZyAoT3Blbk1QUHJvamVjdFByb2Nlc3MpLCBjYW4ndCBnZXQgdHlwZSBvZiBvcHRpb24gZm9yICIgKyBvcHRpb24uZ2V0TmFtZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyB1cGRhdGUgdGhlIG9wdGlvbiBpbiB0aGUgbWFuYWdlZCBidWlsZGVyIG9wdGlvbnMKLQkJCU1hbmFnZWRCdWlsZE1hbmFnZXIuc2V0T3B0aW9uKGNmLCB0b29sLCBvcHRpb24sIHZhbHVlTGlzdCk7Ci0KLQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJPcGVuTVBQcm9qZWN0UHJvY2Vzcy5hZGRPcHRpb25WYWx1ZSgpLCAiK2UuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgb3B0aW9ucyBmb3IgYSBwcm9qZWN0Ljxicj4KLQkgKiBlLmcuIGZvciBEZWJ1ZyBhbmQgUmVsZWFzZSBjb25maWd1cmF0aW9ucywgZ2V0IGFsbCB0aGUgdG9vbHMgKGNvbXBpbGVyLCBsaW5rZXIgZXRjLikgdGhlbiBmb3IgZWFjaCB0b29sLCAKLQkgKiBnZXQgYWxsIHRoZSBvcHRpb25zIGFuZCBwcmludCB0aGVtLgotCSAqIAotCSAqIElSZXNvdXJjZSByZXNvdXJjZT0gLi4uIDsvLyBjYW4gYmUgYW55IHJlc291cmNlLCBJIHVzZSBwcm9qZWN0LgotICAgICAqIElNYW5hZ2VkQnVpbGRJbmZvIG1ibyA9IE1hbmFnZWRCdWlsZE1hbmFnZXIuZ2V0QnVpbGRJbmZvKHJlc291cmNlKTsKLSAgICAgKiBJTWFuYWdlZFByb2plY3QgbXA9bWJvLmdldE1hbmFnZWRQcm9qZWN0KCk7Ci0JICogPGJyPgotCSAqIFRoaXMgaGVscHMgaW4gZmlndXJpbmcgb3V0IHdoYXQgdGhleSBhcmUsIGFuZCB3aGF0IHlvdSB3YW50IHRvIGNoYW5nZS4KLQkgKiBTb21lIHNhbXBsZSBvdXRwdXQgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2ogdGhlIChtYW5hZ2VkKSBwcm9qZWN0IGZvciB3aGljaCBwcmludCBhbGwgdGhpcyBzdHVmZi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2hvd09wdGlvbnMoSU1hbmFnZWRQcm9qZWN0IHByb2opIHsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk1hbmFnZWQgUHJvamVjdDogIitwcm9qLmdldE5hbWUoKSk7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJQYXRoLlNFUEFSQVRPUj0iK1BhdGguU0VQQVJBVE9SKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIlBhdGguREVWSUNFX1NFUEFSQVRPUj0iK1BhdGguREVWSUNFX1NFUEFSQVRPUik7Ci0JCUlDb25maWd1cmF0aW9uW10gY29uZmlncyA9IHByb2ouZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmF0aW9uIGNmID0gY29uZmlnc1tpXTsKLQkJCQlJVG9vbFtdIGFsbFRvb2xzID0gY2YuZ2V0VG9vbHMoKTsKLQotCQkJCWludCBudW1Ub29scyA9IGFsbFRvb2xzLmxlbmd0aDsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmZpZyAiICsgaSArICI6ICIgKyBjZi5nZXROYW1lKCkrICIgaGFzICIrbnVtVG9vbHMrIiB0b29scy4iKTsKLQotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgYWxsVG9vbHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJSVRvb2wgdG9vbCA9IGFsbFRvb2xzW2tdOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgVG9vbCAiICsgayArICI6ICIgKyB0b29sLmdldE5hbWUoKSk7Ci0JCQkJCS8vYm9vbGVhbiByYz10b29sLnNldFRvb2xDb21tYW5kKCJmb28iKTsKLQkJCQkJU3RyaW5nIHRvb2xDbWQ9dG9vbC5nZXRUb29sQ29tbWFuZCgpOwotCQkJCQlTdHJpbmcgdG9vbElEPXRvb2wuZ2V0SWQoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGNtZD0iK3Rvb2xDbWQrIiAgdG9vbElEPSIrdG9vbElEKTsKLQkJCQkJCi0JCQkJCQotCQkJCQlJT3B0aW9uW10gb3B0aW9ucyA9IHRvb2wuZ2V0T3B0aW9ucygpOwotCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCQkJSU9wdGlvbiBvcHQgPSBvcHRpb25zW2pdOwotCQkJCQkJU3RyaW5nIGZvdW5kT3B0aW9uSUQgPSBvcHQuZ2V0SWQoKTsKLQkJCQkJCWludCB0eXBlPW9wdC5nZXRWYWx1ZVR5cGUoKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIG9wdGlvbiAiICsgaiArICIgIiArIG9wdC5nZXROYW1lKCkgKyAiIGlkPSIKLQkJCQkJCQkJKyBmb3VuZE9wdGlvbklEKyIgIHR5cGU9IitzaG93VHlwZSh0eXBlKSk7Ci0JCQkJCQlpZihvcHQuZ2V0VmFsdWVUeXBlKCk9PUlPcHRpb24uSU5DTFVERV9QQVRIKSB7Ci0JCQkJCQkJc2hvd0luY2x1ZGVQYXRocyhvcHQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb25maWcgIiArIGkgKyAiOiAiICsgY2YuZ2V0TmFtZSgpCi0JCQkJCQkrICI9PT09PT09IEVuZCBvZiBBTEwgdG9vbHMgIik7Ci0JCQkJCi0JCQkJLy8gYW5vdGhlciB3YXkgdG8gYWNjZXNzIFRvb2wKLQkJCQlTdHJpbmcgZXh0ID0gImMiOwotCQkJCUlUb29sIGNmVG9vbCA9IGNmLmdldFRvb2xGcm9tSW5wdXRFeHRlbnNpb24oZXh0KTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvb2wgYnkgZXh0OiAiICsgZXh0ICsgIiBpczogIiArIGNmVG9vbC5nZXROYW1lKCkpOwotCQkJCQotCQkJCS8vIExvb2sgZm9yIGluY2x1ZGUgcGF0aAotCQkJCUlPcHRpb24gb3B0aW9uID0gZ2V0Rmlyc3RPcHRpb25CeVR5cGUoY2YsIGNmVG9vbCwgSU9wdGlvbi5JTkNMVURFX1BBVEgpOwotCQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb25hbWUgPSBvcHRpb24uZ2V0TmFtZSgpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9wdGlvbiAiICsgb3B0aW9uLmdldElkKCkgKyAiIGlzICIgKyBvbmFtZSk7Ci0JCQkJCXNob3dJbmNsdWRlUGF0aHMob3B0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGluY2x1ZGUgcGF0aCBvcHRpb24gZm91bmQuICIpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgc2hvd1R5cGUoaW50IHR5cGUpewotCQlpZih0eXBlPT1JT3B0aW9uLklOQ0xVREVfUEFUSCkgcmV0dXJuIHR5cGUrIiAoSU9wdGlvbi5JTkNMVURFX1BBVEgpIjsKLQkJaWYodHlwZT09SU9wdGlvbi5MSUJSQVJZX1BBVEhTKSByZXR1cm4gdHlwZSsiIChJT3B0aW9uLkxJQlJBUllfUEFUSFMpIjsKLQkJaWYodHlwZT09SU9wdGlvbi5MSUJSQVJJRVMpICAgICByZXR1cm4gdHlwZSsiIChJT3B0aW9uLkxJQlJBUklFUykiOwotCQlyZXR1cm4gdHlwZSsiICI7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIGluIGFuIG9wdGlvbiB3aGljaCBpcyBwcmVzdW1lZAotCSAqIHRvIGJlIHRoZSBpbmNsdWRlIHBhdGhzIG9wdGlvbi4KLQkgKiBAcGFyYW0gb3B0Ci0JICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93SW5jbHVkZVBhdGhzKElPcHRpb24gb3B0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlhc3NlcnQgb3B0LmdldFZhbHVlVHlwZSgpID09IElPcHRpb24uSU5DTFVERV9QQVRIIDsKLQkJLy8gaWYgdGhlIG9wdGlvbiBpcyBhIGxpc3Qgb2YgaW5jbHVkZSBwYXRocywgZGlzcGxheSB0aGVtLgotCQlTdHJpbmdbXSBpbmNsdWRlUGF0aHMgPSBvcHQuZ2V0SW5jbHVkZVBhdGhzKCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpbmNsdWRlUGF0aHMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGluY2x1ZGVQYXRoc1tpbmRleF07Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGluY2x1ZGUgcGF0aCAiICsgaW5kZXggKyAiOiAiICsgcGF0aCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFkZCBvbmUgb3IgbW9yZSBwYXRocyB0byB0aGUgbGlzdCBvZiBwYXRocwotCSAqIAotCSAqIEBwYXJhbSBleGlzdGluZ1BhdGhzIHRoZSBleGlzdGluZyBsaXN0IG9mIHBhdGhzIHRvIGFkZCB0bwotCSAqIEBwYXJhbSBuZXdQYXRoIHRoZSBuZXcgcGF0aCB0byBhZGQ7IG1heSBiZSA+MSBkaXJlY3RvcnksIHdpdGggcGF0aCBkZWxpbWl0ZXIgamF2YS5pby5GaWxlLnBhdGhTZXBhcmF0b3IgCi0JICogKHVzdWFsbHkgc2VtaWNvbG9uIG9yIGNvbG9uKQotCSAqIEByZXR1cm4gdGhlIG1lcmdlZCBsaXN0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBhZGQoU3RyaW5nW10gZXhpc3RpbmdQYXRocywgU3RyaW5nIG5ld1BhdGgpIHsKLQkJU3RyaW5nIHBhdGhTZXA9amF2YS5pby5GaWxlLnBhdGhTZXBhcmF0b3I7ICAvLyBzZW1pY29sb24gZm9yIHdpbmRvd3MsIGNvbG9uIGZvciBNYWMvTGludXgKLQkJTGlzdDxTdHJpbmc+IG5ld1BhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZyBwYXRoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGggPSBleGlzdGluZ1BhdGhzW2ldOwotCQkJbmV3UGF0aExpc3QuYWRkKHBhdGgpOwotCQl9Ci0JCVN0cmluZ1tdIG5ld1BhdGhBcnJheT1uZXdQYXRoLnNwbGl0KHBhdGhTZXApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1BhdGhBcnJheS5sZW5ndGg7IGkrKykgewotCQkJcGF0aCA9IG5ld1BhdGhBcnJheVtpXTsKLQkJCW5ld1BhdGhMaXN0LmFkZChwYXRoKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gbmV3QXJyYXk9KFN0cmluZ1tdKW5ld1BhdGhMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCXJldHVybiBuZXdBcnJheTsKLQkJCi0JCS8qCi0KLQkJKi8KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBzaW5nbGUgc3RyaW5nIHRvIGFuIGFycmF5IG9mIHN0cmluZ3MKLQkgKiBAcGFyYW0gc3RyTGlzdAotCSAqIEBwYXJhbSBuZXdTdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBhZGROb3RQYXRoKFN0cmluZ1tdIHN0ckxpc3QsIFN0cmluZyBuZXdTdHIpIHsKLQkJaW50IGxlbiA9IHN0ckxpc3QubGVuZ3RoOwotCQlTdHJpbmcgbmV3TGlzdFtdID0gbmV3IFN0cmluZ1tsZW4gKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJMaXN0LCAwLCBuZXdMaXN0LCAwLCBsZW4pOwotCQluZXdMaXN0W2xlbl0gPSBuZXdTdHI7Ci0JCXJldHVybiBuZXdMaXN0OwotCX0KLQkvKioKLQkgKiBTaW1wbGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGl0ZW1zIGluIGEgc3RyaW5nIGFycmF5Ci0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdW5yb2xsIChTdHJpbmdbXSBsaXN0KXsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdD1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vbGlzdCA9IG5ldyBTdHJpbmdbXXsib25lIiwidHdvIn07Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKGxpc3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBsaXN0W2ldOwotCQkJcmVzdWx0LmFwcGVuZChzdHJpbmcpOwotCQkJcmVzdWx0LmFwcGVuZCgiLCAiKTsKLQkJCQotCQkJCi0JCX0KLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDIpIHsKLQkJCXJlc3VsdC5kZWxldGUocmVzdWx0Lmxlbmd0aCgpIC0gMiwgcmVzdWx0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIG9wdGlvbnMgb2YgYSBzcGVjaWZpYyB0eXBlLjxicj4KLQkgKiBXZSByZWFsbHkgbmVlZCBhbiBJVG9vbC5nZXRPcHRpb25zQnlUeXBlKGludCkgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbwotCSAqIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGNmCi0JICogICAgICAgICAgICB0aGUgSUNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggdG8gc2VhcmNoCi0JICogQHBhcmFtIGNmVG9vbAotCSAqICAgICAgICAgICAgdGhlIElUb29sIHdob3NlIG9wdGlvbnMgYXJlIGJlaW5nIHNlYXJjaGVkCi0JICogQHBhcmFtIG9wdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBvcHRpb24gdHlwZSB3ZSBhcmUgbG9va2luZyBmb3IsIGUuZy4gSU9wdGlvbi5TT01FVEhJTkcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0PElPcHRpb24+IGdldE9wdGlvbnNCeVR5cGUoSUNvbmZpZ3VyYXRpb24gY2YsIElUb29sIGNmVG9vbCwgaW50IG9wdGlvblR5cGUpIHsKLQotCQkvLyBydW4gdGhydSBBTEwgb3B0aW9ucyBhbmQgY2hlY2sgdHlwZSBmb3IgZWFjaCwgcmV0dXJuaW5nIHRoZSBvbmVzIHRoYXQgbWF0Y2gKLQkJSU9wdGlvbltdIGFsbE9wdGlvbnMgPSBjZlRvb2wuZ2V0T3B0aW9ucygpOwotCQlMaXN0PElPcHRpb24+IGZvdW5kT3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SU9wdGlvbj4oKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE9wdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlPcHRpb24gb3B0aW9uID0gYWxsT3B0aW9uc1tpXTsKLQotCQkJaW50IG9UeXBlID0gMDsKLQkJCXRyeSB7Ci0JCQkJb1R5cGUgPSBvcHRpb24uZ2V0VmFsdWVUeXBlKCk7Ci0JCQl9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAob3B0aW9uVHlwZSA9PSBvVHlwZSkgewotCQkJCS8vIGFkZCBpdCB0byB0aGUgbGlzdAotCQkJCWZvdW5kT3B0aW9ucy5hZGQob3B0aW9uKTsKLQkJCX0KLQotCQl9Ci0JCS8vSU9wdGlvbltdIHJldD0gZm91bmRPcHRpb25zLnRvQXJyYXkobmV3IElPcHRpb25bZm91bmRPcHRpb25zLnNpemUoKV0pOwotCQlyZXR1cm4gZm91bmRPcHRpb25zOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8aT5maXJzdDwvaT4gb3B0aW9uIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSB0b29sCi0JICogQHBhcmFtIGNmCi0JICogQHBhcmFtIGNmVG9vbAotCSAqIEBwYXJhbSBvcHRpb25UeXBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSU9wdGlvbiBnZXRGaXJzdE9wdGlvbkJ5VHlwZShJQ29uZmlndXJhdGlvbiBjZiwgSVRvb2wgY2ZUb29sLCBpbnQgb3B0aW9uVHlwZSl7Ci0JCUxpc3Q8SU9wdGlvbj4gYWxsT3B0aW9ucz1nZXRPcHRpb25zQnlUeXBlKGNmLGNmVG9vbCxvcHRpb25UeXBlKTsKLQkJaWYoYWxsT3B0aW9ucy5zaXplKCk+MCl7Ci0JCQlyZXR1cm4gYWxsT3B0aW9ucy5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotCi0vKioKLSAqIAotICogU29tZSBzYW1wbGUgdG9vbCBkYXRhIGZyb20gc2hvd09wdGlvbnMoKSBvbiBXaW5kb3dzIFhQIHdpdGggY3lnd2luIFRvb2wgMToKLSAqIEdDQyBDIENvbXBpbGVyCi0gKiA8cD4KLSAqIAotICogb3B0aW9uIDAgRG8gbm90IHNlYXJjaCBzeXN0ZW0gZGlyZWN0b3JpZXMgKC1ub3N0ZGluYykKLSAqIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3Iubm9zdGRpbmM8YnI+Ci0gKiBvcHRpb24gMSBQcmVwcm9jZXNzIG9ubHkgKC1FKQotICogaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci5wcmVwcm9jZXNzPGJyPgotICogb3B0aW9uIDIgRGVmaW5lZCBzeW1ib2xzICgtRCkKLSAqIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmLnN5bWJvbHM8YnI+Ci0gKiBvcHRpb24gMyBVbmRlZmluZWQgc3ltYm9scyAoLVUpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ucHJlcHJvY2Vzc29yLnVuZGVmLnN5bWJvbDxicj4KLSAqIG9wdGlvbiA0IEluY2x1ZGUgcGF0aHMgKC1JKSBpZD1nbnUuYy5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRoczxicj4KLSAqIG9wdGlvbiA1IE9wdGltaXphdGlvbiBMZXZlbAotICogaWQ9Z251LmMuY29tcGlsZXIuY3lnd2luLmV4ZS5yZWxlYXNlLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWw8YnI+Ci0gKiBvcHRpb24gNiBPdGhlciBvcHRpbWl6YXRpb24gZmxhZ3MgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5mbGFnczxicj4KLSAqIG9wdGlvbiA3IERlYnVnIExldmVsCi0gKiBpZD1nbnUuYy5jb21waWxlci5jeWd3aW4uZXhlLnJlbGVhc2Uub3B0aW9uLmRlYnVnZ2luZy5sZXZlbDxicj4KLSAqIG9wdGlvbiA4IE90aGVyIGRlYnVnZ2luZyBmbGFncyBpZD1nbnUuYy5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLm90aGVyPGJyPgotICogb3B0aW9uIDkgR2VuZXJhdGUgZ3Byb2YgaW5mb3JtYXRpb24gKC1wZykKLSAqIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcuZ3Byb2Y8YnI+Ci0gKiBvcHRpb24gMTAgR2VuZXJhdGUgcHJvZiBpbmZvcm1hdGlvbiAoLXApCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLnByb2Y8YnI+Ci0gKiBvcHRpb24gMTEgQ2hlY2sgc3ludGF4IG9ubHkgKC1mc3ludGF4LW9ubHkpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3Muc3ludGF4PGJyPgotICogb3B0aW9uIDEyIFBlZGFudGljICgtcGVkYW50aWMpIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi53YXJuaW5ncy5wZWRhbnRpYzxicj4KLSAqIG9wdGlvbiAxMyBQZWRhbnRpYyB3YXJuaW5ncyBhcyBlcnJvcnMgKC1wZWRhbnRpYy1lcnJvcnMpCi0gKiBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3MucGVkYW50aWMuZXJyb3I8YnI+Ci0gKiBvcHRpb24gMTQgSW5oaWJpdCBhbGwgd2FybmluZ3MgKC13KSBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3Mubm93YXJuPGJyPgotICogb3B0aW9uIDE1IEFsbCB3YXJuaW5ncyAoLVdhbGwpIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi53YXJuaW5ncy5hbGx3YXJuPGJyPgotICogb3B0aW9uIDE2IFdhcm5pbmdzIGFzIGVycm9ycyAoLVdlcnJvcikKLSAqIGlkPWdudS5jLmNvbXBpbGVyLm9wdGlvbi53YXJuaW5ncy50b2Vycm9yczxicj4KLSAqIG9wdGlvbiAxNyBPdGhlciBmbGFncyBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ubWlzYy5vdGhlcjxicj4KLSAqIG9wdGlvbiAxOCBWZXJib3NlICgtdikgaWQ9Z251LmMuY29tcGlsZXIub3B0aW9uLm1pc2MudmVyYm9zZTxicj4KLSAqIG9wdGlvbiAxOSBTdXBwb3J0IEFOU0kgcHJvZ3JhbXMgKC1hbnNpKSBpZD1nbnUuYy5jb21waWxlci5vcHRpb24ubWlzYy5hbnNpPGJyPgotICogCi0gKiBUb29sIDI6IEdDQyBDIExpbmtlciA8YnI+Ci0gKiBvcHRpb24gNSBMaWJyYXJpZXMgKC1sKSBpZD1nbnUuYy5saW5rLm9wdGlvbi5saWJzPGJyPgotICogb3B0aW9uIDYgTGlicmFyeSBzZWFyY2ggcGF0aCAoLUwpIGlkPWdudS5jLmxpbmsub3B0aW9uLnBhdGhzPGJyPgotICogCi0gKi8KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL09wZW5NUFByb2plY3RQcm9jZXNzUGFnZXMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9PcGVuTVBQcm9qZWN0UHJvY2Vzc1BhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NTNiZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL09wZW5NUFByb2plY3RQcm9jZXNzUGFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudWkudGVtcGxhdGVlbmdpbmUuSVBhZ2VzQWZ0ZXJUZW1wbGF0ZVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZW1wbGF0ZWVuZ2luZS5JV2l6YXJkRGF0YVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5NUFByb2plY3RQcm9jZXNzUGFnZXMgaW1wbGVtZW50cyBJUGFnZXNBZnRlclRlbXBsYXRlU2VsZWN0aW9uUHJvdmlkZXIgewotCUlXaXphcmREYXRhUGFnZVtdIHBhZ2VzOwotCQotCXB1YmxpYyBJV2l6YXJkRGF0YVBhZ2VbXSBjcmVhdGVBZGRpdGlvbmFsUGFnZXMoSVdvcmtiZW5jaFdpemFyZCB3aXphcmQsCi0JCQlJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlwYWdlcz0gbmV3IElXaXphcmREYXRhUGFnZVtdIHtuZXcgT3Blbk1QUHJvamVjdFdpemFyZFBhZ2UoKX07Ci0JCQkvLyBUT0RPIC0gbG9nIGVycm9yCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcGFnZXM9IG5ldyBJV2l6YXJkRGF0YVBhZ2VbMF07Ci0JCX0KLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQotCXB1YmxpYyBJV2l6YXJkRGF0YVBhZ2VbXSBnZXRDcmVhdGVkUGFnZXMoSVdvcmtiZW5jaFdpemFyZCB3aXphcmQpIHsKLQkJcmV0dXJuIHBhZ2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvd2l6YXJkcy93aXphcmRQYWdlcy9PcGVuTVBQcm9qZWN0V2l6YXJkUGFnZS5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL09wZW5NUFByb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZGFlNWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC93aXphcmRzL3dpemFyZFBhZ2VzL09wZW5NUFByb2plY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwyMDA4IElCTSBDb3JwLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3JwLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlLk9wZW5NUElEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5PcGVuTVBQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFdpemFyZCBQYWdlIGZvciBjb2xsZWN0aW5nIGluZm8gYWJvdXQgT3Blbk1QIHByb2plY3QgLSBhcHBlbmRlZCB0byBlbmQgb2YKLSAqICJOZXcgIEMgcHJvamVjdCIgd2l6YXJkCi0gKiAKLSAqIFRPRE8gcmVtb3ZlIGR1cCBjb2RlLCBzaGFyZSB3aXRoIE1QSSB2ZXJzaW9uIGluIGEgY29tbW9uIGNsYXNzIGV0Yy4KLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTVBQcm9qZWN0V2l6YXJkUGFnZSBleHRlbmRzIEFic3RyYWN0UHJvamVjdFdpemFyZFBhZ2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHRyYWNlT249ZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHdpemFyZFRyYWNlT249ZmFsc2U7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9JRD0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy53aXphcmRQYWdlcy5PcGVuTVBQcm9qZWN0V2l6YXJkUGFnZSI7Ci0KLQkvLyBUaGUgZm9sbG93aW5nIGFyZSBJRHMgZm9yIHN0b3JpbmcgaW5mbyBpbiBNQlNQYWdlRGF0YSBzbyBpdCBjYW4gYmUgcmV0cmlldmVkIGluIE9wZW5NUFByb2plY3RQcm9jZXNzIChQcm9jZXNzUnVubmVyKQotCS8vIHdoZW4gdGhlIHdpemFyZCBpcyBkb25lLgotCS8qKgotCSAqIFN0b3JlIGluIE1CU1BhZ2VEYXRhICAod2l0aCB0aGlzIElEKSB3aGV0aGVyIHVzZXIgd2FudHMgdG8gaW5jbHVkZSBPcGVuTVAgaW5mbyBpbiB0aGUgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19PcGVuTVBfSU5DTFVERVMgPSAiZG9PcGVuTVBpbmNsdWRlcyI7Ci0JLyoqCi0JICogc3RvcmUgaW4gTUJTUGFnZURhdGEgKHdpdGggdGhpcyBJRCkgd2hhdCB0aGUgaW5jbHVkZSBwYXRoIHRvIE9wZW5NUCB3aWxsIGJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfUEFUSF9QUk9QX0lEID0gImluY2x1ZGVQYXRoIjsKLQkvKioKLQkgKiBzdG9yZSBpbiBNQlNQYWdlRGF0YSAod2l0aCB0aGlzIElEKSB3aGF0IHRoZSBsaWJyYXJ5IG5hbWUgZm9yIHRoZSBsaW5rZXIgaXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCX1BST1BfSUQgPSAibGliIjsKLQkvKioKLQkgKiBzdG9yZSBpbiBNQlNQYWdlRGF0YSAod2l0aCB0aGlzIElEKSB3aGF0IHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfU0VBUkNIX1BBVEhfUFJPUF9JRCA9ICJsaWJQYXRoIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPcGVuTVBfQ09NUElMRV9DT01NQU5EX1BST1BfSUQgPSAiT3Blbk1QQ29tcGlsZUNvbW1hbmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9wZW5NUF9MSU5LX0NPTU1BTkRfUFJPUF9JRCA9ICJPcGVuTVBMaW5rQ29tbWFuZCI7Ci0KLQlwcml2YXRlIFN0cmluZyBjdXJyZW50T3Blbk1QSW5jbHVkZVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExpYk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExpYlBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudE9wZW5NUENvbXBpbGVDb21tYW5kOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRPcGVuTVBMaW5rQ29tbWFuZDsKLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRPcGVuTVBJbmNsdWRlUGF0aDsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T3Blbk1QTGliTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T3Blbk1QTGliUGF0aDsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T3Blbk1QQnVpbGRDb21tYW5kOwotCQotCXByaXZhdGUgVGV4dCBpbmNsdWRlUGF0aEZpZWxkOwotCXByaXZhdGUgVGV4dCBsaWJOYW1lRmllbGQ7Ci0JcHJpdmF0ZSBUZXh0IGxpYlBhdGhGaWVsZDsKLQlwcml2YXRlIFRleHQgb3Blbk1QQ29tcGlsZUNvbW1hbmRGaWVsZCwgb3Blbk1QTGlua0NvbW1hbmRGaWVsZDsKLQkKLQlwcml2YXRlIExhYmVsIGluY2x1ZGVQYXRoTGFiZWwsIGxpYkxhYmVsLCBsaWJQYXRoTGFiZWwsIG9wZW5NUENvbXBpbGVDb21tYW5kTGFiZWwsIG9wZW5NUExpbmtDb21tYW5kTGFiZWw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uMjsKLQotCXByaXZhdGUgQnV0dG9uIHVzZURlZmF1bHRzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHVzZU9wZW5NUFByb2plY3RTZXR0aW5nc0J1dHRvbjsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRVc2VPcGVuTVBJbmNsdWRlcz10cnVlOwotCQotCXByaXZhdGUgQnV0dG9uIE9wZW5NUFNhbXBsZUJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDI1MDsKLQkvKioKLQkgKiBCeSBkZWZhdWx0IHdlIERPIHVzZSBPcGVuTVAgcHJvamVjdCBzZXR0aW5ncyBpbiBhIG5ldyBwcm9qZWN0Ljxicj4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXNlT3Blbk1QUHJvamVjdFNldHRpbmdzPXRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzYyA9ICJPcGVuTVAgUHJvamVjdCBQYWdlIjsKLQkKLQkvKioKLQkgKiBUaGUgQ0RUIG5ldyBwcm9qZWN0IHdpemFyZCBwYWdlIGZvciBPcGVuTVAgcHJvamVjdHMuICAKLQkgKiBBZGRzIHRoZSBpbmNsdWRlIHBhdGhzLCBsaWJyYXJ5IGluZm9ybWF0aW9uLCBldGMuIGZvciBhbiBNUEkgcHJvamVjdC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICogCi0JICovCi0JcHVibGljIE9wZW5NUFByb2plY3RXaXphcmRQYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcigiT3Blbk1QIFByb2plY3QgU2V0dGluZ3MiKTsKLQkJcHJlZklEaW5jbHVkZXM9T3Blbk1QSURzLk9wZW5NUF9JTkNMVURFUzsKLQkJaWYod2l6YXJkVHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5NUFByb2plY3RXaXphcmRQYWdlKCkuY3Rvci4uLiIpOwotCi0JCS8vQ29tbW9uUGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCJUZXN0IGVycm9yIik7Ci0JCS8vQ29tbW9uUGx1Z2luLmxvZyhJU3RhdHVzLldBUk5JTkcsIlRlc3Qgd2FybmluZyIpOwotCQkKLQkJLy8gYWNjZXNzIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGZyb20gdGhlIE9wZW5NUCBwbHVnaW4KLQkJcHJlZmVyZW5jZVN0b3JlID0gT3Blbk1QUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIG1pcD1wcmVmZXJlbmNlU3RvcmUuZ2V0U3RyaW5nKHByZWZJRGluY2x1ZGVzKTsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBPcGVuTVAgaW5jbHVkZSBwcmVmIGZyb20gb3RoZXIgcGx1Z2luOiAiK21pcCk7Ci0KLQkJLy8gU2V0IHRoZSBkZWZhdWx0cyBoZXJlIGluIHRoZSB3aXphcmQgcGFnZSBjb25zdHJ1Y3RvciBhbmQganVzdAotCQkvLyBvdmVyd3JpdGUgdGhlbSBpZiB0aGUgdXNlciBjaGFuZ2VzIHRoZW0uCi0JCWRlZmF1bHRPcGVuTVBJbmNsdWRlUGF0aCA9IHByZWZlcmVuY2VTdG9yZS5nZXRTdHJpbmcocHJlZklEaW5jbHVkZXMpOwotCQlpZihkZWZhdWx0T3Blbk1QSW5jbHVkZVBhdGgubGVuZ3RoKCk9PTApIHsKLQkJCS8vIHdhcm4gaWYgbm8gT3Blbk1QIHByZWZlcmVuY2VzIGhhdmUgYmVlbiBzZXQKLQkJCVN0cmluZyBuZXdJbmNsdWRlUGF0aD1zaG93Tm9QcmVmcygiT3Blbk1QIixwcmVmSURpbmNsdWRlcyk7Ci0JCQlkZWZhdWx0T3Blbk1QSW5jbHVkZVBhdGg9bmV3SW5jbHVkZVBhdGg7Ci0JCX0KLQkJc2V0RGVmYXVsdE90aGVyTmFtZXMoZGVmYXVsdE9wZW5NUEluY2x1ZGVQYXRoKTsKLQkJLy8gdGhlIGZvbGxvd2luZyBzZXRzIHdoYXQgd2lsbCBiZSByZW1lbWJlcmVkIHdoZW4gd2UgbGVhdmUgdGhlIHBhZ2UuCi0JCXNldEN1cnJlbnRPcGVuTVBJbmNsdWRlUGF0aChkZWZhdWx0T3Blbk1QSW5jbHVkZVBhdGgpOwotCQkKLQkJZGVmYXVsdE9wZW5NUEJ1aWxkQ29tbWFuZD1wcmVmZXJlbmNlU3RvcmUuZ2V0U3RyaW5nKE9wZW5NUElEcy5PcGVuTVBfQlVJTERfQ01EKTsKLQkJc2V0Q3VycmVudE9wZW5NUENvbXBpbGVDb21tYW5kKGRlZmF1bHRPcGVuTVBCdWlsZENvbW1hbmQpOwotCQlzZXRDdXJyZW50T3Blbk1QTGlua0NvbW1hbmQoZGVmYXVsdE9wZW5NUEJ1aWxkQ29tbWFuZCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBXYXJuIHVzZXIgdGhhdCB0aGUgT3Blbk1QIHByb2plY3QgcHJlZmVyZW5jZXMgYXJlbid0IHNldCwgYW5kIHRodXMgdGhlIG5ldyBwcm9qZWN0IHdpemFyZCB3aWxsIG5vdCBiZSB2ZXJ5IHVzZWZ1bC4KLQkgKiA8YnI+Ci0JICogVE9ETzogZG8gd2UgbmVlZCBhICJkbyBub3Qgc2hvdyB0aGlzIG1lc3NhZ2UgYWdhaW4iIHNldHRpbmc/IChhZiAtIHllcyBwbGVhc2UhIDspCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5U2hvd247Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93Tm9QcmVmczEoKSB7Ci0JCWlmKCFhbHJlYWR5U2hvd24pIHsKLQkJCVNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1Zj1uZXcgU3RyaW5nQnVmZmVyKCJObyBPcGVuTVAgUHJlZmVyZW5jZXMgc2V0OyAiKTsKLQkJCWJ1Zi5hcHBlbmQoIkRlZmF1bHQgcHJvamVjdCBzZXR0aW5nIHdpbGwgYmUgbW9yZSB1c2VmdWwgaWYgT3Blbk1QIHByZWZlcmVuY2VzIGFyZSBzZXQgZmlyc3QuICIpOwotCQkJYnVmLmFwcGVuZCgiXG5Vc2UgV2luZG93ID4gUHJlZmVyZW5jZXMgYW5kIHNlbGVjdCBQYXJhbGxlbCBMYW5ndWFnZSBEZXZlbG9wbWVudCBUb29scywgd2hpY2ggbWF5IGJlIHVuZGVyIFBUUCBwcmVmZXJlbmNlcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoIllvdSBjYW4gY2FuY2VsIG91dCBvZiBuZXcgcHJvamVjdCB3aXphcmQgdG8gZW50ZXIgT3Blbk1QIHByZWZlcmVuY2VzIG5vdy4iKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsICJObyBPcGVuTVAgUHJlZmVyZW5jZXMgc2V0IiwgYnVmLnRvU3RyaW5nKCkpOwotCQkJYWxyZWFkeVNob3duPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IGxpYiBuYW1lIGFuZCBsaWIgcGF0aCBiYXNlZCBvbiB3aGF0IHRoZSAKLQkgKiBpbmNsdWRlIHBhdGggaXMuICBXZSBhc3N1bWUgc29tZXRoaW5nIGxpa2UKLQkgKiA8Y29kZT5vcGVuTVBJbmNsdWRlcGF0aD0vbXkvcGF0aC9pbmNsdWRlPC9jb2RlPgotCSAqIGluIHdoaWNoIGNhc2Ugd2Ugc2V0Ci0JICogPGNvZGU+bGliTmFtZT0ibGliIiA8L2NvZGU+YW5kIDxjb2RlPiBkZWZhdWx0T3Blbk1QTGliUGF0aD0vbXkvcGF0aC9saWI8L2NvZGU+LgotCSAqIDxwPgotCSAqIEFsc28sIHNldCB0aGUgaW5pdGlhbCBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgTUJTIHBhZ2UgZGF0YSwKLQkgKiBzbyBpZiB1c2VyIGNoYW5nZXMgbm90aGluZyBvbiB0aGlzIHBhZ2UsIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIHdpbGwgYmUgcGlja2VkIHVwLgotCSAqIAotCSAqIEBwYXJhbSBvcGVuTVBpbmNsdWRlUGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0T3RoZXJOYW1lcyhTdHJpbmcgb3Blbk1QaW5jbHVkZVBhdGgpIHsKLQkJZGVmYXVsdE9wZW5NUExpYk5hbWU9Im9wZW5tcCI7Ci0JCXNldEN1cnJlbnRPcGVuTVBMaWJOYW1lKGRlZmF1bHRPcGVuTVBMaWJOYW1lKTsKLQkJCi0JCS8vIGlmID4xIHBhdGggaW4gb3Blbm1wIGluY2x1ZGUgcGF0aCwgdXNlIGp1c3QgdGhlIGZpcnN0Ci0JCS8vIG9uZSB0byBndWVzcyBhdCB0aGUgbGlicGF0aAotCQlTdHJpbmcgdGVtcFBhdGg9b3Blbk1QaW5jbHVkZVBhdGg7Ci0JCWludCBzZXBMb2M9dGVtcFBhdGguaW5kZXhPZihqYXZhLmlvLkZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQlpZigtMSE9c2VwTG9jKSB7Ci0JCQl0ZW1wUGF0aD1vcGVuTVBpbmNsdWRlUGF0aC5zdWJzdHJpbmcoMCwgc2VwTG9jKTsKLQkJfQotCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcodGVtcFBhdGgpOwotCQlwYXRoPXBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlwYXRoPXBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotCQlkZWZhdWx0T3Blbk1QTGliUGF0aD1wYXRoLnRvU3RyaW5nKCkrImxpYiI7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0T3Blbk1QTGliUGF0aD0iK2RlZmF1bHRPcGVuTVBMaWJQYXRoKTsKLQkJc2V0Q3VycmVudE9wZW5NUExpYlBhdGgoZGVmYXVsdE9wZW5NUExpYlBhdGgpOwotCQkKLQkJLy9zdGFuZGFyZGl6ZSBmb3JtYXQgZm9yIG9wZW5tcCBpbmNsdWRlIHBhdGgsIHRvbwotCQlwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcob3Blbk1QaW5jbHVkZVBhdGgpOwotCQlTdHJpbmcgdGVtcD1wYXRoLnRvU3RyaW5nKCk7Ci0JCXRlbXA9c3RyaXBUcmFpbGluZ1NlcGFyYXRvcih0ZW1wKTsKLQkJZGVmYXVsdE9wZW5NUEluY2x1ZGVQYXRoPXRlbXA7Ci0JCXNldEN1cnJlbnRPcGVuTVBJbmNsdWRlUGF0aChkZWZhdWx0T3Blbk1QSW5jbHVkZVBhdGgpOwkKLQkJCQotCQlzZXRDdXJyZW50T3Blbk1QQ29tcGlsZUNvbW1hbmQoZGVmYXVsdE9wZW5NUEJ1aWxkQ29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHdoYXQgd2lsbCBiZSByZW1lbWJlcmVkIGZvciBPcGVuTVAgaW5jbHVkZSBwYXRoIHdoZW4gd2UgbGVhdmUgdGhlIHdpemFyZCBwYWdlCi0JICogKHNvIHdlIGNhbiByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgUHJvY2Vzc1J1bm5lciB0byBhY3R1YWxseSBkbyB0aGUgY2hhbmdlCi0JICogdG8gdGhlIHByb2plY3QgaW5mbykKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50T3Blbk1QSW5jbHVkZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJY3VycmVudE9wZW5NUEluY2x1ZGVQYXRoID0gcGF0aDsKLQkJcGFnZURhdGEucHV0KFBBR0VfSUQrRE9UK0lOQ0xVREVfUEFUSF9QUk9QX0lELCBwYXRoKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBzZXRzIHdoYXQgd2lsbCBiZSByZW1lbWJlcmVkIGZvciBsaWJyYXJ5IG5hbWUgd2hlbiB3ZSBsZWF2ZSB0aGUgd2l6YXJkIHBhZ2UKLQkgKiAoc28gd2UgY2FuIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBQcm9jZXNzUnVubmVyIHRvIGFjdHVhbGx5IGRvIHRoZSBjaGFuZ2UKLQkgKiB0byB0aGUgcHJvamVjdCBpbmZvKQotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRPcGVuTVBMaWJOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWN1cnJlbnRPcGVuTVBJbmNsdWRlUGF0aCA9IG5hbWU7Ci0JCXBhZ2VEYXRhLnB1dChQQUdFX0lEK0RPVCtMSUJfUFJPUF9JRCwgbmFtZSk7Ci0JfQotCQotCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFnZURhdGE9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQotCS8qKgotCSAqIFRoaXMgc2V0cyB3aGF0IHdpbGwgYmUgcmVtZW1iZXJlZCBmb3IgbGlicmFyeSBzZWFyY2ggcGF0aCB3aGVuIHdlIGxlYXZlIHRoZSB3aXphcmQgcGFnZQotCSAqIChzbyB3ZSBjYW4gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFByb2Nlc3NSdW5uZXIgdG8gYWN0dWFsbHkgZG8gdGhlIGNoYW5nZQotCSAqIHRvIHRoZSBwcm9qZWN0IGluZm8pCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudE9wZW5NUExpYlBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJY3VycmVudE9wZW5NUEluY2x1ZGVQYXRoID0gcGF0aDsKLQkJcGFnZURhdGEucHV0KFBBR0VfSUQrRE9UK0xJQlJBUllfU0VBUkNIX1BBVEhfUFJPUF9JRCwgcGF0aCk7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50T3Blbk1QQ29tcGlsZUNvbW1hbmQoU3RyaW5nIGJ1aWxkQ29tbWFuZCkgewotCQljdXJyZW50T3Blbk1QQ29tcGlsZUNvbW1hbmQgPSBidWlsZENvbW1hbmQ7Ci0JCXBhZ2VEYXRhLnB1dChQQUdFX0lEK0RPVCtPcGVuTVBfQ09NUElMRV9DT01NQU5EX1BST1BfSUQsIGJ1aWxkQ29tbWFuZCk7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50T3Blbk1QTGlua0NvbW1hbmQoU3RyaW5nIGJ1aWxkQ29tbWFuZCkgewotCQljdXJyZW50T3Blbk1QTGlua0NvbW1hbmQgPSBidWlsZENvbW1hbmQ7Ci0JCXBhZ2VEYXRhLnB1dChQQUdFX0lEK0RPVCtPcGVuTVBfTElOS19DT01NQU5EX1BST1BfSUQsIGJ1aWxkQ29tbWFuZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhkZXNjICsgIiBuYW1lIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIGluIG9uZSBvZiB0aGUgcGF0aCBmaWVsZHMuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXRoRnJvbVBhdGhGaWVsZChUZXh0IHRleHRGaWVsZCkgewotCQlVUkkgZmllbGRVUkk7Ci0JCXRyeSB7Ci0JCQlmaWVsZFVSSSA9IG5ldyBVUkkodGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdGV4dEZpZWxkLmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gZmllbGRVUkkuZ2V0UGF0aCgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgaW5jbHVkZSBwYXRoIGZpZWxkIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZFBhdGgKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSW5jbHVkZVBhdGhGaWVsZChTdHJpbmcgc2VsZWN0ZWRQYXRoKSB7Ci0JCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJNUFdQLnVwZGF0ZUxvY2F0aW9uRmllbGQgdG8gIiArIHNlbGVjdGVkUGF0aCk7Ci0JCWluY2x1ZGVQYXRoRmllbGQuc2V0VGV4dChzZWxlY3RlZFBhdGgpOwotCX0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGxpYiBwYXRoIGZpZWxkIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZFBhdGgKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGliUGF0aEZpZWxkKFN0cmluZyBzZWxlY3RlZFBhdGgpIHsKLQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk1QV1AudXBkYXRlTG9jYXRpb25GaWVsZCB0byAiICsgc2VsZWN0ZWRQYXRoKTsKLQkJbGliUGF0aEZpZWxkLnNldFRleHQoc2VsZWN0ZWRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyIGFuZCBnZXQgc2VsZWN0ZWQgZGlyZWN0b3J5IDxicj4KLQkgKiBUT0RPOiBjYW4gd2UgdXNlIHRoZSBkaWFsb2cgdGhhdCBDRFQgdXNlcyBoZXJlPyBBbGxvd3MgZGlyZWN0IHR5cGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCkgewotCi0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IG51bGw7Ci0JCVN0cmluZyBkaXJOYW1lID0gZ2V0UGF0aEZyb21QYXRoRmllbGQoaW5jbHVkZVBhdGhGaWVsZCk7Ci0KLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coaW5jbHVkZVBhdGhGaWVsZC5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIk9wZW5NUCBJbmNsdWRlIHBhdGg6Iik7Ci0KLQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0KLQkJc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCi0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl1cGRhdGVJbmNsdWRlUGF0aEZpZWxkKHNlbGVjdGVkRGlyZWN0b3J5KTsKLQotCQkJaW5jbHVkZVBhdGhGaWVsZC5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJEaXJlY3RvcnkgZm91bmQgdmlhIGJyb3dzZTogIiArIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCS8vIHNldCB2YWx1ZSB0byB3aGVyZSB3ZSBjYW4gZmluZCBpdCBpbiB0aGUgUHJvY2Vzc1J1bm5lciBsYXRlcgotCQkJc2V0Q3VycmVudE9wZW5NUEluY2x1ZGVQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b24yUHJlc3NlZCgpIHsKLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBudWxsOwotCQlTdHJpbmcgZGlyTmFtZSA9IGdldFBhdGhGcm9tUGF0aEZpZWxkKGxpYlBhdGhGaWVsZCk7Ci0KLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobGliUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiT3Blbk1QIGxpYnJhcnkgc2VhcmNoIHBhdGg6Iik7Ci0KLQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0KLQkJc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCi0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl1cGRhdGVMaWJQYXRoRmllbGQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCi0JCQlsaWJQYXRoRmllbGQuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiRGlyZWN0b3J5IGZvdW5kIHZpYSBicm93c2U6ICIgKyBzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkvLyBzZXQgdmFsdWUgdG8gd2hlcmUgd2UgY2FuIGZpbmQgaXQgaW4gdGhlIFByb2Nlc3NSdW5uZXIgbGF0ZXIKLQkJCXNldEN1cnJlbnRPcGVuTVBMaWJQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgdHJhaWxpbmcgZGV2aWNlIHNlcGFyYXRvciBjaGFyYWN0aGVyIChlLmcuIDsgb24gd2luZG93cyBvciA6IG9uIExpbnV4KQotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgd2l0aG91dCBhbnkgdHJhaWxpbmcgc2VwYXJhdG9yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3RyaXBUcmFpbGluZ1NlcGFyYXRvcihTdHJpbmcgc3RyKSB7Ci0JCWlmKHN0ci5sZW5ndGgoKT09MClyZXR1cm4gc3RyOwotCQljaGFyIGxhc3RDaGFyID0gc3RyLmNoYXJBdChzdHIubGVuZ3RoKCkgLSAxKTsKLQkJaWYgKGxhc3RDaGFyID09IGphdmEuaW8uRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcikgewotCQkJU3RyaW5nIHRlbXAgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGgoKSAtIDEpOwotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXJlYSBpbiB3aGljaCB0aGUgdXNlciBjYW4gZW50ZXIgTVBJIGluY2x1ZGUgcGF0aCBhbmQgb3RoZXIgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlIHRvIHB1dCBpdCBpbgotCSAqIEBwYXJhbSBkZWZhdWx0RW5hYmxlZCBpbmRpY2F0ZXMgaWYgdGhlICJ1c2UgZGVmYXVsdHMiIGNoZWNrYm94IGlzIHRvIGJlIGluaXRpYWxseSBzZWxlY3RlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVXNlckVudHJ5QXJlYShDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGRlZmF1bHRFbmFibGVkKSB7Ci0JCS8vPz8gZXJyPyBjYXVzZXMgdGhpbmdzIHRvIGhhcHBlbiBpbiB3cm9uZyBvcmRlcj8/ICAgSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdCgpOwotCQkvL1N0cmluZyBuYW1lID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCWlmKHdpemFyZFRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJPcGVuTVBQcm9qZWN0V2l6YXJkUGFnZS5jcmVhdGVVc2VyRW50cnlBcmVhKCkgIiApOwotCQkKLQkJaW5jbHVkZVBhdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaW5jbHVkZVBhdGhMYWJlbC5zZXRUZXh0KCJJbmNsdWRlIHBhdGg6Iik7Ci0JCWluY2x1ZGVQYXRoTGFiZWwuc2V0VG9vbFRpcFRleHQoIkxvY2F0aW9uIG9mIE9wZW5NUCBpbmNsdWRlIHBhdGgocykiKTsKLQotCQkvLyBJbmNsdWRlIHBhdGggbG9jYXRpb24gIGVudHJ5IGZpZWxkCi0JCWluY2x1ZGVQYXRoRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlpbmNsdWRlUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWluY2x1ZGVQYXRoRmllbGQuc2V0VGV4dChkZWZhdWx0T3Blbk1QSW5jbHVkZVBhdGgpOwotCQlpbmNsdWRlUGF0aEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldEN1cnJlbnRPcGVuTVBJbmNsdWRlUGF0aChpbmNsdWRlUGF0aEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImxvY2F0aW9uRmllbGQubW9kaWZ5VGV4dCgpOiAiICsgY3VycmVudE9wZW5NUEluY2x1ZGVQYXRoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dCgiQnJvd3NlLi4uIik7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIkJyb3dzZSBidXR0b24gcHJlc3NlZC4iKTsKLQkJCQloYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQotCQkJfQotCQl9KTsKLQotCQkvLyBob3cgZG8gd2Uga25vdyB3aGVuIG5leHQvZmluaXNoIGJ1dHRvbiBwdXNoZWQ/IHdlIGRvbid0LgotCQkvLyB3ZSBqdXN0IHN0b3JlIGFsbCBpbmZvIHdoZXJlIHdlIGNhbiBmaW5kIGl0IHdoZW4gdGhlIE9wZW5NUFByb2plY3RQcm9jZXNzKFByb2Nlc3NSdW5uZXIpIHJ1bnMgYWZ0ZXIgYWxsIHRoZSB3aXphcmQgcGFnZXMgYXJlIGRvbmUuCi0JCQotCQlsaWJMYWJlbD1uZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpYkxhYmVsLnNldFRleHQoIkxpYnJhcnkgbmFtZToiKTsKLQkJbGliTGFiZWwuc2V0VG9vbFRpcFRleHQoIkxpYnJhcnkgbmFtZToiKTsKLQkJCi0JCWxpYk5hbWVGaWVsZD1uZXcgVGV4dChjb21wb3NpdGUsU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludD1TSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW49MjsKLQkJbGliTmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlsaWJOYW1lRmllbGQuc2V0VGV4dChkZWZhdWx0T3Blbk1QTGliTmFtZSk7Ci0JCWxpYk5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRDdXJyZW50T3Blbk1QTGliTmFtZShsaWJOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigibGliTmFtZUZpZWxkLm1vZGlmeVRleHQoKTogIiArIGN1cnJlbnRMaWJOYW1lKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkobmV3IExhYmVsKGNvbXBvc2l0ZSxTV1QuTk9ORSkpLnNldFRleHQoIiAiKTsvL3NwYWNlcgotCQkKLQkJbGliUGF0aExhYmVsPW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGliUGF0aExhYmVsLnNldFRleHQoIkxpYnJhcnkgc2VhcmNoIHBhdGg6Iik7Ci0JCWxpYlBhdGhMYWJlbC5zZXRUb29sVGlwVGV4dCgiTGlicmFyeSBuYW1lOiIpOwotCQkKLQkJCi0JCWxpYlBhdGhGaWVsZD1uZXcgVGV4dChjb21wb3NpdGUsU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZDIud2lkdGhIaW50PVNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlnZDIuaG9yaXpvbnRhbFNwYW49MjsKLQkJbGliUGF0aEZpZWxkLnNldExheW91dERhdGEoZ2QyKTsKLQkJbGliUGF0aEZpZWxkLnNldFRleHQoZGVmYXVsdE9wZW5NUExpYlBhdGgpOwotCQlsaWJQYXRoRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0Q3VycmVudE9wZW5NUExpYlBhdGgobGliUGF0aEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oImxpYlBhdGhGaWVsZC5tb2RpZnlUZXh0KCk6ICIgKyBjdXJyZW50TGliUGF0aCk7Ci0JCQl9Ci0JCX0pOwotCQkKLS8vCQkgYnJvd3NlIGJ1dHRvbgotCi0JCWJyb3dzZUJ1dHRvbjIgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24yLnNldFRleHQoIkJyb3dzZS4uLiIpOwotCQlicm93c2VCdXR0b24yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiQnJvd3NlIGJ1dHRvbiBwcmVzc2VkLiBETyBTT01FVEhJTkcgSEVSRS4iKTsKLQkJCQloYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvbjJQcmVzc2VkKCk7Ci0KLQkJCX0KLQkJfSk7Ci0JCW9wZW5NUENvbXBpbGVDb21tYW5kTGFiZWw9IG5ldyBMYWJlbChjb21wb3NpdGUsU1dULk5PTkUpOwotCQlvcGVuTVBDb21waWxlQ29tbWFuZExhYmVsLnNldFRleHQoIk9wZW5NUCBjb21waWxlIGNvbW1hbmQ6ICIpOwotCQlvcGVuTVBDb21waWxlQ29tbWFuZEZpZWxkPW5ldyBUZXh0KGNvbXBvc2l0ZSxTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QzID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkMy53aWR0aEhpbnQ9U0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWdkMy5ob3Jpem9udGFsU3Bhbj0yOwotCQlvcGVuTVBDb21waWxlQ29tbWFuZEZpZWxkLnNldExheW91dERhdGEoZ2QzKTsKLQkJb3Blbk1QQ29tcGlsZUNvbW1hbmRGaWVsZC5zZXRUZXh0KGRlZmF1bHRPcGVuTVBCdWlsZENvbW1hbmQpOwotCQlvcGVuTVBDb21waWxlQ29tbWFuZEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldEN1cnJlbnRPcGVuTVBDb21waWxlQ29tbWFuZChvcGVuTVBDb21waWxlQ29tbWFuZEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJaWYodHJhY2VPbilTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5NUENvbXBpbGVDb21tYW5kRmllbGQubW9kaWZ5VGV4dCgpOiAiICsgY3VycmVudE9wZW5NUENvbXBpbGVDb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0JCShuZXcgTGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKSkuc2V0VGV4dCgiICIpOy8vc3BhY2VyCi0JCQotCQlvcGVuTVBMaW5rQ29tbWFuZExhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKTsKLQkJb3Blbk1QTGlua0NvbW1hbmRMYWJlbC5zZXRUZXh0KCJPcGVuTVAgbGluayBjb21tYW5kOiAiKTsKLQkJb3Blbk1QTGlua0NvbW1hbmRGaWVsZD1uZXcgVGV4dChjb21wb3NpdGUsU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkNCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZDQud2lkdGhIaW50PVNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlnZDQuaG9yaXpvbnRhbFNwYW49MjsKLQkJb3Blbk1QTGlua0NvbW1hbmRGaWVsZC5zZXRMYXlvdXREYXRhKGdkMyk7Ci0JCW9wZW5NUExpbmtDb21tYW5kRmllbGQuc2V0VGV4dChkZWZhdWx0T3Blbk1QQnVpbGRDb21tYW5kKTsKLQkJb3Blbk1QTGlua0NvbW1hbmRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRDdXJyZW50T3Blbk1QTGlua0NvbW1hbmQob3Blbk1QTGlua0NvbW1hbmRGaWVsZC5nZXRUZXh0KCkpOwotCQkJCWlmKHRyYWNlT24pU3lzdGVtLm91dC5wcmludGxuKCJPcGVuTVBMaW5rQ29tbWFuZEZpZWxkLm1vZGlmeVRleHQoKTogIiArIGN1cnJlbnRPcGVuTVBMaW5rQ29tbWFuZCk7Ci0JCQl9Ci0JCX0pOwotCQkobmV3IExhYmVsKGNvbXBvc2l0ZSxTV1QuTk9ORSkpLnNldFRleHQoIiAiKTsvL3NwYWNlcgotCi0JCQotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSBwYXJlbnQgY29tcG9zaXRlIGluIHdoaWNoIHRoZXNlIHdpZGdldHMgd2lsbCByZXNpZGUKLQkgKiAKLQkgKiBAcGFyYW0gZGVmYXVsdEVuYWJsZWQgZG8gd2UgdXNlIGRlZmF1bHQgbXBpIGluY2x1ZGUgcGF0aD8KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBkZWZhdWx0RW5hYmxlZCkgewotCi0JCWludCBjb2x1bW5zID0gNDsKLQotCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gY29sdW1uczsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJdXNlT3Blbk1QUHJvamVjdFNldHRpbmdzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLIHwgU1dULlJJR0hUKTsKLQkJdXNlT3Blbk1QUHJvamVjdFNldHRpbmdzQnV0dG9uLnNldFRleHQoIkFkZCBPcGVuTVAgcHJvamVjdCBzZXR0aW5ncyB0byB0aGlzIHByb2plY3QiKTsKLQkJR3JpZERhdGEgZ2Q9bmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuPWNvbHVtbnM7Ci0JCXVzZU9wZW5NUFByb2plY3RTZXR0aW5nc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdXNlT3Blbk1QUHJvamVjdFNldHRpbmdzQnV0dG9uLnNldFNlbGVjdGlvbih1c2VPcGVuTVBQcm9qZWN0U2V0dGluZ3MpOwotCQl1c2VPcGVuTVBQcm9qZWN0U2V0dGluZ3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXNlT3Blbk1QUHJvamVjdFNldHRpbmdzID0gdXNlT3Blbk1QUHJvamVjdFNldHRpbmdzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCS8vIHNldCB2YWx1ZSBzbyB3ZSBjYW4gcmVhZCBpdCBsYXRlcgotCQkJCXBhZ2VEYXRhLnB1dChQQUdFX0lEK0RPVCtET19PcGVuTVBfSU5DTFVERVMsIEJvb2xlYW4udG9TdHJpbmcodXNlT3Blbk1QUHJvamVjdFNldHRpbmdzKSk7Ci0JCQkJCi0JCQkJdXNlRGVmYXVsdHNCdXR0b24uc2V0RW5hYmxlZCh1c2VPcGVuTVBQcm9qZWN0U2V0dGluZ3MpOwotCQkJCWlmKE9wZW5NUFNhbXBsZUJ1dHRvbiE9bnVsbCkKLQkJCQkgICBPcGVuTVBTYW1wbGVCdXR0b24uc2V0RW5hYmxlZCh1c2VPcGVuTVBQcm9qZWN0U2V0dGluZ3MpOwotCQkJCWlmKHVzZU9wZW5NUFByb2plY3RTZXR0aW5ncykgewotCQkJCSAgYm9vbGVhbiB1c2VEZWZhdWx0cz11c2VEZWZhdWx0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQkgIHNldFVzZXJBcmVhRW5hYmxlZCghdXNlRGVmYXVsdHMpOwotCQkJCX0KLQkJCQkKLQkJCQllbHNlCi0JCQkJCXNldFVzZXJBcmVhRW5hYmxlZChmYWxzZSk7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCi0JCXVzZURlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLIHwgU1dULlJJR0hUKTsKLQkJdXNlRGVmYXVsdHNCdXR0b24uc2V0VGV4dCgiVXNlIGRlZmF1bHQgaW5mb3JtYXRpb24iKTsKLQkJdXNlRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKGRlZmF1bHRFbmFibGVkKTsKLQkJdXNlRGVmYXVsdHNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCUdyaWREYXRhIGJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnV0dG9uRGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiB1c2VEZWZhdWx0cyA9IHVzZURlZmF1bHRzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCQkJaWYgKHVzZURlZmF1bHRzKSB7IAotCQkJCQkvLyByZXNldCBhbGwgZmllbGRzIGFuZCB2YWx1ZXMgYmFjayB0byB0aGUgZGVmYXVsdHMKLQkJCQkJaW5jbHVkZVBhdGhGaWVsZC5zZXRUZXh0KGRlZmF1bHRPcGVuTVBJbmNsdWRlUGF0aCk7Ci0JCQkJCXNldEN1cnJlbnRPcGVuTVBJbmNsdWRlUGF0aChkZWZhdWx0T3Blbk1QSW5jbHVkZVBhdGgpOwotCQkJCQkKLQkJCQkJbGliUGF0aEZpZWxkLnNldFRleHQoZGVmYXVsdE9wZW5NUExpYk5hbWUpOwotCQkJCQlzZXRDdXJyZW50T3Blbk1QTGliTmFtZShkZWZhdWx0T3Blbk1QTGliTmFtZSk7Ci0JCQkJCQotCQkJCQlsaWJOYW1lRmllbGQuc2V0VGV4dChkZWZhdWx0T3Blbk1QTGliTmFtZSk7Ci0JCQkJCXNldEN1cnJlbnRPcGVuTVBMaWJOYW1lKGRlZmF1bHRPcGVuTVBMaWJOYW1lKTsKLQkJCQkJCi0JCQkJCWxpYlBhdGhGaWVsZC5zZXRUZXh0KGRlZmF1bHRPcGVuTVBMaWJQYXRoKTsKLQkJCQkJc2V0Q3VycmVudE9wZW5NUExpYlBhdGgoZGVmYXVsdE9wZW5NUExpYlBhdGgpOwotCQkJCQkKLQkJCQkJb3Blbk1QQ29tcGlsZUNvbW1hbmRGaWVsZC5zZXRUZXh0KGRlZmF1bHRPcGVuTVBCdWlsZENvbW1hbmQpOwotCQkJCQlzZXRDdXJyZW50T3Blbk1QQ29tcGlsZUNvbW1hbmQoZGVmYXVsdE9wZW5NUEJ1aWxkQ29tbWFuZCk7Ci0JCQkJCQotCQkJCQlvcGVuTVBMaW5rQ29tbWFuZEZpZWxkLnNldFRleHQoZGVmYXVsdE9wZW5NUEJ1aWxkQ29tbWFuZCk7Ci0JCQkJCXNldEN1cnJlbnRPcGVuTVBMaW5rQ29tbWFuZChkZWZhdWx0T3Blbk1QQnVpbGRDb21tYW5kKTsKLQkJCQl9Ci0JCQkJc2V0VXNlckFyZWFFbmFibGVkKCF1c2VEZWZhdWx0cyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZVVzZXJFbnRyeUFyZWEoZ3JvdXAsIGRlZmF1bHRFbmFibGVkKTsKLS8qCQkKLSAJCS8vIG1waSBzYW1wbGUgZmlsZSBub3cgcHJvdmlkZWQgYnkgcHJvamVjdCB0ZW1wbGF0ZSAoYWxzbyBvcGVubXApCi0JCU9wZW5NUFNhbXBsZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCU9wZW5NUFNhbXBsZUJ1dHRvbi5zZXRUZXh0KCJJbmNsdWRlIHNhbXBsZSBPcGVuTVAgc291cmNlIGZpbGU/Iik7Ci0JCU9wZW5NUFNhbXBsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlPcGVuTVBTYW1wbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCUdyaWREYXRhIGdkU2FtcGxlPW5ldyBHcmlkRGF0YSgpOwotCQlnZFNhbXBsZS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7Ci0JCU9wZW5NUFNhbXBsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkU2FtcGxlKTsKLQkJT3Blbk1QU2FtcGxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gZG9pdD1PcGVuTVBTYW1wbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc2V0Q3VycmVudE9wZW5NUFNhbXBsZShkb2l0KTsKLQkJCX0KLQkJCi0JCX0pOwotCQkqLwotCQlzZXRVc2VyQXJlYUVuYWJsZWQoIWRlZmF1bHRFbmFibGVkKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlib29sZWFuIGRlZmF1bHRFbmFibGVkID0gdHJ1ZTsKLQkJY3JlYXRlQ29udGVudHMoY29tcG9zaXRlLCBkZWZhdWx0RW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHRtcD0iU2VsZWN0IHRoZSBPcGVuTVAgaW5jbHVkZSBwYXRoLCBsaWIgbmFtZSwgbGlicmFyeSBzZWFyY2ggcGF0aCwgYW5kIGJ1aWxkIGNvbW1hbmQgaW5mb3JtYXRpb24gdG8gYmUgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byB0aGUgbmV3IHByb2plY3QuIjsKLQkJcmV0dXJuIHRtcDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIHJldHVybiBuZXcgU3RyaW5nKCJNeSBlcnJvciBtc2ciKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRXaXphcmQoKS5nZXREZWZhdWx0UGFnZUltYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiAiT3Blbk1QIFByb2plY3QgU2V0dGluZ3MiOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1IZWxwKCkgewotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJLy8gZG8gbm90aGluZwotCi0JfQotCi0JLyoqCi0JICogSWYgeW91IG5lZWQgdG8gaW5pdCBkYXRhL3dpZGdldHMgb24gdGhlIHBhZ2Ugd2hlbiBpdCBpcyBkaXNwbGF5ZWQgYmFzZWQKLQkgKiBvbiB0aGUgZGF0YSBzZXQgaW4gcHJldmlvdXMgcGFnZXMsIHlvdSBjYW4gb3ZlcnJpZGUKLQkgKiBJRGlhbG9nUGFnZS5zZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgYW5kIHNldHVwIGV2ZXJ5dGhpbmcgd2hlbiB2aXNpYmxlID09Ci0JICogdHJ1ZS4KLQkgKiAKLQkgKiBPdGhlcndpc2UsIGRvIGluaXRzIGluIHRoZSBjdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWNvbXBvc2l0ZS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZih0cmFjZU9uKVN5c3RlbS5vdXQucHJpbnRsbigiT3Blbk1QUHJvamVjdFdpemFyZFBhZ2Uuc2V0VmlzaWJsZTogIiArIHZpc2libGUpOwotCi0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgc3RhdHVzIG9mIHRoZSB3aXphcmQncyBmaW5pc2ggYnV0dG9uLiBJZiB3ZSBkb24ndCB3YW50IHRoZQotCSAqIHVzZXIgdG8gcHJlc3MgZmluaXNoIHlldCwgc2V0IHRoaXMgdG8gZmFsc2UuIDxicj4KLQkgKiBUaGUgTmV4dC9GaW5pc2gvQ2FuY2VsIG1ldGhvZHMgYmVsb25nIHRvIHRoZSB3aXphcmQgaXRzZWxmIGFuZCBub3QgdGhlCi0JICogcGFnZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgZmluaXNoIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZDsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ3VzdG9tUGFnZUNvbXBsZXRlKCkgewotCQkvLyBCUlQgaWYgaXNEZWZhdWx0cyBpcyBub3QgY2hlY2tlZCB0aGVuIGluY2x1ZGVQYXRoRmllbGQgZXRjLiBzaG91bGQgYmUKLQkJLy8gZmlsbGVkIGluLgotCQkvLyBCUlQgaWYgaXNEZWZhdWx0cyBpcyBjaGVja2VkIHRoZW4gdGhlcmUgc2hvdWxkIGFjdHVhbGx5IEJFIHNvbWUKLQkJLy8gZGVmYXVsdHMgdG8gdXNlLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSAidXNlciBhcmVhIiB3aGljaCBpcyB0aGUgcGxhY2UgdXNlciBjYW4gdHlwZSBhbmQgbWFrZQotCSAqIGNoYW5nZXMgKGluY2x1ZGVQYXRoRmllbGQsIGl0cyBsYWJlbCBhbmQgYnV0dG9uLCBldGMuKQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFVzZXJBcmVhRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCi0JCWluY2x1ZGVQYXRoRmllbGQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWJyb3dzZUJ1dHRvbjIuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJbGliTmFtZUZpZWxkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWxpYlBhdGhGaWVsZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkKLQkJaW5jbHVkZVBhdGhMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlsaWJQYXRoTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJbGliTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCi0JCW9wZW5NUENvbXBpbGVDb21tYW5kTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJb3Blbk1QQ29tcGlsZUNvbW1hbmRGaWVsZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlvcGVuTVBMaW5rQ29tbWFuZExhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCW9wZW5NUExpbmtDb21tYW5kRmllbGQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0JCi0JLyoqCi0JICogV2hhdCdzIHRoZSBkZWZhdWx0LCBkbyB3ZSBpbmNsdWRlIE9wZW5NUCBpbmNsdWRlcyBvciBub3Q/Ci0JICogSWYgdGhlcmUgaXMgYW55IGRpZmZpY3VsdHkgZ2V0dGluZyBpbmZvcm1hdGlvbiwgdXNlIHRoaXMgZGVmYXVsdAotCSAqIHNldHRpbmcuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlT3Blbk1QSW5jbHVkZXMoKSB7Ci0JCXJldHVybiBkZWZhdWx0VXNlT3Blbk1QSW5jbHVkZXM7Ci0JfQotCi0JcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQYWdlRGF0YSgpIHsKLQkJcmV0dXJuIHBhZ2VEYXRhOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VQYWdlIGdldFByZWZlcmVuY2VQYWdlKCkgewotCQlpZihwcmVmZXJlbmNlUGFnZSA9PSBudWxsKSB7Ci0JCQlwcmVmZXJlbmNlUGFnZSA9IG5ldyBvcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAuY29yZS5wcmVmcy5PcGVuTVBQcmVmZXJlbmNlUGFnZSgpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJZW1wdHlDcHJvamVjdC90ZW1wbGF0ZS54bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSWVtcHR5Q3Byb2plY3QvdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFkN2FmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJZW1wdHlDcHJvamVjdC90ZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08dGVtcGxhdGUgdHlwZT0iUHJvalRlbXBsIiB2ZXJzaW9uPSIxLjAiIHN1cHBsaWVyPSJFY2xpcHNlLm9yZyIgcmV2aXNpb249IjEuMCIgYXV0aG9yPSJJQk0gUmVzZWFyY2giCi0JCWNvcHlyaWdodD0iQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3JwLiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCIKLQkJaWQ9Ik1QSWVtcHR5Q3Byb2plY3QiIGxhYmVsPSJNUEkgRW1wdHkgQyBQcm9qZWN0IiBkZXNjcmlwdGlvbj0iQW4gZW1wdHkgTVBJICBwcm9qZWN0IHRlbXBsYXRlIgotCQkgaGVscD0iaGVscC5odG1sIj4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMubXBpUHJvamVjdFByb2Nlc3MiPgotCQk8IS0tIG5vIGFyZ3VtZW50cyBhcyB3ZSBnbyBzdHJhaWdodCB0byB0aGUgc3RvcmUgKG5vdCByZWNvbW1lbmRlZCB1c2FnZSBvZiB0ZW1wbGF0ZSBlbmdpbmUuLikgLS0+Ci0JPC9wcm9jZXNzPgotPC90ZW1wbGF0ZT4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9NUEloZWxsb1dvcmxkQ3Byb2plY3Qvc3JjL0Jhc2VuYW1lLmMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSWhlbGxvV29ybGRDcHJvamVjdC9zcmMvQmFzZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2Yzk2Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSWhlbGxvV29ybGRDcHJvamVjdC9zcmMvQmFzZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIE5hbWUgICAgICAgIDogJChiYXNlTmFtZSkuYwotIEF1dGhvciAgICAgIDogJChhdXRob3IpCi0gVmVyc2lvbiAgICAgOgotIENvcHlyaWdodCAgIDogJChjb3B5cmlnaHQpCi0gRGVzY3JpcHRpb24gOiBIZWxsbyBNUEkgV29ybGQgaW4gQyAKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIm1waS5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKXsKLQlpbnQgIG15X3Jhbms7IC8qIHJhbmsgb2YgcHJvY2VzcyAqLwotCWludCAgcDsgICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwotCWludCBzb3VyY2U7ICAgLyogcmFuayBvZiBzZW5kZXIgKi8KLQlpbnQgZGVzdDsgICAgIC8qIHJhbmsgb2YgcmVjZWl2ZXIgKi8KLQlpbnQgdGFnPTA7ICAgIC8qIHRhZyBmb3IgbWVzc2FnZXMgKi8KLQljaGFyIG1lc3NhZ2VbMTAwXTsgICAgICAgIC8qIHN0b3JhZ2UgZm9yIG1lc3NhZ2UgKi8KLQlNUElfU3RhdHVzIHN0YXR1cyA7ICAgLyogcmV0dXJuIHN0YXR1cyBmb3IgcmVjZWl2ZSAqLwotCQotCS8qIHN0YXJ0IHVwIE1QSSAqLwotCQotCU1QSV9Jbml0KCZhcmdjLCAmYXJndik7Ci0JCi0JLyogZmluZCBvdXQgcHJvY2VzcyByYW5rICovCi0JTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJm15X3JhbmspOyAKLQkKLQkvKiBmaW5kIG91dCBudW1iZXIgb2YgcHJvY2Vzc2VzICovCi0JTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnApOyAKLQkKLQkKLQlpZiAobXlfcmFuayAhPTApewotCQkvKiBjcmVhdGUgbWVzc2FnZSAqLwotCQlzcHJpbnRmKG1lc3NhZ2UsICIkKG1waS5oZWxsby5tZXNzYWdlKSBmcm9tIHByb2Nlc3MgJWQhIiwgbXlfcmFuayk7Ci0JCWRlc3QgPSAwOwotCQkvKiB1c2Ugc3RybGVuKzEgc28gdGhhdCAnXDAnIGdldCB0cmFuc21pdHRlZCAqLwotCQlNUElfU2VuZChtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkrMSwgTVBJX0NIQVIsCi0JCSAgIGRlc3QsIHRhZywgTVBJX0NPTU1fV09STEQpOwotCX0KLQllbHNlewotCQlwcmludGYoIiQobXBpLmhlbGxvLm1lc3NhZ2UpIEZyb20gcHJvY2VzcyAwOiBOdW0gcHJvY2Vzc2VzOiAlZFxuIixwKTsKLQkJZm9yIChzb3VyY2UgPSAxOyBzb3VyY2UgPCBwOyBzb3VyY2UrKykgewotCQkJTVBJX1JlY3YobWVzc2FnZSwgMTAwLCBNUElfQ0hBUiwgc291cmNlLCB0YWcsCi0JCQkgICAgICBNUElfQ09NTV9XT1JMRCwgJnN0YXR1cyk7Ci0JCQlwcmludGYoIiVzXG4iLG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qIHNodXQgZG93biBNUEkgKi8KLQlNUElfRmluYWxpemUoKTsgCi0JCi0JCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSWhlbGxvV29ybGRDcHJvamVjdC90ZW1wbGF0ZS5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9NUEloZWxsb1dvcmxkQ3Byb2plY3QvdGVtcGxhdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2NjgzMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSWhlbGxvV29ybGRDcHJvamVjdC90ZW1wbGF0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIFJlc2VhcmNoCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBCZXRoIFRpYmJpdHRzIChJQk0gUmVzZWFyY2gpICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI1RlbXBsYXRlIERlZmF1bHQgVmFsdWVzCi1IZWxsb1dvcmxkLkNBbnNpdGVtcGxhdGUubGFiZWw9TVBJIEhlbGxvIFdvcmxkIEMgUHJvamVjdAotSGVsbG9Xb3JsZC5DQW5zaXRlbXBsYXRlLmRlc2NyaXB0aW9uPUEgc2tlbGV0YWwgTWFuYWdlZCBDIEhlbGxvIFdvcmxkIHByb2plY3QuIENyZWF0ZXMgYSBmb2xkZXIgZm9yIHNvdXJjZXMgYW5kIGFub3RoZXIgZm9yIGluY2x1ZGUuCi1IZWxsb1dvcmxkLmJhc2ljcy5sYWJlbD1CYXNpYyBTZXR0aW5ncwotSGVsbG9Xb3JsZC5iYXNpY3MuZGVzY3JpcHRpb249QmFzaWMgcHJvcGVydGllcyBvZiBhIHByb2plY3QKLUhlbGxvV29ybGQuYXV0aG9yLmxhYmVsPUF1dGhvcgotSGVsbG9Xb3JsZC5hdXRob3IuZGVzY3JpcHRpb249TmFtZSBvZiB0aGUgYXV0aG9yCi1IZWxsb1dvcmxkLmNvcHlyaWdodC5sYWJlbD1Db3B5cmlnaHQgbm90aWNlCi1IZWxsb1dvcmxkLmNvcHlyaWdodC5kZXNjcmlwdGlvbj1Zb3VyIGNvcHlyaWdodCBub3RpY2UKLUhlbGxvV29ybGQuY29weXJpZ2h0LmRlZmF1bHQ9WW91ciBjb3B5cmlnaHQgbm90aWNlCi1IZWxsb1dvcmxkLm1lc3NhZ2UuZGVmYXVsdC5tcGk9SGVsbG8gTVBJIFdvcmxkCi1IZWxsb1dvcmxkLm1lc3NhZ2UuZGVzY3JpcHRpb249WW91ciBoZWxsbyB3b3JsZCBncmVldGluZyBtZXNzYWdlCi1IZWxsb1dvcmxkLm1lc3NhZ2UubGFiZWw9SGVsbG8gd29ybGQgZ3JlZXRpbmcKLUhlbGxvV29ybGQuc291cmNlRGlyLmxhYmVsPVNvdXJjZQotSGVsbG9Xb3JsZC5zb3VyY2VEaXIuZGVzY3JpcHRpb249RGlyZWN0b3J5IGZvciBoZWxsbyB3b3JsZCBwcm9qZWN0IHNvdXJjZSBmaWxlcwotSGVsbG9Xb3JsZC5zb3VyY2VEaXIuZGVmYXVsdD1zcmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJaGVsbG9Xb3JsZENwcm9qZWN0L3RlbXBsYXRlLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJaGVsbG9Xb3JsZENwcm9qZWN0L3RlbXBsYXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3NGU2YS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSWhlbGxvV29ybGRDcHJvamVjdC90ZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08dGVtcGxhdGUgdHlwZT0iUHJvalRlbXBsIiB2ZXJzaW9uPSIxLjAiIHN1cHBsaWVyPSJFY2xpcHNlLm9yZyIgcmV2aXNpb249IjEuMCIgYXV0aG9yPSJCZXRoIFRpYmJpdHRzIChJQk0gUmVzZWFyY2gpIgotCQljb3B5cmlnaHQ9ImJsYWggYmxhaCAiCi0JCWlkPSJNUEloZWxsb1dvcmxkQ1Byb2plY3QiIGxhYmVsPSIlSGVsbG9Xb3JsZC5DQW5zaXRlbXBsYXRlLmxhYmVsIiBkZXNjcmlwdGlvbj0iJUhlbGxvV29ybGQuQ0Fuc2l0ZW1wbGF0ZS5kZXNjcmlwdGlvbiIKLQkJIGhlbHA9ImhlbHAuaHRtbCI+Ci0JPHByb3BlcnR5LWdyb3VwIGlkPSJiYXNpY3MiIGxhYmVsPSIlSGVsbG9Xb3JsZC5iYXNpY3MubGFiZWwiIGRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5iYXNpY3MuZGVzY3JpcHRpb24iIHR5cGU9IlBBR0VTLU9OTFkiIGhlbHA9ImhlbHAuaHRtbCI+Ci0JCTxwcm9wZXJ0eSBpZD0iYXV0aG9yIgotCQkJbGFiZWw9IiVIZWxsb1dvcmxkLmF1dGhvci5sYWJlbCIKLQkJCWRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5hdXRob3IuZGVzY3JpcHRpb24iCi0JCQl0eXBlPSJpbnB1dCIKLQkJCXBhdHRlcm49Ii4qIgotCQkJZGVmYXVsdD0iIgotCQkJaGlkZGVuPSJmYWxzZSIKLQkJCXBlcnNpc3Q9InRydWUiLz4KLQkJPHByb3BlcnR5IGlkPSJjb3B5cmlnaHQiCi0JCQlsYWJlbD0iJUhlbGxvV29ybGQuY29weXJpZ2h0LmxhYmVsIgotCQkJZGVzY3JpcHRpb249IiVIZWxsb1dvcmxkLmNvcHlyaWdodC5kZXNjcmlwdGlvbiIKLQkJCXR5cGU9ImlucHV0IgotCQkJcGF0dGVybj0iLioiCi0JCQlkZWZhdWx0PSIlSGVsbG9Xb3JsZC5jb3B5cmlnaHQuZGVmYXVsdCIKLQkJCWhpZGRlbj0iZmFsc2UiCi0JCQlwZXJzaXN0PSJ0cnVlIi8+Ci0JCTxwcm9wZXJ0eSBpZD0ibXBpLmhlbGxvLm1lc3NhZ2UiCi0JCQlsYWJlbD0iJUhlbGxvV29ybGQubWVzc2FnZS5sYWJlbCIKLQkJCWRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5tZXNzYWdlLmRlc2NyaXB0aW9uIgotCQkJdHlwZT0iaW5wdXQiCi0JCQlwYXR0ZXJuPSIuKiIKLQkJCWRlZmF1bHQ9IiVIZWxsb1dvcmxkLm1lc3NhZ2UuZGVmYXVsdC5tcGkiCi0JCQloaWRkZW49ImZhbHNlIgotCQkJcGVyc2lzdD0idHJ1ZSIvPgotCQk8cHJvcGVydHkgaWQ9InNvdXJjZURpciIKLQkJCQlsYWJlbD0iJUhlbGxvV29ybGQuc291cmNlRGlyLmxhYmVsIgotCQkJCWRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5zb3VyY2VEaXIuZGVzY3JpcHRpb24iCi0JCQkJdHlwZT0iaW5wdXQiCi0JCQkJZGVmYXVsdD0iJUhlbGxvV29ybGQuc291cmNlRGlyLmRlZmF1bHQiCi0JCQkJcGF0dGVybj0iW2EtekEtWjAtOV0rIgotCQkJCW1hbmRhdG9yeT0iZmFsc2UiCi0JCQkJcGVyc2lzdD0idHJ1ZSIvPgotCTwvcHJvcGVydHktZ3JvdXA+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5OZXdNYW5hZ2VkUHJvamVjdCI+Ci0JCTxzaW1wbGUgbmFtZT0ibmFtZSIgdmFsdWU9IiQocHJvamVjdE5hbWUpIiAvPiAKLQkJPHNpbXBsZSBuYW1lPSJhcnRpZmFjdEV4dGVuc2lvbiIgdmFsdWU9ImV4ZSIgLz4gCi0JCTxzaW1wbGUgbmFtZT0iaXNDUHJvamVjdCIgdmFsdWU9InRydWUiIC8+IAotCTwvcHJvY2Vzcz4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNyZWF0ZVNvdXJjZUZvbGRlciI+Ci0JCTxzaW1wbGUgbmFtZT0icHJvamVjdE5hbWUiIHZhbHVlPSIkKHByb2plY3ROYW1lKSIvPgotCQk8c2ltcGxlIG5hbWU9InBhdGgiIHZhbHVlPSIkKHNvdXJjZURpcikiLz4KLQk8L3Byb2Nlc3M+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5BZGRGaWxlcyI+Ci0JCTxzaW1wbGUgbmFtZT0icHJvamVjdE5hbWUiIHZhbHVlPSIkKHByb2plY3ROYW1lKSIvPgotCQk8Y29tcGxleC1hcnJheSBuYW1lPSJmaWxlcyI+Ci0JCQk8ZWxlbWVudD4KLQkJCQk8c2ltcGxlIG5hbWU9InNvdXJjZSIgdmFsdWU9InNyYy9CYXNlbmFtZS5jIi8+Ci0JCQkJPHNpbXBsZSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSIkKHNvdXJjZURpcikvJChwcm9qZWN0TmFtZSkuYyIvPgotCQkJCTxzaW1wbGUgbmFtZT0icmVwbGFjZWFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvY29tcGxleC1hcnJheT4KLQk8L3Byb2Nlc3M+Ci0JCi0JPHByb2Nlc3MgdHlwZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy5tcGlQcm9qZWN0UHJvY2VzcyI+Ci0JCTwhLS0gbm8gYXJndW1lbnRzIGFzIHdlIGdvIHN0cmFpZ2h0IHRvIHRoZSBzdG9yZSAobm90IHJlY29tbWVuZGVkIHVzYWdlIG9mIHRlbXBsYXRlIGVuZ2luZS4uKSAtLT4KLQk8L3Byb2Nlc3M+Ci0KLTwvdGVtcGxhdGU+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDUFBwcm9qZWN0L3NyYy9CYXNlbmFtZS5jcHAgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ1BQcHJvamVjdC9zcmMvQmFzZW5hbWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODNhMGNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDUFBwcm9qZWN0L3NyYy9CYXNlbmFtZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBOYW1lICAgICAgICA6ICQoYmFzZU5hbWUpLmMKLSBBdXRob3IgICAgICA6ICQoYXV0aG9yKQotIFZlcnNpb24gICAgIDoKLSBDb3B5cmlnaHQgICA6ICQoY29weXJpZ2h0KQotIERlc2NyaXB0aW9uIDogQ29tcHV0ZSBQaSBpbiBNUEkgQysrCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0jaW5jbHVkZSA8bWF0aC5oPiAKLSNpbmNsdWRlICJtcGkuaCIgCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgCi17IAotICAgIGludCBuLCByYW5rLCBzaXplLCBpOyAKLSAgICBkb3VibGUgUEkyNURUID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDM7IAotICAgIGRvdWJsZSBteXBpLCBwaSwgaCwgc3VtLCB4OyAKLSAKLSAgICBNUEk6OkluaXQoYXJnYywgYXJndik7IAotICAgIHNpemUgPSBNUEk6OkNPTU1fV09STEQuR2V0X3NpemUoKTsgCi0gICAgcmFuayA9IE1QSTo6Q09NTV9XT1JMRC5HZXRfcmFuaygpOyAKLSAKLSAgICB3aGlsZSAoMSkgeyAKLQlpZiAocmFuayA9PSAwKSB7IAotCSAgIAotCQkgY291dCA8PCAiRW50ZXIgdGhlIG51bWJlciBvZiBpbnRlcnZhbHM6ICgwIHF1aXRzKSIgCi0JCQkJIDw8IGVuZGw7IAotCQkJICAgIGNpbiA+PiBuOyAKLQkJCSAgICAKLQl9IAotIAotCU1QSTo6Q09NTV9XT1JMRC5CY2FzdCgmbiwgMSwgTVBJOjpJTlQsIDApOyAKLQlpZiAobj09MCkgCi0JICAgIGJyZWFrOyAKLQllbHNlIHsgCi0JICAgIGggPSAxLjAgLyAoZG91YmxlKSBuOyAKLQkgICAgc3VtID0gMC4wOyAKLQkgICAgZm9yIChpID0gcmFuayArIDE7IGkgPD0gbjsgaSArPSBzaXplKSB7IAotCQl4ID0gaCAqICgoZG91YmxlKWkgLSAwLjUpOyAKLQkJc3VtICs9ICg0LjAgLyAoMS4wICsgeCp4KSk7IAotCSAgICB9IAotCSAgICBteXBpID0gaCAqIHN1bTsgCi0gCi0JICAgIE1QSTo6Q09NTV9XT1JMRC5SZWR1Y2UoJm15cGksICZwaSwgMSwgTVBJOjpET1VCTEUsIAotCQkJCSAgIE1QSTo6U1VNLCAwKTsgCi0JICAgIGlmIChyYW5rID09IDApIAotCQljb3V0IDw8ICJwaSBpcyBhcHByb3hpbWF0ZWx5ICIgPDwgcGkgCi0JCSAgICAgPDwgIiwgRXJyb3IgaXMgIiA8PCBmYWJzKHBpIC0gUEkyNURUKSAKLQkJICAgICA8PCBlbmRsOyAKLQl9IAotICAgIH0gCi0gICAgTVBJOjpGaW5hbGl6ZSgpOyAKLSAgICByZXR1cm4gMDsgCi19IAotCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ1BQcHJvamVjdC90ZW1wbGF0ZS5wcm9wZXJ0aWVzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9NUElwaUNQUHByb2plY3QvdGVtcGxhdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmZjlhMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ1BQcHJvamVjdC90ZW1wbGF0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIFJlc2VhcmNoCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBCZXRoIFRpYmJpdHRzIChJQk0gUmVzZWFyY2gpICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI1RlbXBsYXRlIERlZmF1bHQgVmFsdWVzCi1NUEljcHBQaS5DQW5zaXRlbXBsYXRlLmxhYmVsPU1QSSBQaSBDKysgUHJvamVjdAotTVBJY3BwUGkuQ0Fuc2l0ZW1wbGF0ZS5kZXNjcmlwdGlvbj1BIHNrZWxldGFsIE1hbmFnZWQgQ1BQICBwcm9qZWN0LiBDcmVhdGVzIGEgZm9sZGVyIGZvciBzb3VyY2VzIGFuZCBhbm90aGVyIGZvciBpbmNsdWRlLgotTVBJY3BwUGkuYmFzaWNzLmxhYmVsPUJhc2ljIFNldHRpbmdzCi1NUEljcHBQaS5iYXNpY3MuZGVzY3JpcHRpb249QmFzaWMgcHJvcGVydGllcyBvZiBhIHByb2plY3QKLU1QSWNwcFBpLmF1dGhvci5sYWJlbD1BdXRob3IKLU1QSWNwcFBpLmF1dGhvci5kZXNjcmlwdGlvbj1OYW1lIG9mIHRoZSBhdXRob3IKLU1QSWNwcFBpLmNvcHlyaWdodC5sYWJlbD1Db3B5cmlnaHQgbm90aWNlCi1NUEljcHBQaS5jb3B5cmlnaHQuZGVzY3JpcHRpb249WW91ciBjb3B5cmlnaHQgbm90aWNlCi1NUEljcHBQaS5jb3B5cmlnaHQuZGVmYXVsdD1Zb3VyIGNvcHlyaWdodCBub3RpY2UKLU1QSWNwcFBpLm1lc3NhZ2UuZGVmYXVsdC5tcGk9SGVsbG8gTVBJIEMrKyBQaSBXb3JsZAotTVBJY3BwUGkubWVzc2FnZS5kZXNjcmlwdGlvbj1Zb3VyICBncmVldGluZyBtZXNzYWdlCi1NUEljcHBQaS5tZXNzYWdlLmxhYmVsPUhlbGxvIHdvcmxkIGdyZWV0aW5nCi1NUEljcHBQaS5zb3VyY2VEaXIubGFiZWw9U291cmNlCi1NUEljcHBQaS5zb3VyY2VEaXIuZGVzY3JpcHRpb249RGlyZWN0b3J5IGZvciAgcHJvamVjdCBzb3VyY2UgZmlsZXMKLU1QSWNwcFBpLnNvdXJjZURpci5kZWZhdWx0PXNyYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9NUElwaUNQUHByb2plY3QvdGVtcGxhdGUueG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9NUElwaUNQUHByb2plY3QvdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc5NjUxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDUFBwcm9qZWN0L3RlbXBsYXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTx0ZW1wbGF0ZSB0eXBlPSJQcm9qVGVtcGwiIHZlcnNpb249IjEuMCIgc3VwcGxpZXI9IkVjbGlwc2Uub3JnIiByZXZpc2lvbj0iMS4wIiBhdXRob3I9IkJldGggVGliYml0dHMgKElCTSBSZXNlYXJjaCkiCi0JCWNvcHlyaWdodD0iYmxhaCBibGFoICIKLQkJaWQ9Ik1QSWNwcFBpUHJvamVjdCIgbGFiZWw9IiVNUEljcHBQaS5DQW5zaXRlbXBsYXRlLmxhYmVsIiBkZXNjcmlwdGlvbj0iJU1QSWNwcFBpLkNBbnNpdGVtcGxhdGUuZGVzY3JpcHRpb24iCi0JCSBoZWxwPSJoZWxwLmh0bWwiPgotCTxwcm9wZXJ0eS1ncm91cCBpZD0iYmFzaWNzIiBsYWJlbD0iJU1QSWNwcFBpLmJhc2ljcy5sYWJlbCIgZGVzY3JpcHRpb249IiVNUEljcHBQaS5iYXNpY3MuZGVzY3JpcHRpb24iIHR5cGU9IlBBR0VTLU9OTFkiIGhlbHA9ImhlbHAuaHRtbCI+Ci0JCTxwcm9wZXJ0eSBpZD0iYXV0aG9yIgotCQkJbGFiZWw9IiVNUEljcHBQaS5hdXRob3IubGFiZWwiCi0JCQlkZXNjcmlwdGlvbj0iJU1QSWNwcFBpLmF1dGhvci5kZXNjcmlwdGlvbiIKLQkJCXR5cGU9ImlucHV0IgotCQkJcGF0dGVybj0iLioiCi0JCQlkZWZhdWx0PSIiCi0JCQloaWRkZW49ImZhbHNlIgotCQkJcGVyc2lzdD0idHJ1ZSIvPgotCQk8cHJvcGVydHkgaWQ9ImNvcHlyaWdodCIKLQkJCWxhYmVsPSIlTVBJY3BwUGkuY29weXJpZ2h0LmxhYmVsIgotCQkJZGVzY3JpcHRpb249IiVNUEljcHBQaS5jb3B5cmlnaHQuZGVzY3JpcHRpb24iCi0JCQl0eXBlPSJpbnB1dCIKLQkJCXBhdHRlcm49Ii4qIgotCQkJZGVmYXVsdD0iJU1QSWNwcFBpLmNvcHlyaWdodC5kZWZhdWx0IgotCQkJaGlkZGVuPSJmYWxzZSIKLQkJCXBlcnNpc3Q9InRydWUiLz4KLQkJPHByb3BlcnR5IGlkPSJtcGkuaGVsbG8ubWVzc2FnZSIKLQkJCWxhYmVsPSIlTVBJY3BwUGkubWVzc2FnZS5sYWJlbCIKLQkJCWRlc2NyaXB0aW9uPSIlTVBJY3BwUGkubWVzc2FnZS5kZXNjcmlwdGlvbiIKLQkJCXR5cGU9ImlucHV0IgotCQkJcGF0dGVybj0iLioiCi0JCQlkZWZhdWx0PSIlTVBJY3BwUGkubWVzc2FnZS5kZWZhdWx0Lm1waSIKLQkJCWhpZGRlbj0iZmFsc2UiCi0JCQlwZXJzaXN0PSJ0cnVlIi8+Ci0JCTxwcm9wZXJ0eSBpZD0ic291cmNlRGlyIgotCQkJCWxhYmVsPSIlTVBJY3BwUGkuc291cmNlRGlyLmxhYmVsIgotCQkJCWRlc2NyaXB0aW9uPSIlTVBJY3BwUGkuc291cmNlRGlyLmRlc2NyaXB0aW9uIgotCQkJCXR5cGU9ImlucHV0IgotCQkJCWRlZmF1bHQ9IiVNUEljcHBQaS5zb3VyY2VEaXIuZGVmYXVsdCIKLQkJCQlwYXR0ZXJuPSJbYS16QS1aMC05XSsiCi0JCQkJbWFuZGF0b3J5PSJmYWxzZSIKLQkJCQlwZXJzaXN0PSJ0cnVlIi8+Ci0JPC9wcm9wZXJ0eS1ncm91cD4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLk5ld01hbmFnZWRQcm9qZWN0Ij4KLQkJPHNpbXBsZSBuYW1lPSJuYW1lIiB2YWx1ZT0iJChwcm9qZWN0TmFtZSkiIC8+IAotCQk8c2ltcGxlIG5hbWU9ImFydGlmYWN0RXh0ZW5zaW9uIiB2YWx1ZT0iZXhlIiAvPiAKLQkJPHNpbXBsZSBuYW1lPSJpc0NQcm9qZWN0IiB2YWx1ZT0idHJ1ZSIgLz4gCi0JPC9wcm9jZXNzPgotCi0JPHByb2Nlc3MgdHlwZT0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQ3JlYXRlU291cmNlRm9sZGVyIj4KLQkJPHNpbXBsZSBuYW1lPSJwcm9qZWN0TmFtZSIgdmFsdWU9IiQocHJvamVjdE5hbWUpIi8+Ci0JCTxzaW1wbGUgbmFtZT0icGF0aCIgdmFsdWU9IiQoc291cmNlRGlyKSIvPgotCTwvcHJvY2Vzcz4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkFkZEZpbGVzIj4KLQkJPHNpbXBsZSBuYW1lPSJwcm9qZWN0TmFtZSIgdmFsdWU9IiQocHJvamVjdE5hbWUpIi8+Ci0JCTxjb21wbGV4LWFycmF5IG5hbWU9ImZpbGVzIj4KLQkJCTxlbGVtZW50PgotCQkJCTxzaW1wbGUgbmFtZT0ic291cmNlIiB2YWx1ZT0ic3JjL0Jhc2VuYW1lLmNwcCIvPgotCQkJCTxzaW1wbGUgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iJChzb3VyY2VEaXIpLyQocHJvamVjdE5hbWUpLmNwcCIvPgotCQkJCTxzaW1wbGUgbmFtZT0icmVwbGFjZWFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvY29tcGxleC1hcnJheT4KLQk8L3Byb2Nlc3M+Ci0JCi0JPHByb2Nlc3MgdHlwZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy5tcGlQcm9qZWN0UHJvY2Vzc0NQUCI+Ci0JCTwhLS0gbm8gYXJndW1lbnRzIGFzIHdlIGdvIHN0cmFpZ2h0IHRvIHRoZSBzdG9yZSAobm90IHJlY29tbWVuZGVkIHVzYWdlIG9mIHRlbXBsYXRlIGVuZ2luZS4uKSAtLT4KLQk8L3Byb2Nlc3M+Ci0KLTwvdGVtcGxhdGU+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDcHJvamVjdC9zcmMvQmFzZW5hbWUuYyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDcHJvamVjdC9zcmMvQmFzZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0NmJiNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ3Byb2plY3Qvc3JjL0Jhc2VuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gTmFtZSAgICAgICAgOiAkKGJhc2VOYW1lKS5jCi0gQXV0aG9yICAgICAgOiAkKGF1dGhvcikKLSBWZXJzaW9uICAgICA6Ci0gQ29weXJpZ2h0ICAgOiAkKGNvcHlyaWdodCkKLSBEZXNjcmlwdGlvbiA6IENhbGN1bGF0ZSBQaSBpbiBNUEkKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSNpbmNsdWRlIDxtcGkuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi12b2lkCi1jYWxjX3BpKGludCByYW5rLCBpbnQgbnVtX3Byb2NzKQotewotCWludAkJaTsKLQlpbnQJCW51bV9pbnRlcnZhbHM7Ci0JZG91YmxlCWg7Ci0JZG91YmxlCW15cGk7Ci0JZG91YmxlCXBpOwotCWRvdWJsZQlzdW07Ci0JZG91YmxlCXg7Ci0KLQkvKiBzZXQgbnVtYmVyIG9mIGludGVydmFscyB0byBjYWxjdWxhdGUgKi8KLQlpZiAocmFuayA9PSAwKSB7Ci0JCW51bV9pbnRlcnZhbHMgPSAxMDAwMDAwMDA7Ci0JfQotCi0JLyogdGVsbCBvdGhlciB0YXNrcyBob3cgbWFueSBpbnRlcnZhbHMgKi8KLQlNUElfQmNhc3QoJm51bV9pbnRlcnZhbHMsIDEsIE1QSV9JTlQsIDAsIE1QSV9DT01NX1dPUkxEKTsKLQotCS8qIG5vdyBldmVyeW9uZSBkb2VzIHRoZWlyIGNhbGN1bGF0aW9uICovCi0KLQloID0gMS4wIC8gKGRvdWJsZSkgbnVtX2ludGVydmFsczsgCi0Jc3VtID0gMC4wOwotCi0JZm9yIChpID0gcmFuayArIDE7IGkgPD0gbnVtX2ludGVydmFsczsgaSArPSBudW1fcHJvY3MpIHsgCi0JCXggPSBoICogKChkb3VibGUpaSAtIDAuNSk7IAotCQlzdW0gKz0gKDQuMCAvICgxLjAgKyB4KngpKTsgCi0JfSAKLQotCW15cGkgPSBoICogc3VtOwotCi0JLyogY29tYmluZSBldmVyeW9uZSdzIGNhbGN1bGF0aW9ucyAqLwotCU1QSV9SZWR1Y2UoJm15cGksICZwaSwgMSwgTVBJX0RPVUJMRSwgTVBJX1NVTSwgMCwgTVBJX0NPTU1fV09STEQpOwotCi0JaWYgKHJhbmsgPT0gMCkgewotCQlwcmludGYoIlBJIGlzIGFwcHJveGltYXRlbHkgJS4xNmZcbiIsIHBpKTsKLQl9Ci19Ci0KLWludCAKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQJCQlteV9yYW5rOwkJLyogcmFuayBvZiBwcm9jZXNzICovCi0JaW50CQkJbnVtX3Byb2NzOwkJLyogbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwotCWludAkJCXNvdXJjZTsJCQkvKiByYW5rIG9mIHNlbmRlciAqLwotCWludAkJCWRlc3QgPSAwOwkJLyogcmFuayBvZiByZWNlaXZlciAqLwotCWludAkJCXRhZyA9IDA7CQkvKiB0YWcgZm9yIG1lc3NhZ2VzICovCi0JY2hhcgkJbWVzc2FnZVsxMDBdOwkvKiBzdG9yYWdlIGZvciBtZXNzYWdlICovCi0JTVBJX1N0YXR1cwlzdGF0dXMgOwkJLyogcmV0dXJuIHN0YXR1cyBmb3IgcmVjZWl2ZSAqLwotCi0JLyogc3RhcnQgdXAgTVBJICovCi0KLQlNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwotCi0JLyogZmluZCBvdXQgcHJvY2VzcyByYW5rICovCi0JTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJm15X3JhbmspOyAKLQotCS8qIGZpbmQgb3V0IG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmbnVtX3Byb2NzKTsgCi0KLQotCWlmIChteV9yYW5rICE9IDApIHsKLQkJLyogY3JlYXRlIG1lc3NhZ2UgKi8KLQkJc3ByaW50ZihtZXNzYWdlLCAiR3JlZXRpbmdzIGZyb20gcHJvY2VzcyAlZCEiLCBteV9yYW5rKTsKLQkJLyogdXNlIHN0cmxlbisxIHNvIHRoYXQgJ1wwJyBnZXQgdHJhbnNtaXR0ZWQgKi8KLQkJTVBJX1NlbmQobWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpKzEsIE1QSV9DSEFSLAotCQkJCWRlc3QsIHRhZywgTVBJX0NPTU1fV09STEQpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiTnVtIHByb2Nlc3NlczogJWRcbiIsbnVtX3Byb2NzKTsKLQkJZm9yIChzb3VyY2UgPSAxOyBzb3VyY2UgPCBudW1fcHJvY3M7IHNvdXJjZSsrKSB7Ci0JCQlNUElfUmVjdihtZXNzYWdlLCAxMDAsIE1QSV9DSEFSLCBzb3VyY2UsIHRhZywKLQkJCQkJTVBJX0NPTU1fV09STEQsICZzdGF0dXMpOwotCQkJcHJpbnRmKCJQcm9jZXNzIDAgcmVjZWl2ZWQgXCIlc1wiXG4iLG1lc3NhZ2UpOwotCQl9Ci0KLQkJLyogbm93IHJldHVybiB0aGUgY29tcGxpbWVudCAqLwotCQlzcHJpbnRmKG1lc3NhZ2UsICJIaSwgaG93IGFyZSB5b3U/Iik7Ci0JfQotCi0JTVBJX0JjYXN0KG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSsxLCBNUElfQ0hBUiwgZGVzdCwgTVBJX0NPTU1fV09STEQpOwotCi0JaWYgKG15X3JhbmsgIT0gMCkgewotCQlwcmludGYoIlByb2Nlc3MgJWQgcmVjZWl2ZWQgXCIlc1wiXG4iLCBteV9yYW5rLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKiBjYWxjdWxhdGUgUEkgKi8KLQljYWxjX3BpKG15X3JhbmssIG51bV9wcm9jcyk7Ci0KLQkvKiBzaHV0IGRvd24gTVBJICovCi0JTVBJX0ZpbmFsaXplKCk7IAotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ3Byb2plY3QvdGVtcGxhdGUucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDcHJvamVjdC90ZW1wbGF0ZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzE5Yzg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvTVBJcGlDcHJvamVjdC90ZW1wbGF0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIFJlc2VhcmNoCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBCZXRoIFRpYmJpdHRzIChJQk0gUmVzZWFyY2gpICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI1RlbXBsYXRlIERlZmF1bHQgVmFsdWVzCi1NUElwaS50ZW1wbGF0ZS5sYWJlbD1NUEkgUGkgQyBQcm9qZWN0Ci1NUElwaS5DQW5zaXRlbXBsYXRlLmRlc2NyaXB0aW9uPU1QSSBwcm9qZWN0IHRvIGNhbGN1bGF0ZSBQaS4gRW1wbG95cyBhIHZhcmlldHkgb2YgTVBJIEFQSXMuCi1NUElwaS5iYXNpY3MubGFiZWw9QmFzaWMgU2V0dGluZ3MKLU1QSXBpLmJhc2ljcy5kZXNjcmlwdGlvbj1CYXNpYyBwcm9wZXJ0aWVzIG9mIGEgcHJvamVjdAotTVBJcGkuYXV0aG9yLmxhYmVsPUF1dGhvcgotTVBJcGkuYXV0aG9yLmRlc2NyaXB0aW9uPU5hbWUgb2YgdGhlIGF1dGhvcgotTVBJcGkuY29weXJpZ2h0LmxhYmVsPUNvcHlyaWdodCBub3RpY2UKLU1QSXBpLmNvcHlyaWdodC5kZXNjcmlwdGlvbj1Zb3VyIGNvcHlyaWdodCBub3RpY2UKLU1QSXBpLmNvcHlyaWdodC5kZWZhdWx0PVlvdXIgY29weXJpZ2h0IG5vdGljZQotTVBJcGkubWVzc2FnZS5kZWZhdWx0Lm1waXBpPUhlbGxvIE1QSSBQaSBXb3JsZAotTVBJcGkubWVzc2FnZS5kZXNjcmlwdGlvbj1Zb3VyIGdyZWV0aW5nIG1lc3NhZ2UKLU1QSXBpLm1lc3NhZ2UubGFiZWw9R3JlZXRpbmcKLU1QSXBpLnNvdXJjZURpci5sYWJlbD1Tb3VyY2UKLU1QSXBpLnNvdXJjZURpci5kZXNjcmlwdGlvbj1EaXJlY3RvcnkgZm9yICBwcm9qZWN0IHNvdXJjZSBmaWxlcwotTVBJcGkuc291cmNlRGlyLmRlZmF1bHQ9c3JjCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ3Byb2plY3QvdGVtcGxhdGUueG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9NUElwaUNwcm9qZWN0L3RlbXBsYXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwODA3Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL01QSXBpQ3Byb2plY3QvdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPHRlbXBsYXRlIHR5cGU9IlByb2pUZW1wbCIgdmVyc2lvbj0iMS4wIiBzdXBwbGllcj0iRWNsaXBzZS5vcmciIHJldmlzaW9uPSIxLjAiIGF1dGhvcj0iQmV0aCBUaWJiaXR0cyAoSUJNIFJlc2VhcmNoKSIKLQkJY29weXJpZ2h0PSJibGFoIGJsYWggIgotCQlpZD0iTVBJcGlDUHJvamVjdCIgbGFiZWw9IiVNUElwaS50ZW1wbGF0ZS5sYWJlbCIgZGVzY3JpcHRpb249IiVNUElwaS50ZW1wbGF0ZS5kZXNjcmlwdGlvbiIKLQkJIGhlbHA9ImhlbHAuaHRtbCI+Ci0JPHByb3BlcnR5LWdyb3VwIGlkPSJiYXNpY3MiIGxhYmVsPSIlTVBJcGkuYmFzaWNzLmxhYmVsIiBkZXNjcmlwdGlvbj0iJU1QSXBpLmJhc2ljcy5kZXNjcmlwdGlvbiIgdHlwZT0iUEFHRVMtT05MWSIgaGVscD0iaGVscC5odG1sIj4KLQkJPHByb3BlcnR5IGlkPSJhdXRob3IiCi0JCQlsYWJlbD0iJU1QSXBpLmF1dGhvci5sYWJlbCIKLQkJCWRlc2NyaXB0aW9uPSIlTVBJcGkuYXV0aG9yLmRlc2NyaXB0aW9uIgotCQkJdHlwZT0iaW5wdXQiCi0JCQlwYXR0ZXJuPSIuKiIKLQkJCWRlZmF1bHQ9IiIKLQkJCWhpZGRlbj0iZmFsc2UiCi0JCQlwZXJzaXN0PSJ0cnVlIi8+Ci0JCTxwcm9wZXJ0eSBpZD0iY29weXJpZ2h0IgotCQkJbGFiZWw9IiVNUElwaS5jb3B5cmlnaHQubGFiZWwiCi0JCQlkZXNjcmlwdGlvbj0iJU1QSXBpLmNvcHlyaWdodC5kZXNjcmlwdGlvbiIKLQkJCXR5cGU9ImlucHV0IgotCQkJcGF0dGVybj0iLioiCi0JCQlkZWZhdWx0PSIlTVBJcGkuY29weXJpZ2h0LmRlZmF1bHQiCi0JCQloaWRkZW49ImZhbHNlIgotCQkJcGVyc2lzdD0idHJ1ZSIvPgotCQk8cHJvcGVydHkgaWQ9Im1waS5oZWxsby5tZXNzYWdlIgotCQkJbGFiZWw9IiVNUElwaS5tZXNzYWdlLmxhYmVsIgotCQkJZGVzY3JpcHRpb249IiVNUElwaS5tZXNzYWdlLmRlc2NyaXB0aW9uIgotCQkJdHlwZT0iaW5wdXQiCi0JCQlwYXR0ZXJuPSIuKiIKLQkJCWRlZmF1bHQ9IiVNUElwaS5tZXNzYWdlLmRlZmF1bHQubXBpcGkiCi0JCQloaWRkZW49ImZhbHNlIgotCQkJcGVyc2lzdD0idHJ1ZSIvPgotCQk8cHJvcGVydHkgaWQ9InNvdXJjZURpciIKLQkJCQlsYWJlbD0iJU1QSXBpLnNvdXJjZURpci5sYWJlbCIKLQkJCQlkZXNjcmlwdGlvbj0iJU1QSXBpLnNvdXJjZURpci5kZXNjcmlwdGlvbiIKLQkJCQl0eXBlPSJpbnB1dCIKLQkJCQlkZWZhdWx0PSIlTVBJcGkuc291cmNlRGlyLmRlZmF1bHQiCi0JCQkJcGF0dGVybj0iW2EtekEtWjAtOV0rIgotCQkJCW1hbmRhdG9yeT0iZmFsc2UiCi0JCQkJcGVyc2lzdD0idHJ1ZSIvPgotCTwvcHJvcGVydHktZ3JvdXA+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5OZXdNYW5hZ2VkUHJvamVjdCI+Ci0JCTxzaW1wbGUgbmFtZT0ibmFtZSIgdmFsdWU9IiQocHJvamVjdE5hbWUpIiAvPiAKLQkJPHNpbXBsZSBuYW1lPSJhcnRpZmFjdEV4dGVuc2lvbiIgdmFsdWU9ImV4ZSIgLz4gCi0JCTxzaW1wbGUgbmFtZT0iaXNDUHJvamVjdCIgdmFsdWU9InRydWUiIC8+IAotCTwvcHJvY2Vzcz4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNyZWF0ZVNvdXJjZUZvbGRlciI+Ci0JCTxzaW1wbGUgbmFtZT0icHJvamVjdE5hbWUiIHZhbHVlPSIkKHByb2plY3ROYW1lKSIvPgotCQk8c2ltcGxlIG5hbWU9InBhdGgiIHZhbHVlPSIkKHNvdXJjZURpcikiLz4KLQk8L3Byb2Nlc3M+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5BZGRGaWxlcyI+Ci0JCTxzaW1wbGUgbmFtZT0icHJvamVjdE5hbWUiIHZhbHVlPSIkKHByb2plY3ROYW1lKSIvPgotCQk8Y29tcGxleC1hcnJheSBuYW1lPSJmaWxlcyI+Ci0JCQk8ZWxlbWVudD4KLQkJCQk8c2ltcGxlIG5hbWU9InNvdXJjZSIgdmFsdWU9InNyYy9CYXNlbmFtZS5jIi8+Ci0JCQkJPHNpbXBsZSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSIkKHNvdXJjZURpcikvJChwcm9qZWN0TmFtZSkuYyIvPgotCQkJCTxzaW1wbGUgbmFtZT0icmVwbGFjZWFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvY29tcGxleC1hcnJheT4KLQk8L3Byb2Nlc3M+Ci0JCi0JPHByb2Nlc3MgdHlwZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy5tcGlQcm9qZWN0UHJvY2VzcyI+Ci0JCTwhLS0gbm8gYXJndW1lbnRzIGFzIHdlIGdvIHN0cmFpZ2h0IHRvIHRoZSBzdG9yZSAobm90IHJlY29tbWVuZGVkIHVzYWdlIG9mIHRlbXBsYXRlIGVuZ2luZS4uKSAtLT4KLQk8L3Byb2Nlc3M+Ci0KLTwvdGVtcGxhdGU+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvT3Blbk1QZW1wdHlDcHJvamVjdC90ZW1wbGF0ZS54bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL09wZW5NUGVtcHR5Q3Byb2plY3QvdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ0MWJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvT3Blbk1QZW1wdHlDcHJvamVjdC90ZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08dGVtcGxhdGUgdHlwZT0iUHJvalRlbXBsIiB2ZXJzaW9uPSIxLjAiIHN1cHBsaWVyPSJFY2xpcHNlLm9yZyIgcmV2aXNpb249IjEuMCIgYXV0aG9yPSJJQk0gUmVzZWFyY2giCi0JCWNvcHlyaWdodD0iQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3JwLiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCIKLQkJaWQ9Ik9wZW5NUGVtcHR5Q1Byb2plY3QiIGxhYmVsPSJPcGVuTVAgRW1wdHkgQyBQcm9qZWN0IiBkZXNjcmlwdGlvbj0iQW4gT3Blbk1QIE1QSSBwcm9qZWN0IHRlbXBsYXRlIgotCQkgaGVscD0iaGVscC5odG1sIj4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMub3Blbk1QUHJvamVjdFByb2Nlc3MiPgotCQk8IS0tIG5vIGFyZ3VtZW50cyBhcyB3ZSBnbyBzdHJhaWdodCB0byB0aGUgc3RvcmUgKG5vdCByZWNvbW1lbmRlZCB1c2FnZSBvZiB0ZW1wbGF0ZSBlbmdpbmUuLikgLS0+Ci0JPC9wcm9jZXNzPgotPC90ZW1wbGF0ZT4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9PcGVuTVBoZWxsb1dvcmxkQ3Byb2plY3Qvc3JjL0Jhc2VuYW1lLmMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL09wZW5NUGhlbGxvV29ybGRDcHJvamVjdC9zcmMvQmFzZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5M2VlNS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL09wZW5NUGhlbGxvV29ybGRDcHJvamVjdC9zcmMvQmFzZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIE5hbWUgICAgICAgIDogJChiYXNlTmFtZSkuYwotIEF1dGhvciAgICAgIDogJChhdXRob3IpCi0gVmVyc2lvbiAgICAgOgotIENvcHlyaWdodCAgIDogJChjb3B5cmlnaHQpCi0gRGVzY3JpcHRpb24gOiBIZWxsbyBPcGVuTVAgV29ybGQgaW4gQwotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIm9tcC5oIgotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pewotCWludCAgICBpLGFycmF5U2l6ZTsKLQlkb3VibGUgKngsICp5OyAgICAgLyogdGhlIGFycmF5cyAgICAgICAgICAgICAgICAgKi8KLQlwcmludGYoIiQob3Blbm1wLmhlbGxvLm1lc3NhZ2UpXG4iKTsKLQotLy8gc2FtcGxlIG9wZW5NUCBBUEkKLQlpZiAob21wX2luX3BhcmFsbGVsKCkpewotCQlwcmludGYoInRydWUiKTsKLQl9Ci0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhcnJheXMuICovCi0gIHggPSAoZG91YmxlICopIG1hbGxvYyggKHNpemVfdCkgKCAgYXJyYXlTaXplICogc2l6ZW9mKGRvdWJsZSkgKSApOwotICB5ID0gKGRvdWJsZSAqKSBtYWxsb2MoIChzaXplX3QpICggIGFycmF5U2l6ZSAqIHNpemVvZihkb3VibGUpICkgKTsKLQotICAvKiBIZXJlJ3MgdGhlIE9wZW5NUCBwcmFnbWEgdGhhdCBwYXJhbGxlbGl6ZXMgdGhlIGZvci1sb29wLiAqLwotI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yCi0gIGZvciAoIGkgPSAwOyBpIDwgYXJyYXlTaXplOyBpKysgKQotICAgIHsKLSAgICAgIHlbaV0gPSBzaW4oIGV4cCggY29zKCAtIGV4cCggc2luKHhbaV0pICkgKSApICk7Ci0gICAgfQotCi0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9PcGVuTVBoZWxsb1dvcmxkQ3Byb2plY3Qvc3JjL3Rlc3RPcGVuTVAuYyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvT3Blbk1QaGVsbG9Xb3JsZENwcm9qZWN0L3NyYy90ZXN0T3Blbk1QLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWJiYmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9PcGVuTVBoZWxsb1dvcmxkQ3Byb2plY3Qvc3JjL3Rlc3RPcGVuTVAuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJvbXAuaCIKLQotCi0vLyBTYW1wbGUgZHVtbXkgT3Blbk1QIHByb2dyYW0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKXsKLQlpbnQgICAgaSxhcnJheVNpemU7Ci0JZG91YmxlICp4LCAqeTsgICAgIC8qIHRoZSBhcnJheXMgICAgICAgICAgICAgICAgICovCi0JcHJpbnRmKCJIZWxsbyBPcGVuTVAgV29ybGQuXG4iKTsKLQotLy8gc2FtcGxlIG9wZW5NUCBBUEkKLQlpZiAob21wX2luX3BhcmFsbGVsKCkpewotCQlwcmludGYoInRydWUiKTsKLQl9Ci0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhcnJheXMuICovCi0gIHggPSAoZG91YmxlICopIG1hbGxvYyggKHNpemVfdCkgKCAgYXJyYXlTaXplICogc2l6ZW9mKGRvdWJsZSkgKSApOwotICB5ID0gKGRvdWJsZSAqKSBtYWxsb2MoIChzaXplX3QpICggIGFycmF5U2l6ZSAqIHNpemVvZihkb3VibGUpICkgKTsKLQotICAvKiBIZXJlJ3MgdGhlIE9wZW5NUCBwcmFnbWEgdGhhdCBwYXJhbGxlbGl6ZXMgdGhlIGZvci1sb29wLiAqLwotI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yCi0gIGZvciAoIGkgPSAwOyBpIDwgYXJyYXlTaXplOyBpKysgKQotICAgIHsKLSAgICAgIHlbaV0gPSBzaW4oIGV4cCggY29zKCAtIGV4cCggc2luKHhbaV0pICkgKSApICk7Ci0gICAgfQotCi0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9PcGVuTVBoZWxsb1dvcmxkQ3Byb2plY3QvdGVtcGxhdGUucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQud2l6YXJkcy90ZW1wbGF0ZXMvT3Blbk1QaGVsbG9Xb3JsZENwcm9qZWN0L3RlbXBsYXRlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjY4YTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9PcGVuTVBoZWxsb1dvcmxkQ3Byb2plY3QvdGVtcGxhdGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBSZXNlYXJjaAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgQmV0aCBUaWJiaXR0cyAoSUJNIFJlc2VhcmNoKSAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNUZW1wbGF0ZSBEZWZhdWx0IFZhbHVlcwotSGVsbG9Xb3JsZC5DQW5zaXRlbXBsYXRlLmxhYmVsPU9wZW5NUCBIZWxsbyBXb3JsZCBDIFByb2plY3QKLUhlbGxvV29ybGQuQ0Fuc2l0ZW1wbGF0ZS5kZXNjcmlwdGlvbj1BIHNrZWxldGFsIE1hbmFnZWQgQyBIZWxsbyBXb3JsZCBwcm9qZWN0LiBDcmVhdGVzIGEgZm9sZGVyIGZvciBzb3VyY2VzIGFuZCBhbm90aGVyIGZvciBpbmNsdWRlLgotSGVsbG9Xb3JsZC5iYXNpY3MubGFiZWw9QmFzaWMgU2V0dGluZ3MKLUhlbGxvV29ybGQuYmFzaWNzLmRlc2NyaXB0aW9uPUJhc2ljIHByb3BlcnRpZXMgb2YgYSBwcm9qZWN0Ci1IZWxsb1dvcmxkLmF1dGhvci5sYWJlbD1BdXRob3IKLUhlbGxvV29ybGQuYXV0aG9yLmRlc2NyaXB0aW9uPU5hbWUgb2YgdGhlIGF1dGhvcgotSGVsbG9Xb3JsZC5jb3B5cmlnaHQubGFiZWw9Q29weXJpZ2h0IG5vdGljZQotSGVsbG9Xb3JsZC5jb3B5cmlnaHQuZGVzY3JpcHRpb249WW91ciBjb3B5cmlnaHQgbm90aWNlCi1IZWxsb1dvcmxkLmNvcHlyaWdodC5kZWZhdWx0PVlvdXIgY29weXJpZ2h0IG5vdGljZQotSGVsbG9Xb3JsZC5tZXNzYWdlLmRlZmF1bHQub21wPUhlbGxvIE9wZW5NUCBXb3JsZAotSGVsbG9Xb3JsZC5tZXNzYWdlLmRlc2NyaXB0aW9uPVlvdXIgaGVsbG8gd29ybGQgZ3JlZXRpbmcgbWVzc2FnZQotSGVsbG9Xb3JsZC5tZXNzYWdlLmxhYmVsPUhlbGxvIHdvcmxkIGdyZWV0aW5nCi1IZWxsb1dvcmxkLnNvdXJjZURpci5sYWJlbD1Tb3VyY2UKLUhlbGxvV29ybGQuc291cmNlRGlyLmRlc2NyaXB0aW9uPURpcmVjdG9yeSBmb3IgaGVsbG8gd29ybGQgcHJvamVjdCBzb3VyY2UgZmlsZXMKLUhlbGxvV29ybGQuc291cmNlRGlyLmRlZmF1bHQ9c3JjCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL09wZW5NUGhlbGxvV29ybGRDcHJvamVjdC90ZW1wbGF0ZS54bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMvdGVtcGxhdGVzL09wZW5NUGhlbGxvV29ybGRDcHJvamVjdC90ZW1wbGF0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTBhYWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzL3RlbXBsYXRlcy9PcGVuTVBoZWxsb1dvcmxkQ3Byb2plY3QvdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPHRlbXBsYXRlIHR5cGU9IlByb2pUZW1wbCIgdmVyc2lvbj0iMS4wIiBzdXBwbGllcj0iRWNsaXBzZS5vcmciIHJldmlzaW9uPSIxLjAiIGF1dGhvcj0iQmV0aCBUaWJiaXR0cyAoSUJNIFJlc2VhcmNoKSIKLQkJY29weXJpZ2h0PSJibGFoIGJsYWggIgotCQlpZD0iT3Blbk1QaGVsbG9Xb3JsZENwcm9qZWN0IiBsYWJlbD0iJUhlbGxvV29ybGQuQ0Fuc2l0ZW1wbGF0ZS5sYWJlbCIgZGVzY3JpcHRpb249IiVIZWxsb1dvcmxkLkNBbnNpdGVtcGxhdGUuZGVzY3JpcHRpb24iCi0JCSBoZWxwPSJoZWxwLmh0bWwiPgotCi0JPHByb3BlcnR5LWdyb3VwIGlkPSJiYXNpY3MiIGxhYmVsPSIlSGVsbG9Xb3JsZC5iYXNpY3MubGFiZWwiIGRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5iYXNpY3MuZGVzY3JpcHRpb24iIHR5cGU9IlBBR0VTLU9OTFkiIGhlbHA9ImhlbHAuaHRtbCI+Ci0JCTxwcm9wZXJ0eSBpZD0iYXV0aG9yIgotCQkJbGFiZWw9IiVIZWxsb1dvcmxkLmF1dGhvci5sYWJlbCIKLQkJCWRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5hdXRob3IuZGVzY3JpcHRpb24iCi0JCQl0eXBlPSJpbnB1dCIKLQkJCXBhdHRlcm49Ii4qIgotCQkJZGVmYXVsdD0iIgotCQkJaGlkZGVuPSJmYWxzZSIKLQkJCXBlcnNpc3Q9InRydWUiLz4KLQkJPHByb3BlcnR5IGlkPSJjb3B5cmlnaHQiCi0JCQlsYWJlbD0iJUhlbGxvV29ybGQuY29weXJpZ2h0LmxhYmVsIgotCQkJZGVzY3JpcHRpb249IiVIZWxsb1dvcmxkLmNvcHlyaWdodC5kZXNjcmlwdGlvbiIKLQkJCXR5cGU9ImlucHV0IgotCQkJcGF0dGVybj0iLioiCi0JCQlkZWZhdWx0PSIlSGVsbG9Xb3JsZC5jb3B5cmlnaHQuZGVmYXVsdCIKLQkJCWhpZGRlbj0iZmFsc2UiCi0JCQlwZXJzaXN0PSJ0cnVlIi8+Ci0JCTxwcm9wZXJ0eSBpZD0ib3Blbm1wLmhlbGxvLm1lc3NhZ2UiCi0JCQlsYWJlbD0iJUhlbGxvV29ybGQubWVzc2FnZS5sYWJlbCIKLQkJCWRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5tZXNzYWdlLmRlc2NyaXB0aW9uIgotCQkJdHlwZT0iaW5wdXQiCi0JCQlwYXR0ZXJuPSIuKiIKLQkJCWRlZmF1bHQ9IiVIZWxsb1dvcmxkLm1lc3NhZ2UuZGVmYXVsdC5vbXAiCi0JCQloaWRkZW49ImZhbHNlIgotCQkJcGVyc2lzdD0idHJ1ZSIvPgotCQk8cHJvcGVydHkgaWQ9InNvdXJjZURpciIKLQkJCQlsYWJlbD0iJUhlbGxvV29ybGQuc291cmNlRGlyLmxhYmVsIgotCQkJCWRlc2NyaXB0aW9uPSIlSGVsbG9Xb3JsZC5zb3VyY2VEaXIuZGVzY3JpcHRpb24iCi0JCQkJdHlwZT0iaW5wdXQiCi0JCQkJZGVmYXVsdD0iJUhlbGxvV29ybGQuc291cmNlRGlyLmRlZmF1bHQiCi0JCQkJcGF0dGVybj0iW2EtekEtWjAtOV0rIgotCQkJCW1hbmRhdG9yeT0iZmFsc2UiCi0JCQkJcGVyc2lzdD0idHJ1ZSIvPgotCTwvcHJvcGVydHktZ3JvdXA+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5OZXdNYW5hZ2VkUHJvamVjdCI+Ci0JCTxzaW1wbGUgbmFtZT0ibmFtZSIgdmFsdWU9IiQocHJvamVjdE5hbWUpIiAvPiAKLQkJPHNpbXBsZSBuYW1lPSJhcnRpZmFjdEV4dGVuc2lvbiIgdmFsdWU9ImV4ZSIgLz4gCi0JCTxzaW1wbGUgbmFtZT0iaXNDUHJvamVjdCIgdmFsdWU9InRydWUiIC8+IAotCTwvcHJvY2Vzcz4KLQotCTxwcm9jZXNzIHR5cGU9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNyZWF0ZVNvdXJjZUZvbGRlciI+Ci0JCTxzaW1wbGUgbmFtZT0icHJvamVjdE5hbWUiIHZhbHVlPSIkKHByb2plY3ROYW1lKSIvPgotCQk8c2ltcGxlIG5hbWU9InBhdGgiIHZhbHVlPSIkKHNvdXJjZURpcikiLz4KLQk8L3Byb2Nlc3M+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5BZGRGaWxlcyI+Ci0JCTxzaW1wbGUgbmFtZT0icHJvamVjdE5hbWUiIHZhbHVlPSIkKHByb2plY3ROYW1lKSIvPgotCQk8Y29tcGxleC1hcnJheSBuYW1lPSJmaWxlcyI+Ci0JCQk8ZWxlbWVudD4KLQkJCQk8c2ltcGxlIG5hbWU9InNvdXJjZSIgdmFsdWU9InNyYy9CYXNlbmFtZS5jIi8+Ci0JCQkJPHNpbXBsZSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSIkKHNvdXJjZURpcikvJChwcm9qZWN0TmFtZSkuYyIvPgotCQkJCTxzaW1wbGUgbmFtZT0icmVwbGFjZWFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvY29tcGxleC1hcnJheT4KLQk8L3Byb2Nlc3M+Ci0KLQk8cHJvY2VzcyB0eXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC53aXphcmRzLm9wZW5NUFByb2plY3RQcm9jZXNzIj4KLQkJPCEtLSBubyBhcmd1bWVudHMgYXMgd2UgZ28gc3RyYWlnaHQgdG8gdGhlIHN0b3JlIChub3QgcmVjb21tZW5kZWQgdXNhZ2Ugb2YgdGVtcGxhdGUgZW5naW5lLi4pIC0tPgotCTwvcHJvY2Vzcz4KLTwvdGVtcGxhdGU+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLy5jbGFzc3BhdGggYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS8ucHJvamVjdCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjcyNWM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmIyOWU3My4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuOS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5SZW1vdGV0b29sc1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gY29tLmpjcmFmdC5qc2NoLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscywKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scywKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uCi1CdW5kbGUtQ2xhc3NQYXRoOiAKLSAuCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9hYm91dC5odG1sIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTc4MjQyZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2Fib3V0LmluaSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NzRiOWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QVFAgUmVtb3RlIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3B0cFxuCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTc5YjExLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2VjbGlwc2UzMi5wbmcgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzMxMGUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBSZW1vdGUgVG9vbHMKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9wbHVnaW4ueG1sIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU0OWI1Mi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL1JlbW90ZXRvb2xzUGx1Z2luLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL1JlbW90ZXRvb2xzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZWQ4ODIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9SZW1vdGV0b29sc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuQXV0aFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2guQ2lwaGVyVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Zy1pbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RldG9vbHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJlbW90ZXRvb2xzUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFJlbW90ZXRvb2xzUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVtb3RldG9vbHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSVJlbW90ZUNvbm5lY3Rpb259IHVzaW5nIGEgc3NoIGNvbm5lY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVtb3RlQ29ubmVjdGlvbiBjcmVhdGVTU0hDb25uZWN0aW9uKEF1dGhUb2tlbiBhdXRoVG9rZW4sIFN0cmluZyBob3N0bmFtZSwKLQkJCWludCBwb3J0LCBTdHJpbmcgY2lwaGVyVHlwZSwgaW50IHRpbWVvdXQpCi0JewkJCi0JCXJldHVybiBuZXcgQ29ubmVjdGlvbihhdXRoVG9rZW4sIGhvc3RuYW1lLCBwb3J0LCBjaXBoZXJUeXBlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBJUmVtb3RlQ29ubmVjdGlvbn0gdXNpbmcgYSBzc2ggY29ubmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSZW1vdGVDb25uZWN0aW9uIGNyZWF0ZVNTSENvbm5lY3Rpb24oQXV0aFRva2VuIGF1dGhUb2tlbiwgU3RyaW5nIGhvc3RuYW1lLAotCQkJaW50IHBvcnQsIFN0cmluZyBjaXBoZXJUeXBlKQotCXsJCQotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb24oYXV0aFRva2VuLCBob3N0bmFtZSwgcG9ydCwgY2lwaGVyVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElSZW1vdGVDb25uZWN0aW9ufSB1c2luZyBhIHNzaCBjb25uZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlbW90ZUNvbm5lY3Rpb24gY3JlYXRlU1NIQ29ubmVjdGlvbihBdXRoVG9rZW4gYXV0aFRva2VuLCBTdHJpbmcgaG9zdG5hbWUpCi0JewkJCi0JCXJldHVybiBuZXcgQ29ubmVjdGlvbihhdXRoVG9rZW4sIGhvc3RuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZW1vdGVDb25uZWN0aW9uIGNyZWF0ZVNTSENvbm5lY3Rpb24oQXV0aFRva2VuIGF1dGhUb2tlbiwgU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb24oYXV0aFRva2VuLCBob3N0bmFtZSwgcG9ydCk7Ci0JfQotCQotCS8qKgotCSAqIDNERVMgY2lwaGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVBIRVJfM0RFUyA9IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2guQ2lwaGVyVHlwZXMuQ0lQSEVSXzNERVM7Ci0JLyoqCi0JICogQUVTMTI4IGNpcGhlciB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lQSEVSX0FFUzEyOCA9IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2guQ2lwaGVyVHlwZXMuQ0lQSEVSX0FFUzEyODsKLQkvKioKLQkgKiBBRVMxOTIgY2lwaGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVBIRVJfQUVTMTkyID0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaC5DaXBoZXJUeXBlcy5DSVBIRVJfQUVTMTkyOwotCS8qKgotCSAqIEFFUzI1NiBjaXBoZXIgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUEhFUl9BRVMyNTYgPSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoLkNpcGhlclR5cGVzLkNJUEhFUl9BRVMyNTY7Ci0JLyoqCi0JICogQmxvd2Zpc2ggY2lwaGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVBIRVJfQkxPV0ZJU0ggPSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoLkNpcGhlclR5cGVzLkNJUEhFUl9CTE9XRklTSDsKLQkvKioKLQkgKiBEZWZhdWx0IGNpcGhlciB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lQSEVSX0RFRkFVTFQgPSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoLkNpcGhlclR5cGVzLkNJUEhFUl9ERUZBVUxUOwotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldENpcGhlclR5cGVzTWFwKCkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKENpcGhlclR5cGVzLmdldENpcGhlclR5cGVzTWFwKCkpOwotCQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSVJlbW90ZUNvbm5lY3Rpb259IHVzaW5nIGEgc3NoIGNvbm5lY3Rpb24uCi0JICovLyoKLQlwdWJsaWMgc3RhdGljIElSZW1vdGVDb25uZWN0aW9uIGNyZWF0ZVNTSENvbm5lY3Rpb24oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBob3N0bmFtZSwKLQkJCWludCBwb3J0LCBpbnQgdGltZW91dCkKLQl7CQkKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9zdG5hbWUsIHBvcnQsIHRpbWVvdXQpOwotCX0KLQotCSovLyoqCi0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSVJlbW90ZUNvbm5lY3Rpb259IHVzaW5nIGEgc3NoIGNvbm5lY3Rpb24uCi0JICovLyoKLQlwdWJsaWMgc3RhdGljIElSZW1vdGVDb25uZWN0aW9uIGNyZWF0ZVNTSENvbm5lY3Rpb24oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBob3N0bmFtZSkKLQl7CQkKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9zdG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlbW90ZUNvbm5lY3Rpb24gY3JlYXRlU1NIQ29ubmVjdGlvbihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb24odXNlcm5hbWUsIHBhc3N3b3JkLCBob3N0bmFtZSwgcG9ydCk7Ci0JfSovCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvQXV0aFRva2VuLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvQXV0aFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMTQwNzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0F1dGhUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZTsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEF1dGhUb2tlbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7Ci0KLQlwdWJsaWMgQXV0aFRva2VuKFN0cmluZyB1c2VybmFtZSkgewotCQl0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0JCXJldHVybiB1c2VybmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKLQkJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JTG9jYWxQb3J0Rm9yd2FyZGluZy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lMb2NhbFBvcnRGb3J3YXJkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTkxNGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lMb2NhbFBvcnRGb3J3YXJkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBsb2NhbCBwb3J0IGZvcndhcmRpbmcgY3JlYXRlZCBieQotICoge0BsaW5rIElSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzfS4KLSAqIDxwPgotICogVGhlIGxvY2FsIHBvcnQgaXMgZm9yd2FyZGVkIHRvIGEgaG9zdDpwb3J0IGFjY2Vzc2libHkgdG8gdGhlIHJlbW90ZSBob3N0LgotICogPHA+Ci0gKiBDaGVjayBpbmhlcml0ZWQge0BsaW5rIElQb3J0Rm9yd2FyZGluZ30gZm9yIG1vcmUgbWV0aG9kcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9jYWxQb3J0Rm9yd2FyZGluZyBleHRlbmRzIElQb3J0Rm9yd2FyZGluZyB7Ci0JLyoqIFRoZSBsb2NhbCBwb3J0IHRoYXQgaXMgYmVpbmcgZm9yd2FyZGVkLiAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TG9jYWxQb3J0KCk7Ci0KLQkvKiogVGhlIGhvc3Qgd2hlcmUgdGhlIGxvY2FsIHBvcnQgaXMgZm9yd2FyZGVkIHRvLiAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVtb3RlQWRkcmVzcygpOwotCi0JLyoqIFRoZSBwb3J0IG9uIHRoZSBob3N0IHdoZXJlIHRoZSBsb2NhbCBwb3J0IGlzIGZvcndhcmRlZCB0by4gKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFJlbW90ZVBvcnQoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUG9ydEZvcndhcmRpbmcuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUG9ydEZvcndhcmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxZTU4NC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVBvcnRGb3J3YXJkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5Qb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHBvcnQgZm9yd2FyZGluZyBjcmVhdGVkIGJ5IHtAbGluayBJUmVtb3RlUG9ydEZvcndhcmRpbmdUb29sc30uCi0gKiA8cD4KLSAqIEluIG9yZGVyIHRvIHR1cm4gb2ZmIHBvcnQgZm9yd2FyZGluZywgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0gb3IKLSAqIHtAbGluayBJUmVtb3RlUG9ydEZvcndhcmRpbmdUb29scyNyZWxlYXNlRm9yd2FyZGluZyhJUG9ydEZvcndhcmRpbmcpfS4KLSAqIDxwPgotICogVGhlIGluZm9ybWF0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSBwb3J0IGZvcndhcmRpbmcgaXMgdmFsaWQgdW50aWwgdGhlCi0gKiBmb3J3YXJkaW5nIGlzIHR1cm5lZCBvZmYuIFRoZSBjaGVjayBpZiB0aGUgZm9yd2FyZGluZyBpcyBhY3RpdmUsIGNhbGwKLSAqIHtAbGluayAjaXNBY3RpdmUoKX0uCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQb3J0Rm9yd2FyZGluZyB7Ci0JLyoqIElmIHRoZSBwb3J0IGZvcndhcmRpbmcgaXMgdHVybmVkIG9uLiAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBUdXJuIG9mZiB0aGUgcG9ydCBmb3J3YXJkaW5nLiBJdCBpcyBmYWNpbGl0eSBtZXRob2QgdGhhdCBjYWxscwotCSAqIHtAbGluayBJUmVtb3RlUG9ydEZvcndhcmRpbmdUb29scyNyZWxlYXNlRm9yd2FyZGluZyhJUG9ydEZvcndhcmRpbmcpfS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgY29ubmVjdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBhbnltb3JlLgotCSAqIEB0aHJvd3MgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBGYWlsZWQgdG8gdHVybiBvZmYgdGhlIHJlbW90ZSBwb3J0IGZvcndhcmRpbmcuIFRoZSBmb3J3YXJkaW5nCi0JICogICAgICAgICAgICAgd2FzIGFscmVhZHkgdHVybmVkIG9mZiBiZWZvcmUuCi0JICogQHRocm93cyBDYW5jZWxFeGNlcHRpb24gCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZSgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLAotCQkJUG9ydEZvcndhcmRpbmdFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlQ29ubmVjdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2YzlkZTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogQSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGhvc3QuIFNlcnZlcyBhcyBhIHN0YXJ0aW5nIHBvaW50IGZvciBjcmVhdGluZwotICoge0BsaW5rIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyfSwgdGhhdCB0byBvcGVyYXRpb25zIG9uIHRoZSByZW1vdGUgaG9zdC4KLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwsIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjEKLSAqIDxiPlJldmlldyBPSzwvYj4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVtb3RlQ29ubmVjdGlvbgotewotCXZvaWQgY29ubmVjdCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGVybWluYXRlIGNvbm5lY3Rpb24gdG8gcmVtb3RlIG1hY2hpbmUuCi0JICogPHA+Ci0JICogVE9ETzogRGVjaWRlOiBCbG9jayB1bnRpbCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBmaW5pc2hlZCBvciBjYW5jZWxzCi0JICogcGVuZGluZyBvcGVyYXRpb25zPwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKTsKLQotCS8qKgotCSAqIENoZWNrIGlmIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgd2l0aCB0aGUgcmVtb3RlIGhvc3QuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIGlzIGNvbm5lY3RlZCB3aXRoIHJlbW90ZSBob3N0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb3BlciBpbnN0YW5jZSBvZiB7QGxpbmsgSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXJ9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHtAbGluayBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlcn0gZm9yIHRoaXMgY29ubmVjdGlvbgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBpZiB0aGUge0BsaW5rIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyfSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgY3JlYXRlUmVtb3RlRXhlY3V0aW9uTWFuYWdlcigpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotfQkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlQ29weVRvb2xzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZUNvcHlUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWU4YTg3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlQ29weVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBHcm91cHMgYWxsIG9wZXJhdGlvbnMgdGhhdCBkbyBkYXRhIHRyYW5zZmVyZW5jZSBiZXR3ZWVuIHJlbW90ZSBhbmQgbG9jYWwKLSAqIGhvc3QuCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlciwgUmljaGFyZCBNYWNpZWwKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVDb3B5VG9vbHMgewotCXB1YmxpYyBJUmVtb3RlVXBsb2FkRXhlY3V0aW9uIGV4ZWN1dGVVcGxvYWQoU3RyaW5nIHJlbW90ZUZpbGUsIElucHV0U3RyZWFtIHNvdXJjZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgSVJlbW90ZURvd25sb2FkRXhlY3V0aW9uIGV4ZWN1dGVEb3dubG9hZChTdHJpbmcgcmVtb3RlRmlsZSwgT3V0cHV0U3RyZWFtIHNpbmspIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCi0JcHVibGljIElSZW1vdGVVcGxvYWRFeGVjdXRpb24gZXhlY3V0ZVVwbG9hZChTdHJpbmcgcmVtb3RlRmlsZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgSVJlbW90ZURvd25sb2FkRXhlY3V0aW9uIGV4ZWN1dGVEb3dubG9hZChTdHJpbmcgcmVtb3RlRmlsZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBkb3dubG9hZEZpbGVUb0RpcihTdHJpbmcgcmVtb3RlUGF0aCwgRmlsZSBsb2NhbERpcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgZG93bmxvYWRGaWxlVG9EaXIoU3RyaW5nIHJlbW90ZVBhdGgsIFN0cmluZyBsb2NhbFBhaCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgZG93bmxvYWRGaWxlVG9GaWxlKFN0cmluZyByZW1vdGVQYXRoLCBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgZG93bmxvYWRGaWxlVG9GaWxlKFN0cmluZyByZW1vdGVQYXRoLCBTdHJpbmcgbG9jYWxQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCB1cGxvYWRGaWxlVG9EaXIoRmlsZSBsb2NhbEZpbGUsIFN0cmluZyByZW1vdGVQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCB1cGxvYWRGaWxlVG9EaXIoU3RyaW5nIGxvY2FsUGF0aCwgU3RyaW5nIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHVwbG9hZEZpbGVUb0ZpbGUoRmlsZSBsb2NhbEZpbGUsIFN0cmluZyByZW1vdGVQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCB1cGxvYWRGaWxlVG9GaWxlKFN0cmluZyBsb2NhbFBhdGgsIFN0cmluZyByZW1vdGVQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIEl0IHdpbGwgbm90IGJlIHRlc3RlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUmVtb3RlVG9vbHMuCi0JICogSXQgd2lsbCBiZSByZXBsYWNlZCBieSBiZXR0ZXIgbWVjaGFuaXNtcyB0byB3YWxrIGFuZCBjb3B5IHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIGZpbGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIGRvd25sb2FkRGlyVG9EaXIoU3RyaW5nIHJlbW90ZVBhdGgsIEZpbGUgbG9jYWxEaXIsIGJvb2xlYW4gcmVjdXJzaXZlKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIEl0IHdpbGwgbm90IGJlIHRlc3RlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUmVtb3RlVG9vbHMuCi0JICogSXQgd2lsbCBiZSByZXBsYWNlZCBieSBiZXR0ZXIgbWVjaGFuaXNtcyB0byB3YWxrIGFuZCBjb3B5IHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIGZpbGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIGRvd25sb2FkRGlyVG9EaXIoU3RyaW5nIHJlbW90ZVBhdGgsIFN0cmluZyBsb2NhbFBhdGgsIGJvb2xlYW4gcmVjdXJzaXZlKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIEl0IHdpbGwgbm90IGJlIHRlc3RlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUmVtb3RlVG9vbHMuCi0JICogSXQgd2lsbCBiZSByZXBsYWNlZCBieSBiZXR0ZXIgbWVjaGFuaXNtcyB0byB3YWxrIGFuZCBjb3B5IHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIGZpbGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwbG9hZERpclRvRGlyKEZpbGUgbG9jYWxEaXIsIFN0cmluZyByZW1vdGVQYXRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBJdCB3aWxsIG5vdCBiZSB0ZXN0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFJlbW90ZVRvb2xzLgotCSAqIEl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgYmV0dGVyIG1lY2hhbmlzbXMgdG8gd2FsayBhbmQgY29weSByZWN1cnNpdmVseSB0aHJvdWdoIHRoZSBmaWxlIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGxvYWREaXJUb0RpcihTdHJpbmcgbG9jYWxQYXRoLCBTdHJpbmcgcmVtb3RlUGF0aCwgYm9vbGVhbiByZWN1cnNpdmUpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVEaXJlY3RvcnkuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlRGlyZWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwZWE3YTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVEaXJlY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVtb3RlRGlyZWN0b3J5IGV4dGVuZHMgSVJlbW90ZUl0ZW0gewotCQotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZSgpOwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc2libGUoYm9vbGVhbiBmbGFnKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVEb3dubG9hZEV4ZWN1dGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVEb3dubG9hZEV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2U5MmQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlRG93bmxvYWRFeGVjdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZURvd25sb2FkRXhlY3V0aW9uIGV4dGVuZHMgSVJlbW90ZU9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUHJvY2VzcyByZXR1cm4gZXhpdCBzdGF0dXMuCi0JICovCi0JcHVibGljIGludCBnZXRSZXR1cm5Db2RlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBvdXRwdXQgc3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSByZW1vdGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc1JlbW90ZUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlRXhlY3V0aW9uTWFuYWdlci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVFeGVjdXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmYzI3MTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVFeGVjdXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5Mb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzZXJ2aWNlIHRvIHJ1biBjb21tYW5kcyBvbiB0aGUgcmVtb3RlIGhvc3QgYW5kIHRvIHRyYW5zZmVyIGZpbGVzIGZyb20vdG8gdGhlIHJlbW90ZSBob3N0LiAKLSAqIDxwPj4KLSAqIEFkZHMgZnVuY3Rpb25hbGl0eSBmb3IgYmxvY2tpbmcgb3BlcmF0aW9ucyB1bnRpbCB0aGV5IGZpbmlzaCBleGVjdXRpb24uCi0gKiBBbGxvd3MgY2FuY2VsaW5nIHRoZSBob2xlIG1hbmFnZXIsIHRoYXQgd2lsbCBjYW5jZWwgYWxsIGN1cnJlbnQgb3BlcmF0aW9uIGJ5IHJhaXNpbmcgQ2FuY2VsRXhjZXB0aW9uCi0gKiBvbiBlYWNoIG9mIHRoZW0uLgotICogPHA+Ci0gKiBBbGwgcGF0aHMgTVVTVCBiZSBzcGVjaWZpZWQgYXMgZnVsbCBhYnNvbHV0ZSBwYXRocy4KLSAqIDxwPgotICogCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsLCBEYW5pZWwgRi4gRmVyYmVyCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgewotCS8qKgotCSAqIENhbmNlbHMgdGhlIGFsbCBjdXJyZW50IHNjcmlwdHMgb24gZXhlY3V0aW9uIGF0IHRoZSByZW1vdGUgbWFjaGluZSB0aGF0IHdlcmUgY3JlYXRlZCBieSB0aGlzIG1hbmFnZXIuCi0JICogQWxzbyBjYW5jZWxzIGN1cnJlbnQgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb25zLgotCSAqIERvZXMgbm90IGFsbG93IGFueSBmdXJ0aGVyIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgY2FuY2VsKCk7Ci0JLyoqCi0JICogUmVtb3ZlcyB0aGUgY2FuY2VsIGNvbmRpdGlvbnMgYW5kIGFsbG93cyBmdXJ0aGVyIG9wZXJhdGlvbnMgYWdhaW4uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRDYW5jZWwoKTsKLQkKLQkvKioKLQkgKiBGcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIHRoZSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQotCXB1YmxpYyBJUmVtb3RlRmlsZVRvb2xzIGdldFJlbW90ZUZpbGVUb29scygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCXB1YmxpYyBJUmVtb3RlQ29weVRvb2xzIGdldFJlbW90ZUNvcHlUb29scygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCXB1YmxpYyBJUmVtb3RlRXhlY3V0aW9uVG9vbHMgZ2V0RXhlY3V0aW9uVG9vbHMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgSVJlbW90ZVBhdGhUb29scyBnZXRSZW1vdGVQYXRoVG9vbHMoKTsKLQkJCi0JcHVibGljIElSZW1vdGVTdGF0dXNUb29scyBnZXRSZW1vdGVTdGF0dXNUb29scygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCi0JcHVibGljIElSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzIGdldFBvcnRGb3J3YXJkaW5nVG9vbHMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW5kIGJpbmQgYSB0dW5uZWwgZnJvbSBsb2NhbGhvc3QgcG9ydCB0byBhIGdpdmVuIHJlbW90ZWhvc3QgcG9ydC4KLQkgKiBUaGlzIG1ldGhvZHMgYWxsb2NzIHRoZSBsb2NhbGhvc3QgcG9ydCBhdXRvbWF0aWNhbGx5LgotCSAqIAotCSAqIEBwYXJhbSBhZGRyZXNzT25SZW1vdGVIb3N0IFJlbW90ZSBIb3N0IGFkZHJlc3MKLQkgKiBAcGFyYW0gcG9ydE9uUmVtb3RlSG9zdCBSZW1vdGUgSG9zdCBwb3J0Ci0JICogQHJldHVybiBBbiBJUmVtb3RlVHVubmVsIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNyZWF0ZWQgdHVubmVsCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBMb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbiBObyBsb2NhbCBwb3J0IGF2YWlsYWJsZSB0byBjb25uZWN0LgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uIAotCSAqICh0aGlzIG1ldGhvZCBzaG91bGQgYmUgZGVwcmVjYXRlZCBpbiBmdXR1cmUgYW5kIG1vdmVkIHRvIElSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlVHVubmVsIGNyZWF0ZVR1bm5lbChTdHJpbmcgYWRkcmVzc09uUmVtb3RlSG9zdCwgaW50IHBvcnRPblJlbW90ZUhvc3QpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBMb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCS8qCi0JICogKHRoaXMgbWV0aG9kIHNob3VsZCBiZSBkZXByZWNhdGVkIGluIGZ1dHVyZSBhbmQgbW92ZWQgdG8gSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHMpCi0JICovCi0JcHVibGljIElSZW1vdGVUdW5uZWwgY3JlYXRlVHVubmVsKGludCBsb2NhbFBvcnQsIFN0cmluZyBhZGRyZXNzT25SZW1vdGVIb3N0LCBpbnQgcG9ydE9uUmVtb3RlSG9zdCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIExvY2FsUG9ydEJvdW5kRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0JLyoKLQkgKiAodGhpcyBtZXRob2Qgc2hvdWxkIGJlIGRlcHJlY2F0ZWQgaW4gZnV0dXJlIGFuZCBtb3ZlZCB0byBJUmVtb3RlUG9ydEZvcndhcmRpbmdUb29scykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlVHVubmVsKElSZW1vdGVUdW5uZWwgdHVubmVsKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVFeGVjdXRpb25Ub29scy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVFeGVjdXRpb25Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjM5YzQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlRXhlY3V0aW9uVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZUV4ZWN1dGlvblRvb2xzIHsKLQkvKioKLQkgKiBDcmVhdGUgYSBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBiYXNoIHNjcmlwdCB0byBiZSBleGVjdXRlZCBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICogQHJldHVybiBhIHByZS1jb25maWd1cmVkIGluc3RhbmNlIG9mIElSZW1vdGVTY3JpcHQKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZVNjcmlwdCBjcmVhdGVTY3JpcHQoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBiYXNoIHNjcmlwdCBkZXNjcmliZWQgYnkgYW4ge0BsaW5rIElSZW1vdGVTY3JpcHR9LgotCSAqIDxwPgotCSAqIFRoZSBzY3JpcHQgd2lsbCBzdGFydCBleGVjdXRpbmcgaW1tZWRpYXRlbHksIFRoZSBtZXRob2QgZG9lcyBub3QgYmxvY2suCi0JICogPHA+Ci0JICogVGhlIHtAbGluayBJUmVtb3RlU2NyaXB0RXhlY3V0aW9ufSBpbnN0YW5jZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBkZXNjcmliZXMgdGhlCi0JICogZXhlY3V0aW9uIHByb3BlcnRpZXMsIGNvbXBsZXRpb24gc3RhdHVzIGFuZCBpdHMgcmVzdWx0IChvbmNlIGZpbmlzaGVkKS4KLQkgKiBUaGUge0BsaW5rIElSZW1vdGVTY3JpcHRFeGVjdXRpb259IGhhcyBhIG1ldGhvZCBmb3IgYmxvY2tpbmcgdGhlIGN1cnJlbnQgdGhyZWFkCi0JICogdW50aWwgdGhlIHNjcmlwdCBmaW5pc2hlcyBleGVjdXRpb24gYW5kIGFub3RoZXIgdG8gY2FuY2VsIHRoZSBzY3JpcHQgaW5kaXZpZHVhbGx5LgotCSAqIAotCSAqIEBwYXJhbSByZW1vdGVTY3JpcHQgVGhlIHtAbGluayBJUmVtb3RlU2NyaXB0fSB0aGF0IGRlc2NyaWJlcyB0aGUgYmFzaCBzY3JpcHQgdG8gYmUgZXhlY3V0ZWQKLQkgKiBAcmV0dXJuIGEgcHJvcGVyIGluc3RhbmNlIG9mIHtAbGluayBJUmVtb3RlU2NyaXB0RXhlY3V0aW9ufS4gCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIElmIG5vdCBwb3NzaWJsZSB0byByZXF1ZXN0IHRoZSBleGVjdXRpb24gb24gcmVtb3RlIGhvc3QuIAotCSAqIEB0aHJvd3MgIAotCSAqLwotCXB1YmxpYyBJUmVtb3RlU2NyaXB0RXhlY3V0aW9uIGV4ZWN1dGVTY3JpcHQoSVJlbW90ZVNjcmlwdCByZW1vdGVTY3JpcHQpIHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCXB1YmxpYyBSZW1vdGVQcm9jZXNzIGV4ZWN1dGVQcm9jZXNzKElSZW1vdGVTY3JpcHQgcmVtb3RlU2NyaXB0KSB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSdW4gYSBjb21tYW5kIGFuZCB3YWl0IHVudGlsIGl0IGZpbmlzaGVzLgotCSAqIEByZXR1cm4gY29tbWFuZCBleGl0IHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVXaXRoRXhpdFZhbHVlKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSdW4gYSBjb21tYW5kIGFuZCByZXR1cm4gaXRzIG91dHB1dC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXhlY3V0ZVdpdGhPdXRwdXQoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJ1biBhIGJhc2ggY29tbWFuZC4gQXNzdW1lIHRoYXQgbm9uIHplcm8gZXhpdCBzdGF0dXMgbWVhbnMgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZUJhc2hDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVGaWxlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU0MjcyNy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVtb3RlRmlsZSBleHRlbmRzIElSZW1vdGVJdGVtIHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4ZWN1dGFibGUoKTsKLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKGJvb2xlYW4gZmxhZyk7Ci0JCi0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVGaWxlRW51bWVyYXRpb24uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlRmlsZUVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxYzJlMDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVGaWxlRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJUmVtb3RlRmlsZUVudW1lcmF0aW9uIGV4dGVuZHMgRW51bWVyYXRpb24gewotCXB1YmxpYyBJUmVtb3RlSXRlbSBuZXh0RWxlbWVudEFzSXRlbSgpOwotCXB1YmxpYyBFeGNlcHRpb24gbmV4dEV4Y2VwdGlvbigpOwotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFeGNlcHRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZUZpbGVUb29scy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVGaWxlVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJhMDFhYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZUZpbGVUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBHcm91cHMgYWxsIG9wZXJhdGlvbnMgYWJvdXQgZmlsZXMgb24gdGhlIHJlbW90ZSBob3N0LgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZXJiZXIsIFJpY2hhcmQgTWFjaWVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZUZpbGVUb29scyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVJlbW90ZUNvcHlUb29scyBvYmplY3QKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAcmV0dXJuIElSZW1vdGVDb3B5VG9vbHMKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZUNvcHlUb29scyBnZXRSZW1vdGVDb3B5VG9vbHMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBNb3ZlIGEgZmlsZSBvbiByZW1vdGUgaG9zdC4KLQkgKiA8cD4KLQkgKiBDcmVhdGUgKHN1YilkaXJlY3RvcmllcyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBuZXcgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZnJvbQotCSAqICAgICAgICAgICAgQWJzb2x1dGUgcGF0aCB0byBzb3VyY2Ugb24gcmVtb3RlIGhvc3QuCi0JICogQHBhcmFtIHRvCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIGRlc3RpbmF0aW9uIG9uIHJlbW90ZSBob3N0LgotCSAqIEB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGZpbGUgY291bGQgbm90IGJlIG1vdmVkLgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBjb25uZWN0aW9uIGZhaWxlZC4KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBtb3ZlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQgYnkgYW5vdGhlciB0aHJlYWQuIElmIHRoZQotCSAqICAgICAgICAgICAgIG1vdmUgaW52b2x2ZXMgc2V2ZXJhbCBmaWxlcywgdGhlbiB0aGUgbW92ZSBtYXkgcmVtYWluCi0JICogICAgICAgICAgICAgaW5jb21wbGV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlRmlsZShTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKQotCQkJdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwKLQkJCUNhbmNlbEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvcHkgYSBmaWxlIG9uIHJlbW90ZSBob3N0LgotCSAqIDxwPgotCSAqIENyZWF0ZSAoc3ViKWRpcmVjdG9yaWVzIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIG5ldyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBmcm9tCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHNvdXJjZSBvbiByZW1vdGUgaG9zdC4KLQkgKiBAcGFyYW0gdG8KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gZGVzdGluYXRpb24gb24gcmVtb3RlIGhvc3QuCi0JICogQHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZmlsZSBjb3VsZCBub3QgYmUgY29waWVkLgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBjb25uZWN0aW9uIGZhaWxlZC4KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBjb3B5IG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQgYnkgYW5vdGhlciB0aHJlYWQuIElmIHRoZQotCSAqICAgICAgICAgICAgIGNvcHkgaW52b2x2ZXMgc2V2ZXJhbCBmaWxlcywgdGhlbiB0aGUgY29weSBtYXkgcmVtYWluCi0JICogICAgICAgICAgICAgaW5jb21wbGV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLAotCQlSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRGVsZXRlIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gcmVtb3RlIGhvc3QuCi0JICogPHA+Ci0JICogSWYgdGhlIHBhdGggaXMgYSBkaXJlY3RvcnksIHJlbW92ZSByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgQWJzb2x1dGUgcGF0aCBvZiBmaWxlIG9yIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkLgotCSAqIEB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGZpbGUgY291bGQgbm90IGJlIGRlbGV0ZWQuCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24gZmFpbGVkLgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIHJlbW92ZSBvcGVyYXRpb24gd2FzIGNhbmNlbGVkIGJ5IGFub3RoZXIgdGhyZWFkLiBUaGUKLQkgKiAgICAgICAgICAgICBmaWxlKHMpIG1heSBoYXZlIGJlZW4gYWxsIHJlbW92ZWQsIHBhcnRpYWxseSBub3QgcmVtb3ZlZCBvcgotCSAqICAgICAgICAgICAgIG5vdCByZW1vdmVkIGF0IGFsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGaWxlKFN0cmluZyBmaWxlKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLAotCQkJUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCi0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeS4KLQkgKiA8cD4KLQkgKiBJZiBkaXJlY3RvcnkgZXhpc3RzLCBub3RoaW5ncyBpcyBkb25lLgotCSAqIENyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXMgbmVjZXNzYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBEaXJlY3RvcnkgdG8gYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24gZmFpbGVkLgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGlyZWN0b3J5KFN0cmluZyBmaWxlKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLAotCQkJUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQXNzdXJlIHRoYXQgYSBkaXJlY3RvcnkgZXhpc3RzLiAKLQkgKiA8cD4KLQkgKiBXb3JrcyBsaWtlIHtAbGluayAjY3JlYXRlRGlyZWN0b3J5KFN0cmluZyl9LCBidXQgbWF5IGJlIG1vcmUgZWZmaWNpZW50LgotCSAqIAotCSAqIEBwYXJhbSBkaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIERpcmVjdG9yeSB0aGF0IG11c3QgYmUgZ3VhcmFudGVlZCB0byBleGlzdAotCSAqIEB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFzc3VyZURpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KQotCQkJdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwKLQkJCUNhbmNlbEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFF1ZXJ5IGlmIHRoZSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3Rvcnkgb24gdGhlIHJlbW90ZSBob3N0LgotCSAqIAotCSAqIEBwYXJhbSBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0RpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KQotCQkJdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwKLQkJCUNhbmNlbEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGhhc0ZpbGUoU3RyaW5nIGRpcmVjdG9yeSkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLQkJCVJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGNhbldyaXRlKFN0cmluZyByZW1vdGVQYXRoKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWFkKFN0cmluZyByZW1vdGVQYXRoKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKFN0cmluZyByZW1vdGVQYXRoKQotCQkJdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTGlzdCBhbGwgaXRlbXMgZnJvbSBhIGdpdmVuIHBhdGggb24gdGhlIHJlbW90ZSBob3N0LiAKLQkgKiBJZiB0aGUgaXRlbSBpcyBhIGRpcmVjdG9yeSwgaXQgd2lsbAotCSAqIGxpc3QgYWxsIGl0cyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIElmIHRoZSBpdGVtIGlzIGEgZmlsZSwgb25seSBsaXN0IAotCSAqIGl0c2VsZi4KLQkgKiBUaGUgcmVzdWx0IGlzIGFuIGFycmF5IG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSB0aGUgcHJvcHJldGllcyBvZgotCSAqIHRoZSBpdGVtcy4gVGhlIHByb3BlcnRpZXMgZGlmZmVyIGFjY29yZGluZyB0byB0aGUgbmF0dXJlIG9mIHRoZSBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSByZW1vdGUgcGF0aAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgaXRlbXMgb2YgdGhlIHJlbW90ZSBwYXRoLiBJZiB0aGUgaXRlbSBpcyBhIGRpcmVjdG9yeQotCSAqIGFuZCBpdCBpcyBlbXB0eSwgdGhlbiB0aGUgYXJyYXkgaXMgZW1wdHkuCi0JICogQHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgcGF0aCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcmVtb3RlIGhvc3QKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUmVtb3RlSXRlbVtdIGxpc3RJdGVtcyhTdHJpbmcgcmVtb3RlUGF0aCkKLQkJCXRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sCi0JCQlDYW5jZWxFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBRdWVyeSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBpdGVtIG9uIHRoZSByZW1vdGUgaG9zdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGEgZmlsZQotCSAqIEByZXR1cm4gQSB7QGxpbmsgSVJlbW90ZUZpbGV9IG9iamVjdAotCSAqIEB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIHBhdGggZG9lcyBub3QgZXhpc3Qgb24gdGhlIHJlbW90ZSBob3N0IG9yIGlzIG5vdCBhIGZpbGUuCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBDYW5jZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVJlbW90ZUl0ZW0gZ2V0SXRlbShTdHJpbmcgcGF0aCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sCi0JUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcXVlcnkgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gZmlsZSBvbiB0aGUgcmVtb3RlCi0JICogaG9zdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gYSBmaWxlCi0JICogQHJldHVybiBBIHtAbGluayBJUmVtb3RlRmlsZX0gb2JqZWN0Ci0JICogQHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgcGF0aCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcmVtb3RlIGhvc3Qgb3IgaXMgbm90IGEgZmlsZS4KLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBJUmVtb3RlRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlUGF0aCkKLQkJCXRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLAotCQkJQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcXVlcnkgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG9uIHRoZQotCSAqIHJlbW90ZSBob3N0LgotCSAqIAotCSAqIEBwYXJhbSBkaXJlY3RvcnlQYXRoCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5Ci0JICogQHJldHVybiBBIHtAbGluayBJUmVtb3RlRGlyZWN0b3J5fSBvYmplY3QKLQkgKiBAdGhyb3dzIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBwYXRoIGRvZXMgbm90IGV4aXN0IG9uIHRoZSByZW1vdGUgaG9zdCBvciBpcyBub3QgYSBmaWxlLgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICogQHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gCi0JICovCi0JcHVibGljIElSZW1vdGVEaXJlY3RvcnkgZ2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnlQYXRoKQotCQkJdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sCi0JCQlDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgSVJlbW90ZUZpbGVFbnVtZXJhdGlvbiBjcmVhdGVGaWxlRW51bWVyYXRpb24oU3RyaW5nIHBhdGgpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQlwdWJsaWMgSVJlbW90ZUZpbGVFbnVtZXJhdGlvbiBjcmVhdGVSZWN1cnNpdmVGaWxlRW51bWVyYXRpb24oU3RyaW5nIHBhdGgpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlSXRlbS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjMzBkNTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGFyZG0KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZUl0ZW0gewotCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCk7Ci0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYSBwZXJtaXNzaW9uIHRoYXQgYWxsb3dzIHRvIHJlYWQgdGhpcwotCSAqIGl0ZW0uIFNldmVyYWwgcGVybWlzc2lvbnMgYXJlIGNvbnNpZGVyZWQgKHVzZXIsIGdyb3VwLCBvdGhlcnMpIHRvCi0JICogY2FsY3VsYXRlIGRlIGVmZmVjdGl2ZSBwZXJtaXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZS9mYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKTsKLQlwdWJsaWMgdm9pZCBzZXRSZWFkYWJsZShib29sZWFuIGZsYWcpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVtb3RlIGl0ZW0gaGFzIGEgcGVybWlzc2lvbiB0aGF0IGFsbG93cyB0byB3cml0ZQotCSAqIHRoaXMgaXRlbS4gU2V2ZXJhbCBwZXJtaXNzaW9ucyBhcmUgY29uc2lkZXJlZCAodXNlciwgZ3JvdXAsIG90aGVycykgdG8KLQkgKiBjYWxjdWxhdGUgZGUgZWZmZWN0aXZlIHBlcm1pc3Npb24uCi0JICogCi0JICogQHJldHVybiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKTsKLQlwdWJsaWMgdm9pZCBzZXRXcml0ZWFibGUoYm9vbGVhbiBmbGFnKTsKLQkKLS8vCXB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZSgpOwotLy8JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKGxvbmcgdGltZSk7Ci0KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShsb25nIHRpbWUpOwotCi0JcHVibGljIGxvbmcgZ2V0QWNjZXNzVGltZSgpOwotLy8JcHVibGljIHZvaWQgc2V0QWNjZXNzVGltZShsb25nIHRpbWUpOwotCi0vLwlwdWJsaWMgU3RyaW5nIGdldFVzZXJJZCgpOwotLy8JcHVibGljIFN0cmluZyBzZXRVc2VySWQoKTsKLS8vCQotLy8JcHVibGljIFN0cmluZyBnZXRHcm91cElkKCk7Ci0vLwlwdWJsaWMgU3RyaW5nIHNldEdyb3VwSWQoKTsKLQkKLQkvKioKLQkgKiBGZXRjaCBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaXRlbSBvbiByZW1vdGUgaG9zdC4KLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQXR0cmlidXRlcygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBBcHBseSBhbGwgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGl0ZW0gb24gcmVtb3RlIGhvc3QuCi0JICogRm9yIGVmZmljaWVuY3ksIG9ubHkgY2hhbmdlZCBhdHRyaWJ1dGVzIG1heSBiZSB3cml0dGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1pdEF0dHJpYnV0ZXMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0JCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZU9wZXJhdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmNjNGRmNi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uQ2FuY2VsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgY29tbW9uIGludGVyZmFjZSB0byBhbGwgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBleGVjdXRlZCBvbiB0aGUgcmVtb3RlIGhvc3QgYW5kIHRoYXQKLSAqIG1heSByZXF1aXJlIHRpbWUgdG8gZmluaXNoLgotICogPHA+Ci0gKiBBbGxvd3MgdG8gYmxvY2sgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBvcGVyYXRpb24gZmluaXNoZXMgb24gdGhlIHJlbW90ZSBob3N0LgotICogQWxsb3dzIHRvIGNhbmNlbCB0aGUgb3BlcmF0aW9uIG9uIHRoZSByZW1vdGUgaG9zdCAobm90IGFsbCBvcGVyYXRpb24gbWF5IGltcGxlbWVudCB0aGlzKS4KLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwsIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIDxiPlJldmlldyBPSy48L2I+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZU9wZXJhdGlvbgotewkKLQkvKioKLQkgKiBXYWl0IHVudGlsIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQgb3IgdW50aWwKLQkgKiBDYW5jZWxlZCBieSBhbm90aGVyIHRocmVhZC4KLQkgKiBpZiBjYW5jZWxlZCwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb24gd2lsbCBwcm9iYWJseSBiZSB1bmRlZmluZWQuCi0JICogCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24gZmFpbGVkLgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIHNjcmlwdCBleGVjdXRpb24gd2FzIGNhbmNlbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRGb3JFbmRPZkV4ZWN1dGlvbigpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgYmVjYXVzZSBpdCB3YXMgY2FuY2VsZWQuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXN0IG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FzQ2FuY2VsZWQoKTsKLQotCS8qKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB2ZXJpZnkgaWYgdGhlIG9wZXJhdGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QgZGlkIGFscmVhZHkgZmluaXNoIG9yIG5vdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBmaW5pc2hlZCBleGVjdXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FzRmluaXNoZWQoKTsKLQkKLQkvKioKLQkgKiBDYW5jZWwgdGhlIG9wZXJhdGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICovCi0JcHVibGljIHZvaWQgY2FuY2VsKCk7Ci0KLQotCS8qKgotCSAqIEZyZWUgYWxsb2NhdGVkIHJlc291cmNlcyBmb3IgdGhlIGV4ZWN1dGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVhbmluZyBvZiB0aGUgZXhpdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZpbmlzaFN0YXR1cygpOwotCQotCS8qKgotCSAqIEdldCBhIHRleHQgdGhhdCBkZXNjcmliZXMgdGhlIGZpbmlzaCBzdGF0dXMgY29kZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmlzaFN0YXR1c1RleHQoaW50IHN0YXR1cyk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdGlvbihpbnQgc3RhdHVzKTsKLQlwdWJsaWMgYm9vbGVhbiBpc09LKGludCBzdGF0dXMpOwotCXB1YmxpYyBib29sZWFuIGlzRXhlY3V0YWJsZUVycm9yKGludCBzdGF0dXMpOwotCQotCXB1YmxpYyBib29sZWFuIHdhc0V4Y2VwdGlvbigpOwotCXB1YmxpYyBib29sZWFuIHdhc09LKCk7Ci0JcHVibGljIGJvb2xlYW4gd2FzQ29tbWFuZEVycm9yKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlUGF0aFRvb2xzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVBhdGhUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzliZjRmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlUGF0aFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVQYXRoVG9vbHMgewotCi0JcHVibGljIFN0cmluZyByb290UGF0aCgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNSb290KFN0cmluZyBwYXRoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIHBhdGgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZShTdHJpbmcgcGF0aCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYXZlKFN0cmluZyBwYXRoKTsKLQotCXB1YmxpYyBTdHJpbmcgbGVhdmUoU3RyaW5nIHBhdGgpOwotCi0JcHVibGljIFN0cmluZyBjYW5vbmljYWxpemUoU3RyaW5nIHBhdGgpOwotCi0JcHVibGljIFN0cmluZyBqb2luKFN0cmluZyBiYXNlLCBTdHJpbmcgcGF0aCk7Ci0KLQlwdWJsaWMgU3RyaW5nIHBhcmVudChTdHJpbmcgcGF0aCk7Ci0JCi0JcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgcGF0aCwgYm9vbGVhbiBmdWxsKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVQb3J0Rm9yd2FyZGluZy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVQb3J0Rm9yd2FyZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJjOGVhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlUG9ydEZvcndhcmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgY3JlYXRlZCBieSB7QGxpbmsgSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHN9LgotICogPHA+Ci0gKiBUaGUgcmVtb3RlIHBvcnQgaXMgZm9yd2FyZGVkIHRvIGEgaG9zdDpwb3J0IGFjY2Vzc2libHkgdG8gdGhlIGxvY2FsIGhvc3QuCi0gKiA8cD4KLSAqIENoZWNrIGluaGVyaXRlZCB7QGxpbmsgSVBvcnRGb3J3YXJkaW5nfSBmb3IgbW9yZSBtZXRob2RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVQb3J0Rm9yd2FyZGluZyBleHRlbmRzIElQb3J0Rm9yd2FyZGluZyB7Ci0JLyoqIFRoZSBwb3J0IG9uIHRoZSBob3N0IHdoZXJlIHRoZSByZW1vdGUgcG9ydCBpcyBmb3J3YXJkZWQgdG8uICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRMb2NhbFBvcnQoKTsKLQotCS8qKiBUaGUgaG9zdCB3aGVyZSB0aGUgcmVtb3RlIHBvcnQgaXMgZm9yd2FyZGVkIHRvLiAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TG9jYWxBZGRyZXNzKCk7Ci0KLQkvKiogVGhlIHJlbW90ZSBwb3J0IHRoYXQgaXMgYmVpbmcgZm9yd2FyZGVkLiAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UmVtb3RlUG9ydCgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZjliOS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzIHsKLQlwdWJsaWMgSVJlbW90ZVBvcnRGb3J3YXJkaW5nIGZvcndhcmRSZW1vdGVQb3J0KGludCByZW1vdGVQb3J0LCBpbnQgbG9jYWxQb3J0KSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQlwdWJsaWMgSVJlbW90ZVBvcnRGb3J3YXJkaW5nIGZvcndhcmRSZW1vdGVQb3J0KGludCByZW1vdGVQb3J0LCBTdHJpbmcgbG9jYWxBZGRyZXNzLCBpbnQgbG9jYWxQb3J0KSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQotLy8JcHVibGljIExvY2FsUG9ydEZvcndhcmRpbmcgZm9yd2FyZExvY2FsUG9ydChpbnQgbG9jYWxQb3J0LCBpbnQgcmVtb3RlUG9ydCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0vLwlwdWJsaWMgTG9jYWxQb3J0Rm9yd2FyZGluZyBmb3J3YXJkTG9jYWxQb3J0KGludCBsb2NhbFBvcnQsIFN0cmluZyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRm9yd2FyZGluZyhJUG9ydEZvcndhcmRpbmcgZm9yd2FkaW5nKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUG9ydEZvcndhcmRpbmdFeGNlcHRpb247Ci0JCi0JcHVibGljIElSZW1vdGVQb3J0Rm9yd2FyZGluZyBnZXRSZW1vdGVQb3J0Rm9yd2FyZGluZyhpbnQgcmVtb3RlUG9ydCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uOwotLy8JcHVibGljIExvY2FsUG9ydEZvcndhcmRpbmcgZ2V0TG9jYWxQb3J0Rm9yd2FyZGluZyhpbnQgbG9jYWxQb3J0KTsKLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlU2NyaXB0LmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVNjcmlwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjg3OWY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlU2NyaXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBCZWFuIHRoYXQgaG9sZHMgY29uZmlndXJhdGlvbiBmb3IgYSBzY3JpcHQgdGhhdCBpcyB0byBydW4gcmVtb3RlbHkuCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsLCBEYW5pZWwgRmVyYmVyCi0gKiBAc2luY2UgMS4xCi0gKiA8Yj5SZXZpZXcgT0s8L2I+LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVTY3JpcHQKLXsKLQkvKioKLQkgKiBBZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYmUgdXNlZCBieSB0aGUgc2NyaXB0Li4KLQkgKiBAcGFyYW0gdmFyaWFibGUgVmFyaWFibGUgbmFtZSBhbmQgdmFsdWUsIGluZm9ybWVkIGFzIHN0cmluZyBsaWtlICJ2YXJpYWJsZT12YWx1ZSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnZpcm9ubWVudChTdHJpbmcgdmFyaWFibGUpOwotCXB1YmxpYyB2b2lkIGFkZEVudmlyb25tZW50KFN0cmluZ1tdIGVudmlyb25tZW50KTsKLQkKLQkvKioKLQkgKiBTZXQgcHJvY2VzcyBpbnB1dCBzdHJlYW0uIFByb2Nlc3Mgc3RkaW4gd2lsbCByZWFkIGZyb20gdGhpcyBzdHJlYW0uCi0JICogPHA+Ci0JICogSWYgbm90IHNldCwgb3IgaWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSByZW1vdGUgZXhlY3V0aW9uCi0JICogd2lsbCBjcmVhdGUgYW4gb3V0cHV0c3RyZWFtIHdoZXJlIG9uZSBtYXkgd3JpdGUgZGF0YSB0byB0aGUgcHJvY2VzcyBzdGRpbi4KLQkgKiAoc2VlIHtAbGluayBJUmVtb3RlRXhlY3V0aW9uLmdldE91dHB1dFN0cmVhbVRvUHJvY2Vzc0lucHV0U3RyZWFtKCkpLgotCSAqIEBwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gb3IgbnVsbCB0byBydW4gd2l0aG91dCBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXQpOwotCi0JLyoqCi0JICogU2V0IHByb2Nlc3Mgb3V0cHV0IHN0cmVhbS4gUHJvY2VzcyBzdGRvdXQgd2lsbCB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiBJZiBub3Qgc2V0LCBvciBpZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIHJlbW90ZSBleGVjdXRpb24KLQkgKiB3aWxsIGNyZWF0ZSBhbiBpbnB1dHN0cmVhbSB3aGVyZSBvbmUgbWF5IHJlYWQgZGF0YSB0aGF0IHRoZSBwcm9jZXNzIGhhcwotCSAqIHdyaXR0ZW4gdG8gc3Rkb3V0LgotCSAqIChzZWUge0BsaW5rIElSZW1vdGVFeGVjdXRpb24uZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc091dHB1dFN0cmVhbSgpKS4KLQkgKiBAcGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIG9yIG51bGwgdG8gcnVuIHdpdGhvdXQgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc091dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0KTsKLQotCS8qKgotCSAqIFNldCBwcm9jZXNzIGVycm9yIHN0cmVhbS4gUHJvY2VzcyBzdGRvdXQgd2lsbCB3cml0ZSB0byB0aGlzIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiBJZiBub3Qgc2V0LCBvciBpZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIHJlbW90ZSBleGVjdXRpb24KLQkgKiB3aWxsIGNyZWF0ZSBhbiBpbnB1dHN0cmVhbSB3aGVyZSBvbmUgbWF5IHJlYWQgZGF0YSB0aGF0IHRoZSBwcm9jZXNzIGhhcwotCSAqIHdyaXR0ZW4gdG8gc3RkZXJyLgotCSAqIChzZWUge0BsaW5rIElSZW1vdGVFeGVjdXRpb24uZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc0Vycm9yU3RyZWFtKCkpLgotCSAqIEBwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gb3IgbnVsbCB0byBydW4gd2l0aG91dCBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dCk7Ci0KLQkvKioKLQkgKiBTZXQgaWYgWDExIG9mIHRoZSBzY3JpcHQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbG9jYWwgaG9zdC4KLQkgKiBAcGFyYW0gd2lsbEZvcndhcmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3J3YXJkWDExKGJvb2xlYW4gd2lsbEZvcndhcmQpOwotCQotCS8qKgotCSAqIFNldCBhIHNpbmdsZSBiYXNoIGNvbW1hbmQgdGhhdCB3aWxsIGJlIHJ1biBhcyBzY3JpcHQuCi0JICogQHBhcmFtIHNjcmlwdCBBIGJhc2ggc2NyaXB0IGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBzY3JpcHQpOwotCQotCS8qKgotCSAqIFNldCBhIGJhc2ggc2NyaXB0IChsaXN0IG9mIHNlcXVlbnRpYWwgY29tbWFuZHMpIHRvIGJlIHJ1bi4KLQkgKiBUaGUgc2NyaXB0IG1heSBjb250YWluIHdoaWxlL2Zvci9pZi9zd2l0Y2ggY29uc3RydWN0aW9uLgotCSAqIEBwYXJhbSBzY3JpcHQgQW4gYXJyYXkgb2YgYmFzaCBzY3JpcHQgbGluZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBbXSBzY3JpcHQpOwotCQotCXB1YmxpYyB2b2lkIHNldEZldGNoUHJvY2Vzc091dHB1dFN0cmVhbShib29sZWFuIGZsYWcpOwotCXB1YmxpYyB2b2lkIHNldEZldGNoUHJvY2Vzc0Vycm9yU3RyZWFtKGJvb2xlYW4gZmxhZyk7Ci0JcHVibGljIHZvaWQgc2V0RmV0Y2hQcm9jZXNzSW5wdXRTdHJlYW0oYm9vbGVhbiBmbGFnKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0ZVRlcm1pbmFsKGJvb2xlYW4gZmxhZyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlU2NyaXB0RXhlY3V0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVNjcmlwdEV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGIyZDY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlU2NyaXB0RXhlY3V0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZVNjcmlwdEV4ZWN1dGlvbiBleHRlbmRzIElSZW1vdGVPcGVyYXRpb24KLXsJCi0JLyoqCi0JICogUHJvY2VzcyByZXR1cm4gZXhpdCBzdGF0dXMuCi0JICovCi0JcHVibGljIGludCBnZXRSZXR1cm5Db2RlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBpbnB1dCBzdHJlYW0gKHVzZXIncyBwZXJzcGVjdGl2ZSkKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqIAotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbUZyb21Qcm9jZXNzT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEdldCB0aGUgaW5wdXQgc3RyZWFtICh1c2VyJ3MgcGVyc3BlY3RpdmUpCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc0Vycm9yU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0IHRoZSBvdXRwdXQgc3RyZWFtICh1c2VyJ3MgcGVyc3BlY3RpdmUpCi0JICogCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Ub1Byb2Nlc3NJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBGcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIHRoZSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlU3RhdHVzVG9vbHMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlU3RhdHVzVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ4N2Y5Yi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVN0YXR1c1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gc2V2ZXJhbCBzdGF0dXMgZm9yIHRoZSBIb3N0IGFuZCBSZW1vdGUgbWFjaGluZXMKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVtb3RlU3RhdHVzVG9vbHMgewotCS8qKgotCSAqIFZlcmlmaWVzIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGJlaW5nIHVzZWQgaW4gdGhlIHJlbW90ZSBob3N0LgotCSAqIAotCSAqIEBwYXJhbSBhZGRyIEFkZHJlc3MgdGhhdCB3aWxsIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYmVpbmcgdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotLy8JIFRPRE86IENyZWF0ZSB0aGlzIG1ldGhvZAotCS8vcHVibGljIGJvb2xlYW4gY2hlY2tSZW1vdGVBZGRyZXNzVXNlKEluZXRBZGRyZXNzIGFkZHIpOwotCQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIHRoZSBnaXZlbiBtYWMgYWRkcmVzcyBpcyBiZWluZyB1c2VkIGluIHRoZSByZW1vdGUgaG9zdC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFjQWRkciBNYWMgYWRkcmVzcyB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBtYWMgYWRkcmVzcyBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQkvLyBUT0RPOiBDcmVhdGUgdGhpcyBtZXRob2QKLQkvL3B1YmxpYyBib29sZWFuIGNoZWNrUmVtb3RlTWFjQWRkcmVzc1VzZShNYWNBZGRyZXNzIG1hY0FkZHIpOwotCQotCS8qKgotCSAqIFRDUCBwcm90b2NvbCBpZGVudGlmaWNhdGlvbiBjb25zdGFudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPX1RDUCA9IDA7Ci0JLyoqCi0JICogVURQIHByb3RvY29sIGlkZW50aWZpY2F0aW9uIGNvbnN0YW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9fVURQID0gMTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgQGxpbmt7U2V0fSBjb250YWluaW5nIGFsbG9jJ2VkIHBvcnQgbnVtYmVycyBmb3IgdGhlIGdpdmVuCi0JICogcHJvdG9jb2wuCi0JICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHRoYXQgaG9zdHMgd2hpY2ggc3VwcG9ydCBib3RoIGlwdjQgYW5kIGlwdjYgCi0JICogaGFzIGEgc2luZ2xlIHN0YWNrIHRvIGhhbmRsZSBib3RoIHByb3RvY29scy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdG9jb2wgVHJhbnNwb3J0IHByb3RvY29sIHdoZXJlIHRoZSBsaXN0IG9mIGFsbG9jJ2VkIHBvcnRzIHdpbGwgY29tZSBmcm9tIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcG9ydCBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gCi0JICogQHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gCi0JICogQHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gCi0JICogQHRocm93cyBDYW5jZWxFeGNlcHRpb24gCi0JICovCi0JcHVibGljIFNldCBnZXRSZW1vdGVQb3J0c0luVXNlKGludCBwcm90b2NvbCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciB3aG8gbG9nZ2VkIGludG8gdGhlIHN5c3RlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSB1c2VybmFtZS4KLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgaWQgb2YgdGhlIHVzZXIgd2hvIGxvZ2dlZCBpbnRvIHRoZSBzeXN0ZW0uCi0JICogCi0JICogQHJldHVybiBpbnQgY29udGFpbmluZyB0aGUgdXNlciBpZAotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uIAotCSAqIEB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIAotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzZXJJRCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSB7QGxpbmsgU2V0fSBvZiBncm91cCBpZHMgZm9yIHdoaWNoIHRoZSB1c2VyIGJlbG9uZ3MKLQkgKiAgCi0JICogQHJldHVybiBTZXQgY29udGFpbmluZyB0aGUgZ3JvdXAgaWRzIChzdG9yZWQgYXMgSW50ZWdlcikKLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gCi0JICovCi0JcHVibGljIFNldCBnZXRHcm91cElEU2V0KCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCQotCXB1YmxpYyBsb25nIGdldFRpbWUoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247Ci0JLyoKLQkgKiBUT0RPOiBUbyB0aGUgbmV4dCB2ZXJzaW9uLCBhZGQgc29tZSBtZXRob2RzIHRvIGV4dHJhY3QgY3B1IGluZm8sIG1lbW9yeSBzaXplLCBkaXNrIHNpemUuLi4KLQkgKiAKLQkgKiAKLQkgKi8KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlVHVubmVsLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVR1bm5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTgyN2E0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9JUmVtb3RlVHVubmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVUdW5uZWwgewotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVVwbG9hZEV4ZWN1dGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0lSZW1vdGVVcGxvYWRFeGVjdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzMyZDdlMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvSVJlbW90ZVVwbG9hZEV4ZWN1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZVVwbG9hZEV4ZWN1dGlvbiBleHRlbmRzIElSZW1vdGVPcGVyYXRpb24gewotCS8qKgotCSAqIFByb2Nlc3MgcmV0dXJuIGV4aXQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmV0dXJuQ29kZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgb3V0cHV0IHN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgcmVtb3RlIGZpbGUuCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Ub1Byb2Nlc3NSZW1vdGVGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvS2V5QXV0aFRva2VuLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvS2V5QXV0aFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1ZDI5NjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL0tleUF1dGhUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgS2V5QXV0aFRva2VuIGV4dGVuZHMgQXV0aFRva2VuIHsKLQlwcml2YXRlIFN0cmluZyBwYXNzcGhyYXNlOwotCXByaXZhdGUgRmlsZSBrZXlQYXRoOwotCi0JcHVibGljIEtleUF1dGhUb2tlbihTdHJpbmcgdXNlcm5hbWUsIEZpbGUga2V5UGF0aCwgU3RyaW5nIHBhc3NwaHJhc2UpIHsKLQkJc3VwZXIodXNlcm5hbWUpOwotCQl0aGlzLnBhc3NwaHJhc2UgPSBwYXNzcGhyYXNlOwotCQl0aGlzLmtleVBhdGggPSBrZXlQYXRoOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhc3NwaHJhc2UoKSB7Ci0JCXJldHVybiBwYXNzcGhyYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhc3NwaHJhc2UoU3RyaW5nIHBhc3NwaHJhc2UpIHsKLQkJdGhpcy5wYXNzcGhyYXNlID0gcGFzc3BocmFzZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRLZXlQYXRoKCkgewotCQlyZXR1cm4ga2V5UGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXlQYXRoKEZpbGUga2V5UGF0aCkgewotCQl0aGlzLmtleVBhdGggPSBrZXlQYXRoOwotCX0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9QYXNzd2RBdXRoVG9rZW4uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9QYXNzd2RBdXRoVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWVmZjBmNy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2NvcmUvUGFzc3dkQXV0aFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXNzd2RBdXRoVG9rZW4gZXh0ZW5kcyBBdXRoVG9rZW4gewotCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotCQotCXB1YmxpYyBQYXNzd2RBdXRoVG9rZW4oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLQkJc3VwZXIodXNlcm5hbWUpOwotCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHBhc3N3b3JkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewotCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVByb2Nlc3MuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvY29yZS9SZW1vdGVQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNzI3YmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9jb3JlL1JlbW90ZVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbW90ZVByb2Nlc3MgZXh0ZW5kcyBQcm9jZXNzIHsKLQlwdWJsaWMgYWJzdHJhY3QgSVJlbW90ZVNjcmlwdEV4ZWN1dGlvbiBnZXRSZW1vdGVFeGVjdXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL0NhbmNlbEV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vQ2FuY2VsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyMTY5ODIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vQ2FuY2VsRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDYW5jZWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2V4Y2VwdGlvbi9Mb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vTG9jYWxQb3J0Qm91bmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhkNzEwNy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2V4Y2VwdGlvbi9Mb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uOwotCi0vKioKLSAqIFNwZWNpZmljIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB0aGF0IGFyaXNlcyB3aGVuIGNyZWF0aW5nIGEgdHVubmVsIAotICogdGhhdCBiaW5kcyB0byBhIGxvY2FsIHBvcnQgdGhhdCBpcyBhbHJlYWR5IGFsbG9jJ2VkLgotICogCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxQb3J0Qm91bmRFeGNlcHRpb24gZXh0ZW5kcyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU0OTcxMzcyOTgzMzI3MTk0ODVMOwotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTG9jYWxQb3J0Qm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTG9jYWxQb3J0Qm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2V4Y2VwdGlvbi9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOGQyNGEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCi0JCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUG9ydEZvcndhcmRpbmdFeGNlcHRpb24uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL1BvcnRGb3J3YXJkaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODZlZTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUG9ydEZvcndhcmRpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24gZXh0ZW5kcyBSZW1vdGVFeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDU1ODU4OTg5MjA2Njc3MTY1TDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEVfUE9SVF9BTFJFQURZX0ZPUldBUkRFRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFX0ZPUldBUkRJTkdfRkFJTEVEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BBUkFNRVRFUlMgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9URV9GT1JXQVJESU5HX05PVF9BVElWRSA9IDQ7Ci0KLQlpbnQgY29kZTsKLQkKLQlwdWJsaWMgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24oaW50IGNvZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0JCi0JcHVibGljIFBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uKGludCBjb2RlLCBUaHJvd2FibGUgZSkgewotCQlzdXBlcihlKTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJY2FzZSBSRU1PVEVfUE9SVF9BTFJFQURZX0ZPUldBUkRFRDoKLQkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIlBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uLlJFTU9URV9QT1JUX0FMUkVBRFlfRk9SV0FSREVEIik7IC8vJE5PTi1OTFMtMSQKLQkJY2FzZSBSRU1PVEVfRk9SV0FSRElOR19GQUlMRUQ6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfRk9SV0FSRElOR19GQUlMRUQiKTsgLy8kTk9OLU5MUy0xJAotCQljYXNlIElOVkFMSURfUEFSQU1FVEVSUzoKLQkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIlBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uLklOVkFMSURfUEFSQU1FVEVSUyIpOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgUkVNT1RFX0ZPUldBUkRJTkdfTk9UX0FUSVZFOgotCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiUG9ydEZvcndhcmRpbmdFeGNlcHRpb24uUkVNT1RFX0ZPUldBUkRJTkdfTk9UX0FUSVZFIik7IC8vJE5PTi1OTFMtMSQJCQkKLQkJZGVmYXVsdDoKLQkJCWFzc2VydCBmYWxzZTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTQ5NTg5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL1JlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUmVtb3RlRXhjZXB0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCWludCBlcnJvckNvZGUgPSBVTktOT1dOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPU1RfQ09OTkVDVElPTiA9IDE7Ci0JCi0JcHVibGljIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihpbnQgZXJyb3JDb2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb2RlKCkgewotCQlyZXR1cm4gZXJyb3JDb2RlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0JfQotCQotLy8JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotLy8JCVN0cmluZyByZXN1bHQgPSAiIjsKLS8vCQlzd2l0Y2ggKGVycm9yQ29kZSkgewotLy8JCWNhc2UgTE9TVF9DT05ORUNUSU9OOgotLy8JCQlyZXN1bHQgPSAiQ29ubmVjdGlvbiB0byByZW1vdGUgaG9zdCB3YXMgbG9zdCI7Ci0vLwkJCWJyZWFrOwotLy8JCWRlZmF1bHQ6Ci0vLwkJCXJlc3VsdCA9IE5MUy5iaW5kKCJVbmtub3duIGNvbm5lY3Rpb24gZXJyb3IsIGNvZGUgezB9IiwgSW50ZWdlci50b1N0cmluZyhlcnJvckNvZGUpKTsKLS8vCQkJYnJlYWs7Ci0vLwkJfQotLy8JCWlmIChzdXBlci5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotLy8JCQlOTFMuYmluZCgiezB9ICh7MX0pIiwgbmV3IE9iamVjdCBbXSB7IHJlc3VsdCwgc3VwZXIuZ2V0TWVzc2FnZSgpfSk7Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL1JlbW90ZUV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUmVtb3RlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkYTE2YmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUmVtb3RlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb247Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBSZW1vdGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQotCXB1YmxpYyBSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBSZW1vdGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBSZW1vdGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBSZW1vdGVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2V4Y2VwdGlvbi9SZW1vdGVFeGVjdXRpb25FeGNlcHRpb24uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL1JlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzk2ODliLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL1JlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBSZW1vdGVFeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVzdWx0bWVzc2FnZTsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9ybWVzc2FnZTsKLQotCXByaXZhdGUgaW50IGV4aXRDb2RlOwotCi0JcHVibGljIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0JCXN1cGVyKHN0cmluZyk7Ci0JfQotCi0JcHVibGljIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzdHJpbmcsIGUpOwotCX0KLQotCXB1YmxpYyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JcHVibGljIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgaW50IGV4aXRjb2RlLCBTdHJpbmcgcmVzdWx0bWVzc2FnZSwgU3RyaW5nIGVycm9ybWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQkJaWYgKHJlc3VsdG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJlc3VsdG1lc3NhZ2UgPSBudWxsOwotCQlpZiAoZXJyb3JtZXNzYWdlLmxlbmd0aCgpID09IDApCi0JCQllcnJvcm1lc3NhZ2UgPSBudWxsOwotCQl0aGlzLnJlc3VsdG1lc3NhZ2UgPSByZXN1bHRtZXNzYWdlOwotCQl0aGlzLmVycm9ybWVzc2FnZSA9IGVycm9ybWVzc2FnZTsKLQkJdGhpcy5leGl0Q29kZSA9IGV4aXRjb2RlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIHJlc3VsdG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmIChlcnJvcm1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLkdldEVycm9yTWVzc2FnZV9Ob0Vycm9ySW5mb0F2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZXJyb3JtZXNzYWdlOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRFeGl0Q29kZSgpIHsKLQkJcmV0dXJuIGV4aXRDb2RlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChleGl0Q29kZSAhPSAwKSB7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSgpICsgIlxuIiArIE1lc3NhZ2VzLmdldFN0cmluZygiUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLlRvU3RyaW5nX0V4aXRDb2RlIikgKyBleGl0Q29kZSArIChyZXN1bHRtZXNzYWdlICE9IG51bGwgPyAiXG4iICsgcmVzdWx0bWVzc2FnZSA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCSsgKGVycm9ybWVzc2FnZSAhPSBudWxsID8gIlxuIiArIGVycm9ybWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL1JlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhNGRjZmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb247Ci0KLS8qKgotICogRGVzY3JpYmVzIHJlbW90ZSBvcGVyYXRpb25zIGVycm9ycy4gVGhpcyBkbyBub3QgaW5jbHVkZSBlcnJvcnMgZ2VuZXJhdGVkIGJ5IGEKLSAqIHVzZXItZ2VuZXJhdGVkIHJlbW90ZSBjb21tYW5kIHRoYXQgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZXhjZXB0aW9uL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlMjk0MjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9leGNlcHRpb24vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbi5HZXRFcnJvck1lc3NhZ2VfTm9FcnJvckluZm9BdmFpbGFibGU9bm8gZXJyb3IgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi1SZW1vdGVFeGVjdXRpb25FeGNlcHRpb24uVG9TdHJpbmdfRXhpdENvZGU9RXhpdCBjb2RlOiAKLQotUG9ydEZvcndhcmRpbmdFeGNlcHRpb24uUkVNT1RFX1BPUlRfQUxSRUFEWV9GT1JXQVJERUQ9UmVtb3RlIHBvcnQgaXMgYWxyZWFkeSBmb3J3YXJkZWQgb24gcmVtb3RlIGhvc3QuCi1Qb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfRk9SV0FSRElOR19GQUlMRUQ9RmFpbGVkIHRvIGNyZWF0ZSBwb3J0IGZvcndhcmRpbmcgb24gcmVtb3RlIGhvc3QuCi1Qb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5JTlZBTElEX1BBUkFNRVRFUlM9SW52YWxpZCBwYXJhbWV0ZXJzIGZvciBwb3J0IGZvcndhcmRpbmcuCi1Qb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfRk9SV0FSRElOR19OT1RfQVRJVkU9RmFpbGVkIHRvIHJlbGVhc2UgcmVtb3RlIHBvcnQgZm9yd2FyZGluZyBzaW5jZSBpdCBpcyBub3QgYWN0aXZlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0UmVtb3RlRXhlY3V0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdFJlbW90ZUV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzYxZTk0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0UmVtb3RlRXhlY3V0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaC5FeGVjdXRpb25NYW5hZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW1vdGVFeGVjdXRpb24gaW1wbGVtZW50cyBJUmVtb3RlT3BlcmF0aW9uIHsKLQkvKioKLQkgKiBUaGUgZXhlY3V0aW9uIG1hbmFnZXIgdGhhdCBjcmVhdGVkIHRoZSBleGVjdXRpb24uCi0JICovCi0JcHJpdmF0ZSBFeGVjdXRpb25NYW5hZ2VyIGV4ZWN1dGlvbk1hbmFnZXI7Ci0JLyoqCi0JICogVGhlIGV4ZWN1dGlvbiB3YXMgY2FuY2VsZWQgYnkgdGhlIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsbGVkOwotCS8qKgotCSAqIFRoZSBleGVjdXRpb24gZmluaXNoZWQgYnkgaXRzZWxmLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpbmlzaGVkOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKiA8cD4KLQkgKiBJdCBpcyBwcm90ZWN0ZWQgYmVjYXVzZSBvbmx5IHRoZSBSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGNhbiBpbnN0YW50aWF0ZSBpdCBhbmQgcGFzcyBpdHNlbGYgYXMgdGhlIHBhcmFtZXRlcnMgdG8KLQkgKiB0aGUgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHJlbUV4ZWNNYW5hZ2VyCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVtb3RlRXhlY3V0aW9uKEV4ZWN1dGlvbk1hbmFnZXIgZXhlY3V0aW9uTWFuYWdlcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGlvbk1hbmFnZXIgPSBleGVjdXRpb25NYW5hZ2VyOwotCQl0aGlzLmNhbmNlbGxlZCA9IGZhbHNlOwotCQl0aGlzLmZpbmlzaGVkID0gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBFeGVjdXRpb25NYW5hZ2VyIGdldEV4ZWN1dGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBleGVjdXRpb25NYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3YXNDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIGNhbmNlbGxlZDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gd2FzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBmaW5pc2hlZDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsKCkgewotCQlub3RpZnlDYW5jZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5Q2FuY2VsKCkgewotCQkvKgotCQkgKiBCeSBkZWZhdWx0LCBubyBsb2dpYyBpcyBpbXBsZW1lbnRlZCB0byBjYW5jZWwgdGhlIGV4ZWN1dGlvbi4KLQkJICogT25seSBzZXRzIHRoZSBjYW5jZWwgZmxhZy4KLQkJICogTm90aWZpZXMgYWxsIHdhaXRpbmcgdGhyZWFkIHRoYXQgdGhlIGV4ZWN1dGlvbiB3YXMgY2FuY2VsZWQuCi0JCSAqLwotCQljYW5jZWxsZWQgPSB0cnVlOwotCQl0aGlzLm5vdGlmeUFsbCgpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlGaW5pc2goKSB7Ci0JCS8qCi0JCSAqIEJ5IGRlZmF1bHQsIG5vIGxvZ2ljIGlzIGltcGxlbWVudGVkIHRvIGZpbmlzaCB0aGUgZXhlY3V0aW9uLgotCQkgKiBOb3RpZmllcyBhbGwgd2FpdGluZyB0aHJlYWQgdGhhdCB0aGUgZXhlY3V0aW9uIGZpbmlzaGVkIGJ5IGl0c2VsZi4KLQkJICovCi0JCWZpbmlzaGVkID0gdHJ1ZTsKLQkJdGhpcy5ub3RpZnlBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd2FpdEZvckVuZE9mRXhlY3V0aW9uKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIEJsb2NrIHVudGlsIHRoZSBleGVjdXRpb24gZmluaXNoZXMgb3IgaXMgY2FuY2VsZWQuCi0JCSAqLwotCQlpZiAoIWZpbmlzaGVkICYmICFjYW5jZWxsZWQpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy53YWl0KCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmICh3YXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgQ2FuY2VsRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9jb21tb24vRGVidWcuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29tbW9uL0RlYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjODllNWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9jb21tb24vRGVidWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvbW1vbjsKLQotcHVibGljIGNsYXNzIERlYnVnIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRsbihTdHJpbmcgcykgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvcmxuKFN0cmluZyBzKSB7Ci0vLwkJU3lzdGVtLmVyci5wcmludGxuKHMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuMihTdHJpbmcgcykgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL2NvbW1vbi9SZW1vdGVTY3JpcHQuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29tbW9uL1JlbW90ZVNjcmlwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmEzMWJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29tbW9uL1JlbW90ZVNjcmlwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU2NyaXB0OwotCi0KLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklSZW1vdGVTY3JpcHQ8L2NvZGU+LgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICogPGI+UmV2aWV3IE9LPC9iPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlU2NyaXB0IGltcGxlbWVudHMgSVJlbW90ZVNjcmlwdAotewotCXByaXZhdGUgTGlzdCBlbnZpcm9ubWVudDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gd2lsbEZvcndhcmRYMTE7Ci0JCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIE91dHB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IG51bGw7Ci0JCi0JU3RyaW5nIFtdIHNjcmlwdDsKLQotCXByaXZhdGUgYm9vbGVhbiBmZXRjaFByb2Nlc3NFcnJvclN0cmVhbSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmZXRjaFByb2Nlc3NJbnB1dFN0cmVhbSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmZXRjaFByb2Nlc3NPdXRwdXRTdHJlYW0gPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWxsb2NhdGVUZXJtaW5hbCA9IGZhbHNlOwotCQotCXB1YmxpYyBSZW1vdGVTY3JpcHQoKQotCXsKLQkJZW52aXJvbm1lbnQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCW91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXdpbGxGb3J3YXJkWDExID0gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLklSZW1vdGVTY3JpcHQjYWRkRW52aXJvbm1lbnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnZpcm9ubWVudChTdHJpbmcgdmFyaWFibGUpCi0JewotCQllbnZpcm9ubWVudC5hZGQodmFyaWFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRFbnZpcm9ubWVudChTdHJpbmdbXSBlbnZpcm9ubWVudCkgewotCQl0aGlzLmVudmlyb25tZW50LmFkZEFsbChBcnJheXMuYXNMaXN0KGVudmlyb25tZW50KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLklSZW1vdGVTY3JpcHQjc2V0UHJvY2Vzc0lucHV0U3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KQotCXsKLQkJaW5wdXRTdHJlYW0gPSBpbnB1dDsKLQkJZmV0Y2hQcm9jZXNzSW5wdXRTdHJlYW0gPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5JUmVtb3RlU2NyaXB0I3NldFByb2Nlc3NPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc091dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0KQotCXsKLQkJb3V0cHV0U3RyZWFtID0gb3V0cHV0OwotCQlmZXRjaFByb2Nlc3NPdXRwdXRTdHJlYW0gPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVTY3JpcHQjc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NFcnJvclN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0JCWVycm9yU3RyZWFtID0gb3V0cHV0OwotCQlmZXRjaFByb2Nlc3NFcnJvclN0cmVhbSA9IGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5JUmVtb3RlU2NyaXB0I3NldEZvcndhcmRYMTEoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3J3YXJkWDExKGJvb2xlYW4gd2lsbEZvcndhcmQpCi0JewotCQl0aGlzLndpbGxGb3J3YXJkWDExID0gd2lsbEZvcndhcmQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZVNjcmlwdCNzZXRTY3JpcHQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdCkKLQl7Ci0JCXRoaXMuc2NyaXB0ID0gbmV3IFN0cmluZ1sxXTsKLQkJdGhpcy5zY3JpcHRbMF0gPSBzY3JpcHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZVNjcmlwdCNzZXRTY3JpcHQoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjcmlwdChTdHJpbmdbXSBzY3JpcHQpCi0JewotCQl0aGlzLnNjcmlwdCA9IHNjcmlwdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFN0cmluZygpCi0JewotCQlpZihzY3JpcHQgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCi0JCUl0ZXJhdG9yIGl0ID0gZW52aXJvbm1lbnQuaXRlcmF0b3IoKTsKLQkJaWYoZW52aXJvbm1lbnQuc2l6ZSgpID4gMCkKLQkJCXNiLmFwcGVuZCgiZGVjbGFyZSAteCAiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7IAotCQkJc2IuYXBwZW5kKCJcIiIgKyAoU3RyaW5nKWl0Lm5leHQoKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYoZW52aXJvbm1lbnQuc2l6ZSgpID4gMCkKLQkJCXNiLmFwcGVuZCgiOyAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IHNjcmlwdC5sZW5ndGg7IGkrKykKLQkJCXNiLmFwcGVuZChzY3JpcHRbaV0gKyAiOyAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLQl7Ci0JCXJldHVybiBpbnB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi0JewotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLQotCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKQotCXsKLQkJcmV0dXJuIGVycm9yU3RyZWFtOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHdpbGxGb3J3YXJkWDExKCkKLQl7Ci0JCXJldHVybiB3aWxsRm9yd2FyZFgxMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaFByb2Nlc3NFcnJvclN0cmVhbShib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5mZXRjaFByb2Nlc3NFcnJvclN0cmVhbSA9IGZsYWc7Ci0JCXRoaXMuZXJyb3JTdHJlYW0gPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoUHJvY2Vzc0lucHV0U3RyZWFtKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLmZldGNoUHJvY2Vzc0lucHV0U3RyZWFtID0gZmxhZzsKLQkJdGhpcy5pbnB1dFN0cmVhbSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmV0Y2hQcm9jZXNzT3V0cHV0U3RyZWFtKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLmZldGNoUHJvY2Vzc091dHB1dFN0cmVhbSA9IGZsYWc7Ci0JCXRoaXMub3V0cHV0U3RyZWFtID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RmV0Y2hQcm9jZXNzRXJyb3JTdHJlYW0oKSB7Ci0JCXJldHVybiBmZXRjaFByb2Nlc3NFcnJvclN0cmVhbTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RmV0Y2hQcm9jZXNzT3V0cHV0U3RyZWFtKCkgewotCQlyZXR1cm4gZmV0Y2hQcm9jZXNzT3V0cHV0U3RyZWFtOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEZldGNoUHJvY2Vzc0lucHV0U3RyZWFtKCkgewotCQlyZXR1cm4gZmV0Y2hQcm9jZXNzSW5wdXRTdHJlYW07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGVUZXJtaW5hbChib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5hbGxvY2F0ZVRlcm1pbmFsID0gZmxhZzsJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEFsbG9jYXRlVGVybWluYWwoKSB7Ci0JCXJldHVybiBhbGxvY2F0ZVRlcm1pbmFsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29tbW9uL1JlbW90ZVR1bm5lbC5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9jb21tb24vUmVtb3RlVHVubmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNzhlNjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9jb21tb24vUmVtb3RlVHVubmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlVHVubmVsOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVJlbW90ZVR1bm5lbDwvY29kZT4KLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVR1bm5lbCBpbXBsZW1lbnRzIElSZW1vdGVUdW5uZWwgewotCWludCBsb2NhbFBvcnQ7Ci0JaW50IHBvcnRPblJlbW90ZUhvc3Q7Ci0JU3RyaW5nIGFkZHJlc3NPblJlbW90ZUhvc3Q7Ci0JCi0JcHVibGljIFJlbW90ZVR1bm5lbChpbnQgbG9jYWxQb3J0LCBpbnQgcG9ydE9uUmVtb3RlSG9zdCwgU3RyaW5nIGFkZHJlc3NPblJlbW90ZUhvc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5sb2NhbFBvcnQgPSBsb2NhbFBvcnQ7Ci0JCXRoaXMucG9ydE9uUmVtb3RlSG9zdCA9IHBvcnRPblJlbW90ZUhvc3Q7Ci0JCXRoaXMuYWRkcmVzc09uUmVtb3RlSG9zdCA9IGFkZHJlc3NPblJlbW90ZUhvc3Q7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzc09uUmVtb3RlSG9zdCgpIHsKLQkJcmV0dXJuIGFkZHJlc3NPblJlbW90ZUhvc3Q7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewotCQlyZXR1cm4gbG9jYWxQb3J0OwotCX0KLQlwdWJsaWMgaW50IGdldFBvcnRPblJlbW90ZUhvc3QoKSB7Ci0JCXJldHVybiBwb3J0T25SZW1vdGVIb3N0OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlSZW1vdGVUdW5uZWwgb3RoZXIgPSAoUmVtb3RlVHVubmVsKSBvYmo7Ci0JCXJldHVybiAob3RoZXIubG9jYWxQb3J0ID09IHRoaXMubG9jYWxQb3J0KQotCQkmJiAob3RoZXIuYWRkcmVzc09uUmVtb3RlSG9zdCA9PSB0aGlzLmFkZHJlc3NPblJlbW90ZUhvc3QpIAotCQkmJiAob3RoZXIucG9ydE9uUmVtb3RlSG9zdCA9PSB0aGlzLnBvcnRPblJlbW90ZUhvc3QpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29yZS9Db25uZWN0aW9uLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL2NvcmUvQ29ubmVjdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTk1ZDE5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29yZS9Db25uZWN0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1tdWx0aXBsZUNvbm5lY3Rpb249dHJ1ZQotbWF4Q2hhbm5lbHNQZXJDb25uZWN0aW9uPTYKLWluaXRpYWxEZWZhdWx0U2Vzc2lvbkxvYWQgPSAzCi0KLWxvbmdEdXR5Q3ljbGUgPSAxMDAwCi1mYXN0RHV0eUN5Y2xlID0gMTAwCi1pbmFjdGl2aXR5VGhyZWFzaG9sZCA9IDUKLQotZGVmYXVsdFRpbWVvdXQgPSAxMDAwMAotZGVmYXVsdFBvcnQgPSAyMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvY29yZS9Db25uZWN0aW9uUHJvcGVydGllcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9jb3JlL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3OTBjZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9jb3JlL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBsYWdnYXJjaWEKLSAqIEBzaW5jZSAxLjMuMgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblByb3BlcnRpZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQlVORExFX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5jb3JlLkNvbm5lY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTVVMVElQTEVfQ09OTkVDVElPTl9QUk9QRVJUWSA9ICJtdWx0aXBsZUNvbm5lY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUFYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OX1BST1BFUlRZID0gIm1heENoYW5uZWxzUGVyQ29ubmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MT05HX0RVVFlfQ1lDTEUgPSAibG9uZ0R1dHlDeWNsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GQVNUX0RVVFlfQ1lDTEUgPSAiZmFzdER1dHlDeWNsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JTkFDVElWSVRZX1RIUkVBU0hPTEQgPSAiaW5hY3Rpdml0eVRocmVhc2hvbGQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9QT1JUID0gImRlZmF1bHRQb3J0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1RJTUVPVVQgPSAiZGVmYXVsdFRpbWVvdXQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOSVRJQUxfREVGQVVMVF9TRVNTSU9OX0xPQUQgPSAiaW5pdGlhbERlZmF1bHRTZXNzaW9uTG9hZCI7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG11bHRpcGxlQ29ubmVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIGludCBtYXhDaGFubmVsc1BlckNvbm5lY3Rpb247Ci0JcHVibGljIHN0YXRpYyBpbnQgaW5pdGlhbERlZmF1bHRTZXNzaW9uTG9hZDsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBsb25nRHV0eUN5Y2xlID0gMTAwMDsKLQlwdWJsaWMgc3RhdGljIGludCBmYXN0RHV0eUN5Y2xlID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgaW50IGluYWN0aXZpdHlUaHJlYXNob2xkID0gNTsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBkZWZhdWx0VGltZW91dCA9IDEwMDAwOwotCXB1YmxpYyBzdGF0aWMgaW50IGRlZmF1bHRQb3J0ID0gMjI7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShBVFRSX0JVTkRMRV9JRCk7Ci0JCW11bHRpcGxlQ29ubmVjdGlvbiA9IG5ldyBCb29sZWFuKGJ1bmRsZQotCQkJCS5nZXRTdHJpbmcoQVRUUl9NVUxUSVBMRV9DT05ORUNUSU9OX1BST1BFUlRZKSkuYm9vbGVhblZhbHVlKCk7Ci0JCW1heENoYW5uZWxzUGVyQ29ubmVjdGlvbiA9IG5ldyBJbnRlZ2VyKGJ1bmRsZQotCQkJCS5nZXRTdHJpbmcoQVRUUl9NQVhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT05fUFJPUEVSVFkpKS5pbnRWYWx1ZSgpOwotCQlpbml0aWFsRGVmYXVsdFNlc3Npb25Mb2FkID0gbmV3IEludGVnZXIoYnVuZGxlLmdldFN0cmluZyhBVFRSX0lOSVRJQUxfREVGQVVMVF9TRVNTSU9OX0xPQUQpKS5pbnRWYWx1ZSgpOwotCQlsb25nRHV0eUN5Y2xlID0gbmV3IEludGVnZXIoYnVuZGxlLmdldFN0cmluZyhBVFRSX0xPTkdfRFVUWV9DWUNMRSkpLmludFZhbHVlKCk7Ci0JCWZhc3REdXR5Q3ljbGUgPSBuZXcgSW50ZWdlcihidW5kbGUuZ2V0U3RyaW5nKEFUVFJfRkFTVF9EVVRZX0NZQ0xFKSkuaW50VmFsdWUoKTsKLQkJaW5hY3Rpdml0eVRocmVhc2hvbGQgPSBuZXcgSW50ZWdlcihidW5kbGUuZ2V0U3RyaW5nKEFUVFJfSU5BQ1RJVklUWV9USFJFQVNIT0xEKSkuaW50VmFsdWUoKTsKLQkJZGVmYXVsdFBvcnQgPSBuZXcgSW50ZWdlcihidW5kbGUuZ2V0U3RyaW5nKEFUVFJfREVGQVVMVF9QT1JUKSkuaW50VmFsdWUoKTsKLQkJZGVmYXVsdFRpbWVvdXQgPSBuZXcgSW50ZWdlcihidW5kbGUuZ2V0U3RyaW5nKEFUVFJfREVGQVVMVF9USU1FT1VUKSkuaW50VmFsdWUoKTsJCQotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb3BlcnRpZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9DaXBoZXJUeXBlcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvQ2lwaGVyVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjQ3ZTkwMS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9DaXBoZXJUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQXZhaWxhYmxlIGNpcGhlciB0eXBlcyBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbi4gCi0gKiBUbyBhZGQgYW5vdGhlciBjaXBoZXIgdHlwZSwgaXQncyBuZWNlc3NhcnkgdGhhdCB0d28gYXR0cmlidXRlcyBvZiB0aGUgU3RyaW5nIHR5cGUgYXJlIGNyZWF0ZWQ6IGZpcnN0IG9uZQotICogcmV0dXJucyB0aGUgaWQgb2YgdGhlIGNpcGhlciB0eXBlIGFuZCBtdXN0IGhhdmUgaXRzIG5hbWUgaW4gdGhlIGZvcm1hdCBDSVBIRVJfPGNpcGhlciBhdHRyaWJ1dGVzJyBuYW1lPi4gU2Vjb25kIG9uZQotICogbXVzdCByZXR1cm4gdGhlIHJldHVybiB0aGUgY2lwaGVyJ3MgbmFtZSBhbmQgbXVzdCBoYXZlIGl0cyBuYW1lIGluIHRoZSBmb3JtYXQgTkFNRV9DSVBIRVJfPGNpcGhlciBhdHRyaWJ1dGVzJyBuYW1lPgotICogCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2lwaGVyVHlwZXMgewotLy8JQXZhaWxhYmxlIEpTY2ggY2lwaGVyIHR5cGVzOiBibG93ZmlzaC1jYmMsIDNkZXMtY2JjLCBhZXMxMjgtY2JjLGFlczE5Mi1jYmMsYWVzMjU2LWNiYwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUEhFUl9CTE9XRklTSCA9IENpcGhlclR5cGVzTWVzc2FnZXMuZ2V0U3RyaW5nKCJLRVlfQkxPV0ZJU0giKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUEhFUl8zREVTID0gQ2lwaGVyVHlwZXNNZXNzYWdlcy5nZXRTdHJpbmcoIktFWV8zREVTIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVBIRVJfQUVTMTI4ID0gQ2lwaGVyVHlwZXNNZXNzYWdlcy5nZXRTdHJpbmcoIktFWV9BRVMxMjgiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUEhFUl9BRVMxOTIgPSBDaXBoZXJUeXBlc01lc3NhZ2VzLmdldFN0cmluZygiS0VZX0FFUzE5MiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lQSEVSX0FFUzI1NiA9IENpcGhlclR5cGVzTWVzc2FnZXMuZ2V0U3RyaW5nKCJLRVlfQUVTMjU2Iik7IC8vJE5PTi1OTFMtMSQKLS8vCSBVc2UgdGhlIGRlZmF1bHQgSlNjaCBjaXBoZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVBIRVJfREVGQVVMVCA9IENpcGhlclR5cGVzTWVzc2FnZXMuZ2V0U3RyaW5nKCJLRVlfREVGQVVMVCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DSVBIRVJfQkxPV0ZJU0ggPSBDaXBoZXJUeXBlc01lc3NhZ2VzLmdldFN0cmluZygiTkFNRV9CTE9XRklTSCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DSVBIRVJfM0RFUyA9IENpcGhlclR5cGVzTWVzc2FnZXMuZ2V0U3RyaW5nKCJOQU1FXzNERVMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQ0lQSEVSX0FFUzEyOCA9IENpcGhlclR5cGVzTWVzc2FnZXMuZ2V0U3RyaW5nKCJOQU1FX0FFUzEyOCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DSVBIRVJfQUVTMTkyID0gQ2lwaGVyVHlwZXNNZXNzYWdlcy5nZXRTdHJpbmcoIk5BTUVfQUVTMTkyIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0NJUEhFUl9BRVMyNTYgPSBDaXBoZXJUeXBlc01lc3NhZ2VzLmdldFN0cmluZygiTkFNRV9BRVMyNTYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQ0lQSEVSX0RFRkFVTFQgPSBDaXBoZXJUeXBlc01lc3NhZ2VzLmdldFN0cmluZygiTkFNRV9ERUZBVUxUIik7IC8vIFVzZSB0aGUgZGVmYXVsdCBKU2NoIGNpcGhlciAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNpcGhlclR5cGVzTWFwID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbWFwIGNvbnRhaW5pbmcgdHVwbGVzIENpcGhlclR5cGVJZCBhbmQgQ2lwaGVyVHlwZU5hbWUKLQkgKiBmcm9tIHRoZSBkZWNsYXJlZCBhdHRyaWJ1dGVzLgotCSAqIEByZXR1cm4gTWFwIGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgY3JlYXRlQ2lwaGVyVHlwZXNNYXAoKSB7Ci0JCUZpZWxkIFtdIGZpZWxkcyA9IENpcGhlclR5cGVzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCUxpc3QgZmllbGRMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZpZWxkcykpOwotCQkKLQkJTWFwIGNpcGhlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotLy8JCSBHZXQgdGhlIHR1cGxlcyBvZiBhdHRyaWJ1dGVzIGZyb20gdGhlIGZpZWxkTGlzdCBhbmQgcHV0IHRoZW0gaW4gdGhlIGNpcGhlck1hcAotCQlmb3IoSXRlcmF0b3IgaXQgPSBmaWVsZExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJIExvb2sgZm9yIGEgYXR0cmlidXRlIHdob3NlIHByZWZpeCBpcyBDSVBIRVIgYW5kIGZldGNoIGl0cyB2YWx1ZQotCQkJRmllbGQgZiA9IChGaWVsZClpdC5uZXh0KCk7Ci0JCQlpZihmLmdldE5hbWUoKS5zdGFydHNXaXRoKCJDSVBIRVJfIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUZpZWxkIGNpcGhGaWVsZCA9IGY7Ci0JCQkJLy8gRm91bmQgb25lLiBOb3cgY29uY2F0IHRoZSBOQU1FXyBwcmVmaXggaW50byB0aGUgY2hvb3NlbiBuYW1lIHN0cmluZyBhbmQKLQkJCQkvLyBsb29rIGZvciBhbiBhdHRyaWJ1dGUgd2l0aCB0aGF0IG5hbWUuCi0JCQkJdHJ5IHsKLQkJCQkJRmllbGQgbmFtZUNpcGhGaWVsZCA9IChGaWVsZClDaXBoZXJUeXBlcy5jbGFzcy5nZXRGaWVsZCgiTkFNRV8iICsgY2lwaEZpZWxkLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIEFkZCBmaWVsZCB2YWx1ZXMgdG8gbWFwLgotCQkJCQkJY2lwaGVyTWFwLnB1dChjaXBoRmllbGQuZ2V0KG51bGwpLCBuYW1lQ2lwaEZpZWxkLmdldChudWxsKSk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBXaWxsIG5vdCBvY2N1ciwgc2luY2Ugd2UgdXNlIG51bGwgYXMgYXJndW1lbnQKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBXaWxsIG5vdCBvY2N1ciBzaW5jZSBvdXRzaWRlIHRyeSBhbHJlYWR5IHRyZWF0IHRoaXMgY2FzZS4KLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHByb3RlY3RlZCBhbmQgcHJpdmF0ZSBmaWVsZHMKLQkJCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIE5vIGVxdWl2YWxlbnQgbmFtZSBmaWVsZC4gVGhyb3cgYSBSdW50aW1lRXhjZXB0aW9uCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCS8vIkRpZCBub3QgZmluZCAiICsgIk5BTUVfIiArIGNpcGhGaWVsZC5nZXROYW1lKCkgKyAiIHRvIG1hdGNoIgotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCQlOTFMuYmluZChDaXBoZXJUeXBlc01lc3NhZ2VzLmdldFN0cmluZygiQ2lwaGVyVHlwZXMuQXR0cmlidXRlTmFtZUV4Y2VwdGlvbk1zZzIiKSwgCi0JCQkJCQkJCQkgY2lwaEZpZWxkLmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY2lwaGVyTWFwOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBjb250YWluaW5nIHR1cGxlcyBDaXBoZXJUeXBlSWQgYW5kIENpcGhlclR5cGVOYW1lCi0JICogIAotCSAqIEByZXR1cm4gTWFwCi0JICovCi0Jc3RhdGljIHB1YmxpYyBNYXAgZ2V0Q2lwaGVyVHlwZXNNYXAoKSB7Ci0JCS8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNpbmdsZXRvbgotCQlpZihjaXBoZXJUeXBlc01hcCA9PSBudWxsKQotCQkJY2lwaGVyVHlwZXNNYXAgPSBjcmVhdGVDaXBoZXJUeXBlc01hcCgpOwotCQkKLQkJcmV0dXJuIGNpcGhlclR5cGVzTWFwOwotCX0KLQkKLQkvKioKLQkgKiBDbGFzcyBzaG91bGQgbm90IGJlIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIENpcGhlclR5cGVzKCkgewotCX0KLX0JCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9DaXBoZXJUeXBlc01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9DaXBoZXJUeXBlc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNjYxYjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvQ2lwaGVyVHlwZXNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDaXBoZXJUeXBlc01lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaC5jaXBoZXJ0eXBlc21lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBDaXBoZXJUeXBlc01lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0Nvbm5lY3Rpb24uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmMwMGExNi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuQXV0aFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuS2V5QXV0aFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLlBhc3N3ZEF1dGhUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkxvY2FsUG9ydEJvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29tbW9uLlJlbW90ZVR1bm5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29yZS5Db25uZWN0aW9uUHJvcGVydGllczsKLQotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsOwotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsRXhlYzsKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbFNmdHA7Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2g7Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLlVJS2V5Ym9hcmRJbnRlcmFjdGl2ZTsKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guVXNlckluZm87Ci0KLS8qKgotICogVGhlIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgaG9zdC4KLSAqIE1hbmFnZXMgYSBwb29sIG9mIGNvbm5lY3Rpb24gdXNlZCB0byBvcGVuIGV4ZWN1dGlvbiBjaGFubmVscywgc2luY2Ugc29tZSBTU0ggc2VydmVyCi0gKiBzaG93ZWQgdG8gaW1wb3NlIGEgbGltaXQgb2YgZXhlY3V0aW9uIGNoYW5uZWxzIHBlciBjb25uZWN0aW9uLgotICoKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwgYW5kIERhbmllbCBGZWxpeCBGZXJiZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgSVJlbW90ZUNvbm5lY3Rpb24gewotCS8qKgotCSAqIERhdGEgc3RydWN0dXJlIHRvIGFjY2VzcyB0aGUgc3NoIGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSBKU2NoIGpzY2g7Ci0KLQkvKioKLQkgKiBBIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBob3N0LiBUaGUgZGVmYXVsdCBjb25uZWN0aW9ucyBpcyBhbHdheXMgY3JlYXRlZCwgYnV0IG1vcmUKLQkgKiBjb25uZWN0aW9ucyBtYXkgYmUgYWRkZWQgdG8gdGhlIHBvb2wgb24gZGVtYW5kLgotCSAqLwotCVNlc3Npb24gZGVmYXVsdFNlc3Npb247Ci0JcHJpdmF0ZSBBdXRoVG9rZW4gYXV0aFRva2VuOwotCS8vcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgaG9zdG5hbWU7Ci0JcHJpdmF0ZSBpbnQgcG9ydDsKLQlwcml2YXRlIGludCB0aW1lb3V0OwotCXByaXZhdGUgU3RyaW5nIGNpcGhlclR5cGU7Ci0JcHJpdmF0ZSBTU0hVc2VySW5mbyBzc2h1c2VyaW5mbyA9IG5ldyBTU0hVc2VySW5mbygpOwotCi0JLyoqCi0JICogQWxsIGV4ZWN1dGlvbnMgbWFuYWdlcnMgY3JlYXRlZCBmb3IgdGhpcyBjb25uZWN0aW9uLgotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGV4ZWN1dGlvbk1hbmFnZXJzOwotCS8qKgotCSAqIFR1bm5lbHMgdG8gcmVtb3RlIGhvc3QuCi0JICovCi0JU2V0IHR1bm5lbHM7Ci0KLQkvKioKLQkgKiBFeGVjdXRpb25zIG9uIHJlbW90ZSBob3N0LgotCSAqLwotCVNldCBleGVjdXRpb25zOwotCS8qKgotCSAqIERlZmF1bHQgc2Z0cCBjaGFubmVsIHNoYXJlZCBieSBhbGwgZXhlY3V0aW9ucyBtYW5hZ2VycyBhbmQgZmlsZSB0b29scy4KLQkgKi8KLQlDaGFubmVsU2Z0cCBzZnRwQ2hhbm5lbDsKLQkvKioKLQkgKiBIYXNodGFibGUgdGhhdCBrZWVwcyBhbGwgcmVtb3RlIGV4ZWN1dGlvbnMgdGhhdCBjYW4gYmUga2lsbGVkLgotCSAqIFRoZSB0YWJsZSBpcyBpbmRleGVkIGJ5IEludGVybmFsIFBJRC4KLQkgKi8KLQlIYXNodGFibGUgYWN0aXZlUHJvY2Vzc1RhYmxlOwotCS8qKgotCSAqIFRoZSBpbnRlcm5hbCBpZGVudGlmaWNhdGlvbiBudW1iZXIgZm9yIHRoZSBuZXh0IHJlbW90ZSBleGVjdXRpb24uCi0JICovCi0JcHJpdmF0ZSBpbnQgbmV4dEludGVybmFsUElEOwotCS8qKgotCSAqIFRoZSBjb250cm9sIGNvbm5lY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBDb250cm9sQ2hhbm5lbCBjb250cm9sQ2hhbm5lbDsKLQkvKioKLQkgKiBBIGpvYiB0aGF0IHdhdGNoZXMgZm9yIGZpbmlzaGVkIGV4ZWN1dGlvbnMuCi0JICovCi0JcHJpdmF0ZSBFeGVjdXRpb25PYnNlcnZlciBleGVjdXRpb25PYnNlcnZlcjsKLQotCS8qKgotCSAqIEFycmF5IG9mIGFsbCBjb25uZWN0aW9ucyBhbmQgaG93IG1hbnkgcHR5IGNoYW5uZWxzIHdlcmUgdXNlZC4KLQkgKi8KLQlBcnJheUxpc3QgY29ubmVjdGlvblBvb2wgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBjbGFzcyBDb25uZWN0aW9uU2xvdCB7Ci0JCVNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Ci0JCWludCBudW1iZXJVc2VkQ2hhbm5lbHMgPSAwOwotCQlDb25uZWN0aW9uU2xvdChTZXNzaW9uIHNlc3Npb24pIHsKLQkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0JCX0KLQkJQ29ubmVjdGlvblNsb3QoU2Vzc2lvbiBzZXNzaW9uLCBpbnQgaW5pdGlhbExvYWQpIHsKLQkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0JCQl0aGlzLm51bWJlclVzZWRDaGFubmVscyA9IGluaXRpYWxMb2FkOwotCQl9Ci0JfQotCS8qKgotCSAqIE1hcHMgYSBjaGFubmVsIHRvIHRoZSBjb25uZWN0aW9uIHdoZXJlIGl0IHdhcyBjcmVhdGVkLgotCSAqLwotCUhhc2hNYXAgY2hhbm5lbFRvQ29ubmVjdGlvUG9vbDsKLQotCS8qKgotCSAqIExvY2tzIHVzZWQgb24gc3luY2hyb25pemVkIG9wZXJhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Mb2NrcyBjb25uZWN0aW9uTG9ja3M7Ci0KLQlSZW1vdGVQb3J0Rm9yd2FyZGluZ1Bvb2wgZm9yd2FyZGluZ1Bvb2w7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKiBAcGFyYW0gYXV0aFRva2VuCi0JICogQHBhcmFtIGhvc3RuYW1lCi0JICogQHBhcmFtIHBvcnQKLQkgKiBAcGFyYW0gdGltZW91dAotCSAqIEBwYXJhbSBjaXBoZXJUeXBlCi0JICovCi0JcHVibGljIENvbm5lY3Rpb24oQXV0aFRva2VuIGF1dGhUb2tlbiwgU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCwgU3RyaW5nIGNpcGhlclR5cGUsIGludCB0aW1lb3V0KSB7Ci0JCXRoaXMuanNjaCA9IG5ldyBKU2NoKCk7Ci0JCXRoaXMuYXV0aFRva2VuID0gYXV0aFRva2VuOwotCQl0aGlzLnVzZXJuYW1lID0gYXV0aFRva2VuLmdldFVzZXJuYW1lKCk7Ci0JCXRoaXMuaG9zdG5hbWUgPSBob3N0bmFtZTsKLQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQkJdGhpcy5jaXBoZXJUeXBlID0gY2lwaGVyVHlwZTsKLQotCQkvLyBDb252ZXJ0IGluZm9ybWF0aW9uIGZvciB0aGUgVXNlckluZm8gY2xhc3MgdXNlZCBieSBKU2NoCi0JCWlmKGF1dGhUb2tlbiBpbnN0YW5jZW9mIFBhc3N3ZEF1dGhUb2tlbikgewotCQkJc3NodXNlcmluZm8uaXNQYXNzd2RCYXNlZCA9IHRydWU7Ci0JCQlzc2h1c2VyaW5mby5wYXNzd29yZCA9ICgoUGFzc3dkQXV0aFRva2VuKWF1dGhUb2tlbikuZ2V0UGFzc3dvcmQoKTsKLQkJfSBlbHNlIGlmKGF1dGhUb2tlbiBpbnN0YW5jZW9mIEtleUF1dGhUb2tlbikgewotCQkJS2V5QXV0aFRva2VuIHRva2VuID0gKEtleUF1dGhUb2tlbilhdXRoVG9rZW47Ci0JCQlzc2h1c2VyaW5mby5pc1Bhc3N3ZEJhc2VkID0gZmFsc2U7Ci0JCQlzc2h1c2VyaW5mby5wYXNzcGhyYXNlID0gdG9rZW4uZ2V0UGFzc3BocmFzZSgpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuQ29ubmVjdGlvbl9BdXRoZW50aWNhdGlvblR5cGVOb3RTdXBwb3J0ZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb24oQXV0aFRva2VuIGF1dGhUb2tlbiwgU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCwgU3RyaW5nIGNpcGhlclR5cGUpIHsKLQkJdGhpcyhhdXRoVG9rZW4sIGhvc3RuYW1lLCBwb3J0LCBDaXBoZXJUeXBlcy5DSVBIRVJfREVGQVVMVCwgQ29ubmVjdGlvblByb3BlcnRpZXMuZGVmYXVsdFRpbWVvdXQpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uKEF1dGhUb2tlbiBhdXRoVG9rZW4sIFN0cmluZyBob3N0bmFtZSkgewotCQl0aGlzKGF1dGhUb2tlbiwgaG9zdG5hbWUsIENvbm5lY3Rpb25Qcm9wZXJ0aWVzLmRlZmF1bHRQb3J0LAotCQkJCUNpcGhlclR5cGVzLkNJUEhFUl9ERUZBVUxULCBDb25uZWN0aW9uUHJvcGVydGllcy5kZWZhdWx0VGltZW91dCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb24oQXV0aFRva2VuIGF1dGhUb2tlbiwgU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCkgewotCQl0aGlzKGF1dGhUb2tlbiwgaG9zdG5hbWUsIHBvcnQsIENpcGhlclR5cGVzLkNJUEhFUl9ERUZBVUxULCBDb25uZWN0aW9uUHJvcGVydGllcy5kZWZhdWx0VGltZW91dCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMubmV4dEludGVybmFsUElEID0gMDsKLQotCQkvKgotCQkgKiBJbnNlcnQga2V5IGluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeQotCQkgKi8KLQkJaWYoYXV0aFRva2VuIGluc3RhbmNlb2YgS2V5QXV0aFRva2VuKSB7Ci0JCQlLZXlBdXRoVG9rZW4gdG9rZW4gPSAoS2V5QXV0aFRva2VuKWF1dGhUb2tlbjsKLQkJCXRyeSB7Ci0JCQkJanNjaC5hZGRJZGVudGl0eSh0b2tlbi5nZXRLZXlQYXRoKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfSBjYXRjaCAoSlNjaEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuQ29ubmVjdGlvbl9Db25uZWN0X0ludmFsaWRQcml2YXRlS2V5LCBlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIENyZWF0ZSBzZXNzaW9uLgotCQkgKi8KLQkJdHJ5IHsKLQkJCWRlZmF1bHRTZXNzaW9uID0ganNjaC5nZXRTZXNzaW9uKHVzZXJuYW1lLCBob3N0bmFtZSwgcG9ydCk7Ci0JCQlkZWZhdWx0U2Vzc2lvbi5zZXRVc2VySW5mbyhzc2h1c2VyaW5mbyk7Ci0JCX0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgewotCQkJZGlzY29ubmVjdCgpOwotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuQ29ubmVjdGlvbl9Db25uZWN0X0ZhaWxlZENyZWF0ZVNlc3Npb24sIGUpOwotCQl9Ci0KLQkJc2V0U2Vzc2lvbkNpcGhlclR5cGUoZGVmYXVsdFNlc3Npb24pOwotCi0JCS8qCi0JCSAqIENvbm5lY3QgdG8gcmVtb3RlIGhvc3QuCi0JCSAqLwotCQl0cnkgewotCQkJZGVmYXVsdFNlc3Npb24uY29ubmVjdCh0aW1lb3V0KTsKLQkJfSBjYXRjaCAoSlNjaEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNjb25uZWN0KCk7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX0Nvbm5lY3RfRmFpbGVkQ29ubmVjdCwgZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNjb25uZWN0KCk7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX0Nvbm5lY3RfRmFpbGVkVW5zdXBwb3J0ZWRLZXlTaXplLCBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIENyZWF0ZSBjb250cm9sIGV4ZWN1dGlvbiBjaGFubmVsLgotCQkgKi8KLQkJdHJ5IHsKLQkJCWNvbnRyb2xDaGFubmVsID0gbmV3IENvbnRyb2xDaGFubmVsKHRoaXMpOwotCQkJY29udHJvbENoYW5uZWwub3BlbigpOwotCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWRpc2Nvbm5lY3QoKTsKLQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkNvbm5lY3Rpb25fQ29ubmVjdF9GYWlsZWRDcmVhdGVDb250cm9sQ2hhbm5lbCwgZSk7Ci0JCX0KLQotCQkvKgotCQkgKiBDcmVhdGUgY29udmVuaWVuY2Ugc2Z0cCBjaGFubmVsLgotCQkgKi8KLQkJdHJ5IHsKLQkJCXNmdHBDaGFubmVsID0gKENoYW5uZWxTZnRwKSBkZWZhdWx0U2Vzc2lvbi5vcGVuQ2hhbm5lbCgic2Z0cCIpOyAvLyROT04tTkxTLTEkCi0JCQlzZnRwQ2hhbm5lbC5jb25uZWN0KCk7Ci0JCX0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgewotCQkJZGlzY29ubmVjdCgpOwotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuQ29ubmVjdGlvbl9Db25uZWN0X0ZhaWxlZENyZWF0ZVNGVFBDb25uZWN0aW9uLCBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIENyZWF0ZSBvYnNlcnZlciBqb2IgYnV0IGRvIG5vdCBzY2hlZHVsZSBpdAotCQkgKi8KLQkJZXhlY3V0aW9uT2JzZXJ2ZXIgPSBuZXcgRXhlY3V0aW9uT2JzZXJ2ZXIodGhpcyk7Ci0JCWV4ZWN1dGlvbk9ic2VydmVyLnNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0JCWV4ZWN1dGlvbk9ic2VydmVyLnNldFN5c3RlbSh0cnVlKTsKLQotCQkvKgotCQkgKiBUaGUgZGVmYXVsdCBzZXNzaW9uIGNhbm5vdCBiZSBmdWxseSB1c2VkIGZvciBjb25uZWN0aW9uIHBvb2wsCi0JCSAqIHNpbmNlIHNvbWUgY2hhbm5lbHMgYXJlIGFscmVhZHkgdXNpbmcgcHR5LgotCQkgKi8KLQkJY29ubmVjdGlvblBvb2wgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbm5lY3Rpb25TbG90IHNsb3QgPSBuZXcgQ29ubmVjdGlvblNsb3QoZGVmYXVsdFNlc3Npb24sIENvbm5lY3Rpb25Qcm9wZXJ0aWVzLmluaXRpYWxEZWZhdWx0U2Vzc2lvbkxvYWQpOwotCQljb25uZWN0aW9uUG9vbC5hZGQoc2xvdCk7Ci0KLQkJZXhlY3V0aW9uTWFuYWdlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXR1bm5lbHMgPSBuZXcgSGFzaFNldCgpOwotCQlleGVjdXRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJYWN0aXZlUHJvY2Vzc1RhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQljaGFubmVsVG9Db25uZWN0aW9Qb29sID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yd2FyZGluZ1Bvb2wgPSBuZXcgUmVtb3RlUG9ydEZvcndhcmRpbmdQb29sKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZUNvbm5lY3Rpb24jZ2V0UmVtb3RlRXhlY3V0aW9uTWFuYWdlcigpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBjcmVhdGVSZW1vdGVFeGVjdXRpb25NYW5hZ2VyKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlFeGVjdXRpb25NYW5hZ2VyIGUgPSAgbmV3IEV4ZWN1dGlvbk1hbmFnZXIodGhpcyk7Ci0JCWV4ZWN1dGlvbk1hbmFnZXJzLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0Jc3luY2hyb25pemVkIHByb3RlY3RlZCB2b2lkIHJlbGVhc2VFeGN1dGlvbk1hbmFnZXIoRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWV4ZWN1dGlvbk1hbmFnZXJzLnJlbW92ZShtYW5hZ2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLklSZW1vdGVDb25uZWN0aW9uI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgewotCQkvKgotCQkgKiBGaXJzdCwgY2FuY2VsIGFsbCBvbmdvaW5nIGV4ZWN1dGlvbnMgYW5kIHR1bm5lbHMgY3JlYXRlZCBieSBtYW5hZ2VycywgYnkgY2xvc2luZyB0aGVpciBleGVjdXRpb24gbWFuYWdlcnMuCi0JCSAqLwotCQlpZiAoZXhlY3V0aW9uTWFuYWdlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGVjdXRpb25NYW5hZ2Vycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUV4ZWN1dGlvbk1hbmFnZXIgbWFuYWdlciA9IChFeGVjdXRpb25NYW5hZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbWFuYWdlci5jbG9zZSgpOwotCQkJCWl0ZXJhdG9yID0gZXhlY3V0aW9uTWFuYWdlcnMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfQotCQlpZiAoZXhlY3V0aW9uT2JzZXJ2ZXIgIT0gbnVsbCkgewotCQkJZXhlY3V0aW9uT2JzZXJ2ZXIuY2FuY2VsKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBUaGVuLCBjbG9zZSBjaGFubmVscyBjcmVhdGVkIGJ5IHRoZSBjb25uZWN0aW9uLgotCQkgKi8KLQkJaWYgKGNvbnRyb2xDaGFubmVsICE9IG51bGwpIHsKLQkJCWNvbnRyb2xDaGFubmVsLmNsb3NlKCk7Ci0JCX0KLQkJaWYgKHNmdHBDaGFubmVsICE9IG51bGwpIHsKLQkJCXNmdHBDaGFubmVsLmRpc2Nvbm5lY3QoKTsKLQkJfQotCi0JCS8qCi0JCSAqIENsb3NlIGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoZSBwb29sLgotCQkgKi8KLQkJaWYgKGNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvblBvb2wuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDb25uZWN0aW9uU2xvdCBzbG90ID0gKENvbm5lY3Rpb25TbG90KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJc2xvdC5zZXNzaW9uLmRpc2Nvbm5lY3QoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFJlc2V0IGludGVybmFsIHN0YXRlIHZhcmlhYmxlcy4KLQkJICovCi0JCWRlZmF1bHRTZXNzaW9uID0gbnVsbDsKLQkJc2Z0cENoYW5uZWwgPSBudWxsOwotCQljb250cm9sQ2hhbm5lbCA9IG51bGw7Ci0JCWNvbm5lY3Rpb25Qb29sID0gbnVsbDsKLQkJZXhlY3V0aW9uT2JzZXJ2ZXIgPSBudWxsOwotCQlleGVjdXRpb25zID0gbnVsbDsKLQkJZXhlY3V0aW9uTWFuYWdlcnMgPSBudWxsOwotCQl0dW5uZWxzID0gbnVsbDsKLQkJaWYgKGZvcndhcmRpbmdQb29sICE9IG51bGwpIHsKLQkJCWZvcndhcmRpbmdQb29sLmRpc2Nvbm5lY3QoKTsKLQkJCWZvcndhcmRpbmdQb29sID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZUNvbm5lY3Rpb24jaXNDb25uZWN0ZWQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJaWYgKGRlZmF1bHRTZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBkZWZhdWx0U2Vzc2lvbi5pc0Nvbm5lY3RlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSgpIHsKLQkJcmV0dXJuIGhvc3RuYW1lOwotCX0KLQotCS8qcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHBhc3N3b3JkOwotCX0qLwotCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7Ci0JCXJldHVybiB0aW1lb3V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0JCXJldHVybiB1c2VybmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHJlcXVpcmVkIGJ5IHRoZSBqc2NoIGxpYnJhcnkuCi0JICoKLQkgKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0JICoKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNTSFVzZXJJbmZvIGltcGxlbWVudHMgVXNlckluZm8sIFVJS2V5Ym9hcmRJbnRlcmFjdGl2ZSB7Ci0JCXB1YmxpYyBTdHJpbmcgcGFzc3dvcmQ7Ci0JCXB1YmxpYyBTdHJpbmcgcGFzc3BocmFzZTsKLQkJcHVibGljIGJvb2xlYW4gaXNQYXNzd2RCYXNlZDsKLQotCQlwcml2YXRlIFNTSFVzZXJJbmZvKCkgeyB9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJCXJldHVybiBwYXNzd29yZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHByb21wdFllc05vKFN0cmluZyBzdHIpIHsKLQkJCS8vIEFsd2F5cyBhY2NlcHQgaG9zdCBpZGVudGl0eQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFBhc3NwaHJhc2UoKSB7Ci0JCQlyZXR1cm4gcGFzc3BocmFzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHByb21wdFBhc3NwaHJhc2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXJldHVybiAhaXNQYXNzd2RCYXNlZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHByb21wdFBhc3N3b3JkKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlyZXR1cm4gaXNQYXNzd2RCYXNlZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gcHJvbXB0S2V5Ym9hcmRJbnRlcmFjdGl2ZShmaW5hbCBTdHJpbmcgZGVzdGluYXRpb24sCi0JCQkJZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBpbnN0cnVjdGlvbiwKLQkJCQlmaW5hbCBTdHJpbmdbXSBwcm9tcHQsIGZpbmFsIGJvb2xlYW5bXSBlY2hvKSB7Ci0JCQlpZiAocHJvbXB0Lmxlbmd0aCAhPSAxCi0JCQkJCXx8IGVjaG9bMF0gIT0gZmFsc2UKLQkJCQkJfHwgcGFzc3dvcmQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJU3RyaW5nW10gcmVzcG9uc2UgPSBuZXcgU3RyaW5nWzFdOwotCQkJcmVzcG9uc2VbMF0gPSBwYXNzd29yZDsKLQkJCXJldHVybiByZXNwb25zZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBleGVjdXRpb24gY2hhbm5lbC4gVGhlIGNoYW5uZWwgbWF5IG9yIG1heSBub3QgYmUgbWFuYWdlZCBieSB0aGUgY29ubmVjdGlvbiBwb29sLgotCSAqIEFsbCBleGVjdXRpb24gY2hhbm5lbHMgdGhhdCByZXF1aXJlIFBUWSBtdXN0IGJlIG1hbmFnZWQgYnkgdGhlIHBvb2wsIGV4Y2VwdCByZWFsbHkgc3BlY2lhbCBjYXNlcywKLQkgKiBsaWtlIHRoZSBjb250cm9sIGNoYW5uZWwgYW5kIGRlZmF1bHQgU0ZUUCBjaGFubmVsLgotCSAqIENoYW5uZWxzIHdpdGhvdXQgUFRZIG1heSBiZSBtYW5hZ2VkLCBieSBpdCBpcyByZWNvbW1lbmRlZCBubyB0byBiZS4gVGhpcyB3aWxsIGFsbG9jYXRlIHRoZW0gaW50byB0aGUKLQkgKiBkZWZhdWx0IHNlc3Npb24sIHNpbmNlIGFuIHVubGltaXRlZCBudW1iZXIgb2Ygbm90IFBUWSBjaGFubmVscyBjYW4gYmUgYWxsb2NhdGVkIGludG8gdGhlIGRlZmF1bHQgc2Vzc2lvbi4KLQkgKiBAcGFyYW0gaXNJbkNvbm5lY3Rpb25Qb29sIEFzIGRlc2NyaWJlZC4KLQkgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgZXhlY3V0aW9uIGNoYW5uZWwuCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIElmIHRoZSBhbGxvY2F0aW9uIG9mIG5ldyBjaGFubmVsIGZhaWxlZCBvZiBpZiBpdCB3YXMgbm90IHBvc3NpYmxlCi0JICogdG8gY3JlYXRlIGEgbmV3IHNzaCBzZXNzaW9uIGZvciB0aGUgbmV3IGNoYW5uZWwuCi0JICovCi0JcHJvdGVjdGVkIENoYW5uZWxFeGVjIGNyZWF0ZUV4ZWNDaGFubmVsKGJvb2xlYW4gaXNJbkNvbm5lY3Rpb25Qb29sKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChpc0luQ29ubmVjdGlvblBvb2wpIHsKLQkJCS8qCi0JCQkgKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgY29ubmVjdGlvbiBzbG90IG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgYWxsIGFyZSBmdWxsLgotCQkJICovCi0JCQlDb25uZWN0aW9uU2xvdCBzdWdnZXN0ZWRTbG90ID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvblBvb2wuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDb25uZWN0aW9uU2xvdCBzbG90ID0gKENvbm5lY3Rpb25TbG90KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNsb3QubnVtYmVyVXNlZENoYW5uZWxzIDwgQ29ubmVjdGlvblByb3BlcnRpZXMubWF4Q2hhbm5lbHNQZXJDb25uZWN0aW9uKSB7Ci0JCQkJCXN1Z2dlc3RlZFNsb3QgPSBzbG90OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc3VnZ2VzdGVkU2xvdCA9PSBudWxsKSB7Ci0JCQkJc3VnZ2VzdGVkU2xvdCA9IGNyZWF0ZUNvbm5lY2l0b25TbG90KCk7Ci0JCQl9Ci0JCQkvKgotCQkJICogQ3JlYXRlIHRoZSBjaGFubmVsIGFuZCB1cGRhdGUgdGhlIHBvb2wuCi0JCQkgKi8KLQkJCUNoYW5uZWxFeGVjIGNoYW5uZWw7Ci0JCQl0cnkgewotCQkJCWNoYW5uZWwgPSAoQ2hhbm5lbEV4ZWMpIHN1Z2dlc3RlZFNsb3Quc2Vzc2lvbi5vcGVuQ2hhbm5lbCgiZXhlYyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX0NyZWF0ZUV4ZWNDaGFubmVsX0ZhaWxlZENyZWF0ZU5ld0V4ZWNDaGFubmVsLCBlKTsKLQkJCX0KLQkJCXN1Z2dlc3RlZFNsb3QubnVtYmVyVXNlZENoYW5uZWxzKys7Ci0JCQljaGFubmVsVG9Db25uZWN0aW9Qb29sLnB1dChjaGFubmVsLCBzdWdnZXN0ZWRTbG90KTsKLQkJCXJldHVybiBjaGFubmVsOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIENyZWF0ZSBhIGNoYW5uZWwgb24gdGhlIGRlZmF1bHQgY2hhbm5lbC4KLQkJCSAqLwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKENoYW5uZWxFeGVjKSBkZWZhdWx0U2Vzc2lvbi5vcGVuQ2hhbm5lbCgiZXhlYyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX0NyZWF0ZUV4ZWNDaGFubmVsX0ZhaWxlZENyZWF0ZU5ld0V4ZWNDaGFubmVsLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNoYW5uZWwgZnJvbSB0aGUgcG9vbCwgbGVhdmluZyB0aGUgc2xvdCBhdmFpbGFibGUgZm9yIGFub3RoZXIgY2hhbm5lbC4KLQkgKiBAcGFyYW0gY2hhbm5lbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VDaGFubmVsKENoYW5uZWwgY2hhbm5lbCkgewotCQkvKgotCQkgKiBUaGUgY2hhbm5lbCBtYXkgb3IgbWF5IG5vdCBiZSBpbiB0aGUgY29ubmVjdGlvbiBwb29sLCBkZXBlbmRpbmcgaG93IGl0IHdhcyBjcmVhdGVkLgotCQkgKiBBbnQgYW55IGNhc2UsIGFsd2F5cyBkaXNjb25uZWN0IHRoZSBjaGFubmVsLgotCQkgKi8KLQkJY2hhbm5lbC5kaXNjb25uZWN0KCk7Ci0JCUNvbm5lY3Rpb25TbG90IHNsb3QgPSAoQ29ubmVjdGlvblNsb3QpIGNoYW5uZWxUb0Nvbm5lY3Rpb1Bvb2wucmVtb3ZlKGNoYW5uZWwpOwotCQlpZiAoc2xvdCAhPSBudWxsKSB7Ci0JCQlzbG90Lm51bWJlclVzZWRDaGFubmVscy0tOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9yd2FyZGluZyBmcm9tIGEgcmVtb3RlIHBvcnQgdG8gYSBsb2NhbCBwb3J0LgotCSAqIEBwYXJhbSBsb2NhbFBvcnQKLQkgKiBAcGFyYW0gYWRkcmVzc09uUmVtb3RlSG9zdAotCSAqIEBwYXJhbSBwb3J0T25SZW1vdGVIb3N0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBSZW1vdGVUdW5uZWwgY3JlYXRlVHVubmVsKGludCBsb2NhbFBvcnQsIFN0cmluZyBhZGRyZXNzT25SZW1vdGVIb3N0LCBpbnQgcG9ydE9uUmVtb3RlSG9zdCkKLQkJCXRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBMb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbiB7Ci0JCVJlbW90ZVR1bm5lbCB0dW5uZWwgPSBuZXcgUmVtb3RlVHVubmVsKGxvY2FsUG9ydCwgcG9ydE9uUmVtb3RlSG9zdCwgYWRkcmVzc09uUmVtb3RlSG9zdCk7Ci0JCWlmICh0dW5uZWxzLmNvbnRhaW5zKHR1bm5lbCkpIHsKLQkJCXRocm93IG5ldyBMb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX0NyZWF0ZVR1bm5lbF9UdW5uZWxQb3J0QWxyZWFkeUFsbG9jZWQpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWRlZmF1bHRTZXNzaW9uLnNldFBvcnRGb3J3YXJkaW5nTCh0dW5uZWwuZ2V0TG9jYWxQb3J0KCksIHR1bm5lbC5nZXRBZGRyZXNzT25SZW1vdGVIb3N0KCksIHR1bm5lbAotCQkJCQkuZ2V0UG9ydE9uUmVtb3RlSG9zdCgpKTsKLQkJfSBjYXRjaCAoSlNjaEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlLmdldE1lc3NhZ2UoKS5tYXRjaGVzKCJQb3J0Rm9yd2FyZGluZ0w6IGxvY2FsIHBvcnQgLiogaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBTZWxlY3RlZCBsb2NhbCBwb3J0IGlzIGFscmVhZHkgYm91bmQuCi0JCQkJdGhyb3cgbmV3IExvY2FsUG9ydEJvdW5kRXhjZXB0aW9uKE1lc3NhZ2VzLkNvbm5lY3Rpb25fQ3JlYXRlVHVubmVsX1R1bm5lbFBvcnRBbHJlYWR5QWxsb2NlZCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX0NyZWF0ZVR1bm5lbF9GYWlsZWRDcmVhdGVUdW5uZWwsIGUpOwotCQl9Ci0KLQkJdHVubmVscy5hZGQodHVubmVsKTsKLQkJcmV0dXJuIHR1bm5lbDsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBmb3J3YXJkaW5nIG9mIHRoZSByZW1vdGUgcG9ydC4KLQkgKiBAcGFyYW0gdHVubmVsCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVR1bm5lbChSZW1vdGVUdW5uZWwgdHVubmVsKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghdHVubmVscy5jb250YWlucyh0dW5uZWwpKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX1JlbGVhc2VUdW5uZWxfUG9ydE5vdEFsbG9jZWRGb3JUdW5uZWwpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVJlbW90ZVR1bm5lbCByZW1vdGVUdW5uZWwgPSB0dW5uZWw7Ci0JCQlkZWZhdWx0U2Vzc2lvbi5kZWxQb3J0Rm9yd2FyZGluZ0wocmVtb3RlVHVubmVsLmdldExvY2FsUG9ydCgpKTsKLQkJfSBjYXRjaCAoSlNjaEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db25uZWN0aW9uX1JlbGVhc2VUdW5uZWxfRmFpbGVkUmVtb3ZlVHVubmVsLCBlKTsKLQkJfQotCi0JCXR1bm5lbHMucmVtb3ZlKHR1bm5lbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgU0ZUUCBjaGFubmVsIHRoYXQgbWF5IGJlIHVzZWQgYnkgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHRvIGRvIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMKLQkgKiBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDaGFubmVsU2Z0cCBnZXREZWZhdWx0U0ZUUENoYW5uZWwoKSB7Ci0JCXJldHVybiBzZnRwQ2hhbm5lbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGNyZWF0ZU5leHRQSUlEKCkgewotCQlyZXR1cm4gKytuZXh0SW50ZXJuYWxQSUQgJSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0UElEKGludCBwaWlkLCBpbnQgcGlkKSB7Ci0JCS8vIExvb2sgZm9yIHRoZSBvYmplY3Qgd2hpY2gga2V5IGlzIFBJSUQuCi0JCUtpbGxhYmxlRXhlY3V0aW9uIHJjZSA9IChLaWxsYWJsZUV4ZWN1dGlvbikgYWN0aXZlUHJvY2Vzc1RhYmxlLmdldChuZXcgSW50ZWdlcihwaWlkKSk7Ci0JCWlmIChyY2UgIT0gbnVsbCkgewotCQkJLy8gUHJvY2VzcyBjb3VsZCBiZSBhbHJlYWR5IGZpbmlzaGVkIGFuZCByZW1vdmVkIGZybyBtdGhlIHRhYmxlLgotCQkJcmNlLnNldFBJRChwaWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyT2JzZXJ2ZWRFeGVjdXRpb24oSVJlbW90ZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEtpbGxhYmxlRXhlY3V0aW9uKSB7Ci0JCQlLaWxsYWJsZUV4ZWN1dGlvbiBraWxsYWJsZUV4ZWN1dGlvbiA9IChLaWxsYWJsZUV4ZWN1dGlvbikgb3BlcmF0aW9uOwotCQkJYWN0aXZlUHJvY2Vzc1RhYmxlLnB1dChuZXcgSW50ZWdlcihraWxsYWJsZUV4ZWN1dGlvbi5nZXRJbnRlcm5hSUQoKSksIGtpbGxhYmxlRXhlY3V0aW9uKTsKLQkJCWV4ZWN1dGlvbk9ic2VydmVyLm5ld0NvbW1hbmQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1bnJlZ2lzdGVyT2JzZXJ2ZWRFeGVjdXRpb24oSVJlbW90ZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEtpbGxhYmxlRXhlY3V0aW9uKSB7Ci0JCQlLaWxsYWJsZUV4ZWN1dGlvbiBraWxsYWJsZUV4ZWN1dGlvbiA9IChLaWxsYWJsZUV4ZWN1dGlvbikgb3BlcmF0aW9uOwotCQkJYWN0aXZlUHJvY2Vzc1RhYmxlLnJlbW92ZShuZXcgSW50ZWdlcihraWxsYWJsZUV4ZWN1dGlvbi5nZXRJbnRlcm5hSUQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRLaWxsYWJsZVByZWZpeChLaWxsYWJsZUV4ZWN1dGlvbiBleGVjdXRpb24pIHsKLQkJcmV0dXJuIGNvbnRyb2xDaGFubmVsLmdldEtpbGxhYmxlUHJlZml4KGV4ZWN1dGlvbi5nZXRJbnRlcm5hSUQoKSk7Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSBLSUxMIHNpZ25hbCB0byB0aGUgcmVtb3RlIGtpbGxhYmxlIGV4ZWN1dGlvbi4KLQkgKiBAcGFyYW0gZXhlY3V0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQga2lsbEV4ZWN1dGlvbihLaWxsYWJsZUV4ZWN1dGlvbiBleGVjdXRpb24pIHsKLQkJY29udHJvbENoYW5uZWwua2lsbFJlbW90ZVByb2Nlc3MoZXhlY3V0aW9uLmdldFBJRCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBob3N0IGFuZCBhZGQgdGhpcyBjb25uZWN0aW9uIHRvIHRoZSBwb29sLgotCSAqIEByZXR1cm4gQSBwb29sIGVudHJ5LgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgQ29ubmVjdGlvblNsb3QgY3JlYXRlQ29ubmVjaXRvblNsb3QoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGEgSnNjaCBzZXNzaW9uLCB3aXRoIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzZXNzaW9uLgotCQkgKi8KLQkJU2Vzc2lvbiBuZXdTZXNzaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5ld1Nlc3Npb24gPSBqc2NoLmdldFNlc3Npb24odXNlcm5hbWUsIGhvc3RuYW1lLCBwb3J0KTsKLQkJCW5ld1Nlc3Npb24uc2V0VXNlckluZm8oc3NodXNlcmluZm8pOwotCQkJc2V0U2Vzc2lvbkNpcGhlclR5cGUobmV3U2Vzc2lvbik7Ci0JCX0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuQ29ubmVjdGlvbl9DcmVhdGVDb25uZWN0aW9uU2xvdF9GYWlsZWRDcmVhdGVOZXdTZXNzaW9uLCBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbm5lY3QgdG8gcmVtb3RlIGhvc3QuCi0JCSAqLwotCQl0cnkgewotCQkJbmV3U2Vzc2lvbi5jb25uZWN0KHRpbWVvdXQpOwotCQl9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkNvbm5lY3Rpb25fQ3JlYXRlQ29ubmVjdGlvblNsb3RfRmFpbGVkQ29ubmVjdE5ld1Nlc3Npb24sIGUpOwotCQl9Ci0KLQkJLyoKLQkJICogQ3JlYXRlIHNsb3QgYW5kIGFkZCB0byB0aGUgcG9vbC4KLQkJICovCi0JCUNvbm5lY3Rpb25TbG90IHNsb3QgPSBuZXcgQ29ubmVjdGlvblNsb3QobmV3U2Vzc2lvbik7Ci0JCWNvbm5lY3Rpb25Qb29sLmFkZChzbG90KTsKLQkJcmV0dXJuIHNsb3Q7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgY2lwaGVyIGZvciB0aGUgc2Vzc2lvbiBiYXNlZCBvbiB0aGUgY2lwaGVyVHlwZSBhdHRyaWJ1dGUKLQkgKgotCSAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdGhhdCB3aWxsIGhhdmUgaXRzIGNpcGhlciBhbHRlcmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZXNzaW9uQ2lwaGVyVHlwZShTZXNzaW9uIHNlc3Npb24pIHsKLQkJLyoKLQkJICogSWYgdGhlIHVzZXIgc2VsZWN0ZWQgYSBjaXBoZXIgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCwgc2V0dXAgdGhlIGNpcGhlcgotCQkgKgotCQkgKi8KLQkJLy8gVE9ETzogTGV0IHRoZSB1c2VyIHNlbGVjdCBhIGxpc3Qgb2YgY2lwaGVycywgaW5zdGVhZCBvZiBvbmx5IG9uZQotCQlpZighY2lwaGVyVHlwZS5lcXVhbHMoQ2lwaGVyVHlwZXMuQ0lQSEVSX0RFRkFVTFQpKSB7Ci0KLQkJCS8vIFZlcmlmeSBpZiB0aGUgY2lwaGVyIGlzIHN1cHBvcnRlZC4gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGlzbnQuCi0JCQlpZighQ2lwaGVyVHlwZXMuZ2V0Q2lwaGVyVHlwZXNNYXAoKS5jb250YWluc0tleShjaXBoZXJUeXBlKSkgewotCQkJCS8vIFRPRE86IFRocm93IGEgcmVhbCBleGNlcHRpb24sIG5vdCBhIHJ1bnRpbWUgb25lCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuQ29ubmVjdGlvbl9TZXRDaXBoZXJUeXBlX0NpcGhlck5vdFN1cHBvcnRlZCk7Ci0JCQl9Ci0KLQkJCS8vIFNldCB0aGUgc2Vzc2lvbidzIGNpcGhlcgotCQkJSGFzaHRhYmxlIGNvbmZpZz1uZXcgSGFzaHRhYmxlKCk7Ci0JCQljb25maWcucHV0KCJjaXBoZXIuczJjIiwgY2lwaGVyVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbmZpZy5wdXQoImNpcGhlci5jMnMiLCBjaXBoZXJUeXBlKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzZXNzaW9uLnNldENvbmZpZyhjb25maWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSBzYW5pdHkgdGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBhbGl2ZSBhbmQgaGFzIGEgdmFsaWQgc3RhdGUuCi0JICogPHA+Ci0JICogVGhlIGNvbm5lY3Rpb24gbWF5IGdldCBkcm9wcGVkIGR1ZSBzb21lIGV4dGVybmFsIGludGVyZmVyZW5jZSwgbGlrZSBsb29zaW5nIHBoeXNpY2FsCi0JICogYWNjZXNzIHRvIHRoZSByZW1vdGUgbWFjaGluZS4KLQkgKiBPciB0aGUgY29ubmVjdGlvbiBtYXkgZHJvcCBzb21lIGNoYW5uZWwsIGFzIGl0IG1heSBiZSBjYXVzZWQgYnkgYSBtaXNiZWhhdmlvcgotCSAqIG9mIHRoZSByZW1vdGUgU1NIIHNlcnZlciBvciBieSBhIGJ1ZyBpbiB0aGUgbG9jYWwgU1NIIGltcGxlbWVudGF0aW9uLgotCSAqIDxwPgotCSAqIElmIHNvbWUgcHJvYmxlbSBpcyBkZXRlY3RlZCwgdGhlbiBhbiB7QGxpbmsgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duLgotCSAqIEVsc2UsIHRoZSBtZXRob2QgcmV0dXJucy4KLQkgKgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBUaGUgY29ubmVjdGlvbiB3YXMgZW50aXJlbHkgZHJvcHBlZCBvciBzb21lIGNoYW5uZWwgZ290IGxvc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogQ2hlY2sgYWxsIFNTSCBzZXNzaW9ucwotCQkgKi8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9uUG9vbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDb25uZWN0aW9uU2xvdCBzbG90ID0gKENvbm5lY3Rpb25TbG90KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoISBzbG90LnNlc3Npb24uaXNDb25uZWN0ZWQoKSkgewotCQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKCJTU0ggY29ubmVjdGlvbiB0byByZW1vdGUgaG9zdCB3YXMgbG9zdCIpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgU0ZUUCBjaGFubmVsLgotCQkgKi8KLQkJaWYgKCEgc2Z0cENoYW5uZWwuaXNDb25uZWN0ZWQoKSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oIlNGVFAgY29ubmVjdGlvbiB0byByZW1vdGUgaG9zdCB3YXMgbG9zdCIpOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgY29udHJvbCBjaGFubmVsLgotCQkgKi8KLQkJaWYgKCEgY29udHJvbENoYW5uZWwuc2hlbGwuaXNDb25uZWN0ZWQoKSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24oIkNvbnRyb2wgY2hhbm5lbCBjb25uZWN0aW9uIHRvIHJlbW90ZSBob3N0IHdhcyBsb3N0Iik7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9Db25uZWN0aW9uTG9ja3MuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0Nvbm5lY3Rpb25Mb2Nrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNlODdiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0Nvbm5lY3Rpb25Mb2Nrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IHN1bi5hd3QuZGF0YXRyYW5zZmVyLkRhdGFUcmFuc2ZlcmVyLlJlZW5jb2RpbmdJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENvbm5lY3Rpb25Mb2NrcyB7Ci0JcHJvdGVjdGVkIFJlZW50cmFudExvY2sgcmVtb3RlUG9ydEZvcndhcmRpbmcgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCXByb3RlY3RlZCBSZWVudHJhbnRMb2NrIGxvY2FsUG9ydEZvcndhcmRpbmcgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvQ29udHJvbENoYW5uZWwuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0NvbnRyb2xDaGFubmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlMGRjNGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvQ29udHJvbENoYW5uZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvbW1vbi5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMuc3RyZWFtLklMaW5lU3RyZWFtTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnN0cmVhbS5UZXh0U3RyZWFtT2JzZXJ2ZXI7Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbEV4ZWM7Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb250cm9sQ2hhbm5lbCBpbXBsZW1lbnRzIElMaW5lU3RyZWFtTGlzdGVuZXIgewotCS8qCi0JICogUGF0dGVybnMgcmVjb2duaXplZCBieSB0aGUgb2JzZXJ2ZXIuCi0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBtYXJrZXIgPSAiLy8iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBtYXJrZXJQSUQgPSAiUElEOiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIG1hcmtlclBJSUQgPSAiUElJRDoiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBtYXJrZXJTU0ggPSAiU1NIX1RUWToiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgUGF0dGVybiBwaWRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeIiArIG1hcmtlciArIG1hcmtlclBJRCArICJcXHB7RGlnaXR9KyIgKyBtYXJrZXIgKyBtYXJrZXJQSUlEIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJKyAiXFxwe0RpZ2l0fSsiICsgbWFya2VyICsgIiQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JZmluYWwgUGF0dGVybiBwaWRGaWx0ZXJQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXHB7RGlnaXR9KyIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgUGF0dGVybiB0ZXJtaW5hbFBhdGhQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeIiArIG1hcmtlciArIG1hcmtlclNTSCArICIuKyIgKyBtYXJrZXIgKyAiJCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JLy8gT3V0cHV0U3RyZWFtIHRoYXQgc2VuZHMgaW5wdXQgdG8gcmVtb3RlIHByb2Nlc3MgaW5wdXQgc3RyZWFtLgotCU91dHB1dFN0cmVhbSBvdXRwdXRUb0NvbnRyb2xUZXJtaW5hbElucHV0OwotCUlucHV0U3RyZWFtIGlucHV0RnJvbUNvbnRyb2xUZXJtaW5hbE91dHB1dDsKLQotCS8vIENvbnRyb2wgY2hhbm5lbAotCUNoYW5uZWxFeGVjIHNoZWxsOwotCi0JLy8gQ29udHJvbCB0ZXJtaW5hbCBwYXRoLgotCVN0cmluZyBjb250cm9sVGVybWluYWxQYXRoOwotCi0JLy8gQ29udHJvbCB0ZXJtaW5hbCBvYnNlcnZlciB0aHJlYWQuCi0JVGV4dFN0cmVhbU9ic2VydmVyIGNvbnRyb2xUZXJtaW5hbE9ic2VydmVyOwotCi0JLyoqCi0JICogUGFyZW50IGV4ZWN1dGlvbiBtYW5hZ2VyIHdobyB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IGV2ZW50cyBmcm9tIHRoZSBjb250cm9sIGNoYW5uZWwuCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0KLQlwdWJsaWMgQ29udHJvbENoYW5uZWwoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeXsKLQkJCS8vIE9wZW4gZXhlYyBjaGFubmVsIGFuZCBhbGxvYyB0ZXJtaW5hbAotCQkJc2hlbGwgPSBjb25uZWN0aW9uLmNyZWF0ZUV4ZWNDaGFubmVsKGZhbHNlKTsKLQkJCXNoZWxsLnNldFB0eSh0cnVlKTsKLQkJCXNoZWxsLnNldENvbW1hbmQoIi9iaW4vYmFzaCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnB1dEZyb21Db250cm9sVGVybWluYWxPdXRwdXQgPSBzaGVsbC5nZXRJbnB1dFN0cmVhbSgpOwotCQkJb3V0cHV0VG9Db250cm9sVGVybWluYWxJbnB1dCA9IHNoZWxsLmdldE91dHB1dFN0cmVhbSgpOwotCQkJc2hlbGwuY29ubmVjdCgpOwotCQl9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKLQkJCWNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Db250cm9sQ2hhbm5lbF9PcGVuX0ZhaWxlZENyZWF0ZUF1eGlsaWFyeVNoZWxsLCBlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY2xvc2UoKTsKLQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkNvbnRyb2xDaGFubmVsX09wZW5fRmFpbGVkQ3JlYXRlSU9TdHJlYW0sIGUpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgc3RyZWFtIG9ic2VydmVyIGFuZCBzdGFydCBpdAotCQljb250cm9sVGVybWluYWxPYnNlcnZlciA9IG5ldyBUZXh0U3RyZWFtT2JzZXJ2ZXIoaW5wdXRGcm9tQ29udHJvbFRlcm1pbmFsT3V0cHV0LCB0aGlzKTsKLQkJY29udHJvbFRlcm1pbmFsT2JzZXJ2ZXIuc3RhcnQoKTsKLQkJCi0JCXRyeSB7Ci0JCQkvLyBDbGVhbiBzaGVsbCBwcm9tcHQuCi0JCQlvdXRwdXRUb0NvbnRyb2xUZXJtaW5hbElucHV0LndyaXRlKCJleHBvcnQgUFMxPVxuIi5nZXRCeXRlcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBXcml0ZSB0ZXJtaW5hbCBwYXRoIG9uIGNvbnRyb2wgY2hhbm5lbCwgdG8gYmUgcmVhZCBieSB0aGUgb2JzZXJ2ZXIKLQkJCS8vICIvL1NTSF9UVFk6ICRTU0hfVFRZLy9cIlxuIgotCQkJb3V0cHV0VG9Db250cm9sVGVybWluYWxJbnB1dC53cml0ZShuZXcgU3RyaW5nKCJlY2hvIFwiIiArIG1hcmtlciArIG1hcmtlclNTSCArICIkU1NIX1RUWSIgKyBtYXJrZXIgKyAiXCJcbiIpLmdldEJ5dGVzKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJLy9vdXRwdXRUb0NvbnRyb2xUZXJtaW5hbElucHV0LndyaXRlKG5ldyBTdHJpbmcoImVjaG8gaGVsbG93b3JsZCA+IC90bXAvaGVsbG93b3JsZFxuIikuZ2V0Qnl0ZXMoKSk7Ci0JCQlvdXRwdXRUb0NvbnRyb2xUZXJtaW5hbElucHV0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkNvbnRyb2xDaGFubmVsX09wZW5fRmFpbGVkU2VuZEluaXRDb21tYW5kcywgZSk7Ci0JCX0KLQkJCi0JCS8vIFdhaXQgdW50aWwgdGhlIGNoYW5uZWwgYW5zd2VycyB0aGUgdGVybWluYWwgcGF0aAotCQlEZWJ1Zy5wcmludGxuMihNZXNzYWdlcy5Db250cm9sQ2hhbm5lbF9EZWJ1Z19TdGFydGVkV2FpdGluZ0NvbnRyb2xUZXJtaW5hbFBhdGgpOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXdoaWxlIChjb250cm9sVGVybWluYWxQYXRoID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl0aGlzLndhaXQoMjAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkNvbnRyb2xDaGFubmVsX09wZW5fV2FpdENvbnRyb2xUZXJtaW5hbFBhdGhJbnRlcnJ1cHRlZCwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCURlYnVnLnByaW50bG4yKE1lc3NhZ2VzLkNvbnRyb2xDaGFubmVsX0RlYnVnX1JlY2VpdmVkQ29udHJvbFRlcm1pbmFsUGF0aCArIGNvbnRyb2xUZXJtaW5hbFBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld0xpbmUoU3RyaW5nIGxpbmUpIHsKLQkJRGVidWcucHJpbnRsbjIoTWVzc2FnZXMuQ29udHJvbENoYW5uZWxfRGVidWdfQ29udHJvbENvbm5lY3Rpb25SZWNlaXZlZCArIGxpbmUpOwotCQkvKgotCQkgKiBUZXN0IGlmIHRoZSBsaW5lIGNvbnRhaW5zIGEgUElELgotCQkgKi8KLQkJTWF0Y2hlciBwaWRtYXRjaCA9IHBpZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLQkJaWYgKHBpZG1hdGNoLmZpbmQoKSkgewotCQkJTWF0Y2hlciBwaWRtYXRjaDIgPSBwaWRGaWx0ZXJQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0JCQlwaWRtYXRjaDIuZmluZCgpOwotCQkJU3RyaW5nIHRlbXBwaWQgPSBwaWRtYXRjaDIuZ3JvdXAoKTsKLQkJCXBpZG1hdGNoMi5maW5kKCk7Ci0JCQlTdHJpbmcgdGVtcHBpaWQgPSBwaWRtYXRjaDIuZ3JvdXAoKTsKLQkJCWNvbm5lY3Rpb24uc2V0UElEKEludGVnZXIucGFyc2VJbnQodGVtcHBpaWQpLCBJbnRlZ2VyLnBhcnNlSW50KHRlbXBwaWQpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCU1hdGNoZXIgdGVybWluYWxQYXRoTWF0Y2hlciA9IHRlcm1pbmFsUGF0aFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLQkJaWYgKHRlcm1pbmFsUGF0aE1hdGNoZXIuZmluZCgpKSB7Ci0JCQlpbnQgcHJlID0gbmV3IFN0cmluZyhtYXJrZXIgKyBtYXJrZXJTU0gpLmxlbmd0aCgpOwotCQkJaW50IHBvcyA9IG1hcmtlci5sZW5ndGgoKTsKLQotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY29udHJvbFRlcm1pbmFsUGF0aCA9IGxpbmUuc3Vic3RyaW5nKHByZSwgbGluZS5sZW5ndGgoKSAtIHBvcyk7Ci0JCQkJdGhpcy5ub3RpZnlBbGwoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc3RyZWFtQ2xvc2VkKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHN0cmVhbUVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0JCURlYnVnLnByaW50bG4yKE1lc3NhZ2VzLkNvbnRyb2xDaGFubmVsX0RlYnVnX0NvbnRyb2xDb25uZWN0aW9uUmVjZWl2ZWQgKyBlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldENvbnRyb2xUZXJtaW5hbFBhdGgoKSB7Ci0JCXJldHVybiBjb250cm9sVGVybWluYWxQYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIGtpbGxSZW1vdGVQcm9jZXNzKGludCBwaWQpIHsKLQkJdHJ5IHsKLQkJCW91dHB1dFRvQ29udHJvbFRlcm1pbmFsSW5wdXQud3JpdGUobmV3IFN0cmluZygia2lsbCAtOSAiICsgcGlkICsgIlxuIikuZ2V0Qnl0ZXMoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0cHV0VG9Db250cm9sVGVybWluYWxJbnB1dC5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRLaWxsYWJsZVByZWZpeChpbnQgaW50ZXJuYUlEKSB7Ci0JCXJldHVybiAiZWNobyAiICsgbWFya2VyICsgbWFya2VyUElEICsgIiQkIiArIG1hcmtlciArIG1hcmtlclBJSUQgKyBJbnRlZ2VyLnRvU3RyaW5nKGludGVybmFJRCkgKyBtYXJrZXIgKyAiID4gIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSsgY29udHJvbFRlcm1pbmFsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJaWYgKGNvbnRyb2xUZXJtaW5hbE9ic2VydmVyICE9IG51bGwpIHsgCi0JCQljb250cm9sVGVybWluYWxPYnNlcnZlci5raWxsKCk7Ci0JCX0KLQkJY29udHJvbFRlcm1pbmFsT2JzZXJ2ZXIgPSBudWxsOwotCQlvdXRwdXRUb0NvbnRyb2xUZXJtaW5hbElucHV0ID0gbnVsbDsKLQkJaW5wdXRGcm9tQ29udHJvbFRlcm1pbmFsT3V0cHV0ID0gbnVsbDsKLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXNoZWxsLmRpc2Nvbm5lY3QoKTsKLQkJfQotCQlzaGVsbCA9IG51bGw7Ci0JCWNvbm5lY3Rpb24gPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0NvcHlUb29scy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvQ29weVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YjU1NzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvQ29weVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuUmVtb3RldG9vbHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUNvcHlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRG93bmxvYWRFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVVwbG9hZEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvbW1vbi5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5maWxlLkZpbGVFbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5maWxlLkZpbGVSZWN1cnNpdmVFbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvcHlUb29scyBpbXBsZW1lbnRzIElSZW1vdGVDb3B5VG9vbHMgewotCQotCUV4ZWN1dGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlGaWxlVG9vbHMgcmVtb3RlRmlsZVRvb2xzOwotCQotCXB1YmxpYyBDb3B5VG9vbHMoRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXJlbW90ZUZpbGVUb29scyA9IG5ldyBGaWxlVG9vbHMobWFuYWdlcik7Ci0JfQotCi0JcHVibGljIElSZW1vdGVEb3dubG9hZEV4ZWN1dGlvbiBleGVjdXRlRG93bmxvYWQoU3RyaW5nIHJlbW90ZUZpbGUsIE91dHB1dFN0cmVhbSBzaW5rKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCURvd25sb2FkRXhlY3V0aW9uIGV4ZWN1dGlvbiA9IG5ldyBEb3dubG9hZEV4ZWN1dGlvbihtYW5hZ2VyLCByZW1vdGVGaWxlLCBzaW5rKTsKLQkJZXhlY3V0aW9uLnN0YXJ0RXhlY3V0aW9uKCk7Ci0JCXJldHVybiBleGVjdXRpb247Ci0JfQotCi0JcHVibGljIElSZW1vdGVEb3dubG9hZEV4ZWN1dGlvbiBleGVjdXRlRG93bmxvYWQoU3RyaW5nIHJlbW90ZUZpbGUpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVEb3dubG9hZChyZW1vdGVGaWxlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVJlbW90ZVVwbG9hZEV4ZWN1dGlvbiBleGVjdXRlVXBsb2FkKFN0cmluZyByZW1vdGVGaWxlLCBJbnB1dFN0cmVhbSBzb3VyY2UpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJVXBsb2FkRXhlY3V0aW9uIGV4ZWN1dGlvbiA9IG5ldyBVcGxvYWRFeGVjdXRpb24obWFuYWdlciwgcmVtb3RlRmlsZSwgc291cmNlKTsKLQkJZXhlY3V0aW9uLnN0YXJ0RXhlY3V0aW9uKCk7Ci0JCXJldHVybiBleGVjdXRpb247Ci0JfQotCi0JcHVibGljIElSZW1vdGVVcGxvYWRFeGVjdXRpb24gZXhlY3V0ZVVwbG9hZChTdHJpbmcgcmVtb3RlRmlsZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZVVwbG9hZChyZW1vdGVGaWxlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb3dubG9hZEZpbGVUb0RpcihTdHJpbmcgcmVtb3RlUGF0aCwgRmlsZSBsb2NhbERpcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIHsKLQkJcmVtb3RlRmlsZVRvb2xzLnZhbGlkYXRlUmVtb3RlUGF0aChyZW1vdGVQYXRoKTsKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbERpciwgcmVtb3RlRmlsZVRvb2xzLnN1ZmZpeE9mUmVtb3RlUGF0aChyZW1vdGVQYXRoKSk7Ci0JCWlmICghbG9jYWxEaXIuZXhpc3RzKCkpIHsKLQkJCWlmICghIGxvY2FsRGlyLm1rZGlycygpKSB7Ci0JCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZCgiRmFpbGVkIHRvIGNyZWF0ZSBsb2NhbCBkaXJlY3RvcnkgezB9IiwgbG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCX0KLQkJfQotCQlkb0Rvd25sb2FkRmlsZVRvRmlsZShyZW1vdGVQYXRoLCBsb2NhbEZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvd25sb2FkRmlsZVRvRGlyKFN0cmluZyByZW1vdGVQYXRoLCBTdHJpbmcgbG9jYWxQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCQlGaWxlIGxvY2FsRGlyID0gbmV3IEZpbGUobG9jYWxQYXRoKTsKLQkJZG93bmxvYWRGaWxlVG9EaXIocmVtb3RlUGF0aCwgbG9jYWxEaXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvd25sb2FkRmlsZVRvRmlsZShTdHJpbmcgcmVtb3RlUGF0aCwgRmlsZSBsb2NhbEZpbGUpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlbW90ZUZpbGVUb29scy52YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0JCUZpbGUgbG9jYWxEaXIgPSBsb2NhbEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoIWxvY2FsRGlyLmV4aXN0cygpKSB7Ci0JCQlpZiAoISBsb2NhbERpci5ta2RpcnMoKSkgewotCQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oTkxTLmJpbmQoIkZhaWxlZCB0byBjcmVhdGUgbG9jYWwgZGlyZWN0b3J5IHswfSIsIGxvY2FsRGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQl9Ci0JCX0KLQkJZG9Eb3dubG9hZEZpbGVUb0ZpbGUocmVtb3RlUGF0aCwgbG9jYWxGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb3dubG9hZEZpbGVUb0ZpbGUoU3RyaW5nIHJlbW90ZVBhdGgsIFN0cmluZyBsb2NhbFBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxQYXRoKTsKLQkJZG93bmxvYWRGaWxlVG9GaWxlKHJlbW90ZVBhdGgsIGxvY2FsRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBsb2FkRmlsZVRvRGlyKEZpbGUgbG9jYWxGaWxlLCBTdHJpbmcgcmVtb3RlUGF0aCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIHsKLS8vCQlyZW1vdGVGaWxlVG9vbHMudmFsaWRhdGVSZW1vdGVQYXRoKGxvY2FsRmlsZSk7Ci0JCXJlbW90ZUZpbGVUb29scy52YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0JCXJlbW90ZUZpbGVUb29scy5hc3N1cmVEaXJlY3RvcnkocmVtb3RlUGF0aCk7Ci0JCXJlbW90ZVBhdGggPSByZW1vdGVGaWxlVG9vbHMuY29uY2F0ZW5hdGVSZW1vdGVQYXRoKHJlbW90ZVBhdGgsIGxvY2FsRmlsZS5nZXROYW1lKCkpOwotCQlkb1VwbG9hZEZpbGVUb0ZpbGUobG9jYWxGaWxlLCByZW1vdGVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGxvYWRGaWxlVG9EaXIoU3RyaW5nIGxvY2FsUGF0aCwgU3RyaW5nIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxQYXRoKTsKLQkJdXBsb2FkRmlsZVRvRGlyKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBsb2FkRmlsZVRvRmlsZShGaWxlIGxvY2FsRmlsZSwgU3RyaW5nIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlbW90ZUZpbGVUb29scy52YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0JCXJlbW90ZUZpbGVUb29scy5hc3N1cmVEaXJlY3RvcnkocmVtb3RlRmlsZVRvb2xzLnBhcmVudE9mUmVtb3RlUGF0aChyZW1vdGVQYXRoKSk7Ci0JCWRvVXBsb2FkRmlsZVRvRmlsZShsb2NhbEZpbGUsIHJlbW90ZVBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwbG9hZEZpbGVUb0ZpbGUoU3RyaW5nIGxvY2FsUGF0aCwgU3RyaW5nIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxQYXRoKTsKLQkJdXBsb2FkRmlsZVRvRmlsZShsb2NhbEZpbGUsIHJlbW90ZVBhdGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb0Rvd25sb2FkRmlsZVRvRmlsZShTdHJpbmcgcmVtb3RlUGF0aCwgRmlsZSBsb2NhbEZpbGUpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gc2luazsKLQkJdHJ5IHsKLQkJCXNpbmsgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5Db3B5VG9vbHNfZG9Eb3dubG9hZEZpbGVUb0ZpbGVfQ2Fubm90V3JpdGVGaWxlLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JCUlSZW1vdGVEb3dubG9hZEV4ZWN1dGlvbiBleGVjdXRpb24gPSBleGVjdXRlRG93bmxvYWQocmVtb3RlUGF0aCwgc2luayk7Ci0JCXRyeSB7Ci0JCQlleGVjdXRpb24ud2FpdEZvckVuZE9mRXhlY3V0aW9uKCk7Ci0JCX0gY2F0Y2ggKFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkNvcHlUb29sc19kb0Rvd25sb2FkRmlsZVRvRmlsZV9FeGVjdXRpb25GYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCX0KLQkJaWYgKGV4ZWN1dGlvbi5nZXRSZXR1cm5Db2RlKCkgIT0gMCkgewotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5Db3B5VG9vbHNfZG9Eb3dubG9hZEZpbGVUb0ZpbGVfQ29tbWFuZEZhaWxlcywgSW50ZWdlci50b1N0cmluZyhleGVjdXRpb24uZ2V0UmV0dXJuQ29kZSgpKSkpOwotCQl9Ci0JCWV4ZWN1dGlvbi5jbG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1VwbG9hZEZpbGVUb0ZpbGUoRmlsZSBsb2NhbEZpbGUsIFN0cmluZyByZW1vdGVQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCQlGaWxlSW5wdXRTdHJlYW0gc291cmNlOwotCQl0cnkgewotCQkJc291cmNlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhbEZpbGUpOyAKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuQ29weVRvb2xzX2RvVXBsb2FkRmlsZUZyb21GaWxlX0Nhbm5vdFJlYWRGaWxlLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JCUlSZW1vdGVVcGxvYWRFeGVjdXRpb24gZXhlY3V0aW9uID0gZXhlY3V0ZVVwbG9hZChyZW1vdGVQYXRoLCBzb3VyY2UpOwotCQl0cnkgewotCQkJZXhlY3V0aW9uLndhaXRGb3JFbmRPZkV4ZWN1dGlvbigpOwotCQl9IGNhdGNoIChSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5Db3B5VG9vbHNfZG9VcGxvYWRGaWxlRnJvbUZpbGVfRXhlY3V0aW9uRmFpbGVkLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JCWlmIChleGVjdXRpb24uZ2V0UmV0dXJuQ29kZSgpICE9IDApIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuQ29weVRvb2xzX2RvVXBsb2FkRmlsZUZyb21GaWxlX0NvbW1hbmRGYWlsZWQsIEludGVnZXIudG9TdHJpbmcoZXhlY3V0aW9uLmdldFJldHVybkNvZGUoKSkpKTsKLQkJfQotCQlleGVjdXRpb24uY2xvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG93bmxvYWREaXJUb0RpcihTdHJpbmcgcmVtb3RlUGF0aCwgRmlsZSBsb2NhbERpciwgYm9vbGVhbiByZWN1cnNpdmUpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXJlbW90ZUZpbGVUb29scy52YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0vLwkJcmVtb3RlRmlsZVRvb2xzLnZhbGlkYXRlUmVtb3RlRGlyKHJlbW90ZVBhdGgpOwotCQlyZW1vdGVQYXRoID0gcmVtb3RlRmlsZVRvb2xzLmFkZFRyYWlsaW5nU2xhc2gocmVtb3RlUGF0aCk7Ci0JCWlmICghbG9jYWxEaXIuZXhpc3RzKCkpIHsKLQkJCWlmICghIGxvY2FsRGlyLm1rZGlycygpKSB7Ci0JCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZCgiRmFpbGVkIHRvIGNyZWF0ZSBsb2NhbCBkaXJlY3RvcnkgezB9IiwgbG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCX0KLQkJfQotCQotCQlFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbjsKLQkJdHJ5IHsKLQkJCWlmIChyZWN1cnNpdmUpIHsKLQkJCQllbnVtZXJhdGlvbiA9IG5ldyBSZW1vdGVGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24ocmVtb3RlRmlsZVRvb2xzLCByZW1vdGVGaWxlVG9vbHMucmVtb3ZlVHJhaWxpbmdTbGFzaChyZW1vdGVQYXRoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWVudW1lcmF0aW9uID0gbmV3IFJlbW90ZUZpbGVFbnVtZXJhdGlvbihyZW1vdGVGaWxlVG9vbHMsIHJlbW90ZUZpbGVUb29scy5yZW1vdmVUcmFpbGluZ1NsYXNoKHJlbW90ZVBhdGgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyByZW1vdGVGaWxlUGF0aCA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVtb3RlRmlsZVBhdGguc3Vic3RyaW5nKHJlbW90ZVBhdGgubGVuZ3RoKCkpOwotCQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbERpciwgcmVsYXRpdmVQYXRoKTsKLQkJCi0JCQlpZiAocmVtb3RlRmlsZVRvb2xzLmhhc0RpcmVjdG9yeShyZW1vdGVGaWxlUGF0aCkpIHsKLQkJCQkvLyBDcmVhdGUgZGlyZWN0b3J5IG9uIHRoZSByZW1vdGUgaG9zdAotCQkJCURlYnVnLnByaW50bG4oIkNyZWF0ZTogIiArIHJlbW90ZUZpbGVQYXRoKTsKLQkJCQlpZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoISBsb2NhbERpci5ta2RpcnMoKSkgewotCQkJCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZCgiRmFpbGVkIHRvIGNyZWF0ZSBsb2NhbCBkaXJlY3RvcnkgezB9IiwgbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIENvcHkgdG8gdGhlIHJlbW90ZSBob3N0Ci0JCQkJRGVidWcucHJpbnRsbihyZWxhdGl2ZVBhdGggKyAiIC0+ICIgKyByZW1vdGVGaWxlUGF0aCk7Ci0JCQkJZG9Eb3dubG9hZEZpbGVUb0ZpbGUocmVtb3RlRmlsZVBhdGgsIGxvY2FsRmlsZSk7Ci0JCQl9Ci0JCX0KLQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb3dubG9hZERpclRvRGlyKFN0cmluZyByZW1vdGVQYXRoLCBTdHJpbmcgbG9jYWxQYXRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJRmlsZSBsb2NhbERpciA9IG5ldyBGaWxlKGxvY2FsUGF0aCk7Ci0JCWRvd25sb2FkRGlyVG9EaXIocmVtb3RlUGF0aCwgbG9jYWxEaXIsIHJlY3Vyc2l2ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwbG9hZERpclRvRGlyKEZpbGUgbG9jYWxEaXIsIFN0cmluZyByZW1vdGVQYXRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLS8vCQlyZW1vdGVGaWxlVG9vbHMudmFsaWRhdGVMb2NhbERpcihsb2NhbERpcik7Ci0JCXJlbW90ZUZpbGVUb29scy52YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0JCXJlbW90ZUZpbGVUb29scy5hc3N1cmVEaXJlY3RvcnkocmVtb3RlUGF0aCk7Ci0JCQotCQlFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbjsKLQkJdHJ5IHsKLQkJCWlmIChyZWN1cnNpdmUpIHsKLQkJCQllbnVtZXJhdGlvbiA9IG5ldyBGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24obG9jYWxEaXIpOwotCQkJfSBlbHNlIHsKLQkJCQllbnVtZXJhdGlvbiA9IG5ldyBGaWxlRW51bWVyYXRpb24obG9jYWxEaXIpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQkJCi0JCi0JCVN0cmluZyByb290UGF0aDsKLQkJdHJ5IHsKLQkJCXJvb3RQYXRoID0gbG9jYWxEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwkJCQotCQl9Ci0JCQotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nIHJlbGF0aXZlUGF0aDsKLQkJCXRyeSB7Ci0JCQkJcmVsYXRpdmVQYXRoID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCkuc3Vic3RyaW5nKHJvb3RQYXRoLmxlbmd0aCgpKzEpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCQotCQkJU3RyaW5nIHJlbW90ZUZpbGVQYXRoID0gcmVtb3RlRmlsZVRvb2xzLmNvbmNhdGVuYXRlUmVtb3RlUGF0aChyZW1vdGVQYXRoLCByZWxhdGl2ZVBhdGgpOwotCQkJCi0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gQ3JlYXRlIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlIGhvc3QKLQkJCQlEZWJ1Zy5wcmludGxuKCJDcmVhdGU6ICIgKyByZW1vdGVGaWxlUGF0aCk7Ci0JCQkJcmVtb3RlRmlsZVRvb2xzLmFzc3VyZURpcmVjdG9yeShyZW1vdGVGaWxlUGF0aCk7Ci0JCQkJcmVtb3RlRmlsZVRvb2xzLnVwbG9hZFBlcm1pc3Npb25zKGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCksIHJlbW90ZUZpbGVQYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQ29weSB0byB0aGUgcmVtb3RlIGhvc3QKLQkJCQlEZWJ1Zy5wcmludGxuKHJlbGF0aXZlUGF0aCArICIgLT4gIiArIHJlbW90ZUZpbGVQYXRoKTsKLQkJCQlkb1VwbG9hZEZpbGVUb0ZpbGUoZmlsZSwgcmVtb3RlRmlsZVBhdGgpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVwbG9hZERpclRvRGlyKFN0cmluZyBsb2NhbFBhdGgsIFN0cmluZyByZW1vdGVQYXRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbFBhdGgpOwotCQl1cGxvYWREaXJUb0Rpcihsb2NhbEZpbGUsIHJlbW90ZVBhdGgsIHJlY3Vyc2l2ZSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0Rvd25sb2FkRXhlY3V0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9Eb3dubG9hZEV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzhiYzAyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0Rvd25sb2FkRXhlY3V0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRG93bmxvYWRFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBhdGhUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvbW1vbi5EZWJ1ZzsKLQotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsRXhlYzsKLQotcHVibGljIGNsYXNzIERvd25sb2FkRXhlY3V0aW9uIGV4dGVuZHMgS2lsbGFibGVFeGVjdXRpb24gaW1wbGVtZW50cyBJUmVtb3RlRG93bmxvYWRFeGVjdXRpb24gewotCi0JU3RyaW5nIHJlbW90ZUZpbGU7Ci0JT3V0cHV0U3RyZWFtIHNpbmtTdHJlYW07Ci0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVycm9yU3RyZWFtOwotCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCQotCXB1YmxpYyBEb3dubG9hZEV4ZWN1dGlvbihFeGVjdXRpb25NYW5hZ2VyIGV4ZWN1dGlvbk1hbmFnZXIsIFN0cmluZyByZW1vdGVGaWxlLCBPdXRwdXRTdHJlYW0gc2luaykgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlzdXBlcihleGVjdXRpb25NYW5hZ2VyKTsKLQkJdGhpcy5yZW1vdGVGaWxlID0gcmVtb3RlRmlsZTsKLQkJdGhpcy5zaW5rU3RyZWFtID0gc2luazsKLQkJZXJyb3JTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtRnJvbVByb2Nlc3NSZW1vdGVGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNpbmtTdHJlYW0gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBpbnB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEV4ZWN1dGlvbigpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJQ2hhbm5lbEV4ZWMgY2hhbm5lbCA9IGNyZWF0ZUNoYW5uZWwoZmFsc2UpOwotCQlJUmVtb3RlUGF0aFRvb2xzIHBhdGhUb29sID0gZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldFJlbW90ZVBhdGhUb29scygpOwotCQlzZXRDb21tYW5kTGluZSgiY2F0ICIgKyBwYXRoVG9vbC5xdW90ZShyZW1vdGVGaWxlLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChzaW5rU3RyZWFtICE9IG51bGwpIHsKLQkJCWNoYW5uZWwuc2V0T3V0cHV0U3RyZWFtKHNpbmtTdHJlYW0pOwotCQkJaW5wdXRTdHJlYW0gPSBudWxsOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlpbnB1dFN0cmVhbSA9IGNoYW5uZWwuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5Eb3dubG9hZEV4ZWN1dGlvbl9Eb3dubG9hZEV4ZWN1dGlvbl9GYWlsZWRDcmVhdGVEb3dubG9hZCwgZSk7Ci0JCQl9Ci0JCX0KLQkJY2hhbm5lbC5zZXRFcnJTdHJlYW0oZXJyb3JTdHJlYW0pOwotCQkKLQkJc3VwZXIuc3RhcnRFeGVjdXRpb24oKTsKLQkJRGVidWcucHJpbnRsbigiRG93bmxvYWRpbmcgIiArIHJlbW90ZUZpbGUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JTdHJlYW0udG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0V4ZWN1dGlvbk1hbmFnZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0V4ZWN1dGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzE1ZWNiMS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9FeGVjdXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlQ29weVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBhdGhUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU3RhdHVzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVR1bm5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkxvY2FsUG9ydEJvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29tbW9uLlJlbW90ZVR1bm5lbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciB7Ci0JLyoqCi0JICogVHVubmVscyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KLQkgKi8KLQlTZXQgdHVubmVscyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKioKLQkgKiBSZW1vdGUgZXhlY3V0aW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KLQkgKi8KLQlTZXQgZXhlY3V0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JLyoqCi0JICogQ29ubmVjdGlvbiBjcmVhdGVkIHRoZSBleGVjdXRpb24gbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGluc3RhbmNlIHRoYXQgcHJvdmlkZXMgZXhlY3V0aW9uIGZhY2lsaXR5IG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIElSZW1vdGVFeGVjdXRpb25Ub29scyBleGVjdXRpb25Ub29sczsKLQotCS8qKgotCSAqIFRoZSBpbnN0YW5jZSB0aGF0IHByb3ZpZGVzIGZpbGUgbWFuaXB1bGF0aW9uIGZhY2lsaXR5IG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIElSZW1vdGVGaWxlVG9vbHMgZmlsZVRvb2xzOwotCi0JLyoqCi0JICogVGhlIGluc3RhbmNlIHRoYXQgcHJvdmlkZXMgZmlsZSB0cmFuc2ZlciBmYWNpbGl0eSBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCBJUmVtb3RlQ29weVRvb2xzIGNvcHlUb29sczsKLQkKLQkvKioKLQkgKiBUaGUgaW5zdGFuY2UgdGhhdCBwcm92aWRlcyB0aGUgcGF0aCBjb252ZXJ0ZXIgdG9vbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlbW90ZVBhdGhUb29scyBwYXRoVG9vbHM7Ci0KLQkvKioKLQkgKiBUaGUgaW5zdGFuY2UgdGhhdCBwcm92aWRlcyB0aGUgc3RhdHVzIHRvb2wuCi0JICovCi0JcHJvdGVjdGVkIElSZW1vdGVTdGF0dXNUb29scyBzdGF0dXNUb29sczsKLQotCS8qKgotCSAqIFRoZSBpbnN0YW5jZSB0aGF0IHByb3ZpZGVzIHRoZSBwb3J0IGZvcndhcmRpbmcuCi0JICovCi0JcHJvdGVjdGVkIElSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzIHBvcnRGb3J3YXJkaW5nVG9vbHM7Ci0KLQkvKioKLQkgKiBBdXRvbWF0aWMtZ2VuZXJhdGVkIHBvcnQgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1pblBvcnQgPSAxMDAwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWF4UG9ydCA9IDY1MDAwOwotCXByaXZhdGUgc3RhdGljIGludCBhdXRvQWN0dWFsUG9ydCA9IG1pblBvcnQ7Ci0KLQkvKioKLQkgKiBDYW5jZWwgZmxhZy4gSWYgdHJ1ZSwgbm8gbW9yZSBvcGVyYXRpb25zIGFyZSBhbGxvd2VkIG9uIHRoZSB0aGlzIGV4ZWN1dGlvbiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5jZWxGbGFnID0gZmFsc2U7Ci0KLQkKLQkvKioKLQkgKiBNZXRob2QgdGhhdCB1cGRhdGVzIGFuZCByZXR1cm4gYSBuZXcgcG9ydCBudW1iZXIKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgaW50IGdldE5ld1BvcnROdW1iZXIoKSB7Ci0JCWlmKGF1dG9BY3R1YWxQb3J0ID09IG1heFBvcnQpCi0JCQlhdXRvQWN0dWFsUG9ydCA9IG1pblBvcnQ7Ci0JCQotCQlyZXR1cm4gYXV0b0FjdHVhbFBvcnQrKzsKLQl9Ci0JCi0JLyoqCi0JICogQ2xhc3MgY29uc3RydWN0b3IuIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNvbnRyb2wgZGF0YSBhbmQgYWxsb2NzIGEgY29udHJvbCB0ZXJtaW5hbC4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbW1hbmRFeGNlcHRpb24gVGhlIG1hbmFnZXIgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEV4ZWN1dGlvbk1hbmFnZXIoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0JCXRoaXMuZmlsZVRvb2xzID0gbmV3IEZpbGVUb29scyh0aGlzKTsKLQkJdGhpcy5leGVjdXRpb25Ub29scyA9IG5ldyBFeGVjdXRpb25Ub29scyh0aGlzKTsKLQkJdGhpcy5jb3B5VG9vbHMgPSBuZXcgQ29weVRvb2xzKHRoaXMpOwotCQl0aGlzLnBhdGhUb29scyA9IG5ldyBQYXRoVG9vbHModGhpcyk7Ci0JCXRoaXMuc3RhdHVzVG9vbHMgPSBuZXcgU3RhdHVzVG9vbHModGhpcyk7Ci0JCXRoaXMucG9ydEZvcndhcmRpbmdUb29scyA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIjY2FuY2VsKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsKCkgewotCQkvKgotCQkgKiBDYW5jZWwgYWxsIG9wZXJhdGlvbnMuIEVhY2ggb3BlcmF0aW9uIGltcGxlbWVudHMgaXRzIG93bgotCQkgKiBsb2dpYyBob3cgdG8gY2FuY2VsLiBUaGlzIHNpbXBseSBicm9hZGNhc3RzIHRoZSBjYW5jZWwgdG8KLQkJICogYWxsIHJ1bm5pbmcgb3BlcmF0aW9ucy4KLQkJICovCi0JCUl0ZXJhdG9yIG9wZXJhdGlvbkVudW0gPSBleGVjdXRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChvcGVyYXRpb25FbnVtLmhhc05leHQoKSkgewotCQkJSVJlbW90ZU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoSVJlbW90ZU9wZXJhdGlvbikgb3BlcmF0aW9uRW51bS5uZXh0KCk7Ci0JCQlvcGVyYXRpb24uY2FuY2VsKCk7Ci0JCX0KLQkJY2FuY2VsRmxhZyA9IHRydWU7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIjcmVzZXRDYW5jZWwoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldENhbmNlbCgpIHsgCi0JCWNhbmNlbEZsYWcgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7Ci0JCS8qCi0JCSAqIE1hcmsgbWFuYWdlciBhcyBjYW5jZWxlZCBhbmQgaW50ZXJydXB0IG9uZ29pbmcgb3BlcmF0aW9ucy4KLQkJICovCi0JCWNhbmNlbCgpOwotCi0JCS8qCi0JCSAqIENsb3NlIGFsbCB0dW5uZWxzLgotCQkgKi8KLQkJd2hpbGUgKHR1bm5lbHMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0dW5uZWxzLml0ZXJhdG9yKCk7Ci0JCQlJUmVtb3RlVHVubmVsIHR1bm5lbCA9IChJUmVtb3RlVHVubmVsKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCS8vIHJlbGVhc2VUdW5uZWwoKSBhbHJlYWR5IHJlbW92ZXMgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QuCi0JCQkJcmVsZWFzZVR1bm5lbCh0dW5uZWwpOwotCQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJdHVubmVscyA9IG51bGw7Ci0JCWNvbm5lY3Rpb24uZm9yd2FyZGluZ1Bvb2wuZGlzY29ubmVjdCh0aGlzKTsKLQkJCi0JCS8qCi0JCSAqIENsb3NlIGFsbCBjaGFubmVscyBmb3IgcmVtb3RlIGV4ZWN1dGlvbnMuCi0JCSAqLwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4ZWN1dGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVJlbW90ZU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoSVJlbW90ZU9wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJb3BlcmF0aW9uLmNsb3NlKCk7Ci0JCX0KLQkJZXhlY3V0aW9ucy5jbGVhcigpOwotCQlleGVjdXRpb25zID0gbnVsbDsKLQkJCi0JCS8qCi0JCSAqIFVucmVnaXN0ZXIgZXhlY3V0aW9uIG1hbmFnZXIgKGNhbGxiYWNrKS4KLQkJICovCi0JCWNvbm5lY3Rpb24ucmVsZWFzZUV4Y3V0aW9uTWFuYWdlcih0aGlzKTsKLQkJCi0JCXRoaXMuZmlsZVRvb2xzID0gbnVsbDsKLQkJdGhpcy5leGVjdXRpb25Ub29scyA9IG51bGw7Ci0JCXRoaXMuY29weVRvb2xzID0gbnVsbDsKLQkJdGhpcy5wYXRoVG9vbHMgPSBudWxsOwotCQl0aGlzLnN0YXR1c1Rvb2xzID0gbnVsbDsKLQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNvbm5lY3Rpb24gdXNlZCBieSB0aGUgZXhlY3V0aW9uIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlciNnZXRFeGVjdXRpb25Ub29scygpCi0JICovCi0JcHVibGljIElSZW1vdGVFeGVjdXRpb25Ub29scyBnZXRFeGVjdXRpb25Ub29scygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGlvblRvb2xzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIjZ2V0UmVtb3RlRmlsZVRvb2xzKCkKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZUZpbGVUb29scyBnZXRSZW1vdGVGaWxlVG9vbHMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaWxlVG9vbHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlciNnZXRSZW1vdGVDb3B5VG9vbHMoKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlQ29weVRvb2xzIGdldFJlbW90ZUNvcHlUb29scygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvcHlUb29sczsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlciNnZXRSZW1vdGVQYXRoVG9vbHMoKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlUGF0aFRvb2xzIGdldFJlbW90ZVBhdGhUb29scygpIHsKLQkJcmV0dXJuIHBhdGhUb29sczsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlciNnZXRSZW1vdGVTdGF0dXNUb29scygpCi0JICovCi0JcHVibGljIElSZW1vdGVTdGF0dXNUb29scyBnZXRSZW1vdGVTdGF0dXNUb29scygpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXR1c1Rvb2xzIDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlciNjcmVhdGVUdW5uZWwoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUmVtb3RlVHVubmVsIGNyZWF0ZVR1bm5lbChpbnQgbG9jYWxQb3J0LCBTdHJpbmcgYWRkcmVzc09uUmVtb3RlSG9zdCwgaW50IHBvcnRPblJlbW90ZUhvc3QpCi0JCQl0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgTG9jYWxQb3J0Qm91bmRFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXRlc3QoKTsKLQkJdGVzdENhbmNlbCgpOwotCQlSZW1vdGVUdW5uZWwgdHVubmVsID0gY29ubmVjdGlvbi5jcmVhdGVUdW5uZWwobG9jYWxQb3J0LCBhZGRyZXNzT25SZW1vdGVIb3N0LCBwb3J0T25SZW1vdGVIb3N0KTsKLQkJdHVubmVscy5hZGQodHVubmVsKTsKLQkJcmV0dXJuIHR1bm5lbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlciNjcmVhdGVUdW5uZWwoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVJlbW90ZVR1bm5lbCBjcmVhdGVUdW5uZWwoU3RyaW5nIGFkZHJlc3NPblJlbW90ZUhvc3QsIGludCBwb3J0T25SZW1vdGVIb3N0KSAKLQkJdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIExvY2FsUG9ydEJvdW5kRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQkvLyBHZW5lcmF0ZSBhIGxvY2FsIHBvcnQgYXV0b21hdGljYWxseSwgYmVmb3JlIGNhbGxpbmcgdGhlIGNyZWF0ZVR1bm5lbCBtZXRob2QgcGFzc2luZyBpdCBhcyBwYXJhbWV0ZXIuCi0JCXRlc3QoKTsKLQkJdGVzdENhbmNlbCgpOwotCQlpbnQgc3RvcmVkUG9ydCA9IGdldE5ld1BvcnROdW1iZXIoKTsKLQkJaW50IG5ld0dlbmVyYXRlZFBvcnQgPSBzdG9yZWRQb3J0OwotCQl3aGlsZSh0cnVlKSB7Ci0JCQl0cnkgewotCQkJCUlSZW1vdGVUdW5uZWwgdHVubmVsID0gY3JlYXRlVHVubmVsKG5ld0dlbmVyYXRlZFBvcnQsIGFkZHJlc3NPblJlbW90ZUhvc3QsIHBvcnRPblJlbW90ZUhvc3QpOwotCQkJCXJldHVybiB0dW5uZWw7Ci0JCQl9IGNhdGNoKExvY2FsUG9ydEJvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZiB0aGUgbmV3IHBvcnQgZ2VuZXJhdGVkIGlzIGVxdWFsIHRoZSBwb3J0IHdlIHN0b3JlZCBiZWZvcmUgdGhlIGxvb3AsIGFsbCBwb3J0cyBhcmUgcHJvYmFibHkgYnVzeQotCQkJCS8vIHNvLCBnZW5lcmF0ZSBhbiBleGNlcHRpb24uCi0JCQkJbmV3R2VuZXJhdGVkUG9ydCA9IGdldE5ld1BvcnROdW1iZXIoKTsKLQkJCQlpZihuZXdHZW5lcmF0ZWRQb3J0ID09IHN0b3JlZFBvcnQpCi0JCQkJCXRocm93IG5ldyBMb2NhbFBvcnRCb3VuZEV4Y2VwdGlvbihNZXNzYWdlcy5FeGVjdXRpb25NYW5hZ2VyX0NyZWF0ZVR1bm5lbF9BbGxMb2NhbFBvcnRzQnVzeSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2VUdW5uZWwoSVJlbW90ZVR1bm5lbCB0dW5uZWwpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQljb25uZWN0aW9uLnJlbGVhc2VUdW5uZWwoKFJlbW90ZVR1bm5lbCkgdHVubmVsKTsKLQkJdHVubmVscy5yZW1vdmUodHVubmVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyT3BlcmF0aW9uKElSZW1vdGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWV4ZWN1dGlvbnMuYWRkKG9wZXJhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVucmVnaXN0ZXJPcGVyYXRpb24oSVJlbW90ZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJZXhlY3V0aW9ucy5yZW1vdmUob3BlcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1hbmFnZXIgY2Fubm90IGV4ZWN1dGUgY29tbWFuZHMuCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIFRoZSBjb25uZWN0aW9uIHdhcyBsb3N0LgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uIFRoZSBtYW5hZ2VyIGlzIGNhbmNlbGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlc3QoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCWNvbm5lY3Rpb24udGVzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZXN0Q2FuY2VsKCkgdGhyb3dzIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCWlmIChjYW5jZWxGbGFnKSB7Ci0JCQl0aHJvdyBuZXcgQ2FuY2VsRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHMgZ2V0UG9ydEZvcndhcmRpbmdUb29scygpCi0JCQl0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnBvcnRGb3J3YXJkaW5nVG9vbHMgPT0gbnVsbCkgewotCQkJdGhpcy5wb3J0Rm9yd2FyZGluZ1Rvb2xzID0gbmV3IFBvcnRGb3J3YXJkaW5nVG9vbHModGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucG9ydEZvcndhcmRpbmdUb29sczsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9FeGVjdXRpb25PYnNlcnZlci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvRXhlY3V0aW9uT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTEyYzhhZi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9FeGVjdXRpb25PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29yZS5Db25uZWN0aW9uUHJvcGVydGllczsKLQotCi0vKioKLSAqIE9ic2VydmVyIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgbGlzdCBvZiBydW5uaW5nIHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqIEBzaW5jZSAxLjEKLSAqLwotY2xhc3MgRXhlY3V0aW9uT2JzZXJ2ZXIgZXh0ZW5kcyBKb2IgewotCWludCBpbmFjdGl2aXR5OwotCUNvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQotCXB1YmxpYyBFeGVjdXRpb25PYnNlcnZlcihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJc3VwZXIoTWVzc2FnZXMuRXhlY3V0aW9uT2JzZXJ2ZXJfRXhlY3V0aW9uT2JzZXJ2ZXJfUmVtb3RlQ29tbWFuZE9ic2VydmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAocmUpRW5hYmxlIHBvbGxpbmcgZm9yIGZpbmlzaGVkIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgbmV3Q29tbWFuZCgpIHsKLQkJaW5hY3Rpdml0eSA9IDA7Ci0JCXNjaGVkdWxlKENvbm5lY3Rpb25Qcm9wZXJ0aWVzLmZhc3REdXR5Q3ljbGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBwcm9jZXNzIHRoYXQgZmluaXNoZWQgYW5kIHJlbW92ZSB0aGVuIGZyb20gdGhlIHRhYmxlIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIFN0YXR1cyBvZiB0aGUgcnVuLgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gSW4gY2FzZSBvZiBjYW5jZWwuLi4KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgKGNvbm5lY3Rpb24pIHsKLQkJCUl0ZXJhdG9yIG9wZXJhdGlvbkVudW0gPSBjb25uZWN0aW9uLmFjdGl2ZVByb2Nlc3NUYWJsZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChvcGVyYXRpb25FbnVtLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gb3BlcmF0aW9uRW51bS5uZXh0KCk7Ci0JCQkJRW50cnkgZSA9IChFbnRyeSkgbzsKLQkJCQkKLQkJCQkKLQkJCQlpZiAoZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgS2lsbGFibGVFeGVjdXRpb24pIHsKLQkJCQkJS2lsbGFibGVFeGVjdXRpb24gb3BlcmF0aW9uID0gKEtpbGxhYmxlRXhlY3V0aW9uKSBlLmdldFZhbHVlKCk7Ci0KLQkJCQkJaWYgKCFvcGVyYXRpb24uaXNSdW5uaW5nKCkpIHsKLQkJCQkJCW9wZXJhdGlvbkVudW0ucmVtb3ZlKCk7Ci0JCi0JCQkJCQkvLyBOb3RpZnkgdGhyZWFkcyB0aGF0IHdlcmUKLQkJCQkJCW9wZXJhdGlvbi5ub3RpZnlGaW5pc2goKTsKLQkKLQkJCQkJCWluYWN0aXZpdHkgPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBPbmx5IHNjaGVkdWxlcyBpdCBpZiB0aGVyZSBleGlzdHMgbW9yZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JCQlpZiAoY29ubmVjdGlvbi5hY3RpdmVQcm9jZXNzVGFibGUuc2l6ZSgpID4gMCkgewotCQkJCWlmIChpbmFjdGl2aXR5ID4gQ29ubmVjdGlvblByb3BlcnRpZXMuaW5hY3Rpdml0eVRocmVhc2hvbGQpIHsKLQkJCQkJc2NoZWR1bGUoQ29ubmVjdGlvblByb3BlcnRpZXMubG9uZ0R1dHlDeWNsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2NoZWR1bGUoQ29ubmVjdGlvblByb3BlcnRpZXMuZmFzdER1dHlDeWNsZSk7Ci0JCQkJCWluYWN0aXZpdHkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9FeGVjdXRpb25Ub29scy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvRXhlY3V0aW9uVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODBjMzVkZS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9FeGVjdXRpb25Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVTY3JpcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVNjcmlwdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5SZW1vdGVQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uQ2FuY2VsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29tbW9uLlJlbW90ZVNjcmlwdDsKLQotCi0vKioKLSAqIEEgc2V0IG9mIGZhY2lsaXR5IG1ldGhvZHMgZm9yIGNvbW1vbiBleGVjdXRpb24gcGF0dGVybnMuCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGlvblRvb2xzIGltcGxlbWVudHMgSVJlbW90ZUV4ZWN1dGlvblRvb2xzIHsKLQlFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXI7Ci0KLQlwcm90ZWN0ZWQgRXhlY3V0aW9uVG9vbHMoRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uVG9vbHMjY3JlYXRlU2NyaXB0KCkKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZVNjcmlwdCBjcmVhdGVTY3JpcHQoKSB7Ci0JCXJldHVybiBuZXcgUmVtb3RlU2NyaXB0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uVG9vbHMjZXhlY3V0ZVNjcmlwdChvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU2NyaXB0KQotCSAqLwotCXB1YmxpYyBJUmVtb3RlU2NyaXB0RXhlY3V0aW9uIGV4ZWN1dGVTY3JpcHQoSVJlbW90ZVNjcmlwdCByZW1vdGVTY3JpcHQpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCEocmVtb3RlU2NyaXB0IGluc3RhbmNlb2YgUmVtb3RlU2NyaXB0KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJCi0JCVNjcmlwdEV4ZWN1dGlvbiBhY3R1YWxFeGVjdXRpb24gPSBuZXcgU2NyaXB0RXhlY3V0aW9uKG1hbmFnZXIsIChSZW1vdGVTY3JpcHQpIHJlbW90ZVNjcmlwdCk7Ci0JCWFjdHVhbEV4ZWN1dGlvbi5zdGFydEV4ZWN1dGlvbigpOwotCi0KLQkJcmV0dXJuIGFjdHVhbEV4ZWN1dGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25Ub29scyNleGVjdXRlQ29tbWFuZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZVdpdGhFeGl0VmFsdWUoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCUlSZW1vdGVTY3JpcHQgc2NyaXB0ID0gY3JlYXRlU2NyaXB0KCk7Ci0JCXNjcmlwdC5zZXRTY3JpcHQoY29tbWFuZCk7Ci0JCi0JCUlSZW1vdGVTY3JpcHRFeGVjdXRpb24gZXhlY3V0aW9uID0gZXhlY3V0ZVNjcmlwdChzY3JpcHQpOwotCQlleGVjdXRpb24ud2FpdEZvckVuZE9mRXhlY3V0aW9uKCk7Ci0JCWludCByZXR1cm5jb2RlID0gZXhlY3V0aW9uLmdldFJldHVybkNvZGUoKTsKLQkJZXhlY3V0aW9uLmNsb3NlKCk7Ci0KLQkJcmV0dXJuIHJldHVybmNvZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uVG9vbHMjZXhlY3V0ZUNvbW1hbmRXaXRoT3V0cHV0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBleGVjdXRlV2l0aE91dHB1dChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJSVJlbW90ZVNjcmlwdCBzY3JpcHQgPSBjcmVhdGVTY3JpcHQoKTsKLQkJc2NyaXB0LnNldFNjcmlwdChjb21tYW5kKTsKLQkJCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzY3JpcHQuc2V0UHJvY2Vzc091dHB1dFN0cmVhbShiYW9zKTsKLQkJCi0JCUlSZW1vdGVTY3JpcHRFeGVjdXRpb24gZXhlY3V0aW9uID0gZXhlY3V0ZVNjcmlwdChzY3JpcHQpOwotCQlleGVjdXRpb24ud2FpdEZvckVuZE9mRXhlY3V0aW9uKCk7Ci0JCWV4ZWN1dGlvbi5jbG9zZSgpOwotCi0JCXJldHVybiBiYW9zLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZUJhc2hDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlJUmVtb3RlU2NyaXB0IHNjcmlwdCA9IGNyZWF0ZVNjcmlwdCgpOwotCQlzY3JpcHQuc2V0U2NyaXB0KGNvbW1hbmQpOwotCQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvczEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNjcmlwdC5zZXRQcm9jZXNzT3V0cHV0U3RyZWFtKGJhb3MxKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzY3JpcHQuc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKGJhb3MyKTsKLQkJCi0JCUlSZW1vdGVTY3JpcHRFeGVjdXRpb24gZXhlY3V0aW9uID0gZXhlY3V0ZVNjcmlwdChzY3JpcHQpOwotCQlleGVjdXRpb24ud2FpdEZvckVuZE9mRXhlY3V0aW9uKCk7Ci0JCQotCQlpbnQgcmV0dXJuY29kZSA9IGV4ZWN1dGlvbi5nZXRSZXR1cm5Db2RlKCk7Ci0JCWV4ZWN1dGlvbi5jbG9zZSgpOwotCQkKLQkJaWYgKHJldHVybmNvZGUgIT0gMCkgewotCQkJdGhyb3cgbmV3IFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5FeGVjdXRpb25Ub29sc19FeGVjdXRlQmFzaENvbW1hbmRfRmFpbGVkUnVuQmFzaENvbW1hbmQsIHJldHVybmNvZGUsIGJhb3MxLnRvU3RyaW5nKCksIGJhb3MyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIFJlbW90ZVByb2Nlc3MgZXhlY3V0ZVByb2Nlc3MoSVJlbW90ZVNjcmlwdCByZW1vdGVTY3JpcHQpIHRocm93cyBSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlbW90ZVNjcmlwdC5zZXRGZXRjaFByb2Nlc3NFcnJvclN0cmVhbSh0cnVlKTsKLQkJcmVtb3RlU2NyaXB0LnNldEZldGNoUHJvY2Vzc0lucHV0U3RyZWFtKHRydWUpOwotCQlyZW1vdGVTY3JpcHQuc2V0RmV0Y2hQcm9jZXNzT3V0cHV0U3RyZWFtKHRydWUpOwotCQlJUmVtb3RlU2NyaXB0RXhlY3V0aW9uIGV4ZWN1dGlvbiA9IGV4ZWN1dGVTY3JpcHQocmVtb3RlU2NyaXB0KTsKLQkJU1NIUmVtb3RlUHJvY2VzcyBwcm9jZXNzID0gbmV3IFNTSFJlbW90ZVByb2Nlc3MoZXhlY3V0aW9uKTsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL0ZpbGVUb29scy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvRmlsZVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNDliZjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvRmlsZVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVDb3B5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZUVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBhdGhUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbFNmdHA7Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNmdHBBVFRSUzsKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Z0cEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbFNmdHAuTHNFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsLCBEYW5pZWwgRmVyYmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVUb29scyBpbXBsZW1lbnRzIElSZW1vdGVGaWxlVG9vbHMgewotCXByb3RlY3RlZCBFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHVibGljIGludCBjYWNoZWRVc2VySUQ7Ci0JcHVibGljIFNldCBjYWNoZWRHcm91cElEU2V0OwotCi0JcHJvdGVjdGVkIEZpbGVUb29scyhFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRmlsZShTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQl0ZXN0KCk7Ci0JCXZhbGlkYXRlUmVtb3RlUGF0aChmcm9tKTsKLQkJdmFsaWRhdGVSZW1vdGVQYXRoKHRvKTsKLQkJSVJlbW90ZVBhdGhUb29scyBwYXRoVG9vbCA9IG1hbmFnZXIuZ2V0UmVtb3RlUGF0aFRvb2xzKCk7Ci0JCXRyeSB7Ci0JCQlleGVjdXRlQ29tbWFuZCgibXYgLWYgIiArIHBhdGhUb29sLnF1b3RlKGZyb20sIHRydWUpICsgIiAiICsgcGF0aFRvb2wucXVvdGUodG8sIHRydWUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29weUZpbGUoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgoZnJvbSk7Ci0JCXZhbGlkYXRlUmVtb3RlUGF0aCh0byk7Ci0JCQotCQlJUmVtb3RlUGF0aFRvb2xzIHBhdGhUb29sID0gbWFuYWdlci5nZXRSZW1vdGVQYXRoVG9vbHMoKTsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGVDb21tYW5kKCJjcCAtZiAiICsgcGF0aFRvb2wucXVvdGUoZnJvbSwgdHJ1ZSkgKyAiICIgKyBwYXRoVG9vbC5xdW90ZSh0bywgdHJ1ZSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfSAKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRmlsZShTdHJpbmcgZmlsZSkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgoZmlsZSk7Ci0JCUlSZW1vdGVQYXRoVG9vbHMgcGF0aFRvb2wgPSBtYW5hZ2VyLmdldFJlbW90ZVBhdGhUb29scygpOwotCQl0cnkgewotCQkJZXhlY3V0ZUNvbW1hbmQoInJtIC1yZiAiICsgcGF0aFRvb2wucXVvdGUoZmlsZSwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQl9IAotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURpcmVjdG9yeShTdHJpbmcgZmlsZSkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgoZmlsZSk7Ci0JCUlSZW1vdGVQYXRoVG9vbHMgcGF0aFRvb2wgPSBtYW5hZ2VyLmdldFJlbW90ZVBhdGhUb29scygpOwotCQl0cnkgewotCQkJZXhlY3V0ZUNvbW1hbmQoIm1rZGlyIC1wICIgKyBwYXRoVG9vbC5xdW90ZShmaWxlLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0gCi0JfQotCQotCXB1YmxpYyB2b2lkIGFzc3VyZURpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQl0ZXN0KCk7Ci0JCXZhbGlkYXRlUmVtb3RlUGF0aChkaXJlY3RvcnkpOwotCQlpZiAoISBoYXNEaXJlY3RvcnkoZGlyZWN0b3J5KSkgewotCQkJY3JlYXRlRGlyZWN0b3J5KGRpcmVjdG9yeSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQltYW5hZ2VyLnRlc3QoKTsKLQkJbWFuYWdlci50ZXN0Q2FuY2VsKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlYWQgYXR0cmlidXRlcyBvZiB0aGUgcmVtb3RlIGZpbGUuCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIEEgSnNjaCBkYXRhIHN0cnVjdHVyZSB3aXRoIGF0dHJpYnV0ZXMgb3IgbnVsbCBpZiBwYXRoIGRvZXMgbm90IGV4aXN0LgotCSAqIEB0aHJvd3MgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFNmdHBBVFRSUyBmZXRjaFJlbW90ZUF0dHIoU3RyaW5nIHBhdGgpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCQlTZnRwQVRUUlMgYXR0cnM7Ci0JCXRyeSB7Ci0JCQlhdHRycyA9IG1hbmFnZXIuZ2V0Q29ubmVjdGlvbigpLmdldERlZmF1bHRTRlRQQ2hhbm5lbCgpLnN0YXQocGF0aCk7Ci0JCQlyZXR1cm4gYXR0cnM7Ci0JCX0gY2F0Y2ggKFNmdHBFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuaWQgPT0gQ2hhbm5lbFNmdHAuU1NIX0ZYX05PX1NVQ0hfRklMRSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5SZW1vdGVGaWxlVG9vbHNfRmV0Y2hSZW1vdGVBdHRyX0ZhaWxlZEZldGNoQXR0cik7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaC50ZXN0ZSNoYXNEaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNEaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgoZGlyZWN0b3J5KTsKLQkJUmVtb3RlSXRlbSBpdGVtID0gKFJlbW90ZUl0ZW0pIGdldEl0ZW0oZGlyZWN0b3J5KTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghIGl0ZW0uZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoISBpdGVtLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoLnRlc3RlI2hhc0ZpbGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGaWxlKFN0cmluZyBmaWxlKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQl0ZXN0KCk7Ci0JCXZhbGlkYXRlUmVtb3RlUGF0aChmaWxlKTsKLQkJUmVtb3RlSXRlbSBpdGVtID0gKFJlbW90ZUl0ZW0pIGdldEl0ZW0oZmlsZSk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoISBpdGVtLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCEgaXRlbS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0l0ZW0oU3RyaW5nIHBhdGgpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXRlc3QoKTsKLQkJdmFsaWRhdGVSZW1vdGVQYXRoKHBhdGgpOwotCQlSZW1vdGVJdGVtIGl0ZW0gPSAoUmVtb3RlSXRlbSkgZ2V0SXRlbShwYXRoKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghIGl0ZW0uZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShTdHJpbmcgcmVtb3RlUGF0aCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0JCVJlbW90ZUl0ZW0gaXRlbSA9IChSZW1vdGVJdGVtKSBnZXRJdGVtKHJlbW90ZVBhdGgpOwotCQlyZXR1cm4gaXRlbS5pc0V4ZWN1dGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUmVhZChTdHJpbmcgcmVtb3RlUGF0aCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgocmVtb3RlUGF0aCk7Ci0JCVJlbW90ZUl0ZW0gaXRlbSA9IChSZW1vdGVJdGVtKSBnZXRJdGVtKHJlbW90ZVBhdGgpOwotCQlyZXR1cm4gaXRlbS5pc1JlYWRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuV3JpdGUoU3RyaW5nIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXRlc3QoKTsKLQkJdmFsaWRhdGVSZW1vdGVQYXRoKHJlbW90ZVBhdGgpOwotCQlSZW1vdGVJdGVtIGl0ZW0gPSAoUmVtb3RlSXRlbSkgZ2V0SXRlbShyZW1vdGVQYXRoKTsKLQkJcmV0dXJuIGl0ZW0uaXNXcml0YWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQltYW5hZ2VyLmV4ZWN1dGlvblRvb2xzLmV4ZWN1dGVCYXNoQ29tbWFuZChjb21tYW5kKTsKLQl9Ci0KLQl2b2lkIHZhbGlkYXRlUmVtb3RlUGF0aChTdHJpbmcgcGF0aCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghIHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKHBhdGggKyBNZXNzYWdlcy5SZW1vdGVGaWxlVG9vbHNfVmFsaWRhdGVSZW1vdGVQYXRoX05vdFZhbGlkKTsKLQkJfQotCX0KLQotCVN0cmluZyBjb25jYXRlbmF0ZVJlbW90ZVBhdGgoU3RyaW5nIHAxLCBTdHJpbmcgcDIpIHsKLQkJaWYgKHAxLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHAxICsgcDI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcDEgKyAiLyIgKyBwMjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCVN0cmluZyBwYXJlbnRPZlJlbW90ZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcGF0aCA9IHJlbW92ZVRyYWlsaW5nU2xhc2gocGF0aCk7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlbW92ZVRyYWlsaW5nU2xhc2gocGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLQl9Ci0JCi0JU3RyaW5nIHN1ZmZpeE9mUmVtb3RlUGF0aChTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcmVtb3ZlVHJhaWxpbmdTbGFzaChwYXRoKTsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpOwotCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBudWxsOwotCQlyZXR1cm4gcmVtb3ZlVHJhaWxpbmdTbGFzaChwYXRoLnN1YnN0cmluZyhpbmRleCsxKSk7Ci0JfQotCQotCVN0cmluZyBhZGRUcmFpbGluZ1NsYXNoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGF0aCArICIvIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JU3RyaW5nIHJlbW92ZVRyYWlsaW5nU2xhc2goU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCFwYXRoLmVxdWFscygiLyIpICYmIHBhdGguZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCX0KLQotCi0JcHVibGljIElSZW1vdGVJdGVtIFtdIGxpc3RJdGVtcyhTdHJpbmcgcm9vdCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVSZW1vdGVQYXRoKHJvb3QpOwotCQlWZWN0b3IgZmlsZXM7Ci0JCXRyeSB7IAotCQkJZmlsZXMgPSBtYW5hZ2VyLmdldENvbm5lY3Rpb24oKS5nZXREZWZhdWx0U0ZUUENoYW5uZWwoKS5scyhyb290KTsKLQkJfSBjYXRjaCAoU2Z0cEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLlJlbW90ZUZpbGVUb29sc19MaXN0RmlsZXNfRmFpbGVkTGlzdFJlbW90ZSwgZSk7Ci0JCX0KLQkJCi0JCWNhY2hlVXNlckRhdGEoKTsKLQkJCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGZpbGVzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJTHNFbnRyeSBlbnRyeSA9IChMc0VudHJ5KSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gZW50cnkuZ2V0RmlsZW5hbWUoKTsKLQkJCVN0cmluZyBwYXRoTmFtZSA9IGNvbmNhdGVuYXRlUmVtb3RlUGF0aChyb290LCBmaWxlTmFtZSk7Ci0JCQlpZiAoZmlsZU5hbWUuZXF1YWxzKCIuIikgfHwgZmlsZU5hbWUuZXF1YWxzKCIuLiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIElnbm9yZSBwYXJlbnQgYW5kIGN1cnJlbnQgZGlyIGVudHJ5LgotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGVudHJ5LmdldEF0dHJzKCkuaXNEaXIoKSkgewotCQkJCXJlc3VsdC5hZGQobmV3IFJlbW90ZURpcmVjdG9yeSh0aGlzLCBwYXRoTmFtZSwgZW50cnkuZ2V0QXR0cnMoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYWRkKG5ldyBSZW1vdGVGaWxlKHRoaXMsIHBhdGhOYW1lLCBlbnRyeS5nZXRBdHRycygpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSZW1vdGVJdGVtIFtdIHJlc3VsdEFycmF5ID0gbmV3IElSZW1vdGVJdGVtW3Jlc3VsdC5zaXplKCldOwotCQlyZXN1bHQudG9BcnJheShyZXN1bHRBcnJheSk7Ci0JCXJldHVybiByZXN1bHRBcnJheTsKLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlVG9vbHMjZ2V0RmlsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUmVtb3RlRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCQl0ZXN0KCk7Ci0JCXZhbGlkYXRlUmVtb3RlUGF0aChmaWxlUGF0aCk7Ci0JCWZpbGVQYXRoID0gcmVtb3ZlVHJhaWxpbmdTbGFzaChmaWxlUGF0aCk7Ci0JCWNhY2hlVXNlckRhdGEoKTsKLQkJCQkKLQkJUmVtb3RlRmlsZSByZW1maWxlID0gbmV3IFJlbW90ZUZpbGUodGhpcywgZmlsZVBhdGgpOwotCQlyZW1maWxlLnJlZnJlc2hBdHRyaWJ1dGVzKCk7Ci0JCWlmICghIHJlbWZpbGUuaXNGaWxlKCkpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBhIGZpbGUiKTsKLQkJfQotCQlyZXR1cm4gcmVtZmlsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVVc2VyRGF0YSgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCWlmIChjYWNoZWRHcm91cElEU2V0ID09IG51bGwpIHsKLQkJCWNhY2hlZEdyb3VwSURTZXQgPSBtYW5hZ2VyLmdldFJlbW90ZVN0YXR1c1Rvb2xzKCkuZ2V0R3JvdXBJRFNldCgpOwotCQkJY2FjaGVkVXNlcklEID0gbWFuYWdlci5nZXRSZW1vdGVTdGF0dXNUb29scygpLmdldFVzZXJJRCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUZpbGVUb29scyNnZXREaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZURpcmVjdG9yeSBnZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeVBhdGgpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIHsKLQkJdGVzdCgpOwotCQl2YWxpZGF0ZVJlbW90ZVBhdGgoZGlyZWN0b3J5UGF0aCk7Ci0JCWRpcmVjdG9yeVBhdGggPSByZW1vdmVUcmFpbGluZ1NsYXNoKGRpcmVjdG9yeVBhdGgpOwotCQljYWNoZVVzZXJEYXRhKCk7Ci0JCQkJCi0JCVJlbW90ZURpcmVjdG9yeSByZW1maWxlID0gbmV3IFJlbW90ZURpcmVjdG9yeSh0aGlzLCBkaXJlY3RvcnlQYXRoKTsKLQkJcmVtZmlsZS5yZWZyZXNoQXR0cmlidXRlcygpOwotCQlpZiAoISByZW1maWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBhIGRpcmVjdG9yeSIpOwotCQl9Ci0JCXJldHVybiByZW1maWxlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZVRvb2xzI2dldEl0ZW0oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZUl0ZW0gZ2V0SXRlbShTdHJpbmcgcGF0aCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCQl0ZXN0KCk7Ci0JCXZhbGlkYXRlUmVtb3RlUGF0aChwYXRoKTsKLQkJcGF0aCA9IHJlbW92ZVRyYWlsaW5nU2xhc2gocGF0aCk7Ci0JCWNhY2hlVXNlckRhdGEoKTsKLQotCQlSZW1vdGVJdGVtIG5ld2l0ZW0gPSBuZXcgUmVtb3RlSXRlbSh0aGlzLCBwYXRoKTsKLQkJbmV3aXRlbS5yZWZyZXNoQXR0cmlidXRlcygpOwotCQlpZiAobmV3aXRlbS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQluZXdpdGVtID0gbmV3IFJlbW90ZURpcmVjdG9yeShuZXdpdGVtKTsKLQkJfSBlbHNlIHsKLQkJCW5ld2l0ZW0gPSBuZXcgUmVtb3RlRmlsZShuZXdpdGVtKTsKLQkJfQotCQlyZXR1cm4gbmV3aXRlbTsKLQl9Ci0KLQlwdWJsaWMgSVJlbW90ZUNvcHlUb29scyBnZXRSZW1vdGVDb3B5VG9vbHMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtYW5hZ2VyLmdldFJlbW90ZUNvcHlUb29scygpOwotCX0KLQotCXB1YmxpYyBJUmVtb3RlRmlsZUVudW1lcmF0aW9uIGNyZWF0ZUZpbGVFbnVtZXJhdGlvbihTdHJpbmcgcGF0aCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZW1vdGVGaWxlRW51bWVyYXRpb24odGhpcywgcGF0aCk7Ci0JfQotCi0JcHVibGljIElSZW1vdGVGaWxlRW51bWVyYXRpb24gY3JlYXRlUmVjdXJzaXZlRmlsZUVudW1lcmF0aW9uKFN0cmluZyBwYXRoKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJlbW90ZUZpbGVSZWN1cnNpdmVFbnVtZXJhdGlvbih0aGlzLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQl2b2lkIHVwbG9hZFBlcm1pc3Npb25zKEZpbGUgZmlsZSwgU3RyaW5nIHJlbW90ZUZpbGVQYXRoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlJUmVtb3RlSXRlbSBpdGVtID0gZ2V0SXRlbShyZW1vdGVGaWxlUGF0aCk7Ci0JCWl0ZW0uc2V0UmVhZGFibGUoZmlsZS5jYW5SZWFkKCkpOwotCQlpdGVtLnNldFdyaXRlYWJsZShmaWxlLmNhbldyaXRlKCkpOwotCQlpdGVtLmNvbW1pdEF0dHJpYnV0ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9LaWxsYWJsZUV4ZWN1dGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvS2lsbGFibGVFeGVjdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNhYTQzNC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9LaWxsYWJsZUV4ZWN1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuY29tbW9uLkFic3RyYWN0UmVtb3RlRXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5jb21tb24uRGVidWc7Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbEV4ZWM7Ci1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247Ci0KLS8qKgotICogQSByZW1vdGUgZXhlY3V0aW9uIHRoYXQgY2FuIGJlIGNhbmNlbGVkIGJ5IGtpbGxpbmcgdGhlIHJ1bm5pbmcgYmFzaCBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgS2lsbGFibGVFeGVjdXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZUV4ZWN1dGlvbiB7Ci0KLQlwcml2YXRlIENoYW5uZWxFeGVjIGNoYW5uZWw7Ci0JLyoqCi0JICogSW50ZXJuYWwgcHJvY2VzcyBpZGVudGlmaWVyLgotCSAqLwotCXByaXZhdGUgaW50IFBJSUQ7Ci0JLyoqCi0JICogUHJvY2VzcyBpZCBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICovCi0JcHJpdmF0ZSBpbnQgUElEOwotCi0JcHVibGljIEtpbGxhYmxlRXhlY3V0aW9uKEV4ZWN1dGlvbk1hbmFnZXIgZXhlY3V0aW9uTWFuYWdlcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlzdXBlcihleGVjdXRpb25NYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEV4ZWN1dGlvbigpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWdldEV4ZWN1dGlvbk1hbmFnZXIoKS5yZWdpc3Rlck9wZXJhdGlvbih0aGlzKTsKLQkJCWdldEV4ZWN1dGlvbk1hbmFnZXIoKS5nZXRDb25uZWN0aW9uKCkucmVnaXN0ZXJPYnNlcnZlZEV4ZWN1dGlvbih0aGlzKTsKLQkJCWNoYW5uZWwuY29ubmVjdCgpOwotCQl9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX1NjcmlwdEV4ZWN1dGlvbkNvbm5lY3Rpb25FeGNlcHRpb24sIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2FuY2VsKCkgewotCQkvKgotCQkgKiBTdG9wIG9ic2VydmluZyB0aGlzIGNoYW5uZWwuCi0JCSAqLwotCQlnZXRFeGVjdXRpb25NYW5hZ2VyKCkudW5yZWdpc3Rlck9wZXJhdGlvbih0aGlzKTsKLQkJZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24oKS51bnJlZ2lzdGVyT2JzZXJ2ZWRFeGVjdXRpb24odGhpcyk7Ci0JCS8qCi0JCSAqIEZvcmNlIHRoZSBlbmQgb2YgdGhlIGV4ZWN1dGlvbiBieSBjbG9zaW5nIHRoZSBjaGFubmVsIGFuZCBraWxsaW5nIChTSUdIVVAgb3Igc29tZXRoaW5nIHNpbXVsYXIpIG9uIHRoZSByZW1vdGUKLQkJICogaG9zdC4gUmVtb3RlIHRoZSBjaGFubmVsIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbC4KLQkJICovCi0JCWdldEV4ZWN1dGlvbk1hbmFnZXIoKS5nZXRDb25uZWN0aW9uKCkua2lsbEV4ZWN1dGlvbih0aGlzKTsKLQkJZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24oKS5yZWxlYXNlQ2hhbm5lbChjaGFubmVsKTsKLQkJc3VwZXIubm90aWZ5Q2FuY2VsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RmluaXNoKCkgewotCQkvKgotCQkgKiBTdG9wIG9ic2VydmluZyB0aGlzIGNoYW5uZWwuCi0JCSAqIFJlbW90ZSB0aGUgY2hhbm5lbCBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wKLQkJICovCi0JCWdldEV4ZWN1dGlvbk1hbmFnZXIoKS51bnJlZ2lzdGVyT3BlcmF0aW9uKHRoaXMpOwotCQlnZXRFeGVjdXRpb25NYW5hZ2VyKCkuZ2V0Q29ubmVjdGlvbigpLnVucmVnaXN0ZXJPYnNlcnZlZEV4ZWN1dGlvbih0aGlzKTsKLQkJZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24oKS5yZWxlYXNlQ2hhbm5lbChjaGFubmVsKTsKLQkJc3VwZXIubm90aWZ5RmluaXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCS8qCi0JCSAqIENhbmNlbCBleGVjdXRpb24sIGlmIHN0aWxsIG5vdCBmaW5pc2hlZC4gCi0JCSAqIFRoZW4sIG1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgYW5kIHJlbGVhc2VkIGZyb20gdGhlIGV4ZWN1dGlvbiBtYW5hZ2VyLgotCQkgKi8KLQkJaWYgKGlzUnVubmluZygpKSB7Ci0JCQljYW5jZWwoKTsKLQkJfQotCQlzdXBlci5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBDaGFubmVsRXhlYyBjcmVhdGVDaGFubmVsKGJvb2xlYW4gaGFzUFRZKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIEdldCBhIGNoYW5uZWwgZnJvbSB0aGUgY29ubmVjdGlvbiBwb29sLgotCQkgKiBDaGFubmVscyB3aXRoIFBUWSBtdXN0IGJlIG1hbmFnZWQgYnkgdGhlIHBvb2wuCi0JCSAqLwotCQljaGFubmVsID0gZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24oKS5jcmVhdGVFeGVjQ2hhbm5lbChoYXNQVFkpOwotCQljaGFubmVsLnNldFB0eShoYXNQVFkpOwotCQlyZXR1cm4gY2hhbm5lbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb21tYW5kTGluZShTdHJpbmcgY29tbWFuZExpbmUpIHsKLQkJUElJRCA9IGdldEV4ZWN1dGlvbk1hbmFnZXIoKS5nZXRDb25uZWN0aW9uKCkuY3JlYXRlTmV4dFBJSUQoKTsKLQkJU3RyaW5nIG5ld0NvbW1hbmRMaW5lID0gZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb24oKS5nZXRLaWxsYWJsZVByZWZpeCh0aGlzKSArICI7ICIgKyBjb21tYW5kTGluZTsgLy8kTk9OLU5MUy0xJAotCQlEZWJ1Zy5wcmludGxuMihNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9EZWJ1Z18xICsgbmV3Q29tbWFuZExpbmUpOwotCQljaGFubmVsLnNldENvbW1hbmQobmV3Q29tbWFuZExpbmUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UmV0dXJuQ29kZSgpIHsKLQkJaWYgKHdhc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIGlmICghd2FzRmluaXNoZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBjaGFubmVsLmdldEV4aXRTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFBJRCgpIHsKLQkJcmV0dXJuIFBJRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQSUQoaW50IHBpZCkgewotCQlQSUQgPSBwaWQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRlcm5hSUQoKSB7Ci0JCXJldHVybiBQSUlEOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQkJcmV0dXJuICFjaGFubmVsLmlzQ2xvc2VkKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRGaW5pc2hTdGF0dXMoKSB7Ci0JCWludCBjb2RlID0gZ2V0UmV0dXJuQ29kZSgpOwotCi0JCWlmIChjb2RlID09IDApIHsKLQkJCXJldHVybiBTVUNDRVNTX09LOwotCQl9IGVsc2UgaWYgKGNvZGUgPD0gMTI1KSB7Ci0JCQlyZXR1cm4gU1VDQ0VTU19FUlJPUjsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyNikgewotCQkJcmV0dXJuIEVSUk9SX05PVF9FWEVDVVRBQkxFOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI3KSB7Ci0JCQlyZXR1cm4gRVJST1JfTk9UX0ZPVU5EOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4KSB7Ci0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJfSBlbHNlIGlmIChjb2RlID09IDI1NSkgewotCQkJcmV0dXJuIElOVkFMSURfRVhJVF9DT0RFOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMSkgewotCQkJcmV0dXJuIFNJR0hVUDsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDIpIHsKLQkJCXJldHVybiBTSUdJTlQ7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAzKSB7Ci0JCQlyZXR1cm4gU0lHUVVJVDsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDQpIHsKLQkJCXJldHVybiBTSUdJTEw7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyA1KSB7Ci0JCQlyZXR1cm4gU0lHVFJBUDsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDYpIHsKLQkJCXJldHVybiBTSUdJT1Q7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyA3KSB7Ci0JCQlyZXR1cm4gU0lHQlVTOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgOCkgewotCQkJcmV0dXJuIFNJR0ZQRTsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDkpIHsKLQkJCXJldHVybiBTSUdLSUxMOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTApIHsKLQkJCXJldHVybiBTSUdVU1IxOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTEpIHsKLQkJCXJldHVybiBTSUdTRUdWOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTIpIHsKLQkJCXJldHVybiBTSUdVU1IyOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTMpIHsKLQkJCXJldHVybiBTSUdQSVBFOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTQpIHsKLQkJCXJldHVybiBTSUdBTFJNOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTUpIHsKLQkJCXJldHVybiBTSUdURVJNOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMTYpIHsKLQkJCXJldHVybiBTSUdTVEtGTFQ7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAxNykgewotCQkJcmV0dXJuIFNJR0NITEQ7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAxOCkgewotCQkJcmV0dXJuIFNJR0NPTlQ7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAxOSkgewotCQkJcmV0dXJuIFNJR1NUT1A7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAyMCkgewotCQkJcmV0dXJuIFNJR1RTVFA7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAyMSkgewotCQkJcmV0dXJuIFNJR1RUSU47Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAyMikgewotCQkJcmV0dXJuIFNJR1RUT1U7Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAyMykgewotCQkJcmV0dXJuIFNJR1VSRzsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDI0KSB7Ci0JCQlyZXR1cm4gU0lHWENQVTsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDI1KSB7Ci0JCQlyZXR1cm4gU0lHWEZTWjsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDI2KSB7Ci0JCQlyZXR1cm4gU0lHVlRBTFJNOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMjcpIHsKLQkJCXJldHVybiBTSUdQUk9GOwotCQl9IGVsc2UgaWYgKGNvZGUgPT0gMTI4ICsgMjgpIHsKLQkJCXJldHVybiBTSUdXSU5DSDsKLQkJfSBlbHNlIGlmIChjb2RlID09IDEyOCArIDI5KSB7Ci0JCQlyZXR1cm4gU0lHSU87Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSAxMjggKyAzMCkgewotCQkJcmV0dXJuIFNJR1BXUjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBVTktOT1dOOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaW5pc2hTdGF0dXNUZXh0KGludCBzdGF0dXMpIHsKLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBTVUNDRVNTX09LOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19PazsKLQkJY2FzZSBTVUNDRVNTX0VSUk9SOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19FcnJvcjsKLQkJY2FzZSBFUlJPUl9OT1RfRVhFQ1VUQUJMRToKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfTm90RXhlY3V0YWJsZTsKLQkJY2FzZSBFUlJPUl9OT1RfRk9VTkQ6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0NvbW1hbmROb3RGb3VuZDsKLQkJY2FzZSBJTlZBTElEX0VYSVRfQ09ERToKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfSW52YWxpZEV4aXRDb2RlOwotCQljYXNlIFNJR0hVUDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfSGFuZ3VwOwotCQljYXNlIFNJR0lOVDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVGVybWluYWxJbnRlcnJ1cHQ7Ci0JCWNhc2UgU0lHUVVJVDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVGVybWluYWxRdWl0OwotCQljYXNlIFNJR0lMTDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfSWxsZWdhbEluc3RydWN0aW9uOwotCQljYXNlIFNJR1RSQVA6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1RyYWNlVHJhcDsKLQkJY2FzZSBTSUdJT1Q6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0lPVFRyYXA7Ci0JCWNhc2UgU0lHQlVTOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19CVVNFcnJvcjsKLQkJY2FzZSBTSUdGUEU6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0Zsb2F0aW5nUG9pbnRFeGNlcHRpb247Ci0JCWNhc2UgU0lHS0lMTDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfS2lsbDsKLQkJY2FzZSBTSUdVU1IxOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Vc2VyRGVmaW5lZFNpZ25hbDE7Ci0JCWNhc2UgU0lHU0VHVjoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfSW52YWxpZE1lbW9yeVNlZ21lbnRBY2Nlc3M7Ci0JCWNhc2UgU0lHVVNSMjoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVXNlckRlZmluZWRTaWduYWwyOwotCQljYXNlIFNJR1BJUEU6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0Jyb2tlblBpcGU7Ci0JCWNhc2UgU0lHQUxSTToKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQWxhcm1DbG9jazsKLQkJY2FzZSBTSUdURVJNOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19UZXJtaW5hdGlvbjsKLQkJY2FzZSBTSUdTVEtGTFQ6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1N0YWNrRmF1bHQ7Ci0JCWNhc2UgU0lHQ0hMRDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQ2hpbGRQcm9jZXNzU3RvcHBlZE9yRXhpdGVkOwotCQljYXNlIFNJR0NPTlQ6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0NvbnRpbnVlRXhlY3V0aW5nOwotCQljYXNlIFNJR1NUT1A6Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1N0b3BFeGVjdXRpbmc7Ci0JCWNhc2UgU0lHVFNUUDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVGVybWluYWxTdG9wU2lnbmFsOwotCQljYXNlIFNJR1RUSU46Ci0JCQlyZXR1cm4gTWVzc2FnZXMuS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0JhY2tncm91bmRQcm9jZXNzUmVhZFRUWTsKLQkJY2FzZSBTSUdUVE9VOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19CYWNrZ3JvdW5kV3JpdGVUVFk7Ci0JCWNhc2UgU0lHVVJHOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19VcmdlbnRDb25kaXRpb25Tb2NrZXQ7Ci0JCWNhc2UgU0lHWENQVToKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQ1BVTGltaXRFeGNlZWRlZDsKLQkJY2FzZSBTSUdYRlNaOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19GaWxlU2l6ZUxpbWl0RXhjZWVkZWQ7Ci0JCWNhc2UgU0lHVlRBTFJNOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19WaXJ0dWFsQWxhcm1DbG9jazsKLQkJY2FzZSBTSUdQUk9GOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Qcm9maWxpbmdBbGFybUNsb2NrOwotCQljYXNlIFNJR1dJTkNIOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19XaW5kb3dTaXplQ2hhbmdlOwotCQljYXNlIFNJR0lPOgotCQkJcmV0dXJuIE1lc3NhZ2VzLktpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19JT1Bvc3NpYmxlOwotCQljYXNlIFNJR1BXUjoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfUG93ZXJGYWlsdXJlUmVzdGFydDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBNZXNzYWdlcy5LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVW5rbm93bjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXhjZXB0aW9uKGludCBzdGF0dXMpIHsKLQkJcmV0dXJuIChzdGF0dXMgPj0gMTI5KSAmJiAoc3RhdHVzIDw9IDE1OCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPSyhpbnQgc3RhdHVzKSB7Ci0JCXJldHVybiBzdGF0dXMgPD0gMTI1OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXhlY3V0YWJsZUVycm9yKGludCBzdGF0dXMpIHsKLQkJcmV0dXJuIChzdGF0dXMgPj0gMTI2KSAmJiAoc3RhdHVzIDw9IDEyOCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gd2FzRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gaXNFeGNlcHRpb24oZ2V0UmV0dXJuQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB3YXNPSygpIHsKLQkJcmV0dXJuIGlzT0soZ2V0UmV0dXJuQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB3YXNDb21tYW5kRXJyb3IoKSB7Ci0JCXJldHVybiBpc0V4ZWN1dGFibGVFcnJvcihnZXRSZXR1cm5Db2RlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1NfT0sgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1NfRVJST1IgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05PVF9FWEVDVVRBQkxFID0gMTI2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05PVF9GT1VORCA9IDEyNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0VYSVRfQ09ERSA9IDEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdIVVAgPSAxMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHSU5UID0gMTMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR1FVSVQgPSAxMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHSUxMID0gMTMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR1RSQVAgPSAxMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHSU9UID0gMTM0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR0JVUyA9IDEzNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdGUEUgPSAxMzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHS0lMTCA9IDEzNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdVU1IxID0gMTM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR1NFR1YgPSAxMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHVVNSMiA9IDE0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdQSVBFID0gMTQxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR0FMUk0gPSAxNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHVEVSTSA9IDE0MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdTVEtGTFQgPSAxNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHQ0hMRCA9IDE0NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdDT05UID0gMTQ2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR1NUT1AgPSAxNDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHVFNUUCA9IDE0ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdUVElOID0gMTQ5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR1RUT1UgPSAxNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHVVJHID0gMTUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR1hDUFUgPSAxNTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHWEZTWiA9IDE1MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdWVEFMUk0gPSAxNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHUFJPRiA9IDE1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdXSU5DSCA9IDE1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdJTyA9IDE1NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdQV1IgPSAxNTg7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9NZXNzYWdlcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmZmYjhkYi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2gubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX0F1dGhlbnRpY2F0aW9uVHlwZU5vdFN1cHBvcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX0Nvbm5lY3RfRmFpbGVkQ29ubmVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX0Nvbm5lY3RfRmFpbGVkVW5zdXBwb3J0ZWRLZXlTaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbm5lY3Rpb25fQ29ubmVjdF9GYWlsZWRDcmVhdGVDb250cm9sQ2hhbm5lbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX0Nvbm5lY3RfRmFpbGVkQ3JlYXRlU2Vzc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX0Nvbm5lY3RfRmFpbGVkQ3JlYXRlU0ZUUENvbm5lY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29ubmVjdGlvbl9Db25uZWN0X0ludmFsaWRQcml2YXRlS2V5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbm5lY3Rpb25fQ3JlYXRlQ29ubmVjdGlvblNsb3RfRmFpbGVkQ29ubmVjdE5ld1Nlc3Npb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29ubmVjdGlvbl9DcmVhdGVDb25uZWN0aW9uU2xvdF9GYWlsZWRDcmVhdGVOZXdTZXNzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbm5lY3Rpb25fQ3JlYXRlRXhlY0NoYW5uZWxfRmFpbGVkQ3JlYXRlTmV3RXhlY0NoYW5uZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29ubmVjdGlvbl9DcmVhdGVUdW5uZWxfRmFpbGVkQ3JlYXRlVHVubmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbm5lY3Rpb25fQ3JlYXRlVHVubmVsX1R1bm5lbFBvcnRBbHJlYWR5QWxsb2NlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX1JlbGVhc2VUdW5uZWxfRmFpbGVkUmVtb3ZlVHVubmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbm5lY3Rpb25fUmVsZWFzZVR1bm5lbF9Qb3J0Tm90QWxsb2NlZEZvclR1bm5lbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uX1NldENpcGhlclR5cGVfQ2lwaGVyTm90U3VwcG9ydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xDaGFubmVsX0RlYnVnX0NvbnRyb2xDb25uZWN0aW9uUmVjZWl2ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbENoYW5uZWxfRGVidWdfUmVjZWl2ZWRDb250cm9sVGVybWluYWxQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xDaGFubmVsX0RlYnVnX1N0YXJ0ZWRXYWl0aW5nQ29udHJvbFRlcm1pbmFsUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sQ2hhbm5lbF9PcGVuX0ZhaWxlZENyZWF0ZUF1eGlsaWFyeVNoZWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xDaGFubmVsX09wZW5fRmFpbGVkQ3JlYXRlSU9TdHJlYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbENoYW5uZWxfT3Blbl9GYWlsZWRTZW5kSW5pdENvbW1hbmRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xDaGFubmVsX09wZW5fV2FpdENvbnRyb2xUZXJtaW5hbFBhdGhJbnRlcnJ1cHRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5VG9vbHNfZG9Eb3dubG9hZEZpbGVUb0ZpbGVfQ2Fubm90V3JpdGVGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb29sc19kb0Rvd25sb2FkRmlsZVRvRmlsZV9Db21tYW5kRmFpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb29sc19kb0Rvd25sb2FkRmlsZVRvRmlsZV9FeGVjdXRpb25GYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weVRvb2xzX2RvVXBsb2FkRmlsZUZyb21GaWxlX0Nhbm5vdFJlYWRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb29sc19kb1VwbG9hZEZpbGVGcm9tRmlsZV9Db21tYW5kRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlUb29sc19kb1VwbG9hZEZpbGVGcm9tRmlsZV9FeGVjdXRpb25GYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRFeGVjdXRpb25fRG93bmxvYWRFeGVjdXRpb25fRmFpbGVkQ3JlYXRlRG93bmxvYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhlY3V0aW9uTWFuYWdlcl9DcmVhdGVUdW5uZWxfQWxsTG9jYWxQb3J0c0J1c3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhlY3V0aW9uT2JzZXJ2ZXJfRXhlY3V0aW9uT2JzZXJ2ZXJfUmVtb3RlQ29tbWFuZE9ic2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4ZWN1dGlvblRvb2xzX0V4ZWN1dGVCYXNoQ29tbWFuZF9GYWlsZWRSdW5CYXNoQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9EZWJ1Z18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19BbGFybUNsb2NrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19CYWNrZ3JvdW5kUHJvY2Vzc1JlYWRUVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0JhY2tncm91bmRXcml0ZVRUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQnJva2VuUGlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQlVTRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0NoaWxkUHJvY2Vzc1N0b3BwZWRPckV4aXRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQ29tbWFuZE5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Db250aW51ZUV4ZWN1dGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQ1BVTGltaXRFeGNlZWRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0ZpbGVTaXplTGltaXRFeGNlZWRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfRmxvYXRpbmdQb2ludEV4Y2VwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfSGFuZ3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19JbGxlZ2FsSW5zdHJ1Y3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0ludmFsaWRFeGl0Q29kZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfSW52YWxpZE1lbW9yeVNlZ21lbnRBY2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0lPUG9zc2libGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0lPVFRyYXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0tpbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX05vdEV4ZWN1dGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX09rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Qb3dlckZhaWx1cmVSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Qcm9maWxpbmdBbGFybUNsb2NrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19TdGFja0ZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19TdG9wRXhlY3V0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19UZXJtaW5hbEludGVycnVwdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVGVybWluYWxRdWl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19UZXJtaW5hbFN0b3BTaWduYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1Rlcm1pbmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19UcmFjZVRyYXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1VyZ2VudENvbmRpdGlvblNvY2tldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVXNlckRlZmluZWRTaWduYWwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Vc2VyRGVmaW5lZFNpZ25hbDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1ZpcnR1YWxBbGFybUNsb2NrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19XaW5kb3dTaXplQ2hhbmdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtpbGxhYmxlRXhlY3V0aW9uX1NjcmlwdEV4ZWN1dGlvbkNvbm5lY3Rpb25FeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGF0aFRvb2xzXzQ3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19GYWlsZWRTZXRQZXJtaXNzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19GZXRjaFJlbW90ZUF0dHJfRmFpbGVkRmV0Y2hBdHRyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19HZXRJdGVtX1BhdGhOb3RFeGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVGaWxlVG9vbHNfR2V0SXRlbXNQYXRoX0ZhaWxlZExpc3RSZW1vdGVGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVGaWxlVG9vbHNfTGlzdEZpbGVzX0ZhaWxlZExpc3RSZW1vdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlRmlsZVRvb2xzX1VwbG9hZFBlcm1pc3Npb25zX0ZhaWxlZFNldFBlcm1pc3Npb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19WYWxpZGF0ZUxvY2FsRGlyX05vdFZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19WYWxpZGF0ZUxvY2FsRmlsZV9Ob3RWYWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVGaWxlVG9vbHNfVmFsaWRhdGVMb2NhbEl0ZW1fRG9lc05vdEV4aXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19WYWxpZGF0ZVJlbW90ZURpcl9Ob3RWYWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVGaWxlVG9vbHNfVmFsaWRhdGVSZW1vdGVGaWxlX05vdFZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUZpbGVUb29sc19WYWxpZGF0ZVJlbW90ZVBhdGhfTm90VmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlU3RhdHVzVG9vbHNfR2V0UGFzc3dkRmllbGRzX05vVXNlcm5hbWVJblBhc3N3ZEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NyaXB0RXhlY3V0aW9uX1N0YXJ0RXhlY3V0aW9uX0ZhaWxlZEluaXRTdHJlYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZEV4ZWN1dGlvbl9TdGFydEV4ZWN1dGlvbl9GYWlsZWRDcmVhdGVVcGxvYWQ7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9QYXRoVG9vbHMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1BhdGhUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzgyYzJkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1BhdGhUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEuYXd0Lmdlb20uSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBhdGhUb29sczsKLQotCi1wdWJsaWMgY2xhc3MgUGF0aFRvb2xzIGltcGxlbWVudHMgSVJlbW90ZVBhdGhUb29scyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJvb3RQYXRoID0gIi8iOyAvLyROT04tTkxTLTEkCi0JRXhlY3V0aW9uTWFuYWdlciBleGVjdXRpb25NYW5hZ2VyOwotCQotCXB1YmxpYyBQYXRoVG9vbHMoRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMuZXhlY3V0aW9uTWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyByb290UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcocm9vdFBhdGgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUm9vdChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcGF0aC5lcXVhbHMocm9vdFBhdGgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHBhdGguc3RhcnRzV2l0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gISBwYXRoLnN0YXJ0c1dpdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0xlYXZlKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiAhIChpc1Jvb3QocGF0aCkgfHwgcGF0aC5lbmRzV2l0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxlYXZlKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uKCk7Ci0JCWlmIChpc1Jvb3QocGF0aCkpIHJldHVybiByb290UGF0aCgpOwotCQlpZiAoaXNMZWF2ZShwYXRoKSkgewotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCktMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyhwYXRoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgY2Fub25pY2FsaXplKFN0cmluZyBwYXRoKSB7Ci0JCS8qCi0JCSAqIFJlbW92ZSAiLiIgKGN1cnJlbnQgZGlyZWN0b3J5KQotCQkgKiBSZW1vdmUgImEvLi4iIChwYXJlbnQgZGlyZWN0b3J5KQotCQkgKiBSZW1vdmUgIi8vIiAoZW1wdHkgZGlyZWN0b3J5KQotCQkgKi8KLQkJaWYgKHBhdGggPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24oKTsKLQkJaWYgKGlzUm9vdChwYXRoKSkgcmV0dXJuIHJvb3RQYXRoKCk7Ci0JCQotCQkvKgotCQkgKiBTcGxpdCB0aGUgcGF0aCBhbiByZW1lYmVyIHByb3BlcnRpZXMuCi0JCSAqLwotCQlTdHJpbmcgc2VnbWVudHNbXSA9IHNwbGl0KHBhdGgpOwotCQlib29sZWFuIGFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKTsKLQkJYm9vbGVhbiBsZWF2ZSA9IGlzTGVhdmUocGF0aCk7Ci0JCQotCQlyZXR1cm4gY2Fub25pY2FsaXplKHNlZ21lbnRzLCBhYnNvbHV0ZSwgbGVhdmUpOwotCX0KLQkJCi0JcHJpdmF0ZSBTdHJpbmcgY2Fub25pY2FsaXplKFN0cmluZyBzZWdtZW50c1tdLCBib29sZWFuIGFic29sdXRlLCBib29sZWFuIGxlYXZlKSB7Ci0JCWludCBsYXN0UG9zaXRpb24gPSAwOwotCQlpbnQgY3VycmVudFBvc2l0aW9uID0gMDsKLQkJaW50IGN1cnJlbnRTaXplID0gc2VnbWVudHMubGVuZ3RoOwotCQl3aGlsZSAoY3VycmVudFBvc2l0aW9uIDwgc2VnbWVudHMubGVuZ3RoKSB7Ci0JCQlTdHJpbmcgc2VnbWVudCA9IHNlZ21lbnRzW2N1cnJlbnRQb3NpdGlvbl07Ci0JCQlpZiAoc2VnbWVudC5lcXVhbHMoIi4iKSB8fCBzZWdtZW50LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy8gU2tpcCBzZWdtZW50Ci0JCQkJY3VycmVudFBvc2l0aW9uKys7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKHNlZ21lbnQuZXF1YWxzKCIuLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobGFzdFBvc2l0aW9uID09IDApIHsKLQkJCQkJaWYgKGFic29sdXRlKSB7Ci0JCQkJCQkvLyBJZ25vcmUsIHRoZSBwYXJlbnQgb2YgdGhlIHJvb3QgaXMgdGhlIHJvb3QgaXRzZWxmLgotCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gS2VlcCwgc2luY2UgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0JCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uID4gbGFzdFBvc2l0aW9uKSB7Ci0JCQkJCQkJc2VnbWVudHNbbGFzdFBvc2l0aW9uXSA9IHNlZ21lbnRzW2N1cnJlbnRQb3NpdGlvbl07Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0UG9zaXRpb24rKzsKLQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOwkJCQkKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFJlbW92ZSB0aGUgc2VnbWVudCBhbmQgdGhlIHBhcmVudCwgaWYgdGhlIHBhcmVudCBpcyBub3QgYWxyZWFkeSAiLi4iCi0JCQkJCVN0cmluZyBzZWdtZW50MiA9IHNlZ21lbnRzW2xhc3RQb3NpdGlvbi0xXTsKLQkJCQkJaWYgKHNlZ21lbnQyLmVxdWFscygiLi4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBLZWVwCi0JCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uID4gbGFzdFBvc2l0aW9uKSB7Ci0JCQkJCQkJc2VnbWVudHNbbGFzdFBvc2l0aW9uXSA9IHNlZ21lbnRzW2N1cnJlbnRQb3NpdGlvbl07Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0UG9zaXRpb24rKzsKLQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOwkJCQkKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFJlbW92ZSBwYXJlbnQKLQkJCQkJCWxhc3RQb3NpdGlvbi0tOwotCQkJCQkJY3VycmVudFBvc2l0aW9uKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEtlZXAKLQkJCQlpZiAoY3VycmVudFBvc2l0aW9uID4gbGFzdFBvc2l0aW9uKSB7Ci0JCQkJCXNlZ21lbnRzW2xhc3RQb3NpdGlvbl0gPSBzZWdtZW50c1tjdXJyZW50UG9zaXRpb25dOwotCQkJCX0KLQkJCQlsYXN0UG9zaXRpb24rKzsKLQkJCQljdXJyZW50UG9zaXRpb24rKzsKLQkJCX0KLQkJfQotCQljdXJyZW50U2l6ZSA9IGxhc3RQb3NpdGlvbjsKLQkJCQkKLQkJLyoKLQkJICogUmVidWlsZCB0aGUgcGF0aCBhcyBhIHN0cmluZy4KLQkJICovCi0JCXJldHVybiB1bnNwbGl0KHNlZ21lbnRzLCAwLCBjdXJyZW50U2l6ZS0xLCBhYnNvbHV0ZSwgbGVhdmUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGpvaW4oU3RyaW5nIGJhc2UsIFN0cmluZyBwYXRoKSB7Ci0JCWlmIChiYXNlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uKCk7Ci0JCWlmIChpc0Fic29sdXRlKHBhdGgpKSByZXR1cm4gY2Fub25pY2FsaXplKHBhdGgpOwotCQlTdHJpbmcgczFbXSA9IHNwbGl0KGJhc2UpOwotCQlTdHJpbmcgczJbXSA9IHNwbGl0KHBhdGgpOwotCQlTdHJpbmcgc1tdID0gbmV3IFN0cmluZ1tzMS5sZW5ndGggKyBzMi5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHMxLCAwLCBzLCAwLCBzMS5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHMyLCAwLCBzLCBzMS5sZW5ndGgsIHMyLmxlbmd0aCk7Ci0JCWJvb2xlYW4gYWJzb2x1dGUgPSBpc0Fic29sdXRlKGJhc2UpOwotCQlib29sZWFuIGxlYXZlID0gaXNMZWF2ZShwYXRoKTsKLQkJcmV0dXJuIGNhbm9uaWNhbGl6ZShzLGFic29sdXRlLGxlYXZlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBwYXJlbnQoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24oKTsKLQkJaWYgKGlzUm9vdChwYXRoKSkgcmV0dXJuIHJvb3RQYXRoKCk7Ci0JCXJldHVybiBqb2luKHBhdGgsICIuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIFtdIHNwbGl0IChTdHJpbmcgcGF0aCkgewotCQlpZiAoaXNSb290KHBhdGgpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgZW5kID0gcGF0aC5sZW5ndGgoKTsKLQkJaWYgKGlzQWJzb2x1dGUocGF0aCkpIHsKLQkJCS8vIElnbm9yZSB0cmFpbGluZyAiLyIKLQkJCXN0YXJ0Kys7Ci0JCX0KLQkJaWYgKCEgaXNMZWF2ZShwYXRoKSkgewotCQkJLy8gSWdub3JlIGVuZGluZyAiLyIKLQkJCWVuZC0tOwotCQl9Ci0JCXJldHVybiBwYXRoLnN1YnN0cmluZyhzdGFydCwgZW5kKS5zcGxpdCgiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdW5zcGxpdChTdHJpbmdbXSBzZWdtZW50cywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sZWFuIGFic29sdXRlLCBib29sZWFuIGxlYXZlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpbnQgc2VnbWVudENvdW50ID0gZW5kLXN0YXJ0KzE7Ci0JCWlmIChzZWdtZW50Q291bnQgPD0gMCkgewotCQkJaWYgKGFic29sdXRlKSB7Ci0JCQkJcmV0dXJuIHJvb3RQYXRoOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAoYWJzb2x1dGUpIHsKLQkJCXJlc3VsdCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKLQkJCWlmIChpICE9IHN0YXJ0KSB7Ci0JCQkJcmVzdWx0ICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzdWx0ICs9IHNlZ21lbnRzW2ldOwotCQl9Ci0JCWlmICghIGxlYXZlKSB7Ci0JCQlpZiAoc2VnbWVudENvdW50ID4gMCkgewotCQkJCXJlc3VsdCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBwYXRoLCBib29sZWFuIGZ1bGwpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgaXRlciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihwYXRoKTsKLQkJZm9yIChjaGFyIGMgPSBpdGVyLmZpcnN0KCk7IGMgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsgYyA9IGl0ZXIubmV4dCgpKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJygnOgotCQkJY2FzZSAnKSc6Ci0JCQljYXNlICdbJzoKLQkJCWNhc2UgJ10nOgotCQkJY2FzZSAneyc6Ci0JCQljYXNlICd9JzoKLQkJCWNhc2UgJ3wnOgotCQkJY2FzZSAnXFwnOgotCQkJY2FzZSAnKic6Ci0JCQljYXNlICcmJzoKLQkJCWNhc2UgJ14nOgotCQkJY2FzZSAnJSc6Ci0JCQljYXNlICckJzoKLQkJCWNhc2UgJyMnOgotCQkJY2FzZSAnQCc6Ci0JCQljYXNlICchJzoKLQkJCWNhc2UgJ34nOgotCQkJY2FzZSAnYCc6Ci0JCQljYXNlICdcJyc6Ci0JCQljYXNlICciJzoKLQkJCWNhc2UgJzonOgotCQkJY2FzZSAnOyc6Ci0JCQljYXNlICc/JzoKLQkJCWNhc2UgJzwnOgotCQkJY2FzZSAnPic6Ci0JCQljYXNlICcsJzoKLQkJCWNhc2UgJ1xuJzoKLQkJCQlpZiAoZnVsbCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSAnICc6Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWNvbnRpbnVlOwotCQkJZGVmYXVsdDoKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUlSZW1vdGVQYXRoVG9vbHMgdG9vbHMgPSBuZXcgUGF0aFRvb2xzKG51bGwpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucm9vdFBhdGgoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuaXNSb290KCIvIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5pc1Jvb3QoIi9hIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5pc1Jvb3QoIi9hLyIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuaXNSb290KCJhIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuaXNBYnNvbHV0ZSgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuaXNBYnNvbHV0ZSgiL2EiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmlzQWJzb2x1dGUoIi9hLyIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuaXNBYnNvbHV0ZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmlzUmVsYXRpdmUoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmlzUmVsYXRpdmUoIi9hIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5pc1JlbGF0aXZlKCIvYS8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmlzUmVsYXRpdmUoImEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5pc0xlYXZlKCIvIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5pc0xlYXZlKCIvYSIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuaXNMZWF2ZSgiL2EvIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5pc0xlYXZlKCJhIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucGFyZW50KCIvIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoIi9hIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoIi9hL2IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiL2EvIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoIi9hLy4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiL2EvLi4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiL2EvLyIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucGFyZW50KCIvYS9iLyIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucGFyZW50KCIvYS9iLy4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiL2EvYi8uLiIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucGFyZW50KCIvYS9iLy8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiLy4uIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoIi8uIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucGFyZW50KCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMucGFyZW50KCJhL2IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudChNZXNzYWdlcy5QYXRoVG9vbHNfNDcpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiYS8uIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoImEvLi4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiYS8vIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoImEvYi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiYS9iLy4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLnBhcmVudCgiYS9iLy4uIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoImEvYi8vIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoIi4uIikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5wYXJlbnQoIi4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCJiIiwgImEiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuam9pbigiYiIsICIvYSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCJiIiwgIi4uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oImIiLCAiLiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCJiIiwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCJiIiwgIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCJiLyIsICJhIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oImIvIiwgIi9hIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oImIvIiwgIi4uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oImIvIiwgIi4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuam9pbigiYi8iLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oImIvIiwgIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIuIiwgImEiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuam9pbigiLiIsICIvYSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIuIiwgIi4uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIi4iLCAiLiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIuIiwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIuIiwgIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIuLiIsICJhIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIi4uIiwgIi9hIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIi4uIiwgIi4uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIi4uIiwgIi4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuam9pbigiLi4iLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIi4uIiwgIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIiLCAiYSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0b29scy5qb2luKCIiLCAiL2EiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuam9pbigiIiwgIi4uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIiIsICIuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRvb2xzLmpvaW4oIiIsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odG9vbHMuam9pbigiIiwgIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUG9ydEZvcndhcmRpbmdUb29scy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUG9ydEZvcndhcmRpbmdUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTg4Yzk3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1BvcnRGb3J3YXJkaW5nVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVBvcnRGb3J3YXJkaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlUG9ydEZvcndhcmRpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHN9IGZvciBTU0guCi0gKiBJdCBzaW1wbHkgcmVkaXJlY3RzIHJlcXVlc3RzIHRvIHRoZSB7QGxpbmsgUmVtb3RlUG9ydEZvcndhcmRpbmdQb29sfSBtYW5hZ2VkIGJ5IHRoZSB7QGxpbmsgQ29ubmVjdGlvbn0sIGJ1dCBmaWx0ZXJpbmcgdGhlIGZvcndhcmRpbmdzIGZvciB0aGUgZXhlY3V0aW9uIG1hbmFnZXIuCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIFBvcnRGb3J3YXJkaW5nVG9vbHMgaW1wbGVtZW50cyBJUmVtb3RlUG9ydEZvcndhcmRpbmdUb29scyB7Ci0JRXhlY3V0aW9uTWFuYWdlciBleGVjdXRpb25NYW5hZ2VyOwotCQotCVBvcnRGb3J3YXJkaW5nVG9vbHMoRXhlY3V0aW9uTWFuYWdlciBleGVjdXRpb25NYW5hZ2VyKSB7Ci0JCXRoaXMuZXhlY3V0aW9uTWFuYWdlciA9IGV4ZWN1dGlvbk1hbmFnZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlUG9ydEZvcndhcmRpbmdUb29scyNmb3J3YXJkUmVtb3RlUG9ydChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZVBvcnRGb3J3YXJkaW5nIGZvcndhcmRSZW1vdGVQb3J0KGludCByZW1vdGVQb3J0LCBpbnQgbG9jYWxQb3J0KQotCQkJdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGlvbk1hbmFnZXIudGVzdCgpOwotCQl0aGlzLmV4ZWN1dGlvbk1hbmFnZXIudGVzdENhbmNlbCgpOwotCQkKLQkJUmVtb3RlUG9ydEZvcndhcmRpbmcgZm9yd2FyZGluZyA9IHRoaXMuZXhlY3V0aW9uTWFuYWdlci5jb25uZWN0aW9uLmZvcndhcmRpbmdQb29sLmNyZWF0ZVJlbW90ZVBvcnRGb3J3YXJkaW5nKHRoaXMuZXhlY3V0aW9uTWFuYWdlciwgcmVtb3RlUG9ydCwKLQkJCQkJCW51bGwsIGxvY2FsUG9ydCk7Ci0JCXJldHVybiBmb3J3YXJkaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBvcnRGb3J3YXJkaW5nVG9vbHMjZm9yd2FyZFJlbW90ZVBvcnQoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIElSZW1vdGVQb3J0Rm9yd2FyZGluZyBmb3J3YXJkUmVtb3RlUG9ydChpbnQgcmVtb3RlUG9ydCwKLQkJCVN0cmluZyBsb2NhbEFkZHJlc3MsIGludCBsb2NhbFBvcnQpCi0JCQl0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0aW9uTWFuYWdlci50ZXN0KCk7Ci0JCXRoaXMuZXhlY3V0aW9uTWFuYWdlci50ZXN0Q2FuY2VsKCk7Ci0KLQkJUmVtb3RlUG9ydEZvcndhcmRpbmcgZm9yd2FyZGluZyA9IHRoaXMuZXhlY3V0aW9uTWFuYWdlci5jb25uZWN0aW9uLmZvcndhcmRpbmdQb29sCi0JCS5jcmVhdGVSZW1vdGVQb3J0Rm9yd2FyZGluZyh0aGlzLmV4ZWN1dGlvbk1hbmFnZXIsIHJlbW90ZVBvcnQsCi0JCQkJbG9jYWxBZGRyZXNzLCBsb2NhbFBvcnQpOwotCQlyZXR1cm4gZm9yd2FyZGluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzI2dldFJlbW90ZVBvcnRGb3J3YXJkaW5nKGludCkKLQkgKi8KLQlwdWJsaWMgSVJlbW90ZVBvcnRGb3J3YXJkaW5nIGdldFJlbW90ZVBvcnRGb3J3YXJkaW5nKGludCByZW1vdGVQb3J0KSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUG9ydEZvcndhcmRpbmdFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGlvbk1hbmFnZXIudGVzdCgpOwotCi0JCVJlbW90ZVBvcnRGb3J3YXJkaW5nIGZvcndhcmRpbmcgPSB0aGlzLmV4ZWN1dGlvbk1hbmFnZXIuY29ubmVjdGlvbi5mb3J3YXJkaW5nUG9vbC5nZXRSZW1vdGVQb3J0Rm9yd2FyZGluZyhyZW1vdGVQb3J0KTsKLQkJCi0JCS8qIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGZvcndhcmRpbmcgZm9yIHRoZSByZW1vdGUgcG9ydC4gKi8KLQkJaWYgKGZvcndhcmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBmb3J3YXJkaW5nIGZvciB0aGUgcmVtb3RlIHBvcnQsIGJ1dCBpdCBkb2VzIG5vdCBiZWxvbmcgdGhlIHRoZSBFeGVjdXRpb25NYW5hZ2VyLiAqLwotCQlpZiAoZm9yd2FyZGluZy5vd25lciAhPSB0aGlzLmV4ZWN1dGlvbk1hbmFnZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZm9yd2FyZGluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZ1Rvb2xzI3JlbGVhc2VGb3J3YXJkaW5nKG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklQb3J0Rm9yd2FyZGluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRm9yd2FyZGluZyhJUG9ydEZvcndhcmRpbmcgZm9yd2FyZGluZykKLQkJCXRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbiB7Ci0JCWFzc2VydCBmb3J3YXJkaW5nICE9IG51bGw7Ci0JCXRoaXMuZXhlY3V0aW9uTWFuYWdlci50ZXN0KCk7Ci0KLQkJaWYgKGZvcndhcmRpbmcgaW5zdGFuY2VvZiBSZW1vdGVQb3J0Rm9yd2FyZGluZykgewotCQkJdGhpcy5leGVjdXRpb25NYW5hZ2VyLmNvbm5lY3Rpb24uZm9yd2FyZGluZ1Bvb2wucmVsZWFzZVJlbW90ZVBvcnRGb3J3YXJkaW5nKChSZW1vdGVQb3J0Rm9yd2FyZGluZykgZm9yd2FyZGluZywgdGhpcy5leGVjdXRpb25NYW5hZ2VyKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEZvcndhcmRpbmcgaXMgbm90IGEgdmFsaWQgaW5zdGFuY2UuICovCi0JCQlhc3NlcnQgZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZWdleEZpbGVOYW1lRmlsdGVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZWdleEZpbGVOYW1lRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxNmMwNTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUmVnZXhGaWxlTmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWNsYXNzIFJlZ2V4RmlsZU5hbWVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0JUGF0dGVybiBwYXR0ZXJuOwotCU1hdGNoZXIgbWF0Y2hlcjsKLQlSZWdleEZpbGVOYW1lRmlsdGVyKFN0cmluZyByZWdleCkgewotCQl0aGlzLnBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihuYW1lKTsJCQkKLQkJcmV0dXJuIG1hdGNoZXIubWF0Y2hlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVEaXJlY3RvcnkuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1JlbW90ZURpcmVjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmQyODhiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1JlbW90ZURpcmVjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Z0cEFUVFJTOwotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsU2Z0cC5Mc0VudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdGVEaXJlY3RvcnkgZXh0ZW5kcyBSZW1vdGVJdGVtIGltcGxlbWVudHMKLQkJSVJlbW90ZURpcmVjdG9yeSB7Ci0KLQlSZW1vdGVEaXJlY3RvcnkoRmlsZVRvb2xzIGZpbGVUb29scywgU3RyaW5nIHBhdGgpIHsKLQkJc3VwZXIoZmlsZVRvb2xzLCBwYXRoKTsKLQl9Ci0JCi0JcHVibGljIFJlbW90ZURpcmVjdG9yeShSZW1vdGVJdGVtIGl0ZW0pIHsKLQkJc3VwZXIoKTsKLQkJY29weUF0dHJpYnV0ZXNGcm9tKGl0ZW0pOwotCX0KLQotCVJlbW90ZURpcmVjdG9yeShGaWxlVG9vbHMgZmlsZVRvb2xzLCBTdHJpbmcgcGF0aCwgU2Z0cEFUVFJTIGF0dHJzKSB7Ci0JCXN1cGVyKGZpbGVUb29scywgcGF0aCwgYXR0cnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVEaXJlY3RvcnkjaXNBY2Nlc3NpYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0JCXJldHVybiBzdXBlci5pc0V4ZWN1dGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzaWJsZShib29sZWFuIGZsYWcpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRFeGVjdXRhYmxlKGZsYWcpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVGaWxlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1OWRiNTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUmVtb3RlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Z0cEFUVFJTOwotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsU2Z0cC5Mc0VudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdGVGaWxlIGV4dGVuZHMgUmVtb3RlSXRlbSBpbXBsZW1lbnRzIElSZW1vdGVGaWxlIHsKLQotCVJlbW90ZUZpbGUoRmlsZVRvb2xzIGZpbGVUb29scywgU3RyaW5nIHBhdGgsIFNmdHBBVFRSUyBhdHRycykgewotCQlzdXBlcihmaWxlVG9vbHMsIHBhdGgsIGF0dHJzKTsKLQl9Ci0KLQlSZW1vdGVGaWxlKEZpbGVUb29scyBmaWxlVG9vbHMsIFN0cmluZyBwYXRoKSB7Ci0JCXN1cGVyKGZpbGVUb29scywgcGF0aCk7Ci0JfQotCQotCXB1YmxpYyBSZW1vdGVGaWxlKFJlbW90ZUl0ZW0gaXRlbSkgewotCQlzdXBlcigpOwotCQljb3B5QXR0cmlidXRlc0Zyb20oaXRlbSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUZpbGUjZ2V0U2l6ZSgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFeGVjdXRhYmxlKCkgewotCQlyZXR1cm4gc3VwZXIuaXNFeGVjdXRhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGUoYm9vbGVhbiBmbGFnKSB7Ci0JCXN1cGVyLnNldEV4ZWN1dGFibGUoZmxhZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUmVtb3RlRmlsZUVudW1lcmF0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVGaWxlRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODlkOWEwZi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVGaWxlRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogRW51bWVyYXRpb24gb2YgZmlsZXMgb24gdGhlIHJlbW90ZSBob3N0LgotICogVGhlIGVudW1lcmF0aW9uIHN0b3BzIHdoZW46Ci0gKiA8dWw+Ci0gKiA8bGk+QWxsIGZpbGVzIGhhdmUgYmVlbiBlbnVtZXJhdGVkLgotICogPGxpPlRoZSBleGVjdXRpb24gbWFuYWdlciBnZXRzIGNhbmNlbGVkLgotICogPGxpPlRoZSBjb25uZWN0aW9uIGZhaWxzCi0gKiA8L3VsPgotICogSWYgYW4gZWxlbWVudCBmYWlscyB0byBiZSByZXRyaWV2ZWQsIGFuIGV4Y2VwdGlvbiBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50LgotICogCi0gKiBJbnN0ZWFkIG9mIHtAbGluayAjbmV4dEVsZW1lbnQoKX0sIG9uZSBtYXkgY2FsbCB7QGxpbmsgI25leHRSZW1vdGVJdGVtKCl9LgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZUZpbGVFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIElSZW1vdGVGaWxlRW51bWVyYXRpb24gewotCi0JSVJlbW90ZUl0ZW1bXSBpdGVtcyA9IG51bGw7Ci0JaW50IGN1cnJlbnRJdGVtID0gMDsKLQlGaWxlVG9vbHMgZmlsZVRvb2xzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBFbnVtZXJhdGVzIGFsbCBmaWxlcyBvbiBhIGdpdmVuIHJvb3QgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVG9vbHMKLQkgKiBAcGFyYW0gZGlyZWN0b3J5UGF0aCBUaGUgcmVtb3RlIGRpcmVjdG9yeS4gTXVzdCBiZSBhIHZhbGlkIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBUaGUgcm9vdCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5LgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICovCi0JUmVtb3RlRmlsZUVudW1lcmF0aW9uKEZpbGVUb29scyBmaWxlVG9vbHMsIFN0cmluZyBkaXJlY3RvcnlQYXRoKSB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQkvLyBkb250IG5lZWQsIGxpc3RJdGVtcyhyb290KSB3aWxsIHRlc3QKLQkJLy8gZmlsZVRvb2xzLnRlc3QoKTsKLQotCQl0aGlzLmZpbGVUb29scyA9IGZpbGVUb29sczsKLQkJdGhpcy5pdGVtcyA9IGZpbGVUb29scy5saXN0SXRlbXMoZGlyZWN0b3J5UGF0aCk7Ci0JCXRoaXMuY3VycmVudEl0ZW0gPSAwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBjdXJyZW50SXRlbSA8IGl0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQlyZXR1cm4gbmV4dEVsZW1lbnRBc0l0ZW0oKTsKLQl9Ci0JCi0JcHVibGljIElSZW1vdGVJdGVtIG5leHRFbGVtZW50QXNJdGVtKCkgewotCQlpZiAoY3VycmVudEl0ZW0gPj0gaXRlbXMubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBpdGVtc1tjdXJyZW50SXRlbSsrXTsKLQl9Ci0KLQlwdWJsaWMgRXhjZXB0aW9uIG5leHRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBudWxsOyAvLyBhbHdheXMgbnVsbHMKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUmVtb3RlRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRmMzNlYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIFJlbW90ZUZpbGVSZWN1cnNpdmVFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIElSZW1vdGVGaWxlRW51bWVyYXRpb24gewotCi0JU3RhY2sgZGlyZWN0b3JpZXM7Ci0JUmVtb3RlRmlsZUVudW1lcmF0aW9uIGN1cnJlbnRJdGVtczsKLQlGaWxlVG9vbHMgZmlsZVRvb2xzOwotCUxpbmtlZExpc3QgY3VycmVudEV4Y2VwdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCUlSZW1vdGVJdGVtIG5leHRSZW1vdGVJdGVtOwotCQotCXB1YmxpYyBSZW1vdGVGaWxlUmVjdXJzaXZlRW51bWVyYXRpb24oRmlsZVRvb2xzIGZpbGVUb29scywgU3RyaW5nIHJvb3QpIHRocm93cyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZmlsZVRvb2xzID0gZmlsZVRvb2xzOwotCQkvLyBkb250IG5lZWQsIGdldEl0ZW0ocm9vdCkgd2lsbCB0ZXN0Ci0JCS8vIGZpbGVUb29scy50ZXN0KCk7Ci0JCWRpcmVjdG9yaWVzID0gbmV3IFN0YWNrKCk7Ci0JCWRpcmVjdG9yaWVzLmFkZChyb290KTsKLQkJcHJlZmV0Y2hOZXh0UmVtb3RlSXRlbSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJlZmV0Y2hOZXh0UmVtb3RlSXRlbSgpIHsKLQkJaWYgKGRpcmVjdG9yaWVzID09IG51bGwpIHsKLQkJCS8vIEVudW1lcmF0aW9uIHN0b3BwZWQgZHVlIHRvIGVycm9yLgotCQkJbmV4dFJlbW90ZUl0ZW0gPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQluZXh0UmVtb3RlSXRlbSA9IG51bGw7Ci0JCXdoaWxlIChjdXJyZW50SXRlbXMgPT0gbnVsbCB8fCAhIGN1cnJlbnRJdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJaWYgKGRpcmVjdG9yaWVzLmVtcHR5KCkpIHsKLQkJCQkvLyBObyBtb3JlIGRpcmVjdG9yaWVzIGFyZSBpbiBzdGFjay4gVGVybWluYXRlIHdpdGhvdXQgYW55IGl0ZW0uCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIHJvb3QgPSAoU3RyaW5nKWRpcmVjdG9yaWVzLnBvcCgpOwotCQkJdHJ5IHsKLQkJCQljdXJyZW50SXRlbXMgPSBuZXcgUmVtb3RlRmlsZUVudW1lcmF0aW9uKGZpbGVUb29scywgcm9vdCk7Ci0JCQl9IGNhdGNoIChDYW5jZWxFeGNlcHRpb24gZSkgewotCQkJCWN1cnJlbnRFeGNlcHRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCQljdXJyZW50RXhjZXB0aW9ucy5hZGRMYXN0KGUpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJCWN1cnJlbnRFeGNlcHRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCQljdXJyZW50RXhjZXB0aW9ucy5hZGRMYXN0KGUpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJY3VycmVudEV4Y2VwdGlvbnMuYWRkTGFzdChlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQkJCi0JCUlSZW1vdGVJdGVtIGl0ZW0gPSBjdXJyZW50SXRlbXMubmV4dEVsZW1lbnRBc0l0ZW0oKTsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJUmVtb3RlRGlyZWN0b3J5KSB7Ci0JCQlJUmVtb3RlRGlyZWN0b3J5IGRpcmVjdG9yeSA9IChJUmVtb3RlRGlyZWN0b3J5KSBpdGVtOwotCQkJZGlyZWN0b3JpZXMuYWRkKGRpcmVjdG9yeS5nZXRQYXRoKCkpOwotCQl9Ci0JCW5leHRSZW1vdGVJdGVtID0gaXRlbTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXh0UmVtb3RlSXRlbSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBFeGNlcHRpb24gbmV4dEV4Y2VwdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRFeGNlcHRpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEV4Y2VwdGlvbikgY3VycmVudEV4Y2VwdGlvbnMucmVtb3ZlRmlyc3QoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiBjdXJyZW50RXhjZXB0aW9ucy5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBJUmVtb3RlSXRlbSBuZXh0RWxlbWVudEFzSXRlbSgpIHsKLQkJaWYgKG5leHRSZW1vdGVJdGVtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSVJlbW90ZUl0ZW0gcmV0dXJuSXRlbSA9IG5leHRSZW1vdGVJdGVtOwotCQlwcmVmZXRjaE5leHRSZW1vdGVJdGVtKCk7Ci0JCXJldHVybiByZXR1cm5JdGVtOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiBuZXh0RWxlbWVudEFzSXRlbSgpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1JlbW90ZUl0ZW0uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1JlbW90ZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVlMGE1Mi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNmdHBBVFRSUzsKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Z0cEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbFNmdHAuTHNFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0gKgotICovCi1jbGFzcyBSZW1vdGVJdGVtIGltcGxlbWVudHMgSVJlbW90ZUl0ZW0gewotCi0JU3RyaW5nIHBhdGg7Ci0JYm9vbGVhbiBpc1JlYWRhYmxlOwotCWJvb2xlYW4gaXNXcml0YWJsZTsKLQlib29sZWFuIGlzRXhlY3V0YWJsZTsKLQlib29sZWFuIGV4aXN0OwotCUZpbGVUb29scyBmaWxlVG9vbHM7Ci0JaW50IHVzZXJJRDsKLQlpbnQgcGVybWlzc2lvbnM7Ci0JbG9uZyBzaXplOwotCWludCBhY2Nlc3NUaW1lOwotCWludCBtb2RpZmljYXRpb25UaW1lOwotCXByb3RlY3RlZCBpbnQgZ3JvdXBJRDsKLQlwcm90ZWN0ZWQgaW50IGNoYW5nZXM7Ci0JYm9vbGVhbiBpc0RpcmVjdG9yeTsKLQkKLQlmaW5hbCBwcm90ZWN0ZWQgaW50IFBFUk1JU1NJT04gPSAxOwotCWZpbmFsIHByb3RlY3RlZCBpbnQgTU9ESUZJQ0FUSU9OX1RJTUUgPSAyOwotCQotCVJlbW90ZUl0ZW0oRmlsZVRvb2xzIGZpbGVUb29scywgU3RyaW5nIHBhdGgpCXsKLQkJdGhpcy5maWxlVG9vbHMgPSBmaWxlVG9vbHM7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCQotCVJlbW90ZUl0ZW0oRmlsZVRvb2xzIGZpbGVUb29scywgU3RyaW5nIHBhdGgsIFNmdHBBVFRSUyBhdHRycykgewotCQl0aGlzLmZpbGVUb29scyA9IGZpbGVUb29sczsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCi0JCXBhcnNlQXR0cnMoYXR0cnMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVtb3RlSXRlbSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QXR0cmlidXRlc0Zyb20oUmVtb3RlSXRlbSBvdGhlcikgewotCQl0aGlzLnBhdGggPSBvdGhlci5wYXRoOwotCQl0aGlzLmlzUmVhZGFibGUgPSBvdGhlci5pc1JlYWRhYmxlOwotCQl0aGlzLmlzV3JpdGFibGUgPSBvdGhlci5pc1dyaXRhYmxlOwotCQl0aGlzLmlzRXhlY3V0YWJsZSA9IG90aGVyLmlzRXhlY3V0YWJsZTsKLQkJdGhpcy5leGlzdCA9IG90aGVyLmV4aXN0OwotCQl0aGlzLmZpbGVUb29scyA9IG90aGVyLmZpbGVUb29sczsKLQkJdGhpcy51c2VySUQgPSBvdGhlci51c2VySUQ7Ci0JCXRoaXMucGVybWlzc2lvbnMgPSBvdGhlci5wZXJtaXNzaW9uczsKLQkJdGhpcy5zaXplID0gb3RoZXIuc2l6ZTsKLQkJdGhpcy5hY2Nlc3NUaW1lID0gb3RoZXIuYWNjZXNzVGltZTsKLQkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gb3RoZXIubW9kaWZpY2F0aW9uVGltZTsKLQkJdGhpcy5ncm91cElEID0gb3RoZXIuZ3JvdXBJRDsKLQkJdGhpcy5jaGFuZ2VzID0gb3RoZXIuY2hhbmdlczsKLQkJdGhpcy5pc0RpcmVjdG9yeSA9IG90aGVyLmlzRGlyZWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBleGlzdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaEF0dHJpYnV0ZXMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbGVUb29scy50ZXN0KCk7Ci0JCVNmdHBBVFRSUyBhdHRycyA9IGZpbGVUb29scy5mZXRjaFJlbW90ZUF0dHIocGF0aCk7Ci0JCQotCQlwYXJzZUF0dHJzKGF0dHJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VBdHRycyhTZnRwQVRUUlMgYXR0cnMpIHsKLQkJLyoKLQkJICogTm8gZmlsZSBmb3VuZC4KLQkJICovCi0JCWlmIChhdHRycyA9PSBudWxsKSB7Ci0JCQlleGlzdCA9IGZhbHNlOwotCQkJcmV0dXJuOwotCQl9IAotCQkKLQkJZXhpc3QgPSB0cnVlOwotCQljaGFuZ2VzID0gMDsKLQotCQlpc0RpcmVjdG9yeSA9IGF0dHJzLmlzRGlyKCk7Ci0JCQotCQl1c2VySUQgPSBhdHRycy5nZXRVSWQoKTsKLQkJZ3JvdXBJRCA9IGF0dHJzLmdldEdJZCgpOwotCQlwZXJtaXNzaW9ucyA9IGF0dHJzLmdldFBlcm1pc3Npb25zKCk7Ci0JCQotCQlpc1JlYWRhYmxlID0gZmFsc2U7Ci0JCWlzV3JpdGFibGUgPSBmYWxzZTsKLQkJaXNFeGVjdXRhYmxlID0gZmFsc2U7Ci0JCQotCQlpZih1c2VySUQgPT0gZmlsZVRvb2xzLmNhY2hlZFVzZXJJRCkgewotCQkJaWYgKChwZXJtaXNzaW9ucyAmIDA0MDApICE9IDApIHsKLQkJCQlpc1JlYWRhYmxlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgocGVybWlzc2lvbnMgJiAwMjAwKSAhPSAwKSB7Ci0JCQkJaXNXcml0YWJsZSA9IHRydWU7Ci0JCQl9IAotCQkJaWYgKChwZXJtaXNzaW9ucyAmIDAxMDApICE9IDApIHsKLQkJCQlpc0V4ZWN1dGFibGUgPSB0cnVlOwotCQkJfQotCQl9IAotCQkJCQotCQlTZXQgZ3JvdXBJRFNldCA9IGZpbGVUb29scy5jYWNoZWRHcm91cElEU2V0OwotCQlpZihncm91cElEU2V0LmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGdyb3VwSUQpKSkgewotCQkJaWYgKChwZXJtaXNzaW9ucyAmIDAwNDApICE9IDApIHsKLQkJCQlpc1JlYWRhYmxlID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgocGVybWlzc2lvbnMgJiAwMDIwKSAhPSAwKSB7Ci0JCQkJaXNXcml0YWJsZSA9IHRydWU7Ci0JCQl9IAotCQkJaWYgKChwZXJtaXNzaW9ucyAmIDAwMTApICE9IDApIHsKLQkJCQlpc0V4ZWN1dGFibGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQkKLQkJaWYgKChwZXJtaXNzaW9ucyAmIDAwMDQpICE9IDApIHsKLQkJCWlzUmVhZGFibGUgPSB0cnVlOwotCQl9Ci0JCWlmICgocGVybWlzc2lvbnMgJiAwMDAyKSAhPSAwKSB7Ci0JCQlpc1dyaXRhYmxlID0gdHJ1ZTsKLQkJfSAKLQkJaWYgKChwZXJtaXNzaW9ucyAmIDAwMDEpICE9IDApIHsKLQkJCWlzRXhlY3V0YWJsZSA9IHRydWU7Ci0JCX0KLQkJCi0JCXNpemUgPSBhdHRycy5nZXRTaXplKCk7Ci0JCWFjY2Vzc1RpbWUgPSBhdHRycy5nZXRBVGltZSgpOwotCQltb2RpZmljYXRpb25UaW1lID0gYXR0cnMuZ2V0TVRpbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlSXRlbVByb3BlcnRpZXMjZ2V0UGF0aG5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW1Qcm9wZXJ0aWVzI2lzUmVhZGFibGVCeVVzZXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKSB7Ci0JCXJldHVybiBpc1JlYWRhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWFkYWJsZShib29sZWFuIGZsYWcpIHsKLQkJaW50IG9sZFBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7Ci0JCWlmICh1c2VySUQgPT0gZmlsZVRvb2xzLmNhY2hlZFVzZXJJRCkgewotCQkJaWYgKGZsYWcpIHsKLQkJCQlwZXJtaXNzaW9ucyB8PSAwNDAwOwotCQkJfSBlbHNlIHsKLQkJCQlwZXJtaXNzaW9ucyAmPSB+MDQwMDsKLQkJCX0KLQkJfQotCQlTZXQgZ3JvdXBJRFNldCA9IGZpbGVUb29scy5jYWNoZWRHcm91cElEU2V0OwotCQlpZihncm91cElEU2V0LmNvbnRhaW5zKG5ldyBJbnRlZ2VyKGdyb3VwSUQpKSkgewotCQkJaWYgKGZsYWcpIHsKLQkJCQlwZXJtaXNzaW9ucyB8PSAwMDQwOwotCQkJfSBlbHNlIHsKLQkJCQlwZXJtaXNzaW9ucyAmPSB+MDA0MDsKLQkJCX0KLQkJfQotCQlpZiAoZmxhZykgewotCQkJcGVybWlzc2lvbnMgfD0gMDAwNDsKLQkJfSBlbHNlIHsKLQkJCXBlcm1pc3Npb25zICY9IH4wMDA0OwotCQl9Ci0JCWlmIChvbGRQZXJtaXNzaW9ucyAhPSBwZXJtaXNzaW9ucykgewotCQkJY2hhbmdlcyB8PSBQRVJNSVNTSU9OOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUl0ZW1Qcm9wZXJ0aWVzI2lzV3JpdGFibGVCeVVzZXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKSB7Ci0JCXJldHVybiBpc1dyaXRhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXcml0ZWFibGUoYm9vbGVhbiBmbGFnKSB7Ci0JCWludCBvbGRQZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zOwotCQlpZiAodXNlcklEID09IGZpbGVUb29scy5jYWNoZWRVc2VySUQpIHsKLQkJCWlmIChmbGFnKSB7Ci0JCQkJcGVybWlzc2lvbnMgfD0gMDIwMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGVybWlzc2lvbnMgJj0gfjAyMDA7Ci0JCQl9Ci0JCX0KLQkJU2V0IGdyb3VwSURTZXQgPSBmaWxlVG9vbHMuY2FjaGVkR3JvdXBJRFNldDsKLQkJaWYoZ3JvdXBJRFNldC5jb250YWlucyhuZXcgSW50ZWdlcihncm91cElEKSkpIHsKLQkJCWlmIChmbGFnKSB7Ci0JCQkJcGVybWlzc2lvbnMgfD0gMDAyMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGVybWlzc2lvbnMgJj0gfjAwMjA7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZsYWcpIHsKLQkJCXBlcm1pc3Npb25zIHw9IDAwMDI7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJtaXNzaW9ucyAmPSB+MDAwMjsKLQkJfQotCQlpZiAob2xkUGVybWlzc2lvbnMgIT0gcGVybWlzc2lvbnMpIHsKLQkJCWNoYW5nZXMgfD0gUEVSTUlTU0lPTjsKLQkJfQotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRBY2Nlc3NUaW1lKCkgewotCQlyZXR1cm4gKGxvbmcpYWNjZXNzVGltZSoxMDAwOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCkgewotCQlyZXR1cm4gKGxvbmcpbW9kaWZpY2F0aW9uVGltZSoxMDAwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25UaW1lKGxvbmcgdGltZSkgewotCQlpbnQgb2xkTW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7Ci0JCW1vZGlmaWNhdGlvblRpbWUgPSAoaW50KSh0aW1lLzEwMDApOwotCQlpZiAob2xkTW9kaWZpY2F0aW9uVGltZSAhPSBtb2RpZmljYXRpb25UaW1lKSB7Ci0JCQljaGFuZ2VzIHw9IE1PRElGSUNBVElPTl9USU1FOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbW1pdEF0dHJpYnV0ZXMoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gewotCQlmaWxlVG9vbHMudGVzdCgpOwotCQlpZiAoKGNoYW5nZXMgJiBQRVJNSVNTSU9OKSAhPSAwKSB7Ci0JCQl0cnkgewotCQkJCWZpbGVUb29scy5tYW5hZ2VyLmNvbm5lY3Rpb24uc2Z0cENoYW5uZWwuY2htb2QocGVybWlzc2lvbnMsIHBhdGgpOwotCQkJCWNoYW5nZXMgJj0gflBFUk1JU1NJT047Ci0JCQl9IGNhdGNoIChTZnRwRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKE5MUy5iaW5kKCJGYWlsZWQgdG8gc2V0IHBlcm1pc3Npb24gb2YgcmVtb3RlIGZpbGUgezB9ICh7MX0pIiwgbmV3IFN0cmluZ1tdIHtwYXRoLCBlLmdldE1lc3NhZ2UoKX0pLCBlKTsKLQkJCX0KLQkJfQotCQlpZiAoKGNoYW5nZXMgJiBNT0RJRklDQVRJT05fVElNRSkgIT0gMCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlVG9vbHMubWFuYWdlci5jb25uZWN0aW9uLnNmdHBDaGFubmVsLnNldE10aW1lKHBhdGgsIG1vZGlmaWNhdGlvblRpbWUpOwotCQkJCWNoYW5nZXMgJj0gfk1PRElGSUNBVElPTl9USU1FOwotCQkJfSBjYXRjaCAoU2Z0cEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihOTFMuYmluZCgiRmFpbGVkIHRvIHNldCBtb2RpZmljYXRpb24gZmltZSBvZiByZW1vdGUgZmlsZSB7MH0gKHsxfSkiLCBuZXcgT2JqZWN0W10ge3BhdGgsIGV9KSwgZSk7Ci0JCQl9Ci0JCX0KLS8vCQljaGFuZ2VzID0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4ZWN1dGFibGUoKSB7Ci0JCXJldHVybiBpc0V4ZWN1dGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhlY3V0YWJsZShib29sZWFuIGZsYWcpIHsKLQkJaW50IG9sZFBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7Ci0JCWlmICh1c2VySUQgPT0gZmlsZVRvb2xzLmNhY2hlZFVzZXJJRCkgewotCQkJaWYgKGZsYWcpIHsKLQkJCQlwZXJtaXNzaW9ucyB8PSAwMTAwOwotCQkJfSBlbHNlIHsKLQkJCQlwZXJtaXNzaW9ucyAmPSB+MDEwMDsKLQkJCX0KLQkJfQotCQlpZihmaWxlVG9vbHMuY2FjaGVkR3JvdXBJRFNldC5jb250YWlucyhuZXcgSW50ZWdlcihncm91cElEKSkpIHsKLQkJCWlmIChmbGFnKSB7Ci0JCQkJcGVybWlzc2lvbnMgfD0gMDAxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGVybWlzc2lvbnMgJj0gfjAwMTA7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZsYWcpIHsKLQkJCXBlcm1pc3Npb25zIHw9IDAwMDE7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJtaXNzaW9ucyAmPSB+MDAwMTsKLQkJfQotCQlpZiAob2xkUGVybWlzc2lvbnMgIT0gcGVybWlzc2lvbnMpIHsKLQkJCWNoYW5nZXMgfD0gUEVSTUlTU0lPTjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gaXNEaXJlY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRmlsZSgpIHsKLQkJcmV0dXJuICEgaXNEaXJlY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChleGlzdCkgewotCQkJcmV0dXJuIHBhdGggKyAoaXNEaXJlY3RvcnkgPyAiKGQpIiA6ICIoZikiKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiZG9lcyBub3QgZXhpdCI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVQb3J0Rm9yd2FyZGluZy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvUmVtb3RlUG9ydEZvcndhcmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2NmQyOC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVQb3J0Rm9yd2FyZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBvcnRGb3J3YXJkaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uQ2FuY2VsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUG9ydEZvcndhcmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUmVtb3RlUG9ydEZvcndhcmRpbmd9IGZvciBTU0guIENvbnRhaW5zIGluZm9ybWF0aW9uCi0gKiBhYm91dCBmcm9tIGFuZCB0byB3aGVyZSB0aGUgcG9ydCBmb3J3YXJkaW5nIHdhcyBlc3RhYmxpc2hlZC4gVGhlIGluZm9ybWF0aW9uCi0gKiBpcyB2YWxpZCB3aGlsZSB0aGUgZm9yd2FyZGluZyBpcyBhY3RpdmUuCi0gKiAKLSAqIFdoZW4gY3JlYXRpbmcgdGhlIGZvcndhcmRpbmcsIHRoZSBjb25zdHJ1Y3RvciBhc3NpZ25zIGFuIGV4ZWN1dGlvbiBtYW5hZ2VyIGFzCi0gKiBvd25lciBvZiB0aGUgcG9ydCBmb3J3YXJkaW5nLiBXaGVuIHRoZSBwb3J0IGZvcndhcmRpbmcgaXMgdHVybmVkIG9mZiwgdGhlbiBpdAotICogd2lsbCBpcyBjb25zaWRlcmVkICJpbmFjdGl2ZSIsIGl0IHdpbGwgaGF2ZSBubyBleGVjdXRpb24gbWFuYWdlciBhbnltb3JlIGFzCi0gKiBvd25lciBhbmQgdGhlIGluZm9ybWF0aW9uIHdvbid0IGJlIHZhbGlkIGFueW1vcmUuCi0gKiBUaGUgZm9yd2FyZGluZyBtdXN0IGJlIG5vdGlmaWVkIGJ5IHRoYXQgaXQgd2FzIHR1cm5lZCBvZmYgYnkgUmVtb3RlIFRvb2xzIGNhbGxpbmcge0BsaW5rICNyZWxlYXNlT3duZXIoKX0uCi0gKiAKLSAqIElmIHRoZSBvd25lciB3YXNuJ3QgcmVtb3ZlZCB3aGVuIHR1cm5pbmcgb2ZmIHRoZSBjb25uZWN0aW9uLCB0aGUgYW4KLSAqIGFwcGxpY2F0aW9uIHRoYXQgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBmb3J3YXJkaW5nLCB3b3VsZCBhbHNvIGluZGlyZWN0bHkKLSAqIHJlZmVyZW5jZSB0aGUgZXhlY3V0aW9uIG1hbmFnZXIsIHRoZSBjb25uZWN0aW9uIGFuZCBhbGwgZGF0YSBzdHJ1Y3R1cmUuCi0gKiBUaGlzIHdvdWxkIHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIG5vdCB1c2VkIGFueW1vcmUuCi0gKiAKLSAqIEFsbCBtZXRob2RzIGhhdmUgcGFja2FnZSB2aXNpYmlsaXR5IHRvIGFsbG93cyBpbnRlcm5hbCBhY2Nlc3Mgd2l0aG91dCBnZXR0ZXIvc2V0dGVycy4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVBvcnRGb3J3YXJkaW5nIGltcGxlbWVudHMgSVJlbW90ZVBvcnRGb3J3YXJkaW5nIHsKLQkvKioKLQkgKiBUaGUgZXhlY3V0aW9uIG1hbmFnZXIgdGhhdCBjcmVhdGVkIGFuZCBvd25zIHRoZSBwb3J0IGZvcndhcmRpbmcuCi0JICogV2hlbiA8Y29kZT5udWxsPC9jb2RlPiwgc2lnbmFscyB0aGF0IHRoZSBmb3J3YXJkaW5nIHdhcyB0dXJuZWQgb2ZmIGFuZCB0aGF0IHRoZSBkYXRhIGlzIG5vdCB2YWxpZCBhbnltb3JlLgotCSAqLwotCUV4ZWN1dGlvbk1hbmFnZXIgb3duZXI7Ci0JCi0JLyoqIFRoZSBwb3J0IG9uIHRoZSBob3N0IHdoZXJlIHRoZSByZW1vdGUgcG9ydCBpcyBmb3J3YXJkZWQgdG8uICovCi0JaW50IGxvY2FsUG9ydDsKLQkvKiogVGhlIGhvc3Qgd2hlcmUgdGhlIHJlbW90ZSBwb3J0IGlzIGZvcndhcmRlZCB0by4gKi8KLQlTdHJpbmcgbG9jYWxBZGRyZXNzOwotCS8qKiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBpcyBiZWluZyBmb3J3YXJkZWQuICovCi0JaW50IHJlbW90ZVBvcnQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgdGhhdCBpcyBvd25lZCBieSB0aGUgZXhlY3V0aW9uIG1hbmFnZXIuCi0JICogPHA+Ci0JICogVXNlZCBieSB0aGUgU1NIIGltcGxlbWVudGF0aW9uIG9mIFJlbW90ZSBUb29scy4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIFRoZSBleGVjdXRpb24gbWFuYWdlciB0aGF0IG93bnMgdGhlIHBvcnQgZm9yd2FyZGluZy4KLQkgKiBAcGFyYW0gbG9jYWxQb3J0Ci0JICogICAgICAgICAgICBUaGUgcG9ydCBvbiB0aGUgaG9zdCB3aGVyZSB0aGUgcmVtb3RlIHBvcnQgaXMgZm9yd2FyZGVkIHRvLgotCSAqIEBwYXJhbSBsb2NhbEFkZHJlc3MKLQkgKiAgICAgICAgICAgIFRoZSBob3N0IHdoZXJlIHRoZSByZW1vdGUgcG9ydCBpcyBmb3J3YXJkZWQgdG8uCi0JICogQHBhcmFtIHJlbW90ZVBvcnQKLQkgKiAgICAgICAgICAgIFRoZSByZW1vdGUgcG9ydCB0aGF0IGlzIGJlaW5nIGZvcndhcmRlZC4KLQkgKi8KLQlSZW1vdGVQb3J0Rm9yd2FyZGluZyhFeGVjdXRpb25NYW5hZ2VyIG93bmVyLCBpbnQgbG9jYWxQb3J0LAotCQkJU3RyaW5nIGxvY2FsQWRkcmVzcywgaW50IHJlbW90ZVBvcnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmxvY2FsUG9ydCA9IGxvY2FsUG9ydDsKLQkJdGhpcy5sb2NhbEFkZHJlc3MgPSBsb2NhbEFkZHJlc3M7Ci0JCXRoaXMucmVtb3RlUG9ydCA9IHJlbW90ZVBvcnQ7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgZm9yd2FyZGluZyB3YXMgdHVybmVkIG9mZi4KLQkgKiA8cD4KLQkgKiBVc2VkIGJ5IHRoZSBTU0ggaW1wbGVtZW50YXRpb24gb2YgUmVtb3RlIFRvb2xzLgotCSAqLwotCXZvaWQgcmVsZWFzZU93bmVyKCkgewotCQl0aGlzLm93bmVyID0gbnVsbDsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZyNnZXRMb2NhbFBvcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewotCQlyZXR1cm4gbG9jYWxQb3J0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZyNnZXRMb2NhbEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyZXNzKCkgewotCQlyZXR1cm4gbG9jYWxBZGRyZXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVQb3J0Rm9yd2FyZGluZyNnZXRSZW1vdGVQb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7Ci0JCXJldHVybiByZW1vdGVQb3J0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBvcnRGb3J3YXJkaW5nI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwKLQkJCVBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uKFBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uLlJFTU9URV9GT1JXQVJESU5HX05PVF9BVElWRSk7Ci0JCX0KLQkJb3duZXIuZ2V0UG9ydEZvcndhcmRpbmdUb29scygpLnJlbGVhc2VGb3J3YXJkaW5nKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJyZW1vdGUgcG9ydCB7MH0gdG8gbG9jYWwgezF9OnsyfSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKHJlbW90ZVBvcnQpLCBsb2NhbEFkZHJlc3MsIG5ldyBJbnRlZ2VyKGxvY2FsUG9ydCl9KTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUG9ydEZvcndhcmRpbmcjaXNBY3RpdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gb3duZXIgIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9SZW1vdGVQb3J0Rm9yd2FyZGluZ1Bvb2wuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1JlbW90ZVBvcnRGb3J3YXJkaW5nUG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzJjZmUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1JlbW90ZVBvcnRGb3J3YXJkaW5nUG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUG9ydEZvcndhcmRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247Ci0KLS8qKgotICogS2VlcHMgcmVmZXJlbmNlcyB0byBhbGwgYWN0aXZlIHBvcnQgZm9yd2FyZGluZ3Mgb2YgYSBjb25uZWN0aW9uLgotICogVGhpcyBmb3J3YXJkaW5ncyBhcmUgc2hhcmVkIGJ5IGFsbCBleGVjdXRpb24gbWFuYWdlcnMsIHNpbmNlIGl0IGlzIGEgcmVzc291cmNlIHRoYXQgYXBwbGllcyBvbmx5IHRvIHRoZSBjb25uZWN0aW9uLgotICogCi0gKiBAYXV0aG9yIGRmZmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUG9ydEZvcndhcmRpbmdQb29sIHsKLQkvKioKLQkgKiBSZW1vdGUgcG9ydCB0byBsb2NhbCBmb3J3YXJkaW5nIHRoYXQgYXJlIGFjdGl2ZSBvbiB0aGUgQ29ubmVjdGlvbi4KLQkgKi8KLQlIYXNoTWFwPEludGVnZXIsIFJlbW90ZVBvcnRGb3J3YXJkaW5nPiByZW1vdGVQb3J0Rm9yd2FyZGluZ3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBSZW1vdGVQb3J0Rm9yd2FyZGluZz4oKTs7Ci0JCi0JLyoqCi0JICogQ29ubmVjdGlvbgotCSAqLwotCUNvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQkKLQlSZW1vdGVQb3J0Rm9yd2FyZGluZ1Bvb2woQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCWFzc2VydCBjb25uZWN0aW9uICE9IG51bGw7Ci0JCQotCQl0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotCX0KLQkKLQlSZW1vdGVQb3J0Rm9yd2FyZGluZyBjcmVhdGVSZW1vdGVQb3J0Rm9yd2FyZGluZyhFeGVjdXRpb25NYW5hZ2VyIG93bmVyLCBpbnQgcmVtb3RlUG9ydCwgU3RyaW5nIGxvY2FsQWRkcmVzcywgaW50IGxvY2FsUG9ydCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFBvcnRGb3J3YXJkaW5nRXhjZXB0aW9uIHsKLQkJYXNzZXJ0IChyZW1vdGVQb3J0ID4gMCk7Ci0JCWFzc2VydCAobG9jYWxQb3J0ID4gMCkgOwotCQlhc3NlcnQgKG93bmVyICE9IG51bGwpOwotCQlhc3NlcnQgKGNvbm5lY3Rpb24uZGVmYXVsdFNlc3Npb24gIT0gbnVsbCk7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHJlbW90ZVBvcnRGb3J3YXJkaW5ncykgewotCQkJLyogCi0JCQkgKiBUZXN0IGlmIHRoZSBmb3J3YXJkaW5nIGlzIG5vdCBhbHJlYWR5IGFjdGl2ZS4gCi0JCQkgKi8KLQkJCUludGVnZXIgcmVtb3RlUG9ydEludGVnZXIgPSBuZXcgSW50ZWdlcihyZW1vdGVQb3J0KTsKLQkJCVJlbW90ZVBvcnRGb3J3YXJkaW5nIHJlbW90ZVBvcnRGb3J3YXJkaW5nID0gIChSZW1vdGVQb3J0Rm9yd2FyZGluZykgcmVtb3RlUG9ydEZvcndhcmRpbmdzLmdldChyZW1vdGVQb3J0SW50ZWdlcik7Ci0JCQlpZiAocmVtb3RlUG9ydEZvcndhcmRpbmcgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbihQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfUE9SVF9BTFJFQURZX0ZPUldBUkRFRCk7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiBDcmVhdGUgYSBwb3J0IGZvcndhcmRpbmcgaW4gSnNjaC4KLQkJCSAqLwotCQkJdHJ5IHsKLQkJCQl0aGlzLmNvbm5lY3Rpb24uZGVmYXVsdFNlc3Npb24uc2V0UG9ydEZvcndhcmRpbmdSKHJlbW90ZVBvcnQsIGxvY2FsQWRkcmVzcywgbG9jYWxQb3J0KTsKLQkJCX0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbihQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfRk9SV0FSRElOR19GQUlMRUQsIGUpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogQ3JlYXRlIG5ldyBmb3J3YXJkaW5nIGluc3RhbmNlIGFuZCBhZGQgaXQgdG8gdGhlIHRhYmxlLgotCQkJICovCi0JCQlyZW1vdGVQb3J0Rm9yd2FyZGluZyA9IG5ldyBSZW1vdGVQb3J0Rm9yd2FyZGluZyhvd25lciwgbG9jYWxQb3J0LCBsb2NhbEFkZHJlc3MsIHJlbW90ZVBvcnQpOwotCQkJcmVtb3RlUG9ydEZvcndhcmRpbmdzLnB1dChyZW1vdGVQb3J0SW50ZWdlciwgcmVtb3RlUG9ydEZvcndhcmRpbmcpOwotCQkJCi0JCQlyZXR1cm4gcmVtb3RlUG9ydEZvcndhcmRpbmc7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZWxlYXNlUmVtb3RlUG9ydEZvcndhcmRpbmcoUmVtb3RlUG9ydEZvcndhcmRpbmcgcmVtb3RlRm9yd2FyZGluZywgRXhlY3V0aW9uTWFuYWdlciBvd25lcikgIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbiB7Ci0JCWFzc2VydCByZW1vdGVGb3J3YXJkaW5nICE9IG51bGw7Ci0JCWFzc2VydCAoY29ubmVjdGlvbi5kZWZhdWx0U2Vzc2lvbiAhPSBudWxsKTsKLQkJCi0JCXN5bmNocm9uaXplZCAocmVtb3RlUG9ydEZvcndhcmRpbmdzKSB7Ci0JCQkvKgotCQkJICogQXNzdXJlIHRoZSBwb3J0IGZvcndhcmRpbmcgdGhhdCBpcyBzdGlsbCBhY3RpdmUuCi0JCQkgKi8KLQkJCWlmICghIHJlbW90ZUZvcndhcmRpbmcuaXNBY3RpdmUoKSkgewotCQkJCXRocm93IG5ldyBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbihQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfRk9SV0FSRElOR19OT1RfQVRJVkUpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogSWYgYSBleGVjdXRpb24gbWFuYWdlciBpcyBnaXZlbiBhcyBvd25lciwgdGhlbiBhc3N1cmUgdGhlIHBvcnQgZm9yd2FyZGluZyBiZWxvbmdzIHRvIGl0LgotCQkJICovCi0JCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCWlmIChyZW1vdGVGb3J3YXJkaW5nLm93bmVyICE9IG93bmVyKSB7Ci0JCQkJCXRocm93IG5ldyBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbihQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbi5SRU1PVEVfRk9SV0FSRElOR19OT1RfQVRJVkUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSW50ZWdlciByZW1vdGVQb3J0SW50ZWdlciA9IG5ldyBJbnRlZ2VyKHJlbW90ZUZvcndhcmRpbmcucmVtb3RlUG9ydCk7Ci0JCQlhc3NlcnQgcmVtb3RlUG9ydEZvcndhcmRpbmdzLmNvbnRhaW5zS2V5KHJlbW90ZVBvcnRJbnRlZ2VyKTsKLQkJCQotCQkJdHVybk9mZlJlbW90ZVBvcnRGb3J3YXJkaW5nKHJlbW90ZUZvcndhcmRpbmcpOwotCQkJcmVtb3RlUG9ydEZvcndhcmRpbmdzLnJlbW92ZShyZW1vdGVQb3J0SW50ZWdlcik7Ci0JCX0KLQl9Ci0JCi0JUmVtb3RlUG9ydEZvcndhcmRpbmcgZ2V0UmVtb3RlUG9ydEZvcndhcmRpbmcoaW50IHJlbW90ZVBvcnQpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBQb3J0Rm9yd2FyZGluZ0V4Y2VwdGlvbiB7Ci0JCWFzc2VydCByZW1vdGVQb3J0ID4gMDsKLQkJYXNzZXJ0IChjb25uZWN0aW9uLmRlZmF1bHRTZXNzaW9uICE9IG51bGwpOwotCi0JCXN5bmNocm9uaXplZCAocmVtb3RlUG9ydEZvcndhcmRpbmdzKSB7Ci0JCQlJbnRlZ2VyIHJlbW90ZVBvcnRJbnRlZ2VyID0gbmV3IEludGVnZXIocmVtb3RlUG9ydCk7Ci0JCQlyZXR1cm4gKFJlbW90ZVBvcnRGb3J3YXJkaW5nKSByZW1vdGVQb3J0Rm9yd2FyZGluZ3MuZ2V0KHJlbW90ZVBvcnRJbnRlZ2VyKTsKLQkJfQotCQkKLQl9Ci0KLQl2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCUl0ZXJhdG9yPFJlbW90ZVBvcnRGb3J3YXJkaW5nPiBpdGVyYXRvciA9IHJlbW90ZVBvcnRGb3J3YXJkaW5ncy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSZW1vdGVQb3J0Rm9yd2FyZGluZyBmb3J3YXJkaW5nID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCXR1cm5PZmZSZW1vdGVQb3J0Rm9yd2FyZGluZyhmb3J3YXJkaW5nKTsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCQotCXZvaWQgZGlzY29ubmVjdChFeGVjdXRpb25NYW5hZ2VyIGV4ZWN1dGlvbk1hbmFnZXIpIHsKLQkJSXRlcmF0b3I8UmVtb3RlUG9ydEZvcndhcmRpbmc+IGl0ZXJhdG9yID0gcmVtb3RlUG9ydEZvcndhcmRpbmdzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJlbW90ZVBvcnRGb3J3YXJkaW5nIGZvcndhcmRpbmcgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZm9yd2FyZGluZy5vd25lciA9PSBleGVjdXRpb25NYW5hZ2VyKSB7Ci0JCQkJdHVybk9mZlJlbW90ZVBvcnRGb3J3YXJkaW5nKGZvcndhcmRpbmcpOwotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF1eGlsaWFyeSBtZXRob2QgdXNlZCBieSBvdGhlciBtZXRob2RzIHRvIHR1cm4gb2ZmIGEgcG9ydCBmb3J3YXJkaW5nLgotCSAqIEBwYXJhbSBmb3J3YXJkaW5nIFRoZSBwb3J0IHJlbW90ZSBmb3J3YXJkaW5nIHRvIGJlIHR1cm5lZCBvZmYuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHR1cm5PZmZSZW1vdGVQb3J0Rm9yd2FyZGluZyhSZW1vdGVQb3J0Rm9yd2FyZGluZyBmb3J3YXJkaW5nKSB7Ci0JCWZvcndhcmRpbmcucmVsZWFzZU93bmVyKCk7Ci0JCXRyeSB7Ci0JCQljb25uZWN0aW9uLmRlZmF1bHRTZXNzaW9uLmRlbFBvcnRGb3J3YXJkaW5nUihmb3J3YXJkaW5nLnJlbW90ZVBvcnQpOwotCQl9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIE5vIHBvc3NpYmxlIGV4Y2VwdGlvbnMgYXJlIGtub3duLgotCQkJYXNzZXJ0IGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9TU0hSZW1vdGVQcm9jZXNzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9TU0hSZW1vdGVQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmMjE4M2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvU1NIUmVtb3RlUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU2NyaXB0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLlJlbW90ZVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTU0hSZW1vdGVQcm9jZXNzIGV4dGVuZHMgUmVtb3RlUHJvY2VzcyB7Ci0JCi0JSVJlbW90ZVNjcmlwdEV4ZWN1dGlvbiBleGVjdXRpb247Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBlcnJvclN0cmVhbTsKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCXByaXZhdGUgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKLQkKLQljbGFzcyBFeGVjdXRpb25DbG9zZXIgZXh0ZW5kcyBUaHJlYWQgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWV4ZWN1dGlvbi53YWl0Rm9yRW5kT2ZFeGVjdXRpb24oKTsKLQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKENhbmNlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlleGVjdXRpb24uY2xvc2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU1NIUmVtb3RlUHJvY2VzcyhJUmVtb3RlU2NyaXB0RXhlY3V0aW9uIGV4ZWN1dGlvbikgewotCQl0aGlzLmV4ZWN1dGlvbiA9IGV4ZWN1dGlvbjsKLQkJdHJ5IHsKLQkJCXRoaXMuZXJyb3JTdHJlYW0gPSBleGVjdXRpb24uZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc0Vycm9yU3RyZWFtKCk7Ci0JCQl0aGlzLm91dHB1dFN0cmVhbSA9IGV4ZWN1dGlvbi5nZXRPdXRwdXRTdHJlYW1Ub1Byb2Nlc3NJbnB1dFN0cmVhbSgpOwotCQkJdGhpcy5pbnB1dFN0cmVhbSA9IGV4ZWN1dGlvbi5nZXRJbnB1dFN0cmVhbUZyb21Qcm9jZXNzT3V0cHV0U3RyZWFtKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JCW5ldyBFeGVjdXRpb25DbG9zZXIoKS5zdGFydCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5Qcm9jZXNzI2Rlc3Ryb3koKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0JCWlmICghIGV4ZWN1dGlvbi53YXNGaW5pc2hlZCgpKSB7Ci0JCQlleGVjdXRpb24uY2FuY2VsKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuUHJvY2VzcyNleGl0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBpbnQgZXhpdFZhbHVlKCkgewotCQlpZiAoZXhlY3V0aW9uLndhc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIGlmIChleGVjdXRpb24ud2FzRmluaXNoZWQoKSkgewotCQkJcmV0dXJuIGV4ZWN1dGlvbi5nZXRSZXR1cm5Db2RlKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuUHJvY2VzcyNnZXRFcnJvclN0cmVhbSgpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCkgewotCQlyZXR1cm4gZXJyb3JTdHJlYW07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3MjZ2V0SW5wdXRTdHJlYW0oKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5Qcm9jZXNzI2dldE91dHB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7Ci0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlByb2Nlc3Mjd2FpdEZvcigpCi0JICovCi0JcHVibGljIGludCB3YWl0Rm9yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGlvbi53YWl0Rm9yRW5kT2ZFeGVjdXRpb24oKTsJCQkKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0gY2F0Y2ggKENhbmNlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0gIGNhdGNoIChSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBleGl0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgSVJlbW90ZVNjcmlwdEV4ZWN1dGlvbiBnZXRSZW1vdGVFeGVjdXRpb24oKQotCXsKLQkJcmV0dXJuIGV4ZWN1dGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9TY3JpcHRFeGVjdXRpb24uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1NjcmlwdEV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGZmZTJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1NjcmlwdEV4ZWN1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLnNzaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVTY3JpcHRFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5jb21tb24uRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmludGVybmFsLmNvbW1vbi5SZW1vdGVTY3JpcHQ7Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbEV4ZWM7Ci0KLS8qKgotICogQGF1dGhvciByaWNoYXJkbQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRFeGVjdXRpb24gZXh0ZW5kcyBLaWxsYWJsZUV4ZWN1dGlvbiBpbXBsZW1lbnRzIElSZW1vdGVTY3JpcHRFeGVjdXRpb24gewotCi0JcHJvdGVjdGVkIFJlbW90ZVNjcmlwdCByZW1vdGVTY3JpcHQ7Ci0JCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZyb21Qcm9jZXNzT3V0cHV0OwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmcm9tUHJvY2Vzc0Vycm9yOwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gdG9Qcm9jZXNzSW5wdXQ7Ci0KLQotCXByb3RlY3RlZCBTY3JpcHRFeGVjdXRpb24oRXhlY3V0aW9uTWFuYWdlciBleGVjdXRpb25NYW5hZ2VyLCBSZW1vdGVTY3JpcHQgcmVtb3RlU2NyaXB0KQotCQkJdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlzdXBlcihleGVjdXRpb25NYW5hZ2VyKTsKLQkJdGhpcy5yZW1vdGVTY3JpcHQgPSByZW1vdGVTY3JpcHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoLktpbGxhYmxlRXhlY3V0aW9uI3N0YXJ0RXhlY3V0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEV4ZWN1dGlvbigpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbW1hbmRsaW5lID0gZ2V0UmVtb3RlU2NyaXB0KCkuZ2V0U2NyaXB0U3RyaW5nKCk7Ci0JCUNoYW5uZWxFeGVjIGNoYW5uZWwgPSBjcmVhdGVDaGFubmVsKGdldFJlbW90ZVNjcmlwdCgpLmdldEFsbG9jYXRlVGVybWluYWwoKSk7Ci0JCXNldENvbW1hbmRMaW5lKGNvbW1hbmRsaW5lKTsKLQotCQl0cnkgewotCQkJaWYgKHJlbW90ZVNjcmlwdC5nZXRJbnB1dFN0cmVhbSgpICE9IG51bGwpIHsKLQkJCQljaGFubmVsLnNldElucHV0U3RyZWFtKHJlbW90ZVNjcmlwdC5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCX0gZWxzZSBpZiAocmVtb3RlU2NyaXB0LmdldEZldGNoUHJvY2Vzc0lucHV0U3RyZWFtKCkpIHsKLQkJCQl0b1Byb2Nlc3NJbnB1dCA9IGNoYW5uZWwuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCQl9Ci0JCQotCQkJaWYgKHJlbW90ZVNjcmlwdC5nZXRPdXRwdXRTdHJlYW0oKSAhPSBudWxsKSB7Ci0JCQkJY2hhbm5lbC5zZXRPdXRwdXRTdHJlYW0ocmVtb3RlU2NyaXB0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCX0gZWxzZSBpZiAocmVtb3RlU2NyaXB0LmdldEZldGNoUHJvY2Vzc091dHB1dFN0cmVhbSgpKSB7Ci0JCQkJZnJvbVByb2Nlc3NPdXRwdXQgPSBjaGFubmVsLmdldElucHV0U3RyZWFtKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChyZW1vdGVTY3JpcHQuZ2V0RXJyb3JTdHJlYW0oKSAhPSBudWxsKSB7Ci0JCQkJY2hhbm5lbC5zZXRFcnJTdHJlYW0ocmVtb3RlU2NyaXB0LmdldEVycm9yU3RyZWFtKCkpOwotCQkJfSBlbHNlIGlmIChyZW1vdGVTY3JpcHQuZ2V0RmV0Y2hQcm9jZXNzRXJyb3JTdHJlYW0oKSkgewotCQkJCWZyb21Qcm9jZXNzRXJyb3IgPSBjaGFubmVsLmdldEVyclN0cmVhbSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5TY3JpcHRFeGVjdXRpb25fU3RhcnRFeGVjdXRpb25fRmFpbGVkSW5pdFN0cmVhbXMsIGUpOwotCQl9Ci0JCWNoYW5uZWwuc2V0WEZvcndhcmRpbmcocmVtb3RlU2NyaXB0LndpbGxGb3J3YXJkWDExKCkpOwotCi0JCXN1cGVyLnN0YXJ0RXhlY3V0aW9uKCk7Ci0JCURlYnVnLnByaW50bG4oIkV4ZWN1dGluZyAiICsgY29tbWFuZGxpbmUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZUNvbW1hbmRFeGVjdXRpb24jZ2V0SW5wdXRTdHJlYW1Gcm9tUHJvY2Vzc091dHB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtRnJvbVByb2Nlc3NPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZnJvbVByb2Nlc3NPdXRwdXQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBmcm9tUHJvY2Vzc091dHB1dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5JUmVtb3RlQ29tbWFuZEV4ZWN1dGlvbiNnZXRJbnB1dFN0cmVhbUZyb21Qcm9jZXNzRXJyb3JTdHJlYW0oKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbUZyb21Qcm9jZXNzRXJyb3JTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZnJvbVByb2Nlc3NFcnJvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZyb21Qcm9jZXNzRXJyb3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuSVJlbW90ZUNvbW1hbmRFeGVjdXRpb24jZ2V0T3V0cHV0U3RyZWFtRnJvbVByb2Nlc3NJbnB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Ub1Byb2Nlc3NJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0b1Byb2Nlc3NJbnB1dCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRvUHJvY2Vzc0lucHV0OwotCX0KLQotCXB1YmxpYyBSZW1vdGVTY3JpcHQgZ2V0UmVtb3RlU2NyaXB0KCkgewotCQlyZXR1cm4gKFJlbW90ZVNjcmlwdCkgcmVtb3RlU2NyaXB0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1N0YXR1c1Rvb2xzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9TdGF0dXNUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzI0ZTk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1N0YXR1c1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVDb3B5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZURvd25sb2FkRXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU3RhdHVzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5uZXR3b3JrLk1hY0FkZHJlc3M7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHN0YXR1cyBkYXRhIGZyb20gdGhlIHJlbW90ZSBob3N0Ci0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNUb29scyBpbXBsZW1lbnRzIElSZW1vdGVTdGF0dXNUb29scyB7Ci0JRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyOwotCVVzZXJJbmZvcm1hdGlvbiB1c2VySW5mb0NhY2hlOwotCQotCS8qKgotCSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGNhY2hpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyAic3RhYmxlIiBlbm91Z2ggdG8gYmUgc3RvcmVkIGFuZCByZXRyaWV2ZWQKLQkgKiBpbnN0ZWFkIG9mIGdlbmVyYXRlZCBldmVyeSB0aW1lLiAgCi0JICoKLQkgKiBAYXV0aG9yIFJpY2hhcmQgTWFjaWVsCi0JICoKLQkgKi8KLQljbGFzcyBVc2VySW5mb3JtYXRpb24gewotCQlJbnRlZ2VyIHVzZXJJRDsKLQkJU2V0IGdyb3VwSURTZXQ7Ci0JCVN0cmluZyB1c2VybmFtZTsKLQkJCi0JCXB1YmxpYyBVc2VySW5mb3JtYXRpb24oSW50ZWdlciB1c2VySUQsIFNldCBncm91cElEU2V0LCBTdHJpbmcgdXNlcm5hbWUpIHsKLQkJCXRoaXMudXNlcklEID0gdXNlcklEOwotCQkJdGhpcy5ncm91cElEU2V0ID0gZ3JvdXBJRFNldDsKLQkJCXRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKLQkJfQotCQkKLQkJCi0JfQotCQotCXByb3RlY3RlZCBTdGF0dXNUb29scyhFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVN0YXR1c1Rvb2xzI2NoZWNrUmVtb3RlQWRkcmVzc1VzZShqYXZhLm5ldC5JbmV0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1JlbW90ZUFkZHJlc3NVc2UoSW5ldEFkZHJlc3MgYWRkcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1JlbW90ZU1hY0FkZHJlc3NVc2UoTWFjQWRkcmVzcyBtYWNBZGRyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UmVtb3RlUG9ydHNJblVzZShpbnQgcHJvdG9jb2wpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCS8vIFVzZXMgdGhlIGZvbGxvd2luZyBzaGVsbCBzY3JpcHQgdG8gZ2V0IGEgbGlzdCBvZiB1c2VkIHBvcnRzIGluIHRoZQotCQkvLyByZW1vdGUgaG9zdDoKLQkJLy8gY2F0IC9wcm9jL25ldC88dHJhbnNwb3J0IHByb3RvY29sPgotCQkvLyBUaGVuLCB0aGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgY29tbWFuZCBpcyBmaWx0ZXJlZCB1c2luZyBqYXZhIGNvbW1hbmRzIGVxdWl2YWxlbnQgdG8gdGhlCi0JCS8vIGZvbGxvd2luZyBzaGVsbCBjb21tYW5kOgotCQkvLyBjYXQgL3Byb2MvbmV0L3RjcCB8IHRhaWwgLW4gKzIgfCBzZWQgLXIgJ3MvXlxzKy8vZycgfCBjdXQgLWQgJyAnIC1mIDIgfCBjdXQgLWQgJzonIC1mIDIKLQotCQkKLQkJSGFzaFNldCBwb3J0U2V0ID0gbmV3IEhhc2hTZXQoKTsgCi0JCVN0cmluZyBwcm90b1N0ciA9IG51bGwsIHByb3RvU3RyNiA9IG51bGw7Ci0JCWlmKHByb3RvY29sID09IElSZW1vdGVTdGF0dXNUb29scy5QUk9UT19VRFApIHsKLQkJCXByb3RvU3RyID0gImNhdCAvcHJvYy9uZXQvdWRwIjsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdG9TdHI2ID0gImNhdCAvcHJvYy9uZXQvdWRwNiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm90b2NvbCA9PSBJUmVtb3RlU3RhdHVzVG9vbHMuUFJPVE9fVENQKXsKLQkJCXByb3RvU3RyID0gImNhdCAvcHJvYy9uZXQvdGNwIjsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdG9TdHI2ID0gImNhdCAvcHJvYy9uZXQvdGNwNiI7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJCi0JCXRyeSB7Ci0JCQlJUmVtb3RlRXhlY3V0aW9uVG9vbHMgcmVtRXhlY1Rvb2xzID0gbWFuYWdlci5nZXRFeGVjdXRpb25Ub29scygpOyAKLQkJCQotCQkJLy8gRmlsdGVyIGluZm9ybWF0aW9uIGZyb20gZmlsZXMuCi0JCQkvKgotCQkJICogInByb3RvT3V0cHV0IiBhbmQgInByb3RvNk91dHB1dCIgYXJlIHRoZSAKLQkJCSAqIG91dHB1dHMgb2YgdGhlIGFib3ZlIGNvbW1hbmRzLCBXSVRIT1VUIHRoZSBoZWFkZXIgCi0JCQkgKiB0aGF0IGlzIGJlaW5nIHdpcGVkIG91dCBieSB0aGUgInJlcGxhY2VGaXJzdCIgCi0JCQkgKiBtZXRob2QuIFRodXMsIHRoZSByZXN1bHRpbmcgc3RyaW5nCi0JCQkgKiAicmF3UHJvY091dHB1dCIgY29udGFpbnMgb25seSB2YWxpZCBjb25uZWN0aW9uCi0JCQkgKiBlbnRyaWVzIGZvciBib3RoIGlwdjQgYW5kIGlwdjYgYW5kIG11c3QgYmUKLQkJCSAqIHRvdGFsbHkgcHJvY2Vzc2VkIG9uIHRoZSBmb2xsb3dpbmcgbG9vcC4KLQkJCSAqIAotCQkJICovCi0JCQlTdHJpbmcgcHJvdG9PdXRwdXQgPSByZW1FeGVjVG9vbHMuZXhlY3V0ZVdpdGhPdXRwdXQocHJvdG9TdHIpLgotCQkJCXJlcGxhY2VGaXJzdCgiXlxccHtTcGFjZX0qc2wuKmlub2RlXFxwe1NwYWNlfSpcXG4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIHByb3RvNk91dHB1dCA9IHJlbUV4ZWNUb29scy5leGVjdXRlV2l0aE91dHB1dChwcm90b1N0cjYpLgotCQkJCXJlcGxhY2VGaXJzdCgiXlxccHtTcGFjZX0qc2wuKmlub2RlXFxwe1NwYWNlfSpcXG4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlTdHJpbmcgcmF3UHJvY091dHB1dCA9IHByb3RvT3V0cHV0LmNvbmNhdChwcm90bzZPdXRwdXQpOyAKLQkJCQotCQkJU3RyaW5nIFtdIHJhd1Byb2NMaW5lcyA9IHJhd1Byb2NPdXRwdXQuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJZm9yKGludCBpPTA7IGkgPCByYXdQcm9jTGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBUcmltIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lLCBhbmQgc3BsaXQgdGhlIHN0cmluZyB1c2luZwotCQkJCS8vIHdoaXRlc3BhY2UgYXMgc2VwYXJhdG9yLgotCQkJCVN0cmluZyBbXSBwcm9jRmllbGRzID0gcmF3UHJvY0xpbmVzW2ldLnRyaW0oKS5zcGxpdCgiICIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBHZXQgdGhlIHNlY29uZCBmaWVsZCBhbmQgc3BsaXQgaXQgdXNpbmcgJzonIGFzIHNlcGFyYXRvci4KLQkJCQkvLyBHZXQgdGhlIHNlY29uZCBmaWVsZC4KLQkJCQlTdHJpbmcgW10gYWRkckZpZWxkcyA9IHByb2NGaWVsZHNbMV0uc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBhbGxvY2VkUG9ydCA9IGFkZHJGaWVsZHNbMV07Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSB2YWx1ZSB0byBhbiBpbnRlZ2VyIChpdCdzIG9uIGJhc2UgMTYpIAotCQkJCS8vIGFuZCBwdXQgaXQgaW50byB0aGUgc2V0LgotCQkJCXBvcnRTZXQuYWRkKEludGVnZXIudmFsdWVPZihhbGxvY2VkUG9ydCwgMTYpKTsKLQkJCX0KLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBwb3J0U2V0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBQQVNTV0RfVVNFUk5BTUVfRklFTEQgPSAwOwotCXByaXZhdGUgc3RhdGljIGludCBQQVNTV0RfVVNFUklEX0ZJRUxEID0gMjsKLQlwcml2YXRlIHN0YXRpYyBpbnQgUEFTU1dEX0dST1VQSURfRklFTEQgPSAzOwotCXByaXZhdGUgc3RhdGljIGludCBQQVNTV0RfSE9NRURJUl9GSUVMRCA9IDU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEdST1VQX0dST1VQSURfRklFTEQgPSAyOwotCXByaXZhdGUgc3RhdGljIGludCBHUk9VUF9VU0VSTElTVF9GSUVMRCA9IDM7Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVN0YXR1c1Rvb2xzI2dldEdyb3VwSURTZXQoKQotCSAqLwotCXB1YmxpYyBTZXQgZ2V0R3JvdXBJRFNldCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0vLwkJIElmIHRoZXJlJ3MgYWxyZWFkeSBpbmZvcm1hdGlvbiBvbiBjYWNoZSwgdXNlIGl0Ci0JCWlmKHVzZXJJbmZvQ2FjaGUgPT0gbnVsbCkgewotCQkJdXNlckluZm9DYWNoZSA9IGZldGNoUmVtb3RlVXNlckluZm8oKTsKLQkJfQkJCQotCQlyZXR1cm4gdXNlckluZm9DYWNoZS5ncm91cElEU2V0OwotCX0KLQotCS8qKgotCSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgZ2V0R3JvdXBJRFNldH0gbWV0aG9kIHRoYXQgb25seSB1c2VzIHRoZSBjYXQgY29tbWFuZCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUKLQkgKiB0byBleHRyYWN0IGRlc2lyZWQgZGF0YS4gU3BlY2lmaWNhbGx5LCBpdCByZXRyaWV2ZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgL2V0Yy9wYXNzd2QgbG9va2luZyBhbmQgL2V0Yy9ncm91cCBmaWxlcwotCSAqIGFuZCBleHRyYWN0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ3JvdXBzIG9mIHRoZSB1c2VyIHdob3NlIHVzZXJuYW1lIGNvbWVzIGZyb20gdGhlIHtAbGluayBnZXRVc2VybmFtZX0gbWV0aG9kCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBDYW5jZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIFNldCBnZXRHcm91cElEU2V0X0NhdEJhc2VkKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIFtdIHBhc3N3ZEZpZWxkcyA9IGdldFBhc3N3ZEZpZWxkcygpOyAKLQkJU3RyaW5nIHVzZXJuYW1lID0gcGFzc3dkRmllbGRzW1BBU1NXRF9VU0VSTkFNRV9GSUVMRF0udHJpbSgpOwotCQlTdHJpbmcgc3RyUGFzc3dkR3JvdXBJRCA9IHBhc3N3ZEZpZWxkc1tQQVNTV0RfR1JPVVBJRF9GSUVMRF0udHJpbSgpOwotCQlTZXQgZ3JvdXBJRFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQotCQkvLyBQdXQgdGhlIHRoZSBncm91cCBmcm9tIHRoZSBwYXNzZCBmaWxlIGludG8gdGhlIGxpc3QgKGlmIG5vdCBibGFuaykKLQkJaWYoIXN0clBhc3N3ZEdyb3VwSUQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZ3JvdXBJRFNldC5hZGQobmV3IEludGVnZXIoSW50ZWdlci5wYXJzZUludChzdHJQYXNzd2RHcm91cElEKSkpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBHZXQgdGhlIGdyb3VwIGZpbGUgYW5kIHNlYXJjaCBmb3IgdGhlIGdyb3VwcyB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MKLQkJICogdG8uCi0JCSAqLwotCQkvLyBDYXQgdGhlIC9ldGMvZ3JvdXAgZmlsZSBhbmQgc3BsaXQgaXQgaW4gbGluZXMKLQkJSVJlbW90ZUV4ZWN1dGlvblRvb2xzIHJlbUV4ZWNUb29scyA9IG1hbmFnZXIuZ2V0RXhlY3V0aW9uVG9vbHMoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyByYXdHcm91cCA9IHJlbUV4ZWNUb29scy5leGVjdXRlV2l0aE91dHB1dCgiY2F0IC9ldGMvZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIFtdIHJhd0dyb3VwTGluZXMgPSByYXdHcm91cC5zcGxpdCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJZm9yKGludCBpPTA7IGkgPCByYXdHcm91cExpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gTGFzdCBmaWVsZCBjYW4gYmUgbm9uLWV4aXN0YW50LCBzbyB1c2UgYSBuZWdhdGl2ZSBwYXJhbWV0ZXIgaW4gc3BsaXQgdG8KLQkJCQkvLyBtYWtlIHN1cmUgaXQgYmVjb21lcyBhIGZpZWxkCi0JCQkJU3RyaW5nIFtdIGdyb3VwRmllbGRzID0gcmF3R3JvdXBMaW5lc1tpXS5zcGxpdCgiOiIsIC0xKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFNlYXJjaCBmb3IgdGhlIHVzZXJuYW1lIGluIHRoZSBsaXN0IG9mIHVzZXJzIG9mIHRoZSBncm91cC4KLQkJCQkvLyBJRiB0aGUgdXNlcm5hbWUgYmVsb25ncyB0byB0aGUgZ3JvdXAsIGluc2VydCBpdCBpbnRvIHRoZSBsaXN0LgotCQkJCWlmKGlzVXNlcm5hbWVJbkxpc3QodXNlcm5hbWUsIGdyb3VwRmllbGRzW0dST1VQX1VTRVJMSVNUX0ZJRUxEXS5zcGxpdCgiLCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWdyb3VwSURTZXQuYWRkKG5ldyBJbnRlZ2VyKEludGVnZXIucGFyc2VJbnQoZ3JvdXBGaWVsZHNbR1JPVVBfR1JPVVBJRF9GSUVMRF0udHJpbSgpKSkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQkJLy8gUmV0dXJucyB0aGUgc2V0Ci0JCXJldHVybiBncm91cElEU2V0OwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhIGxpc3Qgb2YgdXNlcm5hbWVzLCB2ZXJpZmllcyBpZiB1c2VyIGJlbG9uZ3MgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIHVzZXJuYW1lCi0JICogQHBhcmFtIHVzZXJuYW1lTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNVc2VybmFtZUluTGlzdChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBbXSB1c2VybmFtZUxpc3QpIHsKLQkJZm9yKGludCBpPTA7IGkgPCB1c2VybmFtZUxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHVzZXJuYW1lTGlzdFtpXS50cmltKCkuZXF1YWxzKHVzZXJuYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVN0YXR1c1Rvb2xzI2dldFVzZXJJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRVc2VySUQoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQkvLyBJZiB0aGVyZSdzIGFscmVhZHkgaW5mb3JtYXRpb24gb24gY2FjaGUsIHVzZSBpdAotCQlpZih1c2VySW5mb0NhY2hlID09IG51bGwpIHsKLQkJCXVzZXJJbmZvQ2FjaGUgPSBmZXRjaFJlbW90ZVVzZXJJbmZvKCk7Ci0JCX0JCQkKLQkJcmV0dXJuIHVzZXJJbmZvQ2FjaGUudXNlcklELmludFZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgZ2V0VXNlcklEfSBtZXRob2QgdGhhdCBvbmx5IHVzZXMgdGhlIGNhdCBjb21tYW5kIG9uIHRoZSByZW1vdGUgbWFjaGluZQotCSAqIHRvIGV4dHJhY3QgZGVzaXJlZCBkYXRhLiBTcGVjaWZpY2FsbHkgaXQgcmVhZHMgaW5mb3JtYXRpb24gZnJvbSB0aGUgL2V0Yy9wYXNzd2QgZmlsZSBhbmQgcGFyc2VzIGl0IHRvCi0JICogcmV0cmlldmUgdGhlIHVzZXIgaWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBDYW5jZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzZXJJRF9DYXRCYXNlZCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0vLwkJIEdldCB0aGUgZmllbGQgdXNlcmlkIGZyb20gdGhlIHJlc3VsdCBvZiB0aGUgZ2V0UGFzc3dkRmllbGRzIG1ldGhvZAotCQkvLyBhbmQgcmV0dXJuIGl0LgotCQlTdHJpbmcgc3RyVXNlcklEID0gZ2V0UGFzc3dkRmllbGRzKClbUEFTU1dEX1VTRVJJRF9GSUVMRF07IAotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHJVc2VySUQpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxpbmUgdGhhdCBoYXMgdGhlIHVzZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFzc3dkIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBbXSBBIHZlY3RvciBjb250YWluaW5nIHRoZSBmaWVsZHMgb3IgbnVsbCBpZiBubyB1c2VyIG1hdGNoZXMKLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIENhbmNlbEV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgW10gZ2V0UGFzc3dkRmllbGRzKCkgdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGN1cnJlbnRVc2VybmFtZSA9IGdldFVzZXJuYW1lX1dob2FtaUJhc2VkKCk7Ci0JCUlSZW1vdGVFeGVjdXRpb25Ub29scyByZW1FeGVjVG9vbHMgPSBtYW5hZ2VyLmdldEV4ZWN1dGlvblRvb2xzKCk7Ci0JCQotCQl0cnkgewotCQkJLy8gR2V0IGxpbmVzIGZyb20gdGhlIHBhc3N3ZAotCQkJU3RyaW5nIHJhd1Bhc3N3ZCA9IHJlbUV4ZWNUb29scy5leGVjdXRlV2l0aE91dHB1dCgiY2F0IC9ldGMvcGFzc3dkIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBbXSByYXdQYXNzd2RMaW5lcyA9IHJhd1Bhc3N3ZC5zcGxpdCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gTG9vayBmb3IgdGhlIHN0cmluZyB0aGF0IG1hdGNoZXMgdGhlIHZhbHVlIGZyb20gdGhlIGN1cnJlbnRVc2VybmFtZQotCQkJLy8gVGhhdCBzdHJpbmcgaXMgb24gdGhlIGZpcnN0IGxpbmUgCi0JCQlmb3IoaW50IGk9MDsgaSA8IHJhd1Bhc3N3ZExpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gTWFrZSBzdXJlIGl0IGluY2x1ZGVzIHRoZSBsYXN0IGZpZWxkIGV2ZW4gaWYgaXQncyBibGFuay4KLQkJCQlTdHJpbmcgW10gcGFzc3dkRmllbGRzID0gcmF3UGFzc3dkTGluZXNbaV0uc3BsaXQoIjoiLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihwYXNzd2RGaWVsZHNbUEFTU1dEX1VTRVJOQU1FX0ZJRUxEXS5lcXVhbHMoY3VycmVudFVzZXJuYW1lKSkKLQkJCQkJcmV0dXJuIHBhc3N3ZEZpZWxkczsKLQkJCX0KLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzLlJlbW90ZVN0YXR1c1Rvb2xzX0dldFBhc3N3ZEZpZWxkc19Ob1VzZXJuYW1lSW5QYXNzd2RGaWxlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVN0YXR1c1Rvb2xzI2dldFVzZXJuYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLQkJQ2FuY2VsRXhjZXB0aW9uIHsKLQkJaWYodXNlckluZm9DYWNoZSA9PSBudWxsKSB7Ci0JCQl1c2VySW5mb0NhY2hlID0gZmV0Y2hSZW1vdGVVc2VySW5mbygpOwotCQl9CQkJCi0JCXJldHVybiB1c2VySW5mb0NhY2hlLnVzZXJuYW1lOwotCX0KLQkKLQkvKioKLQkgKiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgZ2V0VXNlcm5hbWV9IG1ldGhvZCB0aGF0IHVzZXMgdGhlIHdob2FtaSBjb21tYW5kIG9uIHRoZSByZW1vdGUgbWFjaGluZQotCSAqIHRvIGV4dHJhY3QgdXNlcm5hbWUgaW5mb3JtYXRpb24uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlcm5hbWVfV2hvYW1pQmFzZWQoKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uLAotCUNhbmNlbEV4Y2VwdGlvbiB7Ci0vLwkJIEdldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3aG9hbWkgY29tbWFuZAotCQl0cnkgewotCQkJSVJlbW90ZUV4ZWN1dGlvblRvb2xzIHJlbUV4ZWNUb29scyA9IG1hbmFnZXIuZ2V0RXhlY3V0aW9uVG9vbHMoKTsKLQkJCVN0cmluZyByYXdXaG9BbUkgPSByZW1FeGVjVG9vbHMuZXhlY3V0ZVdpdGhPdXRwdXQoIndob2FtaSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmF3V2hvQW1JLnRyaW0oKTsKLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCBkZXNpZ25lZCB0byBwYXJzZSB0aGUgL2V0Yy9ncm91cCBmaWxlIHRvIGZpbmQgdGhlIGxpc3QKLQkgKiBvZiBncm91cHMgdGhhdCBhIHVzZXIgaXMgZW5yb2xsZWQgaW4uIAotCSAqIAotCSAqIEBwYXJhbSB1c2VybmFtZSBUaGUgbmFtZSBvZiB0aGUgdXNlciB0aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yIGVucm9sbG1lbnRzLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIGdyb3VwcyB0aGF0IHVzZXJuYW1lIGJlbG9uZ3MgdG8uCi0JICogQHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIAotCSAqIEB0aHJvd3MgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIAotCSAqLwotCXByaXZhdGUgU2V0PEludGVnZXI+IHJlYWRHcm91cExpc3QoU3RyaW5nIHVzZXJuYW1lKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIHsKLQkJU2V0PEludGVnZXI+IGdyb3VwTGlzdCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0JCUlSZW1vdGVEb3dubG9hZEV4ZWN1dGlvbiBkb3dubG9hZEV4ZWN1dGlvbiA9IG51bGw7Ci0JCQotCQl0cnkgewotCQkJSVJlbW90ZUNvcHlUb29scyBjdCA9IG1hbmFnZXIuZ2V0UmVtb3RlQ29weVRvb2xzKCk7Ci0JCQlkb3dubG9hZEV4ZWN1dGlvbiA9IGN0LmV4ZWN1dGVEb3dubG9hZCgiL2V0Yy9ncm91cCIpOwotCQkJQnVmZmVyZWRSZWFkZXIgZXRjR3JvdXBGaWxlID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihkb3dubG9hZEV4ZWN1dGlvbi5nZXRJbnB1dFN0cmVhbUZyb21Qcm9jZXNzUmVtb3RlRmlsZSgpICkpOwotCQkJCi0JCQlTdHJpbmcgbGluZSA9IGV0Y0dyb3VwRmlsZS5yZWFkTGluZSgpOwotCi0JCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gZmllbGRzID0gbGluZS5zcGxpdCgiOiIpOwotCi0JCQkJaWYgKGZpZWxkc1swXS50cmltKCkuY29tcGFyZVRvKHVzZXJuYW1lKSA9PSAwKSB7Ci0JCQkJCWdyb3VwTGlzdC5hZGQobmV3IEludGVnZXIoZmllbGRzWzJdKSk7Ci0JCQkJfSBlbHNlIGlmIChmaWVsZHMubGVuZ3RoID09IDQpIHsKLQotCQkJCQlTdHJpbmdbXSB1c2VycyA9IGZpZWxkc1szXS5zcGxpdCgiLCIpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVzZXJzLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCQkJCWlmICh1c2Vyc1tpXS50cmltKCkuY29tcGFyZVRvKHVzZXJuYW1lKSA9PSAwKSB7Ci0JCQkJCQkJZ3JvdXBMaXN0LmFkZChuZXcgSW50ZWdlcihmaWVsZHNbMl0pKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWxpbmUgPSBldGNHcm91cEZpbGUucmVhZExpbmUoKTsKLQkJCX0KLQkJCQotCQkJZXRjR3JvdXBGaWxlLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihpb2UpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkvL01heWJlIHRoZSBmb3JtYXQgb2YgdGhpcyAvZXRjL2dyb3VwIGZpbGUgcHV0IHRoZSBmaWVsZHMgaW4gYQotCQkJLy9kaWZmZXJlbnQgb3JkZXIuCi0JCQl0aHJvdyBuZXcgUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uKG5mZSk7Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBhaW9vYmUpIHsKLQkJCS8vVGhpcyBjYXNlIGlzIGdvaW5nIHRvIGhhcHBlbiBpZiB0aGUgZm9ybWF0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgb25lLgotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihhaW9vYmUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRvd25sb2FkRXhlY3V0aW9uICE9IG51bGwpIHsKLQkJCQlkb3dubG9hZEV4ZWN1dGlvbi5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdyb3VwTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgdXNlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZW1vdGUgbWFjaGluZS4KLQkgKiBUaGlzIG9wZXJhdGlvbiBpcyBhIGJpdCBzbG93IGFuZCBzaG91bGQgYmUgdXNlZCBvbmx5IG9uY2UgcGVyIFJlbW90ZVN0YXR1c1Rvb2xzIG9iamVjdC4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ2FuY2VsRXhjZXB0aW9uCi0JICogQHJldHVybiAKLQkgKi8KLQlwcml2YXRlIFVzZXJJbmZvcm1hdGlvbiBmZXRjaFJlbW90ZVVzZXJJbmZvKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLQkJQ2FuY2VsRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vU2V0IG9mIGdyb3VwcyB0aGF0IHRoaXMgdXNlciBiZWxvbmdzIHRvLgotCQkJU2V0PEludGVnZXI+IGdyb3VwTGlzdDsKLQkJCQotCQkJSVJlbW90ZUV4ZWN1dGlvblRvb2xzIHJlbUV4ZWNUb29scyA9IG1hbmFnZXIuZ2V0RXhlY3V0aW9uVG9vbHMoKTsKLQkJCS8vIEV4ZWN1dGUgY29tbWFuZCB0byByZXR1cm4gdGhlIHVzZXJuYW1lLCB1aWQgYW5kIHRoZSBncm91cCBsaXN0Ci0JCQlTdHJpbmcgcmF3VXNlckluZm8gPSByZW1FeGVjVG9vbHMuZXhlY3V0ZVdpdGhPdXRwdXQoImVjaG8gYGlkIC11bmA6YGlkIC11YDpgaWQgLUdgIik7Ci0JCQkKLQkJCVN0cmluZyBbXSB1c2VySW5mb0ZpZWxkcyA9IHJhd1VzZXJJbmZvLnRyaW0oKS5zcGxpdCgiOiIsIC0xKTsgLy8gMXN0IHVzZXJuYW1lLCAybmQgVUlELCAzcmQgbGlzdCBvZiBncm91cHMKLQkJCQotCQkJLy9XaXRoIHN5c3RlbXMgdXNpbmcgQnVzeUJveCwgaWQgaGFzIG5vIGFyZ3VtZW50IC1HCi0JCQkvL3NvIHdlIG11c3QgcGFyc2UgL2V0Yy9ncm91cCBpbiB0aGlzIGNhc2UKLQkJCWlmICh1c2VySW5mb0ZpZWxkc1syXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiIikpIHsKLQkJCQlncm91cExpc3QgPSByZWFkR3JvdXBMaXN0KHVzZXJJbmZvRmllbGRzWzBdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gZ3JvdXBGaWVsZHMgPSB1c2VySW5mb0ZpZWxkc1syXS5zcGxpdCgiICIsIC0xKTsKLQotCQkJCWdyb3VwTGlzdCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwRmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCS8vIENvbnZlcnQgZ3JvdXBzIHRvIEludGVnZXIgYW5kIHB1dCBpbnRvIHRoZSBTZXQKLQkJCQkJZ3JvdXBMaXN0LmFkZChuZXcgSW50ZWdlcihncm91cEZpZWxkc1tpXSkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIG5ldyBVc2VySW5mb3JtYXRpb24obmV3IEludGVnZXIodXNlckluZm9GaWVsZHNbMV0pLCBncm91cExpc3QsIHVzZXJJbmZvRmllbGRzWzBdKTsKLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0VGltZSgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUmVtb3RlRXhlY3V0aW9uVG9vbHMgZXhlY1Rvb2xzID0gbWFuYWdlci5nZXRFeGVjdXRpb25Ub29scygpOwotCQkJU3RyaW5nIHJhd0RhdGEgPSBleGVjVG9vbHMuZXhlY3V0ZVdpdGhPdXRwdXQoImRhdGUgKyclcyciKTsKLQkJCXJhd0RhdGEgPSByYXdEYXRhLnRyaW0oKTsKLQkJCXJldHVybiBMb25nLnBhcnNlTG9uZyhyYXdEYXRhKSoxMDAwOwotCQl9IGNhdGNoIChSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL1VwbG9hZEV4ZWN1dGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvVXBsb2FkRXhlY3V0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NzM0NGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9pbnRlcm5hbC9zc2gvVXBsb2FkRXhlY3V0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5zc2g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlUGF0aFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVVcGxvYWRFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5pbnRlcm5hbC5jb21tb24uRGVidWc7Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbEV4ZWM7Ci0KLXB1YmxpYyBjbGFzcyBVcGxvYWRFeGVjdXRpb24gZXh0ZW5kcyBLaWxsYWJsZUV4ZWN1dGlvbiBpbXBsZW1lbnRzIElSZW1vdGVVcGxvYWRFeGVjdXRpb24gewotCi0JU3RyaW5nIHJlbW90ZUZpbGU7Ci0JSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtOwotCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJvclN0cmVhbTsKLQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOwotCi0JcHVibGljIFVwbG9hZEV4ZWN1dGlvbihFeGVjdXRpb25NYW5hZ2VyIGV4ZWN1dGlvbk1hbmFnZXIsIFN0cmluZyByZW1vdGVGaWxlLCBJbnB1dFN0cmVhbSBzb3VyY2UpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIoZXhlY3V0aW9uTWFuYWdlcik7Ci0JCXRoaXMuc291cmNlU3RyZWFtID0gc291cmNlOwotCQl0aGlzLnJlbW90ZUZpbGUgPSByZW1vdGVGaWxlOwotCQllcnJvclN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbVRvUHJvY2Vzc1JlbW90ZUZpbGUoKSB7Ci0JCWlmIChzb3VyY2VTdHJlYW0gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnRFeGVjdXRpb24oKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJQ2hhbm5lbEV4ZWMgY2hhbm5lbCA9IGNyZWF0ZUNoYW5uZWwoZmFsc2UpOwotCQlJUmVtb3RlUGF0aFRvb2xzIHBhdGhUb29sID0gZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldFJlbW90ZVBhdGhUb29scygpOwotCQlzZXRDb21tYW5kTGluZSgiY2F0ID4iICsgcGF0aFRvb2wucXVvdGUocmVtb3RlRmlsZSwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHNvdXJjZVN0cmVhbSAhPSBudWxsKSB7Ci0JCQljaGFubmVsLnNldElucHV0U3RyZWFtKHNvdXJjZVN0cmVhbSk7Ci0JCQlvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlvdXRwdXRTdHJlYW0gPSBjaGFubmVsLmdldE91dHB1dFN0cmVhbSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLlVwbG9hZEV4ZWN1dGlvbl9TdGFydEV4ZWN1dGlvbl9GYWlsZWRDcmVhdGVVcGxvYWQsIGUpOwotCQkJfQotCQl9Ci0JCWNoYW5uZWwuc2V0RXJyU3RyZWFtKGVycm9yU3RyZWFtKTsKLQotCQlzdXBlci5zdGFydEV4ZWN1dGlvbigpOwotCQlEZWJ1Zy5wcmludGxuKCJVcGxvYWRpbmcgIiArIHJlbW90ZUZpbGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvclN0cmVhbS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL2NpcGhlcnR5cGVzbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL2NpcGhlcnR5cGVzbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc1YTY3NS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9jaXBoZXJ0eXBlc21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1OQU1FX0JMT1dGSVNIPUJsb3dmaXNoIChmYXN0ZXN0KQotTkFNRV8zREVTPTNERVMKLU5BTUVfQUVTMTI4PUFFUzEyOAotTkFNRV9BRVMxOTI9QUVTMTkyCi1OQU1FX0FFUzI1Nj1BRVMyNTYKLU5BTUVfREVGQVVMVD1JbnRlcm5hbCBTU0ggY2xpZW50IGRlZmF1bHQKLQotS0VZX0JMT1dGSVNIPWJsb3dmaXNoLWNiYwotS0VZXzNERVM9M2Rlcy1jYmMKLUtFWV9BRVMxMjg9YWVzMTI4LWNiYwotS0VZX0FFUzE5Mj1hZXMxOTItY2JjCi1LRVlfQUVTMjU2PWFlczI1Ni1jYmMKLUtFWV9ERUZBVUxUPWRlZmF1bHQKLQotQ2lwaGVyVHlwZXMuQXR0cmlidXRlTmFtZUV4Y2VwdGlvbk1zZzI9RGlkIG5vdCBmaW5kIGF0dHJpYnV0ZSBOQU1FXyB7MH0gdG8gbWF0Y2gKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL21lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2ludGVybmFsL3NzaC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTI2MmYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvaW50ZXJuYWwvc3NoL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotS2lsbGFibGVFeGVjdXRpb25fU2NyaXB0RXhlY3V0aW9uQ29ubmVjdGlvbkV4Y2VwdGlvbj1GYWlsZWQgdG8gc3RhcnQgdG8gZXhlY3V0ZSBzY3JpcHQKLUtpbGxhYmxlRXhlY3V0aW9uX0RlYnVnXzE9VXNpbmcgY29tbWFuZCBsaW5lOiAKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Paz1BcHBsaWNhdGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19FcnJvcj1BcHBsaWNhdGlvbiBmaW5pc2hlZCB3aXRoIGVycm9yIGNvZGUKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Ob3RFeGVjdXRhYmxlPUNvbW1hbmQgaXMgbm90IGFuIGV4ZWN1dGFibGUKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Db21tYW5kTm90Rm91bmQ9Q29tbWFuZCBub3QgZm91bmQKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19JbnZhbGlkRXhpdENvZGU9SW52YWxpZCBleGl0IGNvZGUKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19IYW5ndXA9SGFuZ3VwIChQT1NJWCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19UZXJtaW5hbEludGVycnVwdD1UZXJtaW5hbCBpbnRlcnJ1cHQgKEFOU0kpCi1LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfVGVybWluYWxRdWl0PVRlcm1pbmFsIHF1aXQgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0lsbGVnYWxJbnN0cnVjdGlvbj1JbGxlZ2FsIGluc3RydWN0aW9uIChBTlNJKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1RyYWNlVHJhcD1UcmFjZSB0cmFwIChQT1NJWCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19JT1RUcmFwPUlPVCBUcmFwICg0LjIgQlNEKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0JVU0Vycm9yPUJVUyBlcnJvciAoNC4yIEJTRCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19GbG9hdGluZ1BvaW50RXhjZXB0aW9uPUZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiAoQU5TSSkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19LaWxsPUtpbGwoY2FuJ3QgYmUgY2F1Z2h0IG9yIGlnbm9yZWQpIChQT1NJWCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Vc2VyRGVmaW5lZFNpZ25hbDE9VXNlciBkZWZpbmVkIHNpZ25hbCAxIChQT1NJWCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19JbnZhbGlkTWVtb3J5U2VnbWVudEFjY2Vzcz1JbnZhbGlkIG1lbW9yeSBzZWdtZW50IGFjY2VzcyAoQU5TSSkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Vc2VyRGVmaW5lZFNpZ25hbDI9VXNlciBkZWZpbmVkIHNpZ25hbCAyIChQT1NJWCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19Ccm9rZW5QaXBlPVdyaXRlIG9uIGEgcGlwZSB3aXRoIG5vIHJlYWRlciwgQnJva2VuIHBpcGUgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0FsYXJtQ2xvY2s9QWxhcm0gY2xvY2sgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1Rlcm1pbmF0aW9uPVRlcm1pbmF0aW9uIChBTlNJKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1N0YWNrRmF1bHQ9U3RhY2sgZmF1bHQKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19DaGlsZFByb2Nlc3NTdG9wcGVkT3JFeGl0ZWQ9Q2hpbGQgcHJvY2VzcyBoYXMgc3RvcHBlZCBvciBleGl0ZWQsIGNoYW5nZWQgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0NvbnRpbnVlRXhlY3V0aW5nPUNvbnRpbnVlIGV4ZWN1dGluZywgaWYgc3RvcHBlZCAoUE9TSVgpCi1LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfU3RvcEV4ZWN1dGluZz1TdG9wIGV4ZWN1dGluZyhjYW4ndCBiZSBjYXVnaHQgb3IgaWdub3JlZCkgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1Rlcm1pbmFsU3RvcFNpZ25hbD1UZXJtaW5hbCBzdG9wIHNpZ25hbCAoUE9TSVgpCi1LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfQmFja2dyb3VuZFByb2Nlc3NSZWFkVFRZPUJhY2tncm91bmQgcHJvY2VzcyB0cnlpbmcgdG8gcmVhZCwgZnJvbSBUVFkgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX0JhY2tncm91bmRXcml0ZVRUWT1CYWNrZ3JvdW5kIHByb2Nlc3MgdHJ5aW5nIHRvIHdyaXRlLCB0byBUVFkgKFBPU0lYKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1VyZ2VudENvbmRpdGlvblNvY2tldD1VcmdlbnQgY29uZGl0aW9uIG9uIHNvY2tldCAoNC4yIEJTRCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19DUFVMaW1pdEV4Y2VlZGVkPUNQVSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19GaWxlU2l6ZUxpbWl0RXhjZWVkZWQ9RmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkICg0LjIgQlNEKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1ZpcnR1YWxBbGFybUNsb2NrPVZpcnR1YWwgYWxhcm0gY2xvY2sgKDQuMiBCU0QpCi1LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfUHJvZmlsaW5nQWxhcm1DbG9jaz1Qcm9maWxpbmcgYWxhcm0gY2xvY2sgKDQuMiBCU0QpCi1LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfV2luZG93U2l6ZUNoYW5nZT1XaW5kb3cgc2l6ZSBjaGFuZ2UgKDQuMyBCU0QsIFN1bikKLUtpbGxhYmxlRXhlY3V0aW9uX0ZpbmlzaFN0YXR1c19JT1Bvc3NpYmxlPUkvTyBub3cgcG9zc2libGUgKDQuMiBCU0QpCi1LaWxsYWJsZUV4ZWN1dGlvbl9GaW5pc2hTdGF0dXNfUG93ZXJGYWlsdXJlUmVzdGFydD1Qb3dlciBmYWlsdXJlIHJlc3RhcnQgKFN5c3RlbSBWKQotS2lsbGFibGVFeGVjdXRpb25fRmluaXNoU3RhdHVzX1Vua25vd249VW5rbm93bgotCi1Db25uZWN0aW9uX0F1dGhlbnRpY2F0aW9uVHlwZU5vdFN1cHBvcnRlZD1BdXRoZW50aWNhdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWRcIQotQ29udHJvbENoYW5uZWxfT3Blbl9GYWlsZWRDcmVhdGVJT1N0cmVhbT1GYWlsZWQgdG8gY3JlYXRlIGlucHV0L291dHB1dHN0cmVhbSBmb3IgYXV4aWxpYXJ5IHNoZWxsIGluIHNzaC5Db250cm9sQ29ubmVjdGlvbgotQ29ubmVjdGlvbl9Db25uZWN0X0ludmFsaWRQcml2YXRlS2V5PUludmFsaWQgcHJpdmF0ZSBrZXkKLUNvbm5lY3Rpb25fQ29ubmVjdF9GYWlsZWRDcmVhdGVTZXNzaW9uPUZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvbgotQ29ubmVjdGlvbl9Db25uZWN0X0ZhaWxlZENvbm5lY3Q9RmFpbGVkIHRvIGNvbm5lY3QKLUNvbm5lY3Rpb25fQ29ubmVjdF9GYWlsZWRDcmVhdGVDb250cm9sQ2hhbm5lbD1GYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wgY2hhbm5lbAotQ29ubmVjdGlvbl9Db25uZWN0X0ZhaWxlZENyZWF0ZVNGVFBDb25uZWN0aW9uPUZhaWxlZCB0byBjcmVhdGUgU0ZUUCBjb25uZWN0aW9uIGZvciBzc2guRXhlY3V0aW9uTWFuYWdlcgotQ29ubmVjdGlvbl9Db25uZWN0X0ZhaWxlZFVuc3VwcG9ydGVkS2V5U2l6ZT1VbnN1cHBvcnRlZCBLZXlzaXplCi0KLUNvcHlUb29sc19Eb3dubG9hZEZpbGVGaWxlX0ZhaWxlZERvd25sb2FkRmlsZT1GYWlsZWQgdG8gZG93bmxvYWQgZmlsZTogCi1Db3B5VG9vbHNfZG9Eb3dubG9hZEZpbGVUb0ZpbGVfQ2Fubm90V3JpdGVGaWxlPURvd25sb2FkIGNhbm5vdCB3cml0ZSB0byBsb2NhbCBmaWxlICh7MH0pCi1Db3B5VG9vbHNfZG9Eb3dubG9hZEZpbGVUb0ZpbGVfRXhlY3V0aW9uRmFpbGVkPUV4ZWN1dGlvbiBvZiBkb3dubG9hZCBmYWlsZWQgKHswfSkKLUNvcHlUb29sc19kb0Rvd25sb2FkRmlsZVRvRmlsZV9Db21tYW5kRmFpbGVzPURvd25sb2FkIGNvbW1hbmQgZmFpbGVkIG9uIHJlbW90ZSBob3N0IChleGl0IHZhbHVlIHswfSkKLUNvcHlUb29sc19kb1VwbG9hZEZpbGVGcm9tRmlsZV9DYW5ub3RSZWFkRmlsZT1VcGxvYWQgY2Fubm90IHJlYWQgbG9jYWwgZmlsZSAoezB9KQotQ29weVRvb2xzX2RvVXBsb2FkRmlsZUZyb21GaWxlX0V4ZWN1dGlvbkZhaWxlZD1FeGVjdXRpb24gb2YgdXBsb2FkIGZhaWxlZCAoezB9KQotQ29weVRvb2xzX2RvVXBsb2FkRmlsZUZyb21GaWxlX0NvbW1hbmRGYWlsZWQ9VXBsb2FkIGNvbW1hbmQgZmFpbGVkIG9uIHJlbW90ZSBob3N0IChleGl0IHZhbHVlIHswfSkKLUNvbnRyb2xDaGFubmVsX09wZW5fRmFpbGVkQ3JlYXRlQXV4aWxpYXJ5U2hlbGw9RmFpbGVkIHRvIGNyZWF0ZSBhdXhpbGlhcnkgc2hlbGwgZm9yIHNzaC5Db250cm9sQ29ubmVjdGlvbgotQ29udHJvbENoYW5uZWxfRGVidWdfQ29udHJvbENvbm5lY3Rpb25SZWNlaXZlZD1Db250cm9sIGNvbm5lY3Rpb24gcmVjZWl2ZWQ6IAotQ29ubmVjdGlvbl9DcmVhdGVFeGVjQ2hhbm5lbF9GYWlsZWRDcmVhdGVOZXdFeGVjQ2hhbm5lbD1GYWlsZWQgdG8gY3JlYXRlIG5ldyBleGVjdXRpb24gY2hhbm5lbAotQ29ubmVjdGlvbl9DcmVhdGVUdW5uZWxfVHVubmVsUG9ydEFscmVhZHlBbGxvY2VkPUZhaWxlZCB0byBjcmVhdGUgdHVubmVsLCBzaW5jZSBwb3J0IGlzIGFscmVhZHkgYWxsb2NhdGVkIGZvciBhIHR1bm5lbAotQ29ubmVjdGlvbl9DcmVhdGVUdW5uZWxfRmFpbGVkQ3JlYXRlVHVubmVsPUZhaWxlZCB0byBjcmVhdGUgdHVubmVsCi1Db250cm9sQ2hhbm5lbF9PcGVuX0ZhaWxlZFNlbmRJbml0Q29tbWFuZHM9RmFpbGVkIHRvIHNlbmQgaW5pdGlhbGl6YXRpb24gY29tbWFuZHMgdG8gYXV4aWxpYXJ5IHNoZWxsCi1Db25uZWN0aW9uX1JlbGVhc2VUdW5uZWxfUG9ydE5vdEFsbG9jZWRGb3JUdW5uZWw9RmFpbGVkIHRvIHJlbW92ZSB0dW5uZWwsIHNpbmNlIHBvcnQgaXMgbm90IGFsbG9jYXRlZCBmb3IgYSB0dW5uZWwKLUNvbnRyb2xDaGFubmVsX0RlYnVnX1JlY2VpdmVkQ29udHJvbFRlcm1pbmFsUGF0aD1SZWNlaXZlZCBjb250cm9sVGVybWluYWxQYXRoOiAKLUNvbm5lY3Rpb25fUmVsZWFzZVR1bm5lbF9GYWlsZWRSZW1vdmVUdW5uZWw9RmFpbGVkIHRvIHJlbW92ZSB0dW5uZWwKLUNvbm5lY3Rpb25fQ3JlYXRlQ29ubmVjdGlvblNsb3RfRmFpbGVkQ3JlYXRlTmV3U2Vzc2lvbj1GYWlsZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9uIGZvciBtb3JlIGV4ZWN1dGlvbiBjaGFubmVscwotQ29udHJvbENoYW5uZWxfRGVidWdfU3RhcnRlZFdhaXRpbmdDb250cm9sVGVybWluYWxQYXRoPVN0YXJ0ZWQgd2FpdGluZyBmb3IgY29udHJvbFRlcm1pbmFsUGF0aAotQ29udHJvbENoYW5uZWxfT3Blbl9XYWl0Q29udHJvbFRlcm1pbmFsUGF0aEludGVycnVwdGVkPVdhaXQgZm9yIGNvbnRyb2xUZXJtaW5hbFBhdGggd2FzIGludGVycnVwdGVkCi1Db25uZWN0aW9uX0NyZWF0ZUNvbm5lY3Rpb25TbG90X0ZhaWxlZENvbm5lY3ROZXdTZXNzaW9uPUZhaWxlZCB0byBjb25uZWN0IHRvIG5ldyBzZXNzaW9uIGZvciBtb3JlIGV4ZWN1dGlvbiBjaGFubmVscwotQ29ubmVjdGlvbl9TZXRDaXBoZXJUeXBlX0NpcGhlck5vdFN1cHBvcnRlZD1DaXBoZXIgbm90IHN1cHBvcnRlZAotCi1Eb3dubG9hZEV4ZWN1dGlvbl9Eb3dubG9hZEV4ZWN1dGlvbl9GYWlsZWRDcmVhdGVEb3dubG9hZD1GYWlsZWQgdG8gY3JlYXRlIGRvd25sb2FkCi1FeGVjdXRpb25NYW5hZ2VyX0NyZWF0ZVR1bm5lbF9BbGxMb2NhbFBvcnRzQnVzeT1BbGwgbG9jYWwgcG9ydHMgYXJlIGJ1c3kuCi1FeGVjdXRpb25PYnNlcnZlcl9FeGVjdXRpb25PYnNlcnZlcl9SZW1vdGVDb21tYW5kT2JzZXJ2ZXI9UmVtb3RlQ29tbWFuZE9ic2VydmVyCi1FeGVjdXRpb25Ub29sc19FeGVjdXRlQmFzaENvbW1hbmRfRmFpbGVkUnVuQmFzaENvbW1hbmQ9RmFpbGVkIHRvIHJ1biBCYXNoIGNvbW1hbmQKLVBhdGhUb29sc180Nz1hLwotUmVtb3RlRmlsZVRvb2xzX0ZldGNoUmVtb3RlQXR0cl9GYWlsZWRGZXRjaEF0dHI9RmFpbGVkIHRvIGZldGNoIGF0dHJpYnV0ZXMgZnJvbSByZW1vdGUgZmlsZWRpcmVjdG9yeQotUmVtb3RlRmlsZVRvb2xzX1VwbG9hZFBlcm1pc3Npb25zX0ZhaWxlZFNldFBlcm1pc3Npb25zPUZhaWxlZCB0byBzZXQgcGVybWlzc2lvbnMKLVJlbW90ZVN0YXR1c1Rvb2xzX0dldFBhc3N3ZEZpZWxkc19Ob1VzZXJuYW1lSW5QYXNzd2RGaWxlPVVzZXJuYW1lIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwYXNzd2QgZmlsZVwhCi1SZW1vdGVGaWxlVG9vbHNfVmFsaWRhdGVSZW1vdGVQYXRoX05vdFZhbGlkPVwgaXMgbm90IGEgdmFsaWQgcGF0aCBvbiByZW1vdGUgaG9zdAotUmVtb3RlRmlsZVRvb2xzX1ZhbGlkYXRlTG9jYWxGaWxlX05vdFZhbGlkPVwgaXMgbm90IGEgdmFsaWQgbG9jYWwgZmlsZQotUmVtb3RlRmlsZVRvb2xzX1ZhbGlkYXRlTG9jYWxJdGVtX0RvZXNOb3RFeGlzdD1cIGRvZXMgbm90IGV4aXN0Ci1SZW1vdGVGaWxlVG9vbHNfVmFsaWRhdGVMb2NhbERpcl9Ob3RWYWxpZD1cIGlzIG5vdCBhIHZhbGlkIGxvY2FsIGRpcmVjdG9yeQotUmVtb3RlRmlsZVRvb2xzX1ZhbGlkYXRlUmVtb3RlRmlsZV9Ob3RWYWxpZD1cIGlzIG5vdCBhIHZhbGlkIHJlbW90ZSBmaWxlCi1SZW1vdGVGaWxlVG9vbHNfVmFsaWRhdGVSZW1vdGVEaXJfTm90VmFsaWQ9XCBpcyBub3QgYSB2YWxpZCByZW1vdGUgZGlyZWN0b3J5Ci1SZW1vdGVGaWxlVG9vbHNfTGlzdEZpbGVzX0ZhaWxlZExpc3RSZW1vdGU9RmFpbGVkIHRvIGxpc3QgZmlsZXMgb24gcmVtb3RlIGhvc3QKLVJlbW90ZUZpbGVUb29sc19GYWlsZWRTZXRQZXJtaXNzaW9uPUZhaWxlZCB0byBzZXQgcGVybWlzc2lvbiBvbiByZW1vdGUgZmlsZS9kaXJlY3RvcnkKLVJlbW90ZUZpbGVUb29sc19HZXRJdGVtc1BhdGhfRmFpbGVkTGlzdFJlbW90ZUZpbGVzPUZhaWxlZCB0byBsaXN0IGZpbGVzIG9uIHJlbW90ZSBob3N0Ci1SZW1vdGVGaWxlVG9vbHNfR2V0SXRlbV9QYXRoTm90RXhpc3Q9UGF0aCBkb2VzIG5vdCBleGlzdAotU2NyaXB0RXhlY3V0aW9uX1N0YXJ0RXhlY3V0aW9uX0ZhaWxlZEluaXRTdHJlYW1zPUZhaWxlZCB0byBpbml0aWFsaXplIHN0cmVhbXMgZm9yIHNzaC5TY3JpcHRFeGVjdXRpb24KLVVwbG9hZEV4ZWN1dGlvbl9TdGFydEV4ZWN1dGlvbl9GYWlsZWRDcmVhdGVVcGxvYWQ9RmFpbGVkIHRvIGNyZWF0ZSB1cGxvYWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLy5jbGFzc3BhdGggYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS8ucHJvamVjdCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODJjYzVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA3YTQwNC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudCwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbCwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnZlcmlmaWNhdGlvbgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvYWJvdXQuaHRtbCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ODI0MmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWFjOWFkZi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWQ4NjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFJlbW90ZSBUb29scyBUYXJnZXQgRW52aXJvbm1lbnRzIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9wbHVnaW4ueG1sIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA3ODJjMy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlbW90ZUVudmlyb25tZW50Q29udHJvbERlbGVnYXRlIiBuYW1lPSJSZW1vdGUgRW52aXJvbm1lbnQgQ29udHJvbCBEZWxlZ2F0ZSIgc2NoZW1hPSJzY2hlbWEvcmVtb3RlRW52aXJvbm1lbnRDb250cm9sRGVsZWdhdGUuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY2hpbGRyZW5Qcm92aWRlciIgbmFtZT0iVGFyZ2V0IEVsZW1lbnQgQ2hpbGRyZW4gUHJvdmlkZXIiIHNjaGVtYT0ic2NoZW1hL2NoaWxkcmVuUHJvdmlkZXIuZXhzZCIvPgotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc2NoZW1hL2NoaWxkcmVuUHJvdmlkZXIuZXhzZCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NjaGVtYS9jaGlsZHJlblByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MzBhNWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc2NoZW1hL2NoaWxkcmVuUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUiIGlkPSJjaGlsZHJlblByb3ZpZGVyIiBuYW1lPSJUYXJnZXQgRWxlbWVudCBDaGlsZHJlbiBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb250cmlidXRvciBjb250cmlidXRlcyBhbiBpbnN0YW5jZSBvZiBJQ2hpbGRyZW5Qcm92aWRlciwgd2hpY2ggcHJvdmlkZXMgY2hpbGRyZW4gdG8gZXhpc3RpbmcgdGFyZ2V0IGVsZW1lbnRzLiBGb3IgY29udHJpYnV0aW5nIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgZWxlbWVudHMmYXBvczsgY2hpbGRyZW4sIGNvbnRyaWJ1dG9yIHNob3VsZCBtYWtlIHRoZW0gaW1wbGVtZW50aW5nIElOb2RlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjaGlsZHJlblByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNoaWxkcmVuUHJvdmlkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklDaGlsZHJlblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc2NoZW1hL3JlbW90ZUVudmlyb25tZW50Q29udHJvbERlbGVnYXRlLmV4c2QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zY2hlbWEvcmVtb3RlRW52aXJvbm1lbnRDb250cm9sRGVsZWdhdGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNkZDljOS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zY2hlbWEvcmVtb3RlRW52aXJvbm1lbnRDb250cm9sRGVsZWdhdGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUiIGlkPSJyZW1vdGVFbnZpcm9ubWVudENvbnRyb2xEZWxlZ2F0ZSIgbmFtZT0iUmVtb3RlIEVudmlyb25tZW50IENvbnRyb2wgRGVsZWdhdGUiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udHJvbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250cm9sIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmV4dGVuc2lvbi5JVGFyZ2V0VHlwZUV4dGVuc2lvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvRW52aXJvbm1lbnRQbHVnaW4uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvRW52aXJvbm1lbnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI3YmJhOS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L0Vudmlyb25tZW50UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5DaGlsZHJlblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLlRhcmdldEVudmlyb25tZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRUeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklUYXJnZXRUeXBlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmV4dGVuc2lvbnBvaW50cy5JUHJvY2Vzc01lbWJlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuZXh0ZW5zaW9ucG9pbnRzLlByb2Nlc3NFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgRklMRU5BTUUgPSAiZW52aXJvbm1lbnRzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBFWFRfQ09OVFJPTFNfSUQgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUucmVtb3RlRW52aXJvbm1lbnRDb250cm9sRGVsZWdhdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEVudmlyb25tZW50UGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIFRhcmdldEVudmlyb25tZW50TWFuYWdlciBtYW5hZ2VyOwotCXByaXZhdGUgQ2hpbGRyZW5Qcm92aWRlck1hbmFnZXIgY2hpbGRyZW5Qcm92aWRlck1ncjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRW52aXJvbm1lbnRQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRDb250cm9scygpIHsKLQkJZmluYWwgTWFwIGNvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLQkJUHJvY2Vzc0V4dGVuc2lvbnMucHJvY2VzcyhFWFRfQ09OVFJPTFNfSUQsIG5ldyBJUHJvY2Vzc01lbWJlclZpc2l0b3IoKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3QgcHJvY2VzcyhJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lbWJlcikgewotCQkJCU9iamVjdCBtcHJvdmlkZXI7Ci0JCQkJdHJ5IHsKLQkJCQkJCi0JCQkJCW1wcm92aWRlciA9IG1lbWJlci5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmICggSVRhcmdldFR5cGVFeHRlbnNpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShtcHJvdmlkZXIuZ2V0Q2xhc3MoKSkgKSB7Ci0JCQkJCQljb250cm9scy5wdXQobWVtYmVyLmdldEF0dHJpYnV0ZSgibmFtZSIpLG1wcm92aWRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQltcHJvdmlkZXIgPSBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gbXByb3ZpZGVyOwotCQkJfQotCQkJCi0JCX0pOwotCQlyZXR1cm4gY29udHJvbHM7Ci0JfQotCi0JcHVibGljIFRhcmdldEVudmlyb25tZW50TWFuYWdlciBnZXRUYXJnZXRzTWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCW1hbmFnZXIgPSBuZXcgVGFyZ2V0RW52aXJvbm1lbnRNYW5hZ2VyKCk7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgQ2hpbGRyZW5Qcm92aWRlck1hbmFnZXIgZ2V0Q2hpbGRyZW5Qcm92aWRlck1hbmFnZXIoKSB7Ci0JCWlmIChjaGlsZHJlblByb3ZpZGVyTWdyID09IG51bGwpIHsKLQkJCWNoaWxkcmVuUHJvdmlkZXJNZ3IgPSBuZXcgQ2hpbGRyZW5Qcm92aWRlck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5Qcm92aWRlck1ncjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJbWFuYWdlci53cml0ZVRvRmlsZSgpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCB0YXJnZXQgZWxlbWVudHMgb2YgdGhlIHBsdWdpbiB0aGF0IGluY2x1ZGVzCi0JICogdGhlIHBhcmFtZXRlciBjbGFzcy4gVGhpcyBwYXJhbWV0ZXIgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0JICogSVRhcmdldFR5cGVFeHRlbnNpb24gaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBDbGFzcyBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBJVGFyZ2V0VHlwZUV4dGVuc2lvbiBpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVzdHJveVR5cGVFbGVtZW50cyhDbGFzcyBleHRlbnNpb25DbGFzcykgewotCQkvLyBGaW5kIHRoZSBUYXJnZXRUeXBlRWxlbWVudCB0aGF0IGNvbnRhaW5zIGFuIGV4dGVuc2lvbiB3aGljaCBjbGFzcyBpcwotCQkvLyBlcXVpdmFsZW50IHRvIHRoZSBhcmd1bWVudC4KLQkJTGlzdCB0eXBlTGlzdCA9IGdldFRhcmdldHNNYW5hZ2VyKCkuZ2V0VHlwZUVsZW1lbnRzKCk7Ci0JCWZvcihJdGVyYXRvciB0eXBlSXQgPSB0eXBlTGlzdC5pdGVyYXRvcigpOyB0eXBlSXQuaGFzTmV4dCgpOykgewotCQkJVGFyZ2V0VHlwZUVsZW1lbnQgdHlwZUVsZW1lbnQgPSAoVGFyZ2V0VHlwZUVsZW1lbnQpdHlwZUl0Lm5leHQoKTsKLQkJCWlmKHR5cGVFbGVtZW50LmdldEV4dGVuc2lvbigpLmdldENsYXNzKCkuZXF1YWxzKGV4dGVuc2lvbkNsYXNzKSkgewotCQkJCS8vIE5PVEU6IEF0IHRoaXMgcG9pbnQgdGhlIGNhbGxlZCBwbHVnaW4gc2hvdWxkIG5vdCBiZSBjbG9zZWQsIHNvCi0JCQkJLy8gaXRzIHNhZmUgdG8gcGxheSBhcm91bmQgd2l0aCBpdHMgdmFsdWVzLgotCQkJCQotCQkJCS8vIENhbGwgdGhlIGRlc3Ryb3kgbWV0aG9kIG9mIGFsbCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZQotCQkJCUxpc3QgZWxlbUxpc3QgPSB0eXBlRWxlbWVudC5nZXRFbGVtZW50cygpOwotCQkJCWZvcihJdGVyYXRvciBlbGVtSXQgPSBlbGVtTGlzdC5pdGVyYXRvcigpOyBlbGVtSXQuaGFzTmV4dCgpOykgewotCQkJCQlUYXJnZXRFbGVtZW50IGVsID0gKFRhcmdldEVsZW1lbnQpZWxlbUl0Lm5leHQoKTsJCQotCQkJCQl0cnkgeyAvLyBFcnJvcnMgY291bGQgaGFwcGVuIHdoZW4gZGlzYWJsaW5nIHRoZSBlbnZpcm9ubWVudC4gSnVzdCBpZ25vcmUuCi0JCQkJCQlJVGFyZ2V0Q29udHJvbCBjdGwgPSBlbC5nZXRDb250cm9sKCk7Ci0JCQkJCQljdGwuZGVzdHJveSgpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW52aXJvbm1lbnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQkKLQkJcmV0dXJuIElEOwotCX0KLQkKLQkvKgotCSAqIFVuaXF1ZSBJRCBnZW5lcmF0aW9uIGZvciBlbnZpcm9ubWVudCBpbnN0YW5jZXMKLQkgKiBUaGlzIElEIGlzIGdlbmVyYXRpb24gY29tZXMgZnJvbSB0aGUgc3lzdGVtJ3MgdGltZXN0YW1wLiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVudmlyb25tZW50VW5pcXVlSUQoKSB7Ci0JCWxvbmcgZW52SUQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGVudklEKTsKLQl9Ci0KLS8vCSBLZXkgdGhhdCBhZGRyZXNzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGdpdmVuIGVudmlyb25tZW50IGluc3RhbmNlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT1JFX0VOVklST05NRU5USUQgPSAiY29yZS1lbnZpcm9ubWVudGlkIjsKLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Q29udHJvbC5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiZjIxMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2w7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVDb25uZWN0aW9uOwotCi0KLS8qKgotICogQ29udHJvbHMgYW4gaW5zdGFuY2Ugb2YgYSB0YXJnZXQgY3JlYXRlZCBmcm9tIHRoZSBFbnZpcm9ubWVudC4KLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YSwgRGFuaWVsIEZlbGl4IEZlcmJlciwgUmljaGFyZCBNYWNpZWwKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFyZ2V0Q29udHJvbCB7Ci0JLyoqCi0JICogQ2FsbGVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgdGFyZ2V0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNyZWF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENhbGxlZCB0byBoYWx0IHRoZSBpbnN0YW5jZSBvZiB0aGUgdGFyZ2V0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGtpbGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCB0byByZW1vdmUgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0YW5jZSBvZiB0aGUgdGFyZ2V0Ci0JICogYmVjYXVzZSB0aGUgaXQgd2FzIHJlbW92ZWQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCXB1YmxpYyBpbnQgcXVlcnkoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiByZXN1bWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgYm9vbGVhbiBzdG9wKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYSBjYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgSVRhcmdldENvbnRyb2wgaW1wbGVtZW50aW5nIGNsYXNzCi0JICogbXVzdCB1cGRhdGUgaXRzIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBhbiBleHRlcm5hbCBjaGFuZ2Ugb2NjdXJyZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZVJlbW90ZUNvbW1hbmQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gYXJncykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleGVjdXRpb24gZnJhbWV3b3JrLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUmVtb3RlQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCk7Ci0JCi0JLyoqCi0JICogQWRkcyBhIG5ldyBqb2IgdG8gdGhlIHNldCBvZiBydW5uaW5nIGpvYnMgb24gdGhlIGVudmlyb25tZW50LgotCSAqIFRoZSBqb2Igd2lsbCBiZWdpbiBleGVjdXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciBiZWluZyBhZGRlZC4KLQkgKiBAcGFyYW0gam9iIFRoZSBqb2IgdG8gYmUgYWRkZWQgYW5kIGV4ZWN1dGVkLgotCSAqIEByZXR1cm4gVGhlIGpvYiBlbmNhcHN1bGF0ZWQgYXMgYSBJUmVtb3RlQ29udHJvbGxlZEpvYgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEpvYihJVGFyZ2V0Sm9iIGpvYikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGhvdyBtYW55IGpvYnMgYXJlIGJlaW5nIG1hbmFnZWQgYnkgdGhlIGNvbnRyb2wuIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Sm9iQ291bnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBqb2JzIHJ1bm5pbmcgcmVtb3RlbHkuCi0JICogQWxsIGpvYnMgYXJlIHJldHVybmVkLCByZWdhcmRsZXNzIGlmIFdBSVRJTkcgb3IgUlVOTklORy4KLQkgKiBGaW5pc2hlZCBqb2JzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiByZW1vdGUgam9icy4KLQkgKi8KLQlwdWJsaWMgSVRhcmdldEpvYiBbXSBnZXRKb2JzKCk7Ci0JCi0JcHVibGljIGNsYXNzIFRhcmdldFNvY2tldCB7Ci0JCXB1YmxpYyBTdHJpbmcgaG9zdDsKLQkJcHVibGljIGludCBwb3J0OwotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBicmlkZ2UgdG8gYSBsaXN0ZW5pbmcgc29ja2V0IG9uIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBUYXJnZXRTb2NrZXQgY3JlYXRlVGFyZ2V0U29ja2V0KGludCBwb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZCBhIG5ldyBqb2IgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSm9iTGlzdGVuZXIoSVRhcmdldENvbnRyb2xKb2JMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBqb2IgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSm9iTGlzdGVuZXIoSVRhcmdldENvbnRyb2xKb2JMaXN0ZW5lciBsaXN0ZW5lcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRDb250cm9sRXZlbnRMaXN0ZW5lci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRDb250cm9sRXZlbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2E3MWIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Q29udHJvbEV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdGFyZ2V0IGNvbnRyb2wgZXZlbnQgbGlzdGVuZXJzLiAKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBzdGF0ZSBjaGFuZ2UgZXZlbnQgaGFzIG9jY3VycmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgY29kZSBhcyBpbiB7QGxpbmsgSVRhcmdldFN0YXR1c30KLQkgKiBAcGFyYW0gZnJvbSB0aGUgb3JpZ2luYXRpbmcgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlRXZlbnQoaW50IGV2ZW50LCBJVGFyZ2V0Q29udHJvbCBmcm9tKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVlNDZmMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvbnRyb2wvSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbDsKLQotLyoqCi0gKiAKLSAqIEludGVyZmFjZSBkZWZpbml0aW9uIG9mIGV2ZW50IHByb3ZpZGVycyBmb3IgVGFyZ2V0IENvbnRyb2xzLgotICoge0BsaW5rIElUYXJnZXRDb250cm9sfSBpbnN0YW5jZXMgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB0aHJ1IHRoZQotICogSUFkYXB0YWJsZSBtZWNoYW5pc20uCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRDb250cm9sRXZlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBsaXN0ZW5lciB0byB0aGUgZXZlbnQgcHJvdmlkZXIsIGtleWVkIGJ5IGEgY29udHJvbCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbCBnZW5lcmF0aW5nIGV2ZW50cwotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgaW50ZXJlc3RlZCBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udHJvbEFuZExpc3RlbmVyKElUYXJnZXRDb250cm9sIGNvbnRyb2wsIElUYXJnZXRDb250cm9sRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYSBjb250cm9sLGxpc3RlbmVyIHR1cGxlIGZyb20gdGhpcyBldmVudCBwcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sIHRoZSBjb250cm9sIGdlbmVyYXRpbmcgZXZlbnRzCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBpbnRlcmVzdGVkIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlckNvbnRyb2xBbmRMaXN0ZW5lcihJVGFyZ2V0Q29udHJvbCBjb250cm9sLCBJVGFyZ2V0Q29udHJvbEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRDb250cm9sSm9iTGlzdGVuZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Q29udHJvbEpvYkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzMWEwMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRDb250cm9sSm9iTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRhcmdldENvbnRyb2xKb2JMaXN0ZW5lciB7Ci0JcHVibGljIHZvaWQgYmVmb3JlSm9iU3RhcnQoSVRhcmdldEpvYiBqb2IpOwotCXB1YmxpYyB2b2lkIGFmdGVySm9iRmluaXNoKElUYXJnZXRKb2Igam9iKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Sm9iLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvbnRyb2wvSVRhcmdldEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWZmYTFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9JVGFyZ2V0Sm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVFeGVjdXRpb25NYW5hZ2VyOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIGpvYiB0aGF0IHdpbGwgcnVuIG9uIGEgcmVtb3RlIGhvc3QuCi0gKiA8cD4KLSAqIEpvYiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VxdWVudGlhbCBvcGVyYXRpb25zIGV4ZWN1dGVkIHVzaW5nIHRoZSBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlcgotICogb24gdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLSAqIDxwPiAKLSAqIFRoZSBJVGFyZ2V0Sm9iIGJlIHJ1biBhcyBhIHRocmVhZCBpbnNpZGUgdGhlIEpvYiBDb250cm9sbGVyLgotICoKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRKb2IgewotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBqb2IuCi0JICogPHA+Ci0JICogVGhlIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIHRoYXQgaXMgY2FwYWJsZSBvZiBkb2luZyB0aGUgb3BlcmF0aW9ucwotCSAqIHdpbGwgYmUgcHJvdmlkZWQgYXV0b21hdGljYWxseS4KLQkgKi8KLQl2b2lkIHJ1bihJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKTsJCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvbnRyb2wvSVRhcmdldFN0YXR1cy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL0lUYXJnZXRTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFkYjFhZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvbnRyb2wvSVRhcmdldFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2w7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFyZ2V0U3RhdHVzIHsKLQkKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVEFSVEVEID0gMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVE9QUEVEID0gMTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBSRVNVTUVEID0gMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBQQVVTRUQgID0gMzsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9Qb29saW5nVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9Qb29saW5nVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ0ZTExYi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvbnRyb2wvUG9vbGluZ1RhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2w7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLklUYXJnZXRDb250cm9sRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIgaW50ZXJmYWNlLCBiYXNlZAotICogb24gYSBzaW1wbGUgcG9vbGluZyBhbGdvcml0aG0uCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIFBvb2xpbmdUYXJnZXRDb250cm9sRXZlbnRQcm92aWRlciAgaW1wbGVtZW50cwotCQlJVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIgewotCi0JcHVibGljIFRocmVhZCBtb25pdG9yVGhyZWFkID0gbnVsbDsKLQlwcml2YXRlIGludCBtb25pdG9ySW50ZXJ2YWwgPSA0MDAwOyAvLyBtaWxsaXNlY29uZHMKLQlwcml2YXRlIE1hcCBjb250cm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JY2xhc3MgTW9uaXRvclRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCQotCQlwdWJsaWMgTW9uaXRvclRocmVhZCgpIHsKLQkJCXN1cGVyKCJUYXJnZXQgQ29udHJvbCBwb2xsaW5nIik7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJd2hpbGUgKG1vbml0b3JUaHJlYWQgPT0gdGhpcykKLQkJCXsKLQkJCQlzeW5jaHJvbml6ZWQgKFBvb2xpbmdUYXJnZXRDb250cm9sRXZlbnRQcm92aWRlci50aGlzKSB7Ci0JCQkJCUl0ZXJhdG9yIGN0cmxzID0gY29udHJvbHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJCi0JCQkJCXdoaWxlKGN0cmxzLmhhc05leHQoKSkgewotCQkKLQkJCQkJCQlJVGFyZ2V0Q29udHJvbCBjb250cm9sID0gKElUYXJnZXRDb250cm9sKSBjdHJscy5uZXh0KCk7Ci0JCQkJCQkJaW50IGVudHJ5U3RhdHVzID0gY29udHJvbC5xdWVyeSgpOwotCQkJCQkJCVRhcmdldEluZm8gaW5mbyA9IChUYXJnZXRJbmZvKSBjb250cm9scy5nZXQoY29udHJvbCk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKGVudHJ5U3RhdHVzICE9IGluZm8uZ2V0U3RhdHVzKCkgKSB7Ci0JCQkJCQkJCWluZm8uc2V0U3RhdHVzKGVudHJ5U3RhdHVzKTsKLQkJCQkJCQkJY29udHJvbHMucHV0KGNvbnRyb2wsaW5mbyk7Ci0JCQkJCQkJCWZpcmVFdmVudChlbnRyeVN0YXR1cywgY29udHJvbCk7Ci0JCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJc2xlZXAgKG1vbml0b3JJbnRlcnZhbCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZUV2ZW50KGludCBzdGF0dXMsIElUYXJnZXRDb250cm9sIGNvbnRyb2wpIHsKLQkJCi0JCWlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbHMuY29udGFpbnNLZXkgKGNvbnRyb2wpKQotCQl7Ci0JCQlUYXJnZXRJbmZvIGluZm8gPSAoVGFyZ2V0SW5mbykgY29udHJvbHMuZ2V0KGNvbnRyb2wpOwotCQkJSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gaW5mby5nZXRMaXN0ZW5lcigpOwotCQkJbGlzdGVuZXIuaGFuZGxlU3RhdGVDaGFuZ2VFdmVudChzdGF0dXMsIGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVydyNyZWdpc3RlckNvbnRyb2xBbmRMaXN0ZW5lcigpCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJDb250cm9sQW5kTGlzdGVuZXIoSVRhcmdldENvbnRyb2wgY29udHJvbCwgSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQotCQlpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9scy5jb250YWluc0tleSAoY29udHJvbCkpCi0JCXsKLQkJCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkJY29udHJvbHMucHV0IChjb250cm9sLCBuZXcgVGFyZ2V0SW5mbyhsaXN0ZW5lcixJVGFyZ2V0U3RhdHVzLlNUT1BQRUQpKTsKLQkJCX0KLQkJCQotCQkJaWYgKG1vbml0b3JUaHJlYWQgPT0gbnVsbCkgewotCQkJCShtb25pdG9yVGhyZWFkID0gbmV3IE1vbml0b3JUaHJlYWQoKSkuc3RhcnQoKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXJ3I3VucmVnaXN0ZXJDb250cm9sQW5kTGlzdGVuZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250cm9sQW5kTGlzdGVuZXIoSVRhcmdldENvbnRyb2wgY29udHJvbCwgSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQotCQlpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2xzLmNvbnRhaW5zS2V5IChjb250cm9sKSkKLQkJewotCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQljb250cm9scy5yZW1vdmUgKGNvbnRyb2wpOwotCQkJfQotCQkJCi0JCQlpZiAoY29udHJvbHMuc2l6ZSgpID09IDApCi0JCQkJbW9uaXRvclRocmVhZCA9IG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCWNsYXNzIFRhcmdldEluZm8gewotCQkKLQkJcHJpdmF0ZSBpbnQgc3RhdHVzOwotCQlwcml2YXRlIElUYXJnZXRDb250cm9sRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJCi0JCXB1YmxpYyBUYXJnZXRJbmZvKElUYXJnZXRDb250cm9sRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgaW50IHN0YXR1cykgewotCQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCX0KLQotCQlwdWJsaWMgSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyIGdldExpc3RlbmVyKCkgewotCQkJcmV0dXJuIGxpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgewotCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCX0KLQkJCi0JfQotCQkKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL1NTSFRhcmdldENvbnRyb2wuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9TU0hUYXJnZXRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmYTllMGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb250cm9sL1NTSFRhcmdldENvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5SZW1vdGV0b29sc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5BdXRoVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuS2V5QXV0aFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLlBhc3N3ZEF1dGhUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JUmVtb3RlSm9iQ29udHJvbGxlcjwvY29kZT4uCi0gKiBQcmVzdW1lcyBhIHRhcmdldCBlbnZpcm9ubWVudCB0aGF0IGFjY2VwdHMgU1NIIGNvbm5lY3Rpb25zLgotICogCi0gKiBAc2VlIElUYXJnZXRKb2JDb250cm9sbGVyCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNTSFRhcmdldENvbnRyb2wgaW1wbGVtZW50cyBJVGFyZ2V0Q29udHJvbCB7Ci0KLQkvKioKLQkgKiBTZXQgb2Ygam9icyBydW5uaW5nIG9uIHRoZSByZW1vdGUgdGFyZ2V0IGVudmlyb25tZW50LgotCSAqLwotCXByaXZhdGUgTWFwIHJlbW90ZUpvYnM7Ci0KLQkvKioKLQkgKiBBIGNvbm5lY3Rpb24gKHVzaW5nIHNzaCkgdG8gdGhlIHJlbW90ZSB0YXJnZXQgZW52aXJvbm1lbnQuCi0JICovCi0JcHJpdmF0ZSBJUmVtb3RlQ29ubmVjdGlvbiByZW1vdGVDb25uZWN0aW9uOwotCQotCS8qKgotCSAqIExpc3RlbmVycyBub3RpZmllZCB3aGVuIGpvYnMgYXJlZCBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLQkgKi8KLQlwcml2YXRlIFNldCBqb2JMaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotCQotCS8qKgotCSAqIEV4Y2VwdGlvbiB0byB0ZXJtaW5hdGUgdGhlIGVudmlyb25tZW50LgotCSAqLwotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBwZW5kaW5nRXhjZXB0aW9uID1udWxsOwotCQotCS8qKgotCSAqIFJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgY2lwaGVyIHR5cGVzIGlkcyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBuYW1lcwotCSAqIEByZXR1cm4gYSBNYXAgb2JqZWN0IGNvbnRhaW5pbmcgY2lwaGVyIHR5cGUgaWRzIGFuZCBjaXBoZXIgdHlwZSBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldENpcGhlclR5cGVzTWFwKCkgewotCQkvLyBUaGlzIG1ldGhvZCBkZWNvdXBsZXMgdGhlIG1hcCBmcm9tIHRoZSBSZW1vdGV0b29sc1BsdWdpbgotCQkvLyBzbyBpdHMgc2FmZSB0byB1c2UgaXQgb24gdGhlIGludGVyZmFjZSBvZiBlYWNoIGVudmlyb25tZW50Ci0JCS8vIHRoYXQgdXNlcyB0aGlzIHBsdWdpbi4KLQkJCi0JCUhhc2hNYXAgY2lwaGVyVHlwZXNNYXAgPSBuZXcgSGFzaE1hcChSZW1vdGV0b29sc1BsdWdpbi5nZXRDaXBoZXJUeXBlc01hcCgpKTsKLQkJCi0JCXJldHVybiBjaXBoZXJUeXBlc01hcDsKLQl9Ci0JCi0JLyoqCi0JICogQSBzZXQgb2YgcGFyYW1ldGVycyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiB3aXRoIFNTSC4KLQkgKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLQkgKiBAc2luY2UgMS4yCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNTSFBhcmFtZXRlcnMgewotCQlwdWJsaWMgU3RyaW5nIGhvc3RuYW1lOwotCQlwdWJsaWMgaW50IHBvcnQ7Ci0JCXB1YmxpYyBTdHJpbmcgdXNlcjsKLQkJcHVibGljIFN0cmluZyBwYXNzd29yZDsKLQkJcHVibGljIFN0cmluZyBrZXlQYXRoOwotCQlwdWJsaWMgU3RyaW5nIHBhc3NwaHJhc2U7Ci0JCXB1YmxpYyBib29sZWFuIGlzUGFzc3dkQXV0aDsKLQkJcHVibGljIFN0cmluZyBjaXBoZXJUeXBlOwotCQlwdWJsaWMgaW50IHRpbWVvdXQgPSAwOwotCQkKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yIGZvciBwYXNzd29yZCBiYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgYXNzdW1pbmcgdGltZW91dCA9IDAKLQkJICogCi0JCSAqIEBwYXJhbSBob3N0bmFtZQotCQkgKiBAcGFyYW0gcG9ydAotCQkgKiBAcGFyYW0gdXNlcgotCQkgKiBAcGFyYW0gcGFzc3dvcmQKLQkJICovCi0JCXB1YmxpYyBTU0hQYXJhbWV0ZXJzKFN0cmluZyBob3N0bmFtZSwgaW50IHBvcnQsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpIHsKLQkJCXRoaXMoaG9zdG5hbWUsIHBvcnQsIHVzZXIsIHBhc3N3b3JkLCBSZW1vdGV0b29sc1BsdWdpbi5DSVBIRVJfREVGQVVMVCwgMCk7Ci0JCQkvKnN1cGVyKCk7Ci0JCQl0aGlzLmhvc3RuYW1lID0gaG9zdG5hbWU7Ci0JCQl0aGlzLnBvcnQgPSBwb3J0OyAKLQkJCXRoaXMudXNlciA9IHVzZXI7Ci0JCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ki8KLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBmb3IgcGFzc3dvcmQgYmFzZWQgYXV0aGVudGljYXRpb24KLQkJICogCi0JCSAqIEBwYXJhbSBob3N0bmFtZQotCQkgKiBAcGFyYW0gcG9ydAotCQkgKiBAcGFyYW0gdXNlcgotCQkgKiBAcGFyYW0gcGFzc3dvcmQKLQkJICogQHBhcmFtIGNpcGhlclR5cGUgQ2hvb3NlIGFtb25nIHRoZSBzdXBwb3J0ZWQgY2lwaGVycwotCQkgKiBAcGFyYW0gdGltZW91dAotCQkgKi8KLQkJcHVibGljIFNTSFBhcmFtZXRlcnMoU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGNpcGhlclR5cGUsIGludCB0aW1lb3V0KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ob3N0bmFtZSA9IGhvc3RuYW1lOwotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCXRoaXMudXNlciA9IHVzZXI7Ci0JCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0JCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQkJdGhpcy5jaXBoZXJUeXBlID0gY2lwaGVyVHlwZTsKLQkJCWlzUGFzc3dkQXV0aCA9IHRydWU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBmb3IgcHVibGljL3ByaXZhdGUga2V5IGJhc2VkIGF1dGhlbnRpY2F0aW9uCi0JCSAqIAotCQkgKiBAcGFyYW0gaG9zdG5hbWUKLQkJICogQHBhcmFtIHBvcnQKLQkJICogQHBhcmFtIHVzZXIKLQkJICogQHBhcmFtIHBhc3N3b3JkCi0JCSAqIEBwYXJhbSBjaXBoZXJUeXBlIENob29zZSBhbW9uZyB0aGUgc3VwcG9ydGVkIGNpcGhlcnMKLQkJICogQHBhcmFtIHRpbWVvdXQKLQkJICovCi0JCXB1YmxpYyBTU0hQYXJhbWV0ZXJzKFN0cmluZyBob3N0bmFtZSwgaW50IHBvcnQsIFN0cmluZyB1c2VyLCBTdHJpbmcga2V5UGF0aCwgU3RyaW5nIHBhc3NwaHJhc2UsIAotCQkJCVN0cmluZyBjaXBoZXJUeXBlLCBpbnQgdGltZW91dCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaG9zdG5hbWUgPSBob3N0bmFtZTsKLQkJCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCQl0aGlzLnVzZXIgPSB1c2VyOwotCQkJdGhpcy5rZXlQYXRoID0ga2V5UGF0aDsKLQkJCXRoaXMucGFzc3BocmFzZSA9IHBhc3NwaHJhc2U7Ci0JCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQkJdGhpcy5jaXBoZXJUeXBlID0gY2lwaGVyVHlwZTsKLQkJCWlzUGFzc3dkQXV0aCA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ29uc3RydWN0b3IgZm9yIHB1YmxpYy9wcml2YXRlIGtleSBiYXNlZCBhdXRoZW50aWNhdGlvbiBhc3N1bWluZyB0aW1lb3V0ID0gMAotCQkgKiAKLQkJICogQHBhcmFtIGhvc3RuYW1lCi0JCSAqIEBwYXJhbSBwb3J0Ci0JCSAqIEBwYXJhbSB1c2VyCi0JCSAqIEBwYXJhbSBwYXNzd29yZAotCQkgKi8KLQkJcHVibGljIFNTSFBhcmFtZXRlcnMoU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCwgU3RyaW5nIHVzZXIsIFN0cmluZyBrZXlQYXRoLCBTdHJpbmcgcGFzc3BocmFzZSkgewotCQkJdGhpcyhob3N0bmFtZSwgcG9ydCwgdXNlciwga2V5UGF0aCwgcGFzc3BocmFzZSwgUmVtb3RldG9vbHNQbHVnaW4uQ0lQSEVSX0RFRkFVTFQsIDApOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSB0YXJnZXQgZW52aXJvbm1lbnQuCi0JICovCi0JU1NIUGFyYW1ldGVycyBzc2hQYXJhbWV0ZXJzOwotCQotCS8qKgotCSAqIEZhY2lsaXR5IG1ldGhvZCB0aGF0IHJhaXNlcyBhIFNpbXVsYXRvckV4Y2VwdGlvbiB3aXRoIHRoZSBsYXN0IGVycm9yIGRldGVjdGVkIGZyb20gYW5kIG9ic2VydmluZyB0aHJlYWQuCi0JICogQHRocm93cyBTaW11bGF0b3JFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgdGhyb3dQZW5kaW5nRXhjZXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocGVuZGluZ0V4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBwZW5kaW5nRXhjZXB0aW9uOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXBlbmRpbmdFeGNlcHRpb24gPSBlOwotCX0KLQotCQotCS8qKgotCSAqIEFkZCBhIG5ldyBqb2IgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEpvYkxpc3RlbmVyKElUYXJnZXRDb250cm9sSm9iTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJam9iTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIGpvYiBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSm9iTGlzdGVuZXIoSVRhcmdldENvbnRyb2xKb2JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlqb2JMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB3YWl0aW5nIGpvYiBvbiB0aGUgCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0Sm9iKElUYXJnZXRKb2Igam9iKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgocXVlcnkoKSAhPSBJVGFyZ2V0U3RhdHVzLlBBVVNFRCkgJiYocXVlcnkoKSAhPSBJVGFyZ2V0U3RhdHVzLlJFU1VNRUQpKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIDAsICJUYXJnZXQgbm90IHJlYWR5IHRvIGV4ZWN1dGUgam9icyIsIG51bGwpKTsKLQkJfQotCQlUYXJnZXRDb250cm9sbGVkSm9iIGNvbnRyb2xsZWRKb2IgPSBuZXcgVGFyZ2V0Q29udHJvbGxlZEpvYih0aGlzLCBqb2IpOwotCQlyZW1vdGVKb2JzLnB1dChqb2IsIGNvbnRyb2xsZWRKb2IpOwotCQljb250cm9sbGVkSm9iLnN0YXJ0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeVN0YXJ0aW5nSm9iKElUYXJnZXRKb2Igam9iKSB7Ci0JCS8qKiBOb3RpZnkgbGlzdGVuZXJzLiAqLwotCQlmb3IgKEl0ZXJhdG9yIGxpc3RlbmVySXRlcmF0b3IgPSBqb2JMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgbGlzdGVuZXJJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJVGFyZ2V0Q29udHJvbEpvYkxpc3RlbmVyIGxpc3RlbmVyID0gKElUYXJnZXRDb250cm9sSm9iTGlzdGVuZXIpIGxpc3RlbmVySXRlcmF0b3IubmV4dCgpOwotCQkJbGlzdGVuZXIuYmVmb3JlSm9iU3RhcnQoam9iKTsKLQkJfQotCQkvKiogR3VhcmFudGVlIHRoYXQgdGhlIHRhcmdldCBpcyBvcGVyYXRpb25hbC4gKi8KLQkJdHJ5IHsKLQkJCXJlc3VtZShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlGaW5pc2hlZEpvYihJVGFyZ2V0Sm9iIGpvYikgewotCQkvKiogTm90aWZ5IGxpc3RlbmVycy4gKi8KLQkJZm9yIChJdGVyYXRvciBsaXN0ZW5lckl0ZXJhdG9yID0gam9iTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGxpc3RlbmVySXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSVRhcmdldENvbnRyb2xKb2JMaXN0ZW5lciBsaXN0ZW5lciA9IChJVGFyZ2V0Q29udHJvbEpvYkxpc3RlbmVyKSBsaXN0ZW5lckl0ZXJhdG9yLm5leHQoKTsKLQkJCWxpc3RlbmVyLmFmdGVySm9iRmluaXNoKGpvYik7Ci0JCX0KLQkJLyoqIFJlbW92ZSBqb2IgZnJvbSBsaXN0IG9mIGpvYnMuICovCi0JCWlmIChyZW1vdGVKb2JzID09IG51bGwpIHsKLQkJCS8qIFRoZSBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSBwZW5kaW5nIGpvYnMgdGhhdCB3ZXJlIGNhbmNlbGVkIHdoaWxlIGRpc2Nvbm5lY3RpbmcuICovCi0JCQlyZXR1cm47Ci0JCX0KLQkJcmVtb3RlSm9icy5yZW1vdmUoam9iKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBqb2JzIHJ1bm5pbmcgb24gdGhlIHJlbW90ZSBob3N0LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEpvYkNvdW50KCkgewotCQlyZXR1cm4gcmVtb3RlSm9icy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygam9icyBydW5uaW5nIG9uIHRoZSByZW1vdGUgdGFyZ2V0IGVudmlyb25tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVRhcmdldEpvYltdIGdldEpvYnMoKSB7Ci0JCUlUYXJnZXRKb2JbXSBhcnJheSA9IG5ldyBJVGFyZ2V0Sm9iW3JlbW90ZUpvYnMuc2l6ZSgpXTsKLQkJcmVtb3RlSm9icy5rZXlTZXQoKS50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyB0byBiZSB1c2VkIGJ5IHtAbGluayAjY3JlYXRlKElQcm9ncmVzc01vbml0b3IpfS4KLQkgKiBAcGFyYW0gcGFyYW1ldGVycwotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb25uZWN0aW9uUGFyYW1ldGVycyhTU0hQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKLQkJdGhpcy5zc2hQYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlbW90ZSB0YXJnZXQgZW52aXJvbm1lbnQgYnkgb3BlbmluZyBhIFNTSCBjb25uZWN0aW9uIHRvIGl0LgotCSAqIEZpcnN0LCB7QGxpbmsgI3NldENvbm5lY3Rpb25QYXJhbWV0ZXJzKG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLlNTSFRhcmdldENvbnRyb2wuU1NIUGFyYW1ldGVycykKLQkgKiBtdXN0IGJlIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoc3NoUGFyYW1ldGVycywgIm1pc3Npbmcgc3NoIHBhcmFtZXRlcnMiKTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWRpc2Nvbm5lY3QoKTsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCAwLCAiQ29ubmVjdGlvbiB0byB0YXJnZXQgY2FuY2VsZWQiLCBudWxsKSk7Ci0JCQkJfQotCQkJCWNvbm5lY3QoKTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJZGlzY29ubmVjdCgpOwotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIDAsICJDb25uZWN0aW9uIHRvIHRhcmdldCBjYW5jZWxlZCIsIG51bGwpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soIkZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkvKgotCQkJCSAqIElnbm9yZSBmYWlsdXJlLCB1bmZvcnR1bmF0ZWx5LCBpdCBpcyBub3QgcG9zc2libGUgdG8ga25vdyB0aGUgcmVhc29uLgotCQkJCSAqLwotCQkJCWRpc2Nvbm5lY3QoKTsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzY29ubmVjdCgpOwotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIGdldFBsdWdpbklkKCksIDAsICJDb25uZWN0aW9uIHRvIHRhcmdldCBjYW5jZWxlZCIsIG51bGwpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgU1NIIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSB0YXJnZXQgZW52aXJvbm1lbnQuCi0JICogRmlyc3QsIHtAbGluayAjc2V0Q29ubmVjdGlvblBhcmFtZXRlcnMob3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuU1NIVGFyZ2V0Q29udHJvbC5TU0hQYXJhbWV0ZXJzKX0KLQkgKiBtdXN0IGJlIGNhbGxlZC4KLQkgKiBAdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY29ubmVjdCgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzc2hQYXJhbWV0ZXJzLCAibWlzc2luZyBzc2ggcGFyYW1ldGVycyIpOwotCQkvKgotCQkgKiBUcnkgdG8gY29ubmVjdCwgZWxzZSB1bmRvIHRoZSBjb25uZWN0aW9uLgotCQkgKi8KLQkJQXV0aFRva2VuIGF1dGhUb2tlbjsKLQkJaWYoc3NoUGFyYW1ldGVycy5pc1Bhc3N3ZEF1dGgpIHsKLQkJCWF1dGhUb2tlbiA9IG5ldyBQYXNzd2RBdXRoVG9rZW4oc3NoUGFyYW1ldGVycy51c2VyLCBzc2hQYXJhbWV0ZXJzLnBhc3N3b3JkKTsKLQkJfSBlbHNlIHsKLQkJCWF1dGhUb2tlbiA9IG5ldyBLZXlBdXRoVG9rZW4oc3NoUGFyYW1ldGVycy51c2VyLCBuZXcgRmlsZShzc2hQYXJhbWV0ZXJzLmtleVBhdGgpLAotCQkJCQkJCQkJCXNzaFBhcmFtZXRlcnMucGFzc3BocmFzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAoc3NoUGFyYW1ldGVycy50aW1lb3V0IDw9IDApIHsKLQkJCQlyZW1vdGVDb25uZWN0aW9uID0gUmVtb3RldG9vbHNQbHVnaW4uY3JlYXRlU1NIQ29ubmVjdGlvbihhdXRoVG9rZW4sIHNzaFBhcmFtZXRlcnMuaG9zdG5hbWUsIHNzaFBhcmFtZXRlcnMucG9ydCwgCi0JCQkJCQlzc2hQYXJhbWV0ZXJzLmNpcGhlclR5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdGVDb25uZWN0aW9uID0gUmVtb3RldG9vbHNQbHVnaW4uY3JlYXRlU1NIQ29ubmVjdGlvbihhdXRoVG9rZW4sIHNzaFBhcmFtZXRlcnMuaG9zdG5hbWUsIHNzaFBhcmFtZXRlcnMucG9ydCwgCi0JCQkJCQlzc2hQYXJhbWV0ZXJzLmNpcGhlclR5cGUsIHNzaFBhcmFtZXRlcnMudGltZW91dCk7Ci0JCQl9Ci0JCQlyZW1vdGVDb25uZWN0aW9uLmNvbm5lY3QoKTsKLQkJCXJlbW90ZUpvYnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWRpc2Nvbm5lY3QoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgdmFsdWUgb2YgdGhlIGNpcGhlciBmcm9tIHRoZSBTU0hQYXJhbWV0ZXIgdG8gdGhlIHZhbHVlIHVzZWQgaW4gdGhlIFJlbW90ZVRvb2xzCi0JICogCi0JICogQHBhcmFtIENvbnN0YW50IHZhbHVlIHVzZWQgYnkgU1NIUGFyYW1ldGVycwotCSAqIEByZXR1cm4gQ29uc3RhbnQgdmFsdWUgdXNlZCBieSBSZW1vdGVUb29scwotCSAqLwotCS8qcHVibGljIFN0cmluZyBjb252ZXJ0Q2lwaGVyQ29uc3RhbnQoU3RyaW5nIHNzaFBhcmFtQ2lwaGVyVHlwZSkgewotCQlzd2l0Y2goc3NoUGFyYW1DaXBoZXJUeXBlKSB7Ci0JCWNhc2UgU1NIUGFyYW1ldGVycy5DSVBIRVJfM0RFUzoKLQkJCXJldHVybiBSZW1vdGV0b29sc1BsdWdpbi5DaXBoZXJUeXBlcy5DSVBIRVJfM0RFUzsKLQkJY2FzZSBTU0hQYXJhbWV0ZXJzLkNJUEhFUl9BRVMxMjg6Ci0JCQlyZXR1cm4gQ2lwaGVyVHlwZXMuQ0lQSEVSX0FFUzEyODsKLQkJY2FzZSBTU0hQYXJhbWV0ZXJzLkNJUEhFUl9BRVMxOTI6Ci0JCQlyZXR1cm4gQ2lwaGVyVHlwZXMuQ0lQSEVSX0FFUzE5MjsKLQkJY2FzZSBTU0hQYXJhbWV0ZXJzLkNJUEhFUl9BRVMyNTY6Ci0JCQlyZXR1cm4gQ2lwaGVyVHlwZXMuQ0lQSEVSX0FFUzI1NjsKLQkJY2FzZSBTU0hQYXJhbWV0ZXJzLkNJUEhFUl9CTE9XRklTSDoKLQkJCXJldHVybiBDaXBoZXJUeXBlcy5DSVBIRVJfQkxPV0ZJU0g7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gQ2lwaGVyVHlwZXMuQ0lQSEVSX0RFRkFVTFQ7Ci0JCX0KLQl9Ki8KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbiBJRC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0ICBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLQotCS8qKgotCSAqIERlc3Ryb3kgdGhlIHJlbW90ZSB0YXJnZXQgZW52aXJvbm1lbnQsIGJ5IGNsb3NpbmcgdGhlIFNTSCBjb25uZWN0aW9uIHRvIGl0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGtpbGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIFRyeSB0byBncmFjZWZ1bGx5IHRlcm1pbmF0ZSBhbGwgcnVubmluZyBqb2JzLiBNaWdodCB0aGlzIGZhaWwsIHRoZW4gZ3VhcmFudGVlIHRvIGRpc2Nvbm5lY3QuCi0JCSAqLwotCQl0cnkgewotCQkJdGVybWluYXRlSm9icyhtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWRpc2Nvbm5lY3QoKTsKLQkJfQotCQlyZW1vdGVDb25uZWN0aW9uID0gbnVsbDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZVJlbW90ZUNvbW1hbmQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gYXJncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWNvbW1hbmQgKz0gKCIgIiArIGFyZ3NbaV0pOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGV4ZWN1dGlvbk1hbmFnZXIgPSByZW1vdGVDb25uZWN0aW9uLmNyZWF0ZVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIoKTsKLQkJCWV4ZWN1dGlvbk1hbmFnZXIuZ2V0RXhlY3V0aW9uVG9vbHMoKS5leGVjdXRlV2l0aEV4aXRWYWx1ZShjb21tYW5kKTsKLQkJCWV4ZWN1dGlvbk1hbmFnZXIuY2xvc2UoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgMCwKLQkJCQkJIkZhaWxlZCB0byBjb25uZWN0IHdpdGggcmVtb3RlIHRhcmdldCBlbnZpcm9ubWVudCIsIGUpKTsKLQkJfSBjYXRjaCAoQ2FuY2VsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgMCwKLQkJCQkJIkNhbmNlbGxlZCBleGVjdXRpb24gb24gcmVtb3RlIHRhcmdldCBlbnZpcm9ubWVudCIsIGUpKTsKLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgMCwKLQkJCQkJIkZhaWxlZCB0byBleGVjdXRlIG9uIHJlbW90ZSB0YXJnZXQgZW52aXJvbm1lbnQiLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5mb3JtcyBob3cgdG8gY29ubmVjdCB0byBhIHNvY2tldCB0aGF0IGlzIGJlaW5nIGxpc3RlbmVkIG9uIHRoZSByZW1vdGUgCi0JICogdGFyZ2V0IGVudmlyb25tZW50LiBJZiBuZWNlc3NhcnksIGNyZWF0ZSBhIHR1bm5lbCB0aGF0IGZvcndhcmRzIHRoZSByZW1vdGUKLQkgKiBwb3J0LgotCSAqIEByZXR1cm4gQSB7QGxpbmsgVGFyZ2V0U29ja2V0fSBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24KLQkgKiB3aGVyZSB0byBjb25uZWN0IGluIG9yZGVyIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSB0dW5uZWwuCi0JICovCi0JcHVibGljIFRhcmdldFNvY2tldCBjcmVhdGVUYXJnZXRTb2NrZXQoaW50IHBvcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogRHVtbXkgaW1wbGVtZW50YXRpb24gdGhhdCBhc3N1bWVzIHRoYXQgdGhlIHJlbW90ZSBwb3J0IGlzIG1hcHBlZAotCQkgKiB0byB0aGUgc2FtZSBsb2NhbCBwb3J0LiAKLQkJICovCi0JCVRhcmdldFNvY2tldCB0ZXN0ID0gbmV3IFRhcmdldFNvY2tldCgpOwotCQl0ZXN0Lmhvc3QgPSAibG9jYWxob3N0IjsKLQkJdGVzdC5wb3J0ID0gcG9ydDsKLQkJcmV0dXJuIHRlc3Q7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgdGFyZ2V0IGVudmlyb25tZW50IGlzIGFsaXZlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIChyZW1vdGVDb25uZWN0aW9uICE9IG51bGwpICYmIChyZW1vdGVDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpOwotCX0KLQkKLS8vCXB1YmxpYyBJUmVtb3RlQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotLy8JCXJldHVybiByZW1vdGVDb25uZWN0aW9uOwotLy8JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHRlcm1pbmF0ZUpvYnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8qCi0JCSAqIElzc3VlIGVhY2ggam9iIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5LgotCQkgKi8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZW1vdGVKb2JzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlUYXJnZXRKb2Igam9iID0gKElUYXJnZXRKb2IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVRhcmdldENvbnRyb2xsZWRKb2IgY29udHJvbGxlZEpvYiA9IChUYXJnZXRDb250cm9sbGVkSm9iKSByZW1vdGVKb2JzLmdldChqb2IpOwotCQkJY29udHJvbGxlZEpvYi5jYW5jZWxFeGVjdXRpb24oKTsKLQkJfQotCQkKLQkJLyoKLQkJICogV2FpdCB1bnRpbCBhbGwgam9icyBoYXZlIHRlcm1pbmF0ZWQuCi0JCSAqLwotCQl3aGlsZSAoZ2V0Sm9iQ291bnQoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJd2FpdCg1MDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGhvc3QgaXMgY2xvc2VkIGFuZCByZWxlYXNlcwotCSAqIHJlc3NvdXJjZXMgYWxsb2NhdGVkIHRvIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgewotCQkvKgotCQkgKiBBbnkgc3RpbGwgcnVubmluZyBqb2JzIHdpbGwgZmFpbC4KLQkJICovCi0JCWlmIChyZW1vdGVKb2JzICE9IG51bGwpIHsKLQkJCXJlbW90ZUpvYnMuY2xlYXIoKTsKLQkJCXJlbW90ZUpvYnMgPSBudWxsOwotCQl9Ci0JCWlmIChyZW1vdGVDb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCXJlbW90ZUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOwotCQkJcmVtb3RlQ29ubmVjdGlvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZW1vdGUgZXhlY3V0aW9uIG1hbmFnZXIgdGhhdCBtYXkgYmUgdXNlZCB0byBkbyBvcGVyYXRpb25zIG9uIHRoZSByZW1vdGUgdGFyZ2V0Ci0JICogZW52aXJvbm1lbnQuCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBjcmVhdGVSZW1vdGVFeGVjdXRpb25NYW5hZ2VyKCkgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcmVtb3RlQ29ubmVjdGlvbi5jcmVhdGVSZW1vdGVFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JfQotCQotCXB1YmxpYyBJUmVtb3RlQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAidGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gcmVtb3RlQ29ubmVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9UYXJnZXRDb250cm9sbGVkSm9iLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvbnRyb2wvVGFyZ2V0Q29udHJvbGxlZEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWY2OTQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29udHJvbC9UYXJnZXRDb250cm9sbGVkSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LkVudmlyb25tZW50UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklUYXJnZXRDb250cm9sbGVkSm9iPC9jb2RlPi4KLSAqIEBzZWUgSVRhcmdldENvbnRyb2xsZWRKb2IKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMgotICovCi1jbGFzcyBUYXJnZXRDb250cm9sbGVkSm9iIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkcgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTklTSEVEID0gMjsKLQkKLQlKb2JSdW5uZXIgam9iUnVubmVyOwotCUlSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGV4ZWN1dGlvbk1hbmFnZXI7Ci0JSVRhcmdldEpvYiBqb2I7Ci0JU1NIVGFyZ2V0Q29udHJvbCB0YXJnZXRDb250cm9sOwotCWludCBzdGF0dXMgPSBVTkRFRklORUQ7Ci0JCi0JcHVibGljIFRhcmdldENvbnRyb2xsZWRKb2IoU1NIVGFyZ2V0Q29udHJvbCBjb250cm9sbGVyLCBJVGFyZ2V0Sm9iIGpvYikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQl0aGlzLnRhcmdldENvbnRyb2wgPSBjb250cm9sbGVyOwotCQl0aGlzLmpvYiA9IGpvYjsKLQkJdHJ5IHsKLQkJCXRoaXMuZXhlY3V0aW9uTWFuYWdlciA9IGNvbnRyb2xsZXIuY3JlYXRlUmVtb3RlRXhlY3V0aW9uTWFuYWdlcigpOwotCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUNvcmVFeGNlcHRpb24gY2UgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUVudmlyb25tZW50UGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgMCwgZQotCQkJCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpKTsKLQkJCXRocm93IGNlOwotCQl9Ci0JCXRoaXMuam9iUnVubmVyID0gbmV3IEpvYlJ1bm5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydCgpIHsKLQkJam9iUnVubmVyLnN0YXJ0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBKb2JSdW5uZXIgZXh0ZW5kcyBUaHJlYWQgewotCQlwcml2YXRlIFRhcmdldENvbnRyb2xsZWRKb2IgY29udHJvbGxlcjsKLQkJCi0JCXByb3RlY3RlZCBKb2JSdW5uZXIoVGFyZ2V0Q29udHJvbGxlZEpvYiBjb250cm9sbGVyKSB7Ci0JCQl0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbnRyb2xsZXIudGFyZ2V0Q29udHJvbC5ub3RpZnlTdGFydGluZ0pvYihqb2IpOwotCQkJc3luY2hyb25pemVkIChjb250cm9sbGVyKSB7Ci0JCQkJY29udHJvbGxlci5zdGF0dXMgPSBSVU5OSU5HOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlqb2IucnVuKGNvbnRyb2xsZXIuZXhlY3V0aW9uTWFuYWdlcik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAoY29udHJvbGxlcikgewotCQkJCQljb250cm9sbGVyLnN0YXR1cyA9IEZJTklTSEVEOwotCQkJCQljb250cm9sbGVyLmV4ZWN1dGlvbk1hbmFnZXIuY2xvc2UoKTsKLQkJCQkJY29udHJvbGxlci50YXJnZXRDb250cm9sLm5vdGlmeUZpbmlzaGVkSm9iKGpvYik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIElUYXJnZXRKb2IgZ2V0Sm9iKCkgewotCQlyZXR1cm4gam9iOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotCQlyZXR1cm4gc3RhdHVzID09IEZJTklTSEVEOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsRXhlY3V0aW9uKCkgewotCQlpZiAoc3RhdHVzICE9IEZJTklTSEVEKSB7Ci0JCQlleGVjdXRpb25NYW5hZ2VyLmNhbmNlbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL0NoaWxkcmVuUHJvdmlkZXJNYW5hZ2VyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvQ2hpbGRyZW5Qcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhZmY0Zi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvQ2hpbGRyZW5Qcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmV4dGVuc2lvbi5JQ2hpbGRyZW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlLmV4dGVuc2lvbnBvaW50cy5JUHJvY2Vzc01lbWJlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuZXh0ZW5zaW9ucG9pbnRzLlByb2Nlc3NFeHRlbnNpb25zOwotCi0vKioKLSAqIE1hbmFnZSBhIGxpc3Qgb2YgPGNvZGU+SUNoaWxkcmVuUHJvdmlkZXI8L2NvZGU+IGNvbnRyaWJ1dGVkIGJ5IGV4dGVuc2lvbnMKLSAqIAotICogQGF1dGhvciBIb25nIENoYW5nIExpbgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGlsZHJlblByb3ZpZGVyTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUX1BST1ZJREVSX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLmNoaWxkcmVuUHJvdmlkZXIiOwotCi0gICAgcHJpdmF0ZSBMaXN0PElDaGlsZHJlblByb3ZpZGVyPiBwcm92aWRlcnM7Ci0KLSAgICBwdWJsaWMgQ2hpbGRyZW5Qcm92aWRlck1hbmFnZXIoKSB7Ci0gICAgICAgIHByb2Nlc3NDaGlsZHJlblByb3ZpZGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTm9kZVtdIGdldENoaWxkcmVuKElUYXJnZXRFbGVtZW50IHRhcmdldEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdDxJTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PElOb2RlPigpOwotICAgICAgICBmb3IgKElDaGlsZHJlblByb3ZpZGVyIHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7Ci0gICAgICAgICAgICBJTm9kZVtdIG9ianMgPSBwcm92aWRlci5nZXRDaGlsZHJlbih0YXJnZXRFbGVtZW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChvYmpzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGlsZHJlbi50b0FycmF5KG5ldyBJTm9kZVswXSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2hpbGRyZW5Qcm92aWRlcnMoKSB7Ci0gICAgICAgIHByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SUNoaWxkcmVuUHJvdmlkZXI+KCk7Ci0gICAgICAgIFByb2Nlc3NFeHRlbnNpb25zLnByb2Nlc3MoRVhUX1BST1ZJREVSX0lELCBuZXcgSVByb2Nlc3NNZW1iZXJWaXNpdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHByb2Nlc3MoSUV4dGVuc2lvbiBleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBtZW1iZXIpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbXByb3ZpZGVyOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgbXByb3ZpZGVyID0gbWVtYmVyLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaWYgKElDaGlsZHJlblByb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obXByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMuYWRkKChJQ2hpbGRyZW5Qcm92aWRlcikgbXByb3ZpZGVyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wcm92aWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1wcm92aWRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvSVRhcmdldEVsZW1lbnQuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9JVGFyZ2V0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmVmNDFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9JVGFyZ2V0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRFbGVtZW50IHsKLQotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0QXR0cmlidXRlcygpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXR0cmlidXRlcyhNYXAgYXR0cmlidXRlcyk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIGFic3RyYWN0IElUYXJnZXRDb250cm9sIGdldENvbnRyb2woKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBhYnN0cmFjdCBUYXJnZXRUeXBlRWxlbWVudCBnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0YXR1cygpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL0lUYXJnZXRFbGVtZW50U3RhdHVzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvSVRhcmdldEVsZW1lbnRTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYyYWUxYi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvSVRhcmdldEVsZW1lbnRTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlOwotCi0vKioKLSAqIEV4dGVybmFsIHN0YXR1cyBjb2RlIGRlZmluaXRpb24gZm9yIHRhcmdldCBnZW5lcmF0ZWQgZXZlbnRzLgotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEsIFJpY2hhcmQgTWFjaWVsCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhcmdldEVsZW1lbnRTdGF0dXMgewotCQotCS8qKgotCSAqIFRoZSBlbGVtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIGFuZCBpcyBhdmFpbGFibGUgKGNvbmVjdGVkKQotCSAqIHRvIHRoZSBob3N0IG1hY2hpbmUuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RBUlRFRCA9IDA7Ci0JCi0JLyoqCi0JICogVGhlIGVsZW1lbnQgaXMgbm90IGNvbmVjdGVkIHRvIHRoZSBob3N0IG1hY2hpbmUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVE9QUEVEID0gMTsKLQkKLQkvKioKLQkgKiBUaGUgZWxlbWVudCBpcyBpbiBhIHN0YXRlIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBiZSBydW4gaW4gaXQuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUkVTVU1FRCA9IDI7Ci0JCi0JLyoqCi0JICogVGhlIGVsZW1lbnQgaXMgaW4gYSBzdGF0ZSB0aGF0IGRvZXMgbm90IGFsbG93IGFwcGxpY2F0aW9ucyB0byBiZSBydW4gaW4gaXQsCi0JICogYWx0aG91Z2ggaXMgY29uZWN0ZWQgKGxpdmUpIHRvIHRoZSBob3N0IG1hY2hpbmUuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUEFVU0VEICA9IDM7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvSVRhcmdldEVudmlyb25tZW50RXZlbnRMaXN0ZW5lci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL0lUYXJnZXRFbnZpcm9ubWVudEV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcwNjk0YS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvSVRhcmdldEVudmlyb25tZW50RXZlbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIHRhcmdldHMnIGNoYW5nZXMgbGlzdGVybmVycy4KLSAqIFR3byBraW5kcyBvZiBldmVudHMgY2FuIG9jY3VyOgotICogPHVsPgotICogPGlsPiBBZGQ6IEVsZW1lbnQgd2FzIGFkZGVkIHRvIHRoZSBwb29sIG9mIHRhcmdldHMKLSAqIDxpbD4gUmVtb3ZlOiBFbGVtZW50IHdhcyByZW1vdmVkIGZyb20gdGhlIHBvb2wgb2YgdGFyZ2V0cwotICogPC91bD4KLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhLCBSaWNoYXJkIE1hY2llbAotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFyZ2V0RW52aXJvbm1lbnRFdmVudExpc3RlbmVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBBRERFRCA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgUkVNT1ZFRCA9IDE7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBhbiBlbGVtZW50IGhhcyBqdXN0IGJlZW4gYWRkZWQgdG8gdGhlIG1vZGVsCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGFkZGVkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50QWRkZWQoVGFyZ2V0RWxlbWVudCBlbGVtZW50KTsKLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IGFuIGVsZW1lbnQgaGFzIGp1c3QgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGxlbWVudCBiZWluZyByZW1vdmVkCi0JICovCi0JcHVibGljIHZvaWQgZWxlbWVudFJlbW92ZWQoSVRhcmdldEVsZW1lbnQgZWxlbWVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9JVGFyZ2V0RXZlbnRMaXN0ZW5lci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL0lUYXJnZXRFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5MmIyOTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL0lUYXJnZXRFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgdGFyZ2V0cycgZXZlbnQgbGlzdGVuZXJzLgotICogRXZlbnRzIGFyZSBmaXJlZCB3aGVuIGEgdGFyZ2V0IHN0YXRlIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YSwgUmljaGFyZCBNYWNpZWwKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFyZ2V0RXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgZXZlbnQgaGFzIG9jY3VyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCBjb2RlIGFzIGluIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5tb2RlbC5JVGFyZ2V0RWxlbWVudFN0YXR1cwotCSAqIEBwYXJhbSBmcm9tIHRoZSBvcmlnaW5hdGluZyB0YXJnZXQgZWxlbWVudAotCSAqLwotCXZvaWQgaGFuZGxlU3RhdGVDaGFuZ2VFdmVudChpbnQgZXZlbnQsIElUYXJnZXRFbGVtZW50IGZyb20pOwotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL1RhcmdldEVsZW1lbnQuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9UYXJnZXRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZDRmZTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL1RhcmdldEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0U3RhdHVzOwotCi0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0RWxlbWVudCBpbXBsZW1lbnRzIElUYXJnZXRFbGVtZW50IHsKLQotCXByaXZhdGUgVGFyZ2V0VHlwZUVsZW1lbnQgdHlwZTsKLQlwcml2YXRlIE1hcCBhdHRyaWJ1dGVzOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBJVGFyZ2V0Q29udHJvbCBjb250cm9sOwotCXByaXZhdGUgaW50IHN0YXR1cyA9IElUYXJnZXRTdGF0dXMuU1RPUFBFRDsKLQlwcml2YXRlIGJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLQkKLQlwdWJsaWMgVGFyZ2V0RWxlbWVudChUYXJnZXRUeXBlRWxlbWVudCB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQlwdWJsaWMgVGFyZ2V0RWxlbWVudChUYXJnZXRUeXBlRWxlbWVudCB0eXBlLCBTdHJpbmcgbmFtZSwgTWFwIGF0dHJzLCBTdHJpbmcgaWQpIHsKLQkJdGhpcyh0eXBlLCBpZCk7Ci0JCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJzOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoTWFwIGF0dHIpIHsKLQkJdHJ5IHsKLQkJCUlUYXJnZXRDb250cm9sIGN0cmwgPSBnZXRDb250cm9sKCk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY3RybC51cGRhdGVDb25maWd1cmF0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmwudXBkYXRlQ29uZmlndXJhdGlvbigpOwotCQkJfQotCQkJZGlydHkgPSBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXJ0eSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudCNnZXRBdHRyaWJ1dGVzKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLklUYXJnZXRFbGVtZW50I3NldEF0dHJpYnV0ZXMoamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzKSB7Ci0JCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0JCWlmIChnZXRTdGF0dXMoKSA9PSBJVGFyZ2V0U3RhdHVzLlNUT1BQRUQpIHsKLQkJCXVwZGF0ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIAotCQkJZGlydHkgPSB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLklUYXJnZXRFbGVtZW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuSVRhcmdldEVsZW1lbnQjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudCNnZXRDb250cm9sKCkKLQkgKi8KLQlwdWJsaWMgSVRhcmdldENvbnRyb2wgZ2V0Q29udHJvbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkgewotCQkJY29udHJvbCA9IHR5cGUuZ2V0RXh0ZW5zaW9uKCkuY29udHJvbEZhY3RvcnkodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udHJvbChJVGFyZ2V0Q29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuSVRhcmdldEVsZW1lbnQjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFRhcmdldFR5cGVFbGVtZW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoVGFyZ2V0VHlwZUVsZW1lbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLklUYXJnZXRFbGVtZW50I2dldFN0YXR1cygpCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCWlmIChzdGF0dXMgPT0gSVRhcmdldFN0YXR1cy5TVE9QUEVEICYmIGRpcnR5KSB7Ci0JCQl1cGRhdGUoZ2V0QXR0cmlidXRlcygpKTsKLQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuSVRhcmdldEVsZW1lbnQjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkgIT0gbnVsbCA/IHRoaXMuZ2V0TmFtZSgpIDogc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudCNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9UYXJnZXRFbnZpcm9ubWVudEV2ZW50TWFuYWdlci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL1RhcmdldEVudmlyb25tZW50RXZlbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkNzBkYzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL1RhcmdldEVudmlyb25tZW50RXZlbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLklUYXJnZXRDb250cm9sRXZlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5Qb29saW5nVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBNYW5hZ2VyIGNsYXNzIHRvIHN1cHBvcnQgZGlmZmVyZW50IGV2ZW50IHByb3ZpZGVyIHBlciBlYWNoIAotICogdGFyZ2V0IGNvbnRyb2wgaW5zdGFuY2UuCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldEVudmlyb25tZW50RXZlbnRNYW5hZ2VyIGltcGxlbWVudHMgSVRhcmdldENvbnRyb2xFdmVudExpc3RlbmVyLCBJVGFyZ2V0RW52aXJvbm1lbnRFdmVudExpc3RlbmVyIHsKLQkKLQlwcml2YXRlIFRhcmdldEVudmlyb25tZW50TWFuYWdlciBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBJVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbmV3IFBvb2xpbmdUYXJnZXRDb250cm9sRXZlbnRQcm92aWRlcigpOwotCXByaXZhdGUgTWFwIGNvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBUYXJnZXRFbnZpcm9ubWVudEV2ZW50TWFuYWdlcihUYXJnZXRFbnZpcm9ubWVudE1hbmFnZXIgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQltb2RlbC5hZGRNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBoYW5kbGVTdGF0ZUNoYW5nZUV2ZW50KGludCBldmVudCwgSVRhcmdldENvbnRyb2wgZnJvbSkgewotCQkKLQkJQ29udHJvbEluZm8gaW5mbyA9IChDb250cm9sSW5mbykgY29udHJvbHMuZ2V0KGZyb20pOwotCQltb2RlbC5maXJlRWxlbWVudEV2ZW50KGV2ZW50LCBpbmZvLmdldEVsZW1lbnQoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbGVtZW50QWRkZWQoVGFyZ2V0RWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQl0cnkgewotCQkJSVRhcmdldENvbnRyb2wgY29udHJvbCA9IGVsZW1lbnQuZ2V0Q29udHJvbCgpOwotCQkJSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJCQotCQkJaWYoSUFkYXB0YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNvbnRyb2wuZ2V0Q2xhc3MoKSkpIHsKLQkJCQlwcm92aWRlciA9IChJVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIpICgoSUFkYXB0YWJsZSljb250cm9sKS5nZXRBZGFwdGVyKElUYXJnZXRDb250cm9sRXZlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIgPSBkZWZhdWx0UHJvdmlkZXI7Ci0JCQl9Ci0JCQkKLQkJCWNvbnRyb2xzLnB1dChjb250cm9sLCBuZXcgQ29udHJvbEluZm8oZWxlbWVudCxwcm92aWRlcikpOwotCQkJcHJvdmlkZXIucmVnaXN0ZXJDb250cm9sQW5kTGlzdGVuZXIoY29udHJvbCx0aGlzKTsKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCQotCX0KLQotCi0JcHVibGljIHZvaWQgZWxlbWVudFJlbW92ZWQoSVRhcmdldEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJdHJ5IHsKLQkJCQotCQkJSVRhcmdldENvbnRyb2wgY29udHJvbCA9IGVsZW1lbnQuZ2V0Q29udHJvbCgpOwotCQkJQ29udHJvbEluZm8gaW5mbyA9IChDb250cm9sSW5mbykgY29udHJvbHMuZ2V0KGNvbnRyb2wpOwotCQkJSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyIHByb3ZpZGVyID0gaW5mby5nZXRQcm92aWRlcigpOwotCQkJcHJvdmlkZXIudW5yZWdpc3RlckNvbnRyb2xBbmRMaXN0ZW5lcihjb250cm9sLHRoaXMpOwotCQkJY29udHJvbHMucmVtb3ZlKGNvbnRyb2wpOwotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQl9Ci0JCi0JY2xhc3MgQ29udHJvbEluZm8gewotCQkKLQkJcHJpdmF0ZSBUYXJnZXRFbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyIHByb3ZpZGVyOwotCQkKLQkJcHVibGljIENvbnRyb2xJbmZvKFRhcmdldEVsZW1lbnQgZWxlbWVudCwgSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotCQl9Ci0JCQotCQlwdWJsaWMgVGFyZ2V0RWxlbWVudCBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoVGFyZ2V0RWxlbWVudCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgSVRhcmdldENvbnRyb2xFdmVudFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihJVGFyZ2V0Q29udHJvbEV2ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJCXRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJfQotCQkKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9UYXJnZXRFbnZpcm9ubWVudE1hbmFnZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvY29yZS9UYXJnZXRFbnZpcm9ubWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTE5MjE4ZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvVGFyZ2V0RW52aXJvbm1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuSVRhcmdldFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklUYXJnZXRUeXBlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5YTUxNZW1lbnRvOwotCi0vKioKLSAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBhbGwgVGFyZ2V0cyBhdmFpbGFibGUuIEl0cyBtYW5hZ2luZyB0YXNrcyBjb25zaXN0IG9uOgotICogPHVsPgotICogPGxpPiBSZWFkL3dyaXRlIHRhcmdldHMgaW5mb3JtYXRpb24gZnJvbS90byBkaXNrIChzZW5zaXRpdmUgZGF0YSBpcyB3cml0dGVuIHRvIGEgc2VjdXJlIGNvbnRhaW5lcikKLSAqIDxsaT4gS2VlcCBhIGxpc3Qgb2YgYWxsIHRhcmdldCB0eXBlcyBlbGVtZW50cyBiYXNlZCBvbiBleHRlbnNpb24gcG9pbnQgaW5mb3JtYXRpb24uIEVhY2ggdGFyZ2V0IHR5cGUgY2FuIHJlZmVyZW5jZSBhIGxpc3Qgb2YgdGFyZ2V0IGVsZW1lbnRzCi0gKiA8bGk+IEluc2VydC9yZW1vdmUgbGlzdGVuZXJzIGZvciB0YXJnZXRzIGV2ZW50cy4KLSAqIDxsaT4gRmlyZSBldmVudHMgZm9yIHRoZSBsaXN0ZW5lcnMKLSAqIDxsaT4gUHJvdmlkZXMgZ2V0dGVycyBmb3IgY29uZmlncwotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEsIFJpY2hhcmQgTWFjaWVsCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRFbnZpcm9ubWVudE1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVOVklST05NRU5UUyA9ICJFbnZpcm9ubWVudHMiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBFTlZJUk9OTUVOVFNfVFlQRSA9ICJUeXBlIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRU5WSVJPTk1FTlRTX1RZUEVfTkFNRSA9ICJOYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRU5WSVJPTk1FTlRTX1RZUEVfQ09ORklHID0gIkNvbmZpZ3VyYXRpb24iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBFTlZJUk9OTUVOVFNfVFlQRV9DT05GSUdfTkFNRSA9ICJDZmdOYW1lIjsKLQkKLQlwcml2YXRlIExpc3QgdGFyZ2V0VHlwZUVsZW1lbnRzOwotCXByaXZhdGUgTGlzdCBldmVudExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgbW9kZWxDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgVGFyZ2V0RW52aXJvbm1lbnRFdmVudE1hbmFnZXIgbWFuYWdlcjsKLQkKLQlwcml2YXRlIE1hcCBzdG9yZWRDeXBoZXJFbnZUb0tleU1hcDsKLQkKLQlwdWJsaWMgVGFyZ2V0RW52aXJvbm1lbnRNYW5hZ2VyKCkgewotCQkKLQkJc3VwZXIoKTsKLQkJTWFwIHRhcmdldHMgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udHJvbHMoKTsKLQkJdGFyZ2V0VHlwZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQltYW5hZ2VyID0gbmV3IFRhcmdldEVudmlyb25tZW50RXZlbnRNYW5hZ2VyKHRoaXMpOwotCQkKLQkJVVJMIHBsdWdpblVSTCA9IEVudmlyb25tZW50UGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQlNYXAgY3lwaGVyRW52VHlwZU1hcCA9IFBsYXRmb3JtLmdldEF1dGhvcml6YXRpb25JbmZvKHBsdWdpblVSTCwgIiIsICIiKTsKLQkJCi0JCS8vIENyZWF0ZSBhIG1hcCB0aGF0IGNvbnRhaW5zIChlbnZpcm9ubWVudCB0eXBlIG5hbWUsIGNpcGhlciBrZXkgc2V0KSB0dXBsZXMKLQkJIHN0b3JlZEN5cGhlckVudlRvS2V5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQlGaWxlIGZpbGUgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChFbnZpcm9ubWVudFBsdWdpbi5GSUxFTkFNRSkudG9GaWxlKCk7Ci0JCVhNTE1lbWVudG8gbWVtZW50bzsKLQkJdHJ5IHsJCQotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0JCQl0cnkgewotCQkJCW1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KHJlYWRlcik7Ci0JCQkJdGFyZ2V0cyA9IGluaXRDb250ZW50RnJvbUZpbGUobWVtZW50byx0YXJnZXRzLGN5cGhlckVudlR5cGVNYXApOwotCQkJfQotCQkJY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBleGMpIHsKLQkJCQltZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoRU5WSVJPTk1FTlRTKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGtleXMgPSB0YXJnZXRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldCBjaXBoZXJLZXlTZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylrZXlzLm5leHQoKTsKLQkJCUlUYXJnZXRUeXBlRXh0ZW5zaW9uIGVudiA9IChJVGFyZ2V0VHlwZUV4dGVuc2lvbikgdGFyZ2V0cy5nZXQobmFtZSk7Ci0JCQl0YXJnZXRUeXBlRWxlbWVudHMuYWRkKG5ldyBUYXJnZXRUeXBlRWxlbWVudChuYW1lLGVudix0aGlzKSk7Ci0JCQkKLQkJCS8vIEFsc28gc2F2ZSB0aGUgY2lwaGVyZWQga2V5IG5hbWVzCi0JCQkvLyBHZXQgY3J5cHRvZ3JhcGhlZCBrZXlzCi0JCQlTdHJpbmcgW10gY29udHJvbEtleXNDeXBoZXIgPSBlbnYuZ2V0Q29udHJvbEF0dHJpYnV0ZU5hbWVzRm9yQ2lwaGVyZWRLZXlzKCk7Ci0JCQkKLQkJCS8vIEFkZCBhbGwga2V5IG5hbWVzIHRvIHRoZSBzZXQKLQkJCWlmKGNvbnRyb2xLZXlzQ3lwaGVyICE9IG51bGwpIHsKLQkJCQlMaXN0IGtleUxpc3QgPSBBcnJheXMuYXNMaXN0KGNvbnRyb2xLZXlzQ3lwaGVyKTsKLQkJCQljaXBoZXJLZXlTZXQuYWRkQWxsKGtleUxpc3QpOwotCQkJfQotCQkJCi0vLwkJCSBBZGQgc2V0IHRvIHRoZSBtYXAgKHNhdmUgaXQpCi0JCQlzdG9yZWRDeXBoZXJFbnZUb0tleU1hcC5wdXQobmFtZSwgY2lwaGVyS2V5U2V0KTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIE1hcCBpbml0Q29udGVudEZyb21GaWxlKFhNTE1lbWVudG8gbWVtZW50byxNYXAgdGFyZ2V0cywgTWFwIGN5cGhlckVudlR5cGVNYXApIHsKLQkJCi0JCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKEVOVklST05NRU5UU19UWVBFKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoRU5WSVJPTk1FTlRTX1RZUEVfTkFNRSk7Ci0JCQlJVGFyZ2V0VHlwZUV4dGVuc2lvbiBlbnYgPSAoSVRhcmdldFR5cGVFeHRlbnNpb24pIHRhcmdldHMuZ2V0KG5hbWUpOwotCQkJLy8gR2V0IGNvbmZpZyBuYW1lIG1hcCBmcm9tIHRoZSBnaXZlbiB0eXBlIG5hbWUuCi0JCQlNYXAgY3lwaGVyQ29uZmlnTmFtZU1hcCA9IG51bGw7Ci0JCQkvLyBTZXQgbnVsbCBpZiB0aGUgcGFyZW50IG1hcCBpcyBudWxsLgotCQkJaWYoY3lwaGVyRW52VHlwZU1hcCAhPSBudWxsKSBjeXBoZXJDb25maWdOYW1lTWFwID0gKE1hcCljeXBoZXJFbnZUeXBlTWFwLmdldChuYW1lKTsKLQkJCWlmIChlbnYgIT0gbnVsbCkgewotLy8JCQkJIENyZWF0ZSBjaXBoZXIga2V5IHNldCB0aGF0IHdpbGwgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUga2V5cyB0aGF0IGFyZSBjaXBoZXJlZAotCQkJCVNldCBjaXBoZXJLZXlTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCQotLy8JCQkJIEdldCBjcnlwdG9ncmFwaGVkIGtleXMKLQkJCQlTdHJpbmcgW10gY29udHJvbEtleXNDeXBoZXIgPSBlbnYuZ2V0Q29udHJvbEF0dHJpYnV0ZU5hbWVzRm9yQ2lwaGVyZWRLZXlzKCk7Ci0JCQkJCi0JCQkJLy8gQWRkIGFsbCBrZXkgbmFtZXMgdG8gdGhlIHNldAotCQkJCWlmKGNvbnRyb2xLZXlzQ3lwaGVyICE9IG51bGwpIHsKLQkJCQkJTGlzdCBrZXlMaXN0ID0gQXJyYXlzLmFzTGlzdChjb250cm9sS2V5c0N5cGhlcik7Ci0JCQkJCWNpcGhlcktleVNldC5hZGRBbGwoa2V5TGlzdCk7Ci0JCQkJfQotCQkJCQotLy8JCQkJIEFkZCBzZXQgdG8gdGhlIG1hcAotCQkJCXN0b3JlZEN5cGhlckVudlRvS2V5TWFwLnB1dChuYW1lLCBjaXBoZXJLZXlTZXQpOwotCQkJCQotCQkJCVRhcmdldFR5cGVFbGVtZW50IHR5cGVFbGVtZW50ID0gbmV3IFRhcmdldFR5cGVFbGVtZW50KG5hbWUsZW52LHRoaXMpOwotCQkJCUlNZW1lbnRvW10gY2hpbGRyZW5FbGVtZW50cyA9IGNoaWxkcmVuW2ldLmdldENoaWxkcmVuKEVOVklST05NRU5UU19UWVBFX0NPTkZJRyk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbkVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBuYW1lRWxlbWVudCA9IGNoaWxkcmVuRWxlbWVudHNbal0uZ2V0U3RyaW5nKEVOVklST05NRU5UU19UWVBFX0NPTkZJR19OQU1FKTsKLQkJCQkJCi0JCQkJCU1hcCBhdHRyc0VsZW1lbnQgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlTdHJpbmdbXSBjb250cm9sS2V5cyA9IGVudi5nZXRDb250cm9sQXR0cmlidXRlTmFtZXMoKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjb250cm9sS2V5cy5sZW5ndGg7IGsrKykgewotCQkJCQkJYXR0cnNFbGVtZW50LnB1dChjb250cm9sS2V5c1trXSxjaGlsZHJlbkVsZW1lbnRzW2pdLmdldFN0cmluZyhjb250cm9sS2V5c1trXSkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBHZXQgcGFzc3dvcmQga2V5IG1hcCBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIG5hbWUKLQkJCQkJTWFwIGN5cGhlclBhc3N3ZEtleU1hcCA9IG51bGw7Ci0JCQkJCS8vIFNldCBudWxsIGlmIHRoZSBwYXJlbnQgbWFwIGlzIG51bGwKLQkJCQkJaWYoY3lwaGVyQ29uZmlnTmFtZU1hcCAhPSBudWxsKSBjeXBoZXJQYXNzd2RLZXlNYXAgPSAoTWFwKWN5cGhlckNvbmZpZ05hbWVNYXAuZ2V0KG5hbWVFbGVtZW50KTsKLQkJCQkJCi0JCQkJCWlmKGNvbnRyb2xLZXlzQ3lwaGVyICE9IG51bGwpIHsKLQkJCQkJCWZvcihpbnQgaz0wOyBrIDwgY29udHJvbEtleXNDeXBoZXIubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQkvLyBJbnNlcnQgaW50byBrZXkgaW50byB0aGUgaGFzaCBzZXQgdG8gZgotCS8vCQkJCQkJLy8gR2V0IHRoZSBwYXNzd29yZHMgb3Igc2V0IHRoZW0gdG8gZW1wdHkgc3RyaW5nLCBpZiBtYXAgbm90IGF2YWlsYWJsZS4KLQkJCQkJCQlpZihjeXBoZXJQYXNzd2RLZXlNYXAgPT0gbnVsbCkgewotCQkJCQkJCQlhdHRyc0VsZW1lbnQucHV0KGNvbnRyb2xLZXlzQ3lwaGVyW2tdLCAiIik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYXR0cnNFbGVtZW50LnB1dChjb250cm9sS2V5c0N5cGhlcltrXSwgY3lwaGVyUGFzc3dkS2V5TWFwLmdldChjb250cm9sS2V5c0N5cGhlcltrXSkpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBJbmNsdWRlIGtleSBuYW1lIGluIHRoZSBzZXQKLQkJCQkJCQljaXBoZXJLZXlTZXQuYWRkKGNvbnRyb2xLZXlzQ3lwaGVyW2tdKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gRmluYWxseSBpbnNlcnQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGVudmlyb25tZW50Ci0JCQkJCS8vIENyZWF0ZSBpdCwgaWYgbmVjZXNzYXJ5LgotCQkJCQlTdHJpbmcgaWQ7Ci0JCQkJCWlmKGNoaWxkcmVuRWxlbWVudHNbal0uZ2V0U3RyaW5nKEVudmlyb25tZW50UGx1Z2luLkFUVFJfQ09SRV9FTlZJUk9OTUVOVElEKSA9PSBudWxsKSB7Ci0JCQkJCQlpZCA9IEVudmlyb25tZW50UGx1Z2luLmdldERlZmF1bHQoKS5nZXRFbnZpcm9ubWVudFVuaXF1ZUlEKCk7Ci0JCQkJCQkvKmF0dHJzRWxlbWVudC5wdXQoRW52aXJvbm1lbnRQbHVnaW4uQVRUUl9DT1JFX0VOVklST05NRU5USUQsIAotCQkJCQkJCQlFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RW52aXJvbm1lbnRVbmlxdWVJRCgpKTsqLwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWQgPSBjaGlsZHJlbkVsZW1lbnRzW2pdLmdldFN0cmluZyhFbnZpcm9ubWVudFBsdWdpbi5BVFRSX0NPUkVfRU5WSVJPTk1FTlRJRCk7Ci0JCQkJCQkvKmF0dHJzRWxlbWVudC5wdXQoRW52aXJvbm1lbnRQbHVnaW4uQVRUUl9DT1JFX0VOVklST05NRU5USUQsIAotCQkJCQkJCWNoaWxkcmVuRWxlbWVudHNbal0uZ2V0U3RyaW5nKEVudmlyb25tZW50UGx1Z2luLkFUVFJfQ09SRV9FTlZJUk9OTUVOVElEKSk7Ki8KLQkJCQkJfQotCQkJCQkKLQkJCQkJdHlwZUVsZW1lbnQuYWRkRWxlbWVudChuZXcgVGFyZ2V0RWxlbWVudCh0eXBlRWxlbWVudCxuYW1lRWxlbWVudCxhdHRyc0VsZW1lbnQsIGlkKSk7Ci0JCQkJfQotCQkJCQotCQkJCXRhcmdldFR5cGVFbGVtZW50cy5hZGQodHlwZUVsZW1lbnQpOwotCQkJCXRhcmdldHMucmVtb3ZlKG5hbWUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdGFyZ2V0czsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlVG9GaWxlKCkgewotCQkKLQkJLy8gQ3JlYXRlIG5ldyBjaXBoZXJlZCBFbnZpcm9ubWVudCB0eXBlIG1hcAotCQlNYXAgY3lwaGVyRW52VHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlGaWxlIGZpbGUgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChFbnZpcm9ubWVudFBsdWdpbi5GSUxFTkFNRSkudG9GaWxlKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0VHlwZUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KEVOVklST05NRU5UUyk7CQkKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVGFyZ2V0VHlwZUVsZW1lbnQgdHlwZSA9ICgoVGFyZ2V0VHlwZUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQkJICAgIElNZW1lbnRvIHR5cGVNZW1lbnRvID0gbWVtZW50by5jcmVhdGVDaGlsZChFTlZJUk9OTUVOVFNfVFlQRSk7Ci0JCSAgICB0eXBlTWVtZW50by5wdXRTdHJpbmcoRU5WSVJPTk1FTlRTX1RZUEVfTkFNRSwgdHlwZS5nZXROYW1lKCkpOwotCQkJCi0JCSAgICAvLyBDcmVhdGUgbmV3IGNpcGhlcmVkIGNvbmZpZ3VyYXRpb24gbWFwCi0JCSAgICBNYXAgY3lwaGVyQ29uZmlnTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCSAgICAKLQkJICAgIC8vIEdldCBzZXQgb2YgY2lwaGVyZWQga2V5cyBmb3IgdGhpcyBlbnZpcm9ubWVudCB0eXBlIG5hbWUKLQkJICAgIFNldCBjeXBoZXJLZXlTZXQgPSAoU2V0KXN0b3JlZEN5cGhlckVudlRvS2V5TWFwLmdldCh0eXBlLmdldE5hbWUoKSk7Ci0JCSAgICAKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gdHlwZS5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJSVRhcmdldEVsZW1lbnQgZWxlbWVudCA9IChJVGFyZ2V0RWxlbWVudCkgZWxlbWVudHMubmV4dCgpOwotCQkJCUlNZW1lbnRvIGVsZW1lbnRNZW1lbnRvID0gdHlwZU1lbWVudG8uY3JlYXRlQ2hpbGQoRU5WSVJPTk1FTlRTX1RZUEVfQ09ORklHKTsKLQkJCQllbGVtZW50TWVtZW50by5wdXRTdHJpbmcoRU5WSVJPTk1FTlRTX1RZUEVfQ09ORklHX05BTUUsZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCQotCQkJCU1hcCBlbGVtZW50QXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQotCQkJCS8vIENyZWF0ZSBuZXcgY2lwaGVyZWQgcGFzc3dvcmQga2V5IG1hcAotCQkJCU1hcCBjeXBoZXJQYXNzd2RLZXlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQotCQkJCUl0ZXJhdG9yIGF0dHJLZXlzID0gZWxlbWVudEF0dHIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoYXR0cktleXMuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhdHRyS2V5cy5uZXh0KCk7Ci0JCQkJCQotCQkJCQkvLyBJZiBpcyBjaXBoZXJlZCBwdXQgaXQgYXMgYSB2YWx1ZSB0byB0aGUgY2lwaGVyZWQgcGFzc3dvcmQga2V5IG1hcAotCQkJCQlpZihjeXBoZXJLZXlTZXQuY29udGFpbnMoa2V5KSkgewotCQkJCQkJY3lwaGVyUGFzc3dkS2V5TWFwLnB1dChrZXksIChTdHJpbmcpIGVsZW1lbnRBdHRyLmdldChrZXkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnRNZW1lbnRvLnB1dFN0cmluZyhrZXksKFN0cmluZykgZWxlbWVudEF0dHIuZ2V0KGtleSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIFNhdmUgdGhlIFRhcmdldCBpZCBmcm9tIHRoZSBUYXJnZXQgRWxlbWVudC4KLQkJCQllbGVtZW50TWVtZW50by5wdXRTdHJpbmcoRW52aXJvbm1lbnRQbHVnaW4uQVRUUl9DT1JFX0VOVklST05NRU5USUQsCi0JCQkJCQllbGVtZW50LmdldElkKCkpOwotCQkJCi0JCQkJLy8gRmlsbCBjaXBoZXJlZCBjb25maWd1cmF0aW9uIG1hcCB3aXRoIChjb25maWd1cmF0aW9uIG5hbWUsIGNpcGggcGFzc3dkIGtleSBtYXApIHR1cGxlcwotCQkJCWN5cGhlckNvbmZpZ05hbWVNYXAucHV0KGVsZW1lbnQuZ2V0TmFtZSgpLCBjeXBoZXJQYXNzd2RLZXlNYXApOwotCQkJfQotCQkJLy8gRmlsbCBjaXBoZXJlZCBlbnZpcm9ubWVudCB0eXBlIG1hcCB3aXRoIChlbnZpcm9ubWVudCB0eXBlIG5hbWUsIGNpcGggY29uZmlnIG1hcCkgdHVwbGVzCi0JCQljeXBoZXJFbnZUeXBlTWFwLnB1dCh0eXBlLmdldE5hbWUoKSwgY3lwaGVyQ29uZmlnTmFtZU1hcCk7Ci0JCX0KLQkJCi0JCVVSTCBwbHVnaW5VUkwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmFkZEF1dGhvcml6YXRpb25JbmZvKHBsdWdpblVSTCwgIiIsICIiLCBjeXBoZXJFbnZUeXBlTWFwKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJLy8gR2VuZXJhdGVzIGEgcnVudGltZSBleGNlcHRpb24gY29udGFpbmluZyB0aGUgQ29yZUV4Y2VwdGlvbgotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotCQl9Ci0JCQotCQlXcml0ZXIgd3JpdGVyOwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7Ci0JCQltZW1lbnRvLnNhdmUod3JpdGVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gVGhyb3cgYSBydW50aW1lIGV4Y2VwdGlvbgotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIExpc3QgZ2V0VHlwZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGFyZ2V0VHlwZUVsZW1lbnRzOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElUYXJnZXRFbGVtZW50W10gZ2V0Q29uZmlnRWxlbWVudHMoKSB7Ci0JCUxpc3QgcnNwID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpID0gdGFyZ2V0VHlwZUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJcnNwLmFkZEFsbCggKChUYXJnZXRUeXBlRWxlbWVudClpLm5leHQoKSkuZ2V0RWxlbWVudHMoKSApOwotCQl9Ci0JCQotCQlJVGFyZ2V0RWxlbWVudFtdIHJzcE9iaiA9IG51bGw7Ci0JCQotCQlpZiAocnNwLnNpemUoKSA+IDApIHsKLQkJCXJzcE9iaiA9IChJVGFyZ2V0RWxlbWVudFtdKXJzcC50b0FycmF5KG5ldyBJVGFyZ2V0RWxlbWVudFtde30pOwotCQl9Ci0JCXJldHVybiByc3BPYmo7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBtb2RlbCBldmVudCBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyIGFyZ3VtZW50IGlzIG51bGwgb3IgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGlzIAotCSAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqLwotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb2RlbEV2ZW50TGlzdGVuZXIgKElUYXJnZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgIWV2ZW50TGlzdGVuZXJzLmNvbnRhaW5zIChsaXN0ZW5lcikpCi0JCXsKLQkJCWV2ZW50TGlzdGVuZXJzLmFkZCAobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlLXJlZ2lzdGVycyBhIG1vZGVsIGV2ZW50IGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgYXJndW1lbnQgaXMgbnVsbCBvciBub3QgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGlzIAotCSAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqLwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZU1vZGVsRXZlbnRMaXN0ZW5lciAoSVRhcmdldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBldmVudExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCXsKLQkJCWV2ZW50TGlzdGVuZXJzLnJlbW92ZSAobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVycyBhIG1vZGVsIGNoYW5nZWQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBhcmd1bWVudCBpcyBudWxsIG9yIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhpcyAKLQkgKiBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQkgKi8KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIgKElUYXJnZXRFbnZpcm9ubWVudEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiAhbW9kZWxDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zIChsaXN0ZW5lcikpCi0JCXsKLQkJCW1vZGVsQ2hhbmdlZExpc3RlbmVycy5hZGQgKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZS1yZWdpc3RlcnMgYSBtb2RlbCBjaGFuZ2VkIGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgYXJndW1lbnQgaXMgbnVsbCBvciBub3QgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGlzIAotCSAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqLwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIChJVGFyZ2V0RW52aXJvbm1lbnRFdmVudExpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgbW9kZWxDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJewotCQkJbW9kZWxDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZSAobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZU1vZGVsQ2hhbmdlZChpbnQgYWN0aW9uLElUYXJnZXRFbGVtZW50IG9sZEVsZW1lbnQsVGFyZ2V0RWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQotCQlJdGVyYXRvciBpID0gbW9kZWxDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCQotCQlpZiAob2xkRWxlbWVudCA9PSBudWxsICYmIG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSVRhcmdldEVudmlyb25tZW50RXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IChJVGFyZ2V0RW52aXJvbm1lbnRFdmVudExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5lbGVtZW50QWRkZWQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2xkRWxlbWVudCAhPSBudWxsICYmIG5ld0VsZW1lbnQgPT0gbnVsbCkgewotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSVRhcmdldEVudmlyb25tZW50RXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IChJVGFyZ2V0RW52aXJvbm1lbnRFdmVudExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5lbGVtZW50UmVtb3ZlZChvbGRFbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZpcmVFbGVtZW50RXZlbnQoaW50IGV2ZW50LFRhcmdldEVsZW1lbnQgZWxlbWVudCkgewotCi0JCWludCBzdGF0dXMgPSBJVGFyZ2V0RWxlbWVudFN0YXR1cy5TVE9QUEVEOwotCQlzd2l0Y2ggKGV2ZW50KSB7Ci0JCQljYXNlIElUYXJnZXRTdGF0dXMuU1RBUlRFRDoKLQkJCQlzdGF0dXMgPSBJVGFyZ2V0RWxlbWVudFN0YXR1cy5TVEFSVEVEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJVGFyZ2V0U3RhdHVzLlNUT1BQRUQ6Ci0JCQkJc3RhdHVzID0gSVRhcmdldEVsZW1lbnRTdGF0dXMuU1RPUFBFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVRhcmdldFN0YXR1cy5SRVNVTUVEOgotCQkJCXN0YXR1cyA9IElUYXJnZXRFbGVtZW50U3RhdHVzLlJFU1VNRUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElUYXJnZXRTdGF0dXMuUEFVU0VEOgotCQkJCXN0YXR1cyA9IElUYXJnZXRFbGVtZW50U3RhdHVzLlBBVVNFRDsKLQkJCQlicmVhazsKLQkJfQotCQllbGVtZW50LnNldFN0YXR1cyhzdGF0dXMpOwotCQkKLQkJSXRlcmF0b3IgaSA9IGV2ZW50TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJSVRhcmdldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSAoSVRhcmdldEV2ZW50TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJbGlzdGVuZXIuaGFuZGxlU3RhdGVDaGFuZ2VFdmVudChzdGF0dXMsIGVsZW1lbnQpOwotCQl9Ci0JCQotCX0KLQkKLQkvLyBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGZyb20gdGhlIElUYXJnZXRQcm92aWRlcgotCQotCXB1YmxpYyBJVGFyZ2V0Q29udHJvbCBzZWxlY3RDb250cm9sKFN0cmluZyBpZCkgewotCQlJVGFyZ2V0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJSVRhcmdldEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzIFtpXTsKLQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKGlkKSkgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0Q29udHJvbCgpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxDb25maWdOYW1lcygpIHsKLQkJSVRhcmdldEVsZW1lbnRbXSBlbGVtZW50cyA9IGdldENvbmZpZ0VsZW1lbnRzKCk7Ci0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCUlUYXJnZXRFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50cyBbaV07Ci0JCQkJbmFtZXMuYWRkKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW117fSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9jb3JlL1RhcmdldFR5cGVFbGVtZW50LmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvVGFyZ2V0VHlwZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU1YWY1My4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2NvcmUvVGFyZ2V0VHlwZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5leHRlbnNpb24uSVRhcmdldFR5cGVFeHRlbnNpb247Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0VHlwZUVsZW1lbnQgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFRhcmdldEVudmlyb25tZW50TWFuYWdlciBtYW5hZ2VyOwotCXByaXZhdGUgSVRhcmdldFR5cGVFeHRlbnNpb24gZXh0ZW5zaW9uOwotCXByaXZhdGUgTGlzdCBlbGVtZW50czsKLQkKLQlwdWJsaWMgVGFyZ2V0VHlwZUVsZW1lbnQoU3RyaW5nIG5hbWUsSVRhcmdldFR5cGVFeHRlbnNpb24gZW52LFRhcmdldEVudmlyb25tZW50TWFuYWdlciBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmV4dGVuc2lvbiA9IGVudjsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5tYW5hZ2VyID0gbW9kZWw7Ci0JCQotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChUYXJnZXRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCW1hbmFnZXIuZmlyZU1vZGVsQ2hhbmdlZChJVGFyZ2V0RW52aXJvbm1lbnRFdmVudExpc3RlbmVyLkFEREVELCBudWxsLCBlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudChJVGFyZ2V0RWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQltYW5hZ2VyLmZpcmVNb2RlbENoYW5nZWQoSVRhcmdldEVudmlyb25tZW50RXZlbnRMaXN0ZW5lci5SRU1PVkVELCBlbGVtZW50LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRhcmdldFR5cGVFeHRlbnNpb24gZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihJVGFyZ2V0VHlwZUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJdGhpcy5leHRlbnNpb24gPSBleHRlbnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmdldE5hbWUoKSAhPSBudWxsID8gdGhpcy5nZXROYW1lKCkgOiBzdXBlci50b1N0cmluZygpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZXh0ZW5zaW9uL0lDaGlsZHJlblByb3ZpZGVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2V4dGVuc2lvbi9JQ2hpbGRyZW5Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2QyMTcwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZXh0ZW5zaW9uL0lDaGlsZHJlblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuSVRhcmdldEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSB0byBtYW5hZ2UgdGhlIGNoaWxkcmVuIGhpZXJhcmNoaWVzIG9mIGEgdGFyZ2V0IGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBIb25nIENoYW5nIExpbgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoaWxkcmVuUHJvdmlkZXIgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCB0aGUgY2hpbGQgb2JqZWN0cyBvZiBhbiBJVGFyZ2V0RWxlbWVudAotICAgICAqIAotICAgICAqIEBwYXJhbQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSU5vZGVbXSBnZXRDaGlsZHJlbihJVGFyZ2V0RWxlbWVudCB0YXJnZXRFbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZXh0ZW5zaW9uL0lOb2RlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2V4dGVuc2lvbi9JTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRjYzc0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZXh0ZW5zaW9uL0lOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBJVGFyZ2V0RWxlbWVudCdzIGNoaWxkcmVuIG9uCi0gKiBSZW1vdGVUb29sc0Vudmlyb25tZW50VmlldwotICogCi0gKiBAYXV0aG9yIEhvbmcgQ2hhbmcgTGluCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTm9kZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFsbCB0aGUgY2hpbGRyZW4gZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBJTm9kZVtdIGdldENoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IGljb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZGlzcGxheSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5VGV4dCgpOwotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2V4dGVuc2lvbi9JVGFyZ2V0VHlwZUV4dGVuc2lvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9leHRlbnNpb24vSVRhcmdldFR5cGVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGY5ZWY5ZS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2V4dGVuc2lvbi9JVGFyZ2V0VHlwZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQud2l6YXJkLkFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlOwotCi0KLQotLyoqCi0gKiBQcm92aWRlcyBhbiBpbnRlcmZhY2UgdGhhdCBpcyBhbiBleHRlbnNpb24gb2YgYSB0YXJnZXQgdHlwZS4gVGhpcyBleHRlbnNpb24KLSAqIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBwbHVnaW4gdGhhdCBleHRlbmRzIHRoZSAKLSAqIEVudmlyb25tZW50IENvbnRyb2wgRGVsZWdhdGUgZXh0ZW5zaW9uIHBvaW50LCBpbiBvcmRlciB0byBkZWZpbmUKLSAqIGEgbmV3IHRhcmdldCB0eXBlLiAKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhLCBSaWNoYXJkIE1hY2llbAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRUeXBlRXh0ZW5zaW9uIHsKLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgYXR0cmlidXRlcywgcHJvZHVjZXMgYSBmcmVzaCBuZXcgY29udHJvbCBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZWxlbWVudCBUT0RPCi0JICogCi0JICogQHJldHVybiB0aGUgY29udHJvbCBpbnN0YW5jZQotCSAqLwotCUlUYXJnZXRDb250cm9sIGNvbnRyb2xGYWN0b3J5KElUYXJnZXRFbGVtZW50IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFByb3ZpZGVzIGFuIGFycmF5IHdpdGggYWxsIHRoZSBhdHRyaWJ1dGVzJyBuYW1lIG5lZWRlZCBieSB0aGUKLQkgKiBhc3NvY2lhdGVkIGNvbnRyb2xGYWN0b3J5LiBPbmx5IG5vbi1jaXBoZXJlZCBhdHRyaWJ1dGVzIGFyZSBsaXN0ZWQgaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGF0dHJpYnV0ZXMnIG5hbWUKLQkgKi8KLQlTdHJpbmdbXSBnZXRDb250cm9sQXR0cmlidXRlTmFtZXMoKTsKLQkKLQkvKioKLQkgKiBQcm92aWRlcyBhIERpYWxvZyBQYWdlIHRvIGVkaXQgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzCi0JICogYXR0cmlidXRlcwotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gZWRpdCBhbiBleGlzdGVudCB0YXJnZXQgZW52aXJvbm1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcycgbWFwLiBNYXkgYmUgbnVsbCBpbiB0aGUgY2FzZSBvZiBhIG5ldyBjb25maWd1cmF0aW9uLgotCSAqIEBwYXJhbSBuYW1lIHRoZSBjb25maWd1cmF0aW9uJ3Mga2V5IG5hbWUuIE1heSBiZSBudWxsIGluIHRoZSBjYXNlIG9mIGEgbmV3IGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBhbiB3aXphcmQgcGFnZQotCSAqLwotCUFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlIGRpYWxvZ1BhZ2VGYWN0b3J5KElUYXJnZXRFbGVtZW50IHRhcmdldEVsZW1lbnQpOwotCQotCS8qKgotCSAqIFByb3ZpZGVzIGEgRGlhbG9nIFBhZ2UgdG8gZWRpdCB0aGUgYXNzb2NpYXRlZCBjb250cm9sJ3MKLQkgKiBhdHRyaWJ1dGVzCi0JICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIGEgbmV3IFRhcmdldCBFbnZpcm9ubWVudCBpcyBjcmVhdGVkCi0JICogCi0JICogQHJldHVybiBhbiB3aXphcmQgcGFnZQotCSAqLwotCUFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlIGRpYWxvZ1BhZ2VGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhbiBhcnJheSB3aXRoIGFsbCB0aGUgYXR0cmlidXRlcycgbmFtZSBuZWVkZWQgYnkgdGhlCi0JICogYXNzb2NpYXRlZCBjb250cm9sRmFjdG9yeS4gT25seSBjaXBoZXJlZCBhdHRyaWJ1dGVzIGFyZSBsaXN0ZWQgaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGF0dHJpYnV0ZXMnIG5hbWUKLQkgKi8KLQlTdHJpbmdbXSBnZXRDb250cm9sQXR0cmlidXRlTmFtZXNGb3JDaXBoZXJlZEtleXMoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZXh0ZW5zaW9uL0lUYXJnZXRWYXJpYWJsZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZXh0ZW5zaW9uL0lUYXJnZXRWYXJpYWJsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRiMWNmOC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2V4dGVuc2lvbi9JVGFyZ2V0VmFyaWFibGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5leHRlbnNpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVzb2x1dGlvbgotICogb2YgdmFyaWFibGVzIG9uIGVhY2ggZW52aXJvbm1lbnQgdHlwZS4gVGhpcyBpbnRlcmZhY2UgbXVzdAotICogYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBwbHVnaW4gdGhhdCBleHRlbmRzIHRoZSAKLSAqIDxleHRlbnNpb24gcG9pbnQgbmFtZSBoZXJlPiBleHRlbnNpb24gcG9pbnQKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFyZ2V0VmFyaWFibGVzIHsKLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbVdvcmtzcGFjZSgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC93aXphcmQvQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2UuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvd2l6YXJkL0Fic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3YjE5MTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC93aXphcmQvQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHVibGljIEFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQlmaW5hbCBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIW5hbWUuZXF1YWxzKCIiKSkgeyAgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBpc1ZhbGlkKCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHJldHVybiB0aGUgY29uZmlndXJhdGlvbidzIG1hcCBkZXJpdmVkIGZyb20gcG9wdWxhdGluZyB0aGlzIG93bgotCSAqIHBhZ2UuIG51bGwgaXMgbm90IGFsbG93ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIG1hcAotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBNYXAgZ2V0QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhpcyBjb25maWd1cmF0aW9uIGluc3RhbmNlIGtleSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uJ3MgbmFtZQotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3ZWF0aGVyIHRoaXMgY3VycmVudCBwYWdlIGluZm9ybWF0aW9uIHJlcHJlc2VudHMgYSB2YWxpZCBzdGF0ZSBvZgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3dpemFyZC9EaWFsb2dNZXNzYWdlcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC93aXphcmQvRGlhbG9nTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWZlODI4ZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3dpemFyZC9EaWFsb2dNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhCi0gKiBAc2luY2UgMS4zCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQuRGlhbG9nTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIERpYWxvZ01lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvd2l6YXJkL0RpYWxvZ01lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3dpemFyZC9EaWFsb2dNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjU1MmI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvd2l6YXJkL0RpYWxvZ01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUVudmlyb25tZW50V2l6YXJkLjA9VGFyZ2V0IEVudmlyb25tZW50IENvbmZpZ3VyYXRpb24KLUVudmlyb25tZW50V2l6YXJkLjE9Q29uZmlndXJhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzCi1FbnZpcm9ubWVudFdpemFyZC4yPUludmFsaWQgY29uZmlndXJhdGlvbiBuYW1lCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3dpemFyZC9FbnZpcm9ubWVudFdpemFyZC5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC93aXphcmQvRW52aXJvbm1lbnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBlY2M5ZS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3dpemFyZC9FbnZpcm9ubWVudFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuSVRhcmdldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUuVGFyZ2V0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRUeXBlRWxlbWVudDsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLQlUYXJnZXRUeXBlRWxlbWVudCB0eXBlRWxlbWVudDsKLQlJVGFyZ2V0RWxlbWVudCB0YXJnZXRFbGVtZW50OwotCVN0cmluZyBvcmlnaW5hbEtleSA9ICIiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBjYW5jZWwgPSBmYWxzZTsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRW52aXJvbm1lbnRXaXphcmQoVGFyZ2V0VHlwZUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLnR5cGVFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIEVudmlyb25tZW50V2l6YXJkKElUYXJnZXRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50eXBlRWxlbWVudCA9IGVsZW1lbnQuZ2V0VHlwZSgpOwotCQl0aGlzLnRhcmdldEVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShEaWFsb2dNZXNzYWdlcy5nZXRTdHJpbmcoIkVudmlyb25tZW50V2l6YXJkLjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9NYXAgYXR0cmlidXRlcyA9IG51bGw7Ci0JCWlmICh0YXJnZXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCS8vYXR0cmlidXRlcyA9ICBuZXcgSGFzaE1hcCh0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0JCQlvcmlnaW5hbEtleSA9IHRhcmdldEVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0JCS8vQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2UgcGFnZSA9IHR5cGVFbGVtZW50LmdldEV4dGVuc2lvbigpLmRpYWxvZ1BhZ2VGYWN0b3J5KGF0dHJpYnV0ZXMsb3JpZ2luYWxLZXkpOwotCQlBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSBwYWdlOwotCQlpZih0YXJnZXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCXBhZ2UgPSB0eXBlRWxlbWVudC5nZXRFeHRlbnNpb24oKS5kaWFsb2dQYWdlRmFjdG9yeSh0YXJnZXRFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXBhZ2UgPSB0eXBlRWxlbWVudC5nZXRFeHRlbnNpb24oKS5kaWFsb2dQYWdlRmFjdG9yeSgpOwotCQl9Ci0JCWFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmICghY2FuY2VsKSB7Ci0JCQlBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSBwYWdlID0gKChBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSlnZXRTdGFydGluZ1BhZ2UoKSk7Ci0JCQlNYXAgYXR0cmlidXRlcyA9IHBhZ2UuZ2V0QXR0cmlidXRlcygpOwotCQkJCi0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHRhcmdldEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCVN0cmluZyBpZCA9IEVudmlyb25tZW50UGx1Z2luLmdldERlZmF1bHQoKS5nZXRFbnZpcm9ubWVudFVuaXF1ZUlEKCk7Ci0JCQkJdHlwZUVsZW1lbnQuYWRkRWxlbWVudChuZXcgVGFyZ2V0RWxlbWVudCh0eXBlRWxlbWVudCxwYWdlLmdldE5hbWUoKSxhdHRyaWJ1dGVzLCBpZCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0YXJnZXRFbGVtZW50LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCQkJdGFyZ2V0RWxlbWVudC5zZXROYW1lKHBhZ2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJdGhpcy5jYW5jZWwgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0JCi0JLyoqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCQotCQlBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSBwYWdlID0gKChBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSlnZXRTdGFydGluZ1BhZ2UoKSk7Ci0JCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlpZiAoIXBhZ2UuZ2V0TmFtZSgpLmVxdWFscyhvcmlnaW5hbEtleSkpIHsKLQkJCWlmIChwYWdlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRhcmdldHNNYW5hZ2VyKCkuc2VsZWN0Q29udHJvbCgKLQkJCQkJCXBhZ2UuZ2V0TmFtZSgpICkgPT0gbnVsbCkpIHsKLQkJCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UoRGlhbG9nTWVzc2FnZXMuZ2V0U3RyaW5nKCJFbnZpcm9ubWVudFdpemFyZC4xIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IAotCQkJfSBlbHNlIHsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShEaWFsb2dNZXNzYWdlcy5nZXRTdHJpbmcoIkVudmlyb25tZW50V2l6YXJkLjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYWdlLmNhbkZpbmlzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy92ZXJpZmljYXRpb24vQXR0cmlidXRlVmVyaWZpY2F0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL3ZlcmlmaWNhdGlvbi9BdHRyaWJ1dGVWZXJpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNDhjMC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL3ZlcmlmaWNhdGlvbi9BdHRyaWJ1dGVWZXJpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy52ZXJpZmljYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVWZXJpZmljYXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoU3RyaW5nIHBsdWdpbklELCBUaHJvd2FibGUgZSwgaW50IHNldmVyaXR5LAotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gTWVzc2FnZXMuQXR0cmlidXRlVmVyaWZpY2F0aW9uX05vVmFsdWU7Ci0JCX0KLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9FcnJvck1lc3NhZ2UsIG5ldyBTdHJpbmdbXSB7IGF0dHJpYnV0ZU5hbWUsIG1lc3NhZ2UsIHZhbHVlfSk7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLAotCQkJCWVycm9yTWVzc2FnZSwgZSk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyaWMgY29udmVuaWVuY2UgbWV0aG9kIGZvciByYWlzaW5nIGNvcmUgZXhjZXB0aW9uIGZvciBlcnJvcnMuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbklECi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgc2VlIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dBdHRyaWJ1dGVFeGNlcHRpb24oU3RyaW5nIHBsdWdpbklELCBUaHJvd2FibGUgZSwKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHZhbHVlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihjcmVhdGVTdGF0dXMocGx1Z2luSUQsIGUsIElTdGF0dXMuRVJST1IsIGF0dHJpYnV0ZU5hbWUsIG1lc3NhZ2UsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJpYyBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHJhaXNpbmcgY29yZSBleGNlcHRpb24gZm9yIGVycm9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0aHJvd0F0dHJpYnV0ZUV4Y2VwdGlvbihTdHJpbmcgcGx1Z2luSUQsCi0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyB2YWx1ZSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3dBdHRyaWJ1dGVFeGNlcHRpb24ocGx1Z2luSUQsIChUaHJvd2FibGUpIG51bGwsIGF0dHJpYnV0ZU5hbWUsCi0JCQkJbWVzc2FnZSwgdmFsdWUpOwotCX0KLQotCVN0cmluZyBwbHVnaW5JRCA9IG51bGw7Ci0KLQlwdWJsaWMgQXR0cmlidXRlVmVyaWZpY2F0aW9uKFN0cmluZyBwbHVnaW5JRCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsdWdpbklEID0gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogVGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiBmb3IgdGhlIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2Ugb2YKLQkgKiBBdHRyaWJ1dGVWZXJpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGhyb3dBdHRyaWJ1dGVFeGNlcHRpb24oVGhyb3dhYmxlIGUsCi0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyB2YWx1ZSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gTWVzc2FnZXMuQXR0cmlidXRlVmVyaWZpY2F0aW9uX05vVmFsdWU7Ci0JCX0KLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9FcnJvck1lc3NhZ2UsIG5ldyBTdHJpbmdbXSB7IGF0dHJpYnV0ZU5hbWUsIG1lc3NhZ2UsIHZhbHVlfSk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSUQsIDAsCi0JCQkJZXJyb3JNZXNzYWdlLCBlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiBmb3IgdGhlIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2Ugb2YKLQkgKiBBdHRyaWJ1dGVWZXJpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBzZWUgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHNlZSBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGhyb3dBdHRyaWJ1dGVFeGNlcHRpb24oU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3dBdHRyaWJ1dGVFeGNlcHRpb24oKFRocm93YWJsZSludWxsLCBhdHRyaWJ1dGVOYW1lLCBtZXNzYWdlLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHN0cmluZyByZXByZXNlbnRzIGEgdmFsaWQgcGFyc2FibGUgcGF0aCwgcmV0dXJucyB0aGlzIHBhdGguCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgTmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGgKLQkgKiBAcGFyYW0gcGF0aFR5cGUgQ2xhc3MgdXNlZCB0byBjcmVhdGUgcGF0aAotCSAqIEByZXR1cm4gVGhlIHBhdGggcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUGF0aCB2ZXJpZnlQYXRoKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCS8vIFZlcmlmeSBwYXRoCi0JCS8vIFZlcnkgc3RyYW5nZSBkZXNpZ24gZm9yIElQYXRoIGludGVyZmFjZSBmb3IgdGVzdGluZyB2YWxpZGl0eS4KLQkJaWYgKCEgcGF0aC5pc1ZhbGlkUGF0aChzdHJpbmdWYWx1ZSkpIHsKLQkJCXRocm93QXR0cmlidXRlRXhjZXB0aW9uKGF0dHJpYnV0ZU5hbWUsIE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9JbnZhbGlkUGF0aCwgc3RyaW5nVmFsdWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJU1QgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdSSVRFQUJMRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUT1JZID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRBQkxFID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJU1RJTkdfRklMRSA9IEVYSVNUIHwgRklMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElTVElOR19FWEVDVVRBQkxFID0gRVhJU1QgfCBGSUxFIHwgRVhFQ1VUQUJMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElTVElOR19ESVJFQ1RPUlkgPSBFWElTVCB8IERJUkVDVE9SWTsKLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja1BhdGgoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIGNoZWNrUGF0aChhdHRyaWJ1dGVOYW1lLCBwYXRoLCBJU3RhdHVzLkVSUk9SLCBFWElTVCk7Ci0JfQotCQkJCi0JcHVibGljIElTdGF0dXMgY2hlY2tQYXRoKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBJUGF0aCBwYXRoLCBpbnQgc2V2ZXJpdHkpIHsKLQkJcmV0dXJuIGNoZWNrUGF0aChhdHRyaWJ1dGVOYW1lLCBwYXRoLCBzZXZlcml0eSwgRVhJU1QpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja1BhdGgoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIElQYXRoIHBhdGgsIGludCBzZXZlcml0eSwgaW50IG9wdGlvbnMpIHsKLQkJLyoKLQkJICogUGF0aCBtdXN0IGJlIGFic29sdXRlIGZvciBzYWZlIGNoZWNrLCBpZiBub3QsIHdvdWxkIGNoZWNrIGFnYWluc3QKLQkJICogc29tZSB1bmtub3duIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JCSAqLwotCQlpZiAoISBwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhwbHVnaW5JRCwgbnVsbCwgc2V2ZXJpdHksIGF0dHJpYnV0ZU5hbWUsIE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9Ob3RBbkFic29sdXRlUGF0aCwgcGF0aC50b09TU3RyaW5nKCkpOwotCQl9Ci0KLQkJVVJJIHVyaSA9IFVSSVV0aWwudG9VUkkocGF0aCk7Ci0JCUlGaWxlU3RvcmUgZmlsZTsKLQkJdHJ5IHsKLQkJCWZpbGUgPSBFRlMuZ2V0U3RvcmUodXJpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQkKLQkJSUZpbGVJbmZvIGluZm8gPSBmaWxlLmZldGNoSW5mbygpOwotCQkKLQkJaWYgKChvcHRpb25zICYgRVhJU1QpICE9IDApIHsKLQkJCWlmICghIGluZm8uZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHBsdWdpbklELCBudWxsLCBzZXZlcml0eSwgYXR0cmlidXRlTmFtZSwgTWVzc2FnZXMuQXR0cmlidXRlVmVyaWZpY2F0aW9uX1BhdGhEb2VzTm90RXhpc3QsIHBhdGgudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKChvcHRpb25zICYgRElSRUNUT1JZKSAhPSAwKSB7Ci0JCQlpZiAoISBpbmZvLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHBsdWdpbklELCBudWxsLCBzZXZlcml0eSwgYXR0cmlidXRlTmFtZSwgTWVzc2FnZXMuQXR0cmlidXRlVmVyaWZpY2F0aW9uX1BhdGhJc05vdERpciwgcGF0aC50b09TU3RyaW5nKCkpOwkJCQotCQkJfQotCQl9Ci0KLQkJaWYgKChvcHRpb25zICYgRVhFQ1VUQUJMRSkgIT0gMCkgewotCQkJLyoKLQkJCSAqIE9uIFBQQywgaXQgaXMga25vd24gdGhhdCB0aGUgRUZTLkFUVFJJQlVURV9FWEVDVVRBQkxFIGlzIG5ldmVyIHNldCwKLQkJCSAqIGV2ZW50IGlmIHRoZSBwYXRoIGlzIGFuIGV4ZWN1dGFibGUgZmllbC4KLQkJCSAqLwotCQkJaWYgKFBsYXRmb3JtLmdldE9TQXJjaCgpLmVxdWFscyhQbGF0Zm9ybS5BUkNIX1BQQykpIHsKLQkJCQkvLyBTaW1wbGUgaWdub3JlIGFuZCBhc3N1bWUgaXQgaXMgYW4gZXhlY3V0YWJsZS4KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEgaW5mby5nZXRBdHRyaWJ1dGUoRUZTLkFUVFJJQlVURV9FWEVDVVRBQkxFKSkgewotCQkJCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHBsdWdpbklELCBudWxsLCBzZXZlcml0eSwgYXR0cmlidXRlTmFtZSwgTWVzc2FnZXMuQXR0cmlidXRlVmVyaWZpY2F0aW9uX1BhdGhJc05vdEV4ZWN1dGFibGVGaWxlLCBwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKChvcHRpb25zICYgV1JJVEVBQkxFKSAhPSAwKSB7Ci0JCQlpZiAoaW5mby5nZXRBdHRyaWJ1dGUoRUZTLkFUVFJJQlVURV9SRUFEX09OTFkpKSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhwbHVnaW5JRCwgbnVsbCwgc2V2ZXJpdHksIGF0dHJpYnV0ZU5hbWUsIE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoSXNOb3RXcml0YWJsZSwgcGF0aC50b09TU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoKG9wdGlvbnMgJiBGSUxFKSAhPSAwKSB7Ci0JCQlpZiAoaW5mby5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhwbHVnaW5JRCwgbnVsbCwgc2V2ZXJpdHksIGF0dHJpYnV0ZU5hbWUsIE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoSXNOb3RGaWxlLCBwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggdmVyaWZ5UGx1Z2luUmVsYXRpdmVQYXRoKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBQbHVnaW4gcGx1Z2luLCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChwbHVnaW4uZ2V0QnVuZGxlKCksIHBhdGgsIG51bGwpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJdGhyb3dBdHRyaWJ1dGVFeGNlcHRpb24oYXR0cmlidXRlTmFtZSwgTWVzc2FnZXMuQXR0cmlidXRlVmVyaWZpY2F0aW9uX1BhdGhOb3RGb3VuZCwgcGF0aC50b09TU3RyaW5nKCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQl1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQkJVVJJIHVyaSA9IG5ldyBVUkkodXJsLnRvU3RyaW5nKCkpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQl0aHJvd0F0dHJpYnV0ZUV4Y2VwdGlvbihhdHRyaWJ1dGVOYW1lLCBNZXNzYWdlcy5BdHRyaWJ1dGVWZXJpZmljYXRpb25fUGF0aE5vdEZvdW5kLCBwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJCXRocm93QXR0cmlidXRlRXhjZXB0aW9uKGF0dHJpYnV0ZU5hbWUsIE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9NdXN0QmVMb2NhbEZpbGUsIHBhdGgudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwdWJsaWMgSVBhdGggdmVyaWZ5V29ya3NwYWNlUmVsYXRpdmVQYXRoKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBQbHVnaW4gcGx1Z2luLCBJUGF0aCBwYXRoKSB7Ci0vLwkJLy8gVE9ETzogSW1wbGVtZW50Ci0vLwotLy8JfQotCi0JcHVibGljIElTdGF0dXMgY3JlYXRlUmVzdWx0U3RhdHVzKExpc3QgZXJyb3JzKSB7Ci0JCS8qCi0JCSAqIFJlbW92ZSBudWxsIGVsZW1lbnRzIGZyb20gbGlzdC4KLQkJICovCi0JCUxpc3Qgb2xkTGlzdCA9IGVycm9yczsKLQkJZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG9sZExpc3QuaXRlcmF0b3IoKTsgCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQllcnJvcnMuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkKLQkJaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIHBsdWdpbklELCAwLCBNZXNzYWdlcy5BdHRyaWJ1dGVWZXJpZmljYXRpb25fQ29uZmlndXJhdGlvbk9LLCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUT0RPOiBtYWtlIGNvZGUgYmV0dGVyLCB3aXRob3V0IGl0ZXJhdG9yCi0JCQkgKi8gCi0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSUQsIDAsIE1lc3NhZ2VzLkF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9JbnZhbGlkQ29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvcjIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgCi0JCQl3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJCUlTdGF0dXMgb2JqZWN0ID0gKElTdGF0dXMpIGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvdmVyaWZpY2F0aW9uL0NvbnRyb2xBdHRyaWJ1dGVzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL3ZlcmlmaWNhdGlvbi9Db250cm9sQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM1M2E2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvdmVyaWZpY2F0aW9uL0NvbnRyb2xBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMudmVyaWZpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotcHVibGljIGNsYXNzIENvbnRyb2xBdHRyaWJ1dGVzIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotCU1hcCBjdXJyZW50TWFwID0gbnVsbDsKLQotCU1hcCBkZWZhdWx0TWFwID0gbnVsbDsKLQotCS8qKiBDcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aG91dCBkZWZhdWx0IHZhbHVlcy4gKi8KLQlwdWJsaWMgQ29udHJvbEF0dHJpYnV0ZXMoTWFwIGNvbmZpZykgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRNYXAgPSBjb25maWc7Ci0JCXRoaXMuZGVmYXVsdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JLyoqIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgdmFsdWVzLiAqLwotCXB1YmxpYyBDb250cm9sQXR0cmlidXRlcyhNYXAgY3VycmVudE1hcCwgTWFwIGRlZmF1bHRNYXApIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXJyZW50TWFwID0gY3VycmVudE1hcDsKLQkJdGhpcy5kZWZhdWx0TWFwID0gZGVmYXVsdE1hcDsKLQl9Ci0KLQkvKiogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSwgaWYgYXZhaWxhYmxlLiAqLwotCXByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYgKGN1cnJlbnRNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIGN1cnJlbnRNYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCS8qKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLCBpZiBhdmFpbGFibGUuICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlpZiAoZGVmYXVsdE1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZykgZGVmYXVsdE1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJQ29udHJvbEF0dHJpYnV0ZXMgbmV3T2JqZWN0ID0gbmV3IENvbnRyb2xBdHRyaWJ1dGVzKG51bGwpOwotCQlpZiAoY3VycmVudE1hcCAhPSBudWxsKSB7Ci0JCQluZXdPYmplY3QuY3VycmVudE1hcCA9IG5ldyBIYXNoTWFwKGN1cnJlbnRNYXApOwotCQl9Ci0JCWlmIChkZWZhdWx0TWFwICE9IG51bGwpIHsKLQkJCW5ld09iamVjdC5kZWZhdWx0TWFwID0gbmV3IEhhc2hNYXAoZGVmYXVsdE1hcCk7Ci0JCX0KLQkJcmV0dXJuIG5ld09iamVjdDsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogU2FmZSBHRVRURVJTIFRoZSBzYWZlIGdldHRlcnMgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLCBpZiBhdmFpbGFibGUgYW5kCi0JICogcGFyc2VhYmxlLiBPdGhlcndpc2UsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlIGFuZAotCSAqIHBhcnNlYWJsZS4gT3RoZXJ3aXNlLCByZXR1cm4gc29tZSBoYXJkLWNvZGVkIGZhbGxiYWNrIHZhbHVlLiBJZiB0aGUKLQkgKiBjdXJyZW50IHZhbHVlIGNhbm5vdCBiZSBwYXJzZWQsIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGJ1dCB0aGUgZGVmYXVsdAotCSAqIHZhbHVlIGlzIHVzZWQuCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlIGFzIHN0cmluZy4gSWYgbm90IGF2YWlsYWJsZSBvciBub3QgcGFyc2VhYmxlLCBnZXQKLQkgKiBkZWZhdWx0LiBJZiBkZWZhdWx0IG5vdCBhdmFpbGFibGUsIGdldCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU9yRGVmYXVsdChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXRDdXJyZW50KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldERlZmF1bHQoYXR0cmlidXRlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGF0dHJpYnV0ZSBhcyBzdHJpbmcuIElmIG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogZGVmYXVsdC4gSWYgZGVmYXVsdCBub3QgYXZhaWxhYmxlIG9yIG5vdCBwYXJzZWFibGUsIGdldCBlbXB0eSBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGF0dHJpYnV0ZUtleSkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKGF0dHJpYnV0ZUtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgYXMgc3RyaW5nLiBJZiBub3QgYXZhaWxhYmxlIG9yIG5vdCBwYXJzZWFibGUsIGdldAotCSAqIGRlZmF1bHQuIElmIGRlZmF1bHQgbm90IGF2YWlsYWJsZSBvciBub3QgcGFyc2VhYmxlLCBnZXQgcGFyYW1ldGVyIGRlZmF1bHQKLQkgKiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgYXR0cmlidXRlS2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IGdldEF0dHJpYnV0ZU9yRGVmYXVsdChhdHRyaWJ1dGVLZXkpOwotCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCXJldHVybiBzdHJpbmdWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGF0dHJpYnV0ZSBhcyB0ZXh0IChtdWx0aSBsaW5lIHN0cmluZykuIElmIG5vdCBhdmFpbGFibGUgb3Igbm90Ci0JICogcGFyc2VhYmxlLCBnZXQgZGVmYXVsdC4gSWYgZGVmYXVsdCBub3QgYXZhaWxhYmxlIG9yIG5vdCBwYXJzZWFibGUsIGdldAotCSAqIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGF0dHJpYnV0ZUtleSkgewotCQlyZXR1cm4gZ2V0VGV4dChhdHRyaWJ1dGVLZXksICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlIGFzIHRleHQgKG11bHRpIGxpbmUgc3RyaW5nKS4gSWYgbm90IGF2YWlsYWJsZSBvciBub3QKLQkgKiBwYXJzZWFibGUsIGdldCBkZWZhdWx0LiBJZiBkZWZhdWx0IG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBhdHRyaWJ1dGVLZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHRleHRWYWx1ZSA9IGdldEF0dHJpYnV0ZU9yRGVmYXVsdChhdHRyaWJ1dGVLZXkpOwotCQlpZiAodGV4dFZhbHVlID09IG51bGwpCi0JCQl0ZXh0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRleHRWYWx1ZSA9IHRleHRWYWx1ZS5yZXBsYWNlQWxsKCJcXG4iLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRleHRWYWx1ZSA9IHRleHRWYWx1ZS5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gdGV4dFZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlIGFzIGJvb2xlYW4uIElmIG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogZGVmYXVsdC4gSWYgZGVmYXVsdCBub3QgYXZhaWxhYmxlIG9yIG5vdCBwYXJzZWFibGUsIGdldCBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBhdHRyaWJ1dGVLZXkpIHsKLQkJcmV0dXJuIGdldEJvb2xlYW4oYXR0cmlidXRlS2V5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgYXMgYm9vbGVhbi4gSWYgbm90IGF2YWlsYWJsZSBvciBub3QKLQkgKiBwYXJzZWFibGUsIGdldCBkZWZhdWx0LiBJZiBkZWZhdWx0IG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgYXR0cmlidXRlS2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgc3RyaW5nID0gZ2V0QXR0cmlidXRlT3JEZWZhdWx0KGF0dHJpYnV0ZUtleSk7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3RyaW5nKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlIGFzIGludGVnZXIuIElmIG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogZGVmYXVsdC4gSWYgZGVmYXVsdCBub3QgYXZhaWxhYmxlIG9yIG5vdCBwYXJzZWFibGUsIGdldCB6ZXJvLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZWdlcihTdHJpbmcgYXR0cmlidXRlS2V5KSB7Ci0JCXJldHVybiBnZXRJbnRlZ2VyKGF0dHJpYnV0ZUtleSwgMCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgYXMgaW50ZWdlci4gSWYgbm90IGF2YWlsYWJsZSBvciBub3QKLQkgKiBwYXJzZWFibGUsIGdldCBkZWZhdWx0LiBJZiBkZWZhdWx0IG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlZ2VyKFN0cmluZyBhdHRyaWJ1dGVLZXksIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHN0cmluZyA9IGdldEF0dHJpYnV0ZU9yRGVmYXVsdChhdHRyaWJ1dGVLZXkpOwotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlMSkgewotCQkJdHJ5IHsKLQkJCQlzdHJpbmcgPSBnZXREZWZhdWx0KGF0dHJpYnV0ZUtleSk7Ci0JCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTIpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgYXMgZG91YmxlLiBJZiBub3QgYXZhaWxhYmxlIG9yIG5vdCBwYXJzZWFibGUsIGdldAotCSAqIGRlZmF1bHQuIElmIGRlZmF1bHQgbm90IGF2YWlsYWJsZSBvciBub3QgcGFyc2VhYmxlLCBnZXQgemVyby4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgYXR0cmlidXRlS2V5KSB7Ci0JCXJldHVybiBnZXREb3VibGVBdHRyaWJ1dGUoYXR0cmlidXRlS2V5LCAwLjApOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlIGFzIGRvdWJsZS4gSWYgbm90IGF2YWlsYWJsZSBvciBub3QKLQkgKiBwYXJzZWFibGUsIGdldCBkZWZhdWx0LiBJZiBkZWZhdWx0IG5vdCBhdmFpbGFibGUgb3Igbm90IHBhcnNlYWJsZSwgZ2V0Ci0JICogcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIGF0dHJpYnV0ZUtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgc3RyaW5nID0gZ2V0QXR0cmlidXRlT3JEZWZhdWx0KGF0dHJpYnV0ZUtleSk7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIERvdWJsZS5wYXJzZURvdWJsZShzdHJpbmcpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsKLQkJCXRyeSB7Ci0JCQkJc3RyaW5nID0gZ2V0RGVmYXVsdChhdHRyaWJ1dGVLZXkpOwotCQkJCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBEb3VibGUucGFyc2VEb3VibGUoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTIpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIE9sZCBHRVRURVJTIFRoZXkgYXJlIGRlcHJlY2F0ZWQuCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qKiBAZGVwcmVjYXRlZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5BdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZUtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIGdldEJvb2xlYW4oYXR0cmlidXRlS2V5LCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKiBAZGVwcmVjYXRlZCAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZWdlckF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlS2V5LCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBnZXRJbnRlZ2VyKGF0dHJpYnV0ZUtleSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKiogQGRlcHJlY2F0ZWQgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlS2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBnZXREb3VibGUoYXR0cmlidXRlS2V5LCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKiBAZGVwcmVjYXRlZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVLZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIGdldFN0cmluZyhhdHRyaWJ1dGVLZXksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqIEBkZXByZWNhdGVkICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVLZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIGdldFRleHQoYXR0cmlidXRlS2V5LCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBWZXJpZnlpbmcgR0VUVEVSUwotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgdmVyaWZ5SW50QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlS2V5LAotCQkJaW50IGRlZmF1bHRWYWx1ZSkgdGhyb3dzIElsbGVnYWxBdHRyaWJ1dGVFeGNlcHRpb24gewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSBnZXRBdHRyaWJ1dGVPckRlZmF1bHQoYXR0cmlidXRlS2V5KTsKLQkJaWYgKHN0cmluZ1ZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZ1ZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKGUsIGF0dHJpYnV0ZU5hbWUsCi0JCQkJCU1lc3NhZ2VzLkNvbnRyb2xBdHRyaWJ1dGVzX0ludmFsaWRJbnRlZ2VyTnVtYmVyLCBzdHJpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHZlcmlmeUludChTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZUtleSkKLQkJCXRocm93cyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmVyaWZ5U3RyaW5nKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZUtleSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHJpbmdWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbihlLCBhdHRyaWJ1dGVOYW1lLAotCQkJCQlNZXNzYWdlcy5Db250cm9sQXR0cmlidXRlc19JbnZhbGlkSW50ZWdlck51bWJlciwgc3RyaW5nVmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgZG91YmxlIHZlcmlmeURvdWJsZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwKLQkJCVN0cmluZyBhdHRyaWJ1dGVLZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpCi0JCQl0aHJvd3MgSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IGdldEF0dHJpYnV0ZU9yRGVmYXVsdChhdHRyaWJ1dGVLZXkpOwotCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHN0cmluZ1ZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKGUsIGF0dHJpYnV0ZU5hbWUsCi0JCQkJCU1lc3NhZ2VzLkNvbnRyb2xBdHRyaWJ1dGVzX0ludmFsaWREZWNpbWFsTnVtYmVyLCBzdHJpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZG91YmxlIHZlcmlmeURvdWJsZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZUtleSkKLQkJCXRocm93cyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmVyaWZ5U3RyaW5nKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZUtleSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHN0cmluZ1ZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKGUsIGF0dHJpYnV0ZU5hbWUsCi0JCQkJCU1lc3NhZ2VzLkNvbnRyb2xBdHRyaWJ1dGVzX0ludmFsaWREZWNpbWFsTnVtYmVyLCBzdHJpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVBhdGggdmVyaWZ5UGF0aChTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZUtleSkKLQkJCXRocm93cyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmVyaWZ5U3RyaW5nKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZUtleSk7Ci0KLQkJLy8gVE9ETzogSW1wbGVtZW50IGEgcHJvcGVyIGNoZWNraW5nCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXBhdGguaXNWYWxpZFBhdGgoc3RyaW5nVmFsdWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbihhdHRyaWJ1dGVOYW1lLAotCQkJCQlNZXNzYWdlcy5Db250cm9sQXR0cmlidXRlc19JbnZhbGlkUGF0aCwgc3RyaW5nVmFsdWUpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aChzdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB2ZXJpZnlTdHJpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVLZXkpCi0JCQl0aHJvd3MgSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IGdldEF0dHJpYnV0ZU9yRGVmYXVsdChhdHRyaWJ1dGVLZXkpOwotCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBdHRyaWJ1dGVFeGNlcHRpb24oYXR0cmlidXRlTmFtZSwKLQkJCQkJTWVzc2FnZXMuQ29udHJvbEF0dHJpYnV0ZXNfTXVzdE5vdEJlRW1wdHkpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdWYWx1ZTsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogU0VUVEVSUwotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZUtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWN1cnJlbnRNYXAucHV0KGF0dHJpYnV0ZUtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmluZ0F0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlS2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlKGF0dHJpYnV0ZUtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlS2V5LCBpbnQgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlKGF0dHJpYnV0ZUtleSwgSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvdWJsZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlS2V5LCBkb3VibGUgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlKGF0dHJpYnV0ZUtleSwgRG91YmxlLnRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhbkF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlS2V5LCBib29sZWFuIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZShhdHRyaWJ1dGVLZXksIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVLZXksIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgdGV4dFZhbHVlID0gdmFsdWU7Ci0JCXRleHRWYWx1ZSA9IHRleHRWYWx1ZS5yZXBsYWNlQWxsKCJcXCIsICJcXFxcIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXh0VmFsdWUgPSB0ZXh0VmFsdWUucmVwbGFjZUFsbCgiXG4iLCAiXFxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXRBdHRyaWJ1dGUoYXR0cmlidXRlS2V5LCB0ZXh0VmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy92ZXJpZmljYXRpb24vSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy92ZXJpZmljYXRpb24vSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ5ZGEyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvdmVyaWZpY2F0aW9uL0lsbGVnYWxBdHRyaWJ1dGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnZlcmlmaWNhdGlvbjsKLQotcHVibGljIGNsYXNzIElsbGVnYWxBdHRyaWJ1dGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JU3RyaW5nIG5hbWU7Ci0JU3RyaW5nIHZhbHVlOwotCQotCXB1YmxpYyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKCkgewotCX0KLQotCXB1YmxpYyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSArICI6ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJbGxlZ2FsQXR0cmlidXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN1cGVyKG5hbWUgKyAiOiAiICsgbWVzc2FnZSArICIoICIgKyB2YWx1ZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbihFeGNlcHRpb24gZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3VwZXIobmFtZSArICI6ICIgKyBtZXNzYWdlICsgIiggIiArIHZhbHVlICsgIikiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy92ZXJpZmljYXRpb24vTWVzc2FnZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvdmVyaWZpY2F0aW9uL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNzgyZTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy92ZXJpZmljYXRpb24vTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnZlcmlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5jZWxsLnV0aWxzLnZlcmlmaWNhdGlvbi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fQ29uZmlndXJhdGlvbk9LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9FcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlVmVyaWZpY2F0aW9uX0ludmFsaWRDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9JbnZhbGlkUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fTXVzdEJlTG9jYWxGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9Ob3RBbkFic29sdXRlUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fTm9WYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fUGF0aERvZXNOb3RFeGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fUGF0aElzTm90RGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoSXNOb3RFeGVjdXRhYmxlRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fUGF0aElzTm90RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVWZXJpZmljYXRpb25fUGF0aElzTm90V3JpdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlVmVyaWZpY2F0aW9uX1BhdGhOb3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sQXR0cmlidXRlc19JbnZhbGlkRGVjaW1hbE51bWJlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sQXR0cmlidXRlc19JbnZhbGlkSW50ZWdlck51bWJlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sQXR0cmlidXRlc19JbnZhbGlkUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sQXR0cmlidXRlc19NdXN0Tm90QmVFbXB0eTsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL3ZlcmlmaWNhdGlvbi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy92ZXJpZmljYXRpb24vbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxODcwMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL3ZlcmlmaWNhdGlvbi9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQXR0cmlidXRlVmVyaWZpY2F0aW9uX05vVmFsdWU9bm8gdmFsdWUKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9FcnJvck1lc3NhZ2U9ezB9OiB7MX0gKHsyfSkKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9JbnZhbGlkUGF0aD1pcyBub3QgYSB2YWxpZCBwYXRoCi1BdHRyaWJ1dGVWZXJpZmljYXRpb25fTm90QW5BYnNvbHV0ZVBhdGg9aXMgbm90IGFuIGFic29sdXRlIHBhdGgKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoRG9lc05vdEV4aXN0PVBhdGggZG9lcyBub3QgZXhpc3QKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoSXNOb3REaXI9UGF0aCBpcyBub3QgYSBkaXJlY3RvcnkKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoSXNOb3RFeGVjdXRhYmxlRmlsZT1QYXRoIGlzIG5vdCBhbiBleGVjdXRhYmxlIGZpbGUKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9QYXRoSXNOb3RXcml0YWJsZT1QYXRoIGlzIG5vdCB3cml0YWJsZQotQXR0cmlidXRlVmVyaWZpY2F0aW9uX1BhdGhJc05vdEZpbGU9UGF0aCBpcyBub3QgYSBmaWxlCi1BdHRyaWJ1dGVWZXJpZmljYXRpb25fUGF0aE5vdEZvdW5kPVBhdGggbm90IGZvdW5kIGluIHBsdWctaW4KLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9NdXN0QmVMb2NhbEZpbGU9TXVzdCBiZSBhIGxvY2FsIGZpbGUKLUF0dHJpYnV0ZVZlcmlmaWNhdGlvbl9Db25maWd1cmF0aW9uT0s9Q29uZmlndXJhdGlvbiBpcyBPSwotQXR0cmlidXRlVmVyaWZpY2F0aW9uX0ludmFsaWRDb25maWd1cmF0aW9uPUNvbmZpZ3VyYXRpb24gY29udGFpbnMgaW52YWxpZCB2YWx1ZXMKLUNvbnRyb2xBdHRyaWJ1dGVzX0ludmFsaWRJbnRlZ2VyTnVtYmVyPWlzIG5vdCB2YWxpZCBpbnRlZ2VyIG51bWJlcgotQ29udHJvbEF0dHJpYnV0ZXNfSW52YWxpZERlY2ltYWxOdW1iZXI9aXMgbm90IHZhbGlkIGRlY2ltYWwgbnVtYmVyCi1Db250cm9sQXR0cmlidXRlc19JbnZhbGlkUGF0aD1pcyBub3QgdmFsaWQgcGF0aAotQ29udHJvbEF0dHJpYnV0ZXNfTXVzdE5vdEJlRW1wdHk9bXVzdCBub3QgYmUgZW1wdHkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC8uY2xhc3NwYXRoIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QvLnByb2plY3QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1NmIwNDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY4MGUwMS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMy4zLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QvYWJvdXQuaHRtbCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzgyNDJkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzOThlNGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZWJiOC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFJlbW90ZSBUb29scyBHZW5lcmljIEhvc3QKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QvcGx1Z2luLnhtbCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWQxNzI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUucmVtb3RlRW52aXJvbm1lbnRDb250cm9sRGVsZWdhdGUiPgotICAgICAgPGNvbnRyb2wKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuY29yZS5FbnZpcm9ubWVudCIKLSAgICAgICAgICAgIG5hbWU9IkdlbmVyaWMgSG9zdCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlJlbW90ZVRvb2xzUHJlZmVyZW5jZVBhZ2UuRW52aXJvbm1lbnRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QucHJlZmVyZW5jZXMudWkuUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LkdlbmVyaWNIb3N0UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJHZW5lcmljIEhvc3QiLz4gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5wcmVmZXJlbmNlcy51aS5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9BY3RpdmF0b3IuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2FlMGFhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LkVudmlyb25tZW50UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb3JlLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljb2hvc3QiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gTm90aWZpZXMgdGhlIGNvcmUgcGx1Z2luIHRvIGRlc3Ryb3kgYWxsIGVudmlyb25tZW50cy4KLQkJRW52aXJvbm1lbnRQbHVnaW4gY29yZVBsdWdpbiA9IEVudmlyb25tZW50UGx1Z2luLmdldERlZmF1bHQoKTsKLQkJY29yZVBsdWdpbi5kZXN0cm95VHlwZUVsZW1lbnRzKEVudmlyb25tZW50LmNsYXNzKTsKLQkJCi0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb25mL0F0dHJpYnV0ZU5hbWVzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb25mL0F0dHJpYnV0ZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YTczYjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvY29uZi9BdHRyaWJ1dGVOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuY29uZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogRGVmaW5lcyBuYW1lcyBvZiBhdHRyaWJ1dGVzLiBJbnRlbmRlZCBmb3IgYW4gdW5pZm9ybSBhbmQgY29uc2lzdGVudCB1c2Ugb2YgbmFtZXMgZm9yCi0gKiBhdHRyaWJ1dGVzIGluIEdVSSwgZXJyb3IgbWVzc2FnZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgYWNyb3NzIHBsdWdpbnMuCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVOYW1lcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb25mLmF0dHJpYnV0ZV9uYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTk5FQ1RJT05fQUREUkVTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05ORUNUSU9OX1BPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OTkVDVElPTl9USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9QQVNTUEhSQVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9QQVRIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR0lOX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR0lOX1VTRVJOQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNZU1RFTV9XT1JLU1BBQ0U7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXR0cmlidXRlTmFtZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlTmFtZXMoKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb25mL0RlZmF1bHRWYWx1ZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvbmYvRGVmYXVsdFZhbHVlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWY1Y2ViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvbmYvRGVmYXVsdFZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LmNvbmY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKiBAc2luY2UgMS4yLjEKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZXMgZXh0ZW5kcyBOTFMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb25mLmRlZmF1bHRzIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTEhPU1RfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR0lOX1VTRVJOQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR0lOX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTk5FQ1RJT05fQUREUkVTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05ORUNUSU9OX1BPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OTkVDVElPTl9USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9QQVRIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9QQVNTUEhSQVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElTX1BBU1NXT1JEX0FVVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1lTVEVNX1dPUktTUEFDRTsKLQkKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfSUQsIERlZmF1bHRWYWx1ZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgRGVmYXVsdFZhbHVlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19Ci0KLQkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvbmYvYXR0cmlidXRlX25hbWVzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb25mL2F0dHJpYnV0ZV9uYW1lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTFmOTZkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvbmYvYXR0cmlidXRlX25hbWVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1MT0dJTl9VU0VSTkFNRT1Vc2VyIG5hbWUgcmVtb3RlIGNvbm5lY3Rpb24KLUxPR0lOX1BBU1NXT1JEPVBhc3N3b3JkIHJlbW90ZSBjb25uZWN0aW9uCi1DT05ORUNUSU9OX0FERFJFU1M9QWRkcmVzcyBmb3IgcmVtb3RlIGNvbm5lY3Rpb24KLUNPTk5FQ1RJT05fUE9SVD1Qb3J0IGZvciByZW1vdGUgY29ubmVjdGlvbgotS0VZX1BBVEg9UGF0aCB0byBmaWxlIHdpdGggcHJpdmF0ZSBrZXkgZm9yIHJlbW90ZSBjb25uZWN0aW9uCi1LRVlfUEFTU1BIUkFTRT1QYXNzcGhyYXNlIHRvIG9wZW4gcHJpdmF0ZSBrZXkgZm9yIHJlbW90ZSBjb25uZWN0aW9uCi1DT05ORUNUSU9OX1RJTUVPVVQ9VGltZW91dCBmb3IgcmVtb3RlIGNvbm5lY3Rpb24KLVNZU1RFTV9XT1JLU1BBQ0U9TGF1bmNoIGJhc2UgZGlyZWN0b3J5CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb25mL2RlZmF1bHRzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb25mL2RlZmF1bHRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3MWJmZGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvY29uZi9kZWZhdWx0cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTE9DQUxIT1NUX1NFTEVDVElPTj10cnVlCi1MT0dJTl9VU0VSTkFNRT0KLUxPR0lOX1BBU1NXT1JEPQotQ09OTkVDVElPTl9BRERSRVNTPQotQ09OTkVDVElPTl9QT1JUPTIyCi1DT05ORUNUSU9OX1RJTUVPVVQ9NQotS0VZX1BBVEg9Ci1LRVlfUEFTU1BIUkFTRT0KLUlTX1BBU1NXT1JEX0FVVEg9dHJ1ZQotU1lTVEVNX1dPUktTUEFDRT0vdG1wL3JlbW90ZXRvb2xzCi1DSVBIRVJfVFlQRT0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvQ29uZmlnRmFjdG9yeS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvY29yZS9Db25maWdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzNzU5NmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvY29yZS9Db25maWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb25mLkF0dHJpYnV0ZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb25mLkRlZmF1bHRWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnZlcmlmaWNhdGlvbi5Db250cm9sQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMudmVyaWZpY2F0aW9uLklsbGVnYWxBdHRyaWJ1dGVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHJ1bGVzIHRvIGJ1aWxkIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBmcm9tIGFuIGF0dHJpYnV0ZSBoYXNoIG1hcC4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdGYWN0b3J5IHsKLQlNYXAgY3VycmVudE1hcCA9IG51bGw7Ci0JTWFwIGRlZmF1bHRNYXAgPSBudWxsOwotCQotCUNvbnRyb2xBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0Li4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MT0NBTEhPU1RfU0VMRUNUSU9OID0gUFJFRklYICsgImxvY2FsaG9zdC1zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MT0dJTl9VU0VSTkFNRSA9IFBSRUZJWCArICJsb2dpbi11c2VybmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xPR0lOX1BBU1NXT1JEID0gUFJFRklYICsgImxvZ2luLXBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09OTkVDVElPTl9BRERSRVNTID0gUFJFRklYICsgImNvbm5lY3Rpb24tYWRkcmVzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTk5FQ1RJT05fUE9SVCA9IFBSRUZJWCArICJjb25uZWN0aW9uLXBvcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9LRVlfUEFUSCA9IFBSRUZJWCArICJrZXktcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0tFWV9QQVNTUEhSQVNFID0gUFJFRklYICsgImtleS1wYXNzcGhyYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSVNfUEFTU1dPUkRfQVVUSCA9IFBSRUZJWCArICJpcy1wYXNzd2QtYXV0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTk5FQ1RJT05fVElNRU9VVCA9IFBSRUZJWCArICJjb25uZWN0aW9uLXRpbWVvdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWVNURU1fV09SS1NQQUNFID0gUFJFRklYICsgInN5c3RlbS13b3Jrc3BhY2UtZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0lQSEVSX1RZUEUgPSBQUkVGSVggKyAiY2lwaGVyLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBLRVlfQVJSQVkgPSB7IEFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTiwKLQkJCUFUVFJfTE9HSU5fVVNFUk5BTUUsIEFUVFJfQ09OTkVDVElPTl9QT1JULCBBVFRSX0NPTk5FQ1RJT05fQUREUkVTUywKLQkJCUFUVFJfS0VZX1BBVEgsIEFUVFJfSVNfUEFTU1dPUkRfQVVUSCwgQVRUUl9DT05ORUNUSU9OX1RJTUVPVVQsCi0JCQlBVFRSX1NZU1RFTV9XT1JLU1BBQ0UsIEFUVFJfQ0lQSEVSX1RZUEV9OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gS0VZX0NJUEhFUkVEX0FSUkFZID0geyBBVFRSX0tFWV9QQVNTUEhSQVNFLAotCQkJQVRUUl9MT0dJTl9QQVNTV09SRCB9OwotCQotCXB1YmxpYyBDb25maWdGYWN0b3J5KCkgewotCQljcmVhdGVEZWZhdWx0TWFwKCk7Ci0JCWNyZWF0ZUN1cnJlbnRNYXBGcm9tUHJlZmVyZW5jZXMoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBDb250cm9sQXR0cmlidXRlcyhjdXJyZW50TWFwLCBkZWZhdWx0TWFwKTsKLQl9Ci0JCi0JcHVibGljIENvbmZpZ0ZhY3RvcnkoTWFwIG5ld01hcCkgewotCQljcmVhdGVEZWZhdWx0TWFwKCk7Ci0JCWlmIChuZXdNYXAgPT0gbnVsbCkgewotCQkJY3JlYXRlQ3VycmVudE1hcEZyb21QcmVmZXJlbmNlcygpOwotCQl9IGVsc2UgewotCQkJY3VycmVudE1hcCA9IG5ldyBIYXNoTWFwKG5ld01hcCk7Ci0JCX0KLQkJYXR0cmlidXRlcyA9IG5ldyBDb250cm9sQXR0cmlidXRlcyhjdXJyZW50TWFwLCBkZWZhdWx0TWFwKTsKLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRNYXAoKSB7Ci0JCXJldHVybiBjdXJyZW50TWFwOwotCX0KLQkKLQlwdWJsaWMgQ29udHJvbEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0TWFwKCkgewotCQlkZWZhdWx0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9MT0NBTEhPU1RfU0VMRUNUSU9OLCBEZWZhdWx0VmFsdWVzLkxPQ0FMSE9TVF9TRUxFQ1RJT04pOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX0xPR0lOX1VTRVJOQU1FLCBEZWZhdWx0VmFsdWVzLkxPR0lOX1VTRVJOQU1FKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9MT0dJTl9QQVNTV09SRCwgRGVmYXVsdFZhbHVlcy5MT0dJTl9QQVNTV09SRCk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfQ09OTkVDVElPTl9QT1JULCBEZWZhdWx0VmFsdWVzLkNPTk5FQ1RJT05fUE9SVCk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfQ09OTkVDVElPTl9BRERSRVNTLCBEZWZhdWx0VmFsdWVzLkNPTk5FQ1RJT05fQUREUkVTUyk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfS0VZX1BBVEgsIERlZmF1bHRWYWx1ZXMuS0VZX1BBVEgpOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX0tFWV9QQVNTUEhSQVNFLCBEZWZhdWx0VmFsdWVzLktFWV9QQVNTUEhSQVNFKTsKLQkJZGVmYXVsdE1hcC5wdXQoQVRUUl9JU19QQVNTV09SRF9BVVRILCBEZWZhdWx0VmFsdWVzLklTX1BBU1NXT1JEX0FVVEgpOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX0NPTk5FQ1RJT05fVElNRU9VVCwgRGVmYXVsdFZhbHVlcy5DT05ORUNUSU9OX1RJTUVPVVQpOwotCQlkZWZhdWx0TWFwLnB1dChBVFRSX1NZU1RFTV9XT1JLU1BBQ0UsIERlZmF1bHRWYWx1ZXMuU1lTVEVNX1dPUktTUEFDRSk7Ci0JCWRlZmF1bHRNYXAucHV0KEFUVFJfQ0lQSEVSX1RZUEUsIFRhcmdldENvbnRyb2wuREVGQVVMVF9DSVBIRVIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ3VycmVudE1hcEZyb21QcmVmZXJlbmNlcygpIHsKLQkJY3VycmVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQljdXJyZW50TWFwLnB1dChBVFRSX0xPR0lOX1VTRVJOQU1FLCBzdG9yZS5nZXRTdHJpbmcoQVRUUl9MT0dJTl9VU0VSTkFNRSkpOwotCQljdXJyZW50TWFwLnB1dChBVFRSX0NPTk5FQ1RJT05fQUREUkVTUywgc3RvcmUuZ2V0U3RyaW5nKEFUVFJfQ09OTkVDVElPTl9BRERSRVNTKSk7Ci0JCWN1cnJlbnRNYXAucHV0KEFUVFJfQ09OTkVDVElPTl9QT1JULCBzdG9yZS5nZXRTdHJpbmcoQVRUUl9DT05ORUNUSU9OX1BPUlQpKTsKLQkJY3VycmVudE1hcC5wdXQoQVRUUl9TWVNURU1fV09SS1NQQUNFLCBzdG9yZS5nZXRTdHJpbmcoQVRUUl9TWVNURU1fV09SS1NQQUNFKSk7Ci0JfQotCQotCXB1YmxpYyBUYXJnZXRDb25maWcgY3JlYXRlVGFyZ2V0Q29uZmlnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJVGFyZ2V0Q29uZmlnIGNvbmZpZyA9IG5ldyBUYXJnZXRDb25maWcoKTsKLQkJCWNvbmZpZy5zZXRMb2dpblVzZXJOYW1lKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfTE9HSU5fVVNFUk5BTUUpKTsKLQkJCWNvbmZpZy5zZXRMb2dpblBhc3N3b3JkKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfTE9HSU5fUEFTU1dPUkQpKTsKLQkJCWNvbmZpZy5zZXRDb25uZWN0aW9uUG9ydChhdHRyaWJ1dGVzLnZlcmlmeUludChBdHRyaWJ1dGVOYW1lcy5DT05ORUNUSU9OX1BPUlQsIEFUVFJfQ09OTkVDVElPTl9QT1JUKSk7Ci0JCQlpZiAoYXR0cmlidXRlcy5nZXRCb29sZWFuKEFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTikpIHsKLQkJCQljb25maWcuc2V0Q29ubmVjdGlvbkFkZHJlc3MoImxvY2FsaG9zdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWNvbmZpZy5zZXRDb25uZWN0aW9uQWRkcmVzcyhhdHRyaWJ1dGVzLmdldFN0cmluZyhBVFRSX0NPTk5FQ1RJT05fQUREUkVTUykpOwotCQkJfQotCQkJY29uZmlnLnNldENvbm5lY3Rpb25UaW1lb3V0KGF0dHJpYnV0ZXMudmVyaWZ5SW50KEF0dHJpYnV0ZU5hbWVzLkNPTk5FQ1RJT05fVElNRU9VVCwgQVRUUl9DT05ORUNUSU9OX1RJTUVPVVQpKTsKLQkJCWNvbmZpZy5zZXRLZXlQYXNzcGhyYXNlKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfS0VZX1BBU1NQSFJBU0UpKTsKLQkJCWNvbmZpZy5zZXRLZXlQYXRoKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfS0VZX1BBVEgpKTsKLQkJCWNvbmZpZy5zZXRJc1Bhc3N3b3JkQXV0aChhdHRyaWJ1dGVzLmdldEJvb2xlYW4oQVRUUl9JU19QQVNTV09SRF9BVVRIKSk7Ci0JCQljb25maWcuc2V0U3lzdGVtV29ya3NwYWNlKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKEFUVFJfU1lTVEVNX1dPUktTUEFDRSkpOwotCQkJY29uZmlnLnNldENpcGhlclR5cGUoYXR0cmlidXRlcy5nZXRTdHJpbmcoQVRUUl9DSVBIRVJfVFlQRSkpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBjYXRjaCAoSWxsZWdhbEF0dHJpYnV0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvRW52aXJvbm1lbnQuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWE5MWRhMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb3JlL0Vudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklUYXJnZXRUeXBlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC51aS5Db25maWd1cmF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQud2l6YXJkLkFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlOwotCi0KLS8qKgotICogRmFjdG9yeSBmb3IgdGhlIGVudmlyb25tZW50LgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50IGltcGxlbWVudHMgSVRhcmdldFR5cGVFeHRlbnNpb24gewotCQotCXB1YmxpYyBFbnZpcm9ubWVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVRhcmdldENvbnRyb2wgY29udHJvbEZhY3RvcnkoSVRhcmdldEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRhcmdldENvbnRyb2woZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRyb2xBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIENvbmZpZ0ZhY3RvcnkuS0VZX0FSUkFZOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEVudmlyb25tZW50RGlhbG9nUGFnZSBkaWFsb2dQYWdlRmFjdG9yeShJVGFyZ2V0RWxlbWVudCB0YXJnZXRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblBhZ2UodGFyZ2V0RWxlbWVudC5nZXROYW1lKCksIHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0RW52aXJvbm1lbnREaWFsb2dQYWdlIGRpYWxvZ1BhZ2VGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25QYWdlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250cm9sQXR0cmlidXRlTmFtZXNGb3JDaXBoZXJlZEtleXMoKSB7Ci0JCXJldHVybiBDb25maWdGYWN0b3J5LktFWV9DSVBIRVJFRF9BUlJBWTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb3JlL01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb3JlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5MGVhZDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvY29yZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuY29yZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldENvbnRyb2xfY3JlYXRlX01vbml0b3JDb25uZWN0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldENvbnRyb2xfcmVzdW1lX0Nhbm5vdFJlc3VtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRDb250cm9sX3N0b3BfQ2Fubm90UGF1c2U7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX0lELCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19Ci0KLQkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvVGFyZ2V0Q29uZmlnLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb3JlL1RhcmdldENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWVjMzQzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvVGFyZ2V0Q29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuY29yZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSB0YXJnZXQgY3JlYXRlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRDb25maWcgewotCXByaXZhdGUgU3RyaW5nIGxvZ2luVXNlck5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9naW5QYXNzd29yZDsKLQlwcml2YXRlIGludCBjb25uZWN0aW9uUG9ydDsKLQlwcml2YXRlIFN0cmluZyBjb25uZWN0aW9uQWRkcmVzczsKLQlwcml2YXRlIGludCBjb25uZWN0aW9uVGltZW91dDsKLQlwcml2YXRlIFN0cmluZyBrZXlQYXRoOwotCXByaXZhdGUgU3RyaW5nIGtleVBhc3NwaHJhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUGFzc3dvcmRBdXRoOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbVdvcmtzcGFjZTsKLQlwcml2YXRlIFN0cmluZyBjaXBoZXJUeXBlOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkFkZHJlc3MoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uQWRkcmVzczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkFkZHJlc3MoU3RyaW5nIGNvbm5lY3Rpb25BZGRyZXNzKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkFkZHJlc3MgPSBjb25uZWN0aW9uQWRkcmVzczsKLQl9Ci0JcHVibGljIGludCBnZXRDb25uZWN0aW9uUG9ydCgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25Qb3J0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUG9ydChpbnQgY29ubmVjdGlvblBvcnQpIHsKLQkJdGhpcy5jb25uZWN0aW9uUG9ydCA9IGNvbm5lY3Rpb25Qb3J0OwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2luUGFzc3dvcmQoKSB7Ci0JCXJldHVybiBsb2dpblBhc3N3b3JkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRMb2dpblBhc3N3b3JkKFN0cmluZyBsb2dpblBhc3N3b3JkKSB7Ci0JCXRoaXMubG9naW5QYXNzd29yZCA9IGxvZ2luUGFzc3dvcmQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naW5Vc2VyTmFtZSgpIHsKLQkJcmV0dXJuIGxvZ2luVXNlck5hbWU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldExvZ2luVXNlck5hbWUoU3RyaW5nIGxvZ2luVXNlck5hbWUpIHsKLQkJdGhpcy5sb2dpblVzZXJOYW1lID0gbG9naW5Vc2VyTmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0S2V5UGF0aChTdHJpbmcga2V5UGF0aCkgewotCQl0aGlzLmtleVBhdGggPSBrZXlQYXRoOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRLZXlQYXNzcGhyYXNlKFN0cmluZyBrZXlQYXNzcGhyYXNlKSB7Ci0JCXRoaXMua2V5UGFzc3BocmFzZSA9IGtleVBhc3NwaHJhc2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldElzUGFzc3dvcmRBdXRoKGJvb2xlYW4gaXNQYXNzd29yZEF1dGgpIHsKLQkJdGhpcy5pc1Bhc3N3b3JkQXV0aCA9IGlzUGFzc3dvcmRBdXRoOyAKLQkJCi0JfQotCXB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblRpbWVvdXQoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uVGltZW91dDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblRpbWVvdXQoaW50IGNvbm5lY3Rpb25UaW1lb3V0KSB7Ci0JCXRoaXMuY29ubmVjdGlvblRpbWVvdXQgPSBjb25uZWN0aW9uVGltZW91dDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNQYXNzd29yZEF1dGgoKSB7Ci0JCXJldHVybiBpc1Bhc3N3b3JkQXV0aDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UGFzc3dvcmRBdXRoKGJvb2xlYW4gaXNQYXNzd29yZEF1dGgpIHsKLQkJdGhpcy5pc1Bhc3N3b3JkQXV0aCA9IGlzUGFzc3dvcmRBdXRoOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEtleVBhc3NwaHJhc2UoKSB7Ci0JCXJldHVybiBrZXlQYXNzcGhyYXNlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEtleVBhdGgoKSB7Ci0JCXJldHVybiBrZXlQYXRoOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1Xb3Jrc3BhY2UoU3RyaW5nIHN5c3RlbVdvcmtzcGFjZSkgewotCQl0aGlzLnN5c3RlbVdvcmtzcGFjZSA9IHN5c3RlbVdvcmtzcGFjZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1Xb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBzeXN0ZW1Xb3Jrc3BhY2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENpcGhlclR5cGUoU3RyaW5nIGNpcGhlclR5cGUpIHsKLQkJdGhpcy5jaXBoZXJUeXBlID0gY2lwaGVyVHlwZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRDaXBoZXJUeXBlKCkgewotCQlyZXR1cm4gY2lwaGVyVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb3JlL1RhcmdldENvbnRyb2wuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvVGFyZ2V0Q29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmM2M2M5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvVGFyZ2V0Q29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb3JlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLlJlbW90ZXRvb2xzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLklUYXJnZXRDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb250cm9sLklUYXJnZXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvbnRyb2wuU1NIVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklUYXJnZXRWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LkFjdGl2YXRvcjsKLQotLyoqCi0gKiBDb250cm9scyBhbiBpbnN0YW5jZSBvZiBhIHRhcmdldCBjcmVhdGVkIGZyb20gdGhlIEVudmlyb25tZW50LgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRDb250cm9sIGV4dGVuZHMgU1NIVGFyZ2V0Q29udHJvbCBpbXBsZW1lbnRzIElUYXJnZXRDb250cm9sLCBJVGFyZ2V0VmFyaWFibGVzIHsKLQotCS8qKgotCSAqIENvbmZpZ3VyYXRpb24gcHJvdmlkZWQgdG8gdGhlIHRhcmdldCBjb250cm9sLgotCSAqLwotCUNvbmZpZ0ZhY3RvcnkgY29uZmlnRmFjdG9yeTsKLQlUYXJnZXRDb25maWcgY3VycmVudFRhcmdldENvbmZpZzsKLQkKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSB0YXJnZXQuCi0JICovCi0JLy9TdHJpbmcgbmFtZTsKLQkKLQkvKioKLQkgKiBCYWNrUmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgZWxlbWVudAotCSAqLwotCUlUYXJnZXRFbGVtZW50IHRhcmdldEVsZW1lbnQ7Ci0JCi0JLyoqCi0JICogQ3VycmVudCBjb25uZWN0aW9uIHN0YXRlLgotCSAqLwotCXByaXZhdGUgaW50IHN0YXRlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfT1BFUkFUSU9OQUwgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU5HID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVEVEID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVElORyA9IDQ7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjaXBoZXIgaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NJUEhFUiA9IFJlbW90ZXRvb2xzUGx1Z2luLkNJUEhFUl9ERUZBVUxUOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YXJnZXQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE5hbWUgZm9yIHRoZSB0YXJnZXQgKGRpc3BsYXllZCBpbiBHVUkpCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgU29tZSBhdHRyaWJ1dGUgaXMgbm90IHZhbGlkCi0JICovCi0JcHVibGljIFRhcmdldENvbnRyb2woSVRhcmdldEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQlzdGF0ZSA9IE5PVF9PUEVSQVRJT05BTDsKLQkJdGFyZ2V0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWNvbmZpZ0ZhY3RvcnkgPSBuZXcgQ29uZmlnRmFjdG9yeSh0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0JCWN1cnJlbnRUYXJnZXRDb25maWcgPSBjb25maWdGYWN0b3J5LmNyZWF0ZVRhcmdldENvbmZpZygpOwotCX0KLQotCS8qKgotCSAqIENvbm5lY3QgdG8gdGhlIHJlbW90ZSB0YXJnZXQuLiBPbiBldmVyeSBlcnJvciBvciBwb3NzaWJsZSBmYWlsdXJlLCBhbiBleGNlcHRpb24KLQkgKiAoQ29yZUV4Y2VwdGlvbikgaXMgdGhyb3duLCB3aG9zZSAobXVsdGkpc3RhdHVzIGRlc2NyaWJlIHRoZSBlcnJvcihzKSB0aGF0IHByZXZlbnRlZCBjcmVhdGluZyB0aGUgdGFyZ2V0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIGluZGljYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gQWx3YXlzIHRydWUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgU29tZSBhdHRyaWJ1dGUgaXMgbm90IHZhbGlkLCB0aGUgc2ltdWxhdG9yIGNhbm5vdCBiZSBsYXVuY2hlZCwgdGhlIHNzaCBmYWlsZWQgdG8gY29ubmVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLlRhcmdldENvbnRyb2xfY3JlYXRlX01vbml0b3JDb25uZWN0aW5nLCAxKTsKLQkJLyoKLQkJICogIENvbm5lY3QgdG8gdGhlIHJlbW90ZSB0ZW1vdGUgdGFyZ2V0Ci0JCSAqLwotCQlpZihjdXJyZW50VGFyZ2V0Q29uZmlnLmlzUGFzc3dvcmRBdXRoKCkpIHsKLQkJCXNldENvbm5lY3Rpb25QYXJhbWV0ZXJzKAotCQkJCQluZXcgU1NIUGFyYW1ldGVycygKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldENvbm5lY3Rpb25BZGRyZXNzKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRDb25uZWN0aW9uUG9ydCgpLAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0TG9naW5Vc2VyTmFtZSgpLAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0TG9naW5QYXNzd29yZCgpLAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0Q2lwaGVyVHlwZSgpLAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0Q29ubmVjdGlvblRpbWVvdXQoKSoxMDAwCi0JCQkJCSkKLQkJCQkpOwotCQl9IGVsc2UgewotCQkJc2V0Q29ubmVjdGlvblBhcmFtZXRlcnMoCi0JCQkJCW5ldyBTU0hQYXJhbWV0ZXJzKAotCQkJCQkJCWN1cnJlbnRUYXJnZXRDb25maWcuZ2V0Q29ubmVjdGlvbkFkZHJlc3MoKSwKLQkJCQkJCQljdXJyZW50VGFyZ2V0Q29uZmlnLmdldENvbm5lY3Rpb25Qb3J0KCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRMb2dpblVzZXJOYW1lKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRLZXlQYXRoKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRLZXlQYXNzcGhyYXNlKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRDaXBoZXJUeXBlKCksCi0JCQkJCQkJY3VycmVudFRhcmdldENvbmZpZy5nZXRDb25uZWN0aW9uVGltZW91dCgpKjEwMDAKLQkJCQkJKQotCQkJCSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlzZXRTdGF0ZShDT05ORUNUSU5HKTsKLQkJCXN1cGVyLmNyZWF0ZShtb25pdG9yKTsKLQkJCXNldFN0YXRlKENPTk5FQ1RFRCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNjb25uZWN0KCk7Ci0JCQlzZXRTdGF0ZShOT1RfT1BFUkFUSU9OQUwpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldFN0YXRlKGludCBzdGF0ZSkgewotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4ga2lsbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldFN0YXRlKERJU0NPTk5FQ1RJTkcpOwotCQkJc3VwZXIua2lsbChtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldFN0YXRlKE5PVF9PUEVSQVRJT05BTCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgcXVlcnkoKSB7Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJY2FzZSBOT1RfT1BFUkFUSU9OQUw6Ci0JCQlyZXR1cm4gSVRhcmdldFN0YXR1cy5TVE9QUEVEOwotCQljYXNlIENPTk5FQ1RJTkc6Ci0JCWNhc2UgRElTQ09OTkVDVElORzoKLQkJCXJldHVybiBJVGFyZ2V0U3RhdHVzLlNUQVJURUQ7Ci0JCWNhc2UgQ09OTkVDVEVEOgotCQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCQlyZXR1cm4gSVRhcmdldFN0YXR1cy5SRVNVTUVEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gSVRhcmdldFN0YXR1cy5TVEFSVEVEOwotCQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIElUYXJnZXRTdGF0dXMuU1RPUFBFRDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlc3VtZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCAwLAotCQkJCU1lc3NhZ2VzLlRhcmdldENvbnRyb2xfcmVzdW1lX0Nhbm5vdFJlc3VtZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0b3AoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgMCwKLQkJCQlNZXNzYWdlcy5UYXJnZXRDb250cm9sX3N0b3BfQ2Fubm90UGF1c2UsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL3RhcmdldEVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJY29uZmlnRmFjdG9yeSA9IG5ldyBDb25maWdGYWN0b3J5KHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpKTsKLQkJY3VycmVudFRhcmdldENvbmZpZyA9IGNvbmZpZ0ZhY3RvcnkuY3JlYXRlVGFyZ2V0Q29uZmlnKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGFyZ2V0RWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBUYXJnZXRTb2NrZXQgY3JlYXRlVGFyZ2V0U29ja2V0KGludCBwb3J0KSB7Ci0JCUFzc2VydC5pc1RydWUoaXNDb25uZWN0ZWQoKSk7Ci0JCVRhcmdldFNvY2tldCBzb2NrZXQgPSBuZXcgVGFyZ2V0U29ja2V0KCk7Ci0JCXNvY2tldC5ob3N0ID0gY3VycmVudFRhcmdldENvbmZpZy5nZXRDb25uZWN0aW9uQWRkcmVzcygpOwotCQlzb2NrZXQucG9ydCA9IHBvcnQ7Ci0JCXJldHVybiBzb2NrZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1Xb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBjdXJyZW50VGFyZ2V0Q29uZmlnLmdldFN5c3RlbVdvcmtzcGFjZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEVuZCBhbGwgam9icywgaWYgcG9zc2libGUsIHRoZW4gZGlzY29ubmVjdAotCQl0cnkgewotCQkJdGVybWluYXRlSm9icyhudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWRpc2Nvbm5lY3QoKTsKLQkJfQotCQkKLQkJLy9zZXRTdGF0ZShOT1RfT1BFUkFUSU9OQUwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRiZTkxMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UYXJnZXRDb250cm9sX2NyZWF0ZV9Nb25pdG9yQ29ubmVjdGluZz1Db25uZWN0aW5nIHRvIGEgZ2VuZXJpYyByZW1vdGUgaG9zdAotVGFyZ2V0Q29udHJvbF9yZXN1bWVfQ2Fubm90UmVzdW1lPUEgZ2VuZXJpYyByZW1vdGUgaG9zdCBjYW5ub3QgYmUgcmVzdW1lZCBmcm9tIHBhdXNlCi1UYXJnZXRDb250cm9sX3N0b3BfQ2Fubm90UGF1c2U9QSBnZW5lcmljIHJlbW90ZSBob3N0IGNhbm5vdCBiZSBwYXVzZWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3ByZWZlcmVuY2VzL3VpL01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9wcmVmZXJlbmNlcy91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjNlMWUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3ByZWZlcmVuY2VzL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZVBhZ2VfSGVhZGVyQ29ubmVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlUGFnZV9MYWJlbENvbm5lY3Rpb25Qb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcmVuY2VQYWdlX0xhYmVsQ29ubmVjdGlvbkFkZHJlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZVBhZ2VfTGFiZWxMb2dpblVzZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcmVuY2VQYWdlX0hlYWRlckxhdW5jaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlUGFnZV9MYWJlbFN5c3RlbVdvcmtzcGFjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlUGFnZV9UaXRsZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5wcmVmZXJlbmNlcy51aS5tZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9wcmVmZXJlbmNlcy91aS9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3ByZWZlcmVuY2VzL3VpL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmU4YWViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3ByZWZlcmVuY2VzL3VpL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5jb25mLkRlZmF1bHRWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LmNvcmUuQ29uZmlnRmFjdG9yeTsKLQotCi0vKioKLSAqIEluaXRpYWxpemVzIHByZWZlcmVuY2UgdmFsdWVzCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwsIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjIuMQotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkvL1ByZWZlcmVuY2VzUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDb25maWdGYWN0b3J5LkFUVFJfTE9HSU5fVVNFUk5BTUUsIERlZmF1bHRWYWx1ZXMuTE9HSU5fVVNFUk5BTUUpOwotCQlzdG9yZS5zZXREZWZhdWx0KENvbmZpZ0ZhY3RvcnkuQVRUUl9DT05ORUNUSU9OX0FERFJFU1MsIERlZmF1bHRWYWx1ZXMuQ09OTkVDVElPTl9BRERSRVNTKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9QT1JULCBEZWZhdWx0VmFsdWVzLkNPTk5FQ1RJT05fUE9SVCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ29uZmlnRmFjdG9yeS5BVFRSX1NZU1RFTV9XT1JLU1BBQ0UsIERlZmF1bHRWYWx1ZXMuU1lTVEVNX1dPUktTUEFDRSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvcHJlZmVyZW5jZXMvdWkvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3ByZWZlcmVuY2VzL3VpL1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwZWQ1ZjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvcHJlZmVyZW5jZXMvdWkvUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkludGVnZXJGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LmNvcmUuQ29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RCYXNlRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkuTGFiZWxGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkuU3BhY2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIHJlbW90ZSB0YXJnZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyB0YXJnZXRzLgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0QmFzZUZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIFByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLQkJCi0JCS8vIHNldERlc2NyaXB0aW9uIG11c3QgYmUgY2FsbGVkIGhlcmUgb3IgaXQgd29udCB3b3JrCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlByZWZlcmVuY2VQYWdlX0Rlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCS8vIHNldFRpdGxlIG11c3QgYmUgY2FsbGVkIGhlcmUgb3IgaXQgd29udCB3b3JrCi0JCXNldFRpdGxlKE1lc3NhZ2VzLlByZWZlcmVuY2VQYWdlX1RpdGxlKTsKLQkJCi0JCWFkZEZpZWxkKG5ldyBMYWJlbEZpZWxkRWRpdG9yKE1lc3NhZ2VzLlByZWZlcmVuY2VQYWdlX0hlYWRlckNvbm5lY3Rpb24sIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQotCQlTdHJpbmdGaWVsZEVkaXRvciBhZGRyZmllbGQgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fQUREUkVTUywKLQkJCQlNZXNzYWdlcy5QcmVmZXJlbmNlUGFnZV9MYWJlbENvbm5lY3Rpb25BZGRyZXNzLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJYWRkcmZpZWxkLnNldEVtcHR5U3RyaW5nQWxsb3dlZCh0cnVlKTsKLQkJYWRkRmllbGQoYWRkcmZpZWxkKTsKLQotCQlJbnRlZ2VyRmllbGRFZGl0b3IgcG9ydGZpZWxkID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcihDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9QT1JULAotCQkJCU1lc3NhZ2VzLlByZWZlcmVuY2VQYWdlX0xhYmVsQ29ubmVjdGlvblBvcnQsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotCQlwb3J0ZmllbGQuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKLQkJYWRkRmllbGQocG9ydGZpZWxkKTsKLQotCQlTdHJpbmdGaWVsZEVkaXRvciB1c2VyZmllbGQgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoQ29uZmlnRmFjdG9yeS5BVFRSX0xPR0lOX1VTRVJOQU1FLAotCQkJCU1lc3NhZ2VzLlByZWZlcmVuY2VQYWdlX0xhYmVsTG9naW5Vc2VyTmFtZSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCXVzZXJmaWVsZC5zZXRFbXB0eVN0cmluZ0FsbG93ZWQodHJ1ZSk7Ci0JCWFkZEZpZWxkKHVzZXJmaWVsZCk7Ci0KLQkJYWRkRmllbGQobmV3IExhYmVsRmllbGRFZGl0b3IoTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfSGVhZGVyTGF1bmNoLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0JCQotCQlTdHJpbmdGaWVsZEVkaXRvciBzeXN0ZW1Xb3Jrc3BhY2VEaXIgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoQ29uZmlnRmFjdG9yeS5BVFRSX1NZU1RFTV9XT1JLU1BBQ0UsCi0JCQkJTWVzc2FnZXMuUHJlZmVyZW5jZVBhZ2VfTGFiZWxTeXN0ZW1Xb3Jrc3BhY2UsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotCQlzeXN0ZW1Xb3Jrc3BhY2VEaXIuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKLQkJYWRkRmllbGQoc3lzdGVtV29ya3NwYWNlRGlyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0Jdm9pZCBhZGRTcGFjZSgpIHsKLQkJU3BhY2VyRmllbGRFZGl0b3Igc3BhY2VyMSA9IG5ldyBTcGFjZXJGaWVsZEVkaXRvcihnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJYWRkRmllbGQoc3BhY2VyMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9wcmVmZXJlbmNlcy91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvcHJlZmVyZW5jZXMvdWkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDJkMTFjMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC9wcmVmZXJlbmNlcy91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1QcmVmZXJlbmNlUGFnZV9IZWFkZXJDb25uZWN0aW9uPUNvbm5lY3Rpb24gdG8gcmVtb3RlIGhvc3Q6Ci1QcmVmZXJlbmNlUGFnZV9MYWJlbENvbm5lY3Rpb25Qb3J0PVBvcnQgbnVtYmVyOgotUHJlZmVyZW5jZVBhZ2VfTGFiZWxDb25uZWN0aW9uQWRkcmVzcz1BZGRyZXNzOgotUHJlZmVyZW5jZVBhZ2VfTGFiZWxMb2dpblVzZXJOYW1lPVVzZXIgbmFtZToKLVByZWZlcmVuY2VQYWdlX0hlYWRlckxhdW5jaD1DL0MrKyBnZW5lcmljIGhvc3QgdGFyZ2V0IGxhdW5jaCBwcm9wZXJ0aWVzOgotUHJlZmVyZW5jZVBhZ2VfTGFiZWxTeXN0ZW1Xb3Jrc3BhY2U9TGF1bmNoIGJhc2UgZGlyZWN0b3J5OgotUHJlZmVyZW5jZVBhZ2VfRGVzY3JpcHRpb249RGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBuZXcgZ2VuZXJpYyBob3N0IFRhcmdldHMKLVByZWZlcmVuY2VQYWdlX1RpdGxlPUdlbmVyaWMgSG9zdApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvdWkvQ29uZmlndXJhdGlvblBhZ2UuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3VpL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2NzE5M2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0L3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvZ2VuZXJpY2hvc3QvdWkvQ29uZmlndXJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmdlbmVyaWNob3N0LmNvcmUuQ29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3QuY29yZS5UYXJnZXRDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQuQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnZlcmlmaWNhdGlvbi5Db250cm9sQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkF1dGhlbnRpY2F0aW9uRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5BdXRoZW50aWNhdGlvbkZyYW1lTW9sZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkNvbWJvR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5Db21ib0dyb3VwSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkuc3d0LkZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuVGV4dEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuVGV4dE1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbCwgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RFbnZpcm9ubWVudERpYWxvZ1BhZ2UgewotCUNvbmZpZ0ZhY3RvcnkgY29uZmlnRmFjdG9yeSA9IG51bGw7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25QYWdlKFN0cmluZyB0YXJnZXROYW1lLCBNYXAgYXR0cmlidXRlc01hcCkgewotCQlzdXBlcih0YXJnZXROYW1lKTsKLQkJCi0JCS8qaWYgKHRhcmdldE5hbWUgPT0gbnVsbCkgewotCQkJdGhpcy50YXJnZXROYW1lID0gTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVmYXVsdFRhcmdldE5hbWU7Ci0JCX0gZWxzZSB7Ki8KLQkJdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKLQkJLy99Ci0KLQkJY29uZmlnRmFjdG9yeSA9IG5ldyBDb25maWdGYWN0b3J5KGF0dHJpYnV0ZXNNYXApOwotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvblBhZ2UoKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0RlZmF1bHRUYXJnZXROYW1lKTsKLQkJdGhpcy50YXJnZXROYW1lID0gTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVmYXVsdFRhcmdldE5hbWU7Ci0JCQotCQljb25maWdGYWN0b3J5ID0gbmV3IENvbmZpZ0ZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lOwotCXByaXZhdGUgVGV4dEdyb3VwIHRhcmdldE5hbWVHcm91cDsKLQlwcml2YXRlIEF1dGhlbnRpY2F0aW9uRnJhbWUgcmVtb3RlQXV0aEZyYW1lOwotCXByaXZhdGUgVGV4dEdyb3VwIHN5c3RlbVdvcmtzcGFjZUdyb3VwOwotCQotCWNsYXNzIERhdGFNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJaW50IGNvdW50ZXIgPSAwOwotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlKCkgewotCQkJY291bnRlcisrOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNhYmxlKCkgewotCQkJY291bnRlci0tOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChjb3VudGVyIDwgMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJlYWRDb250cm9scygpOwotCQkJCi0JCQkvLyB1cGRhdGVCdXR0b25zKCkgd2lsbCBjYWxsIGlzIFZhbGlkKCksIHRoYXQgd2lsbCBjYWxsIHZhbGlkYXRlRmllbGRzKCkKLQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIERhdGFNb2RpZnlMaXN0ZW5lciBkYXRhTW9kaWZ5TGlzdGVuZXI7Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0RpYWxvZ0Rlc2NyaXB0aW9uKTsKLQkJdGhpcy5zZXRUaXRsZShNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9EaWFsb2dUaXRsZSk7Ci0JCXRoaXMuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZmluYWwgQ29tcG9zaXRlIHRvcENvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZXRDb250cm9sKHRvcENvbnRyb2wpOwotCQl0b3BDb250cm9sLnNldExheW91dCh0b3BMYXlvdXQpOwotCi0JCS8qCi0JCSAqIEVudmlyb25tZW50IG5hbWUgTGFiZWwgYW5kIHRleHQgY29udHJvbHMuCi0JCSAqLwotLy8JCVRleHRHcm91cE1vbGQgdG1vbGQgPSBuZXcgVGV4dEdyb3VwTW9sZChUZXh0R3JvdXBNb2xkLkdSSURfREFUQV9BTElHTk1FTlRfRklMTAotLy8JCQkJfCBUZXh0R3JvdXBNb2xkLkdSSURfREFUQV9HUkFCX0VYQ0VTU19TUEFDRSwgTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lLCBUZXh0R3JvdXAuTUFYX1NJWkUpOwotCQlUZXh0TW9sZCBtb2xkID0gbmV3IFRleHRNb2xkKFRleHRNb2xkLkdSSURfREFUQV9BTElHTk1FTlRfRklMTCB8IFRleHRNb2xkLkdSSURfREFUQV9HUkFCX0VYQ0VTU19TUEFDRSwgTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lKTsKLQkJdGFyZ2V0TmFtZUdyb3VwID0gbmV3IFRleHRHcm91cCh0b3BDb250cm9sLCBtb2xkKTsKLQkJCi0JCWNyZWF0ZUF1dGhDb250cm9sKHRvcENvbnRyb2wpOwotCi0JCS8qCi0JCSAqIFN5c3RlbSB3b3Jrc3BhY2UKLQkJICovCi0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHRvcENvbnRyb2wsICJSZW1vdGUgYXBwbGljYXRpb24gbGF1bmNoZXI6Iik7Ci0JCW1vbGQgPSBuZXcgVGV4dE1vbGQoVGV4dE1vbGQuR1JJRF9EQVRBX0FMSUdOTUVOVF9GSUxMIHwgVGV4dE1vbGQuR1JJRF9EQVRBX0dSQUJfRVhDRVNTX1NQQUNFLCBNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFN5c3RlbVdvcmtzcGFjZSk7Ci0JCXN5c3RlbVdvcmtzcGFjZUdyb3VwID0gbmV3IFRleHRHcm91cChmcmFtZS5nZXRUb3BVc2VyUmVzZXJ2ZWRDb21wb3NpdGUoKSwgbW9sZCk7Ci0JCQotCQlmaWxsQ29udHJvbHMoKTsKLQkJcmVnaXN0ZXJMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTGlzdGVuZXJzKCkgewotCQlkYXRhTW9kaWZ5TGlzdGVuZXIgPSBuZXcgRGF0YU1vZGlmeUxpc3RlbmVyKCk7Ci0JCXRhcmdldE5hbWVHcm91cC5hZGRNb2RpZnlMaXN0ZW5lcihkYXRhTW9kaWZ5TGlzdGVuZXIpOwotCQlyZW1vdGVBdXRoRnJhbWUuYWRkTW9kaWZ5TGlzdGVuZXIoZGF0YU1vZGlmeUxpc3RlbmVyKTsKLQkJc3lzdGVtV29ya3NwYWNlR3JvdXAuYWRkTW9kaWZ5TGlzdGVuZXIoZGF0YU1vZGlmeUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb250cm9scygpIHsKLQkJQ29udHJvbEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGNvbmZpZ0ZhY3RvcnkuZ2V0QXR0cmlidXRlcygpOwotCQl0YXJnZXROYW1lR3JvdXAuc2V0U3RyaW5nKHRhcmdldE5hbWUpOwotCQlyZW1vdGVBdXRoRnJhbWUuc2V0TG9jYWxob3N0U2VsZWN0ZWQoYXR0cmlidXRlcy5nZXRCb29sZWFuKENvbmZpZ0ZhY3RvcnkuQVRUUl9MT0NBTEhPU1RfU0VMRUNUSU9OKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRIb3N0UG9ydChhdHRyaWJ1dGVzLmdldEludGVnZXIoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fUE9SVCkpOwotCQlyZW1vdGVBdXRoRnJhbWUuc2V0SG9zdEFkZHJlc3MoYXR0cmlidXRlcy5nZXRTdHJpbmcoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fQUREUkVTUykpOwotCQlyZW1vdGVBdXRoRnJhbWUuc2V0VXNlck5hbWUoYXR0cmlidXRlcy5nZXRTdHJpbmcoQ29uZmlnRmFjdG9yeS5BVFRSX0xPR0lOX1VTRVJOQU1FKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRQYXNzd29yZChhdHRyaWJ1dGVzLmdldFN0cmluZyhDb25maWdGYWN0b3J5LkFUVFJfTE9HSU5fUEFTU1dPUkQpKTsKLQkJcmVtb3RlQXV0aEZyYW1lLnNldFB1YmxpY0tleVBhdGgoYXR0cmlidXRlcy5nZXRTdHJpbmcoQ29uZmlnRmFjdG9yeS5BVFRSX0tFWV9QQVRIKSk7Ci0JCXJlbW90ZUF1dGhGcmFtZS5zZXRQYXNzcGhyYXNlKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKENvbmZpZ0ZhY3RvcnkuQVRUUl9LRVlfUEFTU1BIUkFTRSkpOwotCQlyZW1vdGVBdXRoRnJhbWUuc2V0VGltZW91dChhdHRyaWJ1dGVzLmdldEludGVnZXIoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fVElNRU9VVCkpOwotCQlyZW1vdGVBdXRoRnJhbWUuc2V0UGFzc3dvcmRCYXNlZChhdHRyaWJ1dGVzLmdldEJvb2xlYW4oQ29uZmlnRmFjdG9yeS5BVFRSX0lTX1BBU1NXT1JEX0FVVEgpKTsKLQkJc3lzdGVtV29ya3NwYWNlR3JvdXAuc2V0U3RyaW5nKGF0dHJpYnV0ZXMuZ2V0U3RyaW5nKENvbmZpZ0ZhY3RvcnkuQVRUUl9TWVNURU1fV09SS1NQQUNFKSk7Ci0JCQotCQkvLyBGaWxsIHRoZSBjb21ib2JveCB3aXRoIGF2YWlsYWJsZSBjaXBoZXIgdHlwZXMKLQkJTWFwIGNpcGhlck1hcCA9IFRhcmdldENvbnRyb2wuZ2V0Q2lwaGVyVHlwZXNNYXAoKTsKLQkJU2V0IGNLZXlTZXQgPSBjaXBoZXJNYXAua2V5U2V0KCk7Ci0JCUNvbWJvR3JvdXAgY2lwaGVyR3JvdXAgPSByZW1vdGVBdXRoRnJhbWUuZ2V0Q2lwaGVyVHlwZUdyb3VwKCk7Ci0JCWZvcihJdGVyYXRvciBpdCA9IGNLZXlTZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyljaXBoZXJNYXAuZ2V0KGtleSk7Ci0JCQkKLQkJCWNpcGhlckdyb3VwLmFkZChuZXcgQ29tYm9Hcm91cEl0ZW0oa2V5LCB2YWx1ZSkpOwotCQl9Ci0JCS8vIFNlbGVjdCB0aGUgY2lwaGVyIHR5cGUgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgbWFwLgotCQljaXBoZXJHcm91cC5zZWxlY3RJbmRleFVzaW5nSUQoYXR0cmlidXRlcy5nZXRTdHJpbmcoQ29uZmlnRmFjdG9yeS5BVFRSX0NJUEhFUl9UWVBFKSk7Ci0JCQotCQkKLQkJLy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuaW50ZXJuYWwuc3NoLnN5c3RlbVdvcmtzcGFjZUdyb3VwLnNldFN0cmluZyhhdHRyaWJ1dGVzLmdldFN0cmluZyhDb25maWdGYWN0b3J5LkFUVFJfU1lTVEVNX1dPUktTUEFDRSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZENvbnRyb2xzKCkgewotCQlDb250cm9sQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gY29uZmlnRmFjdG9yeS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCXRhcmdldE5hbWUgPSB0YXJnZXROYW1lR3JvdXAuZ2V0U3RyaW5nKCk7Ci0JCWF0dHJpYnV0ZXMuc2V0Qm9vbGVhbkF0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfTE9DQUxIT1NUX1NFTEVDVElPTiwgcmVtb3RlQXV0aEZyYW1lLmlzTG9jYWxob3N0U2VsZWN0ZWQoKSk7Ci0JCWF0dHJpYnV0ZXMuc2V0U3RyaW5nQXR0cmlidXRlKENvbmZpZ0ZhY3RvcnkuQVRUUl9MT0dJTl9VU0VSTkFNRSwgcmVtb3RlQXV0aEZyYW1lLmdldFVzZXJOYW1lKCkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfTE9HSU5fUEFTU1dPUkQsIHJlbW90ZUF1dGhGcmFtZS5nZXRQYXNzd29yZCgpKTsKLQkJYXR0cmlidXRlcy5zZXRTdHJpbmdBdHRyaWJ1dGUoQ29uZmlnRmFjdG9yeS5BVFRSX0NPTk5FQ1RJT05fQUREUkVTUywgcmVtb3RlQXV0aEZyYW1lLmdldEhvc3RBZGRyZXNzKCkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9QT1JULCBJbnRlZ2VyLnRvU3RyaW5nKHJlbW90ZUF1dGhGcmFtZS5nZXRIb3N0UG9ydCgpKSk7Ci0JCWF0dHJpYnV0ZXMuc2V0U3RyaW5nQXR0cmlidXRlKENvbmZpZ0ZhY3RvcnkuQVRUUl9LRVlfUEFUSCwgcmVtb3RlQXV0aEZyYW1lLmdldFB1YmxpY0tleVBhdGgoKSk7CQotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfS0VZX1BBU1NQSFJBU0UsIHJlbW90ZUF1dGhGcmFtZS5nZXRQYXNzcGhyYXNlKCkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfQ09OTkVDVElPTl9USU1FT1VULCBJbnRlZ2VyLnRvU3RyaW5nKHJlbW90ZUF1dGhGcmFtZS5nZXRUaW1lb3V0KCkpKTsKLQkJYXR0cmlidXRlcy5zZXRCb29sZWFuQXR0cmlidXRlKENvbmZpZ0ZhY3RvcnkuQVRUUl9JU19QQVNTV09SRF9BVVRILCByZW1vdGVBdXRoRnJhbWUuaXNQYXNzd29yZEJhc2VkKCkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfU1lTVEVNX1dPUktTUEFDRSwgc3lzdGVtV29ya3NwYWNlR3JvdXAuZ2V0U3RyaW5nKCkpOwotCQlhdHRyaWJ1dGVzLnNldFN0cmluZ0F0dHJpYnV0ZShDb25maWdGYWN0b3J5LkFUVFJfQ0lQSEVSX1RZUEUsIHJlbW90ZUF1dGhGcmFtZS5nZXRTZWxlY3RlZENpcGhlclR5cGUoKS5nZXRJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0aENvbnRyb2woQ29tcG9zaXRlIHRvcENvbnRyb2wpIHsKLQkJQXV0aGVudGljYXRpb25GcmFtZU1vbGQgYW1vbGQgPSBuZXcgQXV0aGVudGljYXRpb25GcmFtZU1vbGQoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfQ29ubmVjdGlvbkZyYW1lVGl0bGUpOwotCQlhbW9sZC5zZXRCaXRtYXNrKEF1dGhlbnRpY2F0aW9uRnJhbWVNb2xkLlNIT1dfSE9TVF9UWVBFX1JBRElPX0JVVFRPTik7Ci0JCWFtb2xkLnNldExhYmVsTG9jYWxob3N0KE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsTG9jYWxob3N0KTsKLQkJYW1vbGQuc2V0TGFiZWxSZW1vdGVIb3N0KE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUmVtb3RlSG9zdCk7Ci0JCWFtb2xkLnNldExhYmVsSGlkZUFkdmFuY2VkT3B0aW9ucyhNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhpZGVBZHZhbmNlZE9wdGlvbnMpOwotCQlhbW9sZC5zZXRMYWJlbEhvc3RBZGRyZXNzKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSG9zdEFkZHJlc3MpOwotCQlhbW9sZC5zZXRMYWJlbEhvc3RQb3J0KE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSG9zdFBvcnQpOwotCQlhbW9sZC5zZXRMYWJlbElzUGFzc3dvcmRCYXNlZChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbElzUGFzc3dvcmRCYXNlZCk7Ci0JCWFtb2xkLnNldExhYmVsSXNQdWJsaWNLZXlCYXNlZChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbElzUHVibGljS2V5QmFzZWQpOwotCQlhbW9sZC5zZXRMYWJlbFBhc3NwaHJhc2UoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQYXNzcGhyYXNlKTsKLQkJYW1vbGQuc2V0TGFiZWxQYXNzd29yZChNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFBhc3N3b3JkKTsKLQkJYW1vbGQuc2V0TGFiZWxQdWJsaWNLZXlQYXRoKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUHVibGljS2V5UGF0aCk7Ci0JCWFtb2xkLnNldExhYmVsUHVibGljS2V5UGF0aEJ1dHRvbihNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhCdXR0b24pOwotCQlhbW9sZC5zZXRMYWJlbFB1YmxpY0tleVBhdGhUaXRsZShNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhUaXRsZSk7Ci0JCWFtb2xkLnNldExhYmVsU2hvd0FkdmFuY2VkT3B0aW9ucyhNZXNzYWdlcy5Db25maWd1cmF0aW9uUGFnZV9MYWJlbFNob3dBZHZhbmNlZE9wdGlvbnMpOwotCQlhbW9sZC5zZXRMYWJlbFRpbWVvdXQoTWVzc2FnZXMuQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUaW1lb3V0KTsKLQkJYW1vbGQuc2V0TGFiZWxDaXBoZXJUeXBlKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0NpcGhlclR5cGUpOwotCQlhbW9sZC5zZXRMYWJlbFVzZXJOYW1lKE1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsVXNlck5hbWUpOwotCi0JCXRoaXMucmVtb3RlQXV0aEZyYW1lID0gbmV3IEF1dGhlbnRpY2F0aW9uRnJhbWUodG9wQ29udHJvbCwgYW1vbGQpOwotLy8JCXJlbW90ZUF1dGhGcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0vLwkJcmVtb3RlQXV0aEZyYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGRhdGFNb2RpZnlMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gY29uZmlnRmFjdG9yeS5nZXRNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQl0cnkgewotCQkJcmVtb3RlQXV0aEZyYW1lLnZhbGlkYXRlRmllbGRzKCk7Ci0JCQljb25maWdGYWN0b3J5LmNyZWF0ZVRhcmdldENvbmZpZygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXNldEVycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCSAgICByZXR1cm4gdGFyZ2V0TmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3VpL01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTIyZDEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC51aS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsTG9jYWxob3N0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUmVtb3RlSG9zdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbEhpZGVBZHZhbmNlZE9wdGlvbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RBZGRyZXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxIb3N0UG9ydDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSXNQYXNzd29yZEJhc2VkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxJc1B1YmxpY0tleUJhc2VkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQYXNzcGhyYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQYXNzd29yZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUHVibGljS2V5UGF0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUHVibGljS2V5UGF0aEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xhYmVsVXNlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbFRpbWVvdXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbFNob3dBZHZhbmNlZE9wdGlvbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Nvbm5lY3Rpb25GcmFtZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfRGVmYXVsdFRhcmdldE5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EaWFsb2dEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0RpYWxvZ1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxTeXN0ZW1Xb3Jrc3BhY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9DaXBoZXJUeXBlOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3VpL21lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Qvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9nZW5lcmljaG9zdC91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTJiYWE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdC9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2dlbmVyaWNob3N0L3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Db25maWd1cmF0aW9uUGFnZV9EZWZhdWx0VGFyZ2V0TmFtZT1HZW5lcmljIEhvc3QKLUNvbmZpZ3VyYXRpb25QYWdlX0RpYWxvZ0Rlc2NyaXB0aW9uPVByb3BlcnRpZXMgZm9yIGNvbm5lY3RpbmcgdG8gYSBnZW5lcmljIGhvc3QKLUNvbmZpZ3VyYXRpb25QYWdlX0RpYWxvZ1RpdGxlPUdlbmVyaWMgSG9zdAotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxUYXJnZXROYW1lPVRhcmdldCBuYW1lOgotQ29uZmlndXJhdGlvblBhZ2VfQ29ubmVjdGlvbkZyYW1lVGl0bGU9SG9zdCBJbmZvcm1hdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxMb2NhbGhvc3Q9TG9jYWxob3N0Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFJlbW90ZUhvc3Q9UmVtb3RlIGhvc3QKLUNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsSGlkZUFkdmFuY2VkT3B0aW9ucz1TaW1wbGlmaWVkCi1Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RBZGRyZXNzPUhvc3Q6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbEhvc3RQb3J0PVBvcnQ6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbElzUGFzc3dvcmRCYXNlZD1QYXNzd29yZCBiYXNlZCBhdXRoZW50aWNhdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxJc1B1YmxpY0tleUJhc2VkPVB1YmxpYyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb24KLUNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUGFzc3BocmFzZT1QYXNzcGhyYXNlOgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxQYXNzd29yZD1QYXNzd29yZDoKLUNvbmZpZ3VyYXRpb25QYWdlX0xhYmVsUHVibGljS2V5UGF0aD1GaWxlIHdpdGggcHJpdmF0ZSBrZXk6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhUaXRsZT1TZWxlY3QgZmlsZSB3aXRoIHByaXZhdGUga2V5Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFB1YmxpY0tleVBhdGhCdXR0b249U2VsZWN0Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFVzZXJOYW1lPVVzZXI6Ci1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFRpbWVvdXQ9VGltZW91dChzZWMpOgotQ29uZmlndXJhdGlvblBhZ2VfTGFiZWxTaG93QWR2YW5jZWRPcHRpb25zPUFkdmFuY2VkCi1Db25maWd1cmF0aW9uUGFnZV9MYWJlbFN5c3RlbVdvcmtzcGFjZT1CYXNlIGRpcmVjdG9yeToKLUNvbmZpZ3VyYXRpb25QYWdlX0NpcGhlclR5cGU9Q2lwaGVyIFR5cGU6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLy5jbGFzc3BhdGggYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci8ucHJvamVjdCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQxMTIyYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTgxZGIyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjIucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuZGVidWcudWksCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmUsCi0gb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuY2R0LmxhdW5jaCwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZSwKLSBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuY29uc29sZSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcywKLSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0sCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLAotIG9yZy5lY2xpcHNlLnB0cC51dGlscy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5tYWNyb3MsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci51aSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudmFyaWFibGVzCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvYWJvdXQuaHRtbCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzgyNDJkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk1heSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0N2ZjYzAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvaWNvbnMvaXByb2Nlc3MuZ2lmIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL2ljb25zL2lwcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJiM2VkNS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvaWNvbnMvaXByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL2ljb25zL2lwcm9jZXNzLnBuZyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9pY29ucy9pcHJvY2Vzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwN2E2ZTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL2ljb25zL2lwcm9jZXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9pY29ucy9zeW5jLnBuZyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9pY29ucy9zeW5jLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmM5YmUyMC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvaWNvbnMvc3luYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvaWNvbnMvdGFyZ2V0LnBuZyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9pY29ucy90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDU4NjhmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9pY29ucy90YXJnZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWZjNGQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgUmVtb3RlIFRvb2xzIEFwcGxpY2F0aW9uIExhdW5jaGVyCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwotCi0jIEVjbGlwc2UgdmFyaWFibGVzIGRlc2NyaXB0aW9uCi1Vc2VyV29ya3NwYWNlVmFyaWFibGVEZXNjcmlwdGlvbj1BIGR5bmFtaWMgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgZnJvbSB3aGVyZSBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgc3lzdGVtIGNvbWVzIGZyb20vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3BsdWdpbi54bWwgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdiYzkzYy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ib2JzZXJ2ZXIiIG5hbWU9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlciIgc2NoZW1hPSJzY2hlbWEvbGF1bmNoZXJPYnNlcnZlci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCQlpZD0ibGF1bmNoQ29uZmlndXJhdGlvbk1hY3JvU3VwcGxpZXIiCi0JCQluYW1lPSJMYXVuY2ggQ29uZmlndXJhdGlvbiBNYWNybyBTdXBwbGllciIKLQkJCXNjaGVtYT0ic2NoZW1hL2xhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyLmV4c2QiPgotCTwvZXh0ZW5zaW9uLXBvaW50PgotICAgCi0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLmR5bmFtaWNWYXJpYWJsZXMiPgotCQk8dmFyaWFibGUKLQkJCQluYW1lPSJ1c2VyX3dvcmtzcGFjZSIKLQkJCQlkZXNjcmlwdGlvbj0iJVVzZXJXb3Jrc3BhY2VWYXJpYWJsZURlc2NyaXB0aW9uIgotCQkJCXJlc29sdmVyPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudmFyaWFibGVzLlJlbW90ZVdvcmtzcGFjZVJlc29sdmVyIj4KLQkJPC92YXJpYWJsZT4KLQk8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgIDxwYWdlCi0gICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy51aS5SZW1vdGVUb29sc1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIucHJlZmVyZW5jZXMuTGF1bmNoZXJQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLkxhdW5jaGVyUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgbmFtZT0iTGF1bmNoZXIiLz4KLSA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc2NoZW1hL2xhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyLmV4c2QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc2NoZW1hL2xhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkMTdlYzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NjaGVtYS9sYXVuY2hDb25maWd1cmF0aW9uTWFjcm9TdXBwbGllci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyIiBpZD0ibGF1bmNoQ29uZmlndXJhdGlvbk1hY3JvU3VwcGxpZXIiIG5hbWU9IkxhdW5jaCBDb25maWd1cmF0aW9uIE1hY3JvIFN1cHBsaWVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0byBjb250cmlidXRlIHdpdGggbmV3IExhdW5jaCBNYWNybyBTdXBwbGllcnMgdG8gYSBzcGVjaWZpYyBMYXVuY2hlciBEZWxlZ2F0ZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGF1bmNoQ29uZmlndXJhdGlvbk1hY3JvU3VwcGxpZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhpcyBMYXVuY2ggQ29uZmlndXJhdGlvbiBNYWNybyBTdXBwbGllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25maWdUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIExhdW5jaCBDb25maWd1cmF0aW9uIFR5cGUgdG8gd2hpY2ggdGhpcyBMYXVuY2ggQ29uZmlndXJhdGlvbiBNYWNybyBTdXBwbGllciBpcyByZWxhdGVkIHRvLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLm1hY3Jvcy5JTGF1bmNoQ29uZmlndXJhdGlvbk1hY3JvU3VwcGxpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIubWFjcm9zLklMYXVuY2hDb25maWd1cmF0aW9uTWFjcm9TdXBwbGllciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNsYXNzZXMgcmVmZXJlbmNlZCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgSUxhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Jmx0O2JyJmd0OwotQ29udHJpYnV0b3JzOiZsdDticiZndDsKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NjaGVtYS9sYXVuY2hlck9ic2VydmVyLmV4c2QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc2NoZW1hL2xhdW5jaGVyT2JzZXJ2ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ5MzI5MC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc2NoZW1hL2xhdW5jaGVyT2JzZXJ2ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlciIgaWQ9Im9ic2VydmVyIiBuYW1lPSJsYXVuY2hlck9ic2VydmVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEltcGxlbWVudHMgYW4gb2JzZXJ2ZXIgdGhhdCByZWNlaXZlcyBTVERPVVQgZnJvbSBhIHJlbW90ZSBhcHBsaWNhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JzZXJ2ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib2JzZXJ2ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklMYXVuY2hPYnNlcnZlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL1JlbW90ZUxhdW5jaGVyUGx1Z2luLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9SZW1vdGVMYXVuY2hlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmVmYzYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL1JlbW90ZUxhdW5jaGVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSUxhdW5jaEludGVncmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklMYXVuY2hPYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZS5JTGF1bmNoUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5FeGVjdXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5MYXVuY2hPYnNlcnZlckl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5SZW1vdGVMYXVuY2hQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlTGF1bmNoZXJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkVSVkVSX0VYVEVOU0lPTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIub2JzZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgUmVtb3RlTGF1bmNoZXJQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBSZW1vdGVMYXVuY2hlclBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVtb3RlTGF1bmNoZXJQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpIHsKLQkJCS8vIElmIHRoZSBkZWZhdWx0IGluc3RhbmNlIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsCi0JCQkvLyByZXR1cm4gYSBzdGF0aWMgaWRlbnRpZmllci4gVGhpcyBpZGVudGlmaWVyIG11c3QKLQkJCS8vIG1hdGNoIHRoZSBwbHVnaW4gaWQgZGVmaW5lZCBpbiBwbHVnaW4ueG1sCi0JCQlyZXR1cm4gUExVR0lOX0lEOwotCQl9Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoT2JzZXJ2ZXJJdGVyYXRvciBnZXRMYXVuY2hPYnNlcnZlckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExhdW5jaE9ic2VydmVySXRlcmF0b3IoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTGF1bmNoT2JzZXJ2ZXIgZ2V0TGF1bmNoT2JzZXJ2ZXJCeUlEKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxhdW5jaE9ic2VydmVySXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRMYXVuY2hPYnNlcnZlckl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJaXRlcmF0b3IubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChpdGVyYXRvci5nZXROYW1lKCkuZXF1YWxzKGlkKSkgewotCQkJCXJldHVybiBpdGVyYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl0aHJvdyBleGNlcHRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRocm93Q29yZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgaW50IGVycm9yQ29kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIGVycm9yQ29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCUNvcmVFeGNlcHRpb24gZXhjZXB0aW9uID0gbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJdGhyb3cgZXhjZXB0aW9uOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElMYXVuY2hQcm9jZXNzIGNyZWF0ZVJlbW90ZUxhdW5jaFByb2Nlc3MoSUxhdW5jaCBsYXVuY2gsIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSUxhdW5jaEludGVncmF0aW9uIGxhdW5jaEludGVncmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgUmVtb3RlTGF1bmNoUHJvY2VzcyhsYXVuY2gsIGNvbmZpZ3VyYXRpb24sIGxhdW5jaEludGVncmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dDb3JlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBlKTsKLQkJQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl0aHJvdyBleGNlcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JTGF1bmNoSW50ZWdyYXRpb24uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSUxhdW5jaEludGVncmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjZmUwZWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JTGF1bmNoSW50ZWdyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0byBsYXVuY2ggdGhlIGFwcGxpY2F0aW9uLgotICogVGhlIG1vc3QgaW1wb3J0YW50IHB1cnBvc2UgaXMgdG8gcHJvdmlkZSB0aGUgY29tbWFuZCBsaW5lKHMpIHRoYXQgbGF1bmNoIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEl0IGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gY29sbGFib3JhdGUgd2l0aCBjdXN0b21pemF0aW9uIG9uIGFueSBzdGVwIG9mIHRoZSBsYXVuY2guCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGF1bmNoSW50ZWdyYXRpb24gewotCXB1YmxpYyB2b2lkIHByZXBhcmVVcGxvYWRXb3JraW5nRGlyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCBmaW5pc2hVcGxvYWRXb3JraW5nRGlyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCBwcmVwYXJlQXBwbGljYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIGZpbmFsaXplQXBwbGljYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIGZpbmFsaXplV29ya2luZ0RpcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247CQotCXB1YmxpYyB2b2lkIGZpbmFsaXplQ2xlYW51cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb247CQotCQotCXB1YmxpYyB2b2lkIHByZXBhcmVMYXVuY2goKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIGZpbmFsaXplTGF1bmNoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUaGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gbGF1bmNoIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBVc2VkIHRvIGN1c3RvbWl6ZSBob3cgdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGJlIGxhdW5jaGVkLgotCSAqIFR5cGljYWxseSwgdGhlIGNvbW1hbmQgbGluZSBhbHNvIGxhdW5jaGVzIGEgZGVidWdnZXIgb3IgYSBwcm9maWxlciB0b29sLgotCSAqIEBwYXJhbSBhcHBsaWNhdGlvbkZ1bGxQYXRoIEZ1bGwgcGF0aCB3aGVyZSB0aGUgYXBwbGljYXRpb24gZXhlY3V0YWJsZSBpcyBzdG9yZWQgb24gdGhlIHJlbW90ZSBob3N0LgotCSAqIEBwYXJhbSBhcmd1bWVudHMgUGFyYW1ldGVycyB0aGF0IHNoYWxsIGJlIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24uCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIGVsZW1lbnQgaXMgYSBsaW5lIG9mIHRoZSBzY3JpcHQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBbXSBjcmVhdGVMYXVuY2hTY3JpcHQoU3RyaW5nIGFwcGxpY2F0aW9uRnVsbFBhdGgsIFN0cmluZ1tdIGFyZ3VtZW50cykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JLyoqCi0JICogUXVlcnkgaWYgdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGJlIGxhdW5jaGVkLiAKLQkgKiBCeSBkZWZhdWx0LCB0aGUgbGF1bmNoZXIgdXBsb2FkcyBhbmQgZXhlY3V0ZXMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIFJldHVybiBmYWxzZSB0byBpbXBsZW1lbnQgYW4gImF0dGFjaCB0byByZW1vdGUgcHJvY2VzcyIgZmVhdHVyZS4KLQkgKiBAcmV0dXJuIHRydWUvZmFsc2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREb0xhdW5jaEFwcGxpY2F0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxhdW5jaCBpbnRlZ3JhdGlvbiB0aGF0IHRoZSBsYXVjaCBoYXMganVzdCBzdGFydGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxhdW5jaCBpbnRlZ3JhdGlvbiB0aGF0IHRoZSBsYXVjaCBpcyBnb2luZyB0byBmaW5pc2guCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxhdW5jaCBpbnRlZ3JhdGlvbiB3aGljaCBleGVjdXRpb24gbWFuYWdlciBpcyBiZWluZyB1c2VkIHRvCi0JICogcnVuIGNvbW1hbmRzIG9uIHRoZSByZW1vdGUgaG9zdC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldEV4ZWN1dGlvbk1hbmFnZXIoSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgbWFuYWdlcik7Ci0JLyoqCi0JICogTm90aWZpZXMgdGhlIGxhdW5jaCBpbnRlZ3JhdGlvbiB0aGF0IHRoZSBsYXVjaCBpcyBnb2luZyB0byBjbGVhbiB1cCB0aGUgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCi0JcHVibGljIHZvaWQgY2xlYW51cCgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JTGF1bmNoT2JzZXJ2ZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSUxhdW5jaE9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmNTM2MGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JTGF1bmNoT2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgdGhhdCByZWNlaXZlcyB0aGUgYXBwbGljYXRpb24gb3V0cHV0IGFuZCBhbGxvd3MgYWRkaW5nIGN1c3RvbWl6YXRpb24gc3RlcHMuCi0gKiBUaGUgbGF1bmNoIG9ic2VydmVycyBhcmUgZGVmaW5lZCBieSBleHRlbnNpb24gcG9pbnRzLgotICogVGhlIHVzZXIgY2FuIHNlbGVjdCBvbmUgbGF1bmNoIG9ic2VydmVyIHRvIG9ic2VydmVyIGRlIGFwcGxpY2F0aW9uIGV4ZWN1dGlvbi4KLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXVuY2hPYnNlcnZlciBleHRlbmRzIElMYXVuY2hJbnRlZ3JhdGlvbiB7Ci0Jdm9pZCByZWNlaXZlT3V0cHV0KFN0cmluZyB0ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSUxhdW5jaFByb2Nlc3MuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSUxhdW5jaFByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmMwYjA2My4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL0lMYXVuY2hQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuRXhlY3V0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5FeGVjdXRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIHRoZSByZW1vdGUgbGF1bmNoLgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXVuY2hQcm9jZXNzICB7Ci0JcHVibGljIHZvaWQgYWRkUHJvZ3Jlc3NMaXN0ZW5lcihJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKTsKLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9ncmVzc0xpc3RlbmVyKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpOwotCQotCXB1YmxpYyB2b2lkIHNldExhdW5jaE9ic2VydmVyKElMYXVuY2hPYnNlcnZlciBsYXVuY2hPYnNlcnZlcik7Ci0JCi0JcHVibGljIElMYXVuY2hPYnNlcnZlciBnZXRPYnNlcnZlcigpOwotCXB1YmxpYyBJTGF1bmNoSW50ZWdyYXRpb24gZ2V0TGF1bmNoSW50ZWdyYXRpb24oKTsKLQlwdWJsaWMgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7Ci0JcHVibGljIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIGdldEV4ZWN1dGlvbk1hbmFnZXIoKTsKLQlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFByb2dyZXNzKCk7Ci0JcHVibGljIEV4ZWN1dGlvblJlc3VsdCBnZXRGaW5hbFJlc3VsdCgpOwotCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCk7Ci0JCi0JcHVibGljIHZvaWQgcnVuKElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXIpOwotCXB1YmxpYyB2b2lkIG1hcmtBc0NhbmNlbGVkKCk7Ci0JCi0JcHVibGljIHZvaWQgc2hvd1Byb2Nlc3NDb25zb2xlKCk7Ci0JcHVibGljIHZvaWQgc2hvd0xhdW5jaENvbnNvbGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2ZhNjBjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBsYXVuY2ggYWR2YW5jZXMgb25lIHN0ZXAuCi0gKiBVc2VmdWwgZm9yIHVwZGF0aW5nIHRoZSBwcm9ncmVzcyBiYXIuCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lciB7Ci0JLy8gTGF1bmNoIHByb2dyZXNzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQUlUID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVQQVJFX1dPUktJTkdfRElSMSA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBMT0FEX1dPUktJTkdfRElSID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVQQVJFX1dPUktJTkdfRElSMiA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBMT0FEX0FQUExJQ0FUSU9OID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVQQVJFX0FQUExJQ0FUSU9OID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTElaRV9BUFBMSUNBVElPTiA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTkxPQURfV09SS0lOR19ESVIgPSA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMSVpFX1dPUktJTkdfRElSMiA9IDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMRUFOVVAgPSAxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTElaRV9DTEVBTlVQID0gMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIRUQgPSAxMzsKLQl2b2lkIG5vdGlmeVByb2dyZXNzKGludCBwcm9ncmVzcyk7Ci0Jdm9pZCBub3RpZnlJbnRlcnJ1cHQoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQyMzgxNi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL0lSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZTsKLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIGtleSBuYW1lcyBhbmQgZGVmYXVsdCB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgbGF1bmNoZXIuCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVtb3RlTGF1bmNoQXR0cmlidXRlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVVUT01BVElDX1dPUktJTkdfRElSRUNUT1JZID0gTEFVTkNIX0lEICsgIi5BVVRPX1JFTU9URV9ESVJFQ1RPUlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRU1PVEVfRElSRUNUT1JZID0gTEFVTkNIX0lEICsgIi5SRU1PVEVfRElSRUNUT1JZIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBAZGVwcmVjYXRlZCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTE9DQUxfRElSRUNUT1JZID0gTEFVTkNIX0lEICsgIi5MT0NBTF9ESVJFQ1RPUlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWU5DX0JFRk9SRSA9IExBVU5DSF9JRCArICIuU1lOQ19CRUZPUkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWU5DX0FGVEVSID0gTEFVTkNIX0lEICsgIi5TWU5DX0FGVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1lOQ19DTEVBTlVQID0gTEFVTkNIX0lEICsgIi5TWU5DX0NMRUFOVVAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfRk9SV0FSREVEX1gxMSA9IExBVU5DSF9JRCArICIuRk9SV0FSRF9YMTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRQVVRfT0JTRVJWRVIgPSBMQVVOQ0hfSUQgKyAiLk9VVFBVVF9PQlNFUlZFUiI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CRUZPUkVfQ09NTUFORCA9IExBVU5DSF9JRCArICIuQkVGT1JFX0NPTU1BTkQiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQUZURVJfQ09NTUFORCA9IExBVU5DSF9JRCArICIuQUZURVJfQ09NTUFORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NZTkNfUlVMRVMgPSBMQVVOQ0hfSUQgKyAiLlNZTkNfUlVMRVMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfQVVUT01BVElDX1dPUktJTkdfRElSRUNUT1JZID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FMX0RJUkVDVE9SWSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfU1lOQ19CRUZPUkUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1NZTkNfQUZURVIgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1NZTkNfQ0xFQU5VUCA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfVVNFX0ZPUldBUkRFRF9YMTEgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FGVEVSX0NPTU1BTkQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkVGT1JFX0NPTU1BTkQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVUX09CU0VSVkVSID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JFRk9SRV9GSUxFUyA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BRlRFUl9GSUxFUyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvSVJlbW90ZUxhdW5jaEVycm9ycy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JUmVtb3RlTGF1bmNoRXJyb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzZWJiYzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9JUmVtb3RlTGF1bmNoRXJyb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVMYXVuY2hFcnJvcnMgewotCXB1YmxpYyBzdGF0aWMgaW50IElOVkFMSURfUlVMRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgSU5WQUxJRF9FWEVDVVRJT05fQ09ORklHVVJBVElPTiA9IDI7Ci0JcHVibGljIHN0YXRpYyBpbnQgRVJST1JfUEFSU0lOR19SVUxFID0gMzsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvTGludXhQYXRoLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL0xpbnV4UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDhjMzgwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvTGludXhQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1wdWJsaWMgY2xhc3MgTGludXhQYXRoIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBmcm9tU3RyaW5nKFN0cmluZyBsb2NhdGlvbikgewotCQlyZXR1cm4gbmV3IFBhdGgobG9jYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvTWVzc2FnZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTkxNTg1YS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZV9Mb2NhbERpcmVjdG9yeV9Eb2VzTm90RXhpc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZV9Mb2NhbERpcmVjdG9yeV9Jc05vdEFEaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZV9Mb2NhbERpcmVjdG9yeV9NaXNzaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoRGVsZWdhdGVfTG9jYWxEaXJlY3RvcnlfTXVzdEJlQWJzb2x1dGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZV9SZW1vdGVEaXJlY3RvcnlfTWFjcm9GYWlsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZV9SZW1vdGVEaXJlY3RvcnlfTWFjcm9GYWlsZWRfVW5rbm93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaERlbGVnYXRlX1JlbW90ZURpcmVjdG9yeV9NaXNzaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoRGVsZWdhdGVfUmVtb3RlRGlyZWN0b3J5X01pc3NpbmdJblByZWZlcmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoRGVsZWdhdGVfUmVtb3RlRGlyZWN0b3J5X011c3RCZUFic29sdXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nRXhlY3V0YWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb25fRXJyb3JfTWlzc2luZ0xvY2FsUmVtb3RlRGlyZWN0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nUHJvamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb25fRXJyb3JfTWlzc2luZ1JlbW90ZVdvcmtpbmdEaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZV9TeW5jaHJvbml6YXRpb25SdWxlc19JbnRlcm5hbEVycm9yOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvTnVsbExhdW5jaEludGVncmF0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL051bGxMYXVuY2hJbnRlZ3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGFhNWRiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvTnVsbExhdW5jaEludGVncmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLlJlbW90ZUxhdW5jaFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBBIGR1bW15IHZvaWQgbGF1bmNoIGludGVncmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYmFzZSBjbGFzcyBmb3IgZnVydGhlciBzcGVjaWFsaXphdGlvbi4KLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTnVsbExhdW5jaEludGVncmF0aW9uIGltcGxlbWVudHMgSUxhdW5jaEludGVncmF0aW9uIHsKLQotCXB1YmxpYyBTdHJpbmdbXSBjcmVhdGVMYXVuY2hTY3JpcHQoU3RyaW5nIGFwcGxpY2F0aW9uRnVsbFBhdGgsIFN0cmluZ1tdIGFyZ3VtZW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcmVzdWx0IFtdID0gbmV3IFN0cmluZyBbMV07Ci0JCXJlc3VsdFswXSA9IFJlbW90ZUxhdW5jaFByb2Nlc3MuY3JlYXRlQ29tbWFuZExpbmUoYXBwbGljYXRpb25GdWxsUGF0aCwgYXJndW1lbnRzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGZpbmFsaXplQ2xlYW51cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIGZpbmFsaXplQXBwbGljYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5hbGl6ZVdvcmtpbmdEaXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluaXNoVXBsb2FkV29ya2luZ0RpcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIHByZXBhcmVBcHBsaWNhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIHByZXBhcmVVcGxvYWRXb3JraW5nRGlyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uTWFuYWdlcihJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RG9MYXVuY2hBcHBsaWNhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluYWxpemVMYXVuY2goKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVwYXJlTGF1bmNoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL1JlbW90ZUxhdW5jaERlbGVnYXRlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9jb3JlL1JlbW90ZUxhdW5jaERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ZDQyNzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9SZW1vdGVMYXVuY2hEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5tb2RlbC5JQ1Byb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUuSUNEVExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmxhdW5jaC5BYnN0cmFjdENMYXVuY2hEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5SZW1vdGVMYXVuY2hlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5JU3luY2hyb25pemF0aW9uUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5SdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWwuaW50ZWdyYXRpb24uTnVsbExhdW5jaE9ic2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5tYWNyb3MuTGF1bmNoVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5tYWNyb3MuSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnByZWZlcmVuY2VzLkxhdW5jaFByZWZlcmVuY2VzOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgcmVtb3RlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZSBleHRlbmRzCi0JCUFic3RyYWN0Q0xhdW5jaERlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQubGF1bmNoLkFic3RyYWN0Q0xhdW5jaERlbGVnYXRlI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUmVtb3RlTGF1bmNoZXJQbHVnaW4uZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlMiNmaW5hbExhdW5jaENoZWNrKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaW5hbExhdW5jaENoZWNrKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0JCQlTdHJpbmcgbW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5maW5hbExhdW5jaENoZWNrKGNvbmZpZ3VyYXRpb24sIG1vZGUsIG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlMiNwcmVMYXVuY2hDaGVjayhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlTGF1bmNoQ2hlY2soSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLQkJCVN0cmluZyBtb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLnByZUxhdW5jaENoZWNrKGNvbmZpZ3VyYXRpb24sIG1vZGUsIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Yj5sb2NhbDwvYj4gd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGxhdW5jaAotCSAqIGNvbmZpZ3VyYXRpb24uIAotCSAqIAotCSAqIElmIHRoZSBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiwKLQkgKiB0aGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGlzIGFzc3VtZWQgYXMgZmFsbGJhY2suCi0JICogCi0JICogSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgYWJzb2x1dGUsIHRoZW4gaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3RvcnkKLQkgKiByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlLgotCSAqIAotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZmFsbCBiYWNrIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgICAgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IGluIHRoZSByZW1vdGUgZmlsZSBzeXN0ZW0sIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXZhaWxhYmxlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIE9uIGZhaWxyZSB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgcHJvcGVydHkgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGF1bmNoZXIgdGFiLgotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRMb2NhbERpcmVjdG9yeVdpdGhGYWxsYmFjayhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG9rCi0JCVN0cmluZyBsb2NhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfTE9DQUxfRElSRUNUT1JZLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gRmFsbGJhY2sgdG8gdXNlciBwcm9qZWN0IGRpcmVjdG9yeQotCQkJSUNQcm9qZWN0IGNwID0gZ2V0Q1Byb2plY3QoY29uZmlndXJhdGlvbik7Ci0JCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IHAgPSBjcC5nZXRQcm9qZWN0KCk7Ci0JCQkJcmV0dXJuIHAuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlpZiAoISBwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJCXJldHVybiBmb2xkZXIuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBQYXRoKGxvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2ZXJpZmllZCA8Yj5sb2NhbDwvYj4gd29ya2luZyBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZQotCSAqIGdpdmVuIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIDxiPmxvY2FsPC9iPiB3b3JraW5nIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuCi0JICogICAgICAgICBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgICAgICA8bGk+T24gZmFpbHVyZSB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgIDxsaT5JZiBub3QgYWJzb2x1dGUuCi0JICogICAgICAgICAgICAgICAgPGxpPklmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotCSAqICAgICAgICAgICAgICAgIDxsaT5JZiBub3QgYSBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotCSAqICAgICAgICAgICAgICAgIDwvdWw+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRWYWxpZGF0ZWRMb2NhbERpcmVjdG9yeShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBvawotCQkKLQkJSVBhdGggcGF0aCA9IGdldExvY2FsRGlyZWN0b3J5V2l0aEZhbGxiYWNrKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9Mb2NhbERpcmVjdG9yeV9NaXNzaW5nLCBudWxsLCAwKTsKLQkJfSAKLQotCQlpZiAoISBwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJYWJvcnQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoRGVsZWdhdGVfTG9jYWxEaXJlY3RvcnlfTXVzdEJlQWJzb2x1dGUsIG51bGwsIDApOwotCQl9IAotCQkJCi0JCUZpbGUgZGlyZWN0b3J5ID0gcGF0aC50b0ZpbGUoKTsKLQkJaWYgKCEgZGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9Mb2NhbERpcmVjdG9yeV9Eb2VzTm90RXhpc3QsIG51bGwsIDApOwotCQl9Ci0JCWlmICghIGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlhYm9ydChNZXNzYWdlcy5SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9Mb2NhbERpcmVjdG9yeV9Jc05vdEFEaXJlY3RvcnksIG51bGwsIDApOwotCQl9Ci0KLQkJcmV0dXJuIGRpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Yj5sb2NhbDwvYj4gd29ya2luZyBkaXJlY3RvcnkgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgd29ya2luZyBkaXJlY3RvcnkgaXMgbm90Ci0JICogc3BlY2lmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgaW4gdGhlIHJlbW90ZSBmaWxlIHN5c3RlbSwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuc3BlY2lmaWVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIE9uIGZhaWxyZSB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgcHJvcGVydHkgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGF1bmNoZXIgdGFiLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhbERpcmVjdG9yeShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG9rCi0JCXJldHVybiBnZXRMb2NhbERpcmVjdG9yeVdpdGhGYWxsYmFjayhjb25maWcpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Yj5yZW1vdGU8L2I+IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIE5vIG1hY3JvcyBhcmUgZXhwYW5kZWQuIFRvIGV4cGFuZCBtYWNyb3MsIHVzZSB7QGxpbmsgI2dldFZhbGlkYXRlZFJlbW90ZURpcmVjdG9yeShJTGF1bmNoQ29uZmlndXJhdGlvbil9LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBwYXRoIHRvIGEgZGlyZWN0b3J5IGluIHRoZSByZW1vdGUgZmlsZSBzeXN0ZW0sIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bnNwZWNpZmllZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBPbiBmYWlsdXJlIHRoZSBnZXQgdGhlIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UmVtb3RlRGlyZWN0b3J5KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gb2sKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfQVVUT01BVElDX1dPUktJTkdfRElSRUNUT1JZLCBmYWxzZSkpIHsKLQkJCWxvY2F0aW9uID0gTGF1bmNoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKExhdW5jaFByZWZlcmVuY2VzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlkpOwotCQl9IGVsc2UgewotCQkJbG9jYXRpb24gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1JFTU9URV9ESVJFQ1RPUlksIChTdHJpbmcpbnVsbCk7Ci0JCX0KLQkJCi0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWxvY2F0aW9uID0gTGF1bmNoVmFyaWFibGVNYW5hZ2VyLmdldERlZmF1bHQoKS5yZXNvbHZlVmFsdWUobG9jYXRpb24sIEVNUFRZX1NUUklORywgRU1QVFlfU1RSSU5HLCBJTGF1bmNoVmFyaWFibGVDb250ZXh0SW5mby5DT05URVhUX0xBVU5DSCwgY29uZmlndXJhdGlvbik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTGludXhQYXRoLmZyb21TdHJpbmcobG9jYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Yj5yZW1vdGU8L2I+IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKiBAcmV0dXJuIHBhdGggdG8gYSBkaXJlY3RvcnkgaW4gdGhlIHJlbW90ZSBmaWxlIHN5c3RlbSwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuc3BlY2lmaWVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiA8dWw+Ci0JICogPGxpPk9uIGZhaWx1cmUgdGhlIGdldCB0aGUgYXR0cmlidXRlLgotCSAqIDxsaT5PbiBmYWlsdXJlIHRvIHJlc29sdmUgbWFjcm9zCi0JICogPGxpPklmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHVyZS4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRWYWxpZGF0ZWRSZW1vdGVEaXJlY3RvcnkoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBvawotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9BVVRPTUFUSUNfV09SS0lOR19ESVJFQ1RPUlksIGZhbHNlKSkgewotCQkJbG9jYXRpb24gPSBMYXVuY2hQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoTGF1bmNoUHJlZmVyZW5jZXMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSk7Ci0JCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJYWJvcnQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoRGVsZWdhdGVfUmVtb3RlRGlyZWN0b3J5X01pc3NpbmdJblByZWZlcmVuY2VzLCBudWxsLCAwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWxvY2F0aW9uID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9SRU1PVEVfRElSRUNUT1JZLCAoU3RyaW5nKW51bGwpOwotCQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgewotCQkJCWFib3J0KE1lc3NhZ2VzLlJlbW90ZUxhdW5jaERlbGVnYXRlX1JlbW90ZURpcmVjdG9yeV9NaXNzaW5nLCBudWxsLCAwKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJbG9jYXRpb24gPSBMYXVuY2hWYXJpYWJsZU1hbmFnZXIuZ2V0RGVmYXVsdCgpLnJlc29sdmVWYWx1ZShsb2NhdGlvbiwgRU1QVFlfU1RSSU5HLCBFTVBUWV9TVFJJTkcsIElMYXVuY2hWYXJpYWJsZUNvbnRleHRJbmZvLkNPTlRFWFRfTEFVTkNILCBjb25maWd1cmF0aW9uKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydChOTFMuYmluZChNZXNzYWdlcy5SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9SZW1vdGVEaXJlY3RvcnlfTWFjcm9GYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSwgZSwgMCk7Ci0JCX0KLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWFib3J0KE1lc3NhZ2VzLlJlbW90ZUxhdW5jaERlbGVnYXRlX1JlbW90ZURpcmVjdG9yeV9NYWNyb0ZhaWxlZF9Vbmtub3duLCBudWxsLCAwKTsKLQkJfQotCQlJUGF0aCBwYXRoID0gTGludXhQYXRoLmZyb21TdHJpbmcobG9jYXRpb24pOwotCQlpZiAoISBwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJYWJvcnQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoRGVsZWdhdGVfUmVtb3RlRGlyZWN0b3J5X011c3RCZUFic29sdXRlLCBudWxsLCAwKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBzeW5jaHJvbml6YXRpb24gYmVmb3JlIGxhdW5jaCBpcyBhY3RpdmF0ZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVHJ1ZS9GYWxzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gT24gZmFpbHVyZSB0aGUgZ2V0IHRoZSBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3luY2hyb25pemVCZWZvcmUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBvawotCQlyZXR1cm4gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9TWU5DX0JFRk9SRSwgSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuREVGQVVMVF9TWU5DX0JFRk9SRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgc3luY2hyb25pemF0aW9uIGFmdGVyIGxhdW5jaCBpcyBhY3RpdmF0ZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVHJ1ZS9GYWxzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gT24gZmFpbHVyZSB0aGUgZ2V0IHRoZSBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3luY2hyb25pemVBZnRlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG9rCi0JCXJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1NZTkNfQUZURVIsIElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkRFRkFVTFRfU1lOQ19BRlRFUik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgWDExIGZvcndhcmRpbmcgaXMgYWN0aXZhdGVkIGluIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBUaGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFRydWUvRmFsc2UuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIE9uIGZhaWx1cmUgdGhlIGdldCB0aGUgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFVzZUZvcndhcmRlZFgxMShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG9rCi0JCXJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1VTRV9GT1JXQVJERURfWDExLCBJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5ERUZBVUxUX1VTRV9GT1JXQVJERURfWDExKTsKLQl9CQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYnNlcnZlciBwbHVnLWluIHRoYXQgd2lsbCBwYXJzZSBvdXRwdXQgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBUaGUgb2JzZXJ2ZXIgcGx1Zy1pbiBvciBhIHZvaWQgb2JzZXJ2ZXIgaWYgbm8gd2FzIHNlbGVjdGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBnaXZlbiBvYnNlcnZlciBkb2VzIG5vdCBleGlzdC4gIE9uIGZhaWx1cmUgdGhlIGdldCB0aGUgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBJTGF1bmNoT2JzZXJ2ZXIgZ2V0T3V0cHV0T2JzZXJ2ZXIoCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG9rCi0JCVN0cmluZyBpZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfT1VUUFVUX09CU0VSVkVSLCAoU3RyaW5nKW51bGwpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBOdWxsTGF1bmNoT2JzZXJ2ZXIoKTsKLQkJfQotCQkKLQkJSUxhdW5jaE9ic2VydmVyIGxhdW5jaE9ic2VydmVyID0gUmVtb3RlTGF1bmNoZXJQbHVnaW4uZ2V0TGF1bmNoT2JzZXJ2ZXJCeUlEKGlkKTsKLQkJaWYgKGxhdW5jaE9ic2VydmVyID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgTnVsbExhdW5jaE9ic2VydmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGxhdW5jaE9ic2VydmVyOwotCX0KLQotLy8gbm90IG5lZWRlZCBhbnltb3JlLgotLy8JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRocm93c0NvcmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24sIGludCBjb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0vLwkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGNvZGUsIGV4Y2VwdGlvbiA9PSBudWxsID8gIiIgOiBleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCAvLyROT04tTkxTLTEkCi0vLwkJCQlleGNlcHRpb24pKTsKLS8vCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotLy8JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QmVmb3JlQ29tbWFuZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCS8vIG9rCi0JCXRyeSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9CRUZPUkVfQ09NTUFORCwgKFN0cmluZyludWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJDb21tYW5kKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJLy8gb2sKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX0FGVEVSX0NPTU1BTkQsIChTdHJpbmcpbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0vLwlub3QgdXNlZCBhbnltb3JlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbW90ZVJlbGF0aXZlUGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUlQYXRoIGJhc2UgPSBnZXRSZW1vdGVEaXJlY3RvcnkoY29uZmlndXJhdGlvbik7Ci0vLwkJaWYgKHBhdGggPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gYmFzZS50b1N0cmluZygpOwotLy8JCX0gZWxzZSBpZiAoaXNSZW1vdGVBYnNvbHV0ZVBhdGgocGF0aCkpIHsKLS8vCQkJcmV0dXJuIHBhdGg7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKGJhc2UgPT0gbnVsbCkgewotLy8JCQkJYWJvcnQoCi0vLwkJCQkJCSJTeW5jaHJvbml6YXRpb24gb2YgcmVtb3RlIGZpbGVzIHdpdGggcmVsYXRpdmUgcGF0aHMgYXJlIGlzIG5vdCBhbGxvd2VkIHdpdGhvdXQgc3BlY2lmeWluZyByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkiLAotLy8JCQkJCQluZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGJhc2UudG9PU1N0cmluZygpKSwKLS8vCQkJCQkJSUNEVExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuRVJSX1dPUktJTkdfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUCi0vLwkJCQkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiAgY29uY2F0ZW5hdGVSZW1vdGVQYXRoKExpbnV4UGF0aC50b1N0cmluZyhiYXNlKSwgcGF0aCk7Ci0vLwkJfQotLy8JfQotCQotLy8JcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbFJlbGF0aXZlUGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCWlmIChwYXRoID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcmV0dXJuIGdldExvY2FsUmVsYXRpdmVQYXRoKGNvbmZpZ3VyYXRpb24sIG5ldyBQYXRoKHBhdGgpKTsKLS8vCQl9Ci0vLwl9Ci0JCQotLy8JcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbFJlbGF0aXZlUGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJaWYgKHBhdGggPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9IGVsc2UgaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0vLwkJCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsKLS8vCQl9IGVsc2UgewotLy8JCQlJUGF0aCBiYXNlID0gZ2V0TG9jYWxEaXJlY3RvcnkoY29uZmlndXJhdGlvbik7Ci0vLwkJCWlmIChiYXNlID09IG51bGwpIHsKLS8vCQkJCWFib3J0KAotLy8JCQkJCQkiU3luY2hyb25pemF0aW9uIG9mIGxvY2FsIGZpbGVzIHdpdGggcmVsYXRpdmUgcGF0aHMgYXJlIGlzIG5vdCBhbGxvd2VkIHdpdGhvdXQgc3BlY2lmeWluZyBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSBvciBwcm9qZWN0IiwKLS8vCQkJCQkJbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihiYXNlLnRvU3RyaW5nKCkpLAotLy8JCQkJCQlJQ0RUTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfV09SS0lOR19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1QKLS8vCQkJCSk7Ci0vLwkJCX0KLS8vCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlLnRvU3RyaW5nKCkpOwotLy8JCQlyZXR1cm4gYmFzZVBhdGguYXBwZW5kKHBhdGgpLnRvT1NTdHJpbmcoKTsKLS8vCQl9Ci0vLwl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldFN5bmNocm9uaXplQ2xlYW51cChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0OwotCQl0cnkgewotCQkJcmVzdWx0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9TWU5DX0NMRUFOVVAsIElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkRFRkFVTFRfU1lOQ19DTEVBTlVQKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBnZXRBbGxvY2F0ZVRlcm1pbmFsKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJQ0RUTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9URVJNSU5BTCwgSUNEVExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuVVNFX1RFUk1JTkFMX0RFRkFVTFQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0vLwlwcml2YXRlIFN0cmluZyBjb25jYXRlbmF0ZVJlbW90ZVBhdGgoU3RyaW5nIHNwMSwgU3RyaW5nIHNwMikgewotLy8JCUlQYXRoIHAgPSBuZXcgUGF0aChzcDEpOwotLy8JCXAgPSBwLmFwcGVuZChzcDIpOwotLy8KLS8vCQlyZXR1cm4gcC50b09TU3RyaW5nKCk7Ci0vLwl9Ci0JCi0vLwlwcml2YXRlIFN0cmluZyBwYXJlbnRPZlJlbW90ZVBhdGgoU3RyaW5nIHNwYXRoKSB7Ci0vLwkJSVBhdGggcCA9IG5ldyBQYXRoKHNwYXRoKTsKLS8vCQlwID0gcC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0vLwkJcmV0dXJuIHAudG9PU1N0cmluZygpOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIFN0cmluZyBzdWZmaXhPZlJlbW90ZVBhdGgoU3RyaW5nIHBhdGgpIHsKLS8vCQlpZiAoaXNSZW1vdGVEaXJlY3RvcnlQYXRoKHBhdGgpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLS8vCQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm4gbnVsbDsKLS8vCQkJcmV0dXJuIHJlbW92ZVRyYWlsaW5nU2xhc2gocGF0aC5zdWJzdHJpbmcoaW5kZXgpKTsKLS8vCQl9CQkKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBTdHJpbmcgYWRkVHJhaWxpbmdTbGFzaChTdHJpbmcgcGF0aCkgewotLy8JCWlmIChwYXRoLmVuZHNXaXRoKCIvIikpIHsKLS8vCQkJcmV0dXJuIHBhdGg7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcmV0dXJuIHBhdGggKyAiLyI7Ci0vLwkJfQotLy8JfQotCi0vLwlwcml2YXRlIFN0cmluZyByZW1vdmVUcmFpbGluZ1NsYXNoKFN0cmluZyBwYXRoKSB7Ci0vLwkJaWYgKHBhdGguZW5kc1dpdGgoIi8iKSkgewotLy8JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXJldHVybiBwYXRoOwotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNSZW1vdGVEaXJlY3RvcnlQYXRoKFN0cmluZyBwYXRoKSB7Ci0vLwkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi8iKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlQWJzb2x1dGVQYXRoKFN0cmluZyBwYXRoKSB7Ci0vLwkJcmV0dXJuIHBhdGguc3RhcnRzV2l0aCgiLyIpOwotLy8JfQotCi0vLwlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQkKLS8vCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAocG9zc2libGUgZW1wdHkpIGxpc3Qgb2Ygc3luY2hyb25pemF0aW9uIHJ1bGUgb2JqZWN0cyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGRlc2NyaWJlZCBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVN5bmNocm9uaXphdGlvblJ1bGVbXSBnZXRTeW5jaHJvbml6ZVJ1bGVzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCBydWxlU3RyaW5ncyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfU1lOQ19SVUxFUywgbmV3IEFycmF5TGlzdCgpKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBydWxlU3RyaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUgPSBSdWxlRmFjdG9yeS5jcmVhdGVSdWxlRnJvbVN0cmluZyhlbGVtZW50KTsKLQkJCQlyZXN1bHQuYWRkKHJ1bGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoRGVsZWdhdGVfU3luY2hyb25pemF0aW9uUnVsZXNfSW50ZXJuYWxFcnJvciwgZSwgSVJlbW90ZUxhdW5jaEVycm9ycy5FUlJPUl9QQVJTSU5HX1JVTEUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gKElTeW5jaHJvbml6YXRpb25SdWxlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJU3luY2hyb25pemF0aW9uUnVsZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMDg2N2VmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVJlbW90ZUxhdW5jaERlbGVnYXRlX0xvY2FsRGlyZWN0b3J5X01pc3Npbmc9TWlzc2luZyB2YWx1ZSBmb3IgbG9jYWwgd29ya2luZyBkaXJlY3RvcnkuCi1SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9SZW1vdGVEaXJlY3RvcnlfTWlzc2luZz1UaGUgdmFsdWUgZm9yIHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeSBpcyBtaXNzaW5nLgotUmVtb3RlTGF1bmNoRGVsZWdhdGVfTG9jYWxEaXJlY3RvcnlfTXVzdEJlQWJzb2x1dGU9VGhlIGxvY2FsIHdvcmtpbmcgZGlyZWN0b3J5IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC4KLVJlbW90ZUxhdW5jaERlbGVnYXRlX0xvY2FsRGlyZWN0b3J5X0RvZXNOb3RFeGlzdD1UaGUgbG9jYWwgd29ya2luZyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi1SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9SZW1vdGVEaXJlY3RvcnlfTWFjcm9GYWlsZWQ9RmFpbGVkIHRvIHJlc29sdmUgbWFjcm9zIGZvciByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkKLVJlbW90ZUxhdW5jaERlbGVnYXRlX0xvY2FsRGlyZWN0b3J5X0lzTm90QURpcmVjdG9yeT1UaGUgbG9jYWwgd29ya2luZyBkaXJlY3RvcnkgaXMgbm90IGEgcGF0aCB0byBhIGRpcmVjdG9yeS4KLVJlbW90ZUxhdW5jaERlbGVnYXRlX1JlbW90ZURpcmVjdG9yeV9NaXNzaW5nSW5QcmVmZXJlbmNlcz1UaGUgZGVmYXVsdCB2YWx1ZSBmb3IgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5IGlzIG1pc3NpbmcgaW4gdGhlIHByZWZlcmVuY2VzIGZvciBSZW1vdGUgVG9vbHMgQXBwbGljYXRpb24gTGF1bmNoZXIuCi1SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9SZW1vdGVEaXJlY3RvcnlfTWFjcm9GYWlsZWRfVW5rbm93bj1GYWlsZWQgdG8gcmVzb2x2ZSBtYWNyb3MgZm9yIHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeSAodW5rbm93biByZWFzb24pLgotUmVtb3RlTGF1bmNoRGVsZWdhdGVfUmVtb3RlRGlyZWN0b3J5X011c3RCZUFic29sdXRlPVRoZSByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLgotRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nUHJvamVjdD1ObyBwcm9qZWN0IHNwZWNpZmllZCBmb3IgcmVtb3RlIGxhdW5jaC4KLUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb25fRXJyb3JfTWlzc2luZ0V4ZWN1dGFibGU9Tm8gZXhlY3V0YWJsZSBzcGVjaWZpZWQgZm9yIHJlbW90ZSBsYXVuY2guCi1FeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdSZW1vdGVXb3JraW5nRGlyZWN0b3J5PU5vIHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yIHJlbW90ZSBsYXVuY2guCi1FeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdMb2NhbFJlbW90ZURpcmVjdG9yeT1ObyBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yIHJlbW90ZSBsYXVuY2guCi1SZW1vdGVMYXVuY2hEZWxlZ2F0ZV9TeW5jaHJvbml6YXRpb25SdWxlc19JbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yIHdoaWxlIHJlYWRpbmcgc3luY2hyb25pemF0aW9uIHJ1bGUgZnJvbSBsYXVuY2ggY29uZmlndXJhdGlvbi4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvRG93bmxvYWRSdWxlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL0Rvd25sb2FkUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2YwZjE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvRG93bmxvYWRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSVJlbW90ZUxhdW5jaEVycm9yczsKLQotLyoKLSAqIFJlcHJlc2VudHMgYW4gdXBsb2FkIHJ1bGUuCi0gKiBJdCBkZXNjcmliZXMgaG93IHRvIGNvcHkgYSBsaXN0IG9mIGxvY2FsIGZpbGVzIG9yIGxvY2FsIGRpcmVjdG9yaWVzIGludG8gYSBzaW5nbGUgcmVtb3RlIGRpcmVjdG9yeS4KLSAqIEEgbG9jYWwgZmlsZSBpcyBjb3BpZWQgaW50byB0aGUgcmVtb3RlIGRpcmVjdG9yeS4KLSAqIEEgbG9jYWwgZGlyZWN0b3J5IGhhcyBpdHMgY29udGVudCBjb3BpZWQgcmVjdXJzaXZlbHkgaW50byB0aGUgcmVtb3RlIGRpcmVjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIERvd25sb2FkUnVsZSBpbXBsZW1lbnRzIElTeW5jaHJvbml6YXRpb25SdWxlIHsKLQlwcml2YXRlIGludCBvdmVyd3JpdGVQb2xpY3kgPSBPdmVyd3JpdGVQb2xpY2llcy5VTktOT1dOOwotCi0JcHJpdmF0ZSBib29sZWFuIGFzUmVhZE9ubHkgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gYXNFeGVjdXRhYmxlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlVGltZVN0YW1wID0gZmFsc2U7Ci0JCi0JLyoqIExvY2FsIGRlc3RpbnkgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlcyBhcmUgZG93bmxvYWRlZCBpbnRvLiAqLwotCXByaXZhdGUgU3RyaW5nIGxvY2FsRGlyZWN0b3J5ID0gbnVsbDsKLQkKLQkvKioKLQkgKiBMaXN0IG9mIHJlbW90ZSBzb3VyY2UgcGF0aHMsIHJlcHJlc2VudGVkIGFzIHN0cmluZ3MuCi0JICogVGhleSBtYXkgYmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IHJlbW90ZUZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEb3dubG9hZFJ1bGUoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgZGUgcnVsZSBmcm9tIGEgc2VyaWFsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIERvd25sb2FkUnVsZShTdHJpbmcgZGF0YSkgewotCQkvKgotCQkgKiBTcGxpdCB0aGUgc3RyaW5nIGludG8gbGluZXMuCi0JCSAqLwotCQlTdHJpbmcgbGlzdFtdID0gZGF0YS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZmlyc3QgdG9rZW4gaXMgdGhlIHByb3BlciBpZGVudGlmaWVyLiBJZiBub3QsIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEgcnVsZSB0aGF0Ci0JCSAqIGNhbiBiZSBwYXJzZWQgYnkgdGhpcyBjbGFzcy4KLQkJICovCi0JCXsKLQkJCWlmIChsaXN0Lmxlbmd0aCA8IDEpIHsKLQkJCQl0aHJvd0Vycm9yKCJUaGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJ1bGUgZm9yICIrdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBzID0gbGlzdFswXTsKLQkJCWlmICghIHMuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5UWVBFX0RPV05MT0FEKSkgewotCQkJCXRocm93RXJyb3IoIlRoZSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcnVsZSBmb3IgIit0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHMgPSBsaXN0W2ldOwotCQkJLyoKLQkJCSAqIFNwbGl0IGtleSBmcm9tIGRhdGEuCi0JCQkgKi8KLQkJCWludCBwID0gcy5pbmRleE9mKCcgJyk7Ci0JCQlpZiAocCA9PSAtMSkgewotCQkJCWxvZ0Vycm9yKCJJbnZhbGlkIHJ1bGUgZW50cnk6ICIrcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBrZXkgPSBzLnN1YnN0cmluZygwLCBwKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHMuc3Vic3RyaW5nKHAgKyAxKTsKLQkJCXBhcnNlRW50cnkoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIERvd25sb2FkUnVsZShEb3dubG9hZFJ1bGUgcnVsZSkgewotCQl0aGlzLm92ZXJ3cml0ZVBvbGljeSA9IHJ1bGUub3ZlcndyaXRlUG9saWN5OwotCQl0aGlzLmFzUmVhZE9ubHkgPSBydWxlLmFzUmVhZE9ubHk7Ci0JCXRoaXMuYXNFeGVjdXRhYmxlID0gcnVsZS5hc0V4ZWN1dGFibGU7Ci0JCXRoaXMucHJlc2VydmVUaW1lU3RhbXAgPSBydWxlLnByZXNlcnZlVGltZVN0YW1wOwotCQlpZiAocnVsZS5sb2NhbERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvY2FsRGlyZWN0b3J5ID0gbmV3IFN0cmluZyhydWxlLmxvY2FsRGlyZWN0b3J5KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubG9jYWxEaXJlY3RvcnkgPSBudWxsOwotCQl9Ci0JCXRoaXMucmVtb3RlRmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KHJ1bGUucmVtb3RlRmlsZUxpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aHJvd0Vycm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3RyaW5nKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUVudHJ5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0xPQ0FMX1BBVEgpKSB7Ci0JCQlsb2NhbERpcmVjdG9yeSA9IHZhbHVlOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZKSkgewotCQkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQUxXQVlTKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUzsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9BU0spKSB7Ci0JCQkJb3ZlcndyaXRlUG9saWN5ID0gT3ZlcndyaXRlUG9saWNpZXMuQVNLOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX05FV0VSKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX1NLSVApKSB7Ci0JCQkJb3ZlcndyaXRlUG9saWN5ID0gT3ZlcndyaXRlUG9saWNpZXMuU0tJUDsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9nRXJyb3IoIlVua25vd24gb3ZlcndyaXRlIHBvbGljeTogIit2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1MpKSB7Ci0JCQlTdHJpbmcgZmxhZ3NbXSA9IHZhbHVlLnNwbGl0KCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgZmxhZyA9IGZsYWdzW2ldOwotCQkJCWlmIChmbGFnLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX1RJTUVTVEFNUCkpIHsKLQkJCQkJcHJlc2VydmVUaW1lU3RhbXAgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ0Vycm9yKCJVbmtub3duIGZsYWc6ICIrZmxhZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX1JFTU9URV9QQVRIKSkgewotCQkJcmVtb3RlRmlsZUxpc3QuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlMpKSB7Ci0JCQlTdHJpbmcgZmxhZ3NbXSA9IHZhbHVlLnNwbGl0KCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgZmxhZyA9IGZsYWdzW2ldOwotCQkJCWlmIChmbGFnLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TX0VYRUNVVEFCTEUpKSB7Ci0JCQkJCWFzRXhlY3V0YWJsZSA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChmbGFnLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TX1JFQURPTkxZKSkgewotCQkJCQlhc1JlYWRPbmx5ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2dFcnJvcigiVW5rbm93biBwZXJtaXNzaW9uOiAiK2ZsYWcpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJbG9nRXJyb3IoIlVua25vd24ga2V5OiAiK2tleSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dFcnJvcihTdHJpbmcgc3RyaW5nKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQkvKgotCSAqIFRoZSBydWxlIGFzIGEgc2VyaWFsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobG9jYWxEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX0xPQ0FMX1BBVEgrIiAiK2xvY2FsRGlyZWN0b3J5LnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAob3ZlcndyaXRlUG9saWN5ID09IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUykgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1krIiAiK1NlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX0FMV0FZUyk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvdmVyd3JpdGVQb2xpY3kgPT0gT3ZlcndyaXRlUG9saWNpZXMuQVNLKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSsiICIrU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQVNLKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5ORVdFUikgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1krIiAiK1NlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX05FV0VSKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5TS0lQKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWSsiICIrU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfU0tJUCk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoYXNFeGVjdXRhYmxlIHx8IGFzUmVhZE9ubHkpIHsKLQkJCVN0cmluZyBzID0gU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TOwotCQkJaWYgKGFzRXhlY3V0YWJsZSkgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TX0VYRUNVVEFCTEU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChhc1JlYWRPbmx5KSB7Ci0JCQkJcyArPSAiICIgKyBTZXJpYWxpemF0aW9uS2V5cy5LRVlfUEVSTUlTU0lPTlNfUkVBRE9OTFk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWwuYWRkKHMpOwotCQl9Ci0JCWlmIChwcmVzZXJ2ZVRpbWVTdGFtcCkgewotCQkJU3RyaW5nIHMgPSBTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1M7Ci0JCQlpZiAocHJlc2VydmVUaW1lU3RhbXApIHsKLQkJCQlzICs9ICIgIiArIFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHU19USU1FU1RBTVA7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWwuYWRkKHMpOwkJCQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW90ZUZpbGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHJlbW90ZVBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZW1vdGVQYXRoID09IG51bGwpIGNvbnRpbnVlOwotCQkJaWYgKHJlbW90ZVBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIGNvbnRpbnVlOwotCQkJCi0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfUkVNT1RFX1BBVEgrIiAiK3JlbW90ZVBhdGgudHJpbSgpKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyhTZXJpYWxpemF0aW9uS2V5cy5UWVBFX0RPV05MT0FEKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQgKz0gIlxuIiArIGVsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXNFeGVjdXRhYmxlKCkgewotCQlyZXR1cm4gYXNFeGVjdXRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzRXhlY3V0YWJsZShib29sZWFuIGFzRXhlY3V0YWJsZSkgewotCQl0aGlzLmFzRXhlY3V0YWJsZSA9IGFzRXhlY3V0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBhc1JlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzUmVhZE9ubHkoYm9vbGVhbiBhc1JlYWRPbmx5KSB7Ci0JCXRoaXMuYXNSZWFkT25seSA9IGFzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPdmVyd3JpdGVQb2xpY3koKSB7Ci0JCXJldHVybiBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlUG9saWN5KGludCBvdmVyd3JpdGVQb2xpY3kpIHsKLQkJdGhpcy5vdmVyd3JpdGVQb2xpY3kgPSBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZVN0YW1wKGJvb2xlYW4gcHJlc2VydmVUaW1lU3RhbXApIHsKLQkJdGhpcy5wcmVzZXJ2ZVRpbWVTdGFtcCA9IHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxEaXJlY3RvcnkoKSB7Ci0JCWlmIChsb2NhbERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbG9jYWxEaXJlY3RvcnkudHJpbSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYWxEaXJlY3RvcnkoU3RyaW5nIGxvY2FsRGlyZWN0b3J5KSB7Ci0JCWlmIChsb2NhbERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvY2FsRGlyZWN0b3J5ID0gbG9jYWxEaXJlY3RvcnkudHJpbSgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5sb2NhbERpcmVjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRSZW1vdGVGaWxlQ291bnQoKSB7Ci0JCXJldHVybiByZW1vdGVGaWxlTGlzdC5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgW10gZ2V0UmVtb3RlRmlsZXNBc1N0cmluZ0FycmF5KCkgewotCQlTdHJpbmcgcmVzdWx0IFtdID0gbmV3IFN0cmluZyBbcmVtb3RlRmlsZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IChTdHJpbmcpIHJlbW90ZUZpbGVMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUGF0aCBbXSBnZXRSZW1vdGVGaWxlc0FzUGF0aEFycmF5KCkgewotCQlJUGF0aCByZXN1bHQgW10gPSBuZXcgSVBhdGggW3JlbW90ZUZpbGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgUGF0aCgoU3RyaW5nKSByZW1vdGVGaWxlTGlzdC5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEZpbGUgW10gZ2V0UmVtb3RlRmlsZXNBc0ZpbGVBcnJheSgpIHsKLQkJRmlsZSByZXN1bHQgW10gPSBuZXcgRmlsZSBbcmVtb3RlRmlsZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBGaWxlKChTdHJpbmcpIHJlbW90ZUZpbGVMaXN0LmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIFJlbW90ZUZpbGVJdGVyYXRvckFzU3RyaW5nIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlJdGVyYXRvciBpdGVyYXRvcnJlZiA9IHJlbW90ZUZpbGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGl0ZXJhdG9ycmVmLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXJldHVybiBpdGVyYXRvcnJlZi5uZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpdGVyYXRvcnJlZi5yZW1vdmUoKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIGNsYXNzIFJlbW90ZUZpbGVJdGVyYXRvckFzUGF0aCBleHRlbmRzIFJlbW90ZUZpbGVJdGVyYXRvckFzU3RyaW5nIHsKLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKChTdHJpbmcpaXRlcmF0b3JyZWYubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciByZW1vdGVJdGVyYXRvckFzU3RyaW5nKCkgewotCQlyZXR1cm4gbmV3IFJlbW90ZUZpbGVJdGVyYXRvckFzU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIHJlbW90ZUl0ZXJhdG9yQXNQYXRoKCkgewotCQlyZXR1cm4gbmV3IFJlbW90ZUZpbGVJdGVyYXRvckFzUGF0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlbW90ZUZpbGUoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJCXJlbW90ZUZpbGVMaXN0LmFkZChzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVtb3RlRmlsZShJUGF0aCBwYXRoKSB7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXJlbW90ZUZpbGVMaXN0LmFkZChwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURvd25sb2FkUnVsZSByID0gbmV3IERvd25sb2FkUnVsZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0QXNFeGVjdXRhYmxlKHRydWUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0QXNSZWFkT25seSh0cnVlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHIpOwotCQlyLnNldExvY2FsRGlyZWN0b3J5KCIvdG1wL2EiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0T3ZlcndyaXRlUG9saWN5KE92ZXJ3cml0ZVBvbGljaWVzLkFTSyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihyKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUZpbGUoU3RyaW5nIGVudHJ5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW90ZUZpbGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmVxdWFscyhlbnRyeSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUZpbGUoSVBhdGggZW50cnkpIHsKLQkJcmVtb3ZlUmVtb3RlRmlsZShlbnRyeS50b09TU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVGaWxlcyhTdHJpbmdbXSBpdGVtcykgewotCQljbGVhclJlbW90ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBpdGVtc1tpXTsKLQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCWFkZFJlbW90ZUZpbGUoc3RyaW5nLnRyaW0oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlRmlsZXMoSVBhdGhbXSBpdGVtcykgewotCQljbGVhclJlbW90ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSBpdGVtc1tpXTsKLQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQlhZGRSZW1vdGVGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyUmVtb3RlRmlsZXMoKSB7Ci0JCXJlbW90ZUZpbGVMaXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG93bmxvYWRSdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwbG9hZFJ1bGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5VTktOT1dOKSB7Ci0JCQlSZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuRG93bmxvYWRSdWxlX1ZhbGlkYXRpb25fTWlzc2luZ092ZXJ3cml0ZVBvbGljeSwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX1JVTEUpOwotCQl9Ci0JCWlmIChsb2NhbERpcmVjdG9yeSA9PSBudWxsKSB7Ci0JCQlSZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuRG93bmxvYWRSdWxlX1ZhbGlkYXRpb25fTWlzc2luZ1JlbW90ZURpcmVjdG9yeSwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX1JVTEUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9MYWJlbCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICJET1dOTE9BRCAiK0ludGVnZXIudG9TdHJpbmcocmVtb3RlRmlsZUxpc3Quc2l6ZSgpKSsiIGl0ZW0ocykgYmFjayB0byAiK2xvY2FsRGlyZWN0b3J5OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ODZjNmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklDUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLlJlbW90ZUxhdW5jaGVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklSZW1vdGVMYXVuY2hFcnJvcnM7Ci0KLS8qKgotICogU3RvcmVzIGNvbmZpZ3VyYXRpb24gaG93IHRoZSByZW1vdGUgbGF1bmNoIGl0IHRvIGJlIGV4ZWN1dGVkLgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRpb25Db25maWd1cmF0aW9uIHsKLQotCUlDUHJvamVjdCBjUHJvamVjdCA9IG51bGw7IC8vIHJlcXVpcmVkCi0JRmlsZSBleGVjdXRhYmxlID0gbnVsbDsgLy8gcmVxdWlyZWQKLQlib29sZWFuIGRvQ29ubmVjdFN0cmVhbXMgPSB0cnVlOwotCWJvb2xlYW4gZG9Gb3J3YXJkWDExID0gZmFsc2U7Ci0JYm9vbGVhbiBkb0FsbG9jYXRlVGVybWluYWwgPSB0cnVlOwotCQotCUlQYXRoIHJlbW90ZURpcmVjdG9yeSA9IG51bGw7IC8vIHJlcXVpcmVkCi0JRmlsZSB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsgLy8gcmVxdWlyZWQKLQlMaXN0IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlMaXN0IGVudmlyb25tZW50VmFyaWFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCVN0cmluZyBiZWZvcmVDb21tYW5kID0gbnVsbDsgLy8gZGVmYXVsdHMgdG8gbm90aGluZwotCVN0cmluZyBhZnRlckNvbW1hbmQgPSBudWxsOyAvLyBkZWZhdWx0cyB0byBub3RoaW5nCi0JYm9vbGVhbiBzeW5jaHJvbml6ZUFmdGVyID0gZmFsc2U7Ci0JYm9vbGVhbiBzeW5jaHJvbml6ZUJlZm9yZSA9IGZhbHNlOwotCWJvb2xlYW4gZG9DbGVhbnVwID0gZmFsc2U7Ci0JCi0JTGlzdCBzeW5jaHJvbml6YXRpb25SdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlTdHJpbmcgbGFiZWw7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERvQ2xlYW51cCgpIHsKLQkJcmV0dXJuIGRvQ2xlYW51cDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb0NsZWFudXAoYm9vbGVhbiBkb0NsZWFudXApIHsKLQkJdGhpcy5kb0NsZWFudXAgPSBkb0NsZWFudXA7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEFyZ3VtZW50c0FycmF5KCkgewotCQlTdHJpbmcgW10gYXJyYXkgPSBuZXcgU3RyaW5nW2FyZ3VtZW50cy5zaXplKCldOwotCQlhcmd1bWVudHMudG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50KSB7Ci0JCWFyZ3VtZW50cy5hZGQoYXJndW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50cyhTdHJpbmdbXSBhcmd1bWVudHNBcnJheSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50c0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJndW1lbnQgPSBhcmd1bWVudHNBcnJheVtpXTsKLQkJCWFkZEFyZ3VtZW50KGFyZ3VtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERvQ29ubmVjdFN0cmVhbXMoKSB7Ci0JCXJldHVybiBkb0Nvbm5lY3RTdHJlYW1zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvQ29ubmVjdFN0cmVhbShib29sZWFuIGRvQ29ubmVjdCkgewotCQl0aGlzLmRvQ29ubmVjdFN0cmVhbXMgPSBkb0Nvbm5lY3Q7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERvRm9yd2FyZFgxMSgpIHsKLQkJcmV0dXJuIGRvRm9yd2FyZFgxMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb0ZvcndhcmRYMTEoYm9vbGVhbiBkb0ZvcndhcmQpIHsKLQkJdGhpcy5kb0ZvcndhcmRYMTEgPSBkb0ZvcndhcmQ7Ci0JfQotCi0JcHVibGljIElDUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gY1Byb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJQ1Byb2plY3QgcHJvamVjdCkgewotCQljUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEVudmlyb25tZW50VmFyaWFibGVzQXJyYXkoKSB7Ci0JCVN0cmluZyBbXSBhcnJheSA9IG5ldyBTdHJpbmdbZW52aXJvbm1lbnRWYXJpYWJsZXMuc2l6ZSgpXTsKLQkJZW52aXJvbm1lbnRWYXJpYWJsZXMudG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnZpcm9ubWVudFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZSkgewotCQllbnZpcm9ubWVudFZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudmlyb25tZW50VmFyaWFibGVzKFN0cmluZ1tdIGVudmlyb25tZW50QXJyYXkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZpcm9ubWVudEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZW52aXJvbm1lbnRBcnJheVtpXTsKLQkJCWFkZEVudmlyb25tZW50VmFyaWFibGUoc3RyaW5nKTsKLQkJfQotCX0JCi0KLQlwdWJsaWMgRmlsZSBnZXRFeGVjdXRhYmxlRmlsZSgpIHsKLQkJcmV0dXJuIGV4ZWN1dGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShGaWxlIGV4ZWN1dGFibGUpIHsKLQkJdGhpcy5leGVjdXRhYmxlID0gZXhlY3V0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UmVtb3RlRGlyZWN0b3J5UGF0aCgpIHsKLQkJcmV0dXJuIHJlbW90ZURpcmVjdG9yeTsKLQl9Ci0KLQlzdGF0aWMgaW50IGNvdW50ZXIgPSAwOwotCQotCXB1YmxpYyB2b2lkIHNldFJlbW90ZURpcmVjdG9yeShJUGF0aCByZW1vdGVEaXJlY3RvcnkpIHsKLQkJLy90aGlzLnJlbW90ZURpcmVjdG9yeSA9IHJlbW90ZURpcmVjdG9yeS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjb3VudGVyKyspKTsKLQkJdGhpcy5yZW1vdGVEaXJlY3RvcnkgPSByZW1vdGVEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0V29ya2luZ0RpcmVjdG9yeUZpbGUoKSB7Ci0JCXJldHVybiB3b3JraW5nRGlyZWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KEZpbGUgd29ya2luZ0RpcmVjdG9yeSkgewotCQl0aGlzLndvcmtpbmdEaXJlY3RvcnkgPSB3b3JraW5nRGlyZWN0b3J5OwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRSZW1vdGVFeGVjdXRhYmxlUGF0aCgpIHsKLQkJSVBhdGggbG9jYWxFeGVjdXRhYmxlID0gbmV3IFBhdGgoZXhlY3V0YWJsZS5nZXRQYXRoKCkpOwotCQlJUGF0aCByZW1vdGVFeGVjdXRhYmxlID0gcmVtb3RlRGlyZWN0b3J5LmFwcGVuZChsb2NhbEV4ZWN1dGFibGUubGFzdFNlZ21lbnQoKSk7Ci0JCXJldHVybiByZW1vdGVFeGVjdXRhYmxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUV4ZWN1dGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0UmVtb3RlRXhlY3V0YWJsZVBhdGgoKS5sYXN0U2VnbWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJlZm9yZUNvbW1hbmQoU3RyaW5nIGJlZm9yZUNvbW1hbmQpIHsKLQkJdGhpcy5iZWZvcmVDb21tYW5kID0gYmVmb3JlQ29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBZnRlckNvbW1hbmQoU3RyaW5nIGFmdGVyQ29tbWFuZCkgewotCQl0aGlzLmFmdGVyQ29tbWFuZCA9IGFmdGVyQ29tbWFuZDsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvU3luY2hyb25pemVBZnRlcihib29sZWFuIHN5bmNocm9uaXplQWZ0ZXIpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUFmdGVyID0gc3luY2hyb25pemVBZnRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RG9TeW5jaHJvbml6ZUJlZm9yZShib29sZWFuIHN5bmNocm9uaXplQmVmb3JlKSB7Ci0JCXRoaXMuc3luY2hyb25pemVCZWZvcmUgPSBzeW5jaHJvbml6ZUJlZm9yZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFmdGVyQ29tbWFuZCgpIHsKLQkJcmV0dXJuIGFmdGVyQ29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJlZm9yZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBiZWZvcmVDb21tYW5kOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERvU3luY2hyb25pemVBZnRlcigpIHsKLQkJcmV0dXJuIHN5bmNocm9uaXplQWZ0ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RG9TeW5jaHJvbml6ZUJlZm9yZSgpIHsKLQkJcmV0dXJuIHN5bmNocm9uaXplQmVmb3JlOwotCX0KLQotCXB1YmxpYyBJU3luY2hyb25pemF0aW9uUnVsZVtdIGdldFN5bmNocm9uaXphdGlvblJ1bGVzQXJyYXkoKSB7Ci0JCUlTeW5jaHJvbml6YXRpb25SdWxlW10gYXJyYXkgPSAoSVN5bmNocm9uaXphdGlvblJ1bGVbXSkgc3luY2hyb25pemF0aW9uUnVsZXMudG9BcnJheShuZXcgSVN5bmNocm9uaXphdGlvblJ1bGVbc3luY2hyb25pemF0aW9uUnVsZXMuc2l6ZSgpXSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTeW5jaHJvbml6YXRpb25SdWxlKElTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUpIHsKLQkJc3luY2hyb25pemF0aW9uUnVsZXMuYWRkKHJ1bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN5bmNocm9uaXphdGlvblJ1bGVzKElTeW5jaHJvbml6YXRpb25SdWxlIFtdcnVsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykgewotCQkJSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSA9IHJ1bGVzW2ldOwotCQkJYWRkU3luY2hyb25pemF0aW9uUnVsZShydWxlKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIGludCBjb3VudFN5bmNocm9uaXphdGlvblJ1bGVzKCkgewotCQlyZXR1cm4gc3luY2hyb25pemF0aW9uUnVsZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvdW50VXBsb2FkUnVsZXMoKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzeW5jaHJvbml6YXRpb25SdWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIGVsZW1lbnQgPSAoSVN5bmNocm9uaXphdGlvblJ1bGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuaXNVcGxvYWRSdWxlKCkpIHsKLQkJCQlyZXN1bHQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgaW50IGNvdW50RG93bmxvYWRSdWxlcygpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN5bmNocm9uaXphdGlvblJ1bGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVN5bmNocm9uaXphdGlvblJ1bGUgZWxlbWVudCA9IChJU3luY2hyb25pemF0aW9uUnVsZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5pc0Rvd25sb2FkUnVsZSgpKSB7Ci0JCQkJcmVzdWx0Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb0FsbG9jYXRlVGVybWluYWwoYm9vbGVhbiBhbGxvY2F0ZVRlcm1pbmFsKSB7Ci0JCXRoaXMuZG9BbGxvY2F0ZVRlcm1pbmFsID0gYWxsb2NhdGVUZXJtaW5hbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RG9BbGxvY2F0ZVRlcm1pbmFsKCkgewotCQlyZXR1cm4gZG9BbGxvY2F0ZVRlcm1pbmFsOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmFpc2UgYSB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0gaWYgc29tZSBhdHRyaWJ1dGUgaXMgbWlzc2luZwotCSAqIG9yIGludmFsaWQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlSZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nUHJvamVjdCwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX0VYRUNVVElPTl9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlpZiAoZXhlY3V0YWJsZSA9PSBudWxsKSB7Ci0JCQlSZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nRXhlY3V0YWJsZSwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX0VYRUNVVElPTl9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlpZiAocmVtb3RlRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCVJlbW90ZUxhdW5jaGVyUGx1Z2luLnRocm93Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5FeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdSZW1vdGVXb3JraW5nRGlyZWN0b3J5LCBJUmVtb3RlTGF1bmNoRXJyb3JzLklOVkFMSURfRVhFQ1VUSU9OX0NPTkZJR1VSQVRJT04pOwotCQl9Ci0JCWlmICh3b3JraW5nRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCVJlbW90ZUxhdW5jaGVyUGx1Z2luLnRocm93Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5FeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdMb2NhbFJlbW90ZURpcmVjdG9yeSwgSVJlbW90ZUxhdW5jaEVycm9ycy5JTlZBTElEX0VYRUNVVElPTl9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL0V4ZWN1dGlvblJlc3VsdC5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9FeGVjdXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmNhZmMwNS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL0V4ZWN1dGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YTsKLQotLyoqCi0gKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSByZW1vdGUgbGF1bmNoIGZpbmlzaGVkIGV4ZWN1dGlvbi4KLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgRXhlY3V0aW9uUmVzdWx0IHsKLQlpbnQgZXhpdFZhbHVlID0gMDsKLQlpbnQgc3RhdHVzID0gVU5ERUZJTkVEOwotCQotCS8vIEV4ZWN1dGlvbiByZXN1bHQgc3RhdHVzIGZvciByZW1vdGUgYXBwbGljYXRpb24KLQkvKiogVGhlIGV4ZWN1dGlvbiBvZiBhcHBsaWNhdGlvbiBoYXMgbm95IHlldCBmaW5pc2hlZC4gVGhlIGV4ZWN1dGlvbiByZXN1bHRhIGhhcyBub3QgbWVhbmluZyB5ZXN0LiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRCA9IDA7Ci0JLyoqIFRoZSBleGVjdXRpb24gb2YgYXBwbGljYXRpb24gaGFzIGZpbmlzaGVkIHN1Y2Nlc2Z1bGx5IHdpdGggemVybyBhcyBleGl0IHZhbHVlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1MgPSAxOwotCS8qKiBUaGUgZXhlY3V0aW9uIG9mIGFwcGxpY2F0aW9uIGhhcyBmaW5pc2hlZCBzdWNjZXNmdWxseSwgYnV0IHdpdGggbm9uemVybyBleGl0IHZhbHVlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1NfV0lUSF9DT0RFID0gMjsKLQkvKiogVGhlIGV4ZWN1dGlvbiBvZiB0aGUgYXBwbGljYXRpb24gd2FzIGNhbmNlbGxlZCBiZWNhdXNlIHRoZSB0aGUgdXNlciB0ZXJtaW5hdGVkL2tpbGxlZCB0aGUgcHJvY2Vzcy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxMRUQgPSAzOwotCS8qKiBUaGUgZXhlY3V0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiB3YXMgdGVybWluYXRlZCBieSB0aGUgcmVtb3RlIG9wZXJhdGluZyBzeXN0ZW0uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OID0gNDsKLQkvKiogVGhlIGNvbW1hbmQgdXNlZCB0byBsYXVuY2ggdGhlIGFwcGxpY2F0aW9uIHdhcyBub3QgYWNjZXB0ZWQgYnkgdGhlIHJlbW90ZSBvcGVyYXRpbmcgc3lzdGVtLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1BTkRfRVJST1IgPSA1OwotCS8qKiBUaGUgZXhlY3V0aW9uIG9mIGFwcGxpY2F0aW9uIGZhaWxlZCwgYnV0IG5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gNjsKLQkvKiogVGhlIGxhdW5jaGVyIGZhaWxlZCBkdWUgYW4gaW50ZXJuYWwgZXJyb3IuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSA3OwotCQotCXB1YmxpYyBpbnQgZ2V0RXhpdFZhbHVlKCkgewotCQlyZXR1cm4gZXhpdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4aXRWYWx1ZShpbnQgZXhpdFZhbHVlKSB7Ci0JCXRoaXMuZXhpdFZhbHVlID0gZXhpdFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9JU3luY2hyb25pemF0aW9uUnVsZS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9JU3luY2hyb25pemF0aW9uUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmM1MDJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvSVN5bmNocm9uaXphdGlvblJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJZGVudGlmaWVzIGEgc3luY2hyb25pemF0dWlvbiBydWxlIGZvciB0aGUgbGF1bmNoIGpvYi4KLSAqIEBhdXRob3IgRGFuaWVsIEZlcmJlcgotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTeW5jaHJvbml6YXRpb25SdWxlIHsKLQkvKioKLQkgKiBBIGxhYmVsIHRvIHNob3cgdGhlIHJ1bGUgZm9yIGRlYnVnLgotCSAqIEByZXR1cm4gVGhlIGxhYmVsCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvTGFiZWwoKTsKLQkKLQkvKioKLQkgKiBRdWVyeSBpZiB0aGUgcnVsZSBpcyBhY3RpdmUgYW5kIGhhcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gdG8gYmUgYXBwbGllZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKTsKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgcnVsZSBhbmQgcmFpc2UgYSB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0gaWYgc29tZSBhdHRyaWJ1dGUgaXMgbWlzc2luZwotCSAqIG9yIG5vdCB2YWxpZC4gVGhlIHZhbGlkYXRpb24gZG9lcyBub3QgaW5jbHVkZSBjaGVjayBmb3IgZXhpc3RpbmcgZmlsZXMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBRdWVyaWVzIGlmIHRoZSB0dWxlIGNhbiBiZSB1c2VkIGJ5IGxhdW5jaCBqb2IgYWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIGZpbmlzaGVzIGV4ZWN1dGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICogQGF1dGhvciBEYW5pZWwgRmVyYmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkUnVsZSgpOwotCi0JLyoqCi0JICogUXVlcmllcyBpZiB0aGUgcnVsZSBjYW4gYmUgdXNlZCBieSBsYXVuY2ggam9iIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzIGV4ZWN1dGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QuCi0JICogQGF1dGhvciBEYW5pZWwgRmVyYmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwbG9hZFJ1bGUoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvTWVzc2FnZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjU1YTlhNi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVfVmFsaWRhdGlvbl9NaXNzaW5nT3ZlcndyaXRlUG9saWN5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlX1ZhbGlkYXRpb25fTWlzc2luZ1JlbW90ZURpcmVjdG9yeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb25fRXJyb3JfTWlzc2luZ0V4ZWN1dGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdMb2NhbFJlbW90ZURpcmVjdG9yeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb25fRXJyb3JfTWlzc2luZ1Byb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdSZW1vdGVXb3JraW5nRGlyZWN0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZV9WYWxpZGF0ZV9NaXNzaW5nT3ZlcndyaXRlUG9saWN5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZV9WYWxpZGF0ZV9NaXNzaW5nUmVtb3RlZGlyZWN0b3J5OwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvT3ZlcndyaXRlUG9saWNpZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvT3ZlcndyaXRlUG9saWNpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JlYjA4Yy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL092ZXJ3cml0ZVBvbGljaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIE92ZXJ3cml0ZVBvbGljaWVzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTS0lQID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFdBWVMgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FV0VSID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0sgPSA0OwotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9SdWxlRmFjdG9yeS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9SdWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjc3NzhmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvUnVsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGE7Ci0KLQotcHVibGljIGNsYXNzIFJ1bGVGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IHN5bmNocm9uaXphdGlvbiBydWxlIG9iamVjdCBmb3IgdGhlIHNlcmlhbGl6ZWQgc3RyaW5nLgotCSAqIEBwYXJhbSBzdHJpbmcgVGhlIHNlcmlhbGl6ZWQgc3RyaW5nCi0JICogQHJldHVybiBUaGUgcnVsZSBvciBudWxsIGlmIG5vIHJ1bGUgaXMga25vd24gZm9yIHRoZSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3luY2hyb25pemF0aW9uUnVsZSBjcmVhdGVSdWxlRnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyBsaXN0W10gPSBzdHJpbmcuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpcnN0ID0gbGlzdFswXTsKLQkJaWYgKGZpcnN0LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuVFlQRV9VUExPQUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFVwbG9hZFJ1bGUoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChmaXJzdC5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLlRZUEVfRE9XTkxPQUQpKSB7Ci0JCQlyZXR1cm4gbmV3IERvd25sb2FkUnVsZShzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3luY2hyb25pemF0aW9uUnVsZSBkdXBsaWNhdGVSdWxlKElTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBEb3dubG9hZFJ1bGUpIHsKLQkJCURvd25sb2FkUnVsZSBkb3dubG9hZFJ1bGUgPSAoRG93bmxvYWRSdWxlKSBydWxlOwotCQkJcmV0dXJuIG5ldyBEb3dubG9hZFJ1bGUoZG93bmxvYWRSdWxlKTsKLQkJfSBpZiAocnVsZSBpbnN0YW5jZW9mIFVwbG9hZFJ1bGUpIHsKLQkJCVVwbG9hZFJ1bGUgdXBsb2FkUnVsZSA9IChVcGxvYWRSdWxlKSBydWxlOwotCQkJcmV0dXJuIG5ldyBVcGxvYWRSdWxlKHVwbG9hZFJ1bGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL1NlcmlhbGl6YXRpb25LZXlzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL1NlcmlhbGl6YXRpb25LZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkOGIyMzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9TZXJpYWxpemF0aW9uS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YTsKLQotCi1pbnRlcmZhY2UgU2VyaWFsaXphdGlvbktleXMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfVVBMT0FEID0gInVwbG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX0RPV05MT0FEID0gImRvd25sb2FkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9SRU1PVEVfUEFUSCA9ICJyZW1vdGUtcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9PVkVSV1JJVEVfUE9MSUNZID0gIm92ZXJ3cml0ZS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfT1ZFUldSSVRFX1BPTElDWV9TS0lQID0gInNraXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfT1ZFUldSSVRFX1BPTElDWV9BTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX09WRVJXUklURV9QT0xJQ1lfTkVXRVIgPSAibmV3ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfT1ZFUldSSVRFX1BPTElDWV9BU0sgPSAiYXNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BFUk1JU1NJT05TX1JFQURPTkxZID0gInJlYWRvbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX1BFUk1JU1NJT05TX0VYRUNVVEFCTEUgPSAiZXhlY3V0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9GTEFHUyA9ICJmbGFncyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9GTEFHU19USU1FU1RBTVAgPSAidGltZXN0YW1wIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX0ZMQUdTX0RPV05MT0FEX0JBQ0sgPSAiZG93bmxvYWQtYmFjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV9GTEFHU19ERUZBVUxUX1JFTU9URV9ESVJFQ1RPUlkgPSAiZGVmYXVsdC1yZW1vdGUtZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZX0xPQ0FMX1BBVEggPSAibG9jYWwtcGF0aCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvVXBsb2FkUnVsZS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9VcGxvYWRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3ZWNiMmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvZGF0YS9VcGxvYWRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSVJlbW90ZUxhdW5jaEVycm9yczsKLQotLyoKLSAqIFJlcHJlc2VudHMgYW4gdXBsb2FkIHJ1bGUuCi0gKiBJdCBkZXNjcmliZXMgaG93IHRvIGNvcHkgYSBsaXN0IG9mIGxvY2FsIGZpbGVzIG9yIGxvY2FsIGRpcmVjdG9yaWVzIGludG8gYSBzaW5nbGUgcmVtb3RlIGRpcmVjdG9yeS4KLSAqIEEgbG9jYWwgZmlsZSBpcyBjb3BpZWQgaW50byB0aGUgcmVtb3RlIGRpcmVjdG9yeS4KLSAqIEEgbG9jYWwgZGlyZWN0b3J5IGhhcyBpdHMgY29udGVudCBjb3BpZWQgcmVjdXJzaXZlbHkgaW50byB0aGUgcmVtb3RlIGRpcmVjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFVwbG9hZFJ1bGUgaW1wbGVtZW50cyBJU3luY2hyb25pemF0aW9uUnVsZSB7Ci0JcHJpdmF0ZSBpbnQgb3ZlcndyaXRlUG9saWN5ID0gT3ZlcndyaXRlUG9saWNpZXMuVU5LTk9XTjsKLQotCXByaXZhdGUgYm9vbGVhbiBhc1JlYWRPbmx5ID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNFeGVjdXRhYmxlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJlc2VydmVUaW1lU3RhbXAgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZG93bmxvYWRCYWNrID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFJlbW90ZURpcmVjdG9yeSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3RlRGlyZWN0b3J5ID0gbnVsbDsKLQotCS8qCi0JICogTGlzdCBvZiBsb2NhbCBwYXRocywgcmVwcmVzZW50ZWQgYXMgc3RyaW5ncy4KLQkgKiBUaGV5IG1heSBiZSBmaWxlcyBvciBkaXJlY3Rvcmllcy4KLQkgKi8KLQlwcml2YXRlIExpc3QgbG9jYWxGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVXBsb2FkUnVsZSgpIHsKLQotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBkZSBydWxlIGZyb20gYSBzZXJpYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgVXBsb2FkUnVsZShTdHJpbmcgZGF0YSkgewotCQkvKgotCQkgKiBTcGxpdCB0aGUgc3RyaW5nIGludG8gbGluZXMuCi0JCSAqLwotCQlTdHJpbmcgbGlzdFtdID0gZGF0YS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZmlyc3QgdG9rZW4gaXMgdGhlIHByb3BlciBpZGVudGlmaWVyLiBJZiBub3QsIHRoZSBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEgcnVsZSB0aGF0Ci0JCSAqIGNhbiBiZSBwYXJzZWQgYnkgdGhpcyBjbGFzcy4KLQkJICovCi0JCXsKLQkJCWlmIChsaXN0Lmxlbmd0aCA8IDEpIHsKLQkJCQl0aHJvd0Vycm9yKCJUaGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJ1bGUgZm9yICIrdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBzID0gbGlzdFswXTsKLQkJCWlmICghIHMuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5UWVBFX1VQTE9BRCkpIHsKLQkJCQl0aHJvd0Vycm9yKCJUaGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJ1bGUgZm9yICIrdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzID0gbGlzdFtpXTsKLQkJCS8qCi0JCQkgKiBTcGxpdCBrZXkgZnJvbSBkYXRhLgotCQkJICovCi0JCQlpbnQgcCA9IHMuaW5kZXhPZignICcpOwotCQkJaWYgKHAgPT0gLTEpIHsKLQkJCQlsb2dFcnJvcigiSW52YWxpZCBydWxlIGVudHJ5OiAiK3MpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcga2V5ID0gcy5zdWJzdHJpbmcoMCwgcCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzLnN1YnN0cmluZyhwICsgMSk7Ci0JCQlwYXJzZUVudHJ5KGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBVcGxvYWRSdWxlKFVwbG9hZFJ1bGUgcnVsZSkgewotCQl0aGlzLm92ZXJ3cml0ZVBvbGljeSA9IHJ1bGUub3ZlcndyaXRlUG9saWN5OwotCQl0aGlzLmFzUmVhZE9ubHkgPSBydWxlLmFzUmVhZE9ubHk7Ci0JCXRoaXMuYXNFeGVjdXRhYmxlID0gcnVsZS5hc0V4ZWN1dGFibGU7Ci0JCXRoaXMucHJlc2VydmVUaW1lU3RhbXAgPSBydWxlLnByZXNlcnZlVGltZVN0YW1wOwotCQl0aGlzLmRvd25sb2FkQmFjayA9IHJ1bGUuZG93bmxvYWRCYWNrOwotCQl0aGlzLmRlZmF1bHRSZW1vdGVEaXJlY3RvcnkgPSBydWxlLmRlZmF1bHRSZW1vdGVEaXJlY3Rvcnk7Ci0JCWlmIChydWxlLnJlbW90ZURpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW90ZURpcmVjdG9yeSA9IG5ldyBTdHJpbmcocnVsZS5yZW1vdGVEaXJlY3RvcnkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yZW1vdGVEaXJlY3RvcnkgPSBudWxsOwotCQl9Ci0JCXRoaXMubG9jYWxGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QocnVsZS5sb2NhbEZpbGVMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dFcnJvcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHN0cmluZyk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VFbnRyeShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9SRU1PVEVfUEFUSCkpIHsKLQkJCXJlbW90ZURpcmVjdG9yeSA9IHZhbHVlOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZKSkgewotCQkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1lfQUxXQVlTKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUzsKLQkJCX0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9BU0spKSB7Ci0JCQkJb3ZlcndyaXRlUG9saWN5ID0gT3ZlcndyaXRlUG9saWNpZXMuQVNLOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX05FV0VSKSkgewotCQkJCW92ZXJ3cml0ZVBvbGljeSA9IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX1NLSVApKSB7Ci0JCQkJb3ZlcndyaXRlUG9saWN5ID0gT3ZlcndyaXRlUG9saWNpZXMuU0tJUDsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9nRXJyb3IoIlVua25vd24gb3ZlcndyaXRlIHBvbGljeTogIit2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShTZXJpYWxpemF0aW9uS2V5cy5LRVlfRkxBR1MpKSB7Ci0JCQlTdHJpbmcgZmxhZ3NbXSA9IHZhbHVlLnNwbGl0KCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgZmxhZyA9IGZsYWdzW2ldOwotCQkJCWlmIChmbGFnLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX0RFRkFVTFRfUkVNT1RFX0RJUkVDVE9SWSkpIHsKLQkJCQkJZGVmYXVsdFJlbW90ZURpcmVjdG9yeSA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChmbGFnLmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX1RJTUVTVEFNUCkpIHsKLQkJCQkJcHJlc2VydmVUaW1lU3RhbXAgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHU19ET1dOTE9BRF9CQUNLKSkgewotCQkJCQlkb3dubG9hZEJhY2sgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ0Vycm9yKCJVbmtub3duIGZsYWc6ICIrZmxhZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX0xPQ0FMX1BBVEgpKSB7Ci0JCQlsb2NhbEZpbGVMaXN0LmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TKSkgewotCQkJU3RyaW5nIGZsYWdzW10gPSB2YWx1ZS5zcGxpdCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZsYWcgPSBmbGFnc1tpXTsKLQkJCQlpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OU19FWEVDVVRBQkxFKSkgewotCQkJCQlhc0V4ZWN1dGFibGUgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OU19SRUFET05MWSkpIHsKLQkJCQkJYXNSZWFkT25seSA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nRXJyb3IoIlVua25vd24gcGVybWlzc2lvbjogIitmbGFnKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCWxvZ0Vycm9yKCJVbmtub3duIGtleTogIitrZXkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nRXJyb3IoU3RyaW5nIHN0cmluZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JLyoKLQkgKiBUaGUgcnVsZSBhcyBhIHNlcmlhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCUxpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlbW90ZURpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfUkVNT1RFX1BBVEgrIiAiK3JlbW90ZURpcmVjdG9yeS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVMpIHsKLQkJCWwuYWRkKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZKyIgIitTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9BTFdBWVMpOwkJCSAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob3ZlcndyaXRlUG9saWN5ID09IE92ZXJ3cml0ZVBvbGljaWVzLkFTSykgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1krIiAiK1NlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX0FTSyk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvdmVyd3JpdGVQb2xpY3kgPT0gT3ZlcndyaXRlUG9saWNpZXMuTkVXRVIpIHsKLQkJCWwuYWRkKFNlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZKyIgIitTZXJpYWxpemF0aW9uS2V5cy5LRVlfT1ZFUldSSVRFX1BPTElDWV9ORVdFUik7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvdmVyd3JpdGVQb2xpY3kgPT0gT3ZlcndyaXRlUG9saWNpZXMuU0tJUCkgewotCQkJbC5hZGQoU2VyaWFsaXphdGlvbktleXMuS0VZX09WRVJXUklURV9QT0xJQ1krIiAiK1NlcmlhbGl6YXRpb25LZXlzLktFWV9PVkVSV1JJVEVfUE9MSUNZX1NLSVApOwkJCSAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGFzRXhlY3V0YWJsZSB8fCBhc1JlYWRPbmx5KSB7Ci0JCQlTdHJpbmcgcyA9IFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OUzsKLQkJCWlmIChhc0V4ZWN1dGFibGUpIHsKLQkJCQlzICs9ICIgIiArIFNlcmlhbGl6YXRpb25LZXlzLktFWV9QRVJNSVNTSU9OU19FWEVDVVRBQkxFOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoYXNSZWFkT25seSkgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX1BFUk1JU1NJT05TX1JFQURPTkxZOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlsLmFkZChzKTsKLQkJfQotCQlpZiAocHJlc2VydmVUaW1lU3RhbXAgfHwgZGVmYXVsdFJlbW90ZURpcmVjdG9yeSB8fCBkb3dubG9hZEJhY2spIHsKLQkJCVN0cmluZyBzID0gU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTOwotCQkJaWYgKGRlZmF1bHRSZW1vdGVEaXJlY3RvcnkpIHsKLQkJCQlzICs9ICIgIiArIFNlcmlhbGl6YXRpb25LZXlzLktFWV9GTEFHU19ERUZBVUxUX1JFTU9URV9ESVJFQ1RPUlk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChwcmVzZXJ2ZVRpbWVTdGFtcCkgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX1RJTUVTVEFNUDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGRvd25sb2FkQmFjaykgewotCQkJCXMgKz0gIiAiICsgU2VyaWFsaXphdGlvbktleXMuS0VZX0ZMQUdTX0RPV05MT0FEX0JBQ0s7CQkJCSAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlsLmFkZChzKTsJCQkKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsb2NhbEZpbGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGxvY2FscGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxvY2FscGF0aCA9PSBudWxsKSBjb250aW51ZTsKLQkJCWlmIChsb2NhbHBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIGNvbnRpbnVlOwotCQkJCi0JCQlsLmFkZChTZXJpYWxpemF0aW9uS2V5cy5LRVlfTE9DQUxfUEFUSCsiICIrbG9jYWxwYXRoLnRyaW0oKSk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoU2VyaWFsaXphdGlvbktleXMuVFlQRV9VUExPQUQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdCArPSAiXG4iICsgZWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBc0V4ZWN1dGFibGUoKSB7Ci0JCXJldHVybiBhc0V4ZWN1dGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXNFeGVjdXRhYmxlKGJvb2xlYW4gYXNFeGVjdXRhYmxlKSB7Ci0JCXRoaXMuYXNFeGVjdXRhYmxlID0gYXNFeGVjdXRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGFzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXNSZWFkT25seShib29sZWFuIGFzUmVhZE9ubHkpIHsKLQkJdGhpcy5hc1JlYWRPbmx5ID0gYXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZW1vdGVEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBkZWZhdWx0UmVtb3RlRGlyZWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRSZW1vdGVEaXJlY3RvcnkoYm9vbGVhbiBkZWZhdWx0UmVtb3RlRGlyZWN0b3J5KSB7Ci0JCXRoaXMuZGVmYXVsdFJlbW90ZURpcmVjdG9yeSA9IGRlZmF1bHRSZW1vdGVEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPdmVyd3JpdGVQb2xpY3koKSB7Ci0JCXJldHVybiBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlUG9saWN5KGludCBvdmVyd3JpdGVQb2xpY3kpIHsKLQkJdGhpcy5vdmVyd3JpdGVQb2xpY3kgPSBvdmVyd3JpdGVQb2xpY3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZVN0YW1wKGJvb2xlYW4gcHJlc2VydmVUaW1lU3RhbXApIHsKLQkJdGhpcy5wcmVzZXJ2ZVRpbWVTdGFtcCA9IHByZXNlcnZlVGltZVN0YW1wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlRGlyZWN0b3J5KCkgewotCQlpZiAocmVtb3RlRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVtb3RlRGlyZWN0b3J5LnRyaW0oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlbW90ZURpcmVjdG9yeShTdHJpbmcgcmVtb3RlRGlyZWN0b3J5KSB7Ci0JCWlmIChyZW1vdGVEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdGVEaXJlY3RvcnkgPSByZW1vdGVEaXJlY3RvcnkudHJpbSgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yZW1vdGVEaXJlY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERvd25sb2FkQmFjayhib29sZWFuIGRvd25sb2FkQmFjaykgewotCQl0aGlzLmRvd25sb2FkQmFjayA9IGRvd25sb2FkQmFjazsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEb3dubG9hZEJhY2soKSB7Ci0JCXJldHVybiBkb3dubG9hZEJhY2s7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UmVtb3RlRmlsZUNvdW50KCkgewotCQlyZXR1cm4gbG9jYWxGaWxlTGlzdC5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgW10gZ2V0TG9jYWxGaWxlc0FzU3RyaW5nQXJyYXkoKSB7Ci0JCVN0cmluZyByZXN1bHQgW10gPSBuZXcgU3RyaW5nIFtsb2NhbEZpbGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSAoU3RyaW5nKSBsb2NhbEZpbGVMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUGF0aCBbXSBnZXRMb2NhbEZpbGVzQXNQYXRoQXJyYXkoKSB7Ci0JCUlQYXRoIHJlc3VsdCBbXSA9IG5ldyBJUGF0aCBbbG9jYWxGaWxlTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbmV3IFBhdGgoKFN0cmluZykgbG9jYWxGaWxlTGlzdC5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEZpbGUgW10gZ2V0TG9jYWxGaWxlc0FzRmlsZUFycmF5KCkgewotCQlGaWxlIHJlc3VsdCBbXSA9IG5ldyBGaWxlIFtsb2NhbEZpbGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRmlsZSgoU3RyaW5nKSBsb2NhbEZpbGVMaXN0LmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIExvY2FsRmlsZUl0ZXJhdG9yQXNTdHJpbmcgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9ycmVmID0gbG9jYWxGaWxlTGlzdC5pdGVyYXRvcigpOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpdGVyYXRvcnJlZi5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlyZXR1cm4gaXRlcmF0b3JyZWYubmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaXRlcmF0b3JyZWYucmVtb3ZlKCk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBjbGFzcyBMb2NhbEZpbGVJdGVyYXRvckFzUGF0aCBleHRlbmRzIExvY2FsRmlsZUl0ZXJhdG9yQXNTdHJpbmcgewotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoKFN0cmluZylpdGVyYXRvcnJlZi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIExvY2FsRmlsZUl0ZXJhdG9yQXNGaWxlIGV4dGVuZHMgTG9jYWxGaWxlSXRlcmF0b3JBc1N0cmluZyB7Ci0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXJldHVybiBuZXcgRmlsZSgoU3RyaW5nKWl0ZXJhdG9ycmVmLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgbG9jYWxJdGVyYXRvckFzU3RyaW5nKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsZUl0ZXJhdG9yQXNTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgbG9jYWxJdGVyYXRvckFzUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEZpbGVJdGVyYXRvckFzUGF0aCgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yQXNGaWxlKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsZUl0ZXJhdG9yQXNGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTG9jYWxGaWxlKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQlsb2NhbEZpbGVMaXN0LmFkZChzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTG9jYWxGaWxlKElQYXRoIHBhdGgpIHsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJbG9jYWxGaWxlTGlzdC5hZGQocGF0aC50b09TU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTG9jYWxGaWxlKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlsb2NhbEZpbGVMaXN0LmFkZChmaWxlLmdldFBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVVwbG9hZFJ1bGUgciA9IG5ldyBVcGxvYWRSdWxlKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihyKTsKLQkJci5zZXRBc0V4ZWN1dGFibGUodHJ1ZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihyKTsKLQkJci5zZXRBc1JlYWRPbmx5KHRydWUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0UmVtb3RlRGlyZWN0b3J5KCIvdG1wL2EiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCXIuc2V0T3ZlcndyaXRlUG9saWN5KE92ZXJ3cml0ZVBvbGljaWVzLkFTSyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihyKTsKLQkJCi0JCVN0cmluZyBzID0gInVwbG9hZFxucmVtb3RlLWRpcmVjdG9yeSAvdG1wL2FcbnBlcm1pc3Npb25zIGV4ZWN1dGFibGUgcmVhZG9ubHlcbmZsYWdzIGRlZmF1bHQtcmVtb3RlLWRpcmVjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQkJciA9IG5ldyBVcGxvYWRSdWxlKHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsRmlsZShTdHJpbmcgZW50cnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbG9jYWxGaWxlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lcXVhbHMoZW50cnkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEZpbGUoSVBhdGggZW50cnkpIHsKLQkJcmVtb3ZlTG9jYWxGaWxlKGVudHJ5LnRvT1NTdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsRmlsZShGaWxlIGVudHJ5KSB7Ci0JCXJlbW92ZUxvY2FsRmlsZShlbnRyeS5nZXRQYXRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsRmlsZXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJY2xlYXJMb2NhbEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBpdGVtc1tpXTsKLQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCWFkZExvY2FsRmlsZShzdHJpbmcpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2FsRmlsZXMoSVBhdGhbXSBpdGVtcykgewotCQljbGVhckxvY2FsRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggcGF0aCA9IGl0ZW1zW2ldOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWFkZExvY2FsRmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEZpbGVzKEZpbGVbXSBpdGVtcykgewotCQljbGVhckxvY2FsRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmaWxlID0gaXRlbXNbaV07Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJYWRkTG9jYWxGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJMb2NhbEZpbGVzKCkgewotCQlsb2NhbEZpbGVMaXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG93bmxvYWRSdWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVcGxvYWRSdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvTGFiZWwoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiVVBMT0FEICIrSW50ZWdlci50b1N0cmluZyhsb2NhbEZpbGVMaXN0LnNpemUoKSkrIiBpdGVtKHMpIFxudG8gIityZW1vdGVEaXJlY3Rvcnk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG92ZXJ3cml0ZVBvbGljeSA9PSBPdmVyd3JpdGVQb2xpY2llcy5VTktOT1dOKSB7Ci0JCQlSZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuVXBsb2FkUnVsZV9WYWxpZGF0ZV9NaXNzaW5nT3ZlcndyaXRlUG9saWN5LCBJUmVtb3RlTGF1bmNoRXJyb3JzLklOVkFMSURfUlVMRSk7Ci0JCX0KLQkJaWYgKGRlZmF1bHRSZW1vdGVEaXJlY3RvcnkgPT0gZmFsc2UpIHsKLQkJCWlmIChyZW1vdGVEaXJlY3RvcnkgPT0gbnVsbCkgewotCQkJCVJlbW90ZUxhdW5jaGVyUGx1Z2luLnRocm93Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5VcGxvYWRSdWxlX1ZhbGlkYXRlX01pc3NpbmdSZW1vdGVkaXJlY3RvcnksIElSZW1vdGVMYXVuY2hFcnJvcnMuSU5WQUxJRF9SVUxFKTsKLQkJCX0KLS8vCQkJSVBhdGggcmVtb3RlUGF0aCA9IExpbnV4UGF0aC5mcm9tU3RyaW5nKHJlbW90ZURpcmVjdG9yeSk7Ci0vLwkJCWlmICghIHJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0vLwkJCQlSZW1vdGVMYXVuY2hlclBsdWdpbi50aHJvd0NvcmVFeGNlcHRpb24oIlJlbW90ZSBkaXJlY3RvcnkgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLiIsIElSZW1vdGVMYXVuY2hFcnJvcnMuSU5WQUxJRF9SVUxFKTsJCQkJCi0vLwkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2RhdGEvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY5MmM5Mi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9kYXRhL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb25fRXJyb3JfTWlzc2luZ1Byb2plY3Q9Tm8gcHJvamVjdCBzcGVjaWZpZWQgZm9yIHJlbW90ZSBsYXVuY2guCi1FeGVjdXRpb25Db25maWd1cmF0aW9uX0Vycm9yX01pc3NpbmdFeGVjdXRhYmxlPU5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkIGZvciByZW1vdGUgbGF1bmNoLgotRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nUmVtb3RlV29ya2luZ0RpcmVjdG9yeT1ObyByZW1vdGUgd29ya2luZyBkaXJlY3Rvcnkgc3BlY2lmaWVkIGZvciByZW1vdGUgbGF1bmNoLgotRXhlY3V0aW9uQ29uZmlndXJhdGlvbl9FcnJvcl9NaXNzaW5nTG9jYWxSZW1vdGVEaXJlY3Rvcnk9Tm8gbG9jYWwgd29ya2luZyBkaXJlY3Rvcnkgc3BlY2lmaWVkIGZvciByZW1vdGUgbGF1bmNoLgotVXBsb2FkUnVsZV9WYWxpZGF0ZV9NaXNzaW5nT3ZlcndyaXRlUG9saWN5PU5vIG92ZXJ3cml0ZSBwb2xpY3kgc3BlY2lmaWVkIGZvciB1cGxvYWQgcnVsZS4KLVVwbG9hZFJ1bGVfVmFsaWRhdGVfTWlzc2luZ1JlbW90ZWRpcmVjdG9yeT1ObyByZW1vdGUgZGlyZWN0b3J5IHNwZWNpZmllZCBmb3IgdXBsb2FkIHJ1bGUuCi1Eb3dubG9hZFJ1bGVfVmFsaWRhdGlvbl9NaXNzaW5nT3ZlcndyaXRlUG9saWN5PU5vIG92ZXJ3cml0ZSBwb2xpY3kgc3BlY2lmaWVkIGZvciBkb3dubG9hZCBydWxlLgotRG93bmxvYWRSdWxlX1ZhbGlkYXRpb25fTWlzc2luZ1JlbW90ZURpcmVjdG9yeT1ObyByZW1vdGUgZGlyZWN0b3J5IHNwZWNpZmllZCBmb3IgZG93bmxvYWQgcnVsZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL0Rvd25sb2FkQmFja0FjdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvRG93bmxvYWRCYWNrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjMTcyY2IuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvRG93bmxvYWRCYWNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUNvcHlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLkxpbnV4UGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5FeGVjdXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uQ2FuY2VsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRCYWNrQWN0aW9uIGltcGxlbWVudHMgSVJ1bGVBY3Rpb24gewotCQotCXByaXZhdGUgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBwcm9jZXNzOwotCXByaXZhdGUgRG93bmxvYWRCYWNrUnVsZSBydWxlOwotCXByaXZhdGUgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCXByaXZhdGUgUHJpbnRXcml0ZXIgb3V0cHV0V3JpdGVyOwotCXByaXZhdGUgUHJpbnRXcml0ZXIgZXJyb3JXcml0ZXI7Ci0JcHJpdmF0ZSBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyOwotCi0JcHVibGljIERvd25sb2FkQmFja0FjdGlvbihJTGF1bmNoUHJvY2Vzc0NhbGxiYWNrIHByb2Nlc3MsIERvd25sb2FkQmFja1J1bGUgZG93bmxvYWRCYWNrUnVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCQl0aGlzLnJ1bGUgPSBkb3dubG9hZEJhY2tSdWxlOwotCQljb25maWd1cmF0aW9uID0gcHJvY2Vzcy5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCW91dHB1dFdyaXRlciA9IHByb2Nlc3MuZ2V0T3V0cHV0V3JpdGVyKCk7Ci0JCWVycm9yV3JpdGVyID0gcHJvY2Vzcy5nZXRFcnJvcldyaXRlcigpOwkKLQkJbWFuYWdlciA9IHByb2Nlc3MuZ2V0RXhlY3V0aW9uTWFuYWdlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKHByb2Nlc3MpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJ1bGUpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbmZpZ3VyYXRpb24pOwotCQlBc3NlcnQuaXNOb3ROdWxsKG91dHB1dFdyaXRlcik7Ci0JCUFzc2VydC5pc05vdE51bGwoZXJyb3JXcml0ZXIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG1hbmFnZXIpOwotCQkKLQkJLyoKLQkJICogUHJvY2VzcyBmaWxlcyBpbiBsaXN0LgotCQkgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydWxlLmNvdW50KCk7IGkrKykgewotCQkJRmlsZSBsb2NhbEZpbGUgPSBydWxlLmdldExvY2FsRmlsZShpKTsKLQkJCUlQYXRoIHJlbW90ZVBhdGggPSBydWxlLmdldFJlbW90ZUZpbGUoaSk7Ci0JCQlkb3dubG9hZEZpbGUobG9jYWxGaWxlLCByZW1vdGVQYXRoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb3dubG9hZEZpbGUoRmlsZSBsb2NhbEZpbGUsIElQYXRoIHJlbW90ZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24sIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcmVtb3RlUGF0aEFzU3RyaW5nID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCQkKLQkJSVJlbW90ZUNvcHlUb29scyBjb3B5VG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZUNvcHlUb29scygpOwotCQlJUmVtb3RlRmlsZVRvb2xzIGZpbGVUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlRmlsZVRvb2xzKCk7Ci0JCQkJCi0JCUlSZW1vdGVGaWxlIHJlbW90ZUZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJcmVtb3RlRmlsZSA9IGZpbGVUb29scy5nZXRGaWxlKHJlbW90ZVBhdGhBc1N0cmluZyk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkQmFja0FjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZVByb3BlcnRpZXMsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghIHJlbW90ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRCYWNrQWN0aW9uX0ZhaWxlZEZpbGVkRG9lc05vdEV4aXN0LCByZW1vdGVQYXRoQXNTdHJpbmcpKTsKLQkJCXJldHVybjsJCQkKLQkJfQotCQkKLQkJLyoKLQkJICogVGVzdCBpZiBmaWxlIGhhcyBiZWVuIGNoYW5nZWQuCi0JCSAqLwotCQlsb25nIGRpZmZlcmVuY2UgPSByZW1vdGVGaWxlLmdldE1vZGlmaWNhdGlvblRpbWUoKSAtIGxvY2FsRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJaWYgKGRpZmZlcmVuY2UgPCAxMDAwICYmIHJlbW90ZUZpbGUuZ2V0U2l6ZSgpID09IGxvY2FsRmlsZS5sZW5ndGgoKSkgewotCQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRCYWNrQWN0aW9uX05vdGlmeUZpbGVOb3RDaGFuZ2VkLCByZW1vdGVQYXRoKSk7Ci0JCQlyZXR1cm47CQkJCQkKLQkJfQotCQkKLQkJLyoKLQkJICogRG93bmxvYWQgZmlsZQotCQkgKi8KLQkJdHJ5IHsKLQkJCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkQmFja0FjdGlvbl9Ob3RpZnlEb253bG9hZEJhY2ssIHJlbW90ZVBhdGhBc1N0cmluZykpOwotCQkJY29weVRvb2xzLmRvd25sb2FkRmlsZVRvRmlsZShyZW1vdGVQYXRoQXNTdHJpbmcsIGxvY2FsRmlsZSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkQmFja0FjdGlvbl9GYWlsZWREb3dubG9hZEJhY2ssIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9Eb3dubG9hZEJhY2tSdWxlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9Eb3dubG9hZEJhY2tSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMjlmYTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvRG93bmxvYWRCYWNrUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5JU3luY2hyb25pemF0aW9uUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5PdmVyd3JpdGVQb2xpY2llczsKLQotCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRCYWNrUnVsZSBpbXBsZW1lbnRzIElTeW5jaHJvbml6YXRpb25SdWxlIHsKLQlMaXN0IHJlbW90ZUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgbG9jYWxGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgRG93bmxvYWRCYWNrUnVsZSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEZpbGUgbG9jYWwsIElQYXRoIHJlbW90ZSkgewotCQlyZW1vdGVGaWxlcy5hZGQocmVtb3RlKTsKLQkJbG9jYWxGaWxlcy5hZGQobG9jYWwpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRMb2NhbEZpbGUoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoRmlsZSkgbG9jYWxGaWxlcy5nZXQoaW5kZXgpOwotCX0KLQkJCi0JcHVibGljIElQYXRoIGdldFJlbW90ZUZpbGUoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoSVBhdGgpIHJlbW90ZUZpbGVzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgY291bnQoKSB7Ci0JCXJldHVybiByZW1vdGVGaWxlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiByZW1vdGVGaWxlcy5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG93bmxvYWRSdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsgLy8gYnkgZGVmaW5pdGlvbgotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVXBsb2FkUnVsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBieSBkZWZpbml0aW9uCi0JfQotCi0JcHVibGljIFN0cmluZyB0b0xhYmVsKCkgewotCQlyZXR1cm4gIkludGVybmFsIGRvd25sb2FkIGJhY2sgcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB0byB2YWxpZGF0ZQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvRG93bmxvYWRSdWxlQWN0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9Eb3dubG9hZFJ1bGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGIzMTI5Yy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9Eb3dubG9hZFJ1bGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlQ29weVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUZpbGVFbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRmlsZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVTdGF0dXNUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZS5MaW51eFBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuRG93bmxvYWRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuT3ZlcndyaXRlUG9saWNpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5DYW5jZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEb3dubG9hZFJ1bGVBY3Rpb24gaW1wbGVtZW50cyBJUnVsZUFjdGlvbiB7Ci0KLQlwcml2YXRlIElMYXVuY2hQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzczsKLQlwcml2YXRlIERvd25sb2FkUnVsZSBydWxlOwotCXByaXZhdGUgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCXByaXZhdGUgUHJpbnRXcml0ZXIgb3V0cHV0V3JpdGVyOwotCXByaXZhdGUgUHJpbnRXcml0ZXIgZXJyb3JXcml0ZXI7Ci0JcHJpdmF0ZSBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyOwotCi0JcHVibGljIERvd25sb2FkUnVsZUFjdGlvbihJTGF1bmNoUHJvY2Vzc0NhbGxiYWNrIHByb2Nlc3MsIERvd25sb2FkUnVsZSBydWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucnVsZSA9IHJ1bGU7Ci0JCWNvbmZpZ3VyYXRpb24gPSBwcm9jZXNzLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJb3V0cHV0V3JpdGVyID0gcHJvY2Vzcy5nZXRPdXRwdXRXcml0ZXIoKTsKLQkJZXJyb3JXcml0ZXIgPSBwcm9jZXNzLmdldEVycm9yV3JpdGVyKCk7CQotCQltYW5hZ2VyID0gcHJvY2Vzcy5nZXRFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwocHJvY2Vzcyk7Ci0JCUFzc2VydC5pc05vdE51bGwocnVsZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoY29uZmlndXJhdGlvbik7Ci0JCUFzc2VydC5pc05vdE51bGwob3V0cHV0V3JpdGVyKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChlcnJvcldyaXRlcik7Ci0JCUFzc2VydC5pc05vdE51bGwobWFuYWdlcik7Ci0JCQotCQkvKgotCQkgKiBJZiBvdmVyd3JpdGUgcG9saWN5IGRlcGVuZHMgb24gdGltZSwgdGhlbiBnZXQgcmVtb3RlIGNsb2NrIHNrZXcuCi0JCSAqLwotCQlsb25nIGNsb2NrU2tldyA9IDA7Ci0JCWlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSKSB7Ci0JCQlJUmVtb3RlU3RhdHVzVG9vbHMgc3RhdHVzVG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZVN0YXR1c1Rvb2xzKCk7Ci0JCQlsb25nIGxvY2FsVGltZTsKLQkJCWxvbmcgcmVtb3RlVGltZTsKLQkJCXRyeSB7Ci0JCQkJbG9jYWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJcmVtb3RlVGltZSA9IHN0YXR1c1Rvb2xzLmdldFRpbWUoKTsKLQkJCQljbG9ja1NrZXcgPSBsb2NhbFRpbWUgLXJlbW90ZVRpbWU7Ci0JCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZENhbGN1bGF0ZUNsb2NrRGlmZmVyZW5jZSwgZS5nZXRNZXNzYWdlKCkpKTsJCQkKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRDYWxjdWxhdGVDbG9ja0RpZmZlcmVuY2UyKTsKLQkJCQljbG9ja1NrZXcgPSAwOwotCQkJfQotCQkJaWYgKGNsb2NrU2tldyA8IC0xNTAwMCkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX1dhcm5pbmdDbG9ja0ZvcndhcmQpOwotCQkJfSBlbHNlIGlmIChjbG9ja1NrZXcgPiAxNTAwMCkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX1dhcm5pbmdDbG9ja0JhY2t3YXJkKTsJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIERldGVybWluZSBsb2NhbCBwYXRoLiBNYWtlIGl0IGFic29sdXRlLiBDcmVhdGUgaWYgbmVjZXNzYXJ5Ci0JCSAqLwotCQlJUGF0aCBsb2NhbFBhdGggPSBuZXcgUGF0aChydWxlLmdldExvY2FsRGlyZWN0b3J5KCkpOwotCQlpZiAoISBsb2NhbFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlJUGF0aCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCQlsb2NhbFBhdGggPSB3b3Jrc3BhY2UuYXBwZW5kKGxvY2FsUGF0aCk7Ci0JCX0KLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbFBhdGguaXNBYnNvbHV0ZSgpLCAibG9jYWxQYXRoLmlzQWJzb2x1dGUoKSIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgbG9jYWxEaXIgPSBsb2NhbFBhdGgudG9GaWxlKCk7Ci0JCWlmICghIGxvY2FsRGlyLmV4aXN0cygpKSB7Ci0JCQlpZiAoISBsb2NhbERpci5ta2RpcnMoKSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZENyZWF0ZUxvY2FsRGlyZWN0b3J5LCBsb2NhbFBhdGgudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybjsJCQkJCQkJCQotCQkJfQotCQl9IGVsc2UgaWYgKCEgbG9jYWxEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkTG9jYWxEaXJldG9yeUlzTm90RGlyZWN0b3J5LCBsb2NhbFBhdGgudG9TdHJpbmcoKSkpOwotCQkJcmV0dXJuOwkJCQkJCQkJCQkJCi0JCX0KLQkJCi0JCS8qCi0JCSAqIERldGVybWluZSBsaXN0IG9mIHJlbW90ZSBwYXRocy4gTWFrZSB0aGVtIGFic29sdXRlLgotCQkgKi8KLQkJSVBhdGggcmVtb3RlUGF0aHMgW10gPSBydWxlLmdldFJlbW90ZUZpbGVzQXNQYXRoQXJyYXkoKTsKLQkJSVBhdGggcmVtb3RlV29ya2luZ1BhdGggPSBjb25maWd1cmF0aW9uLmdldFJlbW90ZURpcmVjdG9yeVBhdGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdGVQYXRocy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGhzW2ldOwotCQkJaWYgKCEgcmVtb3RlUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlyZW1vdGVQYXRoID0gcmVtb3RlV29ya2luZ1BhdGguYXBwZW5kKHJlbW90ZVBhdGgpOwotCQkJfQotCQkJcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGgucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCUFzc2VydC5pc1RydWUocmVtb3RlUGF0aC5pc0Fic29sdXRlKCksICJyZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZW1vdGVQYXRoc1tpXSA9IHJlbW90ZVBhdGg7Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIHBhdGhzLgotCQkgKi8KLQkJSVJlbW90ZUZpbGVUb29scyBmaWxlVG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZUZpbGVUb29scygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW90ZVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCByZW1vdGVQYXRoID0gcmVtb3RlUGF0aHNbaV07Ci0JCQlTdHJpbmcgcmVtb3RlUGF0aEFzU3RyaW5nID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCQkJSVJlbW90ZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWl0ZW0gPSBmaWxlVG9vbHMuZ2V0SXRlbShyZW1vdGVQYXRoQXNTdHJpbmcpOwotCQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaEF0dHJpYnV0ZXMsIHJlbW90ZVBhdGhBc1N0cmluZykpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAoISBpdGVtLmV4aXN0cygpKSB7Ci0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkUmVtb3RlUGF0aERvZXNOb3RFeGl0LCByZW1vdGVQYXRoQXNTdHJpbmcpKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIElSZW1vdGVEaXJlY3RvcnkpIHsKLQkJCQlJUmVtb3RlRGlyZWN0b3J5IHJlbW90ZURpcmVjdG9yeSA9IChJUmVtb3RlRGlyZWN0b3J5KSBpdGVtOwotCQkJCWRvd25sb2FkRGlyZWN0b3J5KHJlbW90ZURpcmVjdG9yeSwgbG9jYWxEaXIpOwotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSVJlbW90ZUZpbGUpIHsKLQkJCQlJUmVtb3RlRmlsZSByZW1vdGVGaWxlID0gKElSZW1vdGVGaWxlKSBpdGVtOwotCQkJCWRvd25sb2FkRmlsZShyZW1vdGVGaWxlLCBsb2NhbERpcik7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFJlbW90ZVBhdGhOb0RpcmVjdG9yeU5vckZpbGUsIHJlbW90ZVBhdGhBc1N0cmluZykpOwotCQkJCWNvbnRpbnVlOwkJCQkKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkRmlsZShJUmVtb3RlRmlsZSByZW1vdGVGaWxlLCBGaWxlIGxvY2FsRGlyKSB0aHJvd3MgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbERpci5pc0Fic29sdXRlKCksICJsb2NhbERpci5pc0Fic29sdXRlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggcmVtb3RlRmlsZVBhdGggPSBMaW51eFBhdGguZnJvbVN0cmluZyhyZW1vdGVGaWxlLmdldFBhdGgoKSk7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxEaXIsIHJlbW90ZUZpbGVQYXRoLmxhc3RTZWdtZW50KCkpOwotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ5RmlsZURvd25sb2FkMSwgcmVtb3RlRmlsZS5nZXRQYXRoKCkpKTsKLQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmeUZpbGVEb3dubG9hZDIsIGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0JCWRvRmlsZURvd25sb2FkKHJlbW90ZUZpbGUsIGxvY2FsRmlsZSk7CQotCX0KLQotCXByaXZhdGUgdm9pZCBkb3dubG9hZERpcmVjdG9yeShJUmVtb3RlRGlyZWN0b3J5IHJlbW90ZURpcmVjdG9yeSwgRmlsZSBsb2NhbERpcikgdGhyb3dzIFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc1RydWUobG9jYWxEaXIuaXNBYnNvbHV0ZSgpLCAibG9jYWxEaXIuaXNBYnNvbHV0ZSgpIik7IC8vJE5PTi1OTFMtMSQKLQotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ5RGlyZWN0b3J5RG93bmxvYWQxLCByZW1vdGVEaXJlY3RvcnkuZ2V0UGF0aCgpKSk7Ci0JCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlEaXJlY3RvcnlEb3dubG9hZDIsIGxvY2FsRGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0KLQkJSVJlbW90ZUZpbGVUb29scyBmaWxlVG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZUZpbGVUb29scygpOwotCQkKLQkJSVJlbW90ZUZpbGVFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbnVtZXJhdGlvbiA9IGZpbGVUb29scy5jcmVhdGVSZWN1cnNpdmVGaWxlRW51bWVyYXRpb24ocmVtb3RlRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZUF0dHJpYnV0ZXMsIGUuZ2V0TWVzc2FnZSgpKSk7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJUGF0aCByZW1vdGVSb290UGF0aCA9IExpbnV4UGF0aC5mcm9tU3RyaW5nKHJlbW90ZURpcmVjdG9yeS5nZXRQYXRoKCkpOwotCQlJUGF0aCBsb2NhbFJvb3RQYXRoID0gbmV3IFBhdGgobG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlpbnQgcmVtb3RlUm9vdFBhdGhMZW5ndGggPSByZW1vdGVSb290UGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCi0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFeGNlcHRpb25zKCkpIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZUF0dHJpYnV0ZXMsIGVudW1lcmF0aW9uLm5leHRFeGNlcHRpb24oKSkpOwotCQkJfQotCQkJLyoKLQkJCSAqIENhbGN1bGF0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByZW1vdGUgcm9vdC4KLQkJCSAqIEdlbmVyYXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJvb3QuCi0JCQkgKi8gCi0JCQlJUmVtb3RlSXRlbSByZW1vdGVJdGVtID0gZW51bWVyYXRpb24ubmV4dEVsZW1lbnRBc0l0ZW0oKTsKLQkJCUlQYXRoIHJlbW90ZVBhdGggPSBMaW51eFBhdGguZnJvbVN0cmluZyhyZW1vdGVJdGVtLmdldFBhdGgoKSk7Ci0JCQlJUGF0aCByZWxhdGl2ZVBhdGggPSByZW1vdGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocmVtb3RlUm9vdFBhdGhMZW5ndGgpOwotCQkJSVBhdGggbG9jYWxGaWxlUGF0aCA9IGxvY2FsUm9vdFBhdGguYXBwZW5kKHJlbGF0aXZlUGF0aCk7Ci0JCQlGaWxlIGxvY2FsRmlsZSA9IGxvY2FsRmlsZVBhdGgudG9GaWxlKCk7Ci0JCQlpZiAocmVtb3RlSXRlbSBpbnN0YW5jZW9mIElSZW1vdGVEaXJlY3RvcnkpIHsKLQkJCQlJUmVtb3RlRGlyZWN0b3J5IGRpcmVjdG9yeUl0ZW0gPSAoSVJlbW90ZURpcmVjdG9yeSkgcmVtb3RlSXRlbTsKLQkJCQlkb0RpcmVjdG9yeURvd25sb2FkKGRpcmVjdG9yeUl0ZW0sIGxvY2FsRmlsZSk7Ci0JCQl9IGVsc2UgaWYgKHJlbW90ZUl0ZW0gaW5zdGFuY2VvZiBJUmVtb3RlRmlsZSkgewotCQkJCUlSZW1vdGVGaWxlIGZpbGVJdGVtID0gKElSZW1vdGVGaWxlKSByZW1vdGVJdGVtOwotCQkJCWRvRmlsZURvd25sb2FkKGZpbGVJdGVtLCBsb2NhbEZpbGUpOwotCQkJfQotCQl9Ci0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRXhjZXB0aW9ucygpKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZUF0dHJpYnV0ZXMsIGVudW1lcmF0aW9uLm5leHRFeGNlcHRpb24oKSkpOwkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9GaWxlRG93bmxvYWQoSVJlbW90ZUZpbGUgcmVtb3RlRmlsZSwgRmlsZSBsb2NhbEZpbGUpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlBc3NlcnQuaXNUcnVlKGxvY2FsRmlsZS5pc0Fic29sdXRlKCksICJsb2NhbEZpbGUuaXNBYnNvbHV0ZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyByZW1vdGVGaWxlQXNTdHJpbmcgPSByZW1vdGVGaWxlLmdldFBhdGgoKTsKLQotCQlJUmVtb3RlQ29weVRvb2xzIGNvcHlUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlQ29weVRvb2xzKCk7Ci0JCQkJCi0JCS8qCi0JCSAqIENoZWNrIGlmIGZpbGUgZXhpc3RzIGFuZCBpZiBmaWxlIGlzIG5ld2VyLCBkZXBlbmRpbmcgb24gb3ZlcndyaXRlIHBvbGljeS4KLQkJICovCi0JCWlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUykgewotCQkJLyoKLQkJCSAqIEZpbGUgaXMgYWx3YXlzIGNvcGllZCwgbm8gcG9saWN5LgotCQkJICovCi0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogUG9saWN5IG5lZWRzIHRvIGNoZWNrIHJlbW90ZSBmaWxlLgotCQkJICovCi0JCQlpZiAocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSA9PSBPdmVyd3JpdGVQb2xpY2llcy5TS0lQKSB7Ci0JCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ0RmlsZUV4aXN0c0xvY2FsbHksIGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSKSB7Ci0JCQkJbG9uZyBkaWZmZXJlbmNlID0gcmVtb3RlRmlsZS5nZXRNb2RpZmljYXRpb25UaW1lKCkgLSBsb2NhbEZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJaWYgKGRpZmZlcmVuY2UgPCAxMDAwKSB7Ci0JCQkJCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnROZXdlckZpbGVFeGlzdHNMb2NhbGx5LCBsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQkJcmV0dXJuOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9ICAKLQkJCi0JCS8qCi0JCSAqIFVwbG9hZCB0aGUgZmlsZS4KLQkJICovCi0JCXRyeSB7Ci0JCQljb3B5VG9vbHMuZG93bmxvYWRGaWxlVG9GaWxlKHJlbW90ZUZpbGVBc1N0cmluZywgbG9jYWxGaWxlKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFNldERvd25sb2FkRmlsZSwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQkvKgotCQkgKiBTZXQgZmlsZSBwZXJtaXNzaW9ucy4gV2UgbmVlZCBoZWxwIG9mIEVGUywgc2luY2UgdGhlIEZpbGUgY2xhc3MgZnJvbQotCQkgKiBKYXZhIGRvZXMgbm90IHByb3ZpZGVsIGFsbCBpbmZvcm1hdGlvbi4KLQkJICovCi0vLwkJYm9vbGVhbiByZWFkID0gcmVtb3RlRmlsZS5pc1JlYWRhYmxlKCk7Ci0JCWJvb2xlYW4gd3JpdGUgPSByZW1vdGVGaWxlLmlzV3JpdGFibGUoKTsKLQkJYm9vbGVhbiBleGVjdXRlID0gcmVtb3RlRmlsZS5pc0V4ZWN1dGFibGUoKTsKLQkJCi0JCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQl3cml0ZSA9IGZhbHNlOwotCQl9Ci0JCWlmIChydWxlLmlzQXNFeGVjdXRhYmxlKCkpIHsKLQkJCWV4ZWN1dGUgPSB0cnVlOwotCQl9Ci0JCQotCQlJRmlsZVN5c3RlbSBsb2NhbEZpbGVTeXN0ZW0gPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCk7Ci0JCUlGaWxlU3RvcmUgZmlsZVN0b3JlID0gbG9jYWxGaWxlU3lzdGVtLmdldFN0b3JlKG5ldyBQYXRoKGxvY2FsRmlsZS5nZXRQYXRoKCkpKTsKLQkJSUZpbGVJbmZvIGZpbGVJbmZvID0gZmlsZVN0b3JlLmZldGNoSW5mbygpOwotCi0JCWZpbGVJbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX0VYRUNVVEFCTEUsIGV4ZWN1dGUpOwotCQlmaWxlSW5mby5zZXRBdHRyaWJ1dGUoRUZTLkFUVFJJQlVURV9SRUFEX09OTFksICEgd3JpdGUpOwotCQkKLQkJLyoKLQkJICogU2V0IGRhdGUvdGltZSwgaWYgcmVxdWlyZWQKLQkJICovCi0JCWlmIChydWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSkgewotCQkJbG9uZyB0aW1lc3RhbXAgPSByZW1vdGVGaWxlLmdldE1vZGlmaWNhdGlvblRpbWUoKTsKLQkJCWZpbGVJbmZvLnNldExhc3RNb2RpZmllZCh0aW1lc3RhbXApOwotCQl9Ci0JCQotCQkvKgotCQkgKiBDb21taXQgY2hhbmdlcwotCQkgKi8KLQkJdHJ5IHsKLQkJCWZpbGVTdG9yZS5wdXRJbmZvKGZpbGVJbmZvLCBFRlMuU0VUX0xBU1RfTU9ESUZJRUQgfCBFRlMuU0VUX0FUVFJJQlVURVMsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFNldExvY2FsRmlsZUF0dHJpYnV0ZXMsIGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGlyZWN0b3J5RG93bmxvYWQoSVJlbW90ZURpcmVjdG9yeSByZW1vdGVEaXIsIEZpbGUgbG9jYWxEaXIpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlBc3NlcnQuaXNUcnVlKGxvY2FsRGlyLmlzQWJzb2x1dGUoKSwgImxvY2FsRmlsZS5pc0Fic29sdXRlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoKLQkJICogQ3JlYXRlIGxvY2FsIGRpcmVjdG9yeSwgaWYgbm90IGFscmVhZHkgZXhpc3RzLgotCQkgKi8KLQkJaWYgKCEgbG9jYWxEaXIuZXhpc3RzKCkpIHsKLQkJCWlmICghIGxvY2FsRGlyLm1rZGlycygpKSB7Ci0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ3JlYXRlTG9jYWxEaXJlY3RvcnksIGxvY2FsRGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCi0JCS8qCi0JCSAqIFNldCBmaWxlIHBlcm1pc3Npb25zLiBXZSBuZWVkIGhlbHAgb2YgRUZTLCBzaW5jZSB0aGUgRmlsZSBjbGFzcyBmcm9tCi0JCSAqIEphdmEgZG9lcyBub3QgcHJvdmlkZWwgYWxsIGluZm9ybWF0aW9uLgotCQkgKi8KLS8vCQlib29sZWFuIHJlYWQgPSByZW1vdGVEaXIuaXNSZWFkYWJsZSgpOwotCQlib29sZWFuIHdyaXRlID0gcmVtb3RlRGlyLmlzV3JpdGFibGUoKTsKLQkJYm9vbGVhbiBleGVjdXRlID0gdHJ1ZTsKLQkJCi0JCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQl3cml0ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlJRmlsZVN5c3RlbSBsb2NhbEZpbGVTeXN0ZW0gPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCk7Ci0JCUlGaWxlU3RvcmUgZmlsZVN0b3JlID0gbG9jYWxGaWxlU3lzdGVtLmdldFN0b3JlKG5ldyBQYXRoKGxvY2FsRGlyLmdldFBhdGgoKSkpOwotCQlJRmlsZUluZm8gZmlsZUluZm8gPSBmaWxlU3RvcmUuZmV0Y2hJbmZvKCk7Ci0KLQkJZmlsZUluZm8uc2V0QXR0cmlidXRlKEVGUy5BVFRSSUJVVEVfRVhFQ1VUQUJMRSwgZXhlY3V0ZSk7Ci0JCWZpbGVJbmZvLnNldEF0dHJpYnV0ZShFRlMuQVRUUklCVVRFX1JFQURfT05MWSwgISB3cml0ZSk7Ci0JCQotCQkvKgotCQkgKiBTZXQgZGF0ZS90aW1lLCBpZiByZXF1aXJlZAotCQkgKi8KLQkJaWYgKHJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpKSB7Ci0JCQlsb25nIHRpbWVzdGFtcCA9IHJlbW90ZURpci5nZXRNb2RpZmljYXRpb25UaW1lKCk7Ci0JCQlmaWxlSW5mby5zZXRMYXN0TW9kaWZpZWQodGltZXN0YW1wKTsKLQkJfQotCQkKLQkJLyoKLQkJICogQ29tbWl0IGNoYW5nZXMKLQkJICovCi0JCXRyeSB7Ci0JCQlmaWxlU3RvcmUucHV0SW5mbyhmaWxlSW5mbywgRUZTLlNFVF9MQVNUX01PRElGSUVEIHwgRUZTLlNFVF9BVFRSSUJVVEVTLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkRvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRTZXRMb2NhbERpcmVjdG9yeUF0dHJpYnV0ZXMsIGxvY2FsRGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL0lMYXVuY2hQcm9jZXNzQ2FsbGJhY2suamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL0lMYXVuY2hQcm9jZXNzQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU4MGVmYi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9JTGF1bmNoUHJvY2Vzc0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlRXhlY3V0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5FeGVjdXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJTGF1bmNoUHJvY2Vzc0NhbGxiYWNrIHsKLQlwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0T3V0cHV0V3JpdGVyKCk7Ci0JcHVibGljIFByaW50V3JpdGVyIGdldEVycm9yV3JpdGVyKCk7Ci0JcHVibGljIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpOwotCXB1YmxpYyBJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBnZXRFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JcHVibGljIHZvaWQgYWRkU3luY2hyb25pemF0aW9uUnVsZShJU3luY2hyb25pemF0aW9uUnVsZSBkb3dubG9hZEJhY2tSdWxlKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL0lSdWxlQWN0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9JUnVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjFjMjZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL0lSdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uQ2FuY2VsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElSdWxlQWN0aW9uIHsKLQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvTGF1bmNoT2JzZXJ2ZXJJdGVyYXRvci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvTGF1bmNoT2JzZXJ2ZXJJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmQ2NDM2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL0xhdW5jaE9ic2VydmVySXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLlJlbW90ZUxhdW5jaGVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklMYXVuY2hPYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5leHRlbnNpb25wb2ludHMuRXh0ZW5zaW9uUG9pbnRFbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIExhdW5jaE9ic2VydmVySXRlcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0JCi0JRXh0ZW5zaW9uUG9pbnRFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IG5ldyBFeHRlbnNpb25Qb2ludEVudW1lcmF0aW9uKFJlbW90ZUxhdW5jaGVyUGx1Z2luLk9CRVJWRVJfRVhURU5TSU9OX0lEKTsKLQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY3VycmVudDsKLQkKLQlwdWJsaWMgTGF1bmNoT2JzZXJ2ZXJJdGVyYXRvcigpIHsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjdXJyZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChjdXJyZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsJCSAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJTGF1bmNoT2JzZXJ2ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChjdXJyZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIChJTGF1bmNoT2JzZXJ2ZXIpIGN1cnJlbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0KLQotCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCWN1cnJlbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQlyZXR1cm4gY3VycmVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU2ODhiZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRCYWNrQWN0aW9uX0ZhaWxlZERvd25sb2FkQmFjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkQmFja0FjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZVByb3BlcnRpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZEJhY2tBY3Rpb25fRmFpbGVkRmlsZWREb2VzTm90RXhpc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZEJhY2tBY3Rpb25fTm90aWZ5RG9ud2xvYWRCYWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRCYWNrQWN0aW9uX05vdGlmeUZpbGVOb3RDaGFuZ2VkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZENhbGN1bGF0ZUNsb2NrRGlmZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRDYWxjdWxhdGVDbG9ja0RpZmZlcmVuY2UyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZENyZWF0ZUxvY2FsRGlyZWN0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZEZldGNoQXR0cmlidXRlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZUF0dHJpYnV0ZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkTG9jYWxEaXJldG9yeUlzTm90RGlyZWN0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFJlbW90ZVBhdGhEb2VzTm90RXhpdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRSZW1vdGVQYXRoTm9EaXJlY3RvcnlOb3JGaWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFNldERvd25sb2FkRmlsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRTZXRMb2NhbERpcmVjdG9yeUF0dHJpYnV0ZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkU2V0TG9jYWxGaWxlQXR0cmlidXRlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnRGaWxlRXhpc3RzTG9jYWxseTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnROZXdlckZpbGVFeGlzdHNMb2NhbGx5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmeURpcmVjdG9yeURvd25sb2FkMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlEaXJlY3RvcnlEb3dubG9hZDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ5RmlsZURvd25sb2FkMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlGaWxlRG93bmxvYWQyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX1dhcm5pbmdDbG9ja0JhY2t3YXJkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlQWN0aW9uX1dhcm5pbmdDbG9ja0ZvcndhcmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX0FsbF9GYWlsZWRDb25uZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19GYWlsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX0ZhaWxlZFBlcm1pc3Npb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9GYWlsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX0ZhaWxlZENyZWF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkQ3JlYXRlSGludDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkUGVybWlzc2lvbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX05vdFJlcXVpcmVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaFByb2Nlc3NfUmVxdWVzdFRvQ2FuY2VsTGF1bmNoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRBcHBsaWNhdGlvbl9Db21wbGV0ZWRVcGxvYWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX0ZhaWxlZFVwbG9hZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkQXBwbGljYXRpb25fVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX1RpdGxlTm9VcGxvYWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX1VwbG9hZE1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfRmFpbGVkUnVsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9JZ25vcmVJbmFjdGl2ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9JZ25vcmVJbnZhbGlkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X05vUnVsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfVGl0bGVVcGxvYWREaXNhYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9UaXRsZURvd25sb2FkRGlzYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW5hY3RpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9GYWlsZWRSdWxlOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL1JlbW90ZUxhdW5jaFByb2Nlc3MuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL1JlbW90ZUxhdW5jaFByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjZhODJmMi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9SZW1vdGVMYXVuY2hQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JU3RyZWFtTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbXNQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVGaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZVBhdGhUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU2NyaXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVTY3JpcHRFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuUmVtb3RlUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSUxhdW5jaEludGVncmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklMYXVuY2hPYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZS5JTGF1bmNoUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZS5JTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZS5MaW51eFBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuTnVsbExhdW5jaEludGVncmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuRXhlY3V0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5OdWxsTGF1bmNoT2JzZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLnByb2Nlc3MuVGFyZ2V0UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUubGludXguQXJndW1lbnRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5Db25zb2xlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZU1hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIFJlbW90ZUxhdW5jaFByb2Nlc3MgaW1wbGVtZW50cyBJTGF1bmNoUHJvY2VzcywgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayB7Ci0KLQlpbnQgY3VycmVudFByb2dyZXNzID0gSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuVU5ERUZJTkVEOwotCi0JcHVibGljIElMYXVuY2hPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBOdWxsTGF1bmNoT2JzZXJ2ZXIoKTsKLQlwdWJsaWMgSUxhdW5jaEludGVncmF0aW9uIGxhdW5jaEludGVncmF0aW9uID0gbmV3IE51bGxMYXVuY2hJbnRlZ3JhdGlvbigpOwotCXB1YmxpYyBTZXQgcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotCQotCU91dHB1dFN0cmVhbSBsYXVuY2hQcm9jZXNzT3V0cHV0U3RyZWFtID0gbnVsbDsKLQlPdXRwdXRTdHJlYW0gbGF1bmNoUHJvY2Vzc0Vycm9yU3RyZWFtID0gbnVsbDsKLQkKLQlQcmludFdyaXRlciBsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyID0gbnVsbDsKLQlQcmludFdyaXRlciBsYXVuY2hQcm9jZXNzRXJyb3JXcml0ZXIgPSBudWxsOwotCQotCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JRXhlY3V0aW9uUmVzdWx0IGV4ZWN1dGlvblJlc3VsdCA9IG51bGw7Ci0JTGlzdCBleHRyYVN5bmNocm9uaXphdGlvblJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCUlQcm9jZXNzIGFwcGxpY2F0aW9uUHJvZ3Jlc3M7Ci0JVGFyZ2V0UHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCUlMYXVuY2ggbGF1bmNoOwotCUlSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXI7Ci0KLQlTdHJpbmdbXSBsYXVuY2hTY3JpcHQ7Ci0KLQlwdWJsaWMgUmVtb3RlTGF1bmNoUHJvY2VzcyhJTGF1bmNoIGxhdW5jaCwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJTGF1bmNoSW50ZWdyYXRpb24gbGF1bmNoSW50ZWdyYXRpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5sYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JCXRoaXMuY3VycmVudFByb2dyZXNzID0gSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuV0FJVDsKLQkJdGhpcy5leGVjdXRpb25SZXN1bHQgPSBudWxsOwotCQlpZiAobGF1bmNoSW50ZWdyYXRpb24gPT0gbnVsbCkgewotCQkJdGhpcy5sYXVuY2hJbnRlZ3JhdGlvbiA9IG5ldyBOdWxsTGF1bmNoSW50ZWdyYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGF1bmNoSW50ZWdyYXRpb24gPSBsYXVuY2hJbnRlZ3JhdGlvbjsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrQXNDYW5jZWxlZCgpIHsKLQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19SZXF1ZXN0VG9DYW5jZWxMYXVuY2gpOwotCQltYW5hZ2VyLmNhbmNlbCgpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElMYXVuY2hPYnNlcnZlciBnZXRPYnNlcnZlcigpIHsKLQkJcmV0dXJuIG9ic2VydmVyOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUxhdW5jaEludGVncmF0aW9uIGdldExhdW5jaEludGVncmF0aW9uKCkgewotCQlyZXR1cm4gbGF1bmNoSW50ZWdyYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEN1cnJlbnRQcm9ncmVzcyhpbnQgbmV3UHJvZ3Jlc3MpIHsKLQkJdGhpcy5jdXJyZW50UHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9ncmVzc0xpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lciA9IChJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwotCQkJbGlzdGVuZXIubm90aWZ5UHJvZ3Jlc3MobmV3UHJvZ3Jlc3MpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlJbnRlcnJ1cHQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvZ3Jlc3NMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vdGlmeUludGVycnVwdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q3VycmVudFByb2dyZXNzKCkgewotCQlyZXR1cm4gY3VycmVudFByb2dyZXNzOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRXhlY3V0aW9uUmVzdWx0IGdldEZpbmFsUmVzdWx0KCkgewotCQlyZXR1cm4gZXhlY3V0aW9uUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVdvcmtpbmdEaXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogT25seSBjcmVhdGUgdGhlIHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeSBpZiBzb21lIHN0ZXAgd2lsbCByZXF1aXJlIGl0LgotCQkgKi8KLQkJYm9vbGVhbiBkb0NyZWF0ZSA9IGZhbHNlOwotCQlpZiAoY29uZmlndXJhdGlvbi5nZXREb1N5bmNocm9uaXplQWZ0ZXIoKSB8fCBjb25maWd1cmF0aW9uLmdldERvU3luY2hyb25pemVCZWZvcmUoKQotCQkJCXx8IGNvbmZpZ3VyYXRpb24uZ2V0RG9DbGVhbnVwKCkgfHwgbGF1bmNoSW50ZWdyYXRpb24uZ2V0RG9MYXVuY2hBcHBsaWNhdGlvbigpKSB7Ci0JCQlkb0NyZWF0ZSA9IHRydWU7Ci0JCX0KLQkJaWYgKCEgZG9DcmVhdGUpIHsKLQkJCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIucHJpbnRsbihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX05vdFJlcXVpcmVkKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLyoKLQkJICogQXNzdXJlIHRoYXQgdGhlIHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeSBleGlzdHMuIENyZWF0ZSBpZiBuZWNlc3NhcnkuCi0JCSAqLwotCQlJUGF0aCByZW1vdGVQYXRoID0gY29uZmlndXJhdGlvbi5nZXRSZW1vdGVEaXJlY3RvcnlQYXRoKCk7Ci0JCVN0cmluZyByZW1vdGVEaXJlY3RvcnlBc1BhdGggPSBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlUGF0aCk7Ci0JCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX1RpdGxlLCByZW1vdGVEaXJlY3RvcnlBc1BhdGgpKTsKLQkJdHJ5IHsKLQkJCUlSZW1vdGVGaWxlVG9vbHMgZmlsZVRvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVGaWxlVG9vbHMoKTsKLQkJCWZpbGVUb29scy5jcmVhdGVEaXJlY3RvcnkocmVtb3RlRGlyZWN0b3J5QXNQYXRoKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkQ3JlYXRlLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9GYWlsZWRDcmVhdGVIaW50KTsKLQkJCWFib3J0V2l0aEVycm9yKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkLCBlKTsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydFdpdGhFcnJvcihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0FsbF9GYWlsZWRDb25uZWN0aW9uLCBlKTsKLQkJfQotCQkKLQkJLyoKLQkJICogQXNzdXJlIHBlcm1pc3Npb25zIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGVudGVyIGFuZCB3cml0ZSB0aGUgZGlyZWN0b3J5LgotCQkgKi8KLQkJdHJ5IHsKLQkJCUlSZW1vdGVGaWxlVG9vbHMgZmlsZVRvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVGaWxlVG9vbHMoKTsKLQkJCUlSZW1vdGVEaXJlY3RvcnkgcmVtb3RlRXhlY3V0YWJsZSA9IGZpbGVUb29scy5nZXREaXJlY3RvcnkocmVtb3RlRGlyZWN0b3J5QXNQYXRoKTsKLQkJCXJlbW90ZUV4ZWN1dGFibGUuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCXJlbW90ZUV4ZWN1dGFibGUuc2V0UmVhZGFibGUodHJ1ZSk7Ci0JCQlyZW1vdGVFeGVjdXRhYmxlLnNldFdyaXRlYWJsZSh0cnVlKTsKLQkJCXJlbW90ZUV4ZWN1dGFibGUuY29tbWl0QXR0cmlidXRlcygpOwotCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9GYWlsZWRQZXJtaXNzaW9ucywgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCWFib3J0V2l0aEVycm9yKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkLCBlKTsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydFdpdGhFcnJvcihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0FsbF9GYWlsZWRDb25uZWN0aW9uLCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwbG9hZFdvcmtpbmdEaXJlY3RvcnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogT25seSBydW4gdXBsb2FkIGlmIHRoaXMgZmVhdHVyZSB3YXMgZW5hYmxlZC4KLQkJICovCi0JCWlmICghIGNvbmZpZ3VyYXRpb24uZ2V0RG9TeW5jaHJvbml6ZUJlZm9yZSgpKSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X1RpdGxlVXBsb2FkRGlzYWJsZWQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9UaXRsZSk7Ci0JCQotCQkvKgotCQkgKiBPbmx5IHJ1biB1cGxvYWQgaWYgcnVsZXMgYXJlIGF2YWlsYWJsZS4KLQkJICovCi0JCWlmIChjb25maWd1cmF0aW9uLmNvdW50VXBsb2FkUnVsZXMoKSA8PSAwKSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X05vUnVsZXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotLy8JCUxpc3QgcnVsZXNfdG1wID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGNvbmZpZ3VyYXRpb24uZ2V0U3luY2hyb25pemF0aW9uUnVsZXNBcnJheSgpKSk7Ci0vLwkJcnVsZXNfdG1wLmFkZEFsbChleHRyYVN5bmNocm9uaXphdGlvblJ1bGVzKTsKLS8vCQlJU3luY2hyb25pemF0aW9uUnVsZSBbXSBydWxlcyA9IChJU3luY2hyb25pemF0aW9uUnVsZVtdKSBydWxlc190bXAudG9BcnJheShuZXcgSVN5bmNocm9uaXphdGlvblJ1bGVbcnVsZXNfdG1wLnNpemUoKV0pOwotCQlJU3luY2hyb25pemF0aW9uUnVsZSBbXSBydWxlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY2hyb25pemF0aW9uUnVsZXNBcnJheSgpOwotCQlSdWxlQWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFJ1bGVBY3Rpb25GYWN0b3J5KHRoaXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU3luY2hyb25pemF0aW9uUnVsZSBydWxlID0gcnVsZXNbaV07Ci0JCQlpZiAoISBydWxlLmlzVXBsb2FkUnVsZSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoISBydWxlLmlzQWN0aXZlKCkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9JZ25vcmVJbmFjdGl2ZSwgSW50ZWdlci50b1N0cmluZyhpKSk7Ci0JCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKG1lc3NhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlydWxlLnZhbGlkYXRlKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9JZ25vcmVJbnZhbGlkLCBuZXcgT2JqZWN0IFtdIHsgSW50ZWdlci50b1N0cmluZyhpKSwgZS5nZXRNZXNzYWdlKCl9KTsKLQkJCQlsYXVuY2hQcm9jZXNzRXJyb3JXcml0ZXIucHJpbnRsbihtZXNzYWdlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlSdWxlQWN0aW9uIGFjdGlvbiA9IGZhY3RvcnkuZ2V0QWN0aW9uKHJ1bGUpOwotCQkJdHJ5IHsKLQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9GYWlsZWRSdWxlLCBuZXcgT2JqZWN0IFtdIHsgSW50ZWdlci50b1N0cmluZyhpKSwgZS5nZXRNZXNzYWdlKCl9KTsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4obWVzc2FnZSk7Ci0JCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydFdpdGhFcnJvcihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0FsbF9GYWlsZWRDb25uZWN0aW9uLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwbG9hZEFwcGxpY2F0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCWlmICghIGxhdW5jaEludGVncmF0aW9uLmdldERvTGF1bmNoQXBwbGljYXRpb24oKSkgeyAKLQkJCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIucHJpbnRsbihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX1RpdGxlTm9VcGxvYWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIucHJpbnRsbihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX1RpdGxlKTsKLQkJCi0JCS8vIFNob3J0Y3V0IHRvIG9mdGVuIHVzZWQgdmFsdWVzCi0JCUlQYXRoIHJlbW90ZURpcmVjdG9yeVBhdGggPSBjb25maWd1cmF0aW9uLmdldFJlbW90ZURpcmVjdG9yeVBhdGgoKTsKLQkJSVBhdGggcmVtb3RlRXhlY3V0YWJsZVBhdGggPSBjb25maWd1cmF0aW9uLmdldFJlbW90ZUV4ZWN1dGFibGVQYXRoKCk7Ci0JCVN0cmluZyByZW1vdGVEaXJlY3RvcnkgPSBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlRGlyZWN0b3J5UGF0aCk7Ci0JCVN0cmluZyByZW1vdGVFeGVjdXRhYmxlID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZUV4ZWN1dGFibGVQYXRoKTsKLQkJRmlsZSBleGVjdXRhYmxlRmlsZSA9IGNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZUZpbGUoKTsKLQkJCi0JCXRyeSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRBcHBsaWNhdGlvbl9VcGxvYWRNZXNzYWdlLCBuZXcgT2JqZWN0IFtdIHtleGVjdXRhYmxlRmlsZS5nZXRDYW5vbmljYWxQYXRoKCksIHJlbW90ZUV4ZWN1dGFibGV9KSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCQotCQkvKgotCQkgKiBDb3B5IGV4ZWN1dGFibGUgdG8gd29ya2luZyBkaXJlY3RvcnkKLQkJICovCi0JCXRyeSB7Ci0JCQltYW5hZ2VyLmdldFJlbW90ZUNvcHlUb29scygpLnVwbG9hZEZpbGVUb0RpcihleGVjdXRhYmxlRmlsZSwgcmVtb3RlRGlyZWN0b3J5KTsKLQkJCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIucHJpbnRsbihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX0NvbXBsZXRlZFVwbG9hZCk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlsYXVuY2hQcm9jZXNzRXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX0ZhaWxlZFVwbG9hZCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCWFib3J0V2l0aEVycm9yKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfRmFpbGVkLCBlKTsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydFdpdGhFcnJvcihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0FsbF9GYWlsZWRDb25uZWN0aW9uLCBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIEFzc3VyZSBleGVjdXRhYmxlIHBlcm1pc3Npb25zLgotCQkgKi8KLQkJdHJ5IHsKLQkJCUlSZW1vdGVGaWxlVG9vbHMgZmlsZVRvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVGaWxlVG9vbHMoKTsKLQkJCUlSZW1vdGVGaWxlIHJlbW90ZUZpbGUgPSBmaWxlVG9vbHMuZ2V0RmlsZShyZW1vdGVFeGVjdXRhYmxlKTsKLQkJCXJlbW90ZUZpbGUuc2V0UmVhZGFibGUodHJ1ZSk7Ci0JCQlyZW1vdGVGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSk7Ci0JCQlyZW1vdGVGaWxlLmNvbW1pdEF0dHJpYnV0ZXMoKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLlJlbW90ZUxhdW5jaFByb2Nlc3NfRmFpbGVkUGVybWlzc2lvbnMsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlhYm9ydFdpdGhFcnJvcihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0ZhaWxlZCwgZSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJYWJvcnRXaXRoRXJyb3IoTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19BbGxfRmFpbGVkQ29ubmVjdGlvbiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb3dubG9hZFdvcmtpbmdEaXJlY3RvcnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogT25seSBydW4gZG93bmxvYWQgaWYgdGhpcyBmZWF0dXJlIHdhcyBlbmFibGVkLgotCQkgKi8KLQkJaWYgKCEgY29uZmlndXJhdGlvbi5nZXREb1N5bmNocm9uaXplQWZ0ZXIoKSAmJiBleHRyYVN5bmNocm9uaXphdGlvblJ1bGVzLnNpemUoKSA9PSAwKSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfVGl0bGVEb3dubG9hZERpc2FibGVkKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIucHJpbnRsbihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9UaXRsZSk7Ci0JCQotCQkvKgotCQkgKiBPbmx5IHJ1biBkb3dubG9hZCBpZiBydWxlcyBhcmUgYXZhaWxhYmxlLgotCQkgKi8KLQkJaWYgKGNvbmZpZ3VyYXRpb24uY291bnREb3dubG9hZFJ1bGVzKCkgPD0gMCAmJiBleHRyYVN5bmNocm9uaXphdGlvblJ1bGVzLnNpemUoKSA9PSAwKSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X05vUnVsZXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0IHJ1bGVzX3RtcCA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChjb25maWd1cmF0aW9uLmdldFN5bmNocm9uaXphdGlvblJ1bGVzQXJyYXkoKSkpOwotCQlydWxlc190bXAuYWRkQWxsKGV4dHJhU3luY2hyb25pemF0aW9uUnVsZXMpOwotCQlJU3luY2hyb25pemF0aW9uUnVsZSBbXSBydWxlcyA9IChJU3luY2hyb25pemF0aW9uUnVsZVtdKSBydWxlc190bXAudG9BcnJheShuZXcgSVN5bmNocm9uaXphdGlvblJ1bGVbcnVsZXNfdG1wLnNpemUoKV0pOwotCQlSdWxlQWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFJ1bGVBY3Rpb25GYWN0b3J5KHRoaXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU3luY2hyb25pemF0aW9uUnVsZSBydWxlID0gcnVsZXNbaV07Ci0JCQlpZiAoISBydWxlLmlzRG93bmxvYWRSdWxlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghIHJ1bGUuaXNBY3RpdmUoKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X0lnbm9yZUluYWN0aXZlLCBJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4obWVzc2FnZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXJ1bGUudmFsaWRhdGUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW52YWxpZCwgbmV3IE9iamVjdCBbXSB7IEludGVnZXIudG9TdHJpbmcoaSksIGUuZ2V0TWVzc2FnZSgpfSk7Ci0JCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4obWVzc2FnZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJUnVsZUFjdGlvbiBhY3Rpb24gPSBmYWN0b3J5LmdldEFjdGlvbihydWxlKTsKLQkJCXRyeSB7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9GYWlsZWRSdWxlLCBuZXcgT2JqZWN0IFtdIHsgSW50ZWdlci50b1N0cmluZyhpKSwgZS5nZXRNZXNzYWdlKCl9KTsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4obWVzc2FnZSk7Ci0JCQl9IGNhdGNoIChSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydFdpdGhFcnJvcihNZXNzYWdlcy5SZW1vdGVMYXVuY2hQcm9jZXNzX0FsbF9GYWlsZWRDb25uZWN0aW9uLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVBcHBsaWNhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlpZiAoISBsYXVuY2hJbnRlZ3JhdGlvbi5nZXREb0xhdW5jaEFwcGxpY2F0aW9uKCkpIHJldHVybjsKLQotCQl0cnkgewotCQkJU3RyaW5nIGNvbW1hbmQgPSBjb25maWd1cmF0aW9uLmdldEJlZm9yZUNvbW1hbmQoKTsKLQkJCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiogTGF1bmNoIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgcmVxdWlyZSBydW5uaW5nIGEgYmFzaCBzY3JpcHQgYmVmb3JlIGxhdW5jaC4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljb21tYW5kID0gY29tbWFuZC50cmltKCk7Ci0JCQlpZiAoY29tbWFuZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIqIExhdW5jaCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHJlcXVpcmUgcnVubmluZyBhIGJhc2ggc2NyaXB0IGJlZm9yZSBsYXVuY2guIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiogUHJlcGFyZSBsYXVuY2ggYnkgZXhlY3V0aW5nOiIpOwotCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIgICAiICsgY29tbWFuZCk7Ci0JCQkKLQkJCUlSZW1vdGVFeGVjdXRpb25Ub29scyByZXQgPSBtYW5hZ2VyLmdldEV4ZWN1dGlvblRvb2xzKCk7Ci0JCQlJUmVtb3RlU2NyaXB0IHNjcmlwdCA9IHJldC5jcmVhdGVTY3JpcHQoKTsKLQkJCVN0cmluZ1tdIGVudmlyb25tZW50VmFyaWFibGVzID0gY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudFZhcmlhYmxlc0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudmlyb25tZW50VmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2NyaXB0LmFkZEVudmlyb25tZW50KGVudmlyb25tZW50VmFyaWFibGVzW2ldKTsKLQkJCX0KLQkJCQkJCQotCQkJLyoKLQkJCSAqIENoYW5nZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgZnJvbSBob21lIHRvIHRoZSBhY3R1YWwgd29ya2luZyBkaXJlY3RvcnkuCi0JCQkgKi8KLQkJCWNvbW1hbmQgPSAiY2QgIiArIGNvbmZpZ3VyYXRpb24uZ2V0UmVtb3RlRGlyZWN0b3J5UGF0aCgpICsgIlxuIiArIGNvbW1hbmQgKyAiXG4iOwotCi0JCQlzY3JpcHQuc2V0U2NyaXB0KGNvbW1hbmQuc3BsaXQoIlxuIikpOwotCQkJCi0JCQlJUmVtb3RlU2NyaXB0RXhlY3V0aW9uIGV4ZWN1dGlvbiA9IHJldC5leGVjdXRlU2NyaXB0KHNjcmlwdCk7Ci0JCQlleGVjdXRpb24ud2FpdEZvckVuZE9mRXhlY3V0aW9uKCk7Ci0JCQlpZiAoZXhlY3V0aW9uLmdldFJldHVybkNvZGUoKSA9PSAwKSB7Ci0JCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIgICBTY3JpcHQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXVuY2hQcm9jZXNzRXJyb3JXcml0ZXIucHJpbnRsbigiICAgU2NyaXB0IHJldHVybmVkICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGV4ZWN1dGlvbi5nZXRSZXR1cm5Db2RlKCkpKTsKLQkJCX0KLQkJCWV4ZWN1dGlvbi5jbG9zZSgpOwkJCQotCQl9IGNhdGNoIChSZW1vdGVFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIgICBTY3JpcHQgZmFpbGVkOiAiICsgZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJYWJvcnRXaXRoRXJyb3IoIkNvbm5lY3Rpb24gdG8gaG9zdCBmYWlsZWQuIiwgZSk7Ci0JCX0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplQXBwbGljYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJaWYgKCEgbGF1bmNoSW50ZWdyYXRpb24uZ2V0RG9MYXVuY2hBcHBsaWNhdGlvbigpKSByZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBjb21tYW5kID0gY29uZmlndXJhdGlvbi5nZXRBZnRlckNvbW1hbmQoKTsKLQkJCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiogTGF1bmNoIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgcmVxdWlyZSBydW5uaW5nIGEgYmFzaCBzY3JpcHQgYWZ0ZXIgbGF1bmNoLiIpOwotCQkJCXJldHVybjsJCQkKLQkJCX0KLQkJCWNvbW1hbmQgPSBjb21tYW5kLnRyaW0oKTsKLQkJCWlmIChjb21tYW5kLmxlbmd0aCgpID09IDApIHsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiogTGF1bmNoIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgcmVxdWlyZSBydW5uaW5nIGEgYmFzaCBzY3JpcHQgYWZ0ZXIgbGF1bmNoLiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIqIEZpbmFsaXplIGxhdW5jaCBieSBleGVjdXRpbmc6Iik7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiAgICIgKyBjb21tYW5kKTsKLQkJCQotCQkJSVJlbW90ZUV4ZWN1dGlvblRvb2xzIHJldCA9IG1hbmFnZXIuZ2V0RXhlY3V0aW9uVG9vbHMoKTsKLQkJCUlSZW1vdGVTY3JpcHQgc2NyaXB0ID0gcmV0LmNyZWF0ZVNjcmlwdCgpOwotCQkJU3RyaW5nW10gZW52aXJvbm1lbnRWYXJpYWJsZXMgPSBjb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50VmFyaWFibGVzQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW52aXJvbm1lbnRWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzY3JpcHQuYWRkRW52aXJvbm1lbnQoZW52aXJvbm1lbnRWYXJpYWJsZXNbaV0pOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogQ2hhbmdlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmcm9tIGhvbWUgdG8gdGhlIGFjdHVhbCB3b3JraW5nIGRpcmVjdG9yeS4KLQkJCSAqLwotCQkJY29tbWFuZCA9ICJjZCAiICsgY29uZmlndXJhdGlvbi5nZXRSZW1vdGVEaXJlY3RvcnlQYXRoKCkgKyAiXG4iICsgY29tbWFuZCArICJcbiI7Ci0JCQkKLQkJCXNjcmlwdC5zZXRTY3JpcHQoY29tbWFuZC5zcGxpdCgiXG4iKSk7Ci0JCQkKLQkJCUlSZW1vdGVTY3JpcHRFeGVjdXRpb24gZXhlY3V0aW9uID0gcmV0LmV4ZWN1dGVTY3JpcHQoc2NyaXB0KTsKLQkJCWV4ZWN1dGlvbi53YWl0Rm9yRW5kT2ZFeGVjdXRpb24oKTsKLQkJCWlmIChleGVjdXRpb24uZ2V0UmV0dXJuQ29kZSgpID09IDApIHsKLQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiAgIFNjcmlwdCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0JCQl9IGVsc2UgewotCQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCIgICBTY3JpcHQgcmV0dXJuZWQgIiArIEludGVnZXIudG9TdHJpbmcoZXhlY3V0aW9uLmdldFJldHVybkNvZGUoKSkpOwotCQkJfQotCQkJZXhlY3V0aW9uLmNsb3NlKCk7CQkJCi0JCX0gY2F0Y2ggKFJlbW90ZUV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiAgIFNjcmlwdCBmYWlsZWQ6ICIgKyBlLmdldEVycm9yTWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydFdpdGhFcnJvcigiQ29ubmVjdGlvbiB0byBob3N0IGZhaWxlZC4iLCBlKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJ1bkFwcGxpY2F0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiB7Ci0JCWlmICghIGxhdW5jaEludGVncmF0aW9uLmdldERvTGF1bmNoQXBwbGljYXRpb24oKSkgewotCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIqIExhdW5jaCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHJlcXVpcmUgcnVubmluZyB0aGUgZXhlY3V0YWJsZS4iKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVJlbW90ZUV4ZWN1dGlvblRvb2xzIGlyZXQgPSBudWxsOwotCQlJUmVtb3RlU2NyaXB0IHNjcmlwdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpcmV0ID0gbWFuYWdlci5nZXRFeGVjdXRpb25Ub29scygpOwotCQkJc2NyaXB0ID0gaXJldC5jcmVhdGVTY3JpcHQoKTsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhYm9ydFdpdGhFcnJvcigiQ29ubmVjdGlvbiB0byBob3N0IGZhaWxlZC4iLCBlKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gZW52aXJvbm1lbnRWYXJpYWJsZXMgPSBjb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50VmFyaWFibGVzQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZpcm9ubWVudFZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewotCQkJc2NyaXB0LmFkZEVudmlyb25tZW50KGVudmlyb25tZW50VmFyaWFibGVzW2ldKTsKLQkJfQotCQlzY3JpcHQuc2V0Rm9yd2FyZFgxMShjb25maWd1cmF0aW9uLmdldERvRm9yd2FyZFgxMSgpKTsKLQotCQlBcnJheUxpc3QgY29tbWFuZHNMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGxhdW5jaFNjcmlwdCkpOwotCQlTdHJpbmcgcmVtb3RlV29ya2luZ0RpcmVjdG9yeSA9IExpbnV4UGF0aC50b1N0cmluZyhjb25maWd1cmF0aW9uLmdldFJlbW90ZURpcmVjdG9yeVBhdGgoKSk7Ci0JCUlSZW1vdGVQYXRoVG9vbHMgcGF0aFRvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVQYXRoVG9vbHMoKTsKLQkJY29tbWFuZHNMaXN0LmFkZCgwLCAiY2QgIiArIHBhdGhUb29scy5xdW90ZShyZW1vdGVXb3JraW5nRGlyZWN0b3J5LCB0cnVlKSk7Ci0JCWlmIChjb25maWd1cmF0aW9uLmdldERvQWxsb2NhdGVUZXJtaW5hbCgpKSB7Ci0JCQkvLyBJZiB0ZXJtaW5hbCBpcyBhbGxvY2F0ZWQsIHRoZW4gdHVybiBvZmYgZWNobywgc2luY2UgRWNsaXBzZSBjb25zb2xlIGFscmVhZHkKLQkJCS8vIGVjaG8gdXNlciBpbnB1dC4KLQkJCWNvbW1hbmRzTGlzdC5hZGQoMCwgInN0dHkgLWVjaG8iKTsKLQkJfQotCQlTdHJpbmcgY29tbWFuZHNbXSA9IG5ldyBTdHJpbmdbY29tbWFuZHNMaXN0LnNpemUoKV07Ci0JCWNvbW1hbmRzID0gKFN0cmluZ1tdKSBjb21tYW5kc0xpc3QudG9BcnJheShjb21tYW5kcyk7Ci0JCXNjcmlwdC5zZXRTY3JpcHQoY29tbWFuZHMpOwotCQlzY3JpcHQuc2V0RmV0Y2hQcm9jZXNzRXJyb3JTdHJlYW0odHJ1ZSk7Ci0JCXNjcmlwdC5zZXRGZXRjaFByb2Nlc3NJbnB1dFN0cmVhbSh0cnVlKTsKLQkJc2NyaXB0LnNldEZldGNoUHJvY2Vzc091dHB1dFN0cmVhbSh0cnVlKTsKLQkJc2NyaXB0LnNldEFsbG9jYXRlVGVybWluYWwoY29uZmlndXJhdGlvbi5nZXREb0FsbG9jYXRlVGVybWluYWwoKSk7Ci0JCQotCQlSZW1vdGVQcm9jZXNzIHJlbW90ZVByb2Nlc3MgPSBudWxsOwotCQlleGVjdXRpb25SZXN1bHQgPSBuZXcgRXhlY3V0aW9uUmVzdWx0KCk7Ci0JCXRyeSB7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiogU3RhcnRlZCBhcHBsaWNhdGlvbiBvbiB0YXJnZXQuIik7Ci0JCQkKLQkJCWxhdW5jaEludGVncmF0aW9uLnByZXBhcmVMYXVuY2goKTsKLQkJCXJlbW90ZVByb2Nlc3MgPSBtYW5hZ2VyLmdldEV4ZWN1dGlvblRvb2xzKCkuZXhlY3V0ZVByb2Nlc3Moc2NyaXB0KTsKLQkJCWFwcGxpY2F0aW9uUHJvZ3Jlc3MgPSBEZWJ1Z1BsdWdpbi5uZXdQcm9jZXNzKGxhdW5jaCwgcmVtb3RlUHJvY2VzcywgIlJlbW90ZSBwcm9jZXNzIik7Ci0JCQlJU3RyZWFtc1Byb3h5IHByb3h5ID0gYXBwbGljYXRpb25Qcm9ncmVzcy5nZXRTdHJlYW1zUHJveHkoKTsKLQkJCWlmIChwcm94eSAhPSBudWxsKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgcHJveHkgZXhpc3RzIG9ubHkgd2hlbiBhIGNvbnNvbGUgd2FzIGNyZWF0ZWQgZm9yIHRoZSBwcm9jZXNzLgotCQkJCSAqLwotCQkJCUlTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU3RyZWFtTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHN0cmVhbUFwcGVuZGVkKFN0cmluZyB0ZXh0LCBJU3RyZWFtTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQlvYnNlcnZlci5yZWNlaXZlT3V0cHV0KHRleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlhcHBsaWNhdGlvblByb2dyZXNzLmdldFN0cmVhbXNQcm94eSgpLmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5hZGRMaXN0ZW5lcihsaXN0ZW5lciApOwotCQkJfQotCQkJbGF1bmNoSW50ZWdyYXRpb24uZmluYWxpemVMYXVuY2goKTsKLQkJCXNob3dQcm9jZXNzQ29uc29sZSgpOwotCQkJcmVtb3RlUHJvY2Vzcy53YWl0Rm9yKCk7Ci0JCQkKLQkJCUlSZW1vdGVTY3JpcHRFeGVjdXRpb24gZXhlY3V0aW9uID0gcmVtb3RlUHJvY2Vzcy5nZXRSZW1vdGVFeGVjdXRpb24oKTsKLQkJCWV4ZWN1dGlvblJlc3VsdCA9IG5ldyBFeGVjdXRpb25SZXN1bHQoKTsKLQkJCWV4ZWN1dGlvblJlc3VsdC5zZXRFeGl0VmFsdWUoZXhlY3V0aW9uLmdldFJldHVybkNvZGUoKSk7Ci0JCQkKLQkJCWlmIChleGVjdXRpb24ud2FzQ2FuY2VsZWQoKSkgewotCQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCIgICBFeGVjdXRpb24gd2FzIGNhbmNlbGVkIik7Ci0JCQkJZXhlY3V0aW9uUmVzdWx0LnNldFN0YXR1cyhFeGVjdXRpb25SZXN1bHQuQ0FOQ0VMTEVEKTsKLQkJCX0gZWxzZSBpZiAoZXhlY3V0aW9uLndhc09LKCkpIHsKLQkJCQlpZiAoZXhlY3V0aW9uLmdldFJldHVybkNvZGUoKSA+IDApIHsKLQkJCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIgICBGaW5pc2hlZCB3aXRoIGV4aXQgY29kZTogIiArIEludGVnZXIudG9TdHJpbmcoZXhlY3V0aW9uUmVzdWx0LmdldEV4aXRWYWx1ZSgpKSk7Ci0JCQkJCWV4ZWN1dGlvblJlc3VsdC5zZXRTdGF0dXMoRXhlY3V0aW9uUmVzdWx0LlNVQ0NFU1NfV0lUSF9DT0RFKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiAgIEZpbmlzaGVkIHN1Y2Nlc3NmdWxseSIpOwotCQkJCQlleGVjdXRpb25SZXN1bHQuc2V0U3RhdHVzKEV4ZWN1dGlvblJlc3VsdC5TVUNDRVNTKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGV4ZWN1dGlvbi53YXNFeGNlcHRpb24oKSkgewotCQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCIgICBGaW5pc2hlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGV4ZWN1dGlvbi5nZXRGaW5pc2hTdGF0dXNUZXh0KGV4ZWN1dGlvbi5nZXRGaW5pc2hTdGF0dXMoKSkpOwotCQkJCWV4ZWN1dGlvblJlc3VsdC5zZXRTdGF0dXMoRXhlY3V0aW9uUmVzdWx0LkVYQ0VQVElPTik7CQkJCQotCQkJfSBlbHNlIGlmIChleGVjdXRpb24ud2FzQ29tbWFuZEVycm9yKCkpIHsKLQkJCQlsYXVuY2hQcm9jZXNzRXJyb3JXcml0ZXIucHJpbnRsbigiICAgQ291bGQgbm90IHJ1biBhcHBsaWNhdGlvbjogIiArIGV4ZWN1dGlvbi5nZXRGaW5pc2hTdGF0dXNUZXh0KGV4ZWN1dGlvbi5nZXRGaW5pc2hTdGF0dXMoKSkpOwotCQkJCWV4ZWN1dGlvblJlc3VsdC5zZXRTdGF0dXMoRXhlY3V0aW9uUmVzdWx0LkNPTU1BTkRfRVJST1IpOwkJCQkJCQkJCi0JCQl9IGVsc2UgewotCQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCIgICBGYWlsZWQuIik7Ci0JCQkJZXhlY3V0aW9uUmVzdWx0LnNldFN0YXR1cyhFeGVjdXRpb25SZXN1bHQuVU5LTk9XTik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oIiAgIEZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oIiAgICAgIiArIHN0YXR1cy5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJZXhlY3V0aW9uUmVzdWx0LnNldFN0YXR1cyhFeGVjdXRpb25SZXN1bHQuRVJST1IpOwotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlleGVjdXRpb25SZXN1bHQuc2V0U3RhdHVzKEV4ZWN1dGlvblJlc3VsdC5FUlJPUik7Ci0JCQlhYm9ydFdpdGhFcnJvcigiQ29ubmVjdGlvbiB0byBob3N0IGZhaWxlZC4iLCBlKTsKLQkJfSBjYXRjaCAoUmVtb3RlRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4ZWN1dGlvblJlc3VsdC5zZXRTdGF0dXMoRXhlY3V0aW9uUmVzdWx0LkVSUk9SKTsKLQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCIgICBGYWlsZWQgdG8gZXhlY3V0ZTogIiArIGUuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGVjdXRpb25SZXN1bHQuc2V0U3RhdHVzKEV4ZWN1dGlvblJlc3VsdC5FUlJPUik7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdGVQcm9jZXNzLmRlc3Ryb3koKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uIHsKLQkJaWYgKCEgY29uZmlndXJhdGlvbi5nZXREb0NsZWFudXAoKSkgewotCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIqIExhdW5jaCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHJlcXVpcmUgY2xlYW5pbmcgdXAgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVBhdGggcmVtb3RlUGF0aCA9IGNvbmZpZ3VyYXRpb24uZ2V0UmVtb3RlRGlyZWN0b3J5UGF0aCgpOwotCQlTdHJpbmcgcmVtb3RlRGlyZWN0b3J5ID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCQl0cnkgewotCQkJbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlci5wcmludGxuKCIqIENsZWFuaW5nIHVwIHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeTogIiArIHJlbW90ZURpcmVjdG9yeSk7Ci0JCQlJUmVtb3RlRmlsZVRvb2xzIGlyZnQgPSBtYW5hZ2VyLmdldFJlbW90ZUZpbGVUb29scygpOwotCQkJaXJmdC5yZW1vdmVGaWxlKHJlbW90ZURpcmVjdG9yeSk7Ci0JCQlsYXVuY2hQcm9jZXNzT3V0cHV0V3JpdGVyLnByaW50bG4oIiAgIENsZWFuIHVwIGNvbXBsZXRlIik7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlsYXVuY2hQcm9jZXNzRXJyb3JXcml0ZXIucHJpbnRsbigiICAgQ2xlYW4gdXAgZmFpbGVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJYWJvcnRXaXRoRXJyb3IoIkNvdWxkIG5vdCBjbGVhbiB1cCB0YXJnZXQuIiwgZSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotCQkJYWJvcnRXaXRoRXJyb3IoIkNvbm5lY3Rpb24gdG8gaG9zdCBmYWlsZWQuIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb21tYW5kTGluZShTdHJpbmcgcmVtb3RlRXhlY3V0YWJsZU5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50c0FycmF5KSB7Ci0vLwkJU3RyaW5nIHJlc3VsdCA9IHJlbW90ZUV4ZWN1dGFibGVOYW1lOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzQXJyYXkubGVuZ3RoOyBpKyspIHsKLS8vCQkJLy8gVE9ETzogd2hpY2gga2luZCBvZiBxdW90aW5nIGlzIG5lZWRlZD8KLS8vCQkJU3RyaW5nIGFyZ3VtZW50ID0gYXJndW1lbnRzQXJyYXlbaV0ucmVwbGFjZUFsbCgiICIsICJcXCAiKTsKLS8vCQkJcmVzdWx0ICs9ICIgIiArIGFyZ3VtZW50OwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotCQlBcmd1bWVudFBhcnNlciBwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIocmVtb3RlRXhlY3V0YWJsZU5hbWUsIGFyZ3VtZW50c0FycmF5KTsKLQkJcmV0dXJuIHBhcnNlci5nZXRDb21tYW5kTGluZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQlzZXRDdXJyZW50UHJvZ3Jlc3MoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuV0FJVCk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgYSBqb2IgdGhhdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgbGF1bmNoLgotCQkgKi8KLQkJdGFyZ2V0UHJvY2VzcyA9IG5ldyBUYXJnZXRQcm9jZXNzKGxhdW5jaCwgdGhpcyk7Ci0JCWFkZFByb2dyZXNzTGlzdGVuZXIodGFyZ2V0UHJvY2Vzcyk7Ci0JCWxhdW5jaFByb2Nlc3NPdXRwdXRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIodGFyZ2V0UHJvY2Vzcy5nZXRPdXRwdXRTdHJlYW0oKSwgdHJ1ZSk7Ci0JCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlciA9IG5ldyBQcmludFdyaXRlcih0YXJnZXRQcm9jZXNzLmdldEVycm9yU3RyZWFtKCksIHRydWUpOwotCQl0YXJnZXRQcm9jZXNzLnN0YXJ0KCk7Ci0KLQkJb2JzZXJ2ZXIuc2V0RXhlY3V0aW9uTWFuYWdlcihtYW5hZ2VyKTsKLQkJbGF1bmNoSW50ZWdyYXRpb24uc2V0RXhlY3V0aW9uTWFuYWdlcihtYW5hZ2VyKTsKLQotCQl0cnkgewotCQkJb2JzZXJ2ZXIuc3RhcnQoKTsJCQkKLQkJCWxhdW5jaEludGVncmF0aW9uLnN0YXJ0KCk7Ci0JCQkKLQkJCVN0cmluZyByZW1leGVjcGF0aCA9IExpbnV4UGF0aC50b1N0cmluZygKLQkJCQkJY29uZmlndXJhdGlvbi5nZXRSZW1vdGVFeGVjdXRhYmxlUGF0aCgpKTsKLQkJCWxhdW5jaFNjcmlwdCA9IGxhdW5jaEludGVncmF0aW9uLmNyZWF0ZUxhdW5jaFNjcmlwdChyZW1leGVjcGF0aCwgY29uZmlndXJhdGlvbi5nZXRBcmd1bWVudHNBcnJheSgpKTsKLQkJCQotCQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLlBSRVBBUkVfV09SS0lOR19ESVIxKTsKLQkJCXByZXBhcmVXb3JraW5nRGlyKCk7Ci0JCQlsYXVuY2hJbnRlZ3JhdGlvbi5wcmVwYXJlVXBsb2FkV29ya2luZ0RpcigpOwotCi0JCQlzZXRDdXJyZW50UHJvZ3Jlc3MoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuVVBMT0FEX1dPUktJTkdfRElSKTsKLQkJCXVwbG9hZFdvcmtpbmdEaXJlY3RvcnkoKTsKLQotCQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLlBSRVBBUkVfV09SS0lOR19ESVIyKTsKLQkJCWxhdW5jaEludGVncmF0aW9uLmZpbmFsaXplV29ya2luZ0RpcigpOwotCi0JCQlzZXRDdXJyZW50UHJvZ3Jlc3MoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuVVBMT0FEX0FQUExJQ0FUSU9OKTsKLQkJCXVwbG9hZEFwcGxpY2F0aW9uKCk7Ci0KLQkJCXNldEN1cnJlbnRQcm9ncmVzcyhJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5QUkVQQVJFX0FQUExJQ0FUSU9OKTsKLQkJCXByZXBhcmVBcHBsaWNhdGlvbigpOwotCQkJbGF1bmNoSW50ZWdyYXRpb24ucHJlcGFyZUFwcGxpY2F0aW9uKCk7Ci0JCQlvYnNlcnZlci5wcmVwYXJlQXBwbGljYXRpb24oKTsKLQotCQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLlJVTk5JTkcpOwotCQkJcnVuQXBwbGljYXRpb24oKTsKLQkJCQotCQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLkZJTkFMSVpFX0FQUExJQ0FUSU9OKTsKLQkJCW9ic2VydmVyLmZpbmFsaXplQXBwbGljYXRpb24oKTsKLQkJCWxhdW5jaEludGVncmF0aW9uLmZpbmFsaXplQXBwbGljYXRpb24oKTsKLQkJCWZpbmFsaXplQXBwbGljYXRpb24oKTsKLQkJCQotCQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLkRPV05MT0FEX1dPUktJTkdfRElSKTsKLQkJCWRvd25sb2FkV29ya2luZ0RpcmVjdG9yeSgpOwotCQkJCi0JCQlzZXRDdXJyZW50UHJvZ3Jlc3MoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuRklOQUxJWkVfV09SS0lOR19ESVIyKTsKLQkJCWxhdW5jaEludGVncmF0aW9uLmZpbmFsaXplV29ya2luZ0RpcigpOwotCQkJCi0JCQlzZXRDdXJyZW50UHJvZ3Jlc3MoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuQ0xFQU5VUCk7Ci0JCQljbGVhblVwKCk7Ci0KLQkJCXNldEN1cnJlbnRQcm9ncmVzcyhJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5GSU5BTElaRV9DTEVBTlVQKTsKLQkJCWxhdW5jaEludGVncmF0aW9uLmZpbmFsaXplQ2xlYW51cCgpOwotCQkJCi0JCQlzZXRDdXJyZW50UHJvZ3Jlc3MoSUxhdW5jaFByb2dyZXNzTGlzdGVuZXIuRklOSVNIRUQpOwotCQkJb2JzZXJ2ZXIuZmluaXNoKCk7Ci0JCQlsYXVuY2hJbnRlZ3JhdGlvbi5maW5pc2goKTsKLQotCQkJaWYgKGV4ZWN1dGlvblJlc3VsdC5nZXRTdGF0dXMoKSA9PSBFeGVjdXRpb25SZXN1bHQuU1VDQ0VTUykgewotCQkJCXNob3dQcm9jZXNzQ29uc29sZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlzaG93TGF1bmNoQ29uc29sZSgpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKENhbmNlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZXhlY3V0aW9uUmVzdWx0ID09IG51bGwpIHsKLQkJCQlleGVjdXRpb25SZXN1bHQgPSBuZXcgRXhlY3V0aW9uUmVzdWx0KCk7Ci0JCQkJZXhlY3V0aW9uUmVzdWx0LnNldFN0YXR1cyhFeGVjdXRpb25SZXN1bHQuQ0FOQ0VMTEVEKTsKLQkJCX0KLQkJCWZvcmNlZENsZWFuVXAobWFuYWdlcik7Ci0vLwkJCW5vdGlmeUludGVycnVwdCgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChleGVjdXRpb25SZXN1bHQgPT0gbnVsbCkgewotCQkJCWV4ZWN1dGlvblJlc3VsdCA9IG5ldyBFeGVjdXRpb25SZXN1bHQoKTsKLQkJCQlleGVjdXRpb25SZXN1bHQuc2V0U3RhdHVzKEV4ZWN1dGlvblJlc3VsdC5FUlJPUik7Ci0JCQl9Ci0JCQlmb3JjZWRDbGVhblVwKG1hbmFnZXIpOwotCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oKTsKLQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCIqKiogVGhlIGxhdW5jaCBkaWQgbm90IHdvcmsgY29ycmVjdGx5ICoqKiIpOwotCQkJbGF1bmNoUHJvY2Vzc0Vycm9yV3JpdGVyLnByaW50bG4oIiAgICBBbiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIGxhdW5jaDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWxhdW5jaFByb2Nlc3NFcnJvcldyaXRlci5wcmludGxuKCk7Ci0JCQlub3RpZnlJbnRlcnJ1cHQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldEN1cnJlbnRQcm9ncmVzcyhJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5GSU5JU0hFRCk7Ci0JCQlvYnNlcnZlci5jbGVhbnVwKCk7Ci0JCQlsYXVuY2hJbnRlZ3JhdGlvbi5jbGVhbnVwKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZm9yY2VkQ2xlYW5VcChJUmVtb3RlRXhlY3V0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChnZXRDdXJyZW50UHJvZ3Jlc3MoKSA+IElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLlBSRVBBUkVfQVBQTElDQVRJT04pIHsKLQkJCXNldEN1cnJlbnRQcm9ncmVzcyhJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5GSU5BTElaRV9BUFBMSUNBVElPTik7Ci0JCQl0cnkgewotCQkJCWxhdW5jaEludGVncmF0aW9uLmZpbmFsaXplQXBwbGljYXRpb24oKTsKLQkJCX0gY2F0Y2ggKENhbmNlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkKLQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLkZJTkFMSVpFX1dPUktJTkdfRElSMik7Ci0JCXRyeSB7Ci0JCQlsYXVuY2hJbnRlZ3JhdGlvbi5maW5hbGl6ZUNsZWFudXAoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQl9IGNhdGNoIChDYW5jZWxFeGNlcHRpb24gZTEpIHsKLQkJfQotCQkKLQkJc2V0Q3VycmVudFByb2dyZXNzKElMYXVuY2hQcm9ncmVzc0xpc3RlbmVyLkNMRUFOVVApOwotCQl0cnkgewotCQkJY2xlYW5VcCgpOwotCQl9IGNhdGNoIChDYW5jZWxFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXNldEN1cnJlbnRQcm9ncmVzcyhJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5GSU5BTElaRV9DTEVBTlVQKTsKLQkJdHJ5IHsKLQkJCWxhdW5jaEludGVncmF0aW9uLmZpbmFsaXplQ2xlYW51cCgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ2FuY2VsRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFib3J0V2l0aEVycm9yKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBSZW1vdGVMYXVuY2hlclBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIDAsIG1lc3NhZ2UsIGUpOwotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvZ3Jlc3NMaXN0ZW5lcihJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKSB7Ci0JCXByb2dyZXNzTGlzdGVuZXJzLmFkZChwcm9ncmVzc0xpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKSB7Ci0JCXByb2dyZXNzTGlzdGVuZXJzLnJlbW92ZShwcm9ncmVzc0xpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hPYnNlcnZlcihJTGF1bmNoT2JzZXJ2ZXIgbGF1bmNoT2JzZXJ2ZXIpIHsKLQkJaWYgKGxhdW5jaE9ic2VydmVyID09IG51bGwpIHsKLQkJCXRoaXMub2JzZXJ2ZXIgPSBuZXcgTnVsbExhdW5jaE9ic2VydmVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm9ic2VydmVyID0gbGF1bmNoT2JzZXJ2ZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXIgZ2V0RXhlY3V0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQlyZXR1cm4gbGF1bmNoOwotCX0KLQotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbGF1bmNoLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93UHJvY2Vzc0NvbnNvbGUoKSB7Ci0JCWlmIChhcHBsaWNhdGlvblByb2dyZXNzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ29uc29sZU1hbmFnZXIgY29uc29sZU1hbmFnZXIgPSBDb25zb2xlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlTWFuYWdlcigpOwotCQlJQ29uc29sZVtdIGNvbnNvbGVzID0gY29uc29sZU1hbmFnZXIuZ2V0Q29uc29sZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zb2xlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbnNvbGUgY29uc29sZSA9IGNvbnNvbGVzW2ldOwotCQkJaWYgKGNvbnNvbGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSBwcm9jZXNzQ29uc29sZSA9IChvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlKSBjb25zb2xlOwotCQkJCUlQcm9jZXNzIHByb2Nlc3MgPSBwcm9jZXNzQ29uc29sZS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgPT0gYXBwbGljYXRpb25Qcm9ncmVzcykgewotCQkJCQljb25zb2xlTWFuYWdlci5zaG93Q29uc29sZVZpZXcoY29uc29sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dMYXVuY2hDb25zb2xlKCkgewotCQlpZiAoYXBwbGljYXRpb25Qcm9ncmVzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUNvbnNvbGVNYW5hZ2VyIGNvbnNvbGVNYW5hZ2VyID0gQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29uc29sZU1hbmFnZXIoKTsKLQkJSUNvbnNvbGVbXSBjb25zb2xlcyA9IGNvbnNvbGVNYW5hZ2VyLmdldENvbnNvbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc29sZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25zb2xlIGNvbnNvbGUgPSBjb25zb2xlc1tpXTsKLQkJCWlmIChjb25zb2xlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkgewotCQkJCW9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUgcHJvY2Vzc0NvbnNvbGUgPSAob3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkgY29uc29sZTsKLQkJCQlJUHJvY2VzcyBwcm9jZXNzID0gcHJvY2Vzc0NvbnNvbGUuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzID09IHRhcmdldFByb2Nlc3MpIHsKLQkJCQkJY29uc29sZU1hbmFnZXIuc2hvd0NvbnNvbGVWaWV3KGNvbnNvbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBQcmludFdyaXRlciBnZXRFcnJvcldyaXRlcigpIHsKLQkJcmV0dXJuIGxhdW5jaFByb2Nlc3NFcnJvcldyaXRlcjsKLQl9Ci0KLQlwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0T3V0cHV0V3JpdGVyKCkgewotCQlyZXR1cm4gbGF1bmNoUHJvY2Vzc091dHB1dFdyaXRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTeW5jaHJvbml6YXRpb25SdWxlKElTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUpIHsKLQkJZXh0cmFTeW5jaHJvbml6YXRpb25SdWxlcy5hZGQocnVsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvUnVsZUFjdGlvbkZhY3RvcnkuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL1J1bGVBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzMzYwZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvUnVsZUFjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5Eb3dubG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuSVN5bmNocm9uaXphdGlvblJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuVXBsb2FkUnVsZTsKLQotCi1wdWJsaWMgY2xhc3MgUnVsZUFjdGlvbkZhY3RvcnkgewotCQotCXByaXZhdGUgSUxhdW5jaFByb2Nlc3NDYWxsYmFjayBwcm9jZXNzOwotCi0JcHVibGljIFJ1bGVBY3Rpb25GYWN0b3J5KElMYXVuY2hQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzcykgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCX0KLQotCXB1YmxpYyBJUnVsZUFjdGlvbiBnZXRBY3Rpb24oSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSkgewotCQlpZiAocnVsZSBpbnN0YW5jZW9mIERvd25sb2FkUnVsZSkgewotCQkJRG93bmxvYWRSdWxlIGRvd25sb2FkUnVsZSA9IChEb3dubG9hZFJ1bGUpIHJ1bGU7Ci0JCQlEb3dubG9hZFJ1bGVBY3Rpb24gYWN0aW9uID0gbmV3IERvd25sb2FkUnVsZUFjdGlvbihwcm9jZXNzLCBkb3dubG9hZFJ1bGUpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfSBlbHNlIGlmIChydWxlIGluc3RhbmNlb2YgVXBsb2FkUnVsZSkgewotCQkJVXBsb2FkUnVsZSB1cGxvYWRSdWxlID0gKFVwbG9hZFJ1bGUpIHJ1bGU7Ci0JCQlVcGxvYWRSdWxlQWN0aW9uIGFjdGlvbiA9IG5ldyBVcGxvYWRSdWxlQWN0aW9uKHByb2Nlc3MsIHVwbG9hZFJ1bGUpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfSBlbHNlIGlmIChydWxlIGluc3RhbmNlb2YgRG93bmxvYWRCYWNrUnVsZSkgewotCQkJRG93bmxvYWRCYWNrUnVsZSB1cGxvYWRSdWxlID0gKERvd25sb2FkQmFja1J1bGUpIHJ1bGU7Ci0JCQlEb3dubG9hZEJhY2tBY3Rpb24gYWN0aW9uID0gbmV3IERvd25sb2FkQmFja0FjdGlvbihwcm9jZXNzLCB1cGxvYWRSdWxlKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0gZWxzZSB7Ci0JCQlBc3NlcnQuaXNMZWdhbChmYWxzZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvVXBsb2FkUnVsZUFjdGlvbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvVXBsb2FkUnVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDI3YjdlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL1VwbG9hZFJ1bGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlQ29weVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5jb3JlLklSZW1vdGVEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUV4ZWN1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUuSVJlbW90ZUZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZS5JUmVtb3RlU3RhdHVzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuTGludXhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuT3ZlcndyaXRlUG9saWNpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuVXBsb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLkNhbmNlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZXhjZXB0aW9uLlJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmV4Y2VwdGlvbi5SZW1vdGVPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuZmlsZS5GaWxlUmVjdXJzaXZlRW51bWVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIFVwbG9hZFJ1bGVBY3Rpb24gaW1wbGVtZW50cyBJUnVsZUFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBJTGF1bmNoUHJvY2Vzc0NhbGxiYWNrIHByb2Nlc3M7Ci0JcHJpdmF0ZSBVcGxvYWRSdWxlIHJ1bGU7Ci0JcHJpdmF0ZSBFeGVjdXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBQcmludFdyaXRlciBvdXRwdXRXcml0ZXI7Ci0JcHJpdmF0ZSBQcmludFdyaXRlciBlcnJvcldyaXRlcjsKLQlwcml2YXRlIElSZW1vdGVFeGVjdXRpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJpdmF0ZSBEb3dubG9hZEJhY2tSdWxlIGRvd25sb2FkQmFja1J1bGU7Ci0JcHJpdmF0ZSBsb25nIGNsb2NrU2tldzsKLQotCXB1YmxpYyBVcGxvYWRSdWxlQWN0aW9uKElMYXVuY2hQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzcywgVXBsb2FkUnVsZSB1cGxvYWRSdWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucnVsZSA9IHVwbG9hZFJ1bGU7Ci0JCWNvbmZpZ3VyYXRpb24gPSBwcm9jZXNzLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJb3V0cHV0V3JpdGVyID0gcHJvY2Vzcy5nZXRPdXRwdXRXcml0ZXIoKTsKLQkJZXJyb3JXcml0ZXIgPSBwcm9jZXNzLmdldEVycm9yV3JpdGVyKCk7CQotCQltYW5hZ2VyID0gcHJvY2Vzcy5nZXRFeGVjdXRpb25NYW5hZ2VyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwocHJvY2Vzcyk7Ci0JCUFzc2VydC5pc05vdE51bGwocnVsZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoY29uZmlndXJhdGlvbik7Ci0JCUFzc2VydC5pc05vdE51bGwob3V0cHV0V3JpdGVyKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChlcnJvcldyaXRlcik7Ci0JCUFzc2VydC5pc05vdE51bGwobWFuYWdlcik7Ci0KLQkJLyoKLQkJICogSWYgb3ZlcndyaXRlIHBvbGljeSBkZXBlbmRzIG9uIHRpbWUsIHRoZW4gZ2V0IHJlbW90ZSBjbG9jayBza2V3LgotCQkgKi8KLQkJaWYgKHJ1bGUuZ2V0T3ZlcndyaXRlUG9saWN5KCkgPT0gT3ZlcndyaXRlUG9saWNpZXMuTkVXRVIpIHsKLQkJCUlSZW1vdGVTdGF0dXNUb29scyBzdGF0dXNUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlU3RhdHVzVG9vbHMoKTsKLQkJCWxvbmcgbG9jYWxUaW1lOwotCQkJbG9uZyByZW1vdGVUaW1lOwotCQkJdHJ5IHsKLQkJCQlsb2NhbFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlyZW1vdGVUaW1lID0gc3RhdHVzVG9vbHMuZ2V0VGltZSgpOwotCQkJCWNsb2NrU2tldyA9IGxvY2FsVGltZSAtcmVtb3RlVGltZTsKLQkJCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ291bGQgbm90IGNhbGN1bGF0ZSBjbG9jayBkaWZmZXJlbmNlIHdpdGggcmVtb3RlIGhvc3Q6IHswfSIsIGUuZ2V0TWVzc2FnZSgpKSk7CQkJCi0JCQkJZXJyb3JXcml0ZXIucHJpbnRsbigiICAgQXNzdW1pbmcgc2FtZSBhIHJlbW90ZSBjbG9jayBzeW5jaHJvbml6ZWQgd2l0aCBsb2NhbCBjbG9jay4iKTsKLQkJCQljbG9ja1NrZXcgPSAwOwotCQkJfQotCQkJaWYgKGNsb2NrU2tldyA8IC0xNTAwMCkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oIiAgIFdhcm5pbmchIENsb2NrIGF0IHJlbW90ZSB0YXJnZXQgaXMgbW9yZSByZWNlbnQgdGhhbiBsb2NhbCBjbG9jay4gRmlsZSBzeW5jaHJvbml6YXRpb24gbWF5IG5vdCBiZSBjb3JyZWN0LiIpOwotCQkJfSBlbHNlIGlmIChjbG9ja1NrZXcgPiAxNTAwMCkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oIiAgIFdhcm5pbmchIENsb2NrIGF0IHJlbW90ZSB0YXJnZXQgaXMgb2xkZXIgdGhhbiBsb2NhbCBjbG9jay4gRmlsZSBzeW5jaHJvbml6YXRpb24gbWF5IG5vdCBiZSBjb3JyZWN0LiIpOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogRGV0ZXJtaW5lIHJlbW90ZSBwYXRoLiBNYWtlIGl0IGFic29sdXRlLgotCQkgKi8KLQkJSVBhdGggZGVmYXVsdFJlbW90ZVBhdGggPSBjb25maWd1cmF0aW9uLmdldFJlbW90ZURpcmVjdG9yeVBhdGgoKTsKLQkJSVBhdGggcmVtb3RlUGF0aCA9IG51bGw7Ci0JCWlmIChydWxlLmlzRGVmYXVsdFJlbW90ZURpcmVjdG9yeSgpKSB7Ci0JCQlyZW1vdGVQYXRoID0gZGVmYXVsdFJlbW90ZVBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdGVQYXRoID0gTGludXhQYXRoLmZyb21TdHJpbmcocnVsZS5nZXRSZW1vdGVEaXJlY3RvcnkoKSk7Ci0JCQlpZiAoISByZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCXJlbW90ZVBhdGggPSBkZWZhdWx0UmVtb3RlUGF0aC5hcHBlbmQocmVtb3RlUGF0aCk7Ci0JCQl9Ci0JCX0KLQkJcmVtb3RlUGF0aCA9IHJlbW90ZVBhdGgucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShyZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSwgInJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpIik7Ci0JCQotCQkvKgotCQkgKiBEZXRlcm1pbmUgbGlzdCBvZiBsb2NhbCBwYXRocy4gTWFrZSB0aGVtIGFic29sdXRlLgotCQkgKi8KLQkJSVBhdGggbG9jYWxQYXRocyBbXSA9IHJ1bGUuZ2V0TG9jYWxGaWxlc0FzUGF0aEFycmF5KCk7Ci0JCUlQYXRoIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBsb2NhbFBhdGggPSBsb2NhbFBhdGhzW2ldOwotCQkJaWYgKCFsb2NhbFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJbG9jYWxQYXRoID0gd29ya3NwYWNlLmFwcGVuZChsb2NhbFBhdGgpOwotCQkJfQotCQkJbG9jYWxQYXRoID0gbG9jYWxQYXRoLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCQlBc3NlcnQuaXNUcnVlKGxvY2FsUGF0aC5pc0Fic29sdXRlKCksICJsb2NhbFBhdGguaXNBYnNvbHV0ZSgpIik7Ci0JCQlsb2NhbFBhdGhzW2ldID0gbG9jYWxQYXRoOwotCQl9Ci0JCQotCQkvKgotCQkgKiBQcm9jZXNzIHBhdGhzLgotCQkgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBsb2NhbFBhdGggPSBsb2NhbFBhdGhzW2ldOwotCQkJCi0JCQlGaWxlIGxvY2FsRmlsZSA9IGxvY2FsUGF0aC50b0ZpbGUoKTsKLQkJCWlmICghIGxvY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIElnbm9yaW5nIHswfTogUGF0aCBkb2VzIG5vdCBleGlzdCBsb2NhbGx5IiwgbG9jYWxGaWxlLnRvU3RyaW5nKCkpKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobG9jYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl1cGxvYWREaXJlY3RvcnkobG9jYWxGaWxlLCByZW1vdGVQYXRoKTsKLQkJCX0gZWxzZSBpZiAobG9jYWxGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJdXBsb2FkRmlsZShsb2NhbEZpbGUsIHJlbW90ZVBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBJZ25vcmluZyB7MH06IFBhdGggaXMgbm90IGEgZmlsZSBub3IgZGlyZWN0b3J5IiwgbG9jYWxGaWxlLnRvU3RyaW5nKCkpKTsKLQkJCQljb250aW51ZTsJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIElmIGEgZG93bmxvYWQgYmFjayBydWxlIHdhcyBjcmVhdGVkIGR1cmluZyB0aGUgdXBsb2FkLAotCQkgKiB0aGUgYWRkIHRoaXMgcnVsZSB0aGUgdGhlIGxpc3Qgb2Ygc3luY2hyb25pemUgcnVsZXMuCi0JCSAqLwotCQlpZiAoZG93bmxvYWRCYWNrUnVsZSAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzLmFkZFN5bmNocm9uaXphdGlvblJ1bGUoZG93bmxvYWRCYWNrUnVsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBsb2FkRmlsZShGaWxlIGxvY2FsRmlsZSwgSVBhdGggcmVtb3RlRGlyZWN0b3J5UGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIENhbmNlbEV4Y2VwdGlvbiwgUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc1RydWUobG9jYWxGaWxlLmlzQWJzb2x1dGUoKSwgImxvY2FsRmlsZS5pc0Fic29sdXRlKCkiKTsKLQkJQXNzZXJ0LmlzVHJ1ZShyZW1vdGVEaXJlY3RvcnlQYXRoLmlzQWJzb2x1dGUoKSwgInJlbW90ZURpcmVjdG9yeVBhdGguaXNBYnNvbHV0ZSgpIik7Ci0JCQotCQlJUGF0aCByZW1vdGVGaWxlID0gcmVtb3RlRGlyZWN0b3J5UGF0aC5hcHBlbmQobG9jYWxGaWxlLmdldE5hbWUoKSk7Ci0JCW91dHB1dFdyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDb3B5aW5nIGZpbGUgezB9IChsb2NhbCkiLCBsb2NhbEZpbGUudG9TdHJpbmcoKSkpOwotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgdG8gZmlsZSB7MH0gKHJlbW90ZSkiLCBMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlRmlsZSkpKTsKLQotCQlkb0ZpbGVVcGxvYWQobG9jYWxGaWxlLCByZW1vdGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9GaWxlVXBsb2FkKEZpbGUgbG9jYWxGaWxlLCBJUGF0aCByZW1vdGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsJCQotCQlpZiAoISBsb2NhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIElnbm9yaW5nIHswfTogRmlsZSBkb2VzIG5vdCBleGlzdCBsb2NhbGx5IiwgbG9jYWxGaWxlLnRvU3RyaW5nKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFzc2VydC5pc1RydWUobG9jYWxGaWxlLmlzQWJzb2x1dGUoKSwgImxvY2FsRmlsZS5pc0Fic29sdXRlKCkiKTsKLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbEZpbGUuaXNGaWxlKCksICJsb2NhbEZpbGUuaXNGaWxlKCkiKTsKLQkJQXNzZXJ0LmlzVHJ1ZShyZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSwgInJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpIik7Ci0JCQotCQlTdHJpbmcgcmVtb3RlUGF0aEFzU3RyaW5nID0gTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCi0JCUlSZW1vdGVDb3B5VG9vbHMgY29weVRvb2xzID0gbWFuYWdlci5nZXRSZW1vdGVDb3B5VG9vbHMoKTsKLQkJSVJlbW90ZUZpbGVUb29scyBmaWxlVG9vbHMgPSBtYW5hZ2VyLmdldFJlbW90ZUZpbGVUb29scygpOwotCQkJCQotCQkvKgotCQkgKiBDaGVjayBpZiBmaWxlIGV4aXN0cyBhbmQgaWYgZmlsZSBpcyBuZXdlciwgZGVwZW5kaW5nIG9uIG92ZXJ3cml0ZSBwb2xpY3kuCi0JCSAqLwotCQlpZiAocnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSA9PSBPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVMpIHsKLQkJCS8qCi0JCQkgKiBGaWxlIGlzIGFsd2F5cyBjb3BpZWQsIG5vIHBvbGljeS4KLQkJCSAqLwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFBvbGljeSBuZWVkcyB0byBjaGVjayByZW1vdGUgZmlsZS4KLQkJCSAqLwotCQkJSVJlbW90ZUZpbGUgcmVtb3RlRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlbW90ZUZpbGUgPSBmaWxlVG9vbHMuZ2V0RmlsZShyZW1vdGVQYXRoQXNTdHJpbmcpOwotCQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDb3VsZCBub3QgZmV0Y2ggcHJvcGVydGllcyBmb3IgcmVtb3RlIGZpbGUsIGlnbm9yaW5nIGl0OiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChydWxlLmdldE92ZXJ3cml0ZVBvbGljeSgpID09IE92ZXJ3cml0ZVBvbGljaWVzLlNLSVApIHsKLQkJCQlpZiAocmVtb3RlRmlsZS5leGlzdHMoKSkgewotCQkJCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgRmlsZSBhbHJlZHkgZXhpc3RzIG9uIHJlbW90ZSB0YXJnZXQsIGlnbm9yaW5nIGl0OiB7MH0iLCByZW1vdGVQYXRoKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJ1bGUuZ2V0T3ZlcndyaXRlUG9saWN5KCkgPT0gT3ZlcndyaXRlUG9saWNpZXMuTkVXRVIpIHsKLQkJCQlsb25nIGRpZmZlcmVuY2UgPSBsb2NhbEZpbGUubGFzdE1vZGlmaWVkKCkgLSByZW1vdGVGaWxlLmdldE1vZGlmaWNhdGlvblRpbWUoKTsKLQkJCQlpZiAoZGlmZmVyZW5jZSA8IDEwMDApIHsKLQkJCQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIEEgbmV3ZXIgZmlsZSBhbHJlZHkgZXhpc3RzIG9uIHJlbW90ZSB0YXJnZXQsIGlnbm9yaW5nIGl0OiB7MH0iLCByZW1vdGVQYXRoKSk7Ci0JCQkJCXJldHVybjsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSAgCi0JCQotCQkvKgotCQkgKiBVcGxvYWQgdGhlIGZpbGUuCi0JCSAqLwotCQl0cnkgewotCQkJY29weVRvb2xzLnVwbG9hZEZpbGVUb0ZpbGUobG9jYWxGaWxlLCByZW1vdGVQYXRoQXNTdHJpbmcpOwotCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ291bGQgbm90IHVwbG9hZCBmaWxlOiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCS8qCi0JCSAqIEFkZCBmaWxlIHRvIGxpc3Qgb2YgZmlsZXMgdG8gZG93bmxvYWQgYmFjaywgaWYgdGhpcyBmZWF0dXJlIHdhcyBlbmFibGVkLgotCQkgKi8KLQkJaWYgKHJ1bGUuaXNEb3dubG9hZEJhY2soKSkgewotCQkJaWYgKGRvd25sb2FkQmFja1J1bGUgPT0gbnVsbCkgewotCQkJCWRvd25sb2FkQmFja1J1bGUgPSBuZXcgRG93bmxvYWRCYWNrUnVsZSgpOwotCQkJfQotCQkJZG93bmxvYWRCYWNrUnVsZS5hZGQobG9jYWxGaWxlLCByZW1vdGVQYXRoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEZldGNoIHByb3BlcnRpZXMgb2YgZmlsZSB0aGF0IHdhcyBqdXN0IHVwbG9hZGVkLgotCQkgKi8KLQkJSVJlbW90ZUZpbGUgcmVtb3RlRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVGaWxlID0gZmlsZVRvb2xzLmdldEZpbGUocmVtb3RlUGF0aEFzU3RyaW5nKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCBmZXRjaCBwcm9wZXJ0aWVzIGZvciB1cGxvYWRlZCBmaWxlOiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvKgotCQkgKiBTZXQgZmlsZSBwZXJtaXNzaW9ucy4gV2UgbmVlZCBoZWxwIG9mIEVGUywgc2luY2UgdGhlIEZpbGUgY2xhc3MgZnJvbQotCQkgKiBKYXZhIGRvZXMgbm90IHByb3ZpZGVsIGFsbCBpbmZvcm1hdGlvbi4KLQkJICovCi0JCUlGaWxlU3lzdGVtIGxvY2FsRmlsZVN5c3RlbSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKTsKLQkJSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBsb2NhbEZpbGVTeXN0ZW0uZ2V0U3RvcmUobmV3IFBhdGgobG9jYWxGaWxlLmdldFBhdGgoKSkpOwotCQlJRmlsZUluZm8gZmlsZUluZm8gPSBmaWxlU3RvcmUuZmV0Y2hJbmZvKCk7Ci0KLQkJYm9vbGVhbiByZWFkID0gbG9jYWxGaWxlLmNhblJlYWQoKTsKLQkJYm9vbGVhbiB3cml0ZSA9IGxvY2FsRmlsZS5jYW5Xcml0ZSgpOwotCQlib29sZWFuIGV4ZWN1dGUgPSBmaWxlSW5mby5nZXRBdHRyaWJ1dGUoRUZTLkFUVFJJQlVURV9FWEVDVVRBQkxFKTsKLQkJCi0JCWlmIChydWxlLmlzQXNSZWFkT25seSgpKSB7Ci0JCQl3cml0ZSA9IGZhbHNlOwotCQl9Ci0JCWlmIChydWxlLmlzQXNFeGVjdXRhYmxlKCkpIHsKLQkJCWV4ZWN1dGUgPSB0cnVlOwotCQl9Ci0JCQotCQlyZW1vdGVGaWxlLnNldEV4ZWN1dGFibGUoZXhlY3V0ZSk7Ci0JCXJlbW90ZUZpbGUuc2V0V3JpdGVhYmxlKHdyaXRlKTsKLQkJcmVtb3RlRmlsZS5zZXRSZWFkYWJsZShyZWFkKTsKLQkJCi0JCS8qCi0JCSAqIFNldCBkYXRlL3RpbWUsIGlmIHJlcXVpcmVkCi0JCSAqLwotCQlpZiAocnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpIHsKLQkJCWxvbmcgdGltZXN0YW1wID0gbG9jYWxGaWxlLmxhc3RNb2RpZmllZCgpOwotCQkJcmVtb3RlRmlsZS5zZXRNb2RpZmljYXRpb25UaW1lKHRpbWVzdGFtcCk7Ci0JCX0KLQotCQkvKgotCQkgKiBDb21taXQgY2hhbmdlcwotCQkgKi8KLQkJdHJ5IHsKLQkJCXJlbW90ZUZpbGUuY29tbWl0QXR0cmlidXRlcygpOwotCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ291bGQgbm90IHdyaXRlIHByb3BlcnRpZXMgZm9yIHVwbG9hZGVkIGZpbGU6IHswfSIsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvRGlyZWN0b3J5VXBsb2FkKEZpbGUgbG9jYWxEaXIsIElQYXRoIHJlbW90ZVBhdGgpIHRocm93cyBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uLCBDYW5jZWxFeGNlcHRpb24gewotCQlpZiAoISBsb2NhbERpci5leGlzdHMoKSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgSWdub3JpbmcgezB9OiBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgbG9jYWxseSIsIGxvY2FsRGlyLnRvU3RyaW5nKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFzc2VydC5pc1RydWUobG9jYWxEaXIuaXNEaXJlY3RvcnkoKSwgImxvY2FsRmlsZS5pc0RpcmVjdG9yeSgpIik7Ci0JCUFzc2VydC5pc1RydWUobG9jYWxEaXIuaXNBYnNvbHV0ZSgpLCAibG9jYWxGaWxlLmlzQWJzb2x1dGUoKSIpOwotCQlBc3NlcnQuaXNUcnVlKHJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpLCAicmVtb3RlUGF0aC5pc0Fic29sdXRlKCkiKTsKLQotCQlJUmVtb3RlRmlsZVRvb2xzIGZpbGVUb29scyA9IG1hbmFnZXIuZ2V0UmVtb3RlRmlsZVRvb2xzKCk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgcmVtb3RlIGRpcmVjdG9yeSBpZiBub3QgYWxyZWFkeSBleGlzdHMuCi0JCSAqLwotCQl0cnkgewotCQkJZmlsZVRvb2xzLmFzc3VyZURpcmVjdG9yeShMaW51eFBhdGgudG9TdHJpbmcocmVtb3RlUGF0aCkpOwotCQl9IGNhdGNoIChSZW1vdGVPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXJyb3JXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ291bGQgbm90IGNyZWF0ZSByZW1vdGUgZGlyZWN0b3J5OiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCS8qCi0JCSAqIEZldGNoIHByb3BlcnRpZXMgb2YgZGlyZWN0b3J5IHRoYXQgd2FzIGp1c3QgdXBsb2FkZWQuCi0JCSAqLwotCQlJUmVtb3RlRGlyZWN0b3J5IHJlbW90ZURpcmVjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZW1vdGVEaXJlY3RvcnkgPSBmaWxlVG9vbHMuZ2V0RGlyZWN0b3J5KExpbnV4UGF0aC50b1N0cmluZyhyZW1vdGVQYXRoKSk7Ci0JCX0gY2F0Y2ggKFJlbW90ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllcnJvcldyaXRlci5wcmludGxuKE5MUy5iaW5kKCIgICBDb3VsZCBub3QgZmV0Y2ggcHJvcGVydGllcyBmb3IgY3JlYXRlZCByZW1vdGUgZGlyZWN0b3J5OiB7MH0iLCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvKgotCQkgKiBTZXQgZmlsZSBwZXJtaXNzaW9ucy4KLQkJICovCi0JCWJvb2xlYW4gcmVhZCA9IGxvY2FsRGlyLmNhblJlYWQoKTsKLQkJYm9vbGVhbiB3cml0ZSA9IGxvY2FsRGlyLmNhbldyaXRlKCk7Ci0JCWJvb2xlYW4gZXhlY3V0ZSA9IHRydWU7Ci0JCQotCQlpZiAocnVsZS5pc0FzUmVhZE9ubHkoKSkgewotCQkJd3JpdGUgPSBmYWxzZTsKLQkJfQotCQkKLQkJcmVtb3RlRGlyZWN0b3J5LnNldEFjY2Vzc2libGUoZXhlY3V0ZSk7Ci0JCXJlbW90ZURpcmVjdG9yeS5zZXRXcml0ZWFibGUod3JpdGUpOwotCQlyZW1vdGVEaXJlY3Rvcnkuc2V0UmVhZGFibGUocmVhZCk7Ci0JCQotCQkvKgotCQkgKiBTZXQgZGF0ZS90aW1lLCBpZiByZXF1aXJlZAotCQkgKi8KLQkJaWYgKHJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpKSB7Ci0JCQlsb25nIHRpbWVzdGFtcCA9IGxvY2FsRGlyLmxhc3RNb2RpZmllZCgpOwotCQkJcmVtb3RlRGlyZWN0b3J5LnNldE1vZGlmaWNhdGlvblRpbWUodGltZXN0YW1wKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbW1pdCBjaGFuZ2VzCi0JCSAqLwotCQl0cnkgewotCQkJcmVtb3RlRGlyZWN0b3J5LmNvbW1pdEF0dHJpYnV0ZXMoKTsKLQkJfSBjYXRjaCAoUmVtb3RlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCB3cml0ZSBwcm9wZXJ0aWVzIGZvciB1cGxvYWRlZCBkaXJlY3Rvcnk6IHswfSIsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHVwbG9hZERpcmVjdG9yeShGaWxlIGxvY2FsRGlyLCBJUGF0aCByZW1vdGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQ2FuY2VsRXhjZXB0aW9uLCBSZW1vdGVDb25uZWN0aW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsb2NhbERpci5pc0Fic29sdXRlKCksICJsb2NhbERpci5pc0Fic29sdXRlKCkiKTsKLQkJQXNzZXJ0LmlzVHJ1ZShyZW1vdGVQYXRoLmlzQWJzb2x1dGUoKSwgInJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpIik7Ci0KLQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvcHlpbmcgY29udGVudHMgb2YgZGlyZWN0b3J5IHswfSAobG9jYWwpIiwgbG9jYWxEaXIudG9TdHJpbmcoKSkpOwotCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgaW50byBkaXJlY3RvcnkgezB9IChyZW1vdGUpIiwgTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpKSk7Ci0KLQkJRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbnVsbDsKLQkJZW51bWVyYXRpb24gPSBuZXcgRmlsZVJlY3Vyc2l2ZUVudW1lcmF0aW9uKGxvY2FsRGlyKTsKLQkJCi0JCUlQYXRoIHJvb3RQYXRoID0gbmV3IFBhdGgobG9jYWxEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlpbnQgcm9vdFBhdGhMZW5ndGggPSByb290UGF0aC5zZWdtZW50Q291bnQoKTsKLQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUV4Y2VwdGlvbnMoKSkgewotCQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCByZWFkIGZpbGUvZGlyZWN0b3J5OiB7MH0iLCBlbnVtZXJhdGlvbi5uZXh0RXhjZXB0aW9uKCkpKTsJCi0JCQl9Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlJUGF0aCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHJvb3RQYXRoTGVuZ3RoKTsKLQkJCUlQYXRoIHJlbW90ZUZpbGVQYXRoID0gcmVtb3RlUGF0aC5hcHBlbmQocmVsYXRpdmVQYXRoKTsKLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlvdXRwdXRXcml0ZXIucHJpbnRsbihOTFMuYmluZCgiICAgQ3JlYXRlIHJlbW90ZSBkaXJlY3RvcnkgezB9IiwgTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZUZpbGVQYXRoKSkpOwotCQkJCWRvRGlyZWN0b3J5VXBsb2FkKGZpbGUsIHJlbW90ZUZpbGVQYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0V3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIFVwbG9hZCB7MH0iLCBMaW51eFBhdGgudG9TdHJpbmcocmVsYXRpdmVQYXRoKSkpOwotCQkJCWRvRmlsZVVwbG9hZChmaWxlLCByZW1vdGVGaWxlUGF0aCk7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFeGNlcHRpb25zKCkpIHsKLQkJCWVycm9yV3JpdGVyLnByaW50bG4oTkxTLmJpbmQoIiAgIENvdWxkIG5vdCByZWFkIGZpbGUvZGlyZWN0b3J5OiB7MH0iLCBlbnVtZXJhdGlvbi5uZXh0RXhjZXB0aW9uKCkpKTsJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9OdWxsTGF1bmNoT2JzZXJ2ZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL2ludGVncmF0aW9uL051bGxMYXVuY2hPYnNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmY2MDhmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL2ludGVncmF0aW9uL051bGxMYXVuY2hPYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuY29yZS5JTGF1bmNoT2JzZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuTnVsbExhdW5jaEludGVncmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgTnVsbExhdW5jaE9ic2VydmVyIGV4dGVuZHMgTnVsbExhdW5jaEludGVncmF0aW9uIGltcGxlbWVudHMgSUxhdW5jaE9ic2VydmVyIHsKLQlwdWJsaWMgdm9pZCByZWNlaXZlT3V0cHV0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvbWFjcm9zL0xhdW5jaE1hY3JvU3VwcGxpZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL21hY3Jvcy9MYXVuY2hNYWNyb1N1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNmM2NTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvbWFjcm9zL0xhdW5jaE1hY3JvU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLm1hY3JvczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5jZHR2YXJpYWJsZXMuSUNkdFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmNkdHZhcmlhYmxlcy5Db3JlTWFjcm9TdXBwbGllckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5tYWNyb3MuSUxhdW5jaENvbmZpZ3VyYXRpb25WYXJpYWJsZVN1cHBsaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5tYWNyb3MuSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUuZXh0ZW5zaW9ucG9pbnRzLklQcm9jZXNzTWVtYmVyVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudXRpbHMuY29yZS5leHRlbnNpb25wb2ludHMuUHJvY2Vzc0V4dGVuc2lvbnM7Ci0KLS8qKgotICogQGF1dGhvciBsYWdnYXJjaWEKLSAqIEBzaW5jZSAzLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoTWFjcm9TdXBwbGllciBleHRlbmRzIENvcmVNYWNyb1N1cHBsaWVyQmFzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfTEFVTkNIX0NPTkZJR1VSQVRJT05fTUFDUk9fU1VQUExJRVIgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmxhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTGF1bmNoTWFjcm9TdXBwbGllciBpbnN0YW5jZTsKLQotCXByaXZhdGUgZmluYWwgTWFwIGF1eGlsaWFyeVN1cHBsaWVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1RZUEVfSUQgPSAiY29uZmlnVHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBMYXVuY2hNYWNyb1N1cHBsaWVyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoTWFjcm9TdXBwbGllciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IExhdW5jaE1hY3JvU3VwcGxpZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIubWFjcm9zLklCdWlsZE1hY3JvU3VwcGxpZXIjZ2V0TWFjcm8oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUNkdFZhcmlhYmxlIGdldE1hY3JvKFN0cmluZyBtYWNyb05hbWUsIGludCBjb250ZXh0VHlwZSwKLQkJCU9iamVjdCBjb250ZXh0RGF0YSkgewotCQlzd2l0Y2ggKGNvbnRleHRUeXBlKSB7Ci0JCWNhc2UgSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm8uQ09OVEVYVF9MQVVOQ0g6Ci0JCQlpZiAoY29udGV4dERhdGEgaW5zdGFuY2VvZiBJTGF1bmNoQ29uZmlndXJhdGlvbikgewotCQkJCWxvYWRMYXVuY2hDb25maWd1cmF0aW9uTWFjcm9TdXBwbGllcnMoKTsKLQkJCQl0cnkgewotCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoQ29uZmlndXJhdGlvblR5cGUgPSAoKElMYXVuY2hDb25maWd1cmF0aW9uKSBjb250ZXh0RGF0YSkKLQkJCQkJCQkuZ2V0VHlwZSgpOwotCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvblZhcmlhYmxlU3VwcGxpZXIgbGF1bmNoQ29uZmlndXJhdGlvbk1hY3JvU3VwcGxpZXIgPSAoSUxhdW5jaENvbmZpZ3VyYXRpb25WYXJpYWJsZVN1cHBsaWVyKSB0aGlzLmF1eGlsaWFyeVN1cHBsaWVycwotCQkJCQkJCS5nZXQobGF1bmNoQ29uZmlndXJhdGlvblR5cGUuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyLmdldFZhcmlhYmxlKAotCQkJCQkJCW1hY3JvTmFtZSwgKElMYXVuY2hDb25maWd1cmF0aW9uKSBjb250ZXh0RGF0YSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIubWFjcm9zLklCdWlsZE1hY3JvU3VwcGxpZXIjZ2V0TWFjcm9zKGludCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElDZHRWYXJpYWJsZVtdIGdldE1hY3JvcyhpbnQgY29udGV4dFR5cGUsIE9iamVjdCBjb250ZXh0RGF0YSkgewotCQlzd2l0Y2ggKGNvbnRleHRUeXBlKSB7Ci0JCWNhc2UgSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm8uQ09OVEVYVF9MQVVOQ0g6Ci0JCQlpZiAoY29udGV4dERhdGEgaW5zdGFuY2VvZiBJTGF1bmNoQ29uZmlndXJhdGlvbikgewotCQkJCWxvYWRMYXVuY2hDb25maWd1cmF0aW9uTWFjcm9TdXBwbGllcnMoKTsKLQkJCQl0cnkgewotCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoQ29uZmlndXJhdGlvblR5cGUgPSAoKElMYXVuY2hDb25maWd1cmF0aW9uKSBjb250ZXh0RGF0YSkKLQkJCQkJCQkuZ2V0VHlwZSgpOwotCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvblZhcmlhYmxlU3VwcGxpZXIgbGF1bmNoQ29uZmlndXJhdGlvbk1hY3JvU3VwcGxpZXIgPSAoSUxhdW5jaENvbmZpZ3VyYXRpb25WYXJpYWJsZVN1cHBsaWVyKSB0aGlzLmF1eGlsaWFyeVN1cHBsaWVycwotCQkJCQkJCS5nZXQobGF1bmNoQ29uZmlndXJhdGlvblR5cGUuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZ3VyYXRpb25NYWNyb1N1cHBsaWVyCi0JCQkJCQkJLmdldFZhcmlhYmxlcygoSUxhdW5jaENvbmZpZ3VyYXRpb24pIGNvbnRleHREYXRhKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXVuY2hDb25maWd1cmF0aW9uTWFjcm9TdXBwbGllcnMoKSB7Ci0JCWlmICh0aGlzLmF1eGlsaWFyeVN1cHBsaWVycy5pc0VtcHR5KCkpIHsKLQkJCVByb2Nlc3NFeHRlbnNpb25zLnByb2Nlc3MoRVhUX0xBVU5DSF9DT05GSUdVUkFUSU9OX01BQ1JPX1NVUFBMSUVSLAotCQkJCQluZXcgSVByb2Nlc3NNZW1iZXJWaXNpdG9yKCkgewotCQkJCQkJcHVibGljIE9iamVjdCBwcm9jZXNzKElFeHRlbnNpb24gZXh0ZW5zaW9uLAotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVtYmVyKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJTGF1bmNoTWFjcm9TdXBwbGllci50aGlzLmF1eGlsaWFyeVN1cHBsaWVycwotCQkJCQkJCQkJCS5wdXQoCi0JCQkJCQkJCQkJCQltZW1iZXIKLQkJCQkJCQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDT05GSUdfVFlQRV9JRCksCi0JCQkJCQkJCQkJCQltZW1iZXIKLQkJCQkJCQkJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1MpKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL21hY3Jvcy9MYXVuY2hWYXJpYWJsZUNvbnRleHRJbmZvLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9tYWNyb3MvTGF1bmNoVmFyaWFibGVDb250ZXh0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODViZTEyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL21hY3Jvcy9MYXVuY2hWYXJpYWJsZUNvbnRleHRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLm1hY3JvczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51dGlscy5jZHR2YXJpYWJsZXMuSUNkdFZhcmlhYmxlU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnV0aWxzLmNkdHZhcmlhYmxlcy5JVmFyaWFibGVDb250ZXh0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5tYWNyb3MuSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm87Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGxhZ2dhcmNpYQotICogQHNpbmNlIDMuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hWYXJpYWJsZUNvbnRleHRJbmZvIGltcGxlbWVudHMgSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm8gewotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXByaXZhdGUgT2JqZWN0IGRhdGE7Ci0KLQlwdWJsaWMgTGF1bmNoVmFyaWFibGVDb250ZXh0SW5mbyhpbnQgdHlwZSwgT2JqZWN0IGRhdGEpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5pbnRlcm5hbC5tYWNyb3MuSU1hY3JvQ29udGV4dEluZm8jZ2V0Q29udGV4dERhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dERhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuaW50ZXJuYWwubWFjcm9zLklNYWNyb0NvbnRleHRJbmZvI2dldENvbnRleHRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRleHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmludGVybmFsLm1hY3Jvcy5JTWFjcm9Db250ZXh0SW5mbyNnZXROZXh0KCkKLQkgKi8KLQlwdWJsaWMgSVZhcmlhYmxlQ29udGV4dEluZm8gZ2V0TmV4dCgpIHsKLQkJc3dpdGNoICh0aGlzLnR5cGUpIHsKLQkJY2FzZSBDT05URVhUX0xBVU5DSDoKLQkJCWlmICh0aGlzLmRhdGEgaW5zdGFuY2VvZiBJTGF1bmNoQ29uZmlndXJhdGlvbikgewotCQkJCUlXb3Jrc3BhY2Ugd3NwID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCWlmICh3c3AgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbmV3IExhdW5jaFZhcmlhYmxlQ29udGV4dEluZm8oQ09OVEVYVF9XT1JLU1BBQ0UsIHdzcCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQ09OVEVYVF9XT1JLU1BBQ0U6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5pbnRlcm5hbC5tYWNyb3MuSU1hY3JvQ29udGV4dEluZm8jZ2V0U3VwcGxpZXJzKCkKLQkgKi8KLQlwdWJsaWMgSUNkdFZhcmlhYmxlU3VwcGxpZXJbXSBnZXRTdXBwbGllcnMoKSB7Ci0JCXN3aXRjaCAodGhpcy50eXBlKSB7Ci0JCWNhc2UgQ09OVEVYVF9MQVVOQ0g6Ci0JCQlpZiAodGhpcy5kYXRhIGluc3RhbmNlb2YgSUxhdW5jaENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gbmV3IElDZHRWYXJpYWJsZVN1cHBsaWVyW10geyBMYXVuY2hWYXJpYWJsZU1hbmFnZXIubGF1bmNoTWFjcm9TdXBwbGllciB9OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQ09OVEVYVF9XT1JLU1BBQ0U6Ci0JCQlpZiAodGhpcy5kYXRhIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkgewotCQkJCXJldHVybiBuZXcgSUNkdFZhcmlhYmxlU3VwcGxpZXJbXSB7IExhdW5jaFZhcmlhYmxlTWFuYWdlci5lY2xpcHNlVmFyaWFibGVzTWFjcm9TdXBwbGllciB9OwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9tYWNyb3MvTGF1bmNoVmFyaWFibGVNYW5hZ2VyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9tYWNyb3MvTGF1bmNoVmFyaWFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyMjU4ZDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvbWFjcm9zL0xhdW5jaFZhcmlhYmxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5tYWNyb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5jZHR2YXJpYWJsZXMuQ2R0VmFyaWFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuY2R0dmFyaWFibGVzLkNvcmVWYXJpYWJsZVN1YnN0aXR1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLmNkdHZhcmlhYmxlcy5FY2xpcHNlVmFyaWFibGVzVmFyaWFibGVTdXBwbGllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudXRpbHMuY2R0dmFyaWFibGVzLkNkdFZhcmlhYmxlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LnV0aWxzLmNkdHZhcmlhYmxlcy5JVmFyaWFibGVDb250ZXh0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudXRpbHMuY2R0dmFyaWFibGVzLklWYXJpYWJsZVN1YnN0aXR1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5tYWNyb3MuSUxhdW5jaFZhcmlhYmxlTWFuYWdlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0bwotICogb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuY2R0dmFyaWFibGVzLkNkdFZhcmlhYmxlTWFuYWdlcgotICogCi0gKiBAYXV0aG9yIGxhZ2dhcmNpYQotICogQHNpbmNlIDMuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hWYXJpYWJsZU1hbmFnZXIgaW1wbGVtZW50cyBJTGF1bmNoVmFyaWFibGVNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIExhdW5jaFZhcmlhYmxlTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoTWFjcm9TdXBwbGllciBsYXVuY2hNYWNyb1N1cHBsaWVyID0gTGF1bmNoTWFjcm9TdXBwbGllcgotCQkJLmdldEluc3RhbmNlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VWYXJpYWJsZXNWYXJpYWJsZVN1cHBsaWVyIGVjbGlwc2VWYXJpYWJsZXNNYWNyb1N1cHBsaWVyID0gRWNsaXBzZVZhcmlhYmxlc1ZhcmlhYmxlU3VwcGxpZXIKLQkJCS5nZXRJbnN0YW5jZSgpOwotCi0JcHVibGljIExhdW5jaFZhcmlhYmxlTWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhdW5jaFZhcmlhYmxlTWFuYWdlciBnZXREZWZhdWx0KCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IExhdW5jaFZhcmlhYmxlTWFuYWdlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgbm9uZXhpc3RlbnRNYWNyb3NWYWx1ZSwKLQkJCVN0cmluZyBsaXN0RGVsaW1pdGVyLCBpbnQgY29udGV4dFR5cGUsIE9iamVjdCBjb250ZXh0RGF0YSkKLQkJCXRocm93cyBDZHRWYXJpYWJsZUV4Y2VwdGlvbiB7Ci0KLQkJSVZhcmlhYmxlQ29udGV4dEluZm8gaW5mbyA9IGdldE1hY3JvQ29udGV4dEluZm8oY29udGV4dFR5cGUsIGNvbnRleHREYXRhKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCXJldHVybiBDZHRWYXJpYWJsZVJlc29sdmVyLnJlc29sdmVUb1N0cmluZyh2YWx1ZSwgZ2V0TWFjcm9TdWJzdGl0dXRvcigKLQkJCQkJaW5mbywgbm9uZXhpc3RlbnRNYWNyb3NWYWx1ZSwgbGlzdERlbGltaXRlcikpOwotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBJVmFyaWFibGVDb250ZXh0SW5mbyBnZXRNYWNyb0NvbnRleHRJbmZvKGludCBjb250ZXh0VHlwZSwKLQkJCU9iamVjdCBjb250ZXh0RGF0YSkgewotCQlMYXVuY2hWYXJpYWJsZUNvbnRleHRJbmZvIGluZm8gPSBuZXcgTGF1bmNoVmFyaWFibGVDb250ZXh0SW5mbyhjb250ZXh0VHlwZSwKLQkJCQljb250ZXh0RGF0YSk7Ci0JCWlmIChpbmZvLmdldFN1cHBsaWVycygpICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mbzsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElWYXJpYWJsZVN1YnN0aXR1dG9yIGdldE1hY3JvU3Vic3RpdHV0b3IoSVZhcmlhYmxlQ29udGV4dEluZm8gaW5mbywKLQkJCVN0cmluZyBpbmV4aXN0ZW50TWFjcm9WYWx1ZSwgU3RyaW5nIGxpc3REZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb3JlVmFyaWFibGVTdWJzdGl0dXRvcihpbmZvLCBpbmV4aXN0ZW50TWFjcm9WYWx1ZSwKLQkJCQlsaXN0RGVsaW1pdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDg4M2FjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1JlcXVlc3RUb0NhbmNlbExhdW5jaD1SZXF1ZXN0ZWQgdG8gY2FuY2VsIHRoaXMgbGF1bmNoLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9Ob3RSZXF1aXJlZD0qIExhdW5jaCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHJlcXVpcmUgY3JlYXRpbmcgcmVtb3RlIGRpcmVjdG9yeS4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9UaXRsZT0qIFN5bmNocm9uaXplIGJlZm9yZSBsYXVuY2g6Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZEFwcGxpY2F0aW9uX1RpdGxlPSogVXBsb2FkIGFwcGxpY2F0aW9uIGV4ZWN1dGFibGUgZmlsZS4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfVGl0bGU9KiBDcmVhdGluZyByZW1vdGUgd29ya2luZyBkaXJlY3Rvcnk6IHswfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19QcmVwYXJlV29ya2luZ0Rpcl9GYWlsZWRDcmVhdGU9XCBcIFwgRmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgd29ya2luZyBkaXJlY3Rvcnk6IHswfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X05vUnVsZXM9XCBcIFwgTm8gcnVsZXMgd2VyZSBzcGVjaWZpZWQgZm9yIHRoaXMgbGF1bmNoLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRBcHBsaWNhdGlvbl9UaXRsZU5vVXBsb2FkPSogTGF1bmNoIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgcmVxdWlyZSB1cGxvYWRpbmcgdGhlIGV4ZWN1dGFibGUgZmlsZS4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkQXBwbGljYXRpb25fVXBsb2FkTWVzc2FnZT1cIFwgXCBVcGxvYWQgZXhlY3V0YWJsZSB7MH1cbiAgIHRvIHsxfSAocmVtb3RlKQotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRBcHBsaWNhdGlvbl9GYWlsZWRVcGxvYWQ9XCBcIFwgVXBsb2FkIGZhaWxlZDogezB9Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX1ByZXBhcmVXb3JraW5nRGlyX0ZhaWxlZENyZWF0ZUhpbnQ9XCBcIFwgQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBvciBpcyBvd25lZCBieSBhbm90aGVyIHVzZXIuCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfRmFpbGVkUnVsZT1cIFwgXCBSdWxlIHswfSBmYWlsZWQ6IHsxfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRBcHBsaWNhdGlvbl9Db21wbGV0ZWRVcGxvYWQ9XCBcIFwgVXBsb2FkIGNvbXBsZXRlZC4KLVJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkPUNvdWxkIG5vdCBwcmVwYXJlIHdvcmtpbmcgZGlyZWN0b3J5LgotUmVtb3RlTGF1bmNoUHJvY2Vzc19BbGxfRmFpbGVkQ29ubmVjdGlvbj1Db25uZWN0aW9uIHRvIGhvc3QgZmFpbGVkLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19GYWlsZWQ9Q291bGQgbm90IHVwbG9hZCBleGVjdXRhYmxlIGZpbGUuCi1SZW1vdGVMYXVuY2hQcm9jZXNzX0ZhaWxlZFBlcm1pc3Npb25zPVwgXCBcIEZhaWxlZCB0byBzZXQgcGVybWlzc2lvbnMgb24gZXhlY3V0YWJsZSBmaWxlOiB7MH0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfUHJlcGFyZVdvcmtpbmdEaXJfRmFpbGVkUGVybWlzc2lvbnM9XCBcIFwgRmFpbGVkIHRvIHNldCBwZXJtaXNzaW9ucyBvbiByZW1vdGUgd29ya2luZyBkaXJlY3Rvcnk6IHswfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19VcGxvYWRXb3JraW5nRGlyZWN0b3J5X1RpdGxlVXBsb2FkRGlzYWJsZWQ9KiBMYXVuY2ggY29uZmlndXJhdGlvbiBkb2VzIG5vdCByZXF1aXJlIHN5bmNocm9uaXplIGJlZm9yZSBsYXVuY2guCi1SZW1vdGVMYXVuY2hQcm9jZXNzX1VwbG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW5hY3RpdmU9XCBcIFwgSWdub3JpbmcgaW5hY3RpdmUgcnVsZSB7MH0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfVXBsb2FkV29ya2luZ0RpcmVjdG9yeV9JZ25vcmVJbnZhbGlkPVwgXCBcIElnbm9yaW5nIHJ1bGUgezB9OiB7MX0KLVJlbW90ZUxhdW5jaFByb2Nlc3NfRG93bmxvYWRXb3JraW5nRGlyZWN0b3J5X1RpdGxlRG93bmxvYWREaXNhYmxlZD0qIExhdW5jaCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHJlcXVpcmUgc3luY2hyb25pemUgYWZ0ZXIgbGF1bmNoLgotUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfVGl0bGU9KiBTeW5jaHJvbml6ZSBhZnRlciBsYXVuY2g6Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9JZ25vcmVJbmFjdGl2ZT1cIFwgXCBJZ25vcmluZyBpbmFjdGl2ZSBydWxlIHswfQotUmVtb3RlTGF1bmNoUHJvY2Vzc19Eb3dubG9hZFdvcmtpbmdEaXJlY3RvcnlfSWdub3JlSW52YWxpZD1cIFwgXCBJZ25vcmluZyBydWxlIHswfTogezF9Ci1SZW1vdGVMYXVuY2hQcm9jZXNzX0Rvd25sb2FkV29ya2luZ0RpcmVjdG9yeV9GYWlsZWRSdWxlPVwgXCBcIFJ1bGUgezB9IGZhaWxlZDogezF9Ci1Eb3dubG9hZEJhY2tBY3Rpb25fRmFpbGVkRmV0Y2hSZW1vdGVQcm9wZXJ0aWVzPVwgXCBcIENvdWxkIG5vdCBmZXRjaCBwcm9wZXJ0aWVzIGZvciByZW1vdGUgZmlsZTogezB9Ci1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ2FsY3VsYXRlQ2xvY2tEaWZmZXJlbmNlPVwgXCBcIENvdWxkIG5vdCBjYWxjdWxhdGUgY2xvY2sgZGlmZmVyZW5jZSB3aXRoIHJlbW90ZSBob3N0OiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRDYWxjdWxhdGVDbG9ja0RpZmZlcmVuY2UyPVwgXCBcIEFzc3VtaW5nIHNhbWUgYSByZW1vdGUgY2xvY2sgc3luY2hyb25pemVkIHdpdGggbG9jYWwgY2xvY2suCi1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkQ3JlYXRlTG9jYWxEaXJlY3Rvcnk9XCBcIFwgQ2Fubm90IGNyZWF0ZSBsb2NhbCBkaXJlY3RvcnkgezB9Ci1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkTG9jYWxEaXJldG9yeUlzTm90RGlyZWN0b3J5PVwgXCBcIFBhdGggezB9IGV4aXN0cywgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeQotRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFJlbW90ZVBhdGhEb2VzTm90RXhpdD1cIFwgXCBJZ25vcmluZyB7MH06IFBhdGggZG9lcyBub3QgZXhpc3QgcmVtb3RlbHkKLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRGZXRjaFJlbW90ZUF0dHJpYnV0ZXM9XCBcIFwgQ291bGQgbm90IGZldGNoIGF0dHJpYnV0ZXMgb2YgcmVtb3RlIGZpbGUvZGlyZWN0b3J5OiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnROZXdlckZpbGVFeGlzdHNMb2NhbGx5PVwgXCBcIEEgbmV3ZXIgZmlsZSBhbHJlZHkgZXhpc3RzIGxvY2FsbHksIGlnbm9yaW5nIGl0OiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRTZXRMb2NhbEZpbGVBdHRyaWJ1dGVzPVwgXCBcIEZhaWxlZCB0byBzZXQgYXR0cmlidXRlcyBvZiBsb2NhbCBmaWxlOiB7MH0KLURvd25sb2FkUnVsZUFjdGlvbl9GYWlsZWRTZXRMb2NhbERpcmVjdG9yeUF0dHJpYnV0ZXM9XCBcIFwgRmFpbGVkIHRvIHNldCBhdHRyaWJ1dGVzIG9mIGxvY2FsIGRpcmVjdG9yeTogezB9Ci1Eb3dubG9hZEJhY2tBY3Rpb25fRmFpbGVkRmlsZWREb2VzTm90RXhpc3Q9XCBcIFwgUmVtb3RlIGZpbGUgZG9lcyBub3QgZXhpc3QgYW55bW9yZTogezB9Ci1Eb3dubG9hZFJ1bGVBY3Rpb25fTm90aWZ5RGlyZWN0b3J5RG93bmxvYWQxPVwgXCBcIENvcHlpbmcgY29udGVudHMgb2YgZGlyZWN0b3J5IHswfSAocmVtb3RlKQotRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmeURpcmVjdG9yeURvd25sb2FkMj1cIFwgXCBpbnRvIGRpcmVjdG9yeSB7MH0gKGxvY2FsKQotRG93bmxvYWRSdWxlQWN0aW9uX05vdGlmdEZpbGVFeGlzdHNMb2NhbGx5PVwgXCBcIEZpbGUgYWxyZWR5IGV4aXN0cyBsb2NhbGx5LCBpZ25vcmluZyBpdDogezB9Ci1Eb3dubG9hZEJhY2tBY3Rpb25fTm90aWZ5RmlsZU5vdENoYW5nZWQ9XCBcIFwgRmlsZSB7MH0gd2FzIG5vdCBjaGFuZ2VkIG9uIHJlbW90ZSB0YXJnZXQuCi1Eb3dubG9hZFJ1bGVBY3Rpb25fV2FybmluZ0Nsb2NrQmFja3dhcmQ9XCBcIFwgV2FybmluZ1whIENsb2NrIGF0IHJlbW90ZSB0YXJnZXQgaXMgb2xkZXIgdGhhbiBsb2NhbCBjbG9jay4gRmlsZSBzeW5jaHJvbml6YXRpb24gbWF5IG5vdCBiZSBjb3JyZWN0LgotRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZEZldGNoQXR0cmlidXRlcz1cIFwgXCBJZ25vcmluZyB7MH06IENhbm5vdCBmZXRjaCBhdHRyaWJ1dGVzCi1Eb3dubG9hZFJ1bGVBY3Rpb25fRmFpbGVkU2V0RG93bmxvYWRGaWxlPVwgXCBcIENvdWxkIG5vdCBkb3dubG9hZCBmaWxlOiB7MH0KLURvd25sb2FkQmFja0FjdGlvbl9Ob3RpZnlEb253bG9hZEJhY2s9XCBcIFwgRG93bmxvYWQgYmFjayBmaWxlIHswfS4KLURvd25sb2FkQmFja0FjdGlvbl9GYWlsZWREb3dubG9hZEJhY2s9XCBcIFwgQ291bGQgbm90IGRvd25sb2FkIGZpbGU6IHswfQotRG93bmxvYWRSdWxlQWN0aW9uX1dhcm5pbmdDbG9ja0ZvcndhcmQ9XCBcIFwgV2FybmluZ1whIENsb2NrIGF0IHJlbW90ZSB0YXJnZXQgaXMgbW9yZSByZWNlbnQgdGhhbiBsb2NhbCBjbG9jay4gRmlsZSBzeW5jaHJvbml6YXRpb24gbWF5IG5vdCBiZSBjb3JyZWN0LgotRG93bmxvYWRSdWxlQWN0aW9uX0ZhaWxlZFJlbW90ZVBhdGhOb0RpcmVjdG9yeU5vckZpbGU9XCBcIFwgSWdub3JpbmcgezB9OiBQYXRoIGlzIG5vdCBhIHJlbW90ZSBmaWxlIG5vciBkaXJlY3RvcnkKLURvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlGaWxlRG93bmxvYWQxPVwgXCBcIENvcHlpbmcgZmlsZSB7MH0gKHJlbW90ZSkKLURvd25sb2FkUnVsZUFjdGlvbl9Ob3RpZnlGaWxlRG93bmxvYWQyPVwgXCBcIHRvIGZpbGUgezB9IChsb2NhbCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL3Byb2Nlc3MvQWJzdHJhY3RQcm9jZXNzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9wcm9jZXNzL0Fic3RyYWN0UHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDM4MmU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL3Byb2Nlc3MvQWJzdHJhY3RQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWwucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotCi0vKioKLSAqIEEgcHJvY2VzcyB0aGF0IGJlaGF2ZXMgYXMgaXQgd2VyZSBhIHJlYWwgcnVubmluZyBwcm9jZXNzLgotICogPHA+Ci0gKiBVc2VkIHRvIHRlc3QgYW5kIHVuZGVyc3RhbmQgRWNsaXBzZSBEZWJ1Z2dlciBhbmQgTGF1bmNoIGZhY2lsaXRpZXMuCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2VzcyBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSVByb2Nlc3MgewotCQotCXByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBNZXNzYWdlcy5BYnN0cmFjdFByb2Nlc3NfRGVmYXVsdExhYmVsOwotCXN0YXRpYyBpbnQgY291bnRlcjsKLQkKLQkvKioKLQkgKiBUaGUgbGF1bmNoIHRoaXMgcHJvY2VzcyBpcyBjb250YWluZWQgaW4KLQkgKi8KLQlwcm90ZWN0ZWQgSUxhdW5jaCBsYXVuY2g7Ci0JCi0JLyoqCi0JICogVGFibGUgb2YgY2xpZW50IGRlZmluZWQgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCBNYXAgYXR0cmlidXRlczsKLQkJCi0JLyoqCi0JICogV2hldGhlciBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBzaG91bGQgYmUgY2FwdHVyZWQgb3Igc3dhbGxvd2VkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FwdHVyZU91dHB1dCA9IHRydWU7Ci0JCi0JcHVibGljIEFic3RyYWN0UHJvY2VzcyhJTGF1bmNoIGxhdW5jaCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGF1bmNoID0gbGF1bmNoOwotCQkKLQkJaWYgKGxhYmVsID09IG51bGwpIHsKLQkJCWNvdW50ZXIrKzsKLQkJCXRoaXMubGFiZWwgPSAiYm9ndXMgIitJbnRlZ2VyLnRvU3RyaW5nKGNvdW50ZXIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQkJCi0JCVN0cmluZyBjYXB0dXJlT3V0cHV0VmFsdWUgPSBsYXVuY2guZ2V0QXR0cmlidXRlKERlYnVnUGx1Z2luLkFUVFJfQ0FQVFVSRV9PVVRQVVQpOwotCQljYXB0dXJlT3V0cHV0ID0gISgiZmFsc2UiLmVxdWFscyhjYXB0dXJlT3V0cHV0VmFsdWUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJbGF1bmNoLmFkZFByb2Nlc3ModGhpcyk7Ci0JCWZpcmVDcmVhdGlvbkV2ZW50KCk7Ci0JCWZpcmVDaGFuZ2VFdmVudCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQlyZXR1cm4gbGF1bmNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDUpOwotCQl9Ci0JCU9iamVjdCBvcmlnVmFsID0gYXR0cmlidXRlcy5nZXQoa2V5KTsKLQkJaWYgKG9yaWdWYWwgIT0gbnVsbCAmJiBvcmlnVmFsLmVxdWFscyh2YWx1ZSkpIHsKLQkJCXJldHVybjsgLy9ub3RoaW5nIGNoYW5nZWQuCi0JCX0KLQkJCi0JCWF0dHJpYnV0ZXMucHV0KGtleSwgdmFsdWUpOwotCQlmaXJlQ2hhbmdlRXZlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcga2V5KSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nKWF0dHJpYnV0ZXMuZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIENvcHkgdGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBwcm9jZXNzIHRvIHRob3NlIGluIHRoZSBnaXZlbiBtYXAuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgYXR0cmlidXRlIG1hcCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgY29weUF0dHJpYnV0ZXMoTWFwIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3Iga2V5cyA9IGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dCgpOwotCQkJCXNldEF0dHJpYnV0ZShrZXksIChTdHJpbmcpYXR0cmlidXRlcy5nZXQoa2V5KSk7Ci0JCQl9CQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElQcm9jZXNzLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElEZWJ1Z1RhcmdldC5jbGFzcykpIHsKLQkJCUlMYXVuY2ggbGF1bmNoID0gZ2V0TGF1bmNoKCk7Ci0JCQlJRGVidWdUYXJnZXRbXSB0YXJnZXRzID0gbGF1bmNoLmdldERlYnVnVGFyZ2V0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHRoaXMuZXF1YWxzKHRhcmdldHNbaV0uZ2V0UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gdGFyZ2V0c1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhIGNyZWF0aW9uIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVDcmVhdGlvbkV2ZW50KCkgewotCQlmaXJlRXZlbnQobmV3IERlYnVnRXZlbnQodGhpcywgRGVidWdFdmVudC5DUkVBVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyB0aGUgZ2l2ZW4gZGVidWcgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IGRlYnVnIGV2ZW50IHRvIGZpcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoRGVidWdFdmVudCBldmVudCkgewotCQlEZWJ1Z1BsdWdpbiBtYW5hZ2VyPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuZmlyZURlYnVnRXZlbnRTZXQobmV3IERlYnVnRXZlbnRbXXtldmVudH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlyZXMgYSB0ZXJtaW5hdGUgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRlcm1pbmF0ZUV2ZW50KCkgewotCQlmaXJlRXZlbnQobmV3IERlYnVnRXZlbnQodGhpcywgRGVidWdFdmVudC5URVJNSU5BVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhIGNoYW5nZSBldmVudC4KLQkgKi8JCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNoYW5nZUV2ZW50KCkgewotCQlmaXJlRXZlbnQobmV3IERlYnVnRXZlbnQodGhpcywgRGVidWdFdmVudC5DSEFOR0UpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9wcm9jZXNzL0V4ZWN1dGlvblN0cmVhbXNQcm94eS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9FeGVjdXRpb25TdHJlYW1zUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEzZmZlNS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9wcm9jZXNzL0V4ZWN1dGlvblN0cmVhbXNQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWwucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbXNQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHkyOwotCi1jbGFzcyBFeGVjdXRpb25TdHJlYW1zUHJveHkgaW1wbGVtZW50cyBJU3RyZWFtc1Byb3h5LCBJU3RyZWFtc1Byb3h5MiB7Ci0JZmluYWwgSVN0cmVhbU1vbml0b3IgZXJyb3JTdHJlYW1Nb25pdG9yOwotCWZpbmFsIElTdHJlYW1Nb25pdG9yIG91dHB1dFN0cmVhbU1vbml0b3I7Ci0JCi0JcHVibGljIEV4ZWN1dGlvblN0cmVhbXNQcm94eShmaW5hbCBJU3RyZWFtTW9uaXRvciBlcnJvclN0cmVhbU1vbml0b3IsIGZpbmFsIElTdHJlYW1Nb25pdG9yIG91dHB1dFN0cmVhbU1vbml0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lcnJvclN0cmVhbU1vbml0b3IgPSBlcnJvclN0cmVhbU1vbml0b3I7Ci0JCXRoaXMub3V0cHV0U3RyZWFtTW9uaXRvciA9IG91dHB1dFN0cmVhbU1vbml0b3I7Ci0JfQotCi0JcHVibGljIElTdHJlYW1Nb25pdG9yIGdldEVycm9yU3RyZWFtTW9uaXRvcigpIHsKLQkJcmV0dXJuIGVycm9yU3RyZWFtTW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cmVhbU1vbml0b3IgZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpIHsKLQkJcmV0dXJuIG91dHB1dFN0cmVhbU1vbml0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBJZ25vcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0byBUYXJnZXRQcm9jZXNzCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIElnbm9yZSB1bnRpbCBkZWNpZGluZyBob3cgdG8gaGFuZGxlIGNsb3NlCi0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9NZXNzYWdlcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzQ1NjZkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL3Byb2Nlc3MvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuaW50ZXJuYWwucHJvY2Vzcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UHJvY2Vzc19EZWZhdWx0TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRQcm9jZXNzX0xhYmVsOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL3Byb2Nlc3MvTW9uaXRvck91dHB1dFN0cmVhbS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9Nb25pdG9yT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczZGJkMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9Nb25pdG9yT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSVN0cmVhbUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbU1vbml0b3I7Ci0KLWNsYXNzIE1vbml0b3JPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBJU3RyZWFtTW9uaXRvciB7Ci0JcHJpdmF0ZSBTZXQgbGlzdGVuZXJzPSBuZXcgSGFzaFNldCgxKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJU3RyZWFtTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lciA9IChJU3RyZWFtTGlzdGVuZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWJ5dGUgYnl0ZXMgW10gPSBuZXcgYnl0ZVsxXTsKLQkJCWJ5dGVzWzBdID0gKGJ5dGUpYjsKLQkJCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhieXRlcyk7Ci0JCQlsaXN0ZW5lci5zdHJlYW1BcHBlbmRlZCh0ZXh0LCB0aGlzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyID0gKElTdHJlYW1MaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGIpOwotCQkJbGlzdGVuZXIuc3RyZWFtQXBwZW5kZWQodGV4dCwgdGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyID0gKElTdHJlYW1MaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGIsIG9mZiwgbGVuKTsKLQkJCWxpc3RlbmVyLnN0cmVhbUFwcGVuZGVkKHRleHQsIHRoaXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9UYXJnZXRQcm9jZXNzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9wcm9jZXNzL1RhcmdldFByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIwYmNlMC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9pbnRlcm5hbC9wcm9jZXNzL1RhcmdldFByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5pbnRlcm5hbC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSUxhdW5jaFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSUxhdW5jaFByb2dyZXNzTGlzdGVuZXI7Ci0KLQotcHVibGljIGNsYXNzIFRhcmdldFByb2Nlc3MgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3MgaW1wbGVtZW50cyBJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lciB7Ci0KLQlmaW5hbCBJTGF1bmNoUHJvY2VzcyBleGVjdXRpb25Kb2I7Ci0JYm9vbGVhbiB3YXNGaW5pc2hlZCA9IGZhbHNlOwotCQotCWZpbmFsIE1vbml0b3JPdXRwdXRTdHJlYW0gbW9uaXRvck91dHB1dFN0cmVhbSA9IG5ldyBNb25pdG9yT3V0cHV0U3RyZWFtKCk7Ci0JZmluYWwgTW9uaXRvck91dHB1dFN0cmVhbSBtb25pdG9yRXJyb3JTdHJlYW0gPSBuZXcgTW9uaXRvck91dHB1dFN0cmVhbSgpOwotCWZpbmFsIEV4ZWN1dGlvblN0cmVhbXNQcm94eSBzdHJlYW1zUHJveHkgPSBuZXcgRXhlY3V0aW9uU3RyZWFtc1Byb3h5KG1vbml0b3JFcnJvclN0cmVhbSwgbW9uaXRvck91dHB1dFN0cmVhbSk7Ci0JCi0JcHVibGljIFRhcmdldFByb2Nlc3MoSUxhdW5jaCBsYXVuY2gsIElMYXVuY2hQcm9jZXNzIGpvYikgewotCQlzdXBlcihsYXVuY2gsIE1lc3NhZ2VzLlRhcmdldFByb2Nlc3NfTGFiZWwpOwotCQl0aGlzLmV4ZWN1dGlvbkpvYiA9IGpvYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3MjZ2V0RXhpdFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzcyNnZXRTdHJlYW1zUHJveHkoKQotCSAqLwotCXB1YmxpYyBJU3RyZWFtc1Byb3h5IGdldFN0cmVhbXNQcm94eSgpIHsKLQkJcmV0dXJuIHN0cmVhbXNQcm94eTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRlcm1pbmF0ZSNjYW5UZXJtaW5hdGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpIHsKLQkJcmV0dXJuIGV4ZWN1dGlvbkpvYi5nZXRDdXJyZW50UHJvZ3Jlc3MoKSAhPSBJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5GSU5JU0hFRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRlcm1pbmF0ZSNpc1Rlcm1pbmF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLQkJcmV0dXJuIHdhc0ZpbmlzaGVkIHx8ICEgY2FuVGVybWluYXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjdGVybWluYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlleGVjdXRpb25Kb2IubWFya0FzQ2FuY2VsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIG1vbml0b3JPdXRwdXRTdHJlYW07Ci0JfQotCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpIHsKLQkJcmV0dXJuIG1vbml0b3JFcnJvclN0cmVhbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklMYXVuY2hQcm9ncmVzc0xpc3RlbmVyI25vdGlmeVByb2dyZXNzKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9ncmVzcyhpbnQgcHJvZ3Jlc3MpIHsKLQkJZmlyZUNoYW5nZUV2ZW50KCk7Ci0JCWlmIChwcm9ncmVzcyA9PSBJTGF1bmNoUHJvZ3Jlc3NMaXN0ZW5lci5GSU5JU0hFRCkgewotCQkJZmlyZVRlcm1pbmF0ZUV2ZW50KCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5jb3JlLklMYXVuY2hQcm9ncmVzc0xpc3RlbmVyI25vdGlmeUludGVycnVwdCgpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5SW50ZXJydXB0KCkgewotCQl3YXNGaW5pc2hlZCA9IHRydWU7Ci0JCWZpcmVUZXJtaW5hdGVFdmVudCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvaW50ZXJuYWwvcHJvY2Vzcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmM4NDMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL2ludGVybmFsL3Byb2Nlc3MvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRhcmdldFByb2Nlc3NfTGFiZWw9Q29ubmVjdGlvbiB0byB0YXJnZXQKLUFic3RyYWN0UHJvY2Vzc19EZWZhdWx0TGFiZWw9bm8gbGFiZWwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL21hY3Jvcy9JTGF1bmNoQ29uZmlndXJhdGlvblZhcmlhYmxlU3VwcGxpZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL21hY3Jvcy9JTGF1bmNoQ29uZmlndXJhdGlvblZhcmlhYmxlU3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjU2MDgxYi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9tYWNyb3MvSUxhdW5jaENvbmZpZ3VyYXRpb25WYXJpYWJsZVN1cHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLm1hY3JvczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmNkdHZhcmlhYmxlcy5JQ2R0VmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBsYXVuY2gtaW50ZWdyYXRvcgotICogZm9yIHN1cHBseWluZyB0aGUgY29uZmlndXJhdGlvbi1zcGVjaWZpYyBtYWNyb3MKLSAqIAotICogQGF1dGhvciBsYWdnYXJjaWEKLSAqIEBzaW5jZSAzLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXVuY2hDb25maWd1cmF0aW9uVmFyaWFibGVTdXBwbGllciB7Ci0KLQkvKioKLQkgKgotCSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIHZhcmlhYmxlIG5hbWUKLQkgKiBAcGFyYW0gbGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZSB0byB0aGUgSUNkdFZhcmlhYmxlIGludGVyZmFjZSByZXByZXNlbnRpbmcgCi0JICogdGhlIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIHRoZSB2YXJpYWJsZSBvZiB0aGF0IG5hbWUgaXMgbm90IGRlZmluZWQKLQkgKi8KLQlwdWJsaWMgSUNkdFZhcmlhYmxlIGdldFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZU5hbWUsCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uKTsKLQotCS8qKgotCSAqCi0JICogQHBhcmFtIGxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBJQ2R0VmFyaWFibGVbXSBhcnJheSByZXByZXNlbnRpbmcgZGVmaW5lZCB2YXJpYWJsZXMgCi0JICovCi0JcHVibGljIElDZHRWYXJpYWJsZVtdIGdldFZhcmlhYmxlcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvbWFjcm9zL0lMYXVuY2hWYXJpYWJsZUNvbnRleHRJbmZvLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9tYWNyb3MvSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQxOTU5Mi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9tYWNyb3MvSUxhdW5jaFZhcmlhYmxlQ29udGV4dEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIubWFjcm9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUuY2R0dmFyaWFibGVzLklDb3JlVmFyaWFibGVDb250ZXh0SW5mbzsKLQotLyoqCi0gKiBAYXV0aG9yIGxhZ2dhcmNpYQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGF1bmNoVmFyaWFibGVDb250ZXh0SW5mbyBleHRlbmRzIElDb3JlVmFyaWFibGVDb250ZXh0SW5mbyB7Ci0KLQkvLyBUaGUgY29udGV4dHMgZGVmaW5lZCBieSB0aGlzIGludGVyZmFjZSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUKLQkvLyBjb250ZXh0cyBkZWZpbmVkIGluIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5jZHQuY29yZS5jZHR2YXJpYWJsZXMuSUNvcmVWYXJpYWJsZUNvbnRleHRJbmZvCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09OVEVYVF9XT1JLU1BBQ0UgPSA1OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09OVEVYVF9MQVVOQ0ggPSA5OwotCQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvbWFjcm9zL0lMYXVuY2hWYXJpYWJsZU1hbmFnZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL21hY3Jvcy9JTGF1bmNoVmFyaWFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0YzBlOTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvbWFjcm9zL0lMYXVuY2hWYXJpYWJsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIubWFjcm9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuY2R0dmFyaWFibGVzLkNkdFZhcmlhYmxlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHNpbWlsYXIgdG8gdGhlIG9uZSBwcm92aWRlZCBieQotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5tYWNyb3MuSUJ1aWxkTWFjcm9Qcm92aWRlci4KLSAqIAotICogQGF1dGhvciBsYWdnYXJjaWEKLSAqIEBzaW5jZSAzLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXVuY2hWYXJpYWJsZU1hbmFnZXIgewotCi0JcHVibGljIFN0cmluZyByZXNvbHZlVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgbm9uZXhpc3RlbnRNYWNyb3NWYWx1ZSwKLQkJCVN0cmluZyBsaXN0RGVsaW1pdGVyLCBpbnQgY29udGV4dFR5cGUsIE9iamVjdCBjb250ZXh0RGF0YSkKLQkJCXRocm93cyBDZHRWYXJpYWJsZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvcHJlZmVyZW5jZXMvTGF1bmNoUHJlZmVyZW5jZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ByZWZlcmVuY2VzL0xhdW5jaFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3MmJjOWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvcHJlZmVyZW5jZXMvTGF1bmNoUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLlJlbW90ZUxhdW5jaGVyUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoUHJlZmVyZW5jZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIucHJlZmVyZW5jZXMtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfV09SS0lOR19ESVJFQ1RPUlkgPSBQUkVGSVggKyAid29ya2luZy1kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9XT1JLSU5HX0RJUkVDVE9SWTsKLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIucHJlZmVyZW5jZXMubGF1bmNoX3ByZWZlcmVuY2VzIiwgTGF1bmNoUHJlZmVyZW5jZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFJlbW90ZUxhdW5jaGVyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9MYXVuY2hlclByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9MYXVuY2hlclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZDMzNzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvcHJlZmVyZW5jZXMvTGF1bmNoZXJQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hlclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCXByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3Igd29ya2luZ0RpcmVjdG9yeTsKLQkKLQlwdWJsaWMgTGF1bmNoZXJQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoR1JJRCk7Ci0KLQkJc3RvcmUgPSBMYXVuY2hQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLQkJCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkxhdW5jaGVyUHJlZmVyZW5jZVBhZ2VfRGVzY3JpcHRpb24pOwotCQlzZXRUaXRsZShNZXNzYWdlcy5MYXVuY2hlclByZWZlcmVuY2VQYWdlX1RpdGxlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJd29ya2luZ0RpcmVjdG9yeSA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcihMYXVuY2hQcmVmZXJlbmNlcy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLCBNZXNzYWdlcy5MYXVuY2hlclByZWZlcmVuY2VQYWdlX1JlbW90ZVdvcmtpbmdEaXJlY3RvcnlMYWJlbCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCWFkZEZpZWxkKHdvcmtpbmdEaXJlY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTVkMzFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaGVyUHJlZmVyZW5jZVBhZ2VfRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlclByZWZlcmVuY2VQYWdlX1JlbW90ZVdvcmtpbmdEaXJlY3RvcnlMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaGVyUHJlZmVyZW5jZVBhZ2VfVGl0bGU7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDU1NWRkZS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZUluaXRpYWxpemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBSZW1vdGVMYXVuY2hlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoTGF1bmNoUHJlZmVyZW5jZXMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwgTGF1bmNoUHJlZmVyZW5jZXMuREVGQVVMVF9XT1JLSU5HX0RJUkVDVE9SWSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9sYXVuY2hfcHJlZmVyZW5jZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ByZWZlcmVuY2VzL2xhdW5jaF9wcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2Y0ODI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ByZWZlcmVuY2VzL2xhdW5jaF9wcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotREVGQVVMVF9XT1JLSU5HX0RJUkVDVE9SWT0ke3N5c3RlbV93b3Jrc3BhY2V9LyR7dXNlcl93b3Jrc3BhY2V9LyR7cHJvamVjdF9uYW1lfS8ke3RpbWVzdGFtcH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI2ZDA0My4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTGF1bmNoZXJQcmVmZXJlbmNlUGFnZV9EZXNjcmlwdGlvbj1QcmVmZXJlbmNlcyBmb3IgdGhlIExhdW5jaGVyCi1MYXVuY2hlclByZWZlcmVuY2VQYWdlX1RpdGxlPVJlbW90ZSBUb29scyBBcHBsaWNhdGlvbiBMYXVuY2hlcgotTGF1bmNoZXJQcmVmZXJlbmNlUGFnZV9SZW1vdGVXb3JraW5nRGlyZWN0b3J5TGFiZWw9UmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9Eb3dubG9hZFJ1bGVEaWFsb2cuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL0Rvd25sb2FkUnVsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDVmMzQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL0Rvd25sb2FkUnVsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5Eb3dubG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuSVN5bmNocm9uaXphdGlvblJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuT3ZlcndyaXRlUG9saWNpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5Db21ib0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQ29tYm9Nb2xkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5GcmFtZU1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci0KLQotcHVibGljIGNsYXNzIERvd25sb2FkUnVsZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyBpbXBsZW1lbnRzIElSdWxlRGlhbG9nIHsKLQotCUNvbXBvc2l0ZSBjb250ZW50OwotCi0JVGV4dCBsb2NhbERpcmVjdG9yeVRleHQ7Ci0JQnV0dG9uIGxvY2FsRGlyZWN0b3J5QnV0dG9uOwotCUJ1dHRvbiBsb2NhbFdvcmtzcGFjZUJ1dHRvbjsKLQotCUxpc3QgZmlsZUxpc3Q7Ci0JQnV0dG9uIGFkZEZpbGVzQnV0dG9uOwotCUJ1dHRvbiBlZGl0RmlsZUJ1dHRvbjsKLQlCdXR0b24gcmVtb3ZlRmlsZXNCdXR0b247Ci0JCi0JQnV0dG9uIGFzUmVhZE9ubHlCdXR0b24sIGFzRXhlY3V0YWJsZUJ1dHRvbjsKLQlCdXR0b24gcHJlc2VydmVUaW1lU3RhbXBCdXR0b247Ci0JQ29tYm9Hcm91cCBvdmVyd3JpdGVQb2xpY3lDb21ibzsKLQkKLQlEb3dubG9hZFJ1bGUgZG93bmxvYWRSdWxlOwotCUlQYXRoIGxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkKLQlwcml2YXRlIGludCBsaXN0ZW5lcnNFbmFibGVkID0gMDsKLQkKLQlwdWJsaWMgRG93bmxvYWRSdWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBEb3dubG9hZFJ1bGUgcnVsZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCQotCQlkb3dubG9hZFJ1bGUgPSBydWxlOwotCX0KLQkKLQlwdWJsaWMgRG93bmxvYWRSdWxlRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJZG93bmxvYWRSdWxlID0gbmV3IERvd25sb2FkUnVsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJTGF5b3V0IGwgPSBjb250ZW50LmdldFBhcmVudCgpLmdldExheW91dCgpOwotCQljb250ZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19UaXRsZSk7Ci0JCXNldE1lc3NhZ2UoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX01lc3NhZ2UpOwotCQkKLQkJY3JlYXRlUmVtb3RlRmlsZXNDb21wb3NpdGUoY29udGVudCk7Ci0JCWNyZWF0ZUxvY2FsRGlyZWN0b3J5Q29tcG9zaXRlKGNvbnRlbnQpOwotCQljcmVhdGVPcHRpb25zQ29tcG9zaXRlKGNvbnRlbnQpOwotCQkKLQkJcHV0RmllbGRDb250ZW50cygpOwotCQkKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUxpc3RlbmVycygpIHsKLQkJbGlzdGVuZXJzRW5hYmxlZCArKzsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzYWJsZUxpc3RlbmVycygpIHsKLQkJbGlzdGVuZXJzRW5hYmxlZC0tOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHV0RmllbGRDb250ZW50cygpIHsKLQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQkKLQkJaWYgKGRvd25sb2FkUnVsZS5nZXRMb2NhbERpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCWxvY2FsRGlyZWN0b3J5VGV4dC5zZXRUZXh0KGRvd25sb2FkUnVsZS5nZXRMb2NhbERpcmVjdG9yeSgpKTsKLQkJfSBlbHNlIHsKLQkJCWxvY2FsRGlyZWN0b3J5VGV4dC5zZXRUZXh0KCIiKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW92ZXJ3cml0ZVBvbGljeUNvbWJvLnNlbGVjdEluZGV4VXNpbmdJRChJbnRlZ2VyLnRvU3RyaW5nKGRvd25sb2FkUnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSkpOwotCQlhc0V4ZWN1dGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGRvd25sb2FkUnVsZS5pc0FzRXhlY3V0YWJsZSgpKTsKLQkJYXNSZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24oZG93bmxvYWRSdWxlLmlzQXNSZWFkT25seSgpKTsKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0U2VsZWN0aW9uKGRvd25sb2FkUnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkpOwotCQlTdHJpbmcgaXRlbXNbXSA9IGRvd25sb2FkUnVsZS5nZXRSZW1vdGVGaWxlc0FzU3RyaW5nQXJyYXkoKTsKLQkJQXJyYXlzLnNvcnQoaXRlbXMpOwotCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCQotCQllbmFibGVMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZldGNoRmllbGRDb250ZW50cygpIHsKLQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQkKLQkJU3RyaW5nIHBhdGggPSBsb2NhbERpcmVjdG9yeVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkb3dubG9hZFJ1bGUuc2V0TG9jYWxEaXJlY3RvcnkocGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlkb3dubG9hZFJ1bGUuc2V0TG9jYWxEaXJlY3RvcnkobnVsbCk7Ci0JCX0KLQkJZG93bmxvYWRSdWxlLnNldE92ZXJ3cml0ZVBvbGljeShJbnRlZ2VyLnBhcnNlSW50KG92ZXJ3cml0ZVBvbGljeUNvbWJvLmdldFNlbGVjdGlvbklkKCkpKTsKLQkJZG93bmxvYWRSdWxlLnNldEFzRXhlY3V0YWJsZShhc0V4ZWN1dGFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlkb3dubG9hZFJ1bGUuc2V0QXNSZWFkT25seShhc1JlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRSdWxlLnNldFByZXNlcnZlVGltZVN0YW1wKHByZXNlcnZlVGltZVN0YW1wQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRSdWxlLnNldFJlbW90ZUZpbGVzKGZpbGVMaXN0LmdldEl0ZW1zKCkpOwotCQkKLQkJZW5hYmxlTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlmZXRjaEZpZWxkQ29udGVudHMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlTG9jYWxEaXJlY3RvcnlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZU1vbGQgZnJhbWVNb2xkID0gbmV3IEZyYW1lTW9sZCgpOwotCQlmcmFtZU1vbGQuc2V0Q29sdW1ucygzKTsKLQkJZnJhbWVNb2xkLnNldFRpdGxlKE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19EZXN0aW5hdGlvbkZyYW1lX1RpdGxlKTsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBmcmFtZU1vbGQpOwotCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0JCQotCQlHcmlkRGF0YSBsb2NhbERpcmVjdG9yeUdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxvY2FsRGlyZWN0b3J5R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxvY2FsRGlyZWN0b3J5R3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlsb2NhbERpcmVjdG9yeUdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbG9jYWxEaXJlY3RvcnlUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbG9jYWxEaXJlY3RvcnlUZXh0LnNldExheW91dERhdGEobG9jYWxEaXJlY3RvcnlHcmlkRGF0YSk7Ci0JCQotCQlHcmlkRGF0YSBza2lwcGVyR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJc2tpcHBlckdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlza2lwcGVyR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlza2lwcGVyR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlMYWJlbCBza2lwcGVyID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuTk9ORSk7IC8vIEp1c3QgdG8gc2tpcCBvbmUgY29sdW1uCi0JCXNraXBwZXIuc2V0TGF5b3V0RGF0YShza2lwcGVyR3JpZERhdGEpOwotCQkKLQkJbG9jYWxEaXJlY3RvcnlCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuUFVTSCk7Ci0JCWxvY2FsRGlyZWN0b3J5QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfRmlsZVN5c3RlbUJ1dHRvbik7Ci0JCWxvY2FsRGlyZWN0b3J5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJaGFuZGxlTG9jYWxEaXJlY3RvcnlCdXR0b25FdmVudCgpOwotCQkJfQkJCQotCQl9KTsKLQkJbG9jYWxXb3Jrc3BhY2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuUFVTSCk7Ci0JCWxvY2FsV29ya3NwYWNlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfV29ya3NwYWNlQnV0dG9uKTsKLQkJbG9jYWxXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQloYW5kbGVMb2NhbFdvcmtzcGFjZUJ1dHRvbkV2ZW50KCk7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVPcHRpb25zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWVNb2xkIGZyYW1lTW9sZCA9IG5ldyBGcmFtZU1vbGQoKTsKLQkJZnJhbWVNb2xkLnNldENvbHVtbnMoMyk7Ci0JCWZyYW1lTW9sZC5hZGRPcHRpb24oRnJhbWVNb2xkLkNPTFVNTlNfRVFVQUxfV0lEVEgpOwotCQlmcmFtZU1vbGQuc2V0VGl0bGUoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9UaXRsZSk7Ci0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHBhcmVudCwgZnJhbWVNb2xkKTsKLQkJZnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlDb21wb3NpdGUgY29udGVudHMgPSBmcmFtZS5nZXRDb21wb3NpdGUoKTsKLQkJYXNSZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGVudHMsIFNXVC5DSEVDSyk7Ci0JCWFzUmVhZE9ubHlCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1JlYWRvbmx5Q2hlY2spOwotCQlhc0V4ZWN1dGFibGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuQ0hFQ0spOwotCQlhc0V4ZWN1dGFibGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjayk7Ci0JCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uID0gbmV3IEJ1dHRvbihjb250ZW50cywgU1dULkNIRUNLKTsKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2spOwotCQkKLQkJQ29tYm9Nb2xkIG1vbGQgPSBuZXcgQ29tYm9Nb2xkKENvbWJvTW9sZC5HUklEX0RBVEFfU1BBTik7Ci0JCW1vbGQuc2V0TGFiZWwoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVMYWJlbCk7Ci0JCW1vbGQuc2V0VGV4dEZpZWxkV2lkdGgoNDApOwotCQltb2xkLmFkZEl0ZW0oSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5TS0lQKSwgTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uKTsKLQkJbW9sZC5hZGRJdGVtKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuQUxXQVlTKSwgTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVBbHdheXNPcHRpb24pOwotCQltb2xkLmFkZEl0ZW0oSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5ORVdFUiksIE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlQ29tYm9fT3ZlcndyaXRlSWZOZXdlck9wdGlvbik7Ci0JCW92ZXJ3cml0ZVBvbGljeUNvbWJvID0gbmV3IENvbWJvR3JvdXAoY29udGVudHMsIG1vbGQpOwotCQlvdmVyd3JpdGVQb2xpY3lDb21iby5nZXRDb21ibygpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlkaXNhYmxlTGlzdGVuZXJzKCk7Ci0JCQkJaWYgKG92ZXJ3cml0ZVBvbGljeUNvbWJvLmdldFNlbGVjdGlvbklkKCkuZXF1YWxzKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuTkVXRVIpKSkgewotCQkJCQlwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CQkJCQkKLQkJCQl9Ci0JCQkJZW5hYmxlTGlzdGVuZXJzKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiBmcmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlUmVtb3RlRmlsZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZU1vbGQgZnJhbWVNb2xkID0gbmV3IEZyYW1lTW9sZCgpOwotCQlmcmFtZU1vbGQuc2V0Q29sdW1ucygyKTsKLQkJZnJhbWVNb2xkLnNldFRpdGxlKE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX1RpdGxlKTsKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUocGFyZW50LCBmcmFtZU1vbGQpOwotCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJCi0JCUZyYW1lIGZpbGVzRnJhbWUgPSBuZXcgRnJhbWUoZnJhbWUuZ2V0Q29tcG9zaXRlKCkpOwotCQlmaWxlTGlzdCA9IG5ldyBMaXN0KGZpbGVzRnJhbWUsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludD0yMDA7Ci0JCWZpbGVMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlmaWxlTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkgcmV0dXJuOwotCQkJCXJlbW92ZUZpbGVzQnV0dG9uLnNldEVuYWJsZWQoZmlsZUxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAwKTsKLQkJCQllZGl0RmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZpbGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMSk7Ci0JCQl9Ci0JCX0pOwotCQlmaWxlTGlzdC5kZXNlbGVjdEFsbCgpOwotCQkKLQkJRnJhbWUgYnV0dG9uRnJhbWUgPSBuZXcgRnJhbWUoZnJhbWUuZ2V0Q29tcG9zaXRlKCkpOwotCQlhZGRGaWxlc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJYWRkRmlsZXNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9BZGRCdXR0b24pOwotCQlhZGRGaWxlc0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRmlsZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQloYW5kbGVhZGRGaWxlc0J1dHRvbkV2ZW50KCk7Ci0JCQl9CQkJCi0JCX0pOwotCQllZGl0RmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJZWRpdEZpbGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9FZGl0QnV0dG9uKTsKLQkJZWRpdEZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCWVkaXRGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJaGFuZGxlRWRpdEZpbGVCdXR0b25FdmVudCgpOwotCQkJfQkJCQotCQl9KTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkZyYW1lLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0ZpbGVMaXN0RnJhbWVfUmVtb3ZlQnV0dG9uKTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVGaWxlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkgcmV0dXJuOwotCQkJCWhhbmRsZVJlbW92ZUZpbGVzQnV0dG9uRXZlbnQoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWJ1dHRvbkZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJCi0JCXJldHVybiBmcmFtZTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlTG9jYWxEaXJlY3RvcnlCdXR0b25FdmVudCgpIHsKLQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0KLQkJSVBhdGggc2VsZWN0ZWRQYXRoID0gbnVsbDsKLQkJLyoKLQkJICogRmlyc3QsIHRyeSB0aGUgY3VycmVudCBwYXRoLgotCQkgKi8KLQkJSVBhdGggd29ya3NwYWNlUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJSVBhdGggY3VycmVudFBhdGggPSBuZXcgUGF0aChsb2NhbERpcmVjdG9yeVRleHQuZ2V0VGV4dCgpKTsKLQkJaWYgKCEgY3VycmVudFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQljdXJyZW50UGF0aCA9IHdvcmtzcGFjZVBhdGguYXBwZW5kKGN1cnJlbnRQYXRoKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlzZWxlY3RlZFBhdGggPSAgY3VycmVudFBhdGg7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIElmIG5vdCwgdHJ5IGxhc3QgZGlyZWN0b3J5LgotCQkgKi8KLQkJaWYgKHNlbGVjdGVkUGF0aCA9PSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUobGFzdFNlbGVjdGVkRGlyZWN0b3J5LnRvT1NTdHJpbmcoKSk7Ci0JCQlpZiAoZmlsZTIuaXNEaXJlY3RvcnkoKSAmJiBmaWxlMi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJc2VsZWN0ZWRQYXRoID0gIGxhc3RTZWxlY3RlZERpcmVjdG9yeTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogT3RoZXJ3aXNlLCB1c2Ugd29ya3NwYWNlIHJvb3QuCi0JCSAqLwotCQlpZiAoc2VsZWN0ZWRQYXRoID09IG51bGwpIHsKLQkJCXNlbGVjdGVkUGF0aCA9IHdvcmtzcGFjZVBhdGg7Ci0JCX0KLQkJCi0JCURpcmVjdG9yeURpYWxvZyBkaXJlY3RvcnlEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJZGlyZWN0b3J5RGlhbG9nLnNldEZpbHRlclBhdGgoc2VsZWN0ZWRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCWRpcmVjdG9yeURpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19EaXJlY3RvcnlEaWFsb2dfVGl0bGUpOwotCQlkaXJlY3RvcnlEaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfRGlyZWN0b3J5RGlhbG9nX01lc3NhZ2UpOwotCi0JCVN0cmluZyBuZXdQYXRoID0gZGlyZWN0b3J5RGlhbG9nLm9wZW4oKTsKLQotCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7CQkJCi0JCQkvKgotCQkJICogSWYgcGF0aCBpcyBpbnNpZGUgdGhlIHdvcmtzcGFjZSwgdGhlbiBtYWtlIGl0IHJlbGF0aXZlLgotCQkJICovCi0JCQlJUGF0aCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAod29ya3NwYWNlLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHdvcmtzcGFjZS5zZWdtZW50Q291bnQoKSk7Ci0JCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQl9Ci0JCQlsb2NhbERpcmVjdG9yeVRleHQuc2V0VGV4dChwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkKLQkJCS8qCi0JCQkgKiBTYXZlIGxhc3RTZWxlY3RlZERpcmVjdG9yeS4gVGhlcmUgaXMgYSBidWcgaW4gRGlyZWN0b3J5RGlhbG9nLgotCQkJICogVGhlIG1ldGhvZCBnZXRGaWx0ZXJQYXRoIGRvZXMgbm90IHJldHVybiB0aGUgZXhwZWN0ZWQgcGF0aC4KLQkJCSAqIFRoZSBidWcgd2lsbCBiZSBmaXhlZCBpbiBFY2xpcHNlIDMuNC4KLQkJCSAqIFRoZSB3b3JrYXJvdW50IHRha2VzIHRoZSBwYXJlbnQgb2YgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeSBhcyBsYXN0U2VsZWN0ZWREaXJlY3RvcnkuCi0JCQkgKi8KLQkJCWxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IG5ldyBQYXRoKG5ld1BhdGgpOwotCQkJbGFzdFNlbGVjdGVkRGlyZWN0b3J5ID0gbGFzdFNlbGVjdGVkRGlyZWN0b3J5LnJlbW92ZUxhc3RTZWdtZW50cygxKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVMb2NhbFdvcmtzcGFjZUJ1dHRvbkV2ZW50KCkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIHNlbGVjdGVkQ29udGFpbmVyID0gbnVsbDsKLQkKLQkJLyoKLQkJICogRmlyc3QsIHRyeSB0aGUgY3VycmVudCBjb250ZW50IGFzIGluaXRpYWwgc2VsZWN0aW9uLgotCQkgKi8KLQkJSVBhdGggY3VycmVudFBhdGggPSBuZXcgUGF0aChsb2NhbERpcmVjdG9yeVRleHQuZ2V0VGV4dCgpKTsKLQkJaWYgKGN1cnJlbnRQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gQWJzb2x1dGUgcGF0aCBpZiBmaWxlIHN5c3RlbQotCQkJSUNvbnRhaW5lciBjdXJyZW50Q29udGFpbmVyW10gPSB3b3Jrc3BhY2UuZmluZENvbnRhaW5lcnNGb3JMb2NhdGlvbihjdXJyZW50UGF0aCk7Ci0JCQlpZiAoY3VycmVudENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnRDb250YWluZXIubGVuZ3RoID09IDEpIHsKLQkJCQkJc2VsZWN0ZWRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyWzBdOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFBhdGggcmVsYXRpdmUgdG8gd29ya3NwYWNlCi0JCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IHdvcmtzcGFjZS5maW5kTWVtYmVyKGxhc3RTZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXNlbGVjdGVkQ29udGFpbmVyID0gKElDb250YWluZXIpIHNlbGVjdGVkUmVzb3VyY2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKgotCQkgKiBPdGhlcndpc2UsIHRyeSB0aGUgbGFzdCBzZWxlY3RlZCBwYXRoIGFzIGluaXRpYWwgc2VsZWN0aW9uLgotCQkgKi8KLQkJaWYgKHNlbGVjdGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCUlDb250YWluZXIgbGFzdENvbnRhaW5lcltdID0gd29ya3NwYWNlLmZpbmRDb250YWluZXJzRm9yTG9jYXRpb24obGFzdFNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCWlmIChsYXN0Q29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlpZiAobGFzdENvbnRhaW5lci5sZW5ndGggPT0gMSkgewotCQkJCQlzZWxlY3RlZENvbnRhaW5lciA9IGxhc3RDb250YWluZXJbMF07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCS8qCi0JCSAqIElmIG5vdGhpbmcgbWF0Y2hlcywgdXNlIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkJICovCi0JCWlmIChzZWxlY3RlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlzZWxlY3RlZENvbnRhaW5lciA9IHdvcmtzcGFjZTsKLQkJfQotCQkKLQkJQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgd29ya3NwYWNlLCB0cnVlLCBNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfV29ya3NwYWNlRGlhbG9nX1RpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgc2VsZWN0ZWRDb250YWluZXIgfSk7Ci0JCQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCS8qCi0JCQkgKiBBbHRob3VnaCBub3QgZG9jdW1lbnRlZCwgZ2V0UmVzdWx0IHJldHVybnMgYW4gYXJyYXkgd2l0aCBleGFjdGx5Ci0JCQkgKiBvbmUgZWxlbWVudCwgdGhhdCBoYXMgdHlwZSBvZiBJUGF0aC4KLQkJCSAqIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHdvcmtzcGFjZS4KLQkJCSAqLwotCQkJT2JqZWN0IHJbXSA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCUlQYXRoIHNlbGVjdGVkUGF0aCA9IChJUGF0aClyWzBdOwotCQkJLy8gVGhlIHBhdGggaXMgcmV0dXJuZWQgYXMgYWJzb2x1dGUhIE1ha2UgaXQgcmVsYXRpdmUhCi0JCQlsb2NhbERpcmVjdG9yeVRleHQuc2V0VGV4dChzZWxlY3RlZFBhdGgubWFrZVJlbGF0aXZlKCkudG9PU1N0cmluZygpKTsKLQkJCQotCQkJbGFzdFNlbGVjdGVkRGlyZWN0b3J5ID0gc2VsZWN0ZWRQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZWFkZEZpbGVzQnV0dG9uRXZlbnQoKSB7Ci0JCUlucHV0RGlhbG9nIGlucHV0RGlhbG9nID0gbmV3IElucHV0RGlhbG9nKGdldFNoZWxsKCksIE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX1RpdGxlLCBNZXNzYWdlcy5Eb3dubG9hZFJ1bGVEaWFsb2dfQWRkRmlsZURpYWxvZ19NZXNzYWdlLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAotCQlpbnB1dERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJaWYgKGlucHV0RGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZpbGVMaXN0LmdldEl0ZW1zKCkpKTsKLQkJCWxpc3QuYWRkKGlucHV0RGlhbG9nLmdldFZhbHVlKCkpOwotCQkJU3RyaW5nIHNbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJcyA9IChTdHJpbmdbXSkgbGlzdC50b0FycmF5KHMpOwotCQkJQXJyYXlzLnNvcnQocyk7Ci0JCQlmaWxlTGlzdC5zZXRJdGVtcyhzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRWRpdEZpbGVCdXR0b25FdmVudCgpIHsKLQkJaWYgKGZpbGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IGZpbGVMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyBzZWxlY3RlZEl0ZW0gPSBmaWxlTGlzdC5nZXRJdGVtKGluZGV4KTsKLQkJCi0JCUlucHV0RGlhbG9nIGlucHV0RGlhbG9nID0gbmV3IElucHV0RGlhbG9nKGdldFNoZWxsKCksIE1lc3NhZ2VzLkRvd25sb2FkUnVsZURpYWxvZ19FZGl0RmlsZURpYWxvZ19UaXRsZSwgTWVzc2FnZXMuRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX01lc3NhZ2UsIHNlbGVjdGVkSXRlbSwgbnVsbCk7Ci0JCWlucHV0RGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlpZiAoaW5wdXREaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgewotCQkJU3RyaW5nIHNbXSA9IGZpbGVMaXN0LmdldEl0ZW1zKCk7Ci0JCQlzW2luZGV4XSA9IGlucHV0RGlhbG9nLmdldFZhbHVlKCk7Ci0JCQlBcnJheXMuc29ydChzKTsKLQkJCWZpbGVMaXN0LnNldEl0ZW1zKHMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVGaWxlc0J1dHRvbkV2ZW50KCkgewotCQlTdHJpbmcgc2VsZWN0aW9uIFtdID0gZmlsZUxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSGFzaFNldCBmaWxlU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChmaWxlTGlzdC5nZXRJdGVtcygpKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc2VsZWN0aW9uW2ldOwotCQkJZmlsZVNldC5yZW1vdmUoc3RyaW5nKTsKLQkJfQotCQkKLQkJU3RyaW5nIGl0ZW1zW10gPSBuZXcgU3RyaW5nW2ZpbGVTZXQuc2l6ZSgpXTsKLQkJaXRlbXMgPSAoU3RyaW5nW10pIGZpbGVTZXQudG9BcnJheShpdGVtcyk7Ci0JCUFycmF5cy5zb3J0KGl0ZW1zKTsKLQkJZmlsZUxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCX0KLQotCXB1YmxpYyBJU3luY2hyb25pemF0aW9uUnVsZSBnZXRSdWxlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBkb3dubG9hZFJ1bGU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9FbmhhbmNlZFN5bmNocm9uaXplVGFiLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9FbmhhbmNlZFN5bmNocm9uaXplVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxZjQ1YzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvRW5oYW5jZWRTeW5jaHJvbml6ZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci51aTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5sYXVuY2guaW50ZXJuYWwudWkuTGF1bmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmxhdW5jaC5pbnRlcm5hbC51aS5MYXVuY2hVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmRhdGEuRG93bmxvYWRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLk92ZXJ3cml0ZVBvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLlJ1bGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLlVwbG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnByZWZlcmVuY2VzLkxhdW5jaFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5GcmFtZU1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZFVwbG9hZFJ1bGVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhZGREb3dubG9hZFJ1bGVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0UnVsZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbW92ZVJ1bGVCdXR0b247Ci0JcHJvdGVjdGVkIExpc3QgcnVsZUxpc3Q7Ci0JcHJvdGVjdGVkIExpc3RWaWV3ZXIgcnVsZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIHN5bmNCZWZvcmVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzeW5jQWZ0ZXJCdXR0b247Ci0JCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgU3luY2hyb25pemF0aW9uUnVsZUxhYmVsUHJvdmlkZXIgcnVsZUxhYmVsUHJvdmlkZXI7Ci0KLQlib29sZWFuIGRhdGFDaGFuZ2VkID0gZmFsc2U7Ci0JaW50IGV2ZW50SGFuZGxlckVuYWJsZWQgPSAwOwotCQotCUltYWdlIHRhYkltYWdlOwotCQotCXB1YmxpYyBFbmhhbmNlZFN5bmNocm9uaXplVGFiKCkgewotCQlzdXBlcigpOwotCQlkYXRhQ2hhbmdlZCA9IGZhbHNlOwotCQlVUkwgdXJsID0gUmVtb3RlTGF1bmNoZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvaWNvbnMvc3luYy5wbmciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkgICAgdGFiSW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUV2ZW50SGFuZGxlcnMoKSB7Ci0JCWV2ZW50SGFuZGxlckVuYWJsZWQrKzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUV2ZW50SGFuZGxlcnMoKSB7Ci0JCWV2ZW50SGFuZGxlckVuYWJsZWQtLTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFdmVudEhhbmRsZXJFbmFibGVkKCkgewotCQlyZXR1cm4gZXZlbnRIYW5kbGVyRW5hYmxlZCA+IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRhYk1vZGlmeUxpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoISBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSkgcmV0dXJuOwotCQkJZGF0YUNoYW5nZWQgPSB0cnVlOwotCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmICghIGlzRXZlbnRIYW5kbGVyRW5hYmxlZCgpKSByZXR1cm47Ci0JCQlkYXRhQ2hhbmdlZCA9IHRydWU7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoISBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSkgcmV0dXJuOwotCQkJZGF0YUNoYW5nZWQgPSB0cnVlOwotCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRhYk1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyOwotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXRoaXMuc2V0TWVzc2FnZShNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1RhYl9NZXNzYWdlKTsKLQotCQlDb21wb3NpdGUgdG9wQ29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdG9wQ29udHJvbC5zZXRMYXlvdXQodG9wTGF5b3V0KTsKLQotCQlzZXRDb250cm9sKHRvcENvbnRyb2wpOwotCQkKLQkJRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUodG9wQ29udHJvbCwgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX1RpdGxlKTsKLQkJZnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJQ29tcG9zaXRlIGZyYW1lQ29tcG9zaXRlID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0KLQkJbW9kaWZ5TGlzdGVuZXIgPSBuZXcgVGFiTW9kaWZ5TGlzdGVuZXIoKTsKLQotCQljcmVhdGVSdWxlTGlzdENvbnRyb2woZnJhbWVDb21wb3NpdGUpOwotCQljcmVhdGVPcHRpb25zQ29udHJvbChmcmFtZUNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUJ1dHRvbkNvbnRyb2woZnJhbWVDb21wb3NpdGUpOwotCQkKLQkJZW5hYmxlRXZlbnRIYW5kbGVycygpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVJ1bGVMaXN0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHBhcmVudCwgMSk7Ci0JCWZyYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCUNvbXBvc2l0ZSBmcmFtZUNvbXBvc2l0ZSA9IGZyYW1lLmdldENvbXBvc2l0ZSgpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZnJhbWVDb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfRGVzY3JpcHRpb24pOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJcnVsZUxpc3QgPSBuZXcgTGlzdChmcmFtZUNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50PTEwMDsKLQkJcnVsZUxpc3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJ1bGVMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCEgaXNFdmVudEhhbmRsZXJFbmFibGVkKCkpIHJldHVybjsKLQkJCQlyZW1vdmVSdWxlQnV0dG9uLnNldEVuYWJsZWQocnVsZUxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAwKTsKLQkJCQllZGl0UnVsZUJ1dHRvbi5zZXRFbmFibGVkKHJ1bGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMSk7Ci0JCQl9Ci0JCX0pOwotCQlydWxlTGlzdC5kZXNlbGVjdEFsbCgpOwotCQlydWxlVmlld2VyID0gbmV3IExpc3RWaWV3ZXIocnVsZUxpc3QpOwotCQlydWxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBydWxlcy50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbihvbGRJbnB1dC50b1N0cmluZygpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlydWxlTGFiZWxQcm92aWRlciA9IG5ldyBTeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlcigpOwotCQlydWxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIocnVsZUxhYmVsUHJvdmlkZXIpOwotCQlydWxlVmlld2VyLnNldElucHV0KHJ1bGVzKTsKLQkJcmV0dXJuIGZyYW1lOwkJCi0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVPcHRpb25zQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHBhcmVudCwgRnJhbWVNb2xkLkNPTFVNTlNfRVFVQUxfV0lEVEgsIDIpOwotCQlDb21wb3NpdGUgZnJhbWVDb21wb3NpdGUgPSBmcmFtZS5nZXRDb21wb3NpdGUoKTsKLQkJCi0JCXN5bmNCZWZvcmVCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihmcmFtZUNvbXBvc2l0ZSwgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfVXBsb2FkRW5hYmxlZCk7Ci0JCXN5bmNCZWZvcmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNCZWZvcmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlzeW5jQWZ0ZXJCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihmcmFtZUNvbXBvc2l0ZSwgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfRG93bmxvYWRFbmFibGVkKTsKLQkJc3luY0FmdGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJc3luY0FmdGVyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUJ1dHRvbkNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZShwYXJlbnQsIEZyYW1lTW9sZC5DT0xVTU5TX0VRVUFMX1dJRFRILCA0KTsKLQkJQ29tcG9zaXRlIGZyYW1lQ29tcG9zaXRlID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0JCQotCQlhZGRVcGxvYWRSdWxlQnV0dG9uID0gbmV3IEJ1dHRvbihmcmFtZUNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlhZGRVcGxvYWRSdWxlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfTmV3VXBsb2FkUnVsZSk7Ci0JCWFkZFVwbG9hZFJ1bGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCWFkZFVwbG9hZFJ1bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoISBpc0V2ZW50SGFuZGxlckVuYWJsZWQoKSkgcmV0dXJuOwotCQkJCWhhbmRsZUFkZFVwbG9hZFJ1bGVCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYWRkRG93bmxvYWRSdWxlQnV0dG9uID0gbmV3IEJ1dHRvbihmcmFtZUNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlhZGREb3dubG9hZFJ1bGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19Eb3dubG9hZFJ1bGUpOwotCQlhZGREb3dubG9hZFJ1bGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCWFkZERvd25sb2FkUnVsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghIGlzRXZlbnRIYW5kbGVyRW5hYmxlZCgpKSByZXR1cm47Ci0JCQkJaGFuZGxlQWRkRG93bmxvYWRSdWxlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQllZGl0UnVsZUJ1dHRvbiA9IG5ldyBCdXR0b24oZnJhbWVDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZWRpdFJ1bGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19FZGl0U2VsZWN0ZWRSdWxlKTsKLQkJZWRpdFJ1bGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCWVkaXRSdWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCEgaXNFdmVudEhhbmRsZXJFbmFibGVkKCkpIHJldHVybjsKLQkJCQloYW5kbGVFZGl0UnVsZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWVkaXRSdWxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJcmVtb3ZlUnVsZUJ1dHRvbiA9IG5ldyBCdXR0b24oZnJhbWVDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlUnVsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX1JlbW92ZVNlbGVjdGVkUnVsZXMpOwotCQlyZW1vdmVSdWxlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVSdWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCEgaXNFdmVudEhhbmRsZXJFbmFibGVkKCkpIHJldHVybjsKLQkJCQloYW5kbGVSZW1vdmVSdWxlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJcmVtb3ZlUnVsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVmFsaWQoY29uZmlnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiNjYW5TYXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TYXZlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuU2F2ZSgpIHx8IGRhdGFDaGFuZ2VkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1NZTkNfQUZURVIsCi0JCQkJSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuREVGQVVMVF9TWU5DX0FGVEVSKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9TWU5DX0JFRk9SRSwKLQkJCQlJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5ERUZBVUxUX1NZTkNfQkVGT1JFKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9TWU5DX1JVTEVTLCBuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWRhdGFDaGFuZ2VkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzeW5jQWZ0ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKAotCQkJCQlJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1NZTkNfQUZURVIsCi0JCQkJCUlSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkRFRkFVTFRfU1lOQ19BRlRFUikpOwotCQkJc3luY0JlZm9yZUJ1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0JCQkJCUlSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfU1lOQ19CRUZPUkUsCi0JCQkJCUlSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkRFRkFVTFRfU1lOQ19CRUZPUkUpKTsKLQkJCWphdmEudXRpbC5MaXN0IGxpc3QgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLQkJCQkJSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9TWU5DX1JVTEVTLAotCQkJCQluZXcgQXJyYXlMaXN0KCkpOwotCQkJcnVsZXMuY2xlYXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUgPSBSdWxlRmFjdG9yeS5jcmVhdGVSdWxlRnJvbVN0cmluZyhzdHJpbmcpOwotCQkJCXJ1bGVzLmFkZChydWxlKTsKLQkJCX0KLQotLy8JCQlSZW1vdGVMYXVuY2hEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBSZW1vdGVMYXVuY2hEZWxlZ2F0ZSgpOwotLy8JCQlydWxlTGFiZWxQcm92aWRlci5zZXRSZW1vdGVXb3JraW5nRGlyKExpbnV4UGF0aC50b1N0cmluZyhkZWxlZ2F0ZS5nZXRWYWxpZGF0ZWRSZW1vdGVEaXJlY3RvcnkoY29uZmlndXJhdGlvbikpKTsKLS8vCQkJcnVsZUxhYmVsUHJvdmlkZXIuc2V0UmVtb3RlV29ya2luZ0RpcihMaW51eFBhdGgudG9TdHJpbmcoZGVsZWdhdGUuZ2V0UmVtb3RlRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pKSk7Ci0JCQkKLQkJCVN0cmluZyBkZWZhdWx0UmVtb3RlV29ya2luZ0RpcmVjdG9yeSA9IExhdW5jaFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJTGF1bmNoUHJlZmVyZW5jZXMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSk7Ci0JCQkKLQkJCWlmKCBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX0FVVE9NQVRJQ19XT1JLSU5HX0RJUkVDVE9SWSwgSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuREVGQVVMVF9BVVRPTUFUSUNfV09SS0lOR19ESVJFQ1RPUlkpKXsKLQkJCQlydWxlTGFiZWxQcm92aWRlci5zZXRSZW1vdGVXb3JraW5nRGlyKCBkZWZhdWx0UmVtb3RlV29ya2luZ0RpcmVjdG9yeSApOwotCQkJfSBlbHNlIHsKLQkJCQlydWxlTGFiZWxQcm92aWRlci5zZXRSZW1vdGVXb3JraW5nRGlyKCBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1JFTU9URV9ESVJFQ1RPUlksIGRlZmF1bHRSZW1vdGVXb3JraW5nRGlyZWN0b3J5KSApOwotCQkJfQotCQkJCi0JCQlyZWZyZXNoUnVsZUxpc3QoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGF1bmNoTWVzc2FnZXMKLQkJCQkJLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkJCQkiTGF1bmNoLmNvbW1vbi5FeGNlcHRpb25fb2NjdXJyZWRfcmVhZGluZ19jb25maWd1cmF0aW9uX0VYQ0VQVElPTiIsIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxhdW5jaFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoUnVsZUxpc3QoKSB7Ci0vLwkJcnVsZUxpc3QucmVtb3ZlQWxsKCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gcnVsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCUlTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUgPSAoSVN5bmNocm9uaXphdGlvblJ1bGUpIGl0ZXIubmV4dCgpOwotLy8JCQlydWxlTGlzdC5hZGQocnVsZS50b0xhYmVsKCkpOwotLy8JCX0KLS8vCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHJ1bGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0vLwkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJcnVsZVZpZXdlci5yZWZyZXNoKCk7Ci0vLwkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0vLwkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7Zmlyc3RFbGVtZW50fSk7Ci0vLwkJCXJ1bGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0vLwkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfU1lOQ19BRlRFUiwgc3luY0FmdGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9TWU5DX0JFRk9SRSwgc3luY0JlZm9yZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBydWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUgPSAoSVN5bmNocm9uaXphdGlvblJ1bGUpIGl0ZXIubmV4dCgpOwotCQkJbGlzdC5hZGQocnVsZS50b1N0cmluZygpKTsKLQkJfQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1NZTkNfUlVMRVMsIGxpc3QpOwotCQlkYXRhQ2hhbmdlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVGFiX1RpdGxlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIHRhYkltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZFVwbG9hZFJ1bGVCdXR0b25QcmVzc2VkKCkgewotCQlVcGxvYWRSdWxlIHVwbG9hZFJ1bGUgPSBuZXcgVXBsb2FkUnVsZSgpOwotCQl1cGxvYWRSdWxlLnNldERlZmF1bHRSZW1vdGVEaXJlY3RvcnkodHJ1ZSk7Ci0JCXVwbG9hZFJ1bGUuc2V0UmVtb3RlRGlyZWN0b3J5KG51bGwpOwotCQl1cGxvYWRSdWxlLnNldE92ZXJ3cml0ZVBvbGljeShPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVMpOwotCQluZXdSdWxlRGlhbG9nKHVwbG9hZFJ1bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGREb3dubG9hZFJ1bGVCdXR0b25QcmVzc2VkKCkgewotCQlEb3dubG9hZFJ1bGUgZG93bmxvYWRSdWxlID0gbmV3IERvd25sb2FkUnVsZSgpOwotCQlkb3dubG9hZFJ1bGUuc2V0T3ZlcndyaXRlUG9saWN5KE92ZXJ3cml0ZVBvbGljaWVzLkFMV0FZUyk7Ci0JCW5ld1J1bGVEaWFsb2coZG93bmxvYWRSdWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbmV3UnVsZURpYWxvZyhJU3luY2hyb25pemF0aW9uUnVsZSBydWxlKSB7Ci0JCURpYWxvZyBkaWFsb2cgPSBSdWxlRGlhbG9nRmFjdG9yeS5jcmVhdGVEaWFsb2dGb3JSdWxlKGdldFNoZWxsKCksIHJ1bGUpOwotCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgewotCQkJCUlSdWxlRGlhbG9nIHJ1bGVEaWFsb2cgPSAoSVJ1bGVEaWFsb2cpIGRpYWxvZzsKLQkJCQlJU3luY2hyb25pemF0aW9uUnVsZSBuZXdSdWxlID0gUnVsZUZhY3RvcnkuZHVwbGljYXRlUnVsZShydWxlRGlhbG9nLmdldFJ1bGVXb3JraW5nQ29weSgpKTsKLQkJCQlydWxlcy5hZGQobmV3UnVsZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX1RpdGxlLAlNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX0RvbnRLbm93UnVsZVR5cGUpOwotCQl9Ci0JCXJlZnJlc2hSdWxlTGlzdCgpOwotCQlkYXRhQ2hhbmdlZCA9IHRydWU7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFZGl0UnVsZUJ1dHRvblByZXNzZWQoKSB7Ci0JCWlmIChydWxlTGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDEpIHJldHVybjsKLQkJCi0JCWludCBpbmRleCA9IHJ1bGVMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCUlTeW5jaHJvbml6YXRpb25SdWxlIHJ1bGUgPSAoSVN5bmNocm9uaXphdGlvblJ1bGUpIHJ1bGVzLmdldChpbmRleCk7Ci0JCURpYWxvZyBkaWFsb2cgPSBSdWxlRGlhbG9nRmFjdG9yeS5jcmVhdGVEaWFsb2dGb3JSdWxlKGdldFNoZWxsKCksIHJ1bGUpOwotCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgewotCQkJCUlSdWxlRGlhbG9nIHJ1bGVEaWFsb2cgPSAoSVJ1bGVEaWFsb2cpIGRpYWxvZzsKLQkJCQlJU3luY2hyb25pemF0aW9uUnVsZSBuZXdSdWxlID0gUnVsZUZhY3RvcnkuZHVwbGljYXRlUnVsZShydWxlRGlhbG9nLmdldFJ1bGVXb3JraW5nQ29weSgpKTsKLQkJCQlydWxlcy5zZXQoaW5kZXgsIG5ld1J1bGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9FcnJvck1lc3NhZ2VfTmV3UnVsZV9UaXRsZSwJTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9FcnJvck1lc3NhZ2VfTmV3UnVsZV9Eb250S25vd1J1bGVUeXBlKTsKLQkJfQotCQlyZWZyZXNoUnVsZUxpc3QoKTsKLQkJZGF0YUNoYW5nZWQgPSB0cnVlOwotCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZVJ1bGVCdXR0b25QcmVzc2VkKCkgewkJCi0JCWlmIChydWxlTGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApIHJldHVybjsKLQotCQlpbnQgaW5kZXhlc1tdID0gcnVsZUxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gaW5kZXhlc1tpXTsKLQkJCXNldC5hZGQocnVsZXMuZ2V0KGluZGV4KSk7Ci0JCX0KLQkJcnVsZXMucmVtb3ZlQWxsKHNldCk7Ci0JCXJlZnJlc2hSdWxlTGlzdCgpOwotCQlkYXRhQ2hhbmdlZCA9IHRydWU7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmICh0YWJJbWFnZSAhPSBudWxsKSB0YWJJbWFnZS5kaXNwb3NlKCk7Ci0JCXRhYkltYWdlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9JUnVsZURpYWxvZy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvSVJ1bGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MxM2QxNC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9JUnVsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5JU3luY2hyb25pemF0aW9uUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJUnVsZURpYWxvZyB7Ci0JcHVibGljIElTeW5jaHJvbml6YXRpb25SdWxlIGdldFJ1bGVXb3JraW5nQ29weSgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvTGF1bmNoZXJFeGVjdXRpb25UYWIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL0xhdW5jaGVyRXhlY3V0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjNTM5ZTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvTGF1bmNoZXJFeGVjdXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmNvcmUuSUNEVExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmxhdW5jaC5pbnRlcm5hbC51aS5MYXVuY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQubGF1bmNoLmludGVybmFsLnVpLkxhdW5jaFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5sYXVuY2gudWkuQ0xhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuUmVtb3RlTGF1bmNoZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmludGVybmFsLkxhdW5jaE9ic2VydmVySXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5Ub29sS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBMYXVuY2hlckV4ZWN1dGlvblRhYiBleHRlbmRzIENMYXVuY2hDb25maWd1cmF0aW9uVGFiIHsKLQotCXByb3RlY3RlZCBUZXh0IHByb2dyYW1Bcmd1bWVudHNUZXh0OwotCi0JcHJpdmF0ZSBDb21ibyBvYnNlcnZlckxpc3Q7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgb2JzZXJ2ZXJJRHM7Ci0JcHJpdmF0ZSBUZXh0IGJlZm9yZUNvbW1hbmRUZXh0OwotCXByaXZhdGUgVGV4dCBhZnRlckNvbW1hbmRUZXh0OwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkOwotCQotCXByaXZhdGUgY2xhc3MgVGFiTW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXZlcmlmeUNvbnRlbnQoKTsKLQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl2ZXJpZnlDb250ZW50KCk7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl2ZXJpZnlDb250ZW50KCk7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBUYWJNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJQ29tcG9zaXRlIHRvcENvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3BDb250cm9sLnNldExheW91dCh0b3BMYXlvdXQpOwotCi0JCXNldENvbnRyb2wodG9wQ29udHJvbCk7Ci0JCQotCQkvL0xhdW5jaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIElDRFRMYXVuY2hIZWxwQ29udGV4dElkcy5MQVVOQ0hfQ09ORklHVVJBVElPTl9ESUFMT0dfQVJHVU1ORVRTX1RBQik7Ci0KLQkJbW9kaWZ5TGlzdGVuZXIgPSBuZXcgVGFiTW9kaWZ5TGlzdGVuZXIoKTsKLQotCQljcmVhdGVBcmd1bWVudEdyb3VwKHRvcENvbnRyb2wpOwotCQljcmVhdGVUYXJnZXRPYnNlcnZlckdyb3VwKHRvcENvbnRyb2wpOwotCQkKLQkJdmVyaWZ5Q29udGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFyZ3VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXApIHsKLQkJR3JvdXAgZ3JvdXAgPSBUb29sS2l0LmNyZWF0ZUdyb3VwKGNvbXAsIE1lc3NhZ2VzLkxhdW5jaGVyRXhlY3V0aW9uVGFiX0FyZ3VtZW50c0ZyYW1lX1RpdGxlKTsKLQotCQlwcm9ncmFtQXJndW1lbnRzVGV4dCA9IFRvb2xLaXQuY3JlYXRlVGV4dFJvdyhncm91cCwgTWVzc2FnZXMuTGF1bmNoZXJFeGVjdXRpb25UYWJfQXJndW1lbnRzRnJhbWVfQ29tbWFuZExpbmVMYWJlbCwgbnVsbCk7Ci0JCXByb2dyYW1Bcmd1bWVudHNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFyZ2V0T2JzZXJ2ZXJHcm91cChDb21wb3NpdGUgdG9wQ29udHJvbCkgewotCQlHcm91cCBncm91cCA9IFRvb2xLaXQuY3JlYXRlR3JvdXAodG9wQ29udHJvbCwgTWVzc2FnZXMuTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9UaXRsZSk7Ci0KLQkJb2JzZXJ2ZXJMaXN0ID0gVG9vbEtpdC5jcmVhdGVTaG9ydERyb3BEb3duUm93KGdyb3VwLCBNZXNzYWdlcy5MYXVuY2hlckV4ZWN1dGlvblRhYl9PYnNlcnZlckZyYW1lX1BhcnNlckxhYmVsKTsKLQkJb2JzZXJ2ZXJMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCi0JCWJlZm9yZUNvbW1hbmRUZXh0ID0gVG9vbEtpdC5jcmVhdGVUZXh0Um93KGdyb3VwLCBNZXNzYWdlcy5MYXVuY2hlckV4ZWN1dGlvblRhYl9PYnNlcnZlckZyYW1lX0Jhc2hDb21tYW5kc0JlZm9yZUxBYmVsLCBudWxsLCA0KTsKLQkJYmVmb3JlQ29tbWFuZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkKLQkJYWZ0ZXJDb21tYW5kVGV4dCA9IFRvb2xLaXQuY3JlYXRlVGV4dFJvdyhncm91cCwgTWVzc2FnZXMuTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9CYXNoQ29tbWFuZHNBZnRlckxhYmVsLCBudWxsLCA0KTsKLQkJYWZ0ZXJDb21tYW5kVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q29udGVudCgpIHsKLQkJaXNWYWxpZCA9IHRydWU7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8qCi0JCSAqIElmIGEgb2JzZXJ2ZXIgaXMgc2VsZWN0ZWQsIHRoZW4gdGhlIERlYnVnUGx1Z2luLkFUVFJfQ0FQVFVSRV9PVVRQVVQgYXR0cmlidXRlIG11c3QgYmUgdHJ1ZS4KLQkJICovCi0JCWludCBzZWxlY3Rpb24gPSBvYnNlcnZlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSAtMSkgewotCQkJc2VsZWN0aW9uID0gMDsKLQkJfQotCQlTdHJpbmcgc2VsZWN0ZWRPYnNlcnZlcklEID0gKFN0cmluZylvYnNlcnZlcklEcy5nZXQoc2VsZWN0aW9uKTsKLQkJaWYgKHNlbGVjdGVkT2JzZXJ2ZXJJRCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmICghIGNvbmZpZy5nZXRBdHRyaWJ1dGUoRGVidWdQbHVnaW4uQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKSB7Ci0JCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCQkJc2V0TWVzc2FnZShNZXNzYWdlcy5MYXVuY2hlckV4ZWN1dGlvblRhYl9WYWxpZGF0aW9uX09ic2VydmVyQW5kTm9Db25zb2xlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBOb3RoaW5nCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5pc1ZhbGlkKGNvbmZpZykgJiYgaXNWYWxpZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjY2FuU2F2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU2F2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJQ0RUTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAoU3RyaW5nKSBudWxsKTsKLQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX0FGVEVSX0NPTU1BTkQsIElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkRFRkFVTFRfQUZURVJfQ09NTUFORCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfQkVGT1JFX0NPTU1BTkQsIElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkRFRkFVTFRfQkVGT1JFX0NPTU1BTkQpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX09VVFBVVF9PQlNFUlZFUiwgSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuREVGQVVMVF9PVVRQVVRfT0JTRVJWRVIpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX1VTRV9GT1JXQVJERURfWDExLCBJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5ERUZBVUxUX1VTRV9GT1JXQVJERURfWDExKTsKLX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQl0cnkgewotCQkJcHJvZ3JhbUFyZ3VtZW50c1RleHQuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJQ0RUTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8qCi0JCQkgKiBHZW5lcmF0ZSBsaXN0IG9mIGFsbCBvYnNlcnZlciBwbHVnLWlucyAKLQkJCSAqLwotCQkJb2JzZXJ2ZXJMaXN0LnJlbW92ZUFsbCgpOwotCQkJU3RyaW5nIGN1cnJlbnQ7Ci0JCQlpbnQgc2VsZWN0ZWQ7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX09VVFBVVF9PQlNFUlZFUiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQljdXJyZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNlbGVjdGVkID0gMDsKLQkJCW9ic2VydmVyTGlzdC5hZGQoTWVzc2FnZXMuTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9PYnNlcnZlckNvbWJvX0RlZmF1bHROb25lT3B0aW9uKTsKLQkJCW9ic2VydmVySURzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJb2JzZXJ2ZXJJRHMuYWRkKG51bGwpOwotCQkJTGF1bmNoT2JzZXJ2ZXJJdGVyYXRvciBpdGVyYXRvciA9IFJlbW90ZUxhdW5jaGVyUGx1Z2luLmdldExhdW5jaE9ic2VydmVySXRlcmF0b3IoKTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpdGVyYXRvci5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lID0gaXRlcmF0b3IuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBpZCA9IGl0ZXJhdG9yLmdldElEKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJaWYgKGlkID09IG51bGwpIGNvbnRpbnVlOwotCQkJCW9ic2VydmVyTGlzdC5hZGQobmFtZSk7Ci0JCQkJaWYgKGN1cnJlbnQuZXF1YWxzKGlkKSkgewotCQkJCQlzZWxlY3RlZCA9IGluZGV4OwotCQkJCX0KLQkJCQlvYnNlcnZlcklEcy5hZGQoaWQpOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlvYnNlcnZlckxpc3Quc2VsZWN0KHNlbGVjdGVkKTsKLQkJCQotCQkJLyoKLQkJCSAqIEZpbGwgYmFzaCBjb21tYW5kIGZpZWxkcwotCQkJICovCi0JCQl0cnkgewotCQkJCWJlZm9yZUNvbW1hbmRUZXh0LnNldFRleHQoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSVJlbW90ZUxhdW5jaEF0dHJpYnV0ZXMuQVRUUl9CRUZPUkVfQ09NTUFORCwgIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJYmVmb3JlQ29tbWFuZFRleHQuc2V0VGV4dChudWxsKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYWZ0ZXJDb21tYW5kVGV4dC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElSZW1vdGVMYXVuY2hBdHRyaWJ1dGVzLkFUVFJfQUZURVJfQ09NTUFORCwgIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWZ0ZXJDb21tYW5kVGV4dC5zZXRUZXh0KG51bGwpOwotCQkJfQotCi0JCQl2ZXJpZnlDb250ZW50KCk7CQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMYXVuY2hNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIkxhdW5jaC5jb21tb24uRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbl9FWENFUFRJT04iLCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlMYXVuY2hVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNwZXJmb3JtQXBwbHkob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoCi0JCQlJQ0RUTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLAotCQkJZ2V0QXR0cmlidXRlVmFsdWVGcm9tKHByb2dyYW1Bcmd1bWVudHNUZXh0KSk7Ci0KLQkJLyoKLQkJICogT2JzZXJ2ZXIKLQkJICovCi0JCWludCBzZWxlY3Rpb24gPSBvYnNlcnZlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSAtMSkgewotCQkJc2VsZWN0aW9uID0gMDsKLQkJfQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX09VVFBVVF9PQlNFUlZFUiwgKFN0cmluZylvYnNlcnZlcklEcy5nZXQoc2VsZWN0aW9uKSk7Ci0JCQotCQkvKgotCQkgKiBCYXNoIGNvbW1hbmQgZmllbGRzCi0JCSAqLwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX0JFRk9SRV9DT01NQU5ELCBiZWZvcmVDb21tYW5kVGV4dC5nZXRUZXh0KCkpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJUmVtb3RlTGF1bmNoQXR0cmlidXRlcy5BVFRSX0FGVEVSX0NPTU1BTkQsIGFmdGVyQ29tbWFuZFRleHQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgaW4gdGhlIHRleHQgd2lkZ2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBlbXB0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRleHQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlRnJvbShUZXh0IHRleHQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJcmV0dXJuIGNvbnRlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuTGF1bmNoZXJFeGVjdXRpb25UYWJfVGFiX1RpdGxlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL01lc3NhZ2VzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzBiZjk3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudWkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlckV4ZWN1dGlvblRhYl9Bcmd1bWVudHNGcmFtZV9Db21tYW5kTGluZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfQXJndW1lbnRzRnJhbWVfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlckV4ZWN1dGlvblRhYl9PYnNlcnZlckZyYW1lX0Jhc2hDb21tYW5kc0FmdGVyTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlckV4ZWN1dGlvblRhYl9PYnNlcnZlckZyYW1lX0Jhc2hDb21tYW5kc0JlZm9yZUxBYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9PYnNlcnZlckNvbWJvX0RlZmF1bHROb25lT3B0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9QYXJzZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlckV4ZWN1dGlvblRhYl9UYWJfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hlckV4ZWN1dGlvblRhYl9WYWxpZGF0aW9uX09ic2VydmVyQW5kTm9Db25zb2xlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0FkZEZpbGVEaWFsb2dfTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfRmlsZVN5c3RlbUJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19EZXN0aW5hdGlvbkZyYW1lX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0Rlc3RpbmF0aW9uRnJhbWVfV29ya3NwYWNlQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0RpcmVjdG9yeURpYWxvZ19NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0RpcmVjdG9yeURpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19FZGl0RmlsZURpYWxvZ19NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0ZpbGVMaXN0RnJhbWVfQWRkQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX0ZpbGVMaXN0RnJhbWVfRWRpdEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX1JlbW92ZUJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlQ29tYm9fT3ZlcndyaXRlQWx3YXlzT3B0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVJZk5ld2VyT3B0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfUHJlc2VydmVUaW1lU3RhbXBDaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfUmVhZG9ubHlDaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25sb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3dubG9hZFJ1bGVEaWFsb2dfV29ya3NwYWNlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRGVzdGluYXRpb25NaXNzaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0ZpbGVMaXN0U2VwYXJhdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Zyb21MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9NdWx0aXBsZUZpbGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX05vRmlsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT25lRmlsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc19QcmVzZXJ2ZVRpbWVTdGFtcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX1JlYWRvbmx5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zU2VwYXJhdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX1R5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX0RvbnRLbm93UnVsZVR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfRG93bmxvYWRSdWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfRWRpdFNlbGVjdGVkUnVsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX05ld1VwbG9hZFJ1bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19SZW1vdmVTZWxlY3RlZFJ1bGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfRG93bmxvYWRFbmFibGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfVXBsb2FkRW5hYmxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVGFiX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1RhYl9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRGVzdGluYXRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRGVzdGluYXRpb25TZXBhcmF0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0ZpbGVMaXN0U2VwYXJhdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9Gcm9tTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX011bHRpcGxlRmlsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX05vRmlsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09uZUZpbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfRG93bmxvYWRCYWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfUHJlc2VydmVUaW1lU3RhbXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfUmVhZG9ubHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9BZGREaXJlY3RvcnlCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkRmlsZXNCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkV29ya3NwYWNlQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9SZW1vdmVGaWxlc0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZERpcmVjdG9yeURpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZEZpbGVEaWFsb2dfRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9BZGRGaWxlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfRG93bmxvYWRCYWNrQ2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9FeGVjdXRhYmxlQ2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVJZk5ld2VyT3B0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlQ29tYm9fT3ZlcndyaXRlT3B0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlQ29tYm9fU2tpcE9wdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfUHJlc2VydmVUaW1lU3RhbXBDaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1JlYWRvbmx5Q2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfUmVtb3RlRGlyZWN0b3J5RnJhbWVfTGFiZWxEZWZhdWx0QnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9MYWJlbERpcmVjdG9yeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwbG9hZFJ1bGVEaWFsb2dfUmVtb3RlRGlyZWN0b3J5RnJhbWVfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGxvYWRSdWxlRGlhbG9nX1RpdGxlOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL1J1bGVEaWFsb2dGYWN0b3J5LmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9SdWxlRGlhbG9nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDgyMTJlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL1J1bGVEaWFsb2dGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLkRvd25sb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5JU3luY2hyb25pemF0aW9uUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5VcGxvYWRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBjbGFzcyBSdWxlRGlhbG9nRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBkaWFsb2cgdGhhdCBpcyBhYmxlIHRvIGVkaXQgYSBydWxlLgotCSAqIEBwYXJhbSBzaGVsbCBUaGUgU1dUIHNoZWxsIGZvciB0aGUgZGlhbG9nCi0JICogQHBhcmFtIHJ1bGUgVGhlIHJ1bGUgdG8gZWRpdAotCSAqIEByZXR1cm4gVGhlIGRpYWxvZyBvciBudWxsIGlmIG5vIGRpYWxvZyBpcyBrbm93biBmb3IgdGhlIHJ1bGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFsb2cgY3JlYXRlRGlhbG9nRm9yUnVsZShTaGVsbCBzaGVsbCwgSVN5bmNocm9uaXphdGlvblJ1bGUgcnVsZSkgewotCQlpZiAocnVsZSBpbnN0YW5jZW9mIERvd25sb2FkUnVsZSkgewotCQkJRG93bmxvYWRSdWxlIGRvd25sb2FkUnVsZSA9IChEb3dubG9hZFJ1bGUpIHJ1bGU7Ci0JCQlyZXR1cm4gbmV3IERvd25sb2FkUnVsZURpYWxvZyhzaGVsbCwgZG93bmxvYWRSdWxlKTsKLQkJfSBlbHNlIGlmIChydWxlIGluc3RhbmNlb2YgVXBsb2FkUnVsZSkgewotCQkJVXBsb2FkUnVsZSB1cGxvYWRSdWxlID0gKFVwbG9hZFJ1bGUpIHJ1bGU7Ci0JCQlyZXR1cm4gbmV3IFVwbG9hZFJ1bGVEaWFsb2coc2hlbGwsIHVwbG9hZFJ1bGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9TeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvU3luY2hyb25pemF0aW9uUnVsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg3ODdlYi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9TeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyLmNvcmUuTGludXhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLkRvd25sb2FkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIuZGF0YS5VcGxvYWRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1jbGFzcyBTeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQlJbWFnZSB1cGxvYWRSdWxlSW1hZ2UgPSBudWxsOwotCUltYWdlIGRvd25sb2FkUnVsZUltYWdlID0gbnVsbDsKLQkKLQlTdHJpbmcgcmVtb3RlV29ya2luZ0RpcjsKLQotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25SdWxlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVdvcmtpbmdEaXIoKSB7Ci0JCXJldHVybiByZW1vdGVXb3JraW5nRGlyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW90ZVdvcmtpbmdEaXIoU3RyaW5nIHJlbW90ZVdvcmtpbmdEaXIpIHsKLQkJdGhpcy5yZW1vdGVXb3JraW5nRGlyID0gcmVtb3RlV29ya2luZ0RpcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb3dubG9hZFJ1bGUpIHsKLQkJCXJldHVybiBkb3dubG9hZFJ1bGVJbWFnZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRG93bmxvYWRSdWxlKSB7Ci0JCQlyZXR1cm4gdXBsb2FkUnVsZUltYWdlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb3dubG9hZFJ1bGUpIHsKLQkJCURvd25sb2FkUnVsZSBydWxlID0gKERvd25sb2FkUnVsZSkgZWxlbWVudDsKLQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfVHlwZTsKLQkJCWlmIChydWxlLmdldFJlbW90ZUZpbGVDb3VudCgpID09IDApIHsKLQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX05vRmlsZXM7Ci0JCQl9IGVsc2UgaWYgKHJ1bGUuZ2V0UmVtb3RlRmlsZUNvdW50KCkgPT0gMSkgewotCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT25lRmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ICs9IE5MUy5iaW5kKE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9NdWx0aXBsZUZpbGVzLCBuZXcgSW50ZWdlcihydWxlLmdldFJlbW90ZUZpbGVDb3VudCgpKSk7Ci0JCQl9Ci0JCQlpZiAocnVsZS5nZXRSZW1vdGVGaWxlQ291bnQoKSA+PSAxKSB7Ci0JCQkJcmVzdWx0ICs9ICdcbicgKyBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRnJvbUxhYmVsOwotCQkJCVN0cmluZyBmaWxlc1tdID0gcnVsZS5nZXRSZW1vdGVGaWxlc0FzU3RyaW5nQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmIChpICE9IDApIGZpbGUgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0ZpbGVMaXN0U2VwYXJhdG9yOwotCQkJCQlyZXN1bHQgKz0gZmlsZTsKLQkJCQl9Ci0JCQkJcmVzdWx0ICs9ICdcbic7Ci0JCQkJaWYgKHJ1bGUuZ2V0TG9jYWxEaXJlY3RvcnkoKSA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRGVzdGluYXRpb25NaXNzaW5nOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRGVzdGluYXRpb25MYWJlbCArIHJ1bGUuZ2V0TG9jYWxEaXJlY3RvcnkoKTsJCQkJCQkJCi0JCQkJfQotCQkJCWlmIChydWxlLmlzQXNFeGVjdXRhYmxlKCkgfHwgcnVsZS5pc0FzUmVhZE9ubHkoKSB8fCBydWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSkgewkJCQkJCQlyZXN1bHQgKz0gJ1xuJyArIE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zTGFiZWw7CQkJCi0JCQkJCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLQkJCQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSkgewotCQkJCQkJaWYgKGNvbW1hKSByZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNTZXBhcmF0b3I7IGVsc2UgY29tbWEgPSB0cnVlOwotCQkJCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU7Ci0JCQkJCX0KLQkJCQkJaWYgKHJ1bGUuaXNBc1JlYWRPbmx5KCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zU2VwYXJhdG9yOyBlbHNlIGNvbW1hID0gdHJ1ZTsKLQkJCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc19SZWFkb25seTsJCQkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmIChydWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSkgewotCQkJCQkJaWYgKGNvbW1hKSByZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNTZXBhcmF0b3I7IGVsc2UgY29tbWEgPSB0cnVlOwotCQkJCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX1ByZXNlcnZlVGltZVN0YW1wOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVXBsb2FkUnVsZSkgewotCQkJVXBsb2FkUnVsZSBydWxlID0gKFVwbG9hZFJ1bGUpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9UeXBlOwotCQkJaWYgKHJ1bGUuZ2V0UmVtb3RlRmlsZUNvdW50KCkgPT0gMCkgewotCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX05vRmlsZXM7Ci0JCQl9IGVsc2UgaWYgKHJ1bGUuZ2V0UmVtb3RlRmlsZUNvdW50KCkgPT0gMSkgewotCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09uZUZpbGU7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCArPSBOTFMuYmluZChNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX011bHRpcGxlRmlsZXMsIG5ldyBJbnRlZ2VyKHJ1bGUuZ2V0UmVtb3RlRmlsZUNvdW50KCkpICk7Ci0JCQl9Ci0JCQlpZiAocnVsZS5nZXRSZW1vdGVGaWxlQ291bnQoKSA+PSAxKSB7Ci0JCQkJcmVzdWx0ICs9ICdcbicgKyBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0Zyb21MYWJlbDsKLQkJCQlTdHJpbmcgZmlsZXNbXSA9IHJ1bGUuZ2V0TG9jYWxGaWxlc0FzU3RyaW5nQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmIChpICE9IDApIGZpbGUgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9GaWxlTGlzdFNlcGFyYXRvcjsKLQkJCQkJcmVzdWx0ICs9IGZpbGU7Ci0JCQkJfQotCQkJCXJlc3VsdCArPSAnXG4nOwotCQkJCWlmICgocnVsZS5nZXRSZW1vdGVEaXJlY3RvcnkoKSA9PSBudWxsKSB8fCBydWxlLmlzRGVmYXVsdFJlbW90ZURpcmVjdG9yeSgpKSB7Ci0JCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0Rlc3RpbmF0aW9uTGFiZWwrcmVtb3RlV29ya2luZ0RpcjsKLQkJCQl9IGVsc2UgewotCQkJCQlJUGF0aCByZW1vdGVXb3JraW5nUGF0aCA9IG5ldyBQYXRoKHJlbW90ZVdvcmtpbmdEaXIpOwotCQkJCQlJUGF0aCByZW1vdGVQYXRoID0gbmV3IFBhdGgocnVsZS5nZXRSZW1vdGVEaXJlY3RvcnkoKSk7Ci0JCQkJCWlmICghIHJlbW90ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQlyZW1vdGVQYXRoID0gcmVtb3RlV29ya2luZ1BhdGguYXBwZW5kKHJlbW90ZVBhdGgpOwotCQkJCQl9Ci0JCQkJCXJlc3VsdCArPSBNZXNzYWdlcy5FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX0Rlc3RpbmF0aW9uTGFiZWwrTGludXhQYXRoLnRvU3RyaW5nKHJlbW90ZVBhdGgpOwotCQkJCX0KLQkJCQlpZiAocnVsZS5pc0FzRXhlY3V0YWJsZSgpIHx8IHJ1bGUuaXNBc1JlYWRPbmx5KCkgfHwgcnVsZS5pc1ByZXNlcnZlVGltZVN0YW1wKCkgfHwgcnVsZS5pc0Rvd25sb2FkQmFjaygpKSB7Ci0JCQkJCXJlc3VsdCArPSAnXG4nICsgTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zTGFiZWw7CQkJCi0JCQkJCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLQkJCQkJaWYgKHJ1bGUuaXNBc0V4ZWN1dGFibGUoKSkgewotCQkJCQkJaWYgKGNvbW1hKSByZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvblNlcGFyYXRvcjsgZWxzZSBjb21tYSA9IHRydWU7Ci0JCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU7Ci0JCQkJCX0KLQkJCQkJaWYgKHJ1bGUuaXNBc1JlYWRPbmx5KCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRGVzdGluYXRpb25TZXBhcmF0b3I7IGVsc2UgY29tbWEgPSB0cnVlOwotCQkJCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc19SZWFkb25seTsJCQkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmIChydWxlLmlzUHJlc2VydmVUaW1lU3RhbXAoKSkgewotCQkJCQkJaWYgKGNvbW1hKSByZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvblNlcGFyYXRvcjsgZWxzZSBjb21tYSA9IHRydWU7Ci0JCQkJCQlyZXN1bHQgKz0gTWVzc2FnZXMuRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX1ByZXNlcnZlVGltZVN0YW1wOwotCQkJCQl9Ci0JCQkJCWlmIChydWxlLmlzRG93bmxvYWRCYWNrKCkpIHsKLQkJCQkJCWlmIChjb21tYSkgcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRGVzdGluYXRpb25TZXBhcmF0b3I7IGVsc2UgY29tbWEgPSB0cnVlOwotCQkJCQkJcmVzdWx0ICs9IE1lc3NhZ2VzLkVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc19Eb3dubG9hZEJhY2s7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwkJCQkJCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh1cGxvYWRSdWxlSW1hZ2UgIT0gbnVsbCkgdXBsb2FkUnVsZUltYWdlLmRpc3Bvc2UoKTsKLQkJaWYgKGRvd25sb2FkUnVsZUltYWdlICE9IG51bGwpIGRvd25sb2FkUnVsZUltYWdlLmRpc3Bvc2UoKTsKLQkJdXBsb2FkUnVsZUltYWdlID0gbnVsbDsKLQkJZG93bmxvYWRSdWxlSW1hZ2UgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvVXBsb2FkUnVsZURpYWxvZy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdWkvVXBsb2FkUnVsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2VmZjNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL1VwbG9hZFJ1bGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci51aTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLklTeW5jaHJvbml6YXRpb25SdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLk92ZXJ3cml0ZVBvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5kYXRhLlVwbG9hZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5Db21ib0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQ29tYm9Nb2xkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuQ29udHJvbHNSZWxhdGlvbnNoaXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5GcmFtZU1vbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5UZXh0R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLnN3dC5UZXh0TW9sZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nOwotCi0KLXB1YmxpYyBjbGFzcyBVcGxvYWRSdWxlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIGltcGxlbWVudHMgSVJ1bGVEaWFsb2cgewotCi0JQ29tcG9zaXRlIGNvbnRlbnQ7Ci0JQnV0dG9uIGRlZmF1bHRSZW1vdGVEaXJlY3RvcnlCdXR0b247Ci0JQ29udHJvbHNSZWxhdGlvbnNoaXBIYW5kbGVyIHJlbW90ZURpcmVjdG9yeVJlbGF0aW9uc2hpcEhhbmRsZXI7Ci0JVGV4dEdyb3VwIHJlbW90ZURpcmVjdG9yeVRleHQ7Ci0JQnV0dG9uIGFzUmVhZE9ubHlCdXR0b24sIGFzRXhlY3V0YWJsZUJ1dHRvbjsKLQlCdXR0b24gZG93bmxvYWRCYWNrQnV0dG9uLCBwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbjsKLQlDb21ib0dyb3VwIG92ZXJ3cml0ZVBvbGljeUNvbWJvOwotCUJ1dHRvbiByZW1vdmVGaWxlc0J1dHRvbjsKLQlCdXR0b24gYWRkRmlsZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbjsKLQlCdXR0b24gYWRkRGlyZWN0b3JpZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbjsKLQlCdXR0b24gYWRkRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uOwotCUxpc3QgZmlsZUxpc3Q7Ci0JCi0JVXBsb2FkUnVsZSB1cGxvYWRSdWxlOwotCQotCUlQYXRoIGxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQlwcml2YXRlIGludCBsaXN0ZW5lcnNFbmFibGVkID0gMDsKLQkKLQlwdWJsaWMgVXBsb2FkUnVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVXBsb2FkUnVsZSBydWxlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJCi0JCXVwbG9hZFJ1bGUgPSBydWxlOwotCX0KLQkKLS8vCXB1YmxpYyBVcGxvYWRSdWxlRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0vLwkJc3VwZXIoc2hlbGwpOwotLy8JCXVwbG9hZFJ1bGUgPSBuZXcgVXBsb2FkUnVsZSgpOwotLy8JCS8vIHNldCBkZWZhdWx0cwotLy8JCXVwbG9hZFJ1bGUuc2V0RGVmYXVsdFJlbW90ZURpcmVjdG9yeSh0cnVlKTsKLS8vCQl1cGxvYWRSdWxlLnNldFJlbW90ZURpcmVjdG9yeShudWxsKTsKLS8vCQl1cGxvYWRSdWxlLnNldE92ZXJ3cml0ZVBvbGljeShPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVMpOwotLy8JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLS8vCQlMYXlvdXQgbCA9IGNvbnRlbnQuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0KCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJc2V0VGl0bGUoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19UaXRsZSk7Ci0JCXNldE1lc3NhZ2UoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19NZXNzYWdlKTsKLQkJCi0JCWNyZWF0ZVJlbW90ZURpcmVjdG9yeUNvbXBvc2l0ZShjb250ZW50KTsKLQkJY3JlYXRlRmlsZXNDb21wb3NpdGUoY29udGVudCk7Ci0JCWNyZWF0ZU9wdGlvbnNDb21wb3NpdGUoY29udGVudCk7Ci0JCQotCQlwdXRGaWVsZENvbnRlbnRzKCk7Ci0JCQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHV0RmllbGRDb250ZW50cygpIHsKLQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQlkZWZhdWx0UmVtb3RlRGlyZWN0b3J5QnV0dG9uLnNldFNlbGVjdGlvbih1cGxvYWRSdWxlLmlzRGVmYXVsdFJlbW90ZURpcmVjdG9yeSgpKTsKLQkJcmVtb3RlRGlyZWN0b3J5UmVsYXRpb25zaGlwSGFuZGxlci5tYW5hZ2VEZXBlbmRlbnRDb250cm9scyhkZWZhdWx0UmVtb3RlRGlyZWN0b3J5QnV0dG9uKTsKLQkJaWYgKHVwbG9hZFJ1bGUuZ2V0UmVtb3RlRGlyZWN0b3J5KCkgIT0gbnVsbCkgewotCQkJcmVtb3RlRGlyZWN0b3J5VGV4dC5zZXRTdHJpbmcodXBsb2FkUnVsZS5nZXRSZW1vdGVEaXJlY3RvcnkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdGVEaXJlY3RvcnlUZXh0LnNldFN0cmluZygiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc1JlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbih1cGxvYWRSdWxlLmlzQXNSZWFkT25seSgpKTsgCi0JCWFzRXhlY3V0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odXBsb2FkUnVsZS5pc0FzRXhlY3V0YWJsZSgpKTsKLQkJZG93bmxvYWRCYWNrQnV0dG9uLnNldFNlbGVjdGlvbih1cGxvYWRSdWxlLmlzRG93bmxvYWRCYWNrKCkpOyAKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0U2VsZWN0aW9uKHVwbG9hZFJ1bGUuaXNQcmVzZXJ2ZVRpbWVTdGFtcCgpKTsKLQkJb3ZlcndyaXRlUG9saWN5Q29tYm8uc2VsZWN0SW5kZXhVc2luZ0lEKEludGVnZXIudG9TdHJpbmcodXBsb2FkUnVsZS5nZXRPdmVyd3JpdGVQb2xpY3koKSkpOwotCQlTdHJpbmcgaXRlbXNbXSA9IHVwbG9hZFJ1bGUuZ2V0TG9jYWxGaWxlc0FzU3RyaW5nQXJyYXkoKTsKLQkJQXJyYXlzLnNvcnQoaXRlbXMpOwotCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCWVuYWJsZUxpc3RlbmVycygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5hYmxlTGlzdGVuZXJzKCkgewotCQlsaXN0ZW5lcnNFbmFibGVkICsrOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2FibGVMaXN0ZW5lcnMoKSB7Ci0JCWxpc3RlbmVyc0VuYWJsZWQtLTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmV0Y2hGaWVsZENvbnRlbnRzKCkgewotCQlkaXNhYmxlTGlzdGVuZXJzKCk7Ci0JCXVwbG9hZFJ1bGUuc2V0RGVmYXVsdFJlbW90ZURpcmVjdG9yeShkZWZhdWx0UmVtb3RlRGlyZWN0b3J5QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJdXBsb2FkUnVsZS5zZXRSZW1vdGVEaXJlY3RvcnkocmVtb3RlRGlyZWN0b3J5VGV4dC5nZXRTdHJpbmcoKSk7Ci0JCXVwbG9hZFJ1bGUuc2V0QXNFeGVjdXRhYmxlKGFzRXhlY3V0YWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVwbG9hZFJ1bGUuc2V0QXNSZWFkT25seShhc1JlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJdXBsb2FkUnVsZS5zZXREb3dubG9hZEJhY2soZG93bmxvYWRCYWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJdXBsb2FkUnVsZS5zZXRQcmVzZXJ2ZVRpbWVTdGFtcChwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVwbG9hZFJ1bGUuc2V0T3ZlcndyaXRlUG9saWN5KEludGVnZXIucGFyc2VJbnQob3ZlcndyaXRlUG9saWN5Q29tYm8uZ2V0U2VsZWN0aW9uSWQoKSkpOwotCQl1cGxvYWRSdWxlLnNldExvY2FsRmlsZXMoZmlsZUxpc3QuZ2V0SXRlbXMoKSk7Ci0JCVN0cmluZyBwYXRoID1yZW1vdGVEaXJlY3RvcnlUZXh0LmdldFN0cmluZygpLnRyaW0oKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQl1cGxvYWRSdWxlLnNldFJlbW90ZURpcmVjdG9yeShwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCXVwbG9hZFJ1bGUuc2V0UmVtb3RlRGlyZWN0b3J5KG51bGwpOwotCQl9Ci0JCWVuYWJsZUxpc3RlbmVycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWZldGNoRmllbGRDb250ZW50cygpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVSZW1vdGVEaXJlY3RvcnlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZShwYXJlbnQsIE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfUmVtb3RlRGlyZWN0b3J5RnJhbWVfVGl0bGUpOwotCQlDb21wb3NpdGUgY29udGVudHMgPSBmcmFtZS5nZXRDb21wb3NpdGUoKTsKLQotCQlkZWZhdWx0UmVtb3RlRGlyZWN0b3J5QnV0dG9uID0gbmV3IEJ1dHRvbihjb250ZW50cywgU1dULkNIRUNLKTsKLQkJZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfUmVtb3RlRGlyZWN0b3J5RnJhbWVfTGFiZWxEZWZhdWx0QnV0dG9uKTsKLQkJZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJVGV4dE1vbGQgbW9sZCA9IG5ldyBUZXh0TW9sZChUZXh0TW9sZC5HUklEX0RBVEFfR1JBQl9FWENFU1NfU1BBQ0UgfCBUZXh0TW9sZC5HUklEX0RBVEFfQUxJR05NRU5UX0ZJTEwsIE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfUmVtb3RlRGlyZWN0b3J5RnJhbWVfTGFiZWxEaXJlY3RvcnkpOwotCQlyZW1vdGVEaXJlY3RvcnlUZXh0ID0gbmV3IFRleHRHcm91cChjb250ZW50cywgbW9sZCk7Ci0KLQkJcmVtb3RlRGlyZWN0b3J5UmVsYXRpb25zaGlwSGFuZGxlciA9IG5ldyBDb250cm9sc1JlbGF0aW9uc2hpcEhhbmRsZXIoZGVmYXVsdFJlbW90ZURpcmVjdG9yeUJ1dHRvbiwgbmV3IENvbnRyb2xbXSB7cmVtb3RlRGlyZWN0b3J5VGV4dH0sIGZhbHNlKTsKLQkJcmV0dXJuIHJlbW90ZURpcmVjdG9yeVRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRmlsZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGcmFtZU1vbGQgZnJhbWVNb2xkID0gbmV3IEZyYW1lTW9sZCgpOwotCQlmcmFtZU1vbGQuc2V0Q29sdW1ucygyKTsKLQkJZnJhbWVNb2xkLnNldFRpdGxlKE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9UaXRsZSk7Ci0JCUZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKHBhcmVudCwgZnJhbWVNb2xkKTsKLQkJZnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlGcmFtZSBmaWxlc0ZyYW1lID0gbmV3IEZyYW1lKGZyYW1lLmdldENvbXBvc2l0ZSgpKTsKLQkJZmlsZUxpc3QgPSBuZXcgTGlzdChmaWxlc0ZyYW1lLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQ9MjAwOwotCQlmaWxlTGlzdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZmlsZUxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQlyZW1vdmVGaWxlc0J1dHRvbi5zZXRFbmFibGVkKGZpbGVMaXN0LmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMCk7Ci0JCQl9Ci0JCX0pOwotCQlmaWxlTGlzdC5kZXNlbGVjdEFsbCgpOwotCQkKLQkJRnJhbWUgYnV0dG9uRnJhbWUgPSBuZXcgRnJhbWUoZnJhbWUuZ2V0Q29tcG9zaXRlKCkpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChidXR0b25GcmFtZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9EZXNjcmlwdGlvbik7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlhZGRGaWxlc0Zyb21GaWxlc3lzdGVtQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25GcmFtZSwgU1dULlBVU0gpOwotCQlhZGRGaWxlc0Zyb21GaWxlc3lzdGVtQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX0FkZEZpbGVzQnV0dG9uKTsKLQkJYWRkRmlsZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJYWRkRmlsZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkgcmV0dXJuOwotCQkJCWhhbmRsZUZpbGVzRnJvbUZpbGVzeXN0ZW1CdXR0b25FdmVudCgpOwotCQkJfQkJCQotCQl9KTsKLQkJYWRkRGlyZWN0b3JpZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJYWRkRGlyZWN0b3JpZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9BZGREaXJlY3RvcnlCdXR0b24pOwotCQlhZGREaXJlY3Rvcmllc0Zyb21GaWxlc3lzdGVtQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlhZGREaXJlY3Rvcmllc0Zyb21GaWxlc3lzdGVtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKSByZXR1cm47Ci0JCQkJaGFuZGxlRGlyZWN0b3J5RnJvbUZpbGVzeXN0ZW1CdXR0b25FdmVudCgpOwotCQkJfQkJCQotCQl9KTsKLQkJYWRkRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25GcmFtZSwgU1dULlBVU0gpOwotCQlhZGRGaWxlc0Zyb21Xb3Jrc3BhY2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkV29ya3NwYWNlQnV0dG9uKTsKLQkJYWRkRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlhZGRGaWxlc0Zyb21Xb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdGVuZXJzRW5hYmxlZCA8IDApIHJldHVybjsKLQkJCQloYW5kbGVGaWxlc0Zyb21Xb3Jrc3BhY2VCdXR0b25FdmVudCgpOwotCQkJfQotCQl9KTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uRnJhbWUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfUmVtb3ZlRmlsZXNMYWJlbCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVGaWxlc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uRnJhbWUsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfUmVtb3ZlQnV0dG9uKTsKLQkJcmVtb3ZlRmlsZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUZpbGVzQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVGaWxlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChsaXN0ZW5lcnNFbmFibGVkIDwgMCkKLQkJCQkJcmV0dXJuOwotCQkJCWhhbmRsZVJlbW92ZUZpbGVzQnV0dG9uRXZlbnQoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWJ1dHRvbkZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJCi0JCXJldHVybiBmcmFtZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVPcHRpb25zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRnJhbWVNb2xkIGZyYW1lTW9sZCA9IG5ldyBGcmFtZU1vbGQoKTsKLQkJZnJhbWVNb2xkLnNldENvbHVtbnMoMik7Ci0JCWZyYW1lTW9sZC5hZGRPcHRpb24oRnJhbWVNb2xkLkNPTFVNTlNfRVFVQUxfV0lEVEgpOwotCQlmcmFtZU1vbGQuc2V0VGl0bGUoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfVGl0bGUpOwotCQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZShwYXJlbnQsIGZyYW1lTW9sZCk7Ci0JCWZyYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gZnJhbWUuZ2V0Q29tcG9zaXRlKCk7Ci0JCWFzUmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuQ0hFQ0spOwotCQlhc1JlYWRPbmx5QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfUmVhZG9ubHlDaGVjayk7Ci0JCWFzRXhlY3V0YWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGVudHMsIFNXVC5DSEVDSyk7Ci0JCWFzRXhlY3V0YWJsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjayk7Ci0JCWRvd25sb2FkQmFja0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGVudHMsIFNXVC5DSEVDSyk7Ci0JCWRvd25sb2FkQmFja0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0Rvd25sb2FkQmFja0NoZWNrKTsKLQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRlbnRzLCBTV1QuQ0hFQ0spOwotCQlwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2spOwotCQkKLQkJQ29tYm9Nb2xkIG1vbGQgPSBuZXcgQ29tYm9Nb2xkKENvbWJvTW9sZC5HUklEX0RBVEFfU1BBTik7Ci0JCW1vbGQuc2V0TGFiZWwoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfT3ZlcndyaXRlTGFiZWwpOwotCQltb2xkLnNldFRleHRGaWVsZFdpZHRoKDQwKTsKLQkJbW9sZC5hZGRJdGVtKEludGVnZXIudG9TdHJpbmcoT3ZlcndyaXRlUG9saWNpZXMuU0tJUCksIE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX1NraXBPcHRpb24pOwotCQltb2xkLmFkZEl0ZW0oSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5BTFdBWVMpLCBNZXNzYWdlcy5VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVPcHRpb24pOwotCQltb2xkLmFkZEl0ZW0oSW50ZWdlci50b1N0cmluZyhPdmVyd3JpdGVQb2xpY2llcy5ORVdFUiksIE1lc3NhZ2VzLlVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUlmTmV3ZXJPcHRpb24pOwotCQlvdmVyd3JpdGVQb2xpY3lDb21ibyA9IG5ldyBDb21ib0dyb3VwKGNvbnRlbnRzLCBtb2xkKTsKLQkJb3ZlcndyaXRlUG9saWN5Q29tYm8uZ2V0Q29tYm8oKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc0VuYWJsZWQgPCAwKQotCQkJCQlyZXR1cm47Ci0JCQkJZGlzYWJsZUxpc3RlbmVycygpOwotCQkJCWlmIChvdmVyd3JpdGVQb2xpY3lDb21iby5nZXRTZWxlY3Rpb25JZCgpLmVxdWFscyhJbnRlZ2VyLnRvU3RyaW5nKE92ZXJ3cml0ZVBvbGljaWVzLk5FV0VSKSkpIHsKLQkJCQkJcHJlc2VydmVUaW1lU3RhbXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXByZXNlcnZlVGltZVN0YW1wQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmVzZXJ2ZVRpbWVTdGFtcEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwkJCQkJCi0JCQkJfQotCQkJCWVuYWJsZUxpc3RlbmVycygpOwotCQkJfQotCQkJCi0JCX0pOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCQotCWNsYXNzIFBhdGhJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJSXRlcmF0b3IgaW50ZXJuYWxJdGVyYXRvcjsKLQkJCi0JCXB1YmxpYyBQYXRoSXRlcmF0b3IoSXRlcmF0b3IgaW50ZXJuYWxJdGVyYXRvcikgewotCQkJdGhpcy5pbnRlcm5hbEl0ZXJhdG9yID0gaW50ZXJuYWxJdGVyYXRvcjsKLQkJfQotCQkKLQkJcHVibGljIFBhdGhJdGVyYXRvcihTdHJpbmcgW10gYXJyYXkpIHsKLQkJCXRoaXMuaW50ZXJuYWxJdGVyYXRvciA9IEFycmF5cy5hc0xpc3QoYXJyYXkpLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgUGF0aEl0ZXJhdG9yKGphdmEudXRpbC5MaXN0IGxpc3QpIHsKLQkJCXRoaXMuaW50ZXJuYWxJdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaW50ZXJuYWxJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aCgoU3RyaW5nKWludGVybmFsSXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaW50ZXJuYWxJdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRmlsZXNGcm9tRmlsZXN5c3RlbUJ1dHRvbkV2ZW50KCkgewotCQlGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuT1BFTiB8IFNXVC5NVUxUSSk7Ci0KLQkJLyoKLQkJICogRmlsdGVyIHBhdGggbXVzdCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmaWxlLgotCQkgKi8KLQkJZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RTZWxlY3RlZERpcmVjdG9yeS50b09TU3RyaW5nKCkpOwotCQlmaWxlRGlhbG9nLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRmlsZURpYWxvZ19UaXRsZSk7Ci0JCQkJCi0JCVN0cmluZyByZXN1bHQgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCWxhc3RTZWxlY3RlZERpcmVjdG9yeSA9IG5ldyBQYXRoKGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLQkJCS8qCi0JCQkgKiBPbmx5IGFkZCBmaWxlcyB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4KLQkJCSAqIElmIGZpbGUgaXMgaW5zaWRlIHRoZSB3b3Jrc3BhY2UsIGFkZCByZWxhdGl2ZSBwYXRoLgotCQkJICovCi0JCQlJUGF0aCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCQlJUGF0aCBmaWxlUm9vdCA9IG5ldyBQYXRoKGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLQkJCUhhc2hTZXQgZmlsZVNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZmlsZUxpc3QuZ2V0SXRlbXMoKSkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IFBhdGhJdGVyYXRvcihmaWxlRGlhbG9nLmdldEZpbGVOYW1lcygpKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiBub3QgYWJzb2x1dGUsIHRoZSBtYWtlIGl0IGFic29sdXRlIGFjY29yZGluZyB0byBwYXRoIGluIGRpYWxvZy4KLQkJCQkgKiBUaGlzIGlzIGR1ZSBiZWhhdmlvdXIgaG93IEZpbGVEaWFsb2cgcmV0dXJucyBzZWxlY3RlZCBmaWxlcy4KLQkJCQkgKi8KLQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoISBwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQlwYXRoID0gZmlsZVJvb3QuYXBwZW5kKHBhdGgpOwotCQkJCX0KLQkJCQkKLQkJCQkvKgotCQkJCSAqIElmIHBhdGggaXMgaW5zaWRlIHRoZSB3b3Jrc3BhY2UsIHRoZW4gbWFrZSBpdCByZWxhdGl2ZS4KLQkJCQkgKi8KLQkJCQlpZiAod29ya3NwYWNlLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh3b3Jrc3BhY2Uuc2VnbWVudENvdW50KCkpOwotCQkJCQlwYXRoID0gcGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyoKLQkJCQkgKiBJZiBhbHJlYWR5IGluIHRoZSBsaXN0LCB0aGUgaWdub3JlLgotCQkJCSAqLwotCQkJCVN0cmluZyBmdWxsUGF0aCA9IHBhdGgudG9PU1N0cmluZygpOwotCQkJCWlmICghIGZpbGVTZXQuY29udGFpbnMoZnVsbFBhdGgpKSB7Ci0JCQkJCWZpbGVTZXQuYWRkKGZ1bGxQYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBpdGVtc1tdID0gbmV3IFN0cmluZ1tmaWxlU2V0LnNpemUoKV07Ci0JCQlpdGVtcyA9IChTdHJpbmdbXSkgZmlsZVNldC50b0FycmF5KGl0ZW1zKTsKLQkJCUFycmF5cy5zb3J0KGl0ZW1zKTsKLQkJCWZpbGVMaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEaXJlY3RvcnlGcm9tRmlsZXN5c3RlbUJ1dHRvbkV2ZW50KCkgewotCQlEaXJlY3RvcnlEaWFsb2cgZGlyZWN0b3J5RGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQotCQlkaXJlY3RvcnlEaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0U2VsZWN0ZWREaXJlY3RvcnkudG9PU1N0cmluZygpKTsKLQkJZGlyZWN0b3J5RGlhbG9nLnNldFRleHQoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRGlyZWN0b3J5RGlhbG9nX1RpdGxlKTsKLQkJZGlyZWN0b3J5RGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRmlsZURpYWxvZ19EZXNjcmlwdGlvbik7Ci0KLQkJU3RyaW5nIG5ld1BhdGggPSBkaXJlY3RvcnlEaWFsb2cub3BlbigpOwotCi0JCWlmIChuZXdQYXRoICE9IG51bGwpIHsKLQkJCUhhc2hTZXQgZmlsZVNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZmlsZUxpc3QuZ2V0SXRlbXMoKSkpOwotCQkJSVBhdGggd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld1BhdGgpOwotCQkJCi0JCQkvKgotCQkJICogSWYgcGF0aCBpcyBpbnNpZGUgdGhlIHdvcmtzcGFjZSwgdGhlbiBtYWtlIGl0IHJlbGF0aXZlLgotCQkJICovCi0JCQlpZiAod29ya3NwYWNlLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHdvcmtzcGFjZS5zZWdtZW50Q291bnQoKSk7Ci0JCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiBJZiBhbHJlYWR5IGluIHRoZSBsaXN0LCB0aGUgaWdub3JlLgotCQkJICovCi0JCQlTdHJpbmcgZnVsbFBhdGggPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCWlmICghIGZpbGVTZXQuY29udGFpbnMoZnVsbFBhdGgpKSB7Ci0JCQkJZmlsZVNldC5hZGQoZnVsbFBhdGgpOwotCQkJCQotCQkJCVN0cmluZyBpdGVtc1tdID0gbmV3IFN0cmluZ1tmaWxlU2V0LnNpemUoKV07Ci0JCQkJaXRlbXMgPSAoU3RyaW5nW10pIGZpbGVTZXQudG9BcnJheShpdGVtcyk7Ci0JCQkJQXJyYXlzLnNvcnQoaXRlbXMpOwotCQkJCWZpbGVMaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqIFNhdmUgbGFzdFNlbGVjdGVkRGlyZWN0b3J5LiBUaGVyZSBpcyBhIGJ1ZyBpbiBEaXJlY3RvcnlEaWFsb2cuCi0JCQkgKiBUaGUgbWV0aG9kIGdldEZpbHRlclBhdGggZG9lcyBub3QgcmV0dXJuIHRoZSBleHBlY3RlZCBwYXRoLgotCQkJICogVGhlIGJ1ZyB3aWxsIGJlIGZpeGVkIGluIEVjbGlwc2UgMy40LgotCQkJICogVGhlIHdvcmthcm91bnQgdGFrZXMgdGhlIHBhcmVudCBvZiB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5IGFzIGxhc3RTZWxlY3RlZERpcmVjdG9yeS4KLQkJCSAqLwotCQkJbGFzdFNlbGVjdGVkRGlyZWN0b3J5ID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlsYXN0U2VsZWN0ZWREaXJlY3RvcnkgPSBsYXN0U2VsZWN0ZWREaXJlY3RvcnkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQotCVJlc291cmNlU2VsZWN0aW9uRGlhbG9nIHJlc291cmNlRGlhbG9nID0gbnVsbDsKLQlwcml2YXRlIHZvaWQgaGFuZGxlRmlsZXNGcm9tV29ya3NwYWNlQnV0dG9uRXZlbnQoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSBhIGxpc3QgYSByZXNvdXJjZSBmb3IgYWxsIHJlbGF0aXZlIHBhdGhzLiBUaGUgbXVzdCBiZSB2YWxpZCByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZS4KLQkJICogT3RoZXJ3aXNlLCB0aGV5IGFyZSBpZ25vcmVkIGFuZCByZW1vdmVkLgotCQkgKi8KLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUFycmF5TGlzdCByZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBQYXRoSXRlcmF0b3IoZmlsZUxpc3QuZ2V0SXRlbXMoKSk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZmluZE1lbWJlcihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VMaXN0LmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IGluaXRpYWxTZWxlY3Rpb25bXSA9IHJlc291cmNlTGlzdC50b0FycmF5KCk7Ci0JCQotCQkvKgotCQkgKiBTaG93IHRoZSBkaWFsb2cuCi0JCSAqLwotCQlpZiAocmVzb3VyY2VEaWFsb2cgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VEaWFsb2cgPSBuZXcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgbnVsbCk7Ci0JCX0KLQkJcmVzb3VyY2VEaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMoIGluaXRpYWxTZWxlY3Rpb24gKTsKLQkJcmVzb3VyY2VEaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXJlc291cmNlRGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX0Rlc2NyaXB0aW9uKTsKLQkJcmVzb3VyY2VEaWFsb2cuc2V0VGl0bGUoTWVzc2FnZXMuVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX1RpdGxlKTsKLQkJcmVzb3VyY2VEaWFsb2cub3BlbigpOwotCi0JCS8qCi0JCSAqIEdldCByZXN1bHRzIGFuZCB1cGRhdGVkIGxvY2FsIGZpbGVzLgotCQkgKi8KLQkJT2JqZWN0W10gcmVzdWx0cyA9IHJlc291cmNlRGlhbG9nLmdldFJlc3VsdCgpOwotCi0JCWlmIChyZXN1bHRzICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBGaWx0ZXIgb25seSBhYnNvbHV0ZSBwYXRoLiBSZWxhdGl2ZSBwYXRocyBhcmUgcmVtb3ZlZC4KLQkJCSAqLwotCQkJSGFzaFNldCBuZXdGaWxlTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgUGF0aEl0ZXJhdG9yKGZpbGVMaXN0LmdldEl0ZW1zKCkpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoISBwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJbmV3RmlsZUxpc3QuYWRkKHBhdGgudG9PU1N0cmluZygpKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEFkZCBpdGVtcyB0aGF0IGEgc2VsZWN0ZWQgaW4gdGhlIGRpYWxvZyBidXQgbm90IGluIHRoZSBmaWxlIGxpc3QuCi0JCQkgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc3VsdHNbaV07Ci0JCQkJU3RyaW5nIGVudHJ5ID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b09TU3RyaW5nKCk7Ci0JCQkJbmV3RmlsZUxpc3QuYWRkKGVudHJ5KTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGl0ZW1zW10gPSBuZXcgU3RyaW5nW25ld0ZpbGVMaXN0LnNpemUoKV07Ci0JCQlpdGVtcyA9IChTdHJpbmdbXSkgbmV3RmlsZUxpc3QudG9BcnJheShpdGVtcyk7Ci0JCQlBcnJheXMuc29ydChpdGVtcyk7Ci0JCQlmaWxlTGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUZpbGVzQnV0dG9uRXZlbnQoKSB7CQkKLQkJU3RyaW5nIHNlbGVjdGlvbiBbXSA9IGZpbGVMaXN0LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUhhc2hTZXQgZmlsZVNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZmlsZUxpc3QuZ2V0SXRlbXMoKSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0cmluZyA9IHNlbGVjdGlvbltpXTsKLQkJCWZpbGVTZXQucmVtb3ZlKHN0cmluZyk7Ci0JCX0KLQkJCi0JCVN0cmluZyBpdGVtc1tdID0gbmV3IFN0cmluZ1tmaWxlU2V0LnNpemUoKV07Ci0JCWl0ZW1zID0gKFN0cmluZ1tdKSBmaWxlU2V0LnRvQXJyYXkoaXRlbXMpOwotCQlBcnJheXMuc29ydChpdGVtcyk7Ci0JCWZpbGVMaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQl9Ci0KLQlwdWJsaWMgSVN5bmNocm9uaXphdGlvblJ1bGUgZ2V0UnVsZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdXBsb2FkUnVsZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmU1ZGQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9UYWJfTWVzc2FnZT1BZGQgc3luY2hyb25pemF0aW9uIHJ1bGVzIHRvIHVwbG9hZCBmaWxlcyBiZWZvcmUgdGhlIGxhdW5jaCBvciB0byBkb3dubG9hZCBmaWxlcyBhZnRlciB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcy4KLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9UaXRsZT1TeW5jaHJvbml6ZSBydWxlczoKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9EZXNjcmlwdGlvbj1VcGxvYWQgcnVsZXMgYXJlIGV4ZWN1dGVkIGJlZm9yZSBhcHBsaWNhdGlvbiBzdGFydHMuIERvd25sb2FkIHJ1bGVzIGFyZSBleGVjdXRlZCBhZnRlciBhcHBsaWNhdGlvbiBmaW5pc2hlcy4KLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9UeXBlPURPV05MT0FEIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX05vRmlsZXM9KG5vIGZpbGVzL2RpcmVjdG9yaWVzKQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09uZUZpbGU9MSBpdGVtIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX011bHRpcGxlRmlsZXM9ezB9IGl0ZW1zIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Zyb21MYWJlbD1Gcm9tOiAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9GaWxlTGlzdFNlcGFyYXRvcj07IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX0Rlc3RpbmF0aW9uTWlzc2luZz1UbzogPG1pc3NpbmcgbG9jYWwgZGVzdGluYXRpb24+Ci1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfRGVzdGluYXRpb25MYWJlbD1UbzogCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Rvd25sb2FkTGFiZWxfT3B0aW9uc0xhYmVsPU9wdGlvbnM6IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNTZXBhcmF0b3I9OyAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU9ZXhlY3V0YWJsZQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9Eb3dubG9hZExhYmVsX09wdGlvbnNfUmVhZG9ubHk9cmVhZG9ubHkKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfRG93bmxvYWRMYWJlbF9PcHRpb25zX1ByZXNlcnZlVGltZVN0YW1wPXByZXNlcnZlIHRpbWUvZGF0ZQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9UeXBlPVVQTE9BRCAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfTm9GaWxlcz0obm8gZmlsZXMvZGlyZWN0b3JpZXMpCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09uZUZpbGU9MSBpdGVtIAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9NdWx0aXBsZUZpbGVzPXswfSBpdGVtcyAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfRnJvbUxhYmVsPUZyb206IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9GaWxlTGlzdFNlcGFyYXRvcj07IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvbkxhYmVsPVRvOiAKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVXBsb2FkTGFiZWxfT3B0aW9uc0xhYmVsPU9wdGlvbnM6IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9EZXN0aW5hdGlvblNlcGFyYXRvcj07IAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX0V4ZWN1dGFibGU9ZXhlY3V0YWJsZQotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9VcGxvYWRMYWJlbF9PcHRpb25zX1JlYWRvbmx5PXJlYWRvbmx5Ci1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfUHJlc2VydmVUaW1lU3RhbXA9cHJlc2VydmUgdGltZS9kYXRlCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1VwbG9hZExhYmVsX09wdGlvbnNfRG93bmxvYWRCYWNrPWRvd25sb2FkIGJhY2sgY2hhbmdlcwotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfVXBsb2FkRW5hYmxlZD1VcGxvYWQgcnVsZXMgZW5hYmxlZAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX09wdGlvbnNfRG93bmxvYWRFbmFibGVkPURvd25sb2FkIHJ1bGVzIGVuYWJsZWQKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX05ld1VwbG9hZFJ1bGU9TmV3IHVwbG9hZCBydWxlCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX1J1bGVzRnJhbWVfQWN0aW9uc19Eb3dubG9hZFJ1bGU9TmV3IGRvd25sb2FkIHJ1bGUKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfUnVsZXNGcmFtZV9BY3Rpb25zX0VkaXRTZWxlY3RlZFJ1bGU9RWRpdCBzZWxlY3RlZAotRW5oYW5jZWRTeW5jaHJvbml6ZVRhYl9SdWxlc0ZyYW1lX0FjdGlvbnNfUmVtb3ZlU2VsZWN0ZWRSdWxlcz1SZW1vdmUgc2VsZWN0ZWQKLUVuaGFuY2VkU3luY2hyb25pemVUYWJfVGFiX1RpdGxlPVN5bmNocm9uaXplCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX1RpdGxlPU5ldyBydWxlCi1FbmhhbmNlZFN5bmNocm9uaXplVGFiX0Vycm9yTWVzc2FnZV9OZXdSdWxlX0RvbnRLbm93UnVsZVR5cGU9TGF1bmNoZXIgZG9lcyBub3Qga25vdyBob3cgdG8gZWRpdCB0aGlzIHR5cGUgb2YgcnVsZS4KLQotVXBsb2FkUnVsZURpYWxvZ19UaXRsZT1VcGxvYWQgUnVsZQotVXBsb2FkUnVsZURpYWxvZ19NZXNzYWdlPVBsZWFzZSBzcGVjaWZ5IHRoZSByZW1vdGUgZGlyZWN0b3J5IGFuZCBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBzaGFsbCBiZSB1cGxvYWRlZC4KLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1RpdGxlPU9wdGlvbnMgZm9yIGFsbCBzZWxlY3RlZCBmaWxlKHMpOgotVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9MYWJlbERlZmF1bHRCdXR0b249VXNlIGRpcmVjdG9yeSBmcm9tIGxhdW5jaCBjb25maWd1cmF0aW9uCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19Ta2lwT3B0aW9uPVNraXAKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZU9wdGlvbj1PdmVyd3JpdGUKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUlmTmV3ZXJPcHRpb249T3ZlcndyaXRlIGlmIG5ld2VyCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9BZGRGaWxlRGlhbG9nX0Rlc2NyaXB0aW9uPVNlbGVjdCBkaXJlY3RvcnkgdG8gYWRkCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9BZGRXb3Jrc3BhY2VEaWFsb2dfRGVzY3JpcHRpb249U2VsZWN0IHRoZSByZXNzb3VyY2VzIGZyb20gd29ya3NwYWNlIHRvIGFkZAotVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9MYWJlbERpcmVjdG9yeT1SZW1vdGUgZGlyZWN0b3J5OgotVXBsb2FkUnVsZURpYWxvZ19SZW1vdGVEaXJlY3RvcnlGcmFtZV9UaXRsZT1SZW1vdGUgZGlyZWN0b3J5OgotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1RpdGxlPVNlbGVjdGVkIGZpbGUocyk6Ci1VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfRGVzY3JpcHRpb249QWRkIGZpbGVzOgotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX0FkZEZpbGVzQnV0dG9uPUZpbGUocykKLVVwbG9hZFJ1bGVEaWFsb2dfRmlsZUJ1dHRvbnNGcmFtZV9BZGREaXJlY3RvcnlCdXR0b249RGlyZWN0b3J5Ci1VcGxvYWRSdWxlRGlhbG9nX0ZpbGVCdXR0b25zRnJhbWVfQWRkV29ya3NwYWNlQnV0dG9uPVdvcmtzcGFjZQotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUZpbGVzTGFiZWw9UmVtb3ZlIGZpbGVzOgotVXBsb2FkUnVsZURpYWxvZ19GaWxlQnV0dG9uc0ZyYW1lX1JlbW92ZUJ1dHRvbj1SZW1vdmUgc2VsZWN0ZWQKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1JlYWRvbmx5Q2hlY2s9UmVhZG9ubHkKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjaz1FeGVjdXRhYmxlCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9Eb3dubG9hZEJhY2tDaGVjaz1Eb3dubG9hZCBiYWNrIGlmIGNoYW5nZWQKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2s9UHJlc2VydmUgdGltZSBhdHRyaWJ1dGVzCi1VcGxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVMYWJlbD1JZiBmaWxlIGFscmVhZHkgZXhpc3RzOgotVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkRmlsZURpYWxvZ19UaXRsZT1TZWxlY3QgZmlsZShzKSB0byBhZGQKLVVwbG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0FkZERpcmVjdG9yeURpYWxvZ19UaXRsZT1TZWxlY3QgZGlyZWN0b3J5IHRvIGFkZAotVXBsb2FkUnVsZURpYWxvZ19PcHRpb25zRnJhbWVfQWRkV29ya3NwYWNlRGlhbG9nX1RpdGxlPVdvcmtzcGFjZSByZXNvdXJjZXMKLUxhdW5jaGVyRXhlY3V0aW9uVGFiX0FyZ3VtZW50c0ZyYW1lX1RpdGxlPUFyZ3VtZW50czoKLUxhdW5jaGVyRXhlY3V0aW9uVGFiX0FyZ3VtZW50c0ZyYW1lX0NvbW1hbmRMaW5lTGFiZWw9Q29tbWFuZCBsaW5lIGFyZ3VtZW50cwotTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9UaXRsZT1DdXN0b21pemUgYXBwbGljYXRpb24gbGF1bmNoOgotTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9QYXJzZXJMYWJlbD1PdXRwdXQgcGFyc2VyOgotTGF1bmNoZXJFeGVjdXRpb25UYWJfT2JzZXJ2ZXJGcmFtZV9CYXNoQ29tbWFuZHNCZWZvcmVMQWJlbD1CYXNoIGNvbW1hbmRzLCBleGVjdXRlZCBiZWZvcmUgYXBwbGljYXRpb24KLUxhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfQmFzaENvbW1hbmRzQWZ0ZXJMYWJlbD1CYXNoIGNvbW1hbmRzLCBleGVjdXRlZCBhZnRlciBhcHBsaWNhdGlvbgotTGF1bmNoZXJFeGVjdXRpb25UYWJfVmFsaWRhdGlvbl9PYnNlcnZlckFuZE5vQ29uc29sZT1DYW5ub3Qgc2V0IG9ic2VydmVyIGlmIG5vIGNvbnNvbGUgaXMgYWxsb2NhdGVkIChzZWUgQ29tbW9uIFRhYikKLUxhdW5jaGVyRXhlY3V0aW9uVGFiX09ic2VydmVyRnJhbWVfT2JzZXJ2ZXJDb21ib19EZWZhdWx0Tm9uZU9wdGlvbj1ub25lCi1MYXVuY2hlckV4ZWN1dGlvblRhYl9UYWJfVGl0bGU9TGF1bmNoCi0KLURvd25sb2FkUnVsZURpYWxvZ19UaXRsZT1Eb3dubG9hZCBSdWxlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfTWVzc2FnZT1QbGVhc2Ugc3BlY2lmeSB0aGUgcmVtb3RlIGZpbGVzIHRoYXQgc2hhbGwgYmUgZG93bmxvYWRlZCBhbmQgYSBsb2NhbCBkaXJlY3RvcnkuCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9UaXRsZT1Mb2NhbCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6Ci1Eb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9GaWxlU3lzdGVtQnV0dG9uPUZpbGUgc3lzdGVtCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRGVzdGluYXRpb25GcmFtZV9Xb3Jrc3BhY2VCdXR0b249V29ya3NwYWNlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1RpdGxlPU9wdGlvbnMgZm9yIGFsbCBzZWxlY3RlZCBmaWxlKHMpOgotRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9SZWFkb25seUNoZWNrPVJlYWRvbmx5Ci1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX0V4ZWN1dGFibGVDaGVjaz1FeGVjdXRhYmxlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX1ByZXNlcnZlVGltZVN0YW1wQ2hlY2s9UHJlc2VydmUgdGltZSBhdHRyaWJ1dGVzCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUxhYmVsPUlmIGZpbGUgYWxyZWFkeSBleGlzdHM6Ci1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX1NraXBPcHRpb249U2tpcAotRG93bmxvYWRSdWxlRGlhbG9nX09wdGlvbnNGcmFtZV9PdmVyd3JpdGVDb21ib19PdmVyd3JpdGVBbHdheXNPcHRpb249T3ZlcndyaXRlCi1Eb3dubG9hZFJ1bGVEaWFsb2dfT3B0aW9uc0ZyYW1lX092ZXJ3cml0ZUNvbWJvX092ZXJ3cml0ZUlmTmV3ZXJPcHRpb249T3ZlcndyaXRlIGlmIG5ld2VyCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9UaXRsZT1TZWxlY3RlZCBmaWxlKHMpOgotRG93bmxvYWRSdWxlRGlhbG9nX0ZpbGVMaXN0RnJhbWVfQWRkQnV0dG9uPUFkZCBuZXcKLURvd25sb2FkUnVsZURpYWxvZ19GaWxlTGlzdEZyYW1lX0VkaXRCdXR0b249Q2hhbmdlIHNlbGVjdGVkCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRmlsZUxpc3RGcmFtZV9SZW1vdmVCdXR0b249UmVtb3ZlIHNlbGVjdGVkCi1Eb3dubG9hZFJ1bGVEaWFsb2dfRGlyZWN0b3J5RGlhbG9nX1RpdGxlPVNlbGVjdCBsb2NhbCBkZXN0aW5hdGlvbgotRG93bmxvYWRSdWxlRGlhbG9nX0RpcmVjdG9yeURpYWxvZ19NZXNzYWdlPVNlbGVjdCBsb2NhbCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLURvd25sb2FkUnVsZURpYWxvZ19Xb3Jrc3BhY2VEaWFsb2dfVGl0bGU9U2VsZWN0IGZvbGRlcjoKLURvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX1RpdGxlPUFkZCByZW1vdGUgZmlsZS9kaXJlY3RvdHkKLURvd25sb2FkUnVsZURpYWxvZ19BZGRGaWxlRGlhbG9nX01lc3NhZ2U9UmVtb3RlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlIGFkZGVkOgotRG93bmxvYWRSdWxlRGlhbG9nX0VkaXRGaWxlRGlhbG9nX1RpdGxlPUFkZCByZW1vdGUgZmlsZS9kaXJlY3RvdHkKLURvd25sb2FkUnVsZURpYWxvZ19FZGl0RmlsZURpYWxvZ19NZXNzYWdlPVJlbW90ZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBiZSBhZGRlZDoKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ZhcmlhYmxlcy9NZXNzYWdlcy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdmFyaWFibGVzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3ZmY4MjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdmFyaWFibGVzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci52YXJpYWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci52YXJpYWJsZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWNsaXBzZVZhcmlhYmxlRXJyb3JNZXNzYWdlOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdmFyaWFibGVzL1JlbW90ZVdvcmtzcGFjZVJlc29sdmVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci92YXJpYWJsZXMvUmVtb3RlV29ya3NwYWNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZmMzU5My4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC9sYXVuY2hlci92YXJpYWJsZXMvUmVtb3RlV29ya3NwYWNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIudmFyaWFibGVzOwotCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLklEeW5hbWljVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSUR5bmFtaWNWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci5SZW1vdGVMYXVuY2hlclBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIGxhZ2dhcmNpYQotICogQHNpbmNlIDMuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdGVXb3Jrc3BhY2VSZXNvbHZlciBpbXBsZW1lbnRzIElEeW5hbWljVmFyaWFibGVSZXNvbHZlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1dPUktTUEFDRV9WQVJJQUJMRSA9ICJ1c2VyX3dvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNBVEVOQVRFX0NIQVIgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUl9XT1JLU1BBQ0UgPSAiZ2VuZXJpY191c2VyX3dvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBSZW1vdGVXb3Jrc3BhY2VSZXNvbHZlcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLklEeW5hbWljVmFyaWFibGVSZXNvbHZlciNyZXNvbHZlVmFsdWUob3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSUR5bmFtaWNWYXJpYWJsZSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVmFsdWUoSUR5bmFtaWNWYXJpYWJsZSB2YXJpYWJsZSwgU3RyaW5nIGFyZ3VtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB2YXJpYWJsZS5nZXROYW1lKCk7Ci0KLQkJaWYgKHZhcmlhYmxlTmFtZS5lcXVhbHMoVVNFUl9XT1JLU1BBQ0VfVkFSSUFCTEUpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBob3N0bmFtZSA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk7Ci0JCQkJU3RyaW5nIHVzZXJuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBob3N0bmFtZSArIENPTkNBVEVOQVRFX0NIQVIgKyB1c2VybmFtZTsKLQkJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgewotCQkJCXVoZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gREVGQVVMVF9VU0VSX1dPUktTUEFDRTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFJlbW90ZUxhdW5jaGVyUGx1Z2luCi0JCQkJLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5PSywKLQkJCQlNZXNzYWdlcy5pbnZhbGlkRWNsaXBzZVZhcmlhYmxlRXJyb3JNZXNzYWdlLCBudWxsKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L2xhdW5jaGVyL3ZhcmlhYmxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdmFyaWFibGVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMzNiOWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvbGF1bmNoZXIvdmFyaWFibGVzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWludmFsaWRFY2xpcHNlVmFyaWFibGVFcnJvck1lc3NhZ2U9SW52YWxpZCBFY2xpcHNlIHZhcmlhYmxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS8uY2xhc3NwYXRoIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvLnByb2plY3QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YzY3ZjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc3NTYzMC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMy4yLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLlVJRW52aXJvbm1lbnRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkuZXh0ZW5zaW9uLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS52aWV3cwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2Fib3V0Lmh0bWwgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk0YjQzMS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiI+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5BYm91dDwvdGl0bGU+Ci0gICAgPG1ldGEgY29udGVudD0iIj4KLSAgICA8c3R5bGU+PC9zdHlsZT4KLSAgPC9oZWFkPgotCi08Ym9keT4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhpcyBwbHVnLWluIGlzIHByb3ZpZGVkIGJ5IElCTSBDb3JwLiBZb3VyIHVzZSBvZiB0aGlzIHBsdWctaW4gaXMgZ292ZXJuZWQgYnkgdGhlIGxpY2Vuc2UgdGhhdCB3YXMgYWdyZWVkIHRvIHdoZW4gdGhlIHBsdWctaW4gd2FzIGluc3RhbGxlZCBhcyBwYXJ0IG9mIGEgZmVhdHVyZSBpbnN0YWxsYXRpb24uPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRmNGM3ZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9hZ2VudF9kZXRhY2hfb2JqLmdpZiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9hZ2VudF9kZXRhY2hfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBkMDcyYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvYWdlbnRfZGV0YWNoX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvY29ubmVjdF9jcmVhdGUuZ2lmIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL2Nvbm5lY3RfY3JlYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjODMwNS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvY29ubmVjdF9jcmVhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL2lwcm9jZXNzLmdpZiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9pcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNmQ3MzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL2lwcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9tb25pdG9yX29iai5naWYgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvbW9uaXRvcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTg1NTc1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9tb25pdG9yX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvbmdsaW51eC5naWYgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvbmdsaW51eC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjMTM1Y2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL25nbGludXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL3Jlc3VtZS5naWYgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvcmVzdW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTZmNGUyNS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvcmVzdW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9ydW5fZXhjLmdpZiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9ydW5fZXhjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg4ZmI3Mi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvcnVuX2V4Yy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvc2FtcGxlLmdpZiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL3N1c3BlbmQuZ2lmIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL2ljb25zL3N1c3BlbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTFiODBiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy9zdXNwZW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy90ZXJtaW5hdGVkbGF1bmNoLmdpZiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9pY29ucy90ZXJtaW5hdGVkbGF1bmNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM0N2VkZi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvaWNvbnMvdGVybWluYXRlZGxhdW5jaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGUyZGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVBUUCBSZW1vdGUgVG9vbHMgVGFyZ2V0IEVudmlyb25tZW50cyBVSQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9wbHVnaW4ueG1sIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxNWY1ZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Indvcmtsb2FkQ29udHJvbGxlciIgbmFtZT0iUmVtb3RlIEVudmlyb25tZW50IFdvcmtsb2FkIENvbnRyb2xsZXIiIHNjaGVtYT0ic2NoZW1hL3dvcmtsb2FkQ29udHJvbGxlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb3VibGVDbGlja0hhbmRsZXIiIG5hbWU9IkRvdWJsZSBDbGljayBIYW5kbGVyIiBzY2hlbWE9InNjaGVtYS9kb3VibGVDbGlja0hhbmRsZXIuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJSZW1vdGUgVG9vbHMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iUmVtb3RlIEVudmlyb25tZW50cyIKLSAgICAgICAgICAgIGljb249Imljb25zL2lwcm9jZXNzLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLnZpZXdzLlJlbW90ZVRvb2xzRW52aXJvbm1lbnRWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS52aWV3cy5SZW1vdGVFbnZpcm9ubWVudHNWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jZHQudWkuQ1BlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLnZpZXdzLlJlbW90ZUVudmlyb25tZW50c1ZpZXciCi0gICAgICAgICAgICAgICByYXRpbz0iMC41IgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJzdGFjayIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlLkNvbnNvbGVWaWV3IgotICAgICAgICAgICAgICAgc2hvd1RpdGxlPSJ0cnVlIgotICAgICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NjaGVtYS9kb3VibGVDbGlja0hhbmRsZXIuZXhzZCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9zY2hlbWEvZG91YmxlQ2xpY2tIYW5kbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDZmNjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NjaGVtYS9kb3VibGVDbGlja0hhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aSIgaWQ9ImRvdWJsZUNsaWNrSGFuZGxlciIgbmFtZT0iRG91YmxlIENsaWNrIEhhbmRsZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZG91YmxlQ2xpY2tIYW5kbGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZUNsaWNrSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS5leHRlbnNpb24uSURvdWJsZUNsaWNrSGFuZGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NjaGVtYS93b3JrbG9hZENvbnRyb2xsZXIuZXhzZCBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9zY2hlbWEvd29ya2xvYWRDb250cm9sbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTJmZTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NjaGVtYS93b3JrbG9hZENvbnRyb2xsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aSIgaWQ9Indvcmtsb2FkQ29udHJvbGxlciIgbmFtZT0iUmVtb3RlIEVudmlyb25tZW50IFdvcmtsb2FkIENvbnRyb2xsZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udHJvbGxlckRlbGVnYXRlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRyb2xsZXJEZWxlZ2F0ZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjpvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3VpL1VJRW52aXJvbm1lbnRQbHVnaW4uamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3VpL1VJRW52aXJvbm1lbnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY1YTJlNy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC91aS9VSUVudmlyb25tZW50UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLmV4dGVuc2lvbi5Eb3VibGVDbGlja0hhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIFVJRW52aXJvbm1lbnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVSUVudmlyb25tZW50UGx1Z2luIHBsdWdpbjsKLQkKLQlwcml2YXRlIERvdWJsZUNsaWNrSGFuZGxlck1hbmFnZXIgZG91YmxlQ2xpY2tIYW5kbGVyTWdyOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVUlFbnZpcm9ubWVudFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJRW52aXJvbm1lbnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQiLCBwYXRoKTsKLQl9Ci0JCi0JcHVibGljIERvdWJsZUNsaWNrSGFuZGxlck1hbmFnZXIgZ2V0RG91YmxlQ2xpY2tIYW5kbGVyTWFuYWdlcigpIHsKLQkgICAgaWYgKGRvdWJsZUNsaWNrSGFuZGxlck1nciA9PSBudWxsKSB7Ci0JICAgICAgICBkb3VibGVDbGlja0hhbmRsZXJNZ3IgPSBuZXcgRG91YmxlQ2xpY2tIYW5kbGVyTWFuYWdlcigpOwotCSAgICB9Ci0JICAgIHJldHVybiBkb3VibGVDbGlja0hhbmRsZXJNZ3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvdWkvZXh0ZW5zaW9uL0RvdWJsZUNsaWNrSGFuZGxlck1hbmFnZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL2Vudmlyb25tZW50L3VpL2V4dGVuc2lvbi9Eb3VibGVDbGlja0hhbmRsZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OTVlODYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvdWkvZXh0ZW5zaW9uL0RvdWJsZUNsaWNrSGFuZGxlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmV4dGVuc2lvbi5JTm9kZTsKLQotLyoqCi0gKiBNYW5hZ2UgYSBsaXN0IG9mIDxjb2RlPklEb3VibGVDbGlja0hhbmRsZXI8L2NvZGU+IGNvbnRyaWJ1dGVkIGJ5IGV4dGVuc2lvbnMKLSAqIAotICogQGF1dGhvciBIb25nIENoYW5nIExpbgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEb3VibGVDbGlja0hhbmRsZXJNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFWFRfSEFORExFUl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkuZG91YmxlQ2xpY2tIYW5kbGVyIjsKLQotICAgIHByaXZhdGUgTGlzdDxJRG91YmxlQ2xpY2tIYW5kbGVyPiBoYW5kbGVyczsKLQotICAgIHB1YmxpYyBEb3VibGVDbGlja0hhbmRsZXJNYW5hZ2VyKCkgewotICAgICAgICBwcm9jZXNzRG91YmxlQ2xpY2tIYW5kbGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRvdWJsZUNsaWNrRXhlY3V0ZShJTm9kZSBub2RlKSB7Ci0gICAgICAgIGZvciAoSURvdWJsZUNsaWNrSGFuZGxlciBoYW5kbGVyIDogaGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyLmhhbmRsZShub2RlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RvdWJsZUNsaWNrSGFuZGxlcnMoKSB7Ci0gICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxJRG91YmxlQ2xpY2tIYW5kbGVyPigpOwotCi0gICAgICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgLmdldEV4dGVuc2lvblBvaW50KEVYVF9IQU5ETEVSX0lEKTsKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbMF07Ci0gICAgICAgICAgICAgICAgaWYgKCJkb3VibGVDbGlja0hhbmRsZXIiLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKChJRG91YmxlQ2xpY2tIYW5kbGVyKSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC91aS9leHRlbnNpb24vSURvdWJsZUNsaWNrSGFuZGxlci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvdWkvZXh0ZW5zaW9uL0lEb3VibGVDbGlja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhMDc3MC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC91aS9leHRlbnNpb24vSURvdWJsZUNsaWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmV4dGVuc2lvbi5JTm9kZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHRvIGhhbmRsZSB0aGUgZG91YmxlIGNsaWNrIG9uIGFuIDxjb2RlPklOb2RlPC9jb2RlPgotICogCi0gKiBAYXV0aG9yIEhvbmcgQ2hhbmcgTGluCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRG91YmxlQ2xpY2tIYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkb3VibGUgY2xpY2sgb24gdGhlIG5vZGUgY2FuIGJlIGhhbmRsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGUoSU5vZGUgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC91aS92aWV3cy9SZW1vdGVUb29sc0Vudmlyb25tZW50Vmlldy5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvZW52aXJvbm1lbnQvdWkvdmlld3MvUmVtb3RlVG9vbHNFbnZpcm9ubWVudFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU0NjJhYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9lbnZpcm9ubWVudC91aS92aWV3cy9SZW1vdGVUb29sc0Vudmlyb25tZW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS52aWV3czsKLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29udHJvbC5JVGFyZ2V0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RWxlbWVudFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5JVGFyZ2V0RXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5jb3JlLlRhcmdldEVudmlyb25tZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZS5UYXJnZXRUeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZXh0ZW5zaW9uLklOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aS5VSUVudmlyb25tZW50UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC53aXphcmQuRW52aXJvbm1lbnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotCi0KLS8qKgotICoKLSAqIFRoZSB2aWV3IHVzZXMgYSBsYWJlbCBwcm92aWRlciB0byBkZWZpbmUgaG93IG1vZGVsCi0gKiBvYmplY3RzIHNob3VsZCBiZSBwcmVzZW50ZWQgaW4gdGhlIHZpZXcuIEVhY2gKLSAqIHZpZXcgY2FuIHByZXNlbnQgdGhlIHNhbWUgbW9kZWwgb2JqZWN0cyB1c2luZwotICogZGlmZmVyZW50IGxhYmVscyBhbmQgaWNvbnMsIGlmIG5lZWRlZC4gQWx0ZXJuYXRpdmVseSwKLSAqIGEgc2luZ2xlIGxhYmVsIHByb3ZpZGVyIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiB2aWV3cwotICogaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGFyZQotICogcHJlc2VudGVkIGluIHRoZSBzYW1lIHdheSBldmVyeXdoZXJlLgotICogPHA+Ci0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMQotICovCi0KLXB1YmxpYyBjbGFzcyBSZW1vdGVUb29sc0Vudmlyb25tZW50VmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcixJVGFyZ2V0RXZlbnRMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIEFjdGlvbiBzdGFydEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBzdG9wQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHJlc3VtZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBwYXVzZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBjcmVhdGVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZWRpdEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiByZW1vdmVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZG91YmxlQ2xpY2tBY3Rpb247Ci0JCi0JcHJpdmF0ZSBMaXN0PEFjdGlvbj4gd29ya2xvYWRDb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotCS8vIFNldCB0aGUgdGFibGUgY29sdW1uIHByb3BlcnR5IG5hbWVzCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU5WSVJPTk1FTlRfQ09OVFJPTF9OQU1FCQk9ICJUYXJnZXQgRW52aXJvbm1lbnQiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVklST05NRU5UX0NPTlRST0xfU1RBVFVTCQk9ICJTdGF0dXMiOwotCi0KLQkvLyBTZXQgY29sdW1uIG5hbWVzCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7IAotCQkJRU5WSVJPTk1FTlRfQ09OVFJPTF9OQU1FLCAKLQkJCUVOVklST05NRU5UX0NPTlRST0xfU1RBVFVTCi0JCQl9OwotCQotCS8vIE1vZGVsCi0JVGFyZ2V0RW52aXJvbm1lbnRNYW5hZ2VyIG1vZGVsID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRhcmdldHNNYW5hZ2VyKCk7Ci0JSVRhcmdldEVsZW1lbnQgY3VycmVudEVsZW1lbnQgPSBudWxsOwotCi0JLyoKLQkgKiBUaGUgY29udGVudCBwcm92aWRlciBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IKLQkgKiBwcm92aWRpbmcgb2JqZWN0cyB0byB0aGUgdmlldy4gSXQgY2FuIHdyYXAKLQkgKiBleGlzdGluZyBvYmplY3RzIGluIGFkYXB0ZXJzIG9yIHNpbXBseSByZXR1cm4KLQkgKiBvYmplY3RzIGFzLWlzLiBUaGVzZSBvYmplY3RzIG1heSBiZSBzZW5zaXRpdmUKLQkgKiB0byB0aGUgY3VycmVudCBpbnB1dCBvZiB0aGUgdmlldywgb3IgaWdub3JlCi0JICogaXQgYW5kIGFsd2F5cyBzaG93IHRoZSBzYW1lIGNvbnRlbnQgCi0JICogKGxpa2UgVGFzayBMaXN0LCBmb3IgZXhhbXBsZSkuCi0JICovCi0JCi0JY2xhc3MgVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZID0gbmV3IE9iamVjdFtdIHt9OwotCSAgICAgIAotCQkgIC8qKgotCQkgICAqIEdldHMgdGhlIGNoaWxkcmVuIGZvciBhIFRhcmdldEVudmlyb25tZW50VHlwZUVsZW1lbnQgb3IgVGFyZ2V0RW52aXJvbm1lbnRDb25maWdFbGVtZW50Ci0JCSAgICogCi0JCSAgICogQHBhcmFtIGFyZzAKLQkJICAgKiAgICAgICAgICAgIHRoZSBUYXJnZXRFbnZpcm9ubWVudFR5cGVFbGVtZW50IG9yIFRhcmdldEVudmlyb25tZW50Q29uZmlnRWxlbWVudAotCQkgICAqIEByZXR1cm4gT2JqZWN0W10KLQkJICAgKi8KLQkJICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFyZzApIHsKLQkJICAgIGlmIChhcmcwIGluc3RhbmNlb2YgVGFyZ2V0VHlwZUVsZW1lbnQpIHsKLQkJICAgIAlyZXR1cm4gKChUYXJnZXRUeXBlRWxlbWVudCkgYXJnMCkuZ2V0RWxlbWVudHMoKS50b0FycmF5KCk7CQotCQkgICAgfWVsc2UgaWYgKGFyZzAgaW5zdGFuY2VvZiBJVGFyZ2V0RWxlbWVudCl7Ci0JCSAgICAgICAgLy8gZ2V0cyB0aGUgY2hpbGRyZW4gb2YgSVRhcmdldEVsZW1lbnQKLQkJICAgIAlyZXR1cm4gRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENoaWxkcmVuUHJvdmlkZXJNYW5hZ2VyKCkuZ2V0Q2hpbGRyZW4oKElUYXJnZXRFbGVtZW50KWFyZzApOwkJICAgIAkKLQkJICAgIH1lbHNlIGlmIChhcmcwIGluc3RhbmNlb2YgSU5vZGUpIHsKLQkJICAgICAgICByZXR1cm4gKChJTm9kZSkgYXJnMCkuZ2V0Q2hpbGRyZW4oKTsKLQkJICAgIH0KLQkJICAgIHJldHVybiBFTVBUWTsKLQkJICB9Ci0KLQkJICAvKioKLQkJICAgKiBHZXRzIHRoZSBwYXJlbnQgVGFyZ2V0RW52aXJvbm1lbnRUeXBlRWxlbWVudCBmb3IgYSBUYXJnZXRFbnZpcm9ubWVudENvbmZpZ0VsZW1lbnQKLQkJICAgKiAKLQkJICAgKiBAcGFyYW0gYXJnMAotCQkgICAqICAgICAgICAgICAgdGhlIFRhcmdldEVudmlyb25tZW50Q29uZmlnRWxlbWVudAotCQkgICAqIEByZXR1cm4gT2JqZWN0Ci0JCSAgICovCi0JCSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFyZzApIHsKLQkJCWlmIChhcmcwIGluc3RhbmNlb2YgSVRhcmdldEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJVGFyZ2V0RWxlbWVudCkgYXJnMCkuZ2V0VHlwZSgpOwotCQkJfWVsc2UgaWYgKGFyZzAgaW5zdGFuY2VvZiBJTm9kZSkgewotCQkJICAgIHJldHVybiAoKElOb2RlKSBhcmcwKS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQkgIH0KLQotCQkgIC8qKgotCQkgICAqIEdldHMgd2hldGhlciB0aGlzIHRlYW0gb3IgcGxheWVyIGhhcyBjaGlsZHJlbgotCQkgICAqIAotCQkgICAqIEBwYXJhbSBhcmcwCi0JCSAgICogICAgICAgICAgICB0aGUgVGFyZ2V0RW52aXJvbm1lbnRUeXBlRWxlbWVudCBvciBUYXJnZXRFbnZpcm9ubWVudENvbmZpZ0VsZW1lbnQKLQkJICAgKiBAcmV0dXJuIGJvb2xlYW4KLQkJICAgKi8KLQkJICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgYXJnMCkgewotCQkgICAgcmV0dXJuIGdldENoaWxkcmVuKGFyZzApLmxlbmd0aCA+IDA7Ci0JCSAgfQotCi0JCSAgLyoqCi0JCSAgICogR2V0cyB0aGUgZWxlbWVudHMgZm9yIHRoZSB0YWJsZQotCQkgICAqIAotCQkgICAqIEBwYXJhbSBhcmcwCi0JCSAgICogICAgICAgICAgICB0aGUgbW9kZWwKLQkJICAgKiBAcmV0dXJuIE9iamVjdFtdCi0JCSAgICovCi0JCSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhcmcwKSB7Ci0JCQlpZiAoYXJnMCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQkJcmV0dXJuIChPYmplY3RbXSkgYXJnMDsKLQkJCX0KLQkJCXJldHVybiBnZXRDaGlsZHJlbihhcmcwKTsKLQkJfQotCi0JCSAgLyoqCi0JCQkgKiBEaXNwb3NlcyBhbnkgcmVzb3VyY2VzCi0JCQkgKi8KLQkJICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkgIH0KLQotCQkgIC8qKgotCQkgICAqIENhbGxlZCB3aGVuIHRoZSBpbnB1dCBjaGFuZ2VzCi0JCSAgICogCi0JCSAgICogQHBhcmFtIGFyZzAKLQkJICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgdmlld2VyCi0JCSAgICogQHBhcmFtIGFyZzEKLQkJICAgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQKLQkJICAgKiBAcGFyYW0gYXJnMgotCQkgICAqICAgICAgICAgICAgdGhlIG5ldyBpbnB1dAotCQkgICAqLwotCQkgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7Ci0JCSAgICAvLyBOb3RoaW5nIHRvIGRvCi0JCSAgfQotCQl9Ci0JCi0JY2xhc3MgVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXByaXZhdGUgSW1hZ2Ugdmlld0ljb247Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQkJCi0JICAgICAgICBzd2l0Y2ggKGluZGV4KSB7Ci0JICAgICAgICAgICAgY2FzZSAwOgotCSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSU5vZGUpIHsKLQkgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoSU5vZGUpIG9iaikuZ2V0RGlzcGxheVRleHQoKTsKLQkgICAgICAgICAgICAgICAgfWVsc2UgewotCSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqLnRvU3RyaW5nKCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgY2FzZSAxIDoKLQkgICAgICAgICAgICAJaWYgKFRhcmdldEVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkgICAgICAgICAgICAJCWludCBzdGF0dXMgPSAoKElUYXJnZXRFbGVtZW50KW9iaikuZ2V0U3RhdHVzKCk7Ci0JICAgICAgICAgICAgCQkKLQkgICAgICAgICAgICAJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJCQkJY2FzZSBJVGFyZ2V0RWxlbWVudFN0YXR1cy5TVEFSVEVEOgotCQkJCQkJCQlyZXN1bHQgPSAiU3RhcnRlZCI7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSVRhcmdldEVsZW1lbnRTdGF0dXMuU1RPUFBFRDoKLQkJCQkJCQkJcmVzdWx0ID0gIlN0b3BwZWQiOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElUYXJnZXRFbGVtZW50U3RhdHVzLlJFU1VNRUQ6Ci0JCQkJCQkJCXJlc3VsdCA9ICJSdW5uaW5nIjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJVGFyZ2V0RWxlbWVudFN0YXR1cy5QQVVTRUQ6Ci0JCQkJCQkJCXJlc3VsdCA9ICJQYXVzZWQiOwotCQkJCQkJCQlicmVhazsKLQkgICAgICAgICAgICAJCX0KLQkgICAgICAgICAgICAJCQkKLQkgICAgICAgICAgICAJfQotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQlpZiAoaW5kZXggPT0gMCApIHsKLQkJCSAgIGlmIChvYmogaW5zdGFuY2VvZiBJTm9kZSkgewotCQkJICAgICAgIHJldHVybiAoKElOb2RlKSBvYmopLmdldEljb24oKTsKLQkJCSAgIH1lbHNlIHsKLQkJCSAgICAgICByZXR1cm4gZ2V0SW1hZ2Uob2JqKTsKLQkJCSAgIH0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJaWYgKFRhcmdldFR5cGVFbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IFVJRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvaWNvbnMvY29ubmVjdF9jcmVhdGUuZ2lmIik7Ci0gICAgICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlTW9uaXRvckRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotICAgICAgICAgICAgICAgIHZpZXdJY29uID0gaW1hZ2VNb25pdG9yRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJfSBlbHNlIGlmIChUYXJnZXRFbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqLmdldENsYXNzKCkpKSB7Ci0JCQkgICAgVVJMIHVybCA9IFVJRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvaWNvbnMvbW9uaXRvcl9vYmouZ2lmIik7Ci0gICAgICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlTW9uaXRvckRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotICAgICAgICAgICAgICAgIHZpZXdJY29uID0gaW1hZ2VNb25pdG9yRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJfQotCQkJcmV0dXJuIHZpZXdJY29uOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJaWYgKHZpZXdJY29uICE9IG51bGwpIHsKLQkJCQl2aWV3SWNvbi5kaXNwb3NlKCk7Ci0JCQkJdmlld0ljb24gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCWNsYXNzIE5hbWVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUmVtb3RlVG9vbHNFbnZpcm9ubWVudFZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBhbGxvdyB1cwotCSAqIHRvIGNyZWF0ZSB0aGUgdmlld2VyIGFuZCBpbml0aWFsaXplIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVmlld0NvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFZpZXdMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBOYW1lU29ydGVyKCkpOwotCQlkZWZpbmVUYWJsZSh2aWV3ZXIpOwotCQl2aWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5OYW1lcyk7Ci0JCS8vIHZpZXdlci5zZXRJbnB1dChnZXRWaWV3U2l0ZSgpKTsKLQkJdmlld2VyLnNldElucHV0KG1vZGVsLmdldFR5cGVFbGVtZW50cygpLnRvQXJyYXkoKSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl3b3JrbG9hZENvbnRyb2xsZXJzID0gZ2V0V29ya2xvYWRDb250cm9sbGVycygpOwotCQlmb3IgKEFjdGlvbiBjb250cm9sbGVyIDogd29ya2xvYWRDb250cm9sbGVycykgewotCQkJaWYoY29udHJvbGxlciBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBjb250cm9sbGVyKTsKLQkJCX0KLQkJfQotCQltb2RlbC5hZGRNb2RlbEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JCWhvb2tDb250ZXh0TWVudSgpOwotCQlob29rRG91YmxlQ2xpY2tBY3Rpb24oKTsKLQkJY29udHJpYnV0ZVRvQWN0aW9uQmFycygpOwotCQkKLQkJLy8gUGFjayB0aGUgd2luZG93Ci0JICAgIHBhcmVudC5wYWNrKCk7Ci0KLQkgICAgLy8gU2Nyb2xsIHRvIHRvcAotCSAgICB2aWV3ZXIucmV2ZWFsKHZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbSgwKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlZmluZVRhYmxlKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCVRyZWUgdCA9IHZpZXdlci5nZXRUcmVlKCk7Ci0JCXQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCi0JCS8vIDFzdCBjb2x1bW4gd2l0aCBpbWFnZS9jaGVja2JveGVzIC0gTk9URTogVGhlIFNXVC5DRU5URVIgaGFzIG5vIGVmZmVjdCEhCi0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odCwgU1dULkxFRlQsIDApOwkJCi0JCWNvbHVtbi5zZXRUZXh0KEVOVklST05NRU5UX0NPTlRST0xfTkFNRSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCg2NTApOwotCQkKLQkJLy8gMm5kIGNvbHVtbiB3aXRoIHRhc2sgRGVzY3JpcHRpb24KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odCwgU1dULlJJR0hULCAxKTsKLQkJY29sdW1uLnNldFRleHQoRU5WSVJPTk1FTlRfQ09OVFJPTF9TVEFUVVMpOwotCQljb2x1bW4uc2V0V2lkdGgoNTApOwotCQkKLQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCQkKLQkJLy8gUGFjayB0aGUgY29sdW1ucwotCQkvKgotCSAgICBmb3IgKGludCBpID0gMCwgbiA9IHQuZ2V0Q29sdW1uQ291bnQoKTsgaSA8IG47IGkrKykgewotCSAgICAgIHQuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQkgICAgfQotCSAgICAqLwotCSAgICAvLyBUdXJuIG9uIHRoZSBoZWFkZXIgYW5kIHRoZSBsaW5lcwotCSAgICB0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JICAgIHQuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJaWYgKFRhcmdldEVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkJCQkJCS8vIEVkaXQKLQkJCQkJCS8vIFJlbW92ZQkJCQkJCQotCQkJCQkJY3JlYXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCi0JCQkJCQlJVGFyZ2V0RWxlbWVudCB0ZW1wID0gKElUYXJnZXRFbGVtZW50KW9iajsJCQkKLQkJCQkJCWlmKHRlbXAuZ2V0U3RhdHVzKCkgPT0gSVRhcmdldEVsZW1lbnRTdGF0dXMuU1RPUFBFRCl7Ci0JCQkJCQkJZWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCXJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfSBlbHNlewotCQkJCQkJCWVkaXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJcmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJUmVtb3RlVG9vbHNFbnZpcm9ubWVudFZpZXcudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQkJCX0gZWxzZSBpZiAoVGFyZ2V0VHlwZUVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkJCQkJCS8vQ3JlYXRlCi0JCQkJCQljcmVhdGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVkaXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlyZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlSZW1vdGVUb29sc0Vudmlyb25tZW50Vmlldy50aGlzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1nciwgdmlld2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZVRvQWN0aW9uQmFycygpIHsKLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlmaWxsTG9jYWxQdWxsRG93bihiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQlmaWxsTG9jYWxUb29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFB1bGxEb3duKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vbWFuYWdlci5hZGQoYWN0aW9uMSk7Ci0JCS8vbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJLy9tYW5hZ2VyLmFkZChhY3Rpb24yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGNyZWF0ZUFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKGVkaXRBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZW1vdmVBY3Rpb24pOwotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVyZSBhY3Rpb25zIGhlcmUKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVyZSBhY3Rpb25zIGhlcmUKLQkJZm9yIChBY3Rpb24gY29udHJvbGxlciA6IHdvcmtsb2FkQ29udHJvbGxlcnMpIHsKLQkJCW1hbmFnZXIuYWRkKGNvbnRyb2xsZXIpOwotCQl9Ci0JCQotCQltYW5hZ2VyLmFkZChzdGFydEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHN0b3BBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZXN1bWVBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChwYXVzZUFjdGlvbik7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxBY3Rpb24+IGdldFdvcmtsb2FkQ29udHJvbGxlcnMoKSB7Ci0KLQkJTGlzdDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLQkJCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5Ci0JCQkJLmdldEV4dGVuc2lvblBvaW50KCJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkud29ya2xvYWRDb250cm9sbGVyIik7Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCi0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbal07Ci0JICAgICAgICAgICAgICAgIGlmICgiY29udHJvbGxlckRlbGVnYXRlIi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZCgoQWN0aW9uKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikpOwotCSAgICAgICAgICAgICAgICB9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gYWN0aW9ucy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogYWN0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCk7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJICAgICAgcHVibGljIHZvaWQgcnVuICgpIHsKLQkJICAgICAgICAgIGlmICghdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCSAgICAgICAgCSAgdmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCSAgICAgIH0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQkKLQkJVVJMIHVybCA9IFVJRW52aXJvbm1lbnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvaWNvbnMvcnVuX2V4Yy5naWYiKTsKLQkgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlUnVuID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkgICAgdXJsID0gVUlFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi9pY29ucy90ZXJtaW5hdGVkbGF1bmNoLmdpZiIpOwotCSAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VTdG9wID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkgICAgdXJsID0gVUlFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi9pY29ucy9zdXNwZW5kLmdpZiIpOwotCSAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VTdXNwZW5kID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkgICAgdXJsID0gVUlFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi9pY29ucy9yZXN1bWUuZ2lmIik7Ci0JICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZVJlc3VtZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JICAgIAotCSAgICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9ICB0aGlzLmdldFNpdGUoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBzaXRlLmdldFNoZWxsKCk7Ci0JCQotCQlmaW5hbCBJSm9iQ2hhbmdlTGlzdGVuZXIgaWpvYiA9IG5ldyBJSm9iQ2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGF3YWtlKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQotCQkJCXJlZnJlc2goKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVubmluZyhJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2NoZWR1bGVkKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzbGVlcGluZyhJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkKLQkJCQkKLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJc3RhcnRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCWZpbmFsIE9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCWlmIChUYXJnZXRFbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqLmdldENsYXNzKCkpKSB7Ci0JCQkJCQlKb2Igam9iID0gbmV3IEpvYigiU3RhcnQgdGhlICBFbnZpcm9ubWVudCIpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQlzdGFydEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQkJCQlJVGFyZ2V0RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJCQkJSVRhcmdldENvbnRyb2wgY29udHJvbCA9IG51bGw7Ci0JCQkJCQkJCQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZWxlbWVudCA9IChJVGFyZ2V0RWxlbWVudClvYmo7Ci0JCQkJCQkJCQljb250cm9sID0gZWxlbWVudC5nZXRDb250cm9sKCk7Ci0JCQkJCQkJCQlpZiAoIGNvbnRyb2wuY3JlYXRlKG1vbml0b3IpICkKLQkJCQkJCQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQkJCQkJCQlzdGFydEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCQkJam9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGlqb2IpOwotCQkJCQkJcmV0dXJuIDsKLQkJCQkJfQotCQkJCX0KLQkJCQlzaG93TWVzc2FnZSgiUGxlYXNlIFNlbGVjdCBhIFRhcmdldCBDb25maWd1cmF0aW9uIGZpcnN0Iix2aWV3ZXIpOwotCQkJfQotCQl9OwotCQlzdGFydEFjdGlvbi5zZXRUZXh0KCJDcmVhdGUiKTsKLQkJc3RhcnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlN0YXJ0IHRoZSBFbnZpcm9ubWVudCIpOwotCQlzdGFydEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VSdW4pOwotCQkKLQkJc3RvcEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCi0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZmluYWwgT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJaWYgKFRhcmdldEVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkJCQkJCUpvYiBqb2IgPSBuZXcgSm9iKCJTdG9wIHRoZSAgRW52aXJvbm1lbnQiKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCQkKLQkJCQkJCQkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQkJCQkKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmICggKChJVGFyZ2V0RWxlbWVudClvYmopLmdldENvbnRyb2woKS5raWxsKG1vbml0b3IpICkKLQkJCQkJCQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQkJCQkJCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJCWpvYi5zZXRVc2VyKHRydWUpOwotCQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJCQlqb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoaWpvYik7Ci0JCQkJCQlyZXR1cm4gOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNob3dNZXNzYWdlKCJQbGVhc2UgU2VsZWN0IGEgVGFyZ2V0IENvbmZpZ3VyYXRpb24gZmlyc3QiLHZpZXdlcik7Ci0JCQl9Ci0JCX07Ci0JCXN0b3BBY3Rpb24uc2V0VGV4dCgiS2lsbCIpOwotCQlzdG9wQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJLaWxsIHRoZSBFbnZpcm9ubWVudCIpOwotCQlzdG9wQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZVN0b3ApOwotCQkKLQkJLy9yZXN1bWUKLQkJcmVzdW1lQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmaW5hbCBPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlpZiAoVGFyZ2V0RWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iai5nZXRDbGFzcygpKSkgewotCQkJCQkJSm9iIGpvYiA9IG5ldyBKb2IoIlJlc3VtZSB0aGUgIEVudmlyb25tZW50IikgewotCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQkJCi0JCQkJCQkJCXJlc3VtZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQkJCQkKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmICggKChJVGFyZ2V0RWxlbWVudClvYmopLmdldENvbnRyb2woKS5yZXN1bWUobW9uaXRvcikgKSB7Ci0JCQkJCQkJCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCQkJCQlwYXVzZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQkJCQkJCQlyZXN1bWVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJam9iLnNldFVzZXIodHJ1ZSk7Ci0JCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQkJCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihpam9iKTsKLQkJCQkJCXJldHVybiA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2hvd01lc3NhZ2UoIlBsZWFzZSBTZWxlY3QgYSBUYXJnZXQgQ29uZmlndXJhdGlvbiBmaXJzdCIsdmlld2VyKTsKLQkJCX0KLQkJfTsKLQkJcmVzdW1lQWN0aW9uLnNldFRleHQoIlJlc3VtZSIpOwotCQlyZXN1bWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlc3VtZSIpOwotCQlyZXN1bWVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlUmVzdW1lKTsKLQkJCi0JCS8vc3RvcAotCQlwYXVzZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCi0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZmluYWwgT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJaWYgKFRhcmdldEVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkJCQkJCUpvYiBqb2IgPSBuZXcgSm9iKCJQYXVzZSB0aGUgIEVudmlyb25tZW50IikgewotCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQkJCi0JCQkJCQkJCXBhdXNlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQkJCQkJCQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKCAoKElUYXJnZXRFbGVtZW50KW9iaikuZ2V0Q29udHJvbCgpLnN0b3AobW9uaXRvcikgKSB7Ci0JCQkJCQkJCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCQkJCQlyZXN1bWVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlzdGF0dXMgPSBlLmdldFN0YXR1cygpOwotCQkJCQkJCQkJcGF1c2VBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJam9iLnNldFVzZXIodHJ1ZSk7Ci0JCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQkJCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihpam9iKTsKLQkJCQkJCXJldHVybiA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2hvd01lc3NhZ2UoIlBsZWFzZSBTZWxlY3QgYSBUYXJnZXQgQ29uZmlndXJhdGlvbiBmaXJzdCIsdmlld2VyKTsKLQkJCX0KLQkJfTsKLQkJcGF1c2VBY3Rpb24uc2V0VGV4dCgiUGF1c2UiKTsKLQkJcGF1c2VBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlBhdXNlIik7Ci0JCXBhdXNlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZVN1c3BlbmQpOwotCQkKLQkJLy8gQ3JlYXRlCi0JCWNyZWF0ZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkKLQkJCQlpZiAoVGFyZ2V0VHlwZUVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkJCQkJRW52aXJvbm1lbnRXaXphcmQgd2l6YXJkID0gbmV3IEVudmlyb25tZW50V2l6YXJkKChUYXJnZXRUeXBlRWxlbWVudClvYmopOwotCQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCXJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX07Ci0JCWNyZWF0ZUFjdGlvbi5zZXRUZXh0KCJDcmVhdGUiKTsKLQkJY3JlYXRlQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJDcmVhdGVzIGEgbmV3IGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCS8vIEVkaXQKLQkJZWRpdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkKLQkJCQlpZiAoVGFyZ2V0RWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iai5nZXRDbGFzcygpKSkgewotCQkJCQlFbnZpcm9ubWVudFdpemFyZCB3aXphcmQgPSBuZXcgRW52aXJvbm1lbnRXaXphcmQoKElUYXJnZXRFbGVtZW50KW9iaik7Ci0JCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZWRpdEFjdGlvbi5zZXRUZXh0KCJFZGl0Iik7Ci0JCWVkaXRBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkVkaXRzIGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCS8vIFJlbW92ZQotCQlyZW1vdmVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCi0JCQkJaWYgKFRhcmdldEVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpIHsKLQkJCQkJSVRhcmdldEVsZW1lbnQgY29uZkVsZW1lbnQgPSAoSVRhcmdldEVsZW1lbnQpb2JqOwotCQkJCQlpZiAoY29uZkVsZW1lbnQuZ2V0U3RhdHVzKCkgIT0gSVRhcmdldEVsZW1lbnRTdGF0dXMuU1RBUlRFRCkgewotCQkJCQkJaWYgKHNob3dDb25maXJtKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVtb3ZlID8iLHZpZXdlcikpIHsKLQkJCQkJCQljb25mRWxlbWVudC5nZXRUeXBlKCkucmVtb3ZlRWxlbWVudChjb25mRWxlbWVudCk7Ci0JCQkJCQkJcmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJc2hvd01lc3NhZ2UoIlBsZWFzZSBzdG9wIHRoaXMgaW5zdGFuY2UgZmlyc3QgISIsdmlld2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcmVtb3ZlQWN0aW9uLnNldFRleHQoIlJlbW92ZSIpOwotCQlyZW1vdmVBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlbW92ZXMgY29uZmlndXJhdGlvbiIpOwotCQkKLQkJZG91YmxlQ2xpY2tBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJLy9UYXJnZXRFbnZpcm9ubWVudFR5cGVFbGVtZW50Ci0JCQkJLy9UYXJnZXRFbnZpcm9ubWVudENvbmZpZ0VsZW1lbnQsIHR5cGUgVGFyZ2V0RW52aXJvbm1lbnRUeXBlRWxlbWVudAotCQkJCQotCQkJCWlmIChUYXJnZXRUeXBlRWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iai5nZXRDbGFzcygpKSl7Ci0JCQkJCWlmKHZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKG9iaikpewotCQkJCQkJdmlld2VyLnNldEV4cGFuZGVkU3RhdGUob2JqLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJdmlld2VyLnNldEV4cGFuZGVkU3RhdGUob2JqLHRydWUpOwotCQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKFRhcmdldEVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmouZ2V0Q2xhc3MoKSkpewotCQkJCQlJVGFyZ2V0RWxlbWVudCBlbGUgPSAoSVRhcmdldEVsZW1lbnQpIG9iajsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlUYXJnZXRDb250cm9sIGNvbnRyb2wgPSBlbGUuZ2V0Q29udHJvbCgpOwotCQkJCQkJaWYoY29udHJvbC5xdWVyeSgpID09IElUYXJnZXRFbGVtZW50U3RhdHVzLlNUT1BQRUQpewotCQkJCQkJCWVkaXRBY3Rpb24ucnVuKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCi0gICAgICAgICAgICAgICAgaWYgKElOb2RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElOb2RlIG5vZGUgPSAoSU5vZGUpIG9iajsKLSAgICAgICAgICAgICAgICAgICAgVUlFbnZpcm9ubWVudFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RG91YmxlQ2xpY2tIYW5kbGVyTWFuYWdlcigpLmRvdWJsZUNsaWNrRXhlY3V0ZShub2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIC8vc2hvd01lc3NhZ2UoIkRvdWJsZS1jbGljayBkZXRlY3RlZCBvbiAiK29iai50b1N0cmluZygpLHZpZXdlcik7Ci0JCQl9Ci0JCX07CQkKLQkJCi0JCXN0b3BBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlc3VtZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcGF1c2VBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb3VibGVDbGlja0FjdGlvbigpIHsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlLFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJIkVudmlyb25tZW50cyIsCi0JCQltZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0NvbmZpcm0oU3RyaW5nIG1lc3NhZ2UsVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQkiRW52aXJvbm1lbnRzIiwKLQkJCW1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAoVGFyZ2V0RWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iai5nZXRDbGFzcygpKSkgewotCQkJCWN1cnJlbnRFbGVtZW50ID0gKElUYXJnZXRFbGVtZW50KSBvYmo7Ci0JCQkJc3dpdGNoIChjdXJyZW50RWxlbWVudC5nZXRTdGF0dXMoKSkgewotCQkJCQljYXNlIElUYXJnZXRFbGVtZW50U3RhdHVzLlNUQVJURUQ6Ci0JCQkJCQl0YXJnZXRTdGFydGVkKGN1cnJlbnRFbGVtZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUYXJnZXRFbGVtZW50U3RhdHVzLlNUT1BQRUQ6Ci0JCQkJCQl0YXJnZXRTdG9wcGVkKGN1cnJlbnRFbGVtZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUYXJnZXRFbGVtZW50U3RhdHVzLlJFU1VNRUQ6Ci0JCQkJCQl0YXJnZXRSZXN1bWVkKGN1cnJlbnRFbGVtZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUYXJnZXRFbGVtZW50U3RhdHVzLlBBVVNFRDoKLQkJCQkJCXRhcmdldFBhdXNlZChjdXJyZW50RWxlbWVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLQkJCQlzdGFydEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsgLy8gQ3JlYXRlCi0JCQkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsgLy8gS2lsbAotCQkJCXJlc3VtZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsgLy8gUmVzdW1lCi0JCQkJcGF1c2VBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7IC8vIFBhdXNlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKElUYXJnZXRFbGVtZW50IGV2ZW50KSB7Ci0JCQotCQlpZiAoZXZlbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGV2ZW50LmVxdWFscyhjdXJyZW50RWxlbWVudCkpIHsKLQkJCQkJc3RhcnRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7IC8vIENyZWF0ZQotCQkJCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7IC8vIEtpbGwKLQkJCQkJcmVzdW1lQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7IC8vIFJlc3VtZQotCQkJCQlwYXVzZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsgLy8gUGF1c2UKLQkJCQkJZWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJfQotCQl0aGlzLnJlZnJlc2goKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGFyZ2V0U3RvcHBlZChJVGFyZ2V0RWxlbWVudCBldmVudCkgewotCQkKLQkJaWYgKGV2ZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50LmVxdWFscyhjdXJyZW50RWxlbWVudCkpIHsKLQkJCQkJc3RhcnRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsgLy8gQ3JlYXRlCi0JCQkJCXN0b3BBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7IC8vIEtpbGwKLQkJCQkJcmVzdW1lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOyAvLyBSZXN1bWUKLQkJCQkJcGF1c2VBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7IC8vIFBhdXNlCi0JCQkJCWVkaXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJcmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZWZyZXNoKCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRhcmdldFBhdXNlZChJVGFyZ2V0RWxlbWVudCBldmVudCkgewotCQkKLQkJaWYgKGV2ZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50LmVxdWFscyhjdXJyZW50RWxlbWVudCkpIHsKLQkJCQkJc3RhcnRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7IC8vIENyZWF0ZQotCQkJCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7IC8vIEtpbGwKLQkJCQkJcmVzdW1lQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7IC8vIFJlc3VtZQotCQkJCQlwYXVzZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsgLy8gUGF1c2UKLQkJCQkKLQkJCX0KLQkJfQotCQl0aGlzLnJlZnJlc2goKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGFyZ2V0UmVzdW1lZChJVGFyZ2V0RWxlbWVudCBldmVudCkgewotCQkKLQkJaWYgKGV2ZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50LmVxdWFscyhjdXJyZW50RWxlbWVudCkpIHsKLQkJCQkJc3RhcnRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7IC8vIENyZWF0ZQotCQkJCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7IC8vIEtpbGwKLQkJCQkJcmVzdW1lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOyAvLyBSZXN1bWUKLQkJCQkJcGF1c2VBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsgLy8gUGF1c2UKLQkJCQkKLQkJCX0KLQkJfQotCQl0aGlzLnJlZnJlc2goKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2VFdmVudChpbnQgZXZlbnQsIElUYXJnZXRFbGVtZW50IGZyb20pIHsKLQkJCi0JCXN3aXRjaCAoZXZlbnQpIHsKLQkJCWNhc2UgSVRhcmdldEVsZW1lbnRTdGF0dXMuU1RBUlRFRDoKLQkJCQl0YXJnZXRTdGFydGVkKGZyb20pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJVGFyZ2V0RWxlbWVudFN0YXR1cy5TVE9QUEVEOgotCQkJCXRhcmdldFN0b3BwZWQoZnJvbSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElUYXJnZXRFbGVtZW50U3RhdHVzLlJFU1VNRUQ6Ci0JCQkJdGFyZ2V0UmVzdW1lZChmcm9tKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVRhcmdldEVsZW1lbnRTdGF0dXMuUEFVU0VEOgotCQkJCXRhcmdldFBhdXNlZChmcm9tKTsKLQkJCQlicmVhazsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQltb2RlbC5yZW1vdmVNb2RlbEV2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy8uY2xhc3NwYXRoIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvLnByb2plY3QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MjM3ZWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU2ZGNlYy4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMy4xLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLmV2ZW50cywKLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9hYm91dC5odG1sIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ODI0MmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY4MWUyZC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzkxNDE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgUmVtb3RlIFRvb2xzIFByZWZlcmVuY2VzCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3BsdWdpbi54bWwgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFiMzhmOC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJSZW1vdGUgVG9vbHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlRhcmdldFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy51aS5SZW1vdGVUb29sc1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlJlbW90ZVRvb2xzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlRhcmdldEVudmlyb25tZW50UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlJlbW90ZVRvb2xzUHJlZmVyZW5jZVBhZ2UuRW52aXJvbm1lbnRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IkVudmlyb25tZW50cyIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy51aS5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPC9pbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VzUGx1Z2luLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTJlMTlhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLmV2ZW50cy5QcmVmZXJlbmNlc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy5ldmVudHMuSVByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlc1BsdWdpbiBwbHVnaW47Ci0JCi0JcHJpdmF0ZSBMaXN0IHByb3BlcnRpZXNMaXN0ZW5lcnM7Ci0JCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUxpc3RlbmVyOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZXNQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXByb3BlcnRpZXNMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXByb3BlcnR5TGlzdGVuZXIgPSBuZXcgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkKLQkJCQlmaXJlVmFsdWVDaGFuZ2VkKGV2ZW50LmdldFByb3BlcnR5KCksZXZlbnQuZ2V0T2xkVmFsdWUoKSxldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCQkKLQkJCX0KLQkJCQotCQl9OwotCQl0aGlzLmdldFBsdWdpblByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQl0aGlzLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKLQkJdGhpcy5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlc1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJUHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJcHJvcGVydGllc0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJUHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJcHJvcGVydGllc0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaXJlVmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLAotICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzTGlzdGVuZXJzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBJdGVyYXRvciBpID0gcHJvcGVydGllc0xpc3RlbmVycy5pdGVyYXRvcigpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7IAotICAgICAgICAJSVByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgICAJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UobmV3IFByZWZlcmVuY2VzQ2hhbmdlRXZlbnQodGhpcywKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy9ldmVudHMvRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL2V2ZW50cy9Gb2xsb3dCZWdpblN0cmluZ0ZpZWxkRWRpdG9yUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODQ2ZmVhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL2V2ZW50cy9Gb2xsb3dCZWdpblN0cmluZ0ZpZWxkRWRpdG9yUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIGxhZ2dhcmNpYQotICogQHNpbmNlIDMuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb2xsb3dCZWdpblN0cmluZ0ZpZWxkRWRpdG9yUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzCi0JCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBTdHJpbmdGaWVsZEVkaXRvciBzdHJpbmdGaWVsZEVkaXRvcjsKLQotCXByb3RlY3RlZCBUZXh0IHRleHRDb250cm9sOwotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmZXJlbmNlTmFtZTsKLQotCXByb3RlY3RlZCBEaXNwbGF5IGRpc3BsYXk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlTdHJpbmdGaWVsZEVkaXRvciBzdHJpbmdGaWVsZEVkaXRvciwgQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnN0cmluZ0ZpZWxkRWRpdG9yID0gc3RyaW5nRmllbGRFZGl0b3I7Ci0JCXRoaXMudGV4dENvbnRyb2wgPSBzdHJpbmdGaWVsZEVkaXRvci5nZXRUZXh0Q29udHJvbChwYXJlbnQpOwotCQl0aGlzLmRpc3BsYXkgPSB0aGlzLnRleHRDb250cm9sLmdldERpc3BsYXkoKTsKLQkJdGhpcy5wcmVmZXJlbmNlU3RvcmUgPSBzdHJpbmdGaWVsZEVkaXRvci5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJdGhpcy5wcmVmZXJlbmNlTmFtZSA9IHN0cmluZ0ZpZWxkRWRpdG9yLmdldFByZWZlcmVuY2VOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlmaW5hbCBTdHJpbmcgb2xkVmFsdWUgPSAoU3RyaW5nKSBldmVudC5nZXRPbGRWYWx1ZSgpOyAvLyBvbGQgdmFsdWUgZm9yCi0JCQkJCQkJCQkJCQkJCQkJLy8gdGhlIHByb3BlcnR5Ci0JCQkJCQkJCQkJCQkJCQkJLy8gYmVpbmcKLQkJCQkJCQkJCQkJCQkJCQkvLyBtb25pdG9yZWQKLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsgLy8gbmV3IHZhbHVlIGZvcgotCQkJCQkJCQkJCQkJCQkJCS8vIHRoZSBwcm9wZXJ0eQotCQkJCQkJCQkJCQkJCQkJCS8vIGJlaW5nCi0JCQkJCQkJCQkJCQkJCQkJLy8gbW9uaXRvcmVkCi0JCS8vIFVwZGF0ZSB0aGUgdmFsdWUgaW4gdGhlIEdVSSBvciBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSwgd2hpY2ggb25lIGlzCi0JCS8vIGFjdGl2ZQotCQlpZiAodGhpcy5kaXNwbGF5ICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlOwotCQkJCQlTdHJpbmcgc3RyaW5nTmV3VmFsdWU7Ci0JCQkJCWlmICghRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIudGhpcy50ZXh0Q29udHJvbAotCQkJCQkJCS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXN0cmluZ1ZhbHVlID0gRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIudGhpcy5zdHJpbmdGaWVsZEVkaXRvcgotCQkJCQkJCQkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJCWlmIChzdHJpbmdWYWx1ZS5zdGFydHNXaXRoKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0cmluZ05ld1ZhbHVlID0gc3RyaW5nVmFsdWUucmVwbGFjZUZpcnN0KG9sZFZhbHVlLAotCQkJCQkJCQkJbmV3VmFsdWUpOwotCQkJCQkJCUZvbGxvd0JlZ2luU3RyaW5nRmllbGRFZGl0b3JQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLnRoaXMuc3RyaW5nRmllbGRFZGl0b3IKLQkJCQkJCQkJCS5zZXRTdHJpbmdWYWx1ZShzdHJpbmdOZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdHJpbmdWYWx1ZSA9IEZvbGxvd0JlZ2luU3RyaW5nRmllbGRFZGl0b3JQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLnRoaXMucHJlZmVyZW5jZVN0b3JlCi0JCQkJCQkJCS5nZXRTdHJpbmcoRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIudGhpcy5wcmVmZXJlbmNlTmFtZSk7Ci0JCQkJCQlpZiAoc3RyaW5nVmFsdWUuc3RhcnRzV2l0aChvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHJpbmdOZXdWYWx1ZSA9IHN0cmluZ1ZhbHVlLnJlcGxhY2VGaXJzdChvbGRWYWx1ZSwKLQkJCQkJCQkJCW5ld1ZhbHVlKTsKLQkJCQkJCQlGb2xsb3dCZWdpblN0cmluZ0ZpZWxkRWRpdG9yUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci50aGlzLnByZWZlcmVuY2VTdG9yZQotCQkJCQkJCQkJLnNldFZhbHVlKAotCQkJCQkJCQkJCQlGb2xsb3dCZWdpblN0cmluZ0ZpZWxkRWRpdG9yUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci50aGlzLnByZWZlcmVuY2VOYW1lLAotCQkJCQkJCQkJCQlzdHJpbmdOZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IEZvbGxvd0JlZ2luU3RyaW5nRmllbGRFZGl0b3JQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLnRoaXMucHJlZmVyZW5jZVN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIudGhpcy5wcmVmZXJlbmNlTmFtZSk7Ci0JCQlpZiAoc3RyaW5nVmFsdWUuc3RhcnRzV2l0aChvbGRWYWx1ZSkpIHsKLQkJCQlTdHJpbmcgc3RyaW5nTmV3VmFsdWUgPSBzdHJpbmdWYWx1ZS5yZXBsYWNlRmlyc3Qob2xkVmFsdWUsCi0JCQkJCQluZXdWYWx1ZSk7Ci0JCQkJRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIudGhpcy5wcmVmZXJlbmNlU3RvcmUKLQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJRm9sbG93QmVnaW5TdHJpbmdGaWVsZEVkaXRvclByb3BlcnR5Q2hhbmdlTGlzdGVuZXIudGhpcy5wcmVmZXJlbmNlTmFtZSwKLQkJCQkJCQkJc3RyaW5nTmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy9ldmVudHMvSVByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL2V2ZW50cy9JUHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDhiMjVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL2V2ZW50cy9JUHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBvYnNlcnZlZCBvYmplY3QgZmlyZXMgYSBwcm9wZXJ0eQotCSAqIGNoYW5nZSBldmVudC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBvYmplY3QgZGVzY3JpYmluZyB3aGljaAotCSAqICAgIHByb3BlcnR5IGNoYW5nZWQgYW5kIGhvdwotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzQ2hhbmdlRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvZXZlbnRzL1ByZWZlcmVuY2VzQ2hhbmdlRXZlbnQuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL2V2ZW50cy9QcmVmZXJlbmNlc0NoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGM5YzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvZXZlbnRzL1ByZWZlcmVuY2VzQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzQ2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDgzNTAyMDI1NDc4ODAyNjIyOUw7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgb2xkIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vdCBrbm93biBvciBub3QgcmVsZXZhbnQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3Qgb2xkVmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgbmV3IHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vdCBrbm93biBvciBub3QgcmVsZXZhbnQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgbmV3VmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZCAobXVzdCBub3QgYmUgCi0JICogICAgPGNvZGU+bnVsbDwvY29kZT4pCi0JICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciAKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciAKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VzQ2hhbmdlRXZlbnQoT2JqZWN0IHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHk7Ci0JCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiBXYXJuaW5nOiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcHJvcGVydHkgbmFtZSByZXR1cm5lZAotCSAqIGlzIGEgY29uc3RhbnQgc3RyaW5nLiAgQ2FsbGVycyBtdXN0IGNvbXBhcmUgcHJvcGVydHkgbmFtZXMgdXNpbmcKLQkgKiA8Y29kZT5lcXVhbHM8L2NvZGU+LCBub3QgPT0uCi0JICo8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqCi0JICogQHJldHVybiB0aGUgbmV3IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLQkgKiAgb3Igbm90IHJlbGV2YW50Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpIHsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotCSAqICBvciBub3QgcmVsZXZhbnQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdEJhc2VGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdEJhc2VGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmOTk4NGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RCYXNlRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzCi0JCUZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIEFic3RyYWN0QmFzZUZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UoaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHN0eWxlKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RCYXNlRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIGludCBzdHlsZSkgewotCQlzdXBlcih0aXRsZSwgc3R5bGUpOwotCi0JfQotCi0JcHVibGljIEFic3RyYWN0QmFzZUZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLAotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIodGl0bGUsIGltYWdlLCBzdHlsZSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0KLQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdEJhc2ljUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0QmFzaWNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWIwODQ4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0QmFzaWNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIEFic3RyYWN0QmFzaWNQcmVmZXJlbmNlUGFnZQotCWV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgQWJzdHJhY3RCYXNpY1ByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9MYWJlbEZpZWxkRWRpdG9yLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9MYWJlbEZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NDVmNTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvTGFiZWxGaWVsZEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqDQotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbg0KLSAqDQotICovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotDQotLyoqDQotICogQSBmaWVsZCBlZGl0b3IgZm9yIGRpc3BsYXlpbmcgbGFiZWxzIG5vdCBhc3NvY2lhdGVkIHdpdGggb3RoZXIgd2lkZ2V0cy4NCi0gKiANCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGENCi0gKiBAc2luY2UgMS4wDQotICovDQotcHVibGljIGNsYXNzIExhYmVsRmllbGRFZGl0b3IgZXh0ZW5kcyBGaWVsZEVkaXRvciB7DQotDQotCXByaXZhdGUgTGFiZWwgbGFiZWw7DQotDQotCXB1YmxpYyBMYWJlbEZpZWxkRWRpdG9yKFN0cmluZyB2YWx1ZSwgQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJc3VwZXIoImxhYmVsIiwgdmFsdWUsIHBhcmVudCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0Rm9yTnVtQ29sdW1ucyhpbnQgbnVtQ29sdW1ucykgew0KLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgZG9GaWxsSW50b0dyaWQoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsNCi0JCWxhYmVsID0gZ2V0TGFiZWxDb250cm9sKHBhcmVudCk7DQotCQkNCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7DQotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7DQotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCi0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsNCi0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOw0KLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsNCi0JCQ0KLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRyb2xzKCkgew0KLQkJcmV0dXJuIDE7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKCkgew0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGRvTG9hZERlZmF1bHQoKSB7DQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgZG9TdG9yZSgpIHsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9QbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGQzOWIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2VhcmNoQnV0dG9uVGV4dD1GaW5kIGl0IQotc2VhcmNoRW5naW5lSW5mb3JtYXRpb25UaXRsZT0iU2VhcmNoIGVuZ2luZSBpbmZvcm1hdGlvbiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNTY5YTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNQbHVnaW47Ci0KLQotLyoqCi0gKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGEKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JLy9rZXlzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNSU5HX1NQVUJJTiA9ICJ0aW1pbmctc3B1YmluIjsKLQkJCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlQ29uc3RhbnRzIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBQcmVmZXJlbmNlQ29uc3RhbnRzKCkgewotCQlzdXBlcigpOwotCQlwcmVmZXJlbmNlcyA9IFByZWZlcmVuY2VzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlQ29uc3RhbnRzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFByZWZlcmVuY2VDb25zdGFudHMoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0VElNSU5HX1NQVUJJTigpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKHByZWZlcmVuY2VzLmdldFN0cmluZyhUSU1JTkdfU1BVQklOKSk7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXREZWZhdWx0VElNSU5HX1NQVUJJTigpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKCJzcHVfdGltaW5nIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRJTUlOR19TUFVCSU4oSVBhdGggdmFsdWUpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoVElNSU5HX1NQVUJJTiwgdmFsdWUudG9PU1N0cmluZygpKTsKLQkJUHJlZmVyZW5jZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL1ByZWZlcmVuY2VDb25zdGFudHNGcm9tRmlsZS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvUHJlZmVyZW5jZUNvbnN0YW50c0Zyb21GaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMGEwN2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvUHJlZmVyZW5jZUNvbnN0YW50c0Zyb21GaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqCi0gKiBAc2luY2UgMS4yLjMKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb25zdGFudHNGcm9tRmlsZSBleHRlbmRzIE5MUwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSUQgPSAib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLlBsdWdpblJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUSU1JTkdfU1BVQklOX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEJ1dHRvblRleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRW5naW5lSW5mb3JtYXRpb25UaXRsZTsKLQkKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfSUQsIFByZWZlcmVuY2VDb25zdGFudHNGcm9tRmlsZS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlQ29uc3RhbnRzRnJvbUZpbGUoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAwMjNhNC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpLlByZWZlcmVuY2VDb25zdGFudHNGcm9tRmlsZTsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhLCBSaWNoYXJkIE1hY2llbAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZlcmVuY2VzUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJUHJlZmVyZW5jZUNvbnN0YW50cyBwcmVmcyA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0SW5zdGFuY2UoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlRJTUlOR19TUFVCSU4sUHJlZmVyZW5jZUNvbnN0YW50c0Zyb21GaWxlLlRJTUlOR19TUFVCSU5fVkFMVUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvU3BhY2VyRmllbGRFZGl0b3IuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL1NwYWNlckZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiYTdhNjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvU3BhY2VyRmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24NCi0gKg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotDQotLyoqDQotICogQSBmaWVsZCBlZGl0b3IgZm9yIGFkZGluZyBzcGFjZSB0byBhIHByZWZlcmVuY2UgcGFnZS4NCi0gKiANCi0gKiBAYXV0aG9yIFJpY2FyZG8gTS4gTWF0aW5hdGENCi0gKiBAc2luY2UgMS4wDQotICovDQotcHVibGljIGNsYXNzIFNwYWNlckZpZWxkRWRpdG9yIGV4dGVuZHMgTGFiZWxGaWVsZEVkaXRvciB7DQotCQ0KLQlwdWJsaWMgU3BhY2VyRmllbGRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJc3VwZXIoIiIsIHBhcmVudCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvVGFyZ2V0RW52aXJvbm1lbnRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvVGFyZ2V0RW52aXJvbm1lbnRQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOTNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3ByZWZlcmVuY2VzL3VpL1RhcmdldEVudmlyb25tZW50UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcy51aTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBSaWNhcmRvIE0uIE1hdGluYXRhCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRFbnZpcm9ubWVudFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RCYXNpY1ByZWZlcmVuY2VQYWdlIHsKLQkKLQlwdWJsaWMgVGFyZ2V0RW52aXJvbm1lbnRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oIlRhcmdldCBFbnZpcm9ubWVudCBQcmVmZXJlbmNlcyIpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9UYXJnZXRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvcHJlZmVyZW5jZXMvdWkvVGFyZ2V0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5ZGI3YS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy9wcmVmZXJlbmNlcy91aS9UYXJnZXRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnByZWZlcmVuY2VzLnVpOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQKLSAqIGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgUmljYXJkbyBNLiBNYXRpbmF0YQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0UHJlZmVyZW5jZVBhZ2UKLQlleHRlbmRzIEFic3RyYWN0QmFzaWNQcmVmZXJlbmNlUGFnZXsKLQotCXB1YmxpYyBUYXJnZXRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oIlJlbW90ZSBUb29scyBwcmVmZXJlbmNlcyIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy8uY2xhc3NwYXRoIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvLnByb2plY3QgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNjRjZTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAxOWFmM2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscwotQnVuZGxlLVZlcnNpb246IDMuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLlV0aWxzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aS5jb25zb2xlLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5uZXR3b3JrLAotIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5zdHJlYW0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9hYm91dC5odG1sIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ODI0MmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk0NDY3NC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwNTVkNS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFJlbW90ZSBUb29scyBVdGlsaXRpZXMKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9VdGlsc1BsdWdpbi5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvVXRpbHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ViZGYwZi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9VdGlsc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWctaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFV0aWxzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFV0aWxzUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFV0aWxzUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLypwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCS8vIElmIHRoZSBkZWZhdWx0IGluc3RhbmNlIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsCi0JCQkvLyByZXR1cm4gYSBzdGF0aWMgaWRlbnRpZmllci4KLQkJCXJldHVybiBQTFVHSU5fSUQ7Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ki8KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVdGlsc1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvbmV0d29yay9NYWNBZGRyZXNzLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9uZXR3b3JrL01hY0FkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQzMWI4Yi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9uZXR3b3JrL01hY0FkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5uZXR3b3JrOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgCi0gKiAKLSAqIEBhdXRob3IgUmljaGFyZCBNYWNpZWwKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE1hY0FkZHJlc3MgewotCXB1YmxpYyBzdGF0aWMgaW50IE1BWF9CSVRTID0gNDg7Ci0JcHVibGljIHN0YXRpYyBpbnQgSEVYRElHSVRTID0gTUFYX0JJVFMvNDsKLQlwdWJsaWMgc3RhdGljIGludCBIRVhCQVNFID0gMTY7Ci0JCi0JQmlnSW50ZWdlciBtYWM7Ci0JCi0JcHJpdmF0ZSBNYWNBZGRyZXNzKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdHJlIGEgTWFjQWRkcmVzcyBmcm9tIGEge0BsaW5rIFN0cmluZ30uCi0JICogCi0JICogSWYgdGhlIHN0cmluZyBpcyBub3QgaW4gdGhlIFhYOlhYOlhYOlhYOlhYOlhYIGZvcm1hdCwgd2hlcmUgWFggaXMgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cywgdGhlbgotCSAqIGEgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbiBpcyByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIG1hY1N0cmluZwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE1hY0FkZHJlc3NGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hY0FkZHJlc3MgY3JlYXRlTWFjQWRkcmVzcyhTdHJpbmcgbWFjU3RyaW5nKSB0aHJvd3MgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbiB7Ci0JCU1hY0FkZHJlc3MgbWFkZHIgPSBuZXcgTWFjQWRkcmVzcygpOwotCQltYWRkci5tYWMgPSBjb252ZXJ0U3RyaW5nVG9JbnRlcm5hbFJlcHJlc2VudGF0aW9uKG1hY1N0cmluZyk7Ci0JCQotCQlyZXR1cm4gbWFkZHI7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIE1hYyBBZGRyZXNzIGZyb20gYSB7QGxpbmsgQmlnSW50ZWdlcn0uCi0JICogCi0JICogSWYgdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBwb3NpdGl2ZSBvbmUuCi0JICogSWYgdGhlIG51bWJlciBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgd2l0aCBNQVhfQklUUywgdGhlbiBnZXQgdGhlIE1BWF9CSVRTIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLQkgKiAgCi0JICogQHBhcmFtIG1hY051bWJlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFjQWRkcmVzcyBjcmVhdGVNYWNBZGRyZXNzKEJpZ0ludGVnZXIgbWFjTnVtYmVyKSB7Ci0JCU1hY0FkZHJlc3MgbWFkZHIgPSBuZXcgTWFjQWRkcmVzcygpOwotCQltYWRkci5tYWMgID0gY29udmVydEJpZ0ludGVnZXJUb0ludGVybmFsUmVwcmVzZW50YXRpb24obWFjTnVtYmVyKTsKLQkJCi0JCXJldHVybiBtYWRkcjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGNvbnZlcnRCaWdJbnRlZ2VyVG9JbnRlcm5hbFJlcHJlc2VudGF0aW9uKEJpZ0ludGVnZXIgbWFjTnVtYmVyKSB7Ci0JCWlmKG1hY051bWJlci5zaWdudW0oKSA8IDApIHsKLS8vCQkJIG1hY051bWJlciBjYW5ub3QgYmUgbmVnYXRpdmUuIFNldCBpdCB0byBhIHBvc2l0aXZlIG51bWJlcgotCQkJbWFjTnVtYmVyID0gbWFjTnVtYmVyLm5lZ2F0ZSgpOwotCQl9IAotCQkKLQkJaWYobWFjTnVtYmVyLmJpdExlbmd0aCgpID4gTUFYX0JJVFMpIHsgCi0vLwkJCSBNYWMgbnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMiBeNDgsIHRoZW4gY29udmVydCB0byBhIDQ4IGJpdCBudW1iZXIKLQkJCVN0cmluZyBiaWdNYWNTdHIgPSBtYWNOdW1iZXIudG9TdHJpbmcoSEVYQkFTRSk7IAotCQkJU3RyaW5nIG1hY1N0ciA9IGJpZ01hY1N0ci5zdWJzdHJpbmcoYmlnTWFjU3RyLmxlbmd0aCgpLTEgLSBIRVhESUdJVFMsIGJpZ01hY1N0ci5sZW5ndGgoKSAtIDEpOwotCQkJbWFjTnVtYmVyID0gbmV3IEJpZ0ludGVnZXIobWFjU3RyKTsKLQkJfQotCQlyZXR1cm4gbWFjTnVtYmVyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgY29udmVydFN0cmluZ1RvSW50ZXJuYWxSZXByZXNlbnRhdGlvbihTdHJpbmcgbWFjU3RyaW5nKSB0aHJvd3MgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0cmltbWVkTWFjU3RyaW5nID0gbWFjU3RyaW5nLnRyaW0oKTsgCi0JCWJvb2xlYW4gaXNWYWxpZE1hYyA9IHRyaW1tZWRNYWNTdHJpbmcubWF0Y2hlcygiXihcXHB7WERpZ2l0fXsyfTopezV9XFxwe1hEaWdpdH17Mn0kIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmKCFpc1ZhbGlkTWFjKSB7Ci0JCQl0aHJvdyBuZXcgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5NYWNBZGRyZXNzX0ludmFsaWRNQUNBZGRyZXNzRm9ybWF0KTsKLQkJfQotCQkvLyBSZW1vdmUgYWxsICc6JyBmcm9tIHRoZSBTdHJpbmcKLQkJU3RyaW5nIHZhbGlkTWFjU3RyaW5nID0gdHJpbW1lZE1hY1N0cmluZy5yZXBsYWNlQWxsKCI6IiwgIiIpOyAvL3JlcGxhY2UoJzonLCAnXDAnKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQotCQkvLyBDb252ZXJ0IHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgotCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIodmFsaWRNYWNTdHJpbmcsIEhFWEJBU0UpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQmlnSW50ZWdlciBtYWNOdW1iZXIpIHsKLQkJbWFjID0gTWFjQWRkcmVzcy5jb252ZXJ0QmlnSW50ZWdlclRvSW50ZXJuYWxSZXByZXNlbnRhdGlvbihtYWNOdW1iZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbWFjU3RyaW5nKSB0aHJvd3MgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbiB7Ci0JCW1hYyA9IGNvbnZlcnRTdHJpbmdUb0ludGVybmFsUmVwcmVzZW50YXRpb24obWFjU3RyaW5nKTsKLQl9Ci0JCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gbWFjOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hYyBhZGRyZXNzCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgbWFjIGFkZHJlc3MgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1JlcHJlc2VudGF0aW9uKCkgewotCQlTdHJpbmcgc3RyUmVwID0gbWFjLnRvU3RyaW5nKEhFWEJBU0UpOwotCQkKLS8vCQkgQWRkIHRoZSAwIGF0IHRoZSBsZWZ0IHRvIGNvbXBsZXRlIHRoZSBzdHJpbmcuCi0JCWlmKHN0clJlcC5sZW5ndGgoKSA8IEhFWERJR0lUUykgewotCQkJCi0JCQlTdHJpbmdCdWZmZXIgemVyb1N0ciA9ICBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpIDwgKEhFWERJR0lUUyAtIHN0clJlcC5sZW5ndGgoKSk7IGkrKykgewotCQkJCXplcm9TdHIuYXBwZW5kKCIwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN0clJlcCA9IG5ldyBTdHJpbmcoemVyb1N0ciArIHN0clJlcCk7Ci0JCX0KLQkJCi0JCS8vIEZvciBlYWNoIHBhaXIgb2YgY2hhcmFjdGVyLCBhZGQgYSA6IGNoYXJhY3RlciwgZXhjZXB0IGZvciB0aGUgbGFzdCBvbmUKLQkJU3RyaW5nQnVmZmVyIGhleFJlcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGludCBpPTA7IGkgPCBIRVhESUdJVFMgLSAyOyBpID0gaSArIDIpIHsKLQkJCWhleFJlcC5hcHBlbmQoc3RyUmVwLnN1YnN0cmluZyhpLCBpKzIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWhleFJlcC5hcHBlbmQoc3RyUmVwLnN1YnN0cmluZyhIRVhESUdJVFMtMiwgSEVYRElHSVRTKSk7Ci0JCQotCQlyZXR1cm4gaGV4UmVwLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvbmV0d29yay9NYWNBZGRyZXNzRm9ybWF0RXhjZXB0aW9uLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9uZXR3b3JrL01hY0FkZHJlc3NGb3JtYXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE1NzQwNi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9uZXR3b3JrL01hY0FkZHJlc3NGb3JtYXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLm5ldHdvcms7Ci0KLS8qKgotICogQGF1dGhvciBSaWNoYXJkIE1hY2llbAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTA5ODA5Mzk0MzEzMDA2NTUxNUw7Ci0KLQlwdWJsaWMgTWFjQWRkcmVzc0Zvcm1hdEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL25ldHdvcmsvTWVzc2FnZXMuamF2YSBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL25ldHdvcmsvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlZjM2MC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9uZXR3b3JrL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5uZXR3b3JrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLmNlbGwudXRpbHMubmV0d29yay5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWNBZGRyZXNzX0ludmFsaWRNQUNBZGRyZXNzRm9ybWF0OwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL25ldHdvcmsvbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL25ldHdvcmsvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1ZGYxNC4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9uZXR3b3JrL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTWFjQWRkcmVzc19JbnZhbGlkTUFDQWRkcmVzc0Zvcm1hdD1JbnZhbGlkIE1hYyBBZGRyZXNzIGZvcm1hdFwhCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vSUxpbmVTdHJlYW1MaXN0ZW5lci5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL0lMaW5lU3RyZWFtTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA5MzNkYS4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vSUxpbmVTdHJlYW1MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMuc3RyZWFtOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBhbiBlbnRpcmUgbGluZSBpcyByZWFkIGZyb20gYSBzdHJlYW0uCi0gKiBBIElMaW5lU3RyZWFtTGlzdGVuZXIgaXMgYW4gZW50aXR5IHRoYXQgY2FuIHJlY2VpdmUgb25lIGxpbmUgb2YgdGV4dCBhdCB0aW1lLgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGluZVN0cmVhbUxpc3RlbmVyIHsKLQl2b2lkIG5ld0xpbmUoU3RyaW5nIGxpbmUpOwotCXZvaWQgc3RyZWFtQ2xvc2VkKCk7Ci0Jdm9pZCBzdHJlYW1FcnJvcihFeGNlcHRpb24gZSk7Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vSVN0cmVhbUxpc3RlbmVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vSVN0cmVhbUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwMDJmNTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL0lTdHJlYW1MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5zdHJlYW07Ci0KLQotLyoqCi0gKiBBIGxpc3RlbmVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gc29tZSBjaHVuayBvZiBkYXRhIGlzIHJlY2VpdmVkIGZyb20gYSBzdHJlYW0uCi0gKiBBIElTdHJlYW1MaXN0ZW5lciBpcyBhbiBlbnRpdHkgdGhhdCBjYW4gcmVjZWl2ZSBvbmUgY2h1bmsgYXQgdGltZS4KLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cmVhbUxpc3RlbmVyIHsKLQl2b2lkIG5ld0J5dGVzKGJ5dGUgYnl0ZXNbXSwgaW50IGxlbmd0aCk7Ci0Jdm9pZCBzdHJlYW1DbG9zZWQoKTsKLQl2b2lkIHN0cmVhbUVycm9yKEV4Y2VwdGlvbiBlKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbW90ZXRvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy9zcmMvb3JnL2VjbGlwc2UvcHRwL3JlbW90ZXRvb2xzL3V0aWxzL3N0cmVhbS9MaXN0ZW5lZE91dHB1dFN0cmVhbS5qYXZhIGIvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL0xpc3RlbmVkT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1ZDliOTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL0xpc3RlbmVkT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5zdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgTGlzdGVuZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBJU3RyZWFtTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgTGlzdGVuZWRPdXRwdXRTdHJlYW0oSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGUgW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgYnl0ZXMsIDAsIGxlbik7Ci0JCWxpc3RlbmVyLm5ld0J5dGVzKGJ5dGVzLCBsZW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlsaXN0ZW5lci5uZXdCeXRlcyhiLCBiLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGUgW10gYnl0ZXMgPSBuZXcgYnl0ZVsxXTsKLQkJYnl0ZXNbMF0gPSAoYnl0ZSkgYjsKLQkJbGlzdGVuZXIubmV3Qnl0ZXMoYnl0ZXMsIGJ5dGVzLmxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vU3RyZWFtQnJpZGdlLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vU3RyZWFtQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyNGU3NzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL1N0cmVhbUJyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscy5zdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQ29ubmVjdHMgYW4gaW5wdXRzdHJlYW0gdG8gYW4gb3V0cHV0c3RyZWFtLgotICogPHA+Ci0gKiBUaGlzIGlzIGEgZ2VuZXJhbCBmYWNpbGl0eSB0aGF0IGFsbG93cyB0byBmb3J3YXJkIGRhdGEgcmVjZWl2ZWQgZnJvbSBhbgotICogaW5wdXRzdHJlYW0gdG8gYW4gb3V0cHV0c3RyZWFtLgotICogPHA+Ci0gKiBBbiBleGFtcGxlIHdvdWxkIGJlIHRvIGZvcndhcmQgYXV0b21hdGljYWxseSBkYXRhIHJlY2VpdmVkIGZyb20gYSBzb2NrZXQKLSAqIGlucHV0c3RyZWFtIHRvIGEgZmlsZSBvdXRwdXRzdHJlYW0uCi0gKiA8cD4KLSAqIERvIG5vdCBmb3JnZXQgdG8gY2FsbCBydW4oKSBtZXRob2QhCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyZWFtQnJpZGdlICB7Ci0JLyoKLQkgKiBUT0RPOiBPcGVuIGlzc3VlcwotCSAqIC0gSGFuZGxlIGV4Y2VwdGlvbnMKLQkgKi8KLQlJU3RyZWFtTGlzdGVuZXIgZGF0YUZvcndhcmRlciA9IG51bGw7Ci0JU3RyZWFtT2JzZXJ2ZXIgc3RyZWFtT2JzZXJ2ZXIgPSBudWxsOwotCQotCXByaXZhdGUgY2xhc3MgRGF0YUZvcndhcmRlciBpbXBsZW1lbnRzIElTdHJlYW1MaXN0ZW5lciB7Ci0JCU91dHB1dFN0cmVhbSBvdXRwdXQ7Ci0JCVN0cmVhbUJyaWRnZSBicmlkZ2U7Ci0KLQkJcHVibGljIERhdGFGb3J3YXJkZXIoU3RyZWFtQnJpZGdlIGJyaWRnZSwgT3V0cHV0U3RyZWFtIG91dHB1dCkgewotCQkJdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0JCQl0aGlzLmJyaWRnZSA9IGJyaWRnZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0J5dGVzKGJ5dGVbXSBieXRlcywgaW50IGxlbmd0aCkgewotCQkJdHJ5IHsKLQkJCQlvdXRwdXQud3JpdGUoYnl0ZXMsIDAsIGxlbmd0aCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBIYW5kbGUgZXhjZXB0aW9uCi0JCQkJYnJpZGdlLmtpbGwoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0NoYXJzKGNoYXJbXSBjaGFycywgaW50IGxlbmd0aCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RyZWFtQ2xvc2VkKCkgewotCQkJYnJpZGdlLmtpbGwoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0cmVhbUVycm9yKEV4Y2VwdGlvbiBlKSB7CQotCQkJLy8gVE9ETyBIYW5kbGUgZXhjZXB0aW9uCi0JCQlicmlkZ2Uua2lsbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmVhbUJyaWRnZShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCwgU3RyaW5nIG5hbWUpIHsKLQkJZGF0YUZvcndhcmRlciA9IG5ldyBEYXRhRm9yd2FyZGVyKHRoaXMsIG91dHB1dCk7Ci0JCXN0cmVhbU9ic2VydmVyID0gbmV3IFN0cmVhbU9ic2VydmVyKGlucHV0LCBkYXRhRm9yd2FyZGVyLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyZWFtQnJpZGdlKElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0JCWRhdGFGb3J3YXJkZXIgPSBuZXcgRGF0YUZvcndhcmRlcih0aGlzLCBvdXRwdXQpOwotCQlzdHJlYW1PYnNlcnZlciA9IG5ldyBTdHJlYW1PYnNlcnZlcihpbnB1dCwgZGF0YUZvcndhcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQga2lsbCgpIHsKLQkJaWYgKHN0cmVhbU9ic2VydmVyICE9IG51bGwpIHsKLQkJCXN0cmVhbU9ic2VydmVyLmtpbGwoKTsKLQkJfQotCQlkYXRhRm9yd2FyZGVyID0gbnVsbDsKLQkJc3RyZWFtT2JzZXJ2ZXIgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXN0cmVhbU9ic2VydmVyLnN0YXJ0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL1N0cmVhbU9ic2VydmVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vU3RyZWFtT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmI2Nzg5Mi4uMDAwMDAwMAotLS0gYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vU3RyZWFtT2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgSW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzLnN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBDb25uZWN0cyBhbiBpbnB1dHN0cmVhbSB0byBhIHN0cmVhbSBsaXN0ZW5lci4KLSAqIDxwPgotICogVGhpcyBpcyBhIGdlbmVyYWwgZmFjaWxpdHkgdGhhdCBhbGxvd3MgdG8gZm9yd2FyZCBkYXRhIHJlY2VpdmVkIGZyb20gYW4KLSAqIGlucHV0c3RyZWFtIHRvIGEgbGlzdGVuZXIgb2JqZWN0LiBOb3RlIHRoYXQgb25seSBvbmUgbGlzdGVuZXIgaXMgY29ubmVjdGVkCi0gKiB0byB0aGUgb2JzZXJ2ZXIuCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyZWFtT2JzZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgewotCS8qCi0JICogVE9ETzogT3BlbiBpc3N1ZXMgCi0JICogLSBEb2VzIGFjY2VzcyB0byAna2lsbGVkJyBhdHRyaWJ1dGUgbmVlZCBzeW5jaHJvbml6ZWQgYWNjZXNzPwotCSAqIC0gT24gc29ja2V0cywgb2Z0ZW4gb25lIGJ5dGUgaXMgcmVhZCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCBpbnN0ZWFkIG9mCi0JICogICBibG9ja3Mgb2YgYnl0ZXMuIE1heWJlIGFkZGluZyBzb21lIGRlbGF5IG1pZ2h0IGZvcmNlIHRvIHJlYWQKLQkgKiAgIG1vcmUgdGhhbiBvbmUgYnl0ZS4KLQkgKi8KLQkvKioKLQkgKiBTdHJlYW0gdGhhdCBpcyBiZWVuIG9ic2VydmVkIGFuZCByZWFkLgotCSAqLwotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXQ7Ci0KLQkvKioKLQkgKiBTaWduYWxzIHRoYXQgYnJpZGdlIHNob3VsZCBzdG9wLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBraWxsZWQ7Ci0KLQkvKioKLQkgKiBOYW1lIHRvIGlkZW50aWZ5IGJyaWRnZSB3aGVuIGRlYnVnZ2luZy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogTGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBkYXRhIGlzIHJlY2VpdmVkLgotCSAqLwotCXByaXZhdGUgSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyOwotCi0Jc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwMDsKLQotCXB1YmxpYyBTdHJlYW1PYnNlcnZlcihJbnB1dFN0cmVhbSBpbnB1dCwgSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCXNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmVhbU9ic2VydmVyKElucHV0U3RyZWFtIGlucHV0LCBJU3RyZWFtTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCXNldE5hbWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBvYnNlcnZpbmcgZGF0YSBhbmQgdGVybWluYXRlIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQga2lsbCgpIHsKLQkJa2lsbGVkID0gdHJ1ZTsKLQl9Ci0JCi0Jdm9pZCBsb2coU3RyaW5nIHMpIHsKLS8vCQlTeXN0ZW0uZXJyLnByaW50bG4obmFtZSArICI6ICIgKyBzKTsKLQl9Ci0JCi0Jdm9pZCBzdHJlYW1DbG9zZWQoKSB7Ci0JCWxvZygiU3RyZWFtIGNsb3NlZCIpOwotCQlsaXN0ZW5lci5zdHJlYW1DbG9zZWQoKTsKLQl9Ci0JCi0Jdm9pZCBzdHJlYW1FcnJvcihFeGNlcHRpb24gZSkgewotCQlsb2coIlJlY292ZXJlZCBmcm9tIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJbGlzdGVuZXIuc3RyZWFtRXJyb3IoZSk7Ci0JfQotCQotCXZvaWQgbmV3Qnl0ZXMoYnl0ZSBidWZmZXJbXSwgaW50IGxlbmd0aCkgewotCQlsb2coIlJlY2VpdmVkOiAiICsgSW50ZWdlci50b1N0cmluZyhsZW5ndGgpICsgIiBieXRlcyIpOwotCQlsaXN0ZW5lci5uZXdCeXRlcyhidWZmZXIsIGxlbmd0aCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSdW4gaW4gYmFja2dyb3VuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWJ5dGUgYnVmZmVyW10gPSBuZXcgYnl0ZVsyNTBdOwotCQlsb2coIlN0YXJ0ZWQgb2JzZXJ2aW5nIik7Ci0JCXdoaWxlICgha2lsbGVkKSB7Ci0JCQl0cnkgewotCQkJCWludCBieXRlcyA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQkJCQlpZiAoYnl0ZXMgPiAwKSB7Ci0JCQkJCW5ld0J5dGVzKGJ1ZmZlciwgYnl0ZXMpOwotCQkJCX0gZWxzZSBpZiAoYnl0ZXMgPT0gLTEpIHsKLQkJCQkJc3RyZWFtQ2xvc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoa2lsbGVkKSB7Ci0JCQkJCXN0cmVhbUNsb3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBFT0ZFeGNlcHRpb24pIHsKLQkJCQkJc3RyZWFtQ2xvc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0cmVhbUVycm9yKGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyoKLQkJCQkgKiBXaGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLCBKYXZhIG1heSByYWlzZSBhCi0JCQkJICogTnVsbFBvaW50ZXJFeGNlcHRpb24uIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGxpa2UgYQotCQkJCSAqIElPRXhjZXB0aW9uLCBhcyBhYm92ZS4KLQkJCQkgKi8KLQkJCQlpZiAoa2lsbGVkKSB7Ci0JCQkJCXN0cmVhbUNsb3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJlYW1FcnJvcihlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvZygiRmluaXNoZWQgb2JzZXJ2aW5nIik7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vVGV4dFN0cmVhbU9ic2VydmVyLmphdmEgYi90b29scy9yZW1vdGV0b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMvc3JjL29yZy9lY2xpcHNlL3B0cC9yZW1vdGV0b29scy91dGlscy9zdHJlYW0vVGV4dFN0cmVhbU9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyYzk0NjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVtb3RldG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcmVtb3RldG9vbHMvdXRpbHMvc3RyZWFtL1RleHRTdHJlYW1PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBJbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMudXRpbHMuc3RyZWFtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQotLyoqCi0gKiBBIHRlbXBvcmFyaWx5IHdvcmthcm91bmQgdG8gcmVhZCBsaW5lcyBvZiB0ZXh0LgotICogSW4gZnV0dXJlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGFuIElTdHJlYW1MaXN0ZW5lciB0aGF0IGNvbnZlcnRzCi0gKiBibG9ja3Mgb2YgYnl0ZXMgdG8gbGluZXMuCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0U3RyZWFtT2JzZXJ2ZXIgZXh0ZW5kcyBUaHJlYWQgewotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgcmVhZGVyOwotCXByaXZhdGUgYm9vbGVhbiBraWxsZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIElMaW5lU3RyZWFtTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgVGV4dFN0cmVhbU9ic2VydmVyKElucHV0U3RyZWFtIGlucHV0LCBJTGluZVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dCkpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCXNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHVibGljIFRleHRTdHJlYW1PYnNlcnZlcihJbnB1dFN0cmVhbSBpbnB1dCwgSUxpbmVTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLm5hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0KSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJc2V0TmFtZShuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGtpbGwoKSB7Ci0JCWtpbGxlZCA9IHRydWU7Ci0JfQotCi0Jdm9pZCBsb2coU3RyaW5nIHN0cmluZykgewotLy8JCVN5c3RlbS5lcnIucHJpbnRsbihuYW1lICsgIjogIiArIHMpOwotCX0KLQkKLQl2b2lkIG5ld0xpbmUoU3RyaW5nIGxpbmUpIHsKLQkJbG9nKCJSZWNlaXZlZDogIiArIEludGVnZXIudG9TdHJpbmcobGluZS5sZW5ndGgoKSkgKyAiIGJ5dGVzIik7Ci0JCWxpc3RlbmVyLm5ld0xpbmUobGluZSk7Ci0JfQotCi0Jdm9pZCBzdHJlYW1DbG9zZWQoKSB7Ci0JCWxvZygiU3RyZWFtIGNsb3NlZCIpOwotCQlsaXN0ZW5lci5zdHJlYW1DbG9zZWQoKTsKLQl9Ci0JCi0Jdm9pZCBzdHJlYW1FcnJvcihFeGNlcHRpb24gZSkgewotCQlsb2coIlJlY292ZXJlZCBmcm9tIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJbGlzdGVuZXIuc3RyZWFtRXJyb3IoZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3RyaW5nIGxpbmU7Ci0KLQkJd2hpbGUgKCFraWxsZWQpIHsKLQkJCXRyeSB7Ci0JCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lID09IG51bGwpIHsKLQkJCQkJc3RyZWFtQ2xvc2VkKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdMaW5lKGxpbmUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPRkV4Y2VwdGlvbikgewotCQkJCQlzdHJlYW1DbG9zZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyZWFtRXJyb3IoZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoa2lsbGVkKSB7Ci0JCQkJCXN0cmVhbUNsb3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJlYW1FcnJvcihlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19Cg==